|
68 | 68 | (logger/info "ping") |
69 | 69 | {}) |
70 | 70 |
|
71 | | -(defmethod lsp.server/receive-request "initialize" [_ {:keys [db*]} params] |
72 | | - (logger/info "Initializing " params) |
| 71 | +(defmethod lsp.server/receive-request "initialize" [_ {:keys [db* server-id]} params] |
| 72 | + (logger/info (format "Initializing server id %d %s" server-id params)) |
73 | 73 |
|
74 | 74 | ;; merges client-info capabilities and client protocol-version |
75 | | - (swap! db* merge params) |
| 75 | + (swap! db* assoc-in [:servers server-id] params) |
76 | 76 | {:protocol-version "2024-11-05" |
77 | 77 | :capabilities {:prompts {:listChanged true} |
78 | 78 | :tools {:listChanged true} |
79 | 79 | :resources {}} |
80 | 80 | :server-info {:name "docker-mcp-server" |
81 | 81 | :version "0.0.1"}}) |
82 | 82 |
|
83 | | -(defmethod lsp.server/receive-notification "notifications/initialized" [_ _ _] |
84 | | - (logger/info "Initialized!")) |
| 83 | +(defmethod lsp.server/receive-notification "notifications/initialized" [_ {:keys [db* server server-id]} _] |
| 84 | + (logger/info "Initialized! " (-> @db* :servers (get server-id))) |
| 85 | + (lsp.server/discarding-stdout |
| 86 | + (when (get-in @db* [:servers server-id :capabilities :roots]) |
| 87 | + (let [response (lsp.server/deref-or-cancel |
| 88 | + (lsp.server/send-request server "roots/list" {}) |
| 89 | + 10e3 ::timeout)] |
| 90 | + (cond |
| 91 | + ;; |
| 92 | + (= ::timeout response) |
| 93 | + (logger/error "No response from client for workspace/inlayHint/refresh") |
| 94 | + ;; |
| 95 | + (:roots response) |
| 96 | + (do |
| 97 | + (logger/info "client sent roots " (:roots response)) |
| 98 | + (swap! db* update-in [:servers server-id] (fnil merge {}) response)) |
| 99 | + ;; |
| 100 | + :else |
| 101 | + (logger/warn "unexpected response " response)))))) |
85 | 102 |
|
86 | 103 | ; level is debug info notice warning error critical alert emergency |
87 | 104 | (defmethod lsp.server/receive-request "logging/setLevel" [_ {:keys [db*]} {:keys [level]}] |
|
216 | 233 | " params |
217 | 234 | db* - uses mcp.prompts/registry and host-dir |
218 | 235 | params - tools/call mcp params" |
219 | | - [{:keys [db*] :as components} params] |
| 236 | + [{:keys [db* server-id] :as components} params] |
220 | 237 | (volumes/with-volume |
221 | 238 | (fn [thread-id] |
222 | 239 | ;; TODO non-mcp tool calls are maps of content, role tool_call_id |
|
235 | 252 | :thread-id thread-id}) |
236 | 253 | ;; tool calls are functions, which are arguments,name maps, and ids |
237 | 254 | ;; mcp tool call params are also maps of name, and arguments |
238 | | - ;; TODO add the config parameters for just the registry entry that defines the tool |
239 | 255 | [{:function (update |
240 | 256 | params :arguments |
241 | 257 | (fn [arguments] |
242 | 258 | (logger/trace |
243 | | - (-> arguments |
244 | | - (merge (db/parameter-values (:name params))) |
245 | | - (json/generate-string))))) |
| 259 | + (-> arguments |
| 260 | + (merge |
| 261 | + (db/parameter-values (:name params)) |
| 262 | + (select-keys (-> @db* :servers (get server-id)) [:roots])) |
| 263 | + (json/generate-string))))) |
246 | 264 | :id "1"}]) |
247 | 265 | (async/reduce conj []) |
248 | 266 | (async/<!!))] |
|
328 | 346 | (when (fs/exists? (fs/file registry)) |
329 | 347 | (db/registry-refs registry))))) |
330 | 348 |
|
| 349 | +(def server-counter (atom 0)) |
| 350 | + |
331 | 351 | (defn server-context |
332 | 352 | "create chan server options for any io chan server that we build" |
333 | 353 | [{:keys [trace-level] :or {trace-level "off"} :as opts}] |
|
361 | 381 | {:db* db* |
362 | 382 | :logger timbre-logger |
363 | 383 | :producer producer |
| 384 | + :server-id (swap! server-counter inc) |
364 | 385 | :server server}))} |
365 | 386 | (when (:mcp opts) |
366 | 387 | {:in-chan-factory io-chan/mcp-input-stream->input-chan |
|
0 commit comments