@ai-ecoverse/slicc-bios 1.25.0 → 1.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -105,7 +105,7 @@ A local folder can be mounted into seven as on Linux ([#73](https://github.com/a
105
105
 
106
106
  [slicc-agent](https://github.com/ai-ecoverse/slicc-agent) and its dependencies (about 100 packages, most of them provider SDKs) aren't part of the first boot either. They are a separate pnpm project, [`src/packages/agent/`](src/packages/agent/), installed like the grammars, so the BIOS boots as fast as without an agent. slicc-agent takes `@ai-ecoverse/slicc-kernel` as a peer, so the project pins the same kernel as the base set, and a test keeps the two pins equal. Its `pnpm-workspace.yaml` overrides `@google/genai` and `esbuild` to nothing (`'-'`): a Bedrock turn never loads them, and dropping them and their trees takes `/opt/agent` from 99 packages to 58. Seven's pnpm reads overrides only from the workspace file, so the installer copies it into `/opt/agent` next to the lockfile:
107
107
 
108
- 1. **After every update check,** `os/agent.js` compares the deployed `packages/agent/pnpm-lock.yaml` with `var/lib/slicc/agent/pnpm-lock.yaml`. If they differ, it writes the manifest (merged with the user's layer, see [Your packages](#your-packages)) and lockfile to `/opt/agent` and runs `pnpm install --frozen-lockfile --trust-lockfile` there under its own Web Lock, `slicc-agent-install`. The **Agent** row of [Install / Update](#install--update) shows pnpm's progress: *Downloading n of m* while pnpm fetches packages (reused from its store or downloaded), then *Linking n of m* once it starts adding them, because pnpm adds nothing until the fetching is done. Only once pnpm succeeds does it record the lockfile. A failed install shows the error, pnpm's log and **Retry**, and the next check tries again.
108
+ 1. **After every update check,** `os/agent.js` compares the deployed `packages/agent/pnpm-lock.yaml` with `var/lib/slicc/agent/pnpm-lock.yaml`. If they differ, it writes the manifest (merged with the user's layer, see [Your packages](#your-packages)) and lockfile to `/opt/agent` and runs `pnpm install --frozen-lockfile --trust-lockfile` there under its own Web Lock, `slicc-agent-install`. The **Agent** row of [Install / Update](#install--update) shows pnpm's progress: *Downloading n of m* while pnpm fetches packages (reused from its store or downloaded), then *Linking n of m* once it starts adding them, because pnpm adds nothing until the fetching is done. While pnpm downloads a large tarball it prints `Downloading <package>: <done>/<total>` about once a second, and its count line can stay at `resolved 1` all that time. bios keeps the latest of those lines for each package, in pnpm's decimal units (`B`, `kB`, `MB`, `GB`), and sends their sums as the progress's `bytes: { done, total }` while any are downloading (slicc-spectrum#445 fills the bar by them). Downloads stay counted after their lines leave the log window. The grammars, Tailscale and the optional catalog share this. Only once pnpm succeeds does it record the lockfile. A failed install shows the error, pnpm's log and **Retry**, and the next check tries again.
109
109
  2. **Once it's installed,** the page imports `page.js` and `spectrum/index.js` from `/opt/agent/node_modules/@ai-ecoverse/slicc-agent/dist/`. `startAgent` takes the Web Lock `slicc-agent`, starts `agent-worker.js` from there as a module worker and hands it a port to the page's kernel, so the agent's `bash`, `read`, `write` and `edit` run on the same kernel and files as the terminal. The page swaps in `createAgentModel()` when the worker connects. On later loads the agent starts at once, before any network check, so chat works offline. If another tab owns the agent, this tab has terminals and files only.
110
110
  3. **The conversation** is kept in SQLite in OPFS (`/.slicc/agent/`).
111
111
 
@@ -175,6 +175,7 @@ The Files panel lists `/opt/grammars/node_modules` but doesn't scan it.
175
175
  Below the system rows, Install / Update offers **Optional packages** (spectrum ≥ 1.42.0): tools that seven doesn't preinstall, each at the version the homescoop coordinator certified. The catalog is [`src/packages/optional/`](src/packages/optional/): `package.json` pins each package exactly, `package-lock.json` (made with `npm install --package-lock-only --ignore-scripts`, never installed) holds its integrity, and `catalog.json` gives its id, label, description, commands, tarball size and `requires`. A test keeps the three in step. Today it offers git, the GitHub CLI, OpenSSH, `slicc` (see [Sevens this kernel follows](#network)), Python, the Python data tools (numpy, pandas and matplotlib), Node.js (slicc-jsh's `node` and `jsh`), `sliccy:browser` for `.jsh` scripts, Ruby, Perl, Biome, the PDF tools (poppler), qpdf, rsync, screen, SQLite, dig, websocat, ntfy, GnuPG, fnox, mcpcat (an MCP client) and ImageMagick. ImageMagick is homescoop's HEIF build (`wasm-imagemagick-heif`, a superset of the plain build, which isn't offered), with `magick`, `convert`, `mogrify`, `identify` and `magick-open`, and it reads HEIC and AVIF. A failed write leaves an existing target as it was. Its known issues: writing over another user's 0666 file in a sticky directory such as `/tmp` fails with `Operation not permitted`, though writing your own files works ([homescoop#1258](https://github.com/ai-ecoverse/homescoop/issues/1258)); `.mpc` writes fail with `cache resources exhausted` ([homescoop#1208](https://github.com/ai-ecoverse/homescoop/issues/1208)); and the cert's coverage gaps, among them the no-encoder fallback and MPC's two-file write ([homescoop#1209](https://github.com/ai-ecoverse/homescoop/issues/1209)). sudo for `magick`, `convert` or `mogrify` is offered once, never always, since they write files. No two catalog entries provide the same command, so an install never shadows another entry's.
176
176
 
177
177
  - **Install** runs `pnpm add -g <package>@<version>` in the page's kernel, as a user would, under the Web Lock `slicc-optional`, so the commands work at once in every open shell. pnpm 12 gives each global add its own project under `$PNPM_HOME/global/v11/`; bios reads `PNPM_HOME` from the kernel's environment. Afterwards `os/packages.js` reads that project's `pnpm-lock.yaml`: every package in it, the one added and each dependency, must be a version in the catalog's lockfile or the base set's, with that integrity. homescoop pins `@ai-ecoverse/*` dependencies exactly (uv → Python, git → bash), so the catalog's lockfile names them all. Anything else, a dependency pnpm resolved to another version included, removes the package again and fails the row with *This version doesn't match the tested build*. An entry's `requires` (uv needs Python) are installed first. A package's kernel command always wins over the same package's Node `bin`. After each install and update, for every name that a package declares both in `slicc.commands` and in `bin`, bios removes the link that pnpm made in `$PNPM_HOME/bin`, but only when that link points into this package, so `mcpcat` runs `/usr/bin/mcpcat`, not a `#!/usr/bin/env node` script with no Node to run it. Another package's bins are never touched, and a package with only a `bin` keeps it. `/opt/user` (Your packages) isn't affected: its bins are not on `PATH`. A project entry also **updates** a required package that's older than the catalog's before it installs, since it runs on the catalog's version: the data tools override their own Python away, and their builds need the catalog's Python. A global add brings its own pinned dependencies, so it leaves an older required package as it is.
178
+ - **Progress:** a row shows pnpm's package counts once pnpm counts more than one package. Before that, a single package, such as Python, still shows its download in bytes, from pnpm's `Downloading` lines (see [Agent](#agent)). Without either the bar is indeterminate.
178
179
  - **State** comes from pnpm's global projects, not from a list of bios's own, so a package installed by hand shows as installed with its version. One older than the catalog's offers **Update**, which adds the catalog's version; one at or above it offers **Remove**. bios never downgrades.
179
180
  - **Remove** runs `pnpm remove -g <package>`. It asks first only when another installed entry needs it (*Remove Node.js (jsh)? Browser for jsh scripts needs it and stops working until Node.js (jsh) is back.*, accent); otherwise it doesn't ask, since pnpm's global projects hold no user data and the package can be installed again. A cancelled confirm changes nothing.
180
181
  - **Readable by everyone:** after every pnpm install of `/opt/agent`, `/opt/grammars` and an optional project in `/opt/slicc`, bios makes that tree readable by everyone, as root: one `find` selects the files without `a+r`, the executables without `a+x` and the directories without `a+x`, and runs `chmod a+rX` on only those, so a tree of 15,000 entries with one `0600` file pays for one walk and one `chmod`, not 15,000. pnpm writes some files `0600`, such as `node_modules/.pnpm-workspace-state-v1.json`, and with kernel users every user must be able to read seven's installed packages. An install from before this runs the same pass once at its next check, marked by `var/lib/slicc/<project>/readable`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-bios",
3
- "version": "1.25.0",
3
+ "version": "1.26.0",
4
4
  "description": "Slim loader that boots SLICC into OPFS and serves the UI from there",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -46,7 +46,7 @@
46
46
  "@ai-ecoverse/slicc-browsers": "1.8.5",
47
47
  "@ai-ecoverse/slicc-node": "2.5.1",
48
48
  "@ai-ecoverse/slicc-shared-web": "1.24.2",
49
- "@ai-ecoverse/slicc-spectrum": "1.89.2",
49
+ "@ai-ecoverse/slicc-spectrum": "1.90.0",
50
50
  "@ai-ecoverse/slicc-vault": "1.12.2",
51
51
  "@biomejs/biome": "2.5.15",
52
52
  "es-module-lexer": "3.0.3",
@@ -10,7 +10,7 @@
10
10
  "@ai-ecoverse/slicc-cdp": "1.30.2",
11
11
  "@ai-ecoverse/slicc-clipboard": "1.0.2",
12
12
  "@ai-ecoverse/slicc-kernel": "1.128.0",
13
- "@ai-ecoverse/slicc-spectrum": "1.89.2",
13
+ "@ai-ecoverse/slicc-spectrum": "1.90.0",
14
14
  "@ai-ecoverse/wasi-pnpm": "12.9.1-13",
15
15
  "@ai-ecoverse/wasi-ripgrep": "15.2.0-5",
16
16
  "@ai-ecoverse/wasm-bash": "5.3.0-19",
@@ -80,9 +80,9 @@
80
80
  }
81
81
  },
82
82
  "node_modules/@ai-ecoverse/slicc-spectrum": {
83
- "version": "1.89.2",
84
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/slicc-spectrum/-/slicc-spectrum-1.89.2.tgz",
85
- "integrity": "sha512-4jaRJwFp+KmqW5mDjbYd9MInkxh/KwkfWrNyHrDwnn4YRJ2R1cq+eV3Cbhwposj75u+rVh/NlPnexBeJp1d9FA==",
83
+ "version": "1.90.0",
84
+ "resolved": "https://registry.npmjs.org/@ai-ecoverse/slicc-spectrum/-/slicc-spectrum-1.90.0.tgz",
85
+ "integrity": "sha512-A3yl0H2bAwi5/AFnitNmkZ2NjGmRywhlndfKCXhln2b5hmPXeEkzlr5YcqvP/KRiuNlEddNAzCx/IcVUbQbSNg==",
86
86
  "license": "Apache-2.0",
87
87
  "engines": {
88
88
  "node": ">=24"
@@ -7,7 +7,7 @@
7
7
  "@ai-ecoverse/slicc-cdp": "1.30.2",
8
8
  "@ai-ecoverse/slicc-clipboard": "1.0.2",
9
9
  "@ai-ecoverse/slicc-kernel": "1.128.0",
10
- "@ai-ecoverse/slicc-spectrum": "1.89.2",
10
+ "@ai-ecoverse/slicc-spectrum": "1.90.0",
11
11
  "@ai-ecoverse/wasi-pnpm": "12.9.1-13",
12
12
  "@ai-ecoverse/wasi-ripgrep": "15.2.0-5",
13
13
  "@ai-ecoverse/wasm-bash": "5.3.0-19",
@@ -21,8 +21,8 @@ importers:
21
21
  specifier: 1.128.0
22
22
  version: 1.128.0
23
23
  '@ai-ecoverse/slicc-spectrum':
24
- specifier: 1.89.2
25
- version: 1.89.2
24
+ specifier: 1.90.0
25
+ version: 1.90.0
26
26
  '@ai-ecoverse/wasi-pnpm':
27
27
  specifier: 12.9.1-13
28
28
  version: 12.9.1-13
@@ -112,8 +112,8 @@ packages:
112
112
  resolution: {integrity: sha512-zj4hVv8H0cNrwbMs8NcFX2jFQ9mFE1uK+Yv0+4cTzHS6ploQH4HSySv62oWjAyBl+XRfhXJZNyZoXE5hL+d8nA==}
113
113
  engines: {node: '>=24'}
114
114
 
115
- '@ai-ecoverse/slicc-spectrum@1.89.2':
116
- resolution: {integrity: sha512-4jaRJwFp+KmqW5mDjbYd9MInkxh/KwkfWrNyHrDwnn4YRJ2R1cq+eV3Cbhwposj75u+rVh/NlPnexBeJp1d9FA==}
115
+ '@ai-ecoverse/slicc-spectrum@1.90.0':
116
+ resolution: {integrity: sha512-A3yl0H2bAwi5/AFnitNmkZ2NjGmRywhlndfKCXhln2b5hmPXeEkzlr5YcqvP/KRiuNlEddNAzCx/IcVUbQbSNg==}
117
117
  engines: {node: '>=24'}
118
118
  peerDependencies:
119
119
  '@shikijs/langs': 4.5.0
@@ -208,7 +208,7 @@ snapshots:
208
208
 
209
209
  '@ai-ecoverse/slicc-kernel@1.128.0': {}
210
210
 
211
- '@ai-ecoverse/slicc-spectrum@1.89.2': {}
211
+ '@ai-ecoverse/slicc-spectrum@1.90.0': {}
212
212
 
213
213
  '@ai-ecoverse/wasi-pnpm@12.9.1-13': {}
214
214