@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.
Files changed (81) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/docs/LIVE_PROMPT.md +1 -1
  3. package/docs/NOTIFICATIONS.md +37 -0
  4. package/docs/OPERATIONS.md +20 -0
  5. package/frontend/dist/assets/index-BbcjoZS0.js +167 -0
  6. package/frontend/dist/assets/index-DqCfZFGi.css +32 -0
  7. package/frontend/dist/index.html +2 -2
  8. package/frontend/dist/sw.js +91 -10
  9. package/frontend/dist/version.json +1 -1
  10. package/lib/audio/groups.js +1 -1
  11. package/lib/auth/token.js +4 -4
  12. package/lib/cli/commands.js +70 -15
  13. package/lib/cli/doctor.js +5 -5
  14. package/lib/cli/fleet-service.js +7 -7
  15. package/lib/cli/init.js +55 -31
  16. package/lib/cli/pidfile.js +1 -1
  17. package/lib/cli/service.js +124 -8
  18. package/lib/cli/stable-alias.js +4 -4
  19. package/lib/cli/url.js +1 -1
  20. package/lib/config.js +36 -6
  21. package/lib/files/routes.js +1 -1
  22. package/lib/fleet/boot.js +2 -2
  23. package/lib/fleet/builtin.js +15 -15
  24. package/lib/fleet/causes.js +1 -1
  25. package/lib/fleet/cell-exec.js +23 -23
  26. package/lib/fleet/cell-hold.js +6 -6
  27. package/lib/fleet/cell-lease-server.js +106 -106
  28. package/lib/fleet/cell-lease.js +21 -21
  29. package/lib/fleet/definitions.js +10 -10
  30. package/lib/fleet/identity-authority.js +1 -1
  31. package/lib/fleet/launch-broker.js +13 -13
  32. package/lib/fleet/launch.js +15 -15
  33. package/lib/fleet/lease-client.js +23 -23
  34. package/lib/fleet/lease-routes.js +3 -3
  35. package/lib/fleet/lease-verifier.js +22 -22
  36. package/lib/fleet/managed.js +35 -35
  37. package/lib/fleet/prompt-delivery.js +13 -13
  38. package/lib/fleet/routes.js +15 -10
  39. package/lib/fleet/runtime.js +24 -24
  40. package/lib/live-host/bridge.js +53 -43
  41. package/lib/live-host/federation.js +97 -0
  42. package/lib/live-host/routes.js +166 -8
  43. package/lib/live-host/store.js +44 -6
  44. package/lib/mcp/server.js +14 -14
  45. package/lib/mcp/tools.js +5 -5
  46. package/lib/nodes/access-presets.js +258 -0
  47. package/lib/nodes/commands.js +198 -4
  48. package/lib/nodes/store.js +152 -9
  49. package/lib/nodes/tunnel.js +7 -7
  50. package/lib/notify/ask-answer-service.js +184 -0
  51. package/lib/notify/ask-receipts.js +197 -0
  52. package/lib/notify/ask-relay.js +152 -0
  53. package/lib/notify/asks.js +28 -3
  54. package/lib/notify/event-feed-acl.js +95 -0
  55. package/lib/notify/event-feed-asks-routes.js +144 -0
  56. package/lib/notify/event-feed-client.js +434 -0
  57. package/lib/notify/event-feed-history.js +115 -0
  58. package/lib/notify/event-feed-producers.js +175 -0
  59. package/lib/notify/event-feed-routes.js +254 -0
  60. package/lib/notify/event-feed.js +328 -0
  61. package/lib/notify/events.js +1 -1
  62. package/lib/notify/notifier.js +3 -3
  63. package/lib/notify/push-relay.js +240 -0
  64. package/lib/notify/push.js +8 -8
  65. package/lib/notify/routes.js +62 -23
  66. package/lib/proxy/federation.js +132 -12
  67. package/lib/proxy/node-proxy.js +13 -13
  68. package/lib/proxy/panel-auth.js +4 -4
  69. package/lib/proxy/panel-proxy.js +2 -2
  70. package/lib/proxy/resource-acl.js +145 -0
  71. package/lib/server.js +396 -40
  72. package/lib/settings/pairing-coordinator.js +1 -1
  73. package/lib/settings/routes.js +45 -32
  74. package/lib/update/manager.js +1 -1
  75. package/lib/update/runner.js +1 -1
  76. package/lib/voice/transcribe.js +1 -1
  77. package/lib/ws/bridge.js +3 -3
  78. package/package.json +1 -1
  79. package/skills/live/SKILL.md +12 -0
  80. package/frontend/dist/assets/index-CWra6B79.js +0 -167
  81. 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.
@@ -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 `macair-*`: the
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
@@ -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 |
@@ -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