@ai-cortex/daemon 0.1.7 → 0.1.9

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 +39 -37
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var jr=Object.defineProperty;var C=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{for(var n in e)jr(t,n,{get:e[n],enumerable:!0})};import{readFileSync as Wt,writeFileSync as Gr,existsSync as Jt}from"node:fs";import{join as Re}from"node:path";import{homedir as $e}from"node:os";import{parse as zt,stringify as Vr}from"yaml";function R(){let t={},e=Re($e(),".cortex","config.yaml");if(Jt(e)){let o=Wt(e,"utf-8");t=zt(o)}let n={...z,...t,rrfWeights:{...z.rrfWeights,...t.rrfWeights??{}},features:{...z.features,...t.features??{}},brainSources:t.brainSources??z.brainSources,statusline:{...z.statusline,...t.statusline??{},elements:{...z.statusline.elements,...t.statusline?.elements??{}}},agentTracking:{...z.agentTracking,...t.agentTracking??{},main:{...z.agentTracking.main,...t.agentTracking?.main??{}},subagents:{...z.agentTracking.subagents,...t.agentTracking?.subagents??{}},teammates:{...z.agentTracking.teammates,...t.agentTracking?.teammates??{}}}};process.env.CORTEX_PORT&&(n.proxyPort=Number(process.env.CORTEX_PORT)),process.env.CORTEX_TARGET_URL&&(n.targetBaseUrl=process.env.CORTEX_TARGET_URL),process.env.CORTEX_DASHBOARD_PORT&&(n.dashboardPort=Number(process.env.CORTEX_DASHBOARD_PORT));try{let o=new URL(n.targetBaseUrl);o.protocol!=="https:"&&o.hostname!=="localhost"&&o.hostname!=="127.0.0.1"&&console.warn(`[cortex] WARNING: targetBaseUrl is non-HTTPS (${n.targetBaseUrl}). API keys may transit in cleartext.`),(s=>{if(s==="0.0.0.0"||s==="::1"||s.startsWith("10.")||s.startsWith("192.168.")||s.startsWith("169.254."))return!0;if(s.startsWith("172.")){let i=parseInt(s.split(".")[1],10);if(i>=16&&i<=31)return!0}return!!(s.startsWith("fd")||s.startsWith("fe80:"))})(o.hostname)&&console.warn(`[cortex] WARNING: targetBaseUrl points to a private IP (${o.hostname}). Potential SSRF risk.`)}catch{}return n}function Kt(){let t=Re($e(),".cortex","config.yaml");if(!Jt(t))return{};let e=Wt(t,"utf-8");return zt(e)??{}}function Xt(t){let e=Re($e(),".cortex","config.yaml");Gr(e,Vr(t),"utf-8")}function Qr(t){return Yr[t]??Zr}function Gt(t,e,n){let o=Qr(e);return t/o>n}var z,Yr,Zr,q=C(()=>{"use strict";z={proxyPort:9090,targetBaseUrl:"https://api.anthropic.com",brainDir:"./brain/entries",dataDir:Re($e(),".cortex"),pruneThresholdTokens:500,contextPressureThreshold:.65,injectionConfidenceThreshold:.7,rrfWeights:{featureOverlap:.5,semantic:.5},dashboardPort:9091,verbose:!0,features:{pruning:!0,injection:!0,fingerprinting:!0,matching:!0,logging:!0,dashboard:!0,verbose:!0,agentTracking:!1},brainSources:[{name:"default",type:"local",path:"./brain/entries",enabled:!0,isDefault:!0}],statusline:{enabled:!0,elements:{cortexLabel:!0,phrase:!0,contextBar:!0,tokensSaved:!0,requests:!0,injections:!0,lastMatch:!0,agentInfo:!1,confidence:!1,latency:!1}},agentTracking:{subagentTtlMs:3e5,mainTtlMs:36e5,teammateTtlMs:36e5,maxActive:1e3,maxHistory:100,maxRequestHistory:5,subagentWaitingThresholdMs:2e3,main:{pruning:!0,fingerprinting:!0,matching:!0,injection:!0,logging:!0},subagents:{pruning:!0,fingerprinting:!1,matching:!1,injection:!1,logging:!0},teammates:{pruning:!0,fingerprinting:!0,matching:!0,injection:!0,logging:!0}}};Yr={"claude-opus-4-6":2e5,"claude-sonnet-4-6":2e5,"claude-haiku-4-5":2e5,"claude-3-5-sonnet-20241022":2e5,"claude-3-5-haiku-20241022":2e5,"claude-3-opus-20240229":2e5,"claude-3-sonnet-20240229":2e5,"claude-3-haiku-20240307":2e5},Zr=2e5});var me={};le(me,{BrainStore:()=>ge});import es from"sql.js";import{readFileSync as ts,writeFileSync as ns,existsSync as os}from"node:fs";var rs,ge,re=C(()=>{"use strict";rs=`CREATE TABLE IF NOT EXISTS entries (
2
+ var Hr=Object.defineProperty;var C=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{for(var n in e)Hr(t,n,{get:e[n],enumerable:!0})};import{readFileSync as zr,writeFileSync as Xr,unlinkSync as Kr}from"node:fs";import{join as Gr}from"node:path";import{homedir as Vr,platform as Yr}from"node:os";function Me(t){let e={encoding:"utf-8"};Yr()!=="win32"&&(e.mode=384),Xr(at,String(t),e)}function Zr(){try{let t=zr(at,"utf-8").trim(),e=Number(t);return Number.isFinite(e)?e:null}catch{return null}}function je(t){try{return process.kill(t,0),!0}catch{return!1}}function _(){let t=Zr();return t===null?{running:!1,pid:null}:je(t)?{running:!0,pid:t}:(Z(),{running:!1,pid:null})}function Z(){try{Kr(at)}catch{}}var at,Q=C(()=>{"use strict";at=Gr(Vr(),".cortex","cortex.pid")});import{readFileSync as Qt,writeFileSync as is,existsSync as en}from"node:fs";import{join as Ne}from"node:path";import{homedir as Oe}from"node:os";import{parse as tn,stringify as as}from"yaml";function R(){let t={},e=Ne(Oe(),".cortex","config.yaml");if(en(e)){let o=Qt(e,"utf-8");t=tn(o)}let n={...z,...t,rrfWeights:{...z.rrfWeights,...t.rrfWeights??{}},features:{...z.features,...t.features??{}},brainSources:t.brainSources??z.brainSources,statusline:{...z.statusline,...t.statusline??{},elements:{...z.statusline.elements,...t.statusline?.elements??{}}},agentTracking:{...z.agentTracking,...t.agentTracking??{},main:{...z.agentTracking.main,...t.agentTracking?.main??{}},subagents:{...z.agentTracking.subagents,...t.agentTracking?.subagents??{}},teammates:{...z.agentTracking.teammates,...t.agentTracking?.teammates??{}}}};process.env.CORTEX_PORT&&(n.proxyPort=Number(process.env.CORTEX_PORT)),process.env.CORTEX_TARGET_URL&&(n.targetBaseUrl=process.env.CORTEX_TARGET_URL),process.env.CORTEX_DASHBOARD_PORT&&(n.dashboardPort=Number(process.env.CORTEX_DASHBOARD_PORT));try{let o=new URL(n.targetBaseUrl);o.protocol!=="https:"&&o.hostname!=="localhost"&&o.hostname!=="127.0.0.1"&&console.warn(`[cortex] WARNING: targetBaseUrl is non-HTTPS (${n.targetBaseUrl}). API keys may transit in cleartext.`),(s=>{if(s==="0.0.0.0"||s==="::1"||s.startsWith("10.")||s.startsWith("192.168.")||s.startsWith("169.254."))return!0;if(s.startsWith("172.")){let i=parseInt(s.split(".")[1],10);if(i>=16&&i<=31)return!0}return!!(s.startsWith("fd")||s.startsWith("fe80:"))})(o.hostname)&&console.warn(`[cortex] WARNING: targetBaseUrl points to a private IP (${o.hostname}). Potential SSRF risk.`)}catch{}return n}function nn(){let t=Ne(Oe(),".cortex","config.yaml");if(!en(t))return{};let e=Qt(t,"utf-8");return tn(e)??{}}function on(t){let e=Ne(Oe(),".cortex","config.yaml");is(e,as(t),"utf-8")}function us(t){return cs[t]??ls}function rn(t,e,n){let o=us(e);return t/o>n}var z,cs,ls,q=C(()=>{"use strict";z={proxyPort:9090,targetBaseUrl:"https://api.anthropic.com",brainDir:"./brain/entries",dataDir:Ne(Oe(),".cortex"),pruneThresholdTokens:500,contextPressureThreshold:.65,injectionConfidenceThreshold:.7,rrfWeights:{featureOverlap:.5,semantic:.5},dashboardPort:9091,verbose:!0,features:{pruning:!0,injection:!0,fingerprinting:!0,matching:!0,logging:!0,dashboard:!0,verbose:!0,agentTracking:!1},brainSources:[{name:"default",type:"local",path:"./brain/entries",enabled:!0,isDefault:!0}],statusline:{enabled:!0,elements:{cortexLabel:!0,phrase:!0,contextBar:!0,tokensSaved:!0,requests:!0,injections:!0,lastMatch:!0,agentInfo:!1,confidence:!1,latency:!1}},agentTracking:{subagentTtlMs:3e5,mainTtlMs:36e5,teammateTtlMs:36e5,maxActive:1e3,maxHistory:100,maxRequestHistory:5,subagentWaitingThresholdMs:2e3,main:{pruning:!0,fingerprinting:!0,matching:!0,injection:!0,logging:!0},subagents:{pruning:!0,fingerprinting:!1,matching:!1,injection:!1,logging:!0},teammates:{pruning:!0,fingerprinting:!0,matching:!0,injection:!0,logging:!0}}};cs={"claude-opus-4-6":2e5,"claude-sonnet-4-6":2e5,"claude-haiku-4-5":2e5,"claude-3-5-sonnet-20241022":2e5,"claude-3-5-haiku-20241022":2e5,"claude-3-opus-20240229":2e5,"claude-3-sonnet-20240229":2e5,"claude-3-haiku-20240307":2e5},ls=2e5});var Se={};ce(Se,{BrainStore:()=>be});import ds from"sql.js";import{readFileSync as gs,writeFileSync as ms,existsSync as ps}from"node:fs";var fs,be,le=C(()=>{"use strict";fs=`CREATE TABLE IF NOT EXISTS entries (
3
3
  id TEXT PRIMARY KEY,
4
4
  title TEXT NOT NULL,
5
5
  content TEXT NOT NULL,
@@ -12,38 +12,41 @@ var jr=Object.defineProperty;var C=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{f
12
12
  failure_count INTEGER DEFAULT 0,
13
13
  created_at TEXT DEFAULT (datetime('now')),
14
14
  updated_at TEXT DEFAULT (datetime('now'))
15
- );`,ge=class t{db;filePath;constructor(e,n){this.db=e,this.filePath=n,this.db.run(rs),this.migrateSourceColumn()}static async open(e){let n=await es(),o=e===":memory:",r;if(!o&&os(e)){let s=ts(e);r=new n.Database(new Uint8Array(s))}else r=new n.Database;return new t(r,o?null:e)}persist(){if(!this.filePath)return;let e=this.db.export();ns(this.filePath,Buffer.from(e))}migrateSourceColumn(){let e=this.db.exec("PRAGMA table_info(entries)");e.length>0&&e[0].values.some(o=>o[1]==="source")||(this.db.run("ALTER TABLE entries ADD COLUMN source TEXT DEFAULT 'local'"),this.persist())}addEntry(e){let n=e.embedding?Buffer.from(e.embedding.buffer,e.embedding.byteOffset,e.embedding.byteLength):null;this.db.run(`INSERT OR REPLACE INTO entries (id, title, content, language, error_types, tags, embedding, source)
16
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,[e.id,e.title,e.content,e.language,e.errorTypes.join(","),e.tags.join(","),n,e.source??"local"]),this.persist()}getEntry(e){let n=this.db.prepare("SELECT * FROM entries WHERE id = ?");if(n.bind([e]),!n.step())return n.free(),null;let o=n.getAsObject();return n.free(),this.rowToEntry(o)}getAllEntries(){let e=this.db.prepare("SELECT * FROM entries"),n=[];for(;e.step();)n.push(this.rowToEntry(e.getAsObject()));return e.free(),n}getAllEmbeddings(){let e=this.db.prepare("SELECT id, embedding FROM entries WHERE embedding IS NOT NULL"),n=[];for(;e.step();){let o=e.getAsObject(),r=o.embedding;n.push({id:o.id,embedding:new Float32Array(r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength))})}return e.free(),n}static UPDATE_SUCCESS_SQL="UPDATE entries SET success_count = success_count + 1, updated_at = datetime('now') WHERE id = ?";static UPDATE_FAILURE_SQL="UPDATE entries SET failure_count = failure_count + 1, updated_at = datetime('now') WHERE id = ?";updateScore(e,n){let o=n?t.UPDATE_SUCCESS_SQL:t.UPDATE_FAILURE_SQL;this.db.run(o,[e]),this.persist()}getEntryCount(){let e=this.db.prepare("SELECT COUNT(*) as cnt FROM entries");e.step();let n=e.getAsObject();return e.free(),n.cnt}getEntriesBySource(e){let n=this.db.prepare("SELECT * FROM entries WHERE source = ?");n.bind([e]);let o=[];for(;n.step();)o.push(this.rowToEntry(n.getAsObject()));return n.free(),o}close(){this.persist(),this.db.close()}rowToEntry(e){return{id:e.id,title:e.title,content:e.content,language:e.language,errorTypes:e.error_types?e.error_types.split(","):[],tags:e.tags?e.tags.split(","):[],embedding:e.embedding?(()=>{let n=e.embedding;return new Float32Array(n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength))})():null,source:e.source??"local"}}}});var Me,Vt=C(()=>{"use strict";Me=class{armed=!1;armPayload=null;currentFingerprint=null;tokenEstimate=0;requestCount=0;lastMatchResults=null;arm(e){this.armed=!0,this.armPayload=e}disarm(){let e=this.armPayload;return this.armed=!1,this.armPayload=null,e}updateFingerprint(e){this.currentFingerprint=e}updateTokenEstimate(e){this.tokenEstimate=e}incrementRequest(){this.requestCount++}updateMatches(e){this.lastMatchResults=e}}});function Yt(t){let e;try{e=JSON.parse(t.toString("utf-8"))}catch{throw new Error("Invalid request: malformed JSON")}if(!e||typeof e!="object"||!Array.isArray(e.messages))throw new Error("Invalid request: messages must be an array");let{messages:n,...o}=e;return{messages:n,meta:o}}function Zt(t,e){let n={...t,messages:e};return Buffer.from(JSON.stringify(n),"utf-8")}function ee(t){return t?typeof t=="string"?t:t.filter(e=>e.type==="text").map(e=>e.text).join(`
17
- `):""}var je=C(()=>{"use strict"});function as(t){if(t.length<50)return"english";let e=t.slice(0,2e3),n=0;for(let r of is)e.includes(r)&&n++;if(n>=3)return"json";let o=0;for(let r of ss)if(e.includes(r)&&(o++,o>=3))return"code";return"english"}function O(t){if(t.length===0)return 1;let e=as(t),n=e==="json"?3:e==="code"?3.5:4.2;return Math.max(1,Math.round(t.length/n))}function Qt(t){switch(t.type){case"text":return O(t.text);case"tool_use":return O(JSON.stringify(t.input));case"tool_result":return typeof t.content=="string"?O(t.content):Array.isArray(t.content)?t.content.reduce((e,n)=>e+Qt(n),0):1;case"thinking":return O(t.thinking);case"redacted_thinking":return 1;case"image":return cs(t);case"tool_reference":return O(t.tool_name);default:return 1}}function rt(t){return typeof t.content=="string"?O(t.content):t.content.reduce((e,n)=>e+Qt(n),0)}function en(t){return t.reduce((e,n)=>e+rt(n),0)}function cs(t){let e=t.source?.data;if(!e||e.length<24)return 85;try{let s=e.slice(0,48),i=Buffer.from(s,"base64"),a=0,l=0,g=t.source?.media_type??"";if(g.includes("png")||i[1]===80&&i[2]===78&&i[3]===71?i.length>=24&&(a=i.readUInt32BE(16),l=i.readUInt32BE(20)):(g.includes("gif")||i[0]===71&&i[1]===73&&i[2]===70)&&i.length>=10&&(a=i.readUInt16LE(6),l=i.readUInt16LE(8)),a>0&&l>0){if(a>1568||l>1568){let f=1568/Math.max(a,l);a=Math.round(a*f),l=Math.round(l*f)}let u=Math.ceil(a/768),c=Math.ceil(l/768),h=u*c*170;return Math.max(85,Math.min(4096,h))}}catch{}let o=Math.round(e.length*.75)/3,r=Math.round(o/750);return Math.max(85,Math.min(4096,r))}var ss,is,st=C(()=>{"use strict";ss=["import ","function ","const ","let ","var ","class ","def ","#include","fmt.","println","=>","async ","return "],is=['{"','"}','":','",']});function tn(t,e){if(se.size>=50){let n=se.keys().next().value;se.delete(n)}se.set(t,{inputTokens:e,timestamp:Date.now()})}function nn(t){if(!t)return null;let e=se.get(t);return e?Date.now()-e.timestamp>3e4?(se.delete(t),null):e.inputTokens:null}var se,it=C(()=>{"use strict";se=new Map});function on(t){return Math.round(t*3.8)}function ls(t){let e=t.split(`
18
- `)[0]?.trim()??"",n=t.match(/\b(error|Error|ERROR|exception|Exception|EXCEPTION|fail|FAIL|Traceback|panic)\b/),o=t.match(/exit code[:\s]*(\d+)/i),r=[];return e.length>0&&e.length<=120&&r.push(e),n&&r.push(`contains "${n[0]}"`),o&&r.push(`exit code ${o[1]}`),r.length>0?r.join("; "):"tool output"}function rn(t,e){let n=O(t);if(n<=e)return{text:t,saved:0};let o=on(50),r=on(50),s=t.slice(0,o),i=t.slice(-r),a=n-100,l=ls(t),g=`${s}
15
+ );`,be=class t{db;filePath;constructor(e,n){this.db=e,this.filePath=n,this.db.run(fs),this.migrateSourceColumn()}static async open(e){let n=await ds(),o=e===":memory:",r;if(!o&&ps(e)){let s=gs(e);r=new n.Database(new Uint8Array(s))}else r=new n.Database;return new t(r,o?null:e)}persist(){if(!this.filePath)return;let e=this.db.export();ms(this.filePath,Buffer.from(e))}migrateSourceColumn(){let e=this.db.exec("PRAGMA table_info(entries)");e.length>0&&e[0].values.some(o=>o[1]==="source")||(this.db.run("ALTER TABLE entries ADD COLUMN source TEXT DEFAULT 'local'"),this.persist())}addEntry(e){let n=e.embedding?Buffer.from(e.embedding.buffer,e.embedding.byteOffset,e.embedding.byteLength):null;this.db.run(`INSERT OR REPLACE INTO entries (id, title, content, language, error_types, tags, embedding, source)
16
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,[e.id,e.title,e.content,e.language,e.errorTypes.join(","),e.tags.join(","),n,e.source??"local"]),this.persist()}getEntry(e){let n=this.db.prepare("SELECT * FROM entries WHERE id = ?");if(n.bind([e]),!n.step())return n.free(),null;let o=n.getAsObject();return n.free(),this.rowToEntry(o)}getAllEntries(){let e=this.db.prepare("SELECT * FROM entries"),n=[];for(;e.step();)n.push(this.rowToEntry(e.getAsObject()));return e.free(),n}getAllEmbeddings(){let e=this.db.prepare("SELECT id, embedding FROM entries WHERE embedding IS NOT NULL"),n=[];for(;e.step();){let o=e.getAsObject(),r=o.embedding;n.push({id:o.id,embedding:new Float32Array(r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength))})}return e.free(),n}static UPDATE_SUCCESS_SQL="UPDATE entries SET success_count = success_count + 1, updated_at = datetime('now') WHERE id = ?";static UPDATE_FAILURE_SQL="UPDATE entries SET failure_count = failure_count + 1, updated_at = datetime('now') WHERE id = ?";updateScore(e,n){let o=n?t.UPDATE_SUCCESS_SQL:t.UPDATE_FAILURE_SQL;this.db.run(o,[e]),this.persist()}getEntryCount(){let e=this.db.prepare("SELECT COUNT(*) as cnt FROM entries");e.step();let n=e.getAsObject();return e.free(),n.cnt}getEntriesBySource(e){let n=this.db.prepare("SELECT * FROM entries WHERE source = ?");n.bind([e]);let o=[];for(;n.step();)o.push(this.rowToEntry(n.getAsObject()));return n.free(),o}close(){this.persist(),this.db.close()}rowToEntry(e){return{id:e.id,title:e.title,content:e.content,language:e.language,errorTypes:e.error_types?e.error_types.split(","):[],tags:e.tags?e.tags.split(","):[],embedding:e.embedding?(()=>{let n=e.embedding;return new Float32Array(n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength))})():null,source:e.source??"local"}}}});var Fe,sn=C(()=>{"use strict";Fe=class{armed=!1;armPayload=null;currentFingerprint=null;tokenEstimate=0;requestCount=0;lastMatchResults=null;arm(e){this.armed=!0,this.armPayload=e}disarm(){let e=this.armPayload;return this.armed=!1,this.armPayload=null,e}updateFingerprint(e){this.currentFingerprint=e}updateTokenEstimate(e){this.tokenEstimate=e}incrementRequest(){this.requestCount++}updateMatches(e){this.lastMatchResults=e}}});function an(t){let e;try{e=JSON.parse(t.toString("utf-8"))}catch{throw new Error("Invalid request: malformed JSON")}if(!e||typeof e!="object"||!Array.isArray(e.messages))throw new Error("Invalid request: messages must be an array");let{messages:n,...o}=e;return{messages:n,meta:o}}function cn(t,e){let n={...t,messages:e};return Buffer.from(JSON.stringify(n),"utf-8")}function oe(t){return t?typeof t=="string"?t:t.filter(e=>e.type==="text").map(e=>e.text).join(`
17
+ `):""}var _e=C(()=>{"use strict"});function bs(t){if(t.length<50)return"english";let e=t.slice(0,2e3),n=0;for(let r of ys)e.includes(r)&&n++;if(n>=3)return"json";let o=0;for(let r of hs)if(e.includes(r)&&(o++,o>=3))return"code";return"english"}function F(t){if(t.length===0)return 1;let e=bs(t),n=e==="json"?3:e==="code"?3.5:4.2;return Math.max(1,Math.round(t.length/n))}function ln(t){switch(t.type){case"text":return F(t.text);case"tool_use":return F(JSON.stringify(t.input));case"tool_result":return typeof t.content=="string"?F(t.content):Array.isArray(t.content)?t.content.reduce((e,n)=>e+ln(n),0):1;case"thinking":return F(t.thinking);case"redacted_thinking":return 1;case"image":return Ss(t);case"tool_reference":return F(t.tool_name);default:return 1}}function ut(t){return typeof t.content=="string"?F(t.content):t.content.reduce((e,n)=>e+ln(n),0)}function un(t){return t.reduce((e,n)=>e+ut(n),0)}function Ss(t){let e=t.source?.data;if(!e||e.length<24)return 85;try{let s=e.slice(0,48),i=Buffer.from(s,"base64"),a=0,l=0,g=t.source?.media_type??"";if(g.includes("png")||i[1]===80&&i[2]===78&&i[3]===71?i.length>=24&&(a=i.readUInt32BE(16),l=i.readUInt32BE(20)):(g.includes("gif")||i[0]===71&&i[1]===73&&i[2]===70)&&i.length>=10&&(a=i.readUInt16LE(6),l=i.readUInt16LE(8)),a>0&&l>0){if(a>1568||l>1568){let h=1568/Math.max(a,l);a=Math.round(a*h),l=Math.round(l*h)}let u=Math.ceil(a/768),c=Math.ceil(l/768),m=u*c*170;return Math.max(85,Math.min(4096,m))}}catch{}let o=Math.round(e.length*.75)/3,r=Math.round(o/750);return Math.max(85,Math.min(4096,r))}var hs,ys,dt=C(()=>{"use strict";hs=["import ","function ","const ","let ","var ","class ","def ","#include","fmt.","println","=>","async ","return "],ys=['{"','"}','":','",']});function dn(t,e){if(ue.size>=50){let n=ue.keys().next().value;ue.delete(n)}ue.set(t,{inputTokens:e,timestamp:Date.now()})}function gn(t){if(!t)return null;let e=ue.get(t);return e?Date.now()-e.timestamp>3e4?(ue.delete(t),null):e.inputTokens:null}var ue,gt=C(()=>{"use strict";ue=new Map});function mn(t){return Math.round(t*3.8)}function xs(t){let e=t.split(`
18
+ `)[0]?.trim()??"",n=t.match(/\b(error|Error|ERROR|exception|Exception|EXCEPTION|fail|FAIL|Traceback|panic)\b/),o=t.match(/exit code[:\s]*(\d+)/i),r=[];return e.length>0&&e.length<=120&&r.push(e),n&&r.push(`contains "${n[0]}"`),o&&r.push(`exit code ${o[1]}`),r.length>0?r.join("; "):"tool output"}function pn(t,e){let n=F(t);if(n<=e)return{text:t,saved:0};let o=mn(50),r=mn(50),s=t.slice(0,o),i=t.slice(-r),a=n-100,l=xs(t),g=`${s}
19
19
 
20
20
  [... ${a} tokens omitted \u2014 ${l}]
21
21
 
22
- ${i}`,d=O(g);return{text:g,saved:n-d}}function us(t,e,n,o,r){if(t.type!=="tool_result")return{block:t,saved:0};let s=t;if(typeof s.content=="string"){let{text:i,saved:a}=rn(s.content,e);return a===0?{block:t,saved:0}:(r.push({type:"prune",messageIndex:n,blockIndex:o,originalContent:s.content.slice(0,5e4),prunedContent:i,tokensBefore:O(s.content),tokensAfter:O(i)}),{block:{...s,content:i},saved:a})}if(Array.isArray(s.content)){let i=0,a=s.content.map((l,g)=>{if(l.type==="text"){let{text:d,saved:u}=rn(l.text,e);return i+=u,u===0?l:(r.push({type:"prune",messageIndex:n,blockIndex:o,subBlockIndex:g,originalContent:l.text.slice(0,5e4),prunedContent:d,tokensBefore:O(l.text),tokensAfter:O(d)}),{...l,text:d})}return l});return i===0?{block:t,saved:0}:{block:{...s,content:a},saved:i}}return{block:t,saved:0}}function sn(t,e){let n=0,o=[],r=Math.max(0,t.length-3);return{messages:t.map((i,a)=>{if(a>=r||typeof i.content=="string")return at(i);let l=0,g=i.content.map((d,u)=>{let{block:c,saved:h}=us(d,e,a,u,o);return l+=h,c});return n+=l,l===0?at(i):{role:i.role,content:g}}),tokensSaved:n,pruneOps:o}}function at(t){return JSON.parse(JSON.stringify(t))}var an=C(()=>{"use strict";st()});function ds(t){return t.replace(/<\/?cortex_context[^>]*>/gi,e=>e.replace(/</g,"&lt;").replace(/>/g,"&gt;"))}function cn(t,e){let n=t.map(g=>({...g})),o=-1;for(let g=n.length-1;g>=0;g--)if(n[g].role==="user"){o=g;break}if(o===-1)return n;let r=ds(e),i=`<cortex_context>
22
+ ${i}`,d=F(g);return{text:g,saved:n-d}}function Cs(t,e,n,o,r){if(t.type!=="tool_result")return{block:t,saved:0};let s=t;if(typeof s.content=="string"){let{text:i,saved:a}=pn(s.content,e);return a===0?{block:t,saved:0}:(r.push({type:"prune",messageIndex:n,blockIndex:o,originalContent:s.content.slice(0,5e4),prunedContent:i,tokensBefore:F(s.content),tokensAfter:F(i)}),{block:{...s,content:i},saved:a})}if(Array.isArray(s.content)){let i=0,a=s.content.map((l,g)=>{if(l.type==="text"){let{text:d,saved:u}=pn(l.text,e);return i+=u,u===0?l:(r.push({type:"prune",messageIndex:n,blockIndex:o,subBlockIndex:g,originalContent:l.text.slice(0,5e4),prunedContent:d,tokensBefore:F(l.text),tokensAfter:F(d)}),{...l,text:d})}return l});return i===0?{block:t,saved:0}:{block:{...s,content:a},saved:i}}return{block:t,saved:0}}function fn(t,e){let n=0,o=[],r=Math.max(0,t.length-3);return{messages:t.map((i,a)=>{if(a>=r||typeof i.content=="string")return mt(i);let l=0,g=i.content.map((d,u)=>{let{block:c,saved:m}=Cs(d,e,a,u,o);return l+=m,c});return n+=l,l===0?mt(i):{role:i.role,content:g}}),tokensSaved:n,pruneOps:o}}function mt(t){return JSON.parse(JSON.stringify(t))}var hn=C(()=>{"use strict";dt()});function ws(t){return t.replace(/<\/?cortex_context[^>]*>/gi,e=>e.replace(/</g,"&lt;").replace(/>/g,"&gt;"))}function yn(t,e){let n=t.map(g=>({...g})),o=-1;for(let g=n.length-1;g>=0;g--)if(n[g].role==="user"){o=g;break}if(o===-1)return n;let r=ws(e),i=`<cortex_context>
23
23
  ${r.length>16e3?r.slice(0,16e3)+`
24
24
  [truncated]`:r}
25
- </cortex_context>`,a=n[o],l;return typeof a.content=="string"?l=[{type:"text",text:i},{type:"text",text:a.content}]:l=[{type:"text",text:i},...a.content],n[o]={...a,content:l},n}var ln=C(()=>{"use strict"});async function Ie(t){if(!Be)return pe||(pe=(async()=>{let e=Date.now(),{pipeline:n,env:o}=await import("@huggingface/transformers");o.cacheDir=t,console.log("[embedder] Loading BGE-small-en model..."),Be=await n("feature-extraction","Xenova/bge-small-en-v1.5"),console.log(`[embedder] Model loaded in ${Date.now()-e}ms`)})().catch(e=>{throw pe=null,e}),pe)}async function ie(t){if(!Be)throw new Error("Embedder not initialized. Call initEmbedder() first.");let e=Date.now(),n=await Be(t,{pooling:"cls",normalize:!0}),o=new Float32Array(n.data);return console.log(`[embedder] Inference took ${Date.now()-e}ms`),o}var Be,pe,fe=C(()=>{"use strict";Be=null,pe=null});function dn(t){if(typeof t=="string")return[t];let e=[];for(let n of t)if(n.type==="text")e.push(n.text);else if(n.type==="tool_result"){let o=n;typeof o.content=="string"?e.push(o.content):Array.isArray(o.content)&&e.push(...dn(o.content))}return e}function ys(t){if(typeof t=="string")return[];let e=[];for(let n of t)n.type==="tool_use"&&e.push(n);return e}function bs(t,e){let n=new Set;for(let o of e){let r=JSON.stringify(o.input),s=Object.entries(un);for(let[i,a]of s)r.includes(i)&&n.add(a)}for(let[o,r]of Object.entries(un))new RegExp(`\\w${o.replace(".","\\.")}\\b`).test(t)&&n.add(r);for(let[o,r]of gs)o.test(t)&&n.add(r);return Array.from(n)}function Ss(t){let e=new Set;for(let n of hs)t.includes(n)&&e.add(n);return Array.from(e)}function xs(t){let e=new Set;for(let n of t){let o=n.input.file_path;if(typeof o=="string"){let r=o.match(/(\.\w+)$/);r&&e.add(r[1])}}return Array.from(e)}function Cs(t){return t<6?"early":t<=20?"mid":"late"}function gn(t){let e=[],n=[];for(let r of t)e.push(...dn(r.content)),n.push(...ys(r.content));let o=e.join(`
26
- `);return{languages:bs(o,n),errorTypes:Ss(o),fileTypes:xs(n),phase:Cs(t.length)}}var un,gs,ms,ps,fs,hs,mn=C(()=>{"use strict";un={".py":"python",".js":"javascript",".ts":"typescript",".rs":"rust",".go":"go",".java":"java",".rb":"ruby",".php":"php",".cpp":"cpp",".c":"cpp",".sh":"bash"},gs=[[/\bdef\s+\w+.*:/,"python"],[/\bclass\s+\w+.*:/,"python"],[/\bfunction\s+/,"javascript"],[/\bconst\s+/,"javascript"],[/=>/,"javascript"],[/\bfn\s+/,"rust"],[/\bimpl\s+/,"rust"],[/\bfunc\s+/,"go"]],ms=["ImportError","ModuleNotFoundError","TypeError","ValueError","KeyError","AttributeError","FileNotFoundError","IndentationError","SyntaxError","NameError"],ps=["TypeError","ReferenceError","SyntaxError","RangeError","ENOENT","EACCES","ERR_MODULE_NOT_FOUND","ERR_REQUIRE_ESM","Cannot find module"],fs=["FAILED","exit code 1","error:","Error:","panic:","FATAL","Traceback","stack trace"],hs=[...ms,...ps,...fs]});function ws(t){for(let e=t.length-1;e>=0;e--){if(t[e].role!=="assistant")continue;let n=t[e].content;if(typeof n=="string")return n.slice(0,2e3);let o=[];for(let s of n)s.type==="text"&&o.push(s.text);let r=o.join(`
27
- `);if(r.length>0)return r.slice(0,2e3)}return""}async function pn(t){let e=gn(t),n=ws(t),o=await ie(n||"empty conversation");return{rules:e,semantic:o,timestamp:Date.now()}}var fn=C(()=>{"use strict";mn();fe()});function hn(t,e){let n;e.language==="any"?n=.5:t.languages.includes(e.language)?n=1:n=0;let o,r=new Set(t.errorTypes),s=new Set(e.errorTypes);if(r.size===0&&s.size===0)o=.5;else{let l=Array.from(s).filter(d=>r.has(d)),g=new Set(Array.from(r).concat(Array.from(s)));o=g.size>0?l.length/g.size:.5}let i;if(e.tags.length===0)i=.5;else{let l=JSON.stringify(t).toLowerCase(),g=0;for(let d of e.tags)l.includes(d.toLowerCase())&&g++;i=g/e.tags.length}let a=.4*n+.4*o+.2*i;return Math.max(0,Math.min(1,a))}var yn=C(()=>{"use strict"});function Ne(t,e){if(t.length!==e.length)return 0;let n=0,o=0,r=0;for(let i=0;i<t.length;i++)n+=t[i]*e[i],o+=t[i]*t[i],r+=e[i]*e[i];let s=Math.sqrt(o)*Math.sqrt(r);return s===0?0:n/s}var ct=C(()=>{"use strict"});function bn(t,e,n){let o=e.filter(u=>u.embedding!==null),r=o.map(u=>({entry:u,score:hn(t.rules,u)}));r.sort((u,c)=>c.score-u.score);let s=new Map;r.forEach((u,c)=>{s.set(u.entry.id,{rank:c,score:u.score})});let i=o.map(u=>({entry:u,score:Ne(t.semantic,u.embedding)}));i.sort((u,c)=>c.score-u.score);let a=new Map;i.forEach((u,c)=>{a.set(u.entry.id,{rank:c,score:u.score})});let l=o.map(u=>{let c=s.get(u.id),h=a.get(u.id),f=n.featureOverlap/(60+c.rank)+n.semantic/(60+h.rank);return{entry:u,score:f,ch1Score:c.score,ch2Score:h.score}}),g=n.featureOverlap/60+n.semantic/60,d=n.featureOverlap+n.semantic;if(g>0)for(let u of l){let c=u.score/g,h=d>0?(u.ch1Score*n.featureOverlap+u.ch2Score*n.semantic)/d:0;u.score=c*h}return l.sort((u,c)=>c.score-u.score),l.slice(0,3)}var Sn=C(()=>{"use strict";yn();ct()});import{createHash as xn}from"node:crypto";function Cn(t,e){let n=ee(t.system).trim(),o=xn("sha256").update(n).digest("hex"),r=e.find(a=>a.role==="user"),s=r?Ts(r.content):"";return{conversationId:xn("sha256").update(n).update("\0").update(s.trim()).digest("hex"),systemPromptHash:o,firstUserContent:s}}function Ts(t){return typeof t=="string"?t:t.filter(e=>e.type==="text").map(e=>e.text).join(`
28
- `)}var wn=C(()=>{"use strict";je()});import{readFileSync as Tn,readdirSync as vs,existsSync as lt}from"node:fs";import{join as he}from"node:path";import{homedir as ks}from"node:os";function vn(t){let e=t??he(ks(),".claude"),n=he(e,"teams");if(!lt(n))return[];let o=[];try{let r=vs(n,{withFileTypes:!0});for(let s of r){if(!s.isDirectory())continue;let i=he(n,s.name,"config.json");if(lt(i))try{let a=Tn(i,"utf-8"),l=JSON.parse(a),g=l.members??l.agents??[],d=g.map(b=>{let y=b.name??b.alias,j=b.agentType??b.type,B=b.model,S;return typeof b.prompt=="string"&&b.prompt.length>0?S=b.prompt.slice(0,200):j&&(S=Es(e,j)),{alias:y,type:j,model:B,systemPromptSnippet:S}}),u=typeof l.leadSessionId=="string"?l.leadSessionId:void 0,c=typeof l.leadAgentId=="string"?l.leadAgentId:void 0,h=c?g.find(b=>b.agentId===c):g.find(b=>b.name==="team-lead"),f=typeof h?.cwd=="string"?h.cwd:void 0;o.push({name:l.name??s.name,members:d,configPath:i,lastReadAt:Date.now(),leadSessionId:u,leadCwd:f})}catch{}}}catch{}return o}function Es(t,e){if(/[\/\\]|\.\./.test(e))return;let n=he(t,"agents"),o=he(n,`${e}.md`);if(o.startsWith(n)&&lt(o))try{return Tn(o,"utf-8").replace(/^---[\s\S]*?---\s*/,"").slice(0,200).trim()||void 0}catch{return}}function kn(t,e){for(let n of e)for(let o of n.members)if(o.systemPromptSnippet&&t.includes(o.systemPromptSnippet)){let r=o.alias==="team-lead";return{teamName:n.name,role:o.alias,isLead:r}}return null}var ut=C(()=>{"use strict"});function En(t,e,n){let o=ee(t.system),r=t.tools??[],s=t.model??"",i=As(o,r,s);if(!i.hasAgentTool){let l=i.hasProjectContext&&i.toolCountBucket==="restricted";return{type:"subagent",signals:i,spoofingSuspected:l}}let a=kn(o,n);if(a)return{type:"teammate",signals:{...i,hasTeamMarkers:!0},teamMatch:a};if(i.hasProjectContext){let l=i.toolCountBucket==="restricted"&&i.modelTier==="fast";return{type:"main",signals:i,spoofingSuspected:l}}return i.hasSubagentMarkers?{type:"subagent",signals:i}:{type:"unknown",signals:i}}function As(t,e,n){let o=e.some(c=>c.name==="Agent"),r=t.length,i=["CLAUDE.md","## Build & Run","## Architecture","codebase and user instructions"].some(c=>t.includes(c)),a=r<2e3&&!i,l=e.length,g=l<10?"restricted":l<25?"standard":"full",d=n.toLowerCase(),u=d.includes("haiku")?"fast":d.includes("opus")?"flagship":"standard";return{hasProjectContext:i,hasSubagentMarkers:a,hasTeamMarkers:!1,hasAgentTool:o,systemPromptLength:r,toolCountBucket:g,modelTier:u}}var An=C(()=>{"use strict";je();ut()});function Rn(t,e,n){if(t.type==="main"||e.activeMains.length===0)return null;if(t.type==="teammate"&&t.teamName){let s=Ps(t,e);if(s)return s}let o=e.activeMains.length;if(o===1)return{parentAgentId:e.activeMains[0].conversationId,confidence:"confirmed",method:"direct"};if(o===2){let s=Pn(e);if(s)return{...s,confidence:"high"}}if(n){let s=Rs(n,e);if(s)return s}let r=Pn(e);return r?{...r,confidence:o>=3?"inferred":"high"}:null}function Ps(t,e){let n=e.knownTeams.find(o=>o.name===t.teamName);if(!n)return null;if(n.leadCwd){let o=e.activeMains.find(r=>r.cwd===n.leadCwd);if(o)return{parentAgentId:o.conversationId,confidence:"confirmed",method:"team-config"}}return e.activeMains.length===1?{parentAgentId:e.activeMains[0].conversationId,confidence:"confirmed",method:"team-config"}:null}function Pn(t){let e=Date.now(),n=t.config.subagentWaitingThresholdMs,o=t.activeMains.filter(r=>e-r.lastSeenAt>n).sort((r,s)=>r.lastSeenAt-s.lastSeenAt);return o.length===1?{parentAgentId:o[0].conversationId,method:"temporal"}:o.length>1?{parentAgentId:o[0].conversationId,method:"temporal"}:null}function Rs(t,e){for(let[n,o]of e.recentSnapshots)for(let r of o)for(let s of r.originalMessages)if(typeof s.content!="string"&&Array.isArray(s.content))for(let i of s.content){if(i.type!=="tool_use"||i.name!=="Agent")continue;let a=i.input?.prompt;if(typeof a=="string"&&t.includes(a.slice(0,500)))return{parentAgentId:n,confidence:"confirmed",method:"content-match"}}return null}var $n=C(()=>{"use strict"});import{readdirSync as $s,readFileSync as Ms,statSync as In,lstatSync as js,existsSync as Bs,realpathSync as Is}from"node:fs";import{join as Mn,resolve as Ns}from"node:path";import Fs from"gray-matter";function dt(t,e){if(!Bs(t))return[];if(In(t).isFile()&&t.endsWith(".md"))return[Bn(t,e)];let o=$s(t).filter(s=>{if(!s.endsWith(".md"))return!1;let i=Mn(t,s);try{if(js(i).isSymbolicLink()){let a=Is(i).replace(/\\/g,"/").toLowerCase();if(["/.ssh/","/.gnupg/","/.aws/","/.kube/","/.docker/","/etc/shadow","/etc/passwd","/proc/","/sys/","/.env","/credentials","/secrets"].some(g=>a.includes(g)))return!1}}catch{return!1}return!0}),r=[];for(let s of o)try{r.push(Bn(Mn(t,s),e))}catch(i){console.warn(`[cortex] Skipping brain file ${s}: ${i instanceof Error?i.message:String(i)}`)}return r}function Nn(t){let e=[];for(let n of t){if(!n.enabled)continue;let o=dt(Ns(n.path),n.name);e.push(...o)}return e}function Bn(t,e){let n=In(t);if(n.size>jn)throw new Error(`Brain entry ${t} exceeds max size (${n.size} > ${jn} bytes)`);let o=Ms(t,"utf-8"),{data:r,content:s}=Fs(o),i=t.split(/[\\/]/).pop()??t;if(!r.id||!r.title)throw new Error(`Brain entry ${i} is missing required frontmatter fields (id, title)`);return{id:r.id,title:r.title,content:s.trim(),language:r.language||"any",errorTypes:Array.isArray(r.error_types)?r.error_types:[],tags:Array.isArray(r.tags)?r.tags:[],embedding:null,source:e??"local"}}function Fn(t,e){for(let n of t){let o=e.getEntry(n.id);o&&o.content===n.content&&o.embedding!==null||e.addEntry(n)}}var jn,gt=C(()=>{"use strict";jn=256*1024});import{createHash as Os}from"node:crypto";import{join as Ls}from"node:path";function _s(t){return t.map((e,n)=>{let o="text",r="",s=rt(e);if(typeof e.content=="string")r=e.content.slice(0,100);else{if(new Set(e.content.map(l=>l.type)).size===1){let l=e.content[0].type;o=["text","tool_use","tool_result","image","thinking"].includes(l)?l:"other"}else o="mixed";let a=e.content.find(l=>l.type==="text");a&&"text"in a&&(r=a.text.slice(0,100))}return{index:n,role:e.role,contentType:o,tokenCount:s,preview:r}})}function qs(t){let e=t;for(let n of Ds)e=e.replace(n,o=>o.length<=8?o:o.slice(0,4)+"***REDACTED***"+o.slice(-4));return e}function Us(t){return JSON.parse(JSON.stringify(t,(e,n)=>e==="source"&&n&&typeof n=="object"&&n.type==="base64"&&typeof n.data=="string"?{...n,data:`[image: ${n.media_type}, ${n.data.length} base64 chars]`}:typeof n=="string"&&n.length>20?qs(n):n))}var Ds,Fe,On=C(()=>{"use strict";Vt();je();st();it();an();ln();fe();fn();Sn();wn();An();$n();gt();q();Ds=[/\b(sk-[a-zA-Z0-9_-]{20,})\b/g,/\b(ghp_[a-zA-Z0-9]{36,})\b/g,/\b(ghs_[a-zA-Z0-9]{36,})\b/g,/(Bearer\s+)[a-zA-Z0-9._\-/+]{20,}/gi,/(Authorization:\s*)[^\s]+/gi,/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g];Fe=class{config;store;logger;events;features;registry;knownTeams=[];state;requestCounter=0;constructor(e,n,o,r,s,i){this.config=e,this.store=n,this.logger=o,this.events=r??null,this.features=s??null,this.registry=i??null,this.state=new Me}setKnownTeams(e){this.knownTeams=e}async initialize(){let e=Ls(this.config.dataDir,"models");await Ie(e);let n=Nn(this.config.brainSources);console.log(`[cortex] Loaded ${n.length} brain entries from ${this.config.brainSources.filter(o=>o.enabled).length} source(s)`);for(let o of n)o.embedding||(o.embedding=await ie(o.content));console.log("[cortex] Embeddings computed for all entries"),Fn(n,this.store),console.log(`[cortex] Brain store synced \u2014 ${this.store.getEntryCount()} entries`)}detectAndLinkAgent(e,n,o){let r=Cn(e,n),s=En(e,n,this.knownTeams),i=r.conversationId,a=s.type,l=Date.now(),g={conversationId:r.conversationId,type:s.type,model:e.model??"unknown",toolCount:(e.tools??[]).length,systemPromptHash:r.systemPromptHash,firstSeenAt:l,lastSeenAt:l,requestCount:1,teamName:s.teamMatch?.teamName,teamRole:s.teamMatch?.role,isLead:s.teamMatch?.isLead,classificationSignals:s.signals,spoofingSuspected:s.spoofingSuspected},d=this.registry.getOrCreate(r.conversationId,g),u=null;if(d&&d.info.requestCount===1&&a!=="main")try{let c=[];for(let b of this.registry.listActive())b.type==="main"&&c.push({conversationId:b.conversationId,lastSeenAt:b.lastSeenAt,cwd:void 0});let h=new Map;for(let b of c){let y=this.registry.get(b.conversationId);y?.requestHistory?.length&&h.set(b.conversationId,y.requestHistory)}let f=ee(e.system);u=Rn(d.info,{activeMains:c,knownTeams:this.knownTeams,recentSnapshots:h,config:this.config.agentTracking},f),u&&(d.parentLink=u)}catch(c){this.events?.emitEvent({type:"pipeline:error",requestId:o,error:c instanceof Error?c.message:"Agent linking failed",stage:"agent-linking"})}return this.events?.emitEvent({type:"agent:detected",requestId:o,agentId:r.conversationId,agentType:s.type,isNew:d.info.requestCount===1,model:g.model,toolCount:g.toolCount,teamName:s.teamMatch?.teamName,teamRole:s.teamMatch?.role,parentAgentId:u?.parentAgentId,linkConfidence:u?.confidence,linkStatus:u?"linked":"unlinked"}),{agentId:i,agentType:a,agentState:d,parentLink:u}}buildIsEnabled(e){return n=>{if(!this.features)return!0;if(n!=="agentTracking"&&e&&this.features.isEnabled("agentTracking")){if(e==="unknown")return this.features.isEnabled(n);let o=e==="subagent"?"subagents":e==="teammate"?"teammates":"main",r=this.config.agentTracking[o];if(n in r)return r[n]}return this.features.isEnabled(n)}}captureRequestSnapshot(e,n,o,r,s,i,a,l,g,d,u,c,h){let f=-1;for(let y=s.length-1;y>=0;y--)if(s[y].role==="user"){f=y;break}let b={requestId:d,timestamp:u,agentId:n,model:o.model??"unknown",systemPromptPreview:ee(o.system).slice(0,200),messagesSummary:_s(r),originalMessages:Us(r),operations:[...a,...g?[{type:"inject",insertedAtIndex:f===-1?i.length-1:f,content:l[0].entry.content,brainEntryTitle:l[0].entry.title,confidence:l[0].score}]:[]],tokensBefore:c,tokensAfter:c-h};e.pushSnapshot(b,this.config.agentTracking.maxRequestHistory)}async processRequest(e){let n=Date.now();this.requestCounter++;let o=this.requestCounter,r="parse",s,i;try{this.state.incrementRequest();let{messages:a,meta:l}=Yt(e),g;if(this.registry&&this.features?.isEnabled("agentTracking"))try{let v=this.detectAndLinkAgent(l,a,o);v&&(s=v.agentId,i=v.agentType,g=v.agentState)}catch(v){this.events?.emitEvent({type:"pipeline:error",requestId:o,error:v instanceof Error?v.message:"Agent detection failed",stage:"agent-detection"}),s=void 0,i=void 0,g=void 0}let d=this.buildIsEnabled(i);this.events?.emitEvent({type:"request:start",requestId:o,timestamp:n,path:"/v1/messages",model:l.model??"unknown",messageCount:a.length,streamMode:!!l.stream,agentId:s,agentType:i});let u=Os("sha256").update(e.subarray(0,64)).digest("hex").slice(0,16),c=nn(u),h=c??en(a),f=c?"exact":"estimated";this.state.updateTokenEstimate(h),r="prune";let b=a,y=0,j=[];if(d("pruning")){let v=sn(a,this.config.pruneThresholdTokens);b=v.messages,y=v.tokensSaved,j=v.pruneOps}let B=h-y;this.events?.emitEvent({type:"prune:complete",requestId:o,tokensBefore:h,tokensAfter:B,tokensSaved:y,prunedBlocks:j.length,tokenSource:f}),r="fingerprint";let S=null;if(d("fingerprinting")){let v=Date.now(),ne=3e4,oe=pn(b),I=new Promise((ce,Q)=>{let jt=setTimeout(()=>Q(new Error("Fingerprint timeout")),ne);jt.unref&&jt.unref()});try{S=await Promise.race([oe,I])}catch(ce){S=null,this.events?.emitEvent({type:"pipeline:error",requestId:o,error:ce instanceof Error?ce.message:"Fingerprint timeout",stage:"fingerprint"})}let ke=Date.now()-v;S&&(g?g.fingerprint=S:this.state.updateFingerprint(S),this.events?.emitEvent({type:"fingerprint:complete",requestId:o,languages:S.rules.languages,errorTypes:S.rules.errorTypes,fileTypes:S.rules.fileTypes,phase:S.rules.phase,embeddingTimeMs:ke}))}r="match";let E=[];if(d("matching")&&S){let v=this.store.getAllEntries(),ne=Date.now();E=bn(S,v,this.config.rrfWeights);let oe=Date.now()-ne;g?g.lastMatchResults=E.map(I=>({title:I.entry.title,score:I.score})):this.state.updateMatches(E),this.events?.emitEvent({type:"match:complete",requestId:o,topMatches:E.slice(0,5).map(I=>({title:I.entry.title,score:I.score,ch1:I.ch1Score,ch2:I.ch2Score})),matchTimeMs:oe})}r="inject";let J=b,m=!1,w=y>0?"pruned":"passthrough";d("injection")&&E.length>0&&E[0].score>this.config.injectionConfidenceThreshold&&!Gt(h,l.model??"unknown",this.config.contextPressureThreshold)&&(J=cn(b,E[0].entry.content),m=!0,w=`injected: ${E[0].entry.title}`),this.events?.emitEvent({type:"inject:complete",requestId:o,injected:m,entryTitle:E.length>0?E[0].entry.title:null,confidence:E.length>0?E[0].score:null}),g&&d("agentTracking")&&this.captureRequestSnapshot(g,s,l,a,b,J,j,E,m,o,n,h,y),r="rebuild";let k=y>0||m,P=k?Zt(l,J):e;if(d("logging")){let v={timestamp:new Date().toISOString(),requestCount:this.state.requestCount,tokensEstimated:h,fingerprintSummary:{languages:S?.rules.languages??[],errorTypes:S?.rules.errorTypes??[]},topMatchScore:E.length>0?E[0].score:null,topMatchEntry:E.length>0?E[0].entry.title:null,injected:m,tokensPruned:y,processingTimeMs:Date.now()-n,reason:w,agentId:s,agentType:i};this.logger.log(v)}return this.events?.emitEvent({type:"request:end",requestId:o,totalTimeMs:Date.now()-n,modified:k,reason:w}),{body:P,modified:k,reason:w}}catch(a){this.events?.emitEvent({type:"pipeline:error",requestId:o,error:a instanceof Error?a.message:String(a),stage:r});let l={timestamp:new Date().toISOString(),requestCount:this.state.requestCount,tokensEstimated:0,fingerprintSummary:{languages:[],errorTypes:[]},topMatchScore:null,topMatchEntry:null,injected:!1,tokensPruned:0,processingTimeMs:Date.now()-n,reason:"error",agentId:s,agentType:i};return this.logger.log(l),this.events?.emitEvent({type:"request:end",requestId:o,totalTimeMs:Date.now()-n,modified:!1,reason:"error"}),{body:e,modified:!1,reason:"error"}}}}});import{readFileSync as Hs,writeFileSync as Ws,existsSync as Js}from"node:fs";import{join as zs}from"node:path";import{homedir as Ks}from"node:os";import{parse as Xs,stringify as Gs}from"yaml";var Vs,Ys,ae,mt=C(()=>{"use strict";Vs=["pruning","injection","fingerprinting","matching","logging","dashboard","verbose"],Ys=["agentTracking"],ae=class{constructor(e){this.config=e;this.featureNames=[...Vs,...Ys.filter(n=>n in e.features&&e.features[n]!==void 0)]}featureNames;isEnabled(e){return e==="matching"&&!this.isEnabled("fingerprinting")||e==="injection"&&!this.isEnabled("matching")?!1:this.config.features[e]??!1}enable(e){this.config.features[e]=!0,this.persistFeatures()}disable(e){this.config.features[e]=!1,this.persistFeatures()}list(){return this.featureNames.map(e=>{let n=this.isEnabled(e),o;return e==="matching"&&this.config.features.matching&&!this.config.features.fingerprinting&&(o="disabled because fingerprinting is off"),e==="injection"&&this.config.features.injection&&(this.config.features.matching?this.config.features.fingerprinting||(o="disabled because fingerprinting is off"):o="disabled because matching is off"),{name:e,enabled:n,...o?{reason:o}:{}}})}persistFeatures(){let e=zs(Ks(),".cortex","config.yaml"),n={};if(Js(e)){let o=Hs(e,"utf-8");n=Xs(o)??{}}n.features={...this.config.features},Ws(e,Gs(n),"utf-8")}}});function Oe(t,e){let n=new Map;return setInterval(()=>{let r=Date.now()-6e4;for(let[s,i]of n)i._ts<r&&n.delete(s)},6e4).unref(),t.onEvent(r=>{let s=r.requestId;if(r.type==="request:start"){n.set(s,{start:r,agentId:r.agentId,agentType:r.agentType,_ts:Date.now()});return}let i=n.get(s);switch(i||(i={_ts:Date.now()},n.set(s,i)),r.type){case"prune:complete":i.prune=r;break;case"fingerprint:complete":i.fingerprint=r;break;case"match:complete":i.match=r;break;case"inject:complete":i.inject=r;break;case"agent:detected":i.agent=r;break;case"pipeline:error":i.error=r;break;case"request:end":e.onComplete(s,i,r),n.delete(s);break}}),{pending:n}}var pt=C(()=>{"use strict"});import{appendFileSync as Ln,mkdirSync as _n,existsSync as ft,readdirSync as Zs,statSync as Qs,unlinkSync as ei}from"node:fs";import{join as ye}from"node:path";function ni(t,e=ti){if(!ft(t))return;let n=Date.now()-e*24*60*60*1e3,o=Zs(t);for(let r of o){if(!r.startsWith("session-")||!r.endsWith(".jsonl"))continue;let s=ye(t,r);try{Qs(s).mtimeMs<n&&ei(s)}catch{}}}function Dn(t,e){let n=ye(t,"logs");ft(n)||_n(n,{recursive:!0});let o=ye(n,"audit.jsonl");Ln(o,JSON.stringify(e)+`
29
- `)}function qn(t,e){let n=ye(e,"logs");ft(n)||_n(n,{recursive:!0}),ni(n),Oe(t,{onComplete(o,r,s){let i={timestamp:new Date().toISOString(),requestCount:o,tokensEstimated:r.prune?.tokensBefore??0,fingerprintSummary:{languages:r.fingerprint?.languages??[],errorTypes:r.fingerprint?.errorTypes??[]},topMatchScore:r.match?.topMatches?.[0]?.score??null,topMatchEntry:r.match?.topMatches?.[0]?.title??null,injected:r.inject?.injected??!1,tokensPruned:r.prune?.tokensSaved??0,processingTimeMs:s.totalTimeMs,reason:s.reason,agentId:r.agentId,agentType:r.agentType},a=new Date().toISOString().slice(0,10),l=ye(n,`session-${a}.jsonl`);Ln(l,JSON.stringify(i)+`
30
- `,"utf-8")}})}var ti,ht=C(()=>{"use strict";pt();ti=30});function Un(t){let e=t["content-type"];return typeof e=="string"&&e.includes("text/event-stream")}function yt(t){t.setNoDelay(!0)}var Hn=C(()=>{"use strict"});import*as Wn from"node:https";import*as Jn from"node:http";function Kn(t){return t==="http:"?Jn.request:Wn.request}function Xn(t,e){let n={};for(let[o,r]of Object.entries(t.headers))!zn.has(o)&&r!==void 0&&(n[o]=r);return n.host=e,n}function Gn(t,e,n){let o=new URL(e.url,t),r=o.protocol==="https:"?443:80,s={hostname:o.hostname,port:o.port||r,path:o.pathname+o.search,method:e.method,headers:n};return{targetUrl:o,options:s}}function Vn(t){return e=>{t.headersSent||(t.writeHead(502,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"Proxy error"})))}}function Yn(t){let e={};for(let[n,o]of Object.entries(t.headers))!zn.has(n)&&o!==void 0&&(e[n]=o);return e}function Le({req:t,res:e,body:n,config:o},r){let s=Xn(t,new URL(t.url,o.targetBaseUrl).hostname);s["content-length"]=Buffer.byteLength(n).toString();let{targetUrl:i,options:a}=Gn(o.targetBaseUrl,t,s),g=Kn(i.protocol)(a,d=>{Un(d.headers)&&(e.socket&&yt(e.socket),d.socket&&yt(d.socket));let u=Yn(d);if(e.writeHead(d.statusCode??502,u),r){let c=[],f=!1,b=0;d.on("data",y=>{f||(c.push(y),b+=y.length,b>65536&&(f=!0,c.length=0)),e.write(y)}),d.on("end",()=>{if(e.writableEnded||e.end(),!f&&c.length>0)try{r(Buffer.concat(c))}catch{}}),d.on("error",()=>{e.writableEnded||e.end()})}else d.pipe(e)});g.setTimeout(12e4,()=>g.destroy()),g.on("error",Vn(e)),g.end(n)}function Zn(t,e,n){let o=Xn(t,new URL(t.url,n.targetBaseUrl).hostname),{targetUrl:r,options:s}=Gn(n.targetBaseUrl,t,o),a=Kn(r.protocol)(s,l=>{let g=Yn(l);e.writeHead(l.statusCode??502,g),l.pipe(e)});a.setTimeout(12e4,()=>a.destroy()),a.on("error",Vn(e)),t.on("error",()=>a.destroy()),t.pipe(a)}var zn,Qn=C(()=>{"use strict";Hn();zn=new Set(["connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","upgrade"])});import{createHash as oi}from"node:crypto";function ii(t){let e=t.subarray(0,64);return oi("sha256").update(e).digest("hex").slice(0,16)}function no(t,e,n,o){let r=t.url??"";if(r.startsWith(eo)&&_e>=si){e.writeHead(429,{"Content-Type":"application/json","Retry-After":"2"}),e.end(JSON.stringify({error:"too_many_requests",message:`Cortex is processing ${_e} concurrent requests. Retry shortly.`}));return}if(r.startsWith(ri)){let l=[],g=0,d=!1;t.on("data",u=>{if(g+=u.length,g>to){d=!0,t.destroy(),e.headersSent||(e.writeHead(413,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:"Request body too large"})));return}l.push(u)}),t.on("end",()=>{if(d)return;let u=Buffer.concat(l),c=ii(u);Le({req:t,res:e,body:u,config:n},h=>{try{let f=JSON.parse(h.toString());typeof f.input_tokens=="number"&&tn(c,f.input_tokens)}catch{}})}),t.on("error",()=>{e.headersSent||(e.writeHead(400,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:"Request error"})))});return}if(!r.startsWith(eo)){Zn(t,e,n);return}let s=[],i=0,a=!1;t.on("data",l=>{if(i+=l.length,i>to){a=!0,t.destroy(),e.headersSent||(e.writeHead(413,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:"Request body too large"})));return}s.push(l)}),t.on("end",async()=>{if(a)return;_e++;let l=Buffer.concat(s);try{let g=await o(l,t.headers),d=g.modified?g.body:l;Le({req:t,res:e,body:d,config:n})}catch{try{Le({req:t,res:e,body:l,config:n})}catch{e.headersSent||(e.writeHead(502,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:"Proxy error"})))}}finally{_e--}}),t.on("error",l=>{e.headersSent||(e.writeHead(400,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:"Request error"})))})}var eo,ri,to,si,_e,oo=C(()=>{"use strict";Qn();it();eo="/v1/messages",ri="/v1/messages/count_tokens",to=10*1024*1024,si=20,_e=0});import*as ro from"node:http";function so(t,e=ai){let n=ro.createServer((o,r)=>{no(o,r,t,e)});return{server:n,start(){return new Promise((o,r)=>{n.once("error",r),n.listen(t.proxyPort,"127.0.0.1",()=>{n.removeListener("error",r),o()})})},stop(){return new Promise((o,r)=>{n.close(s=>s?r(s):o())})}}}var ai,io=C(()=>{"use strict";oo();ai=async(t,e)=>({body:t,modified:!1})});import{EventEmitter as ci}from"node:events";var De,ao=C(()=>{"use strict";De=class extends ci{constructor(){super(),this.setMaxListeners(20)}emitEvent(e){return this.emit("cortex",e)}onEvent(e){return this.on("cortex",e)}}});import M from"chalk";function Z(t){return t.padEnd(li)}function qe(t){return t.toLocaleString("en-US")}function co(t){Oe(t,{onComplete(e,n,o){ui(e,n,o)}})}function ui(t,e,n){let o=[],r=M.gray("\u2502"),s=e.start,i=e.agent?` [${e.agent.agentType}${e.agent.teamRole?":"+e.agent.teamRole:""}]`:"",a=`\u250C\u2500 Request #${t}${i} `+"\u2500".repeat(Math.max(1,40-i.length));if(o.push(M.bold.white(a)),s&&(o.push(`${r} POST ${s.path} model=${s.model} msgs=${s.messageCount} stream=${s.streamMode}`),o.push(r)),e.prune){let d=e.prune,u=d.tokenSource==="exact"?M.green("exact"):M.dim("est");d.tokensSaved===0?o.push(`${r} ${M.yellow(Z("PRUNE"))}no pruning needed [${u}] ${qe(d.tokensBefore)} tokens`):o.push(`${r} ${M.yellow(Z("PRUNE"))}${qe(d.tokensBefore)} \u2192 ${qe(d.tokensAfter)} tokens (saved ${qe(d.tokensSaved)}, ${d.prunedBlocks} blocks) [${u}]`)}if(e.fingerprint){let d=e.fingerprint;o.push(`${r} ${M.cyan(Z("SCAN"))}langs=[${d.languages.join(", ")}] errors=[${d.errorTypes.join(", ")}] ${M.dim(d.embeddingTimeMs+"ms")}`)}if(e.match){let d=e.match;if(d.topMatches.length===0)o.push(`${r} ${M.blue(Z("MATCH"))}(no entries matched)`);else{let u=["\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469"];d.topMatches.forEach((c,h)=>{let b=(c.score>.9?M.green:M.dim)(c.score.toFixed(3)),y=u[h]??"?";h===0?o.push(`${r} ${M.blue(Z("MATCH"))}${y} ${c.title} (${b})`):o.push(`${r} ${y} ${c.title} (${b})`)})}}if(e.inject){let d=e.inject;if(d.injected)o.push(`${r} ${M.bold.green(Z("INJECT"))}${M.bold.green("\u2713")} ${d.entryTitle} (confidence: ${d.confidence.toFixed(3)})`);else{let u=d.confidence,c=u!==null?`below threshold (${u.toFixed(3)})`:"no match";o.push(`${r} ${M.dim(Z("INJECT"))}${M.dim("\u2717")} ${M.dim(c)}`)}}if(e.error){let d=e.error;o.push(`${r} ${M.red(Z("ERROR"))}Pipeline failed at ${d.stage}: ${d.error}`)}o.push(r);let l=n.reason,g=`\u2514\u2500 ${M.dim(n.totalTimeMs+"ms total")} result=${l} `+"\u2500".repeat(25);o.push(M.gray(g)),console.log(o.join(`
31
- `))}var li,lo=C(()=>{"use strict";pt();li=8});import{existsSync as go,mkdirSync as di}from"node:fs";import{resolve as gi}from"node:path";import*as mo from"node:net";import uo from"chalk";function mi(t){return t.replace(/^v/,"").split(".").map(Number)}async function pi(){let[t]=mi(process.version),e=t>=20;return{name:"Node.js version",passed:e,message:e?`Node.js ${process.version}`:`Node.js >= 20.0.0 required, found ${process.version}`,fatal:!e}}async function fi(t){let e=gi(t.brainDir),n=go(e);return{name:"Brain directory",passed:n,message:n?`Brain directory found at ${e}`:`Brain directory not found at ${e}`,fatal:!1}}async function hi(t){return go(t.dataDir)||di(t.dataDir,{recursive:!0}),{name:"Data directory",passed:!0,message:`Data directory ready at ${t.dataDir}`,fatal:!1}}async function yi(t){return new Promise(e=>{let n=mo.createServer();n.once("error",()=>{e({name:"Port availability",passed:!1,message:`Port ${t.proxyPort} may already be in use`,fatal:!1})}),n.listen(t.proxyPort,()=>{n.close(()=>{e({name:"Port availability",passed:!0,message:`Port ${t.proxyPort} is available`,fatal:!1})})})})}async function be(t){let e=await Promise.all([pi(),fi(t),hi(t),yi(t)]);for(let o of e){let r=o.passed?uo.green("\u2713"):uo.red("\u2717");console.log(` ${r} ${o.name}: ${o.message}`)}return{passed:e.every(o=>!o.fatal||o.passed),checks:e}}var bt=C(()=>{"use strict"});function po(t,e){let n=bi[t];return n[Math.floor(Math.random()*n.length)].replace(/\[title\]/g,e.title??"").replace(/\[stage\]/g,e.stage??"").replace(/\[agent\]/g,e.agentType??"").replace(/\[team\]/g,e.teamName??"").replace(/\s*""\s*/g," ").replace(/:\s*$/g,"").trim()}var bi,fo=C(()=>{"use strict";bi={idle:["Watching the wire","Standing by","Ears open","On the wire","Quiet on the line","All clear","Lurking","Waiting for signal","Proxy zen"],intercepted:["Intercepted","Caught one","Snagged a request","On it","Incoming","Got one","Request acquired"],pruning:["Trimming the fat","Decluttering","Marie Kondo mode","Snip snip","Compacting context","Tightening up","Cutting fluff","Less is more","Spring cleaning","Token diet"],fingerprinting:["Reading the room","Taking prints","Profiling","Who goes there","Sizing things up","Pattern scanning","Detecting vibes","Analyzing DNA"],matching:["Rummaging through memories","Digging in the brain","Connecting dots","Brain search","Cross-referencing","Consulting the archives","Flipping through notes","Memory lane","Recall in progress"],injecting:['Slipping in "[title]"',"Whispering context","Planting knowledge","Memory served: [title]",'Injecting "[title]"',"Context drop","Brain boost: [title]","Knowledge unlocked","Feeding the conversation"],"no-match":["Nothing rang a bell","Drew a blank","Brain shrug","Clean pass","No match today","Passed through","All quiet in the brain","Nothing to add"],error:["Oops","Fumbled at [stage]","Hit a wall at [stage]","Stumbled","Glitch in [stage]","Passed through (error)","Tripped up"]}});import{readFileSync as Si,existsSync as xi}from"node:fs";import{join as ho,dirname as Ci}from"node:path";import{fileURLToPath as wi}from"node:url";function So(t,e,n,o,r,s){let i={lastConfidence:null,requestCount:0,totalTokensSaved:0,totalInjections:0,uptimeStartMs:Date.now(),totalLatencyMs:0,lastPhase:"idle",lastPhaseCtx:{}},a=new Set,l=new Set;t.onEvent(u=>{u.type==="agent:detected"?i.lastPhaseCtx={...i.lastPhaseCtx,agentType:u.agentType,teamName:u.teamName}:u.type==="request:start"?(i.lastPhase="intercepted",i.lastPhaseCtx={agentType:u.agentType}):u.type==="prune:complete"?(i.totalTokensSaved+=u.tokensSaved,i.lastPhase="pruning",i.lastPhaseCtx={}):u.type==="fingerprint:complete"?(i.lastPhase="fingerprinting",i.lastPhaseCtx={}):u.type==="match:complete"?(i.lastPhase="matching",i.lastPhaseCtx={}):u.type==="inject:complete"&&u.injected?(i.totalInjections++,i.lastPhase="injecting",i.lastPhaseCtx={title:u.entryTitle??void 0},i.lastConfidence=u.confidence):u.type==="inject:complete"&&!u.injected?(i.lastPhase="no-match",i.lastPhaseCtx={},i.lastConfidence=u.confidence):u.type==="request:end"?(i.requestCount++,i.totalLatencyMs+=u.totalTimeMs):u.type==="pipeline:error"&&(i.lastPhase="error",i.lastPhaseCtx={stage:u.stage});let c=`data: ${JSON.stringify(u)}
25
+ </cortex_context>`,a=n[o],l;return typeof a.content=="string"?l=[{type:"text",text:i},{type:"text",text:a.content}]:l=[{type:"text",text:i},...a.content],n[o]={...a,content:l},n}var bn=C(()=>{"use strict"});async function De(t){if(!Le)return xe||(xe=(async()=>{let e=Date.now(),{pipeline:n,env:o}=await import("@huggingface/transformers");o.cacheDir=t,console.log("[embedder] Loading BGE-small-en model..."),Le=await n("feature-extraction","Xenova/bge-small-en-v1.5"),console.log(`[embedder] Model loaded in ${Date.now()-e}ms`)})().catch(e=>{throw xe=null,e}),xe)}async function de(t){if(!Le)throw new Error("Embedder not initialized. Call initEmbedder() first.");let e=Date.now(),n=await Le(t,{pooling:"cls",normalize:!0}),o=new Float32Array(n.data);return console.log(`[embedder] Inference took ${Date.now()-e}ms`),o}var Le,xe,Ce=C(()=>{"use strict";Le=null,xe=null});function xn(t){if(typeof t=="string")return[t];let e=[];for(let n of t)if(n.type==="text")e.push(n.text);else if(n.type==="tool_result"){let o=n;typeof o.content=="string"?e.push(o.content):Array.isArray(o.content)&&e.push(...xn(o.content))}return e}function Ps(t){if(typeof t=="string")return[];let e=[];for(let n of t)n.type==="tool_use"&&e.push(n);return e}function Rs(t,e){let n=new Set;for(let o of e){let r=JSON.stringify(o.input),s=Object.entries(Sn);for(let[i,a]of s)r.includes(i)&&n.add(a)}for(let[o,r]of Object.entries(Sn))new RegExp(`\\w${o.replace(".","\\.")}\\b`).test(t)&&n.add(r);for(let[o,r]of Ts)o.test(t)&&n.add(r);return Array.from(n)}function $s(t){let e=new Set;for(let n of As)t.includes(n)&&e.add(n);return Array.from(e)}function Ms(t){let e=new Set;for(let n of t){let o=n.input.file_path;if(typeof o=="string"){let r=o.match(/(\.\w+)$/);r&&e.add(r[1])}}return Array.from(e)}function js(t){return t<6?"early":t<=20?"mid":"late"}function Cn(t){let e=[],n=[];for(let r of t)e.push(...xn(r.content)),n.push(...Ps(r.content));let o=e.join(`
26
+ `);return{languages:Rs(o,n),errorTypes:$s(o),fileTypes:Ms(n),phase:js(t.length)}}var Sn,Ts,vs,ks,Es,As,wn=C(()=>{"use strict";Sn={".py":"python",".js":"javascript",".ts":"typescript",".rs":"rust",".go":"go",".java":"java",".rb":"ruby",".php":"php",".cpp":"cpp",".c":"cpp",".sh":"bash"},Ts=[[/\bdef\s+\w+.*:/,"python"],[/\bclass\s+\w+.*:/,"python"],[/\bfunction\s+/,"javascript"],[/\bconst\s+/,"javascript"],[/=>/,"javascript"],[/\bfn\s+/,"rust"],[/\bimpl\s+/,"rust"],[/\bfunc\s+/,"go"]],vs=["ImportError","ModuleNotFoundError","TypeError","ValueError","KeyError","AttributeError","FileNotFoundError","IndentationError","SyntaxError","NameError"],ks=["TypeError","ReferenceError","SyntaxError","RangeError","ENOENT","EACCES","ERR_MODULE_NOT_FOUND","ERR_REQUIRE_ESM","Cannot find module"],Es=["FAILED","exit code 1","error:","Error:","panic:","FATAL","Traceback","stack trace"],As=[...vs,...ks,...Es]});function Bs(t){for(let e=t.length-1;e>=0;e--){if(t[e].role!=="assistant")continue;let n=t[e].content;if(typeof n=="string")return n.slice(0,2e3);let o=[];for(let s of n)s.type==="text"&&o.push(s.text);let r=o.join(`
27
+ `);if(r.length>0)return r.slice(0,2e3)}return""}async function Tn(t){let e=Cn(t),n=Bs(t),o=await de(n||"empty conversation");return{rules:e,semantic:o,timestamp:Date.now()}}var vn=C(()=>{"use strict";wn();Ce()});function kn(t,e){let n;e.language==="any"?n=.5:t.languages.includes(e.language)?n=1:n=0;let o,r=new Set(t.errorTypes),s=new Set(e.errorTypes);if(r.size===0&&s.size===0)o=.5;else{let l=Array.from(s).filter(d=>r.has(d)),g=new Set(Array.from(r).concat(Array.from(s)));o=g.size>0?l.length/g.size:.5}let i;if(e.tags.length===0)i=.5;else{let l=JSON.stringify(t).toLowerCase(),g=0;for(let d of e.tags)l.includes(d.toLowerCase())&&g++;i=g/e.tags.length}let a=.4*n+.4*o+.2*i;return Math.max(0,Math.min(1,a))}var En=C(()=>{"use strict"});function qe(t,e){if(t.length!==e.length)return 0;let n=0,o=0,r=0;for(let i=0;i<t.length;i++)n+=t[i]*e[i],o+=t[i]*t[i],r+=e[i]*e[i];let s=Math.sqrt(o)*Math.sqrt(r);return s===0?0:n/s}var pt=C(()=>{"use strict"});function An(t,e,n){let o=e.filter(u=>u.embedding!==null),r=o.map(u=>({entry:u,score:kn(t.rules,u)}));r.sort((u,c)=>c.score-u.score);let s=new Map;r.forEach((u,c)=>{s.set(u.entry.id,{rank:c,score:u.score})});let i=o.map(u=>({entry:u,score:qe(t.semantic,u.embedding)}));i.sort((u,c)=>c.score-u.score);let a=new Map;i.forEach((u,c)=>{a.set(u.entry.id,{rank:c,score:u.score})});let l=o.map(u=>{let c=s.get(u.id),m=a.get(u.id),h=n.featureOverlap/(60+c.rank)+n.semantic/(60+m.rank);return{entry:u,score:h,ch1Score:c.score,ch2Score:m.score}}),g=n.featureOverlap/60+n.semantic/60,d=n.featureOverlap+n.semantic;if(g>0)for(let u of l){let c=u.score/g,m=d>0?(u.ch1Score*n.featureOverlap+u.ch2Score*n.semantic)/d:0;u.score=c*m}return l.sort((u,c)=>c.score-u.score),l.slice(0,3)}var Pn=C(()=>{"use strict";En();pt()});import{createHash as Rn}from"node:crypto";function $n(t,e){let n=oe(t.system).trim(),o=Rn("sha256").update(n).digest("hex"),r=e.find(a=>a.role==="user"),s=r?Is(r.content):"";return{conversationId:Rn("sha256").update(n).update("\0").update(s.trim()).digest("hex"),systemPromptHash:o,firstUserContent:s}}function Is(t){return typeof t=="string"?t:t.filter(e=>e.type==="text").map(e=>e.text).join(`
28
+ `)}var Mn=C(()=>{"use strict";_e()});import{readFileSync as jn,readdirSync as Ns,existsSync as ft}from"node:fs";import{join as we}from"node:path";import{homedir as Os}from"node:os";function Bn(t){let e=t??we(Os(),".claude"),n=we(e,"teams");if(!ft(n))return[];let o=[];try{let r=Ns(n,{withFileTypes:!0});for(let s of r){if(!s.isDirectory())continue;let i=we(n,s.name,"config.json");if(ft(i))try{let a=jn(i,"utf-8"),l=JSON.parse(a),g=l.members??l.agents??[],d=g.map(b=>{let y=b.name??b.alias,j=b.agentType??b.type,B=b.model,S;return typeof b.prompt=="string"&&b.prompt.length>0?S=b.prompt.slice(0,200):j&&(S=Fs(e,j)),{alias:y,type:j,model:B,systemPromptSnippet:S}}),u=typeof l.leadSessionId=="string"?l.leadSessionId:void 0,c=typeof l.leadAgentId=="string"?l.leadAgentId:void 0,m=c?g.find(b=>b.agentId===c):g.find(b=>b.name==="team-lead"),h=typeof m?.cwd=="string"?m.cwd:void 0;o.push({name:l.name??s.name,members:d,configPath:i,lastReadAt:Date.now(),leadSessionId:u,leadCwd:h})}catch{}}}catch{}return o}function Fs(t,e){if(/[\/\\]|\.\./.test(e))return;let n=we(t,"agents"),o=we(n,`${e}.md`);if(o.startsWith(n)&&ft(o))try{return jn(o,"utf-8").replace(/^---[\s\S]*?---\s*/,"").slice(0,200).trim()||void 0}catch{return}}function In(t,e){for(let n of e)for(let o of n.members)if(o.systemPromptSnippet&&t.includes(o.systemPromptSnippet)){let r=o.alias==="team-lead";return{teamName:n.name,role:o.alias,isLead:r}}return null}var ht=C(()=>{"use strict"});function Nn(t,e,n){let o=oe(t.system),r=t.tools??[],s=t.model??"",i=_s(o,r,s);if(!i.hasAgentTool){let l=i.hasProjectContext&&i.toolCountBucket==="restricted";return{type:"subagent",signals:i,spoofingSuspected:l}}let a=In(o,n);if(a)return{type:"teammate",signals:{...i,hasTeamMarkers:!0},teamMatch:a};if(i.hasProjectContext){let l=i.toolCountBucket==="restricted"&&i.modelTier==="fast";return{type:"main",signals:i,spoofingSuspected:l}}return i.hasSubagentMarkers?{type:"subagent",signals:i}:{type:"unknown",signals:i}}function _s(t,e,n){let o=e.some(c=>c.name==="Agent"),r=t.length,i=["CLAUDE.md","## Build & Run","## Architecture","codebase and user instructions"].some(c=>t.includes(c)),a=r<2e3&&!i,l=e.length,g=l<10?"restricted":l<25?"standard":"full",d=n.toLowerCase(),u=d.includes("haiku")?"fast":d.includes("opus")?"flagship":"standard";return{hasProjectContext:i,hasSubagentMarkers:a,hasTeamMarkers:!1,hasAgentTool:o,systemPromptLength:r,toolCountBucket:g,modelTier:u}}var On=C(()=>{"use strict";_e();ht()});function _n(t,e,n){if(t.type==="main"||e.activeMains.length===0)return null;if(t.type==="teammate"&&t.teamName){let s=Ls(t,e);if(s)return s}let o=e.activeMains.length;if(o===1)return{parentAgentId:e.activeMains[0].conversationId,confidence:"confirmed",method:"direct"};if(o===2){let s=Fn(e);if(s)return{...s,confidence:"high"}}if(n){let s=Ds(n,e);if(s)return s}let r=Fn(e);return r?{...r,confidence:o>=3?"inferred":"high"}:null}function Ls(t,e){let n=e.knownTeams.find(o=>o.name===t.teamName);if(!n)return null;if(n.leadCwd){let o=e.activeMains.find(r=>r.cwd===n.leadCwd);if(o)return{parentAgentId:o.conversationId,confidence:"confirmed",method:"team-config"}}return e.activeMains.length===1?{parentAgentId:e.activeMains[0].conversationId,confidence:"confirmed",method:"team-config"}:null}function Fn(t){let e=Date.now(),n=t.config.subagentWaitingThresholdMs,o=t.activeMains.filter(r=>e-r.lastSeenAt>n).sort((r,s)=>r.lastSeenAt-s.lastSeenAt);return o.length===1?{parentAgentId:o[0].conversationId,method:"temporal"}:o.length>1?{parentAgentId:o[0].conversationId,method:"temporal"}:null}function Ds(t,e){for(let[n,o]of e.recentSnapshots)for(let r of o)for(let s of r.originalMessages)if(typeof s.content!="string"&&Array.isArray(s.content))for(let i of s.content){if(i.type!=="tool_use"||i.name!=="Agent")continue;let a=i.input?.prompt;if(typeof a=="string"&&t.includes(a.slice(0,500)))return{parentAgentId:n,confidence:"confirmed",method:"content-match"}}return null}var Ln=C(()=>{"use strict"});import{readdirSync as qs,readFileSync as Us,statSync as Hn,lstatSync as Hs,existsSync as Ws,realpathSync as Js}from"node:fs";import{join as Dn,resolve as zs}from"node:path";import Xs from"gray-matter";function yt(t,e){if(!Ws(t))return[];if(Hn(t).isFile()&&t.endsWith(".md"))return[Un(t,e)];let o=qs(t).filter(s=>{if(!s.endsWith(".md"))return!1;let i=Dn(t,s);try{if(Hs(i).isSymbolicLink()){let a=Js(i).replace(/\\/g,"/").toLowerCase();if(["/.ssh/","/.gnupg/","/.aws/","/.kube/","/.docker/","/etc/shadow","/etc/passwd","/proc/","/sys/","/.env","/credentials","/secrets"].some(g=>a.includes(g)))return!1}}catch{return!1}return!0}),r=[];for(let s of o)try{r.push(Un(Dn(t,s),e))}catch(i){console.warn(`[cortex] Skipping brain file ${s}: ${i instanceof Error?i.message:String(i)}`)}return r}function Wn(t){let e=[];for(let n of t){if(!n.enabled)continue;let o=yt(zs(n.path),n.name);e.push(...o)}return e}function Un(t,e){let n=Hn(t);if(n.size>qn)throw new Error(`Brain entry ${t} exceeds max size (${n.size} > ${qn} bytes)`);let o=Us(t,"utf-8"),{data:r,content:s}=Xs(o),i=t.split(/[\\/]/).pop()??t;if(!r.id||!r.title)throw new Error(`Brain entry ${i} is missing required frontmatter fields (id, title)`);return{id:r.id,title:r.title,content:s.trim(),language:r.language||"any",errorTypes:Array.isArray(r.error_types)?r.error_types:[],tags:Array.isArray(r.tags)?r.tags:[],embedding:null,source:e??"local"}}function Jn(t,e){for(let n of t){let o=e.getEntry(n.id);o&&o.content===n.content&&o.embedding!==null||e.addEntry(n)}}var qn,bt=C(()=>{"use strict";qn=256*1024});import{createHash as Ks}from"node:crypto";import{join as Gs}from"node:path";function Vs(t){return t.map((e,n)=>{let o="text",r="",s=ut(e);if(typeof e.content=="string")r=e.content.slice(0,100);else{if(new Set(e.content.map(l=>l.type)).size===1){let l=e.content[0].type;o=["text","tool_use","tool_result","image","thinking"].includes(l)?l:"other"}else o="mixed";let a=e.content.find(l=>l.type==="text");a&&"text"in a&&(r=a.text.slice(0,100))}return{index:n,role:e.role,contentType:o,tokenCount:s,preview:r}})}function Zs(t){let e=t;for(let n of Ys)e=e.replace(n,o=>o.length<=8?o:o.slice(0,4)+"***REDACTED***"+o.slice(-4));return e}function Qs(t){return JSON.parse(JSON.stringify(t,(e,n)=>e==="source"&&n&&typeof n=="object"&&n.type==="base64"&&typeof n.data=="string"?{...n,data:`[image: ${n.media_type}, ${n.data.length} base64 chars]`}:typeof n=="string"&&n.length>20?Zs(n):n))}var Ys,Ue,zn=C(()=>{"use strict";sn();_e();dt();gt();hn();bn();Ce();vn();Pn();Mn();On();Ln();bt();q();Ys=[/\b(sk-[a-zA-Z0-9_-]{20,})\b/g,/\b(ghp_[a-zA-Z0-9]{36,})\b/g,/\b(ghs_[a-zA-Z0-9]{36,})\b/g,/(Bearer\s+)[a-zA-Z0-9._\-/+]{20,}/gi,/(Authorization:\s*)[^\s]+/gi,/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g];Ue=class{config;store;logger;events;features;registry;knownTeams=[];state;requestCounter=0;constructor(e,n,o,r,s,i){this.config=e,this.store=n,this.logger=o,this.events=r??null,this.features=s??null,this.registry=i??null,this.state=new Fe}setKnownTeams(e){this.knownTeams=e}async initialize(){let e=Gs(this.config.dataDir,"models");await De(e);let n=Wn(this.config.brainSources);console.log(`[cortex] Loaded ${n.length} brain entries from ${this.config.brainSources.filter(o=>o.enabled).length} source(s)`);for(let o of n)o.embedding||(o.embedding=await de(o.content));console.log("[cortex] Embeddings computed for all entries"),Jn(n,this.store),console.log(`[cortex] Brain store synced \u2014 ${this.store.getEntryCount()} entries`)}detectAndLinkAgent(e,n,o){let r=$n(e,n),s=Nn(e,n,this.knownTeams),i=r.conversationId,a=s.type,l=Date.now(),g={conversationId:r.conversationId,type:s.type,model:e.model??"unknown",toolCount:(e.tools??[]).length,systemPromptHash:r.systemPromptHash,firstSeenAt:l,lastSeenAt:l,requestCount:1,teamName:s.teamMatch?.teamName,teamRole:s.teamMatch?.role,isLead:s.teamMatch?.isLead,classificationSignals:s.signals,spoofingSuspected:s.spoofingSuspected},d=this.registry.getOrCreate(r.conversationId,g),u=null;if(d&&d.info.requestCount===1&&a!=="main")try{let c=[];for(let b of this.registry.listActive())b.type==="main"&&c.push({conversationId:b.conversationId,lastSeenAt:b.lastSeenAt,cwd:void 0});let m=new Map;for(let b of c){let y=this.registry.get(b.conversationId);y?.requestHistory?.length&&m.set(b.conversationId,y.requestHistory)}let h=oe(e.system);u=_n(d.info,{activeMains:c,knownTeams:this.knownTeams,recentSnapshots:m,config:this.config.agentTracking},h),u&&(d.parentLink=u)}catch(c){this.events?.emitEvent({type:"pipeline:error",requestId:o,error:c instanceof Error?c.message:"Agent linking failed",stage:"agent-linking"})}return this.events?.emitEvent({type:"agent:detected",requestId:o,agentId:r.conversationId,agentType:s.type,isNew:d.info.requestCount===1,model:g.model,toolCount:g.toolCount,teamName:s.teamMatch?.teamName,teamRole:s.teamMatch?.role,parentAgentId:u?.parentAgentId,linkConfidence:u?.confidence,linkStatus:u?"linked":"unlinked"}),{agentId:i,agentType:a,agentState:d,parentLink:u}}buildIsEnabled(e){return n=>{if(!this.features)return!0;if(n!=="agentTracking"&&e&&this.features.isEnabled("agentTracking")){if(e==="unknown")return this.features.isEnabled(n);let o=e==="subagent"?"subagents":e==="teammate"?"teammates":"main",r=this.config.agentTracking[o];if(n in r)return r[n]}return this.features.isEnabled(n)}}captureRequestSnapshot(e,n,o,r,s,i,a,l,g,d,u,c,m){let h=-1;for(let y=s.length-1;y>=0;y--)if(s[y].role==="user"){h=y;break}let b={requestId:d,timestamp:u,agentId:n,model:o.model??"unknown",systemPromptPreview:oe(o.system).slice(0,200),messagesSummary:Vs(r),originalMessages:Qs(r),operations:[...a,...g?[{type:"inject",insertedAtIndex:h===-1?i.length-1:h,content:l[0].entry.content,brainEntryTitle:l[0].entry.title,confidence:l[0].score}]:[]],tokensBefore:c,tokensAfter:c-m};e.pushSnapshot(b,this.config.agentTracking.maxRequestHistory)}async processRequest(e){let n=Date.now();this.requestCounter++;let o=this.requestCounter,r="parse",s,i;try{this.state.incrementRequest();let{messages:a,meta:l}=an(e),g;if(this.registry&&this.features?.isEnabled("agentTracking"))try{let v=this.detectAndLinkAgent(l,a,o);v&&(s=v.agentId,i=v.agentType,g=v.agentState)}catch(v){this.events?.emitEvent({type:"pipeline:error",requestId:o,error:v instanceof Error?v.message:"Agent detection failed",stage:"agent-detection"}),s=void 0,i=void 0,g=void 0}let d=this.buildIsEnabled(i);this.events?.emitEvent({type:"request:start",requestId:o,timestamp:n,path:"/v1/messages",model:l.model??"unknown",messageCount:a.length,streamMode:!!l.stream,agentId:s,agentType:i});let u=Ks("sha256").update(e.subarray(0,64)).digest("hex").slice(0,16),c=gn(u),m=c??un(a),h=c?"exact":"estimated";this.state.updateTokenEstimate(m),r="prune";let b=a,y=0,j=[];if(d("pruning")){let v=fn(a,this.config.pruneThresholdTokens);b=v.messages,y=v.tokensSaved,j=v.pruneOps}let B=m-y;this.events?.emitEvent({type:"prune:complete",requestId:o,tokensBefore:m,tokensAfter:B,tokensSaved:y,prunedBlocks:j.length,tokenSource:h}),r="fingerprint";let S=null;if(d("fingerprinting")){let v=Date.now(),ie=3e4,ae=Tn(b),I=new Promise((ye,ne)=>{let qt=setTimeout(()=>ne(new Error("Fingerprint timeout")),ie);qt.unref&&qt.unref()});try{S=await Promise.race([ae,I])}catch(ye){S=null,this.events?.emitEvent({type:"pipeline:error",requestId:o,error:ye instanceof Error?ye.message:"Fingerprint timeout",stage:"fingerprint"})}let $e=Date.now()-v;S&&(g?g.fingerprint=S:this.state.updateFingerprint(S),this.events?.emitEvent({type:"fingerprint:complete",requestId:o,languages:S.rules.languages,errorTypes:S.rules.errorTypes,fileTypes:S.rules.fileTypes,phase:S.rules.phase,embeddingTimeMs:$e}))}r="match";let E=[];if(d("matching")&&S){let v=this.store.getAllEntries(),ie=Date.now();E=An(S,v,this.config.rrfWeights);let ae=Date.now()-ie;g?g.lastMatchResults=E.map(I=>({title:I.entry.title,score:I.score})):this.state.updateMatches(E),this.events?.emitEvent({type:"match:complete",requestId:o,topMatches:E.slice(0,5).map(I=>({title:I.entry.title,score:I.score,ch1:I.ch1Score,ch2:I.ch2Score})),matchTimeMs:ae})}r="inject";let J=b,p=!1,w=y>0?"pruned":"passthrough";d("injection")&&E.length>0&&E[0].score>this.config.injectionConfidenceThreshold&&!rn(m,l.model??"unknown",this.config.contextPressureThreshold)&&(J=yn(b,E[0].entry.content),p=!0,w=`injected: ${E[0].entry.title}`),this.events?.emitEvent({type:"inject:complete",requestId:o,injected:p,entryTitle:E.length>0?E[0].entry.title:null,confidence:E.length>0?E[0].score:null}),g&&d("agentTracking")&&this.captureRequestSnapshot(g,s,l,a,b,J,j,E,p,o,n,m,y),r="rebuild";let k=y>0||p,P=k?cn(l,J):e;if(d("logging")){let v={timestamp:new Date().toISOString(),requestCount:this.state.requestCount,tokensEstimated:m,fingerprintSummary:{languages:S?.rules.languages??[],errorTypes:S?.rules.errorTypes??[]},topMatchScore:E.length>0?E[0].score:null,topMatchEntry:E.length>0?E[0].entry.title:null,injected:p,tokensPruned:y,processingTimeMs:Date.now()-n,reason:w,agentId:s,agentType:i};this.logger.log(v)}return this.events?.emitEvent({type:"request:end",requestId:o,totalTimeMs:Date.now()-n,modified:k,reason:w}),{body:P,modified:k,reason:w}}catch(a){this.events?.emitEvent({type:"pipeline:error",requestId:o,error:a instanceof Error?a.message:String(a),stage:r});let l={timestamp:new Date().toISOString(),requestCount:this.state.requestCount,tokensEstimated:0,fingerprintSummary:{languages:[],errorTypes:[]},topMatchScore:null,topMatchEntry:null,injected:!1,tokensPruned:0,processingTimeMs:Date.now()-n,reason:"error",agentId:s,agentType:i};return this.logger.log(l),this.events?.emitEvent({type:"request:end",requestId:o,totalTimeMs:Date.now()-n,modified:!1,reason:"error"}),{body:e,modified:!1,reason:"error"}}}}});import{readFileSync as ei,writeFileSync as ti,existsSync as ni}from"node:fs";import{join as oi}from"node:path";import{homedir as ri}from"node:os";import{parse as si,stringify as ii}from"yaml";var ai,ci,ge,St=C(()=>{"use strict";ai=["pruning","injection","fingerprinting","matching","logging","dashboard","verbose"],ci=["agentTracking"],ge=class{constructor(e){this.config=e;this.featureNames=[...ai,...ci.filter(n=>n in e.features&&e.features[n]!==void 0)]}featureNames;isEnabled(e){return e==="matching"&&!this.isEnabled("fingerprinting")||e==="injection"&&!this.isEnabled("matching")?!1:this.config.features[e]??!1}enable(e){this.config.features[e]=!0,this.persistFeatures()}disable(e){this.config.features[e]=!1,this.persistFeatures()}list(){return this.featureNames.map(e=>{let n=this.isEnabled(e),o;return e==="matching"&&this.config.features.matching&&!this.config.features.fingerprinting&&(o="disabled because fingerprinting is off"),e==="injection"&&this.config.features.injection&&(this.config.features.matching?this.config.features.fingerprinting||(o="disabled because fingerprinting is off"):o="disabled because matching is off"),{name:e,enabled:n,...o?{reason:o}:{}}})}persistFeatures(){let e=oi(ri(),".cortex","config.yaml"),n={};if(ni(e)){let o=ei(e,"utf-8");n=si(o)??{}}n.features={...this.config.features},ti(e,ii(n),"utf-8")}}});function He(t,e){let n=new Map;return setInterval(()=>{let r=Date.now()-6e4;for(let[s,i]of n)i._ts<r&&n.delete(s)},6e4).unref(),t.onEvent(r=>{let s=r.requestId;if(r.type==="request:start"){n.set(s,{start:r,agentId:r.agentId,agentType:r.agentType,_ts:Date.now()});return}let i=n.get(s);switch(i||(i={_ts:Date.now()},n.set(s,i)),r.type){case"prune:complete":i.prune=r;break;case"fingerprint:complete":i.fingerprint=r;break;case"match:complete":i.match=r;break;case"inject:complete":i.inject=r;break;case"agent:detected":i.agent=r;break;case"pipeline:error":i.error=r;break;case"request:end":e.onComplete(s,i,r),n.delete(s);break}}),{pending:n}}var xt=C(()=>{"use strict"});import{appendFileSync as Xn,mkdirSync as Kn,existsSync as Ct,readdirSync as li,statSync as ui,unlinkSync as di}from"node:fs";import{join as Te}from"node:path";function mi(t,e=gi){if(!Ct(t))return;let n=Date.now()-e*24*60*60*1e3,o=li(t);for(let r of o){if(!r.startsWith("session-")||!r.endsWith(".jsonl"))continue;let s=Te(t,r);try{ui(s).mtimeMs<n&&di(s)}catch{}}}function Gn(t,e){let n=Te(t,"logs");Ct(n)||Kn(n,{recursive:!0});let o=Te(n,"audit.jsonl");Xn(o,JSON.stringify(e)+`
29
+ `)}function Vn(t,e){let n=Te(e,"logs");Ct(n)||Kn(n,{recursive:!0}),mi(n),He(t,{onComplete(o,r,s){let i={timestamp:new Date().toISOString(),requestCount:o,tokensEstimated:r.prune?.tokensBefore??0,fingerprintSummary:{languages:r.fingerprint?.languages??[],errorTypes:r.fingerprint?.errorTypes??[]},topMatchScore:r.match?.topMatches?.[0]?.score??null,topMatchEntry:r.match?.topMatches?.[0]?.title??null,injected:r.inject?.injected??!1,tokensPruned:r.prune?.tokensSaved??0,processingTimeMs:s.totalTimeMs,reason:s.reason,agentId:r.agentId,agentType:r.agentType},a=new Date().toISOString().slice(0,10),l=Te(n,`session-${a}.jsonl`);Xn(l,JSON.stringify(i)+`
30
+ `,"utf-8")}})}var gi,wt=C(()=>{"use strict";xt();gi=30});function Yn(t){let e=t["content-type"];return typeof e=="string"&&e.includes("text/event-stream")}function Tt(t){t.setNoDelay(!0)}var Zn=C(()=>{"use strict"});import*as Qn from"node:https";import*as eo from"node:http";function no(t){return t==="http:"?eo.request:Qn.request}function oo(t,e){let n={};for(let[o,r]of Object.entries(t.headers))!to.has(o)&&r!==void 0&&(n[o]=r);return n.host=e,n}function ro(t,e,n){let o=new URL(e.url,t),r=o.protocol==="https:"?443:80,s={hostname:o.hostname,port:o.port||r,path:o.pathname+o.search,method:e.method,headers:n};return{targetUrl:o,options:s}}function so(t){return e=>{t.headersSent||(t.writeHead(502,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"Proxy error"})))}}function io(t){let e={};for(let[n,o]of Object.entries(t.headers))!to.has(n)&&o!==void 0&&(e[n]=o);return e}function We({req:t,res:e,body:n,config:o},r){let s=oo(t,new URL(t.url,o.targetBaseUrl).hostname);s["content-length"]=Buffer.byteLength(n).toString();let{targetUrl:i,options:a}=ro(o.targetBaseUrl,t,s),g=no(i.protocol)(a,d=>{Yn(d.headers)&&(e.socket&&Tt(e.socket),d.socket&&Tt(d.socket));let u=io(d);if(e.writeHead(d.statusCode??502,u),r){let c=[],h=!1,b=0;d.on("data",y=>{h||(c.push(y),b+=y.length,b>65536&&(h=!0,c.length=0)),e.write(y)}),d.on("end",()=>{if(e.writableEnded||e.end(),!h&&c.length>0)try{r(Buffer.concat(c))}catch{}}),d.on("error",()=>{e.writableEnded||e.end()})}else d.pipe(e)});g.setTimeout(12e4,()=>g.destroy()),g.on("error",so(e)),g.end(n)}function ao(t,e,n){let o=oo(t,new URL(t.url,n.targetBaseUrl).hostname),{targetUrl:r,options:s}=ro(n.targetBaseUrl,t,o),a=no(r.protocol)(s,l=>{let g=io(l);e.writeHead(l.statusCode??502,g),l.pipe(e)});a.setTimeout(12e4,()=>a.destroy()),a.on("error",so(e)),t.on("error",()=>a.destroy()),t.pipe(a)}var to,co=C(()=>{"use strict";Zn();to=new Set(["connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","upgrade"])});import{createHash as pi}from"node:crypto";function yi(t){let e=t.subarray(0,64);return pi("sha256").update(e).digest("hex").slice(0,16)}function go(t,e,n,o){let r=t.url??"";if(r.startsWith(lo)&&Je>=hi){e.writeHead(429,{"Content-Type":"application/json","Retry-After":"2"}),e.end(JSON.stringify({error:"too_many_requests",message:`Cortex is processing ${Je} concurrent requests. Retry shortly.`}));return}if(r.startsWith(fi)){let l=[],g=0,d=!1;t.on("data",u=>{if(g+=u.length,g>uo){d=!0,t.destroy(),e.headersSent||(e.writeHead(413,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:"Request body too large"})));return}l.push(u)}),t.on("end",()=>{if(d)return;let u=Buffer.concat(l),c=yi(u);We({req:t,res:e,body:u,config:n},m=>{try{let h=JSON.parse(m.toString());typeof h.input_tokens=="number"&&dn(c,h.input_tokens)}catch{}})}),t.on("error",()=>{e.headersSent||(e.writeHead(400,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:"Request error"})))});return}if(!r.startsWith(lo)){ao(t,e,n);return}let s=[],i=0,a=!1;t.on("data",l=>{if(i+=l.length,i>uo){a=!0,t.destroy(),e.headersSent||(e.writeHead(413,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:"Request body too large"})));return}s.push(l)}),t.on("end",async()=>{if(a)return;Je++;let l=Buffer.concat(s);try{let g=await o(l,t.headers),d=g.modified?g.body:l;We({req:t,res:e,body:d,config:n})}catch{try{We({req:t,res:e,body:l,config:n})}catch{e.headersSent||(e.writeHead(502,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:"Proxy error"})))}}finally{Je--}}),t.on("error",l=>{e.headersSent||(e.writeHead(400,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:"Request error"})))})}var lo,fi,uo,hi,Je,mo=C(()=>{"use strict";co();gt();lo="/v1/messages",fi="/v1/messages/count_tokens",uo=10*1024*1024,hi=20,Je=0});import*as po from"node:http";function fo(t,e=bi){let n=po.createServer((o,r)=>{go(o,r,t,e)});return{server:n,start(){return new Promise((o,r)=>{n.once("error",r),n.listen(t.proxyPort,"127.0.0.1",()=>{n.removeListener("error",r),o()})})},stop(){return new Promise((o,r)=>{n.close(s=>s?r(s):o())})}}}var bi,ho=C(()=>{"use strict";mo();bi=async(t,e)=>({body:t,modified:!1})});import{EventEmitter as Si}from"node:events";var ze,yo=C(()=>{"use strict";ze=class extends Si{constructor(){super(),this.setMaxListeners(20)}emitEvent(e){return this.emit("cortex",e)}onEvent(e){return this.on("cortex",e)}}});import M from"chalk";function ee(t){return t.padEnd(xi)}function Xe(t){return t.toLocaleString("en-US")}function bo(t){He(t,{onComplete(e,n,o){Ci(e,n,o)}})}function Ci(t,e,n){let o=[],r=M.gray("\u2502"),s=e.start,i=e.agent?` [${e.agent.agentType}${e.agent.teamRole?":"+e.agent.teamRole:""}]`:"",a=`\u250C\u2500 Request #${t}${i} `+"\u2500".repeat(Math.max(1,40-i.length));if(o.push(M.bold.white(a)),s&&(o.push(`${r} POST ${s.path} model=${s.model} msgs=${s.messageCount} stream=${s.streamMode}`),o.push(r)),e.prune){let d=e.prune,u=d.tokenSource==="exact"?M.green("exact"):M.dim("est");d.tokensSaved===0?o.push(`${r} ${M.yellow(ee("PRUNE"))}no pruning needed [${u}] ${Xe(d.tokensBefore)} tokens`):o.push(`${r} ${M.yellow(ee("PRUNE"))}${Xe(d.tokensBefore)} \u2192 ${Xe(d.tokensAfter)} tokens (saved ${Xe(d.tokensSaved)}, ${d.prunedBlocks} blocks) [${u}]`)}if(e.fingerprint){let d=e.fingerprint;o.push(`${r} ${M.cyan(ee("SCAN"))}langs=[${d.languages.join(", ")}] errors=[${d.errorTypes.join(", ")}] ${M.dim(d.embeddingTimeMs+"ms")}`)}if(e.match){let d=e.match;if(d.topMatches.length===0)o.push(`${r} ${M.blue(ee("MATCH"))}(no entries matched)`);else{let u=["\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469"];d.topMatches.forEach((c,m)=>{let b=(c.score>.9?M.green:M.dim)(c.score.toFixed(3)),y=u[m]??"?";m===0?o.push(`${r} ${M.blue(ee("MATCH"))}${y} ${c.title} (${b})`):o.push(`${r} ${y} ${c.title} (${b})`)})}}if(e.inject){let d=e.inject;if(d.injected)o.push(`${r} ${M.bold.green(ee("INJECT"))}${M.bold.green("\u2713")} ${d.entryTitle} (confidence: ${d.confidence.toFixed(3)})`);else{let u=d.confidence,c=u!==null?`below threshold (${u.toFixed(3)})`:"no match";o.push(`${r} ${M.dim(ee("INJECT"))}${M.dim("\u2717")} ${M.dim(c)}`)}}if(e.error){let d=e.error;o.push(`${r} ${M.red(ee("ERROR"))}Pipeline failed at ${d.stage}: ${d.error}`)}o.push(r);let l=n.reason,g=`\u2514\u2500 ${M.dim(n.totalTimeMs+"ms total")} result=${l} `+"\u2500".repeat(25);o.push(M.gray(g)),console.log(o.join(`
31
+ `))}var xi,So=C(()=>{"use strict";xt();xi=8});import{existsSync as Co,mkdirSync as wi}from"node:fs";import{resolve as Ti}from"node:path";import*as wo from"node:net";import xo from"chalk";function vi(t){return t.replace(/^v/,"").split(".").map(Number)}async function ki(){let[t]=vi(process.version),e=t>=20;return{name:"Node.js version",passed:e,message:e?`Node.js ${process.version}`:`Node.js >= 20.0.0 required, found ${process.version}`,fatal:!e}}async function Ei(t){let e=Ti(t.brainDir),n=Co(e);return{name:"Brain directory",passed:n,message:n?`Brain directory found at ${e}`:`Brain directory not found at ${e}`,fatal:!1}}async function Ai(t){return Co(t.dataDir)||wi(t.dataDir,{recursive:!0}),{name:"Data directory",passed:!0,message:`Data directory ready at ${t.dataDir}`,fatal:!1}}async function Pi(t){return new Promise(e=>{let n=wo.createServer();n.once("error",()=>{e({name:"Port availability",passed:!1,message:`Port ${t.proxyPort} may already be in use`,fatal:!1})}),n.listen(t.proxyPort,()=>{n.close(()=>{e({name:"Port availability",passed:!0,message:`Port ${t.proxyPort} is available`,fatal:!1})})})})}async function ve(t){let e=await Promise.all([ki(),Ei(t),Ai(t),Pi(t)]);for(let o of e){let r=o.passed?xo.green("\u2713"):xo.red("\u2717");console.log(` ${r} ${o.name}: ${o.message}`)}return{passed:e.every(o=>!o.fatal||o.passed),checks:e}}var vt=C(()=>{"use strict"});function To(t,e){let n=Ri[t];return n[Math.floor(Math.random()*n.length)].replace(/\[title\]/g,e.title??"").replace(/\[stage\]/g,e.stage??"").replace(/\[agent\]/g,e.agentType??"").replace(/\[team\]/g,e.teamName??"").replace(/\s*""\s*/g," ").replace(/:\s*$/g,"").trim()}var Ri,vo=C(()=>{"use strict";Ri={idle:["Watching the wire","Standing by","Ears open","On the wire","Quiet on the line","All clear","Lurking","Waiting for signal","Proxy zen"],intercepted:["Intercepted","Caught one","Snagged a request","On it","Incoming","Got one","Request acquired"],pruning:["Trimming the fat","Decluttering","Marie Kondo mode","Snip snip","Compacting context","Tightening up","Cutting fluff","Less is more","Spring cleaning","Token diet"],fingerprinting:["Reading the room","Taking prints","Profiling","Who goes there","Sizing things up","Pattern scanning","Detecting vibes","Analyzing DNA"],matching:["Rummaging through memories","Digging in the brain","Connecting dots","Brain search","Cross-referencing","Consulting the archives","Flipping through notes","Memory lane","Recall in progress"],injecting:['Slipping in "[title]"',"Whispering context","Planting knowledge","Memory served: [title]",'Injecting "[title]"',"Context drop","Brain boost: [title]","Knowledge unlocked","Feeding the conversation"],"no-match":["Nothing rang a bell","Drew a blank","Brain shrug","Clean pass","No match today","Passed through","All quiet in the brain","Nothing to add"],error:["Oops","Fumbled at [stage]","Hit a wall at [stage]","Stumbled","Glitch in [stage]","Passed through (error)","Tripped up"]}});import{readFileSync as $i,existsSync as Mi}from"node:fs";import{join as ko,dirname as ji}from"node:path";import{fileURLToPath as Bi}from"node:url";function Po(t,e,n,o,r,s){let i={lastConfidence:null,requestCount:0,totalTokensSaved:0,totalInjections:0,uptimeStartMs:Date.now(),totalLatencyMs:0,lastPhase:"idle",lastPhaseCtx:{}},a=new Set,l=new Set;t.onEvent(u=>{u.type==="agent:detected"?i.lastPhaseCtx={...i.lastPhaseCtx,agentType:u.agentType,teamName:u.teamName}:u.type==="request:start"?(i.lastPhase="intercepted",i.lastPhaseCtx={agentType:u.agentType}):u.type==="prune:complete"?(i.totalTokensSaved+=u.tokensSaved,i.lastPhase="pruning",i.lastPhaseCtx={}):u.type==="fingerprint:complete"?(i.lastPhase="fingerprinting",i.lastPhaseCtx={}):u.type==="match:complete"?(i.lastPhase="matching",i.lastPhaseCtx={}):u.type==="inject:complete"&&u.injected?(i.totalInjections++,i.lastPhase="injecting",i.lastPhaseCtx={title:u.entryTitle??void 0},i.lastConfidence=u.confidence):u.type==="inject:complete"&&!u.injected?(i.lastPhase="no-match",i.lastPhaseCtx={},i.lastConfidence=u.confidence):u.type==="request:end"?(i.requestCount++,i.totalLatencyMs+=u.totalTimeMs):u.type==="pipeline:error"&&(i.lastPhase="error",i.lastPhaseCtx={stage:u.stage});let c=`data: ${JSON.stringify(u)}
32
32
 
33
- `;for(let h of a)h.write(c);if(u.type==="request:end")for(let h of l)h.write(`data: ${JSON.stringify(u)}
33
+ `;for(let m of a)m.write(c);if(u.type==="request:end")for(let m of l)m.write(`data: ${JSON.stringify(u)}
34
34
 
35
35
  `)});function g(){let u=`: heartbeat
36
36
 
37
- `;for(let c of a)c.write(u);for(let c of l)c.write(u)}function d(u,c){let h=u.url??"/",f=u.method??"GET",b=new URL(h,`http://${u.headers.host||"localhost"}`),y=b.pathname;if(c.setHeader("Access-Control-Allow-Origin","null"),c.setHeader("X-Content-Type-Options","nosniff"),y.startsWith("/api/")){let m=u.headers.authorization,w=m?.startsWith("Bearer ")?m.slice(7):null,k=b.searchParams.get("token");if(w!==r&&k!==r){c.writeHead(401,{"content-type":"application/json"}),c.end(JSON.stringify({error:"unauthorized",message:"Invalid or missing API token. Check ~/.cortex/api-token"}));return}}if(f==="GET"&&y==="/"){try{let m=ho(yo,"../dashboard/index.html"),w=ho(yo,"../../src/dashboard/index.html"),k=xi(m)?m:w,v=Si(k,"utf-8").replace("</head>",`<script>window.CORTEX_API_TOKEN='${r}';</script></head>`);c.writeHead(200,{"Content-Type":"text/html","Content-Security-Policy":"default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; connect-src 'self'; img-src 'self'","X-Frame-Options":"DENY","X-Content-Type-Options":"nosniff"}),c.end(v)}catch{c.writeHead(404,{"Content-Type":"text/plain"}),c.end("Dashboard not found")}return}if(f==="GET"&&y==="/api/status"){let m={running:!0,pid:process.pid,port:o.proxyPort,uptime:(Date.now()-i.uptimeStartMs)/1e3,brainEntries:e.getEntryCount(),requestCount:i.requestCount,version:"0.1.0"};N(c,m);return}if(f==="GET"&&y==="/api/session/current"){let m={requestCount:i.requestCount,tokensSaved:i.totalTokensSaved,injectionsCount:i.totalInjections,matchRate:i.requestCount>0?i.totalInjections/i.requestCount:0,avgLatencyMs:i.requestCount>0?Math.round(i.totalLatencyMs/i.requestCount):0};N(c,m);return}if(f==="GET"&&y==="/api/logs/stream"){bo(u,c,l);return}if(f==="GET"&&y==="/api/brain/summary"){let m=e.getAllEntries(),w={};for(let P of m){let v=P.source??"local";w[v]=(w[v]??0)+1}let k={totalEntries:m.length,bySource:w,recentMatches:[]};N(c,k);return}if(f==="GET"&&y==="/api/features"){N(c,{features:n.list()});return}let j=y.match(/^\/api\/features\/([a-zA-Z]+)\/toggle$/);if(f==="POST"&&j){let m=new Set(["pruning","injection","fingerprinting","matching","logging","dashboard","verbose","agentTracking"]),w=j[1];if(!m.has(w)){c.writeHead(400,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:`Unknown feature: ${w}`}));return}let k=w,P=1024,v=[],ne=0,oe=!1;u.on("data",I=>{if(ne+=I.length,ne>P){oe=!0,u.destroy(),c.headersSent||(c.writeHead(413,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Request body too large"})));return}v.push(I)}),u.on("end",()=>{if(oe)return;let I;if(v.length>0)try{let Q=JSON.parse(Buffer.concat(v).toString());typeof Q.enabled=="boolean"&&(I=Q.enabled)}catch{}I!==void 0?I?n.enable(k):n.disable(k):n.isEnabled(k)?n.disable(k):n.enable(k);let ke=n.isEnabled(k);Dn(o.dataDir,{action:"feature:toggle",target:k,value:ke,timestamp:new Date().toISOString(),source:"api"});let ce=n.list().find(Q=>Q.name===k);N(c,ce??{name:k,enabled:ke})});return}if(f==="GET"&&y==="/api/pipeline/live"){bo(u,c,a);return}if(f==="GET"&&y==="/api/agents"){s?N(c,{agents:s.listActive(),enabled:!0}):N(c,{agents:[],enabled:!1});return}if(f==="GET"&&y==="/api/agents/topology"){s?N(c,{...s.getTopology(),enabled:!0}):N(c,{version:2,sessions:[],unlinked:[],ambiguityLevel:"none",mainSessions:[],orphanSubagents:[],enabled:!1});return}if(f==="GET"&&y==="/api/agents/history"){s?N(c,{history:s.listHistory(),enabled:!0}):N(c,{history:[],enabled:!1});return}let B=y.match(/^\/api\/agents\/([^/]+)$/);if(f==="GET"&&B){if(!s){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Agent tracking is disabled"}));return}let m=s.get(B[1]);if(!m){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Agent not found"}));return}N(c,{agent:m.info,parentLink:m.parentLink??null});return}let S=y.match(/^\/api\/agents\/([^/]+)\/requests$/);if(f==="GET"&&S){if(!s){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Agent tracking is disabled"}));return}let m=s.get(S[1]);if(!m){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Agent not found"}));return}let w=m.requestHistory.map(P=>({requestId:P.requestId,timestamp:P.timestamp,model:P.model,messageCount:P.messagesSummary.length,tokensBefore:P.tokensBefore,tokensAfter:P.tokensAfter,operationsSummary:{pruneCount:P.operations.filter(v=>v.type==="prune").length,tokensSaved:P.tokensBefore-P.tokensAfter,injected:P.operations.some(v=>v.type==="inject"),injectedTitle:P.operations.find(v=>v.type==="inject")?.brainEntryTitle??null}})),k=o.agentTracking.maxRequestHistory;N(c,{requests:w,capped:k>0&&m.info.requestCount>k,maxRequestHistory:k});return}let E=y.match(/^\/api\/agents\/([^/]+)\/requests\/(\d+)$/);if(f==="GET"&&E){if(!s){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Agent tracking is disabled"}));return}let m=s.get(E[1]);if(!m){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Agent not found"}));return}let w=parseInt(E[2],10),k=m.requestHistory.find(P=>P.requestId===w);if(!k){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Request not found"}));return}N(c,{snapshot:k});return}let J=y.match(/^\/api\/agents\/([^/]+)\/uncap-history$/);if(f==="POST"&&J){if(!s){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Agent tracking is disabled"}));return}let m=s.get(J[1]);if(!m){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Agent not found"}));return}m.uncapHistory(),N(c,{uncapped:!0});return}if(f==="GET"&&y==="/api/statusline"){let m=po(i.lastPhase,i.lastPhaseCtx),w=i.requestCount>0?Math.round(i.totalLatencyMs/i.requestCount):0;N(c,{phase:i.lastPhase,text:m,stats:{requests:i.requestCount,tokensSaved:i.totalTokensSaved,injections:i.totalInjections,avgLatencyMs:w},lastMatch:i.lastPhaseCtx.title??null,lastConfidence:i.lastConfidence??null,agentType:i.lastPhaseCtx.agentType??null,teamName:i.lastPhaseCtx.teamName??null,elements:o.statusline.elements});return}c.writeHead(404,{"Content-Type":"text/plain"}),c.end("Not Found")}return{handler:d,sseHeartbeat:g}}function N(t,e){t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify(e))}function bo(t,e,n){if(n.size>=Ti){e.writeHead(503,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:"Too many SSE connections"}));return}e.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),n.add(e),t.on("close",()=>{n.delete(e)})}var yo,Ti,xo=C(()=>{"use strict";fo();ht();yo=Ci(wi(import.meta.url));Ti=50});import*as vo from"node:http";import{randomBytes as vi}from"node:crypto";import{existsSync as Co,readFileSync as ki,writeFileSync as Ei,mkdirSync as Ai}from"node:fs";import{join as wo}from"node:path";import{homedir as To}from"node:os";function Pi(){let t=wo(To(),".cortex","api-token");if(Co(t))return ki(t,"utf-8").trim();let e=vi(32).toString("hex"),n=wo(To(),".cortex");return Co(n)||Ai(n,{recursive:!0}),Ei(t,e,{encoding:"utf-8",mode:384}),e}function ko(t,e,n,o,r,s){let i=s??Pi(),{handler:a,sseHeartbeat:l}=So(t,e,n,o,i,r),g=vo.createServer(a),d=null;function u(){return new Promise((h,f)=>{g.once("error",f),g.listen(o.dashboardPort,"127.0.0.1",()=>{g.removeListener("error",f),console.log("[cortex] API token: ~/.cortex/api-token"),d=setInterval(()=>{l()},3e4),h()})})}function c(){return new Promise((h,f)=>{d&&(clearInterval(d),d=null),g.close(b=>{b?f(b):h()})})}return{start:u,stop:c,apiToken:i}}var Eo=C(()=>{"use strict";xo()});var St,Ue,Ao=C(()=>{"use strict";St=class t{static MAX_UNCAPPED_HISTORY=100;info;fingerprint=null;tokenEstimate=0;lastMatchResults=null;armed=!1;armPayload=null;requestHistory=[];parentLink=null;historyUncapped=!1;constructor(e){this.info=e}pushSnapshot(e,n){this.requestHistory.push(e);let o=this.historyUncapped?t.MAX_UNCAPPED_HISTORY:n;o>0&&this.requestHistory.length>o&&(this.requestHistory=this.requestHistory.slice(-o))}uncapHistory(){this.historyUncapped=!0}},Ue=class{active=new Map;history=[];evictionTimer;config;emitter;constructor(e,n){this.config=e,this.emitter=n,this.evictionTimer=setInterval(()=>this.evictStale(),6e4),this.evictionTimer.unref()}getOrCreate(e,n){let o=this.active.get(e);if(o)return o.info.lastSeenAt=Date.now(),o.info.requestCount++,o;for(this.evictStale();this.active.size>=this.config.maxActive;)this.evictOldest();return o=new St(n),this.active.set(e,o),o}get(e){return this.active.get(e)}evictStale(){let e=Date.now(),n=0;for(let[o,r]of this.active){let s=this.getTtl(r.info.type);e-r.info.lastSeenAt>s&&(this.moveToHistory(o,r,"expired"),n++)}return n}listActive(){return Array.from(this.active.values()).map(e=>e.info)}listHistory(){return[...this.history]}countActiveByType(e){let n=0;for(let o of this.active.values())o.info.type===e&&n++;return n}getTopology(){let e=new Map,n=[],o=[],r=[];for(let a of this.active.values())a.info.type==="main"&&(e.set(a.info.conversationId,{agent:a.info,teams:[],subagents:[]}),o.push(a.info.conversationId));for(let a of this.active.values())if(a.info.type!=="main"){if(a.parentLink){let l=e.get(a.parentLink.parentAgentId);if(l){let g={agent:a.info,parentLink:a.parentLink};if(a.info.type==="teammate"&&a.info.teamName){let d=l.teams.find(u=>u.name===a.info.teamName);d||(d={name:a.info.teamName,members:[]},l.teams.push(d)),d.members.push(g)}else l.subagents.push(g);continue}}n.push(a.info),a.info.type==="subagent"&&r.push(a.info.conversationId)}let s=this.countActiveByType("main"),i=s<=1?"none":s===2?"low":"high";return{version:2,sessions:Array.from(e.values()),unlinked:n,ambiguityLevel:i,mainSessions:o,orphanSubagents:r}}shutdown(){clearInterval(this.evictionTimer);for(let[e,n]of this.active)this.moveToHistory(e,n,"evicted")}moveToHistory(e,n,o){let r={info:{...n.info},totalRequests:n.info.requestCount,totalTokensSaved:0,totalInjections:0,duration:n.info.lastSeenAt-n.info.firstSeenAt,completionReason:o,completedAt:Date.now()};this.history.push(r),this.history.length>this.config.maxHistory&&(this.history=this.history.slice(-this.config.maxHistory)),this.active.delete(e),this.emitter&&this.emitter.emitEvent({type:"agent:completed",requestId:0,agentId:e,agentType:n.info.type,totalRequests:n.info.requestCount,totalTokensSaved:0,totalInjections:0,duration:r.duration,completionReason:o})}evictOldest(){let e=null;for(let[n,o]of this.active)(!e||o.info.lastSeenAt<e.state.info.lastSeenAt)&&(e={id:n,state:o});e&&this.moveToHistory(e.id,e.state,"evicted")}getTtl(e){switch(e){case"subagent":return this.config.subagentTtlMs;case"main":return this.config.mainTtlMs;case"teammate":return this.config.teammateTtlMs;default:return this.config.subagentTtlMs}}}});var Ro={};le(Ro,{startCortex:()=>Mi});import{readFileSync as Po}from"node:fs";import{join as xt,dirname as Ri}from"node:path";import{fileURLToPath as $i}from"node:url";import X from"chalk";async function Mi(){let t=Ri($i(import.meta.url)),e;try{e=JSON.parse(Po(xt(t,"../../package.json"),"utf-8")).version}catch{e=JSON.parse(Po(xt(t,"../package.json"),"utf-8")).version}console.log(X.bold(`Cortex v${e} starting...`));let n=R(),o=new ae(n);(await be(n)).passed||(console.log(X.red("\nPreflight checks failed. Run `npm run setup` to fix.\n")),process.exit(1));let s=new De;o.isEnabled("verbose")&&co(s),o.isEnabled("logging")&&qn(s,n.dataDir);let i,a=[];o.isEnabled("agentTracking")&&(i=new Ue(n.agentTracking,s),a=vn(),console.log(X.dim(`[cortex] Agent tracking enabled (${a.length} team config(s) found)`)));let l=await ge.open(xt(n.dataDir,"brain.db")),g={log:()=>{}},d=new Fe(n,l,g,s,o,i);a.length>0&&d.setKnownTeams(a),console.log(X.dim("[cortex] Initializing brain and embedder...")),await d.initialize();let u=so(n,async(f,b)=>{let y=await d.processRequest(f);return{body:y.body,modified:y.modified}});await u.start();let c=null;o.isEnabled("dashboard")&&(c=ko(s,l,o,n,i),await c.start());let h=async()=>{console.log(X.dim(`
38
- [cortex] Shutting down...`)),i&&i.shutdown(),c&&await c.stop(),await u.stop(),l.close(),process.exit(0)};process.on("SIGINT",h),process.on("SIGTERM",h),console.log(""),console.log(X.green.bold(` Cortex running on port ${n.proxyPort}`)),console.log(X.dim(` Set ANTHROPIC_BASE_URL=http://localhost:${n.proxyPort} to activate`)),c&&console.log(X.dim(` Management API: http://localhost:${n.dashboardPort}`)),console.log(X.dim(` Brain: ${l.getEntryCount()} entries loaded`)),console.log("")}var $o=C(()=>{"use strict";q();re();On();mt();ht();io();ao();lo();bt();Eo();Ao();ut()});import{existsSync as We,mkdirSync as Fi,readFileSync as Oi,writeFileSync as Bo}from"node:fs";import{join as Io}from"node:path";import{homedir as Li}from"node:os";function Je(){return We(He)}function ze(){if(!We(Se))return{};try{return JSON.parse(Oi(Se,"utf-8"))}catch{return{}}}function xe(t){let e=ze();for(let[n,o]of Object.entries(t))_i.has(n)||(typeof o=="object"&&o!==null&&!Array.isArray(o)&&typeof e[n]=="object"&&e[n]!==null?e[n]={...e[n],...o}:e[n]=o);We(He)||Fi(He,{recursive:!0}),Bo(Se,JSON.stringify(e,null,2)+`
39
- `,"utf-8")}function No(t){if(!We(Se))return;let e=ze();delete e[t],Bo(Se,JSON.stringify(e,null,2)+`
40
- `,"utf-8")}var He,Se,_i,Ke=C(()=>{"use strict";He=Io(Li(),".claude"),Se=Io(He,"settings.json");_i=new Set(["__proto__","constructor","prototype"])});var Lo={};le(Lo,{runWizard:()=>vt});import{createInterface as Di}from"node:readline";import{existsSync as Fo,mkdirSync as qi,readFileSync as Oo,writeFileSync as Ui}from"node:fs";import{join as Ce,dirname as Hi}from"node:path";import{fileURLToPath as Wi}from"node:url";import{homedir as Ji}from"node:os";import p from"chalk";import{stringify as zi}from"yaml";function Xe(t,e){return new Promise(n=>{process.stdout.write(t);let o=Di({input:process.stdin,output:process.stdout});o.once("line",r=>{o.close(),n(r.trim()||e)})})}function Tt(t,e=!0){return Xe(`${t} [${e?"Y/n":"y/N"}]: `,e?"y":"n").then(o=>o.toLowerCase()==="y")}async function vt(){console.log("");let t=Hi(Wi(import.meta.url)),e;try{e=JSON.parse(Oo(Ce(t,"../../package.json"),"utf-8")).version}catch{e=JSON.parse(Oo(Ce(t,"../package.json"),"utf-8")).version}console.log(p.cyan("\u2554\u2550\u2550 Cortex Setup Wizard \u2550\u2550\u2557")),console.log(p.cyan(`\u2551 v${e.padEnd(22)}\u2551`)),console.log(p.cyan("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D")),console.log(""),console.log(p.dim(" Cortex makes your AI coding agents smarter. It runs")),console.log(p.dim(" as a local proxy, automatically augmenting conversations")),console.log(p.dim(" with relevant knowledge from your brain directory.")),console.log(""),console.log(p.bold(`Step 1: Prerequisites
41
- `));let n=R(),o=await be(n);for(;!o.passed;)console.log(""),console.log(p.red("Some checks failed. Please fix the issues above.")),await Tt("Fix and retry?")||(console.log("Setup aborted."),process.exit(1)),o=await be(n);console.log(""),console.log(p.bold(`Step 2: Configuration
42
- `));let r=await Xe(" Proxy port [9090]: ","9090"),s=await Xe(" Target API URL [https://api.anthropic.com]: ","https://api.anthropic.com"),i=await Xe(" Brain directory [./brain/entries]: ","./brain/entries");console.log("");let a=Ce(Ji(),".cortex");Fo(a)||qi(a,{recursive:!0});let l={proxyPort:Number(r),targetBaseUrl:s,brainDir:i},g=Ce(a,"config.yaml");Ui(g,zi(l),"utf-8"),console.log(p.green(` \u2713 Config written to ${g}`)),console.log(""),console.log(p.bold(`Step 3: Model Download
43
- `)),console.log(p.dim(" Downloading embedding model (~130MB, first time only)..."));let d=Date.now();if(await Ie(Ce(a,"models")),console.log(p.green(` \u2713 Model ready in ${((Date.now()-d)/1e3).toFixed(1)}s`)),console.log(""),Fo(i)){let c=dt(i);console.log(p.green(` \u2713 ${c.length} brain entries found`))}else console.log(p.yellow(" \u26A0 Brain directory does not exist yet \u2014 create it later"));console.log(""),console.log(p.bold(`Step 4: Claude Code Integration
44
- `));let u=Je();u?(console.log(p.green(" \u2713 Claude Code detected")),console.log(""),await Tt(" Route Claude Code through Cortex automatically?")?(xe({env:{ANTHROPIC_BASE_URL:`http://localhost:${r}`}}),console.log(p.green(" \u2713 ANTHROPIC_BASE_URL set in Claude Code settings")),console.log(p.dim(" Takes effect on next Claude Code session."))):(console.log(p.dim(" Skipped. You can set it manually later:")),console.log(p.dim(` export ANTHROPIC_BASE_URL=http://localhost:${r}`))),console.log(""),await Tt(" Show Cortex status in Claude Code's status line?")?(xe({statusLine:{type:"command",command:"cortex-statusline",padding:1}}),console.log(p.green(" \u2713 Status line configured")),console.log(p.dim(" Takes effect on next Claude Code session."))):(console.log(p.dim(" Skipped. You can add it anytime:")),console.log(p.dim(" Run /statusline cortex-statusline in Claude Code")))):(console.log(p.dim(" Claude Code not detected (~/.claude/ not found).")),console.log(p.dim(" You can configure it manually after installing Claude Code."))),console.log(""),console.log(p.bold("\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550")),console.log(p.green.bold(" \u2713 Setup complete!")),console.log(p.bold("\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550")),console.log(""),console.log(p.bold(" What is Cortex?")),console.log(""),console.log(" Cortex is a local proxy that sits between your AI coding"),console.log(" agent and the API. It watches conversations, identifies what"),console.log(" you're working on, and automatically injects relevant"),console.log(" knowledge from your brain directory \u2014 tips, patterns, fixes"),console.log(" you've saved \u2014 directly into the context window."),console.log(""),console.log(" Your agent gets smarter without changing how you work."),console.log(""),console.log(p.bold(" Getting started")),console.log(""),console.log(` ${p.cyan("cortex start")} Start in foreground (see live output)`),console.log(` ${p.cyan("cortex start -d")} Start as background daemon`),console.log(` ${p.cyan("cortex stop")} Stop the daemon`),console.log(` ${p.cyan("cortex status")} Check if Cortex is running`),console.log(""),console.log(p.bold(" Managing your brain")),console.log(""),console.log(` ${p.cyan("cortex brain list")} List all brain entries`),console.log(` ${p.cyan("cortex brain search")} Search for entries by keyword`),console.log(` ${p.cyan("cortex brain import")} Import entries from a directory`),console.log(` ${p.cyan("cortex brain sources")} Manage knowledge sources`),console.log(""),console.log(p.dim(" Brain entries are Markdown files with YAML frontmatter.")),console.log(p.dim(" Drop them in your brain directory and Cortex picks them up.")),console.log(""),console.log(p.bold(" Other commands")),console.log(""),console.log(` ${p.cyan("cortex features list")} See which features are on/off`),console.log(` ${p.cyan("cortex logs")} View recent activity`),console.log(` ${p.cyan("cortex logs --follow")} Stream live activity`),console.log(` ${p.cyan("cortex config show")} Show current configuration`),console.log(` ${p.cyan("cortex setup")} Run this wizard again`),console.log(""),console.log(p.bold(" Quick start")),console.log(""),u?(console.log(` ${p.white("cortex claude")} Start Cortex + launch Claude Code`),console.log(""),console.log(p.dim(" Or separately:")),console.log(` ${p.white("cortex start -d")} Start daemon in background`),console.log(` ${p.white("claude")} Claude Code (already wired in)`),console.log("")):(console.log(` 1. ${p.white("cortex start -d")}`),console.log(` 2. ${p.white(`export ANTHROPIC_BASE_URL=http://localhost:${r}`)}`),console.log(` 3. ${p.white("Start your AI agent as usual")}`),console.log("")),console.log(p.dim(` Dashboard: http://localhost:${n.dashboardPort}`)),console.log(""),console.log(p.dim(" Run `cortex config` to fine-tune settings in the interactive editor.")),console.log("")}var kt=C(()=>{"use strict";q();bt();fe();gt();Ke()});var gr={};le(gr,{searchBrain:()=>fa});async function fa(t,e,n=5){let o=await ie(t),r=e.getAllEntries(),s=[];for(let i of r){if(!i.embedding)continue;let a=Ne(o,i.embedding);s.push({entry:i,score:a})}return s.sort((i,a)=>a.score-i.score),s.slice(0,n)}var mr=C(()=>{"use strict";fe();ct()});var Rt,pr,fr=C(()=>{"use strict";Rt="https://cheat.sh",pr={name:"cheatsh",displayName:"cheat.sh",async list(t){let e=await fetch(`${Rt}/${encodeURI(t)}/:list?T`);if(!e.ok)throw new Error(`cheat.sh list failed: ${e.status}`);return(await e.text()).trim().split(`
45
- `).filter(Boolean).map(r=>({id:`cheatsh:${t}/${r}`,title:`${t}/${r}`,content:"",language:t,tags:["cheatsheet",t,"quick-reference"]}))},async fetch(t){let e=await this.list(t),n=[];for(let o of e){let r=o.title;try{let s=await this.fetchOne(r);s&&n.push(s)}catch{}await new Promise(s=>setTimeout(s,1e3))}return n},async fetchOne(t){let e=await fetch(`${Rt}/${encodeURI(t)}?T`);if(!e.ok)return null;let n=await e.text(),o=t.split("/")[0]??"";return{id:`cheatsh:${t}`,title:t,content:n.trim(),language:o,tags:["cheatsheet",o,"quick-reference"],sourceUrl:`${Rt}/${t}`}}}});import{mkdirSync as ha,existsSync as hr,readFileSync as ya,writeFileSync as ba}from"node:fs";import{join as br}from"node:path";import{homedir as Sa}from"node:os";function Ta(t,e){let n=t.split(`
46
- `),o="",r="",s;for(let g of n)if(g.startsWith("# ")&&!o)o=g.slice(2).trim();else if(g.startsWith("> ")&&!r){let d=g.slice(2).trim();d.startsWith("More information:")?s=d.replace("More information:","").trim().replace(/[<>]/g,""):r=d}let i=e.split("/"),a=i[0]??"common",l=i[1]??i[0];return{id:`tldr:${e}`,title:o||l,content:t.trim(),language:"",tags:["tldr","man-page",a],sourceUrl:s}}async function yr(){hr($t)||ha($t,{recursive:!0});let t=br($t,"tldr-tree.json"),e=1440*60*1e3;if(hr(t)){let s=(await import("node:fs")).statSync(t);if(Date.now()-s.mtimeMs<e)return JSON.parse(ya(t,"utf-8"))}let n=await fetch(wa);if(!n.ok)throw new Error(`GitHub tree API failed: ${n.status}`);let r=(await n.json()).tree.filter(s=>s.type==="blob"&&s.path.startsWith("pages/"));return ba(t,JSON.stringify(r),"utf-8"),r}var xa,Ca,wa,$t,Sr,xr=C(()=>{"use strict";xa="tldr-pages/tldr",Ca="https://raw.githubusercontent.com/tldr-pages/tldr/main",wa=`https://api.github.com/repos/${xa}/git/trees/main?recursive=1`,$t=br(Sa(),".cortex","cache"),Sr={name:"tldr",displayName:"tldr-pages",async list(t){return(await yr()).filter(o=>o.path.startsWith("pages/")&&o.path.includes(`/${t}`)&&o.path.endsWith(".md")).map(o=>{let r=o.path.split("/"),s=r[1]??"common",i=(r[2]??"").replace(".md","");return{id:`tldr:${s}/${i}`,title:i,content:"",language:"",tags:["tldr","man-page",s]}})},async fetch(t){let e=await this.list(t),n=[];for(let o of e){let r=await this.fetchOne(o.id.replace("tldr:",""));r&&n.push(r)}return n},async fetchOne(t){let n=(await yr()).find(s=>s.path.includes(`/${t.split("/").pop()}.md`)&&s.path.startsWith("pages/"));if(!n)return null;let o=await fetch(`${Ca}/${n.path}`);if(!o.ok)return null;let r=await o.text();return Ta(r,t)}}});function Cr(t){let e=t;return e=e.replace(/<pre[^>]*><code[^>]*>([\s\S]*?)<\/code><\/pre>/gi,(n,o)=>"\n```\n"+Mt(o.trim())+"\n```\n"),e=e.replace(/<pre[^>]*>([\s\S]*?)<\/pre>/gi,(n,o)=>"\n```\n"+Mt(o.trim())+"\n```\n"),e=e.replace(/<code[^>]*>(.*?)<\/code>/gi,"`$1`"),e=e.replace(/<h1[^>]*>(.*?)<\/h1>/gi,`# $1
37
+ `;for(let c of a)c.write(u);for(let c of l)c.write(u)}function d(u,c){let m=u.url??"/",h=u.method??"GET",b=new URL(m,`http://${u.headers.host||"localhost"}`),y=b.pathname;if(c.setHeader("Access-Control-Allow-Origin","null"),c.setHeader("X-Content-Type-Options","nosniff"),y.startsWith("/api/")){let p=u.headers.authorization,w=p?.startsWith("Bearer ")?p.slice(7):null,k=b.searchParams.get("token");if(w!==r&&k!==r){c.writeHead(401,{"content-type":"application/json"}),c.end(JSON.stringify({error:"unauthorized",message:"Invalid or missing API token. Check ~/.cortex/api-token"}));return}}if(h==="GET"&&y==="/"){try{let p=ko(Eo,"../dashboard/index.html"),w=ko(Eo,"../../src/dashboard/index.html"),k=Mi(p)?p:w,v=$i(k,"utf-8").replace("</head>",`<script>window.CORTEX_API_TOKEN='${r}';</script></head>`);c.writeHead(200,{"Content-Type":"text/html","Content-Security-Policy":"default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; connect-src 'self'; img-src 'self'","X-Frame-Options":"DENY","X-Content-Type-Options":"nosniff"}),c.end(v)}catch{c.writeHead(404,{"Content-Type":"text/plain"}),c.end("Dashboard not found")}return}if(h==="GET"&&y==="/api/status"){let p={running:!0,pid:process.pid,port:o.proxyPort,uptime:(Date.now()-i.uptimeStartMs)/1e3,brainEntries:e.getEntryCount(),requestCount:i.requestCount,version:"0.1.0"};N(c,p);return}if(h==="GET"&&y==="/api/session/current"){let p={requestCount:i.requestCount,tokensSaved:i.totalTokensSaved,injectionsCount:i.totalInjections,matchRate:i.requestCount>0?i.totalInjections/i.requestCount:0,avgLatencyMs:i.requestCount>0?Math.round(i.totalLatencyMs/i.requestCount):0};N(c,p);return}if(h==="GET"&&y==="/api/logs/stream"){Ao(u,c,l);return}if(h==="GET"&&y==="/api/brain/summary"){let p=e.getAllEntries(),w={};for(let P of p){let v=P.source??"local";w[v]=(w[v]??0)+1}let k={totalEntries:p.length,bySource:w,recentMatches:[]};N(c,k);return}if(h==="GET"&&y==="/api/features"){N(c,{features:n.list()});return}let j=y.match(/^\/api\/features\/([a-zA-Z]+)\/toggle$/);if(h==="POST"&&j){let p=new Set(["pruning","injection","fingerprinting","matching","logging","dashboard","verbose","agentTracking"]),w=j[1];if(!p.has(w)){c.writeHead(400,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:`Unknown feature: ${w}`}));return}let k=w,P=1024,v=[],ie=0,ae=!1;u.on("data",I=>{if(ie+=I.length,ie>P){ae=!0,u.destroy(),c.headersSent||(c.writeHead(413,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Request body too large"})));return}v.push(I)}),u.on("end",()=>{if(ae)return;let I;if(v.length>0)try{let ne=JSON.parse(Buffer.concat(v).toString());typeof ne.enabled=="boolean"&&(I=ne.enabled)}catch{}I!==void 0?I?n.enable(k):n.disable(k):n.isEnabled(k)?n.disable(k):n.enable(k);let $e=n.isEnabled(k);Gn(o.dataDir,{action:"feature:toggle",target:k,value:$e,timestamp:new Date().toISOString(),source:"api"});let ye=n.list().find(ne=>ne.name===k);N(c,ye??{name:k,enabled:$e})});return}if(h==="GET"&&y==="/api/pipeline/live"){Ao(u,c,a);return}if(h==="GET"&&y==="/api/agents"){s?N(c,{agents:s.listActive(),enabled:!0}):N(c,{agents:[],enabled:!1});return}if(h==="GET"&&y==="/api/agents/topology"){s?N(c,{...s.getTopology(),enabled:!0}):N(c,{version:2,sessions:[],unlinked:[],ambiguityLevel:"none",mainSessions:[],orphanSubagents:[],enabled:!1});return}if(h==="GET"&&y==="/api/agents/history"){s?N(c,{history:s.listHistory(),enabled:!0}):N(c,{history:[],enabled:!1});return}let B=y.match(/^\/api\/agents\/([^/]+)$/);if(h==="GET"&&B){if(!s){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Agent tracking is disabled"}));return}let p=s.get(B[1]);if(!p){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Agent not found"}));return}N(c,{agent:p.info,parentLink:p.parentLink??null});return}let S=y.match(/^\/api\/agents\/([^/]+)\/requests$/);if(h==="GET"&&S){if(!s){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Agent tracking is disabled"}));return}let p=s.get(S[1]);if(!p){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Agent not found"}));return}let w=p.requestHistory.map(P=>({requestId:P.requestId,timestamp:P.timestamp,model:P.model,messageCount:P.messagesSummary.length,tokensBefore:P.tokensBefore,tokensAfter:P.tokensAfter,operationsSummary:{pruneCount:P.operations.filter(v=>v.type==="prune").length,tokensSaved:P.tokensBefore-P.tokensAfter,injected:P.operations.some(v=>v.type==="inject"),injectedTitle:P.operations.find(v=>v.type==="inject")?.brainEntryTitle??null}})),k=o.agentTracking.maxRequestHistory;N(c,{requests:w,capped:k>0&&p.info.requestCount>k,maxRequestHistory:k});return}let E=y.match(/^\/api\/agents\/([^/]+)\/requests\/(\d+)$/);if(h==="GET"&&E){if(!s){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Agent tracking is disabled"}));return}let p=s.get(E[1]);if(!p){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Agent not found"}));return}let w=parseInt(E[2],10),k=p.requestHistory.find(P=>P.requestId===w);if(!k){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Request not found"}));return}N(c,{snapshot:k});return}let J=y.match(/^\/api\/agents\/([^/]+)\/uncap-history$/);if(h==="POST"&&J){if(!s){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Agent tracking is disabled"}));return}let p=s.get(J[1]);if(!p){c.writeHead(404,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"Agent not found"}));return}p.uncapHistory(),N(c,{uncapped:!0});return}if(h==="GET"&&y==="/api/statusline"){let p=To(i.lastPhase,i.lastPhaseCtx),w=i.requestCount>0?Math.round(i.totalLatencyMs/i.requestCount):0;N(c,{phase:i.lastPhase,text:p,stats:{requests:i.requestCount,tokensSaved:i.totalTokensSaved,injections:i.totalInjections,avgLatencyMs:w},lastMatch:i.lastPhaseCtx.title??null,lastConfidence:i.lastConfidence??null,agentType:i.lastPhaseCtx.agentType??null,teamName:i.lastPhaseCtx.teamName??null,elements:o.statusline.elements});return}c.writeHead(404,{"Content-Type":"text/plain"}),c.end("Not Found")}return{handler:d,sseHeartbeat:g}}function N(t,e){t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify(e))}function Ao(t,e,n){if(n.size>=Ii){e.writeHead(503,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:"Too many SSE connections"}));return}e.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),n.add(e),t.on("close",()=>{n.delete(e)})}var Eo,Ii,Ro=C(()=>{"use strict";vo();wt();Eo=ji(Bi(import.meta.url));Ii=50});import*as Bo from"node:http";import{randomBytes as Ni}from"node:crypto";import{existsSync as $o,readFileSync as Oi,writeFileSync as Fi,mkdirSync as _i}from"node:fs";import{join as Mo}from"node:path";import{homedir as jo}from"node:os";function Li(){let t=Mo(jo(),".cortex","api-token");if($o(t))return Oi(t,"utf-8").trim();let e=Ni(32).toString("hex"),n=Mo(jo(),".cortex");return $o(n)||_i(n,{recursive:!0}),Fi(t,e,{encoding:"utf-8",mode:384}),e}function Io(t,e,n,o,r,s){let i=s??Li(),{handler:a,sseHeartbeat:l}=Po(t,e,n,o,i,r),g=Bo.createServer(a),d=null;function u(){return new Promise((m,h)=>{g.once("error",h),g.listen(o.dashboardPort,"127.0.0.1",()=>{g.removeListener("error",h),console.log("[cortex] API token: ~/.cortex/api-token"),d=setInterval(()=>{l()},3e4),m()})})}function c(){return new Promise((m,h)=>{d&&(clearInterval(d),d=null),g.close(b=>{b?h(b):m()})})}return{start:u,stop:c,apiToken:i}}var No=C(()=>{"use strict";Ro()});var kt,Ke,Oo=C(()=>{"use strict";kt=class t{static MAX_UNCAPPED_HISTORY=100;info;fingerprint=null;tokenEstimate=0;lastMatchResults=null;armed=!1;armPayload=null;requestHistory=[];parentLink=null;historyUncapped=!1;constructor(e){this.info=e}pushSnapshot(e,n){this.requestHistory.push(e);let o=this.historyUncapped?t.MAX_UNCAPPED_HISTORY:n;o>0&&this.requestHistory.length>o&&(this.requestHistory=this.requestHistory.slice(-o))}uncapHistory(){this.historyUncapped=!0}},Ke=class{active=new Map;history=[];evictionTimer;config;emitter;constructor(e,n){this.config=e,this.emitter=n,this.evictionTimer=setInterval(()=>this.evictStale(),6e4),this.evictionTimer.unref()}getOrCreate(e,n){let o=this.active.get(e);if(o)return o.info.lastSeenAt=Date.now(),o.info.requestCount++,o;for(this.evictStale();this.active.size>=this.config.maxActive;)this.evictOldest();return o=new kt(n),this.active.set(e,o),o}get(e){return this.active.get(e)}evictStale(){let e=Date.now(),n=0;for(let[o,r]of this.active){let s=this.getTtl(r.info.type);e-r.info.lastSeenAt>s&&(this.moveToHistory(o,r,"expired"),n++)}return n}listActive(){return Array.from(this.active.values()).map(e=>e.info)}listHistory(){return[...this.history]}countActiveByType(e){let n=0;for(let o of this.active.values())o.info.type===e&&n++;return n}getTopology(){let e=new Map,n=[],o=[],r=[];for(let a of this.active.values())a.info.type==="main"&&(e.set(a.info.conversationId,{agent:a.info,teams:[],subagents:[]}),o.push(a.info.conversationId));for(let a of this.active.values())if(a.info.type!=="main"){if(a.parentLink){let l=e.get(a.parentLink.parentAgentId);if(l){let g={agent:a.info,parentLink:a.parentLink};if(a.info.type==="teammate"&&a.info.teamName){let d=l.teams.find(u=>u.name===a.info.teamName);d||(d={name:a.info.teamName,members:[]},l.teams.push(d)),d.members.push(g)}else l.subagents.push(g);continue}}n.push(a.info),a.info.type==="subagent"&&r.push(a.info.conversationId)}let s=this.countActiveByType("main"),i=s<=1?"none":s===2?"low":"high";return{version:2,sessions:Array.from(e.values()),unlinked:n,ambiguityLevel:i,mainSessions:o,orphanSubagents:r}}shutdown(){clearInterval(this.evictionTimer);for(let[e,n]of this.active)this.moveToHistory(e,n,"evicted")}moveToHistory(e,n,o){let r={info:{...n.info},totalRequests:n.info.requestCount,totalTokensSaved:0,totalInjections:0,duration:n.info.lastSeenAt-n.info.firstSeenAt,completionReason:o,completedAt:Date.now()};this.history.push(r),this.history.length>this.config.maxHistory&&(this.history=this.history.slice(-this.config.maxHistory)),this.active.delete(e),this.emitter&&this.emitter.emitEvent({type:"agent:completed",requestId:0,agentId:e,agentType:n.info.type,totalRequests:n.info.requestCount,totalTokensSaved:0,totalInjections:0,duration:r.duration,completionReason:o})}evictOldest(){let e=null;for(let[n,o]of this.active)(!e||o.info.lastSeenAt<e.state.info.lastSeenAt)&&(e={id:n,state:o});e&&this.moveToHistory(e.id,e.state,"evicted")}getTtl(e){switch(e){case"subagent":return this.config.subagentTtlMs;case"main":return this.config.mainTtlMs;case"teammate":return this.config.teammateTtlMs;default:return this.config.subagentTtlMs}}}});import{existsSync as te,mkdirSync as At,readFileSync as Fo,writeFileSync as Ve,unlinkSync as Di}from"node:fs";import{join as Ye}from"node:path";import{homedir as _o}from"node:os";function Ze(){return te(me)}function pe(){if(!te(re))return{};try{return JSON.parse(Fo(re,"utf-8"))}catch{return{}}}function fe(t){let e=pe();for(let[n,o]of Object.entries(t))qi.has(n)||(typeof o=="object"&&o!==null&&!Array.isArray(o)&&typeof e[n]=="object"&&e[n]!==null?e[n]={...e[n],...o}:e[n]=o);te(me)||At(me,{recursive:!0}),Ve(re,JSON.stringify(e,null,2)+`
38
+ `,"utf-8")}function Lo(t){if(!te(re))return;let e=pe();delete e[t],Ve(re,JSON.stringify(e,null,2)+`
39
+ `,"utf-8")}function Do(t){let n=pe().env??{},o={originalBaseUrl:n.ANTHROPIC_BASE_URL??null};te(Et)||At(Et,{recursive:!0}),Ve(Ge,JSON.stringify(o,null,2)+`
40
+ `,"utf-8"),fe({env:{...n,ANTHROPIC_BASE_URL:`http://localhost:${t}`}})}function ke(){if(!te(re))return;let t=null;if(te(Ge))try{t=JSON.parse(Fo(Ge,"utf-8")).originalBaseUrl??null}catch{}let e=pe(),n=e.env??{};t!==null?n.ANTHROPIC_BASE_URL=t:delete n.ANTHROPIC_BASE_URL,Object.keys(n).length===0?delete e.env:e.env=n,te(me)||At(me,{recursive:!0}),Ve(re,JSON.stringify(e,null,2)+`
41
+ `,"utf-8");try{Di(Ge)}catch{}}var me,re,Et,Ge,qi,he=C(()=>{"use strict";me=Ye(_o(),".claude"),re=Ye(me,"settings.json"),Et=Ye(_o(),".cortex"),Ge=Ye(Et,"claude-routing-backup.json");qi=new Set(["__proto__","constructor","prototype"])});var Ho={};ce(Ho,{startCortex:()=>Uo});import{readFileSync as qo}from"node:fs";import{join as Pt,dirname as Ui}from"node:path";import{fileURLToPath as Hi}from"node:url";import K from"chalk";async function Uo(){let t=Ui(Hi(import.meta.url)),e;try{e=JSON.parse(qo(Pt(t,"../../package.json"),"utf-8")).version}catch{e=JSON.parse(qo(Pt(t,"../package.json"),"utf-8")).version}console.log(K.bold(`Cortex v${e} starting...`));let n=R(),o=new ge(n);(await ve(n)).passed||(console.log(K.red("\nPreflight checks failed. Run `npm run setup` to fix.\n")),process.exit(1));let s=new ze;o.isEnabled("verbose")&&bo(s),o.isEnabled("logging")&&Vn(s,n.dataDir);let i,a=[];o.isEnabled("agentTracking")&&(i=new Ke(n.agentTracking,s),a=Bn(),console.log(K.dim(`[cortex] Agent tracking enabled (${a.length} team config(s) found)`)));let l=await be.open(Pt(n.dataDir,"brain.db")),g={log:()=>{}},d=new Ue(n,l,g,s,o,i);a.length>0&&d.setKnownTeams(a),console.log(K.dim("[cortex] Initializing brain and embedder...")),await d.initialize();let u=fo(n,async(h,b)=>{let y=await d.processRequest(h);return{body:y.body,modified:y.modified}});await u.start();let c=null;o.isEnabled("dashboard")&&(c=Io(s,l,o,n,i),await c.start());try{Do(n.proxyPort)}catch{}let m=async()=>{console.log(K.dim(`
42
+ [cortex] Shutting down...`));try{ke()}catch{}i&&i.shutdown(),c&&await c.stop(),await u.stop(),l.close(),Z(),process.exit(0)};process.on("SIGINT",m),process.on("SIGTERM",m),console.log(""),console.log(K.green.bold(` Cortex running on port ${n.proxyPort}`)),console.log(K.dim(" Claude Code API routing enabled through Cortex")),c&&console.log(K.dim(` Management API: http://localhost:${n.dashboardPort}`)),console.log(K.dim(` Brain: ${l.getEntryCount()} entries loaded`)),console.log("")}var Wo=C(()=>{"use strict";q();le();zn();St();wt();ho();yo();So();vt();No();Oo();ht();he();Q();process.env.CORTEX_DAEMON==="1"&&(Me(process.pid),Uo().catch(t=>{try{ke()}catch{}Z(),console.error("Fatal:",t),process.exit(1)}))});var Go={};ce(Go,{claudeCommand:()=>Mt});import{spawn as Xo,execSync as Ki}from"node:child_process";import{existsSync as Gi}from"node:fs";import{fileURLToPath as Vi}from"node:url";import{dirname as Yi,join as Ko}from"node:path";import{homedir as Zi}from"node:os";import X from"chalk";async function Qi(t,e=15e3){let n=Date.now();for(;Date.now()-n<e;){try{if((await fetch(`http://localhost:${t}/api/status`)).ok)return!0}catch{}await new Promise(o=>setTimeout(o,200))}return!1}function ea(){try{let t=process.platform==="win32"?"where claude":"which claude";return Ki(t,{stdio:"pipe"}),"claude"}catch{return null}}function ta(t){let e=Yi(Vi(import.meta.url)),n=Ko(e,"../start.js"),r=process.argv.some(a=>/(?:^|[\\/])tsx(?:[\\/.]|$)/.test(a))?["--import","tsx",n]:[n],s={...process.env,CORTEX_DAEMON:"1"};t&&(s.CORTEX_PORT=t);let i=Xo(process.execPath,r,{detached:!0,stdio:"ignore",env:s});return i.unref(),i.pid?i.pid:null}var Mt,jt=C(()=>{"use strict";Q();q();It();Mt={name:"claude",description:"Start Cortex + launch Claude Code",usage:"cortex claude [--port N]",run:async t=>{let e=Ko(Zi(),".cortex","config.yaml");Gi(e)||(console.log(X.yellow(`Cortex hasn't been set up yet. Running setup first...
43
+ `)),await Bt(),console.log(""));let n=R(),o=t.indexOf("--port"),r=o!==-1?t[o+1]:void 0,s=r?Number(r):n.proxyPort,i=t.filter((u,c)=>!(u==="--port"||c>0&&t[c-1]==="--port")),{running:a,pid:l}=_();if(a)console.log(X.green(`Cortex already running (PID ${l})`));else{process.stdout.write(X.dim("Starting Cortex... "));let u=ta(r);u||(console.log(X.red("failed")),process.exit(1));let c=await Qi(n.dashboardPort);console.log(c?X.green(`ready (PID ${u})`):X.yellow(`started (PID ${u}, still initializing)`))}let g=ea();if(!g){console.log(""),console.log(X.red("Claude Code not found in PATH.")),console.log(X.dim("Install it: https://docs.anthropic.com/en/docs/claude-code")),console.log(""),console.log(X.dim("Cortex is running. Set the env var manually:")),console.log(` export ANTHROPIC_BASE_URL=http://localhost:${s}`);return}console.log(X.dim("Launching Claude Code...")),console.log(""),Xo(g,i,{stdio:"inherit",env:{...process.env,ANTHROPIC_BASE_URL:`http://localhost:${s}`}}).on("close",u=>{process.exit(u??0)})}}});var Zo={};ce(Zo,{runWizard:()=>Bt});import{createInterface as na}from"node:readline";import{existsSync as Vo,mkdirSync as oa,readFileSync as Yo,writeFileSync as ra}from"node:fs";import{join as Ee,dirname as sa}from"node:path";import{fileURLToPath as ia}from"node:url";import{homedir as aa}from"node:os";import f from"chalk";import{stringify as ca}from"yaml";function et(t,e){return new Promise(n=>{process.stdout.write(t);let o=na({input:process.stdin,output:process.stdout});o.once("line",r=>{o.close(),n(r.trim()||e)})})}function Qe(t,e=!0){return et(`${t} [${e?"Y/n":"y/N"}]: `,e?"y":"n").then(o=>o.toLowerCase()==="y")}async function Bt(){console.log("");let t=sa(ia(import.meta.url)),e;try{e=JSON.parse(Yo(Ee(t,"../../package.json"),"utf-8")).version}catch{e=JSON.parse(Yo(Ee(t,"../package.json"),"utf-8")).version}console.log(f.cyan("\u2554\u2550\u2550 Cortex Setup Wizard \u2550\u2550\u2557")),console.log(f.cyan(`\u2551 v${e.padEnd(22)}\u2551`)),console.log(f.cyan("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D")),console.log(""),console.log(f.dim(" Cortex makes your AI coding agents smarter. It runs")),console.log(f.dim(" as a local proxy, automatically augmenting conversations")),console.log(f.dim(" with relevant knowledge from your brain directory.")),console.log(""),console.log(f.bold(`Step 1: Prerequisites
44
+ `));let n=R(),o=await ve(n);for(;!o.passed;)console.log(""),console.log(f.red("Some checks failed. Please fix the issues above.")),await Qe("Fix and retry?")||(console.log("Setup aborted."),process.exit(1)),o=await ve(n);console.log(""),console.log(f.bold(`Step 2: Configuration
45
+ `));let r=await et(" Proxy port [9090]: ","9090"),s=await et(" Target API URL [https://api.anthropic.com]: ","https://api.anthropic.com"),i=await et(" Brain directory [./brain/entries]: ","./brain/entries");console.log("");let a=Ee(aa(),".cortex");Vo(a)||oa(a,{recursive:!0});let l={proxyPort:Number(r),targetBaseUrl:s,brainDir:i},g=Ee(a,"config.yaml");ra(g,ca(l),"utf-8"),console.log(f.green(` \u2713 Config written to ${g}`)),console.log(""),console.log(f.bold(`Step 3: Model Download
46
+ `)),console.log(f.dim(" Downloading embedding model (~130MB, first time only)..."));let d=Date.now();if(await De(Ee(a,"models")),console.log(f.green(` \u2713 Model ready in ${((Date.now()-d)/1e3).toFixed(1)}s`)),console.log(""),Vo(i)){let m=yt(i);console.log(f.green(` \u2713 ${m.length} brain entries found`))}else console.log(f.yellow(" \u26A0 Brain directory does not exist yet \u2014 create it later"));console.log(""),console.log(f.bold(`Step 4: Claude Code Integration
47
+ `));let u=Ze();if(u?(console.log(f.green(" \u2713 Claude Code detected")),console.log(""),await Qe(" Route Claude Code through Cortex automatically?")?(fe({env:{ANTHROPIC_BASE_URL:`http://localhost:${r}`}}),console.log(f.green(" \u2713 ANTHROPIC_BASE_URL set in Claude Code settings")),console.log(f.dim(" Takes effect on next Claude Code session."))):(console.log(f.dim(" Skipped. You can set it manually later:")),console.log(f.dim(` export ANTHROPIC_BASE_URL=http://localhost:${r}`))),console.log(""),await Qe(" Show Cortex status in Claude Code's status line?")?(fe({statusLine:{type:"command",command:"cortex-statusline",padding:1}}),console.log(f.green(" \u2713 Status line configured")),console.log(f.dim(" Takes effect on next Claude Code session."))):(console.log(f.dim(" Skipped. You can add it anytime:")),console.log(f.dim(" Run /statusline cortex-statusline in Claude Code")))):(console.log(f.dim(" Claude Code not detected (~/.claude/ not found).")),console.log(f.dim(" You can configure it manually after installing Claude Code."))),console.log(""),console.log(f.bold("\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550")),console.log(f.green.bold(" \u2713 Setup complete!")),console.log(f.bold("\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550")),console.log(""),console.log(f.bold(" What is Cortex?")),console.log(""),console.log(" Cortex is a local proxy that sits between your AI coding"),console.log(" agent and the API. It watches conversations, identifies what"),console.log(" you're working on, and automatically injects relevant"),console.log(" knowledge from your brain directory \u2014 tips, patterns, fixes"),console.log(" you've saved \u2014 directly into the context window."),console.log(""),console.log(" Your agent gets smarter without changing how you work."),console.log(""),console.log(f.bold(" Getting started")),console.log(""),console.log(` ${f.cyan("cortex start")} Start in foreground (see live output)`),console.log(` ${f.cyan("cortex start -d")} Start as background daemon`),console.log(` ${f.cyan("cortex stop")} Stop the daemon`),console.log(` ${f.cyan("cortex status")} Check if Cortex is running`),console.log(""),console.log(f.bold(" Managing your brain")),console.log(""),console.log(` ${f.cyan("cortex brain list")} List all brain entries`),console.log(` ${f.cyan("cortex brain search")} Search for entries by keyword`),console.log(` ${f.cyan("cortex brain import")} Import entries from a directory`),console.log(` ${f.cyan("cortex brain sources")} Manage knowledge sources`),console.log(""),console.log(f.dim(" Brain entries are Markdown files with YAML frontmatter.")),console.log(f.dim(" Drop them in your brain directory and Cortex picks them up.")),console.log(""),console.log(f.bold(" Other commands")),console.log(""),console.log(` ${f.cyan("cortex features list")} See which features are on/off`),console.log(` ${f.cyan("cortex logs")} View recent activity`),console.log(` ${f.cyan("cortex logs --follow")} Stream live activity`),console.log(` ${f.cyan("cortex config show")} Show current configuration`),console.log(` ${f.cyan("cortex setup")} Run this wizard again`),console.log(""),console.log(f.bold(" Quick start")),console.log(""),u?(console.log(` ${f.white("cortex claude")} Start Cortex + launch Claude Code`),console.log(""),console.log(f.dim(" Or separately:")),console.log(` ${f.white("cortex start -d")} Start daemon in background`),console.log(` ${f.white("claude")} Claude Code (already wired in)`),console.log("")):(console.log(` 1. ${f.white("cortex start -d")}`),console.log(` 2. ${f.white(`export ANTHROPIC_BASE_URL=http://localhost:${r}`)}`),console.log(` 3. ${f.white("Start your AI agent as usual")}`),console.log("")),console.log(f.dim(` Dashboard: http://localhost:${n.dashboardPort}`)),console.log(""),console.log(f.dim(" Run `cortex config` to fine-tune settings in the interactive editor.")),console.log(""),await Qe(f.bold(" Open Claude Code with Cortex?"))){console.log("");let{claudeCommand:m}=await Promise.resolve().then(()=>(jt(),Go));await m.run([])}}var It=C(()=>{"use strict";q();vt();Ce();bt();he()});var Er={};ce(Er,{searchBrain:()=>Ma});async function Ma(t,e,n=5){let o=await de(t),r=e.getAllEntries(),s=[];for(let i of r){if(!i.embedding)continue;let a=qe(o,i.embedding);s.push({entry:i,score:a})}return s.sort((i,a)=>a.score-i.score),s.slice(0,n)}var Ar=C(()=>{"use strict";Ce();pt()});var _t,Pr,Rr=C(()=>{"use strict";_t="https://cheat.sh",Pr={name:"cheatsh",displayName:"cheat.sh",async list(t){let e=await fetch(`${_t}/${encodeURI(t)}/:list?T`);if(!e.ok)throw new Error(`cheat.sh list failed: ${e.status}`);return(await e.text()).trim().split(`
48
+ `).filter(Boolean).map(r=>({id:`cheatsh:${t}/${r}`,title:`${t}/${r}`,content:"",language:t,tags:["cheatsheet",t,"quick-reference"]}))},async fetch(t){let e=await this.list(t),n=[];for(let o of e){let r=o.title;try{let s=await this.fetchOne(r);s&&n.push(s)}catch{}await new Promise(s=>setTimeout(s,1e3))}return n},async fetchOne(t){let e=await fetch(`${_t}/${encodeURI(t)}?T`);if(!e.ok)return null;let n=await e.text(),o=t.split("/")[0]??"";return{id:`cheatsh:${t}`,title:t,content:n.trim(),language:o,tags:["cheatsheet",o,"quick-reference"],sourceUrl:`${_t}/${t}`}}}});import{mkdirSync as ja,existsSync as $r,readFileSync as Ba,writeFileSync as Ia}from"node:fs";import{join as jr}from"node:path";import{homedir as Na}from"node:os";function La(t,e){let n=t.split(`
49
+ `),o="",r="",s;for(let g of n)if(g.startsWith("# ")&&!o)o=g.slice(2).trim();else if(g.startsWith("> ")&&!r){let d=g.slice(2).trim();d.startsWith("More information:")?s=d.replace("More information:","").trim().replace(/[<>]/g,""):r=d}let i=e.split("/"),a=i[0]??"common",l=i[1]??i[0];return{id:`tldr:${e}`,title:o||l,content:t.trim(),language:"",tags:["tldr","man-page",a],sourceUrl:s}}async function Mr(){$r(Lt)||ja(Lt,{recursive:!0});let t=jr(Lt,"tldr-tree.json"),e=1440*60*1e3;if($r(t)){let s=(await import("node:fs")).statSync(t);if(Date.now()-s.mtimeMs<e)return JSON.parse(Ba(t,"utf-8"))}let n=await fetch(_a);if(!n.ok)throw new Error(`GitHub tree API failed: ${n.status}`);let r=(await n.json()).tree.filter(s=>s.type==="blob"&&s.path.startsWith("pages/"));return Ia(t,JSON.stringify(r),"utf-8"),r}var Oa,Fa,_a,Lt,Br,Ir=C(()=>{"use strict";Oa="tldr-pages/tldr",Fa="https://raw.githubusercontent.com/tldr-pages/tldr/main",_a=`https://api.github.com/repos/${Oa}/git/trees/main?recursive=1`,Lt=jr(Na(),".cortex","cache"),Br={name:"tldr",displayName:"tldr-pages",async list(t){return(await Mr()).filter(o=>o.path.startsWith("pages/")&&o.path.includes(`/${t}`)&&o.path.endsWith(".md")).map(o=>{let r=o.path.split("/"),s=r[1]??"common",i=(r[2]??"").replace(".md","");return{id:`tldr:${s}/${i}`,title:i,content:"",language:"",tags:["tldr","man-page",s]}})},async fetch(t){let e=await this.list(t),n=[];for(let o of e){let r=await this.fetchOne(o.id.replace("tldr:",""));r&&n.push(r)}return n},async fetchOne(t){let n=(await Mr()).find(s=>s.path.includes(`/${t.split("/").pop()}.md`)&&s.path.startsWith("pages/"));if(!n)return null;let o=await fetch(`${Fa}/${n.path}`);if(!o.ok)return null;let r=await o.text();return La(r,t)}}});function Nr(t){let e=t;return e=e.replace(/<pre[^>]*><code[^>]*>([\s\S]*?)<\/code><\/pre>/gi,(n,o)=>"\n```\n"+Dt(o.trim())+"\n```\n"),e=e.replace(/<pre[^>]*>([\s\S]*?)<\/pre>/gi,(n,o)=>"\n```\n"+Dt(o.trim())+"\n```\n"),e=e.replace(/<code[^>]*>(.*?)<\/code>/gi,"`$1`"),e=e.replace(/<h1[^>]*>(.*?)<\/h1>/gi,`# $1
47
50
  `),e=e.replace(/<h2[^>]*>(.*?)<\/h2>/gi,`## $1
48
51
  `),e=e.replace(/<h3[^>]*>(.*?)<\/h3>/gi,`### $1
49
52
  `),e=e.replace(/<h4[^>]*>(.*?)<\/h4>/gi,`#### $1
@@ -51,31 +54,30 @@ ${r.length>16e3?r.slice(0,16e3)+`
51
54
  `),e=e.replace(/<br\s*\/?>/gi,`
52
55
  `),e=e.replace(/<\/p>/gi,`
53
56
 
54
- `),e=e.replace(/<p[^>]*>/gi,""),e=e.replace(/<[^>]+>/g,""),e=Mt(e),e=e.replace(/\n{3,}/g,`
57
+ `),e=e.replace(/<p[^>]*>/gi,""),e=e.replace(/<[^>]+>/g,""),e=Dt(e),e=e.replace(/\n{3,}/g,`
55
58
 
56
- `),e.trim()}function Mt(t){return t.replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&nbsp;/g," ")}var Qe,wr,Tr=C(()=>{"use strict";Qe="https://devdocs.io",wr={name:"devdocs",displayName:"DevDocs (beta)",async list(t){let e=await fetch(`${Qe}/docs/${encodeURIComponent(t)}/index.json`);if(!e.ok)throw new Error(`DevDocs index failed: ${e.status}`);return(await e.json()).entries.map(o=>({id:`devdocs:${t}/${o.path}`,title:o.name,content:"",language:t,tags:["devdocs",t,o.type,"beta"]}))},async fetch(t){let e=await this.list(t),n=[];try{let o=await fetch(`${Qe}/docs/${encodeURIComponent(t)}/db.json`);if(o.ok){let r=await o.json();for(let s of e){let i=s.id.replace(`devdocs:${t}/`,""),a=r[i];a&&n.push({...s,content:Cr(a)})}return n}}catch{}return e},async fetchOne(t){let e=t.split("/"),n=e[0],o=e.slice(1).join("/");try{let r=await fetch(`${Qe}/docs/${encodeURIComponent(n)}/db.json`);if(!r.ok)return null;let i=(await r.json())[o];return i?{id:`devdocs:${t}`,title:o,content:Cr(i),language:n,tags:["devdocs",n,"beta"],sourceUrl:`${Qe}/${n}/${o}`}:null}catch{return null}}}});var kr={};le(kr,{getAdapter:()=>va,listAdapters:()=>ka,parseSourceSpec:()=>Ea});function va(t){return vr.find(e=>e.name===t)??null}function ka(){return vr.map(t=>({name:t.name,displayName:t.displayName}))}function Ea(t){let e=t.indexOf(":");return e===-1?{source:t,topic:""}:{source:t.slice(0,e),topic:t.slice(e+1)}}var vr,Er=C(()=>{"use strict";fr();xr();Tr();vr=[pr,Sr,wr]});import{readFileSync as Bt}from"node:fs";import{join as It,dirname as Br}from"node:path";import{fileURLToPath as Ir}from"node:url";import et from"chalk";function Nt(){let t=new Map;function e(o){t.set(o.name,o)}async function n(o){let r=o.slice(2),s=r[0];if(s==="--help"||s==="-h"){let l=t.get("help");l&&await l.run([]);return}if(!s){let l=t.get("start");l&&await l.run([]);return}if(s==="--version"||s==="-v"){let l=Br(Ir(import.meta.url)),g;try{g=JSON.parse(Bt(It(l,"../../package.json"),"utf-8"))}catch{g=JSON.parse(Bt(It(l,"../package.json"),"utf-8"))}console.log(g.version);return}let i=t.get(s);i||(console.log(et.red(`Unknown command: ${s}`)),console.log(et.dim('Run "cortex help" for usage information.')),process.exit(1));let a=r.slice(1);if(a.includes("--help")||a.includes("-h")){console.log(`
57
- ${et.bold(i.name)} \u2014 ${i.description}`),console.log(`
59
+ `),e.trim()}function Dt(t){return t.replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&nbsp;/g," ")}var st,Or,Fr=C(()=>{"use strict";st="https://devdocs.io",Or={name:"devdocs",displayName:"DevDocs (beta)",async list(t){let e=await fetch(`${st}/docs/${encodeURIComponent(t)}/index.json`);if(!e.ok)throw new Error(`DevDocs index failed: ${e.status}`);return(await e.json()).entries.map(o=>({id:`devdocs:${t}/${o.path}`,title:o.name,content:"",language:t,tags:["devdocs",t,o.type,"beta"]}))},async fetch(t){let e=await this.list(t),n=[];try{let o=await fetch(`${st}/docs/${encodeURIComponent(t)}/db.json`);if(o.ok){let r=await o.json();for(let s of e){let i=s.id.replace(`devdocs:${t}/`,""),a=r[i];a&&n.push({...s,content:Nr(a)})}return n}}catch{}return e},async fetchOne(t){let e=t.split("/"),n=e[0],o=e.slice(1).join("/");try{let r=await fetch(`${st}/docs/${encodeURIComponent(n)}/db.json`);if(!r.ok)return null;let i=(await r.json())[o];return i?{id:`devdocs:${t}`,title:o,content:Nr(i),language:n,tags:["devdocs",n,"beta"],sourceUrl:`${st}/${n}/${o}`}:null}catch{return null}}}});var Lr={};ce(Lr,{getAdapter:()=>Da,listAdapters:()=>qa,parseSourceSpec:()=>Ua});function Da(t){return _r.find(e=>e.name===t)??null}function qa(){return _r.map(t=>({name:t.name,displayName:t.displayName}))}function Ua(t){let e=t.indexOf(":");return e===-1?{source:t,topic:""}:{source:t.slice(0,e),topic:t.slice(e+1)}}var _r,Dr=C(()=>{"use strict";Rr();Ir();Fr();_r=[Pr,Br,Or]});import{readFileSync as Ut}from"node:fs";import{join as Ht,dirname as Wr}from"node:path";import{fileURLToPath as Jr}from"node:url";import it from"chalk";function Wt(){let t=new Map;function e(o){t.set(o.name,o)}async function n(o){let r=o.slice(2),s=r[0];if(s==="--help"||s==="-h"){let l=t.get("help");l&&await l.run([]);return}if(!s){let l=t.get("start");l&&await l.run([]);return}if(s==="--version"||s==="-v"){let l=Wr(Jr(import.meta.url)),g;try{g=JSON.parse(Ut(Ht(l,"../../package.json"),"utf-8"))}catch{g=JSON.parse(Ut(Ht(l,"../package.json"),"utf-8"))}console.log(g.version);return}let i=t.get(s);i||(console.log(it.red(`Unknown command: ${s}`)),console.log(it.dim('Run "cortex help" for usage information.')),process.exit(1));let a=r.slice(1);if(a.includes("--help")||a.includes("-h")){console.log(`
60
+ ${it.bold(i.name)} \u2014 ${i.description}`),console.log(`
58
61
  Usage: ${i.usage}
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(`
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
- `).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(`
62
+ `);return}await i.run(a)}return{register:e,run:n}}import Y from"chalk";var Jt={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("")}};Q();import{spawn as Wi}from"node:child_process";import{fileURLToPath as Ji}from"node:url";import{dirname as zi,join as Xi}from"node:path";import Rt from"chalk";import{createHmac as Be}from"node:crypto";import{existsSync as Xt,readFileSync as Qr,writeFileSync as es,mkdirSync as ts}from"node:fs";import{join as Kt}from"node:path";import{homedir as Gt}from"node:os";import zt from"chalk";var ct=Kt(Gt(),".cortex"),lt=Kt(ct,"license"),Ie="cx-v1-2026";function ns(){let t=Yt(),e=Zt(t);return`CX-${t}-${e}`}function os(){if(!Xt(lt))return rs();try{let t=Qr(lt,"utf-8").trim();return ss(t)}catch{return!1}}function Vt(){os()||(console.error(zt.red("Invalid or corrupted license.")),console.error(zt.dim("Run `cortex setup` to reactivate, or contact support.")),process.exit(1))}function rs(){try{Xt(ct)||ts(ct,{recursive:!0});let t=ns();return es(lt,t+`
63
+ `,"utf-8"),!0}catch{return!1}}function Yt(){let t=`${Gt()}:${process.platform}:${process.arch}`;return Be("sha256",Ie).update(t).digest("hex").slice(0,12)}function Zt(t){return Be("sha256",Ie+"-sig").update(t).digest("hex").slice(0,16)}function ss(t){let e=t.split("-");if(e.length!==3||e[0]!=="CX")return!1;let[,n,o]=e;if(n!==Yt())return!1;let r=Zt(n);if(o.length!==r.length)return!1;let s=Buffer.from(o),i=Buffer.from(r);return s.length===i.length&&Be("sha256",Ie).update(s).digest().equals(Be("sha256",Ie).update(i).digest())}var Jo={name:"start",description:"Start the Cortex daemon",usage:"cortex start [-d] [--port N]",run:async t=>{Vt();let{running:e,pid:n}=_();if(e){console.log(Rt.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=zi(Ji(import.meta.url)),a=Xi(i,"../start.js"),g=process.argv.some(c=>/(?:^|[\\/])tsx(?:[\\/.]|$)/.test(c))?["--import","tsx",a]:[a],d={...process.env,CORTEX_DAEMON:"1"};s&&(d.CORTEX_PORT=s);let u=Wi(process.execPath,g,{detached:!0,stdio:"ignore",env:d});u.unref(),u.pid?(await new Promise(c=>setTimeout(c,500)),console.log(Rt.green(`Cortex daemon started (PID ${u.pid}).`))):(console.log(Rt.red("Failed to start daemon.")),process.exit(1))}else{s&&(process.env.CORTEX_PORT=s),Me(process.pid);try{let{startCortex:i}=await Promise.resolve().then(()=>(Wo(),Ho));await i()}catch{Z()}}}};Q();he();import $t from"chalk";var zo={name:"stop",description:"Stop the running daemon",usage:"cortex stop",run:async()=>{let{running:t,pid:e}=_();if(!t||e===null){console.log($t.yellow("Cortex is not running."));return}console.log($t.dim(`Stopping Cortex (PID ${e})...`));try{process.kill(e,"SIGTERM")}catch{}let n=5e3,o=200,r=0;for(;r<n&&je(e);)await new Promise(s=>setTimeout(s,o)),r+=o;if(je(e)){try{process.kill(e,"SIGKILL")}catch{}await new Promise(s=>setTimeout(s,300))}Z();try{ke()}catch{}console.log($t.green("Cortex stopped. Claude Code API routing restored."))}};var Qo={name:"setup",description:"Interactive setup wizard",usage:"cortex setup",run:async()=>{let{runWizard:t}=await Promise.resolve().then(()=>(It(),Zo));await t()}};q();St();Q();import U from"chalk";var er=["pruning","injection","fingerprinting","matching","logging","dashboard","verbose","agentTracking"],tr={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 ge(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||!er.includes(r))&&(console.log(U.red(`Invalid feature. Valid: ${er.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}=_();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]"))}};Q();q();import{readdirSync as la,readFileSync as ua}from"node:fs";import{join as nr}from"node:path";import H from"chalk";var or={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=nr(s.dataDir,"logs");if(n){let{running:d}=_();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 m=c.body.getReader(),h=new TextDecoder;for(;;){let{done:b,value:y}=await m.read();if(b)break;process.stdout.write(h.decode(y))}}}catch(c){if(c.name==="AbortError")console.log(H.dim(`
64
+ 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=la(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=nr(i,a[d]),c=ua(u,"utf-8").trim().split(`
65
+ `).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)??"??:??:??",m=u.injected?H.green("injected"):H.dim("no-match"),h=u.processingTimeMs?`${u.processingTimeMs}ms`:"",b=u.topMatchEntry?H.cyan(u.topMatchEntry):"";console.log(` ${H.dim(c)} #${u.requestCount??"?"} ${m} ${b} ${H.dim(h)}`)}catch{console.log(H.dim(d))}console.log("")}};q();import{writeFileSync as fa}from"node:fs";import{join as ha}from"node:path";import{homedir as ya}from"node:os";import{stringify as gr}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 L from"chalk";var da=28;function nt(t){return t.padEnd(da)}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?L.cyan("\u25BA "):" ",o=this.value?L.green("\u25CF ON "):L.red("\u25CB OFF"),r=this.note?L.dim(` ${this.note}`):"";return`${n}${nt(this.label)} ${o}${r}`}handleKey(e){e.name==="space"&&(this.value=!this.value)}},O=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?L.cyan("\u25BA "):" ",o=this.editing?L.cyan(this.editBuffer+"\u2588"):String(this.value);return`${n}${nt(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+=".")}},tt=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?L.cyan("\u25BA "):" ",o=this.editing?L.cyan(this.editBuffer+"\u2588"):L.dim(this.value);return`${n}${nt(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)}},se=class{constructor(e,n){this.key=e;this.label=n}editing=!1;value=null;render(e){return L.bold.dim(` \u2500\u2500 ${this.label} \u2500\u2500`)}handleKey(e){}},Ae=class{constructor(e,n,o){this.key=e;this.label=n;this.value=o}editing=!1;render(e){return`${e?L.cyan("\u25BA "):" "}${nt(this.label)} ${L.dim(this.value)}`}handleKey(e){}};he();function rr(t){let e=new G("Server",[new O("proxyPort","Proxy Port",t.proxyPort),new tt("targetBaseUrl","Target API URL",t.targetBaseUrl),new O("dashboardPort","Dashboard Port",t.dashboardPort),new Ae("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 Ae("brain.empty","Sources","No brain sources configured"));let s=new G("Brain",r),i=new G("Tuning",[new O("pruneThresholdTokens","Prune Threshold (tokens)",t.pruneThresholdTokens),new O("injectionConfidenceThreshold","Injection Confidence",t.injectionConfidenceThreshold),new O("contextPressureThreshold","Context Pressure",t.contextPressureThreshold)]),l=!!pe().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 se("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,m=new G("Agents",[new A("feat.agentTracking","Agent Tracking",t.features.agentTracking??!1),new se("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 se("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 se("hdr.limits","Limits"),new O("at.subagentTtlMs","Subagent TTL (ms)",c.subagentTtlMs),new O("at.mainTtlMs","Main Session TTL (ms)",c.mainTtlMs),new O("at.teammateTtlMs","Teammate TTL (ms)",c.teammateTtlMs),new O("at.maxActive","Max Active Agents",c.maxActive),new O("at.maxHistory","Max History",c.maxHistory),new O("at.maxRequestHistory","Max Request History",c.maxRequestHistory)]);u.push(m)}return u}function sr(t,e){let[n,o,r,s]=t,i=t.find(p=>p.name==="Statusline"),a=t.find(p=>p.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"],m={...e.features};for(let p of c){let w=o.getField(`feat.${p}`);w&&(m[p]=w.value)}let h=e.brainSources.map(p=>{let w=r.getField(`brain.${p.name}`);return w?{...p,enabled:w.value}:p}),b=s.getField("pruneThresholdTokens").value,y=s.getField("injectionConfidenceThreshold").value,j=s.getField("contextPressureThreshold").value,B=a?.getField("feat.agentTracking");B&&(m.agentTracking=B.value);let S={...e.agentTracking};if(a){let p=(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:p("at.sub.pruning",S.subagents.pruning),fingerprinting:p("at.sub.fingerprinting",S.subagents.fingerprinting),matching:p("at.sub.matching",S.subagents.matching),injection:p("at.sub.injection",S.subagents.injection),logging:p("at.sub.logging",S.subagents.logging)},S.teammates={pruning:p("at.team.pruning",S.teammates.pruning),fingerprinting:p("at.team.fingerprinting",S.teammates.fingerprinting),matching:p("at.team.matching",S.teammates.matching),injection:p("at.team.injection",S.teammates.injection),logging:p("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 p=["cortexLabel","phrase","contextBar","tokensSaved","requests","injections","lastMatch","agentInfo","confidence","latency"];for(let w of p){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:m,brainSources:h,pruneThresholdTokens:b,injectionConfidenceThreshold:y,contextPressureThreshold:j,statusline:J,agentTracking:S}}import*as ur from"node:readline";import lr from"chalk";import $ from"chalk";var ir=["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 ar(){return ir[Math.floor(Math.random()*ir.length)]}function ot(t){return t.replace(/\x1b\[[0-9;]*[A-Za-z]/g,"")}function ga(t,e){return" "+t.map((o,r)=>r===e?$.bgWhite.black(` ${o} `):$.dim(` ${o} `)).join($.dim(" \u2502 "))}function ma(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 pa=ar();function cr(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=ga(t,e),a=ot(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 h of n){let b=ot(h),y=Math.max(0,r-1-b.length);s.push($.cyan(" \u2502")+h+" ".repeat(y)+$.cyan("\u2502"))}s.push($.cyan(" \u2502")+" ".repeat(r-1)+$.cyan("\u2502"));let l=ma(o),g=ot(l).length,d=Math.max(0,r-1-g);s.push($.cyan(" \u2502")+l+" ".repeat(d)+$.cyan("\u2502"));let u=$.dim(` Tip: ${pa}`),c=ot(u).length,m=Math.max(0,r-1-c);return s.push($.cyan(" \u2502")+u+" ".repeat(m)+$.cyan("\u2502")),s.push($.cyan(" \u2514"+"\u2500".repeat(r-1)+"\u2518")),s}function dr(t){return new Promise(e=>{let n=0;if(!process.stdin.isTTY){console.log(lr.red("Interactive config requires a TTY terminal.")),e({saved:!1});return}process.stdin.setRawMode(!0),ur.emitKeypressEvents(process.stdin),process.stdout.write("\x1B[?1049h"),process.stdout.write("\x1B[?25l");function o(){let i=t[n],a=i.render(),l=t.map(u=>u.name),g=i.focusedField?.editing??!1,d=cr(l,n,a,g);process.stdout.write("\x1B[H\x1B[J"),process.stdout.write(d.join(`
63
66
  `)+`
64
- `)}function r(){process.stdin.setRawMode(!1),process.stdin.removeAllListeners("keypress"),process.stdout.removeListener("resize",o),process.stdout.write("\x1B[2J\x1B[H")}process.on("uncaughtException",i=>{r(),console.error(i),process.exit(1)});function s(i,a){if(!a)return;let l={name:a.name??"",sequence:a.sequence,ctrl:a.ctrl};if(a.ctrl&&a.name==="c"){r(),console.log(Go.yellow("Config not saved.")),e({saved:!1});return}let g=t[n],d=g.focusedField?.editing??!1;if(a.name==="escape"&&!d){r(),e({saved:!0});return}if(!d){if(a.name==="right"||a.name==="tab"){n=(n+1)%t.length,o();return}if(a.name==="left"||a.shift&&a.name==="tab"){n=(n-1+t.length)%t.length,o();return}}g.handleKey(l),o()}process.stdin.on("keypress",s),process.stdout.on("resize",o),o()})}Ke();var Et=ea(ta(),".cortex","config.yaml"),Qo={name:"config",description:"Show/edit configuration",usage:"cortex config <show|edit|path|set> [key] [value]",run:async t=>{let e=t[0]??"edit";if(e==="edit"){let n=R(),o=Wo(n);if((await Yo(o)).saved){let s=Jo(o,n),i={proxyPort:s.proxyPort,targetBaseUrl:s.targetBaseUrl,brainDir:s.brainDir,dashboardPort:s.dashboardPort,verbose:s.verbose,pruneThresholdTokens:s.pruneThresholdTokens,contextPressureThreshold:s.contextPressureThreshold,injectionConfidenceThreshold:s.injectionConfidenceThreshold,rrfWeights:s.rrfWeights,features:s.features,brainSources:s.brainSources,statusline:s.statusline,agentTracking:s.agentTracking};Qi(Et,Zo(i),"utf-8"),console.log(V.green("Config saved to "+Et));let l=o.find(g=>g.name==="Statusline")?.getField("sl.enabled");l&&Je()&&(l.value?xe({statusLine:{type:"command",command:"cortex-statusline",padding:1}}):No("statusLine"),console.log(V.dim("Claude Code statusline updated (takes effect next session).")))}return}if(e==="show"){let n=R(),o={proxyPort:n.proxyPort,targetBaseUrl:n.targetBaseUrl,brainDir:n.brainDir,dataDir:n.dataDir,dashboardPort:n.dashboardPort,verbose:n.verbose,pruneThresholdTokens:n.pruneThresholdTokens,injectionConfidenceThreshold:n.injectionConfidenceThreshold,contextPressureThreshold:n.contextPressureThreshold,rrfWeights:n.rrfWeights,features:n.features,brainSources:n.brainSources,agentTracking:n.agentTracking,statusline:n.statusline};console.log(""),console.log(Zo(o));return}if(e==="path"){console.log(Et);return}if(e==="set"){let n=t[1],o=t[2];if(!n||o===void 0){console.log(V.red("Usage: cortex config set <key> <value>")),console.log(V.dim("Example: cortex config set proxyPort 8080")),console.log(V.dim("Example: cortex config set features.pruning false"));return}let r=new Set(["__proto__","constructor","prototype"]),s=n.split(".");for(let d of s)if(r.has(d)){console.log(V.red(`Invalid key segment: ${d}`));return}let i=Kt(),a=i;for(let d=0;d<s.length-1;d++)(typeof a[s[d]]!="object"||a[s[d]]===null)&&(a[s[d]]={}),a=a[s[d]];let l=new Set(["proxyPort","dashboardPort","pruneThresholdTokens","contextPressureThreshold","injectionConfidenceThreshold","weight1","weight2","featureOverlap","semantic","subagentTtlMs","mainTtlMs","teammateTtlMs","maxActive","maxHistory","maxRequestHistory"]),g=s[s.length-1];o==="true"?a[g]=!0:o==="false"?a[g]=!1:l.has(g)&&!isNaN(Number(o))&&o!==""?a[g]=Number(o):a[g]=o,Xt(i),console.log(V.green(`Set ${n} = ${o}`));return}console.log(V.red(`Unknown subcommand: ${e}`)),console.log(V.dim("Usage: cortex config <show|edit|path|set>"))}};import W from"chalk";q();var er={name:"status",description:"Show daemon status",usage:"cortex status",run:async()=>{let t=R(),{running:e,pid:n}=L();if(e&&n)try{let o=await fetch(`http://localhost:${t.dashboardPort}/api/status`);if(o.ok){let r=await o.json();console.log(""),console.log(W.green.bold(" Cortex is running")),console.log(W.dim(` PID: ${r.pid}`)),console.log(W.dim(` Port: ${r.port}`)),console.log(W.dim(` Uptime: ${na(r.uptime)}`)),console.log(W.dim(` Brain entries: ${r.brainEntries}`)),console.log(W.dim(` Requests: ${r.requestCount}`)),console.log(W.dim(` Version: ${r.version}`)),console.log("");return}}catch{}console.log(""),console.log(n?W.yellow(` Cortex has a PID file (${n}) but is not reachable.`):W.dim(" Cortex is not running.")),console.log(W.dim(` Config: ${t.dataDir}/config.yaml`)),console.log(W.dim(` Port: ${t.proxyPort} (configured)`)),console.log("")}};function na(t){if(t<60)return`${Math.round(t)}s`;if(t<3600)return`${Math.floor(t/60)}m ${Math.round(t%60)}s`;let e=Math.floor(t/3600),n=Math.floor(t%3600/60);return`${e}h ${n}m`}q();import T from"chalk";import{symlinkSync as oa,unlinkSync as ra,existsSync as ve,statSync as sa,readFileSync as tr,writeFileSync as ia}from"node:fs";import{join as Pt,basename as At,resolve as aa}from"node:path";import{homedir as ca}from"node:os";import{parse as nr,stringify as la}from"yaml";var Te=Pt(ca(),".cortex","config.yaml");function ua(t){let e=t.replace(/\\/g,"/").toLowerCase(),n=["/.ssh/","/.gnupg/","/.aws/","/.kube/","/.docker/","/appdata/","/windows/","/etc/","/proc/","/sys/","/.env","/credentials","/secrets","/.npmrc"];for(let r of n)if(e.includes(r))throw new Error(`Source path "${t}" is restricted: contains sensitive directory "${r}"`);let o=t.replace(/\\/g,"/").split("/").filter(Boolean);if(o.length>0&&o[o.length-1].startsWith("."))throw new Error(`Source path "${t}" is restricted: hidden directories are not allowed as brain sources`)}function or(t,e){let n=aa(t),o=At(n).replace(/\.[^.]+$/,"");if(!ve(n))throw new Error(`Path does not exist: ${n}`);ua(n);let r=sa(n).isDirectory(),s=Pt(e,r?o:At(n));if(!ve(s)){let a=process.platform==="win32"&&r?"junction":void 0;oa(n,s,a)}let i={name:o,type:"local",path:n,enabled:!0,isDefault:!1};return Ze(a=>{let l=a.findIndex(g=>g.path===n);return l>=0?a[l]=i:a.push(i),a}),i}function rr(t,e){let o=cr().find(s=>s.name===t);if(!o)throw new Error(`Source "${t}" not found.`);if(o.isDefault)throw new Error("Default source cannot be removed, only disabled.");let r=Pt(e,At(o.path));if(ve(r))try{ra(r)}catch{}Ze(s=>s.filter(i=>i.name!==t))}function sr(t){Ze(e=>{let n=e.find(o=>o.name===t);return n&&(n.enabled=!0),e})}function ir(t){Ze(e=>{let n=e.find(o=>o.name===t);return n&&(n.enabled=!1),e})}function ar(){return cr()}function cr(){if(!ve(Te))return[];let t=tr(Te,"utf-8");return(nr(t)??{}).brainSources??[]}function Ze(t){let e={};if(ve(Te)){let o=tr(Te,"utf-8");e=nr(o)??{}}let n=e.brainSources??[];e.brainSources=t(n),ia(Te,la(e),"utf-8")}import{execSync as lr}from"node:child_process";import{createInterface as ur}from"node:readline";async function dr(){return process.platform!=="win32"?ma():await pa("Add file or folder? (f/d): ",["f","d"])==="f"?da():ga()}function da(){let t=`
67
+ `)}function r(){process.stdin.setRawMode(!1),process.stdin.removeAllListeners("keypress"),process.stdout.removeListener("resize",o),process.stdout.write("\x1B[?25h"),process.stdout.write("\x1B[?1049l")}process.on("uncaughtException",i=>{r(),console.error(i),process.exit(1)});function s(i,a){if(!a)return;let l={name:a.name??"",sequence:a.sequence,ctrl:a.ctrl};if(a.ctrl&&a.name==="c"){r(),console.log(lr.yellow("Config not saved.")),e({saved:!1});return}let g=t[n],d=g.focusedField?.editing??!1;if(a.name==="escape"&&!d){r(),e({saved:!0});return}if(!d){if(a.name==="right"||a.name==="tab"){n=(n+1)%t.length,o();return}if(a.name==="left"||a.shift&&a.name==="tab"){n=(n-1+t.length)%t.length,o();return}}g.handleKey(l),o()}process.stdin.on("keypress",s),process.stdout.on("resize",o),o()})}he();var Nt=ha(ya(),".cortex","config.yaml"),mr={name:"config",description:"Show/edit configuration",usage:"cortex config <show|edit|path|set> [key] [value]",run:async t=>{let e=t[0]??"edit";if(e==="edit"){let n=R(),o=rr(n);if((await dr(o)).saved){let s=sr(o,n),i={proxyPort:s.proxyPort,targetBaseUrl:s.targetBaseUrl,brainDir:s.brainDir,dashboardPort:s.dashboardPort,verbose:s.verbose,pruneThresholdTokens:s.pruneThresholdTokens,contextPressureThreshold:s.contextPressureThreshold,injectionConfidenceThreshold:s.injectionConfidenceThreshold,rrfWeights:s.rrfWeights,features:s.features,brainSources:s.brainSources,statusline:s.statusline,agentTracking:s.agentTracking};fa(Nt,gr(i),"utf-8"),console.log(V.green("Config saved to "+Nt));let l=o.find(g=>g.name==="Statusline")?.getField("sl.enabled");l&&Ze()&&(l.value?fe({statusLine:{type:"command",command:"cortex-statusline",padding:1}}):Lo("statusLine"),console.log(V.dim("Claude Code statusline updated (takes effect next session).")))}return}if(e==="show"){let n=R(),o={proxyPort:n.proxyPort,targetBaseUrl:n.targetBaseUrl,brainDir:n.brainDir,dataDir:n.dataDir,dashboardPort:n.dashboardPort,verbose:n.verbose,pruneThresholdTokens:n.pruneThresholdTokens,injectionConfidenceThreshold:n.injectionConfidenceThreshold,contextPressureThreshold:n.contextPressureThreshold,rrfWeights:n.rrfWeights,features:n.features,brainSources:n.brainSources,agentTracking:n.agentTracking,statusline:n.statusline};console.log(""),console.log(gr(o));return}if(e==="path"){console.log(Nt);return}if(e==="set"){let n=t[1],o=t[2];if(!n||o===void 0){console.log(V.red("Usage: cortex config set <key> <value>")),console.log(V.dim("Example: cortex config set proxyPort 8080")),console.log(V.dim("Example: cortex config set features.pruning false"));return}let r=new Set(["__proto__","constructor","prototype"]),s=n.split(".");for(let d of s)if(r.has(d)){console.log(V.red(`Invalid key segment: ${d}`));return}let i=nn(),a=i;for(let d=0;d<s.length-1;d++)(typeof a[s[d]]!="object"||a[s[d]]===null)&&(a[s[d]]={}),a=a[s[d]];let l=new Set(["proxyPort","dashboardPort","pruneThresholdTokens","contextPressureThreshold","injectionConfidenceThreshold","weight1","weight2","featureOverlap","semantic","subagentTtlMs","mainTtlMs","teammateTtlMs","maxActive","maxHistory","maxRequestHistory"]),g=s[s.length-1];o==="true"?a[g]=!0:o==="false"?a[g]=!1:l.has(g)&&!isNaN(Number(o))&&o!==""?a[g]=Number(o):a[g]=o,on(i),console.log(V.green(`Set ${n} = ${o}`));return}console.log(V.red(`Unknown subcommand: ${e}`)),console.log(V.dim("Usage: cortex config <show|edit|path|set>"))}};Q();q();import W from"chalk";var pr={name:"status",description:"Show daemon status",usage:"cortex status",run:async()=>{let t=R(),{running:e,pid:n}=_();if(e&&n)try{let o=await fetch(`http://localhost:${t.dashboardPort}/api/status`);if(o.ok){let r=await o.json();console.log(""),console.log(W.green.bold(" Cortex is running")),console.log(W.dim(` PID: ${r.pid}`)),console.log(W.dim(` Port: ${r.port}`)),console.log(W.dim(` Uptime: ${ba(r.uptime)}`)),console.log(W.dim(` Brain entries: ${r.brainEntries}`)),console.log(W.dim(` Requests: ${r.requestCount}`)),console.log(W.dim(` Version: ${r.version}`)),console.log("");return}}catch{}console.log(""),console.log(n?W.yellow(` Cortex has a PID file (${n}) but is not reachable.`):W.dim(" Cortex is not running.")),console.log(W.dim(` Config: ${t.dataDir}/config.yaml`)),console.log(W.dim(` Port: ${t.proxyPort} (configured)`)),console.log("")}};function ba(t){if(t<60)return`${Math.round(t)}s`;if(t<3600)return`${Math.floor(t/60)}m ${Math.round(t%60)}s`;let e=Math.floor(t/3600),n=Math.floor(t%3600/60);return`${e}h ${n}m`}q();import T from"chalk";import{symlinkSync as Sa,unlinkSync as xa,existsSync as Re,statSync as Ca,readFileSync as fr,writeFileSync as wa}from"node:fs";import{join as Ft,basename as Ot,resolve as Ta}from"node:path";import{homedir as va}from"node:os";import{parse as hr,stringify as ka}from"yaml";var Pe=Ft(va(),".cortex","config.yaml");function Ea(t){let e=t.replace(/\\/g,"/").toLowerCase(),n=["/.ssh/","/.gnupg/","/.aws/","/.kube/","/.docker/","/appdata/","/windows/","/etc/","/proc/","/sys/","/.env","/credentials","/secrets","/.npmrc"];for(let r of n)if(e.includes(r))throw new Error(`Source path "${t}" is restricted: contains sensitive directory "${r}"`);let o=t.replace(/\\/g,"/").split("/").filter(Boolean);if(o.length>0&&o[o.length-1].startsWith("."))throw new Error(`Source path "${t}" is restricted: hidden directories are not allowed as brain sources`)}function yr(t,e){let n=Ta(t),o=Ot(n).replace(/\.[^.]+$/,"");if(!Re(n))throw new Error(`Path does not exist: ${n}`);Ea(n);let r=Ca(n).isDirectory(),s=Ft(e,r?o:Ot(n));if(!Re(s)){let a=process.platform==="win32"&&r?"junction":void 0;Sa(n,s,a)}let i={name:o,type:"local",path:n,enabled:!0,isDefault:!1};return rt(a=>{let l=a.findIndex(g=>g.path===n);return l>=0?a[l]=i:a.push(i),a}),i}function br(t,e){let o=wr().find(s=>s.name===t);if(!o)throw new Error(`Source "${t}" not found.`);if(o.isDefault)throw new Error("Default source cannot be removed, only disabled.");let r=Ft(e,Ot(o.path));if(Re(r))try{xa(r)}catch{}rt(s=>s.filter(i=>i.name!==t))}function Sr(t){rt(e=>{let n=e.find(o=>o.name===t);return n&&(n.enabled=!0),e})}function xr(t){rt(e=>{let n=e.find(o=>o.name===t);return n&&(n.enabled=!1),e})}function Cr(){return wr()}function wr(){if(!Re(Pe))return[];let t=fr(Pe,"utf-8");return(hr(t)??{}).brainSources??[]}function rt(t){let e={};if(Re(Pe)){let o=fr(Pe,"utf-8");e=hr(o)??{}}let n=e.brainSources??[];e.brainSources=t(n),wa(Pe,ka(e),"utf-8")}import{execSync as Tr}from"node:child_process";import{createInterface as vr}from"node:readline";async function kr(){return process.platform!=="win32"?Ra():await $a("Add file or folder? (f/d): ",["f","d"])==="f"?Aa():Pa()}function Aa(){let t=`
65
68
  Add-Type -AssemblyName System.Windows.Forms
66
69
  $dialog = New-Object System.Windows.Forms.OpenFileDialog
67
70
  $dialog.Filter = "Brain entries (*.md)|*.md|All files (*.*)|*.*"
68
71
  $dialog.Multiselect = $false
69
72
  if ($dialog.ShowDialog() -eq 'OK') { $dialog.FileName }
70
- `.trim();try{return lr(`powershell -NoProfile -Command "${t.replace(/"/g,'\\"')}"`,{encoding:"utf-8",timeout:6e4}).trim()||null}catch{return null}}function ga(){let t=`
73
+ `.trim();try{return Tr(`powershell -NoProfile -Command "${t.replace(/"/g,'\\"')}"`,{encoding:"utf-8",timeout:6e4}).trim()||null}catch{return null}}function Pa(){let t=`
71
74
  Add-Type -AssemblyName System.Windows.Forms
72
75
  $dialog = New-Object System.Windows.Forms.FolderBrowserDialog
73
76
  $dialog.Description = "Select a brain entries folder"
74
77
  if ($dialog.ShowDialog() -eq 'OK') { $dialog.SelectedPath }
75
- `.trim();try{return lr(`powershell -NoProfile -Command "${t.replace(/"/g,'\\"')}"`,{encoding:"utf-8",timeout:6e4}).trim()||null}catch{return null}}async function ma(){let t=ur({input:process.stdin,output:process.stdout});return new Promise(e=>{t.question("Enter path to file or folder: ",n=>{t.close(),e(n.trim()||null)})})}async function pa(t,e){let n=ur({input:process.stdin,output:process.stdout});return new Promise(o=>{n.question(t,r=>{n.close();let s=r.trim().toLowerCase();o(e.includes(s)?s:e[0])})})}var Ar={name:"brain",description:"Manage brain entries and sources",usage:"cortex brain <list|search|stats|import|sources>",run:async t=>{let e=t[0];if(e==="sources"){await Aa(t.slice(1));return}if(e==="list"){await Pa();return}if(e==="stats"){await Ra();return}if(e==="search"){let n=t.slice(1).join(" ");if(!n){console.log(T.red("Usage: cortex brain search <query>"));return}await $a(n);return}if(e==="import"){let n=t[1];if(!n){console.log(T.red("Usage: cortex brain import <source:topic>")),console.log(T.dim("Example: cortex brain import cheatsh:python/lambda"));return}await Ma(n);return}if(!e){console.log(T.red("Usage: cortex brain <list|search|stats|import|sources>"));return}console.log(T.red(`Unknown subcommand: ${e}`)),console.log(T.dim("Usage: cortex brain <list|search|stats|import|sources>"))}};async function Aa(t){let e=t[0]??"list",n=R();if(e==="list"){let o=ar(),r=n.brainSources,s=o.length>0?o:r;console.log(""),console.log(T.bold("Source Type Path Status")),console.log(T.dim("\u2500".repeat(70)));for(let i of s){let a=i.enabled?T.green("\u2713 enabled")+(i.isDefault?T.dim(" (default)"):""):T.red("\u2717 disabled");console.log(` ${i.name.padEnd(14)} ${i.type.padEnd(7)} ${i.path.padEnd(33)} ${a}`)}console.log("");return}if(e==="add"){let o=t[1],r;if(o?r=o:r=await dr(),!r){console.log(T.yellow("No path selected."));return}try{let s=or(r,n.brainDir);console.log(T.green(`Source "${s.name}" added from ${s.path}`))}catch(s){console.log(T.red(`Failed to add source: ${s.message}`))}return}if(e==="remove"){let o=t[1];if(!o){console.log(T.red("Usage: cortex brain sources remove <name>"));return}try{rr(o,n.brainDir),console.log(T.green(`Source "${o}" removed.`))}catch(r){console.log(T.red(r.message))}return}if(e==="enable"){let o=t[1];if(!o){console.log(T.red("Usage: cortex brain sources enable <name>"));return}sr(o),console.log(T.green(`Source "${o}" enabled.`));return}if(e==="disable"){let o=t[1];if(!o){console.log(T.red("Usage: cortex brain sources disable <name>"));return}ir(o),console.log(T.green(`Source "${o}" disabled.`));return}console.log(T.red(`Unknown sources action: ${e}`))}async function Pa(){let t=R();try{let{BrainStore:e}=await Promise.resolve().then(()=>(re(),me)),{join:n}=await import("node:path"),o=await e.open(n(t.dataDir,"brain.db")),r=o.getAllEntries();console.log(""),console.log(T.bold(`Brain entries (${r.length}):`));for(let s of r){let i=s.tags.length>0?T.dim(` [${s.tags.join(", ")}]`):"";console.log(` ${T.cyan(s.title)}${i}`)}console.log(""),o.close()}catch{console.log(T.dim("Could not read brain store."))}}async function Ra(){let t=R();try{let{BrainStore:e}=await Promise.resolve().then(()=>(re(),me)),{join:n}=await import("node:path"),o=await e.open(n(t.dataDir,"brain.db")),r=o.getEntryCount();console.log(""),console.log(T.bold("Brain Statistics")),console.log(` Total entries: ${r}`),console.log(` Brain dir: ${t.brainDir}`),console.log(` Sources: ${t.brainSources.length}`),console.log(""),o.close()}catch{console.log(T.dim("Could not read brain store."))}}async function $a(t){let e=R();console.log(T.dim(`Searching for: "${t}"...`));try{let{BrainStore:n}=await Promise.resolve().then(()=>(re(),me)),{searchBrain:o}=await Promise.resolve().then(()=>(mr(),gr)),{join:r}=await import("node:path"),s=await n.open(r(e.dataDir,"brain.db")),i=await o(t,s,5);if(console.log(""),i.length===0)console.log(T.dim(" No matches found."));else for(let a of i){let l=(a.score*100).toFixed(1);console.log(` ${T.cyan(a.entry.title)} ${T.dim(`${l}%`)}`)}console.log(""),s.close()}catch(n){console.log(T.red(`Search failed: ${n.message}`))}}async function Ma(t){let{parseSourceSpec:e,getAdapter:n,listAdapters:o}=await Promise.resolve().then(()=>(Er(),kr)),{source:r,topic:s}=e(t),i=n(r);if(!i){console.log(T.red(`Unknown source: ${r}`));let a=o().map(l=>l.name).join(", ");console.log(T.dim(`Available: ${a}`));return}if(!s){console.log(T.red(`No topic specified. Usage: cortex brain import ${r}:<topic>`));return}console.log(T.dim(`Importing from ${i.displayName}: ${s}...`));try{let a=s.includes("/")?[await i.fetchOne(s)].filter(Boolean):await i.fetch(s);if(a.length===0){console.log(T.yellow("No entries found."));return}let l=R(),{BrainStore:g}=await Promise.resolve().then(()=>(re(),me)),{join:d}=await import("node:path"),u=await g.open(d(l.dataDir,"brain.db"));for(let c of a)c&&u.addEntry({id:c.id,title:c.title,content:c.content,language:c.language,errorTypes:[],tags:c.tags,embedding:null,source:i.name});console.log(T.green(`Imported ${a.length} entries from ${i.displayName}.`)),u.close()}catch(a){console.log(T.red(`Import failed: ${a.message}`))}}import{spawn as Pr,execSync as ja}from"node:child_process";import{existsSync as Ba}from"node:fs";import{fileURLToPath as Ia}from"node:url";import{dirname as Na,join as Rr}from"node:path";import{homedir as Fa}from"node:os";import K from"chalk";q();kt();async function Oa(t,e=15e3){let n=Date.now();for(;Date.now()-n<e;){try{if((await fetch(`http://localhost:${t}/api/status`)).ok)return!0}catch{}await new Promise(o=>setTimeout(o,200))}return!1}function La(){try{let t=process.platform==="win32"?"where claude":"which claude";return ja(t,{stdio:"pipe"}),"claude"}catch{return null}}function _a(t){let e=Na(Ia(import.meta.url)),n=Rr(e,"../start.js"),r=process.argv.some(a=>/(?:^|[\\/])tsx(?:[\\/.]|$)/.test(a))?["--import","tsx",n]:[n],s={...process.env};t&&(s.CORTEX_PORT=t);let i=Pr(process.execPath,r,{detached:!0,stdio:"ignore",env:s});return i.unref(),i.pid?(ue(i.pid),i.pid):null}var $r={name:"claude",description:"Start Cortex + launch Claude Code",usage:"cortex claude [--port N]",run:async t=>{let e=Rr(Fa(),".cortex","config.yaml");Ba(e)||(console.log(K.yellow(`Cortex hasn't been set up yet. Running setup first...
76
- `)),await vt(),console.log(""));let n=R(),o=t.indexOf("--port"),r=o!==-1?t[o+1]:void 0,s=r?Number(r):n.proxyPort,i=t.filter((u,c)=>!(u==="--port"||c>0&&t[c-1]==="--port")),{running:a,pid:l}=L();if(a)console.log(K.green(`Cortex already running (PID ${l})`));else{process.stdout.write(K.dim("Starting Cortex... "));let u=_a(r);u||(console.log(K.red("failed")),process.exit(1));let c=await Oa(n.dashboardPort);console.log(c?K.green(`ready (PID ${u})`):K.yellow(`started (PID ${u}, still initializing)`))}let g=La();if(!g){console.log(""),console.log(K.red("Claude Code not found in PATH.")),console.log(K.dim("Install it: https://docs.anthropic.com/en/docs/claude-code")),console.log(""),console.log(K.dim("Cortex is running. Set the env var manually:")),console.log(` export ANTHROPIC_BASE_URL=http://localhost:${s}`);return}console.log(K.dim("Launching Claude Code...")),console.log(""),Pr(g,i,{stdio:"inherit",env:{...process.env,ANTHROPIC_BASE_URL:`http://localhost:${s}`}}).on("close",u=>{process.exit(u??0)})}};q();import{readFileSync as Da}from"node:fs";import{join as qa}from"node:path";import{homedir as Ua}from"node:os";import x from"chalk";var Mr={name:"agents",description:"View tracked agents and topology",usage:"cortex agents [list|topology|history|detail <id>]",run:async t=>{let e=R(),n=t[0]??"list",o=async r=>{let s=qa(Ua(),".cortex","api-token"),i="";try{i=Da(s,"utf-8").trim()}catch{}let a={Accept:"application/json"};i&&(a.Authorization=`Bearer ${i}`);let l=await fetch(`http://localhost:${e.dashboardPort}${r}`,{headers:a});if(l.status===401&&(console.log(x.red(" Unauthorized. Check ~/.cortex/api-token")),process.exit(1)),!l.ok)throw new Error(`API ${l.status}: ${l.statusText}`);return l.json()};try{if(n==="list"){let r=await o("/api/agents");if(r.length===0){console.log(x.dim(`
78
+ `.trim();try{return Tr(`powershell -NoProfile -Command "${t.replace(/"/g,'\\"')}"`,{encoding:"utf-8",timeout:6e4}).trim()||null}catch{return null}}async function Ra(){let t=vr({input:process.stdin,output:process.stdout});return new Promise(e=>{t.question("Enter path to file or folder: ",n=>{t.close(),e(n.trim()||null)})})}async function $a(t,e){let n=vr({input:process.stdin,output:process.stdout});return new Promise(o=>{n.question(t,r=>{n.close();let s=r.trim().toLowerCase();o(e.includes(s)?s:e[0])})})}var qr={name:"brain",description:"Manage brain entries and sources",usage:"cortex brain <list|search|stats|import|sources>",run:async t=>{let e=t[0];if(e==="sources"){await Ha(t.slice(1));return}if(e==="list"){await Wa();return}if(e==="stats"){await Ja();return}if(e==="search"){let n=t.slice(1).join(" ");if(!n){console.log(T.red("Usage: cortex brain search <query>"));return}await za(n);return}if(e==="import"){let n=t[1];if(!n){console.log(T.red("Usage: cortex brain import <source:topic>")),console.log(T.dim("Example: cortex brain import cheatsh:python/lambda"));return}await Xa(n);return}if(!e){console.log(T.red("Usage: cortex brain <list|search|stats|import|sources>"));return}console.log(T.red(`Unknown subcommand: ${e}`)),console.log(T.dim("Usage: cortex brain <list|search|stats|import|sources>"))}};async function Ha(t){let e=t[0]??"list",n=R();if(e==="list"){let o=Cr(),r=n.brainSources,s=o.length>0?o:r;console.log(""),console.log(T.bold("Source Type Path Status")),console.log(T.dim("\u2500".repeat(70)));for(let i of s){let a=i.enabled?T.green("\u2713 enabled")+(i.isDefault?T.dim(" (default)"):""):T.red("\u2717 disabled");console.log(` ${i.name.padEnd(14)} ${i.type.padEnd(7)} ${i.path.padEnd(33)} ${a}`)}console.log("");return}if(e==="add"){let o=t[1],r;if(o?r=o:r=await kr(),!r){console.log(T.yellow("No path selected."));return}try{let s=yr(r,n.brainDir);console.log(T.green(`Source "${s.name}" added from ${s.path}`))}catch(s){console.log(T.red(`Failed to add source: ${s.message}`))}return}if(e==="remove"){let o=t[1];if(!o){console.log(T.red("Usage: cortex brain sources remove <name>"));return}try{br(o,n.brainDir),console.log(T.green(`Source "${o}" removed.`))}catch(r){console.log(T.red(r.message))}return}if(e==="enable"){let o=t[1];if(!o){console.log(T.red("Usage: cortex brain sources enable <name>"));return}Sr(o),console.log(T.green(`Source "${o}" enabled.`));return}if(e==="disable"){let o=t[1];if(!o){console.log(T.red("Usage: cortex brain sources disable <name>"));return}xr(o),console.log(T.green(`Source "${o}" disabled.`));return}console.log(T.red(`Unknown sources action: ${e}`))}async function Wa(){let t=R();try{let{BrainStore:e}=await Promise.resolve().then(()=>(le(),Se)),{join:n}=await import("node:path"),o=await e.open(n(t.dataDir,"brain.db")),r=o.getAllEntries();console.log(""),console.log(T.bold(`Brain entries (${r.length}):`));for(let s of r){let i=s.tags.length>0?T.dim(` [${s.tags.join(", ")}]`):"";console.log(` ${T.cyan(s.title)}${i}`)}console.log(""),o.close()}catch{console.log(T.dim("Could not read brain store."))}}async function Ja(){let t=R();try{let{BrainStore:e}=await Promise.resolve().then(()=>(le(),Se)),{join:n}=await import("node:path"),o=await e.open(n(t.dataDir,"brain.db")),r=o.getEntryCount();console.log(""),console.log(T.bold("Brain Statistics")),console.log(` Total entries: ${r}`),console.log(` Brain dir: ${t.brainDir}`),console.log(` Sources: ${t.brainSources.length}`),console.log(""),o.close()}catch{console.log(T.dim("Could not read brain store."))}}async function za(t){let e=R();console.log(T.dim(`Searching for: "${t}"...`));try{let{BrainStore:n}=await Promise.resolve().then(()=>(le(),Se)),{searchBrain:o}=await Promise.resolve().then(()=>(Ar(),Er)),{join:r}=await import("node:path"),s=await n.open(r(e.dataDir,"brain.db")),i=await o(t,s,5);if(console.log(""),i.length===0)console.log(T.dim(" No matches found."));else for(let a of i){let l=(a.score*100).toFixed(1);console.log(` ${T.cyan(a.entry.title)} ${T.dim(`${l}%`)}`)}console.log(""),s.close()}catch(n){console.log(T.red(`Search failed: ${n.message}`))}}async function Xa(t){let{parseSourceSpec:e,getAdapter:n,listAdapters:o}=await Promise.resolve().then(()=>(Dr(),Lr)),{source:r,topic:s}=e(t),i=n(r);if(!i){console.log(T.red(`Unknown source: ${r}`));let a=o().map(l=>l.name).join(", ");console.log(T.dim(`Available: ${a}`));return}if(!s){console.log(T.red(`No topic specified. Usage: cortex brain import ${r}:<topic>`));return}console.log(T.dim(`Importing from ${i.displayName}: ${s}...`));try{let a=s.includes("/")?[await i.fetchOne(s)].filter(Boolean):await i.fetch(s);if(a.length===0){console.log(T.yellow("No entries found."));return}let l=R(),{BrainStore:g}=await Promise.resolve().then(()=>(le(),Se)),{join:d}=await import("node:path"),u=await g.open(d(l.dataDir,"brain.db"));for(let c of a)c&&u.addEntry({id:c.id,title:c.title,content:c.content,language:c.language,errorTypes:[],tags:c.tags,embedding:null,source:i.name});console.log(T.green(`Imported ${a.length} entries from ${i.displayName}.`)),u.close()}catch(a){console.log(T.red(`Import failed: ${a.message}`))}}jt();q();import{readFileSync as Ka}from"node:fs";import{join as Ga}from"node:path";import{homedir as Va}from"node:os";import x from"chalk";var Ur={name:"agents",description:"View tracked agents and topology",usage:"cortex agents [list|topology|history|detail <id>]",run:async t=>{let e=R(),n=t[0]??"list",o=async r=>{let s=Ga(Va(),".cortex","api-token"),i="";try{i=Ka(s,"utf-8").trim()}catch{}let a={Accept:"application/json"};i&&(a.Authorization=`Bearer ${i}`);let l=await fetch(`http://localhost:${e.dashboardPort}${r}`,{headers:a});if(l.status===401&&(console.log(x.red(" Unauthorized. Check ~/.cortex/api-token")),process.exit(1)),!l.ok)throw new Error(`API ${l.status}: ${l.statusText}`);return l.json()};try{if(n==="list"){let r=await o("/api/agents");if(r.length===0){console.log(x.dim(`
77
79
  No active agents.
78
80
  `));return}console.log(""),console.log(x.bold(` Active agents: ${r.length}`)),console.log("");for(let s of r){let i=s.type==="main"?x.green("[main]"):s.type==="subagent"?x.blue("[subagent]"):s.type==="teammate"?x.magenta("[teammate]"):x.dim("[unknown]"),a=s.conversationId.slice(0,12),l=x.dim(s.model),g=x.dim(`${s.requestCount} req`),d=s.teamName?x.dim(` team:${s.teamName}`):"",u=s.teamRole?x.dim(` role:${s.teamRole}`):"";console.log(` ${i} ${a} ${l} ${g}${d}${u}`)}console.log("");return}if(n==="topology"){let r=await o("/api/agents/topology"),s=r.sessions??[],i=r.unlinked??[],a=r.ambiguityLevel??"none";if(console.log(""),console.log(x.bold(" Session topology")+x.dim(` (ambiguity: ${a})`)),console.log(""),s.length===0&&i.length===0){console.log(x.dim(` No active sessions.
79
- `));return}for(let l of s){let g=l.agent,d=g.conversationId.slice(0,12),u=x.dim(g.model),c=x.dim(`${g.requestCount} req`);console.log(` ${x.green("\u25BC")} ${d} \u2014 ${x.green("main")} ${u} \u2014 ${c}`);let h=l.teams??[];for(let b of h){console.log(` ${x.magenta("\u25BC")} Team: ${x.magenta(b.name)}`);let y=b.members??[];for(let j of y){let B=j.agent,E=j.parentLink?.confidence==="inferred"?x.dim("\u254C\u254C"):"\u2500\u2500",J=B.conversationId.slice(0,12),m=x.dim(B.model),w=B.teamRole?x.dim(` (${B.teamRole})`):"";console.log(` ${E} ${J} ${m}${w}`)}}let f=l.subagents??[];if(f.length>0){console.log(` ${x.blue("\u25BC")} Subagents`);for(let b of f){let y=b.agent,B=b.parentLink?.confidence==="inferred"?x.dim("\u254C\u254C"):"\u2500\u2500",S=y.conversationId.slice(0,12),E=x.dim(y.model);console.log(` ${B} ${S} ${E}`)}}}if(i.length>0){console.log(` ${x.yellow("Unlinked:")}`);for(let l of i){let g=l.conversationId.slice(0,12);console.log(` ${x.dim(g)} ${x.dim(l.model)}`)}}console.log("");return}if(n==="history"){let r=await o("/api/agents/history");if(r.length===0){console.log(x.dim(`
81
+ `));return}for(let l of s){let g=l.agent,d=g.conversationId.slice(0,12),u=x.dim(g.model),c=x.dim(`${g.requestCount} req`);console.log(` ${x.green("\u25BC")} ${d} \u2014 ${x.green("main")} ${u} \u2014 ${c}`);let m=l.teams??[];for(let b of m){console.log(` ${x.magenta("\u25BC")} Team: ${x.magenta(b.name)}`);let y=b.members??[];for(let j of y){let B=j.agent,E=j.parentLink?.confidence==="inferred"?x.dim("\u254C\u254C"):"\u2500\u2500",J=B.conversationId.slice(0,12),p=x.dim(B.model),w=B.teamRole?x.dim(` (${B.teamRole})`):"";console.log(` ${E} ${J} ${p}${w}`)}}let h=l.subagents??[];if(h.length>0){console.log(` ${x.blue("\u25BC")} Subagents`);for(let b of h){let y=b.agent,B=b.parentLink?.confidence==="inferred"?x.dim("\u254C\u254C"):"\u2500\u2500",S=y.conversationId.slice(0,12),E=x.dim(y.model);console.log(` ${B} ${S} ${E}`)}}}if(i.length>0){console.log(` ${x.yellow("Unlinked:")}`);for(let l of i){let g=l.conversationId.slice(0,12);console.log(` ${x.dim(g)} ${x.dim(l.model)}`)}}console.log("");return}if(n==="history"){let r=await o("/api/agents/history");if(r.length===0){console.log(x.dim(`
80
82
  No agent history.
81
- `));return}console.log(""),console.log(x.bold(` Agent history: ${r.length} entries`)),console.log("");for(let s of r){let i=s.agent,a=i.conversationId.slice(0,12),l=x.dim(i.type),g=x.dim(`(${s.reason})`);console.log(` ${a} ${l} ${g}`)}console.log("");return}if(n==="detail"){let r=t[1];if(!r){console.log(x.red(" Usage: cortex agents detail <conversationId>"));return}let s=await o(`/api/agents/${encodeURIComponent(r)}`),i=s.agent,a=s.parentLink;console.log(""),console.log(x.bold(` Agent: ${i.conversationId}`)),console.log(x.dim(` Type: ${i.type}`)),console.log(x.dim(` Model: ${i.model}`)),console.log(x.dim(` Requests: ${i.requestCount}`)),console.log(x.dim(` First seen: ${new Date(i.firstSeenAt).toLocaleString()}`)),console.log(x.dim(` Last seen: ${new Date(i.lastSeenAt).toLocaleString()}`)),i.teamName&&console.log(x.dim(` Team: ${i.teamName}`)),i.teamRole&&console.log(x.dim(` Role: ${i.teamRole}`)),a&&(console.log(x.dim(` Parent: ${a.parentAgentId}`)),console.log(x.dim(` Link: ${a.method} (${a.confidence})`))),console.log("");return}console.log(x.red(` Unknown subcommand: ${n}`)),console.log(x.dim(" Usage: cortex agents [list|topology|history|detail <id>]"))}catch{console.log(""),console.log(x.yellow(" Could not reach Cortex daemon.")),console.log(x.dim(" Is it running? Try: cortex start")),console.log("")}}};var D=Nt();D.register(Ft);D.register(Mo);D.register(jo);D.register(er);D.register(_o);D.register(Ar);D.register(qo);D.register(Ho);D.register(Qo);D.register($r);D.register(Mr);D.run(process.argv).catch(t=>{console.error("Fatal:",t),process.exit(1)});
83
+ `));return}console.log(""),console.log(x.bold(` Agent history: ${r.length} entries`)),console.log("");for(let s of r){let i=s.agent,a=i.conversationId.slice(0,12),l=x.dim(i.type),g=x.dim(`(${s.reason})`);console.log(` ${a} ${l} ${g}`)}console.log("");return}if(n==="detail"){let r=t[1];if(!r){console.log(x.red(" Usage: cortex agents detail <conversationId>"));return}let s=await o(`/api/agents/${encodeURIComponent(r)}`),i=s.agent,a=s.parentLink;console.log(""),console.log(x.bold(` Agent: ${i.conversationId}`)),console.log(x.dim(` Type: ${i.type}`)),console.log(x.dim(` Model: ${i.model}`)),console.log(x.dim(` Requests: ${i.requestCount}`)),console.log(x.dim(` First seen: ${new Date(i.firstSeenAt).toLocaleString()}`)),console.log(x.dim(` Last seen: ${new Date(i.lastSeenAt).toLocaleString()}`)),i.teamName&&console.log(x.dim(` Team: ${i.teamName}`)),i.teamRole&&console.log(x.dim(` Role: ${i.teamRole}`)),a&&(console.log(x.dim(` Parent: ${a.parentAgentId}`)),console.log(x.dim(` Link: ${a.method} (${a.confidence})`))),console.log("");return}console.log(x.red(` Unknown subcommand: ${n}`)),console.log(x.dim(" Usage: cortex agents [list|topology|history|detail <id>]"))}catch{console.log(""),console.log(x.yellow(" Could not reach Cortex daemon.")),console.log(x.dim(" Is it running? Try: cortex start")),console.log("")}}};var D=Wt();D.register(Jt);D.register(Jo);D.register(zo);D.register(pr);D.register(Qo);D.register(qr);D.register(tr);D.register(or);D.register(mr);D.register(Mt);D.register(Ur);D.run(process.argv).catch(t=>{console.error("Fatal:",t),process.exit(1)});
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.9",
4
4
  "description": "Transparent API proxy that makes LLM coding agents smarter",
5
5
  "type": "module",
6
6
  "license": "BSL-1.1",