diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 39b5923298e2f7fa8d5452327a6e8b2a08f0df97..39e104129f0c3c059b116acabb0a86f5e53e6dc4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: persist-credentials: false - - uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 + - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 with: go-version-file: go.mod - run: go mod tidy diff --git a/.github/workflows/schema-update.yml b/.github/workflows/schema-update.yml index 5bc1f29d91969f32757f9ad78f7742e7e20b7f3e..b02ad11ebd556490b6f2abbb4af172166a458d18 100644 --- a/.github/workflows/schema-update.yml +++ b/.github/workflows/schema-update.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} - - uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 + - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 with: go-version-file: go.mod - run: go run . schema > ./schema.json diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index 3a90ea316c3d86f5b2f93224fd2b35eaa572e704..b0e1a82cb63e020221a32abdf9534f610ec82b43 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -30,11 +30,11 @@ jobs: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: persist-credentials: false - - uses: github/codeql-action/init@cf1bb45a277cb3c205638b2cd5c984db1c46a412 # v4.31.7 + - uses: github/codeql-action/init@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10 with: languages: ${{ matrix.language }} - - uses: github/codeql-action/autobuild@cf1bb45a277cb3c205638b2cd5c984db1c46a412 # v4.31.7 - - uses: github/codeql-action/analyze@cf1bb45a277cb3c205638b2cd5c984db1c46a412 # v4.31.7 + - uses: github/codeql-action/autobuild@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10 + - uses: github/codeql-action/analyze@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10 grype: runs-on: ubuntu-latest @@ -46,13 +46,13 @@ jobs: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: persist-credentials: false - - uses: anchore/scan-action@40a61b52209e9d50e87917c5b901783d546b12d0 # v7.2.1 + - uses: anchore/scan-action@62b74fb7bb810d2c45b1865f47a77655621862a5 # v7.2.3 id: scan with: path: "." fail-build: true severity-cutoff: critical - - uses: github/codeql-action/upload-sarif@cf1bb45a277cb3c205638b2cd5c984db1c46a412 # v4.31.7 + - uses: github/codeql-action/upload-sarif@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10 with: sarif_file: ${{ steps.scan.outputs.sarif }} @@ -73,7 +73,7 @@ jobs: - name: Run govulncheck run: | govulncheck -C . -format sarif ./... > results.sarif - - uses: github/codeql-action/upload-sarif@cf1bb45a277cb3c205638b2cd5c984db1c46a412 # v4.31.7 + - uses: github/codeql-action/upload-sarif@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10 with: sarif_file: results.sarif diff --git a/internal/app/app.go b/internal/app/app.go index 0f98a8383124274d8aaae12b40146411ed969c8d..96750a453e63c79b7363fef5b3aa9b09632de940 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -40,6 +40,13 @@ import ( "github.com/charmbracelet/x/term" ) +// UpdateAvailableMsg is sent when a new version is available. +type UpdateAvailableMsg struct { + CurrentVersion string + LatestVersion string + IsDevelopment bool +} + type App struct { Sessions session.Service Messages message.Service @@ -452,7 +459,7 @@ func (app *App) checkForUpdates(ctx context.Context) { if err != nil || !info.Available() { return } - app.events <- pubsub.UpdateAvailableMsg{ + app.events <- UpdateAvailableMsg{ CurrentVersion: info.Current, LatestVersion: info.Latest, IsDevelopment: info.IsDevelopment(), diff --git a/internal/env/env.go b/internal/env/env.go index fa7546f8ebd28ed0c44528f7d9b8ae4b03db8b89..2fe19cc20bdd8771cff98da3dd24d7b25c3cba1e 100644 --- a/internal/env/env.go +++ b/internal/env/env.go @@ -2,7 +2,6 @@ package env import ( "os" - "testing" ) type Env interface { @@ -18,17 +17,10 @@ func (o *osEnv) Get(key string) string { } func (o *osEnv) Env() []string { - env := os.Environ() - if len(env) == 0 { - return nil - } - return env + return os.Environ() } func New() Env { - if testing.Testing() { - return NewFromMap(nil) - } return &osEnv{} } @@ -46,9 +38,6 @@ func (m *mapEnv) Get(key string) string { // Env implements Env. func (m *mapEnv) Env() []string { - if len(m.m) == 0 { - return nil - } env := make([]string, 0, len(m.m)) for k, v := range m.m { env = append(env, k+"="+v) diff --git a/internal/env/env_test.go b/internal/env/env_test.go index a86b8f4140a57d564797f260b24262472c9ad058..e8e19cf8b6356e19e4f61cb3bfb2eef7b93ad9fc 100644 --- a/internal/env/env_test.go +++ b/internal/env/env_test.go @@ -90,13 +90,15 @@ func TestMapEnv_Env(t *testing.T) { t.Run("empty map", func(t *testing.T) { env := NewFromMap(map[string]string{}) envVars := env.Env() - require.Nil(t, envVars) + require.NotNil(t, envVars) + require.Len(t, envVars, 0) }) t.Run("nil map", func(t *testing.T) { env := NewFromMap(nil) envVars := env.Env() - require.Nil(t, envVars) + require.NotNil(t, envVars) + require.Len(t, envVars, 0) }) } diff --git a/internal/lsp/client.go b/internal/lsp/client.go index 79220cc1f315fec30a1bee2aa0dcd106bc311a02..df28a30bbcce9504fb8a4a0eaba98a820028e705 100644 --- a/internal/lsp/client.go +++ b/internal/lsp/client.go @@ -345,7 +345,7 @@ func (c *Client) CloseAllFiles(ctx context.Context) { slog.Debug("Closing file", "file", uri) } if err := c.client.NotifyDidCloseTextDocument(ctx, uri); err != nil { - slog.Warn("Error closing rile", "uri", uri, "error", err) + slog.Warn("Error closing file", "uri", uri, "error", err) continue } c.openFiles.Del(uri) diff --git a/internal/message/message.go b/internal/message/message.go index a09d0acbf590e840541a7d5e057fb89513cc0618..04eb8252bbe9a68444eba81fc581c6b49231734b 100644 --- a/internal/message/message.go +++ b/internal/message/message.go @@ -63,7 +63,7 @@ func (s *service) Create(ctx context.Context, sessionID string, params CreateMes Reason: "stop", }) } - partsJSON, err := marshallParts(params.Parts) + partsJSON, err := marshalParts(params.Parts) if err != nil { return Message{}, err } @@ -110,7 +110,7 @@ func (s *service) DeleteSessionMessages(ctx context.Context, sessionID string) e } func (s *service) Update(ctx context.Context, message Message) error { - parts, err := marshallParts(message.Parts) + parts, err := marshalParts(message.Parts) if err != nil { return err } @@ -158,7 +158,7 @@ func (s *service) List(ctx context.Context, sessionID string) ([]Message, error) } func (s *service) fromDBItem(item db.Message) (Message, error) { - parts, err := unmarshallParts([]byte(item.Parts)) + parts, err := unmarshalParts([]byte(item.Parts)) if err != nil { return Message{}, err } @@ -192,7 +192,7 @@ type partWrapper struct { Data ContentPart `json:"data"` } -func marshallParts(parts []ContentPart) ([]byte, error) { +func marshalParts(parts []ContentPart) ([]byte, error) { wrappedParts := make([]partWrapper, len(parts)) for i, part := range parts { @@ -225,7 +225,7 @@ func marshallParts(parts []ContentPart) ([]byte, error) { return json.Marshal(wrappedParts) } -func unmarshallParts(data []byte) ([]ContentPart, error) { +func unmarshalParts(data []byte) ([]ContentPart, error) { temp := []json.RawMessage{} if err := json.Unmarshal(data, &temp); err != nil { diff --git a/internal/pubsub/broker.go b/internal/pubsub/broker.go index ed14cbfed6c8fd44355501e16457e0dd92a494bc..2faf7f89b7c982950bfc69801a7901526e37eec4 100644 --- a/internal/pubsub/broker.go +++ b/internal/pubsub/broker.go @@ -20,13 +20,11 @@ func NewBroker[T any]() *Broker[T] { } func NewBrokerWithOptions[T any](channelBufferSize, maxEvents int) *Broker[T] { - b := &Broker[T]{ + return &Broker[T]{ subs: make(map[chan Event[T]]struct{}), done: make(chan struct{}), - subCount: 0, maxEvents: maxEvents, } - return b } func (b *Broker[T]) Shutdown() { diff --git a/internal/pubsub/events.go b/internal/pubsub/events.go index 016cc10c9f8a51039ce9eeda6210f5f59bdc1e6c..827158d52fd671aeda828c0383fce98850e27fc7 100644 --- a/internal/pubsub/events.go +++ b/internal/pubsub/events.go @@ -26,10 +26,3 @@ type ( Publish(EventType, T) } ) - -// UpdateAvailableMsg is sent when a new version is available. -type UpdateAvailableMsg struct { - CurrentVersion string - LatestVersion string - IsDevelopment bool -} diff --git a/internal/tui/tui.go b/internal/tui/tui.go index e91fae5592b8d51963e524d0662d868cbfed6869..519b0e6aca73fb276d4137e00830b29798a391c7 100644 --- a/internal/tui/tui.go +++ b/internal/tui/tui.go @@ -385,7 +385,7 @@ func (a *appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } return a, tea.Batch(cmds...) // Update Available - case pubsub.UpdateAvailableMsg: + case app.UpdateAvailableMsg: // Show update notification in status bar statusMsg := fmt.Sprintf("Crush update available: v%s → v%s.", msg.CurrentVersion, msg.LatestVersion) if msg.IsDevelopment {