From 1568c634627b5715bf9f869a2c15f6c2e8cc1121 Mon Sep 17 00:00:00 2001 From: titor Date: Sun, 12 Apr 2026 02:26:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20Markdown=20?= =?UTF-8?q?=E7=BB=88=E7=AB=AF=E6=B8=B2=E6=9F=93=E6=94=AF=E6=8C=81=EF=BC=88?= =?UTF-8?q?glamour=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agents.md | 55 +++++++++++++++++++++++++- cmd/hxclaw/internal/helpers.go | 35 +++++++++++++++++ cmd/hxclaw/internal/markdown.go | 70 +++++++++++++++++++++++++++++++++ cmd/hxclaw/main.go | 38 +++++++++++++----- go.mod | 11 ++++++ go.sum | 23 +++++++++++ 6 files changed, 221 insertions(+), 11 deletions(-) create mode 100644 cmd/hxclaw/internal/markdown.go diff --git a/agents.md b/agents.md index df676d7..ea606b7 100644 --- a/agents.md +++ b/agents.md @@ -49,11 +49,64 @@ 3. 实现流式 Provider 调用 4. 实时打印 token 5. 处理非流式 Provider 回退 +6. Markdown 终端渲染(glamour) + +--- + +## 实现进度 + +### v0.1.0 已完成功能 + +1. **流式输出** + - 实时打印 token + - Spinner 显示"思考中..." + - 第一个 token 到达时停止 spinner + +2. **Markdown 渲染** + - 使用 glamour 库渲染 Markdown + - 支持多种主题(dark, light, dracula, tokyo-night 等) + - 通过 GLAMOUR_STYLE 环境变量配置主题 + +3. **重绘逻辑** + - 响应完成后尝试重绘 + - 使用 termenv 库清除屏幕 + - ⚠️ 存在轻微残留 bug(可接受) + +--- + +## 依赖管理 + +### Go 依赖 + +- `charm.land/glamour/v2` - Markdown 渲染 +- `charm.land/lipgloss/v2` - 终端样式 +- `charm.land/x/term` - 终端控制 +- `github.com/muesli/termenv` - 终端环境工具 + +### 配置文件 + +- `cmd/hxclaw/main.go` - 主入口逻辑 +- `cmd/hxclaw/internal/markdown.go` - Markdown 渲染器 +- `cmd/hxclaw/internal/helpers.go` - 辅助函数 + +--- + +## 已知问题 + +1. **重绘残留**:某些情况下有轻微文本重复(可接受) +2. **终端兼容性**:termenv 在某些终端可能不完全工作 + +--- + +## 待优化 + +1. 优化重绘逻辑,解决残留问题 +2. 添加更多主题支持 +3. 添加命令-line 参数支持主题选择 --- ## 注意事项 - - 不要修改 picoclaw 源码 - 保持代码独立,便于后续版本同步 - 优先实现核心功能,再考虑增强功能 diff --git a/cmd/hxclaw/internal/helpers.go b/cmd/hxclaw/internal/helpers.go index 864e74f..30cb2e2 100644 --- a/cmd/hxclaw/internal/helpers.go +++ b/cmd/hxclaw/internal/helpers.go @@ -118,3 +118,38 @@ func (r *SimpleReader) ReadString() (string, error) { } return line, nil } + +func FindParagraphEnd(text string, startPos int) int { + if startPos >= len(text) { + return 0 + } + + inCodeBlock := false + inMathBlock := false + + for i := startPos; i < len(text); i++ { + if i+3 < len(text) && text[i:i+3] == "```" { + if !inCodeBlock { + inCodeBlock = true + } else { + inCodeBlock = false + } + continue + } + + if i+2 < len(text) && (text[i:i+2] == "$$" || text[i:i+2] == "\\[") { + inMathBlock = !inMathBlock + continue + } + + if inCodeBlock || inMathBlock { + continue + } + + if i+1 < len(text) && text[i] == '\n' && text[i+1] == '\n' { + return i + 2 + } + } + + return 0 +} diff --git a/cmd/hxclaw/internal/markdown.go b/cmd/hxclaw/internal/markdown.go new file mode 100644 index 0000000..42967e0 --- /dev/null +++ b/cmd/hxclaw/internal/markdown.go @@ -0,0 +1,70 @@ +package internal + +import ( + "os" + "strings" + + "charm.land/glamour/v2" +) + +func RenderMarkdown(md string) string { + if md == "" { + return "" + } + + style := getStyle() + + r, err := glamour.NewTermRenderer( + glamour.WithStandardStyle(style), + glamour.WithWordWrap(80), + ) + if err != nil { + return md + } + defer r.Close() + + out, err := r.Render(md) + if err != nil { + return md + } + + return out +} + +func RenderParagraph(text string) string { + if text == "" { + return "" + } + + text = strings.TrimRight(text, "\n") + + if text == "" { + return "" + } + + style := getStyle() + + r, err := glamour.NewTermRenderer( + glamour.WithStandardStyle(style), + glamour.WithWordWrap(80), + ) + if err != nil { + return text + } + defer r.Close() + + out, err := r.Render(text) + if err != nil { + return text + } + + return out +} + +func getStyle() string { + style := "dark" + if s := os.Getenv("GLAMOUR_STYLE"); s != "" { + style = s + } + return style +} diff --git a/cmd/hxclaw/main.go b/cmd/hxclaw/main.go index 94ebf3d..81419de 100644 --- a/cmd/hxclaw/main.go +++ b/cmd/hxclaw/main.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/hxclaw/hxclaw/cmd/hxclaw/internal" + "github.com/muesli/termenv" "github.com/sipeed/picoclaw/pkg/agent" "github.com/sipeed/picoclaw/pkg/bus" "github.com/sipeed/picoclaw/pkg/logger" @@ -160,15 +161,15 @@ func runWithStreaming(agentLoop *agent.AgentLoop, input, sessionKey string) { var printedLen int firstToken := true _, err := sp.ChatStream(ctx, messages, toolDefs, agentInstance.Model, nil, func(accumulated string) { - // 检测到第一个 token 时,停止 spinner if firstToken && len(accumulated) > 0 { spinner.Stop() firstToken = false } if len(accumulated) > printedLen { - fmt.Print(accumulated[printedLen:]) + newText := accumulated[printedLen:] + fmt.Print(newText) os.Stdout.Sync() - result.WriteString(accumulated[printedLen:]) + result.WriteString(newText) printedLen = len(accumulated) } }) @@ -178,21 +179,38 @@ func runWithStreaming(agentLoop *agent.AgentLoop, input, sessionKey string) { return } - fmt.Println() - fmt.Println() - - // 将用户消息和回复保存到 session if result.Len() > 0 { + allOutput := result.String() + rendered := internal.RenderMarkdown(allOutput) + if rendered != allOutput && rendered != "" { + // 计算流式输出的行数,清除 + lines := strings.Count(allOutput, "\n") + 1 + output := termenv.DefaultOutput() + output.CursorUp(1) + output.ClearLine() + output.ClearLines(lines) + fmt.Print(rendered) + fmt.Println() + fmt.Println() + } else { + fmt.Println() + fmt.Println() + } + agentInstance.Sessions.AddMessage(sessionKey, "user", input) - agentInstance.Sessions.AddMessage(sessionKey, "assistant", result.String()) + agentInstance.Sessions.AddMessage(sessionKey, "assistant", allOutput) } } else { - // 回退到普通模式 response, err := agentLoop.ProcessDirect(ctx, input, sessionKey) if err != nil { fmt.Printf("错误: %v\n", err) return } - fmt.Printf("\n%s %s\n\n", Logo, response) + rendered := internal.RenderMarkdown(response) + if rendered != "" && rendered != response { + fmt.Printf("\n%s\n\n", rendered) + } else { + fmt.Printf("\n%s %s\n\n", Logo, response) + } } } diff --git a/go.mod b/go.mod index 33d69fb..5d489fd 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,9 @@ require ( ) require ( + charm.land/glamour/v2 v2.0.0 // indirect github.com/adhocore/gronx v1.19.6 // indirect + github.com/alecthomas/chroma/v2 v2.14.0 // indirect github.com/anthropics/anthropic-sdk-go v1.26.0 // indirect github.com/aws/aws-sdk-go-v2 v1.41.5 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 // indirect @@ -29,16 +31,20 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.41.10 // indirect github.com/aws/smithy-go v1.24.2 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/aymerick/douceur v0.2.0 // indirect github.com/caarlos0/env/v11 v11.4.0 // indirect github.com/charmbracelet/colorprofile v0.4.2 // indirect github.com/charmbracelet/ultraviolet v0.0.0-20260205113103-524a6607adb8 // indirect github.com/charmbracelet/x/ansi v0.11.6 // indirect + github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf // 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 github.com/clipperhouse/displaywidth v0.11.0 // indirect github.com/clipperhouse/uax29/v2 v2.7.0 // indirect github.com/creack/pty v1.1.24 // indirect + github.com/dlclark/regexp2 v1.11.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/github/copilot-sdk/go v0.2.0 // indirect github.com/go-logr/logr v1.4.3 // indirect @@ -46,13 +52,16 @@ require ( github.com/gomarkdown/markdown v0.0.0-20260217112301-37c66b85d6ab // indirect github.com/google/jsonschema-go v0.4.2 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/css v1.0.1 // indirect github.com/h2non/filetype v1.1.3 // indirect github.com/lucasb-eyer/go-colorful v1.3.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.21 // indirect + github.com/microcosm-cc/bluemonday v1.0.27 // indirect github.com/modelcontextprotocol/go-sdk v1.5.0 // indirect github.com/muesli/cancelreader v0.2.2 // indirect + github.com/muesli/termenv v0.16.0 // indirect github.com/ncruces/go-strftime v1.0.0 // indirect github.com/openai/openai-go/v3 v3.22.0 // indirect github.com/pion/randutil v0.1.0 // indirect @@ -69,6 +78,8 @@ require ( github.com/tidwall/sjson v1.2.5 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect github.com/yosida95/uritemplate/v3 v3.0.2 // indirect + github.com/yuin/goldmark v1.7.8 // indirect + github.com/yuin/goldmark-emoji v1.0.5 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/otel v1.35.0 // indirect go.opentelemetry.io/otel/metric v1.35.0 // indirect diff --git a/go.sum b/go.sum index eeb9861..b247361 100644 --- a/go.sum +++ b/go.sum @@ -2,10 +2,14 @@ charm.land/bubbles/v2 v2.1.0 h1:YSnNh5cPYlYjPxRrzs5VEn3vwhtEn3jVGRBT3M7/I0g= charm.land/bubbles/v2 v2.1.0/go.mod h1:l97h4hym2hvWBVfmJDtrEHHCtkIKeTEb3TTJ4ZOB3wY= charm.land/bubbletea/v2 v2.0.2 h1:4CRtRnuZOdFDTWSff9r8QFt/9+z6Emubz3aDMnf/dx0= charm.land/bubbletea/v2 v2.0.2/go.mod h1:3LRff2U4WIYXy7MTxfbAQ+AdfM3D8Xuvz2wbsOD9OHQ= +charm.land/glamour/v2 v2.0.0 h1:IDBoqLEy7Hdpb9VOXN+khLP/XSxtJy1VsHuW/yF87+U= +charm.land/glamour/v2 v2.0.0/go.mod h1:kjq9WB0s8vuUYZNYey2jp4Lgd9f4cKdzAw88FZtpj/w= charm.land/lipgloss/v2 v2.0.2 h1:xFolbF8JdpNkM2cEPTfXEcW1p6NRzOWTSamRfYEw8cs= charm.land/lipgloss/v2 v2.0.2/go.mod h1:KjPle2Qd3YmvP1KL5OMHiHysGcNwq6u83MUjYkFvEkM= github.com/adhocore/gronx v1.19.6 h1:5KNVcoR9ACgL9HhEqCm5QXsab/gI4QDIybTAWcXDKDc= github.com/adhocore/gronx v1.19.6/go.mod h1:7oUY1WAU8rEJWmAxXR2DN0JaO4gi9khSgKjiRypqteg= +github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E= +github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I= github.com/anthropics/anthropic-sdk-go v1.26.0 h1:oUTzFaUpAevfuELAP1sjL6CQJ9HHAfT7CoSYSac11PY= github.com/anthropics/anthropic-sdk-go v1.26.0/go.mod h1:qUKmaW+uuPB64iy1l+4kOSvaLqPXnHTTBKH6RVZ7q5Q= github.com/aws/aws-sdk-go-v2 v1.41.5 h1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV/yY= @@ -40,8 +44,12 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.41.10 h1:p8ogvvLugcR/zLBXTXrTkj0RYBU github.com/aws/aws-sdk-go-v2/service/sts v1.41.10/go.mod h1:60dv0eZJfeVXfbT1tFJinbHrDfSJ2GZl4Q//OSSNAVw= github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymanbagabas/go-udiff v0.4.1 h1:OEIrQ8maEeDBXQDoGCbbTTXYJMYRCRO1fnodZ12Gv5o= github.com/aymanbagabas/go-udiff v0.4.1/go.mod h1:0L9PGwj20lrtmEMeyw4WKJ/TMyDtvAoK9bf2u/mNo3w= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/caarlos0/env/v11 v11.4.0 h1:Kcb6t5kIIr4XkoQC9AF2j+8E1Jsrl3Wz/hhm1LtoGAc= github.com/caarlos0/env/v11 v11.4.0/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U= github.com/charmbracelet/colorprofile v0.4.2 h1:BdSNuMjRbotnxHSfxy+PCSa4xAmz7szw70ktAtWRYrY= @@ -52,6 +60,8 @@ github.com/charmbracelet/x/ansi v0.11.6 h1:GhV21SiDz/45W9AnV2R61xZMRri5NlLnl6CVF github.com/charmbracelet/x/ansi v0.11.6/go.mod h1:2JNYLgQUsyqaiLovhU2Rv/pb8r6ydXKS3NIttu3VGZQ= github.com/charmbracelet/x/exp/golden v0.0.0-20250806222409-83e3a29d542f h1:pk6gmGpCE7F3FcjaOEKYriCvpmIN4+6OS/RD0vm4uIA= github.com/charmbracelet/x/exp/golden v0.0.0-20250806222409-83e3a29d542f/go.mod h1:IfZAMTHB6XkZSeXUqriemErjAWCCzT0LwjKFYCZyw0I= +github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf h1:rLG0Yb6MQSDKdB52aGX55JT1oi0P0Kuaj7wi1bLUpnI= +github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf/go.mod h1:B3UgsnsBZS/eX42BlaNiJkD1pPOUa+oF1IYC6Yd2CEU= 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= @@ -66,6 +76,8 @@ github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= +github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= @@ -91,6 +103,8 @@ github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17k github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= +github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg= github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= @@ -107,10 +121,14 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.21 h1:jJKAZiQH+2mIinzCJIaIG9Be1+0NR+5sz/lYEEjdM8w= github.com/mattn/go-runewidth v0.0.21/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= +github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/modelcontextprotocol/go-sdk v1.5.0 h1:CHU0FIX9kpueNkxuYtfYQn1Z0slhFzBZuq+x6IiblIU= github.com/modelcontextprotocol/go-sdk v1.5.0/go.mod h1:gggDIhoemhWs3BGkGwd1umzEXCEMMvAnhTrnbXJKKKA= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= +github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/openai/openai-go/v3 v3.22.0 h1:6MEoNoV8sbjOVmXdvhmuX3BjVbVdcExbVyGixiyJ8ys= @@ -152,6 +170,11 @@ github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavM github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= +github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= +github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark-emoji v1.0.5 h1:EMVWyCGPlXJfUXBXpuMu+ii3TIaxbVBnEX9uaDC4cIk= +github.com/yuin/goldmark-emoji v1.0.5/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=