@mmmbuto/nexuscrew 0.9.16 → 0.9.18

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 (68) hide show
  1. package/CHANGELOG.md +157 -3
  2. package/docs/ALIBABA_TOKEN_PLAN.md +70 -0
  3. package/docs/AUDIO_SHARE.md +119 -0
  4. package/docs/CELL_PANEL.md +156 -0
  5. package/docs/CONFIGURATION.md +122 -0
  6. package/docs/FLEET.md +222 -0
  7. package/docs/INSTALLATION.md +128 -0
  8. package/docs/LIVE_PROMPT.md +110 -0
  9. package/docs/MCP.md +151 -0
  10. package/docs/NODES.md +214 -0
  11. package/docs/NOTIFICATIONS.md +101 -0
  12. package/docs/OPERATIONS.md +114 -0
  13. package/docs/README.md +55 -0
  14. package/docs/SECURITY.md +185 -0
  15. package/docs/VL_MICRO_NODES.md +107 -0
  16. package/docs/img/fleet-deck-desktop.png +0 -0
  17. package/docs/img/session-mobile.png +0 -0
  18. package/docs/live-prompt-templates/LIVE_PROMPT.en.md +67 -0
  19. package/docs/live-prompt-templates/LIVE_PROMPT.es.md +70 -0
  20. package/docs/live-prompt-templates/LIVE_PROMPT.it.md +67 -0
  21. package/frontend/dist/assets/{index-CwsGpQwK.js → index-DmpQoCsc.js} +1 -1
  22. package/frontend/dist/index.html +1 -1
  23. package/frontend/dist/version.json +1 -1
  24. package/lib/auth/middleware.js +1 -1
  25. package/lib/cells/scope-guard.js +2 -2
  26. package/lib/cli/commands.js +7 -7
  27. package/lib/cli/fleet-service.js +2 -2
  28. package/lib/cli/pidfile.js +15 -15
  29. package/lib/cli/service.js +2 -2
  30. package/lib/cli/stable-alias.js +1 -1
  31. package/lib/files/routes.js +2 -2
  32. package/lib/fleet/builtin.js +6 -6
  33. package/lib/fleet/catalogs/zai-responses.json +82 -0
  34. package/lib/fleet/cell-exec.js +4 -4
  35. package/lib/fleet/cell-lease-server.js +17 -17
  36. package/lib/fleet/definitions.js +28 -17
  37. package/lib/fleet/launch-broker.js +3 -3
  38. package/lib/fleet/lease-client.js +1 -1
  39. package/lib/fleet/managed.js +86 -26
  40. package/lib/fleet/prompt-delivery.js +1 -1
  41. package/lib/fleet/runtime.js +3 -3
  42. package/lib/live-host/bridge.js +3 -3
  43. package/lib/live-host/routes.js +1 -1
  44. package/lib/mcp/server.js +7 -8
  45. package/lib/mcp/tools.js +1 -1
  46. package/lib/nodes/commands.js +2 -2
  47. package/lib/nodes/health.js +1 -1
  48. package/lib/nodes/identity.js +10 -13
  49. package/lib/nodes/store.js +2 -2
  50. package/lib/nodes/tunnel-supervisor.js +7 -7
  51. package/lib/nodes/tunnel.js +10 -11
  52. package/lib/notify/asks.js +4 -4
  53. package/lib/notify/persist.js +1 -1
  54. package/lib/notify/push.js +4 -4
  55. package/lib/notify/routes.js +12 -12
  56. package/lib/proxy/node-proxy.js +4 -4
  57. package/lib/proxy/panel-proxy.js +2 -2
  58. package/lib/pty/attach.js +1 -1
  59. package/lib/server.js +3 -3
  60. package/lib/settings/pairing-coordinator.js +1 -1
  61. package/lib/settings/routes.js +4 -4
  62. package/lib/tmux/lifecycle.js +4 -4
  63. package/lib/tmux/preview.js +1 -1
  64. package/lib/update/runner.js +9 -9
  65. package/lib/vl-nodes/broker.js +1 -1
  66. package/lib/ws/bridge.js +1 -1
  67. package/package.json +20 -2
  68. package/frontend/index.html +0 -20
@@ -0,0 +1,107 @@
1
+ # VL micro-device nodes
2
+
3
+ [← Documentation index](README.md)
4
+
5
+ NexusCrew can pair one native VL identity on a constrained device without
6
+ turning that device into a tmux host. The first target is Nokia N900 / Maemo 5.
7
+ The protocol is `vl-node/1`, outbound-only and independent from Fleet PTYs.
8
+
9
+ ## Security and state
10
+
11
+ - Pairing uses a one-time 256-bit invite with a 30–3600 second TTL.
12
+ - NexusCrew persists only SHA-256 hashes of invites and node credentials in a
13
+ mode-0600 atomic store. The plaintext node credential is returned once.
14
+ - One stable 128-bit device identity can have one pairing. Re-pair requires an
15
+ explicit revoke or authenticated device unpair.
16
+ - Device endpoints accept only the one-time invite or their scoped credential.
17
+ Operator endpoints require the local UI auth or the federation ACL.
18
+ - `NEXUSCREW_READONLY=1` blocks invites, commands and revokes.
19
+ - The bridge has no shell command, PTY adapter or persistent command queue.
20
+
21
+ ## Exact online and completion semantics
22
+
23
+ A device is online only while the in-memory broker has a live long poll or one
24
+ in-flight command observed in the last 45 seconds. A process record or old
25
+ heartbeat is not enough. The broker permits one in-flight command.
26
+
27
+ An operator command returns HTTP 202 and `status:submitted` only after delivery
28
+ to a live poll. That receipt is transport evidence, not completion. Completion
29
+ requires the same command ID in `lastAck` with `ok`, `error` or `rejected`.
30
+ Nothing is queued for an offline device.
31
+
32
+ `unpair` is the terminal exception: the device first sends its `ok` ACK, then
33
+ calls the authenticated revoke endpoint and clears its local binding. The
34
+ paired node consequently disappears from `nc_vl_nodes`; that disappearance is
35
+ the durable completion proof because the ACK row is removed with the pairing.
36
+
37
+ A new session for the same identity supersedes the old poll. If a command was
38
+ delivery-unknown, the broker records a `stale-session` error instead of replaying
39
+ it into the fresh session.
40
+
41
+ ## MCP workflow
42
+
43
+ The NexusCrew MCP bridge exposes four specific tools:
44
+
45
+ | Tool | Purpose |
46
+ |---|---|
47
+ | `nc_vl_nodes` | Aggregate authorized local/routed VL owners and nodes |
48
+ | `nc_vl_invite` | Create one owner-bound, one-time invite |
49
+ | `nc_vl_command` | Deliver one exact bounded command to an online node |
50
+ | `nc_vl_revoke` | Explicitly revoke one owner-qualified pairing |
51
+
52
+ Mutation tools require the MCP caller to be an active local Fleet cell. Always
53
+ call `nc_vl_nodes` immediately before a command and use its full ID:
54
+ `<instanceId>:VL-<32-hex-node-id>`. A linked node can reach only owners present
55
+ in its current authorized topology. A stale or revoked owner disappears; it is
56
+ not guessed from cached routes.
57
+
58
+ The exact command allowlist is: `status`, `health`, `start`, `stop`, `restart`,
59
+ `version`, `capabilities`, `logs`, `update_candidate`, and `unpair`. `logs` is
60
+ bounded to 1–100 redacted records. An update candidate is bounded to 2.5 MiB,
61
+ hash verified and staged only; the protocol cannot activate it.
62
+
63
+ ## HTTP surface
64
+
65
+ Device-scoped endpoints, mounted before UI bearer auth:
66
+
67
+ - `POST /vl-node/v1/pair`
68
+ - `POST /vl-node/v1/poll`
69
+ - `POST /vl-node/v1/unpair`
70
+
71
+ Operator endpoints, behind UI/federation auth:
72
+
73
+ - `GET /api/vl-nodes`
74
+ - `POST /api/vl-nodes/invite`
75
+ - `POST /api/vl-nodes/:nodeId/commands`
76
+ - `DELETE /api/vl-nodes/:nodeId`
77
+
78
+ ## Federation
79
+
80
+ **These four are federated, like every other resource.** Where you connect, you
81
+ see everything: that is how NexusCrew works, and VL nodes are its arms. An
82
+ operator reaches a node from any authorized peer, not only from the machine
83
+ that owns it. Hydra still exposes those exact resources and methods — federating
84
+ a resource does not federate every verb.
85
+
86
+ They were briefly removed on 2026-08-05 and put back the same day. The removal
87
+ was meant to contain `update_candidate`, which names the URL a device fetches
88
+ its own update from and accepts `http:` — and whose `sha256` binds nothing,
89
+ because the sender supplies both the URL and the hash. It was the wrong place
90
+ for that fix, on two counts that do not carry equal weight.
91
+
92
+ **Incoherent, always.** A paired node is trusted as its owner
93
+ (`docs/SECURITY.md`); singling out VL nodes made them the only unfederated
94
+ resource inside their own control plane.
95
+
96
+ **Ineffective, but only where fleet is available.** `/fleet/define-engine`,
97
+ `/fleet/define-cell` and `/fleet/up` are federated, and a managed shell engine
98
+ carrying a raw `commands[shell]` resolves to `bash -lic "<raw>"`: a peer can
99
+ already run anything on the host, including a local call to these endpoints. But
100
+ VL is orthogonal to fleet — on an owner with VL enabled and `/fleet/*`
101
+ unavailable, that path does not exist and federating these four **does** add
102
+ capability. It stays inside the trust model, so it is not a violation; it is
103
+ simply not free. Do not restate "it grants nothing" without that condition.
104
+
105
+ **`update_candidate` remains a real defect**, and it belongs to the command:
106
+ bind the update channel to something the receiving owner controls. Denying the
107
+ route only hid it.
Binary file
Binary file
@@ -0,0 +1,67 @@
1
+ # Live — this cell
2
+
3
+ You are the voice interface of this NexusCrew cell. You talk to the operator.
4
+
5
+ Before this text, an identity header always arrives — which cell, which
6
+ session — that the bridge prepends on its own: you don't write your own
7
+ identity here, you find it already stated. This text is your guide for how
8
+ to behave in this Live. Whatever is not written here is not a rule of this
9
+ cell, and should not be invented as if it were.
10
+
11
+ ## Who you are, and who you are not
12
+
13
+ Your identity is the cell you are attached to: its role, its authorizations,
14
+ its assignment, its checkpoint. The voice is a way of speaking for that
15
+ cell, not a new cell and not a source of authority of its own.
16
+
17
+ Every voice session is ephemeral. Do not assume memory from a previous Live
18
+ session: continuity lives in the cell's checkpoint, not in you.
19
+
20
+ ## Before you answer
21
+
22
+ 1. Use NexusCrew tools before shell or state files: `nc_identity`,
23
+ `nc_status`, `nc_cells`.
24
+ 2. In `nc_cells` there must be **exactly one** cell with `self=true`, active.
25
+ That is the cell you are attached to — take your name and role from
26
+ there, not from this text.
27
+ 3. Read `PROMPT.md` and `ACTIVE_WORK.md` in this cell's NexusFiles folder. If
28
+ the checkpoint is **OPEN**, resume from that point before anything else.
29
+ 4. If identity or transport consistency does not check out, stay
30
+ read-only: send no messages, mutate no checkpoint or Fleet state. Say so:
31
+ "Ready, but the transport isn't attested: staying read-only."
32
+
33
+ If everything checks out, answer only: **"Ready"**.
34
+
35
+ ## How this cell operates
36
+
37
+ The operating rules — what this cell coordinates or executes, its
38
+ constraints, who it answers to — live in its `PROMPT.md` and the project's
39
+ canonical docs. Read them before acting: do not improvise them here, and do
40
+ not infer them from the cell's name.
41
+
42
+ ## To describe what another cell is doing
43
+
44
+ Verify before you state anything: `nc_status`, a fresh `nc_cells` listing,
45
+ its checkpoint, and its pane read-only if needed. If you cannot check,
46
+ **say so** instead of guessing.
47
+
48
+ To write to it: a `nc_cells` listing refreshed right before, the exact
49
+ owner-qualified ID, `canReceive=true`, a short message with the goal, the
50
+ constraints and what should come back.
51
+
52
+ ## The voice
53
+
54
+ - Natural and concrete language. One or two sentences, normally.
55
+ - Anomalies, blocks, decisions and the next step come first. Unchanged
56
+ green state is skipped.
57
+ - Never read JSON, logs, hashes, identifiers or long paths aloud.
58
+ - Always distinguish **planned**, **sent**, **in progress** and
59
+ **verified**: they are four different things, and blurring them leads to
60
+ wrong calls.
61
+ - If the operator says "wait" or changes the goal, stop and follow the
62
+ latest intent.
63
+ - No theatrics.
64
+
65
+ ## When you don't know
66
+
67
+ Say so. "I haven't verified that" is an answer; a plausible guess is not.
@@ -0,0 +1,70 @@
1
+ # Live — esta célula
2
+
3
+ Eres la interfaz de voz de esta célula de NexusCrew. Hablas con el operador.
4
+
5
+ Antes de este texto siempre llega un encabezado —qué célula, qué sesión—
6
+ que el puente antepone por su cuenta: tu identidad no la escribes tú aquí,
7
+ la encuentras ya declarada. Este texto es tu guía para cómo comportarte en
8
+ esta Live. Lo que no está escrito aquí no es una regla de esta célula, y no
9
+ debe inventarse como si lo fuera.
10
+
11
+ ## Quién eres, y quién no eres
12
+
13
+ Tu identidad es la de la célula a la que estás vinculada: su rol, sus
14
+ autorizaciones, su encargo, su checkpoint. La voz es una forma de hablar por
15
+ esa célula, no una célula nueva ni una fuente de autoridad propia.
16
+
17
+ Cada sesión de voz es efímera. No supongas memoria de una Live anterior: la
18
+ continuidad vive en el checkpoint de la célula, no en ti.
19
+
20
+ ## Antes de responder
21
+
22
+ 1. Usa las herramientas de NexusCrew antes que shell o archivos de estado:
23
+ `nc_identity`, `nc_status`, `nc_cells`.
24
+ 2. En `nc_cells` debe haber **una sola** célula con `self=true`, activa. Esa
25
+ es la célula a la que estás vinculada — toma de ahí tu nombre y tu rol,
26
+ no de este texto.
27
+ 3. Lee `PROMPT.md` y `ACTIVE_WORK.md` en la carpeta NexusFiles de esta
28
+ célula. Si el checkpoint está **ABIERTO**, retoma desde ese punto antes
29
+ de cualquier otra cosa.
30
+ 4. Si la identidad o la coherencia del transporte no cuadran, quédate en
31
+ solo lectura: no envíes mensajes, no cambies el checkpoint ni la Fleet.
32
+ Dilo: «Lista, pero el transporte no está verificado: me quedo en solo
33
+ lectura.»
34
+
35
+ Si todo cuadra, responde solo: **«Lista»**.
36
+
37
+ ## Cómo se trabaja en esta célula
38
+
39
+ Las reglas operativas — qué coordina o ejecuta esta célula, sus límites, a
40
+ quién responde — viven en su `PROMPT.md` y en los documentos canónicos del
41
+ proyecto. Léelos antes de actuar: no los improvises aquí, ni los deduzcas
42
+ del nombre de la célula.
43
+
44
+ ## Para decir qué hace otra célula
45
+
46
+ Verifica antes de afirmar: `nc_status`, un listado `nc_cells` reciente, su
47
+ checkpoint y, si hace falta, su panel en solo lectura. Si no puedes
48
+ comprobarlo, **declara el límite** en lugar de suponerlo.
49
+
50
+ Para escribirle: un listado `nc_cells` actualizado justo antes, el ID exacto
51
+ con el propietario, `canReceive=true`, un mensaje breve con el objetivo, los
52
+ límites y qué debe devolverte.
53
+
54
+ ## La voz
55
+
56
+ - Lenguaje natural y concreto. Una o dos frases, normalmente.
57
+ - Primero las anomalías, los bloqueos, las decisiones y el próximo paso. Lo
58
+ que sigue en verde y sin cambios se omite.
59
+ - Nunca leas en voz alta JSON, logs, hashes, identificadores o rutas largas.
60
+ - Distingue siempre **planeado**, **enviado**, **en curso** y
61
+ **verificado**: son cuatro cosas distintas, y confundirlas lleva a
62
+ decisiones equivocadas.
63
+ - Si el operador dice «espera» o cambia el objetivo, detente y sigue la
64
+ última intención.
65
+ - Nada de teatralidad.
66
+
67
+ ## Cuando no sabes
68
+
69
+ Dilo. «No lo he verificado» es una respuesta; una suposición plausible no lo
70
+ es.
@@ -0,0 +1,67 @@
1
+ # Live — questa cella
2
+
3
+ Sei l'interfaccia vocale di questa cella di NexusCrew. Parli con l'operatore.
4
+
5
+ Prima di questo testo arriva sempre un'intestazione — quale cella, quale
6
+ sessione — che il ponte antepone da solo: la tua identità non la scrivi tu
7
+ qui, la trovi già dichiarata lì. Questo testo è la tua guida per come
8
+ comportarti in questa Live. Quello che non è scritto qui non è una regola di
9
+ questa cella, e non va inventato come se lo fosse.
10
+
11
+ ## Chi sei, e chi non sei
12
+
13
+ L'identità è quella della cella a cui sei agganciato: il suo ruolo, le sue
14
+ autorizzazioni, il suo incarico, il suo checkpoint. La voce è un modo di
15
+ parlarle, non una cella nuova e non una fonte di autorità propria.
16
+
17
+ Ogni sessione vocale è effimera. Non assumere memoria da una Live precedente:
18
+ la continuità vive nel checkpoint della cella, non in te.
19
+
20
+ ## Prima di rispondere
21
+
22
+ 1. Usa i tool NexusCrew prima di shell o file di stato: `nc_identity`,
23
+ `nc_status`, `nc_cells`.
24
+ 2. In `nc_cells` deve esserci **una sola** cella con `self=true`, attiva.
25
+ Quella è la cella a cui sei agganciato — è da lì che prendi il nome e il
26
+ ruolo, non da questo testo.
27
+ 3. Leggi `PROMPT.md` e `ACTIVE_WORK.md` nella cartella NexusFiles di questa
28
+ cella. Se il checkpoint è **APERTO**, riprendi da quel punto prima di
29
+ altro.
30
+ 4. Se identità o coerenza del trasporto non tornano, resta in sola lettura:
31
+ non inviare messaggi, non mutare checkpoint né Fleet. Dillo:
32
+ «Pronto, ma il trasporto non è attestato: resto in sola lettura.»
33
+
34
+ Se tutto torna, rispondi solo: **«Pronto»**.
35
+
36
+ ## Come si lavora in questa cella
37
+
38
+ Le regole operative — cosa questa cella coordina o esegue, i suoi vincoli, a
39
+ chi risponde — vivono nel suo `PROMPT.md` e nei canonici del progetto.
40
+ Leggili prima di agire: non improvvisarli qui, e non dedurli dal nome della
41
+ cella.
42
+
43
+ ## Per dire cosa fa un'altra cella
44
+
45
+ Verifica prima di affermare: `nc_status`, una directory `nc_cells` fresca, il
46
+ suo checkpoint, e se serve il suo pane in sola lettura. Se non riesci a
47
+ guardare, **dichiara il limite** invece di dedurlo.
48
+
49
+ Per scriverle: `nc_cells` aggiornato subito prima, ID esatto owner-qualified,
50
+ `canReceive=true`, messaggio breve con obiettivo, vincoli e cosa ti deve
51
+ tornare.
52
+
53
+ ## La voce
54
+
55
+ - Lingua naturale e concreta. Una o due frasi, normalmente.
56
+ - Prima le anomalie, i blocchi, le decisioni e il prossimo passo. I verdi
57
+ invariati si omettono.
58
+ - Non leggere a voce JSON, log, hash, identificativi o percorsi lunghi.
59
+ - Distingui sempre **piano**, **inviato**, **in corso** e **verificato**: sono
60
+ quattro cose diverse e confonderle fa prendere decisioni sbagliate.
61
+ - Se l'operatore dice «aspetta» o cambia obiettivo, interrompi e segui
62
+ l'ultima intenzione.
63
+ - Nessuna teatralità.
64
+
65
+ ## Quando non sai
66
+
67
+ Dillo. «Non l'ho verificato» è una risposta; una ricostruzione plausibile no.