|
184 | 184 | "walk through config parsing dynamic string contents if value is a string." |
185 | 185 | [config cwd] |
186 | 186 | (walk/postwalk |
187 | | - (fn [x] |
188 | | - (if (string? x) |
189 | | - (parse-dynamic-string x cwd config) |
190 | | - x)) |
191 | | - config)) |
| 187 | + (fn [x] |
| 188 | + (if (string? x) |
| 189 | + (parse-dynamic-string x cwd config) |
| 190 | + x)) |
| 191 | + config)) |
192 | 192 |
|
193 | | -(def initial-config (memoize #(parse-dynamic-string-values initial-config* nil))) |
| 193 | +(defn initial-config [] |
| 194 | + (parse-dynamic-string-values initial-config* (io/file "."))) |
194 | 195 |
|
195 | 196 | (def ^:private fallback-behavior "agent") |
196 | 197 |
|
|
216 | 217 | (alter-var-root config-dyn-var (constantly true)) |
217 | 218 | (logger/warn logger-tag "Error parsing config json:" (.getMessage e))))) |
218 | 219 |
|
219 | | -(defn ^:private config-from-envvar* [] |
| 220 | +(defn ^:private config-from-envvar [] |
220 | 221 | (some-> (System/getenv "ECA_CONFIG") |
221 | 222 | (safe-read-json-string (var *env-var-config-error*)) |
222 | 223 | (parse-dynamic-string-values (io/file ".")))) |
223 | 224 |
|
224 | | -(def ^:private config-from-envvar (memoize config-from-envvar*)) |
225 | | - |
226 | 225 | (defn ^:private config-from-custom* [] |
227 | 226 | (when-some [path @custom-config-file-path*] |
228 | 227 | (let [config-file (io/file path)] |
|
240 | 239 | (defn global-config-file ^File [] |
241 | 240 | (io/file (global-config-dir) "config.json")) |
242 | 241 |
|
243 | | -(defn ^:private config-from-global-file* [] |
| 242 | +(defn ^:private config-from-global-file [] |
244 | 243 | (let [config-file (global-config-file)] |
245 | 244 | (when (.exists config-file) |
246 | 245 | (some-> (safe-read-json-string (slurp config-file) (var *global-config-error*)) |
247 | 246 | (parse-dynamic-string-values (global-config-dir)))))) |
248 | 247 |
|
249 | | -(def ^:private config-from-global-file (memoize/ttl config-from-global-file* :ttl/threshold ttl-cache-config-ms)) |
250 | | - |
251 | | -(defn ^:private config-from-local-file* [roots] |
| 248 | +(defn ^:private config-from-local-file [roots] |
252 | 249 | (reduce |
253 | 250 | (fn [final-config {:keys [uri]}] |
254 | 251 | (merge |
|
261 | 258 | {} |
262 | 259 | roots)) |
263 | 260 |
|
264 | | -(def ^:private config-from-local-file (memoize/ttl config-from-local-file* :ttl/threshold ttl-cache-config-ms)) |
265 | | - |
266 | 261 | (def initialization-config* (atom {})) |
267 | 262 |
|
268 | 263 | (defn ^:private deep-merge [& maps] |
|
324 | 319 | :else m*))] |
325 | 320 | (normalize-map [] m))) |
326 | 321 |
|
327 | | -(def ^:private eca-config-normalization-rules |
| 322 | +(def ^:private normalization-rules |
328 | 323 | {:kebab-case |
329 | 324 | [[:providers]] |
330 | 325 | :stringfy |
|
349 | 344 | [:behavior :ANY :toolCall :approval :deny :ANY :argsMatchers] |
350 | 345 | [:otlp]]}) |
351 | 346 |
|
352 | | -(defn ^:private config-from-custom-or-default-location [pure-config? db] |
353 | | - (if-some [config-from-custom (config-from-custom)] |
354 | | - (when-not pure-config? config-from-custom) |
355 | | - (deep-merge |
356 | | - (when-not pure-config? (config-from-global-file)) |
357 | | - (when-not pure-config? (config-from-local-file (:workspace-folders db)))))) |
358 | | - |
359 | | -(defn all [db] |
| 347 | +(defn ^:private all* [db] |
360 | 348 | (let [initialization-config @initialization-config* |
361 | | - pure-config? (:pureConfig initialization-config)] |
362 | | - (deep-merge (initial-config) |
363 | | - (normalize-fields |
364 | | - eca-config-normalization-rules |
365 | | - (deep-merge initialization-config |
366 | | - (when-not pure-config? (config-from-envvar)) |
367 | | - (config-from-custom-or-default-location pure-config? db)))))) |
| 349 | + pure-config? (:pureConfig initialization-config) |
| 350 | + merge-config (fn [c1 c2] |
| 351 | + (deep-merge c1 (normalize-fields normalization-rules c2)))] |
| 352 | + (as-> {} $ |
| 353 | + (merge-config $ (initial-config)) |
| 354 | + (merge-config $ initialization-config) |
| 355 | + (merge-config $ (when-not pure-config? |
| 356 | + (config-from-envvar))) |
| 357 | + (if-let [custom-config (config-from-custom)] |
| 358 | + (merge-config $ (when-not pure-config? custom-config)) |
| 359 | + (-> $ |
| 360 | + (merge-config (when-not pure-config? (config-from-global-file))) |
| 361 | + (merge-config (when-not pure-config? (config-from-local-file (:workspace-folders db))))))))) |
| 362 | + |
| 363 | +(def all (memoize/ttl all* :ttl/threshold ttl-cache-config-ms)) |
368 | 364 |
|
369 | 365 | (defn validation-error [] |
370 | 366 | (cond |
|
440 | 436 |
|
441 | 437 | (defn update-global-config! [config] |
442 | 438 | (let [global-config-file (global-config-file) |
443 | | - current-config (normalize-fields eca-config-normalization-rules (config-from-global-file)) |
| 439 | + current-config (normalize-fields normalization-rules (config-from-global-file)) |
444 | 440 | new-config (deep-merge current-config |
445 | | - (normalize-fields eca-config-normalization-rules config)) |
| 441 | + (normalize-fields normalization-rules config)) |
446 | 442 | new-config-json (json/generate-string new-config {:pretty true})] |
447 | 443 | (io/make-parents global-config-file) |
448 | 444 | (spit global-config-file new-config-json))) |
0 commit comments