@mmmbuto/nexuscrew 0.8.52 → 0.8.53

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
@@ -4,6 +4,103 @@ All notable changes to NexusCrew are tracked here.
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## 0.8.53 — 2026-08-07 — "Coming Back Up, and Saying So"
8
+
9
+ Automatic updates are on by default and check every six hours, so a node
10
+ installs a new release and restarts itself without anyone watching. That makes
11
+ the restart path the most consequential code in the product, and this release
12
+ is about what happens when it doesn't work: today a node was measured staying
13
+ down for over twenty minutes after a restart, with its tunnel still up, while
14
+ nothing anywhere said so.
15
+
16
+ - **A restart now confirms the service came back.** `nexuscrew restart` used to
17
+ report success as soon as the restart *command* returned — which says the
18
+ command ran, not that anything is answering. The two look identical to whoever
19
+ reads the exit code. The check already existed and was already used by two
20
+ other paths: the auto-updater waits for health and fails if it doesn't come,
21
+ and the Fleet bootstrap does the same, with a comment that literally says "a
22
+ verified restart is needed". It was missing precisely on the command a person
23
+ types by hand — the one where no other code is checking on your behalf.
24
+
25
+ - **A service that exited after a restart is brought back, once.** On a phone
26
+ there is no service manager to raise the process again: if it goes, it stays
27
+ gone. That was measured — a node stayed down for over twenty minutes after a
28
+ restart, with its reverse tunnel still up, and nothing brought it back. Now,
29
+ when the service does not answer, the port decides what happens: free means
30
+ the process is gone and it is started again *once*; still busy means something
31
+ is holding it without serving, and retrying would only hide that. Once and no
32
+ more — repeating turns a fault into a loop. On a machine where a service
33
+ manager owns the runtime nothing is started alongside it: that is the
34
+ manager's job, and a process it does not know about would race its own unit
35
+ for the port and outlive a stop.
36
+
37
+ **Why the process exited is not established.** A plausible story — that the
38
+ restart did not wait for the old process before starting the new one — turned
39
+ out to be wrong on inspection: it does wait, and has since 0.8.17. So this is
40
+ a recovery for a failure whose cause is still open, not a fix for a known one,
41
+ and it is worth knowing which of the two you are relying on.
42
+
43
+ - **"Peer unreachable" no longer covers two different failures.** With a reverse
44
+ SSH channel, a device that is not connected leaves no listener and the
45
+ connection is *refused*; a device that is connected but whose NexusCrew has
46
+ died accepts the connection and then *resets* it. Those need opposite
47
+ remedies — one is fixed on the network, the other by going to the device —
48
+ and one message sent the investigation to the wrong place half the time. It
49
+ did: four hours were spent in federation and pairing while the defect was a
50
+ service that had not come back on a phone. The two are now named, with the
51
+ port, and an error nobody recognises is still reported as before rather than
52
+ guessed into a layer.
53
+
54
+ - **The interface reloads itself after the node updates.** With automatic
55
+ updates on, a node updates and restarts while an open app keeps running the
56
+ old bundle. The only way out was closing and reopening it — the banner had to
57
+ be tapped, and because of a service-worker defect fixed in 0.8.52, tapping it
58
+ did not work either. The app now applies the new bundle by itself. Only for
59
+ the case a reload can fix: when the package on the server is newer than the
60
+ interface it serves, no amount of reloading changes that, and it is left
61
+ alone. If the mismatch survives the reload it is not retried — a reload loop
62
+ makes the app unusable, which is far worse than a banner, so the banner
63
+ remains as the fallback. What you were typing is not lost: the composer draft
64
+ was already kept across reloads, which is what made this acceptable. The
65
+ version check now also repeats about once a minute rather than running only
66
+ when the app starts — an app left open in front of someone is precisely the
67
+ case this exists for, and checking only at startup would have made it work
68
+ solely for people who had already closed and reopened it.
69
+
70
+ - **`nexuscrew autoupdate on|off|status`.** The switch already existed — a
71
+ persisted setting, on by default, with a checkbox in Settings. It was missing
72
+ from the command line, which is where you need it: when a node has updated
73
+ itself and the service did not come back, the interface is the thing you
74
+ cannot open. With the service running the command goes through the API rather
75
+ than writing the file, because writing the file would leave the running
76
+ process with the old value — the setting would read "off" while updates kept
77
+ happening on schedule, and a switch that reads off without switching anything
78
+ off is worse than no switch. If the service is up but not answering, nothing
79
+ is written at all.
80
+
81
+ - **An error now says when the tool bridge is older than the hub.** Updating
82
+ NexusCrew does not update the MCP bridge of an already running session: that
83
+ process started with the previous code and keeps it until the session is
84
+ restarted. The symptom is cruel — you install a fix, try again, and get the
85
+ *old* error, so you conclude the fix does not work and go looking where the
86
+ defect is not. The check runs only on the error path, which costs nothing in
87
+ normal use and is the only moment it helps; it cannot be cached at startup
88
+ either, since the version that changes is the hub's, and it changes while the
89
+ bridge is running.
90
+
91
+ - **A long message sent to a cell is no longer pasted and left unsent.** The
92
+ wait between the bracketed paste and the Enter was a constant, while the time
93
+ a terminal interface needs to swallow a paste grows with its size — above a
94
+ certain length the client collapses it, the Enter lands while it is still
95
+ being processed, and it is swallowed. The message then sat in the composer
96
+ while the sender got a delivery receipt. Measured on the same target eleven
97
+ minutes apart: 2900 characters were never processed for nine hours, sixty
98
+ characters were being worked on in twelve seconds. The wait now grows with the
99
+ text, and below 500 characters nothing changes — those were already reliable,
100
+ and slowing them would be a cost paid by everyone for a defect that is not
101
+ theirs. This narrows the window rather than closing it: a receipt still means
102
+ paste and Enter, not acceptance.
103
+
7
104
  ## 0.8.52 — 2026-08-07 — "What a Peer May See, and What a Cell May Reach"
8
105
 
9
106
  - **Each node now has a cryptographic identity, and it changes nothing yet.**