76 lines
1.7 KiB
Lua
76 lines
1.7 KiB
Lua
local session_dir = vim.fn.stdpath("data") .. "anthropic"
|
|
|
|
local M = {}
|
|
|
|
M.session = {}
|
|
|
|
---@param name string
|
|
---@return string
|
|
local function filename(name)
|
|
return session_dir .. "/" .. name .. ".json"
|
|
end
|
|
|
|
--- # Save current session
|
|
function M.save()
|
|
vim.schedule(function()
|
|
if vim.fn.isdirectory(session_dir) == 0 then
|
|
vim.fn.mkdir(session_dir, 'p')
|
|
end
|
|
|
|
local path = filename(M.session.name)
|
|
|
|
local json = vim.fn.json_encode(M.session)
|
|
vim.fn.writefile({ json }, path)
|
|
end)
|
|
end
|
|
|
|
--- # Load session from file
|
|
---
|
|
---@param name string
|
|
function M.load(name)
|
|
local path = filename(name)
|
|
|
|
local json = table.concat(vim.fn.readfile(path), "\n")
|
|
if not json then
|
|
vim.notify("anthropic: failed loading session from file: " .. path, vim.log.levels.ERROR)
|
|
return
|
|
end
|
|
|
|
local session = vim.fn.json_decode(json)
|
|
if not session then
|
|
vim.notify("anthropic: failed decoding session from file: " .. path, vim.log.levels.ERROR)
|
|
return
|
|
end
|
|
|
|
if session then
|
|
M.session = session
|
|
end
|
|
end
|
|
|
|
--- # List saved session names
|
|
---
|
|
---@return string[]
|
|
function M.list()
|
|
local sessions = vim.fn.glob(session_dir .. "/*.json", false, true)
|
|
for i, session in ipairs(sessions) do
|
|
sessions[i] = string.match(session, "([^/]+)%.json$")
|
|
end
|
|
return sessions
|
|
end
|
|
|
|
--- # Add a message to the session
|
|
---
|
|
---@param message string
|
|
---@param role "user" | "assistant"
|
|
function M.add_message(message, role)
|
|
local msgs = M.session.messages
|
|
if msgs[#msgs - 1].role == role then
|
|
vim.notify("anthropic: " .. role .. " message added after a " .. role .. " message", vim.log.levels.ERROR)
|
|
return
|
|
end
|
|
|
|
table.insert(msgs, { role = role, content = message })
|
|
end
|
|
|
|
return M
|