@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 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 five base adapters:
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 to that shell's
161
- `-lc`, runs once without restart supervision, and then leaves the cell stopped. Shell does not
162
- accept prompts, models or unsafe permission policy.
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, while a failed deactivation remains private and is reconciled after restart. A stale
268
- same-name peer or a late allocation collision returns an actionable conflict instead of silently
269
- creating a duplicate record or consuming the invitation.
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.29** on npm and GitHub.
508
+ The current stable release is **v0.8.31** on npm and GitHub.
473
509
 
474
510
  ## License
475
511