summaryrefslogtreecommitdiff
path: root/lua/99/extensions
diff options
context:
space:
mode:
author0xr3ngar <bogdan.nikolov4@outlook.com>2026-02-09 08:18:13 +0100
committer0xr3ngar <bogdan.nikolov4@outlook.com>2026-02-09 08:18:13 +0100
commit66d07dc83f85ca5542a4eacb8ed1ccdec19bec4c (patch)
treedc3390b2b953fdccba9a1f3140a2e986ee557558 /lua/99/extensions
parent3d76c50c68780a99603835deb520b6c63102cd0d (diff)
downloada4-66d07dc83f85ca5542a4eacb8ed1ccdec19bec4c.tar.xz
a4-66d07dc83f85ca5542a4eacb8ed1ccdec19bec4c.zip
feat: add telescope model selector extension
Diffstat (limited to 'lua/99/extensions')
-rw-r--r--lua/99/extensions/telescope.lua66
1 files changed, 66 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