@mmmbuto/nexuscrew 0.9.28 → 0.9.30
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 +16 -0
- package/docs/LIVE_PROMPT.md +1 -1
- package/docs/NOTIFICATIONS.md +37 -0
- package/docs/OPERATIONS.md +20 -0
- package/frontend/dist/assets/index-BbcjoZS0.js +167 -0
- package/frontend/dist/assets/index-DqCfZFGi.css +32 -0
- package/frontend/dist/index.html +2 -2
- package/frontend/dist/sw.js +91 -10
- package/frontend/dist/version.json +1 -1
- package/lib/audio/groups.js +1 -1
- package/lib/auth/token.js +4 -4
- package/lib/cli/commands.js +70 -15
- package/lib/cli/doctor.js +5 -5
- package/lib/cli/fleet-service.js +7 -7
- package/lib/cli/init.js +55 -31
- package/lib/cli/pidfile.js +1 -1
- package/lib/cli/service.js +124 -8
- package/lib/cli/stable-alias.js +4 -4
- package/lib/cli/url.js +1 -1
- package/lib/config.js +36 -6
- package/lib/files/routes.js +1 -1
- package/lib/fleet/boot.js +2 -2
- package/lib/fleet/builtin.js +15 -15
- package/lib/fleet/causes.js +1 -1
- package/lib/fleet/cell-exec.js +23 -23
- package/lib/fleet/cell-hold.js +6 -6
- package/lib/fleet/cell-lease-server.js +106 -106
- package/lib/fleet/cell-lease.js +21 -21
- package/lib/fleet/definitions.js +10 -10
- package/lib/fleet/identity-authority.js +1 -1
- package/lib/fleet/launch-broker.js +13 -13
- package/lib/fleet/launch.js +15 -15
- package/lib/fleet/lease-client.js +23 -23
- package/lib/fleet/lease-routes.js +3 -3
- package/lib/fleet/lease-verifier.js +22 -22
- package/lib/fleet/managed.js +35 -35
- package/lib/fleet/prompt-delivery.js +13 -13
- package/lib/fleet/routes.js +15 -10
- package/lib/fleet/runtime.js +24 -24
- package/lib/live-host/bridge.js +53 -43
- package/lib/live-host/federation.js +97 -0
- package/lib/live-host/routes.js +166 -8
- package/lib/live-host/store.js +44 -6
- package/lib/mcp/server.js +14 -14
- package/lib/mcp/tools.js +5 -5
- package/lib/nodes/access-presets.js +258 -0
- package/lib/nodes/commands.js +198 -4
- package/lib/nodes/store.js +152 -9
- package/lib/nodes/tunnel.js +7 -7
- package/lib/notify/ask-answer-service.js +184 -0
- package/lib/notify/ask-receipts.js +197 -0
- package/lib/notify/ask-relay.js +152 -0
- package/lib/notify/asks.js +28 -3
- package/lib/notify/event-feed-acl.js +95 -0
- package/lib/notify/event-feed-asks-routes.js +144 -0
- package/lib/notify/event-feed-client.js +434 -0
- package/lib/notify/event-feed-history.js +115 -0
- package/lib/notify/event-feed-producers.js +175 -0
- package/lib/notify/event-feed-routes.js +254 -0
- package/lib/notify/event-feed.js +328 -0
- package/lib/notify/events.js +1 -1
- package/lib/notify/notifier.js +3 -3
- package/lib/notify/push-relay.js +240 -0
- package/lib/notify/push.js +8 -8
- package/lib/notify/routes.js +62 -23
- package/lib/proxy/federation.js +132 -12
- package/lib/proxy/node-proxy.js +13 -13
- package/lib/proxy/panel-auth.js +4 -4
- package/lib/proxy/panel-proxy.js +2 -2
- package/lib/proxy/resource-acl.js +145 -0
- package/lib/server.js +396 -40
- package/lib/settings/pairing-coordinator.js +1 -1
- package/lib/settings/routes.js +45 -32
- package/lib/update/manager.js +1 -1
- package/lib/update/runner.js +1 -1
- package/lib/voice/transcribe.js +1 -1
- package/lib/ws/bridge.js +3 -3
- package/package.json +1 -1
- package/skills/live/SKILL.md +12 -0
- package/frontend/dist/assets/index-CWra6B79.js +0 -167
- package/frontend/dist/assets/index-D6CIfCjv.css +0 -32
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to NexusCrew are tracked here.
|
|
4
4
|
|
|
5
|
+
## 0.9.30 — 2026-09-16
|
|
6
|
+
|
|
7
|
+
- Internal work references removed from the published package (enforced by the npm payload gate).
|
|
8
|
+
- **Paired nodes exchange a federated event feed.** A subscriber opens a snapshot and then a stream per owner, attributed to the node that emitted it: an imported event is re-emitted locally only, so it can never travel back, and what a peer may see follows its granted access instead of what it asks for.
|
|
9
|
+
- **A question from another node is answered through a durable receipt.** The receipt is written before the paste, so a crash leaves an uncertain attempt that the operator reconciles explicitly instead of a blind retry: the same request replays the stored outcome, a decision is bound to the generation of the outcomes it was taken on, and a terminal outcome refuses any further paste on every path.
|
|
10
|
+
- **Imported notifications ring on the phone, once per event.** A relay with its own queue and alert budget sends the OS alert, keeps a durable per-owner registry so a replay of an already-recorded event or a restart does not ring again within the registry limits (4096 ids over 24 hours); senders remain best-effort, so a single alert per phone is not universally guaranteed (provider dedup and distinct PWA origins are out of contract), and the relay can be turned off per browser.
|
|
11
|
+
- **An imported alert opens the question it came from.** The ask correlation travels from its creation to the alert payload, so the notification lands on that question instead of the owner's page alone.
|
|
12
|
+
- **An imported file delivery stays inside its cell's alert budget.** The file notice keeps the cell it belongs to on the way in, and it is the same class of alert as a local one.
|
|
13
|
+
|
|
14
|
+
## 0.9.29 — 2026-09-15
|
|
15
|
+
|
|
16
|
+
- **The Live host of a node is chosen with an explicit command.** `Use as Live host` and `Remove Live host` sit in the cell menu and in the cell selector: the star is a pin only, and a small indicator shows the current host, so the choice and its outcome stay in sight.
|
|
17
|
+
- **A designated Live host that lives on another node is reached through its owner.** The bridge is forwarded to the owner node and its answer — or a named refusal — comes back as it is, with no silent fallback to a local cell; federated bridge calls are rate-limited per sending node.
|
|
18
|
+
- **`nexuscrew init` does not restart a service it does not own.** Run from a HOME that does not own the running service it warns and skips the activation instead of restarting someone else's service (`--no-activate` skips the activation on purpose).
|
|
19
|
+
- **A federated request whose body was already read is refused by name.** A named 502 at once, instead of waiting 30 seconds for a body that nothing will send.
|
|
20
|
+
|
|
5
21
|
## 0.9.28 — 2026-09-15
|
|
6
22
|
|
|
7
23
|
- **The terminal renderer toggle is an icon button** (GPU/DOM stay in the tooltip and in the accessible label), so it no longer widens the bar and squeezes the cell name on phones.
|
package/docs/LIVE_PROMPT.md
CHANGED
|
@@ -93,7 +93,7 @@ the pattern to extend if this contract ever changes:
|
|
|
93
93
|
- `'NATIVA con cella OCCUPATA...'` — the ordinary case, file found and
|
|
94
94
|
applied, identity header followed by the prompt text.
|
|
95
95
|
- `'BUG prefisso: un device con prefisso diverso da cloud- deve trovare
|
|
96
|
-
comunque il prompt'` — a device whose sessions are named `
|
|
96
|
+
comunque il prompt'` — a device whose sessions are named `labhost-*`: the
|
|
97
97
|
file is written under that exact session name, not under `cloud-`, and the
|
|
98
98
|
bridge is expected to find it there. This is the test that would have
|
|
99
99
|
caught the original bug — it fails against the pre-fix bridge and passes
|
package/docs/NOTIFICATIONS.md
CHANGED
|
@@ -82,6 +82,43 @@ announces notifications.
|
|
|
82
82
|
Only new live notification frames are spoken. Persisted questions and previous
|
|
83
83
|
events are not replayed.
|
|
84
84
|
|
|
85
|
+
## Imported events and one-browser alerts
|
|
86
|
+
|
|
87
|
+
Events imported from a federated owner ring the operating system too, so a
|
|
88
|
+
closed PWA still shows them. Three rules keep that trustworthy:
|
|
89
|
+
|
|
90
|
+
- **One alert per event.** An event already alerted never rings twice, not after
|
|
91
|
+
a replay, not after the service worker is restarted: the identity is the
|
|
92
|
+
`(owner, eventId)` pair and it is written before the send. A re-import of a
|
|
93
|
+
known event, a state refresh or an ask closure updates the UI silently.
|
|
94
|
+
- **A local link only.** The notification link is always a path inside this app;
|
|
95
|
+
an absolute or foreign URL in a payload is dropped and the app root is opened
|
|
96
|
+
instead. The full text stays in the card — the system alert carries a short
|
|
97
|
+
preview.
|
|
98
|
+
- **A separate budget.** Imported alerts have their own queue and their own
|
|
99
|
+
per-minute allowance, apart from local notifications. A noisy or misbehaving
|
|
100
|
+
owner is dropped and counted; it cannot delay local alerts, and a failed
|
|
101
|
+
delivery never retries the live stream that already accepted the event.
|
|
102
|
+
|
|
103
|
+
An alert names the ask it belongs to only when the source event carries one:
|
|
104
|
+
an imported notification does not, because the ask itself arrives as its own
|
|
105
|
+
event and that event deliberately stays silent. That notification therefore
|
|
106
|
+
opens the owner's feed, without an `ask=` component.
|
|
107
|
+
|
|
108
|
+
### Two PWAs on the same phone
|
|
109
|
+
|
|
110
|
+
One phone can hold two installed PWAs (for example this node and an owner's).
|
|
111
|
+
Each browser keeps its own subscription, so both can receive alerts. If you want
|
|
112
|
+
the operating system to stay quiet for one of them:
|
|
113
|
+
|
|
114
|
+
1. Open **Settings → Notifications** in that PWA.
|
|
115
|
+
2. Choose **silence on this browser**.
|
|
116
|
+
|
|
117
|
+
This is a browser-local choice, stored on the device only: it unsubscribes that
|
|
118
|
+
browser, keeps the app fully usable, and never changes the other side's push
|
|
119
|
+
setup. Turning it back on requires the same button, so a device that was asked
|
|
120
|
+
to stay silent does not re-subscribe itself.
|
|
121
|
+
|
|
85
122
|
## Platform notes
|
|
86
123
|
|
|
87
124
|
| Platform | Expected behavior |
|
package/docs/OPERATIONS.md
CHANGED
|
@@ -41,6 +41,26 @@ Termux pidfiles include process identity data. If Android reuses a PID under
|
|
|
41
41
|
another app UID, NexusCrew removes only the stale pidfile, never signals the
|
|
42
42
|
foreign process, and restarts only the configured OpenSSH supervisor.
|
|
43
43
|
|
|
44
|
+
## Smoke runs and temporary prefixes
|
|
45
|
+
|
|
46
|
+
The user service manager (systemd `--user`, launchd) is **per-UID, not
|
|
47
|
+
per-HOME**: it resolves `nexuscrew` by name inside the namespace of the
|
|
48
|
+
logged-in user. `init` writes the boot definition under the HOME it was given,
|
|
49
|
+
so a run against a temporary HOME would otherwise install a definition the
|
|
50
|
+
manager never loads while the activation commands still acted on the real
|
|
51
|
+
installation -- restarting the production service.
|
|
52
|
+
|
|
53
|
+
For a smoke run or a throwaway prefix, use one of:
|
|
54
|
+
|
|
55
|
+
- `nexuscrew serve` -- start the runtime without touching the service manager;
|
|
56
|
+
- `nexuscrew init --no-activate` -- write config, token and boot definitions but
|
|
57
|
+
run no service manager command at all.
|
|
58
|
+
|
|
59
|
+
Without `--no-activate`, `init` reads back which definition the manager has
|
|
60
|
+
loaded and skips activation with an explicit warning when that definition is not
|
|
61
|
+
the one just written. `nexuscrew restart` from the owning HOME activates it
|
|
62
|
+
afterwards.
|
|
63
|
+
|
|
44
64
|
## Backup and restore
|
|
45
65
|
|
|
46
66
|
**Settings → Fleet** can export and restore selected cells, system prompts and
|