@mmmbuto/nexuscrew 0.9.29 → 0.9.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 +20 -0
- package/docs/LIVE_PROMPT.md +1 -1
- package/docs/NOTIFICATIONS.md +37 -0
- package/frontend/dist/assets/index-DaAL7P-m.js +167 -0
- package/frontend/dist/assets/{index-CywSos2e.css → index-DqCfZFGi.css} +1 -1
- 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 +59 -12
- package/lib/cli/doctor.js +36 -7
- package/lib/cli/fleet-service.js +7 -7
- package/lib/cli/init.js +27 -27
- package/lib/cli/pidfile.js +1 -1
- package/lib/cli/service.js +6 -6
- package/lib/cli/stable-alias.js +4 -4
- package/lib/cli/url.js +1 -1
- package/lib/config.js +36 -6
- package/lib/decks/routes.js +11 -1
- package/lib/files/routes.js +1 -1
- package/lib/fleet/boot.js +2 -2
- package/lib/fleet/builtin.js +28 -19
- 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 +21 -13
- 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 +46 -36
- package/lib/fleet/prompt-delivery.js +13 -13
- package/lib/fleet/routes.js +15 -10
- package/lib/fleet/runtime.js +26 -26
- package/lib/live-host/bridge.js +36 -36
- package/lib/live-host/routes.js +2 -2
- package/lib/live-host/store.js +4 -4
- 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 +74 -3
- 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 +372 -39
- 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/frontend/dist/assets/index-B_THfiL5.js +0 -167
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to NexusCrew are tracked here.
|
|
4
4
|
|
|
5
|
+
## Unreleased
|
|
6
|
+
|
|
7
|
+
- **Custom engines now list their declared models in the pickers.** A custom profile has no builtin catalog, so the model lists stayed empty even when models were declared for the engine; the engine list now joins the profile catalog with the declared models (for `pi` custom engines the pinned model stays first in the list).
|
|
8
|
+
|
|
9
|
+
## 0.9.31 — 2026-09-18
|
|
10
|
+
|
|
11
|
+
- **Deck layout edits survive with several windows open.** A save now rebases and retries instead of failing: the layout is merged per window, an in-flight save is awaited before the next one, a drag that ends with the pointer still down flushes its size, and a rejected save says so in the log instead of losing the change silently.
|
|
12
|
+
- **A model in use is refused by the engine that declares it.** Removing a model now compares against the declaring engine's keys, so an unrelated engine sharing the name no longer blocks the removal — and the rejection names the limit it hit.
|
|
13
|
+
- **The doctor separates the two tmux preload outcomes.** A missing `LD_PRELOAD` support and a tmux server that is not running are reported as different causes, each with its own remedy.
|
|
14
|
+
- **Up to 128 declared models in the fleet catalog (was 64)**; the ceiling is named in the rejection instead of a silent stop.
|
|
15
|
+
|
|
16
|
+
## 0.9.30 — 2026-09-16
|
|
17
|
+
|
|
18
|
+
- Internal work references removed from the published package (enforced by the npm payload gate).
|
|
19
|
+
- **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.
|
|
20
|
+
- **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.
|
|
21
|
+
- **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.
|
|
22
|
+
- **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.
|
|
23
|
+
- **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.
|
|
24
|
+
|
|
5
25
|
## 0.9.29 — 2026-09-15
|
|
6
26
|
|
|
7
27
|
- **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.
|
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 |
|