on main help sign in
7326 files changed+5596292−169
since splitsnapshots
unifiedsplit
flake.nix+1−1 internal/agent/tools/download.go+3−3 internal/agent/tools/edit.go+1−1 internal/agent/tools/fetch.go+12−12 internal/agent/tools/ls.go+1−1 internal/agent/tools/mcp-tools.go+2−2 internal/agent/tools/sourcegraph.go+4−4 internal/agent/tools/view.go+9−9 internal/agent/tools/view_test.go+2−2 internal/agent/tools/web_fetch.go+4−4 internal/agent/tools/web_search.go+1−1 internal/agent/tools/write.go+15−14 internal/cmd/session.go+1−1 internal/config/config.go+1 internal/ui/attachments/attachments.go+2−2 internal/ui/chat/agent.go+2−2 internal/ui/chat/bash.go+3−3 internal/ui/chat/diagnostics.go+1−1 internal/ui/chat/docker_mcp.go+2−2 internal/ui/chat/fetch.go+3−3 internal/ui/chat/file.go+8−8 internal/ui/chat/generic.go+2−2 internal/ui/chat/lsp_restart.go+1−1 internal/ui/chat/mcp.go+2−2 internal/ui/chat/messages.go+2−1 internal/ui/chat/references.go+1−1 internal/ui/chat/search.go+4−4 internal/ui/chat/todos.go+1−1 internal/ui/chat/tool_result_content.go+2−2 internal/ui/chat/tool_result_content_test.go+5−5 internal/ui/chat/tools.go+65−32 internal/ui/chat/unified_diff.go+13−14 internal/ui/chat/version_bump_test.go+10−10 internal/ui/dialog/commands.go+3−3 internal/ui/dialog/permissions.go+1−1 internal/ui/difftastic/difftastic.go+60 internal/ui/model/chat.go+18 internal/ui/model/onboarding.go−1 internal/ui/model/ui.go+35−13 vendor/charm.land/bubbles/v2/LICENSE+21 vendor/charm.land/bubbles/v2/cursor/cursor.go+241 vendor/charm.land/bubbles/v2/filepicker/filepicker.go+529 vendor/charm.land/bubbles/v2/filepicker/hidden_unix.go+11 vendor/charm.land/bubbles/v2/filepicker/hidden_windows.go+21 vendor/charm.land/bubbles/v2/help/help.go+253 vendor/charm.land/bubbles/v2/internal/memoization/memoization.go+125 vendor/charm.land/bubbles/v2/internal/runeutil/runeutil.go+102 vendor/charm.land/bubbles/v2/key/key.go+140 vendor/charm.land/bubbles/v2/spinner/spinner.go+211 vendor/charm.land/bubbles/v2/textarea/textarea.go+1897 vendor/charm.land/bubbles/v2/textinput/styles.go+96 vendor/charm.land/bubbles/v2/textinput/textinput.go+968 vendor/charm.land/bubbles/v2/viewport/highlight.go+141 vendor/charm.land/bubbles/v2/viewport/keymap.go+58 vendor/charm.land/bubbles/v2/viewport/viewport.go+765 vendor/charm.land/bubbletea/v2/.gitattributes+1 vendor/charm.land/bubbletea/v2/.gitignore+23 vendor/charm.land/bubbletea/v2/.golangci.yml+47 vendor/charm.land/bubbletea/v2/.goreleaser.yml+5 vendor/charm.land/bubbletea/v2/LICENSE+21 vendor/charm.land/bubbletea/v2/README.md+402 vendor/charm.land/bubbletea/v2/Taskfile.yaml+38 vendor/charm.land/bubbletea/v2/UPGRADE_GUIDE_V2.md+573 vendor/charm.land/bubbletea/v2/clipboard.go+70 vendor/charm.land/bubbletea/v2/color.go+91 vendor/charm.land/bubbletea/v2/commands.go+175 vendor/charm.land/bubbletea/v2/cursed_renderer.go+860 vendor/charm.land/bubbletea/v2/cursor.go+28 vendor/charm.land/bubbletea/v2/environ.go+34 vendor/charm.land/bubbletea/v2/exec.go+129 vendor/charm.land/bubbletea/v2/focus.go+9 vendor/charm.land/bubbletea/v2/input.go+54 vendor/charm.land/bubbletea/v2/key.go+371 vendor/charm.land/bubbletea/v2/keyboard.go+59 vendor/charm.land/bubbletea/v2/logging.go+53 vendor/charm.land/bubbletea/v2/mod.go+27 vendor/charm.land/bubbletea/v2/mouse.go+144 vendor/charm.land/bubbletea/v2/nil_renderer.go+53 vendor/charm.land/bubbletea/v2/options.go+168 vendor/charm.land/bubbletea/v2/paste.go+20 vendor/charm.land/bubbletea/v2/profile.go+15 vendor/charm.land/bubbletea/v2/raw.go+37 vendor/charm.land/bubbletea/v2/renderer.go+104 vendor/charm.land/bubbletea/v2/screen.go+68 vendor/charm.land/bubbletea/v2/signals_unix.go+33 vendor/charm.land/bubbletea/v2/signals_windows.go+10 vendor/charm.land/bubbletea/v2/tea.go+1439 vendor/charm.land/bubbletea/v2/termcap.go+48 vendor/charm.land/bubbletea/v2/termios_bsd.go+13 vendor/charm.land/bubbletea/v2/termios_other.go+8 vendor/charm.land/bubbletea/v2/termios_unix.go+14 vendor/charm.land/bubbletea/v2/termios_windows.go+11 vendor/charm.land/bubbletea/v2/tty.go+136 vendor/charm.land/bubbletea/v2/tty_unix.go+47 vendor/charm.land/bubbletea/v2/tty_windows.go+64 vendor/charm.land/bubbletea/v2/xterm.go+22 vendor/charm.land/catwalk/LICENSE+21 vendor/charm.land/catwalk/internal/providers/configs/aihubmix.json+3746 vendor/charm.land/catwalk/internal/providers/configs/alibaba-singapore.json+141 vendor/charm.land/catwalk/internal/providers/configs/alibaba-united-states.json+45 vendor/charm.land/catwalk/internal/providers/configs/anthropic.json+183 vendor/charm.land/catwalk/internal/providers/configs/avian.json+125 vendor/charm.land/catwalk/internal/providers/configs/azure.json+225 vendor/charm.land/catwalk/internal/providers/configs/baseten.json+187 vendor/charm.land/catwalk/internal/providers/configs/bedrock-europe.json+115 vendor/charm.land/catwalk/internal/providers/configs/bedrock-united-states.json+143 vendor/charm.land/catwalk/internal/providers/configs/cerebras.json+42 vendor/charm.land/catwalk/internal/providers/configs/chutes.json+227 vendor/charm.land/catwalk/internal/providers/configs/copilot.json+310 vendor/charm.land/catwalk/internal/providers/configs/cortecs.json+1697 vendor/charm.land/catwalk/internal/providers/configs/deepseek.json+45 vendor/charm.land/catwalk/internal/providers/configs/fireworks.json+171 vendor/charm.land/catwalk/internal/providers/configs/gemini.json+91 vendor/charm.land/catwalk/internal/providers/configs/groq.json+36 vendor/charm.land/catwalk/internal/providers/configs/huggingface.json+267 vendor/charm.land/catwalk/internal/providers/configs/ionet.json+335 vendor/charm.land/catwalk/internal/providers/configs/kimi.json+23 vendor/charm.land/catwalk/internal/providers/configs/minimax-china.json+91 vendor/charm.land/catwalk/internal/providers/configs/minimax.json+91 vendor/charm.land/catwalk/internal/providers/configs/moonshot.json+131 vendor/charm.land/catwalk/internal/providers/configs/nebius.json+419 vendor/charm.land/catwalk/internal/providers/configs/neuralwatt.json+155 vendor/charm.land/catwalk/internal/providers/configs/openai.json+352 vendor/charm.land/catwalk/internal/providers/configs/opencode-go.json+351 vendor/charm.land/catwalk/internal/providers/configs/opencode-zen.json+908 vendor/charm.land/catwalk/internal/providers/configs/openrouter.json+3831 vendor/charm.land/catwalk/internal/providers/configs/qiniucloud.json+179 vendor/charm.land/catwalk/internal/providers/configs/scaleway.json+141 vendor/charm.land/catwalk/internal/providers/configs/synthetic.json+197 vendor/charm.land/catwalk/internal/providers/configs/venice.json+1173 vendor/charm.land/catwalk/internal/providers/configs/vercel.json+3072 vendor/charm.land/catwalk/internal/providers/configs/vertexai.json+170 vendor/charm.land/catwalk/internal/providers/configs/xai.json+59 vendor/charm.land/catwalk/internal/providers/configs/zai.json+136 vendor/charm.land/catwalk/internal/providers/configs/zhipu-coding.json+136 vendor/charm.land/catwalk/internal/providers/configs/zhipu.json+120 vendor/charm.land/catwalk/internal/providers/providers.go+349 vendor/charm.land/catwalk/pkg/catwalk/client.go+79 vendor/charm.land/catwalk/pkg/catwalk/pkg.go+2 vendor/charm.land/catwalk/pkg/catwalk/provider.go+157 vendor/charm.land/catwalk/pkg/embedded/embedded.go+13 vendor/charm.land/fang/v2/.gitignore+3 vendor/charm.land/fang/v2/.golangci.yml+47 vendor/charm.land/fang/v2/.goreleaser.yml+5 vendor/charm.land/fang/v2/LICENSE.md+21 vendor/charm.land/fang/v2/README.md+92 vendor/charm.land/fang/v2/Taskfile.yml+7 vendor/charm.land/fang/v2/UPGRADE_GUIDE_V2.md+127 vendor/charm.land/fang/v2/fang.go+208 vendor/charm.land/fang/v2/fang_other.go+10 vendor/charm.land/fang/v2/fang_windows.go+30 vendor/charm.land/fang/v2/help.go+482 vendor/charm.land/fang/v2/theme.go+222 vendor/charm.land/fantasy/.editorconfig+18 vendor/charm.land/fantasy/.gitattributes+1 vendor/charm.land/fantasy/.gitignore+42 vendor/charm.land/fantasy/.golangci.yml+44 vendor/charm.land/fantasy/.goreleaser.yml+6 vendor/charm.land/fantasy/AGENTS.md+29 vendor/charm.land/fantasy/LICENSE+177 vendor/charm.land/fantasy/NOTICE+13 vendor/charm.land/fantasy/README.md+95 vendor/charm.land/fantasy/Taskfile.yaml+45 vendor/charm.land/fantasy/agent.go+1702 vendor/charm.land/fantasy/content.go+625 vendor/charm.land/fantasy/content_json.go+1046 vendor/charm.land/fantasy/crush.json+6 vendor/charm.land/fantasy/cspell.json+1 vendor/charm.land/fantasy/doc.go+2 vendor/charm.land/fantasy/errors.go+155 vendor/charm.land/fantasy/jsonrepair/jsonrepair.go+1648 vendor/charm.land/fantasy/model.go+261 vendor/charm.land/fantasy/model_json.go+156 vendor/charm.land/fantasy/object.go+236 vendor/charm.land/fantasy/object/object.go+620 vendor/charm.land/fantasy/provider.go+11 vendor/charm.land/fantasy/provider_registry.go+106 vendor/charm.land/fantasy/providers/anthropic/anthropic.go+1707 vendor/charm.land/fantasy/providers/anthropic/bedrock.go+15 vendor/charm.land/fantasy/providers/anthropic/call_useragent.go+14 vendor/charm.land/fantasy/providers/anthropic/computer_use.go+427 vendor/charm.land/fantasy/providers/anthropic/error.go+67 vendor/charm.land/fantasy/providers/anthropic/google.go+11 vendor/charm.land/fantasy/providers/anthropic/provider_options.go+283 vendor/charm.land/fantasy/providers/anthropic/sanitize.go+33 vendor/charm.land/fantasy/providers/azure/README.md+6 vendor/charm.land/fantasy/providers/azure/azure.go+125 vendor/charm.land/fantasy/providers/bedrock/README.md+10 vendor/charm.land/fantasy/providers/bedrock/bedrock.go+87 vendor/charm.land/fantasy/providers/google/README.md+63 vendor/charm.land/fantasy/providers/google/auth.go+15 vendor/charm.land/fantasy/providers/google/call_useragent.go+53 vendor/charm.land/fantasy/providers/google/error.go+51 vendor/charm.land/fantasy/providers/google/google.go+1488 vendor/charm.land/fantasy/providers/google/provider_options.go+146 vendor/charm.land/fantasy/providers/google/slice.go+11 vendor/charm.land/fantasy/providers/internal/httpheaders/httpheaders.go+60 vendor/charm.land/fantasy/providers/openai/call_useragent.go+31 vendor/charm.land/fantasy/providers/openai/error.go+92 vendor/charm.land/fantasy/providers/openai/language_model.go+990 vendor/charm.land/fantasy/providers/openai/language_model_hooks.go+668 vendor/charm.land/fantasy/providers/openai/openai.go+220 vendor/charm.land/fantasy/providers/openai/provider_options.go+217 vendor/charm.land/fantasy/providers/openai/responses_language_model.go+1678 vendor/charm.land/fantasy/providers/openai/responses_options.go+395 vendor/charm.land/fantasy/providers/openaicompat/language_model_hooks.go+516 vendor/charm.land/fantasy/providers/openaicompat/openaicompat.go+140 vendor/charm.land/fantasy/providers/openaicompat/provider_options.go+161 vendor/charm.land/fantasy/providers/openrouter/language_model_hooks.go+1063 vendor/charm.land/fantasy/providers/openrouter/openrouter.go+121 vendor/charm.land/fantasy/providers/openrouter/provider_options.go+218 vendor/charm.land/fantasy/providers/vercel/language_model_hooks.go+1074 vendor/charm.land/fantasy/providers/vercel/provider_options.go+195 vendor/charm.land/fantasy/providers/vercel/vercel.go+122 vendor/charm.land/fantasy/retry.go+155 vendor/charm.land/fantasy/schema/schema.go+442 vendor/charm.land/fantasy/tool.go+176 vendor/charm.land/fantasy/util.go+22 vendor/charm.land/fantasy/version.go+12 vendor/charm.land/fantasy/version.txt+1 vendor/charm.land/glamour/v2/.editorconfig+18 vendor/charm.land/glamour/v2/.gitattributes+2 vendor/charm.land/glamour/v2/.gitignore+2 vendor/charm.land/glamour/v2/.golangci.yml+44 vendor/charm.land/glamour/v2/.goreleaser.yml+6 vendor/charm.land/glamour/v2/CONTRIBUTING.md+23 vendor/charm.land/glamour/v2/LICENSE+21 vendor/charm.land/glamour/v2/README.md+129 vendor/charm.land/glamour/v2/Taskfile.yml+25 vendor/charm.land/glamour/v2/UPGRADE_GUIDE_V2.md+279 vendor/charm.land/glamour/v2/ansi/ansi.go+3 vendor/charm.land/glamour/v2/ansi/baseelement.go+157 vendor/charm.land/glamour/v2/ansi/blockelement.go+66 vendor/charm.land/glamour/v2/ansi/blockstack.go+95 vendor/charm.land/glamour/v2/ansi/codeblock.go+151 vendor/charm.land/glamour/v2/ansi/codespan.go+15 vendor/charm.land/glamour/v2/ansi/context.go+38 vendor/charm.land/glamour/v2/ansi/elements.go+481 vendor/charm.land/glamour/v2/ansi/emphasis.go+47 vendor/charm.land/glamour/v2/ansi/heading.go+80 vendor/charm.land/glamour/v2/ansi/image.go+57 vendor/charm.land/glamour/v2/ansi/link.go+112 vendor/charm.land/glamour/v2/ansi/listitem.go+29 vendor/charm.land/glamour/v2/ansi/margin.go+231 vendor/charm.land/glamour/v2/ansi/paragraph.go+63 vendor/charm.land/glamour/v2/ansi/renderer.go+166 vendor/charm.land/glamour/v2/ansi/style.go+252 vendor/charm.land/glamour/v2/ansi/table.go+206 vendor/charm.land/glamour/v2/ansi/table_links.go+234 vendor/charm.land/glamour/v2/ansi/task.go+27 vendor/charm.land/glamour/v2/ansi/templatehelper.go+86 vendor/charm.land/glamour/v2/examples.sh+19 vendor/charm.land/glamour/v2/gallery.sh+23 vendor/charm.land/glamour/v2/glamour.go+294 vendor/charm.land/glamour/v2/internal/autolink/autolink.go+55 vendor/charm.land/glamour/v2/styles/README.md+565 vendor/charm.land/glamour/v2/styles/ascii.json+87 vendor/charm.land/glamour/v2/styles/dark.json+191 vendor/charm.land/glamour/v2/styles/dracula.go+216 vendor/charm.land/glamour/v2/styles/dracula.json+188 vendor/charm.land/glamour/v2/styles/light.json+190 vendor/charm.land/glamour/v2/styles/notty.json+87 vendor/charm.land/glamour/v2/styles/pink.json+90 vendor/charm.land/glamour/v2/styles/styles.go+691 vendor/charm.land/glamour/v2/styles/tokyo-night.go+209 vendor/charm.land/glamour/v2/styles/tokyo-night.json+182 vendor/charm.land/glamour/v2/styles/tokyo_night.json+182 vendor/charm.land/lipgloss/v2/.editorconfig+18 vendor/charm.land/lipgloss/v2/.gitattributes+1 vendor/charm.land/lipgloss/v2/.gitignore+3 vendor/charm.land/lipgloss/v2/.golangci.yml+50 vendor/charm.land/lipgloss/v2/.goreleaser.yml+5 vendor/charm.land/lipgloss/v2/LICENSE+21 vendor/charm.land/lipgloss/v2/README.md+996 vendor/charm.land/lipgloss/v2/Taskfile.yaml+24 vendor/charm.land/lipgloss/v2/UPGRADE_GUIDE_V2.md+504 vendor/charm.land/lipgloss/v2/align.go+82 vendor/charm.land/lipgloss/v2/ansi_unix.go+8 vendor/charm.land/lipgloss/v2/ansi_windows.go+30 vendor/charm.land/lipgloss/v2/blending.go+196 vendor/charm.land/lipgloss/v2/borders.go+587 vendor/charm.land/lipgloss/v2/canvas.go+88 vendor/charm.land/lipgloss/v2/color.go+359 vendor/charm.land/lipgloss/v2/get.go+657 vendor/charm.land/lipgloss/v2/join.go+175 vendor/charm.land/lipgloss/v2/layer.go+327 vendor/charm.land/lipgloss/v2/lipgloss.go+3 vendor/charm.land/lipgloss/v2/position.go+134 vendor/charm.land/lipgloss/v2/query.go+92 vendor/charm.land/lipgloss/v2/ranges.go+48 vendor/charm.land/lipgloss/v2/runes.go+43 vendor/charm.land/lipgloss/v2/set.go+932 vendor/charm.land/lipgloss/v2/size.go+40 vendor/charm.land/lipgloss/v2/style.go+637 vendor/charm.land/lipgloss/v2/table/resizing.go+489 vendor/charm.land/lipgloss/v2/table/rows.go+130 vendor/charm.land/lipgloss/v2/table/table.go+568 vendor/charm.land/lipgloss/v2/table/util.go+44 vendor/charm.land/lipgloss/v2/terminal.go+124 vendor/charm.land/lipgloss/v2/tree/children.go+100 vendor/charm.land/lipgloss/v2/tree/enumerator.go+74 vendor/charm.land/lipgloss/v2/tree/renderer.go+165 vendor/charm.land/lipgloss/v2/tree/tree.go+407 vendor/charm.land/lipgloss/v2/unset.go+359 vendor/charm.land/lipgloss/v2/whitespace.go+76 vendor/charm.land/lipgloss/v2/wrap.go+113 vendor/charm.land/lipgloss/v2/writer.go+160 vendor/charm.land/log/v2/.gitignore+17 vendor/charm.land/log/v2/.golangci.yml+50 vendor/charm.land/log/v2/.goreleaser.yml+6 vendor/charm.land/log/v2/LICENSE+21 vendor/charm.land/log/v2/README.md+367 vendor/charm.land/log/v2/UPGRADE_GUIDE_V2.md+320 vendor/charm.land/log/v2/context.go+23 vendor/charm.land/log/v2/doc.go+3 vendor/charm.land/log/v2/formatter.go+27 vendor/charm.land/log/v2/json.go+157 vendor/charm.land/log/v2/level.go+65 vendor/charm.land/log/v2/logfmt.go+32 vendor/charm.land/log/v2/logger.go+413 vendor/charm.land/log/v2/logger_121.go+72 vendor/charm.land/log/v2/logger_no121.go+69 vendor/charm.land/log/v2/options.go+61 vendor/charm.land/log/v2/pkg.go+248 vendor/charm.land/log/v2/stdlog.go+67 vendor/charm.land/log/v2/styles.go+83 vendor/charm.land/log/v2/text.go+272 vendor/charm.land/x/vcr/LICENSE+21 vendor/charm.land/x/vcr/doc.go+3 vendor/charm.land/x/vcr/hooks.go+33 vendor/charm.land/x/vcr/marshaler.go+19 vendor/charm.land/x/vcr/matcher.go+70 vendor/charm.land/x/vcr/recorder.go+70 vendor/cloud.google.com/go/LICENSE+202 vendor/cloud.google.com/go/auth/CHANGES.md+483 vendor/cloud.google.com/go/auth/LICENSE+202 vendor/cloud.google.com/go/auth/README.md+40 vendor/cloud.google.com/go/auth/auth.go+618 vendor/cloud.google.com/go/auth/credentials/compute.go+102 vendor/cloud.google.com/go/auth/credentials/detect.go+471 vendor/cloud.google.com/go/auth/credentials/doc.go+45 vendor/cloud.google.com/go/auth/credentials/filetypes.go+329 vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/aws_provider.go+531 vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/executable_provider.go+284 vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/externalaccount.go+431 vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/file_provider.go+78 vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/info.go+74 vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/programmatic_provider.go+30 vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/url_provider.go+93 vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/x509_provider.go+220 vendor/cloud.google.com/go/auth/credentials/internal/externalaccountuser/externalaccountuser.go+115 vendor/cloud.google.com/go/auth/credentials/internal/gdch/gdch.go+198 vendor/cloud.google.com/go/auth/credentials/internal/impersonate/idtoken.go+105 vendor/cloud.google.com/go/auth/credentials/internal/impersonate/impersonate.go+168 vendor/cloud.google.com/go/auth/credentials/internal/stsexchange/sts_exchange.go+167 vendor/cloud.google.com/go/auth/credentials/selfsignedjwt.go+89 vendor/cloud.google.com/go/auth/grpctransport/dial_socketopt.go+62 vendor/cloud.google.com/go/auth/grpctransport/directpath.go+177 vendor/cloud.google.com/go/auth/grpctransport/grpctransport.go+675 vendor/cloud.google.com/go/auth/grpctransport/pool.go+119 vendor/cloud.google.com/go/auth/httptransport/httptransport.go+254 vendor/cloud.google.com/go/auth/httptransport/transport.go+548 vendor/cloud.google.com/go/auth/internal/compute/compute.go+65 vendor/cloud.google.com/go/auth/internal/compute/manufacturer.go+22 vendor/cloud.google.com/go/auth/internal/compute/manufacturer_linux.go+23 vendor/cloud.google.com/go/auth/internal/compute/manufacturer_windows.go+46 vendor/cloud.google.com/go/auth/internal/credsfile/credsfile.go+63 vendor/cloud.google.com/go/auth/internal/credsfile/filetype.go+159 vendor/cloud.google.com/go/auth/internal/credsfile/parse.go+99 vendor/cloud.google.com/go/auth/internal/internal.go+285 vendor/cloud.google.com/go/auth/internal/jwt/jwt.go+208 vendor/cloud.google.com/go/auth/internal/retry/retry.go+117 vendor/cloud.google.com/go/auth/internal/transport/cba.go+361 vendor/cloud.google.com/go/auth/internal/transport/cert/default_cert.go+65 vendor/cloud.google.com/go/auth/internal/transport/cert/enterprise_cert.go+54 vendor/cloud.google.com/go/auth/internal/transport/cert/secureconnect_cert.go+124 vendor/cloud.google.com/go/auth/internal/transport/cert/workload_cert.go+138 vendor/cloud.google.com/go/auth/internal/transport/headers/headers.go+61 vendor/cloud.google.com/go/auth/internal/transport/s2a.go+138 vendor/cloud.google.com/go/auth/internal/transport/transport.go+137 vendor/cloud.google.com/go/auth/internal/trustboundary/external_accounts_config_providers.go+100 vendor/cloud.google.com/go/auth/internal/trustboundary/trust_boundary.go+392 vendor/cloud.google.com/go/auth/internal/version.go+20 vendor/cloud.google.com/go/auth/oauth2adapt/CHANGES.md+82 vendor/cloud.google.com/go/auth/oauth2adapt/LICENSE+202 vendor/cloud.google.com/go/auth/oauth2adapt/oauth2adapt.go+200 vendor/cloud.google.com/go/auth/threelegged.go+382 vendor/cloud.google.com/go/civil/civil.go+500 vendor/cloud.google.com/go/compute/metadata/CHANGES.md+115 vendor/cloud.google.com/go/compute/metadata/LICENSE+202 vendor/cloud.google.com/go/compute/metadata/README.md+27 vendor/cloud.google.com/go/compute/metadata/log.go+149 vendor/cloud.google.com/go/compute/metadata/metadata.go+937 vendor/cloud.google.com/go/compute/metadata/retry.go+117 vendor/cloud.google.com/go/compute/metadata/retry_linux.go+31 vendor/cloud.google.com/go/compute/metadata/syscheck.go+28 vendor/cloud.google.com/go/compute/metadata/syscheck_linux.go+30 vendor/cloud.google.com/go/compute/metadata/syscheck_windows.go+39 vendor/git.sr.ht/~jackmordaunt/go-toast/.gitignore+1 vendor/git.sr.ht/~jackmordaunt/go-toast/ARCHITECTURE.md+244 vendor/git.sr.ht/~jackmordaunt/go-toast/LICENSE+61 vendor/git.sr.ht/~jackmordaunt/go-toast/README.md+86 vendor/git.sr.ht/~jackmordaunt/go-toast/constants.go+65 vendor/git.sr.ht/~jackmordaunt/go-toast/internal/winrt/data/xml/dom/xmldocument.go+73 vendor/git.sr.ht/~jackmordaunt/go-toast/internal/winrt/ui/notifications/toastnotification.go+88 vendor/git.sr.ht/~jackmordaunt/go-toast/internal/winrt/ui/notifications/toastnotificationmanager.go+53 vendor/git.sr.ht/~jackmordaunt/go-toast/internal/winrt/ui/notifications/toastnotificationmanagerforuser.go+68 vendor/git.sr.ht/~jackmordaunt/go-toast/internal/winrt/ui/notifications/toastnotifier.go+64 vendor/git.sr.ht/~jackmordaunt/go-toast/tmpl/powershell.go.tmpl+14 vendor/git.sr.ht/~jackmordaunt/go-toast/tmpl/tmpl.go+28 vendor/git.sr.ht/~jackmordaunt/go-toast/tmpl/xml.go.tmpl+34 vendor/git.sr.ht/~jackmordaunt/go-toast/toast.go+225 vendor/git.sr.ht/~jackmordaunt/go-toast/wintoast/bind.go+86 vendor/git.sr.ht/~jackmordaunt/go-toast/wintoast/bind_noop.go+19 vendor/git.sr.ht/~jackmordaunt/go-toast/wintoast/bind_windows.go+174 vendor/git.sr.ht/~jackmordaunt/go-toast/wintoast/impl.go+179 vendor/git.sr.ht/~jackmordaunt/go-toast/wintoast/procs.go+37 vendor/git.sr.ht/~jackmordaunt/go-toast/wintoast/registry.go+110 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/CHANGELOG.md+849 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/LICENSE.txt+21 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/README.md+39 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/ci.yml+29 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud/cloud.go+44 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud/doc.go+53 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/core.go+173 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/doc.go+264 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/errors.go+17 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/etag.go+57 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/exported.go+175 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/pipeline.go+77 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/request.go+260 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/response_error.go+201 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log/log.go+50 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/async/async.go+159 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/body/body.go+135 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/fake/fake.go+133 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/loc/loc.go+123 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/op/op.go+148 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/poller.go+24 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/util.go+212 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/constants.go+44 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/shared.go+149 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/log/doc.go+10 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/log/log.go+55 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/policy/doc.go+10 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/policy/policy.go+198 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/doc.go+10 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/errors.go+27 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pager.go+138 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pipeline.go+94 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_api_version.go+75 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_bearer_token.go+236 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_body_download.go+72 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_http_header.go+40 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_http_trace.go+154 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_include_response.go+35 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_key_credential.go+64 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_logging.go+264 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_request_id.go+34 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_retry.go+276 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_sas_credential.go+55 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_telemetry.go+83 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/poller.go+396 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/request.go+281 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/response.go+109 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/transport_default_dialer_other.go+15 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/transport_default_dialer_wasm.go+15 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/transport_default_http_client.go+48 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming/doc.go+9 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming/progress.go+89 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing/constants.go+41 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing/tracing.go+191 vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/LICENSE.txt+21 vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/diag/diag.go+51 vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/diag/doc.go+7 vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/errorinfo/doc.go+7 vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/errorinfo/errorinfo.go+46 vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/exported/exported.go+129 vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/log/doc.go+7 vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/log/log.go+104 vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/poller/util.go+155 vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/temporal/resource.go+123 vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/uuid/doc.go+7 vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/uuid/uuid.go+76 vendor/github.com/JohannesKaufmann/html-to-markdown/.gitignore+14 vendor/github.com/JohannesKaufmann/html-to-markdown/CONTRIBUTING.md vendor/github.com/JohannesKaufmann/html-to-markdown/LICENSE+21 vendor/github.com/JohannesKaufmann/html-to-markdown/README.md+242 vendor/github.com/JohannesKaufmann/html-to-markdown/SECURITY.md+6 vendor/github.com/JohannesKaufmann/html-to-markdown/commonmark.go+393 vendor/github.com/JohannesKaufmann/html-to-markdown/escape/escape.go+65 vendor/github.com/JohannesKaufmann/html-to-markdown/from.go+464 vendor/github.com/JohannesKaufmann/html-to-markdown/logo_five_years.png vendor/github.com/JohannesKaufmann/html-to-markdown/markdown.go+212 vendor/github.com/JohannesKaufmann/html-to-markdown/utils.go+533 vendor/github.com/KyleBanks/depth/.gitignore+16 vendor/github.com/KyleBanks/depth/.travis.yml+9 vendor/github.com/KyleBanks/depth/LICENSE+21 vendor/github.com/KyleBanks/depth/Makefile+32 vendor/github.com/KyleBanks/depth/README.md+232 vendor/github.com/KyleBanks/depth/depth.go+129 vendor/github.com/KyleBanks/depth/pkg.go+184 vendor/github.com/MakeNowJust/heredoc/LICENSE+21 vendor/github.com/MakeNowJust/heredoc/README.md+52 vendor/github.com/MakeNowJust/heredoc/heredoc.go+105 vendor/github.com/Microsoft/go-winio/.gitattributes+1 vendor/github.com/Microsoft/go-winio/.gitignore+10 vendor/github.com/Microsoft/go-winio/.golangci.yml+147 vendor/github.com/Microsoft/go-winio/CODEOWNERS+1 vendor/github.com/Microsoft/go-winio/LICENSE+22 vendor/github.com/Microsoft/go-winio/README.md+89 vendor/github.com/Microsoft/go-winio/SECURITY.md+41 vendor/github.com/Microsoft/go-winio/backup.go+287 vendor/github.com/Microsoft/go-winio/doc.go+22 vendor/github.com/Microsoft/go-winio/ea.go+137 vendor/github.com/Microsoft/go-winio/file.go+320 vendor/github.com/Microsoft/go-winio/fileinfo.go+106 vendor/github.com/Microsoft/go-winio/hvsock.go+582 vendor/github.com/Microsoft/go-winio/internal/fs/doc.go+2 vendor/github.com/Microsoft/go-winio/internal/fs/fs.go+262 vendor/github.com/Microsoft/go-winio/internal/fs/security.go+12 vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go+61 vendor/github.com/Microsoft/go-winio/internal/socket/rawaddr.go+20 vendor/github.com/Microsoft/go-winio/internal/socket/socket.go+177 vendor/github.com/Microsoft/go-winio/internal/socket/zsyscall_windows.go+69 vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go+132 vendor/github.com/Microsoft/go-winio/pipe.go+586 vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go+232 vendor/github.com/Microsoft/go-winio/pkg/guid/guid_nonwindows.go+16 vendor/github.com/Microsoft/go-winio/pkg/guid/guid_windows.go+13 vendor/github.com/Microsoft/go-winio/pkg/guid/variant_string.go+27 vendor/github.com/Microsoft/go-winio/privilege.go+196 vendor/github.com/Microsoft/go-winio/reparse.go+131 vendor/github.com/Microsoft/go-winio/sd.go+133 vendor/github.com/Microsoft/go-winio/syscall.go+5 vendor/github.com/Microsoft/go-winio/zsyscall_windows.go+378 vendor/github.com/PuerkitoBio/goquery/.gitattributes+1 vendor/github.com/PuerkitoBio/goquery/.gitignore+16 vendor/github.com/PuerkitoBio/goquery/LICENSE+12 vendor/github.com/PuerkitoBio/goquery/README.md+218 vendor/github.com/PuerkitoBio/goquery/array.go+124 vendor/github.com/PuerkitoBio/goquery/doc.go+123 vendor/github.com/PuerkitoBio/goquery/expand.go+70 vendor/github.com/PuerkitoBio/goquery/filter.go+163 vendor/github.com/PuerkitoBio/goquery/iteration.go+61 vendor/github.com/PuerkitoBio/goquery/manipulation.go+679 vendor/github.com/PuerkitoBio/goquery/property.go+275 vendor/github.com/PuerkitoBio/goquery/query.go+49 vendor/github.com/PuerkitoBio/goquery/traversal.go+704 vendor/github.com/PuerkitoBio/goquery/type.go+203 vendor/github.com/PuerkitoBio/goquery/utilities.go+177 vendor/github.com/alecthomas/chroma/v2/.editorconfig+17 vendor/github.com/alecthomas/chroma/v2/.gitignore+28 vendor/github.com/alecthomas/chroma/v2/.golangci.yml+122 vendor/github.com/alecthomas/chroma/v2/.goreleaser.yml+34 vendor/github.com/alecthomas/chroma/v2/AGENTS.md+11 vendor/github.com/alecthomas/chroma/v2/BUILD.bit+93 vendor/github.com/alecthomas/chroma/v2/COPYING+118 vendor/github.com/alecthomas/chroma/v2/Dockerfile+64 vendor/github.com/alecthomas/chroma/v2/Justfile+59 vendor/github.com/alecthomas/chroma/v2/README.md+309 vendor/github.com/alecthomas/chroma/v2/biome.json+6 vendor/github.com/alecthomas/chroma/v2/chroma.jpg vendor/github.com/alecthomas/chroma/v2/coalesce.go+35 vendor/github.com/alecthomas/chroma/v2/colour.go+192 vendor/github.com/alecthomas/chroma/v2/delegate.go+161 vendor/github.com/alecthomas/chroma/v2/doc.go+7 vendor/github.com/alecthomas/chroma/v2/emitters.go+233 vendor/github.com/alecthomas/chroma/v2/formatter.go+43 vendor/github.com/alecthomas/chroma/v2/formatters/api.go+57 vendor/github.com/alecthomas/chroma/v2/formatters/html/html.go+692 vendor/github.com/alecthomas/chroma/v2/formatters/json.go+39 vendor/github.com/alecthomas/chroma/v2/formatters/svg/font_liberation_mono.go+51 vendor/github.com/alecthomas/chroma/v2/formatters/svg/svg.go+222 vendor/github.com/alecthomas/chroma/v2/formatters/tokens.go+18 vendor/github.com/alecthomas/chroma/v2/formatters/tty_indexed.go+284 vendor/github.com/alecthomas/chroma/v2/formatters/tty_truecolour.go+76 vendor/github.com/alecthomas/chroma/v2/iterator.go+93 vendor/github.com/alecthomas/chroma/v2/lexer.go+179 vendor/github.com/alecthomas/chroma/v2/lexers/README.md+46 vendor/github.com/alecthomas/chroma/v2/lexers/caddyfile.go+275 vendor/github.com/alecthomas/chroma/v2/lexers/cl.go+243 vendor/github.com/alecthomas/chroma/v2/lexers/dns.go+17 vendor/github.com/alecthomas/chroma/v2/lexers/emacs.go+533 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/abap.xml+154 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/abnf.xml+66 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/actionscript.xml+68 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/actionscript_3.xml+163 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ada.xml+321 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/agda.xml+66 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/al.xml+75 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/alloy.xml+58 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ampl.xml+98 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/angular2.xml+109 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/antlr.xml+317 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/apacheconf.xml+74 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/apl.xml+59 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/applescript.xml+151 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/arangodb_aql.xml+174 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/arduino.xml+322 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/armasm.xml+126 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/arturo.xml+119 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/atl.xml+165 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/autohotkey.xml+78 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/autoit.xml+70 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/awk.xml+95 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ballerina.xml+97 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/bash.xml+222 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/bash_session.xml+25 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/batchfile.xml+660 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/beef.xml+120 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/bibtex.xml+152 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/bicep.xml+84 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/blitzbasic.xml+141 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/bnf.xml+28 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/bqn.xml+83 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/brainfuck.xml+51 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/c#.xml+121 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/c++.xml+331 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/c.xml+260 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/c3.xml+374 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cap_n_proto.xml+122 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cassandra_cql.xml+137 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ceylon.xml+151 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cfengine3.xml+197 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cfstatement.xml+92 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/chaiscript.xml+134 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/chapel.xml+143 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cheetah.xml+55 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/clojure.xml+71 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cmake.xml+90 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cobol.xml+90 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/coffeescript.xml+210 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/common_lisp.xml+184 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/coq.xml+136 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/core.xml+79 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/crystal.xml+762 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/css.xml+323 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/csv.xml+53 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cue.xml+85 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cython.xml+372 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/d.xml+133 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/dart.xml+213 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/dax.xml+39 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/desktop_entry.xml+17 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/devicetree.xml+251 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/diff.xml+52 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/django_jinja.xml+153 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/dns.xml+44 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/docker.xml+68 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/dtd.xml+168 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/dylan.xml+176 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ebnf.xml+90 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/elixir.xml+744 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/elm.xml+119 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/emacslisp.xml+132 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/erb.xml+37 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/erlang.xml+166 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/factor.xml+412 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/fennel.xml+68 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/fish.xml+159 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/forth.xml+78 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/fortran.xml+102 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/fortranfixed.xml+71 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/fsharp.xml+245 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/gas.xml+150 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/gdscript.xml+259 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/gdscript3.xml+270 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/gemfile_lock.xml+81 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/gettext.xml+24 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/gherkin.xml+263 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/gleam.xml+100 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/glsl.xml+65 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/gnuplot.xml+289 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/go_template.xml+114 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/graphql.xml+92 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/groff.xml+90 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/groovy.xml+135 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/handlebars.xml+147 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/hare.xml+98 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/haskell.xml+275 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/hcl.xml+143 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/hexdump.xml+189 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/hlb.xml+131 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/hlsl.xml+110 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/holyc.xml+252 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/html.xml+159 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/hy.xml+104 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/idris.xml+216 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/igor.xml+47 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ini.xml+52 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/io.xml+71 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/iscdhcpd.xml+96 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/j.xml+157 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/janet.xml+48 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/java.xml+206 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/javascript.xml+160 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/json.xml+117 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/jsonata.xml+83 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/jsonnet.xml+138 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/julia.xml+400 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/jungle.xml+98 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/kakoune.xml+96 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/kdl.xml+75 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/kotlin.xml+234 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/lateralus.xml+184 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/lean.xml+56 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/lighttpd_configuration_file.xml+42 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/lilypond.xml+133 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/llvm.xml+73 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/lox.xml+78 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/lua.xml+158 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/luau.xml+173 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/makefile.xml+131 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/mako.xml+120 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/mason.xml+89 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/materialize_sql_dialect.xml+155 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/mathematica.xml+60 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/matlab.xml+114 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/mcfunction.xml+138 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/meson.xml+86 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/metal.xml+270 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/microcad.xml+139 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/minizinc.xml+82 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/mlir.xml+73 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/modelica.xml+106 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/modula-2.xml+245 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/mojo.xml+228 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/monkeyc.xml+153 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/moonbit.xml+75 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/moonscript.xml+83 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/morrowindscript.xml+90 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/myghty.xml+77 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/mysql.xml+121 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/nasm.xml+126 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/natural.xml+143 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ndisasm.xml+123 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/newspeak.xml+121 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/nginx_configuration_file.xml+101 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/nim.xml+211 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/nix.xml+258 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/nsis.xml+59 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/nu.xml+126 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/objective-c.xml+510 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/objectpascal.xml+142 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ocaml.xml+153 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/octave.xml+101 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/odin.xml+127 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/onesenterprise.xml+92 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/openedge_abl.xml+101 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/openscad.xml+96 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/org_mode.xml+329 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/pacmanconf.xml+37 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/perl.xml+400 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/php.xml+258 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/pig.xml+105 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/pkgconfig.xml+73 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/pl_pgsql.xml+119 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/plaintext.xml+21 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/plutus_core.xml+105 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/pony.xml+135 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/postgresql_sql_dialect.xml+155 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/postscript.xml+93 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/povray.xml+58 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/powerquery.xml+51 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/powershell.xml+230 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/prolog.xml+115 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/promela.xml+119 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/promql.xml+123 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/properties.xml+45 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/protocol_buffer.xml+124 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/prql.xml+161 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/psl.xml+213 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/puppet.xml+100 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/python.xml+595 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/python_2.xml+356 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/qbasic.xml+173 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/qml.xml+113 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/r.xml+128 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/racket.xml+260 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ragel.xml+149 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/react.xml+236 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/reasonml.xml+147 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/reg.xml+68 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/rego.xml+94 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/rexx.xml+127 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/rgbasm.xml+239 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ring.xml+74 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/rpgle.xml+176 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/rpm_spec.xml+58 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ruby.xml+728 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/rust.xml+375 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/sas.xml+191 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/sass.xml+362 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/scala.xml+274 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/scdoc.xml+115 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/scheme.xml+106 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/scilab.xml+98 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/scss.xml+373 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/sed.xml+92 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/sieve.xml+61 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/smali.xml+73 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/smalltalk.xml+294 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/smarty.xml+79 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/snbt.xml+58 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/snobol.xml+95 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/solidity.xml+291 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/sourcepawn.xml+59 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/spade.xml+292 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/sparql.xml+160 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/sql.xml+90 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/squidconf.xml+63 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/standard_ml.xml+548 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/stas.xml+85 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/stylus.xml+132 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/swift.xml+207 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/systemd.xml+63 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/systemverilog.xml+181 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/tablegen.xml+69 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/tal.xml+43 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/tasm.xml+135 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/tcl.xml+272 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/tcsh.xml+121 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/templ.xml+315 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/termcap.xml+75 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/terminfo.xml+84 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/terraform.xml+149 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/tex.xml+113 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/thrift.xml+154 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/toml.xml+45 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/tradingview.xml+81 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/transact-sql.xml+137 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/turing.xml+82 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/turtle.xml+170 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/twig.xml+155 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/txtpb.xml+162 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/typescript.xml+302 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/typoscript.xml+178 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/typoscriptcssdata.xml+52 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/typoscripthtmldata.xml+52 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/typst.xml+108 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ucode.xml+147 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/v.xml+355 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/v_shell.xml+365 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/vala.xml+72 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/vb_net.xml+162 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/verilog.xml+158 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/vhdl.xml+171 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/vhs.xml+48 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/viml.xml+85 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/vue.xml+295 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/wat.xml+149 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/wdte.xml+43 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/webgpu_shading_language.xml+142 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/webvtt.xml+283 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/whiley.xml+57 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/xml.xml+96 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/xorg.xml+35 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/yaml.xml+132 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/yang.xml+99 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/z80_assembly.xml+74 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/zed.xml+51 vendor/github.com/alecthomas/chroma/v2/lexers/embedded/zig.xml+187 vendor/github.com/alecthomas/chroma/v2/lexers/erb.go+29 vendor/github.com/alecthomas/chroma/v2/lexers/gemtext.go+37 vendor/github.com/alecthomas/chroma/v2/lexers/genshi.go+118 vendor/github.com/alecthomas/chroma/v2/lexers/go.go+81 vendor/github.com/alecthomas/chroma/v2/lexers/haxe.go+647 vendor/github.com/alecthomas/chroma/v2/lexers/html.go+8 vendor/github.com/alecthomas/chroma/v2/lexers/http.go+131 vendor/github.com/alecthomas/chroma/v2/lexers/lexers.go+85 vendor/github.com/alecthomas/chroma/v2/lexers/markdown.go+107 vendor/github.com/alecthomas/chroma/v2/lexers/markless.go+168 vendor/github.com/alecthomas/chroma/v2/lexers/mysql.go+33 vendor/github.com/alecthomas/chroma/v2/lexers/php.go+37 vendor/github.com/alecthomas/chroma/v2/lexers/raku.go+1710 vendor/github.com/alecthomas/chroma/v2/lexers/rst.go+89 vendor/github.com/alecthomas/chroma/v2/lexers/svelte.go+70 vendor/github.com/alecthomas/chroma/v2/lexers/typoscript.go+85 vendor/github.com/alecthomas/chroma/v2/lexers/yaml_jinja.go+20 vendor/github.com/alecthomas/chroma/v2/lexers/zed.go+24 vendor/github.com/alecthomas/chroma/v2/mutators.go+201 vendor/github.com/alecthomas/chroma/v2/pygments-lexers.txt+605 vendor/github.com/alecthomas/chroma/v2/quick/quick.go+44 vendor/github.com/alecthomas/chroma/v2/regexp.go+533 vendor/github.com/alecthomas/chroma/v2/registry.go+228 vendor/github.com/alecthomas/chroma/v2/remap.go+94 vendor/github.com/alecthomas/chroma/v2/renovate.json5+25 vendor/github.com/alecthomas/chroma/v2/serialise.go+483 vendor/github.com/alecthomas/chroma/v2/style.go+530 vendor/github.com/alecthomas/chroma/v2/styles/abap.xml+11 vendor/github.com/alecthomas/chroma/v2/styles/algol.xml+18 vendor/github.com/alecthomas/chroma/v2/styles/algol_nu.xml+18 vendor/github.com/alecthomas/chroma/v2/styles/api.go+95 vendor/github.com/alecthomas/chroma/v2/styles/arduino.xml+18 vendor/github.com/alecthomas/chroma/v2/styles/ashen.xml+69 vendor/github.com/alecthomas/chroma/v2/styles/aura-theme-dark-soft.xml+107 vendor/github.com/alecthomas/chroma/v2/styles/aura-theme-dark.xml+107 vendor/github.com/alecthomas/chroma/v2/styles/autumn.xml+36 vendor/github.com/alecthomas/chroma/v2/styles/average.xml+74 vendor/github.com/alecthomas/chroma/v2/styles/base16-snazzy.xml+74 vendor/github.com/alecthomas/chroma/v2/styles/borland.xml+26 vendor/github.com/alecthomas/chroma/v2/styles/bw.xml+23 vendor/github.com/alecthomas/chroma/v2/styles/catppuccin-frappe.xml+83 vendor/github.com/alecthomas/chroma/v2/styles/catppuccin-latte.xml+83 vendor/github.com/alecthomas/chroma/v2/styles/catppuccin-macchiato.xml+83 vendor/github.com/alecthomas/chroma/v2/styles/catppuccin-mocha.xml+83 vendor/github.com/alecthomas/chroma/v2/styles/colorful.xml+52 vendor/github.com/alecthomas/chroma/v2/styles/compat.go+69 vendor/github.com/alecthomas/chroma/v2/styles/darcula.xml+83 vendor/github.com/alecthomas/chroma/v2/styles/doom-one.xml+51 vendor/github.com/alecthomas/chroma/v2/styles/doom-one2.xml+64 vendor/github.com/alecthomas/chroma/v2/styles/dracula.xml+74 vendor/github.com/alecthomas/chroma/v2/styles/emacs.xml+44 vendor/github.com/alecthomas/chroma/v2/styles/evergarden.xml+33 vendor/github.com/alecthomas/chroma/v2/styles/friendly.xml+44 vendor/github.com/alecthomas/chroma/v2/styles/fruity.xml+19 vendor/github.com/alecthomas/chroma/v2/styles/github-dark.xml+46 vendor/github.com/alecthomas/chroma/v2/styles/github.xml+39 vendor/github.com/alecthomas/chroma/v2/styles/gruvbox-light.xml+34 vendor/github.com/alecthomas/chroma/v2/styles/gruvbox.xml+34 vendor/github.com/alecthomas/chroma/v2/styles/hr_high_contrast.xml+12 vendor/github.com/alecthomas/chroma/v2/styles/hrdark.xml+10 vendor/github.com/alecthomas/chroma/v2/styles/igor.xml+9 vendor/github.com/alecthomas/chroma/v2/styles/kanagawa-dragon.xml+83 vendor/github.com/alecthomas/chroma/v2/styles/kanagawa-lotus.xml+83 vendor/github.com/alecthomas/chroma/v2/styles/kanagawa-wave.xml+83 vendor/github.com/alecthomas/chroma/v2/styles/lovelace.xml+53 vendor/github.com/alecthomas/chroma/v2/styles/manni.xml+44 vendor/github.com/alecthomas/chroma/v2/styles/modus-operandi.xml+13 vendor/github.com/alecthomas/chroma/v2/styles/modus-vivendi.xml+13 vendor/github.com/alecthomas/chroma/v2/styles/monokai.xml+29 vendor/github.com/alecthomas/chroma/v2/styles/monokailight.xml+26 vendor/github.com/alecthomas/chroma/v2/styles/murphy.xml+52 vendor/github.com/alecthomas/chroma/v2/styles/native.xml+35 vendor/github.com/alecthomas/chroma/v2/styles/nord.xml+46 vendor/github.com/alecthomas/chroma/v2/styles/nordic.xml+46 vendor/github.com/alecthomas/chroma/v2/styles/onedark.xml+25 vendor/github.com/alecthomas/chroma/v2/styles/onesenterprise.xml+10 vendor/github.com/alecthomas/chroma/v2/styles/paraiso-dark.xml+37 vendor/github.com/alecthomas/chroma/v2/styles/paraiso-light.xml+37 vendor/github.com/alecthomas/chroma/v2/styles/pastie.xml+45 vendor/github.com/alecthomas/chroma/v2/styles/perldoc.xml+37 vendor/github.com/alecthomas/chroma/v2/styles/pygments.xml+42 vendor/github.com/alecthomas/chroma/v2/styles/rainbow_dash.xml+40 vendor/github.com/alecthomas/chroma/v2/styles/rose-pine-dawn.xml+29 vendor/github.com/alecthomas/chroma/v2/styles/rose-pine-moon.xml+29 vendor/github.com/alecthomas/chroma/v2/styles/rose-pine.xml+29 vendor/github.com/alecthomas/chroma/v2/styles/rpgle.xml+30 vendor/github.com/alecthomas/chroma/v2/styles/rrt.xml+19 vendor/github.com/alecthomas/chroma/v2/styles/solarized-dark.xml+39 vendor/github.com/alecthomas/chroma/v2/styles/solarized-dark256.xml+41 vendor/github.com/alecthomas/chroma/v2/styles/solarized-light.xml+17 vendor/github.com/alecthomas/chroma/v2/styles/swapoff.xml+18 vendor/github.com/alecthomas/chroma/v2/styles/tango.xml+72 vendor/github.com/alecthomas/chroma/v2/styles/tokyonight-day.xml+83 vendor/github.com/alecthomas/chroma/v2/styles/tokyonight-moon.xml+83 vendor/github.com/alecthomas/chroma/v2/styles/tokyonight-night.xml+83 vendor/github.com/alecthomas/chroma/v2/styles/tokyonight-storm.xml+83 vendor/github.com/alecthomas/chroma/v2/styles/trac.xml+35 vendor/github.com/alecthomas/chroma/v2/styles/vim.xml+29 vendor/github.com/alecthomas/chroma/v2/styles/vs.xml+16 vendor/github.com/alecthomas/chroma/v2/styles/vulcan.xml+74 vendor/github.com/alecthomas/chroma/v2/styles/witchhazel.xml+31 vendor/github.com/alecthomas/chroma/v2/styles/xcode-dark.xml+31 vendor/github.com/alecthomas/chroma/v2/styles/xcode.xml+22 vendor/github.com/alecthomas/chroma/v2/table.py+31 vendor/github.com/alecthomas/chroma/v2/test.jsonl+2 vendor/github.com/alecthomas/chroma/v2/tokentype_enumer.go+588 vendor/github.com/alecthomas/chroma/v2/types.go+357 vendor/github.com/andybalholm/brotli/.gitignore+2 vendor/github.com/andybalholm/brotli/LICENSE+19 vendor/github.com/andybalholm/brotli/README.md+19 vendor/github.com/andybalholm/brotli/backward_references.go+185 vendor/github.com/andybalholm/brotli/backward_references_hq.go+796 vendor/github.com/andybalholm/brotli/bit_cost.go+436 vendor/github.com/andybalholm/brotli/bit_reader.go+266 vendor/github.com/andybalholm/brotli/bitwriter.go+56 vendor/github.com/andybalholm/brotli/block_splitter.go+144 vendor/github.com/andybalholm/brotli/block_splitter_command.go+434 vendor/github.com/andybalholm/brotli/block_splitter_distance.go+433 vendor/github.com/andybalholm/brotli/block_splitter_literal.go+433 vendor/github.com/andybalholm/brotli/brotli_bit_stream.go+1435 vendor/github.com/andybalholm/brotli/cluster.go+30 vendor/github.com/andybalholm/brotli/cluster_command.go+164 vendor/github.com/andybalholm/brotli/cluster_distance.go+326 vendor/github.com/andybalholm/brotli/cluster_literal.go+326 vendor/github.com/andybalholm/brotli/command.go+254 vendor/github.com/andybalholm/brotli/compress_fragment.go+834 vendor/github.com/andybalholm/brotli/compress_fragment_two_pass.go+775 vendor/github.com/andybalholm/brotli/constants.go+77 vendor/github.com/andybalholm/brotli/context.go+2176 vendor/github.com/andybalholm/brotli/decode.go+2581 vendor/github.com/andybalholm/brotli/dictionary.go+122890 vendor/github.com/andybalholm/brotli/dictionary_hash.go+32779 vendor/github.com/andybalholm/brotli/encode.go+1220 vendor/github.com/andybalholm/brotli/encoder.go+177 vendor/github.com/andybalholm/brotli/encoder_dict.go+22 vendor/github.com/andybalholm/brotli/encoder_fast.go+197 vendor/github.com/andybalholm/brotli/entropy_encode.go+592 vendor/github.com/andybalholm/brotli/entropy_encode_static.go+4399 vendor/github.com/andybalholm/brotli/fast_log.go+290 vendor/github.com/andybalholm/brotli/find_match_length.go+45 vendor/github.com/andybalholm/brotli/flate/LICENSE+27 vendor/github.com/andybalholm/brotli/flate/README.md+2 vendor/github.com/andybalholm/brotli/flate/gzip.go+65 vendor/github.com/andybalholm/brotli/flate/huffman_bit_writer.go+517 vendor/github.com/andybalholm/brotli/flate/huffman_code.go+346 vendor/github.com/andybalholm/brotli/flate/token.go+80 vendor/github.com/andybalholm/brotli/flate/writer.go+66 vendor/github.com/andybalholm/brotli/h10.go+287 vendor/github.com/andybalholm/brotli/h5.go+214 vendor/github.com/andybalholm/brotli/h6.go+216 vendor/github.com/andybalholm/brotli/hash.go+342 vendor/github.com/andybalholm/brotli/hash_composite.go+93 vendor/github.com/andybalholm/brotli/hash_forgetful_chain.go+252 vendor/github.com/andybalholm/brotli/hash_longest_match_quickly.go+214 vendor/github.com/andybalholm/brotli/hash_rolling.go+168 vendor/github.com/andybalholm/brotli/histogram.go+226 vendor/github.com/andybalholm/brotli/http.go+189 vendor/github.com/andybalholm/brotli/huffman.go+653 vendor/github.com/andybalholm/brotli/literal_cost.go+182 vendor/github.com/andybalholm/brotli/matchfinder/bargain1.go+212 vendor/github.com/andybalholm/brotli/matchfinder/bargain2.go+248 vendor/github.com/andybalholm/brotli/matchfinder/bargain3.go+278 vendor/github.com/andybalholm/brotli/matchfinder/emitter.go+34 vendor/github.com/andybalholm/brotli/matchfinder/m0.go+175 vendor/github.com/andybalholm/brotli/matchfinder/m4.go+339 vendor/github.com/andybalholm/brotli/matchfinder/matchfinder.go+103 vendor/github.com/andybalholm/brotli/matchfinder/pathfinder.go+328 vendor/github.com/andybalholm/brotli/matchfinder/textencoder.go+53 vendor/github.com/andybalholm/brotli/matchfinder/trio.go+326 vendor/github.com/andybalholm/brotli/matchfinder/zdfast.go+258 vendor/github.com/andybalholm/brotli/matchfinder/zfast.go+206 vendor/github.com/andybalholm/brotli/matchfinder/zm.go+301 vendor/github.com/andybalholm/brotli/memory.go+66 vendor/github.com/andybalholm/brotli/metablock.go+574 vendor/github.com/andybalholm/brotli/metablock_command.go+165 vendor/github.com/andybalholm/brotli/metablock_distance.go+165 vendor/github.com/andybalholm/brotli/metablock_literal.go+165 vendor/github.com/andybalholm/brotli/params.go+37 vendor/github.com/andybalholm/brotli/platform.go+103 vendor/github.com/andybalholm/brotli/prefix.go+30 vendor/github.com/andybalholm/brotli/prefix_dec.go+723 vendor/github.com/andybalholm/brotli/quality.go+196 vendor/github.com/andybalholm/brotli/reader.go+111 vendor/github.com/andybalholm/brotli/ringbuffer.go+134 vendor/github.com/andybalholm/brotli/state.go+294 vendor/github.com/andybalholm/brotli/static_dict.go+662 vendor/github.com/andybalholm/brotli/static_dict_lut.go+75094 vendor/github.com/andybalholm/brotli/symbol_list.go+22 vendor/github.com/andybalholm/brotli/transform.go+641 vendor/github.com/andybalholm/brotli/utf8_util.go+70 vendor/github.com/andybalholm/brotli/util.go+7 vendor/github.com/andybalholm/brotli/write_bits.go+52 vendor/github.com/andybalholm/brotli/writer.go+162 vendor/github.com/andybalholm/cascadia/.travis.yml+14 vendor/github.com/andybalholm/cascadia/LICENSE+24 vendor/github.com/andybalholm/cascadia/README.md+144 vendor/github.com/andybalholm/cascadia/parser.go+889 vendor/github.com/andybalholm/cascadia/pseudo_classes.go+458 vendor/github.com/andybalholm/cascadia/selector.go+586 vendor/github.com/andybalholm/cascadia/serialize.go+176 vendor/github.com/andybalholm/cascadia/specificity.go+26 vendor/github.com/atotto/clipboard/.travis.yml+22 vendor/github.com/atotto/clipboard/LICENSE+27 vendor/github.com/atotto/clipboard/README.md+48 vendor/github.com/atotto/clipboard/clipboard.go+20 vendor/github.com/atotto/clipboard/clipboard_darwin.go+52 vendor/github.com/atotto/clipboard/clipboard_plan9.go+42 vendor/github.com/atotto/clipboard/clipboard_unix.go+149 vendor/github.com/atotto/clipboard/clipboard_windows.go+157 vendor/github.com/aws/aws-sdk-go-v2/LICENSE.txt+202 vendor/github.com/aws/aws-sdk-go-v2/NOTICE.txt+3 vendor/github.com/aws/aws-sdk-go-v2/aws/accountid_endpoint_mode.go+18 vendor/github.com/aws/aws-sdk-go-v2/aws/checksum.go+33 vendor/github.com/aws/aws-sdk-go-v2/aws/config.go+254 vendor/github.com/aws/aws-sdk-go-v2/aws/context.go+22 vendor/github.com/aws/aws-sdk-go-v2/aws/credential_cache.go+235 vendor/github.com/aws/aws-sdk-go-v2/aws/credentials.go+234 vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/auto.go+38 vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/configuration.go+43 vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/defaults.go+50 vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/doc.go+2 vendor/github.com/aws/aws-sdk-go-v2/aws/defaultsmode.go+95 vendor/github.com/aws/aws-sdk-go-v2/aws/doc.go+62 vendor/github.com/aws/aws-sdk-go-v2/aws/endpoints.go+247 vendor/github.com/aws/aws-sdk-go-v2/aws/errors.go+9 vendor/github.com/aws/aws-sdk-go-v2/aws/from_ptr.go+365 vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go+6 vendor/github.com/aws/aws-sdk-go-v2/aws/logging.go+119 vendor/github.com/aws/aws-sdk-go-v2/aws/logging_generate.go+95 vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/metadata.go+213 vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/middleware.go+168 vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/osname.go+24 vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/osname_go115.go+24 vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/recursion_detection.go+94 vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/request_id.go+27 vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/request_id_retriever.go+57 vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/user_agent.go+398 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/CHANGELOG.md+203 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/LICENSE.txt+202 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/debug.go+144 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/decode.go+218 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/encode.go+167 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/error.go+23 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi/headers.go+24 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi/middleware.go+71 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi/transport.go+13 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi/transport_go117.go+12 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/go_module_metadata.go+6 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/header.go+175 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/header_value.go+521 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/message.go+99 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/array.go+61 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/encoder.go+80 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/map.go+78 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/middleware.go+62 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/object.go+68 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/value.go+117 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/restjson/decoder_util.go+85 vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/xml/error_utils.go+48 vendor/github.com/aws/aws-sdk-go-v2/aws/ratelimit/none.go+20 vendor/github.com/aws/aws-sdk-go-v2/aws/ratelimit/token_bucket.go+96 vendor/github.com/aws/aws-sdk-go-v2/aws/ratelimit/token_rate_limit.go+83 vendor/github.com/aws/aws-sdk-go-v2/aws/request.go+25 vendor/github.com/aws/aws-sdk-go-v2/aws/restrict_file_permissions.go+21 vendor/github.com/aws/aws-sdk-go-v2/aws/retry/adaptive.go+156 vendor/github.com/aws/aws-sdk-go-v2/aws/retry/adaptive_ratelimit.go+158 vendor/github.com/aws/aws-sdk-go-v2/aws/retry/adaptive_token_bucket.go+83 vendor/github.com/aws/aws-sdk-go-v2/aws/retry/attempt_metrics.go+51 vendor/github.com/aws/aws-sdk-go-v2/aws/retry/doc.go+80 vendor/github.com/aws/aws-sdk-go-v2/aws/retry/errors.go+20 vendor/github.com/aws/aws-sdk-go-v2/aws/retry/jitter_backoff.go+124 vendor/github.com/aws/aws-sdk-go-v2/aws/retry/metadata.go+52 vendor/github.com/aws/aws-sdk-go-v2/aws/retry/middleware.go+487 vendor/github.com/aws/aws-sdk-go-v2/aws/retry/retry.go+103 vendor/github.com/aws/aws-sdk-go-v2/aws/retry/retryable_error.go+228 vendor/github.com/aws/aws-sdk-go-v2/aws/retry/standard.go+343 vendor/github.com/aws/aws-sdk-go-v2/aws/retry/throttle_error.go+60 vendor/github.com/aws/aws-sdk-go-v2/aws/retry/timeout_error.go+52 vendor/github.com/aws/aws-sdk-go-v2/aws/retryer.go+127 vendor/github.com/aws/aws-sdk-go-v2/aws/runtime.go+14 vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/cache.go+115 vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/const.go+40 vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/header_rules.go+82 vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/headers.go+70 vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/hmac.go+13 vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/host.go+75 vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/scope.go+13 vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/time.go+36 vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/util.go+80 vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/middleware.go+420 vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/presign_middleware.go+127 vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/stream.go+86 vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/v4.go+564 vendor/github.com/aws/aws-sdk-go-v2/aws/to_ptr.go+297 vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/client.go+355 vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/content_type.go+42 vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/response_error.go+33 vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/response_error_middleware.go+56 vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/timeout_read_closer.go+109 vendor/github.com/aws/aws-sdk-go-v2/aws/types.go+42 vendor/github.com/aws/aws-sdk-go-v2/aws/version.go+8 vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md+1097 vendor/github.com/aws/aws-sdk-go-v2/config/LICENSE.txt+202 vendor/github.com/aws/aws-sdk-go-v2/config/auth_scheme_preference.go+19 vendor/github.com/aws/aws-sdk-go-v2/config/config.go+237 vendor/github.com/aws/aws-sdk-go-v2/config/defaultsmode.go+47 vendor/github.com/aws/aws-sdk-go-v2/config/doc.go+20 vendor/github.com/aws/aws-sdk-go-v2/config/env_config.go+966 vendor/github.com/aws/aws-sdk-go-v2/config/generate.go+4 vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go+6 vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/errors.go+22 vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/ini.go+56 vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/parse.go+109 vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/sections.go+157 vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/strings.go+89 vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/token.go+32 vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/tokenize.go+92 vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/value.go+93 vendor/github.com/aws/aws-sdk-go-v2/config/load_options.go+1371 vendor/github.com/aws/aws-sdk-go-v2/config/local.go+51 vendor/github.com/aws/aws-sdk-go-v2/config/provider.go+802 vendor/github.com/aws/aws-sdk-go-v2/config/resolve.go+458 vendor/github.com/aws/aws-sdk-go-v2/config/resolve_bearer_token.go+122 vendor/github.com/aws/aws-sdk-go-v2/config/resolve_credentials.go+650 vendor/github.com/aws/aws-sdk-go-v2/config/shared_config.go+1704 vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md+990 vendor/github.com/aws/aws-sdk-go-v2/credentials/LICENSE.txt+202 vendor/github.com/aws/aws-sdk-go-v2/credentials/doc.go+4 vendor/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds/doc.go+58 vendor/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds/provider.go+241 vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client/auth.go+48 vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client/client.go+165 vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client/endpoints.go+20 vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client/middleware.go+164 vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/provider.go+207 vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go+6 vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/dpop.go+150 vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/file.go+14 vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/provider.go+184 vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/token.go+110 vendor/github.com/aws/aws-sdk-go-v2/credentials/processcreds/doc.go+92 vendor/github.com/aws/aws-sdk-go-v2/credentials/processcreds/provider.go+296 vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/doc.go+81 vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/sso_cached_token.go+232 vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/sso_credentials_provider.go+165 vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/sso_token_provider.go+147 vendor/github.com/aws/aws-sdk-go-v2/credentials/static_provider.go+63 vendor/github.com/aws/aws-sdk-go-v2/credentials/stscreds/assume_role_provider.go+338 vendor/github.com/aws/aws-sdk-go-v2/credentials/stscreds/web_identity_provider.go+181 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md+584 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/LICENSE.txt+202 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_client.go+358 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetDynamicData.go+77 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetIAMInfo.go+103 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetInstanceIdentityDocument.go+110 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetMetadata.go+77 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetRegion.go+73 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetToken.go+119 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetUserData.go+61 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/auth.go+48 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/doc.go+12 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/endpoints.go+20 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go+6 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/internal/config/resolvers.go+114 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/request_middleware.go+313 vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/token_provider.go+261 vendor/github.com/aws/aws-sdk-go-v2/internal/auth/auth.go+45 vendor/github.com/aws/aws-sdk-go-v2/internal/auth/scheme.go+191 vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/bearer_token_adapter.go+43 vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/bearer_token_signer_adapter.go+35 vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/credentials_adapter.go+46 vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/smithy.go+2 vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/v4signer_adapter.go+57 vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/v4signer_adapter_eventstream.go+51 vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md+544 vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/LICENSE.txt+202 vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/config.go+65 vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/endpoints.go+57 vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go+6 vendor/github.com/aws/aws-sdk-go-v2/internal/context/context.go+65 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/arn.go+94 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/doc.go+3 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/generate.go+7 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/host.go+51 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partition.go+76 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partitions.go+496 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partitions.json+267 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/endpoints.go+201 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md+519 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/LICENSE.txt+202 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/endpoints.go+302 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go+6 vendor/github.com/aws/aws-sdk-go-v2/internal/rand/rand.go+33 vendor/github.com/aws/aws-sdk-go-v2/internal/sdk/interfaces.go+9 vendor/github.com/aws/aws-sdk-go-v2/internal/sdk/time.go+74 vendor/github.com/aws/aws-sdk-go-v2/internal/sdkio/byte.go+12 vendor/github.com/aws/aws-sdk-go-v2/internal/shareddefaults/shared_config.go+47 vendor/github.com/aws/aws-sdk-go-v2/internal/strings/strings.go+11 vendor/github.com/aws/aws-sdk-go-v2/internal/sync/singleflight/LICENSE+28 vendor/github.com/aws/aws-sdk-go-v2/internal/sync/singleflight/docs.go+7 vendor/github.com/aws/aws-sdk-go-v2/internal/sync/singleflight/singleflight.go+210 vendor/github.com/aws/aws-sdk-go-v2/internal/timeconv/duration.go+13 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md+486 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/LICENSE.txt+202 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/credentials.go+141 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/error.go+17 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go+6 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto/compare.go+30 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto/ecc.go+113 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/const.go+36 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/header_rules.go+82 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/headers.go+68 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/hmac.go+13 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/host.go+75 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/time.go+36 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/util.go+64 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/middleware.go+118 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/presign_middleware.go+117 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/smithy.go+92 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/v4a.go+520 vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md+220 vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/LICENSE.txt+202 vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/accept_encoding_gzip.go+176 vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/doc.go+22 vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go+6 vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md+571 vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/LICENSE.txt+202 vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/context.go+56 vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/doc.go+3 vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go+6 vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/middleware.go+110 vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md+85 vendor/github.com/aws/aws-sdk-go-v2/service/signin/LICENSE.txt+202 vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_client.go+945 vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_CreateOAuth2Token.go+212 vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_DeleteConsoleAuthorizationConfiguration.go+168 vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_DeleteResourcePermissionStatement.go+196 vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_GetConsoleAuthorizationConfiguration.go+168 vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_GetResourcePolicy.go+155 vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_ListResourcePermissionStatements.go+261 vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_PutConsoleAuthorizationConfiguration.go+168 vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_PutResourcePermissionStatement.go+216 vendor/github.com/aws/aws-sdk-go-v2/service/signin/auth.go+361 vendor/github.com/aws/aws-sdk-go-v2/service/signin/deserializers.go+2474 vendor/github.com/aws/aws-sdk-go-v2/service/signin/doc.go+9 vendor/github.com/aws/aws-sdk-go-v2/service/signin/endpoints.go+854 vendor/github.com/aws/aws-sdk-go-v2/service/signin/generated.json+40 vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go+6 vendor/github.com/aws/aws-sdk-go-v2/service/signin/internal/endpoints/endpoints.go+333 vendor/github.com/aws/aws-sdk-go-v2/service/signin/options.go+242 vendor/github.com/aws/aws-sdk-go-v2/service/signin/serializers.go+724 vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/enums.go+46 vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/errors.go+247 vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/types.go+162 vendor/github.com/aws/aws-sdk-go-v2/service/signin/validators.go+111 vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md+792 vendor/github.com/aws/aws-sdk-go-v2/service/sso/LICENSE.txt+202 vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_client.go+929 vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_GetRoleCredentials.go+165 vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccountRoles.go+263 vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccounts.go+261 vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_Logout.go+164 vendor/github.com/aws/aws-sdk-go-v2/service/sso/auth.go+379 vendor/github.com/aws/aws-sdk-go-v2/service/sso/deserializers.go+1171 vendor/github.com/aws/aws-sdk-go-v2/service/sso/doc.go+27 vendor/github.com/aws/aws-sdk-go-v2/service/sso/endpoints.go+570 vendor/github.com/aws/aws-sdk-go-v2/service/sso/generated.json+35 vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go+6 vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go+628 vendor/github.com/aws/aws-sdk-go-v2/service/sso/options.go+238 vendor/github.com/aws/aws-sdk-go-v2/service/sso/serializers.go+309 vendor/github.com/aws/aws-sdk-go-v2/service/sso/types/errors.go+115 vendor/github.com/aws/aws-sdk-go-v2/service/sso/types/types.go+63 vendor/github.com/aws/aws-sdk-go-v2/service/sso/validators.go+175 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md+790 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/LICENSE.txt+202 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_client.go+929 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateToken.go+235 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateTokenWithIAM.go+282 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_RegisterClient.go+206 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_StartDeviceAuthorization.go+188 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/auth.go+373 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/deserializers.go+2244 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/doc.go+49 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/endpoints.go+570 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/generated.json+36 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go+6 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go+628 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/options.go+238 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/serializers.go+512 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/types/enums.go+44 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/types/errors.go+430 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/types/types.go+25 vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/validators.go+184 vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md+832 vendor/github.com/aws/aws-sdk-go-v2/service/sts/LICENSE.txt+202 vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go+1115 vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRole.go+544 vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithSAML.go+455 vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithWebIdentity.go+472 vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoot.go+229 vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_DecodeAuthorizationMessage.go+189 vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetAccessKeyInfo.go+180 vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetCallerIdentity.go+192 vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetDelegatedAccessToken.go+169 vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetFederationToken.go+393 vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetSessionToken.go+239 vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetWebIdentityToken.go+192 vendor/github.com/aws/aws-sdk-go-v2/service/sts/auth.go+377 vendor/github.com/aws/aws-sdk-go-v2/service/sts/deserializers.go+3456 vendor/github.com/aws/aws-sdk-go-v2/service/sts/doc.go+13 vendor/github.com/aws/aws-sdk-go-v2/service/sts/endpoints.go+683 vendor/github.com/aws/aws-sdk-go-v2/service/sts/generated.json+45 vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go+6 vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go+585 vendor/github.com/aws/aws-sdk-go-v2/service/sts/options.go+286 vendor/github.com/aws/aws-sdk-go-v2/service/sts/serializers.go+1198 vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/errors.go+363 vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/types.go+144 vendor/github.com/aws/aws-sdk-go-v2/service/sts/validators.go+433 vendor/github.com/aws/smithy-go/.gitignore+29 vendor/github.com/aws/smithy-go/.travis.yml+28 vendor/github.com/aws/smithy-go/AGENTS.md+172 vendor/github.com/aws/smithy-go/CHANGELOG.md+454 vendor/github.com/aws/smithy-go/CODE_OF_CONDUCT.md+4 vendor/github.com/aws/smithy-go/CONTRIBUTING.md+90 vendor/github.com/aws/smithy-go/LICENSE+175 vendor/github.com/aws/smithy-go/Makefile+130 vendor/github.com/aws/smithy-go/NOTICE+1 vendor/github.com/aws/smithy-go/README.md+107 vendor/github.com/aws/smithy-go/auth/auth.go+3 vendor/github.com/aws/smithy-go/auth/bearer/docs.go+3 vendor/github.com/aws/smithy-go/auth/bearer/middleware.go+104 vendor/github.com/aws/smithy-go/auth/bearer/token.go+50 vendor/github.com/aws/smithy-go/auth/bearer/token_cache.go+208 vendor/github.com/aws/smithy-go/auth/identity.go+47 vendor/github.com/aws/smithy-go/auth/option.go+25 vendor/github.com/aws/smithy-go/auth/scheme_id.go+20 vendor/github.com/aws/smithy-go/changelog-template.json+9 vendor/github.com/aws/smithy-go/context/suppress_expired.go+81 vendor/github.com/aws/smithy-go/doc.go+2 vendor/github.com/aws/smithy-go/document.go+10 vendor/github.com/aws/smithy-go/document/doc.go+12 vendor/github.com/aws/smithy-go/document/document.go+239 vendor/github.com/aws/smithy-go/document/errors.go+75 vendor/github.com/aws/smithy-go/encoding/doc.go+4 vendor/github.com/aws/smithy-go/encoding/encoding.go+40 vendor/github.com/aws/smithy-go/encoding/httpbinding/encode.go+123 vendor/github.com/aws/smithy-go/encoding/httpbinding/header.go+122 vendor/github.com/aws/smithy-go/encoding/httpbinding/path_replace.go+108 vendor/github.com/aws/smithy-go/encoding/httpbinding/query.go+107 vendor/github.com/aws/smithy-go/encoding/httpbinding/uri.go+111 vendor/github.com/aws/smithy-go/encoding/json/array.go+35 vendor/github.com/aws/smithy-go/encoding/json/constants.go+15 vendor/github.com/aws/smithy-go/encoding/json/decoder_util.go+139 vendor/github.com/aws/smithy-go/encoding/json/encoder.go+30 vendor/github.com/aws/smithy-go/encoding/json/escape.go+198 vendor/github.com/aws/smithy-go/encoding/json/object.go+40 vendor/github.com/aws/smithy-go/encoding/json/value.go+154 vendor/github.com/aws/smithy-go/encoding/xml/array.go+49 vendor/github.com/aws/smithy-go/encoding/xml/constants.go+10 vendor/github.com/aws/smithy-go/encoding/xml/doc.go+49 vendor/github.com/aws/smithy-go/encoding/xml/element.go+91 vendor/github.com/aws/smithy-go/encoding/xml/encoder.go+51 vendor/github.com/aws/smithy-go/encoding/xml/error_utils.go+51 vendor/github.com/aws/smithy-go/encoding/xml/escape.go+137 vendor/github.com/aws/smithy-go/encoding/xml/map.go+53 vendor/github.com/aws/smithy-go/encoding/xml/value.go+302 vendor/github.com/aws/smithy-go/encoding/xml/xml_decoder.go+154 vendor/github.com/aws/smithy-go/endpoints/endpoint.go+23 vendor/github.com/aws/smithy-go/endpoints/private/bdd/evaluate.go+35 vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/doc.go+4 vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/split.go+16 vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/string_slice.go+18 vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/strings.go+25 vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/uri.go+133 vendor/github.com/aws/smithy-go/errors.go+137 vendor/github.com/aws/smithy-go/eventstream/const.go+24 vendor/github.com/aws/smithy-go/eventstream/debug.go+144 vendor/github.com/aws/smithy-go/eventstream/decode.go+218 vendor/github.com/aws/smithy-go/eventstream/deserializer.go+294 vendor/github.com/aws/smithy-go/eventstream/encode.go+167 vendor/github.com/aws/smithy-go/eventstream/error.go+23 vendor/github.com/aws/smithy-go/eventstream/header.go+175 vendor/github.com/aws/smithy-go/eventstream/header_value.go+521 vendor/github.com/aws/smithy-go/eventstream/message.go+99 vendor/github.com/aws/smithy-go/eventstream/serializer.go+228 vendor/github.com/aws/smithy-go/eventstream/signer.go+82 vendor/github.com/aws/smithy-go/eventstream/types.go+26 vendor/github.com/aws/smithy-go/go_module_metadata.go+6 vendor/github.com/aws/smithy-go/internal/sync/singleflight/LICENSE+28 vendor/github.com/aws/smithy-go/internal/sync/singleflight/docs.go+8 vendor/github.com/aws/smithy-go/internal/sync/singleflight/singleflight.go+210 vendor/github.com/aws/smithy-go/io/byte.go+12 vendor/github.com/aws/smithy-go/io/doc.go+2 vendor/github.com/aws/smithy-go/io/reader.go+16 vendor/github.com/aws/smithy-go/io/ringbuffer.go+94 vendor/github.com/aws/smithy-go/local-mod-replace.sh+39 vendor/github.com/aws/smithy-go/logging/logger.go+82 vendor/github.com/aws/smithy-go/metrics/metrics.go+136 vendor/github.com/aws/smithy-go/metrics/nop.go+98 vendor/github.com/aws/smithy-go/middleware/context.go+41 vendor/github.com/aws/smithy-go/middleware/doc.go+67 vendor/github.com/aws/smithy-go/middleware/eventstream_middleware.go+21 vendor/github.com/aws/smithy-go/middleware/logging.go+46 vendor/github.com/aws/smithy-go/middleware/metadata.go+65 vendor/github.com/aws/smithy-go/middleware/middleware.go+71 vendor/github.com/aws/smithy-go/middleware/ordered_group.go+270 vendor/github.com/aws/smithy-go/middleware/stack.go+209 vendor/github.com/aws/smithy-go/middleware/stack_values.go+100 vendor/github.com/aws/smithy-go/middleware/step_build.go+298 vendor/github.com/aws/smithy-go/middleware/step_deserialize.go+300 vendor/github.com/aws/smithy-go/middleware/step_finalize.go+298 vendor/github.com/aws/smithy-go/middleware/step_initialize.go+299 vendor/github.com/aws/smithy-go/middleware/step_serialize.go+305 vendor/github.com/aws/smithy-go/modman.toml+9 vendor/github.com/aws/smithy-go/private/requestcompression/gzip.go+30 vendor/github.com/aws/smithy-go/private/requestcompression/middleware_capture_request_compression.go+52 vendor/github.com/aws/smithy-go/private/requestcompression/request_compression.go+103 vendor/github.com/aws/smithy-go/properties.go+69 vendor/github.com/aws/smithy-go/ptr/doc.go+5 vendor/github.com/aws/smithy-go/ptr/from_ptr.go+601 vendor/github.com/aws/smithy-go/ptr/gen_scalars.go+83 vendor/github.com/aws/smithy-go/ptr/to_ptr.go+499 vendor/github.com/aws/smithy-go/rand/doc.go+3 vendor/github.com/aws/smithy-go/rand/rand.go+31 vendor/github.com/aws/smithy-go/rand/uuid.go+87 vendor/github.com/aws/smithy-go/schema.go+328 vendor/github.com/aws/smithy-go/schema_ext.go+37 vendor/github.com/aws/smithy-go/serde.go+229 vendor/github.com/aws/smithy-go/sync/error.go+53 vendor/github.com/aws/smithy-go/time/time.go+134 vendor/github.com/aws/smithy-go/tracing/context.go+96 vendor/github.com/aws/smithy-go/tracing/nop.go+32 vendor/github.com/aws/smithy-go/tracing/tracing.go+95 vendor/github.com/aws/smithy-go/trait.go+21 vendor/github.com/aws/smithy-go/traits/http.go+69 vendor/github.com/aws/smithy-go/traits/index.go+107 vendor/github.com/aws/smithy-go/traits/serde.go+56 vendor/github.com/aws/smithy-go/traits/traits.go+72 vendor/github.com/aws/smithy-go/transport/http/auth.go+30 vendor/github.com/aws/smithy-go/transport/http/auth_schemes.go+45 vendor/github.com/aws/smithy-go/transport/http/checksum_middleware.go+70 vendor/github.com/aws/smithy-go/transport/http/client.go+161 vendor/github.com/aws/smithy-go/transport/http/doc.go+5 vendor/github.com/aws/smithy-go/transport/http/eventstream.go+209 vendor/github.com/aws/smithy-go/transport/http/eventstream_middleware.go+69 vendor/github.com/aws/smithy-go/transport/http/headerlist.go+163 vendor/github.com/aws/smithy-go/transport/http/host.go+89 vendor/github.com/aws/smithy-go/transport/http/interceptor.go+321 vendor/github.com/aws/smithy-go/transport/http/interceptor_middleware.go+325 vendor/github.com/aws/smithy-go/transport/http/internal/io/safe.go+75 vendor/github.com/aws/smithy-go/transport/http/md5_checksum.go+25 vendor/github.com/aws/smithy-go/transport/http/metrics.go+204 vendor/github.com/aws/smithy-go/transport/http/middleware_close_response_body.go+79 vendor/github.com/aws/smithy-go/transport/http/middleware_content_length.go+84 vendor/github.com/aws/smithy-go/transport/http/middleware_header_comment.go+81 vendor/github.com/aws/smithy-go/transport/http/middleware_headers.go+167 vendor/github.com/aws/smithy-go/transport/http/middleware_http_logging.go+75 vendor/github.com/aws/smithy-go/transport/http/middleware_metadata.go+51 vendor/github.com/aws/smithy-go/transport/http/middleware_min_proto.go+79 vendor/github.com/aws/smithy-go/transport/http/properties.go+80 vendor/github.com/aws/smithy-go/transport/http/protocol.go+27 vendor/github.com/aws/smithy-go/transport/http/request.go+188 vendor/github.com/aws/smithy-go/transport/http/response.go+34 vendor/github.com/aws/smithy-go/transport/http/time.go+13 vendor/github.com/aws/smithy-go/transport/http/url.go+44 vendor/github.com/aws/smithy-go/transport/http/user_agent.go+37 vendor/github.com/aws/smithy-go/type_registry.go+70 vendor/github.com/aws/smithy-go/validation.go+140 vendor/github.com/aymanbagabas/go-udiff/LICENSE-BSD+27 vendor/github.com/aymanbagabas/go-udiff/LICENSE-MIT+21 vendor/github.com/aymanbagabas/go-udiff/Makefile+4 vendor/github.com/aymanbagabas/go-udiff/README.md+142 vendor/github.com/aymanbagabas/go-udiff/diff.go+177 vendor/github.com/aymanbagabas/go-udiff/export.go+16 vendor/github.com/aymanbagabas/go-udiff/lcs/common.go+179 vendor/github.com/aymanbagabas/go-udiff/lcs/doc.go+156 vendor/github.com/aymanbagabas/go-udiff/lcs/export.go+11 vendor/github.com/aymanbagabas/go-udiff/lcs/git.sh+33 vendor/github.com/aymanbagabas/go-udiff/lcs/labels.go+55 vendor/github.com/aymanbagabas/go-udiff/lcs/old.go+475 vendor/github.com/aymanbagabas/go-udiff/lcs/sequence.go+70 vendor/github.com/aymanbagabas/go-udiff/merge.go+81 vendor/github.com/aymanbagabas/go-udiff/ndiff.go+118 vendor/github.com/aymanbagabas/go-udiff/unified.go+314 vendor/github.com/aymerick/douceur/LICENSE+22 vendor/github.com/aymerick/douceur/css/declaration.go+60 vendor/github.com/aymerick/douceur/css/rule.go+230 vendor/github.com/aymerick/douceur/css/stylesheet.go+25 vendor/github.com/aymerick/douceur/parser/parser.go+409 vendor/github.com/bahlo/generic-list-go/LICENSE+27 vendor/github.com/bahlo/generic-list-go/README.md+5 vendor/github.com/bahlo/generic-list-go/list.go+235 vendor/github.com/bmatcuk/doublestar/v4/.codecov.yml+10 vendor/github.com/bmatcuk/doublestar/v4/.gitignore+32 vendor/github.com/bmatcuk/doublestar/v4/LICENSE+22 vendor/github.com/bmatcuk/doublestar/v4/README.md+495 vendor/github.com/bmatcuk/doublestar/v4/UPGRADING.md+63 vendor/github.com/bmatcuk/doublestar/v4/doublestar.go+13 vendor/github.com/bmatcuk/doublestar/v4/glob.go+497 vendor/github.com/bmatcuk/doublestar/v4/globoptions.go+188 vendor/github.com/bmatcuk/doublestar/v4/globwalk.go+438 vendor/github.com/bmatcuk/doublestar/v4/match.go+419 vendor/github.com/bmatcuk/doublestar/v4/utils.go+165 vendor/github.com/bmatcuk/doublestar/v4/utils_unix.go+19 vendor/github.com/bmatcuk/doublestar/v4/utils_windows.go+43 vendor/github.com/bmatcuk/doublestar/v4/validate.go+80 vendor/github.com/buger/jsonparser/.gitignore+12 vendor/github.com/buger/jsonparser/.travis.yml+12 vendor/github.com/buger/jsonparser/Dockerfile+12 vendor/github.com/buger/jsonparser/LICENSE+21 vendor/github.com/buger/jsonparser/Makefile+36 vendor/github.com/buger/jsonparser/README.md+361 vendor/github.com/buger/jsonparser/bytes.go+47 vendor/github.com/buger/jsonparser/bytes_safe.go+25 vendor/github.com/buger/jsonparser/bytes_unsafe.go+44 vendor/github.com/buger/jsonparser/escape.go+173 vendor/github.com/buger/jsonparser/fuzz.go+117 vendor/github.com/buger/jsonparser/oss-fuzz-build.sh+47 vendor/github.com/buger/jsonparser/parser.go+1318 vendor/github.com/cespare/xxhash/v2/LICENSE.txt+22 vendor/github.com/cespare/xxhash/v2/README.md+74 vendor/github.com/cespare/xxhash/v2/testall.sh+10 vendor/github.com/cespare/xxhash/v2/xxhash.go+243 vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s+209 vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s+183 vendor/github.com/cespare/xxhash/v2/xxhash_asm.go+15 vendor/github.com/cespare/xxhash/v2/xxhash_other.go+76 vendor/github.com/cespare/xxhash/v2/xxhash_safe.go+16 vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go+58 vendor/github.com/charlievieth/fastwalk/.gitignore+2 vendor/github.com/charlievieth/fastwalk/LICENSE+21 vendor/github.com/charlievieth/fastwalk/Makefile+101 vendor/github.com/charlievieth/fastwalk/README.md+193 vendor/github.com/charlievieth/fastwalk/adapters.go+102 vendor/github.com/charlievieth/fastwalk/dirent.go+73 vendor/github.com/charlievieth/fastwalk/dirent_portable.go+134 vendor/github.com/charlievieth/fastwalk/dirent_unix.go+146 vendor/github.com/charlievieth/fastwalk/entry_filter_portable.go+37 vendor/github.com/charlievieth/fastwalk/entry_filter_unix.go+59 vendor/github.com/charlievieth/fastwalk/entry_filter_windows.go+156 vendor/github.com/charlievieth/fastwalk/fastwalk.go+697 vendor/github.com/charlievieth/fastwalk/fastwalk_darwin.go+122 vendor/github.com/charlievieth/fastwalk/fastwalk_portable.go+65 vendor/github.com/charlievieth/fastwalk/fastwalk_unix.go+131 vendor/github.com/charlievieth/fastwalk/go.LICENSE+27 vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent.go+85 vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent_aix.go+29 vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent_dragonfly.go+54 vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent_freebsd.go+46 vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent_js.go+27 vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent_linux.go+50 vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent_netbsd.go+46 vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent_openbsd.go+46 vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent_solaris.go+29 vendor/github.com/charlievieth/fastwalk/internal/dirent/doc.go+2 vendor/github.com/charlievieth/fastwalk/internal/fmtdirent/fmtdirent_go120.go+31 vendor/github.com/charlievieth/fastwalk/internal/fmtdirent/fmtdirent_go121.go+15 vendor/github.com/charlievieth/fastwalk/zsyscall_darwin.go+93 vendor/github.com/charlievieth/fastwalk/zsyscall_darwin_amd64.1_13.s+22 vendor/github.com/charlievieth/fastwalk/zsyscall_darwin_arm64.1_13.s+22 vendor/github.com/charmbracelet/anthropic-sdk-go/.gitignore+4 vendor/github.com/charmbracelet/anthropic-sdk-go/.release-please-manifest.json+3 vendor/github.com/charmbracelet/anthropic-sdk-go/.stats.yml+4 vendor/github.com/charmbracelet/anthropic-sdk-go/Brewfile+1 vendor/github.com/charmbracelet/anthropic-sdk-go/CHANGELOG.md+641 vendor/github.com/charmbracelet/anthropic-sdk-go/CONTRIBUTING.md+65 vendor/github.com/charmbracelet/anthropic-sdk-go/LICENSE+8 vendor/github.com/charmbracelet/anthropic-sdk-go/README.md+999 vendor/github.com/charmbracelet/anthropic-sdk-go/SECURITY.md+27 vendor/github.com/charmbracelet/anthropic-sdk-go/aliases.go+72 vendor/github.com/charmbracelet/anthropic-sdk-go/api.md+545 vendor/github.com/charmbracelet/anthropic-sdk-go/bedrock/bedrock.go+295 vendor/github.com/charmbracelet/anthropic-sdk-go/beta.go+374 vendor/github.com/charmbracelet/anthropic-sdk-go/betafile.go+273 vendor/github.com/charmbracelet/anthropic-sdk-go/betamessage.go+11734 vendor/github.com/charmbracelet/anthropic-sdk-go/betamessagebatch.go+925 vendor/github.com/charmbracelet/anthropic-sdk-go/betamessageutil.go+459 vendor/github.com/charmbracelet/anthropic-sdk-go/betamodel.go+151 vendor/github.com/charmbracelet/anthropic-sdk-go/betaskill.go+362 vendor/github.com/charmbracelet/anthropic-sdk-go/betaskillversion.go+373 vendor/github.com/charmbracelet/anthropic-sdk-go/betatoolrunner.go+435 vendor/github.com/charmbracelet/anthropic-sdk-go/client.go+157 vendor/github.com/charmbracelet/anthropic-sdk-go/completion.go+196 vendor/github.com/charmbracelet/anthropic-sdk-go/field.go+46 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apierror/apierror.go+58 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apiform/encoder.go+473 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apiform/form.go+5 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apiform/richparam.go+21 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apiform/tag.go+51 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/decoder.go+709 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/encoder.go+392 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/enum.go+145 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/field.go+23 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/port.go+120 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/registry.go+59 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/subfield.go+68 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/tag.go+47 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/union.go+209 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apiquery/encoder.go+414 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apiquery/query.go+55 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apiquery/richparam.go+20 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apiquery/tag.go+44 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/decode.go+1325 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/encode.go+1396 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/fold.go+48 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/indent.go+182 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/scanner.go+610 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/sentinel/null.go+47 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/shims/shims.go+113 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/stream.go+512 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/tables.go+218 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/tags.go+38 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/time.go+62 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/paramutil/field.go+30 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/paramutil/union.go+49 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/requestconfig/requestconfig.go+638 vendor/github.com/charmbracelet/anthropic-sdk-go/internal/version.go+5 vendor/github.com/charmbracelet/anthropic-sdk-go/message.go+9436 vendor/github.com/charmbracelet/anthropic-sdk-go/messagebatch.go+827 vendor/github.com/charmbracelet/anthropic-sdk-go/messageutil.go+413 vendor/github.com/charmbracelet/anthropic-sdk-go/model.go+151 vendor/github.com/charmbracelet/anthropic-sdk-go/option/middleware.go+38 vendor/github.com/charmbracelet/anthropic-sdk-go/option/requestoption.go+285 vendor/github.com/charmbracelet/anthropic-sdk-go/packages/jsonl/jsonl.go+62 vendor/github.com/charmbracelet/anthropic-sdk-go/packages/pagination/pagination.go+351 vendor/github.com/charmbracelet/anthropic-sdk-go/packages/param/encoder.go+109 vendor/github.com/charmbracelet/anthropic-sdk-go/packages/param/null.go+19 vendor/github.com/charmbracelet/anthropic-sdk-go/packages/param/option.go+122 vendor/github.com/charmbracelet/anthropic-sdk-go/packages/param/param.go+189 vendor/github.com/charmbracelet/anthropic-sdk-go/packages/respjson/respjson.go+88 vendor/github.com/charmbracelet/anthropic-sdk-go/packages/ssestream/ssestream.go+198 vendor/github.com/charmbracelet/anthropic-sdk-go/release-please-config.json+68 vendor/github.com/charmbracelet/anthropic-sdk-go/schemautil.go+244 vendor/github.com/charmbracelet/anthropic-sdk-go/shared/constant/constants.go+487 vendor/github.com/charmbracelet/anthropic-sdk-go/shared/shared.go+346 vendor/github.com/charmbracelet/anthropic-sdk-go/tools.md+292 vendor/github.com/charmbracelet/anthropic-sdk-go/vertex/vertex.go+134 vendor/github.com/charmbracelet/colorprofile/.golangci.yml+47 vendor/github.com/charmbracelet/colorprofile/.goreleaser.yml+6 vendor/github.com/charmbracelet/colorprofile/LICENSE+21 vendor/github.com/charmbracelet/colorprofile/README.md+109 vendor/github.com/charmbracelet/colorprofile/doc.go+4 vendor/github.com/charmbracelet/colorprofile/env.go+294 vendor/github.com/charmbracelet/colorprofile/env_other.go+8 vendor/github.com/charmbracelet/colorprofile/env_windows.go+40 vendor/github.com/charmbracelet/colorprofile/profile.go+108 vendor/github.com/charmbracelet/colorprofile/writer.go+171 vendor/github.com/charmbracelet/openai-go/.gitignore+4 vendor/github.com/charmbracelet/openai-go/.release-please-manifest.json+3 vendor/github.com/charmbracelet/openai-go/.stats.yml+4 vendor/github.com/charmbracelet/openai-go/Brewfile+1 vendor/github.com/charmbracelet/openai-go/CHANGELOG.md+1171 vendor/github.com/charmbracelet/openai-go/CONTRIBUTING.md+65 vendor/github.com/charmbracelet/openai-go/LICENSE+201 vendor/github.com/charmbracelet/openai-go/MIGRATION.md+284 vendor/github.com/charmbracelet/openai-go/README.md+1007 vendor/github.com/charmbracelet/openai-go/SECURITY.md+29 vendor/github.com/charmbracelet/openai-go/aliases.go+585 vendor/github.com/charmbracelet/openai-go/api.md+774 vendor/github.com/charmbracelet/openai-go/audio.go+61 vendor/github.com/charmbracelet/openai-go/audiospeech.go+179 vendor/github.com/charmbracelet/openai-go/audiotranscription.go+950 vendor/github.com/charmbracelet/openai-go/audiotranslation.go+120 vendor/github.com/charmbracelet/openai-go/azure/azure.go+269 vendor/github.com/charmbracelet/openai-go/batch.go+464 vendor/github.com/charmbracelet/openai-go/beta.go+36 vendor/github.com/charmbracelet/openai-go/betaassistant.go+2284 vendor/github.com/charmbracelet/openai-go/betachatkit.go+125 vendor/github.com/charmbracelet/openai-go/betachatkitsession.go+83 vendor/github.com/charmbracelet/openai-go/betachatkitthread.go+1564 vendor/github.com/charmbracelet/openai-go/betathread.go+1574 vendor/github.com/charmbracelet/openai-go/betathreadmessage.go+1717 vendor/github.com/charmbracelet/openai-go/betathreadrun.go+974 vendor/github.com/charmbracelet/openai-go/betathreadrunstep.go+1396 vendor/github.com/charmbracelet/openai-go/chat.go+30 vendor/github.com/charmbracelet/openai-go/chatcompletion.go+3521 vendor/github.com/charmbracelet/openai-go/chatcompletionmessage.go+100 vendor/github.com/charmbracelet/openai-go/client.go+185 vendor/github.com/charmbracelet/openai-go/completion.go+436 vendor/github.com/charmbracelet/openai-go/container.go+648 vendor/github.com/charmbracelet/openai-go/containerfile.go+287 vendor/github.com/charmbracelet/openai-go/containerfilecontent.go+50 vendor/github.com/charmbracelet/openai-go/conversations/aliases.go+585 vendor/github.com/charmbracelet/openai-go/conversations/api.md+31 vendor/github.com/charmbracelet/openai-go/conversations/conversation.go+493 vendor/github.com/charmbracelet/openai-go/conversations/item.go+1082 vendor/github.com/charmbracelet/openai-go/embedding.go+207 vendor/github.com/charmbracelet/openai-go/field.go+45 vendor/github.com/charmbracelet/openai-go/file.go+352 vendor/github.com/charmbracelet/openai-go/finetuning.go+35 vendor/github.com/charmbracelet/openai-go/finetuningalpha.go+29 vendor/github.com/charmbracelet/openai-go/finetuningalphagrader.go+675 vendor/github.com/charmbracelet/openai-go/finetuningcheckpoint.go+29 vendor/github.com/charmbracelet/openai-go/finetuningcheckpointpermission.go+352 vendor/github.com/charmbracelet/openai-go/finetuningjob.go+884 vendor/github.com/charmbracelet/openai-go/finetuningjobcheckpoint.go+152 vendor/github.com/charmbracelet/openai-go/finetuningmethod.go+1487 vendor/github.com/charmbracelet/openai-go/grader.go+28 vendor/github.com/charmbracelet/openai-go/gradergradermodel.go+1753 vendor/github.com/charmbracelet/openai-go/image.go+1337 vendor/github.com/charmbracelet/openai-go/internal/apierror/apierror.go+58 vendor/github.com/charmbracelet/openai-go/internal/apiform/encoder.go+473 vendor/github.com/charmbracelet/openai-go/internal/apiform/form.go+5 vendor/github.com/charmbracelet/openai-go/internal/apiform/richparam.go+20 vendor/github.com/charmbracelet/openai-go/internal/apiform/tag.go+72 vendor/github.com/charmbracelet/openai-go/internal/apijson/decoder.go+688 vendor/github.com/charmbracelet/openai-go/internal/apijson/encoder.go+371 vendor/github.com/charmbracelet/openai-go/internal/apijson/enum.go+140 vendor/github.com/charmbracelet/openai-go/internal/apijson/field.go+23 vendor/github.com/charmbracelet/openai-go/internal/apijson/port.go+120 vendor/github.com/charmbracelet/openai-go/internal/apijson/registry.go+51 vendor/github.com/charmbracelet/openai-go/internal/apijson/subfield.go+67 vendor/github.com/charmbracelet/openai-go/internal/apijson/tag.go+69 vendor/github.com/charmbracelet/openai-go/internal/apijson/union.go+208 vendor/github.com/charmbracelet/openai-go/internal/apiquery/encoder.go+394 vendor/github.com/charmbracelet/openai-go/internal/apiquery/query.go+55 vendor/github.com/charmbracelet/openai-go/internal/apiquery/richparam.go+20 vendor/github.com/charmbracelet/openai-go/internal/apiquery/tag.go+44 vendor/github.com/charmbracelet/openai-go/internal/encoding/json/decode.go+1324 vendor/github.com/charmbracelet/openai-go/internal/encoding/json/encode.go+1396 vendor/github.com/charmbracelet/openai-go/internal/encoding/json/fold.go+48 vendor/github.com/charmbracelet/openai-go/internal/encoding/json/indent.go+182 vendor/github.com/charmbracelet/openai-go/internal/encoding/json/scanner.go+610 vendor/github.com/charmbracelet/openai-go/internal/encoding/json/sentinel/null.go+46 vendor/github.com/charmbracelet/openai-go/internal/encoding/json/shims/shims.go+113 vendor/github.com/charmbracelet/openai-go/internal/encoding/json/stream.go+512 vendor/github.com/charmbracelet/openai-go/internal/encoding/json/tables.go+218 vendor/github.com/charmbracelet/openai-go/internal/encoding/json/tags.go+38 vendor/github.com/charmbracelet/openai-go/internal/encoding/json/time.go+61 vendor/github.com/charmbracelet/openai-go/internal/paramutil/field.go+30 vendor/github.com/charmbracelet/openai-go/internal/paramutil/union.go+48 vendor/github.com/charmbracelet/openai-go/internal/requestconfig/requestconfig.go+644 vendor/github.com/charmbracelet/openai-go/internal/version.go+5 vendor/github.com/charmbracelet/openai-go/model.go+137 vendor/github.com/charmbracelet/openai-go/moderation.go+489 vendor/github.com/charmbracelet/openai-go/option/middleware.go+38 vendor/github.com/charmbracelet/openai-go/option/requestoption.go+299 vendor/github.com/charmbracelet/openai-go/packages/pagination/pagination.go+329 vendor/github.com/charmbracelet/openai-go/packages/param/encoder.go+109 vendor/github.com/charmbracelet/openai-go/packages/param/null.go+19 vendor/github.com/charmbracelet/openai-go/packages/param/option.go+122 vendor/github.com/charmbracelet/openai-go/packages/param/param.go+186 vendor/github.com/charmbracelet/openai-go/packages/respjson/respjson.go+88 vendor/github.com/charmbracelet/openai-go/packages/ssestream/ssestream.go+247 vendor/github.com/charmbracelet/openai-go/polling.go+129 vendor/github.com/charmbracelet/openai-go/realtime/aliases.go+585 vendor/github.com/charmbracelet/openai-go/realtime/api.md+55 vendor/github.com/charmbracelet/openai-go/realtime/call.go+133 vendor/github.com/charmbracelet/openai-go/realtime/clientsecret.go+1826 vendor/github.com/charmbracelet/openai-go/realtime/realtime.go+1979 vendor/github.com/charmbracelet/openai-go/release-please-config.json+68 vendor/github.com/charmbracelet/openai-go/responses/aliases.go+585 vendor/github.com/charmbracelet/openai-go/responses/api.md+240 vendor/github.com/charmbracelet/openai-go/responses/inputitem.go+135 vendor/github.com/charmbracelet/openai-go/responses/inputtoken.go+336 vendor/github.com/charmbracelet/openai-go/responses/response.go+21786 vendor/github.com/charmbracelet/openai-go/shared/constant/constants.go+1143 vendor/github.com/charmbracelet/openai-go/shared/shared.go+1183 vendor/github.com/charmbracelet/openai-go/skill.go+292 vendor/github.com/charmbracelet/openai-go/skillcontent.go+46 vendor/github.com/charmbracelet/openai-go/skillversion.go+283 vendor/github.com/charmbracelet/openai-go/skillversioncontent.go+50 vendor/github.com/charmbracelet/openai-go/streamaccumulator.go+215 vendor/github.com/charmbracelet/openai-go/upload.go+238 vendor/github.com/charmbracelet/openai-go/uploadpart.go+115 vendor/github.com/charmbracelet/openai-go/vectorstore.go+911 vendor/github.com/charmbracelet/openai-go/vectorstorefile.go+535 vendor/github.com/charmbracelet/openai-go/vectorstorefilebatch.go+427 vendor/github.com/charmbracelet/openai-go/video.go+677 vendor/github.com/charmbracelet/openai-go/webhooks/aliases.go+585 vendor/github.com/charmbracelet/openai-go/webhooks/api.md+20 vendor/github.com/charmbracelet/openai-go/webhooks/webhook.go+1306 vendor/github.com/charmbracelet/ultraviolet/.gitattributes+1 vendor/github.com/charmbracelet/ultraviolet/.golangci.yml+48 vendor/github.com/charmbracelet/ultraviolet/.goreleaser.yml+5 vendor/github.com/charmbracelet/ultraviolet/LICENSE+21 vendor/github.com/charmbracelet/ultraviolet/README.md+161 vendor/github.com/charmbracelet/ultraviolet/TUTORIAL.md+175 vendor/github.com/charmbracelet/ultraviolet/border.go+231 vendor/github.com/charmbracelet/ultraviolet/buffer.go+831 vendor/github.com/charmbracelet/ultraviolet/cancelreader_other.go+16 vendor/github.com/charmbracelet/ultraviolet/cancelreader_windows.go+139 vendor/github.com/charmbracelet/ultraviolet/cell.go+465 vendor/github.com/charmbracelet/ultraviolet/console.go+219 vendor/github.com/charmbracelet/ultraviolet/console_unix.go+13 vendor/github.com/charmbracelet/ultraviolet/console_windows.go+13 vendor/github.com/charmbracelet/ultraviolet/cursor.go+22 vendor/github.com/charmbracelet/ultraviolet/decoder.go+2102 vendor/github.com/charmbracelet/ultraviolet/doc.go+46 vendor/github.com/charmbracelet/ultraviolet/environ.go+32 vendor/github.com/charmbracelet/ultraviolet/event.go+567 vendor/github.com/charmbracelet/ultraviolet/internal/casso/math.go+172 vendor/github.com/charmbracelet/ultraviolet/internal/casso/solver.go+275 vendor/github.com/charmbracelet/ultraviolet/internal/lru/lru.go+69 vendor/github.com/charmbracelet/ultraviolet/key.go+762 vendor/github.com/charmbracelet/ultraviolet/key_table.go+664 vendor/github.com/charmbracelet/ultraviolet/layout/cache.go+29 vendor/github.com/charmbracelet/ultraviolet/layout/constraint.go+174 vendor/github.com/charmbracelet/ultraviolet/layout/flex.go+210 vendor/github.com/charmbracelet/ultraviolet/layout/layout.go+973 vendor/github.com/charmbracelet/ultraviolet/layout/padding.go+66 vendor/github.com/charmbracelet/ultraviolet/logger.go+6 vendor/github.com/charmbracelet/ultraviolet/mouse.go+150 vendor/github.com/charmbracelet/ultraviolet/poll.go+38 vendor/github.com/charmbracelet/ultraviolet/poll_bsd.go+165 vendor/github.com/charmbracelet/ultraviolet/poll_default.go+12 vendor/github.com/charmbracelet/ultraviolet/poll_fallback.go+158 vendor/github.com/charmbracelet/ultraviolet/poll_linux.go+175 vendor/github.com/charmbracelet/ultraviolet/poll_select.go+156 vendor/github.com/charmbracelet/ultraviolet/poll_solaris.go+12 vendor/github.com/charmbracelet/ultraviolet/poll_windows.go+217 vendor/github.com/charmbracelet/ultraviolet/screen/context.go+379 vendor/github.com/charmbracelet/ultraviolet/screen/screen.go+117 vendor/github.com/charmbracelet/ultraviolet/styled.go+337 vendor/github.com/charmbracelet/ultraviolet/tabstop.go+142 vendor/github.com/charmbracelet/ultraviolet/terminal.go+394 vendor/github.com/charmbracelet/ultraviolet/terminal_bsdly.go+10 vendor/github.com/charmbracelet/ultraviolet/terminal_bsdly_other.go+8 vendor/github.com/charmbracelet/ultraviolet/terminal_other.go+22 vendor/github.com/charmbracelet/ultraviolet/terminal_reader.go+503 vendor/github.com/charmbracelet/ultraviolet/terminal_reader_other.go+13 vendor/github.com/charmbracelet/ultraviolet/terminal_reader_windows.go+336 vendor/github.com/charmbracelet/ultraviolet/terminal_renderer.go+1639 vendor/github.com/charmbracelet/ultraviolet/terminal_renderer_hardscroll.go+243 vendor/github.com/charmbracelet/ultraviolet/terminal_renderer_hashmap.go+298 vendor/github.com/charmbracelet/ultraviolet/terminal_screen.go+837 vendor/github.com/charmbracelet/ultraviolet/terminal_tabdly.go+10 vendor/github.com/charmbracelet/ultraviolet/terminal_tabdly_other.go+8 vendor/github.com/charmbracelet/ultraviolet/terminal_unix.go+56 vendor/github.com/charmbracelet/ultraviolet/terminal_windows.go+77 vendor/github.com/charmbracelet/ultraviolet/tty.go+42 vendor/github.com/charmbracelet/ultraviolet/tty_other.go+26 vendor/github.com/charmbracelet/ultraviolet/tty_unix.go+39 vendor/github.com/charmbracelet/ultraviolet/tty_windows.go+39 vendor/github.com/charmbracelet/ultraviolet/utils.go+15 vendor/github.com/charmbracelet/ultraviolet/uv.go+406 vendor/github.com/charmbracelet/ultraviolet/winch.go+62 vendor/github.com/charmbracelet/ultraviolet/winch_other.go+17 vendor/github.com/charmbracelet/ultraviolet/winch_unix.go+50 vendor/github.com/charmbracelet/ultraviolet/window.go+147 vendor/github.com/charmbracelet/x/ansi/LICENSE+21 vendor/github.com/charmbracelet/x/ansi/ansi.go+11 vendor/github.com/charmbracelet/x/ansi/ascii.go+8 vendor/github.com/charmbracelet/x/ansi/background.go+178 vendor/github.com/charmbracelet/x/ansi/c0.go+79 vendor/github.com/charmbracelet/x/ansi/c1.go+72 vendor/github.com/charmbracelet/x/ansi/charset.go+55 vendor/github.com/charmbracelet/x/ansi/clipboard.go+75 vendor/github.com/charmbracelet/x/ansi/color.go+784 vendor/github.com/charmbracelet/x/ansi/ctrl.go+156 vendor/github.com/charmbracelet/x/ansi/cursor.go+637 vendor/github.com/charmbracelet/x/ansi/cwd.go+26 vendor/github.com/charmbracelet/x/ansi/doc.go+7 vendor/github.com/charmbracelet/x/ansi/finalterm.go+67 vendor/github.com/charmbracelet/x/ansi/focus.go+9 vendor/github.com/charmbracelet/x/ansi/graphics.go+62 vendor/github.com/charmbracelet/x/ansi/hyperlink.go+28 vendor/github.com/charmbracelet/x/ansi/inband.go+24 vendor/github.com/charmbracelet/x/ansi/iterm2.go+18 vendor/github.com/charmbracelet/x/ansi/keypad.go+28 vendor/github.com/charmbracelet/x/ansi/kitty.go+90 vendor/github.com/charmbracelet/x/ansi/kitty/decoder.go+86 vendor/github.com/charmbracelet/x/ansi/kitty/encoder.go+64 vendor/github.com/charmbracelet/x/ansi/kitty/graphics.go+414 vendor/github.com/charmbracelet/x/ansi/kitty/options.go+373 vendor/github.com/charmbracelet/x/ansi/kitty/writer.go+187 vendor/github.com/charmbracelet/x/ansi/method.go+196 vendor/github.com/charmbracelet/x/ansi/mode.go+690 vendor/github.com/charmbracelet/x/ansi/mode_deprecated.go+495 vendor/github.com/charmbracelet/x/ansi/modes.go+65 vendor/github.com/charmbracelet/x/ansi/mouse.go+172 vendor/github.com/charmbracelet/x/ansi/notification.go+32 vendor/github.com/charmbracelet/x/ansi/palette.go+34 vendor/github.com/charmbracelet/x/ansi/parser.go+417 vendor/github.com/charmbracelet/x/ansi/parser/const.go+79 vendor/github.com/charmbracelet/x/ansi/parser/seq.go+136 vendor/github.com/charmbracelet/x/ansi/parser/transition_table.go+273 vendor/github.com/charmbracelet/x/ansi/parser_decode.go+525 vendor/github.com/charmbracelet/x/ansi/parser_handler.go+60 vendor/github.com/charmbracelet/x/ansi/parser_sync.go+29 vendor/github.com/charmbracelet/x/ansi/passthrough.go+60 vendor/github.com/charmbracelet/x/ansi/paste.go+7 vendor/github.com/charmbracelet/x/ansi/progress.go+49 vendor/github.com/charmbracelet/x/ansi/reset.go+11 vendor/github.com/charmbracelet/x/ansi/screen.go+410 vendor/github.com/charmbracelet/x/ansi/sgr.go+79 vendor/github.com/charmbracelet/x/ansi/status.go+168 vendor/github.com/charmbracelet/x/ansi/style.go+819 vendor/github.com/charmbracelet/x/ansi/termcap.go+41 vendor/github.com/charmbracelet/x/ansi/title.go+48 vendor/github.com/charmbracelet/x/ansi/truncate.go+290 vendor/github.com/charmbracelet/x/ansi/urxvt.go+17 vendor/github.com/charmbracelet/x/ansi/util.go+92 vendor/github.com/charmbracelet/x/ansi/width.go+107 vendor/github.com/charmbracelet/x/ansi/winop.go+59 vendor/github.com/charmbracelet/x/ansi/wrap.go+472 vendor/github.com/charmbracelet/x/ansi/xterm.go+138 vendor/github.com/charmbracelet/x/editor/LICENSE+21 vendor/github.com/charmbracelet/x/editor/editor.go+140 vendor/github.com/charmbracelet/x/etag/LICENSE+21 vendor/github.com/charmbracelet/x/etag/etag.go+48 vendor/github.com/charmbracelet/x/exp/charmtone/LICENSE+21 vendor/github.com/charmbracelet/x/exp/charmtone/charmtone.go+443 vendor/github.com/charmbracelet/x/exp/golden/LICENSE+21 vendor/github.com/charmbracelet/x/exp/golden/golden.go+83 vendor/github.com/charmbracelet/x/exp/ordered/LICENSE+21 vendor/github.com/charmbracelet/x/exp/ordered/ordered.go+42 vendor/github.com/charmbracelet/x/exp/slice/LICENSE+21 vendor/github.com/charmbracelet/x/exp/slice/slice.go+148 vendor/github.com/charmbracelet/x/exp/strings/LICENSE+21 vendor/github.com/charmbracelet/x/exp/strings/contains.go+16 vendor/github.com/charmbracelet/x/exp/strings/join.go+134 vendor/github.com/charmbracelet/x/powernap/LICENSE+21 vendor/github.com/charmbracelet/x/powernap/pkg/config/config.go+118 vendor/github.com/charmbracelet/x/powernap/pkg/config/lsps.json+367 vendor/github.com/charmbracelet/x/powernap/pkg/config/overrides.go+85 vendor/github.com/charmbracelet/x/powernap/pkg/lsp/client.go+875 vendor/github.com/charmbracelet/x/powernap/pkg/lsp/language.go+158 vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol.go+50 vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol/LICENSE+27 vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol/interface.go+132 vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol/pattern_interfaces.go+79 vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol/tables.go+31 vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol/tsdocument-changes.go+83 vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol/tsjson.go+3072 vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol/tsprotocol.go+6963 vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol/uri.go+192 vendor/github.com/charmbracelet/x/powernap/pkg/lsp/sync.go+240 vendor/github.com/charmbracelet/x/powernap/pkg/lsp/types.go+93 vendor/github.com/charmbracelet/x/powernap/pkg/transport/connection.go+130 vendor/github.com/charmbracelet/x/powernap/pkg/transport/router.go+107 vendor/github.com/charmbracelet/x/powernap/pkg/transport/transport.go+214 vendor/github.com/charmbracelet/x/term/LICENSE+21 vendor/github.com/charmbracelet/x/term/term.go+51 vendor/github.com/charmbracelet/x/term/term_other.go+39 vendor/github.com/charmbracelet/x/term/term_plan9.go+118 vendor/github.com/charmbracelet/x/term/term_unix.go+96 vendor/github.com/charmbracelet/x/term/term_unix_bsd.go+11 vendor/github.com/charmbracelet/x/term/term_unix_other.go+11 vendor/github.com/charmbracelet/x/term/term_windows.go+87 vendor/github.com/charmbracelet/x/term/terminal.go+12 vendor/github.com/charmbracelet/x/term/util.go+47 vendor/github.com/charmbracelet/x/termios/LICENSE+21 vendor/github.com/charmbracelet/x/termios/bit_bsd.go+7 vendor/github.com/charmbracelet/x/termios/bit_darwin.go+7 vendor/github.com/charmbracelet/x/termios/bit_other.go+7 vendor/github.com/charmbracelet/x/termios/syscalls_bsd.go+11 vendor/github.com/charmbracelet/x/termios/syscalls_darwin.go+10 vendor/github.com/charmbracelet/x/termios/syscalls_linux.go+14 vendor/github.com/charmbracelet/x/termios/termios.go+249 vendor/github.com/charmbracelet/x/termios/termios_bsd.go+13 vendor/github.com/charmbracelet/x/termios/termios_linux.go+13 vendor/github.com/charmbracelet/x/termios/termios_other.go+15 vendor/github.com/charmbracelet/x/termios/termios_solaris.go+26 vendor/github.com/charmbracelet/x/windows/LICENSE+21 vendor/github.com/charmbracelet/x/windows/doc.go+4 vendor/github.com/charmbracelet/x/windows/syscall_windows.go+14 vendor/github.com/charmbracelet/x/windows/types.go+221 vendor/github.com/charmbracelet/x/windows/types_windows.go+142 vendor/github.com/charmbracelet/x/windows/zsyscall_windows.go+77 vendor/github.com/clipperhouse/displaywidth/.gitignore+3 vendor/github.com/clipperhouse/displaywidth/AGENTS.md+51 vendor/github.com/clipperhouse/displaywidth/CHANGELOG.md+129 vendor/github.com/clipperhouse/displaywidth/LICENSE+21 vendor/github.com/clipperhouse/displaywidth/README.md+190 vendor/github.com/clipperhouse/displaywidth/gen.go+3 vendor/github.com/clipperhouse/displaywidth/graphemes.go+73 vendor/github.com/clipperhouse/displaywidth/options.go+30 vendor/github.com/clipperhouse/displaywidth/trie.go+1699 vendor/github.com/clipperhouse/displaywidth/truncate.go+149 vendor/github.com/clipperhouse/displaywidth/width.go+239 vendor/github.com/clipperhouse/uax29/v2/LICENSE+21 vendor/github.com/clipperhouse/uax29/v2/graphemes/README.md+120 vendor/github.com/clipperhouse/uax29/v2/graphemes/ansi.go+138 vendor/github.com/clipperhouse/uax29/v2/graphemes/ansi8.go+79 vendor/github.com/clipperhouse/uax29/v2/graphemes/iterator.go+144 vendor/github.com/clipperhouse/uax29/v2/graphemes/reader.go+25 vendor/github.com/clipperhouse/uax29/v2/graphemes/splitfunc.go+205 vendor/github.com/clipperhouse/uax29/v2/graphemes/trie.go+1717 vendor/github.com/clipperhouse/uax29/v2/words/README.md+121 vendor/github.com/clipperhouse/uax29/v2/words/bleve_compat.go+104 vendor/github.com/clipperhouse/uax29/v2/words/iterator.go+126 vendor/github.com/clipperhouse/uax29/v2/words/joiners.go+41 vendor/github.com/clipperhouse/uax29/v2/words/reader.go+34 vendor/github.com/clipperhouse/uax29/v2/words/seek.go+43 vendor/github.com/clipperhouse/uax29/v2/words/splitfunc.go+269 vendor/github.com/clipperhouse/uax29/v2/words/trie.go+3774 vendor/github.com/cyphar/filepath-securejoin/.golangci.yml+60 vendor/github.com/cyphar/filepath-securejoin/CHANGELOG.md+453 vendor/github.com/cyphar/filepath-securejoin/COPYING.md+447 vendor/github.com/cyphar/filepath-securejoin/LICENSE.BSD+28 vendor/github.com/cyphar/filepath-securejoin/LICENSE.MPL-2.0+373 vendor/github.com/cyphar/filepath-securejoin/README.md+184 vendor/github.com/cyphar/filepath-securejoin/VERSION+1 vendor/github.com/cyphar/filepath-securejoin/codecov.yml+29 vendor/github.com/cyphar/filepath-securejoin/doc.go+47 vendor/github.com/cyphar/filepath-securejoin/internal/consts/consts.go+15 vendor/github.com/cyphar/filepath-securejoin/join.go+169 vendor/github.com/cyphar/filepath-securejoin/vfs.go+37 vendor/github.com/davecgh/go-spew/LICENSE+15 vendor/github.com/davecgh/go-spew/spew/bypass.go+145 vendor/github.com/davecgh/go-spew/spew/bypasssafe.go+38 vendor/github.com/davecgh/go-spew/spew/common.go+341 vendor/github.com/davecgh/go-spew/spew/config.go+306 vendor/github.com/davecgh/go-spew/spew/doc.go+211 vendor/github.com/davecgh/go-spew/spew/dump.go+509 vendor/github.com/davecgh/go-spew/spew/format.go+419 vendor/github.com/davecgh/go-spew/spew/spew.go+148 vendor/github.com/denisbrodbeck/machineid/.gitignore+29 vendor/github.com/denisbrodbeck/machineid/LICENSE.md+22 vendor/github.com/denisbrodbeck/machineid/README.md+182 vendor/github.com/denisbrodbeck/machineid/helper.go+36 vendor/github.com/denisbrodbeck/machineid/id.go+45 vendor/github.com/denisbrodbeck/machineid/id_bsd.go+42 vendor/github.com/denisbrodbeck/machineid/id_darwin.go+37 vendor/github.com/denisbrodbeck/machineid/id_linux.go+27 vendor/github.com/denisbrodbeck/machineid/id_windows.go+23 vendor/github.com/denisbrodbeck/machineid/logo.png vendor/github.com/denisbrodbeck/machineid/makefile+12 vendor/github.com/disintegration/imaging/.travis.yml+12 vendor/github.com/disintegration/imaging/LICENSE+21 vendor/github.com/disintegration/imaging/README.md+226 vendor/github.com/disintegration/imaging/adjust.go+253 vendor/github.com/disintegration/imaging/convolution.go+148 vendor/github.com/disintegration/imaging/doc.go+7 vendor/github.com/disintegration/imaging/effects.go+169 vendor/github.com/disintegration/imaging/histogram.go+52 vendor/github.com/disintegration/imaging/io.go+444 vendor/github.com/disintegration/imaging/resize.go+595 vendor/github.com/disintegration/imaging/scanner.go+285 vendor/github.com/disintegration/imaging/tools.go+249 vendor/github.com/disintegration/imaging/transform.go+268 vendor/github.com/disintegration/imaging/utils.go+167 vendor/github.com/dlclark/regexp2/v2/.gitignore+29 vendor/github.com/dlclark/regexp2/v2/ATTRIB+133 vendor/github.com/dlclark/regexp2/v2/LICENSE+21 vendor/github.com/dlclark/regexp2/v2/README.md+283 vendor/github.com/dlclark/regexp2/v2/Taskfile.yml+64 vendor/github.com/dlclark/regexp2/v2/bufferpool.go+76 vendor/github.com/dlclark/regexp2/v2/fastclock.go+141 vendor/github.com/dlclark/regexp2/v2/helpers/indexof.go+394 vendor/github.com/dlclark/regexp2/v2/helpers/math.go+15 vendor/github.com/dlclark/regexp2/v2/helpers/runes.go+58 vendor/github.com/dlclark/regexp2/v2/helpers/searchvalues.go+180 vendor/github.com/dlclark/regexp2/v2/match.go+455 vendor/github.com/dlclark/regexp2/v2/options.go+157 vendor/github.com/dlclark/regexp2/v2/regexp.go+717 vendor/github.com/dlclark/regexp2/v2/regexp_codegen.go+70 vendor/github.com/dlclark/regexp2/v2/replace.go+357 vendor/github.com/dlclark/regexp2/v2/runner.go+2197 vendor/github.com/dlclark/regexp2/v2/split.go+67 vendor/github.com/dlclark/regexp2/v2/stringprefixfilter.go+375 vendor/github.com/dlclark/regexp2/v2/syntax/charclass.go+1507 vendor/github.com/dlclark/regexp2/v2/syntax/code.go+316 vendor/github.com/dlclark/regexp2/v2/syntax/escape.go+94 vendor/github.com/dlclark/regexp2/v2/syntax/fuzz.go+21 vendor/github.com/dlclark/regexp2/v2/syntax/optimizations.go+672 vendor/github.com/dlclark/regexp2/v2/syntax/parser.go+2529 vendor/github.com/dlclark/regexp2/v2/syntax/prefix.go+943 vendor/github.com/dlclark/regexp2/v2/syntax/prefixanalyzer.go+1491 vendor/github.com/dlclark/regexp2/v2/syntax/replacerdata.go+87 vendor/github.com/dlclark/regexp2/v2/syntax/tree.go+2362 vendor/github.com/dlclark/regexp2/v2/syntax/unicode_alias_tables.go+6058 vendor/github.com/dlclark/regexp2/v2/syntax/writer.go+500 vendor/github.com/dustin/go-humanize/.travis.yml+21 vendor/github.com/dustin/go-humanize/LICENSE+21 vendor/github.com/dustin/go-humanize/README.markdown+124 vendor/github.com/dustin/go-humanize/big.go+31 vendor/github.com/dustin/go-humanize/bigbytes.go+189 vendor/github.com/dustin/go-humanize/bytes.go+143 vendor/github.com/dustin/go-humanize/comma.go+116 vendor/github.com/dustin/go-humanize/commaf.go+41 vendor/github.com/dustin/go-humanize/ftoa.go+49 vendor/github.com/dustin/go-humanize/humanize.go+8 vendor/github.com/dustin/go-humanize/number.go+192 vendor/github.com/dustin/go-humanize/ordinals.go+25 vendor/github.com/dustin/go-humanize/si.go+127 vendor/github.com/dustin/go-humanize/times.go+117 vendor/github.com/ebitengine/purego/.gitignore+1 vendor/github.com/ebitengine/purego/LICENSE+201 vendor/github.com/ebitengine/purego/README.md+119 vendor/github.com/ebitengine/purego/abi_amd64.h+99 vendor/github.com/ebitengine/purego/abi_arm64.h+39 vendor/github.com/ebitengine/purego/abi_loong64.h+60 vendor/github.com/ebitengine/purego/cgo.go+19 vendor/github.com/ebitengine/purego/dlerror.go+17 vendor/github.com/ebitengine/purego/dlfcn.go+99 vendor/github.com/ebitengine/purego/dlfcn_android.go+34 vendor/github.com/ebitengine/purego/dlfcn_darwin.go+20 vendor/github.com/ebitengine/purego/dlfcn_freebsd.go+14 vendor/github.com/ebitengine/purego/dlfcn_linux.go+16 vendor/github.com/ebitengine/purego/dlfcn_netbsd.go+15 vendor/github.com/ebitengine/purego/dlfcn_nocgo_freebsd.go+11 vendor/github.com/ebitengine/purego/dlfcn_nocgo_linux.go+19 vendor/github.com/ebitengine/purego/dlfcn_nocgo_netbsd.go+9 vendor/github.com/ebitengine/purego/dlfcn_playground.go+24 vendor/github.com/ebitengine/purego/dlfcn_stubs.s+22 vendor/github.com/ebitengine/purego/func.go+564 vendor/github.com/ebitengine/purego/gen.go+6 vendor/github.com/ebitengine/purego/go_runtime.go+13 vendor/github.com/ebitengine/purego/internal/cgo/dlfcn_cgo_unix.go+56 vendor/github.com/ebitengine/purego/internal/cgo/empty.go+6 vendor/github.com/ebitengine/purego/internal/cgo/syscall_cgo_unix.go+55 vendor/github.com/ebitengine/purego/internal/fakecgo/abi_amd64.h+99 vendor/github.com/ebitengine/purego/internal/fakecgo/abi_arm64.h+39 vendor/github.com/ebitengine/purego/internal/fakecgo/abi_loong64.h+60 vendor/github.com/ebitengine/purego/internal/fakecgo/abi_ppc64x.h+195 vendor/github.com/ebitengine/purego/internal/fakecgo/asm_386.s+29 vendor/github.com/ebitengine/purego/internal/fakecgo/asm_amd64.s+39 vendor/github.com/ebitengine/purego/internal/fakecgo/asm_arm.s+52 vendor/github.com/ebitengine/purego/internal/fakecgo/asm_arm64.s+36 vendor/github.com/ebitengine/purego/internal/fakecgo/asm_loong64.s+40 vendor/github.com/ebitengine/purego/internal/fakecgo/asm_ppc64le.s+82 vendor/github.com/ebitengine/purego/internal/fakecgo/asm_riscv64.s+78 vendor/github.com/ebitengine/purego/internal/fakecgo/asm_s390x.s+55 vendor/github.com/ebitengine/purego/internal/fakecgo/callbacks.go+93 vendor/github.com/ebitengine/purego/internal/fakecgo/doc.go+32 vendor/github.com/ebitengine/purego/internal/fakecgo/fakecgo.go+14 vendor/github.com/ebitengine/purego/internal/fakecgo/freebsd.go+27 vendor/github.com/ebitengine/purego/internal/fakecgo/go_darwin.go+88 vendor/github.com/ebitengine/purego/internal/fakecgo/go_freebsd.go+100 vendor/github.com/ebitengine/purego/internal/fakecgo/go_libinit.go+72 vendor/github.com/ebitengine/purego/internal/fakecgo/go_linux.go+100 vendor/github.com/ebitengine/purego/internal/fakecgo/go_netbsd.go+106 vendor/github.com/ebitengine/purego/internal/fakecgo/go_setenv.go+18 vendor/github.com/ebitengine/purego/internal/fakecgo/go_util.go+38 vendor/github.com/ebitengine/purego/internal/fakecgo/iscgo.go+19 vendor/github.com/ebitengine/purego/internal/fakecgo/libcgo.go+39 vendor/github.com/ebitengine/purego/internal/fakecgo/libcgo_darwin.go+26 vendor/github.com/ebitengine/purego/internal/fakecgo/libcgo_freebsd.go+20 vendor/github.com/ebitengine/purego/internal/fakecgo/libcgo_linux.go+20 vendor/github.com/ebitengine/purego/internal/fakecgo/libcgo_netbsd.go+26 vendor/github.com/ebitengine/purego/internal/fakecgo/netbsd.go+23 vendor/github.com/ebitengine/purego/internal/fakecgo/setenv.go+19 vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_386.s+107 vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_amd64.s+107 vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_arm.s+81 vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_arm64.s+84 vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_loong64.s+88 vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_ppc64le.s+227 vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_riscv64.s+72 vendor/github.com/ebitengine/purego/internal/fakecgo/zsymbols.go+165 vendor/github.com/ebitengine/purego/internal/fakecgo/zsymbols_darwin.go+59 vendor/github.com/ebitengine/purego/internal/fakecgo/zsymbols_freebsd.go+48 vendor/github.com/ebitengine/purego/internal/fakecgo/zsymbols_linux.go+48 vendor/github.com/ebitengine/purego/internal/fakecgo/zsymbols_netbsd.go+59 vendor/github.com/ebitengine/purego/internal/fakecgo/ztrampolines_darwin.s+19 vendor/github.com/ebitengine/purego/internal/fakecgo/ztrampolines_freebsd.s+16 vendor/github.com/ebitengine/purego/internal/fakecgo/ztrampolines_linux.s+16 vendor/github.com/ebitengine/purego/internal/fakecgo/ztrampolines_netbsd.s+19 vendor/github.com/ebitengine/purego/internal/fakecgo/ztrampolines_stubs.s+55 vendor/github.com/ebitengine/purego/internal/strings/strings.go+40 vendor/github.com/ebitengine/purego/internal/xreflect/reflect_go124.go+15 vendor/github.com/ebitengine/purego/internal/xreflect/reflect_go125.go+12 vendor/github.com/ebitengine/purego/is_ios.go+13 vendor/github.com/ebitengine/purego/nocgo.go+25 vendor/github.com/ebitengine/purego/objc/objc_block_darwin.go+272 vendor/github.com/ebitengine/purego/objc/objc_runtime_darwin.go+709 vendor/github.com/ebitengine/purego/struct_386.go+41 vendor/github.com/ebitengine/purego/struct_amd64.go+286 vendor/github.com/ebitengine/purego/struct_arm.go+85 vendor/github.com/ebitengine/purego/struct_arm64.go+549 vendor/github.com/ebitengine/purego/struct_loong64.go+213 vendor/github.com/ebitengine/purego/struct_ppc64le.go+143 vendor/github.com/ebitengine/purego/struct_riscv64.go+143 vendor/github.com/ebitengine/purego/struct_s390x.go+143 vendor/github.com/ebitengine/purego/sys_386.s+147 vendor/github.com/ebitengine/purego/sys_amd64.s+170 vendor/github.com/ebitengine/purego/sys_arm.s+142 vendor/github.com/ebitengine/purego/sys_arm64.s+97 vendor/github.com/ebitengine/purego/sys_loong64.s+96 vendor/github.com/ebitengine/purego/sys_ppc64le.s+120 vendor/github.com/ebitengine/purego/sys_riscv64.s+101 vendor/github.com/ebitengine/purego/sys_s390x.s+114 vendor/github.com/ebitengine/purego/sys_unix_386.s+226 vendor/github.com/ebitengine/purego/sys_unix_arm.s+89 vendor/github.com/ebitengine/purego/sys_unix_arm64.s+70 vendor/github.com/ebitengine/purego/sys_unix_loong64.s+75 vendor/github.com/ebitengine/purego/sys_unix_ppc64le.s+114 vendor/github.com/ebitengine/purego/sys_unix_riscv64.s+79 vendor/github.com/ebitengine/purego/sys_unix_s390x.s+109 vendor/github.com/ebitengine/purego/syscall.go+83 vendor/github.com/ebitengine/purego/syscall_32bit.go+109 vendor/github.com/ebitengine/purego/syscall_cgo_linux.go+21 vendor/github.com/ebitengine/purego/syscall_sysv.go+317 vendor/github.com/ebitengine/purego/syscall_sysv_others.go+28 vendor/github.com/ebitengine/purego/syscall_sysv_stackargs.go+33 vendor/github.com/ebitengine/purego/syscall_windows.go+46 vendor/github.com/ebitengine/purego/zcallback_386.s+4014 vendor/github.com/ebitengine/purego/zcallback_amd64.s+2014 vendor/github.com/ebitengine/purego/zcallback_arm.s+4014 vendor/github.com/ebitengine/purego/zcallback_arm64.s+4014 vendor/github.com/ebitengine/purego/zcallback_loong64.s+4014 vendor/github.com/ebitengine/purego/zcallback_ppc64le.s+4014 vendor/github.com/ebitengine/purego/zcallback_riscv64.s+4051 vendor/github.com/ebitengine/purego/zcallback_s390x.s+4015 vendor/github.com/esiqveland/notify/.gitignore+1 vendor/github.com/esiqveland/notify/LICENSE.txt+27 vendor/github.com/esiqveland/notify/README.md+54 vendor/github.com/esiqveland/notify/doc.go+18 vendor/github.com/esiqveland/notify/notification.go+547 vendor/github.com/felixge/httpsnoop/.gitignore vendor/github.com/felixge/httpsnoop/LICENSE.txt+19 vendor/github.com/felixge/httpsnoop/Makefile+10 vendor/github.com/felixge/httpsnoop/README.md+95 vendor/github.com/felixge/httpsnoop/capture_metrics.go+121 vendor/github.com/felixge/httpsnoop/docs.go+10 vendor/github.com/felixge/httpsnoop/wrap_generated.go+16179 vendor/github.com/fsnotify/fsnotify/.cirrus.yml+14 vendor/github.com/fsnotify/fsnotify/.gitignore+10 vendor/github.com/fsnotify/fsnotify/.mailmap+2 vendor/github.com/fsnotify/fsnotify/CHANGELOG.md+602 vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md+145 vendor/github.com/fsnotify/fsnotify/LICENSE+25 vendor/github.com/fsnotify/fsnotify/README.md+182 vendor/github.com/fsnotify/fsnotify/backend_fen.go+467 vendor/github.com/fsnotify/fsnotify/backend_inotify.go+583 vendor/github.com/fsnotify/fsnotify/backend_kqueue.go+705 vendor/github.com/fsnotify/fsnotify/backend_other.go+22 vendor/github.com/fsnotify/fsnotify/backend_windows.go+680 vendor/github.com/fsnotify/fsnotify/fsnotify.go+496 vendor/github.com/fsnotify/fsnotify/internal/darwin.go+39 vendor/github.com/fsnotify/fsnotify/internal/debug_darwin.go+57 vendor/github.com/fsnotify/fsnotify/internal/debug_dragonfly.go+33 vendor/github.com/fsnotify/fsnotify/internal/debug_freebsd.go+42 vendor/github.com/fsnotify/fsnotify/internal/debug_kqueue.go+32 vendor/github.com/fsnotify/fsnotify/internal/debug_linux.go+56 vendor/github.com/fsnotify/fsnotify/internal/debug_netbsd.go+25 vendor/github.com/fsnotify/fsnotify/internal/debug_openbsd.go+28 vendor/github.com/fsnotify/fsnotify/internal/debug_solaris.go+45 vendor/github.com/fsnotify/fsnotify/internal/debug_windows.go+40 vendor/github.com/fsnotify/fsnotify/internal/freebsd.go+31 vendor/github.com/fsnotify/fsnotify/internal/internal.go+2 vendor/github.com/fsnotify/fsnotify/internal/unix.go+31 vendor/github.com/fsnotify/fsnotify/internal/unix2.go+7 vendor/github.com/fsnotify/fsnotify/internal/windows.go+41 vendor/github.com/fsnotify/fsnotify/shared.go+64 vendor/github.com/fsnotify/fsnotify/staticcheck.conf+3 vendor/github.com/fsnotify/fsnotify/system_bsd.go+7 vendor/github.com/fsnotify/fsnotify/system_darwin.go+8 vendor/github.com/gen2brain/beeep/LICENSE+23 vendor/github.com/gen2brain/beeep/README.md+41 vendor/github.com/gen2brain/beeep/alert_darwin.go+8 vendor/github.com/gen2brain/beeep/alert_js.go+12 vendor/github.com/gen2brain/beeep/alert_unix.go+17 vendor/github.com/gen2brain/beeep/alert_unsupported.go+8 vendor/github.com/gen2brain/beeep/alert_windows.go+43 vendor/github.com/gen2brain/beeep/beeep.go+55 vendor/github.com/gen2brain/beeep/beep_darwin.go+32 vendor/github.com/gen2brain/beeep/beep_js.go+39 vendor/github.com/gen2brain/beeep/beep_unix.go+100 vendor/github.com/gen2brain/beeep/beep_unsupported.go+15 vendor/github.com/gen2brain/beeep/beep_windows.go+52 vendor/github.com/gen2brain/beeep/notify_darwin.go+131 vendor/github.com/gen2brain/beeep/notify_js.go+63 vendor/github.com/gen2brain/beeep/notify_unix.go+181 vendor/github.com/gen2brain/beeep/notify_unix_nodbus.go+78 vendor/github.com/gen2brain/beeep/notify_unsupported.go+8 vendor/github.com/gen2brain/beeep/notify_windows.go+157 vendor/github.com/gen2brain/beeep/notify_windows_compat.go+109 vendor/github.com/go-git/gcfg/.gitignore+1 vendor/github.com/go-git/gcfg/LICENSE+28 vendor/github.com/go-git/gcfg/Makefile+17 vendor/github.com/go-git/gcfg/README+4 vendor/github.com/go-git/gcfg/doc.go+145 vendor/github.com/go-git/gcfg/errors.go+41 vendor/github.com/go-git/gcfg/read.go+273 vendor/github.com/go-git/gcfg/scanner/errors.go+121 vendor/github.com/go-git/gcfg/scanner/scanner.go+334 vendor/github.com/go-git/gcfg/set.go+334 vendor/github.com/go-git/gcfg/token/position.go+435 vendor/github.com/go-git/gcfg/token/serialize.go+56 vendor/github.com/go-git/gcfg/token/token.go+83 vendor/github.com/go-git/gcfg/types/bool.go+23 vendor/github.com/go-git/gcfg/types/doc.go+4 vendor/github.com/go-git/gcfg/types/enum.go+44 vendor/github.com/go-git/gcfg/types/int.go+86 vendor/github.com/go-git/gcfg/types/scan.go+23 vendor/github.com/go-git/go-billy/v5/.gitignore+4 vendor/github.com/go-git/go-billy/v5/LICENSE+201 vendor/github.com/go-git/go-billy/v5/Makefile+18 vendor/github.com/go-git/go-billy/v5/README.md+77 vendor/github.com/go-git/go-billy/v5/fs.go+210 vendor/github.com/go-git/go-billy/v5/helper/chroot/chroot.go+444 vendor/github.com/go-git/go-billy/v5/helper/polyfill/polyfill.go+114 vendor/github.com/go-git/go-billy/v5/memfs/memory.go+428 vendor/github.com/go-git/go-billy/v5/memfs/storage.go+251 vendor/github.com/go-git/go-billy/v5/osfs/os.go+132 vendor/github.com/go-git/go-billy/v5/osfs/os_bound.go+351 vendor/github.com/go-git/go-billy/v5/osfs/os_chroot.go+126 vendor/github.com/go-git/go-billy/v5/osfs/os_js.go+25 vendor/github.com/go-git/go-billy/v5/osfs/os_options.go+3 vendor/github.com/go-git/go-billy/v5/osfs/os_plan9.go+91 vendor/github.com/go-git/go-billy/v5/osfs/os_posix.go+38 vendor/github.com/go-git/go-billy/v5/osfs/os_wasip1.go+34 vendor/github.com/go-git/go-billy/v5/osfs/os_windows.go+58 vendor/github.com/go-git/go-billy/v5/util/glob.go+111 vendor/github.com/go-git/go-billy/v5/util/util.go+282 vendor/github.com/go-git/go-billy/v5/util/walk.go+72 vendor/github.com/go-git/go-git/v5/LICENSE+201 vendor/github.com/go-git/go-git/v5/config/branch.go+123 vendor/github.com/go-git/go-git/v5/config/config.go+727 vendor/github.com/go-git/go-git/v5/config/modules.go+191 vendor/github.com/go-git/go-git/v5/config/optbool.go+82 vendor/github.com/go-git/go-git/v5/config/refspec.go+155 vendor/github.com/go-git/go-git/v5/config/url.go+81 vendor/github.com/go-git/go-git/v5/internal/path_util/path_util.go+29 vendor/github.com/go-git/go-git/v5/internal/pathutil/dotgit.go+21 vendor/github.com/go-git/go-git/v5/internal/pathutil/hfs.go+99 vendor/github.com/go-git/go-git/v5/internal/pathutil/ntfs.go+187 vendor/github.com/go-git/go-git/v5/internal/pathutil/tree.go+66 vendor/github.com/go-git/go-git/v5/internal/url/url.go+72 vendor/github.com/go-git/go-git/v5/plumbing/error.go+35 vendor/github.com/go-git/go-git/v5/plumbing/format/config/common.go+109 vendor/github.com/go-git/go-git/v5/plumbing/format/config/decoder.go+37 vendor/github.com/go-git/go-git/v5/plumbing/format/config/doc.go+122 vendor/github.com/go-git/go-git/v5/plumbing/format/config/encoder.go+82 vendor/github.com/go-git/go-git/v5/plumbing/format/config/format.go+53 vendor/github.com/go-git/go-git/v5/plumbing/format/config/option.go+127 vendor/github.com/go-git/go-git/v5/plumbing/format/config/section.go+181 vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/dir.go+148 vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/doc.go+70 vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/matcher.go+30 vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/pattern.go+155 vendor/github.com/go-git/go-git/v5/plumbing/hash.go+84 vendor/github.com/go-git/go-git/v5/plumbing/hash/hash.go+60 vendor/github.com/go-git/go-git/v5/plumbing/hash/hash_sha1.go+15 vendor/github.com/go-git/go-git/v5/plumbing/hash/hash_sha256.go+15 vendor/github.com/go-git/go-git/v5/plumbing/memory.go+72 vendor/github.com/go-git/go-git/v5/plumbing/object.go+111 vendor/github.com/go-git/go-git/v5/plumbing/reference.go+315 vendor/github.com/go-git/go-git/v5/plumbing/revision.go+11 vendor/github.com/go-git/go-git/v5/utils/ioutil/common.go+210 vendor/github.com/go-json-experiment/json/AUTHORS+3 vendor/github.com/go-json-experiment/json/CONTRIBUTORS+3 vendor/github.com/go-json-experiment/json/LICENSE+27 vendor/github.com/go-json-experiment/json/README.md+176 vendor/github.com/go-json-experiment/json/alias.go+943 vendor/github.com/go-json-experiment/json/api.png vendor/github.com/go-json-experiment/json/arshal.go+569 vendor/github.com/go-json-experiment/json/arshal_any.go+289 vendor/github.com/go-json-experiment/json/arshal_default.go+2043 vendor/github.com/go-json-experiment/json/arshal_embedded.go+230 vendor/github.com/go-json-experiment/json/arshal_funcs.go+428 vendor/github.com/go-json-experiment/json/arshal_methods.go+378 vendor/github.com/go-json-experiment/json/arshal_time.go+795 vendor/github.com/go-json-experiment/json/doc.go+247 vendor/github.com/go-json-experiment/json/errors.go+465 vendor/github.com/go-json-experiment/json/fields.go+656 vendor/github.com/go-json-experiment/json/fold.go+58 vendor/github.com/go-json-experiment/json/intern.go+88 vendor/github.com/go-json-experiment/json/internal/internal.go+42 vendor/github.com/go-json-experiment/json/internal/jsonflags/flags.go+223 vendor/github.com/go-json-experiment/json/internal/jsonopts/options.go+217 vendor/github.com/go-json-experiment/json/internal/jsonopts/options_format.go+124 vendor/github.com/go-json-experiment/json/internal/jsonwire/decode.go+606 vendor/github.com/go-json-experiment/json/internal/jsonwire/encode.go+290 vendor/github.com/go-json-experiment/json/internal/jsonwire/wire.go+209 vendor/github.com/go-json-experiment/json/jsontext/alias.go+555 vendor/github.com/go-json-experiment/json/jsontext/decode.go+1218 vendor/github.com/go-json-experiment/json/jsontext/doc.go+111 vendor/github.com/go-json-experiment/json/jsontext/encode.go+993 vendor/github.com/go-json-experiment/json/jsontext/errors.go+213 vendor/github.com/go-json-experiment/json/jsontext/export.go+91 vendor/github.com/go-json-experiment/json/jsontext/options.go+304 vendor/github.com/go-json-experiment/json/jsontext/pools.go+164 vendor/github.com/go-json-experiment/json/jsontext/quote.go+41 vendor/github.com/go-json-experiment/json/jsontext/state.go+828 vendor/github.com/go-json-experiment/json/jsontext/token.go+697 vendor/github.com/go-json-experiment/json/jsontext/value.go+414 vendor/github.com/go-json-experiment/json/migrate.sh+60 vendor/github.com/go-json-experiment/json/options.go+290 vendor/github.com/go-json-experiment/json/options_format.go+122 vendor/github.com/go-json-experiment/json/options_format_global.go+30 vendor/github.com/go-logfmt/logfmt/.gitignore+1 vendor/github.com/go-logfmt/logfmt/CHANGELOG.md+82 vendor/github.com/go-logfmt/logfmt/LICENSE+22 vendor/github.com/go-logfmt/logfmt/README.md+41 vendor/github.com/go-logfmt/logfmt/decode.go+254 vendor/github.com/go-logfmt/logfmt/doc.go+6 vendor/github.com/go-logfmt/logfmt/encode.go+322 vendor/github.com/go-logfmt/logfmt/jsonstring.go+277 vendor/github.com/go-logr/logr/.golangci.yaml+28 vendor/github.com/go-logr/logr/CHANGELOG.md+6 vendor/github.com/go-logr/logr/CONTRIBUTING.md+17 vendor/github.com/go-logr/logr/LICENSE+201 vendor/github.com/go-logr/logr/README.md+407 vendor/github.com/go-logr/logr/SECURITY.md+18 vendor/github.com/go-logr/logr/context.go+33 vendor/github.com/go-logr/logr/context_noslog.go+49 vendor/github.com/go-logr/logr/context_slog.go+83 vendor/github.com/go-logr/logr/discard.go+24 vendor/github.com/go-logr/logr/funcr/funcr.go+914 vendor/github.com/go-logr/logr/funcr/slogsink.go+105 vendor/github.com/go-logr/logr/logr.go+520 vendor/github.com/go-logr/logr/sloghandler.go+192 vendor/github.com/go-logr/logr/slogr.go+100 vendor/github.com/go-logr/logr/slogsink.go+120 vendor/github.com/go-logr/stdr/LICENSE+201 vendor/github.com/go-logr/stdr/README.md+6 vendor/github.com/go-logr/stdr/stdr.go+170 vendor/github.com/go-ole/go-ole/.travis.yml+8 vendor/github.com/go-ole/go-ole/ChangeLog.md+49 vendor/github.com/go-ole/go-ole/LICENSE+21 vendor/github.com/go-ole/go-ole/README.md+46 vendor/github.com/go-ole/go-ole/SECURITY.md+13 vendor/github.com/go-ole/go-ole/appveyor.yml+68 vendor/github.com/go-ole/go-ole/com.go+386 vendor/github.com/go-ole/go-ole/com_func.go+174 vendor/github.com/go-ole/go-ole/connect.go+192 vendor/github.com/go-ole/go-ole/constants.go+153 vendor/github.com/go-ole/go-ole/error.go+51 vendor/github.com/go-ole/go-ole/error_func.go+8 vendor/github.com/go-ole/go-ole/error_windows.go+24 vendor/github.com/go-ole/go-ole/guid.go+284 vendor/github.com/go-ole/go-ole/iconnectionpoint.go+20 vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go+21 vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go+43 vendor/github.com/go-ole/go-ole/iconnectionpointcontainer.go+17 vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go+11 vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go+25 vendor/github.com/go-ole/go-ole/idispatch.go+94 vendor/github.com/go-ole/go-ole/idispatch_func.go+19 vendor/github.com/go-ole/go-ole/idispatch_windows.go+203 vendor/github.com/go-ole/go-ole/ienumvariant.go+19 vendor/github.com/go-ole/go-ole/ienumvariant_func.go+19 vendor/github.com/go-ole/go-ole/ienumvariant_windows.go+63 vendor/github.com/go-ole/go-ole/iinspectable.go+18 vendor/github.com/go-ole/go-ole/iinspectable_func.go+15 vendor/github.com/go-ole/go-ole/iinspectable_windows.go+72 vendor/github.com/go-ole/go-ole/iprovideclassinfo.go+21 vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go+7 vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go+21 vendor/github.com/go-ole/go-ole/itypeinfo.go+34 vendor/github.com/go-ole/go-ole/itypeinfo_func.go+7 vendor/github.com/go-ole/go-ole/itypeinfo_windows.go+21 vendor/github.com/go-ole/go-ole/iunknown.go+57 vendor/github.com/go-ole/go-ole/iunknown_func.go+19 vendor/github.com/go-ole/go-ole/iunknown_windows.go+58 vendor/github.com/go-ole/go-ole/ole.go+190 vendor/github.com/go-ole/go-ole/safearray.go+27 vendor/github.com/go-ole/go-ole/safearray_func.go+211 vendor/github.com/go-ole/go-ole/safearray_windows.go+337 vendor/github.com/go-ole/go-ole/safearrayconversion.go+140 vendor/github.com/go-ole/go-ole/safearrayslices.go+33 vendor/github.com/go-ole/go-ole/utility.go+101 vendor/github.com/go-ole/go-ole/variables.go+15 vendor/github.com/go-ole/go-ole/variant.go+105 vendor/github.com/go-ole/go-ole/variant_386.go+11 vendor/github.com/go-ole/go-ole/variant_amd64.go+12 vendor/github.com/go-ole/go-ole/variant_arm.go+11 vendor/github.com/go-ole/go-ole/variant_arm64.go+13 vendor/github.com/go-ole/go-ole/variant_date_386.go+22 vendor/github.com/go-ole/go-ole/variant_date_amd64.go+20 vendor/github.com/go-ole/go-ole/variant_date_arm.go+22 vendor/github.com/go-ole/go-ole/variant_date_arm64.go+23 vendor/github.com/go-ole/go-ole/variant_ppc64le.go+12 vendor/github.com/go-ole/go-ole/variant_s390x.go+12 vendor/github.com/go-ole/go-ole/vt_string.go+58 vendor/github.com/go-ole/go-ole/winrt.go+99 vendor/github.com/go-ole/go-ole/winrt_doc.go+36 vendor/github.com/go-openapi/jsonpointer/.editorconfig+26 vendor/github.com/go-openapi/jsonpointer/.gitignore+1 vendor/github.com/go-openapi/jsonpointer/.travis.yml+15 vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md+74 vendor/github.com/go-openapi/jsonpointer/LICENSE+202 vendor/github.com/go-openapi/jsonpointer/README.md+15 vendor/github.com/go-openapi/jsonpointer/pointer.go+390 vendor/github.com/go-openapi/jsonreference/.gitignore+1 vendor/github.com/go-openapi/jsonreference/.golangci.yml+41 vendor/github.com/go-openapi/jsonreference/.travis.yml+24 vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md+74 vendor/github.com/go-openapi/jsonreference/LICENSE+202 vendor/github.com/go-openapi/jsonreference/README.md+15 vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go+63 vendor/github.com/go-openapi/jsonreference/reference.go+158 vendor/github.com/go-openapi/spec/.editorconfig+26 vendor/github.com/go-openapi/spec/.gitignore+2 vendor/github.com/go-openapi/spec/.golangci.yml+42 vendor/github.com/go-openapi/spec/.travis.yml+31 vendor/github.com/go-openapi/spec/CODE_OF_CONDUCT.md+74 vendor/github.com/go-openapi/spec/LICENSE+202 vendor/github.com/go-openapi/spec/README.md+34 vendor/github.com/go-openapi/spec/bindata.go+297 vendor/github.com/go-openapi/spec/cache.go+98 vendor/github.com/go-openapi/spec/contact_info.go+57 vendor/github.com/go-openapi/spec/debug.go+49 vendor/github.com/go-openapi/spec/errors.go+19 vendor/github.com/go-openapi/spec/expander.go+594 vendor/github.com/go-openapi/spec/external_docs.go+24 vendor/github.com/go-openapi/spec/header.go+203 vendor/github.com/go-openapi/spec/info.go+165 vendor/github.com/go-openapi/spec/items.go+234 vendor/github.com/go-openapi/spec/license.go+56 vendor/github.com/go-openapi/spec/normalizer.go+203 vendor/github.com/go-openapi/spec/normalizer_nonwindows.go+43 vendor/github.com/go-openapi/spec/normalizer_windows.go+154 vendor/github.com/go-openapi/spec/operation.go+397 vendor/github.com/go-openapi/spec/parameter.go+326 vendor/github.com/go-openapi/spec/path_item.go+87 vendor/github.com/go-openapi/spec/paths.go+97 vendor/github.com/go-openapi/spec/properties.go+91 vendor/github.com/go-openapi/spec/ref.go+193 vendor/github.com/go-openapi/spec/resolver.go+127 vendor/github.com/go-openapi/spec/response.go+152 vendor/github.com/go-openapi/spec/responses.go+127 vendor/github.com/go-openapi/spec/schema.go+646 vendor/github.com/go-openapi/spec/schema_loader.go+338 vendor/github.com/go-openapi/spec/security_scheme.go+170 vendor/github.com/go-openapi/spec/spec.go+78 vendor/github.com/go-openapi/spec/swagger.go+448 vendor/github.com/go-openapi/spec/tag.go+75 vendor/github.com/go-openapi/spec/validations.go+215 vendor/github.com/go-openapi/spec/xml_object.go+68 vendor/github.com/go-openapi/swag/.editorconfig+26 vendor/github.com/go-openapi/swag/.gitignore+4 vendor/github.com/go-openapi/swag/.golangci.yml+41 vendor/github.com/go-openapi/swag/.travis.yml+37 vendor/github.com/go-openapi/swag/CODE_OF_CONDUCT.md+74 vendor/github.com/go-openapi/swag/LICENSE+202 vendor/github.com/go-openapi/swag/README.md+21 vendor/github.com/go-openapi/swag/convert.go+208 vendor/github.com/go-openapi/swag/convert_types.go+730 vendor/github.com/go-openapi/swag/doc.go+32 vendor/github.com/go-openapi/swag/json.go+312 vendor/github.com/go-openapi/swag/loading.go+120 vendor/github.com/go-openapi/swag/name_lexem.go+87 vendor/github.com/go-openapi/swag/net.go+38 vendor/github.com/go-openapi/swag/path.go+59 vendor/github.com/go-openapi/swag/post_go18.go+23 vendor/github.com/go-openapi/swag/post_go19.go+67 vendor/github.com/go-openapi/swag/pre_go18.go+23 vendor/github.com/go-openapi/swag/pre_go19.go+69 vendor/github.com/go-openapi/swag/split.go+262 vendor/github.com/go-openapi/swag/util.go+385 vendor/github.com/go-openapi/swag/yaml.go+246 vendor/github.com/go-viper/mapstructure/v2/.editorconfig+24 vendor/github.com/go-viper/mapstructure/v2/.envrc+7 vendor/github.com/go-viper/mapstructure/v2/.gitignore+10 vendor/github.com/go-viper/mapstructure/v2/.golangci.yaml+48 vendor/github.com/go-viper/mapstructure/v2/CHANGELOG.md+104 vendor/github.com/go-viper/mapstructure/v2/LICENSE+21 vendor/github.com/go-viper/mapstructure/v2/README.md+81 vendor/github.com/go-viper/mapstructure/v2/decode_hooks.go+714 vendor/github.com/go-viper/mapstructure/v2/devenv.lock+103 vendor/github.com/go-viper/mapstructure/v2/devenv.nix+14 vendor/github.com/go-viper/mapstructure/v2/devenv.yaml+4 vendor/github.com/go-viper/mapstructure/v2/errors.go+244 vendor/github.com/go-viper/mapstructure/v2/internal/errors/errors.go+11 vendor/github.com/go-viper/mapstructure/v2/internal/errors/join.go+9 vendor/github.com/go-viper/mapstructure/v2/internal/errors/join_go1_19.go+61 vendor/github.com/go-viper/mapstructure/v2/mapstructure.go+1948 vendor/github.com/go-viper/mapstructure/v2/reflect_go1_19.go+44 vendor/github.com/go-viper/mapstructure/v2/reflect_go1_20.go+10 vendor/github.com/goccy/go-json/.codecov.yml+32 vendor/github.com/goccy/go-json/.gitignore+2 vendor/github.com/goccy/go-json/.golangci.yml+86 vendor/github.com/goccy/go-json/CHANGELOG.md+425 vendor/github.com/goccy/go-json/LICENSE+21 vendor/github.com/goccy/go-json/Makefile+39 vendor/github.com/goccy/go-json/README.md+529 vendor/github.com/goccy/go-json/color.go+68 vendor/github.com/goccy/go-json/decode.go+263 vendor/github.com/goccy/go-json/docker-compose.yml+13 vendor/github.com/goccy/go-json/encode.go+326 vendor/github.com/goccy/go-json/error.go+41 vendor/github.com/goccy/go-json/internal/decoder/anonymous_field.go+41 vendor/github.com/goccy/go-json/internal/decoder/array.go+176 vendor/github.com/goccy/go-json/internal/decoder/assign.go+438 vendor/github.com/goccy/go-json/internal/decoder/bool.go+83 vendor/github.com/goccy/go-json/internal/decoder/bytes.go+118 vendor/github.com/goccy/go-json/internal/decoder/compile.go+493 vendor/github.com/goccy/go-json/internal/decoder/compile_norace.go+30 vendor/github.com/goccy/go-json/internal/decoder/compile_race.go+38 vendor/github.com/goccy/go-json/internal/decoder/context.go+254 vendor/github.com/goccy/go-json/internal/decoder/float.go+170 vendor/github.com/goccy/go-json/internal/decoder/func.go+146 vendor/github.com/goccy/go-json/internal/decoder/int.go+246 vendor/github.com/goccy/go-json/internal/decoder/interface.go+528 vendor/github.com/goccy/go-json/internal/decoder/invalid.go+55 vendor/github.com/goccy/go-json/internal/decoder/map.go+280 vendor/github.com/goccy/go-json/internal/decoder/number.go+123 vendor/github.com/goccy/go-json/internal/decoder/option.go+17 vendor/github.com/goccy/go-json/internal/decoder/path.go+670 vendor/github.com/goccy/go-json/internal/decoder/ptr.go+97 vendor/github.com/goccy/go-json/internal/decoder/slice.go+380 vendor/github.com/goccy/go-json/internal/decoder/stream.go+556 vendor/github.com/goccy/go-json/internal/decoder/string.go+452 vendor/github.com/goccy/go-json/internal/decoder/struct.go+845 vendor/github.com/goccy/go-json/internal/decoder/type.go+30 vendor/github.com/goccy/go-json/internal/decoder/uint.go+194 vendor/github.com/goccy/go-json/internal/decoder/unmarshal_json.go+104 vendor/github.com/goccy/go-json/internal/decoder/unmarshal_text.go+285 vendor/github.com/goccy/go-json/internal/decoder/wrapped_string.go+73 vendor/github.com/goccy/go-json/internal/encoder/code.go+1023 vendor/github.com/goccy/go-json/internal/encoder/compact.go+286 vendor/github.com/goccy/go-json/internal/encoder/compiler.go+939 vendor/github.com/goccy/go-json/internal/encoder/compiler_norace.go+33 vendor/github.com/goccy/go-json/internal/encoder/compiler_race.go+46 vendor/github.com/goccy/go-json/internal/encoder/context.go+105 vendor/github.com/goccy/go-json/internal/encoder/decode_rune.go+126 vendor/github.com/goccy/go-json/internal/encoder/encoder.go+601 vendor/github.com/goccy/go-json/internal/encoder/indent.go+211 vendor/github.com/goccy/go-json/internal/encoder/int.go+176 vendor/github.com/goccy/go-json/internal/encoder/map112.go+9 vendor/github.com/goccy/go-json/internal/encoder/map113.go+9 vendor/github.com/goccy/go-json/internal/encoder/opcode.go+752 vendor/github.com/goccy/go-json/internal/encoder/option.go+48 vendor/github.com/goccy/go-json/internal/encoder/optype.go+932 vendor/github.com/goccy/go-json/internal/encoder/query.go+135 vendor/github.com/goccy/go-json/internal/encoder/string.go+483 vendor/github.com/goccy/go-json/internal/encoder/string_table.go+415 vendor/github.com/goccy/go-json/internal/encoder/vm/debug_vm.go+41 vendor/github.com/goccy/go-json/internal/encoder/vm/hack.go+9 vendor/github.com/goccy/go-json/internal/encoder/vm/util.go+207 vendor/github.com/goccy/go-json/internal/encoder/vm/vm.go+4859 vendor/github.com/goccy/go-json/internal/encoder/vm_color/debug_vm.go+35 vendor/github.com/goccy/go-json/internal/encoder/vm_color/hack.go+9 vendor/github.com/goccy/go-json/internal/encoder/vm_color/util.go+274 vendor/github.com/goccy/go-json/internal/encoder/vm_color/vm.go+4859 vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/debug_vm.go+35 vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/util.go+297 vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/vm.go+4859 vendor/github.com/goccy/go-json/internal/encoder/vm_indent/debug_vm.go+35 vendor/github.com/goccy/go-json/internal/encoder/vm_indent/hack.go+9 vendor/github.com/goccy/go-json/internal/encoder/vm_indent/util.go+230 vendor/github.com/goccy/go-json/internal/encoder/vm_indent/vm.go+4859 vendor/github.com/goccy/go-json/internal/errors/error.go+183 vendor/github.com/goccy/go-json/internal/runtime/rtype.go+262 vendor/github.com/goccy/go-json/internal/runtime/struct_field.go+91 vendor/github.com/goccy/go-json/internal/runtime/type.go+98 vendor/github.com/goccy/go-json/json.go+368 vendor/github.com/goccy/go-json/option.go+79 vendor/github.com/goccy/go-json/path.go+84 vendor/github.com/goccy/go-json/query.go+47 vendor/github.com/goccy/go-yaml/.codecov.yml+31 vendor/github.com/goccy/go-yaml/.gitignore+3 vendor/github.com/goccy/go-yaml/.golangci.yml+65 vendor/github.com/goccy/go-yaml/CHANGELOG.md+186 vendor/github.com/goccy/go-yaml/LICENSE+21 vendor/github.com/goccy/go-yaml/Makefile+55 vendor/github.com/goccy/go-yaml/README.md+420 vendor/github.com/goccy/go-yaml/ast/ast.go+2381 vendor/github.com/goccy/go-yaml/context.go+37 vendor/github.com/goccy/go-yaml/decode.go+2037 vendor/github.com/goccy/go-yaml/encode.go+1074 vendor/github.com/goccy/go-yaml/error.go+77 vendor/github.com/goccy/go-yaml/internal/errors/error.go+246 vendor/github.com/goccy/go-yaml/internal/format/format.go+541 vendor/github.com/goccy/go-yaml/lexer/lexer.go+23 vendor/github.com/goccy/go-yaml/option.go+352 vendor/github.com/goccy/go-yaml/parser/color.go+28 vendor/github.com/goccy/go-yaml/parser/context.go+187 vendor/github.com/goccy/go-yaml/parser/node.go+257 vendor/github.com/goccy/go-yaml/parser/option.go+12 vendor/github.com/goccy/go-yaml/parser/parser.go+1330 vendor/github.com/goccy/go-yaml/parser/token.go+746 vendor/github.com/goccy/go-yaml/path.go+835 vendor/github.com/goccy/go-yaml/printer/color.go+83 vendor/github.com/goccy/go-yaml/printer/printer.go+353 vendor/github.com/goccy/go-yaml/scanner/context.go+452 vendor/github.com/goccy/go-yaml/scanner/error.go+17 vendor/github.com/goccy/go-yaml/scanner/scanner.go+1536 vendor/github.com/goccy/go-yaml/stdlib_quote.go+113 vendor/github.com/goccy/go-yaml/struct.go+128 vendor/github.com/goccy/go-yaml/token/token.go+1177 vendor/github.com/goccy/go-yaml/validate.go+13 vendor/github.com/goccy/go-yaml/yaml.go+357 vendor/github.com/godbus/dbus/v5/.cirrus.yml+11 vendor/github.com/godbus/dbus/v5/.golangci.yml+13 vendor/github.com/godbus/dbus/v5/CONTRIBUTING.md+50 vendor/github.com/godbus/dbus/v5/LICENSE+25 vendor/github.com/godbus/dbus/v5/MAINTAINERS+3 vendor/github.com/godbus/dbus/v5/README.md+47 vendor/github.com/godbus/dbus/v5/SECURITY.md+13 vendor/github.com/godbus/dbus/v5/auth.go+257 vendor/github.com/godbus/dbus/v5/auth_anonymous.go+16 vendor/github.com/godbus/dbus/v5/auth_default_other.go+7 vendor/github.com/godbus/dbus/v5/auth_default_windows.go+5 vendor/github.com/godbus/dbus/v5/auth_external.go+26 vendor/github.com/godbus/dbus/v5/auth_sha1_windows.go+109 vendor/github.com/godbus/dbus/v5/call.go+66 vendor/github.com/godbus/dbus/v5/conn.go+1009 vendor/github.com/godbus/dbus/v5/conn_darwin.go+36 vendor/github.com/godbus/dbus/v5/conn_other.go+83 vendor/github.com/godbus/dbus/v5/conn_unix.go+40 vendor/github.com/godbus/dbus/v5/conn_windows.go+13 vendor/github.com/godbus/dbus/v5/dbus.go+427 vendor/github.com/godbus/dbus/v5/decoder.go+376 vendor/github.com/godbus/dbus/v5/default_handler.go+338 vendor/github.com/godbus/dbus/v5/doc.go+70 vendor/github.com/godbus/dbus/v5/encoder.go+235 vendor/github.com/godbus/dbus/v5/escape.go+84 vendor/github.com/godbus/dbus/v5/export.go+484 vendor/github.com/godbus/dbus/v5/match.go+89 vendor/github.com/godbus/dbus/v5/message.go+393 vendor/github.com/godbus/dbus/v5/object.go+181 vendor/github.com/godbus/dbus/v5/sequence.go+24 vendor/github.com/godbus/dbus/v5/sequential_handler.go+125 vendor/github.com/godbus/dbus/v5/server_interfaces.go+107 vendor/github.com/godbus/dbus/v5/sig.go+298 vendor/github.com/godbus/dbus/v5/transport_darwin.go+6 vendor/github.com/godbus/dbus/v5/transport_generic.go+52 vendor/github.com/godbus/dbus/v5/transport_nonce_tcp.go+41 vendor/github.com/godbus/dbus/v5/transport_tcp.go+41 vendor/github.com/godbus/dbus/v5/transport_unix.go+291 vendor/github.com/godbus/dbus/v5/transport_unixcred_dragonfly.go+95 vendor/github.com/godbus/dbus/v5/transport_unixcred_freebsd.go+94 vendor/github.com/godbus/dbus/v5/transport_unixcred_linux.go+25 vendor/github.com/godbus/dbus/v5/transport_unixcred_netbsd.go+14 vendor/github.com/godbus/dbus/v5/transport_unixcred_openbsd.go+14 vendor/github.com/godbus/dbus/v5/transport_zos.go+6 vendor/github.com/godbus/dbus/v5/variant.go+169 vendor/github.com/godbus/dbus/v5/variant_lexer.go+284 vendor/github.com/godbus/dbus/v5/variant_parser.go+815 vendor/github.com/golang/freetype/AUTHORS+20 vendor/github.com/golang/freetype/CONTRIBUTORS+38 vendor/github.com/golang/freetype/LICENSE+12 vendor/github.com/golang/freetype/raster/geom.go+245 vendor/github.com/golang/freetype/raster/paint.go+287 vendor/github.com/golang/freetype/raster/raster.go+601 vendor/github.com/golang/freetype/raster/stroke.go+483 vendor/github.com/golang/freetype/truetype/face.go+507 vendor/github.com/golang/freetype/truetype/glyph.go+522 vendor/github.com/golang/freetype/truetype/hint.go+1770 vendor/github.com/golang/freetype/truetype/opcodes.go+289 vendor/github.com/golang/freetype/truetype/truetype.go+653 vendor/github.com/google/go-cmp/LICENSE+27 vendor/github.com/google/go-cmp/cmp/compare.go+671 vendor/github.com/google/go-cmp/cmp/export.go+31 vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go+18 vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go+123 vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go+402 vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go+9 vendor/github.com/google/go-cmp/cmp/internal/function/func.go+106 vendor/github.com/google/go-cmp/cmp/internal/value/name.go+164 vendor/github.com/google/go-cmp/cmp/internal/value/pointer.go+34 vendor/github.com/google/go-cmp/cmp/internal/value/sort.go+106 vendor/github.com/google/go-cmp/cmp/options.go+562 vendor/github.com/google/go-cmp/cmp/path.go+390 vendor/github.com/google/go-cmp/cmp/report.go+54 vendor/github.com/google/go-cmp/cmp/report_compare.go+433 vendor/github.com/google/go-cmp/cmp/report_references.go+264 vendor/github.com/google/go-cmp/cmp/report_reflect.go+414 vendor/github.com/google/go-cmp/cmp/report_slices.go+614 vendor/github.com/google/go-cmp/cmp/report_text.go+432 vendor/github.com/google/go-cmp/cmp/report_value.go+121 vendor/github.com/google/jsonschema-go/LICENSE+21 vendor/github.com/google/jsonschema-go/jsonschema/annotations.go+76 vendor/github.com/google/jsonschema-go/jsonschema/doc.go+115 vendor/github.com/google/jsonschema-go/jsonschema/infer.go+399 vendor/github.com/google/jsonschema-go/jsonschema/json_pointer.go+160 vendor/github.com/google/jsonschema-go/jsonschema/resolve.go+589 vendor/github.com/google/jsonschema-go/jsonschema/schema.go+642 vendor/github.com/google/jsonschema-go/jsonschema/util.go+463 vendor/github.com/google/jsonschema-go/jsonschema/validate.go+906 vendor/github.com/google/s2a-go/.gitignore+6 vendor/github.com/google/s2a-go/CODE_OF_CONDUCT.md+93 vendor/github.com/google/s2a-go/CONTRIBUTING.md+29 vendor/github.com/google/s2a-go/LICENSE.md+202 vendor/github.com/google/s2a-go/README.md+14 vendor/github.com/google/s2a-go/fallback/s2a_fallback.go+167 vendor/github.com/google/s2a-go/internal/authinfo/authinfo.go+119 vendor/github.com/google/s2a-go/internal/handshaker/handshaker.go+438 vendor/github.com/google/s2a-go/internal/handshaker/service/service.go+66 vendor/github.com/google/s2a-go/internal/proto/common_go_proto/common.pb.go+388 vendor/github.com/google/s2a-go/internal/proto/s2a_context_go_proto/s2a_context.pb.go+267 vendor/github.com/google/s2a-go/internal/proto/s2a_go_proto/s2a.pb.go+1377 vendor/github.com/google/s2a-go/internal/proto/s2a_go_proto/s2a_grpc.pb.go+174 vendor/github.com/google/s2a-go/internal/proto/v2/common_go_proto/common.pb.go+549 vendor/github.com/google/s2a-go/internal/proto/v2/s2a_context_go_proto/s2a_context.pb.go+249 vendor/github.com/google/s2a-go/internal/proto/v2/s2a_go_proto/s2a.pb.go+2518 vendor/github.com/google/s2a-go/internal/proto/v2/s2a_go_proto/s2a_grpc.pb.go+160 vendor/github.com/google/s2a-go/internal/record/internal/aeadcrypter/aeadcrypter.go+34 vendor/github.com/google/s2a-go/internal/record/internal/aeadcrypter/aesgcm.go+70 vendor/github.com/google/s2a-go/internal/record/internal/aeadcrypter/chachapoly.go+67 vendor/github.com/google/s2a-go/internal/record/internal/aeadcrypter/common.go+92 vendor/github.com/google/s2a-go/internal/record/internal/halfconn/ciphersuite.go+98 vendor/github.com/google/s2a-go/internal/record/internal/halfconn/counter.go+60 vendor/github.com/google/s2a-go/internal/record/internal/halfconn/expander.go+59 vendor/github.com/google/s2a-go/internal/record/internal/halfconn/halfconn.go+193 vendor/github.com/google/s2a-go/internal/record/record.go+729 vendor/github.com/google/s2a-go/internal/record/ticketsender.go+178 vendor/github.com/google/s2a-go/internal/tokenmanager/tokenmanager.go+79 vendor/github.com/google/s2a-go/internal/v2/README.md+1 vendor/github.com/google/s2a-go/internal/v2/certverifier/certverifier.go+122 vendor/github.com/google/s2a-go/internal/v2/remotesigner/remotesigner.go+186 vendor/github.com/google/s2a-go/internal/v2/s2av2.go+380 vendor/github.com/google/s2a-go/internal/v2/tlsconfigstore/tlsconfigstore.go+403 vendor/github.com/google/s2a-go/retry/retry.go+144 vendor/github.com/google/s2a-go/s2a.go+448 vendor/github.com/google/s2a-go/s2a_options.go+272 vendor/github.com/google/s2a-go/s2a_utils.go+79 vendor/github.com/google/s2a-go/stream/s2a_stream.go+39 vendor/github.com/google/uuid/CHANGELOG.md+41 vendor/github.com/google/uuid/CONTRIBUTING.md+26 vendor/github.com/google/uuid/CONTRIBUTORS+9 vendor/github.com/google/uuid/LICENSE+27 vendor/github.com/google/uuid/README.md+21 vendor/github.com/google/uuid/dce.go+80 vendor/github.com/google/uuid/doc.go+12 vendor/github.com/google/uuid/hash.go+59 vendor/github.com/google/uuid/marshal.go+38 vendor/github.com/google/uuid/node.go+90 vendor/github.com/google/uuid/node_js.go+12 vendor/github.com/google/uuid/node_net.go+33 vendor/github.com/google/uuid/null.go+118 vendor/github.com/google/uuid/sql.go+59 vendor/github.com/google/uuid/time.go+134 vendor/github.com/google/uuid/util.go+43 vendor/github.com/google/uuid/uuid.go+365 vendor/github.com/google/uuid/version1.go+44 vendor/github.com/google/uuid/version4.go+76 vendor/github.com/google/uuid/version6.go+56 vendor/github.com/google/uuid/version7.go+104 vendor/github.com/googleapis/enterprise-certificate-proxy/LICENSE+202 vendor/github.com/googleapis/enterprise-certificate-proxy/client/client.go+219 vendor/github.com/googleapis/enterprise-certificate-proxy/client/util/util.go+100 vendor/github.com/googleapis/gax-go/v2/.release-please-manifest.json+3 vendor/github.com/googleapis/gax-go/v2/CHANGES.md+231 vendor/github.com/googleapis/gax-go/v2/LICENSE+27 vendor/github.com/googleapis/gax-go/v2/apierror/apierror.go+413 vendor/github.com/googleapis/gax-go/v2/apierror/internal/proto/README.md+30 vendor/github.com/googleapis/gax-go/v2/apierror/internal/proto/custom_error.pb.go+226 vendor/github.com/googleapis/gax-go/v2/apierror/internal/proto/custom_error.proto+50 vendor/github.com/googleapis/gax-go/v2/apierror/internal/proto/error.pb.go+232 vendor/github.com/googleapis/gax-go/v2/apierror/internal/proto/error.proto+46 vendor/github.com/googleapis/gax-go/v2/call_option.go+288 vendor/github.com/googleapis/gax-go/v2/callctx/callctx.go+146 vendor/github.com/googleapis/gax-go/v2/content_type.go+112 vendor/github.com/googleapis/gax-go/v2/feature.go+81 vendor/github.com/googleapis/gax-go/v2/gax.go+41 vendor/github.com/googleapis/gax-go/v2/header.go+200 vendor/github.com/googleapis/gax-go/v2/internal/version.go+20 vendor/github.com/googleapis/gax-go/v2/internallog/internal/internal.go+134 vendor/github.com/googleapis/gax-go/v2/internallog/internallog.go+154 vendor/github.com/googleapis/gax-go/v2/invoke.go+141 vendor/github.com/googleapis/gax-go/v2/proto_json_stream.go+127 vendor/github.com/googleapis/gax-go/v2/release-please-config.json+10 vendor/github.com/googleapis/gax-go/v2/telemetry.go+469 vendor/github.com/gorilla/css/LICENSE+28 vendor/github.com/gorilla/css/scanner/doc.go+33 vendor/github.com/gorilla/css/scanner/scanner.go+360 vendor/github.com/gorilla/websocket/.gitignore+25 vendor/github.com/gorilla/websocket/AUTHORS+9 vendor/github.com/gorilla/websocket/LICENSE+22 vendor/github.com/gorilla/websocket/README.md+33 vendor/github.com/gorilla/websocket/client.go+434 vendor/github.com/gorilla/websocket/compression.go+148 vendor/github.com/gorilla/websocket/conn.go+1238 vendor/github.com/gorilla/websocket/doc.go+227 vendor/github.com/gorilla/websocket/join.go+42 vendor/github.com/gorilla/websocket/json.go+60 vendor/github.com/gorilla/websocket/mask.go+55 vendor/github.com/gorilla/websocket/mask_safe.go+16 vendor/github.com/gorilla/websocket/prepared.go+102 vendor/github.com/gorilla/websocket/proxy.go+77 vendor/github.com/gorilla/websocket/server.go+365 vendor/github.com/gorilla/websocket/tls_handshake.go+21 vendor/github.com/gorilla/websocket/tls_handshake_116.go+21 vendor/github.com/gorilla/websocket/util.go+298 vendor/github.com/gorilla/websocket/x_net_proxy.go+473 vendor/github.com/hashicorp/golang-lru/v2/.gitignore+23 vendor/github.com/hashicorp/golang-lru/v2/.golangci.yml+46 vendor/github.com/hashicorp/golang-lru/v2/2q.go+267 vendor/github.com/hashicorp/golang-lru/v2/LICENSE+364 vendor/github.com/hashicorp/golang-lru/v2/README.md+79 vendor/github.com/hashicorp/golang-lru/v2/doc.go+24 vendor/github.com/hashicorp/golang-lru/v2/internal/list.go+142 vendor/github.com/hashicorp/golang-lru/v2/lru.go+250 vendor/github.com/hashicorp/golang-lru/v2/simplelru/LICENSE_list+29 vendor/github.com/hashicorp/golang-lru/v2/simplelru/lru.go+177 vendor/github.com/hashicorp/golang-lru/v2/simplelru/lru_interface.go+46 vendor/github.com/inconshreveable/mousetrap/LICENSE+201 vendor/github.com/inconshreveable/mousetrap/README.md+23 vendor/github.com/inconshreveable/mousetrap/trap_others.go+16 vendor/github.com/inconshreveable/mousetrap/trap_windows.go+42 vendor/github.com/invopop/jsonschema/.gitignore+2 vendor/github.com/invopop/jsonschema/.golangci.yml+80 vendor/github.com/invopop/jsonschema/COPYING+19 vendor/github.com/invopop/jsonschema/README.md+374 vendor/github.com/invopop/jsonschema/id.go+76 vendor/github.com/invopop/jsonschema/reflect.go+1178 vendor/github.com/invopop/jsonschema/reflect_comments.go+160 vendor/github.com/invopop/jsonschema/schema.go+94 vendor/github.com/invopop/jsonschema/utils.go+26 vendor/github.com/itchyny/gojq/.dockerignore+16 vendor/github.com/itchyny/gojq/.gitattributes+3 vendor/github.com/itchyny/gojq/.gitignore+7 vendor/github.com/itchyny/gojq/CHANGELOG.md+418 vendor/github.com/itchyny/gojq/Dockerfile+14 vendor/github.com/itchyny/gojq/LICENSE+21 vendor/github.com/itchyny/gojq/Makefile+102 vendor/github.com/itchyny/gojq/README.md+164 vendor/github.com/itchyny/gojq/_gojq+43 vendor/github.com/itchyny/gojq/builtin.go+73 vendor/github.com/itchyny/gojq/builtin.jq+188 vendor/github.com/itchyny/gojq/code.go+108 vendor/github.com/itchyny/gojq/compare.go+76 vendor/github.com/itchyny/gojq/compiler.go+1715 vendor/github.com/itchyny/gojq/debug.go+208 vendor/github.com/itchyny/gojq/encoder.go+192 vendor/github.com/itchyny/gojq/env.go+49 vendor/github.com/itchyny/gojq/error.go+383 vendor/github.com/itchyny/gojq/execute.go+443 vendor/github.com/itchyny/gojq/func.go+2190 vendor/github.com/itchyny/gojq/go.dev.mod+8 vendor/github.com/itchyny/gojq/go.dev.sum+4 vendor/github.com/itchyny/gojq/gojq.go+5 vendor/github.com/itchyny/gojq/iter.go+49 vendor/github.com/itchyny/gojq/lexer.go+578 vendor/github.com/itchyny/gojq/module_loader.go+184 vendor/github.com/itchyny/gojq/operator.go+557 vendor/github.com/itchyny/gojq/option.go+96 vendor/github.com/itchyny/gojq/parser.go+1506 vendor/github.com/itchyny/gojq/parser.go.y+669 vendor/github.com/itchyny/gojq/preview.go+77 vendor/github.com/itchyny/gojq/query.go+942 vendor/github.com/itchyny/gojq/release.go+15 vendor/github.com/itchyny/gojq/scope_stack.go+48 vendor/github.com/itchyny/gojq/stack.go+52 vendor/github.com/itchyny/gojq/term_type.go+77 vendor/github.com/itchyny/gojq/type.go+31 vendor/github.com/itchyny/timefmt-go/CHANGELOG.md+37 vendor/github.com/itchyny/timefmt-go/LICENSE+21 vendor/github.com/itchyny/timefmt-go/Makefile+20 vendor/github.com/itchyny/timefmt-go/README.md+69 vendor/github.com/itchyny/timefmt-go/format.go+462 vendor/github.com/itchyny/timefmt-go/parse.go+474 vendor/github.com/itchyny/timefmt-go/timefmt.go+2 vendor/github.com/jackmordaunt/icns/v3/.gitignore+3 vendor/github.com/jackmordaunt/icns/v3/.goreleaser.yml+38 vendor/github.com/jackmordaunt/icns/v3/LICENSE+21 vendor/github.com/jackmordaunt/icns/v3/doc.go+20 vendor/github.com/jackmordaunt/icns/v3/error.go+18

4326 more files changed are not listed.

flake.nix+1−1
@@ -22,7 +22,7 @@
2222
2323 src = ./.;
2424
25− vendorHash = "sha256-4gHvyEqiFhEvZ90lJbXeI/1fMMo6L19P/PD5Eu5YUmI=";
25+ vendorHash = null;
2626
2727 # Match the Go toolchain used in the dev shell.
2828 go = pkgs.go_1_26;
internal/agent/tools/download.go+3−3
@@ -67,7 +67,7 @@ func NewDownloadTool(permissions permission.Service, workingDir string, client *
6767 downloadDescription(),
6868 func(ctx context.Context, params DownloadParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
6969 if params.URL == "" {
70− return fantasy.NewTextErrorResponse("URL parameter is required"), nil
70+ return fantasy.NewTextErrorResponse("url parameter is required"), nil
7171 }
7272
7373 if params.FilePath == "" {
@@ -75,7 +75,7 @@ func NewDownloadTool(permissions permission.Service, workingDir string, client *
7575 }
7676
7777 if !strings.HasPrefix(params.URL, "http://") && !strings.HasPrefix(params.URL, "https://") {
78− return fantasy.NewTextErrorResponse("URL must start with http:// or https://"), nil
78+ return fantasy.NewTextErrorResponse("url must start with http:// or https://"), nil
7979 }
8080
8181 filePath := filepathext.SmartJoin(workingDir, params.FilePath)
@@ -131,7 +131,7 @@ func NewDownloadTool(permissions permission.Service, workingDir string, client *
131131 defer resp.Body.Close()
132132
133133 if resp.StatusCode != http.StatusOK {
134− return fantasy.NewTextErrorResponse(fmt.Sprintf("Request failed with status code: %d", resp.StatusCode)), nil
134+ return fantasy.NewTextErrorResponse(fmt.Sprintf("request failed with status code: %d", resp.StatusCode)), nil
135135 }
136136
137137 // Create parent directories if they don't exist
internal/agent/tools/edit.go+1−1
@@ -352,7 +352,7 @@ func replaceContent(edit editContext, filePath, oldString, newString string, rep
352352
353353 sessionID := GetSessionFromContext(edit.ctx)
354354 if sessionID == "" {
355− return fantasy.ToolResponse{}, fmt.Errorf("session ID is required for edit a file")
355+ return fantasy.ToolResponse{}, fmt.Errorf("session ID is required for editing a file")
356356 }
357357
358358 lastRead := edit.filetracker.LastReadTime(edit.ctx, sessionID, filePath)
internal/agent/tools/fetch.go+12−12
@@ -60,21 +60,21 @@ func NewFetchTool(permissions permission.Service, workingDir string, client *htt
6060 fetchDescription(),
6161 func(ctx context.Context, params FetchParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
6262 if params.URL == "" {
63− return fantasy.NewTextErrorResponse("URL parameter is required"), nil
63+ return fantasy.NewTextErrorResponse("url parameter is required"), nil
6464 }
6565
6666 format := strings.ToLower(params.Format)
6767 if format != "text" && format != "markdown" && format != "html" {
68− return fantasy.NewTextErrorResponse("Format must be one of: text, markdown, html"), nil
68+ return fantasy.NewTextErrorResponse("format must be one of: text, markdown, html"), nil
6969 }
7070
7171 if !strings.HasPrefix(params.URL, "http://") && !strings.HasPrefix(params.URL, "https://") {
72− return fantasy.NewTextErrorResponse("URL must start with http:// or https://"), nil
72+ return fantasy.NewTextErrorResponse("url must start with http:// or https://"), nil
7373 }
7474
7575 sessionID := GetSessionFromContext(ctx)
7676 if sessionID == "" {
77− return fantasy.ToolResponse{}, fmt.Errorf("session ID is required for creating a new file")
77+ return fantasy.ToolResponse{}, fmt.Errorf("session ID is required for fetching content")
7878 }
7979
8080 p, err := permissions.Request(
@@ -124,19 +124,19 @@ func NewFetchTool(permissions permission.Service, workingDir string, client *htt
124124 defer resp.Body.Close()
125125
126126 if resp.StatusCode != http.StatusOK {
127− return fantasy.NewTextErrorResponse(fmt.Sprintf("Request failed with status code: %d", resp.StatusCode)), nil
127+ return fantasy.NewTextErrorResponse(fmt.Sprintf("request failed with status code: %d", resp.StatusCode)), nil
128128 }
129129
130130 body, err := io.ReadAll(io.LimitReader(resp.Body, MaxFetchSize))
131131 if err != nil {
132− return fantasy.NewTextErrorResponse("Failed to read response body: " + err.Error()), nil
132+ return fantasy.NewTextErrorResponse("failed to read response body: " + err.Error()), nil
133133 }
134134
135135 content := string(body)
136136
137137 validUTF8 := utf8.ValidString(content)
138138 if !validUTF8 {
139− return fantasy.NewTextErrorResponse("Response content is not valid UTF-8"), nil
139+ return fantasy.NewTextErrorResponse("response content is not valid UTF-8"), nil
140140 }
141141 contentType := resp.Header.Get("Content-Type")
142142
@@ -145,7 +145,7 @@ func NewFetchTool(permissions permission.Service, workingDir string, client *htt
145145 if strings.Contains(contentType, "text/html") {
146146 text, err := extractTextFromHTML(content)
147147 if err != nil {
148− return fantasy.NewTextErrorResponse("Failed to extract text from HTML: " + err.Error()), nil
148+ return fantasy.NewTextErrorResponse("failed to extract text from HTML: " + err.Error()), nil
149149 }
150150 content = text
151151 }
@@ -154,7 +154,7 @@ func NewFetchTool(permissions permission.Service, workingDir string, client *htt
154154 if strings.Contains(contentType, "text/html") {
155155 markdown, err := convertHTMLToMarkdown(content)
156156 if err != nil {
157− return fantasy.NewTextErrorResponse("Failed to convert HTML to Markdown: " + err.Error()), nil
157+ return fantasy.NewTextErrorResponse("failed to convert HTML to Markdown: " + err.Error()), nil
158158 }
159159 content = markdown
160160 }
@@ -166,14 +166,14 @@ func NewFetchTool(permissions permission.Service, workingDir string, client *htt
166166 if strings.Contains(contentType, "text/html") {
167167 doc, err := goquery.NewDocumentFromReader(strings.NewReader(content))
168168 if err != nil {
169− return fantasy.NewTextErrorResponse("Failed to parse HTML: " + err.Error()), nil
169+ return fantasy.NewTextErrorResponse("failed to parse HTML: " + err.Error()), nil
170170 }
171171 body, err := doc.Find("body").Html()
172172 if err != nil {
173− return fantasy.NewTextErrorResponse("Failed to extract body from HTML: " + err.Error()), nil
173+ return fantasy.NewTextErrorResponse("failed to extract body from HTML: " + err.Error()), nil
174174 }
175175 if body == "" {
176− return fantasy.NewTextErrorResponse("No body content found in HTML"), nil
176+ return fantasy.NewTextErrorResponse("no body content found in HTML"), nil
177177 }
178178 content = "<html>\n<body>\n" + body + "\n</body>\n</html>"
179179 }
internal/agent/tools/ls.go+1−1
@@ -163,7 +163,7 @@ func ListDirectoryTree(searchPath string, params LSParams, lsConfig config.ToolL
163163 output = fmt.Sprintf("There are more than %d files in the directory. Use a more specific path or use the Glob tool to find specific files. The first %[1]d files and directories are included below.\n", maxFiles)
164164 }
165165 if depth > 0 {
166− output = fmt.Sprintf("The directory tree is shown up to a depth of %d. Use a higher depth and a specific path to see more levels.\n", cmp.Or(params.Depth, depth))
166+ output += fmt.Sprintf("The directory tree is shown up to a depth of %d. Use a higher depth and a specific path to see more levels.\n", cmp.Or(params.Depth, depth))
167167 }
168168 return output + "\n" + printTree(tree, searchPath), metadata, nil
169169}
internal/agent/tools/mcp-tools.go+2−2
@@ -99,7 +99,7 @@ func (m *Tool) Info() fantasy.ToolInfo {
9999func (m *Tool) Run(ctx context.Context, params fantasy.ToolCall) (fantasy.ToolResponse, error) {
100100 sessionID := GetSessionFromContext(ctx)
101101 if sessionID == "" {
102− return fantasy.ToolResponse{}, fmt.Errorf("session ID is required for creating a new file")
102+ return fantasy.ToolResponse{}, fmt.Errorf("session ID is required for executing MCP tool")
103103 }
104104
105105 // Skip permission for whitelisted Docker MCP tools.
@@ -134,7 +134,7 @@ func (m *Tool) Run(ctx context.Context, params fantasy.ToolCall) (fantasy.ToolRe
134134 case "image", "media":
135135 if !GetSupportsImagesFromContext(ctx) {
136136 modelName := GetModelNameFromContext(ctx)
137− return fantasy.NewTextErrorResponse(fmt.Sprintf("This model (%s) does not support image data.", modelName)), nil
137+ return fantasy.NewTextErrorResponse(fmt.Sprintf("this model (%s) does not support image data.", modelName)), nil
138138 }
139139
140140 var response fantasy.ToolResponse
internal/agent/tools/sourcegraph.go+4−4
@@ -64,7 +64,7 @@ func NewSourcegraphTool(client *http.Client) fantasy.AgentTool {
6464 sourcegraphDescription(),
6565 func(ctx context.Context, params SourcegraphParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
6666 if params.Query == "" {
67− return fantasy.NewTextErrorResponse("Query parameter is required"), nil
67+ return fantasy.NewTextErrorResponse("query parameter is required"), nil
6868 }
6969
7070 if params.Count <= 0 {
@@ -129,10 +129,10 @@ func NewSourcegraphTool(client *http.Client) fantasy.AgentTool {
129129 if resp.StatusCode != http.StatusOK {
130130 body, _ := io.ReadAll(resp.Body)
131131 if len(body) > 0 {
132− return fantasy.NewTextErrorResponse(fmt.Sprintf("Request failed with status code: %d, response: %s", resp.StatusCode, string(body))), nil
132+ return fantasy.NewTextErrorResponse(fmt.Sprintf("request failed with status code: %d, response: %s", resp.StatusCode, string(body))), nil
133133 }
134134
135− return fantasy.NewTextErrorResponse(fmt.Sprintf("Request failed with status code: %d", resp.StatusCode)), nil
135+ return fantasy.NewTextErrorResponse(fmt.Sprintf("request failed with status code: %d", resp.StatusCode)), nil
136136 }
137137 body, err := io.ReadAll(resp.Body)
138138 if err != nil {
@@ -146,7 +146,7 @@ func NewSourcegraphTool(client *http.Client) fantasy.AgentTool {
146146
147147 formattedResults, err := formatSourcegraphResults(result, params.ContextWindow)
148148 if err != nil {
149− return fantasy.NewTextErrorResponse("Failed to format results: " + err.Error()), nil
149+ return fantasy.NewTextErrorResponse("failed to format results: " + err.Error()), nil
150150 }
151151
152152 return fantasy.NewTextResponse(formattedResults), nil
internal/agent/tools/view.go+9−9
@@ -177,19 +177,19 @@ func NewViewTool(
177177 }
178178
179179 if len(suggestions) > 0 {
180− return fantasy.NewTextErrorResponse(fmt.Sprintf("File not found: %s\n\nDid you mean one of these?\n%s",
180+ return fantasy.NewTextErrorResponse(fmt.Sprintf("file not found: %s\n\nDid you mean one of these?\n%s",
181181 filePath, strings.Join(suggestions, "\n"))), nil
182182 }
183183 }
184184
185− return fantasy.NewTextErrorResponse(fmt.Sprintf("File not found: %s", filePath)), nil
185+ return fantasy.NewTextErrorResponse(fmt.Sprintf("file not found: %s", filePath)), nil
186186 }
187187 return fantasy.ToolResponse{}, fmt.Errorf("error accessing file: %w", err)
188188 }
189189
190190 // Check if it's a directory
191191 if fileInfo.IsDir() {
192− return fantasy.NewTextErrorResponse(fmt.Sprintf("Path is a directory, not a file: %s", filePath)), nil
192+ return fantasy.NewTextErrorResponse(fmt.Sprintf("path is a directory, not a file: %s", filePath)), nil
193193 }
194194
195195 // Set default limit if not provided (no limit for SKILL.md files)
@@ -204,12 +204,12 @@ func NewViewTool(
204204 isSupportedImage, mimeType := getImageMimeType(filePath)
205205 if isSupportedImage {
206206 if fileInfo.Size() > MaxViewSize {
207− return fantasy.NewTextErrorResponse(fmt.Sprintf("Image file is too large (%d bytes). Maximum size is %d bytes",
207+ return fantasy.NewTextErrorResponse(fmt.Sprintf("image file is too large (%d bytes). Maximum size is %d bytes",
208208 fileInfo.Size(), MaxViewSize)), nil
209209 }
210210 if !GetSupportsImagesFromContext(ctx) {
211211 modelName := GetModelNameFromContext(ctx)
212− return fantasy.NewTextErrorResponse(fmt.Sprintf("This model (%s) does not support image data.", modelName)), nil
212+ return fantasy.NewTextErrorResponse(fmt.Sprintf("this model (%s) does not support image data.", modelName)), nil
213213 }
214214
215215 imageData, readErr := os.ReadFile(filePath)
@@ -237,13 +237,13 @@ func NewViewTool(
237237 if err != nil {
238238 var tooLarge contentTooLargeError
239239 if errors.As(err, &tooLarge) {
240− return fantasy.NewTextErrorResponse(fmt.Sprintf("Content section is too large (%d bytes). Maximum size is %d bytes",
240+ return fantasy.NewTextErrorResponse(fmt.Sprintf("content section is too large (%d bytes). Maximum size is %d bytes",
241241 tooLarge.Size, tooLarge.Max)), nil
242242 }
243243 return fantasy.ToolResponse{}, fmt.Errorf("error reading file: %w", err)
244244 }
245245 if !utf8.ValidString(content) {
246− return fantasy.NewTextErrorResponse("File content is not valid UTF-8"), nil
246+ return fantasy.NewTextErrorResponse("file content is not valid UTF-8"), nil
247247 }
248248
249249 openInLSPs(ctx, lspManager, filePath)
@@ -448,12 +448,12 @@ func readBuiltinFile(params ViewParams, skillTracker *skills.Tracker) (fantasy.T
448448
449449 data, err := fs.ReadFile(builtinFS, embeddedPath)
450450 if err != nil {
451− return fantasy.NewTextErrorResponse(fmt.Sprintf("Builtin file not found: %s", params.FilePath)), nil
451+ return fantasy.NewTextErrorResponse(fmt.Sprintf("builtin file not found: %s", params.FilePath)), nil
452452 }
453453
454454 content := string(data)
455455 if !utf8.ValidString(content) {
456− return fantasy.NewTextErrorResponse("File content is not valid UTF-8"), nil
456+ return fantasy.NewTextErrorResponse("file content is not valid UTF-8"), nil
457457 }
458458
459459 limit := params.Limit
internal/agent/tools/view_test.go+2−2
@@ -151,7 +151,7 @@ func TestViewToolBlocksOversizedReturnedSections(t *testing.T) {
151151 })
152152
153153 require.True(t, resp.IsError)
154− require.Contains(t, resp.Content, "Content section is too large")
154+ require.Contains(t, resp.Content, "content section is too large")
155155}
156156
157157func TestViewToolBlocksOversizedImages(t *testing.T) {
@@ -169,7 +169,7 @@ func TestViewToolBlocksOversizedImages(t *testing.T) {
169169 })
170170
171171 require.True(t, resp.IsError)
172− require.Contains(t, resp.Content, "Image file is too large")
172+ require.Contains(t, resp.Content, "image file is too large")
173173}
174174
175175func TestReadTextFileEnforcesMaxContentSize(t *testing.T) {
internal/agent/tools/web_fetch.go+4−4
@@ -45,7 +45,7 @@ func NewWebFetchTool(workingDir string, client *http.Client) fantasy.AgentTool {
4545
4646 content, err := FetchURLAndConvert(ctx, client, params.URL)
4747 if err != nil {
48− return fantasy.NewTextErrorResponse(fmt.Sprintf("Failed to fetch URL: %s", err)), nil
48+ return fantasy.NewTextErrorResponse(fmt.Sprintf("failed to fetch URL: %s", err)), nil
4949 }
5050
5151 hasLargeContent := len(content) > LargeContentThreshold
@@ -54,16 +54,16 @@ func NewWebFetchTool(workingDir string, client *http.Client) fantasy.AgentTool {
5454 if hasLargeContent {
5555 tempFile, err := os.CreateTemp(workingDir, "page-*.md")
5656 if err != nil {
57− return fantasy.NewTextErrorResponse(fmt.Sprintf("Failed to create temporary file: %s", err)), nil
57+ return fantasy.NewTextErrorResponse(fmt.Sprintf("failed to create temporary file: %s", err)), nil
5858 }
5959 tempFilePath := tempFile.Name()
6060
6161 if _, err := tempFile.WriteString(content); err != nil {
6262 _ = tempFile.Close() // Best effort close
63− return fantasy.NewTextErrorResponse(fmt.Sprintf("Failed to write content to file: %s", err)), nil
63+ return fantasy.NewTextErrorResponse(fmt.Sprintf("failed to write content to file: %s", err)), nil
6464 }
6565 if err := tempFile.Close(); err != nil {
66− return fantasy.NewTextErrorResponse(fmt.Sprintf("Failed to close temporary file: %s", err)), nil
66+ return fantasy.NewTextErrorResponse(fmt.Sprintf("failed to close temporary file: %s", err)), nil
6767 }
6868
6969 fmt.Fprintf(&result, "Fetched content from %s (large page)\n\n", params.URL)
internal/agent/tools/web_search.go+1−1
@@ -53,7 +53,7 @@ func NewWebSearchTool(client *http.Client) fantasy.AgentTool {
5353 results, err := searchDuckDuckGo(ctx, client, params.Query, maxResults)
5454 slog.Debug("Web search completed", "query", params.Query, "results", len(results), "err", err)
5555 if err != nil {
56− return fantasy.NewTextErrorResponse("Failed to search: " + err.Error()), nil
56+ return fantasy.NewTextErrorResponse("failed to search: " + err.Error()), nil
5757 }
5858
5959 return fantasy.NewTextResponse(formatSearchResults(results)), nil
internal/agent/tools/write.go+15−14
@@ -66,21 +66,25 @@ func NewWriteTool(
6666 filePath := filepathext.SmartJoin(workingDir, params.FilePath)
6767
6868 fileInfo, err := os.Stat(filePath)
69+ oldContent := ""
6970 if err == nil {
7071 if fileInfo.IsDir() {
71− return fantasy.NewTextErrorResponse(fmt.Sprintf("Path is a directory, not a file: %s", filePath)), nil
72+ return fantasy.NewTextErrorResponse(fmt.Sprintf("path is a directory, not a file: %s", filePath)), nil
7273 }
7374
7475 modTime := fileInfo.ModTime().Truncate(time.Second)
7576 lastRead := filetracker.LastReadTime(ctx, sessionID, filePath)
7677 if modTime.After(lastRead) {
77− return fantasy.NewTextErrorResponse(fmt.Sprintf("File %s has been modified since it was last read.\nLast modification: %s\nLast read: %s\n\nPlease read the file again before modifying it.",
78+ return fantasy.NewTextErrorResponse(fmt.Sprintf("file %s has been modified since it was last read.\nLast modification: %s\nLast read: %s\n\nPlease read the file again before modifying it.",
7879 filePath, modTime.Format(time.RFC3339), lastRead.Format(time.RFC3339))), nil
7980 }
8081
81− oldContent, readErr := os.ReadFile(filePath)
82− if readErr == nil && string(oldContent) == params.Content {
83− return fantasy.NewTextErrorResponse(fmt.Sprintf("File %s already contains the exact content. No changes made.", filePath)), nil
82+ oldBytes, readErr := os.ReadFile(filePath)
83+ if readErr == nil {
84+ oldContent = string(oldBytes)
85+ if oldContent == params.Content {
86+ return fantasy.NewTextErrorResponse(fmt.Sprintf("file %s already contains the exact content. No changes made.", filePath)), nil
87+ }
8488 }
8589 } else if !os.IsNotExist(err) {
8690 return fantasy.ToolResponse{}, fmt.Errorf("error checking file: %w", err)
@@ -91,20 +95,17 @@ func NewWriteTool(
9195 return fantasy.ToolResponse{}, fmt.Errorf("error creating directory: %w", err)
9296 }
9397
94− oldContent := ""
95− if fileInfo != nil && !fileInfo.IsDir() {
96− oldBytes, readErr := os.ReadFile(filePath)
97− if readErr == nil {
98− oldContent = string(oldBytes)
99− }
100− }
101−
10298 diff, additions, removals := diff.GenerateDiff(
10399 oldContent,
104100 params.Content,
105101 strings.TrimPrefix(filePath, workingDir),
106102 )
107103
104+ description := fmt.Sprintf("Create file %s", filePath)
105+ if fileInfo != nil && !fileInfo.IsDir() {
106+ description = fmt.Sprintf("Overwrite file %s", filePath)
107+ }
108+
108109 p, err := permissions.Request(
109110 ctx,
110111 permission.CreatePermissionRequest{
@@ -113,7 +114,7 @@ func NewWriteTool(
113114 ToolCallID: call.ID,
114115 ToolName: WriteToolName,
115116 Action: "write",
116− Description: fmt.Sprintf("Create file %s", filePath),
117+ Description: description,
117118 Params: WritePermissionsParams{
118119 FilePath: filePath,
119120 OldContent: oldContent,
internal/cmd/session.go+1−1
@@ -485,7 +485,7 @@ func outputSessionHuman(ctx context.Context, cfg *config.ConfigStore, sess sessi
485485
486486 first := true
487487 for _, msg := range msgs {
488− items := chat.ExtractMessageItems(&styles, msg, toolResults)
488+ items := chat.ExtractMessageItems(&styles, msg, toolResults, "")
489489 for _, item := range items {
490490 if !first {
491491 fmt.Fprintln(&buf)
internal/config/config.go+1
@@ -221,6 +221,7 @@ type LSPConfig struct {
221221type TUIOptions struct {
222222 CompactMode bool `json:"compact_mode,omitempty" jsonschema:"description=Enable compact mode for the TUI interface,default=false"`
223223 DiffMode string `json:"diff_mode,omitempty" jsonschema:"description=Diff mode for the TUI interface,enum=unified,enum=split"`
224+ DiffTool string `json:"diff_tool,omitempty" jsonschema:"description=External diff tool for edit diffs in the TUI,enum=builtin,enum=difftastic,default=builtin"`
224225 // Theme selects the TUI color scheme. "auto" (the default) picks light
225226 // or dark based on the detected terminal background; "dark"/"light"
226227 // force a specific scheme.
internal/ui/attachments/attachments.go+2−2
@@ -132,8 +132,8 @@ func (r *Renderer) Render(attachments []message.Attachment, deleting bool, width
132132 )
133133 }
134134
135− if i == fits && len(attachments) > i {
136− chips = append(chips, lipgloss.NewStyle().Width(maxItemWidth).Render(fmt.Sprintf("%d more…", len(attachments)-fits)))
135+ if i == fits && len(attachments) > i+1 {
136+ chips = append(chips, lipgloss.NewStyle().Width(maxItemWidth).Render(fmt.Sprintf("%d more…", len(attachments)-fits-1)))
137137 break
138138 }
139139 }
internal/ui/chat/agent.go+2−2
@@ -57,7 +57,7 @@ func NewAgentToolMessageItem(
5757 canceled bool,
5858) *AgentToolMessageItem {
5959 t := &AgentToolMessageItem{}
60− t.baseToolMessageItem = newBaseToolMessageItem(sty, toolCall, result, &AgentToolRenderContext{agent: t}, canceled)
60+ t.baseToolMessageItem = newBaseToolMessageItem(sty, toolCall, result, &AgentToolRenderContext{agent: t}, canceled, "")
6161 // For the agent tool we keep spinning until the tool call is finished.
6262 t.spinningFunc = func(state SpinningState) bool {
6363 return !state.HasResult() && !state.IsCanceled()
@@ -238,7 +238,7 @@ func NewAgenticFetchToolMessageItem(
238238 canceled bool,
239239) *AgenticFetchToolMessageItem {
240240 t := &AgenticFetchToolMessageItem{}
241− t.baseToolMessageItem = newBaseToolMessageItem(sty, toolCall, result, &AgenticFetchToolRenderContext{fetch: t}, canceled)
241+ t.baseToolMessageItem = newBaseToolMessageItem(sty, toolCall, result, &AgenticFetchToolRenderContext{fetch: t}, canceled, "")
242242 // For the agentic fetch tool we keep spinning until the tool call is finished.
243243 t.spinningFunc = func(state SpinningState) bool {
244244 return !state.HasResult() && !state.IsCanceled()
internal/ui/chat/bash.go+3−3
@@ -31,7 +31,7 @@ func NewBashToolMessageItem(
3131 result *message.ToolResult,
3232 canceled bool,
3333) ToolMessageItem {
34− return newBaseToolMessageItem(sty, toolCall, result, &BashToolRenderContext{}, canceled)
34+ return newBaseToolMessageItem(sty, toolCall, result, &BashToolRenderContext{}, canceled, "")
3535}
3636
3737// BashToolRenderContext renders bash tool messages.
@@ -116,7 +116,7 @@ func NewJobOutputToolMessageItem(
116116 result *message.ToolResult,
117117 canceled bool,
118118) ToolMessageItem {
119− return newBaseToolMessageItem(sty, toolCall, result, &JobOutputToolRenderContext{}, canceled)
119+ return newBaseToolMessageItem(sty, toolCall, result, &JobOutputToolRenderContext{}, canceled, "")
120120}
121121
122122// JobOutputToolRenderContext renders job_output tool messages.
@@ -167,7 +167,7 @@ func NewJobKillToolMessageItem(
167167 result *message.ToolResult,
168168 canceled bool,
169169) ToolMessageItem {
170− return newBaseToolMessageItem(sty, toolCall, result, &JobKillToolRenderContext{}, canceled)
170+ return newBaseToolMessageItem(sty, toolCall, result, &JobKillToolRenderContext{}, canceled, "")
171171}
172172
173173// JobKillToolRenderContext renders job_kill tool messages.
internal/ui/chat/diagnostics.go+1−1
@@ -27,7 +27,7 @@ func NewDiagnosticsToolMessageItem(
2727 result *message.ToolResult,
2828 canceled bool,
2929) ToolMessageItem {
30− return newBaseToolMessageItem(sty, toolCall, result, &DiagnosticsToolRenderContext{}, canceled)
30+ return newBaseToolMessageItem(sty, toolCall, result, &DiagnosticsToolRenderContext{}, canceled, "")
3131}
3232
3333// DiagnosticsToolRenderContext renders diagnostics tool messages.
internal/ui/chat/docker_mcp.go+2−2
@@ -28,7 +28,7 @@ func NewDockerMCPToolMessageItem(
2828 result *message.ToolResult,
2929 canceled bool,
3030) ToolMessageItem {
31− return newBaseToolMessageItem(sty, toolCall, result, &DockerMCPToolRenderContext{}, canceled)
31+ return newBaseToolMessageItem(sty, toolCall, result, &DockerMCPToolRenderContext{}, canceled, "")
3232}
3333
3434// DockerMCPToolRenderContext renders Docker MCP tool messages.
@@ -138,7 +138,7 @@ func (d *DockerMCPToolRenderContext) RenderTool(sty *styles.Styles, width int, o
138138
139139 // Handle text content.
140140 if opts.Result.Content != "" {
141− body := renderToolResultTextContent(sty, opts.Result.Content, toolResultContentWidths{Body: bodyWidth, Diff: cappedWidth}, opts.ExpandedContent)
141+ body := renderToolResultTextContent(sty, opts.Result.Content, toolResultContentWidths{Body: bodyWidth, Diff: cappedWidth}, opts.ExpandedContent, opts.DiffTool)
142142 parts = append(parts, body)
143143 }
144144
internal/ui/chat/fetch.go+3−3
@@ -26,7 +26,7 @@ func NewFetchToolMessageItem(
2626 result *message.ToolResult,
2727 canceled bool,
2828) ToolMessageItem {
29− return newBaseToolMessageItem(sty, toolCall, result, &FetchToolRenderContext{}, canceled)
29+ return newBaseToolMessageItem(sty, toolCall, result, &FetchToolRenderContext{}, canceled, "")
3030}
3131
3232// FetchToolRenderContext renders fetch tool messages.
@@ -101,7 +101,7 @@ func NewWebFetchToolMessageItem(
101101 result *message.ToolResult,
102102 canceled bool,
103103) ToolMessageItem {
104− return newBaseToolMessageItem(sty, toolCall, result, &WebFetchToolRenderContext{}, canceled)
104+ return newBaseToolMessageItem(sty, toolCall, result, &WebFetchToolRenderContext{}, canceled, "")
105105}
106106
107107// WebFetchToolRenderContext renders web_fetch tool messages.
@@ -155,7 +155,7 @@ func NewWebSearchToolMessageItem(
155155 result *message.ToolResult,
156156 canceled bool,
157157) ToolMessageItem {
158− return newBaseToolMessageItem(sty, toolCall, result, &WebSearchToolRenderContext{}, canceled)
158+ return newBaseToolMessageItem(sty, toolCall, result, &WebSearchToolRenderContext{}, canceled, "")
159159}
160160
161161// WebSearchToolRenderContext renders web_search tool messages.
internal/ui/chat/file.go+8−8
@@ -29,7 +29,7 @@ func NewViewToolMessageItem(
2929 result *message.ToolResult,
3030 canceled bool,
3131) ToolMessageItem {
32− return newBaseToolMessageItem(sty, toolCall, result, &ViewToolRenderContext{}, canceled)
32+ return newBaseToolMessageItem(sty, toolCall, result, &ViewToolRenderContext{}, canceled, "")
3333}
3434
3535// ViewToolRenderContext renders view tool messages.
@@ -115,7 +115,7 @@ func NewWriteToolMessageItem(
115115 result *message.ToolResult,
116116 canceled bool,
117117) ToolMessageItem {
118− return newBaseToolMessageItem(sty, toolCall, result, &WriteToolRenderContext{}, canceled)
118+ return newBaseToolMessageItem(sty, toolCall, result, &WriteToolRenderContext{}, canceled, "")
119119}
120120
121121// WriteToolRenderContext renders write tool messages.
@@ -151,7 +151,7 @@ func (w *WriteToolRenderContext) RenderTool(sty *styles.Styles, width int, opts
151151 var meta tools.WriteResponseMetadata
152152 if err := json.Unmarshal([]byte(opts.Result.Metadata), &meta); err == nil && meta.Diff != "" {
153153 errLine := toolErrorContent(sty, opts.Result, cappedWidth, opts.ExpandedContent)
154− diff := toolOutputDiffContentFromUnified(sty, meta.Diff, cappedWidth, opts.ExpandedContent)
154+ diff := toolOutputDiffContentFromUnified(sty, meta.Diff, cappedWidth, opts.ExpandedContent, opts.DiffTool)
155155 return strings.Join([]string{header, "", errLine, "", diff}, "\n")
156156 }
157157 return joinToolParts(header, toolErrorContent(sty, opts.Result, cappedWidth, opts.ExpandedContent))
@@ -184,7 +184,7 @@ func NewEditToolMessageItem(
184184 result *message.ToolResult,
185185 canceled bool,
186186) ToolMessageItem {
187− return newBaseToolMessageItem(sty, toolCall, result, &EditToolRenderContext{}, canceled)
187+ return newBaseToolMessageItem(sty, toolCall, result, &EditToolRenderContext{}, canceled, "")
188188}
189189
190190// EditToolRenderContext renders edit tool messages.
@@ -223,7 +223,7 @@ func (e *EditToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *
223223 return joinToolParts(header, body)
224224 }
225225
226− diff := toolOutputDiffContent(sty, file, meta.OldContent, meta.NewContent, width, opts.ExpandedContent)
226+ diff := toolOutputDiffContent(sty, file, meta.OldContent, meta.NewContent, width, opts.ExpandedContent, opts.DiffTool)
227227
228228 // On error (e.g. denied permission), show error above the diff.
229229 if opts.Result.IsError {
@@ -252,7 +252,7 @@ func NewMultiEditToolMessageItem(
252252 result *message.ToolResult,
253253 canceled bool,
254254) ToolMessageItem {
255− return newBaseToolMessageItem(sty, toolCall, result, &MultiEditToolRenderContext{}, canceled)
255+ return newBaseToolMessageItem(sty, toolCall, result, &MultiEditToolRenderContext{}, canceled, "")
256256}
257257
258258// MultiEditToolRenderContext renders multi-edit tool messages.
@@ -297,7 +297,7 @@ func (m *MultiEditToolRenderContext) RenderTool(sty *styles.Styles, width int, o
297297 }
298298
299299 // Render diff with optional failed edits note.
300− diff := toolOutputMultiEditDiffContent(sty, file, meta, len(params.Edits), width, opts.ExpandedContent)
300+ diff := toolOutputMultiEditDiffContent(sty, file, meta, len(params.Edits), width, opts.ExpandedContent, opts.DiffTool)
301301
302302 // On error (e.g. denied permission), show error above the diff.
303303 if opts.Result.IsError {
@@ -326,7 +326,7 @@ func NewDownloadToolMessageItem(
326326 result *message.ToolResult,
327327 canceled bool,
328328) ToolMessageItem {
329− return newBaseToolMessageItem(sty, toolCall, result, &DownloadToolRenderContext{}, canceled)
329+ return newBaseToolMessageItem(sty, toolCall, result, &DownloadToolRenderContext{}, canceled, "")
330330}
331331
332332// DownloadToolRenderContext renders download tool messages.
internal/ui/chat/generic.go+2−2
@@ -22,7 +22,7 @@ func NewGenericToolMessageItem(
2222 result *message.ToolResult,
2323 canceled bool,
2424) ToolMessageItem {
25− return newBaseToolMessageItem(sty, toolCall, result, &GenericToolRenderContext{}, canceled)
25+ return newBaseToolMessageItem(sty, toolCall, result, &GenericToolRenderContext{}, canceled, "")
2626}
2727
2828// GenericToolRenderContext renders unknown/generic tool messages.
@@ -68,6 +68,6 @@ func (g *GenericToolRenderContext) RenderTool(sty *styles.Styles, width int, opt
6868 return joinToolParts(header, body)
6969 }
7070
71− body := renderToolResultTextContent(sty, opts.Result.Content, toolResultContentWidths{Body: bodyWidth, Diff: cappedWidth}, opts.ExpandedContent)
71+ body := renderToolResultTextContent(sty, opts.Result.Content, toolResultContentWidths{Body: bodyWidth, Diff: cappedWidth}, opts.ExpandedContent, opts.DiffTool)
7272 return joinToolParts(header, body)
7373}
internal/ui/chat/lsp_restart.go+1−1
@@ -22,7 +22,7 @@ func NewLSPRestartToolMessageItem(
2222 result *message.ToolResult,
2323 canceled bool,
2424) ToolMessageItem {
25− return newBaseToolMessageItem(sty, toolCall, result, &LSPRestartToolRenderContext{}, canceled)
25+ return newBaseToolMessageItem(sty, toolCall, result, &LSPRestartToolRenderContext{}, canceled, "")
2626}
2727
2828// LSPRestartToolRenderContext renders lsprestart tool messages.
internal/ui/chat/mcp.go+2−2
@@ -23,7 +23,7 @@ func NewMCPToolMessageItem(
2323 result *message.ToolResult,
2424 canceled bool,
2525) ToolMessageItem {
26− return newBaseToolMessageItem(sty, toolCall, result, &MCPToolRenderContext{}, canceled)
26+ return newBaseToolMessageItem(sty, toolCall, result, &MCPToolRenderContext{}, canceled, "")
2727}
2828
2929// MCPToolRenderContext renders bash tool messages.
@@ -73,6 +73,6 @@ func (b *MCPToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *T
7373 }
7474
7575 bodyWidth := cappedWidth - toolBodyLeftPaddingTotal
76− body := renderToolResultTextContent(sty, opts.Result.Content, toolResultContentWidths{Body: bodyWidth, Diff: cappedWidth}, opts.ExpandedContent)
76+ body := renderToolResultTextContent(sty, opts.Result.Content, toolResultContentWidths{Body: bodyWidth, Diff: cappedWidth}, opts.ExpandedContent, opts.DiffTool)
7777 return joinToolParts(header, body)
7878}
internal/ui/chat/messages.go+2−1
@@ -364,7 +364,7 @@ func cappedMessageWidth(availableWidth int) int {
364364//
365365// For assistant messages with tool calls, pass a toolResults map to link results.
366366// Use BuildToolResultMap to create this map from all messages in a session.
367−func ExtractMessageItems(sty *styles.Styles, msg *message.Message, toolResults map[string]message.ToolResult) []MessageItem {
367+func ExtractMessageItems(sty *styles.Styles, msg *message.Message, toolResults map[string]message.ToolResult, diffTool string) []MessageItem {
368368 switch msg.Role {
369369 case message.User:
370370 // Reconstruct shell command items from ShellCommand parts.
@@ -401,6 +401,7 @@ func ExtractMessageItems(sty *styles.Styles, msg *message.Message, toolResults m
401401 tc,
402402 result,
403403 msg.FinishReason() == message.FinishReasonCanceled,
404+ diffTool,
404405 ))
405406 }
406407 return items
internal/ui/chat/references.go+1−1
@@ -23,7 +23,7 @@ func NewReferencesToolMessageItem(
2323 result *message.ToolResult,
2424 canceled bool,
2525) ToolMessageItem {
26− return newBaseToolMessageItem(sty, toolCall, result, &ReferencesToolRenderContext{}, canceled)
26+ return newBaseToolMessageItem(sty, toolCall, result, &ReferencesToolRenderContext{}, canceled, "")
2727}
2828
2929// ReferencesToolRenderContext renders references tool messages.
internal/ui/chat/search.go+4−4
@@ -27,7 +27,7 @@ func NewGlobToolMessageItem(
2727 result *message.ToolResult,
2828 canceled bool,
2929) ToolMessageItem {
30− return newBaseToolMessageItem(sty, toolCall, result, &GlobToolRenderContext{}, canceled)
30+ return newBaseToolMessageItem(sty, toolCall, result, &GlobToolRenderContext{}, canceled, "")
3131}
3232
3333// GlobToolRenderContext renders glob tool messages.
@@ -86,7 +86,7 @@ func NewGrepToolMessageItem(
8686 result *message.ToolResult,
8787 canceled bool,
8888) ToolMessageItem {
89− return newBaseToolMessageItem(sty, toolCall, result, &GrepToolRenderContext{}, canceled)
89+ return newBaseToolMessageItem(sty, toolCall, result, &GrepToolRenderContext{}, canceled, "")
9090}
9191
9292// GrepToolRenderContext renders grep tool messages.
@@ -151,7 +151,7 @@ func NewLSToolMessageItem(
151151 result *message.ToolResult,
152152 canceled bool,
153153) ToolMessageItem {
154− return newBaseToolMessageItem(sty, toolCall, result, &LSToolRenderContext{}, canceled)
154+ return newBaseToolMessageItem(sty, toolCall, result, &LSToolRenderContext{}, canceled, "")
155155}
156156
157157// LSToolRenderContext renders ls tool messages.
@@ -211,7 +211,7 @@ func NewSourcegraphToolMessageItem(
211211 result *message.ToolResult,
212212 canceled bool,
213213) ToolMessageItem {
214− return newBaseToolMessageItem(sty, toolCall, result, &SourcegraphToolRenderContext{}, canceled)
214+ return newBaseToolMessageItem(sty, toolCall, result, &SourcegraphToolRenderContext{}, canceled, "")
215215}
216216
217217// SourcegraphToolRenderContext renders sourcegraph tool messages.
internal/ui/chat/todos.go+1−1
@@ -31,7 +31,7 @@ func NewTodosToolMessageItem(
3131 result *message.ToolResult,
3232 canceled bool,
3333) ToolMessageItem {
34− return newBaseToolMessageItem(sty, toolCall, result, &TodosToolRenderContext{}, canceled)
34+ return newBaseToolMessageItem(sty, toolCall, result, &TodosToolRenderContext{}, canceled, "")
3535}
3636
3737// TodosToolRenderContext renders todos tool messages.
internal/ui/chat/tool_result_content.go+2−2
@@ -41,7 +41,7 @@ func looksLikeMarkdown(content string) bool {
4141 return false
4242}
4343
44−func renderToolResultTextContent(sty *styles.Styles, content string, widths toolResultContentWidths, expanded bool) string {
44+func renderToolResultTextContent(sty *styles.Styles, content string, widths toolResultContentWidths, expanded bool, diffTool string) string {
4545 var result json.RawMessage
4646 if err := json.Unmarshal([]byte(content), &result); err == nil {
4747 prettyResult, err := json.MarshalIndent(result, "", " ")
@@ -51,7 +51,7 @@ func renderToolResultTextContent(sty *styles.Styles, content string, widths tool
5151 return sty.Tool.Body.Render(toolOutputPlainContent(sty, content, widths.Body, expanded))
5252 }
5353 if diffdetect.IsUnifiedDiff(content) {
54− return toolOutputDiffContentFromUnified(sty, content, widths.Diff, expanded)
54+ return toolOutputDiffContentFromUnified(sty, content, widths.Diff, expanded, diffTool)
5555 }
5656 if looksLikeMarkdown(content) {
5757 return sty.Tool.Body.Render(toolOutputCodeContent(sty, "result.md", content, 0, widths.Body, expanded))
internal/ui/chat/tool_result_content_test.go+5−5
@@ -72,7 +72,7 @@ func TestRenderToolResultTextContent(t *testing.T) {
7272 t.Fatalf("json.MarshalIndent() error = %v", err)
7373 }
7474 expected := styPtr.Tool.Body.Render(toolOutputCodeContent(styPtr, "result.json", string(prettyResult), 0, widths.Body, false))
75− got := renderToolResultTextContent(styPtr, content, widths, false)
75+ got := renderToolResultTextContent(styPtr, content, widths, false, "")
7676 if got != expected {
7777 t.Fatal("renderToolResultTextContent() did not choose JSON rendering")
7878 }
@@ -87,8 +87,8 @@ func TestRenderToolResultTextContent(t *testing.T) {
8787-# Old
8888+# New
8989`
90− expected := toolOutputDiffContentFromUnified(styPtr, content, widths.Diff, false)
91− got := renderToolResultTextContent(styPtr, content, widths, false)
90+ expected := toolOutputDiffContentFromUnified(styPtr, content, widths.Diff, false, "")
91+ got := renderToolResultTextContent(styPtr, content, widths, false, "")
9292 if got != expected {
9393 t.Fatal("renderToolResultTextContent() did not choose diff rendering")
9494 }
@@ -98,7 +98,7 @@ func TestRenderToolResultTextContent(t *testing.T) {
9898 t.Parallel()
9999 content := "# Title\n\nBody"
100100 expected := styPtr.Tool.Body.Render(toolOutputCodeContent(styPtr, "result.md", content, 0, widths.Body, false))
101− got := renderToolResultTextContent(styPtr, content, widths, false)
101+ got := renderToolResultTextContent(styPtr, content, widths, false, "")
102102 if got != expected {
103103 t.Fatal("renderToolResultTextContent() did not choose markdown rendering")
104104 }
@@ -108,7 +108,7 @@ func TestRenderToolResultTextContent(t *testing.T) {
108108 t.Parallel()
109109 content := "plain text"
110110 expected := styPtr.Tool.Body.Render(toolOutputPlainContent(styPtr, content, widths.Body, false))
111− got := renderToolResultTextContent(styPtr, content, widths, false)
111+ got := renderToolResultTextContent(styPtr, content, widths, false, "")
112112 if got != expected {
113113 t.Fatal("renderToolResultTextContent() did not choose plain rendering")
114114 }
internal/ui/chat/tools.go+65−32
@@ -19,6 +19,7 @@ import (
1919 "github.com/charmbracelet/crush/internal/stringext"
2020 "github.com/charmbracelet/crush/internal/ui/anim"
2121 "github.com/charmbracelet/crush/internal/ui/common"
22+ "github.com/charmbracelet/crush/internal/ui/difftastic"
2223 "github.com/charmbracelet/crush/internal/ui/list"
2324 "github.com/charmbracelet/crush/internal/ui/styles"
2425 "github.com/charmbracelet/x/ansi"
@@ -57,6 +58,7 @@ type ToolMessageItem interface {
5758 SetMessageID(id string)
5859 SetStatus(status ToolStatus)
5960 Status() ToolStatus
61+ SetDiffTool(tool string)
6062}
6163
6264// Compactable is an interface for tool items that can render in a compacted mode.
@@ -103,6 +105,10 @@ type ToolRenderOpts struct {
103105 Compact bool
104106 IsSpinning bool
105107 Status ToolStatus
108+ // DiffTool selects the external diff renderer for edit/multi-edit diffs.
109+ // "builtin" (the default) uses the in-process renderer; "difftastic"
110+ // shells out to the difft binary.
111+ DiffTool string
106112}
107113
108114// IsPending returns true if the tool call is still pending (not finished and
@@ -163,6 +169,8 @@ type baseToolMessageItem struct {
163169 sty *styles.Styles
164170 anim *anim.Anim
165171 expandedContent bool
172+ // diffTool selects the external diff renderer for edit/multi-edit diffs.
173+ diffTool string
166174}
167175
168176var _ Expandable = (*baseToolMessageItem)(nil)
@@ -174,6 +182,7 @@ func newBaseToolMessageItem(
174182 result *message.ToolResult,
175183 toolRenderer ToolRenderer,
176184 canceled bool,
185+ diffTool string,
177186) *baseToolMessageItem {
178187 // we only do full width for diffs (as far as I know)
179188 hasCappedWidth := toolCall.Name != tools.EditToolName && toolCall.Name != tools.MultiEditToolName
@@ -195,6 +204,7 @@ func newBaseToolMessageItem(
195204 result: result,
196205 status: status,
197206 hasCappedWidth: hasCappedWidth,
207+ diffTool: diffTool,
198208 }
199209 t.anim = anim.New(anim.Settings{
200210 ID: toolCall.ID,
@@ -219,6 +229,7 @@ func NewToolMessageItem(
219229 toolCall message.ToolCall,
220230 result *message.ToolResult,
221231 canceled bool,
232+ diffTool string,
222233) ToolMessageItem {
223234 var item ToolMessageItem
224235 switch toolCall.Name {
@@ -273,6 +284,7 @@ func NewToolMessageItem(
273284 item = NewGenericToolMessageItem(sty, toolCall, result, canceled)
274285 }
275286 }
287+ item.SetDiffTool(diffTool)
276288 item.SetMessageID(messageID)
277289 return item
278290}
@@ -287,6 +299,16 @@ func (t *baseToolMessageItem) SetCompact(compact bool) {
287299 t.Bump()
288300}
289301
302+// SetDiffTool sets the external diff tool preference and invalidates the cache.
303+func (t *baseToolMessageItem) SetDiffTool(tool string) {
304+ if t.diffTool == tool {
305+ return
306+ }
307+ t.diffTool = tool
308+ t.clearCache()
309+ t.Bump()
310+}
311+
290312// ID returns the unique identifier for this tool message item.
291313func (t *baseToolMessageItem) ID() string {
292314 return t.toolCall.ID
@@ -338,6 +360,7 @@ func (t *baseToolMessageItem) RawRender(width int) string {
338360 Compact: t.isCompact,
339361 IsSpinning: t.isSpinning(),
340362 Status: t.computeStatus(),
363+ DiffTool: t.diffTool,
341364 })
342365
343366 // Prepend hook indicator if hooks ran for this tool call.
@@ -985,9 +1008,16 @@ func formatSize(bytes int) string {
9851008}
9861009
9871010// toolOutputDiffContent renders a diff between old and new content.
988−func toolOutputDiffContent(sty *styles.Styles, file, oldContent, newContent string, width int, expanded bool) string {
1011+func toolOutputDiffContent(sty *styles.Styles, file, oldContent, newContent string, width int, expanded bool, diffTool string) string {
9891012 bodyWidth := width - toolBodyLeftPaddingTotal
9901013
1014+ // Try difftastic if enabled. Fall back to builtin on any failure.
1015+ if diffTool == "difftastic" {
1016+ if out, err := difftastic.RenderDiff(file, oldContent, newContent, bodyWidth); err == nil && out != "" {
1017+ return sty.Tool.Body.Render(truncateDiff(sty, out, bodyWidth, expanded))
1018+ }
1019+ }
1020+
9911021 formatter := common.DiffFormatter(sty).
9921022 Before(file, oldContent).
9931023 After(file, newContent).
@@ -999,22 +1029,7 @@ func toolOutputDiffContent(sty *styles.Styles, file, oldContent, newContent stri
9991029 }
10001030
10011031 formatted := formatter.String()
1002− lines := strings.Split(formatted, "\n")
1003−
1004− // Truncate if needed.
1005− maxLines := diffContextHeight
1006− if expanded {
1007− maxLines = len(lines)
1008− }
1009−
1010− if len(lines) > maxLines && !expanded {
1011− truncMsg := sty.Tool.DiffTruncation.
1012− Width(bodyWidth).
1013− Render(fmt.Sprintf(assistantMessageTruncateFormat, len(lines)-maxLines))
1014− formatted = strings.Join(lines[:maxLines], "\n") + "\n" + truncMsg
1015− }
1016−
1017− return sty.Tool.Body.Render(formatted)
1032+ return sty.Tool.Body.Render(truncateDiff(sty, formatted, bodyWidth, expanded))
10181033}
10191034
10201035// formatTimeout converts timeout seconds to a duration string (e.g., "30s").
@@ -1035,9 +1050,24 @@ func formatNonZero(value int) string {
10351050}
10361051
10371052// toolOutputMultiEditDiffContent renders a diff with optional failed edits note.
1038−func toolOutputMultiEditDiffContent(sty *styles.Styles, file string, meta tools.MultiEditResponseMetadata, totalEdits, width int, expanded bool) string {
1053+func toolOutputMultiEditDiffContent(sty *styles.Styles, file string, meta tools.MultiEditResponseMetadata, totalEdits, width int, expanded bool, diffTool string) string {
10391054 bodyWidth := width - toolBodyLeftPaddingTotal
10401055
1056+ // Try difftastic if enabled. Fall back to builtin on any failure.
1057+ if diffTool == "difftastic" {
1058+ if out, err := difftastic.RenderDiff(file, meta.OldContent, meta.NewContent, bodyWidth); err == nil && out != "" {
1059+ formatted := truncateDiff(sty, out, bodyWidth, expanded)
1060+ // Add failed edits note if any exist.
1061+ if len(meta.EditsFailed) > 0 {
1062+ noteTag := sty.Tool.NoteTag.Render("Note")
1063+ noteMsg := fmt.Sprintf("%d of %d edits succeeded", meta.EditsApplied, totalEdits)
1064+ note := fmt.Sprintf("%s %s", noteTag, sty.Tool.NoteMessage.Render(noteMsg))
1065+ formatted = formatted + "\n\n" + note
1066+ }
1067+ return sty.Tool.Body.Render(formatted)
1068+ }
1069+ }
1070+
10411071 formatter := common.DiffFormatter(sty).
10421072 Before(file, meta.OldContent).
10431073 After(file, meta.NewContent).
@@ -1049,20 +1079,7 @@ func toolOutputMultiEditDiffContent(sty *styles.Styles, file string, meta tools.
10491079 }
10501080
10511081 formatted := formatter.String()
1052− lines := strings.Split(formatted, "\n")
1053−
1054− // Truncate if needed.
1055− maxLines := diffContextHeight
1056− if expanded {
1057− maxLines = len(lines)
1058− }
1059−
1060− if len(lines) > maxLines && !expanded {
1061− truncMsg := sty.Tool.DiffTruncation.
1062− Width(bodyWidth).
1063− Render(fmt.Sprintf(assistantMessageTruncateFormat, len(lines)-maxLines))
1064− formatted = strings.Join(lines[:maxLines], "\n") + "\n" + truncMsg
1065− }
1082+ formatted = truncateDiff(sty, formatted, bodyWidth, expanded)
10661083
10671084 // Add failed edits note if any exist.
10681085 if len(meta.EditsFailed) > 0 {
@@ -1075,6 +1092,22 @@ func toolOutputMultiEditDiffContent(sty *styles.Styles, file string, meta tools.
10751092 return sty.Tool.Body.Render(formatted)
10761093}
10771094
1095+// truncateDiff truncates diff output to diffContextHeight lines unless expanded.
1096+func truncateDiff(sty *styles.Styles, content string, bodyWidth int, expanded bool) string {
1097+ lines := strings.Split(content, "\n")
1098+ maxLines := diffContextHeight
1099+ if expanded {
1100+ maxLines = len(lines)
1101+ }
1102+ if len(lines) > maxLines && !expanded {
1103+ truncMsg := sty.Tool.DiffTruncation.
1104+ Width(bodyWidth).
1105+ Render(fmt.Sprintf(assistantMessageTruncateFormat, len(lines)-maxLines))
1106+ return strings.Join(lines[:maxLines], "\n") + "\n" + truncMsg
1107+ }
1108+ return content
1109+}
1110+
10781111// roundedEnumerator creates a tree enumerator with rounded corners.
10791112func roundedEnumerator(lPadding, width int) tree.Enumerator {
10801113 if width == 0 {
internal/ui/chat/unified_diff.go+13−14
@@ -1,11 +1,11 @@
11package chat
22
33import (
4− "fmt"
54 "strings"
65
76 "github.com/charmbracelet/crush/internal/diffdetect"
87 "github.com/charmbracelet/crush/internal/ui/common"
8+ "github.com/charmbracelet/crush/internal/ui/difftastic"
99 "github.com/charmbracelet/crush/internal/ui/styles"
1010)
1111
@@ -130,13 +130,23 @@ func parseUnifiedDiff(content string) []parsedDiffFile {
130130 return result
131131}
132132
133−func toolOutputDiffContentFromUnified(sty *styles.Styles, content string, width int, expanded bool) string {
133+func toolOutputDiffContentFromUnified(sty *styles.Styles, content string, width int, expanded bool, diffTool string) string {
134134 files := parseUnifiedDiff(content)
135135 if len(files) == 0 {
136136 bodyWidth := width - toolBodyLeftPaddingTotal
137137 return sty.Tool.Body.Render(toolOutputCodeContent(sty, "result.diff", content, 0, bodyWidth, expanded))
138138 }
139139 bodyWidth := width - toolBodyLeftPaddingTotal
140+
141+ // Try difftastic if enabled and there's a single file diff. Fall back to
142+ // builtin on any failure or when multiple files are involved.
143+ if diffTool == "difftastic" && len(files) == 1 {
144+ f := files[0]
145+ if out, err := difftastic.RenderDiff(f.path, f.before, f.after, bodyWidth); err == nil && out != "" {
146+ return sty.Tool.Body.Render(truncateDiff(sty, out, bodyWidth, expanded))
147+ }
148+ }
149+
140150 var blocks []string
141151 for i, f := range files {
142152 formatter := common.DiffFormatter(sty).
@@ -156,16 +166,5 @@ func toolOutputDiffContentFromUnified(sty *styles.Styles, content string, width
156166 blocks = append(blocks, formatted)
157167 }
158168 combined := strings.Join(blocks, "\n")
159− lines := strings.Split(combined, "\n")
160− maxLines := diffContextHeight
161− if expanded {
162− maxLines = len(lines)
163− }
164− if len(lines) > maxLines && !expanded {
165− truncMsg := sty.Tool.DiffTruncation.
166− Width(bodyWidth).
167− Render(fmt.Sprintf(assistantMessageTruncateFormat, len(lines)-maxLines))
168− combined = strings.Join(lines[:maxLines], "\n") + "\n" + truncMsg
169− }
170− return sty.Tool.Body.Render(combined)
169+ return sty.Tool.Body.Render(truncateDiff(sty, combined, bodyWidth, expanded))
171170}
internal/ui/chat/version_bump_test.go+10−10
@@ -131,7 +131,7 @@ func TestBaseToolMessageItem_MutatorsBumpVersion(t *testing.T) {
131131
132132 sty := styles.CharmtonePantera()
133133 tc := message.ToolCall{ID: "tc1", Name: "bash", Input: "{}", Finished: false}
134− item := NewToolMessageItem(&sty, "msg", tc, nil, false)
134+ item := NewToolMessageItem(&sty, "msg", tc, nil, false, "")
135135
136136 v := item.(versionedItem)
137137
@@ -283,7 +283,7 @@ func TestAgentToolMessageItem_NestedToolMutatorsBumpVersion(t *testing.T) {
283283
284284 mkChild := func(id string) ToolMessageItem {
285285 tc := message.ToolCall{ID: id, Name: "bash", Input: `{}`, Finished: false}
286− return NewToolMessageItem(&sty, "msg", tc, nil, false)
286+ return NewToolMessageItem(&sty, "msg", tc, nil, false, "")
287287 }
288288
289289 // AddNestedTool always bumps.
@@ -320,7 +320,7 @@ func TestAgenticFetchToolMessageItem_NestedToolMutatorsBumpVersion(t *testing.T)
320320
321321 mkChild := func(id string) ToolMessageItem {
322322 tc := message.ToolCall{ID: id, Name: "fetch", Input: `{}`, Finished: false}
323− return NewToolMessageItem(&sty, "msg", tc, nil, false)
323+ return NewToolMessageItem(&sty, "msg", tc, nil, false, "")
324324 }
325325
326326 requireBump(t, "AddNestedTool", item, func() {
@@ -357,7 +357,7 @@ func TestAgentToolMessageItem_NestedChildInPlaceMutationBumpsParent(t *testing.T
357357 item := NewAgentToolMessageItem(&sty, parent, nil, false)
358358
359359 childTC := message.ToolCall{ID: "c1", Name: "bash", Input: `{}`, Finished: false}
360− child := NewToolMessageItem(&sty, "msg", childTC, nil, false)
360+ child := NewToolMessageItem(&sty, "msg", childTC, nil, false, "")
361361 item.AddNestedTool(child)
362362
363363 v0 := item.Version()
@@ -386,7 +386,7 @@ func TestAgenticFetchToolMessageItem_NestedChildInPlaceMutationBumpsParent(t *te
386386 item := NewAgenticFetchToolMessageItem(&sty, parent, nil, false)
387387
388388 childTC := message.ToolCall{ID: "c1", Name: "fetch", Input: `{}`, Finished: false}
389− child := NewToolMessageItem(&sty, "msg", childTC, nil, false)
389+ child := NewToolMessageItem(&sty, "msg", childTC, nil, false, "")
390390 item.AddNestedTool(child)
391391
392392 v0 := item.Version()
@@ -427,7 +427,7 @@ func TestBaseToolMessageItem_AnimateBumpsVersion(t *testing.T) {
427427
428428 sty := styles.CharmtonePantera()
429429 tc := message.ToolCall{ID: "tc-spin", Name: "bash", Input: "{}", Finished: false}
430− item := NewToolMessageItem(&sty, "msg", tc, nil, false)
430+ item := NewToolMessageItem(&sty, "msg", tc, nil, false, "")
431431 v := item.(versionedItem)
432432 a, ok := item.(Animatable)
433433 require.True(t, ok, "base tool message item must implement Animatable")
@@ -475,7 +475,7 @@ func TestAgentToolMessageItem_AnimateBumpsVersion(t *testing.T) {
475475 parent := NewAgentToolMessageItem(&sty, parentTC, nil, false)
476476
477477 childTC := message.ToolCall{ID: "agent-child", Name: "bash", Input: `{}`, Finished: false}
478− child := NewToolMessageItem(&sty, "msg", childTC, nil, false)
478+ child := NewToolMessageItem(&sty, "msg", childTC, nil, false, "")
479479 parent.AddNestedTool(child)
480480
481481 // Spinning + parent's own ID → parent bumps.
@@ -520,7 +520,7 @@ func TestAgenticFetchToolMessageItem_AnimateBumpsVersion(t *testing.T) {
520520 parent := NewAgenticFetchToolMessageItem(&sty, parentTC, nil, false)
521521
522522 childTC := message.ToolCall{ID: "fetch-child", Name: "fetch", Input: `{}`, Finished: false}
523− child := NewToolMessageItem(&sty, "msg", childTC, nil, false)
523+ child := NewToolMessageItem(&sty, "msg", childTC, nil, false, "")
524524 parent.AddNestedTool(child)
525525
526526 requireBump(t, "Animate[spinning,parent ID]", parent, func() {
@@ -551,7 +551,7 @@ func TestBaseToolMessageItem_FinishedTransition(t *testing.T) {
551551
552552 sty := styles.CharmtonePantera()
553553 tc := message.ToolCall{ID: "tc-fin", Name: "bash", Input: "{}", Finished: false}
554− item := NewToolMessageItem(&sty, "msg", tc, nil, false)
554+ item := NewToolMessageItem(&sty, "msg", tc, nil, false, "")
555555 require.False(t, item.Finished(), "running tool must not be Finished()")
556556
557557 tcFinished := tc
@@ -562,6 +562,6 @@ func TestBaseToolMessageItem_FinishedTransition(t *testing.T) {
562562
563563 // Canceled tool with no result is also Finished.
564564 tcCanceled := message.ToolCall{ID: "tc-cancel", Name: "bash", Input: "{}", Finished: false}
565− canceled := NewToolMessageItem(&sty, "msg", tcCanceled, nil, true)
565+ canceled := NewToolMessageItem(&sty, "msg", tcCanceled, nil, true, "")
566566 require.True(t, canceled.Finished(), "canceled tool must be Finished()")
567567}
internal/ui/dialog/commands.go+3−3
@@ -370,9 +370,9 @@ func (c *Commands) defaultCommands() []*CommandItem {
370370
371371 // Add external editor command if $EDITOR is available.
372372 //
373− // TODO: Use [tea.EnvMsg] to get environment variable instead of os.Getenv;
374− // because os.Getenv does IO is breaks the TEA paradigm and is generally an
375− // antipattern.
373+ // TODO: Use [tea.EnvMsg] to get environment variables instead of os.Getenv;
374+ // reading the environment directly bypasses the TEA message system and is
375+ // generally an antipattern.
376376 if os.Getenv("EDITOR") != "" {
377377 commands = append(commands, NewCommandItem(c.com.Styles, "open_external_editor", "Open External Editor", "ctrl+o", ActionExternalEditor{}))
378378 }
internal/ui/dialog/permissions.go+1−1
@@ -707,7 +707,7 @@ func (p *Permissions) renderViewContent(width int) string {
707707 if params.Offset > 0 {
708708 content += fmt.Sprintf("\nStarting from line: %d", params.Offset+1)
709709 }
710− if params.Limit > 0 && params.Limit != 2000 {
710+ if params.Limit > 0 && params.Limit != tools.DefaultReadLimit {
711711 content += fmt.Sprintf("\nLines to read: %d", params.Limit)
712712 }
713713
internal/ui/difftastic/difftastic.gonew file+60
@@ -0,0 +1,60 @@
1+// Package difftastic provides a syntax-aware structural diff renderer by
2+// shelling out to the difftastic binary (https://github.com/Wilfred/difftastic).
3+package difftastic
4+
5+import (
6+ "context"
7+ "fmt"
8+ "os"
9+ "os/exec"
10+ "path/filepath"
11+ "strconv"
12+ "strings"
13+)
14+
15+// RenderDiff runs difftastic on before/after content and returns ANSI-colored
16+// output. Returns empty string and a nil error if difft is not available so
17+// callers can fall back to the builtin renderer.
18+func RenderDiff(filePath, before, after string, width int) (string, error) {
19+ if _, err := exec.LookPath("difft"); err != nil {
20+ return "", nil
21+ }
22+
23+ dir, err := os.MkdirTemp("", "crush-difftastic-*")
24+ if err != nil {
25+ return "", fmt.Errorf("failed to create temp directory: %w", err)
26+ }
27+ defer os.RemoveAll(dir)
28+
29+ ext := filepath.Ext(filePath)
30+ oldPath := filepath.Join(dir, "old"+ext)
31+ newPath := filepath.Join(dir, "new"+ext)
32+
33+ if err := os.WriteFile(oldPath, []byte(before), 0o644); err != nil {
34+ return "", fmt.Errorf("failed to write before content: %w", err)
35+ }
36+ if err := os.WriteFile(newPath, []byte(after), 0o644); err != nil {
37+ return "", fmt.Errorf("failed to write after content: %w", err)
38+ }
39+
40+ args := []string{
41+ "--color=always",
42+ "--display=inline",
43+ "--width=" + strconv.Itoa(width),
44+ oldPath,
45+ newPath,
46+ }
47+
48+ cmd := exec.CommandContext(context.Background(), "difft", args...)
49+ output, err := cmd.CombinedOutput()
50+ if err != nil {
51+ // difftastic returns non-zero exit code when differences are found.
52+ // The output is still valid, so return it rather than the error.
53+ if len(output) > 0 {
54+ return string(output), nil
55+ }
56+ return "", fmt.Errorf("failed to run difftastic: %w", err)
57+ }
58+
59+ return strings.TrimRight(string(output), "\n"), nil
60+}
internal/ui/model/chat.go+18
@@ -673,6 +673,18 @@ func (m *Chat) RemoveMessage(id string) {
673673 return
674674 }
675675
676+ // Clean up nested tool IDs that point to this item's index before
677+ // removing it, so they don't end up pointing to a wrong item after
678+ // the rebuild.
679+ if item, ok := m.list.ItemAt(idx).(chat.MessageItem); ok {
680+ if container, ok := item.(chat.NestedToolContainer); ok {
681+ for _, nested := range container.NestedTools() {
682+ delete(m.idInxMap, nested.ID())
683+ delete(m.pausedAnimations, nested.ID())
684+ }
685+ }
686+ }
687+
676688 // Remove from list
677689 m.list.RemoveItem(idx)
678690
@@ -683,6 +695,12 @@ func (m *Chat) RemoveMessage(id string) {
683695 for i := idx; i < m.list.Len(); i++ {
684696 if item, ok := m.list.ItemAt(i).(chat.MessageItem); ok {
685697 m.idInxMap[item.ID()] = i
698+ // Also update nested tool IDs for containers.
699+ if container, ok := item.(chat.NestedToolContainer); ok {
700+ for _, nested := range container.NestedTools() {
701+ m.idInxMap[nested.ID()] = i
702+ }
703+ }
686704 }
687705 }
688706
internal/ui/model/onboarding.go−1
@@ -72,7 +72,6 @@ func (m *UI) initializeProject() tea.Cmd {
7272
7373// skipInitializeProject skips project initialization and transitions to the landing view.
7474func (m *UI) skipInitializeProject() tea.Cmd {
75− // TODO: initialize the project
7675 m.setState(uiLanding, uiFocusEditor)
7776 // mark the project as initialized
7877 return m.markProjectInitializedCmd()
internal/ui/model/ui.go+35−13
@@ -456,7 +456,8 @@ func New(ctx context.Context, com *common.Common, initialSessionID string, conti
456456 // reconcileTheme applies the light palette on the first frame when
457457 // the terminal reports a light background or "light" is forced.
458458 ui.themeKey = styles.ThemeKeyForProviderMode(
459− cfg.Models[config.SelectedModelTypeLarge].Provider, true)
459+ cfg.Models[config.SelectedModelTypeLarge].Provider, true,
460+ )
460461 }
461462
462463 ui.setEditorPrompt(com.Workspace.PermissionSkipRequests())
@@ -608,14 +609,32 @@ func (m *UI) updateNotificationBackend() {
608609}
609610
610611// shouldSendNotification returns true if notifications should be sent based on
611−// current state. Focus reporting must be supported, window must not be
612−// focused, and notifications must not be disabled in config.
612+// current state. The window must not be focused and notifications must not be
613+// disabled in config. Focus reporting is only required in auto-detection mode:
614+// when the user explicitly chooses a notification style, we honor it even on
615+// terminals that don't support focus events (e.g. SSH sessions).
613616func (m *UI) shouldSendNotification() bool {
614617 cfg := m.com.Config()
615− if cfg != nil && cfg.Options != nil && cfg.Options.NotificationStyle == "disabled" {
618+ var style string
619+ if cfg != nil && cfg.Options != nil {
620+ style = cfg.Options.NotificationStyle
621+ }
622+ if style == "disabled" {
623+ return false
624+ }
625+ // Never notify while the window is focused. On terminals without focus
626+ // reporting, notifyWindowFocused stays false, so this doesn't suppress.
627+ if m.notifyWindowFocused {
616628 return false
617629 }
618− return m.caps.ReportFocusEvents && !m.notifyWindowFocused
630+ // An explicit style (anything other than auto/empty) is honored regardless
631+ // of focus event support.
632+ if style != "" && style != "auto" {
633+ return true
634+ }
635+ // Auto-detection mode: without focus events we can't suppress notifications
636+ // while focused, so we disable them entirely to avoid spamming the user.
637+ return m.caps.ReportFocusEvents
619638}
620639
621640// setState changes the UI state and focus.
@@ -1211,20 +1230,21 @@ func (m *UI) setSessionMessages(msgs []message.Message) tea.Cmd {
12111230 toolResultMap := chat.BuildToolResultMap(msgPtrs)
12121231
12131232 // Add messages to chat with linked tool results
1233+ diffTool := m.com.Config().Options.TUI.DiffTool
12141234 items := make([]chat.MessageItem, 0, len(msgs)*2)
12151235 for _, msg := range msgPtrs {
12161236 switch msg.Role {
12171237 case message.User:
12181238 m.lastUserMessageTime = msg.CreatedAt
1219− items = append(items, chat.ExtractMessageItems(m.com.Styles, msg, toolResultMap)...)
1239+ items = append(items, chat.ExtractMessageItems(m.com.Styles, msg, toolResultMap, diffTool)...)
12201240 case message.Assistant:
1221− items = append(items, chat.ExtractMessageItems(m.com.Styles, msg, toolResultMap)...)
1241+ items = append(items, chat.ExtractMessageItems(m.com.Styles, msg, toolResultMap, diffTool)...)
12221242 if msg.FinishPart() != nil && msg.FinishPart().Reason == message.FinishReasonEndTurn {
12231243 infoItem := chat.NewAssistantInfoItem(m.com.Styles, msg, m.com.Config(), time.Unix(m.lastUserMessageTime, 0))
12241244 items = append(items, infoItem)
12251245 }
12261246 default:
1227− items = append(items, chat.ExtractMessageItems(m.com.Styles, msg, toolResultMap)...)
1247+ items = append(items, chat.ExtractMessageItems(m.com.Styles, msg, toolResultMap, diffTool)...)
12281248 }
12291249 }
12301250
@@ -1285,7 +1305,7 @@ func (m *UI) loadNestedToolCalls(items []chat.MessageItem) {
12851305 // Extract nested tool items.
12861306 var nestedTools []chat.ToolMessageItem
12871307 for _, nestedMsg := range nestedMsgPtrs {
1288− nestedItems := chat.ExtractMessageItems(m.com.Styles, nestedMsg, nestedToolResultMap)
1308+ nestedItems := chat.ExtractMessageItems(m.com.Styles, nestedMsg, nestedToolResultMap, m.com.Config().Options.TUI.DiffTool)
12891309 for _, nestedItem := range nestedItems {
12901310 if nestedToolItem, ok := nestedItem.(chat.ToolMessageItem); ok {
12911311 // Mark nested tools as simple (compact) rendering.
@@ -1335,7 +1355,7 @@ func (m *UI) appendSessionMessage(msg message.Message) tea.Cmd {
13351355 return nil
13361356 }
13371357 m.lastUserMessageTime = msg.CreatedAt
1338− items := chat.ExtractMessageItems(m.com.Styles, &msg, nil)
1358+ items := chat.ExtractMessageItems(m.com.Styles, &msg, nil, m.com.Config().Options.TUI.DiffTool)
13391359 for _, item := range items {
13401360 if animatable, ok := item.(chat.Animatable); ok {
13411361 if cmd := animatable.StartAnimation(); cmd != nil {
@@ -1348,7 +1368,7 @@ func (m *UI) appendSessionMessage(msg message.Message) tea.Cmd {
13481368 cmds = append(cmds, cmd)
13491369 }
13501370 case message.Assistant:
1351− items := chat.ExtractMessageItems(m.com.Styles, &msg, nil)
1371+ items := chat.ExtractMessageItems(m.com.Styles, &msg, nil, m.com.Config().Options.TUI.DiffTool)
13521372 for _, item := range items {
13531373 if animatable, ok := item.(chat.Animatable); ok {
13541374 if cmd := animatable.StartAnimation(); cmd != nil {
@@ -1457,7 +1477,7 @@ func (m *UI) updateSessionMessage(msg message.Message) tea.Cmd {
14571477 }
14581478 }
14591479 if existingToolItem == nil {
1460− items = append(items, chat.NewToolMessageItem(m.com.Styles, msg.ID, tc, nil, false))
1480+ items = append(items, chat.NewToolMessageItem(m.com.Styles, msg.ID, tc, nil, false, m.com.Config().Options.TUI.DiffTool))
14611481 }
14621482 }
14631483
@@ -1529,7 +1549,7 @@ func (m *UI) handleChildSessionMessage(event pubsub.Event[message.Message]) tea.
15291549 }
15301550 if !found {
15311551 // Create a new nested tool item.
1532− nestedItem := chat.NewToolMessageItem(m.com.Styles, event.Payload.ID, tc, nil, false)
1552+ nestedItem := chat.NewToolMessageItem(m.com.Styles, event.Payload.ID, tc, nil, false, m.com.Config().Options.TUI.DiffTool)
15331553 if simplifiable, ok := nestedItem.(chat.Compactable); ok {
15341554 simplifiable.SetCompact(true)
15351555 }
@@ -3289,6 +3309,7 @@ func (m *UI) openEditor(value string) tea.Cmd {
32893309 tmpPath := tmpfile.Name()
32903310 defer tmpfile.Close()
32913311 if _, err := tmpfile.WriteString(value); err != nil {
3312+ _ = os.Remove(tmpPath)
32923313 return util.ReportError(err)
32933314 }
32943315 cmd, err := editor.Command(
@@ -3300,6 +3321,7 @@ func (m *UI) openEditor(value string) tea.Cmd {
33003321 ),
33013322 )
33023323 if err != nil {
3324+ _ = os.Remove(tmpPath)
33033325 return util.ReportError(err)
33043326 }
33053327 return tea.ExecProcess(cmd, func(err error) tea.Msg {
vendor/charm.land/bubbles/v2/LICENSEnew file+21
@@ -0,0 +1,21 @@
1+MIT License
2+
3+Copyright (c) 2020-2026 Charmbracelet, Inc.
4+
5+Permission is hereby granted, free of charge, to any person obtaining a copy
6+of this software and associated documentation files (the "Software"), to deal
7+in the Software without restriction, including without limitation the rights
8+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+copies of the Software, and to permit persons to whom the Software is
10+furnished to do so, subject to the following conditions:
11+
12+The above copyright notice and this permission notice shall be included in all
13+copies or substantial portions of the Software.
14+
15+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+SOFTWARE.
vendor/charm.land/bubbles/v2/cursor/cursor.gonew file+241
@@ -0,0 +1,241 @@
1+// Package cursor provides a virtual cursor to support the textinput and
2+// textarea elements.
3+package cursor
4+
5+import (
6+ "context"
7+ "sync/atomic"
8+ "time"
9+
10+ tea "charm.land/bubbletea/v2"
11+ "charm.land/lipgloss/v2"
12+)
13+
14+const defaultBlinkSpeed = time.Millisecond * 530
15+
16+// Internal ID management. Used during animating to ensure that frame messages
17+// are received only by spinner components that sent them.
18+var lastID int64
19+
20+func nextID() int {
21+ return int(atomic.AddInt64(&lastID, 1))
22+}
23+
24+// initialBlinkMsg initializes cursor blinking.
25+type initialBlinkMsg struct{}
26+
27+// BlinkMsg signals that the cursor should blink. It contains metadata that
28+// allows us to tell if the blink message is the one we're expecting.
29+type BlinkMsg struct {
30+ id int
31+ tag int
32+}
33+
34+// blinkCanceled is sent when a blink operation is canceled.
35+type blinkCanceled struct{}
36+
37+// blinkCtx manages cursor blinking.
38+type blinkCtx struct {
39+ ctx context.Context
40+ cancel context.CancelFunc
41+}
42+
43+// Mode describes the behavior of the cursor.
44+type Mode int
45+
46+// Available cursor modes.
47+const (
48+ CursorBlink Mode = iota
49+ CursorStatic
50+ CursorHide
51+)
52+
53+// String returns the cursor mode in a human-readable format. This method is
54+// provisional and for informational purposes only.
55+func (c Mode) String() string {
56+ return [...]string{
57+ "blink",
58+ "static",
59+ "hidden",
60+ }[c]
61+}
62+
63+// Model is the Bubble Tea model for this cursor element.
64+type Model struct {
65+ // Style styles the cursor block.
66+ Style lipgloss.Style
67+
68+ // TextStyle is the style used for the cursor when it is blinking
69+ // (hidden), i.e. displaying normal text.
70+ TextStyle lipgloss.Style
71+
72+ // BlinkSpeed is the speed at which the cursor blinks. This has no effect
73+ // unless [CursorMode] is not set to [CursorBlink].
74+ BlinkSpeed time.Duration
75+
76+ // IsBlinked is the state of the cursor blink. When true, the cursor is
77+ // hidden.
78+ IsBlinked bool
79+
80+ // char is the character under the cursor
81+ char string
82+
83+ // The ID of this Model as it relates to other cursors
84+ id int
85+
86+ // focus indicates whether the containing input is focused
87+ focus bool
88+
89+ // Used to manage cursor blink
90+ blinkCtx *blinkCtx
91+
92+ // The ID of the blink message we're expecting to receive.
93+ blinkTag int
94+
95+ // mode determines the behavior of the cursor
96+ mode Mode
97+}
98+
99+// New creates a new model with default settings.
100+func New() Model {
101+ return Model{
102+ id: nextID(),
103+ BlinkSpeed: defaultBlinkSpeed,
104+ IsBlinked: true,
105+ mode: CursorBlink,
106+
107+ blinkCtx: &blinkCtx{
108+ ctx: context.Background(),
109+ },
110+ }
111+}
112+
113+// Update updates the cursor.
114+func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
115+ switch msg := msg.(type) {
116+ case initialBlinkMsg:
117+ // We accept all initialBlinkMsgs generated by the Blink command.
118+
119+ if m.mode != CursorBlink || !m.focus {
120+ return m, nil
121+ }
122+
123+ cmd := m.Blink()
124+ return m, cmd
125+
126+ case tea.FocusMsg:
127+ return m, m.Focus()
128+
129+ case tea.BlurMsg:
130+ m.Blur()
131+ return m, nil
132+
133+ case BlinkMsg:
134+ // We're choosy about whether to accept blinkMsgs so that our cursor
135+ // only exactly when it should.
136+
137+ // Is this model blink-able?
138+ if m.mode != CursorBlink || !m.focus {
139+ return m, nil
140+ }
141+
142+ // Were we expecting this blink message?
143+ if msg.id != m.id || msg.tag != m.blinkTag {
144+ return m, nil
145+ }
146+
147+ var cmd tea.Cmd
148+ if m.mode == CursorBlink {
149+ m.IsBlinked = !m.IsBlinked
150+ cmd = m.Blink()
151+ }
152+ return m, cmd
153+
154+ case blinkCanceled: // no-op
155+ return m, nil
156+ }
157+ return m, nil
158+}
159+
160+// Mode returns the model's cursor mode. For available cursor modes, see
161+// type Mode.
162+func (m Model) Mode() Mode {
163+ return m.mode
164+}
165+
166+// SetMode sets the model's cursor mode. This method returns a command.
167+//
168+// For available cursor modes, see type CursorMode.
169+func (m *Model) SetMode(mode Mode) tea.Cmd {
170+ // Adjust the mode value if it's value is out of range
171+ if mode < CursorBlink || mode > CursorHide {
172+ return nil
173+ }
174+ m.mode = mode
175+ m.IsBlinked = m.mode == CursorHide || !m.focus
176+ if mode == CursorBlink {
177+ return Blink
178+ }
179+ return nil
180+}
181+
182+// Blink is a command used to manage cursor blinking.
183+func (m *Model) Blink() tea.Cmd {
184+ if m.mode != CursorBlink {
185+ return nil
186+ }
187+
188+ if m.blinkCtx != nil && m.blinkCtx.cancel != nil {
189+ m.blinkCtx.cancel()
190+ }
191+
192+ ctx, cancel := context.WithTimeout(m.blinkCtx.ctx, m.BlinkSpeed)
193+ m.blinkCtx.cancel = cancel
194+
195+ m.blinkTag++
196+ blinkMsg := BlinkMsg{id: m.id, tag: m.blinkTag}
197+
198+ return func() tea.Msg {
199+ defer cancel()
200+ <-ctx.Done()
201+ if ctx.Err() == context.DeadlineExceeded {
202+ return blinkMsg
203+ }
204+ return blinkCanceled{}
205+ }
206+}
207+
208+// Blink is a command used to initialize cursor blinking.
209+func Blink() tea.Msg {
210+ return initialBlinkMsg{}
211+}
212+
213+// Focus focuses the cursor to allow it to blink if desired.
214+func (m *Model) Focus() tea.Cmd {
215+ m.focus = true
216+ m.IsBlinked = m.mode == CursorHide // show the cursor unless we've explicitly hidden it
217+
218+ if m.mode == CursorBlink && m.focus {
219+ return m.Blink()
220+ }
221+ return nil
222+}
223+
224+// Blur blurs the cursor.
225+func (m *Model) Blur() {
226+ m.focus = false
227+ m.IsBlinked = true
228+}
229+
230+// SetChar sets the character under the cursor.
231+func (m *Model) SetChar(char string) {
232+ m.char = char
233+}
234+
235+// View displays the cursor.
236+func (m Model) View() string {
237+ if m.IsBlinked {
238+ return m.TextStyle.Inline(true).Render(m.char)
239+ }
240+ return m.Style.Inline(true).Reverse(true).Render(m.char)
241+}
vendor/charm.land/bubbles/v2/filepicker/filepicker.gonew file+529
@@ -0,0 +1,529 @@
1+// Package filepicker provides a file picker component for Bubble Tea
2+// applications.
3+package filepicker
4+
5+import (
6+ "fmt"
7+ "os"
8+ "path/filepath"
9+ "sort"
10+ "strconv"
11+ "strings"
12+ "sync/atomic"
13+
14+ "charm.land/bubbles/v2/key"
15+ tea "charm.land/bubbletea/v2"
16+ "charm.land/lipgloss/v2"
17+ "github.com/dustin/go-humanize"
18+)
19+
20+var lastID int64
21+
22+func nextID() int {
23+ return int(atomic.AddInt64(&lastID, 1))
24+}
25+
26+// New returns a new filepicker model with default styling and key bindings.
27+func New() Model {
28+ return Model{
29+ id: nextID(),
30+ CurrentDirectory: ".",
31+ Cursor: ">",
32+ AllowedTypes: []string{},
33+ selected: 0,
34+ ShowPermissions: true,
35+ ShowSize: true,
36+ ShowHidden: false,
37+ DirAllowed: false,
38+ FileAllowed: true,
39+ AutoHeight: true,
40+ height: 0,
41+ maxIdx: 0,
42+ minIdx: 0,
43+ selectedStack: newStack(),
44+ minStack: newStack(),
45+ maxStack: newStack(),
46+ KeyMap: DefaultKeyMap(),
47+ Styles: DefaultStyles(),
48+ }
49+}
50+
51+type errorMsg struct {
52+ err error
53+}
54+
55+type readDirMsg struct {
56+ id int
57+ entries []os.DirEntry
58+}
59+
60+const (
61+ marginBottom = 5
62+ fileSizeWidth = 7
63+ paddingLeft = 2
64+)
65+
66+// KeyMap defines key bindings for each user action.
67+type KeyMap struct {
68+ GoToTop key.Binding
69+ GoToLast key.Binding
70+ Down key.Binding
71+ Up key.Binding
72+ PageUp key.Binding
73+ PageDown key.Binding
74+ Back key.Binding
75+ Open key.Binding
76+ Select key.Binding
77+}
78+
79+// DefaultKeyMap defines the default keybindings.
80+func DefaultKeyMap() KeyMap {
81+ return KeyMap{
82+ GoToTop: key.NewBinding(key.WithKeys("g"), key.WithHelp("g", "first")),
83+ GoToLast: key.NewBinding(key.WithKeys("G"), key.WithHelp("G", "last")),
84+ Down: key.NewBinding(key.WithKeys("j", "down", "ctrl+n"), key.WithHelp("j", "down")),
85+ Up: key.NewBinding(key.WithKeys("k", "up", "ctrl+p"), key.WithHelp("k", "up")),
86+ PageUp: key.NewBinding(key.WithKeys("K", "pgup"), key.WithHelp("pgup", "page up")),
87+ PageDown: key.NewBinding(key.WithKeys("J", "pgdown"), key.WithHelp("pgdown", "page down")),
88+ Back: key.NewBinding(key.WithKeys("h", "backspace", "left", "esc"), key.WithHelp("h", "back")),
89+ Open: key.NewBinding(key.WithKeys("l", "right", "enter"), key.WithHelp("l", "open")),
90+ Select: key.NewBinding(key.WithKeys("enter"), key.WithHelp("enter", "select")),
91+ }
92+}
93+
94+// Styles defines the possible customizations for styles in the file picker.
95+type Styles struct {
96+ DisabledCursor lipgloss.Style
97+ Cursor lipgloss.Style
98+ Symlink lipgloss.Style
99+ Directory lipgloss.Style
100+ File lipgloss.Style
101+ DisabledFile lipgloss.Style
102+ Permission lipgloss.Style
103+ Selected lipgloss.Style
104+ DisabledSelected lipgloss.Style
105+ FileSize lipgloss.Style
106+ EmptyDirectory lipgloss.Style
107+}
108+
109+// DefaultStyles defines the default styling for the file picker.
110+func DefaultStyles() Styles {
111+ return Styles{
112+ DisabledCursor: lipgloss.NewStyle().Foreground(lipgloss.Color("247")),
113+ Cursor: lipgloss.NewStyle().Foreground(lipgloss.Color("212")),
114+ Symlink: lipgloss.NewStyle().Foreground(lipgloss.Color("36")),
115+ Directory: lipgloss.NewStyle().Foreground(lipgloss.Color("99")),
116+ File: lipgloss.NewStyle(),
117+ DisabledFile: lipgloss.NewStyle().Foreground(lipgloss.Color("243")),
118+ DisabledSelected: lipgloss.NewStyle().Foreground(lipgloss.Color("247")),
119+ Permission: lipgloss.NewStyle().Foreground(lipgloss.Color("244")),
120+ Selected: lipgloss.NewStyle().Foreground(lipgloss.Color("212")).Bold(true),
121+ FileSize: lipgloss.NewStyle().Foreground(lipgloss.Color("240")).Width(fileSizeWidth).Align(lipgloss.Right),
122+ EmptyDirectory: lipgloss.NewStyle().Foreground(lipgloss.Color("240")).PaddingLeft(paddingLeft).SetString("Bummer. No Files Found."),
123+ }
124+}
125+
126+// Model represents a file picker.
127+type Model struct {
128+ id int
129+
130+ // Path is the path which the user has selected with the file picker.
131+ Path string
132+
133+ // CurrentDirectory is the directory that the user is currently in.
134+ CurrentDirectory string
135+
136+ // AllowedTypes specifies which file types the user may select.
137+ // If empty the user may select any file.
138+ AllowedTypes []string
139+
140+ KeyMap KeyMap
141+ files []os.DirEntry
142+ ShowPermissions bool
143+ ShowSize bool
144+ ShowHidden bool
145+ DirAllowed bool
146+ FileAllowed bool
147+
148+ FileSelected string
149+ selected int
150+ selectedStack stack
151+
152+ minIdx int
153+ maxIdx int
154+ maxStack stack
155+ minStack stack
156+
157+ height int
158+ AutoHeight bool
159+
160+ Cursor string
161+ Styles Styles
162+}
163+
164+type stack struct {
165+ Push func(int)
166+ Pop func() int
167+ Length func() int
168+}
169+
170+func newStack() stack {
171+ slice := make([]int, 0)
172+ return stack{
173+ Push: func(i int) {
174+ slice = append(slice, i)
175+ },
176+ Pop: func() int {
177+ res := slice[len(slice)-1]
178+ slice = slice[:len(slice)-1]
179+ return res
180+ },
181+ Length: func() int {
182+ return len(slice)
183+ },
184+ }
185+}
186+
187+func (m *Model) pushView(selected, minimum, maximum int) {
188+ m.selectedStack.Push(selected)
189+ m.minStack.Push(minimum)
190+ m.maxStack.Push(maximum)
191+}
192+
193+func (m *Model) popView() (int, int, int) {
194+ return m.selectedStack.Pop(), m.minStack.Pop(), m.maxStack.Pop()
195+}
196+
197+func (m Model) readDir(path string, showHidden bool) tea.Cmd {
198+ return func() tea.Msg {
199+ dirEntries, err := os.ReadDir(path)
200+ if err != nil {
201+ return errorMsg{err}
202+ }
203+
204+ sort.Slice(dirEntries, func(i, j int) bool {
205+ if dirEntries[i].IsDir() == dirEntries[j].IsDir() {
206+ return dirEntries[i].Name() < dirEntries[j].Name()
207+ }
208+ return dirEntries[i].IsDir()
209+ })
210+
211+ if showHidden {
212+ return readDirMsg{id: m.id, entries: dirEntries}
213+ }
214+
215+ var sanitizedDirEntries []os.DirEntry
216+ for _, dirEntry := range dirEntries {
217+ isHidden, _ := IsHidden(dirEntry.Name())
218+ if isHidden {
219+ continue
220+ }
221+ sanitizedDirEntries = append(sanitizedDirEntries, dirEntry)
222+ }
223+ return readDirMsg{id: m.id, entries: sanitizedDirEntries}
224+ }
225+}
226+
227+// SetHeight sets the height of the file picker.
228+func (m *Model) SetHeight(h int) {
229+ m.height = h
230+ if m.maxIdx > m.height-1 {
231+ m.maxIdx = m.minIdx + m.height - 1
232+ }
233+}
234+
235+// Height returns the height of the file picker.
236+func (m Model) Height() int {
237+ return m.height
238+}
239+
240+// Init initializes the file picker model.
241+func (m Model) Init() tea.Cmd {
242+ return m.readDir(m.CurrentDirectory, m.ShowHidden)
243+}
244+
245+// Update handles user interactions within the file picker model.
246+func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
247+ switch msg := msg.(type) {
248+ case readDirMsg:
249+ if msg.id != m.id {
250+ break
251+ }
252+ m.files = msg.entries
253+ m.maxIdx = max(m.maxIdx, m.Height()-1)
254+ case tea.WindowSizeMsg:
255+ if m.AutoHeight {
256+ m.SetHeight(msg.Height - marginBottom)
257+ }
258+ m.maxIdx = m.Height() - 1
259+ case tea.KeyPressMsg:
260+ switch {
261+ case key.Matches(msg, m.KeyMap.GoToTop):
262+ m.selected = 0
263+ m.minIdx = 0
264+ m.maxIdx = m.Height() - 1
265+ case key.Matches(msg, m.KeyMap.GoToLast):
266+ m.selected = len(m.files) - 1
267+ m.minIdx = len(m.files) - m.Height()
268+ m.maxIdx = len(m.files) - 1
269+ case key.Matches(msg, m.KeyMap.Down):
270+ m.selected++
271+ if m.selected >= len(m.files) {
272+ m.selected = len(m.files) - 1
273+ }
274+ if m.selected > m.maxIdx {
275+ m.minIdx++
276+ m.maxIdx++
277+ }
278+ case key.Matches(msg, m.KeyMap.Up):
279+ m.selected--
280+ if m.selected < 0 {
281+ m.selected = 0
282+ }
283+ if m.selected < m.minIdx {
284+ m.minIdx--
285+ m.maxIdx--
286+ }
287+ case key.Matches(msg, m.KeyMap.PageDown):
288+ m.selected += m.Height()
289+ if m.selected >= len(m.files) {
290+ m.selected = len(m.files) - 1
291+ }
292+ m.minIdx += m.Height()
293+ m.maxIdx += m.Height()
294+
295+ if m.maxIdx >= len(m.files) {
296+ m.maxIdx = len(m.files) - 1
297+ m.minIdx = m.maxIdx - m.Height()
298+ }
299+ case key.Matches(msg, m.KeyMap.PageUp):
300+ m.selected -= m.Height()
301+ if m.selected < 0 {
302+ m.selected = 0
303+ }
304+ m.minIdx -= m.Height()
305+ m.maxIdx -= m.Height()
306+
307+ if m.minIdx < 0 {
308+ m.minIdx = 0
309+ m.maxIdx = m.minIdx + m.Height()
310+ }
311+ case key.Matches(msg, m.KeyMap.Back):
312+ m.CurrentDirectory = filepath.Dir(m.CurrentDirectory)
313+ if m.selectedStack.Length() > 0 {
314+ m.selected, m.minIdx, m.maxIdx = m.popView()
315+ } else {
316+ m.selected = 0
317+ m.minIdx = 0
318+ m.maxIdx = m.Height() - 1
319+ }
320+ return m, m.readDir(m.CurrentDirectory, m.ShowHidden)
321+ case key.Matches(msg, m.KeyMap.Open):
322+ if len(m.files) == 0 {
323+ break
324+ }
325+
326+ f := m.files[m.selected]
327+ info, err := f.Info()
328+ if err != nil {
329+ break
330+ }
331+ isSymlink := info.Mode()&os.ModeSymlink != 0
332+ isDir := f.IsDir()
333+
334+ if isSymlink {
335+ symlinkPath, _ := filepath.EvalSymlinks(filepath.Join(m.CurrentDirectory, f.Name()))
336+ info, err := os.Stat(symlinkPath)
337+ if err != nil {
338+ break
339+ }
340+ if info.IsDir() {
341+ isDir = true
342+ }
343+ }
344+
345+ if (!isDir && m.FileAllowed) || (isDir && m.DirAllowed) {
346+ if key.Matches(msg, m.KeyMap.Select) {
347+ // Select the current path as the selection
348+ m.Path = filepath.Join(m.CurrentDirectory, f.Name())
349+ }
350+ }
351+
352+ if !isDir {
353+ break
354+ }
355+
356+ m.CurrentDirectory = filepath.Join(m.CurrentDirectory, f.Name())
357+ m.pushView(m.selected, m.minIdx, m.maxIdx)
358+ m.selected = 0
359+ m.minIdx = 0
360+ m.maxIdx = m.Height() - 1
361+ return m, m.readDir(m.CurrentDirectory, m.ShowHidden)
362+ }
363+ }
364+ return m, nil
365+}
366+
367+// View returns the view of the file picker.
368+func (m Model) View() string {
369+ if len(m.files) == 0 {
370+ return m.Styles.EmptyDirectory.Height(m.Height()).MaxHeight(m.Height()).String()
371+ }
372+ var s strings.Builder
373+
374+ for i, f := range m.files {
375+ if i < m.minIdx || i > m.maxIdx {
376+ continue
377+ }
378+
379+ var symlinkPath string
380+ info, err := f.Info()
381+ if err != nil {
382+ continue
383+ }
384+ isSymlink := info.Mode()&os.ModeSymlink != 0
385+ size := strings.Replace(humanize.Bytes(uint64(info.Size())), " ", "", 1) //nolint:gosec
386+ name := f.Name()
387+
388+ if isSymlink {
389+ symlinkPath, _ = filepath.EvalSymlinks(filepath.Join(m.CurrentDirectory, name))
390+ }
391+
392+ disabled := !m.canSelect(name) && !f.IsDir()
393+
394+ if m.selected == i { //nolint:nestif
395+ selected := ""
396+ if m.ShowPermissions {
397+ selected += " " + info.Mode().String()
398+ }
399+ if m.ShowSize {
400+ selected += fmt.Sprintf("%"+strconv.Itoa(m.Styles.FileSize.GetWidth())+"s", size)
401+ }
402+ selected += " " + name
403+ if isSymlink {
404+ selected += " → " + symlinkPath
405+ }
406+ if disabled {
407+ s.WriteString(m.Styles.DisabledCursor.Render(m.Cursor) + m.Styles.DisabledSelected.Render(selected))
408+ } else {
409+ s.WriteString(m.Styles.Cursor.Render(m.Cursor) + m.Styles.Selected.Render(selected))
410+ }
411+ s.WriteRune('\n')
412+ continue
413+ }
414+
415+ style := m.Styles.File
416+ if f.IsDir() {
417+ style = m.Styles.Directory
418+ } else if isSymlink {
419+ style = m.Styles.Symlink
420+ } else if disabled {
421+ style = m.Styles.DisabledFile
422+ }
423+
424+ fileName := style.Render(name)
425+ s.WriteString(m.Styles.Cursor.Render(" "))
426+ if isSymlink {
427+ fileName += " → " + symlinkPath
428+ }
429+ if m.ShowPermissions {
430+ s.WriteString(" " + m.Styles.Permission.Render(info.Mode().String()))
431+ }
432+ if m.ShowSize {
433+ s.WriteString(m.Styles.FileSize.Render(size))
434+ }
435+ s.WriteString(" " + fileName)
436+ s.WriteRune('\n')
437+ }
438+
439+ for i := lipgloss.Height(s.String()); i <= m.Height(); i++ {
440+ s.WriteRune('\n')
441+ }
442+
443+ return s.String()
444+}
445+
446+// DidSelectFile returns whether a user has selected a file (on this msg).
447+func (m Model) DidSelectFile(msg tea.Msg) (bool, string) {
448+ didSelect, path := m.didSelectFile(msg)
449+ if didSelect && m.canSelect(path) {
450+ return true, path
451+ }
452+ return false, ""
453+}
454+
455+// DidSelectDisabledFile returns whether a user tried to select a disabled file
456+// (on this msg). This is necessary only if you would like to warn the user that
457+// they tried to select a disabled file.
458+func (m Model) DidSelectDisabledFile(msg tea.Msg) (bool, string) {
459+ didSelect, path := m.didSelectFile(msg)
460+ if didSelect && !m.canSelect(path) {
461+ return true, path
462+ }
463+ return false, ""
464+}
465+
466+func (m Model) didSelectFile(msg tea.Msg) (bool, string) {
467+ if len(m.files) == 0 {
468+ return false, ""
469+ }
470+ switch msg := msg.(type) {
471+ case tea.KeyPressMsg:
472+ // If the msg does not match the Select keymap then this could not have been a selection.
473+ if !key.Matches(msg, m.KeyMap.Select) {
474+ return false, ""
475+ }
476+
477+ // The key press was a selection, let's confirm whether the current file could
478+ // be selected or used for navigating deeper into the stack.
479+ f := m.files[m.selected]
480+ info, err := f.Info()
481+ if err != nil {
482+ return false, ""
483+ }
484+ isSymlink := info.Mode()&os.ModeSymlink != 0
485+ isDir := f.IsDir()
486+
487+ if isSymlink {
488+ symlinkPath, _ := filepath.EvalSymlinks(filepath.Join(m.CurrentDirectory, f.Name()))
489+ info, err := os.Stat(symlinkPath)
490+ if err != nil {
491+ break
492+ }
493+ if info.IsDir() {
494+ isDir = true
495+ }
496+ }
497+
498+ if (!isDir && m.FileAllowed) || (isDir && m.DirAllowed) && m.Path != "" {
499+ return true, m.Path
500+ }
501+
502+ // If the msg was not a KeyPressMsg, then the file could not have been selected this iteration.
503+ // Only a KeyPressMsg can select a file.
504+ default:
505+ return false, ""
506+ }
507+ return false, ""
508+}
509+
510+func (m Model) canSelect(file string) bool {
511+ if len(m.AllowedTypes) <= 0 {
512+ return true
513+ }
514+
515+ for _, ext := range m.AllowedTypes {
516+ if strings.HasSuffix(file, ext) {
517+ return true
518+ }
519+ }
520+ return false
521+}
522+
523+// HighlightedPath returns the path of the currently highlighted file or directory.
524+func (m Model) HighlightedPath() string {
525+ if len(m.files) == 0 || m.selected < 0 || m.selected >= len(m.files) {
526+ return ""
527+ }
528+ return filepath.Join(m.CurrentDirectory, m.files[m.selected].Name())
529+}
vendor/charm.land/bubbles/v2/filepicker/hidden_unix.gonew file+11
@@ -0,0 +1,11 @@
1+//go:build !windows
2+// +build !windows
3+
4+package filepicker
5+
6+import "strings"
7+
8+// IsHidden reports whether a file is hidden or not.
9+func IsHidden(file string) (bool, error) {
10+ return strings.HasPrefix(file, "."), nil
11+}
vendor/charm.land/bubbles/v2/filepicker/hidden_windows.gonew file+21
@@ -0,0 +1,21 @@
1+//go:build windows
2+// +build windows
3+
4+package filepicker
5+
6+import (
7+ "syscall"
8+)
9+
10+// IsHidden reports whether a file is hidden or not.
11+func IsHidden(file string) (bool, error) {
12+ pointer, err := syscall.UTF16PtrFromString(file)
13+ if err != nil {
14+ return false, err //nolint:wrapcheck
15+ }
16+ attributes, err := syscall.GetFileAttributes(pointer)
17+ if err != nil {
18+ return false, err //nolint:wrapcheck
19+ }
20+ return attributes&syscall.FILE_ATTRIBUTE_HIDDEN != 0, nil
21+}
vendor/charm.land/bubbles/v2/help/help.gonew file+253
@@ -0,0 +1,253 @@
1+// Package help provides a simple help view for Bubble Tea applications.
2+package help
3+
4+import (
5+ "strings"
6+
7+ "charm.land/bubbles/v2/key"
8+ tea "charm.land/bubbletea/v2"
9+ "charm.land/lipgloss/v2"
10+)
11+
12+// KeyMap is a map of keybindings used to generate help. Since it's an
13+// interface it can be any type, though struct or a map[string][]key.Binding
14+// are likely candidates.
15+//
16+// Note that if a key is disabled (via key.Binding.SetEnabled) it will not be
17+// rendered in the help view, so in theory generated help should self-manage.
18+type KeyMap interface {
19+ // ShortHelp returns a slice of bindings to be displayed in the short
20+ // version of the help. The help bubble will render help in the order in
21+ // which the help items are returned here.
22+ ShortHelp() []key.Binding
23+
24+ // FullHelp returns an extended group of help items, grouped by columns.
25+ // The help bubble will render the help in the order in which the help
26+ // items are returned here.
27+ FullHelp() [][]key.Binding
28+}
29+
30+// Styles is a set of available style definitions for the Help bubble.
31+type Styles struct {
32+ Ellipsis lipgloss.Style
33+
34+ // Styling for the short help
35+ ShortKey lipgloss.Style
36+ ShortDesc lipgloss.Style
37+ ShortSeparator lipgloss.Style
38+
39+ // Styling for the full help
40+ FullKey lipgloss.Style
41+ FullDesc lipgloss.Style
42+ FullSeparator lipgloss.Style
43+}
44+
45+// DefaultStyles returns a set of default styles for the help bubble. Light or
46+// dark styles can be selected by passing true or false to the isDark
47+// parameter.
48+func DefaultStyles(isDark bool) Styles {
49+ lightDark := lipgloss.LightDark(isDark)
50+
51+ keyStyle := lipgloss.NewStyle().Foreground(lightDark(lipgloss.Color("#909090"), lipgloss.Color("#626262")))
52+ descStyle := lipgloss.NewStyle().Foreground(lightDark(lipgloss.Color("#B2B2B2"), lipgloss.Color("#4A4A4A")))
53+ sepStyle := lipgloss.NewStyle().Foreground(lightDark(lipgloss.Color("#DADADA"), lipgloss.Color("#3C3C3C")))
54+
55+ return Styles{
56+ ShortKey: keyStyle,
57+ ShortDesc: descStyle,
58+ ShortSeparator: sepStyle,
59+ Ellipsis: sepStyle,
60+ FullKey: keyStyle,
61+ FullDesc: descStyle,
62+ FullSeparator: sepStyle,
63+ }
64+}
65+
66+// DefaultDarkStyles returns a set of default styles for dark backgrounds.
67+func DefaultDarkStyles() Styles {
68+ return DefaultStyles(true)
69+}
70+
71+// DefaultLightStyles returns a set of default styles for light backgrounds.
72+func DefaultLightStyles() Styles {
73+ return DefaultStyles(false)
74+}
75+
76+// Model contains the state of the help view.
77+type Model struct {
78+ ShowAll bool // if true, render the "full" help menu
79+
80+ ShortSeparator string
81+ FullSeparator string
82+
83+ // The symbol we use in the short help when help items have been truncated
84+ // due to width. Periods of ellipsis by default.
85+ Ellipsis string
86+
87+ Styles Styles
88+
89+ width int
90+}
91+
92+// New creates a new help view with some useful defaults.
93+func New() Model {
94+ return Model{
95+ ShortSeparator: " • ",
96+ FullSeparator: " ",
97+ Ellipsis: "…",
98+ Styles: DefaultDarkStyles(),
99+ }
100+}
101+
102+// Update helps satisfy the Bubble Tea Model interface. It's a no-op.
103+func (m Model) Update(_ tea.Msg) (Model, tea.Cmd) {
104+ return m, nil
105+}
106+
107+// View renders the help view's current state.
108+func (m Model) View(k KeyMap) string {
109+ if m.ShowAll {
110+ return m.FullHelpView(k.FullHelp())
111+ }
112+ return m.ShortHelpView(k.ShortHelp())
113+}
114+
115+// SetWidth sets the maximum width for the help view.
116+func (m *Model) SetWidth(w int) {
117+ m.width = w
118+}
119+
120+// Width returns the maximum width for the help view.
121+func (m Model) Width() int {
122+ return m.width
123+}
124+
125+// ShortHelpView renders a single line help view from a slice of keybindings.
126+// If the line is longer than the maximum width it will be gracefully
127+// truncated, showing only as many help items as possible.
128+func (m Model) ShortHelpView(bindings []key.Binding) string {
129+ if len(bindings) == 0 {
130+ return ""
131+ }
132+
133+ var b strings.Builder
134+ var totalWidth int
135+ separator := m.Styles.ShortSeparator.Inline(true).Render(m.ShortSeparator)
136+
137+ for i, kb := range bindings {
138+ if !kb.Enabled() {
139+ continue
140+ }
141+
142+ // Sep
143+ var sep string
144+ if totalWidth > 0 && i < len(bindings) {
145+ sep = separator
146+ }
147+
148+ // Item
149+ str := sep +
150+ m.Styles.ShortKey.Inline(true).Render(kb.Help().Key) + " " +
151+ m.Styles.ShortDesc.Inline(true).Render(kb.Help().Desc)
152+ w := lipgloss.Width(str)
153+
154+ // Tail
155+ if tail, ok := m.shouldAddItem(totalWidth, w); !ok {
156+ if tail != "" {
157+ b.WriteString(tail)
158+ }
159+ break
160+ }
161+
162+ totalWidth += w
163+ b.WriteString(str)
164+ }
165+
166+ return b.String()
167+}
168+
169+// FullHelpView renders help columns from a slice of key binding slices. Each
170+// top level slice entry renders into a column.
171+func (m Model) FullHelpView(groups [][]key.Binding) string {
172+ if len(groups) == 0 {
173+ return ""
174+ }
175+
176+ // Linter note: at this time we don't think it's worth the additional
177+ // code complexity involved in preallocating this slice.
178+ var (
179+ out []string
180+
181+ totalWidth int
182+ separator = m.Styles.FullSeparator.Inline(true).Render(m.FullSeparator)
183+ )
184+
185+ // Iterate over groups to build columns
186+ for i, group := range groups {
187+ if group == nil || !shouldRenderColumn(group) {
188+ continue
189+ }
190+ var (
191+ sep string
192+ keys []string
193+ descriptions []string
194+ )
195+
196+ // Sep
197+ if totalWidth > 0 && i < len(groups) {
198+ sep = separator
199+ }
200+
201+ // Separate keys and descriptions into different slices
202+ for _, kb := range group {
203+ if !kb.Enabled() {
204+ continue
205+ }
206+ keys = append(keys, kb.Help().Key)
207+ descriptions = append(descriptions, kb.Help().Desc)
208+ }
209+
210+ // Column
211+ col := lipgloss.JoinHorizontal(lipgloss.Top,
212+ sep,
213+ m.Styles.FullKey.Render(strings.Join(keys, "\n")),
214+ " ",
215+ m.Styles.FullDesc.Render(strings.Join(descriptions, "\n")),
216+ )
217+ w := lipgloss.Width(col)
218+
219+ // Tail
220+ if tail, ok := m.shouldAddItem(totalWidth, w); !ok {
221+ if tail != "" {
222+ out = append(out, tail)
223+ }
224+ break
225+ }
226+
227+ totalWidth += w
228+ out = append(out, col)
229+ }
230+
231+ return lipgloss.JoinHorizontal(lipgloss.Top, out...)
232+}
233+
234+func (m Model) shouldAddItem(totalWidth, width int) (tail string, ok bool) {
235+ // If there's room for an ellipsis, print that.
236+ if m.width > 0 && totalWidth+width > m.width {
237+ tail = " " + m.Styles.Ellipsis.Inline(true).Render(m.Ellipsis)
238+
239+ if totalWidth+lipgloss.Width(tail) < m.width {
240+ return tail, false
241+ }
242+ }
243+ return "", true
244+}
245+
246+func shouldRenderColumn(b []key.Binding) (ok bool) {
247+ for _, v := range b {
248+ if v.Enabled() {
249+ return true
250+ }
251+ }
252+ return false
253+}
vendor/charm.land/bubbles/v2/internal/memoization/memoization.gonew file+125
@@ -0,0 +1,125 @@
1+// Package memoization implement a simple memoization cache. It's designed to
2+// improve performance in textarea.
3+package memoization
4+
5+import (
6+ "container/list"
7+ "crypto/sha256"
8+ "fmt"
9+ "sync"
10+)
11+
12+// Hasher is an interface that requires a Hash method. The Hash method is
13+// expected to return a string representation of the hash of the object.
14+type Hasher interface {
15+ Hash() string
16+}
17+
18+// entry is a struct that holds a key-value pair. It is used as an element
19+// in the evictionList of the MemoCache.
20+type entry[T any] struct {
21+ key string
22+ value T
23+}
24+
25+// MemoCache is a struct that represents a cache with a set capacity. It
26+// uses an LRU (Least Recently Used) eviction policy. It is safe for
27+// concurrent use.
28+type MemoCache[H Hasher, T any] struct {
29+ capacity int
30+ mutex sync.Mutex
31+ cache map[string]*list.Element // The cache holding the results
32+ evictionList *list.List // A list to keep track of the order for LRU
33+ hashableItems map[string]T // This map keeps track of the original hashable items (optional)
34+}
35+
36+// NewMemoCache is a function that creates a new MemoCache with a given
37+// capacity. It returns a pointer to the created MemoCache.
38+func NewMemoCache[H Hasher, T any](capacity int) *MemoCache[H, T] {
39+ return &MemoCache[H, T]{
40+ capacity: capacity,
41+ cache: make(map[string]*list.Element),
42+ evictionList: list.New(),
43+ hashableItems: make(map[string]T),
44+ }
45+}
46+
47+// Capacity is a method that returns the capacity of the MemoCache.
48+func (m *MemoCache[H, T]) Capacity() int {
49+ return m.capacity
50+}
51+
52+// Size is a method that returns the current size of the MemoCache. It is
53+// the number of items currently stored in the cache.
54+func (m *MemoCache[H, T]) Size() int {
55+ m.mutex.Lock()
56+ defer m.mutex.Unlock()
57+ return m.evictionList.Len()
58+}
59+
60+// Get is a method that returns the value associated with the given
61+// hashable item in the MemoCache. If there is no corresponding value, the
62+// method returns nil.
63+func (m *MemoCache[H, T]) Get(h H) (T, bool) {
64+ m.mutex.Lock()
65+ defer m.mutex.Unlock()
66+
67+ hashedKey := h.Hash()
68+ if element, found := m.cache[hashedKey]; found {
69+ m.evictionList.MoveToFront(element)
70+ return element.Value.(*entry[T]).value, true
71+ }
72+ var result T
73+ return result, false
74+}
75+
76+// Set is a method that sets the value for the given hashable item in the
77+// MemoCache. If the cache is at capacity, it evicts the least recently
78+// used item before adding the new item.
79+func (m *MemoCache[H, T]) Set(h H, value T) {
80+ m.mutex.Lock()
81+ defer m.mutex.Unlock()
82+
83+ hashedKey := h.Hash()
84+ if element, found := m.cache[hashedKey]; found {
85+ m.evictionList.MoveToFront(element)
86+ element.Value.(*entry[T]).value = value
87+ return
88+ }
89+
90+ // Check if the cache is at capacity
91+ if m.evictionList.Len() >= m.capacity {
92+ // Evict the least recently used item from the cache
93+ toEvict := m.evictionList.Back()
94+ if toEvict != nil {
95+ evictedEntry := m.evictionList.Remove(toEvict).(*entry[T])
96+ delete(m.cache, evictedEntry.key)
97+ delete(m.hashableItems, evictedEntry.key) // if you're keeping track of original items
98+ }
99+ }
100+
101+ // Add the value to the cache and the evictionList
102+ newEntry := &entry[T]{
103+ key: hashedKey,
104+ value: value,
105+ }
106+ element := m.evictionList.PushFront(newEntry)
107+ m.cache[hashedKey] = element
108+ m.hashableItems[hashedKey] = value // if you're keeping track of original items
109+}
110+
111+// HString is a type that implements the Hasher interface for strings.
112+type HString string
113+
114+// Hash is a method that returns the hash of the string.
115+func (h HString) Hash() string {
116+ return fmt.Sprintf("%x", sha256.Sum256([]byte(h)))
117+}
118+
119+// HInt is a type that implements the Hasher interface for integers.
120+type HInt int
121+
122+// Hash is a method that returns the hash of the integer.
123+func (h HInt) Hash() string {
124+ return fmt.Sprintf("%x", sha256.Sum256(fmt.Appendf(nil, "%d", h)))
125+}
vendor/charm.land/bubbles/v2/internal/runeutil/runeutil.gonew file+102
@@ -0,0 +1,102 @@
1+// Package runeutil provides utility functions for tidying up incoming runes
2+// from Key messages.
3+package runeutil
4+
5+import (
6+ "unicode"
7+ "unicode/utf8"
8+)
9+
10+// Sanitizer is a helper for bubble widgets that want to process
11+// Runes from input key messages.
12+type Sanitizer interface {
13+ // Sanitize removes control characters from runes in a KeyRunes
14+ // message, and optionally replaces newline/carriage return/tabs by a
15+ // specified character.
16+ //
17+ // The rune array is modified in-place if possible. In that case, the
18+ // returned slice is the original slice shortened after the control
19+ // characters have been removed/translated.
20+ Sanitize(runes []rune) []rune
21+}
22+
23+// NewSanitizer constructs a rune sanitizer.
24+func NewSanitizer(opts ...Option) Sanitizer {
25+ s := sanitizer{
26+ replaceNewLine: []rune("\n"),
27+ replaceTab: []rune(" "),
28+ }
29+ for _, o := range opts {
30+ s = o(s)
31+ }
32+ return &s
33+}
34+
35+// Option is the type of option that can be passed to Sanitize().
36+type Option func(sanitizer) sanitizer
37+
38+// ReplaceTabs replaces tabs by the specified string.
39+func ReplaceTabs(tabRepl string) Option {
40+ return func(s sanitizer) sanitizer {
41+ s.replaceTab = []rune(tabRepl)
42+ return s
43+ }
44+}
45+
46+// ReplaceNewlines replaces newline characters by the specified string.
47+func ReplaceNewlines(nlRepl string) Option {
48+ return func(s sanitizer) sanitizer {
49+ s.replaceNewLine = []rune(nlRepl)
50+ return s
51+ }
52+}
53+
54+func (s *sanitizer) Sanitize(runes []rune) []rune {
55+ // dstrunes are where we are storing the result.
56+ dstrunes := runes[:0:len(runes)]
57+ // copied indicates whether dstrunes is an alias of runes
58+ // or a copy. We need a copy when dst moves past src.
59+ // We use this as an optimization to avoid allocating
60+ // a new rune slice in the common case where the output
61+ // is smaller or equal to the input.
62+ copied := false
63+
64+ for src := range runes {
65+ r := runes[src]
66+ switch {
67+ case r == utf8.RuneError:
68+ // skip
69+
70+ case r == '\r' || r == '\n':
71+ if len(dstrunes)+len(s.replaceNewLine) > src && !copied {
72+ dst := len(dstrunes)
73+ dstrunes = make([]rune, dst, len(runes)+len(s.replaceNewLine))
74+ copy(dstrunes, runes[:dst])
75+ copied = true
76+ }
77+ dstrunes = append(dstrunes, s.replaceNewLine...)
78+
79+ case r == '\t':
80+ if len(dstrunes)+len(s.replaceTab) > src && !copied {
81+ dst := len(dstrunes)
82+ dstrunes = make([]rune, dst, len(runes)+len(s.replaceTab))
83+ copy(dstrunes, runes[:dst])
84+ copied = true
85+ }
86+ dstrunes = append(dstrunes, s.replaceTab...)
87+
88+ case unicode.IsControl(r):
89+ // Other control characters: skip.
90+
91+ default:
92+ // Keep the character.
93+ dstrunes = append(dstrunes, runes[src])
94+ }
95+ }
96+ return dstrunes
97+}
98+
99+type sanitizer struct {
100+ replaceNewLine []rune
101+ replaceTab []rune
102+}
vendor/charm.land/bubbles/v2/key/key.gonew file+140
@@ -0,0 +1,140 @@
1+// Package key provides some types and functions for generating user-definable
2+// keymappings useful in Bubble Tea components. There are a few different ways
3+// you can define a keymapping with this package. Here's one example:
4+//
5+// type KeyMap struct {
6+// Up key.Binding
7+// Down key.Binding
8+// }
9+//
10+// var DefaultKeyMap = KeyMap{
11+// Up: key.NewBinding(
12+// key.WithKeys("k", "up"), // actual keybindings
13+// key.WithHelp("↑/k", "move up"), // corresponding help text
14+// ),
15+// Down: key.NewBinding(
16+// key.WithKeys("j", "down"),
17+// key.WithHelp("↓/j", "move down"),
18+// ),
19+// }
20+//
21+// func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
22+// switch msg := msg.(type) {
23+// case tea.KeyPressMsg:
24+// switch {
25+// case key.Matches(msg, DefaultKeyMap.Up):
26+// // The user pressed up
27+// case key.Matches(msg, DefaultKeyMap.Down):
28+// // The user pressed down
29+// }
30+// }
31+//
32+// // ...
33+// }
34+//
35+// The help information, which is not used in the example above, can be used
36+// to render help text for keystrokes in your views.
37+package key
38+
39+import "fmt"
40+
41+// Binding describes a set of keybindings and, optionally, their associated
42+// help text.
43+type Binding struct {
44+ keys []string
45+ help Help
46+ disabled bool
47+}
48+
49+// BindingOpt is an initialization option for a keybinding. It's used as an
50+// argument to NewBinding.
51+type BindingOpt func(*Binding)
52+
53+// NewBinding returns a new keybinding from a set of BindingOpt options.
54+func NewBinding(opts ...BindingOpt) Binding {
55+ b := &Binding{}
56+ for _, opt := range opts {
57+ opt(b)
58+ }
59+ return *b
60+}
61+
62+// WithKeys initializes a keybinding with the given keystrokes.
63+func WithKeys(keys ...string) BindingOpt {
64+ return func(b *Binding) {
65+ b.keys = keys
66+ }
67+}
68+
69+// WithHelp initializes a keybinding with the given help text.
70+func WithHelp(key, desc string) BindingOpt {
71+ return func(b *Binding) {
72+ b.help = Help{Key: key, Desc: desc}
73+ }
74+}
75+
76+// WithDisabled initializes a disabled keybinding.
77+func WithDisabled() BindingOpt {
78+ return func(b *Binding) {
79+ b.disabled = true
80+ }
81+}
82+
83+// SetKeys sets the keys for the keybinding.
84+func (b *Binding) SetKeys(keys ...string) {
85+ b.keys = keys
86+}
87+
88+// Keys returns the keys for the keybinding.
89+func (b Binding) Keys() []string {
90+ return b.keys
91+}
92+
93+// SetHelp sets the help text for the keybinding.
94+func (b *Binding) SetHelp(key, desc string) {
95+ b.help = Help{Key: key, Desc: desc}
96+}
97+
98+// Help returns the Help information for the keybinding.
99+func (b Binding) Help() Help {
100+ return b.help
101+}
102+
103+// Enabled returns whether or not the keybinding is enabled. Disabled
104+// keybindings won't be activated and won't show up in help. Keybindings are
105+// enabled by default.
106+func (b Binding) Enabled() bool {
107+ return !b.disabled && b.keys != nil
108+}
109+
110+// SetEnabled enables or disables the keybinding.
111+func (b *Binding) SetEnabled(v bool) {
112+ b.disabled = !v
113+}
114+
115+// Unbind removes the keys and help from this binding, effectively nullifying
116+// it. This is a step beyond disabling it, since applications can enable
117+// or disable key bindings based on application state.
118+func (b *Binding) Unbind() {
119+ b.keys = nil
120+ b.help = Help{}
121+}
122+
123+// Help is help information for a given keybinding.
124+type Help struct {
125+ Key string
126+ Desc string
127+}
128+
129+// Matches checks if the given key matches the given bindings.
130+func Matches[Key fmt.Stringer](k Key, b ...Binding) bool {
131+ keys := k.String()
132+ for _, binding := range b {
133+ for _, v := range binding.keys {
134+ if keys == v && binding.Enabled() {
135+ return true
136+ }
137+ }
138+ }
139+ return false
140+}
vendor/charm.land/bubbles/v2/spinner/spinner.gonew file+211
@@ -0,0 +1,211 @@
1+// Package spinner provides a spinner component for Bubble Tea applications.
2+package spinner
3+
4+import (
5+ "sync/atomic"
6+ "time"
7+
8+ tea "charm.land/bubbletea/v2"
9+ "charm.land/lipgloss/v2"
10+)
11+
12+// Internal ID management. Used during animating to ensure that frame messages
13+// are received only by spinner components that sent them.
14+var lastID int64
15+
16+func nextID() int {
17+ return int(atomic.AddInt64(&lastID, 1))
18+}
19+
20+// Spinner is a set of frames used in animating the spinner.
21+type Spinner struct {
22+ Frames []string
23+ FPS time.Duration
24+}
25+
26+// Some spinners to choose from. You could also make your own.
27+var (
28+ Line = Spinner{
29+ Frames: []string{"|", "/", "-", "\\"},
30+ FPS: time.Second / 10, //nolint:mnd
31+ }
32+ Dot = Spinner{
33+ Frames: []string{"⣾ ", "⣽ ", "⣻ ", "⢿ ", "⡿ ", "⣟ ", "⣯ ", "⣷ "},
34+ FPS: time.Second / 10, //nolint:mnd
35+ }
36+ MiniDot = Spinner{
37+ Frames: []string{"⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"},
38+ FPS: time.Second / 12, //nolint:mnd
39+ }
40+ Jump = Spinner{
41+ Frames: []string{"⢄", "⢂", "⢁", "⡁", "⡈", "⡐", "⡠"},
42+ FPS: time.Second / 10, //nolint:mnd
43+ }
44+ Pulse = Spinner{
45+ Frames: []string{"█", "▓", "▒", "░"},
46+ FPS: time.Second / 8, //nolint:mnd
47+ }
48+ Points = Spinner{
49+ Frames: []string{"∙∙∙", "●∙∙", "∙●∙", "∙∙●"},
50+ FPS: time.Second / 7, //nolint:mnd
51+ }
52+ Globe = Spinner{
53+ Frames: []string{"🌍", "🌎", "🌏"},
54+ FPS: time.Second / 4, //nolint:mnd
55+ }
56+ Moon = Spinner{
57+ Frames: []string{"🌑", "🌒", "🌓", "🌔", "🌕", "🌖", "🌗", "🌘"},
58+ FPS: time.Second / 8, //nolint:mnd
59+ }
60+ Monkey = Spinner{
61+ Frames: []string{"🙈", "🙉", "🙊"},
62+ FPS: time.Second / 3, //nolint:mnd
63+ }
64+ Meter = Spinner{
65+ Frames: []string{
66+ "▱▱▱",
67+ "▰▱▱",
68+ "▰▰▱",
69+ "▰▰▰",
70+ "▰▰▱",
71+ "▰▱▱",
72+ "▱▱▱",
73+ },
74+ FPS: time.Second / 7, //nolint:mnd
75+ }
76+ Hamburger = Spinner{
77+ Frames: []string{"☱", "☲", "☴", "☲"},
78+ FPS: time.Second / 3, //nolint:mnd
79+ }
80+ Ellipsis = Spinner{
81+ Frames: []string{"", ".", "..", "..."},
82+ FPS: time.Second / 3, //nolint:mnd
83+ }
84+)
85+
86+// Model contains the state for the spinner. Use New to create new models
87+// rather than using Model as a struct literal.
88+type Model struct {
89+ // Spinner settings to use. See type Spinner.
90+ Spinner Spinner
91+
92+ // Style sets the styling for the spinner. Most of the time you'll just
93+ // want foreground and background coloring, and potentially some padding.
94+ //
95+ // For an introduction to styling with Lip Gloss see:
96+ // https://github.com/charmbracelet/lipgloss
97+ Style lipgloss.Style
98+
99+ frame int
100+ id int
101+ tag int
102+}
103+
104+// ID returns the spinner's unique ID.
105+func (m Model) ID() int {
106+ return m.id
107+}
108+
109+// New returns a model with default values.
110+func New(opts ...Option) Model {
111+ m := Model{
112+ Spinner: Line,
113+ id: nextID(),
114+ }
115+
116+ for _, opt := range opts {
117+ opt(&m)
118+ }
119+
120+ return m
121+}
122+
123+// TickMsg indicates that the timer has ticked and we should render a frame.
124+type TickMsg struct {
125+ Time time.Time
126+ tag int
127+ ID int
128+}
129+
130+// Update is the Tea update function.
131+func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
132+ switch msg := msg.(type) {
133+ case TickMsg:
134+ // If an ID is set, and the ID doesn't belong to this spinner, reject
135+ // the message.
136+ if msg.ID > 0 && msg.ID != m.id {
137+ return m, nil
138+ }
139+
140+ // If a tag is set, and it's not the one we expect, reject the message.
141+ // This prevents the spinner from receiving too many messages and
142+ // thus spinning too fast.
143+ if msg.tag > 0 && msg.tag != m.tag {
144+ return m, nil
145+ }
146+
147+ m.frame++
148+ if m.frame >= len(m.Spinner.Frames) {
149+ m.frame = 0
150+ }
151+
152+ m.tag++
153+ return m, m.tick(m.id, m.tag)
154+ default:
155+ return m, nil
156+ }
157+}
158+
159+// View renders the model's view.
160+func (m Model) View() string {
161+ if m.frame >= len(m.Spinner.Frames) {
162+ return "(error)"
163+ }
164+
165+ return m.Style.Render(m.Spinner.Frames[m.frame])
166+}
167+
168+// Tick is the command used to advance the spinner one frame. Use this command
169+// to effectively start the spinner.
170+func (m Model) Tick() tea.Msg {
171+ return TickMsg{
172+ // The time at which the tick occurred.
173+ Time: time.Now(),
174+
175+ // The ID of the spinner that this message belongs to. This can be
176+ // helpful when routing messages, however bear in mind that spinners
177+ // will ignore messages that don't contain ID by default.
178+ ID: m.id,
179+
180+ tag: m.tag,
181+ }
182+}
183+
184+func (m Model) tick(id, tag int) tea.Cmd {
185+ return tea.Tick(m.Spinner.FPS, func(t time.Time) tea.Msg {
186+ return TickMsg{
187+ Time: t,
188+ ID: id,
189+ tag: tag,
190+ }
191+ })
192+}
193+
194+// Option is used to set options in New. For example:
195+//
196+// spinner := New(WithSpinner(Dot))
197+type Option func(*Model)
198+
199+// WithSpinner is an option to set the spinner. Pass this to [Spinner.New].
200+func WithSpinner(spinner Spinner) Option {
201+ return func(m *Model) {
202+ m.Spinner = spinner
203+ }
204+}
205+
206+// WithStyle is an option to set the spinner style. Pass this to [Spinner.New].
207+func WithStyle(style lipgloss.Style) Option {
208+ return func(m *Model) {
209+ m.Style = style
210+ }
211+}
vendor/charm.land/bubbles/v2/textarea/textarea.gonew file+1897
@@ -0,0 +1,1897 @@
1+// Package textarea provides a multi-line text input component for Bubble Tea
2+// applications.
3+package textarea
4+
5+import (
6+ "crypto/sha256"
7+ "fmt"
8+ "image/color"
9+ "slices"
10+ "strconv"
11+ "strings"
12+ "time"
13+ "unicode"
14+
15+ "charm.land/bubbles/v2/cursor"
16+ "charm.land/bubbles/v2/internal/memoization"
17+ "charm.land/bubbles/v2/internal/runeutil"
18+ "charm.land/bubbles/v2/key"
19+ "charm.land/bubbles/v2/viewport"
20+ tea "charm.land/bubbletea/v2"
21+ "charm.land/lipgloss/v2"
22+ "github.com/atotto/clipboard"
23+ "github.com/charmbracelet/x/ansi"
24+ rw "github.com/mattn/go-runewidth"
25+ "github.com/rivo/uniseg"
26+)
27+
28+const (
29+ minHeight = 1
30+ defaultHeight = 6
31+ defaultWidth = 40
32+ defaultCharLimit = 0 // no limit
33+ defaultMaxHeight = 99
34+ defaultMaxWidth = 500
35+
36+ // XXX: in v2, make max lines dynamic and default max lines configurable.
37+ maxLines = 10000
38+)
39+
40+// Internal messages for clipboard operations.
41+type (
42+ pasteMsg string
43+ pasteErrMsg struct{ error }
44+)
45+
46+// KeyMap is the key bindings for different actions within the textarea.
47+type KeyMap struct {
48+ CharacterBackward key.Binding
49+ CharacterForward key.Binding
50+ DeleteAfterCursor key.Binding
51+ DeleteBeforeCursor key.Binding
52+ DeleteCharacterBackward key.Binding
53+ DeleteCharacterForward key.Binding
54+ DeleteWordBackward key.Binding
55+ DeleteWordForward key.Binding
56+ InsertNewline key.Binding
57+ LineEnd key.Binding
58+ LineNext key.Binding
59+ LinePrevious key.Binding
60+ LineStart key.Binding
61+ PageUp key.Binding
62+ PageDown key.Binding
63+ Paste key.Binding
64+ WordBackward key.Binding
65+ WordForward key.Binding
66+ InputBegin key.Binding
67+ InputEnd key.Binding
68+
69+ UppercaseWordForward key.Binding
70+ LowercaseWordForward key.Binding
71+ CapitalizeWordForward key.Binding
72+
73+ TransposeCharacterBackward key.Binding
74+}
75+
76+// DefaultKeyMap returns the default set of key bindings for navigating and acting
77+// upon the textarea.
78+func DefaultKeyMap() KeyMap {
79+ return KeyMap{
80+ CharacterForward: key.NewBinding(key.WithKeys("right", "ctrl+f"), key.WithHelp("right", "character forward")),
81+ CharacterBackward: key.NewBinding(key.WithKeys("left", "ctrl+b"), key.WithHelp("left", "character backward")),
82+ WordForward: key.NewBinding(key.WithKeys("alt+right", "alt+f"), key.WithHelp("alt+right", "word forward")),
83+ WordBackward: key.NewBinding(key.WithKeys("alt+left", "alt+b"), key.WithHelp("alt+left", "word backward")),
84+ LineNext: key.NewBinding(key.WithKeys("down", "ctrl+n"), key.WithHelp("down", "next line")),
85+ LinePrevious: key.NewBinding(key.WithKeys("up", "ctrl+p"), key.WithHelp("up", "previous line")),
86+ DeleteWordBackward: key.NewBinding(key.WithKeys("alt+backspace", "ctrl+w"), key.WithHelp("alt+backspace", "delete word backward")),
87+ DeleteWordForward: key.NewBinding(key.WithKeys("alt+delete", "alt+d"), key.WithHelp("alt+delete", "delete word forward")),
88+ DeleteAfterCursor: key.NewBinding(key.WithKeys("ctrl+k"), key.WithHelp("ctrl+k", "delete after cursor")),
89+ DeleteBeforeCursor: key.NewBinding(key.WithKeys("ctrl+u"), key.WithHelp("ctrl+u", "delete before cursor")),
90+ InsertNewline: key.NewBinding(key.WithKeys("enter", "ctrl+m"), key.WithHelp("enter", "insert newline")),
91+ DeleteCharacterBackward: key.NewBinding(key.WithKeys("backspace", "ctrl+h"), key.WithHelp("backspace", "delete character backward")),
92+ DeleteCharacterForward: key.NewBinding(key.WithKeys("delete", "ctrl+d"), key.WithHelp("delete", "delete character forward")),
93+ LineStart: key.NewBinding(key.WithKeys("home", "ctrl+a"), key.WithHelp("home", "line start")),
94+ LineEnd: key.NewBinding(key.WithKeys("end", "ctrl+e"), key.WithHelp("end", "line end")),
95+ PageUp: key.NewBinding(key.WithKeys("pgup"), key.WithHelp("pgup", "page up")),
96+ PageDown: key.NewBinding(key.WithKeys("pgdown"), key.WithHelp("pgdown", "page down")),
97+ Paste: key.NewBinding(key.WithKeys("ctrl+v"), key.WithHelp("ctrl+v", "paste")),
98+ InputBegin: key.NewBinding(key.WithKeys("alt+<", "ctrl+home"), key.WithHelp("alt+<", "input begin")),
99+ InputEnd: key.NewBinding(key.WithKeys("alt+>", "ctrl+end"), key.WithHelp("alt+>", "input end")),
100+
101+ CapitalizeWordForward: key.NewBinding(key.WithKeys("alt+c"), key.WithHelp("alt+c", "capitalize word forward")),
102+ LowercaseWordForward: key.NewBinding(key.WithKeys("alt+l"), key.WithHelp("alt+l", "lowercase word forward")),
103+ UppercaseWordForward: key.NewBinding(key.WithKeys("alt+u"), key.WithHelp("alt+u", "uppercase word forward")),
104+
105+ TransposeCharacterBackward: key.NewBinding(key.WithKeys("ctrl+t"), key.WithHelp("ctrl+t", "transpose character backward")),
106+ }
107+}
108+
109+// LineInfo is a helper for keeping track of line information regarding
110+// soft-wrapped lines.
111+type LineInfo struct {
112+ // Width is the number of columns in the line.
113+ Width int
114+
115+ // CharWidth is the number of characters in the line to account for
116+ // double-width runes.
117+ CharWidth int
118+
119+ // Height is the number of rows in the line.
120+ Height int
121+
122+ // StartColumn is the index of the first column of the line.
123+ StartColumn int
124+
125+ // ColumnOffset is the number of columns that the cursor is offset from the
126+ // start of the line.
127+ ColumnOffset int
128+
129+ // RowOffset is the number of rows that the cursor is offset from the start
130+ // of the line.
131+ RowOffset int
132+
133+ // CharOffset is the number of characters that the cursor is offset
134+ // from the start of the line. This will generally be equivalent to
135+ // ColumnOffset, but will be different there are double-width runes before
136+ // the cursor.
137+ CharOffset int
138+}
139+
140+// PromptInfo is a struct that can be used to store information about the
141+// prompt.
142+type PromptInfo struct {
143+ LineNumber int
144+ Focused bool
145+}
146+
147+// CursorStyle is the style for real and virtual cursors.
148+type CursorStyle struct {
149+ // Style styles the cursor block.
150+ //
151+ // For real cursors, the foreground color set here will be used as the
152+ // cursor color.
153+ Color color.Color
154+
155+ // Shape is the cursor shape. The following shapes are available:
156+ //
157+ // - tea.CursorBlock
158+ // - tea.CursorUnderline
159+ // - tea.CursorBar
160+ //
161+ // This is only used for real cursors.
162+ Shape tea.CursorShape
163+
164+ // CursorBlink determines whether or not the cursor should blink.
165+ Blink bool
166+
167+ // BlinkSpeed is the speed at which the virtual cursor blinks. This has no
168+ // effect on real cursors as well as no effect if the cursor is set not to
169+ // [CursorBlink].
170+ //
171+ // By default, the blink speed is set to about 500ms.
172+ BlinkSpeed time.Duration
173+}
174+
175+// Styles are the styles for the textarea, separated into focused and blurred
176+// states. The appropriate styles will be chosen based on the focus state of
177+// the textarea.
178+type Styles struct {
179+ Focused StyleState
180+ Blurred StyleState
181+ Cursor CursorStyle
182+}
183+
184+// StyleState that will be applied to the text area.
185+//
186+// StyleState can be applied to focused and unfocused states to change the styles
187+// depending on the focus state.
188+//
189+// For an introduction to styling with Lip Gloss see:
190+// https://github.com/charmbracelet/lipgloss
191+type StyleState struct {
192+ Base lipgloss.Style
193+ Text lipgloss.Style
194+ LineNumber lipgloss.Style
195+ CursorLineNumber lipgloss.Style
196+ CursorLine lipgloss.Style
197+ EndOfBuffer lipgloss.Style
198+ Placeholder lipgloss.Style
199+ Prompt lipgloss.Style
200+}
201+
202+func (s StyleState) computedCursorLine() lipgloss.Style {
203+ return s.CursorLine.Inherit(s.Base).Inline(true)
204+}
205+
206+func (s StyleState) computedCursorLineNumber() lipgloss.Style {
207+ return s.CursorLineNumber.
208+ Inherit(s.CursorLine).
209+ Inherit(s.Base).
210+ Inline(true)
211+}
212+
213+func (s StyleState) computedEndOfBuffer() lipgloss.Style {
214+ return s.EndOfBuffer.Inherit(s.Base).Inline(true)
215+}
216+
217+func (s StyleState) computedLineNumber() lipgloss.Style {
218+ return s.LineNumber.Inherit(s.Base).Inline(true)
219+}
220+
221+func (s StyleState) computedPlaceholder() lipgloss.Style {
222+ return s.Placeholder.Inherit(s.Base).Inline(true)
223+}
224+
225+func (s StyleState) computedPrompt() lipgloss.Style {
226+ return s.Prompt.Inherit(s.Base).Inline(true)
227+}
228+
229+func (s StyleState) computedText() lipgloss.Style {
230+ return s.Text.Inherit(s.Base).Inline(true)
231+}
232+
233+// line is the input to the text wrapping function. This is stored in a struct
234+// so that it can be hashed and memoized.
235+type line struct {
236+ runes []rune
237+ width int
238+}
239+
240+// Hash returns a hash of the line.
241+func (w line) Hash() string {
242+ v := fmt.Sprintf("%s:%d", string(w.runes), w.width)
243+ return fmt.Sprintf("%x", sha256.Sum256([]byte(v)))
244+}
245+
246+// Model is the Bubble Tea model for this text area element.
247+type Model struct {
248+ Err error
249+
250+ // General settings.
251+ cache *memoization.MemoCache[line, [][]rune]
252+
253+ // Prompt is printed at the beginning of each line.
254+ //
255+ // When changing the value of Prompt after the model has been
256+ // initialized, ensure that SetWidth() gets called afterwards.
257+ //
258+ // See also [SetPromptFunc] for a dynamic prompt.
259+ Prompt string
260+
261+ // Placeholder is the text displayed when the user
262+ // hasn't entered anything yet.
263+ Placeholder string
264+
265+ // ShowLineNumbers, if enabled, causes line numbers to be printed
266+ // after the prompt.
267+ ShowLineNumbers bool
268+
269+ // EndOfBufferCharacter is displayed at the end of the input.
270+ EndOfBufferCharacter rune
271+
272+ // KeyMap encodes the keybindings recognized by the widget.
273+ KeyMap KeyMap
274+
275+ // virtualCursor manages the virtual cursor.
276+ virtualCursor cursor.Model
277+
278+ // CharLimit is the maximum number of characters this input element will
279+ // accept. If 0 or less, there's no limit.
280+ CharLimit int
281+
282+ // MaxHeight is the maximum height of the text area in rows. If 0 or less,
283+ // there's no limit.
284+ MaxHeight int
285+
286+ // MaxWidth is the maximum width of the text area in columns. If 0 or less,
287+ // there's no limit.
288+ MaxWidth int
289+
290+ // DynamicHeight, when true, causes the textarea to automatically grow
291+ // and shrink its height to fit the content. The height is clamped between
292+ // MinHeight and MaxHeight.
293+ DynamicHeight bool
294+
295+ // MinHeight is the minimum height of the text area in rows when
296+ // DynamicHeight is enabled. If 0 or less, defaults to 1.
297+ MinHeight int
298+
299+ // MaxContentHeight is the maximum content height in visual rows
300+ // (accounting for soft wraps). When set (> 0), input is blocked once
301+ // the total visual lines reach this limit, while MaxHeight controls
302+ // only the visible viewport height. When 0, the content guard falls
303+ // back to the legacy MaxHeight behavior (blocking at MaxHeight
304+ // logical lines) for backward compatibility.
305+ MaxContentHeight int
306+
307+ // Styling. Styles are defined in [Styles]. Use [SetStyles] and [GetStyles]
308+ // to work with this value publicly.
309+ styles Styles
310+
311+ // useVirtualCursor determines whether or not to use the virtual cursor.
312+ // Use [SetVirtualCursor] and [VirtualCursor] to work with this this
313+ // value publicly.
314+ useVirtualCursor bool
315+
316+ // If promptFunc is set, it replaces Prompt as a generator for
317+ // prompt strings at the beginning of each line.
318+ promptFunc func(PromptInfo) string
319+
320+ // promptWidth is the width of the prompt.
321+ promptWidth int
322+
323+ // width is the maximum number of characters that can be displayed at once.
324+ // If 0 or less this setting is ignored.
325+ width int
326+
327+ // height is the maximum number of lines that can be displayed at once. It
328+ // essentially treats the text field like a vertically scrolling viewport
329+ // if there are more lines than the permitted height.
330+ height int
331+
332+ // Underlying text value.
333+ value [][]rune
334+
335+ // focus indicates whether user input focus should be on this input
336+ // component. When false, ignore keyboard input and hide the cursor.
337+ focus bool
338+
339+ // Cursor column.
340+ col int
341+
342+ // Cursor row.
343+ row int
344+
345+ // Last character offset, used to maintain state when the cursor is moved
346+ // vertically such that we can maintain the same navigating position.
347+ lastCharOffset int
348+
349+ // viewport is the vertically-scrollable viewport of the multi-line text
350+ // input.
351+ viewport *viewport.Model
352+
353+ // rune sanitizer for input.
354+ rsan runeutil.Sanitizer
355+}
356+
357+// New creates a new model with default settings.
358+func New() Model {
359+ vp := viewport.New()
360+ vp.KeyMap = viewport.KeyMap{}
361+ cur := cursor.New()
362+
363+ styles := DefaultDarkStyles()
364+
365+ m := Model{
366+ CharLimit: defaultCharLimit,
367+ MaxHeight: defaultMaxHeight,
368+ MaxWidth: defaultMaxWidth,
369+ Prompt: lipgloss.ThickBorder().Left + " ",
370+ styles: styles,
371+ cache: memoization.NewMemoCache[line, [][]rune](maxLines),
372+ EndOfBufferCharacter: ' ',
373+ ShowLineNumbers: true,
374+ useVirtualCursor: true,
375+ virtualCursor: cur,
376+ KeyMap: DefaultKeyMap(),
377+
378+ value: make([][]rune, minHeight, maxLines),
379+ focus: false,
380+ col: 0,
381+ row: 0,
382+
383+ viewport: &vp,
384+ }
385+
386+ m.SetHeight(defaultHeight)
387+ m.SetWidth(defaultWidth)
388+
389+ return m
390+}
391+
392+// DefaultStyles returns the default styles for focused and blurred states for
393+// the textarea.
394+func DefaultStyles(isDark bool) Styles {
395+ lightDark := lipgloss.LightDark(isDark)
396+
397+ var s Styles
398+ s.Focused = StyleState{
399+ Base: lipgloss.NewStyle(),
400+ CursorLine: lipgloss.NewStyle().Background(lightDark(lipgloss.Color("255"), lipgloss.Color("0"))),
401+ CursorLineNumber: lipgloss.NewStyle().Foreground(lightDark(lipgloss.Color("240"), lipgloss.Color("240"))),
402+ EndOfBuffer: lipgloss.NewStyle().Foreground(lightDark(lipgloss.Color("254"), lipgloss.Color("0"))),
403+ LineNumber: lipgloss.NewStyle().Foreground(lightDark(lipgloss.Color("249"), lipgloss.Color("7"))),
404+ Placeholder: lipgloss.NewStyle().Foreground(lipgloss.Color("240")),
405+ Prompt: lipgloss.NewStyle().Foreground(lipgloss.Color("7")),
406+ Text: lipgloss.NewStyle(),
407+ }
408+ s.Blurred = StyleState{
409+ Base: lipgloss.NewStyle(),
410+ CursorLine: lipgloss.NewStyle().Foreground(lightDark(lipgloss.Color("245"), lipgloss.Color("7"))),
411+ CursorLineNumber: lipgloss.NewStyle().Foreground(lightDark(lipgloss.Color("249"), lipgloss.Color("7"))),
412+ EndOfBuffer: lipgloss.NewStyle().Foreground(lightDark(lipgloss.Color("254"), lipgloss.Color("0"))),
413+ LineNumber: lipgloss.NewStyle().Foreground(lightDark(lipgloss.Color("249"), lipgloss.Color("7"))),
414+ Placeholder: lipgloss.NewStyle().Foreground(lipgloss.Color("240")),
415+ Prompt: lipgloss.NewStyle().Foreground(lipgloss.Color("7")),
416+ Text: lipgloss.NewStyle().Foreground(lightDark(lipgloss.Color("245"), lipgloss.Color("7"))),
417+ }
418+ s.Cursor = CursorStyle{
419+ Color: lipgloss.Color("7"),
420+ Shape: tea.CursorBlock,
421+ Blink: true,
422+ }
423+ return s
424+}
425+
426+// DefaultLightStyles returns the default styles for a light background.
427+func DefaultLightStyles() Styles {
428+ return DefaultStyles(false)
429+}
430+
431+// DefaultDarkStyles returns the default styles for a dark background.
432+func DefaultDarkStyles() Styles {
433+ return DefaultStyles(true)
434+}
435+
436+// Styles returns the current styles for the textarea.
437+func (m Model) Styles() Styles {
438+ return m.styles
439+}
440+
441+// SetStyles updates styling for the textarea.
442+func (m *Model) SetStyles(s Styles) {
443+ m.styles = s
444+ m.updateVirtualCursorStyle()
445+}
446+
447+// VirtualCursor returns whether or not the virtual cursor is enabled.
448+func (m Model) VirtualCursor() bool {
449+ return m.useVirtualCursor
450+}
451+
452+// SetVirtualCursor sets whether or not to use the virtual cursor.
453+func (m *Model) SetVirtualCursor(v bool) {
454+ m.useVirtualCursor = v
455+ m.updateVirtualCursorStyle()
456+}
457+
458+// updateVirtualCursorStyle sets styling on the virtual cursor based on the
459+// textarea's style settings.
460+func (m *Model) updateVirtualCursorStyle() {
461+ if !m.useVirtualCursor {
462+ m.virtualCursor.SetMode(cursor.CursorHide)
463+ return
464+ }
465+
466+ m.virtualCursor.Style = lipgloss.NewStyle().Foreground(m.styles.Cursor.Color)
467+
468+ // By default, the blink speed of the cursor is set to a default
469+ // internally.
470+ if m.styles.Cursor.Blink {
471+ if m.styles.Cursor.BlinkSpeed > 0 {
472+ m.virtualCursor.BlinkSpeed = m.styles.Cursor.BlinkSpeed
473+ }
474+ m.virtualCursor.SetMode(cursor.CursorBlink)
475+ return
476+ }
477+ m.virtualCursor.SetMode(cursor.CursorStatic)
478+}
479+
480+// SetValue sets the value of the text input.
481+func (m *Model) SetValue(s string) {
482+ m.Reset()
483+ m.InsertString(s)
484+ m.recalculateHeight()
485+}
486+
487+// InsertString inserts a string at the cursor position.
488+func (m *Model) InsertString(s string) {
489+ m.insertRunesFromUserInput([]rune(s))
490+ m.recalculateHeight()
491+}
492+
493+// InsertRune inserts a rune at the cursor position.
494+func (m *Model) InsertRune(r rune) {
495+ m.insertRunesFromUserInput([]rune{r})
496+ m.recalculateHeight()
497+}
498+
499+// insertRunesFromUserInput inserts runes at the current cursor position.
500+func (m *Model) insertRunesFromUserInput(runes []rune) {
501+ // Clean up any special characters in the input provided by the
502+ // clipboard. This avoids bugs due to e.g. tab characters and
503+ // whatnot.
504+ runes = m.san().Sanitize(runes)
505+
506+ if m.CharLimit > 0 {
507+ availSpace := m.CharLimit - m.Length()
508+ // If the char limit's been reached, cancel.
509+ if availSpace <= 0 {
510+ return
511+ }
512+ // If there's not enough space to paste the whole thing cut the pasted
513+ // runes down so they'll fit.
514+ if availSpace < len(runes) {
515+ runes = runes[:availSpace]
516+ }
517+ }
518+
519+ // Split the input into lines.
520+ var lines [][]rune
521+ lstart := 0
522+ for i := range runes {
523+ if runes[i] == '\n' {
524+ // Queue a line to become a new row in the text area below.
525+ // Beware to clamp the max capacity of the slice, to ensure no
526+ // data from different rows get overwritten when later edits
527+ // will modify this line.
528+ lines = append(lines, runes[lstart:i:i])
529+ lstart = i + 1
530+ }
531+ }
532+ if lstart <= len(runes) {
533+ // The last line did not end with a newline character.
534+ // Take it now.
535+ lines = append(lines, runes[lstart:])
536+ }
537+
538+ // Obey the maximum line limit.
539+ if maxLines > 0 && len(m.value)+len(lines)-1 > maxLines {
540+ allowedHeight := max(0, maxLines-len(m.value)+1)
541+ lines = lines[:allowedHeight]
542+ }
543+
544+ // Obey MaxContentHeight in visual rows when set.
545+ if m.MaxContentHeight > 0 {
546+ budget := m.MaxContentHeight - m.totalVisualLines()
547+ // Trim lines from the end until we fit within the budget.
548+ for len(lines) > 1 && m.visualLinesForInsert(lines) > budget {
549+ lines = lines[:len(lines)-1]
550+ }
551+ if m.visualLinesForInsert(lines) > budget {
552+ return
553+ }
554+ }
555+
556+ if len(lines) == 0 {
557+ // Nothing left to insert.
558+ return
559+ }
560+
561+ // Save the remainder of the original line at the current
562+ // cursor position.
563+ tail := make([]rune, len(m.value[m.row][m.col:]))
564+ copy(tail, m.value[m.row][m.col:])
565+
566+ // Paste the first line at the current cursor position.
567+ m.value[m.row] = append(m.value[m.row][:m.col], lines[0]...)
568+ m.col += len(lines[0])
569+
570+ if numExtraLines := len(lines) - 1; numExtraLines > 0 {
571+ // Add the new lines.
572+ // We try to reuse the slice if there's already space.
573+ var newGrid [][]rune
574+ if cap(m.value) >= len(m.value)+numExtraLines {
575+ // Can reuse the extra space.
576+ newGrid = m.value[:len(m.value)+numExtraLines]
577+ } else {
578+ // No space left; need a new slice.
579+ newGrid = make([][]rune, len(m.value)+numExtraLines)
580+ copy(newGrid, m.value[:m.row+1])
581+ }
582+ // Add all the rows that were after the cursor in the original
583+ // grid at the end of the new grid.
584+ copy(newGrid[m.row+1+numExtraLines:], m.value[m.row+1:])
585+ m.value = newGrid
586+ // Insert all the new lines in the middle.
587+ for _, l := range lines[1:] {
588+ m.row++
589+ m.value[m.row] = l
590+ m.col = len(l)
591+ }
592+ }
593+
594+ // Finally add the tail at the end of the last line inserted.
595+ m.value[m.row] = append(m.value[m.row], tail...)
596+
597+ m.SetCursorColumn(m.col)
598+}
599+
600+// Value returns the value of the text input.
601+func (m Model) Value() string {
602+ if m.value == nil {
603+ return ""
604+ }
605+
606+ var v strings.Builder
607+ for _, l := range m.value {
608+ v.WriteString(string(l))
609+ v.WriteByte('\n')
610+ }
611+
612+ return strings.TrimSuffix(v.String(), "\n")
613+}
614+
615+// Length returns the number of characters currently in the text input.
616+func (m *Model) Length() int {
617+ var l int
618+ for _, row := range m.value {
619+ l += uniseg.StringWidth(string(row))
620+ }
621+ // We add len(m.value) to include the newline characters.
622+ return l + len(m.value) - 1
623+}
624+
625+// LineCount returns the number of lines that are currently in the text input.
626+func (m *Model) LineCount() int {
627+ return len(m.value)
628+}
629+
630+// Line returns the 0-indexed row position of the cursor.
631+func (m Model) Line() int {
632+ return m.row
633+}
634+
635+// Column returns the 0-indexed column position of the cursor.
636+func (m Model) Column() int {
637+ return m.col
638+}
639+
640+// ScrollYOffset returns the Y offset (top row) index of the current view, which
641+// can be used to calculate the current scroll position.
642+func (m Model) ScrollYOffset() int {
643+ return m.viewport.YOffset()
644+}
645+
646+// ScrollPercent returns the amount of the textarea that is currently scrolled
647+// through, clamped between 0 and 1.
648+func (m Model) ScrollPercent() float64 {
649+ return m.viewport.ScrollPercent()
650+}
651+
652+// setCursorLineRelative moves the cursor by the given number of lines. Negative
653+// values move the cursor up, positive values move the cursor down.
654+func (m *Model) setCursorLineRelative(delta int) {
655+ if delta == 0 {
656+ return
657+ }
658+
659+ li := m.LineInfo()
660+ charOffset := max(m.lastCharOffset, li.CharOffset)
661+ m.lastCharOffset = charOffset
662+
663+ // 2 columns to account for the trailing space wrapping.
664+ const trailingSpace = 2
665+
666+ if delta > 0 { //nolint:nestif
667+ // Moving down.
668+ for range delta {
669+ if li.RowOffset+1 >= li.Height && m.row < len(m.value)-1 {
670+ m.row++
671+ m.col = 0
672+ } else {
673+ // Move the cursor to the start of the next virtual line.
674+ m.col = min(li.StartColumn+li.Width+trailingSpace, len(m.value[m.row])-1)
675+ }
676+ li = m.LineInfo()
677+ }
678+ } else {
679+ // Moving up.
680+ for range -delta {
681+ if li.RowOffset <= 0 && m.row > 0 {
682+ m.row--
683+ m.col = len(m.value[m.row])
684+ } else {
685+ // Move the cursor to the end of the previous line.
686+ m.col = li.StartColumn - trailingSpace
687+ }
688+ li = m.LineInfo()
689+ }
690+ }
691+
692+ nli := m.LineInfo()
693+ m.col = nli.StartColumn
694+
695+ if nli.Width <= 0 {
696+ m.repositionView()
697+ return
698+ }
699+
700+ offset := 0
701+ for offset < charOffset {
702+ if m.row >= len(m.value) || m.col >= len(m.value[m.row]) || offset >= nli.CharWidth-1 {
703+ break
704+ }
705+ offset += rw.RuneWidth(m.value[m.row][m.col])
706+ m.col++
707+ }
708+ m.repositionView()
709+}
710+
711+// CursorDown moves the cursor down by one line.
712+func (m *Model) CursorDown() {
713+ m.setCursorLineRelative(1)
714+}
715+
716+// CursorUp moves the cursor up by one line.
717+func (m *Model) CursorUp() {
718+ m.setCursorLineRelative(-1)
719+}
720+
721+// SetCursorColumn moves the cursor to the given position. If the position is
722+// out of bounds the cursor will be moved to the start or end accordingly.
723+func (m *Model) SetCursorColumn(col int) {
724+ m.col = clamp(col, 0, len(m.value[m.row]))
725+ // Any time that we move the cursor horizontally we need to reset the last
726+ // offset so that the horizontal position when navigating is adjusted.
727+ m.lastCharOffset = 0
728+}
729+
730+// CursorStart moves the cursor to the start of the input field.
731+func (m *Model) CursorStart() {
732+ m.SetCursorColumn(0)
733+}
734+
735+// CursorEnd moves the cursor to the end of the input field.
736+func (m *Model) CursorEnd() {
737+ m.SetCursorColumn(len(m.value[m.row]))
738+}
739+
740+// Focused returns the focus state on the model.
741+func (m Model) Focused() bool {
742+ return m.focus
743+}
744+
745+// activeStyle returns the appropriate set of styles to use depending on
746+// whether the textarea is focused or blurred.
747+func (m Model) activeStyle() *StyleState {
748+ if m.focus {
749+ return &m.styles.Focused
750+ }
751+ return &m.styles.Blurred
752+}
753+
754+// Focus sets the focus state on the model. When the model is in focus it can
755+// receive keyboard input and the cursor will be hidden.
756+func (m *Model) Focus() tea.Cmd {
757+ m.focus = true
758+ return m.virtualCursor.Focus()
759+}
760+
761+// Blur removes the focus state on the model. When the model is blurred it can
762+// not receive keyboard input and the cursor will be hidden.
763+func (m *Model) Blur() {
764+ m.focus = false
765+ m.virtualCursor.Blur()
766+}
767+
768+// Reset sets the input to its default state with no input.
769+func (m *Model) Reset() {
770+ m.value = make([][]rune, minHeight, maxLines)
771+ m.col = 0
772+ m.row = 0
773+ m.viewport.GotoTop()
774+ m.SetCursorColumn(0)
775+ m.recalculateHeight()
776+}
777+
778+// Word returns the word at the cursor position.
779+// A word is delimited by spaces or line-breaks.
780+func (m *Model) Word() string {
781+ line := m.value[m.row]
782+ col := m.col - 1
783+
784+ if col < 0 {
785+ return ""
786+ }
787+
788+ // If cursor is beyond the line, return empty string
789+ if col >= len(line) {
790+ return ""
791+ }
792+
793+ // If cursor is on a space, return empty string
794+ if unicode.IsSpace(line[col]) {
795+ return ""
796+ }
797+
798+ // Find the start of the word by moving left
799+ start := col
800+ for start > 0 && !unicode.IsSpace(line[start-1]) {
801+ start--
802+ }
803+
804+ // Find the end of the word by moving right
805+ end := col
806+ for end < len(line) && !unicode.IsSpace(line[end]) {
807+ end++
808+ }
809+
810+ return string(line[start:end])
811+}
812+
813+// san initializes or retrieves the rune sanitizer.
814+func (m *Model) san() runeutil.Sanitizer {
815+ if m.rsan == nil {
816+ // Textinput has all its input on a single line so collapse
817+ // newlines/tabs to single spaces.
818+ m.rsan = runeutil.NewSanitizer()
819+ }
820+ return m.rsan
821+}
822+
823+// deleteBeforeCursor deletes all text before the cursor. Returns whether or
824+// not the cursor blink should be reset.
825+func (m *Model) deleteBeforeCursor() {
826+ m.value[m.row] = m.value[m.row][m.col:]
827+ m.SetCursorColumn(0)
828+}
829+
830+// deleteAfterCursor deletes all text after the cursor. Returns whether or not
831+// the cursor blink should be reset. If input is masked delete everything after
832+// the cursor so as not to reveal word breaks in the masked input.
833+func (m *Model) deleteAfterCursor() {
834+ m.value[m.row] = m.value[m.row][:m.col]
835+ m.SetCursorColumn(len(m.value[m.row]))
836+}
837+
838+// transposeLeft exchanges the runes at the cursor and immediately
839+// before. No-op if the cursor is at the beginning of the line. If
840+// the cursor is not at the end of the line yet, moves the cursor to
841+// the right.
842+func (m *Model) transposeLeft() {
843+ if m.col == 0 || len(m.value[m.row]) < 2 {
844+ return
845+ }
846+ if m.col >= len(m.value[m.row]) {
847+ m.SetCursorColumn(m.col - 1)
848+ }
849+ m.value[m.row][m.col-1], m.value[m.row][m.col] = m.value[m.row][m.col], m.value[m.row][m.col-1]
850+ if m.col < len(m.value[m.row]) {
851+ m.SetCursorColumn(m.col + 1)
852+ }
853+}
854+
855+// deleteWordLeft deletes the word left to the cursor. Returns whether or not
856+// the cursor blink should be reset.
857+func (m *Model) deleteWordLeft() {
858+ if m.col == 0 || len(m.value[m.row]) == 0 {
859+ return
860+ }
861+
862+ // Linter note: it's critical that we acquire the initial cursor position
863+ // here prior to altering it via SetCursor() below. As such, moving this
864+ // call into the corresponding if clause does not apply here.
865+ oldCol := m.col
866+
867+ m.SetCursorColumn(m.col - 1)
868+ for unicode.IsSpace(m.value[m.row][m.col]) {
869+ if m.col <= 0 {
870+ break
871+ }
872+ // ignore series of whitespace before cursor
873+ m.SetCursorColumn(m.col - 1)
874+ }
875+
876+ for m.col > 0 {
877+ if !unicode.IsSpace(m.value[m.row][m.col]) {
878+ m.SetCursorColumn(m.col - 1)
879+ } else {
880+ if m.col > 0 {
881+ // keep the previous space
882+ m.SetCursorColumn(m.col + 1)
883+ }
884+ break
885+ }
886+ }
887+
888+ if oldCol > len(m.value[m.row]) {
889+ m.value[m.row] = m.value[m.row][:m.col]
890+ } else {
891+ m.value[m.row] = append(m.value[m.row][:m.col], m.value[m.row][oldCol:]...)
892+ }
893+}
894+
895+// deleteWordRight deletes the word right to the cursor.
896+func (m *Model) deleteWordRight() {
897+ if m.col >= len(m.value[m.row]) || len(m.value[m.row]) == 0 {
898+ return
899+ }
900+
901+ oldCol := m.col
902+
903+ for m.col < len(m.value[m.row]) && unicode.IsSpace(m.value[m.row][m.col]) {
904+ // ignore series of whitespace after cursor
905+ m.SetCursorColumn(m.col + 1)
906+ }
907+
908+ for m.col < len(m.value[m.row]) {
909+ if !unicode.IsSpace(m.value[m.row][m.col]) {
910+ m.SetCursorColumn(m.col + 1)
911+ } else {
912+ break
913+ }
914+ }
915+
916+ if m.col > len(m.value[m.row]) {
917+ m.value[m.row] = m.value[m.row][:oldCol]
918+ } else {
919+ m.value[m.row] = append(m.value[m.row][:oldCol], m.value[m.row][m.col:]...)
920+ }
921+
922+ m.SetCursorColumn(oldCol)
923+}
924+
925+// characterRight moves the cursor one character to the right.
926+func (m *Model) characterRight() {
927+ if m.col < len(m.value[m.row]) {
928+ m.SetCursorColumn(m.col + 1)
929+ } else {
930+ if m.row < len(m.value)-1 {
931+ m.row++
932+ m.CursorStart()
933+ }
934+ }
935+}
936+
937+// characterLeft moves the cursor one character to the left.
938+// If insideLine is set, the cursor is moved to the last
939+// character in the previous line, instead of one past that.
940+func (m *Model) characterLeft(insideLine bool) {
941+ if m.col == 0 && m.row != 0 {
942+ m.row--
943+ m.CursorEnd()
944+ if !insideLine {
945+ return
946+ }
947+ }
948+ if m.col > 0 {
949+ m.SetCursorColumn(m.col - 1)
950+ }
951+}
952+
953+// wordLeft moves the cursor one word to the left. Returns whether or not the
954+// cursor blink should be reset. If input is masked, move input to the start
955+// so as not to reveal word breaks in the masked input.
956+func (m *Model) wordLeft() {
957+ for {
958+ m.characterLeft(true /* insideLine */)
959+ if m.col < len(m.value[m.row]) && !unicode.IsSpace(m.value[m.row][m.col]) {
960+ break
961+ }
962+ }
963+
964+ for m.col > 0 {
965+ if unicode.IsSpace(m.value[m.row][m.col-1]) {
966+ break
967+ }
968+ m.SetCursorColumn(m.col - 1)
969+ }
970+}
971+
972+// wordRight moves the cursor one word to the right. Returns whether or not the
973+// cursor blink should be reset. If the input is masked, move input to the end
974+// so as not to reveal word breaks in the masked input.
975+func (m *Model) wordRight() {
976+ m.doWordRight(func(int, int) { /* nothing */ })
977+}
978+
979+func (m *Model) doWordRight(fn func(charIdx int, pos int)) {
980+ // Skip spaces forward.
981+ for m.col >= len(m.value[m.row]) || unicode.IsSpace(m.value[m.row][m.col]) {
982+ if m.row == len(m.value)-1 && m.col == len(m.value[m.row]) {
983+ // End of text.
984+ break
985+ }
986+ m.characterRight()
987+ }
988+
989+ charIdx := 0
990+ for m.col < len(m.value[m.row]) {
991+ if unicode.IsSpace(m.value[m.row][m.col]) {
992+ break
993+ }
994+ fn(charIdx, m.col)
995+ m.SetCursorColumn(m.col + 1)
996+ charIdx++
997+ }
998+}
999+
1000+// uppercaseRight changes the word to the right to uppercase.
1001+func (m *Model) uppercaseRight() {
1002+ m.doWordRight(func(_ int, i int) {
1003+ m.value[m.row][i] = unicode.ToUpper(m.value[m.row][i])
1004+ })
1005+}
1006+
1007+// lowercaseRight changes the word to the right to lowercase.
1008+func (m *Model) lowercaseRight() {
1009+ m.doWordRight(func(_ int, i int) {
1010+ m.value[m.row][i] = unicode.ToLower(m.value[m.row][i])
1011+ })
1012+}
1013+
1014+// capitalizeRight changes the word to the right to title case.
1015+func (m *Model) capitalizeRight() {
1016+ m.doWordRight(func(charIdx int, i int) {
1017+ if charIdx == 0 {
1018+ m.value[m.row][i] = unicode.ToTitle(m.value[m.row][i])
1019+ }
1020+ })
1021+}
1022+
1023+// LineInfo returns the number of characters from the start of the
1024+// (soft-wrapped) line and the (soft-wrapped) line width.
1025+func (m Model) LineInfo() LineInfo {
1026+ grid := m.memoizedWrap(m.value[m.row], m.width)
1027+
1028+ // Find out which line we are currently on. This can be determined by the
1029+ // m.col and counting the number of runes that we need to skip.
1030+ var counter int
1031+ for i, line := range grid {
1032+ // We've found the line that we are on
1033+ if counter+len(line) == m.col && i+1 < len(grid) {
1034+ // We wrap around to the next line if we are at the end of the
1035+ // previous line so that we can be at the very beginning of the row
1036+ return LineInfo{
1037+ CharOffset: 0,
1038+ ColumnOffset: 0,
1039+ Height: len(grid),
1040+ RowOffset: i + 1,
1041+ StartColumn: m.col,
1042+ Width: len(grid[i+1]),
1043+ CharWidth: uniseg.StringWidth(string(line)),
1044+ }
1045+ }
1046+
1047+ if counter+len(line) >= m.col {
1048+ return LineInfo{
1049+ CharOffset: uniseg.StringWidth(string(line[:max(0, m.col-counter)])),
1050+ ColumnOffset: m.col - counter,
1051+ Height: len(grid),
1052+ RowOffset: i,
1053+ StartColumn: counter,
1054+ Width: len(line),
1055+ CharWidth: uniseg.StringWidth(string(line)),
1056+ }
1057+ }
1058+
1059+ counter += len(line)
1060+ }
1061+ return LineInfo{}
1062+}
1063+
1064+// repositionView repositions the view of the viewport based on the defined
1065+// scrolling behavior.
1066+func (m *Model) repositionView() {
1067+ minimum := m.viewport.YOffset()
1068+ maximum := minimum + m.viewport.Height() - 1
1069+ if row := m.cursorLineNumber(); row < minimum {
1070+ m.viewport.ScrollUp(minimum - row)
1071+ } else if row > maximum {
1072+ m.viewport.ScrollDown(row - maximum)
1073+ }
1074+}
1075+
1076+// Width returns the width of the textarea.
1077+func (m Model) Width() int {
1078+ return m.width
1079+}
1080+
1081+// MoveToBegin moves the cursor to the beginning of the input.
1082+func (m *Model) MoveToBegin() {
1083+ m.row = 0
1084+ m.SetCursorColumn(0)
1085+ m.repositionView()
1086+}
1087+
1088+// MoveToEnd moves the cursor to the end of the input.
1089+func (m *Model) MoveToEnd() {
1090+ m.row = len(m.value) - 1
1091+ m.SetCursorColumn(len(m.value[m.row]))
1092+ m.repositionView()
1093+}
1094+
1095+// PageUp moves the cursor up by one page. First call snaps to the first visible
1096+// line, subsequent calls move up by a full page.
1097+func (m *Model) PageUp() {
1098+ // If not on the first visible line, snap to it.
1099+ if offset := m.viewport.YOffset() - m.cursorLineNumber(); offset < 0 {
1100+ m.setCursorLineRelative(offset)
1101+ return
1102+ }
1103+
1104+ // Already on first visible line, move up by a full page.
1105+ m.setCursorLineRelative(-m.height)
1106+}
1107+
1108+// PageDown moves the cursor down by one page. First call snaps to the last
1109+// visible line, subsequent calls move down by a full page.
1110+func (m *Model) PageDown() {
1111+ // If not on the last visible line, snap to it.
1112+ if offset := m.cursorLineNumber() - m.viewport.YOffset(); offset < m.height-1 {
1113+ m.setCursorLineRelative(m.height - 1 - offset)
1114+ return
1115+ }
1116+
1117+ // Already on last visible line, move down by a full page.
1118+ m.setCursorLineRelative(m.height)
1119+}
1120+
1121+// SetWidth sets the width of the textarea to fit exactly within the given width.
1122+// This means that the textarea will account for the width of the prompt and
1123+// whether or not line numbers are being shown.
1124+//
1125+// Ensure that SetWidth is called after setting the Prompt and ShowLineNumbers,
1126+// It is important that the width of the textarea be exactly the given width
1127+// and no more.
1128+func (m *Model) SetWidth(w int) {
1129+ // Update prompt width only if there is no prompt function as
1130+ // [SetPromptFunc] updates the prompt width when it is called.
1131+ if m.promptFunc == nil {
1132+ // XXX: Do we even need this or can we calculate the prompt width
1133+ // at render time?
1134+ m.promptWidth = uniseg.StringWidth(m.Prompt)
1135+ }
1136+
1137+ // Add base style borders and padding to reserved outer width.
1138+ reservedOuter := m.activeStyle().Base.GetHorizontalFrameSize()
1139+
1140+ // Add prompt width to reserved inner width.
1141+ reservedInner := m.promptWidth
1142+
1143+ // Add line number width to reserved inner width.
1144+ if m.ShowLineNumbers {
1145+ // XXX: this was originally documented as needing "1 cell" but was,
1146+ // in practice, effectively hardcoded to 2 cells. We can, and should,
1147+ // reduce this to one gap and update the tests accordingly.
1148+ const gap = 2
1149+
1150+ // Number of digits plus 1 cell for the margin.
1151+ reservedInner += numDigits(m.MaxHeight) + gap
1152+ }
1153+
1154+ // Input width must be at least one more than the reserved inner and outer
1155+ // width. This gives us a minimum input width of 1.
1156+ minWidth := reservedInner + reservedOuter + 1
1157+ inputWidth := max(w, minWidth)
1158+
1159+ // Input width must be no more than maximum width.
1160+ if m.MaxWidth > 0 {
1161+ inputWidth = min(inputWidth, m.MaxWidth)
1162+ }
1163+
1164+ // Since the width of the viewport and input area is dependent on the width of
1165+ // borders, prompt and line numbers, we need to calculate it by subtracting
1166+ // the reserved width from them.
1167+
1168+ m.viewport.SetWidth(inputWidth - reservedOuter)
1169+ m.width = inputWidth - reservedOuter - reservedInner
1170+ m.recalculateHeight()
1171+}
1172+
1173+// SetPromptFunc supersedes the Prompt field and sets a dynamic prompt instead.
1174+//
1175+// If the function returns a prompt that is shorter than the specified
1176+// promptWidth, it will be padded to the left. If it returns a prompt that is
1177+// longer, display artifacts may occur; the caller is responsible for computing
1178+// an adequate promptWidth.
1179+func (m *Model) SetPromptFunc(promptWidth int, fn func(PromptInfo) string) {
1180+ m.promptFunc = fn
1181+ m.promptWidth = promptWidth
1182+}
1183+
1184+// Height returns the current height of the textarea.
1185+func (m Model) Height() int {
1186+ return m.height
1187+}
1188+
1189+// SetHeight sets the height of the textarea.
1190+func (m *Model) SetHeight(h int) {
1191+ if m.MaxHeight > 0 {
1192+ m.height = clamp(h, minHeight, m.MaxHeight)
1193+ m.viewport.SetHeight(clamp(h, minHeight, m.MaxHeight))
1194+ } else {
1195+ m.height = max(h, minHeight)
1196+ m.viewport.SetHeight(max(h, minHeight))
1197+ }
1198+
1199+ m.repositionView()
1200+}
1201+
1202+// Update is the Bubble Tea update loop.
1203+func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
1204+ if !m.focus {
1205+ m.virtualCursor.Blur()
1206+ return m, nil
1207+ }
1208+
1209+ // Used to determine if the cursor should blink.
1210+ oldRow, oldCol := m.cursorLineNumber(), m.col
1211+
1212+ var cmds []tea.Cmd
1213+
1214+ if m.value[m.row] == nil {
1215+ m.value[m.row] = make([]rune, 0)
1216+ }
1217+
1218+ if m.MaxHeight > 0 && m.MaxHeight != m.cache.Capacity() {
1219+ m.cache = memoization.NewMemoCache[line, [][]rune](m.MaxHeight)
1220+ }
1221+
1222+ switch msg := msg.(type) {
1223+ case tea.PasteMsg:
1224+ m.insertRunesFromUserInput([]rune(msg.Content))
1225+ case tea.KeyPressMsg:
1226+ switch {
1227+ case key.Matches(msg, m.KeyMap.DeleteAfterCursor):
1228+ m.col = clamp(m.col, 0, len(m.value[m.row]))
1229+ if m.col >= len(m.value[m.row]) {
1230+ m.mergeLineBelow(m.row)
1231+ break
1232+ }
1233+ m.deleteAfterCursor()
1234+ case key.Matches(msg, m.KeyMap.DeleteBeforeCursor):
1235+ m.col = clamp(m.col, 0, len(m.value[m.row]))
1236+ if m.col <= 0 {
1237+ m.mergeLineAbove(m.row)
1238+ break
1239+ }
1240+ m.deleteBeforeCursor()
1241+ case key.Matches(msg, m.KeyMap.DeleteCharacterBackward):
1242+ m.col = clamp(m.col, 0, len(m.value[m.row]))
1243+ if m.col <= 0 {
1244+ m.mergeLineAbove(m.row)
1245+ break
1246+ }
1247+ if len(m.value[m.row]) > 0 {
1248+ m.value[m.row] = append(m.value[m.row][:max(0, m.col-1)], m.value[m.row][m.col:]...)
1249+ if m.col > 0 {
1250+ m.SetCursorColumn(m.col - 1)
1251+ }
1252+ }
1253+ case key.Matches(msg, m.KeyMap.DeleteCharacterForward):
1254+ if len(m.value[m.row]) > 0 && m.col < len(m.value[m.row]) {
1255+ m.value[m.row] = slices.Delete(m.value[m.row], m.col, m.col+1)
1256+ }
1257+ if m.col >= len(m.value[m.row]) {
1258+ m.mergeLineBelow(m.row)
1259+ break
1260+ }
1261+ case key.Matches(msg, m.KeyMap.DeleteWordBackward):
1262+ if m.col <= 0 {
1263+ m.mergeLineAbove(m.row)
1264+ break
1265+ }
1266+ m.deleteWordLeft()
1267+ case key.Matches(msg, m.KeyMap.DeleteWordForward):
1268+ m.col = clamp(m.col, 0, len(m.value[m.row]))
1269+ if m.col >= len(m.value[m.row]) {
1270+ m.mergeLineBelow(m.row)
1271+ break
1272+ }
1273+ m.deleteWordRight()
1274+ case key.Matches(msg, m.KeyMap.InsertNewline):
1275+ if m.atContentLimit() {
1276+ return m, nil
1277+ }
1278+ m.col = clamp(m.col, 0, len(m.value[m.row]))
1279+ m.splitLine(m.row, m.col)
1280+ case key.Matches(msg, m.KeyMap.LineEnd):
1281+ m.CursorEnd()
1282+ case key.Matches(msg, m.KeyMap.LineStart):
1283+ m.CursorStart()
1284+ case key.Matches(msg, m.KeyMap.CharacterForward):
1285+ m.characterRight()
1286+ case key.Matches(msg, m.KeyMap.LineNext):
1287+ m.CursorDown()
1288+ case key.Matches(msg, m.KeyMap.WordForward):
1289+ m.wordRight()
1290+ case key.Matches(msg, m.KeyMap.Paste):
1291+ return m, Paste
1292+ case key.Matches(msg, m.KeyMap.CharacterBackward):
1293+ m.characterLeft(false /* insideLine */)
1294+ case key.Matches(msg, m.KeyMap.LinePrevious):
1295+ m.CursorUp()
1296+ case key.Matches(msg, m.KeyMap.WordBackward):
1297+ m.wordLeft()
1298+ case key.Matches(msg, m.KeyMap.InputBegin):
1299+ m.MoveToBegin()
1300+ case key.Matches(msg, m.KeyMap.InputEnd):
1301+ m.MoveToEnd()
1302+ case key.Matches(msg, m.KeyMap.PageUp):
1303+ m.PageUp()
1304+ case key.Matches(msg, m.KeyMap.PageDown):
1305+ m.PageDown()
1306+ case key.Matches(msg, m.KeyMap.LowercaseWordForward):
1307+ m.lowercaseRight()
1308+ case key.Matches(msg, m.KeyMap.UppercaseWordForward):
1309+ m.uppercaseRight()
1310+ case key.Matches(msg, m.KeyMap.CapitalizeWordForward):
1311+ m.capitalizeRight()
1312+ case key.Matches(msg, m.KeyMap.TransposeCharacterBackward):
1313+ m.transposeLeft()
1314+
1315+ default:
1316+ m.insertRunesFromUserInput([]rune(msg.Text))
1317+ }
1318+
1319+ case pasteMsg:
1320+ m.insertRunesFromUserInput([]rune(msg))
1321+
1322+ case pasteErrMsg:
1323+ m.Err = msg
1324+ }
1325+
1326+ m.recalculateHeight()
1327+
1328+ // Make sure we set the content of the viewport before updating it.
1329+ view := m.view()
1330+ m.viewport.SetContent(view)
1331+ vp, cmd := m.viewport.Update(msg)
1332+ m.viewport = &vp
1333+ cmds = append(cmds, cmd)
1334+
1335+ if m.useVirtualCursor {
1336+ m.virtualCursor, cmd = m.virtualCursor.Update(msg)
1337+
1338+ // If the cursor has moved, reset the blink state. This is a small UX
1339+ // nuance that makes cursor movement obvious and feel snappy.
1340+ newRow, newCol := m.cursorLineNumber(), m.col
1341+ if (newRow != oldRow || newCol != oldCol) && m.virtualCursor.Mode() == cursor.CursorBlink {
1342+ m.virtualCursor.IsBlinked = false
1343+ cmd = m.virtualCursor.Blink()
1344+ }
1345+ cmds = append(cmds, cmd)
1346+ }
1347+
1348+ m.repositionView()
1349+
1350+ return m, tea.Batch(cmds...)
1351+}
1352+
1353+func (m *Model) view() string {
1354+ if len(m.Value()) == 0 && m.row == 0 && m.col == 0 && m.Placeholder != "" {
1355+ return m.placeholderView()
1356+ }
1357+ m.virtualCursor.TextStyle = m.activeStyle().computedCursorLine()
1358+
1359+ var (
1360+ s strings.Builder
1361+ style lipgloss.Style
1362+ newLines int
1363+ widestLineNumber int
1364+ lineInfo = m.LineInfo()
1365+ styles = m.activeStyle()
1366+ )
1367+
1368+ displayLine := 0
1369+ for l, line := range m.value {
1370+ wrappedLines := m.memoizedWrap(line, m.width)
1371+
1372+ if m.row == l {
1373+ style = styles.computedCursorLine()
1374+ } else {
1375+ style = styles.computedText()
1376+ }
1377+
1378+ for wl, wrappedLine := range wrappedLines {
1379+ prompt := m.promptView(displayLine)
1380+ s.WriteString(style.Render(prompt))
1381+ displayLine++
1382+
1383+ var ln string
1384+ if m.ShowLineNumbers {
1385+ if wl == 0 { // normal line
1386+ isCursorLine := m.row == l
1387+ s.WriteString(m.lineNumberView(l+1, isCursorLine))
1388+ } else { // soft wrapped line
1389+ isCursorLine := m.row == l
1390+ s.WriteString(m.lineNumberView(-1, isCursorLine))
1391+ }
1392+ }
1393+
1394+ // Note the widest line number for padding purposes later.
1395+ lnw := uniseg.StringWidth(ln)
1396+ if lnw > widestLineNumber {
1397+ widestLineNumber = lnw
1398+ }
1399+
1400+ strwidth := uniseg.StringWidth(string(wrappedLine))
1401+ padding := m.width - strwidth
1402+ // If the trailing space causes the line to be wider than the
1403+ // width, we should not draw it to the screen since it will result
1404+ // in an extra space at the end of the line which can look off when
1405+ // the cursor line is showing.
1406+ if strwidth > m.width {
1407+ // The character causing the line to be wider than the width is
1408+ // guaranteed to be a space since any other character would
1409+ // have been wrapped.
1410+ wrappedLine = []rune(strings.TrimSuffix(string(wrappedLine), " "))
1411+ padding -= m.width - strwidth
1412+ }
1413+ if m.row == l && lineInfo.RowOffset == wl {
1414+ s.WriteString(style.Render(string(wrappedLine[:lineInfo.ColumnOffset])))
1415+ if m.col >= len(line) && lineInfo.CharOffset >= m.width {
1416+ m.virtualCursor.SetChar(" ")
1417+ s.WriteString(m.virtualCursor.View())
1418+ } else {
1419+ m.virtualCursor.SetChar(string(wrappedLine[lineInfo.ColumnOffset]))
1420+ s.WriteString(style.Render(m.virtualCursor.View()))
1421+ s.WriteString(style.Render(string(wrappedLine[lineInfo.ColumnOffset+1:])))
1422+ }
1423+ } else {
1424+ s.WriteString(style.Render(string(wrappedLine)))
1425+ }
1426+ s.WriteString(style.Render(strings.Repeat(" ", max(0, padding))))
1427+ s.WriteRune('\n')
1428+ newLines++
1429+ }
1430+ }
1431+
1432+ // Always show at least `m.Height` lines at all times.
1433+ // To do this we can simply pad out a few extra new lines in the view.
1434+ for range m.height {
1435+ s.WriteString(m.promptView(displayLine))
1436+ displayLine++
1437+
1438+ // Write end of buffer content
1439+ leftGutter := string(m.EndOfBufferCharacter)
1440+ rightGapWidth := m.Width() - uniseg.StringWidth(leftGutter) + widestLineNumber
1441+ rightGap := strings.Repeat(" ", max(0, rightGapWidth))
1442+ s.WriteString(styles.computedEndOfBuffer().Render(leftGutter + rightGap))
1443+ s.WriteRune('\n')
1444+ }
1445+
1446+ return s.String()
1447+}
1448+
1449+// View renders the text area in its current state.
1450+func (m Model) View() string {
1451+ // XXX: This is a workaround for the case where the viewport hasn't
1452+ // been initialized yet like during the initial render. In that case,
1453+ // we need to render the view again because Update hasn't been called
1454+ // yet to set the content of the viewport.
1455+ m.viewport.SetContent(m.view())
1456+ view := m.viewport.View()
1457+ styles := m.activeStyle()
1458+ return styles.Base.Render(view)
1459+}
1460+
1461+// promptView renders a single line of the prompt.
1462+func (m Model) promptView(displayLine int) (prompt string) {
1463+ prompt = m.Prompt
1464+ if m.promptFunc != nil {
1465+ prompt = m.promptFunc(PromptInfo{
1466+ LineNumber: displayLine,
1467+ Focused: m.focus,
1468+ })
1469+ width := lipgloss.Width(prompt)
1470+ if width < m.promptWidth {
1471+ prompt = fmt.Sprintf("%*s%s", m.promptWidth-width, "", prompt)
1472+ }
1473+ }
1474+
1475+ return m.activeStyle().computedPrompt().Render(prompt)
1476+}
1477+
1478+// lineNumberView renders the line number.
1479+//
1480+// If the argument is less than 0, a space styled as a line number is returned
1481+// instead. Such cases are used for soft-wrapped lines.
1482+//
1483+// The second argument indicates whether this line number is for a 'cursorline'
1484+// line number.
1485+func (m Model) lineNumberView(n int, isCursorLine bool) (str string) {
1486+ if !m.ShowLineNumbers {
1487+ return ""
1488+ }
1489+
1490+ if n <= 0 {
1491+ str = " "
1492+ } else {
1493+ str = strconv.Itoa(n)
1494+ }
1495+
1496+ // XXX: is textStyle really necessary here?
1497+ textStyle := m.activeStyle().computedText()
1498+ lineNumberStyle := m.activeStyle().computedLineNumber()
1499+ if isCursorLine {
1500+ textStyle = m.activeStyle().computedCursorLine()
1501+ lineNumberStyle = m.activeStyle().computedCursorLineNumber()
1502+ }
1503+
1504+ // Format line number dynamically based on the maximum number of lines.
1505+ digits := len(strconv.Itoa(m.MaxHeight))
1506+ str = fmt.Sprintf(" %*v ", digits, str)
1507+
1508+ return textStyle.Render(lineNumberStyle.Render(str))
1509+}
1510+
1511+// placeholderView returns the prompt and placeholder, if any.
1512+func (m Model) placeholderView() string {
1513+ var (
1514+ s strings.Builder
1515+ p = m.Placeholder
1516+ styles = m.activeStyle()
1517+ )
1518+ // word wrap lines
1519+ pwordwrap := ansi.Wordwrap(p, m.width, "")
1520+ // hard wrap lines (handles lines that could not be word wrapped)
1521+ pwrap := ansi.Hardwrap(pwordwrap, m.width, true)
1522+ // split string by new lines
1523+ plines := strings.Split(strings.TrimSpace(pwrap), "\n")
1524+
1525+ for i := range m.height {
1526+ isLineNumber := len(plines) > i
1527+
1528+ lineStyle := styles.computedPlaceholder()
1529+ if len(plines) > i {
1530+ lineStyle = styles.computedCursorLine()
1531+ }
1532+
1533+ // render prompt
1534+ prompt := m.promptView(i)
1535+ s.WriteString(lineStyle.Render(prompt))
1536+
1537+ // when show line numbers enabled:
1538+ // - render line number for only the cursor line
1539+ // - indent other placeholder lines
1540+ // this is consistent with vim with line numbers enabled
1541+ if m.ShowLineNumbers {
1542+ var ln int
1543+
1544+ switch {
1545+ case i == 0:
1546+ ln = i + 1
1547+ fallthrough
1548+ case len(plines) > i:
1549+ s.WriteString(m.lineNumberView(ln, isLineNumber))
1550+ default:
1551+ }
1552+ }
1553+
1554+ switch {
1555+ // first line
1556+ case i == 0:
1557+ // first character of first line as cursor with character
1558+ m.virtualCursor.TextStyle = styles.computedPlaceholder()
1559+
1560+ ch, rest, _, _ := uniseg.FirstGraphemeClusterInString(plines[0], 0)
1561+ m.virtualCursor.SetChar(ch)
1562+ s.WriteString(lineStyle.Render(m.virtualCursor.View()))
1563+
1564+ // the rest of the first line
1565+ s.WriteString(lineStyle.Render(styles.computedPlaceholder().Render(rest)))
1566+
1567+ // extend the first line with spaces to fill the width, so that
1568+ // the entire line is filled when cursorline is enabled.
1569+ gap := strings.Repeat(" ", max(0, m.width-lipgloss.Width(plines[0])))
1570+ s.WriteString(lineStyle.Render(gap))
1571+ // remaining lines
1572+ case len(plines) > i:
1573+ // current line placeholder text
1574+ if len(plines) > i {
1575+ placeholderLine := plines[i]
1576+ gap := strings.Repeat(" ", max(0, m.width-uniseg.StringWidth(plines[i])))
1577+ s.WriteString(lineStyle.Render(placeholderLine + gap))
1578+ }
1579+ default:
1580+ // end of line buffer character
1581+ eob := styles.computedEndOfBuffer().Render(string(m.EndOfBufferCharacter))
1582+ s.WriteString(eob)
1583+ }
1584+
1585+ // terminate with new line
1586+ s.WriteRune('\n')
1587+ }
1588+
1589+ m.viewport.SetContent(s.String())
1590+ return styles.Base.Render(m.viewport.View())
1591+}
1592+
1593+// Blink returns the blink command for the virtual cursor.
1594+func Blink() tea.Msg {
1595+ return cursor.Blink()
1596+}
1597+
1598+// Cursor returns a [tea.Cursor] for rendering a real cursor in a Bubble Tea
1599+// program. This requires that [Model.VirtualCursor] is set to false.
1600+//
1601+// Note that you will almost certainly also need to adjust the offset cursor
1602+// position per the textarea's per the textarea's position in the terminal.
1603+//
1604+// Example:
1605+//
1606+// // In your top-level View function:
1607+// f := tea.NewFrame(m.textarea.View())
1608+// f.Cursor = m.textarea.Cursor()
1609+// f.Cursor.Position.X += offsetX
1610+// f.Cursor.Position.Y += offsetY
1611+func (m Model) Cursor() *tea.Cursor {
1612+ if m.useVirtualCursor || !m.Focused() {
1613+ return nil
1614+ }
1615+
1616+ lineInfo := m.LineInfo()
1617+ w := lipgloss.Width
1618+ baseStyle := m.activeStyle().Base
1619+
1620+ xOffset := lineInfo.CharOffset +
1621+ w(m.promptView(0)) +
1622+ w(m.lineNumberView(0, false)) +
1623+ baseStyle.GetMarginLeft() +
1624+ baseStyle.GetPaddingLeft() +
1625+ baseStyle.GetBorderLeftSize()
1626+
1627+ yOffset := m.cursorLineNumber() -
1628+ m.viewport.YOffset() +
1629+ baseStyle.GetMarginTop() +
1630+ baseStyle.GetPaddingTop() +
1631+ baseStyle.GetBorderTopSize()
1632+
1633+ c := tea.NewCursor(xOffset, yOffset)
1634+ c.Blink = m.styles.Cursor.Blink
1635+ c.Color = m.styles.Cursor.Color
1636+ c.Shape = m.styles.Cursor.Shape
1637+ return c
1638+}
1639+
1640+func (m Model) memoizedWrap(runes []rune, width int) [][]rune {
1641+ input := line{runes: runes, width: width}
1642+ if v, ok := m.cache.Get(input); ok {
1643+ return v
1644+ }
1645+ v := wrap(runes, width)
1646+ m.cache.Set(input, v)
1647+ return v
1648+}
1649+
1650+// cursorLineNumber returns the line number that the cursor is on.
1651+// This accounts for soft wrapped lines.
1652+func (m Model) cursorLineNumber() int {
1653+ line := 0
1654+ for i := range m.row {
1655+ // Calculate the number of lines that the current line will be split
1656+ // into.
1657+ line += len(m.memoizedWrap(m.value[i], m.width))
1658+ }
1659+ line += m.LineInfo().RowOffset
1660+ return line
1661+}
1662+
1663+// totalVisualLines returns the total number of display lines across all
1664+// logical lines, accounting for soft wraps.
1665+func (m *Model) totalVisualLines() int {
1666+ n := 0
1667+ for _, line := range m.value {
1668+ n += len(m.memoizedWrap(line, m.width))
1669+ }
1670+ return n
1671+}
1672+
1673+// recalculateHeight recomputes and applies the textarea height based on
1674+// content when DynamicHeight is enabled. It is a no-op otherwise.
1675+func (m *Model) recalculateHeight() {
1676+ if !m.DynamicHeight {
1677+ return
1678+ }
1679+ minH := max(m.MinHeight, minHeight)
1680+ total := m.totalVisualLines()
1681+ h := max(total, minH)
1682+ if m.MaxHeight > 0 {
1683+ h = min(h, m.MaxHeight)
1684+ }
1685+ if maxOffset := total - h; m.viewport.YOffset() > maxOffset {
1686+ m.viewport.SetYOffset(max(0, maxOffset))
1687+ }
1688+ m.SetHeight(h)
1689+}
1690+
1691+// atContentLimit reports whether the textarea has reached its content limit.
1692+// When MaxContentHeight is set (> 0), it checks total visual lines.
1693+// Otherwise it falls back to the legacy MaxHeight logical-line check for
1694+// backward compatibility.
1695+func (m *Model) atContentLimit() bool {
1696+ if m.MaxContentHeight > 0 {
1697+ return m.totalVisualLines() >= m.MaxContentHeight
1698+ }
1699+ return m.MaxHeight > 0 && len(m.value) >= m.MaxHeight
1700+}
1701+
1702+// visualLinesForInsert estimates how many additional visual lines would result
1703+// from inserting the given lines at the current cursor position. The first
1704+// element merges into the current line; subsequent elements become new lines.
1705+func (m *Model) visualLinesForInsert(lines [][]rune) int {
1706+ if len(lines) == 0 {
1707+ return 0
1708+ }
1709+
1710+ // The current row's visual line count before insertion.
1711+ currentRowVisual := len(m.memoizedWrap(m.value[m.row], m.width))
1712+
1713+ // Simulate merging the first paste line into the current row.
1714+ merged := make([]rune, m.col+len(lines[0]))
1715+ copy(merged, m.value[m.row][:m.col])
1716+ copy(merged[m.col:], lines[0])
1717+ if len(lines) == 1 {
1718+ merged = append(merged, m.value[m.row][m.col:]...)
1719+ }
1720+ delta := len(m.memoizedWrap(merged, m.width)) - currentRowVisual
1721+
1722+ // Each additional line is a new logical line.
1723+ for i, content := range lines {
1724+ if i == len(lines)-1 {
1725+ content = append(content, m.value[m.row][m.col:]...)
1726+ }
1727+ delta += len(m.memoizedWrap(content, m.width))
1728+ }
1729+
1730+ return delta
1731+}
1732+
1733+// mergeLineBelow merges the current line the cursor is on with the line below.
1734+func (m *Model) mergeLineBelow(row int) {
1735+ if row >= len(m.value)-1 {
1736+ return
1737+ }
1738+
1739+ // To perform a merge, we will need to combine the two lines and then
1740+ m.value[row] = append(m.value[row], m.value[row+1]...)
1741+
1742+ // Shift all lines up by one
1743+ for i := row + 1; i < len(m.value)-1; i++ {
1744+ m.value[i] = m.value[i+1]
1745+ }
1746+
1747+ // And, remove the last line
1748+ if len(m.value) > 0 {
1749+ m.value = m.value[:len(m.value)-1]
1750+ }
1751+}
1752+
1753+// mergeLineAbove merges the current line the cursor is on with the line above.
1754+func (m *Model) mergeLineAbove(row int) {
1755+ if row <= 0 {
1756+ return
1757+ }
1758+
1759+ m.col = len(m.value[row-1])
1760+ m.row = m.row - 1
1761+
1762+ // To perform a merge, we will need to combine the two lines and then
1763+ m.value[row-1] = append(m.value[row-1], m.value[row]...)
1764+
1765+ // Shift all lines up by one
1766+ for i := row; i < len(m.value)-1; i++ {
1767+ m.value[i] = m.value[i+1]
1768+ }
1769+
1770+ // And, remove the last line
1771+ if len(m.value) > 0 {
1772+ m.value = m.value[:len(m.value)-1]
1773+ }
1774+}
1775+
1776+func (m *Model) splitLine(row, col int) {
1777+ // To perform a split, take the current line and keep the content before
1778+ // the cursor, take the content after the cursor and make it the content of
1779+ // the line underneath, and shift the remaining lines down by one
1780+ head, tailSrc := m.value[row][:col], m.value[row][col:]
1781+ tail := make([]rune, len(tailSrc))
1782+ copy(tail, tailSrc)
1783+
1784+ m.value = append(m.value[:row+1], m.value[row:]...)
1785+
1786+ m.value[row] = head
1787+ m.value[row+1] = tail
1788+
1789+ m.col = 0
1790+ m.row++
1791+}
1792+
1793+// Paste is a command for pasting from the clipboard into the text input.
1794+func Paste() tea.Msg {
1795+ str, err := clipboard.ReadAll()
1796+ if err != nil {
1797+ return pasteErrMsg{err}
1798+ }
1799+ return pasteMsg(str)
1800+}
1801+
1802+func wrap(runes []rune, width int) [][]rune {
1803+ var (
1804+ lines = [][]rune{{}}
1805+ word = []rune{}
1806+ row int
1807+ spaces int
1808+ )
1809+
1810+ // Word wrap the runes
1811+ for _, r := range runes {
1812+ if unicode.IsSpace(r) {
1813+ spaces++
1814+ } else {
1815+ word = append(word, r)
1816+ }
1817+
1818+ if spaces > 0 { //nolint:nestif
1819+ if uniseg.StringWidth(string(lines[row]))+uniseg.StringWidth(string(word))+spaces > width {
1820+ row++
1821+ lines = append(lines, []rune{})
1822+ lines[row] = append(lines[row], word...)
1823+ lines[row] = append(lines[row], repeatSpaces(spaces)...)
1824+ spaces = 0
1825+ word = nil
1826+ } else {
1827+ lines[row] = append(lines[row], word...)
1828+ lines[row] = append(lines[row], repeatSpaces(spaces)...)
1829+ spaces = 0
1830+ word = nil
1831+ }
1832+ } else {
1833+ // If the last character is a double-width rune, then we may not be able to add it to this line
1834+ // as it might cause us to go past the width.
1835+ lastCharLen := rw.RuneWidth(word[len(word)-1])
1836+ if uniseg.StringWidth(string(word))+lastCharLen > width {
1837+ // If the current line has any content, let's move to the next
1838+ // line because the current word fills up the entire line.
1839+ if len(lines[row]) > 0 {
1840+ row++
1841+ lines = append(lines, []rune{})
1842+ }
1843+ lines[row] = append(lines[row], word...)
1844+ word = nil
1845+ }
1846+ }
1847+ }
1848+
1849+ if uniseg.StringWidth(string(lines[row]))+uniseg.StringWidth(string(word))+spaces >= width {
1850+ lines = append(lines, []rune{})
1851+ lines[row+1] = append(lines[row+1], word...)
1852+ // We add an extra space at the end of the line to account for the
1853+ // trailing space at the end of the previous soft-wrapped lines so that
1854+ // behaviour when navigating is consistent and so that we don't need to
1855+ // continually add edges to handle the last line of the wrapped input.
1856+ spaces++
1857+ lines[row+1] = append(lines[row+1], repeatSpaces(spaces)...)
1858+ } else {
1859+ lines[row] = append(lines[row], word...)
1860+ spaces++
1861+ lines[row] = append(lines[row], repeatSpaces(spaces)...)
1862+ }
1863+
1864+ return lines
1865+}
1866+
1867+func repeatSpaces(n int) []rune {
1868+ return []rune(strings.Repeat(string(' '), n))
1869+}
1870+
1871+// numDigits returns the number of digits in an integer.
1872+func numDigits(n int) int {
1873+ if n == 0 {
1874+ return 1
1875+ }
1876+ count := 0
1877+ num := abs(n)
1878+ for num > 0 {
1879+ count++
1880+ num /= 10
1881+ }
1882+ return count
1883+}
1884+
1885+func clamp(v, low, high int) int {
1886+ if high < low {
1887+ low, high = high, low
1888+ }
1889+ return min(high, max(low, v))
1890+}
1891+
1892+func abs(n int) int {
1893+ if n < 0 {
1894+ return -n
1895+ }
1896+ return n
1897+}
vendor/charm.land/bubbles/v2/textinput/styles.gonew file+96
@@ -0,0 +1,96 @@
1+package textinput
2+
3+import (
4+ "image/color"
5+ "time"
6+
7+ tea "charm.land/bubbletea/v2"
8+ "charm.land/lipgloss/v2"
9+)
10+
11+// DefaultStyles returns the default styles for focused and blurred states for
12+// the textarea.
13+func DefaultStyles(isDark bool) Styles {
14+ lightDark := lipgloss.LightDark(isDark)
15+
16+ var s Styles
17+ s.Focused = StyleState{
18+ Placeholder: lipgloss.NewStyle().Foreground(lipgloss.Color("240")),
19+ Suggestion: lipgloss.NewStyle().Foreground(lipgloss.Color("240")),
20+ Prompt: lipgloss.NewStyle().Foreground(lipgloss.Color("7")),
21+ Text: lipgloss.NewStyle(),
22+ }
23+ s.Blurred = StyleState{
24+ Placeholder: lipgloss.NewStyle().Foreground(lipgloss.Color("240")),
25+ Suggestion: lipgloss.NewStyle().Foreground(lipgloss.Color("240")),
26+ Prompt: lipgloss.NewStyle().Foreground(lipgloss.Color("7")),
27+ Text: lipgloss.NewStyle().Foreground(lightDark(lipgloss.Color("245"), lipgloss.Color("7"))),
28+ }
29+ s.Cursor = CursorStyle{
30+ Color: lipgloss.Color("7"),
31+ Shape: tea.CursorBlock,
32+ Blink: true,
33+ }
34+ return s
35+}
36+
37+// DefaultLightStyles returns the default styles for a light background.
38+func DefaultLightStyles() Styles {
39+ return DefaultStyles(false)
40+}
41+
42+// DefaultDarkStyles returns the default styles for a dark background.
43+func DefaultDarkStyles() Styles {
44+ return DefaultStyles(true)
45+}
46+
47+// Styles are the styles for the textarea, separated into focused and blurred
48+// states. The appropriate styles will be chosen based on the focus state of
49+// the textarea.
50+type Styles struct {
51+ Focused StyleState
52+ Blurred StyleState
53+ Cursor CursorStyle
54+}
55+
56+// StyleState that will be applied to the text area.
57+//
58+// StyleState can be applied to focused and unfocused states to change the styles
59+// depending on the focus state.
60+//
61+// For an introduction to styling with Lip Gloss see:
62+// https://github.com/charmbracelet/lipgloss
63+type StyleState struct {
64+ Text lipgloss.Style
65+ Placeholder lipgloss.Style
66+ Suggestion lipgloss.Style
67+ Prompt lipgloss.Style
68+}
69+
70+// CursorStyle is the style for real and virtual cursors.
71+type CursorStyle struct {
72+ // Style styles the cursor block.
73+ //
74+ // For real cursors, the foreground color set here will be used as the
75+ // cursor color.
76+ Color color.Color
77+
78+ // Shape is the cursor shape. The following shapes are available:
79+ //
80+ // - tea.CursorBlock
81+ // - tea.CursorUnderline
82+ // - tea.CursorBar
83+ //
84+ // This is only used for real cursors.
85+ Shape tea.CursorShape
86+
87+ // CursorBlink determines whether or not the cursor should blink.
88+ Blink bool
89+
90+ // BlinkSpeed is the speed at which the virtual cursor blinks. This has no
91+ // effect on real cursors as well as no effect if the cursor is set not to
92+ // [CursorBlink].
93+ //
94+ // By default, the blink speed is set to about 500ms.
95+ BlinkSpeed time.Duration
96+}
vendor/charm.land/bubbles/v2/textinput/textinput.gonew file+968
@@ -0,0 +1,968 @@
1+// Package textinput provides a text input component for Bubble Tea
2+// applications.
3+package textinput
4+
5+import (
6+ "reflect"
7+ "slices"
8+ "strings"
9+ "unicode"
10+
11+ "charm.land/bubbles/v2/cursor"
12+ "charm.land/bubbles/v2/internal/runeutil"
13+ "charm.land/bubbles/v2/key"
14+ tea "charm.land/bubbletea/v2"
15+ "charm.land/lipgloss/v2"
16+ "github.com/atotto/clipboard"
17+ rw "github.com/mattn/go-runewidth"
18+ "github.com/rivo/uniseg"
19+)
20+
21+// Internal messages for clipboard operations.
22+type (
23+ pasteMsg string
24+ pasteErrMsg struct{ error }
25+)
26+
27+// EchoMode sets the input behavior of the text input field.
28+type EchoMode int
29+
30+const (
31+ // EchoNormal displays text as is. This is the default behavior.
32+ EchoNormal EchoMode = iota
33+
34+ // EchoPassword displays the EchoCharacter mask instead of actual
35+ // characters. This is commonly used for password fields.
36+ EchoPassword
37+
38+ // EchoNone displays nothing as characters are entered. This is commonly
39+ // seen for password fields on the command line.
40+ EchoNone
41+)
42+
43+// ValidateFunc is a function that returns an error if the input is invalid.
44+type ValidateFunc func(string) error
45+
46+// KeyMap is the key bindings for different actions within the textinput.
47+type KeyMap struct {
48+ CharacterForward key.Binding
49+ CharacterBackward key.Binding
50+ WordForward key.Binding
51+ WordBackward key.Binding
52+ DeleteWordBackward key.Binding
53+ DeleteWordForward key.Binding
54+ DeleteAfterCursor key.Binding
55+ DeleteBeforeCursor key.Binding
56+ DeleteCharacterBackward key.Binding
57+ DeleteCharacterForward key.Binding
58+ LineStart key.Binding
59+ LineEnd key.Binding
60+ Paste key.Binding
61+ AcceptSuggestion key.Binding
62+ NextSuggestion key.Binding
63+ PrevSuggestion key.Binding
64+}
65+
66+// DefaultKeyMap is the default set of key bindings for navigating and acting
67+// upon the textinput.
68+func DefaultKeyMap() KeyMap {
69+ return KeyMap{
70+ CharacterForward: key.NewBinding(key.WithKeys("right", "ctrl+f")),
71+ CharacterBackward: key.NewBinding(key.WithKeys("left", "ctrl+b")),
72+ WordForward: key.NewBinding(key.WithKeys("alt+right", "ctrl+right", "alt+f")),
73+ WordBackward: key.NewBinding(key.WithKeys("alt+left", "ctrl+left", "alt+b")),
74+ DeleteWordBackward: key.NewBinding(key.WithKeys("alt+backspace", "ctrl+w")),
75+ DeleteWordForward: key.NewBinding(key.WithKeys("alt+delete", "alt+d")),
76+ DeleteAfterCursor: key.NewBinding(key.WithKeys("ctrl+k")),
77+ DeleteBeforeCursor: key.NewBinding(key.WithKeys("ctrl+u")),
78+ DeleteCharacterBackward: key.NewBinding(key.WithKeys("backspace", "ctrl+h")),
79+ DeleteCharacterForward: key.NewBinding(key.WithKeys("delete", "ctrl+d")),
80+ LineStart: key.NewBinding(key.WithKeys("home", "ctrl+a")),
81+ LineEnd: key.NewBinding(key.WithKeys("end", "ctrl+e")),
82+ Paste: key.NewBinding(key.WithKeys("ctrl+v")),
83+ AcceptSuggestion: key.NewBinding(key.WithKeys("tab")),
84+ NextSuggestion: key.NewBinding(key.WithKeys("down", "ctrl+n")),
85+ PrevSuggestion: key.NewBinding(key.WithKeys("up", "ctrl+p")),
86+ }
87+}
88+
89+// Model is the Bubble Tea model for this text input element.
90+type Model struct {
91+ Err error
92+
93+ // General settings.
94+ Prompt string
95+ Placeholder string
96+ EchoMode EchoMode
97+ EchoCharacter rune
98+
99+ // useVirtualCursor determines whether or not to use the virtual cursor. If
100+ // set to false, use [Model.Cursor] to return a real cursor for rendering.
101+ useVirtualCursor bool
102+
103+ // Virtual cursor manager.
104+ virtualCursor cursor.Model
105+
106+ // CharLimit is the maximum amount of characters this input element will
107+ // accept. If 0 or less, there's no limit.
108+ CharLimit int
109+
110+ // Styling. FocusedStyle and BlurredStyle are used to style the textarea in
111+ // focused and blurred states.
112+ styles Styles
113+
114+ // Width is the maximum number of characters that can be displayed at once.
115+ // It essentially treats the text field like a horizontally scrolling
116+ // viewport. If 0 or less this setting is ignored.
117+ width int
118+
119+ // KeyMap encodes the keybindings recognized by the widget.
120+ KeyMap KeyMap
121+
122+ // Underlying text value.
123+ value []rune
124+
125+ // focus indicates whether user input focus should be on this input
126+ // component. When false, ignore keyboard input and hide the cursor.
127+ focus bool
128+
129+ // Cursor position.
130+ pos int
131+
132+ // Used to emulate a viewport when width is set and the content is
133+ // overflowing.
134+ offset int
135+ offsetRight int
136+
137+ // Validate is a function that checks whether or not the text within the
138+ // input is valid. If it is not valid, the `Err` field will be set to the
139+ // error returned by the function. If the function is not defined, all
140+ // input is considered valid.
141+ Validate ValidateFunc
142+
143+ // rune sanitizer for input.
144+ rsan runeutil.Sanitizer
145+
146+ // Should the input suggest to complete
147+ ShowSuggestions bool
148+
149+ // suggestions is a list of suggestions that may be used to complete the
150+ // input.
151+ suggestions [][]rune
152+ matchedSuggestions [][]rune
153+ currentSuggestionIndex int
154+}
155+
156+// New creates a new model with default settings.
157+func New() Model {
158+ m := Model{
159+ Prompt: "> ",
160+ EchoCharacter: '*',
161+ CharLimit: 0,
162+ styles: DefaultDarkStyles(),
163+ ShowSuggestions: false,
164+ useVirtualCursor: true,
165+ virtualCursor: cursor.New(),
166+ KeyMap: DefaultKeyMap(),
167+ suggestions: [][]rune{},
168+ value: nil,
169+ focus: false,
170+ pos: 0,
171+ }
172+ m.updateVirtualCursorStyle()
173+ return m
174+}
175+
176+// VirtualCursor returns whether the model is using a virtual cursor.
177+func (m Model) VirtualCursor() bool {
178+ return m.useVirtualCursor
179+}
180+
181+// SetVirtualCursor sets whether the model should use a virtual cursor. If
182+// disabled, use [Model.Cursor] to return a real cursor for rendering.
183+func (m *Model) SetVirtualCursor(v bool) {
184+ m.useVirtualCursor = v
185+ m.updateVirtualCursorStyle()
186+}
187+
188+// Styles returns the current set of styles.
189+func (m Model) Styles() Styles {
190+ return m.styles
191+}
192+
193+// SetStyles sets the styles for the text input.
194+func (m *Model) SetStyles(s Styles) {
195+ m.styles = s
196+ m.updateVirtualCursorStyle()
197+}
198+
199+// Width returns the width of the text input.
200+func (m Model) Width() int {
201+ return m.width
202+}
203+
204+// SetWidth sets the width of the text input.
205+func (m *Model) SetWidth(w int) {
206+ m.width = w
207+}
208+
209+// SetValue sets the value of the text input.
210+func (m *Model) SetValue(s string) {
211+ // Clean up any special characters in the input provided by the
212+ // caller. This avoids bugs due to e.g. tab characters and whatnot.
213+ runes := m.san().Sanitize([]rune(s))
214+ err := m.validate(runes)
215+ m.setValueInternal(runes, err)
216+}
217+
218+func (m *Model) setValueInternal(runes []rune, err error) {
219+ m.Err = err
220+
221+ empty := len(m.value) == 0
222+
223+ if m.CharLimit > 0 && len(runes) > m.CharLimit {
224+ m.value = runes[:m.CharLimit]
225+ } else {
226+ m.value = runes
227+ }
228+ if (m.pos == 0 && empty) || m.pos > len(m.value) {
229+ m.SetCursor(len(m.value))
230+ }
231+ m.handleOverflow()
232+}
233+
234+// Value returns the value of the text input.
235+func (m Model) Value() string {
236+ return string(m.value)
237+}
238+
239+// Position returns the cursor position.
240+func (m Model) Position() int {
241+ return m.pos
242+}
243+
244+// SetCursor moves the cursor to the given position. If the position is
245+// out of bounds the cursor will be moved to the start or end accordingly.
246+func (m *Model) SetCursor(pos int) {
247+ m.pos = clamp(pos, 0, len(m.value))
248+ m.handleOverflow()
249+}
250+
251+// CursorStart moves the cursor to the start of the input field.
252+func (m *Model) CursorStart() {
253+ m.SetCursor(0)
254+}
255+
256+// CursorEnd moves the cursor to the end of the input field.
257+func (m *Model) CursorEnd() {
258+ m.SetCursor(len(m.value))
259+}
260+
261+// Focused returns the focus state on the model.
262+func (m Model) Focused() bool {
263+ return m.focus
264+}
265+
266+// Focus sets the focus state on the model. When the model is in focus it can
267+// receive keyboard input and the cursor will be shown.
268+func (m *Model) Focus() tea.Cmd {
269+ m.focus = true
270+ return m.virtualCursor.Focus()
271+}
272+
273+// Blur removes the focus state on the model. When the model is blurred it can
274+// not receive keyboard input and the cursor will be hidden.
275+func (m *Model) Blur() {
276+ m.focus = false
277+ m.virtualCursor.Blur()
278+}
279+
280+// Reset sets the input to its default state with no input.
281+func (m *Model) Reset() {
282+ m.value = nil
283+ m.SetCursor(0)
284+}
285+
286+// SetSuggestions sets the suggestions for the input.
287+func (m *Model) SetSuggestions(suggestions []string) {
288+ m.suggestions = make([][]rune, len(suggestions))
289+ for i, s := range suggestions {
290+ m.suggestions[i] = []rune(s)
291+ }
292+
293+ m.updateSuggestions()
294+}
295+
296+// rsan initializes or retrieves the rune sanitizer.
297+func (m *Model) san() runeutil.Sanitizer {
298+ if m.rsan == nil {
299+ // Textinput has all its input on a single line so collapse
300+ // newlines/tabs to single spaces.
301+ m.rsan = runeutil.NewSanitizer(
302+ runeutil.ReplaceTabs(" "), runeutil.ReplaceNewlines(" "))
303+ }
304+ return m.rsan
305+}
306+
307+func (m *Model) insertRunesFromUserInput(v []rune) {
308+ // Clean up any special characters in the input provided by the
309+ // clipboard. This avoids bugs due to e.g. tab characters and
310+ // whatnot.
311+ paste := m.san().Sanitize(v)
312+
313+ var availSpace int
314+ if m.CharLimit > 0 {
315+ availSpace = m.CharLimit - len(m.value)
316+
317+ // If the char limit's been reached, cancel.
318+ if availSpace <= 0 {
319+ return
320+ }
321+
322+ // If there's not enough space to paste the whole thing cut the pasted
323+ // runes down so they'll fit.
324+ if availSpace < len(paste) {
325+ paste = paste[:availSpace]
326+ }
327+ }
328+
329+ // Stuff before and after the cursor
330+ head := m.value[:m.pos]
331+ tailSrc := m.value[m.pos:]
332+ tail := make([]rune, len(tailSrc))
333+ copy(tail, tailSrc)
334+
335+ // Insert pasted runes
336+ for _, r := range paste {
337+ head = append(head, r)
338+ m.pos++
339+ if m.CharLimit > 0 {
340+ availSpace--
341+ if availSpace <= 0 {
342+ break
343+ }
344+ }
345+ }
346+
347+ // Put it all back together
348+ value := append(head, tail...)
349+ inputErr := m.validate(value)
350+ m.setValueInternal(value, inputErr)
351+}
352+
353+// If a max width is defined, perform some logic to treat the visible area
354+// as a horizontally scrolling viewport.
355+func (m *Model) handleOverflow() {
356+ if m.Width() <= 0 || uniseg.StringWidth(string(m.value)) <= m.Width() {
357+ m.offset = 0
358+ m.offsetRight = len(m.value)
359+ return
360+ }
361+
362+ // Correct right offset if we've deleted characters
363+ m.offsetRight = min(m.offsetRight, len(m.value))
364+
365+ if m.pos < m.offset {
366+ m.offset = m.pos
367+
368+ w := 0
369+ i := 0
370+ runes := m.value[m.offset:]
371+
372+ for i < len(runes) && w <= m.Width() {
373+ w += rw.RuneWidth(runes[i])
374+ if w <= m.Width()+1 {
375+ i++
376+ }
377+ }
378+
379+ m.offsetRight = m.offset + i
380+ } else if m.pos >= m.offsetRight {
381+ m.offsetRight = m.pos
382+
383+ w := 0
384+ runes := m.value[:m.offsetRight]
385+ i := len(runes) - 1
386+
387+ for i > 0 && w < m.Width() {
388+ w += rw.RuneWidth(runes[i])
389+ if w <= m.Width() {
390+ i--
391+ }
392+ }
393+
394+ m.offset = m.offsetRight - (len(runes) - 1 - i)
395+ }
396+}
397+
398+// deleteBeforeCursor deletes all text before the cursor.
399+func (m *Model) deleteBeforeCursor() {
400+ m.value = m.value[m.pos:]
401+ m.Err = m.validate(m.value)
402+ m.offset = 0
403+ m.SetCursor(0)
404+}
405+
406+// deleteAfterCursor deletes all text after the cursor. If input is masked
407+// delete everything after the cursor so as not to reveal word breaks in the
408+// masked input.
409+func (m *Model) deleteAfterCursor() {
410+ m.value = m.value[:m.pos]
411+ m.Err = m.validate(m.value)
412+ m.SetCursor(len(m.value))
413+}
414+
415+// deleteWordBackward deletes the word left to the cursor.
416+func (m *Model) deleteWordBackward() {
417+ if m.pos == 0 || len(m.value) == 0 {
418+ return
419+ }
420+
421+ if m.EchoMode != EchoNormal {
422+ m.deleteBeforeCursor()
423+ return
424+ }
425+
426+ // Linter note: it's critical that we acquire the initial cursor position
427+ // here prior to altering it via SetCursor() below. As such, moving this
428+ // call into the corresponding if clause does not apply here.
429+ oldPos := m.pos
430+
431+ m.SetCursor(m.pos - 1)
432+ for unicode.IsSpace(m.value[m.pos]) {
433+ if m.pos <= 0 {
434+ break
435+ }
436+ // ignore series of whitespace before cursor
437+ m.SetCursor(m.pos - 1)
438+ }
439+
440+ for m.pos > 0 {
441+ if !unicode.IsSpace(m.value[m.pos]) {
442+ m.SetCursor(m.pos - 1)
443+ } else {
444+ if m.pos > 0 {
445+ // keep the previous space
446+ m.SetCursor(m.pos + 1)
447+ }
448+ break
449+ }
450+ }
451+
452+ if oldPos > len(m.value) {
453+ m.value = m.value[:m.pos]
454+ } else {
455+ m.value = append(m.value[:m.pos], m.value[oldPos:]...)
456+ }
457+ m.Err = m.validate(m.value)
458+}
459+
460+// deleteWordForward deletes the word right to the cursor. If input is masked
461+// delete everything after the cursor so as not to reveal word breaks in the
462+// masked input.
463+func (m *Model) deleteWordForward() {
464+ if m.pos >= len(m.value) || len(m.value) == 0 {
465+ return
466+ }
467+
468+ if m.EchoMode != EchoNormal {
469+ m.deleteAfterCursor()
470+ return
471+ }
472+
473+ oldPos := m.pos
474+ m.SetCursor(m.pos + 1)
475+ for unicode.IsSpace(m.value[m.pos]) {
476+ // ignore series of whitespace after cursor
477+ m.SetCursor(m.pos + 1)
478+
479+ if m.pos >= len(m.value) {
480+ break
481+ }
482+ }
483+
484+ for m.pos < len(m.value) {
485+ if !unicode.IsSpace(m.value[m.pos]) {
486+ m.SetCursor(m.pos + 1)
487+ } else {
488+ break
489+ }
490+ }
491+
492+ if m.pos > len(m.value) {
493+ m.value = m.value[:oldPos]
494+ } else {
495+ m.value = append(m.value[:oldPos], m.value[m.pos:]...)
496+ }
497+ m.Err = m.validate(m.value)
498+
499+ m.SetCursor(oldPos)
500+}
501+
502+// wordBackward moves the cursor one word to the left. If input is masked, move
503+// input to the start so as not to reveal word breaks in the masked input.
504+func (m *Model) wordBackward() {
505+ if m.pos == 0 || len(m.value) == 0 {
506+ return
507+ }
508+
509+ if m.EchoMode != EchoNormal {
510+ m.CursorStart()
511+ return
512+ }
513+
514+ i := m.pos - 1
515+ for i >= 0 {
516+ if unicode.IsSpace(m.value[i]) {
517+ m.SetCursor(m.pos - 1)
518+ i--
519+ } else {
520+ break
521+ }
522+ }
523+
524+ for i >= 0 {
525+ if !unicode.IsSpace(m.value[i]) {
526+ m.SetCursor(m.pos - 1)
527+ i--
528+ } else {
529+ break
530+ }
531+ }
532+}
533+
534+// wordForward moves the cursor one word to the right. If the input is masked,
535+// move input to the end so as not to reveal word breaks in the masked input.
536+func (m *Model) wordForward() {
537+ if m.pos >= len(m.value) || len(m.value) == 0 {
538+ return
539+ }
540+
541+ if m.EchoMode != EchoNormal {
542+ m.CursorEnd()
543+ return
544+ }
545+
546+ i := m.pos
547+ for i < len(m.value) {
548+ if unicode.IsSpace(m.value[i]) {
549+ m.SetCursor(m.pos + 1)
550+ i++
551+ } else {
552+ break
553+ }
554+ }
555+
556+ for i < len(m.value) {
557+ if !unicode.IsSpace(m.value[i]) {
558+ m.SetCursor(m.pos + 1)
559+ i++
560+ } else {
561+ break
562+ }
563+ }
564+}
565+
566+func (m Model) echoTransform(v string) string {
567+ switch m.EchoMode {
568+ case EchoPassword:
569+ return strings.Repeat(string(m.EchoCharacter), uniseg.StringWidth(v))
570+ case EchoNone:
571+ return ""
572+ case EchoNormal:
573+ return v
574+ default:
575+ return v
576+ }
577+}
578+
579+// Update is the Bubble Tea update loop.
580+func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
581+ if !m.focus {
582+ return m, nil
583+ }
584+
585+ // Need to check for completion before, because key is configurable and might be double assigned
586+ keyMsg, ok := msg.(tea.KeyPressMsg)
587+ if ok && key.Matches(keyMsg, m.KeyMap.AcceptSuggestion) {
588+ if m.canAcceptSuggestion() {
589+ m.value = append(m.value, m.matchedSuggestions[m.currentSuggestionIndex][len(m.value):]...)
590+ m.CursorEnd()
591+ }
592+ }
593+
594+ // Let's remember where the position of the cursor currently is so that if
595+ // the cursor position changes, we can reset the blink.
596+ oldPos := m.pos
597+
598+ switch msg := msg.(type) {
599+ case tea.KeyPressMsg:
600+ switch {
601+ case key.Matches(msg, m.KeyMap.DeleteWordBackward):
602+ m.deleteWordBackward()
603+ case key.Matches(msg, m.KeyMap.DeleteCharacterBackward):
604+ m.Err = nil
605+ if len(m.value) > 0 {
606+ m.value = append(m.value[:max(0, m.pos-1)], m.value[m.pos:]...)
607+ m.Err = m.validate(m.value)
608+ if m.pos > 0 {
609+ m.SetCursor(m.pos - 1)
610+ }
611+ }
612+ case key.Matches(msg, m.KeyMap.WordBackward):
613+ m.wordBackward()
614+ case key.Matches(msg, m.KeyMap.CharacterBackward):
615+ if m.pos > 0 {
616+ m.SetCursor(m.pos - 1)
617+ }
618+ case key.Matches(msg, m.KeyMap.WordForward):
619+ m.wordForward()
620+ case key.Matches(msg, m.KeyMap.CharacterForward):
621+ if m.pos < len(m.value) {
622+ m.SetCursor(m.pos + 1)
623+ }
624+ case key.Matches(msg, m.KeyMap.LineStart):
625+ m.CursorStart()
626+ case key.Matches(msg, m.KeyMap.DeleteCharacterForward):
627+ if len(m.value) > 0 && m.pos < len(m.value) {
628+ m.value = slices.Delete(m.value, m.pos, m.pos+1)
629+ m.Err = m.validate(m.value)
630+ }
631+ case key.Matches(msg, m.KeyMap.LineEnd):
632+ m.CursorEnd()
633+ case key.Matches(msg, m.KeyMap.DeleteAfterCursor):
634+ m.deleteAfterCursor()
635+ case key.Matches(msg, m.KeyMap.DeleteBeforeCursor):
636+ m.deleteBeforeCursor()
637+ case key.Matches(msg, m.KeyMap.Paste):
638+ return m, Paste
639+ case key.Matches(msg, m.KeyMap.DeleteWordForward):
640+ m.deleteWordForward()
641+ case key.Matches(msg, m.KeyMap.NextSuggestion):
642+ m.nextSuggestion()
643+ case key.Matches(msg, m.KeyMap.PrevSuggestion):
644+ m.previousSuggestion()
645+ default:
646+ // Input one or more regular characters.
647+ m.insertRunesFromUserInput([]rune(msg.Text))
648+ }
649+
650+ // Check again if can be completed
651+ // because value might be something that does not match the completion prefix
652+ m.updateSuggestions()
653+
654+ case tea.PasteMsg:
655+ m.insertRunesFromUserInput([]rune(msg.Content))
656+
657+ case pasteMsg:
658+ m.insertRunesFromUserInput([]rune(msg))
659+
660+ case pasteErrMsg:
661+ m.Err = msg
662+ }
663+
664+ var cmds []tea.Cmd
665+ var cmd tea.Cmd
666+
667+ if m.useVirtualCursor {
668+ m.virtualCursor, cmd = m.virtualCursor.Update(msg)
669+ cmds = append(cmds, cmd)
670+
671+ // If the cursor position changed, reset the blink state. This is a
672+ // small UX nuance that makes cursor movement obvious and feel snappy.
673+ if oldPos != m.pos && m.virtualCursor.Mode() == cursor.CursorBlink {
674+ m.virtualCursor.IsBlinked = false
675+ cmds = append(cmds, m.virtualCursor.Blink())
676+ }
677+ }
678+
679+ m.handleOverflow()
680+ return m, tea.Batch(cmds...)
681+}
682+
683+// View renders the textinput in its current state.
684+func (m Model) View() string {
685+ // Placeholder text
686+ if len(m.value) == 0 && m.Placeholder != "" {
687+ return m.placeholderView()
688+ }
689+
690+ styles := m.activeStyle()
691+
692+ styleText := styles.Text.Inline(true).Render
693+
694+ value := m.value[m.offset:m.offsetRight]
695+ pos := max(0, m.pos-m.offset)
696+ v := styleText(m.echoTransform(string(value[:pos])))
697+
698+ if pos < len(value) { //nolint:nestif
699+ char := m.echoTransform(string(value[pos]))
700+ m.virtualCursor.SetChar(char)
701+ v += m.virtualCursor.View() // cursor and text under it
702+ v += styleText(m.echoTransform(string(value[pos+1:]))) // text after cursor
703+ v += m.completionView(0) // suggested completion
704+ } else {
705+ if m.focus && m.canAcceptSuggestion() {
706+ suggestion := m.matchedSuggestions[m.currentSuggestionIndex]
707+ if len(value) < len(suggestion) {
708+ m.virtualCursor.TextStyle = styles.Suggestion
709+ m.virtualCursor.SetChar(m.echoTransform(string(suggestion[pos])))
710+ v += m.virtualCursor.View()
711+ v += m.completionView(1)
712+ } else {
713+ m.virtualCursor.SetChar(" ")
714+ v += m.virtualCursor.View()
715+ }
716+ } else {
717+ m.virtualCursor.SetChar(" ")
718+ v += m.virtualCursor.View()
719+ }
720+ }
721+
722+ // If a max width and background color were set fill the empty spaces with
723+ // the background color.
724+ valWidth := uniseg.StringWidth(string(value))
725+ if m.Width() > 0 && valWidth <= m.Width() {
726+ padding := max(0, m.Width()-valWidth)
727+ if valWidth+padding <= m.Width() && pos < len(value) {
728+ padding++
729+ }
730+ v += styleText(strings.Repeat(" ", padding))
731+ }
732+
733+ return m.promptView() + v
734+}
735+
736+func (m Model) promptView() string {
737+ return m.activeStyle().Prompt.Render(m.Prompt)
738+}
739+
740+// placeholderView returns the prompt and placeholder view, if any.
741+func (m Model) placeholderView() string {
742+ var (
743+ v string
744+ styles = m.activeStyle()
745+ render = styles.Placeholder.Render
746+ )
747+
748+ p := make([]rune, m.Width()+1)
749+ copy(p, []rune(m.Placeholder))
750+
751+ m.virtualCursor.TextStyle = styles.Placeholder
752+ m.virtualCursor.SetChar(string(p[:1]))
753+ v += m.virtualCursor.View()
754+
755+ // If the entire placeholder is already set and no padding is needed, finish
756+ if m.Width() < 1 && len(p) <= 1 {
757+ return styles.Prompt.Render(m.Prompt) + v
758+ }
759+
760+ // If Width is set then size placeholder accordingly
761+ if m.Width() > 0 {
762+ // available width is width - len + cursor offset of 1
763+ minWidth := lipgloss.Width(m.Placeholder)
764+ availWidth := m.Width() - minWidth + 1
765+
766+ // if width < len, 'subtract'(add) number to len and dont add padding
767+ if availWidth < 0 {
768+ minWidth += availWidth
769+ availWidth = 0
770+ }
771+ // append placeholder[len] - cursor, append padding
772+ v += render(string(p[1:minWidth]))
773+ v += render(strings.Repeat(" ", availWidth))
774+ } else {
775+ // if there is no width, the placeholder can be any length
776+ v += render(string(p[1:]))
777+ }
778+
779+ return styles.Prompt.Render(m.Prompt) + v
780+}
781+
782+// Blink is a command used to initialize cursor blinking.
783+func Blink() tea.Msg {
784+ return cursor.Blink()
785+}
786+
787+// Paste is a command for pasting from the clipboard into the text input.
788+func Paste() tea.Msg {
789+ str, err := clipboard.ReadAll()
790+ if err != nil {
791+ return pasteErrMsg{err}
792+ }
793+ return pasteMsg(str)
794+}
795+
796+func clamp(v, low, high int) int {
797+ if high < low {
798+ low, high = high, low
799+ }
800+ return min(high, max(low, v))
801+}
802+
803+func (m Model) completionView(offset int) string {
804+ if !m.canAcceptSuggestion() {
805+ return ""
806+ }
807+ value := m.value
808+ suggestion := m.matchedSuggestions[m.currentSuggestionIndex]
809+ if len(value) < len(suggestion) {
810+ return m.activeStyle().Suggestion.Inline(true).
811+ Render(string(suggestion[len(value)+offset:]))
812+ }
813+ return ""
814+}
815+
816+func (m *Model) getSuggestions(sugs [][]rune) []string {
817+ suggestions := make([]string, len(sugs))
818+ for i, s := range sugs {
819+ suggestions[i] = string(s)
820+ }
821+ return suggestions
822+}
823+
824+// AvailableSuggestions returns the list of available suggestions.
825+func (m *Model) AvailableSuggestions() []string {
826+ return m.getSuggestions(m.suggestions)
827+}
828+
829+// MatchedSuggestions returns the list of matched suggestions.
830+func (m *Model) MatchedSuggestions() []string {
831+ return m.getSuggestions(m.matchedSuggestions)
832+}
833+
834+// CurrentSuggestionIndex returns the currently selected suggestion index.
835+func (m *Model) CurrentSuggestionIndex() int {
836+ return m.currentSuggestionIndex
837+}
838+
839+// CurrentSuggestion returns the currently selected suggestion.
840+func (m *Model) CurrentSuggestion() string {
841+ if m.currentSuggestionIndex >= len(m.matchedSuggestions) {
842+ return ""
843+ }
844+
845+ return string(m.matchedSuggestions[m.currentSuggestionIndex])
846+}
847+
848+// canAcceptSuggestion returns whether there is an acceptable suggestion to
849+// autocomplete the current value.
850+func (m *Model) canAcceptSuggestion() bool {
851+ return len(m.matchedSuggestions) > 0
852+}
853+
854+// updateSuggestions refreshes the list of matching suggestions.
855+func (m *Model) updateSuggestions() {
856+ if !m.ShowSuggestions {
857+ return
858+ }
859+
860+ if len(m.value) <= 0 || len(m.suggestions) <= 0 {
861+ m.matchedSuggestions = [][]rune{}
862+ return
863+ }
864+
865+ matches := [][]rune{}
866+ for _, s := range m.suggestions {
867+ suggestion := string(s)
868+
869+ if strings.HasPrefix(strings.ToLower(suggestion), strings.ToLower(string(m.value))) {
870+ matches = append(matches, []rune(suggestion))
871+ }
872+ }
873+ if !reflect.DeepEqual(matches, m.matchedSuggestions) {
874+ m.currentSuggestionIndex = 0
875+ }
876+
877+ m.matchedSuggestions = matches
878+}
879+
880+// nextSuggestion selects the next suggestion.
881+func (m *Model) nextSuggestion() {
882+ m.currentSuggestionIndex = (m.currentSuggestionIndex + 1)
883+ if m.currentSuggestionIndex >= len(m.matchedSuggestions) {
884+ m.currentSuggestionIndex = 0
885+ }
886+}
887+
888+// previousSuggestion selects the previous suggestion.
889+func (m *Model) previousSuggestion() {
890+ m.currentSuggestionIndex = (m.currentSuggestionIndex - 1)
891+ if m.currentSuggestionIndex < 0 {
892+ m.currentSuggestionIndex = len(m.matchedSuggestions) - 1
893+ }
894+}
895+
896+func (m Model) validate(v []rune) error {
897+ if m.Validate != nil {
898+ return m.Validate(string(v))
899+ }
900+ return nil
901+}
902+
903+// Cursor returns a [tea.Cursor] for rendering a real cursor in a Bubble Tea
904+// program. This requires that [Model.VirtualCursor] is set to false.
905+//
906+// Note that you will almost certainly also need to adjust the offset cursor
907+// position per the textarea's per the textarea's position in the terminal.
908+//
909+// Example:
910+//
911+// // In your top-level View function:
912+// f := tea.NewFrame(m.textarea.View())
913+// f.Cursor = m.textarea.Cursor()
914+// f.Cursor.Position.X += offsetX
915+// f.Cursor.Position.Y += offsetY
916+func (m Model) Cursor() *tea.Cursor {
917+ if m.useVirtualCursor || !m.Focused() {
918+ return nil
919+ }
920+
921+ w := lipgloss.Width
922+
923+ promptWidth := w(m.promptView())
924+ xOffset := m.Position() +
925+ promptWidth
926+ if m.width > 0 {
927+ xOffset = min(xOffset, m.width+promptWidth)
928+ }
929+
930+ style := m.styles.Cursor
931+ c := tea.NewCursor(xOffset, 0)
932+ c.Blink = style.Blink
933+ c.Color = style.Color
934+ c.Shape = style.Shape
935+ return c
936+}
937+
938+// updateVirtualCursorStyle sets styling on the virtual cursor based on the
939+// textarea's style settings.
940+func (m *Model) updateVirtualCursorStyle() {
941+ if !m.useVirtualCursor {
942+ // Hide the virtual cursor if we're using a real cursor.
943+ m.virtualCursor.SetMode(cursor.CursorHide)
944+ return
945+ }
946+
947+ m.virtualCursor.Style = lipgloss.NewStyle().Foreground(m.styles.Cursor.Color)
948+
949+ // By default, the blink speed of the cursor is set to a default
950+ // internally.
951+ if m.styles.Cursor.Blink {
952+ if m.styles.Cursor.BlinkSpeed > 0 {
953+ m.virtualCursor.BlinkSpeed = m.styles.Cursor.BlinkSpeed
954+ }
955+ m.virtualCursor.SetMode(cursor.CursorBlink)
956+ return
957+ }
958+ m.virtualCursor.SetMode(cursor.CursorStatic)
959+}
960+
961+// activeStyle returns the appropriate set of styles to use depending on
962+// whether the textarea is focused or blurred.
963+func (m Model) activeStyle() *StyleState {
964+ if m.focus {
965+ return &m.styles.Focused
966+ }
967+ return &m.styles.Blurred
968+}
vendor/charm.land/bubbles/v2/viewport/highlight.gonew file+141
@@ -0,0 +1,141 @@
1+package viewport
2+
3+import (
4+ "charm.land/lipgloss/v2"
5+ "github.com/charmbracelet/x/ansi"
6+ "github.com/rivo/uniseg"
7+)
8+
9+// parseMatches converts the given matches into highlight ranges.
10+//
11+// Assumptions:
12+// - matches are measured in bytes, e.g. what [regex.FindAllStringIndex] would return
13+// - matches were made against the given content
14+// - matches are in order
15+// - matches do not overlap
16+// - content is line terminated with \n only
17+//
18+// We'll then convert the ranges into [highlightInfo]s, which hold the starting
19+// line and the grapheme positions.
20+func parseMatches(
21+ content string,
22+ matches [][]int,
23+) []highlightInfo {
24+ if len(matches) == 0 {
25+ return nil
26+ }
27+
28+ line := 0
29+ graphemePos := 0
30+ previousLinesOffset := 0
31+ bytePos := 0
32+
33+ highlights := make([]highlightInfo, 0, len(matches))
34+ gr := uniseg.NewGraphemes(ansi.Strip(content))
35+
36+ for _, match := range matches {
37+ byteStart, byteEnd := match[0], match[1]
38+
39+ // hilight for this match:
40+ hi := highlightInfo{
41+ lines: map[int][2]int{},
42+ }
43+
44+ // find the beginning of this byte range, setup current line and
45+ // grapheme position.
46+ for byteStart > bytePos {
47+ if !gr.Next() {
48+ break
49+ }
50+ if content[bytePos] == '\n' {
51+ previousLinesOffset = graphemePos + 1
52+ line++
53+ }
54+ graphemePos += max(1, gr.Width())
55+ bytePos += len(gr.Str())
56+ }
57+
58+ hi.lineStart = line
59+ hi.lineEnd = line
60+
61+ graphemeStart := graphemePos
62+
63+ // loop until we find the end
64+ for byteEnd > bytePos {
65+ if !gr.Next() {
66+ break
67+ }
68+
69+ // if it ends with a new line, add the range, increase line, and continue
70+ if content[bytePos] == '\n' {
71+ colstart := max(0, graphemeStart-previousLinesOffset)
72+ colend := max(graphemePos-previousLinesOffset+1, colstart) // +1 its \n itself
73+
74+ if colend > colstart {
75+ hi.lines[line] = [2]int{colstart, colend}
76+ hi.lineEnd = line
77+ }
78+
79+ previousLinesOffset = graphemePos + 1
80+ line++
81+ }
82+
83+ graphemePos += max(1, gr.Width())
84+ bytePos += len(gr.Str())
85+ }
86+
87+ // we found it!, add highlight and continue
88+ if bytePos == byteEnd {
89+ colstart := max(0, graphemeStart-previousLinesOffset)
90+ colend := max(graphemePos-previousLinesOffset, colstart)
91+
92+ if colend > colstart {
93+ hi.lines[line] = [2]int{colstart, colend}
94+ hi.lineEnd = line
95+ }
96+ }
97+
98+ highlights = append(highlights, hi)
99+ }
100+
101+ return highlights
102+}
103+
104+type highlightInfo struct {
105+ // in which line this highlight starts and ends
106+ lineStart, lineEnd int
107+
108+ // the grapheme highlight ranges for each of these lines
109+ lines map[int][2]int
110+}
111+
112+// coords returns the line x column of this highlight.
113+func (hi highlightInfo) coords() (int, int, int) {
114+ for i := hi.lineStart; i <= hi.lineEnd; i++ {
115+ hl, ok := hi.lines[i]
116+ if !ok {
117+ continue
118+ }
119+ return i, hl[0], hl[1]
120+ }
121+ return hi.lineStart, 0, 0
122+}
123+
124+func makeHighlightRanges(
125+ highlights []highlightInfo,
126+ line int,
127+ style lipgloss.Style,
128+) []lipgloss.Range {
129+ result := []lipgloss.Range{}
130+ for _, hi := range highlights {
131+ lihi, ok := hi.lines[line]
132+ if !ok {
133+ continue
134+ }
135+ if lihi == [2]int{} {
136+ continue
137+ }
138+ result = append(result, lipgloss.NewRange(lihi[0], lihi[1], style))
139+ }
140+ return result
141+}
vendor/charm.land/bubbles/v2/viewport/keymap.gonew file+58
@@ -0,0 +1,58 @@
1+// Package viewport provides a component for rendering a viewport in a Bubble
2+// Tea.
3+package viewport
4+
5+import "charm.land/bubbles/v2/key"
6+
7+// KeyMap defines the keybindings for the viewport. Note that you don't
8+// necessary need to use keybindings at all; the viewport can be controlled
9+// programmatically with methods like Model.LineDown(1). See the GoDocs for
10+// details.
11+type KeyMap struct {
12+ PageDown key.Binding
13+ PageUp key.Binding
14+ HalfPageUp key.Binding
15+ HalfPageDown key.Binding
16+ Down key.Binding
17+ Up key.Binding
18+ Left key.Binding
19+ Right key.Binding
20+}
21+
22+// DefaultKeyMap returns a set of pager-like default keybindings.
23+func DefaultKeyMap() KeyMap {
24+ return KeyMap{
25+ PageDown: key.NewBinding(
26+ key.WithKeys("pgdown", "space", "f"),
27+ key.WithHelp("f/pgdn", "page down"),
28+ ),
29+ PageUp: key.NewBinding(
30+ key.WithKeys("pgup", "b"),
31+ key.WithHelp("b/pgup", "page up"),
32+ ),
33+ HalfPageUp: key.NewBinding(
34+ key.WithKeys("u", "ctrl+u"),
35+ key.WithHelp("u", "½ page up"),
36+ ),
37+ HalfPageDown: key.NewBinding(
38+ key.WithKeys("d", "ctrl+d"),
39+ key.WithHelp("d", "½ page down"),
40+ ),
41+ Up: key.NewBinding(
42+ key.WithKeys("up", "k"),
43+ key.WithHelp("↑/k", "up"),
44+ ),
45+ Down: key.NewBinding(
46+ key.WithKeys("down", "j"),
47+ key.WithHelp("↓/j", "down"),
48+ ),
49+ Left: key.NewBinding(
50+ key.WithKeys("left", "h"),
51+ key.WithHelp("←/h", "move left"),
52+ ),
53+ Right: key.NewBinding(
54+ key.WithKeys("right", "l"),
55+ key.WithHelp("→/l", "move right"),
56+ ),
57+ }
58+}
vendor/charm.land/bubbles/v2/viewport/viewport.gonew file+765
@@ -0,0 +1,765 @@
1+package viewport
2+
3+import (
4+ "cmp"
5+ "math"
6+ "slices"
7+ "strings"
8+
9+ "charm.land/bubbles/v2/key"
10+ tea "charm.land/bubbletea/v2"
11+ "charm.land/lipgloss/v2"
12+ "github.com/charmbracelet/x/ansi"
13+)
14+
15+const (
16+ defaultHorizontalStep = 6
17+)
18+
19+// Option is a configuration option that works in conjunction with [New]. For
20+// example:
21+//
22+// timer := New(WithWidth(10, WithHeight(5)))
23+type Option func(*Model)
24+
25+// WithWidth is an initialization option that sets the width of the
26+// viewport. Pass as an argument to [New].
27+func WithWidth(w int) Option {
28+ return func(m *Model) {
29+ m.width = w
30+ }
31+}
32+
33+// WithHeight is an initialization option that sets the height of the
34+// viewport. Pass as an argument to [New].
35+func WithHeight(h int) Option {
36+ return func(m *Model) {
37+ m.height = h
38+ }
39+}
40+
41+// New returns a new model with the given width and height as well as default
42+// key mappings.
43+func New(opts ...Option) (m Model) {
44+ for _, opt := range opts {
45+ opt(&m)
46+ }
47+ m.setInitialValues()
48+ return m
49+}
50+
51+// Model is the Bubble Tea model for this viewport element.
52+type Model struct {
53+ width int
54+ height int
55+ KeyMap KeyMap
56+
57+ // Whether or not to wrap text. If false, it'll allow horizontal scrolling
58+ // instead.
59+ SoftWrap bool
60+
61+ // Whether or not to fill to the height of the viewport with empty lines.
62+ FillHeight bool
63+
64+ // Whether or not to respond to the mouse. The mouse must be enabled in
65+ // Bubble Tea for this to work. For details, see the Bubble Tea docs.
66+ MouseWheelEnabled bool
67+
68+ // The number of lines the mouse wheel will scroll. By default, this is 3.
69+ MouseWheelDelta int
70+
71+ // yOffset is the vertical scroll position.
72+ yOffset int
73+
74+ // xOffset is the horizontal scroll position.
75+ xOffset int
76+
77+ // horizontalStep is the number of columns we move left or right during a
78+ // default horizontal scroll.
79+ horizontalStep int
80+
81+ // YPosition is the position of the viewport in relation to the terminal
82+ // window. It's used in high performance rendering only.
83+ YPosition int
84+
85+ // Style applies a lipgloss style to the viewport. Realistically, it's most
86+ // useful for setting borders, margins and padding.
87+ Style lipgloss.Style
88+
89+ // LeftGutterFunc allows to define a [GutterFunc] that adds a column into
90+ // the left of the viewport, which is kept when horizontal scrolling.
91+ // This can be used for things like line numbers, selection indicators,
92+ // show statuses, etc. It is expected that the real-width (as measured by
93+ // [lipgloss.Width]) of the returned value is always consistent, regardless
94+ // of index, soft wrapping, etc.
95+ LeftGutterFunc GutterFunc
96+
97+ initialized bool
98+ lines []string
99+ longestLineWidth int
100+
101+ // HighlightStyle highlights the ranges set with [SetHighligths].
102+ HighlightStyle lipgloss.Style
103+
104+ // SelectedHighlightStyle highlights the highlight range focused during
105+ // navigation.
106+ // Use [SetHighligths] to set the highlight ranges, and [HightlightNext]
107+ // and [HihglightPrevious] to navigate.
108+ SelectedHighlightStyle lipgloss.Style
109+
110+ // StyleLineFunc allows to return a [lipgloss.Style] for each line.
111+ // The argument is the line index.
112+ StyleLineFunc func(int) lipgloss.Style
113+
114+ highlights []highlightInfo
115+ hiIdx int
116+}
117+
118+// GutterFunc can be implemented and set into [Model.LeftGutterFunc].
119+//
120+// Example implementation showing line numbers:
121+//
122+// func(info GutterContext) string {
123+// if info.Soft {
124+// return " │ "
125+// }
126+// if info.Index >= info.TotalLines {
127+// return " ~ │ "
128+// }
129+// return fmt.Sprintf("%4d │ ", info.Index+1)
130+// }
131+type GutterFunc func(GutterContext) string
132+
133+// NoGutter is the default gutter used.
134+var NoGutter = func(GutterContext) string { return "" }
135+
136+// GutterContext provides context to a [GutterFunc].
137+type GutterContext struct {
138+ // Index is the line index of the line which the gutter is being rendered for.
139+ Index int
140+
141+ // TotalLines is the total number of lines in the viewport.
142+ TotalLines int
143+
144+ // Soft is whether or not the line is soft wrapped.
145+ Soft bool
146+}
147+
148+func (m *Model) setInitialValues() {
149+ m.KeyMap = DefaultKeyMap()
150+ m.MouseWheelEnabled = true
151+ m.MouseWheelDelta = 3
152+ m.horizontalStep = defaultHorizontalStep
153+ m.LeftGutterFunc = NoGutter
154+ m.initialized = true
155+}
156+
157+// Init exists to satisfy the tea.Model interface for composability purposes.
158+func (m Model) Init() tea.Cmd {
159+ return nil
160+}
161+
162+// Height returns the height of the viewport.
163+func (m Model) Height() int {
164+ return m.height
165+}
166+
167+// SetHeight sets the height of the viewport.
168+func (m *Model) SetHeight(h int) {
169+ m.height = h
170+}
171+
172+// Width returns the width of the viewport.
173+func (m Model) Width() int {
174+ return m.width
175+}
176+
177+// SetWidth sets the width of the viewport.
178+func (m *Model) SetWidth(w int) {
179+ m.width = w
180+}
181+
182+// AtTop returns whether or not the viewport is at the very top position.
183+func (m Model) AtTop() bool {
184+ return m.YOffset() <= 0
185+}
186+
187+// AtBottom returns whether or not the viewport is at or past the very bottom
188+// position.
189+func (m Model) AtBottom() bool {
190+ return m.YOffset() >= m.maxYOffset()
191+}
192+
193+// PastBottom returns whether or not the viewport is scrolled beyond the last
194+// line. This can happen when adjusting the viewport height.
195+func (m Model) PastBottom() bool {
196+ return m.YOffset() > m.maxYOffset()
197+}
198+
199+// ScrollPercent returns the amount scrolled as a float between 0 and 1.
200+func (m Model) ScrollPercent() float64 {
201+ total, _, _ := m.calculateLine(0)
202+ if m.Height() >= total {
203+ return 1.0
204+ }
205+ y := float64(m.YOffset())
206+ h := float64(m.Height())
207+ t := float64(total)
208+ v := y / (t - h)
209+ return clamp(v, 0, 1)
210+}
211+
212+// HorizontalScrollPercent returns the amount horizontally scrolled as a float
213+// between 0 and 1.
214+func (m Model) HorizontalScrollPercent() float64 {
215+ if m.xOffset >= m.longestLineWidth-m.Width() {
216+ return 1.0
217+ }
218+ y := float64(m.xOffset)
219+ h := float64(m.Width())
220+ t := float64(m.longestLineWidth)
221+ v := y / (t - h)
222+ return clamp(v, 0, 1)
223+}
224+
225+// SetContent set the pager's text content. Line endings will be normalized to '\n'.
226+func (m *Model) SetContent(s string) {
227+ m.SetContentLines(strings.Split(s, "\n"))
228+}
229+
230+// SetContentLines allows to set the lines to be shown instead of the content.
231+// If a given line has a \n in it, it will still be split into multiple lines
232+// similar to that of [Model.SetContent]. See also [Model.SetContent].
233+func (m *Model) SetContentLines(lines []string) {
234+ // if there's no content, set content to actual nil instead of one empty
235+ // line.
236+ m.lines = lines
237+ if len(m.lines) == 1 && ansi.StringWidth(m.lines[0]) == 0 {
238+ m.lines = nil
239+ } else {
240+ // iterate in reverse, so we can safely modify the slice.
241+ var subLines []string
242+ for i := len(m.lines) - 1; i >= 0; i-- {
243+ if !strings.ContainsAny(m.lines[i], "\r\n") {
244+ continue
245+ }
246+
247+ m.lines[i] = strings.ReplaceAll(m.lines[i], "\r\n", "\n") // normalize line endings
248+ subLines = strings.Split(m.lines[i], "\n")
249+ if len(subLines) > 1 {
250+ m.lines = slices.Insert(m.lines, i+1, subLines[1:]...)
251+ m.lines[i] = subLines[0]
252+ }
253+ }
254+ }
255+
256+ m.longestLineWidth = maxLineWidth(m.lines)
257+ m.ClearHighlights()
258+
259+ if m.YOffset() > m.maxYOffset() {
260+ m.GotoBottom()
261+ }
262+}
263+
264+// GetContent returns the entire content as a single string.
265+// Line endings are normalized to '\n'.
266+func (m Model) GetContent() string {
267+ return strings.Join(m.lines, "\n")
268+}
269+
270+// calculateLine taking soft wrapping into account, returns the total viewable
271+// lines and the real-line index for the given yoffset, as well as the virtual
272+// line offset.
273+func (m Model) calculateLine(yoffset int) (total, ridx, voffset int) {
274+ if !m.SoftWrap {
275+ total = len(m.lines)
276+ ridx = min(yoffset, len(m.lines))
277+ return total, ridx, 0
278+ }
279+
280+ maxWidth := float64(m.maxWidth())
281+ var lineHeight int
282+
283+ for i, line := range m.lines {
284+ lineHeight = max(1, int(math.Ceil(float64(ansi.StringWidth(line))/maxWidth)))
285+
286+ if yoffset >= total && yoffset < total+lineHeight {
287+ ridx = i
288+ voffset = yoffset - total
289+ }
290+ total += lineHeight
291+ }
292+
293+ if yoffset >= total {
294+ ridx = len(m.lines)
295+ voffset = 0
296+ }
297+
298+ return total, ridx, voffset
299+}
300+
301+// maxYOffset returns the maximum possible value of the y-offset based on the
302+// viewport's content and set height.
303+func (m Model) maxYOffset() int {
304+ total, _, _ := m.calculateLine(0)
305+ return max(0, total-m.Height()+m.Style.GetVerticalFrameSize())
306+}
307+
308+// maxXOffset returns the maximum possible value of the x-offset based on the
309+// viewport's content and set width.
310+func (m Model) maxXOffset() int {
311+ return max(0, m.longestLineWidth-m.Width())
312+}
313+
314+// maxWidth returns the maximum width of the viewport. It accounts for the frame
315+// size, in addition to the gutter size.
316+func (m Model) maxWidth() int {
317+ var gutterSize int
318+ if m.LeftGutterFunc != nil {
319+ gutterSize = ansi.StringWidth(m.LeftGutterFunc(GutterContext{}))
320+ }
321+ return max(0, m.Width()-m.Style.GetHorizontalFrameSize()-gutterSize)
322+}
323+
324+// maxHeight returns the maximum height of the viewport. It accounts for the frame
325+// size.
326+func (m Model) maxHeight() int {
327+ return max(0, m.Height()-m.Style.GetVerticalFrameSize())
328+}
329+
330+// visibleLines returns the lines that should currently be visible in the
331+// viewport.
332+func (m Model) visibleLines() (lines []string) {
333+ maxHeight := m.maxHeight()
334+ maxWidth := m.maxWidth()
335+
336+ if maxHeight == 0 || maxWidth == 0 {
337+ return nil
338+ }
339+
340+ total, ridx, voffset := m.calculateLine(m.YOffset())
341+ if total > 0 {
342+ bottom := clamp(ridx+maxHeight, ridx, len(m.lines))
343+ lines = m.styleLines(slices.Clone(m.lines[ridx:bottom]), ridx)
344+ lines = m.highlightLines(lines, ridx)
345+ }
346+
347+ for m.FillHeight && len(lines) < maxHeight {
348+ lines = append(lines, "")
349+ }
350+
351+ // if longest line fit within width, no need to do anything else.
352+ if (m.xOffset == 0 && m.longestLineWidth <= maxWidth) || maxWidth == 0 {
353+ return m.setupGutter(lines, total, ridx)
354+ }
355+
356+ if m.SoftWrap {
357+ return m.softWrap(lines, maxWidth, maxHeight, total, ridx, voffset)
358+ }
359+
360+ // Cut the lines to the viewport width.
361+ for i := range lines {
362+ lines[i] = ansi.Cut(lines[i], m.xOffset, m.xOffset+maxWidth)
363+ }
364+ return m.setupGutter(lines, total, ridx)
365+}
366+
367+// styleLines styles the lines using [Model.StyleLineFunc].
368+func (m Model) styleLines(lines []string, offset int) []string {
369+ if m.StyleLineFunc == nil {
370+ return lines
371+ }
372+ for i := range lines {
373+ lines[i] = m.StyleLineFunc(i + offset).Render(lines[i])
374+ }
375+ return lines
376+}
377+
378+// highlightLines highlights the lines with [Model.HighlightStyle] and
379+// [Model.SelectedHighlightStyle].
380+func (m Model) highlightLines(lines []string, offset int) []string {
381+ if len(m.highlights) == 0 {
382+ return lines
383+ }
384+ for i := range lines {
385+ ranges := makeHighlightRanges(
386+ m.highlights,
387+ i+offset,
388+ m.HighlightStyle,
389+ )
390+ lines[i] = lipgloss.StyleRanges(lines[i], ranges...)
391+ if m.hiIdx < 0 {
392+ continue
393+ }
394+ sel := m.highlights[m.hiIdx]
395+ if hi, ok := sel.lines[i+offset]; ok {
396+ lines[i] = lipgloss.StyleRanges(lines[i], lipgloss.NewRange(
397+ hi[0],
398+ hi[1],
399+ m.SelectedHighlightStyle,
400+ ))
401+ }
402+ }
403+ return lines
404+}
405+
406+func (m Model) softWrap(lines []string, maxWidth, maxHeight, total, ridx, voffset int) []string {
407+ wrappedLines := make([]string, 0, maxHeight)
408+
409+ var idx, lineWidth int
410+ var truncatedLine string
411+
412+ for i, line := range lines {
413+ // If the line is less than or equal to the max width, it can be added
414+ // as is.
415+ lineWidth = ansi.StringWidth(line)
416+
417+ if lineWidth <= maxWidth {
418+ if m.LeftGutterFunc != nil {
419+ line = m.LeftGutterFunc(GutterContext{
420+ Index: i + ridx,
421+ TotalLines: total,
422+ Soft: false,
423+ }) + line
424+ }
425+ wrappedLines = append(wrappedLines, line)
426+ continue
427+ }
428+
429+ idx = 0
430+ for lineWidth > idx {
431+ truncatedLine = ansi.Cut(line, idx, maxWidth+idx)
432+ if m.LeftGutterFunc != nil {
433+ truncatedLine = m.LeftGutterFunc(GutterContext{
434+ Index: i + ridx,
435+ TotalLines: total,
436+ Soft: idx > 0,
437+ }) + truncatedLine
438+ }
439+ wrappedLines = append(wrappedLines, truncatedLine)
440+ idx += maxWidth
441+ }
442+ }
443+
444+ return wrappedLines[voffset:min(voffset+maxHeight, len(wrappedLines))]
445+}
446+
447+// setupGutter sets up the left gutter using [Model.LeftGutterFunc].
448+func (m Model) setupGutter(lines []string, total, ridx int) []string {
449+ if m.LeftGutterFunc == nil {
450+ return lines
451+ }
452+
453+ for i := range lines {
454+ lines[i] = m.LeftGutterFunc(GutterContext{
455+ Index: i + ridx,
456+ TotalLines: total,
457+ Soft: false,
458+ }) + lines[i]
459+ }
460+ return lines
461+}
462+
463+// SetYOffset sets the Y offset.
464+func (m *Model) SetYOffset(n int) {
465+ m.yOffset = clamp(n, 0, m.maxYOffset())
466+}
467+
468+// YOffset returns the current Y offset - the vertical scroll position.
469+func (m *Model) YOffset() int { return m.yOffset }
470+
471+// EnsureVisible ensures that the given line and column are in the viewport.
472+func (m *Model) EnsureVisible(line, colstart, colend int) {
473+ maxWidth := m.maxWidth()
474+ if colend <= maxWidth {
475+ m.SetXOffset(0)
476+ } else {
477+ m.SetXOffset(colstart - m.horizontalStep) // put one step to the left, feels more natural
478+ }
479+
480+ if line < m.YOffset() || line >= m.YOffset()+m.maxHeight() {
481+ m.SetYOffset(line)
482+ }
483+}
484+
485+// PageDown moves the view down by the number of lines in the viewport.
486+func (m *Model) PageDown() {
487+ if m.AtBottom() {
488+ return
489+ }
490+ m.ScrollDown(m.Height())
491+}
492+
493+// PageUp moves the view up by one height of the viewport.
494+func (m *Model) PageUp() {
495+ if m.AtTop() {
496+ return
497+ }
498+ m.ScrollUp(m.Height())
499+}
500+
501+// HalfPageDown moves the view down by half the height of the viewport.
502+func (m *Model) HalfPageDown() {
503+ if m.AtBottom() {
504+ return
505+ }
506+ m.ScrollDown(m.Height() / 2) //nolint:mnd
507+}
508+
509+// HalfPageUp moves the view up by half the height of the viewport.
510+func (m *Model) HalfPageUp() {
511+ if m.AtTop() {
512+ return
513+ }
514+ m.ScrollUp(m.Height() / 2) //nolint:mnd
515+}
516+
517+// ScrollDown moves the view down by the given number of lines.
518+func (m *Model) ScrollDown(n int) {
519+ if m.AtBottom() || n == 0 || len(m.lines) == 0 {
520+ return
521+ }
522+ // Make sure the number of lines by which we're going to scroll isn't
523+ // greater than the number of lines we actually have left before we reach
524+ // the bottom.
525+ m.SetYOffset(m.YOffset() + n)
526+ m.hiIdx = m.findNearestMatch()
527+}
528+
529+// ScrollUp moves the view up by the given number of lines.
530+func (m *Model) ScrollUp(n int) {
531+ if m.AtTop() || n == 0 || len(m.lines) == 0 {
532+ return
533+ }
534+ // Make sure the number of lines by which we're going to scroll isn't
535+ // greater than the number of lines we are from the top.
536+ m.SetYOffset(m.YOffset() - n)
537+ m.hiIdx = m.findNearestMatch()
538+}
539+
540+// SetHorizontalStep sets the amount of cells that the viewport moves in the
541+// default viewport keymapping. If set to 0 or less, horizontal scrolling is
542+// disabled.
543+func (m *Model) SetHorizontalStep(n int) {
544+ m.horizontalStep = max(0, n)
545+}
546+
547+// XOffset returns the current X offset - the horizontal scroll position.
548+func (m *Model) XOffset() int { return m.xOffset }
549+
550+// SetXOffset sets the X offset.
551+// No-op when soft wrap is enabled.
552+func (m *Model) SetXOffset(n int) {
553+ if m.SoftWrap {
554+ return
555+ }
556+ m.xOffset = clamp(n, 0, m.maxXOffset())
557+}
558+
559+// ScrollLeft moves the viewport to the left by the given number of columns.
560+func (m *Model) ScrollLeft(n int) {
561+ m.SetXOffset(m.xOffset - n)
562+}
563+
564+// ScrollRight moves viewport to the right by the given number of columns.
565+func (m *Model) ScrollRight(n int) {
566+ m.SetXOffset(m.xOffset + n)
567+}
568+
569+// TotalLineCount returns the total number of lines (both hidden and visible) within the viewport.
570+func (m Model) TotalLineCount() int {
571+ total, _, _ := m.calculateLine(0)
572+ return total
573+}
574+
575+// VisibleLineCount returns the number of the visible lines within the viewport.
576+func (m Model) VisibleLineCount() int {
577+ return len(m.visibleLines())
578+}
579+
580+// GotoTop sets the viewport to the top position.
581+func (m *Model) GotoTop() (lines []string) {
582+ if m.AtTop() {
583+ return nil
584+ }
585+ m.SetYOffset(0)
586+ m.hiIdx = m.findNearestMatch()
587+ return m.visibleLines()
588+}
589+
590+// GotoBottom sets the viewport to the bottom position.
591+func (m *Model) GotoBottom() (lines []string) {
592+ m.SetYOffset(m.maxYOffset())
593+ m.hiIdx = m.findNearestMatch()
594+ return m.visibleLines()
595+}
596+
597+// SetHighlights sets ranges of characters to highlight.
598+// For instance, `[]int{[]int{2, 10}, []int{20, 30}}` will highlight characters
599+// 2 to 10 and 20 to 30.
600+// Note that highlights are not expected to transpose each other, and are also
601+// expected to be in order.
602+// Use [Model.SetHighlights] to set the highlight ranges, and
603+// [Model.HighlightNext] and [Model.HighlightPrevious] to navigate.
604+// Use [Model.ClearHighlights] to remove all highlights.
605+func (m *Model) SetHighlights(matches [][]int) {
606+ if len(matches) == 0 || len(m.lines) == 0 {
607+ return
608+ }
609+ m.highlights = parseMatches(m.GetContent(), matches)
610+ m.hiIdx = m.findNearestMatch()
611+ m.showHighlight()
612+}
613+
614+// ClearHighlights clears previously set highlights.
615+func (m *Model) ClearHighlights() {
616+ m.highlights = nil
617+ m.hiIdx = -1
618+}
619+
620+func (m *Model) showHighlight() {
621+ if m.hiIdx == -1 {
622+ return
623+ }
624+ line, colstart, colend := m.highlights[m.hiIdx].coords()
625+ m.EnsureVisible(line, colstart, colend)
626+}
627+
628+// HighlightNext highlights the next match.
629+func (m *Model) HighlightNext() {
630+ if m.highlights == nil {
631+ return
632+ }
633+ m.hiIdx = (m.hiIdx + 1) % len(m.highlights)
634+ m.showHighlight()
635+}
636+
637+// HighlightPrevious highlights the previous match.
638+func (m *Model) HighlightPrevious() {
639+ if m.highlights == nil {
640+ return
641+ }
642+ m.hiIdx = (m.hiIdx - 1 + len(m.highlights)) % len(m.highlights)
643+ m.showHighlight()
644+}
645+
646+func (m Model) findNearestMatch() int {
647+ for i, match := range m.highlights {
648+ if match.lineStart >= m.YOffset() {
649+ return i
650+ }
651+ }
652+ return -1
653+}
654+
655+// Update handles standard message-based viewport updates.
656+func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
657+ m = m.updateAsModel(msg)
658+ return m, nil
659+}
660+
661+// Author's note: this method has been broken out to make it easier to
662+// potentially transition Update to satisfy tea.Model.
663+func (m Model) updateAsModel(msg tea.Msg) Model {
664+ if !m.initialized {
665+ m.setInitialValues()
666+ }
667+
668+ switch msg := msg.(type) {
669+ case tea.KeyPressMsg:
670+ switch {
671+ case key.Matches(msg, m.KeyMap.PageDown):
672+ m.PageDown()
673+
674+ case key.Matches(msg, m.KeyMap.PageUp):
675+ m.PageUp()
676+
677+ case key.Matches(msg, m.KeyMap.HalfPageDown):
678+ m.HalfPageDown()
679+
680+ case key.Matches(msg, m.KeyMap.HalfPageUp):
681+ m.HalfPageUp()
682+
683+ case key.Matches(msg, m.KeyMap.Down):
684+ m.ScrollDown(1)
685+
686+ case key.Matches(msg, m.KeyMap.Up):
687+ m.ScrollUp(1)
688+
689+ case key.Matches(msg, m.KeyMap.Left):
690+ m.ScrollLeft(m.horizontalStep)
691+
692+ case key.Matches(msg, m.KeyMap.Right):
693+ m.ScrollRight(m.horizontalStep)
694+ }
695+
696+ case tea.MouseWheelMsg:
697+ if !m.MouseWheelEnabled {
698+ break
699+ }
700+ switch msg.Button {
701+ case tea.MouseWheelDown:
702+ // NOTE: some terminal emulators don't send the shift event for
703+ // mouse actions.
704+ if msg.Mod.Contains(tea.ModShift) {
705+ m.ScrollRight(m.horizontalStep)
706+ break
707+ }
708+ m.ScrollDown(m.MouseWheelDelta)
709+ case tea.MouseWheelUp:
710+ // NOTE: some terminal emulators don't send the shift event for
711+ // mouse actions.
712+ if msg.Mod.Contains(tea.ModShift) {
713+ m.ScrollLeft(m.horizontalStep)
714+ break
715+ }
716+ m.ScrollUp(m.MouseWheelDelta)
717+ case tea.MouseWheelLeft:
718+ m.ScrollLeft(m.horizontalStep)
719+ case tea.MouseWheelRight:
720+ m.ScrollRight(m.horizontalStep)
721+ }
722+ }
723+
724+ return m
725+}
726+
727+// View renders the viewport into a string.
728+func (m Model) View() string {
729+ w, h := m.Width(), m.Height()
730+ if sw := m.Style.GetWidth(); sw != 0 {
731+ w = min(w, sw)
732+ }
733+ if sh := m.Style.GetHeight(); sh != 0 {
734+ h = min(h, sh)
735+ }
736+
737+ if w == 0 || h == 0 {
738+ return ""
739+ }
740+
741+ contentWidth := w - m.Style.GetHorizontalFrameSize()
742+ contentHeight := h - m.Style.GetVerticalFrameSize()
743+ contents := lipgloss.NewStyle().
744+ Width(contentWidth). // pad to width.
745+ Height(contentHeight). // pad to height.
746+ Render(strings.Join(m.visibleLines(), "\n"))
747+ return m.Style.
748+ UnsetWidth().UnsetHeight(). // Style size already applied in contents.
749+ Render(contents)
750+}
751+
752+func clamp[T cmp.Ordered](v, low, high T) T {
753+ if high < low {
754+ low, high = high, low
755+ }
756+ return min(high, max(low, v))
757+}
758+
759+func maxLineWidth(lines []string) int {
760+ result := 0
761+ for _, line := range lines {
762+ result = max(result, ansi.StringWidth(line))
763+ }
764+ return result
765+}
vendor/charm.land/bubbletea/v2/.gitattributesnew file+1
@@ -0,0 +1 @@
1+*.golden -text
vendor/charm.land/bubbletea/v2/.gitignorenew file+23
@@ -0,0 +1,23 @@
1+.DS_Store
2+.envrc
3+
4+examples/fullscreen/fullscreen
5+examples/help/help
6+examples/http/http
7+examples/list-default/list-default
8+examples/list-fancy/list-fancy
9+examples/list-simple/list-simple
10+examples/mouse/mouse
11+examples/pager/pager
12+examples/progress-download/color_vortex.blend
13+examples/progress-download/progress-download
14+examples/simple/simple
15+examples/spinner/spinner
16+examples/textinput/textinput
17+examples/textinputs/textinputs
18+examples/views/views
19+tutorials/basics/basics
20+tutorials/commands/commands
21+.idea
22+coverage.txt
23+dist/
vendor/charm.land/bubbletea/v2/.golangci.ymlnew file+47
@@ -0,0 +1,47 @@
1+version: "2"
2+run:
3+ tests: false
4+linters:
5+ enable:
6+ - bodyclose
7+ - exhaustive
8+ - goconst
9+ - godot
10+ - gomoddirectives
11+ - goprintffuncname
12+ - gosec
13+ - misspell
14+ - nakedret
15+ - nestif
16+ - nilerr
17+ - noctx
18+ - nolintlint
19+ - prealloc
20+ - revive
21+ - rowserrcheck
22+ - sqlclosecheck
23+ - tparallel
24+ - unconvert
25+ - unparam
26+ - whitespace
27+ - wrapcheck
28+ exclusions:
29+ rules:
30+ - text: '(slog|log)\.\w+'
31+ linters:
32+ - noctx
33+ generated: lax
34+ presets:
35+ - common-false-positives
36+ settings:
37+ exhaustive:
38+ default-signifies-exhaustive: true
39+issues:
40+ max-issues-per-linter: 0
41+ max-same-issues: 0
42+formatters:
43+ enable:
44+ - gofumpt
45+ - goimports
46+ exclusions:
47+ generated: lax
vendor/charm.land/bubbletea/v2/.goreleaser.ymlnew file+5
@@ -0,0 +1,5 @@
1+# yaml-language-server: $schema=https://goreleaser.com/static/schema-pro.json
2+version: 2
3+includes:
4+ - from_url:
5+ url: charmbracelet/meta/main/goreleaser-lib.yaml
vendor/charm.land/bubbletea/v2/LICENSEnew file+21
@@ -0,0 +1,21 @@
1+MIT License
2+
3+Copyright (c) 2020-2026 Charmbracelet, Inc.
4+
5+Permission is hereby granted, free of charge, to any person obtaining a copy
6+of this software and associated documentation files (the "Software"), to deal
7+in the Software without restriction, including without limitation the rights
8+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+copies of the Software, and to permit persons to whom the Software is
10+furnished to do so, subject to the following conditions:
11+
12+The above copyright notice and this permission notice shall be included in all
13+copies or substantial portions of the Software.
14+
15+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+SOFTWARE.
vendor/charm.land/bubbletea/v2/README.mdnew file+402
@@ -0,0 +1,402 @@
1+# Bubble Tea
2+
3+<p>
4+ <img src="https://github.com/user-attachments/assets/ad408275-8799-488f-9303-441e7f869535" width="350"><br>
5+ <a href="https://github.com/charmbracelet/bubbletea/releases"><img src="https://img.shields.io/github/release/charmbracelet/bubbletea.svg" alt="Latest Release"></a>
6+ <a href="https://pkg.go.dev/charm.land/bubbletea/v2?tab=doc"><img src="https://godoc.org/charm.land/bubbletea/v2?status.svg" alt="GoDoc"></a>
7+ <a href="https://github.com/charmbracelet/bubbletea/actions"><img src="https://github.com/charmbracelet/bubbletea/actions/workflows/build.yml/badge.svg?branch=main" alt="Build Status"></a>
8+</p>
9+
10+The fun, functional and stateful way to build terminal apps. A Go framework
11+based on [The Elm Architecture][elm]. Bubble Tea is well-suited for simple and
12+complex terminal applications, either inline, full-window, or a mix of both.
13+
14+<p>
15+ <img src="https://stuff.charm.sh/bubbletea/bubbletea-example.gif" width="100%" alt="Bubble Tea Example">
16+</p>
17+
18+Bubble Tea is in use in production and includes a number of features and
19+performance optimizations we’ve added along the way. Among those is
20+a high-performance cell-based renderer, built-in color downsampling,
21+declarative views, high-fidelity keyboard and mouse handling, native clipboard
22+support, and more.
23+
24+To get started, see the tutorial below, the [examples][examples], the
25+[docs][docs], and some common [resources](#libraries-we-use-with-bubble-tea).
26+
27+> [!TIP]
28+>
29+> Upgrading from v1? Check out the [upgrade guide](./UPGRADE_GUIDE_V2.md), or
30+> point your LLM at it and let it go to town.
31+
32+## By the way
33+
34+Be sure to check out [Bubbles][bubbles], a library of common UI components for Bubble Tea.
35+
36+<p>
37+ <a href="https://github.com/charmbracelet/bubbles"><img src="https://github.com/user-attachments/assets/b6dc4638-b67a-4bfa-88d0-a8e8833c3ac9" width="172" alt="Bubbles Badge"></a>&nbsp;&nbsp;
38+ <a href="https://github.com/charmbracelet/bubbles"><img src="https://stuff.charm.sh/bubbles-examples/textinput.gif" width="400" alt="Text Input Example from Bubbles"></a>
39+</p>
40+
41+---
42+
43+## Tutorial
44+
45+Bubble Tea is based on the functional design paradigms of [The Elm
46+Architecture][elm], which happens to work nicely with Go. It's a delightful way
47+to build applications.
48+
49+This tutorial assumes you have a working knowledge of Go.
50+
51+By the way, the non-annotated source code for this program is available
52+[on GitHub][tut-source].
53+
54+[elm]: https://guide.elm-lang.org/architecture/
55+[tut-source]: https://github.com/charmbracelet/bubbletea/tree/main/tutorials/basics
56+
57+### Enough! Let's get to it.
58+
59+For this tutorial, we're making a shopping list.
60+
61+To start we'll define our package and import some libraries. Our only external
62+import will be the Bubble Tea library, which we'll call `tea` for short.
63+
64+```go
65+package main
66+
67+// These imports will be used later in the tutorial. If you save the file
68+// now, Go might complain they are unused, but that's fine.
69+// You may also need to run `go mod tidy` to download bubbletea and its
70+// dependencies.
71+import (
72+ "fmt"
73+ "os"
74+
75+ tea "charm.land/bubbletea/v2"
76+)
77+```
78+
79+Bubble Tea programs are comprised of a **model** that describes the application
80+state and three simple methods on that model:
81+
82+- **Init**, a function that returns an initial command for the application to run.
83+- **Update**, a function that handles incoming events and updates the model accordingly.
84+- **View**, a function that renders the UI based on the data in the model.
85+
86+### The Model
87+
88+So let's start by defining our model which will store our application's state.
89+It can be any type, but a `struct` usually makes the most sense.
90+
91+```go
92+type model struct {
93+ choices []string // items on the to-do list
94+ cursor int // which to-do list item our cursor is pointing at
95+ selected map[int]struct{} // which to-do items are selected
96+}
97+```
98+
99+## Initialization
100+
101+Next, we’ll define our application’s initial state. `Init` can return a `Cmd`
102+that could perform some initial I/O. For now, we don’t need to do any I/O, so
103+for the command, we’ll just return `nil`, which translates to “no command.”
104+
105+```go
106+func initialModel() model {
107+ return model{
108+ // Our to-do list is a grocery list
109+ choices: []string{"Buy carrots", "Buy celery", "Buy kohlrabi"},
110+
111+ // A map which indicates which choices are selected. We're using
112+ // the map like a mathematical set. The keys refer to the indexes
113+ // of the `choices` slice, above.
114+ selected: make(map[int]struct{}),
115+ }
116+}
117+```
118+
119+After that, we’ll define our application’s initial state in the `Init` method. `Init`
120+can return a `Cmd` that could perform some initial I/O. For now, we don't need
121+to do any I/O, so for the command, we'll just return `nil`, which translates to
122+"no command."
123+
124+```go
125+func (m model) Init() tea.Cmd {
126+ // Just return `nil`, which means "no I/O right now, please."
127+ return nil
128+}
129+```
130+
131+### The Update Method
132+
133+Next up is the update method. The update function is called when “things
134+happen.” Its job is to look at what has happened and return an updated model in
135+response. It can also return a `Cmd` to make more things happen, but for now
136+don't worry about that part.
137+
138+In our case, when a user presses the down arrow, `Update`’s job is to notice
139+that the down arrow was pressed and move the cursor accordingly (or not).
140+
141+The “something happened” comes in the form of a `Msg`, which can be any type.
142+Messages are the result of some I/O that took place, such as a keypress, timer
143+tick, or a response from a server.
144+
145+We usually figure out which type of `Msg` we received with a type switch, but
146+you could also use a type assertion.
147+
148+For now, we'll just deal with `tea.KeyPressMsg` messages, which are
149+automatically sent to the update function when keys are pressed.
150+
151+```go
152+func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
153+ switch msg := msg.(type) {
154+
155+ // Is it a key press?
156+ case tea.KeyPressMsg:
157+
158+ // Cool, what was the actual key pressed?
159+ switch msg.String() {
160+
161+ // These keys should exit the program.
162+ case "ctrl+c", "q":
163+ return m, tea.Quit
164+
165+ // The "up" and "k" keys move the cursor up
166+ case "up", "k":
167+ if m.cursor > 0 {
168+ m.cursor--
169+ }
170+
171+ // The "down" and "j" keys move the cursor down
172+ case "down", "j":
173+ if m.cursor < len(m.choices)-1 {
174+ m.cursor++
175+ }
176+
177+ // The "enter" key and the space bar toggle the selected state
178+ // for the item that the cursor is pointing at.
179+ case "enter", "space":
180+ _, ok := m.selected[m.cursor]
181+ if ok {
182+ delete(m.selected, m.cursor)
183+ } else {
184+ m.selected[m.cursor] = struct{}{}
185+ }
186+ }
187+ }
188+
189+ // Return the updated model to the Bubble Tea runtime for processing.
190+ // Note that we're not returning a command.
191+ return m, nil
192+}
193+```
194+
195+You may have noticed that <kbd>ctrl+c</kbd> and <kbd>q</kbd> above return
196+a `tea.Quit` command with the model. That’s a special command which instructs
197+the Bubble Tea runtime to quit, exiting the program.
198+
199+### The View Method
200+
201+At last, it’s time to render our UI. Of all the methods, the view is the
202+simplest. We look at the model in its current state and use it to build a
203+`tea.View`. The view declares our UI content and, optionally, terminal features
204+like alt screen mode, mouse tracking, cursor position, and more.
205+
206+Because the view describes the entire UI of your application, you don’t have to
207+worry about redrawing logic and stuff like that. Bubble Tea takes care of it
208+for you.
209+
210+```go
211+func (m model) View() tea.View {
212+ // The header
213+ s := "What should we buy at the market?\n\n"
214+
215+ // Iterate over our choices
216+ for i, choice := range m.choices {
217+
218+ // Is the cursor pointing at this choice?
219+ cursor := " " // no cursor
220+ if m.cursor == i {
221+ cursor = ">" // cursor!
222+ }
223+
224+ // Is this choice selected?
225+ checked := " " // not selected
226+ if _, ok := m.selected[i]; ok {
227+ checked = "x" // selected!
228+ }
229+
230+ // Render the row
231+ s += fmt.Sprintf("%s [%s] %s\n", cursor, checked, choice)
232+ }
233+
234+ // The footer
235+ s += "\nPress q to quit.\n"
236+
237+ // Send the UI for rendering
238+ return tea.NewView(s)
239+}
240+```
241+
242+### All Together Now
243+
244+The last step is to simply run our program. We pass our initial model to
245+`tea.NewProgram` and let it rip:
246+
247+```go
248+func main() {
249+ p := tea.NewProgram(initialModel())
250+ if _, err := p.Run(); err != nil {
251+ fmt.Printf("Alas, there's been an error: %v", err)
252+ os.Exit(1)
253+ }
254+}
255+```
256+
257+## What’s Next?
258+
259+This tutorial covers the basics of building an interactive terminal UI, but
260+in the real world you'll also need to perform I/O. To learn about that have a
261+look at the [Command Tutorial][cmd]. It's pretty simple.
262+
263+There are also several [Bubble Tea examples][examples] available and, of course,
264+there are [Go Docs][docs].
265+
266+[cmd]: https://github.com/charmbracelet/bubbletea/tree/main/tutorials/commands/
267+[examples]: https://github.com/charmbracelet/bubbletea/tree/main/examples
268+[docs]: https://pkg.go.dev/charm.land/bubbletea/v2?tab=doc
269+
270+## Debugging
271+
272+### Debugging with Delve
273+
274+Since Bubble Tea apps assume control of stdin and stdout, you’ll need to run
275+delve in headless mode and then connect to it:
276+
277+```bash
278+# Start the debugger
279+$ dlv debug --headless --api-version=2 --listen=127.0.0.1:43000 .
280+API server listening at: 127.0.0.1:43000
281+
282+# Connect to it from another terminal
283+$ dlv connect 127.0.0.1:43000
284+```
285+
286+If you do not explicitly supply the `--listen` flag, the port used will vary
287+per run, so passing this in makes the debugger easier to use from a script
288+or your IDE of choice.
289+
290+Additionally, we pass in `--api-version=2` because delve defaults to version 1
291+for backwards compatibility reasons. However, delve recommends using version 2
292+for all new development and some clients may no longer work with version 1.
293+For more information, see the [Delve documentation](https://github.com/go-delve/delve/tree/master/Documentation/api).
294+
295+### Logging Stuff
296+
297+You can’t really log to stdout with Bubble Tea because your TUI is busy
298+occupying that! You can, however, log to a file by including something like
299+the following prior to starting your Bubble Tea program:
300+
301+```go
302+if len(os.Getenv("DEBUG")) > 0 {
303+ f, err := tea.LogToFile("debug.log", "debug")
304+ if err != nil {
305+ fmt.Println("fatal:", err)
306+ os.Exit(1)
307+ }
308+ defer f.Close()
309+}
310+```
311+
312+To see what’s being logged in real time, run `tail -f debug.log` while you run
313+your program in another window.
314+
315+## Libraries we use with Bubble Tea
316+
317+- [Bubbles][bubbles]: Common Bubble Tea components such as text inputs, viewports, spinners and so on
318+- [Lip Gloss][lipgloss]: Style, format and layout tools for terminal applications
319+- [Harmonica][harmonica]: A spring animation library for smooth, natural motion
320+- [BubbleZone][bubblezone]: Easy mouse event tracking for Bubble Tea components
321+- [ntcharts][ntcharts]: A terminal charting library built for Bubble Tea and [Lip Gloss][lipgloss]
322+
323+[bubbles]: https://github.com/charmbracelet/bubbles
324+[lipgloss]: https://github.com/charmbracelet/lipgloss
325+[harmonica]: https://github.com/charmbracelet/harmonica
326+[bubblezone]: https://github.com/lrstanley/bubblezone
327+[ntcharts]: https://github.com/NimbleMarkets/ntcharts
328+
329+## Bubble Tea in the Wild
330+
331+There are over [18,000 applications](https://github.com/charmbracelet/bubbletea/network/dependents) built with Bubble Tea! Here are a handful of ’em.
332+
333+### Staff favourites
334+
335+- [chezmoi](https://github.com/twpayne/chezmoi): securely manage your dotfiles across multiple machines
336+- [circumflex](https://github.com/bensadeh/circumflex): read Hacker News in the terminal
337+- [gh-dash](https://www.github.com/dlvhdr/gh-dash): a GitHub CLI extension for PRs and issues
338+- [Tetrigo](https://github.com/Broderick-Westrope/tetrigo): Tetris in the terminal
339+- [Signls](https://github.com/emprcl/signls): a generative midi sequencer designed for composition and live performance
340+- [Superfile](https://github.com/yorukot/superfile): a super file manager
341+
342+### In Industry
343+
344+- Microsoft Azure – [Aztify](https://github.com/Azure/aztfy): bring Microsoft Azure resources under Terraform
345+- Daytona – [Daytona](https://github.com/daytonaio/daytona): an AI infrastructure platform
346+- Cockroach Labs – [CockroachDB](https://github.com/cockroachdb/cockroach): a cloud-native, high-availability distributed SQL database
347+- Truffle Security Co. – [Trufflehog](https://github.com/trufflesecurity/trufflehog): find leaked credentials
348+- NVIDIA – [container-canary](https://github.com/NVIDIA/container-canary): a container validator
349+- AWS – [eks-node-viewer](https://github.com/awslabs/eks-node-viewer): a tool for visualizing dynamic node usage within an EKS cluster
350+- MinIO – [mc](https://github.com/minio/mc): the official [MinIO](https://min.io) client
351+- Ubuntu – [Authd](https://github.com/ubuntu/authd): an authentication daemon for cloud-based identity providers
352+
353+### Charm stuff
354+
355+- [Glow](https://github.com/charmbracelet/glow): a markdown reader, browser, and online markdown stash
356+- [Huh?](https://github.com/charmbracelet/huh): an interactive prompt and form toolkit
357+- [Mods](https://github.com/charmbracelet/mods): AI on the CLI, built for pipelines
358+- [Wishlist](https://github.com/charmbracelet/wishlist): an SSH directory (and bastion!)
359+
360+### There’s so much more where that came from
361+
362+For more applications built with Bubble Tea see [Charm & Friends][community].
363+Is there something cool you made with Bubble Tea you want to share? [PRs][community] are
364+welcome!
365+
366+## Contributing
367+
368+See [contributing][contribute].
369+
370+[contribute]: https://github.com/charmbracelet/bubbletea/contribute
371+
372+## Feedback
373+
374+We’d love to hear your thoughts on this project. Feel free to drop us a note!
375+
376+- [Twitter](https://twitter.com/charmcli)
377+- [The Fediverse](https://mastodon.social/@charmcli)
378+- [Discord](https://charm.sh/chat)
379+
380+## Acknowledgments
381+
382+Bubble Tea is based on the paradigms of [The Elm Architecture][elm] by Evan
383+Czaplicki et alia and the excellent [go-tea][gotea] by TJ Holowaychuk. It’s
384+inspired by the many great [_Zeichenorientierte Benutzerschnittstellen_][zb]
385+of days past.
386+
387+[elm]: https://guide.elm-lang.org/architecture/
388+[gotea]: https://github.com/tj/go-tea
389+[zb]: https://de.wikipedia.org/wiki/Zeichenorientierte_Benutzerschnittstelle
390+[community]: https://github.com/charm-and-friends/charm-in-the-wild
391+
392+## License
393+
394+[MIT](https://github.com/charmbracelet/bubbletea/raw/main/LICENSE)
395+
396+---
397+
398+Part of [Charm](https://charm.sh).
399+
400+<a href="https://charm.sh/"><img alt="The Charm logo" src="https://stuff.charm.sh/charm-banner-softy.jpg" width="400"></a>
401+
402+Charm热爱开源 • Charm loves open source • نحنُ نحب المصادر المفتوحة
vendor/charm.land/bubbletea/v2/Taskfile.yamlnew file+38
@@ -0,0 +1,38 @@
1+# https://taskfile.dev
2+
3+version: "3"
4+
5+tasks:
6+ lint:
7+ desc: Run lint
8+ cmds:
9+ - golangci-lint run
10+
11+ test:
12+ desc: Run tests
13+ cmds:
14+ - go test -race -count 4 -cpu 1,4 ./... {{.CLI_ARGS}}
15+
16+ release:
17+ desc: Create and push a new tag following semver
18+ vars:
19+ NEXT:
20+ sh: svu next --always || go run github.com/caarlos0/svu/v3@latest next --always
21+ prompt: "This will release {{.NEXT}}. Continue?"
22+ preconditions:
23+ - sh: '[ $(git symbolic-ref --short HEAD) = "main" ]'
24+ msg: Not on main branch
25+ - sh: "[ $(git status --porcelain=2 | wc -l) = 0 ]"
26+ msg: "Git is dirty"
27+ - sh: 'gh run list --workflow build.yml --commit $(git rev-parse HEAD) --status success --json conclusion -q ".[0].conclusion" | grep -q success'
28+ msg: "Test build for this commit failed or not present"
29+ cmds:
30+ - task: fetch-tags
31+ - git commit --allow-empty -m "{{.NEXT}}"
32+ - git tag --annotate --sign -m "{{.NEXT}}" {{.NEXT}} {{.CLI_ARGS}}
33+ - echo "Pushing {{.NEXT}}..."
34+ - git push origin main --follow-tags
35+
36+ fetch-tags:
37+ cmds:
38+ - git fetch --tags
vendor/charm.land/bubbletea/v2/UPGRADE_GUIDE_V2.mdnew file+573
@@ -0,0 +1,573 @@
1+# Bubble Tea v2 Upgrade Guide
2+
3+This guide covers everything you need to change when upgrading from Bubble Tea v1 to v2. For a tour of all the exciting new features, check out the [What's New](https://github.com/charmbracelet/bubbletea/releases/tag/v2.0.0) doc.
4+
5+> [!NOTE]
6+> We don't take API changes lightly and strive to make the upgrade process as simple as possible. If something feels way off, let us know.
7+
8+## Migration Checklist
9+
10+Here's the short version — a checklist you can follow top to bottom. Each item links to the relevant section below.
11+
12+- [ ] [Update import paths](#import-paths)
13+- [ ] [Change `View() string` to `View() tea.View`](#view-returns-a-teaview-now)
14+- [ ] [Replace `tea.KeyMsg` with `tea.KeyPressMsg`](#key-messages)
15+- [ ] [Update key fields: `msg.Type` / `msg.Runes` / `msg.Alt`](#key-messages)
16+- [ ] [Replace `case " ":` with `case "space":`](#key-messages)
17+- [ ] [Update mouse message usage](#mouse-messages)
18+- [ ] [Rename mouse button constants](#mouse-messages)
19+- [ ] [Remove old program options → use View fields](#removed-program-options)
20+- [ ] [Remove imperative commands → use View fields](#removed-commands)
21+- [ ] [Remove old program methods](#removed-program-methods)
22+- [ ] [Rename `tea.WindowSize()` → `tea.RequestWindowSize`](#renamed-apis)
23+- [ ] [Replace `tea.Sequentially(...)` → `tea.Sequence(...)`](#renamed-apis)
24+
25+## Import Paths
26+
27+The module path changed to a vanity domain. Lip Gloss moved too.
28+
29+```go
30+// Before
31+import tea "github.com/charmbracelet/bubbletea"
32+import "github.com/charmbracelet/lipgloss"
33+
34+// After
35+import tea "charm.land/bubbletea/v2"
36+import "charm.land/lipgloss/v2"
37+```
38+
39+## The Big Idea: Declarative Views
40+
41+The single biggest change in v2 is the shift from **imperative commands** to **declarative View fields**. In v1, you'd use program options like `tea.WithAltScreen()` and commands like `tea.EnterAltScreen` to toggle terminal features on and off. In v2, you just set fields on the `tea.View` struct in your `View()` method and Bubble Tea handles the rest.
42+
43+This means: no more startup option flags, no more toggle commands, no more fighting over state. Just declare what you want and Bubble Tea will make it so.
44+
45+```go
46+// v1: imperative — scattered across NewProgram, Init, and Update
47+p := tea.NewProgram(model{}, tea.WithAltScreen(), tea.WithMouseCellMotion())
48+
49+// v2: declarative — everything lives in View()
50+func (m model) View() tea.View {
51+ v := tea.NewView("Hello!")
52+ v.AltScreen = true
53+ v.MouseMode = tea.MouseModeCellMotion
54+ return v
55+}
56+```
57+
58+Keep this in mind as you go through the rest of the guide — most of the "removed" things simply moved into View fields.
59+
60+## View Returns a `tea.View` Now
61+
62+The `View()` method no longer returns a `string`. It returns a `tea.View` struct.
63+
64+```go
65+// Before:
66+func (m model) View() string {
67+ return "Hello, world!"
68+}
69+
70+// After:
71+func (m model) View() tea.View {
72+ return tea.NewView("Hello, world!")
73+}
74+```
75+
76+You can also use the longer form if you need to set additional fields:
77+
78+```go
79+func (m model) View() tea.View {
80+ var v tea.View
81+ v.SetContent("Hello, world!")
82+ v.AltScreen = true
83+ return v
84+}
85+```
86+
87+The `tea.View` struct has fields for everything that used to be controlled by options and commands:
88+
89+| View Field | What It Does |
90+|---|---|
91+| `Content` | The rendered string (set via `SetContent()` or `NewView()`) |
92+| `AltScreen` | Enter/exit the alternate screen buffer |
93+| `MouseMode` | `MouseModeNone`, `MouseModeCellMotion`, or `MouseModeAllMotion` |
94+| `ReportFocus` | Enable focus/blur event reporting |
95+| `DisableBracketedPasteMode` | Disable bracketed paste |
96+| `WindowTitle` | Set the terminal window title |
97+| `Cursor` | Control cursor position, shape, color, and blink |
98+| `ForegroundColor` | Set the terminal foreground color |
99+| `BackgroundColor` | Set the terminal background color |
100+| `ProgressBar` | Show a native terminal progress bar |
101+| `KeyboardEnhancements` | Request keyboard enhancement features |
102+| `OnMouse` | Intercept mouse messages based on view content |
103+
104+## Key Messages
105+
106+Key messages got a major overhaul. Here's the quick rundown:
107+
108+### `tea.KeyMsg` is now an interface
109+
110+In v1, `tea.KeyMsg` was a struct you'd match on for key presses. In v2, it's an **interface** that covers both key presses and releases. For most code, you want `tea.KeyPressMsg`:
111+
112+```go
113+// Before:
114+case tea.KeyMsg:
115+ switch msg.String() {
116+ case "q":
117+ return m, tea.Quit
118+ }
119+
120+// After:
121+case tea.KeyPressMsg:
122+ switch msg.String() {
123+ case "q":
124+ return m, tea.Quit
125+ }
126+```
127+
128+If you want to handle both presses and releases, use `tea.KeyMsg` and type-switch inside:
129+
130+```go
131+case tea.KeyMsg:
132+ switch key := msg.(type) {
133+ case tea.KeyPressMsg:
134+ // key press
135+ case tea.KeyReleaseMsg:
136+ // key release
137+ }
138+```
139+
140+### Key fields changed
141+
142+| v1 | v2 | Notes |
143+|---|---|---|
144+| `msg.Type` | `msg.Code` | A `rune` — can be `tea.KeyEnter`, `'a'`, etc. |
145+| `msg.Runes` | `msg.Text` | Now a `string`, not `[]rune` |
146+| `msg.Alt` | `msg.Mod` | `msg.Mod.Contains(tea.ModAlt)` for alt, etc. |
147+| `tea.KeyRune` | — | Check `len(msg.Text) > 0` instead |
148+| `tea.KeyCtrlC` | — | Use `msg.String() == "ctrl+c"` or check `msg.Code` + `msg.Mod` |
149+
150+### Space bar changed
151+
152+Space bar now returns `"space"` instead of `" "` when using `msg.String()`:
153+
154+```go
155+// Before:
156+case " ":
157+
158+// After:
159+case "space":
160+```
161+
162+`key.Code` is still `' '` and `key.Text` is still `" "`, but `String()` returns `"space"`.
163+
164+### Ctrl+key matching
165+
166+```go
167+// Before:
168+case tea.KeyCtrlC:
169+ // ctrl+c
170+
171+// After (option A — string matching):
172+case tea.KeyPressMsg:
173+ switch msg.String() {
174+ case "ctrl+c":
175+ // ctrl+c
176+ }
177+
178+// After (option B — field matching):
179+case tea.KeyPressMsg:
180+ if msg.Code == 'c' && msg.Mod == tea.ModCtrl {
181+ // ctrl+c
182+ }
183+```
184+
185+### New Key fields
186+
187+These are new in v2 and don't have v1 equivalents:
188+
189+- **`key.ShiftedCode`** — the shifted key code (e.g., `'B'` when pressing shift+b)
190+- **`key.BaseCode`** — the key on a US PC-101 layout (handy for international keyboards)
191+- **`key.IsRepeat`** — whether the key is auto-repeating (Kitty protocol / Windows Console only)
192+- **`key.Keystroke()`** — like `String()` but always includes modifier info
193+
194+## Paste Messages
195+
196+Paste events no longer come in as `tea.KeyMsg` with a `Paste` flag. They're now their own message types:
197+
198+```go
199+// Before:
200+case tea.KeyMsg:
201+ if msg.Paste {
202+ m.text += string(msg.Runes)
203+ }
204+
205+// After:
206+case tea.PasteMsg:
207+ m.text += msg.Content
208+case tea.PasteStartMsg:
209+ // paste started
210+case tea.PasteEndMsg:
211+ // paste ended
212+```
213+
214+## Mouse Messages
215+
216+### `tea.MouseMsg` is now an interface
217+
218+In v1, `tea.MouseMsg` was a struct with `X`, `Y`, `Button`, etc. In v2, it's an **interface**. You get the coordinates by calling `msg.Mouse()`:
219+
220+```go
221+// Before:
222+case tea.MouseMsg:
223+ x, y := msg.X, msg.Y
224+
225+// After:
226+case tea.MouseMsg:
227+ mouse := msg.Mouse()
228+ x, y := mouse.X, mouse.Y
229+```
230+
231+### Mouse events are split by type
232+
233+Instead of checking `msg.Action`, match on specific message types:
234+
235+```go
236+// Before:
237+case tea.MouseMsg:
238+ if msg.Action == tea.MouseActionPress && msg.Button == tea.MouseButtonLeft {
239+ // left click
240+ }
241+
242+// After:
243+case tea.MouseClickMsg:
244+ if msg.Button == tea.MouseLeft {
245+ // left click
246+ }
247+case tea.MouseReleaseMsg:
248+ // release
249+case tea.MouseWheelMsg:
250+ // scroll
251+case tea.MouseMotionMsg:
252+ // movement
253+```
254+
255+### Button constants renamed
256+
257+| v1 | v2 |
258+|---|---|
259+| `tea.MouseButtonLeft` | `tea.MouseLeft` |
260+| `tea.MouseButtonRight` | `tea.MouseRight` |
261+| `tea.MouseButtonMiddle` | `tea.MouseMiddle` |
262+| `tea.MouseButtonWheelUp` | `tea.MouseWheelUp` |
263+| `tea.MouseButtonWheelDown` | `tea.MouseWheelDown` |
264+| `tea.MouseButtonWheelLeft` | `tea.MouseWheelLeft` |
265+| `tea.MouseButtonWheelRight` | `tea.MouseWheelRight` |
266+
267+### `tea.MouseEvent` → `tea.Mouse`
268+
269+The `MouseEvent` struct is gone. The new `Mouse` struct has `X`, `Y`, `Button`, and `Mod` fields.
270+
271+### Mouse mode is now a View field
272+
273+```go
274+// Before:
275+p := tea.NewProgram(model{}, tea.WithMouseCellMotion())
276+
277+// After:
278+func (m model) View() tea.View {
279+ v := tea.NewView("...")
280+ v.MouseMode = tea.MouseModeCellMotion
281+ return v
282+}
283+```
284+
285+## Removed Program Options
286+
287+These options no longer exist. They all moved to View fields.
288+
289+| Removed Option | Do This Instead |
290+|---|---|
291+| `tea.WithAltScreen()` | `view.AltScreen = true` |
292+| `tea.WithMouseCellMotion()` | `view.MouseMode = tea.MouseModeCellMotion` |
293+| `tea.WithMouseAllMotion()` | `view.MouseMode = tea.MouseModeAllMotion` |
294+| `tea.WithReportFocus()` | `view.ReportFocus = true` |
295+| `tea.WithoutBracketedPaste()` | `view.DisableBracketedPasteMode = true` |
296+| `tea.WithInputTTY()` | Just remove it — v2 always opens the TTY for input automatically |
297+| `tea.WithANSICompressor()` | Just remove it — the new renderer handles optimization automatically |
298+
299+## Removed Commands
300+
301+These commands no longer exist. Set the corresponding View field instead.
302+
303+| Removed Command | Do This Instead |
304+|---|---|
305+| `tea.EnterAltScreen` | `view.AltScreen = true` |
306+| `tea.ExitAltScreen` | `view.AltScreen = false` |
307+| `tea.EnableMouseCellMotion` | `view.MouseMode = tea.MouseModeCellMotion` |
308+| `tea.EnableMouseAllMotion` | `view.MouseMode = tea.MouseModeAllMotion` |
309+| `tea.DisableMouse` | `view.MouseMode = tea.MouseModeNone` |
310+| `tea.HideCursor` | `view.Cursor = nil` |
311+| `tea.ShowCursor` | `view.Cursor = &tea.Cursor{...}` or `tea.NewCursor(x, y)` |
312+| `tea.EnableBracketedPaste` | `view.DisableBracketedPasteMode = false` |
313+| `tea.DisableBracketedPaste` | `view.DisableBracketedPasteMode = true` |
314+| `tea.EnableReportFocus` | `view.ReportFocus = true` |
315+| `tea.DisableReportFocus` | `view.ReportFocus = false` |
316+| `tea.SetWindowTitle("...")` | `view.WindowTitle = "..."` |
317+
318+## Removed Program Methods
319+
320+These methods on `*Program` are gone.
321+
322+| Removed Method | Do This Instead |
323+|---|---|
324+| `p.Start()` | `p.Run()` |
325+| `p.StartReturningModel()` | `p.Run()` |
326+| `p.EnterAltScreen()` | `view.AltScreen = true` in `View()` |
327+| `p.ExitAltScreen()` | `view.AltScreen = false` in `View()` |
328+| `p.EnableMouseCellMotion()` | `view.MouseMode` in `View()` |
329+| `p.DisableMouseCellMotion()` | `view.MouseMode = tea.MouseModeNone` in `View()` |
330+| `p.EnableMouseAllMotion()` | `view.MouseMode` in `View()` |
331+| `p.DisableMouseAllMotion()` | `view.MouseMode = tea.MouseModeNone` in `View()` |
332+| `p.SetWindowTitle(...)` | `view.WindowTitle` in `View()` |
333+
334+## Renamed APIs
335+
336+| v1 | v2 | Notes |
337+|---|---|---|
338+| `tea.Sequentially(...)` | `tea.Sequence(...)` | `Sequentially` was already deprecated in v1 |
339+| `tea.WindowSize()` | `tea.RequestWindowSize` | Now returns `Msg` directly, not a `Cmd` |
340+
341+## New Program Options
342+
343+These are new in v2:
344+
345+| Option | What It Does |
346+|---|---|
347+| `tea.WithColorProfile(p)` | Force a specific color profile (great for testing) |
348+| `tea.WithWindowSize(w, h)` | Set initial terminal size (great for testing) |
349+
350+## Complete Before & After
351+
352+Here's a minimal but complete program showing the most common migration patterns side by side.
353+
354+**v1:**
355+
356+```go
357+package main
358+
359+import (
360+ "fmt"
361+ "os"
362+
363+ tea "github.com/charmbracelet/bubbletea"
364+)
365+
366+type model struct {
367+ count int
368+}
369+
370+func (m model) Init() tea.Cmd {
371+ return nil
372+}
373+
374+func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
375+ switch msg := msg.(type) {
376+ case tea.KeyMsg:
377+ switch msg.String() {
378+ case "q", "ctrl+c":
379+ return m, tea.Quit
380+ case " ":
381+ m.count++
382+ }
383+ case tea.MouseMsg:
384+ if msg.Action == tea.MouseActionPress && msg.Button == tea.MouseButtonLeft {
385+ m.count++
386+ }
387+ }
388+ return m, nil
389+}
390+
391+func (m model) View() string {
392+ return fmt.Sprintf("Count: %d\n\nSpace or click to increment. q to quit.\n", m.count)
393+}
394+
395+func main() {
396+ p := tea.NewProgram(model{}, tea.WithAltScreen(), tea.WithMouseCellMotion())
397+ if _, err := p.Run(); err != nil {
398+ fmt.Fprintln(os.Stderr, err)
399+ os.Exit(1)
400+ }
401+}
402+```
403+
404+**v2:**
405+
406+```go
407+package main
408+
409+import (
410+ "fmt"
411+ "os"
412+
413+ tea "charm.land/bubbletea/v2"
414+)
415+
416+type model struct {
417+ count int
418+}
419+
420+func (m model) Init() tea.Cmd {
421+ return nil
422+}
423+
424+func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
425+ switch msg := msg.(type) {
426+ case tea.KeyPressMsg:
427+ switch msg.String() {
428+ case "q", "ctrl+c":
429+ return m, tea.Quit
430+ case "space":
431+ m.count++
432+ }
433+ case tea.MouseClickMsg:
434+ if msg.Button == tea.MouseLeft {
435+ m.count++
436+ }
437+ }
438+ return m, nil
439+}
440+
441+func (m model) View() tea.View {
442+ v := tea.NewView(fmt.Sprintf("Count: %d\n\nSpace or click to increment. q to quit.\n", m.count))
443+ v.AltScreen = true
444+ v.MouseMode = tea.MouseModeCellMotion
445+ return v
446+}
447+
448+func main() {
449+ p := tea.NewProgram(model{})
450+ if _, err := p.Run(); err != nil {
451+ fmt.Fprintln(os.Stderr, err)
452+ os.Exit(1)
453+ }
454+}
455+```
456+
457+Notice how the `NewProgram` call got simpler? All the terminal feature flags moved into `View()` where they belong.
458+
459+## Quick Reference
460+
461+A flat old → new lookup table. Handy for search-and-replace and LLM-assisted migration.
462+
463+### Import Paths
464+
465+| v1 | v2 |
466+|---|---|
467+| `github.com/charmbracelet/bubbletea` | `charm.land/bubbletea/v2` |
468+| `github.com/charmbracelet/lipgloss` | `charm.land/lipgloss/v2` |
469+
470+### Model Interface
471+
472+| v1 | v2 |
473+|---|---|
474+| `View() string` | `View() tea.View` |
475+
476+### Key Events
477+
478+| v1 | v2 |
479+|---|---|
480+| `tea.KeyMsg` (struct) | `tea.KeyPressMsg` for presses, `tea.KeyMsg` (interface) for both |
481+| `msg.Type` | `msg.Code` |
482+| `msg.Runes` | `msg.Text` (string, not `[]rune`) |
483+| `msg.Alt` | `msg.Mod.Contains(tea.ModAlt)` |
484+| `tea.KeyRune` | check `len(msg.Text) > 0` |
485+| `tea.KeyCtrlC` | `msg.Code == 'c' && msg.Mod == tea.ModCtrl` or `msg.String() == "ctrl+c"` |
486+| `case " ":` (space) | `case "space":` |
487+
488+### Mouse Events
489+
490+| v1 | v2 |
491+|---|---|
492+| `tea.MouseMsg` (struct) | `tea.MouseMsg` (interface) — call `.Mouse()` for the data |
493+| `tea.MouseEvent` | `tea.Mouse` |
494+| `tea.MouseButtonLeft` | `tea.MouseLeft` |
495+| `tea.MouseButtonRight` | `tea.MouseRight` |
496+| `tea.MouseButtonMiddle` | `tea.MouseMiddle` |
497+| `tea.MouseButtonWheelUp` | `tea.MouseWheelUp` |
498+| `tea.MouseButtonWheelDown` | `tea.MouseWheelDown` |
499+| `msg.X`, `msg.Y` (direct) | `msg.Mouse().X`, `msg.Mouse().Y` |
500+
501+### Options → View Fields
502+
503+| v1 Option | v2 View Field |
504+|---|---|
505+| `tea.WithAltScreen()` | `view.AltScreen = true` |
506+| `tea.WithMouseCellMotion()` | `view.MouseMode = tea.MouseModeCellMotion` |
507+| `tea.WithMouseAllMotion()` | `view.MouseMode = tea.MouseModeAllMotion` |
508+| `tea.WithReportFocus()` | `view.ReportFocus = true` |
509+| `tea.WithoutBracketedPaste()` | `view.DisableBracketedPasteMode = true` |
510+
511+### Commands → View Fields
512+
513+| v1 Command | v2 View Field |
514+|---|---|
515+| `tea.EnterAltScreen` / `tea.ExitAltScreen` | `view.AltScreen = true/false` |
516+| `tea.EnableMouseCellMotion` | `view.MouseMode = tea.MouseModeCellMotion` |
517+| `tea.EnableMouseAllMotion` | `view.MouseMode = tea.MouseModeAllMotion` |
518+| `tea.DisableMouse` | `view.MouseMode = tea.MouseModeNone` |
519+| `tea.HideCursor` / `tea.ShowCursor` | `view.Cursor = nil` / `view.Cursor = &tea.Cursor{...}` |
520+| `tea.EnableBracketedPaste` / `tea.DisableBracketedPaste` | `view.DisableBracketedPasteMode = false/true` |
521+| `tea.EnableReportFocus` / `tea.DisableReportFocus` | `view.ReportFocus = true/false` |
522+| `tea.SetWindowTitle("...")` | `view.WindowTitle = "..."` |
523+
524+### Removed Options (No Replacement Needed)
525+
526+| v1 Option | What Happened |
527+|---|---|
528+| `tea.WithInputTTY()` | v2 always opens the TTY for input automatically |
529+| `tea.WithANSICompressor()` | The new renderer handles optimization automatically |
530+
531+### Removed Program Methods
532+
533+| v1 Method | v2 Replacement |
534+|---|---|
535+| `p.Start()` | `p.Run()` |
536+| `p.StartReturningModel()` | `p.Run()` |
537+| `p.EnterAltScreen()` | `view.AltScreen = true` in `View()` |
538+| `p.ExitAltScreen()` | `view.AltScreen = false` in `View()` |
539+| `p.EnableMouseCellMotion()` | `view.MouseMode` in `View()` |
540+| `p.DisableMouseCellMotion()` | `view.MouseMode = tea.MouseModeNone` in `View()` |
541+| `p.EnableMouseAllMotion()` | `view.MouseMode` in `View()` |
542+| `p.DisableMouseAllMotion()` | `view.MouseMode = tea.MouseModeNone` in `View()` |
543+| `p.SetWindowTitle(...)` | `view.WindowTitle` in `View()` |
544+
545+### Other Renames
546+
547+| v1 | v2 |
548+|---|---|
549+| `tea.Sequentially(...)` | `tea.Sequence(...)` |
550+| `tea.WindowSize()` | `tea.RequestWindowSize` (now returns `Msg`, not `Cmd`) |
551+
552+### New Program Options
553+
554+| Option | Description |
555+|---|---|
556+| `tea.WithColorProfile(p)` | Force a specific color profile |
557+| `tea.WithWindowSize(w, h)` | Set initial window size (great for testing) |
558+
559+## Feedback
560+
561+Have thoughts on the v2 upgrade? We'd _love_ to hear about it. Let us know on…
562+
563+- [Discord](https://charm.land/chat)
564+- [Matrix](https://charm.land/matrix)
565+- [Email](mailto:vt100@charm.land)
566+
567+---
568+
569+Part of [Charm](https://charm.land).
570+
571+<a href="https://charm.land/"><img alt="The Charm logo" src="https://stuff.charm.sh/charm-badge.jpg" width="400"></a>
572+
573+Charm热爱开源 • Charm loves open source • نحنُ نحب المصادر المفتوحة
vendor/charm.land/bubbletea/v2/clipboard.gonew file+70
@@ -0,0 +1,70 @@
1+package tea
2+
3+// ClipboardMsg is a clipboard read message event. This message is emitted when
4+// a terminal receives an OSC52 clipboard read message event.
5+type ClipboardMsg struct {
6+ Content string
7+ Selection byte
8+}
9+
10+// Clipboard returns the clipboard selection type. This will be one of the
11+// following values:
12+//
13+// - c: System clipboard.
14+// - p: Primary clipboard (X11/Wayland only).
15+func (e ClipboardMsg) Clipboard() byte {
16+ return e.Selection
17+}
18+
19+// String returns the string representation of the clipboard message.
20+func (e ClipboardMsg) String() string {
21+ return e.Content
22+}
23+
24+// setClipboardMsg is an internal message used to set the system clipboard
25+// using OSC52.
26+type setClipboardMsg string
27+
28+// SetClipboard produces a command that sets the system clipboard using OSC52.
29+// Note that OSC52 is not supported in all terminals.
30+func SetClipboard(s string) Cmd {
31+ return func() Msg {
32+ return setClipboardMsg(s)
33+ }
34+}
35+
36+// readClipboardMsg is an internal message used to read the system clipboard
37+// using OSC52.
38+type readClipboardMsg struct{}
39+
40+// ReadClipboard produces a command that reads the system clipboard using OSC52.
41+// Note that OSC52 is not supported in all terminals.
42+func ReadClipboard() Msg {
43+ return readClipboardMsg{}
44+}
45+
46+// setPrimaryClipboardMsg is an internal message used to set the primary
47+// clipboard using OSC52.
48+type setPrimaryClipboardMsg string
49+
50+// SetPrimaryClipboard produces a command that sets the primary clipboard using
51+// OSC52. Primary clipboard selection is a feature present in X11 and Wayland
52+// only.
53+// Note that OSC52 is not supported in all terminals.
54+func SetPrimaryClipboard(s string) Cmd {
55+ return func() Msg {
56+ return setPrimaryClipboardMsg(s)
57+ }
58+}
59+
60+// readPrimaryClipboardMsg is an internal message used to read the primary
61+// clipboard using OSC52.
62+type readPrimaryClipboardMsg struct{}
63+
64+// ReadPrimaryClipboard produces a command that reads the primary clipboard
65+// using OSC52. Primary clipboard selection is a feature present in X11 and
66+// Wayland only.
67+// Note that OSC52 is not supported in all terminals.
68+func ReadPrimaryClipboard() Msg {
69+ return readPrimaryClipboardMsg{}
70+}
vendor/charm.land/bubbletea/v2/color.gonew file+91
@@ -0,0 +1,91 @@
1+package tea
2+
3+import (
4+ "image/color"
5+
6+ uv "github.com/charmbracelet/ultraviolet"
7+)
8+
9+// backgroundColorMsg is a message that requests the terminal background color.
10+type backgroundColorMsg struct{}
11+
12+// RequestBackgroundColor is a command that requests the terminal background color.
13+func RequestBackgroundColor() Msg {
14+ return backgroundColorMsg{}
15+}
16+
17+// foregroundColorMsg is a message that requests the terminal foreground color.
18+type foregroundColorMsg struct{}
19+
20+// RequestForegroundColor is a command that requests the terminal foreground color.
21+func RequestForegroundColor() Msg {
22+ return foregroundColorMsg{}
23+}
24+
25+// cursorColorMsg is a message that requests the terminal cursor color.
26+type cursorColorMsg struct{}
27+
28+// RequestCursorColor is a command that requests the terminal cursor color.
29+func RequestCursorColor() Msg {
30+ return cursorColorMsg{}
31+}
32+
33+// ForegroundColorMsg represents a foreground color message. This message is
34+// emitted when the program requests the terminal foreground color with the
35+// [RequestForegroundColor] Cmd.
36+type ForegroundColorMsg struct{ color.Color }
37+
38+// String returns the hex representation of the color.
39+func (e ForegroundColorMsg) String() string {
40+ return uv.ForegroundColorEvent(e).String()
41+}
42+
43+// IsDark returns whether the color is dark.
44+func (e ForegroundColorMsg) IsDark() bool {
45+ return uv.ForegroundColorEvent(e).IsDark()
46+}
47+
48+// BackgroundColorMsg represents a background color message. This message is
49+// emitted when the program requests the terminal background color with the
50+// [RequestBackgroundColor] Cmd.
51+//
52+// This is commonly used in [Update.Init] to get the terminal background color
53+// for style definitions. For that you'll want to call
54+// [BackgroundColorMsg.IsDark] to determine if the color is dark or light. For
55+// example:
56+//
57+// func (m Model) Init() (Model, Cmd) {
58+// return m, RequestBackgroundColor()
59+// }
60+//
61+// func (m Model) Update(msg Msg) (Model, Cmd) {
62+// switch msg := msg.(type) {
63+// case BackgroundColorMsg:
64+// m.styles = newStyles(msg.IsDark())
65+// }
66+// }
67+type BackgroundColorMsg struct{ color.Color }
68+
69+// String returns the hex representation of the color.
70+func (e BackgroundColorMsg) String() string {
71+ return uv.BackgroundColorEvent(e).String()
72+}
73+
74+// IsDark returns whether the color is dark.
75+func (e BackgroundColorMsg) IsDark() bool {
76+ return uv.BackgroundColorEvent(e).IsDark()
77+}
78+
79+// CursorColorMsg represents a cursor color change message. This message is
80+// emitted when the program requests the terminal cursor color.
81+type CursorColorMsg struct{ color.Color }
82+
83+// String returns the hex representation of the color.
84+func (e CursorColorMsg) String() string {
85+ return uv.CursorColorEvent(e).String()
86+}
87+
88+// IsDark returns whether the color is dark.
89+func (e CursorColorMsg) IsDark() bool {
90+ return uv.CursorColorEvent(e).IsDark()
91+}
vendor/charm.land/bubbletea/v2/commands.gonew file+175
@@ -0,0 +1,175 @@
1+package tea
2+
3+import (
4+ "time"
5+)
6+
7+// Batch performs a bunch of commands concurrently with no ordering guarantees
8+// about the results. Use a Batch to return several commands.
9+//
10+// Example:
11+//
12+// func (m model) Init() (Model, Cmd) {
13+// return m, tea.Batch(someCommand, someOtherCommand)
14+// }
15+func Batch(cmds ...Cmd) Cmd {
16+ return compactCmds[BatchMsg](cmds)
17+}
18+
19+// BatchMsg is a message used to perform a bunch of commands concurrently with
20+// no ordering guarantees. You can send a BatchMsg with Batch.
21+type BatchMsg []Cmd
22+
23+// Sequence runs the given commands one at a time, in order. Contrast this with
24+// Batch, which runs commands concurrently.
25+func Sequence(cmds ...Cmd) Cmd {
26+ return compactCmds[sequenceMsg](cmds)
27+}
28+
29+// sequenceMsg is used internally to run the given commands in order.
30+type sequenceMsg []Cmd
31+
32+// compactCmds ignores any nil commands in cmds, and returns the most direct
33+// command possible. That is, considering the non-nil commands, if there are
34+// none it returns nil, if there is exactly one it returns that command
35+// directly, else it returns the non-nil commands as type T.
36+func compactCmds[T ~[]Cmd](cmds []Cmd) Cmd {
37+ var validCmds []Cmd
38+ for _, c := range cmds {
39+ if c == nil {
40+ continue
41+ }
42+ validCmds = append(validCmds, c)
43+ }
44+ switch len(validCmds) {
45+ case 0:
46+ return nil
47+ case 1:
48+ return validCmds[0]
49+ default:
50+ return func() Msg {
51+ return T(validCmds)
52+ }
53+ }
54+}
55+
56+// Every is a command that ticks in sync with the system clock. So, if you
57+// wanted to tick with the system clock every second, minute or hour you
58+// could use this. It's also handy for having different things tick in sync.
59+//
60+// Because we're ticking with the system clock the tick will likely not run for
61+// the entire specified duration. For example, if we're ticking for one minute
62+// and the clock is at 12:34:20 then the next tick will happen at 12:35:00, 40
63+// seconds later.
64+//
65+// To produce the command, pass a duration and a function which returns
66+// a message containing the time at which the tick occurred.
67+//
68+// type TickMsg time.Time
69+//
70+// cmd := Every(time.Second, func(t time.Time) Msg {
71+// return TickMsg(t)
72+// })
73+//
74+// Beginners' note: Every sends a single message and won't automatically
75+// dispatch messages at an interval. To do that, you'll want to return another
76+// Every command after receiving your tick message. For example:
77+//
78+// type TickMsg time.Time
79+//
80+// // Send a message every second.
81+// func tickEvery() Cmd {
82+// return Every(time.Second, func(t time.Time) Msg {
83+// return TickMsg(t)
84+// })
85+// }
86+//
87+// func (m model) Init() (Model, Cmd) {
88+// // Start ticking.
89+// return m, tickEvery()
90+// }
91+//
92+// func (m model) Update(msg Msg) (Model, Cmd) {
93+// switch msg.(type) {
94+// case TickMsg:
95+// // Return your Every command again to loop.
96+// return m, tickEvery()
97+// }
98+// return m, nil
99+// }
100+//
101+// Every is analogous to Tick in the Elm Architecture.
102+func Every(duration time.Duration, fn func(time.Time) Msg) Cmd {
103+ n := time.Now()
104+ d := n.Truncate(duration).Add(duration).Sub(n)
105+ t := time.NewTimer(d)
106+ return func() Msg {
107+ ts := <-t.C
108+ t.Stop()
109+ for len(t.C) > 0 {
110+ <-t.C
111+ }
112+ return fn(ts)
113+ }
114+}
115+
116+// Tick produces a command at an interval independent of the system clock at
117+// the given duration. That is, the timer begins precisely when invoked,
118+// and runs for its entire duration.
119+//
120+// To produce the command, pass a duration and a function which returns
121+// a message containing the time at which the tick occurred.
122+//
123+// type TickMsg time.Time
124+//
125+// cmd := Tick(time.Second, func(t time.Time) Msg {
126+// return TickMsg(t)
127+// })
128+//
129+// Beginners' note: Tick sends a single message and won't automatically
130+// dispatch messages at an interval. To do that, you'll want to return another
131+// Tick command after receiving your tick message. For example:
132+//
133+// type TickMsg time.Time
134+//
135+// func doTick() Cmd {
136+// return Tick(time.Second, func(t time.Time) Msg {
137+// return TickMsg(t)
138+// })
139+// }
140+//
141+// func (m model) Init() (Model, Cmd) {
142+// // Start ticking.
143+// return m, doTick()
144+// }
145+//
146+// func (m model) Update(msg Msg) (Model, Cmd) {
147+// switch msg.(type) {
148+// case TickMsg:
149+// // Return your Tick command again to loop.
150+// return m, doTick()
151+// }
152+// return m, nil
153+// }
154+func Tick(d time.Duration, fn func(time.Time) Msg) Cmd {
155+ t := time.NewTimer(d)
156+ return func() Msg {
157+ ts := <-t.C
158+ t.Stop()
159+ for len(t.C) > 0 {
160+ <-t.C
161+ }
162+ return fn(ts)
163+ }
164+}
165+
166+type windowSizeMsg struct{}
167+
168+// RequestWindowSize is a command that queries the terminal for its current
169+// size. It delivers the results to Update via a [WindowSizeMsg]. Keep in mind
170+// that WindowSizeMsgs will automatically be delivered to Update when the
171+// [Program] starts and when the window dimensions change so in many cases you
172+// will not need to explicitly invoke this command.
173+func RequestWindowSize() Msg {
174+ return windowSizeMsg{}
175+}
vendor/charm.land/bubbletea/v2/cursed_renderer.gonew file+860
@@ -0,0 +1,860 @@
1+package tea
2+
3+import (
4+ "bytes"
5+ "fmt"
6+ "image/color"
7+ "io"
8+ "runtime"
9+ "strings"
10+ "sync"
11+
12+ "github.com/charmbracelet/colorprofile"
13+ uv "github.com/charmbracelet/ultraviolet"
14+ "github.com/charmbracelet/x/ansi"
15+ "github.com/lucasb-eyer/go-colorful"
16+)
17+
18+type cursedRenderer struct {
19+ w io.Writer
20+ buf bytes.Buffer // updates buffer to be flushed to [w]
21+ scr *uv.TerminalRenderer
22+ cellbuf uv.ScreenBuffer
23+ lastView *View
24+ env []string
25+ term string // the terminal type $TERM
26+ width, height int
27+ mu sync.Mutex
28+ profile colorprofile.Profile
29+ logger uv.Logger
30+ view View
31+ hardTabs bool // whether to use hard tabs to optimize cursor movements
32+ backspace bool // whether to use backspace to optimize cursor movements
33+ mapnl bool
34+ syncdUpdates bool // whether to use synchronized output mode for updates
35+ starting bool // indicates whether the renderer is starting after being stopped
36+}
37+
38+var _ renderer = &cursedRenderer{}
39+
40+func newCursedRenderer(w io.Writer, env []string, width, height int) (s *cursedRenderer) {
41+ s = new(cursedRenderer)
42+ s.w = w
43+ s.env = env
44+ s.term = uv.Environ(env).Getenv("TERM")
45+ s.width, s.height = width, height // This needs to happen before [cursedRenderer.reset].
46+ s.cellbuf = uv.NewScreenBuffer(s.width, s.height)
47+ reset(s)
48+ return
49+}
50+
51+// setLogger sets the logger for the renderer.
52+func (s *cursedRenderer) setLogger(logger uv.Logger) {
53+ s.mu.Lock()
54+ s.logger = logger
55+ s.mu.Unlock()
56+}
57+
58+// setOptimizations sets the cursor movement optimizations.
59+func (s *cursedRenderer) setOptimizations(hardTabs, backspace, mapnl bool) {
60+ s.mu.Lock()
61+ s.hardTabs = hardTabs
62+ s.backspace = backspace
63+ s.mapnl = mapnl
64+ if s.hardTabs {
65+ s.scr.SetTabStops(s.width)
66+ } else {
67+ s.scr.SetTabStops(-1)
68+ }
69+ s.scr.SetBackspace(s.backspace)
70+ s.scr.SetMapNewline(s.mapnl)
71+ s.mu.Unlock()
72+}
73+
74+// start implements renderer.
75+func (s *cursedRenderer) start() {
76+ s.mu.Lock()
77+ defer s.mu.Unlock()
78+
79+ // Mark that we're starting. This is used to restore some state when
80+ // starting the renderer again after it was stopped.
81+ s.starting = true
82+
83+ if s.lastView == nil {
84+ return
85+ }
86+
87+ if s.lastView.AltScreen {
88+ enableAltScreen(s, true, true)
89+ }
90+ enableTextCursor(s, s.lastView.Cursor != nil)
91+ if s.lastView.Cursor != nil {
92+ if s.lastView.Cursor.Color != nil {
93+ col, ok := colorful.MakeColor(s.lastView.Cursor.Color)
94+ if ok {
95+ _, _ = s.scr.WriteString(ansi.SetCursorColor(col.Hex()))
96+ }
97+ }
98+ curStyle := encodeCursorStyle(s.lastView.Cursor.Shape, s.lastView.Cursor.Blink)
99+ if curStyle != 0 && curStyle != 1 {
100+ _, _ = s.scr.WriteString(ansi.SetCursorStyle(curStyle))
101+ }
102+ }
103+ if s.lastView.ForegroundColor != nil {
104+ col, ok := colorful.MakeColor(s.lastView.ForegroundColor)
105+ if ok {
106+ _, _ = s.scr.WriteString(ansi.SetForegroundColor(col.Hex()))
107+ }
108+ }
109+ if s.lastView.BackgroundColor != nil {
110+ col, ok := colorful.MakeColor(s.lastView.BackgroundColor)
111+ if ok {
112+ _, _ = s.scr.WriteString(ansi.SetBackgroundColor(col.Hex()))
113+ }
114+ }
115+ if !s.lastView.DisableBracketedPasteMode {
116+ _, _ = s.scr.WriteString(ansi.SetModeBracketedPaste)
117+ }
118+ if s.lastView.ReportFocus {
119+ _, _ = s.scr.WriteString(ansi.SetModeFocusEvent)
120+ }
121+ switch s.lastView.MouseMode {
122+ case MouseModeNone:
123+ case MouseModeCellMotion:
124+ _, _ = s.scr.WriteString(ansi.SetModeMouseButtonEvent + ansi.SetModeMouseExtSgr)
125+ case MouseModeAllMotion:
126+ _, _ = s.scr.WriteString(ansi.SetModeMouseAnyEvent + ansi.SetModeMouseExtSgr)
127+ }
128+ if s.lastView.WindowTitle != "" {
129+ _, _ = s.scr.WriteString(ansi.SetWindowTitle(s.lastView.WindowTitle))
130+ }
131+ if s.lastView.ProgressBar != nil {
132+ setProgressBar(s, s.lastView.ProgressBar)
133+ }
134+ // Enable modifyOtherKeys and Kitty keyboard protocol.
135+ // Both can coexist; terminals ignore what they don't support.
136+ _, _ = s.scr.WriteString(ansi.SetModifyOtherKeys2)
137+
138+ kittyFlags := keyboardEnhancementsFlags(s.lastView.KeyboardEnhancements)
139+ _, _ = s.scr.WriteString(ansi.KittyKeyboard(kittyFlags, 1))
140+}
141+
142+// close implements renderer.
143+func (s *cursedRenderer) close() (err error) {
144+ s.mu.Lock()
145+ defer s.mu.Unlock()
146+
147+ // Exit the altScreen and show cursor before closing. It's important that
148+ // we don't change the [cursedRenderer] altScreen and cursorHidden states
149+ // so that we can restore them when we start the renderer again. This is
150+ // used when the user suspends the program and then resumes it.
151+ if lv := s.lastView; lv != nil { //nolint:nestif
152+ // NOTE: The Kitty keyboard specs specify that the terminal should have
153+ // two registries for the main and alt screens. We disable keyboard
154+ // enhancements whenever we enter/exit alt screen mode in
155+ // [cursedRenderer.flush].
156+ // Here, we reset the keyboard protocol of the last screen used
157+ // assuming the other screen is already reset when we switched screens.
158+ _, _ = s.buf.WriteString(ansi.ResetModifyOtherKeys)
159+ _, _ = s.buf.WriteString(ansi.KittyKeyboard(0, 1))
160+
161+ // Go to the bottom of the screen.
162+ // We need to go to the bottom of the screen regardless of whether
163+ // we're in alt screen mode or not to avoid leaving the cursor in the
164+ // middle in terminals that don't support alt screen mode.
165+ s.scr.MoveTo(0, s.cellbuf.Height()-1)
166+ _ = s.scr.Flush() // we need to flush to write the cursor movement
167+ if lv.AltScreen {
168+ enableAltScreen(s, false, true)
169+ } else {
170+ _, _ = s.scr.WriteString(ansi.EraseScreenBelow)
171+ }
172+ if lv.Cursor == nil {
173+ enableTextCursor(s, true)
174+ }
175+ if !lv.DisableBracketedPasteMode {
176+ _, _ = s.scr.WriteString(ansi.ResetModeBracketedPaste)
177+ }
178+ if lv.ReportFocus {
179+ _, _ = s.scr.WriteString(ansi.ResetModeFocusEvent)
180+ }
181+ switch lv.MouseMode {
182+ case MouseModeNone:
183+ case MouseModeCellMotion, MouseModeAllMotion:
184+ _, _ = s.scr.WriteString(ansi.ResetModeMouseButtonEvent +
185+ ansi.ResetModeMouseAnyEvent +
186+ ansi.ResetModeMouseExtSgr)
187+ }
188+
189+ if lv.WindowTitle != "" {
190+ // Clear the window title if it was set.
191+ _, _ = s.scr.WriteString(ansi.SetWindowTitle(""))
192+ }
193+ if lc := lv.Cursor; lc != nil {
194+ curShape := encodeCursorStyle(lc.Shape, lc.Blink)
195+ if curShape != 0 && curShape != 1 {
196+ // Reset the cursor style to default if it was set to something other
197+ // blinking block.
198+ _, _ = s.scr.WriteString(ansi.SetCursorStyle(0))
199+ }
200+
201+ if lc.Color != nil {
202+ _, _ = s.scr.WriteString(ansi.ResetCursorColor)
203+ }
204+ }
205+
206+ if lv.BackgroundColor != nil {
207+ _, _ = s.scr.WriteString(ansi.ResetBackgroundColor)
208+ }
209+ if lv.ForegroundColor != nil {
210+ _, _ = s.scr.WriteString(ansi.ResetForegroundColor)
211+ }
212+ if lv.ProgressBar != nil && lv.ProgressBar.State != ProgressBarNone {
213+ _, _ = s.scr.WriteString(ansi.ResetProgressBar)
214+ }
215+ }
216+
217+ if s.cellbuf.Method == ansi.GraphemeWidth {
218+ // Make sure to turn off Unicode mode (2027)
219+ _, _ = s.scr.WriteString(ansi.ResetModeUnicodeCore)
220+ }
221+
222+ if err := s.scr.Flush(); err != nil {
223+ return fmt.Errorf("bubbletea: error closing screen writer: %w", err)
224+ }
225+
226+ if s.buf.Len() > 0 {
227+ if s.logger != nil {
228+ s.logger.Printf("output: %q", s.buf.String())
229+ }
230+ if _, err := io.Copy(s.w, &s.buf); err != nil {
231+ return fmt.Errorf("bubbletea: error writing to screen: %w", err)
232+ }
233+ s.buf.Reset()
234+ }
235+
236+ x, y := s.scr.Position()
237+
238+ // We want to clear the renderer state but not the cursor position. This is
239+ // because we might be putting the tea process in the background, run some
240+ // other process, and then return to the tea process. We want to keep the
241+ // cursor position so that we can continue where we left off.
242+ reset(s)
243+ s.scr.SetPosition(x, y)
244+
245+ return nil
246+}
247+
248+// writeString implements renderer.
249+func (s *cursedRenderer) writeString(str string) (int, error) {
250+ s.mu.Lock()
251+ defer s.mu.Unlock()
252+
253+ return s.scr.WriteString(str) //nolint:wrapcheck
254+}
255+
256+// flush implements renderer.
257+func (s *cursedRenderer) flush(closing bool) error {
258+ s.mu.Lock()
259+ defer s.mu.Unlock()
260+
261+ view := s.view
262+ frameArea := uv.Rect(0, 0, s.width, s.height)
263+ if len(view.Content) == 0 {
264+ // If the component is nil, we should clear the screen buffer.
265+ frameArea.Max.Y = 0
266+ }
267+
268+ content := uv.NewStyledString(view.Content)
269+ if !view.AltScreen {
270+ // We need to resizes the screen based on the frame height and
271+ // terminal width. This is because the frame height can change based on
272+ // the content of the frame. For example, if the frame contains a list
273+ // of items, the height of the frame will be the number of items in the
274+ // list. This is different from the alt screen buffer, which has a
275+ // fixed height and width.
276+ frameHeight := content.Height()
277+ if frameHeight != frameArea.Dy() {
278+ frameArea.Max.Y = frameHeight
279+ }
280+ }
281+
282+ // Restore tab stops if we have tab optimizations enabled.
283+ if s.starting && s.hardTabs {
284+ _, _ = s.scr.WriteString(ansi.SetTabEvery8Columns)
285+ }
286+
287+ if !s.starting && !closing && s.lastView != nil && viewEquals(s.lastView, &view) && frameArea == s.cellbuf.Bounds() {
288+ // No changes, nothing to do.
289+ return nil
290+ }
291+
292+ // We're no longer starting.
293+ s.starting = false
294+
295+ if frameArea != s.cellbuf.Bounds() {
296+ s.scr.Erase() // Force a full redraw to avoid artifacts.
297+
298+ // We need to reset the touched lines buffer to match the new height.
299+ s.cellbuf.Touched = nil
300+
301+ // Resize the screen buffer to match the frame area. This is necessary
302+ // to ensure that the screen buffer is the same size as the frame area
303+ // and to avoid rendering issues when the frame area is smaller than
304+ // the screen buffer.
305+ s.cellbuf.Resize(frameArea.Dx(), frameArea.Dy())
306+ }
307+
308+ // Clear our screen buffer before copying the new frame into it to ensure
309+ // we erase any old content.
310+ s.cellbuf.Clear()
311+ content.Draw(s.cellbuf, s.cellbuf.Bounds())
312+
313+ // If the frame height is greater than the screen height, we drop the
314+ // lines from the top of the buffer.
315+ if frameHeight := frameArea.Dy(); frameHeight > s.height {
316+ s.cellbuf.Lines = s.cellbuf.Lines[frameHeight-s.height:]
317+ }
318+
319+ // Alt screen mode.
320+ shouldUpdateAltScreen := (s.lastView == nil && view.AltScreen) || (s.lastView != nil && s.lastView.AltScreen != view.AltScreen)
321+ if shouldUpdateAltScreen {
322+ // We want to enter/exit altscreen mode but defer writing the actual
323+ // sequences until we flush the rest of the updates. This is because we
324+ // control the cursor visibility and we need to ensure that happens
325+ // after entering/exiting alt screen mode. Some terminals have
326+ // different cursor visibility states for main and alt screen modes and
327+ // this ensures we handle that correctly.
328+ enableAltScreen(s, view.AltScreen, false)
329+ }
330+
331+ // bracketed paste mode.
332+ if s.lastView == nil || view.DisableBracketedPasteMode != s.lastView.DisableBracketedPasteMode {
333+ if !view.DisableBracketedPasteMode {
334+ _, _ = s.scr.WriteString(ansi.SetModeBracketedPaste)
335+ } else if s.lastView != nil {
336+ _, _ = s.scr.WriteString(ansi.ResetModeBracketedPaste)
337+ }
338+ }
339+
340+ // report focus events mode.
341+ if s.lastView == nil || s.lastView.ReportFocus != view.ReportFocus {
342+ if view.ReportFocus {
343+ _, _ = s.scr.WriteString(ansi.SetModeFocusEvent)
344+ } else if s.lastView != nil {
345+ _, _ = s.scr.WriteString(ansi.ResetModeFocusEvent)
346+ }
347+ }
348+
349+ // mouse events mode.
350+ if s.lastView == nil || view.MouseMode != s.lastView.MouseMode {
351+ switch view.MouseMode {
352+ case MouseModeNone:
353+ if s.lastView != nil && s.lastView.MouseMode != MouseModeNone {
354+ _, _ = s.scr.WriteString(ansi.ResetModeMouseButtonEvent +
355+ ansi.ResetModeMouseAnyEvent +
356+ ansi.ResetModeMouseExtSgr)
357+ }
358+ case MouseModeCellMotion:
359+ if s.lastView != nil && s.lastView.MouseMode == MouseModeAllMotion {
360+ _, _ = s.scr.WriteString(ansi.ResetModeMouseAnyEvent)
361+ }
362+ _, _ = s.scr.WriteString(ansi.SetModeMouseButtonEvent + ansi.SetModeMouseExtSgr)
363+ case MouseModeAllMotion:
364+ if s.lastView != nil && s.lastView.MouseMode == MouseModeCellMotion {
365+ _, _ = s.scr.WriteString(ansi.ResetModeMouseButtonEvent)
366+ }
367+ _, _ = s.scr.WriteString(ansi.SetModeMouseAnyEvent + ansi.SetModeMouseExtSgr)
368+ }
369+ }
370+
371+ // Set window title.
372+ if s.lastView == nil || view.WindowTitle != s.lastView.WindowTitle {
373+ if s.lastView != nil || view.WindowTitle != "" {
374+ _, _ = s.scr.WriteString(ansi.SetWindowTitle(view.WindowTitle))
375+ }
376+ }
377+
378+ // kitty keyboard protocol
379+ if s.lastView == nil || view.KeyboardEnhancements != s.lastView.KeyboardEnhancements ||
380+ view.AltScreen != s.lastView.AltScreen {
381+ // NOTE: We need to reset the keyboard protocol when switching
382+ // between main and alt screen. This is because the specs specify
383+ // two different states for the main and alt screen.
384+
385+ // Enable modifyOtherKeys and Kitty keyboard protocol.
386+ _, _ = s.scr.WriteString(ansi.SetModifyOtherKeys2)
387+
388+ kittyFlags := keyboardEnhancementsFlags(view.KeyboardEnhancements)
389+ _, _ = s.scr.WriteString(ansi.KittyKeyboard(kittyFlags, 1))
390+ if !closing {
391+ // Request keyboard enhancements when they change
392+ _, _ = s.scr.WriteString(ansi.RequestKittyKeyboard)
393+ }
394+ }
395+
396+ // Set terminal colors.
397+ var (
398+ cc, lcc color.Color
399+ lfg, lbg color.Color
400+ )
401+ if view.Cursor != nil {
402+ cc = view.Cursor.Color
403+ }
404+ if s.lastView != nil {
405+ if s.lastView.Cursor != nil {
406+ lcc = s.lastView.Cursor.Color
407+ }
408+ lfg = s.lastView.ForegroundColor
409+ lbg = s.lastView.BackgroundColor
410+ }
411+ for _, c := range []struct {
412+ newColor color.Color
413+ oldColor color.Color
414+ reset string
415+ setter func(string) string
416+ }{
417+ {newColor: cc, oldColor: lcc, reset: ansi.ResetCursorColor, setter: ansi.SetCursorColor},
418+ {newColor: view.ForegroundColor, oldColor: lfg, reset: ansi.ResetForegroundColor, setter: ansi.SetForegroundColor},
419+ {newColor: view.BackgroundColor, oldColor: lbg, reset: ansi.ResetBackgroundColor, setter: ansi.SetBackgroundColor},
420+ } {
421+ if c.newColor != c.oldColor {
422+ if c.newColor == nil {
423+ // Reset the color if it was set to nil.
424+ _, _ = s.scr.WriteString(c.reset)
425+ } else {
426+ // Set the color.
427+ col, ok := colorful.MakeColor(c.newColor)
428+ if ok {
429+ _, _ = s.scr.WriteString(c.setter(col.Hex()))
430+ }
431+ }
432+ }
433+ }
434+
435+ // Set cursor shape and blink if set.
436+ var ccStyle, lcStyle int
437+ var lcur *Cursor
438+ ccur := view.Cursor
439+ if lv := s.lastView; lv != nil {
440+ lcur = lv.Cursor
441+ }
442+ if ccur != nil {
443+ ccStyle = encodeCursorStyle(ccur.Shape, ccur.Blink)
444+ }
445+ if lcur != nil {
446+ lcStyle = encodeCursorStyle(lcur.Shape, lcur.Blink)
447+ }
448+ if ccStyle != lcStyle {
449+ _, _ = s.scr.WriteString(ansi.SetCursorStyle(ccStyle))
450+ }
451+
452+ // Render progress bar if it's changed.
453+ if (s.lastView == nil && view.ProgressBar != nil && view.ProgressBar.State != ProgressBarNone) ||
454+ (s.lastView != nil && (s.lastView.ProgressBar == nil) != (view.ProgressBar == nil)) ||
455+ (s.lastView != nil && s.lastView.ProgressBar != nil && view.ProgressBar != nil && *s.lastView.ProgressBar != *view.ProgressBar) {
456+ // Render or clear the progress bar if it was added or removed.
457+ setProgressBar(s, view.ProgressBar)
458+ }
459+
460+ // Render and queue changes to the screen buffer.
461+ s.scr.Render(s.cellbuf.RenderBuffer)
462+
463+ if cur := view.Cursor; cur != nil {
464+ // MoveTo must come after [uv.TerminalRenderer.Render] because the
465+ // cursor position might get updated during rendering.
466+ s.scr.MoveTo(view.Cursor.X, view.Cursor.Y)
467+ } else if !view.AltScreen {
468+ // We don't want the cursor to be dangling at the end of the line in
469+ // inline mode because it can cause unwanted line wraps in some
470+ // terminals. So we move it to the beginning of the next line if
471+ // necessary.
472+ // This is only needed when the cursor is hidden because when it's
473+ // visible, we already set its position above.
474+ x, y := s.scr.Position()
475+ if x >= s.width-1 {
476+ s.scr.MoveTo(0, y)
477+ }
478+ }
479+
480+ if err := s.scr.Flush(); err != nil {
481+ return fmt.Errorf("bubbletea: error flushing screen writer: %w", err)
482+ }
483+
484+ // Check if we have any render updates to flush.
485+ hasUpdates := s.buf.Len() > 0
486+
487+ // Cursor visibility.
488+ didShowCursor := s.lastView != nil && s.lastView.Cursor != nil
489+ showCursor := view.Cursor != nil
490+ hideCursor := !showCursor
491+ shouldUpdateCursorVis := (s.lastView == nil || didShowCursor != showCursor) || shouldUpdateAltScreen
492+
493+ // Build final output buffer with synchronized output or hide/show cursor
494+ // updates. But first, enter/exit alt screen mode if needed.
495+ //
496+ // Here, we have two scenarios:
497+ // 1. Synchronized output updates are supported. In this case, we want to
498+ // wrap all updates, unless it's just a cursor visibility change, in
499+ // synchronized output mode. This is because synchronized output mode
500+ // takes care of rendering the updates atomically. In the case of
501+ // just a cursor visibility change, we don't need to enter
502+ // synchronized output mode because it's just a single sequence to
503+ // flush out to the terminal.
504+ //
505+ // 2. We don't have synchronized output updates support. In this case, and
506+ // if the cursor is visible or should be visible, we wrap the updates
507+ // with hide/show cursor sequences to try and mitigate cursor
508+ // flickering. This is terminal dependent and may still result in
509+ // flickering in some terminals. It's the best effort we can do instead
510+ // of showing the cursor flying around the screen during updates.
511+
512+ var buf bytes.Buffer
513+ if shouldUpdateAltScreen {
514+ // We always disable keyboard enhancements when switching screens
515+ // because the terminal is expected to have two different keyboard
516+ // registries for main and alt screens.
517+ _, _ = buf.WriteString(ansi.ResetModifyOtherKeys)
518+ _, _ = buf.WriteString(ansi.KittyKeyboard(0, 1))
519+ if view.AltScreen {
520+ // Entering alt screen mode.
521+ buf.WriteString(ansi.SetModeAltScreenSaveCursor)
522+ } else {
523+ // Exiting alt screen mode.
524+ buf.WriteString(ansi.ResetModeAltScreenSaveCursor)
525+ }
526+ }
527+
528+ if s.syncdUpdates {
529+ if hasUpdates {
530+ // We have synchronized output updates enabled.
531+ buf.WriteString(ansi.SetModeSynchronizedOutput)
532+ }
533+ if shouldUpdateCursorVis && hideCursor {
534+ // Do we need to update the cursor visibility to hidden? If so, do
535+ // it here before writing any updates to the buffer.
536+ _, _ = buf.WriteString(ansi.ResetModeTextCursorEnable)
537+ }
538+ } else if (shouldUpdateCursorVis && hideCursor) || (hasUpdates && showCursor && didShowCursor) {
539+ _, _ = buf.WriteString(ansi.ResetModeTextCursorEnable)
540+ }
541+
542+ if hasUpdates {
543+ buf.Write(s.buf.Bytes())
544+ }
545+
546+ if s.syncdUpdates {
547+ if shouldUpdateCursorVis && showCursor {
548+ // Do we need to update the cursor visibility to visible? If so, do
549+ // it here after writing any updates to the buffer.
550+ _, _ = buf.WriteString(ansi.SetModeTextCursorEnable)
551+ }
552+ if hasUpdates {
553+ // Close synchronized output mode.
554+ buf.WriteString(ansi.ResetModeSynchronizedOutput)
555+ }
556+ } else if (shouldUpdateCursorVis && showCursor) || (hasUpdates && showCursor && didShowCursor) {
557+ _, _ = buf.WriteString(ansi.SetModeTextCursorEnable)
558+ }
559+
560+ // Reset internal screen renderer buffer.
561+ s.buf.Reset()
562+
563+ // If our updates flush buffer has content, write it to the output writer.
564+ if buf.Len() > 0 {
565+ if s.logger != nil {
566+ s.logger.Printf("output: %q", buf.String())
567+ }
568+ if _, err := io.Copy(s.w, &buf); err != nil {
569+ return fmt.Errorf("bubbletea: error flushing update to the writer: %w", err)
570+ }
571+ }
572+
573+ s.lastView = &view
574+
575+ return nil
576+}
577+
578+// render implements renderer.
579+func (s *cursedRenderer) render(v View) {
580+ s.mu.Lock()
581+ defer s.mu.Unlock()
582+
583+ s.view = v
584+}
585+
586+// reset implements renderer.
587+func (s *cursedRenderer) reset() {
588+ s.mu.Lock()
589+ reset(s)
590+ s.mu.Unlock()
591+}
592+
593+func reset(s *cursedRenderer) {
594+ s.buf.Reset()
595+ scr := uv.NewTerminalRenderer(&s.buf, s.env)
596+ scr.SetColorProfile(s.profile)
597+ scr.SetRelativeCursor(true) // Always start in inline mode
598+ scr.SetFullscreen(false) // Always start in inline mode
599+ if s.hardTabs {
600+ scr.SetTabStops(s.width)
601+ } else {
602+ scr.SetTabStops(-1)
603+ }
604+ scr.SetBackspace(s.backspace)
605+ scr.SetMapNewline(s.mapnl)
606+ scr.SetScrollOptim(runtime.GOOS != "windows") // disable scroll optimization on Windows due to bugs in some terminals
607+ s.scr = scr
608+}
609+
610+// setColorProfile implements renderer.
611+func (s *cursedRenderer) setColorProfile(p colorprofile.Profile) {
612+ s.mu.Lock()
613+ s.profile = p
614+ s.scr.SetColorProfile(p)
615+ s.mu.Unlock()
616+}
617+
618+// resize implements renderer.
619+func (s *cursedRenderer) resize(w, h int) {
620+ s.mu.Lock()
621+ // We need to mark the screen for clear to force a redraw. However, we
622+ // only do so if we're using alt screen or the width has changed.
623+ // That's because redrawing is expensive and we can avoid it if the
624+ // width hasn't changed in inline mode. On the other hand, when using
625+ // alt screen mode, we always want to redraw because some terminals
626+ // would scroll the screen and our content would be lost.
627+ s.scr.Erase()
628+ s.width, s.height = w, h
629+ s.scr.Resize(s.width, s.height)
630+ s.mu.Unlock()
631+}
632+
633+// clearScreen implements renderer.
634+func (s *cursedRenderer) clearScreen() {
635+ s.mu.Lock()
636+ // Move the cursor to the top left corner of the screen and trigger a full
637+ // screen redraw.
638+ s.scr.MoveTo(0, 0)
639+ s.scr.Erase()
640+ s.mu.Unlock()
641+}
642+
643+// enableAltScreen sets the alt screen mode.
644+// Note that this writes to the buffer directly if write is true.
645+func enableAltScreen(s *cursedRenderer, enable bool, write bool) {
646+ if enable {
647+ enterAltScreen(s, write)
648+ } else {
649+ exitAltScreen(s, write)
650+ }
651+}
652+
653+func enterAltScreen(s *cursedRenderer, write bool) {
654+ s.scr.SaveCursor()
655+ if write {
656+ s.buf.WriteString(ansi.SetModeAltScreenSaveCursor)
657+ }
658+ s.scr.SetFullscreen(true)
659+ s.scr.SetRelativeCursor(false)
660+ s.scr.Erase()
661+}
662+
663+func exitAltScreen(s *cursedRenderer, write bool) {
664+ s.scr.Erase()
665+ s.scr.SetRelativeCursor(true)
666+ s.scr.SetFullscreen(false)
667+ if write {
668+ s.buf.WriteString(ansi.ResetModeAltScreenSaveCursor)
669+ }
670+ s.scr.RestoreCursor()
671+}
672+
673+// enableTextCursor sets the text cursor mode.
674+func enableTextCursor(s *cursedRenderer, enable bool) {
675+ if enable {
676+ _, _ = s.scr.WriteString(ansi.SetModeTextCursorEnable)
677+ } else {
678+ _, _ = s.scr.WriteString(ansi.ResetModeTextCursorEnable)
679+ }
680+}
681+
682+// setSyncdUpdates implements renderer.
683+func (s *cursedRenderer) setSyncdUpdates(syncd bool) {
684+ s.mu.Lock()
685+ s.syncdUpdates = syncd
686+ s.mu.Unlock()
687+}
688+
689+// setWidthMethod implements renderer.
690+func (s *cursedRenderer) setWidthMethod(method ansi.Method) {
691+ s.mu.Lock()
692+ if method == ansi.GraphemeWidth {
693+ // Turn on Unicode mode (2027) for accurate grapheme width calculation.
694+ // This is needed for proper rendering of wide characters and emojis.
695+ _, _ = s.scr.WriteString(ansi.SetModeUnicodeCore)
696+ } else if s.cellbuf.Method == ansi.GraphemeWidth {
697+ // Turn off Unicode mode if we're switching away from grapheme width
698+ // calculation to avoid issues with some terminals that might still be
699+ // in Unicode mode and render characters incorrectly.
700+ _, _ = s.scr.WriteString(ansi.ResetModeUnicodeCore)
701+ }
702+ s.cellbuf.Method = method
703+ s.mu.Unlock()
704+}
705+
706+// insertAbove implements renderer.
707+func (s *cursedRenderer) insertAbove(str string) error {
708+ s.mu.Lock()
709+ defer s.mu.Unlock()
710+
711+ if len(str) == 0 {
712+ return nil
713+ }
714+
715+ var sb strings.Builder
716+ w, h := s.cellbuf.Width(), s.cellbuf.Height()
717+ _, y := s.scr.Position()
718+
719+ // We need to scroll the screen up by the number of lines in the queue.
720+ sb.WriteByte('\r')
721+ down := h - y - 1
722+ if down > 0 {
723+ sb.WriteString(ansi.CursorDown(down))
724+ }
725+
726+ lines := strings.Split(str, "\n")
727+ offset := len(lines)
728+ for _, line := range lines {
729+ lineWidth := ansi.StringWidth(line)
730+ if w > 0 && lineWidth > w {
731+ offset += (lineWidth / w)
732+ }
733+ }
734+
735+ // Scroll the screen up by the offset to make room for the new lines.
736+ sb.WriteString(strings.Repeat("\n", offset))
737+
738+ // XXX: Now go to the top of the screen, insert new lines, and write
739+ // the queued strings. It is important to use [Screen.moveCursor]
740+ // instead of [Screen.move] because we don't want to perform any checks
741+ // on the cursor position.
742+ up := offset + h - 1
743+ sb.WriteString(ansi.CursorUp(up))
744+ sb.WriteString(ansi.InsertLine(offset))
745+ for _, line := range lines {
746+ sb.WriteString(line)
747+ sb.WriteString(ansi.EraseLineRight)
748+ sb.WriteString("\r\n")
749+ }
750+
751+ s.scr.SetPosition(0, 0)
752+
753+ if s.logger != nil {
754+ s.logger.Printf("insert above: %q", sb.String())
755+ }
756+
757+ _, err := io.WriteString(s.w, sb.String())
758+ if err != nil {
759+ return fmt.Errorf("bubbletea: error writing insert above to the writer: %w", err)
760+ }
761+
762+ return nil
763+}
764+
765+// onMouse implements renderer.
766+func (s *cursedRenderer) onMouse(m MouseMsg) Cmd {
767+ var onMouse func(MouseMsg) Cmd
768+ s.mu.Lock()
769+ if s.lastView != nil {
770+ onMouse = s.lastView.OnMouse
771+ }
772+ s.mu.Unlock()
773+ if onMouse != nil {
774+ return onMouse(m)
775+ }
776+ return nil
777+}
778+
779+func setProgressBar(s *cursedRenderer, pb *ProgressBar) {
780+ if pb == nil {
781+ _, _ = s.scr.WriteString(ansi.ResetProgressBar)
782+ return
783+ }
784+
785+ var seq string
786+ switch pb.State {
787+ case ProgressBarNone:
788+ seq = ansi.ResetProgressBar
789+ case ProgressBarDefault:
790+ seq = ansi.SetProgressBar(pb.Value)
791+ case ProgressBarError:
792+ seq = ansi.SetErrorProgressBar(pb.Value)
793+ case ProgressBarIndeterminate:
794+ seq = ansi.SetIndeterminateProgressBar
795+ case ProgressBarWarning:
796+ seq = ansi.SetWarningProgressBar(pb.Value)
797+ }
798+ if seq != "" {
799+ _, _ = s.scr.WriteString(seq)
800+ }
801+}
802+
803+func viewEquals(a, b *View) bool {
804+ if a == nil || b == nil {
805+ return false
806+ }
807+
808+ if a.Content != b.Content ||
809+ a.AltScreen != b.AltScreen ||
810+ a.DisableBracketedPasteMode != b.DisableBracketedPasteMode ||
811+ a.ReportFocus != b.ReportFocus ||
812+ a.MouseMode != b.MouseMode ||
813+ a.WindowTitle != b.WindowTitle ||
814+ a.ForegroundColor != b.ForegroundColor ||
815+ a.BackgroundColor != b.BackgroundColor ||
816+ a.KeyboardEnhancements != b.KeyboardEnhancements {
817+ return false
818+ }
819+
820+ if (a.Cursor == nil) != (b.Cursor == nil) {
821+ return false
822+ }
823+ if a.Cursor != nil && b.Cursor != nil {
824+ if a.Cursor.X != b.Cursor.X ||
825+ a.Cursor.Y != b.Cursor.Y ||
826+ a.Cursor.Shape != b.Cursor.Shape ||
827+ a.Cursor.Blink != b.Cursor.Blink ||
828+ a.Cursor.Color != b.Cursor.Color {
829+ return false
830+ }
831+ }
832+
833+ if (a.ProgressBar == nil) != (b.ProgressBar == nil) {
834+ return false
835+ }
836+ if a.ProgressBar != nil && b.ProgressBar != nil {
837+ if *a.ProgressBar != *b.ProgressBar {
838+ return false
839+ }
840+ }
841+
842+ return true
843+}
844+
845+func keyboardEnhancementsFlags(ke KeyboardEnhancements) int {
846+ flags := 1 // always enable basic key disambiguation
847+ if ke.ReportEventTypes {
848+ flags |= ansi.KittyReportEventTypes
849+ }
850+ if ke.ReportAlternateKeys {
851+ flags |= ansi.KittyReportAlternateKeys
852+ }
853+ if ke.ReportAllKeysAsEscapeCodes {
854+ flags |= ansi.KittyReportAllKeysAsEscapeCodes
855+ }
856+ if ke.ReportAssociatedText {
857+ flags |= ansi.KittyReportAssociatedKeys
858+ }
859+ return flags
860+}
vendor/charm.land/bubbletea/v2/cursor.gonew file+28
@@ -0,0 +1,28 @@
1+package tea
2+
3+// Position represents a position in the terminal.
4+type Position struct{ X, Y int }
5+
6+// CursorPositionMsg is a message that represents the terminal cursor position.
7+type CursorPositionMsg struct {
8+ X, Y int
9+}
10+
11+// CursorShape represents a terminal cursor shape.
12+type CursorShape int
13+
14+// Cursor shapes.
15+const (
16+ CursorBlock CursorShape = iota
17+ CursorUnderline
18+ CursorBar
19+)
20+
21+// requestCursorPosMsg is a message that requests the cursor position.
22+type requestCursorPosMsg struct{}
23+
24+// RequestCursorPosition is a command that requests the cursor position.
25+// The cursor position will be sent as a [CursorPositionMsg] message.
26+func RequestCursorPosition() Msg {
27+ return requestCursorPosMsg{}
28+}
vendor/charm.land/bubbletea/v2/environ.gonew file+34
@@ -0,0 +1,34 @@
1+package tea
2+
3+import uv "github.com/charmbracelet/ultraviolet"
4+
5+// EnvMsg is a message that represents the environment variables of the
6+// program. This is useful for getting the environment variables of programs
7+// running in a remote session like SSH. In that case, using [os.Getenv] would
8+// return the server's environment variables, not the client's.
9+//
10+// This message is sent to the program when it starts.
11+//
12+// Example:
13+//
14+// switch msg := msg.(type) {
15+// case EnvMsg:
16+// // What terminal type is being used?
17+// term := msg.Getenv("TERM")
18+// }
19+type EnvMsg uv.Environ
20+
21+// Getenv returns the value of the environment variable named by the key. If
22+// the variable is not present in the environment, the value returned will be
23+// the empty string.
24+func (msg EnvMsg) Getenv(key string) (v string) {
25+ return uv.Environ(msg).Getenv(key)
26+}
27+
28+// LookupEnv retrieves the value of the environment variable named by the key.
29+// If the variable is present in the environment the value (which may be empty)
30+// is returned and the boolean is true. Otherwise the returned value will be
31+// empty and the boolean will be false.
32+func (msg EnvMsg) LookupEnv(key string) (s string, v bool) {
33+ return uv.Environ(msg).LookupEnv(key)
34+}
vendor/charm.land/bubbletea/v2/exec.gonew file+129
@@ -0,0 +1,129 @@
1+package tea
2+
3+import (
4+ "io"
5+ "os"
6+ "os/exec"
7+)
8+
9+// execMsg is used internally to run an ExecCommand sent with Exec.
10+type execMsg struct {
11+ cmd ExecCommand
12+ fn ExecCallback
13+}
14+
15+// Exec is used to perform arbitrary I/O in a blocking fashion, effectively
16+// pausing the Program while execution is running and resuming it when
17+// execution has completed.
18+//
19+// Most of the time you'll want to use ExecProcess, which runs an exec.Cmd.
20+//
21+// For non-interactive i/o you should use a Cmd (that is, a tea.Cmd).
22+func Exec(c ExecCommand, fn ExecCallback) Cmd {
23+ return func() Msg {
24+ return execMsg{cmd: c, fn: fn}
25+ }
26+}
27+
28+// ExecProcess runs the given *exec.Cmd in a blocking fashion, effectively
29+// pausing the Program while the command is running. After the *exec.Cmd exists
30+// the Program resumes. It's useful for spawning other interactive applications
31+// such as editors and shells from within a Program.
32+//
33+// To produce the command, pass an *exec.Cmd and a function which returns
34+// a message containing the error which may have occurred when running the
35+// ExecCommand.
36+//
37+// type VimFinishedMsg struct { err error }
38+//
39+// c := exec.Command("vim", "file.txt")
40+//
41+// cmd := ExecProcess(c, func(err error) Msg {
42+// return VimFinishedMsg{err: err}
43+// })
44+//
45+// Or, if you don't care about errors, you could simply:
46+//
47+// cmd := ExecProcess(exec.Command("vim", "file.txt"), nil)
48+//
49+// For non-interactive i/o you should use a Cmd (that is, a tea.Cmd).
50+func ExecProcess(c *exec.Cmd, fn ExecCallback) Cmd {
51+ return Exec(wrapExecCommand(c), fn)
52+}
53+
54+// ExecCallback is used when executing an *exec.Command to return a message
55+// with an error, which may or may not be nil.
56+type ExecCallback func(error) Msg
57+
58+// ExecCommand can be implemented to execute things in a blocking fashion in
59+// the current terminal.
60+type ExecCommand interface {
61+ Run() error
62+ SetStdin(io.Reader)
63+ SetStdout(io.Writer)
64+ SetStderr(io.Writer)
65+}
66+
67+// wrapExecCommand wraps an exec.Cmd so that it satisfies the ExecCommand
68+// interface so it can be used with Exec.
69+func wrapExecCommand(c *exec.Cmd) ExecCommand {
70+ return &osExecCommand{Cmd: c}
71+}
72+
73+// osExecCommand is a layer over an exec.Cmd that satisfies the ExecCommand
74+// interface.
75+type osExecCommand struct{ *exec.Cmd }
76+
77+// SetStdin sets stdin on underlying exec.Cmd to the given io.Reader.
78+func (c *osExecCommand) SetStdin(r io.Reader) {
79+ // If unset, have the command use the same input as the terminal.
80+ if c.Stdin == nil {
81+ c.Stdin = r
82+ }
83+}
84+
85+// SetStdout sets stdout on underlying exec.Cmd to the given io.Writer.
86+func (c *osExecCommand) SetStdout(w io.Writer) {
87+ // If unset, have the command use the same output as the terminal.
88+ if c.Stdout == nil {
89+ c.Stdout = w
90+ }
91+}
92+
93+// SetStderr sets stderr on the underlying exec.Cmd to the given io.Writer.
94+func (c *osExecCommand) SetStderr(w io.Writer) {
95+ // If unset, use stderr for the command's stderr
96+ if c.Stderr == nil {
97+ c.Stderr = w
98+ }
99+}
100+
101+// exec runs an ExecCommand and delivers the results to the program as a Msg.
102+func (p *Program) exec(c ExecCommand, fn ExecCallback) {
103+ if err := p.releaseTerminal(false); err != nil {
104+ // If we can't release input, abort.
105+ if fn != nil {
106+ go p.Send(fn(err))
107+ }
108+ return
109+ }
110+
111+ c.SetStdin(p.input)
112+ c.SetStdout(p.output)
113+ c.SetStderr(os.Stderr)
114+
115+ // Execute system command.
116+ if err := c.Run(); err != nil {
117+ _ = p.RestoreTerminal() // also try to restore the terminal.
118+ if fn != nil {
119+ go p.Send(fn(err))
120+ }
121+ return
122+ }
123+
124+ // Have the program re-capture input.
125+ err := p.RestoreTerminal()
126+ if fn != nil {
127+ go p.Send(fn(err))
128+ }
129+}
vendor/charm.land/bubbletea/v2/focus.gonew file+9
@@ -0,0 +1,9 @@
1+package tea
2+
3+// FocusMsg represents a terminal focus message.
4+// This occurs when the terminal gains focus.
5+type FocusMsg struct{}
6+
7+// BlurMsg represents a terminal blur message.
8+// This occurs when the terminal loses focus.
9+type BlurMsg struct{}
vendor/charm.land/bubbletea/v2/input.gonew file+54
@@ -0,0 +1,54 @@
1+package tea
2+
3+import (
4+ uv "github.com/charmbracelet/ultraviolet"
5+)
6+
7+// translateInputEvent translates an input event into a Bubble Tea Msg.
8+func (p *Program) translateInputEvent(e uv.Event) Msg {
9+ switch e := e.(type) {
10+ case uv.ClipboardEvent:
11+ return ClipboardMsg(e)
12+ case uv.ForegroundColorEvent:
13+ return ForegroundColorMsg(e)
14+ case uv.BackgroundColorEvent:
15+ return BackgroundColorMsg(e)
16+ case uv.CursorColorEvent:
17+ return CursorColorMsg(e)
18+ case uv.CursorPositionEvent:
19+ return CursorPositionMsg(e)
20+ case uv.FocusEvent:
21+ return FocusMsg(e)
22+ case uv.BlurEvent:
23+ return BlurMsg(e)
24+ case uv.KeyPressEvent:
25+ return KeyPressMsg(e)
26+ case uv.KeyReleaseEvent:
27+ return KeyReleaseMsg(e)
28+ case uv.MouseClickEvent:
29+ return MouseClickMsg(e)
30+ case uv.MouseMotionEvent:
31+ return MouseMotionMsg(e)
32+ case uv.MouseReleaseEvent:
33+ return MouseReleaseMsg(e)
34+ case uv.MouseWheelEvent:
35+ return MouseWheelMsg(e)
36+ case uv.PasteEvent:
37+ return PasteMsg(e)
38+ case uv.PasteStartEvent:
39+ return PasteStartMsg(e)
40+ case uv.PasteEndEvent:
41+ return PasteEndMsg(e)
42+ case uv.WindowSizeEvent:
43+ return WindowSizeMsg(e)
44+ case uv.CapabilityEvent:
45+ return CapabilityMsg(e)
46+ case uv.TerminalVersionEvent:
47+ return TerminalVersionMsg(e)
48+ case uv.KeyboardEnhancementsEvent:
49+ return KeyboardEnhancementsMsg(e)
50+ case uv.ModeReportEvent:
51+ return ModeReportMsg(e)
52+ }
53+ return e
54+}
vendor/charm.land/bubbletea/v2/key.gonew file+371
@@ -0,0 +1,371 @@
1+package tea
2+
3+import (
4+ "fmt"
5+
6+ uv "github.com/charmbracelet/ultraviolet"
7+)
8+
9+const (
10+ // KeyExtended is a special key code used to signify that a key event
11+ // contains multiple runes.
12+ KeyExtended = uv.KeyExtended
13+)
14+
15+// Special key symbols.
16+const (
17+
18+ // Special keys.
19+
20+ KeyUp = uv.KeyUp
21+ KeyDown = uv.KeyDown
22+ KeyRight = uv.KeyRight
23+ KeyLeft = uv.KeyLeft
24+ KeyBegin = uv.KeyBegin
25+ KeyFind = uv.KeyFind
26+ KeyInsert = uv.KeyInsert
27+ KeyDelete = uv.KeyDelete
28+ KeySelect = uv.KeySelect
29+ KeyPgUp = uv.KeyPgUp
30+ KeyPgDown = uv.KeyPgDown
31+ KeyHome = uv.KeyHome
32+ KeyEnd = uv.KeyEnd
33+
34+ // Keypad keys.
35+
36+ KeyKpEnter = uv.KeyKpEnter
37+ KeyKpEqual = uv.KeyKpEqual
38+ KeyKpMultiply = uv.KeyKpMultiply
39+ KeyKpPlus = uv.KeyKpPlus
40+ KeyKpComma = uv.KeyKpComma
41+ KeyKpMinus = uv.KeyKpMinus
42+ KeyKpDecimal = uv.KeyKpDecimal
43+ KeyKpDivide = uv.KeyKpDivide
44+ KeyKp0 = uv.KeyKp0
45+ KeyKp1 = uv.KeyKp1
46+ KeyKp2 = uv.KeyKp2
47+ KeyKp3 = uv.KeyKp3
48+ KeyKp4 = uv.KeyKp4
49+ KeyKp5 = uv.KeyKp5
50+ KeyKp6 = uv.KeyKp6
51+ KeyKp7 = uv.KeyKp7
52+ KeyKp8 = uv.KeyKp8
53+ KeyKp9 = uv.KeyKp9
54+
55+ // The following are keys defined in the Kitty keyboard protocol.
56+ // XXX: Investigate the names of these keys.
57+ KeyKpSep = uv.KeyKpSep
58+ KeyKpUp = uv.KeyKpUp
59+ KeyKpDown = uv.KeyKpDown
60+ KeyKpLeft = uv.KeyKpLeft
61+ KeyKpRight = uv.KeyKpRight
62+ KeyKpPgUp = uv.KeyKpPgUp
63+ KeyKpPgDown = uv.KeyKpPgDown
64+ KeyKpHome = uv.KeyKpHome
65+ KeyKpEnd = uv.KeyKpEnd
66+ KeyKpInsert = uv.KeyKpInsert
67+ KeyKpDelete = uv.KeyKpDelete
68+ KeyKpBegin = uv.KeyKpBegin
69+
70+ // Function keys.
71+
72+ KeyF1 = uv.KeyF1
73+ KeyF2 = uv.KeyF2
74+ KeyF3 = uv.KeyF3
75+ KeyF4 = uv.KeyF4
76+ KeyF5 = uv.KeyF5
77+ KeyF6 = uv.KeyF6
78+ KeyF7 = uv.KeyF7
79+ KeyF8 = uv.KeyF8
80+ KeyF9 = uv.KeyF9
81+ KeyF10 = uv.KeyF10
82+ KeyF11 = uv.KeyF11
83+ KeyF12 = uv.KeyF12
84+ KeyF13 = uv.KeyF13
85+ KeyF14 = uv.KeyF14
86+ KeyF15 = uv.KeyF15
87+ KeyF16 = uv.KeyF16
88+ KeyF17 = uv.KeyF17
89+ KeyF18 = uv.KeyF18
90+ KeyF19 = uv.KeyF19
91+ KeyF20 = uv.KeyF20
92+ KeyF21 = uv.KeyF21
93+ KeyF22 = uv.KeyF22
94+ KeyF23 = uv.KeyF23
95+ KeyF24 = uv.KeyF24
96+ KeyF25 = uv.KeyF25
97+ KeyF26 = uv.KeyF26
98+ KeyF27 = uv.KeyF27
99+ KeyF28 = uv.KeyF28
100+ KeyF29 = uv.KeyF29
101+ KeyF30 = uv.KeyF30
102+ KeyF31 = uv.KeyF31
103+ KeyF32 = uv.KeyF32
104+ KeyF33 = uv.KeyF33
105+ KeyF34 = uv.KeyF34
106+ KeyF35 = uv.KeyF35
107+ KeyF36 = uv.KeyF36
108+ KeyF37 = uv.KeyF37
109+ KeyF38 = uv.KeyF38
110+ KeyF39 = uv.KeyF39
111+ KeyF40 = uv.KeyF40
112+ KeyF41 = uv.KeyF41
113+ KeyF42 = uv.KeyF42
114+ KeyF43 = uv.KeyF43
115+ KeyF44 = uv.KeyF44
116+ KeyF45 = uv.KeyF45
117+ KeyF46 = uv.KeyF46
118+ KeyF47 = uv.KeyF47
119+ KeyF48 = uv.KeyF48
120+ KeyF49 = uv.KeyF49
121+ KeyF50 = uv.KeyF50
122+ KeyF51 = uv.KeyF51
123+ KeyF52 = uv.KeyF52
124+ KeyF53 = uv.KeyF53
125+ KeyF54 = uv.KeyF54
126+ KeyF55 = uv.KeyF55
127+ KeyF56 = uv.KeyF56
128+ KeyF57 = uv.KeyF57
129+ KeyF58 = uv.KeyF58
130+ KeyF59 = uv.KeyF59
131+ KeyF60 = uv.KeyF60
132+ KeyF61 = uv.KeyF61
133+ KeyF62 = uv.KeyF62
134+ KeyF63 = uv.KeyF63
135+
136+ // The following are keys defined in the Kitty keyboard protocol.
137+ // XXX: Investigate the names of these keys.
138+
139+ KeyCapsLock = uv.KeyCapsLock
140+ KeyScrollLock = uv.KeyScrollLock
141+ KeyNumLock = uv.KeyNumLock
142+ KeyPrintScreen = uv.KeyPrintScreen
143+ KeyPause = uv.KeyPause
144+ KeyMenu = uv.KeyMenu
145+
146+ KeyMediaPlay = uv.KeyMediaPlay
147+ KeyMediaPause = uv.KeyMediaPause
148+ KeyMediaPlayPause = uv.KeyMediaPlayPause
149+ KeyMediaReverse = uv.KeyMediaReverse
150+ KeyMediaStop = uv.KeyMediaStop
151+ KeyMediaFastForward = uv.KeyMediaFastForward
152+ KeyMediaRewind = uv.KeyMediaRewind
153+ KeyMediaNext = uv.KeyMediaNext
154+ KeyMediaPrev = uv.KeyMediaPrev
155+ KeyMediaRecord
156+
157+ KeyLowerVol = uv.KeyLowerVol
158+ KeyRaiseVol = uv.KeyRaiseVol
159+ KeyMute = uv.KeyMute
160+
161+ KeyLeftShift = uv.KeyLeftShift
162+ KeyLeftAlt = uv.KeyLeftAlt
163+ KeyLeftCtrl = uv.KeyLeftCtrl
164+ KeyLeftSuper = uv.KeyLeftSuper
165+ KeyLeftHyper = uv.KeyLeftHyper
166+ KeyLeftMeta = uv.KeyLeftMeta
167+ KeyRightShift = uv.KeyRightShift
168+ KeyRightAlt = uv.KeyRightAlt
169+ KeyRightCtrl = uv.KeyRightCtrl
170+ KeyRightSuper = uv.KeyRightSuper
171+ KeyRightHyper = uv.KeyRightHyper
172+ KeyRightMeta = uv.KeyRightMeta
173+ KeyIsoLevel3Shift = uv.KeyIsoLevel3Shift
174+ KeyIsoLevel5Shift = uv.KeyIsoLevel5Shift
175+
176+ // Special names in C0.
177+
178+ KeyBackspace = uv.KeyBackspace
179+ KeyTab = uv.KeyTab
180+ KeyEnter = uv.KeyEnter
181+ KeyReturn = uv.KeyReturn
182+ KeyEscape = uv.KeyEscape
183+ KeyEsc = uv.KeyEsc
184+
185+ // Special names in G0.
186+
187+ KeySpace = uv.KeySpace
188+)
189+
190+// KeyPressMsg represents a key press message.
191+type KeyPressMsg Key
192+
193+// String implements [fmt.Stringer] and is quite useful for matching key
194+// events. For details, on what this returns see [Key.String].
195+func (k KeyPressMsg) String() string {
196+ return Key(k).String()
197+}
198+
199+// Keystroke returns the keystroke representation of the [Key]. While less type
200+// safe than looking at the individual fields, it will usually be more
201+// convenient and readable to use this method when matching against keys.
202+//
203+// Note that modifier keys are always printed in the following order:
204+// - ctrl
205+// - alt
206+// - shift
207+// - meta
208+// - hyper
209+// - super
210+//
211+// For example, you'll always see "ctrl+shift+alt+a" and never
212+// "shift+ctrl+alt+a".
213+func (k KeyPressMsg) Keystroke() string {
214+ return uv.Key(k).Keystroke()
215+}
216+
217+// Key returns the underlying key event. This is a syntactic sugar for casting
218+// the key event to a [Key].
219+func (k KeyPressMsg) Key() Key {
220+ return Key(k)
221+}
222+
223+// KeyReleaseMsg represents a key release message.
224+type KeyReleaseMsg Key
225+
226+// String implements [fmt.Stringer] and is quite useful for matching key
227+// events. For details, on what this returns see [Key.String].
228+func (k KeyReleaseMsg) String() string {
229+ return Key(k).String()
230+}
231+
232+// Keystroke returns the keystroke representation of the [Key]. While less type
233+// safe than looking at the individual fields, it will usually be more
234+// convenient and readable to use this method when matching against keys.
235+//
236+// Note that modifier keys are always printed in the following order:
237+// - ctrl
238+// - alt
239+// - shift
240+// - meta
241+// - hyper
242+// - super
243+//
244+// For example, you'll always see "ctrl+shift+alt+a" and never
245+// "shift+ctrl+alt+a".
246+func (k KeyReleaseMsg) Keystroke() string {
247+ return uv.Key(k).Keystroke()
248+}
249+
250+// Key returns the underlying key event. This is a convenience method and
251+// syntactic sugar to satisfy the [KeyMsg] interface, and cast the key event to
252+// [Key].
253+func (k KeyReleaseMsg) Key() Key {
254+ return Key(k)
255+}
256+
257+// KeyMsg represents a key event. This can be either a key press or a key
258+// release event.
259+type KeyMsg interface {
260+ fmt.Stringer
261+
262+ // Key returns the underlying key event.
263+ Key() Key
264+}
265+
266+// Key represents a Key press or release event. It contains information about
267+// the Key pressed, like the runes, the type of Key, and the modifiers pressed.
268+// There are a couple general patterns you could use to check for key presses
269+// or releases:
270+//
271+// // Switch on the string representation of the key (shorter)
272+// switch msg := msg.(type) {
273+// case KeyPressMsg:
274+// switch msg.String() {
275+// case "enter":
276+// fmt.Println("you pressed enter!")
277+// case "a":
278+// fmt.Println("you pressed a!")
279+// }
280+// }
281+//
282+// // Switch on the key type (more foolproof)
283+// switch msg := msg.(type) {
284+// case KeyMsg:
285+// // catch both KeyPressMsg and KeyReleaseMsg
286+// switch key := msg.Key(); key.Code {
287+// case KeyEnter:
288+// fmt.Println("you pressed enter!")
289+// default:
290+// switch key.Text {
291+// case "a":
292+// fmt.Println("you pressed a!")
293+// }
294+// }
295+// }
296+//
297+// Note that [Key.Text] will be empty for special keys like [KeyEnter],
298+// [KeyTab], and for keys that don't represent printable characters like key
299+// combos with modifier keys. In other words, [Key.Text] is populated only for
300+// keys that represent printable characters shifted or unshifted (like 'a',
301+// 'A', '1', '!', etc.).
302+type Key struct {
303+ // Text contains the actual characters received. This usually the same as
304+ // [Key.Code]. When [Key.Text] is non-empty, it indicates that the key
305+ // pressed represents printable character(s).
306+ Text string
307+
308+ // Mod represents modifier keys, like [ModCtrl], [ModAlt], and so on.
309+ Mod KeyMod
310+
311+ // Code represents the key pressed. This is usually a special key like
312+ // [KeyTab], [KeyEnter], [KeyF1], or a printable character like 'a'.
313+ Code rune
314+
315+ // ShiftedCode is the actual, shifted key pressed by the user. For example,
316+ // if the user presses shift+a, or caps lock is on, [Key.ShiftedCode] will
317+ // be 'A' and [Key.Code] will be 'a'.
318+ //
319+ // In the case of non-latin keyboards, like Arabic, [Key.ShiftedCode] is the
320+ // unshifted key on the keyboard.
321+ //
322+ // This is only available with the Kitty Keyboard Protocol or the Windows
323+ // Console API.
324+ ShiftedCode rune
325+
326+ // BaseCode is the key pressed according to the standard PC-101 key layout.
327+ // On international keyboards, this is the key that would be pressed if the
328+ // keyboard was set to US PC-101 layout.
329+ //
330+ // For example, if the user presses 'q' on a French AZERTY keyboard,
331+ // [Key.BaseCode] will be 'q'.
332+ //
333+ // This is only available with the Kitty Keyboard Protocol or the Windows
334+ // Console API.
335+ BaseCode rune
336+
337+ // IsRepeat indicates whether the key is being held down and sending events
338+ // repeatedly.
339+ //
340+ // This is only available with the Kitty Keyboard Protocol or the Windows
341+ // Console API.
342+ IsRepeat bool
343+}
344+
345+// String implements [fmt.Stringer] and is quite useful for matching key
346+// events. It will return the textual representation of the [Key] if there is
347+// one, otherwise, it will fallback to [Key.Keystroke].
348+//
349+// For example, you'll always get "?" and instead of "shift+/" on a US ANSI
350+// keyboard.
351+func (k Key) String() string {
352+ return uv.Key(k).String()
353+}
354+
355+// Keystroke returns the keystroke representation of the [Key]. While less type
356+// safe than looking at the individual fields, it will usually be more
357+// convenient and readable to use this method when matching against keys.
358+//
359+// Note that modifier keys are always printed in the following order:
360+// - ctrl
361+// - alt
362+// - shift
363+// - meta
364+// - hyper
365+// - super
366+//
367+// For example, you'll always see "ctrl+shift+alt+a" and never
368+// "shift+ctrl+alt+a".
369+func (k Key) Keystroke() string {
370+ return uv.Key(k).Keystroke()
371+}
vendor/charm.land/bubbletea/v2/keyboard.gonew file+59
@@ -0,0 +1,59 @@
1+package tea
2+
3+import (
4+ "github.com/charmbracelet/x/ansi"
5+)
6+
7+// KeyboardEnhancementsMsg is a message that gets sent when the terminal
8+// supports keyboard enhancements.
9+type KeyboardEnhancementsMsg struct {
10+ // Flags is a bitmask of enabled keyboard enhancement features. A non-zero
11+ // value indicates that at least we have key disambiguation support.
12+ //
13+ // See [ansi.KittyReportEventTypes] and other constants for details.
14+ //
15+ // Example:
16+ //
17+ // ```go
18+ // // The hard way
19+ // if msg.Flags&ansi.KittyReportEventTypes != 0 {
20+ // // Terminal supports reporting different key event types
21+ // }
22+ //
23+ // // The easy way
24+ // if msg.SupportsEventTypes() {
25+ // // Terminal supports reporting different key event types
26+ // }
27+ // ```
28+ Flags int
29+}
30+
31+// SupportsKeyDisambiguation returns whether the terminal supports key
32+// disambiguation (e.g., distinguishing between different modifier keys).
33+func (k KeyboardEnhancementsMsg) SupportsKeyDisambiguation() bool {
34+ return k.Flags > 0
35+}
36+
37+// SupportsEventTypes returns whether the terminal supports reporting
38+// different types of key events (press, release, and repeat).
39+func (k KeyboardEnhancementsMsg) SupportsEventTypes() bool {
40+ return k.Flags&ansi.KittyReportEventTypes != 0
41+}
42+
43+// SupportsAlternateKeys returns whether the terminal supports reporting
44+// alternate key codes.
45+func (k KeyboardEnhancementsMsg) SupportsAlternateKeys() bool {
46+ return k.Flags&ansi.KittyReportAlternateKeys != 0
47+}
48+
49+// SupportsAllKeysAsEscapeCodes returns whether the terminal supports reporting
50+// all keys as escape codes.
51+func (k KeyboardEnhancementsMsg) SupportsAllKeysAsEscapeCodes() bool {
52+ return k.Flags&ansi.KittyReportAllKeysAsEscapeCodes != 0
53+}
54+
55+// SupportsAssociatedText returns whether the terminal supports reporting
56+// associated text with key events.
57+func (k KeyboardEnhancementsMsg) SupportsAssociatedText() bool {
58+ return k.Flags&ansi.KittyReportAssociatedKeys != 0
59+}
vendor/charm.land/bubbletea/v2/logging.gonew file+53
@@ -0,0 +1,53 @@
1+package tea
2+
3+import (
4+ "fmt"
5+ "io"
6+ "log"
7+ "os"
8+ "unicode"
9+)
10+
11+// LogToFile sets up default logging to log to a file. This is helpful as we
12+// can't print to the terminal since our TUI is occupying it. If the file
13+// doesn't exist it will be created.
14+//
15+// Don't forget to close the file when you're done with it.
16+//
17+// f, err := LogToFile("debug.log", "debug")
18+// if err != nil {
19+// fmt.Println("fatal:", err)
20+// os.Exit(1)
21+// }
22+// defer f.Close()
23+func LogToFile(path string, prefix string) (*os.File, error) {
24+ return LogToFileWith(path, prefix, log.Default())
25+}
26+
27+// LogOptionsSetter is an interface implemented by stdlib's log and charm's log
28+// libraries.
29+type LogOptionsSetter interface {
30+ SetOutput(io.Writer)
31+ SetPrefix(string)
32+}
33+
34+// LogToFileWith does allows to call LogToFile with a custom LogOptionsSetter.
35+func LogToFileWith(path string, prefix string, log LogOptionsSetter) (*os.File, error) {
36+ f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0o600) //nolint:mnd
37+ if err != nil {
38+ return nil, fmt.Errorf("error opening file for logging: %w", err)
39+ }
40+ log.SetOutput(f)
41+
42+ // Add a space after the prefix if a prefix is being specified and it
43+ // doesn't already have a trailing space.
44+ if len(prefix) > 0 {
45+ finalChar := prefix[len(prefix)-1]
46+ if !unicode.IsSpace(rune(finalChar)) {
47+ prefix += " "
48+ }
49+ }
50+ log.SetPrefix(prefix)
51+
52+ return f, nil
53+}
vendor/charm.land/bubbletea/v2/mod.gonew file+27
@@ -0,0 +1,27 @@
1+package tea
2+
3+import uv "github.com/charmbracelet/ultraviolet"
4+
5+// KeyMod represents modifier keys.
6+type KeyMod = uv.KeyMod
7+
8+// Modifier keys.
9+const (
10+ ModShift = uv.ModShift
11+ ModAlt = uv.ModAlt
12+ ModCtrl = uv.ModCtrl
13+ ModMeta = uv.ModMeta
14+
15+ // These modifiers are used with the Kitty protocol.
16+ // XXX: Meta and Super are swapped in the Kitty protocol,
17+ // this is to preserve compatibility with XTerm modifiers.
18+
19+ ModHyper = uv.ModHyper
20+ ModSuper = uv.ModSuper // Windows/Command keys
21+
22+ // These are key lock states.
23+
24+ ModCapsLock = uv.ModCapsLock
25+ ModNumLock = uv.ModNumLock
26+ ModScrollLock = uv.ModScrollLock // Defined in Windows API only
27+)
vendor/charm.land/bubbletea/v2/mouse.gonew file+144
@@ -0,0 +1,144 @@
1+package tea
2+
3+import (
4+ "fmt"
5+
6+ uv "github.com/charmbracelet/ultraviolet"
7+)
8+
9+// MouseButton represents the button that was pressed during a mouse message.
10+type MouseButton = uv.MouseButton
11+
12+// Mouse event buttons
13+//
14+// This is based on X11 mouse button codes.
15+//
16+// 1 = left button
17+// 2 = middle button (pressing the scroll wheel)
18+// 3 = right button
19+// 4 = turn scroll wheel up
20+// 5 = turn scroll wheel down
21+// 6 = push scroll wheel left
22+// 7 = push scroll wheel right
23+// 8 = 4th button (aka browser backward button)
24+// 9 = 5th button (aka browser forward button)
25+// 10
26+// 11
27+//
28+// Other buttons are not supported.
29+const (
30+ MouseNone = uv.MouseNone
31+ MouseLeft = uv.MouseLeft
32+ MouseMiddle = uv.MouseMiddle
33+ MouseRight = uv.MouseRight
34+ MouseWheelUp = uv.MouseWheelUp
35+ MouseWheelDown = uv.MouseWheelDown
36+ MouseWheelLeft = uv.MouseWheelLeft
37+ MouseWheelRight = uv.MouseWheelRight
38+ MouseBackward = uv.MouseBackward
39+ MouseForward = uv.MouseForward
40+ MouseButton10 = uv.MouseButton10
41+ MouseButton11
42+)
43+
44+// MouseMsg represents a mouse message. This is a generic mouse message that
45+// can represent any kind of mouse event.
46+type MouseMsg interface {
47+ fmt.Stringer
48+
49+ // Mouse returns the underlying mouse event.
50+ Mouse() Mouse
51+}
52+
53+// Mouse represents a Mouse message. Use [MouseMsg] to represent all mouse
54+// messages.
55+//
56+// The X and Y coordinates are zero-based, with (0,0) being the upper left
57+// corner of the terminal.
58+//
59+// // Catch all mouse events
60+// switch msg := msg.(type) {
61+// case MouseMsg:
62+// m := msg.Mouse()
63+// fmt.Println("Mouse event:", m.X, m.Y, m)
64+// }
65+//
66+// // Only catch mouse click events
67+// switch msg := msg.(type) {
68+// case MouseClickMsg:
69+// fmt.Println("Mouse click event:", msg.X, msg.Y, msg)
70+// }
71+type Mouse struct {
72+ X, Y int
73+ Button MouseButton
74+ Mod KeyMod
75+}
76+
77+// String returns a string representation of the mouse message.
78+func (m Mouse) String() (s string) {
79+ return uv.Mouse(m).String()
80+}
81+
82+// MouseClickMsg represents a mouse button click message.
83+type MouseClickMsg Mouse
84+
85+// String returns a string representation of the mouse click message.
86+func (e MouseClickMsg) String() string {
87+ return Mouse(e).String()
88+}
89+
90+// Mouse returns the underlying mouse event. This is a convenience method and
91+// syntactic sugar to satisfy the [MouseMsg] interface, and cast the mouse
92+// event to [Mouse].
93+func (e MouseClickMsg) Mouse() Mouse {
94+ return Mouse(e)
95+}
96+
97+// MouseReleaseMsg represents a mouse button release message.
98+type MouseReleaseMsg Mouse
99+
100+// String returns a string representation of the mouse release message.
101+func (e MouseReleaseMsg) String() string {
102+ return Mouse(e).String()
103+}
104+
105+// Mouse returns the underlying mouse event. This is a convenience method and
106+// syntactic sugar to satisfy the [MouseMsg] interface, and cast the mouse
107+// event to [Mouse].
108+func (e MouseReleaseMsg) Mouse() Mouse {
109+ return Mouse(e)
110+}
111+
112+// MouseWheelMsg represents a mouse wheel message event.
113+type MouseWheelMsg Mouse
114+
115+// String returns a string representation of the mouse wheel message.
116+func (e MouseWheelMsg) String() string {
117+ return Mouse(e).String()
118+}
119+
120+// Mouse returns the underlying mouse event. This is a convenience method and
121+// syntactic sugar to satisfy the [MouseMsg] interface, and cast the mouse
122+// event to [Mouse].
123+func (e MouseWheelMsg) Mouse() Mouse {
124+ return Mouse(e)
125+}
126+
127+// MouseMotionMsg represents a mouse motion message.
128+type MouseMotionMsg Mouse
129+
130+// String returns a string representation of the mouse motion message.
131+func (e MouseMotionMsg) String() string {
132+ m := Mouse(e)
133+ if m.Button != 0 {
134+ return m.String() + "+motion"
135+ }
136+ return m.String() + "motion"
137+}
138+
139+// Mouse returns the underlying mouse event. This is a convenience method and
140+// syntactic sugar to satisfy the [MouseMsg] interface, and cast the mouse
141+// event to [Mouse].
142+func (e MouseMotionMsg) Mouse() Mouse {
143+ return Mouse(e)
144+}
vendor/charm.land/bubbletea/v2/nil_renderer.gonew file+53
@@ -0,0 +1,53 @@
1+package tea
2+
3+import (
4+ "github.com/charmbracelet/colorprofile"
5+ "github.com/charmbracelet/x/ansi"
6+)
7+
8+// nilRenderer is a no-op renderer. It implements the Renderer interface but
9+// doesn't render anything to the terminal.
10+type nilRenderer struct{}
11+
12+var _ renderer = nilRenderer{}
13+
14+// start implements renderer.
15+func (n nilRenderer) start() {}
16+
17+// clearScreen implements renderer.
18+func (n nilRenderer) clearScreen() {}
19+
20+// insertAbove implements renderer.
21+func (n nilRenderer) insertAbove(string) error { return nil }
22+
23+// resize implements renderer.
24+func (n nilRenderer) resize(int, int) {}
25+
26+// setColorProfile implements renderer.
27+func (n nilRenderer) setColorProfile(colorprofile.Profile) {}
28+
29+// flush implements the Renderer interface.
30+func (nilRenderer) flush(bool) error { return nil }
31+
32+// close implements the Renderer interface.
33+func (nilRenderer) close() error { return nil }
34+
35+// render implements the Renderer interface.
36+func (nilRenderer) render(View) {}
37+
38+// reset implements the Renderer interface.
39+func (nilRenderer) reset() {}
40+
41+// writeString implements the Renderer interface.
42+func (nilRenderer) writeString(string) (int, error) { return 0, nil }
43+
44+// setSyncdUpdates implements the Renderer interface.
45+func (n nilRenderer) setSyncdUpdates(bool) {}
46+
47+// setWidthMethod implements the Renderer interface.
48+func (n nilRenderer) setWidthMethod(ansi.Method) {}
49+
50+// onMouse implements the Renderer interface.
51+func (n nilRenderer) onMouse(MouseMsg) Cmd {
52+ return nil
53+}
vendor/charm.land/bubbletea/v2/options.gonew file+168
@@ -0,0 +1,168 @@
1+package tea
2+
3+import (
4+ "context"
5+ "io"
6+ "sync/atomic"
7+
8+ "github.com/charmbracelet/colorprofile"
9+)
10+
11+// ProgramOption is used to set options when initializing a Program. Program can
12+// accept a variable number of options.
13+//
14+// Example usage:
15+//
16+// p := NewProgram(model, WithInput(someInput), WithOutput(someOutput))
17+type ProgramOption func(*Program)
18+
19+// WithContext lets you specify a context in which to run the Program. This is
20+// useful if you want to cancel the execution from outside. When a Program gets
21+// cancelled it will exit with an error ErrProgramKilled.
22+func WithContext(ctx context.Context) ProgramOption {
23+ return func(p *Program) {
24+ p.externalCtx = ctx
25+ }
26+}
27+
28+// WithOutput sets the output which, by default, is stdout. In most cases you
29+// won't need to use this.
30+func WithOutput(output io.Writer) ProgramOption {
31+ return func(p *Program) {
32+ p.output = output
33+ }
34+}
35+
36+// WithInput sets the input which, by default, is stdin. In most cases you
37+// won't need to use this. To disable input entirely pass nil.
38+//
39+// p := NewProgram(model, WithInput(nil))
40+func WithInput(input io.Reader) ProgramOption {
41+ return func(p *Program) {
42+ p.input = input
43+ p.disableInput = input == nil
44+ }
45+}
46+
47+// WithEnvironment sets the environment variables that the program will use.
48+// This useful when the program is running in a remote session (e.g. SSH) and
49+// you want to pass the environment variables from the remote session to the
50+// program.
51+//
52+// Example:
53+//
54+// var sess ssh.Session // ssh.Session is a type from the github.com/charmbracelet/ssh package
55+// pty, _, _ := sess.Pty()
56+// environ := append(sess.Environ(), "TERM="+pty.Term)
57+// p := tea.NewProgram(model, tea.WithEnvironment(environ)
58+func WithEnvironment(env []string) ProgramOption {
59+ return func(p *Program) {
60+ p.environ = env
61+ }
62+}
63+
64+// WithoutSignalHandler disables the signal handler that Bubble Tea sets up for
65+// Programs. This is useful if you want to handle signals yourself.
66+func WithoutSignalHandler() ProgramOption {
67+ return func(p *Program) {
68+ p.disableSignalHandler = true
69+ }
70+}
71+
72+// WithoutCatchPanics disables the panic catching that Bubble Tea does by
73+// default. If panic catching is disabled the terminal will be in a fairly
74+// unusable state after a panic because Bubble Tea will not perform its usual
75+// cleanup on exit.
76+func WithoutCatchPanics() ProgramOption {
77+ return func(p *Program) {
78+ p.disableCatchPanics = true
79+ }
80+}
81+
82+// WithoutSignals will ignore OS signals.
83+// This is mainly useful for testing.
84+func WithoutSignals() ProgramOption {
85+ return func(p *Program) {
86+ atomic.StoreUint32(&p.ignoreSignals, 1)
87+ }
88+}
89+
90+// WithoutRenderer disables the renderer. When this is set output and log
91+// statements will be plainly sent to stdout (or another output if one is set)
92+// without any rendering and redrawing logic. In other words, printing and
93+// logging will behave the same way it would in a non-TUI commandline tool.
94+// This can be useful if you want to use the Bubble Tea framework for a non-TUI
95+// application, or to provide an additional non-TUI mode to your Bubble Tea
96+// programs. For example, your program could behave like a daemon if output is
97+// not a TTY.
98+func WithoutRenderer() ProgramOption {
99+ return func(p *Program) {
100+ p.disableRenderer = true
101+ }
102+}
103+
104+// WithFilter supplies an event filter that will be invoked before Bubble Tea
105+// processes a tea.Msg. The event filter can return any tea.Msg which will then
106+// get handled by Bubble Tea instead of the original event. If the event filter
107+// returns nil, the event will be ignored and Bubble Tea will not process it.
108+//
109+// As an example, this could be used to prevent a program from shutting down if
110+// there are unsaved changes.
111+//
112+// Example:
113+//
114+// func filter(m tea.Model, msg tea.Msg) tea.Msg {
115+// if _, ok := msg.(tea.QuitMsg); !ok {
116+// return msg
117+// }
118+//
119+// model := m.(myModel)
120+// if model.hasChanges {
121+// return nil
122+// }
123+//
124+// return msg
125+// }
126+//
127+// p := tea.NewProgram(Model{}, tea.WithFilter(filter));
128+//
129+// if _,err := p.Run(); err != nil {
130+// fmt.Println("Error running program:", err)
131+// os.Exit(1)
132+// }
133+func WithFilter(filter func(Model, Msg) Msg) ProgramOption {
134+ return func(p *Program) {
135+ p.filter = filter
136+ }
137+}
138+
139+// WithFPS sets a custom maximum FPS at which the renderer should run. If
140+// less than 1, the default value of 60 will be used. If over 120, the FPS
141+// will be capped at 120.
142+func WithFPS(fps int) ProgramOption {
143+ return func(p *Program) {
144+ p.fps = fps
145+ }
146+}
147+
148+// WithColorProfile sets the color profile that the program will use. This is
149+// useful when you want to force a specific color profile. By default, Bubble
150+// Tea will try to detect the terminal's color profile from environment
151+// variables and terminfo capabilities. Use [tea.WithEnvironment] to set custom
152+// environment variables.
153+func WithColorProfile(profile colorprofile.Profile) ProgramOption {
154+ return func(p *Program) {
155+ p.profile = &profile
156+ }
157+}
158+
159+// WithWindowSize sets the initial size of the terminal window. This is useful
160+// when you need to set the initial size of the terminal window, for example
161+// during testing or when you want to run your program in a non-interactive
162+// environment.
163+func WithWindowSize(width, height int) ProgramOption {
164+ return func(p *Program) {
165+ p.width = width
166+ p.height = height
167+ }
168+}
vendor/charm.land/bubbletea/v2/paste.gonew file+20
@@ -0,0 +1,20 @@
1+package tea
2+
3+// PasteMsg is an message that is emitted when a terminal receives pasted text
4+// using bracketed-paste.
5+type PasteMsg struct {
6+ Content string
7+}
8+
9+// String returns the pasted content as a string.
10+func (p PasteMsg) String() string {
11+ return p.Content
12+}
13+
14+// PasteStartMsg is an message that is emitted when the terminal starts the
15+// bracketed-paste text.
16+type PasteStartMsg struct{}
17+
18+// PasteEndMsg is an message that is emitted when the terminal ends the
19+// bracketed-paste text.
20+type PasteEndMsg struct{}
vendor/charm.land/bubbletea/v2/profile.gonew file+15
@@ -0,0 +1,15 @@
1+package tea
2+
3+import "github.com/charmbracelet/colorprofile"
4+
5+// ColorProfileMsg is a message that describes the terminal's color profile.
6+// This message is send to the program's update function when the program is
7+// started.
8+//
9+// To upgrade the terminal color profile, use the `tea.RequestCapability`
10+// command to request the `RGB` and `Tc` terminfo capabilities. Bubble Tea will
11+// then cache the terminal's color profile and send a `ColorProfileMsg` to the
12+// program's update function.
13+type ColorProfileMsg struct {
14+ colorprofile.Profile
15+}
vendor/charm.land/bubbletea/v2/raw.gonew file+37
@@ -0,0 +1,37 @@
1+package tea
2+
3+// RawMsg is a message that contains a string to be printed to the terminal
4+// without any intermediate processing.
5+type RawMsg struct {
6+ Msg any
7+}
8+
9+// Raw is a command that prints the given string to the terminal without any
10+// formatting.
11+//
12+// This is intended for advanced use cases where you need to query the terminal
13+// or send escape sequences directly. Don't use this unless you know what
14+// you're doing :)
15+//
16+// Example:
17+//
18+// func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
19+// switch msg := msg.(type) {
20+// case input.PrimaryDeviceAttributesEvent:
21+// for _, attr := range msg {
22+// if attr == 4 {
23+// // We have Sixel graphics support!
24+// break
25+// }
26+// }
27+// }
28+//
29+// // Request the terminal primary device attributes to detect Sixel graphics
30+// // support.
31+// return m, tea.Raw(ansi.RequestPrimaryDeviceAttributes)
32+// }
33+func Raw(r any) Cmd {
34+ return func() Msg {
35+ return RawMsg{r}
36+ }
37+}
vendor/charm.land/bubbletea/v2/renderer.gonew file+104
@@ -0,0 +1,104 @@
1+package tea
2+
3+import (
4+ "fmt"
5+
6+ "github.com/charmbracelet/colorprofile"
7+ "github.com/charmbracelet/x/ansi"
8+)
9+
10+const (
11+ // defaultFramerate specifies the maximum interval at which we should
12+ // update the view.
13+ defaultFPS = 60
14+ maxFPS = 120
15+)
16+
17+// renderer is the interface for Bubble Tea renderers.
18+type renderer interface {
19+ // start starts the renderer.
20+ start()
21+
22+ // close closes the renderer and flushes any remaining data.
23+ close() error
24+
25+ // render renders a frame to the output.
26+ render(View)
27+
28+ // flush flushes the renderer's buffer to the output.
29+ flush(closing bool) error
30+
31+ // reset resets the renderer's state to its initial state.
32+ reset()
33+
34+ // insertAbove inserts unmanaged lines above the renderer.
35+ insertAbove(string) error
36+
37+ // setSyncdUpdates sets whether to use synchronized updates.
38+ setSyncdUpdates(bool)
39+
40+ // setWidthMethod sets the method for calculating the width of the terminal.
41+ setWidthMethod(ansi.Method)
42+
43+ // resize notify the renderer of a terminal resize.
44+ resize(int, int)
45+
46+ // setColorProfile sets the color profile.
47+ setColorProfile(colorprofile.Profile)
48+
49+ // clearScreen clears the screen.
50+ clearScreen()
51+
52+ // writeString writes a string to the renderer's output.
53+ writeString(string) (int, error)
54+
55+ // onMouse handles a mouse event.
56+ onMouse(MouseMsg) Cmd
57+}
58+
59+type printLineMessage struct {
60+ messageBody string
61+}
62+
63+// Println prints above the Program. This output is unmanaged by the program and
64+// will persist across renders by the Program.
65+//
66+// Unlike fmt.Println (but similar to log.Println) the message will be print on
67+// its own line.
68+//
69+// If the altscreen is active no output will be printed.
70+func Println(args ...any) Cmd {
71+ return func() Msg {
72+ return printLineMessage{
73+ messageBody: fmt.Sprint(args...),
74+ }
75+ }
76+}
77+
78+// Printf prints above the Program. It takes a format template followed by
79+// values similar to fmt.Printf. This output is unmanaged by the program and
80+// will persist across renders by the Program.
81+//
82+// Unlike fmt.Printf (but similar to log.Printf) the message will be print on
83+// its own line.
84+//
85+// If the altscreen is active no output will be printed.
86+func Printf(template string, args ...any) Cmd {
87+ return func() Msg {
88+ return printLineMessage{
89+ messageBody: fmt.Sprintf(template, args...),
90+ }
91+ }
92+}
93+
94+// encodeCursorStyle returns the integer value for the given cursor style and
95+// blink state.
96+func encodeCursorStyle(style CursorShape, blink bool) int {
97+ // We're using the ANSI escape sequence values for cursor styles.
98+ // We need to map both [style] and [steady] to the correct value.
99+ style = (style * 2) + 1 //nolint:mnd
100+ if !blink {
101+ style++
102+ }
103+ return int(style)
104+}
vendor/charm.land/bubbletea/v2/screen.gonew file+68
@@ -0,0 +1,68 @@
1+package tea
2+
3+import "github.com/charmbracelet/x/ansi"
4+
5+// WindowSizeMsg is used to report the terminal size. It's sent to Update once
6+// initially and then on every terminal resize. Note that Windows does not
7+// have support for reporting when resizes occur as it does not support the
8+// SIGWINCH signal.
9+type WindowSizeMsg struct {
10+ Width int
11+ Height int
12+}
13+
14+// ClearScreen is a special command that tells the program to clear the screen
15+// before the next update. This can be used to move the cursor to the top left
16+// of the screen and clear visual clutter when the alt screen is not in use.
17+//
18+// Note that it should never be necessary to call ClearScreen() for regular
19+// redraws.
20+func ClearScreen() Msg {
21+ return clearScreenMsg{}
22+}
23+
24+// clearScreenMsg is an internal message that signals to clear the screen.
25+// You can send a clearScreenMsg with ClearScreen.
26+type clearScreenMsg struct{}
27+
28+// ModeReportMsg is a message that represents a mode report event (DECRPM).
29+//
30+// This is sent by the terminal in response to a request for a terminal mode
31+// report (DECRQM). It indicates the current setting of a specific terminal
32+// mode like cursor visibility, mouse tracking, etc.
33+//
34+// Example:
35+//
36+// ```go
37+// func (m model) Init() tea.Cmd {
38+// // Does my terminal support reporting focus events?
39+// return tea.Raw(ansi.RequestModeFocusEvent)
40+// }
41+//
42+// func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
43+// switch msg := msg.(type) {
44+// case tea.ModeReportMsg:
45+// if msg.Mode == ansi.ModeFocusEvent && !msg.Value.IsNotRecognized() {
46+// // Terminal supports focus events
47+// m.supportsFocus = true
48+// }
49+// }
50+// return m, nil
51+// }
52+//
53+// func (m model) View() tea.View {
54+// var view tea.View
55+// view.ReportFocus = m.supportsFocus
56+// view.SetContent(fmt.Sprintf("Terminal supports focus events: %v", m.supportsFocus))
57+// return view
58+// }
59+// ```
60+//
61+// See: https://vt100.net/docs/vt510-rm/DECRPM.html
62+type ModeReportMsg struct {
63+ // Mode is the mode number.
64+ Mode ansi.Mode
65+
66+ // Value is the mode value.
67+ Value ansi.ModeSetting
68+}
vendor/charm.land/bubbletea/v2/signals_unix.gonew file+33
@@ -0,0 +1,33 @@
1+//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || aix || zos
2+// +build darwin dragonfly freebsd linux netbsd openbsd solaris aix zos
3+
4+package tea
5+
6+import (
7+ "os"
8+ "os/signal"
9+ "syscall"
10+)
11+
12+// listenForResize sends messages (or errors) when the terminal resizes.
13+// Argument output should be the file descriptor for the terminal; usually
14+// os.Stdout.
15+func (p *Program) listenForResize(done chan struct{}) {
16+ sig := make(chan os.Signal, 1)
17+ signal.Notify(sig, syscall.SIGWINCH)
18+
19+ defer func() {
20+ signal.Stop(sig)
21+ close(done)
22+ }()
23+
24+ for {
25+ select {
26+ case <-p.ctx.Done():
27+ return
28+ case <-sig:
29+ }
30+
31+ p.checkResize()
32+ }
33+}
vendor/charm.land/bubbletea/v2/signals_windows.gonew file+10
@@ -0,0 +1,10 @@
1+//go:build windows
2+// +build windows
3+
4+package tea
5+
6+// listenForResize is not available on windows because windows does not
7+// implement syscall.SIGWINCH.
8+func (p *Program) listenForResize(done chan struct{}) {
9+ close(done)
10+}
vendor/charm.land/bubbletea/v2/tea.gonew file+1439
@@ -0,0 +1,1439 @@
1+// Package tea provides a framework for building rich terminal user interfaces
2+// based on the paradigms of The Elm Architecture. It's well-suited for simple
3+// and complex terminal applications, either inline, full-window, or a mix of
4+// both. It's been battle-tested in several large projects and is
5+// production-ready.
6+//
7+// A tutorial is available at https://github.com/charmbracelet/bubbletea/tree/master/tutorials
8+//
9+// Example programs can be found at https://github.com/charmbracelet/bubbletea/tree/master/examples
10+package tea
11+
12+import (
13+ "bytes"
14+ "context"
15+ "errors"
16+ "fmt"
17+ "image/color"
18+ "io"
19+ "log"
20+ "os"
21+ "os/signal"
22+ "runtime"
23+ "runtime/debug"
24+ "strconv"
25+ "strings"
26+ "sync"
27+ "sync/atomic"
28+ "syscall"
29+ "time"
30+
31+ "github.com/charmbracelet/colorprofile"
32+ uv "github.com/charmbracelet/ultraviolet"
33+ "github.com/charmbracelet/x/ansi"
34+ "github.com/charmbracelet/x/term"
35+ "github.com/muesli/cancelreader"
36+)
37+
38+// ErrProgramPanic is returned by [Program.Run] when the program recovers from a panic.
39+var ErrProgramPanic = errors.New("program experienced a panic")
40+
41+// ErrProgramKilled is returned by [Program.Run] when the program gets killed.
42+var ErrProgramKilled = errors.New("program was killed")
43+
44+// ErrInterrupted is returned by [Program.Run] when the program get a SIGINT
45+// signal, or when it receives a [InterruptMsg].
46+var ErrInterrupted = errors.New("program was interrupted")
47+
48+// Msg contain data from the result of a IO operation. Msgs trigger the update
49+// function and, henceforth, the UI.
50+type Msg = uv.Event
51+
52+// Model contains the program's state as well as its core functions.
53+type Model interface {
54+ // Init is the first function that will be called. It returns an optional
55+ // initial command. To not perform an initial command return nil.
56+ Init() Cmd
57+
58+ // Update is called when a message is received. Use it to inspect messages
59+ // and, in response, update the model and/or send a command.
60+ Update(Msg) (Model, Cmd)
61+
62+ // View renders the program's UI, which can be a string or a [Layer]. The
63+ // view is rendered after every Update.
64+ View() View
65+}
66+
67+// NewView is a helper function to create a new [View] with the given styled
68+// string. A styled string represents text with styles and hyperlinks encoded
69+// as ANSI escape codes.
70+//
71+// Example:
72+//
73+// ```go
74+// v := tea.NewView("Hello, World!")
75+// ```
76+func NewView(s string) View {
77+ var view View
78+ view.SetContent(s)
79+ return view
80+}
81+
82+// View represents a terminal view that can be composed of multiple layers.
83+// It can also contain a cursor that will be rendered on top of the layers.
84+type View struct {
85+ // Content is the screen content of the view. It holds styled strings that
86+ // will be rendered to the terminal when the view is rendered.
87+ //
88+ // A styled string represents text with styles and hyperlinks encoded as
89+ // ANSI escape codes.
90+ //
91+ // Example:
92+ //
93+ // ```go
94+ // v := tea.NewView("Hello, World!")
95+ // ```
96+ Content string
97+
98+ // OnMouse is an optional mouse message handler that can be used to
99+ // intercept mouse messages that depends on view content from last render.
100+ // It can be useful for implementing view-specific behavior without
101+ // breaking the unidirectional data flow of Bubble Tea.
102+ //
103+ // Example:
104+ //
105+ // ```go
106+ // content := "Hello, World!"
107+ // v := tea.NewView(content)
108+ // v.OnMouse = func(msg tea.MouseMsg) tea.Cmd {
109+ // return func() tea.Msg {
110+ // m := msg.Mouse()
111+ // // Check if the mouse is within the bounds of "World!"
112+ // start := strings.Index(content, "World!")
113+ // end := start + len("World!")
114+ // if m.Y == 0 && m.X >= start && m.X < end {
115+ // // Mouse is over "World!"
116+ // return MyCustomMsg{
117+ // MouseMsg: msg,
118+ // }
119+ // }
120+ // }
121+ // }
122+ // return nil
123+ // }
124+ // return v
125+ // ```
126+ OnMouse func(msg MouseMsg) Cmd
127+
128+ // Cursor represents the cursor position, style, and visibility on the
129+ // screen. When not nil, the cursor will be shown at the specified
130+ // position.
131+ Cursor *Cursor
132+
133+ // BackgroundColor when not nil, sets the terminal background color. Use
134+ // nil to reset to the terminal's default background color.
135+ BackgroundColor color.Color
136+
137+ // ForegroundColor when not nil, sets the terminal foreground color. Use
138+ // nil to reset to the terminal's default foreground color.
139+ ForegroundColor color.Color
140+
141+ // WindowTitle sets the terminal window title. Support depends on the
142+ // terminal.
143+ WindowTitle string
144+
145+ // ProgressBar when not nil, shows a progress bar in the terminal's
146+ // progress bar section. Support depends on the terminal.
147+ ProgressBar *ProgressBar
148+
149+ // AltScreen puts the program in the alternate screen buffer
150+ // (i.e. the program goes into full window mode). Note that the altscreen will
151+ // be automatically exited when the program quits.
152+ //
153+ // Example:
154+ //
155+ // func (m model) View() tea.View {
156+ // v := tea.NewView("Hello, World!")
157+ // v.AltScreen = true
158+ // return v
159+ // }
160+ //
161+ AltScreen bool
162+
163+ // ReportFocus enables reporting when the terminal gains and loses focus.
164+ // When this is enabled [FocusMsg] and [BlurMsg] messages will be sent to
165+ // your Update method.
166+ //
167+ // Note that while most terminals and multiplexers support focus reporting,
168+ // some do not. Also note that tmux needs to be configured to report focus
169+ // events.
170+ ReportFocus bool
171+
172+ // DisableBracketedPasteMode disables bracketed paste mode for this view.
173+ DisableBracketedPasteMode bool
174+
175+ // MouseMode sets the mouse mode for this view. It can be one of
176+ // [MouseModeNone], [MouseModeCellMotion], or [MouseModeAllMotion].
177+ MouseMode MouseMode
178+
179+ // KeyboardEnhancements describes what keyboard enhancement features Bubble
180+ // Tea should request from the terminal.
181+ //
182+ // Bubble Tea supports requesting the following keyboard enhancement features:
183+ // - ReportEventTypes: requests the terminal to report key repeat and
184+ // release events.
185+ //
186+ // If the terminal supports any of these features, your program will
187+ // receive a [KeyboardEnhancementsMsg] that indicates which features are
188+ // available.
189+ KeyboardEnhancements KeyboardEnhancements
190+}
191+
192+// KeyboardEnhancements describes the requested keyboard enhancement features.
193+// If the terminal supports any of them, it will respond with a
194+// [KeyboardEnhancementsMsg] that indicates which features are supported.
195+
196+// KeyboardEnhancements defines different keyboard enhancement features that
197+// can be requested from the terminal.
198+
199+// KeyboardEnhancements defines different keyboard enhancement features that
200+// can be requested from the terminal.
201+//
202+// By default, Bubble Tea requests basic key disambiguation features from the
203+// terminal. If the terminal supports keyboard enhancements, or any of its
204+// additional features, it will respond with a [KeyboardEnhancementsMsg] that
205+// indicates which features are supported.
206+//
207+// Example:
208+//
209+// ```go
210+// func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
211+// switch msg := msg.(type) {
212+// case tea.KeyboardEnhancementsMsg:
213+// // We have basic key disambiguation support.
214+// // We can handle "shift+enter", "ctrl+i", etc.
215+// m.keyboardEnhancements = msg
216+// if msg.ReportEventTypes {
217+// // Even better! We can now handle key repeat and release events.
218+// }
219+// case tea.KeyPressMsg:
220+// switch msg.String() {
221+// case "shift+enter":
222+// // Handle shift+enter
223+// // This would not be possible without keyboard enhancements.
224+// case "ctrl+j":
225+// // Handle ctrl+j
226+// }
227+// case tea.KeyReleaseMsg:
228+// // Whoa! A key was released!
229+// }
230+//
231+// return m, nil
232+// }
233+//
234+// func (m model) View() tea.View {
235+// v := tea.NewView("Press some keys!")
236+// // Request reporting key repeat and release events.
237+// v.KeyboardEnhancements.ReportEventTypes = true
238+// return v
239+// }
240+// ```
241+type KeyboardEnhancements struct {
242+ // ReportEventTypes requests the terminal to report key repeat and release
243+ // events.
244+ // If supported, your program will receive [KeyReleaseMsg]s and
245+ // [KeyPressMsg] with the [Key.IsRepeat] field set indicating that this is
246+ // a it's part of a key repeat sequence.
247+ ReportEventTypes bool
248+
249+ // ReportAlternateKeys requests the terminal to report alternate key values
250+ // in addition to the main ones.
251+ // Note that only key events represented as escape codes will affected by
252+ // this enhancement.
253+ ReportAlternateKeys bool
254+
255+ // ReportAllKeysAsEscapeCodes requests the terminal to report all key
256+ // events, including plain text keys, as escape codes.
257+ // When this is enabled, text won't be sent as plain text but instead as
258+ // escape codes that encode the key value and modifiers.
259+ ReportAllKeysAsEscapeCodes bool
260+
261+ // ReportAssociatedText requests the terminal to report the text associated
262+ // with key events.
263+ // Note that this is an enhancement to
264+ // [KeyboardEnhancements.ReportAllKeysAsEscapeCodes] and only has an effect
265+ // if that is enabled.
266+ ReportAssociatedText bool
267+}
268+
269+// SetContent is a helper method to set the content of a [View] with a styled
270+// string. A styled string represents text with styles and hyperlinks encoded
271+// as ANSI escape codes.
272+//
273+// Example:
274+//
275+// ```go
276+// var v tea.View
277+// v.SetContent("Hello, World!")
278+// ```
279+func (v *View) SetContent(s string) {
280+ v.Content = s
281+}
282+
283+// MouseMode represents the mouse mode of a view.
284+type MouseMode int
285+
286+const (
287+ // MouseModeNone disables mouse events.
288+ MouseModeNone MouseMode = iota
289+
290+ // MouseModeCellMotion enables mouse click, release, and wheel events.
291+ // Mouse movement events are also captured if a mouse button is pressed
292+ // (i.e., drag events). Cell motion mode is better supported than all
293+ // motion mode.
294+ //
295+ // This will try to enable the mouse in extended mode (SGR), if that is not
296+ // supported by the terminal it will fall back to normal mode (X10).
297+ MouseModeCellMotion
298+
299+ // MouseModeAllMotion enables all mouse events, including click, release,
300+ // wheel, and movement events. You will receive mouse movement events even
301+ // when no buttons are pressed.
302+ //
303+ // This will try to enable the mouse in extended mode (SGR), if that is not
304+ // supported by the terminal it will fall back to normal mode (X10).
305+ MouseModeAllMotion
306+)
307+
308+// ProgressBarState represents the state of the progress bar.
309+type ProgressBarState int
310+
311+// Progress bar states.
312+const (
313+ ProgressBarNone ProgressBarState = iota
314+ ProgressBarDefault
315+ ProgressBarError
316+ ProgressBarIndeterminate
317+ ProgressBarWarning
318+)
319+
320+// String return a human-readable value for the given [ProgressBarState].
321+func (s ProgressBarState) String() string {
322+ return [...]string{
323+ "None",
324+ "Default",
325+ "Error",
326+ "Indeterminate",
327+ "Warning",
328+ }[s]
329+}
330+
331+// ProgressBar represents the terminal progress bar.
332+//
333+// Support depends on the terminal.
334+//
335+// See https://learn.microsoft.com/en-us/windows/terminal/tutorials/progress-bar-sequences
336+type ProgressBar struct {
337+ // State is the current state of the progress bar. It can be one of
338+ // [ProgressBarNone], [ProgressBarDefault], [ProgressBarError],
339+ // [ProgressBarIndeterminate], and [ProgressBarWarn].
340+ State ProgressBarState
341+ // Value is the current value of the progress bar. It should be between
342+ // 0 and 100.
343+ Value int
344+}
345+
346+// NewProgressBar returns a new progress bar with the given state and value.
347+// The value is ignored if the state is [ProgressBarNone] or
348+// [ProgressBarIndeterminate].
349+func NewProgressBar(state ProgressBarState, value int) *ProgressBar {
350+ return &ProgressBar{
351+ State: state,
352+ Value: min(max(value, 0), 100),
353+ }
354+}
355+
356+// Cursor represents a cursor on the terminal screen.
357+type Cursor struct {
358+ // Position is a [Position] that determines the cursor's position on the
359+ // screen relative to the top left corner of the frame.
360+ Position
361+
362+ // Color is a [color.Color] that determines the cursor's color.
363+ Color color.Color
364+
365+ // Shape is a [CursorShape] that determines the cursor's shape.
366+ Shape CursorShape
367+
368+ // Blink is a boolean that determines whether the cursor should blink.
369+ Blink bool
370+}
371+
372+// NewCursor returns a new cursor with the default settings and the given
373+// position.
374+func NewCursor(x, y int) *Cursor {
375+ return &Cursor{
376+ Position: Position{X: x, Y: y},
377+ Color: nil,
378+ Shape: CursorBlock,
379+ Blink: true,
380+ }
381+}
382+
383+// Cmd is an IO operation that returns a message when it's complete. If it's
384+// nil it's considered a no-op. Use it for things like HTTP requests, timers,
385+// saving and loading from disk, and so on.
386+//
387+// Note that there's almost never a reason to use a command to send a message
388+// to another part of your program. That can almost always be done in the
389+// update function.
390+type Cmd func() Msg
391+
392+// channelHandlers manages the series of channels returned by various processes.
393+// It allows us to wait for those processes to terminate before exiting the
394+// program.
395+type channelHandlers struct {
396+ handlers []chan struct{}
397+ mu sync.RWMutex
398+}
399+
400+// Adds a channel to the list of handlers. We wait for all handlers to terminate
401+// gracefully on shutdown.
402+func (h *channelHandlers) add(ch chan struct{}) {
403+ h.mu.Lock()
404+ h.handlers = append(h.handlers, ch)
405+ h.mu.Unlock()
406+}
407+
408+// shutdown waits for all handlers to terminate.
409+func (h *channelHandlers) shutdown() {
410+ var wg sync.WaitGroup
411+
412+ h.mu.RLock()
413+ defer h.mu.RUnlock()
414+
415+ for _, ch := range h.handlers {
416+ wg.Add(1)
417+ go func(ch chan struct{}) {
418+ <-ch
419+ wg.Done()
420+ }(ch)
421+ }
422+ wg.Wait()
423+}
424+
425+// Program is a terminal user interface.
426+type Program struct {
427+ // disableInput disables all input. This is useful for programs that
428+ // don't need input, like a progress bar or a spinner.
429+ disableInput bool
430+
431+ // disableSignalHandler disables the signal handler that Bubble Tea sets up
432+ // for Programs. This is useful if you want to handle signals yourself.
433+ disableSignalHandler bool
434+
435+ // disableCatchPanics disables the panic catching that Bubble Tea does by
436+ // default. If panic catching is disabled the terminal will be in a fairly
437+ // unusable state after a panic because Bubble Tea will not perform its usual
438+ // cleanup on exit.
439+ disableCatchPanics bool
440+
441+ // filter supplies an event filter that will be invoked before Bubble Tea
442+ // processes a tea.Msg. The event filter can return any tea.Msg which will
443+ // then get handled by Bubble Tea instead of the original event. If the
444+ // event filter returns nil, the event will be ignored and Bubble Tea will
445+ // not process it.
446+ //
447+ // As an example, this could be used to prevent a program from shutting
448+ // down if there are unsaved changes.
449+ //
450+ // Example:
451+ //
452+ // func filter(m tea.Model, msg tea.Msg) tea.Msg {
453+ // if _, ok := msg.(tea.QuitMsg); !ok {
454+ // return msg
455+ // }
456+ //
457+ // model := m.(myModel)
458+ // if model.hasChanges {
459+ // return nil
460+ // }
461+ //
462+ // return msg
463+ // }
464+ //
465+ // p := tea.NewProgram(Model{});
466+ // p.filter = filter
467+ //
468+ // if _,err := p.Run(context.Background()); err != nil {
469+ // fmt.Println("Error running program:", err)
470+ // os.Exit(1)
471+ // }
472+ filter func(Model, Msg) Msg
473+
474+ // fps sets a custom maximum fps at which the renderer should run. If less
475+ // than 1, the default value of 60 will be used. If over 120, the fps will
476+ // be capped at 120.
477+ fps int
478+
479+ // initialModel is the initial model for the program and is the only
480+ // required field when creating a new program.
481+ initialModel Model
482+
483+ // disableRenderer prevents the program from rendering to the terminal.
484+ // This can be useful for running daemon-like programs that don't require a
485+ // UI but still want to take advantage of Bubble Tea's architecture.
486+ disableRenderer bool
487+
488+ // handlers is a list of channels that need to be waited on before the
489+ // program can exit.
490+ handlers channelHandlers
491+
492+ // ctx is the programs's internal context for signalling internal teardown.
493+ // It is built and derived from the externalCtx in NewProgram().
494+ ctx context.Context
495+ cancel context.CancelFunc
496+
497+ // externalCtx is a context that was passed in via WithContext, otherwise defaulting
498+ // to ctx.Background() (in case it was not), the internal context is derived from it.
499+ externalCtx context.Context
500+
501+ msgs chan Msg
502+ errs chan error
503+ finished chan struct{}
504+ shutdownOnce sync.Once
505+
506+ profile *colorprofile.Profile // the terminal color profile
507+
508+ // where to send output, this will usually be os.Stdout.
509+ output io.Writer
510+ outputBuf bytes.Buffer // buffer used to queue commands to be sent to the output
511+
512+ // ttyOutput is null if output is not a TTY.
513+ ttyOutput term.File
514+ previousOutputState *term.State
515+ renderer renderer
516+
517+ // the environment variables for the program, defaults to os.Environ().
518+ environ uv.Environ
519+ // the program's logger for debugging.
520+ logger uv.Logger
521+
522+ // where to read inputs from, this will usually be os.Stdin.
523+ input io.Reader
524+ // ttyInput is null if input is not a TTY.
525+ ttyInput term.File
526+ previousTtyInputState *term.State
527+ cancelReader cancelreader.CancelReader
528+ inputScanner *uv.TerminalReader
529+ readLoopDone chan struct{}
530+
531+ // modes keeps track of terminal modes that have been enabled or disabled.
532+ ignoreSignals uint32
533+
534+ // ticker is the ticker that will be used to write to the renderer.
535+ ticker *time.Ticker
536+
537+ // once is used to stop the renderer.
538+ once sync.Once
539+
540+ // rendererDone is used to stop the renderer.
541+ rendererDone chan struct{}
542+
543+ // Initial window size. Mainly used for testing.
544+ width, height int
545+
546+ // whether to use hard tabs to optimize cursor movements
547+ useHardTabs bool
548+ // whether to use backspace to optimize cursor movements
549+ useBackspace bool
550+
551+ mu sync.Mutex
552+}
553+
554+// Quit is a special command that tells the Bubble Tea program to exit.
555+func Quit() Msg {
556+ return QuitMsg{}
557+}
558+
559+// QuitMsg signals that the program should quit. You can send a [QuitMsg] with
560+// [Quit].
561+type QuitMsg struct{}
562+
563+// Suspend is a special command that tells the Bubble Tea program to suspend.
564+func Suspend() Msg {
565+ return SuspendMsg{}
566+}
567+
568+// SuspendMsg signals the program should suspend.
569+// This usually happens when ctrl+z is pressed on common programs, but since
570+// bubbletea puts the terminal in raw mode, we need to handle it in a
571+// per-program basis.
572+//
573+// You can send this message with [Suspend()].
574+type SuspendMsg struct{}
575+
576+// ResumeMsg can be listen to do something once a program is resumed back
577+// from a suspend state.
578+type ResumeMsg struct{}
579+
580+// InterruptMsg signals the program should suspend.
581+// This usually happens when ctrl+c is pressed on common programs, but since
582+// bubbletea puts the terminal in raw mode, we need to handle it in a
583+// per-program basis.
584+//
585+// You can send this message with [Interrupt()].
586+type InterruptMsg struct{}
587+
588+// Interrupt is a special command that tells the Bubble Tea program to
589+// interrupt.
590+func Interrupt() Msg {
591+ return InterruptMsg{}
592+}
593+
594+// NewProgram creates a new [Program].
595+func NewProgram(model Model, opts ...ProgramOption) *Program {
596+ p := &Program{
597+ initialModel: model,
598+ msgs: make(chan Msg),
599+ errs: make(chan error, 1),
600+ rendererDone: make(chan struct{}),
601+ }
602+
603+ // Apply all options to the program.
604+ for _, opt := range opts {
605+ opt(p)
606+ }
607+
608+ // A context can be provided with a ProgramOption, but if none was provided
609+ // we'll use the default background context.
610+ if p.externalCtx == nil {
611+ p.externalCtx = context.Background()
612+ }
613+ // Initialize context and teardown channel.
614+ p.ctx, p.cancel = context.WithCancel(p.externalCtx)
615+
616+ // if no output was set, set it to stdout
617+ if p.output == nil {
618+ p.output = os.Stdout
619+ }
620+
621+ // if no environment was set, set it to os.Environ()
622+ if p.environ == nil {
623+ p.environ = os.Environ()
624+ }
625+
626+ if p.fps < 1 {
627+ p.fps = defaultFPS
628+ } else if p.fps > maxFPS {
629+ p.fps = maxFPS
630+ }
631+
632+ tracePath, traceOk := os.LookupEnv("TEA_TRACE")
633+ if traceOk && len(tracePath) > 0 {
634+ // We have a trace filepath.
635+ if f, err := os.OpenFile(tracePath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o600); err == nil {
636+ p.logger = log.New(f, "bubbletea: ", log.LstdFlags|log.Lshortfile)
637+ }
638+ }
639+
640+ return p
641+}
642+
643+func (p *Program) handleSignals() chan struct{} {
644+ ch := make(chan struct{})
645+
646+ // Listen for SIGINT and SIGTERM.
647+ //
648+ // In most cases ^C will not send an interrupt because the terminal will be
649+ // in raw mode and ^C will be captured as a keystroke and sent along to
650+ // Program.Update as a KeyMsg. When input is not a TTY, however, ^C will be
651+ // caught here.
652+ //
653+ // SIGTERM is sent by unix utilities (like kill) to terminate a process.
654+ go func() {
655+ sig := make(chan os.Signal, 1)
656+ signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
657+ defer func() {
658+ signal.Stop(sig)
659+ close(ch)
660+ }()
661+
662+ for {
663+ select {
664+ case <-p.ctx.Done():
665+ return
666+
667+ case s := <-sig:
668+ if atomic.LoadUint32(&p.ignoreSignals) == 0 {
669+ switch s {
670+ case syscall.SIGINT:
671+ p.msgs <- InterruptMsg{}
672+ default:
673+ p.msgs <- QuitMsg{}
674+ }
675+ return
676+ }
677+ }
678+ }
679+ }()
680+
681+ return ch
682+}
683+
684+// handleResize handles terminal resize events.
685+func (p *Program) handleResize() chan struct{} {
686+ ch := make(chan struct{})
687+
688+ if p.ttyOutput != nil {
689+ // Listen for window resizes.
690+ go p.listenForResize(ch)
691+ } else {
692+ close(ch)
693+ }
694+
695+ return ch
696+}
697+
698+// handleCommands runs commands in a goroutine and sends the result to the
699+// program's message channel.
700+func (p *Program) handleCommands(cmds chan Cmd) chan struct{} {
701+ ch := make(chan struct{})
702+
703+ go func() {
704+ defer close(ch)
705+
706+ for {
707+ select {
708+ case <-p.ctx.Done():
709+ return
710+
711+ case cmd := <-cmds:
712+ if cmd == nil {
713+ continue
714+ }
715+
716+ // Don't wait on these goroutines, otherwise the shutdown
717+ // latency would get too large as a Cmd can run for some time
718+ // (e.g. tick commands that sleep for half a second). It's not
719+ // possible to cancel them so we'll have to leak the goroutine
720+ // until Cmd returns.
721+ go func() {
722+ // Recover from panics.
723+ if !p.disableCatchPanics {
724+ defer func() {
725+ if r := recover(); r != nil {
726+ p.recoverFromPanic(r)
727+ }
728+ }()
729+ }
730+
731+ msg := cmd() // this can be long.
732+ p.Send(msg)
733+ }()
734+ }
735+ }
736+ }()
737+
738+ return ch
739+}
740+
741+// eventLoop is the central message loop. It receives and handles the default
742+// Bubble Tea messages, update the model and triggers redraws.
743+func (p *Program) eventLoop(model Model, cmds chan Cmd) (Model, error) {
744+ for {
745+ select {
746+ case <-p.ctx.Done():
747+ return model, nil
748+
749+ case err := <-p.errs:
750+ return model, err
751+
752+ case msg := <-p.msgs:
753+ msg = p.translateInputEvent(msg)
754+
755+ // Filter messages.
756+ if p.filter != nil {
757+ msg = p.filter(model, msg)
758+ }
759+ if msg == nil {
760+ continue
761+ }
762+
763+ // Handle special internal messages.
764+ switch msg := msg.(type) {
765+ case QuitMsg:
766+ return model, nil
767+
768+ case InterruptMsg:
769+ return model, ErrInterrupted
770+
771+ case SuspendMsg:
772+ if suspendSupported {
773+ p.suspend()
774+ }
775+
776+ case CapabilityMsg:
777+ switch msg.Content {
778+ case "RGB", "Tc":
779+ if *p.profile != colorprofile.TrueColor {
780+ tc := colorprofile.TrueColor
781+ p.profile = &tc
782+ go p.Send(ColorProfileMsg{*p.profile})
783+ }
784+ }
785+
786+ case ModeReportMsg:
787+ switch msg.Mode {
788+ case ansi.ModeSynchronizedOutput:
789+ if msg.Value == ansi.ModeReset {
790+ // The terminal supports synchronized output and it's
791+ // currently disabled, so we can enable it on the renderer.
792+ p.renderer.setSyncdUpdates(true)
793+ }
794+ case ansi.ModeUnicodeCore:
795+ if msg.Value == ansi.ModeReset || msg.Value == ansi.ModeSet || msg.Value == ansi.ModePermanentlySet {
796+ p.renderer.setWidthMethod(ansi.GraphemeWidth)
797+ }
798+ }
799+
800+ case MouseMsg:
801+ switch msg.(type) {
802+ case MouseClickMsg, MouseReleaseMsg, MouseWheelMsg, MouseMotionMsg:
803+ // Only send mouse messages to the renderer if they are an
804+ // actual mouse event.
805+ if cmd := p.renderer.onMouse(msg); cmd != nil {
806+ go p.Send(cmd())
807+ }
808+ }
809+
810+ case readClipboardMsg:
811+ p.execute(ansi.RequestSystemClipboard)
812+
813+ case setClipboardMsg:
814+ p.execute(ansi.SetSystemClipboard(string(msg)))
815+
816+ case readPrimaryClipboardMsg:
817+ p.execute(ansi.RequestPrimaryClipboard)
818+
819+ case setPrimaryClipboardMsg:
820+ p.execute(ansi.SetPrimaryClipboard(string(msg)))
821+
822+ case backgroundColorMsg:
823+ p.execute(ansi.RequestBackgroundColor)
824+
825+ case foregroundColorMsg:
826+ p.execute(ansi.RequestForegroundColor)
827+
828+ case cursorColorMsg:
829+ p.execute(ansi.RequestCursorColor)
830+
831+ case execMsg:
832+ // NB: this blocks.
833+ p.exec(msg.cmd, msg.fn)
834+
835+ case terminalVersion:
836+ p.execute(ansi.RequestNameVersion)
837+
838+ case requestCapabilityMsg:
839+ p.execute(ansi.RequestTermcap(string(msg)))
840+
841+ case BatchMsg:
842+ go p.execBatchMsg(msg)
843+ continue
844+
845+ case sequenceMsg:
846+ go p.execSequenceMsg(msg)
847+ continue
848+
849+ case WindowSizeMsg:
850+ p.renderer.resize(msg.Width, msg.Height)
851+
852+ case windowSizeMsg:
853+ go p.checkResize()
854+
855+ case requestCursorPosMsg:
856+ p.execute(ansi.RequestCursorPositionReport)
857+
858+ case RawMsg:
859+ p.execute(fmt.Sprint(msg.Msg))
860+
861+ case printLineMessage:
862+ p.renderer.insertAbove(msg.messageBody) //nolint:errcheck,gosec
863+
864+ case clearScreenMsg:
865+ p.renderer.clearScreen()
866+
867+ case ColorProfileMsg:
868+ p.renderer.setColorProfile(msg.Profile)
869+ }
870+
871+ var cmd Cmd
872+ model, cmd = model.Update(msg) // run update
873+
874+ select {
875+ case <-p.ctx.Done():
876+ return model, nil
877+ case cmds <- cmd: // process command (if any)
878+ }
879+
880+ p.render(model) // render view
881+ }
882+ }
883+}
884+
885+// render renders the given view to the renderer.
886+func (p *Program) render(model Model) {
887+ if p.renderer != nil {
888+ p.renderer.render(model.View()) // send view to renderer
889+ }
890+}
891+
892+func (p *Program) execSequenceMsg(msg sequenceMsg) {
893+ if !p.disableCatchPanics {
894+ defer func() {
895+ if r := recover(); r != nil {
896+ p.recoverFromGoPanic(r)
897+ }
898+ }()
899+ }
900+
901+ // Execute commands one at a time, in order.
902+ for _, cmd := range msg {
903+ if cmd == nil {
904+ continue
905+ }
906+ msg := cmd()
907+ switch msg := msg.(type) {
908+ case BatchMsg:
909+ p.execBatchMsg(msg)
910+ case sequenceMsg:
911+ p.execSequenceMsg(msg)
912+ default:
913+ p.Send(msg)
914+ }
915+ }
916+}
917+
918+func (p *Program) execBatchMsg(msg BatchMsg) {
919+ if !p.disableCatchPanics {
920+ defer func() {
921+ if r := recover(); r != nil {
922+ p.recoverFromGoPanic(r)
923+ }
924+ }()
925+ }
926+
927+ // Execute commands one at a time.
928+ var wg sync.WaitGroup
929+ for _, cmd := range msg {
930+ if cmd == nil {
931+ continue
932+ }
933+ wg.Add(1)
934+ go func() {
935+ defer wg.Done()
936+
937+ if !p.disableCatchPanics {
938+ defer func() {
939+ if r := recover(); r != nil {
940+ p.recoverFromGoPanic(r)
941+ }
942+ }()
943+ }
944+
945+ msg := cmd()
946+ switch msg := msg.(type) {
947+ case BatchMsg:
948+ p.execBatchMsg(msg)
949+ case sequenceMsg:
950+ p.execSequenceMsg(msg)
951+ default:
952+ p.Send(msg)
953+ }
954+ }()
955+ }
956+
957+ wg.Wait() // wait for all commands from batch msg to finish
958+}
959+
960+// shouldQuerySynchronizedOutput determines whether the terminal should be
961+// queried for various capabilities.
962+//
963+// This function checks for terminals that are known to support mode 2026,
964+// while excluding SSH sessions which may be unreliable, unless it's a
965+// known-good terminal like Windows Terminal.
966+//
967+// The function returns true for:
968+// - Terminals without TERM_PROGRAM set and not in SSH sessions
969+// - Windows Terminal (WT_SESSION is set)
970+// - Terminals with TERM_PROGRAM set (except Apple Terminal) and not in SSH sessions
971+// - Specific terminal types: ghostty, wezterm, alacritty, kitty, rio
972+func shouldQuerySynchronizedOutput(environ uv.Environ) bool {
973+ termType := environ.Getenv("TERM")
974+ termProg, okTermProg := environ.LookupEnv("TERM_PROGRAM")
975+ _, okSSHTTY := environ.LookupEnv("SSH_TTY")
976+ _, okWTSession := environ.LookupEnv("WT_SESSION")
977+
978+ return (!okTermProg && !okSSHTTY) ||
979+ okWTSession ||
980+ (okTermProg && !strings.Contains(termProg, "Apple") && !okSSHTTY) ||
981+ strings.Contains(termType, "ghostty") ||
982+ strings.Contains(termType, "wezterm") ||
983+ strings.Contains(termType, "alacritty") ||
984+ strings.Contains(termType, "kitty") ||
985+ strings.Contains(termType, "rio")
986+}
987+
988+// Run initializes the program and runs its event loops, blocking until it gets
989+// terminated by either [Program.Quit], [Program.Kill], or its signal handler.
990+// Returns the final model.
991+func (p *Program) Run() (returnModel Model, returnErr error) {
992+ if p.initialModel == nil {
993+ return nil, errors.New("bubbletea: InitialModel cannot be nil")
994+ }
995+
996+ // Initialize context and teardown channel.
997+ p.handlers = channelHandlers{}
998+ cmds := make(chan Cmd)
999+
1000+ p.finished = make(chan struct{})
1001+ defer func() {
1002+ close(p.finished)
1003+ }()
1004+
1005+ defer p.cancel()
1006+
1007+ if p.disableInput {
1008+ p.input = nil
1009+ } else if p.input == nil {
1010+ p.input = os.Stdin
1011+ if !term.IsTerminal(os.Stdin.Fd()) {
1012+ ttyIn, _, err := OpenTTY()
1013+ if err != nil {
1014+ return p.initialModel, fmt.Errorf("bubbletea: error opening TTY: %w", err)
1015+ }
1016+ p.input = ttyIn
1017+ }
1018+ }
1019+
1020+ // Handle signals.
1021+ if !p.disableSignalHandler {
1022+ p.handlers.add(p.handleSignals())
1023+ }
1024+
1025+ // Recover from panics.
1026+ if !p.disableCatchPanics {
1027+ defer func() {
1028+ if r := recover(); r != nil {
1029+ returnErr = fmt.Errorf("%w: %w", ErrProgramKilled, ErrProgramPanic)
1030+ p.recoverFromPanic(r)
1031+ }
1032+ }()
1033+ }
1034+
1035+ // Check if output is a TTY before entering raw mode, hiding the cursor and
1036+ // so on.
1037+ if err := p.initTerminal(); err != nil {
1038+ return p.initialModel, err
1039+ }
1040+
1041+ // Get the initial window size.
1042+ width, height := p.width, p.height
1043+ if p.ttyOutput != nil {
1044+ // Set the initial size of the terminal.
1045+ w, h, err := term.GetSize(p.ttyOutput.Fd())
1046+ if err != nil {
1047+ return p.initialModel, fmt.Errorf("bubbletea: error getting terminal size: %w", err)
1048+ }
1049+
1050+ width, height = w, h
1051+ }
1052+
1053+ p.width, p.height = width, height
1054+ resizeMsg := WindowSizeMsg{Width: p.width, Height: p.height}
1055+
1056+ if p.renderer == nil {
1057+ if p.disableRenderer {
1058+ p.renderer = &nilRenderer{}
1059+ } else {
1060+ // If no renderer is set use the cursed one.
1061+ r := newCursedRenderer(
1062+ p.output,
1063+ p.environ,
1064+ p.width,
1065+ p.height,
1066+ )
1067+ r.setLogger(p.logger)
1068+ // XXX: This breaks many things especially when we want the output
1069+ // to be compatible with terminals that are not necessary a TTY.
1070+ // This was originally done to work around a Wish emulated-pty
1071+ // issue where when a PTY session is detected, and we don't
1072+ // allocate a real PTY, the terminal settings (Termios and WinCon)
1073+ // don't change and the we end up working in cooked mode instead of
1074+ // raw mode. See issue #1572.
1075+ mapNl := runtime.GOOS != "windows" && p.ttyInput == nil
1076+ r.setOptimizations(p.useHardTabs, p.useBackspace, mapNl)
1077+ p.renderer = r
1078+ }
1079+ }
1080+
1081+ // Get the color profile and send it to the program.
1082+ if p.profile == nil {
1083+ cp := colorprofile.Detect(p.output, p.environ)
1084+ p.profile = &cp
1085+ }
1086+
1087+ // Set the color profile on the renderer and send it to the program.
1088+ p.renderer.setColorProfile(*p.profile)
1089+ go p.Send(ColorProfileMsg{*p.profile})
1090+
1091+ // Send the initial size to the program.
1092+ go p.Send(resizeMsg)
1093+ p.renderer.resize(resizeMsg.Width, resizeMsg.Height)
1094+
1095+ // Send the environment variables used by the program.
1096+ go p.Send(EnvMsg(p.environ))
1097+
1098+ // Init the input reader and initial model.
1099+ model := p.initialModel
1100+ if p.input != nil {
1101+ if err := p.initInputReader(false); err != nil {
1102+ return model, err
1103+ }
1104+ }
1105+
1106+ // Start the renderer.
1107+ p.startRenderer()
1108+
1109+ if !p.disableRenderer && shouldQuerySynchronizedOutput(p.environ) {
1110+ // Query for synchronized updates support (mode 2026) and unicode core
1111+ // (mode 2027). If the terminal supports it, the renderer will enable
1112+ // it once we get the response.
1113+ p.execute(ansi.RequestModeSynchronizedOutput +
1114+ ansi.RequestModeUnicodeCore)
1115+ }
1116+
1117+ // Initialize the program.
1118+ initCmd := model.Init()
1119+ if initCmd != nil {
1120+ ch := make(chan struct{})
1121+ p.handlers.add(ch)
1122+
1123+ go func() {
1124+ defer close(ch)
1125+
1126+ select {
1127+ case cmds <- initCmd:
1128+ case <-p.ctx.Done():
1129+ }
1130+ }()
1131+ }
1132+
1133+ // Render the initial view.
1134+ p.render(model)
1135+
1136+ // Handle resize events.
1137+ p.handlers.add(p.handleResize())
1138+
1139+ // Process commands.
1140+ p.handlers.add(p.handleCommands(cmds))
1141+
1142+ // Run event loop, handle updates and draw.
1143+ var err error
1144+ model, err = p.eventLoop(model, cmds)
1145+
1146+ if err == nil && len(p.errs) > 0 {
1147+ err = <-p.errs // Drain a leftover error in case eventLoop crashed.
1148+ }
1149+
1150+ killed := p.externalCtx.Err() != nil || p.ctx.Err() != nil || err != nil
1151+ if killed {
1152+ if err == nil && p.externalCtx.Err() != nil {
1153+ // Return also as context error the cancellation of an external context.
1154+ // This is the context the user knows about and should be able to act on.
1155+ err = fmt.Errorf("%w: %w", ErrProgramKilled, p.externalCtx.Err())
1156+ } else if err == nil && p.ctx.Err() != nil {
1157+ // Return only that the program was killed (not the internal mechanism).
1158+ // The user does not know or need to care about the internal program context.
1159+ err = ErrProgramKilled
1160+ } else {
1161+ // Return that the program was killed and also the error that caused it.
1162+ err = fmt.Errorf("%w: %w", ErrProgramKilled, err)
1163+ }
1164+ } else {
1165+ // Graceful shutdown of the program (not killed):
1166+ // Ensure we rendered the final state of the model.
1167+ p.render(model)
1168+ }
1169+
1170+ // Restore terminal state.
1171+ p.shutdown(killed)
1172+
1173+ return model, err
1174+}
1175+
1176+// Send sends a message to the main update function, effectively allowing
1177+// messages to be injected from outside the program for interoperability
1178+// purposes.
1179+//
1180+// If the program hasn't started yet this will be a blocking operation.
1181+// If the program has already been terminated this will be a no-op, so it's safe
1182+// to send messages after the program has exited.
1183+func (p *Program) Send(msg Msg) {
1184+ select {
1185+ case <-p.ctx.Done():
1186+ case p.msgs <- msg:
1187+ }
1188+}
1189+
1190+// Quit is a convenience function for quitting Bubble Tea programs. Use it
1191+// when you need to shut down a Bubble Tea program from the outside.
1192+//
1193+// If you wish to quit from within a Bubble Tea program use the Quit command.
1194+//
1195+// If the program is not running this will be a no-op, so it's safe to call
1196+// if the program is unstarted or has already exited.
1197+func (p *Program) Quit() {
1198+ p.Send(Quit())
1199+}
1200+
1201+// Kill stops the program immediately and restores the former terminal state.
1202+// The final render that you would normally see when quitting will be skipped.
1203+// [program.Run] returns a [ErrProgramKilled] error.
1204+func (p *Program) Kill() {
1205+ p.shutdown(true)
1206+}
1207+
1208+// Wait waits/blocks until the underlying Program finished shutting down.
1209+func (p *Program) Wait() {
1210+ <-p.finished
1211+}
1212+
1213+// execute writes the given sequence to the program output.
1214+func (p *Program) execute(seq string) {
1215+ p.mu.Lock()
1216+ _, _ = p.outputBuf.WriteString(seq)
1217+ p.mu.Unlock()
1218+}
1219+
1220+// flush flushes the output buffer to the program output.
1221+func (p *Program) flush() error {
1222+ p.mu.Lock()
1223+ defer p.mu.Unlock()
1224+
1225+ if p.outputBuf.Len() == 0 {
1226+ return nil
1227+ }
1228+ if p.logger != nil {
1229+ p.logger.Printf("output: %q", p.outputBuf.String())
1230+ }
1231+ _, err := p.output.Write(p.outputBuf.Bytes())
1232+ p.outputBuf.Reset()
1233+ if err != nil {
1234+ return fmt.Errorf("error writing to output: %w", err)
1235+ }
1236+ return nil
1237+}
1238+
1239+// shutdown performs operations to free up resources and restore the terminal
1240+// to its original state.
1241+func (p *Program) shutdown(kill bool) {
1242+ p.shutdownOnce.Do(func() {
1243+ p.cancel()
1244+
1245+ // Wait for all handlers to finish.
1246+ p.handlers.shutdown()
1247+
1248+ // Check if the cancel reader has been setup before waiting and closing.
1249+ if p.cancelReader != nil {
1250+ // Wait for input loop to finish.
1251+ if p.cancelReader.Cancel() {
1252+ if !kill {
1253+ p.waitForReadLoop()
1254+ }
1255+ }
1256+ _ = p.cancelReader.Close()
1257+ }
1258+
1259+ if p.renderer != nil {
1260+ p.stopRenderer(kill)
1261+ }
1262+
1263+ _ = p.restoreTerminalState()
1264+ })
1265+}
1266+
1267+// recoverFromPanic recovers from a panic, prints the stack trace, and restores
1268+// the terminal to a usable state.
1269+func (p *Program) recoverFromPanic(r interface{}) {
1270+ select {
1271+ case p.errs <- ErrProgramPanic:
1272+ default:
1273+ }
1274+ p.shutdown(true) // Ok to call here, p.Run() cannot do it anymore.
1275+ // We use "\r\n" to ensure the output is formatted even when restoring the
1276+ // terminal does not work or when raw mode is still active.
1277+ rec := strings.ReplaceAll(fmt.Sprintf("%s", r), "\n", "\r\n")
1278+ fmt.Fprintf(os.Stderr, "Caught panic:\r\n\r\n%s\r\n\r\nRestoring terminal...\r\n\r\n", rec)
1279+ stack := strings.ReplaceAll(fmt.Sprintf("%s\n", debug.Stack()), "\n", "\r\n")
1280+ fmt.Fprint(os.Stderr, stack)
1281+ if v, err := strconv.ParseBool(os.Getenv("TEA_DEBUG")); err == nil && v {
1282+ f, err := os.Create(fmt.Sprintf("bubbletea-panic-%d.log", time.Now().Unix()))
1283+ if err == nil {
1284+ defer f.Close() //nolint:errcheck
1285+ fmt.Fprintln(f, rec) //nolint:errcheck
1286+ fmt.Fprintln(f) //nolint:errcheck
1287+ fmt.Fprintln(f, stack) //nolint:errcheck
1288+ }
1289+ }
1290+}
1291+
1292+// recoverFromGoPanic recovers from a goroutine panic, prints a stack trace and
1293+// signals for the program to be killed and terminal restored to a usable state.
1294+func (p *Program) recoverFromGoPanic(r interface{}) {
1295+ select {
1296+ case p.errs <- ErrProgramPanic:
1297+ default:
1298+ }
1299+ p.cancel()
1300+ // We use "\r\n" to ensure the output is formatted even when restoring the
1301+ // terminal does not work or when raw mode is still active.
1302+ rec := strings.ReplaceAll(fmt.Sprintf("%s", r), "\n", "\r\n")
1303+ fmt.Fprintf(os.Stderr, "Caught panic:\r\n\r\n%s\r\n\r\nRestoring terminal...\r\n\r\n", rec)
1304+ stack := strings.ReplaceAll(fmt.Sprintf("%s\n", debug.Stack()), "\n", "\r\n")
1305+ fmt.Fprint(os.Stderr, stack)
1306+ if v, err := strconv.ParseBool(os.Getenv("TEA_DEBUG")); err == nil && v {
1307+ f, err := os.Create(fmt.Sprintf("bubbletea-panic-%d.log", time.Now().Unix()))
1308+ if err == nil {
1309+ defer f.Close() //nolint:errcheck
1310+ fmt.Fprintln(f, rec) //nolint:errcheck
1311+ fmt.Fprintln(f) //nolint:errcheck
1312+ fmt.Fprintln(f, stack) //nolint:errcheck
1313+ }
1314+ }
1315+}
1316+
1317+// ReleaseTerminal restores the original terminal state and cancels the input
1318+// reader. You can return control to the Program with RestoreTerminal.
1319+func (p *Program) ReleaseTerminal() error {
1320+ return p.releaseTerminal(false)
1321+}
1322+
1323+func (p *Program) releaseTerminal(reset bool) error {
1324+ atomic.StoreUint32(&p.ignoreSignals, 1)
1325+ if p.cancelReader != nil {
1326+ p.cancelReader.Cancel()
1327+ }
1328+
1329+ p.waitForReadLoop()
1330+
1331+ if p.renderer != nil {
1332+ p.stopRenderer(false)
1333+ if reset {
1334+ p.renderer.reset()
1335+ }
1336+ }
1337+
1338+ return p.restoreTerminalState()
1339+}
1340+
1341+// RestoreTerminal reinitializes the Program's input reader, restores the
1342+// terminal to the former state when the program was running, and repaints.
1343+// Use it to reinitialize a Program after running ReleaseTerminal.
1344+func (p *Program) RestoreTerminal() error {
1345+ atomic.StoreUint32(&p.ignoreSignals, 0)
1346+
1347+ if err := p.initTerminal(); err != nil {
1348+ return err
1349+ }
1350+ if p.input != nil {
1351+ if err := p.initInputReader(false); err != nil {
1352+ return err
1353+ }
1354+ }
1355+
1356+ p.startRenderer()
1357+
1358+ // If the output is a terminal, it may have been resized while another
1359+ // process was at the foreground, in which case we may not have received
1360+ // SIGWINCH. Detect any size change now and propagate the new size as
1361+ // needed.
1362+ go p.checkResize()
1363+
1364+ // Flush queued commands.
1365+ return p.flush()
1366+}
1367+
1368+// Println prints above the Program. This output is unmanaged by the program
1369+// and will persist across renders by the Program.
1370+//
1371+// If the altscreen is active no output will be printed.
1372+func (p *Program) Println(args ...any) {
1373+ p.msgs <- printLineMessage{
1374+ messageBody: fmt.Sprint(args...),
1375+ }
1376+}
1377+
1378+// Printf prints above the Program. It takes a format template followed by
1379+// values similar to fmt.Printf. This output is unmanaged by the program and
1380+// will persist across renders by the Program.
1381+//
1382+// Unlike fmt.Printf (but similar to log.Printf) the message will be print on
1383+// its own line.
1384+//
1385+// If the altscreen is active no output will be printed.
1386+func (p *Program) Printf(template string, args ...any) {
1387+ p.msgs <- printLineMessage{
1388+ messageBody: fmt.Sprintf(template, args...),
1389+ }
1390+}
1391+
1392+// startRenderer starts the renderer.
1393+func (p *Program) startRenderer() {
1394+ framerate := time.Second / time.Duration(p.fps)
1395+ if p.ticker == nil {
1396+ p.ticker = time.NewTicker(framerate)
1397+ } else {
1398+ // If the ticker already exists, it has been stopped and we need to
1399+ // reset it.
1400+ p.ticker.Reset(framerate)
1401+ }
1402+
1403+ // Since the renderer can be restarted after a stop, we need to reset
1404+ // the done channel and its corresponding sync.Once.
1405+ p.once = sync.Once{}
1406+
1407+ // Start the renderer.
1408+ p.renderer.start()
1409+ go func() {
1410+ for {
1411+ select {
1412+ case <-p.rendererDone:
1413+ p.ticker.Stop()
1414+ return
1415+
1416+ case <-p.ticker.C:
1417+ _ = p.flush()
1418+ _ = p.renderer.flush(false)
1419+ }
1420+ }
1421+ }()
1422+}
1423+
1424+// stopRenderer stops the renderer.
1425+// If kill is true, the renderer will be stopped immediately without flushing
1426+// the last frame.
1427+func (p *Program) stopRenderer(kill bool) {
1428+ // Stop the renderer before acquiring the mutex to avoid a deadlock.
1429+ p.once.Do(func() {
1430+ p.rendererDone <- struct{}{}
1431+ })
1432+
1433+ if !kill {
1434+ // flush locks the mutex
1435+ _ = p.renderer.flush(true)
1436+ }
1437+
1438+ _ = p.renderer.close()
1439+}
vendor/charm.land/bubbletea/v2/termcap.gonew file+48
@@ -0,0 +1,48 @@
1+package tea
2+
3+// requestCapabilityMsg is an internal message that requests the terminal to
4+// send its Termcap/Terminfo response.
5+type requestCapabilityMsg string
6+
7+// RequestCapability is a command that requests the terminal to send its
8+// Termcap/Terminfo response for the given capability.
9+//
10+// Bubble Tea recognizes the following capabilities and will use them to
11+// upgrade the program's color profile:
12+// - "RGB" Xterm direct color
13+// - "Tc" True color support
14+//
15+// Note: that some terminal's like Apple's Terminal.app do not support this and
16+// will send the wrong response to the terminal breaking the program's output.
17+//
18+// When the Bubble Tea advertises a non-TrueColor profile, you can use this
19+// command to query the terminal for its color capabilities. Example:
20+//
21+// switch msg := msg.(type) {
22+// case tea.ColorProfileMsg:
23+// if msg.Profile != colorprofile.TrueColor {
24+// return m, tea.Batch(
25+// tea.RequestCapability("RGB"),
26+// tea.RequestCapability("Tc"),
27+// )
28+// }
29+// }
30+func RequestCapability(s string) Cmd {
31+ return func() Msg {
32+ return requestCapabilityMsg(s)
33+ }
34+}
35+
36+// CapabilityMsg represents a Termcap/Terminfo response event. Termcap
37+// responses are generated by the terminal in response to RequestTermcap
38+// (XTGETTCAP) requests.
39+//
40+// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
41+type CapabilityMsg struct {
42+ Content string
43+}
44+
45+// String returns the capability content as a string.
46+func (c CapabilityMsg) String() string {
47+ return c.Content
48+}
vendor/charm.land/bubbletea/v2/termios_bsd.gonew file+13
@@ -0,0 +1,13 @@
1+//go:build dragonfly || freebsd
2+// +build dragonfly freebsd
3+
4+package tea
5+
6+import (
7+ "github.com/charmbracelet/x/term"
8+ "golang.org/x/sys/unix"
9+)
10+
11+func (p *Program) checkOptimizedMovements(s *term.State) {
12+ p.useHardTabs = s.Oflag&unix.TABDLY == unix.TAB0
13+}
vendor/charm.land/bubbletea/v2/termios_other.gonew file+8
@@ -0,0 +1,8 @@
1+//go:build !windows && !darwin && !dragonfly && !freebsd && !linux && !solaris && !aix
2+// +build !windows,!darwin,!dragonfly,!freebsd,!linux,!solaris,!aix
3+
4+package tea
5+
6+import "github.com/charmbracelet/x/term"
7+
8+func (*Program) checkOptimizedMovements(*term.State) {}
vendor/charm.land/bubbletea/v2/termios_unix.gonew file+14
@@ -0,0 +1,14 @@
1+//go:build darwin || linux || solaris || aix
2+// +build darwin linux solaris aix
3+
4+package tea
5+
6+import (
7+ "github.com/charmbracelet/x/term"
8+ "golang.org/x/sys/unix"
9+)
10+
11+func (p *Program) checkOptimizedMovements(s *term.State) {
12+ p.useHardTabs = s.Oflag&unix.TABDLY == unix.TAB0
13+ p.useBackspace = s.Lflag&unix.BSDLY == unix.BS0
14+}
vendor/charm.land/bubbletea/v2/termios_windows.gonew file+11
@@ -0,0 +1,11 @@
1+//go:build windows
2+// +build windows
3+
4+package tea
5+
6+import "github.com/charmbracelet/x/term"
7+
8+func (p *Program) checkOptimizedMovements(*term.State) {
9+ p.useHardTabs = true
10+ p.useBackspace = true
11+}
vendor/charm.land/bubbletea/v2/tty.gonew file+136
@@ -0,0 +1,136 @@
1+package tea
2+
3+import (
4+ "fmt"
5+ "os"
6+ "time"
7+
8+ uv "github.com/charmbracelet/ultraviolet"
9+ "github.com/charmbracelet/x/term"
10+)
11+
12+func (p *Program) suspend() {
13+ if err := p.releaseTerminal(true); err != nil {
14+ // If we can't release input, abort.
15+ return
16+ }
17+
18+ suspendProcess()
19+
20+ _ = p.RestoreTerminal()
21+ go p.Send(ResumeMsg{})
22+}
23+
24+func (p *Program) initTerminal() error {
25+ if p.disableRenderer {
26+ return nil
27+ }
28+ return p.initInput()
29+}
30+
31+// restoreTerminalState restores the terminal to the state prior to running the
32+// Bubble Tea program.
33+func (p *Program) restoreTerminalState() error {
34+ // Flush queued commands.
35+ _ = p.flush()
36+
37+ return p.restoreInput()
38+}
39+
40+// restoreInput restores the tty input to its original state.
41+func (p *Program) restoreInput() error {
42+ if p.ttyInput != nil && p.previousTtyInputState != nil {
43+ if err := term.Restore(p.ttyInput.Fd(), p.previousTtyInputState); err != nil {
44+ return fmt.Errorf("bubbletea: error restoring console: %w", err)
45+ }
46+ }
47+ if p.ttyOutput != nil && p.previousOutputState != nil {
48+ if err := term.Restore(p.ttyOutput.Fd(), p.previousOutputState); err != nil {
49+ return fmt.Errorf("bubbletea: error restoring console: %w", err)
50+ }
51+ }
52+ return nil
53+}
54+
55+// initInputReader (re)commences reading inputs.
56+func (p *Program) initInputReader(cancel bool) error {
57+ if cancel && p.cancelReader != nil {
58+ p.cancelReader.Cancel()
59+ p.waitForReadLoop()
60+ }
61+
62+ term := p.environ.Getenv("TERM")
63+
64+ // Initialize the input reader.
65+ // This need to be done after the terminal has been initialized and set to
66+ // raw mode.
67+
68+ var err error
69+ p.cancelReader, err = uv.NewCancelReader(p.input)
70+ if err != nil {
71+ return fmt.Errorf("bubbletea: could not create cancelable reader: %w", err)
72+ }
73+
74+ drv := uv.NewTerminalReader(p.cancelReader, term)
75+ drv.SetLogger(p.logger)
76+ p.inputScanner = drv
77+ p.readLoopDone = make(chan struct{})
78+
79+ go p.readLoop()
80+
81+ return nil
82+}
83+
84+func (p *Program) readLoop() {
85+ defer close(p.readLoopDone)
86+
87+ if err := p.inputScanner.StreamEvents(p.ctx, p.msgs); err != nil {
88+ select {
89+ case <-p.ctx.Done():
90+ return
91+ case p.errs <- err:
92+ }
93+ }
94+}
95+
96+// waitForReadLoop waits for the cancelReader to finish its read loop.
97+func (p *Program) waitForReadLoop() {
98+ select {
99+ case <-p.readLoopDone:
100+ case <-time.After(500 * time.Millisecond): //nolint:mnd
101+ // The read loop hangs, which means the input
102+ // cancelReader's cancel function has returned true even
103+ // though it was not able to cancel the read.
104+ }
105+}
106+
107+// checkResize detects the current size of the output and informs the program
108+// via a WindowSizeMsg.
109+func (p *Program) checkResize() {
110+ if p.ttyOutput == nil {
111+ // can't query window size
112+ return
113+ }
114+
115+ w, h, err := term.GetSize(p.ttyOutput.Fd())
116+ if err != nil {
117+ select {
118+ case <-p.ctx.Done():
119+ case p.errs <- err:
120+ }
121+
122+ return
123+ }
124+
125+ p.width, p.height = w, h
126+ p.Send(WindowSizeMsg{Width: w, Height: h})
127+}
128+
129+// OpenTTY opens the running terminal's TTY for reading and writing.
130+func OpenTTY() (*os.File, *os.File, error) {
131+ in, out, err := uv.OpenTTY()
132+ if err != nil {
133+ return nil, nil, fmt.Errorf("bubbletea: could not open TTY: %w", err)
134+ }
135+ return in, out, nil
136+}
vendor/charm.land/bubbletea/v2/tty_unix.gonew file+47
@@ -0,0 +1,47 @@
1+//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || aix || zos
2+// +build darwin dragonfly freebsd linux netbsd openbsd solaris aix zos
3+
4+package tea
5+
6+import (
7+ "fmt"
8+ "os"
9+ "os/signal"
10+ "syscall"
11+
12+ "github.com/charmbracelet/x/term"
13+)
14+
15+func (p *Program) initInput() (err error) {
16+ // Check if input is a terminal
17+ if f, ok := p.input.(term.File); ok && term.IsTerminal(f.Fd()) {
18+ p.ttyInput = f
19+ p.previousTtyInputState, err = term.MakeRaw(p.ttyInput.Fd())
20+ if err != nil {
21+ return fmt.Errorf("error entering raw mode: %w", err)
22+ }
23+
24+ // OPTIM: We can use hard tabs and backspaces to optimize cursor
25+ // movements. This is based on termios settings support and whether
26+ // they exist and enabled.
27+ p.checkOptimizedMovements(p.previousTtyInputState)
28+ }
29+
30+ if f, ok := p.output.(term.File); ok && term.IsTerminal(f.Fd()) {
31+ p.ttyOutput = f
32+ }
33+
34+ return nil
35+}
36+
37+const suspendSupported = true
38+
39+// Send SIGTSTP to the entire process group.
40+func suspendProcess() {
41+ c := make(chan os.Signal, 1)
42+ signal.Notify(c, syscall.SIGCONT)
43+ defer signal.Stop(c)
44+ _ = syscall.Kill(0, syscall.SIGTSTP)
45+ // blocks until a CONT happens...
46+ <-c
47+}
vendor/charm.land/bubbletea/v2/tty_windows.gonew file+64
@@ -0,0 +1,64 @@
1+//go:build windows
2+// +build windows
3+
4+package tea
5+
6+import (
7+ "fmt"
8+
9+ "github.com/charmbracelet/x/term"
10+ "golang.org/x/sys/windows"
11+)
12+
13+func (p *Program) initInput() (err error) {
14+ // Save stdin state and enable VT input
15+ // We also need to enable VT
16+ // input here.
17+ if f, ok := p.input.(term.File); ok && term.IsTerminal(f.Fd()) {
18+ p.ttyInput = f
19+ p.previousTtyInputState, err = term.MakeRaw(p.ttyInput.Fd())
20+ if err != nil {
21+ return fmt.Errorf("error making terminal raw: %w", err)
22+ }
23+
24+ // Enable VT input
25+ var mode uint32
26+ if err := windows.GetConsoleMode(windows.Handle(p.ttyInput.Fd()), &mode); err != nil {
27+ return fmt.Errorf("error getting console mode: %w", err)
28+ }
29+
30+ if err := windows.SetConsoleMode(windows.Handle(p.ttyInput.Fd()), mode|windows.ENABLE_VIRTUAL_TERMINAL_INPUT); err != nil {
31+ return fmt.Errorf("error setting console mode: %w", err)
32+ }
33+ }
34+
35+ // Save output screen buffer state and enable VT processing.
36+ if f, ok := p.output.(term.File); ok && term.IsTerminal(f.Fd()) {
37+ p.ttyOutput = f
38+ p.previousOutputState, err = term.GetState(f.Fd())
39+ if err != nil {
40+ return fmt.Errorf("error getting terminal state: %w", err)
41+ }
42+
43+ var mode uint32
44+ if err := windows.GetConsoleMode(windows.Handle(p.ttyOutput.Fd()), &mode); err != nil {
45+ return fmt.Errorf("error getting console mode: %w", err)
46+ }
47+
48+ if err := windows.SetConsoleMode(windows.Handle(p.ttyOutput.Fd()),
49+ mode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING|
50+ windows.DISABLE_NEWLINE_AUTO_RETURN); err != nil {
51+ return fmt.Errorf("error setting console mode: %w", err)
52+ }
53+
54+ //nolint:godox
55+ // TODO: check if we can optimize cursor movements on Windows.
56+ p.checkOptimizedMovements(p.previousOutputState)
57+ }
58+
59+ return //nolint:nakedret
60+}
61+
62+const suspendSupported = false
63+
64+func suspendProcess() {}
vendor/charm.land/bubbletea/v2/xterm.gonew file+22
@@ -0,0 +1,22 @@
1+package tea
2+
3+// TerminalVersionMsg is a message that represents the terminal version.
4+type TerminalVersionMsg struct {
5+ Name string
6+}
7+
8+// String returns the terminal name as a string.
9+func (t TerminalVersionMsg) String() string {
10+ return t.Name
11+}
12+
13+// terminalVersion is an internal message that queries the terminal for its
14+// version using XTVERSION.
15+type terminalVersion struct{}
16+
17+// RequestTerminalVersion is a command that queries the terminal for its
18+// version using XTVERSION. Note that some terminals may not support this
19+// command.
20+func RequestTerminalVersion() Msg {
21+ return terminalVersion{}
22+}
vendor/charm.land/catwalk/LICENSEnew file+21
@@ -0,0 +1,21 @@
1+MIT License
2+
3+Copyright (c) 2025 Charmbracelet, Inc
4+
5+Permission is hereby granted, free of charge, to any person obtaining a copy
6+of this software and associated documentation files (the "Software"), to deal
7+in the Software without restriction, including without limitation the rights
8+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+copies of the Software, and to permit persons to whom the Software is
10+furnished to do so, subject to the following conditions:
11+
12+The above copyright notice and this permission notice shall be included in all
13+copies or substantial portions of the Software.
14+
15+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+SOFTWARE.
vendor/charm.land/catwalk/internal/providers/configs/aihubmix.jsonnew file+3746
@@ -0,0 +1,3746 @@
1+{
2+ "name": "AIHubMix",
3+ "id": "aihubmix",
4+ "api_key": "$AIHUBMIX_API_KEY",
5+ "api_endpoint": "https://aihubmix.com/v1",
6+ "type": "openai-compat",
7+ "default_large_model_id": "gpt-5",
8+ "default_small_model_id": "gpt-5-nano",
9+ "models": [
10+ {
11+ "id": "AiHubmix-Phi-4-mini-reasoning",
12+ "name": "Aihubmix Phi 4 Mini (reasoning)",
13+ "cost_per_1m_in": 0.12,
14+ "cost_per_1m_out": 0.12,
15+ "cost_per_1m_in_cached": 0,
16+ "cost_per_1m_out_cached": 0,
17+ "context_window": 128000,
18+ "default_max_tokens": 4000,
19+ "can_reason": false,
20+ "supports_attachments": false
21+ },
22+ {
23+ "id": "ByteDance-Seed/Seed-OSS-36B-Instruct",
24+ "name": "Seed Oss 36B Instruct",
25+ "cost_per_1m_in": 0.2,
26+ "cost_per_1m_out": 0.534,
27+ "cost_per_1m_in_cached": 0,
28+ "cost_per_1m_out_cached": 0,
29+ "context_window": 256000,
30+ "default_max_tokens": 32000,
31+ "can_reason": false,
32+ "supports_attachments": true
33+ },
34+ {
35+ "id": "DeepSeek-R1",
36+ "name": "DeepSeek R1",
37+ "cost_per_1m_in": 0.4,
38+ "cost_per_1m_out": 2,
39+ "cost_per_1m_in_cached": 0,
40+ "cost_per_1m_out_cached": 0,
41+ "context_window": 1638000,
42+ "default_max_tokens": 163800,
43+ "can_reason": false,
44+ "supports_attachments": false
45+ },
46+ {
47+ "id": "DeepSeek-V3",
48+ "name": "DeepSeek V3",
49+ "cost_per_1m_in": 0.272,
50+ "cost_per_1m_out": 1.088,
51+ "cost_per_1m_in_cached": 0,
52+ "cost_per_1m_out_cached": 0,
53+ "context_window": 1638000,
54+ "default_max_tokens": 163800,
55+ "can_reason": false,
56+ "supports_attachments": false
57+ },
58+ {
59+ "id": "DeepSeek-V3-Fast",
60+ "name": "DeepSeek V3 Fast",
61+ "cost_per_1m_in": 0.56,
62+ "cost_per_1m_out": 2.24,
63+ "cost_per_1m_in_cached": 0,
64+ "cost_per_1m_out_cached": 0,
65+ "context_window": 32000,
66+ "default_max_tokens": 3200,
67+ "can_reason": false,
68+ "supports_attachments": false
69+ },
70+ {
71+ "id": "DeepSeek-V3.1-Terminus",
72+ "name": "DeepSeek V3.1 Terminus",
73+ "cost_per_1m_in": 0.56,
74+ "cost_per_1m_out": 1.68,
75+ "cost_per_1m_in_cached": 0,
76+ "cost_per_1m_out_cached": 0,
77+ "context_window": 160000,
78+ "default_max_tokens": 32000,
79+ "can_reason": false,
80+ "supports_attachments": false
81+ },
82+ {
83+ "id": "DeepSeek-V3.1-Think",
84+ "name": "DeepSeek V3.1 Thinking",
85+ "cost_per_1m_in": 0.56,
86+ "cost_per_1m_out": 1.68,
87+ "cost_per_1m_in_cached": 0,
88+ "cost_per_1m_out_cached": 0,
89+ "context_window": 128000,
90+ "default_max_tokens": 32000,
91+ "can_reason": true,
92+ "reasoning_levels": [
93+ "low",
94+ "medium",
95+ "high"
96+ ],
97+ "default_reasoning_effort": "medium",
98+ "supports_attachments": false
99+ },
100+ {
101+ "id": "ERNIE-X1.1-Preview",
102+ "name": "ERNIE X1.1 Preview",
103+ "cost_per_1m_in": 0.136,
104+ "cost_per_1m_out": 0.544,
105+ "cost_per_1m_in_cached": 0,
106+ "cost_per_1m_out_cached": 0,
107+ "context_window": 119000,
108+ "default_max_tokens": 11900,
109+ "can_reason": true,
110+ "reasoning_levels": [
111+ "low",
112+ "medium",
113+ "high"
114+ ],
115+ "default_reasoning_effort": "medium",
116+ "supports_attachments": false
117+ },
118+ {
119+ "id": "aihub-Phi-4-mini-instruct",
120+ "name": "Aihub Phi 4 Mini Instruct",
121+ "cost_per_1m_in": 0.12,
122+ "cost_per_1m_out": 0.48,
123+ "cost_per_1m_in_cached": 0,
124+ "cost_per_1m_out_cached": 0,
125+ "context_window": 128000,
126+ "default_max_tokens": 4000,
127+ "can_reason": false,
128+ "supports_attachments": false
129+ },
130+ {
131+ "id": "aihub-Phi-4-multimodal-instruct",
132+ "name": "Aihub Phi 4 Multimodal Instruct",
133+ "cost_per_1m_in": 0.12,
134+ "cost_per_1m_out": 0.48,
135+ "cost_per_1m_in_cached": 0,
136+ "cost_per_1m_out_cached": 0,
137+ "context_window": 128000,
138+ "default_max_tokens": 4000,
139+ "can_reason": false,
140+ "supports_attachments": true
141+ },
142+ {
143+ "id": "anthropic-opus-4-6",
144+ "name": "Anthropic Opus 4.6",
145+ "cost_per_1m_in": 5,
146+ "cost_per_1m_out": 25,
147+ "cost_per_1m_in_cached": 6.25,
148+ "cost_per_1m_out_cached": 0.5,
149+ "context_window": 200000,
150+ "default_max_tokens": 32000,
151+ "can_reason": true,
152+ "reasoning_levels": [
153+ "low",
154+ "medium",
155+ "high"
156+ ],
157+ "default_reasoning_effort": "medium",
158+ "supports_attachments": true
159+ },
160+ {
161+ "id": "auto",
162+ "name": "Auto",
163+ "cost_per_1m_in": 2,
164+ "cost_per_1m_out": 2,
165+ "cost_per_1m_in_cached": 0,
166+ "cost_per_1m_out_cached": 0,
167+ "context_window": 1000000,
168+ "default_max_tokens": 100000,
169+ "can_reason": true,
170+ "reasoning_levels": [
171+ "low",
172+ "medium",
173+ "high"
174+ ],
175+ "default_reasoning_effort": "medium",
176+ "supports_attachments": true
177+ },
178+ {
179+ "id": "claude-3-7-sonnet",
180+ "name": "Claude 3.7 Sonnet",
181+ "cost_per_1m_in": 3.3,
182+ "cost_per_1m_out": 16.5,
183+ "cost_per_1m_in_cached": 0,
184+ "cost_per_1m_out_cached": 0,
185+ "context_window": 200000,
186+ "default_max_tokens": 20000,
187+ "can_reason": true,
188+ "reasoning_levels": [
189+ "low",
190+ "medium",
191+ "high"
192+ ],
193+ "default_reasoning_effort": "medium",
194+ "supports_attachments": true
195+ },
196+ {
197+ "id": "claude-fable-5",
198+ "name": "Claude Fable 5",
199+ "cost_per_1m_in": 11,
200+ "cost_per_1m_out": 55,
201+ "cost_per_1m_in_cached": 13.75,
202+ "cost_per_1m_out_cached": 1.1,
203+ "context_window": 1000000,
204+ "default_max_tokens": 128000,
205+ "can_reason": true,
206+ "reasoning_levels": [
207+ "low",
208+ "medium",
209+ "high"
210+ ],
211+ "default_reasoning_effort": "medium",
212+ "supports_attachments": true
213+ },
214+ {
215+ "id": "claude-haiku-4-5",
216+ "name": "Claude Haiku 4.5",
217+ "cost_per_1m_in": 1.1,
218+ "cost_per_1m_out": 5.5,
219+ "cost_per_1m_in_cached": 1.375,
220+ "cost_per_1m_out_cached": 0.11,
221+ "context_window": 204800,
222+ "default_max_tokens": 20480,
223+ "can_reason": true,
224+ "reasoning_levels": [
225+ "low",
226+ "medium",
227+ "high"
228+ ],
229+ "default_reasoning_effort": "medium",
230+ "supports_attachments": true
231+ },
232+ {
233+ "id": "claude-opus-4-1",
234+ "name": "Claude Opus 4.1",
235+ "cost_per_1m_in": 16.5,
236+ "cost_per_1m_out": 82.5,
237+ "cost_per_1m_in_cached": 0,
238+ "cost_per_1m_out_cached": 0,
239+ "context_window": 200000,
240+ "default_max_tokens": 32000,
241+ "can_reason": true,
242+ "reasoning_levels": [
243+ "low",
244+ "medium",
245+ "high"
246+ ],
247+ "default_reasoning_effort": "medium",
248+ "supports_attachments": true
249+ },
250+ {
251+ "id": "claude-opus-4-5",
252+ "name": "Claude Opus 4.5",
253+ "cost_per_1m_in": 5,
254+ "cost_per_1m_out": 25,
255+ "cost_per_1m_in_cached": 6.25,
256+ "cost_per_1m_out_cached": 0.5,
257+ "context_window": 200000,
258+ "default_max_tokens": 32000,
259+ "can_reason": true,
260+ "reasoning_levels": [
261+ "low",
262+ "medium",
263+ "high"
264+ ],
265+ "default_reasoning_effort": "medium",
266+ "supports_attachments": true
267+ },
268+ {
269+ "id": "claude-opus-4-5-think",
270+ "name": "Claude Opus 4.5 Thinking",
271+ "cost_per_1m_in": 5,
272+ "cost_per_1m_out": 25,
273+ "cost_per_1m_in_cached": 6.25,
274+ "cost_per_1m_out_cached": 0.5,
275+ "context_window": 200000,
276+ "default_max_tokens": 32000,
277+ "can_reason": true,
278+ "reasoning_levels": [
279+ "low",
280+ "medium",
281+ "high"
282+ ],
283+ "default_reasoning_effort": "medium",
284+ "supports_attachments": true
285+ },
286+ {
287+ "id": "claude-opus-4-6",
288+ "name": "Claude Opus 4.6",
289+ "cost_per_1m_in": 5,
290+ "cost_per_1m_out": 25,
291+ "cost_per_1m_in_cached": 6.25,
292+ "cost_per_1m_out_cached": 0.5,
293+ "context_window": 200000,
294+ "default_max_tokens": 32000,
295+ "can_reason": true,
296+ "reasoning_levels": [
297+ "low",
298+ "medium",
299+ "high"
300+ ],
301+ "default_reasoning_effort": "medium",
302+ "supports_attachments": true
303+ },
304+ {
305+ "id": "claude-opus-4-6-think",
306+ "name": "Claude Opus 4.6 Thinking",
307+ "cost_per_1m_in": 5,
308+ "cost_per_1m_out": 25,
309+ "cost_per_1m_in_cached": 6.25,
310+ "cost_per_1m_out_cached": 0.5,
311+ "context_window": 200000,
312+ "default_max_tokens": 32000,
313+ "can_reason": true,
314+ "reasoning_levels": [
315+ "low",
316+ "medium",
317+ "high"
318+ ],
319+ "default_reasoning_effort": "medium",
320+ "supports_attachments": true
321+ },
322+ {
323+ "id": "claude-opus-4-7",
324+ "name": "Claude Opus 4.7",
325+ "cost_per_1m_in": 5,
326+ "cost_per_1m_out": 25,
327+ "cost_per_1m_in_cached": 6.25,
328+ "cost_per_1m_out_cached": 0.5,
329+ "context_window": 200000,
330+ "default_max_tokens": 32000,
331+ "can_reason": true,
332+ "reasoning_levels": [
333+ "low",
334+ "medium",
335+ "high"
336+ ],
337+ "default_reasoning_effort": "medium",
338+ "supports_attachments": true
339+ },
340+ {
341+ "id": "claude-opus-4-7-think",
342+ "name": "Claude Opus 4.7 Thinking",
343+ "cost_per_1m_in": 5,
344+ "cost_per_1m_out": 25,
345+ "cost_per_1m_in_cached": 6.25,
346+ "cost_per_1m_out_cached": 0.5,
347+ "context_window": 200000,
348+ "default_max_tokens": 32000,
349+ "can_reason": true,
350+ "reasoning_levels": [
351+ "low",
352+ "medium",
353+ "high"
354+ ],
355+ "default_reasoning_effort": "medium",
356+ "supports_attachments": true
357+ },
358+ {
359+ "id": "claude-opus-4-8",
360+ "name": "Claude Opus 4.8",
361+ "cost_per_1m_in": 5,
362+ "cost_per_1m_out": 25,
363+ "cost_per_1m_in_cached": 6.25,
364+ "cost_per_1m_out_cached": 0.5,
365+ "context_window": 200000,
366+ "default_max_tokens": 32000,
367+ "can_reason": true,
368+ "reasoning_levels": [
369+ "low",
370+ "medium",
371+ "high"
372+ ],
373+ "default_reasoning_effort": "medium",
374+ "supports_attachments": true
375+ },
376+ {
377+ "id": "claude-opus-4-8-think",
378+ "name": "Claude Opus 4.8 Thinking",
379+ "cost_per_1m_in": 5,
380+ "cost_per_1m_out": 25,
381+ "cost_per_1m_in_cached": 6.25,
382+ "cost_per_1m_out_cached": 0.5,
383+ "context_window": 200000,
384+ "default_max_tokens": 32000,
385+ "can_reason": true,
386+ "reasoning_levels": [
387+ "low",
388+ "medium",
389+ "high"
390+ ],
391+ "default_reasoning_effort": "medium",
392+ "supports_attachments": true
393+ },
394+ {
395+ "id": "claude-sonnet-4-5",
396+ "name": "Claude Sonnet 4.5",
397+ "cost_per_1m_in": 3.3,
398+ "cost_per_1m_out": 16.5,
399+ "cost_per_1m_in_cached": 4.125,
400+ "cost_per_1m_out_cached": 0.33,
401+ "context_window": 1000000,
402+ "default_max_tokens": 64000,
403+ "can_reason": true,
404+ "reasoning_levels": [
405+ "low",
406+ "medium",
407+ "high"
408+ ],
409+ "default_reasoning_effort": "medium",
410+ "supports_attachments": true
411+ },
412+ {
413+ "id": "claude-sonnet-4-5-think",
414+ "name": "Claude Sonnet 4.5 Thinking",
415+ "cost_per_1m_in": 3.3,
416+ "cost_per_1m_out": 16.5,
417+ "cost_per_1m_in_cached": 4.125,
418+ "cost_per_1m_out_cached": 0.33,
419+ "context_window": 1000000,
420+ "default_max_tokens": 64000,
421+ "can_reason": true,
422+ "reasoning_levels": [
423+ "low",
424+ "medium",
425+ "high"
426+ ],
427+ "default_reasoning_effort": "medium",
428+ "supports_attachments": true
429+ },
430+ {
431+ "id": "claude-sonnet-4-6",
432+ "name": "Claude Sonnet 4.6",
433+ "cost_per_1m_in": 3,
434+ "cost_per_1m_out": 15,
435+ "cost_per_1m_in_cached": 3.75,
436+ "cost_per_1m_out_cached": 0.3,
437+ "context_window": 1000000,
438+ "default_max_tokens": 64000,
439+ "can_reason": true,
440+ "reasoning_levels": [
441+ "low",
442+ "medium",
443+ "high"
444+ ],
445+ "default_reasoning_effort": "medium",
446+ "supports_attachments": true
447+ },
448+ {
449+ "id": "claude-sonnet-4-6-think",
450+ "name": "Claude Sonnet 4.6 Thinking",
451+ "cost_per_1m_in": 3,
452+ "cost_per_1m_out": 15,
453+ "cost_per_1m_in_cached": 3.75,
454+ "cost_per_1m_out_cached": 0.3,
455+ "context_window": 200000,
456+ "default_max_tokens": 32000,
457+ "can_reason": true,
458+ "reasoning_levels": [
459+ "low",
460+ "medium",
461+ "high"
462+ ],
463+ "default_reasoning_effort": "medium",
464+ "supports_attachments": true
465+ },
466+ {
467+ "id": "claude-sonnet-5",
468+ "name": "Claude Sonnet 5",
469+ "cost_per_1m_in": 2,
470+ "cost_per_1m_out": 10,
471+ "cost_per_1m_in_cached": 2.5,
472+ "cost_per_1m_out_cached": 0.2,
473+ "context_window": 1000000,
474+ "default_max_tokens": 128000,
475+ "can_reason": true,
476+ "reasoning_levels": [
477+ "low",
478+ "medium",
479+ "high"
480+ ],
481+ "default_reasoning_effort": "medium",
482+ "supports_attachments": true
483+ },
484+ {
485+ "id": "coding-glm-4.6-free",
486+ "name": "Coding GLM 4.6 (free)",
487+ "cost_per_1m_in": 0,
488+ "cost_per_1m_out": 0,
489+ "cost_per_1m_in_cached": 0,
490+ "cost_per_1m_out_cached": 0,
491+ "context_window": 200000,
492+ "default_max_tokens": 20000,
493+ "can_reason": true,
494+ "reasoning_levels": [
495+ "low",
496+ "medium",
497+ "high"
498+ ],
499+ "default_reasoning_effort": "medium",
500+ "supports_attachments": false
501+ },
502+ {
503+ "id": "coding-minimax-m2",
504+ "name": "Coding MiniMax M2",
505+ "cost_per_1m_in": 0.2,
506+ "cost_per_1m_out": 0.2,
507+ "cost_per_1m_in_cached": 0,
508+ "cost_per_1m_out_cached": 0,
509+ "context_window": 204800,
510+ "default_max_tokens": 13100,
511+ "can_reason": true,
512+ "reasoning_levels": [
513+ "low",
514+ "medium",
515+ "high"
516+ ],
517+ "default_reasoning_effort": "medium",
518+ "supports_attachments": false
519+ },
520+ {
521+ "id": "coding-minimax-m2-free",
522+ "name": "Coding MiniMax M2 (free)",
523+ "cost_per_1m_in": 0,
524+ "cost_per_1m_out": 0,
525+ "cost_per_1m_in_cached": 0,
526+ "cost_per_1m_out_cached": 0,
527+ "context_window": 204800,
528+ "default_max_tokens": 13100,
529+ "can_reason": true,
530+ "reasoning_levels": [
531+ "low",
532+ "medium",
533+ "high"
534+ ],
535+ "default_reasoning_effort": "medium",
536+ "supports_attachments": false
537+ },
538+ {
539+ "id": "coding-minimax-m2.1",
540+ "name": "Coding MiniMax M2.1",
541+ "cost_per_1m_in": 0.2,
542+ "cost_per_1m_out": 0.2,
543+ "cost_per_1m_in_cached": 0,
544+ "cost_per_1m_out_cached": 0,
545+ "context_window": 204800,
546+ "default_max_tokens": 13100,
547+ "can_reason": true,
548+ "reasoning_levels": [
549+ "low",
550+ "medium",
551+ "high"
552+ ],
553+ "default_reasoning_effort": "medium",
554+ "supports_attachments": false
555+ },
556+ {
557+ "id": "coding-minimax-m2.1-free",
558+ "name": "Coding MiniMax M2.1 (free)",
559+ "cost_per_1m_in": 0,
560+ "cost_per_1m_out": 0,
561+ "cost_per_1m_in_cached": 0,
562+ "cost_per_1m_out_cached": 0,
563+ "context_window": 204800,
564+ "default_max_tokens": 13100,
565+ "can_reason": true,
566+ "reasoning_levels": [
567+ "low",
568+ "medium",
569+ "high"
570+ ],
571+ "default_reasoning_effort": "medium",
572+ "supports_attachments": false
573+ },
574+ {
575+ "id": "coding-minimax-m2.5",
576+ "name": "Coding MiniMax M2.5",
577+ "cost_per_1m_in": 0.2,
578+ "cost_per_1m_out": 0.2,
579+ "cost_per_1m_in_cached": 0,
580+ "cost_per_1m_out_cached": 0,
581+ "context_window": 204800,
582+ "default_max_tokens": 13100,
583+ "can_reason": true,
584+ "reasoning_levels": [
585+ "low",
586+ "medium",
587+ "high"
588+ ],
589+ "default_reasoning_effort": "medium",
590+ "supports_attachments": false
591+ },
592+ {
593+ "id": "coding-minimax-m2.5-free",
594+ "name": "Coding MiniMax M2.5 (free)",
595+ "cost_per_1m_in": 0,
596+ "cost_per_1m_out": 0,
597+ "cost_per_1m_in_cached": 0,
598+ "cost_per_1m_out_cached": 0,
599+ "context_window": 204800,
600+ "default_max_tokens": 13100,
601+ "can_reason": true,
602+ "reasoning_levels": [
603+ "low",
604+ "medium",
605+ "high"
606+ ],
607+ "default_reasoning_effort": "medium",
608+ "supports_attachments": false
609+ },
610+ {
611+ "id": "coding-minimax-m2.5-highspeed",
612+ "name": "Coding MiniMax M2.5 Highspeed",
613+ "cost_per_1m_in": 0.2,
614+ "cost_per_1m_out": 0.2,
615+ "cost_per_1m_in_cached": 0,
616+ "cost_per_1m_out_cached": 0,
617+ "context_window": 204800,
618+ "default_max_tokens": 13100,
619+ "can_reason": true,
620+ "reasoning_levels": [
621+ "low",
622+ "medium",
623+ "high"
624+ ],
625+ "default_reasoning_effort": "medium",
626+ "supports_attachments": false
627+ },
628+ {
629+ "id": "coding-minimax-m2.7",
630+ "name": "Coding MiniMax M2.7",
631+ "cost_per_1m_in": 0.2,
632+ "cost_per_1m_out": 0.2,
633+ "cost_per_1m_in_cached": 0,
634+ "cost_per_1m_out_cached": 0,
635+ "context_window": 204800,
636+ "default_max_tokens": 13100,
637+ "can_reason": true,
638+ "reasoning_levels": [
639+ "low",
640+ "medium",
641+ "high"
642+ ],
643+ "default_reasoning_effort": "medium",
644+ "supports_attachments": false
645+ },
646+ {
647+ "id": "coding-minimax-m2.7-free",
648+ "name": "Coding MiniMax M2.7 (free)",
649+ "cost_per_1m_in": 0,
650+ "cost_per_1m_out": 0,
651+ "cost_per_1m_in_cached": 0,
652+ "cost_per_1m_out_cached": 0,
653+ "context_window": 204800,
654+ "default_max_tokens": 13100,
655+ "can_reason": true,
656+ "reasoning_levels": [
657+ "low",
658+ "medium",
659+ "high"
660+ ],
661+ "default_reasoning_effort": "medium",
662+ "supports_attachments": false
663+ },
664+ {
665+ "id": "coding-minimax-m2.7-highspeed",
666+ "name": "Coding MiniMax M2.7 Highspeed",
667+ "cost_per_1m_in": 0.2,
668+ "cost_per_1m_out": 0.2,
669+ "cost_per_1m_in_cached": 0,
670+ "cost_per_1m_out_cached": 0,
671+ "context_window": 204800,
672+ "default_max_tokens": 13100,
673+ "can_reason": true,
674+ "reasoning_levels": [
675+ "low",
676+ "medium",
677+ "high"
678+ ],
679+ "default_reasoning_effort": "medium",
680+ "supports_attachments": false
681+ },
682+ {
683+ "id": "coding-minimax-m3",
684+ "name": "Coding MiniMax M3",
685+ "cost_per_1m_in": 0.2,
686+ "cost_per_1m_out": 0.2,
687+ "cost_per_1m_in_cached": 0,
688+ "cost_per_1m_out_cached": 0,
689+ "context_window": 204800,
690+ "default_max_tokens": 13100,
691+ "can_reason": true,
692+ "reasoning_levels": [
693+ "low",
694+ "medium",
695+ "high"
696+ ],
697+ "default_reasoning_effort": "medium",
698+ "supports_attachments": false
699+ },
700+ {
701+ "id": "coding-minimax-m3-free",
702+ "name": "Coding MiniMax M3 (free)",
703+ "cost_per_1m_in": 0,
704+ "cost_per_1m_out": 0,
705+ "cost_per_1m_in_cached": 0,
706+ "cost_per_1m_out_cached": 0,
707+ "context_window": 204800,
708+ "default_max_tokens": 13100,
709+ "can_reason": true,
710+ "reasoning_levels": [
711+ "low",
712+ "medium",
713+ "high"
714+ ],
715+ "default_reasoning_effort": "medium",
716+ "supports_attachments": false
717+ },
718+ {
719+ "id": "coding-step-3.5-flash",
720+ "name": "Coding Step 3.5 Flash",
721+ "cost_per_1m_in": 0.03,
722+ "cost_per_1m_out": 0.09,
723+ "cost_per_1m_in_cached": 0,
724+ "cost_per_1m_out_cached": 0,
725+ "context_window": 256000,
726+ "default_max_tokens": 25600,
727+ "can_reason": false,
728+ "supports_attachments": true
729+ },
730+ {
731+ "id": "coding-step-3.5-flash-free",
732+ "name": "Coding Step 3.5 Flash (free)",
733+ "cost_per_1m_in": 0,
734+ "cost_per_1m_out": 0,
735+ "cost_per_1m_in_cached": 0,
736+ "cost_per_1m_out_cached": 0,
737+ "context_window": 256000,
738+ "default_max_tokens": 25600,
739+ "can_reason": false,
740+ "supports_attachments": true
741+ },
742+ {
743+ "id": "coding-step-3.7-flash",
744+ "name": "Coding Step 3.7 Flash",
745+ "cost_per_1m_in": 0.088,
746+ "cost_per_1m_out": 0.528,
747+ "cost_per_1m_in_cached": 0,
748+ "cost_per_1m_out_cached": 0.0176,
749+ "context_window": 256000,
750+ "default_max_tokens": 25600,
751+ "can_reason": false,
752+ "supports_attachments": true
753+ },
754+ {
755+ "id": "coding-step-3.7-flash-free",
756+ "name": "Coding Step 3.7 Flash (free)",
757+ "cost_per_1m_in": 0,
758+ "cost_per_1m_out": 0,
759+ "cost_per_1m_in_cached": 0,
760+ "cost_per_1m_out_cached": 0,
761+ "context_window": 256000,
762+ "default_max_tokens": 25600,
763+ "can_reason": false,
764+ "supports_attachments": true
765+ },
766+ {
767+ "id": "command-a-plus-05-2026",
768+ "name": "Command A Plus 05 2026",
769+ "cost_per_1m_in": 2.5,
770+ "cost_per_1m_out": 10,
771+ "cost_per_1m_in_cached": 0,
772+ "cost_per_1m_out_cached": 0,
773+ "context_window": 128000,
774+ "default_max_tokens": 64000,
775+ "can_reason": true,
776+ "reasoning_levels": [
777+ "low",
778+ "medium",
779+ "high"
780+ ],
781+ "default_reasoning_effort": "medium",
782+ "supports_attachments": true
783+ },
784+ {
785+ "id": "deepinfra-kimi-k2.7-code",
786+ "name": "Deepinfra Kimi K2.7 Code",
787+ "cost_per_1m_in": 0.814,
788+ "cost_per_1m_out": 3.85022,
789+ "cost_per_1m_in_cached": 0,
790+ "cost_per_1m_out_cached": 0.16524,
791+ "context_window": 256000,
792+ "default_max_tokens": 25600,
793+ "can_reason": true,
794+ "reasoning_levels": [
795+ "low",
796+ "medium",
797+ "high"
798+ ],
799+ "default_reasoning_effort": "medium",
800+ "supports_attachments": true
801+ },
802+ {
803+ "id": "deepseek-v3.2",
804+ "name": "DeepSeek V3.2",
805+ "cost_per_1m_in": 0.302,
806+ "cost_per_1m_out": 0.453,
807+ "cost_per_1m_in_cached": 0,
808+ "cost_per_1m_out_cached": 0.0302,
809+ "context_window": 128000,
810+ "default_max_tokens": 64000,
811+ "can_reason": true,
812+ "reasoning_levels": [
813+ "low",
814+ "medium",
815+ "high"
816+ ],
817+ "default_reasoning_effort": "medium",
818+ "supports_attachments": false
819+ },
820+ {
821+ "id": "deepseek-v3.2-think",
822+ "name": "DeepSeek V3.2 Thinking",
823+ "cost_per_1m_in": 0.302,
824+ "cost_per_1m_out": 0.453,
825+ "cost_per_1m_in_cached": 0,
826+ "cost_per_1m_out_cached": 0.0302,
827+ "context_window": 128000,
828+ "default_max_tokens": 64000,
829+ "can_reason": true,
830+ "reasoning_levels": [
831+ "low",
832+ "medium",
833+ "high"
834+ ],
835+ "default_reasoning_effort": "medium",
836+ "supports_attachments": false
837+ },
838+ {
839+ "id": "deepseek-v4-flash",
840+ "name": "DeepSeek V4 Flash",
841+ "cost_per_1m_in": 0.154,
842+ "cost_per_1m_out": 0.308,
843+ "cost_per_1m_in_cached": 0,
844+ "cost_per_1m_out_cached": 0.00308,
845+ "context_window": 1000000,
846+ "default_max_tokens": 384000,
847+ "can_reason": true,
848+ "reasoning_levels": [
849+ "low",
850+ "medium",
851+ "high"
852+ ],
853+ "default_reasoning_effort": "medium",
854+ "supports_attachments": false
855+ },
856+ {
857+ "id": "deepseek-v4-pro",
858+ "name": "DeepSeek V4 Pro",
859+ "cost_per_1m_in": 0.464,
860+ "cost_per_1m_out": 0.928,
861+ "cost_per_1m_in_cached": 0,
862+ "cost_per_1m_out_cached": 0.00385,
863+ "context_window": 1000000,
864+ "default_max_tokens": 384000,
865+ "can_reason": true,
866+ "reasoning_levels": [
867+ "low",
868+ "medium",
869+ "high"
870+ ],
871+ "default_reasoning_effort": "medium",
872+ "supports_attachments": false
873+ },
874+ {
875+ "id": "doubao-seed-1-6",
876+ "name": "Doubao Seed 1.6",
877+ "cost_per_1m_in": 0.18,
878+ "cost_per_1m_out": 1.8,
879+ "cost_per_1m_in_cached": 0,
880+ "cost_per_1m_out_cached": 0.036,
881+ "context_window": 256000,
882+ "default_max_tokens": 32000,
883+ "can_reason": false,
884+ "supports_attachments": true
885+ },
886+ {
887+ "id": "doubao-seed-1-6-flash",
888+ "name": "Doubao Seed 1.6 Flash",
889+ "cost_per_1m_in": 0.044,
890+ "cost_per_1m_out": 0.44,
891+ "cost_per_1m_in_cached": 0,
892+ "cost_per_1m_out_cached": 0.0088,
893+ "context_window": 256000,
894+ "default_max_tokens": 33000,
895+ "can_reason": false,
896+ "supports_attachments": true
897+ },
898+ {
899+ "id": "doubao-seed-1-6-lite",
900+ "name": "Doubao Seed 1.6 Lite",
901+ "cost_per_1m_in": 0.082,
902+ "cost_per_1m_out": 0.656,
903+ "cost_per_1m_in_cached": 0,
904+ "cost_per_1m_out_cached": 0.0164,
905+ "context_window": 256000,
906+ "default_max_tokens": 32000,
907+ "can_reason": false,
908+ "supports_attachments": true
909+ },
910+ {
911+ "id": "doubao-seed-1-6-thinking",
912+ "name": "Doubao Seed 1.6 Thinking",
913+ "cost_per_1m_in": 0.18,
914+ "cost_per_1m_out": 1.8,
915+ "cost_per_1m_in_cached": 0,
916+ "cost_per_1m_out_cached": 0.036,
917+ "context_window": 256000,
918+ "default_max_tokens": 32000,
919+ "can_reason": false,
920+ "supports_attachments": true
921+ },
922+ {
923+ "id": "doubao-seed-1-8",
924+ "name": "Doubao Seed 1.8",
925+ "cost_per_1m_in": 0.10959,
926+ "cost_per_1m_out": 0.27398,
927+ "cost_per_1m_in_cached": 0,
928+ "cost_per_1m_out_cached": 0.02192,
929+ "context_window": 256000,
930+ "default_max_tokens": 64000,
931+ "can_reason": true,
932+ "reasoning_levels": [
933+ "low",
934+ "medium",
935+ "high"
936+ ],
937+ "default_reasoning_effort": "medium",
938+ "supports_attachments": true
939+ },
940+ {
941+ "id": "doubao-seed-2-0-code-preview",
942+ "name": "Doubao Seed 2.0 Code Preview",
943+ "cost_per_1m_in": 0.4822,
944+ "cost_per_1m_out": 2.411,
945+ "cost_per_1m_in_cached": 0,
946+ "cost_per_1m_out_cached": 0.09644,
947+ "context_window": 256000,
948+ "default_max_tokens": 128000,
949+ "can_reason": true,
950+ "reasoning_levels": [
951+ "low",
952+ "medium",
953+ "high"
954+ ],
955+ "default_reasoning_effort": "medium",
956+ "supports_attachments": true
957+ },
958+ {
959+ "id": "doubao-seed-2-0-lite-260215",
960+ "name": "Doubao Seed 2.0 Lite 260215",
961+ "cost_per_1m_in": 0.09041,
962+ "cost_per_1m_out": 0.54246,
963+ "cost_per_1m_in_cached": 0,
964+ "cost_per_1m_out_cached": 0.01808,
965+ "context_window": 256000,
966+ "default_max_tokens": 32000,
967+ "can_reason": true,
968+ "reasoning_levels": [
969+ "low",
970+ "medium",
971+ "high"
972+ ],
973+ "default_reasoning_effort": "medium",
974+ "supports_attachments": true
975+ },
976+ {
977+ "id": "doubao-seed-2-0-lite-260428",
978+ "name": "Doubao Seed 2.0 Lite 260428",
979+ "cost_per_1m_in": 0.09041,
980+ "cost_per_1m_out": 0.54246,
981+ "cost_per_1m_in_cached": 0,
982+ "cost_per_1m_out_cached": 0.01808,
983+ "context_window": 256000,
984+ "default_max_tokens": 32000,
985+ "can_reason": true,
986+ "reasoning_levels": [
987+ "low",
988+ "medium",
989+ "high"
990+ ],
991+ "default_reasoning_effort": "medium",
992+ "supports_attachments": true
993+ },
994+ {
995+ "id": "doubao-seed-2-0-mini",
996+ "name": "Doubao Seed 2.0 Mini",
997+ "cost_per_1m_in": 0.03014,
998+ "cost_per_1m_out": 0.30136,
999+ "cost_per_1m_in_cached": 0,
1000+ "cost_per_1m_out_cached": 0.00603,
1001+ "context_window": 256000,
1002+ "default_max_tokens": 32000,
1003+ "can_reason": true,
1004+ "reasoning_levels": [
1005+ "low",
1006+ "medium",
1007+ "high"
1008+ ],
1009+ "default_reasoning_effort": "medium",
1010+ "supports_attachments": true
1011+ },
1012+ {
1013+ "id": "doubao-seed-2-0-mini-260428",
1014+ "name": "Doubao Seed 2.0 Mini 260428",
1015+ "cost_per_1m_in": 0.0282,
1016+ "cost_per_1m_out": 0.282,
1017+ "cost_per_1m_in_cached": 0,
1018+ "cost_per_1m_out_cached": 0.00564,
1019+ "context_window": 256000,
1020+ "default_max_tokens": 32000,
1021+ "can_reason": true,
1022+ "reasoning_levels": [
1023+ "low",
1024+ "medium",
1025+ "high"
1026+ ],
1027+ "default_reasoning_effort": "medium",
1028+ "supports_attachments": true
1029+ },
1030+ {
1031+ "id": "doubao-seed-2-0-pro",
1032+ "name": "Doubao Seed 2.0 Pro",
1033+ "cost_per_1m_in": 0.4822,
1034+ "cost_per_1m_out": 2.411,
1035+ "cost_per_1m_in_cached": 0,
1036+ "cost_per_1m_out_cached": 0.09644,
1037+ "context_window": 256000,
1038+ "default_max_tokens": 128000,
1039+ "can_reason": true,
1040+ "reasoning_levels": [
1041+ "low",
1042+ "medium",
1043+ "high"
1044+ ],
1045+ "default_reasoning_effort": "medium",
1046+ "supports_attachments": true
1047+ },
1048+ {
1049+ "id": "doubao-seed-2-1-pro",
1050+ "name": "Doubao Seed 2.1 Pro",
1051+ "cost_per_1m_in": 0.9295,
1052+ "cost_per_1m_out": 4.6475,
1053+ "cost_per_1m_in_cached": 0,
1054+ "cost_per_1m_out_cached": 0.1859,
1055+ "context_window": 256000,
1056+ "default_max_tokens": 25600,
1057+ "can_reason": true,
1058+ "reasoning_levels": [
1059+ "low",
1060+ "medium",
1061+ "high"
1062+ ],
1063+ "default_reasoning_effort": "medium",
1064+ "supports_attachments": true
1065+ },
1066+ {
1067+ "id": "doubao-seed-2-1-turbo",
1068+ "name": "Doubao Seed 2.1 Turbo",
1069+ "cost_per_1m_in": 0.46475,
1070+ "cost_per_1m_out": 2.32375,
1071+ "cost_per_1m_in_cached": 0,
1072+ "cost_per_1m_out_cached": 0.09295,
1073+ "context_window": 256000,
1074+ "default_max_tokens": 25600,
1075+ "can_reason": true,
1076+ "reasoning_levels": [
1077+ "low",
1078+ "medium",
1079+ "high"
1080+ ],
1081+ "default_reasoning_effort": "medium",
1082+ "supports_attachments": true
1083+ },
1084+ {
1085+ "id": "ernie-4.5",
1086+ "name": "ERNIE 4.5",
1087+ "cost_per_1m_in": 0.068,
1088+ "cost_per_1m_out": 0.272,
1089+ "cost_per_1m_in_cached": 0,
1090+ "cost_per_1m_out_cached": 0,
1091+ "context_window": 160000,
1092+ "default_max_tokens": 64000,
1093+ "can_reason": false,
1094+ "supports_attachments": true
1095+ },
1096+ {
1097+ "id": "ernie-4.5-turbo-latest",
1098+ "name": "ERNIE 4.5 Turbo",
1099+ "cost_per_1m_in": 0.11,
1100+ "cost_per_1m_out": 0.44,
1101+ "cost_per_1m_in_cached": 0,
1102+ "cost_per_1m_out_cached": 0,
1103+ "context_window": 135000,
1104+ "default_max_tokens": 12000,
1105+ "can_reason": false,
1106+ "supports_attachments": true
1107+ },
1108+ {
1109+ "id": "ernie-4.5-turbo-vl",
1110+ "name": "ERNIE 4.5 Turbo VL",
1111+ "cost_per_1m_in": 0.4,
1112+ "cost_per_1m_out": 1.2,
1113+ "cost_per_1m_in_cached": 0,
1114+ "cost_per_1m_out_cached": 0,
1115+ "context_window": 139000,
1116+ "default_max_tokens": 16000,
1117+ "can_reason": false,
1118+ "supports_attachments": true
1119+ },
1120+ {
1121+ "id": "ernie-5.0",
1122+ "name": "ERNIE 5.0",
1123+ "cost_per_1m_in": 0.82192,
1124+ "cost_per_1m_out": 3.28768,
1125+ "cost_per_1m_in_cached": 0,
1126+ "cost_per_1m_out_cached": 0.82192,
1127+ "context_window": 119000,
1128+ "default_max_tokens": 11900,
1129+ "can_reason": true,
1130+ "reasoning_levels": [
1131+ "low",
1132+ "medium",
1133+ "high"
1134+ ],
1135+ "default_reasoning_effort": "medium",
1136+ "supports_attachments": true
1137+ },
1138+ {
1139+ "id": "ernie-5.0-thinking-exp",
1140+ "name": "ERNIE 5.0 Thinking Exp",
1141+ "cost_per_1m_in": 0.82192,
1142+ "cost_per_1m_out": 3.28768,
1143+ "cost_per_1m_in_cached": 0,
1144+ "cost_per_1m_out_cached": 0.82192,
1145+ "context_window": 119000,
1146+ "default_max_tokens": 11900,
1147+ "can_reason": true,
1148+ "reasoning_levels": [
1149+ "low",
1150+ "medium",
1151+ "high"
1152+ ],
1153+ "default_reasoning_effort": "medium",
1154+ "supports_attachments": true
1155+ },
1156+ {
1157+ "id": "ernie-5.0-thinking-preview",
1158+ "name": "ERNIE 5.0 Thinking Preview",
1159+ "cost_per_1m_in": 0.822,
1160+ "cost_per_1m_out": 3.288,
1161+ "cost_per_1m_in_cached": 0,
1162+ "cost_per_1m_out_cached": 0.822,
1163+ "context_window": 183000,
1164+ "default_max_tokens": 64000,
1165+ "can_reason": true,
1166+ "reasoning_levels": [
1167+ "low",
1168+ "medium",
1169+ "high"
1170+ ],
1171+ "default_reasoning_effort": "medium",
1172+ "supports_attachments": false
1173+ },
1174+ {
1175+ "id": "ernie-5.1",
1176+ "name": "ERNIE 5.1",
1177+ "cost_per_1m_in": 0.5634,
1178+ "cost_per_1m_out": 2.5353,
1179+ "cost_per_1m_in_cached": 0,
1180+ "cost_per_1m_out_cached": 0.5634,
1181+ "context_window": 119000,
1182+ "default_max_tokens": 11900,
1183+ "can_reason": true,
1184+ "reasoning_levels": [
1185+ "low",
1186+ "medium",
1187+ "high"
1188+ ],
1189+ "default_reasoning_effort": "medium",
1190+ "supports_attachments": false
1191+ },
1192+ {
1193+ "id": "ernie-x1-turbo",
1194+ "name": "ERNIE X1 Turbo",
1195+ "cost_per_1m_in": 0.136,
1196+ "cost_per_1m_out": 0.544,
1197+ "cost_per_1m_in_cached": 0,
1198+ "cost_per_1m_out_cached": 0,
1199+ "context_window": 50500,
1200+ "default_max_tokens": 5050,
1201+ "can_reason": true,
1202+ "reasoning_levels": [
1203+ "low",
1204+ "medium",
1205+ "high"
1206+ ],
1207+ "default_reasoning_effort": "medium",
1208+ "supports_attachments": false
1209+ },
1210+ {
1211+ "id": "gemini-2.5-flash",
1212+ "name": "Gemini 2.5 Flash",
1213+ "cost_per_1m_in": 0.3,
1214+ "cost_per_1m_out": 2.499,
1215+ "cost_per_1m_in_cached": 0,
1216+ "cost_per_1m_out_cached": 0.03,
1217+ "context_window": 1048576,
1218+ "default_max_tokens": 65536,
1219+ "can_reason": false,
1220+ "supports_attachments": true
1221+ },
1222+ {
1223+ "id": "gemini-2.5-flash-image",
1224+ "name": "Gemini 2.5 Flash Image",
1225+ "cost_per_1m_in": 0.3,
1226+ "cost_per_1m_out": 2.499,
1227+ "cost_per_1m_in_cached": 0,
1228+ "cost_per_1m_out_cached": 0.3,
1229+ "context_window": 32800,
1230+ "default_max_tokens": 8000,
1231+ "can_reason": false,
1232+ "supports_attachments": true
1233+ },
1234+ {
1235+ "id": "gemini-2.5-flash-lite",
1236+ "name": "Gemini 2.5 Flash Lite",
1237+ "cost_per_1m_in": 0.1,
1238+ "cost_per_1m_out": 0.4,
1239+ "cost_per_1m_in_cached": 0,
1240+ "cost_per_1m_out_cached": 0.01,
1241+ "context_window": 1048576,
1242+ "default_max_tokens": 65536,
1243+ "can_reason": false,
1244+ "supports_attachments": true
1245+ },
1246+ {
1247+ "id": "gemini-2.5-flash-lite-nothink",
1248+ "name": "Gemini 2.5 Flash Lite (no think)",
1249+ "cost_per_1m_in": 0.1,
1250+ "cost_per_1m_out": 0.4,
1251+ "cost_per_1m_in_cached": 0,
1252+ "cost_per_1m_out_cached": 0.01,
1253+ "context_window": 1048576,
1254+ "default_max_tokens": 65536,
1255+ "can_reason": false,
1256+ "supports_attachments": true
1257+ },
1258+ {
1259+ "id": "gemini-2.5-flash-lite-preview-09-2025",
1260+ "name": "Gemini 2.5 Flash Lite Preview 09 2025",
1261+ "cost_per_1m_in": 0.1,
1262+ "cost_per_1m_out": 0.4,
1263+ "cost_per_1m_in_cached": 0,
1264+ "cost_per_1m_out_cached": 0.01,
1265+ "context_window": 1048576,
1266+ "default_max_tokens": 65536,
1267+ "can_reason": false,
1268+ "supports_attachments": true
1269+ },
1270+ {
1271+ "id": "gemini-2.5-flash-lite-preview-09-2025-nothink",
1272+ "name": "Gemini 2.5 Flash Lite Preview 09 2025 (no think)",
1273+ "cost_per_1m_in": 0.1,
1274+ "cost_per_1m_out": 0.4,
1275+ "cost_per_1m_in_cached": 0,
1276+ "cost_per_1m_out_cached": 0.01,
1277+ "context_window": 1048576,
1278+ "default_max_tokens": 65536,
1279+ "can_reason": false,
1280+ "supports_attachments": true
1281+ },
1282+ {
1283+ "id": "gemini-2.5-flash-nothink",
1284+ "name": "Gemini 2.5 Flash (no think)",
1285+ "cost_per_1m_in": 0.3,
1286+ "cost_per_1m_out": 2.499,
1287+ "cost_per_1m_in_cached": 0,
1288+ "cost_per_1m_out_cached": 0.03,
1289+ "context_window": 1047576,
1290+ "default_max_tokens": 65536,
1291+ "can_reason": false,
1292+ "supports_attachments": true
1293+ },
1294+ {
1295+ "id": "gemini-2.5-flash-preview-05-20-nothink",
1296+ "name": "Gemini 2.5 Flash Preview 05-20 (no think)",
1297+ "cost_per_1m_in": 0.3,
1298+ "cost_per_1m_out": 2.499,
1299+ "cost_per_1m_in_cached": 0,
1300+ "cost_per_1m_out_cached": 0.03,
1301+ "context_window": 1048576,
1302+ "default_max_tokens": 65536,
1303+ "can_reason": false,
1304+ "supports_attachments": true
1305+ },
1306+ {
1307+ "id": "gemini-2.5-flash-preview-05-20-search",
1308+ "name": "Gemini 2.5 Flash Preview 05-20 Search",
1309+ "cost_per_1m_in": 0.3,
1310+ "cost_per_1m_out": 2.499,
1311+ "cost_per_1m_in_cached": 0,
1312+ "cost_per_1m_out_cached": 0.03,
1313+ "context_window": 1048576,
1314+ "default_max_tokens": 65536,
1315+ "can_reason": false,
1316+ "supports_attachments": true
1317+ },
1318+ {
1319+ "id": "gemini-2.5-flash-preview-09-2025",
1320+ "name": "Gemini 2.5 Flash Preview 09 2025",
1321+ "cost_per_1m_in": 0.3,
1322+ "cost_per_1m_out": 2.499,
1323+ "cost_per_1m_in_cached": 0,
1324+ "cost_per_1m_out_cached": 0.03,
1325+ "context_window": 1048576,
1326+ "default_max_tokens": 65536,
1327+ "can_reason": false,
1328+ "supports_attachments": true
1329+ },
1330+ {
1331+ "id": "gemini-2.5-flash-search",
1332+ "name": "Gemini 2.5 Flash Search",
1333+ "cost_per_1m_in": 0.3,
1334+ "cost_per_1m_out": 2.499,
1335+ "cost_per_1m_in_cached": 0,
1336+ "cost_per_1m_out_cached": 0.03,
1337+ "context_window": 1048576,
1338+ "default_max_tokens": 65536,
1339+ "can_reason": false,
1340+ "supports_attachments": true
1341+ },
1342+ {
1343+ "id": "gemini-2.5-pro",
1344+ "name": "Gemini 2.5 Pro",
1345+ "cost_per_1m_in": 1.25,
1346+ "cost_per_1m_out": 10,
1347+ "cost_per_1m_in_cached": 0,
1348+ "cost_per_1m_out_cached": 0.125,
1349+ "context_window": 1048576,
1350+ "default_max_tokens": 65536,
1351+ "can_reason": true,
1352+ "reasoning_levels": [
1353+ "low",
1354+ "medium",
1355+ "high"
1356+ ],
1357+ "default_reasoning_effort": "medium",
1358+ "supports_attachments": true
1359+ },
1360+ {
1361+ "id": "gemini-2.5-pro-preview-05-06",
1362+ "name": "Gemini 2.5 Pro Preview 05-06",
1363+ "cost_per_1m_in": 1.25,
1364+ "cost_per_1m_out": 10,
1365+ "cost_per_1m_in_cached": 0,
1366+ "cost_per_1m_out_cached": 0.125,
1367+ "context_window": 1048576,
1368+ "default_max_tokens": 65536,
1369+ "can_reason": true,
1370+ "reasoning_levels": [
1371+ "low",
1372+ "medium",
1373+ "high"
1374+ ],
1375+ "default_reasoning_effort": "medium",
1376+ "supports_attachments": true
1377+ },
1378+ {
1379+ "id": "gemini-2.5-pro-preview-06-05",
1380+ "name": "Gemini 2.5 Pro Preview 06-05",
1381+ "cost_per_1m_in": 1.25,
1382+ "cost_per_1m_out": 10,
1383+ "cost_per_1m_in_cached": 0,
1384+ "cost_per_1m_out_cached": 0.125,
1385+ "context_window": 1048576,
1386+ "default_max_tokens": 65536,
1387+ "can_reason": true,
1388+ "reasoning_levels": [
1389+ "low",
1390+ "medium",
1391+ "high"
1392+ ],
1393+ "default_reasoning_effort": "medium",
1394+ "supports_attachments": true
1395+ },
1396+ {
1397+ "id": "gemini-2.5-pro-search",
1398+ "name": "Gemini 2.5 Pro Search",
1399+ "cost_per_1m_in": 1.25,
1400+ "cost_per_1m_out": 10,
1401+ "cost_per_1m_in_cached": 0,
1402+ "cost_per_1m_out_cached": 0.125,
1403+ "context_window": 1048576,
1404+ "default_max_tokens": 65536,
1405+ "can_reason": true,
1406+ "reasoning_levels": [
1407+ "low",
1408+ "medium",
1409+ "high"
1410+ ],
1411+ "default_reasoning_effort": "medium",
1412+ "supports_attachments": true
1413+ },
1414+ {
1415+ "id": "gemini-3-flash-preview",
1416+ "name": "Gemini 3 Flash Preview",
1417+ "cost_per_1m_in": 0.5,
1418+ "cost_per_1m_out": 3,
1419+ "cost_per_1m_in_cached": 0,
1420+ "cost_per_1m_out_cached": 0.05,
1421+ "context_window": 1048576,
1422+ "default_max_tokens": 104857,
1423+ "can_reason": true,
1424+ "reasoning_levels": [
1425+ "low",
1426+ "medium",
1427+ "high"
1428+ ],
1429+ "default_reasoning_effort": "medium",
1430+ "supports_attachments": true
1431+ },
1432+ {
1433+ "id": "gemini-3-flash-preview-free",
1434+ "name": "Gemini 3 Flash Preview (free)",
1435+ "cost_per_1m_in": 0,
1436+ "cost_per_1m_out": 0,
1437+ "cost_per_1m_in_cached": 0,
1438+ "cost_per_1m_out_cached": 0,
1439+ "context_window": 1048576,
1440+ "default_max_tokens": 65536,
1441+ "can_reason": true,
1442+ "reasoning_levels": [
1443+ "low",
1444+ "medium",
1445+ "high"
1446+ ],
1447+ "default_reasoning_effort": "medium",
1448+ "supports_attachments": true
1449+ },
1450+ {
1451+ "id": "gemini-3-flash-preview-search",
1452+ "name": "Gemini 3 Flash Preview Search",
1453+ "cost_per_1m_in": 0.5,
1454+ "cost_per_1m_out": 3,
1455+ "cost_per_1m_in_cached": 0,
1456+ "cost_per_1m_out_cached": 0.05,
1457+ "context_window": 1048576,
1458+ "default_max_tokens": 104857,
1459+ "can_reason": true,
1460+ "reasoning_levels": [
1461+ "low",
1462+ "medium",
1463+ "high"
1464+ ],
1465+ "default_reasoning_effort": "medium",
1466+ "supports_attachments": true
1467+ },
1468+ {
1469+ "id": "gemini-3.1-flash-lite",
1470+ "name": "Gemini 3.1 Flash Lite",
1471+ "cost_per_1m_in": 0.25,
1472+ "cost_per_1m_out": 1.5,
1473+ "cost_per_1m_in_cached": 0,
1474+ "cost_per_1m_out_cached": 0.25,
1475+ "context_window": 1000000,
1476+ "default_max_tokens": 64000,
1477+ "can_reason": true,
1478+ "reasoning_levels": [
1479+ "low",
1480+ "medium",
1481+ "high"
1482+ ],
1483+ "default_reasoning_effort": "medium",
1484+ "supports_attachments": true
1485+ },
1486+ {
1487+ "id": "gemini-3.1-flash-lite-preview",
1488+ "name": "Gemini 3.1 Flash Lite Preview",
1489+ "cost_per_1m_in": 0.25,
1490+ "cost_per_1m_out": 1.5,
1491+ "cost_per_1m_in_cached": 0,
1492+ "cost_per_1m_out_cached": 0.25,
1493+ "context_window": 1000000,
1494+ "default_max_tokens": 64000,
1495+ "can_reason": true,
1496+ "reasoning_levels": [
1497+ "low",
1498+ "medium",
1499+ "high"
1500+ ],
1501+ "default_reasoning_effort": "medium",
1502+ "supports_attachments": true
1503+ },
1504+ {
1505+ "id": "gemini-3.1-flash-lite-preview-nothink",
1506+ "name": "Gemini 3.1 Flash Lite Preview (no think)",
1507+ "cost_per_1m_in": 0.25,
1508+ "cost_per_1m_out": 1.5,
1509+ "cost_per_1m_in_cached": 0,
1510+ "cost_per_1m_out_cached": 0.25,
1511+ "context_window": 1000000,
1512+ "default_max_tokens": 64000,
1513+ "can_reason": true,
1514+ "reasoning_levels": [
1515+ "low",
1516+ "medium",
1517+ "high"
1518+ ],
1519+ "default_reasoning_effort": "medium",
1520+ "supports_attachments": true
1521+ },
1522+ {
1523+ "id": "gemini-3.1-pro-preview",
1524+ "name": "Gemini 3.1 Pro Preview",
1525+ "cost_per_1m_in": 2,
1526+ "cost_per_1m_out": 12,
1527+ "cost_per_1m_in_cached": 0,
1528+ "cost_per_1m_out_cached": 0.2,
1529+ "context_window": 1000000,
1530+ "default_max_tokens": 64000,
1531+ "can_reason": true,
1532+ "reasoning_levels": [
1533+ "low",
1534+ "medium",
1535+ "high"
1536+ ],
1537+ "default_reasoning_effort": "medium",
1538+ "supports_attachments": true
1539+ },
1540+ {
1541+ "id": "gemini-3.1-pro-preview-customtools",
1542+ "name": "Gemini 3.1 Pro Preview Customtools",
1543+ "cost_per_1m_in": 2,
1544+ "cost_per_1m_out": 12,
1545+ "cost_per_1m_in_cached": 0,
1546+ "cost_per_1m_out_cached": 0.2,
1547+ "context_window": 1000000,
1548+ "default_max_tokens": 64000,
1549+ "can_reason": true,
1550+ "reasoning_levels": [
1551+ "low",
1552+ "medium",
1553+ "high"
1554+ ],
1555+ "default_reasoning_effort": "medium",
1556+ "supports_attachments": true
1557+ },
1558+ {
1559+ "id": "gemini-3.5-flash",
1560+ "name": "Gemini 3.5 Flash",
1561+ "cost_per_1m_in": 1.5,
1562+ "cost_per_1m_out": 9,
1563+ "cost_per_1m_in_cached": 0,
1564+ "cost_per_1m_out_cached": 1.5,
1565+ "context_window": 1000000,
1566+ "default_max_tokens": 64000,
1567+ "can_reason": true,
1568+ "reasoning_levels": [
1569+ "low",
1570+ "medium",
1571+ "high"
1572+ ],
1573+ "default_reasoning_effort": "medium",
1574+ "supports_attachments": true
1575+ },
1576+ {
1577+ "id": "glm-4.5v",
1578+ "name": "GLM 4.5 Vision",
1579+ "cost_per_1m_in": 0.274,
1580+ "cost_per_1m_out": 0.822,
1581+ "cost_per_1m_in_cached": 0,
1582+ "cost_per_1m_out_cached": 0.274,
1583+ "context_window": 64000,
1584+ "default_max_tokens": 16384,
1585+ "can_reason": false,
1586+ "supports_attachments": true
1587+ },
1588+ {
1589+ "id": "glm-4.6",
1590+ "name": "GLM 4.6",
1591+ "cost_per_1m_in": 0.27397,
1592+ "cost_per_1m_out": 1.0959,
1593+ "cost_per_1m_in_cached": 0,
1594+ "cost_per_1m_out_cached": 0.0548,
1595+ "context_window": 204800,
1596+ "default_max_tokens": 20480,
1597+ "can_reason": true,
1598+ "reasoning_levels": [
1599+ "low",
1600+ "medium",
1601+ "high"
1602+ ],
1603+ "default_reasoning_effort": "medium",
1604+ "supports_attachments": false
1605+ },
1606+ {
1607+ "id": "glm-4.6v",
1608+ "name": "GLM 4.6 Vision",
1609+ "cost_per_1m_in": 0.137,
1610+ "cost_per_1m_out": 0.411,
1611+ "cost_per_1m_in_cached": 0,
1612+ "cost_per_1m_out_cached": 0.0274,
1613+ "context_window": 128000,
1614+ "default_max_tokens": 12800,
1615+ "can_reason": false,
1616+ "supports_attachments": true
1617+ },
1618+ {
1619+ "id": "glm-4.7",
1620+ "name": "GLM 4.7",
1621+ "cost_per_1m_in": 0.27397,
1622+ "cost_per_1m_out": 1.0959,
1623+ "cost_per_1m_in_cached": 0,
1624+ "cost_per_1m_out_cached": 0.0548,
1625+ "context_window": 200000,
1626+ "default_max_tokens": 20000,
1627+ "can_reason": true,
1628+ "reasoning_levels": [
1629+ "low",
1630+ "medium",
1631+ "high"
1632+ ],
1633+ "default_reasoning_effort": "medium",
1634+ "supports_attachments": false
1635+ },
1636+ {
1637+ "id": "glm-5",
1638+ "name": "GLM 5",
1639+ "cost_per_1m_in": 0.88,
1640+ "cost_per_1m_out": 2.816,
1641+ "cost_per_1m_in_cached": 0,
1642+ "cost_per_1m_out_cached": 0.176,
1643+ "context_window": 202752,
1644+ "default_max_tokens": 20275,
1645+ "can_reason": true,
1646+ "reasoning_levels": [
1647+ "low",
1648+ "medium",
1649+ "high"
1650+ ],
1651+ "default_reasoning_effort": "medium",
1652+ "supports_attachments": false
1653+ },
1654+ {
1655+ "id": "glm-5-turbo",
1656+ "name": "GLM 5 Turbo",
1657+ "cost_per_1m_in": 1.2,
1658+ "cost_per_1m_out": 3.9996,
1659+ "cost_per_1m_in_cached": 0,
1660+ "cost_per_1m_out_cached": 0.24,
1661+ "context_window": 202752,
1662+ "default_max_tokens": 20275,
1663+ "can_reason": true,
1664+ "reasoning_levels": [
1665+ "low",
1666+ "medium",
1667+ "high"
1668+ ],
1669+ "default_reasoning_effort": "medium",
1670+ "supports_attachments": false
1671+ },
1672+ {
1673+ "id": "glm-5.1",
1674+ "name": "GLM 5.1",
1675+ "cost_per_1m_in": 0.845,
1676+ "cost_per_1m_out": 3.38,
1677+ "cost_per_1m_in_cached": 0,
1678+ "cost_per_1m_out_cached": 0.18311,
1679+ "context_window": 200000,
1680+ "default_max_tokens": 20000,
1681+ "can_reason": true,
1682+ "reasoning_levels": [
1683+ "low",
1684+ "medium",
1685+ "high"
1686+ ],
1687+ "default_reasoning_effort": "medium",
1688+ "supports_attachments": false
1689+ },
1690+ {
1691+ "id": "glm-5.2",
1692+ "name": "GLM 5.2",
1693+ "cost_per_1m_in": 1.1268,
1694+ "cost_per_1m_out": 3.9438,
1695+ "cost_per_1m_in_cached": 0,
1696+ "cost_per_1m_out_cached": 0.2817,
1697+ "context_window": 1000000,
1698+ "default_max_tokens": 128000,
1699+ "can_reason": true,
1700+ "reasoning_levels": [
1701+ "low",
1702+ "medium",
1703+ "high"
1704+ ],
1705+ "default_reasoning_effort": "medium",
1706+ "supports_attachments": false
1707+ },
1708+ {
1709+ "id": "glm-5v-turbo",
1710+ "name": "GLM 5 Vision Turbo",
1711+ "cost_per_1m_in": 0.7042,
1712+ "cost_per_1m_out": 3.09848,
1713+ "cost_per_1m_in_cached": 0,
1714+ "cost_per_1m_out_cached": 0.16901,
1715+ "context_window": 200000,
1716+ "default_max_tokens": 20000,
1717+ "can_reason": false,
1718+ "supports_attachments": true
1719+ },
1720+ {
1721+ "id": "gpt-4.1",
1722+ "name": "GPT 4.1",
1723+ "cost_per_1m_in": 2,
1724+ "cost_per_1m_out": 8,
1725+ "cost_per_1m_in_cached": 0,
1726+ "cost_per_1m_out_cached": 0.5,
1727+ "context_window": 1047576,
1728+ "default_max_tokens": 32768,
1729+ "can_reason": false,
1730+ "supports_attachments": true
1731+ },
1732+ {
1733+ "id": "gpt-4.1-free",
1734+ "name": "GPT 4.1 (free)",
1735+ "cost_per_1m_in": 0,
1736+ "cost_per_1m_out": 0,
1737+ "cost_per_1m_in_cached": 0,
1738+ "cost_per_1m_out_cached": 0,
1739+ "context_window": 1047576,
1740+ "default_max_tokens": 32768,
1741+ "can_reason": false,
1742+ "supports_attachments": true
1743+ },
1744+ {
1745+ "id": "gpt-4.1-mini",
1746+ "name": "GPT 4.1 Mini",
1747+ "cost_per_1m_in": 0.4,
1748+ "cost_per_1m_out": 1.6,
1749+ "cost_per_1m_in_cached": 0,
1750+ "cost_per_1m_out_cached": 0.1,
1751+ "context_window": 1047576,
1752+ "default_max_tokens": 32768,
1753+ "can_reason": false,
1754+ "supports_attachments": true
1755+ },
1756+ {
1757+ "id": "gpt-4.1-mini-free",
1758+ "name": "GPT 4.1 Mini (free)",
1759+ "cost_per_1m_in": 0,
1760+ "cost_per_1m_out": 0,
1761+ "cost_per_1m_in_cached": 0,
1762+ "cost_per_1m_out_cached": 0,
1763+ "context_window": 1047576,
1764+ "default_max_tokens": 32768,
1765+ "can_reason": false,
1766+ "supports_attachments": true
1767+ },
1768+ {
1769+ "id": "gpt-4.1-nano",
1770+ "name": "GPT 4.1 Nano",
1771+ "cost_per_1m_in": 0.1,
1772+ "cost_per_1m_out": 0.4,
1773+ "cost_per_1m_in_cached": 0,
1774+ "cost_per_1m_out_cached": 0.025,
1775+ "context_window": 1047576,
1776+ "default_max_tokens": 32768,
1777+ "can_reason": false,
1778+ "supports_attachments": true
1779+ },
1780+ {
1781+ "id": "gpt-4.1-nano-free",
1782+ "name": "GPT 4.1 Nano (free)",
1783+ "cost_per_1m_in": 0,
1784+ "cost_per_1m_out": 0,
1785+ "cost_per_1m_in_cached": 0,
1786+ "cost_per_1m_out_cached": 0,
1787+ "context_window": 1047576,
1788+ "default_max_tokens": 32768,
1789+ "can_reason": false,
1790+ "supports_attachments": true
1791+ },
1792+ {
1793+ "id": "gpt-4o",
1794+ "name": "GPT 4o",
1795+ "cost_per_1m_in": 2.5,
1796+ "cost_per_1m_out": 10,
1797+ "cost_per_1m_in_cached": 0,
1798+ "cost_per_1m_out_cached": 1.25,
1799+ "context_window": 128000,
1800+ "default_max_tokens": 16384,
1801+ "can_reason": false,
1802+ "supports_attachments": true
1803+ },
1804+ {
1805+ "id": "gpt-4o-2024-11-20",
1806+ "name": "GPT 4o 2024 11-20",
1807+ "cost_per_1m_in": 2.5,
1808+ "cost_per_1m_out": 10,
1809+ "cost_per_1m_in_cached": 0,
1810+ "cost_per_1m_out_cached": 1.25,
1811+ "context_window": 128000,
1812+ "default_max_tokens": 16384,
1813+ "can_reason": false,
1814+ "supports_attachments": true
1815+ },
1816+ {
1817+ "id": "gpt-4o-audio-preview",
1818+ "name": "GPT 4o Audio Preview",
1819+ "cost_per_1m_in": 2.5,
1820+ "cost_per_1m_out": 10,
1821+ "cost_per_1m_in_cached": 0,
1822+ "cost_per_1m_out_cached": 0,
1823+ "context_window": 128000,
1824+ "default_max_tokens": 16384,
1825+ "can_reason": false,
1826+ "supports_attachments": false
1827+ },
1828+ {
1829+ "id": "gpt-4o-free",
1830+ "name": "GPT 4o (free)",
1831+ "cost_per_1m_in": 0,
1832+ "cost_per_1m_out": 0,
1833+ "cost_per_1m_in_cached": 0,
1834+ "cost_per_1m_out_cached": 0,
1835+ "context_window": 1047576,
1836+ "default_max_tokens": 32768,
1837+ "can_reason": false,
1838+ "supports_attachments": true
1839+ },
1840+ {
1841+ "id": "gpt-4o-mini",
1842+ "name": "GPT 4o Mini",
1843+ "cost_per_1m_in": 0.15,
1844+ "cost_per_1m_out": 0.6,
1845+ "cost_per_1m_in_cached": 0,
1846+ "cost_per_1m_out_cached": 0.075,
1847+ "context_window": 128000,
1848+ "default_max_tokens": 16384,
1849+ "can_reason": false,
1850+ "supports_attachments": true
1851+ },
1852+ {
1853+ "id": "gpt-4o-mini-search-preview",
1854+ "name": "GPT 4o Mini Search Preview",
1855+ "cost_per_1m_in": 0.15,
1856+ "cost_per_1m_out": 0.6,
1857+ "cost_per_1m_in_cached": 0,
1858+ "cost_per_1m_out_cached": 0.075,
1859+ "context_window": 128000,
1860+ "default_max_tokens": 16384,
1861+ "can_reason": false,
1862+ "supports_attachments": true
1863+ },
1864+ {
1865+ "id": "gpt-4o-search-preview",
1866+ "name": "GPT 4o Search Preview",
1867+ "cost_per_1m_in": 2.5,
1868+ "cost_per_1m_out": 10,
1869+ "cost_per_1m_in_cached": 0,
1870+ "cost_per_1m_out_cached": 1.25,
1871+ "context_window": 128000,
1872+ "default_max_tokens": 16384,
1873+ "can_reason": false,
1874+ "supports_attachments": true
1875+ },
1876+ {
1877+ "id": "gpt-5",
1878+ "name": "GPT 5",
1879+ "cost_per_1m_in": 1.25,
1880+ "cost_per_1m_out": 10,
1881+ "cost_per_1m_in_cached": 0,
1882+ "cost_per_1m_out_cached": 0.125,
1883+ "context_window": 400000,
1884+ "default_max_tokens": 128000,
1885+ "can_reason": true,
1886+ "reasoning_levels": [
1887+ "low",
1888+ "medium",
1889+ "high"
1890+ ],
1891+ "default_reasoning_effort": "medium",
1892+ "supports_attachments": true
1893+ },
1894+ {
1895+ "id": "gpt-5-chat-latest",
1896+ "name": "GPT 5 Chat",
1897+ "cost_per_1m_in": 1.25,
1898+ "cost_per_1m_out": 10,
1899+ "cost_per_1m_in_cached": 0,
1900+ "cost_per_1m_out_cached": 0.125,
1901+ "context_window": 400000,
1902+ "default_max_tokens": 128000,
1903+ "can_reason": false,
1904+ "supports_attachments": true
1905+ },
1906+ {
1907+ "id": "gpt-5-codex",
1908+ "name": "GPT-5-Codex",
1909+ "cost_per_1m_in": 1.25,
1910+ "cost_per_1m_out": 10,
1911+ "cost_per_1m_in_cached": 0,
1912+ "cost_per_1m_out_cached": 0.125,
1913+ "context_window": 400000,
1914+ "default_max_tokens": 128000,
1915+ "can_reason": true,
1916+ "reasoning_levels": [
1917+ "low",
1918+ "medium",
1919+ "high"
1920+ ],
1921+ "default_reasoning_effort": "medium",
1922+ "supports_attachments": true
1923+ },
1924+ {
1925+ "id": "gpt-5-mini",
1926+ "name": "GPT 5 Mini",
1927+ "cost_per_1m_in": 0.25,
1928+ "cost_per_1m_out": 2,
1929+ "cost_per_1m_in_cached": 0,
1930+ "cost_per_1m_out_cached": 0.025,
1931+ "context_window": 400000,
1932+ "default_max_tokens": 128000,
1933+ "can_reason": true,
1934+ "reasoning_levels": [
1935+ "low",
1936+ "medium",
1937+ "high"
1938+ ],
1939+ "default_reasoning_effort": "medium",
1940+ "supports_attachments": true
1941+ },
1942+ {
1943+ "id": "gpt-5-nano",
1944+ "name": "GPT 5 Nano",
1945+ "cost_per_1m_in": 0.05,
1946+ "cost_per_1m_out": 0.4,
1947+ "cost_per_1m_in_cached": 0,
1948+ "cost_per_1m_out_cached": 0.005,
1949+ "context_window": 400000,
1950+ "default_max_tokens": 128000,
1951+ "can_reason": true,
1952+ "reasoning_levels": [
1953+ "low",
1954+ "medium",
1955+ "high"
1956+ ],
1957+ "default_reasoning_effort": "medium",
1958+ "supports_attachments": true
1959+ },
1960+ {
1961+ "id": "gpt-5-pro",
1962+ "name": "GPT 5 Pro",
1963+ "cost_per_1m_in": 15,
1964+ "cost_per_1m_out": 120,
1965+ "cost_per_1m_in_cached": 0,
1966+ "cost_per_1m_out_cached": 0,
1967+ "context_window": 400000,
1968+ "default_max_tokens": 128000,
1969+ "can_reason": true,
1970+ "reasoning_levels": [
1971+ "low",
1972+ "medium",
1973+ "high"
1974+ ],
1975+ "default_reasoning_effort": "medium",
1976+ "supports_attachments": true
1977+ },
1978+ {
1979+ "id": "gpt-5.1",
1980+ "name": "GPT 5.1",
1981+ "cost_per_1m_in": 1.25,
1982+ "cost_per_1m_out": 10,
1983+ "cost_per_1m_in_cached": 0,
1984+ "cost_per_1m_out_cached": 0.125,
1985+ "context_window": 400000,
1986+ "default_max_tokens": 128000,
1987+ "can_reason": true,
1988+ "reasoning_levels": [
1989+ "low",
1990+ "medium",
1991+ "high"
1992+ ],
1993+ "default_reasoning_effort": "medium",
1994+ "supports_attachments": true
1995+ },
1996+ {
1997+ "id": "gpt-5.1-chat-latest",
1998+ "name": "GPT 5.1 Chat",
1999+ "cost_per_1m_in": 1.25,
2000+ "cost_per_1m_out": 10,
2001+ "cost_per_1m_in_cached": 0,
2002+ "cost_per_1m_out_cached": 0.125,
2003+ "context_window": 128000,
2004+ "default_max_tokens": 16384,
2005+ "can_reason": false,
2006+ "supports_attachments": true
2007+ },
2008+ {
2009+ "id": "gpt-5.1-codex",
2010+ "name": "GPT-5.1-Codex",
2011+ "cost_per_1m_in": 1.25,
2012+ "cost_per_1m_out": 10,
2013+ "cost_per_1m_in_cached": 0,
2014+ "cost_per_1m_out_cached": 0.125,
2015+ "context_window": 400000,
2016+ "default_max_tokens": 128000,
2017+ "can_reason": true,
2018+ "reasoning_levels": [
2019+ "low",
2020+ "medium",
2021+ "high"
2022+ ],
2023+ "default_reasoning_effort": "medium",
2024+ "supports_attachments": true
2025+ },
2026+ {
2027+ "id": "gpt-5.1-codex-max",
2028+ "name": "GPT-5.1-Codex Max",
2029+ "cost_per_1m_in": 1.25,
2030+ "cost_per_1m_out": 10,
2031+ "cost_per_1m_in_cached": 0,
2032+ "cost_per_1m_out_cached": 0.125,
2033+ "context_window": 400000,
2034+ "default_max_tokens": 128000,
2035+ "can_reason": true,
2036+ "reasoning_levels": [
2037+ "low",
2038+ "medium",
2039+ "high"
2040+ ],
2041+ "default_reasoning_effort": "medium",
2042+ "supports_attachments": true
2043+ },
2044+ {
2045+ "id": "gpt-5.1-codex-mini",
2046+ "name": "GPT-5.1-Codex Mini",
2047+ "cost_per_1m_in": 0.25,
2048+ "cost_per_1m_out": 2,
2049+ "cost_per_1m_in_cached": 0,
2050+ "cost_per_1m_out_cached": 0.025,
2051+ "context_window": 400000,
2052+ "default_max_tokens": 128000,
2053+ "can_reason": true,
2054+ "reasoning_levels": [
2055+ "low",
2056+ "medium",
2057+ "high"
2058+ ],
2059+ "default_reasoning_effort": "medium",
2060+ "supports_attachments": true
2061+ },
2062+ {
2063+ "id": "gpt-5.2",
2064+ "name": "GPT 5.2",
2065+ "cost_per_1m_in": 1.75,
2066+ "cost_per_1m_out": 14,
2067+ "cost_per_1m_in_cached": 0,
2068+ "cost_per_1m_out_cached": 0.175,
2069+ "context_window": 400000,
2070+ "default_max_tokens": 128000,
2071+ "can_reason": true,
2072+ "reasoning_levels": [
2073+ "low",
2074+ "medium",
2075+ "high"
2076+ ],
2077+ "default_reasoning_effort": "medium",
2078+ "supports_attachments": true
2079+ },
2080+ {
2081+ "id": "gpt-5.2-chat-latest",
2082+ "name": "GPT 5.2 Chat",
2083+ "cost_per_1m_in": 1.75,
2084+ "cost_per_1m_out": 14,
2085+ "cost_per_1m_in_cached": 0,
2086+ "cost_per_1m_out_cached": 0.175,
2087+ "context_window": 128000,
2088+ "default_max_tokens": 16384,
2089+ "can_reason": false,
2090+ "supports_attachments": true
2091+ },
2092+ {
2093+ "id": "gpt-5.2-codex",
2094+ "name": "GPT-5.2-Codex",
2095+ "cost_per_1m_in": 1.75,
2096+ "cost_per_1m_out": 14,
2097+ "cost_per_1m_in_cached": 0,
2098+ "cost_per_1m_out_cached": 0.175,
2099+ "context_window": 400000,
2100+ "default_max_tokens": 128000,
2101+ "can_reason": true,
2102+ "reasoning_levels": [
2103+ "low",
2104+ "medium",
2105+ "high"
2106+ ],
2107+ "default_reasoning_effort": "medium",
2108+ "supports_attachments": true
2109+ },
2110+ {
2111+ "id": "gpt-5.2-high",
2112+ "name": "GPT 5.2 High",
2113+ "cost_per_1m_in": 1.75,
2114+ "cost_per_1m_out": 14,
2115+ "cost_per_1m_in_cached": 0,
2116+ "cost_per_1m_out_cached": 0.175,
2117+ "context_window": 400000,
2118+ "default_max_tokens": 128000,
2119+ "can_reason": true,
2120+ "reasoning_levels": [
2121+ "low",
2122+ "medium",
2123+ "high"
2124+ ],
2125+ "default_reasoning_effort": "medium",
2126+ "supports_attachments": true
2127+ },
2128+ {
2129+ "id": "gpt-5.2-low",
2130+ "name": "GPT 5.2 Low",
2131+ "cost_per_1m_in": 1.75,
2132+ "cost_per_1m_out": 14,
2133+ "cost_per_1m_in_cached": 0,
2134+ "cost_per_1m_out_cached": 0.175,
2135+ "context_window": 400000,
2136+ "default_max_tokens": 128000,
2137+ "can_reason": true,
2138+ "reasoning_levels": [
2139+ "low",
2140+ "medium",
2141+ "high"
2142+ ],
2143+ "default_reasoning_effort": "medium",
2144+ "supports_attachments": true
2145+ },
2146+ {
2147+ "id": "gpt-5.2-pro",
2148+ "name": "GPT 5.2 Pro",
2149+ "cost_per_1m_in": 21,
2150+ "cost_per_1m_out": 168,
2151+ "cost_per_1m_in_cached": 0,
2152+ "cost_per_1m_out_cached": 2.1,
2153+ "context_window": 400000,
2154+ "default_max_tokens": 128000,
2155+ "can_reason": true,
2156+ "reasoning_levels": [
2157+ "low",
2158+ "medium",
2159+ "high"
2160+ ],
2161+ "default_reasoning_effort": "medium",
2162+ "supports_attachments": true
2163+ },
2164+ {
2165+ "id": "gpt-5.3-chat-latest",
2166+ "name": "GPT 5.3 Chat",
2167+ "cost_per_1m_in": 1.75,
2168+ "cost_per_1m_out": 14,
2169+ "cost_per_1m_in_cached": 0,
2170+ "cost_per_1m_out_cached": 0.175,
2171+ "context_window": 128000,
2172+ "default_max_tokens": 16384,
2173+ "can_reason": false,
2174+ "supports_attachments": true
2175+ },
2176+ {
2177+ "id": "gpt-5.3-codex",
2178+ "name": "GPT-5.3-Codex",
2179+ "cost_per_1m_in": 1.75,
2180+ "cost_per_1m_out": 14,
2181+ "cost_per_1m_in_cached": 0,
2182+ "cost_per_1m_out_cached": 0.175,
2183+ "context_window": 400000,
2184+ "default_max_tokens": 128000,
2185+ "can_reason": true,
2186+ "reasoning_levels": [
2187+ "low",
2188+ "medium",
2189+ "high"
2190+ ],
2191+ "default_reasoning_effort": "medium",
2192+ "supports_attachments": true
2193+ },
2194+ {
2195+ "id": "gpt-5.4",
2196+ "name": "GPT 5.4",
2197+ "cost_per_1m_in": 2.5,
2198+ "cost_per_1m_out": 15,
2199+ "cost_per_1m_in_cached": 0,
2200+ "cost_per_1m_out_cached": 0.25,
2201+ "context_window": 400000,
2202+ "default_max_tokens": 128000,
2203+ "can_reason": true,
2204+ "reasoning_levels": [
2205+ "low",
2206+ "medium",
2207+ "high"
2208+ ],
2209+ "default_reasoning_effort": "medium",
2210+ "supports_attachments": true
2211+ },
2212+ {
2213+ "id": "gpt-5.4-high",
2214+ "name": "GPT 5.4 High",
2215+ "cost_per_1m_in": 2.5,
2216+ "cost_per_1m_out": 15,
2217+ "cost_per_1m_in_cached": 0,
2218+ "cost_per_1m_out_cached": 0.25,
2219+ "context_window": 400000,
2220+ "default_max_tokens": 128000,
2221+ "can_reason": true,
2222+ "reasoning_levels": [
2223+ "low",
2224+ "medium",
2225+ "high"
2226+ ],
2227+ "default_reasoning_effort": "medium",
2228+ "supports_attachments": true
2229+ },
2230+ {
2231+ "id": "gpt-5.4-low",
2232+ "name": "GPT 5.4 Low",
2233+ "cost_per_1m_in": 2.5,
2234+ "cost_per_1m_out": 15,
2235+ "cost_per_1m_in_cached": 0,
2236+ "cost_per_1m_out_cached": 0.25,
2237+ "context_window": 400000,
2238+ "default_max_tokens": 128000,
2239+ "can_reason": true,
2240+ "reasoning_levels": [
2241+ "low",
2242+ "medium",
2243+ "high"
2244+ ],
2245+ "default_reasoning_effort": "medium",
2246+ "supports_attachments": true
2247+ },
2248+ {
2249+ "id": "gpt-5.4-mini",
2250+ "name": "GPT 5.4 Mini",
2251+ "cost_per_1m_in": 0.75,
2252+ "cost_per_1m_out": 4.5,
2253+ "cost_per_1m_in_cached": 0,
2254+ "cost_per_1m_out_cached": 0.075,
2255+ "context_window": 400000,
2256+ "default_max_tokens": 128000,
2257+ "can_reason": false,
2258+ "supports_attachments": true
2259+ },
2260+ {
2261+ "id": "gpt-5.4-nano",
2262+ "name": "GPT 5.4 Nano",
2263+ "cost_per_1m_in": 0.2,
2264+ "cost_per_1m_out": 1.25,
2265+ "cost_per_1m_in_cached": 0,
2266+ "cost_per_1m_out_cached": 0.02,
2267+ "context_window": 400000,
2268+ "default_max_tokens": 128000,
2269+ "can_reason": true,
2270+ "reasoning_levels": [
2271+ "low",
2272+ "medium",
2273+ "high"
2274+ ],
2275+ "default_reasoning_effort": "medium",
2276+ "supports_attachments": true
2277+ },
2278+ {
2279+ "id": "gpt-5.4-pro",
2280+ "name": "GPT 5.4 Pro",
2281+ "cost_per_1m_in": 30,
2282+ "cost_per_1m_out": 180,
2283+ "cost_per_1m_in_cached": 0,
2284+ "cost_per_1m_out_cached": 30,
2285+ "context_window": 1050000,
2286+ "default_max_tokens": 128000,
2287+ "can_reason": true,
2288+ "reasoning_levels": [
2289+ "low",
2290+ "medium",
2291+ "high"
2292+ ],
2293+ "default_reasoning_effort": "medium",
2294+ "supports_attachments": true
2295+ },
2296+ {
2297+ "id": "gpt-5.5",
2298+ "name": "GPT 5.5",
2299+ "cost_per_1m_in": 5,
2300+ "cost_per_1m_out": 30,
2301+ "cost_per_1m_in_cached": 0,
2302+ "cost_per_1m_out_cached": 0.5,
2303+ "context_window": 1050000,
2304+ "default_max_tokens": 128000,
2305+ "can_reason": true,
2306+ "reasoning_levels": [
2307+ "low",
2308+ "medium",
2309+ "high"
2310+ ],
2311+ "default_reasoning_effort": "medium",
2312+ "supports_attachments": true
2313+ },
2314+ {
2315+ "id": "gpt-5.5-free",
2316+ "name": "GPT 5.5 (free)",
2317+ "cost_per_1m_in": 0,
2318+ "cost_per_1m_out": 0,
2319+ "cost_per_1m_in_cached": 0,
2320+ "cost_per_1m_out_cached": 0,
2321+ "context_window": 1050000,
2322+ "default_max_tokens": 128000,
2323+ "can_reason": true,
2324+ "reasoning_levels": [
2325+ "low",
2326+ "medium",
2327+ "high"
2328+ ],
2329+ "default_reasoning_effort": "medium",
2330+ "supports_attachments": true
2331+ },
2332+ {
2333+ "id": "gpt-5.5-pro",
2334+ "name": "GPT 5.5 Pro",
2335+ "cost_per_1m_in": 30,
2336+ "cost_per_1m_out": 180,
2337+ "cost_per_1m_in_cached": 0,
2338+ "cost_per_1m_out_cached": 30,
2339+ "context_window": 1050000,
2340+ "default_max_tokens": 128000,
2341+ "can_reason": true,
2342+ "reasoning_levels": [
2343+ "low",
2344+ "medium",
2345+ "high"
2346+ ],
2347+ "default_reasoning_effort": "medium",
2348+ "supports_attachments": true
2349+ },
2350+ {
2351+ "id": "gpt-chat-latest",
2352+ "name": "GPT Chat",
2353+ "cost_per_1m_in": 5,
2354+ "cost_per_1m_out": 30,
2355+ "cost_per_1m_in_cached": 0,
2356+ "cost_per_1m_out_cached": 0.5,
2357+ "context_window": 1050000,
2358+ "default_max_tokens": 128000,
2359+ "can_reason": true,
2360+ "reasoning_levels": [
2361+ "low",
2362+ "medium",
2363+ "high"
2364+ ],
2365+ "default_reasoning_effort": "medium",
2366+ "supports_attachments": true
2367+ },
2368+ {
2369+ "id": "gpt-oss-120b",
2370+ "name": "gpt-oss-120b",
2371+ "cost_per_1m_in": 0.18,
2372+ "cost_per_1m_out": 0.9,
2373+ "cost_per_1m_in_cached": 0,
2374+ "cost_per_1m_out_cached": 0,
2375+ "context_window": 131072,
2376+ "default_max_tokens": 32768,
2377+ "can_reason": true,
2378+ "reasoning_levels": [
2379+ "low",
2380+ "medium",
2381+ "high"
2382+ ],
2383+ "default_reasoning_effort": "medium",
2384+ "supports_attachments": false
2385+ },
2386+ {
2387+ "id": "gpt-oss-20b",
2388+ "name": "gpt-oss-20b",
2389+ "cost_per_1m_in": 0.11,
2390+ "cost_per_1m_out": 0.55,
2391+ "cost_per_1m_in_cached": 0,
2392+ "cost_per_1m_out_cached": 0,
2393+ "context_window": 128000,
2394+ "default_max_tokens": 12800,
2395+ "can_reason": true,
2396+ "reasoning_levels": [
2397+ "low",
2398+ "medium",
2399+ "high"
2400+ ],
2401+ "default_reasoning_effort": "medium",
2402+ "supports_attachments": false
2403+ },
2404+ {
2405+ "id": "grok-4",
2406+ "name": "Grok 4",
2407+ "cost_per_1m_in": 3.3,
2408+ "cost_per_1m_out": 16.5,
2409+ "cost_per_1m_in_cached": 0,
2410+ "cost_per_1m_out_cached": 0.825,
2411+ "context_window": 256000,
2412+ "default_max_tokens": 64000,
2413+ "can_reason": true,
2414+ "reasoning_levels": [
2415+ "low",
2416+ "medium",
2417+ "high"
2418+ ],
2419+ "default_reasoning_effort": "medium",
2420+ "supports_attachments": true
2421+ },
2422+ {
2423+ "id": "grok-4-1-fast-non-reasoning",
2424+ "name": "Grok 4.1 Fast",
2425+ "cost_per_1m_in": 0.2,
2426+ "cost_per_1m_out": 0.5,
2427+ "cost_per_1m_in_cached": 0,
2428+ "cost_per_1m_out_cached": 0.05,
2429+ "context_window": 2000000,
2430+ "default_max_tokens": 200000,
2431+ "can_reason": false,
2432+ "supports_attachments": true
2433+ },
2434+ {
2435+ "id": "grok-4-1-fast-reasoning",
2436+ "name": "Grok 4.1 Fast (reasoning)",
2437+ "cost_per_1m_in": 0.2,
2438+ "cost_per_1m_out": 0.5,
2439+ "cost_per_1m_in_cached": 0,
2440+ "cost_per_1m_out_cached": 0.05,
2441+ "context_window": 2000000,
2442+ "default_max_tokens": 200000,
2443+ "can_reason": true,
2444+ "reasoning_levels": [
2445+ "low",
2446+ "medium",
2447+ "high"
2448+ ],
2449+ "default_reasoning_effort": "medium",
2450+ "supports_attachments": true
2451+ },
2452+ {
2453+ "id": "grok-4-20-non-reasoning",
2454+ "name": "Grok 4 20",
2455+ "cost_per_1m_in": 2,
2456+ "cost_per_1m_out": 6,
2457+ "cost_per_1m_in_cached": 0,
2458+ "cost_per_1m_out_cached": 0.2,
2459+ "context_window": 2000000,
2460+ "default_max_tokens": 200000,
2461+ "can_reason": true,
2462+ "reasoning_levels": [
2463+ "low",
2464+ "medium",
2465+ "high"
2466+ ],
2467+ "default_reasoning_effort": "medium",
2468+ "supports_attachments": true
2469+ },
2470+ {
2471+ "id": "grok-4-20-reasoning",
2472+ "name": "Grok 4 20 (reasoning)",
2473+ "cost_per_1m_in": 2,
2474+ "cost_per_1m_out": 6,
2475+ "cost_per_1m_in_cached": 0,
2476+ "cost_per_1m_out_cached": 0.2,
2477+ "context_window": 2000000,
2478+ "default_max_tokens": 200000,
2479+ "can_reason": true,
2480+ "reasoning_levels": [
2481+ "low",
2482+ "medium",
2483+ "high"
2484+ ],
2485+ "default_reasoning_effort": "medium",
2486+ "supports_attachments": true
2487+ },
2488+ {
2489+ "id": "grok-4-fast-non-reasoning",
2490+ "name": "Grok 4 Fast",
2491+ "cost_per_1m_in": 0.2,
2492+ "cost_per_1m_out": 0.5,
2493+ "cost_per_1m_in_cached": 0,
2494+ "cost_per_1m_out_cached": 0.05,
2495+ "context_window": 2000000,
2496+ "default_max_tokens": 30000,
2497+ "can_reason": false,
2498+ "supports_attachments": true
2499+ },
2500+ {
2501+ "id": "grok-4-fast-reasoning",
2502+ "name": "Grok 4 Fast (reasoning)",
2503+ "cost_per_1m_in": 0.2,
2504+ "cost_per_1m_out": 0.5,
2505+ "cost_per_1m_in_cached": 0,
2506+ "cost_per_1m_out_cached": 0.05,
2507+ "context_window": 2000000,
2508+ "default_max_tokens": 30000,
2509+ "can_reason": true,
2510+ "reasoning_levels": [
2511+ "low",
2512+ "medium",
2513+ "high"
2514+ ],
2515+ "default_reasoning_effort": "medium",
2516+ "supports_attachments": true
2517+ },
2518+ {
2519+ "id": "grok-4.20-beta-0309-non-reasoning",
2520+ "name": "Grok 4.20 Beta 0309",
2521+ "cost_per_1m_in": 2,
2522+ "cost_per_1m_out": 6,
2523+ "cost_per_1m_in_cached": 0,
2524+ "cost_per_1m_out_cached": 0.2,
2525+ "context_window": 2000000,
2526+ "default_max_tokens": 200000,
2527+ "can_reason": true,
2528+ "reasoning_levels": [
2529+ "low",
2530+ "medium",
2531+ "high"
2532+ ],
2533+ "default_reasoning_effort": "medium",
2534+ "supports_attachments": true
2535+ },
2536+ {
2537+ "id": "grok-4.20-beta-0309-reasoning",
2538+ "name": "Grok 4.20 Beta 0309 (reasoning)",
2539+ "cost_per_1m_in": 2,
2540+ "cost_per_1m_out": 6,
2541+ "cost_per_1m_in_cached": 0,
2542+ "cost_per_1m_out_cached": 0.2,
2543+ "context_window": 2000000,
2544+ "default_max_tokens": 200000,
2545+ "can_reason": true,
2546+ "reasoning_levels": [
2547+ "low",
2548+ "medium",
2549+ "high"
2550+ ],
2551+ "default_reasoning_effort": "medium",
2552+ "supports_attachments": true
2553+ },
2554+ {
2555+ "id": "grok-4.20-multi-agent-0309",
2556+ "name": "Grok 4.20 Multi Agent 0309",
2557+ "cost_per_1m_in": 2,
2558+ "cost_per_1m_out": 6,
2559+ "cost_per_1m_in_cached": 0,
2560+ "cost_per_1m_out_cached": 0.2,
2561+ "context_window": 2000000,
2562+ "default_max_tokens": 200000,
2563+ "can_reason": true,
2564+ "reasoning_levels": [
2565+ "low",
2566+ "medium",
2567+ "high"
2568+ ],
2569+ "default_reasoning_effort": "medium",
2570+ "supports_attachments": true
2571+ },
2572+ {
2573+ "id": "grok-4.20-multi-agent-beta-0309",
2574+ "name": "Grok 4.20 Multi Agent Beta 0309",
2575+ "cost_per_1m_in": 2,
2576+ "cost_per_1m_out": 6,
2577+ "cost_per_1m_in_cached": 0,
2578+ "cost_per_1m_out_cached": 0.2,
2579+ "context_window": 2000000,
2580+ "default_max_tokens": 200000,
2581+ "can_reason": true,
2582+ "reasoning_levels": [
2583+ "low",
2584+ "medium",
2585+ "high"
2586+ ],
2587+ "default_reasoning_effort": "medium",
2588+ "supports_attachments": true
2589+ },
2590+ {
2591+ "id": "grok-4.3",
2592+ "name": "Grok 4.3",
2593+ "cost_per_1m_in": 1.25,
2594+ "cost_per_1m_out": 2.5,
2595+ "cost_per_1m_in_cached": 0,
2596+ "cost_per_1m_out_cached": 0.2,
2597+ "context_window": 1000000,
2598+ "default_max_tokens": 100000,
2599+ "can_reason": true,
2600+ "reasoning_levels": [
2601+ "low",
2602+ "medium",
2603+ "high"
2604+ ],
2605+ "default_reasoning_effort": "medium",
2606+ "supports_attachments": true
2607+ },
2608+ {
2609+ "id": "grok-build-0.1",
2610+ "name": "Grok Build 0.1",
2611+ "cost_per_1m_in": 1,
2612+ "cost_per_1m_out": 2,
2613+ "cost_per_1m_in_cached": 0,
2614+ "cost_per_1m_out_cached": 0.2,
2615+ "context_window": 256000,
2616+ "default_max_tokens": 25600,
2617+ "can_reason": true,
2618+ "reasoning_levels": [
2619+ "low",
2620+ "medium",
2621+ "high"
2622+ ],
2623+ "default_reasoning_effort": "medium",
2624+ "supports_attachments": true
2625+ },
2626+ {
2627+ "id": "grok-code-fast-1",
2628+ "name": "Grok Code Fast 1",
2629+ "cost_per_1m_in": 0.2,
2630+ "cost_per_1m_out": 0.5,
2631+ "cost_per_1m_in_cached": 0,
2632+ "cost_per_1m_out_cached": 0.05,
2633+ "context_window": 256000,
2634+ "default_max_tokens": 10000,
2635+ "can_reason": true,
2636+ "reasoning_levels": [
2637+ "low",
2638+ "medium",
2639+ "high"
2640+ ],
2641+ "default_reasoning_effort": "medium",
2642+ "supports_attachments": true
2643+ },
2644+ {
2645+ "id": "hy3-preview",
2646+ "name": "Hy3 Preview",
2647+ "cost_per_1m_in": 0.17,
2648+ "cost_per_1m_out": 0.56666,
2649+ "cost_per_1m_in_cached": 0,
2650+ "cost_per_1m_out_cached": 0.051,
2651+ "context_window": 256000,
2652+ "default_max_tokens": 128000,
2653+ "can_reason": true,
2654+ "reasoning_levels": [
2655+ "low",
2656+ "medium",
2657+ "high"
2658+ ],
2659+ "default_reasoning_effort": "medium",
2660+ "supports_attachments": false
2661+ },
2662+ {
2663+ "id": "jina-deepsearch-v1",
2664+ "name": "Jina Deepsearch V1",
2665+ "cost_per_1m_in": 0.05,
2666+ "cost_per_1m_out": 0.05,
2667+ "cost_per_1m_in_cached": 0,
2668+ "cost_per_1m_out_cached": 0,
2669+ "context_window": 1000000,
2670+ "default_max_tokens": 100000,
2671+ "can_reason": true,
2672+ "reasoning_levels": [
2673+ "low",
2674+ "medium",
2675+ "high"
2676+ ],
2677+ "default_reasoning_effort": "medium",
2678+ "supports_attachments": true
2679+ },
2680+ {
2681+ "id": "k2.6-code-preview-free",
2682+ "name": "K2.6 Code Preview (free)",
2683+ "cost_per_1m_in": 0,
2684+ "cost_per_1m_out": 0,
2685+ "cost_per_1m_in_cached": 0,
2686+ "cost_per_1m_out_cached": 0,
2687+ "context_window": 256000,
2688+ "default_max_tokens": 25600,
2689+ "can_reason": true,
2690+ "reasoning_levels": [
2691+ "low",
2692+ "medium",
2693+ "high"
2694+ ],
2695+ "default_reasoning_effort": "medium",
2696+ "supports_attachments": false
2697+ },
2698+ {
2699+ "id": "kat-dev",
2700+ "name": "Kat Dev",
2701+ "cost_per_1m_in": 0.137,
2702+ "cost_per_1m_out": 0.548,
2703+ "cost_per_1m_in_cached": 0,
2704+ "cost_per_1m_out_cached": 0,
2705+ "context_window": 128000,
2706+ "default_max_tokens": 12800,
2707+ "can_reason": false,
2708+ "supports_attachments": false
2709+ },
2710+ {
2711+ "id": "kimi-for-coding-free",
2712+ "name": "Kimi For Coding (free)",
2713+ "cost_per_1m_in": 0,
2714+ "cost_per_1m_out": 0,
2715+ "cost_per_1m_in_cached": 0,
2716+ "cost_per_1m_out_cached": 0,
2717+ "context_window": 256000,
2718+ "default_max_tokens": 25600,
2719+ "can_reason": true,
2720+ "reasoning_levels": [
2721+ "low",
2722+ "medium",
2723+ "high"
2724+ ],
2725+ "default_reasoning_effort": "medium",
2726+ "supports_attachments": false
2727+ },
2728+ {
2729+ "id": "kimi-k2-0711",
2730+ "name": "Kimi K2 0711",
2731+ "cost_per_1m_in": 0.54,
2732+ "cost_per_1m_out": 2.16,
2733+ "cost_per_1m_in_cached": 0,
2734+ "cost_per_1m_out_cached": 0,
2735+ "context_window": 131000,
2736+ "default_max_tokens": 13100,
2737+ "can_reason": false,
2738+ "supports_attachments": false
2739+ },
2740+ {
2741+ "id": "kimi-k2-thinking",
2742+ "name": "Kimi K2 Thinking",
2743+ "cost_per_1m_in": 0.548,
2744+ "cost_per_1m_out": 2.192,
2745+ "cost_per_1m_in_cached": 0,
2746+ "cost_per_1m_out_cached": 0.137,
2747+ "context_window": 262144,
2748+ "default_max_tokens": 26214,
2749+ "can_reason": true,
2750+ "reasoning_levels": [
2751+ "low",
2752+ "medium",
2753+ "high"
2754+ ],
2755+ "default_reasoning_effort": "medium",
2756+ "supports_attachments": false
2757+ },
2758+ {
2759+ "id": "kimi-k2-turbo-preview",
2760+ "name": "Kimi K2 Turbo Preview",
2761+ "cost_per_1m_in": 1.2,
2762+ "cost_per_1m_out": 4.8,
2763+ "cost_per_1m_in_cached": 0,
2764+ "cost_per_1m_out_cached": 0.3,
2765+ "context_window": 262144,
2766+ "default_max_tokens": 26214,
2767+ "can_reason": false,
2768+ "supports_attachments": false
2769+ },
2770+ {
2771+ "id": "kimi-k2.5",
2772+ "name": "Kimi K2.5",
2773+ "cost_per_1m_in": 0.6,
2774+ "cost_per_1m_out": 3,
2775+ "cost_per_1m_in_cached": 0,
2776+ "cost_per_1m_out_cached": 0.105,
2777+ "context_window": 256000,
2778+ "default_max_tokens": 25600,
2779+ "can_reason": true,
2780+ "reasoning_levels": [
2781+ "low",
2782+ "medium",
2783+ "high"
2784+ ],
2785+ "default_reasoning_effort": "medium",
2786+ "supports_attachments": true
2787+ },
2788+ {
2789+ "id": "kimi-k2.6",
2790+ "name": "Kimi K2.6",
2791+ "cost_per_1m_in": 0.95,
2792+ "cost_per_1m_out": 3.9995,
2793+ "cost_per_1m_in_cached": 0,
2794+ "cost_per_1m_out_cached": 0.16084,
2795+ "context_window": 262144,
2796+ "default_max_tokens": 32768,
2797+ "can_reason": true,
2798+ "reasoning_levels": [
2799+ "low",
2800+ "medium",
2801+ "high"
2802+ ],
2803+ "default_reasoning_effort": "medium",
2804+ "supports_attachments": true
2805+ },
2806+ {
2807+ "id": "kimi-k2.7-code",
2808+ "name": "Kimi K2.7 Code",
2809+ "cost_per_1m_in": 0.95,
2810+ "cost_per_1m_out": 3.9995,
2811+ "cost_per_1m_in_cached": 0,
2812+ "cost_per_1m_out_cached": 0.16084,
2813+ "context_window": 262144,
2814+ "default_max_tokens": 32768,
2815+ "can_reason": true,
2816+ "reasoning_levels": [
2817+ "low",
2818+ "medium",
2819+ "high"
2820+ ],
2821+ "default_reasoning_effort": "medium",
2822+ "supports_attachments": true
2823+ },
2824+ {
2825+ "id": "kimi-k2.7-code-highspeed",
2826+ "name": "Kimi K2.7 Code Highspeed",
2827+ "cost_per_1m_in": 1.9,
2828+ "cost_per_1m_out": 7.999,
2829+ "cost_per_1m_in_cached": 0,
2830+ "cost_per_1m_out_cached": 0.32167,
2831+ "context_window": 262144,
2832+ "default_max_tokens": 32768,
2833+ "can_reason": true,
2834+ "reasoning_levels": [
2835+ "low",
2836+ "medium",
2837+ "high"
2838+ ],
2839+ "default_reasoning_effort": "medium",
2840+ "supports_attachments": true
2841+ },
2842+ {
2843+ "id": "llama-4-maverick",
2844+ "name": "Llama 4 Maverick",
2845+ "cost_per_1m_in": 0.2,
2846+ "cost_per_1m_out": 0.2,
2847+ "cost_per_1m_in_cached": 0,
2848+ "cost_per_1m_out_cached": 0,
2849+ "context_window": 1048576,
2850+ "default_max_tokens": 32000,
2851+ "can_reason": false,
2852+ "supports_attachments": true
2853+ },
2854+ {
2855+ "id": "llama-4-scout",
2856+ "name": "Llama 4 Scout",
2857+ "cost_per_1m_in": 0.2,
2858+ "cost_per_1m_out": 0.2,
2859+ "cost_per_1m_in_cached": 0,
2860+ "cost_per_1m_out_cached": 0,
2861+ "context_window": 131000,
2862+ "default_max_tokens": 13100,
2863+ "can_reason": false,
2864+ "supports_attachments": true
2865+ },
2866+ {
2867+ "id": "mimo-v2-flash-free",
2868+ "name": "MiMo V2 Flash (free)",
2869+ "cost_per_1m_in": 0,
2870+ "cost_per_1m_out": 0,
2871+ "cost_per_1m_in_cached": 0,
2872+ "cost_per_1m_out_cached": 0,
2873+ "context_window": 256000,
2874+ "default_max_tokens": 25600,
2875+ "can_reason": false,
2876+ "supports_attachments": false
2877+ },
2878+ {
2879+ "id": "mimo-v2-omni",
2880+ "name": "MiMo V2 Omni",
2881+ "cost_per_1m_in": 0.44,
2882+ "cost_per_1m_out": 2.2,
2883+ "cost_per_1m_in_cached": 0,
2884+ "cost_per_1m_out_cached": 0.088,
2885+ "context_window": 256000,
2886+ "default_max_tokens": 25600,
2887+ "can_reason": false,
2888+ "supports_attachments": true
2889+ },
2890+ {
2891+ "id": "mimo-v2-pro",
2892+ "name": "MiMo V2 Pro",
2893+ "cost_per_1m_in": 1.1,
2894+ "cost_per_1m_out": 3.3,
2895+ "cost_per_1m_in_cached": 0,
2896+ "cost_per_1m_out_cached": 0.22,
2897+ "context_window": 1000000,
2898+ "default_max_tokens": 100000,
2899+ "can_reason": false,
2900+ "supports_attachments": true
2901+ },
2902+ {
2903+ "id": "minimax-m2",
2904+ "name": "MiniMax M2",
2905+ "cost_per_1m_in": 0.288,
2906+ "cost_per_1m_out": 1.152,
2907+ "cost_per_1m_in_cached": 0,
2908+ "cost_per_1m_out_cached": 0,
2909+ "context_window": 204800,
2910+ "default_max_tokens": 20480,
2911+ "can_reason": true,
2912+ "reasoning_levels": [
2913+ "low",
2914+ "medium",
2915+ "high"
2916+ ],
2917+ "default_reasoning_effort": "medium",
2918+ "supports_attachments": false
2919+ },
2920+ {
2921+ "id": "minimax-m2.1",
2922+ "name": "MiniMax M2.1",
2923+ "cost_per_1m_in": 0.288,
2924+ "cost_per_1m_out": 1.152,
2925+ "cost_per_1m_in_cached": 0,
2926+ "cost_per_1m_out_cached": 0,
2927+ "context_window": 204800,
2928+ "default_max_tokens": 20480,
2929+ "can_reason": true,
2930+ "reasoning_levels": [
2931+ "low",
2932+ "medium",
2933+ "high"
2934+ ],
2935+ "default_reasoning_effort": "medium",
2936+ "supports_attachments": false
2937+ },
2938+ {
2939+ "id": "minimax-m2.5",
2940+ "name": "MiniMax M2.5",
2941+ "cost_per_1m_in": 0.288,
2942+ "cost_per_1m_out": 1.152,
2943+ "cost_per_1m_in_cached": 0,
2944+ "cost_per_1m_out_cached": 0,
2945+ "context_window": 204800,
2946+ "default_max_tokens": 20480,
2947+ "can_reason": true,
2948+ "reasoning_levels": [
2949+ "low",
2950+ "medium",
2951+ "high"
2952+ ],
2953+ "default_reasoning_effort": "medium",
2954+ "supports_attachments": false
2955+ },
2956+ {
2957+ "id": "minimax-m2.5-highspeed",
2958+ "name": "MiniMax M2.5 Highspeed",
2959+ "cost_per_1m_in": 0.288,
2960+ "cost_per_1m_out": 1.152,
2961+ "cost_per_1m_in_cached": 0,
2962+ "cost_per_1m_out_cached": 0,
2963+ "context_window": 204800,
2964+ "default_max_tokens": 20480,
2965+ "can_reason": true,
2966+ "reasoning_levels": [
2967+ "low",
2968+ "medium",
2969+ "high"
2970+ ],
2971+ "default_reasoning_effort": "medium",
2972+ "supports_attachments": false
2973+ },
2974+ {
2975+ "id": "minimax-m2.7",
2976+ "name": "MiniMax M2.7",
2977+ "cost_per_1m_in": 0.2958,
2978+ "cost_per_1m_out": 1.1832,
2979+ "cost_per_1m_in_cached": 0,
2980+ "cost_per_1m_out_cached": 0.05916,
2981+ "context_window": 200000,
2982+ "default_max_tokens": 20000,
2983+ "can_reason": true,
2984+ "reasoning_levels": [
2985+ "low",
2986+ "medium",
2987+ "high"
2988+ ],
2989+ "default_reasoning_effort": "medium",
2990+ "supports_attachments": false
2991+ },
2992+ {
2993+ "id": "minimax-m3",
2994+ "name": "MiniMax M3",
2995+ "cost_per_1m_in": 0.288,
2996+ "cost_per_1m_out": 1.152,
2997+ "cost_per_1m_in_cached": 0,
2998+ "cost_per_1m_out_cached": 0,
2999+ "context_window": 204800,
3000+ "default_max_tokens": 20480,
3001+ "can_reason": true,
3002+ "reasoning_levels": [
3003+ "low",
3004+ "medium",
3005+ "high"
3006+ ],
3007+ "default_reasoning_effort": "medium",
3008+ "supports_attachments": false
3009+ },
3010+ {
3011+ "id": "mistral-large-3",
3012+ "name": "Mistral Large 3",
3013+ "cost_per_1m_in": 0.5,
3014+ "cost_per_1m_out": 1.5,
3015+ "cost_per_1m_in_cached": 0,
3016+ "cost_per_1m_out_cached": 0,
3017+ "context_window": 256000,
3018+ "default_max_tokens": 25600,
3019+ "can_reason": false,
3020+ "supports_attachments": true
3021+ },
3022+ {
3023+ "id": "nvidia-nemotron-3-super-120b-a12b",
3024+ "name": "Nvidia Nemotron 3 Super 120B A12B",
3025+ "cost_per_1m_in": 0.11,
3026+ "cost_per_1m_out": 0.55,
3027+ "cost_per_1m_in_cached": 0,
3028+ "cost_per_1m_out_cached": 0.0275,
3029+ "context_window": 1000000,
3030+ "default_max_tokens": 100000,
3031+ "can_reason": true,
3032+ "reasoning_levels": [
3033+ "low",
3034+ "medium",
3035+ "high"
3036+ ],
3037+ "default_reasoning_effort": "medium",
3038+ "supports_attachments": false
3039+ },
3040+ {
3041+ "id": "o3",
3042+ "name": "O3",
3043+ "cost_per_1m_in": 2,
3044+ "cost_per_1m_out": 8,
3045+ "cost_per_1m_in_cached": 0,
3046+ "cost_per_1m_out_cached": 0.5,
3047+ "context_window": 200000,
3048+ "default_max_tokens": 100000,
3049+ "can_reason": true,
3050+ "reasoning_levels": [
3051+ "low",
3052+ "medium",
3053+ "high"
3054+ ],
3055+ "default_reasoning_effort": "medium",
3056+ "supports_attachments": true
3057+ },
3058+ {
3059+ "id": "o3-mini",
3060+ "name": "O3 Mini",
3061+ "cost_per_1m_in": 1.1,
3062+ "cost_per_1m_out": 4.4,
3063+ "cost_per_1m_in_cached": 0,
3064+ "cost_per_1m_out_cached": 0.55,
3065+ "context_window": 200000,
3066+ "default_max_tokens": 100000,
3067+ "can_reason": true,
3068+ "reasoning_levels": [
3069+ "low",
3070+ "medium",
3071+ "high"
3072+ ],
3073+ "default_reasoning_effort": "medium",
3074+ "supports_attachments": true
3075+ },
3076+ {
3077+ "id": "o3-pro",
3078+ "name": "O3 Pro",
3079+ "cost_per_1m_in": 20,
3080+ "cost_per_1m_out": 80,
3081+ "cost_per_1m_in_cached": 0,
3082+ "cost_per_1m_out_cached": 20,
3083+ "context_window": 200000,
3084+ "default_max_tokens": 100000,
3085+ "can_reason": true,
3086+ "reasoning_levels": [
3087+ "low",
3088+ "medium",
3089+ "high"
3090+ ],
3091+ "default_reasoning_effort": "medium",
3092+ "supports_attachments": true
3093+ },
3094+ {
3095+ "id": "o4-mini",
3096+ "name": "O4 Mini",
3097+ "cost_per_1m_in": 1.1,
3098+ "cost_per_1m_out": 4.4,
3099+ "cost_per_1m_in_cached": 0,
3100+ "cost_per_1m_out_cached": 0.275,
3101+ "context_window": 200000,
3102+ "default_max_tokens": 100000,
3103+ "can_reason": true,
3104+ "reasoning_levels": [
3105+ "low",
3106+ "medium",
3107+ "high"
3108+ ],
3109+ "default_reasoning_effort": "medium",
3110+ "supports_attachments": true
3111+ },
3112+ {
3113+ "id": "qwen3-235b-a22b",
3114+ "name": "Qwen3 235B A22B",
3115+ "cost_per_1m_in": 0.28,
3116+ "cost_per_1m_out": 1.12,
3117+ "cost_per_1m_in_cached": 0,
3118+ "cost_per_1m_out_cached": 0,
3119+ "context_window": 131100,
3120+ "default_max_tokens": 13110,
3121+ "can_reason": false,
3122+ "supports_attachments": true
3123+ },
3124+ {
3125+ "id": "qwen3-235b-a22b-instruct-2507",
3126+ "name": "Qwen3 235B A22B Instruct 2507",
3127+ "cost_per_1m_in": 0.28,
3128+ "cost_per_1m_out": 1.12,
3129+ "cost_per_1m_in_cached": 0,
3130+ "cost_per_1m_out_cached": 0,
3131+ "context_window": 262144,
3132+ "default_max_tokens": 26214,
3133+ "can_reason": false,
3134+ "supports_attachments": true
3135+ },
3136+ {
3137+ "id": "qwen3-235b-a22b-thinking-2507",
3138+ "name": "Qwen3 235B A22B Thinking 2507",
3139+ "cost_per_1m_in": 0.28,
3140+ "cost_per_1m_out": 2.8,
3141+ "cost_per_1m_in_cached": 0,
3142+ "cost_per_1m_out_cached": 0,
3143+ "context_window": 262144,
3144+ "default_max_tokens": 26214,
3145+ "can_reason": true,
3146+ "reasoning_levels": [
3147+ "low",
3148+ "medium",
3149+ "high"
3150+ ],
3151+ "default_reasoning_effort": "medium",
3152+ "supports_attachments": true
3153+ },
3154+ {
3155+ "id": "qwen3-coder-30b-a3b-instruct",
3156+ "name": "Qwen3 Coder 30B A3B Instruct",
3157+ "cost_per_1m_in": 0.2,
3158+ "cost_per_1m_out": 0.8,
3159+ "cost_per_1m_in_cached": 0,
3160+ "cost_per_1m_out_cached": 0.2,
3161+ "context_window": 2000000,
3162+ "default_max_tokens": 262000,
3163+ "can_reason": false,
3164+ "supports_attachments": false
3165+ },
3166+ {
3167+ "id": "qwen3-coder-480b-a35b-instruct",
3168+ "name": "Qwen3 Coder 480B A35B Instruct",
3169+ "cost_per_1m_in": 0.82,
3170+ "cost_per_1m_out": 3.28,
3171+ "cost_per_1m_in_cached": 0,
3172+ "cost_per_1m_out_cached": 0.82,
3173+ "context_window": 262000,
3174+ "default_max_tokens": 26200,
3175+ "can_reason": false,
3176+ "supports_attachments": false
3177+ },
3178+ {
3179+ "id": "qwen3-coder-flash",
3180+ "name": "Qwen3 Coder Flash",
3181+ "cost_per_1m_in": 0.136,
3182+ "cost_per_1m_out": 0.544,
3183+ "cost_per_1m_in_cached": 0,
3184+ "cost_per_1m_out_cached": 0.136,
3185+ "context_window": 256000,
3186+ "default_max_tokens": 65536,
3187+ "can_reason": false,
3188+ "supports_attachments": false
3189+ },
3190+ {
3191+ "id": "qwen3-coder-next",
3192+ "name": "Qwen3 Coder Next",
3193+ "cost_per_1m_in": 0.137,
3194+ "cost_per_1m_out": 0.548,
3195+ "cost_per_1m_in_cached": 0,
3196+ "cost_per_1m_out_cached": 0.137,
3197+ "context_window": 2000000,
3198+ "default_max_tokens": 64000,
3199+ "can_reason": false,
3200+ "supports_attachments": false
3201+ },
3202+ {
3203+ "id": "qwen3-coder-plus",
3204+ "name": "Qwen3 Coder Plus",
3205+ "cost_per_1m_in": 0.54,
3206+ "cost_per_1m_out": 2.16,
3207+ "cost_per_1m_in_cached": 0,
3208+ "cost_per_1m_out_cached": 0.108,
3209+ "context_window": 1048576,
3210+ "default_max_tokens": 65536,
3211+ "can_reason": false,
3212+ "supports_attachments": false
3213+ },
3214+ {
3215+ "id": "qwen3-coder-plus-2025-07-22",
3216+ "name": "Qwen3 Coder Plus 2025 07-22",
3217+ "cost_per_1m_in": 0.54,
3218+ "cost_per_1m_out": 2.16,
3219+ "cost_per_1m_in_cached": 0,
3220+ "cost_per_1m_out_cached": 0.54,
3221+ "context_window": 128000,
3222+ "default_max_tokens": 12800,
3223+ "can_reason": false,
3224+ "supports_attachments": false
3225+ },
3226+ {
3227+ "id": "qwen3-max",
3228+ "name": "Qwen3 Max",
3229+ "cost_per_1m_in": 0.4508,
3230+ "cost_per_1m_out": 1.8032,
3231+ "cost_per_1m_in_cached": 0.5635,
3232+ "cost_per_1m_out_cached": 0.09016,
3233+ "context_window": 262144,
3234+ "default_max_tokens": 65536,
3235+ "can_reason": false,
3236+ "supports_attachments": true
3237+ },
3238+ {
3239+ "id": "qwen3-max-2026-01-23",
3240+ "name": "Qwen3 Max 2026 01-23",
3241+ "cost_per_1m_in": 0.4508,
3242+ "cost_per_1m_out": 1.8032,
3243+ "cost_per_1m_in_cached": 0.5635,
3244+ "cost_per_1m_out_cached": 0.09016,
3245+ "context_window": 252000,
3246+ "default_max_tokens": 32000,
3247+ "can_reason": true,
3248+ "reasoning_levels": [
3249+ "low",
3250+ "medium",
3251+ "high"
3252+ ],
3253+ "default_reasoning_effort": "medium",
3254+ "supports_attachments": false
3255+ },
3256+ {
3257+ "id": "qwen3-next-80b-a3b-instruct",
3258+ "name": "Qwen3 Next 80B A3B Instruct",
3259+ "cost_per_1m_in": 0.138,
3260+ "cost_per_1m_out": 0.552,
3261+ "cost_per_1m_in_cached": 0,
3262+ "cost_per_1m_out_cached": 0,
3263+ "context_window": 256000,
3264+ "default_max_tokens": 25600,
3265+ "can_reason": false,
3266+ "supports_attachments": true
3267+ },
3268+ {
3269+ "id": "qwen3-next-80b-a3b-thinking",
3270+ "name": "Qwen3 Next 80B A3B Thinking",
3271+ "cost_per_1m_in": 0.142,
3272+ "cost_per_1m_out": 1.42,
3273+ "cost_per_1m_in_cached": 0,
3274+ "cost_per_1m_out_cached": 0,
3275+ "context_window": 256000,
3276+ "default_max_tokens": 25600,
3277+ "can_reason": true,
3278+ "reasoning_levels": [
3279+ "low",
3280+ "medium",
3281+ "high"
3282+ ],
3283+ "default_reasoning_effort": "medium",
3284+ "supports_attachments": true
3285+ },
3286+ {
3287+ "id": "qwen3-vl-235b-a22b-instruct",
3288+ "name": "Qwen3 VL 235B A22B Instruct",
3289+ "cost_per_1m_in": 0.274,
3290+ "cost_per_1m_out": 1.096,
3291+ "cost_per_1m_in_cached": 0,
3292+ "cost_per_1m_out_cached": 0,
3293+ "context_window": 131000,
3294+ "default_max_tokens": 33000,
3295+ "can_reason": false,
3296+ "supports_attachments": true
3297+ },
3298+ {
3299+ "id": "qwen3-vl-235b-a22b-thinking",
3300+ "name": "Qwen3 VL 235B A22B Thinking",
3301+ "cost_per_1m_in": 0.274,
3302+ "cost_per_1m_out": 2.74,
3303+ "cost_per_1m_in_cached": 0,
3304+ "cost_per_1m_out_cached": 0,
3305+ "context_window": 131000,
3306+ "default_max_tokens": 33000,
3307+ "can_reason": true,
3308+ "reasoning_levels": [
3309+ "low",
3310+ "medium",
3311+ "high"
3312+ ],
3313+ "default_reasoning_effort": "medium",
3314+ "supports_attachments": true
3315+ },
3316+ {
3317+ "id": "qwen3-vl-30b-a3b-instruct",
3318+ "name": "Qwen3 VL 30B A3B Instruct",
3319+ "cost_per_1m_in": 0.1028,
3320+ "cost_per_1m_out": 0.4112,
3321+ "cost_per_1m_in_cached": 0,
3322+ "cost_per_1m_out_cached": 0,
3323+ "context_window": 128000,
3324+ "default_max_tokens": 32000,
3325+ "can_reason": false,
3326+ "supports_attachments": true
3327+ },
3328+ {
3329+ "id": "qwen3-vl-30b-a3b-thinking",
3330+ "name": "Qwen3 VL 30B A3B Thinking",
3331+ "cost_per_1m_in": 0.1028,
3332+ "cost_per_1m_out": 1.028,
3333+ "cost_per_1m_in_cached": 0,
3334+ "cost_per_1m_out_cached": 0,
3335+ "context_window": 128000,
3336+ "default_max_tokens": 32000,
3337+ "can_reason": true,
3338+ "reasoning_levels": [
3339+ "low",
3340+ "medium",
3341+ "high"
3342+ ],
3343+ "default_reasoning_effort": "medium",
3344+ "supports_attachments": true
3345+ },
3346+ {
3347+ "id": "qwen3-vl-flash",
3348+ "name": "Qwen3 VL Flash",
3349+ "cost_per_1m_in": 0.0206,
3350+ "cost_per_1m_out": 0.206,
3351+ "cost_per_1m_in_cached": 0,
3352+ "cost_per_1m_out_cached": 0.00412,
3353+ "context_window": 254000,
3354+ "default_max_tokens": 32000,
3355+ "can_reason": false,
3356+ "supports_attachments": true
3357+ },
3358+ {
3359+ "id": "qwen3-vl-flash-2026-01-22",
3360+ "name": "Qwen3 VL Flash 2026 01-22",
3361+ "cost_per_1m_in": 0.0206,
3362+ "cost_per_1m_out": 0.206,
3363+ "cost_per_1m_in_cached": 0,
3364+ "cost_per_1m_out_cached": 0.0206,
3365+ "context_window": 254000,
3366+ "default_max_tokens": 32000,
3367+ "can_reason": false,
3368+ "supports_attachments": true
3369+ },
3370+ {
3371+ "id": "qwen3-vl-plus",
3372+ "name": "Qwen3 VL Plus",
3373+ "cost_per_1m_in": 0.137,
3374+ "cost_per_1m_out": 1.37,
3375+ "cost_per_1m_in_cached": 0,
3376+ "cost_per_1m_out_cached": 0.0274,
3377+ "context_window": 256000,
3378+ "default_max_tokens": 32000,
3379+ "can_reason": false,
3380+ "supports_attachments": true
3381+ },
3382+ {
3383+ "id": "qwen3.5-122b-a10b",
3384+ "name": "Qwen3.5 122B A10B",
3385+ "cost_per_1m_in": 0.1126,
3386+ "cost_per_1m_out": 0.9008,
3387+ "cost_per_1m_in_cached": 0,
3388+ "cost_per_1m_out_cached": 0.1126,
3389+ "context_window": 991000,
3390+ "default_max_tokens": 64000,
3391+ "can_reason": true,
3392+ "reasoning_levels": [
3393+ "low",
3394+ "medium",
3395+ "high"
3396+ ],
3397+ "default_reasoning_effort": "medium",
3398+ "supports_attachments": true
3399+ },
3400+ {
3401+ "id": "qwen3.5-27b",
3402+ "name": "Qwen3.5 27B",
3403+ "cost_per_1m_in": 0.0846,
3404+ "cost_per_1m_out": 0.6768,
3405+ "cost_per_1m_in_cached": 0,
3406+ "cost_per_1m_out_cached": 0.0846,
3407+ "context_window": 991000,
3408+ "default_max_tokens": 64000,
3409+ "can_reason": true,
3410+ "reasoning_levels": [
3411+ "low",
3412+ "medium",
3413+ "high"
3414+ ],
3415+ "default_reasoning_effort": "medium",
3416+ "supports_attachments": true
3417+ },
3418+ {
3419+ "id": "qwen3.5-35b-a3b",
3420+ "name": "Qwen3.5 35B A3B",
3421+ "cost_per_1m_in": 0.0564,
3422+ "cost_per_1m_out": 0.4512,
3423+ "cost_per_1m_in_cached": 0,
3424+ "cost_per_1m_out_cached": 0.0564,
3425+ "context_window": 991000,
3426+ "default_max_tokens": 64000,
3427+ "can_reason": true,
3428+ "reasoning_levels": [
3429+ "low",
3430+ "medium",
3431+ "high"
3432+ ],
3433+ "default_reasoning_effort": "medium",
3434+ "supports_attachments": true
3435+ },
3436+ {
3437+ "id": "qwen3.5-397b-a17b",
3438+ "name": "Qwen3.5 397B A17B",
3439+ "cost_per_1m_in": 0.1644,
3440+ "cost_per_1m_out": 0.9864,
3441+ "cost_per_1m_in_cached": 0,
3442+ "cost_per_1m_out_cached": 0.1644,
3443+ "context_window": 991000,
3444+ "default_max_tokens": 64000,
3445+ "can_reason": true,
3446+ "reasoning_levels": [
3447+ "low",
3448+ "medium",
3449+ "high"
3450+ ],
3451+ "default_reasoning_effort": "medium",
3452+ "supports_attachments": true
3453+ },
3454+ {
3455+ "id": "qwen3.5-flash",
3456+ "name": "Qwen3.5 Flash",
3457+ "cost_per_1m_in": 0.0282,
3458+ "cost_per_1m_out": 0.282,
3459+ "cost_per_1m_in_cached": 0.03525,
3460+ "cost_per_1m_out_cached": 0.00282,
3461+ "context_window": 991000,
3462+ "default_max_tokens": 64000,
3463+ "can_reason": true,
3464+ "reasoning_levels": [
3465+ "low",
3466+ "medium",
3467+ "high"
3468+ ],
3469+ "default_reasoning_effort": "medium",
3470+ "supports_attachments": true
3471+ },
3472+ {
3473+ "id": "qwen3.5-plus",
3474+ "name": "Qwen3.5 Plus",
3475+ "cost_per_1m_in": 0.1096,
3476+ "cost_per_1m_out": 0.6576,
3477+ "cost_per_1m_in_cached": 0.137,
3478+ "cost_per_1m_out_cached": 0.01096,
3479+ "context_window": 991000,
3480+ "default_max_tokens": 64000,
3481+ "can_reason": true,
3482+ "reasoning_levels": [
3483+ "low",
3484+ "medium",
3485+ "high"
3486+ ],
3487+ "default_reasoning_effort": "medium",
3488+ "supports_attachments": true
3489+ },
3490+ {
3491+ "id": "qwen3.6-27b",
3492+ "name": "Qwen3.6 27B",
3493+ "cost_per_1m_in": 0.422,
3494+ "cost_per_1m_out": 2.532,
3495+ "cost_per_1m_in_cached": 0,
3496+ "cost_per_1m_out_cached": 0,
3497+ "context_window": 254000,
3498+ "default_max_tokens": 64000,
3499+ "can_reason": true,
3500+ "reasoning_levels": [
3501+ "low",
3502+ "medium",
3503+ "high"
3504+ ],
3505+ "default_reasoning_effort": "medium",
3506+ "supports_attachments": true
3507+ },
3508+ {
3509+ "id": "qwen3.6-35b-a3b",
3510+ "name": "Qwen3.6 35B A3B",
3511+ "cost_per_1m_in": 0.254,
3512+ "cost_per_1m_out": 1.524,
3513+ "cost_per_1m_in_cached": 0,
3514+ "cost_per_1m_out_cached": 0.254,
3515+ "context_window": 254000,
3516+ "default_max_tokens": 64000,
3517+ "can_reason": true,
3518+ "reasoning_levels": [
3519+ "low",
3520+ "medium",
3521+ "high"
3522+ ],
3523+ "default_reasoning_effort": "medium",
3524+ "supports_attachments": true
3525+ },
3526+ {
3527+ "id": "qwen3.6-flash",
3528+ "name": "Qwen3.6 Flash",
3529+ "cost_per_1m_in": 0.169,
3530+ "cost_per_1m_out": 1.014,
3531+ "cost_per_1m_in_cached": 0.21125,
3532+ "cost_per_1m_out_cached": 0.0169,
3533+ "context_window": 991000,
3534+ "default_max_tokens": 64000,
3535+ "can_reason": true,
3536+ "reasoning_levels": [
3537+ "low",
3538+ "medium",
3539+ "high"
3540+ ],
3541+ "default_reasoning_effort": "medium",
3542+ "supports_attachments": true
3543+ },
3544+ {
3545+ "id": "qwen3.6-max-preview",
3546+ "name": "Qwen3.6 Max Preview",
3547+ "cost_per_1m_in": 1.268,
3548+ "cost_per_1m_out": 7.608,
3549+ "cost_per_1m_in_cached": 1.585,
3550+ "cost_per_1m_out_cached": 0.1268,
3551+ "context_window": 240000,
3552+ "default_max_tokens": 64000,
3553+ "can_reason": true,
3554+ "reasoning_levels": [
3555+ "low",
3556+ "medium",
3557+ "high"
3558+ ],
3559+ "default_reasoning_effort": "medium",
3560+ "supports_attachments": false
3561+ },
3562+ {
3563+ "id": "qwen3.6-plus",
3564+ "name": "Qwen3.6 Plus",
3565+ "cost_per_1m_in": 0.282,
3566+ "cost_per_1m_out": 1.692,
3567+ "cost_per_1m_in_cached": 0.3525,
3568+ "cost_per_1m_out_cached": 0.0282,
3569+ "context_window": 991000,
3570+ "default_max_tokens": 64000,
3571+ "can_reason": true,
3572+ "reasoning_levels": [
3573+ "low",
3574+ "medium",
3575+ "high"
3576+ ],
3577+ "default_reasoning_effort": "medium",
3578+ "supports_attachments": true
3579+ },
3580+ {
3581+ "id": "qwen3.6-plus-preview-free",
3582+ "name": "Qwen3.6 Plus Preview (free)",
3583+ "cost_per_1m_in": 0,
3584+ "cost_per_1m_out": 0,
3585+ "cost_per_1m_in_cached": 0,
3586+ "cost_per_1m_out_cached": 0,
3587+ "context_window": 1000000,
3588+ "default_max_tokens": 65535,
3589+ "can_reason": true,
3590+ "reasoning_levels": [
3591+ "low",
3592+ "medium",
3593+ "high"
3594+ ],
3595+ "default_reasoning_effort": "medium",
3596+ "supports_attachments": false
3597+ },
3598+ {
3599+ "id": "qwen3.7-max",
3600+ "name": "Qwen3.7 Max",
3601+ "cost_per_1m_in": 1.69,
3602+ "cost_per_1m_out": 5.07,
3603+ "cost_per_1m_in_cached": 2.1125,
3604+ "cost_per_1m_out_cached": 0.169,
3605+ "context_window": 991000,
3606+ "default_max_tokens": 64000,
3607+ "can_reason": true,
3608+ "reasoning_levels": [
3609+ "low",
3610+ "medium",
3611+ "high"
3612+ ],
3613+ "default_reasoning_effort": "medium",
3614+ "supports_attachments": false
3615+ },
3616+ {
3617+ "id": "qwen3.7-plus",
3618+ "name": "Qwen3.7 Plus",
3619+ "cost_per_1m_in": 0.282,
3620+ "cost_per_1m_out": 1.128,
3621+ "cost_per_1m_in_cached": 0.3525,
3622+ "cost_per_1m_out_cached": 0.0564,
3623+ "context_window": 991000,
3624+ "default_max_tokens": 64000,
3625+ "can_reason": true,
3626+ "reasoning_levels": [
3627+ "low",
3628+ "medium",
3629+ "high"
3630+ ],
3631+ "default_reasoning_effort": "medium",
3632+ "supports_attachments": false
3633+ },
3634+ {
3635+ "id": "step-3.5-flash",
3636+ "name": "Step 3.5 Flash",
3637+ "cost_per_1m_in": 0.11,
3638+ "cost_per_1m_out": 0.33,
3639+ "cost_per_1m_in_cached": 0,
3640+ "cost_per_1m_out_cached": 0,
3641+ "context_window": 256000,
3642+ "default_max_tokens": 25600,
3643+ "can_reason": false,
3644+ "supports_attachments": true
3645+ },
3646+ {
3647+ "id": "step-3.7-flash",
3648+ "name": "Step 3.7 Flash",
3649+ "cost_per_1m_in": 0.022,
3650+ "cost_per_1m_out": 0.132,
3651+ "cost_per_1m_in_cached": 0,
3652+ "cost_per_1m_out_cached": 0.0044,
3653+ "context_window": 256000,
3654+ "default_max_tokens": 25600,
3655+ "can_reason": false,
3656+ "supports_attachments": true
3657+ },
3658+ {
3659+ "id": "step-3.7-flash-free",
3660+ "name": "Step 3.7 Flash (free)",
3661+ "cost_per_1m_in": 0,
3662+ "cost_per_1m_out": 0,
3663+ "cost_per_1m_in_cached": 0,
3664+ "cost_per_1m_out_cached": 0,
3665+ "context_window": 256000,
3666+ "default_max_tokens": 25600,
3667+ "can_reason": false,
3668+ "supports_attachments": true
3669+ },
3670+ {
3671+ "id": "xiaomi-mimo-v2-omni-free",
3672+ "name": "Xiaomi Mimo V2 Omni (free)",
3673+ "cost_per_1m_in": 0,
3674+ "cost_per_1m_out": 0,
3675+ "cost_per_1m_in_cached": 0,
3676+ "cost_per_1m_out_cached": 0,
3677+ "context_window": 256000,
3678+ "default_max_tokens": 25600,
3679+ "can_reason": false,
3680+ "supports_attachments": true
3681+ },
3682+ {
3683+ "id": "xiaomi-mimo-v2-pro-free",
3684+ "name": "Xiaomi Mimo V2 Pro (free)",
3685+ "cost_per_1m_in": 0,
3686+ "cost_per_1m_out": 0,
3687+ "cost_per_1m_in_cached": 0,
3688+ "cost_per_1m_out_cached": 0,
3689+ "context_window": 256000,
3690+ "default_max_tokens": 25600,
3691+ "can_reason": false,
3692+ "supports_attachments": true
3693+ },
3694+ {
3695+ "id": "xiaomi-mimo-v2.5",
3696+ "name": "Xiaomi Mimo V2.5",
3697+ "cost_per_1m_in": 0.155,
3698+ "cost_per_1m_out": 0.31,
3699+ "cost_per_1m_in_cached": 0,
3700+ "cost_per_1m_out_cached": 0.0031,
3701+ "context_window": 256000,
3702+ "default_max_tokens": 25600,
3703+ "can_reason": false,
3704+ "supports_attachments": true
3705+ },
3706+ {
3707+ "id": "xiaomi-mimo-v2.5-free",
3708+ "name": "Xiaomi Mimo V2.5 (free)",
3709+ "cost_per_1m_in": 0,
3710+ "cost_per_1m_out": 0,
3711+ "cost_per_1m_in_cached": 0,
3712+ "cost_per_1m_out_cached": 0,
3713+ "context_window": 256000,
3714+ "default_max_tokens": 25600,
3715+ "can_reason": false,
3716+ "supports_attachments": true
3717+ },
3718+ {
3719+ "id": "xiaomi-mimo-v2.5-pro",
3720+ "name": "Xiaomi Mimo V2.5 Pro",
3721+ "cost_per_1m_in": 0.48,
3722+ "cost_per_1m_out": 0.96,
3723+ "cost_per_1m_in_cached": 0,
3724+ "cost_per_1m_out_cached": 0.00384,
3725+ "context_window": 1000000,
3726+ "default_max_tokens": 100000,
3727+ "can_reason": false,
3728+ "supports_attachments": false
3729+ },
3730+ {
3731+ "id": "xiaomi-mimo-v2.5-pro-free",
3732+ "name": "Xiaomi Mimo V2.5 Pro (free)",
3733+ "cost_per_1m_in": 0,
3734+ "cost_per_1m_out": 0,
3735+ "cost_per_1m_in_cached": 0,
3736+ "cost_per_1m_out_cached": 0,
3737+ "context_window": 256000,
3738+ "default_max_tokens": 25600,
3739+ "can_reason": false,
3740+ "supports_attachments": true
3741+ }
3742+ ],
3743+ "default_headers": {
3744+ "APP-Code": "IUFF7106"
3745+ }
3746+}
vendor/charm.land/catwalk/internal/providers/configs/alibaba-singapore.jsonnew file+141
@@ -0,0 +1,141 @@
1+{
2+ "name": "Alibaba (Singapore)",
3+ "id": "alibaba-singapore",
4+ "api_key": "$ALIBABA_SINGAPORE_API_KEY",
5+ "api_endpoint": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
6+ "type": "openai-compat",
7+ "default_large_model_id": "qwen3.6-plus",
8+ "default_small_model_id": "qwen3.6-flash",
9+ "models": [
10+ {
11+ "id": "qwen3.5-35b-a3b",
12+ "name": "Qwen3.5-35B-A3B",
13+ "cost_per_1m_in": 0.248,
14+ "cost_per_1m_out": 1.485,
15+ "cost_per_1m_in_cached": 0,
16+ "cost_per_1m_out_cached": 0,
17+ "context_window": 256000,
18+ "default_max_tokens": 64000,
19+ "can_reason": true,
20+ "supports_attachments": true
21+ },
22+ {
23+ "id": "qwen3.5-27b",
24+ "name": "Qwen3.5-27B",
25+ "cost_per_1m_in": 0.6,
26+ "cost_per_1m_out": 3.6,
27+ "cost_per_1m_in_cached": 0,
28+ "cost_per_1m_out_cached": 0,
29+ "context_window": 256000,
30+ "default_max_tokens": 64000,
31+ "can_reason": true,
32+ "supports_attachments": true
33+ },
34+ {
35+ "id": "qwen3.6-flash",
36+ "name": "Qwen3.6-Flash",
37+ "cost_per_1m_in": 1,
38+ "cost_per_1m_out": 4,
39+ "cost_per_1m_in_cached": 1.25,
40+ "cost_per_1m_out_cached": 0.1,
41+ "context_window": 1000000,
42+ "default_max_tokens": 64000,
43+ "can_reason": true,
44+ "supports_attachments": true
45+ },
46+ {
47+ "id": "qwen3.6-plus",
48+ "name": "Qwen3.6-Plus",
49+ "cost_per_1m_in": 2,
50+ "cost_per_1m_out": 6,
51+ "cost_per_1m_in_cached": 2.5,
52+ "cost_per_1m_out_cached": 0.2,
53+ "context_window": 1000000,
54+ "default_max_tokens": 64000,
55+ "can_reason": true,
56+ "supports_attachments": true
57+ },
58+ {
59+ "id": "qwen3.6-max-preview",
60+ "name": "Qwen3.6-Max",
61+ "cost_per_1m_in": 2,
62+ "cost_per_1m_out": 12,
63+ "cost_per_1m_in_cached": 2.5,
64+ "cost_per_1m_out_cached": 0.2,
65+ "context_window": 256000,
66+ "default_max_tokens": 64000,
67+ "can_reason": true,
68+ "supports_attachments": false
69+ },
70+ {
71+ "id": "qwen3.7-plus",
72+ "name": "Qwen3.7-Plus",
73+ "cost_per_1m_in": 1.2,
74+ "cost_per_1m_out": 4.8,
75+ "cost_per_1m_in_cached": 1.5,
76+ "cost_per_1m_out_cached": 0,
77+ "context_window": 1000000,
78+ "default_max_tokens": 64000,
79+ "can_reason": true,
80+ "supports_attachments": true
81+ },
82+ {
83+ "id": "qwen3.7-max",
84+ "name": "Qwen3.7-Max",
85+ "cost_per_1m_in": 2.5,
86+ "cost_per_1m_out": 7.5,
87+ "cost_per_1m_in_cached": 3.125,
88+ "cost_per_1m_out_cached": 0,
89+ "context_window": 1000000,
90+ "default_max_tokens": 64000,
91+ "can_reason": true,
92+ "supports_attachments": false
93+ },
94+ {
95+ "id": "deepseek-v4-pro",
96+ "name": "DeepSeek-V4-Pro",
97+ "cost_per_1m_in": 2.4,
98+ "cost_per_1m_out": 4.8,
99+ "cost_per_1m_in_cached": 0.2,
100+ "cost_per_1m_out_cached": 0,
101+ "context_window": 1000000,
102+ "default_max_tokens": 384000,
103+ "can_reason": true,
104+ "reasoning_levels": [
105+ "high",
106+ "xhigh"
107+ ],
108+ "default_reasoning_effort": "high",
109+ "supports_attachments": false
110+ },
111+ {
112+ "id": "deepseek-v4-flash",
113+ "name": "DeepSeek-V4-Flash",
114+ "cost_per_1m_in": 0.2,
115+ "cost_per_1m_out": 0.4,
116+ "cost_per_1m_in_cached": 0.04,
117+ "cost_per_1m_out_cached": 0,
118+ "context_window": 1000000,
119+ "default_max_tokens": 384000,
120+ "can_reason": true,
121+ "reasoning_levels": [
122+ "high",
123+ "xhigh"
124+ ],
125+ "default_reasoning_effort": "high",
126+ "supports_attachments": false
127+ },
128+ {
129+ "id": "deepseek-v3.2",
130+ "name": "DeepSeek-V3.2",
131+ "cost_per_1m_in": 0.57,
132+ "cost_per_1m_out": 1.71,
133+ "cost_per_1m_in_cached": 0.114,
134+ "cost_per_1m_out_cached": 0,
135+ "context_window": 128000,
136+ "default_max_tokens": 64000,
137+ "can_reason": true,
138+ "supports_attachments": false
139+ }
140+ ]
141+}
vendor/charm.land/catwalk/internal/providers/configs/alibaba-united-states.jsonnew file+45
@@ -0,0 +1,45 @@
1+{
2+ "name": "Alibaba (US)",
3+ "id": "alibaba-us",
4+ "api_key": "$ALIBABA_US_API_KEY",
5+ "api_endpoint": "https://dashscope-us.aliyuncs.com/compatible-mode/v1",
6+ "type": "openai-compat",
7+ "default_large_model_id": "deepseek-v4-pro-us",
8+ "default_small_model_id": "deepseek-v4-flash-us",
9+ "models": [
10+ {
11+ "id": "deepseek-v4-pro-us",
12+ "name": "DeepSeek-V4-Pro",
13+ "cost_per_1m_in": 2.4,
14+ "cost_per_1m_out": 4.8,
15+ "cost_per_1m_in_cached": 0.2,
16+ "cost_per_1m_out_cached": 0,
17+ "context_window": 1000000,
18+ "default_max_tokens": 384000,
19+ "can_reason": true,
20+ "reasoning_levels": [
21+ "high",
22+ "xhigh"
23+ ],
24+ "default_reasoning_effort": "high",
25+ "supports_attachments": false
26+ },
27+ {
28+ "id": "deepseek-v4-flash-us",
29+ "name": "DeepSeek-V4-Flash",
30+ "cost_per_1m_in": 0.2,
31+ "cost_per_1m_out": 0.4,
32+ "cost_per_1m_in_cached": 0.04,
33+ "cost_per_1m_out_cached": 0,
34+ "context_window": 1000000,
35+ "default_max_tokens": 384000,
36+ "can_reason": true,
37+ "reasoning_levels": [
38+ "high",
39+ "xhigh"
40+ ],
41+ "default_reasoning_effort": "high",
42+ "supports_attachments": false
43+ }
44+ ]
45+}
vendor/charm.land/catwalk/internal/providers/configs/anthropic.jsonnew file+183
@@ -0,0 +1,183 @@
1+{
2+ "name": "Anthropic",
3+ "id": "anthropic",
4+ "type": "anthropic",
5+ "api_key": "$ANTHROPIC_API_KEY",
6+ "api_endpoint": "$ANTHROPIC_API_ENDPOINT",
7+ "default_large_model_id": "claude-sonnet-4-6",
8+ "default_small_model_id": "claude-haiku-4-5-20251001",
9+ "models": [
10+ {
11+ "id": "claude-mythos-5",
12+ "name": "Claude Mythos 5",
13+ "cost_per_1m_in": 10,
14+ "cost_per_1m_out": 50,
15+ "cost_per_1m_in_cached": 12.5,
16+ "cost_per_1m_out_cached": 1,
17+ "context_window": 1000000,
18+ "default_max_tokens": 128000,
19+ "can_reason": true,
20+ "reasoning_levels": ["low", "medium", "high", "xhigh", "max"],
21+ "default_reasoning_effort": "high",
22+ "supports_attachments": true
23+ },
24+ {
25+ "id": "claude-opus-4-8",
26+ "name": "Claude Opus 4.8",
27+ "cost_per_1m_in": 5,
28+ "cost_per_1m_out": 25,
29+ "cost_per_1m_in_cached": 6.25,
30+ "cost_per_1m_out_cached": 0.5,
31+ "context_window": 1000000,
32+ "default_max_tokens": 128000,
33+ "can_reason": true,
34+ "reasoning_levels": ["low", "medium", "high", "xhigh", "max"],
35+ "default_reasoning_effort": "high",
36+ "supports_attachments": true
37+ },
38+ {
39+ "id": "claude-opus-4-7",
40+ "name": "Claude Opus 4.7",
41+ "cost_per_1m_in": 5,
42+ "cost_per_1m_out": 25,
43+ "cost_per_1m_in_cached": 6.25,
44+ "cost_per_1m_out_cached": 0.5,
45+ "context_window": 1000000,
46+ "default_max_tokens": 128000,
47+ "can_reason": true,
48+ "reasoning_levels": ["low", "medium", "high", "xhigh", "max"],
49+ "default_reasoning_effort": "high",
50+ "supports_attachments": true
51+ },
52+ {
53+ "id": "claude-opus-4-6",
54+ "name": "Claude Opus 4.6",
55+ "cost_per_1m_in": 5,
56+ "cost_per_1m_out": 25,
57+ "cost_per_1m_in_cached": 6.25,
58+ "cost_per_1m_out_cached": 0.5,
59+ "context_window": 200000,
60+ "default_max_tokens": 128000,
61+ "can_reason": true,
62+ "reasoning_levels": ["low", "medium", "high", "max"],
63+ "default_reasoning_effort": "high",
64+ "supports_attachments": true
65+ },
66+ {
67+ "id": "claude-opus-4-5-20251101",
68+ "name": "Claude Opus 4.5",
69+ "cost_per_1m_in": 5,
70+ "cost_per_1m_out": 25,
71+ "cost_per_1m_in_cached": 6.25,
72+ "cost_per_1m_out_cached": 0.5,
73+ "context_window": 200000,
74+ "default_max_tokens": 64000,
75+ "can_reason": true,
76+ "reasoning_levels": ["low", "medium", "high"],
77+ "default_reasoning_effort": "high",
78+ "supports_attachments": true
79+ },
80+ {
81+ "id": "claude-sonnet-5",
82+ "name": "Claude Sonnet 5",
83+ "cost_per_1m_in": 2,
84+ "cost_per_1m_out": 10,
85+ "cost_per_1m_in_cached": 2.5,
86+ "cost_per_1m_out_cached": 0.2,
87+ "context_window": 1000000,
88+ "default_max_tokens": 128000,
89+ "can_reason": true,
90+ "reasoning_levels": ["low", "medium", "high", "xhigh", "max"],
91+ "default_reasoning_effort": "high",
92+ "supports_attachments": true
93+ },
94+ {
95+ "id": "claude-sonnet-4-6",
96+ "name": "Claude Sonnet 4.6",
97+ "cost_per_1m_in": 3,
98+ "cost_per_1m_out": 15,
99+ "cost_per_1m_in_cached": 3.75,
100+ "cost_per_1m_out_cached": 0.3,
101+ "context_window": 200000,
102+ "default_max_tokens": 128000,
103+ "can_reason": true,
104+ "reasoning_levels": ["low", "medium", "high", "max"],
105+ "default_reasoning_effort": "high",
106+ "supports_attachments": true
107+ },
108+ {
109+ "id": "claude-sonnet-4-5-20250929",
110+ "name": "Claude Sonnet 4.5",
111+ "cost_per_1m_in": 3,
112+ "cost_per_1m_out": 15,
113+ "cost_per_1m_in_cached": 3.75,
114+ "cost_per_1m_out_cached": 0.3,
115+ "context_window": 200000,
116+ "default_max_tokens": 64000,
117+ "can_reason": true,
118+ "supports_attachments": true
119+ },
120+ {
121+ "id": "claude-haiku-4-5-20251001",
122+ "name": "Claude Haiku 4.5",
123+ "cost_per_1m_in": 1,
124+ "cost_per_1m_out": 5,
125+ "cost_per_1m_in_cached": 1.25,
126+ "cost_per_1m_out_cached": 0.1,
127+ "context_window": 200000,
128+ "default_max_tokens": 64000,
129+ "can_reason": true,
130+ "supports_attachments": true
131+ },
132+ {
133+ "id": "claude-opus-4-1-20250805",
134+ "name": "Claude Opus 4.1",
135+ "cost_per_1m_in": 15,
136+ "cost_per_1m_out": 75,
137+ "cost_per_1m_in_cached": 18.75,
138+ "cost_per_1m_out_cached": 1.5,
139+ "context_window": 200000,
140+ "default_max_tokens": 32000,
141+ "can_reason": true,
142+ "supports_attachments": true
143+ },
144+ {
145+ "id": "claude-opus-4-20250514",
146+ "name": "Claude Opus 4",
147+ "cost_per_1m_in": 15,
148+ "cost_per_1m_out": 75,
149+ "cost_per_1m_in_cached": 18.75,
150+ "cost_per_1m_out_cached": 1.5,
151+ "context_window": 200000,
152+ "default_max_tokens": 32000,
153+ "can_reason": true,
154+ "supports_attachments": true
155+ },
156+ {
157+ "id": "claude-sonnet-4-20250514",
158+ "name": "Claude Sonnet 4",
159+ "cost_per_1m_in": 3,
160+ "cost_per_1m_out": 15,
161+ "cost_per_1m_in_cached": 3.75,
162+ "cost_per_1m_out_cached": 0.3,
163+ "context_window": 200000,
164+ "default_max_tokens": 64000,
165+ "can_reason": true,
166+ "supports_attachments": true
167+ },
168+ {
169+ "id": "claude-fable-5",
170+ "name": "Claude Fable 5",
171+ "cost_per_1m_in": 10,
172+ "cost_per_1m_out": 50,
173+ "cost_per_1m_in_cached": 12.5,
174+ "cost_per_1m_out_cached": 1,
175+ "context_window": 1000000,
176+ "default_max_tokens": 128000,
177+ "can_reason": true,
178+ "reasoning_levels": ["low", "medium", "high", "xhigh", "max"],
179+ "default_reasoning_effort": "high",
180+ "supports_attachments": true
181+ }
182+ ]
183+}
vendor/charm.land/catwalk/internal/providers/configs/avian.jsonnew file+125
@@ -0,0 +1,125 @@
1+{
2+ "name": "Avian",
3+ "id": "avian",
4+ "api_key": "$AVIAN_API_KEY",
5+ "api_endpoint": "https://api.avian.io/v1",
6+ "type": "openai-compat",
7+ "default_large_model_id": "moonshotai/kimi-k2.5",
8+ "default_small_model_id": "deepseek/deepseek-v3.2",
9+ "models": [
10+ {
11+ "id": "deepseek/deepseek-v3.2",
12+ "name": "DeepSeek V3.2",
13+ "cost_per_1m_in": 0.23,
14+ "cost_per_1m_out": 0.33,
15+ "cost_per_1m_in_cached": 0.012,
16+ "cost_per_1m_out_cached": 0,
17+ "context_window": 163840,
18+ "default_max_tokens": 65536,
19+ "can_reason": true,
20+ "reasoning_levels": [
21+ "low",
22+ "medium",
23+ "high"
24+ ],
25+ "default_reasoning_effort": "medium",
26+ "supports_attachments": false
27+ },
28+ {
29+ "id": "deepseek/deepseek-v4-flash",
30+ "name": "DeepSeek V4 Flash",
31+ "cost_per_1m_in": 0.105,
32+ "cost_per_1m_out": 0.21,
33+ "cost_per_1m_in_cached": 0.021,
34+ "cost_per_1m_out_cached": 0,
35+ "context_window": 1000000,
36+ "default_max_tokens": 393216,
37+ "can_reason": true,
38+ "reasoning_levels": [
39+ "low",
40+ "medium",
41+ "high"
42+ ],
43+ "default_reasoning_effort": "medium",
44+ "supports_attachments": false
45+ },
46+ {
47+ "id": "deepseek/deepseek-v4-pro",
48+ "name": "DeepSeek V4 Pro",
49+ "cost_per_1m_in": 1.305,
50+ "cost_per_1m_out": 2.61,
51+ "cost_per_1m_in_cached": 0.10875,
52+ "cost_per_1m_out_cached": 0,
53+ "context_window": 1000000,
54+ "default_max_tokens": 393216,
55+ "can_reason": true,
56+ "reasoning_levels": [
57+ "low",
58+ "medium",
59+ "high"
60+ ],
61+ "default_reasoning_effort": "medium",
62+ "supports_attachments": false
63+ },
64+ {
65+ "id": "z-ai/glm-5",
66+ "name": "GLM-5",
67+ "cost_per_1m_in": 0.95,
68+ "cost_per_1m_out": 2.55,
69+ "cost_per_1m_in_cached": 0.2,
70+ "cost_per_1m_out_cached": 0,
71+ "context_window": 204800,
72+ "default_max_tokens": 131072,
73+ "can_reason": false,
74+ "supports_attachments": false
75+ },
76+ {
77+ "id": "z-ai/glm-5.1",
78+ "name": "GLM-5.1",
79+ "cost_per_1m_in": 1,
80+ "cost_per_1m_out": 3.2,
81+ "cost_per_1m_in_cached": 0.2,
82+ "cost_per_1m_out_cached": 0,
83+ "context_window": 202752,
84+ "default_max_tokens": 202752,
85+ "can_reason": false,
86+ "supports_attachments": false
87+ },
88+ {
89+ "id": "moonshotai/kimi-k2.5",
90+ "name": "Kimi K2.5",
91+ "cost_per_1m_in": 0.45,
92+ "cost_per_1m_out": 2.2,
93+ "cost_per_1m_in_cached": 0.225,
94+ "cost_per_1m_out_cached": 0,
95+ "context_window": 262144,
96+ "default_max_tokens": 262144,
97+ "can_reason": false,
98+ "supports_attachments": false
99+ },
100+ {
101+ "id": "moonshotai/kimi-k2.6",
102+ "name": "Kimi K2.6",
103+ "cost_per_1m_in": 0.95,
104+ "cost_per_1m_out": 4,
105+ "cost_per_1m_in_cached": 0.16,
106+ "cost_per_1m_out_cached": 0,
107+ "context_window": 262144,
108+ "default_max_tokens": 262144,
109+ "can_reason": false,
110+ "supports_attachments": false
111+ },
112+ {
113+ "id": "minimax/minimax-m2.5",
114+ "name": "MiniMax M2.5",
115+ "cost_per_1m_in": 0.27,
116+ "cost_per_1m_out": 1.08,
117+ "cost_per_1m_in_cached": 0.15,
118+ "cost_per_1m_out_cached": 0,
119+ "context_window": 196608,
120+ "default_max_tokens": 131072,
121+ "can_reason": false,
122+ "supports_attachments": false
123+ }
124+ ]
125+}
vendor/charm.land/catwalk/internal/providers/configs/azure.jsonnew file+225
@@ -0,0 +1,225 @@
1+{
2+ "name": "Azure OpenAI",
3+ "id": "azure",
4+ "type": "azure",
5+ "api_key": "$AZURE_OPENAI_API_KEY",
6+ "api_endpoint": "$AZURE_OPENAI_API_ENDPOINT",
7+ "default_large_model_id": "gpt-5",
8+ "default_small_model_id": "gpt-5-mini",
9+ "models": [
10+ {
11+ "id": "gpt-5",
12+ "name": "GPT-5",
13+ "cost_per_1m_in": 1.25,
14+ "cost_per_1m_out": 10,
15+ "cost_per_1m_in_cached": 0.25,
16+ "cost_per_1m_out_cached": 0.25,
17+ "context_window": 400000,
18+ "default_max_tokens": 128000,
19+ "can_reason": true,
20+ "reasoning_levels": [
21+ "minimal",
22+ "low",
23+ "medium",
24+ "high"
25+ ],
26+ "default_reasoning_effort": "minimal",
27+ "supports_attachments": true
28+ },
29+ {
30+ "id": "gpt-5-mini",
31+ "name": "GPT-5 Mini",
32+ "cost_per_1m_in": 0.25,
33+ "cost_per_1m_out": 2,
34+ "cost_per_1m_in_cached": 0.025,
35+ "cost_per_1m_out_cached": 0.025,
36+ "context_window": 400000,
37+ "default_max_tokens": 128000,
38+ "can_reason": true,
39+ "reasoning_levels": [
40+ "low",
41+ "medium",
42+ "high"
43+ ],
44+ "default_reasoning_effort": "low",
45+ "supports_attachments": true
46+ },
47+ {
48+ "id": "gpt-5-nano",
49+ "name": "GPT-5 Nano",
50+ "cost_per_1m_in": 0.05,
51+ "cost_per_1m_out": 0.4,
52+ "cost_per_1m_in_cached": 0.005,
53+ "cost_per_1m_out_cached": 0.005,
54+ "context_window": 400000,
55+ "default_max_tokens": 128000,
56+ "can_reason": true,
57+ "reasoning_levels": [
58+ "low",
59+ "medium",
60+ "high"
61+ ],
62+ "default_reasoning_effort": "low",
63+ "supports_attachments": true
64+ },
65+ {
66+ "id": "codex-mini-latest",
67+ "name": "Codex Mini",
68+ "cost_per_1m_in": 1.5,
69+ "cost_per_1m_out": 6,
70+ "cost_per_1m_in_cached": 0,
71+ "cost_per_1m_out_cached": 0.375,
72+ "context_window": 200000,
73+ "default_max_tokens": 50000,
74+ "can_reason": true,
75+ "reasoning_levels": [
76+ "low",
77+ "medium",
78+ "high"
79+ ],
80+ "default_reasoning_effort": "medium",
81+ "supports_attachments": true
82+ },
83+ {
84+ "id": "o4-mini",
85+ "name": "o4 Mini",
86+ "cost_per_1m_in": 1.1,
87+ "cost_per_1m_out": 4.4,
88+ "cost_per_1m_in_cached": 0,
89+ "cost_per_1m_out_cached": 0.275,
90+ "context_window": 200000,
91+ "default_max_tokens": 50000,
92+ "can_reason": true,
93+ "has_reasoning_efforts": true,
94+ "default_reasoning_effort": "medium",
95+ "supports_attachments": true
96+ },
97+ {
98+ "id": "o3",
99+ "name": "o3",
100+ "cost_per_1m_in": 2,
101+ "cost_per_1m_out": 8,
102+ "cost_per_1m_in_cached": 0,
103+ "cost_per_1m_out_cached": 0.5,
104+ "context_window": 200000,
105+ "default_max_tokens": 50000,
106+ "can_reason": true,
107+ "reasoning_levels": [
108+ "low",
109+ "medium",
110+ "high"
111+ ],
112+ "default_reasoning_effort": "medium",
113+ "supports_attachments": true
114+ },
115+ {
116+ "id": "o3-pro",
117+ "name": "o3 Pro",
118+ "cost_per_1m_in": 20,
119+ "cost_per_1m_out": 80,
120+ "cost_per_1m_in_cached": 0,
121+ "cost_per_1m_out_cached": 0,
122+ "context_window": 200000,
123+ "default_max_tokens": 50000,
124+ "can_reason": true,
125+ "reasoning_levels": [
126+ "low",
127+ "medium",
128+ "high"
129+ ],
130+ "default_reasoning_effort": "medium",
131+ "supports_attachments": true
132+ },
133+ {
134+ "id": "gpt-4.1",
135+ "name": "GPT-4.1",
136+ "cost_per_1m_in": 2,
137+ "cost_per_1m_out": 8,
138+ "cost_per_1m_in_cached": 0,
139+ "cost_per_1m_out_cached": 0.5,
140+ "context_window": 1047576,
141+ "default_max_tokens": 50000,
142+ "can_reason": false,
143+ "supports_attachments": true
144+ },
145+ {
146+ "id": "gpt-4.1-mini",
147+ "name": "GPT-4.1 Mini",
148+ "cost_per_1m_in": 0.39999999999999997,
149+ "cost_per_1m_out": 1.5999999999999999,
150+ "cost_per_1m_in_cached": 0,
151+ "cost_per_1m_out_cached": 0.09999999999999999,
152+ "context_window": 1047576,
153+ "default_max_tokens": 50000,
154+ "can_reason": false,
155+ "supports_attachments": true
156+ },
157+ {
158+ "id": "gpt-4.1-nano",
159+ "name": "GPT-4.1 Nano",
160+ "cost_per_1m_in": 0.09999999999999999,
161+ "cost_per_1m_out": 0.39999999999999997,
162+ "cost_per_1m_in_cached": 0,
163+ "cost_per_1m_out_cached": 0.024999999999999998,
164+ "context_window": 1047576,
165+ "default_max_tokens": 50000,
166+ "can_reason": false,
167+ "supports_attachments": true
168+ },
169+ {
170+ "id": "gpt-4.5-preview",
171+ "name": "GPT-4.5 (Preview)",
172+ "cost_per_1m_in": 75,
173+ "cost_per_1m_out": 150,
174+ "cost_per_1m_in_cached": 0,
175+ "cost_per_1m_out_cached": 37.5,
176+ "context_window": 128000,
177+ "default_max_tokens": 50000,
178+ "can_reason": false,
179+ "supports_attachments": true
180+ },
181+ {
182+ "id": "o3-mini",
183+ "name": "o3 Mini",
184+ "cost_per_1m_in": 1.1,
185+ "cost_per_1m_out": 4.4,
186+ "cost_per_1m_in_cached": 0,
187+ "cost_per_1m_out_cached": 0.55,
188+ "context_window": 200000,
189+ "default_max_tokens": 50000,
190+ "can_reason": true,
191+ "reasoning_levels": [
192+ "low",
193+ "medium",
194+ "high"
195+ ],
196+ "default_reasoning_effort": "medium",
197+ "supports_attachments": false
198+ },
199+ {
200+ "id": "gpt-4o",
201+ "name": "GPT-4o",
202+ "cost_per_1m_in": 2.5,
203+ "cost_per_1m_out": 10,
204+ "cost_per_1m_in_cached": 0,
205+ "cost_per_1m_out_cached": 1.25,
206+ "context_window": 128000,
207+ "default_max_tokens": 20000,
208+ "can_reason": false,
209+ "supports_attachments": true
210+ },
211+ {
212+ "id": "gpt-4o-mini",
213+ "name": "GPT-4o-mini",
214+ "cost_per_1m_in": 0.15,
215+ "cost_per_1m_out": 0.6,
216+ "cost_per_1m_in_cached": 0,
217+ "cost_per_1m_out_cached": 0.075,
218+ "context_window": 128000,
219+ "default_max_tokens": 20000,
220+ "can_reason": false,
221+ "reasoning_effort": "",
222+ "supports_attachments": true
223+ }
224+ ]
225+}
vendor/charm.land/catwalk/internal/providers/configs/baseten.jsonnew file+187
@@ -0,0 +1,187 @@
1+{
2+ "name": "Baseten",
3+ "id": "baseten",
4+ "api_key": "$BASETEN_API_KEY",
5+ "api_endpoint": "https://inference.baseten.co/v1",
6+ "type": "openai-compat",
7+ "default_large_model_id": "deepseek-ai/DeepSeek-V4-Pro",
8+ "default_small_model_id": "openai/gpt-oss-120b",
9+ "models": [
10+ {
11+ "id": "deepseek-ai/DeepSeek-V4-Pro",
12+ "name": "Deepseek V4 Pro",
13+ "cost_per_1m_in": 1.74,
14+ "cost_per_1m_out": 3.48,
15+ "cost_per_1m_in_cached": 0.145,
16+ "cost_per_1m_out_cached": 0,
17+ "context_window": 262144,
18+ "default_max_tokens": 262144,
19+ "can_reason": true,
20+ "reasoning_levels": [
21+ "none",
22+ "minimal",
23+ "low",
24+ "medium",
25+ "high",
26+ "xhigh",
27+ "max"
28+ ],
29+ "default_reasoning_effort": "medium",
30+ "supports_attachments": false
31+ },
32+ {
33+ "id": "zai-org/GLM-4.7",
34+ "name": "GLM 4.7",
35+ "cost_per_1m_in": 0.6,
36+ "cost_per_1m_out": 2.2,
37+ "cost_per_1m_in_cached": 0.12,
38+ "cost_per_1m_out_cached": 0,
39+ "context_window": 200000,
40+ "default_max_tokens": 200000,
41+ "can_reason": false,
42+ "supports_attachments": false
43+ },
44+ {
45+ "id": "zai-org/GLM-5",
46+ "name": "GLM 5",
47+ "cost_per_1m_in": 0.95,
48+ "cost_per_1m_out": 3.15,
49+ "cost_per_1m_in_cached": 0.2,
50+ "cost_per_1m_out_cached": 0,
51+ "context_window": 202800,
52+ "default_max_tokens": 202800,
53+ "can_reason": false,
54+ "supports_attachments": false
55+ },
56+ {
57+ "id": "zai-org/GLM-5.1",
58+ "name": "GLM 5.1",
59+ "cost_per_1m_in": 1.3,
60+ "cost_per_1m_out": 4.3,
61+ "cost_per_1m_in_cached": 0.26,
62+ "cost_per_1m_out_cached": 0,
63+ "context_window": 202800,
64+ "default_max_tokens": 202800,
65+ "can_reason": false,
66+ "supports_attachments": false
67+ },
68+ {
69+ "id": "zai-org/GLM-5.2",
70+ "name": "GLM 5.2",
71+ "cost_per_1m_in": 1.4,
72+ "cost_per_1m_out": 4.4,
73+ "cost_per_1m_in_cached": 0.26,
74+ "cost_per_1m_out_cached": 0,
75+ "context_window": 202720,
76+ "default_max_tokens": 32768,
77+ "can_reason": true,
78+ "reasoning_levels": [
79+ "none",
80+ "high",
81+ "max"
82+ ],
83+ "default_reasoning_effort": "high",
84+ "supports_attachments": false
85+ },
86+ {
87+ "id": "moonshotai/Kimi-K2.5",
88+ "name": "Kimi K2.5",
89+ "cost_per_1m_in": 0.6,
90+ "cost_per_1m_out": 3,
91+ "cost_per_1m_in_cached": 0.12,
92+ "cost_per_1m_out_cached": 0,
93+ "context_window": 262000,
94+ "default_max_tokens": 262000,
95+ "can_reason": false,
96+ "supports_attachments": true
97+ },
98+ {
99+ "id": "moonshotai/Kimi-K2.6",
100+ "name": "Kimi K2.6",
101+ "cost_per_1m_in": 0.95,
102+ "cost_per_1m_out": 4,
103+ "cost_per_1m_in_cached": 0.16,
104+ "cost_per_1m_out_cached": 0,
105+ "context_window": 262000,
106+ "default_max_tokens": 262000,
107+ "can_reason": true,
108+ "reasoning_levels": [
109+ "low",
110+ "medium",
111+ "high"
112+ ],
113+ "default_reasoning_effort": "medium",
114+ "supports_attachments": true
115+ },
116+ {
117+ "id": "moonshotai/Kimi-K2.7-Code",
118+ "name": "Kimi K2.7 Code",
119+ "cost_per_1m_in": 0.95,
120+ "cost_per_1m_out": 4,
121+ "cost_per_1m_in_cached": 0.16,
122+ "cost_per_1m_out_cached": 0,
123+ "context_window": 262000,
124+ "default_max_tokens": 32768,
125+ "can_reason": true,
126+ "supports_attachments": true
127+ },
128+ {
129+ "id": "nvidia/Nemotron-120B-A12B",
130+ "name": "Nemotron Super",
131+ "cost_per_1m_in": 0.3,
132+ "cost_per_1m_out": 0.75,
133+ "cost_per_1m_in_cached": 0.06,
134+ "cost_per_1m_out_cached": 0,
135+ "context_window": 202800,
136+ "default_max_tokens": 202800,
137+ "can_reason": true,
138+ "reasoning_levels": [
139+ "low",
140+ "medium",
141+ "high"
142+ ],
143+ "default_reasoning_effort": "medium",
144+ "supports_attachments": false
145+ },
146+ {
147+ "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B",
148+ "name": "Nemotron Ultra",
149+ "cost_per_1m_in": 0.6,
150+ "cost_per_1m_out": 2.4,
151+ "cost_per_1m_in_cached": 0.12,
152+ "cost_per_1m_out_cached": 0,
153+ "context_window": 202800,
154+ "default_max_tokens": 202800,
155+ "can_reason": true,
156+ "reasoning_levels": [
157+ "low",
158+ "medium",
159+ "high"
160+ ],
161+ "default_reasoning_effort": "medium",
162+ "supports_attachments": false
163+ },
164+ {
165+ "id": "openai/gpt-oss-120b",
166+ "name": "OpenAI GPT 120B",
167+ "cost_per_1m_in": 0.1,
168+ "cost_per_1m_out": 0.5,
169+ "cost_per_1m_in_cached": 0.1,
170+ "cost_per_1m_out_cached": 0,
171+ "context_window": 128072,
172+ "default_max_tokens": 128072,
173+ "can_reason": true,
174+ "reasoning_levels": [
175+ "none",
176+ "minimal",
177+ "low",
178+ "medium",
179+ "high",
180+ "xhigh",
181+ "max"
182+ ],
183+ "default_reasoning_effort": "medium",
184+ "supports_attachments": false
185+ }
186+ ]
187+}
vendor/charm.land/catwalk/internal/providers/configs/bedrock-europe.jsonnew file+115
@@ -0,0 +1,115 @@
1+{
2+ "name": "AWS Bedrock Europe",
3+ "id": "bedrock-europe",
4+ "type": "bedrock",
5+ "api_key": "",
6+ "api_endpoint": "",
7+ "default_large_model_id": "eu.anthropic.claude-sonnet-4-6",
8+ "default_small_model_id": "eu.anthropic.claude-haiku-4-5-20251001-v1:0",
9+ "models": [
10+ {
11+ "id": "eu.anthropic.claude-sonnet-4-6",
12+ "name": "Claude Sonnet 4.6",
13+ "cost_per_1m_in": 3.3,
14+ "cost_per_1m_out": 16.5,
15+ "cost_per_1m_in_cached": 4.125,
16+ "cost_per_1m_out_cached": 0.33,
17+ "context_window": 1000000,
18+ "default_max_tokens": 64000,
19+ "can_reason": true,
20+ "reasoning_levels": ["low", "medium", "high", "max"],
21+ "default_reasoning_effort": "high",
22+ "supports_attachments": true
23+ },
24+ {
25+ "id": "eu.anthropic.claude-sonnet-4-5-20250929-v1:0",
26+ "name": "Claude Sonnet 4.5",
27+ "cost_per_1m_in": 3.3,
28+ "cost_per_1m_out": 16.5,
29+ "cost_per_1m_in_cached": 4.125,
30+ "cost_per_1m_out_cached": 0.33,
31+ "context_window": 200000,
32+ "default_max_tokens": 64000,
33+ "can_reason": true,
34+ "supports_attachments": true
35+ },
36+ {
37+ "id": "eu.anthropic.claude-haiku-4-5-20251001-v1:0",
38+ "name": "Claude Haiku 4.5",
39+ "cost_per_1m_in": 1.1,
40+ "cost_per_1m_out": 5.5,
41+ "cost_per_1m_in_cached": 1.375,
42+ "cost_per_1m_out_cached": 0.11,
43+ "context_window": 200000,
44+ "default_max_tokens": 64000,
45+ "can_reason": true,
46+ "supports_attachments": true
47+ },
48+ {
49+ "id": "eu.anthropic.claude-opus-4-8",
50+ "name": "Claude Opus 4.8",
51+ "cost_per_1m_in": 5.5,
52+ "cost_per_1m_out": 27.5,
53+ "cost_per_1m_in_cached": 6.875,
54+ "cost_per_1m_out_cached": 0.55,
55+ "context_window": 1000000,
56+ "default_max_tokens": 128000,
57+ "can_reason": true,
58+ "reasoning_levels": ["low", "medium", "high", "xhigh", "max"],
59+ "default_reasoning_effort": "high",
60+ "supports_attachments": true
61+ },
62+ {
63+ "id": "eu.anthropic.claude-opus-4-7",
64+ "name": "Claude Opus 4.7",
65+ "cost_per_1m_in": 5.5,
66+ "cost_per_1m_out": 27.5,
67+ "cost_per_1m_in_cached": 6.875,
68+ "cost_per_1m_out_cached": 0.55,
69+ "context_window": 1000000,
70+ "default_max_tokens": 128000,
71+ "can_reason": true,
72+ "reasoning_levels": ["low", "medium", "high", "xhigh", "max"],
73+ "default_reasoning_effort": "high",
74+ "supports_attachments": true
75+ },
76+ {
77+ "id": "eu.anthropic.claude-opus-4-6-v1",
78+ "name": "Claude Opus 4.6",
79+ "cost_per_1m_in": 5.5,
80+ "cost_per_1m_out": 27.5,
81+ "cost_per_1m_in_cached": 6.875,
82+ "cost_per_1m_out_cached": 0.55,
83+ "context_window": 1000000,
84+ "default_max_tokens": 128000,
85+ "can_reason": true,
86+ "reasoning_levels": ["low", "medium", "high", "max"],
87+ "default_reasoning_effort": "high",
88+ "supports_attachments": true
89+ },
90+ {
91+ "id": "eu.anthropic.claude-opus-4-5-20251101-v1:0",
92+ "name": "Claude Opus 4.5",
93+ "cost_per_1m_in": 5.5,
94+ "cost_per_1m_out": 27.5,
95+ "cost_per_1m_in_cached": 6.875,
96+ "cost_per_1m_out_cached": 0.55,
97+ "context_window": 200000,
98+ "default_max_tokens": 64000,
99+ "can_reason": true,
100+ "supports_attachments": true
101+ },
102+ {
103+ "id": "eu.anthropic.claude-opus-4-1-20250805-v1:0",
104+ "name": "Claude Opus 4.1",
105+ "cost_per_1m_in": 16.5,
106+ "cost_per_1m_out": 82.5,
107+ "cost_per_1m_in_cached": 20.625,
108+ "cost_per_1m_out_cached": 1.65,
109+ "context_window": 200000,
110+ "default_max_tokens": 32000,
111+ "can_reason": true,
112+ "supports_attachments": true
113+ }
114+ ]
115+}
vendor/charm.land/catwalk/internal/providers/configs/bedrock-united-states.jsonnew file+143
@@ -0,0 +1,143 @@
1+{
2+ "name": "AWS Bedrock US",
3+ "id": "bedrock",
4+ "type": "bedrock",
5+ "api_key": "",
6+ "api_endpoint": "",
7+ "default_large_model_id": "us.anthropic.claude-sonnet-4-6",
8+ "default_small_model_id": "us.anthropic.claude-haiku-4-5-20251001-v1:0",
9+ "models": [
10+ {
11+ "id": "us.anthropic.claude-sonnet-5",
12+ "name": "Claude Sonnet 5",
13+ "cost_per_1m_in": 3,
14+ "cost_per_1m_out": 15,
15+ "cost_per_1m_in_cached": 3.75,
16+ "cost_per_1m_out_cached": 0.3,
17+ "context_window": 1000000,
18+ "default_max_tokens": 128000,
19+ "can_reason": true,
20+ "reasoning_levels": ["low", "medium", "high", "xhigh", "max"],
21+ "default_reasoning_effort": "high",
22+ "supports_attachments": true
23+ },
24+ {
25+ "id": "us.anthropic.claude-sonnet-4-6",
26+ "name": "Claude Sonnet 4.6",
27+ "cost_per_1m_in": 3,
28+ "cost_per_1m_out": 15,
29+ "cost_per_1m_in_cached": 3.75,
30+ "cost_per_1m_out_cached": 0.3,
31+ "context_window": 1000000,
32+ "default_max_tokens": 64000,
33+ "can_reason": true,
34+ "reasoning_levels": ["low", "medium", "high", "max"],
35+ "default_reasoning_effort": "high",
36+ "supports_attachments": true
37+ },
38+ {
39+ "id": "us.anthropic.claude-sonnet-4-5-20250929-v1:0",
40+ "name": "Claude Sonnet 4.5",
41+ "cost_per_1m_in": 3,
42+ "cost_per_1m_out": 15,
43+ "cost_per_1m_in_cached": 3.75,
44+ "cost_per_1m_out_cached": 0.3,
45+ "context_window": 200000,
46+ "default_max_tokens": 64000,
47+ "can_reason": true,
48+ "supports_attachments": true
49+ },
50+ {
51+ "id": "us.anthropic.claude-haiku-4-5-20251001-v1:0",
52+ "name": "Claude Haiku 4.5",
53+ "cost_per_1m_in": 1,
54+ "cost_per_1m_out": 5,
55+ "cost_per_1m_in_cached": 1.25,
56+ "cost_per_1m_out_cached": 0.1,
57+ "context_window": 200000,
58+ "default_max_tokens": 64000,
59+ "can_reason": true,
60+ "supports_attachments": true
61+ },
62+ {
63+ "id": "us.anthropic.claude-opus-4-8",
64+ "name": "Claude Opus 4.8",
65+ "cost_per_1m_in": 5,
66+ "cost_per_1m_out": 25,
67+ "cost_per_1m_in_cached": 6.25,
68+ "cost_per_1m_out_cached": 0.5,
69+ "context_window": 1000000,
70+ "default_max_tokens": 128000,
71+ "can_reason": true,
72+ "reasoning_levels": ["low", "medium", "high", "xhigh", "max"],
73+ "default_reasoning_effort": "high",
74+ "supports_attachments": true
75+ },
76+ {
77+ "id": "us.anthropic.claude-opus-4-7",
78+ "name": "Claude Opus 4.7",
79+ "cost_per_1m_in": 5,
80+ "cost_per_1m_out": 25,
81+ "cost_per_1m_in_cached": 6.25,
82+ "cost_per_1m_out_cached": 0.5,
83+ "context_window": 1000000,
84+ "default_max_tokens": 128000,
85+ "can_reason": true,
86+ "reasoning_levels": ["low", "medium", "high", "xhigh", "max"],
87+ "default_reasoning_effort": "high",
88+ "supports_attachments": true
89+ },
90+ {
91+ "id": "us.anthropic.claude-opus-4-6-v1",
92+ "name": "Claude Opus 4.6",
93+ "cost_per_1m_in": 5,
94+ "cost_per_1m_out": 25,
95+ "cost_per_1m_in_cached": 6.25,
96+ "cost_per_1m_out_cached": 0.5,
97+ "context_window": 1000000,
98+ "default_max_tokens": 128000,
99+ "can_reason": true,
100+ "reasoning_levels": ["low", "medium", "high", "max"],
101+ "default_reasoning_effort": "high",
102+ "supports_attachments": true
103+ },
104+ {
105+ "id": "us.anthropic.claude-opus-4-5-20251101-v1:0",
106+ "name": "Claude Opus 4.5",
107+ "cost_per_1m_in": 5,
108+ "cost_per_1m_out": 25,
109+ "cost_per_1m_in_cached": 6.25,
110+ "cost_per_1m_out_cached": 0.5,
111+ "context_window": 200000,
112+ "default_max_tokens": 64000,
113+ "can_reason": true,
114+ "supports_attachments": true
115+ },
116+ {
117+ "id": "us.anthropic.claude-opus-4-1-20250805-v1:0",
118+ "name": "Claude Opus 4.1",
119+ "cost_per_1m_in": 15,
120+ "cost_per_1m_out": 75,
121+ "cost_per_1m_in_cached": 18.75,
122+ "cost_per_1m_out_cached": 1.5,
123+ "context_window": 200000,
124+ "default_max_tokens": 32000,
125+ "can_reason": true,
126+ "supports_attachments": true
127+ },
128+ {
129+ "id": "us.anthropic.claude-fable-5",
130+ "name": "Claude Fable 5",
131+ "cost_per_1m_in": 10,
132+ "cost_per_1m_out": 50,
133+ "cost_per_1m_in_cached": 12.5,
134+ "cost_per_1m_out_cached": 1,
135+ "context_window": 1000000,
136+ "default_max_tokens": 128000,
137+ "can_reason": true,
138+ "reasoning_levels": ["low", "medium", "high", "xhigh", "max"],
139+ "default_reasoning_effort": "high",
140+ "supports_attachments": true
141+ }
142+ ]
143+}
vendor/charm.land/catwalk/internal/providers/configs/cerebras.jsonnew file+42
@@ -0,0 +1,42 @@
1+{
2+ "name": "Cerebras",
3+ "id": "cerebras",
4+ "type": "openai-compat",
5+ "api_key": "$CEREBRAS_API_KEY",
6+ "api_endpoint": "https://api.cerebras.ai/v1",
7+ "default_large_model_id": "gpt-oss-120b",
8+ "default_small_model_id": "zai-glm-4.7",
9+ "default_headers": {
10+ "X-Cerebras-3rd-Party-Integration": "crush"
11+ },
12+ "models": [
13+ {
14+ "id": "gpt-oss-120b",
15+ "name": "OpenAI GPT OSS",
16+ "cost_per_1m_in": 0.35,
17+ "cost_per_1m_out": 0.75,
18+ "context_window": 131072,
19+ "default_max_tokens": 25000,
20+ "can_reason": true,
21+ "reasoning_levels": [
22+ "low",
23+ "medium",
24+ "high"
25+ ],
26+ "default_reasoning_effort": "medium",
27+ "supports_attachments": false
28+ },
29+ {
30+ "id": "zai-glm-4.7",
31+ "name": "Z.ai GLM 4.7",
32+ "cost_per_1m_in": 2.25,
33+ "cost_per_1m_out": 2.75,
34+ "context_window": 131072,
35+ "default_max_tokens": 25000,
36+ "can_reason": false,
37+ "supports_attachments": false,
38+ "temperature": 1,
39+ "top_p": 0.95
40+ }
41+ ]
42+}
vendor/charm.land/catwalk/internal/providers/configs/chutes.jsonnew file+227
@@ -0,0 +1,227 @@
1+{
2+ "name": "Chutes",
3+ "id": "chutes",
4+ "api_key": "$CHUTES_API_KEY",
5+ "api_endpoint": "https://llm.chutes.ai/v1",
6+ "type": "openai-compat",
7+ "default_large_model_id": "moonshotai/Kimi-K2.6-TEE",
8+ "default_small_model_id": "google/gemma-4-31B-turbo-TEE",
9+ "models": [
10+ {
11+ "id": "deepseek-ai/DeepSeek-V3.2-TEE",
12+ "name": "DeepSeek-V3.2-TEE",
13+ "cost_per_1m_in": 1,
14+ "cost_per_1m_out": 1,
15+ "cost_per_1m_in_cached": 0.5,
16+ "cost_per_1m_out_cached": 0,
17+ "context_window": 131072,
18+ "default_max_tokens": 65536,
19+ "can_reason": true,
20+ "reasoning_levels": [
21+ "low",
22+ "medium",
23+ "high"
24+ ],
25+ "default_reasoning_effort": "medium",
26+ "supports_attachments": false
27+ },
28+ {
29+ "id": "zai-org/GLM-5-TEE",
30+ "name": "GLM-5-TEE",
31+ "cost_per_1m_in": 0.95,
32+ "cost_per_1m_out": 2.55,
33+ "cost_per_1m_in_cached": 0.475,
34+ "cost_per_1m_out_cached": 0,
35+ "context_window": 202752,
36+ "default_max_tokens": 65535,
37+ "can_reason": true,
38+ "reasoning_levels": [
39+ "low",
40+ "medium",
41+ "high"
42+ ],
43+ "default_reasoning_effort": "medium",
44+ "supports_attachments": false
45+ },
46+ {
47+ "id": "zai-org/GLM-5.1-TEE",
48+ "name": "GLM-5.1-TEE",
49+ "cost_per_1m_in": 0.98,
50+ "cost_per_1m_out": 3.08,
51+ "cost_per_1m_in_cached": 0.49,
52+ "cost_per_1m_out_cached": 0,
53+ "context_window": 202752,
54+ "default_max_tokens": 65535,
55+ "can_reason": true,
56+ "reasoning_levels": [
57+ "low",
58+ "medium",
59+ "high"
60+ ],
61+ "default_reasoning_effort": "medium",
62+ "supports_attachments": false
63+ },
64+ {
65+ "id": "zai-org/GLM-5.2-TEE",
66+ "name": "GLM-5.2-TEE",
67+ "cost_per_1m_in": 1.4,
68+ "cost_per_1m_out": 4.4,
69+ "cost_per_1m_in_cached": 0.7,
70+ "cost_per_1m_out_cached": 0,
71+ "context_window": 1048576,
72+ "default_max_tokens": 65535,
73+ "can_reason": true,
74+ "reasoning_levels": [
75+ "low",
76+ "medium",
77+ "high"
78+ ],
79+ "default_reasoning_effort": "medium",
80+ "supports_attachments": false
81+ },
82+ {
83+ "id": "moonshotai/Kimi-K2.5-TEE",
84+ "name": "Kimi-K2.5-TEE",
85+ "cost_per_1m_in": 0.44,
86+ "cost_per_1m_out": 2,
87+ "cost_per_1m_in_cached": 0.22,
88+ "cost_per_1m_out_cached": 0,
89+ "context_window": 262144,
90+ "default_max_tokens": 65535,
91+ "can_reason": true,
92+ "reasoning_levels": [
93+ "low",
94+ "medium",
95+ "high"
96+ ],
97+ "default_reasoning_effort": "medium",
98+ "supports_attachments": true
99+ },
100+ {
101+ "id": "moonshotai/Kimi-K2.6-TEE",
102+ "name": "Kimi-K2.6-TEE",
103+ "cost_per_1m_in": 0.66,
104+ "cost_per_1m_out": 3.5,
105+ "cost_per_1m_in_cached": 0.33,
106+ "cost_per_1m_out_cached": 0,
107+ "context_window": 262144,
108+ "default_max_tokens": 65535,
109+ "can_reason": true,
110+ "reasoning_levels": [
111+ "low",
112+ "medium",
113+ "high"
114+ ],
115+ "default_reasoning_effort": "medium",
116+ "supports_attachments": true
117+ },
118+ {
119+ "id": "MiniMaxAI/MiniMax-M2.5-TEE",
120+ "name": "MiniMax-M2.5-TEE",
121+ "cost_per_1m_in": 0.15,
122+ "cost_per_1m_out": 1.2,
123+ "cost_per_1m_in_cached": 0.075,
124+ "cost_per_1m_out_cached": 0,
125+ "context_window": 196608,
126+ "default_max_tokens": 65536,
127+ "can_reason": true,
128+ "reasoning_levels": [
129+ "low",
130+ "medium",
131+ "high"
132+ ],
133+ "default_reasoning_effort": "medium",
134+ "supports_attachments": false
135+ },
136+ {
137+ "id": "Qwen/Qwen3-235B-A22B-Thinking-2507-TEE",
138+ "name": "Qwen3-235B-A22B-Thinking-2507-TEE",
139+ "cost_per_1m_in": 0.2989,
140+ "cost_per_1m_out": 1.1957,
141+ "cost_per_1m_in_cached": 0.14945,
142+ "cost_per_1m_out_cached": 0,
143+ "context_window": 262144,
144+ "default_max_tokens": 262144,
145+ "can_reason": true,
146+ "reasoning_levels": [
147+ "low",
148+ "medium",
149+ "high"
150+ ],
151+ "default_reasoning_effort": "medium",
152+ "supports_attachments": false
153+ },
154+ {
155+ "id": "Qwen/Qwen3-32B-TEE",
156+ "name": "Qwen3-32B-TEE",
157+ "cost_per_1m_in": 0.104,
158+ "cost_per_1m_out": 0.416,
159+ "cost_per_1m_in_cached": 0.052,
160+ "cost_per_1m_out_cached": 0,
161+ "context_window": 40960,
162+ "default_max_tokens": 40960,
163+ "can_reason": true,
164+ "reasoning_levels": [
165+ "low",
166+ "medium",
167+ "high"
168+ ],
169+ "default_reasoning_effort": "medium",
170+ "supports_attachments": false
171+ },
172+ {
173+ "id": "Qwen/Qwen3.5-397B-A17B-TEE",
174+ "name": "Qwen3.5-397B-A17B-TEE",
175+ "cost_per_1m_in": 0.45,
176+ "cost_per_1m_out": 3,
177+ "cost_per_1m_in_cached": 0.225,
178+ "cost_per_1m_out_cached": 0,
179+ "context_window": 262144,
180+ "default_max_tokens": 65536,
181+ "can_reason": true,
182+ "reasoning_levels": [
183+ "low",
184+ "medium",
185+ "high"
186+ ],
187+ "default_reasoning_effort": "medium",
188+ "supports_attachments": true
189+ },
190+ {
191+ "id": "Qwen/Qwen3.6-27B-TEE",
192+ "name": "Qwen3.6-27B-TEE",
193+ "cost_per_1m_in": 0.3,
194+ "cost_per_1m_out": 2,
195+ "cost_per_1m_in_cached": 0.15,
196+ "cost_per_1m_out_cached": 0,
197+ "context_window": 262144,
198+ "default_max_tokens": 65536,
199+ "can_reason": true,
200+ "reasoning_levels": [
201+ "low",
202+ "medium",
203+ "high"
204+ ],
205+ "default_reasoning_effort": "medium",
206+ "supports_attachments": true
207+ },
208+ {
209+ "id": "google/gemma-4-31B-turbo-TEE",
210+ "name": "gemma-4-31B-turbo-TEE",
211+ "cost_per_1m_in": 0.12,
212+ "cost_per_1m_out": 0.37,
213+ "cost_per_1m_in_cached": 0.06,
214+ "cost_per_1m_out_cached": 0,
215+ "context_window": 131072,
216+ "default_max_tokens": 65536,
217+ "can_reason": true,
218+ "reasoning_levels": [
219+ "low",
220+ "medium",
221+ "high"
222+ ],
223+ "default_reasoning_effort": "medium",
224+ "supports_attachments": true
225+ }
226+ ]
227+}
vendor/charm.land/catwalk/internal/providers/configs/copilot.jsonnew file+310
@@ -0,0 +1,310 @@
1+{
2+ "name": "GitHub Copilot",
3+ "id": "copilot",
4+ "api_endpoint": "https://api.githubcopilot.com",
5+ "type": "openai-compat",
6+ "default_large_model_id": "claude-sonnet-4.6",
7+ "default_small_model_id": "claude-haiku-4.5",
8+ "models": [
9+ {
10+ "id": "claude-fable-5",
11+ "name": "Claude Fable 5",
12+ "cost_per_1m_in": 0,
13+ "cost_per_1m_out": 0,
14+ "cost_per_1m_in_cached": 0,
15+ "cost_per_1m_out_cached": 0,
16+ "context_window": 264000,
17+ "default_max_tokens": 64000,
18+ "can_reason": false,
19+ "supports_attachments": true
20+ },
21+ {
22+ "id": "claude-haiku-4.5",
23+ "name": "Claude Haiku 4.5",
24+ "cost_per_1m_in": 0,
25+ "cost_per_1m_out": 0,
26+ "cost_per_1m_in_cached": 0,
27+ "cost_per_1m_out_cached": 0,
28+ "context_window": 200000,
29+ "default_max_tokens": 32000,
30+ "can_reason": false,
31+ "supports_attachments": true
32+ },
33+ {
34+ "id": "claude-opus-4.5",
35+ "name": "Claude Opus 4.5",
36+ "cost_per_1m_in": 0,
37+ "cost_per_1m_out": 0,
38+ "cost_per_1m_in_cached": 0,
39+ "cost_per_1m_out_cached": 0,
40+ "context_window": 200000,
41+ "default_max_tokens": 32000,
42+ "can_reason": false,
43+ "supports_attachments": true
44+ },
45+ {
46+ "id": "claude-opus-4.7",
47+ "name": "Claude Opus 4.7",
48+ "cost_per_1m_in": 0,
49+ "cost_per_1m_out": 0,
50+ "cost_per_1m_in_cached": 0,
51+ "cost_per_1m_out_cached": 0,
52+ "context_window": 264000,
53+ "default_max_tokens": 64000,
54+ "can_reason": false,
55+ "supports_attachments": true
56+ },
57+ {
58+ "id": "claude-opus-4.8",
59+ "name": "Claude Opus 4.8",
60+ "cost_per_1m_in": 0,
61+ "cost_per_1m_out": 0,
62+ "cost_per_1m_in_cached": 0,
63+ "cost_per_1m_out_cached": 0,
64+ "context_window": 264000,
65+ "default_max_tokens": 64000,
66+ "can_reason": false,
67+ "supports_attachments": true
68+ },
69+ {
70+ "id": "claude-opus-4.8-fast",
71+ "name": "Claude Opus 4.8 (fast mode)",
72+ "cost_per_1m_in": 0,
73+ "cost_per_1m_out": 0,
74+ "cost_per_1m_in_cached": 0,
75+ "cost_per_1m_out_cached": 0,
76+ "context_window": 264000,
77+ "default_max_tokens": 64000,
78+ "can_reason": false,
79+ "supports_attachments": true
80+ },
81+ {
82+ "id": "claude-sonnet-4.5",
83+ "name": "Claude Sonnet 4.5",
84+ "cost_per_1m_in": 0,
85+ "cost_per_1m_out": 0,
86+ "cost_per_1m_in_cached": 0,
87+ "cost_per_1m_out_cached": 0,
88+ "context_window": 200000,
89+ "default_max_tokens": 32000,
90+ "can_reason": false,
91+ "supports_attachments": true
92+ },
93+ {
94+ "id": "claude-sonnet-4.6",
95+ "name": "Claude Sonnet 4.6",
96+ "cost_per_1m_in": 0,
97+ "cost_per_1m_out": 0,
98+ "cost_per_1m_in_cached": 0,
99+ "cost_per_1m_out_cached": 0,
100+ "context_window": 264000,
101+ "default_max_tokens": 64000,
102+ "can_reason": false,
103+ "supports_attachments": true
104+ },
105+ {
106+ "id": "claude-sonnet-5",
107+ "name": "Claude Sonnet 5",
108+ "cost_per_1m_in": 0,
109+ "cost_per_1m_out": 0,
110+ "cost_per_1m_in_cached": 0,
111+ "cost_per_1m_out_cached": 0,
112+ "context_window": 264000,
113+ "default_max_tokens": 64000,
114+ "can_reason": false,
115+ "supports_attachments": true
116+ },
117+ {
118+ "id": "gemini-2.5-pro",
119+ "name": "Gemini 2.5 Pro",
120+ "cost_per_1m_in": 0,
121+ "cost_per_1m_out": 0,
122+ "cost_per_1m_in_cached": 0,
123+ "cost_per_1m_out_cached": 0,
124+ "context_window": 128000,
125+ "default_max_tokens": 64000,
126+ "can_reason": false,
127+ "supports_attachments": true
128+ },
129+ {
130+ "id": "gemini-3-flash-preview",
131+ "name": "Gemini 3 Flash (Preview)",
132+ "cost_per_1m_in": 0,
133+ "cost_per_1m_out": 0,
134+ "cost_per_1m_in_cached": 0,
135+ "cost_per_1m_out_cached": 0,
136+ "context_window": 128000,
137+ "default_max_tokens": 64000,
138+ "can_reason": false,
139+ "supports_attachments": true
140+ },
141+ {
142+ "id": "gemini-3.1-pro-preview",
143+ "name": "Gemini 3.1 Pro",
144+ "cost_per_1m_in": 0,
145+ "cost_per_1m_out": 0,
146+ "cost_per_1m_in_cached": 0,
147+ "cost_per_1m_out_cached": 0,
148+ "context_window": 264000,
149+ "default_max_tokens": 64000,
150+ "can_reason": false,
151+ "supports_attachments": true
152+ },
153+ {
154+ "id": "gemini-3.5-flash",
155+ "name": "Gemini 3.5 Flash",
156+ "cost_per_1m_in": 0,
157+ "cost_per_1m_out": 0,
158+ "cost_per_1m_in_cached": 0,
159+ "cost_per_1m_out_cached": 0,
160+ "context_window": 264000,
161+ "default_max_tokens": 64000,
162+ "can_reason": false,
163+ "supports_attachments": true
164+ },
165+ {
166+ "id": "gpt-3.5-turbo",
167+ "name": "GPT 3.5 Turbo",
168+ "cost_per_1m_in": 0,
169+ "cost_per_1m_out": 0,
170+ "cost_per_1m_in_cached": 0,
171+ "cost_per_1m_out_cached": 0,
172+ "context_window": 16384,
173+ "default_max_tokens": 4096,
174+ "can_reason": false,
175+ "supports_attachments": false
176+ },
177+ {
178+ "id": "gpt-4",
179+ "name": "GPT 4",
180+ "cost_per_1m_in": 0,
181+ "cost_per_1m_out": 0,
182+ "cost_per_1m_in_cached": 0,
183+ "cost_per_1m_out_cached": 0,
184+ "context_window": 32768,
185+ "default_max_tokens": 4096,
186+ "can_reason": false,
187+ "supports_attachments": false
188+ },
189+ {
190+ "id": "gpt-4-0125-preview",
191+ "name": "GPT 4 Turbo",
192+ "cost_per_1m_in": 0,
193+ "cost_per_1m_out": 0,
194+ "cost_per_1m_in_cached": 0,
195+ "cost_per_1m_out_cached": 0,
196+ "context_window": 128000,
197+ "default_max_tokens": 4096,
198+ "can_reason": false,
199+ "supports_attachments": false
200+ },
201+ {
202+ "id": "gpt-4.1",
203+ "name": "GPT-4.1",
204+ "cost_per_1m_in": 0,
205+ "cost_per_1m_out": 0,
206+ "cost_per_1m_in_cached": 0,
207+ "cost_per_1m_out_cached": 0,
208+ "context_window": 128000,
209+ "default_max_tokens": 16384,
210+ "can_reason": false,
211+ "supports_attachments": true
212+ },
213+ {
214+ "id": "gpt-4o",
215+ "name": "GPT-4o",
216+ "cost_per_1m_in": 0,
217+ "cost_per_1m_out": 0,
218+ "cost_per_1m_in_cached": 0,
219+ "cost_per_1m_out_cached": 0,
220+ "context_window": 128000,
221+ "default_max_tokens": 4096,
222+ "can_reason": false,
223+ "supports_attachments": true
224+ },
225+ {
226+ "id": "gpt-4o-mini",
227+ "name": "GPT-4o mini",
228+ "cost_per_1m_in": 0,
229+ "cost_per_1m_out": 0,
230+ "cost_per_1m_in_cached": 0,
231+ "cost_per_1m_out_cached": 0,
232+ "context_window": 128000,
233+ "default_max_tokens": 4096,
234+ "can_reason": false,
235+ "supports_attachments": false
236+ },
237+ {
238+ "id": "gpt-5-mini",
239+ "name": "GPT-5 mini",
240+ "cost_per_1m_in": 0,
241+ "cost_per_1m_out": 0,
242+ "cost_per_1m_in_cached": 0,
243+ "cost_per_1m_out_cached": 0,
244+ "context_window": 264000,
245+ "default_max_tokens": 64000,
246+ "can_reason": false,
247+ "supports_attachments": true
248+ },
249+ {
250+ "id": "gpt-5.3-codex",
251+ "name": "GPT-5.3-Codex",
252+ "cost_per_1m_in": 0,
253+ "cost_per_1m_out": 0,
254+ "cost_per_1m_in_cached": 0,
255+ "cost_per_1m_out_cached": 0,
256+ "context_window": 400000,
257+ "default_max_tokens": 128000,
258+ "can_reason": false,
259+ "supports_attachments": true
260+ },
261+ {
262+ "id": "gpt-5.4",
263+ "name": "GPT-5.4",
264+ "cost_per_1m_in": 0,
265+ "cost_per_1m_out": 0,
266+ "cost_per_1m_in_cached": 0,
267+ "cost_per_1m_out_cached": 0,
268+ "context_window": 400000,
269+ "default_max_tokens": 128000,
270+ "can_reason": false,
271+ "supports_attachments": true
272+ },
273+ {
274+ "id": "gpt-5.4-mini",
275+ "name": "GPT-5.4 mini",
276+ "cost_per_1m_in": 0,
277+ "cost_per_1m_out": 0,
278+ "cost_per_1m_in_cached": 0,
279+ "cost_per_1m_out_cached": 0,
280+ "context_window": 400000,
281+ "default_max_tokens": 128000,
282+ "can_reason": false,
283+ "supports_attachments": true
284+ },
285+ {
286+ "id": "gpt-5.5",
287+ "name": "GPT-5.5",
288+ "cost_per_1m_in": 0,
289+ "cost_per_1m_out": 0,
290+ "cost_per_1m_in_cached": 0,
291+ "cost_per_1m_out_cached": 0,
292+ "context_window": 400000,
293+ "default_max_tokens": 128000,
294+ "can_reason": false,
295+ "supports_attachments": true
296+ },
297+ {
298+ "id": "kimi-k2.7-code",
299+ "name": "Kimi K2.7 Code",
300+ "cost_per_1m_in": 0,
301+ "cost_per_1m_out": 0,
302+ "cost_per_1m_in_cached": 0,
303+ "cost_per_1m_out_cached": 0,
304+ "context_window": 256000,
305+ "default_max_tokens": 32000,
306+ "can_reason": false,
307+ "supports_attachments": true
308+ }
309+ ]
310+}
vendor/charm.land/catwalk/internal/providers/configs/cortecs.jsonnew file+1697
@@ -0,0 +1,1697 @@
1+{
2+ "name": "Cortecs",
3+ "id": "cortecs",
4+ "api_key": "$CORTECS_API_KEY",
5+ "api_endpoint": "https://api.cortecs.ai/v1",
6+ "type": "openai",
7+ "default_large_model_id": "qwen3-coder-30b-a3b-instruct",
8+ "default_small_model_id": "glm-4.7-flash",
9+ "models": [
10+ {
11+ "id": "claude-sonnet-5",
12+ "name": "claude-sonnet-5",
13+ "cost_per_1m_in": 1.975,
14+ "cost_per_1m_out": 9.874,
15+ "cost_per_1m_in_cached": 0,
16+ "cost_per_1m_out_cached": 0,
17+ "context_window": 1000000,
18+ "default_max_tokens": 100000,
19+ "can_reason": true,
20+ "reasoning_levels": [
21+ "low",
22+ "medium",
23+ "high"
24+ ],
25+ "default_reasoning_effort": "medium",
26+ "supports_attachments": true
27+ },
28+ {
29+ "id": "gemma-4-31b-it",
30+ "name": "gemma-4-31b-it",
31+ "cost_per_1m_in": 0.2,
32+ "cost_per_1m_out": 0.35,
33+ "cost_per_1m_in_cached": 0,
34+ "cost_per_1m_out_cached": 0,
35+ "context_window": 128000,
36+ "default_max_tokens": 12800,
37+ "can_reason": true,
38+ "reasoning_levels": [
39+ "low",
40+ "medium",
41+ "high"
42+ ],
43+ "default_reasoning_effort": "medium",
44+ "supports_attachments": true
45+ },
46+ {
47+ "id": "glm-5.2",
48+ "name": "glm-5.2",
49+ "cost_per_1m_in": 1.077,
50+ "cost_per_1m_out": 3.77,
51+ "cost_per_1m_in_cached": 0,
52+ "cost_per_1m_out_cached": 0,
53+ "context_window": 131000,
54+ "default_max_tokens": 13100,
55+ "can_reason": true,
56+ "reasoning_levels": [
57+ "low",
58+ "medium",
59+ "high"
60+ ],
61+ "default_reasoning_effort": "medium",
62+ "supports_attachments": false
63+ },
64+ {
65+ "id": "kimi-k2.7-code",
66+ "name": "kimi-k2.7-code",
67+ "cost_per_1m_in": 0.673,
68+ "cost_per_1m_out": 3.142,
69+ "cost_per_1m_in_cached": 0,
70+ "cost_per_1m_out_cached": 0,
71+ "context_window": 256000,
72+ "default_max_tokens": 25600,
73+ "can_reason": true,
74+ "reasoning_levels": [
75+ "low",
76+ "medium",
77+ "high"
78+ ],
79+ "default_reasoning_effort": "medium",
80+ "supports_attachments": true
81+ },
82+ {
83+ "id": "minimax-m3",
84+ "name": "minimax-m3",
85+ "cost_per_1m_in": 0.355,
86+ "cost_per_1m_out": 1.775,
87+ "cost_per_1m_in_cached": 0,
88+ "cost_per_1m_out_cached": 0,
89+ "context_window": 1048576,
90+ "default_max_tokens": 104857,
91+ "can_reason": true,
92+ "reasoning_levels": [
93+ "low",
94+ "medium",
95+ "high"
96+ ],
97+ "default_reasoning_effort": "medium",
98+ "supports_attachments": true
99+ },
100+ {
101+ "id": "qwen3.6-27b",
102+ "name": "qwen3.6-27b",
103+ "cost_per_1m_in": 0.4,
104+ "cost_per_1m_out": 2.7,
105+ "cost_per_1m_in_cached": 0,
106+ "cost_per_1m_out_cached": 0,
107+ "context_window": 262000,
108+ "default_max_tokens": 26200,
109+ "can_reason": true,
110+ "reasoning_levels": [
111+ "low",
112+ "medium",
113+ "high"
114+ ],
115+ "default_reasoning_effort": "medium",
116+ "supports_attachments": true
117+ },
118+ {
119+ "id": "cosmos3-super-reasoner",
120+ "name": "cosmos3-super-reasoner",
121+ "cost_per_1m_in": 0.089,
122+ "cost_per_1m_out": 0.266,
123+ "cost_per_1m_in_cached": 0,
124+ "cost_per_1m_out_cached": 0,
125+ "context_window": 256000,
126+ "default_max_tokens": 25600,
127+ "can_reason": true,
128+ "reasoning_levels": [
129+ "low",
130+ "medium",
131+ "high"
132+ ],
133+ "default_reasoning_effort": "medium",
134+ "supports_attachments": false
135+ },
136+ {
137+ "id": "claude-opus4-8",
138+ "name": "claude-opus4-8",
139+ "cost_per_1m_in": 4.881,
140+ "cost_per_1m_out": 24.404,
141+ "cost_per_1m_in_cached": 0,
142+ "cost_per_1m_out_cached": 0,
143+ "context_window": 1000000,
144+ "default_max_tokens": 100000,
145+ "can_reason": true,
146+ "reasoning_levels": [
147+ "low",
148+ "medium",
149+ "high"
150+ ],
151+ "default_reasoning_effort": "medium",
152+ "supports_attachments": true
153+ },
154+ {
155+ "id": "gemini-3.5-flash",
156+ "name": "gemini-3.5-flash",
157+ "cost_per_1m_in": 1.331,
158+ "cost_per_1m_out": 7.987,
159+ "cost_per_1m_in_cached": 0,
160+ "cost_per_1m_out_cached": 0,
161+ "context_window": 1048576,
162+ "default_max_tokens": 104857,
163+ "can_reason": true,
164+ "reasoning_levels": [
165+ "low",
166+ "medium",
167+ "high"
168+ ],
169+ "default_reasoning_effort": "medium",
170+ "supports_attachments": true
171+ },
172+ {
173+ "id": "gemini-3.1-flash-lite",
174+ "name": "gemini-3.1-flash-lite",
175+ "cost_per_1m_in": 0.244,
176+ "cost_per_1m_out": 1.464,
177+ "cost_per_1m_in_cached": 0,
178+ "cost_per_1m_out_cached": 0,
179+ "context_window": 1048576,
180+ "default_max_tokens": 104857,
181+ "can_reason": true,
182+ "reasoning_levels": [
183+ "low",
184+ "medium",
185+ "high"
186+ ],
187+ "default_reasoning_effort": "medium",
188+ "supports_attachments": true
189+ },
190+ {
191+ "id": "qwen3.6-35b-a3b",
192+ "name": "qwen3.6-35b-a3b",
193+ "cost_per_1m_in": 0.25,
194+ "cost_per_1m_out": 1.5,
195+ "cost_per_1m_in_cached": 0,
196+ "cost_per_1m_out_cached": 0,
197+ "context_window": 262000,
198+ "default_max_tokens": 26200,
199+ "can_reason": true,
200+ "reasoning_levels": [
201+ "low",
202+ "medium",
203+ "high"
204+ ],
205+ "default_reasoning_effort": "medium",
206+ "supports_attachments": true
207+ },
208+ {
209+ "id": "glm-5v-turbo",
210+ "name": "glm-5v-turbo",
211+ "cost_per_1m_in": 1.065,
212+ "cost_per_1m_out": 3.55,
213+ "cost_per_1m_in_cached": 0,
214+ "cost_per_1m_out_cached": 0,
215+ "context_window": 202752,
216+ "default_max_tokens": 20275,
217+ "can_reason": true,
218+ "reasoning_levels": [
219+ "low",
220+ "medium",
221+ "high"
222+ ],
223+ "default_reasoning_effort": "medium",
224+ "supports_attachments": true
225+ },
226+ {
227+ "id": "glm-5-turbo",
228+ "name": "glm-5-turbo",
229+ "cost_per_1m_in": 1.065,
230+ "cost_per_1m_out": 3.55,
231+ "cost_per_1m_in_cached": 0,
232+ "cost_per_1m_out_cached": 0,
233+ "context_window": 202752,
234+ "default_max_tokens": 20275,
235+ "can_reason": true,
236+ "reasoning_levels": [
237+ "low",
238+ "medium",
239+ "high"
240+ ],
241+ "default_reasoning_effort": "medium",
242+ "supports_attachments": false
243+ },
244+ {
245+ "id": "gemma-4-26b-a4b-it",
246+ "name": "gemma-4-26b-a4b-it",
247+ "cost_per_1m_in": 0.25,
248+ "cost_per_1m_out": 0.5,
249+ "cost_per_1m_in_cached": 0,
250+ "cost_per_1m_out_cached": 0,
251+ "context_window": 262000,
252+ "default_max_tokens": 26200,
253+ "can_reason": true,
254+ "reasoning_levels": [
255+ "low",
256+ "medium",
257+ "high"
258+ ],
259+ "default_reasoning_effort": "medium",
260+ "supports_attachments": true
261+ },
262+ {
263+ "id": "deepseek-v4-pro",
264+ "name": "deepseek-v4-pro",
265+ "cost_per_1m_in": 1.553,
266+ "cost_per_1m_out": 3.106,
267+ "cost_per_1m_in_cached": 0,
268+ "cost_per_1m_out_cached": 0,
269+ "context_window": 1048576,
270+ "default_max_tokens": 104857,
271+ "can_reason": true,
272+ "reasoning_levels": [
273+ "low",
274+ "medium",
275+ "high"
276+ ],
277+ "default_reasoning_effort": "medium",
278+ "supports_attachments": false
279+ },
280+ {
281+ "id": "deepseek-v4-flash",
282+ "name": "deepseek-v4-flash",
283+ "cost_per_1m_in": 0.133,
284+ "cost_per_1m_out": 0.266,
285+ "cost_per_1m_in_cached": 0,
286+ "cost_per_1m_out_cached": 0,
287+ "context_window": 1048576,
288+ "default_max_tokens": 104857,
289+ "can_reason": true,
290+ "reasoning_levels": [
291+ "low",
292+ "medium",
293+ "high"
294+ ],
295+ "default_reasoning_effort": "medium",
296+ "supports_attachments": false
297+ },
298+ {
299+ "id": "mistral-medium-3.5",
300+ "name": "mistral-medium-3.5",
301+ "cost_per_1m_in": 1.25,
302+ "cost_per_1m_out": 6.4,
303+ "cost_per_1m_in_cached": 0,
304+ "cost_per_1m_out_cached": 0,
305+ "context_window": 256000,
306+ "default_max_tokens": 25600,
307+ "can_reason": true,
308+ "reasoning_levels": [
309+ "low",
310+ "medium",
311+ "high"
312+ ],
313+ "default_reasoning_effort": "medium",
314+ "supports_attachments": true
315+ },
316+ {
317+ "id": "nvidia-nemotron-3-nano-omni",
318+ "name": "nvidia-nemotron-3-nano-omni",
319+ "cost_per_1m_in": 0.053,
320+ "cost_per_1m_out": 0.213,
321+ "cost_per_1m_in_cached": 0,
322+ "cost_per_1m_out_cached": 0,
323+ "context_window": 300000,
324+ "default_max_tokens": 30000,
325+ "can_reason": true,
326+ "reasoning_levels": [
327+ "low",
328+ "medium",
329+ "high"
330+ ],
331+ "default_reasoning_effort": "medium",
332+ "supports_attachments": false
333+ },
334+ {
335+ "id": "gpt-5.4",
336+ "name": "gpt-5.4",
337+ "cost_per_1m_in": 2.601,
338+ "cost_per_1m_out": 13.872,
339+ "cost_per_1m_in_cached": 0,
340+ "cost_per_1m_out_cached": 0,
341+ "context_window": 1050000,
342+ "default_max_tokens": 105000,
343+ "can_reason": true,
344+ "reasoning_levels": [
345+ "low",
346+ "medium",
347+ "high"
348+ ],
349+ "default_reasoning_effort": "medium",
350+ "supports_attachments": true
351+ },
352+ {
353+ "id": "kimi-k2.6",
354+ "name": "kimi-k2.6",
355+ "cost_per_1m_in": 0.694,
356+ "cost_per_1m_out": 3.034,
357+ "cost_per_1m_in_cached": 0,
358+ "cost_per_1m_out_cached": 0,
359+ "context_window": 256000,
360+ "default_max_tokens": 25600,
361+ "can_reason": true,
362+ "reasoning_levels": [
363+ "low",
364+ "medium",
365+ "high"
366+ ],
367+ "default_reasoning_effort": "medium",
368+ "supports_attachments": true
369+ },
370+ {
371+ "id": "claude-opus4-7",
372+ "name": "claude-opus4-7",
373+ "cost_per_1m_in": 4.881,
374+ "cost_per_1m_out": 24.404,
375+ "cost_per_1m_in_cached": 0,
376+ "cost_per_1m_out_cached": 0,
377+ "context_window": 1000000,
378+ "default_max_tokens": 100000,
379+ "can_reason": true,
380+ "reasoning_levels": [
381+ "low",
382+ "medium",
383+ "high"
384+ ],
385+ "default_reasoning_effort": "medium",
386+ "supports_attachments": true
387+ },
388+ {
389+ "id": "minimax-m2.7",
390+ "name": "minimax-m2.7",
391+ "cost_per_1m_in": 0.444,
392+ "cost_per_1m_out": 1.331,
393+ "cost_per_1m_in_cached": 0,
394+ "cost_per_1m_out_cached": 0,
395+ "context_window": 196608,
396+ "default_max_tokens": 19660,
397+ "can_reason": true,
398+ "reasoning_levels": [
399+ "low",
400+ "medium",
401+ "high"
402+ ],
403+ "default_reasoning_effort": "medium",
404+ "supports_attachments": false
405+ },
406+ {
407+ "id": "glm-5.1",
408+ "name": "glm-5.1",
409+ "cost_per_1m_in": 1.242,
410+ "cost_per_1m_out": 3.903,
411+ "cost_per_1m_in_cached": 0,
412+ "cost_per_1m_out_cached": 0,
413+ "context_window": 202752,
414+ "default_max_tokens": 20275,
415+ "can_reason": true,
416+ "reasoning_levels": [
417+ "low",
418+ "medium",
419+ "high"
420+ ],
421+ "default_reasoning_effort": "medium",
422+ "supports_attachments": false
423+ },
424+ {
425+ "id": "qwen3.5-122b-a10b",
426+ "name": "qwen3.5-122b-a10b",
427+ "cost_per_1m_in": 0.444,
428+ "cost_per_1m_out": 3.106,
429+ "cost_per_1m_in_cached": 0,
430+ "cost_per_1m_out_cached": 0,
431+ "context_window": 262144,
432+ "default_max_tokens": 26214,
433+ "can_reason": true,
434+ "reasoning_levels": [
435+ "low",
436+ "medium",
437+ "high"
438+ ],
439+ "default_reasoning_effort": "medium",
440+ "supports_attachments": false
441+ },
442+ {
443+ "id": "qwen3.5-9b",
444+ "name": "qwen3.5-9b",
445+ "cost_per_1m_in": 0.1,
446+ "cost_per_1m_out": 0.15,
447+ "cost_per_1m_in_cached": 0,
448+ "cost_per_1m_out_cached": 0,
449+ "context_window": 262000,
450+ "default_max_tokens": 26200,
451+ "can_reason": true,
452+ "reasoning_levels": [
453+ "low",
454+ "medium",
455+ "high"
456+ ],
457+ "default_reasoning_effort": "medium",
458+ "supports_attachments": false
459+ },
460+ {
461+ "id": "nemotron-3-super-120b-a12b",
462+ "name": "nemotron-3-super-120b-a12b",
463+ "cost_per_1m_in": 0.266,
464+ "cost_per_1m_out": 0.799,
465+ "cost_per_1m_in_cached": 0,
466+ "cost_per_1m_out_cached": 0,
467+ "context_window": 262144,
468+ "default_max_tokens": 26214,
469+ "can_reason": true,
470+ "reasoning_levels": [
471+ "low",
472+ "medium",
473+ "high"
474+ ],
475+ "default_reasoning_effort": "medium",
476+ "supports_attachments": false
477+ },
478+ {
479+ "id": "qwen3-coder-next",
480+ "name": "qwen3-coder-next",
481+ "cost_per_1m_in": 0.15,
482+ "cost_per_1m_out": 0.8,
483+ "cost_per_1m_in_cached": 0,
484+ "cost_per_1m_out_cached": 0,
485+ "context_window": 256000,
486+ "default_max_tokens": 25600,
487+ "can_reason": true,
488+ "reasoning_levels": [
489+ "low",
490+ "medium",
491+ "high"
492+ ],
493+ "default_reasoning_effort": "medium",
494+ "supports_attachments": false
495+ },
496+ {
497+ "id": "glm-5",
498+ "name": "glm-5",
499+ "cost_per_1m_in": 0.887,
500+ "cost_per_1m_out": 2.84,
501+ "cost_per_1m_in_cached": 0,
502+ "cost_per_1m_out_cached": 0,
503+ "context_window": 202752,
504+ "default_max_tokens": 20275,
505+ "can_reason": true,
506+ "reasoning_levels": [
507+ "low",
508+ "medium",
509+ "high"
510+ ],
511+ "default_reasoning_effort": "medium",
512+ "supports_attachments": false
513+ },
514+ {
515+ "id": "glm-4.6",
516+ "name": "glm-4.6",
517+ "cost_per_1m_in": 0.355,
518+ "cost_per_1m_out": 1.553,
519+ "cost_per_1m_in_cached": 0,
520+ "cost_per_1m_out_cached": 0,
521+ "context_window": 203000,
522+ "default_max_tokens": 20300,
523+ "can_reason": true,
524+ "reasoning_levels": [
525+ "low",
526+ "medium",
527+ "high"
528+ ],
529+ "default_reasoning_effort": "medium",
530+ "supports_attachments": false
531+ },
532+ {
533+ "id": "deepseek-chat-v3.1",
534+ "name": "deepseek-chat-v3.1",
535+ "cost_per_1m_in": 0.177,
536+ "cost_per_1m_out": 0.71,
537+ "cost_per_1m_in_cached": 0,
538+ "cost_per_1m_out_cached": 0,
539+ "context_window": 164000,
540+ "default_max_tokens": 16400,
541+ "can_reason": true,
542+ "reasoning_levels": [
543+ "low",
544+ "medium",
545+ "high"
546+ ],
547+ "default_reasoning_effort": "medium",
548+ "supports_attachments": false
549+ },
550+ {
551+ "id": "qwen-2.5-72b-instruct",
552+ "name": "qwen-2.5-72b-instruct",
553+ "cost_per_1m_in": 0.062,
554+ "cost_per_1m_out": 0.231,
555+ "cost_per_1m_in_cached": 0,
556+ "cost_per_1m_out_cached": 0,
557+ "context_window": 33000,
558+ "default_max_tokens": 3300,
559+ "can_reason": false,
560+ "supports_attachments": false
561+ },
562+ {
563+ "id": "qwen3.5-397b-a17b",
564+ "name": "qwen3.5-397b-a17b",
565+ "cost_per_1m_in": 0.6,
566+ "cost_per_1m_out": 3.6,
567+ "cost_per_1m_in_cached": 0,
568+ "cost_per_1m_out_cached": 0,
569+ "context_window": 250000,
570+ "default_max_tokens": 25000,
571+ "can_reason": true,
572+ "reasoning_levels": [
573+ "low",
574+ "medium",
575+ "high"
576+ ],
577+ "default_reasoning_effort": "medium",
578+ "supports_attachments": false
579+ },
580+ {
581+ "id": "deepseek-v3.2",
582+ "name": "deepseek-v3.2",
583+ "cost_per_1m_in": 0.266,
584+ "cost_per_1m_out": 0.444,
585+ "cost_per_1m_in_cached": 0,
586+ "cost_per_1m_out_cached": 0,
587+ "context_window": 163840,
588+ "default_max_tokens": 16384,
589+ "can_reason": true,
590+ "reasoning_levels": [
591+ "low",
592+ "medium",
593+ "high"
594+ ],
595+ "default_reasoning_effort": "medium",
596+ "supports_attachments": false
597+ },
598+ {
599+ "id": "mistral-small-2603",
600+ "name": "mistral-small-2603",
601+ "cost_per_1m_in": 0.128,
602+ "cost_per_1m_out": 0.51,
603+ "cost_per_1m_in_cached": 0,
604+ "cost_per_1m_out_cached": 0,
605+ "context_window": 256000,
606+ "default_max_tokens": 25600,
607+ "can_reason": true,
608+ "reasoning_levels": [
609+ "low",
610+ "medium",
611+ "high"
612+ ],
613+ "default_reasoning_effort": "medium",
614+ "supports_attachments": true
615+ },
616+ {
617+ "id": "minimax-m2.5",
618+ "name": "minimax-m2.5",
619+ "cost_per_1m_in": 0.266,
620+ "cost_per_1m_out": 0.976,
621+ "cost_per_1m_in_cached": 0,
622+ "cost_per_1m_out_cached": 0,
623+ "context_window": 65536,
624+ "default_max_tokens": 6553,
625+ "can_reason": true,
626+ "reasoning_levels": [
627+ "low",
628+ "medium",
629+ "high"
630+ ],
631+ "default_reasoning_effort": "medium",
632+ "supports_attachments": false
633+ },
634+ {
635+ "id": "claude-4-6-sonnet",
636+ "name": "claude-4-6-sonnet",
637+ "cost_per_1m_in": 2.869,
638+ "cost_per_1m_out": 14.309,
639+ "cost_per_1m_in_cached": 0,
640+ "cost_per_1m_out_cached": 0,
641+ "context_window": 1000000,
642+ "default_max_tokens": 100000,
643+ "can_reason": true,
644+ "reasoning_levels": [
645+ "low",
646+ "medium",
647+ "high"
648+ ],
649+ "default_reasoning_effort": "medium",
650+ "supports_attachments": true
651+ },
652+ {
653+ "id": "glm-4.7-flash",
654+ "name": "glm-4.7-flash",
655+ "cost_per_1m_in": 0.072,
656+ "cost_per_1m_out": 0.429,
657+ "cost_per_1m_in_cached": 0,
658+ "cost_per_1m_out_cached": 0,
659+ "context_window": 203000,
660+ "default_max_tokens": 20300,
661+ "can_reason": false,
662+ "supports_attachments": false
663+ },
664+ {
665+ "id": "kimi-k2.5",
666+ "name": "kimi-k2.5",
667+ "cost_per_1m_in": 0.444,
668+ "cost_per_1m_out": 2.485,
669+ "cost_per_1m_in_cached": 0,
670+ "cost_per_1m_out_cached": 0,
671+ "context_window": 262144,
672+ "default_max_tokens": 26214,
673+ "can_reason": true,
674+ "reasoning_levels": [
675+ "low",
676+ "medium",
677+ "high"
678+ ],
679+ "default_reasoning_effort": "medium",
680+ "supports_attachments": true
681+ },
682+ {
683+ "id": "claude-opus4-6",
684+ "name": "claude-opus4-6",
685+ "cost_per_1m_in": 4.769,
686+ "cost_per_1m_out": 23.843,
687+ "cost_per_1m_in_cached": 0,
688+ "cost_per_1m_out_cached": 0,
689+ "context_window": 1000000,
690+ "default_max_tokens": 100000,
691+ "can_reason": true,
692+ "reasoning_levels": [
693+ "low",
694+ "medium",
695+ "high"
696+ ],
697+ "default_reasoning_effort": "medium",
698+ "supports_attachments": true
699+ },
700+ {
701+ "id": "minimax-m2",
702+ "name": "minimax-m2",
703+ "cost_per_1m_in": 0.222,
704+ "cost_per_1m_out": 0.887,
705+ "cost_per_1m_in_cached": 0,
706+ "cost_per_1m_out_cached": 0,
707+ "context_window": 196608,
708+ "default_max_tokens": 19660,
709+ "can_reason": true,
710+ "reasoning_levels": [
711+ "low",
712+ "medium",
713+ "high"
714+ ],
715+ "default_reasoning_effort": "medium",
716+ "supports_attachments": false
717+ },
718+ {
719+ "id": "glm-4.7",
720+ "name": "glm-4.7",
721+ "cost_per_1m_in": 0.532,
722+ "cost_per_1m_out": 1.952,
723+ "cost_per_1m_in_cached": 0,
724+ "cost_per_1m_out_cached": 0,
725+ "context_window": 202752,
726+ "default_max_tokens": 20275,
727+ "can_reason": true,
728+ "reasoning_levels": [
729+ "low",
730+ "medium",
731+ "high"
732+ ],
733+ "default_reasoning_effort": "medium",
734+ "supports_attachments": false
735+ },
736+ {
737+ "id": "minimax-m2.1",
738+ "name": "minimax-m2.1",
739+ "cost_per_1m_in": 0.322,
740+ "cost_per_1m_out": 1.288,
741+ "cost_per_1m_in_cached": 0,
742+ "cost_per_1m_out_cached": 0,
743+ "context_window": 196000,
744+ "default_max_tokens": 19600,
745+ "can_reason": true,
746+ "reasoning_levels": [
747+ "low",
748+ "medium",
749+ "high"
750+ ],
751+ "default_reasoning_effort": "medium",
752+ "supports_attachments": false
753+ },
754+ {
755+ "id": "qwen3-vl-235b-a22b",
756+ "name": "qwen3-vl-235b-a22b",
757+ "cost_per_1m_in": 0.186,
758+ "cost_per_1m_out": 1.686,
759+ "cost_per_1m_in_cached": 0,
760+ "cost_per_1m_out_cached": 0,
761+ "context_window": 131000,
762+ "default_max_tokens": 13100,
763+ "can_reason": true,
764+ "reasoning_levels": [
765+ "low",
766+ "medium",
767+ "high"
768+ ],
769+ "default_reasoning_effort": "medium",
770+ "supports_attachments": true
771+ },
772+ {
773+ "id": "nvidia-nemotron-3-nano-30b-a3b",
774+ "name": "nvidia-nemotron-3-nano-30b-a3b",
775+ "cost_per_1m_in": 0.054,
776+ "cost_per_1m_out": 0.215,
777+ "cost_per_1m_in_cached": 0,
778+ "cost_per_1m_out_cached": 0,
779+ "context_window": 128000,
780+ "default_max_tokens": 12800,
781+ "can_reason": true,
782+ "reasoning_levels": [
783+ "low",
784+ "medium",
785+ "high"
786+ ],
787+ "default_reasoning_effort": "medium",
788+ "supports_attachments": false
789+ },
790+ {
791+ "id": "claude-opus4-5",
792+ "name": "claude-opus4-5",
793+ "cost_per_1m_in": 4.769,
794+ "cost_per_1m_out": 23.849,
795+ "cost_per_1m_in_cached": 0,
796+ "cost_per_1m_out_cached": 0,
797+ "context_window": 200000,
798+ "default_max_tokens": 20000,
799+ "can_reason": true,
800+ "reasoning_levels": [
801+ "low",
802+ "medium",
803+ "high"
804+ ],
805+ "default_reasoning_effort": "medium",
806+ "supports_attachments": true
807+ },
808+ {
809+ "id": "qwen3-next-80b-a3b-thinking",
810+ "name": "qwen3-next-80b-a3b-thinking",
811+ "cost_per_1m_in": 0.134,
812+ "cost_per_1m_out": 1.073,
813+ "cost_per_1m_in_cached": 0,
814+ "cost_per_1m_out_cached": 0,
815+ "context_window": 128000,
816+ "default_max_tokens": 12800,
817+ "can_reason": true,
818+ "reasoning_levels": [
819+ "low",
820+ "medium",
821+ "high"
822+ ],
823+ "default_reasoning_effort": "medium",
824+ "supports_attachments": false
825+ },
826+ {
827+ "id": "holo2-30b-a3b",
828+ "name": "holo2-30b-a3b",
829+ "cost_per_1m_in": 0.3,
830+ "cost_per_1m_out": 0.7,
831+ "cost_per_1m_in_cached": 0,
832+ "cost_per_1m_out_cached": 0,
833+ "context_window": 22000,
834+ "default_max_tokens": 2200,
835+ "can_reason": true,
836+ "reasoning_levels": [
837+ "low",
838+ "medium",
839+ "high"
840+ ],
841+ "default_reasoning_effort": "medium",
842+ "supports_attachments": true
843+ },
844+ {
845+ "id": "devstral-2512",
846+ "name": "devstral-2512",
847+ "cost_per_1m_in": 0.4,
848+ "cost_per_1m_out": 2,
849+ "cost_per_1m_in_cached": 0,
850+ "cost_per_1m_out_cached": 0,
851+ "context_window": 200000,
852+ "default_max_tokens": 20000,
853+ "can_reason": false,
854+ "supports_attachments": false
855+ },
856+ {
857+ "id": "nova-2-lite",
858+ "name": "nova-2-lite",
859+ "cost_per_1m_in": 0.335,
860+ "cost_per_1m_out": 2.822,
861+ "cost_per_1m_in_cached": 0,
862+ "cost_per_1m_out_cached": 0,
863+ "context_window": 1000000,
864+ "default_max_tokens": 100000,
865+ "can_reason": true,
866+ "reasoning_levels": [
867+ "low",
868+ "medium",
869+ "high"
870+ ],
871+ "default_reasoning_effort": "medium",
872+ "supports_attachments": true
873+ },
874+ {
875+ "id": "gpt-oss-safeguard-120b",
876+ "name": "gpt-oss-safeguard-120b",
877+ "cost_per_1m_in": 0.161,
878+ "cost_per_1m_out": 0.626,
879+ "cost_per_1m_in_cached": 0,
880+ "cost_per_1m_out_cached": 0,
881+ "context_window": 128000,
882+ "default_max_tokens": 12800,
883+ "can_reason": true,
884+ "reasoning_levels": [
885+ "low",
886+ "medium",
887+ "high"
888+ ],
889+ "default_reasoning_effort": "medium",
890+ "supports_attachments": false
891+ },
892+ {
893+ "id": "mistral-large-2512",
894+ "name": "mistral-large-2512",
895+ "cost_per_1m_in": 0.5,
896+ "cost_per_1m_out": 1.5,
897+ "cost_per_1m_in_cached": 0,
898+ "cost_per_1m_out_cached": 0,
899+ "context_window": 256000,
900+ "default_max_tokens": 25600,
901+ "can_reason": false,
902+ "supports_attachments": true
903+ },
904+ {
905+ "id": "ministral-8b-2512",
906+ "name": "ministral-8b-2512",
907+ "cost_per_1m_in": 0.15,
908+ "cost_per_1m_out": 0.15,
909+ "cost_per_1m_in_cached": 0,
910+ "cost_per_1m_out_cached": 0,
911+ "context_window": 256000,
912+ "default_max_tokens": 25600,
913+ "can_reason": false,
914+ "supports_attachments": true
915+ },
916+ {
917+ "id": "ministral-3b-2512",
918+ "name": "ministral-3b-2512",
919+ "cost_per_1m_in": 0.1,
920+ "cost_per_1m_out": 0.1,
921+ "cost_per_1m_in_cached": 0,
922+ "cost_per_1m_out_cached": 0,
923+ "context_window": 256000,
924+ "default_max_tokens": 25600,
925+ "can_reason": false,
926+ "supports_attachments": true
927+ },
928+ {
929+ "id": "ministral-14b-2512",
930+ "name": "ministral-14b-2512",
931+ "cost_per_1m_in": 0.2,
932+ "cost_per_1m_out": 0.2,
933+ "cost_per_1m_in_cached": 0,
934+ "cost_per_1m_out_cached": 0,
935+ "context_window": 256000,
936+ "default_max_tokens": 25600,
937+ "can_reason": false,
938+ "supports_attachments": true
939+ },
940+ {
941+ "id": "gpt-5.1",
942+ "name": "gpt-5.1",
943+ "cost_per_1m_in": 1.234,
944+ "cost_per_1m_out": 9.838,
945+ "cost_per_1m_in_cached": 0,
946+ "cost_per_1m_out_cached": 0,
947+ "context_window": 400000,
948+ "default_max_tokens": 40000,
949+ "can_reason": true,
950+ "reasoning_levels": [
951+ "low",
952+ "medium",
953+ "high"
954+ ],
955+ "default_reasoning_effort": "medium",
956+ "supports_attachments": true
957+ },
958+ {
959+ "id": "nemotron-nano-v2-12b",
960+ "name": "nemotron-nano-v2-12b",
961+ "cost_per_1m_in": 0.215,
962+ "cost_per_1m_out": 0.635,
963+ "cost_per_1m_in_cached": 0,
964+ "cost_per_1m_out_cached": 0,
965+ "context_window": 128000,
966+ "default_max_tokens": 12800,
967+ "can_reason": true,
968+ "reasoning_levels": [
969+ "low",
970+ "medium",
971+ "high"
972+ ],
973+ "default_reasoning_effort": "medium",
974+ "supports_attachments": true
975+ },
976+ {
977+ "id": "claude-haiku-4-5",
978+ "name": "claude-haiku-4-5",
979+ "cost_per_1m_in": 0.894,
980+ "cost_per_1m_out": 4.472,
981+ "cost_per_1m_in_cached": 0,
982+ "cost_per_1m_out_cached": 0,
983+ "context_window": 200000,
984+ "default_max_tokens": 20000,
985+ "can_reason": true,
986+ "reasoning_levels": [
987+ "low",
988+ "medium",
989+ "high"
990+ ],
991+ "default_reasoning_effort": "medium",
992+ "supports_attachments": true
993+ },
994+ {
995+ "id": "claude-4-5-sonnet",
996+ "name": "claude-4-5-sonnet",
997+ "cost_per_1m_in": 2.683,
998+ "cost_per_1m_out": 13.416,
999+ "cost_per_1m_in_cached": 0,
1000+ "cost_per_1m_out_cached": 0,
1001+ "context_window": 200000,
1002+ "default_max_tokens": 20000,
1003+ "can_reason": true,
1004+ "reasoning_levels": [
1005+ "low",
1006+ "medium",
1007+ "high"
1008+ ],
1009+ "default_reasoning_effort": "medium",
1010+ "supports_attachments": true
1011+ },
1012+ {
1013+ "id": "magistral-small-2509",
1014+ "name": "magistral-small-2509",
1015+ "cost_per_1m_in": 0.5,
1016+ "cost_per_1m_out": 1.5,
1017+ "cost_per_1m_in_cached": 0,
1018+ "cost_per_1m_out_cached": 0,
1019+ "context_window": 128000,
1020+ "default_max_tokens": 12800,
1021+ "can_reason": true,
1022+ "reasoning_levels": [
1023+ "low",
1024+ "medium",
1025+ "high"
1026+ ],
1027+ "default_reasoning_effort": "medium",
1028+ "supports_attachments": true
1029+ },
1030+ {
1031+ "id": "magistral-medium-2509",
1032+ "name": "magistral-medium-2509",
1033+ "cost_per_1m_in": 2,
1034+ "cost_per_1m_out": 5,
1035+ "cost_per_1m_in_cached": 0,
1036+ "cost_per_1m_out_cached": 0,
1037+ "context_window": 128000,
1038+ "default_max_tokens": 12800,
1039+ "can_reason": true,
1040+ "reasoning_levels": [
1041+ "low",
1042+ "medium",
1043+ "high"
1044+ ],
1045+ "default_reasoning_effort": "medium",
1046+ "supports_attachments": true
1047+ },
1048+ {
1049+ "id": "hermes-4-70b",
1050+ "name": "hermes-4-70b",
1051+ "cost_per_1m_in": 0.116,
1052+ "cost_per_1m_out": 0.358,
1053+ "cost_per_1m_in_cached": 0,
1054+ "cost_per_1m_out_cached": 0,
1055+ "context_window": 128000,
1056+ "default_max_tokens": 12800,
1057+ "can_reason": false,
1058+ "supports_attachments": false
1059+ },
1060+ {
1061+ "id": "gpt-5",
1062+ "name": "gpt-5",
1063+ "cost_per_1m_in": 1.234,
1064+ "cost_per_1m_out": 9.838,
1065+ "cost_per_1m_in_cached": 0,
1066+ "cost_per_1m_out_cached": 0,
1067+ "context_window": 400000,
1068+ "default_max_tokens": 40000,
1069+ "can_reason": true,
1070+ "reasoning_levels": [
1071+ "low",
1072+ "medium",
1073+ "high"
1074+ ],
1075+ "default_reasoning_effort": "medium",
1076+ "supports_attachments": true
1077+ },
1078+ {
1079+ "id": "gpt-oss-120b",
1080+ "name": "gpt-oss-120b",
1081+ "cost_per_1m_in": 0.035,
1082+ "cost_per_1m_out": 0.177,
1083+ "cost_per_1m_in_cached": 0,
1084+ "cost_per_1m_out_cached": 0,
1085+ "context_window": 128000,
1086+ "default_max_tokens": 12800,
1087+ "can_reason": true,
1088+ "reasoning_levels": [
1089+ "low",
1090+ "medium",
1091+ "high"
1092+ ],
1093+ "default_reasoning_effort": "medium",
1094+ "supports_attachments": false
1095+ },
1096+ {
1097+ "id": "qwen3-30b-a3b-instruct-2507",
1098+ "name": "qwen3-30b-a3b-instruct-2507",
1099+ "cost_per_1m_in": 0.089,
1100+ "cost_per_1m_out": 0.268,
1101+ "cost_per_1m_in_cached": 0,
1102+ "cost_per_1m_out_cached": 0,
1103+ "context_window": 262000,
1104+ "default_max_tokens": 26200,
1105+ "can_reason": true,
1106+ "reasoning_levels": [
1107+ "low",
1108+ "medium",
1109+ "high"
1110+ ],
1111+ "default_reasoning_effort": "medium",
1112+ "supports_attachments": false
1113+ },
1114+ {
1115+ "id": "gpt-oss-20b",
1116+ "name": "gpt-oss-20b",
1117+ "cost_per_1m_in": 0.027,
1118+ "cost_per_1m_out": 0.124,
1119+ "cost_per_1m_in_cached": 0,
1120+ "cost_per_1m_out_cached": 0,
1121+ "context_window": 128000,
1122+ "default_max_tokens": 12800,
1123+ "can_reason": true,
1124+ "reasoning_levels": [
1125+ "low",
1126+ "medium",
1127+ "high"
1128+ ],
1129+ "default_reasoning_effort": "medium",
1130+ "supports_attachments": false
1131+ },
1132+ {
1133+ "id": "mistral-7b-instruct-v0.3",
1134+ "name": "mistral-7b-instruct-v0.3",
1135+ "cost_per_1m_in": 0.1,
1136+ "cost_per_1m_out": 0.1,
1137+ "cost_per_1m_in_cached": 0,
1138+ "cost_per_1m_out_cached": 0,
1139+ "context_window": 127000,
1140+ "default_max_tokens": 12700,
1141+ "can_reason": false,
1142+ "supports_attachments": false
1143+ },
1144+ {
1145+ "id": "mistral-small-3.2-24b-instruct-2506",
1146+ "name": "mistral-small-3.2-24b-instruct-2506",
1147+ "cost_per_1m_in": 0.09,
1148+ "cost_per_1m_out": 0.28,
1149+ "cost_per_1m_in_cached": 0,
1150+ "cost_per_1m_out_cached": 0,
1151+ "context_window": 128000,
1152+ "default_max_tokens": 12800,
1153+ "can_reason": false,
1154+ "supports_attachments": true
1155+ },
1156+ {
1157+ "id": "mistral-large-2402",
1158+ "name": "mistral-large-2402",
1159+ "cost_per_1m_in": 3.846,
1160+ "cost_per_1m_out": 11.627,
1161+ "cost_per_1m_in_cached": 0,
1162+ "cost_per_1m_out_cached": 0,
1163+ "context_window": 32000,
1164+ "default_max_tokens": 3200,
1165+ "can_reason": true,
1166+ "reasoning_levels": [
1167+ "low",
1168+ "medium",
1169+ "high"
1170+ ],
1171+ "default_reasoning_effort": "medium",
1172+ "supports_attachments": false
1173+ },
1174+ {
1175+ "id": "pixtral-large-2502",
1176+ "name": "pixtral-large-2502",
1177+ "cost_per_1m_in": 1.789,
1178+ "cost_per_1m_out": 5.366,
1179+ "cost_per_1m_in_cached": 0,
1180+ "cost_per_1m_out_cached": 0,
1181+ "context_window": 128000,
1182+ "default_max_tokens": 12800,
1183+ "can_reason": true,
1184+ "reasoning_levels": [
1185+ "low",
1186+ "medium",
1187+ "high"
1188+ ],
1189+ "default_reasoning_effort": "medium",
1190+ "supports_attachments": true
1191+ },
1192+ {
1193+ "id": "qwen3-235b-a22b-instruct-2507",
1194+ "name": "qwen3-235b-a22b-instruct-2507",
1195+ "cost_per_1m_in": 0.062,
1196+ "cost_per_1m_out": 0.408,
1197+ "cost_per_1m_in_cached": 0,
1198+ "cost_per_1m_out_cached": 0,
1199+ "context_window": 131000,
1200+ "default_max_tokens": 13100,
1201+ "can_reason": true,
1202+ "reasoning_levels": [
1203+ "low",
1204+ "medium",
1205+ "high"
1206+ ],
1207+ "default_reasoning_effort": "medium",
1208+ "supports_attachments": false
1209+ },
1210+ {
1211+ "id": "qwen3-coder-30b-a3b-instruct",
1212+ "name": "qwen3-coder-30b-a3b-instruct",
1213+ "cost_per_1m_in": 0.053,
1214+ "cost_per_1m_out": 0.222,
1215+ "cost_per_1m_in_cached": 0,
1216+ "cost_per_1m_out_cached": 0,
1217+ "context_window": 32000,
1218+ "default_max_tokens": 3200,
1219+ "can_reason": true,
1220+ "reasoning_levels": [
1221+ "low",
1222+ "medium",
1223+ "high"
1224+ ],
1225+ "default_reasoning_effort": "medium",
1226+ "supports_attachments": false
1227+ },
1228+ {
1229+ "id": "qwen3-32b",
1230+ "name": "qwen3-32b",
1231+ "cost_per_1m_in": 0.089,
1232+ "cost_per_1m_out": 0.268,
1233+ "cost_per_1m_in_cached": 0,
1234+ "cost_per_1m_out_cached": 0,
1235+ "context_window": 16384,
1236+ "default_max_tokens": 1638,
1237+ "can_reason": true,
1238+ "reasoning_levels": [
1239+ "low",
1240+ "medium",
1241+ "high"
1242+ ],
1243+ "default_reasoning_effort": "medium",
1244+ "supports_attachments": false
1245+ },
1246+ {
1247+ "id": "nova-lite-v1",
1248+ "name": "nova-lite-v1",
1249+ "cost_per_1m_in": 0.062,
1250+ "cost_per_1m_out": 0.247,
1251+ "cost_per_1m_in_cached": 0,
1252+ "cost_per_1m_out_cached": 0,
1253+ "context_window": 300000,
1254+ "default_max_tokens": 30000,
1255+ "can_reason": true,
1256+ "reasoning_levels": [
1257+ "low",
1258+ "medium",
1259+ "high"
1260+ ],
1261+ "default_reasoning_effort": "medium",
1262+ "supports_attachments": true
1263+ },
1264+ {
1265+ "id": "claude-sonnet-4",
1266+ "name": "claude-sonnet-4",
1267+ "cost_per_1m_in": 2.601,
1268+ "cost_per_1m_out": 13.01,
1269+ "cost_per_1m_in_cached": 0,
1270+ "cost_per_1m_out_cached": 0,
1271+ "context_window": 200000,
1272+ "default_max_tokens": 20000,
1273+ "can_reason": true,
1274+ "reasoning_levels": [
1275+ "low",
1276+ "medium",
1277+ "high"
1278+ ],
1279+ "default_reasoning_effort": "medium",
1280+ "supports_attachments": true
1281+ },
1282+ {
1283+ "id": "gpt-4.1-mini",
1284+ "name": "gpt-4.1-mini",
1285+ "cost_per_1m_in": 0.39,
1286+ "cost_per_1m_out": 1.53,
1287+ "cost_per_1m_in_cached": 0,
1288+ "cost_per_1m_out_cached": 0,
1289+ "context_window": 1047576,
1290+ "default_max_tokens": 104757,
1291+ "can_reason": true,
1292+ "reasoning_levels": [
1293+ "low",
1294+ "medium",
1295+ "high"
1296+ ],
1297+ "default_reasoning_effort": "medium",
1298+ "supports_attachments": true
1299+ },
1300+ {
1301+ "id": "gpt-4.1-nano",
1302+ "name": "gpt-4.1-nano",
1303+ "cost_per_1m_in": 0.1,
1304+ "cost_per_1m_out": 0.39,
1305+ "cost_per_1m_in_cached": 0,
1306+ "cost_per_1m_out_cached": 0,
1307+ "context_window": 1047576,
1308+ "default_max_tokens": 104757,
1309+ "can_reason": true,
1310+ "reasoning_levels": [
1311+ "low",
1312+ "medium",
1313+ "high"
1314+ ],
1315+ "default_reasoning_effort": "medium",
1316+ "supports_attachments": true
1317+ },
1318+ {
1319+ "id": "nova-micro-v1",
1320+ "name": "nova-micro-v1",
1321+ "cost_per_1m_in": 0.036,
1322+ "cost_per_1m_out": 0.143,
1323+ "cost_per_1m_in_cached": 0,
1324+ "cost_per_1m_out_cached": 0,
1325+ "context_window": 128000,
1326+ "default_max_tokens": 12800,
1327+ "can_reason": true,
1328+ "reasoning_levels": [
1329+ "low",
1330+ "medium",
1331+ "high"
1332+ ],
1333+ "default_reasoning_effort": "medium",
1334+ "supports_attachments": true
1335+ },
1336+ {
1337+ "id": "gpt-4.1",
1338+ "name": "gpt-4.1",
1339+ "cost_per_1m_in": 1.968,
1340+ "cost_per_1m_out": 7.872,
1341+ "cost_per_1m_in_cached": 0,
1342+ "cost_per_1m_out_cached": 0,
1343+ "context_window": 1047576,
1344+ "default_max_tokens": 104757,
1345+ "can_reason": true,
1346+ "reasoning_levels": [
1347+ "low",
1348+ "medium",
1349+ "high"
1350+ ],
1351+ "default_reasoning_effort": "medium",
1352+ "supports_attachments": true
1353+ },
1354+ {
1355+ "id": "nova-pro-v1",
1356+ "name": "nova-pro-v1",
1357+ "cost_per_1m_in": 0.824,
1358+ "cost_per_1m_out": 3.295,
1359+ "cost_per_1m_in_cached": 0,
1360+ "cost_per_1m_out_cached": 0,
1361+ "context_window": 300000,
1362+ "default_max_tokens": 30000,
1363+ "can_reason": true,
1364+ "reasoning_levels": [
1365+ "low",
1366+ "medium",
1367+ "high"
1368+ ],
1369+ "default_reasoning_effort": "medium",
1370+ "supports_attachments": true
1371+ },
1372+ {
1373+ "id": "llama-3.1-nemotron-ultra-253b-v1",
1374+ "name": "llama-3.1-nemotron-ultra-253b-v1",
1375+ "cost_per_1m_in": 0.537,
1376+ "cost_per_1m_out": 1.61,
1377+ "cost_per_1m_in_cached": 0,
1378+ "cost_per_1m_out_cached": 0,
1379+ "context_window": 128000,
1380+ "default_max_tokens": 12800,
1381+ "can_reason": true,
1382+ "reasoning_levels": [
1383+ "low",
1384+ "medium",
1385+ "high"
1386+ ],
1387+ "default_reasoning_effort": "medium",
1388+ "supports_attachments": false
1389+ },
1390+ {
1391+ "id": "llama-4-maverick",
1392+ "name": "llama-4-maverick",
1393+ "cost_per_1m_in": 0.124,
1394+ "cost_per_1m_out": 0.603,
1395+ "cost_per_1m_in_cached": 0,
1396+ "cost_per_1m_out_cached": 0,
1397+ "context_window": 1050000,
1398+ "default_max_tokens": 105000,
1399+ "can_reason": false,
1400+ "supports_attachments": false
1401+ },
1402+ {
1403+ "id": "deepseek-v3-0324",
1404+ "name": "deepseek-v3-0324",
1405+ "cost_per_1m_in": 0.266,
1406+ "cost_per_1m_out": 0.887,
1407+ "cost_per_1m_in_cached": 0,
1408+ "cost_per_1m_out_cached": 0,
1409+ "context_window": 163840,
1410+ "default_max_tokens": 16384,
1411+ "can_reason": true,
1412+ "reasoning_levels": [
1413+ "low",
1414+ "medium",
1415+ "high"
1416+ ],
1417+ "default_reasoning_effort": "medium",
1418+ "supports_attachments": false
1419+ },
1420+ {
1421+ "id": "mistral-small-2503",
1422+ "name": "mistral-small-2503",
1423+ "cost_per_1m_in": 0.1,
1424+ "cost_per_1m_out": 0.3,
1425+ "cost_per_1m_in_cached": 0,
1426+ "cost_per_1m_out_cached": 0,
1427+ "context_window": 128000,
1428+ "default_max_tokens": 12800,
1429+ "can_reason": false,
1430+ "supports_attachments": true
1431+ },
1432+ {
1433+ "id": "mistral-small-2506",
1434+ "name": "mistral-small-2506",
1435+ "cost_per_1m_in": 0.1,
1436+ "cost_per_1m_out": 0.3,
1437+ "cost_per_1m_in_cached": 0,
1438+ "cost_per_1m_out_cached": 0,
1439+ "context_window": 131072,
1440+ "default_max_tokens": 13107,
1441+ "can_reason": false,
1442+ "supports_attachments": true
1443+ },
1444+ {
1445+ "id": "gemini-2.5-flash",
1446+ "name": "gemini-2.5-flash",
1447+ "cost_per_1m_in": 0.268,
1448+ "cost_per_1m_out": 2.236,
1449+ "cost_per_1m_in_cached": 0,
1450+ "cost_per_1m_out_cached": 0,
1451+ "context_window": 1048576,
1452+ "default_max_tokens": 104857,
1453+ "can_reason": true,
1454+ "reasoning_levels": [
1455+ "low",
1456+ "medium",
1457+ "high"
1458+ ],
1459+ "default_reasoning_effort": "medium",
1460+ "supports_attachments": true
1461+ },
1462+ {
1463+ "id": "gemini-2.5-pro",
1464+ "name": "gemini-2.5-pro",
1465+ "cost_per_1m_in": 1.342,
1466+ "cost_per_1m_out": 8.944,
1467+ "cost_per_1m_in_cached": 0,
1468+ "cost_per_1m_out_cached": 0,
1469+ "context_window": 1048576,
1470+ "default_max_tokens": 104857,
1471+ "can_reason": true,
1472+ "reasoning_levels": [
1473+ "low",
1474+ "medium",
1475+ "high"
1476+ ],
1477+ "default_reasoning_effort": "medium",
1478+ "supports_attachments": true
1479+ },
1480+ {
1481+ "id": "gemma-3-27b-it",
1482+ "name": "gemma-3-27b-it",
1483+ "cost_per_1m_in": 0.089,
1484+ "cost_per_1m_out": 0.268,
1485+ "cost_per_1m_in_cached": 0,
1486+ "cost_per_1m_out_cached": 0,
1487+ "context_window": 40000,
1488+ "default_max_tokens": 4000,
1489+ "can_reason": true,
1490+ "reasoning_levels": [
1491+ "low",
1492+ "medium",
1493+ "high"
1494+ ],
1495+ "default_reasoning_effort": "medium",
1496+ "supports_attachments": true
1497+ },
1498+ {
1499+ "id": "deepseek-r1-0528",
1500+ "name": "deepseek-r1-0528",
1501+ "cost_per_1m_in": 0.585,
1502+ "cost_per_1m_out": 2.307,
1503+ "cost_per_1m_in_cached": 0,
1504+ "cost_per_1m_out_cached": 0,
1505+ "context_window": 164000,
1506+ "default_max_tokens": 16400,
1507+ "can_reason": true,
1508+ "reasoning_levels": [
1509+ "low",
1510+ "medium",
1511+ "high"
1512+ ],
1513+ "default_reasoning_effort": "medium",
1514+ "supports_attachments": false
1515+ },
1516+ {
1517+ "id": "codestral-2508",
1518+ "name": "codestral-2508",
1519+ "cost_per_1m_in": 0.3,
1520+ "cost_per_1m_out": 0.9,
1521+ "cost_per_1m_in_cached": 0,
1522+ "cost_per_1m_out_cached": 0,
1523+ "context_window": 256000,
1524+ "default_max_tokens": 25600,
1525+ "can_reason": false,
1526+ "supports_attachments": false
1527+ },
1528+ {
1529+ "id": "llama-3.3-70b-instruct",
1530+ "name": "llama-3.3-70b-instruct",
1531+ "cost_per_1m_in": 0.089,
1532+ "cost_per_1m_out": 0.275,
1533+ "cost_per_1m_in_cached": 0,
1534+ "cost_per_1m_out_cached": 0,
1535+ "context_window": 128000,
1536+ "default_max_tokens": 12800,
1537+ "can_reason": true,
1538+ "reasoning_levels": [
1539+ "low",
1540+ "medium",
1541+ "high"
1542+ ],
1543+ "default_reasoning_effort": "medium",
1544+ "supports_attachments": false
1545+ },
1546+ {
1547+ "id": "gpt-4o",
1548+ "name": "gpt-4o",
1549+ "cost_per_1m_in": 2.387,
1550+ "cost_per_1m_out": 9.547,
1551+ "cost_per_1m_in_cached": 0,
1552+ "cost_per_1m_out_cached": 0,
1553+ "context_window": 128000,
1554+ "default_max_tokens": 12800,
1555+ "can_reason": true,
1556+ "reasoning_levels": [
1557+ "low",
1558+ "medium",
1559+ "high"
1560+ ],
1561+ "default_reasoning_effort": "medium",
1562+ "supports_attachments": true
1563+ },
1564+ {
1565+ "id": "gpt-5-mini",
1566+ "name": "gpt-5-mini",
1567+ "cost_per_1m_in": 0.25,
1568+ "cost_per_1m_out": 1.968,
1569+ "cost_per_1m_in_cached": 0,
1570+ "cost_per_1m_out_cached": 0,
1571+ "context_window": 400000,
1572+ "default_max_tokens": 40000,
1573+ "can_reason": true,
1574+ "reasoning_levels": [
1575+ "low",
1576+ "medium",
1577+ "high"
1578+ ],
1579+ "default_reasoning_effort": "medium",
1580+ "supports_attachments": true
1581+ },
1582+ {
1583+ "id": "gpt-5-nano",
1584+ "name": "gpt-5-nano",
1585+ "cost_per_1m_in": 0.054,
1586+ "cost_per_1m_out": 0.394,
1587+ "cost_per_1m_in_cached": 0,
1588+ "cost_per_1m_out_cached": 0,
1589+ "context_window": 400000,
1590+ "default_max_tokens": 40000,
1591+ "can_reason": true,
1592+ "reasoning_levels": [
1593+ "low",
1594+ "medium",
1595+ "high"
1596+ ],
1597+ "default_reasoning_effort": "medium",
1598+ "supports_attachments": true
1599+ },
1600+ {
1601+ "id": "hermes-4-405b",
1602+ "name": "hermes-4-405b",
1603+ "cost_per_1m_in": 0.894,
1604+ "cost_per_1m_out": 2.683,
1605+ "cost_per_1m_in_cached": 0,
1606+ "cost_per_1m_out_cached": 0,
1607+ "context_window": 128000,
1608+ "default_max_tokens": 12800,
1609+ "can_reason": false,
1610+ "supports_attachments": false
1611+ },
1612+ {
1613+ "id": "mistral-medium-2508",
1614+ "name": "mistral-medium-2508",
1615+ "cost_per_1m_in": 0.4,
1616+ "cost_per_1m_out": 2,
1617+ "cost_per_1m_in_cached": 0,
1618+ "cost_per_1m_out_cached": 0,
1619+ "context_window": 128000,
1620+ "default_max_tokens": 12800,
1621+ "can_reason": true,
1622+ "reasoning_levels": [
1623+ "low",
1624+ "medium",
1625+ "high"
1626+ ],
1627+ "default_reasoning_effort": "medium",
1628+ "supports_attachments": true
1629+ },
1630+ {
1631+ "id": "mistral-nemo-instruct-2407",
1632+ "name": "mistral-nemo-instruct-2407",
1633+ "cost_per_1m_in": 0.13,
1634+ "cost_per_1m_out": 0.13,
1635+ "cost_per_1m_in_cached": 0,
1636+ "cost_per_1m_out_cached": 0,
1637+ "context_window": 118000,
1638+ "default_max_tokens": 11800,
1639+ "can_reason": false,
1640+ "supports_attachments": false
1641+ },
1642+ {
1643+ "id": "llama-3.1-405b-instruct",
1644+ "name": "llama-3.1-405b-instruct",
1645+ "cost_per_1m_in": 1.75,
1646+ "cost_per_1m_out": 1.75,
1647+ "cost_per_1m_in_cached": 0,
1648+ "cost_per_1m_out_cached": 0,
1649+ "context_window": 128000,
1650+ "default_max_tokens": 12800,
1651+ "can_reason": true,
1652+ "reasoning_levels": [
1653+ "low",
1654+ "medium",
1655+ "high"
1656+ ],
1657+ "default_reasoning_effort": "medium",
1658+ "supports_attachments": false
1659+ },
1660+ {
1661+ "id": "gpt-4o-mini",
1662+ "name": "gpt-4o-mini",
1663+ "cost_per_1m_in": 0.143,
1664+ "cost_per_1m_out": 0.573,
1665+ "cost_per_1m_in_cached": 0,
1666+ "cost_per_1m_out_cached": 0,
1667+ "context_window": 128000,
1668+ "default_max_tokens": 12800,
1669+ "can_reason": true,
1670+ "reasoning_levels": [
1671+ "low",
1672+ "medium",
1673+ "high"
1674+ ],
1675+ "default_reasoning_effort": "medium",
1676+ "supports_attachments": true
1677+ },
1678+ {
1679+ "id": "llama-3.1-8b-instruct",
1680+ "name": "llama-3.1-8b-instruct",
1681+ "cost_per_1m_in": 0.15,
1682+ "cost_per_1m_out": 0.15,
1683+ "cost_per_1m_in_cached": 0,
1684+ "cost_per_1m_out_cached": 0,
1685+ "context_window": 128000,
1686+ "default_max_tokens": 12800,
1687+ "can_reason": true,
1688+ "reasoning_levels": [
1689+ "low",
1690+ "medium",
1691+ "high"
1692+ ],
1693+ "default_reasoning_effort": "medium",
1694+ "supports_attachments": false
1695+ }
1696+ ]
1697+}
vendor/charm.land/catwalk/internal/providers/configs/deepseek.jsonnew file+45
@@ -0,0 +1,45 @@
1+{
2+ "name": "DeepSeek",
3+ "id": "deepseek",
4+ "type": "openai-compat",
5+ "api_key": "$DEEPSEEK_API_KEY",
6+ "api_endpoint": "https://api.deepseek.com/v1",
7+ "default_large_model_id": "deepseek-v4-pro",
8+ "default_small_model_id": "deepseek-v4-flash",
9+ "models": [
10+ {
11+ "id": "deepseek-v4-flash",
12+ "name": "DeepSeek-V4-Flash",
13+ "cost_per_1m_in": 0.14,
14+ "cost_per_1m_out": 0.28,
15+ "cost_per_1m_in_cached": 0.0028,
16+ "cost_per_1m_out_cached": 0,
17+ "context_window": 1000000,
18+ "default_max_tokens": 384000,
19+ "can_reason": true,
20+ "reasoning_levels": [
21+ "high",
22+ "xhigh"
23+ ],
24+ "default_reasoning_effort": "high",
25+ "supports_attachments": false
26+ },
27+ {
28+ "id": "deepseek-v4-pro",
29+ "name": "DeepSeek-V4-Pro",
30+ "cost_per_1m_in": 0.435,
31+ "cost_per_1m_out": 0.87,
32+ "cost_per_1m_in_cached": 0.003625,
33+ "cost_per_1m_out_cached": 0,
34+ "context_window": 1000000,
35+ "default_max_tokens": 384000,
36+ "can_reason": true,
37+ "reasoning_levels": [
38+ "high",
39+ "xhigh"
40+ ],
41+ "default_reasoning_effort": "high",
42+ "supports_attachments": false
43+ }
44+ ]
45+}
vendor/charm.land/catwalk/internal/providers/configs/fireworks.jsonnew file+171
@@ -0,0 +1,171 @@
1+{
2+ "name": "Fireworks",
3+ "id": "fireworks",
4+ "api_key": "$FIREWORKS_API_KEY",
5+ "api_endpoint": "https://api.fireworks.ai/inference/v1",
6+ "type": "openai-compat",
7+ "default_large_model_id": "accounts/fireworks/models/deepseek-v4-pro",
8+ "default_small_model_id": "accounts/fireworks/models/deepseek-v4-flash",
9+ "models": [
10+ {
11+ "id": "accounts/fireworks/models/qwen3p7-plus",
12+ "name": "Qwen3.7-Plus",
13+ "cost_per_1m_in": 0.40,
14+ "cost_per_1m_out": 1.60,
15+ "cost_per_1m_in_cached": 0.08,
16+ "cost_per_1m_out_cached": 0,
17+ "context_window": 262144,
18+ "default_max_tokens": 65536,
19+ "can_reason": true,
20+ "supports_attachments": true
21+ },
22+ {
23+ "id": "accounts/fireworks/models/qwen3p6-plus",
24+ "name": "Qwen3.6-Plus",
25+ "cost_per_1m_in": 0.50,
26+ "cost_per_1m_out": 3.00,
27+ "cost_per_1m_in_cached": 0.10,
28+ "cost_per_1m_out_cached": 0,
29+ "context_window": 262144,
30+ "default_max_tokens": 65536,
31+ "can_reason": true,
32+ "supports_attachments": true
33+ },
34+ {
35+ "id": "accounts/fireworks/models/glm-5p2",
36+ "name": "GLM-5.2",
37+ "cost_per_1m_in": 1.40,
38+ "cost_per_1m_out": 4.40,
39+ "cost_per_1m_in_cached": 0.26,
40+ "cost_per_1m_out_cached": 0,
41+ "context_window": 1048576,
42+ "default_max_tokens": 131072,
43+ "can_reason": true,
44+ "reasoning_levels": ["high", "max"],
45+ "default_reasoning_effort": "max",
46+ "supports_attachments": false
47+ },
48+ {
49+ "id": "accounts/fireworks/models/glm-5p1",
50+ "name": "GLM 5.1",
51+ "cost_per_1m_in": 1.40,
52+ "cost_per_1m_out": 4.40,
53+ "cost_per_1m_in_cached": 0.26,
54+ "cost_per_1m_out_cached": 0,
55+ "context_window": 202800,
56+ "default_max_tokens": 131072,
57+ "can_reason": true,
58+ "reasoning_levels": ["high", "max"],
59+ "default_reasoning_effort": "max",
60+ "supports_attachments": false
61+ },
62+ {
63+ "id": "accounts/fireworks/models/kimi-k2p7-code",
64+ "name": "Kimi K2.7 Code",
65+ "cost_per_1m_in": 0.95,
66+ "cost_per_1m_out": 4.00,
67+ "cost_per_1m_in_cached": 0.19,
68+ "cost_per_1m_out_cached": 0,
69+ "context_window": 262000,
70+ "default_max_tokens": 262000,
71+ "can_reason": true,
72+ "supports_attachments": true
73+ },
74+ {
75+ "id": "accounts/fireworks/models/kimi-k2p6",
76+ "name": "Kimi K2.6",
77+ "cost_per_1m_in": 0.95,
78+ "cost_per_1m_out": 4.00,
79+ "cost_per_1m_in_cached": 0.16,
80+ "cost_per_1m_out_cached": 0,
81+ "context_window": 262000,
82+ "default_max_tokens": 262000,
83+ "can_reason": true,
84+ "supports_attachments": true
85+ },
86+ {
87+ "id": "accounts/fireworks/models/minimax-m3",
88+ "name": "Minimax M3",
89+ "cost_per_1m_in": 0.30,
90+ "cost_per_1m_out": 1.20,
91+ "cost_per_1m_in_cached": 0.06,
92+ "cost_per_1m_out_cached": 0,
93+ "context_window": 512000,
94+ "default_max_tokens": 512000,
95+ "can_reason": true,
96+ "reasoning_levels": ["low", "medium", "high"],
97+ "default_reasoning_effort": "medium",
98+ "supports_attachments": true
99+ },
100+ {
101+ "id": "accounts/fireworks/models/minimax-m2p7",
102+ "name": "MiniMax M2.7",
103+ "cost_per_1m_in": 0.30,
104+ "cost_per_1m_out": 1.20,
105+ "cost_per_1m_in_cached": 0.06,
106+ "cost_per_1m_out_cached": 0,
107+ "context_window": 196608,
108+ "default_max_tokens": 196608,
109+ "can_reason": true,
110+ "reasoning_levels": ["low", "medium", "high"],
111+ "default_reasoning_effort": "medium",
112+ "supports_attachments": false
113+ },
114+ {
115+ "id": "accounts/fireworks/models/deepseek-v4-pro",
116+ "name": "DeepSeek V4 Pro",
117+ "cost_per_1m_in": 1.74,
118+ "cost_per_1m_out": 3.48,
119+ "cost_per_1m_in_cached": 0.15,
120+ "cost_per_1m_out_cached": 0,
121+ "context_window": 1000000,
122+ "default_max_tokens": 384000,
123+ "can_reason": true,
124+ "reasoning_levels": ["none", "high", "xhigh"],
125+ "default_reasoning_effort": "high",
126+ "supports_attachments": false
127+ },
128+ {
129+ "id": "accounts/fireworks/models/deepseek-v4-flash",
130+ "name": "DeepSeek V4 Flash",
131+ "cost_per_1m_in": 0.14,
132+ "cost_per_1m_out": 0.28,
133+ "cost_per_1m_in_cached": 0.03,
134+ "cost_per_1m_out_cached": 0,
135+ "context_window": 1000000,
136+ "default_max_tokens": 384000,
137+ "can_reason": true,
138+ "reasoning_levels": ["none", "high", "xhigh"],
139+ "default_reasoning_effort": "high",
140+ "supports_attachments": false
141+ },
142+ {
143+ "id": "accounts/fireworks/models/gpt-oss-120b",
144+ "name": "gpt-oss-120b",
145+ "cost_per_1m_in": 0.15,
146+ "cost_per_1m_out": 0.60,
147+ "cost_per_1m_in_cached": 0.01,
148+ "cost_per_1m_out_cached": 0,
149+ "context_window": 131072,
150+ "default_max_tokens": 32768,
151+ "can_reason": true,
152+ "reasoning_levels": ["low", "medium", "high"],
153+ "default_reasoning_effort": "medium",
154+ "supports_attachments": false
155+ },
156+ {
157+ "id": "accounts/fireworks/models/gpt-oss-20b",
158+ "name": "gpt-oss-20b",
159+ "cost_per_1m_in": 0.07,
160+ "cost_per_1m_out": 0.30,
161+ "cost_per_1m_in_cached": 0.04,
162+ "cost_per_1m_out_cached": 0,
163+ "context_window": 131072,
164+ "default_max_tokens": 32768,
165+ "can_reason": true,
166+ "reasoning_levels": ["low", "medium", "high"],
167+ "default_reasoning_effort": "medium",
168+ "supports_attachments": false
169+ }
170+ ]
171+}
vendor/charm.land/catwalk/internal/providers/configs/gemini.jsonnew file+91
@@ -0,0 +1,91 @@
1+{
2+ "name": "Google Gemini",
3+ "id": "gemini",
4+ "type": "google",
5+ "api_key": "$GEMINI_API_KEY",
6+ "api_endpoint": "$GEMINI_API_ENDPOINT",
7+ "default_large_model_id": "gemini-3.1-pro-preview-customtools",
8+ "default_small_model_id": "gemini-3-flash-preview",
9+ "models": [
10+ {
11+ "id": "gemini-3.5-flash",
12+ "name": "Gemini 3.5 Flash",
13+ "cost_per_1m_in": 1.5,
14+ "cost_per_1m_out": 9,
15+ "cost_per_1m_in_cached": 0,
16+ "cost_per_1m_out_cached": 1,
17+ "context_window": 1048576,
18+ "default_max_tokens": 64000,
19+ "can_reason": true,
20+ "reasoning_levels": ["minimal", "low", "medium", "high"],
21+ "default_reasoning_effort": "medium",
22+ "supports_attachments": true
23+ },
24+ {
25+ "id": "gemini-3.1-pro-preview-customtools",
26+ "name": "Gemini 3.1 Pro",
27+ "cost_per_1m_in": 2,
28+ "cost_per_1m_out": 12,
29+ "cost_per_1m_in_cached": 0,
30+ "cost_per_1m_out_cached": 0.2,
31+ "context_window": 1048576,
32+ "default_max_tokens": 64000,
33+ "can_reason": true,
34+ "reasoning_levels": ["low", "medium", "high"],
35+ "default_reasoning_effort": "medium",
36+ "supports_attachments": true
37+ },
38+ {
39+ "id": "gemini-3-pro-preview",
40+ "name": "Gemini 3 Pro",
41+ "cost_per_1m_in": 2,
42+ "cost_per_1m_out": 12,
43+ "cost_per_1m_in_cached": 0,
44+ "cost_per_1m_out_cached": 0.2,
45+ "context_window": 1048576,
46+ "default_max_tokens": 64000,
47+ "can_reason": true,
48+ "reasoning_levels": ["low", "high"],
49+ "default_reasoning_effort": "high",
50+ "supports_attachments": true
51+ },
52+ {
53+ "id": "gemini-3-flash-preview",
54+ "name": "Gemini 3 Flash",
55+ "cost_per_1m_in": 0.5,
56+ "cost_per_1m_out": 3,
57+ "cost_per_1m_in_cached": 0,
58+ "cost_per_1m_out_cached": 0.05,
59+ "context_window": 1048576,
60+ "default_max_tokens": 50000,
61+ "can_reason": true,
62+ "reasoning_levels": ["minimal", "low", "medium", "high"],
63+ "default_reasoning_effort": "minimal",
64+ "supports_attachments": true
65+ },
66+ {
67+ "id": "gemini-2.5-pro",
68+ "name": "Gemini 2.5 Pro",
69+ "cost_per_1m_in": 1.25,
70+ "cost_per_1m_out": 10,
71+ "cost_per_1m_in_cached": 0,
72+ "cost_per_1m_out_cached": 0.125,
73+ "context_window": 1048576,
74+ "default_max_tokens": 50000,
75+ "can_reason": true,
76+ "supports_attachments": true
77+ },
78+ {
79+ "id": "gemini-2.5-flash",
80+ "name": "Gemini 2.5 Flash",
81+ "cost_per_1m_in": 0.3,
82+ "cost_per_1m_out": 2.5,
83+ "cost_per_1m_in_cached": 0,
84+ "cost_per_1m_out_cached": 0.03,
85+ "context_window": 1048576,
86+ "default_max_tokens": 50000,
87+ "can_reason": true,
88+ "supports_attachments": true
89+ }
90+ ]
91+}
vendor/charm.land/catwalk/internal/providers/configs/groq.jsonnew file+36
@@ -0,0 +1,36 @@
1+{
2+ "name": "Groq",
3+ "id": "groq",
4+ "api_key": "$GROQ_API_KEY",
5+ "api_endpoint": "https://api.groq.com/openai/v1",
6+ "type": "openai-compat",
7+ "default_large_model_id": "moonshotai/kimi-k2-instruct-0905",
8+ "default_small_model_id": "qwen/qwen3-32b",
9+ "models": [
10+ {
11+ "id": "moonshotai/kimi-k2-instruct-0905",
12+ "name": "Kimi K2 0905",
13+ "cost_per_1m_in": 1,
14+ "cost_per_1m_out": 3,
15+ "cost_per_1m_in_cached": 0.5,
16+ "cost_per_1m_out_cached": 0.5,
17+ "context_window": 131072,
18+ "can_reason": true,
19+ "reasoning_levels": [
20+ "low",
21+ "medium",
22+ "high"
23+ ],
24+ "default_reasoning_effort": "medium",
25+ "default_max_tokens": 10000
26+ },
27+ {
28+ "id": "qwen/qwen3-32b",
29+ "name": "Qwen3 32B",
30+ "cost_per_1m_in": 0.29,
31+ "cost_per_1m_out": 0.59,
32+ "context_window": 131072,
33+ "default_max_tokens": 10000
34+ }
35+ ]
36+}
vendor/charm.land/catwalk/internal/providers/configs/huggingface.jsonnew file+267

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/ionet.jsonnew file+335

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/kimi.jsonnew file+23

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/minimax-china.jsonnew file+91

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/minimax.jsonnew file+91

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/moonshot.jsonnew file+131

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/nebius.jsonnew file+419

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/neuralwatt.jsonnew file+155

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/openai.jsonnew file+352

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/opencode-go.jsonnew file+351

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/opencode-zen.jsonnew file+908

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/openrouter.jsonnew file+3831

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/qiniucloud.jsonnew file+179

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/scaleway.jsonnew file+141

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/synthetic.jsonnew file+197

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/venice.jsonnew file+1173

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/vercel.jsonnew file+3072

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/vertexai.jsonnew file+170

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/xai.jsonnew file+59

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/zai.jsonnew file+136

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/zhipu-coding.jsonnew file+136

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/configs/zhipu.jsonnew file+120

This diff is too big to show here.

vendor/charm.land/catwalk/internal/providers/providers.gonew file+349

This diff is too big to show here.

vendor/charm.land/catwalk/pkg/catwalk/client.gonew file+79

This diff is too big to show here.

vendor/charm.land/catwalk/pkg/catwalk/pkg.gonew file+2

This diff is too big to show here.

vendor/charm.land/catwalk/pkg/catwalk/provider.gonew file+157

This diff is too big to show here.

vendor/charm.land/catwalk/pkg/embedded/embedded.gonew file+13

This diff is too big to show here.

vendor/charm.land/fang/v2/.gitignorenew file+3

This diff is too big to show here.

vendor/charm.land/fang/v2/.golangci.ymlnew file+47

This diff is too big to show here.

vendor/charm.land/fang/v2/.goreleaser.ymlnew file+5

This diff is too big to show here.

vendor/charm.land/fang/v2/LICENSE.mdnew file+21

This diff is too big to show here.

vendor/charm.land/fang/v2/README.mdnew file+92

This diff is too big to show here.

vendor/charm.land/fang/v2/Taskfile.ymlnew file+7

This diff is too big to show here.

vendor/charm.land/fang/v2/UPGRADE_GUIDE_V2.mdnew file+127

This diff is too big to show here.

vendor/charm.land/fang/v2/fang.gonew file+208

This diff is too big to show here.

vendor/charm.land/fang/v2/fang_other.gonew file+10

This diff is too big to show here.

vendor/charm.land/fang/v2/fang_windows.gonew file+30

This diff is too big to show here.

vendor/charm.land/fang/v2/help.gonew file+482

This diff is too big to show here.

vendor/charm.land/fang/v2/theme.gonew file+222

This diff is too big to show here.

vendor/charm.land/fantasy/.editorconfignew file+18

This diff is too big to show here.

vendor/charm.land/fantasy/.gitattributesnew file+1

This diff is too big to show here.

vendor/charm.land/fantasy/.gitignorenew file+42

This diff is too big to show here.

vendor/charm.land/fantasy/.golangci.ymlnew file+44

This diff is too big to show here.

vendor/charm.land/fantasy/.goreleaser.ymlnew file+6

This diff is too big to show here.

vendor/charm.land/fantasy/AGENTS.mdnew file+29

This diff is too big to show here.

vendor/charm.land/fantasy/LICENSEnew file+177

This diff is too big to show here.

vendor/charm.land/fantasy/NOTICEnew file+13

This diff is too big to show here.

vendor/charm.land/fantasy/README.mdnew file+95

This diff is too big to show here.

vendor/charm.land/fantasy/Taskfile.yamlnew file+45

This diff is too big to show here.

vendor/charm.land/fantasy/agent.gonew file+1702

This diff is too big to show here.

vendor/charm.land/fantasy/content.gonew file+625

This diff is too big to show here.

vendor/charm.land/fantasy/content_json.gonew file+1046

This diff is too big to show here.

vendor/charm.land/fantasy/crush.jsonnew file+6

This diff is too big to show here.

vendor/charm.land/fantasy/cspell.jsonnew file+1

This diff is too big to show here.

vendor/charm.land/fantasy/doc.gonew file+2

This diff is too big to show here.

vendor/charm.land/fantasy/errors.gonew file+155

This diff is too big to show here.

vendor/charm.land/fantasy/jsonrepair/jsonrepair.gonew file+1648

This diff is too big to show here.

vendor/charm.land/fantasy/model.gonew file+261

This diff is too big to show here.

vendor/charm.land/fantasy/model_json.gonew file+156

This diff is too big to show here.

vendor/charm.land/fantasy/object.gonew file+236

This diff is too big to show here.

vendor/charm.land/fantasy/object/object.gonew file+620

This diff is too big to show here.

vendor/charm.land/fantasy/provider.gonew file+11

This diff is too big to show here.

vendor/charm.land/fantasy/provider_registry.gonew file+106

This diff is too big to show here.

vendor/charm.land/fantasy/providers/anthropic/anthropic.gonew file+1707

This diff is too big to show here.

vendor/charm.land/fantasy/providers/anthropic/bedrock.gonew file+15

This diff is too big to show here.

vendor/charm.land/fantasy/providers/anthropic/call_useragent.gonew file+14

This diff is too big to show here.

vendor/charm.land/fantasy/providers/anthropic/computer_use.gonew file+427

This diff is too big to show here.

vendor/charm.land/fantasy/providers/anthropic/error.gonew file+67

This diff is too big to show here.

vendor/charm.land/fantasy/providers/anthropic/google.gonew file+11

This diff is too big to show here.

vendor/charm.land/fantasy/providers/anthropic/provider_options.gonew file+283

This diff is too big to show here.

vendor/charm.land/fantasy/providers/anthropic/sanitize.gonew file+33

This diff is too big to show here.

vendor/charm.land/fantasy/providers/azure/README.mdnew file+6

This diff is too big to show here.

vendor/charm.land/fantasy/providers/azure/azure.gonew file+125

This diff is too big to show here.

vendor/charm.land/fantasy/providers/bedrock/README.mdnew file+10

This diff is too big to show here.

vendor/charm.land/fantasy/providers/bedrock/bedrock.gonew file+87

This diff is too big to show here.

vendor/charm.land/fantasy/providers/google/README.mdnew file+63

This diff is too big to show here.

vendor/charm.land/fantasy/providers/google/auth.gonew file+15

This diff is too big to show here.

vendor/charm.land/fantasy/providers/google/call_useragent.gonew file+53

This diff is too big to show here.

vendor/charm.land/fantasy/providers/google/error.gonew file+51

This diff is too big to show here.

vendor/charm.land/fantasy/providers/google/google.gonew file+1488

This diff is too big to show here.

vendor/charm.land/fantasy/providers/google/provider_options.gonew file+146

This diff is too big to show here.

vendor/charm.land/fantasy/providers/google/slice.gonew file+11

This diff is too big to show here.

vendor/charm.land/fantasy/providers/internal/httpheaders/httpheaders.gonew file+60

This diff is too big to show here.

vendor/charm.land/fantasy/providers/openai/call_useragent.gonew file+31

This diff is too big to show here.

vendor/charm.land/fantasy/providers/openai/error.gonew file+92

This diff is too big to show here.

vendor/charm.land/fantasy/providers/openai/language_model.gonew file+990

This diff is too big to show here.

vendor/charm.land/fantasy/providers/openai/language_model_hooks.gonew file+668

This diff is too big to show here.

vendor/charm.land/fantasy/providers/openai/openai.gonew file+220

This diff is too big to show here.

vendor/charm.land/fantasy/providers/openai/provider_options.gonew file+217

This diff is too big to show here.

vendor/charm.land/fantasy/providers/openai/responses_language_model.gonew file+1678

This diff is too big to show here.

vendor/charm.land/fantasy/providers/openai/responses_options.gonew file+395

This diff is too big to show here.

vendor/charm.land/fantasy/providers/openaicompat/language_model_hooks.gonew file+516

This diff is too big to show here.

vendor/charm.land/fantasy/providers/openaicompat/openaicompat.gonew file+140

This diff is too big to show here.

vendor/charm.land/fantasy/providers/openaicompat/provider_options.gonew file+161

This diff is too big to show here.

vendor/charm.land/fantasy/providers/openrouter/language_model_hooks.gonew file+1063

This diff is too big to show here.

vendor/charm.land/fantasy/providers/openrouter/openrouter.gonew file+121

This diff is too big to show here.

vendor/charm.land/fantasy/providers/openrouter/provider_options.gonew file+218

This diff is too big to show here.

vendor/charm.land/fantasy/providers/vercel/language_model_hooks.gonew file+1074

This diff is too big to show here.

vendor/charm.land/fantasy/providers/vercel/provider_options.gonew file+195

This diff is too big to show here.

vendor/charm.land/fantasy/providers/vercel/vercel.gonew file+122

This diff is too big to show here.

vendor/charm.land/fantasy/retry.gonew file+155

This diff is too big to show here.

vendor/charm.land/fantasy/schema/schema.gonew file+442

This diff is too big to show here.

vendor/charm.land/fantasy/tool.gonew file+176

This diff is too big to show here.

vendor/charm.land/fantasy/util.gonew file+22

This diff is too big to show here.

vendor/charm.land/fantasy/version.gonew file+12

This diff is too big to show here.

vendor/charm.land/fantasy/version.txtnew file+1

This diff is too big to show here.

vendor/charm.land/glamour/v2/.editorconfignew file+18

This diff is too big to show here.

vendor/charm.land/glamour/v2/.gitattributesnew file+2

This diff is too big to show here.

vendor/charm.land/glamour/v2/.gitignorenew file+2

This diff is too big to show here.

vendor/charm.land/glamour/v2/.golangci.ymlnew file+44

This diff is too big to show here.

vendor/charm.land/glamour/v2/.goreleaser.ymlnew file+6

This diff is too big to show here.

vendor/charm.land/glamour/v2/CONTRIBUTING.mdnew file+23

This diff is too big to show here.

vendor/charm.land/glamour/v2/LICENSEnew file+21

This diff is too big to show here.

vendor/charm.land/glamour/v2/README.mdnew file+129

This diff is too big to show here.

vendor/charm.land/glamour/v2/Taskfile.ymlnew file+25

This diff is too big to show here.

vendor/charm.land/glamour/v2/UPGRADE_GUIDE_V2.mdnew file+279

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/ansi.gonew file+3

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/baseelement.gonew file+157

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/blockelement.gonew file+66

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/blockstack.gonew file+95

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/codeblock.gonew file+151

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/codespan.gonew file+15

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/context.gonew file+38

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/elements.gonew file+481

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/emphasis.gonew file+47

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/heading.gonew file+80

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/image.gonew file+57

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/link.gonew file+112

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/listitem.gonew file+29

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/margin.gonew file+231

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/paragraph.gonew file+63

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/renderer.gonew file+166

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/style.gonew file+252

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/table.gonew file+206

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/table_links.gonew file+234

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/task.gonew file+27

This diff is too big to show here.

vendor/charm.land/glamour/v2/ansi/templatehelper.gonew file+86

This diff is too big to show here.

vendor/charm.land/glamour/v2/examples.shnew file+19

This diff is too big to show here.

vendor/charm.land/glamour/v2/gallery.shnew file+23

This diff is too big to show here.

vendor/charm.land/glamour/v2/glamour.gonew file+294

This diff is too big to show here.

vendor/charm.land/glamour/v2/internal/autolink/autolink.gonew file+55

This diff is too big to show here.

vendor/charm.land/glamour/v2/styles/README.mdnew file+565

This diff is too big to show here.

vendor/charm.land/glamour/v2/styles/ascii.jsonnew file+87

This diff is too big to show here.

vendor/charm.land/glamour/v2/styles/dark.jsonnew file+191

This diff is too big to show here.

vendor/charm.land/glamour/v2/styles/dracula.gonew file+216

This diff is too big to show here.

vendor/charm.land/glamour/v2/styles/dracula.jsonnew file+188

This diff is too big to show here.

vendor/charm.land/glamour/v2/styles/light.jsonnew file+190

This diff is too big to show here.

vendor/charm.land/glamour/v2/styles/notty.jsonnew file+87

This diff is too big to show here.

vendor/charm.land/glamour/v2/styles/pink.jsonnew file+90

This diff is too big to show here.

vendor/charm.land/glamour/v2/styles/styles.gonew file+691

This diff is too big to show here.

vendor/charm.land/glamour/v2/styles/tokyo-night.gonew file+209

This diff is too big to show here.

vendor/charm.land/glamour/v2/styles/tokyo-night.jsonnew file+182

This diff is too big to show here.

vendor/charm.land/glamour/v2/styles/tokyo_night.jsonnew file+182

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/.editorconfignew file+18

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/.gitattributesnew file+1

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/.gitignorenew file+3

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/.golangci.ymlnew file+50

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/.goreleaser.ymlnew file+5

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/LICENSEnew file+21

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/README.mdnew file+996

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/Taskfile.yamlnew file+24

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/UPGRADE_GUIDE_V2.mdnew file+504

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/align.gonew file+82

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/ansi_unix.gonew file+8

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/ansi_windows.gonew file+30

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/blending.gonew file+196

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/borders.gonew file+587

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/canvas.gonew file+88

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/color.gonew file+359

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/get.gonew file+657

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/join.gonew file+175

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/layer.gonew file+327

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/lipgloss.gonew file+3

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/position.gonew file+134

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/query.gonew file+92

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/ranges.gonew file+48

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/runes.gonew file+43

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/set.gonew file+932

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/size.gonew file+40

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/style.gonew file+637

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/table/resizing.gonew file+489

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/table/rows.gonew file+130

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/table/table.gonew file+568

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/table/util.gonew file+44

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/terminal.gonew file+124

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/tree/children.gonew file+100

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/tree/enumerator.gonew file+74

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/tree/renderer.gonew file+165

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/tree/tree.gonew file+407

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/unset.gonew file+359

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/whitespace.gonew file+76

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/wrap.gonew file+113

This diff is too big to show here.

vendor/charm.land/lipgloss/v2/writer.gonew file+160

This diff is too big to show here.

vendor/charm.land/log/v2/.gitignorenew file+17

This diff is too big to show here.

vendor/charm.land/log/v2/.golangci.ymlnew file+50

This diff is too big to show here.

vendor/charm.land/log/v2/.goreleaser.ymlnew file+6

This diff is too big to show here.

vendor/charm.land/log/v2/LICENSEnew file+21

This diff is too big to show here.

vendor/charm.land/log/v2/README.mdnew file+367

This diff is too big to show here.

vendor/charm.land/log/v2/UPGRADE_GUIDE_V2.mdnew file+320

This diff is too big to show here.

vendor/charm.land/log/v2/context.gonew file+23

This diff is too big to show here.

vendor/charm.land/log/v2/doc.gonew file+3

This diff is too big to show here.

vendor/charm.land/log/v2/formatter.gonew file+27

This diff is too big to show here.

vendor/charm.land/log/v2/json.gonew file+157

This diff is too big to show here.

vendor/charm.land/log/v2/level.gonew file+65

This diff is too big to show here.

vendor/charm.land/log/v2/logfmt.gonew file+32

This diff is too big to show here.

vendor/charm.land/log/v2/logger.gonew file+413

This diff is too big to show here.

vendor/charm.land/log/v2/logger_121.gonew file+72

This diff is too big to show here.

vendor/charm.land/log/v2/logger_no121.gonew file+69

This diff is too big to show here.

vendor/charm.land/log/v2/options.gonew file+61

This diff is too big to show here.

vendor/charm.land/log/v2/pkg.gonew file+248

This diff is too big to show here.

vendor/charm.land/log/v2/stdlog.gonew file+67

This diff is too big to show here.

vendor/charm.land/log/v2/styles.gonew file+83

This diff is too big to show here.

vendor/charm.land/log/v2/text.gonew file+272

This diff is too big to show here.

vendor/charm.land/x/vcr/LICENSEnew file+21

This diff is too big to show here.

vendor/charm.land/x/vcr/doc.gonew file+3

This diff is too big to show here.

vendor/charm.land/x/vcr/hooks.gonew file+33

This diff is too big to show here.

vendor/charm.land/x/vcr/marshaler.gonew file+19

This diff is too big to show here.

vendor/charm.land/x/vcr/matcher.gonew file+70

This diff is too big to show here.

vendor/charm.land/x/vcr/recorder.gonew file+70

This diff is too big to show here.

vendor/cloud.google.com/go/LICENSEnew file+202

This diff is too big to show here.

vendor/cloud.google.com/go/auth/CHANGES.mdnew file+483

This diff is too big to show here.

vendor/cloud.google.com/go/auth/LICENSEnew file+202

This diff is too big to show here.

vendor/cloud.google.com/go/auth/README.mdnew file+40

This diff is too big to show here.

vendor/cloud.google.com/go/auth/auth.gonew file+618

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/compute.gonew file+102

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/detect.gonew file+471

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/doc.gonew file+45

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/filetypes.gonew file+329

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/aws_provider.gonew file+531

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/executable_provider.gonew file+284

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/externalaccount.gonew file+431

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/file_provider.gonew file+78

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/info.gonew file+74

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/programmatic_provider.gonew file+30

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/url_provider.gonew file+93

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/x509_provider.gonew file+220

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/internal/externalaccountuser/externalaccountuser.gonew file+115

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/internal/gdch/gdch.gonew file+198

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/internal/impersonate/idtoken.gonew file+105

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/internal/impersonate/impersonate.gonew file+168

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/internal/stsexchange/sts_exchange.gonew file+167

This diff is too big to show here.

vendor/cloud.google.com/go/auth/credentials/selfsignedjwt.gonew file+89

This diff is too big to show here.

vendor/cloud.google.com/go/auth/grpctransport/dial_socketopt.gonew file+62

This diff is too big to show here.

vendor/cloud.google.com/go/auth/grpctransport/directpath.gonew file+177

This diff is too big to show here.

vendor/cloud.google.com/go/auth/grpctransport/grpctransport.gonew file+675

This diff is too big to show here.

vendor/cloud.google.com/go/auth/grpctransport/pool.gonew file+119

This diff is too big to show here.

vendor/cloud.google.com/go/auth/httptransport/httptransport.gonew file+254

This diff is too big to show here.

vendor/cloud.google.com/go/auth/httptransport/transport.gonew file+548

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/compute/compute.gonew file+65

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/compute/manufacturer.gonew file+22

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/compute/manufacturer_linux.gonew file+23

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/compute/manufacturer_windows.gonew file+46

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/credsfile/credsfile.gonew file+63

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/credsfile/filetype.gonew file+159

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/credsfile/parse.gonew file+99

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/internal.gonew file+285

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/jwt/jwt.gonew file+208

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/retry/retry.gonew file+117

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/transport/cba.gonew file+361

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/transport/cert/default_cert.gonew file+65

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/transport/cert/enterprise_cert.gonew file+54

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/transport/cert/secureconnect_cert.gonew file+124

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/transport/cert/workload_cert.gonew file+138

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/transport/headers/headers.gonew file+61

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/transport/s2a.gonew file+138

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/transport/transport.gonew file+137

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/trustboundary/external_accounts_config_providers.gonew file+100

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/trustboundary/trust_boundary.gonew file+392

This diff is too big to show here.

vendor/cloud.google.com/go/auth/internal/version.gonew file+20

This diff is too big to show here.

vendor/cloud.google.com/go/auth/oauth2adapt/CHANGES.mdnew file+82

This diff is too big to show here.

vendor/cloud.google.com/go/auth/oauth2adapt/LICENSEnew file+202

This diff is too big to show here.

vendor/cloud.google.com/go/auth/oauth2adapt/oauth2adapt.gonew file+200

This diff is too big to show here.

vendor/cloud.google.com/go/auth/threelegged.gonew file+382

This diff is too big to show here.

vendor/cloud.google.com/go/civil/civil.gonew file+500

This diff is too big to show here.

vendor/cloud.google.com/go/compute/metadata/CHANGES.mdnew file+115

This diff is too big to show here.

vendor/cloud.google.com/go/compute/metadata/LICENSEnew file+202

This diff is too big to show here.

vendor/cloud.google.com/go/compute/metadata/README.mdnew file+27

This diff is too big to show here.

vendor/cloud.google.com/go/compute/metadata/log.gonew file+149

This diff is too big to show here.

vendor/cloud.google.com/go/compute/metadata/metadata.gonew file+937

This diff is too big to show here.

vendor/cloud.google.com/go/compute/metadata/retry.gonew file+117

This diff is too big to show here.

vendor/cloud.google.com/go/compute/metadata/retry_linux.gonew file+31

This diff is too big to show here.

vendor/cloud.google.com/go/compute/metadata/syscheck.gonew file+28

This diff is too big to show here.

vendor/cloud.google.com/go/compute/metadata/syscheck_linux.gonew file+30

This diff is too big to show here.

vendor/cloud.google.com/go/compute/metadata/syscheck_windows.gonew file+39

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/.gitignorenew file+1

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/ARCHITECTURE.mdnew file+244

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/LICENSEnew file+61

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/README.mdnew file+86

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/constants.gonew file+65

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/internal/winrt/data/xml/dom/xmldocument.gonew file+73

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/internal/winrt/ui/notifications/toastnotification.gonew file+88

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/internal/winrt/ui/notifications/toastnotificationmanager.gonew file+53

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/internal/winrt/ui/notifications/toastnotificationmanagerforuser.gonew file+68

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/internal/winrt/ui/notifications/toastnotifier.gonew file+64

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/tmpl/powershell.go.tmplnew file+14

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/tmpl/tmpl.gonew file+28

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/tmpl/xml.go.tmplnew file+34

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/toast.gonew file+225

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/wintoast/bind.gonew file+86

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/wintoast/bind_noop.gonew file+19

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/wintoast/bind_windows.gonew file+174

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/wintoast/impl.gonew file+179

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/wintoast/procs.gonew file+37

This diff is too big to show here.

vendor/git.sr.ht/~jackmordaunt/go-toast/wintoast/registry.gonew file+110

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/CHANGELOG.mdnew file+849

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/LICENSE.txtnew file+21

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/README.mdnew file+39

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/ci.ymlnew file+29

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud/cloud.gonew file+44

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud/doc.gonew file+53

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/core.gonew file+173

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/doc.gonew file+264

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/errors.gonew file+17

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/etag.gonew file+57

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/exported.gonew file+175

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/pipeline.gonew file+77

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/request.gonew file+260

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/response_error.gonew file+201

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log/log.gonew file+50

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/async/async.gonew file+159

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/body/body.gonew file+135

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/fake/fake.gonew file+133

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/loc/loc.gonew file+123

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/op/op.gonew file+148

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/poller.gonew file+24

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/util.gonew file+212

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/constants.gonew file+44

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/shared.gonew file+149

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/log/doc.gonew file+10

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/log/log.gonew file+55

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/policy/doc.gonew file+10

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/policy/policy.gonew file+198

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/doc.gonew file+10

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/errors.gonew file+27

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pager.gonew file+138

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pipeline.gonew file+94

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_api_version.gonew file+75

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_bearer_token.gonew file+236

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_body_download.gonew file+72

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_http_header.gonew file+40

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_http_trace.gonew file+154

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_include_response.gonew file+35

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_key_credential.gonew file+64

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_logging.gonew file+264

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_request_id.gonew file+34

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_retry.gonew file+276

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_sas_credential.gonew file+55

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_telemetry.gonew file+83

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/poller.gonew file+396

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/request.gonew file+281

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/response.gonew file+109

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/transport_default_dialer_other.gonew file+15

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/transport_default_dialer_wasm.gonew file+15

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/transport_default_http_client.gonew file+48

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming/doc.gonew file+9

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming/progress.gonew file+89

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing/constants.gonew file+41

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing/tracing.gonew file+191

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/LICENSE.txtnew file+21

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/diag/diag.gonew file+51

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/diag/doc.gonew file+7

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/errorinfo/doc.gonew file+7

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/errorinfo/errorinfo.gonew file+46

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/exported/exported.gonew file+129

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/log/doc.gonew file+7

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/log/log.gonew file+104

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/poller/util.gonew file+155

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/temporal/resource.gonew file+123

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/uuid/doc.gonew file+7

This diff is too big to show here.

vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/uuid/uuid.gonew file+76

This diff is too big to show here.

vendor/github.com/JohannesKaufmann/html-to-markdown/.gitignorenew file+14

This diff is too big to show here.

vendor/github.com/JohannesKaufmann/html-to-markdown/CONTRIBUTING.mdnew file

No changes to the content.

vendor/github.com/JohannesKaufmann/html-to-markdown/LICENSEnew file+21

This diff is too big to show here.

vendor/github.com/JohannesKaufmann/html-to-markdown/README.mdnew file+242

This diff is too big to show here.

vendor/github.com/JohannesKaufmann/html-to-markdown/SECURITY.mdnew file+6

This diff is too big to show here.

vendor/github.com/JohannesKaufmann/html-to-markdown/commonmark.gonew file+393

This diff is too big to show here.

vendor/github.com/JohannesKaufmann/html-to-markdown/escape/escape.gonew file+65

This diff is too big to show here.

vendor/github.com/JohannesKaufmann/html-to-markdown/from.gonew file+464

This diff is too big to show here.

vendor/github.com/JohannesKaufmann/html-to-markdown/logo_five_years.pngnew file

Binary file not shown.

vendor/github.com/JohannesKaufmann/html-to-markdown/markdown.gonew file+212

This diff is too big to show here.

vendor/github.com/JohannesKaufmann/html-to-markdown/utils.gonew file+533

This diff is too big to show here.

vendor/github.com/KyleBanks/depth/.gitignorenew file+16

This diff is too big to show here.

vendor/github.com/KyleBanks/depth/.travis.ymlnew file+9

This diff is too big to show here.

vendor/github.com/KyleBanks/depth/LICENSEnew file+21

This diff is too big to show here.

vendor/github.com/KyleBanks/depth/Makefilenew file+32

This diff is too big to show here.

vendor/github.com/KyleBanks/depth/README.mdnew file+232

This diff is too big to show here.

vendor/github.com/KyleBanks/depth/depth.gonew file+129

This diff is too big to show here.

vendor/github.com/KyleBanks/depth/pkg.gonew file+184

This diff is too big to show here.

vendor/github.com/MakeNowJust/heredoc/LICENSEnew file+21

This diff is too big to show here.

vendor/github.com/MakeNowJust/heredoc/README.mdnew file+52

This diff is too big to show here.

vendor/github.com/MakeNowJust/heredoc/heredoc.gonew file+105

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/.gitattributesnew file+1

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/.gitignorenew file+10

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/.golangci.ymlnew file+147

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/CODEOWNERSnew file+1

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/LICENSEnew file+22

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/README.mdnew file+89

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/SECURITY.mdnew file+41

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/backup.gonew file+287

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/doc.gonew file+22

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/ea.gonew file+137

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/file.gonew file+320

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/fileinfo.gonew file+106

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/hvsock.gonew file+582

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/internal/fs/doc.gonew file+2

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/internal/fs/fs.gonew file+262

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/internal/fs/security.gonew file+12

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.gonew file+61

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/internal/socket/rawaddr.gonew file+20

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/internal/socket/socket.gonew file+177

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/internal/socket/zsyscall_windows.gonew file+69

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.gonew file+132

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/pipe.gonew file+586

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/pkg/guid/guid.gonew file+232

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/pkg/guid/guid_nonwindows.gonew file+16

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/pkg/guid/guid_windows.gonew file+13

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/pkg/guid/variant_string.gonew file+27

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/privilege.gonew file+196

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/reparse.gonew file+131

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/sd.gonew file+133

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/syscall.gonew file+5

This diff is too big to show here.

vendor/github.com/Microsoft/go-winio/zsyscall_windows.gonew file+378

This diff is too big to show here.

vendor/github.com/PuerkitoBio/goquery/.gitattributesnew file+1

This diff is too big to show here.

vendor/github.com/PuerkitoBio/goquery/.gitignorenew file+16

This diff is too big to show here.

vendor/github.com/PuerkitoBio/goquery/LICENSEnew file+12

This diff is too big to show here.

vendor/github.com/PuerkitoBio/goquery/README.mdnew file+218

This diff is too big to show here.

vendor/github.com/PuerkitoBio/goquery/array.gonew file+124

This diff is too big to show here.

vendor/github.com/PuerkitoBio/goquery/doc.gonew file+123

This diff is too big to show here.

vendor/github.com/PuerkitoBio/goquery/expand.gonew file+70

This diff is too big to show here.

vendor/github.com/PuerkitoBio/goquery/filter.gonew file+163

This diff is too big to show here.

vendor/github.com/PuerkitoBio/goquery/iteration.gonew file+61

This diff is too big to show here.

vendor/github.com/PuerkitoBio/goquery/manipulation.gonew file+679

This diff is too big to show here.

vendor/github.com/PuerkitoBio/goquery/property.gonew file+275

This diff is too big to show here.

vendor/github.com/PuerkitoBio/goquery/query.gonew file+49

This diff is too big to show here.

vendor/github.com/PuerkitoBio/goquery/traversal.gonew file+704

This diff is too big to show here.

vendor/github.com/PuerkitoBio/goquery/type.gonew file+203

This diff is too big to show here.

vendor/github.com/PuerkitoBio/goquery/utilities.gonew file+177

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/.editorconfignew file+17

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/.gitignorenew file+28

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/.golangci.ymlnew file+122

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/.goreleaser.ymlnew file+34

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/AGENTS.mdnew file+11

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/BUILD.bitnew file+93

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/COPYINGnew file+118

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/Dockerfilenew file+64

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/Justfilenew file+59

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/README.mdnew file+309

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/biome.jsonnew file+6

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/chroma.jpgnew file

Binary file not shown.

vendor/github.com/alecthomas/chroma/v2/coalesce.gonew file+35

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/colour.gonew file+192

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/delegate.gonew file+161

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/doc.gonew file+7

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/emitters.gonew file+233

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/formatter.gonew file+43

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/formatters/api.gonew file+57

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/formatters/html/html.gonew file+692

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/formatters/json.gonew file+39

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/formatters/svg/font_liberation_mono.gonew file+51

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/formatters/svg/svg.gonew file+222

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/formatters/tokens.gonew file+18

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/formatters/tty_indexed.gonew file+284

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/formatters/tty_truecolour.gonew file+76

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/iterator.gonew file+93

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexer.gonew file+179

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/README.mdnew file+46

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/caddyfile.gonew file+275

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/cl.gonew file+243

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/dns.gonew file+17

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/emacs.gonew file+533

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/abap.xmlnew file+154

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/abnf.xmlnew file+66

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/actionscript.xmlnew file+68

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/actionscript_3.xmlnew file+163

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ada.xmlnew file+321

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/agda.xmlnew file+66

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/al.xmlnew file+75

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/alloy.xmlnew file+58

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ampl.xmlnew file+98

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/angular2.xmlnew file+109

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/antlr.xmlnew file+317

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/apacheconf.xmlnew file+74

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/apl.xmlnew file+59

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/applescript.xmlnew file+151

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/arangodb_aql.xmlnew file+174

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/arduino.xmlnew file+322

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/armasm.xmlnew file+126

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/arturo.xmlnew file+119

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/atl.xmlnew file+165

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/autohotkey.xmlnew file+78

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/autoit.xmlnew file+70

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/awk.xmlnew file+95

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ballerina.xmlnew file+97

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/bash.xmlnew file+222

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/bash_session.xmlnew file+25

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/batchfile.xmlnew file+660

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/beef.xmlnew file+120

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/bibtex.xmlnew file+152

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/bicep.xmlnew file+84

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/blitzbasic.xmlnew file+141

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/bnf.xmlnew file+28

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/bqn.xmlnew file+83

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/brainfuck.xmlnew file+51

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/c#.xmlnew file+121

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/c++.xmlnew file+331

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/c.xmlnew file+260

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/c3.xmlnew file+374

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cap_n_proto.xmlnew file+122

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cassandra_cql.xmlnew file+137

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ceylon.xmlnew file+151

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cfengine3.xmlnew file+197

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cfstatement.xmlnew file+92

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/chaiscript.xmlnew file+134

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/chapel.xmlnew file+143

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cheetah.xmlnew file+55

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/clojure.xmlnew file+71

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cmake.xmlnew file+90

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cobol.xmlnew file+90

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/coffeescript.xmlnew file+210

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/common_lisp.xmlnew file+184

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/coq.xmlnew file+136

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/core.xmlnew file+79

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/crystal.xmlnew file+762

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/css.xmlnew file+323

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/csv.xmlnew file+53

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cue.xmlnew file+85

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/cython.xmlnew file+372

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/d.xmlnew file+133

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/dart.xmlnew file+213

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/dax.xmlnew file+39

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/desktop_entry.xmlnew file+17

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/devicetree.xmlnew file+251

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/diff.xmlnew file+52

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/django_jinja.xmlnew file+153

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/dns.xmlnew file+44

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/docker.xmlnew file+68

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/dtd.xmlnew file+168

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/dylan.xmlnew file+176

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ebnf.xmlnew file+90

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/elixir.xmlnew file+744

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/elm.xmlnew file+119

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/emacslisp.xmlnew file+132

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/erb.xmlnew file+37

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/erlang.xmlnew file+166

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/factor.xmlnew file+412

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/fennel.xmlnew file+68

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/fish.xmlnew file+159

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/forth.xmlnew file+78

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/fortran.xmlnew file+102

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/fortranfixed.xmlnew file+71

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/fsharp.xmlnew file+245

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/gas.xmlnew file+150

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/gdscript.xmlnew file+259

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/gdscript3.xmlnew file+270

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/gemfile_lock.xmlnew file+81

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/gettext.xmlnew file+24

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/gherkin.xmlnew file+263

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/gleam.xmlnew file+100

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/glsl.xmlnew file+65

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/gnuplot.xmlnew file+289

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/go_template.xmlnew file+114

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/graphql.xmlnew file+92

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/groff.xmlnew file+90

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/groovy.xmlnew file+135

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/handlebars.xmlnew file+147

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/hare.xmlnew file+98

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/haskell.xmlnew file+275

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/hcl.xmlnew file+143

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/hexdump.xmlnew file+189

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/hlb.xmlnew file+131

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/hlsl.xmlnew file+110

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/holyc.xmlnew file+252

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/html.xmlnew file+159

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/hy.xmlnew file+104

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/idris.xmlnew file+216

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/igor.xmlnew file+47

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ini.xmlnew file+52

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/io.xmlnew file+71

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/iscdhcpd.xmlnew file+96

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/j.xmlnew file+157

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/janet.xmlnew file+48

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/java.xmlnew file+206

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/javascript.xmlnew file+160

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/json.xmlnew file+117

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/jsonata.xmlnew file+83

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/jsonnet.xmlnew file+138

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/julia.xmlnew file+400

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/jungle.xmlnew file+98

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/kakoune.xmlnew file+96

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/kdl.xmlnew file+75

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/kotlin.xmlnew file+234

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/lateralus.xmlnew file+184

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/lean.xmlnew file+56

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/lighttpd_configuration_file.xmlnew file+42

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/lilypond.xmlnew file+133

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/llvm.xmlnew file+73

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/lox.xmlnew file+78

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/lua.xmlnew file+158

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/luau.xmlnew file+173

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/makefile.xmlnew file+131

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/mako.xmlnew file+120

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/mason.xmlnew file+89

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/materialize_sql_dialect.xmlnew file+155

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/mathematica.xmlnew file+60

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/matlab.xmlnew file+114

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/mcfunction.xmlnew file+138

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/meson.xmlnew file+86

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/metal.xmlnew file+270

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/microcad.xmlnew file+139

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/minizinc.xmlnew file+82

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/mlir.xmlnew file+73

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/modelica.xmlnew file+106

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/modula-2.xmlnew file+245

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/mojo.xmlnew file+228

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/monkeyc.xmlnew file+153

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/moonbit.xmlnew file+75

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/moonscript.xmlnew file+83

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/morrowindscript.xmlnew file+90

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/myghty.xmlnew file+77

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/mysql.xmlnew file+121

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/nasm.xmlnew file+126

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/natural.xmlnew file+143

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ndisasm.xmlnew file+123

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/newspeak.xmlnew file+121

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/nginx_configuration_file.xmlnew file+101

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/nim.xmlnew file+211

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/nix.xmlnew file+258

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/nsis.xmlnew file+59

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/nu.xmlnew file+126

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/objective-c.xmlnew file+510

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/objectpascal.xmlnew file+142

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ocaml.xmlnew file+153

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/octave.xmlnew file+101

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/odin.xmlnew file+127

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/onesenterprise.xmlnew file+92

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/openedge_abl.xmlnew file+101

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/openscad.xmlnew file+96

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/org_mode.xmlnew file+329

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/pacmanconf.xmlnew file+37

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/perl.xmlnew file+400

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/php.xmlnew file+258

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/pig.xmlnew file+105

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/pkgconfig.xmlnew file+73

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/pl_pgsql.xmlnew file+119

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/plaintext.xmlnew file+21

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/plutus_core.xmlnew file+105

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/pony.xmlnew file+135

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/postgresql_sql_dialect.xmlnew file+155

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/postscript.xmlnew file+93

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/povray.xmlnew file+58

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/powerquery.xmlnew file+51

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/powershell.xmlnew file+230

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/prolog.xmlnew file+115

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/promela.xmlnew file+119

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/promql.xmlnew file+123

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/properties.xmlnew file+45

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/protocol_buffer.xmlnew file+124

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/prql.xmlnew file+161

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/psl.xmlnew file+213

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/puppet.xmlnew file+100

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/python.xmlnew file+595

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/python_2.xmlnew file+356

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/qbasic.xmlnew file+173

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/qml.xmlnew file+113

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/r.xmlnew file+128

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/racket.xmlnew file+260

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ragel.xmlnew file+149

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/react.xmlnew file+236

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/reasonml.xmlnew file+147

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/reg.xmlnew file+68

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/rego.xmlnew file+94

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/rexx.xmlnew file+127

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/rgbasm.xmlnew file+239

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ring.xmlnew file+74

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/rpgle.xmlnew file+176

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/rpm_spec.xmlnew file+58

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ruby.xmlnew file+728

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/rust.xmlnew file+375

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/sas.xmlnew file+191

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/sass.xmlnew file+362

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/scala.xmlnew file+274

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/scdoc.xmlnew file+115

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/scheme.xmlnew file+106

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/scilab.xmlnew file+98

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/scss.xmlnew file+373

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/sed.xmlnew file+92

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/sieve.xmlnew file+61

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/smali.xmlnew file+73

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/smalltalk.xmlnew file+294

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/smarty.xmlnew file+79

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/snbt.xmlnew file+58

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/snobol.xmlnew file+95

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/solidity.xmlnew file+291

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/sourcepawn.xmlnew file+59

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/spade.xmlnew file+292

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/sparql.xmlnew file+160

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/sql.xmlnew file+90

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/squidconf.xmlnew file+63

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/standard_ml.xmlnew file+548

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/stas.xmlnew file+85

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/stylus.xmlnew file+132

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/swift.xmlnew file+207

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/systemd.xmlnew file+63

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/systemverilog.xmlnew file+181

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/tablegen.xmlnew file+69

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/tal.xmlnew file+43

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/tasm.xmlnew file+135

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/tcl.xmlnew file+272

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/tcsh.xmlnew file+121

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/templ.xmlnew file+315

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/termcap.xmlnew file+75

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/terminfo.xmlnew file+84

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/terraform.xmlnew file+149

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/tex.xmlnew file+113

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/thrift.xmlnew file+154

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/toml.xmlnew file+45

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/tradingview.xmlnew file+81

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/transact-sql.xmlnew file+137

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/turing.xmlnew file+82

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/turtle.xmlnew file+170

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/twig.xmlnew file+155

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/txtpb.xmlnew file+162

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/typescript.xmlnew file+302

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/typoscript.xmlnew file+178

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/typoscriptcssdata.xmlnew file+52

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/typoscripthtmldata.xmlnew file+52

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/typst.xmlnew file+108

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/ucode.xmlnew file+147

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/v.xmlnew file+355

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/v_shell.xmlnew file+365

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/vala.xmlnew file+72

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/vb_net.xmlnew file+162

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/verilog.xmlnew file+158

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/vhdl.xmlnew file+171

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/vhs.xmlnew file+48

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/viml.xmlnew file+85

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/vue.xmlnew file+295

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/wat.xmlnew file+149

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/wdte.xmlnew file+43

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/webgpu_shading_language.xmlnew file+142

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/webvtt.xmlnew file+283

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/whiley.xmlnew file+57

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/xml.xmlnew file+96

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/xorg.xmlnew file+35

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/yaml.xmlnew file+132

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/yang.xmlnew file+99

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/z80_assembly.xmlnew file+74

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/zed.xmlnew file+51

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/embedded/zig.xmlnew file+187

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/erb.gonew file+29

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/gemtext.gonew file+37

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/genshi.gonew file+118

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/go.gonew file+81

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/haxe.gonew file+647

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/html.gonew file+8

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/http.gonew file+131

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/lexers.gonew file+85

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/markdown.gonew file+107

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/markless.gonew file+168

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/mysql.gonew file+33

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/php.gonew file+37

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/raku.gonew file+1710

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/rst.gonew file+89

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/svelte.gonew file+70

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/typoscript.gonew file+85

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/yaml_jinja.gonew file+20

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/lexers/zed.gonew file+24

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/mutators.gonew file+201

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/pygments-lexers.txtnew file+605

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/quick/quick.gonew file+44

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/regexp.gonew file+533

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/registry.gonew file+228

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/remap.gonew file+94

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/renovate.json5new file+25

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/serialise.gonew file+483

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/style.gonew file+530

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/abap.xmlnew file+11

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/algol.xmlnew file+18

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/algol_nu.xmlnew file+18

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/api.gonew file+95

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/arduino.xmlnew file+18

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/ashen.xmlnew file+69

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/aura-theme-dark-soft.xmlnew file+107

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/aura-theme-dark.xmlnew file+107

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/autumn.xmlnew file+36

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/average.xmlnew file+74

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/base16-snazzy.xmlnew file+74

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/borland.xmlnew file+26

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/bw.xmlnew file+23

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/catppuccin-frappe.xmlnew file+83

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/catppuccin-latte.xmlnew file+83

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/catppuccin-macchiato.xmlnew file+83

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/catppuccin-mocha.xmlnew file+83

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/colorful.xmlnew file+52

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/compat.gonew file+69

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/darcula.xmlnew file+83

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/doom-one.xmlnew file+51

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/doom-one2.xmlnew file+64

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/dracula.xmlnew file+74

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/emacs.xmlnew file+44

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/evergarden.xmlnew file+33

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/friendly.xmlnew file+44

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/fruity.xmlnew file+19

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/github-dark.xmlnew file+46

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/github.xmlnew file+39

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/gruvbox-light.xmlnew file+34

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/gruvbox.xmlnew file+34

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/hr_high_contrast.xmlnew file+12

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/hrdark.xmlnew file+10

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/igor.xmlnew file+9

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/kanagawa-dragon.xmlnew file+83

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/kanagawa-lotus.xmlnew file+83

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/kanagawa-wave.xmlnew file+83

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/lovelace.xmlnew file+53

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/manni.xmlnew file+44

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/modus-operandi.xmlnew file+13

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/modus-vivendi.xmlnew file+13

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/monokai.xmlnew file+29

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/monokailight.xmlnew file+26

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/murphy.xmlnew file+52

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/native.xmlnew file+35

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/nord.xmlnew file+46

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/nordic.xmlnew file+46

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/onedark.xmlnew file+25

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/onesenterprise.xmlnew file+10

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/paraiso-dark.xmlnew file+37

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/paraiso-light.xmlnew file+37

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/pastie.xmlnew file+45

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/perldoc.xmlnew file+37

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/pygments.xmlnew file+42

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/rainbow_dash.xmlnew file+40

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/rose-pine-dawn.xmlnew file+29

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/rose-pine-moon.xmlnew file+29

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/rose-pine.xmlnew file+29

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/rpgle.xmlnew file+30

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/rrt.xmlnew file+19

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/solarized-dark.xmlnew file+39

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/solarized-dark256.xmlnew file+41

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/solarized-light.xmlnew file+17

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/swapoff.xmlnew file+18

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/tango.xmlnew file+72

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/tokyonight-day.xmlnew file+83

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/tokyonight-moon.xmlnew file+83

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/tokyonight-night.xmlnew file+83

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/tokyonight-storm.xmlnew file+83

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/trac.xmlnew file+35

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/vim.xmlnew file+29

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/vs.xmlnew file+16

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/vulcan.xmlnew file+74

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/witchhazel.xmlnew file+31

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/xcode-dark.xmlnew file+31

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/styles/xcode.xmlnew file+22

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/table.pynew file+31

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/test.jsonlnew file+2

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/tokentype_enumer.gonew file+588

This diff is too big to show here.

vendor/github.com/alecthomas/chroma/v2/types.gonew file+357

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/.gitignorenew file+2

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/LICENSEnew file+19

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/README.mdnew file+19

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/backward_references.gonew file+185

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/backward_references_hq.gonew file+796

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/bit_cost.gonew file+436

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/bit_reader.gonew file+266

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/bitwriter.gonew file+56

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/block_splitter.gonew file+144

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/block_splitter_command.gonew file+434

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/block_splitter_distance.gonew file+433

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/block_splitter_literal.gonew file+433

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/brotli_bit_stream.gonew file+1435

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/cluster.gonew file+30

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/cluster_command.gonew file+164

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/cluster_distance.gonew file+326

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/cluster_literal.gonew file+326

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/command.gonew file+254

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/compress_fragment.gonew file+834

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/compress_fragment_two_pass.gonew file+775

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/constants.gonew file+77

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/context.gonew file+2176

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/decode.gonew file+2581

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/dictionary.gonew file+122890

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/dictionary_hash.gonew file+32779

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/encode.gonew file+1220

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/encoder.gonew file+177

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/encoder_dict.gonew file+22

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/encoder_fast.gonew file+197

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/entropy_encode.gonew file+592

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/entropy_encode_static.gonew file+4399

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/fast_log.gonew file+290

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/find_match_length.gonew file+45

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/flate/LICENSEnew file+27

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/flate/README.mdnew file+2

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/flate/gzip.gonew file+65

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/flate/huffman_bit_writer.gonew file+517

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/flate/huffman_code.gonew file+346

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/flate/token.gonew file+80

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/flate/writer.gonew file+66

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/h10.gonew file+287

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/h5.gonew file+214

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/h6.gonew file+216

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/hash.gonew file+342

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/hash_composite.gonew file+93

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/hash_forgetful_chain.gonew file+252

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/hash_longest_match_quickly.gonew file+214

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/hash_rolling.gonew file+168

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/histogram.gonew file+226

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/http.gonew file+189

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/huffman.gonew file+653

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/literal_cost.gonew file+182

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/matchfinder/bargain1.gonew file+212

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/matchfinder/bargain2.gonew file+248

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/matchfinder/bargain3.gonew file+278

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/matchfinder/emitter.gonew file+34

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/matchfinder/m0.gonew file+175

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/matchfinder/m4.gonew file+339

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/matchfinder/matchfinder.gonew file+103

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/matchfinder/pathfinder.gonew file+328

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/matchfinder/textencoder.gonew file+53

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/matchfinder/trio.gonew file+326

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/matchfinder/zdfast.gonew file+258

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/matchfinder/zfast.gonew file+206

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/matchfinder/zm.gonew file+301

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/memory.gonew file+66

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/metablock.gonew file+574

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/metablock_command.gonew file+165

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/metablock_distance.gonew file+165

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/metablock_literal.gonew file+165

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/params.gonew file+37

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/platform.gonew file+103

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/prefix.gonew file+30

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/prefix_dec.gonew file+723

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/quality.gonew file+196

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/reader.gonew file+111

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/ringbuffer.gonew file+134

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/state.gonew file+294

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/static_dict.gonew file+662

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/static_dict_lut.go+75094

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/symbol_list.go+22

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/transform.go+641

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/utf8_util.go+70

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/util.go+7

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/write_bits.go+52

This diff is too big to show here.

vendor/github.com/andybalholm/brotli/writer.go+162

This diff is too big to show here.

vendor/github.com/andybalholm/cascadia/.travis.yml+14

This diff is too big to show here.

vendor/github.com/andybalholm/cascadia/LICENSE+24

This diff is too big to show here.

vendor/github.com/andybalholm/cascadia/README.md+144

This diff is too big to show here.

vendor/github.com/andybalholm/cascadia/parser.go+889

This diff is too big to show here.

vendor/github.com/andybalholm/cascadia/pseudo_classes.go+458

This diff is too big to show here.

vendor/github.com/andybalholm/cascadia/selector.go+586

This diff is too big to show here.

vendor/github.com/andybalholm/cascadia/serialize.go+176

This diff is too big to show here.

vendor/github.com/andybalholm/cascadia/specificity.go+26

This diff is too big to show here.

vendor/github.com/atotto/clipboard/.travis.yml+22

This diff is too big to show here.

vendor/github.com/atotto/clipboard/LICENSE+27

This diff is too big to show here.

vendor/github.com/atotto/clipboard/README.md+48

This diff is too big to show here.

vendor/github.com/atotto/clipboard/clipboard.go+20

This diff is too big to show here.

vendor/github.com/atotto/clipboard/clipboard_darwin.go+52

This diff is too big to show here.

vendor/github.com/atotto/clipboard/clipboard_plan9.go+42

This diff is too big to show here.

vendor/github.com/atotto/clipboard/clipboard_unix.go+149

This diff is too big to show here.

vendor/github.com/atotto/clipboard/clipboard_windows.go+157

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/LICENSE.txt+202

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/NOTICE.txt+3

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/accountid_endpoint_mode.go+18

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/checksum.go+33

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/config.go+254

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/context.go+22

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/credential_cache.go+235

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/credentials.go+234

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/auto.go+38

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/configuration.go+43

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/defaults.go+50

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/doc.go+2

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/defaultsmode.go+95

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/doc.go+62

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/endpoints.go+247

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/errors.go+9

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/from_ptr.go+365

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go+6

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/logging.go+119

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/logging_generate.go+95

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/metadata.go+213

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/middleware.go+168

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/osname.go+24

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/osname_go115.go+24

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/recursion_detection.go+94

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/request_id.go+27

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/request_id_retriever.go+57

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/user_agent.go+398

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/CHANGELOG.md+203

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/LICENSE.txt+202

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/debug.go+144

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/decode.go+218

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/encode.go+167

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/error.go+23

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi/headers.go+24

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi/middleware.go+71

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi/transport.go+13

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi/transport_go117.go+12

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/go_module_metadata.go+6

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/header.go+175

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/header_value.go+521

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/message.go+99

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/array.go+61

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/encoder.go+80

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/map.go+78

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/middleware.go+62

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/object.go+68

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/value.go+117

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/restjson/decoder_util.go+85

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/xml/error_utils.go+48

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/ratelimit/none.go+20

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/ratelimit/token_bucket.go+96

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/ratelimit/token_rate_limit.go+83

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/request.go+25

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/restrict_file_permissions.go+21

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/retry/adaptive.go+156

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/retry/adaptive_ratelimit.go+158

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/retry/adaptive_token_bucket.go+83

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/retry/attempt_metrics.go+51

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/retry/doc.go+80

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/retry/errors.go+20

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/retry/jitter_backoff.go+124

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/retry/metadata.go+52

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/retry/middleware.go+487

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/retry/retry.go+103

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/retry/retryable_error.go+228

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/retry/standard.go+343

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/retry/throttle_error.go+60

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/retry/timeout_error.go+52

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/retryer.go+127

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/runtime.go+14

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/cache.go+115

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/const.go+40

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/header_rules.go+82

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/headers.go+70

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/hmac.go+13

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/host.go+75

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/scope.go+13

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/time.go+36

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/util.go+80

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/middleware.go+420

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/presign_middleware.go+127

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/stream.go+86

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/v4.go+564

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/to_ptr.go+297

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/client.go+355

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/content_type.go+42

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/response_error.go+33

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/response_error_middleware.go+56

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/timeout_read_closer.go+109

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/types.go+42

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/aws/version.go+8

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md+1097

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/LICENSE.txt+202

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/auth_scheme_preference.go+19

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/config.go+237

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/defaultsmode.go+47

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/doc.go+20

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/env_config.go+966

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/generate.go+4

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go+6

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/errors.go+22

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/ini.go+56

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/parse.go+109

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/sections.go+157

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/strings.go+89

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/token.go+32

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/tokenize.go+92

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/value.go+93

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/load_options.go+1371

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/local.go+51

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/provider.go+802

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/resolve.go+458

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/resolve_bearer_token.go+122

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/resolve_credentials.go+650

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/config/shared_config.go+1704

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md+990

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/LICENSE.txt+202

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/doc.go+4

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds/doc.go+58

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds/provider.go+241

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client/auth.go+48

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client/client.go+165

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client/endpoints.go+20

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client/middleware.go+164

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/provider.go+207

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go+6

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/dpop.go+150

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/file.go+14

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/provider.go+184

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/token.go+110

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/processcreds/doc.go+92

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/processcreds/provider.go+296

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/doc.go+81

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/sso_cached_token.go+232

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/sso_credentials_provider.go+165

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/sso_token_provider.go+147

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/static_provider.go+63

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/stscreds/assume_role_provider.go+338

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/credentials/stscreds/web_identity_provider.go+181

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md+584

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/LICENSE.txt+202

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_client.go+358

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetDynamicData.go+77

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetIAMInfo.go+103

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetInstanceIdentityDocument.go+110

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetMetadata.go+77

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetRegion.go+73

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetToken.go+119

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetUserData.go+61

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/auth.go+48

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/doc.go+12

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/endpoints.go+20

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go+6

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/internal/config/resolvers.go+114

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/request_middleware.go+313

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/token_provider.go+261

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/auth/auth.go+45

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/auth/scheme.go+191

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/bearer_token_adapter.go+43

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/bearer_token_signer_adapter.go+35

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/credentials_adapter.go+46

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/smithy.go+2

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/v4signer_adapter.go+57

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/v4signer_adapter_eventstream.go+51

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md+544

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/LICENSE.txt+202

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/config.go+65

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/endpoints.go+57

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go+6

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/context/context.go+65

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/arn.go+94

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/doc.go+3

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/generate.go+7

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/host.go+51

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partition.go+76

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partitions.go+496

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partitions.json+267

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/endpoints.go+201

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md+519

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/LICENSE.txt+202

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/endpoints.go+302

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go+6

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/rand/rand.go+33

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/sdk/interfaces.go+9

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/sdk/time.go+74

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/sdkio/byte.go+12

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/shareddefaults/shared_config.go+47

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/strings/strings.go+11

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/sync/singleflight/LICENSE+28

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/sync/singleflight/docs.go+7

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/sync/singleflight/singleflight.go+210

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/timeconv/duration.go+13

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md+486

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/LICENSE.txt+202

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/credentials.go+141

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/error.go+17

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go+6

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto/compare.go+30

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto/ecc.go+113

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/const.go+36

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/header_rules.go+82

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/headers.go+68

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/hmac.go+13

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/host.go+75

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/time.go+36

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/util.go+64

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/middleware.go+118

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/presign_middleware.go+117

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/smithy.go+92

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/v4a.go+520

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md+220

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/LICENSE.txt+202

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/accept_encoding_gzip.go+176

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/doc.go+22

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go+6

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md+571

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/LICENSE.txt+202

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/context.go+56

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/doc.go+3

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go+6

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/middleware.go+110

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md+85

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/LICENSE.txt+202

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_client.go+945

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_CreateOAuth2Token.go+212

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_DeleteConsoleAuthorizationConfiguration.go+168

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_DeleteResourcePermissionStatement.go+196

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_GetConsoleAuthorizationConfiguration.go+168

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_GetResourcePolicy.go+155

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_ListResourcePermissionStatements.go+261

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_PutConsoleAuthorizationConfiguration.go+168

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_PutResourcePermissionStatement.go+216

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/auth.go+361

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/deserializers.go+2474

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/doc.go+9

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/endpoints.go+854

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/generated.json+40

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go+6

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/internal/endpoints/endpoints.go+333

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/options.go+242

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/serializers.go+724

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/enums.go+46

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/errors.go+247

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/types.go+162

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/signin/validators.go+111

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md+792

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/LICENSE.txt+202

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_client.go+929

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_GetRoleCredentials.go+165

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccountRoles.go+263

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccounts.go+261

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_Logout.go+164

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/auth.go+379

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/deserializers.go+1171

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/doc.go+27

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/endpoints.go+570

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/generated.json+35

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go+6

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go+628

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/options.go+238

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/serializers.go+309

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/types/errors.go+115

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/types/types.go+63

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sso/validators.go+175

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md+790

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/LICENSE.txt+202

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_client.go+929

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateToken.go+235

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateTokenWithIAM.go+282

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_RegisterClient.go+206

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_StartDeviceAuthorization.go+188

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/auth.go+373

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/deserializers.go+2244

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/doc.go+49

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/endpoints.go+570

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/generated.json+36

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go+6

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go+628

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/options.go+238

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/serializers.go+512

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/types/enums.go+44

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/types/errors.go+430

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/types/types.go+25

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/validators.go+184

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md+832

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/LICENSE.txt+202

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go+1115

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRole.go+544

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithSAML.go+455

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithWebIdentity.go+472

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoot.go+229

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_DecodeAuthorizationMessage.go+189

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetAccessKeyInfo.go+180

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetCallerIdentity.go+192

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetDelegatedAccessToken.go+169

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetFederationToken.go+393

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetSessionToken.go+239

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetWebIdentityToken.go+192

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/auth.go+377

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/deserializers.go+3456

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/doc.go+13

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/endpoints.go+683

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/generated.json+45

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go+6

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go+585

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/options.go+286

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/serializers.go+1198

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/errors.go+363

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/types.go+144

This diff is too big to show here.

vendor/github.com/aws/aws-sdk-go-v2/service/sts/validators.go+433

This diff is too big to show here.

vendor/github.com/aws/smithy-go/.gitignore+29

This diff is too big to show here.

vendor/github.com/aws/smithy-go/.travis.yml+28

This diff is too big to show here.

vendor/github.com/aws/smithy-go/AGENTS.md+172

This diff is too big to show here.

vendor/github.com/aws/smithy-go/CHANGELOG.md+454

This diff is too big to show here.

vendor/github.com/aws/smithy-go/CODE_OF_CONDUCT.md+4

This diff is too big to show here.

vendor/github.com/aws/smithy-go/CONTRIBUTING.md+90

This diff is too big to show here.

vendor/github.com/aws/smithy-go/LICENSE+175

This diff is too big to show here.

vendor/github.com/aws/smithy-go/Makefile+130

This diff is too big to show here.

vendor/github.com/aws/smithy-go/NOTICE+1

This diff is too big to show here.

vendor/github.com/aws/smithy-go/README.md+107

This diff is too big to show here.

vendor/github.com/aws/smithy-go/auth/auth.go+3

This diff is too big to show here.

vendor/github.com/aws/smithy-go/auth/bearer/docs.go+3

This diff is too big to show here.

vendor/github.com/aws/smithy-go/auth/bearer/middleware.go+104

This diff is too big to show here.

vendor/github.com/aws/smithy-go/auth/bearer/token.go+50

This diff is too big to show here.

vendor/github.com/aws/smithy-go/auth/bearer/token_cache.go+208

This diff is too big to show here.

vendor/github.com/aws/smithy-go/auth/identity.go+47

This diff is too big to show here.

vendor/github.com/aws/smithy-go/auth/option.go+25

This diff is too big to show here.

vendor/github.com/aws/smithy-go/auth/scheme_id.go+20

This diff is too big to show here.

vendor/github.com/aws/smithy-go/changelog-template.json+9

This diff is too big to show here.

vendor/github.com/aws/smithy-go/context/suppress_expired.go+81

This diff is too big to show here.

vendor/github.com/aws/smithy-go/doc.go+2

This diff is too big to show here.

vendor/github.com/aws/smithy-go/document.go+10

This diff is too big to show here.

vendor/github.com/aws/smithy-go/document/doc.go+12

This diff is too big to show here.

vendor/github.com/aws/smithy-go/document/document.go+239

This diff is too big to show here.

vendor/github.com/aws/smithy-go/document/errors.go+75

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/doc.go+4

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/encoding.go+40

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/httpbinding/encode.go+123

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/httpbinding/header.go+122

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/httpbinding/path_replace.go+108

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/httpbinding/query.go+107

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/httpbinding/uri.go+111

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/json/array.go+35

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/json/constants.go+15

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/json/decoder_util.go+139

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/json/encoder.go+30

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/json/escape.go+198

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/json/object.go+40

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/json/value.go+154

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/xml/array.go+49

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/xml/constants.go+10

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/xml/doc.go+49

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/xml/element.go+91

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/xml/encoder.go+51

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/xml/error_utils.go+51

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/xml/escape.go+137

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/xml/map.go+53

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/xml/value.go+302

This diff is too big to show here.

vendor/github.com/aws/smithy-go/encoding/xml/xml_decoder.go+154

This diff is too big to show here.

vendor/github.com/aws/smithy-go/endpoints/endpoint.go+23

This diff is too big to show here.

vendor/github.com/aws/smithy-go/endpoints/private/bdd/evaluate.go+35

This diff is too big to show here.

vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/doc.go+4

This diff is too big to show here.

vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/split.go+16

This diff is too big to show here.

vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/string_slice.go+18

This diff is too big to show here.

vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/strings.go+25

This diff is too big to show here.

vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/uri.go+133

This diff is too big to show here.

vendor/github.com/aws/smithy-go/errors.go+137

This diff is too big to show here.

vendor/github.com/aws/smithy-go/eventstream/const.go+24

This diff is too big to show here.

vendor/github.com/aws/smithy-go/eventstream/debug.go+144

This diff is too big to show here.

vendor/github.com/aws/smithy-go/eventstream/decode.go+218

This diff is too big to show here.

vendor/github.com/aws/smithy-go/eventstream/deserializer.go+294

This diff is too big to show here.

vendor/github.com/aws/smithy-go/eventstream/encode.go+167

This diff is too big to show here.

vendor/github.com/aws/smithy-go/eventstream/error.go+23

This diff is too big to show here.

vendor/github.com/aws/smithy-go/eventstream/header.go+175

This diff is too big to show here.

vendor/github.com/aws/smithy-go/eventstream/header_value.go+521

This diff is too big to show here.

vendor/github.com/aws/smithy-go/eventstream/message.go+99

This diff is too big to show here.

vendor/github.com/aws/smithy-go/eventstream/serializer.go+228

This diff is too big to show here.

vendor/github.com/aws/smithy-go/eventstream/signer.go+82

This diff is too big to show here.

vendor/github.com/aws/smithy-go/eventstream/types.go+26

This diff is too big to show here.

vendor/github.com/aws/smithy-go/go_module_metadata.go+6

This diff is too big to show here.

vendor/github.com/aws/smithy-go/internal/sync/singleflight/LICENSE+28

This diff is too big to show here.

vendor/github.com/aws/smithy-go/internal/sync/singleflight/docs.go+8

This diff is too big to show here.

vendor/github.com/aws/smithy-go/internal/sync/singleflight/singleflight.go+210

This diff is too big to show here.

vendor/github.com/aws/smithy-go/io/byte.go+12

This diff is too big to show here.

vendor/github.com/aws/smithy-go/io/doc.go+2

This diff is too big to show here.

vendor/github.com/aws/smithy-go/io/reader.go+16

This diff is too big to show here.

vendor/github.com/aws/smithy-go/io/ringbuffer.go+94

This diff is too big to show here.

vendor/github.com/aws/smithy-go/local-mod-replace.sh+39

This diff is too big to show here.

vendor/github.com/aws/smithy-go/logging/logger.go+82

This diff is too big to show here.

vendor/github.com/aws/smithy-go/metrics/metrics.go+136

This diff is too big to show here.

vendor/github.com/aws/smithy-go/metrics/nop.go+98

This diff is too big to show here.

vendor/github.com/aws/smithy-go/middleware/context.go+41

This diff is too big to show here.

vendor/github.com/aws/smithy-go/middleware/doc.go+67

This diff is too big to show here.

vendor/github.com/aws/smithy-go/middleware/eventstream_middleware.go+21

This diff is too big to show here.

vendor/github.com/aws/smithy-go/middleware/logging.go+46

This diff is too big to show here.

vendor/github.com/aws/smithy-go/middleware/metadata.go+65

This diff is too big to show here.

vendor/github.com/aws/smithy-go/middleware/middleware.go+71

This diff is too big to show here.

vendor/github.com/aws/smithy-go/middleware/ordered_group.go+270

This diff is too big to show here.

vendor/github.com/aws/smithy-go/middleware/stack.go+209

This diff is too big to show here.

vendor/github.com/aws/smithy-go/middleware/stack_values.go+100

This diff is too big to show here.

vendor/github.com/aws/smithy-go/middleware/step_build.go+298

This diff is too big to show here.

vendor/github.com/aws/smithy-go/middleware/step_deserialize.go+300

This diff is too big to show here.

vendor/github.com/aws/smithy-go/middleware/step_finalize.go+298

This diff is too big to show here.

vendor/github.com/aws/smithy-go/middleware/step_initialize.go+299

This diff is too big to show here.

vendor/github.com/aws/smithy-go/middleware/step_serialize.go+305

This diff is too big to show here.

vendor/github.com/aws/smithy-go/modman.toml+9

This diff is too big to show here.

vendor/github.com/aws/smithy-go/private/requestcompression/gzip.go+30

This diff is too big to show here.

vendor/github.com/aws/smithy-go/private/requestcompression/middleware_capture_request_compression.go+52

This diff is too big to show here.

vendor/github.com/aws/smithy-go/private/requestcompression/request_compression.go+103

This diff is too big to show here.

vendor/github.com/aws/smithy-go/properties.go+69

This diff is too big to show here.

vendor/github.com/aws/smithy-go/ptr/doc.go+5

This diff is too big to show here.

vendor/github.com/aws/smithy-go/ptr/from_ptr.go+601

This diff is too big to show here.

vendor/github.com/aws/smithy-go/ptr/gen_scalars.go+83

This diff is too big to show here.

vendor/github.com/aws/smithy-go/ptr/to_ptr.go+499

This diff is too big to show here.

vendor/github.com/aws/smithy-go/rand/doc.go+3

This diff is too big to show here.

vendor/github.com/aws/smithy-go/rand/rand.go+31

This diff is too big to show here.

vendor/github.com/aws/smithy-go/rand/uuid.go+87

This diff is too big to show here.

vendor/github.com/aws/smithy-go/schema.go+328

This diff is too big to show here.

vendor/github.com/aws/smithy-go/schema_ext.go+37

This diff is too big to show here.

vendor/github.com/aws/smithy-go/serde.go+229

This diff is too big to show here.

vendor/github.com/aws/smithy-go/sync/error.go+53

This diff is too big to show here.

vendor/github.com/aws/smithy-go/time/time.go+134

This diff is too big to show here.

vendor/github.com/aws/smithy-go/tracing/context.go+96

This diff is too big to show here.

vendor/github.com/aws/smithy-go/tracing/nop.go+32

This diff is too big to show here.

vendor/github.com/aws/smithy-go/tracing/tracing.go+95

This diff is too big to show here.

vendor/github.com/aws/smithy-go/trait.go+21

This diff is too big to show here.

vendor/github.com/aws/smithy-go/traits/http.go+69

This diff is too big to show here.

vendor/github.com/aws/smithy-go/traits/index.go+107

This diff is too big to show here.

vendor/github.com/aws/smithy-go/traits/serde.go+56

This diff is too big to show here.

vendor/github.com/aws/smithy-go/traits/traits.go+72

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/auth.go+30

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/auth_schemes.go+45

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/checksum_middleware.go+70

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/client.go+161

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/doc.go+5

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/eventstream.go+209

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/eventstream_middleware.go+69

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/headerlist.go+163

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/host.go+89

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/interceptor.go+321

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/interceptor_middleware.go+325

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/internal/io/safe.go+75

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/md5_checksum.go+25

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/metrics.go+204

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/middleware_close_response_body.go+79

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/middleware_content_length.go+84

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/middleware_header_comment.go+81

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/middleware_headers.go+167

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/middleware_http_logging.go+75

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/middleware_metadata.go+51

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/middleware_min_proto.go+79

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/properties.go+80

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/protocol.go+27

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/request.go+188

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/response.go+34

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/time.go+13

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/url.go+44

This diff is too big to show here.

vendor/github.com/aws/smithy-go/transport/http/user_agent.go+37

This diff is too big to show here.

vendor/github.com/aws/smithy-go/type_registry.go+70

This diff is too big to show here.

vendor/github.com/aws/smithy-go/validation.go+140

This diff is too big to show here.

vendor/github.com/aymanbagabas/go-udiff/LICENSE-BSD+27

This diff is too big to show here.

vendor/github.com/aymanbagabas/go-udiff/LICENSE-MIT+21

This diff is too big to show here.

vendor/github.com/aymanbagabas/go-udiff/Makefile+4

This diff is too big to show here.

vendor/github.com/aymanbagabas/go-udiff/README.md+142

This diff is too big to show here.

vendor/github.com/aymanbagabas/go-udiff/diff.go+177

This diff is too big to show here.

vendor/github.com/aymanbagabas/go-udiff/export.go+16

This diff is too big to show here.

vendor/github.com/aymanbagabas/go-udiff/lcs/common.go+179

This diff is too big to show here.

vendor/github.com/aymanbagabas/go-udiff/lcs/doc.go+156

This diff is too big to show here.

vendor/github.com/aymanbagabas/go-udiff/lcs/export.go+11

This diff is too big to show here.

vendor/github.com/aymanbagabas/go-udiff/lcs/git.sh+33

This diff is too big to show here.

vendor/github.com/aymanbagabas/go-udiff/lcs/labels.go+55

This diff is too big to show here.

vendor/github.com/aymanbagabas/go-udiff/lcs/old.go+475

This diff is too big to show here.

vendor/github.com/aymanbagabas/go-udiff/lcs/sequence.go+70

This diff is too big to show here.

vendor/github.com/aymanbagabas/go-udiff/merge.go+81

This diff is too big to show here.

vendor/github.com/aymanbagabas/go-udiff/ndiff.go+118

This diff is too big to show here.

vendor/github.com/aymanbagabas/go-udiff/unified.go+314

This diff is too big to show here.

vendor/github.com/aymerick/douceur/LICENSE+22

This diff is too big to show here.

vendor/github.com/aymerick/douceur/css/declaration.go+60

This diff is too big to show here.

vendor/github.com/aymerick/douceur/css/rule.go+230

This diff is too big to show here.

vendor/github.com/aymerick/douceur/css/stylesheet.go+25

This diff is too big to show here.

vendor/github.com/aymerick/douceur/parser/parser.go+409

This diff is too big to show here.

vendor/github.com/bahlo/generic-list-go/LICENSE+27

This diff is too big to show here.

vendor/github.com/bahlo/generic-list-go/README.md+5

This diff is too big to show here.

vendor/github.com/bahlo/generic-list-go/list.go+235

This diff is too big to show here.

vendor/github.com/bmatcuk/doublestar/v4/.codecov.yml+10

This diff is too big to show here.

vendor/github.com/bmatcuk/doublestar/v4/.gitignore+32

This diff is too big to show here.

vendor/github.com/bmatcuk/doublestar/v4/LICENSE+22

This diff is too big to show here.

vendor/github.com/bmatcuk/doublestar/v4/README.md+495

This diff is too big to show here.

vendor/github.com/bmatcuk/doublestar/v4/UPGRADING.md+63

This diff is too big to show here.

vendor/github.com/bmatcuk/doublestar/v4/doublestar.go+13

This diff is too big to show here.

vendor/github.com/bmatcuk/doublestar/v4/glob.go+497

This diff is too big to show here.

vendor/github.com/bmatcuk/doublestar/v4/globoptions.go+188

This diff is too big to show here.

vendor/github.com/bmatcuk/doublestar/v4/globwalk.go+438

This diff is too big to show here.

vendor/github.com/bmatcuk/doublestar/v4/match.go+419

This diff is too big to show here.

vendor/github.com/bmatcuk/doublestar/v4/utils.go+165

This diff is too big to show here.

vendor/github.com/bmatcuk/doublestar/v4/utils_unix.go+19

This diff is too big to show here.

vendor/github.com/bmatcuk/doublestar/v4/utils_windows.go+43

This diff is too big to show here.

vendor/github.com/bmatcuk/doublestar/v4/validate.go+80

This diff is too big to show here.

vendor/github.com/buger/jsonparser/.gitignore+12

This diff is too big to show here.

vendor/github.com/buger/jsonparser/.travis.yml+12

This diff is too big to show here.

vendor/github.com/buger/jsonparser/Dockerfile+12

This diff is too big to show here.

vendor/github.com/buger/jsonparser/LICENSE+21

This diff is too big to show here.

vendor/github.com/buger/jsonparser/Makefile+36

This diff is too big to show here.

vendor/github.com/buger/jsonparser/README.md+361

This diff is too big to show here.

vendor/github.com/buger/jsonparser/bytes.go+47

This diff is too big to show here.

vendor/github.com/buger/jsonparser/bytes_safe.go+25

This diff is too big to show here.

vendor/github.com/buger/jsonparser/bytes_unsafe.go+44

This diff is too big to show here.

vendor/github.com/buger/jsonparser/escape.go+173

This diff is too big to show here.

vendor/github.com/buger/jsonparser/fuzz.go+117

This diff is too big to show here.

vendor/github.com/buger/jsonparser/oss-fuzz-build.sh+47

This diff is too big to show here.

vendor/github.com/buger/jsonparser/parser.go+1318

This diff is too big to show here.

vendor/github.com/cespare/xxhash/v2/LICENSE.txt+22

This diff is too big to show here.

vendor/github.com/cespare/xxhash/v2/README.md+74

This diff is too big to show here.

vendor/github.com/cespare/xxhash/v2/testall.sh+10

This diff is too big to show here.

vendor/github.com/cespare/xxhash/v2/xxhash.go+243

This diff is too big to show here.

vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s+209

This diff is too big to show here.

vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s+183

This diff is too big to show here.

vendor/github.com/cespare/xxhash/v2/xxhash_asm.go+15

This diff is too big to show here.

vendor/github.com/cespare/xxhash/v2/xxhash_other.go+76

This diff is too big to show here.

vendor/github.com/cespare/xxhash/v2/xxhash_safe.go+16

This diff is too big to show here.

vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go+58

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/.gitignore+2

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/LICENSE+21

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/Makefile+101

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/README.md+193

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/adapters.go+102

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/dirent.go+73

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/dirent_portable.go+134

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/dirent_unix.go+146

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/entry_filter_portable.go+37

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/entry_filter_unix.go+59

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/entry_filter_windows.go+156

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/fastwalk.go+697

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/fastwalk_darwin.go+122

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/fastwalk_portable.go+65

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/fastwalk_unix.go+131

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/go.LICENSE+27

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent.go+85

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent_aix.go+29

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent_dragonfly.go+54

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent_freebsd.go+46

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent_js.go+27

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent_linux.go+50

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent_netbsd.go+46

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent_openbsd.go+46

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/internal/dirent/dirent_solaris.go+29

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/internal/dirent/doc.go+2

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/internal/fmtdirent/fmtdirent_go120.go+31

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/internal/fmtdirent/fmtdirent_go121.go+15

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/zsyscall_darwin.go+93

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/zsyscall_darwin_amd64.1_13.s+22

This diff is too big to show here.

vendor/github.com/charlievieth/fastwalk/zsyscall_darwin_arm64.1_13.s+22

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/.gitignore+4

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/.release-please-manifest.json+3

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/.stats.yml+4

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/Brewfile+1

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/CHANGELOG.md+641

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/CONTRIBUTING.md+65

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/LICENSE+8

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/README.md+999

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/SECURITY.md+27

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/aliases.go+72

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/api.md+545

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/bedrock/bedrock.go+295

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/beta.go+374

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/betafile.go+273

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/betamessage.go+11734

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/betamessagebatch.go+925

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/betamessageutil.go+459

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/betamodel.go+151

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/betaskill.go+362

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/betaskillversion.go+373

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/betatoolrunner.go+435

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/client.go+157

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/completion.go+196

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/field.go+46

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apierror/apierror.go+58

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apiform/encoder.go+473

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apiform/form.go+5

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apiform/richparam.go+21

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apiform/tag.go+51

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/decoder.go+709

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/encoder.go+392

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/enum.go+145

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/field.go+23

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/port.go+120

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/registry.go+59

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/subfield.go+68

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/tag.go+47

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apijson/union.go+209

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apiquery/encoder.go+414

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apiquery/query.go+55

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apiquery/richparam.go+20

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/apiquery/tag.go+44

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/decode.go+1325

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/encode.go+1396

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/fold.go+48

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/indent.go+182

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/scanner.go+610

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/sentinel/null.go+47

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/shims/shims.go+113

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/stream.go+512

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/tables.go+218

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/tags.go+38

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/encoding/json/time.go+62

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/paramutil/field.go+30

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/paramutil/union.go+49

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/requestconfig/requestconfig.go+638

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/internal/version.go+5

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/message.go+9436

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/messagebatch.go+827

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/messageutil.go+413

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/model.go+151

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/option/middleware.go+38

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/option/requestoption.go+285

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/packages/jsonl/jsonl.go+62

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/packages/pagination/pagination.go+351

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/packages/param/encoder.go+109

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/packages/param/null.go+19

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/packages/param/option.go+122

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/packages/param/param.go+189

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/packages/respjson/respjson.go+88

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/packages/ssestream/ssestream.go+198

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/release-please-config.json+68

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/schemautil.go+244

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/shared/constant/constants.go+487

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/shared/shared.go+346

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/tools.md+292

This diff is too big to show here.

vendor/github.com/charmbracelet/anthropic-sdk-go/vertex/vertex.go+134

This diff is too big to show here.

vendor/github.com/charmbracelet/colorprofile/.golangci.yml+47

This diff is too big to show here.

vendor/github.com/charmbracelet/colorprofile/.goreleaser.yml+6

This diff is too big to show here.

vendor/github.com/charmbracelet/colorprofile/LICENSE+21

This diff is too big to show here.

vendor/github.com/charmbracelet/colorprofile/README.md+109

This diff is too big to show here.

vendor/github.com/charmbracelet/colorprofile/doc.go+4

This diff is too big to show here.

vendor/github.com/charmbracelet/colorprofile/env.go+294

This diff is too big to show here.

vendor/github.com/charmbracelet/colorprofile/env_other.go+8

This diff is too big to show here.

vendor/github.com/charmbracelet/colorprofile/env_windows.go+40

This diff is too big to show here.

vendor/github.com/charmbracelet/colorprofile/profile.go+108

This diff is too big to show here.

vendor/github.com/charmbracelet/colorprofile/writer.go+171

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/.gitignore+4

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/.release-please-manifest.json+3

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/.stats.yml+4

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/Brewfile+1

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/CHANGELOG.md+1171

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/CONTRIBUTING.md+65

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/LICENSE+201

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/MIGRATION.md+284

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/README.md+1007

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/SECURITY.md+29

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/aliases.go+585

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/api.md+774

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/audio.go+61

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/audiospeech.go+179

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/audiotranscription.go+950

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/audiotranslation.go+120

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/azure/azure.go+269

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/batch.go+464

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/beta.go+36

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/betaassistant.go+2284

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/betachatkit.go+125

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/betachatkitsession.go+83

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/betachatkitthread.go+1564

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/betathread.go+1574

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/betathreadmessage.go+1717

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/betathreadrun.go+974

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/betathreadrunstep.go+1396

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/chat.go+30

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/chatcompletion.go+3521

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/chatcompletionmessage.go+100

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/client.go+185

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/completion.go+436

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/container.go+648

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/containerfile.go+287

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/containerfilecontent.go+50

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/conversations/aliases.go+585

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/conversations/api.md+31

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/conversations/conversation.go+493

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/conversations/item.go+1082

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/embedding.go+207

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/field.go+45

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/file.go+352

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/finetuning.go+35

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/finetuningalpha.go+29

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/finetuningalphagrader.go+675

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/finetuningcheckpoint.go+29

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/finetuningcheckpointpermission.go+352

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/finetuningjob.go+884

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/finetuningjobcheckpoint.go+152

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/finetuningmethod.go+1487

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/grader.go+28

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/gradergradermodel.go+1753

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/image.go+1337

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apierror/apierror.go+58

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apiform/encoder.go+473

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apiform/form.go+5

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apiform/richparam.go+20

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apiform/tag.go+72

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apijson/decoder.go+688

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apijson/encoder.go+371

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apijson/enum.go+140

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apijson/field.go+23

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apijson/port.go+120

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apijson/registry.go+51

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apijson/subfield.go+67

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apijson/tag.go+69

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apijson/union.go+208

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apiquery/encoder.go+394

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apiquery/query.go+55

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apiquery/richparam.go+20

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/apiquery/tag.go+44

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/encoding/json/decode.go+1324

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/encoding/json/encode.go+1396

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/encoding/json/fold.go+48

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/encoding/json/indent.go+182

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/encoding/json/scanner.go+610

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/encoding/json/sentinel/null.go+46

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/encoding/json/shims/shims.go+113

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/encoding/json/stream.go+512

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/encoding/json/tables.go+218

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/encoding/json/tags.go+38

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/encoding/json/time.go+61

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/paramutil/field.go+30

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/paramutil/union.go+48

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/requestconfig/requestconfig.go+644

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/internal/version.go+5

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/model.go+137

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/moderation.go+489

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/option/middleware.go+38

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/option/requestoption.go+299

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/packages/pagination/pagination.go+329

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/packages/param/encoder.go+109

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/packages/param/null.go+19

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/packages/param/option.go+122

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/packages/param/param.go+186

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/packages/respjson/respjson.go+88

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/packages/ssestream/ssestream.go+247

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/polling.go+129

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/realtime/aliases.go+585

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/realtime/api.md+55

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/realtime/call.go+133

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/realtime/clientsecret.go+1826

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/realtime/realtime.go+1979

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/release-please-config.json+68

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/responses/aliases.go+585

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/responses/api.md+240

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/responses/inputitem.go+135

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/responses/inputtoken.go+336

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/responses/response.go+21786

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/shared/constant/constants.go+1143

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/shared/shared.go+1183

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/skill.go+292

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/skillcontent.go+46

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/skillversion.go+283

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/skillversioncontent.go+50

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/streamaccumulator.go+215

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/upload.go+238

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/uploadpart.go+115

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/vectorstore.go+911

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/vectorstorefile.go+535

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/vectorstorefilebatch.go+427

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/video.go+677

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/webhooks/aliases.go+585

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/webhooks/api.md+20

This diff is too big to show here.

vendor/github.com/charmbracelet/openai-go/webhooks/webhook.go+1306

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/.gitattributes+1

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/.golangci.yml+48

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/.goreleaser.yml+5

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/LICENSE+21

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/README.md+161

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/TUTORIAL.md+175

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/border.go+231

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/buffer.go+831

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/cancelreader_other.go+16

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/cancelreader_windows.go+139

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/cell.go+465

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/console.go+219

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/console_unix.go+13

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/console_windows.go+13

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/cursor.go+22

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/decoder.go+2102

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/doc.go+46

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/environ.go+32

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/event.go+567

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/internal/casso/math.go+172

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/internal/casso/solver.go+275

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/internal/lru/lru.go+69

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/key.go+762

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/key_table.go+664

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/layout/cache.go+29

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/layout/constraint.go+174

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/layout/flex.go+210

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/layout/layout.go+973

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/layout/padding.go+66

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/logger.go+6

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/mouse.go+150

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/poll.go+38

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/poll_bsd.go+165

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/poll_default.go+12

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/poll_fallback.go+158

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/poll_linux.go+175

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/poll_select.go+156

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/poll_solaris.go+12

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/poll_windows.go+217

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/screen/context.go+379

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/screen/screen.go+117

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/styled.go+337

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/tabstop.go+142

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/terminal.go+394

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/terminal_bsdly.go+10

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/terminal_bsdly_other.go+8

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/terminal_other.go+22

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/terminal_reader.go+503

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/terminal_reader_other.go+13

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/terminal_reader_windows.go+336

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/terminal_renderer.go+1639

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/terminal_renderer_hardscroll.go+243

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/terminal_renderer_hashmap.go+298

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/terminal_screen.go+837

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/terminal_tabdly.go+10

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/terminal_tabdly_other.go+8

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/terminal_unix.go+56

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/terminal_windows.go+77

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/tty.go+42

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/tty_other.go+26

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/tty_unix.go+39

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/tty_windows.go+39

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/utils.go+15

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/uv.go+406

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/winch.go+62

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/winch_other.go+17

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/winch_unix.go+50

This diff is too big to show here.

vendor/github.com/charmbracelet/ultraviolet/window.go+147

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/LICENSE+21

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/ansi.go+11

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/ascii.go+8

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/background.go+178

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/c0.go+79

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/c1.go+72

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/charset.go+55

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/clipboard.go+75

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/color.go+784

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/ctrl.go+156

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/cursor.go+637

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/cwd.go+26

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/doc.go+7

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/finalterm.go+67

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/focus.go+9

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/graphics.go+62

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/hyperlink.go+28

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/inband.go+24

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/iterm2.go+18

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/keypad.go+28

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/kitty.go+90

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/kitty/decoder.go+86

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/kitty/encoder.go+64

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/kitty/graphics.go+414

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/kitty/options.go+373

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/kitty/writer.go+187

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/method.go+196

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/mode.go+690

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/mode_deprecated.go+495

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/modes.go+65

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/mouse.go+172

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/notification.go+32

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/palette.go+34

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/parser.go+417

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/parser/const.go+79

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/parser/seq.go+136

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/parser/transition_table.go+273

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/parser_decode.go+525

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/parser_handler.go+60

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/parser_sync.go+29

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/passthrough.go+60

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/paste.go+7

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/progress.go+49

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/reset.go+11

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/screen.go+410

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/sgr.go+79

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/status.go+168

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/style.go+819

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/termcap.go+41

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/title.go+48

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/truncate.go+290

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/urxvt.go+17

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/util.go+92

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/width.go+107

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/winop.go+59

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/wrap.go+472

This diff is too big to show here.

vendor/github.com/charmbracelet/x/ansi/xterm.go+138

This diff is too big to show here.

vendor/github.com/charmbracelet/x/editor/LICENSE+21

This diff is too big to show here.

vendor/github.com/charmbracelet/x/editor/editor.go+140

This diff is too big to show here.

vendor/github.com/charmbracelet/x/etag/LICENSE+21

This diff is too big to show here.

vendor/github.com/charmbracelet/x/etag/etag.go+48

This diff is too big to show here.

vendor/github.com/charmbracelet/x/exp/charmtone/LICENSE+21

This diff is too big to show here.

vendor/github.com/charmbracelet/x/exp/charmtone/charmtone.go+443

This diff is too big to show here.

vendor/github.com/charmbracelet/x/exp/golden/LICENSE+21

This diff is too big to show here.

vendor/github.com/charmbracelet/x/exp/golden/golden.go+83

This diff is too big to show here.

vendor/github.com/charmbracelet/x/exp/ordered/LICENSE+21

This diff is too big to show here.

vendor/github.com/charmbracelet/x/exp/ordered/ordered.go+42

This diff is too big to show here.

vendor/github.com/charmbracelet/x/exp/slice/LICENSE+21

This diff is too big to show here.

vendor/github.com/charmbracelet/x/exp/slice/slice.go+148

This diff is too big to show here.

vendor/github.com/charmbracelet/x/exp/strings/LICENSE+21

This diff is too big to show here.

vendor/github.com/charmbracelet/x/exp/strings/contains.go+16

This diff is too big to show here.

vendor/github.com/charmbracelet/x/exp/strings/join.go+134

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/LICENSE+21

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/config/config.go+118

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/config/lsps.json+367

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/config/overrides.go+85

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/lsp/client.go+875

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/lsp/language.go+158

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol.go+50

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol/LICENSE+27

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol/interface.go+132

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol/pattern_interfaces.go+79

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol/tables.go+31

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol/tsdocument-changes.go+83

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol/tsjson.go+3072

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol/tsprotocol.go+6963

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/lsp/protocol/uri.go+192

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/lsp/sync.go+240

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/lsp/types.go+93

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/transport/connection.go+130

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/transport/router.go+107

This diff is too big to show here.

vendor/github.com/charmbracelet/x/powernap/pkg/transport/transport.go+214

This diff is too big to show here.

vendor/github.com/charmbracelet/x/term/LICENSE+21

This diff is too big to show here.

vendor/github.com/charmbracelet/x/term/term.go+51

This diff is too big to show here.

vendor/github.com/charmbracelet/x/term/term_other.go+39

This diff is too big to show here.

vendor/github.com/charmbracelet/x/term/term_plan9.go+118

This diff is too big to show here.

vendor/github.com/charmbracelet/x/term/term_unix.go+96

This diff is too big to show here.

vendor/github.com/charmbracelet/x/term/term_unix_bsd.go+11

This diff is too big to show here.

vendor/github.com/charmbracelet/x/term/term_unix_other.go+11

This diff is too big to show here.

vendor/github.com/charmbracelet/x/term/term_windows.go+87

This diff is too big to show here.

vendor/github.com/charmbracelet/x/term/terminal.go+12

This diff is too big to show here.

vendor/github.com/charmbracelet/x/term/util.go+47

This diff is too big to show here.

vendor/github.com/charmbracelet/x/termios/LICENSE+21

This diff is too big to show here.

vendor/github.com/charmbracelet/x/termios/bit_bsd.go+7

This diff is too big to show here.

vendor/github.com/charmbracelet/x/termios/bit_darwin.go+7

This diff is too big to show here.

vendor/github.com/charmbracelet/x/termios/bit_other.go+7

This diff is too big to show here.

vendor/github.com/charmbracelet/x/termios/syscalls_bsd.go+11

This diff is too big to show here.

vendor/github.com/charmbracelet/x/termios/syscalls_darwin.go+10

This diff is too big to show here.

vendor/github.com/charmbracelet/x/termios/syscalls_linux.go+14

This diff is too big to show here.

vendor/github.com/charmbracelet/x/termios/termios.go+249

This diff is too big to show here.

vendor/github.com/charmbracelet/x/termios/termios_bsd.go+13

This diff is too big to show here.

vendor/github.com/charmbracelet/x/termios/termios_linux.go+13

This diff is too big to show here.

vendor/github.com/charmbracelet/x/termios/termios_other.go+15

This diff is too big to show here.

vendor/github.com/charmbracelet/x/termios/termios_solaris.go+26

This diff is too big to show here.

vendor/github.com/charmbracelet/x/windows/LICENSE+21

This diff is too big to show here.

vendor/github.com/charmbracelet/x/windows/doc.go+4

This diff is too big to show here.

vendor/github.com/charmbracelet/x/windows/syscall_windows.go+14

This diff is too big to show here.

vendor/github.com/charmbracelet/x/windows/types.go+221

This diff is too big to show here.

vendor/github.com/charmbracelet/x/windows/types_windows.go+142

This diff is too big to show here.

vendor/github.com/charmbracelet/x/windows/zsyscall_windows.go+77

This diff is too big to show here.

vendor/github.com/clipperhouse/displaywidth/.gitignore+3

This diff is too big to show here.

vendor/github.com/clipperhouse/displaywidth/AGENTS.md+51

This diff is too big to show here.

vendor/github.com/clipperhouse/displaywidth/CHANGELOG.md+129

This diff is too big to show here.

vendor/github.com/clipperhouse/displaywidth/LICENSE+21

This diff is too big to show here.

vendor/github.com/clipperhouse/displaywidth/README.md+190

This diff is too big to show here.

vendor/github.com/clipperhouse/displaywidth/gen.go+3

This diff is too big to show here.

vendor/github.com/clipperhouse/displaywidth/graphemes.go+73

This diff is too big to show here.

vendor/github.com/clipperhouse/displaywidth/options.go+30

This diff is too big to show here.

vendor/github.com/clipperhouse/displaywidth/trie.go+1699

This diff is too big to show here.

vendor/github.com/clipperhouse/displaywidth/truncate.go+149

This diff is too big to show here.

vendor/github.com/clipperhouse/displaywidth/width.go+239

This diff is too big to show here.

vendor/github.com/clipperhouse/uax29/v2/LICENSE+21

This diff is too big to show here.

vendor/github.com/clipperhouse/uax29/v2/graphemes/README.md+120

This diff is too big to show here.

vendor/github.com/clipperhouse/uax29/v2/graphemes/ansi.go+138

This diff is too big to show here.

vendor/github.com/clipperhouse/uax29/v2/graphemes/ansi8.go+79

This diff is too big to show here.

vendor/github.com/clipperhouse/uax29/v2/graphemes/iterator.go+144

This diff is too big to show here.

vendor/github.com/clipperhouse/uax29/v2/graphemes/reader.go+25

This diff is too big to show here.

vendor/github.com/clipperhouse/uax29/v2/graphemes/splitfunc.go+205

This diff is too big to show here.

vendor/github.com/clipperhouse/uax29/v2/graphemes/trie.go+1717

This diff is too big to show here.

vendor/github.com/clipperhouse/uax29/v2/words/README.md+121

This diff is too big to show here.

vendor/github.com/clipperhouse/uax29/v2/words/bleve_compat.go+104

This diff is too big to show here.

vendor/github.com/clipperhouse/uax29/v2/words/iterator.go+126

This diff is too big to show here.

vendor/github.com/clipperhouse/uax29/v2/words/joiners.go+41

This diff is too big to show here.

vendor/github.com/clipperhouse/uax29/v2/words/reader.go+34

This diff is too big to show here.

vendor/github.com/clipperhouse/uax29/v2/words/seek.go+43

This diff is too big to show here.

vendor/github.com/clipperhouse/uax29/v2/words/splitfunc.go+269

This diff is too big to show here.

vendor/github.com/clipperhouse/uax29/v2/words/trie.go+3774

This diff is too big to show here.

vendor/github.com/cyphar/filepath-securejoin/.golangci.yml+60

This diff is too big to show here.

vendor/github.com/cyphar/filepath-securejoin/CHANGELOG.md+453

This diff is too big to show here.

vendor/github.com/cyphar/filepath-securejoin/COPYING.md+447

This diff is too big to show here.

vendor/github.com/cyphar/filepath-securejoin/LICENSE.BSD+28

This diff is too big to show here.

vendor/github.com/cyphar/filepath-securejoin/LICENSE.MPL-2.0+373

This diff is too big to show here.

vendor/github.com/cyphar/filepath-securejoin/README.md+184

This diff is too big to show here.

vendor/github.com/cyphar/filepath-securejoin/VERSION+1

This diff is too big to show here.

vendor/github.com/cyphar/filepath-securejoin/codecov.yml+29

This diff is too big to show here.

vendor/github.com/cyphar/filepath-securejoin/doc.go+47

This diff is too big to show here.

vendor/github.com/cyphar/filepath-securejoin/internal/consts/consts.go+15

This diff is too big to show here.

vendor/github.com/cyphar/filepath-securejoin/join.go+169

This diff is too big to show here.

vendor/github.com/cyphar/filepath-securejoin/vfs.go+37

This diff is too big to show here.

vendor/github.com/davecgh/go-spew/LICENSE+15

This diff is too big to show here.

vendor/github.com/davecgh/go-spew/spew/bypass.go+145

This diff is too big to show here.

vendor/github.com/davecgh/go-spew/spew/bypasssafe.go+38

This diff is too big to show here.

vendor/github.com/davecgh/go-spew/spew/common.go+341

This diff is too big to show here.

vendor/github.com/davecgh/go-spew/spew/config.go+306

This diff is too big to show here.

vendor/github.com/davecgh/go-spew/spew/doc.go+211

This diff is too big to show here.

vendor/github.com/davecgh/go-spew/spew/dump.go+509

This diff is too big to show here.

vendor/github.com/davecgh/go-spew/spew/format.go+419

This diff is too big to show here.

vendor/github.com/davecgh/go-spew/spew/spew.go+148

This diff is too big to show here.

vendor/github.com/denisbrodbeck/machineid/.gitignore+29

This diff is too big to show here.

vendor/github.com/denisbrodbeck/machineid/LICENSE.md+22

This diff is too big to show here.

vendor/github.com/denisbrodbeck/machineid/README.md+182

This diff is too big to show here.

vendor/github.com/denisbrodbeck/machineid/helper.go+36

This diff is too big to show here.

vendor/github.com/denisbrodbeck/machineid/id.go+45

This diff is too big to show here.

vendor/github.com/denisbrodbeck/machineid/id_bsd.go+42

This diff is too big to show here.

vendor/github.com/denisbrodbeck/machineid/id_darwin.go+37

This diff is too big to show here.

vendor/github.com/denisbrodbeck/machineid/id_linux.go+27

This diff is too big to show here.

vendor/github.com/denisbrodbeck/machineid/id_windows.go+23

This diff is too big to show here.

vendor/github.com/denisbrodbeck/machineid/logo.png

This diff is too big to show here.

vendor/github.com/denisbrodbeck/machineid/makefile+12

This diff is too big to show here.

vendor/github.com/disintegration/imaging/.travis.yml+12

This diff is too big to show here.

vendor/github.com/disintegration/imaging/LICENSE+21

This diff is too big to show here.

vendor/github.com/disintegration/imaging/README.md+226

This diff is too big to show here.

vendor/github.com/disintegration/imaging/adjust.go+253

This diff is too big to show here.

vendor/github.com/disintegration/imaging/convolution.go+148

This diff is too big to show here.

vendor/github.com/disintegration/imaging/doc.go+7

This diff is too big to show here.

vendor/github.com/disintegration/imaging/effects.go+169

This diff is too big to show here.

vendor/github.com/disintegration/imaging/histogram.go+52

This diff is too big to show here.

vendor/github.com/disintegration/imaging/io.go+444

This diff is too big to show here.

vendor/github.com/disintegration/imaging/resize.go+595

This diff is too big to show here.

vendor/github.com/disintegration/imaging/scanner.go+285

This diff is too big to show here.

vendor/github.com/disintegration/imaging/tools.go+249

This diff is too big to show here.

vendor/github.com/disintegration/imaging/transform.go+268

This diff is too big to show here.

vendor/github.com/disintegration/imaging/utils.go+167

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/.gitignore+29

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/ATTRIB+133

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/LICENSE+21

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/README.md+283

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/Taskfile.yml+64

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/bufferpool.go+76

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/fastclock.go+141

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/helpers/indexof.go+394

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/helpers/math.go+15

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/helpers/runes.go+58

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/helpers/searchvalues.go+180

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/match.go+455

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/options.go+157

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/regexp.go+717

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/regexp_codegen.go+70

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/replace.go+357

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/runner.go+2197

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/split.go+67

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/stringprefixfilter.go+375

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/syntax/charclass.go+1507

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/syntax/code.go+316

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/syntax/escape.go+94

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/syntax/fuzz.go+21

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/syntax/optimizations.go+672

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/syntax/parser.go+2529

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/syntax/prefix.go+943

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/syntax/prefixanalyzer.go+1491

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/syntax/replacerdata.go+87

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/syntax/tree.go+2362

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/syntax/unicode_alias_tables.go+6058

This diff is too big to show here.

vendor/github.com/dlclark/regexp2/v2/syntax/writer.go+500

This diff is too big to show here.

vendor/github.com/dustin/go-humanize/.travis.yml+21

This diff is too big to show here.

vendor/github.com/dustin/go-humanize/LICENSE+21

This diff is too big to show here.

vendor/github.com/dustin/go-humanize/README.markdown+124

This diff is too big to show here.

vendor/github.com/dustin/go-humanize/big.go+31

This diff is too big to show here.

vendor/github.com/dustin/go-humanize/bigbytes.go+189

This diff is too big to show here.

vendor/github.com/dustin/go-humanize/bytes.go+143

This diff is too big to show here.

vendor/github.com/dustin/go-humanize/comma.go+116

This diff is too big to show here.

vendor/github.com/dustin/go-humanize/commaf.go+41

This diff is too big to show here.

vendor/github.com/dustin/go-humanize/ftoa.go+49

This diff is too big to show here.

vendor/github.com/dustin/go-humanize/humanize.go+8

This diff is too big to show here.

vendor/github.com/dustin/go-humanize/number.go+192

This diff is too big to show here.

vendor/github.com/dustin/go-humanize/ordinals.go+25

This diff is too big to show here.

vendor/github.com/dustin/go-humanize/si.go+127

This diff is too big to show here.

vendor/github.com/dustin/go-humanize/times.go+117

This diff is too big to show here.

vendor/github.com/ebitengine/purego/.gitignore+1

This diff is too big to show here.

vendor/github.com/ebitengine/purego/LICENSE+201

This diff is too big to show here.

vendor/github.com/ebitengine/purego/README.md+119

This diff is too big to show here.

vendor/github.com/ebitengine/purego/abi_amd64.h+99

This diff is too big to show here.

vendor/github.com/ebitengine/purego/abi_arm64.h+39

This diff is too big to show here.

vendor/github.com/ebitengine/purego/abi_loong64.h+60

This diff is too big to show here.

vendor/github.com/ebitengine/purego/cgo.go+19

This diff is too big to show here.

vendor/github.com/ebitengine/purego/dlerror.go+17

This diff is too big to show here.

vendor/github.com/ebitengine/purego/dlfcn.go+99

This diff is too big to show here.

vendor/github.com/ebitengine/purego/dlfcn_android.go+34

This diff is too big to show here.

vendor/github.com/ebitengine/purego/dlfcn_darwin.go+20

This diff is too big to show here.

vendor/github.com/ebitengine/purego/dlfcn_freebsd.go+14

This diff is too big to show here.

vendor/github.com/ebitengine/purego/dlfcn_linux.go+16

This diff is too big to show here.

vendor/github.com/ebitengine/purego/dlfcn_netbsd.go+15

This diff is too big to show here.

vendor/github.com/ebitengine/purego/dlfcn_nocgo_freebsd.go+11

This diff is too big to show here.

vendor/github.com/ebitengine/purego/dlfcn_nocgo_linux.go+19

This diff is too big to show here.

vendor/github.com/ebitengine/purego/dlfcn_nocgo_netbsd.go+9

This diff is too big to show here.

vendor/github.com/ebitengine/purego/dlfcn_playground.go+24

This diff is too big to show here.

vendor/github.com/ebitengine/purego/dlfcn_stubs.s+22

This diff is too big to show here.

vendor/github.com/ebitengine/purego/func.go+564

This diff is too big to show here.

vendor/github.com/ebitengine/purego/gen.go+6

This diff is too big to show here.

vendor/github.com/ebitengine/purego/go_runtime.go+13

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/cgo/dlfcn_cgo_unix.go+56

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/cgo/empty.go+6

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/cgo/syscall_cgo_unix.go+55

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/abi_amd64.h+99

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/abi_arm64.h+39

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/abi_loong64.h+60

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/abi_ppc64x.h+195

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/asm_386.s+29

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/asm_amd64.s+39

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/asm_arm.s+52

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/asm_arm64.s+36

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/asm_loong64.s+40

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/asm_ppc64le.s+82

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/asm_riscv64.s+78

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/asm_s390x.s+55

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/callbacks.go+93

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/doc.go+32

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/fakecgo.go+14

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/freebsd.go+27

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/go_darwin.go+88

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/go_freebsd.go+100

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/go_libinit.go+72

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/go_linux.go+100

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/go_netbsd.go+106

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/go_setenv.go+18

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/go_util.go+38

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/iscgo.go+19

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/libcgo.go+39

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/libcgo_darwin.go+26

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/libcgo_freebsd.go+20

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/libcgo_linux.go+20

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/libcgo_netbsd.go+26

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/netbsd.go+23

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/setenv.go+19

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_386.s+107

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_amd64.s+107

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_arm.s+81

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_arm64.s+84

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_loong64.s+88

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_ppc64le.s+227

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_riscv64.s+72

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/zsymbols.go+165

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/zsymbols_darwin.go+59

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/zsymbols_freebsd.go+48

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/zsymbols_linux.go+48

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/zsymbols_netbsd.go+59

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/ztrampolines_darwin.s+19

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/ztrampolines_freebsd.s+16

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/ztrampolines_linux.s+16

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/ztrampolines_netbsd.s+19

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/fakecgo/ztrampolines_stubs.s+55

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/strings/strings.go+40

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/xreflect/reflect_go124.go+15

This diff is too big to show here.

vendor/github.com/ebitengine/purego/internal/xreflect/reflect_go125.go+12

This diff is too big to show here.

vendor/github.com/ebitengine/purego/is_ios.go+13

This diff is too big to show here.

vendor/github.com/ebitengine/purego/nocgo.go+25

This diff is too big to show here.

vendor/github.com/ebitengine/purego/objc/objc_block_darwin.go+272

This diff is too big to show here.

vendor/github.com/ebitengine/purego/objc/objc_runtime_darwin.go+709

This diff is too big to show here.

vendor/github.com/ebitengine/purego/struct_386.go+41

This diff is too big to show here.

vendor/github.com/ebitengine/purego/struct_amd64.go+286

This diff is too big to show here.

vendor/github.com/ebitengine/purego/struct_arm.go+85

This diff is too big to show here.

vendor/github.com/ebitengine/purego/struct_arm64.go+549

This diff is too big to show here.

vendor/github.com/ebitengine/purego/struct_loong64.go+213

This diff is too big to show here.

vendor/github.com/ebitengine/purego/struct_ppc64le.go+143

This diff is too big to show here.

vendor/github.com/ebitengine/purego/struct_riscv64.go+143

This diff is too big to show here.

vendor/github.com/ebitengine/purego/struct_s390x.go+143

This diff is too big to show here.

vendor/github.com/ebitengine/purego/sys_386.s+147

This diff is too big to show here.

vendor/github.com/ebitengine/purego/sys_amd64.s+170

This diff is too big to show here.

vendor/github.com/ebitengine/purego/sys_arm.s+142

This diff is too big to show here.

vendor/github.com/ebitengine/purego/sys_arm64.s+97

This diff is too big to show here.

vendor/github.com/ebitengine/purego/sys_loong64.s+96

This diff is too big to show here.

vendor/github.com/ebitengine/purego/sys_ppc64le.s+120

This diff is too big to show here.

vendor/github.com/ebitengine/purego/sys_riscv64.s+101

This diff is too big to show here.

vendor/github.com/ebitengine/purego/sys_s390x.s+114

This diff is too big to show here.

vendor/github.com/ebitengine/purego/sys_unix_386.s+226

This diff is too big to show here.

vendor/github.com/ebitengine/purego/sys_unix_arm.s+89

This diff is too big to show here.

vendor/github.com/ebitengine/purego/sys_unix_arm64.s+70

This diff is too big to show here.

vendor/github.com/ebitengine/purego/sys_unix_loong64.s+75

This diff is too big to show here.

vendor/github.com/ebitengine/purego/sys_unix_ppc64le.s+114

This diff is too big to show here.

vendor/github.com/ebitengine/purego/sys_unix_riscv64.s+79

This diff is too big to show here.

vendor/github.com/ebitengine/purego/sys_unix_s390x.s+109

This diff is too big to show here.

vendor/github.com/ebitengine/purego/syscall.go+83

This diff is too big to show here.

vendor/github.com/ebitengine/purego/syscall_32bit.go+109

This diff is too big to show here.

vendor/github.com/ebitengine/purego/syscall_cgo_linux.go+21

This diff is too big to show here.

vendor/github.com/ebitengine/purego/syscall_sysv.go+317

This diff is too big to show here.

vendor/github.com/ebitengine/purego/syscall_sysv_others.go+28

This diff is too big to show here.

vendor/github.com/ebitengine/purego/syscall_sysv_stackargs.go+33

This diff is too big to show here.

vendor/github.com/ebitengine/purego/syscall_windows.go+46

This diff is too big to show here.

vendor/github.com/ebitengine/purego/zcallback_386.s+4014

This diff is too big to show here.

vendor/github.com/ebitengine/purego/zcallback_amd64.s+2014

This diff is too big to show here.

vendor/github.com/ebitengine/purego/zcallback_arm.s+4014

This diff is too big to show here.

vendor/github.com/ebitengine/purego/zcallback_arm64.s+4014

This diff is too big to show here.

vendor/github.com/ebitengine/purego/zcallback_loong64.s+4014

This diff is too big to show here.

vendor/github.com/ebitengine/purego/zcallback_ppc64le.s+4014

This diff is too big to show here.

vendor/github.com/ebitengine/purego/zcallback_riscv64.s+4051

This diff is too big to show here.

vendor/github.com/ebitengine/purego/zcallback_s390x.s+4015

This diff is too big to show here.

vendor/github.com/esiqveland/notify/.gitignore+1

This diff is too big to show here.

vendor/github.com/esiqveland/notify/LICENSE.txt+27

This diff is too big to show here.

vendor/github.com/esiqveland/notify/README.md+54

This diff is too big to show here.

vendor/github.com/esiqveland/notify/doc.go+18

This diff is too big to show here.

vendor/github.com/esiqveland/notify/notification.go+547

This diff is too big to show here.

vendor/github.com/felixge/httpsnoop/.gitignore

This diff is too big to show here.

vendor/github.com/felixge/httpsnoop/LICENSE.txt+19

This diff is too big to show here.

vendor/github.com/felixge/httpsnoop/Makefile+10

This diff is too big to show here.

vendor/github.com/felixge/httpsnoop/README.md+95

This diff is too big to show here.

vendor/github.com/felixge/httpsnoop/capture_metrics.go+121

This diff is too big to show here.

vendor/github.com/felixge/httpsnoop/docs.go+10

This diff is too big to show here.

vendor/github.com/felixge/httpsnoop/wrap_generated.go+16179

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/.cirrus.yml+14

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/.gitignore+10

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/.mailmap+2

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/CHANGELOG.md+602

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md+145

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/LICENSE+25

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/README.md+182

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/backend_fen.go+467

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/backend_inotify.go+583

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/backend_kqueue.go+705

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/backend_other.go+22

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/backend_windows.go+680

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/fsnotify.go+496

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/internal/darwin.go+39

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/internal/debug_darwin.go+57

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/internal/debug_dragonfly.go+33

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/internal/debug_freebsd.go+42

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/internal/debug_kqueue.go+32

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/internal/debug_linux.go+56

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/internal/debug_netbsd.go+25

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/internal/debug_openbsd.go+28

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/internal/debug_solaris.go+45

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/internal/debug_windows.go+40

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/internal/freebsd.go+31

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/internal/internal.go+2

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/internal/unix.go+31

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/internal/unix2.go+7

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/internal/windows.go+41

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/shared.go+64

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/staticcheck.conf+3

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/system_bsd.go+7

This diff is too big to show here.

vendor/github.com/fsnotify/fsnotify/system_darwin.go+8

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/LICENSE+23

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/README.md+41

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/alert_darwin.go+8

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/alert_js.go+12

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/alert_unix.go+17

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/alert_unsupported.go+8

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/alert_windows.go+43

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/beeep.go+55

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/beep_darwin.go+32

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/beep_js.go+39

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/beep_unix.go+100

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/beep_unsupported.go+15

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/beep_windows.go+52

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/notify_darwin.go+131

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/notify_js.go+63

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/notify_unix.go+181

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/notify_unix_nodbus.go+78

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/notify_unsupported.go+8

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/notify_windows.go+157

This diff is too big to show here.

vendor/github.com/gen2brain/beeep/notify_windows_compat.go+109

This diff is too big to show here.

vendor/github.com/go-git/gcfg/.gitignore+1

This diff is too big to show here.

vendor/github.com/go-git/gcfg/LICENSE+28

This diff is too big to show here.

vendor/github.com/go-git/gcfg/Makefile+17

This diff is too big to show here.

vendor/github.com/go-git/gcfg/README+4

This diff is too big to show here.

vendor/github.com/go-git/gcfg/doc.go+145

This diff is too big to show here.

vendor/github.com/go-git/gcfg/errors.go+41

This diff is too big to show here.

vendor/github.com/go-git/gcfg/read.go+273

This diff is too big to show here.

vendor/github.com/go-git/gcfg/scanner/errors.go+121

This diff is too big to show here.

vendor/github.com/go-git/gcfg/scanner/scanner.go+334

This diff is too big to show here.

vendor/github.com/go-git/gcfg/set.go+334

This diff is too big to show here.

vendor/github.com/go-git/gcfg/token/position.go+435

This diff is too big to show here.

vendor/github.com/go-git/gcfg/token/serialize.go+56

This diff is too big to show here.

vendor/github.com/go-git/gcfg/token/token.go+83

This diff is too big to show here.

vendor/github.com/go-git/gcfg/types/bool.go+23

This diff is too big to show here.

vendor/github.com/go-git/gcfg/types/doc.go+4

This diff is too big to show here.

vendor/github.com/go-git/gcfg/types/enum.go+44

This diff is too big to show here.

vendor/github.com/go-git/gcfg/types/int.go+86

This diff is too big to show here.

vendor/github.com/go-git/gcfg/types/scan.go+23

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/.gitignore+4

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/LICENSE+201

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/Makefile+18

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/README.md+77

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/fs.go+210

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/helper/chroot/chroot.go+444

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/helper/polyfill/polyfill.go+114

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/memfs/memory.go+428

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/memfs/storage.go+251

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/osfs/os.go+132

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/osfs/os_bound.go+351

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/osfs/os_chroot.go+126

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/osfs/os_js.go+25

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/osfs/os_options.go+3

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/osfs/os_plan9.go+91

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/osfs/os_posix.go+38

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/osfs/os_wasip1.go+34

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/osfs/os_windows.go+58

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/util/glob.go+111

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/util/util.go+282

This diff is too big to show here.

vendor/github.com/go-git/go-billy/v5/util/walk.go+72

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/LICENSE+201

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/config/branch.go+123

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/config/config.go+727

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/config/modules.go+191

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/config/optbool.go+82

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/config/refspec.go+155

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/config/url.go+81

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/internal/path_util/path_util.go+29

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/internal/pathutil/dotgit.go+21

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/internal/pathutil/hfs.go+99

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/internal/pathutil/ntfs.go+187

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/internal/pathutil/tree.go+66

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/internal/url/url.go+72

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/error.go+35

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/format/config/common.go+109

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/format/config/decoder.go+37

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/format/config/doc.go+122

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/format/config/encoder.go+82

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/format/config/format.go+53

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/format/config/option.go+127

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/format/config/section.go+181

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/dir.go+148

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/doc.go+70

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/matcher.go+30

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/pattern.go+155

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/hash.go+84

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/hash/hash.go+60

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/hash/hash_sha1.go+15

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/hash/hash_sha256.go+15

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/memory.go+72

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/object.go+111

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/reference.go+315

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/plumbing/revision.go+11

This diff is too big to show here.

vendor/github.com/go-git/go-git/v5/utils/ioutil/common.go+210

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/AUTHORS+3

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/CONTRIBUTORS+3

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/LICENSE+27

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/README.md+176

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/alias.go+943

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/api.png

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/arshal.go+569

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/arshal_any.go+289

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/arshal_default.go+2043

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/arshal_embedded.go+230

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/arshal_funcs.go+428

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/arshal_methods.go+378

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/arshal_time.go+795

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/doc.go+247

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/errors.go+465

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/fields.go+656

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/fold.go+58

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/intern.go+88

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/internal/internal.go+42

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/internal/jsonflags/flags.go+223

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/internal/jsonopts/options.go+217

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/internal/jsonopts/options_format.go+124

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/internal/jsonwire/decode.go+606

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/internal/jsonwire/encode.go+290

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/internal/jsonwire/wire.go+209

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/jsontext/alias.go+555

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/jsontext/decode.go+1218

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/jsontext/doc.go+111

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/jsontext/encode.go+993

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/jsontext/errors.go+213

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/jsontext/export.go+91

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/jsontext/options.go+304

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/jsontext/pools.go+164

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/jsontext/quote.go+41

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/jsontext/state.go+828

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/jsontext/token.go+697

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/jsontext/value.go+414

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/migrate.sh+60

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/options.go+290

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/options_format.go+122

This diff is too big to show here.

vendor/github.com/go-json-experiment/json/options_format_global.go+30

This diff is too big to show here.

vendor/github.com/go-logfmt/logfmt/.gitignore+1

This diff is too big to show here.

vendor/github.com/go-logfmt/logfmt/CHANGELOG.md+82

This diff is too big to show here.

vendor/github.com/go-logfmt/logfmt/LICENSE+22

This diff is too big to show here.

vendor/github.com/go-logfmt/logfmt/README.md+41

This diff is too big to show here.

vendor/github.com/go-logfmt/logfmt/decode.go+254

This diff is too big to show here.

vendor/github.com/go-logfmt/logfmt/doc.go+6

This diff is too big to show here.

vendor/github.com/go-logfmt/logfmt/encode.go+322

This diff is too big to show here.

vendor/github.com/go-logfmt/logfmt/jsonstring.go+277

This diff is too big to show here.

vendor/github.com/go-logr/logr/.golangci.yaml+28

This diff is too big to show here.

vendor/github.com/go-logr/logr/CHANGELOG.md+6

This diff is too big to show here.

vendor/github.com/go-logr/logr/CONTRIBUTING.md+17

This diff is too big to show here.

vendor/github.com/go-logr/logr/LICENSE+201

This diff is too big to show here.

vendor/github.com/go-logr/logr/README.md+407

This diff is too big to show here.

vendor/github.com/go-logr/logr/SECURITY.md+18

This diff is too big to show here.

vendor/github.com/go-logr/logr/context.go+33

This diff is too big to show here.

vendor/github.com/go-logr/logr/context_noslog.go+49

This diff is too big to show here.

vendor/github.com/go-logr/logr/context_slog.go+83

This diff is too big to show here.

vendor/github.com/go-logr/logr/discard.go+24

This diff is too big to show here.

vendor/github.com/go-logr/logr/funcr/funcr.go+914

This diff is too big to show here.

vendor/github.com/go-logr/logr/funcr/slogsink.go+105

This diff is too big to show here.

vendor/github.com/go-logr/logr/logr.go+520

This diff is too big to show here.

vendor/github.com/go-logr/logr/sloghandler.go+192

This diff is too big to show here.

vendor/github.com/go-logr/logr/slogr.go+100

This diff is too big to show here.

vendor/github.com/go-logr/logr/slogsink.go+120

This diff is too big to show here.

vendor/github.com/go-logr/stdr/LICENSE+201

This diff is too big to show here.

vendor/github.com/go-logr/stdr/README.md+6

This diff is too big to show here.

vendor/github.com/go-logr/stdr/stdr.go+170

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/.travis.yml+8

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/ChangeLog.md+49

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/LICENSE+21

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/README.md+46

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/SECURITY.md+13

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/appveyor.yml+68

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/com.go+386

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/com_func.go+174

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/connect.go+192

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/constants.go+153

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/error.go+51

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/error_func.go+8

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/error_windows.go+24

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/guid.go+284

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/iconnectionpoint.go+20

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go+21

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go+43

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/iconnectionpointcontainer.go+17

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go+11

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go+25

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/idispatch.go+94

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/idispatch_func.go+19

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/idispatch_windows.go+203

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/ienumvariant.go+19

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/ienumvariant_func.go+19

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/ienumvariant_windows.go+63

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/iinspectable.go+18

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/iinspectable_func.go+15

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/iinspectable_windows.go+72

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/iprovideclassinfo.go+21

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go+7

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go+21

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/itypeinfo.go+34

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/itypeinfo_func.go+7

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/itypeinfo_windows.go+21

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/iunknown.go+57

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/iunknown_func.go+19

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/iunknown_windows.go+58

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/ole.go+190

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/safearray.go+27

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/safearray_func.go+211

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/safearray_windows.go+337

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/safearrayconversion.go+140

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/safearrayslices.go+33

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/utility.go+101

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/variables.go+15

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/variant.go+105

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/variant_386.go+11

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/variant_amd64.go+12

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/variant_arm.go+11

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/variant_arm64.go+13

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/variant_date_386.go+22

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/variant_date_amd64.go+20

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/variant_date_arm.go+22

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/variant_date_arm64.go+23

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/variant_ppc64le.go+12

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/variant_s390x.go+12

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/vt_string.go+58

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/winrt.go+99

This diff is too big to show here.

vendor/github.com/go-ole/go-ole/winrt_doc.go+36

This diff is too big to show here.

vendor/github.com/go-openapi/jsonpointer/.editorconfig+26

This diff is too big to show here.

vendor/github.com/go-openapi/jsonpointer/.gitignore+1

This diff is too big to show here.

vendor/github.com/go-openapi/jsonpointer/.travis.yml+15

This diff is too big to show here.

vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md+74

This diff is too big to show here.

vendor/github.com/go-openapi/jsonpointer/LICENSE+202

This diff is too big to show here.

vendor/github.com/go-openapi/jsonpointer/README.md+15

This diff is too big to show here.

vendor/github.com/go-openapi/jsonpointer/pointer.go+390

This diff is too big to show here.

vendor/github.com/go-openapi/jsonreference/.gitignore+1

This diff is too big to show here.

vendor/github.com/go-openapi/jsonreference/.golangci.yml+41

This diff is too big to show here.

vendor/github.com/go-openapi/jsonreference/.travis.yml+24

This diff is too big to show here.

vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md+74

This diff is too big to show here.

vendor/github.com/go-openapi/jsonreference/LICENSE+202

This diff is too big to show here.

vendor/github.com/go-openapi/jsonreference/README.md+15

This diff is too big to show here.

vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go+63

This diff is too big to show here.

vendor/github.com/go-openapi/jsonreference/reference.go+158

This diff is too big to show here.

vendor/github.com/go-openapi/spec/.editorconfig+26

This diff is too big to show here.

vendor/github.com/go-openapi/spec/.gitignore+2

This diff is too big to show here.

vendor/github.com/go-openapi/spec/.golangci.yml+42

This diff is too big to show here.

vendor/github.com/go-openapi/spec/.travis.yml+31

This diff is too big to show here.

vendor/github.com/go-openapi/spec/CODE_OF_CONDUCT.md+74

This diff is too big to show here.

vendor/github.com/go-openapi/spec/LICENSE+202

This diff is too big to show here.

vendor/github.com/go-openapi/spec/README.md+34

This diff is too big to show here.

vendor/github.com/go-openapi/spec/bindata.go+297

This diff is too big to show here.

vendor/github.com/go-openapi/spec/cache.go+98

This diff is too big to show here.

vendor/github.com/go-openapi/spec/contact_info.go+57

This diff is too big to show here.

vendor/github.com/go-openapi/spec/debug.go+49

This diff is too big to show here.

vendor/github.com/go-openapi/spec/errors.go+19

This diff is too big to show here.

vendor/github.com/go-openapi/spec/expander.go+594

This diff is too big to show here.

vendor/github.com/go-openapi/spec/external_docs.go+24

This diff is too big to show here.

vendor/github.com/go-openapi/spec/header.go+203

This diff is too big to show here.

vendor/github.com/go-openapi/spec/info.go+165

This diff is too big to show here.

vendor/github.com/go-openapi/spec/items.go+234

This diff is too big to show here.

vendor/github.com/go-openapi/spec/license.go+56

This diff is too big to show here.

vendor/github.com/go-openapi/spec/normalizer.go+203

This diff is too big to show here.

vendor/github.com/go-openapi/spec/normalizer_nonwindows.go+43

This diff is too big to show here.

vendor/github.com/go-openapi/spec/normalizer_windows.go+154

This diff is too big to show here.

vendor/github.com/go-openapi/spec/operation.go+397

This diff is too big to show here.

vendor/github.com/go-openapi/spec/parameter.go+326

This diff is too big to show here.

vendor/github.com/go-openapi/spec/path_item.go+87

This diff is too big to show here.

vendor/github.com/go-openapi/spec/paths.go+97

This diff is too big to show here.

vendor/github.com/go-openapi/spec/properties.go+91

This diff is too big to show here.

vendor/github.com/go-openapi/spec/ref.go+193

This diff is too big to show here.

vendor/github.com/go-openapi/spec/resolver.go+127

This diff is too big to show here.

vendor/github.com/go-openapi/spec/response.go+152

This diff is too big to show here.

vendor/github.com/go-openapi/spec/responses.go+127

This diff is too big to show here.

vendor/github.com/go-openapi/spec/schema.go+646

This diff is too big to show here.

vendor/github.com/go-openapi/spec/schema_loader.go+338

This diff is too big to show here.

vendor/github.com/go-openapi/spec/security_scheme.go+170

This diff is too big to show here.

vendor/github.com/go-openapi/spec/spec.go+78

This diff is too big to show here.

vendor/github.com/go-openapi/spec/swagger.go+448

This diff is too big to show here.

vendor/github.com/go-openapi/spec/tag.go+75

This diff is too big to show here.

vendor/github.com/go-openapi/spec/validations.go+215

This diff is too big to show here.

vendor/github.com/go-openapi/spec/xml_object.go+68

This diff is too big to show here.

vendor/github.com/go-openapi/swag/.editorconfig+26

This diff is too big to show here.

vendor/github.com/go-openapi/swag/.gitignore+4

This diff is too big to show here.

vendor/github.com/go-openapi/swag/.golangci.yml+41

This diff is too big to show here.

vendor/github.com/go-openapi/swag/.travis.yml+37

This diff is too big to show here.

vendor/github.com/go-openapi/swag/CODE_OF_CONDUCT.md+74

This diff is too big to show here.

vendor/github.com/go-openapi/swag/LICENSE+202

This diff is too big to show here.

vendor/github.com/go-openapi/swag/README.md+21

This diff is too big to show here.

vendor/github.com/go-openapi/swag/convert.go+208

This diff is too big to show here.

vendor/github.com/go-openapi/swag/convert_types.go+730

This diff is too big to show here.

vendor/github.com/go-openapi/swag/doc.go+32

This diff is too big to show here.

vendor/github.com/go-openapi/swag/json.go+312

This diff is too big to show here.

vendor/github.com/go-openapi/swag/loading.go+120

This diff is too big to show here.

vendor/github.com/go-openapi/swag/name_lexem.go+87

This diff is too big to show here.

vendor/github.com/go-openapi/swag/net.go+38

This diff is too big to show here.

vendor/github.com/go-openapi/swag/path.go+59

This diff is too big to show here.

vendor/github.com/go-openapi/swag/post_go18.go+23

This diff is too big to show here.

vendor/github.com/go-openapi/swag/post_go19.go+67

This diff is too big to show here.

vendor/github.com/go-openapi/swag/pre_go18.go+23

This diff is too big to show here.

vendor/github.com/go-openapi/swag/pre_go19.go+69

This diff is too big to show here.

vendor/github.com/go-openapi/swag/split.go+262

This diff is too big to show here.

vendor/github.com/go-openapi/swag/util.go+385

This diff is too big to show here.

vendor/github.com/go-openapi/swag/yaml.go+246

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/.editorconfig+24

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/.envrc+7

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/.gitignore+10

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/.golangci.yaml+48

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/CHANGELOG.md+104

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/LICENSE+21

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/README.md+81

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/decode_hooks.go+714

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/devenv.lock+103

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/devenv.nix+14

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/devenv.yaml+4

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/errors.go+244

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/internal/errors/errors.go+11

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/internal/errors/join.go+9

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/internal/errors/join_go1_19.go+61

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/mapstructure.go+1948

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/reflect_go1_19.go+44

This diff is too big to show here.

vendor/github.com/go-viper/mapstructure/v2/reflect_go1_20.go+10

This diff is too big to show here.

vendor/github.com/goccy/go-json/.codecov.yml+32

This diff is too big to show here.

vendor/github.com/goccy/go-json/.gitignore+2

This diff is too big to show here.

vendor/github.com/goccy/go-json/.golangci.yml+86

This diff is too big to show here.

vendor/github.com/goccy/go-json/CHANGELOG.md+425

This diff is too big to show here.

vendor/github.com/goccy/go-json/LICENSE+21

This diff is too big to show here.

vendor/github.com/goccy/go-json/Makefile+39

This diff is too big to show here.

vendor/github.com/goccy/go-json/README.md+529

This diff is too big to show here.

vendor/github.com/goccy/go-json/color.go+68

This diff is too big to show here.

vendor/github.com/goccy/go-json/decode.go+263

This diff is too big to show here.

vendor/github.com/goccy/go-json/docker-compose.yml+13

This diff is too big to show here.

vendor/github.com/goccy/go-json/encode.go+326

This diff is too big to show here.

vendor/github.com/goccy/go-json/error.go+41

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/anonymous_field.go+41

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/array.go+176

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/assign.go+438

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/bool.go+83

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/bytes.go+118

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/compile.go+493

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/compile_norace.go+30

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/compile_race.go+38

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/context.go+254

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/float.go+170

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/func.go+146

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/int.go+246

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/interface.go+528

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/invalid.go+55

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/map.go+280

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/number.go+123

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/option.go+17

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/path.go+670

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/ptr.go+97

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/slice.go+380

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/stream.go+556

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/string.go+452

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/struct.go+845

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/type.go+30

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/uint.go+194

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/unmarshal_json.go+104

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/unmarshal_text.go+285

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/decoder/wrapped_string.go+73

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/code.go+1023

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/compact.go+286

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/compiler.go+939

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/compiler_norace.go+33

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/compiler_race.go+46

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/context.go+105

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/decode_rune.go+126

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/encoder.go+601

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/indent.go+211

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/int.go+176

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/map112.go+9

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/map113.go+9

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/opcode.go+752

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/option.go+48

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/optype.go+932

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/query.go+135

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/string.go+483

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/string_table.go+415

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/vm/debug_vm.go+41

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/vm/hack.go+9

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/vm/util.go+207

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/vm/vm.go+4859

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/vm_color/debug_vm.go+35

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/vm_color/hack.go+9

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/vm_color/util.go+274

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/vm_color/vm.go+4859

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/debug_vm.go+35

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/util.go+297

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/vm.go+4859

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/vm_indent/debug_vm.go+35

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/vm_indent/hack.go+9

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/vm_indent/util.go+230

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/encoder/vm_indent/vm.go+4859

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/errors/error.go+183

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/runtime/rtype.go+262

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/runtime/struct_field.go+91

This diff is too big to show here.

vendor/github.com/goccy/go-json/internal/runtime/type.go+98

This diff is too big to show here.

vendor/github.com/goccy/go-json/json.go+368

This diff is too big to show here.

vendor/github.com/goccy/go-json/option.go+79

This diff is too big to show here.

vendor/github.com/goccy/go-json/path.go+84

This diff is too big to show here.

vendor/github.com/goccy/go-json/query.go+47

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/.codecov.yml+31

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/.gitignore+3

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/.golangci.yml+65

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/CHANGELOG.md+186

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/LICENSE+21

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/Makefile+55

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/README.md+420

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/ast/ast.go+2381

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/context.go+37

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/decode.go+2037

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/encode.go+1074

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/error.go+77

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/internal/errors/error.go+246

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/internal/format/format.go+541

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/lexer/lexer.go+23

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/option.go+352

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/parser/color.go+28

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/parser/context.go+187

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/parser/node.go+257

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/parser/option.go+12

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/parser/parser.go+1330

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/parser/token.go+746

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/path.go+835

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/printer/color.go+83

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/printer/printer.go+353

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/scanner/context.go+452

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/scanner/error.go+17

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/scanner/scanner.go+1536

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/stdlib_quote.go+113

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/struct.go+128

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/token/token.go+1177

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/validate.go+13

This diff is too big to show here.

vendor/github.com/goccy/go-yaml/yaml.go+357

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/.cirrus.yml+11

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/.golangci.yml+13

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/CONTRIBUTING.md+50

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/LICENSE+25

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/MAINTAINERS+3

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/README.md+47

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/SECURITY.md+13

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/auth.go+257

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/auth_anonymous.go+16

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/auth_default_other.go+7

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/auth_default_windows.go+5

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/auth_external.go+26

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/auth_sha1_windows.go+109

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/call.go+66

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/conn.go+1009

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/conn_darwin.go+36

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/conn_other.go+83

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/conn_unix.go+40

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/conn_windows.go+13

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/dbus.go+427

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/decoder.go+376

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/default_handler.go+338

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/doc.go+70

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/encoder.go+235

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/escape.go+84

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/export.go+484

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/match.go+89

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/message.go+393

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/object.go+181

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/sequence.go+24

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/sequential_handler.go+125

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/server_interfaces.go+107

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/sig.go+298

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/transport_darwin.go+6

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/transport_generic.go+52

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/transport_nonce_tcp.go+41

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/transport_tcp.go+41

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/transport_unix.go+291

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/transport_unixcred_dragonfly.go+95

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/transport_unixcred_freebsd.go+94

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/transport_unixcred_linux.go+25

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/transport_unixcred_netbsd.go+14

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/transport_unixcred_openbsd.go+14

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/transport_zos.go+6

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/variant.go+169

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/variant_lexer.go+284

This diff is too big to show here.

vendor/github.com/godbus/dbus/v5/variant_parser.go+815

This diff is too big to show here.

vendor/github.com/golang/freetype/AUTHORS+20

This diff is too big to show here.

vendor/github.com/golang/freetype/CONTRIBUTORS+38

This diff is too big to show here.

vendor/github.com/golang/freetype/LICENSE+12

This diff is too big to show here.

vendor/github.com/golang/freetype/raster/geom.go+245

This diff is too big to show here.

vendor/github.com/golang/freetype/raster/paint.go+287

This diff is too big to show here.

vendor/github.com/golang/freetype/raster/raster.go+601

This diff is too big to show here.

vendor/github.com/golang/freetype/raster/stroke.go+483

This diff is too big to show here.

vendor/github.com/golang/freetype/truetype/face.go+507

This diff is too big to show here.

vendor/github.com/golang/freetype/truetype/glyph.go+522

This diff is too big to show here.

vendor/github.com/golang/freetype/truetype/hint.go+1770

This diff is too big to show here.

vendor/github.com/golang/freetype/truetype/opcodes.go+289

This diff is too big to show here.

vendor/github.com/golang/freetype/truetype/truetype.go+653

This diff is too big to show here.

vendor/github.com/google/go-cmp/LICENSE+27

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/compare.go+671

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/export.go+31

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go+18

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go+123

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go+402

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go+9

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/internal/function/func.go+106

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/internal/value/name.go+164

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/internal/value/pointer.go+34

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/internal/value/sort.go+106

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/options.go+562

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/path.go+390

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/report.go+54

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/report_compare.go+433

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/report_references.go+264

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/report_reflect.go+414

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/report_slices.go+614

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/report_text.go+432

This diff is too big to show here.

vendor/github.com/google/go-cmp/cmp/report_value.go+121

This diff is too big to show here.

vendor/github.com/google/jsonschema-go/LICENSE+21

This diff is too big to show here.

vendor/github.com/google/jsonschema-go/jsonschema/annotations.go+76

This diff is too big to show here.

vendor/github.com/google/jsonschema-go/jsonschema/doc.go+115

This diff is too big to show here.

vendor/github.com/google/jsonschema-go/jsonschema/infer.go+399

This diff is too big to show here.

vendor/github.com/google/jsonschema-go/jsonschema/json_pointer.go+160

This diff is too big to show here.

vendor/github.com/google/jsonschema-go/jsonschema/resolve.go+589

This diff is too big to show here.

vendor/github.com/google/jsonschema-go/jsonschema/schema.go+642

This diff is too big to show here.

vendor/github.com/google/jsonschema-go/jsonschema/util.go+463

This diff is too big to show here.

vendor/github.com/google/jsonschema-go/jsonschema/validate.go+906

This diff is too big to show here.

vendor/github.com/google/s2a-go/.gitignore+6

This diff is too big to show here.

vendor/github.com/google/s2a-go/CODE_OF_CONDUCT.md+93

This diff is too big to show here.

vendor/github.com/google/s2a-go/CONTRIBUTING.md+29

This diff is too big to show here.

vendor/github.com/google/s2a-go/LICENSE.md+202

This diff is too big to show here.

vendor/github.com/google/s2a-go/README.md+14

This diff is too big to show here.

vendor/github.com/google/s2a-go/fallback/s2a_fallback.go+167

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/authinfo/authinfo.go+119

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/handshaker/handshaker.go+438

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/handshaker/service/service.go+66

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/proto/common_go_proto/common.pb.go+388

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/proto/s2a_context_go_proto/s2a_context.pb.go+267

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/proto/s2a_go_proto/s2a.pb.go+1377

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/proto/s2a_go_proto/s2a_grpc.pb.go+174

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/proto/v2/common_go_proto/common.pb.go+549

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/proto/v2/s2a_context_go_proto/s2a_context.pb.go+249

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/proto/v2/s2a_go_proto/s2a.pb.go+2518

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/proto/v2/s2a_go_proto/s2a_grpc.pb.go+160

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/record/internal/aeadcrypter/aeadcrypter.go+34

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/record/internal/aeadcrypter/aesgcm.go+70

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/record/internal/aeadcrypter/chachapoly.go+67

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/record/internal/aeadcrypter/common.go+92

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/record/internal/halfconn/ciphersuite.go+98

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/record/internal/halfconn/counter.go+60

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/record/internal/halfconn/expander.go+59

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/record/internal/halfconn/halfconn.go+193

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/record/record.go+729

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/record/ticketsender.go+178

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/tokenmanager/tokenmanager.go+79

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/v2/README.md+1

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/v2/certverifier/certverifier.go+122

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/v2/remotesigner/remotesigner.go+186

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/v2/s2av2.go+380

This diff is too big to show here.

vendor/github.com/google/s2a-go/internal/v2/tlsconfigstore/tlsconfigstore.go+403

This diff is too big to show here.

vendor/github.com/google/s2a-go/retry/retry.go+144

This diff is too big to show here.

vendor/github.com/google/s2a-go/s2a.go+448

This diff is too big to show here.

vendor/github.com/google/s2a-go/s2a_options.go+272

This diff is too big to show here.

vendor/github.com/google/s2a-go/s2a_utils.go+79

This diff is too big to show here.

vendor/github.com/google/s2a-go/stream/s2a_stream.go+39

This diff is too big to show here.

vendor/github.com/google/uuid/CHANGELOG.md+41

This diff is too big to show here.

vendor/github.com/google/uuid/CONTRIBUTING.md+26

This diff is too big to show here.

vendor/github.com/google/uuid/CONTRIBUTORS+9

This diff is too big to show here.

vendor/github.com/google/uuid/LICENSE+27

This diff is too big to show here.

vendor/github.com/google/uuid/README.md+21

This diff is too big to show here.

vendor/github.com/google/uuid/dce.go+80

This diff is too big to show here.

vendor/github.com/google/uuid/doc.go+12

This diff is too big to show here.

vendor/github.com/google/uuid/hash.go+59

This diff is too big to show here.

vendor/github.com/google/uuid/marshal.go+38

This diff is too big to show here.

vendor/github.com/google/uuid/node.go+90

This diff is too big to show here.

vendor/github.com/google/uuid/node_js.go+12

This diff is too big to show here.

vendor/github.com/google/uuid/node_net.go+33

This diff is too big to show here.

vendor/github.com/google/uuid/null.go+118

This diff is too big to show here.

vendor/github.com/google/uuid/sql.go+59

This diff is too big to show here.

vendor/github.com/google/uuid/time.go+134

This diff is too big to show here.

vendor/github.com/google/uuid/util.go+43

This diff is too big to show here.

vendor/github.com/google/uuid/uuid.go+365

This diff is too big to show here.

vendor/github.com/google/uuid/version1.go+44

This diff is too big to show here.

vendor/github.com/google/uuid/version4.go+76

This diff is too big to show here.

vendor/github.com/google/uuid/version6.go+56

This diff is too big to show here.

vendor/github.com/google/uuid/version7.go+104

This diff is too big to show here.

vendor/github.com/googleapis/enterprise-certificate-proxy/LICENSE+202

This diff is too big to show here.

vendor/github.com/googleapis/enterprise-certificate-proxy/client/client.go+219

This diff is too big to show here.

vendor/github.com/googleapis/enterprise-certificate-proxy/client/util/util.go+100

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/.release-please-manifest.json+3

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/CHANGES.md+231

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/LICENSE+27

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/apierror/apierror.go+413

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/apierror/internal/proto/README.md+30

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/apierror/internal/proto/custom_error.pb.go+226

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/apierror/internal/proto/custom_error.proto+50

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/apierror/internal/proto/error.pb.go+232

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/apierror/internal/proto/error.proto+46

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/call_option.go+288

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/callctx/callctx.go+146

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/content_type.go+112

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/feature.go+81

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/gax.go+41

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/header.go+200

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/internal/version.go+20

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/internallog/internal/internal.go+134

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/internallog/internallog.go+154

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/invoke.go+141

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/proto_json_stream.go+127

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/release-please-config.json+10

This diff is too big to show here.

vendor/github.com/googleapis/gax-go/v2/telemetry.go+469

This diff is too big to show here.

vendor/github.com/gorilla/css/LICENSE+28

This diff is too big to show here.

vendor/github.com/gorilla/css/scanner/doc.go+33

This diff is too big to show here.

vendor/github.com/gorilla/css/scanner/scanner.go+360

This diff is too big to show here.

vendor/github.com/gorilla/websocket/.gitignore+25

This diff is too big to show here.

vendor/github.com/gorilla/websocket/AUTHORS+9

This diff is too big to show here.

vendor/github.com/gorilla/websocket/LICENSE+22

This diff is too big to show here.

vendor/github.com/gorilla/websocket/README.md+33

This diff is too big to show here.

vendor/github.com/gorilla/websocket/client.go+434

This diff is too big to show here.

vendor/github.com/gorilla/websocket/compression.go+148

This diff is too big to show here.

vendor/github.com/gorilla/websocket/conn.go+1238

This diff is too big to show here.

vendor/github.com/gorilla/websocket/doc.go+227

This diff is too big to show here.

vendor/github.com/gorilla/websocket/join.go+42

This diff is too big to show here.

vendor/github.com/gorilla/websocket/json.go+60

This diff is too big to show here.

vendor/github.com/gorilla/websocket/mask.go+55

This diff is too big to show here.

vendor/github.com/gorilla/websocket/mask_safe.go+16

This diff is too big to show here.

vendor/github.com/gorilla/websocket/prepared.go+102

This diff is too big to show here.

vendor/github.com/gorilla/websocket/proxy.go+77

This diff is too big to show here.

vendor/github.com/gorilla/websocket/server.go+365

This diff is too big to show here.

vendor/github.com/gorilla/websocket/tls_handshake.go+21

This diff is too big to show here.

vendor/github.com/gorilla/websocket/tls_handshake_116.go+21

This diff is too big to show here.

vendor/github.com/gorilla/websocket/util.go+298

This diff is too big to show here.

vendor/github.com/gorilla/websocket/x_net_proxy.go+473

This diff is too big to show here.

vendor/github.com/hashicorp/golang-lru/v2/.gitignore+23

This diff is too big to show here.

vendor/github.com/hashicorp/golang-lru/v2/.golangci.yml+46

This diff is too big to show here.

vendor/github.com/hashicorp/golang-lru/v2/2q.go+267

This diff is too big to show here.

vendor/github.com/hashicorp/golang-lru/v2/LICENSE+364

This diff is too big to show here.

vendor/github.com/hashicorp/golang-lru/v2/README.md+79

This diff is too big to show here.

vendor/github.com/hashicorp/golang-lru/v2/doc.go+24

This diff is too big to show here.

vendor/github.com/hashicorp/golang-lru/v2/internal/list.go+142

This diff is too big to show here.

vendor/github.com/hashicorp/golang-lru/v2/lru.go+250

This diff is too big to show here.

vendor/github.com/hashicorp/golang-lru/v2/simplelru/LICENSE_list+29

This diff is too big to show here.

vendor/github.com/hashicorp/golang-lru/v2/simplelru/lru.go+177

This diff is too big to show here.

vendor/github.com/hashicorp/golang-lru/v2/simplelru/lru_interface.go+46

This diff is too big to show here.

vendor/github.com/inconshreveable/mousetrap/LICENSE+201

This diff is too big to show here.

vendor/github.com/inconshreveable/mousetrap/README.md+23

This diff is too big to show here.

vendor/github.com/inconshreveable/mousetrap/trap_others.go+16

This diff is too big to show here.

vendor/github.com/inconshreveable/mousetrap/trap_windows.go+42

This diff is too big to show here.

vendor/github.com/invopop/jsonschema/.gitignore+2

This diff is too big to show here.

vendor/github.com/invopop/jsonschema/.golangci.yml+80

This diff is too big to show here.

vendor/github.com/invopop/jsonschema/COPYING+19

This diff is too big to show here.

vendor/github.com/invopop/jsonschema/README.md+374

This diff is too big to show here.

vendor/github.com/invopop/jsonschema/id.go+76

This diff is too big to show here.

vendor/github.com/invopop/jsonschema/reflect.go+1178

This diff is too big to show here.

vendor/github.com/invopop/jsonschema/reflect_comments.go+160

This diff is too big to show here.

vendor/github.com/invopop/jsonschema/schema.go+94

This diff is too big to show here.

vendor/github.com/invopop/jsonschema/utils.go+26

This diff is too big to show here.

vendor/github.com/itchyny/gojq/.dockerignore+16

This diff is too big to show here.

vendor/github.com/itchyny/gojq/.gitattributes+3

This diff is too big to show here.

vendor/github.com/itchyny/gojq/.gitignore+7

This diff is too big to show here.

vendor/github.com/itchyny/gojq/CHANGELOG.md+418

This diff is too big to show here.

vendor/github.com/itchyny/gojq/Dockerfile+14

This diff is too big to show here.

vendor/github.com/itchyny/gojq/LICENSE+21

This diff is too big to show here.

vendor/github.com/itchyny/gojq/Makefile+102

This diff is too big to show here.

vendor/github.com/itchyny/gojq/README.md+164

This diff is too big to show here.

vendor/github.com/itchyny/gojq/_gojq+43

This diff is too big to show here.

vendor/github.com/itchyny/gojq/builtin.go+73

This diff is too big to show here.

vendor/github.com/itchyny/gojq/builtin.jq+188

This diff is too big to show here.

vendor/github.com/itchyny/gojq/code.go+108

This diff is too big to show here.

vendor/github.com/itchyny/gojq/compare.go+76

This diff is too big to show here.

vendor/github.com/itchyny/gojq/compiler.go+1715

This diff is too big to show here.

vendor/github.com/itchyny/gojq/debug.go+208

This diff is too big to show here.

vendor/github.com/itchyny/gojq/encoder.go+192

This diff is too big to show here.

vendor/github.com/itchyny/gojq/env.go+49

This diff is too big to show here.

vendor/github.com/itchyny/gojq/error.go+383

This diff is too big to show here.

vendor/github.com/itchyny/gojq/execute.go+443

This diff is too big to show here.

vendor/github.com/itchyny/gojq/func.go+2190

This diff is too big to show here.

vendor/github.com/itchyny/gojq/go.dev.mod+8

This diff is too big to show here.

vendor/github.com/itchyny/gojq/go.dev.sum+4

This diff is too big to show here.

vendor/github.com/itchyny/gojq/gojq.go+5

This diff is too big to show here.

vendor/github.com/itchyny/gojq/iter.go+49

This diff is too big to show here.

vendor/github.com/itchyny/gojq/lexer.go+578

This diff is too big to show here.

vendor/github.com/itchyny/gojq/module_loader.go+184

This diff is too big to show here.

vendor/github.com/itchyny/gojq/operator.go+557

This diff is too big to show here.

vendor/github.com/itchyny/gojq/option.go+96

This diff is too big to show here.

vendor/github.com/itchyny/gojq/parser.go+1506

This diff is too big to show here.

vendor/github.com/itchyny/gojq/parser.go.y+669

This diff is too big to show here.

vendor/github.com/itchyny/gojq/preview.go+77

This diff is too big to show here.

vendor/github.com/itchyny/gojq/query.go+942

This diff is too big to show here.

vendor/github.com/itchyny/gojq/release.go+15

This diff is too big to show here.

vendor/github.com/itchyny/gojq/scope_stack.go+48

This diff is too big to show here.

vendor/github.com/itchyny/gojq/stack.go+52

This diff is too big to show here.

vendor/github.com/itchyny/gojq/term_type.go+77

This diff is too big to show here.

vendor/github.com/itchyny/gojq/type.go+31

This diff is too big to show here.

vendor/github.com/itchyny/timefmt-go/CHANGELOG.md+37

This diff is too big to show here.

vendor/github.com/itchyny/timefmt-go/LICENSE+21

This diff is too big to show here.

vendor/github.com/itchyny/timefmt-go/Makefile+20

This diff is too big to show here.

vendor/github.com/itchyny/timefmt-go/README.md+69

This diff is too big to show here.

vendor/github.com/itchyny/timefmt-go/format.go+462

This diff is too big to show here.

vendor/github.com/itchyny/timefmt-go/parse.go+474

This diff is too big to show here.

vendor/github.com/itchyny/timefmt-go/timefmt.go+2

This diff is too big to show here.

vendor/github.com/jackmordaunt/icns/v3/.gitignore+3

This diff is too big to show here.

vendor/github.com/jackmordaunt/icns/v3/.goreleaser.yml+38

This diff is too big to show here.

vendor/github.com/jackmordaunt/icns/v3/LICENSE+21

This diff is too big to show here.

vendor/github.com/jackmordaunt/icns/v3/doc.go+20

This diff is too big to show here.

vendor/github.com/jackmordaunt/icns/v3/error.go+18

This diff is too big to show here.