on main help sign in
Merge remote-tracking branch 'origin/main' into onboarding
4cde644Kujtim Hoxha
.github/workflows/nightly.yml+19
@@ -6,7 +6,26 @@ on:
6 workflow_dispatch: # allows manual triggering
6 workflow_dispatch: # allows manual triggering
7
7
8jobs:
8jobs:
9+ check:
10+ runs-on: ubuntu-latest
11+ outputs:
12+ should_run: ${{ steps.check.outputs.should_run }}
13+ steps:
14+ - uses: actions/checkout@v4
15+ with:
16+ fetch-depth: 1
17+ - id: check
18+ env:
19+ GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
20+ run: |
21+ if gh run list --workflow nightly.yml -c $(git rev-parse HEAD) -s success | grep 'completed'; then
22+ echo "should_run=false" >> $GITHUB_OUTPUT
23+ else
24+ echo "should_run=true" >> $GITHUB_OUTPUT
25+ fi
9 nightly:
26 nightly:
27+ needs: check
28+ if: needs.check.outputs.should_run == 'true'
10 uses: charmbracelet/meta/.github/workflows/nightly.yml@main
29 uses: charmbracelet/meta/.github/workflows/nightly.yml@main
11 secrets:
30 secrets:
12 goreleaser_key: ${{ secrets.GORELEASER_KEY }}
31 goreleaser_key: ${{ secrets.GORELEASER_KEY }}
go.mod+1−1
@@ -23,7 +23,7 @@ require (
23 github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.2.0.20250703152125-8e1c474f8a71
23 github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.2.0.20250703152125-8e1c474f8a71
24 github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706
24 github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706
25 github.com/charmbracelet/x/ansi v0.9.3
25 github.com/charmbracelet/x/ansi v0.9.3
26− github.com/charmbracelet/x/exp/charmtone v0.0.0-20250627134340-c144409e381c
26+ github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3
27 github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a
27 github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a
28 github.com/disintegration/imageorient v0.0.0-20180920195336-8147d86e83ec
28 github.com/disintegration/imageorient v0.0.0-20180920195336-8147d86e83ec
29 github.com/fsnotify/fsnotify v1.8.0
29 github.com/fsnotify/fsnotify v1.8.0
go.sum+2
@@ -90,6 +90,8 @@ github.com/charmbracelet/x/cellbuf v0.0.14-0.20250516160309-24eee56f89fa h1:lphz
90github.com/charmbracelet/x/cellbuf v0.0.14-0.20250516160309-24eee56f89fa/go.mod h1:xBlh2Yi3DL3zy/2n15kITpg0YZardf/aa/hgUaIM6Rk=
90github.com/charmbracelet/x/cellbuf v0.0.14-0.20250516160309-24eee56f89fa/go.mod h1:xBlh2Yi3DL3zy/2n15kITpg0YZardf/aa/hgUaIM6Rk=
91github.com/charmbracelet/x/exp/charmtone v0.0.0-20250627134340-c144409e381c h1:2GELBLPgfSbHU53bsQhR9XIgNuVZ6w+Rz8RWV5Lq+A4=
91github.com/charmbracelet/x/exp/charmtone v0.0.0-20250627134340-c144409e381c h1:2GELBLPgfSbHU53bsQhR9XIgNuVZ6w+Rz8RWV5Lq+A4=
92github.com/charmbracelet/x/exp/charmtone v0.0.0-20250627134340-c144409e381c/go.mod h1:T9jr8CzFpjhFVHjNjKwbAD7KwBNyFnj2pntAO7F2zw0=
92github.com/charmbracelet/x/exp/charmtone v0.0.0-20250627134340-c144409e381c/go.mod h1:T9jr8CzFpjhFVHjNjKwbAD7KwBNyFnj2pntAO7F2zw0=
93+github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3 h1:1xwHZg6eMZ9Wv5TE1UGub6ARubyOd1Lo5kPUI/6VL50=
94+github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3/go.mod h1:T9jr8CzFpjhFVHjNjKwbAD7KwBNyFnj2pntAO7F2zw0=
93github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a h1:FsHEJ52OC4VuTzU8t+n5frMjLvpYWEznSr/u8tnkCYw=
95github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a h1:FsHEJ52OC4VuTzU8t+n5frMjLvpYWEznSr/u8tnkCYw=
94github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
96github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
95github.com/charmbracelet/x/exp/slice v0.0.0-20250611152503-f53cdd7e01ef h1:v7qwsZ2OxzlwvpKwz8dtZXp7fIJlcDEUOyFBNE4fz4Q=
97github.com/charmbracelet/x/exp/slice v0.0.0-20250611152503-f53cdd7e01ef h1:v7qwsZ2OxzlwvpKwz8dtZXp7fIJlcDEUOyFBNE4fz4Q=
internal/llm/agent/agent.go+1−1
@@ -26,7 +26,7 @@ import (
26
26
27// Common errors
27// Common errors
28var (
28var (
29− ErrRequestCancelled = errors.New("request cancelled by user")
29+ ErrRequestCancelled = errors.New("request canceled by user")
30 ErrSessionBusy = errors.New("session is currently processing another request")
30 ErrSessionBusy = errors.New("session is currently processing another request")
31)
31)
32
32
internal/tui/components/chat/editor/editor.go+7−3
@@ -80,7 +80,7 @@ const (
80 maxAttachments = 5
80 maxAttachments = 5
81)
81)
82
82
83−func (m *editorCmp) openEditor() tea.Cmd {
83+func (m *editorCmp) openEditor(value string) tea.Cmd {
84 editor := os.Getenv("EDITOR")
84 editor := os.Getenv("EDITOR")
85 if editor == "" {
85 if editor == "" {
86 // Use platform-appropriate default editor
86 // Use platform-appropriate default editor
@@ -95,7 +95,10 @@ func (m *editorCmp) openEditor() tea.Cmd {
95 if err != nil {
95 if err != nil {
96 return util.ReportError(err)
96 return util.ReportError(err)
97 }
97 }
98− tmpfile.Close()
98+ defer tmpfile.Close() //nolint:errcheck
99+ if _, err := tmpfile.WriteString(value); err != nil {
100+ return util.ReportError(err)
101+ }
99 c := exec.Command(editor, tmpfile.Name())
102 c := exec.Command(editor, tmpfile.Name())
100 c.Stdin = os.Stdin
103 c.Stdin = os.Stdin
101 c.Stdout = os.Stdout
104 c.Stdout = os.Stdout
@@ -247,7 +250,7 @@ func (m *editorCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
247 if m.app.CoderAgent.IsSessionBusy(m.session.ID) {
250 if m.app.CoderAgent.IsSessionBusy(m.session.ID) {
248 return m, util.ReportWarn("Agent is working, please wait...")
251 return m, util.ReportWarn("Agent is working, please wait...")
249 }
252 }
250− return m, m.openEditor()
253+ return m, m.openEditor(m.textarea.Value())
251 }
254 }
252 if key.Matches(msg, DeleteKeyMaps.Escape) {
255 if key.Matches(msg, DeleteKeyMaps.Escape) {
253 m.deleteMode = false
256 m.deleteMode = false
@@ -379,6 +382,7 @@ func (c *editorCmp) IsFocused() bool {
379 return c.textarea.Focused()
382 return c.textarea.Focused()
380}
383}
381
384
385+// Bindings implements Container.
382func (c *editorCmp) Bindings() []key.Binding {
386func (c *editorCmp) Bindings() []key.Binding {
383 return c.keyMap.KeyBindings()
387 return c.keyMap.KeyBindings()
384}
388}
internal/tui/components/chat/messages/renderer.go+2−2
@@ -632,9 +632,9 @@ func earlyState(header string, v *toolCallCmp) (string, bool) {
632 case v.result.IsError:
632 case v.result.IsError:
633 message = v.renderToolError()
633 message = v.renderToolError()
634 case v.cancelled:
634 case v.cancelled:
635− message = t.S().Base.Padding(0, 1).Background(t.Border).Render("Cancelled")
635+ message = t.S().Base.Foreground(t.FgSubtle).Render("Canceled.")
636 case v.result.ToolCallID == "":
636 case v.result.ToolCallID == "":
637− message = t.S().Base.Padding(0, 1).Background(t.Accent).Foreground(t.FgSubtle).Render("Waiting for tool to start...")
637+ message = t.S().Base.Foreground(t.FgSubtle).Render("Waiting for tool to start...")
638 default:
638 default:
639 return "", false
639 return "", false
640 }
640 }
internal/tui/styles/crush.go+1−1
@@ -16,7 +16,7 @@ func NewCrushTheme() *Theme {
16
16
17 // Backgrounds
17 // Backgrounds
18 BgBase: charmtone.Pepper,
18 BgBase: charmtone.Pepper,
19− BgBaseLighter: Lighten(charmtone.Pepper, 2),
19+ BgBaseLighter: charmtone.BBQ,
20 BgSubtle: charmtone.Charcoal,
20 BgSubtle: charmtone.Charcoal,
21 BgOverlay: charmtone.Iron,
21 BgOverlay: charmtone.Iron,
22
22
vendor/github.com/charmbracelet/x/exp/charmtone/charmtone.go+52−6
@@ -65,7 +65,7 @@ const (
65 Citron
65 Citron
66 Zest
66 Zest
67 Pepper
67 Pepper
68− Barbeque
68+ BBQ
69 Charcoal
69 Charcoal
70 Iron
70 Iron
71 Oyster
71 Oyster
@@ -74,6 +74,22 @@ const (
74 Ash
74 Ash
75 Salt
75 Salt
76 Butter
76 Butter
77+
78+ // Diffs: additions. The brightest color in this set is Julep, defined
79+ // above.
80+ Pickle
81+ Gator
82+ Spinach
83+
84+ // Diffs: deletions. The brightest color in this set is Cherry, defined
85+ // above.
86+ Pom
87+ Steak
88+ Toast
89+
90+ // Provisional.
91+ NeueGuac
92+ NeueZinc
77)
93)
78
94
79// RGBA returns the red, green, blue, and alpha values of the color. It
95// RGBA returns the red, green, blue, and alpha values of the color. It
@@ -139,7 +155,7 @@ func (k Key) String() string {
139 Citron: "Citron",
155 Citron: "Citron",
140 Zest: "Zest",
156 Zest: "Zest",
141 Pepper: "Pepper",
157 Pepper: "Pepper",
142− Barbeque: "Barbeque",
158+ BBQ: "BBQ",
143 Charcoal: "Charcoal",
159 Charcoal: "Charcoal",
144 Iron: "Iron",
160 Iron: "Iron",
145 Oyster: "Oyster",
161 Oyster: "Oyster",
@@ -148,6 +164,20 @@ func (k Key) String() string {
148 Salt: "Salt",
164 Salt: "Salt",
149 Ash: "Ash",
165 Ash: "Ash",
150 Butter: "Butter",
166 Butter: "Butter",
167+
168+ // Diffs: additions.
169+ Pickle: "Pickle",
170+ Gator: "Gator",
171+ Spinach: "Spinach",
172+
173+ // Diffs: deletions.
174+ Pom: "Pom",
175+ Steak: "Steak",
176+ Toast: "Toast",
177+
178+ // Provisional.
179+ NeueGuac: "Neue Guac",
180+ NeueZinc: "Neue Zinc",
151 }[k]
181 }[k]
152}
182}
153
183
@@ -193,17 +223,17 @@ func (k Key) Hex() string {
193 Damson: "#007AB8",
223 Damson: "#007AB8",
194 Malibu: "#00A4FF",
224 Malibu: "#00A4FF",
195 Sardine: "#4FBEFE",
225 Sardine: "#4FBEFE",
196− Zinc: "#0e9996",
226+ Zinc: "#10B1AE",
197 Turtle: "#0ADCD9",
227 Turtle: "#0ADCD9",
198 Lichen: "#5CDFEA",
228 Lichen: "#5CDFEA",
199− Guac: "#00b875",
229+ Guac: "#12C78F",
200 Julep: "#00FFB2",
230 Julep: "#00FFB2",
201 Bok: "#68FFD6",
231 Bok: "#68FFD6",
202 Mustard: "#F5EF34",
232 Mustard: "#F5EF34",
203 Citron: "#E8FF27",
233 Citron: "#E8FF27",
204 Zest: "#E8FE96",
234 Zest: "#E8FE96",
205 Pepper: "#201F26",
235 Pepper: "#201F26",
206− Barbeque: "#2d2c35",
236+ BBQ: "#2d2c35",
207 Charcoal: "#3A3943",
237 Charcoal: "#3A3943",
208 Iron: "#4D4C57",
238 Iron: "#4D4C57",
209 Oyster: "#605F6B",
239 Oyster: "#605F6B",
@@ -212,6 +242,20 @@ func (k Key) Hex() string {
212 Ash: "#DFDBDD",
242 Ash: "#DFDBDD",
213 Salt: "#F1EFEF",
243 Salt: "#F1EFEF",
214 Butter: "#FFFAF1",
244 Butter: "#FFFAF1",
245+
246+ // Diffs: additions.
247+ Pickle: "#00A475",
248+ Gator: "#18463D",
249+ Spinach: "#1C3634",
250+
251+ // Diffs: deletions.
252+ Pom: "#AB2454",
253+ Steak: "#582238",
254+ Toast: "#412130",
255+
256+ // Provisional.
257+ NeueGuac: "#00b875",
258+ NeueZinc: "#0e9996",
215 }[k]
259 }[k]
216}
260}
217
261
@@ -267,7 +311,7 @@ func Keys() []Key {
267 Citron,
311 Citron,
268 Zest,
312 Zest,
269 Pepper,
313 Pepper,
270− Barbeque,
314+ BBQ,
271 Charcoal,
315 Charcoal,
272 Iron,
316 Iron,
273 Oyster,
317 Oyster,
@@ -276,6 +320,8 @@ func Keys() []Key {
276 Ash,
320 Ash,
277 Salt,
321 Salt,
278 Butter,
322 Butter,
323+
324+ // XXX: additions and deletions are not included, yet.
279 }
325 }
280}
326}
281
327
vendor/modules.txt+1−1
@@ -289,7 +289,7 @@ github.com/charmbracelet/x/ansi/parser
289# github.com/charmbracelet/x/cellbuf v0.0.14-0.20250516160309-24eee56f89fa
289# github.com/charmbracelet/x/cellbuf v0.0.14-0.20250516160309-24eee56f89fa
290## explicit; go 1.23.0
290## explicit; go 1.23.0
291github.com/charmbracelet/x/cellbuf
291github.com/charmbracelet/x/cellbuf
292−# github.com/charmbracelet/x/exp/charmtone v0.0.0-20250627134340-c144409e381c
292+# github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3
293## explicit; go 1.23.0
293## explicit; go 1.23.0
294github.com/charmbracelet/x/exp/charmtone
294github.com/charmbracelet/x/exp/charmtone
295# github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a
295# github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a