@mmmbuto/nexuscrew 0.8.24 → 0.8.26

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 ADDED
@@ -0,0 +1,764 @@
1
+ # Changelog
2
+
3
+ All notable changes to NexusCrew are tracked here.
4
+
5
+ ## 0.8.26 — 2026-07-20 — "MCP Identity"
6
+
7
+ - Makes MCP caller resolution directly diagnosable through the read-only `nc_identity` tool.
8
+ The diagnostic works without a token or resolved session, reports only non-sensitive source
9
+ and presence metadata, and returns stable missing/invalid identity codes with remediation.
10
+ - Keeps identity-gated tools fail-closed while improving their error contract. A missing or
11
+ invalid tmux identity can no longer be mistaken for a transport failure, and `nc_notify`
12
+ continues to degrade safely to an unknown sender.
13
+ - Documents the explicit `env_vars` name allowlist required by clients that clear the MCP stdio
14
+ environment, including the matching repeatable `codex-vl mcp add --env-var NAME` form. Values
15
+ remain outside command arguments and configuration files.
16
+ - Extends `nexuscrew doctor` with a non-failing MCP identity check: PWA-only users receive at
17
+ most an informational warning, while MCP users can see whether `TMUX` or
18
+ `NEXUSCREW_MCP_SESSION` is observable in the current process.
19
+ - Stabilizes the writable-provider-file security fixture across differing CI umasks without
20
+ weakening the production permission check.
21
+ - Gate: **888 isolated Node tests** (887 pass / 1 platform skip), **39/39 frontend component
22
+ tests**, production PWA build and zero production dependency vulnerabilities in both the root
23
+ and frontend dependency trees.
24
+
25
+ ## 0.8.25 — 2026-07-19 — "Token Plan"
26
+
27
+ - Adds Alibaba Token Plan Personal as a first-class managed provider for Claude Code,
28
+ Codex-VL and Pi, with `qwen3.8-max-preview` as the default and one fixed local credential
29
+ reference, `ALIBABA_CODE_API_KEY`. Credential values stay in the existing write-only
30
+ credential layer and selected child environment; they never enter engine definitions,
31
+ generated extensions, argv, status responses, logs or the package.
32
+ - Configures Claude Code against the plan's Anthropic-compatible base with isolated private
33
+ state, a 983,616-token context and explicit Qwen aliases for model, Sonnet, Opus, Haiku,
34
+ subagents and Fable. The API-key variable remains empty while the resolved value is supplied
35
+ only through the authentication-token variable expected by the client. Selecting a non-default
36
+ plan model keeps every alias aligned with that model and omits qwen3.8-only context and effort
37
+ overrides.
38
+ - Configures Codex-VL through the Responses wire API with a Qwen-only plan allowlist and a
39
+ packaged qwen3.8 catalog: 95% effective context, `xhigh` default reasoning, text and image
40
+ input, original image detail and parallel tool calls disabled. The profile has no OpenAI or
41
+ pay-as-you-go fallback.
42
+ - Gives Pi a private, value-free provider extension. Response-capable Qwen models use Pi's
43
+ Responses adapter; GLM and DeepSeek use Chat Completions with `reasoning_content` preserved
44
+ across assistant and tool replay. Standard permissions remain the only supported policy.
45
+ - Packages the portable `alibaba-token-media` skill for Claude Code, Codex, Codex-VL and Pi.
46
+ Its dependency-free CLI provides dry-run-first Wan 2.7 image/edit and HappyHorse video
47
+ workflows with fixed Token Plan endpoints, one concurrent submit, explicit Credit/high-cost
48
+ consent, private file handling and safe unique downloads under the user's Downloads folder.
49
+ - Keeps the existing public Z.AI surface unchanged: `claude.zai` remains the only generic
50
+ Claude profile, while the historical A/P names stay hidden compatibility aliases.
51
+ - Makes the mobile Fleet header count live cells and unmanaged tmux sessions across local and
52
+ routed inventories, so an inventory-only or Hydra view can no longer report zero while cells
53
+ are active.
54
+ - Adds a direct per-cell boot toggle to the mobile and desktop rosters. It changes only the next
55
+ reboot preference, never the current power state, and stays synchronized with the same boot
56
+ setting used by the existing power sheet; desktop settlements are acknowledged once so a
57
+ sidebar remount cannot replay stale state.
58
+ - Keeps Python bytecode outside the npm package even when skill compilation runs before packing,
59
+ with an isolated compile-before-pack regression test for the exact `files[]` behaviour.
60
+ - Gate: **878 isolated Node tests** (877 pass / 1 platform skip), **39/39 frontend component
61
+ tests**, production PWA build, zero production dependency vulnerabilities, sanitized package
62
+ inspection and an offline install smoke. Provider calls and Token Plan credit consumption are
63
+ intentionally outside the release build gate.
64
+ - Known debt: the minified PWA main chunk is 806.50 kB (231.11 kB gzip), so Vite's 500 kB
65
+ advisory remains visible and code splitting stays on the performance backlog.
66
+
67
+ ## 0.8.24 — 2026-07-18 — "Safe Pairing"
68
+
69
+ - Gives every joining installation an explicit, editable local route handle that is separate
70
+ from its display label. The default is deterministic and readable, combines the label or
71
+ hostname with a stable node-ID suffix, stays within 32 characters and never sends bare
72
+ `localhost` from Termux devices.
73
+ - Keeps `nodeId` as the peer identity while treating the route slug only as a unique handle.
74
+ Older clients that omit `localName` receive the same safe server-side derivation, so two
75
+ phones whose operating system hostname is `localhost` can join the same hub independently.
76
+ - Returns a deterministic replacement handle when a committed or pending peer already owns the
77
+ requested name. The PWA applies that suggestion, preserves the freely editable display label
78
+ and retries with the same unconsumed invitation; headless pairing exposes matching
79
+ `--local-name` and `--local-label` options.
80
+ - Restores `nexuscrew init` as a public, idempotent command with validated `--port` and
81
+ side-effect-free `--dry-run` support, so first-run recovery instructions always name a command
82
+ that the dispatcher actually accepts.
83
+ - Gate: **861 isolated Node tests** (860 pass / 1 platform skip), **34/34 frontend component
84
+ tests**, production PWA build and zero production dependency vulnerabilities.
85
+
86
+ ## 0.8.23 — 2026-07-18 — "Fleet Ready"
87
+
88
+ - Repairs partial or migrated installations that have NexusCrew configuration and a token but no
89
+ `fleet.json`. Runtime startup now creates the built-in Fleet defaults only when the file is
90
+ absent, including service-manager and Termux:Boot paths; an existing invalid file remains
91
+ fail-closed and is never overwritten.
92
+ - Makes smart startup restart an already-running runtime when it has just repaired the missing
93
+ definitions, so provider selection is refreshed before the PWA is reused. `nexuscrew doctor`
94
+ now reports missing, invalid, intentionally disabled and valid Fleet definitions explicitly.
95
+ - Separates Fleet editor loading, API failure and genuinely unavailable-provider states in the
96
+ PWA. A disabled provider can expose a safe operational reason instead of the misleading
97
+ “builtin provider only” message shown during initial loading or on partial Termux installs.
98
+ - Contains shared-tmux failure containment: generated Linux services require `KillMode=process`,
99
+ lifecycle commands fail closed if that protection is absent, shared servers pin
100
+ `exit-empty off` and guard `kill-server`, and cleanup tests require a unique private `-L`
101
+ socket instead of ever targeting the operator's default server.
102
+ - Gate: **854 isolated Node tests** (853 pass / 1 platform skip), **33/33 frontend component
103
+ tests**, production PWA build and zero production dependency vulnerabilities.
104
+ - Release scope at the time: npm `latest` only; 0.8.24 now carries the same changes into the
105
+ public GitHub history.
106
+
107
+ ## 0.8.22 — 2026-07-17 — "Sole Authority"
108
+
109
+ - Makes NexusCrew the only Fleet owner. The legacy executable adapter, discovery paths,
110
+ `fleetBin` configuration and alternate boot ownership are removed; `NEXUSCREW_FLEET=0`
111
+ remains the explicit kill switch.
112
+ - Supervises every built-in cell behind the private one-shot launch broker. A client that exits
113
+ after readiness is restarted with bounded exponential backoff and a rapid-failure circuit
114
+ breaker; explicit stop disarms relaunch even during backoff, while restart remains intentional.
115
+ - Adds a canonical hub peer inventory to Settings with separate direct hubs, inbound clients and
116
+ routed inspect-only nodes. Direct peers expose direction-aware **Edit**, **Disconnect** and
117
+ **Delete** actions, stale routed peers no longer appear healthy, and labels now have one
118
+ server-backed source across Settings, desktop and mobile.
119
+ - Expands the headless CLI with stable `name|nodeId` lookup for list/show/doctor, edit/rename,
120
+ visibility, connect/disconnect/reconnect, Share, revoke/remove, invite and stdin-only pair/join.
121
+ Every mutation honors READONLY; pairing capabilities never need to appear in argv.
122
+ - Gate: **845 Node tests** (844 pass / 1 platform skip), **30 frontend component tests**, a
123
+ production build and zero production dependency vulnerabilities.
124
+
125
+ ## 0.8.21 — 2026-07-17 — "Reconciled Share"
126
+
127
+ - Reconciles the detached SSH supervisor with the persisted Share state even when the requested
128
+ value is unchanged. A pre-upgrade process that still carries `-R` while the store says private
129
+ is replaced through the existing verified, spec-aware pidfile lifecycle before the hub is
130
+ notified.
131
+ - Keeps the Share checkbox usable while the tunnel is down and adds an explicit **Reconnect and
132
+ reconcile** action that reapplies the current state without toggling consent. Desired Share
133
+ state, verified reachability and a down private connection now have distinct UI messages.
134
+ - Reverse-forward diagnostics extract the negotiated listen port from OpenSSH and show the exact
135
+ `permitlisten="127.0.0.1:<port>"` restriction to verify, while retaining neutral wording when a
136
+ port collision and a key/server policy denial cannot yet be distinguished.
137
+ - Gate: **855 Node tests** (854 pass / 1 platform skip), **30 frontend component tests** and a
138
+ production build with aligned package/UI version `0.8.21`.
139
+ - Release scope: published to npm `latest` and installed on the local runtime. GitHub commit,
140
+ push, tag and release remain outside this maintenance rollout.
141
+
142
+ ## 0.8.20 — 2026-07-17 — "Reliable Routes"
143
+
144
+ - OpenRouter is now a first-class provider for Claude Code and Codex-VL. Claude uses the
145
+ Anthropic-compatible endpoint without guessed context limits; Codex-VL uses the beta,
146
+ stateless Responses wire API, direct no-shell command authentication and a ten-minute stream
147
+ idle timeout. Kimi K3 receives packaged one-million-token model metadata.
148
+ - Kimi Code is available as a non-default Claude provider with `k3[1m]`, its documented coding
149
+ endpoint, model-specific context and effort settings, and an isolated Claude configuration
150
+ that leaves native Anthropic account state unchanged.
151
+ - Built-in provider editors gain a write-only KEY section with value-free configured source and
152
+ target-local “used by” impact. Credential values remain outside engine definitions, backups,
153
+ federation payloads, argv, tmux state, logs and API responses.
154
+ - Shared-node reverse ports are reserved across pending and active pairings and bind-probed before
155
+ use. Share desired state now fails safely, reconciles after restart, rejects duplicate peer
156
+ names without burning invitations and returns actionable allocation conflicts.
157
+ - Remote inventory survives a missing tmux socket and partial peer failures. Topology probes are
158
+ parallel and bounded, repeated reverse-forward failures stop retrying, and diagnostics no
159
+ longer claim that the SSH server denied forwarding without supporting evidence.
160
+ - Desktop and mobile node groups support browser-local rename and reorder controls without
161
+ changing node identity, routes, credentials, Share state, deck identity or cell ordering.
162
+ - Gate: **853 Node tests** (852 pass / 1 platform skip), **30 frontend component tests**,
163
+ production build, zero dependency vulnerabilities and sanitized npm package inspection.
164
+
165
+ ## 0.8.19 — 2026-07-17 — "Live Activity"
166
+
167
+ - Fleet status dots now distinguish all three cell states on mobile and desktop: gray when off,
168
+ fixed green when powered but idle, and a pulsing green signal only while the attached AI client
169
+ is actively working. Reduced-motion preferences disable the pulse without hiding the text state.
170
+ - Each cell keeps a single useful subtitle. Powered-off rows show the engine, credential profile
171
+ and model when available; powered-on rows switch to a live localized status such as working,
172
+ the current task label, or idle. The same contract covers expanded, compact and remote rosters.
173
+ - Working detection uses the tmux pane title's Braille progress frame as the primary cross-client
174
+ signal. Pi receives a narrowly gated capture fallback, while activity timestamps and persistent
175
+ transcript text cannot mark unrelated or stale cells as busy. The sessions API adds bounded,
176
+ sanitized activity fields without breaking older peers.
177
+ - Gate: **830 Node tests** (829 pass / 1 platform skip), **25 frontend component tests**,
178
+ production build and zero dependency vulnerabilities.
179
+
180
+ ## 0.8.18 — 2026-07-15 — "Persistent Composer"
181
+
182
+ - The input composer now expands for long prompts and keeps a separate browser-local draft,
183
+ size preference and bounded prompt history for each owner-qualified tmux cell. State survives
184
+ route renames and reloads, synchronizes safely between tabs and can be cleared from System
185
+ settings; it is never federated or included in Fleet backups.
186
+ - History can be selected from the composer menu or recalled with ArrowUp/ArrowDown only at safe
187
+ textarea boundaries. Active IME composition is left untouched, failed sends preserve the draft,
188
+ and a delayed successful send cannot erase newer typing or another cell's draft.
189
+ - Persistence is bounded by per-entry, per-cell and browser-wide limits with 30-day expiry and
190
+ quota-aware eviction. Regression coverage includes long Unicode prompts above 32 KiB, async
191
+ send races, owner/session identity changes, cross-tab ordering, hostile stored objects and
192
+ mounted-state reset.
193
+ - Gate: **825 Node tests** (824 pass / 1 platform skip), **22 frontend component tests**,
194
+ production build and zero dependency vulnerabilities.
195
+
196
+ ## 0.8.17 — 2026-07-15 — "Modular Core"
197
+
198
+ - Termux can now start the first managed cell when no tmux server exists. NexusCrew reconstructs
199
+ the canonical `PREFIX`, `TMPDIR` and `TMUX_TMPDIR=$PREFIX/var/run` values even when it starts
200
+ outside an interactive shell, while generated NexusCrew and Fleet boot scripts create and
201
+ export the same runtime paths explicitly. Existing custom `TMUX_TMPDIR` values remain
202
+ authoritative; Linux and macOS behavior is unchanged.
203
+ - The Fleet runtime/launch layer, CLI lifecycle, MCP tool directory, pairing coordinator, shared
204
+ roster model and Fleet settings components are split into focused modules without changing
205
+ their public routes, commands, payloads or security boundaries. This keeps the current product
206
+ behavior while making the next gateway and federation work reviewable in smaller units.
207
+ - Regression coverage includes a real private-socket cold start with no existing tmux server,
208
+ profile-less Termux environment reconstruction, generated boot scripts and the extracted module
209
+ boundaries. Gate: **819 Node tests** (818 pass / 1 platform skip), **12 frontend component
210
+ tests**, production build and zero production dependency vulnerabilities.
211
+
212
+ ## 0.8.16 — 2026-07-14 — "Honest Tunnel"
213
+
214
+ - One-link pairing now treats its embedded SSH endpoint as portable routing rather than a
215
+ transferable identity. Authentication and SSH-stage failures automatically expose the local
216
+ override, where a device can use the same Host alias that already selects its own key, agent,
217
+ port or ProxyJump. The override is saved only in that node's local routing configuration;
218
+ private keys never enter the link, NexusCrew configuration, logs or federation payloads.
219
+ - A supervised `ssh` process is no longer reported ready merely because it remains alive.
220
+ After the stability window NexusCrew probes the exact loopback `-L` port and advertises
221
+ transport readiness only when that forward accepts TCP; unreachable connects are bounded by
222
+ OpenSSH's 15-second timeout and remain in an explicit probing state.
223
+ - Startup, stop and restart reconcile strict NexusCrew tunnel pidfiles against the authoritative
224
+ node store. Verified supervisors left by a removed node or interrupted older runtime are
225
+ stopped safely, while configured nodes, unrelated processes, symlinks and invalid names are
226
+ untouched.
227
+ - Regression coverage exercises exact SSH argv, local-alias recovery in the real pairing
228
+ component, TCP-forward readiness versus a merely live child, generation ownership, safe
229
+ orphan reconciliation, server startup ordering and lifecycle cleanup. Gate: **788 Node
230
+ tests** (787 pass / 1 platform skip), **12 frontend component tests**, production build and
231
+ zero production dependency vulnerabilities.
232
+
233
+ ## 0.8.15 — 2026-07-14 — "Steady Link"
234
+
235
+ - One-link pairing now waits against a real 20-second readiness deadline with bounded retries.
236
+ Immediate loopback refusals can no longer exhaust the probe in 3.75 seconds and tear down a
237
+ valid SSH session just as key negotiation completes on Termux, Linux, or macOS.
238
+ - Per-tunnel diagnostics are never empty by design: NexusCrew writes safe supervisor lifecycle
239
+ markers and forces SSH error-level diagnostics even when a user Host stanza requests quiet
240
+ logging. The 0600 log omits synthetic argv dumps, key contents, tokens and credentials;
241
+ OpenSSH's own error text may identify the failed target.
242
+ - Local and federated deck tabs can be reordered inside their owner group with a dedicated
243
+ Pointer Events handle on mouse, touch, or pen, plus keyboard left/right controls. The
244
+ owner-qualified order autosaves per browser, survives polling/reload, and follows rename and
245
+ deletion without changing deck ownership.
246
+ - Regression coverage includes delayed SSH readiness at eight seconds, bounded permanent
247
+ failure, safe tunnel logging, owner-isolated deck ordering, pointer input, keyboard input,
248
+ and cross-owner rejection. Gate: **785 Node tests** (784 pass / 1 platform skip), **11
249
+ frontend component tests**, production build, and zero production dependency vulnerabilities.
250
+
251
+ ## 0.8.14 — 2026-07-14 — "Private Launch"
252
+
253
+ - Managed provider credentials can now be supplied per node from the PWA when they are absent
254
+ from that device's runtime environment or compatible user-owned provider files. The local
255
+ store is write-only through the API, owner-only on disk, never federated or backed up, and the
256
+ UI reports only configured/source state plus the exact active cells affected by a change.
257
+ - Secret-bearing launches use a private one-shot Unix-socket broker. The tmux command receives
258
+ only the helper path, socket path and a short-lived random nonce; provider values never enter
259
+ process arguments, `tmux -e`, tmux global/session environment, temporary files or logs. The
260
+ helper validates the bounded payload and directly spawns the configured CLI without a shell.
261
+ - Credential lookup is deterministic across Linux, macOS and Termux: service environment,
262
+ node-local store, `providers.zsh`, canonical `ai.env`/secure files, then the legacy store.
263
+ Mixed-case environment names are accepted, unsafe files/symlinks are rejected, and unresolved
264
+ shell expansion is never interpreted as a credential.
265
+ - Unmanaged tmux sessions can be explicitly marked technical. They stay hidden from normal
266
+ all/pinned/active/off views, appear in a dedicated technical view, and every Local/Hydra count
267
+ reflects only the rows currently displayed; managed cells remain protected from relabeling.
268
+ - Fleet reorder handles now use one Pointer Events implementation for mouse, touch and pen.
269
+ Destination highlighting, pointer capture, edge auto-scroll, release-only commit and
270
+ Escape/cancel rollback preserve the same owner-qualified order on mobile, expanded desktop
271
+ and compact desktop while keeping native card-to-deck drag separate.
272
+ - Tests: **781 total** (780 pass / 1 platform-dependent skip) in the isolated Node harness plus
273
+ 8 passing frontend component tests; production build and dependency audit required before
274
+ publication. Real cross-device drag and provider launches remain operator field tests.
275
+
276
+ ## 0.8.13 — 2026-07-14 — "Fleet Network"
277
+
278
+ - The MCP bridge now exposes `nc_cells` and `nc_send_cell`. An active managed cell can discover
279
+ the owner-qualified Fleet directory allowed by the current Hydra topology and submit bounded
280
+ text to one exact active destination. Remote ingress is bound to the authenticated route,
281
+ inactive cells are never silently queued, and `submitted` means only verified paste plus
282
+ Enter—not model acceptance or task completion.
283
+ - Cell submission uses an exact Fleet-cell/tmux match, bracketed paste, pane revalidation and a
284
+ separate submit. Codex and Codex-VL receive a paced burst flush before Enter to avoid long
285
+ composer input loss; the printable envelope prevents Pi from treating a trailing newline as
286
+ a second submit.
287
+ - The desktop and mobile Fleet rosters now persist the same owner-qualified manual order.
288
+ Dedicated mouse/touch handles and keyboard move controls avoid accidental power actions,
289
+ preserve pin priority and keep compact and expanded desktop views consistent.
290
+ - Selective backup schema v2 exports cells and reusable engines independently, accepts legacy
291
+ cell-only v1 files, previews conflicts and confirms every overwrite before mutation. Archives
292
+ contain environment-variable names only; secret values, tokens, live tmux IDs and provider
293
+ credentials remain local.
294
+ - Provider variables can be resolved by name from the service environment or a user-owned
295
+ `~/.config/ai-shell/providers.zsh` parsed strictly as data. The file is never sourced or
296
+ executed, and values are never copied into NexusCrew config, services or backups.
297
+ - Share is now a property of the local device and uses one selected, existing hub connection.
298
+ Outbound target cards no longer imply that the hub itself is being shared; inbound shared
299
+ clients retain hub-controlled network/relay/selected visibility, and publication waits for a
300
+ bounded authenticated readiness acknowledgement.
301
+ - Every Local or remote deck owner has its own inline `+ new` action, with no fallback to a
302
+ different owner. Deck tile layout and Fleet roster order continue to autosave independently.
303
+ - npm update checks and generated services use a stable NexusCrew working directory, parse npm
304
+ JSON-scalar and plain-semver output, and preserve a deterministic UTF-8 environment. Local
305
+ PTYs inherit only reviewed cross-platform variables; loader injection remains stripped.
306
+ - Real Termux launches npm-installed Codex and Codex-VL scripts through the active Node binary
307
+ when `/usr/bin/env` is unavailable, while native clients such as Pi stay direct. Immediate
308
+ managed-client exits produce bounded, redacted diagnostics and zero-window tmux phantoms are
309
+ removed from both session discovery and Fleet state.
310
+ - The packaged and canonical NexusCrew/tmux messaging skills plus shared AGENTS/CLAUDE guidance
311
+ document the eight-tool contract and prefer authenticated cell delivery over direct tmux
312
+ injection. Persistent offline queues, attachments and delegated capability workers remain
313
+ explicitly deferred rather than being represented as implemented.
314
+ - Tests: **770 total** (769 pass / 1 platform-dependent skip) in the isolated Node harness plus
315
+ 5 passing frontend component tests; production build PASS. Real Mac–hub–Pixel end-to-end
316
+ pairing and delivery remain an operator field test and are not represented as automated.
317
+
318
+ ## 0.8.12 — 2026-07-13 — "Mobile Roster"
319
+
320
+ - The mobile Fleet home now uses the same per-location roster contract as the desktop sidebar.
321
+ Local and every Hydra route can be collapsed independently and filtered by all, pinned,
322
+ active, or off; state persists under one shared key.
323
+ - Mobile pins are route-qualified, remote cells are pinnable, and both surfaces use the same
324
+ deterministic order: pinned, live, fresh output, recent activity, then label. Search counts
325
+ and scans the complete multi-node roster instead of only local sessions.
326
+ - New jsdom component tests exercise real filter, collapse, persistence, pin and multi-node
327
+ search interactions. The official Node harness also gives every test worker its own private
328
+ tmux socket, eliminating cross-file server-exit races without touching operator sessions.
329
+ - The SSH supervisor continuously proves ownership of its pidfile generation. Losing ownership
330
+ or failing a state write now terminates the child SSH process and supervisor instead of
331
+ leaving an invisible retry loop.
332
+ - Explicit Share fails closed unless its local NexusCrew port is present; reverse forwarding
333
+ can no longer substitute the hub's remote port. macOS shutdown detects zombie supervisors
334
+ through argv-safe `ps` when `/proc` is unavailable.
335
+ - Generated Linux user units now pull in `network-online.target`. Doctor warns when user linger
336
+ is disabled and explains that a Termux boot script still requires the Termux:Boot app to be
337
+ installed and launched once.
338
+ - Tests: **749 total** (748 pass / 1 platform-dependent skip), production build PASS, root and
339
+ frontend dependency audits clean. Mac–Pixel–hub end-to-end pairing was not executed in this
340
+ release gate.
341
+
342
+ ## 0.8.11 — 2026-07-13 — "Tmux Survival"
343
+
344
+ - Linux service lifecycle is now tmux-safe. Generated units use `KillMode=process`, and an
345
+ existing installation receives a narrow atomic systemd drop-in plus `daemon-reload` before
346
+ `nexuscrew stop` or `nexuscrew restart`. If that protection cannot be installed, lifecycle
347
+ commands fail closed without touching the service or its tunnels.
348
+ - Managed SSH supervisors are closed before a service restart and restored only through the
349
+ normal autostart path. The npm updater now rejects an unverified restart result instead of
350
+ continuing to health checks or reporting a successful update.
351
+ - Token rotation verifies the tmux-safety guard before changing credentials and reports an
352
+ incomplete operation if the runtime cannot be restarted; the direct update helper likewise
353
+ returns failure instead of claiming that the new code is active.
354
+ - `nexuscrew doctor` treats an unsafe Linux `KillMode` as a blocking failure and explains that
355
+ restarting the HTTP service could terminate the shared tmux server.
356
+ - The official test harness removes inherited `TMUX` identity and places every real tmux smoke
357
+ test on a private socket below its disposable test root. Tests can no longer attach to,
358
+ resize, or terminate an operator session.
359
+ - The mobile roster footer now keeps endpoint/version metadata and the IT/EN/ES language
360
+ controls aligned at narrow widths, with bounded ellipsis instead of overlap.
361
+ - Tests: **739 total** (738 pass / 1 platform-dependent skip), targeted lifecycle isolation and
362
+ full-suite before/after tmux inventory checks, production build PASS, dependency audit clean.
363
+
364
+ ## 0.8.10 — 2026-07-13 — "Hydra Federation"
365
+
366
+ - Hydra pairing now creates one supervised OpenSSH connection per hub: the private `-L`
367
+ channel is automatic, while `-R` exists only after an explicit Share toggle and a real
368
+ authenticated readiness probe. The retired rendezvous/node-role runtime can no longer
369
+ start a second hidden tunnel, and pairing cannot self-escalate to shared.
370
+ - Tunnel liveness no longer mistakes a surviving `autossh` wrapper for a healthy SSH child.
371
+ `ssh` is the single runtime transport and a blocking doctor requirement; `autossh` is
372
+ reported separately as optional and unused. PWA failures no longer recommend private or
373
+ nonexistent CLI commands.
374
+ - The read-only MCP bridge adds owner-aware `nc_deck`: a cell can discover every local or
375
+ authorized shared-owner deck containing its tmux session and read visually ordered members
376
+ with stable owner IDs, Fleet cell names, exact tmux sessions, viewer-valid Hydra routes and
377
+ self identity. The packaged NexusCrew skill documents discovery without direct state access.
378
+ - Decks are owner-qualified and resolve their tiles from the viewer's route, so identically
379
+ named sessions on different nodes never collapse or fall back to a local session. Shared
380
+ owner decks are read through the existing scoped Hydra channel and remain visibly unavailable
381
+ when their owner is offline.
382
+ - The Fleet roster keeps its desktop chrome fixed and groups every local or remote location
383
+ behind independent collapse and all/pinned/active/off controls. Pins use route-qualified
384
+ identities and deterministic ordering; the mobile header now remains fixed while its roster
385
+ scrolls naturally without hiding the last card under the create button.
386
+ - Fleet Settings separates location management from the whole-network overview. Managed-cell
387
+ power opens the shared launch editor, while delete/import and engine definitions remain in
388
+ Settings and preserve the selected Hydra route.
389
+ - A stopped managed session can restart inside its existing deck tile: only the terminal
390
+ generation is replaced, and transient WebSocket reconnects are bounded without reviving a
391
+ deliberately exited terminal.
392
+ - Public `status`, `stop`, and `restart` now reconcile service-managed and portable runtimes,
393
+ clean stale PID ownership safely, stop NexusCrew-managed SSH supervisors, and refuse a silent
394
+ HTTP-port move when paired peers depend on the configured endpoint.
395
+ - Tests: **726 total** (725 pass / 1 platform-dependent skip), frontend production build PASS,
396
+ dependency audit clean, isolated HOME clean, and package/public-tree verification required
397
+ before publication. Real Mac–Pixel–hub interoperability remains an external follow-up and is
398
+ not represented as an automated test.
399
+
400
+ ## 0.8.9 — 2026-07-12 — "Hydra Workspaces"
401
+
402
+ - Remote Fleet tiles now attach to their real `tmuxSession`, including an idempotent migration
403
+ for persisted 0.8.8 deck references. Automatic grid growth preserves visual row order,
404
+ widths, tile heights and zoom; deck switches and renames flush dirty state before moving.
405
+ - Named decks switch inside the current PWA by default; only `↗` detaches a browser window.
406
+ Fleet dialogs are viewport-owned with Escape, focus trapping/restoration and visible errors,
407
+ while long sidebar names stay within their cards without covering actions.
408
+ - Pairing link creation reuses the configured rendezvous without confusing its published
409
+ NexusCrew HTTP port with the SSH transport port. Peers exchange roles, so intermittent
410
+ inbound clients become neutral `passive` entries while real node/auth failures remain errors.
411
+ - Clipboard images and OS-dropped files upload directly to the receiving terminal session,
412
+ including federated routes, with progress and per-file errors. Saved paths are pasted without
413
+ Enter; normal text paste and private session-card drag/drop are unchanged.
414
+ - Settings → Fleet adds selective, schema-closed cell/system-prompt backup and restore with
415
+ engine mapping, overwrite confirmation, atomic writes, secret exclusion and explicit
416
+ `needsRestart` reporting for active cells.
417
+ - Global npm installs gain stable-only automatic updates with no downgrade, a per-home
418
+ interprocess lock, exact CLI/runtime verification, same-port restart, one exact-version
419
+ rollback and blocked retry after an unhealthy update. Errors and logs are bounded/redacted.
420
+ - Tests: **693 total** (692 pass / 1 platform-dependent skip), with production build and
421
+ package/audit verification performed before local installation.
422
+
423
+ ## 0.8.8 — 2026-07-12 — "Reliable Composer"
424
+
425
+ - The PWA composer now sends long and multiline drafts through xterm's explicit paste path,
426
+ preserving the terminal application's bracketed-paste mode. Enter travels as a separate
427
+ input only after the complete paste was accepted, so agent TUIs no longer absorb submission
428
+ into a non-bracketed paste burst.
429
+ - WebSocket input delivery is observable instead of silently dropping writes while reconnecting.
430
+ If the terminal is not ready or disconnects during paste, the composer keeps the full draft
431
+ and shows a localized retry message; successful sends continue to keep the mobile keyboard
432
+ focused.
433
+ - The README mobile Fleet image is now one metadata-free animated GIF built from the two current
434
+ phone captures, with a compact cursor-only second frame to avoid full-screen flicker.
435
+ - Tests: **664 total** (663 pass / 1 platform-dependent skip), production dependency audit
436
+ clean, plus a real xterm smoke proving an exact 3,000-character bracketed payload.
437
+
438
+ ## 0.8.7 — 2026-07-12 — "One-Link Pairing"
439
+
440
+ - Settings → Nodes and the first-run wizard now share one prominent **Connect with one link**
441
+ card. Deliberate paste, the clipboard button, QR scan and deep links use the same controller;
442
+ a complete v2 link connects automatically, while old or incomplete links reveal only the
443
+ routing details still required.
444
+ - The QR flow now opens a live rear-camera scanner with distinct permission, no-camera and
445
+ unsupported-browser errors plus a photo fallback. Its scan region covers the QR instead of
446
+ cropping a code that fills the phone preview, and every success, cancel or unmount releases
447
+ the camera immediately.
448
+ - Pairing reports structured validation, SSH start/readiness, invite exchange, final tunnel,
449
+ confirmation and health stages. Transport and protocol requests are bounded, ambiguous
450
+ one-time joins are never replayed, provisional state is rolled back, and success requires
451
+ authenticated federation health plus an identity match with the original link.
452
+ - Retry controls now follow the server's actual retryability, manual Enter applies embedded v2
453
+ fields before submission, and the wizard cannot be dismissed while a pairing request is in
454
+ flight.
455
+ - Tests: **660 total** (659 pass / 1 platform-dependent skip), production dependency audit
456
+ clean, plus a real Chrome camera smoke that reads a generated pairing QR, enters the shared
457
+ card and verifies MediaStream cleanup.
458
+
459
+ ## 0.8.6 — 2026-07-12 — "Connected Fleet"
460
+
461
+ - Cell power now opens one shared launch editor from Home, the sidebar and Settings. When a
462
+ cell is off, engine, model, permission policy and boot can be reviewed before every start;
463
+ choices are remembered per cell and per engine. Provider and credential definitions remain
464
+ in Settings → Fleet, while Pi is always constrained to Standard permissions.
465
+ - Settings → Fleet now inventories managed and unmanaged tmux sessions across Local and every
466
+ reachable Hydra route. A live unmanaged session can be explicitly adopted as a managed cell;
467
+ legacy `cloud-X` sessions become cell `X`, and the operator must choose an already declared
468
+ engine so no provider or model is inferred.
469
+ - Pairing links now support a strict v2 payload containing the display label, route slug,
470
+ OpenSSH target or Host alias, and optional SSH port. Paste, QR scan and first-run deep links
471
+ pre-fill the same form before **Test and connect**; v1 links remain compatible. No SSH key,
472
+ API key or PWA token is added to the link.
473
+ - Fleet inventory actions now follow the selected Hydra route and its real capabilities,
474
+ including READONLY. Power, restart, import and removal are shown only where the remote
475
+ provider actually permits them.
476
+ - External Fleet discovery is portable across Linux, macOS and Termux: configured paths,
477
+ `$PREFIX/bin/fleet` and `~/.local/bin/fleet` use the same runtime and boot-owner resolver.
478
+ Explicit external pins fail closed instead of falling through to another executable.
479
+ - Claude-compatible managed launches set matching context and auto-compaction windows,
480
+ including one-million-token profiles where declared. Permission overrides cannot bypass
481
+ Pi's Standard-only policy.
482
+ - Tests: **636 total** (635 pass / 1 platform-dependent skip), plus a clean production build
483
+ and zero production dependency vulnerabilities.
484
+
485
+ ## 0.8.5 — 2026-07-12 — "Clean Fleet"
486
+
487
+ - The primary `+` now creates a managed Fleet cell on Local or a selected reachable Hydra
488
+ node. Cell IDs accept uppercase characters, and every configured node remains visible in
489
+ the Fleet inventory while unreachable destinations are clearly disabled for creation.
490
+ - Managed cell cards expose direct power and Settings buttons. Start, stop, restart and edit
491
+ are explicit in Settings → Fleet; deletion is confined to that settings surface, removing
492
+ the ambiguous three-dot/delete-only lifecycle.
493
+ - The power sheet is lifecycle-only and responsive: it no longer mixes engine/provider/model
494
+ selection into start/stop, and boot changes are persisted without resetting an existing
495
+ boot choice on quick start.
496
+ - Fresh fleets provide four clean CLI adapters: Claude Code, Codex, Codex-VL and Pi. Provider
497
+ choices are scoped to the selected CLI, with documented native/cloud/local options and a
498
+ renameable custom fallback. Legacy Z.AI A/P credential profiles remain runtime-compatible
499
+ but are absent from the new-provider catalog.
500
+ - Claude enterprise providers launch through their dedicated Bedrock, Vertex or Foundry
501
+ environment selectors; Codex OpenAI API uses `OPENAI_API_KEY`; Pi can use its own configured
502
+ default without NexusCrew forcing a provider or model.
503
+ - Node pairing now focuses and explains missing fields and makes explicit that the loopback
504
+ address in a pairing link is intentional and transported through the user's SSH Host.
505
+ - Tests: **602 total** (601 pass / 1 platform-dependent skip), plus a clean production build
506
+ and zero production dependency vulnerabilities.
507
+
508
+ ## 0.8.4 — 2026-07-12 — "Hydra Everywhere"
509
+
510
+ - The fleet roster is global rather than active-only: local, direct and transitive sessions
511
+ remain visible with route/location labels, stable slugs and offline last-seen state.
512
+ - Session creation and Fleet engine/cell management can target Local or any reachable Hydra
513
+ route. Remote lifecycle controls use route-qualified identity and inbound peer health is
514
+ verified instead of trusting a running tunnel process alone.
515
+ - Node cards restore explicit tunnel power controls and expose label rename independently of
516
+ the stable route slug; pairing and capabilities remain relay-policy scoped.
517
+ - macOS terminal copying now supports Shift-drag / Shift-Control-drag local selection and
518
+ mobile terminals support long-press then drag selection without sending mouse events to tmux.
519
+ - The composer send button writes text plus a real carriage return and preserves textarea
520
+ focus, keeping the mobile software keyboard open between messages.
521
+ - Linux x64/ARM64, macOS x64/ARM64 and Termux Android ARM64 now resolve scriptless platform
522
+ PTY prebuilds only. Global installs no longer require native install-script approval.
523
+
524
+ ## 0.8.3 — 2026-07-12 — "Simple and Clean"
525
+
526
+ - `nexuscrew` starts or reuses the loopback server in the background, prints a compact
527
+ status/guide, and exits. Only the first run opens the PWA wizard. `nexuscrew show` opens
528
+ the PWA, while `nexuscrew show token` prints the clickable authenticated fragment URL.
529
+ - Startup persistence is explicit: `nexuscrew boot` installs/enables the native user service
530
+ on Linux/macOS or the Termux:Boot script; `boot off|status` controls and reports it. A normal
531
+ first run no longer silently opts the host into boot persistence.
532
+ - The Hydra roster retains transitive peers as offline entries with last-seen information
533
+ while a relay is unavailable, then reconciles them when the relay returns or is removed.
534
+ - Node tunnel power is restored as a direct action in both mobile and desktop lists. Session
535
+ menus remain session-only, avoiding ambiguity between killing a session and controlling its link.
536
+ - Settings → Fleet now selects Local or any reachable Hydra route for engine and cell
537
+ management. Federated Fleet requests use the scoped, hop-bounded allowlist and honor READONLY.
538
+ - Managed engines expose an explicit permission policy. New Claude engines, including Z.AI,
539
+ default to `--dangerously-skip-permissions` with a Standard opt-out; Codex and Codex-VL
540
+ default to Standard with an opt-in for `--dangerously-bypass-approvals-and-sandbox`.
541
+ - The Nodes UI describes pairing as connecting an existing NexusCrew installation: every
542
+ installation remains local and peer-capable, with no artificial client/server role.
543
+ - Tests: **538 total** (537 pass / 1 platform-dependent skip), including first-run PWA,
544
+ multi-hop Fleet routing, stale roster reconciliation, boot opt-in and contaminated env runs.
545
+
546
+ ## 0.8.2 — 2026-07-11 — "Simple Federated Hydra"
547
+
548
+ - Replaces client/node roles in first-run UX with one local node plus a single **Nodes**
549
+ surface for reciprocal PWA pairing.
550
+ - One-time ten-minute link/QR pairing creates scoped per-peer credentials; the main PWA
551
+ token is never exchanged. Invites and peer state remain local 0600 stores.
552
+ - Uses an existing OpenSSH Host alias without creating keys or editing `authorized_keys`;
553
+ auto-selects autossh or supervised SSH and restores outbound links at boot.
554
+ - Adds bounded four-hop topology discovery and a separate capability-allowlisted federation
555
+ ingress for HTTP and WebSocket routing. Relay visibility is enforced symmetrically.
556
+ - Session list, creation, terminal, files and termination are location-aware across Local and
557
+ federated routes. Fleet remains local to its node.
558
+ - Reads legacy nodes schema v1 while writing the extended v2 peer schema; legacy rendezvous
559
+ runtime behavior remains available during migration.
560
+ - Tests: **528 total** (527 pass / 1 platform-dependent skip).
561
+
562
+ ## 0.8.0 — 2026-07-11 — "Many Nodes, Many Monitors"
563
+
564
+ The multi-node + multi-monitor release: one UI for the tmux fleets of several hosts,
565
+ named multi-window decks, a real CLI, an MCP operator bridge, and a first-run wizard.
566
+
567
+ - feat(mcp): **MCP bridge** — `nexuscrew mcp` runs a minimal stdio MCP server (hand-rolled
568
+ JSON-RPC 2.0, newline-delimited, no SDK deps) that brings NexusCrew inside AI sessions as
569
+ the cell→human channel: `nc_notify` (UI toast + web push), `nc_ask` (question with deferred
570
+ answer pasted back into the caller's tmux session as `[human reply · ask#<id>] …`
571
+ by default (`NEXUSCREW_REPLY_LABEL` configures the neutral operator label),
572
+ `nc_send_file` (copy into the session outbox with badge + notification), `nc_status` and
573
+ `nc_inbox` (read-only). Caller identity from `$TMUX` (`display-message #S`) with
574
+ `NEXUSCREW_MCP_SESSION` fallback; fail-closed on malformed input (garbage never crashes,
575
+ JSON-RPC errors instead).
576
+ - feat(server): notification plumbing — `POST /api/notify` (rate limit global per token +
577
+ per session, capped LRU buckets), SSE `GET /api/events` for live UI frames, web push
578
+ (`web-push` dep, lazy VAPID keys in `~/.nexuscrew/vapid.json` 0600, https-only endpoints
579
+ with private-host rejection and a subscription cap, subscriptions in `push.json` 0600
580
+ with dead-endpoint cleanup), asks store persisted in `asks.json` 0600 (hard cap on open
581
+ asks, rate-limited creation). Answer route is READONLY-gated (paste is a PTY write),
582
+ claims the ask atomically (concurrent answers cannot double-paste) and only commits
583
+ after a successful paste. READONLY is a floor: ask creation and outbox delivery are 403,
584
+ VAPID keys are never generated in READONLY, and secret stores (`vapid/push/asks.json`)
585
+ with unsafe mode/owner or symlinked are refused fail-closed.
586
+ - feat(ui): notification toasts + open-asks panel with reply box/option buttons and counter
587
+ badge (all views, i18n it/en/es); push enable/disable in Settings → System; service worker
588
+ handles `push` and `notificationclick` (deep-link `/#ask=<id>`).
589
+
590
+ - feat(cli): **unified CLI** — `nexuscrew` alone smart-ups (zero-question init → start →
591
+ URL + QR); new subcommands `up|down`, `url [--qr]`, `token rotate`, `logs [-f]`,
592
+ `doctor`, `update`, and an extended `status [--json]` with roles and per-node tunnel
593
+ state. The server startup log no longer prints the token.
594
+ - feat(nodes): **multi-node foundation** — `~/.nexuscrew/nodes.json` secret store (0600,
595
+ atomic writes, strict schema) and an SSH tunnel manager with dedicated restricted keys,
596
+ explicit loopback binds, `ExitOnForwardFailure`, and retry with backoff. CLI commands
597
+ cover node registration, tests, tunnel lifecycle, token setup, and reachable-node mode.
598
+ - feat(proxy): **single-origin multi-node** — the hub reverse-proxies `/node/<name>/…`
599
+ over HTTP and WebSocket. Local auth happens before node resolution; remote tokens stay
600
+ server-side; client credentials and hop-by-hop headers are stripped; READONLY blocks
601
+ mutations and remote PTY attach.
602
+ - feat(deck): **multi-window decks** — named workspaces at `/deck/<name>`, with one
603
+ remembered tile layout per browser and deck. Deck tiles attach with `ignore-size`; the
604
+ focused tile becomes size owner so browser windows do not fight real terminals.
605
+ - feat(ui): **remote nodes, settings, and first-run wizard** — per-node groups and remote
606
+ attach in the sidebar, grid, and decks; a three-tab settings panel for roles, nodes, and
607
+ system actions; and a skippable three-step setup wizard. Mutations use a closed-list,
608
+ READONLY-gated API with strict validation and token-redacted responses.
609
+ - security: proxy upgrade failures return a controlled 502; WebSocket upgrades
610
+ pre-authenticate through the injected header; local query tokens are stripped before
611
+ forwarding; token rotation invalidates live sessions after restart.
612
+ - i18n: all new surfaces in English, Italian, and Spanish.
613
+ - tests: suite grows from 262 to **495 tests** (494 pass / 1 skip).
614
+
615
+ ## 0.7.7
616
+
617
+ - feat(composer): **attachment button** to the left of the input — a File / Camera / Gallery
618
+ menu for quick file send. The picked file lands in the session inbox and its path is
619
+ appended to the composer text (you send it explicitly, so you can add a message). The
620
+ camera uses the native capture hint on mobile and falls back to a picker on desktop.
621
+ - feat(fleet): **built-in fleet** — engine/cell definitions in `~/.nexuscrew/fleet.json`
622
+ (editable, schema-validated), provider selection `external | builtin | disabled` chosen
623
+ once at startup, and a single boot companion service installed by `nexuscrew init` (only
624
+ when the built-in provider is active, with a migration gate that refuses a silent double
625
+ boot). Launch path is argv-direct (no shell), with a hard command/env/cwd trust boundary.
626
+ - feat(fleet): fleet HTTP API hardening — `READONLY` blocks every mutation at the route
627
+ level (external providers included), capability negotiation returns `501` for unsupported
628
+ methods, `status` exposes `provider`/`bootOwner`/`capabilities`, a `restart` capability,
629
+ and secrets (env values, prompts) are redacted from error output.
630
+
631
+ ## 0.7.2
632
+
633
+ - fix(grid): fleet cell cards in the desktop sidebar are now clickable (add tile) and
634
+ draggable into the grid when their tmux session is alive — they only exposed the
635
+ power button before, so on fleet-only hosts nothing could be dragged. Verified
636
+ end-to-end in a real browser (click → live tile, drag → new column).
637
+
638
+ ## 0.7.6
639
+
640
+ - docs: README "License" section said MIT — corrected to Apache-2.0 (badge and LICENSE
641
+ file were already correct since 0.7.1). No code changes.
642
+
643
+ ## 0.7.5
644
+
645
+ - feat(grid): **open tiles are movable** — drag a tile by its header and drop it anywhere
646
+ (same directional zones as sidebar drags: side-by-side, stack, new column).
647
+
648
+ ## 0.7.4
649
+
650
+ - fix(desktop): **black screen** on desktop in 0.7.3 — the stale-bundle banner was declared
651
+ inside the mobile branch but referenced by the desktop tree (TDZ ReferenceError).
652
+ Hoisted before both branches; the banner now also covers the mobile single view.
653
+ - fix(keybar): 8+8 keys — ↑ aligned exactly above ↓ (added ⌨ composer toggle in row 2,
654
+ matching the reference layout).
655
+
656
+ ## 0.7.3 — "Window Management"
657
+
658
+ - feat(grid): directional drop zones (VS Code-style) — hover quadrant decides: left/right
659
+ edges place side-by-side, top/bottom stack, with live preview overlay. Balanced click
660
+ placement (grid-like growth, no endless narrow columns).
661
+ - feat(size): sessions follow the focus — `window-size latest`, web clients participate:
662
+ going back to a bigger client and typing restores its size (real-tmux gated).
663
+ - feat(ui): collapsible + resizable sidebar (mini 48px with instant tooltips), pin sessions
664
+ and cells to top (persisted) + activity-based auto-sort, Termux-style two-row KeyBar
665
+ (ESC ☰ / — HOME ↑ END PGUP | ⇥ CTRL ALT ← ↓ → PGDN) with sticky ALT.
666
+ - fix(grid): xterm refits when its tile is resized (ResizeObserver) — adding tiles or
667
+ dragging dividers adapts live terminals; resize listeners cleaned on cancel/blur/unmount;
668
+ aborted drags clear the preview; tile cap enforced fail-safe.
669
+ - fix(mobile): high-visibility round action buttons (power/pin), SVG power icon
670
+ (U+23FB was tofu on Android), stale-bundle update banner (tap to reload).
671
+ - Two security review passes on the cycle (all findings addressed); 155-test suite.
672
+
673
+ ## 0.7.1
674
+
675
+ - License corrected to **Apache-2.0** (0.7.0 was published with MIT metadata by mistake;
676
+ 0.7.0 is deprecated on npm). Added NOTICE. No code changes.
677
+
678
+ ## 0.7.0 — "Fleet Deck"
679
+
680
+ - feat(grid): desktop multi-session grid — drag from the sidebar,
681
+ tiling a colonne con auto-reflow, divisori trascinabili, focus singolo, composer
682
+ per-tile a scomparsa, layout persistito (`nc_grid_v1`). Tile con `takeSize:false`
683
+ (mai resize delle sessioni vive). Zero dipendenze nuove.
684
+ - feat(fleet): logica flotta nella UI — sidebar/home unificate: celle fleet anche da
685
+ spente (⏻ up/down, engine picker, key A/P, boot persist, stato degraded) + sessioni
686
+ tmux generiche. Server: `lib/fleet/` shell serializzato sul binario `fleet`
687
+ (feature-detected con trust check: no symlink, no world-writable, schema
688
+ `kind:"ai-fleet"` obbligatorio) + `GET/POST /api/fleet/*` dietro Bearer.
689
+ - feat(sessions): lifecycle dalla UI — `POST /api/sessions` (preset allowlistati,
690
+ cwd realpath sotto home) e `DELETE /api/sessions/:name` (409 SEMPRE su `cloud-*`,
691
+ anche con fleet assente). Card ricche: activity, comando corrente, preview ultima
692
+ riga (cap 240, strip ANSI, cache 3s, best-effort).
693
+ - feat(ui): mobile restyle — home grouped by Fleet/Other sessions,
694
+ card con preview e tempo relativo, FAB nuova sessione, vista singola rifinita.
695
+ - feat(i18n): UI multilingua IT/EN/ES, picker persistito, zero deps.
696
+ - Optional fleet integration contract: `fleet status --json` (schemaVersion 1); the host
697
+ binary is trust-checked and schema-validated, feature-detected (absent → hidden UI).
698
+ - Suite: 150 tests (149 pass + 1 skip); two independent security review passes on design
699
+ and implementation (all findings addressed).
700
+
701
+ ## 0.4.3
702
+
703
+ - fix(mobile): adapt the layout to the soft keyboard. The app now uses `100dvh` and
704
+ `interactive-widget=resizes-content`, so when the keyboard opens the view shrinks and the
705
+ KeyBar stays visible above it (previously the bottom KeyBar was pushed behind the keyboard
706
+ and looked missing). The terminal also refits on `visualViewport` changes.
707
+
708
+ ## 0.4.2
709
+
710
+ - fix(attach): smart resize default. When no other client is attached to the session, the
711
+ browser now drives the size (so a small phone gets a usable, non-clipped view and clean line
712
+ editing instead of a session frozen at a larger width). When a real terminal is already
713
+ attached, it still defaults to `ignore-size` to avoid shrinking that terminal's window.
714
+ - feat(keybar): add the keys mobile keyboards lack — `tab`, always-available arrows (← ↑ ↓ →),
715
+ and a sticky `ctrl` modifier that folds the next typed character into its control code.
716
+
717
+ ## 0.4.1
718
+
719
+ - fix(install): make `node-pty` an optional dependency. On Termux/Android it has no prebuild
720
+ and `node-gyp rebuild` fails (`Undefined variable android_ndk_path`), which previously aborted
721
+ the whole global install and left the `nexuscrew` bin unlinked. As optional, its build failure
722
+ is non-fatal: the install completes and the runtime falls back to the platform PTY provider
723
+ (`@mmmbuto/node-pty-android-arm64` on Termux, `@lydell/node-pty-linux-x64` on Linux x64).
724
+
725
+ ## 0.4.0 — "pty-core"
726
+
727
+ Core rewrite from screenshot-and-poll to a faithful tmux client.
728
+
729
+ - replaced screenshotting with a **real PTY**: each attach runs `tmux attach` and bridges its
730
+ bytes to xterm.js over a WebSocket — full color, copy-mode scroll, special keys, panes, windows
731
+ - **stateless**: tmux is the persistence; no database, no accounts
732
+ - **localhost-only**: binds `127.0.0.1` and refuses any non-loopback bind
733
+ - non-destructive default: attaches with `-f ignore-size` so a small client never resizes a
734
+ session a real terminal is holding (`takeSize` to opt in)
735
+ - window/pane navigation moved to **server-side, allowlisted tmux commands** instead of fragile
736
+ client-side prefix keys
737
+ - WebSocket hardening: close on protocol violation, no second attach, clamped geometry,
738
+ backpressure cutoff, JSON errors with codes
739
+ - token delivered via URL fragment (never logged), 0600 file, constant-time compare
740
+
741
+ ## 0.2.4
742
+
743
+ - added host-scoped tmux/session discovery so active session truth comes from the selected host
744
+ - bucketed launcher discovery into runnable, detected-only, and internal/plumbing entries
745
+ - improved send/interrupt flow with explicit host context and remote pane polling fallback
746
+ - added regression tests for host-scoped routes and launcher classification
747
+
748
+ ## 0.2.3
749
+
750
+ - fixed npm CLI `bin` metadata so the published package exposes `nexuscrew` correctly
751
+ - kept the corrected stable line on the main npm dist-tags
752
+
753
+ ## 0.2.2
754
+
755
+ - moved runtime to standalone tmux sessions instead of an implicit master tmux session
756
+ - made active tmux sessions the only valid chat targets
757
+ - added explicit tmux creation from detected launchers
758
+ - switched launcher discovery to runtime/shell-driven detection
759
+ - gated shell-file-only detections so they are not treated as runnable automatically
760
+ - aligned workspace defaults to the runtime user home
761
+
762
+ ## 0.2.1
763
+
764
+ - older release line, now deprecated in favor of the current stable line