@ai-cortex/daemon 0.1.5 → 0.1.6
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.
- package/dist/index.js +13 -13
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ var jr=Object.defineProperty;var C=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{f
|
|
|
14
14
|
updated_at TEXT DEFAULT (datetime('now'))
|
|
15
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
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
|
|
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 p=1568/Math.max(a,l);a=Math.round(a*p),l=Math.round(l*p)}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
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}
|
|
19
19
|
|
|
20
20
|
[... ${a} tokens omitted \u2014 ${l}]
|
|
@@ -24,24 +24,24 @@ ${r.length>16e3?r.slice(0,16e3)+`
|
|
|
24
24
|
[truncated]`:r}
|
|
25
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
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),
|
|
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)&<(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)+`
|
|
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),p=n.featureOverlap/(60+c.rank)+n.semantic/(60+h.rank);return{entry:u,score:p,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(y=>{let f=y.name??y.alias,j=y.agentType??y.type,B=y.model,S;return typeof y.prompt=="string"&&y.prompt.length>0?S=y.prompt.slice(0,200):j&&(S=Es(e,j)),{alias:f,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(y=>y.agentId===c):g.find(y=>y.name==="team-lead"),p=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:p})}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)&<(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 y of this.registry.listActive())y.type==="main"&&c.push({conversationId:y.conversationId,lastSeenAt:y.lastSeenAt,cwd:void 0});let h=new Map;for(let y of c){let f=this.registry.get(y.conversationId);f?.requestHistory?.length&&h.set(y.conversationId,f.requestHistory)}let p=ee(e.system);u=Rn(d.info,{activeMains:c,knownTeams:this.knownTeams,recentSnapshots:h,config:this.config.agentTracking},p),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 p=-1;for(let f=s.length-1;f>=0;f--)if(s[f].role==="user"){p=f;break}let y={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:p===-1?i.length-1:p,content:l[0].entry.content,brainEntryTitle:l[0].entry.title,confidence:l[0].score}]:[]],tokensBefore:c,tokensAfter:c-h};e.pushSnapshot(y,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),p=c?"exact":"estimated";this.state.updateTokenEstimate(h),r="prune";let y=a,f=0,j=[];if(d("pruning")){let v=sn(a,this.config.pruneThresholdTokens);y=v.messages,f=v.tokensSaved,j=v.pruneOps}let B=h-f;this.events?.emitEvent({type:"prune:complete",requestId:o,tokensBefore:h,tokensAfter:B,tokensSaved:f,prunedBlocks:j.length,tokenSource:p}),r="fingerprint";let S=null;if(d("fingerprinting")){let v=Date.now(),ne=3e4,oe=pn(y),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=y,m=!1,w=f>0?"pruned":"passthrough";d("injection")&&E.length>0&&E[0].score>this.config.injectionConfidenceThreshold&&!Gt(h,l.model??"unknown",this.config.contextPressureThreshold)&&(J=cn(y,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,y,J,j,E,m,o,n,h,f),r="rebuild";let k=f>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:f,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
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=[],
|
|
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=[],p=!1,y=0;d.on("data",f=>{p||(c.push(f),y+=f.length,y>65536&&(p=!0,c.length=0)),e.write(f)}),d.on("end",()=>{if(e.writableEnded||e.end(),!p&&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 p=JSON.parse(h.toString());typeof p.input_tokens=="number"&&tn(c,p.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 y=(c.score>.9?M.green:M.dim)(c.score.toFixed(3)),f=u[h]??"?";h===0?o.push(`${r} ${M.blue(Z("MATCH"))}${f} ${c.title} (${y})`):o.push(`${r} ${f} ${c.title} (${y})`)})}}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
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)}
|
|
32
32
|
|
|
33
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)}
|
|
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(`
|
|
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??"/",p=u.method??"GET",y=new URL(h,`http://${u.headers.host||"localhost"}`),f=y.pathname;if(c.setHeader("Access-Control-Allow-Origin","null"),c.setHeader("X-Content-Type-Options","nosniff"),f.startsWith("/api/")){let m=u.headers.authorization,w=m?.startsWith("Bearer ")?m.slice(7):null,k=y.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(p==="GET"&&f==="/"){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(p==="GET"&&f==="/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(p==="GET"&&f==="/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(p==="GET"&&f==="/api/logs/stream"){bo(u,c,l);return}if(p==="GET"&&f==="/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(p==="GET"&&f==="/api/features"){N(c,{features:n.list()});return}let j=f.match(/^\/api\/features\/([a-zA-Z]+)\/toggle$/);if(p==="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(p==="GET"&&f==="/api/pipeline/live"){bo(u,c,a);return}if(p==="GET"&&f==="/api/agents"){s?N(c,{agents:s.listActive(),enabled:!0}):N(c,{agents:[],enabled:!1});return}if(p==="GET"&&f==="/api/agents/topology"){s?N(c,{...s.getTopology(),enabled:!0}):N(c,{version:2,sessions:[],unlinked:[],ambiguityLevel:"none",mainSessions:[],orphanSubagents:[],enabled:!1});return}if(p==="GET"&&f==="/api/agents/history"){s?N(c,{history:s.listHistory(),enabled:!0}):N(c,{history:[],enabled:!1});return}let B=f.match(/^\/api\/agents\/([^/]+)$/);if(p==="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=f.match(/^\/api\/agents\/([^/]+)\/requests$/);if(p==="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=f.match(/^\/api\/agents\/([^/]+)\/requests\/(\d+)$/);if(p==="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=f.match(/^\/api\/agents\/([^/]+)\/uncap-history$/);if(p==="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(p==="GET"&&f==="/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,p)=>{g.once("error",p),g.listen(o.dashboardPort,"127.0.0.1",()=>{g.removeListener("error",p),console.log("[cortex] API token: ~/.cortex/api-token"),d=setInterval(()=>{l()},3e4),h()})})}function c(){return new Promise((h,p)=>{d&&(clearInterval(d),d=null),g.close(y=>{y?p(y):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(p,y)=>{let f=await d.processRequest(p);return{body:f.body,modified:f.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
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
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
|
|
41
|
-
`));let
|
|
42
|
-
`));let
|
|
43
|
-
`)),console.log(
|
|
44
|
-
`));let
|
|
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 b 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}let n=b.cyan,o=b.magenta,r=b.dim,s=b.white;console.log(n(" ")),console.log(n(" ")+o(" @@@@@@@@ ")),console.log(n(" ")+o(" @@")+s("////////")+o("@@ ")),console.log(n(" ")+o("@@")+s("//")+o("@@@@")+s("//")+o("@@@@")),console.log(n(" ")+o("@@")+s("/")+o("@@ @@")+s("/")+o("@@ @@")),console.log(n(" ")+o("@@")+s("/")+o("@@ @@")+s("/")+o("@@ @@")+n(" ")+s("C O R T E X")),console.log(n(" ")+o("@@")+s("//")+o("@@@@")+s("//")+o("@@@@")+n(" ")+r(`v${e}`)),console.log(n(" ")+o(" @@")+s("////////")+o("@@ ")),console.log(n(" ")+o(" @@@@@@@@ ")),console.log(n(" ")+o(" ")+r("||||")),console.log(n(" ")+o(" ")+r("||||")),console.log(""),console.log(r(" Makes your AI coding agents smarter. Sits between")),console.log(r(" your agent and the API, injecting relevant knowledge")),console.log(r(" from your brain directory into every conversation.")),console.log(""),console.log(b.bold(`Step 1: Prerequisites
|
|
41
|
+
`));let i=R(),a=await be(i);for(;!a.passed;)console.log(""),console.log(b.red("Some checks failed. Please fix the issues above.")),await Tt("Fix and retry?")||(console.log("Setup aborted."),process.exit(1)),a=await be(i);console.log(""),console.log(b.bold(`Step 2: Configuration
|
|
42
|
+
`));let l=await Xe(" Proxy port [9090]: ","9090"),g=await Xe(" Target API URL [https://api.anthropic.com]: ","https://api.anthropic.com"),d=await Xe(" Brain directory [./brain/entries]: ","./brain/entries");console.log("");let u=Ce(Ji(),".cortex");Fo(u)||qi(u,{recursive:!0});let c={proxyPort:Number(l),targetBaseUrl:g,brainDir:d},h=Ce(u,"config.yaml");Ui(h,zi(c),"utf-8"),console.log(b.green(` \u2713 Config written to ${h}`)),console.log(""),console.log(b.bold(`Step 3: Model Download
|
|
43
|
+
`)),console.log(b.dim(" Downloading embedding model (~130MB, first time only)..."));let p=Date.now();if(await Ie(Ce(u,"models")),console.log(b.green(` \u2713 Model ready in ${((Date.now()-p)/1e3).toFixed(1)}s`)),console.log(""),Fo(d)){let f=dt(d);console.log(b.green(` \u2713 ${f.length} brain entries found`))}else console.log(b.yellow(" \u26A0 Brain directory does not exist yet \u2014 create it later"));console.log(""),console.log(b.bold(`Step 4: Claude Code Integration
|
|
44
|
+
`));let y=Je();y?(console.log(b.green(" \u2713 Claude Code detected")),console.log(""),await Tt(" Route Claude Code through Cortex automatically?")?(xe({env:{ANTHROPIC_BASE_URL:`http://localhost:${l}`}}),console.log(b.green(" \u2713 ANTHROPIC_BASE_URL set in Claude Code settings")),console.log(b.dim(" Takes effect on next Claude Code session."))):(console.log(b.dim(" Skipped. You can set it manually later:")),console.log(b.dim(` export ANTHROPIC_BASE_URL=http://localhost:${l}`))),console.log(""),await Tt(" Show Cortex status in Claude Code's status line?")?(xe({statusLine:{type:"command",command:"cortex-statusline",padding:1}}),console.log(b.green(" \u2713 Status line configured")),console.log(b.dim(" Takes effect on next Claude Code session."))):(console.log(b.dim(" Skipped. You can add it anytime:")),console.log(b.dim(" Run /statusline cortex-statusline in Claude Code")))):(console.log(b.dim(" Claude Code not detected (~/.claude/ not found).")),console.log(b.dim(" You can configure it manually after installing Claude Code."))),console.log(""),console.log(b.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(b.green.bold(" \u2713 Setup complete!")),console.log(b.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(b.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(b.bold(" Getting started")),console.log(""),console.log(` ${b.cyan("cortex start")} Start in foreground (see live output)`),console.log(` ${b.cyan("cortex start -d")} Start as background daemon`),console.log(` ${b.cyan("cortex stop")} Stop the daemon`),console.log(` ${b.cyan("cortex status")} Check if Cortex is running`),console.log(""),console.log(b.bold(" Managing your brain")),console.log(""),console.log(` ${b.cyan("cortex brain list")} List all brain entries`),console.log(` ${b.cyan("cortex brain search")} Search for entries by keyword`),console.log(` ${b.cyan("cortex brain import")} Import entries from a directory`),console.log(` ${b.cyan("cortex brain sources")} Manage knowledge sources`),console.log(""),console.log(b.dim(" Brain entries are Markdown files with YAML frontmatter.")),console.log(b.dim(" Drop them in your brain directory and Cortex picks them up.")),console.log(""),console.log(b.bold(" Other commands")),console.log(""),console.log(` ${b.cyan("cortex features list")} See which features are on/off`),console.log(` ${b.cyan("cortex logs")} View recent activity`),console.log(` ${b.cyan("cortex logs --follow")} Stream live activity`),console.log(` ${b.cyan("cortex config show")} Show current configuration`),console.log(` ${b.cyan("cortex setup")} Run this wizard again`),console.log(""),console.log(b.bold(" Quick start")),console.log(""),y?(console.log(` ${b.white("cortex claude")} Start Cortex + launch Claude Code`),console.log(""),console.log(b.dim(" Or separately:")),console.log(` ${b.white("cortex start -d")} Start daemon in background`),console.log(` ${b.white("claude")} Claude Code (already wired in)`),console.log("")):(console.log(` 1. ${b.white("cortex start -d")}`),console.log(` 2. ${b.white(`export ANTHROPIC_BASE_URL=http://localhost:${l}`)}`),console.log(` 3. ${b.white("Start your AI agent as usual")}`),console.log("")),console.log(b.dim(` Dashboard: http://localhost:${i.dashboardPort}`)),console.log(""),console.log(b.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
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
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
|
|
47
47
|
`),e=e.replace(/<h2[^>]*>(.*?)<\/h2>/gi,`## $1
|
|
@@ -57,9 +57,9 @@ ${r.length>16e3?r.slice(0,16e3)+`
|
|
|
57
57
|
${et.bold(i.name)} \u2014 ${i.description}`),console.log(`
|
|
58
58
|
Usage: ${i.usage}
|
|
59
59
|
`);return}await i.run(a)}return{register:e,run:n}}import Y from"chalk";var Ft={name:"help",description:"Show this help",usage:"cortex help",run:async()=>{console.log(""),console.log(Y.bold("Cortex")+Y.dim(" \u2014 makes your AI coding agents smarter")),console.log(""),console.log(Y.bold("Usage:")),console.log(" cortex Start Cortex (foreground)"),console.log(" cortex claude Start Cortex + launch Claude Code"),console.log(" cortex <command> Run a specific command"),console.log(""),console.log(Y.bold("Commands:")),console.log(" start [-d] [--port N] Start daemon (foreground, or -d for background)"),console.log(" claude Start Cortex + launch Claude Code"),console.log(" stop Stop the running daemon"),console.log(" status Show daemon status"),console.log(" setup Interactive setup wizard"),console.log(" brain Manage brain entries and sources"),console.log(" features Enable/disable features"),console.log(" logs View session logs"),console.log(" config Show/edit configuration (try: cortex config edit)"),console.log(" help Show this help"),console.log(""),console.log(Y.bold("Quick start:")),console.log(Y.dim(" cortex setup First-time setup (ports, model, Claude Code integration)")),console.log(Y.dim(" cortex claude Start everything and launch Claude Code")),console.log(""),console.log(Y.dim('Run "cortex <command> --help" for details on a specific command.')),console.log("")}};import{spawn as ji}from"node:child_process";import{fileURLToPath as Bi}from"node:url";import{dirname as Ii,join as Ni}from"node:path";import Ct from"chalk";import{readFileSync as Nr,writeFileSync as Fr,unlinkSync as Or}from"node:fs";import{join as Lr}from"node:path";import{homedir as _r,platform as Dr}from"node:os";var tt=Lr(_r(),".cortex","cortex.pid");function ue(t){let e={encoding:"utf-8"};Dr()!=="win32"&&(e.mode=384),Fr(tt,String(t),e)}function qr(){try{let t=Nr(tt,"utf-8").trim(),e=Number(t);return Number.isFinite(e)?e:null}catch{return null}}function Ee(t){try{return process.kill(t,0),!0}catch{return!1}}function L(){let t=qr();return t===null?{running:!1,pid:null}:Ee(t)?{running:!0,pid:t}:(de(),{running:!1,pid:null})}function de(){try{Or(tt)}catch{}}import{createHmac as Ae}from"node:crypto";import{existsSync as Lt,readFileSync as Ur,writeFileSync as Hr,mkdirSync as Wr}from"node:fs";import{join as _t}from"node:path";import{homedir as Dt}from"node:os";import Ot from"chalk";var nt=_t(Dt(),".cortex"),ot=_t(nt,"license"),Pe="cx-v1-2026";function Jr(){let t=Ut(),e=Ht(t);return`CX-${t}-${e}`}function zr(){if(!Lt(ot))return Kr();try{let t=Ur(ot,"utf-8").trim();return Xr(t)}catch{return!1}}function qt(){zr()||(console.error(Ot.red("Invalid or corrupted license.")),console.error(Ot.dim("Run `cortex setup` to reactivate, or contact support.")),process.exit(1))}function Kr(){try{Lt(nt)||Wr(nt,{recursive:!0});let t=Jr();return Hr(ot,t+`
|
|
60
|
-
`,"utf-8"),!0}catch{return!1}}function Ut(){let t=`${Dt()}:${process.platform}:${process.arch}`;return Ae("sha256",Pe).update(t).digest("hex").slice(0,12)}function Ht(t){return Ae("sha256",Pe+"-sig").update(t).digest("hex").slice(0,16)}function Xr(t){let e=t.split("-");if(e.length!==3||e[0]!=="CX")return!1;let[,n,o]=e;if(n!==Ut())return!1;let r=Ht(n);if(o.length!==r.length)return!1;let s=Buffer.from(o),i=Buffer.from(r);return s.length===i.length&&Ae("sha256",Pe).update(s).digest().equals(Ae("sha256",Pe).update(i).digest())}var Mo={name:"start",description:"Start the Cortex daemon",usage:"cortex start [-d] [--port N]",run:async t=>{qt();let{running:e,pid:n}=L();if(e){console.log(Ct.yellow(`Cortex is already running (PID ${n}).`));return}let o=t.includes("-d")||t.includes("--daemon"),r=t.indexOf("--port"),s=r!==-1?t[r+1]:void 0;if(o){let i=Ii(Bi(import.meta.url)),a=Ni(i,"../start.js"),g=process.argv.some(c=>/(?:^|[\\/])tsx(?:[\\/.]|$)/.test(c))?["--import","tsx",a]:[a],d={...process.env};s&&(d.CORTEX_PORT=s);let u=ji(process.execPath,g,{detached:!0,stdio:"ignore",env:d});u.unref(),u.pid?(ue(u.pid),console.log(Ct.green(`Cortex daemon started (PID ${u.pid}).`))):(console.log(Ct.red("Failed to start daemon.")),process.exit(1))}else{s&&(process.env.CORTEX_PORT=s),ue(process.pid);try{let{startCortex:i}=await Promise.resolve().then(()=>($o(),Ro));await i()}finally{de()}}}};import wt from"chalk";var jo={name:"stop",description:"Stop the running daemon",usage:"cortex stop",run:async()=>{let{running:t,pid:e}=L();if(!t||e===null){console.log(wt.yellow("Cortex is not running."));return}console.log(wt.dim(`Stopping Cortex (PID ${e})...`));try{process.kill(e,"SIGTERM")}catch{}let n=5e3,o=200,r=0;for(;r<n&&Ee(e);)await new Promise(s=>setTimeout(s,o)),r+=o;if(Ee(e)){try{process.kill(e,"SIGKILL")}catch{}await new Promise(s=>setTimeout(s,300))}de(),console.log(wt.green("Cortex stopped."))}};var _o={name:"setup",description:"Interactive setup wizard",usage:"cortex setup",run:async()=>{let{runWizard:t}=await Promise.resolve().then(()=>(kt(),Lo));await t()}};q();mt();import U from"chalk";var Do=["pruning","injection","fingerprinting","matching","logging","dashboard","verbose","agentTracking"],qo={name:"features",description:"Enable/disable Cortex features",usage:"cortex features <list|enable|disable> [name]",run:async t=>{let e=t[0]??"list",n=R(),o=new ae(n);if(e==="list"){console.log(""),console.log(U.bold("Feature Status Notes")),console.log(U.dim("\u2500".repeat(45)));for(let r of o.list()){let s=r.enabled?U.green("\u2713 ON "):U.red("\u2717 OFF"),i=r.reason?U.dim(` (${r.reason})`):"";console.log(` ${r.name.padEnd(16)} ${s}${i}`)}console.log("");return}if(e==="enable"||e==="disable"){let r=t[1];(!r||!Do.includes(r))&&(console.log(U.red(`Invalid feature. Valid: ${Do.join(", ")}`)),process.exit(1)),e==="enable"?(o.enable(r),console.log(U.green(`Feature "${r}" enabled.`))):(o.disable(r),console.log(U.green(`Feature "${r}" disabled.`)));let{running:s}=L();if(s)try{await fetch(`http://localhost:${n.dashboardPort}/api/features/${r}/toggle`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({enabled:e==="enable"})})}catch{console.log(U.dim("(Daemon not reachable \u2014 config saved, will apply on next start.)"))}return}console.log(U.red(`Unknown subcommand: ${e}`)),console.log(U.dim("Usage: cortex features <list|enable|disable> [name]"))}};import{readdirSync as Ki,readFileSync as Xi}from"node:fs";import{join as Uo}from"node:path";import H from"chalk";q();var Ho={name:"logs",description:"View session logs",usage:"cortex logs [-n N] [--json] [--follow]",run:async t=>{let e=t.includes("--json"),n=t.includes("--follow"),o=t.indexOf("-n"),r=o!==-1?Number(t[o+1]):20,s=R(),i=Uo(s.dataDir,"logs");if(n){let{running:d}=L();if(d){let u=new AbortController;process.once("SIGINT",()=>u.abort()),process.once("SIGTERM",()=>u.abort());try{let c=await fetch(`http://localhost:${s.dashboardPort}/api/logs/stream`,{signal:u.signal});if(c.body){let h=c.body.getReader(),
|
|
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(),p=new TextDecoder;for(;;){let{done:y,value:f}=await h.read();if(y)break;process.stdout.write(p.decode(f))}}}catch(c){if(c.name==="AbortError")console.log(H.dim(`
|
|
61
61
|
Stream closed.`));else{console.log(H.yellow("Stream failed. Use without --follow to read log files."));return}}return}console.log(H.yellow("Daemon not running. Use without --follow to read log files."));return}let a;try{a=Ki(i).filter(d=>d.endsWith(".jsonl")).sort()}catch{console.log(H.dim("No log files found."));return}if(a.length===0){console.log(H.dim("No log files found."));return}let l=[];for(let d=a.length-1;d>=0&&l.length<r;d--){let u=Uo(i,a[d]),c=Xi(u,"utf-8").trim().split(`
|
|
62
|
-
`).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
|
+
`).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"),p=u.processingTimeMs?`${u.processingTimeMs}ms`:"",y=u.topMatchEntry?H.cyan(u.topMatchEntry):"";console.log(` ${H.dim(c)} #${u.requestCount??"?"} ${h} ${y} ${H.dim(p)}`)}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 p=e.brainSources.map(m=>{let w=r.getField(`brain.${m.name}`);return w?{...m,enabled:w.value}:m}),y=s.getField("pruneThresholdTokens").value,f=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:p,pruneThresholdTokens:y,injectionConfidenceThreshold:f,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 p of n){let y=Ye(p),f=Math.max(0,r-1-y.length);s.push($.cyan(" \u2502")+p+" ".repeat(f)+$.cyan("\u2502"))}s.push($.cyan(" \u2502")+" ".repeat(r-1)+$.cyan("\u2502"));let l=Yi(o),g=Ye(l).length,d=Math.max(0,r-1-g);s.push($.cyan(" \u2502")+l+" ".repeat(d)+$.cyan("\u2502"));let u=$.dim(` Tip: ${Zi}`),c=Ye(u).length,h=Math.max(0,r-1-c);return s.push($.cyan(" \u2502")+u+" ".repeat(h)+$.cyan("\u2502")),s.push($.cyan(" \u2514"+"\u2500".repeat(r-1)+"\u2518")),s}function Yo(t){return new Promise(e=>{let n=0;if(!process.stdin.isTTY){console.log(Go.red("Interactive config requires a TTY terminal.")),e({saved:!1});return}process.stdin.setRawMode(!0),Vo.emitKeypressEvents(process.stdin);function o(){let i=t[n],a=i.render(),l=t.map(u=>u.name),g=i.focusedField?.editing??!1,d=Xo(l,n,a,g);process.stdout.write("\x1B[2J\x1B[H"),process.stdout.write(d.join(`
|
|
63
63
|
`)+`
|
|
64
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=`
|
|
65
65
|
Add-Type -AssemblyName System.Windows.Forms
|
|
@@ -76,6 +76,6 @@ if ($dialog.ShowDialog() -eq 'OK') { $dialog.SelectedPath }
|
|
|
76
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(`
|
|
77
77
|
No active agents.
|
|
78
78
|
`));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
|
|
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 y of h){console.log(` ${x.magenta("\u25BC")} Team: ${x.magenta(y.name)}`);let f=y.members??[];for(let j of f){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 p=l.subagents??[];if(p.length>0){console.log(` ${x.blue("\u25BC")} Subagents`);for(let y of p){let f=y.agent,B=y.parentLink?.confidence==="inferred"?x.dim("\u254C\u254C"):"\u2500\u2500",S=f.conversationId.slice(0,12),E=x.dim(f.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
80
|
No agent history.
|
|
81
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)});
|