@mmmbuto/nexuscrew 0.9.0 → 0.9.2

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 (39) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/README.md +22 -4
  3. package/frontend/dist/assets/index-uRh_hSop.js +93 -0
  4. package/frontend/dist/index.html +1 -1
  5. package/frontend/dist/version.json +1 -1
  6. package/lib/cli/commands.js +14 -0
  7. package/lib/config.js +9 -0
  8. package/lib/fleet/builtin.js +57 -2
  9. package/lib/live-host/routes.js +9 -3
  10. package/lib/nodes/commands.js +15 -4
  11. package/lib/nodes/store.js +43 -0
  12. package/lib/nodes/tunnel.js +19 -0
  13. package/lib/proxy/federation.js +25 -1
  14. package/lib/proxy/panel-auth.js +63 -33
  15. package/lib/proxy/panel-proxy.js +41 -10
  16. package/lib/server.js +128 -6
  17. package/lib/settings/pairing-coordinator.js +32 -0
  18. package/lib/settings/public-peering-routes.js +13 -1
  19. package/package.json +1 -1
  20. package/skills/aidesktop/SKILL.md +201 -0
  21. package/skills/aidesktop/docker/Dockerfile +21 -0
  22. package/skills/aidesktop/docker/custom-cont-init.d/10-cdp-relay.sh +20 -0
  23. package/skills/aidesktop/docker/docker-compose.example.yml +75 -0
  24. package/skills/live/SKILL.md +90 -0
  25. package/skills/nexuscrew/SKILL.md +113 -0
  26. package/frontend/dist/assets/index-zjL6kZ7J.js +0 -93
  27. package/skills/alibaba-token-media/SKILL.md +0 -152
  28. package/skills/alibaba-token-media/agents/openai.yaml +0 -4
  29. package/skills/alibaba-token-media/references/api-contract.md +0 -97
  30. package/skills/alibaba-token-media/scripts/alibaba_token_media.py +0 -550
  31. package/skills/fill-forms/SKILL.md +0 -177
  32. package/skills/fill-forms/agents/openai.yaml +0 -4
  33. package/skills/fill-forms/references/overlay-technique.md +0 -99
  34. package/skills/fill-forms/requirements.txt +0 -4
  35. package/skills/fill-forms/scripts/dump_docx.py +0 -70
  36. package/skills/fill-forms/scripts/fill_docx.py +0 -207
  37. package/skills/fill-forms/scripts/fill_pdf.py +0 -424
  38. package/skills/fill-forms/scripts/inspect_pdf.py +0 -188
  39. package/skills/fill-forms/scripts/prepare_signature.py +0 -171
package/CHANGELOG.md CHANGED
@@ -2,6 +2,97 @@
2
2
 
3
3
  All notable changes to NexusCrew are tracked here.
4
4
 
5
+ ## 0.9.2 — 2026-08-16 — "Offered and Then Refused"
6
+
7
+ Both defects in this release were found by using the product, not by a test —
8
+ and both were invisible to the suite for the same reason: each test exercised
9
+ one piece in isolation, and neither defect exists in isolation.
10
+
11
+ - **The Desktop engine could be selected but never saved.** It declared
12
+ `command: 'docker'` — a bare name — while engine validation requires an
13
+ absolute path, so it appeared in the list and was rejected on save with
14
+ *"command must be an absolute path"*: a message describing the shape of the
15
+ value instead of saying the command had not been resolved. The path is now
16
+ resolved from `PATH` through `realpath`, which matters because validation
17
+ uses `lstat` and rejects symlinks — and in many installs the first hit on
18
+ `PATH` is exactly that. Where Docker is absent the fallback makes the
19
+ refusal say *"not accessible (ENOENT)"*, naming the real cause.
20
+
21
+ Installations that already had the engine are **repaired**: the backfill
22
+ skips what already exists, so fixing the default alone would have changed
23
+ nothing precisely where the defect was seen. The repair only touches a
24
+ command that is both non-absolute and still named `docker` — an absolute
25
+ path, or a command you changed yourself, is left alone.
26
+
27
+ - **The panel reloaded without pause, leaving no time to interact with it.**
28
+ A panel behind a login was unusable: the sign-in prompt appeared and the
29
+ frame remounted before it could be completed. `route` is an array, so it was
30
+ a new prop on every parent render — and the parent re-renders continuously
31
+ to poll the fleet. With the array among the effect's dependencies, every
32
+ render requested a fresh ticket and remounted the iframe. The dependency is
33
+ now keyed on content, so the panel reopens when the route actually changes
34
+ and not otherwise.
35
+
36
+ ## 0.9.1 — 2026-08-16 — "What the Guard Was Not Guarding"
37
+
38
+ - **The panel now lives on its own origin, so its JavaScript can no longer
39
+ reach the operator's token.** The panel was served from the same origin as
40
+ the control plane, in an iframe with no `sandbox` and no CSP, while the
41
+ token sat in `localStorage` — meaning a panel's own scripts could take it
42
+ and act as the operator. It is now served by a second loopback listener
43
+ (`NEXUSCREW_PANEL_PORT`, default 41821) that mounts `/panel/*` and nothing
44
+ else: no control API, no bearer. The port is part of the origin, so the
45
+ browser's same-origin policy does the enforcing rather than a convention.
46
+ For a **remote** node the port is negotiated during pairing
47
+ (`panelLocalPort`/`panelRemotePort`, as an obligatory pair) and travels on
48
+ its own forward. A node paired before this release keeps working on the old
49
+ path, and a remote cell without a negotiated port gets none — never a
50
+ borrowed local one.
51
+
52
+ - **A cookie set by a panel no longer reaches our origin — including through
53
+ the WebSocket handshake.** `Set-Cookie` was stripped on the HTTP path but
54
+ copied verbatim on the `101` upgrade, so the same property held on one route
55
+ and not the other. A panel could overwrite the legitimate viewing cookie and
56
+ break the user's own panel from the inside. Hop-by-hop headers still pass on
57
+ the upgrade — there they *are* the response.
58
+
59
+ - **Designating the Live cell works from a remote node.** The star now
60
+ commands the node that *owns* the cell rather than the one serving the page,
61
+ which was the main defect of 0.9.0. `liveHostAccess` is a per-peer
62
+ permission, denied by default, granted with `nexuscrew nodes live-host <node>
63
+ on`, and a refusal names its cause instead of failing silently. Turning the
64
+ star **off** across federation is now covered end to end, not just turning
65
+ it on.
66
+
67
+ - **"Retry" is offered only where retrying can change the outcome.** Any `403`
68
+ without a named reason — a read-only node refusing a federated mutation, for
69
+ instance — was classified as an expired ticket, so the interface said "your
70
+ ticket is no longer valid" and offered a button that could not succeed.
71
+ Permanent refusals and invalid credentials now have their own causes and
72
+ messages, with no button; transient ones keep it.
73
+
74
+ - **The published-tree guard no longer reports "clean" without having
75
+ looked.** Any blob it failed to read was silently skipped: with reads
76
+ failing, the gate stayed green having inspected nothing at all. An unreadable
77
+ blob is now a failure, and the number of inspected files must match the
78
+ tree — an empty result no longer counts as "no traces found".
79
+
80
+ - **The test suite stopped measuring the machine.** Five tests that raced a
81
+ millisecond budget turned red under load and green in isolation; each false
82
+ alarm cost three isolated re-runs to dismiss, and a gate that is sometimes
83
+ red for no reason teaches people to distrust red. They now wait for an
84
+ observable condition instead. Where time *is* the property — deadlines,
85
+ grace periods — the clock was already injectable and those tests were left
86
+ alone. No timeout was raised and no assertion was loosened.
87
+
88
+ - **New skills: `live`, `aidesktop`, and `nexuscrew` as the entry point.**
89
+ `aidesktop` ships a Docker recipe — Dockerfile, CDP relay, example compose —
90
+ for a desktop a browser-driving MCP can attach to. It documents the security
91
+ trade it makes rather than implying one it does not: the browser inside runs
92
+ unsandboxed, because the changes that would sandbox it are exactly the ones
93
+ that weaken the container, and on a loopback-only desktop the container is
94
+ the stronger boundary. What that costs you is stated plainly.
95
+
5
96
  ## 0.9.0 — 2026-08-15 — "The Star Keeps Its Promise"
6
97
 
7
98
  - **A cell panel finally opens — through our own route, not the raw URL.** An
package/README.md CHANGED
@@ -11,6 +11,12 @@ NexusCrew turns live tmux sessions, AI CLI workers and connected machines into
11
11
  one local-first browser control plane. Your terminals stay real, your tools
12
12
  stay yours, and your infrastructure stays under your control.
13
13
 
14
+ > **Reading this as an AI agent?** Start with
15
+ > **[`skills/nexuscrew`](skills/nexuscrew/SKILL.md)**. It is the entry point:
16
+ > what the system is, what you can actually do through it, which companion
17
+ > skill covers which capability, where the trust boundaries are, and the rules
18
+ > that hold across all of them. Every other NexusCrew skill assumes it.
19
+
14
20
  <p align="center">
15
21
  <img src="docs/img/fleet-deck-desktop.png" width="960" alt="NexusCrew desktop deck with multiple live tmux sessions">
16
22
  </p>
@@ -143,10 +149,22 @@ product verifies a configured pool before it can rotate within it. See
143
149
  | [Operations](docs/OPERATIONS.md) | CLI, boot, backup, updates and diagnostics |
144
150
  | [Security](docs/SECURITY.md) | Trust boundaries, tokens and credential handling |
145
151
 
146
- The repository also includes [MCP companion guidance](MCP_COMPANIONS.md),
147
- the machine-readable [`mcp-companions.json`](mcp-companions.json), and portable
148
- skills for memory, searchable document memory, bounded worker delegation,
149
- mail assistance and form filling.
152
+ The repository also includes [MCP companion guidance](MCP_COMPANIONS.md) and
153
+ the machine-readable [`mcp-companions.json`](mcp-companions.json).
154
+
155
+ Portable skills ship with the package, and
156
+ [`nexuscrew`](skills/nexuscrew/SKILL.md) is the one to read first:
157
+
158
+ | Skill | Covers |
159
+ |---|---|
160
+ | [`nexuscrew`](skills/nexuscrew/SKILL.md) | **Start here** — the whole system and the rules across it |
161
+ | [`nexuscrew-agent`](skills/nexuscrew-agent/SKILL.md) | Talking to the human, runtime discovery, delivery to cells |
162
+ | [`live`](skills/live/SKILL.md) | Designating and permitting a node's Live host cell |
163
+ | [`aidesktop`](skills/aidesktop/SKILL.md) | A cell's web panel, and the AI Desktop container recipe |
164
+ | [`memory`](skills/memory/SKILL.md) | Persistent agent state |
165
+ | [`vl-msa`](skills/vl-msa/SKILL.md) | Searchable document memory |
166
+ | [`crew`](skills/crew/SKILL.md) | Bounded worker delegation |
167
+ | [`mail-assistant`](skills/mail-assistant/SKILL.md) | Mailbox discovery, triage and reading |
150
168
 
151
169
  ## Platforms
152
170