@mmmbuto/nexuscrew 0.8.29 → 0.8.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +74 -0
- package/README.md +45 -9
- package/frontend/dist/assets/index-CZxcRYUd.js +93 -0
- package/frontend/dist/assets/index-CrggFFKZ.css +32 -0
- package/frontend/dist/index.html +2 -2
- package/frontend/dist/version.json +1 -1
- package/lib/fleet/builtin.js +65 -12
- package/lib/fleet/causes.js +1 -0
- package/lib/fleet/cell-hold.js +20 -0
- package/lib/fleet/definitions.js +113 -15
- package/lib/fleet/launch-broker.js +4 -1
- package/lib/fleet/launch.js +124 -0
- package/lib/fleet/managed.js +63 -9
- package/lib/fleet/provider.js +1 -1
- package/lib/fleet/runtime.js +115 -23
- package/lib/mcp/tools.js +143 -3
- package/lib/proxy/federation.js +63 -2
- package/lib/server.js +22 -6
- package/lib/settings/routes.js +60 -14
- package/lib/tmux/lifecycle.js +1 -0
- package/package.json +1 -1
- package/frontend/dist/assets/index-BAzlX2nP.css +0 -32
- package/frontend/dist/assets/index-BJdAdNOq.js +0 -93
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,80 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to NexusCrew are tracked here.
|
|
4
4
|
|
|
5
|
+
## 0.8.31 — 2026-07-22 — "Safe Identity"
|
|
6
|
+
|
|
7
|
+
- **tmux session naming for dotted cell ids.** tmux silently normalizes `.` to `_`
|
|
8
|
+
in session names, so a cell whose id contains a dot (e.g. `agy.native`) could no
|
|
9
|
+
longer be targeted by its nominal `cloud-<id>` name. Dotted ids now map
|
|
10
|
+
deterministically to a dot-free, collision-free session name (`cloud-v2-…`, 55
|
|
11
|
+
chars); ids without a dot keep the historical `cloud-<id>` name, so the existing
|
|
12
|
+
sessions are never renamed. The real `tmuxSession` for any cell is always
|
|
13
|
+
available from `nc_cells` and the Fleet UI — use that rather than guessing
|
|
14
|
+
`cloud-<Cell>` for dotted ids. Cell launches are now staged (inert placeholder →
|
|
15
|
+
window-local `remain-on-exit` on `@N` → `respawn-pane` on `%N`) so setup and
|
|
16
|
+
early-exit diagnostics use stable tmux object IDs. Any pre-existing legacy
|
|
17
|
+
session is migrated in place via `rename-session -t $N`
|
|
18
|
+
(preserving the session id and the operator's attach).
|
|
19
|
+
- **Agy as a managed primary client** on Linux and macOS (non-Termux), with auth
|
|
20
|
+
delegated to Agy's own local login (no credential store read or copied),
|
|
21
|
+
`standard`/`unsafe` permission policies (`unsafe` adds
|
|
22
|
+
`--dangerously-skip-permissions`, consistent with the other clients),
|
|
23
|
+
free-text model selection, and an optional `--prompt-interactive` prompt passed
|
|
24
|
+
as the last argument. Termux and Windows keep using Agy through `shell.local`
|
|
25
|
+
with a per-cell `agy` command. Added to existing installs by an idempotent,
|
|
26
|
+
non-destructive, platform-aware backfill.
|
|
27
|
+
- **Share revocation now converges as authorization, not availability.** Turning
|
|
28
|
+
Share off persists private intent, withdraws the node from its hub over the
|
|
29
|
+
still-live private forward, and only then replaces the local tunnel without
|
|
30
|
+
its reverse channel. Authorized operational discovery (topology, decks and
|
|
31
|
+
MCP cell directories) removes the owner after the hub acknowledgement, while
|
|
32
|
+
a merely unreachable node remains visible as stale/offline. Partial failures
|
|
33
|
+
remain explicit and are retried with bounded, structured boot diagnostics.
|
|
34
|
+
|
|
35
|
+
- **Selective mobile-UX PR #1 (UI only).** Three client-only behaviours ported
|
|
36
|
+
onto the 0.8.31 candidate, no merge of PR #1:
|
|
37
|
+
- **Optional compact KeyBar.** A new `keybarLayout: "full" | "compact"`
|
|
38
|
+
preference (default `full`) renders a one-row compact bar with an expand
|
|
39
|
+
toggle that temporarily reveals the exact full key set without rewriting
|
|
40
|
+
the stored preference; the tall Enter and `showKeybarEnter=false` (no gap)
|
|
41
|
+
apply to both layouts. Editable in Settings → Input (IT/EN/ES), reset-safe
|
|
42
|
+
and synced across windows; a layout change never remounts xterm or
|
|
43
|
+
reconnects its WebSocket.
|
|
44
|
+
- **Live-DOM composer submit during IME.** Explicit submit reads
|
|
45
|
+
`textareaRef.current.value`, syncs the React draft and sends the visible
|
|
46
|
+
text after newline normalization — preserving the empty no-op, the
|
|
47
|
+
failed-send draft, history, STT and the focus policy.
|
|
48
|
+
- **Alternate-screen scroll as PageUp/PageDown.** A pure bounded plan routes
|
|
49
|
+
writable alternate-screen (vim/less/htop) vertical gestures to raw
|
|
50
|
+
`ESC[5~`/`ESC[6~` PTY input with a page-sized threshold; normal-screen and
|
|
51
|
+
any readonly terminal keep the server-side `scroll-up`/`scroll-down`
|
|
52
|
+
actions. Integrated into both wheel and touch paths without weakening
|
|
53
|
+
double-tap unlock, long-press selection, multi-touch or VirtualKeyboard.
|
|
54
|
+
|
|
55
|
+
## 0.8.30 — 2026-07-22 — "Focused Control"
|
|
56
|
+
|
|
57
|
+
- Makes every owner/node name in the top deck bar an explicit expand/collapse control. Newly seen
|
|
58
|
+
nodes start collapsed, each deck shows a compact live activity dot, and browser-local choices
|
|
59
|
+
synchronize across open NexusCrew windows without exposing topology or presence to other nodes.
|
|
60
|
+
- Adds a full-height mobile Enter key beside Page Up/Page Down and a dedicated **Settings → Input**
|
|
61
|
+
panel. Key-bar and speech-to-text actions keep the software keyboard closed by default, terminal
|
|
62
|
+
input requires a nearby double tap, and every behavior can be changed or reset per browser.
|
|
63
|
+
- Hardens the mobile gesture state machine for movement, long press, cancel, blur, VirtualKeyboard
|
|
64
|
+
geometry changes, visual-viewport recovery and sequential two-finger releases. Preference changes
|
|
65
|
+
do not remount xterm or reconnect the terminal WebSocket.
|
|
66
|
+
- Runs configured Shell commands through an interactive login invocation on known POSIX shells so
|
|
67
|
+
user PATH entries such as `agy` resolve while retaining the private launch broker. Immediate
|
|
68
|
+
non-zero exits now surface a bounded `SHELL_COMMAND_FAILED` cause; successful one-shot completion
|
|
69
|
+
and commands that remain active are reported distinctly.
|
|
70
|
+
- Adds the read-only `nc_cell_diagnostics` MCP tool for one exact local Fleet cell. It returns the
|
|
71
|
+
configured Shell command with bounded credential redaction and the latest closed spawn/start
|
|
72
|
+
failure cause, rejects remote targets, and preserves the existing local active-caller ACL.
|
|
73
|
+
- Extends regression coverage for cross-window input preferences, listener cleanup, IME relocking,
|
|
74
|
+
multi-touch cancellation, redaction of generic uppercase environment assignments and the complete
|
|
75
|
+
DeckBar/mobile-input/Shell/MCP integration.
|
|
76
|
+
- Gate: **998 isolated Node tests** (997 pass / 1 platform skip), **192/192 frontend tests**,
|
|
77
|
+
production PWA build and zero production dependency vulnerabilities in both dependency trees.
|
|
78
|
+
|
|
5
79
|
## 0.8.29 — 2026-07-21 — "Stable Fleet Boot"
|
|
6
80
|
|
|
7
81
|
- Keeps the optional Fleet boot companion rooted at the stable user home on Linux, macOS and
|
package/README.md
CHANGED
|
@@ -133,12 +133,13 @@ model, permission policy, optional system prompt, optional Shell command and boo
|
|
|
133
133
|
a stopped cell opens the same launch sheet on desktop and mobile, so the effective settings can
|
|
134
134
|
be reviewed before the process starts.
|
|
135
135
|
|
|
136
|
-
An **engine** describes how a CLI is launched. Clean installations include
|
|
136
|
+
An **engine** describes how a CLI is launched. Clean installations include these base adapters:
|
|
137
137
|
|
|
138
138
|
- Claude Code
|
|
139
139
|
- Codex
|
|
140
140
|
- Codex-VL
|
|
141
141
|
- Pi
|
|
142
|
+
- Agy — Linux and macOS only (auth delegated to Agy's local login; `standard`/`unsafe` permission policies). On Android/Termux use the Shell adapter with a per-cell `agy` command.
|
|
142
143
|
- Shell
|
|
143
144
|
|
|
144
145
|
The provider catalog is scoped to the selected CLI rather than to a machine-specific setup:
|
|
@@ -157,9 +158,11 @@ directly without a shell after trust-boundary validation.
|
|
|
157
158
|
|
|
158
159
|
The Shell engine resolves `$SHELL` or a trusted platform shell when the cell starts; executable
|
|
159
160
|
paths are not stored in Fleet definitions or backups. Leaving its command empty opens an
|
|
160
|
-
interactive login shell. A configured command is passed as one opaque argument
|
|
161
|
-
|
|
162
|
-
|
|
161
|
+
interactive login shell. A configured command is passed as one opaque argument through the
|
|
162
|
+
private launch broker, runs once without restart supervision, and then leaves the cell stopped.
|
|
163
|
+
Known POSIX shells use an interactive login invocation (`-lic`) so the user's configured PATH is
|
|
164
|
+
available; custom shells retain the conservative `-lc` contract. Shell does not accept prompts,
|
|
165
|
+
models or unsafe permission policy.
|
|
163
166
|
|
|
164
167
|
OpenRouter is first-class for Claude Code and Codex-VL. Claude uses OpenRouter's Anthropic
|
|
165
168
|
Messages compatibility endpoint, while Codex-VL uses the beta, stateless Responses endpoint
|
|
@@ -213,6 +216,11 @@ Desktop decks place multiple live terminals in a saved tiled layout. Decks remai
|
|
|
213
216
|
the current PWA by default; `↗` detaches one into another browser window. Session and deck order
|
|
214
217
|
can be changed with pointer drag-and-drop or keyboard controls and is saved automatically.
|
|
215
218
|
|
|
219
|
+
The top deck bar groups workspaces by owner node. Clicking a node name expands or collapses its
|
|
220
|
+
decks; newly seen nodes start collapsed so connected-but-idle machines remain available without
|
|
221
|
+
occupying the bar. Every deck carries a compact activity dot, and collapse choices are stored in
|
|
222
|
+
the current browser and synchronized across its open NexusCrew windows.
|
|
223
|
+
|
|
216
224
|
On mobile, locations are independently collapsible and filterable by all, pinned, active, off,
|
|
217
225
|
or technical sessions. The same owner-qualified ordering model is used by compact and expanded
|
|
218
226
|
desktop views. Managed terminals use the logical Fleet cell name as their visible title; tmux
|
|
@@ -229,6 +237,17 @@ multiline prompts use the terminal application's bracketed-paste mode; clipboard
|
|
|
229
237
|
dropped files are stored in the selected session inbox and their paths are inserted without
|
|
230
238
|
submitting Enter.
|
|
231
239
|
|
|
240
|
+
The two-row mobile key bar can also show a full-height Enter key beside Page Up/Page Down, so
|
|
241
|
+
interactive terminal choices can be confirmed without opening the software keyboard. By default,
|
|
242
|
+
key-bar and speech-to-text actions keep that keyboard closed, while a nearby double tap inside the
|
|
243
|
+
terminal explicitly opens it. **Settings → Input** can change the terminal gesture, hide the Enter
|
|
244
|
+
key, or allow key-bar and voice actions to retain the keyboard. The key bar also has a
|
|
245
|
+
**compact** layout (one row with an expand toggle that temporarily reveals the full key set
|
|
246
|
+
without changing the preference), and alternate-screen TUIs (vim/less/htop) receive vertical
|
|
247
|
+
gestures as raw Page Up/Page Down while normal and readonly terminals keep server-side scroll.
|
|
248
|
+
These preferences are browser-local and are synchronized between open NexusCrew windows for
|
|
249
|
+
the same origin.
|
|
250
|
+
|
|
232
251
|
The input composer can expand for longer prompts. Each owner-qualified tmux cell keeps its own
|
|
233
252
|
draft, size preference and bounded prompt history in the current browser, including safe
|
|
234
253
|
ArrowUp/ArrowDown recall at textarea boundaries. This browser-local state is not federated or
|
|
@@ -264,9 +283,19 @@ need direct SSH reachability to one another.
|
|
|
264
283
|
|
|
265
284
|
Reverse ports are reserved across active and pending pairings, probed before use and protected
|
|
266
285
|
by a persistent uniqueness check. Share is stored as desired state: failed activation rolls back
|
|
267
|
-
to private
|
|
268
|
-
|
|
269
|
-
|
|
286
|
+
to private. Deactivation first saves private intent, then asks the hub to withdraw the node over
|
|
287
|
+
the still-live private forward, and only after that acknowledgement removes the reverse channel.
|
|
288
|
+
If the hub cannot acknowledge the revocation, Settings refreshes to the saved private state and
|
|
289
|
+
shows that hub reconciliation is still pending; bounded boot retries continue without claiming
|
|
290
|
+
that remote removal already completed. A stale same-name peer or a late allocation collision
|
|
291
|
+
returns an actionable conflict instead of silently creating a duplicate record or consuming the
|
|
292
|
+
invitation.
|
|
293
|
+
|
|
294
|
+
Private pairing is administrative inventory, not operational publication. A paired client can
|
|
295
|
+
remain listed as **private** in Settings so it can be reconnected or shared again, but it is absent
|
|
296
|
+
from routable topology, owner/deck bars and MCP cell/deck discovery. Temporary loss of reachability
|
|
297
|
+
does not revoke consent: an authorized node remains visible as stale/offline until a successful
|
|
298
|
+
authoritative refresh either restores it or confirms its withdrawal.
|
|
270
299
|
|
|
271
300
|
The Share control reports desired publication separately from verified tunnel reachability. If a
|
|
272
301
|
detached process survives an upgrade with stale `-R` arguments, **Reconnect and reconcile** applies
|
|
@@ -362,6 +391,7 @@ It is intended for AI sessions running inside managed tmux cells.
|
|
|
362
391
|
| `nc_inbox` | List files received by the caller |
|
|
363
392
|
| `nc_deck` | Discover owner-qualified decks containing the calling tmux session |
|
|
364
393
|
| `nc_cells` | List authorized active and inactive Fleet cells across visible nodes |
|
|
394
|
+
| `nc_cell_diagnostics` | Read the redacted Shell command and latest bounded start/spawn failure for one exact local cell |
|
|
365
395
|
| `nc_send_cell` | Submit bounded text to one exact active cell returned by `nc_cells` |
|
|
366
396
|
| `nc_identity` | Read-only identity diagnostics; callable with no session and no token |
|
|
367
397
|
|
|
@@ -412,9 +442,15 @@ The caller is resolved, in order, from its tmux session (`tmux display-message -
|
|
|
412
442
|
then from the `NEXUSCREW_MCP_SESSION` fallback, then not at all. Codex/Codex-VL launch MCP stdio
|
|
413
443
|
processes with a cleared environment, so those clients must explicitly allowlist the identity
|
|
414
444
|
env vars for the server to observe them; otherwise the identity-gated tools (`nc_ask`, `nc_send_file`,
|
|
415
|
-
`nc_deck`, `nc_send_cell`, `nc_inbox`) stay fail-closed with a stable
|
|
445
|
+
`nc_deck`, `nc_cell_diagnostics`, `nc_send_cell`, `nc_inbox`) stay fail-closed with a stable
|
|
416
446
|
`NEXUSCREW_MCP_IDENTITY_*` code, while `nc_notify` degrades to an unknown sender.
|
|
417
447
|
|
|
448
|
+
`nc_cell_diagnostics` accepts an exact owner-qualified ID returned by `nc_cells`, but only when
|
|
449
|
+
that target belongs to the local node and the caller is an active local Fleet cell. It does not
|
|
450
|
+
query remote nodes or add commands to the federated directory. The returned command is bounded
|
|
451
|
+
and credential-redacted; the failure is a closed `{status, code, phase}` cause rather than raw
|
|
452
|
+
stderr, paths, environment values, prompts or tokens.
|
|
453
|
+
|
|
418
454
|
## Configuration
|
|
419
455
|
|
|
420
456
|
Runtime state is local to the current user:
|
|
@@ -469,7 +505,7 @@ See [CHANGELOG.md](CHANGELOG.md) for released changes.
|
|
|
469
505
|
|
|
470
506
|
## Status
|
|
471
507
|
|
|
472
|
-
The current stable release is **v0.8.
|
|
508
|
+
The current stable release is **v0.8.31** on npm and GitHub.
|
|
473
509
|
|
|
474
510
|
## License
|
|
475
511
|
|