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.
Files changed (2) hide show
  1. package/CHANGELOG.md +168 -0
  2. 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.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.0",
41
- "chutes-build-darwin-x64": "1.0.0",
42
- "chutes-build-linux-arm64-gnu": "1.0.0",
43
- "chutes-build-linux-x64-gnu": "1.0.0",
44
- "chutes-build-win32-arm64": "1.0.0",
45
- "chutes-build-win32-x64": "1.0.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",