Refactor settings management to use SettingsDefaultsManager

- Introduced SettingsDefaultsManager to centralize default settings and loading logic.
- Updated context-generator, SDKAgent, SettingsRoutes, and worker-utils to utilize the new manager for loading settings.
- Removed redundant code for reading settings from files and environment variables.
- Ensured fallback to default values when settings file is missing or invalid.
This commit is contained in:
Alex Newman
2025-12-07 22:15:26 -05:00
parent 9cb4b9d02a
commit f494d3b168
13 changed files with 312 additions and 275 deletions
+1 -1
View File
@@ -1,2 +1,2 @@
#!/usr/bin/env node
import D from"path";import{stdin as c}from"process";import{execSync as l}from"child_process";import w from"path";import{homedir as h}from"os";import{existsSync as R,readFileSync as x}from"fs";import{join as e,dirname as f,basename as T}from"path";import{homedir as p}from"os";import{fileURLToPath as g}from"url";function _(){return typeof __dirname<"u"?__dirname:f(g(import.meta.url))}var v=_(),n=process.env.CLAUDE_MEM_DATA_DIR||e(p(),".claude-mem"),i=process.env.CLAUDE_CONFIG_DIR||e(p(),".claude"),C=e(n,"archives"),b=e(n,"logs"),O=e(n,"trash"),U=e(n,"backups"),j=e(n,"settings.json"),M=e(n,"claude-mem.db"),W=e(n,"vector-db"),H=e(i,"settings.json"),L=e(i,"commands"),N=e(i,"CLAUDE.md");function m(){try{let t=w.join(h(),".claude-mem","settings.json");if(R(t)){let r=JSON.parse(x(t,"utf-8")),o=parseInt(r.env?.CLAUDE_MEM_WORKER_PORT,10);if(!isNaN(o))return o}}catch{}return parseInt(process.env.CLAUDE_MEM_WORKER_PORT||"37777",10)}async function S(t,r=1e4){let o=Date.now(),s=100;for(;Date.now()-o<r;)try{return l(`curl -s -f -m 1 "http://localhost:${t}/api/health" > /dev/null 2>&1`,{timeout:1e3}),!0}catch{await new Promise(a=>setTimeout(a,s))}return!1}async function u(t){let r=t?.cwd??process.cwd(),o=r?D.basename(r):"unknown-project",s=m();if(!await S(s))throw new Error(`Worker service not available on port ${s} after 10s. Try: npm run worker:restart`);let d=`http://localhost:${s}/api/context/inject?project=${encodeURIComponent(o)}`;return l(`curl -s "${d}"`,{encoding:"utf-8",timeout:5e3}).trim()}var E=process.argv.includes("--colors");if(c.isTTY||E)u(void 0).then(t=>{console.log(t),process.exit(0)});else{let t="";c.on("data",r=>t+=r),c.on("end",async()=>{let r=t.trim()?JSON.parse(t):void 0,o=await u(r);console.log(JSON.stringify({hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:o}})),process.exit(0)})}
import L from"path";import{stdin as u}from"process";import{execSync as l}from"child_process";import N from"path";import{homedir as R}from"os";import{join as r,dirname as f,basename as x}from"path";import{homedir as T}from"os";import{fileURLToPath as g}from"url";function A(){return typeof __dirname<"u"?__dirname:f(g(import.meta.url))}var v=A(),n=process.env.CLAUDE_MEM_DATA_DIR||r(T(),".claude-mem"),E=process.env.CLAUDE_CONFIG_DIR||r(T(),".claude"),k=r(n,"archives"),b=r(n,"logs"),W=r(n,"trash"),F=r(n,"backups"),H=r(n,"settings.json"),X=r(n,"claude-mem.db"),B=r(n,"vector-db"),V=r(E,"settings.json"),j=r(E,"commands"),G=r(E,"CLAUDE.md");import{readFileSync as d,existsSync as M}from"fs";var C=["bugfix","feature","refactor","discovery","decision","change"],D=["how-it-works","why-it-exists","what-changed","problem-solution","gotcha","pattern","trade-off"];var p=C.join(","),S=D.join(",");var _=class{static DEFAULTS={CLAUDE_MEM_MODEL:"claude-haiku-4-5",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_WORKER_PORT:"37777",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"true",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"true",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"true",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES:p,CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS:S,CLAUDE_MEM_CONTEXT_FULL_COUNT:"5",CLAUDE_MEM_CONTEXT_FULL_FIELD:"narrative",CLAUDE_MEM_CONTEXT_SESSION_COUNT:"10",CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY:"true",CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE:"false"};static getAllDefaults(){return{...this.DEFAULTS}}static get(t){return process.env[t]||this.DEFAULTS[t]}static getInt(t){let o=this.get(t);return parseInt(o,10)}static getBool(t){return this.get(t)==="true"}static loadFromFile(t){if(!M(t))return this.getAllDefaults();let o=d(t,"utf-8"),i=JSON.parse(o).env||{},c={...this.DEFAULTS};for(let a of Object.keys(this.DEFAULTS))i[a]!==void 0&&(c[a]=i[a]);return c}};function m(){let e=N.join(R(),".claude-mem","settings.json"),t=_.loadFromFile(e);return parseInt(t.CLAUDE_MEM_WORKER_PORT,10)}async function U(e,t=1e4){let o=Date.now(),s=100;for(;Date.now()-o<t;)try{return l(`curl -s -f -m 1 "http://localhost:${e}/api/health" > /dev/null 2>&1`,{timeout:1e3}),!0}catch{await new Promise(i=>setTimeout(i,s))}return!1}async function O(e){let t=e?.cwd??process.cwd(),o=t?L.basename(t):"unknown-project",s=m();if(!await U(s))throw new Error(`Worker service not available on port ${s} after 10s. Try: npm run worker:restart`);let c=`http://localhost:${s}/api/context/inject?project=${encodeURIComponent(o)}`;return l(`curl -s "${c}"`,{encoding:"utf-8",timeout:5e3}).trim()}var I=process.argv.includes("--colors");if(u.isTTY||I)O(void 0).then(e=>{console.log(e),process.exit(0)});else{let e="";u.on("data",t=>e+=t),u.on("end",async()=>{let t=e.trim()?JSON.parse(e):void 0,o=await O(t);console.log(JSON.stringify({hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:o}})),process.exit(0)})}