@ai-ecoverse/slicc-bios 1.34.0 → 1.35.1

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
@@ -199,6 +199,8 @@ The Files panel lists `/opt/grammars/node_modules` but doesn't scan it.
199
199
 
200
200
  #### Optional packages
201
201
 
202
+ **Release notes (slicc-spectrum#458):** each update check also gives the Kernel, UI, Agent and Tailscale rows a `releases` list from their GitHub repositories (`slicc-kernel`, `slicc-spectrum`, `slicc-agent`, `wasm-tailscale`), and each optional package one from the repository its npm version document names, when that is on GitHub ([`os/releases.js`](src/seed/releases.js)). A row gets the release it has installed and every newer one up to the version it offers, newest first, at most 30. Each release has its `version` (the tag without the `v`, or without the package's name in a shared repository such as homescoop), its `url` and its `notes`, the release body unchanged (the `<!-- cert-verify -->` block included, which spectrum turns into a Certified badge) up to 64 KB. Spectrum renders the notes; bios only fetches them. bios asks GitHub's unauthenticated API (`/repos/<repo>/releases?per_page=100`, page by page down to the installed version, at most 5 pages), without credentials, a referrer or any header but `Accept` and `If-None-Match`. It keeps each list in IndexedDB (`slicc-releases`) for a day and revalidates it with its ETag at every check, and GitHub doesn't count a 304 against its 60 requests an hour. A 403 or 429 backs off until `Retry-After`, the rate limit's reset or 15 minutes, and leaves `releases` out, so the row looks as it does without notes, with no error. The page sets no `connect-src`, so these requests need no change to its CSP.
203
+
202
204
  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), zip (Info-ZIP's `zip`, `unzip` and `zipinfo`), xxd (vim's hex dump, with `xxd -r`) and ImageMagick. zip's `unzip` refuses an entry whose name isn't UTF-8 (an old Latin-1 or CP437 archive without a Unicode path): it says `cannot create <name>` / `Illegal byte sequence`, extracts the other entries and exits 50, and `unzip -l` still lists the entry. It never extracts it under a changed name, and `unzip -p` still streams its bytes ([homescoop#1174](https://github.com/ai-ecoverse/homescoop/issues/1174)). 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.
203
205
 
204
206
  - **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 certified catalog package's agent skills reach every cone the same way. After the install or update, for each folder its `package.json` lists in `pi.skills`, bios links each skill in it into `/usr/share/skills/<name>`, through the kernel and as root, so no cone can change what the agent loads. The folder has to resolve inside the package; the skill's folder name has to match `^[a-z0-9][a-z0-9-]*$` and equal its `SKILL.md` `name`; and it mustn't collide with a built-in or with an entry it didn't make. The skill files are made readable by everyone (`a+rX`). bios records its links in `var/lib/slicc/optional/<id>/skills`, removes the ones an update drops, and removes all of them on Remove. A skipped skill is logged and never fails the install. The agent's rule stands: it doesn't scan root's global pnpm, so a user's `pnpm add -g` can't add skills. 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.
@@ -564,7 +566,7 @@ It runs twice: in `ci / test` for quick feedback, and as cert-review's code chec
564
566
 
565
567
  ### The npm package
566
568
 
567
- `@ai-ecoverse/slicc-bios` on npm carries only the manifests a consumer needs to test against what seven ships: `src/packages/package.json`, `package-lock.json`, `pnpm-lock.yaml` and `certs.json`, `src/packages/agent/package.json` and `pnpm-lock.yaml`, and `src/packages/optional/package.json`, `package-lock.json` and `catalog.json`. It has no runtime code and no dependencies, and those paths stay where they are. [`.github/workflows/release.yml`](.github/workflows/release.yml) releases it from `main` only: semantic-release reads the conventional commits, tags `v<version>` and writes the GitHub release, then `npm publish --provenance` publishes the tag at HEAD through npm's trusted publishing on a GitHub-hosted runner, retrying, and skipping a version npm already has. So re-running the workflow on main publishes a tag whose publish failed. The deploy to seven (`deploy.yml`) is separate and doesn't wait for it.
569
+ `@ai-ecoverse/slicc-bios` on npm carries only the manifests a consumer needs to test against what seven ships: `src/packages/package.json`, `package-lock.json`, `pnpm-lock.yaml` and `certs.json`, `src/packages/agent/package.json` and `pnpm-lock.yaml`, and `src/packages/optional/package.json`, `package-lock.json` and `catalog.json`. It has no runtime code and no dependencies, and those paths stay where they are. [`.github/workflows/release.yml`](.github/workflows/release.yml) releases it from `main` only: semantic-release reads the conventional commits, tags `v<version>` and writes the GitHub release, then `npm publish --provenance` publishes the tag at HEAD through npm's trusted publishing on a GitHub-hosted runner, retrying, and skipping a version npm already has. So re-running the workflow on main publishes a tag whose publish failed. The step then waits until npm serves the version, up to about 8 minutes with a growing backoff, since npm's listing can lag a publish by a minute or more ([`scripts/ci/served.mjs`](scripts/ci/served.mjs)). It passes only once npm's `dist.integrity` equals the tarball's from `npm pack --dry-run`, or, when only the gzip differs because another runner packed it, once the served tarball's tar equals the packed one byte for byte. A version npm serves with other contents fails at once, and one npm never serves fails after the wait. Every `npm view` answer, and `npm publish`'s output, is in the log. The deploy to seven (`deploy.yml`) is separate and doesn't wait for it.
568
570
 
569
571
  ## Develop
570
572
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-bios",
3
- "version": "1.34.0",
3
+ "version": "1.35.1",
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",
@@ -4,6 +4,6 @@
4
4
  "description": "SLICC's agent, which the UI installs with pnpm in the background into /opt/agent in OPFS",
5
5
  "dependencies": {
6
6
  "@ai-ecoverse/slicc-agent": "6.15.1",
7
- "@ai-ecoverse/slicc-kernel": "1.136.1"
7
+ "@ai-ecoverse/slicc-kernel": "1.138.0"
8
8
  }
9
9
  }
@@ -15,10 +15,10 @@ importers:
15
15
  dependencies:
16
16
  '@ai-ecoverse/slicc-agent':
17
17
  specifier: 6.15.1
18
- version: 6.15.1(@ai-ecoverse/slicc-kernel@1.136.1)(@aws-sdk/credential-provider-node@3.972.84)(@smithy/signature-v4@5.7.4)(ws@8.22.0)
18
+ version: 6.15.1(@ai-ecoverse/slicc-kernel@1.138.0)(@aws-sdk/credential-provider-node@3.972.84)(@smithy/signature-v4@5.7.4)(ws@8.22.0)
19
19
  '@ai-ecoverse/slicc-kernel':
20
- specifier: 1.136.1
21
- version: 1.136.1
20
+ specifier: 1.138.0
21
+ version: 1.138.0
22
22
 
23
23
  packages:
24
24
 
@@ -36,8 +36,8 @@ packages:
36
36
  resolution: {integrity: sha512-WVaDUiZbd5nwG03+2WoQ8YA8ATC2mkx1DRCWpLuMFBNnyN0cd5IRoGF6KYNjMkXvBQCvZZxP+gwffrpmHYJ/cQ==}
37
37
  engines: {node: '>=24'}
38
38
 
39
- '@ai-ecoverse/slicc-kernel@1.136.1':
40
- resolution: {integrity: sha512-OIrL7sWfPIM+uyUQxqpwfYKiMX+lc58kcR8gx1zYi9R0I8UTcsMCKXJsW+VrFHcCqXY/7G3YE/9LB9I0VTJtXQ==}
39
+ '@ai-ecoverse/slicc-kernel@1.138.0':
40
+ resolution: {integrity: sha512-p5cdX1mB6xed1NcRGe0Uifm3NVx8d3YXzA2kLYH2d7HtcSwjvmOU566SUaUKBtbgwXHRAC5gAfW1QoD6/fAiOQ==}
41
41
  engines: {node: '>=24'}
42
42
 
43
43
  '@ai-ecoverse/slicc-vault@1.14.0':
@@ -346,10 +346,10 @@ packages:
346
346
 
347
347
  snapshots:
348
348
 
349
- '@ai-ecoverse/slicc-agent@6.15.1(@ai-ecoverse/slicc-kernel@1.136.1)(@aws-sdk/credential-provider-node@3.972.84)(@smithy/signature-v4@5.7.4)(ws@8.22.0)':
349
+ '@ai-ecoverse/slicc-agent@6.15.1(@ai-ecoverse/slicc-kernel@1.138.0)(@aws-sdk/credential-provider-node@3.972.84)(@smithy/signature-v4@5.7.4)(ws@8.22.0)':
350
350
  dependencies:
351
351
  '@ai-ecoverse/slicc-browsers': 1.9.2
352
- '@ai-ecoverse/slicc-kernel': 1.136.1
352
+ '@ai-ecoverse/slicc-kernel': 1.138.0
353
353
  '@ai-ecoverse/slicc-vault': 1.14.0
354
354
  '@aws-sdk/middleware-websocket': 3.972.54
355
355
  '@earendil-works/chord': 1.3.0
@@ -372,7 +372,7 @@ snapshots:
372
372
 
373
373
  '@ai-ecoverse/slicc-browsers@1.9.2': {}
374
374
 
375
- '@ai-ecoverse/slicc-kernel@1.136.1': {}
375
+ '@ai-ecoverse/slicc-kernel@1.138.0': {}
376
376
 
377
377
  '@ai-ecoverse/slicc-vault@1.14.0': {}
378
378
 
@@ -7,9 +7,9 @@
7
7
  "name": "slicc-bios-packages",
8
8
  "dependencies": {
9
9
  "@ai-ecoverse/slicc-browsers": "1.10.3",
10
- "@ai-ecoverse/slicc-cdp": "1.30.14",
10
+ "@ai-ecoverse/slicc-cdp": "1.30.18",
11
11
  "@ai-ecoverse/slicc-clipboard": "1.0.2",
12
- "@ai-ecoverse/slicc-kernel": "1.136.1",
12
+ "@ai-ecoverse/slicc-kernel": "1.138.0",
13
13
  "@ai-ecoverse/slicc-spectrum": "1.101.0",
14
14
  "@ai-ecoverse/wasi-fnox": "1.39.0-5",
15
15
  "@ai-ecoverse/wasi-pnpm": "12.9.1-17",
@@ -47,9 +47,9 @@
47
47
  }
48
48
  },
49
49
  "node_modules/@ai-ecoverse/slicc-cdp": {
50
- "version": "1.30.14",
51
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/slicc-cdp/-/slicc-cdp-1.30.14.tgz",
52
- "integrity": "sha512-mKJjIRfNJTvZbUAhN7dPgT1EMR5ahTgl9wJ8rQSBhOm/61QzRUWhcqlCWzP3Q9O2PZfbJ33fpRdqYjzL5CqpYg==",
50
+ "version": "1.30.18",
51
+ "resolved": "https://registry.npmjs.org/@ai-ecoverse/slicc-cdp/-/slicc-cdp-1.30.18.tgz",
52
+ "integrity": "sha512-8aty5CgO3hPiZ0H8ikx60j1QzTWJmr6MGRKAFy9DMDrU/nwqPnifx1UXLX6AW6GdvDsZdRR9NpAV2A4hWfj4ZA==",
53
53
  "license": "Apache-2.0",
54
54
  "workspaces": [
55
55
  "packages/sliccy-browser"
@@ -72,9 +72,9 @@
72
72
  }
73
73
  },
74
74
  "node_modules/@ai-ecoverse/slicc-kernel": {
75
- "version": "1.136.1",
76
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/slicc-kernel/-/slicc-kernel-1.136.1.tgz",
77
- "integrity": "sha512-OIrL7sWfPIM+uyUQxqpwfYKiMX+lc58kcR8gx1zYi9R0I8UTcsMCKXJsW+VrFHcCqXY/7G3YE/9LB9I0VTJtXQ==",
75
+ "version": "1.138.0",
76
+ "resolved": "https://registry.npmjs.org/@ai-ecoverse/slicc-kernel/-/slicc-kernel-1.138.0.tgz",
77
+ "integrity": "sha512-p5cdX1mB6xed1NcRGe0Uifm3NVx8d3YXzA2kLYH2d7HtcSwjvmOU566SUaUKBtbgwXHRAC5gAfW1QoD6/fAiOQ==",
78
78
  "license": "Apache-2.0",
79
79
  "engines": {
80
80
  "node": ">=24"
@@ -4,9 +4,9 @@
4
4
  "description": "Packages the BIOS installs from npm into OPFS, pinned by package-lock.json and pnpm-lock.yaml",
5
5
  "dependencies": {
6
6
  "@ai-ecoverse/slicc-browsers": "1.10.3",
7
- "@ai-ecoverse/slicc-cdp": "1.30.14",
7
+ "@ai-ecoverse/slicc-cdp": "1.30.18",
8
8
  "@ai-ecoverse/slicc-clipboard": "1.0.2",
9
- "@ai-ecoverse/slicc-kernel": "1.136.1",
9
+ "@ai-ecoverse/slicc-kernel": "1.138.0",
10
10
  "@ai-ecoverse/slicc-spectrum": "1.101.0",
11
11
  "@ai-ecoverse/wasi-fnox": "1.39.0-5",
12
12
  "@ai-ecoverse/wasi-pnpm": "12.9.1-17",
@@ -12,14 +12,14 @@ importers:
12
12
  specifier: 1.10.3
13
13
  version: 1.10.3
14
14
  '@ai-ecoverse/slicc-cdp':
15
- specifier: 1.30.14
16
- version: 1.30.14
15
+ specifier: 1.30.18
16
+ version: 1.30.18
17
17
  '@ai-ecoverse/slicc-clipboard':
18
18
  specifier: 1.0.2
19
19
  version: 1.0.2
20
20
  '@ai-ecoverse/slicc-kernel':
21
- specifier: 1.136.1
22
- version: 1.136.1
21
+ specifier: 1.138.0
22
+ version: 1.138.0
23
23
  '@ai-ecoverse/slicc-spectrum':
24
24
  specifier: 1.101.0
25
25
  version: 1.101.0
@@ -102,8 +102,8 @@ packages:
102
102
  resolution: {integrity: sha512-xUKkpE0oqtUGjObJSzrk7ny2rU8ZStoUp4Uxw2SPM6f7uw+M7X8MV0NuSyqkWYTzZJ6JPWyVJx0QvynSBXHPOw==}
103
103
  engines: {node: '>=24'}
104
104
 
105
- '@ai-ecoverse/slicc-cdp@1.30.14':
106
- resolution: {integrity: sha512-mKJjIRfNJTvZbUAhN7dPgT1EMR5ahTgl9wJ8rQSBhOm/61QzRUWhcqlCWzP3Q9O2PZfbJ33fpRdqYjzL5CqpYg==}
105
+ '@ai-ecoverse/slicc-cdp@1.30.18':
106
+ resolution: {integrity: sha512-8aty5CgO3hPiZ0H8ikx60j1QzTWJmr6MGRKAFy9DMDrU/nwqPnifx1UXLX6AW6GdvDsZdRR9NpAV2A4hWfj4ZA==}
107
107
  engines: {node: '>=24'}
108
108
  hasBin: true
109
109
 
@@ -111,8 +111,8 @@ packages:
111
111
  resolution: {integrity: sha512-p7b1h85qkiU0LKjNLCLiU7GVXjGigkyR2+VUCInM1cZo2yjLFxr7tGAOO09e6OG9nB7XKiQn3W88wb3s0gxy+g==}
112
112
  engines: {node: '>=24', slicc-kernel: '>=1.75.0'}
113
113
 
114
- '@ai-ecoverse/slicc-kernel@1.136.1':
115
- resolution: {integrity: sha512-OIrL7sWfPIM+uyUQxqpwfYKiMX+lc58kcR8gx1zYi9R0I8UTcsMCKXJsW+VrFHcCqXY/7G3YE/9LB9I0VTJtXQ==}
114
+ '@ai-ecoverse/slicc-kernel@1.138.0':
115
+ resolution: {integrity: sha512-p5cdX1mB6xed1NcRGe0Uifm3NVx8d3YXzA2kLYH2d7HtcSwjvmOU566SUaUKBtbgwXHRAC5gAfW1QoD6/fAiOQ==}
116
116
  engines: {node: '>=24'}
117
117
 
118
118
  '@ai-ecoverse/slicc-spectrum@1.101.0':
@@ -209,11 +209,11 @@ snapshots:
209
209
 
210
210
  '@ai-ecoverse/slicc-browsers@1.10.3': {}
211
211
 
212
- '@ai-ecoverse/slicc-cdp@1.30.14': {}
212
+ '@ai-ecoverse/slicc-cdp@1.30.18': {}
213
213
 
214
214
  '@ai-ecoverse/slicc-clipboard@1.0.2': {}
215
215
 
216
- '@ai-ecoverse/slicc-kernel@1.136.1': {}
216
+ '@ai-ecoverse/slicc-kernel@1.138.0': {}
217
217
 
218
218
  '@ai-ecoverse/slicc-spectrum@1.101.0': {}
219
219