| 
1 | 1 | (ns jsonrpc.server  | 
2 | 2 |   (:refer-clojure :exclude [run!])  | 
3 | 3 |   (:require  | 
4 |  | -    [babashka.fs :as fs]  | 
5 |  | -    [cheshire.core :as json]  | 
6 |  | -    [clojure.core :as c]  | 
7 |  | -    [clojure.core.async :as async]  | 
8 |  | -    [clojure.pprint :as pprint]  | 
9 |  | -    [clojure.string :as string]  | 
10 |  | -    docker  | 
11 |  | -    git  | 
12 |  | -    graph  | 
13 |  | -    jsonrpc  | 
14 |  | -    [jsonrpc.db :as db]  | 
15 |  | -    [jsonrpc.logger :as logger]  | 
16 |  | -    [jsonrpc.producer :as producer]  | 
17 |  | -    [lsp4clj.coercer :as coercer]  | 
18 |  | -    [lsp4clj.io-chan :as io-chan]  | 
19 |  | -    [lsp4clj.io-server :refer [stdio-server]]  | 
20 |  | -    [lsp4clj.server :as lsp.server]  | 
21 |  | -    [promesa.core :as p]  | 
22 |  | -    shutdown  | 
23 |  | -    state  | 
24 |  | -    [taoensso.timbre :as timbre]  | 
25 |  | -    [taoensso.timbre.appenders.core :as appenders]  | 
26 |  | -    tools  | 
27 |  | -    user-loop  | 
28 |  | -    volumes)  | 
 | 4 | +   [babashka.fs :as fs]  | 
 | 5 | +   [cheshire.core :as json]  | 
 | 6 | +   [clj-yaml.core :as yaml]  | 
 | 7 | +   [clojure.core :as c]  | 
 | 8 | +   [clojure.core.async :as async]  | 
 | 9 | +   [clojure.pprint :as pprint]  | 
 | 10 | +   [clojure.string :as string]  | 
 | 11 | +   docker  | 
 | 12 | +   git  | 
 | 13 | +   graph  | 
 | 14 | +   jsonrpc  | 
 | 15 | +   [jsonrpc.db :as db]  | 
 | 16 | +   [jsonrpc.logger :as logger]  | 
 | 17 | +   [jsonrpc.producer :as producer]  | 
 | 18 | +   [lsp4clj.coercer :as coercer]  | 
 | 19 | +   [lsp4clj.io-chan :as io-chan]  | 
 | 20 | +   [lsp4clj.io-server :refer [stdio-server]]  | 
 | 21 | +   [lsp4clj.server :as lsp.server]  | 
 | 22 | +   [promesa.core :as p]  | 
 | 23 | +   shutdown  | 
 | 24 | +   state  | 
 | 25 | +   [taoensso.timbre :as timbre]  | 
 | 26 | +   [taoensso.timbre.appenders.core :as appenders]  | 
 | 27 | +   tools  | 
 | 28 | +   user-loop  | 
 | 29 | +   volumes)  | 
29 | 30 |   (:gen-class))  | 
30 | 31 | 
 
  | 
31 | 32 | (set! *warn-on-reflection* true)  | 
 | 
183 | 184 |       :is-error false})))  | 
184 | 185 | 
 
  | 
185 | 186 | (defmethod lsp.server/receive-request "docker/prompts/register" [_ {:keys [db* id]} params]  | 
186 |  | -  ;; supports only git refs  | 
187 |  | -  (lsp.server/discarding-stdout  | 
188 |  | -   (db/add (merge @db* params))))  | 
 | 187 | +  (logger/info "docker/prompts/register"))  | 
189 | 188 | 
 
  | 
190 | 189 | (defmethod lsp.server/receive-request "docker/prompts/run"  | 
191 | 190 |   [_ {:keys [db* id] :as components} {:keys [thread-id] {:keys [file content uri]} :prompts :as params}]  | 
 | 
289 | 288 |   (publish-docker-notify [_ method params]  | 
290 | 289 |     (lsp.server/send-notification server method params)))  | 
291 | 290 | 
 
  | 
 | 291 | +(def registry "/prompts/registry.yaml")  | 
 | 292 | + | 
292 | 293 | (defn run-server! [{:keys [trace-level] :or {trace-level "off"} :as opts}]  | 
293 | 294 |   (lsp.server/discarding-stdout  | 
294 | 295 |    (let [timbre-logger (->TimbreLogger)  | 
 | 
314 | 315 |                      :server server}]  | 
315 | 316 |      (swap! db* merge {:log-path log-path} (dissoc opts :in))  | 
316 | 317 |      ;; register static prompts  | 
317 |  | -     (when (:register opts)  | 
318 |  | -       (try  | 
319 |  | -         (db/add opts)  | 
320 |  | -         (catch Throwable t  | 
321 |  | -           (logger/error t))))  | 
322 |  | -     ;; register dynamic prompts  | 
323 |  | -     (when (fs/exists? (fs/file "/prompts/registry.yaml"))  | 
324 |  | -       (db/merge-dynamic-prompts (assoc opts :registry-content (slurp "/prompts/registry.yaml"))))  | 
 | 318 | +     (db/add-refs  | 
 | 319 | +       (concat  | 
 | 320 | +         (->> (:register opts)  | 
 | 321 | +              (map (fn [ref] [:static ref])))  | 
 | 322 | +         ;; register dynamic prompts  | 
 | 323 | +         (when (fs/exists? (fs/file registry))  | 
 | 324 | +           (db/registry-refs registry))))  | 
325 | 325 |      ;; watch dynamic prompts in background  | 
326 | 326 |      (async/thread  | 
327 | 327 |        (let [{x :container}  | 
 | 
334 | 334 |                 (let [[_dir _event f] (string/split line #"\s+")]  | 
335 | 335 |                   (when (= f "registry.yaml")  | 
336 | 336 |                     (try  | 
337 |  | -                      (db/merge-dynamic-prompts (assoc opts :registry-content (slurp "/prompts/registry.yaml")))  | 
 | 337 | +                      (db/add-refs (logger/trace (into [] (db/registry-refs registry))))  | 
338 | 338 |                       (producer/publish-tool-list-changed producer {})  | 
339 | 339 |                       (producer/publish-prompt-list-changed producer {})  | 
340 | 340 |                       (catch Throwable t  | 
 | 
0 commit comments