@mmmbuto/nexuscrew 0.8.52 → 0.8.54
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 +140 -0
- package/frontend/dist/assets/{index-Cxwpa2Y_.js → index-E5p49uPq.js} +29 -29
- package/frontend/dist/index.html +1 -1
- package/frontend/dist/version.json +1 -1
- package/lib/cli/commands.js +256 -3
- package/lib/mcp/server.js +35 -1
- package/lib/mcp/tools.js +1 -1
- package/lib/proxy/federation.js +29 -2
- package/lib/tmux/actions.js +33 -1
- package/lib/update/runner.js +27 -0
- package/package.json +1 -1
- package/skills/nexuscrew-agent/SKILL.md +19 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,146 @@ All notable changes to NexusCrew are tracked here.
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 0.8.54 — 2026-08-07 — "Why the Tunnel Was Left Behind"
|
|
8
|
+
|
|
9
|
+
- **An automatic update no longer leaves the reverse channel behind.** 0.8.53
|
|
10
|
+
said the reason a node stayed down after a restart was not established. It is
|
|
11
|
+
now, and it was not the platform: a manual restart has always stopped the
|
|
12
|
+
tunnel supervisors first, and the automatic update — on the runtime where no
|
|
13
|
+
service manager owns the process — did not. The new service then found a
|
|
14
|
+
supervisor still alive that it could not attribute to itself, so it neither
|
|
15
|
+
stopped it nor started its own, and the reverse channel stayed attached to an
|
|
16
|
+
orphan nobody reconciled. The peer read as down until someone intervened by
|
|
17
|
+
hand. What isolated it was a count, not a theory: on one device, restarts run
|
|
18
|
+
by hand left the peer up twice out of twice, and restarts run by the updater
|
|
19
|
+
left it down twice out of twice. The difference between those two paths was
|
|
20
|
+
this one step.
|
|
21
|
+
|
|
22
|
+
Failing to stop the tunnels does not block the update — that is the main job —
|
|
23
|
+
but it is now reported rather than swallowed, because a silent failure here is
|
|
24
|
+
what made this take a day to find.
|
|
25
|
+
|
|
26
|
+
- **The tool bridge documents all of its tools.** The skill shipped alongside
|
|
27
|
+
NexusCrew described twelve of the twenty tools the bridge exposes; the audio
|
|
28
|
+
surface, the caller-identity probe and the per-cell start diagnostics were
|
|
29
|
+
missing entirely. An agent that cannot read what a tool does uses it by
|
|
30
|
+
guessing. It now covers all of them, along with the mistakes that have
|
|
31
|
+
actually been paid for: a receipt means the text was pasted and submitted, not
|
|
32
|
+
that anything was accepted; a terminal that queues an incoming message while
|
|
33
|
+
it works is healthy, and telling that apart from a stuck one means reading CPU
|
|
34
|
+
time from the right process; a node does not listen on the port you happen to
|
|
35
|
+
know, since each installation picks a free one; and answering a remote caller
|
|
36
|
+
by writing into your own inbox reaches nobody, because that directory is
|
|
37
|
+
per-installation.
|
|
38
|
+
|
|
39
|
+
- **The published package is checked by a test, not by a checklist.** The sweep
|
|
40
|
+
before publishing was done by hand, from a list rebuilt from memory each time.
|
|
41
|
+
On 2026-08-07 that list covered paths, hostnames and AI attribution but not
|
|
42
|
+
the names of internal working sessions, and 0.8.53 shipped a comment naming
|
|
43
|
+
one. Nothing secret — and nothing that can be taken back, since a version is
|
|
44
|
+
never republished. The check now runs with the rest of the suite, reads the
|
|
45
|
+
published directories from the package manifest rather than repeating them,
|
|
46
|
+
and states a reason for every pattern so that no entry can be quietly dropped
|
|
47
|
+
to make the suite pass. A second test proves the patterns still bite, so an
|
|
48
|
+
emptied list fails instead of turning green.
|
|
49
|
+
|
|
50
|
+
## 0.8.53 — 2026-08-07 — "Coming Back Up, and Saying So"
|
|
51
|
+
|
|
52
|
+
Automatic updates are on by default and check every six hours, so a node
|
|
53
|
+
installs a new release and restarts itself without anyone watching. That makes
|
|
54
|
+
the restart path the most consequential code in the product, and this release
|
|
55
|
+
is about what happens when it doesn't work: today a node was measured staying
|
|
56
|
+
down for over twenty minutes after a restart, with its tunnel still up, while
|
|
57
|
+
nothing anywhere said so.
|
|
58
|
+
|
|
59
|
+
- **A restart now confirms the service came back.** `nexuscrew restart` used to
|
|
60
|
+
report success as soon as the restart *command* returned — which says the
|
|
61
|
+
command ran, not that anything is answering. The two look identical to whoever
|
|
62
|
+
reads the exit code. The check already existed and was already used by two
|
|
63
|
+
other paths: the auto-updater waits for health and fails if it doesn't come,
|
|
64
|
+
and the Fleet bootstrap does the same, with a comment that literally says "a
|
|
65
|
+
verified restart is needed". It was missing precisely on the command a person
|
|
66
|
+
types by hand — the one where no other code is checking on your behalf.
|
|
67
|
+
|
|
68
|
+
- **A service that exited after a restart is brought back, once.** On a phone
|
|
69
|
+
there is no service manager to raise the process again: if it goes, it stays
|
|
70
|
+
gone. That was measured — a node stayed down for over twenty minutes after a
|
|
71
|
+
restart, with its reverse tunnel still up, and nothing brought it back. Now,
|
|
72
|
+
when the service does not answer, the port decides what happens: free means
|
|
73
|
+
the process is gone and it is started again *once*; still busy means something
|
|
74
|
+
is holding it without serving, and retrying would only hide that. Once and no
|
|
75
|
+
more — repeating turns a fault into a loop. On a machine where a service
|
|
76
|
+
manager owns the runtime nothing is started alongside it: that is the
|
|
77
|
+
manager's job, and a process it does not know about would race its own unit
|
|
78
|
+
for the port and outlive a stop.
|
|
79
|
+
|
|
80
|
+
**Why the process exited is not established.** A plausible story — that the
|
|
81
|
+
restart did not wait for the old process before starting the new one — turned
|
|
82
|
+
out to be wrong on inspection: it does wait, and has since 0.8.17. So this is
|
|
83
|
+
a recovery for a failure whose cause is still open, not a fix for a known one,
|
|
84
|
+
and it is worth knowing which of the two you are relying on.
|
|
85
|
+
|
|
86
|
+
- **"Peer unreachable" no longer covers two different failures.** With a reverse
|
|
87
|
+
SSH channel, a device that is not connected leaves no listener and the
|
|
88
|
+
connection is *refused*; a device that is connected but whose NexusCrew has
|
|
89
|
+
died accepts the connection and then *resets* it. Those need opposite
|
|
90
|
+
remedies — one is fixed on the network, the other by going to the device —
|
|
91
|
+
and one message sent the investigation to the wrong place half the time. It
|
|
92
|
+
did: four hours were spent in federation and pairing while the defect was a
|
|
93
|
+
service that had not come back on a phone. The two are now named, with the
|
|
94
|
+
port, and an error nobody recognises is still reported as before rather than
|
|
95
|
+
guessed into a layer.
|
|
96
|
+
|
|
97
|
+
- **The interface reloads itself after the node updates.** With automatic
|
|
98
|
+
updates on, a node updates and restarts while an open app keeps running the
|
|
99
|
+
old bundle. The only way out was closing and reopening it — the banner had to
|
|
100
|
+
be tapped, and because of a service-worker defect fixed in 0.8.52, tapping it
|
|
101
|
+
did not work either. The app now applies the new bundle by itself. Only for
|
|
102
|
+
the case a reload can fix: when the package on the server is newer than the
|
|
103
|
+
interface it serves, no amount of reloading changes that, and it is left
|
|
104
|
+
alone. If the mismatch survives the reload it is not retried — a reload loop
|
|
105
|
+
makes the app unusable, which is far worse than a banner, so the banner
|
|
106
|
+
remains as the fallback. What you were typing is not lost: the composer draft
|
|
107
|
+
was already kept across reloads, which is what made this acceptable. The
|
|
108
|
+
version check now also repeats about once a minute rather than running only
|
|
109
|
+
when the app starts — an app left open in front of someone is precisely the
|
|
110
|
+
case this exists for, and checking only at startup would have made it work
|
|
111
|
+
solely for people who had already closed and reopened it.
|
|
112
|
+
|
|
113
|
+
- **`nexuscrew autoupdate on|off|status`.** The switch already existed — a
|
|
114
|
+
persisted setting, on by default, with a checkbox in Settings. It was missing
|
|
115
|
+
from the command line, which is where you need it: when a node has updated
|
|
116
|
+
itself and the service did not come back, the interface is the thing you
|
|
117
|
+
cannot open. With the service running the command goes through the API rather
|
|
118
|
+
than writing the file, because writing the file would leave the running
|
|
119
|
+
process with the old value — the setting would read "off" while updates kept
|
|
120
|
+
happening on schedule, and a switch that reads off without switching anything
|
|
121
|
+
off is worse than no switch. If the service is up but not answering, nothing
|
|
122
|
+
is written at all.
|
|
123
|
+
|
|
124
|
+
- **An error now says when the tool bridge is older than the hub.** Updating
|
|
125
|
+
NexusCrew does not update the MCP bridge of an already running session: that
|
|
126
|
+
process started with the previous code and keeps it until the session is
|
|
127
|
+
restarted. The symptom is cruel — you install a fix, try again, and get the
|
|
128
|
+
*old* error, so you conclude the fix does not work and go looking where the
|
|
129
|
+
defect is not. The check runs only on the error path, which costs nothing in
|
|
130
|
+
normal use and is the only moment it helps; it cannot be cached at startup
|
|
131
|
+
either, since the version that changes is the hub's, and it changes while the
|
|
132
|
+
bridge is running.
|
|
133
|
+
|
|
134
|
+
- **A long message sent to a cell is no longer pasted and left unsent.** The
|
|
135
|
+
wait between the bracketed paste and the Enter was a constant, while the time
|
|
136
|
+
a terminal interface needs to swallow a paste grows with its size — above a
|
|
137
|
+
certain length the client collapses it, the Enter lands while it is still
|
|
138
|
+
being processed, and it is swallowed. The message then sat in the composer
|
|
139
|
+
while the sender got a delivery receipt. Measured on the same target eleven
|
|
140
|
+
minutes apart: 2900 characters were never processed for nine hours, sixty
|
|
141
|
+
characters were being worked on in twelve seconds. The wait now grows with the
|
|
142
|
+
text, and below 500 characters nothing changes — those were already reliable,
|
|
143
|
+
and slowing them would be a cost paid by everyone for a defect that is not
|
|
144
|
+
theirs. This narrows the window rather than closing it: a receipt still means
|
|
145
|
+
paste and Enter, not acceptance.
|
|
146
|
+
|
|
7
147
|
## 0.8.52 — 2026-08-07 — "What a Peer May See, and What a Cell May Reach"
|
|
8
148
|
|
|
9
149
|
- **Each node now has a cryptographic identity, and it changes nothing yet.**
|