Skip to content

Commit 3459b97

Browse files
authored
Merge pull request #45 from editor-code-assistant/server-config-updated
Display model, behavior, agent and usage based on server `config/updated` message
2 parents d80301e + db32bc3 commit 3459b97

File tree

8 files changed

+643
-98
lines changed

8 files changed

+643
-98
lines changed

lua/eca/commands.lua

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,51 @@ function M.setup()
157157
desc = "Restart ECA server",
158158
})
159159

160+
vim.api.nvim_create_user_command("EcaServerMessages", function()
161+
local has_snacks, snacks = pcall(require, "snacks")
162+
if not has_snacks then
163+
Logger.notify("snacks.nvim is not available", vim.log.levels.ERROR)
164+
return
165+
end
166+
167+
snacks.picker(
168+
---@type snacks.picker.Config
169+
{
170+
source = "eca messages",
171+
finder = function(opts, ctx)
172+
---@type snacks.picker.finder.Item[]
173+
local items = {}
174+
local eca = require("eca")
175+
if not eca or not eca.server then
176+
Logger.notify("ECA plugin is not available", vim.log.levels.ERROR)
177+
return items
178+
end
179+
180+
for msg in vim.iter(eca.server.messages) do
181+
local decoded = vim.json.decode(msg.content)
182+
table.insert(items, {
183+
text = decoded.method,
184+
idx = decoded.id,
185+
preview = {
186+
text = vim.inspect(decoded),
187+
ft = "lua",
188+
},
189+
})
190+
end
191+
return items
192+
end,
193+
preview = "preview",
194+
format = "text",
195+
confirm = function(self, item, _)
196+
vim.fn.setreg("", item.preview.text)
197+
self:close()
198+
end,
199+
}
200+
)
201+
end, {
202+
desc = "Display Messages Sent to and Received by ECA server",
203+
})
204+
160205
vim.api.nvim_create_user_command("EcaLogs", function(opts)
161206
local Api = require("eca.api")
162207
local subcommand = opts.args and opts.args:match("%S+") or "show"

lua/eca/init.lua

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,8 +242,9 @@ function M.setup(opts)
242242
H.signs()
243243

244244
-- Initialize the ECA server with callbacks
245+
M.state = require("eca.state").new()
245246
M.server = Server.new()
246-
M.mediator = require("eca.mediator").new(M.server)
247+
M.mediator = require("eca.mediator").new(M.server, M.state)
247248
-- Start server automatically in background
248249
vim.defer_fn(function()
249250
M.server:start()

lua/eca/mediator.lua

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
---@class eca.Mediator
22
---@field server eca.Server
3+
---@field state eca.State
34
local mediator = {}
45

56
---@param server eca.Server
7+
---@param state eca.State
68
---@return eca.Mediator
7-
function mediator.new(server)
9+
function mediator.new(server, state)
810
return setmetatable({
911
server = server,
12+
state = state,
1013
}, { __index = mediator })
1114
end
1215

@@ -23,4 +26,44 @@ function mediator:send(method, params, callback)
2326
self.server:send_request(method, params, callback)
2427
end
2528

29+
function mediator:selected_behavior()
30+
return self.state.config.behaviors.selected
31+
end
32+
33+
function mediator:selected_model()
34+
return self.state.config.models.selected
35+
end
36+
37+
function mediator:tokens_session()
38+
return self.state.usage.tokens.session
39+
end
40+
41+
function mediator:tokens_limit()
42+
return self.state.usage.tokens.limit
43+
end
44+
45+
function mediator:costs_session()
46+
return self.state.usage.costs.session
47+
end
48+
49+
function mediator:status_state()
50+
return self.state.status.state
51+
end
52+
53+
function mediator:status_text()
54+
return self.state.status.text
55+
end
56+
57+
function mediator:mcps()
58+
local mcps = {}
59+
60+
for _, tool in pairs(self.state.tools) do
61+
if tool.type == "mcp" then
62+
table.insert(mcps, tool)
63+
end
64+
end
65+
66+
return mcps
67+
end
68+
2669
return mediator

lua/eca/observer.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
local observer = {}
22

3-
---@type { [integer]: fun(message: table) }
3+
---@type { [string]: fun(message: table) }
44
local subscriptions = {}
55

6-
---@param id integer
6+
---@param id string
77
---@param on_update fun(message: table)
88
function observer.subscribe(id, on_update)
99
subscriptions[id] = on_update

lua/eca/server.lua

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ local Logger = require("eca.logger")
1313
---@field on_stop function Callback when the server stops
1414
---Called when a notification is received(message without an ID)
1515
---@field on_notification fun(server: eca.Server, message: table)
16-
---@field capabilities eca.ServerCapabilities Server capabilities
1716
---@field private path_finder eca.PathFinder Server path finder
1817
---@field pending_requests {id: fun(err, data)} -- outgoing requests with callbacks
1918
local M = {}
@@ -50,7 +49,6 @@ function M.new(opts)
5049
path_finder = opts.path_finder,
5150
messages = {},
5251
pending_requests = {},
53-
capabilities = {},
5452
initialized = false,
5553
next_id = 0,
5654
}, { __index = M })
@@ -67,7 +65,7 @@ local function on_stdout(server)
6765
if #message.content ~= message.content_length then
6866
return
6967
end
70-
table.insert(messages, message)
68+
table.insert(server.messages, message)
7169
local msg = vim.json.decode(message.content)
7270
server:handle_message(msg)
7371
end)
@@ -171,20 +169,18 @@ function M:initialize()
171169
},
172170
},
173171
workspaceFolders = workspace_folders,
174-
}, function(err, result)
172+
}, function(err, _)
175173
if err then
176174
Logger.notify("Could not initialize server: " .. err, vim.log.levels.ERROR)
177175
return
178176
end
179-
if result then
180-
self.capabilities = result
181-
end
182177

183178
self:send_notification("initialized", {})
184179

185180
if self.on_initialize then
186181
self.on_initialize()
187182
end
183+
self.initialized = true
188184
end)
189185
end
190186

@@ -259,6 +255,7 @@ function M:send_request(method, params, callback)
259255
end
260256

261257
local json = vim.json.encode(message)
258+
table.insert(self.messages, { content = json, content_length = #json })
262259
local content = string.format("Content-Length: %d\r\n\r\n%s", #json, json)
263260
self.process:write(content)
264261
end

0 commit comments

Comments
 (0)