@ai-ecoverse/slicc-bios 1.41.6 → 1.42.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
|
@@ -437,9 +437,16 @@ seven can also join a tailnet, with a patched build of Tailscale's wasm client (
|
|
|
437
437
|
- **Chat (`pi`):** with View, the follower opens `OPEN { kind: 'pi' }` and gets the owner's agent, the same replicated chat a follower tab has. The owner bridges the stream to `owner.port({ readOnly, pages: false, device })` with slicc-agent's `bridgePort` (agent ≥ 3.32.0; `device`, the link's id, from 5.9.0), read-only unless the device has Control, and without `pages`, so a follower's agent can't drive the owner's panels. The follower builds its `AgentConnection` with `linkEndpoint` and `connectAgent`, and spectrum's agent model on top. The stream carries slicc-agent's frames: a `u32` length, a `u8` tag (data, hello or close) and the payload. Without Control, a send, steer or stop is refused by the owner's agent with `EACCES`, and the chat shows that it watches only. Changing Control resets the stream, so the follower reconnects with the new access, and losing View resets it with `EACCES`. The follower installs `/opt/agent` itself, for `page.js` and the agent model, in a kernel it starts only for that install. Linked devices shows *Watching* while a follower's chat is open. A failed connection is tried again after 2 s, except when the owner runs another agent version: `connectAgent` then rejects with `EVERSION` (slicc-agent ≥ 5.5.2), and the follower shows the agent's sentence as bios's own warning (`follow:other-agent-version`, not dismissable) and makes no further attempt in that follow session. Meanwhile its follow port's state carries the sentence as `refused` (spectrum ≥ 1.85.0): the top-bar light turns neutral and reads *Can’t follow <owner>*, the chat drops its *Watch only* note, and the page stays read-only. A later follow session that connects clears it, and the warning with it.
|
|
438
438
|
- **Terminals (`terminal`):** with View and Terminal, the follower's Terminal panel opens shells in the owner's kernel. Each one is `OPEN { kind: 'terminal', cols, rows, cwd? }`, and the owner runs `bash -i` there with its own terminals' prompt, as the same user its own terminals use (root today, so Terminal is a root shell on the owner's SLICC), and answers OPENED `{ pid }`. Both directions then carry records, each a `u32` length, a `u8` type and a payload: `0` terminal bytes, `1` a resize as `{ cols, rows }` JSON, `2` a signal name (`INT`, `TSTP`, `QUIT`, `HUP`), and, from the owner only, `3` the shell's exit status as a decimal string, just before END. A bad record or size resets the stream with `EPROTO` or `EINVAL`. The follower's END closes the shell, and the owner ends the stream when the shell exits. Linked devices shows *Terminal open* while one runs (`terminals`), and turning Terminal or View off resets every open shell with `EACCES`.
|
|
439
439
|
- **Names:** both sides call themselves `SLICC on <platform>` (`navigator.userAgentData.platform`). When two show the same name, the first four hex digits of the certificate fingerprint are added.
|
|
440
|
-
- **Sevens this kernel follows (the in-kernel `slicc`):** the optional `slicc` package (`@ai-ecoverse/wasi-slicc`, slicc-cli's client commands built for `wasip1`) runs `slicc <join-url> prompt|watch|abort` in seven's terminal against another seven's agent, as slicc-cli's README specifies in §1.4 and §5.16. The program never touches WebRTC, the hub or the join state: it reaches the page's **link facade** at `SLICC_LINK_URL` (`tcp://127.0.0.1:7400`), which `os/os.js` declares with `createKernel({ facades: { link: { port: 7400, hook } } })` (`os/facade.js`, slicc-kernel ≥ 1.90.0), and the page follows that seven's tray for it (`os/leaders.js`).
|
|
440
|
+
- **Sevens this kernel follows (the in-kernel `slicc`):** the optional `slicc` package (`@ai-ecoverse/wasi-slicc`, slicc-cli's client commands built for `wasip1`) runs `slicc <join-url> prompt|watch|abort` in seven's terminal against another seven's agent, and `slicc tray` against this seven's own tray, as slicc-cli's README specifies in §1.4 and §5.16. The program never touches WebRTC, the hub or the join state: it reaches the page's **link facade** at `SLICC_LINK_URL` (`tcp://127.0.0.1:7400`), which `os/os.js` declares with `createKernel({ facades: { link: { port: 7400, hook } } })` (`os/facade.js`, slicc-kernel ≥ 1.90.0), and the page follows that seven's tray for it (`os/leaders.js`).
|
|
441
441
|
- **Who may:** only under kernel users `enforce`, and only root and members of `sudo` (cones), as the kernel's stamp on the connection says. A scoop gets `EACCES` and a `connect` denial in `denials.log`; under `off` and `report` everyone gets `EACCES`.
|
|
442
442
|
- **The facade:** one connection per stream, in records of a `u8` type (`1` control, `2` data, `3` end), a `u32` length and the payload. The first record is `{ v: 1, join, open }`, and the page answers `{ opened }` or `{ reset: 'ERRNO: message' }`. Only `kind: 'agent'` with `prompt`, `watch` or `abort` opens, with only the fields those take. A long prompt (`length`) is answered at once, read whole, and sent on with the length of what it became. After that, only a `reset` may come as control, and it passes on just its errno.
|
|
443
|
+
- **This seven's own tray (`slicc tray`):** a first record `{ v: 1, open: { kind: 'tray', op } }`, with no `join`, gets one control record, `{ opened }` or a `reset`, and the page closes the connection (`os/facade.js`, `trayRequests`).
|
|
444
|
+
- **`status`:** `{ tray, error?, hub?, exit, devices }`. `tray` is the tray's state. `hub` is the hub's origin. `exit` is the Network port's exit. `devices` keeps only `id`, `name`, `kind`, `host`, `address`, `mode`, `offers`, `policy`, `exit`, `state` and `access`. It never carries the join, follow or webhook URL or `joinCommand`; any of those inside `error` reads `<join-url>`.
|
|
445
|
+
- **`url`:** `{ url }`, the join URL, while the tray is `ready`; otherwise `ENOTCONN`. It's the only answer with the join URL.
|
|
446
|
+
- **`rotate`, `unlink` and `retry`:** go to the Network port's `rotateJoinUrl`, `unlink` and `retryLinks`, then answer `{}`. `unlink` takes a device's exact `id`, else `ENOENT`; slicc matches prefixes.
|
|
447
|
+
- **Refusals:** another op, a `join`, or `unlink` without an `id` is `EINVAL`. A seven without a tray answers `EOPNOTSUPP`.
|
|
448
|
+
- **Approval:** from a caller who isn't root, `url`, `rotate` and `unlink` wait for the owner. They go into bios's own approvals as `{ kind: 'tray', op, requester, device?, createdAt, expiresAt }`, which spectrum shows as "Share this seven's join URL?", "Make a new join URL?" or "Unlink {device}?". There is no Always allow. Only Allow once approves. Deny, or 5 minutes without an answer, is `EACCES: the owner didn't approve this`. A caller who hangs up withdraws its request, and an approval that arrives after it left runs nothing. Root, `status` and `retry` aren't asked.
|
|
449
|
+
- **Tests:** `test/integration/tray-cli.test.mjs` runs the real `slicc tray` from the catalog in seven's terminal. It covers list, `--json`, `url` (root not asked, a cone approved and denied), `rotate`, `retry`, `unlink` by prefix, a hung-up `rotate` withdrawn, a scoop refused, and a raw `status` answer with no join or webhook URL.
|
|
443
450
|
- **Secrets:** while the vault holds values, every outgoing prompt passes its scrubber (`redact`, on an agent-role port of the page's own), so a value leaves as its placeholder. While the scrubber is locked, the answer is `EACCES: unlock the vault to continue`.
|
|
444
451
|
- **The link:** the page attaches as runtime `slicc-link/1`, so the other seven treats it as a CLI: it needs **Allow remote control** for this device in its Linked devices. The other seven decides that on every stream, so a grant counts on the next run without a new link, and its `EACCES` reaches `slicc` with that hint. The page's HELLO has `caps: []` and a fresh `node`, it opens only `agent` streams, and it refuses every stream the other seven opens with `EACCES`.
|
|
445
452
|
- **Following:** there is one link per join URL. The first run dials it (45 s, with retries after 1, 2 and 5 s while it waits). From then on, the owner tab follows that seven: it keeps the link up, dials it again when it drops, with a backoff of 1, 2, 5, 10, 30 and then 60 s, and dials every kept leader again when seven boots. While nothing waits on it, a dial asks the hub once and backs off when that seven isn't on its tray, instead of polling. A tab hidden for 10 minutes stops dialling until it's shown or a run needs the link.
|
|
@@ -553,7 +560,7 @@ Seven certifies a gated package (slicc-kernel, slicc-cdp, slicc-clipboard, slicc
|
|
|
553
560
|
- **Automerge once CI is green:** Renovate turns on auto-merge, so a PR goes through the merge queue once its required checks, `ci / integration` and `ci / review`, are green (see [CI](#ci)). No bot writes to a Renovate branch: the shipped lockfiles are part of what seven certifies, so a certified pin needs no `certs.json` line.
|
|
554
561
|
- **Known breaks** are `packageRules` with `allowedVersions`, each with its reason and issue in `description`. Today the only one is wasi-pnpm skipping the deprecated 12.9.1-11 and 12.9.1-12 (homescoop#1128). wasm-bash's hold below 5.3.0-20 went with the pin of kernel 1.135.2, which has slicc-kernel#1146. bash 5.3.0-20 and later count as certified only with kernel 1.130.2 or later (homescoop#1230), and -21 declares `engines.slicc-kernel >=1.130.2`. `test/integration/renovate.test.mjs` checks the config, the gate and the queue in plain node.
|
|
555
562
|
|
|
556
|
-
`test/integration/sweep.test.mjs`, the base-set sweep, runs with the other integration tests. It boots the BIOS, checks that each base-set package in OPFS has the version `package-lock.json` pins, and runs every command its `slicc.commands` lists with `--version` or a trivial call under `timeout 60`, then real grep, egrep, sed -i, xz, jq, find, xargs, diff, cmp, patch, awk, gzip, bzip2 and tar work. Each command is its own subtest named `<package> · <call>`. The clipboard commands run `--help` (`xclip -help`). Known exits: `false` 1, `bunzip2`/`bzcat --version` 2 (upstream), `i --version` 2 (argument parsing; 126 is #495), and `chcon`/`runcon` 1 (listed by coreutils, not built: "unknown program"). `[` runs as bash's builtin, since `timeout` can't exec it.
|
|
563
|
+
`test/integration/sweep.test.mjs`, the base-set sweep, runs with the other integration tests. It boots the BIOS, checks that each base-set package in OPFS has the version `package-lock.json` pins, and runs every command its `slicc.commands` lists with `--version` or a trivial call under `timeout 60`, then real grep, egrep, sed -i, xz, jq, find, xargs, diff, cmp, patch, awk, gzip, bzip2 and tar work. Each command is its own subtest named `<package> · <call>`. The clipboard commands, `sccopy` and `scpaste` included, run `--help` (`xclip -help`). Known exits: `false` 1, `bunzip2`/`bzcat --version` 2 (upstream), `i --version` 2 (argument parsing; 126 is #495), and `chcon`/`runcon` 1 (listed by coreutils, not built: "unknown program"). `[` runs as bash's builtin, since `timeout` can't exec it.
|
|
557
564
|
|
|
558
565
|
### The npm package
|
|
559
566
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-ecoverse/slicc-bios",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.42.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",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"@ai-ecoverse/slicc-spectrum": "1.104.1",
|
|
51
51
|
"@ai-ecoverse/slicc-vault": "1.16.1",
|
|
52
52
|
"@biomejs/biome": "2.5.15",
|
|
53
|
-
"es-module-lexer": "3.0.
|
|
53
|
+
"es-module-lexer": "3.0.4",
|
|
54
54
|
"fake-indexeddb": "6.2.5",
|
|
55
55
|
"lefthook": "2.2.1",
|
|
56
56
|
"modern-tar": "0.8.5",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"dependencies": {
|
|
9
9
|
"@ai-ecoverse/slicc-browsers": "1.18.1",
|
|
10
10
|
"@ai-ecoverse/slicc-cdp": "1.34.1",
|
|
11
|
-
"@ai-ecoverse/slicc-clipboard": "1.
|
|
11
|
+
"@ai-ecoverse/slicc-clipboard": "1.1.1",
|
|
12
12
|
"@ai-ecoverse/slicc-kernel": "1.153.0",
|
|
13
13
|
"@ai-ecoverse/slicc-spectrum": "1.104.1",
|
|
14
14
|
"@ai-ecoverse/wasi-fnox": "1.39.0-6",
|
|
@@ -62,10 +62,14 @@
|
|
|
62
62
|
}
|
|
63
63
|
},
|
|
64
64
|
"node_modules/@ai-ecoverse/slicc-clipboard": {
|
|
65
|
-
"version": "1.
|
|
66
|
-
"resolved": "https://registry.npmjs.org/@ai-ecoverse/slicc-clipboard/-/slicc-clipboard-1.
|
|
67
|
-
"integrity": "sha512-
|
|
65
|
+
"version": "1.1.1",
|
|
66
|
+
"resolved": "https://registry.npmjs.org/@ai-ecoverse/slicc-clipboard/-/slicc-clipboard-1.1.1.tgz",
|
|
67
|
+
"integrity": "sha512-MggIwJR4jDNNxN5y9bsnNkYuEeVQeUqeYaenIgDRRKWSN/yKIiCx4OujpsIkLE6iF4k1rGnD2zVg6FbS0nR1ug==",
|
|
68
68
|
"license": "Apache-2.0",
|
|
69
|
+
"bin": {
|
|
70
|
+
"sccopy": "host/sccopy.mjs",
|
|
71
|
+
"scpaste": "host/scpaste.mjs"
|
|
72
|
+
},
|
|
69
73
|
"engines": {
|
|
70
74
|
"node": ">=24",
|
|
71
75
|
"slicc-kernel": ">=1.75.0"
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@ai-ecoverse/slicc-browsers": "1.18.1",
|
|
7
7
|
"@ai-ecoverse/slicc-cdp": "1.34.1",
|
|
8
|
-
"@ai-ecoverse/slicc-clipboard": "1.
|
|
8
|
+
"@ai-ecoverse/slicc-clipboard": "1.1.1",
|
|
9
9
|
"@ai-ecoverse/slicc-kernel": "1.153.0",
|
|
10
10
|
"@ai-ecoverse/slicc-spectrum": "1.104.1",
|
|
11
11
|
"@ai-ecoverse/wasi-fnox": "1.39.0-6",
|
|
@@ -15,8 +15,8 @@ importers:
|
|
|
15
15
|
specifier: 1.34.1
|
|
16
16
|
version: 1.34.1
|
|
17
17
|
'@ai-ecoverse/slicc-clipboard':
|
|
18
|
-
specifier: 1.
|
|
19
|
-
version: 1.
|
|
18
|
+
specifier: 1.1.1
|
|
19
|
+
version: 1.1.1
|
|
20
20
|
'@ai-ecoverse/slicc-kernel':
|
|
21
21
|
specifier: 1.153.0
|
|
22
22
|
version: 1.153.0
|
|
@@ -107,9 +107,10 @@ packages:
|
|
|
107
107
|
engines: {node: '>=24'}
|
|
108
108
|
hasBin: true
|
|
109
109
|
|
|
110
|
-
'@ai-ecoverse/slicc-clipboard@1.
|
|
111
|
-
resolution: {integrity: sha512-
|
|
110
|
+
'@ai-ecoverse/slicc-clipboard@1.1.1':
|
|
111
|
+
resolution: {integrity: sha512-MggIwJR4jDNNxN5y9bsnNkYuEeVQeUqeYaenIgDRRKWSN/yKIiCx4OujpsIkLE6iF4k1rGnD2zVg6FbS0nR1ug==}
|
|
112
112
|
engines: {node: '>=24', slicc-kernel: '>=1.75.0'}
|
|
113
|
+
hasBin: true
|
|
113
114
|
|
|
114
115
|
'@ai-ecoverse/slicc-kernel@1.153.0':
|
|
115
116
|
resolution: {integrity: sha512-t3HYo8sUNqStArqjdmIeI3HHM2+99xUE+AtepQuZiGmCZjyj9nWZ6cX9R3DZGTv/S24ypUZXTJ0mYDBfQ3X1NQ==}
|
|
@@ -211,7 +212,7 @@ snapshots:
|
|
|
211
212
|
|
|
212
213
|
'@ai-ecoverse/slicc-cdp@1.34.1': {}
|
|
213
214
|
|
|
214
|
-
'@ai-ecoverse/slicc-clipboard@1.
|
|
215
|
+
'@ai-ecoverse/slicc-clipboard@1.1.1': {}
|
|
215
216
|
|
|
216
217
|
'@ai-ecoverse/slicc-kernel@1.153.0': {}
|
|
217
218
|
|