diff options
| author | 0xr3ngar <bogdan.nikolov4@outlook.com> | 2026-02-09 08:18:13 +0100 |
|---|---|---|
| committer | 0xr3ngar <bogdan.nikolov4@outlook.com> | 2026-02-09 08:18:13 +0100 |
| commit | 66d07dc83f85ca5542a4eacb8ed1ccdec19bec4c (patch) | |
| tree | dc3390b2b953fdccba9a1f3140a2e986ee557558 /lua | |
| parent | 3d76c50c68780a99603835deb520b6c63102cd0d (diff) | |
| download | a4-66d07dc83f85ca5542a4eacb8ed1ccdec19bec4c.tar.xz a4-66d07dc83f85ca5542a4eacb8ed1ccdec19bec4c.zip | |
feat: add telescope model selector extension
Diffstat (limited to 'lua')
| -rw-r--r-- | lua/99/extensions/telescope.lua | 66 | ||||
| -rw-r--r-- | lua/99/init.lua | 10 |
2 files changed, 76 insertions, 0 deletions
diff --git a/lua/99/extensions/telescope.lua b/lua/99/extensions/telescope.lua new file mode 100644 index 0000000..ac6bec1 --- /dev/null +++ b/lua/99/extensions/telescope.lua @@ -0,0 +1,66 @@ +local _99 = require("99") + +local M = {} + +--- @param provider _99.Providers.BaseProvider? +function M.select_model(provider) + provider = provider or _99.get_provider() + + provider.fetch_models(function(models, err) + if err then + vim.notify("99: " .. err, vim.log.levels.ERROR) + return + end + if not models or #models == 0 then + vim.notify("99: No models available", vim.log.levels.WARN) + return + end + + local ok, pickers = pcall(require, "telescope.pickers") + if not ok then + vim.notify( + "99: telescope.nvim is required for this extension", + vim.log.levels.ERROR + ) + return + end + + local finders = require("telescope.finders") + local conf = require("telescope.config").values + local actions = require("telescope.actions") + local action_state = require("telescope.actions.state") + + -- position the telescope cursor at the currently selected model + local current = _99.get_model() + local default_idx = 1 + for i, m in ipairs(models) do + if m == current then + default_idx = i + break + end + end + + pickers + .new({}, { + prompt_title = "99: Select Model (current: " .. current .. ")", + default_selection_index = default_idx, + finder = finders.new_table({ results = models }), + sorter = conf.generic_sorter({}), + attach_mappings = function(prompt_bufnr) + actions.select_default:replace(function() + actions.close(prompt_bufnr) + local selection = action_state.get_selected_entry() + if not selection then + return + end + _99.set_model(selection[1]) + vim.notify("99: Model set to " .. selection[1]) + end) + return true + end, + }) + :find() + end) +end + +return M diff --git a/lua/99/init.lua b/lua/99/init.lua index 61085ad..a20f8a1 100644 --- a/lua/99/init.lua +++ b/lua/99/init.lua @@ -515,6 +515,16 @@ function _99.set_model(model) return _99 end +--- @return string +function _99.get_model() + return _99_state.model +end + +--- @return _99.Providers.BaseProvider +function _99.get_provider() + return _99_state.provider_override or Providers.OpenCodeProvider +end + function _99.__debug() Logger:configure({ path = nil, |
