@mmmbuto/nexuscrew 0.9.75 → 0.9.76
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 +7 -0
- package/frontend/dist/assets/index-BURtPwUi.js +169 -0
- package/frontend/dist/index.html +1 -1
- package/frontend/dist/version.json +1 -1
- package/lib/fleet/builtin.js +64 -9
- package/lib/fleet/definitions.js +10 -1
- package/lib/fleet/managed.js +22 -2
- package/lib/fleet/model-discovery.js +287 -64
- package/package.json +1 -1
- package/frontend/dist/assets/index-DMfpKI3n.js +0 -169
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to NexusCrew are tracked here.
|
|
4
4
|
|
|
5
|
+
## 0.9.76 — 2026-10-19
|
|
6
|
+
|
|
7
|
+
- **A listing that refuses the request now says why, without guessing about the key.** The model listing in the engine editor carries a curated diagnosis built from facts the node already has: the credential's resolution state (none, configured, missing, unreadable), whether the credential header was actually applied to the request that failed, and whether a fresh cache answered instead of a request. The causes are fixed strings: a 401 without a credential is a missing key (naming the environment variable only when it is already public in the editor); a 401 with the header applied is a key the server did not accept, never a claim that the key is wrong or expired; a 403 is access denied with or without a key, because permissions and policy can produce it; an unreadable credential is unavailable, not missing; a network or timeout failure is an unreachable endpoint; any other status or an invalid response is a provider error; and a successful anonymous listing says the listing came back without a key, not that the endpoint never asks for one. A fresh cache answer makes no claim at all. The line stays visible with stale or backup data and with an empty list, and credential values never leave the node — not in the route, not in the cache, not in an error.
|
|
8
|
+
- **Missing fields are filled from the public catalog by model id, local endpoints included.** When the engine's explicit provider mapping does not carry a field, the catalog is searched by id in deterministic tiers: the mapped provider first, then the namespace of a vendor prefix recognized by an explicit table (only for this resolution, and the row keeps its original id), then global exact, case-folded, and the service suffix `:cloud`/`-cloud`. Within the winning tier every candidate is considered and the agreement is per field: a value enters only when at least one valid value exists and every valid value is equal; an absent or invalid value abstains instead of voting for zero or false; `false` is a value and conflicts with `true`; a conflict leaves the field absent and is counted in every tier, the mapped provider's namespace included, and a field is never counted twice. The snapshot index is built once per snapshot and never persisted, a single snapshot fetch serves the whole operation, and no model is added: only ids already in the proposal are enriched, with the cap and order unchanged. Ollama, LM Studio and a custom OpenAI-compatible endpoint in front of llama-server participate like any other engine, and their user or API values still win over a catalog default — the catalog value is a marked default, not a verification of what the runtime can load. No model id, endpoint or key is ever sent to the catalog, which is read without credentials.
|
|
9
|
+
- **This release supersedes the 0.9.75 sentence that a missing mapping means no data.** That sentence described 0.9.75's behavior and is left in its entry as written; from 0.9.76 an engine without a mapping still gets no mapped layer, but its models are enriched by id from the same credential-less snapshot, and the fallback chain on error remains valid snapshot, then backup, then the field absent.
|
|
10
|
+
- **A catalog value is shown as «models.dev · default», and every field can be made the operator's own.** Fields whose source is the public catalog carry that label in the view — mapped or found by id — in the panel's languages. The label lives in the view only: nothing is written by discovery and no default mark reaches the fleet file. Every field, on every row including one the APIs no longer list, gets an action that edits or confirms that field, and every row gets an action that groups the same controls; both use the same write path, so the field's source becomes the user for real and not just as a badge changed in memory. The dialog can be reused but no longer restricts booleans to digits. A number outside the parser's bounds is shown as an error next to its field and Confirm stays disabled, so an out-of-range value is never dropped silently and never produces a partial declaration; a value typed into the dialog is kept, and the dialog closes only after the write succeeds — if the write fails, the values stay there with a visible error that the periodic refresh does not clear. The view reloads after a successful confirmation, not before it.
|
|
11
|
+
- **All five visible parameters are stored now: contextWindow, maxTokens, tools, vision and reasoning.** Declarations accept `tools` and `vision` as typed booleans; edit and define accept them; the user layer projects them into discovery so an explicit `false` beats a catalog or API `true` before the merge; the federated schema declares the same shape; and definitions round-trip through backup and restore with `false` preserved. The three booleans are tri-state in the editor — leave empty, yes, no — so an empty field is an absence and `false` is a real answer that survives a re-read, a backup and a restore. The numeric bounds are the parser's (1024 to 100000000) in both dialogs that accept numbers, in the command and in the file, so a value a form accepts cannot fail the whole save, and a non-empty value outside them is rejected explicitly instead of being omitted from the patch. Cancel and leave-empty write nothing; the write actions appear only with the `edit-model` capability, and the engine, the original id, the other declarations and the cap are untouched. `deprecated`, prices and quantization are not edited here.
|
|
5
12
|
## 0.9.75 — 2026-10-19
|
|
6
13
|
|
|
7
14
|
- **The engine editor can now show the models an engine actually serves.** Every managed engine with an HTTP endpoint can be asked for its listing: one collector per endpoint kind (OpenAI-compatible, Anthropic, Ollama, llama-server, LM Studio) reads it with the same credentials the launcher uses — the key is resolved in memory, travels only in the request headers, and never reaches a file, a log or an error string. The section in the engine editor has a refresh button that forces a fresh fetch, shows every merged field with the layer it came from, marks the models the APIs no longer list, and names the proposal cap. The listing is a diagnostic read behind the same authentication as the editor: the engine's key and endpoint never cross the API route, the answers are curated, and the errors are fixed strings. The llama-server collector only reads the listing route plus one properties call for the resident model and never issues per-model requests, because a single-model router can unload its resident model on them.
|