2
0
Fork 0
anthropic.nvim/lua/anthropic/util/session.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