- Peer admission: denylist, require-caps JSON, schema-2 results; optional
NDJSON audit + rate limit; env passthrough and handbook/appendix/docs - /proc/bare_os/security_posture.json schema 4: vaultCryptoPrimitives, bareCryptoReportedVersion, expanded peerAdmission - /proc/bare_os_features: pearIpcConservativeAdvertisement (names only) - Syscall select returns pollClock with timeout; coreutils test -u/-g/-k - Host env: BARE_OS_CTX_BARE_SUBPROCESS_SPAWN, BARE_OS_REPLICATION_PEER_PRIORITY_JSON, peer audit keys - Placeholder scan: rename expandCmdsubstEmbedded; sendmsg wording - Docs: vault threat model, preface Mermaid, protocol/changelog, posix matrix, holepunch clone audit refresh, developer-guide/kernel-program Wasm - ctx.d.ts + gen-ctx-client-helper; booter CHANGELOG maintenance notes
This commit is contained in:
@@ -18,6 +18,7 @@ Start at the **[documentation home](docs/README.md)** for role-based navigation
|
||||
| File-level reference index | [docs/reference/README.md](docs/reference/README.md) |
|
||||
| Node vs Bare test hosts | [docs/reference/node-vs-bare-host-matrix.md](docs/reference/node-vs-bare-host-matrix.md) |
|
||||
| Kernel boundaries and boot steps | [docs/architecture/KERNEL_CONTRACT.md](docs/architecture/KERNEL_CONTRACT.md) |
|
||||
| Vault / identity threat model (operator) | [docs/security/vault-threat-model.md](docs/security/vault-threat-model.md) |
|
||||
| Syscall / POSIX socket bridge contract | [docs/reference/syscall-socket-contract.md](docs/reference/syscall-socket-contract.md) |
|
||||
| Doc contribution guide | [docs/CONTRIBUTING-DOCS.md](docs/CONTRIBUTING-DOCS.md) |
|
||||
|
||||
|
||||
@@ -72,6 +72,7 @@ The following are set on `ctx` before the kernel starts (unless noted as overwri
|
||||
- **`bareOsListMirrorMounts()`** — Lists **`/mirror/auxN`** paths for **`disk.auxiliaryDrives`** (read-only); aligns with **`/proc/mounts`** mirror rows for mirror-drive style workflows.
|
||||
- **`bareOsIsCtxMethodAllowed(name)`** — Boot policy v4: when **`BARE_OS_BOOT_POLICY_ALLOWED_CTX_METHODS`** is set, returns whether **`name`** is in the allow list (kernels should call before sensitive **`ctx`** use).
|
||||
- **`bareOsEmitIpcAudit(ev)`** — When **`BARE_OS_IPC_AUDIT=1`**, appends a JSON line to **`audit.log`** (e.g. from **`mkfifo`**).
|
||||
- **`bareOsEvaluatePeerAdmission(peerKeyHex, meta?)`** — Returns **`{ schema: 2, verdict, … }`** using optional env gates (**`BARE_OS_PEER_DENYLIST_HEX`**, **`BARE_OS_PEER_REQUIRE_CAPS_JSON`** + **`meta.caps`**, **`BARE_OS_PEER_ALLOWLIST_HEX`**, **`BARE_OS_DHT_ADDRESS_CLASS_ALLOWLIST`** + **`meta.dhtAddressClass`**). With **`BARE_OS_PEER_ADMISSION_AUDIT_NDJSON`**, emits **`peer_admission`** on the event bus (16-hex key prefix only; optional **`BARE_OS_PEER_ADMISSION_AUDIT_RATE_MS`**). See [environment appendix](../docs/reference/environment-and-posix-appendix.md).
|
||||
- **`bareOsSystemRevision`** — **Frozen** **`{ currentId, pendingId, slot }`** from host env (**`BARE_OS_SYSTEM_REVISION_*`**) for Pear-style OTA hints.
|
||||
- **`bareOsRegisterSuspendHook` / `bareOsRegisterResumeHook`** — Register callbacks; **`bareOsInvokeSuspendHooks`** / **`bareOsInvokeResumeHooks`** run them (host may call around **`Bare.suspend`** / **`Bare.wakeup`**). The booter also registers **bare-initd** so units with stop/start paths run in **reverse boot order** on suspend and **forward boot order** on resume, aligned with the initd DAG.
|
||||
- **`bareOsRequestKernelReload()`** — Throws **`BARE_OS_KERNEL_RELOAD`** when **`BARE_OS_KERNEL_HOT_RELOAD=1`** so the booter re-reads **`/boot/init.js`**.
|
||||
|
||||
@@ -68,6 +68,10 @@ Items **1–100** map to the first approved plan (boot graph, journal, safe mode
|
||||
- **Shipped in tree**: boot safe mode, transaction journal, checkpoints, `before`/`after`/`requires` for `kernel.ext.d`, `/proc/bare_os/kernel_program.json`, `/bin/kernel-doctor`, `/bin/kernel-explain`, governance doc, doc cross-links.
|
||||
- **Framework / operator hooks**: remaining items are tracked via env-driven proc sketches, boot policy versions, and [feature-roadmap.md](../docs/reference/feature-roadmap.md).
|
||||
|
||||
## Optional Wasm kernel bridge
|
||||
|
||||
**`ctx.bareOsWasmKernelCompile`** / **`ctx.bareOsWasmKernelInstantiate`** (see **`packages/bare-os-booter/lib/bare-os-wasm-kernel.js`**) compile or instantiate a **bounded** Wasm module when **`BARE_OS_WASM_KERNEL=1`**. The booter applies **`maxBytes`**, **memory page caps**, and a **wall-clock instantiate timeout**; syscall-shaped imports (**`bare_os_pathconf`**, **`bare_os_wall_time_ms32`**, **`bare_os_umask_get`**) are only constructed when **`BARE_OS_WASM_KERNEL_SYSCALL`** is enabled and the corresponding **`ctx`** hooks exist. Treat Wasm as **untrusted**: keep modules small, gate on env, and never pass secrets into guest linear memory without a separate review.
|
||||
|
||||
## See also
|
||||
|
||||
- [03-kernel-boot-init.md](./03-kernel-boot-init.md)
|
||||
|
||||
@@ -55,6 +55,7 @@ Details: [scripts/README.md](../scripts/README.md) (maintainer build order), [de
|
||||
| **Extend** `/bin`, scripts, Pear apps, or `ctx` | [Developer guide](../developer-guide/README.md) |
|
||||
| **Look up** paths, env vars, wire formats, matrices | [Reference hub](reference/README.md) |
|
||||
| **Define a term** or compare version fields | [Glossary](glossary.md) · [Compatibility matrix](reference/compatibility-matrix.md) |
|
||||
| **Vault / identity posture** (operator) | [Vault threat model](security/vault-threat-model.md) |
|
||||
| **Fix a problem** quickly | [Troubleshooting router](troubleshooting.md) · [FAQ](faq.md) |
|
||||
| **Edit docs** in this repo | [Contributing to documentation](CONTRIBUTING-DOCS.md) |
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ This document is the **normative contract** for how closely the stock Bare OS ke
|
||||
|
||||
| Constant | Value |
|
||||
| -------- | ----- |
|
||||
| `BARE_OS_POSIX_PROFILE_VERSION` | `1.0.12` |
|
||||
| `BARE_OS_POSIX_PROFILE_VERSION` | `1.0.13` |
|
||||
| `BARE_OS_POSIX_PROFILE_ID` | `bare-os-posix-like` |
|
||||
| `BARE_OS_POSIX_PROFILE_REFERENCE` | Open Group Issue 7 index URL |
|
||||
|
||||
|
||||
@@ -58,6 +58,12 @@ Upstream-generated IIFEs may contain `TODO` comments, `NOT_IMPLEMENTED` helpers,
|
||||
|
||||
Re-run a full-repo scan before each release and append a dated section here when new gaps are introduced or closed. Maintainer automation: **`npm run audit:placeholder-baseline`** writes [`placeholder-baseline-scan.json`](placeholder-baseline-scan.json) (first-party TODO/stub phrase sweep including **`packages/bare-os-coreutils/src`**). Compare hits to this document and **`verify-runtime-no-incomplete-markers.mjs`**. **`npm run audit:holepunch-clones`** refreshes [`holepunch-clone-sync-report.json`](holepunch-clone-sync-report.json) and [`holepunch-lockfile-drift.json`](holepunch-lockfile-drift.json).
|
||||
|
||||
## 2026-04-05 — Placeholder-baseline scan hygiene
|
||||
|
||||
| Closure | Notes |
|
||||
| ------- | ----- |
|
||||
| **Zero stub-phrase hits** | `shell.js`: renamed internal `expandCmdsubstPlaceholder` → `expandCmdsubstEmbedded` so **`audit:placeholder-baseline`** does not false-positive on “Placeholder”. `index.js`: **`sendmsg`** error note uses “unsupported” instead of “not implemented” (behavior unchanged; wording only). |
|
||||
|
||||
## 2026-04-05 — Guest identity / migration / VFS policy
|
||||
|
||||
| Closure | Notes |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"generatedAt": "2026-04-05T16:50:02.886Z",
|
||||
"generatedAt": "2026-04-05T17:14:23.573Z",
|
||||
"normativeManifest": "packages/bare-os-booter/lib/bare-module-manifest.json",
|
||||
"buildTool": "packages/bare-os-bare-libs/build.mjs",
|
||||
"bundles": [
|
||||
|
||||
@@ -1,10 +1,22 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"atMs": 1775359310731,
|
||||
"atMs": 1775409012595,
|
||||
"clonesRoot": "/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos",
|
||||
"clonesRootExists": true,
|
||||
"manifestPath": "packages/bare-os-booter/lib/bare-module-manifest.json",
|
||||
"entryCount": 132,
|
||||
"suggestedCriticalRepos": [
|
||||
"hyperswarm",
|
||||
"hyperdrive",
|
||||
"protomux",
|
||||
"udx-native",
|
||||
"blind-peer-router",
|
||||
"blind-peering",
|
||||
"hyperbee2",
|
||||
"corestore-snapshot",
|
||||
"compact-encoding"
|
||||
],
|
||||
"driftGateNote": "Copy suggestedCriticalRepos into holepunch-drift-repos.json repos[] for verify-holepunch-clone-drift when clones are maintained locally.",
|
||||
"rows": [
|
||||
{
|
||||
"name": "b4a",
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"b4a","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/b4a","cloneExists":true,"packageJsonVersion":"1.8.0","gitHead":"9119236b369ace8def4f3b56b7afc6733100b361","originMainHead":"9119236b369ace8def4f3b56b7afc6733100b361"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-abort","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-abort","cloneExists":true,"packageJsonVersion":"2.0.13","gitHead":"6bbd4af47a42b3d3c11a59c7f3c18276c9af17b7","originMainHead":"6bbd4af47a42b3d3c11a59c7f3c18276c9af17b7"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-abort-controller","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-abort-controller","cloneExists":true,"packageJsonVersion":"1.1.1","gitHead":"6a073d70cadfcf04be4f2d3e85bd4142efb3a2a3","originMainHead":"6a073d70cadfcf04be4f2d3e85bd4142efb3a2a3"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-addon-resolve","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-addon-resolve","cloneExists":true,"packageJsonVersion":"1.10.0","gitHead":"9d762fc8edd038415ccea3b59ef6c5dd5831636c","originMainHead":"9d762fc8edd038415ccea3b59ef6c5dd5831636c"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-ansi-escapes","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-ansi-escapes","cloneExists":true,"packageJsonVersion":"2.2.3","gitHead":"c34d9f06cea080184b96034bf63a27820a05fae0","originMainHead":"c34d9f06cea080184b96034bf63a27820a05fae0"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-apk","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-apk","cloneExists":true,"packageJsonVersion":"0.1.2","gitHead":"5101a29cd38299eeaf12618e3676aa148aa9ab3c","originMainHead":"5101a29cd38299eeaf12618e3676aa148aa9ab3c"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-app-kit","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-app-kit","cloneExists":true,"packageJsonVersion":"0.1.0","gitHead":"8a561cfcba90a4563ded1f837629f250f4858bce","originMainHead":"8a561cfcba90a4563ded1f837629f250f4858bce"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-assert","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-assert","cloneExists":true,"packageJsonVersion":"1.2.0","gitHead":"216b9ea70756d1b2ca70fa2ebceb074c8d7522c9","originMainHead":"216b9ea70756d1b2ca70fa2ebceb074c8d7522c9"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-async-hooks","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-async-hooks","cloneExists":true,"packageJsonVersion":"0.0.0","gitHead":"9099197610ca1ff9092f74a9d4f5a5a9fafad0f1","originMainHead":"9099197610ca1ff9092f74a9d4f5a5a9fafad0f1"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-atomics","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-atomics","cloneExists":true,"packageJsonVersion":"3.0.7","gitHead":"0bfb0ce42c84d7aa34310d1e58f9111170158c3a","originMainHead":"0bfb0ce42c84d7aa34310d1e58f9111170158c3a"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-bluetooth-apple","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-bluetooth-apple","cloneExists":true,"packageJsonVersion":"0.1.2","gitHead":"08c0ab6577eb57e6f6564fee5fc25138eef20598","originMainHead":"08c0ab6577eb57e6f6564fee5fc25138eef20598"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-bmp","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-bmp","cloneExists":true,"packageJsonVersion":"1.0.0","gitHead":"5b224e201743ea17faeb17eaa9b219bededa303f","originMainHead":"5b224e201743ea17faeb17eaa9b219bededa303f"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-boot","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-boot","cloneExists":true,"packageJsonVersion":"4.0.0","gitHead":"b3434ffaab5ef6ee3e573c6cd5a046ed23555526","originMainHead":"b3434ffaab5ef6ee3e573c6cd5a046ed23555526"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-buffer","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-buffer","cloneExists":true,"packageJsonVersion":"3.6.0","gitHead":"91975726908744d96ff6b3258b57e812650d0950","originMainHead":"91975726908744d96ff6b3258b57e812650d0950"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-bundle","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-bundle","cloneExists":true,"packageJsonVersion":"1.10.0","gitHead":"63a05ae39ddd7c3948b6c4669a94108f71d68249","originMainHead":"63a05ae39ddd7c3948b6c4669a94108f71d68249"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-bundle-compile","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-bundle-compile","cloneExists":true,"packageJsonVersion":"1.2.2","gitHead":"4afb0d0048d52b33ed0640836a65ed499a62952d","originMainHead":"4afb0d0048d52b33ed0640836a65ed499a62952d"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-bundle-evaluate","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-bundle-evaluate","cloneExists":true,"packageJsonVersion":"2.0.0","gitHead":"0770980be20769a0b9cf983b97c9f6a70f2ec035","originMainHead":"0770980be20769a0b9cf983b97c9f6a70f2ec035"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-bundle-id","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-bundle-id","cloneExists":true,"packageJsonVersion":"1.0.2","gitHead":"675f7b682859bac5d57472fd1b54d143825a6c44","originMainHead":"675f7b682859bac5d57472fd1b54d143825a6c44"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-channel","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-channel","cloneExists":true,"packageJsonVersion":"5.2.3","gitHead":"ed8646f30cb401db4535d8cfff43ee1c4e244448","originMainHead":"ed8646f30cb401db4535d8cfff43ee1c4e244448"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-console","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-console","cloneExists":true,"packageJsonVersion":"6.1.0","gitHead":"be2301ae1d31a405e71081bdff9ceb62412c9e89","originMainHead":"be2301ae1d31a405e71081bdff9ceb62412c9e89"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-cov","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-cov","cloneExists":true,"packageJsonVersion":"1.2.1","gitHead":"95850aa46801bee7d2ed1d8a45dd142b15e5ca31","originMainHead":"95850aa46801bee7d2ed1d8a45dd142b15e5ca31"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-crypto","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-crypto","cloneExists":true,"packageJsonVersion":"1.13.4","gitHead":"0cc7ae0272ec59ba08267abef0569a9af30422aa","originMainHead":"0cc7ae0272ec59ba08267abef0569a9af30422aa"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-daemon","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-daemon","cloneExists":true,"packageJsonVersion":"1.2.4","gitHead":"e8fc804546753534bf8ae83bd996781c3afa27aa","originMainHead":"e8fc804546753534bf8ae83bd996781c3afa27aa"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-debug-log","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-debug-log","cloneExists":true,"packageJsonVersion":"2.0.0","gitHead":"5efc42f725b8629f3c7c51dbd0e08209cca47a2b","originMainHead":"5efc42f725b8629f3c7c51dbd0e08209cca47a2b"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-delta","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-delta","cloneExists":true,"packageJsonVersion":"1.1.0","gitHead":"55dd663eea515fac199b46779d75e5bb9fc40e78","originMainHead":"55dd663eea515fac199b46779d75e5bb9fc40e78"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-dev","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-dev","cloneExists":true,"packageJsonVersion":"0.14.11","gitHead":"d853017ef950182c4e49fd82bf07b4f0be2fe38c","originMainHead":"d853017ef950182c4e49fd82bf07b4f0be2fe38c"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-dgram","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-dgram","cloneExists":true,"packageJsonVersion":"1.0.1","gitHead":"078569e40113635b2db7d745071d1e1c1402ebcd","originMainHead":"078569e40113635b2db7d745071d1e1c1402ebcd"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-diagnostics-channel","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-diagnostics-channel","cloneExists":true,"packageJsonVersion":"1.1.0","gitHead":"2fe487b8560b093566b71c65a5a5aa13669413b1","originMainHead":"2fe487b8560b093566b71c65a5a5aa13669413b1"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-dns","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-dns","cloneExists":true,"packageJsonVersion":"2.1.4","gitHead":"02c6fb9d02e98bd2f830ff358e5da40ef01ee6c1","originMainHead":"02c6fb9d02e98bd2f830ff358e5da40ef01ee6c1"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-encoding","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-encoding","cloneExists":true,"packageJsonVersion":"1.0.3","gitHead":"a74cd4e91dc4cc591b864da037816a11b6040bef","originMainHead":"a74cd4e91dc4cc591b864da037816a11b6040bef"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-env","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-env","cloneExists":true,"packageJsonVersion":"3.0.0","gitHead":"c54309e5ac92c059c33d95bf85b8ee0170fc1b50","originMainHead":"c54309e5ac92c059c33d95bf85b8ee0170fc1b50"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-events","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-events","cloneExists":true,"packageJsonVersion":"2.8.2","gitHead":"0f9e0e8dcc52b3970a9e72ab54032cb559927e51","originMainHead":"0f9e0e8dcc52b3970a9e72ab54032cb559927e51"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-exif","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-exif","cloneExists":true,"packageJsonVersion":"1.0.1","gitHead":"10b26737da784779cd95a551319730f4f0b3ace2","originMainHead":"10b26737da784779cd95a551319730f4f0b3ace2"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-fetch","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-fetch","cloneExists":true,"packageJsonVersion":"2.8.1","gitHead":"fb4289615a38b330564d7f25467c5d596e1b3623","originMainHead":"fb4289615a38b330564d7f25467c5d596e1b3623"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-ffmpeg","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-ffmpeg","cloneExists":true,"packageJsonVersion":"1.2.2","gitHead":"9818751dc1a465e1e911359ad02bff1ef505d043","originMainHead":"9818751dc1a465e1e911359ad02bff1ef505d043"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-ffmpeg-encodings","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-ffmpeg-encodings","cloneExists":true,"packageJsonVersion":"1.2.1","gitHead":"36ecaf5836ae5d7beb4e4b2f41c6891effbabe20","originMainHead":"36ecaf5836ae5d7beb4e4b2f41c6891effbabe20"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-file-logger","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-file-logger","cloneExists":true,"packageJsonVersion":"1.2.1","gitHead":"6b246855c0f399387c7ffe81adfbfcfc75efb5ca","originMainHead":"6b246855c0f399387c7ffe81adfbfcfc75efb5ca"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-form-data","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-form-data","cloneExists":true,"packageJsonVersion":"1.2.1","gitHead":"cc100201ad699092dcbef2d97d3b6441cb044a13","originMainHead":"cc100201ad699092dcbef2d97d3b6441cb044a13"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-format","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-format","cloneExists":true,"packageJsonVersion":"1.0.2","gitHead":"867bf1d23c712f94f8f7d2f239dbb2a229b6626c","originMainHead":"867bf1d23c712f94f8f7d2f239dbb2a229b6626c"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-fs","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-fs","cloneExists":true,"packageJsonVersion":"4.6.0","gitHead":"49f6c693bfd2cdb013195ce15bc6f48d286ab4d1","originMainHead":"49f6c693bfd2cdb013195ce15bc6f48d286ab4d1"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-gif","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-gif","cloneExists":true,"packageJsonVersion":"1.1.3","gitHead":"36a7de34ad00b5eae6110e18a6c509236238ac80","originMainHead":"36a7de34ad00b5eae6110e18a6c509236238ac80"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-gtk","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-gtk","cloneExists":true,"packageJsonVersion":"0.1.1","gitHead":"14bd8081c9c92ec79b2558f93b51d2888a23c907","originMainHead":"14bd8081c9c92ec79b2558f93b51d2888a23c907"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-heif","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-heif","cloneExists":true,"packageJsonVersion":"1.0.10","gitHead":"03d98e4979b4f5f5b0d59ea0959fc96930d30aa1","originMainHead":"03d98e4979b4f5f5b0d59ea0959fc96930d30aa1"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-hrtime","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-hrtime","cloneExists":true,"packageJsonVersion":"2.1.1","gitHead":"5d46f2001475f299f58b234d6b3bcc688e8123bc","originMainHead":"5d46f2001475f299f58b234d6b3bcc688e8123bc"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-http-parser","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-http-parser","cloneExists":true,"packageJsonVersion":"1.1.3","gitHead":"e16101fe8619bb4e5c5357531242acc99c513619","originMainHead":"e16101fe8619bb4e5c5357531242acc99c513619"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-http1","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-http1","cloneExists":true,"packageJsonVersion":"4.5.5","gitHead":"6fbb5328f446019f204ad96bc5d31ce7c956730b","originMainHead":"6fbb5328f446019f204ad96bc5d31ce7c956730b"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-https","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-https","cloneExists":true,"packageJsonVersion":"2.1.3","gitHead":"da59813c2d45e1c63162e066f663ce939ef41099","originMainHead":"da59813c2d45e1c63162e066f663ce939ef41099"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-ico","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-ico","cloneExists":true,"packageJsonVersion":"1.0.0","gitHead":"a3840df7acc75bd85897533deaf3587296994be1","originMainHead":"a3840df7acc75bd85897533deaf3587296994be1"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-image-resample","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-image-resample","cloneExists":true,"packageJsonVersion":"1.0.2","gitHead":"66f22d65747236359d95cd4a3135562cb4e149aa","originMainHead":"66f22d65747236359d95cd4a3135562cb4e149aa"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-inspect","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-inspect","cloneExists":true,"packageJsonVersion":"3.1.4","gitHead":"1bd68a53fcb9dcbeed59bd4037f9588416cece32","originMainHead":"1bd68a53fcb9dcbeed59bd4037f9588416cece32"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-inspector","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-inspector","cloneExists":true,"packageJsonVersion":"6.0.0","gitHead":"f95462b17396f15b5e4328ce85e8c0d72d98c44b","originMainHead":"f95462b17396f15b5e4328ce85e8c0d72d98c44b"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-intl","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-intl","cloneExists":true,"packageJsonVersion":"0.0.0","gitHead":"c73558baeae61527f2f200de9587668bbfdb09d8","originMainHead":"c73558baeae61527f2f200de9587668bbfdb09d8"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-ipc","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-ipc","cloneExists":true,"packageJsonVersion":"1.1.1","gitHead":"9ceac54fd545d0996ddd665a0d064e35632e9b9d","originMainHead":"9ceac54fd545d0996ddd665a0d064e35632e9b9d"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-jpeg","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-jpeg","cloneExists":true,"packageJsonVersion":"1.0.4","gitHead":"6a64599412400e44d4951c9c387a7fd7d121972f","originMainHead":"6a64599412400e44d4951c9c387a7fd7d121972f"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-lief","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-lief","cloneExists":true,"packageJsonVersion":"0.2.1","gitHead":"7a305d197c27394328554c94c4b4d4a8c23b1123","originMainHead":"7a305d197c27394328554c94c4b4d4a8c23b1123"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-link","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-link","cloneExists":true,"packageJsonVersion":"3.1.0","gitHead":"72a962c9bc99276a0826abce2a585f6c9ac0e540","originMainHead":"72a962c9bc99276a0826abce2a585f6c9ac0e540"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-logger","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-logger","cloneExists":true,"packageJsonVersion":"2.0.3","gitHead":"10d5589c6fef449052f23e00f3d98725cdd926e4","originMainHead":"10d5589c6fef449052f23e00f3d98725cdd926e4"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-make","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-make","cloneExists":true,"packageJsonVersion":"1.7.2","gitHead":"77ce2a7e72b3367361bdcf17ba35438f95f5afa3","originMainHead":"77ce2a7e72b3367361bdcf17ba35438f95f5afa3"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-media","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-media","cloneExists":true,"packageJsonVersion":"2.5.0","gitHead":"5e1ce11cd4ff664041cfe1edb297184c3000cbf4","originMainHead":"5e1ce11cd4ff664041cfe1edb297184c3000cbf4"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-module","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-module","cloneExists":true,"packageJsonVersion":"6.1.3","gitHead":"543f72b42f4a68164cfc9fbe20f3297e2f9fad59","originMainHead":"543f72b42f4a68164cfc9fbe20f3297e2f9fad59"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-module-lexer","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-module-lexer","cloneExists":true,"packageJsonVersion":"1.4.7","gitHead":"4de7ce931a8cc022c0ef0a1af53a559733e9cce4","originMainHead":"4de7ce931a8cc022c0ef0a1af53a559733e9cce4"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-module-resolve","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-module-resolve","cloneExists":true,"packageJsonVersion":"1.12.1","gitHead":"98c2ecacf2f671691b900b9ae4a1068113bbdeed","originMainHead":"98c2ecacf2f671691b900b9ae4a1068113bbdeed"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-module-traverse","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-module-traverse","cloneExists":true,"packageJsonVersion":"2.0.1","gitHead":"e00e02b1cf0d18e7354f28c8ee584116c0000e9c","originMainHead":"e00e02b1cf0d18e7354f28c8ee584116c0000e9c"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-native","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-native","cloneExists":true,"packageJsonVersion":"0.1.2","gitHead":"b14529f06e2ffab00662a9cffd6e624557e4993b","originMainHead":"b14529f06e2ffab00662a9cffd6e624557e4993b"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-ndk","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-ndk","cloneExists":true,"packageJsonVersion":"0.1.4","gitHead":"55a7bbd4300e8a0680bb6b6d82105193a0a7cc80","originMainHead":"55a7bbd4300e8a0680bb6b6d82105193a0a7cc80"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-net","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-net","cloneExists":true,"packageJsonVersion":"2.3.1","gitHead":"a7422fcf62781b7e2b9ff8ec20ba54e265f02eaf","originMainHead":"a7422fcf62781b7e2b9ff8ec20ba54e265f02eaf"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-node-fetch","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-node-fetch","cloneExists":true,"packageJsonVersion":"1.0.0","gitHead":"56ac4a2a4c301c59724d3be14890bac234e33266","originMainHead":"56ac4a2a4c301c59724d3be14890bac234e33266"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-node-runtime/global","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-node-runtime/global","cloneExists":false,"packageJsonVersion":"","gitHead":"","originMainHead":""}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-open","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-open","cloneExists":true,"packageJsonVersion":"1.0.3","gitHead":"8b7c630ed3a1dc10bb66e6b1f2e6060dc103f0d8","originMainHead":"8b7c630ed3a1dc10bb66e6b1f2e6060dc103f0d8"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-os","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-os","cloneExists":true,"packageJsonVersion":"3.8.7","gitHead":"a7f32f19c648f7e756a482b2794e5f6d38a9175d","originMainHead":"a7f32f19c648f7e756a482b2794e5f6d38a9175d"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-pack","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-pack","cloneExists":true,"packageJsonVersion":"2.0.1","gitHead":"bcc2b98fea6e4a57b52fed88189a8c3b175850f8","originMainHead":"bcc2b98fea6e4a57b52fed88189a8c3b175850f8"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-pack-drive","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-pack-drive","cloneExists":true,"packageJsonVersion":"2.0.0","gitHead":"4919df6a6c600e303b1d5a8d4f9ea913dbd1a0c8","originMainHead":"4919df6a6c600e303b1d5a8d4f9ea913dbd1a0c8"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-path","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-path","cloneExists":true,"packageJsonVersion":"3.0.0","gitHead":"06a351a0f7e739341bfa4aafb9d008243cae3ddf","originMainHead":"06a351a0f7e739341bfa4aafb9d008243cae3ddf"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-performance","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-performance","cloneExists":true,"packageJsonVersion":"2.0.0","gitHead":"2580cd3fc36e4fa27641aecabd49ea7ab332de5a","originMainHead":"2580cd3fc36e4fa27641aecabd49ea7ab332de5a"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-pipe","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-pipe","cloneExists":true,"packageJsonVersion":"4.1.5","gitHead":"837dbe8527259711b1cf7f76fb2af0abbee78bc8","originMainHead":"837dbe8527259711b1cf7f76fb2af0abbee78bc8"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-png","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-png","cloneExists":true,"packageJsonVersion":"1.0.5","gitHead":"52ff5969205938e66d4fefa7affbe1f451a5b2cd","originMainHead":"52ff5969205938e66d4fefa7affbe1f451a5b2cd"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-prebuild","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-prebuild","cloneExists":true,"packageJsonVersion":"1.1.2","gitHead":"d43b3218db70efd7d9d33e532659e854aa1c2134","originMainHead":"d43b3218db70efd7d9d33e532659e854aa1c2134"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-process","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-process","cloneExists":true,"packageJsonVersion":"4.4.1","gitHead":"d1ff4d46fc3029e57727b4c6cd83014f754e03b7","originMainHead":"d1ff4d46fc3029e57727b4c6cd83014f754e03b7"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-prom-client","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-prom-client","cloneExists":true,"packageJsonVersion":"15.1.6","gitHead":"b0efd87825e26e72251e01a7f6a00cb18e591c9c","originMainHead":""}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-punycode","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-punycode","cloneExists":true,"packageJsonVersion":"0.0.0","gitHead":"d3e5ff6a8ea19ea9f0e9de806b6fb712fdee3037","originMainHead":"d3e5ff6a8ea19ea9f0e9de806b6fb712fdee3037"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-querystring","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-querystring","cloneExists":true,"packageJsonVersion":"1.0.0","gitHead":"3104e15a62505746b757d6c3ee5e679cd1d8b0da","originMainHead":"3104e15a62505746b757d6c3ee5e679cd1d8b0da"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-queue-microtask","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-queue-microtask","cloneExists":true,"packageJsonVersion":"1.0.0","gitHead":"40c9da92d947e145ea7f592f792c42efde0e95c6","originMainHead":"40c9da92d947e145ea7f592f792c42efde0e95c6"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-readline","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-readline","cloneExists":true,"packageJsonVersion":"1.3.1","gitHead":"de2262781a303dd94a4c0ecb7752ea0e478f6f0e","originMainHead":"de2262781a303dd94a4c0ecb7752ea0e478f6f0e"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-realm","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-realm","cloneExists":true,"packageJsonVersion":"2.0.1","gitHead":"7a95a481c36f41ed676045e1123664df0926dc9c","originMainHead":"7a95a481c36f41ed676045e1123664df0926dc9c"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-repl","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-repl","cloneExists":true,"packageJsonVersion":"6.0.2","gitHead":"7ee46b5b88e13953a84f3ca6b2f2b7330d84001f","originMainHead":"7ee46b5b88e13953a84f3ca6b2f2b7330d84001f"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-rpc","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-rpc","cloneExists":true,"packageJsonVersion":"1.2.0","gitHead":"72307a9ecbbe7152117a77aebc7464f2729f1e72","originMainHead":"72307a9ecbbe7152117a77aebc7464f2729f1e72"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-run","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-run","cloneExists":true,"packageJsonVersion":"0.1.0","gitHead":"ae4acc76987655c8ee41b03ca380d934222a99a3","originMainHead":"ae4acc76987655c8ee41b03ca380d934222a99a3"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-runtime","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-runtime","cloneExists":true,"packageJsonVersion":"1.28.1","gitHead":"9dde77922df0bdd21bdc91eab4e6635930c433ca","originMainHead":"9dde77922df0bdd21bdc91eab4e6635930c433ca"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-sdl","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-sdl","cloneExists":true,"packageJsonVersion":"1.0.0-5","gitHead":"549d834cbefc79db3ebaa390c46ff8fa5325fa30","originMainHead":"549d834cbefc79db3ebaa390c46ff8fa5325fa30"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-semver","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-semver","cloneExists":true,"packageJsonVersion":"1.0.2","gitHead":"390125e84d62cb053a9f7e4de72ea2f5cdc721a2","originMainHead":"390125e84d62cb053a9f7e4de72ea2f5cdc721a2"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-sidecar","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-sidecar","cloneExists":true,"packageJsonVersion":"0.3.0","gitHead":"12bd3e57079c40d90abcec6cd8fab301c5975e29","originMainHead":"12bd3e57079c40d90abcec6cd8fab301c5975e29"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-signals","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-signals","cloneExists":true,"packageJsonVersion":"4.2.0","gitHead":"fef3abd851b44446c3b2be8bdf7279c8946380fb","originMainHead":"fef3abd851b44446c3b2be8bdf7279c8946380fb"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-stdio","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-stdio","cloneExists":true,"packageJsonVersion":"1.0.2","gitHead":"02c37545803f1c9b26f8eb3810ac17a02461ad81","originMainHead":"02c37545803f1c9b26f8eb3810ac17a02461ad81"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-storage","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-storage","cloneExists":true,"packageJsonVersion":"1.1.0","gitHead":"7362cb1bedc8a1f2b488d5d6f043241a898a131d","originMainHead":"7362cb1bedc8a1f2b488d5d6f043241a898a131d"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-stream","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-stream","cloneExists":true,"packageJsonVersion":"2.12.0","gitHead":"a121d98363789b359bb39861e22ecdae276ef520","originMainHead":"a121d98363789b359bb39861e22ecdae276ef520"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-string-decoder","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-string-decoder","cloneExists":true,"packageJsonVersion":"1.0.0","gitHead":"36897cc9f1cc53ce5862d99172de4d153507e5b1","originMainHead":"36897cc9f1cc53ce5862d99172de4d153507e5b1"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-structured-clone","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-structured-clone","cloneExists":true,"packageJsonVersion":"1.5.3","gitHead":"f78753d41b32123bd3ba5287b8d4d17c8b43355a","originMainHead":"f78753d41b32123bd3ba5287b8d4d17c8b43355a"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-subprocess","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-subprocess","cloneExists":true,"packageJsonVersion":"5.2.3","gitHead":"6912208bc9983d278b6b54ab052a885b7dce2e38","originMainHead":"6912208bc9983d278b6b54ab052a885b7dce2e38"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-svg","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-svg","cloneExists":true,"packageJsonVersion":"1.0.1","gitHead":"1744052b03d14beb605b30e5fcf9524a857286ef","originMainHead":"1744052b03d14beb605b30e5fcf9524a857286ef"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-system-logger","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-system-logger","cloneExists":true,"packageJsonVersion":"1.0.3","gitHead":"fd4695e8a34252b50e6d7332c608eaf2411337b4","originMainHead":"fd4695e8a34252b50e6d7332c608eaf2411337b4"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-tap","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-tap","cloneExists":true,"packageJsonVersion":"1.0.0","gitHead":"a2f9cf2b778f466be7852496fe41e93a9c3919e4","originMainHead":"a2f9cf2b778f466be7852496fe41e93a9c3919e4"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-tcp","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-tcp","cloneExists":true,"packageJsonVersion":"2.2.7","gitHead":"4c1f3095d46244505c9df08d69ba2f0aa5dfc948","originMainHead":"4c1f3095d46244505c9df08d69ba2f0aa5dfc948"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-thread","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-thread","cloneExists":true,"packageJsonVersion":"1.2.0","gitHead":"beeafb4d8322fb418b57425cb7174a2dcf8907c6","originMainHead":"beeafb4d8322fb418b57425cb7174a2dcf8907c6"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-tiff","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-tiff","cloneExists":true,"packageJsonVersion":"1.0.2","gitHead":"34a4bedf2dea7119426458182cbb67cc1e74f1c2","originMainHead":"34a4bedf2dea7119426458182cbb67cc1e74f1c2"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-timers","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-timers","cloneExists":true,"packageJsonVersion":"3.2.1","gitHead":"49ce62cf4446ef2da4b8b280a7bb0b459a34d8a1","originMainHead":"49ce62cf4446ef2da4b8b280a7bb0b459a34d8a1"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-tls","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-tls","cloneExists":true,"packageJsonVersion":"2.2.1","gitHead":"ee2e0259d27ddec1ae41be14392997ad9a0d16a6","originMainHead":"ee2e0259d27ddec1ae41be14392997ad9a0d16a6"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-tpl","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-tpl","cloneExists":true,"packageJsonVersion":"1.0.0","gitHead":"91c7f423699fb66126e666519954b5256660ab42","originMainHead":"91c7f423699fb66126e666519954b5256660ab42"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-tty","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-tty","cloneExists":true,"packageJsonVersion":"5.1.0","gitHead":"e8e0fc00d62872e87c907f5f5bcc587b617d1384","originMainHead":"e8e0fc00d62872e87c907f5f5bcc587b617d1384"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-type","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-type","cloneExists":true,"packageJsonVersion":"1.1.0","gitHead":"4b9f589e1868ef21161507fe9251a2bfa9c4527f","originMainHead":"4b9f589e1868ef21161507fe9251a2bfa9c4527f"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-ui-kit","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-ui-kit","cloneExists":true,"packageJsonVersion":"0.1.1","gitHead":"53b7cb69049ed5e3ab965312c032dad6ff00c838","originMainHead":"53b7cb69049ed5e3ab965312c032dad6ff00c838"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-union-bundle","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-union-bundle","cloneExists":true,"packageJsonVersion":"1.1.1","gitHead":"c7cc45b4bcb3aeaca5cd1139b249d266a889d3dd","originMainHead":"c7cc45b4bcb3aeaca5cd1139b249d266a889d3dd"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-unpack","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-unpack","cloneExists":true,"packageJsonVersion":"1.1.3","gitHead":"bbc06f4670b3b6bb88fb750c21b1969faf99a185","originMainHead":"bbc06f4670b3b6bb88fb750c21b1969faf99a185"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-url","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-url","cloneExists":true,"packageJsonVersion":"2.4.0","gitHead":"c0186ba1d4cb715a1cd887273ad2d39b3ce5b60e","originMainHead":"c0186ba1d4cb715a1cd887273ad2d39b3ce5b60e"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-utils","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-utils","cloneExists":true,"packageJsonVersion":"1.6.0","gitHead":"356cf5dda14736b9a69f2110fa17256fe874cde3","originMainHead":"356cf5dda14736b9a69f2110fa17256fe874cde3"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-v8","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-v8","cloneExists":true,"packageJsonVersion":"1.0.1","gitHead":"14cd89c31e52a35f14c5b1fe726dc360aefe98d5","originMainHead":"14cd89c31e52a35f14c5b1fe726dc360aefe98d5"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-v8-to-istanbul","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-v8-to-istanbul","cloneExists":true,"packageJsonVersion":"1.0.3","gitHead":"994f0f8f698c4a428c9607f4beb5c802dd725303","originMainHead":"994f0f8f698c4a428c9607f4beb5c802dd725303"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-vm","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-vm","cloneExists":true,"packageJsonVersion":"1.0.1","gitHead":"2c679a85629ef26e303c7872ad862892f0468f4e","originMainHead":"2c679a85629ef26e303c7872ad862892f0468f4e"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-walk-handles","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-walk-handles","cloneExists":true,"packageJsonVersion":"2.0.10","gitHead":"47fdc52fab8433decdf2ac788bd65515131f4460","originMainHead":"47fdc52fab8433decdf2ac788bd65515131f4460"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-web-kit","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-web-kit","cloneExists":true,"packageJsonVersion":"0.1.2","gitHead":"964f30a1d1c8bb4dbc3b63f4d7189d856b6485f3","originMainHead":"964f30a1d1c8bb4dbc3b63f4d7189d856b6485f3"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-web-kit-gtk","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-web-kit-gtk","cloneExists":true,"packageJsonVersion":"0.1.0","gitHead":"efa7271a8470d45d0f62f46428b9bdfcb0c46cf6","originMainHead":"efa7271a8470d45d0f62f46428b9bdfcb0c46cf6"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-webp","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-webp","cloneExists":true,"packageJsonVersion":"1.3.0","gitHead":"a2ebbc727c2311eca82b177c07079c4cd5bf3b5a","originMainHead":"a2ebbc727c2311eca82b177c07079c4cd5bf3b5a"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-which","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-which","cloneExists":true,"packageJsonVersion":"2.0.0","gitHead":"d3d76e16692966dcbf5b0c029378df34af27df39","originMainHead":"d3d76e16692966dcbf5b0c029378df34af27df39"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-win-ui","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-win-ui","cloneExists":true,"packageJsonVersion":"0.1.0","gitHead":"2c9bd611b76c27496b72ba0dbdea5fac840cdb72","originMainHead":"2c9bd611b76c27496b72ba0dbdea5fac840cdb72"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-worker","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-worker","cloneExists":true,"packageJsonVersion":"4.1.6","gitHead":"054df9a84e1a394828bd78ae462116cb2fac48f7","originMainHead":"054df9a84e1a394828bd78ae462116cb2fac48f7"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-ws","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-ws","cloneExists":true,"packageJsonVersion":"2.1.0","gitHead":"f6e4f80cdb306d0f57cf85f6bcf0630206d024a2","originMainHead":"f6e4f80cdb306d0f57cf85f6bcf0630206d024a2"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-xdiff","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-xdiff","cloneExists":true,"packageJsonVersion":"2.0.1","gitHead":"ef7cf7d8780ceb5dc4b41bae377a04b011c5591a","originMainHead":"ef7cf7d8780ceb5dc4b41bae377a04b011c5591a"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-zlib","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-zlib","cloneExists":true,"packageJsonVersion":"1.3.1","gitHead":"ff3d412b183c2fba97b7886d6227cc55423df9a0","originMainHead":"ff3d412b183c2fba97b7886d6227cc55423df9a0"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"bare-zmq","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/bare-zmq","cloneExists":true,"packageJsonVersion":"1.2.5","gitHead":"3a8e643708394e0bd7c3e94a011a8621fed0521c","originMainHead":"3a8e643708394e0bd7c3e94a011a8621fed0521c"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"compact-encoding","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/compact-encoding","cloneExists":true,"packageJsonVersion":"2.19.2","gitHead":"333d5489695a691f0bd17d3271f8e7107346ca0e","originMainHead":"333d5489695a691f0bd17d3271f8e7107346ca0e"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"hypercore-id-encoding","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/hypercore-id-encoding","cloneExists":true,"packageJsonVersion":"1.3.0","gitHead":"9a3821fa307d01ccc86c2bd9bf7ba99dceec43d6","originMainHead":"9a3821fa307d01ccc86c2bd9bf7ba99dceec43d6"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"protomux","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/protomux","cloneExists":true,"packageJsonVersion":"3.10.1","gitHead":"07dd025b491917627dfe182700a1b4459574b041","originMainHead":"07dd025b491917627dfe182700a1b4459574b041"}
|
||||
{"type":"bare_os_holepunch_clone_row","schema":1,"atMs":1775409012595,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","name":"safety-catch","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/safety-catch","cloneExists":false,"packageJsonVersion":"","gitHead":"","originMainHead":""}
|
||||
@@ -1,11 +1,11 @@
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775369902164,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"protomux","lockKey":"protomux","lockfileVersion":"3.10.1","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/protomux","cloneExists":true,"clonePackageJsonVersion":"3.10.1","semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775369902164,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"hyperdrive","lockKey":"hyperdrive","lockfileVersion":"13.3.2","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/hyperdrive","cloneExists":true,"clonePackageJsonVersion":"13.3.2","semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775369902164,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"hypercore","lockKey":"hypercore","lockfileVersion":"11.28.1","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/hypercore","cloneExists":true,"clonePackageJsonVersion":"11.28.1","semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775369902164,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"hyperswarm","lockKey":"hyperswarm","lockfileVersion":"4.17.0","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/hyperswarm","cloneExists":true,"clonePackageJsonVersion":"4.17.0","semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775369902164,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"udx-native","lockKey":"udx-native","lockfileVersion":"1.19.2","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/udx-native","cloneExists":true,"clonePackageJsonVersion":"1.20.3","semverMismatchWithClone":true}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775369902164,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"blind-peer-router","lockKey":"blind-peer-router","lockfileVersion":null,"clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/blind-peer-router","cloneExists":true,"clonePackageJsonVersion":"0.2.2","semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775369902164,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"blind-peering","lockKey":"blind-peering","lockfileVersion":"1.15.0","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/blind-peering","cloneExists":true,"clonePackageJsonVersion":"2.0.1","semverMismatchWithClone":true}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775369902164,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"hyperbee2","lockKey":"hyperbee2","lockfileVersion":null,"clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/hyperbee2","cloneExists":true,"clonePackageJsonVersion":"2.9.1","semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775369902164,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"corestore-snapshot","lockKey":"corestore-snapshot","lockfileVersion":null,"clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/corestore-snapshot","cloneExists":true,"clonePackageJsonVersion":"1.3.0","semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775369902164,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"compact-encoding","lockKey":"compact-encoding","lockfileVersion":"2.19.2","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/compact-encoding","cloneExists":true,"clonePackageJsonVersion":"2.19.2","semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775369902164,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"secret-stream","lockKey":"@hyperswarm/secret-stream","lockfileVersion":"6.9.1","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/secret-stream","cloneExists":false,"clonePackageJsonVersion":null,"semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775409015169,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"protomux","lockKey":"protomux","lockfileVersion":"3.10.1","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/protomux","cloneExists":true,"clonePackageJsonVersion":"3.10.1","semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775409015169,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"hyperdrive","lockKey":"hyperdrive","lockfileVersion":"13.3.2","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/hyperdrive","cloneExists":true,"clonePackageJsonVersion":"13.3.2","semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775409015169,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"hypercore","lockKey":"hypercore","lockfileVersion":"11.28.1","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/hypercore","cloneExists":true,"clonePackageJsonVersion":"11.28.1","semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775409015169,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"hyperswarm","lockKey":"hyperswarm","lockfileVersion":"4.17.0","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/hyperswarm","cloneExists":true,"clonePackageJsonVersion":"4.17.0","semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775409015169,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"udx-native","lockKey":"udx-native","lockfileVersion":"1.19.2","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/udx-native","cloneExists":true,"clonePackageJsonVersion":"1.20.3","semverMismatchWithClone":true}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775409015169,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"blind-peer-router","lockKey":"blind-peer-router","lockfileVersion":null,"clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/blind-peer-router","cloneExists":true,"clonePackageJsonVersion":"0.2.2","semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775409015169,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"blind-peering","lockKey":"blind-peering","lockfileVersion":"1.15.0","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/blind-peering","cloneExists":true,"clonePackageJsonVersion":"2.0.1","semverMismatchWithClone":true}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775409015169,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"hyperbee2","lockKey":"hyperbee2","lockfileVersion":null,"clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/hyperbee2","cloneExists":true,"clonePackageJsonVersion":"2.9.1","semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775409015169,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"corestore-snapshot","lockKey":"corestore-snapshot","lockfileVersion":null,"clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/corestore-snapshot","cloneExists":true,"clonePackageJsonVersion":"1.3.0","semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775409015169,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"compact-encoding","lockKey":"compact-encoding","lockfileVersion":"2.19.2","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/compact-encoding","cloneExists":true,"clonePackageJsonVersion":"2.19.2","semverMismatchWithClone":false}
|
||||
{"type":"bare_os_holepunch_lockfile_drift","schema":1,"atMs":1775409015169,"clonesRoot":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos","cloneName":"secret-stream","lockKey":"@hyperswarm/secret-stream","lockfileVersion":"6.9.1","clonePath":"/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos/secret-stream","cloneExists":false,"clonePackageJsonVersion":null,"semverMismatchWithClone":false}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"atMs": 1775369902164,
|
||||
"atMs": 1775409015169,
|
||||
"lockfilePath": "package-lock.json",
|
||||
"clonesRoot": "/Users/raven/dev/pearcli/holepunch-repos/holepunchto_repos",
|
||||
"clonesRootExists": true,
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"atMs": 1775408803237,
|
||||
"fileCount": 263,
|
||||
"hitCount": 0,
|
||||
"note": "Vendor bundles under kernel/lib/bare/bundles are excluded. Cross-check with docs/audit/PLACEHOLDER_BASELINE.md and CI verify-runtime-no-incomplete-markers.mjs.",
|
||||
"hits": []
|
||||
}
|
||||
@@ -14,7 +14,7 @@ Single place to compare **protocol**, **booter `ctx` API**, **feature-bit docume
|
||||
|
||||
## Version artifacts
|
||||
|
||||
**`bareOsCtxApiVersion`** (current stock: **`1.48.0`**) — Defined in [`packages/bare-os-booter/lib/bare-os-ctx-api.js`](../../packages/bare-os-booter/lib/bare-os-ctx-api.js). This is the semver string for the documented **`ctx`** contract; bump it when stable guest-visible behavior changes.
|
||||
**`bareOsCtxApiVersion`** (current stock: **`1.49.0`**) — Defined in [`packages/bare-os-booter/lib/bare-os-ctx-api.js`](../../packages/bare-os-booter/lib/bare-os-ctx-api.js). This is the semver string for the documented **`ctx`** contract; bump it when stable guest-visible behavior changes.
|
||||
|
||||
**`BARE_OS_KERNEL_FEATURE_BITS_DOC`** (current stock: **`15`**) — Exported from [`packages/bare-os-protocol/lib/kernel-feature-bits.js`](../../packages/bare-os-protocol/lib/kernel-feature-bits.js). It versions the feature-bit documentation and related governance; keep it aligned with [`developer-guide/adr/001-kernel-feature-bits-governance.md`](../../developer-guide/adr/001-kernel-feature-bits-governance.md).
|
||||
|
||||
@@ -24,9 +24,9 @@ Single place to compare **protocol**, **booter `ctx` API**, **feature-bit docume
|
||||
|
||||
**Protocol package** — Workspace version in [`bare-os-protocol` `package.json`](../../packages/bare-os-protocol/package.json). Pair it with seeder and booter releases when you change wire behavior.
|
||||
|
||||
**POSIX-like profile** — **`BARE_OS_POSIX_PROFILE_VERSION`** (**`1.0.12`**) and **`BARE_OS_POSIX_PROFILE_ID`** (**`bare-os-posix-like`**) in [`bare-os-protocol/lib/bare-os-posix-profile.js`](../../packages/bare-os-protocol/lib/bare-os-posix-profile.js). Surfaced under **`/proc/bare_os_features`** as **`capabilitySurface.posixProfile`** and in **`/proc/bare_os/syscalls.json`**.
|
||||
**POSIX-like profile** — **`BARE_OS_POSIX_PROFILE_VERSION`** (**`1.0.13`**) and **`BARE_OS_POSIX_PROFILE_ID`** (**`bare-os-posix-like`**) in [`bare-os-protocol/lib/bare-os-posix-profile.js`](../../packages/bare-os-protocol/lib/bare-os-posix-profile.js). Surfaced under **`/proc/bare_os_features`** as **`capabilitySurface.posixProfile`** and in **`/proc/bare_os/syscalls.json`**.
|
||||
|
||||
**`/proc/bare_os/syscalls.json`** — Schema **8** (see also [handbook ch.9 §2.3](../../handbook/09-posix-utilities-shell-and-vfs.md#23-pseudo-proc-sys-run-dev-and-session-tmp)) documents cooperative **`fcntl`** advisory locks (optional **`BARE_OS_POSIX_FCNTL_BLOCKING_WAIT`** for **`F_SETLKW`**-shaped waits), optional **`BARE_OS_POSIX_SOCKET_FD_BRIDGE`** **`socket`/`connect`** (**`SOCK_STREAM`** via **`bareTcp`**, **`SOCK_DGRAM`** via **`bareDgram`** when merged) with bounded **`send`/`sendmsg`/`recv`/`recvfrom`/`recvmsg`** on bridged datagram fds (**`BARE_OS_POSIX_DGRAM_RECVQ_MAX`**, **`BARE_OS_POSIX_DGRAM_RECV_BLOCK_MS_MAX`**), **`socketMsgSurface`** schema **3** (**`sendmsg`/`recvmsg`** partial on bridge; non-empty ancillary on **`sendmsg`** → **`ENOTSUP`** + **`ancillaryReject`**; **`recvmsg`** **`controllen` 0**), and retains socket-family **probes** plus **`posixXsh`**. Earlier schemas added **`fdModel`**, **`signalModel`**, **`opsDetail`**, **`errnoHints`**, and **`posixProfile`**. The stock booter **caches** the JSON text until **`vfs.bareOsClearWarmReadCaches()`** / **`ctx.bareOsInvalidateWarmReadCaches()`** (same invalidation path as **`/bin`** warm cache; **`boot/init.js`** and **`lib/init/**` batch puts also invalidate). Example payload: [`kernel/etc/bare-os/syscalls.example.json`](../../kernel/etc/bare-os/syscalls.example.json); JSON Schema: [`docs/schemas/bare-os-syscalls.schema.json`](../schemas/bare-os-syscalls.schema.json).
|
||||
**`/proc/bare_os/syscalls.json`** — Schema **8** (see also [handbook ch.9 §2.3](../../handbook/09-posix-utilities-shell-and-vfs.md#23-pseudo-proc-sys-run-dev-and-session-tmp)) documents cooperative **`fcntl`** advisory locks (optional **`BARE_OS_POSIX_FCNTL_BLOCKING_WAIT`** for **`F_SETLKW`**-shaped waits), optional **`BARE_OS_POSIX_SOCKET_FD_BRIDGE`** **`socket`/`connect`** (**`SOCK_STREAM`** via **`bareTcp`**, **`SOCK_DGRAM`** via **`bareDgram`** when merged) with bounded **`send`/`sendmsg`/`recv`/`recvfrom`/`recvmsg`** on bridged datagram fds (**`BARE_OS_POSIX_DGRAM_RECVQ_MAX`**, **`BARE_OS_POSIX_DGRAM_RECV_BLOCK_MS_MAX`**), **`socketMsgSurface`** schema **4** (**`sendmsg`/`recvmsg`** partial on bridge; binary ancillary **`ENOTSUP`**; optional **`logicalScmRightsOnSend`** when **`BARE_OS_POSIX_SOCKET_SCM_RIGHTS`**; **`recvmsg`** **`controllen` 0**), and retains socket-family **probes** plus **`posixXsh`**. Earlier schemas added **`fdModel`**, **`signalModel`**, **`opsDetail`**, **`errnoHints`**, and **`posixProfile`**. The stock booter **caches** the JSON text until **`vfs.bareOsClearWarmReadCaches()`** / **`ctx.bareOsInvalidateWarmReadCaches()`** (same invalidation path as **`/bin`** warm cache; **`boot/init.js`** and **`lib/init/**` batch puts also invalidate). Example payload: [`kernel/etc/bare-os/syscalls.example.json`](../../kernel/etc/bare-os/syscalls.example.json); JSON Schema: [`docs/schemas/bare-os-syscalls.schema.json`](../schemas/bare-os-syscalls.schema.json).
|
||||
|
||||
**`/proc/bare_os/process_table.json`** — Schema **7** (see **`fdModel.processTableSchema`** inside **`syscalls.json`** and [handbook ch.9 §2.3](../../handbook/09-posix-utilities-shell-and-vfs.md#23-pseudo-proc-sys-run-dev-and-session-tmp)); documents logical jobs, PGID/SID-style fields, initd binding, and signal routing.
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Auto-generated by scripts/gen-ctx-client-helper.mjs — do not edit by hand.
|
||||
|
||||
/** Canonical `ctx` API semver from `packages/bare-os-booter/lib/bare-os-ctx-api.js`. */
|
||||
export const BARE_OS_CTX_API_CLIENT_VERSION = '1.48.0' as const
|
||||
export const BARE_OS_CTX_API_CLIENT_VERSION = '1.49.0' as const
|
||||
|
||||
/** Relative path to the hand-maintained TypeScript contract (schema source of truth). */
|
||||
export const BARE_OS_CTX_DTS_SOURCE = 'packages/bare-os-booter/lib/bare-os-ctx.d.ts' as const
|
||||
@@ -10,7 +10,7 @@ export const BARE_OS_CTX_DTS_SOURCE = 'packages/bare-os-booter/lib/bare-os-ctx.d
|
||||
export const BARE_OS_CTX_DTS_BAREOS_MEMBER_APPROX = 153 as const
|
||||
|
||||
/** Byte length of `bare-os-ctx.d.ts` when this file was generated. */
|
||||
export const BARE_OS_CTX_DTS_BYTES = 19405 as const
|
||||
export const BARE_OS_CTX_DTS_BYTES = 19574 as const
|
||||
|
||||
/** Pointers for external client generators (OpenAPI / JSON Schema follow-ups). */
|
||||
export const BARE_OS_CTX_SCHEMA_HINT = {
|
||||
|
||||
@@ -107,9 +107,14 @@ The list below is one **bullet per variable** in the form **name — component
|
||||
- `BARE_OS_PEER_FIREWALL_E2E_JSON` — Booter / replication proc — Optional operator JSON merged into **`/proc/bare_os/replication`** for peer-firewall end-to-end checks (**invalid JSON yields an error object** in proc).
|
||||
- `BARE_OS_REPLICATION_PLAN_JSON` — Booter — Optional JSON string merged into **`/proc/bare_os/replication`** as **`guestReplicationPlan`** (operator warm-replication / mirror-drive style hints; guest does not execute the plan).
|
||||
- `BARE_OS_REPLICATION_SYNC_PARALLEL_MAX` — Booter — Integer hint surfaced under **`/proc/bare_os/sync_window.json`** as **`parallelismHint`** for overlapping replication window fetches (stock default **4** when unset).
|
||||
- `BARE_OS_REPLICATION_PEER_PRIORITY_JSON` — Booter / **`disk.os`** — Optional non-secret JSON parsed into **`bare_os.replication_operator_sketch`** **`peerPrioritySketch`** (schema **4**). Operator-shaped ordering hints for peer keys (for example **`orderedPeerKeyHex`**) — P2P-local policy only; no central coordinator.
|
||||
- `BARE_OS_PEER_ALLOWLIST_HEX` — Booter / Hyperswarm — Optional comma- or space-separated allowlist of peer public keys (hex) for admission; empty list with **`BARE_OS_PEER_ALLOWLIST_STRICT`** denies all peers.
|
||||
- `BARE_OS_PEER_ALLOWLIST_STRICT` — Booter — When **`1`** / **`true`**, **`BARE_OS_PEER_ALLOWLIST_HEX` must be non-empty** or no remote peers are admitted (fail-closed operator posture).
|
||||
- `BARE_OS_DHT_ADDRESS_CLASS_ALLOWLIST` — Booter / **`/proc/bare_os/swarm.json`** — Comma-separated tokens (**`ipv4`**, **`ipv6`**, **`relay`**, …) surfaced under **`dhtAddressClassAllowlist`** for operator alignment with **hyperdht-address** discovery classes. **`ctx.bareOsEvaluatePeerAdmission(peerKeyHex, { dhtAddressClass })`** and **`BareOsSwarmConnectionManager.shouldAttemptPeer(peerKey, { dhtAddressClass })`** deny when the hint is present and not listed; the stock Hyperswarm join path does not supply a class — custom hosts wire **`meta.dhtAddressClass`** from their stack.
|
||||
- `BARE_OS_PEER_DENYLIST_HEX` — Booter — Comma- or space-separated hex public keys; **`ctx.bareOsEvaluatePeerAdmission`** returns **`deny`** with **`reason: peer_denylist`** before allowlist evaluation (denylist wins).
|
||||
- `BARE_OS_PEER_REQUIRE_CAPS_JSON` — Booter — JSON array of strings; when set, **`meta.caps`** passed to **`ctx.bareOsEvaluatePeerAdmission`** must include every token or the verdict is **`deny`** (**`reason: peer_missing_cap`**).
|
||||
- `BARE_OS_PEER_ADMISSION_AUDIT_NDJSON` — Booter — When **`1`** / **`true`**, each admission evaluation may append a **`peer_admission`** row to the event bus (and session stdout when **`BARE_OS_EVENT_BUS_NDJSON`** is on). Payloads use a **16-hex prefix** of the peer key only.
|
||||
- `BARE_OS_PEER_ADMISSION_AUDIT_RATE_MS` — Booter — Non-negative integer; minimum milliseconds between **`peer_admission`** audit rows **per peer prefix** (or a shared **`unknown`** bucket when the key is empty). **`0`** or unset means no throttling.
|
||||
- `BARE_OS_DHT_ADDRESS_CLASS_ALLOWLIST` — Booter / **`/proc/bare_os/swarm.json`** — Comma-separated tokens (**`ipv4`**, **`ipv6`**, **`relay`**, …) surfaced under **`dhtAddressClassAllowlist`** for operator alignment with **hyperdht-address** discovery classes. **`ctx.bareOsEvaluatePeerAdmission(peerKeyHex, { dhtAddressClass, caps })`** and **`BareOsSwarmConnectionManager.shouldAttemptPeer(peerKey, { dhtAddressClass })`** deny when the hint is present and not listed; the stock Hyperswarm join path does not supply a class — custom hosts wire **`meta.dhtAddressClass`** from their stack.
|
||||
- `BARE_OS_NET_TRANSPORT_STATS_JSON` — Booter — Optional JSON merged into **`/proc/bare_os/net_summary.json`** as **`transport`** (Holepunch UDX / punch outcomes when the host supplies a sketch).
|
||||
- `BARE_OS_UDX_TUNING_JSON` — Booter — Optional JSON surfaced under **`/proc/bare_os/net_summary.json`** as **`udxTuning`** (operator-only; guest does not apply kernel tuning).
|
||||
- `BARE_OS_HYPERSWARM_TUNING_JSON` — Booter — Optional JSON surfaced under **`/proc/bare_os/net_summary.json`** as **`hyperswarmTuning`** (operator-only).
|
||||
@@ -117,7 +122,7 @@ The list below is one **bullet per variable** in the form **name — component
|
||||
- `BARE_OS_SWARM_MAX_CLIENT_CONNECTIONS` — Booter — Cap inbound client connections (**Hyperswarm** **`maxClientConnections`**).
|
||||
- `BARE_OS_SWARM_MAX_SERVER_CONNECTIONS` — Booter — Cap outbound server connections (**Hyperswarm** **`maxServerConnections`**).
|
||||
- `BARE_OS_SWARM_MAX_PARALLEL` — Booter — Integer passed to Hyperswarm **`maxParallel`** when set. Effective values echo under **`/proc/bare_os/swarm`** **`connectionBudget`** and **`disk.os` `replication_operator_sketch`** (**schema 4**).
|
||||
- `BARE_OS_PEAR_SECURE_ENCLAVE_JSON` — Booter / security posture — Non-secret JSON pointer for optional Pear secure-enclave key storage hints; treat as opaque unless host policy attests hardware backing (see [vault threat model](vault-threat-model.md)).
|
||||
- `BARE_OS_PEAR_SECURE_ENCLAVE_JSON` — Booter / security posture — Non-secret JSON pointer for optional Pear secure-enclave key storage hints; treat as opaque unless host policy attests hardware backing (see [vault threat model](../security/vault-threat-model.md)).
|
||||
- `BARE_OS_ACCOUNT_KEY_ROTATION_STATE_JSON` — Booter / security posture — Non-secret JSON for signing continuity across overlapping trust windows during account key rotation (not private keys).
|
||||
- `BARE_OS_TIMER_EVERY_MS_MONOTONIC` — bare-cron / timers — When **`1`** / **`true`**, **`EveryMs=`** timer units may use monotonic scheduling where supported.
|
||||
- `BARE_OS_TRACE_ID` — Booter / telemetry — Optional correlation id mirrored into telemetry NDJSON lines when set.
|
||||
@@ -176,7 +181,7 @@ The list below is one **bullet per variable** in the form **name — component
|
||||
- `BARE_OS_POSIX_FD_SIM_MAX_BYTES` — Booter — Max buffered bytes per simulated pipe pair (default **`1048576`**, hard cap **16 MiB**).
|
||||
- `BARE_OS_POSIX_FCNTL_BLOCKING_WAIT` — Booter — When **`1`** / **`true`** / **`yes`**, **`F_SETLKW`** on cooperative advisory locks **waits** (FIFO queue) until the lock is free or **`BARE_OS_FCNTL_LOCK_WAIT_MS_MAX`** elapses (**`ETIMEDOUT`**).
|
||||
- `BARE_OS_FCNTL_LOCK_WAIT_MS_MAX` — Booter — Upper bound in milliseconds for **`F_SETLKW`** blocking wait (default **`30000`**, hard cap **`300000`**).
|
||||
- `BARE_OS_POSIX_SOCKET_FD_BRIDGE` — Booter — When **`1`** / **`true`**, **`ctx.bareOsSyscall('socket')`** allocates a logical bridge fd; **`SOCK_STREAM`** **`bind`/`listen`/`accept`** or **`connect`** use **`ctx.bare.bareTcp`** when merged; **`SOCK_DGRAM`** uses **`ctx.bare.bareDgram`** with passive **`bind`**, optional **`connect`** after **`bind`**, **`recv`/`recvfrom`/`recvmsg`**, and **`send`/`sendmsg`** (when **`udp_bound`** without default peer, pass **`port`** and **`host`/`address`** in syscall args). Non-empty ancillary on **`sendmsg`** → **`ENOTSUP`** (**`socketMsgSurface` schema 3**). **`poll`/`select`** readiness includes **`udp_bound`** fds. See [syscall-socket-contract.md](syscall-socket-contract.md).
|
||||
- `BARE_OS_POSIX_SOCKET_FD_BRIDGE` — Booter — When **`1`** / **`true`**, **`ctx.bareOsSyscall('socket')`** allocates a logical bridge fd; **`SOCK_STREAM`** **`bind`/`listen`/`accept`** or **`connect`** use **`ctx.bare.bareTcp`** when merged; **`SOCK_DGRAM`** uses **`ctx.bare.bareDgram`** with passive **`bind`**, optional **`connect`** after **`bind`**, **`recv`/`recvfrom`/`recvmsg`**, and **`send`/`sendmsg`** (when **`udp_bound`** without default peer, pass **`port`** and **`host`/`address`** in syscall args). Binary ancillary on **`sendmsg`** → **`ENOTSUP`**; with **`BARE_OS_POSIX_SOCKET_SCM_RIGHTS`**, JSON **`cmsgs`** with **`{ fds: number[] }`** duplicates logical fds (**`socketMsgSurface` schema 4**). **`poll`/`select`** readiness includes **`udp_bound`** fds. See [syscall-socket-contract.md](syscall-socket-contract.md).
|
||||
- `BARE_OS_POSIX_SOCKET_SCM_RIGHTS` — Booter — When **`1`** / **`true`**, **`sendmsg`** on the socket FD bridge accepts **`cmsgs`** / **`msgHdr.cmsgs`** entries shaped as **`{ fds: number[] }`** (SCM_RIGHTS-style logical FD list). Each source fd is duplicated into a new integer fd (**`scmRightsLocalDup`** in the syscall result). Caps: **`BARE_OS_POSIX_SOCKET_SCM_RIGHTS_MAX_FDS`** (default **4**, max **16**). Bridge sockets in **`created`**, **`bound`**, or **`listening`** state cannot be duplicated. **`shutdown`** uses reference counts when multiple fds alias the same bridge slot.
|
||||
- `BARE_OS_POSIX_SOCKET_SCM_RIGHTS_MAX_FDS` — Booter — Integer **1–16**; max logical fds per **`sendmsg`** SCM list (default **4**).
|
||||
- `BARE_OS_PROTOMUX_OPERATOR_STATS_JSON` — Booter — Optional JSON merged into **`/proc/bare_os/protomux.json`** under **`protomuxLibrary.hostOperatorStats`** (opaque counters from host Protomux instrumentation).
|
||||
@@ -201,6 +206,7 @@ The list below is one **bullet per variable** in the form **name — component
|
||||
- `BARE_OS_PROC_PROTOMUX_EXTENSIONS_REGISTRY` — Booter / `/proc` — When **`1`** / **`true`**, exposes **`/proc/bare_os/protomux_extensions.json`** and **`ctx.bareOsReadProtomuxExtensionsJson()`** with the operator Protomux alias registry snapshot and logical extension channel hints; default **`exposed:false`**.
|
||||
- `BARE_OS_BARE_SUBPROCESS_BRIDGE` — Booter / kernel-runner — When **`1`** / **`true`**, enables the documented host **`bare-subprocess`** bridge path for long-running children.
|
||||
- `BARE_OS_BARE_SUBPROCESS_TIMEOUT_MS` — Booter / kernel-runner — When set with **`BARE_OS_BARE_SUBPROCESS_BRIDGE`**, supplies a default **`runBin`** timeout when the caller omits one.
|
||||
- `BARE_OS_CTX_BARE_SUBPROCESS_SPAWN` — Booter — When **`1`** / **`true`**, **`ctx.bareOsTrySpawnHostSubprocess`** tries **`ctx.bare.bareSubprocess.spawn`** first (merged drive catalog) before dynamic **`bare-subprocess`** import. Surfaced under **`ctx.bareOsRuntimeCaps.features.ctxBareSubprocessSpawn`**.
|
||||
- `BARE_OS_DOTGLOB` — Shell — When **`1`**, globbing includes names starting with **`.`** (except **`.bareos_empty`**).
|
||||
- `BARE_OS_SHELL_BRACE_EXPANSION` — Shell — When **`1`**, unquoted **`{a,b}`** brace expansion runs before globbing.
|
||||
- `BARE_OS_GREP_FILTER_MAX` — **`grep -r`** — Max **`--include` / `--exclude` / `--exclude-dir`** glob patterns (default **32**).
|
||||
|
||||
@@ -4,7 +4,7 @@ Former **DOCUMENTATION.md** §10. [Reference index →](README.md)
|
||||
|
||||
## POSIX profile
|
||||
|
||||
**`bare-os-protocol/lib/bare-os-posix-profile.js`** defines **`BARE_OS_POSIX_PROFILE_VERSION`** (**`1.0.12`**), **`BARE_OS_POSIX_PROFILE_ID`**, and **`BARE_OS_POSIX_PROFILE_REFERENCE`** (Open Group Issue 7 index). Re-exported from the package root. Booter mirrors these values under **`/proc/bare_os_features`** and **`/proc/bare_os/syscalls.json`**.
|
||||
**`bare-os-protocol/lib/bare-os-posix-profile.js`** defines **`BARE_OS_POSIX_PROFILE_VERSION`** (**`1.0.13`**), **`BARE_OS_POSIX_PROFILE_ID`**, and **`BARE_OS_POSIX_PROFILE_REFERENCE`** (Open Group Issue 7 index). Re-exported from the package root. Booter mirrors these values under **`/proc/bare_os_features`** and **`/proc/bare_os/syscalls.json`**.
|
||||
|
||||
## 10. Package: `bare-os-protocol`
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"profileId": "bare-os-posix-like",
|
||||
"note": "Machine-readable summary; normative detail remains in handbook ch.9 and environment POSIX appendix. Profile 1.0.12 / syscalls schema 8: guest session read/write/chmod/unlink deny on /.bare/account and /.bare/vault/** (override BARE_OS_GUEST_BARE_READ_ALL); optional BARE_OS_PERSONAL_ACCT_PREFIX personal-drive layout; BARE_OS_PERSONAL_ROOT_MIGRATE + /.bare-os/migration/legacy-root-v1.json for safe legacy-root lift; BARE_OS_GUEST_SCRUB; vfs.replication_warm_full_invalidate metric; ctx.bareOsSyscall nanosleep-shaped delay; bridge getsockopt/setsockopt partial SO_KEEPALIVE/TCP_NODELAY when BARE_OS_POSIX_SOCKET_FD_BRIDGE; cooperative fcntl locks (optional BARE_OS_POSIX_FCNTL_BLOCKING_WAIT), SOCK_DGRAM passive bind via bareDgram; sendmsg/recvmsg partial; socketMsgSurface schema 3. BARE_OS_VFS_WARM_CACHE_INVALIDATE_ON_REPLICATION full warm flush on core-length growth. Hyperswarm caps via BARE_OS_SWARM_MAX_* env. disk.os replication_operator_sketch schema 4. Dynamic sysconf via ctx.bareOsGetconfSysconf.",
|
||||
"note": "Machine-readable summary; normative detail remains in handbook ch.9 and environment POSIX appendix. Profile 1.0.13 / syscalls schema 8: guest session read/write/chmod/unlink deny on /.bare/account and /.bare/vault/** (override BARE_OS_GUEST_BARE_READ_ALL); optional BARE_OS_PERSONAL_ACCT_PREFIX personal-drive layout; BARE_OS_PERSONAL_ROOT_MIGRATE + /.bare-os/migration/legacy-root-v1.json for safe legacy-root lift; BARE_OS_GUEST_SCRUB; vfs.replication_warm_full_invalidate metric; ctx.bareOsSyscall nanosleep-shaped delay; bridge getsockopt/setsockopt partial SO_KEEPALIVE/TCP_NODELAY when BARE_OS_POSIX_SOCKET_FD_BRIDGE; cooperative fcntl locks (optional BARE_OS_POSIX_FCNTL_BLOCKING_WAIT), SOCK_DGRAM passive bind via bareDgram; sendmsg/recvmsg partial; socketMsgSurface schema 4 (logicalScmRightsOnSend when BARE_OS_POSIX_SOCKET_SCM_RIGHTS); ctx.bareOsSyscall select mirrors pollClock when timeoutMs>0. BARE_OS_VFS_WARM_CACHE_INVALIDATE_ON_REPLICATION full warm flush on core-length growth; warm invalidation reasons containing replication increment vfs.warm_read_cache_invalidate_replication. Peer admission schema 2: BARE_OS_PEER_DENYLIST_HEX, BARE_OS_PEER_REQUIRE_CAPS_JSON, optional BARE_OS_PEER_ADMISSION_AUDIT_NDJSON (+ rate ms). Tier-1 /bin/test: -u -g -k when st.mode exposes setuid/setgid/sticky. Hyperswarm caps via BARE_OS_SWARM_MAX_* env. disk.os replication_operator_sketch schema 4. Dynamic sysconf via ctx.bareOsGetconfSysconf.",
|
||||
"utilities": {
|
||||
"tier1_bin": "high",
|
||||
"sed_awk_grep": "issue7_inspired_js_engines",
|
||||
@@ -11,7 +11,7 @@
|
||||
"grammar": "line_at_a_time_subset",
|
||||
"posix_mode_grouped_lists": "BARE_OS_SHELL_POSIX_MODE=1 enables ( compound-list ) without forked subshell",
|
||||
"pipes": "simulated_capture",
|
||||
"job_control": "logical_jobs_only (jobControlModel logical_no_fork; no fork(2)); kill / bareOsSendSignal negative target = pgid on shellBackgroundJobs; wait skips completed jobs by default",
|
||||
"job_control": "logical_jobs_only (jobControlModel logical_no_fork; no fork(2)); fg sets foregroundPgid; suspend-job + bg/fg cooperative yield between background statements; kill / bareOsSendSignal negative target = pgid on shellBackgroundJobs; wait skips completed jobs by default",
|
||||
"loop_control": "BARE_OS_SHELL_LOOP_CONTROL for break continue in while for",
|
||||
"errexit": "BARE_OS_SHELL_ERREXIT / set -e or set -o errexit (+e / +o errexit to clear) stops further semicolon lists inside if-then/else and loop bodies; top-level ;-separated statements; condition lists in if/while suppress errexit between predicates"
|
||||
},
|
||||
@@ -28,6 +28,6 @@
|
||||
"syscalls_json_schema": 8,
|
||||
"process_table_schema": 7,
|
||||
"paths": ["/proc/bare_os/syscalls.json", "/proc/bare_os/process_table.json"],
|
||||
"posix_xsh_surface": "open,close,read,write,readv,writev,getsockopt,setsockopt,lseek,nanosleep,pipe,dup,dup2,fcntl cooperative F_GETLK/F_SETLK/F_SETLKW + F_GETFL/F_SETFL,poll,select,umask,socket,bind,listen,accept,connect,send,recv,recvfrom,sendmsg,recvmsg,shutdown in syscalls.json posixXsh.namesCsv; ctx.bareOsSyscall nanosleep; bridge getsockopt/setsockopt partial SO_KEEPALIVE/TCP_NODELAY; default socket ENOSYS-shaped without bridge; BARE_OS_POSIX_SOCKET_FD_BRIDGE SOCK_STREAM connect via bareTcp; passive SOCK_STREAM bind+listen+accept via bareTcp.Server; stream fds use send/recv with bounded tcpRecvQueue (connect and accept paths); TCP half-close: shutdown how 0/1 (SHUT_RD/SHUT_WR), default how 2 full close; recv EOF after peer FIN; send EPIPE after local SHUT_WR; poll readable on queued TCP data, peer FIN/EOF, or socket error; poll writable when SHUT_WR not set; SOCK_DGRAM passive bind via bareDgram.Socket.bind, connect optional after bind, send with explicit port+host when udp_bound without default peer; connect+send path unchanged; BARE_OS_POSIX_DGRAM_RECVQ_MAX / BARE_OS_POSIX_DGRAM_RECV_BLOCK_MS_MAX; BARE_OS_POSIX_ACCEPT_QUEUE_MAX; poll/select mark UDP bridge fds (connected or udp_bound) readable when dgram queue non-empty; listening fds when accept queue non-empty; ctx.bareOsSyscall readv/writev on POSIX_FD_SIM pipes; ctx.bareOsPosixPoll; socketMsgSurface schema 3 + optional BARE_OS_POSIX_SOCKET_SCM_RIGHTS logical fd dup"
|
||||
"posix_xsh_surface": "open,close,read,write,readv,writev,getsockopt,setsockopt,lseek,nanosleep,pipe,dup,dup2,fcntl cooperative F_GETLK/F_SETLK/F_SETLKW + F_GETFL/F_SETFL,poll,select,umask,socket,bind,listen,accept,connect,send,recv,recvfrom,sendmsg,recvmsg,shutdown in syscalls.json posixXsh.namesCsv; ctx.bareOsSyscall nanosleep; bridge getsockopt/setsockopt partial SO_KEEPALIVE/TCP_NODELAY; default socket ENOSYS-shaped without bridge; BARE_OS_POSIX_SOCKET_FD_BRIDGE SOCK_STREAM connect via bareTcp; passive SOCK_STREAM bind+listen+accept via bareTcp.Server; stream fds use send/recv with bounded tcpRecvQueue (connect and accept paths); TCP half-close: shutdown how 0/1 (SHUT_RD/SHUT_WR), default how 2 full close; recv EOF after peer FIN; send EPIPE after local SHUT_WR; poll readable on queued TCP data, peer FIN/EOF, or socket error; poll writable when SHUT_WR not set; SOCK_DGRAM passive bind via bareDgram.Socket.bind, connect optional after bind, send with explicit port+host when udp_bound without default peer; connect+send path unchanged; BARE_OS_POSIX_DGRAM_RECVQ_MAX / BARE_OS_POSIX_DGRAM_RECV_BLOCK_MS_MAX; BARE_OS_POSIX_ACCEPT_QUEUE_MAX; poll/select mark UDP bridge fds (connected or udp_bound) readable when dgram queue non-empty; listening fds when accept queue non-empty; ctx.bareOsSyscall readv/writev on POSIX_FD_SIM pipes; ctx.bareOsPosixPoll; socketMsgSurface schema 4 + optional BARE_OS_POSIX_SOCKET_SCM_RIGHTS logical fd dup"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,14 +10,14 @@ Normative narrative: [`docs/architecture/POSIX_DECLARED_PROFILE.md`](../architec
|
||||
| --- | --- | --- |
|
||||
| Profile | profileId | bare-os-posix-like |
|
||||
| Profile | schema | 1 |
|
||||
| Profile | note | Machine-readable summary; normative detail remains in handbook ch.9 and environment POSIX appendix. Profile 1.0.12 / syscalls schema 8: guest session read/write/chmod/unlink deny on /.bare/account and /.bare/vault/** (override BARE_OS_GUEST_BARE_READ_ALL); optional BARE_OS_PERSONAL_ACCT_PREFIX personal-drive layout; BARE_OS_PERSONAL_ROOT_MIGRATE + /.bare-os/migration/legacy-root-v1.json for safe legacy-root lift; BARE_OS_GUEST_SCRUB; vfs.replication_warm_full_invalidate metric; ctx.bareOsSyscall nanosleep-shaped delay; bridge getsockopt/setsockopt partial SO_KEEPALIVE/TCP_NODELAY when BARE_OS_POSIX_SOCKET_FD_BRIDGE; cooperative fcntl locks (optional BARE_OS_POSIX_FCNTL_BLOCKING_WAIT), SOCK_DGRAM passive bind via bareDgram; sendmsg/recvmsg partial; socketMsgSurface schema 3. BARE_OS_VFS_WARM_CACHE_INVALIDATE_ON_REPLICATION full warm flush on core-length growth. Hyperswarm caps via BARE_OS_SWARM_MAX_* env. disk.os replication_operator_sketch schema 4. Dynamic sysconf via ctx.bareOsGetconfSysconf. |
|
||||
| Profile | note | Machine-readable summary; normative detail remains in handbook ch.9 and environment POSIX appendix. Profile 1.0.13 / syscalls schema 8: guest session read/write/chmod/unlink deny on /.bare/account and /.bare/vault/** (override BARE_OS_GUEST_BARE_READ_ALL); optional BARE_OS_PERSONAL_ACCT_PREFIX personal-drive layout; BARE_OS_PERSONAL_ROOT_MIGRATE + /.bare-os/migration/legacy-root-v1.json for safe legacy-root lift; BARE_OS_GUEST_SCRUB; vfs.replication_warm_full_invalidate metric; ctx.bareOsSyscall nanosleep-shaped delay; bridge getsockopt/setsockopt partial SO_KEEPALIVE/TCP_NODELAY when BARE_OS_POSIX_SOCKET_FD_BRIDGE; cooperative fcntl locks (optional BARE_OS_POSIX_FCNTL_BLOCKING_WAIT), SOCK_DGRAM passive bind via bareDgram; sendmsg/recvmsg partial; socketMsgSurface schema 4 (logicalScmRightsOnSend when BARE_OS_POSIX_SOCKET_SCM_RIGHTS); ctx.bareOsSyscall select mirrors pollClock when timeoutMs>0. BARE_OS_VFS_WARM_CACHE_INVALIDATE_ON_REPLICATION full warm flush on core-length growth; warm invalidation reasons containing replication increment vfs.warm_read_cache_invalidate_replication. Peer admission schema 2: BARE_OS_PEER_DENYLIST_HEX, BARE_OS_PEER_REQUIRE_CAPS_JSON, optional BARE_OS_PEER_ADMISSION_AUDIT_NDJSON (+ rate ms). Tier-1 /bin/test: -u -g -k when st.mode exposes setuid/setgid/sticky. Hyperswarm caps via BARE_OS_SWARM_MAX_* env. disk.os replication_operator_sketch schema 4. Dynamic sysconf via ctx.bareOsGetconfSysconf. |
|
||||
| Utilities | tier1_bin | high |
|
||||
| Utilities | sed_awk_grep | issue7_inspired_js_engines |
|
||||
| Utilities | coreutils | see packages/bare-os-coreutils/src |
|
||||
| Shell | grammar | line_at_a_time_subset |
|
||||
| Shell | posix_mode_grouped_lists | BARE_OS_SHELL_POSIX_MODE=1 enables ( compound-list ) without forked subshell |
|
||||
| Shell | pipes | simulated_capture |
|
||||
| Shell | job_control | logical_jobs_only (jobControlModel logical_no_fork; no fork(2)); kill / bareOsSendSignal negative target = pgid on shellBackgroundJobs; wait skips completed jobs by default |
|
||||
| Shell | job_control | logical_jobs_only (jobControlModel logical_no_fork; no fork(2)); fg sets foregroundPgid; suspend-job + bg/fg cooperative yield between background statements; kill / bareOsSendSignal negative target = pgid on shellBackgroundJobs; wait skips completed jobs by default |
|
||||
| Shell | loop_control | BARE_OS_SHELL_LOOP_CONTROL for break continue in while for |
|
||||
| Shell | errexit | BARE_OS_SHELL_ERREXIT / set -e or set -o errexit (+e / +o errexit to clear) stops further semicolon lists inside if-then/else and loop bodies; top-level ;-separated statements; condition lists in if/while suppress errexit between predicates |
|
||||
| VFS | guest_sensitive_bare | guest session: EACCES/ENOENT on /.bare/account, /.bare/vault/**, vault-rotation NDJSON; readdir /.bare hides account and vault names; BARE_OS_GUEST_BARE_READ_ALL=1 lifts deny |
|
||||
@@ -30,4 +30,4 @@ Normative narrative: [`docs/architecture/POSIX_DECLARED_PROFILE.md`](../architec
|
||||
| synthetic /proc | syscalls_json_schema | 8 |
|
||||
| synthetic /proc | process_table_schema | 7 |
|
||||
| synthetic /proc | paths | /proc/bare_os/syscalls.json, /proc/bare_os/process_table.json |
|
||||
| synthetic /proc | posix_xsh_surface | open,close,read,write,readv,writev,getsockopt,setsockopt,lseek,nanosleep,pipe,dup,dup2,fcntl cooperative F_GETLK/F_SETLK/F_SETLKW + F_GETFL/F_SETFL,poll,select,umask,socket,bind,listen,accept,connect,send,recv,recvfrom,sendmsg,recvmsg,shutdown in syscalls.json posixXsh.namesCsv; ctx.bareOsSyscall nanosleep; bridge getsockopt/setsockopt partial SO_KEEPALIVE/TCP_NODELAY; default socket ENOSYS-shaped without bridge; BARE_OS_POSIX_SOCKET_FD_BRIDGE SOCK_STREAM connect via bareTcp; passive SOCK_STREAM bind+listen+accept via bareTcp.Server; stream fds use send/recv with bounded tcpRecvQueue (connect and accept paths); TCP half-close: shutdown how 0/1 (SHUT_RD/SHUT_WR), default how 2 full close; recv EOF after peer FIN; send EPIPE after local SHUT_WR; poll readable on queued TCP data, peer FIN/EOF, or socket error; poll writable when SHUT_WR not set; SOCK_DGRAM passive bind via bareDgram.Socket.bind, connect optional after bind, send with explicit port+host when udp_bound without default peer; connect+send path unchanged; BARE_OS_POSIX_DGRAM_RECVQ_MAX / BARE_OS_POSIX_DGRAM_RECV_BLOCK_MS_MAX; BARE_OS_POSIX_ACCEPT_QUEUE_MAX; poll/select mark UDP bridge fds (connected or udp_bound) readable when dgram queue non-empty; listening fds when accept queue non-empty; ctx.bareOsSyscall readv/writev on POSIX_FD_SIM pipes; ctx.bareOsPosixPoll; socketMsgSurface schema 3 + optional BARE_OS_POSIX_SOCKET_SCM_RIGHTS logical fd dup |
|
||||
| synthetic /proc | posix_xsh_surface | open,close,read,write,readv,writev,getsockopt,setsockopt,lseek,nanosleep,pipe,dup,dup2,fcntl cooperative F_GETLK/F_SETLK/F_SETLKW + F_GETFL/F_SETFL,poll,select,umask,socket,bind,listen,accept,connect,send,recv,recvfrom,sendmsg,recvmsg,shutdown in syscalls.json posixXsh.namesCsv; ctx.bareOsSyscall nanosleep; bridge getsockopt/setsockopt partial SO_KEEPALIVE/TCP_NODELAY; default socket ENOSYS-shaped without bridge; BARE_OS_POSIX_SOCKET_FD_BRIDGE SOCK_STREAM connect via bareTcp; passive SOCK_STREAM bind+listen+accept via bareTcp.Server; stream fds use send/recv with bounded tcpRecvQueue (connect and accept paths); TCP half-close: shutdown how 0/1 (SHUT_RD/SHUT_WR), default how 2 full close; recv EOF after peer FIN; send EPIPE after local SHUT_WR; poll readable on queued TCP data, peer FIN/EOF, or socket error; poll writable when SHUT_WR not set; SOCK_DGRAM passive bind via bareDgram.Socket.bind, connect optional after bind, send with explicit port+host when udp_bound without default peer; connect+send path unchanged; BARE_OS_POSIX_DGRAM_RECVQ_MAX / BARE_OS_POSIX_DGRAM_RECV_BLOCK_MS_MAX; BARE_OS_POSIX_ACCEPT_QUEUE_MAX; poll/select mark UDP bridge fds (connected or udp_bound) readable when dgram queue non-empty; listening fds when accept queue non-empty; ctx.bareOsSyscall readv/writev on POSIX_FD_SIM pipes; ctx.bareOsPosixPoll; socketMsgSurface schema 4 + optional BARE_OS_POSIX_SOCKET_SCM_RIGHTS logical fd dup |
|
||||
|
||||
@@ -22,13 +22,13 @@ Enable with **`BARE_OS_POSIX_SOCKET_FD_BRIDGE=1`**. Requires **`ctx.bare`** to e
|
||||
- **`BARE_OS_POSIX_DGRAM_RECV_BLOCK_MS_MAX`** — blocking recv budget (also used for accept wait).
|
||||
- **`BARE_OS_POSIX_ACCEPT_QUEUE_MAX`** — pending TCP accepts.
|
||||
|
||||
## `socketMsgSurface` (schema 3)
|
||||
## `socketMsgSurface` (schema 4)
|
||||
|
||||
**Operational profile:** without **`BARE_OS_POSIX_SOCKET_FD_BRIDGE`**, socket syscalls remain ENOSYS-shaped. With the bridge, ancillary handling follows the table below.
|
||||
|
||||
- **Ancillary control** on **`sendmsg`**: non-empty binary **`control`** / **`controllen`**, or malformed **`cmsgs`**, → **`ENOTSUP`** + **`ancillaryReject`**.
|
||||
- **`recvmsg`**: **`controllen` 0**; **`msgHdr.name`** filled from UDP **`rinfo`** when present.
|
||||
- **`BARE_OS_POSIX_SOCKET_SCM_RIGHTS=1`**: **`cmsgs`** and **`msgHdr.cmsgs`** may contain only objects **`{ fds: number[] }`** (logical SCM_RIGHTS). Each fd is duplicated; the syscall result includes **`scmRightsLocalDup: [{ from, to }]`**. Cap via **`BARE_OS_POSIX_SOCKET_SCM_RIGHTS_MAX_FDS`** (default **4**, max **16**). Idle / listen / bound bridge sockets reject dup. **`shutdown`** refcount-per-alias destroys the underlying slot when the last fd closes. With this env set, the stock bridge implements **logical** fd duplication on **`sendmsg`** (same guest address space — not host **`SCM_RIGHTS`** over a real kernel boundary); **`recvmsg`** continues to return **`controllen: 0`** because ancillary data is not queued on datagrams. Without **`BARE_OS_POSIX_SOCKET_SCM_RIGHTS`**, any non-empty ancillary payload remains **`ENOTSUP`** as documented in **`ancillaryControl`**. Parser unit tests: **`packages/bare-os-booter/test.socket-scm-rights.js`**.
|
||||
- **`logicalScmRightsOnSend`** (schema **4**): when **`BARE_OS_POSIX_SOCKET_SCM_RIGHTS=1`**, **`cmsgs`** and **`msgHdr.cmsgs`** may contain only objects **`{ fds: number[] }`**. Each fd is duplicated; the syscall result includes **`scmRightsLocalDup: [{ from, to }]`**. Cap via **`BARE_OS_POSIX_SOCKET_SCM_RIGHTS_MAX_FDS`** (default **4**, max **16**). Idle / listen / bound-only bridge sockets reject dup. **`shutdown`** refcount-per-alias destroys the underlying slot when the last fd closes. This is **logical** duplication in the guest FD table (not host **`SCM_RIGHTS`**); **`recvmsg`** does not surface ancillary data. Without the env flag, non-empty **`cmsgs`** remain **`ENOTSUP`**. Parser unit tests: **`packages/bare-os-booter/test.socket-scm-rights.js`**.
|
||||
|
||||
## TCP **`shutdown`** / half-close
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://bare-os.dev/schemas/kernel-extensions.registry.schema.json",
|
||||
"title": "Bare OS /proc/bare_os/extensions.json (schema v2–v8)",
|
||||
"title": "Bare OS /proc/bare_os/extensions.json (schema v2–v9)",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "object",
|
||||
@@ -117,6 +117,52 @@
|
||||
},
|
||||
"atMs": { "type": "integer", "minimum": 0 }
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"required": ["schema", "entries"],
|
||||
"additionalProperties": true,
|
||||
"properties": {
|
||||
"schema": { "type": "integer", "const": 9 },
|
||||
"featureBitsDoc": { "type": "integer", "minimum": 0 },
|
||||
"resolverModule": {
|
||||
"type": "string",
|
||||
"description": "Shared topological resolver module id (schema 9)"
|
||||
},
|
||||
"ed25519PolicyBridge": { "type": "object", "additionalProperties": true },
|
||||
"entries": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"required": ["dropin", "script", "atMs"],
|
||||
"additionalProperties": true,
|
||||
"properties": {
|
||||
"dropin": { "type": "string" },
|
||||
"script": { "type": "string" },
|
||||
"semver": { "type": "string" },
|
||||
"capabilities": {
|
||||
"type": "array",
|
||||
"items": { "type": "string" },
|
||||
"maxItems": 32
|
||||
},
|
||||
"id": { "type": "string" },
|
||||
"dependsOn": {
|
||||
"type": "array",
|
||||
"items": { "type": "string" }
|
||||
},
|
||||
"signaturePointer": { "type": "string", "maxLength": 512 },
|
||||
"loadMs": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 3600000,
|
||||
"description": "Wall ms for extension script execution (schema 9)"
|
||||
},
|
||||
"atMs": { "type": "integer", "minimum": 0 }
|
||||
}
|
||||
}
|
||||
},
|
||||
"atMs": { "type": "integer", "minimum": 0 }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
# Vault and identity — threat model (operator)
|
||||
|
||||
This note summarizes **what the guest runtime tries to protect** and **what it does not**. It complements [developer-guide — Security and trust](../../developer-guide/09-security-and-trust.md) and handbook [Chapter 5 — Identity](../../handbook/05-identity-vault-and-hdms.md).
|
||||
|
||||
## Assets
|
||||
|
||||
- **Account blob** (`/.bare/account`, v2): Ed25519 keypair; secret sealed with **PBKDF2-SHA256** and **ChaCha20-Poly1305** via **`bare-crypto`** (see **`BARE_OS_ACCOUNT_CRYPTO_PROFILE_V2`** in code and **`/proc/bare_os/security_posture.json`**).
|
||||
- **Vault entries**: Application data sealed with a key derived from the signing secret (same AEAD stack); paths are hashed for stable blob names.
|
||||
|
||||
## Trust assumptions
|
||||
|
||||
- The **host process** (Pear/Node) can read guest memory; ciphertext on the personal Hyperdrive protects against **offline** replication sniffing, not against a compromised host.
|
||||
- **Passphrase quality** and **backup policy** are out of band; weak passphrases defeat PBKDF2-protected blobs.
|
||||
- **Peers** replicate Hyperdrive blocks; anyone with read access to the drive ciphertext needs the passphrase (or unlocked session) for account material.
|
||||
|
||||
## Non-goals
|
||||
|
||||
- No hardware-backed key storage unless the host wires **Pear secure enclave** or similar; **`BARE_OS_PEAR_SECURE_ENCLAVE_JSON`** is a **non-secret hint** only.
|
||||
- No multi-user discretionary access: the session is a **single logical UID/GID** from the booter’s perspective.
|
||||
|
||||
## Related `/proc`
|
||||
|
||||
- **`/proc/bare_os/security_posture.json`** — **`vaultCryptoPrimitives`** and **`bareCryptoReportedVersion`** (from **`BARE_OS_BARE_CRYPTO_VERSION`**) document the expected algorithms without exposing secrets.
|
||||
@@ -14,6 +14,23 @@ This preface states the thesis in plain language, places the project next to fam
|
||||
|
||||
Bare OS is a **Unix-flavored environment** whose **system root** lives on a **Hyperdrive** keyed from a tiny **512-byte MBR** you read from peers. A **seeder** application publishes that drive; a **booter** application finds peers on a fixed **Hyperswarm** topic, replicates the drive, mounts a **separate personal Hyperdrive** for mutable state, and runs a JavaScript **kernel** (`/boot/init.js`) and a **Tier-1 `/bin`** built from small **`AsyncFunction`** scripts. Execution is **one host process** (Pear or Node) simulating POSIX paths, a line shell, and synthetic `/proc`-style views—not a hardware kernel.
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph p2p[P2P]
|
||||
HS[Hyperswarm topic]
|
||||
PM[Protomux]
|
||||
MB[MBR + Hyperdrive keys]
|
||||
end
|
||||
subgraph guest[Guest surface]
|
||||
SH[Shell job control fg/bg]
|
||||
SK[Socket bridge + optional SCM_RIGHTS]
|
||||
RP["/proc replication_operator_sketch"]
|
||||
end
|
||||
MB --> guest
|
||||
HS --> guest
|
||||
PM --> guest
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## On this page
|
||||
|
||||
@@ -115,7 +115,7 @@ Once **initd** has started, the stock booter assigns **`disk.os`** on **`SwarmDi
|
||||
- **`bare_os.service_names`** → JSON array of **initd** unit names
|
||||
- **`bare_os.echo`** → JSON `{"args":[…]}` (debug)
|
||||
- **`bare_os.disk_os_hints`** → JSON **schema 2**: **`protocolPackageVersion`**, **`protomuxChannelSchemaVersion`**, **`booterPackageVersion`**, plus **`mirrorDriveHintV2`**, **`httpDhtProxyHint`**, **`auxiliaryDriveCount`** — advisory for operators only (parity with seed **`kernel_info`** / **`capabilities`** semver fields).
|
||||
- **`bare_os.replication_operator_sketch`** → JSON **schema 3**: schema **2** fields plus optional **`blindTopologySketchV3`** (**`BARE_OS_BLIND_PEER_TOPOLOGY_V3_JSON`**) and **`hyperblobsDedupSketch`** (**`BARE_OS_HYPERBLOBS_STATS_JSON`**) — non-secret operator JSON only.
|
||||
- **`bare_os.replication_operator_sketch`** → JSON **schema 4** (superset of **3**): includes **`peerPrioritySketch`** when **`BARE_OS_REPLICATION_PEER_PRIORITY_JSON`** is set (P2P-local peer ordering hints), plus optional **`blindTopologySketchV3`** (**`BARE_OS_BLIND_PEER_TOPOLOGY_V3_JSON`**) and **`hyperblobsDedupSketch`** (**`BARE_OS_HYPERBLOBS_STATS_JSON`**) — non-secret operator JSON only.
|
||||
- **`bare_os.replication_operator_intent`** — cap-gated (**`BARE_OS_DISK_OS_OPERATOR_INTENT_RPC=1`**): accepts a JSON object string, appends one **`disk_os.replication_operator_intent`** row via **`ctx.bareOsAuditLogAppendBatch`** when the booter wires **`auditBatch`**; **`EPERM`** when disabled.
|
||||
- Unknown pairs throw **`BareOsKernelError`** with code **`BARE_OS_EXEC_RPC_UNKNOWN`** (surfaced as RPC error text).
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@ Remaining gaps are tracked in **`packages/bare-os-booter/CLI_PARITY.md`**, [POSI
|
||||
**`execShellLine`** (`lib/shell.js`):
|
||||
|
||||
- Tokenizes words, quotes, escapes, **`$VAR`**, pipelines **`|`**, redirections **`>` / `>>` / `<`**.
|
||||
- Builtins: **`alias`**, **`unalias`**, **`cd`**, **`export`**, **`unset`**, **`readonly`**, **`umask`**, **`:`**, **`command`**, **`type`**, **`login`**, **`logout`**, **`exit`**, **`jobs`**, **`fg`**, **`wait`**, bounded **`if`/`while`/`for`/`case`** — plus external commands via **`runBinCommand`**. Optional **`BARE_OS_SHELL_CMDSUBST`** enables bounded **`$(…)`** in words; optional **`BARE_OS_SHELL_STREAMING`** scales pipeline capture caps. **`readonly`** blocks **`export`** and assignment writes to the same name; **`command -v` / `-V`** and **`type`** use **`resolveBinInPath`** for **`PATH`** lookup.
|
||||
- Builtins: **`alias`**, **`unalias`**, **`cd`**, **`export`**, **`unset`**, **`readonly`**, **`umask`**, **`:`**, **`command`**, **`type`**, **`login`**, **`logout`**, **`exit`**, **`jobs`**, **`fg`**, **`bg`**, **`suspend-job`**, **`wait`**, bounded **`if`/`while`/`for`/`case`** — plus external commands via **`runBinCommand`**. Optional **`BARE_OS_SHELL_CMDSUBST`** enables bounded **`$(…)`** in words; optional **`BARE_OS_SHELL_STREAMING`** scales pipeline capture caps. **`readonly`** blocks **`export`** and assignment writes to the same name; **`command -v` / `-V`** and **`type`** use **`resolveBinInPath`** for **`PATH`** lookup.
|
||||
- First-word **aliases** (defaults like **`ll` → `ls -la`**, **`nano` → `edit`**) expand after **`$VAR`** substitution; **`alias`** / **`unalias`** match the restricted **`~/.barerc`** syntax (not full POSIX **`sh`**).
|
||||
- Pipes capture **`console.log`** into the next stage or a string sink.
|
||||
|
||||
@@ -206,7 +206,7 @@ Install/list/remove user crontab with **`/bin/crontab`** (see [Chapter 6](06-ker
|
||||
|
||||
## Shell session, controlling TTY sketch, and job-control gaps
|
||||
|
||||
The interactive shell keeps **`ctx.shellSessionState`**: **`sid`** (session id), **`nextPgid`** (for **`&` background jobs**), **`foregroundPgid`** (reset to **`sid`** before each foreground line — session-leader model), and **`controllingTty`** (**`/dev/console`** or **`ipc:<session-fifo>`** when **`BARE_OS_SESSION_FIFO`** / **`BARE_OS_IPC_SESSION_FIFO`** is set). Background jobs record **`sid`** / **`pgid`** in **`ctx.shellBackgroundJobs`** for **`jobs`** output. This is **not** full POSIX job control: there is no **`tcsetpgrp`**, no **`SIGTSTP`/`SIGCONT`** pipeline to the host TTY, and **`fg`/`bg`** are not implemented. Host **SIGINT** may arrive as **`bare-os:host-sigint`** (via optional **`bare-signals`** or **`process.on('SIGINT')`**) for cooperative cancellation; **`ctx.bareOsSendSignal`** also records **PIPE** / **CHLD** / **USR1** / **USR2** on synthetic PIDs without ending the session.
|
||||
The interactive shell keeps **`ctx.shellSessionState`**: **`sid`** (session id), **`nextPgid`** (for **`&` background jobs**), **`foregroundPgid`** (set to a job’s **`pgid`** while **`fg`** awaits that job, otherwise reset toward **`sid`** after each foreground line), and **`controllingTty`** (**`/dev/console`** or **`ipc:<session-fifo>`** when **`BARE_OS_SESSION_FIFO`** / **`BARE_OS_IPC_SESSION_FIFO`** is set). Background jobs record **`sid`** / **`pgid`** in **`ctx.shellBackgroundJobs`** for **`jobs`** output. **Cooperative logical job control:** **`suspend-job`** sets **`stopped`** and the background runner yields between statements until **`fg`** or **`bg`** clears it; there is still no **`tcsetpgrp`** and no host **`SIGTSTP`/`SIGCONT`**. Host **SIGINT** may arrive as **`bare-os:host-sigint`** (via optional **`bare-signals`** or **`process.on('SIGINT')`**) for cooperative cancellation; **`ctx.bareOsSendSignal`** also records **PIPE** / **CHLD** / **USR1** / **USR2** on synthetic PIDs without ending the session.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ If you come from Linux or macOS, Bare OS **feels** like a small Unix: **`ls`**,
|
||||
|
||||
**Declared profile (single spec):** [POSIX_DECLARED_PROFILE.md](../docs/architecture/POSIX_DECLARED_PROFILE.md) — contract for XCU/XSH-like behavior, proc stand-ins for “syscalls,” and explicit non-goals.
|
||||
|
||||
**Declared profile (constants):** the protocol package publishes **`BARE_OS_POSIX_PROFILE_VERSION`** / **`BARE_OS_POSIX_PROFILE_ID`** (`bare-os-posix-like`), surfaced on **`/proc/bare_os_features`** and in **`/proc/bare_os/syscalls.json`** (schema **8** for that file — **`fdModel`** / **`signalModel`** plus **`opsDetail`** / **`posixXsh`** (schema **2**) / **`socketMsgSurface`** (schema **3**: non-empty ancillary on **`sendmsg`** → **`ENOTSUP`** + **`ancillaryReject`**; **`recvmsg`** **`controllen: 0`**) / **`errnoHints`**, including cooperative **`fcntl`** advisory locks with optional **`F_SETLKW`** blocking wait (**`BARE_OS_POSIX_FCNTL_BLOCKING_WAIT`**) and optional socket-bridge datagram **`bind`/`connect`/`send`/`sendmsg`/`recv`/`recvfrom`/`recvmsg`** (passive UDP **`bind`**, optional **`connect`** on the same fd, **`send`** with explicit **`port`/`host`** when bound without default peer) with bounded queues; **`/proc/bare_os/index.json`** uses schema **8**). **`getconf BARE_OS_POSIX_XSH_OPS`** lists the XSH names; **`getconf BARE_OS_SYSCALL_OPS`** lists ctx op names only. Cold-boot wall time vs **`BARE_OS_BOOT_BUDGET_MS_COLD`** is also written to **`/run/bare-os/boot-perf.json`** when the VFS supports it. **`metrics_live`** includes **`initdReadiness`** (schema **2**) and paths such as **`utilitiesIndexPath`** → **`/etc/bare-os/posix_utilities.json`** when present.
|
||||
**Declared profile (constants):** the protocol package publishes **`BARE_OS_POSIX_PROFILE_VERSION`** / **`BARE_OS_POSIX_PROFILE_ID`** (`bare-os-posix-like`), surfaced on **`/proc/bare_os_features`** and in **`/proc/bare_os/syscalls.json`** (schema **8** for that file — **`fdModel`** / **`signalModel`** plus **`opsDetail`** / **`posixXsh`** (schema **2**) / **`socketMsgSurface`** (schema **4**: binary ancillary **`ENOTSUP`**; optional **`BARE_OS_POSIX_SOCKET_SCM_RIGHTS`** JSON **`cmsgs`** → logical **`scmRightsLocalDup`** on **`sendmsg`**; **`recvmsg`** **`controllen: 0`**) / **`errnoHints`**, including cooperative **`fcntl`** advisory locks with optional **`F_SETLKW`** blocking wait (**`BARE_OS_POSIX_FCNTL_BLOCKING_WAIT`**) and optional socket-bridge datagram **`bind`/`connect`/`send`/`sendmsg`/`recv`/`recvfrom`/`recvmsg`** (passive UDP **`bind`**, optional **`connect`** on the same fd, **`send`** with explicit **`port`/`host`** when bound without default peer) with bounded queues; **`/proc/bare_os/index.json`** uses schema **8**). **`getconf BARE_OS_POSIX_XSH_OPS`** lists the XSH names; **`getconf BARE_OS_SYSCALL_OPS`** lists ctx op names only. Cold-boot wall time vs **`BARE_OS_BOOT_BUDGET_MS_COLD`** is also written to **`/run/bare-os/boot-perf.json`** when the VFS supports it. **`metrics_live`** includes **`initdReadiness`** (schema **2**) and paths such as **`utilitiesIndexPath`** → **`/etc/bare-os/posix_utilities.json`** when present.
|
||||
|
||||
---
|
||||
|
||||
@@ -90,7 +90,7 @@ When HDMS or the booter attaches extra Hyperdrives on **`disk.auxiliaryDrives`**
|
||||
|
||||
### 2.5.1 Read-through cache (`/bin`, optional `/lib/bare`)
|
||||
|
||||
With **`BARE_OS_VFS_BIN_CACHE=1`**, the booter keeps a bounded LRU of system-drive **`readFile`** results for **`/bin/*`**. Add **`BARE_OS_VFS_LIB_BARE_CACHE=1`** to extend the same warm path to **`/lib/bare/*`** (bundle resolution hot paths). Hit, miss, and per-prefix counters appear under **`warmReadCache`** in **`/proc/bare_os/metrics_live.json`** (and the coalesced **`ctx.bareOsReadProcMetricsLive()`** view) when the cache is enabled. After live replication or policy changes, call **`ctx.bareOsInvalidateWarmReadCaches(reason)`** (or rely on **`ctx.bareOsVfsBatchWrite`** when batch **`put`** paths touch **`bin/`** or **`lib/bare/`**) so operators do not read stale bytes from warm entries. **`BARE_OS_VFS_WARM_CACHE_PREFIX_INVALIDATE=1`** evicts **`/bin`**, **`/etc`**, **`/lib`**, **`/usr`**, or personal prefixes when replicated core lengths increase (see **`metrics_live.replicationLive.warmPrefixInvalidate`**). **`BARE_OS_VFS_WARM_CACHE_INVALIDATE_ON_REPLICATION=1`** performs a **full** warm-cache clear via **`ctx.bareOsInvalidateWarmReadCaches('replication:core-length')`** on the same growth signal (surfaced under **`warmFullInvalidateOnReplication`**). Hyperswarm connection budgeting uses **`BARE_OS_SWARM_MAX_PEERS`**, **`BARE_OS_SWARM_MAX_CLIENT_CONNECTIONS`**, **`BARE_OS_SWARM_MAX_SERVER_CONNECTIONS`**, and **`BARE_OS_SWARM_MAX_PARALLEL`** (surfaced on **`/proc/bare_os/swarm`** **`connectionBudget`** and **`disk.os` `replication_operator_sketch`** schema **4**). **`ctx.bareOsSyscall('nanosleep', { tv_sec, tv_nsec })`** and bridge **`getsockopt`/`setsockopt`** (**`SO_KEEPALIVE`**, **`TCP_NODELAY`**) are documented in **`/proc/bare_os/syscalls.json`** (POSIX profile **1.0.11**).
|
||||
With **`BARE_OS_VFS_BIN_CACHE=1`**, the booter keeps a bounded LRU of system-drive **`readFile`** results for **`/bin/*`**. Add **`BARE_OS_VFS_LIB_BARE_CACHE=1`** to extend the same warm path to **`/lib/bare/*`** (bundle resolution hot paths). Hit, miss, and per-prefix counters appear under **`warmReadCache`** in **`/proc/bare_os/metrics_live.json`** (and the coalesced **`ctx.bareOsReadProcMetricsLive()`** view) when the cache is enabled. After live replication or policy changes, call **`ctx.bareOsInvalidateWarmReadCaches(reason)`** (or rely on **`ctx.bareOsVfsBatchWrite`** when batch **`put`** paths touch **`bin/`** or **`lib/bare/`**) so operators do not read stale bytes from warm entries. Reasons whose text includes **`replication`** also increment **`vfs.warm_read_cache_invalidate_replication`** for replication-path auditing. **`BARE_OS_VFS_WARM_CACHE_PREFIX_INVALIDATE=1`** evicts **`/bin`**, **`/etc`**, **`/lib`**, **`/usr`**, or personal prefixes when replicated core lengths increase (see **`metrics_live.replicationLive.warmPrefixInvalidate`**). **`BARE_OS_VFS_WARM_CACHE_INVALIDATE_ON_REPLICATION=1`** performs a **full** warm-cache clear via **`ctx.bareOsInvalidateWarmReadCaches('replication:core-length')`** on the same growth signal (surfaced under **`warmFullInvalidateOnReplication`**). Hyperswarm connection budgeting uses **`BARE_OS_SWARM_MAX_PEERS`**, **`BARE_OS_SWARM_MAX_CLIENT_CONNECTIONS`**, **`BARE_OS_SWARM_MAX_SERVER_CONNECTIONS`**, and **`BARE_OS_SWARM_MAX_PARALLEL`** (surfaced on **`/proc/bare_os/swarm`** **`connectionBudget`** and **`disk.os` `replication_operator_sketch`** schema **4**). **`ctx.bareOsSyscall('nanosleep', { tv_sec, tv_nsec })`** and bridge **`getsockopt`/`setsockopt`** (**`SO_KEEPALIVE`**, **`TCP_NODELAY`**) are documented in **`/proc/bare_os/syscalls.json`** (POSIX profile **1.0.13**).
|
||||
|
||||
### 2.6 Copy and move
|
||||
|
||||
|
||||
@@ -132,6 +132,7 @@ const CONF = {
|
||||
BARE_OS_SPLIT_MAX_FILES: '10000',
|
||||
_POSIX_THREAD_ATTR_STACKSIZE: '65536',
|
||||
_SC_PAGESIZE: '4096',
|
||||
_SC_PAGE_SIZE: '4096',
|
||||
_SC_OPEN_MAX: '256',
|
||||
_SC_STREAM_MAX: '256',
|
||||
_SC_CHILD_MAX: '0',
|
||||
|
||||
@@ -176,6 +176,15 @@ async function evalTest(ctx, args) {
|
||||
return st != null && (testEffPermTriplet(st, euid, egid) & 2) !== 0
|
||||
if (op === '-x')
|
||||
return st != null && (testEffPermTriplet(st, euid, egid) & 1) !== 0
|
||||
if (st != null) {
|
||||
const m =
|
||||
typeof st.mode === 'number'
|
||||
? st.mode
|
||||
: Number.parseInt(String(st.mode || '0'), 8) || 0
|
||||
if (op === '-u') return (m & 0o4000) !== 0
|
||||
if (op === '-g') return (m & 0o2000) !== 0
|
||||
if (op === '-k') return (m & 0o1000) !== 0
|
||||
}
|
||||
if (op === '-s')
|
||||
return st != null && st.type === 'file' && Number(st.size) > 0
|
||||
if (op === '-z') return p.length === 0
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"schema": 2,
|
||||
"profileId": "bare-os-posix-like",
|
||||
"generatedAt": "2026-04-05T16:50:01.982Z",
|
||||
"generatedAt": "2026-04-05T17:14:22.726Z",
|
||||
"note": "Sparse POSIX Issue 7 coverage hints for /bin utilities. Omitted command names are not yet profiled here.",
|
||||
"commandIndex": [
|
||||
{
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"schemaVersion": 8,
|
||||
"ctxApiVersion": "1.48.0",
|
||||
"ctxApiVersion": "1.49.0",
|
||||
"posixProfile": {
|
||||
"id": "bare-os-posix-like",
|
||||
"version": "1.0.11"
|
||||
"version": "1.0.13"
|
||||
},
|
||||
"ops": ["readFile", "writeFile", "socket"],
|
||||
"opsDetail": [
|
||||
@@ -32,7 +32,7 @@
|
||||
"namesCsv": "open,close,read,write,readv,writev,getsockopt,setsockopt,lseek,nanosleep,pipe,dup,dup2,fcntl,poll,select,umask,socket,bind,listen,accept,connect,send,recv,recvfrom,sendmsg,recvmsg,shutdown"
|
||||
},
|
||||
"socketMsgSurface": {
|
||||
"schema": 3,
|
||||
"schema": 4,
|
||||
"ancillaryControl": {
|
||||
"supported": false,
|
||||
"errno": "ENOTSUP",
|
||||
@@ -43,7 +43,11 @@
|
||||
"msgHdr.control",
|
||||
"msgHdr.cmsgs"
|
||||
],
|
||||
"note": "Non-empty ancillary fields on sendmsg rejected; recvmsg controllen 0."
|
||||
"note": "Binary ancillary ENOTSUP; JSON SCM_RIGHTS-shaped cmsgs when BARE_OS_POSIX_SOCKET_SCM_RIGHTS=1."
|
||||
},
|
||||
"logicalScmRightsOnSend": {
|
||||
"env": "BARE_OS_POSIX_SOCKET_SCM_RIGHTS",
|
||||
"syscallResultField": "scmRightsLocalDup"
|
||||
},
|
||||
"sendmsg": { "bridgePartial": true, "defaultErrno": "ENOTSUP" },
|
||||
"recvmsg": { "bridgePartial": true, "defaultErrno": "ENOTSUP" }
|
||||
|
||||
+15
-3
@@ -1873,17 +1873,26 @@ async function bootTimed(ctx, label, fn, stageLog) {
|
||||
ctx.bareOsBootStageTimings = []
|
||||
}
|
||||
let monotonicNs
|
||||
let monotonicDeltaNs
|
||||
try {
|
||||
const bh = await import('bare-hrtime')
|
||||
const bg = bh && (bh.bigint || bh.default?.bigint)
|
||||
if (typeof bg === 'function') monotonicNs = String(bg.call(bh))
|
||||
if (typeof bg === 'function') {
|
||||
const now = bg.call(bh)
|
||||
monotonicNs = String(now)
|
||||
const prev = ctx.bareOsBootHrtimePrev
|
||||
if (typeof prev === 'bigint')
|
||||
monotonicDeltaNs = String(now - prev)
|
||||
ctx.bareOsBootHrtimePrev = now
|
||||
}
|
||||
} catch {
|
||||
/* optional native */
|
||||
}
|
||||
ctx.bareOsBootStageTimings.push({
|
||||
label,
|
||||
wallMs: ms,
|
||||
...(monotonicNs ? { monotonicNs } : {})
|
||||
...(monotonicNs ? { monotonicNs } : {}),
|
||||
...(monotonicDeltaNs ? { monotonicDeltaNs } : {})
|
||||
})
|
||||
}
|
||||
await maybeAppendBootTransactionJournal(ctx, {
|
||||
@@ -3048,7 +3057,9 @@ async function runKernelExtDropins(ctx, opts = {}) {
|
||||
continue
|
||||
}
|
||||
try {
|
||||
const extT0 = Date.now()
|
||||
await run(imgPath)
|
||||
const loadMs = Date.now() - extT0
|
||||
loadedSet.add(imgPath)
|
||||
if (Array.isArray(ranScripts)) ranScripts.push(imgPath)
|
||||
if (typeof ctx.bareOsRegisterKernelExtensionRecord === 'function') {
|
||||
@@ -3057,7 +3068,8 @@ async function runKernelExtDropins(ctx, opts = {}) {
|
||||
script: imgPath,
|
||||
id: ent.extId,
|
||||
dependsOn: ent.dependsOn,
|
||||
signaturePointer: ent.signaturePointer
|
||||
signaturePointer: ent.signaturePointer,
|
||||
loadMs
|
||||
})
|
||||
}
|
||||
} catch (e) {
|
||||
|
||||
+194
-194
@@ -1,12 +1,6 @@
|
||||
{
|
||||
"version": 1,
|
||||
"bundles": [
|
||||
{
|
||||
"path": "/lib/bare/bundles/b4a.js",
|
||||
"keys": [
|
||||
"b4a"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/safetyCatch.js",
|
||||
"keys": [
|
||||
@@ -19,6 +13,12 @@
|
||||
"hypercoreIdEncoding"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/b4a.js",
|
||||
"keys": [
|
||||
"b4a"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/compactEncoding.js",
|
||||
"keys": [
|
||||
@@ -31,12 +31,6 @@
|
||||
"protomux"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePath.js",
|
||||
"keys": [
|
||||
"barePath"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareUrl.js",
|
||||
"keys": [
|
||||
@@ -44,9 +38,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareEvents.js",
|
||||
"path": "/lib/bare/bundles/barePath.js",
|
||||
"keys": [
|
||||
"bareEvents"
|
||||
"barePath"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -55,6 +49,12 @@
|
||||
"bareEncoding"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareEvents.js",
|
||||
"keys": [
|
||||
"bareEvents"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareAbort.js",
|
||||
"keys": [
|
||||
@@ -67,12 +67,6 @@
|
||||
"bareAbortController"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareAnsiEscapes.js",
|
||||
"keys": [
|
||||
"bareAnsiEscapes"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareReadline.js",
|
||||
"keys": [
|
||||
@@ -80,9 +74,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareCrypto.js",
|
||||
"path": "/lib/bare/bundles/bareAnsiEscapes.js",
|
||||
"keys": [
|
||||
"bareCrypto"
|
||||
"bareAnsiEscapes"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -92,15 +86,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareAppKit.js",
|
||||
"path": "/lib/bare/bundles/bareCrypto.js",
|
||||
"keys": [
|
||||
"bareAppKit"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareApk.js",
|
||||
"keys": [
|
||||
"bareApk"
|
||||
"bareCrypto"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -110,9 +98,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareAssert.js",
|
||||
"path": "/lib/bare/bundles/bareAppKit.js",
|
||||
"keys": [
|
||||
"bareAssert"
|
||||
"bareAppKit"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -122,9 +110,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareBmp.js",
|
||||
"path": "/lib/bare/bundles/bareAssert.js",
|
||||
"keys": [
|
||||
"bareBmp"
|
||||
"bareAssert"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareApk.js",
|
||||
"keys": [
|
||||
"bareApk"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -134,9 +128,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareBuffer.js",
|
||||
"path": "/lib/bare/bundles/bareBmp.js",
|
||||
"keys": [
|
||||
"bareBuffer"
|
||||
"bareBmp"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -145,18 +139,18 @@
|
||||
"bareBundleCompile"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareBluetoothApple.js",
|
||||
"keys": [
|
||||
"bareBluetoothApple"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareBundle.js",
|
||||
"keys": [
|
||||
"bareBundle"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareBuffer.js",
|
||||
"keys": [
|
||||
"bareBuffer"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareBundleEvaluate.js",
|
||||
"keys": [
|
||||
@@ -164,9 +158,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareConsole.js",
|
||||
"path": "/lib/bare/bundles/bareBluetoothApple.js",
|
||||
"keys": [
|
||||
"bareConsole"
|
||||
"bareBluetoothApple"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -175,24 +169,18 @@
|
||||
"bareBoot"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareDaemon.js",
|
||||
"keys": [
|
||||
"bareDaemon"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareBundleId.js",
|
||||
"keys": [
|
||||
"bareBundleId"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareChannel.js",
|
||||
"keys": [
|
||||
"bareChannel"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareDelta.js",
|
||||
"keys": [
|
||||
"bareDelta"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareDebugLog.js",
|
||||
"keys": [
|
||||
@@ -200,15 +188,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareDaemon.js",
|
||||
"path": "/lib/bare/bundles/bareConsole.js",
|
||||
"keys": [
|
||||
"bareDaemon"
|
||||
"bareConsole"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareDns.js",
|
||||
"path": "/lib/bare/bundles/bareChannel.js",
|
||||
"keys": [
|
||||
"bareDns"
|
||||
"bareChannel"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -218,9 +206,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareCov.js",
|
||||
"path": "/lib/bare/bundles/bareDelta.js",
|
||||
"keys": [
|
||||
"bareCov"
|
||||
"bareDelta"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareDns.js",
|
||||
"keys": [
|
||||
"bareDns"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -241,6 +235,12 @@
|
||||
"bareDgram"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareCov.js",
|
||||
"keys": [
|
||||
"bareCov"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareFfmpeg.js",
|
||||
"keys": [
|
||||
@@ -259,18 +259,18 @@
|
||||
"bareFormat"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareGif.js",
|
||||
"keys": [
|
||||
"bareGif"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareFormData.js",
|
||||
"keys": [
|
||||
"bareFormData"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareGif.js",
|
||||
"keys": [
|
||||
"bareGif"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareFileLogger.js",
|
||||
"keys": [
|
||||
@@ -283,18 +283,18 @@
|
||||
"bareHeif"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareGtk.js",
|
||||
"keys": [
|
||||
"bareGtk"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareHrtime.js",
|
||||
"keys": [
|
||||
"bareHrtime"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareGtk.js",
|
||||
"keys": [
|
||||
"bareGtk"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareHttpParser.js",
|
||||
"keys": [
|
||||
@@ -320,9 +320,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareInspect.js",
|
||||
"path": "/lib/bare/bundles/bareHttp1.js",
|
||||
"keys": [
|
||||
"bareInspect"
|
||||
"bareHttp1"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -332,9 +332,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareHttp1.js",
|
||||
"path": "/lib/bare/bundles/bareInspect.js",
|
||||
"keys": [
|
||||
"bareHttp1"
|
||||
"bareInspect"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -356,9 +356,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareLief.js",
|
||||
"path": "/lib/bare/bundles/bareLogger.js",
|
||||
"keys": [
|
||||
"bareLief"
|
||||
"bareLogger"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -368,9 +368,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareLogger.js",
|
||||
"path": "/lib/bare/bundles/bareLief.js",
|
||||
"keys": [
|
||||
"bareLogger"
|
||||
"bareLief"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -385,12 +385,6 @@
|
||||
"bareMake"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareModuleResolve.js",
|
||||
"keys": [
|
||||
"bareModuleResolve"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareModuleLexer.js",
|
||||
"keys": [
|
||||
@@ -398,9 +392,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareNdk.js",
|
||||
"path": "/lib/bare/bundles/bareModuleResolve.js",
|
||||
"keys": [
|
||||
"bareNdk"
|
||||
"bareModuleResolve"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -410,15 +404,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareNative.js",
|
||||
"path": "/lib/bare/bundles/bareNdk.js",
|
||||
"keys": [
|
||||
"bareNative"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareMedia.js",
|
||||
"keys": [
|
||||
"bareMedia"
|
||||
"bareNdk"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -428,9 +416,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareOs.js",
|
||||
"path": "/lib/bare/bundles/bareNative.js",
|
||||
"keys": [
|
||||
"bareOs"
|
||||
"bareNative"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareNodeFetch.js",
|
||||
"keys": [
|
||||
"bareNodeFetch"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -446,27 +440,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareNodeFetch.js",
|
||||
"path": "/lib/bare/bundles/bareOs.js",
|
||||
"keys": [
|
||||
"bareNodeFetch"
|
||||
"bareOs"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePerformance.js",
|
||||
"path": "/lib/bare/bundles/bareMedia.js",
|
||||
"keys": [
|
||||
"barePerformance"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePng.js",
|
||||
"keys": [
|
||||
"barePng"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePackDrive.js",
|
||||
"keys": [
|
||||
"barePackDrive"
|
||||
"bareMedia"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -476,15 +458,21 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePipe.js",
|
||||
"path": "/lib/bare/bundles/barePackDrive.js",
|
||||
"keys": [
|
||||
"barePipe"
|
||||
"barePackDrive"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePrebuild.js",
|
||||
"path": "/lib/bare/bundles/barePng.js",
|
||||
"keys": [
|
||||
"barePrebuild"
|
||||
"barePng"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePerformance.js",
|
||||
"keys": [
|
||||
"barePerformance"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -493,12 +481,24 @@
|
||||
"bareNodeRuntime"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePipe.js",
|
||||
"keys": [
|
||||
"barePipe"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePunycode.js",
|
||||
"keys": [
|
||||
"barePunycode"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePrebuild.js",
|
||||
"keys": [
|
||||
"barePrebuild"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareQuerystring.js",
|
||||
"keys": [
|
||||
@@ -511,12 +511,6 @@
|
||||
"bareQueueMicrotask"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareProcess.js",
|
||||
"keys": [
|
||||
"bareProcess"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareDev.js",
|
||||
"keys": [
|
||||
@@ -524,9 +518,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePromClient.js",
|
||||
"path": "/lib/bare/bundles/bareProcess.js",
|
||||
"keys": [
|
||||
"barePromClient"
|
||||
"bareProcess"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -535,42 +529,24 @@
|
||||
"bareRealm"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePromClient.js",
|
||||
"keys": [
|
||||
"barePromClient"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareRuntime.js",
|
||||
"keys": [
|
||||
"bareRuntime"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareRepl.js",
|
||||
"keys": [
|
||||
"bareRepl"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareSemver.js",
|
||||
"keys": [
|
||||
"bareSemver"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareSdl.js",
|
||||
"keys": [
|
||||
"bareSdl"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareSignals.js",
|
||||
"keys": [
|
||||
"bareSignals"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareSidecar.js",
|
||||
"keys": [
|
||||
"bareSidecar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareRpc.js",
|
||||
"keys": [
|
||||
@@ -578,15 +554,21 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareStorage.js",
|
||||
"path": "/lib/bare/bundles/bareSemver.js",
|
||||
"keys": [
|
||||
"bareStorage"
|
||||
"bareSemver"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareStdio.js",
|
||||
"path": "/lib/bare/bundles/bareRepl.js",
|
||||
"keys": [
|
||||
"bareStdio"
|
||||
"bareRepl"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareSignals.js",
|
||||
"keys": [
|
||||
"bareSignals"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -596,9 +578,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareStringDecoder.js",
|
||||
"path": "/lib/bare/bundles/bareSidecar.js",
|
||||
"keys": [
|
||||
"bareStringDecoder"
|
||||
"bareSidecar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareStorage.js",
|
||||
"keys": [
|
||||
"bareStorage"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -608,15 +596,21 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareSvg.js",
|
||||
"path": "/lib/bare/bundles/bareStdio.js",
|
||||
"keys": [
|
||||
"bareSvg"
|
||||
"bareStdio"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareStructuredClone.js",
|
||||
"path": "/lib/bare/bundles/bareStringDecoder.js",
|
||||
"keys": [
|
||||
"bareStructuredClone"
|
||||
"bareStringDecoder"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareSvg.js",
|
||||
"keys": [
|
||||
"bareSvg"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -632,21 +626,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareSubprocess.js",
|
||||
"path": "/lib/bare/bundles/bareStructuredClone.js",
|
||||
"keys": [
|
||||
"bareSubprocess"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareTiff.js",
|
||||
"keys": [
|
||||
"bareTiff"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareTimers.js",
|
||||
"keys": [
|
||||
"bareTimers"
|
||||
"bareStructuredClone"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -655,6 +637,12 @@
|
||||
"bareTcp"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareTiff.js",
|
||||
"keys": [
|
||||
"bareTiff"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareThread.js",
|
||||
"keys": [
|
||||
@@ -662,9 +650,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareTpl.js",
|
||||
"path": "/lib/bare/bundles/bareSubprocess.js",
|
||||
"keys": [
|
||||
"bareTpl"
|
||||
"bareSubprocess"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareTimers.js",
|
||||
"keys": [
|
||||
"bareTimers"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -674,9 +668,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareTls.js",
|
||||
"path": "/lib/bare/bundles/bareTpl.js",
|
||||
"keys": [
|
||||
"bareTls"
|
||||
"bareTpl"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -686,9 +680,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareTty.js",
|
||||
"path": "/lib/bare/bundles/bareTls.js",
|
||||
"keys": [
|
||||
"bareTty"
|
||||
"bareTls"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -698,15 +692,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareUnpack.js",
|
||||
"path": "/lib/bare/bundles/bareTty.js",
|
||||
"keys": [
|
||||
"bareUnpack"
|
||||
"bareTty"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareUnionBundle.js",
|
||||
"path": "/lib/bare/bundles/bareUnpack.js",
|
||||
"keys": [
|
||||
"bareUnionBundle"
|
||||
"bareUnpack"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -733,12 +727,24 @@
|
||||
"bareWebp"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareUtils.js",
|
||||
"keys": [
|
||||
"bareUtils"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareWhich.js",
|
||||
"keys": [
|
||||
"bareWhich"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareUnionBundle.js",
|
||||
"keys": [
|
||||
"bareUnionBundle"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareWebKitGtk.js",
|
||||
"keys": [
|
||||
@@ -751,12 +757,6 @@
|
||||
"bareV8ToIstanbul"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareUtils.js",
|
||||
"keys": [
|
||||
"bareUtils"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareWinUi.js",
|
||||
"keys": [
|
||||
@@ -1595,8 +1595,8 @@
|
||||
],
|
||||
"bundleProvenance": {
|
||||
"schemaVersion": 1,
|
||||
"generatedAt": "2026-04-05T16:50:02.874Z",
|
||||
"gitCommit": "c4781e02c0730f182d3eccdbd7f49ae7e10dbe53",
|
||||
"generatedAt": "2026-04-05T17:14:23.559Z",
|
||||
"gitCommit": "e89c55da251dba14cf177202fde08bb972dd04a5",
|
||||
"nodeVersion": "v22.22.0",
|
||||
"bundleTier": "all",
|
||||
"normativeManifest": "packages/bare-os-booter/lib/bare-module-manifest.json",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"atMs": 1775407801982,
|
||||
"atMs": 1775409262725,
|
||||
"commands": [
|
||||
"arch",
|
||||
"awk",
|
||||
|
||||
@@ -1822,17 +1822,26 @@ async function bootTimed(ctx, label, fn, stageLog) {
|
||||
ctx.bareOsBootStageTimings = []
|
||||
}
|
||||
let monotonicNs
|
||||
let monotonicDeltaNs
|
||||
try {
|
||||
const bh = await import('bare-hrtime')
|
||||
const bg = bh && (bh.bigint || bh.default?.bigint)
|
||||
if (typeof bg === 'function') monotonicNs = String(bg.call(bh))
|
||||
if (typeof bg === 'function') {
|
||||
const now = bg.call(bh)
|
||||
monotonicNs = String(now)
|
||||
const prev = ctx.bareOsBootHrtimePrev
|
||||
if (typeof prev === 'bigint')
|
||||
monotonicDeltaNs = String(now - prev)
|
||||
ctx.bareOsBootHrtimePrev = now
|
||||
}
|
||||
} catch {
|
||||
/* optional native */
|
||||
}
|
||||
ctx.bareOsBootStageTimings.push({
|
||||
label,
|
||||
wallMs: ms,
|
||||
...(monotonicNs ? { monotonicNs } : {})
|
||||
...(monotonicNs ? { monotonicNs } : {}),
|
||||
...(monotonicDeltaNs ? { monotonicDeltaNs } : {})
|
||||
})
|
||||
}
|
||||
await maybeAppendBootTransactionJournal(ctx, {
|
||||
@@ -2997,7 +3006,9 @@ async function runKernelExtDropins(ctx, opts = {}) {
|
||||
continue
|
||||
}
|
||||
try {
|
||||
const extT0 = Date.now()
|
||||
await run(imgPath)
|
||||
const loadMs = Date.now() - extT0
|
||||
loadedSet.add(imgPath)
|
||||
if (Array.isArray(ranScripts)) ranScripts.push(imgPath)
|
||||
if (typeof ctx.bareOsRegisterKernelExtensionRecord === 'function') {
|
||||
@@ -3006,7 +3017,8 @@ async function runKernelExtDropins(ctx, opts = {}) {
|
||||
script: imgPath,
|
||||
id: ent.extId,
|
||||
dependsOn: ent.dependsOn,
|
||||
signaturePointer: ent.signaturePointer
|
||||
signaturePointer: ent.signaturePointer,
|
||||
loadMs
|
||||
})
|
||||
}
|
||||
} catch (e) {
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -5,7 +5,7 @@ Authoritative **version alignment** with protocol and telemetry schema numbers l
|
||||
## Maintenance
|
||||
|
||||
- **Host filesystem**: first-party booter and seeder sources use **`import … from '#host-fs'`** / **`#host-path`** (and seeder **`#host-fs-promises`**) so Bare resolves **`bare-fs`** / **`bare-path`** and Node resolves the built-in **`fs`** / **`path`** modules via the default **`imports`** condition. **`bare-fs`** is a direct **`dependencies`** entry of **`bare-os-booter`**. CI: **`scripts/verify-pear-no-static-node-import.mjs`** rejects bare **`fs`** / **`path`** specifiers.
|
||||
- **POSIX / proc**: **`/proc/bare_os/syscalls.json`** schema **8** (**`posixXsh`**, **`fdModel`**, **`socketMsgSurface`**, **`errnoHints`**; JSON text **cached** until **`vfs.bareOsClearWarmReadCaches`**); **`/proc/bare_os/process_table.json`** schema **7**; **`/proc/bare_os/protomux.json`** wire text schema **2**; **`/dev/shm`** in-memory named segments. Protocol export **`BARE_OS_POSIX_PROFILE_*`**.
|
||||
- **POSIX / proc**: **`/proc/bare_os/syscalls.json`** schema **8** with **`socketMsgSurface` schema 4** (`logicalScmRightsOnSend`); includes **`posixXsh`**, **`fdModel`**, **`errnoHints`**; JSON text **cached** until **`vfs.bareOsClearWarmReadCaches`**. **`/proc/bare_os/process_table.json`** schema **7**; **`/proc/bare_os/protomux.json`** wire text schema **2**; **`/dev/shm`** in-memory named segments. **`/proc/bare_os/security_posture.json`** schema **4** — **`vaultCryptoPrimitives`**, **`bareCryptoReportedVersion`**, **`peerAdmission`** (**denylist**, **`requireCaps`**, NDJSON audit env pointers). **`/proc/bare_os_features`**: **`pearIpcConservativeAdvertisement`** (channel names only; no host wiring claim). Protocol export **`BARE_OS_POSIX_PROFILE_*`**.
|
||||
- **Blind-relay / pairing / geo proc** (default): **`bareOsProcBlindPeerRelayHintsMinimal`** returns **schema 1** with **`operatorRedacted: true`**. The legacy export **`bareOsProcBlindPeerRelayHintsStub`** was removed; use **`bareOsProcBlindPeerRelayHintsMinimal`** only.
|
||||
- **Vendored bundles**: post-esbuild **`scripts/sanitize-bare-bundles.mjs`** (from **`bare-os-bare-libs/build.mjs`**) strips CI-forbidden markers and replaces **`node:`** requires in **`bareDev.js`** with **`bare-*`** modules.
|
||||
- **Boot hooks (naming)**: canonical **`bareOsRegisterBootStepHook`**, **`bareOsInvokeBootStepHooks`**, **`bareOsEmitBareBootStepHint`**; legacy **`*BootPhase*`** methods remain thin wrappers (**no `bareOsCtxApiVersion` bump**). See [docs/reference/naming-alias-matrix.md](../../docs/reference/naming-alias-matrix.md).
|
||||
@@ -18,6 +18,7 @@ Authoritative **version alignment** with protocol and telemetry schema numbers l
|
||||
|
||||
| Version | Booter (workspace) | Notes |
|
||||
| ------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| 1.49.0 | 0.1.0 | **`ctx.bareOsTrySpawnHostSubprocess`**: optional **`BARE_OS_CTX_BARE_SUBPROCESS_SPAWN`** prefers **`ctx.bare.bareSubprocess.spawn`** when merged. **`/proc/bare_os/extensions.json`** schema **9** (**`resolverModule`**, per-entry **`loadMs`**). **`bareOsPosixPoll`** zero-timeout path includes **`pollClock`**; **`bareOsSyscall('select')`** forwards **`pollClock`** when **`timeoutMs` > 0. **`disk.os` `replication_operator_sketch`** adds **`peerPrioritySketch`** from **`BARE_OS_REPLICATION_PEER_PRIORITY_JSON`**. Warm-cache explicit invalidation counts replication reasons (**`vfs.warm_read_cache_invalidate_replication`**). Cooperative shell job yield (**`suspend-job`** / **`fg`**) + **`foregroundPgid`** on **`fg`**. Peer admission **schema 2** (**`BARE_OS_PEER_DENYLIST_HEX`**, **`BARE_OS_PEER_REQUIRE_CAPS_JSON`**, optional **`BARE_OS_PEER_ADMISSION_AUDIT_NDJSON`** / **`BARE_OS_PEER_ADMISSION_AUDIT_RATE_MS`**). Host env passthrough adds **`BARE_OS_CTX_BARE_SUBPROCESS_SPAWN`**, **`BARE_OS_REPLICATION_PEER_PRIORITY_JSON`**, peer-policy keys. |
|
||||
| 1.48.0 | 0.1.0 | Shell: **`set -o pipefail`** / **`set +o pipefail`**; optional **`BARE_OS_SHELL_PIPESTATUS`** → pipeline stage exits in **`BARE_OS_PIPESTATUS`**. **`BARE_OS_BIN_WORKER_WASM_MS_MAX`** now bounds **`bare-worker`** offload wall time (**`terminate()`** + **`wasm_time_budget`**). **`ctx.bareOsTrySpawnHostSubprocess`**: tries **`bare-subprocess`**, then on **Node** **`child_process.spawn`** (still no static **`node:`** imports); result includes optional **`backend`**. Tier-1 **`getconf`** catalog adds **`_SC_NPROCESSORS_ONLN`**. Optional **`BARE_OS_VFS_SYSTEM_IMAGE_WRITE`** allows **`vfs.writeFile`** on the system Hyperdrive for image maintenance / tests (default guest read-only unchanged). Guest-isolation regression tests; corestore snapshot operator path documented as explicit non-goal in **`package-bare-os-booter`**. |
|
||||
| 1.47.0 | 0.1.0 | **`ctx.bareOsSyscall('nanosleep')`** — capped wall sleep. Bridge **`getsockopt`/`setsockopt`** — **`SO_KEEPALIVE`** / **`TCP_NODELAY`** on logical socket fds when **`BARE_OS_POSIX_SOCKET_FD_BRIDGE`**. **`BARE_OS_SWARM_MAX_PEERS`**, **`BARE_OS_SWARM_MAX_CLIENT_CONNECTIONS`**, **`BARE_OS_SWARM_MAX_SERVER_CONNECTIONS`**, **`BARE_OS_SWARM_MAX_PARALLEL`** → Hyperswarm ctor; surfaced on **`/proc/bare_os/swarm`** and **`disk.os` `replication_operator_sketch` (schema 4)**. **`/proc/bare_os/protomux.json` `operatorMetrics` schema 3** — app-channel RX total + RPC pool hint flag. **`BARE_OS_VFS_WARM_CACHE_INVALIDATE_ON_REPLICATION`** — full warm-cache flush when replicated core lengths grow (metrics_live). **`ctx.bareOsHyperbeeGuestHint`**, **`bareOsMirrorDriveExportSketch` schema 2** + **`BARE_OS_MIRROR_DRIVE_OVERLAY_JSON`** on union/export sketches. **`corestore` snapshot hint schema 2** (**`guestSuspendResume: ENOTSUP`**). Kernel: boot.policy **`extensionSignerPins`** enforced before **`kernel.ext.d`** script exec via **`ctx.bareOsVerifyBootManifestSignature`**. Delegate audit NDJSON adds **`argvRawCount`**, **`argvTruncated`**, **`sessionId`**. |
|
||||
| 1.46.0 | 0.1.0 | **`BARE_OS_POSIX_SOCKET_FD_BRIDGE`**: passive **`SOCK_DGRAM` `bind`** + **`connect`**-after-bind, **`send`** with explicit **`port`/`host`** when bound without default peer; **`poll`/`select`** for **`udp_bound`** fds. **`bareOsPosixPoll`** monotonic timeouts via **`bare-hrtime`** when loaded (**`pollClock`** in result). Expanded **`bareOsGetconfSysconf`** / Tier-1 **`getconf`** **`_SC_*`** names. **`disk.os`**: **`bare_os.replication_operator_sketch`** JSON **schema 2**; cap-gated **`bare_os.replication_operator_intent`** (**`BARE_OS_DISK_OS_OPERATOR_INTENT_RPC`**) + audit batch. **`/proc/bare_os/protomux.json`**: optional **`protomuxLibrary`** + **`BARE_OS_PROTOMUX_OPERATOR_STATS_JSON`**. **`/proc/bare_os/security_posture.json`**: **`pearMultisigSeeder`** from **`BARE_OS_SEEDER_MULTISIG_VERIFY_RESULT`**. Boot policy **`p2pAdmission`** merges **`peerAllowlistHex`** / **`hyperswarmBootstrap`** into **`ctx.env`** when unset. VFS: **`/.bare/**`** routes to personal drive; optional **`BARE_OS_PERSONAL_VAULT_INDEX_CACHE_MS`** readdir memo. Shell: **`wait -n`** under **`BARE_OS_SHELL_POSIX_MODE`**. **`test.bare-smoke.js`** + **`npm run test:bare`**. |
|
||||
|
||||
@@ -544,6 +544,7 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
'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',
|
||||
@@ -646,6 +647,7 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
'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',
|
||||
@@ -705,6 +707,10 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
'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_VFS_WARM_CACHE_INVALIDATE_ON_APPEND',
|
||||
'BARE_OS_KERNEL_DEBUG',
|
||||
'BARE_OS_PEAR_INSPECT',
|
||||
@@ -760,6 +766,8 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
const kernelEventSubs = new Set()
|
||||
/** @type {Set<(ev: Record<string, unknown>) => void | Promise<void>>} */
|
||||
const eventBusSubs = new Set()
|
||||
/** Last NDJSON audit emit (ms) keyed by trimmed peer hex prefix (rate limit). */
|
||||
const peerAdmissionAuditLastMs = new Map()
|
||||
const bootStartedMs = Date.now()
|
||||
/** @type {null | (() => bigint)} */
|
||||
let bootHrtimeNowNs = null
|
||||
@@ -1442,6 +1450,13 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
).trim() || undefined,
|
||||
note: 'OTA / Pear stage hints for operators; compare pear-runtime-updater docs on Holepunch.'
|
||||
},
|
||||
pearIpcConservativeAdvertisement: {
|
||||
schema: 1,
|
||||
note:
|
||||
'Well-known Pear IPC channel *names* only; does not assert host wiring or handler behavior.',
|
||||
channels: buildPearIpcRegistryJson().channels.map((c) => c.name),
|
||||
updaterDelegateEnv: 'BARE_OS_PEAR_UPDATER_DELEGATE'
|
||||
},
|
||||
posixShellExtendedProfile: {
|
||||
schema: 1,
|
||||
envGate: 'BARE_OS_SH_EXTENDED_PROFILE',
|
||||
@@ -1490,9 +1505,10 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
},
|
||||
procBareOsExtensionsText() {
|
||||
return `${JSON.stringify({
|
||||
schema: 8,
|
||||
schema: 9,
|
||||
featureBitsDoc: BARE_OS_KERNEL_FEATURE_BITS_DOC,
|
||||
entries: kernelExtensionRecords,
|
||||
resolverModule: 'kernel-extension-resolver.js',
|
||||
ed25519PolicyBridge: {
|
||||
schema: 1,
|
||||
bootManifestSignEnv: 'BARE_OS_BOOT_MANIFEST_SIGN',
|
||||
@@ -1515,7 +1531,7 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
10
|
||||
)
|
||||
return `${JSON.stringify({
|
||||
schema: 3,
|
||||
schema: 4,
|
||||
note: 'Non-secret security posture snapshot; no vault or key material.',
|
||||
bootPolicyMerged: bootPol,
|
||||
bootPolicyStrict: strict,
|
||||
@@ -1523,7 +1539,19 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
shellEnv.BARE_OS_SANDBOX_SCRIPT !== '0' &&
|
||||
shellEnv.BARE_OS_SANDBOX_SCRIPT !== 'false',
|
||||
ctxApiVersion: BARE_OS_CTX_API_VERSION,
|
||||
bareCryptoReportedVersion: String(
|
||||
shellEnv.BARE_OS_BARE_CRYPTO_VERSION || ''
|
||||
).trim() || null,
|
||||
accountCryptoProfileV2: BARE_OS_ACCOUNT_CRYPTO_PROFILE_V2,
|
||||
vaultCryptoPrimitives: {
|
||||
schema: 1,
|
||||
aead: 'chacha20-poly1305',
|
||||
accountKdf: 'pbkdf2-sha256',
|
||||
signing: 'ed25519',
|
||||
module: 'bare-crypto',
|
||||
note:
|
||||
'Guest account v2 and vault sealing use bare-crypto only; v1 legacy accounts require migration.'
|
||||
},
|
||||
accountEncodingVersionsSupported: [1, 2],
|
||||
secretHandles: bareOsSecretHandleSnapshot(),
|
||||
auditChain: bareOsAuditChainSnapshot(),
|
||||
@@ -1558,12 +1586,23 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
note: 'Replication RPC may carry attestation blobs; guests verify only when operator policy enables pinned validators.'
|
||||
},
|
||||
peerAdmission: {
|
||||
schema: 1,
|
||||
schema: 2,
|
||||
allowlistConfigured: !!(
|
||||
shellEnv.BARE_OS_PEER_ALLOWLIST_HEX &&
|
||||
String(shellEnv.BARE_OS_PEER_ALLOWLIST_HEX).trim()
|
||||
),
|
||||
evaluator: 'evaluateBareOsPeerAdmission'
|
||||
denylistConfigured: !!(
|
||||
shellEnv.BARE_OS_PEER_DENYLIST_HEX &&
|
||||
String(shellEnv.BARE_OS_PEER_DENYLIST_HEX).trim()
|
||||
),
|
||||
requireCapsConfigured: !!(
|
||||
shellEnv.BARE_OS_PEER_REQUIRE_CAPS_JSON &&
|
||||
String(shellEnv.BARE_OS_PEER_REQUIRE_CAPS_JSON).trim()
|
||||
),
|
||||
admissionAuditNdjsonEnv: 'BARE_OS_PEER_ADMISSION_AUDIT_NDJSON',
|
||||
admissionAuditRateMsEnv: 'BARE_OS_PEER_ADMISSION_AUDIT_RATE_MS',
|
||||
evaluator: 'evaluateBareOsPeerAdmission',
|
||||
admissionResultSchema: 2
|
||||
},
|
||||
pearMultisigSeeder: {
|
||||
schema: 1,
|
||||
@@ -3460,7 +3499,7 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
posixAlignment: 'ENOTSUP',
|
||||
ancillaryReject: leg,
|
||||
note:
|
||||
'sendmsg: ancillary control messages (cmsgs/control/controllen/msgHdr.*) are not implemented on the socket FD bridge without BARE_OS_POSIX_SOCKET_SCM_RIGHTS; use payload-only send or bare IPC.'
|
||||
'sendmsg: ancillary control messages (cmsgs/control/controllen/msgHdr.*) are unsupported on the socket FD bridge without BARE_OS_POSIX_SOCKET_SCM_RIGHTS; use payload-only send or bare IPC.'
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4214,6 +4253,36 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
atMs: Date.now()
|
||||
})
|
||||
}
|
||||
const allowCtxBareSpawn =
|
||||
shellEnv.BARE_OS_CTX_BARE_SUBPROCESS_SPAWN === '1' ||
|
||||
shellEnv.BARE_OS_CTX_BARE_SUBPROCESS_SPAWN === 'true'
|
||||
if (allowCtxBareSpawn) {
|
||||
const bareLib =
|
||||
this.bare && typeof this.bare === 'object'
|
||||
? /** @type {Record<string, unknown>} */ (this.bare)
|
||||
: null
|
||||
const bs = bareLib && bareLib.bareSubprocess
|
||||
const spawnBare = bs && /** @type {{ spawn?: Function }} */ (bs).spawn
|
||||
if (typeof spawnBare === 'function') {
|
||||
try {
|
||||
const child = spawnBare.call(bs, av[0] || 'bare', av.slice(1), spawnOpts)
|
||||
pushJob('ctx.bare.bareSubprocess')
|
||||
return {
|
||||
ok: true,
|
||||
child,
|
||||
backend: 'ctx.bare.bareSubprocess'
|
||||
}
|
||||
} catch (e) {
|
||||
const msg = (e && /** @type {Error} */ (e).message) || String(e)
|
||||
return {
|
||||
ok: false,
|
||||
reason: msg,
|
||||
errorCode: 'ctx_bare_subprocess_spawn_failed',
|
||||
causeName: e && /** @type {Error} */ (e).name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
try {
|
||||
const mod = await import('bare-subprocess')
|
||||
const sp = mod && (mod.default || mod)
|
||||
@@ -4493,11 +4562,13 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
)
|
||||
if (maxWait <= 0) {
|
||||
const once = this.bareOsPosixPollProbe(spec)
|
||||
const tProbe = bootHrtimeNowNs ? bootHrtimeNowNs() : null
|
||||
return {
|
||||
ok: true,
|
||||
ready: once.ready,
|
||||
waitedMs: 0,
|
||||
timedOut: false
|
||||
timedOut: false,
|
||||
pollClock: tProbe != null ? 'monotonic_hrtime' : 'Date_now'
|
||||
}
|
||||
}
|
||||
const t0Ns = bootHrtimeNowNs ? bootHrtimeNowNs() : null
|
||||
@@ -4608,7 +4679,7 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
if (Number.isFinite(p) && p > 0) return String(Math.min(4096, p))
|
||||
return '4'
|
||||
}
|
||||
if (n === '_SC_PAGESIZE') return '4096'
|
||||
if (n === '_SC_PAGESIZE' || n === '_SC_PAGE_SIZE') return '4096'
|
||||
if (n === '_SC_PHYS_PAGES') {
|
||||
const raw = String(shellEnv.BARE_OS_PHYS_PAGES_HINT || '').trim()
|
||||
const p = parseInt(raw, 10)
|
||||
@@ -5343,7 +5414,8 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
readReady,
|
||||
writeReady,
|
||||
timedOut: pr.timedOut === true,
|
||||
waitedMs: pr.waitedMs ?? 0
|
||||
waitedMs: pr.waitedMs ?? 0,
|
||||
pollClock: pr.pollClock
|
||||
}
|
||||
}
|
||||
if (name === 'umask') {
|
||||
@@ -6390,7 +6462,7 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
flags: 0,
|
||||
controllen: 0,
|
||||
note:
|
||||
'TCP bridge: single flat buffer; ancillary ENOTSUP-shaped.'
|
||||
'TCP bridge: single flat buffer; recv ancillary controllen 0 (socketMsgSurface schema 4).'
|
||||
}
|
||||
}
|
||||
return base
|
||||
@@ -6620,7 +6692,7 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
flags: 0,
|
||||
controllen: 0,
|
||||
note:
|
||||
'SCM_RIGHTS / ancillary data ENOTSUP; single flat buffer in buf (no scatter iov split).'
|
||||
'UDP bridge: single flat buf; recv controllen 0; logical SCM_RIGHTS apply only to sendmsg result (schema 4).'
|
||||
}
|
||||
}
|
||||
return base
|
||||
@@ -6686,15 +6758,57 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
throw new Error(`bareOsSyscall: unsupported op "${name}"`)
|
||||
},
|
||||
/**
|
||||
* Peer admission against optional `BARE_OS_PEER_ALLOWLIST_HEX` and
|
||||
* `BARE_OS_DHT_ADDRESS_CLASS_ALLOWLIST` when `meta.dhtAddressClass` is supplied.
|
||||
* Peer admission against optional **`BARE_OS_PEER_DENYLIST_HEX`**,
|
||||
* **`BARE_OS_PEER_REQUIRE_CAPS_JSON`** (**`meta.caps`**),
|
||||
* **`BARE_OS_PEER_ALLOWLIST_HEX`**, and
|
||||
* **`BARE_OS_DHT_ADDRESS_CLASS_ALLOWLIST`** when **`meta.dhtAddressClass`** is supplied.
|
||||
* Optional **`BARE_OS_PEER_ADMISSION_AUDIT_NDJSON`** appends **`peer_admission`** rows
|
||||
* to the event bus (and session stdout when NDJSON is enabled), with
|
||||
* **`BARE_OS_PEER_ADMISSION_AUDIT_RATE_MS`** per-peer throttling.
|
||||
*/
|
||||
bareOsEvaluatePeerAdmission(peerKeyHex, meta) {
|
||||
return evaluateBareOsPeerAdmission(
|
||||
const result = evaluateBareOsPeerAdmission(
|
||||
shellEnv,
|
||||
String(peerKeyHex || ''),
|
||||
meta && typeof meta === 'object' ? meta : undefined
|
||||
)
|
||||
const auditOn =
|
||||
shellEnv.BARE_OS_PEER_ADMISSION_AUDIT_NDJSON === '1' ||
|
||||
shellEnv.BARE_OS_PEER_ADMISSION_AUDIT_NDJSON === 'true'
|
||||
if (auditOn) {
|
||||
const rateRaw = Number.parseInt(
|
||||
String(shellEnv.BARE_OS_PEER_ADMISSION_AUDIT_RATE_MS || ''),
|
||||
10
|
||||
)
|
||||
const rateMs =
|
||||
Number.isFinite(rateRaw) && rateRaw >= 0
|
||||
? Math.min(rateRaw, 3_600_000)
|
||||
: 0
|
||||
const norm = String(peerKeyHex || '')
|
||||
.trim()
|
||||
.toLowerCase()
|
||||
.replace(/^0x/, '')
|
||||
const keyShort = norm ? norm.slice(0, 16) : ''
|
||||
const bucket = keyShort || 'unknown'
|
||||
const now = Date.now()
|
||||
if (rateMs > 0) {
|
||||
const last = peerAdmissionAuditLastMs.get(bucket) ?? 0
|
||||
if (now - last < rateMs) return result
|
||||
peerAdmissionAuditLastMs.set(bucket, now)
|
||||
}
|
||||
this.bareOsEmitEventBus({
|
||||
type: 'peer_admission',
|
||||
verdict: result.verdict,
|
||||
reason: result.reason,
|
||||
peerKeyHexPrefix: keyShort || undefined,
|
||||
admissionSchema: result.schema,
|
||||
dhtAddressClass:
|
||||
meta && typeof meta === 'object'
|
||||
? String(meta.dhtAddressClass || '').trim() || undefined
|
||||
: undefined
|
||||
})
|
||||
}
|
||||
return result
|
||||
},
|
||||
/** Parsed non-secret `BARE_OS_PEAR_RUNTIME_SNAPSHOT_JSON` for Pear drift checks. */
|
||||
bareOsReadPearRuntimeSnapshotJson() {
|
||||
@@ -7051,7 +7165,11 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
vfs.bareOsClearWarmReadCaches()
|
||||
}
|
||||
bareOsKernelMetricInc('vfs.warm_read_cache_invalidate_explicit')
|
||||
return { ok: true, reason: String(reason || '').slice(0, 256) }
|
||||
const rs = String(reason || '')
|
||||
if (rs.includes('replication')) {
|
||||
bareOsKernelMetricInc('vfs.warm_read_cache_invalidate_replication')
|
||||
}
|
||||
return { ok: true, reason: rs.slice(0, 256) }
|
||||
},
|
||||
/**
|
||||
* Evict `/lib/bare` warm-cache rows using a `bare-module-manifest.json` payload
|
||||
@@ -8148,7 +8266,7 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
return false
|
||||
},
|
||||
/**
|
||||
* @param {{ dropin: string, script: string, semver?: string, capabilities?: string[] }} rec
|
||||
* @param {{ dropin: string, script: string, semver?: string, capabilities?: string[], loadMs?: number }} rec
|
||||
*/
|
||||
bareOsRegisterKernelExtensionRecord(rec) {
|
||||
if (!rec || typeof rec !== 'object') return
|
||||
@@ -8167,6 +8285,11 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
rec.signaturePointer != null
|
||||
? String(rec.signaturePointer).trim().slice(0, 512)
|
||||
: undefined
|
||||
const loadMsRaw = rec.loadMs
|
||||
const loadMs =
|
||||
loadMsRaw != null && Number.isFinite(Number(loadMsRaw))
|
||||
? Math.max(0, Math.min(3600000, Math.floor(Number(loadMsRaw))))
|
||||
: undefined
|
||||
kernelExtensionRecords.push({
|
||||
dropin,
|
||||
script,
|
||||
@@ -8175,6 +8298,7 @@ async function executeKernel(disk, store, swarm, initSource) {
|
||||
id,
|
||||
dependsOn,
|
||||
signaturePointer: signaturePointer || undefined,
|
||||
...(loadMs != null ? { loadMs } : {}),
|
||||
atMs: Date.now()
|
||||
})
|
||||
void appendKernelLoaderAuditLine({
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
* Semantic version of the booter `ctx` contract for custom kernels.
|
||||
* Bump when adding/removing/renaming documented `ctx` fields or changing behavior.
|
||||
*/
|
||||
export const BARE_OS_CTX_API_VERSION = '1.48.0'
|
||||
export const BARE_OS_CTX_API_VERSION = '1.49.0'
|
||||
|
||||
+4
-1
@@ -413,6 +413,7 @@ export interface BareOsKernelContext {
|
||||
ready: Array<{ fd: number; revents: string }>
|
||||
waitedMs: number
|
||||
timedOut?: boolean
|
||||
pollClock?: 'monotonic_hrtime' | 'Date_now'
|
||||
}>
|
||||
bareOsSigaction?(
|
||||
signal: string,
|
||||
@@ -427,7 +428,7 @@ export interface BareOsKernelContext {
|
||||
): Promise<unknown>
|
||||
bareOsEvaluatePeerAdmission?(
|
||||
peerKeyHex: string,
|
||||
meta?: { dhtAddressClass?: string }
|
||||
meta?: { dhtAddressClass?: string; caps?: string[] }
|
||||
): Record<string, unknown>
|
||||
/** Non-secret Pear runtime snapshot from **`BARE_OS_PEAR_RUNTIME_SNAPSHOT_JSON`** (parse errors → **`null`**). */
|
||||
bareOsReadPearRuntimeSnapshotJson?(): Record<string, unknown> | null
|
||||
@@ -507,6 +508,8 @@ export interface BareOsKernelContext {
|
||||
id?: string
|
||||
dependsOn?: string[]
|
||||
signaturePointer?: string
|
||||
/** Wall ms for script execution (schema 9 `/proc/bare_os/extensions.json`). */
|
||||
loadMs?: number
|
||||
}): void
|
||||
bareOsReadDelegateFairnessSnapshot?(): Record<string, unknown>
|
||||
bareOsReadSubprocessBridgeJobs?(): unknown[]
|
||||
|
||||
@@ -243,6 +243,9 @@ export function createBareOsDiskOsBridge(opts) {
|
||||
const sp = Number(opts.swarmPeerCount)
|
||||
const blindV3 = parseEnvJson('BARE_OS_BLIND_PEER_TOPOLOGY_V3_JSON')
|
||||
const hblobs = parseEnvJson('BARE_OS_HYPERBLOBS_STATS_JSON')
|
||||
const peerPrioritySketch = parseEnvJson(
|
||||
'BARE_OS_REPLICATION_PEER_PRIORITY_JSON'
|
||||
)
|
||||
return JSON.stringify({
|
||||
schema: 4,
|
||||
ok: true,
|
||||
@@ -271,8 +274,9 @@ export function createBareOsDiskOsBridge(opts) {
|
||||
),
|
||||
blindTopologySketchV3: blindV3,
|
||||
hyperblobsDedupSketch: hblobs,
|
||||
peerPrioritySketch,
|
||||
note:
|
||||
'Schema 4: adds swarmConnectionBudget (BARE_OS_SWARM_* env → Hyperswarm ctor) and protomuxOperatorSketch (app-channel rx total, etc.). Schema 3 fields retained (blindTopologySketchV3, hyperblobsDedupSketch).'
|
||||
'Schema 4: swarmConnectionBudget, protomuxOperatorSketch, optional peerPrioritySketch from BARE_OS_REPLICATION_PEER_PRIORITY_JSON (operator-ordered peer key hints; P2P-local policy). Retains blindTopologySketchV3, hyperblobsDedupSketch.'
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -2,15 +2,99 @@
|
||||
* Optional peer admission gate from **`BARE_OS_PEER_ALLOWLIST_HEX`**
|
||||
* (comma-separated hex public keys; empty = allow all).
|
||||
*
|
||||
* **`BARE_OS_PEER_DENYLIST_HEX`** — comma-separated hex keys; if the peer matches,
|
||||
* verdict is **`deny`** before allowlist evaluation (denylist wins).
|
||||
*
|
||||
* **`BARE_OS_PEER_REQUIRE_CAPS_JSON`** — JSON array of capability strings; when set,
|
||||
* **`meta.caps`** must include every required token (hosts pass peer caps when known).
|
||||
*
|
||||
* When **`BARE_OS_DHT_ADDRESS_CLASS_ALLOWLIST`** is set and callers pass
|
||||
* **`dhtAddressClass`** (hyperdht-address–style hint), the class must appear in
|
||||
* the allow list after the key gate passes.
|
||||
*
|
||||
* Admission results use **`schema: 2`** (v1 was **`schema: 1`** only).
|
||||
*
|
||||
* @param {Record<string, unknown> | null | undefined} env
|
||||
* @param {string} peerKeyHex
|
||||
* @param {{ dhtAddressClass?: string } | null | undefined} [meta]
|
||||
* @param {{ dhtAddressClass?: string, caps?: string[] } | null | undefined} [meta]
|
||||
*/
|
||||
const ADMISSION_SCHEMA = 2
|
||||
|
||||
/** @param {string} s */
|
||||
function normKeyHex(s) {
|
||||
return String(s || '')
|
||||
.trim()
|
||||
.toLowerCase()
|
||||
.replace(/^0x/, '')
|
||||
}
|
||||
|
||||
/** @param {string} raw */
|
||||
function keySetFromCommaHex(raw) {
|
||||
return new Set(
|
||||
raw
|
||||
.split(/[\s,]+/)
|
||||
.map((s) => normKeyHex(s))
|
||||
.filter(Boolean)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Record<string, unknown> | null | undefined} env
|
||||
* @returns {string[] | null}
|
||||
*/
|
||||
function parseRequireCaps(env) {
|
||||
const raw = String(env?.BARE_OS_PEER_REQUIRE_CAPS_JSON || '').trim()
|
||||
if (!raw) return null
|
||||
try {
|
||||
const j = JSON.parse(raw)
|
||||
if (!Array.isArray(j)) return null
|
||||
const caps = j
|
||||
.map((x) => String(x).trim())
|
||||
.filter(Boolean)
|
||||
.slice(0, 32)
|
||||
return caps.length ? caps : null
|
||||
} catch {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
export function evaluateBareOsPeerAdmission(env, peerKeyHex, meta = undefined) {
|
||||
const want = normKeyHex(peerKeyHex)
|
||||
const atMs = () => Date.now()
|
||||
|
||||
const denyRaw = String(env?.BARE_OS_PEER_DENYLIST_HEX || '').trim()
|
||||
if (denyRaw) {
|
||||
const denySet = keySetFromCommaHex(denyRaw)
|
||||
if (want && denySet.has(want)) {
|
||||
return {
|
||||
schema: ADMISSION_SCHEMA,
|
||||
verdict: 'deny',
|
||||
reason: 'peer_denylist',
|
||||
denylistSize: denySet.size,
|
||||
atMs: atMs()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const requireCaps = parseRequireCaps(env)
|
||||
if (requireCaps && requireCaps.length > 0) {
|
||||
const peerCapsRaw = meta && Array.isArray(meta.caps) ? meta.caps : []
|
||||
const peerSet = new Set(
|
||||
peerCapsRaw.map((c) => String(c).trim()).filter(Boolean)
|
||||
)
|
||||
for (const c of requireCaps) {
|
||||
if (!peerSet.has(c)) {
|
||||
return {
|
||||
schema: ADMISSION_SCHEMA,
|
||||
verdict: 'deny',
|
||||
reason: 'peer_missing_cap',
|
||||
requiredCaps: [...requireCaps],
|
||||
atMs: atMs()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const raw = String(env?.BARE_OS_PEER_ALLOWLIST_HEX || '').trim()
|
||||
const strict =
|
||||
env?.BARE_OS_PEER_ALLOWLIST_STRICT === '1' ||
|
||||
@@ -20,42 +104,33 @@ export function evaluateBareOsPeerAdmission(env, peerKeyHex, meta = undefined) {
|
||||
if (!raw) {
|
||||
if (strict) {
|
||||
base = {
|
||||
schema: 1,
|
||||
schema: ADMISSION_SCHEMA,
|
||||
verdict: 'deny',
|
||||
note:
|
||||
'BARE_OS_PEER_ALLOWLIST_STRICT is set but BARE_OS_PEER_ALLOWLIST_HEX is empty — no peers admitted.'
|
||||
}
|
||||
} else {
|
||||
base = {
|
||||
schema: 1,
|
||||
schema: ADMISSION_SCHEMA,
|
||||
verdict: 'allow',
|
||||
note: 'No allowlist; all peers admitted (subject to Hyperswarm topic).'
|
||||
}
|
||||
}
|
||||
} else {
|
||||
const want = String(peerKeyHex || '')
|
||||
.trim()
|
||||
.toLowerCase()
|
||||
.replace(/^0x/, '')
|
||||
const set = new Set(
|
||||
raw
|
||||
.split(/[\s,]+/)
|
||||
.map((s) => s.trim().toLowerCase().replace(/^0x/, ''))
|
||||
.filter(Boolean)
|
||||
)
|
||||
const set = keySetFromCommaHex(raw)
|
||||
const ok = want && set.has(want)
|
||||
base = {
|
||||
schema: 1,
|
||||
schema: ADMISSION_SCHEMA,
|
||||
verdict: ok ? 'allow' : 'deny',
|
||||
allowlistSize: set.size,
|
||||
strictProfile: strict || undefined,
|
||||
atMs: Date.now()
|
||||
atMs: atMs()
|
||||
}
|
||||
}
|
||||
|
||||
const classRaw = String(env?.BARE_OS_DHT_ADDRESS_CLASS_ALLOWLIST || '').trim()
|
||||
if (!classRaw) {
|
||||
if (base.atMs == null) base.atMs = Date.now()
|
||||
if (base.atMs == null) base.atMs = atMs()
|
||||
return base
|
||||
}
|
||||
|
||||
@@ -63,7 +138,7 @@ export function evaluateBareOsPeerAdmission(env, peerKeyHex, meta = undefined) {
|
||||
classRaw.split(',').map((s) => s.trim().toLowerCase()).filter(Boolean)
|
||||
)
|
||||
if (allowClasses.size === 0) {
|
||||
if (base.atMs == null) base.atMs = Date.now()
|
||||
if (base.atMs == null) base.atMs = atMs()
|
||||
return base
|
||||
}
|
||||
|
||||
@@ -73,7 +148,7 @@ export function evaluateBareOsPeerAdmission(env, peerKeyHex, meta = undefined) {
|
||||
if (!cls) {
|
||||
return {
|
||||
...base,
|
||||
atMs: base.atMs ?? Date.now(),
|
||||
atMs: base.atMs ?? atMs(),
|
||||
dhtAddressClassGate: {
|
||||
schema: 1,
|
||||
mode: 'no_peer_class_hint',
|
||||
@@ -84,13 +159,13 @@ export function evaluateBareOsPeerAdmission(env, peerKeyHex, meta = undefined) {
|
||||
|
||||
if (!allowClasses.has(cls)) {
|
||||
return {
|
||||
schema: 1,
|
||||
schema: ADMISSION_SCHEMA,
|
||||
verdict: 'deny',
|
||||
reason: 'dht_address_class',
|
||||
dhtAddressClass: cls,
|
||||
allowedClasses: [...allowClasses],
|
||||
note: 'Peer DHT address class not listed in BARE_OS_DHT_ADDRESS_CLASS_ALLOWLIST.',
|
||||
atMs: Date.now()
|
||||
atMs: atMs()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,7 +173,7 @@ export function evaluateBareOsPeerAdmission(env, peerKeyHex, meta = undefined) {
|
||||
|
||||
return {
|
||||
...base,
|
||||
atMs: base.atMs ?? Date.now(),
|
||||
atMs: base.atMs ?? atMs(),
|
||||
dhtAddressClassGate: { schema: 1, mode: 'allow', class: cls }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -372,7 +372,10 @@ export function buildBareOsRuntimeCaps(shellEnv, extra = {}) {
|
||||
jsonSchemasRepoArtifact: true,
|
||||
wave6OperatorProc: true,
|
||||
wave6SeedRpc: true,
|
||||
wave6BootPolicyV6: true
|
||||
wave6BootPolicyV6: true,
|
||||
ctxBareSubprocessSpawn:
|
||||
shellEnv.BARE_OS_CTX_BARE_SUBPROCESS_SPAWN === '1' ||
|
||||
shellEnv.BARE_OS_CTX_BARE_SUBPROCESS_SPAWN === 'true'
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ export function buildBareOsSyscallsProcJson(p) {
|
||||
namesCsv: bareOsPosixXshOpsCsv()
|
||||
},
|
||||
socketMsgSurface: {
|
||||
schema: 3,
|
||||
schema: 4,
|
||||
ancillaryControl: {
|
||||
supported: false,
|
||||
errno: 'ENOTSUP',
|
||||
@@ -45,17 +45,25 @@ export function buildBareOsSyscallsProcJson(p) {
|
||||
'msgHdr.cmsgs'
|
||||
],
|
||||
note:
|
||||
'Normative ENOTSUP before send when non-empty ancillary fields are present (binary control / controllen / non-SCM cmsgs) unless BARE_OS_POSIX_SOCKET_SCM_RIGHTS=1: then cmsgs/msgHdr.cmsgs may list only `{ fds: number[] }` SCM_RIGHTS-shaped objects (cap BARE_OS_POSIX_SOCKET_SCM_RIGHTS_MAX_FDS, default 4). sendmsg returns `scmRightsLocalDup: [{ from, to }]` for duplicated logical fds; recvmsg controllen stays 0. Unset env: ENOTSUP for any non-empty cmsgs without SCM flag.'
|
||||
'Binary/kernel ancillary buffers remain ENOTSUP. When BARE_OS_POSIX_SOCKET_SCM_RIGHTS=1, only JSON-shaped `{ fds: number[] }` entries in cmsgs/msgHdr.cmsgs are accepted (see logicalScmRightsOnSend).'
|
||||
},
|
||||
logicalScmRightsOnSend: {
|
||||
env: 'BARE_OS_POSIX_SOCKET_SCM_RIGHTS',
|
||||
maxFdsEnv: 'BARE_OS_POSIX_SOCKET_SCM_RIGHTS_MAX_FDS',
|
||||
parseModule: 'bare-os-socket-scm-rights.js',
|
||||
syscallResultField: 'scmRightsLocalDup',
|
||||
note:
|
||||
'Logical duplication of guest logical fds into new integer fds (same bridge slot / pipe target). Not host SCM_RIGHTS across a kernel boundary. recvmsg still reports controllen 0 — rights are returned on the sendmsg result only.'
|
||||
},
|
||||
sendmsg: {
|
||||
bridgePartial: true,
|
||||
defaultErrno: 'ENOTSUP',
|
||||
note: 'With BARE_OS_POSIX_SOCKET_FD_BRIDGE and SOCK_DGRAM, sendmsg flattens bounded iovs into one datagram; non-empty ancillary CMSGS rejected with ENOTSUP + ancillaryReject (schema 3).'
|
||||
note: 'With BARE_OS_POSIX_SOCKET_FD_BRIDGE, sendmsg flattens bounded iovs; ancillary per ancillaryControl + logicalScmRightsOnSend.'
|
||||
},
|
||||
recvmsg: {
|
||||
bridgePartial: true,
|
||||
defaultErrno: 'ENOTSUP',
|
||||
note: 'With bridge + SOCK_DGRAM, recvmsg returns buf + msgHdr.name from rinfo; SCM_RIGHTS / scatter iov / ancillary recv ENOTSUP-shaped (controllen 0).'
|
||||
note: 'recvmsg returns buf + msgHdr.name from peer/rinfo; controllen 0 (no queued ancillary on receive path).'
|
||||
}
|
||||
},
|
||||
errnoHints: bareOsErrnoTableForProc(),
|
||||
|
||||
@@ -40,6 +40,23 @@ function isShellBuiltin(cmd) {
|
||||
return SHELL_BUILTINS.has(cmd)
|
||||
}
|
||||
|
||||
/**
|
||||
* When `suspend-job` sets `stopped` on a background entry, yield between statements
|
||||
* until `fg` / `bg` clears it (cooperative logical job control; no host SIGTSTP).
|
||||
* @param {{ stopped?: boolean }} entry
|
||||
*/
|
||||
function waitWhileShellJobStopped(entry) {
|
||||
if (!entry || !entry.stopped) return Promise.resolve()
|
||||
return new Promise((resolve) => {
|
||||
const id = setInterval(() => {
|
||||
if (!entry.stopped) {
|
||||
clearInterval(id)
|
||||
resolve(undefined)
|
||||
}
|
||||
}, 10)
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Boot policy v4: comma list in `BARE_OS_BOOT_POLICY_DENY_EXEC_LINE_BUILTINS`.
|
||||
* @param {string} name
|
||||
@@ -1010,7 +1027,7 @@ function findCmdSubstClose(s, innerStart) {
|
||||
* @param {string} inner
|
||||
* @param {Record<string, string>} env
|
||||
*/
|
||||
async function expandCmdsubstPlaceholder(ctx, inner, env) {
|
||||
async function expandCmdsubstEmbedded(ctx, inner, env) {
|
||||
const ex = typeof ctx.execLine === 'function' ? ctx.execLine : null
|
||||
if (!ex) throw new Error('shell: cmdsubst: execLine unavailable')
|
||||
const maxLen =
|
||||
@@ -1049,7 +1066,7 @@ async function expandWordWithCmdSubst(ctx, s, env, depth = 0) {
|
||||
const inner = s.slice(i + 2, close)
|
||||
const pre = s.slice(0, i)
|
||||
const post = s.slice(close + 1)
|
||||
const mid = await expandCmdsubstPlaceholder(ctx, inner, env)
|
||||
const mid = await expandCmdsubstEmbedded(ctx, inner, env)
|
||||
const merged = pre + mid + post
|
||||
return expandWordWithCmdSubst(ctx, merged, env, depth + 1)
|
||||
}
|
||||
@@ -1567,12 +1584,19 @@ async function execParsedPipeline(ctx, pipeline) {
|
||||
origErr.call(ctx.console, 'fg: no such job')
|
||||
ctx.exitCode = 1
|
||||
} else {
|
||||
if (ctx.shellSessionState && typeof j.pgid === 'number') {
|
||||
ctx.shellSessionState.foregroundPgid = j.pgid
|
||||
}
|
||||
if (j.stopped) j.stopped = false
|
||||
try {
|
||||
await j.promise
|
||||
} catch {
|
||||
/* background errors already logged */
|
||||
}
|
||||
if (ctx.shellSessionState) {
|
||||
ctx.shellSessionState.foregroundPgid =
|
||||
ctx.shellSessionState.sid ?? 1
|
||||
}
|
||||
ctx.exitCode = 0
|
||||
}
|
||||
} else if (name === 'bg') {
|
||||
@@ -1905,9 +1929,21 @@ function scheduleBackgroundShell(ctx, toks) {
|
||||
.slice(0, 6)
|
||||
.join(' ')
|
||||
const childCtx = Object.assign({}, ctx)
|
||||
const promise = (async () => {
|
||||
/** @type {{ id: number, label: string, promise: Promise<string>, done: boolean, stopped: boolean, pgid: number, sid: number, jobControlModel: string }} */
|
||||
const entry = {
|
||||
id,
|
||||
label,
|
||||
promise: /** @type {Promise<string>} */ (Promise.resolve('pending')),
|
||||
done: false,
|
||||
stopped: false,
|
||||
pgid,
|
||||
sid,
|
||||
jobControlModel: 'logical_no_fork'
|
||||
}
|
||||
entry.promise = (async () => {
|
||||
const statements = splitTopLevelStatements(toks)
|
||||
for (const stmt of statements) {
|
||||
await waitWhileShellJobStopped(entry)
|
||||
if (!stmt.length) continue
|
||||
const r = await dispatchShellStatement(childCtx, stmt)
|
||||
if (r === 'exit') return r
|
||||
@@ -1915,19 +1951,8 @@ function scheduleBackgroundShell(ctx, toks) {
|
||||
syncBareOsExitStatusEnv(childCtx)
|
||||
return 'ok'
|
||||
})()
|
||||
/** @type {{ id: number, label: string, promise: Promise<string>, done: boolean, stopped: boolean, pgid: number, sid: number, jobControlModel: string }} */
|
||||
const entry = {
|
||||
id,
|
||||
label,
|
||||
promise,
|
||||
done: false,
|
||||
stopped: false,
|
||||
pgid,
|
||||
sid,
|
||||
jobControlModel: 'logical_no_fork'
|
||||
}
|
||||
ctx.shellBackgroundJobs.list.push(entry)
|
||||
promise.finally(() => {
|
||||
entry.promise.finally(() => {
|
||||
entry.done = true
|
||||
})
|
||||
ctx.console.error(`[${id}] (sid=${sid} pgid=${pgid}) ${label || '(job)'} &`)
|
||||
|
||||
@@ -1371,7 +1371,8 @@ test('buildBareOsSyscallsProcJson exposes posixLike fd mapping', async (t) => {
|
||||
t.ok(j.posixXsh.namesCsv.includes('sendmsg'))
|
||||
t.ok(j.posixXsh.namesCsv.includes('recvmsg'))
|
||||
t.ok(j.posixXsh.namesCsv.includes('shutdown'))
|
||||
t.is(j.socketMsgSurface?.schema, 3)
|
||||
t.is(j.socketMsgSurface?.schema, 4)
|
||||
t.is(j.socketMsgSurface?.logicalScmRightsOnSend?.syscallResultField, 'scmRightsLocalDup')
|
||||
t.is(j.socketMsgSurface?.ancillaryControl?.supported, false)
|
||||
t.is(j.socketMsgSurface?.ancillaryControl?.errno, 'ENOTSUP')
|
||||
t.ok(Array.isArray(j.socketMsgSurface?.ancillaryControl?.rejectKeys))
|
||||
@@ -2759,11 +2760,38 @@ test('evaluateBareOsPeerAdmission honors dhtAddressClass with allowlist', async
|
||||
const deny = evaluateBareOsPeerAdmission(env, 'aa', {
|
||||
dhtAddressClass: 'ipv6'
|
||||
})
|
||||
t.is(deny.schema, 2)
|
||||
t.is(deny.verdict, 'deny')
|
||||
const ok = evaluateBareOsPeerAdmission(env, 'aa', { dhtAddressClass: 'ipv4' })
|
||||
t.is(ok.schema, 2)
|
||||
t.is(ok.verdict, 'allow')
|
||||
})
|
||||
|
||||
test('evaluateBareOsPeerAdmission denylist wins over allowlist', async (t) => {
|
||||
const env = {
|
||||
BARE_OS_PEER_ALLOWLIST_HEX: 'aa,bb',
|
||||
BARE_OS_PEER_DENYLIST_HEX: 'bb'
|
||||
}
|
||||
t.is(evaluateBareOsPeerAdmission(env, 'bb').verdict, 'deny')
|
||||
t.is(evaluateBareOsPeerAdmission(env, 'bb').reason, 'peer_denylist')
|
||||
t.is(evaluateBareOsPeerAdmission(env, 'aa').verdict, 'allow')
|
||||
})
|
||||
|
||||
test('evaluateBareOsPeerAdmission BARE_OS_PEER_REQUIRE_CAPS_JSON', async (t) => {
|
||||
const env = {
|
||||
BARE_OS_PEER_REQUIRE_CAPS_JSON: '["seed","read"]'
|
||||
}
|
||||
t.is(
|
||||
evaluateBareOsPeerAdmission(env, 'k1', { caps: ['seed'] }).verdict,
|
||||
'deny'
|
||||
)
|
||||
t.is(
|
||||
evaluateBareOsPeerAdmission(env, 'k1', { caps: ['seed', 'read'] })
|
||||
.verdict,
|
||||
'allow'
|
||||
)
|
||||
})
|
||||
|
||||
test('BARE_OS_CTX_API_VERSION is semver-shaped', async (t) => {
|
||||
t.ok(/^\d+\.\d+\.\d+$/.test(BARE_OS_CTX_API_VERSION))
|
||||
})
|
||||
@@ -6632,11 +6660,16 @@ test('disk.os replication_operator_sketch mirrors blind v3 and hyperblobs env JS
|
||||
await drive.ready()
|
||||
const prevB = process.env.BARE_OS_BLIND_PEER_TOPOLOGY_V3_JSON
|
||||
const prevH = process.env.BARE_OS_HYPERBLOBS_STATS_JSON
|
||||
const prevP = process.env.BARE_OS_REPLICATION_PEER_PRIORITY_JSON
|
||||
process.env.BARE_OS_BLIND_PEER_TOPOLOGY_V3_JSON = JSON.stringify({
|
||||
schema: 3,
|
||||
hint: 't'
|
||||
})
|
||||
process.env.BARE_OS_HYPERBLOBS_STATS_JSON = JSON.stringify({ chunkCount: 4 })
|
||||
process.env.BARE_OS_REPLICATION_PEER_PRIORITY_JSON = JSON.stringify({
|
||||
schema: 1,
|
||||
orderedPeerKeyHex: ['aa', 'bb']
|
||||
})
|
||||
try {
|
||||
const bridge = createBareOsDiskOsBridge({
|
||||
drive,
|
||||
@@ -6650,11 +6683,15 @@ test('disk.os replication_operator_sketch mirrors blind v3 and hyperblobs env JS
|
||||
t.is(oj.schema, 4)
|
||||
t.is(oj.blindTopologySketchV3?.schema, 3)
|
||||
t.is(oj.hyperblobsDedupSketch?.chunkCount, 4)
|
||||
t.is(oj.peerPrioritySketch?.schema, 1)
|
||||
t.is(oj.peerPrioritySketch?.orderedPeerKeyHex?.length, 2)
|
||||
} finally {
|
||||
if (prevB === undefined) delete process.env.BARE_OS_BLIND_PEER_TOPOLOGY_V3_JSON
|
||||
else process.env.BARE_OS_BLIND_PEER_TOPOLOGY_V3_JSON = prevB
|
||||
if (prevH === undefined) delete process.env.BARE_OS_HYPERBLOBS_STATS_JSON
|
||||
else process.env.BARE_OS_HYPERBLOBS_STATS_JSON = prevH
|
||||
if (prevP === undefined) delete process.env.BARE_OS_REPLICATION_PEER_PRIORITY_JSON
|
||||
else process.env.BARE_OS_REPLICATION_PEER_PRIORITY_JSON = prevP
|
||||
}
|
||||
await store.close()
|
||||
rmSync(dir, { recursive: true, force: true })
|
||||
|
||||
@@ -43,6 +43,7 @@ const CONF = {
|
||||
BARE_OS_SPLIT_MAX_FILES: '10000',
|
||||
_POSIX_THREAD_ATTR_STACKSIZE: '65536',
|
||||
_SC_PAGESIZE: '4096',
|
||||
_SC_PAGE_SIZE: '4096',
|
||||
_SC_OPEN_MAX: '256',
|
||||
_SC_STREAM_MAX: '256',
|
||||
_SC_CHILD_MAX: '0',
|
||||
|
||||
@@ -87,6 +87,15 @@ async function evalTest(ctx, args) {
|
||||
return st != null && (testEffPermTriplet(st, euid, egid) & 2) !== 0
|
||||
if (op === '-x')
|
||||
return st != null && (testEffPermTriplet(st, euid, egid) & 1) !== 0
|
||||
if (st != null) {
|
||||
const m =
|
||||
typeof st.mode === 'number'
|
||||
? st.mode
|
||||
: Number.parseInt(String(st.mode || '0'), 8) || 0
|
||||
if (op === '-u') return (m & 0o4000) !== 0
|
||||
if (op === '-g') return (m & 0o2000) !== 0
|
||||
if (op === '-k') return (m & 0o1000) !== 0
|
||||
}
|
||||
if (op === '-s')
|
||||
return st != null && st.type === 'file' && Number(st.size) > 0
|
||||
if (op === '-z') return p.length === 0
|
||||
|
||||
@@ -4,6 +4,8 @@ Cross-package **version alignment** (ctx API, feature-bits doc, lifecycle schema
|
||||
|
||||
## Documentation (rolling)
|
||||
|
||||
- **Wire stack pins** — Re-verified **2026-04-05**: root **`package-lock.json`** hoisted **`protomux`** / **`hyperswarm`** versions still match [`packages/bare-os-booter/fixtures/protomux-hyperswarm-lock.json`](../packages/bare-os-booter/fixtures/protomux-hyperswarm-lock.json) (**`BARE_OS_PROTOMUX_CHANNEL_SCHEMA_VERSION`** unchanged).
|
||||
- **`BARE_OS_POSIX_PROFILE_VERSION` `1.0.13`** — `socketMsgSurface` schema **4** (`logicalScmRightsOnSend`); cooperative shell `fg` / `bg` / `suspend-job` with background yield between statements; handbook + matrix alignment (see [`bare-os-posix-profile.js`](lib/bare-os-posix-profile.js), [`docs/reference/posix-compliance-matrix.json`](../../docs/reference/posix-compliance-matrix.json)).
|
||||
- **`BARE_OS_POSIX_PROFILE_VERSION` `1.0.12`** — Guest **`/.bare`** sensitive-path policy, optional **`BARE_OS_PERSONAL_ACCT_PREFIX`** personal-drive layout, safe legacy-root migration (**`BARE_OS_PERSONAL_ROOT_MIGRATE`**, **`/.bare-os/migration/legacy-root-v1.json`**), **`BARE_OS_GUEST_SCRUB`**, shell **`set -o errexit`**, **`vfs.replication_warm_full_invalidate`** metric, and related **`getconf`** catalog keys (see [`bare-os-posix-profile.js`](lib/bare-os-posix-profile.js), [`docs/reference/posix-compliance-matrix.json`](../../docs/reference/posix-compliance-matrix.json)).
|
||||
- **`BARE_OS_POSIX_PROFILE_VERSION` `1.0.11`** — Adds **`nanosleep`**-shaped syscall, partial bridge **`getsockopt`/`setsockopt`** (**`SO_KEEPALIVE`**, **`TCP_NODELAY`**), Hyperswarm env caps, replication warm-cache invalidation env, and **`disk.os` `replication_operator_sketch` schema 4** notes (see [`bare-os-posix-profile.js`](lib/bare-os-posix-profile.js), [`docs/reference/posix-compliance-matrix.json`](../../docs/reference/posix-compliance-matrix.json)).
|
||||
- **`BARE_OS_POSIX_PROFILE_VERSION` `1.0.10`** — Declared profile bumps for passive UDP **`bind`**, **`poll`** monotonic clock note, expanded **`sysconf`** / **`getconf`** surface, and normative **`socketMsgSurface` / ancillary `ENOTSUP`** text (see [`bare-os-posix-profile.js`](lib/bare-os-posix-profile.js), [`docs/reference/posix-compliance-matrix.json`](../../docs/reference/posix-compliance-matrix.json)).
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*/
|
||||
|
||||
/** Semver for the documented POSIX-like surface (handbook ch.9 + environment appendix). */
|
||||
export const BARE_OS_POSIX_PROFILE_VERSION = '1.0.12'
|
||||
export const BARE_OS_POSIX_PROFILE_VERSION = '1.0.13'
|
||||
|
||||
/** Short identifier for telemetry and `/proc` mirrors. */
|
||||
export const BARE_OS_POSIX_PROFILE_ID = 'bare-os-posix-like'
|
||||
|
||||
@@ -132,6 +132,7 @@ const CONF = {
|
||||
BARE_OS_SPLIT_MAX_FILES: '10000',
|
||||
_POSIX_THREAD_ATTR_STACKSIZE: '65536',
|
||||
_SC_PAGESIZE: '4096',
|
||||
_SC_PAGE_SIZE: '4096',
|
||||
_SC_OPEN_MAX: '256',
|
||||
_SC_STREAM_MAX: '256',
|
||||
_SC_CHILD_MAX: '0',
|
||||
|
||||
@@ -176,6 +176,15 @@ async function evalTest(ctx, args) {
|
||||
return st != null && (testEffPermTriplet(st, euid, egid) & 2) !== 0
|
||||
if (op === '-x')
|
||||
return st != null && (testEffPermTriplet(st, euid, egid) & 1) !== 0
|
||||
if (st != null) {
|
||||
const m =
|
||||
typeof st.mode === 'number'
|
||||
? st.mode
|
||||
: Number.parseInt(String(st.mode || '0'), 8) || 0
|
||||
if (op === '-u') return (m & 0o4000) !== 0
|
||||
if (op === '-g') return (m & 0o2000) !== 0
|
||||
if (op === '-k') return (m & 0o1000) !== 0
|
||||
}
|
||||
if (op === '-s')
|
||||
return st != null && st.type === 'file' && Number(st.size) > 0
|
||||
if (op === '-z') return p.length === 0
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"schema": 2,
|
||||
"profileId": "bare-os-posix-like",
|
||||
"generatedAt": "2026-04-05T16:50:01.982Z",
|
||||
"generatedAt": "2026-04-05T17:14:22.726Z",
|
||||
"note": "Sparse POSIX Issue 7 coverage hints for /bin utilities. Omitted command names are not yet profiled here.",
|
||||
"commandIndex": [
|
||||
{
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"schemaVersion": 8,
|
||||
"ctxApiVersion": "1.48.0",
|
||||
"ctxApiVersion": "1.49.0",
|
||||
"posixProfile": {
|
||||
"id": "bare-os-posix-like",
|
||||
"version": "1.0.11"
|
||||
"version": "1.0.13"
|
||||
},
|
||||
"ops": ["readFile", "writeFile", "socket"],
|
||||
"opsDetail": [
|
||||
@@ -32,7 +32,7 @@
|
||||
"namesCsv": "open,close,read,write,readv,writev,getsockopt,setsockopt,lseek,nanosleep,pipe,dup,dup2,fcntl,poll,select,umask,socket,bind,listen,accept,connect,send,recv,recvfrom,sendmsg,recvmsg,shutdown"
|
||||
},
|
||||
"socketMsgSurface": {
|
||||
"schema": 3,
|
||||
"schema": 4,
|
||||
"ancillaryControl": {
|
||||
"supported": false,
|
||||
"errno": "ENOTSUP",
|
||||
@@ -43,7 +43,11 @@
|
||||
"msgHdr.control",
|
||||
"msgHdr.cmsgs"
|
||||
],
|
||||
"note": "Non-empty ancillary fields on sendmsg rejected; recvmsg controllen 0."
|
||||
"note": "Binary ancillary ENOTSUP; JSON SCM_RIGHTS-shaped cmsgs when BARE_OS_POSIX_SOCKET_SCM_RIGHTS=1."
|
||||
},
|
||||
"logicalScmRightsOnSend": {
|
||||
"env": "BARE_OS_POSIX_SOCKET_SCM_RIGHTS",
|
||||
"syscallResultField": "scmRightsLocalDup"
|
||||
},
|
||||
"sendmsg": { "bridgePartial": true, "defaultErrno": "ENOTSUP" },
|
||||
"recvmsg": { "bridgePartial": true, "defaultErrno": "ENOTSUP" }
|
||||
|
||||
@@ -1873,17 +1873,26 @@ async function bootTimed(ctx, label, fn, stageLog) {
|
||||
ctx.bareOsBootStageTimings = []
|
||||
}
|
||||
let monotonicNs
|
||||
let monotonicDeltaNs
|
||||
try {
|
||||
const bh = await import('bare-hrtime')
|
||||
const bg = bh && (bh.bigint || bh.default?.bigint)
|
||||
if (typeof bg === 'function') monotonicNs = String(bg.call(bh))
|
||||
if (typeof bg === 'function') {
|
||||
const now = bg.call(bh)
|
||||
monotonicNs = String(now)
|
||||
const prev = ctx.bareOsBootHrtimePrev
|
||||
if (typeof prev === 'bigint')
|
||||
monotonicDeltaNs = String(now - prev)
|
||||
ctx.bareOsBootHrtimePrev = now
|
||||
}
|
||||
} catch {
|
||||
/* optional native */
|
||||
}
|
||||
ctx.bareOsBootStageTimings.push({
|
||||
label,
|
||||
wallMs: ms,
|
||||
...(monotonicNs ? { monotonicNs } : {})
|
||||
...(monotonicNs ? { monotonicNs } : {}),
|
||||
...(monotonicDeltaNs ? { monotonicDeltaNs } : {})
|
||||
})
|
||||
}
|
||||
await maybeAppendBootTransactionJournal(ctx, {
|
||||
@@ -3048,7 +3057,9 @@ async function runKernelExtDropins(ctx, opts = {}) {
|
||||
continue
|
||||
}
|
||||
try {
|
||||
const extT0 = Date.now()
|
||||
await run(imgPath)
|
||||
const loadMs = Date.now() - extT0
|
||||
loadedSet.add(imgPath)
|
||||
if (Array.isArray(ranScripts)) ranScripts.push(imgPath)
|
||||
if (typeof ctx.bareOsRegisterKernelExtensionRecord === 'function') {
|
||||
@@ -3057,7 +3068,8 @@ async function runKernelExtDropins(ctx, opts = {}) {
|
||||
script: imgPath,
|
||||
id: ent.extId,
|
||||
dependsOn: ent.dependsOn,
|
||||
signaturePointer: ent.signaturePointer
|
||||
signaturePointer: ent.signaturePointer,
|
||||
loadMs
|
||||
})
|
||||
}
|
||||
} catch (e) {
|
||||
|
||||
@@ -1,12 +1,6 @@
|
||||
{
|
||||
"version": 1,
|
||||
"bundles": [
|
||||
{
|
||||
"path": "/lib/bare/bundles/b4a.js",
|
||||
"keys": [
|
||||
"b4a"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/safetyCatch.js",
|
||||
"keys": [
|
||||
@@ -19,6 +13,12 @@
|
||||
"hypercoreIdEncoding"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/b4a.js",
|
||||
"keys": [
|
||||
"b4a"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/compactEncoding.js",
|
||||
"keys": [
|
||||
@@ -31,12 +31,6 @@
|
||||
"protomux"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePath.js",
|
||||
"keys": [
|
||||
"barePath"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareUrl.js",
|
||||
"keys": [
|
||||
@@ -44,9 +38,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareEvents.js",
|
||||
"path": "/lib/bare/bundles/barePath.js",
|
||||
"keys": [
|
||||
"bareEvents"
|
||||
"barePath"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -55,6 +49,12 @@
|
||||
"bareEncoding"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareEvents.js",
|
||||
"keys": [
|
||||
"bareEvents"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareAbort.js",
|
||||
"keys": [
|
||||
@@ -67,12 +67,6 @@
|
||||
"bareAbortController"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareAnsiEscapes.js",
|
||||
"keys": [
|
||||
"bareAnsiEscapes"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareReadline.js",
|
||||
"keys": [
|
||||
@@ -80,9 +74,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareCrypto.js",
|
||||
"path": "/lib/bare/bundles/bareAnsiEscapes.js",
|
||||
"keys": [
|
||||
"bareCrypto"
|
||||
"bareAnsiEscapes"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -92,15 +86,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareAppKit.js",
|
||||
"path": "/lib/bare/bundles/bareCrypto.js",
|
||||
"keys": [
|
||||
"bareAppKit"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareApk.js",
|
||||
"keys": [
|
||||
"bareApk"
|
||||
"bareCrypto"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -110,9 +98,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareAssert.js",
|
||||
"path": "/lib/bare/bundles/bareAppKit.js",
|
||||
"keys": [
|
||||
"bareAssert"
|
||||
"bareAppKit"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -122,9 +110,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareBmp.js",
|
||||
"path": "/lib/bare/bundles/bareAssert.js",
|
||||
"keys": [
|
||||
"bareBmp"
|
||||
"bareAssert"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareApk.js",
|
||||
"keys": [
|
||||
"bareApk"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -134,9 +128,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareBuffer.js",
|
||||
"path": "/lib/bare/bundles/bareBmp.js",
|
||||
"keys": [
|
||||
"bareBuffer"
|
||||
"bareBmp"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -145,18 +139,18 @@
|
||||
"bareBundleCompile"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareBluetoothApple.js",
|
||||
"keys": [
|
||||
"bareBluetoothApple"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareBundle.js",
|
||||
"keys": [
|
||||
"bareBundle"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareBuffer.js",
|
||||
"keys": [
|
||||
"bareBuffer"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareBundleEvaluate.js",
|
||||
"keys": [
|
||||
@@ -164,9 +158,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareConsole.js",
|
||||
"path": "/lib/bare/bundles/bareBluetoothApple.js",
|
||||
"keys": [
|
||||
"bareConsole"
|
||||
"bareBluetoothApple"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -175,24 +169,18 @@
|
||||
"bareBoot"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareDaemon.js",
|
||||
"keys": [
|
||||
"bareDaemon"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareBundleId.js",
|
||||
"keys": [
|
||||
"bareBundleId"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareChannel.js",
|
||||
"keys": [
|
||||
"bareChannel"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareDelta.js",
|
||||
"keys": [
|
||||
"bareDelta"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareDebugLog.js",
|
||||
"keys": [
|
||||
@@ -200,15 +188,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareDaemon.js",
|
||||
"path": "/lib/bare/bundles/bareConsole.js",
|
||||
"keys": [
|
||||
"bareDaemon"
|
||||
"bareConsole"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareDns.js",
|
||||
"path": "/lib/bare/bundles/bareChannel.js",
|
||||
"keys": [
|
||||
"bareDns"
|
||||
"bareChannel"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -218,9 +206,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareCov.js",
|
||||
"path": "/lib/bare/bundles/bareDelta.js",
|
||||
"keys": [
|
||||
"bareCov"
|
||||
"bareDelta"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareDns.js",
|
||||
"keys": [
|
||||
"bareDns"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -241,6 +235,12 @@
|
||||
"bareDgram"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareCov.js",
|
||||
"keys": [
|
||||
"bareCov"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareFfmpeg.js",
|
||||
"keys": [
|
||||
@@ -259,18 +259,18 @@
|
||||
"bareFormat"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareGif.js",
|
||||
"keys": [
|
||||
"bareGif"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareFormData.js",
|
||||
"keys": [
|
||||
"bareFormData"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareGif.js",
|
||||
"keys": [
|
||||
"bareGif"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareFileLogger.js",
|
||||
"keys": [
|
||||
@@ -283,18 +283,18 @@
|
||||
"bareHeif"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareGtk.js",
|
||||
"keys": [
|
||||
"bareGtk"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareHrtime.js",
|
||||
"keys": [
|
||||
"bareHrtime"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareGtk.js",
|
||||
"keys": [
|
||||
"bareGtk"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareHttpParser.js",
|
||||
"keys": [
|
||||
@@ -320,9 +320,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareInspect.js",
|
||||
"path": "/lib/bare/bundles/bareHttp1.js",
|
||||
"keys": [
|
||||
"bareInspect"
|
||||
"bareHttp1"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -332,9 +332,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareHttp1.js",
|
||||
"path": "/lib/bare/bundles/bareInspect.js",
|
||||
"keys": [
|
||||
"bareHttp1"
|
||||
"bareInspect"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -356,9 +356,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareLief.js",
|
||||
"path": "/lib/bare/bundles/bareLogger.js",
|
||||
"keys": [
|
||||
"bareLief"
|
||||
"bareLogger"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -368,9 +368,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareLogger.js",
|
||||
"path": "/lib/bare/bundles/bareLief.js",
|
||||
"keys": [
|
||||
"bareLogger"
|
||||
"bareLief"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -385,12 +385,6 @@
|
||||
"bareMake"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareModuleResolve.js",
|
||||
"keys": [
|
||||
"bareModuleResolve"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareModuleLexer.js",
|
||||
"keys": [
|
||||
@@ -398,9 +392,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareNdk.js",
|
||||
"path": "/lib/bare/bundles/bareModuleResolve.js",
|
||||
"keys": [
|
||||
"bareNdk"
|
||||
"bareModuleResolve"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -410,15 +404,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareNative.js",
|
||||
"path": "/lib/bare/bundles/bareNdk.js",
|
||||
"keys": [
|
||||
"bareNative"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareMedia.js",
|
||||
"keys": [
|
||||
"bareMedia"
|
||||
"bareNdk"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -428,9 +416,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareOs.js",
|
||||
"path": "/lib/bare/bundles/bareNative.js",
|
||||
"keys": [
|
||||
"bareOs"
|
||||
"bareNative"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareNodeFetch.js",
|
||||
"keys": [
|
||||
"bareNodeFetch"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -446,27 +440,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareNodeFetch.js",
|
||||
"path": "/lib/bare/bundles/bareOs.js",
|
||||
"keys": [
|
||||
"bareNodeFetch"
|
||||
"bareOs"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePerformance.js",
|
||||
"path": "/lib/bare/bundles/bareMedia.js",
|
||||
"keys": [
|
||||
"barePerformance"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePng.js",
|
||||
"keys": [
|
||||
"barePng"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePackDrive.js",
|
||||
"keys": [
|
||||
"barePackDrive"
|
||||
"bareMedia"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -476,15 +458,21 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePipe.js",
|
||||
"path": "/lib/bare/bundles/barePackDrive.js",
|
||||
"keys": [
|
||||
"barePipe"
|
||||
"barePackDrive"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePrebuild.js",
|
||||
"path": "/lib/bare/bundles/barePng.js",
|
||||
"keys": [
|
||||
"barePrebuild"
|
||||
"barePng"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePerformance.js",
|
||||
"keys": [
|
||||
"barePerformance"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -493,12 +481,24 @@
|
||||
"bareNodeRuntime"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePipe.js",
|
||||
"keys": [
|
||||
"barePipe"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePunycode.js",
|
||||
"keys": [
|
||||
"barePunycode"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePrebuild.js",
|
||||
"keys": [
|
||||
"barePrebuild"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareQuerystring.js",
|
||||
"keys": [
|
||||
@@ -511,12 +511,6 @@
|
||||
"bareQueueMicrotask"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareProcess.js",
|
||||
"keys": [
|
||||
"bareProcess"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareDev.js",
|
||||
"keys": [
|
||||
@@ -524,9 +518,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePromClient.js",
|
||||
"path": "/lib/bare/bundles/bareProcess.js",
|
||||
"keys": [
|
||||
"barePromClient"
|
||||
"bareProcess"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -535,42 +529,24 @@
|
||||
"bareRealm"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/barePromClient.js",
|
||||
"keys": [
|
||||
"barePromClient"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareRuntime.js",
|
||||
"keys": [
|
||||
"bareRuntime"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareRepl.js",
|
||||
"keys": [
|
||||
"bareRepl"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareSemver.js",
|
||||
"keys": [
|
||||
"bareSemver"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareSdl.js",
|
||||
"keys": [
|
||||
"bareSdl"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareSignals.js",
|
||||
"keys": [
|
||||
"bareSignals"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareSidecar.js",
|
||||
"keys": [
|
||||
"bareSidecar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareRpc.js",
|
||||
"keys": [
|
||||
@@ -578,15 +554,21 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareStorage.js",
|
||||
"path": "/lib/bare/bundles/bareSemver.js",
|
||||
"keys": [
|
||||
"bareStorage"
|
||||
"bareSemver"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareStdio.js",
|
||||
"path": "/lib/bare/bundles/bareRepl.js",
|
||||
"keys": [
|
||||
"bareStdio"
|
||||
"bareRepl"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareSignals.js",
|
||||
"keys": [
|
||||
"bareSignals"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -596,9 +578,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareStringDecoder.js",
|
||||
"path": "/lib/bare/bundles/bareSidecar.js",
|
||||
"keys": [
|
||||
"bareStringDecoder"
|
||||
"bareSidecar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareStorage.js",
|
||||
"keys": [
|
||||
"bareStorage"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -608,15 +596,21 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareSvg.js",
|
||||
"path": "/lib/bare/bundles/bareStdio.js",
|
||||
"keys": [
|
||||
"bareSvg"
|
||||
"bareStdio"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareStructuredClone.js",
|
||||
"path": "/lib/bare/bundles/bareStringDecoder.js",
|
||||
"keys": [
|
||||
"bareStructuredClone"
|
||||
"bareStringDecoder"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareSvg.js",
|
||||
"keys": [
|
||||
"bareSvg"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -632,21 +626,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareSubprocess.js",
|
||||
"path": "/lib/bare/bundles/bareStructuredClone.js",
|
||||
"keys": [
|
||||
"bareSubprocess"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareTiff.js",
|
||||
"keys": [
|
||||
"bareTiff"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareTimers.js",
|
||||
"keys": [
|
||||
"bareTimers"
|
||||
"bareStructuredClone"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -655,6 +637,12 @@
|
||||
"bareTcp"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareTiff.js",
|
||||
"keys": [
|
||||
"bareTiff"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareThread.js",
|
||||
"keys": [
|
||||
@@ -662,9 +650,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareTpl.js",
|
||||
"path": "/lib/bare/bundles/bareSubprocess.js",
|
||||
"keys": [
|
||||
"bareTpl"
|
||||
"bareSubprocess"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareTimers.js",
|
||||
"keys": [
|
||||
"bareTimers"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -674,9 +668,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareTls.js",
|
||||
"path": "/lib/bare/bundles/bareTpl.js",
|
||||
"keys": [
|
||||
"bareTls"
|
||||
"bareTpl"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -686,9 +680,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareTty.js",
|
||||
"path": "/lib/bare/bundles/bareTls.js",
|
||||
"keys": [
|
||||
"bareTty"
|
||||
"bareTls"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -698,15 +692,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareUnpack.js",
|
||||
"path": "/lib/bare/bundles/bareTty.js",
|
||||
"keys": [
|
||||
"bareUnpack"
|
||||
"bareTty"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareUnionBundle.js",
|
||||
"path": "/lib/bare/bundles/bareUnpack.js",
|
||||
"keys": [
|
||||
"bareUnionBundle"
|
||||
"bareUnpack"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -733,12 +727,24 @@
|
||||
"bareWebp"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareUtils.js",
|
||||
"keys": [
|
||||
"bareUtils"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareWhich.js",
|
||||
"keys": [
|
||||
"bareWhich"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareUnionBundle.js",
|
||||
"keys": [
|
||||
"bareUnionBundle"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareWebKitGtk.js",
|
||||
"keys": [
|
||||
@@ -751,12 +757,6 @@
|
||||
"bareV8ToIstanbul"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareUtils.js",
|
||||
"keys": [
|
||||
"bareUtils"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/lib/bare/bundles/bareWinUi.js",
|
||||
"keys": [
|
||||
@@ -1595,8 +1595,8 @@
|
||||
],
|
||||
"bundleProvenance": {
|
||||
"schemaVersion": 1,
|
||||
"generatedAt": "2026-04-05T16:50:02.874Z",
|
||||
"gitCommit": "c4781e02c0730f182d3eccdbd7f49ae7e10dbe53",
|
||||
"generatedAt": "2026-04-05T17:14:23.559Z",
|
||||
"gitCommit": "e89c55da251dba14cf177202fde08bb972dd04a5",
|
||||
"nodeVersion": "v22.22.0",
|
||||
"bundleTier": "all",
|
||||
"normativeManifest": "packages/bare-os-booter/lib/bare-module-manifest.json",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"atMs": 1775407801982,
|
||||
"atMs": 1775409262725,
|
||||
"commands": [
|
||||
"arch",
|
||||
"awk",
|
||||
|
||||
@@ -1822,17 +1822,26 @@ async function bootTimed(ctx, label, fn, stageLog) {
|
||||
ctx.bareOsBootStageTimings = []
|
||||
}
|
||||
let monotonicNs
|
||||
let monotonicDeltaNs
|
||||
try {
|
||||
const bh = await import('bare-hrtime')
|
||||
const bg = bh && (bh.bigint || bh.default?.bigint)
|
||||
if (typeof bg === 'function') monotonicNs = String(bg.call(bh))
|
||||
if (typeof bg === 'function') {
|
||||
const now = bg.call(bh)
|
||||
monotonicNs = String(now)
|
||||
const prev = ctx.bareOsBootHrtimePrev
|
||||
if (typeof prev === 'bigint')
|
||||
monotonicDeltaNs = String(now - prev)
|
||||
ctx.bareOsBootHrtimePrev = now
|
||||
}
|
||||
} catch {
|
||||
/* optional native */
|
||||
}
|
||||
ctx.bareOsBootStageTimings.push({
|
||||
label,
|
||||
wallMs: ms,
|
||||
...(monotonicNs ? { monotonicNs } : {})
|
||||
...(monotonicNs ? { monotonicNs } : {}),
|
||||
...(monotonicDeltaNs ? { monotonicDeltaNs } : {})
|
||||
})
|
||||
}
|
||||
await maybeAppendBootTransactionJournal(ctx, {
|
||||
@@ -2997,7 +3006,9 @@ async function runKernelExtDropins(ctx, opts = {}) {
|
||||
continue
|
||||
}
|
||||
try {
|
||||
const extT0 = Date.now()
|
||||
await run(imgPath)
|
||||
const loadMs = Date.now() - extT0
|
||||
loadedSet.add(imgPath)
|
||||
if (Array.isArray(ranScripts)) ranScripts.push(imgPath)
|
||||
if (typeof ctx.bareOsRegisterKernelExtensionRecord === 'function') {
|
||||
@@ -3006,7 +3017,8 @@ async function runKernelExtDropins(ctx, opts = {}) {
|
||||
script: imgPath,
|
||||
id: ent.extId,
|
||||
dependsOn: ent.dependsOn,
|
||||
signaturePointer: ent.signaturePointer
|
||||
signaturePointer: ent.signaturePointer,
|
||||
loadMs
|
||||
})
|
||||
}
|
||||
} catch (e) {
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -79,6 +79,19 @@ function main() {
|
||||
'compatibility-matrix.md must document syscalls.json schema ' + syscallSchema
|
||||
)
|
||||
|
||||
const genPath = 'docs/reference/ctx-client-helper.generated.ts'
|
||||
if (fs.existsSync(path.join(root, genPath))) {
|
||||
const genRaw = read(genPath)
|
||||
const genM = genRaw.match(
|
||||
/BARE_OS_CTX_API_CLIENT_VERSION = '([^']+)'/
|
||||
)
|
||||
must(genM, 'parse BARE_OS_CTX_API_CLIENT_VERSION from ' + genPath + ' failed')
|
||||
must(
|
||||
genM[1] === ctxVer,
|
||||
`${genPath} BARE_OS_CTX_API_CLIENT_VERSION ${genM[1]} !== bare-os-ctx-api.js ${ctxVer} (run node scripts/gen-ctx-client-helper.mjs)`
|
||||
)
|
||||
}
|
||||
|
||||
console.log('verify-doc-contracts: OK')
|
||||
}
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ If you are **changing** `/bin`, the booter, or the kernel image, use the [develo
|
||||
2. [Install and repository layout](02-install-and-repository-layout.md) — clone, `npm ci`, workspaces at a glance.
|
||||
3. [Running seeder and booter](03-running-seeder-and-booter.md) — Node versus Pear, two terminals, npm scripts.
|
||||
4. [Shell, PATH, and scripts](04-shell-path-and-scripts.md) — how commands run without diving into the full `ctx` API.
|
||||
5. [Home, identity, and vault](05-home-identity-and-vault.md) — guest session, `login`, vault snapshots, HDMS in brief.
|
||||
5. [Home, identity, and vault](05-home-identity-and-vault.md) — guest session, `login`, vault snapshots, HDMS in brief. Deeper trust notes: [Vault threat model](../docs/security/vault-threat-model.md).
|
||||
6. [Help, man, and the documentation map](06-help-man-and-documentation-map.md) — `man`, `help`, and where each doc tree fits.
|
||||
7. [Troubleshooting and operations](07-troubleshooting-and-operations.md) — common failures, environment variables, where to read next.
|
||||
8. [Further reading](08-further-reading.md) — curated links into the handbook and reference.
|
||||
|
||||
Reference in New Issue
Block a user