@ai-cortex/daemon 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -57,7 +57,7 @@ ${r.length>16e3?r.slice(0,16e3)+`
57
57
  ${et.bold(i.name)} \u2014 ${i.description}`),console.log(`
58
58
  Usage: ${i.usage}
59
59
  `);return}await i.run(a)}return{register:e,run:n}}import Y from"chalk";var Ft={name:"help",description:"Show this help",usage:"cortex help",run:async()=>{console.log(""),console.log(Y.bold("Cortex")+Y.dim(" \u2014 makes your AI coding agents smarter")),console.log(""),console.log(Y.bold("Usage:")),console.log(" cortex Start Cortex (foreground)"),console.log(" cortex claude Start Cortex + launch Claude Code"),console.log(" cortex <command> Run a specific command"),console.log(""),console.log(Y.bold("Commands:")),console.log(" start [-d] [--port N] Start daemon (foreground, or -d for background)"),console.log(" claude Start Cortex + launch Claude Code"),console.log(" stop Stop the running daemon"),console.log(" status Show daemon status"),console.log(" setup Interactive setup wizard"),console.log(" brain Manage brain entries and sources"),console.log(" features Enable/disable features"),console.log(" logs View session logs"),console.log(" config Show/edit configuration (try: cortex config edit)"),console.log(" help Show this help"),console.log(""),console.log(Y.bold("Quick start:")),console.log(Y.dim(" cortex setup First-time setup (ports, model, Claude Code integration)")),console.log(Y.dim(" cortex claude Start everything and launch Claude Code")),console.log(""),console.log(Y.dim('Run "cortex <command> --help" for details on a specific command.')),console.log("")}};import{spawn as ji}from"node:child_process";import{fileURLToPath as Bi}from"node:url";import{dirname as Ii,join as Ni}from"node:path";import Ct from"chalk";import{readFileSync as Nr,writeFileSync as Fr,unlinkSync as Or}from"node:fs";import{join as Lr}from"node:path";import{homedir as _r,platform as Dr}from"node:os";var tt=Lr(_r(),".cortex","cortex.pid");function ue(t){let e={encoding:"utf-8"};Dr()!=="win32"&&(e.mode=384),Fr(tt,String(t),e)}function qr(){try{let t=Nr(tt,"utf-8").trim(),e=Number(t);return Number.isFinite(e)?e:null}catch{return null}}function Ee(t){try{return process.kill(t,0),!0}catch{return!1}}function L(){let t=qr();return t===null?{running:!1,pid:null}:Ee(t)?{running:!0,pid:t}:(de(),{running:!1,pid:null})}function de(){try{Or(tt)}catch{}}import{createHmac as Ae}from"node:crypto";import{existsSync as Lt,readFileSync as Ur,writeFileSync as Hr,mkdirSync as Wr}from"node:fs";import{join as _t}from"node:path";import{homedir as Dt}from"node:os";import Ot from"chalk";var nt=_t(Dt(),".cortex"),ot=_t(nt,"license"),Pe="cx-v1-2026";function Jr(){let t=Ut(),e=Ht(t);return`CX-${t}-${e}`}function zr(){if(!Lt(ot))return Kr();try{let t=Ur(ot,"utf-8").trim();return Xr(t)}catch{return!1}}function qt(){zr()||(console.error(Ot.red("Invalid or corrupted license.")),console.error(Ot.dim("Run `cortex setup` to reactivate, or contact support.")),process.exit(1))}function Kr(){try{Lt(nt)||Wr(nt,{recursive:!0});let t=Jr();return Hr(ot,t+`
60
- `,"utf-8"),!0}catch{return!1}}function Ut(){let t=`${Dt()}:${process.platform}:${process.arch}`;return Ae("sha256",Pe).update(t).digest("hex").slice(0,12)}function Ht(t){return Ae("sha256",Pe+"-sig").update(t).digest("hex").slice(0,16)}function Xr(t){let e=t.split("-");if(e.length!==3||e[0]!=="CX")return!1;let[,n,o]=e;if(n!==Ut())return!1;let r=Ht(n);if(o.length!==r.length)return!1;let s=Buffer.from(o),i=Buffer.from(r);return s.length===i.length&&Ae("sha256",Pe).update(s).digest().equals(Ae("sha256",Pe).update(i).digest())}var Mo={name:"start",description:"Start the Cortex daemon",usage:"cortex start [-d] [--port N]",run:async t=>{qt();let{running:e,pid:n}=L();if(e){console.log(Ct.yellow(`Cortex is already running (PID ${n}).`));return}let o=t.includes("-d")||t.includes("--daemon"),r=t.indexOf("--port"),s=r!==-1?t[r+1]:void 0;if(o){let i=Ii(Bi(import.meta.url)),a=Ni(i,"../start.js"),g=process.argv.some(c=>/(?:^|[\\/])tsx(?:[\\/.]|$)/.test(c))?["--import","tsx",a]:[a],d={...process.env};s&&(d.CORTEX_PORT=s);let u=ji(process.execPath,g,{detached:!0,stdio:"ignore",env:d});u.unref(),u.pid?(ue(u.pid),console.log(Ct.green(`Cortex daemon started (PID ${u.pid}).`))):(console.log(Ct.red("Failed to start daemon.")),process.exit(1))}else{s&&(process.env.CORTEX_PORT=s),ue(process.pid);try{let{startCortex:i}=await Promise.resolve().then(()=>($o(),Ro));await i()}finally{de()}}}};import wt from"chalk";var jo={name:"stop",description:"Stop the running daemon",usage:"cortex stop",run:async()=>{let{running:t,pid:e}=L();if(!t||e===null){console.log(wt.yellow("Cortex is not running."));return}console.log(wt.dim(`Stopping Cortex (PID ${e})...`));try{process.kill(e,"SIGTERM")}catch{}let n=5e3,o=200,r=0;for(;r<n&&Ee(e);)await new Promise(s=>setTimeout(s,o)),r+=o;if(Ee(e)){try{process.kill(e,"SIGKILL")}catch{}await new Promise(s=>setTimeout(s,300))}de(),console.log(wt.green("Cortex stopped."))}};var _o={name:"setup",description:"Interactive setup wizard",usage:"cortex setup",run:async()=>{let{runWizard:t}=await Promise.resolve().then(()=>(kt(),Lo));await t()}};q();mt();import U from"chalk";var Do=["pruning","injection","fingerprinting","matching","logging","dashboard","verbose","agentTracking"],qo={name:"features",description:"Enable/disable Cortex features",usage:"cortex features <list|enable|disable> [name]",run:async t=>{let e=t[0]??"list",n=R(),o=new ae(n);if(e==="list"){console.log(""),console.log(U.bold("Feature Status Notes")),console.log(U.dim("\u2500".repeat(45)));for(let r of o.list()){let s=r.enabled?U.green("\u2713 ON "):U.red("\u2717 OFF"),i=r.reason?U.dim(` (${r.reason})`):"";console.log(` ${r.name.padEnd(16)} ${s}${i}`)}console.log("");return}if(e==="enable"||e==="disable"){let r=t[1];(!r||!Do.includes(r))&&(console.log(U.red(`Invalid feature. Valid: ${Do.join(", ")}`)),process.exit(1)),e==="enable"?(o.enable(r),console.log(U.green(`Feature "${r}" enabled.`))):(o.disable(r),console.log(U.green(`Feature "${r}" disabled.`)));let{running:s}=L();if(s)try{await fetch(`http://localhost:${n.dashboardPort}/api/features/${r}/toggle`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({enabled:e==="enable"})})}catch{console.log(U.dim("(Daemon not reachable \u2014 config saved, will apply on next start.)"))}return}console.log(U.red(`Unknown subcommand: ${e}`)),console.log(U.dim("Usage: cortex features <list|enable|disable> [name]"))}};import{readdirSync as Ki,readFileSync as Xi}from"node:fs";import{join as Uo}from"node:path";import H from"chalk";q();var Ho={name:"logs",description:"View session logs",usage:"cortex logs [-n N] [--json] [--follow]",run:async t=>{let e=t.includes("--json"),n=t.includes("--follow"),o=t.indexOf("-n"),r=o!==-1?Number(t[o+1]):20,s=R(),i=Uo(s.dataDir,"logs");if(n){let{running:d}=L();if(d){let u=new AbortController;process.once("SIGINT",()=>u.abort()),process.once("SIGTERM",()=>u.abort());try{let c=await fetch(`http://localhost:${s.dashboardPort}/api/logs/stream`,{signal:u.signal});if(c.body){let h=c.body.getReader(),f=new TextDecoder;for(;;){let{done:b,value:y}=await h.read();if(b)break;process.stdout.write(f.decode(y))}}}catch(c){if(c.name==="AbortError")console.log(H.dim(`
60
+ `,"utf-8"),!0}catch{return!1}}function Ut(){let t=`${Dt()}:${process.platform}:${process.arch}`;return Ae("sha256",Pe).update(t).digest("hex").slice(0,12)}function Ht(t){return Ae("sha256",Pe+"-sig").update(t).digest("hex").slice(0,16)}function Xr(t){let e=t.split("-");if(e.length!==3||e[0]!=="CX")return!1;let[,n,o]=e;if(n!==Ut())return!1;let r=Ht(n);if(o.length!==r.length)return!1;let s=Buffer.from(o),i=Buffer.from(r);return s.length===i.length&&Ae("sha256",Pe).update(s).digest().equals(Ae("sha256",Pe).update(i).digest())}var Mo={name:"start",description:"Start the Cortex daemon",usage:"cortex start [-d] [--port N]",run:async t=>{qt();let{running:e,pid:n}=L();if(e){console.log(Ct.yellow(`Cortex is already running (PID ${n}).`));return}let o=t.includes("-d")||t.includes("--daemon"),r=t.indexOf("--port"),s=r!==-1?t[r+1]:void 0;if(o){let i=Ii(Bi(import.meta.url)),a=Ni(i,"../start.js"),g=process.argv.some(c=>/(?:^|[\\/])tsx(?:[\\/.]|$)/.test(c))?["--import","tsx",a]:[a],d={...process.env};s&&(d.CORTEX_PORT=s);let u=ji(process.execPath,g,{detached:!0,stdio:"ignore",env:d});u.unref(),u.pid?(ue(u.pid),console.log(Ct.green(`Cortex daemon started (PID ${u.pid}).`))):(console.log(Ct.red("Failed to start daemon.")),process.exit(1))}else{s&&(process.env.CORTEX_PORT=s),ue(process.pid);try{let{startCortex:i}=await Promise.resolve().then(()=>($o(),Ro));await i()}catch{de()}}}};import wt from"chalk";var jo={name:"stop",description:"Stop the running daemon",usage:"cortex stop",run:async()=>{let{running:t,pid:e}=L();if(!t||e===null){console.log(wt.yellow("Cortex is not running."));return}console.log(wt.dim(`Stopping Cortex (PID ${e})...`));try{process.kill(e,"SIGTERM")}catch{}let n=5e3,o=200,r=0;for(;r<n&&Ee(e);)await new Promise(s=>setTimeout(s,o)),r+=o;if(Ee(e)){try{process.kill(e,"SIGKILL")}catch{}await new Promise(s=>setTimeout(s,300))}de(),console.log(wt.green("Cortex stopped."))}};var _o={name:"setup",description:"Interactive setup wizard",usage:"cortex setup",run:async()=>{let{runWizard:t}=await Promise.resolve().then(()=>(kt(),Lo));await t()}};q();mt();import U from"chalk";var Do=["pruning","injection","fingerprinting","matching","logging","dashboard","verbose","agentTracking"],qo={name:"features",description:"Enable/disable Cortex features",usage:"cortex features <list|enable|disable> [name]",run:async t=>{let e=t[0]??"list",n=R(),o=new ae(n);if(e==="list"){console.log(""),console.log(U.bold("Feature Status Notes")),console.log(U.dim("\u2500".repeat(45)));for(let r of o.list()){let s=r.enabled?U.green("\u2713 ON "):U.red("\u2717 OFF"),i=r.reason?U.dim(` (${r.reason})`):"";console.log(` ${r.name.padEnd(16)} ${s}${i}`)}console.log("");return}if(e==="enable"||e==="disable"){let r=t[1];(!r||!Do.includes(r))&&(console.log(U.red(`Invalid feature. Valid: ${Do.join(", ")}`)),process.exit(1)),e==="enable"?(o.enable(r),console.log(U.green(`Feature "${r}" enabled.`))):(o.disable(r),console.log(U.green(`Feature "${r}" disabled.`)));let{running:s}=L();if(s)try{await fetch(`http://localhost:${n.dashboardPort}/api/features/${r}/toggle`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({enabled:e==="enable"})})}catch{console.log(U.dim("(Daemon not reachable \u2014 config saved, will apply on next start.)"))}return}console.log(U.red(`Unknown subcommand: ${e}`)),console.log(U.dim("Usage: cortex features <list|enable|disable> [name]"))}};import{readdirSync as Ki,readFileSync as Xi}from"node:fs";import{join as Uo}from"node:path";import H from"chalk";q();var Ho={name:"logs",description:"View session logs",usage:"cortex logs [-n N] [--json] [--follow]",run:async t=>{let e=t.includes("--json"),n=t.includes("--follow"),o=t.indexOf("-n"),r=o!==-1?Number(t[o+1]):20,s=R(),i=Uo(s.dataDir,"logs");if(n){let{running:d}=L();if(d){let u=new AbortController;process.once("SIGINT",()=>u.abort()),process.once("SIGTERM",()=>u.abort());try{let c=await fetch(`http://localhost:${s.dashboardPort}/api/logs/stream`,{signal:u.signal});if(c.body){let h=c.body.getReader(),f=new TextDecoder;for(;;){let{done:b,value:y}=await h.read();if(b)break;process.stdout.write(f.decode(y))}}}catch(c){if(c.name==="AbortError")console.log(H.dim(`
61
61
  Stream closed.`));else{console.log(H.yellow("Stream failed. Use without --follow to read log files."));return}}return}console.log(H.yellow("Daemon not running. Use without --follow to read log files."));return}let a;try{a=Ki(i).filter(d=>d.endsWith(".jsonl")).sort()}catch{console.log(H.dim("No log files found."));return}if(a.length===0){console.log(H.dim("No log files found."));return}let l=[];for(let d=a.length-1;d>=0&&l.length<r;d--){let u=Uo(i,a[d]),c=Xi(u,"utf-8").trim().split(`
62
62
  `).filter(Boolean);l.unshift(...c)}let g=l.slice(-r);if(e){for(let d of g)console.log(d);return}console.log("");for(let d of g)try{let u=JSON.parse(d),c=u.timestamp?.slice(11,19)??"??:??:??",h=u.injected?H.green("injected"):H.dim("no-match"),f=u.processingTimeMs?`${u.processingTimeMs}ms`:"",b=u.topMatchEntry?H.cyan(u.topMatchEntry):"";console.log(` ${H.dim(c)} #${u.requestCount??"?"} ${h} ${b} ${H.dim(f)}`)}catch{console.log(H.dim(d))}console.log("")}};q();import{writeFileSync as Qi}from"node:fs";import{join as ea}from"node:path";import{homedir as ta}from"node:os";import{stringify as Zo}from"yaml";import V from"chalk";var G=class{constructor(e,n){this.name=e;this.fields=n}cursorIndex=0;get focusedField(){return this.fields[this.cursorIndex]}getField(e){return this.fields.find(n=>n.key===e)}handleKey(e){let n=this.focusedField;if(n?.editing){n.handleKey(e);return}if(e.name==="down"||e.name==="j"){this.moveCursor(1);return}if(e.name==="up"||e.name==="k"){this.moveCursor(-1);return}n&&n.handleKey(e)}moveCursor(e){if(this.fields.length===0)return;let n=this.cursorIndex;for(let o=0;o<this.fields.length;o++){n=(n+e+this.fields.length)%this.fields.length;let r=this.fields[n];if(r.value!==null||r.editing)break}this.cursorIndex=n}render(){return this.fields.map((e,n)=>e.render(n===this.cursorIndex))}};import _ from"chalk";var Gi=28;function Ve(t){return t.padEnd(Gi)}var A=class{constructor(e,n,o,r){this.key=e;this.label=n;this.value=o;this.note=r}editing=!1;render(e){let n=e?_.cyan("\u25BA "):" ",o=this.value?_.green("\u25CF ON "):_.red("\u25CB OFF"),r=this.note?_.dim(` ${this.note}`):"";return`${n}${Ve(this.label)} ${o}${r}`}handleKey(e){e.name==="space"&&(this.value=!this.value)}},F=class{constructor(e,n,o){this.key=e;this.label=n;this.value=o;this.savedValue=o}editing=!1;editBuffer="";savedValue;render(e){let n=e?_.cyan("\u25BA "):" ",o=this.editing?_.cyan(this.editBuffer+"\u2588"):String(this.value);return`${n}${Ve(this.label)} ${o}`}handleKey(e){if(!this.editing){e.name==="return"&&(this.editing=!0,this.savedValue=this.value,this.editBuffer="");return}if(e.name==="return"){let n=Number(this.editBuffer);this.value=this.editBuffer.length>0&&Number.isFinite(n)?n:this.savedValue,this.editing=!1;return}if(e.name==="escape"){this.value=this.savedValue,this.editing=!1;return}if(e.name==="backspace"){this.editBuffer=this.editBuffer.slice(0,-1);return}if(e.sequence&&/^[0-9]$/.test(e.sequence)){this.editBuffer+=e.sequence;return}e.sequence==="."&&!this.editBuffer.includes(".")&&(this.editBuffer+=".")}},Ge=class{constructor(e,n,o){this.key=e;this.label=n;this.value=o;this.savedValue=o}editing=!1;editBuffer="";savedValue;render(e){let n=e?_.cyan("\u25BA "):" ",o=this.editing?_.cyan(this.editBuffer+"\u2588"):_.dim(this.value);return`${n}${Ve(this.label)} ${o}`}handleKey(e){if(!this.editing){e.name==="return"&&(this.editing=!0,this.savedValue=this.value,this.editBuffer="");return}if(e.name==="return"){this.value=this.editBuffer.length>0?this.editBuffer:this.savedValue,this.editing=!1;return}if(e.name==="escape"){this.value=this.savedValue,this.editing=!1;return}if(e.name==="backspace"){this.editBuffer=this.editBuffer.slice(0,-1);return}e.sequence&&e.sequence.length===1&&e.sequence>=" "&&(this.editBuffer+=e.sequence)}},te=class{constructor(e,n){this.key=e;this.label=n}editing=!1;value=null;render(e){return _.bold.dim(` \u2500\u2500 ${this.label} \u2500\u2500`)}handleKey(e){}},we=class{constructor(e,n,o){this.key=e;this.label=n;this.value=o}editing=!1;render(e){return`${e?_.cyan("\u25BA "):" "}${Ve(this.label)} ${_.dim(this.value)}`}handleKey(e){}};Ke();function Wo(t){let e=new G("Server",[new F("proxyPort","Proxy Port",t.proxyPort),new Ge("targetBaseUrl","Target API URL",t.targetBaseUrl),new F("dashboardPort","Dashboard Port",t.dashboardPort),new we("dataDir","Data Dir",t.dataDir),new A("verbose","Verbose",t.verbose)]),n=[{name:"pruning",label:"Pruning"},{name:"fingerprinting",label:"Fingerprinting",note:"required by matching"},{name:"matching",label:"Matching",note:"requires fingerprinting"},{name:"injection",label:"Injection",note:"requires matching"},{name:"logging",label:"Logging"},{name:"dashboard",label:"Dashboard"},{name:"verbose",label:"Verbose Output"}],o=new G("Features",n.map(c=>new A(`feat.${c.name}`,c.label,t.features[c.name],c.note))),r=t.brainSources.map(c=>new A(`brain.${c.name}`,`${c.name} (${c.path})`,c.enabled));r.length===0&&r.push(new we("brain.empty","Sources","No brain sources configured"));let s=new G("Brain",r),i=new G("Tuning",[new F("pruneThresholdTokens","Prune Threshold (tokens)",t.pruneThresholdTokens),new F("injectionConfidenceThreshold","Injection Confidence",t.injectionConfidenceThreshold),new F("contextPressureThreshold","Context Pressure",t.contextPressureThreshold)]),l=!!ze().statusLine?.command,g=t.statusline.elements,d=new G("Statusline",[new A("sl.enabled","Enabled in Claude Code",l,"edits ~/.claude/settings.json \u2014 next session"),new te("hdr.sl.elements","Elements"),new A("sl.cortexLabel","Cortex Label",g.cortexLabel),new A("sl.phrase","Dynamic Phrase",g.phrase),new A("sl.contextBar","Context Bar",g.contextBar),new A("sl.tokensSaved","Tokens Saved",g.tokensSaved),new A("sl.requests","Request Count",g.requests),new A("sl.injections","Injection Count",g.injections),new A("sl.lastMatch","Last Brain Match",g.lastMatch),new A("sl.agentInfo","Agent Info",g.agentInfo),new A("sl.confidence","Match Confidence",g.confidence),new A("sl.latency","Average Latency",g.latency)]),u=[e,o,s,i,d];if(t.agentTracking){let c=t.agentTracking,h=new G("Agents",[new A("feat.agentTracking","Agent Tracking",t.features.agentTracking??!1),new te("hdr.subagents","Subagents"),new A("at.sub.pruning","Pruning",c.subagents.pruning),new A("at.sub.fingerprinting","Fingerprinting",c.subagents.fingerprinting),new A("at.sub.matching","Matching",c.subagents.matching),new A("at.sub.injection","Injection",c.subagents.injection),new A("at.sub.logging","Logging",c.subagents.logging),new te("hdr.teammates","Team Members"),new A("at.team.pruning","Pruning",c.teammates.pruning),new A("at.team.fingerprinting","Fingerprinting",c.teammates.fingerprinting),new A("at.team.matching","Matching",c.teammates.matching),new A("at.team.injection","Injection",c.teammates.injection),new A("at.team.logging","Logging",c.teammates.logging),new te("hdr.limits","Limits"),new F("at.subagentTtlMs","Subagent TTL (ms)",c.subagentTtlMs),new F("at.mainTtlMs","Main Session TTL (ms)",c.mainTtlMs),new F("at.teammateTtlMs","Teammate TTL (ms)",c.teammateTtlMs),new F("at.maxActive","Max Active Agents",c.maxActive),new F("at.maxHistory","Max History",c.maxHistory),new F("at.maxRequestHistory","Max Request History",c.maxRequestHistory)]);u.push(h)}return u}function Jo(t,e){let[n,o,r,s]=t,i=t.find(m=>m.name==="Statusline"),a=t.find(m=>m.name==="Agents"),l=n.getField("proxyPort").value,g=n.getField("targetBaseUrl").value,d=n.getField("dashboardPort").value,u=n.getField("verbose").value,c=["pruning","fingerprinting","matching","injection","logging","dashboard","verbose"],h={...e.features};for(let m of c){let w=o.getField(`feat.${m}`);w&&(h[m]=w.value)}let f=e.brainSources.map(m=>{let w=r.getField(`brain.${m.name}`);return w?{...m,enabled:w.value}:m}),b=s.getField("pruneThresholdTokens").value,y=s.getField("injectionConfidenceThreshold").value,j=s.getField("contextPressureThreshold").value,B=a?.getField("feat.agentTracking");B&&(h.agentTracking=B.value);let S={...e.agentTracking};if(a){let m=(k,P)=>{let v=a.getField(k);return v?v.value:P},w=(k,P)=>{let v=a.getField(k);return v?v.value:P};S.subagents={pruning:m("at.sub.pruning",S.subagents.pruning),fingerprinting:m("at.sub.fingerprinting",S.subagents.fingerprinting),matching:m("at.sub.matching",S.subagents.matching),injection:m("at.sub.injection",S.subagents.injection),logging:m("at.sub.logging",S.subagents.logging)},S.teammates={pruning:m("at.team.pruning",S.teammates.pruning),fingerprinting:m("at.team.fingerprinting",S.teammates.fingerprinting),matching:m("at.team.matching",S.teammates.matching),injection:m("at.team.injection",S.teammates.injection),logging:m("at.team.logging",S.teammates.logging)},S.subagentTtlMs=w("at.subagentTtlMs",S.subagentTtlMs),S.mainTtlMs=w("at.mainTtlMs",S.mainTtlMs),S.teammateTtlMs=w("at.teammateTtlMs",S.teammateTtlMs),S.maxActive=w("at.maxActive",S.maxActive),S.maxHistory=w("at.maxHistory",S.maxHistory),S.maxRequestHistory=w("at.maxRequestHistory",S.maxRequestHistory)}let E={...e.statusline.elements};if(i){let m=["cortexLabel","phrase","contextBar","tokensSaved","requests","injections","lastMatch","agentInfo","confidence","latency"];for(let w of m){let k=i.getField(`sl.${w}`);k&&(E[w]=k.value)}}let J={...e.statusline,elements:E};return{...e,proxyPort:l,targetBaseUrl:g,dashboardPort:d,verbose:u,features:h,brainSources:f,pruneThresholdTokens:b,injectionConfidenceThreshold:y,contextPressureThreshold:j,statusline:J,agentTracking:S}}import*as Vo from"node:readline";import Go from"chalk";import $ from"chalk";var zo=["Use `cortex brain search <query>` to test brain matching","Cortex never modifies API responses \u2014 only request bodies","Set ANTHROPIC_BASE_URL=http://localhost:9090 to activate","Brain entries are Markdown files with YAML frontmatter","Use `cortex features enable verbose` for detailed pipeline output","Run `cortex logs --follow` to stream live pipeline activity","Cortex auto-prunes verbose tool outputs over 500 tokens","Use `cortex brain sources` to add cheat.sh, tldr, or devdocs","Dashboard at http://localhost:9091 shows live request pipeline","Use `cortex config set features.pruning false` to disable pruning","Subagent requests can skip fingerprinting for faster processing","Agent teams are auto-detected from ~/.claude/teams/ configs","Use `cortex brain import <dir>` to bulk-import brain entries","Cortex uses BGE-small for semantic matching (~130MB model)","Feature toggles persist to config and apply without restart","Use `cortex status` to check daemon health and brain stats"];function Ko(){return zo[Math.floor(Math.random()*zo.length)]}function Ye(t){return t.replace(/\x1b\[[0-9;]*[A-Za-z]/g,"")}function Vi(t,e){return" "+t.map((o,r)=>r===e?$.bgWhite.black(` ${o} `):$.dim(` ${o} `)).join($.dim(" \u2502 "))}function Yi(t){return t?$.dim(" Enter confirm Esc cancel Type to edit"):$.dim(" \u2191\u2193 navigate \u2190\u2192 tabs Space toggle Enter edit Esc save & exit")}var Zi=Ko();function Xo(t,e,n,o){let r=Math.max(60,(process.stdout.columns??80)-4),s=[];s.push($.cyan(" \u250C\u2500 Cortex Config "+"\u2500".repeat(r-19)+"\u2510"));let i=Vi(t,e),a=Ye(i).length;s.push($.cyan(" \u2502 ")+i+" ".repeat(Math.max(0,r-a-4))+$.cyan(" \u2502")),s.push($.cyan(" \u251C"+"\u2500".repeat(r-1)+"\u2524")),s.push($.cyan(" \u2502")+" ".repeat(r-1)+$.cyan("\u2502"));for(let f of n){let b=Ye(f),y=Math.max(0,r-1-b.length);s.push($.cyan(" \u2502")+f+" ".repeat(y)+$.cyan("\u2502"))}s.push($.cyan(" \u2502")+" ".repeat(r-1)+$.cyan("\u2502"));let l=Yi(o),g=Ye(l).length,d=Math.max(0,r-1-g);s.push($.cyan(" \u2502")+l+" ".repeat(d)+$.cyan("\u2502"));let u=$.dim(` Tip: ${Zi}`),c=Ye(u).length,h=Math.max(0,r-1-c);return s.push($.cyan(" \u2502")+u+" ".repeat(h)+$.cyan("\u2502")),s.push($.cyan(" \u2514"+"\u2500".repeat(r-1)+"\u2518")),s}function Yo(t){return new Promise(e=>{let n=0;if(!process.stdin.isTTY){console.log(Go.red("Interactive config requires a TTY terminal.")),e({saved:!1});return}process.stdin.setRawMode(!0),Vo.emitKeypressEvents(process.stdin);function o(){let i=t[n],a=i.render(),l=t.map(u=>u.name),g=i.focusedField?.editing??!1,d=Xo(l,n,a,g);process.stdout.write("\x1B[2J\x1B[H"),process.stdout.write(d.join(`
63
63
  `)+`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-cortex/daemon",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "Transparent API proxy that makes LLM coding agents smarter",
5
5
  "type": "module",
6
6
  "license": "BSL-1.1",