chutes-build 1.0.0 → 1.0.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.
- package/CHANGELOG.md +168 -0
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,133 @@ project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [1.0.2] - 2026-08-11
|
|
10
|
+
|
|
11
|
+
Three faults a user meets in the first minute. All reproduced against the live
|
|
12
|
+
service with a real API key, not inferred from the source.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- **`/model` offered a single model.** `ModelFetchAuth::resolve` treated any stored
|
|
17
|
+
credential as a *session*, and logging in with an API key stores one — so
|
|
18
|
+
`auth.json` holding a `chutes::api_key` entry sent the catalogue fetch down the
|
|
19
|
+
session path, which asks the router proxy. That proxy advertises exactly one
|
|
20
|
+
model: itself. `llm.chutes.ai/v1/models` returns thirteen. The request URL was
|
|
21
|
+
already right for API keys; only the classification was wrong. `models` now
|
|
22
|
+
lists all fourteen, with the configured default marked — a default the product
|
|
23
|
+
previously could not resolve even when the user had named it.
|
|
24
|
+
- **"Sign in with Chutes" could not complete.** The re-base replaced the fork's
|
|
25
|
+
OAuth scopes with upstream's — `grok-cli:access`, `api:access`,
|
|
26
|
+
`conversations:*`, `workspaces:*` — none of which exist at `api.chutes.ai`. Its
|
|
27
|
+
discovery document offers `account:read`, `chutes:read`, `chutes:invoke`; an
|
|
28
|
+
authorization server rejects scopes it does not know. Restored to the minimum the
|
|
29
|
+
client uses. OAuth still requires an application you register yourself at
|
|
30
|
+
[chutes.ai](https://chutes.ai/docs/sign-in-with-chutes/overview) — there is no
|
|
31
|
+
shared client id, by design — and the API key remains the primary method.
|
|
32
|
+
- **The welcome screen disagreed with its own input bar.** The wordmark blended
|
|
33
|
+
from a fixed gray because the re-base replaced `theme.accent_assistant` with
|
|
34
|
+
upstream's `theme.gray`. It takes the accent again, so the centre of the screen
|
|
35
|
+
and the prompt border move together.
|
|
36
|
+
- The feedback prompt's default still read "You've been using Grok Code
|
|
37
|
+
productively!". It lives in `prod/mc/cli-chat-proxy-types`, outside the crates
|
|
38
|
+
the 1.0.1 sweep looked at — found by searching the shipped binary rather than
|
|
39
|
+
the tree.
|
|
40
|
+
|
|
41
|
+
### Changed
|
|
42
|
+
|
|
43
|
+
- **Silver is the brand accent.** Not a rename of the green: in this palette one
|
|
44
|
+
constant carried both the brand and the *meaning* of success and of a diff's
|
|
45
|
+
insertion side. Those are now two families. `SILVER` takes the chrome — wordmark,
|
|
46
|
+
assistant, model and command labels, active prompt border, H1 rule — and green
|
|
47
|
+
stays exactly where it says something, because a silver diff against a red one is
|
|
48
|
+
unreadable. The silver is cool on purpose: these neutral grays are warm, so a
|
|
49
|
+
warm silver would sink into the furniture.
|
|
50
|
+
|
|
51
|
+
## [1.0.1] - 2026-08-11
|
|
52
|
+
|
|
53
|
+
### Fixed (the TUI wore upstream's identity)
|
|
54
|
+
|
|
55
|
+
- **The splash showed Grok's wordmark.** `assets/logo/logo07.txt` and
|
|
56
|
+
`logo05.txt` were byte-identical to upstream's: the re-base overwrote the Chutes
|
|
57
|
+
wordmark and 1.0.0 shipped it, so every start drew the wrong brand. Restored. A
|
|
58
|
+
sweep of every asset in the tree says these two were the only ones taken.
|
|
59
|
+
- **A Chutes user was offered a subscription to another company's product.**
|
|
60
|
+
Hitting a usage limit produced "Upgrade to SuperGrok" and "Upgrade to SuperGrok
|
|
61
|
+
Heavy"; a restricted command said it "requires SuperGrok". The buttons already
|
|
62
|
+
pointed at chutes.ai/pricing — the fork had rebranded where they *go* and left
|
|
63
|
+
what they *say*. This one predates the re-base; v0.4.3 carries the same strings.
|
|
64
|
+
- The screen-mode settings described opening "plain grok", the welcome gate read
|
|
65
|
+
"SuperGrok subscription required", and the feedback prompt opened with "You've
|
|
66
|
+
been using Grok Code productively!".
|
|
67
|
+
|
|
68
|
+
Rust identifiers, crate names, telemetry event types and model ids such as
|
|
69
|
+
`grok-4.5` are deliberately untouched: `AGENTS.md` keeps them so upstream diffs
|
|
70
|
+
stay readable, and a model name is data rather than branding.
|
|
71
|
+
|
|
72
|
+
The wordmark's hash is now pinned by a test, so a merge that takes upstream's
|
|
73
|
+
side there fails instead of shipping. The loss was silent by nature: nothing
|
|
74
|
+
compiles differently, no test read the bytes, and the only symptom was on screen.
|
|
75
|
+
|
|
76
|
+
### Security
|
|
77
|
+
|
|
78
|
+
- **The `agent serve` token comparison no longer rests on a function that
|
|
79
|
+
disclaims the property it was chosen for.** It used
|
|
80
|
+
`ring::constant_time::verify_slices_are_equal`, which ring now deprecates as an
|
|
81
|
+
"internal function not intended for external use with no promises regarding side
|
|
82
|
+
channels" — while the reason for calling it at all is that `==` on `&str` returns
|
|
83
|
+
at the first differing byte, and over a socket with no rate limit that leaks the
|
|
84
|
+
token one byte at a time. It now uses `subtle::ConstantTimeEq`, which is
|
|
85
|
+
maintained for this and also resists the compiler folding the comparison back
|
|
86
|
+
into an early return. No new code enters the build: `subtle` was already in the
|
|
87
|
+
graph through rustls, so the lock file moves by one line.
|
|
88
|
+
|
|
89
|
+
### Fixed
|
|
90
|
+
|
|
91
|
+
- **`--help` had upstream's branding back in it.** The re-base took upstream's
|
|
92
|
+
wording over the fork's in five places a user reads, three of them flag *names*:
|
|
93
|
+
`--grok-ws-origin` and `--grok-ws-url`, which 0.4.3 spelled `--chutes-ws-*` and
|
|
94
|
+
kept hidden, so the re-base both renamed them and put internal plumbing into the
|
|
95
|
+
top-level help; `--xai-api-base-url`, described as "the public xAI API base URL"
|
|
96
|
+
when it overrides the Chutes inference base URL; the positional-prompt example,
|
|
97
|
+
which read ``grok "fix the bug"`` beside a `chutes-build` example on the same
|
|
98
|
+
line; and the `screen_mode` help, which said "To default plain `grok` to
|
|
99
|
+
minimal". Found by installing the published 1.0.0 the way a user gets it and
|
|
100
|
+
reading every help surface — the step the release procedure asks for and which
|
|
101
|
+
had not been done. `leader/mod.rs` passes those flags to the child process, so
|
|
102
|
+
the rename covers it too.
|
|
103
|
+
|
|
104
|
+
### Repository and CI
|
|
105
|
+
|
|
106
|
+
- **`xai-grok-shell --lib auth::` runs on Windows.** It failed 24 there, and the
|
|
107
|
+
CI step had never executed at all, because the pager step above it always failed
|
|
108
|
+
first. A provider command goes through `cmd /C` off Unix — deliberately, for
|
|
109
|
+
exit-code propagation — while the fixtures were POSIX one-liners. They now drive
|
|
110
|
+
`auth-provider-fixture`, a real helper invoked with `args`, so no shell
|
|
111
|
+
interprets them. Two lock tests read the lock file through a second handle while
|
|
112
|
+
holding it, which Windows refuses; they read through the holding handle now, as
|
|
113
|
+
the product does.
|
|
114
|
+
- **The Linux job reaches its end.** It had not passed in the last twenty runs, so
|
|
115
|
+
four steps below the failure — auth and session integration, agent construction
|
|
116
|
+
and bundled skills, Chutes-native tools, and clippy — had not run either. Behind
|
|
117
|
+
them were a banned `tokio::process::Command::spawn` in a test the ban does not
|
|
118
|
+
describe, and a doc comment separated from the function it documents.
|
|
119
|
+
- **That job's 60-minute limit was sized for the broken state.** The first run to
|
|
120
|
+
reach the end spent 59.7 minutes on work that passed and was killed during the
|
|
121
|
+
cache *save* — which left the next run cold, slower, and killed in the same
|
|
122
|
+
place. Raised to 90, matching Windows. Measured twice since at 65 and 67 minutes:
|
|
123
|
+
the cost is roughly 45 minutes of tests plus 11 of clippy, not compilation, so a
|
|
124
|
+
warm cache moves it very little and the headroom is about a quarter.
|
|
125
|
+
- **All five CI jobs pass.** Windows had been red since 1.0.0 landed and Linux had
|
|
126
|
+
not finished in over twenty runs; this is the first complete green run.
|
|
127
|
+
- `RUSTSEC-2026-0249` is recorded in `deny.toml`: `smartstring` is unmaintained —
|
|
128
|
+
archived, not vulnerable — and reaches this tree only as a non-optional
|
|
129
|
+
dependency of `rhai`, whose latest stable we already use, so no bump closes it.
|
|
130
|
+
It turned the dependency job red on a documentation-only commit, an hour after
|
|
131
|
+
the same check passed, because that job reads the live advisory database.
|
|
132
|
+
- A flaky history-delivery test asked for a repaint and a result in one condition;
|
|
133
|
+
it fails when the daemon is *fast* enough to answer before the eager snapshot,
|
|
134
|
+
which is why widening its deadline had not helped.
|
|
135
|
+
|
|
9
136
|
## [1.0.0] - 2026-08-07
|
|
10
137
|
|
|
11
138
|
Chutes Build is re-based onto `xai-org/grok-build` 1.0.0 (`afbc0fb`) and adopts
|
|
@@ -99,6 +226,47 @@ upstream instead:
|
|
|
99
226
|
578. Two were real defects rather than test bugs: the trust hole above, and a
|
|
100
227
|
home-directory guard no test on Windows could reach.
|
|
101
228
|
|
|
229
|
+
### Fixed (Windows, and these were the product)
|
|
230
|
+
|
|
231
|
+
The pager's Windows suite had sixty-six failures. Most were fixtures written for
|
|
232
|
+
POSIX, but five were defects users would meet:
|
|
233
|
+
|
|
234
|
+
- **`doctor fix` could not apply anything.** The managed-config writer opened the
|
|
235
|
+
parent directory as a file, to `sync_all` it after the rename. That sync is
|
|
236
|
+
Unix-only — Windows has no durability barrier for a directory — so off Unix the
|
|
237
|
+
handle was captured and never read, and Windows cannot produce one at all:
|
|
238
|
+
`File::open` on a directory needs `FILE_FLAG_BACKUP_SEMANTICS`, which `std` does
|
|
239
|
+
not set. Every fix planned, then failed to write, reporting "access denied"
|
|
240
|
+
against the directory rather than the file.
|
|
241
|
+
- **No file path written in agent prose was clickable.** The scanner that turns
|
|
242
|
+
paths into `file://` overlays matched `~?/…` only, so `C:\Users\me\x.md` was
|
|
243
|
+
never recognised. Only tool headers worked, because those receive the path
|
|
244
|
+
directly instead of finding it in text.
|
|
245
|
+
- **Tab completion in the extensions modal destroyed the path.** It rebuilt the
|
|
246
|
+
directory prefix by looking for a `/`; a Windows path has none, so completing
|
|
247
|
+
`C:\src\plugin-s` replaced the whole field with `plugin-source`. The directory
|
|
248
|
+
listing, gated on the text ending in `/`, never triggered either.
|
|
249
|
+
- **The memory-search header showed `\MEMORY.md`.** The path shortener looked for
|
|
250
|
+
`/` alone, so the separator after the memory root survived — and a nested result
|
|
251
|
+
was not shortened at all, painting the whole `\xai-…\sessions\…` tail.
|
|
252
|
+
- **A test fixture named `nul` proved nothing**, because on Windows that name is
|
|
253
|
+
the null device wherever it appears: the write went nowhere and the NUL-byte
|
|
254
|
+
refusal it existed to check was never reached.
|
|
255
|
+
|
|
256
|
+
### Fixed (releases carried an unstripped binary)
|
|
257
|
+
|
|
258
|
+
`release-dist` keeps symbols on purpose, for sidecars extracted "before stripping
|
|
259
|
+
post-build" — and that post-build strip had never been written. The npm packages
|
|
260
|
+
therefore shipped the profile's full DWARF: `linux-arm64-gnu` reached 938 MB
|
|
261
|
+
unpacked and the registry refused it outright with `413 Payload Too Large`.
|
|
262
|
+
Stripping now happens between the build and the smoke test, so the run check, the
|
|
263
|
+
package, its checksum and the release asset all see the binary that ships. Linux
|
|
264
|
+
falls from ~890 MB to ~130 MB; Windows needs none, since MSVC keeps debug info in
|
|
265
|
+
a separate `.pdb`.
|
|
266
|
+
|
|
267
|
+
The macOS packages for this version were published before that fix and are larger
|
|
268
|
+
than the rest; they cannot be replaced, because an npm version is immutable.
|
|
269
|
+
|
|
102
270
|
### Authentication
|
|
103
271
|
|
|
104
272
|
Upstream ships an OAuth application everyone signs in through, so its
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chutes-build",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Privacy-first, open-source coding agent for the Chutes ecosystem",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Michael Gasperini (Mikesoft)",
|
|
@@ -37,12 +37,12 @@
|
|
|
37
37
|
"check": "npm test && npm run verify:release && npm pack --dry-run"
|
|
38
38
|
},
|
|
39
39
|
"optionalDependencies": {
|
|
40
|
-
"chutes-build-darwin-arm64": "1.0.
|
|
41
|
-
"chutes-build-darwin-x64": "1.0.
|
|
42
|
-
"chutes-build-linux-arm64-gnu": "1.0.
|
|
43
|
-
"chutes-build-linux-x64-gnu": "1.0.
|
|
44
|
-
"chutes-build-win32-arm64": "1.0.
|
|
45
|
-
"chutes-build-win32-x64": "1.0.
|
|
40
|
+
"chutes-build-darwin-arm64": "1.0.2",
|
|
41
|
+
"chutes-build-darwin-x64": "1.0.2",
|
|
42
|
+
"chutes-build-linux-arm64-gnu": "1.0.2",
|
|
43
|
+
"chutes-build-linux-x64-gnu": "1.0.2",
|
|
44
|
+
"chutes-build-win32-arm64": "1.0.2",
|
|
45
|
+
"chutes-build-win32-x64": "1.0.2"
|
|
46
46
|
},
|
|
47
47
|
"keywords": [
|
|
48
48
|
"ai",
|