@fnndsc/calypso 0.19.5 → 0.19.6

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.
@@ -16,6 +16,10 @@ export interface Berth {
16
16
  url: string;
17
17
  token: string;
18
18
  pid?: number;
19
+ /** The package versions this daemon runs (brasa, calypso, chell, …), so a door can tell an older session from its own code. */
20
+ versions?: Record<string, string>;
21
+ /** When the daemon booted, ISO. */
22
+ booted?: string;
19
23
  }
20
24
  /**
21
25
  * Normalises a `<user>@<url>` identity lexically — no DNS, no network.
@@ -1 +1 @@
1
- {"version":3,"file":"berth.js","sourceRoot":"","sources":["../../src/daemon/berth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"berth.js","sourceRoot":"","sources":["../../src/daemon/berth.ts"],"names":[],"mappings":"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"}
@@ -195,7 +195,9 @@ export async function daemon_launch(engine, beforeListen, options = {}) {
195
195
  // another machine, the qualified name still works.
196
196
  const displayHost = bindHost === '0.0.0.0' ? await hostFqdn_get() : bindHost;
197
197
  const url = `ws://${displayHost}:${port}`;
198
- const berth = { identity, url, token, pid: process.pid };
198
+ // The berth says what code this daemon runs: a door that ships newer code
199
+ // restarts the session at the next login rather than mount an older kernel.
200
+ const berth = { identity, url, token, pid: process.pid, versions: { ...versions_get() }, booted: new Date().toISOString() };
199
201
  berth_write(berth);
200
202
  const attachHint = identity === DISCONNECTED_IDENTITY ? '' : ` ${identity}`;
201
203
  // The boot animation keeps repainting this terminal, and scrollback dies with
@@ -1 +1 @@
1
- {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/daemon/launch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/daemon/launch.ts"],"names":[],"mappings":"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"}
package/dist/notes.json CHANGED
@@ -1 +1 @@
1
- {"package":"@fnndsc/calypso","version":"0.19.5","built":"2026-10-05T18:44:55.889Z","releases":[{"version":"0.19.5","date":"2026-10-05","merge":"805618f64f87","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [c806e86] - @fnndsc/argus@0.26.0","body":"","internal":true}]},{"version":"0.19.4","date":"2026-10-05","merge":"ecfe0e091342","bump":"patch","changes":[{"hash":"5a0eef5","headline":"The package ships its release notes, so a session can say what changed.","body":"They are read from CHANGELOG.md at build into dist/notes.json.","internal":false},{"hash":null,"headline":"Updated dependencies [5a0eef5]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5a0eef5]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5a0eef5] - @fnndsc/brasa@0.33.0 - @fnndsc/menu@0.19.0 - @fnndsc/argus@0.25.0 - @fnndsc/cumin@3.27.5","body":"","internal":true}]},{"version":"0.19.3","date":"2026-10-05","merge":"ff1316b2d9fb","bump":"patch","changes":[{"hash":"6901a81","headline":"The daemon answers the kernel's `peers` seam with the surfaces attached to the session, so `who` can name them (the games shelf, #892).","body":"","internal":false},{"hash":null,"headline":"Updated dependencies [6901a81]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [6901a81] - @fnndsc/brasa@0.32.0 - @fnndsc/argus@0.24.0","body":"","internal":true}]},{"version":"0.19.2","date":"2026-10-04","merge":"8b4c28c80fc2","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [73c0087] - @fnndsc/menu@0.18.0 - @fnndsc/brasa@0.31.5 - @fnndsc/argus@0.23.2 - @fnndsc/cumin@3.27.4","body":"","internal":true}]},{"version":"0.19.1","date":"2026-10-04","merge":"33717fb2d21d","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [c9f9156]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d04a2ef] - @fnndsc/argus@0.23.0","body":"","internal":true}]},{"version":"0.19.0","date":"2026-10-03","merge":"b737b6d5269e","bump":"minor","changes":[{"hash":"51315ec","headline":"The calypso daemon knows when it is stale.","body":"It fingerprints its own packages' code (version and compiled scripts' content) when it starts, reads the fingerprint again on every attach and once a minute, says `stale` in its attach ack, and pushes a `stale` message when the answer flips. ARGUS says CALYPSO DAEMON OUT OF DATE only when the daemon says so, so an ARGUS-only release no longer alarms every running daemon; an open ARGUS learns of an upgrade within a minute. A daemon too old to report `stale` falls back to the build-stamp comparison.","internal":false},{"hash":"33e4f1d","headline":"A session restarts from its own browser and stays logged in.","body":"Porter's new `POST /restart` (cookie-gated: only the cookie's own session) tells the old calypso daemon why, ends it, and boots a fresh one with chell's new `--saved-token` login, which uses the token the identity saved and refuses rather than come up offline. The browser follows the boot on the greeter; a refused saved token ends at the door with the reason. On SIGTERM the daemon sends `closing` (restart, end or stop) to every surface before it exits, and a remote chell prints why it went. `porter --end` leaves `end` as the reason.","internal":false},{"hash":"fe4b6b4","headline":"The calypso daemon is restarted by its own operator, behind a door.","body":"A RESTART pill stands beside LOG OUT, and the out-of-date notice's cure \"Restart the calypso daemon\" is a control. Both ask first in the notice's spot (\"Restart the calypso daemon? You'll stay logged in; …\"), naming what a restart would cut off right now: the running command, unsaved edits, other attached browsers and chells. YES asks the door to restart and follows the greeter back in; another ARGUS on the session says why it dropped and follows on its own. The daemon's heartbeat now lists the attached surfaces (id and kind) and its attach ack gives each surface its own id.","internal":false},{"hash":null,"headline":"Updated dependencies [51315ec]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [33e4f1d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [fe4b6b4]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [2d26368] - @fnndsc/menu@0.17.0 - @fnndsc/argus@0.22.0 - @fnndsc/cumin@3.27.2 - @fnndsc/brasa@0.31.2","body":"","internal":true}]},{"version":"0.18.0","date":"2026-10-03","merge":"ff157a55d5ed","bump":"minor","changes":[{"hash":"685ed59","headline":"ARGUS and the calypso daemon say when they are different builds.","body":"ARGUS's build writes its stamp into the bundle; the calypso daemon reads it once at start and reports it in its attach ack (`stack.surface`, optional in the wire schema). When ARGUS's own stamp differs, it says which is older and what to restart — on the status strip, in a dismissible notice, and on the console: \"ARGUS is newer than the calypso daemon, so some controls won't work. Restart the calypso daemon.\" or \"ARGUS is older than the calypso daemon. Refresh to load the new ARGUS.\" A remote chell prints one line at attach when its build differs from the daemon's.","internal":false},{"hash":null,"headline":"Updated dependencies [685ed59] - @fnndsc/argus@0.21.0 - @fnndsc/menu@0.16.0 - @fnndsc/brasa@0.31.1 - @fnndsc/cumin@3.27.1","body":"","internal":true}]},{"version":"0.17.1","date":"2026-10-03","merge":"e01033841299","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [4128890] - @fnndsc/argus@0.20.0","body":"","internal":true}]},{"version":"0.17.0","date":"2026-10-03","merge":"30fbc2abbc84","bump":"minor","changes":[{"hash":"c1cf57e","headline":"An edit crosses the wire to a browser (#831, slice 2).","body":"The daemon's `edit` request now names the file being edited (`path`), and a surface may answer `opened`: it took the file into an editor that stays open, so the command saves nothing and says `(opened in the editor)`; each save made in that editor will run as its own command line. The argus client hands an edit to a host editor hook and answers at once that it opened, or refuses in words when it has none (the hook is installed by the editor pane, slice 3). `feed note edit N` is now `edit /proc/jobs/feed_N/note`: a terminal's editor and a browser's pane open the same text and save it the same way, and the title is set with `feed note N --title`.","internal":false},{"hash":null,"headline":"Updated dependencies [e057d20]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [2826f2b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c1cf57e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [50d41d7]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [1c8b92d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [e20fb09]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ddbd551]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [32e3919]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [59399fe]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [51da853] - @fnndsc/argus@0.19.0 - @fnndsc/brasa@0.31.0 - @fnndsc/menu@0.15.0 - @fnndsc/cumin@3.27.0","body":"","internal":true}]},{"version":"0.16.10","date":"2026-10-01","merge":"0491d58506dd","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [88437cc]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [51f1ca9]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c9c018b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [55fbf6c]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [fbb1579]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [576b948]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [4864a34]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [40acb72]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d7ec90d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d057e99]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [4863f32]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7fb4c21]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8260d33]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c371b47] - @fnndsc/argus@0.18.10 - @fnndsc/brasa@0.30.0 - @fnndsc/cumin@3.26.0 - @fnndsc/menu@0.14.0","body":"","internal":true}]},{"version":"0.16.9","date":"2026-10-01","merge":"1b77ac182c25","bump":"patch","changes":[{"hash":"cbd71cc","headline":"A refused file read says why: the kernel names the status and reason (403 not yours to read, 404 no such file, 502 CUBE could not serve it), `/vfs` answers with them instead of 404 for everything, and an image pane that lost a slice reads the reason out.","body":"`porter --end <who>` ends one session so the next login boots on the current kernel.","internal":false},{"hash":null,"headline":"Updated dependencies [cbd71cc] - @fnndsc/brasa@0.29.1 - @fnndsc/argus@0.18.8","body":"","internal":true}]},{"version":"0.16.8","date":"2026-09-26","merge":"a1a7cf9a2b2d","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [fbd3f0a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [fbd3f0a] - @fnndsc/menu@0.13.0 - @fnndsc/brasa@0.29.0 - @fnndsc/argus@0.18.0 - @fnndsc/cumin@3.25.0","body":"","internal":true}]},{"version":"0.16.7","date":"2026-09-26","merge":"70016c84b4f0","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [a0927ec]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [e61a6ad]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [e7f82dd]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d1da8ac]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0f9ae74]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7c1250f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [16f8558]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8851db3]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d8e160c]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [e59a8d7]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5aec39e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8cd7a3a] - @fnndsc/argus@0.17.0 - @fnndsc/cumin@3.24.0 - @fnndsc/menu@0.12.0 - @fnndsc/brasa@0.28.0","body":"","internal":true}]},{"version":"0.16.6","date":"2026-09-24","merge":"43521c122e64","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [53d43f6]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [38572b6] - @fnndsc/brasa@0.27.0 - @fnndsc/argus@0.16.2","body":"","internal":true}]},{"version":"0.16.5","date":"2026-09-24","merge":"ae94a9289e09","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [5ccff72] - @fnndsc/argus@0.16.0","body":"","internal":true}]},{"version":"0.16.4","date":"2026-09-23","merge":"b2eb1f41f814","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [b92c96a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d6dac25]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [6233301]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5caeef6] - @fnndsc/argus@0.15.0","body":"","internal":true}]},{"version":"0.16.3","date":"2026-09-23","merge":"4ce95fee1d4a","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [b254ee4]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7b89dcc]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [11a0dd1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [f3f68e3]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [cb76c3b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [f2b6a80]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [f297468] - @fnndsc/argus@0.14.0 - @fnndsc/brasa@0.26.0","body":"","internal":true}]},{"version":"0.16.2","date":"2026-09-22","merge":"2356c7db39f7","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [6b55e72]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5b78288]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5a95cac] - @fnndsc/cumin@3.23.2 - @fnndsc/argus@0.13.0","body":"","internal":true}]},{"version":"0.16.1","date":"2026-09-22","merge":"c1b0be0099d8","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [de26df4]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [247bf09]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [dac2d96]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [dac2d96]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [dac2d96]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [50f8a4e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [50f8a4e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [50f8a4e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [637c819]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c82f514]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c82f514]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c82f514]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c82f514] - @fnndsc/argus@0.12.0 - @fnndsc/cumin@3.23.1 - @fnndsc/brasa@0.25.0 - @fnndsc/menu@0.11.0","body":"","internal":true}]},{"version":"0.16.0","date":"2026-09-21","merge":"576426874567","bump":"minor","changes":[{"hash":"3a8cd1b","headline":"A porter at the door: the mise display manager, slice 3 — the shape without the door.","body":"`apps/porter` logs an operator into one CUBE, trades the password for a token, starts or joins that identity's calypso (`chell --daemon --auth-token-stdin`, the token on stdin, four directories of its own under the porter's state) and mounts the session at `/s/<key>/`: page, assets, `/vfs` and the WebSocket wire proxied to the daemon on loopback with the attach token added by the porter, so the browser holds none. `GET /boot/<key>` streams the session's boot as server-sent events, one per line the daemon wrote, replayed for a late attacher. `POST /sessions` re-checks the password at CUBE every time, even when the session is up.\n\ncalypso: the attach token may ride the upgrade URL (`?token=`), the way `/vfs?token=` already does, so a front that holds the token for a browser can put it on the proxied upgrade and the page attaches with an empty one; and `berth_pathIn(runtimeDir, identity)` names a berth under a runtime directory that is not the process's own.\n\nNo cookie yet: this porter binds loopback. The door — login page, cookie, LOG OUT — is the next slice.","internal":false},{"hash":"1bdf876","headline":"A row wears the number it answers to.","body":"A row of the session's last answer can be named by the number beside it — `gather add @2,3,6`, `image @1` — so the number is now DRAWN beside it. The listing façade mints a leading index pill for any level that says how its rows are addressed, and no pane draws a number itself.\n\nWhat is numbered is the kernel's ANSWER rather than a rendering of it, so a console table and a graphical pane count the same rows. The lit number is found BY ADDRESS, not by counting down the screen, so a sorted or filtered listing keeps each row's own number instead of renumbering under the operator.\n\nEvery listing leads with the column and every row counts itself; only the rows the kernel reaches wear a LIT number. In a PACS answer that is the series, while the patient and study levels above count themselves dim — the distinction is the hue, never the digits, so a number nothing answers to cannot be mistaken for one that does. Numbers are zero-padded to the widest in their group, so a fourteen-series answer reads 01…14 and the column stays a column. The lit hue is the pane's FRAME hue (`--listing-index-hue`, set per pane), because the pill is chrome and not content: an orange pill beside the browser's orange kind glyph read as one blob and the number stopped being a number.\n\nThe surface learns which listing is numbered from a retained `numbered` message: brasa announces it as the answer changes, calypso relays it and replays it to a surface attaching late, and the addresses travel with it (capped, past which a long listing is numbered in the kernel and unnumbered on screen). The same shape regard already travels in.\n\nLaw: `a-row-wears-the-number-it-answers-to`.","internal":false},{"hash":"5b520c7","headline":"An index says what it counts.","body":"`@2` said nothing about what it counted — in a PACS answer every study read \"1\", being the only study under its patient — so a bare number is no longer an index. A handle names its KIND and its place in that kind's sequence: `@SER3`, `@STD001`, `@FIL2,3,7`, `@DIR2-4`. One sequence per kind runs across the whole answer, so a handle is a name rather than a position and a sorted listing does not renumber it; zero padding is how the pill draws it, not something to type.\n\nWhat a row hands over differs by kind. A series, a file or a folder hands over its path; a STUDY hands over its series — what the surface's GATHER on a study hands over — so `gather add @STD001` and `pull @STD001` act on the whole study from a console exactly as a press does. A verb refuses a kind it does not take, by name and at expansion: `image @STD001` says \"image takes a series or a folder or a file; STD001 is a study\" instead of resolving to a path and failing three steps later for a reason that names nothing typed.\n\nOn the surface the pill draws the handle, lit in the pane's frame hue on the rows the session reaches, and a study row wears `STD001` where it read a meaningless \"1\". The `numbered` message carries each row's kind, place and address, so a pane finds its rows by address and draws the code the operator would type.","internal":false},{"hash":"d1a1c0d","headline":"calypso: `/vfs?path=…&download=1` answers the file's bytes as an attachment named for the file (`content-disposition`, the name as ASCII and as UTF-8), so a browser surface can save a file rather than show it.","body":"","internal":false},{"hash":"4ee180c","headline":"A session outlives its door: the porter's lifecycle.","body":"porter: a restarted porter adopts the sessions its predecessor started, from their berths under the state directory, rather than starting rivals. Idle sessions — no wire open, nothing through the door for `PORTER_IDLE_HOURS` (a day, like the cookie) — are ended by a sweep every minute: the process only; the state directory stays and the next login boots warm. `porter --status` lists the state directory's sessions and whether each answers. `deploy/` carries a systemd unit (a `porter` user, `KillMode=process` so a stopped door keeps its sessions), an env file example, and a Caddyfile for TLS in front. Boot lines kept per session are capped at 2000.\n\ncalypso: a berth records the daemon's pid, so a host that did not start a daemon can still end it.\n\nchell: a daemon off a TTY tolerates EPIPE on its stdout and stderr — the porter that started it may stop first, and a session outlives its door.","internal":false},{"hash":null,"headline":"Updated dependencies [e74ce1d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [1b2f7f7]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [50f358b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3320487]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [149957f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [161e54d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [07f3783]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [f94480e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [2322151]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0f3deaa]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d1a1c0d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [fa26e17]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [77c73aa]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [cd7714d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a010cb0]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [369b20d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8a8dc25]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b748002]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a8e0f87]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [dc369d3]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d3a8335]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [03e0f87]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [1bdf876]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [854ba2e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [80ddce6]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [9cc1514]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3bbc65a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [1cb8d03]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [4ce1ddc]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5b520c7]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [9339853]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [acbade9]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3c6a0d3]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ca3e39b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7bba167]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [21f8d21]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [9c5a7c2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [1c169d7]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [fc4eb7e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [43b9440]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d78447d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [38fbdb9] - @fnndsc/brasa@0.24.0 - @fnndsc/argus@0.11.0 - @fnndsc/menu@0.10.0 - @fnndsc/cumin@3.23.0","body":"","internal":true}]},{"version":"0.15.2","date":"2026-09-17","merge":"9ed4e1e6d106","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [6c6ca51]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [48e112d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [cd6a0ab]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ee75252]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [fa90f05]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [934d2d3]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [de5508d] - @fnndsc/argus@0.10.0 - @fnndsc/brasa@0.23.2","body":"","internal":true}]},{"version":"0.15.1","date":"2026-09-17","merge":"96133a6d86a6","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [3f96d86]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0d99ec5]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a38bb64]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ab127ea]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0d5f0d7]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3c6555a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7c2308b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [6d8a595]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a4a38b1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0d99ec5]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a4a38b1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3c9af17]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [480632d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b4d9282]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [566be78]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [62ef29b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [f6d818b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [97596db]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [15b8875]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [aef1a8d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [35064c8]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b337285]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [59a3f96]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [f549b09]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [4aaad51]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ab127ea]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [480632d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [10b99d2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [66ecf22]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [2d52827]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5d4bb4d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d3e5494]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [6d8a595]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3f45362]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b329170]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3f96d86]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [2080342]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7126bca] - @fnndsc/brasa@0.23.1 - @fnndsc/argus@0.9.0","body":"","internal":true}]},{"version":"0.15.0","date":"2026-09-15","merge":"7717a54fa4b1","bump":"minor","changes":[{"hash":"9cf2ea2","headline":"`image <path>`'s text reflection now carries a thumbnail of the middle slice, so a TTY sharing the session shows the picture, not only the facts.","body":"The kernel reads the slice's pixels (`dicomSlice_gray` in salsa, uncompressed transfer syntaxes via dcmjs), window/levels to 8-bit with MONOCHROME1 inverted, and box-downsamples to a cell grid; brasa renders it as an ASCII ramp on any pipe or ANSI truecolour half-blocks (`▀`) on a colour terminal. Colour is a new declared surface capability: ARGUS declares it (its DOM console renders ANSI), chell reads its own terminal through chalk, a bare pipe gets the ramp. Compressed pixels say so in one line rather than pulling a codec into the kernel; an unreadable slice leaves the facts and no picture. The ASCII ramp is always the floor.","internal":false},{"hash":null,"headline":"Updated dependencies [7892529]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a24d813]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [de4dac8]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [26eaf6a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b6d0264]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7ca8d04]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [67f5fd5]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [9cf2ea2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d133ef6]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7b5a7b9]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c70e11e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [6990c3a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [aa486c5]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b4689e2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a29635a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0215547]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [bf4c118]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5ed1785]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [887c815]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8a4ddc8] - @fnndsc/argus@0.8.0 - @fnndsc/brasa@0.23.0 - @fnndsc/menu@0.9.0 - @fnndsc/cumin@3.22.1","body":"","internal":true}]},{"version":"0.14.0","date":"2026-09-10","merge":"3bc70ad2fb11","bump":"minor","changes":[{"hash":"c601a42","headline":"ARGUS is published, and a released install now serves it.","body":"`@fnndsc/argus` ships its built bundle, calypso depends on it, and the daemon's web-root search ends by resolving the installed package — so `npm install -g @fnndsc/chell` followed by `chell --daemon` prints a URL a browser can open, where before it printed only a WebSocket address. The unused `@fnndsc/calypso` dependency is dropped from argus, whose browser code imports only the wire contract.","internal":false},{"hash":null,"headline":"Updated dependencies [c601a42]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3660509]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c0e92f7] - @fnndsc/argus@0.7.0","body":"","internal":true}]},{"version":"0.13.2","date":"2026-09-10","merge":"bbff653b165d","bump":"patch","changes":[{"hash":"4af65f4","headline":"The daemon now tells a browser how long it may keep what it serves.","body":"It sent a content type and nothing else, and silence is not neutral: with no `cache-control`, no `etag` and no `last-modified` a browser may keep the page, and `index.html` is the file that names the hashed assets — so a kept copy pinned the whole surface to the build that wrote it and no rebuild ever arrived. `index.html` is `no-store`, a hashed asset is immutable for a year since a different build is a different URL, and anything else revalidates.","internal":false},{"hash":null,"headline":"Updated dependencies [163e4b1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [aa923c6]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [59aa79b] - @fnndsc/brasa@0.22.0 - @fnndsc/cumin@3.22.0","body":"","internal":true}]},{"version":"0.13.1","date":"2026-09-10","merge":"b11d56847aad","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [7c793ad]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7c793ad]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [af2df66]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [af2df66]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0eb202f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [183bf02] - @fnndsc/brasa@0.21.0 - @fnndsc/menu@0.8.0 - @fnndsc/cumin@3.21.1","body":"","internal":true}]},{"version":"0.13.0","date":"2026-09-09","merge":"12150416bc9f","bump":"minor","changes":[{"hash":"ef4a718","headline":"The standalone `calypso` binary ends its boot at a login, like `chell --daemon`: on a TTY the daemon's own terminal becomes its first surface, an ordinary `chell --remote` spawned onto it, rather than the old resting face.","body":"The console loop, the cage and the reattach grammar move into calypso (the daemon's own package), with the surface launch injected — chell spawns itself, the calypso binary spawns `chell` from the path — so both hosts share one console. Off a TTY neither attaches; the daemon just keeps listening.","internal":false}]},{"version":"0.12.0","date":"2026-09-09","merge":"3a263f013a83","bump":"minor","changes":[{"hash":"9c320a0","headline":"The boot ends at a login.","body":"An interactive `chell --daemon` no longer rests on the console face: once the daemon is listening it puts an ordinary `chell --remote --attach` surface on its own terminal, as a child on the wire, so the boot log runs straight into a prompt. `exit` detaches and leaves the daemon running, Enter attaches again, Ctrl-C at the idle terminal stops the daemon, and whatever the daemon writes while a surface holds the terminal is held (calypso `consoleCage_start`/`consoleCage_stop`) and printed on detach. Every chell REPL, local or remote, now guards its idle prompt: a stray line (another surface's output, a late warm-up) lands on its own line with the prompt redrawn beneath it.\n\nThe boot readout is lifted with it. A warm-up step running behind the prompt printed its pending row twice and never reported an outcome; it now prints once as `[PENDING]` and settles on the daemon's readout as `[ OK ]` with what it cached or `[FAIL]` with why. Every count takes its noun in the right number (`1 PACS query`, `3 feeds`) through a new brasa `count_noun`. The daemon banner writes every package out in full (brasa `stackBanner_build`/`stackBanner_compose`), adds an ARGUS row when a web surface is served, and drops the welcome; the remote surface banners the daemon's stack the same way. A daemon bound on every interface advertises its fully qualified host name.","internal":false},{"hash":"89d3287","headline":"Daemon boot leaves no open `[PENDING]` row.","body":"The steps that warm behind the prompt were settling after the login took the terminal, which caged them, so their `[ OK ]` never reached the row and it stayed `[PENDING]` on screen. The boot now waits those steps out before the login — they settle in place, every row reading `[ OK ]` or `[FAIL]` — while the daemon is already listening, so nothing reaches it any later for the wait. The startup banner keeps its version column clean: the build hash moves from the CALYPSO row, which it pushed past the column the other rows share, to the `listening` line. The fortune is gone from daemon startup.","internal":false},{"hash":null,"headline":"Updated dependencies [3d11f59]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [9c320a0]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [711e1b3]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d89e31b] - @fnndsc/brasa@0.20.0 - @fnndsc/cumin@3.21.0 - @fnndsc/menu@0.7.0","body":"","internal":true}]},{"version":"0.11.0","date":"2026-09-09","merge":"4b93ef54c7d2","bump":"minor","changes":[{"hash":"49634f2","headline":"feat(calypso): the telemetry heartbeat carries the lane — the command holding it, for how long, how many wait behind it — and CUBE's pace","body":"","internal":false},{"hash":"2545ffa","headline":"feat(calypso): the telemetry heartbeat carries the lab's pulse the engine snapshots","body":"","internal":false},{"hash":null,"headline":"Updated dependencies [49634f2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [49634f2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [49634f2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [2545ffa]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [2545ffa] - @fnndsc/brasa@0.19.0 - @fnndsc/cumin@3.20.0 - @fnndsc/menu@0.6.0","body":"","internal":true}]},{"version":"0.10.2","date":"2026-09-09","merge":"bb6d0d575ad0","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [6cd5ab1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [6cd5ab1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [6cd5ab1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [57ba039]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [57ba039]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [57ba039]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [adf8cc1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [98ab832]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [98ab832]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [98ab832] - @fnndsc/brasa@0.18.0 - @fnndsc/cumin@3.19.0 - @fnndsc/menu@0.5.0","body":"","internal":true}]},{"version":"0.10.1","date":"2026-09-08","merge":"b302035228a4","bump":"patch","changes":[{"hash":"53a736f","headline":"fix(calypso): a feed's topology walk is annunciated on a quiet daemon","body":"The heartbeat re-pushed the promptline only when the index counts moved or the previous push still showed warm-up. A feed's topology walk (a first visit, `proc refresh`) reports its progress into the prompt context page by page but adds its instances to the index only once the walk is done, so on a quiet daemon the counts stood still for the whole walk and the JOBS readout never named the feed — it was annunciated only when a background sweep happened to be moving the counts at the same time. The heartbeat now also pushes while a foreground command is executing, which is exactly when a walk can be in flight.","internal":false}]},{"version":"0.10.0","date":"2026-09-07","merge":"afa00444c12e","bump":"minor","changes":[{"hash":"a7f057c","headline":"feat: a value-taking flag given no value asks for it","body":"`pacs query … --csv-to` with nothing after it now means \"ask me where\". Before, such a flag was silently ignored: the operator asked for a table and got none, which is worse than either answering or refusing.\n\nNo sigil was needed. `?` was the obvious spelling and is already a glob in `string_checkHasWildcard`, so it would have expanded against the VFS; a flag that takes a value and is given none is unambiguous on its own, and the rule now generalises to every flag in the stack without another convention.\n\nThe ask carries what it wants — a `path`, with the session's own cwd as its anchor, a suggested basename, and `EXPORT HERE` as the word its committing control should read. The anchor is a fact rather than a guess: inventing a directory means creating one behind the operator's back. And it is raised only once there is something to write, since a question about a file that may never exist is asked too early.\n\nTwo rules ride with it, both in the daemon, both about who may interrupt an operator:\n\n- **A command marked `instrument` may never ask.** A pane's silent refresh or an ambient cycler raising a question is refused outright — the operator did not issue that command and cannot answer for it.\n- **One question at a time per surface.** A second is refused by name rather than queued, because a queued question is one whose command the operator has forgotten issuing.\n\nAn abandoned ask is not a failed query: the answer stands and only the writing does not happen.\n\n`prompt_current` now takes the whole request rather than a message and a flag, and the daemon relays `wants`, `path` and `commit` to the surface. `repl_confirm` and `repl_questionPath` join the kernel's ask helpers, so a caller states the kind once and every surface reads the same intent.","internal":false},{"hash":"78d85ae","headline":"feat(argus): a location is asked for by borrowing a browser","body":"An ask is never a box. A `path` question opens the instrument that already shows that space: a **new** files pane beside the pane that asked — never an existing browser, since hijacking one loses the operator's place — anchored where the ask said, closing when the errand ends either way.\n\nIts controls ride a bar of its own across the top of the pane: the question as a caption, the composed path as an editable field, **MKDIR** for a folder that does not exist yet, and one verb that commits, reading the word the kernel sent (`EXPORT HERE`). The grill had put those on the mode frame; building it showed why they cannot live there — the frame is a narrow rail against the spine, right for a column of capsules and hopeless for a caption and a path, and it answers to what the _field_ holds, which an errand does not change.\n\nThree defects the live run turned up, each fixed here:\n\n- **The errand opened an empty browser, forever.** The daemon runs commands one at a time, so the listing that would answer the question queued behind the command that asked it: the answer waiting on the browsing, the browsing waiting on the answer. An instrument command now runs **beside** a command waiting on a question — the natural twin of the rule that an instrument may never ask. A pane's own read neither asks nor waits, and the daemon saves and restores the executing command rather than clearing it, so the outer command's output still finds its way home.\n- **The errand split beside the focused pane**, which can be one the current preset does not hold. A split beside a pane that is not in the tree fails silently, and an errand that never opens is a question asked of nobody. The host is now a leaf that is actually on stage.\n- **The anchor could be somewhere nothing can be written.** A session sitting in `/bin` or `/proc` is browsing a provider, not standing where a file lands, so the ask falls back to home rather than offering a destination that is refused the moment it is committed.\n\nLaw `an-ask-borrows-an-instrument`, smoke-enforced. Two consecutive full smoke runs, 103 checks.","internal":false},{"hash":"9e2a9dd","headline":"feat: a verb that acts on the place rides the frame — MKDIR and UPLOAD","body":"Two verbs act on the PLACE the field holds rather than on any row, so they ride the field's own frame beside HOME and BACK, and they appear on a browser's frame and nowhere else — there is no directory to make in a list of feeds.\n\n**MKDIR** asks for a name in the console and makes it where the field points, not where the session's cwd happens to be: a rooted browser is showing a place of its own, and a verb that acted on the session's place instead would make the folder somewhere the operator is not looking.\n\n**UPLOAD** is the verb this surface could not previously speak at all. `upload` reaches the daemon's disk, which a browser has never seen. So the operator's own picker chooses the file, and the bytes travel over the daemon's `/vfs` route — now answering `POST` as well as `GET` — where the **engine** writes them through the kernel. No surface talks to CUBE, the same attach token gates the write as gates the read, and the body is capped. The console keeps the account, because a gesture the surface performs itself still owes the transcript what it did.\n\nNew seam: `Engine.file_write(path, bytes)`, the twin of `file_read`. It writes through salsa's own create and **invalidates the listing it changed**, as every writing builtin does — without that the browser asks for the folder again and is served the folder as it was before the delivery, which reads as an upload that silently did nothing.","internal":false},{"hash":"3df1c41","headline":"docs(calypso): say calypso where the component is meant, and make it typeable","body":"Every other part of the stack is a noun with a role — cumin, salsa, chili, brasa, menu, chell, argus. The session supervisor was the odd one out, described by a flag on another program, so the prose said \"the daemon\" for something that already has a name, a package, a binary and a doctrine document.\n\nHost control is _calypso's_ policy; berths are calypso's; the wire is calypso's. \"Grant calypso host access\" says whose policy changed. \"Grant the daemon\" does not.\n\nOperator-facing text now names it: the flag help, the not-running message, the already-running refusal, the listening banner, the attach errors, the several-sessions chooser, and the host-control sentences — `upload` refusing without the `files` tier, the HOST banner, and argus's HOST lamp tooltip.\n\nThe start hints used to read `chell --daemon <user>@<url>` while the prose said \"run calypso\". They now say `calypso <user>@<url>`, which is a real command, since calypso ships its own binary. The getting-started guide leads with what calypso _is_, then gives both ways to start it — standalone from a saved session, or through chell logging in fresh — because they genuinely differ and one does not replace the other.\n\n**Daemon survives where it is correct**: a mode name, an anchor, a make target, a background process. Code symbols are untouched — `daemon_launch` and its kin describe something that really is a daemon, and churning them buys nothing an operator sees. Command lines inside code blocks were left alone, so nothing became a command that does not exist.","internal":false},{"hash":null,"headline":"Updated dependencies [a7f057c]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [da15f3b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [78d85ae]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [349d7d2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8312a79]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [02ef648]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3df1c41]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [f5c16fe]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [116e8ba]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ec3ef9f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [6234d55]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ba1e5b4]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [404f5e3]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7181f7e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d2a4315]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a245b5f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [9e2a9dd]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5a339f0]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a8449bc]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8446459]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [17964a9]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [62761a3]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [17964a9] - @fnndsc/brasa@0.17.0 - @fnndsc/cumin@3.18.0 - @fnndsc/menu@0.4.0","body":"","internal":true}]},{"version":"0.9.1","date":"2026-09-05","merge":"0422da0acacf","bump":"patch","changes":[{"hash":"e3948f1","headline":"fix(release): publish `@fnndsc/menu`, without which nothing else installs","body":"`@fnndsc/menu` was marked private, so changesets versioned it and then skipped publishing it. cumin, brasa, chell and calypso all depend on it, so every published version since menu was extracted has been uninstallable from a clean registry:\n\n```\nnpm install @fnndsc/brasa\nnpm error 404 The requested resource '@fnndsc/menu@*' could not be found\n```\n\nIt worked in development only because the workspace resolves menu locally, and it went unnoticed because nothing ever installed these packages from npm alone.\n\nmenu is an ordinary library — the wire schemas and types three published packages import. Its manifest was already publish-ready and identical in shape to its siblings; only the flag stood in the way. It is dropped.\n\nThe dependency range is pinned to `^0.3.0` at the same time. `\"*\"` was an artefact of menu being private, since changesets does not rewrite ranges for packages it will not publish, and `\"*\"` on a published dependency means any future breaking change applies silently.\n\n`argus` stays private, and correctly so: it is a browser bundle served from calypso's web root, not a library anyone imports.","internal":false},{"hash":null,"headline":"Updated dependencies [e3948f1] - @fnndsc/menu@0.3.1 - @fnndsc/cumin@3.17.1 - @fnndsc/brasa@0.16.1","body":"","internal":true}]},{"version":"0.9.0","date":"2026-09-04","merge":"f25e3f4babc4","bump":"minor","changes":[{"hash":"4f034b9","headline":"Host control: `chell --daemon --host-control[=shell,files,pipes]` lets the daemon declare capabilities of its own — `!` runs on the daemon host, pipe segments run there, `upload`/`download` reach its disk — off by default, refused on a non-loopback bind without `--expose-host-control`, and annunciated everywhere (attach ack `hostControl`, the daemon face, the prompt's HOST segment, a remote shell's banner).","body":"Without the `files` tier, `upload` under a daemon now refuses instead of reading the daemon host's disk.","internal":false},{"hash":null,"headline":"Updated dependencies [f73e6c2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5dc064e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [75f1e5f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3afaa65]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5b4b7db]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [eaf6c67]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [73aa61a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [4f034b9]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [aa25502]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [f8d1b1c]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [85c6813] - @fnndsc/cumin@3.17.0 - @fnndsc/menu@0.3.0 - @fnndsc/brasa@0.16.0","body":"","internal":true}]},{"version":"0.8.0","date":"2026-09-02","merge":"e4e14b714f31","bump":"minor","changes":[{"hash":"97af423","headline":"Watches: a surface can keep a running feed live.","body":"New wire pair `watch` / `unwatch` (subject = `/proc/jobs/feed_N`, owned per surface, released on detach) and a `watched` report (`live` | `settled` | `stale`). While anyone watches a feed the engine samples it on an adaptive cadence (3 s while it changes, backing off to 30 s when quiet), and whenever a visit changes the cache it publishes the refreshed `feed.dag` model to every surface as a session-bus envelope from the `daemon` surface, off the scrollback. A feed that settles reports `settled` and the watch ends; a failed sample reports `stale` and keeps trying. `proc watch <feed>` / `proc unwatch <feed>` are the console forms (`proc watch` lists). The engine gains an ambient event bus for events it originates on its own. Feed visits within one second of each other now share one sync, and `feedVisit_sync` reports whether it succeeded.","internal":false},{"hash":null,"headline":"Updated dependencies [920e0ac]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7a0f06e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [920e0ac]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c716624]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [cece0dc]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [97af423] - @fnndsc/cumin@3.16.0 - @fnndsc/brasa@0.15.0 - @fnndsc/menu@0.2.0","body":"","internal":true}]},{"version":"0.7.1","date":"2026-09-01","merge":"77fa3b4e5149","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [85791b3] - @fnndsc/brasa@0.14.0","body":"","internal":true}]},{"version":"0.7.0","date":"2026-08-31","merge":"03f466be83ce","bump":"minor","changes":[{"hash":"eebdc7d","headline":"A daemon writes its attach addresses to a file, and keeps its boot animation.","body":"Stopping the brain-activity pulse in daemon mode made the terminal easy to\nselect from and the session feel dead. The animation stays; the addresses are\nwritten where they can be read without fighting a repainting screen or\nsurviving a `clear`.\n\nThe note lands at `/tmp/calypso-<user>.attach`, and the banner names it. It\ncarries the attach token, which is a credential, in a world-readable directory\n— so it is created `0600`, created exclusively so a symlink planted at the path\nmakes the write fail rather than land somewhere of an attacker's choosing, and\nremoved when the daemon exits.\n\n`calypso --berths` reads the same facts from the berth — `0600` in the user's\nown runtime directory — and remains the safer route for anything scripted.","internal":false},{"hash":"5d131c8","headline":"A daemon's terminal stops repainting itself, and its attach addresses can be read back.","body":"`logo_animatePulse` starts a 100ms interval that saves the cursor, jumps up the\nscreen, repaints the logo and restores — and it runs for as long as the process\ndoes. The interactive path stops it once boot finishes; the daemon path never\ndid. So a daemon's terminal was being rewritten ten times a second forever,\nwhich made the banner it had just printed — the URLs and the attach token, the\nonly thing anyone needs from that terminal — impossible to select.\n\n`calypso --berths` prints how to attach to every live daemon: the ARGUS link\nand the ready-to-paste `chell --remote --attach` command, per identity.\n\nThe facts are read from the berth rather than copied to a more convenient\nplace. A berth already holds the url and token at mode `0600` in the user's\nruntime directory; `/tmp` would be easier to reach and is world-readable, and\nthe token is a credential.","internal":false},{"hash":"0adb4f2","headline":"The daemon terminal gets a resting state: the console face.","body":"The boot-phase brain animation repainted by cursor arithmetic against a\nscrolling buffer — counting rows printed beneath it and jumping up — so a\nretry warning landing mid-frame interleaved with the art, and the pulse had\nto kill itself the moment output scrolled the logo away: the brain went\nsilent exactly when the daemon came alive.\n\nBoot is unchanged and text-first: the brain prints, pulses while\ncredentials are checked, and every address and token scrolls into ordinary\nscrollback. What is new is what happens when boot completes on a TTY: the\ndaemon switches to the alternate screen buffer — the same screen vim and\nhtop own — where the brain pulses forever at fixed coordinates over an\nidentity panel (identity, wire, ARGUS URL, token, berth, attach line,\nuptime, attached surfaces, index counts), with the last few log lines caged\nin a dim strip beneath. The pulse is honest: idle is a slow shimmer, an\nexecuting command quickens it, a surface attaching flares it.\n\nEsc or `q` drops to the normal buffer, restored byte-perfect with the boot\nlog intact and the lines captured while the face was up flushed beneath it;\nany key returns. Ctrl-C stops the daemon from either mode. Off a TTY\n(systemd, nohup) nothing changes: sequential logging, as before.\n\nThe brain art and its frame renderer moved from chell to brasa\n(`logo_frameRender`, `logo_linesRender`, and the new `logoRows_count` /\n`logoColumns_count`), so any surface can draw it; chell keeps only its\nboot-terminal animation host. `daemon_launch` now returns the launched\ndaemon's addresses and handle, which both launch paths (`chell --daemon`\nand the standalone `calypso` binary) feed to the face.","internal":false},{"hash":"a3bd3e9","headline":"The console face now covers the whole daemon boot, in two phases.","body":"From warm-up on, the alternate screen shows the brain in a frenetic boot\npulse over a tall strip of the streaming boot log — the messages are the\npoint while the machine comes up. When the daemon is listening, the same\nscreen settles in place into the steady instrument: calm ambient pulse,\nidentity panel, live telemetry, and the closing hint \"HIT ESC TO TOGGLE\nTHE BOOT LOG\". Esc toggles to the raw text log in either phase; any key\nreturns.\n\nAlong the way: the log ring now treats a carriage return as a redraw, so a\nspinner's thousand frames stay one line; the face steps aside\n(`face_suspend`/`face_resume`) when warm-up failure asks the operator a\nquestion, so the prompt's readline owns the terminal; and a boot dying with\nthe face up flushes the ring — the abort reason included — into the normal\nbuffer instead of vanishing with it. New calypso API: `face_boot`,\n`face_ready`, `face_suspend`, `face_resume`.","internal":false},{"hash":"9ed68cd","headline":"`download` no longer writes to the daemon host's disk.","body":"File delivery is now a surface capability, like prompting, piping and editing already were.\n\nThe builtin resolved its destination with `path.resolve()` inside the engine,\nso the bytes landed on whatever machine hosted the engine. For a local shell\nthat is right — the engine is in-process and the operator's disk is the\nengine's disk. Under a daemon it put files on a machine nobody attending the\nsession was sitting at, and from a browser the question \"download to where?\"\nhad no answer at all.\n\n`Surface` gains `fileDeliver`, and `SurfaceCapabilities` gains `fileDelivery`\nalongside `engineFilesystem` — which says whether a path the engine resolves is\na path this surface's operator can open. Only an in-process local shell claims\nit. When it is false, `download` hands the file to the surface, which puts it\nsomewhere its operator can actually reach: the client's disk for\n`chell --remote`, the download manager for `argus`.\n\nOnly the request crosses the wire. Each surface fetches the bytes itself\nthrough the daemon's existing token-gated `/vfs` route, so a DICOM series is\nnot base64'd across a channel meant for session state — the intent travels\nthrough the vocabulary and the bytes travel through the byte route.\n\nThe local path is unchanged: a local `chell` still uses the existing transfer\nmachinery, with its globs, directory walks and progress reporting.\n\nA directory has no bytes to hand over, and what to do about that depends on\nwhat the surface has — a third capability, `localFilesystem`, declared in the\nattach handshake and answered by the surface rather than by the daemon. A shell\nowns a filesystem wherever it runs, so `chell --remote` receives the tree file\nby file and gets the folder it asked for. A browser owns no directory and can\ntake files only one at a time, so several hundred DICOM instances would be\nseveral hundred saves; for that surface alone a directory is archived into a\nsingle CUBE file first, through\nthe registered `zip v20240311` pipeline — `pl-dircopy` into a zip plugin, the\nsame mechanism the ChRIS web UI has used for years, but living in `brasa` where\nevery surface reaches one implementation instead of each client re-deriving the\nsequence. `CHRIS_ARCHIVE_PIPELINE` names a different pipeline where a\ndeployment registered one. When it is absent, the failure says which pipeline\nis missing and that it can be registered from the store.\n\nThe archive run announces itself rather than creating a feed silently, because\nit is a workaround for CUBE having no directory-archive route: issue #233.\n\n`upload` has the mirror problem — it reads from the engine host's disk — and is\nnot addressed here, because the browser direction needs a file picker. See\nissue #232.","internal":false},{"hash":"790f994","headline":"Instrument traffic stays off the session bus.","body":"A surface's internal commands — a panel's silent listing refresh, an ambient\ncycler's pipeline renders — are not things the operator said, yet they were\nbroadcast to sibling surfaces and retained in scrollback, so a second\nattached console printed them live and every reattach replayed them as\nnoise. The execute message gains an optional `instrument` flag: the daemon\nruns the command normally but skips the bus publish and the scrollback\nentry, so siblings and replays carry only operator activity.","internal":false},{"hash":"e58bf58","headline":"The wire contract moves out of `calypso` into a package of its own, `@fnndsc/menu`.","body":"A surface author should depend on the contract, not on the daemon that happens\nto serve it. Until now the contract was a subpath of `@fnndsc/calypso`, so a\nthird-party surface took a dependency on the session host to learn the shape of\na result. `menu` imports nothing from the stack and sits below `cumin`, so both\nthe engine that produces envelopes and the browser that renders them can load\nit.\n\nTwo vocabularies the contract narrows to moved with it, because they were\ndeclared above the thing that describes them: the structured-progress values\n(previously `@fnndsc/brasa/progress`) and the prompt-facing process-index state\n(previously `@fnndsc/cumin/proc-prompt`). Both are re-exported from their old\nhomes, so existing importers are unaffected; `@fnndsc/cumin/proc-prompt` as a\nsubpath is gone, and its types are available from `@fnndsc/cumin` directly.\n\n`CommandEnvelope` is now inferred from the schema that validates it. The engine\nand the wire previously carried separate declarations of the same shape, tied\ntogether by a compile-time assertion that one stayed assignable to the other; a\nsingle inferred type makes that drift impossible rather than detected.\n`@fnndsc/cumin` re-exports the name, so nothing that imports it changes.\n\n`@fnndsc/calypso/protocol` no longer exists as a subpath. Import\n`@fnndsc/menu`. The names remain re-exported from `@fnndsc/calypso` itself for\nnow, since most of the stack has always reached them there.\n\nThis is the scaffold for envelope Phase-2 — a typed result model for every\ncommand — recorded in `docs/menu.adoc`. `menu` itself is unpublished until that\nwork lands, so thirty payload shapes can settle without forcing a release each\ntime.","internal":false},{"hash":"28b9a9f","headline":"Regard: the session learns what the operator is indicating.","body":"The wire contract gains one message, `regard`, travelling both directions\nunder one shape: a surface reports the addressable thing the operator most\nrecently indicated (a file clicked in a browser, a DAG node selected), and\nthe daemon retains it as session truth — last write wins — mirrors it into\nthe engine, and rebroadcasts it to every attached surface. A late attacher\nreceives the retained value with its ack, so spawn-then-see workflows start\nseeing immediately.\n\nThe value is an address in the namespace plus the model kind it was\nindicated through, never view-space coordinates: what has no address is view\nstate and stays surface-side. The brasa session retains the value behind\n`regard_get`/`regard_set`, so engine-side consumers can answer \"what is the\noperator regarding\" without any surface geometry crossing the seam. Design\nrecord: apps/argus/docs/aegis.adoc.","internal":false},{"hash":"8842ab4","headline":"Indeterminate progress now crosses the daemon wire as typed facts rather than terminal escapes.","body":"The spinner used to write `\\r\\x1b[K<frame>` and cursor hide/show to the status\nchannel twelve times a second, so every attached surface received terminal\nchoreography whether or not it was a terminal — a web surface had to emulate a\ncharacter grid to recover the meaning, and got it subtly wrong. It now announces\n`operation: 'task'`, `kind: 'inspection'`, `phase: 'working'` with a label, and\ncloses with `phase: 'complete'`. Each surface draws waiting in its own idiom.\n\nOnly state changes cross the wire: frames and elapsed counters are the\nrenderer's, so a spin of any length costs two events instead of dozens per\nsecond. `chell` gained the elapsed counter its spinner used to bake into the\nlabel, and `argus` gained a full progress renderer — indeterminate work spins,\ncounted work fills a bar — which also surfaces the download progress it had\nbeen silently discarding.\n\nThe `operation` and `phase` enums gained `task` and `working`. Every enum on\nthe progress message now degrades on an unknown value instead of failing the\nparse and dropping the message whole: `operation` to `task`, `phase` to\n`working`, `status` to `unknown`, `kind` and `unit` to absent. That makes good\nthe contract's promise that change within a major is additive — for future\nadditions, since the fallback lives in the build doing the reading.\n\nThe spinner keeps its call signature, so its callers are unchanged. Its\n`showTiming` and `clearLine` arguments are now ignored: both are rendering\ndecisions. It also no longer inspects `process.stdout.isTTY` before announcing,\nwhich had suppressed progress inside the daemon, where the engine's own stdout\nis never a terminal but the attached surface may well be able to draw.","internal":false},{"hash":"19a4d5b","headline":"The daemon boot experience, settled: classic boot, minimal face.","body":"Booting is the classic in-scroll experience again — the brain lights up at\nconnect and the boot log with its in-stage progress scrolls beneath it\n(frames now paint as one buffered write, so concurrent log lines cannot\ntear the art). When the daemon is ready, the boot screen is replaced by a\nminimal console face on the alternate buffer: the animating brain,\nvertically centered, one status line (DAEMON RUNNING · SESSION ESTABLISHED,\nor ENGINE EXECUTING while a command runs), and the Esc hint. Nothing else.\nEsc shows the verbatim text record — boot log, addresses, token — which the\nready handoff now halts the pulse without repainting, so it can never again\nbe stamped over; any key returns to the brain.","internal":false},{"hash":"976c753","headline":"`chell --remote` can attach to a daemon on another machine.","body":"`CALYPSO_BIND` has always opened the wire to the network, and the attach token\nhas always gated the session — but _discovery_ is local. A berth is a file in\none host's runtime directory, so a surface on another machine has none to read,\nand the berth recorded `ws://127.0.0.1:<port>` regardless of what the daemon\nbound. The wire was reachable and nothing could tell a remote `chell` where to\npoint: a browser could attach and a terminal could not.\n\n`--attach` takes an explicit address and skips discovery:\n\n```\nchell --remote --attach http://pangea:41234/?token=abc123\n```\n\nThe address is the one the daemon prints. The web surface and the wire share a\nport, so the ARGUS link names both and pasting it is the whole interaction;\n`--token` supplies the token separately where an address carries none, and\n`https`/`wss` are preserved. The berth is built in memory and never written,\nsince another machine's daemon does not belong in this machine's berth\ndirectory.\n\nA daemon bound to anything but loopback now records a routable URL in its own\nberth and prints the ready-to-paste attach command beside the ARGUS link.\n\nThis is not the `porter` server. There is no listener beyond the one\n`CALYPSO_BIND` already opened, no cross-host auth beyond the attach token, and\nno way to discover a daemon you were not told about.","internal":false},{"hash":"bf09355","headline":"The telemetry heartbeat now refreshes the promptline while the process index moves: warm-up progress reaches idle surfaces without waiting for a command, and the prompt settles when reconciliation completes.","body":"","internal":false},{"hash":null,"headline":"Updated dependencies [1d600ac]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0adb4f2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [31c2a50]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [1c195a7]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [9ed68cd]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [e58bf58]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [e062dbf]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [87f7c59]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3125517]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [28b9a9f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8842ab4]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b39b584] - @fnndsc/brasa@0.13.0 - @fnndsc/cumin@3.15.0","body":"","internal":true}]},{"version":"0.6.1","date":"2026-08-26","merge":"8a45fe32ae76","bump":"patch","changes":[{"hash":"07ae801","headline":"The daemon now finds the argus bundle relative to its own module location, not only the working directory.","body":"A dev-tree `chell --daemon` launched from anywhere serves the web surface; previously it silently served nothing unless the daemon was started from the checkout root or `CALYPSO_WEB_ROOT` was set by hand.","internal":false}]},{"version":"0.6.0","date":"2026-08-26","merge":"6d1e218fbad2","bump":"minor","changes":[{"hash":"0ad04f2","headline":"The engine can now hand raw file bytes to a hosting daemon: brasa's `BrasaEngine` gains an optional `file_read(filePath)` that resolves a ChRIS VFS path to a `Buffer` through chili's binary cat.","body":"Calypso's daemon exposes it as a token-gated `/vfs?path=&token=` HTTP route with extension-derived content types, letting a web surface render images and other binary content that a text transcript cannot carry.","internal":false},{"hash":"1928d4b","headline":"The daemon now rides an explicit HTTP server: WebSocket upgrades carry the session contract unchanged, and plain GETs serve a configured static web root (the built ARGUS surface), discovered from `CALYPSO_WEB_ROOT` or a monorepo checkout's `apps/argus/dist`.","body":"The launcher prints the browser URL with the attach token. A new `@fnndsc/calypso/protocol` subpath exports the browser-safe wire contract (schemas, validation, version) without server-side dependencies.","internal":false},{"hash":null,"headline":"Updated dependencies [0ad04f2] - @fnndsc/brasa@0.12.0","body":"","internal":true}]},{"version":"0.5.1","date":"2026-08-24","merge":"fbb9d089711b","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [14f8ee8]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [69b0617]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7ed8e1c]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7dc3bca] - @fnndsc/cumin@3.11.0 - @fnndsc/brasa@0.11.0","body":"","internal":true}]},{"version":"0.5.0","date":"2026-08-21","merge":"364c31576aa7","bump":"minor","changes":[{"hash":"67377a3","headline":"Unify the five correlation-id request/reply implementations onto one `RequestBroker`.","body":"The daemon's four surface-delegated brokers (prompt, pipeline segment, host shell, edit) and the remote client's own pending-request map previously each reimplemented the id/pending/close lifecycle with divergent correctness; all five now share one class that uniformly guarantees origin-validated settles (no surface can answer another surface's prompt), close-listener removal on settle (no per-request listener leak), and rejection when the origin disconnects. The protocol gains optional `promptError` and `editError` messages (additive, no version bump) so a surface can report a failed or impossible prompt or edit. Behavior change on the remote surface: a client without a prompt, pipe, or edit handler now reports the inability as an error instead of silently answering empty, passing pipe input through unchanged, or returning an unchanged \"successful\" edit.","internal":false},{"hash":"b2f5ad3","headline":"Greet every surface with the stack's identity.","body":"Builds now record the short git hash they were produced from (`dist/buildinfo.json`, written by the new `scripts/buildinfo.mjs` build step), and brasa exposes it through `buildHash_get` alongside `welcomeLine_build`/`welcomeLine_compose`, which render a banner of the form `ChELL Executes Layered Logic, v 5.3.0 (886f09). Welcome.` An interactive chell session prints the banner and a short fortune at boot, the calypso daemon announces its banner plus an aligned version line for every stack layer (chell, brasa, chili, salsa, cumin, calypso) when it starts listening, and the attach handshake gains an optional `stack` field carrying all six versions and the build hash, so a remote surface banners the daemon's full reported stack rather than its local install's. `fortune_random` is exported for reuse, with an optional line-count bound so banners favour short cookies.","internal":false},{"hash":"8ec8a4b","headline":"Add explicit, command-scoped CUBE elevation with `sudo <command>`.","body":"The active surface collects an administrator identity and hidden password; a temporary CUBE client runs only the nested command, then the normal session is restored. Group membership and plugin registration now suggest a copyable `sudo` rerun after an authorization failure, and plugin registration no longer owns a separate interactive admin prompt.","internal":false},{"hash":"d0ac04f","headline":"Preserve failure causes and tighten cache contracts.","body":"Errors that were replaced by generic messages now carry their real cause: controller and handler creation failures name the underlying error instead of \"no ChRIS context\", `cat` shows the actual fetch failure, docker command failures surface stderr detail, context-set errors actually print, settings load/save failures are announced instead of silently using defaults or losing changes, unreadable berth and discovery files are named instead of reading as \"no daemon\", token-file read errors are distinguished from the logged-out state, and resource deletes report why they failed. Every remaining deliberate error absorption now carries a dated adjudication comment. Cache contracts: the PACS provider's decoded-query cache caches settled results only and is size-bounded; the object-context factory gains an eviction hook (`objContext_evict`) for deleted plugin or feed ids; `mv` and `cp` invalidate the whole affected listing subtree; and a new PACS query invalidates the cached `/net/pacs/queries` listing so it appears in the next `ls` immediately.","internal":false},{"hash":"3cde784","headline":"Publish refreshed prompt context before completing a remote command so state-changing commands cannot leave ChELL displaying a stale prompt.","body":"","internal":false},{"hash":"ac69b3e","headline":"Run ChELL shell escapes on the originating surface, including remote clients, instead of exposing the CALYPSO daemon host process and filesystem.","body":"","internal":false},{"hash":null,"headline":"Updated dependencies [2e60785]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [66bc932]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8ec8a4b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d0ac04f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [886f09c]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [50e9bb1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d0ac04f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [22db63f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ac69b3e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0e92d4d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [590a943]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [fa81126]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b2f5ad3] - @fnndsc/brasa@0.10.0 - @fnndsc/cumin@3.9.0","body":"","internal":true}]},{"version":"0.4.5","date":"2026-07-18","merge":"534d57150256","bump":"patch","changes":[{"hash":null,"headline":"Carry semantic Pipeline-inspection progress from a hosted Brasa engine to the remote surface that issued the command.","body":"","internal":false},{"hash":null,"headline":"Updated dependencies - @fnndsc/brasa@0.9.8","body":"","internal":true}]},{"version":"0.4.4","date":"2026-07-17","merge":"90c5b53729d7","bump":"patch","changes":[{"hash":null,"headline":"Carry cold, cached-refresh, and failed `/proc` lifecycle state through the CALYPSO prompt contract;","body":"reorder p10k segments and render distinct lifecycle clues for local and remote surfaces.","internal":false},{"hash":null,"headline":"Updated dependencies - @fnndsc/cumin@3.8.2 - @fnndsc/brasa@0.9.3","body":"","internal":true}]},{"version":"0.4.3","date":"2026-07-16","merge":"c79731f39938","bump":"patch","changes":[{"hash":"6f0833a","headline":"Release the coordinated ChELL stack with deterministic `/proc` topology progress, complete visible-feed indexing, safe warm-up query gating, remote one-shot command completion, and refreshed daemon documentation.","body":"","internal":false},{"hash":null,"headline":"Updated dependencies [6f0833a] - @fnndsc/cumin@3.8.1 - @fnndsc/brasa@0.9.2","body":"","internal":true}]},{"version":"0.4.2","date":"2026-07-16","merge":"1896be7ff9ef","bump":"patch","changes":[{"hash":"71a6cd4","headline":"Route a pipeline executable's bare `--signalflow` flag to SignalFlow diagram output and provide contextual help for dynamic pipeline commands.","body":"Keep final-segment redirection on the originating surface, propagate remote pipe-segment failures back to the engine, and prevent remote command errors from terminating the interactive ChELL client. Daemon mode now reports shared startup cache warming and publishes its listening berth only after engine readiness. Consistently document `signalflow -` for stdin rendering.","internal":false},{"hash":null,"headline":"Updated dependencies [71a6cd4] - @fnndsc/brasa@0.9.1","body":"","internal":true}]},{"version":"0.4.1","date":"2026-07-15","merge":"942aabcdd399","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [e630f79]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [e630f79] - @fnndsc/brasa@0.9.0 - @fnndsc/cumin@3.8.0","body":"","internal":true}]},{"version":"0.4.0","date":"2026-07-15","merge":"d7c332b437ca","bump":"minor","changes":[{"hash":"50d0680","headline":"Run several CALYPSO daemons on one machine — one per CUBE identity — driven by the same `--daemon` / `--remote` verbs:","body":"```\nchell --daemon me@https://cube/api/v1/ -p pw # my daemon\nchell --daemon them@https://cube/api/v1/ -p pw # their daemon (isolated)\nchell --remote me@https://cube/api/v1/ # attach to MY daemon\nchell --remote # sole berth attaches; picker if several\n```\n\nDaemon discovery is now keyed by identity: each daemon advertises a **berth**\n(`{ identity, url, token }`) under `$XDG_RUNTIME_DIR/calypso/` (falling back to the\nsystem temp dir), `0700` on the directory and `0600` on each file. `--daemon` refuses\nto start a second daemon for an identity that is already live, pointing at the\nrunning one instead. Bare `--remote` attaches the sole live berth, offers an\ninteractive picker when several are running, and requires an explicit\n`<user>@<url>` in a non-interactive context.\n\nAll berth lookup goes through a `BerthResolver` seam (`resolve`, `list`), with a\n`LocalBerthResolver` over the runtime files and an injected liveness probe that\nreaps berths whose daemon has gone. The seam leaves room for a future network\nresolver without any surface change.","internal":false}]},{"version":"0.3.7","date":"2026-07-14","merge":"107999d0bcd3","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [8ac7ef9] - @fnndsc/brasa@0.8.0","body":"","internal":true}]},{"version":"0.3.6","date":"2026-07-14","merge":"177711eef683","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [a1f6694]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [01ab743]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b8ae635]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ca63e8b] - @fnndsc/cumin@3.7.0 - @fnndsc/brasa@0.7.0","body":"","internal":true}]},{"version":"0.3.5","date":"2026-07-13","merge":"f0c19c50afad","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [e5a30f7] - @fnndsc/brasa@0.6.0","body":"","internal":true}]},{"version":"0.3.4","date":"2026-07-13","merge":"79729c9cf094","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [c2087d0] - @fnndsc/brasa@0.5.0","body":"","internal":true}]},{"version":"0.3.3","date":"2026-07-13","merge":"cb2432e85fb3","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [512e14f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [880d37a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [e43f42a] - @fnndsc/brasa@0.4.0","body":"","internal":true}]},{"version":"0.3.2","date":"2026-07-13","merge":"96bb6d340604","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [a0d3df5] - @fnndsc/brasa@0.3.0","body":"","internal":true}]},{"version":"0.3.1","date":"2026-07-12","merge":"64fea26ab02f","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [d69b086] - @fnndsc/brasa@0.2.0","body":"","internal":true}]},{"version":"0.3.0","date":"2026-07-11","merge":"b1424faffb2a","bump":"minor","changes":[{"hash":"c824000","headline":"calypso is now a self-contained session daemon.","body":"It gains the `calypso` binary (create a brasa engine, restore a saved session, host it over WebSocket) and depends on the new `@fnndsc/brasa` engine package.\n\nBreaking (allowed under 0.x): the package is now ESM-only (was CommonJS), and the `promptline` wire message carries a prompt `context` for the surface to theme, rather than a pre-rendered `text` string.","internal":false}]},{"version":"0.2.0","date":"2026-07-10","merge":"01d4e04fe5c8","bump":"minor","changes":[{"hash":"f8e0233","headline":"Add the CALYPSO daemon: a WebSocket host over one engine.","body":"`CalypsoDaemon` binds the loopback interface only and hosts a single engine, which it accepts through a structural `HostedEngine` interface (chell's `ChellEngine` satisfies it) rather than importing chell — keeping calypso engine-agnostic and free of a package cycle. A surface attaches with the contract version and a random attach token (generated at startup, written to a user-readable 0600 file for same-user discovery, compared in constant time via `timingSafeEqual`); once attached it drives the engine with `execute` and `complete` messages and receives `result` and completion replies, with execution serialized per connection. CUBE credentials never cross the wire — the hosted engine holds its own session. This slice returns each command's final result envelopes; live output streaming and the cross-surface session bus build on it.","internal":false},{"hash":"30a3e1e","headline":"Interactivity over the wire: a builtin that prompts during a remote command now reaches the surface running it.","body":"The contract gains a `prompt` request (daemon→surface, with hidden-input support) and a `promptAnswer` reply (surface→daemon). The daemon serializes execution across the whole session so a mid-command prompt has one unambiguous target, and exposes an input broker (`prompt_current`) the host wires into its `Surface`; the `chell --daemon` launcher installs a surface whose `prompt` delegates to it, so `repl_question` (passwords, confirmations, the plugin admin flow, the prompt configurator) works over the wire unchanged. The `chell --remote` client answers incoming prompt requests from its own terminal (hidden when asked) and replies. Completion already round-trips from the earlier daemon work; the themed pushed prompt string and client-side pipe-segment execution remain follow-ups.","internal":false},{"hash":"93e604f","headline":"Run pipeline segments on the surface, never on the daemon host.","body":"Segment execution becomes a surface capability: the `Surface` gains `pipeSegments` (a capability flag) and a `pipeSegment(command, input)` method. The local CLI runs segments in-process exactly as before (byte-identical); the daemon's surface routes them over the wire (new `pipe`/`pipeResult` messages, base64 for the bytes) to the surface running the command, which runs them on its own machine — so a pipeline like `ls | grep foo` never spawns anything on the daemon host, closing that attack surface. A surface without the capability (a browser) fails such pipelines with a clear message. Completes the interactivity work: prompts, completion, the pushed prompt string, and pipe segments all now work over the wire.","internal":false},{"hash":"f492dd9","headline":"Push the themed prompt string to remote surfaces.","body":"Only the daemon holds the session context the prompt renders, so it renders the prompt and pushes it (a new `promptline` message) to every surface on attach and after each command — the context may have changed. A surface prints what it receives, so prompt themes look identical whether the session is local or remote. chell factors prompt rendering into a shared `sessionPrompt_render` used by both the local REPL and the daemon's `promptProvider`; the `chell --remote` client renders the latest pushed prompt (falling back to a fixed string until the first push), replacing the placeholder prompt it showed before.","internal":false},{"hash":"7cee888","headline":"The surface owns the local editor, so `edit` works over the wire.","body":"The `Surface` gains a `localEdit(content, extension)` method (resolving the flag-only deferral from the prompt-capability work): the CLI surface backs it with the temp-file-and-`$EDITOR` mechanics that used to live in the `edit` builtin, and the daemon backs it by routing to the surface running the command (new `edit`/`editResult` messages + an `edit_current` broker) so the operator's own editor opens, never one on the daemon host. The `edit` builtin no longer touches processes or temp files for editing — it fetches the file, hands the content to `surface.localEdit`, and uploads the result; `chell --remote` opens the client's editor. A surface without the `localEdit` capability (a browser) fails `edit` with a clear message.","internal":false},{"hash":"e293d97","headline":"Add the session bus to the daemon.","body":"All attached surfaces share one session: each command's result envelopes are broadcast to the _other_ attached surfaces as `session {surface, envelope}` events (tagged with the surface that produced them), so a command issued in one surface is immediately visible in the rest — the originator receives its own correlated `result`, not a duplicate broadcast. A bounded scrollback ring buffer (default 200 envelopes, configurable via `scrollbackSize`) is replayed to an attaching surface so it does not join blind; scrollback is presentation rather than truth, so a daemon restart correctly loses it. Surfaces are dropped from the bus when their socket closes.","internal":false},{"hash":"38df08f","headline":"Introduce `@fnndsc/calypso`, the fifth mise package: the session daemon that will host the chell engine and serve it to surfaces over a WebSocket.","body":"This first slice is the wire contract — the typed protocol schemas and boundary validation every message crosses. Messages are two direction-keyed discriminated unions (surface→daemon: attach/execute/complete; daemon→surface: attached/result/complete/output/session/error), defined as zod schemas that are the single source of truth and from which the message types are inferred. A `commandEnvelopeSchema` validates cumin's `CommandEnvelope` on the wire, kept in step with cumin's type by a compile-time guard so the contract cannot silently drift. Boundary validation rejects structural violations, tolerates unknown additive fields, and never throws; the contract version is carried in the attach handshake and refused on mismatch. See docs/calypso.adoc for the governing design.","internal":false},{"hash":null,"headline":"Updated dependencies [aa81b0a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [2099ff6]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c47ff22] - @fnndsc/cumin@3.5.0","body":"","internal":true}]}]}
1
+ {"package":"@fnndsc/calypso","version":"0.19.6","built":"2026-10-06T01:19:28.011Z","releases":[{"version":"0.19.6","date":"2026-10-05","merge":"e8e51d6f6da5","bump":"patch","changes":[{"hash":"9f4c181","headline":"The daemon's berth now records which package versions it runs and when it booted.","body":"A porter reads that to tell a session from before its last upgrade; older berths without the field count as older.","internal":false}]},{"version":"0.19.5","date":"2026-10-05","merge":"805618f64f87","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [c806e86] - @fnndsc/argus@0.26.0","body":"","internal":true}]},{"version":"0.19.4","date":"2026-10-05","merge":"ecfe0e091342","bump":"patch","changes":[{"hash":"5a0eef5","headline":"The package ships its release notes, so a session can say what changed.","body":"They are read from CHANGELOG.md at build into dist/notes.json.","internal":false},{"hash":null,"headline":"Updated dependencies [5a0eef5]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5a0eef5]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5a0eef5] - @fnndsc/brasa@0.33.0 - @fnndsc/menu@0.19.0 - @fnndsc/argus@0.25.0 - @fnndsc/cumin@3.27.5","body":"","internal":true}]},{"version":"0.19.3","date":"2026-10-05","merge":"ff1316b2d9fb","bump":"patch","changes":[{"hash":"6901a81","headline":"The daemon answers the kernel's `peers` seam with the surfaces attached to the session, so `who` can name them (the games shelf, #892).","body":"","internal":false},{"hash":null,"headline":"Updated dependencies [6901a81]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [6901a81] - @fnndsc/brasa@0.32.0 - @fnndsc/argus@0.24.0","body":"","internal":true}]},{"version":"0.19.2","date":"2026-10-04","merge":"8b4c28c80fc2","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [73c0087] - @fnndsc/menu@0.18.0 - @fnndsc/brasa@0.31.5 - @fnndsc/argus@0.23.2 - @fnndsc/cumin@3.27.4","body":"","internal":true}]},{"version":"0.19.1","date":"2026-10-04","merge":"33717fb2d21d","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [c9f9156]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d04a2ef] - @fnndsc/argus@0.23.0","body":"","internal":true}]},{"version":"0.19.0","date":"2026-10-03","merge":"b737b6d5269e","bump":"minor","changes":[{"hash":"51315ec","headline":"The calypso daemon knows when it is stale.","body":"It fingerprints its own packages' code (version and compiled scripts' content) when it starts, reads the fingerprint again on every attach and once a minute, says `stale` in its attach ack, and pushes a `stale` message when the answer flips. ARGUS says CALYPSO DAEMON OUT OF DATE only when the daemon says so, so an ARGUS-only release no longer alarms every running daemon; an open ARGUS learns of an upgrade within a minute. A daemon too old to report `stale` falls back to the build-stamp comparison.","internal":false},{"hash":"33e4f1d","headline":"A session restarts from its own browser and stays logged in.","body":"Porter's new `POST /restart` (cookie-gated: only the cookie's own session) tells the old calypso daemon why, ends it, and boots a fresh one with chell's new `--saved-token` login, which uses the token the identity saved and refuses rather than come up offline. The browser follows the boot on the greeter; a refused saved token ends at the door with the reason. On SIGTERM the daemon sends `closing` (restart, end or stop) to every surface before it exits, and a remote chell prints why it went. `porter --end` leaves `end` as the reason.","internal":false},{"hash":"fe4b6b4","headline":"The calypso daemon is restarted by its own operator, behind a door.","body":"A RESTART pill stands beside LOG OUT, and the out-of-date notice's cure \"Restart the calypso daemon\" is a control. Both ask first in the notice's spot (\"Restart the calypso daemon? You'll stay logged in; …\"), naming what a restart would cut off right now: the running command, unsaved edits, other attached browsers and chells. YES asks the door to restart and follows the greeter back in; another ARGUS on the session says why it dropped and follows on its own. The daemon's heartbeat now lists the attached surfaces (id and kind) and its attach ack gives each surface its own id.","internal":false},{"hash":null,"headline":"Updated dependencies [51315ec]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [33e4f1d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [fe4b6b4]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [2d26368] - @fnndsc/menu@0.17.0 - @fnndsc/argus@0.22.0 - @fnndsc/cumin@3.27.2 - @fnndsc/brasa@0.31.2","body":"","internal":true}]},{"version":"0.18.0","date":"2026-10-03","merge":"ff157a55d5ed","bump":"minor","changes":[{"hash":"685ed59","headline":"ARGUS and the calypso daemon say when they are different builds.","body":"ARGUS's build writes its stamp into the bundle; the calypso daemon reads it once at start and reports it in its attach ack (`stack.surface`, optional in the wire schema). When ARGUS's own stamp differs, it says which is older and what to restart — on the status strip, in a dismissible notice, and on the console: \"ARGUS is newer than the calypso daemon, so some controls won't work. Restart the calypso daemon.\" or \"ARGUS is older than the calypso daemon. Refresh to load the new ARGUS.\" A remote chell prints one line at attach when its build differs from the daemon's.","internal":false},{"hash":null,"headline":"Updated dependencies [685ed59] - @fnndsc/argus@0.21.0 - @fnndsc/menu@0.16.0 - @fnndsc/brasa@0.31.1 - @fnndsc/cumin@3.27.1","body":"","internal":true}]},{"version":"0.17.1","date":"2026-10-03","merge":"e01033841299","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [4128890] - @fnndsc/argus@0.20.0","body":"","internal":true}]},{"version":"0.17.0","date":"2026-10-03","merge":"30fbc2abbc84","bump":"minor","changes":[{"hash":"c1cf57e","headline":"An edit crosses the wire to a browser (#831, slice 2).","body":"The daemon's `edit` request now names the file being edited (`path`), and a surface may answer `opened`: it took the file into an editor that stays open, so the command saves nothing and says `(opened in the editor)`; each save made in that editor will run as its own command line. The argus client hands an edit to a host editor hook and answers at once that it opened, or refuses in words when it has none (the hook is installed by the editor pane, slice 3). `feed note edit N` is now `edit /proc/jobs/feed_N/note`: a terminal's editor and a browser's pane open the same text and save it the same way, and the title is set with `feed note N --title`.","internal":false},{"hash":null,"headline":"Updated dependencies [e057d20]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [2826f2b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c1cf57e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [50d41d7]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [1c8b92d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [e20fb09]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ddbd551]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [32e3919]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [59399fe]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [51da853] - @fnndsc/argus@0.19.0 - @fnndsc/brasa@0.31.0 - @fnndsc/menu@0.15.0 - @fnndsc/cumin@3.27.0","body":"","internal":true}]},{"version":"0.16.10","date":"2026-10-01","merge":"0491d58506dd","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [88437cc]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [51f1ca9]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c9c018b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [55fbf6c]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [fbb1579]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [576b948]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [4864a34]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [40acb72]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d7ec90d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d057e99]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [4863f32]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7fb4c21]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8260d33]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c371b47] - @fnndsc/argus@0.18.10 - @fnndsc/brasa@0.30.0 - @fnndsc/cumin@3.26.0 - @fnndsc/menu@0.14.0","body":"","internal":true}]},{"version":"0.16.9","date":"2026-10-01","merge":"1b77ac182c25","bump":"patch","changes":[{"hash":"cbd71cc","headline":"A refused file read says why: the kernel names the status and reason (403 not yours to read, 404 no such file, 502 CUBE could not serve it), `/vfs` answers with them instead of 404 for everything, and an image pane that lost a slice reads the reason out.","body":"`porter --end <who>` ends one session so the next login boots on the current kernel.","internal":false},{"hash":null,"headline":"Updated dependencies [cbd71cc] - @fnndsc/brasa@0.29.1 - @fnndsc/argus@0.18.8","body":"","internal":true}]},{"version":"0.16.8","date":"2026-09-26","merge":"a1a7cf9a2b2d","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [fbd3f0a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [fbd3f0a] - @fnndsc/menu@0.13.0 - @fnndsc/brasa@0.29.0 - @fnndsc/argus@0.18.0 - @fnndsc/cumin@3.25.0","body":"","internal":true}]},{"version":"0.16.7","date":"2026-09-26","merge":"70016c84b4f0","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [a0927ec]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [e61a6ad]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [e7f82dd]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d1da8ac]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0f9ae74]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7c1250f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [16f8558]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8851db3]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d8e160c]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [e59a8d7]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5aec39e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8cd7a3a] - @fnndsc/argus@0.17.0 - @fnndsc/cumin@3.24.0 - @fnndsc/menu@0.12.0 - @fnndsc/brasa@0.28.0","body":"","internal":true}]},{"version":"0.16.6","date":"2026-09-24","merge":"43521c122e64","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [53d43f6]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [38572b6] - @fnndsc/brasa@0.27.0 - @fnndsc/argus@0.16.2","body":"","internal":true}]},{"version":"0.16.5","date":"2026-09-24","merge":"ae94a9289e09","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [5ccff72] - @fnndsc/argus@0.16.0","body":"","internal":true}]},{"version":"0.16.4","date":"2026-09-23","merge":"b2eb1f41f814","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [b92c96a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d6dac25]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [6233301]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5caeef6] - @fnndsc/argus@0.15.0","body":"","internal":true}]},{"version":"0.16.3","date":"2026-09-23","merge":"4ce95fee1d4a","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [b254ee4]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7b89dcc]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [11a0dd1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [f3f68e3]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [cb76c3b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [f2b6a80]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [f297468] - @fnndsc/argus@0.14.0 - @fnndsc/brasa@0.26.0","body":"","internal":true}]},{"version":"0.16.2","date":"2026-09-22","merge":"2356c7db39f7","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [6b55e72]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5b78288]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5a95cac] - @fnndsc/cumin@3.23.2 - @fnndsc/argus@0.13.0","body":"","internal":true}]},{"version":"0.16.1","date":"2026-09-22","merge":"c1b0be0099d8","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [de26df4]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [247bf09]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [dac2d96]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [dac2d96]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [dac2d96]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [50f8a4e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [50f8a4e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [50f8a4e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [637c819]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c82f514]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c82f514]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c82f514]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c82f514] - @fnndsc/argus@0.12.0 - @fnndsc/cumin@3.23.1 - @fnndsc/brasa@0.25.0 - @fnndsc/menu@0.11.0","body":"","internal":true}]},{"version":"0.16.0","date":"2026-09-21","merge":"576426874567","bump":"minor","changes":[{"hash":"3a8cd1b","headline":"A porter at the door: the mise display manager, slice 3 — the shape without the door.","body":"`apps/porter` logs an operator into one CUBE, trades the password for a token, starts or joins that identity's calypso (`chell --daemon --auth-token-stdin`, the token on stdin, four directories of its own under the porter's state) and mounts the session at `/s/<key>/`: page, assets, `/vfs` and the WebSocket wire proxied to the daemon on loopback with the attach token added by the porter, so the browser holds none. `GET /boot/<key>` streams the session's boot as server-sent events, one per line the daemon wrote, replayed for a late attacher. `POST /sessions` re-checks the password at CUBE every time, even when the session is up.\n\ncalypso: the attach token may ride the upgrade URL (`?token=`), the way `/vfs?token=` already does, so a front that holds the token for a browser can put it on the proxied upgrade and the page attaches with an empty one; and `berth_pathIn(runtimeDir, identity)` names a berth under a runtime directory that is not the process's own.\n\nNo cookie yet: this porter binds loopback. The door — login page, cookie, LOG OUT — is the next slice.","internal":false},{"hash":"1bdf876","headline":"A row wears the number it answers to.","body":"A row of the session's last answer can be named by the number beside it — `gather add @2,3,6`, `image @1` — so the number is now DRAWN beside it. The listing façade mints a leading index pill for any level that says how its rows are addressed, and no pane draws a number itself.\n\nWhat is numbered is the kernel's ANSWER rather than a rendering of it, so a console table and a graphical pane count the same rows. The lit number is found BY ADDRESS, not by counting down the screen, so a sorted or filtered listing keeps each row's own number instead of renumbering under the operator.\n\nEvery listing leads with the column and every row counts itself; only the rows the kernel reaches wear a LIT number. In a PACS answer that is the series, while the patient and study levels above count themselves dim — the distinction is the hue, never the digits, so a number nothing answers to cannot be mistaken for one that does. Numbers are zero-padded to the widest in their group, so a fourteen-series answer reads 01…14 and the column stays a column. The lit hue is the pane's FRAME hue (`--listing-index-hue`, set per pane), because the pill is chrome and not content: an orange pill beside the browser's orange kind glyph read as one blob and the number stopped being a number.\n\nThe surface learns which listing is numbered from a retained `numbered` message: brasa announces it as the answer changes, calypso relays it and replays it to a surface attaching late, and the addresses travel with it (capped, past which a long listing is numbered in the kernel and unnumbered on screen). The same shape regard already travels in.\n\nLaw: `a-row-wears-the-number-it-answers-to`.","internal":false},{"hash":"5b520c7","headline":"An index says what it counts.","body":"`@2` said nothing about what it counted — in a PACS answer every study read \"1\", being the only study under its patient — so a bare number is no longer an index. A handle names its KIND and its place in that kind's sequence: `@SER3`, `@STD001`, `@FIL2,3,7`, `@DIR2-4`. One sequence per kind runs across the whole answer, so a handle is a name rather than a position and a sorted listing does not renumber it; zero padding is how the pill draws it, not something to type.\n\nWhat a row hands over differs by kind. A series, a file or a folder hands over its path; a STUDY hands over its series — what the surface's GATHER on a study hands over — so `gather add @STD001` and `pull @STD001` act on the whole study from a console exactly as a press does. A verb refuses a kind it does not take, by name and at expansion: `image @STD001` says \"image takes a series or a folder or a file; STD001 is a study\" instead of resolving to a path and failing three steps later for a reason that names nothing typed.\n\nOn the surface the pill draws the handle, lit in the pane's frame hue on the rows the session reaches, and a study row wears `STD001` where it read a meaningless \"1\". The `numbered` message carries each row's kind, place and address, so a pane finds its rows by address and draws the code the operator would type.","internal":false},{"hash":"d1a1c0d","headline":"calypso: `/vfs?path=…&download=1` answers the file's bytes as an attachment named for the file (`content-disposition`, the name as ASCII and as UTF-8), so a browser surface can save a file rather than show it.","body":"","internal":false},{"hash":"4ee180c","headline":"A session outlives its door: the porter's lifecycle.","body":"porter: a restarted porter adopts the sessions its predecessor started, from their berths under the state directory, rather than starting rivals. Idle sessions — no wire open, nothing through the door for `PORTER_IDLE_HOURS` (a day, like the cookie) — are ended by a sweep every minute: the process only; the state directory stays and the next login boots warm. `porter --status` lists the state directory's sessions and whether each answers. `deploy/` carries a systemd unit (a `porter` user, `KillMode=process` so a stopped door keeps its sessions), an env file example, and a Caddyfile for TLS in front. Boot lines kept per session are capped at 2000.\n\ncalypso: a berth records the daemon's pid, so a host that did not start a daemon can still end it.\n\nchell: a daemon off a TTY tolerates EPIPE on its stdout and stderr — the porter that started it may stop first, and a session outlives its door.","internal":false},{"hash":null,"headline":"Updated dependencies [e74ce1d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [1b2f7f7]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [50f358b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3320487]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [149957f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [161e54d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [07f3783]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [f94480e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [2322151]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0f3deaa]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d1a1c0d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [fa26e17]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [77c73aa]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [cd7714d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a010cb0]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [369b20d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8a8dc25]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b748002]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a8e0f87]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [dc369d3]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d3a8335]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [03e0f87]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [1bdf876]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [854ba2e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [80ddce6]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [9cc1514]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3bbc65a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [1cb8d03]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [4ce1ddc]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5b520c7]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [9339853]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [acbade9]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3c6a0d3]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ca3e39b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7bba167]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [21f8d21]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [9c5a7c2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [1c169d7]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [fc4eb7e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [43b9440]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d78447d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [38fbdb9] - @fnndsc/brasa@0.24.0 - @fnndsc/argus@0.11.0 - @fnndsc/menu@0.10.0 - @fnndsc/cumin@3.23.0","body":"","internal":true}]},{"version":"0.15.2","date":"2026-09-17","merge":"9ed4e1e6d106","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [6c6ca51]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [48e112d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [cd6a0ab]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ee75252]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [fa90f05]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [934d2d3]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [de5508d] - @fnndsc/argus@0.10.0 - @fnndsc/brasa@0.23.2","body":"","internal":true}]},{"version":"0.15.1","date":"2026-09-17","merge":"96133a6d86a6","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [3f96d86]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0d99ec5]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a38bb64]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ab127ea]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0d5f0d7]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3c6555a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7c2308b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [6d8a595]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a4a38b1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0d99ec5]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a4a38b1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3c9af17]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [480632d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b4d9282]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [566be78]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [62ef29b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [f6d818b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [97596db]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [15b8875]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [aef1a8d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [35064c8]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b337285]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [59a3f96]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [f549b09]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [4aaad51]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ab127ea]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [480632d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [10b99d2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [66ecf22]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [2d52827]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5d4bb4d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d3e5494]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [6d8a595]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3f45362]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b329170]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3f96d86]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [2080342]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7126bca] - @fnndsc/brasa@0.23.1 - @fnndsc/argus@0.9.0","body":"","internal":true}]},{"version":"0.15.0","date":"2026-09-15","merge":"7717a54fa4b1","bump":"minor","changes":[{"hash":"9cf2ea2","headline":"`image <path>`'s text reflection now carries a thumbnail of the middle slice, so a TTY sharing the session shows the picture, not only the facts.","body":"The kernel reads the slice's pixels (`dicomSlice_gray` in salsa, uncompressed transfer syntaxes via dcmjs), window/levels to 8-bit with MONOCHROME1 inverted, and box-downsamples to a cell grid; brasa renders it as an ASCII ramp on any pipe or ANSI truecolour half-blocks (`▀`) on a colour terminal. Colour is a new declared surface capability: ARGUS declares it (its DOM console renders ANSI), chell reads its own terminal through chalk, a bare pipe gets the ramp. Compressed pixels say so in one line rather than pulling a codec into the kernel; an unreadable slice leaves the facts and no picture. The ASCII ramp is always the floor.","internal":false},{"hash":null,"headline":"Updated dependencies [7892529]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a24d813]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [de4dac8]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [26eaf6a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b6d0264]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7ca8d04]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [67f5fd5]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [9cf2ea2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d133ef6]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7b5a7b9]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c70e11e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [6990c3a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [aa486c5]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b4689e2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a29635a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0215547]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [bf4c118]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5ed1785]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [887c815]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8a4ddc8] - @fnndsc/argus@0.8.0 - @fnndsc/brasa@0.23.0 - @fnndsc/menu@0.9.0 - @fnndsc/cumin@3.22.1","body":"","internal":true}]},{"version":"0.14.0","date":"2026-09-10","merge":"3bc70ad2fb11","bump":"minor","changes":[{"hash":"c601a42","headline":"ARGUS is published, and a released install now serves it.","body":"`@fnndsc/argus` ships its built bundle, calypso depends on it, and the daemon's web-root search ends by resolving the installed package — so `npm install -g @fnndsc/chell` followed by `chell --daemon` prints a URL a browser can open, where before it printed only a WebSocket address. The unused `@fnndsc/calypso` dependency is dropped from argus, whose browser code imports only the wire contract.","internal":false},{"hash":null,"headline":"Updated dependencies [c601a42]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3660509]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c0e92f7] - @fnndsc/argus@0.7.0","body":"","internal":true}]},{"version":"0.13.2","date":"2026-09-10","merge":"bbff653b165d","bump":"patch","changes":[{"hash":"4af65f4","headline":"The daemon now tells a browser how long it may keep what it serves.","body":"It sent a content type and nothing else, and silence is not neutral: with no `cache-control`, no `etag` and no `last-modified` a browser may keep the page, and `index.html` is the file that names the hashed assets — so a kept copy pinned the whole surface to the build that wrote it and no rebuild ever arrived. `index.html` is `no-store`, a hashed asset is immutable for a year since a different build is a different URL, and anything else revalidates.","internal":false},{"hash":null,"headline":"Updated dependencies [163e4b1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [aa923c6]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [59aa79b] - @fnndsc/brasa@0.22.0 - @fnndsc/cumin@3.22.0","body":"","internal":true}]},{"version":"0.13.1","date":"2026-09-10","merge":"b11d56847aad","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [7c793ad]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7c793ad]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [af2df66]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [af2df66]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0eb202f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [183bf02] - @fnndsc/brasa@0.21.0 - @fnndsc/menu@0.8.0 - @fnndsc/cumin@3.21.1","body":"","internal":true}]},{"version":"0.13.0","date":"2026-09-09","merge":"12150416bc9f","bump":"minor","changes":[{"hash":"ef4a718","headline":"The standalone `calypso` binary ends its boot at a login, like `chell --daemon`: on a TTY the daemon's own terminal becomes its first surface, an ordinary `chell --remote` spawned onto it, rather than the old resting face.","body":"The console loop, the cage and the reattach grammar move into calypso (the daemon's own package), with the surface launch injected — chell spawns itself, the calypso binary spawns `chell` from the path — so both hosts share one console. Off a TTY neither attaches; the daemon just keeps listening.","internal":false}]},{"version":"0.12.0","date":"2026-09-09","merge":"3a263f013a83","bump":"minor","changes":[{"hash":"9c320a0","headline":"The boot ends at a login.","body":"An interactive `chell --daemon` no longer rests on the console face: once the daemon is listening it puts an ordinary `chell --remote --attach` surface on its own terminal, as a child on the wire, so the boot log runs straight into a prompt. `exit` detaches and leaves the daemon running, Enter attaches again, Ctrl-C at the idle terminal stops the daemon, and whatever the daemon writes while a surface holds the terminal is held (calypso `consoleCage_start`/`consoleCage_stop`) and printed on detach. Every chell REPL, local or remote, now guards its idle prompt: a stray line (another surface's output, a late warm-up) lands on its own line with the prompt redrawn beneath it.\n\nThe boot readout is lifted with it. A warm-up step running behind the prompt printed its pending row twice and never reported an outcome; it now prints once as `[PENDING]` and settles on the daemon's readout as `[ OK ]` with what it cached or `[FAIL]` with why. Every count takes its noun in the right number (`1 PACS query`, `3 feeds`) through a new brasa `count_noun`. The daemon banner writes every package out in full (brasa `stackBanner_build`/`stackBanner_compose`), adds an ARGUS row when a web surface is served, and drops the welcome; the remote surface banners the daemon's stack the same way. A daemon bound on every interface advertises its fully qualified host name.","internal":false},{"hash":"89d3287","headline":"Daemon boot leaves no open `[PENDING]` row.","body":"The steps that warm behind the prompt were settling after the login took the terminal, which caged them, so their `[ OK ]` never reached the row and it stayed `[PENDING]` on screen. The boot now waits those steps out before the login — they settle in place, every row reading `[ OK ]` or `[FAIL]` — while the daemon is already listening, so nothing reaches it any later for the wait. The startup banner keeps its version column clean: the build hash moves from the CALYPSO row, which it pushed past the column the other rows share, to the `listening` line. The fortune is gone from daemon startup.","internal":false},{"hash":null,"headline":"Updated dependencies [3d11f59]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [9c320a0]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [711e1b3]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d89e31b] - @fnndsc/brasa@0.20.0 - @fnndsc/cumin@3.21.0 - @fnndsc/menu@0.7.0","body":"","internal":true}]},{"version":"0.11.0","date":"2026-09-09","merge":"4b93ef54c7d2","bump":"minor","changes":[{"hash":"49634f2","headline":"feat(calypso): the telemetry heartbeat carries the lane — the command holding it, for how long, how many wait behind it — and CUBE's pace","body":"","internal":false},{"hash":"2545ffa","headline":"feat(calypso): the telemetry heartbeat carries the lab's pulse the engine snapshots","body":"","internal":false},{"hash":null,"headline":"Updated dependencies [49634f2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [49634f2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [49634f2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [2545ffa]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [2545ffa] - @fnndsc/brasa@0.19.0 - @fnndsc/cumin@3.20.0 - @fnndsc/menu@0.6.0","body":"","internal":true}]},{"version":"0.10.2","date":"2026-09-09","merge":"bb6d0d575ad0","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [6cd5ab1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [6cd5ab1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [6cd5ab1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [57ba039]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [57ba039]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [57ba039]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [adf8cc1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [98ab832]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [98ab832]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [98ab832] - @fnndsc/brasa@0.18.0 - @fnndsc/cumin@3.19.0 - @fnndsc/menu@0.5.0","body":"","internal":true}]},{"version":"0.10.1","date":"2026-09-08","merge":"b302035228a4","bump":"patch","changes":[{"hash":"53a736f","headline":"fix(calypso): a feed's topology walk is annunciated on a quiet daemon","body":"The heartbeat re-pushed the promptline only when the index counts moved or the previous push still showed warm-up. A feed's topology walk (a first visit, `proc refresh`) reports its progress into the prompt context page by page but adds its instances to the index only once the walk is done, so on a quiet daemon the counts stood still for the whole walk and the JOBS readout never named the feed — it was annunciated only when a background sweep happened to be moving the counts at the same time. The heartbeat now also pushes while a foreground command is executing, which is exactly when a walk can be in flight.","internal":false}]},{"version":"0.10.0","date":"2026-09-07","merge":"afa00444c12e","bump":"minor","changes":[{"hash":"a7f057c","headline":"feat: a value-taking flag given no value asks for it","body":"`pacs query … --csv-to` with nothing after it now means \"ask me where\". Before, such a flag was silently ignored: the operator asked for a table and got none, which is worse than either answering or refusing.\n\nNo sigil was needed. `?` was the obvious spelling and is already a glob in `string_checkHasWildcard`, so it would have expanded against the VFS; a flag that takes a value and is given none is unambiguous on its own, and the rule now generalises to every flag in the stack without another convention.\n\nThe ask carries what it wants — a `path`, with the session's own cwd as its anchor, a suggested basename, and `EXPORT HERE` as the word its committing control should read. The anchor is a fact rather than a guess: inventing a directory means creating one behind the operator's back. And it is raised only once there is something to write, since a question about a file that may never exist is asked too early.\n\nTwo rules ride with it, both in the daemon, both about who may interrupt an operator:\n\n- **A command marked `instrument` may never ask.** A pane's silent refresh or an ambient cycler raising a question is refused outright — the operator did not issue that command and cannot answer for it.\n- **One question at a time per surface.** A second is refused by name rather than queued, because a queued question is one whose command the operator has forgotten issuing.\n\nAn abandoned ask is not a failed query: the answer stands and only the writing does not happen.\n\n`prompt_current` now takes the whole request rather than a message and a flag, and the daemon relays `wants`, `path` and `commit` to the surface. `repl_confirm` and `repl_questionPath` join the kernel's ask helpers, so a caller states the kind once and every surface reads the same intent.","internal":false},{"hash":"78d85ae","headline":"feat(argus): a location is asked for by borrowing a browser","body":"An ask is never a box. A `path` question opens the instrument that already shows that space: a **new** files pane beside the pane that asked — never an existing browser, since hijacking one loses the operator's place — anchored where the ask said, closing when the errand ends either way.\n\nIts controls ride a bar of its own across the top of the pane: the question as a caption, the composed path as an editable field, **MKDIR** for a folder that does not exist yet, and one verb that commits, reading the word the kernel sent (`EXPORT HERE`). The grill had put those on the mode frame; building it showed why they cannot live there — the frame is a narrow rail against the spine, right for a column of capsules and hopeless for a caption and a path, and it answers to what the _field_ holds, which an errand does not change.\n\nThree defects the live run turned up, each fixed here:\n\n- **The errand opened an empty browser, forever.** The daemon runs commands one at a time, so the listing that would answer the question queued behind the command that asked it: the answer waiting on the browsing, the browsing waiting on the answer. An instrument command now runs **beside** a command waiting on a question — the natural twin of the rule that an instrument may never ask. A pane's own read neither asks nor waits, and the daemon saves and restores the executing command rather than clearing it, so the outer command's output still finds its way home.\n- **The errand split beside the focused pane**, which can be one the current preset does not hold. A split beside a pane that is not in the tree fails silently, and an errand that never opens is a question asked of nobody. The host is now a leaf that is actually on stage.\n- **The anchor could be somewhere nothing can be written.** A session sitting in `/bin` or `/proc` is browsing a provider, not standing where a file lands, so the ask falls back to home rather than offering a destination that is refused the moment it is committed.\n\nLaw `an-ask-borrows-an-instrument`, smoke-enforced. Two consecutive full smoke runs, 103 checks.","internal":false},{"hash":"9e2a9dd","headline":"feat: a verb that acts on the place rides the frame — MKDIR and UPLOAD","body":"Two verbs act on the PLACE the field holds rather than on any row, so they ride the field's own frame beside HOME and BACK, and they appear on a browser's frame and nowhere else — there is no directory to make in a list of feeds.\n\n**MKDIR** asks for a name in the console and makes it where the field points, not where the session's cwd happens to be: a rooted browser is showing a place of its own, and a verb that acted on the session's place instead would make the folder somewhere the operator is not looking.\n\n**UPLOAD** is the verb this surface could not previously speak at all. `upload` reaches the daemon's disk, which a browser has never seen. So the operator's own picker chooses the file, and the bytes travel over the daemon's `/vfs` route — now answering `POST` as well as `GET` — where the **engine** writes them through the kernel. No surface talks to CUBE, the same attach token gates the write as gates the read, and the body is capped. The console keeps the account, because a gesture the surface performs itself still owes the transcript what it did.\n\nNew seam: `Engine.file_write(path, bytes)`, the twin of `file_read`. It writes through salsa's own create and **invalidates the listing it changed**, as every writing builtin does — without that the browser asks for the folder again and is served the folder as it was before the delivery, which reads as an upload that silently did nothing.","internal":false},{"hash":"3df1c41","headline":"docs(calypso): say calypso where the component is meant, and make it typeable","body":"Every other part of the stack is a noun with a role — cumin, salsa, chili, brasa, menu, chell, argus. The session supervisor was the odd one out, described by a flag on another program, so the prose said \"the daemon\" for something that already has a name, a package, a binary and a doctrine document.\n\nHost control is _calypso's_ policy; berths are calypso's; the wire is calypso's. \"Grant calypso host access\" says whose policy changed. \"Grant the daemon\" does not.\n\nOperator-facing text now names it: the flag help, the not-running message, the already-running refusal, the listening banner, the attach errors, the several-sessions chooser, and the host-control sentences — `upload` refusing without the `files` tier, the HOST banner, and argus's HOST lamp tooltip.\n\nThe start hints used to read `chell --daemon <user>@<url>` while the prose said \"run calypso\". They now say `calypso <user>@<url>`, which is a real command, since calypso ships its own binary. The getting-started guide leads with what calypso _is_, then gives both ways to start it — standalone from a saved session, or through chell logging in fresh — because they genuinely differ and one does not replace the other.\n\n**Daemon survives where it is correct**: a mode name, an anchor, a make target, a background process. Code symbols are untouched — `daemon_launch` and its kin describe something that really is a daemon, and churning them buys nothing an operator sees. Command lines inside code blocks were left alone, so nothing became a command that does not exist.","internal":false},{"hash":null,"headline":"Updated dependencies [a7f057c]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [da15f3b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [78d85ae]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [349d7d2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8312a79]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [02ef648]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3df1c41]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [f5c16fe]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [116e8ba]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ec3ef9f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [6234d55]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ba1e5b4]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [404f5e3]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7181f7e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d2a4315]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a245b5f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [9e2a9dd]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5a339f0]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [a8449bc]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8446459]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [17964a9]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [62761a3]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [17964a9] - @fnndsc/brasa@0.17.0 - @fnndsc/cumin@3.18.0 - @fnndsc/menu@0.4.0","body":"","internal":true}]},{"version":"0.9.1","date":"2026-09-05","merge":"0422da0acacf","bump":"patch","changes":[{"hash":"e3948f1","headline":"fix(release): publish `@fnndsc/menu`, without which nothing else installs","body":"`@fnndsc/menu` was marked private, so changesets versioned it and then skipped publishing it. cumin, brasa, chell and calypso all depend on it, so every published version since menu was extracted has been uninstallable from a clean registry:\n\n```\nnpm install @fnndsc/brasa\nnpm error 404 The requested resource '@fnndsc/menu@*' could not be found\n```\n\nIt worked in development only because the workspace resolves menu locally, and it went unnoticed because nothing ever installed these packages from npm alone.\n\nmenu is an ordinary library — the wire schemas and types three published packages import. Its manifest was already publish-ready and identical in shape to its siblings; only the flag stood in the way. It is dropped.\n\nThe dependency range is pinned to `^0.3.0` at the same time. `\"*\"` was an artefact of menu being private, since changesets does not rewrite ranges for packages it will not publish, and `\"*\"` on a published dependency means any future breaking change applies silently.\n\n`argus` stays private, and correctly so: it is a browser bundle served from calypso's web root, not a library anyone imports.","internal":false},{"hash":null,"headline":"Updated dependencies [e3948f1] - @fnndsc/menu@0.3.1 - @fnndsc/cumin@3.17.1 - @fnndsc/brasa@0.16.1","body":"","internal":true}]},{"version":"0.9.0","date":"2026-09-04","merge":"f25e3f4babc4","bump":"minor","changes":[{"hash":"4f034b9","headline":"Host control: `chell --daemon --host-control[=shell,files,pipes]` lets the daemon declare capabilities of its own — `!` runs on the daemon host, pipe segments run there, `upload`/`download` reach its disk — off by default, refused on a non-loopback bind without `--expose-host-control`, and annunciated everywhere (attach ack `hostControl`, the daemon face, the prompt's HOST segment, a remote shell's banner).","body":"Without the `files` tier, `upload` under a daemon now refuses instead of reading the daemon host's disk.","internal":false},{"hash":null,"headline":"Updated dependencies [f73e6c2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5dc064e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [75f1e5f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3afaa65]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [5b4b7db]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [eaf6c67]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [73aa61a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [4f034b9]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [aa25502]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [f8d1b1c]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [85c6813] - @fnndsc/cumin@3.17.0 - @fnndsc/menu@0.3.0 - @fnndsc/brasa@0.16.0","body":"","internal":true}]},{"version":"0.8.0","date":"2026-09-02","merge":"e4e14b714f31","bump":"minor","changes":[{"hash":"97af423","headline":"Watches: a surface can keep a running feed live.","body":"New wire pair `watch` / `unwatch` (subject = `/proc/jobs/feed_N`, owned per surface, released on detach) and a `watched` report (`live` | `settled` | `stale`). While anyone watches a feed the engine samples it on an adaptive cadence (3 s while it changes, backing off to 30 s when quiet), and whenever a visit changes the cache it publishes the refreshed `feed.dag` model to every surface as a session-bus envelope from the `daemon` surface, off the scrollback. A feed that settles reports `settled` and the watch ends; a failed sample reports `stale` and keeps trying. `proc watch <feed>` / `proc unwatch <feed>` are the console forms (`proc watch` lists). The engine gains an ambient event bus for events it originates on its own. Feed visits within one second of each other now share one sync, and `feedVisit_sync` reports whether it succeeded.","internal":false},{"hash":null,"headline":"Updated dependencies [920e0ac]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7a0f06e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [920e0ac]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c716624]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [cece0dc]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [97af423] - @fnndsc/cumin@3.16.0 - @fnndsc/brasa@0.15.0 - @fnndsc/menu@0.2.0","body":"","internal":true}]},{"version":"0.7.1","date":"2026-09-01","merge":"77fa3b4e5149","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [85791b3] - @fnndsc/brasa@0.14.0","body":"","internal":true}]},{"version":"0.7.0","date":"2026-08-31","merge":"03f466be83ce","bump":"minor","changes":[{"hash":"eebdc7d","headline":"A daemon writes its attach addresses to a file, and keeps its boot animation.","body":"Stopping the brain-activity pulse in daemon mode made the terminal easy to\nselect from and the session feel dead. The animation stays; the addresses are\nwritten where they can be read without fighting a repainting screen or\nsurviving a `clear`.\n\nThe note lands at `/tmp/calypso-<user>.attach`, and the banner names it. It\ncarries the attach token, which is a credential, in a world-readable directory\n— so it is created `0600`, created exclusively so a symlink planted at the path\nmakes the write fail rather than land somewhere of an attacker's choosing, and\nremoved when the daemon exits.\n\n`calypso --berths` reads the same facts from the berth — `0600` in the user's\nown runtime directory — and remains the safer route for anything scripted.","internal":false},{"hash":"5d131c8","headline":"A daemon's terminal stops repainting itself, and its attach addresses can be read back.","body":"`logo_animatePulse` starts a 100ms interval that saves the cursor, jumps up the\nscreen, repaints the logo and restores — and it runs for as long as the process\ndoes. The interactive path stops it once boot finishes; the daemon path never\ndid. So a daemon's terminal was being rewritten ten times a second forever,\nwhich made the banner it had just printed — the URLs and the attach token, the\nonly thing anyone needs from that terminal — impossible to select.\n\n`calypso --berths` prints how to attach to every live daemon: the ARGUS link\nand the ready-to-paste `chell --remote --attach` command, per identity.\n\nThe facts are read from the berth rather than copied to a more convenient\nplace. A berth already holds the url and token at mode `0600` in the user's\nruntime directory; `/tmp` would be easier to reach and is world-readable, and\nthe token is a credential.","internal":false},{"hash":"0adb4f2","headline":"The daemon terminal gets a resting state: the console face.","body":"The boot-phase brain animation repainted by cursor arithmetic against a\nscrolling buffer — counting rows printed beneath it and jumping up — so a\nretry warning landing mid-frame interleaved with the art, and the pulse had\nto kill itself the moment output scrolled the logo away: the brain went\nsilent exactly when the daemon came alive.\n\nBoot is unchanged and text-first: the brain prints, pulses while\ncredentials are checked, and every address and token scrolls into ordinary\nscrollback. What is new is what happens when boot completes on a TTY: the\ndaemon switches to the alternate screen buffer — the same screen vim and\nhtop own — where the brain pulses forever at fixed coordinates over an\nidentity panel (identity, wire, ARGUS URL, token, berth, attach line,\nuptime, attached surfaces, index counts), with the last few log lines caged\nin a dim strip beneath. The pulse is honest: idle is a slow shimmer, an\nexecuting command quickens it, a surface attaching flares it.\n\nEsc or `q` drops to the normal buffer, restored byte-perfect with the boot\nlog intact and the lines captured while the face was up flushed beneath it;\nany key returns. Ctrl-C stops the daemon from either mode. Off a TTY\n(systemd, nohup) nothing changes: sequential logging, as before.\n\nThe brain art and its frame renderer moved from chell to brasa\n(`logo_frameRender`, `logo_linesRender`, and the new `logoRows_count` /\n`logoColumns_count`), so any surface can draw it; chell keeps only its\nboot-terminal animation host. `daemon_launch` now returns the launched\ndaemon's addresses and handle, which both launch paths (`chell --daemon`\nand the standalone `calypso` binary) feed to the face.","internal":false},{"hash":"a3bd3e9","headline":"The console face now covers the whole daemon boot, in two phases.","body":"From warm-up on, the alternate screen shows the brain in a frenetic boot\npulse over a tall strip of the streaming boot log — the messages are the\npoint while the machine comes up. When the daemon is listening, the same\nscreen settles in place into the steady instrument: calm ambient pulse,\nidentity panel, live telemetry, and the closing hint \"HIT ESC TO TOGGLE\nTHE BOOT LOG\". Esc toggles to the raw text log in either phase; any key\nreturns.\n\nAlong the way: the log ring now treats a carriage return as a redraw, so a\nspinner's thousand frames stay one line; the face steps aside\n(`face_suspend`/`face_resume`) when warm-up failure asks the operator a\nquestion, so the prompt's readline owns the terminal; and a boot dying with\nthe face up flushes the ring — the abort reason included — into the normal\nbuffer instead of vanishing with it. New calypso API: `face_boot`,\n`face_ready`, `face_suspend`, `face_resume`.","internal":false},{"hash":"9ed68cd","headline":"`download` no longer writes to the daemon host's disk.","body":"File delivery is now a surface capability, like prompting, piping and editing already were.\n\nThe builtin resolved its destination with `path.resolve()` inside the engine,\nso the bytes landed on whatever machine hosted the engine. For a local shell\nthat is right — the engine is in-process and the operator's disk is the\nengine's disk. Under a daemon it put files on a machine nobody attending the\nsession was sitting at, and from a browser the question \"download to where?\"\nhad no answer at all.\n\n`Surface` gains `fileDeliver`, and `SurfaceCapabilities` gains `fileDelivery`\nalongside `engineFilesystem` — which says whether a path the engine resolves is\na path this surface's operator can open. Only an in-process local shell claims\nit. When it is false, `download` hands the file to the surface, which puts it\nsomewhere its operator can actually reach: the client's disk for\n`chell --remote`, the download manager for `argus`.\n\nOnly the request crosses the wire. Each surface fetches the bytes itself\nthrough the daemon's existing token-gated `/vfs` route, so a DICOM series is\nnot base64'd across a channel meant for session state — the intent travels\nthrough the vocabulary and the bytes travel through the byte route.\n\nThe local path is unchanged: a local `chell` still uses the existing transfer\nmachinery, with its globs, directory walks and progress reporting.\n\nA directory has no bytes to hand over, and what to do about that depends on\nwhat the surface has — a third capability, `localFilesystem`, declared in the\nattach handshake and answered by the surface rather than by the daemon. A shell\nowns a filesystem wherever it runs, so `chell --remote` receives the tree file\nby file and gets the folder it asked for. A browser owns no directory and can\ntake files only one at a time, so several hundred DICOM instances would be\nseveral hundred saves; for that surface alone a directory is archived into a\nsingle CUBE file first, through\nthe registered `zip v20240311` pipeline — `pl-dircopy` into a zip plugin, the\nsame mechanism the ChRIS web UI has used for years, but living in `brasa` where\nevery surface reaches one implementation instead of each client re-deriving the\nsequence. `CHRIS_ARCHIVE_PIPELINE` names a different pipeline where a\ndeployment registered one. When it is absent, the failure says which pipeline\nis missing and that it can be registered from the store.\n\nThe archive run announces itself rather than creating a feed silently, because\nit is a workaround for CUBE having no directory-archive route: issue #233.\n\n`upload` has the mirror problem — it reads from the engine host's disk — and is\nnot addressed here, because the browser direction needs a file picker. See\nissue #232.","internal":false},{"hash":"790f994","headline":"Instrument traffic stays off the session bus.","body":"A surface's internal commands — a panel's silent listing refresh, an ambient\ncycler's pipeline renders — are not things the operator said, yet they were\nbroadcast to sibling surfaces and retained in scrollback, so a second\nattached console printed them live and every reattach replayed them as\nnoise. The execute message gains an optional `instrument` flag: the daemon\nruns the command normally but skips the bus publish and the scrollback\nentry, so siblings and replays carry only operator activity.","internal":false},{"hash":"e58bf58","headline":"The wire contract moves out of `calypso` into a package of its own, `@fnndsc/menu`.","body":"A surface author should depend on the contract, not on the daemon that happens\nto serve it. Until now the contract was a subpath of `@fnndsc/calypso`, so a\nthird-party surface took a dependency on the session host to learn the shape of\na result. `menu` imports nothing from the stack and sits below `cumin`, so both\nthe engine that produces envelopes and the browser that renders them can load\nit.\n\nTwo vocabularies the contract narrows to moved with it, because they were\ndeclared above the thing that describes them: the structured-progress values\n(previously `@fnndsc/brasa/progress`) and the prompt-facing process-index state\n(previously `@fnndsc/cumin/proc-prompt`). Both are re-exported from their old\nhomes, so existing importers are unaffected; `@fnndsc/cumin/proc-prompt` as a\nsubpath is gone, and its types are available from `@fnndsc/cumin` directly.\n\n`CommandEnvelope` is now inferred from the schema that validates it. The engine\nand the wire previously carried separate declarations of the same shape, tied\ntogether by a compile-time assertion that one stayed assignable to the other; a\nsingle inferred type makes that drift impossible rather than detected.\n`@fnndsc/cumin` re-exports the name, so nothing that imports it changes.\n\n`@fnndsc/calypso/protocol` no longer exists as a subpath. Import\n`@fnndsc/menu`. The names remain re-exported from `@fnndsc/calypso` itself for\nnow, since most of the stack has always reached them there.\n\nThis is the scaffold for envelope Phase-2 — a typed result model for every\ncommand — recorded in `docs/menu.adoc`. `menu` itself is unpublished until that\nwork lands, so thirty payload shapes can settle without forcing a release each\ntime.","internal":false},{"hash":"28b9a9f","headline":"Regard: the session learns what the operator is indicating.","body":"The wire contract gains one message, `regard`, travelling both directions\nunder one shape: a surface reports the addressable thing the operator most\nrecently indicated (a file clicked in a browser, a DAG node selected), and\nthe daemon retains it as session truth — last write wins — mirrors it into\nthe engine, and rebroadcasts it to every attached surface. A late attacher\nreceives the retained value with its ack, so spawn-then-see workflows start\nseeing immediately.\n\nThe value is an address in the namespace plus the model kind it was\nindicated through, never view-space coordinates: what has no address is view\nstate and stays surface-side. The brasa session retains the value behind\n`regard_get`/`regard_set`, so engine-side consumers can answer \"what is the\noperator regarding\" without any surface geometry crossing the seam. Design\nrecord: apps/argus/docs/aegis.adoc.","internal":false},{"hash":"8842ab4","headline":"Indeterminate progress now crosses the daemon wire as typed facts rather than terminal escapes.","body":"The spinner used to write `\\r\\x1b[K<frame>` and cursor hide/show to the status\nchannel twelve times a second, so every attached surface received terminal\nchoreography whether or not it was a terminal — a web surface had to emulate a\ncharacter grid to recover the meaning, and got it subtly wrong. It now announces\n`operation: 'task'`, `kind: 'inspection'`, `phase: 'working'` with a label, and\ncloses with `phase: 'complete'`. Each surface draws waiting in its own idiom.\n\nOnly state changes cross the wire: frames and elapsed counters are the\nrenderer's, so a spin of any length costs two events instead of dozens per\nsecond. `chell` gained the elapsed counter its spinner used to bake into the\nlabel, and `argus` gained a full progress renderer — indeterminate work spins,\ncounted work fills a bar — which also surfaces the download progress it had\nbeen silently discarding.\n\nThe `operation` and `phase` enums gained `task` and `working`. Every enum on\nthe progress message now degrades on an unknown value instead of failing the\nparse and dropping the message whole: `operation` to `task`, `phase` to\n`working`, `status` to `unknown`, `kind` and `unit` to absent. That makes good\nthe contract's promise that change within a major is additive — for future\nadditions, since the fallback lives in the build doing the reading.\n\nThe spinner keeps its call signature, so its callers are unchanged. Its\n`showTiming` and `clearLine` arguments are now ignored: both are rendering\ndecisions. It also no longer inspects `process.stdout.isTTY` before announcing,\nwhich had suppressed progress inside the daemon, where the engine's own stdout\nis never a terminal but the attached surface may well be able to draw.","internal":false},{"hash":"19a4d5b","headline":"The daemon boot experience, settled: classic boot, minimal face.","body":"Booting is the classic in-scroll experience again — the brain lights up at\nconnect and the boot log with its in-stage progress scrolls beneath it\n(frames now paint as one buffered write, so concurrent log lines cannot\ntear the art). When the daemon is ready, the boot screen is replaced by a\nminimal console face on the alternate buffer: the animating brain,\nvertically centered, one status line (DAEMON RUNNING · SESSION ESTABLISHED,\nor ENGINE EXECUTING while a command runs), and the Esc hint. Nothing else.\nEsc shows the verbatim text record — boot log, addresses, token — which the\nready handoff now halts the pulse without repainting, so it can never again\nbe stamped over; any key returns to the brain.","internal":false},{"hash":"976c753","headline":"`chell --remote` can attach to a daemon on another machine.","body":"`CALYPSO_BIND` has always opened the wire to the network, and the attach token\nhas always gated the session — but _discovery_ is local. A berth is a file in\none host's runtime directory, so a surface on another machine has none to read,\nand the berth recorded `ws://127.0.0.1:<port>` regardless of what the daemon\nbound. The wire was reachable and nothing could tell a remote `chell` where to\npoint: a browser could attach and a terminal could not.\n\n`--attach` takes an explicit address and skips discovery:\n\n```\nchell --remote --attach http://pangea:41234/?token=abc123\n```\n\nThe address is the one the daemon prints. The web surface and the wire share a\nport, so the ARGUS link names both and pasting it is the whole interaction;\n`--token` supplies the token separately where an address carries none, and\n`https`/`wss` are preserved. The berth is built in memory and never written,\nsince another machine's daemon does not belong in this machine's berth\ndirectory.\n\nA daemon bound to anything but loopback now records a routable URL in its own\nberth and prints the ready-to-paste attach command beside the ARGUS link.\n\nThis is not the `porter` server. There is no listener beyond the one\n`CALYPSO_BIND` already opened, no cross-host auth beyond the attach token, and\nno way to discover a daemon you were not told about.","internal":false},{"hash":"bf09355","headline":"The telemetry heartbeat now refreshes the promptline while the process index moves: warm-up progress reaches idle surfaces without waiting for a command, and the prompt settles when reconciliation completes.","body":"","internal":false},{"hash":null,"headline":"Updated dependencies [1d600ac]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0adb4f2]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [31c2a50]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [1c195a7]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [9ed68cd]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [e58bf58]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [e062dbf]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [87f7c59]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [3125517]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [28b9a9f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8842ab4]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b39b584] - @fnndsc/brasa@0.13.0 - @fnndsc/cumin@3.15.0","body":"","internal":true}]},{"version":"0.6.1","date":"2026-08-26","merge":"8a45fe32ae76","bump":"patch","changes":[{"hash":"07ae801","headline":"The daemon now finds the argus bundle relative to its own module location, not only the working directory.","body":"A dev-tree `chell --daemon` launched from anywhere serves the web surface; previously it silently served nothing unless the daemon was started from the checkout root or `CALYPSO_WEB_ROOT` was set by hand.","internal":false}]},{"version":"0.6.0","date":"2026-08-26","merge":"6d1e218fbad2","bump":"minor","changes":[{"hash":"0ad04f2","headline":"The engine can now hand raw file bytes to a hosting daemon: brasa's `BrasaEngine` gains an optional `file_read(filePath)` that resolves a ChRIS VFS path to a `Buffer` through chili's binary cat.","body":"Calypso's daemon exposes it as a token-gated `/vfs?path=&token=` HTTP route with extension-derived content types, letting a web surface render images and other binary content that a text transcript cannot carry.","internal":false},{"hash":"1928d4b","headline":"The daemon now rides an explicit HTTP server: WebSocket upgrades carry the session contract unchanged, and plain GETs serve a configured static web root (the built ARGUS surface), discovered from `CALYPSO_WEB_ROOT` or a monorepo checkout's `apps/argus/dist`.","body":"The launcher prints the browser URL with the attach token. A new `@fnndsc/calypso/protocol` subpath exports the browser-safe wire contract (schemas, validation, version) without server-side dependencies.","internal":false},{"hash":null,"headline":"Updated dependencies [0ad04f2] - @fnndsc/brasa@0.12.0","body":"","internal":true}]},{"version":"0.5.1","date":"2026-08-24","merge":"fbb9d089711b","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [14f8ee8]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [69b0617]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7ed8e1c]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [7dc3bca] - @fnndsc/cumin@3.11.0 - @fnndsc/brasa@0.11.0","body":"","internal":true}]},{"version":"0.5.0","date":"2026-08-21","merge":"364c31576aa7","bump":"minor","changes":[{"hash":"67377a3","headline":"Unify the five correlation-id request/reply implementations onto one `RequestBroker`.","body":"The daemon's four surface-delegated brokers (prompt, pipeline segment, host shell, edit) and the remote client's own pending-request map previously each reimplemented the id/pending/close lifecycle with divergent correctness; all five now share one class that uniformly guarantees origin-validated settles (no surface can answer another surface's prompt), close-listener removal on settle (no per-request listener leak), and rejection when the origin disconnects. The protocol gains optional `promptError` and `editError` messages (additive, no version bump) so a surface can report a failed or impossible prompt or edit. Behavior change on the remote surface: a client without a prompt, pipe, or edit handler now reports the inability as an error instead of silently answering empty, passing pipe input through unchanged, or returning an unchanged \"successful\" edit.","internal":false},{"hash":"b2f5ad3","headline":"Greet every surface with the stack's identity.","body":"Builds now record the short git hash they were produced from (`dist/buildinfo.json`, written by the new `scripts/buildinfo.mjs` build step), and brasa exposes it through `buildHash_get` alongside `welcomeLine_build`/`welcomeLine_compose`, which render a banner of the form `ChELL Executes Layered Logic, v 5.3.0 (886f09). Welcome.` An interactive chell session prints the banner and a short fortune at boot, the calypso daemon announces its banner plus an aligned version line for every stack layer (chell, brasa, chili, salsa, cumin, calypso) when it starts listening, and the attach handshake gains an optional `stack` field carrying all six versions and the build hash, so a remote surface banners the daemon's full reported stack rather than its local install's. `fortune_random` is exported for reuse, with an optional line-count bound so banners favour short cookies.","internal":false},{"hash":"8ec8a4b","headline":"Add explicit, command-scoped CUBE elevation with `sudo <command>`.","body":"The active surface collects an administrator identity and hidden password; a temporary CUBE client runs only the nested command, then the normal session is restored. Group membership and plugin registration now suggest a copyable `sudo` rerun after an authorization failure, and plugin registration no longer owns a separate interactive admin prompt.","internal":false},{"hash":"d0ac04f","headline":"Preserve failure causes and tighten cache contracts.","body":"Errors that were replaced by generic messages now carry their real cause: controller and handler creation failures name the underlying error instead of \"no ChRIS context\", `cat` shows the actual fetch failure, docker command failures surface stderr detail, context-set errors actually print, settings load/save failures are announced instead of silently using defaults or losing changes, unreadable berth and discovery files are named instead of reading as \"no daemon\", token-file read errors are distinguished from the logged-out state, and resource deletes report why they failed. Every remaining deliberate error absorption now carries a dated adjudication comment. Cache contracts: the PACS provider's decoded-query cache caches settled results only and is size-bounded; the object-context factory gains an eviction hook (`objContext_evict`) for deleted plugin or feed ids; `mv` and `cp` invalidate the whole affected listing subtree; and a new PACS query invalidates the cached `/net/pacs/queries` listing so it appears in the next `ls` immediately.","internal":false},{"hash":"3cde784","headline":"Publish refreshed prompt context before completing a remote command so state-changing commands cannot leave ChELL displaying a stale prompt.","body":"","internal":false},{"hash":"ac69b3e","headline":"Run ChELL shell escapes on the originating surface, including remote clients, instead of exposing the CALYPSO daemon host process and filesystem.","body":"","internal":false},{"hash":null,"headline":"Updated dependencies [2e60785]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [66bc932]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [8ec8a4b]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d0ac04f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [886f09c]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [50e9bb1]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [d0ac04f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [22db63f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ac69b3e]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [0e92d4d]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [590a943]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [fa81126]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b2f5ad3] - @fnndsc/brasa@0.10.0 - @fnndsc/cumin@3.9.0","body":"","internal":true}]},{"version":"0.4.5","date":"2026-07-18","merge":"534d57150256","bump":"patch","changes":[{"hash":null,"headline":"Carry semantic Pipeline-inspection progress from a hosted Brasa engine to the remote surface that issued the command.","body":"","internal":false},{"hash":null,"headline":"Updated dependencies - @fnndsc/brasa@0.9.8","body":"","internal":true}]},{"version":"0.4.4","date":"2026-07-17","merge":"90c5b53729d7","bump":"patch","changes":[{"hash":null,"headline":"Carry cold, cached-refresh, and failed `/proc` lifecycle state through the CALYPSO prompt contract;","body":"reorder p10k segments and render distinct lifecycle clues for local and remote surfaces.","internal":false},{"hash":null,"headline":"Updated dependencies - @fnndsc/cumin@3.8.2 - @fnndsc/brasa@0.9.3","body":"","internal":true}]},{"version":"0.4.3","date":"2026-07-16","merge":"c79731f39938","bump":"patch","changes":[{"hash":"6f0833a","headline":"Release the coordinated ChELL stack with deterministic `/proc` topology progress, complete visible-feed indexing, safe warm-up query gating, remote one-shot command completion, and refreshed daemon documentation.","body":"","internal":false},{"hash":null,"headline":"Updated dependencies [6f0833a] - @fnndsc/cumin@3.8.1 - @fnndsc/brasa@0.9.2","body":"","internal":true}]},{"version":"0.4.2","date":"2026-07-16","merge":"1896be7ff9ef","bump":"patch","changes":[{"hash":"71a6cd4","headline":"Route a pipeline executable's bare `--signalflow` flag to SignalFlow diagram output and provide contextual help for dynamic pipeline commands.","body":"Keep final-segment redirection on the originating surface, propagate remote pipe-segment failures back to the engine, and prevent remote command errors from terminating the interactive ChELL client. Daemon mode now reports shared startup cache warming and publishes its listening berth only after engine readiness. Consistently document `signalflow -` for stdin rendering.","internal":false},{"hash":null,"headline":"Updated dependencies [71a6cd4] - @fnndsc/brasa@0.9.1","body":"","internal":true}]},{"version":"0.4.1","date":"2026-07-15","merge":"942aabcdd399","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [e630f79]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [e630f79] - @fnndsc/brasa@0.9.0 - @fnndsc/cumin@3.8.0","body":"","internal":true}]},{"version":"0.4.0","date":"2026-07-15","merge":"d7c332b437ca","bump":"minor","changes":[{"hash":"50d0680","headline":"Run several CALYPSO daemons on one machine — one per CUBE identity — driven by the same `--daemon` / `--remote` verbs:","body":"```\nchell --daemon me@https://cube/api/v1/ -p pw # my daemon\nchell --daemon them@https://cube/api/v1/ -p pw # their daemon (isolated)\nchell --remote me@https://cube/api/v1/ # attach to MY daemon\nchell --remote # sole berth attaches; picker if several\n```\n\nDaemon discovery is now keyed by identity: each daemon advertises a **berth**\n(`{ identity, url, token }`) under `$XDG_RUNTIME_DIR/calypso/` (falling back to the\nsystem temp dir), `0700` on the directory and `0600` on each file. `--daemon` refuses\nto start a second daemon for an identity that is already live, pointing at the\nrunning one instead. Bare `--remote` attaches the sole live berth, offers an\ninteractive picker when several are running, and requires an explicit\n`<user>@<url>` in a non-interactive context.\n\nAll berth lookup goes through a `BerthResolver` seam (`resolve`, `list`), with a\n`LocalBerthResolver` over the runtime files and an injected liveness probe that\nreaps berths whose daemon has gone. The seam leaves room for a future network\nresolver without any surface change.","internal":false}]},{"version":"0.3.7","date":"2026-07-14","merge":"107999d0bcd3","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [8ac7ef9] - @fnndsc/brasa@0.8.0","body":"","internal":true}]},{"version":"0.3.6","date":"2026-07-14","merge":"177711eef683","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [a1f6694]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [01ab743]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [b8ae635]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [ca63e8b] - @fnndsc/cumin@3.7.0 - @fnndsc/brasa@0.7.0","body":"","internal":true}]},{"version":"0.3.5","date":"2026-07-13","merge":"f0c19c50afad","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [e5a30f7] - @fnndsc/brasa@0.6.0","body":"","internal":true}]},{"version":"0.3.4","date":"2026-07-13","merge":"79729c9cf094","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [c2087d0] - @fnndsc/brasa@0.5.0","body":"","internal":true}]},{"version":"0.3.3","date":"2026-07-13","merge":"cb2432e85fb3","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [512e14f]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [880d37a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [e43f42a] - @fnndsc/brasa@0.4.0","body":"","internal":true}]},{"version":"0.3.2","date":"2026-07-13","merge":"96bb6d340604","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [a0d3df5] - @fnndsc/brasa@0.3.0","body":"","internal":true}]},{"version":"0.3.1","date":"2026-07-12","merge":"64fea26ab02f","bump":"patch","changes":[{"hash":null,"headline":"Updated dependencies [d69b086] - @fnndsc/brasa@0.2.0","body":"","internal":true}]},{"version":"0.3.0","date":"2026-07-11","merge":"b1424faffb2a","bump":"minor","changes":[{"hash":"c824000","headline":"calypso is now a self-contained session daemon.","body":"It gains the `calypso` binary (create a brasa engine, restore a saved session, host it over WebSocket) and depends on the new `@fnndsc/brasa` engine package.\n\nBreaking (allowed under 0.x): the package is now ESM-only (was CommonJS), and the `promptline` wire message carries a prompt `context` for the surface to theme, rather than a pre-rendered `text` string.","internal":false}]},{"version":"0.2.0","date":"2026-07-10","merge":"01d4e04fe5c8","bump":"minor","changes":[{"hash":"f8e0233","headline":"Add the CALYPSO daemon: a WebSocket host over one engine.","body":"`CalypsoDaemon` binds the loopback interface only and hosts a single engine, which it accepts through a structural `HostedEngine` interface (chell's `ChellEngine` satisfies it) rather than importing chell — keeping calypso engine-agnostic and free of a package cycle. A surface attaches with the contract version and a random attach token (generated at startup, written to a user-readable 0600 file for same-user discovery, compared in constant time via `timingSafeEqual`); once attached it drives the engine with `execute` and `complete` messages and receives `result` and completion replies, with execution serialized per connection. CUBE credentials never cross the wire — the hosted engine holds its own session. This slice returns each command's final result envelopes; live output streaming and the cross-surface session bus build on it.","internal":false},{"hash":"30a3e1e","headline":"Interactivity over the wire: a builtin that prompts during a remote command now reaches the surface running it.","body":"The contract gains a `prompt` request (daemon→surface, with hidden-input support) and a `promptAnswer` reply (surface→daemon). The daemon serializes execution across the whole session so a mid-command prompt has one unambiguous target, and exposes an input broker (`prompt_current`) the host wires into its `Surface`; the `chell --daemon` launcher installs a surface whose `prompt` delegates to it, so `repl_question` (passwords, confirmations, the plugin admin flow, the prompt configurator) works over the wire unchanged. The `chell --remote` client answers incoming prompt requests from its own terminal (hidden when asked) and replies. Completion already round-trips from the earlier daemon work; the themed pushed prompt string and client-side pipe-segment execution remain follow-ups.","internal":false},{"hash":"93e604f","headline":"Run pipeline segments on the surface, never on the daemon host.","body":"Segment execution becomes a surface capability: the `Surface` gains `pipeSegments` (a capability flag) and a `pipeSegment(command, input)` method. The local CLI runs segments in-process exactly as before (byte-identical); the daemon's surface routes them over the wire (new `pipe`/`pipeResult` messages, base64 for the bytes) to the surface running the command, which runs them on its own machine — so a pipeline like `ls | grep foo` never spawns anything on the daemon host, closing that attack surface. A surface without the capability (a browser) fails such pipelines with a clear message. Completes the interactivity work: prompts, completion, the pushed prompt string, and pipe segments all now work over the wire.","internal":false},{"hash":"f492dd9","headline":"Push the themed prompt string to remote surfaces.","body":"Only the daemon holds the session context the prompt renders, so it renders the prompt and pushes it (a new `promptline` message) to every surface on attach and after each command — the context may have changed. A surface prints what it receives, so prompt themes look identical whether the session is local or remote. chell factors prompt rendering into a shared `sessionPrompt_render` used by both the local REPL and the daemon's `promptProvider`; the `chell --remote` client renders the latest pushed prompt (falling back to a fixed string until the first push), replacing the placeholder prompt it showed before.","internal":false},{"hash":"7cee888","headline":"The surface owns the local editor, so `edit` works over the wire.","body":"The `Surface` gains a `localEdit(content, extension)` method (resolving the flag-only deferral from the prompt-capability work): the CLI surface backs it with the temp-file-and-`$EDITOR` mechanics that used to live in the `edit` builtin, and the daemon backs it by routing to the surface running the command (new `edit`/`editResult` messages + an `edit_current` broker) so the operator's own editor opens, never one on the daemon host. The `edit` builtin no longer touches processes or temp files for editing — it fetches the file, hands the content to `surface.localEdit`, and uploads the result; `chell --remote` opens the client's editor. A surface without the `localEdit` capability (a browser) fails `edit` with a clear message.","internal":false},{"hash":"e293d97","headline":"Add the session bus to the daemon.","body":"All attached surfaces share one session: each command's result envelopes are broadcast to the _other_ attached surfaces as `session {surface, envelope}` events (tagged with the surface that produced them), so a command issued in one surface is immediately visible in the rest — the originator receives its own correlated `result`, not a duplicate broadcast. A bounded scrollback ring buffer (default 200 envelopes, configurable via `scrollbackSize`) is replayed to an attaching surface so it does not join blind; scrollback is presentation rather than truth, so a daemon restart correctly loses it. Surfaces are dropped from the bus when their socket closes.","internal":false},{"hash":"38df08f","headline":"Introduce `@fnndsc/calypso`, the fifth mise package: the session daemon that will host the chell engine and serve it to surfaces over a WebSocket.","body":"This first slice is the wire contract — the typed protocol schemas and boundary validation every message crosses. Messages are two direction-keyed discriminated unions (surface→daemon: attach/execute/complete; daemon→surface: attached/result/complete/output/session/error), defined as zod schemas that are the single source of truth and from which the message types are inferred. A `commandEnvelopeSchema` validates cumin's `CommandEnvelope` on the wire, kept in step with cumin's type by a compile-time guard so the contract cannot silently drift. Boundary validation rejects structural violations, tolerates unknown additive fields, and never throws; the contract version is carried in the attach handshake and refused on mismatch. See docs/calypso.adoc for the governing design.","internal":false},{"hash":null,"headline":"Updated dependencies [aa81b0a]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [2099ff6]","body":"","internal":true},{"hash":null,"headline":"Updated dependencies [c47ff22] - @fnndsc/cumin@3.5.0","body":"","internal":true}]}]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fnndsc/calypso",
3
- "version": "0.19.5",
3
+ "version": "0.19.6",
4
4
  "description": "CALYPSO: the ChRIS session daemon — hosts a brasa engine for attached surfaces over a WebSocket",
5
5
  "repository": {
6
6
  "type": "git",