diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 1e271bbb6e180557b241a6ab5e40acf7b82705df..2589af4376279ce3fc5902d370f7b85bad1dcff6 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -6,7 +6,26 @@ on: workflow_dispatch: # allows manual triggering jobs: + check: + runs-on: ubuntu-latest + outputs: + should_run: ${{ steps.check.outputs.should_run }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 1 + - id: check + env: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + run: | + if gh run list --workflow nightly.yml -c $(git rev-parse HEAD) -s success | grep 'completed'; then + echo "should_run=false" >> $GITHUB_OUTPUT + else + echo "should_run=true" >> $GITHUB_OUTPUT + fi nightly: + needs: check + if: needs.check.outputs.should_run == 'true' uses: charmbracelet/meta/.github/workflows/nightly.yml@main secrets: goreleaser_key: ${{ secrets.GORELEASER_KEY }} diff --git a/go.mod b/go.mod index 128e04842feca31ebb4a7f8529149e13e4578f06..60027a0dcdbafe0a7482a1cc29df65a2a8e515ae 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.2.0.20250703152125-8e1c474f8a71 github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706 github.com/charmbracelet/x/ansi v0.9.3 - github.com/charmbracelet/x/exp/charmtone v0.0.0-20250627134340-c144409e381c + github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3 github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a github.com/disintegration/imageorient v0.0.0-20180920195336-8147d86e83ec github.com/fsnotify/fsnotify v1.8.0 diff --git a/go.sum b/go.sum index d35233348b9c20b1d5556294a2f2bce4b2f9e2a9..19a95dddf7907257558b02b0dece77e8482a0067 100644 --- a/go.sum +++ b/go.sum @@ -90,6 +90,8 @@ github.com/charmbracelet/x/cellbuf v0.0.14-0.20250516160309-24eee56f89fa h1:lphz github.com/charmbracelet/x/cellbuf v0.0.14-0.20250516160309-24eee56f89fa/go.mod h1:xBlh2Yi3DL3zy/2n15kITpg0YZardf/aa/hgUaIM6Rk= github.com/charmbracelet/x/exp/charmtone v0.0.0-20250627134340-c144409e381c h1:2GELBLPgfSbHU53bsQhR9XIgNuVZ6w+Rz8RWV5Lq+A4= github.com/charmbracelet/x/exp/charmtone v0.0.0-20250627134340-c144409e381c/go.mod h1:T9jr8CzFpjhFVHjNjKwbAD7KwBNyFnj2pntAO7F2zw0= +github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3 h1:1xwHZg6eMZ9Wv5TE1UGub6ARubyOd1Lo5kPUI/6VL50= +github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3/go.mod h1:T9jr8CzFpjhFVHjNjKwbAD7KwBNyFnj2pntAO7F2zw0= github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a h1:FsHEJ52OC4VuTzU8t+n5frMjLvpYWEznSr/u8tnkCYw= github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= github.com/charmbracelet/x/exp/slice v0.0.0-20250611152503-f53cdd7e01ef h1:v7qwsZ2OxzlwvpKwz8dtZXp7fIJlcDEUOyFBNE4fz4Q= diff --git a/internal/llm/agent/agent.go b/internal/llm/agent/agent.go index 6d9a825f600e79d3161c6b653669abe8773db116..313b83c0448d8a668e2390368c6797c82dd22452 100644 --- a/internal/llm/agent/agent.go +++ b/internal/llm/agent/agent.go @@ -26,7 +26,7 @@ import ( // Common errors var ( - ErrRequestCancelled = errors.New("request cancelled by user") + ErrRequestCancelled = errors.New("request canceled by user") ErrSessionBusy = errors.New("session is currently processing another request") ) diff --git a/internal/tui/components/chat/editor/editor.go b/internal/tui/components/chat/editor/editor.go index 7988861caded2e6c9a1f9a50125f62638d10a230..e6f354b7562bac99ffb8d380eb72fb7780b28240 100644 --- a/internal/tui/components/chat/editor/editor.go +++ b/internal/tui/components/chat/editor/editor.go @@ -80,7 +80,7 @@ const ( maxAttachments = 5 ) -func (m *editorCmp) openEditor() tea.Cmd { +func (m *editorCmp) openEditor(value string) tea.Cmd { editor := os.Getenv("EDITOR") if editor == "" { // Use platform-appropriate default editor @@ -95,7 +95,10 @@ func (m *editorCmp) openEditor() tea.Cmd { if err != nil { return util.ReportError(err) } - tmpfile.Close() + defer tmpfile.Close() //nolint:errcheck + if _, err := tmpfile.WriteString(value); err != nil { + return util.ReportError(err) + } c := exec.Command(editor, tmpfile.Name()) c.Stdin = os.Stdin c.Stdout = os.Stdout @@ -247,7 +250,7 @@ func (m *editorCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if m.app.CoderAgent.IsSessionBusy(m.session.ID) { return m, util.ReportWarn("Agent is working, please wait...") } - return m, m.openEditor() + return m, m.openEditor(m.textarea.Value()) } if key.Matches(msg, DeleteKeyMaps.Escape) { m.deleteMode = false @@ -379,6 +382,7 @@ func (c *editorCmp) IsFocused() bool { return c.textarea.Focused() } +// Bindings implements Container. func (c *editorCmp) Bindings() []key.Binding { return c.keyMap.KeyBindings() } diff --git a/internal/tui/components/chat/messages/renderer.go b/internal/tui/components/chat/messages/renderer.go index e11cffc53392c1683a514130948155e423f222c7..b686c2a3267a1f69bcfb872e77be2734639bd091 100644 --- a/internal/tui/components/chat/messages/renderer.go +++ b/internal/tui/components/chat/messages/renderer.go @@ -632,9 +632,9 @@ func earlyState(header string, v *toolCallCmp) (string, bool) { case v.result.IsError: message = v.renderToolError() case v.cancelled: - message = t.S().Base.Padding(0, 1).Background(t.Border).Render("Cancelled") + message = t.S().Base.Foreground(t.FgSubtle).Render("Canceled.") case v.result.ToolCallID == "": - message = t.S().Base.Padding(0, 1).Background(t.Accent).Foreground(t.FgSubtle).Render("Waiting for tool to start...") + message = t.S().Base.Foreground(t.FgSubtle).Render("Waiting for tool to start...") default: return "", false } diff --git a/internal/tui/styles/crush.go b/internal/tui/styles/crush.go index f59b78ac2202a268337af48913fd2e3a397f4ef5..48911d7096f7b0d104b0361ae5f6632c9658e536 100644 --- a/internal/tui/styles/crush.go +++ b/internal/tui/styles/crush.go @@ -16,7 +16,7 @@ func NewCrushTheme() *Theme { // Backgrounds BgBase: charmtone.Pepper, - BgBaseLighter: Lighten(charmtone.Pepper, 2), + BgBaseLighter: charmtone.BBQ, BgSubtle: charmtone.Charcoal, BgOverlay: charmtone.Iron, diff --git a/vendor/github.com/charmbracelet/x/exp/charmtone/charmtone.go b/vendor/github.com/charmbracelet/x/exp/charmtone/charmtone.go index 48cb93adfb19bfedfcda0e1ce2fcb42c2f64785e..6e32f7f5405de89eeea58003f8860e255861ccee 100644 --- a/vendor/github.com/charmbracelet/x/exp/charmtone/charmtone.go +++ b/vendor/github.com/charmbracelet/x/exp/charmtone/charmtone.go @@ -65,7 +65,7 @@ const ( Citron Zest Pepper - Barbeque + BBQ Charcoal Iron Oyster @@ -74,6 +74,22 @@ const ( Ash Salt Butter + + // Diffs: additions. The brightest color in this set is Julep, defined + // above. + Pickle + Gator + Spinach + + // Diffs: deletions. The brightest color in this set is Cherry, defined + // above. + Pom + Steak + Toast + + // Provisional. + NeueGuac + NeueZinc ) // RGBA returns the red, green, blue, and alpha values of the color. It @@ -139,7 +155,7 @@ func (k Key) String() string { Citron: "Citron", Zest: "Zest", Pepper: "Pepper", - Barbeque: "Barbeque", + BBQ: "BBQ", Charcoal: "Charcoal", Iron: "Iron", Oyster: "Oyster", @@ -148,6 +164,20 @@ func (k Key) String() string { Salt: "Salt", Ash: "Ash", Butter: "Butter", + + // Diffs: additions. + Pickle: "Pickle", + Gator: "Gator", + Spinach: "Spinach", + + // Diffs: deletions. + Pom: "Pom", + Steak: "Steak", + Toast: "Toast", + + // Provisional. + NeueGuac: "Neue Guac", + NeueZinc: "Neue Zinc", }[k] } @@ -193,17 +223,17 @@ func (k Key) Hex() string { Damson: "#007AB8", Malibu: "#00A4FF", Sardine: "#4FBEFE", - Zinc: "#0e9996", + Zinc: "#10B1AE", Turtle: "#0ADCD9", Lichen: "#5CDFEA", - Guac: "#00b875", + Guac: "#12C78F", Julep: "#00FFB2", Bok: "#68FFD6", Mustard: "#F5EF34", Citron: "#E8FF27", Zest: "#E8FE96", Pepper: "#201F26", - Barbeque: "#2d2c35", + BBQ: "#2d2c35", Charcoal: "#3A3943", Iron: "#4D4C57", Oyster: "#605F6B", @@ -212,6 +242,20 @@ func (k Key) Hex() string { Ash: "#DFDBDD", Salt: "#F1EFEF", Butter: "#FFFAF1", + + // Diffs: additions. + Pickle: "#00A475", + Gator: "#18463D", + Spinach: "#1C3634", + + // Diffs: deletions. + Pom: "#AB2454", + Steak: "#582238", + Toast: "#412130", + + // Provisional. + NeueGuac: "#00b875", + NeueZinc: "#0e9996", }[k] } @@ -267,7 +311,7 @@ func Keys() []Key { Citron, Zest, Pepper, - Barbeque, + BBQ, Charcoal, Iron, Oyster, @@ -276,6 +320,8 @@ func Keys() []Key { Ash, Salt, Butter, + + // XXX: additions and deletions are not included, yet. } } diff --git a/vendor/modules.txt b/vendor/modules.txt index 743324d3515946ef7be8dce0230ee691f92e680b..c0f9558afa053c70d0a1db7456dd4fc16ca73650 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -289,7 +289,7 @@ github.com/charmbracelet/x/ansi/parser # github.com/charmbracelet/x/cellbuf v0.0.14-0.20250516160309-24eee56f89fa ## explicit; go 1.23.0 github.com/charmbracelet/x/cellbuf -# github.com/charmbracelet/x/exp/charmtone v0.0.0-20250627134340-c144409e381c +# github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3 ## explicit; go 1.23.0 github.com/charmbracelet/x/exp/charmtone # github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a