@ai-ecoverse/slicc-bios 1.32.1 → 1.33.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
@@ -66,7 +66,7 @@ A kernel process can still write to `/os/` and `/node_modules/` (any process whi
66
66
  - **Keeping seven's files:** at the first chat send in a page session, `os/storage.js` calls `navigator.storage.persist()`, unless storage is already persisted. If Chrome declines, every chat panel shows a warning notice (`model.notices`, spectrum ≥ 1.43.0, from `os/notices.js`): *Seven’s files may be cleared*, saying Chrome may clear seven's files and chats when disk space runs low. Chrome grants persistence by engagement, not by a setting, and installing seven as an app is the reliable way. So when Chrome offers to install (`beforeinstallprompt`), the notice says to install seven as an app and offers **Install**, which opens Chrome's install prompt. Otherwise it says to bookmark seven. **Try again** asks again. After `appinstalled`, seven asks by itself and drops the notice once storage is kept. Dismissing the notice is remembered in `localStorage`. The folder-mount request (see [Folder mounts](#folder-mounts)) stays as it is.
67
67
  - **Installing as an app:** [`src/manifest.json`](src/manifest.json) makes seven installable. Its name is *SLICC seven* and its launcher label *seven*. It opens standalone, its `id` and `scope` are `/` and its `start_url` is the BIOS's folder (`./`), and its icons in `src/icons/` come as `any` and `maskable`, relative to the manifest. The UI links `manifest.json`, which the service worker redirects to the BIOS's. The app starts at the BIOS, which checks the packages and goes on to `os/` as in a tab, so the service worker, COOP/COEP and the boot path are the same. Both pages link the manifest and set `theme-color` (`#f8f8f8` light, `#1b1b1b` dark); `os.css` gives `html` the same background, so nothing flashes before the UI paints. Each `<branch>.sliccy.ai` is its own origin, so a preview installs as an app of its own.
68
68
  - **Adobe sign-in:** **Connect** on the Adobe account signs in to Adobe IMS. IMS only redirects to `www.sliccy.ai/auth/callback`, and seven is cross-origin isolated, so the popup has no opener to report back to. Which path seven uses depends on where it runs:
69
- - **On `https://<label>.sliccy.ai`:** seven asks the relay for its own origin (state `{ source: 'origin', origin, nonce }`). The relay navigates the popup to `<origin>/auth/callback`. The service worker serves that page from `os/callback.html`, which hands the redirect to the tab over the same-origin `BroadcastChannel('slicc-sign-in')`, clears the token from its address and closes. Neither slicc-node nor the extension is needed.
69
+ - **On `https://<label>.sliccy.ai`:** seven asks the relay for its own origin (state `{ source: 'origin', origin, nonce }`). The relay navigates the popup to `<origin>/auth/callback`. The service worker serves that page from `os/callback.html`. Its first, inline script keeps the address in memory and replaces it with the bare path before anything loads, and the page sends no referrer. It then hands the nonce and the grant's fields (`access_token`, `expires_in`, `error`, `error_description`) to the tab over the same-origin `BroadcastChannel('slicc-sign-in')`, and closes. Neither slicc-node nor the extension is needed.
70
70
  - **On `https://www.sliccy.ai`,** where seven shares the origin with the relay page (see [Next to SLICC 6](#next-to-slicc-6-wwwsliccyai7)): seven asks the relay for its `opener` delivery (state `{ source: 'opener', nonce }`). The relay page then posts the redirect to every tab of the origin over `BroadcastChannel('slicc-oauth-relay')`, which seven listens on.
71
71
  - **Elsewhere, with slicc-extension installed:** the extension signs in with `chrome.identity`.
72
72
  - **Elsewhere, through slicc-node:** seven registers a nonce with `POST /api/oauth-state`, sends IMS to the relay's `local` source, and polls `GET /api/oauth-result` once a second.
@@ -182,6 +182,21 @@ The Files panel lists `/opt/grammars/node_modules` but doesn't scan it.
182
182
 
183
183
  `os/updates.js` is spectrum's `UpdatesPort` (`model.updates`, spectrum ≥ 1.27.0), with one row per component: **Agent** (`/opt/agent`), **Kernel** (`slicc-kernel`), **UI** (`slicc-spectrum`), **BIOS packages** (the other root packages) and **Syntax grammars**. Each row shows its version, when it was last checked, pnpm's download or link count while it installs, and pnpm's output under *Install log*. A component that isn't installed yet is *Waiting* (`queued`, spectrum ≥ 1.29.0) until its install starts. A failed row leads with one sentence on what failed and what to do, and keeps pnpm's output in the log. `ready()` is false at every boot until the agent's model is in place, or until the check finds no agent to start. While it is false, spectrum opens the Install / Update panel, so it shows while the agent installs or loads; while an installed agent starts, its row reads *Starting* (`starting`, spectrum ≥ 1.37.0). It closes once the agent is up without failures, and a new failure opens it again. An installed agent that doesn't start fails its row with **Retry**. Background updates show in the header. Each row's actions go back to the installers: **Retry** runs that installer again, **Restart agent** restarts the agent worker and **Reload** reloads through the BIOS.
184
184
 
185
+ #### Developer mode and agent betas
186
+
187
+ **Developer mode** (`os/beta.js`, #641) lets the owner try a newer slicc-agent from npm before it's certified. It's off by default, and with it off nothing changes: the deployment's lockfiles are the only source. Only the agent (`/opt/agent`) gets betas for now.
188
+
189
+ - **The switch:** `model.updates.developer()` and `setDeveloper(on)`, rendered in Settings by spectrum. Only the owner tab's own port has them. Other tabs' mirrored ports, remote followers and guests don't, and the owner tab refuses `install-beta` and `back-to-certified` from other tabs. The setting is `slicc-os.developer` in the owner page's `localStorage`, which no kernel process and no agent worker can reach (and the guard keeps the agent's CDP off seven's tabs). No file, URL, hash or environment variable turns it on.
190
+ - **The check:** at every update check with developer mode on, bios reads `https://registry.npmjs.org/@ai-ecoverse/slicc-agent/latest`. When that version is newer than both the certified pin and what's installed, it's offered only if:
191
+ - it has npm's `dist.integrity` and an SLSA v1 provenance attestation whose subject is this release with that sha512, built from `github.com/ai-ecoverse/slicc-agent` (otherwise the row says *not offered: no provenance*) by its `.github/workflows/release.yml` on `refs/heads/main` or `refs/tags/v<version>` (otherwise *not offered: built outside the release workflow*). bios trusts the attestation npm stores: npm verified its Sigstore signature when the version was published, and bios checks the statement's subject, repository, workflow and ref but not the signature again, so it trusts the registry as much as pnpm already does for the tarball;
192
+ - its peer ranges and `engines.slicc-kernel` accept seven's kernel and spectrum;
193
+ - `pnpm install --lockfile-only` in `/opt/slicc/beta/agent`, started from the deployment's lock with only the agent's pin changed, resolves the agent with npm's integrity, and every gated package that changes (see [Certified packages](#certified-packages)) is in `certs.json`.
194
+
195
+ The row's `npm` field says what it found (`offered` with how many packages change and which gated ones, `not-offered` with the reason, `current`, `failed`).
196
+ - **Install beta** asks first, naming the version, the certified version and what changes in `/opt/agent`'s lockfile. Then it keeps the resolved lockfile and manifest in `slicc-os.beta` in `localStorage`, and the agent installs from them with `--frozen-lockfile` as usual. Afterwards bios checks that the installed lock is exactly the approved one and that `/opt/agent` has that version; otherwise it goes back to the certified pin and says why. Later checks install the same beta, so it isn't "repaired" back.
197
+ - **Always marked:** the row's `beta` field (`{ version, certified }`) and a warning notice in the chat panels, *The agent runs a beta*, with **Back to certified**. Dismissing the notice hides it for the session, and it comes back at the next boot.
198
+ - **Back to certified** drops the record, installs the certified lock again and restarts a running agent (once it's idle), so the uncertified worker doesn't keep running unmarked. When the deployment's agent lock changes, the beta goes too, with a notice. If seven now ships the beta's version or a newer one, the notice says the beta is no longer needed; otherwise it says to install the beta again. Turning developer mode off asks whether to return a beta to certified (**Keep beta** keeps it marked) and stops the offers.
199
+
185
200
  #### Optional packages
186
201
 
187
202
  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.
@@ -277,7 +292,7 @@ Seven keeps its secrets in the vault, a separate origin (`@ai-ecoverse/slicc-vau
277
292
 
278
293
  Before the kernel starts, `os/transport.js` picks how programs reach the network. The first of these that applies wins:
279
294
 
280
- 1. **A local proxy:** [slicc-node](https://github.com/ai-ecoverse/slicc-node) (`npx @ai-ecoverse/slicc-node`) or slicc-swift. The launcher opens `https://seven.sliccy.ai/#proxy=<url>&key=<key>`. The page takes both from the fragment and removes them from the address bar. It accepts only a plain `http://` origin on `127.0.0.1`, `localhost` or `[::1]`, so a link can't send traffic elsewhere. It keeps them in IndexedDB (`slicc-os`, store `transport`), so a reload keeps using the proxy. Each load checks the proxy with `checkLocalProxy`. If the proxy refuses the key (every proxy process mints a new one), isn't a proxy, or doesn't answer although the page may reach loopback, the page forgets it and falls through. It keeps the proxy, and still falls through, when Chrome's Local Network Access permission is denied, or when nothing answered while the permission is undecided (Chrome asks only once it has a connection, so a dismissed prompt and a stopped proxy look the same).
295
+ 1. **A local proxy:** [slicc-node](https://github.com/ai-ecoverse/slicc-node) (`npx @ai-ecoverse/slicc-node`) or slicc-swift. The launcher opens `https://seven.sliccy.ai/#proxy=<url>&key=<key>`. A small script at the top of the page takes both out of the address before anything else loads. It keeps them in local storage under a fresh id and leaves only `#handoff=<id>` in the address, and the boot reads them from there (the same goes for `#tailscale=`, its `exit=` and `#slicc-pair=`). Once seven has read them, and also when the boot fails, the entry and the id are removed, together with any entry older than 10 minutes. If they can't be stored, the address is still tidied and the values are dropped. It accepts only a plain `http://` origin on `127.0.0.1`, `localhost` or `[::1]`, so a link can't send traffic elsewhere. It keeps them in IndexedDB (`slicc-os`, store `transport`), so a reload keeps using the proxy. Each load checks the proxy with `checkLocalProxy`. If the proxy refuses the key (every proxy process mints a new one), isn't a proxy, or doesn't answer although the page may reach loopback, the page forgets it and falls through. It keeps the proxy, and still falls through, when Chrome's Local Network Access permission is denied, or when nothing answered while the permission is undecided (Chrome asks only once it has a connection, so a dismissed prompt and a stopped proxy look the same).
281
296
  2. **[slicc-extension](https://github.com/ai-ecoverse/slicc-extension):** when the extension defines `globalThis.sliccExtension`, the kernel uses `fetchTransport({ fetch: sliccExtension.fetch })`.
282
297
  3. **The page's own `fetch`:** `fetchTransport()`, bound by CORS. A request CORS stops is answered `502` with a hint to run `npx sliccy@next` (the slicc CLI, until `sliccy`'s `latest` is the new CLI) or install slicc-extension, which `curl` prints.
283
298
 
@@ -365,7 +380,7 @@ seven can also join a tailnet, with a patched build of Tailscale's wasm client (
365
380
  - A device that reconnects replaces only its own process's link, so `slicc <join> prompt` doesn't drop that machine's `follow`. Control-only links (`caps: []`) get no `.slicc.internal` name and no exit.
366
381
  - **Folders (`fs`):** a CLI started with `--mount <path>[:<name>][:ro]` lists its folders in HELLO, and later in `OPEN { kind: 'mounts' }` updates; the page offers cap `mounts`. Each is a `hostfs` source named `<device>/<name>`, so `mount -t hostfs lars-mbp/proj /mnt/proj` mounts it, and nothing is mounted unless someone asks. A bare source with no `<device>/`, as slicc-node named its folders (`mount -t hostfs project /mnt/p`, or one remembered from then), is the folder of that name on the CLI linked on this computer, when exactly one local CLI shares one. The device's row in Linked devices lists its folders (`folders`, with a Read-only badge; spectrum ≥ 1.58.0): **Mount** (`mountFolder(source)`) mounts one at `/mnt/<device>/<name>` (a folder named `.` or `..` is never listed), and **Eject** (`ejectFolder(source)`) unmounts it. The Files panel's Mounted strip shows each `hostfs` mount's source (`mountInfo()`), so `/mnt/proj · lars-mbp/proj` reads as another computer's folder. A mounted linked folder stays with the CLI process it was first granted from (`slicc-os.link-sources`), even if that process comes back under another name. If that process isn't linked, the folder goes to whichever process has the name now, but only when no other process with the same host name shares a folder of that name; otherwise it waits. So a remembered `lars-mbp/proj` never lands on another process's `proj`. A remembered linked folder that is mounted again before its CLI is back stays `nomedium`, and fills in when the CLI links. The kernel's `hostfs` hook answers such a source with a `MessagePort` (slicc-kernel ≥ 1.54.9), and the page serves it with `serveHostfsPort` over `OPEN { kind: 'fs', mount, op, … }` streams: `list` collects its NDJSON, a read over 64 KiB and every write get their own channel, and `watch` streams the CLI's change events. A read-only kernel mount, or a read-only export, sends `readonly: true` on every OPEN. A link that drops makes the mount `nomedium` until the CLI is back; files that were open reopen by path and continue if the host didn't change them.
367
382
  - **SSH host key:** the CLI's HELLO carries its host key, and the page writes `<host>.slicc.internal,<address> <key>` into the system-wide `/etc/ssh/ssh_known_hosts`, replacing older entries for that name or address, so `ssh` never trusts a key on first sight, whichever user runs it. Seven manages these keys, not the user, and OpenSSH looks up a user's own file under the passwd home, which isn't always `$HOME`.
368
- - **Tests:** `test/integration/remote.test.mjs` runs the real `slicc watch`, `slicc prompt` and `slicc abort` with `--signal stdio` against seven's real agent and a fake Bedrock. It also leads a fake tray hub and sends a `webhook.event`, which reaches the agent as a webhook lick (without its `authorization` header) and starts a run. `test/integration/tray.test.mjs` leads a fake tray hub and links a follower in the page through it, then rotates and unlinks. `test/integration/link.test.mjs` links a fake node in the page over a real `RTCPeerConnection`, and, with `SLICC_CLI` set, the real `slicc attach --signal stdio`, relaying its NDJSON through the CDP binding: raw TCP and the http kind; kernel `ssh` with strict host-key checking against `--runner sh -c`, after `pnpm add -g @ai-ecoverse/wasix-openssh`; and, with the link as the exit, a name from the CLI's `--hosts` file, then refused under `--deny`; and `<port>.kernel.localhost` through the CLI's listener into a kernel server (`httptest`), with 502 for a closed port and the facade refused; a folder shared with `--mount`, mounted as `ref-node/proj`, read, written, seen changing on the host, and refused for writes when mounted `ro`; a second headless Chromium shared with `--cdp-extra`, listed and driven by `playwright-cli --runtime ref-node/<id>`; and a program WebSocket from kernel `bash` through the proxy to a `ws` echo server on the CLI's loopback: text, binary, the subprotocol, a close from each end, and `EACCES` under `--deny`; kernel `websocat`, installed from the catalog, to a `ws` echo on the CLI's loopback and, without `-k`, to `wss://echo.sliccy.ai/` (SLICC's echo, behind Cloudflare's certificate), so its own TLS checks the chain over raw TCP through the link, then failing at once under Directly and with no exit, and its `cmd:`, `exec:` and `sh-c:` refused at startup; and a kernel `python3` UDP socket (after `pnpm add -g @ai-ecoverse/wasix-python`) to a UDP echo server on the CLI's loopback, unconnected and connected, and `EACCES` on a connected socket under `--deny`, as with the fake node's own refusal. CI runs the CLI from npm, the pinned `@ai-ecoverse/slicc` devDependency.
383
+ - **Tests:** `test/integration/remote.test.mjs` runs the real `slicc watch`, `slicc prompt` and `slicc abort` with `--signal stdio` against seven's real agent and a fake Bedrock. It also leads a fake tray hub and sends a `webhook.event`, which reaches the agent as a webhook lick (without its `authorization` header) and starts a run. `test/integration/tray.test.mjs` leads a fake tray hub and links a follower in the page through it, then rotates and unlinks. `test/integration/link.test.mjs` links a fake node in the page over a real `RTCPeerConnection`, and, with `SLICC_CLI` set, the real `slicc attach --signal stdio`, relaying its NDJSON through the CDP binding: raw TCP and the http kind; kernel `ssh` with strict host-key checking against `--runner sh -c`, after `pnpm add -g @ai-ecoverse/wasix-openssh`; and, with the link as the exit, a name from the CLI's `--hosts` file, then refused under `--deny`; and `<port>.kernel.localhost` through the CLI's listener into a kernel server (`httptest`), with 502 for a closed port and the facade refused; a folder shared with `--mount`, mounted as `ref-node/proj`, read, written, seen changing on the host, and refused for writes when mounted `ro`; a second headless Chromium shared with `--cdp-extra`, listed and driven by `playwright-cli --runtime ref-node/<id>`; and a program WebSocket from kernel `bash` through the proxy to a `ws` echo server on the CLI's loopback: text, binary, the subprotocol, a close from each end, and `EACCES` under `--deny`; kernel `websocat`, installed from the catalog, to a `ws` echo on the CLI's loopback and, without `-k`, to `wss://echo.sliccy.ai/` (SLICC's echo, behind Cloudflare's certificate), so its own TLS checks the chain over raw TCP through the link, then failing at once under Directly and with no exit; and a kernel `python3` UDP socket (after `pnpm add -g @ai-ecoverse/wasix-python`) to a UDP echo server on the CLI's loopback, unconnected and connected, and `EACCES` on a connected socket under `--deny`, as with the fake node's own refusal. CI runs the CLI from npm, the pinned `@ai-ecoverse/slicc` devDependency.
369
384
  - **As the exit:** a CLI linked on this computer (`npx sliccy@next`) is the exit by itself until the user chooses one, so the kernel's HTTP and raw TCP get past CORS at once, as slicc-node's proxy did; a Tailscale exit node that is on comes first. A remote device that offers to be a default exit carries other traffic only once it's chosen. The Network panel's **Internet traffic** picker (`setExit`) is one choice across Directly, Tailscale exit nodes and linked devices: choosing a device turns off Tailscale's exit node, and choosing Tailscale clears the device. The choice of a device is kept in `localStorage` (`slicc-os.exit`), and while that device isn't connected, after a reload or while it reconnects, internet traffic **waits**: raw connections get `ENETUNREACH` and HTTP fails, rather than going out directly. Choosing Directly sends it directly again and is kept (`direct`), so a local CLI doesn't take it over, while a Tailscale exit node turned on later still does; unlinking the chosen exit device goes back to the automatic choice.
370
385
  - **What the agent sees:** the transport's `traits` name the default exit while there is one, so the agent can say how its fetches go. `traits.exit` is `{ kind, caps }`:
371
386
  - **`kind`:** `local` (a CLI on this computer), `remote` (a chosen linked device) or `tailnet` (a Tailscale exit node);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-bios",
3
- "version": "1.32.1",
3
+ "version": "1.33.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",
@@ -46,7 +46,7 @@
46
46
  "@ai-ecoverse/slicc-browsers": "1.10.3",
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.100.0",
49
+ "@ai-ecoverse/slicc-spectrum": "1.101.0",
50
50
  "@ai-ecoverse/slicc-vault": "1.15.1",
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.14",
11
11
  "@ai-ecoverse/slicc-clipboard": "1.0.2",
12
12
  "@ai-ecoverse/slicc-kernel": "1.136.1",
13
- "@ai-ecoverse/slicc-spectrum": "1.100.0",
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",
16
16
  "@ai-ecoverse/wasi-ripgrep": "15.2.0-5",
@@ -81,9 +81,9 @@
81
81
  }
82
82
  },
83
83
  "node_modules/@ai-ecoverse/slicc-spectrum": {
84
- "version": "1.100.0",
85
- "resolved": "https://registry.npmjs.org/@ai-ecoverse/slicc-spectrum/-/slicc-spectrum-1.100.0.tgz",
86
- "integrity": "sha512-AT96NjcXRpjK2snrdgwFZoKWz3ndCAKI3D3Ce3tU9tI8gv8jOjonFK5rlvcsutlm+cJdFURhMottViGlB+ErPQ==",
84
+ "version": "1.101.0",
85
+ "resolved": "https://registry.npmjs.org/@ai-ecoverse/slicc-spectrum/-/slicc-spectrum-1.101.0.tgz",
86
+ "integrity": "sha512-m2+lFTgPvaY2zl0ITxxPOZJOSBmGThZneeNj5GbiJvGuM0rhil1xF61Htetz6nob6xRXm9titmXXfi3DuQ0WUQ==",
87
87
  "license": "Apache-2.0",
88
88
  "engines": {
89
89
  "node": ">=24"
@@ -7,7 +7,7 @@
7
7
  "@ai-ecoverse/slicc-cdp": "1.30.14",
8
8
  "@ai-ecoverse/slicc-clipboard": "1.0.2",
9
9
  "@ai-ecoverse/slicc-kernel": "1.136.1",
10
- "@ai-ecoverse/slicc-spectrum": "1.100.0",
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",
13
13
  "@ai-ecoverse/wasi-ripgrep": "15.2.0-5",
@@ -21,8 +21,8 @@ importers:
21
21
  specifier: 1.136.1
22
22
  version: 1.136.1
23
23
  '@ai-ecoverse/slicc-spectrum':
24
- specifier: 1.100.0
25
- version: 1.100.0
24
+ specifier: 1.101.0
25
+ version: 1.101.0
26
26
  '@ai-ecoverse/wasi-fnox':
27
27
  specifier: 1.39.0-5
28
28
  version: 1.39.0-5
@@ -115,8 +115,8 @@ packages:
115
115
  resolution: {integrity: sha512-OIrL7sWfPIM+uyUQxqpwfYKiMX+lc58kcR8gx1zYi9R0I8UTcsMCKXJsW+VrFHcCqXY/7G3YE/9LB9I0VTJtXQ==}
116
116
  engines: {node: '>=24'}
117
117
 
118
- '@ai-ecoverse/slicc-spectrum@1.100.0':
119
- resolution: {integrity: sha512-AT96NjcXRpjK2snrdgwFZoKWz3ndCAKI3D3Ce3tU9tI8gv8jOjonFK5rlvcsutlm+cJdFURhMottViGlB+ErPQ==}
118
+ '@ai-ecoverse/slicc-spectrum@1.101.0':
119
+ resolution: {integrity: sha512-m2+lFTgPvaY2zl0ITxxPOZJOSBmGThZneeNj5GbiJvGuM0rhil1xF61Htetz6nob6xRXm9titmXXfi3DuQ0WUQ==}
120
120
  engines: {node: '>=24'}
121
121
  peerDependencies:
122
122
  '@shikijs/langs': 4.5.0
@@ -215,7 +215,7 @@ snapshots:
215
215
 
216
216
  '@ai-ecoverse/slicc-kernel@1.136.1': {}
217
217
 
218
- '@ai-ecoverse/slicc-spectrum@1.100.0': {}
218
+ '@ai-ecoverse/slicc-spectrum@1.101.0': {}
219
219
 
220
220
  '@ai-ecoverse/wasi-fnox@1.39.0-5': {}
221
221