diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 667beb91..ff65c14c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -75,7 +75,7 @@ jobs: - run: go build ./cmd/dispatch/ - name: golangci-lint - uses: golangci/golangci-lint-action@ba0d7d2ec06a0ea1cb5fa41b2e4a3ab91d21278a # v9.3.0 + uses: golangci/golangci-lint-action@d583c34f0599d37dbac4a198b9c83201be380893 # v9.3.0 with: version: "v2.12.2" install-mode: goinstall diff --git a/go.mod b/go.mod index 218f250e..1f47644e 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/lucasb-eyer/go-colorful v1.4.1 golang.org/x/sync v0.22.0 golang.org/x/sys v0.47.0 - modernc.org/sqlite v1.55.0 + modernc.org/sqlite v1.56.0 ) require ( @@ -33,9 +33,9 @@ require ( github.com/aymerick/douceur v0.2.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/charmbracelet/colorprofile v0.4.3 // indirect - github.com/charmbracelet/ultraviolet v0.0.0-20260730003005-19049f296fa9 // indirect + github.com/charmbracelet/ultraviolet v0.0.0-20260803092147-8b693049ce2a // indirect github.com/charmbracelet/x/exp/golden v0.0.0-20260730164118-7e2d3e6c5238 // indirect - github.com/charmbracelet/x/exp/slice v0.0.0-20260730164118-7e2d3e6c5238 // indirect + github.com/charmbracelet/x/exp/slice v0.0.0-20260803091719-3755ebad01b1 // indirect github.com/charmbracelet/x/term v0.2.2 // indirect github.com/charmbracelet/x/termios v0.1.1 // indirect github.com/charmbracelet/x/windows v0.2.2 // indirect @@ -45,7 +45,6 @@ require ( github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/jsonschema-go v0.4.3 // indirect - github.com/google/pprof v0.0.0-20260802141513-ef3492d7dac3 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/css v1.0.1 // indirect github.com/mattn/go-isatty v0.0.24 // indirect @@ -59,9 +58,9 @@ require ( github.com/yuin/goldmark v1.8.5 // indirect github.com/yuin/goldmark-emoji v1.0.6 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/otel v1.44.0 // indirect - go.opentelemetry.io/otel/metric v1.44.0 // indirect - go.opentelemetry.io/otel/trace v1.44.0 // indirect + go.opentelemetry.io/otel v1.45.0 // indirect + go.opentelemetry.io/otel/metric v1.45.0 // indirect + go.opentelemetry.io/otel/trace v1.45.0 // indirect golang.org/x/exp v0.0.0-20260727155853-b88d891fe743 // indirect golang.org/x/net v0.57.0 // indirect golang.org/x/text v0.40.0 // indirect diff --git a/go.sum b/go.sum index d071689a..aa767c38 100644 --- a/go.sum +++ b/go.sum @@ -24,14 +24,14 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charmbracelet/colorprofile v0.4.3 h1:QPa1IWkYI+AOB+fE+mg/5/4HRMZcaXex9t5KX76i20Q= github.com/charmbracelet/colorprofile v0.4.3/go.mod h1:/zT4BhpD5aGFpqQQqw7a+VtHCzu+zrQtt1zhMt9mR4Q= -github.com/charmbracelet/ultraviolet v0.0.0-20260730003005-19049f296fa9 h1:4Hue6xu7UHYStXmrtNDX93FI2I9Ztjv8qa9tkMSQG30= -github.com/charmbracelet/ultraviolet v0.0.0-20260730003005-19049f296fa9/go.mod h1:psnCZIfwwxVs6v6DhUc6NJ8AQ3ejvs2ejKwoOMeVmUk= +github.com/charmbracelet/ultraviolet v0.0.0-20260803092147-8b693049ce2a h1:v7lgqJrF9VVoemVEpBKrstxfDR1476qJU8Vy7ZY5Ho4= +github.com/charmbracelet/ultraviolet v0.0.0-20260803092147-8b693049ce2a/go.mod h1:psnCZIfwwxVs6v6DhUc6NJ8AQ3ejvs2ejKwoOMeVmUk= github.com/charmbracelet/x/ansi v0.11.7 h1:kzv1kJvjg2S3r9KHo8hDdHFQLEqn4RBCb39dAYC84jI= github.com/charmbracelet/x/ansi v0.11.7/go.mod h1:9qGpnAVYz+8ACONkZBUWPtL7lulP9No6p1epAihUZwQ= github.com/charmbracelet/x/exp/golden v0.0.0-20260730164118-7e2d3e6c5238 h1:6eixvo/yc1QsdxYwBkbVu6khpCxoZ+Qgd8T2MQU9LsE= github.com/charmbracelet/x/exp/golden v0.0.0-20260730164118-7e2d3e6c5238/go.mod h1:6fMpcW6iwN/kX+xJ52eqVWsDiBTe0UJD24JLoHFe+P0= -github.com/charmbracelet/x/exp/slice v0.0.0-20260730164118-7e2d3e6c5238 h1:Sox2NmzcVw07WbIkfcC8ZwS0lCZtOOMPhVBIq3Z1KTM= -github.com/charmbracelet/x/exp/slice v0.0.0-20260730164118-7e2d3e6c5238/go.mod h1:vqEfX6xzqW1pKKZUUiFOKg0OQ7bCh54Q2vR/tserrRA= +github.com/charmbracelet/x/exp/slice v0.0.0-20260803091719-3755ebad01b1 h1:mg80wPD5ZV0wDYdZAhHilmwGaTv8uEedVRnNiM0TehA= +github.com/charmbracelet/x/exp/slice v0.0.0-20260803091719-3755ebad01b1/go.mod h1:vqEfX6xzqW1pKKZUUiFOKg0OQ7bCh54Q2vR/tserrRA= github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk= github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI= github.com/charmbracelet/x/termios v0.1.1 h1:o3Q2bT8eqzGnGPOYheoYS8eEleT5ZVNYNy8JawjaNZY= @@ -105,12 +105,12 @@ github.com/yuin/goldmark-emoji v1.0.6 h1:QWfF2FYaXwL74tfGOW5izeiZepUDroDJfWubQI9 github.com/yuin/goldmark-emoji v1.0.6/go.mod h1:ukxJDKFpdFb5x0a5HqbdlcKtebh086iJpI31LTKmWuA= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= -go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= -go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= -go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= -go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= -go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= +go.opentelemetry.io/otel v1.45.0 h1:pdrWmLHofpubmArBv1LgFSv1Z0Ie/ppdZzu+kUN5EeU= +go.opentelemetry.io/otel v1.45.0/go.mod h1:XZxIqPapzEYnhNSScF5DIqXhm/rYi0FzCe2XddAwZfQ= +go.opentelemetry.io/otel/metric v1.45.0 h1:7Eg1uH7CJ5cXv9is6tnBe1FI6rj1nwUdbFypRm3br/M= +go.opentelemetry.io/otel/metric v1.45.0/go.mod h1:HAPbm1nd3p1PmFH7v2dR+6BjXxw+Lq4a2+pndMAm08s= +go.opentelemetry.io/otel/trace v1.45.0 h1:l/mP6Uv7oNO7/TblbhpbgMidxhq1uO/rPsikOyVhxag= +go.opentelemetry.io/otel/trace v1.45.0/go.mod h1:qoJJA2xNMnxRrdISU/kLtfUH2wNeQbiv+jhs/CxI8bc= golang.org/x/exp v0.0.0-20260727155853-b88d891fe743 h1:ex206bKw+v3K0dm3andkrIF+ijyQKJG1pLgwQ2PYdQM= golang.org/x/exp v0.0.0-20260727155853-b88d891fe743/go.mod h1:EdfpwwqSu+0Li0mzskwHU6FWDV3t9Q+RZDo3QMUtL3Q= golang.org/x/mod v0.38.0 h1:MECBjubtXD7yj4HrhIUcywNaGeNVUdfVnxmPajOk4yk= @@ -150,8 +150,8 @@ modernc.org/opt v0.2.0 h1:tGyef5ApycA7FSEOMraay9SaTk5zmbx7Tu+cJs4QKZg= modernc.org/opt v0.2.0/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.55.0 h1:hIFh0MCH0rGinQ/4KYb5/UbCkRkb+UP+OkLCVWa5MTM= -modernc.org/sqlite v1.55.0/go.mod h1:4ntCLuNmnH8+GNqjka1wNg7KJd5/Hi5FYp8K+XQ7GZw= +modernc.org/sqlite v1.56.0 h1:/D8e2RfFqoy/Zc6PuC76U28zFwmI/sYx1Kjm4yEn9e0= +modernc.org/sqlite v1.56.0/go.mod h1:yCJ2cmAaIkHQ25oXWrF8H4O1lIfPYPR26yCEDj2P3pQ= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= diff --git a/internal/tui/model.go b/internal/tui/model.go index cd3d1a02..e688009b 100644 --- a/internal/tui/model.go +++ b/internal/tui/model.go @@ -538,7 +538,8 @@ func NewModel() Model { // Honour the configured auto-refresh interval. When disabled (0), the // watcher is never activated so no polling happens; the list still // refreshes on explicit reload and after reindex. - if interval, enabled := cfg.EffectiveAutoRefreshInterval(); enabled { + screenshotMode := os.Getenv("DISPATCH_SCREENSHOT_MODE") == "1" + if interval, enabled := cfg.EffectiveAutoRefreshInterval(); enabled && !screenshotMode { m.dbWatcher.SetInterval(interval) m.dbWatcher.SetActive(true) } @@ -551,8 +552,10 @@ func NewModel() Model { default: } }, cfg.EffectiveAttentionThreshold(), cfg.WorkspaceRecovery) - if err := m.eventWatcher.Start(); err != nil { - slog.Debug("eventwatcher: failed to start", "error", err) + if !screenshotMode { + if err := m.eventWatcher.Start(); err != nil { + slog.Debug("eventwatcher: failed to start", "error", err) + } } m.filter.Since = timeRangeToSince(m.timeRange) diff --git a/internal/tui/screenshot.go b/internal/tui/screenshot.go index 2ec15d66..67b30d2f 100644 --- a/internal/tui/screenshot.go +++ b/internal/tui/screenshot.go @@ -698,6 +698,16 @@ var allThemes = []themeEntry{ // CaptureScreenshots drives the TUI model through every visual state // used on the website and returns the rendered ANSI output for each. func CaptureScreenshots(dbPath string, width, height int) ([]Screenshot, error) { + prevScreenshotMode, hadScreenshotMode := os.LookupEnv("DISPATCH_SCREENSHOT_MODE") + os.Setenv("DISPATCH_SCREENSHOT_MODE", "1") + defer func() { + if hadScreenshotMode { + os.Setenv("DISPATCH_SCREENSHOT_MODE", prevScreenshotMode) + } else { + os.Unsetenv("DISPATCH_SCREENSHOT_MODE") + } + }() + // Enable NerdFont icons so the title bar shows the terminal glyph // instead of the ⚡ fallback. styles.SetNerdFontEnabled(true) @@ -843,6 +853,14 @@ func CaptureScreenshots(dbPath string, width, height int) ([]Screenshot, error) // rendering. It bypasses config loading and the bubbletea runtime. func newScreenshotModel(width, height int) *Model { m := NewModel() + if m.dbWatcher != nil { + m.dbWatcher.Stop() + m.dbWatcher = nil + } + if m.eventWatcher != nil { + m.eventWatcher.Stop() + m.eventWatcher = nil + } m.state = stateSessionList m.reindexing = false m.width = width diff --git a/web/package-lock.json b/web/package-lock.json index d9f9750b..df2c26f6 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.1", "dependencies": { "astro": "^7.1.6", - "marked": "^18.0.7" + "marked": "^18.0.9" }, "devDependencies": { "@astrojs/check": "^0.9.10", @@ -3920,9 +3920,9 @@ } }, "node_modules/marked": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.7.tgz", - "integrity": "sha512-iDVQ5ldaiKXn6b2JroX5kgRfmwgqolW7NpaEzTl1k/2Zh1njIEN9yniyLV/mOvWwtsE8OGgkjsCYvijuPk1dtA==", + "version": "18.0.9", + "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.9.tgz", + "integrity": "sha512-/Sa4qiiHZxf0/FQdBBowr9q4r10krCwMvpK48FUBdXdUXScDxiQGR9zCPrFgRVR5LU3iySOiIjy09ZQvADir1w==", "license": "MIT", "bin": { "marked": "bin/marked.js" diff --git a/web/package.json b/web/package.json index c131b27c..5a45855b 100644 --- a/web/package.json +++ b/web/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "astro": "^7.1.6", - "marked": "^18.0.7" + "marked": "^18.0.9" }, "devDependencies": { "@astrojs/check": "^0.9.10",