@vpxa/aikit 0.1.393 → 0.1.395

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.
@@ -1,23 +1,23 @@
1
- import{t as e}from"./curated-manager-D4MOFQ-t.js";import{A as t,B as n,C as r,E as i,F as a,G as o,H as s,I as c,J as l,K as u,L as d,N as f,O as p,P as m,R as h,S as g,T as _,U as v,V as y,W as b,_ as x,b as S,c as C,d as w,g as T,h as E,i as ee,j as te,k as D,l as ne,o as re,p as ie,q as O,r as ae,v as oe,y as se,z as ce}from"./startup-maintenance-QrloHssd.js";import{createRequire as le}from"node:module";import{fileURLToPath as ue}from"node:url";import{promisify as de}from"node:util";import{AIKIT_GLOBAL_PATHS as fe,AIKIT_RUNTIME_PATHS as pe,CONTENT_TYPES as me,CircuitBreaker as he,HealthBus as ge,KNOWLEDGE_ORIGINS as _e,SOURCE_TYPES as ve,TOKEN_BUDGETS as ye,computePartitionKey as be,createLogger as k,getGlobalDataDir as xe,getPartitionDir as Se,hashPath as Ce,isUserInstalled as we,listWorkspaces as Te,safeCwd as A,safeCwdOrHome as Ee,serializeError as j}from"../../core/dist/index.js";import{copyFileSync as De,existsSync as M,mkdirSync as Oe,readFileSync as N,readdirSync as ke,renameSync as Ae,rmSync as je,statSync as Me,unlinkSync as Ne,writeFileSync as Pe}from"node:fs";import{basename as Fe,dirname as Ie,isAbsolute as Le,join as P,relative as Re,resolve as F,sep as ze}from"node:path";import{mkdir as Be,readFile as Ve,readdir as He,rm as Ue,stat as We,unlink as Ge,writeFile as Ke}from"node:fs/promises";import{createHash as qe,randomBytes as Je,randomUUID as Ye,timingSafeEqual as Xe}from"node:crypto";import{RUNTIME_SLUG_RE as Ze,WORKSPACE_SKILL_FILENAME as Qe,acquireLease as $e,addToWorkset as et,audit as tt,bookendReorder as nt,buildNodeNameMap as rt,changelog as it,check as at,checkpointDiff as ot,checkpointGC as st,checkpointHistory as ct,checkpointLatest as lt,checkpointList as ut,checkpointLoad as dt,checkpointSave as ft,codemod as pt,compressTerminalOutput as mt,computeSourceHash as ht,containsRawObservationNoise as gt,containsTruncationComments as _t,createRestorePoint as vt,createSearchSuccessResponse as yt,delegate as bt,delegateListModels as xt,deleteWorkset as St,diffParse as Ct,digest as wt,envInfo as Tt,evaluate as Et,evidenceMap as Dt,fileSummaryTool as Ot,find as kt,findExamples as At,forgeGround as jt,generateFlowBriefing as Mt,generateWorkspaceSkill as Nt,getRefTelemetry as Pt,getWorkset as Ft,gitContext as It,graphAugmentSearch as Lt,graphQuery as Rt,isSkillStale as zt,laneCreate as Bt,laneDiff as Vt,laneDiscard as Ht,laneList as Ut,laneMerge as Wt,laneStatus as Gt,listActiveLeases as Kt,listRestorePoints as qt,listWorksets as Jt,measure as Yt,normalizeSkillInput as Xt,onboard as Zt,parseOutput as Qt,processList as $t,processLogs as en,processStart as tn,processStatus as nn,processStop as rn,queueClear as an,queueCreate as on,queueDag as sn,queueDelete as cn,queueDone as ln,queueFail as un,queueGet as dn,queueList as fn,queueNext as pn,queuePush as mn,releaseLease as hn,removeFromWorkset as gn,rename as _n,replayClear as vn,replayList as yn,replayTrim as bn,resolveNodeName as xn,resolveSkillDir as Sn,resolveWorkspaceDir as Cn,restoreFromPoint as wn,saveWorkset as Tn,schemaValidate as En,scopeMap as Dn,scoreCompliance as On,sessionDigest as kn,sessionDigestSampling as An,stashClear as jn,stashDelete as Mn,stashGet as Nn,stashList as Pn,stashSet as Fn,storeReversibleContext as In,summarizeCheckResult as Ln,symbol as Rn,testRun as zn,trace as Bn,truncateToTokenBudget as Vn,validateRenderedWorkspaceSkill as Hn,watchList as Un,webFetch as Wn,webSearch as Gn}from"../../tools/dist/index.js";import{exec as Kn,execFile as qn,execSync as Jn}from"node:child_process";import{homedir as Yn,tmpdir as Xn}from"node:os";import{getEngine as Zn,registerBrowserTools as Qn}from"../../browser/dist/index.js";import{ResourceTemplate as $n}from"@modelcontextprotocol/sdk/server/mcp.js";import{BlastRadiusAnalyzer as er,DependencyAnalyzer as tr,DiagramGenerator as nr,EntryPointAnalyzer as rr,KnowledgeProducer as ir,PatternAnalyzer as ar,StructureAnalyzer as or,SymbolAnalyzer as sr}from"../../analyzers/dist/index.js";import{WasmDiagnostics as cr,WasmRuntime as lr}from"../../chunker/dist/index.js";import{z as I}from"zod";import{ERCache as ur,ERClient as dr,PushAdapter as fr,mergeResults as pr}from"../../enterprise-bridge/dist/index.js";import{RESOURCE_MIME_TYPE as mr,getUiCapability as hr,registerAppResource as gr,registerAppTool as _r}from"@modelcontextprotocol/ext-apps/server";import{createStore as vr}from"../../store/dist/index.js";import{buildSnapshot as yr,createOwnerCapability as br,rotateOwnerCapability as xr,validateToken as Sr}from"../../flows/dist/index.js";import{TemplateRegistry as Cr,buildShell as wr,dashboardTemplateDefinition as Tr,defaultRegistry as Er,flameGraphTemplateDefinition as Dr,isError as Or,isResult as kr,kanbanTemplateDefinition as Ar,listSortTemplateDefinition as jr,renderSurface as Mr}from"../../blocks-core/dist/index.mjs";import{createServer as Nr}from"node:http";import"../../tool-routing/dist/index.mjs";const Pr={enabled:!0,batchSize:10,debounceMs:5e3,maxFactsPerSession:50,minQuality:.3};function L(e){return(e.content??[]).filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text??``).join(`
2
- `)}function R(e){return qe(`sha256`).update(e).digest(`hex`).slice(0,16)}function Fr(e){let t=0;return e.length>=50&&(t+=.2),e.length>=150&&(t+=.1),/[a-zA-Z]\w+\.\w+/.test(e)&&(t+=.15),/[:=]|^[-*]|\n[-*]|```/.test(e)&&(t+=.15),/\b(use|should|must|always|never|prefer|avoid|requires?|detected|confirmed|verified)\b/i.test(e)&&(t+=.2),/^(Error|TypeError|ReferenceError):/m.test(e)&&e.length<100&&(t-=.2),Math.max(0,Math.min(1,t))}const Ir={enabled:!0,batchThreshold:20,cooldownMs:3e5,maxCandidatesPerSession:5,initialConfidence:40,excludeTools:[`knowledge`,`replay`,`stash`,`checkpoint`,`session_digest`,`reindex`,`status`,`flow`,`evidence_map`,`present`]},Lr=new Set([`search`,`find`,`symbol`,`grep_search`,`semantic_search`]),Rr=new Set([`replace_string_in_file`,`editfiles`,`create_file`,`apply_patch`]),zr=new Set([`check`,`test_run`]),Br=new Set(`action.and.args.auto.buffer.category.content.create.cwd.false.file.files.find.grep.json.knowledge.list.path.query.read.replace.search.semantic.subaction.symbol.test.tool.true.update`.split(`.`));function Vr(e){let t=e.toLowerCase().match(/[a-z0-9]{2,}/g)??[];return new Set(t)}function Hr(e,t){let n=Vr(e),r=Vr(t);if(n.size===0&&r.size===0)return 1;if(n.size===0||r.size===0)return 0;let i=new Set([...n].filter(e=>r.has(e))),a=new Set([...n,...r]);return i.size/a.size}function Ur(e,t){return e.length<=t?e:`${e.slice(0,Math.max(0,t-1))}...`}function Wr(e){try{return JSON.stringify(e)}catch{return`[unserializable args]`}}function Gr(e){return e.replace(/^mcp_[^_]+_/,``).toLowerCase()}function Kr(e){return[...new Set(e.filter(e=>e.length>0))]}function qr(e,t){return{...t,confidence:Ir.initialConfidence,tags:[`auto-observed`,`detector:${e}`],detector:e}}function Jr(e,t){let n=new Map;for(let t of e)for(let e of Vr(t))Br.has(e)||n.set(e,(n.get(e)??0)+1);let r=[...n.entries()].filter(([,e])=>e>=t).sort((e,t)=>t[1]-e[1]||e[0].localeCompare(t[0])).map(([e])=>e);return r.length>0?r.slice(0,4):[...n.entries()].sort((e,t)=>t[1]-e[1]||e[0].localeCompare(t[0])).slice(0,4).map(([e])=>e)}function Yr(e){return e.length>0?e.join(`, `):`similar tasks`}function Xr(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.ts==`number`&&Number.isFinite(t.ts)&&typeof t.tool==`string`&&typeof t.input==`string`&&(t.output===void 0||typeof t.output==`string`)&&Array.isArray(t.files)&&t.files.every(e=>typeof e==`string`)}function Zr(e){let t=[];for(let n of e)t.some(e=>Hr(e.title,n.title)>.8)||t.push(n);return t}function Qr(e){return typeof e==`string`?[e]:Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function $r(e){return typeof e==`string`?[...e.matchAll(/^\*\*\* (?:Add|Delete|Update) File: (.+)$/gm)].map(e=>e[1]?.trim()??``).filter(Boolean):[]}function ei(e){let t=[],n=e=>{if(!(typeof e!=`object`||!e)){if(Array.isArray(e)){for(let t of e)n(t);return}for(let[r,i]of Object.entries(e))(r===`path`||r===`filePath`||r===`files`)&&t.push(...Qr(i)),n(i)}};return n(e),t.push(...$r(e.input)),Kr(t)}function ti(e){return{tool:e.toolName,input:Ur(Wr(e.args),200),output:Ur(L(e.result),500),files:ei(e.args),ts:Date.now()}}function ni(e){return{title:e.title,content:`${e.context}\n\n${e.insight}\n\nEvidence:\n${e.evidence}`,category:`conventions`,tags:Kr([`auto-observed`,`detector:${e.detector}`,...e.tags]),hash:qe(`sha256`).update(`${e.detector}:${e.title}`).digest(`hex`).slice(0,16),quality:Math.max(0,Math.min(1,e.confidence/100)),source:`behavioral:${e.detector}`}}function ri(e){let t=new Map;for(let n of e){let e=Gr(n.tool),r=t.get(e)??[];r.push(n),t.set(e,r)}return[...t.entries()].filter(([,e])=>e.length>=5).map(([e,t])=>{let n=Yr(Jr(t.map(e=>e.input),Math.max(2,Math.ceil(t.length/2))));return qr(`tool-preference`,{title:`Preferred tool: ${e} for ${n}`,context:`Observed ${t.length} ${e} calls with recurring inputs around ${n}.`,insight:`Use ${e} when working with ${n}.`,evidence:t.slice(0,5).map(e=>`${e.tool}: ${e.input}`).join(`
3
- `)})})}function ii(e){let t=new Map;for(let n=0;n<e.length;n+=1){let r=e[n];if(Lr.has(Gr(r.tool)))for(let i=n+1;i<e.length&&i<=n+5;i+=1){let n=e[i];if(!(!Rr.has(Gr(n.tool))||n.files.length===0))for(let e of Kr(n.files)){let i=t.get(e)??{count:0,queries:[],evidence:[]};i.count+=1,i.queries.push(r.input),i.evidence.push(`${r.tool}: ${r.input} -> ${n.tool}: ${e}`),t.set(e,i)}}}return[...t.entries()].filter(([,e])=>e.count>=3).map(([e,t])=>{let n=Yr(Jr(t.queries,Math.max(2,Math.ceil(t.count/2))));return qr(`search-action`,{title:`Check ${e} when searching for ${n}`,context:`Searches related to ${n} were followed by edits to ${e} ${t.count} times within five tool calls.`,insight:`When working on ${n}, check ${e} early because searches repeatedly led there.`,evidence:t.evidence.slice(0,5).join(`
4
- `)})})}function ai(e){let t=new Map;for(let n=0;n<e.length-2;n+=1){let r=e[n];if(!zr.has(Gr(r.tool)))continue;let i=new Set,a=!1;for(let o=n+1;o<e.length;o+=1){let n=e[o],s=Gr(n.tool);if(Rr.has(s)){a=!0;for(let e of n.files)i.add(e);continue}if(zr.has(s)){if(!a||i.size===0)break;let e=[...i].sort(),o=e.join(`|`),s=t.get(o)??{count:0,evidence:[]};s.count+=1,s.evidence.push(`${r.tool} -> edit(${e.join(`, `)}) -> ${n.tool}`),t.set(o,s);break}if(!a)break}}return[...t.entries()].filter(([,e])=>e.count>=2).map(([e,t])=>{let n=e.split(`|`);return qr(`error-fix-cycle`,{title:`Repeated validation-edit loop in ${n.length===1?n[0]:`${n[0]} and related files`}`,context:`Observed ${t.count} validation cycles touching ${n.join(`, `)}.`,insight:`Common fix pattern in ${n.join(`, `)}: check -> edit -> recheck.`,evidence:t.evidence.slice(0,5).join(`
5
- `)})})}function oi(e){let t=/\b(prefer|rather use|better to|instead of|always use|never use)\b/i,n=e.filter(e=>t.test(e.input));if(n.length<2)return[];let r=Yr(Jr(n.map(e=>e.input),Math.max(2,Math.ceil(n.length/2)))),i=qr(`user-preference`,{title:`User prefers ${r}`,context:`Observed ${n.length} explicit preference expressions about ${r}.`,insight:`User prefers working with ${r}. Default to these patterns.`,evidence:n.slice(0,3).map(e=>`${e.tool}: ${e.input}`).join(`
6
- `)});return i.tags=Kr([...i.tags,`user-preference`,`collaboration`]),[i]}function si(e){let t=/\b(pros? and? cons?|tradeoffs?|alternative|compare|vs\.?|rather than|option|weigh|benefit|drawback)\b/i,n=e.filter(e=>t.test(e.input));if(n.length<2)return[];let r=Yr(Jr(n.map(e=>e.input),Math.max(2,Math.ceil(n.length/2)))),i=qr(`decision-style`,{title:`Considers tradeoffs for ${r}`,context:`Observed ${n.length} decisions involving tradeoff analysis about ${r}.`,insight:`User evaluates alternatives explicitly before choosing. Surface tradeoff comparisons.`,evidence:n.slice(0,3).map(e=>`${e.tool}: ${e.input}`).join(`
7
- `)});return i.tags=Kr([...i.tags,`user-preference`,`decision-style`,`tradeoff`]),[i]}function ci(e,t=Ir){if(!t.enabled||e.length===0)return[];let n=new Set(t.excludeTools.map(e=>e.toLowerCase())),r=e.filter(e=>!n.has(Gr(e.tool)));return Zr([...ri(r),...ii(r),...ai(r),...oi(r),...si(r)].map(e=>({...e,confidence:t.initialConfidence,tags:Kr([`auto-observed`,`detector:${e.detector}`,...e.tags])}))).slice(0,t.maxCandidatesPerSession)}function li(e){return e.split(`
8
- `).filter(Boolean).map(e=>{try{return JSON.parse(e)}catch{return null}}).filter(Xr).map(e=>({...e,output:e.output??``}))}var ui=class{name=`behavioral`;tools=[];buffer=[];eventCounter=0;lastDetectionTs=0;extract(e){if(this.push(ti(e)),this.eventCounter+=1,this.eventCounter%50!=0)return[];let t=Date.now();if(t-this.lastDetectionTs<3e5)return[];let n=ci(this.buffer).map(ni);return this.eventCounter=0,this.lastDetectionTs=t,n}push(e){this.buffer.push(e),this.buffer.length>100&&this.buffer.splice(0,this.buffer.length-100)}};function di(){return new ui}di();const fi={name:`build-commands`,tools:[`check`,`test_run`],extract(e){if(e.isError)return[];let t=L(e.result);if(!t)return[];let n=[];if(e.toolName===`check`){let r=[];if(/typecheck.*(?:pass|success|0 error)/i.test(t)&&r.push(`typecheck`),/lint.*(?:pass|success|no (?:warning|error))/i.test(t)&&r.push(`lint`),/biome.*(?:checked|no fixes)/i.test(t)&&r.push(`biome`),r.length>0){let t=[...r].sort();n.push({title:`Verified checks: ${t.join(`, `)}`,content:`The following checks passed successfully: ${t.join(`, `)}.\nRun with the \`check\` tool to verify code quality.`,category:`conventions`,tags:[`build`,`verified`,`review-gate`,...t],hash:R(`build-checks-${t.join(`,`)}`),quality:.8,source:e.toolName})}}if(e.toolName===`test_run`){let r=t.match(/(\d+)\s*(?:tests?\s+)?pass/i),i=t.match(/(\d+)\s*(?:total|tests)/i),a=t.match(/(\d+)\s*(?:test\s+)?files?/i);if(r){let t=r[1],o=i?.[1]??t,s=a?.[1]??`unknown`;n.push({title:`Test suite summary`,content:`Test results: ${t}/${o} tests passed across ${s} test files.\nUse \`test_run\` tool to execute the test suite.`,category:`context`,tags:[`testing`,`verified`,`test-summary`,`review-gate`],hash:R(`test-summary-${t}-${o}`),quality:.7,source:e.toolName,ttlMs:72e5})}let o=t.match(/(?:running|command|exec):\s*(.+?)$/im);if(o?.[1]){let t=o[1].trim();n.push({title:`Test command: ${t.slice(0,60)}`,content:`Verified test command: \`${t}\`\nThis command successfully ran the project's test suite.`,category:`conventions`,tags:[`testing`,`build-command`,`verified`,`review-gate`],hash:R(`test-cmd-${t}`),quality:.9,source:e.toolName})}}return n}},pi={name:`codebase-insights`,tools:[`analyze`,`scope_map`,`blast_radius`,`onboard`],extract(e){let t=L(e.result);if(!t||t.length<50||e.isError)return[];let n=[];if(e.toolName===`analyze`&&e.args.aspect===`structure`){let r=typeof e.args.path==`string`?e.args.path:`.`,i=t.slice(0,600);n.push({title:`Structure: ${r}`,content:`Project structure analysis for ${r}:\n${i}`,category:`context`,tags:[`architecture`,`structure`,`analysis`,...Math.min(.9,Fr(i)+.2)>=.7?[`architecture-memory`,`invariant`]:[]],hash:R(`structure-${r}`),identityKey:`analyze:structure:${r}`,quality:Math.min(.9,Fr(i)+.2),source:e.toolName})}if(e.toolName===`analyze`&&e.args.aspect===`dependencies`){let r=typeof e.args.path==`string`?e.args.path:`.`,i=t.split(/\r?\n/).filter(e=>/(?:depends on|imports?|requires?|from)\s/i.test(e)).slice(0,10);if(i.length>0){let t=`Dependency analysis for ${r}:\n${i.join(`
1
+ import{t as e}from"./curated-manager-D4MOFQ-t.js";import{A as t,B as n,C as r,E as i,F as a,G as o,H as s,I as c,J as l,K as u,L as d,N as f,O as p,P as m,R as h,S as g,T as _,U as v,V as y,W as b,_ as x,b as S,c as C,d as w,g as T,h as E,i as ee,j as te,k as D,l as ne,o as re,p as ie,q as O,r as ae,v as oe,y as se,z as ce}from"./startup-maintenance-QrloHssd.js";import{createRequire as le}from"node:module";import{fileURLToPath as ue}from"node:url";import{promisify as de}from"node:util";import{AIKIT_GLOBAL_PATHS as fe,AIKIT_RUNTIME_PATHS as pe,CONTENT_TYPES as me,CircuitBreaker as he,HealthBus as ge,KNOWLEDGE_ORIGINS as _e,SOURCE_TYPES as ve,TOKEN_BUDGETS as ye,computePartitionKey as be,createLogger as k,getGlobalDataDir as xe,getPartitionDir as Se,hashPath as Ce,isUserInstalled as we,listWorkspaces as Te,safeCwd as A,safeCwdOrHome as Ee,serializeError as j}from"../../core/dist/index.js";import{copyFileSync as De,existsSync as M,mkdirSync as Oe,readFileSync as N,readdirSync as ke,renameSync as Ae,rmSync as je,statSync as Me,unlinkSync as Ne,writeFileSync as Pe}from"node:fs";import{basename as Fe,dirname as Ie,isAbsolute as Le,join as P,relative as Re,resolve as F,sep as ze}from"node:path";import{mkdir as Be,readFile as Ve,readdir as He,rm as Ue,stat as We,unlink as Ge,writeFile as Ke}from"node:fs/promises";import{createHash as qe,randomBytes as Je,randomUUID as Ye,timingSafeEqual as Xe}from"node:crypto";import{RUNTIME_SLUG_RE as Ze,WORKSPACE_SKILL_FILENAME as Qe,acquireLease as $e,addToWorkset as et,audit as tt,bookendReorder as nt,buildNodeNameMap as rt,changelog as it,check as at,checkpointDiff as ot,checkpointGC as st,checkpointHistory as ct,checkpointLatest as lt,checkpointList as ut,checkpointLoad as dt,checkpointSave as ft,codemod as pt,compressTerminalOutput as mt,computeSourceHash as ht,containsRawObservationNoise as gt,containsTruncationComments as _t,createRestorePoint as vt,createSearchSuccessResponse as yt,delegate as bt,delegateListModels as xt,deleteWorkset as St,diffParse as Ct,digest as wt,envInfo as Tt,evaluate as Et,evidenceMap as Dt,fileSummaryTool as Ot,find as kt,findExamples as At,forgeGround as jt,generateFlowBriefing as Mt,generateWorkspaceSkill as Nt,getRefTelemetry as Pt,getWorkset as Ft,gitContext as It,graphAugmentSearch as Lt,graphQuery as Rt,isSkillStale as zt,laneCreate as Bt,laneDiff as Vt,laneDiscard as Ht,laneList as Ut,laneMerge as Wt,laneStatus as Gt,listActiveLeases as Kt,listRestorePoints as qt,listWorksets as Jt,measure as Yt,normalizeSkillInput as Xt,onboard as Zt,parseOutput as Qt,processList as $t,processLogs as en,processStart as tn,processStatus as nn,processStop as rn,queueClear as an,queueCreate as on,queueDag as sn,queueDelete as cn,queueDone as ln,queueFail as un,queueGet as dn,queueList as fn,queueNext as pn,queuePush as mn,releaseLease as hn,removeFromWorkset as gn,rename as _n,replayClear as vn,replayList as yn,replayTrim as bn,resolveNodeName as xn,resolveSkillDir as Sn,resolveWorkspaceDir as Cn,restoreFromPoint as wn,saveWorkset as Tn,schemaValidate as En,scopeMap as Dn,scoreCompliance as On,sessionDigest as kn,sessionDigestSampling as An,stashClear as jn,stashDelete as Mn,stashGet as Nn,stashList as Pn,stashSet as Fn,storeReversibleContext as In,summarizeCheckResult as Ln,symbol as Rn,testRun as zn,trace as Bn,truncateToTokenBudget as Vn,validateRenderedWorkspaceSkill as Hn,watchList as Un,webFetch as Wn,webSearch as Gn}from"../../tools/dist/index.js";import{exec as Kn,execFile as qn,execSync as Jn,spawn as Yn}from"node:child_process";import{homedir as Xn,tmpdir as Zn}from"node:os";import{getEngine as Qn,registerBrowserTools as $n}from"../../browser/dist/index.js";import{ResourceTemplate as er}from"@modelcontextprotocol/sdk/server/mcp.js";import{BlastRadiusAnalyzer as tr,DependencyAnalyzer as nr,DiagramGenerator as rr,EntryPointAnalyzer as ir,KnowledgeProducer as ar,PatternAnalyzer as or,StructureAnalyzer as sr,SymbolAnalyzer as cr}from"../../analyzers/dist/index.js";import{WasmDiagnostics as lr,WasmRuntime as ur}from"../../chunker/dist/index.js";import{z as I}from"zod";import{ERCache as dr,ERClient as fr,PushAdapter as pr,mergeResults as mr}from"../../enterprise-bridge/dist/index.js";import{RESOURCE_MIME_TYPE as hr,getUiCapability as gr,registerAppResource as _r,registerAppTool as vr}from"@modelcontextprotocol/ext-apps/server";import{createStore as yr}from"../../store/dist/index.js";import{buildSnapshot as br,createOwnerCapability as xr,rotateOwnerCapability as Sr,validateToken as Cr}from"../../flows/dist/index.js";import{TemplateRegistry as wr,buildShell as Tr,dashboardTemplateDefinition as Er,defaultRegistry as Dr,flameGraphTemplateDefinition as Or,isError as kr,isResult as Ar,kanbanTemplateDefinition as jr,listSortTemplateDefinition as Mr,renderSurface as Nr}from"../../blocks-core/dist/index.mjs";import{createServer as Pr}from"node:http";import"../../tool-routing/dist/index.mjs";const Fr={enabled:!0,batchSize:10,debounceMs:5e3,maxFactsPerSession:50,minQuality:.3};function L(e){return(e.content??[]).filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text??``).join(`
2
+ `)}function R(e){return qe(`sha256`).update(e).digest(`hex`).slice(0,16)}function Ir(e){let t=0;return e.length>=50&&(t+=.2),e.length>=150&&(t+=.1),/[a-zA-Z]\w+\.\w+/.test(e)&&(t+=.15),/[:=]|^[-*]|\n[-*]|```/.test(e)&&(t+=.15),/\b(use|should|must|always|never|prefer|avoid|requires?|detected|confirmed|verified)\b/i.test(e)&&(t+=.2),/^(Error|TypeError|ReferenceError):/m.test(e)&&e.length<100&&(t-=.2),Math.max(0,Math.min(1,t))}const Lr={enabled:!0,batchThreshold:20,cooldownMs:3e5,maxCandidatesPerSession:5,initialConfidence:40,excludeTools:[`knowledge`,`replay`,`stash`,`checkpoint`,`session_digest`,`reindex`,`status`,`flow`,`evidence_map`,`present`]},Rr=new Set([`search`,`find`,`symbol`,`grep_search`,`semantic_search`]),zr=new Set([`replace_string_in_file`,`editfiles`,`create_file`,`apply_patch`]),Br=new Set([`check`,`test_run`]),Vr=new Set(`action.and.args.auto.buffer.category.content.create.cwd.false.file.files.find.grep.json.knowledge.list.path.query.read.replace.search.semantic.subaction.symbol.test.tool.true.update`.split(`.`));function Hr(e){let t=e.toLowerCase().match(/[a-z0-9]{2,}/g)??[];return new Set(t)}function Ur(e,t){let n=Hr(e),r=Hr(t);if(n.size===0&&r.size===0)return 1;if(n.size===0||r.size===0)return 0;let i=new Set([...n].filter(e=>r.has(e))),a=new Set([...n,...r]);return i.size/a.size}function Wr(e,t){return e.length<=t?e:`${e.slice(0,Math.max(0,t-1))}...`}function Gr(e){try{return JSON.stringify(e)}catch{return`[unserializable args]`}}function Kr(e){return e.replace(/^mcp_[^_]+_/,``).toLowerCase()}function qr(e){return[...new Set(e.filter(e=>e.length>0))]}function Jr(e,t){return{...t,confidence:Lr.initialConfidence,tags:[`auto-observed`,`detector:${e}`],detector:e}}function Yr(e,t){let n=new Map;for(let t of e)for(let e of Hr(t))Vr.has(e)||n.set(e,(n.get(e)??0)+1);let r=[...n.entries()].filter(([,e])=>e>=t).sort((e,t)=>t[1]-e[1]||e[0].localeCompare(t[0])).map(([e])=>e);return r.length>0?r.slice(0,4):[...n.entries()].sort((e,t)=>t[1]-e[1]||e[0].localeCompare(t[0])).slice(0,4).map(([e])=>e)}function Xr(e){return e.length>0?e.join(`, `):`similar tasks`}function Zr(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.ts==`number`&&Number.isFinite(t.ts)&&typeof t.tool==`string`&&typeof t.input==`string`&&(t.output===void 0||typeof t.output==`string`)&&Array.isArray(t.files)&&t.files.every(e=>typeof e==`string`)}function Qr(e){let t=[];for(let n of e)t.some(e=>Ur(e.title,n.title)>.8)||t.push(n);return t}function $r(e){return typeof e==`string`?[e]:Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function ei(e){return typeof e==`string`?[...e.matchAll(/^\*\*\* (?:Add|Delete|Update) File: (.+)$/gm)].map(e=>e[1]?.trim()??``).filter(Boolean):[]}function ti(e){let t=[],n=e=>{if(!(typeof e!=`object`||!e)){if(Array.isArray(e)){for(let t of e)n(t);return}for(let[r,i]of Object.entries(e))(r===`path`||r===`filePath`||r===`files`)&&t.push(...$r(i)),n(i)}};return n(e),t.push(...ei(e.input)),qr(t)}function ni(e){return{tool:e.toolName,input:Wr(Gr(e.args),200),output:Wr(L(e.result),500),files:ti(e.args),ts:Date.now()}}function ri(e){return{title:e.title,content:`${e.context}\n\n${e.insight}\n\nEvidence:\n${e.evidence}`,category:`conventions`,tags:qr([`auto-observed`,`detector:${e.detector}`,...e.tags]),hash:qe(`sha256`).update(`${e.detector}:${e.title}`).digest(`hex`).slice(0,16),quality:Math.max(0,Math.min(1,e.confidence/100)),source:`behavioral:${e.detector}`}}function ii(e){let t=new Map;for(let n of e){let e=Kr(n.tool),r=t.get(e)??[];r.push(n),t.set(e,r)}return[...t.entries()].filter(([,e])=>e.length>=5).map(([e,t])=>{let n=Xr(Yr(t.map(e=>e.input),Math.max(2,Math.ceil(t.length/2))));return Jr(`tool-preference`,{title:`Preferred tool: ${e} for ${n}`,context:`Observed ${t.length} ${e} calls with recurring inputs around ${n}.`,insight:`Use ${e} when working with ${n}.`,evidence:t.slice(0,5).map(e=>`${e.tool}: ${e.input}`).join(`
3
+ `)})})}function ai(e){let t=new Map;for(let n=0;n<e.length;n+=1){let r=e[n];if(Rr.has(Kr(r.tool)))for(let i=n+1;i<e.length&&i<=n+5;i+=1){let n=e[i];if(!(!zr.has(Kr(n.tool))||n.files.length===0))for(let e of qr(n.files)){let i=t.get(e)??{count:0,queries:[],evidence:[]};i.count+=1,i.queries.push(r.input),i.evidence.push(`${r.tool}: ${r.input} -> ${n.tool}: ${e}`),t.set(e,i)}}}return[...t.entries()].filter(([,e])=>e.count>=3).map(([e,t])=>{let n=Xr(Yr(t.queries,Math.max(2,Math.ceil(t.count/2))));return Jr(`search-action`,{title:`Check ${e} when searching for ${n}`,context:`Searches related to ${n} were followed by edits to ${e} ${t.count} times within five tool calls.`,insight:`When working on ${n}, check ${e} early because searches repeatedly led there.`,evidence:t.evidence.slice(0,5).join(`
4
+ `)})})}function oi(e){let t=new Map;for(let n=0;n<e.length-2;n+=1){let r=e[n];if(!Br.has(Kr(r.tool)))continue;let i=new Set,a=!1;for(let o=n+1;o<e.length;o+=1){let n=e[o],s=Kr(n.tool);if(zr.has(s)){a=!0;for(let e of n.files)i.add(e);continue}if(Br.has(s)){if(!a||i.size===0)break;let e=[...i].sort(),o=e.join(`|`),s=t.get(o)??{count:0,evidence:[]};s.count+=1,s.evidence.push(`${r.tool} -> edit(${e.join(`, `)}) -> ${n.tool}`),t.set(o,s);break}if(!a)break}}return[...t.entries()].filter(([,e])=>e.count>=2).map(([e,t])=>{let n=e.split(`|`);return Jr(`error-fix-cycle`,{title:`Repeated validation-edit loop in ${n.length===1?n[0]:`${n[0]} and related files`}`,context:`Observed ${t.count} validation cycles touching ${n.join(`, `)}.`,insight:`Common fix pattern in ${n.join(`, `)}: check -> edit -> recheck.`,evidence:t.evidence.slice(0,5).join(`
5
+ `)})})}function si(e){let t=/\b(prefer|rather use|better to|instead of|always use|never use)\b/i,n=e.filter(e=>t.test(e.input));if(n.length<2)return[];let r=Xr(Yr(n.map(e=>e.input),Math.max(2,Math.ceil(n.length/2)))),i=Jr(`user-preference`,{title:`User prefers ${r}`,context:`Observed ${n.length} explicit preference expressions about ${r}.`,insight:`User prefers working with ${r}. Default to these patterns.`,evidence:n.slice(0,3).map(e=>`${e.tool}: ${e.input}`).join(`
6
+ `)});return i.tags=qr([...i.tags,`user-preference`,`collaboration`]),[i]}function ci(e){let t=/\b(pros? and? cons?|tradeoffs?|alternative|compare|vs\.?|rather than|option|weigh|benefit|drawback)\b/i,n=e.filter(e=>t.test(e.input));if(n.length<2)return[];let r=Xr(Yr(n.map(e=>e.input),Math.max(2,Math.ceil(n.length/2)))),i=Jr(`decision-style`,{title:`Considers tradeoffs for ${r}`,context:`Observed ${n.length} decisions involving tradeoff analysis about ${r}.`,insight:`User evaluates alternatives explicitly before choosing. Surface tradeoff comparisons.`,evidence:n.slice(0,3).map(e=>`${e.tool}: ${e.input}`).join(`
7
+ `)});return i.tags=qr([...i.tags,`user-preference`,`decision-style`,`tradeoff`]),[i]}function li(e,t=Lr){if(!t.enabled||e.length===0)return[];let n=new Set(t.excludeTools.map(e=>e.toLowerCase())),r=e.filter(e=>!n.has(Kr(e.tool)));return Qr([...ii(r),...ai(r),...oi(r),...si(r),...ci(r)].map(e=>({...e,confidence:t.initialConfidence,tags:qr([`auto-observed`,`detector:${e.detector}`,...e.tags])}))).slice(0,t.maxCandidatesPerSession)}function ui(e){return e.split(`
8
+ `).filter(Boolean).map(e=>{try{return JSON.parse(e)}catch{return null}}).filter(Zr).map(e=>({...e,output:e.output??``}))}var di=class{name=`behavioral`;tools=[];buffer=[];eventCounter=0;lastDetectionTs=0;extract(e){if(this.push(ni(e)),this.eventCounter+=1,this.eventCounter%50!=0)return[];let t=Date.now();if(t-this.lastDetectionTs<3e5)return[];let n=li(this.buffer).map(ri);return this.eventCounter=0,this.lastDetectionTs=t,n}push(e){this.buffer.push(e),this.buffer.length>100&&this.buffer.splice(0,this.buffer.length-100)}};function fi(){return new di}fi();const pi={name:`build-commands`,tools:[`check`,`test_run`],extract(e){if(e.isError)return[];let t=L(e.result);if(!t)return[];let n=[];if(e.toolName===`check`){let r=[];if(/typecheck.*(?:pass|success|0 error)/i.test(t)&&r.push(`typecheck`),/lint.*(?:pass|success|no (?:warning|error))/i.test(t)&&r.push(`lint`),/biome.*(?:checked|no fixes)/i.test(t)&&r.push(`biome`),r.length>0){let t=[...r].sort();n.push({title:`Verified checks: ${t.join(`, `)}`,content:`The following checks passed successfully: ${t.join(`, `)}.\nRun with the \`check\` tool to verify code quality.`,category:`conventions`,tags:[`build`,`verified`,`review-gate`,...t],hash:R(`build-checks-${t.join(`,`)}`),quality:.8,source:e.toolName})}}if(e.toolName===`test_run`){let r=t.match(/(\d+)\s*(?:tests?\s+)?pass/i),i=t.match(/(\d+)\s*(?:total|tests)/i),a=t.match(/(\d+)\s*(?:test\s+)?files?/i);if(r){let t=r[1],o=i?.[1]??t,s=a?.[1]??`unknown`;n.push({title:`Test suite summary`,content:`Test results: ${t}/${o} tests passed across ${s} test files.\nUse \`test_run\` tool to execute the test suite.`,category:`context`,tags:[`testing`,`verified`,`test-summary`,`review-gate`],hash:R(`test-summary-${t}-${o}`),quality:.7,source:e.toolName,ttlMs:72e5})}let o=t.match(/(?:running|command|exec):\s*(.+?)$/im);if(o?.[1]){let t=o[1].trim();n.push({title:`Test command: ${t.slice(0,60)}`,content:`Verified test command: \`${t}\`\nThis command successfully ran the project's test suite.`,category:`conventions`,tags:[`testing`,`build-command`,`verified`,`review-gate`],hash:R(`test-cmd-${t}`),quality:.9,source:e.toolName})}}return n}},mi={name:`codebase-insights`,tools:[`analyze`,`scope_map`,`blast_radius`,`onboard`],extract(e){let t=L(e.result);if(!t||t.length<50||e.isError)return[];let n=[];if(e.toolName===`analyze`&&e.args.aspect===`structure`){let r=typeof e.args.path==`string`?e.args.path:`.`,i=t.slice(0,600);n.push({title:`Structure: ${r}`,content:`Project structure analysis for ${r}:\n${i}`,category:`context`,tags:[`architecture`,`structure`,`analysis`,...Math.min(.9,Ir(i)+.2)>=.7?[`architecture-memory`,`invariant`]:[]],hash:R(`structure-${r}`),identityKey:`analyze:structure:${r}`,quality:Math.min(.9,Ir(i)+.2),source:e.toolName})}if(e.toolName===`analyze`&&e.args.aspect===`dependencies`){let r=typeof e.args.path==`string`?e.args.path:`.`,i=t.split(/\r?\n/).filter(e=>/(?:depends on|imports?|requires?|from)\s/i.test(e)).slice(0,10);if(i.length>0){let t=`Dependency analysis for ${r}:\n${i.join(`
9
9
  `)}`;n.push({title:`Dependencies: ${r}`,content:t,category:`context`,tags:[`architecture`,`dependencies`,`analysis`,`architecture-memory`,`invariant`],hash:R(`deps-${r}`),identityKey:`analyze:dependencies:${r}`,quality:.7,source:e.toolName})}}if(e.toolName===`blast_radius`){let r=e.args.changed_files,i=Array.isArray(r)?r.map(String).join(`, `):String(r??``);if(i&&t.length>50){let r=t.slice(0,400);n.push({title:`Blast radius: ${i.slice(0,60)}`,content:`Impact analysis for changes to ${i}:\n${r}`,category:`context`,tags:[`architecture`,`blast-radius`,`impact`],hash:R(`blast-${i}`),identityKey:`blast-radius:${i}`,quality:.6,source:e.toolName,ttlMs:36e5})}}if(e.toolName===`analyze`&&e.args.aspect===`entry_points`){let r=t.split(/\r?\n/).filter(e=>/(?:entry|export|main|bin)\b/i.test(e)).slice(0,10);r.length>0&&n.push({title:`Project entry points`,content:`Detected entry points:\n${r.join(`
10
- `)}`,category:`context`,tags:[`architecture`,`entry-points`,`architecture-memory`,`invariant`],hash:R(`entry-points`),identityKey:`analyze:entry-points`,quality:.7,source:e.toolName})}if(e.toolName===`scope_map`){let r=typeof e.args.task==`string`?e.args.task:``;r&&t.length>100&&n.push({title:`Scope map: ${r.slice(0,60)}`,content:`Scope analysis for "${r}":\n${t.slice(0,500)}`,category:`context`,tags:[`planning`,`scope-map`],hash:R(`scope-${r}`),identityKey:`scope-map:${r}`,quality:.6,source:e.toolName,ttlMs:72e5})}return e.toolName===`onboard`&&t.length>200&&n.push({title:`Onboard analysis summary`,content:`Codebase onboarding analysis:\n${t.slice(0,800)}`,category:`context`,tags:[`onboarding`,`analysis`,`structure`,`architecture-memory`,`invariant`],hash:R(`onboard-summary`),identityKey:`onboard:summary`,quality:.9,source:e.toolName}),n}};function mi(e,t,n,r,i,a,o,s){return{title:e,content:t,category:`context`,tags:s,hash:R(n),identityKey:r,quality:i,ttlMs:a,source:o}}const hi={name:`context-reads`,tools:[`file_summary`,`digest`,`lookup`,`compact`,`stratum_card`],extract(e){if(e.isError)return[];let t=L(e.result);if(!t)return[];if(e.toolName===`compact`){let n=typeof e.args.path==`string`?e.args.path:void 0,r=typeof e.args.query==`string`?e.args.query:void 0;return!n||!r||t.length<100?[]:[mi(`Context: ${n} (${r.slice(0,40)})`,t.slice(0,800),`compact-${n}-${r}`,`compact:${n}:${r}`,.7,72e5,e.toolName,[`context`,`compact`,`file-read`])]}if(e.toolName===`file_summary`){let n=Array.isArray(e.args.files)?e.args.files:[],r=typeof e.args.path==`string`?e.args.path:n[0],i=typeof e.args.query==`string`?e.args.query:void 0,a=typeof e.args.tier==`string`?e.args.tier:void 0;return r?a===`T2`||i&&n.length>0?!i||t.length<100?[]:[mi(`Context: ${r} (${i.slice(0,40)})`,t.slice(0,800),`file-summary-${r}-${i}`,`file-summary:${r}:${i}`,.7,72e5,e.toolName,[`context`,`file_summary`,`file-read`])]:t.length<50?[]:[mi(`Structure: ${r}`,t,`file-summary-${r}`,`file-summary:${r}`,.65,144e5,e.toolName,[`context`,`file-summary`,`structure`])]:[]}if(e.toolName===`digest`){let n=typeof e.args.query==`string`?e.args.query:void 0;if(!n||t.length<150)return[];let r=Array.isArray(e.args.sources)?e.args.sources.map(e=>{if(!e||typeof e!=`object`)return``;let t=e.id;return typeof t==`string`?t:``}).join(`,`):``;return[mi(`Digest: ${n.slice(0,60)}`,t.slice(0,1e3),`digest-${n}-${r}`,`digest:${n}:${r}`,.75,72e5,e.toolName,[`context`,`digest`,`compression`])]}if(e.toolName===`lookup`){let n=typeof e.args.path==`string`?e.args.path:void 0;return!n||t.length<100?[]:[mi(`Indexed: ${n}`,t.slice(0,600),`lookup-${n}`,`lookup:${n}`,.5,72e5,e.toolName,[`context`,`lookup`,`file-content`])]}if(e.toolName===`stratum_card`){let n=Array.isArray(e.args.files)?e.args.files.filter(e=>typeof e==`string`):[],r=typeof e.args.query==`string`?e.args.query:``,i=typeof e.args.tier==`string`?e.args.tier:void 0;if(n.length===0||!i||t.length<50)return[];let a=n.join(`,`),o=i===`T2`?`stratum-${a}-${i}-${r}`:`stratum-${a}-${i}`;return[mi(`Card [${i}]: ${n[0]} (+${n.length-1})`,t.slice(0,600),o,`stratum:${i}:${a}:${r}`,i===`T2`?.7:.55,72e5,e.toolName,[`context`,`stratum-card`,i])]}return[]}};function gi(e,t){let n=[],r=e.toLowerCase();r.includes(`biome`)?n.push({title:`Linter: Biome`,content:`This project uses Biome for linting and formatting.`,category:`conventions`,tags:[`tooling`,`linter`,`biome`],hash:R(`convention-linter-biome`),quality:.8,source:t}):r.includes(`eslint`)&&n.push({title:`Linter: ESLint`,content:`This project uses ESLint for linting.`,category:`conventions`,tags:[`tooling`,`linter`,`eslint`],hash:R(`convention-linter-eslint`),quality:.8,source:t}),r.includes(`prettier`)&&n.push({title:`Formatter: Prettier`,content:`This project uses Prettier for code formatting.`,category:`conventions`,tags:[`tooling`,`formatter`,`prettier`],hash:R(`convention-formatter-prettier`),quality:.8,source:t}),(/strict\s*(?:mode)?.*(?:enabled|true)/i.test(e)||/"strict"\s*:\s*true/.test(e))&&n.push({title:`TypeScript strict mode enabled`,content:`This project has TypeScript strict mode enabled. Ensure all types are explicit.`,category:`conventions`,tags:[`typescript`,`strict`,`config`],hash:R(`convention-ts-strict`),quality:.8,source:t});for(let e of[`pnpm`,`yarn`,`npm`,`bun`])if(r.includes(e)&&(r.includes(`lockfile`)||r.includes(`workspace`)||r.includes(`${e} run`))){n.push({title:`Package manager: ${e}`,content:`This project uses ${e} as its package manager.`,category:`conventions`,tags:[`tooling`,`package-manager`,e],hash:R(`convention-pm-${e}`),quality:.7,source:t});break}return(r.includes(`monorepo`)||r.includes(`workspaces`)||/packages\/\w+/.test(e))&&n.push({title:`Monorepo structure detected`,content:`This project uses a monorepo structure with multiple packages.`,category:`conventions`,tags:[`architecture`,`monorepo`],hash:R(`convention-monorepo`),quality:.7,source:t}),n}function _i(e,t){let n=[],r=e.matchAll(/(?:pattern|convention):\s*(.+?)(?:\n|$)/gi);for(let e of r){let r=e[1]?.trim();r&&r.length>20&&r.length<200&&n.push({title:`Pattern: ${r.slice(0,80)}`,content:r,category:`patterns`,tags:[`detected-pattern`],hash:R(`pattern-${r}`),quality:.6,source:t})}return n}const vi={name:`convention-detection`,tools:[`check`,`analyze`,`onboard`],extract(e){let t=L(e.result);if(!t||e.isError)return[];let n=[];return n.push(...gi(t,e.toolName)),e.toolName===`analyze`&&e.args.aspect===`patterns`&&n.push(..._i(t,e.toolName)),n}};function yi(e){return e.replace(/[^a-zA-Z0-9_-]/g,``).replace(/-+/g,`-`).replace(/^-|-$/g,``)||`flow`}function bi(e){let t=e&&typeof e==`object`&&`content`in e&&Array.isArray(e.content)?e.content.filter(e=>e?.text).map(e=>e.text).join(`
11
- `):``;if(!t)return null;try{return JSON.parse(t)}catch{return null}}function xi(e,t,n,r,i,a,o,s,c){let l=[`decision-outcomes`,`flow`];return s&&l.push(`flow:${s}`),o&&l.push(...o),{title:e,content:t,category:`flow-context`,tags:l,hash:R(n),identityKey:r,quality:i,ttlMs:288e5,source:a,workspaceId:c}}function Si(e){let t=.5;return e.length>=80&&(t+=.1),e.length>=160&&(t+=.05),/step[s]?[:/]\s*\w+/i.test(e)&&(t+=.1),/\d+\/\d+/.test(e)&&(t+=.05),/\b(completed|skipped|outcome|success)\b/i.test(e)&&(t+=.05),/\b(decision|decided|chose|selected|because|rationale)\b/i.test(e)&&(t+=.1),/\b(artifact|produced|created|generated|file:|\.md)\b/i.test(e)&&(t+=.05),Math.min(1,Math.max(0,t))}function Ci(e){return typeof e.slug==`string`&&e.slug.length>0?e.slug:null}function wi(e){let t=Array.isArray(e.completedSteps)?e.completedSteps.filter(e=>typeof e==`string`):[],n=Array.isArray(e.skippedSteps)?e.skippedSteps.filter(e=>typeof e==`string`):[],r=typeof e.totalSteps==`number`?e.totalSteps:t.length+n.length;return{stepId:typeof e.currentStep==`string`?e.currentStep:null,phase:typeof e.phase==`string`?e.phase:null,completedSteps:t,skippedSteps:n,totalSteps:r}}const Ti={name:`decision-outcomes`,tools:[`flow`,`knowledge:remember`,`knowledge:forget`],maxFactsPerEvent:5,extract(e){if(e.isError)return[];let t=[],n=typeof e.args.action==`string`?e.args.action:``,r=bi(e.result),i=r?Ci(r):null,a=i?yi(i):null;if(n===`start`){let n=typeof e.args.name==`string`?e.args.name:`unknown`,i=typeof e.args.topic==`string`?e.args.topic:void 0,o=r?wi(r):null,s=o?.stepId??`unknown`,c=o?.totalSteps??0,l=[`Flow started: "${n}".`,i?`Topic: "${i}".`:``,`First step: ${s}.`,c>0?`Total steps: ${c}.`:``,a?`Slug: ${a}.`:``].filter(Boolean).join(` `);t.push(xi(`Flow started: ${n}${i?` — ${i}`:``}`,l,`flow-start-${a??n}`,`flow:start:${a??n}`,Si(l),e.toolName,[`flow:start`],a??void 0,e.workspaceId))}if(n===`step`){let n=typeof e.args.advance==`string`?e.args.advance:``,i=r?wi(r):null,o=i?.stepId??`unknown`,s=i?.completedSteps??[],c=i?.skippedSteps??[],l=i?.totalSteps??0,u=s.length+c.length,d=n===`next`?`completed`:n===`skip`?`skipped`:n===`redo`?`redone`:`transitioned`,f=n===`next`?s[s.length-1]:n===`skip`?c[c.length-1]:null,p=[`Step ${d}: ${f??(n===`redo`?o:`initial`)}.`,`Current step: ${o}.`,`Progress: ${u}/${l} steps.`,a?`Slug: ${a}.`:``].filter(Boolean);if(t.push(xi(`Step ${d}: ${f??o} (${u}/${l})`,p.join(` `),`flow-step-${a??``}-${o}-${n}`,`flow:step:${a??``}:${o}:${n}`,Si(p.join(` `)),e.toolName,[`flow:step`,`step:${n}`],a??void 0,e.workspaceId)),l>0&&t.push(xi(`Flow progress: ${u}/${l} (${o})`,`Progress: ${u}/${l} steps completed. Completed: ${s.join(`, `)||`none`}. Skipped: ${c.join(`, `)||`none`}. Current: ${o}.`+(a?` Slug: ${a}.`:``),`flow-progress-${a??``}-${u}`,`flow:progress:${a??``}`,.75,e.toolName,[`flow:progress`],a??void 0,e.workspaceId)),r&&r.status===`completed`){let n=[`Flow completed successfully.`,`Steps: ${u}/${l}.`,`Completed: ${s.join(`, `)||`none`}.`,`Skipped: ${c.join(`, `)||`none`}.`,`Duration: ${e.durationMs}ms.`,a?`Slug: ${a}.`:``].filter(Boolean);t.push(xi(`Flow completed: ${s.length+c.length}/${l} steps done`,n.join(` `),`flow-complete-${a??``}`,`flow:complete:${a??``}`,.8,e.toolName,[`flow:complete`],a??void 0,e.workspaceId))}}if(n===`reset`){let n=r?wi(r):null,i=[`Flow abandoned or reset.`,`Completed: ${n?.completedSteps.length??0} steps.`,`Skipped: ${n?.skippedSteps.length??0} steps.`,a?`Slug: ${a}.`:``].filter(Boolean);t.push(xi(`Flow abandoned: ${a??`unknown`}`,i.join(` `),`flow-abandon-${a??``}`,`flow:abandon:${a??``}`,.5,e.toolName,[`flow:abandon`],a??void 0,e.workspaceId))}if(e.toolName===`knowledge:remember`){let n=typeof e.args.title==`string`?e.args.title:void 0;if(!n)return t;t.push(xi(`Memory recorded: ${n.slice(0,60)}`,`Explicit memory write for "${n}". Source: ${typeof e.args.source==`string`?e.args.source:`user`}.`,`memory-remember-${n}`,`memory:remember:${R(n).slice(0,12)}`,.9,e.toolName))}if(e.toolName===`knowledge:forget`){let n=typeof e.args.title==`string`?e.args.title:void 0;if(!n)return t;t.push(xi(`Memory removed: ${n.slice(0,60)}`,`Explicit memory removal for "${n}".`,`memory-forget-${n}`,`memory:forget:${R(n).slice(0,12)}`,.7,e.toolName))}return t}};function Ei(e,t){return e.match(t)?.[1]?.trim()||null}function Di(e,t,n,r,i,a){return{title:e,content:t,category:`context`,tags:n,hash:R(r),quality:i,source:a}}const Oi={name:`environment-facts`,tools:[`env`,`config`,`status`],extract(e){let t=L(e.result);if(!t)return[];let n=[],r=Ei(t,/node(?:\.js)?\s*[:=]\s*([^\r\n]+)/i);r&&n.push(Di(`Node.js version`,`Detected Node.js version: ${r}`,[`environment`,`node`],`node-version-${r}`,.4,e.toolName));let i=Ei(t,/(?:^|\n)os\s*[:=]\s*([^\r\n]+)/i);i&&n.push(Di(`Operating system`,`Detected OS: ${i}`,[`environment`,`os`],`os-${i}`,.4,e.toolName));let a=Ei(t,/workspace(?: path)?\s*[:=]\s*([^\r\n]+)/i);a&&n.push(Di(`Workspace path`,`Primary workspace path: ${a}`,[`environment`,`workspace`],`workspace-${a}`,.4,e.toolName));let o=Ei(t,/store(?: backend)?\s*[:=]\s*([^\r\n]+)/i);o&&n.push(Di(`Store backend`,`Configured store backend: ${o}`,[`environment`,`storage`],`store-${o}`,.6,e.toolName));let s=Ei(t,/embedding(?: model)?\s*[:=]\s*([^\r\n]+)/i);return s&&n.push(Di(`Embedding model`,`Configured embedding model: ${s}`,[`environment`,`embedding`],`embedding-${s}`,.6,e.toolName)),n}},ki={"search-result":800,"file-card":2e3,analysis:1500,"step-summary":3e3},Ai=[`search`,`file_summary`,`stratum_card`,`compact`,`blast_radius`,`scope_map`,`flow`],ji={search:`search-result`,file_summary:`file-card`,stratum_card:`file-card`,compact:`analysis`,blast_radius:`analysis`,scope_map:`step-summary`,flow:`step-summary`},Mi={"search-result":72e5,"file-card":144e5,analysis:144e5,"step-summary":288e5};function Ni(e){return e.replace(/\s+/g,` `).trim()}function Pi(e){return Math.max(.6,Math.min(.8,Fr(e)))}function z(e,t=500){let n=Ni(e);return n.length<=t?n:`${n.slice(0,Math.max(0,t-3)).trimEnd()}...`}function Fi(e){return typeof e==`object`&&!!e}function Ii(e){try{return JSON.parse(e)}catch{return null}}function B(e){return typeof e==`string`?Ni(e):typeof e==`number`||typeof e==`boolean`?String(e):``}function Li(e,t=5){if(!Array.isArray(e))return[];let n=[];for(let r of e){if(n.length>=t)break;if(typeof r==`string`){let e=Ni(r);e&&n.push(e);continue}if(Fi(r)){let e=B(r.path)||B(r.sourcePath)||B(r.title)||B(r.name)||B(r.label);e&&n.push(e)}}return n}function V(e,...t){for(let n of t){let t=B(e[n]);if(t)return t}return``}function Ri(e){let t=[e.file,e.path,e.files,e.changed_files,e.changedFiles].flatMap(e=>typeof e==`string`?[Ni(e)]:Li(e,6));return[...new Set(t.filter(Boolean))].slice(0,6)}function zi(e,t=6){let n=e.match(/(?:[A-Za-z]:[\\/]|\.\/?|\.\.[\\/]|[A-Za-z0-9_.-]+\/)[^\s,:;]+\.[A-Za-z0-9]+/g)??[];return[...new Set(n.map(e=>Ni(e)))].slice(0,t)}function Bi(e,t){return e.length===0?``:`${t}: ${e.join(`, `)}`}function Vi(e,t=3){return e.split(/\r?\n/).map(e=>Ni(e)).filter(e=>e.length>=12).slice(0,t)}function Hi(e){if(!Fi(e))return``;let t=B(e.title)||B(e.path)||B(e.sourcePath)||B(e.file),n=B(e.snippet)||B(e.preview)||B(e.content)||B(e.summary);return Ni([t,n&&`- ${n}`].filter(Boolean).join(` `))}function Ui(e,t){let n=V(e,`query`),r=Ii(t);if(Fi(r)&&Array.isArray(r.results)){let e=r.results.map(e=>Hi(e)).filter(Boolean).slice(0,3);if(e.length>0)return z(`Query: ${n||`unknown`}. Top hits: ${e.join(` | `)}`,ki[`search-result`])}let i=Vi(t,3);return z(`Query: ${n||`unknown`}. Top hits: ${i.join(` | `)}`,ki[`search-result`])}function Wi(e,t){let n=V(e,`path`,`file`),r=Ii(t);if(Fi(r)){let e=B(r.path)||n||`unknown file`,t=Li(r.imports,4),i=Li(r.exports,5),a=Li(r.functions,4),o=[`File: ${e}`,Bi(i,`Exports`),Bi(t,`Imports`),Bi(a,`Functions`)].filter(Boolean);if(o.length>1)return z(o.join(`. `),ki[`file-card`])}let i=Vi(t,4);return z(`File: ${n||`unknown file`}. Structure: ${i.join(` | `)}`,ki[`file-card`])}function Gi(e,t){let n=Ri(e),r=V(e,`tier`)||`T1`,i=Ii(t);if(Fi(i)){let e=(Array.isArray(i.cards)?i.cards:[]).map(e=>Hi(e)).filter(Boolean).slice(0,3);if(e.length>0)return z(`Tier: ${r}. Files: ${n.join(`, `)||`unknown`}. Cards: ${e.join(` | `)}`,ki[`file-card`])}let a=Vi(t,3);return z(`Tier: ${r}. Files: ${n.join(`, `)||`unknown`}. Highlights: ${a.join(` | `)}`,ki[`file-card`])}function Ki(e,t){let n=V(e,`path`,`file`),r=V(e,`query`);return z(`Path: ${n||`unknown`}. Focus: ${r||`general`}. Summary: ${t}`,ki.analysis)}function qi(e,t){let n=Ri(e),r=Ii(t),i=Fi(r)?[...Li(r.affectedFiles,8),...Li(r.tests,4),...Li(r.importers,4)]:[],a=[...new Set([...i,...zi(t,8)])].slice(0,8),o=[`Changed: ${n.join(`, `)||`unknown`}`,Bi(a,`Affected`)].filter(Boolean);return o.length>1?z(o.join(`. `),ki.analysis):z(`Changed: ${n.join(`, `)||`unknown`}. Summary: ${t}`,ki.analysis)}function Ji(e,t){let n=V(e,`task`),r=Ii(t);if(Fi(r)){let e=Li(r.files,6),t=typeof r.totalFiles==`number`?r.totalFiles:e.length;if(e.length>0)return z(`Task: ${n||`unknown`}. Reading plan (${t} files): ${e.join(`, `)}`,ki[`step-summary`])}let i=zi(t,6);return z(`Task: ${n||`unknown`}. Reading plan: ${i.join(`, `)||Vi(t,3).join(` | `)}`,ki[`step-summary`])}function Yi(e,t){let n=V(e,`action`),r=V(e,`advance`);try{let e=JSON.parse(t),i=typeof e.slug==`string`?e.slug:``,a=typeof e.currentStep==`string`?e.currentStep:``,o=Array.isArray(e.completedSteps)?e.completedSteps.join(`, `):``,s=Array.isArray(e.skippedSteps)?e.skippedSteps.join(`, `):``;typeof e.totalSteps==`number`&&e.totalSteps;let c=typeof e.progress==`string`?e.progress:``,l=typeof e.phase==`string`?e.phase:``;return z([`Action: ${n}${r?`/${r}`:``}.`,i?`Slug: ${i}.`:``,a?`Current: ${a}.`:``,c?`Progress: ${c}.`:``,o?`Completed: ${o}.`:``,s?`Skipped: ${s}.`:``,l?`Phase: ${l}.`:``].filter(Boolean).join(` `),ki[`step-summary`])}catch{let e=Vi(t,3);return z(`Flow action: ${n||`unknown`}. ${e.join(` | `)}`,ki[`step-summary`])}}function Xi(e){let t=V(e,`action`),n=V(e,`name`),r=V(e,`advance`);return z(t===`start`&&n?`Flow started: ${n}`:t===`step`&&r?`Flow step: ${r}`:t===`status`?`Flow status`:t===`reset`?`Flow abandoned`:`Flow: ${t||`unknown action`}`,120)}function Zi(e){let t=V(e,`action`),n=V(e,`name`),r=V(e,`advance`);return t===`start`?`flow:start:${n||`unknown`}`:t===`step`?`flow:step:${r||`unknown`}`:t===`status`?`flow:status`:t===`reset`?`flow:reset`:`flow:${t||`unknown`}`}function Qi(e,t){switch(e.toolName){case`search`:return Ui(e.args,t);case`file_summary`:return Wi(e.args,t);case`stratum_card`:return Gi(e.args,t);case`compact`:return Ki(e.args,t);case`blast_radius`:return qi(e.args,t);case`scope_map`:return Ji(e.args,t);case`flow`:return Yi(e.args,t);default:return``}}function $i(e){switch(e.toolName){case`search`:return z(`Search: ${V(e.args,`query`)||`unknown query`}`,120);case`file_summary`:return z(`File summary: ${V(e.args,`path`,`file`)||`unknown file`}`,120);case`stratum_card`:return z(`Stratum card: ${Ri(e.args).join(`, `)||`unknown files`}${V(e.args,`tier`)?` (${V(e.args,`tier`)})`:``}`,120);case`compact`:return z(`Compact: ${V(e.args,`path`,`file`)||`unknown path`}${V(e.args,`query`)?` - ${V(e.args,`query`)}`:``}`,120);case`blast_radius`:return z(`Blast radius: ${Ri(e.args).join(`, `)||`unknown changes`}`,120);case`scope_map`:return z(`Scope map: ${V(e.args,`task`)||`unknown task`}`,120);case`flow`:return Xi(e.args);default:return z(`Flow context: ${e.toolName}`,120)}}function ea(e){switch(e.toolName){case`search`:return`search:${V(e.args,`query`)||`unknown-query`}`;case`file_summary`:return`file-summary:${V(e.args,`path`,`file`)||`unknown-file`}`;case`stratum_card`:{let t=Ri(e.args).join(`,`),n=V(e.args,`tier`)||`unknown-tier`,r=V(e.args,`query`);return`stratum:${n}:${t}${r?`:${r}`:``}`}case`compact`:{let t=V(e.args,`path`,`file`)||`unknown-path`,n=V(e.args,`query`);return`compact:${t}${n?`:${n}`:``}`}case`blast_radius`:return`blast-radius:${Ri(e.args).join(`,`)||`unknown-changes`}`;case`scope_map`:return`scope-map:${V(e.args,`task`)||`unknown-task`}`;case`flow`:return Zi(e.args);default:return`${e.toolName}:generic`}}function ta(e){return{name:`flow-context`,tools:[...Ai],extract(t){if(t.isError)return[];let n=e();if(!n?.active||!n.slug||!(t.toolName in ji))return[];let r=L(t.result).trim();if(r.length<50)return[];let i=ji[t.toolName],a=Qi(t,r);if(a.length<50)return[];let o=$i(t);return[{title:o,content:a,category:`flow-context`,tags:[`flow-context`,`flow:${yi(n.slug)}`,i,`tool:${t.toolName}`],hash:R(`${n.slug}|${t.toolName}|${o}|${a}`),identityKey:ea(t),quality:Pi(a),ttlMs:Mi[i],source:t.toolName}]}}}const na={name:`research-results`,tools:[`web_search`,`web_fetch`,`search`,`find`],extract(e){let t=L(e.result);if(!t||t.length<100||e.isError)return[];let n=[];if(e.toolName===`web_search`){let r=typeof e.args.query==`string`?e.args.query:``;if(r&&t.length>200){let i=t.slice(0,800);n.push({title:`Web research: ${r.slice(0,80)}`,content:`Research query: "${r}"\n\nKey findings:\n${i}`,category:`context`,tags:[`research`,`web-search`],hash:R(`web-search-${r}`),quality:Math.min(.8,Fr(i)+.2),source:e.toolName,ttlMs:864e5})}}if(e.toolName===`web_fetch`){let r=e.args.urls,i=Array.isArray(r)?String(r[0]??``):typeof e.args.url==`string`?e.args.url:``;if(i&&t.length>200){let r=t.split(/\r?\n/).find(e=>e.trim().length>10)?.trim()??i,a=t.slice(0,600);n.push({title:`Fetched: ${r.slice(0,80)}`,content:`Source: ${i}\n\n${a}`,category:`context`,tags:[`research`,`web-fetch`],hash:R(`web-fetch-${i}`),quality:Fr(a),source:e.toolName,ttlMs:864e5})}}if(e.toolName===`search`){let r=typeof e.args.query==`string`?e.args.query:``,i=typeof e.args.origin==`string`?e.args.origin:``,a=typeof e.args.search_mode==`string`?e.args.search_mode:`hybrid`;i===`curated`&&r&&t.length>100&&n.push({title:`Curated search: ${r.slice(0,80)}`,content:`Searched curated knowledge for: "${r}"\n\nResults:\n${t.slice(0,500)}`,category:`context`,tags:[`research`,`curated-search`],hash:R(`curated-search-${r}`),quality:.5,source:e.toolName,ttlMs:36e5}),i!==`curated`&&r&&t.length>150&&n.push({title:`Search: ${r.slice(0,80)}`,content:t.slice(0,500),category:`context`,tags:[`research`,`search`,i||`hybrid`,a],hash:R(`search-${r}-${i||`hybrid`}-${a}`),quality:.5,source:e.toolName,ttlMs:36e5})}if(e.toolName===`find`){let r=typeof e.args.query==`string`?e.args.query:``,i=typeof e.args.pattern==`string`?e.args.pattern:``,a=typeof e.args.glob==`string`?e.args.glob:``,o=typeof e.args.mode==`string`?e.args.mode:``,s=r||i||a||``;s&&t.length>100&&n.push({title:o?`Find (${o}): ${s.slice(0,60)}`:`Find: ${s.slice(0,60)}`,content:t.slice(0,600),category:`context`,tags:[`research`,`find`,o||`search`],hash:R(`find-${r}-${i}-${a}-${o}`),quality:.55,source:e.toolName,ttlMs:36e5})}return n}};function ra(e,t,n,r,i,a){return{title:e,content:t,category:`conventions`,tags:[`scaffold-behavior`,`tool-patterns`],hash:R(n),identityKey:r,quality:i,ttlMs:144e5,source:a}}const ia={name:`scaffold-behavior`,tools:[`init`,`status`],maxFactsPerEvent:3,extract(e){if(e.isError)return[];let t=L(e.result);if(!t||t.length<20)return[];let n=[];if(e.toolName===`init`&&n.push(ra(`Scaffold initialized`,`Workspace scaffold initialized. Result: ${t.slice(0,200)}.`,`scaffold-init-${e.timestamp}`,`scaffold:init:${R(t).slice(0,12)}`,.6,e.toolName)),e.toolName===`status`){let r=t.includes(`Extractor`)||t.includes(`extractor`),i=t.includes(`hook`)||t.includes(`Hook`),a=t.includes(`knowledge`)||t.includes(`curated`),o=`runtime status`;r&&i&&a?o=`full capability stack`:(r||i)&&(o=`partial capability`),n.push(ra(`Scaffold capability: ${o}`,`Runtime status detected: extractors=${r}, hooks=${i}, knowledge=${a}. Result length: ${t.length} chars.`,`scaffold-status-${e.timestamp}`,`scaffold:status:${R(t).slice(0,12)}`,Math.min(.7,.3+t.length/2e3),e.toolName))}return n}};function aa(e,t,n,r,i,a,o){return{title:e,content:t,category:`workflow`,tags:[`search-strategy`,`tool-patterns`],hash:R(n),identityKey:r,quality:i,ttlMs:a,source:o}}const oa={name:`search-strategy`,tools:[`search`,`find`,`web_search`,`web_fetch`],maxFactsPerEvent:3,extract(e){if(e.isError)return[];let t=typeof e.args.query==`string`?e.args.query:typeof e.args.pattern==`string`?e.args.pattern:``;if(!t||t.length<5)return[];let n=L(e.result);if(!n||n.length<50)return[];let r=typeof e.args.limit==`number`?e.args.limit:n.split(`
12
- `).filter(e=>e.includes(`http`)||e.startsWith(`-`)).length,i=Math.min(.9,.3+r*.05+Math.min(t.length/100,.3));return[aa(`Search strategy: ${t.slice(0,60)}`,`Effective query "${t}" returned ${r} results across ${n.length} chars. Quality ${i.toFixed(2)} — ${i>.6?`repeatable strategy`:`exploratory query`}.`,`search-strategy-${t}-${e.toolName}`,`search:${R(t).slice(0,12)}:${e.toolName}`,Math.round(i*100)/100,144e5,e.toolName)]}},sa=new Set([`neighbors`,`traverse`,`find_nodes`,`symbol360`]),ca=144e5;function la(e,t){return e.slice(0,t).trim()}function ua(e,t){let n=la(t,800);return n.length<80?[]:[{title:`Symbol: ${e}`,content:n,category:`patterns`,tags:[`architecture`,`symbol`,`definition`,`architecture-memory`,`invariant`],hash:R(`symbol-${e}`),quality:.7,ttlMs:ca,source:`symbol`}]}function da(e,t,n){let r=la(n,800);return r.length<100?[]:[{title:`Trace ${t}: ${e}`,content:r,category:`patterns`,tags:[`architecture`,`trace`,`data-flow`,t,`architecture-memory`,`invariant`],hash:R(`trace-${e}-${t}`),quality:.75,ttlMs:ca,source:`trace`}]}function fa(e,t){return e===`find_nodes`?`Graph nodes: ${t}`:e===`neighbors`?`Graph neighbors: ${t}`:e===`traverse`?`Graph traverse: ${t}`:`Symbol360: ${t}`}function pa(e,t,n,r,i){let a=la(i,600);return a.length<50?[]:[{title:fa(e,t),content:a,category:`patterns`,tags:[`architecture`,`graph`,e],hash:R(`graph-${e}-${t}-${n}-${r}`),quality:.6,ttlMs:ca,source:`graph`}]}const ma={name:`symbol-analysis`,tools:[`symbol`,`trace`,`graph`],extract(e){let t=L(e.result);if(!t||e.isError)return[];if(e.toolName===`symbol`){let n=typeof e.args.name==`string`?e.args.name:``;return n?ua(n,t):[]}if(e.toolName===`trace`){let n=typeof e.args.start==`string`?e.args.start:``,r=typeof e.args.direction==`string`?e.args.direction:``;return!n||!r?[]:da(n,r,t)}if(e.toolName===`graph`){let n=typeof e.args.action==`string`?e.args.action:``;if(!sa.has(n))return[];let r=typeof e.args.node_id==`string`?e.args.node_id:``,i=typeof e.args.name_pattern==`string`?e.args.name_pattern:``;if(n===`find_nodes`&&!i||(n===`neighbors`||n===`traverse`||n===`symbol360`)&&!r)return[];let a=typeof e.args.direction==`string`?e.args.direction:`both`,o=typeof e.args.max_depth==`number`?String(e.args.max_depth):``;return pa(n,n===`find_nodes`?i:r,a,o,t)}return[]}};function ha(e){let t=e.toLowerCase();return t.includes(`vitest`)?`vitest`:t.includes(`jest`)?`jest`:t.includes(`mocha`)?`mocha`:t.includes(`playwright`)?`playwright`:t.includes(`cypress`)?`cypress`:null}function ga(e){let t=[/(\S+\.test\.\w+)/,/(\S+\.spec\.\w+)/,/(\S+_test\.\w+)/,/__tests__\/\S+/],n=new Set;for(let r of t){let t=e.matchAll(new RegExp(r.source,`g`));for(let e of t){let t=e[0].match(/\.(test|spec)\.\w+$/);t&&n.add(t[0])}}return n.size>0?[...n].join(`, `):null}const _a={name:`test-results`,tools:[`check`,`test_run`],extract(e){let t=L(e.result);if(!t)return[];let n=[],r=ha(t);r&&n.push({title:`Test framework: ${r}`,content:`This project uses ${r} for testing. Detected from ${e.toolName} output.`,category:`context`,tags:[`testing`,`environment`,r],hash:R(`test-framework-${r}`),quality:.7,source:e.toolName});let i=ga(t);return i&&n.push({title:`Test file pattern: ${i}`,content:`Test files use the naming pattern: ${i}. Follow this convention when creating new tests.`,category:`conventions`,tags:[`testing`,`naming-convention`],hash:R(`test-pattern-${i}`),quality:.7,source:e.toolName}),n}};function va(e,t,n,r,i,a){return{title:e,content:t,category:`workflow`,tags:[`token-efficiency`,`optimization`],hash:R(n),identityKey:r,quality:i,ttlMs:144e5,source:a}}const ya={name:`token-efficiency`,tools:[`compact`,`file_summary`],maxFactsPerEvent:3,extract(e){if(e.isError)return[];let t=L(e.result);if(!t||t.length<20)return[];let n=[];if(e.toolName===`compact`){let r=typeof e.args.path==`string`?e.args.path:void 0,i=typeof e.args.query==`string`?e.args.query:``;if(!r)return[];let a=Math.max(0,1-t.length/Math.max(1,e.args.originalSize??t.length)),o=Math.min(.85,.3+a*.5);n.push(va(`Compact savings: ${r.slice(0,50)}`,`Ref reuse for "${i}" on ${r} saved ~${Math.round(a*100)}% tokens (${t.length} chars vs original). Quality: ${(o*100).toFixed(0)}%.`,`token-efficiency-compact-${r}-${i}`,`compact:savings:${R(r).slice(0,12)}`,Math.round(o*100)/100,e.toolName))}if(e.toolName===`file_summary`){let r=Array.isArray(e.args.files)?e.args.files:[],i=typeof e.args.query==`string`?e.args.query:void 0,a=typeof e.args.tier==`string`?e.args.tier:void 0;if(a!==`T1`&&!i)return[];let o=r.length,s=Math.min(.7,.2+o*.05);n.push(va(`File summary reuse: ${o} files`,`Used file_summary on ${o} files${i?` for "${i}"`:``} (tier: ${a??`auto`}). Result: ${t.length} chars.`,`token-efficiency-file-summary-${o}-${i??`none`}`,`file-summary:reuse:${R(r.join(`,`)).slice(0,12)}`,Math.round(s*100)/100,e.toolName))}return n}};function ba(e){let t=e.toLowerCase();return/enoent|no such file|not found/i.test(e)?{type:`missing-file`,actionable:!1}:/econnreset|econnrefused|etimedout|fetch failed/i.test(e)?{type:`network`,actionable:!1}:/permission denied|eacces/i.test(e)?{type:`permission`,actionable:!0}:/type\s*error|cannot.*property|is not a function/i.test(e)?{type:`type-error`,actionable:!0}:/syntax\s*error|unexpected token|parsing error/i.test(e)?{type:`syntax`,actionable:!0}:/out of memory|heap|allocation/i.test(e)?{type:`memory`,actionable:!0}:/timeout|timed out/i.test(e)?{type:`timeout`,actionable:t.includes(`increase`)||t.includes(`config`)}:/import|require|module not found|cannot find module/i.test(e)?{type:`module-resolution`,actionable:!0}:{type:`unknown`,actionable:e.length>100}}const xa={name:`tool-failure-patterns`,tools:[],extract(e){if(!e.isError)return[];let t=L(e.result);if(!t||t.length<30)return[];let{type:n,actionable:r}=ba(t);if(!r)return[];let i=t.slice(0,500),a=Fr(i);return a<.2?[]:[{title:`${n} error in ${e.toolName}`,content:`Tool \`${e.toolName}\` failed with a ${n} error.\n\nArgs: ${JSON.stringify(e.args,null,2).slice(0,200)}\n\nError:\n${i}`,category:`context`,tags:[`errors`,`pitfall`,n,e.toolName],hash:R(`smart-error-${n}-${e.toolName}-${t.slice(0,80)}`),quality:Math.min(.7,a+.1),source:e.toolName,ttlMs:72e5}]}},Sa=k(`extractor-registry`),Ca={defaultMaxFactsPerEvent:20,globalMaxFactsPerEvent:200};var wa=class{extractors=[];config;constructor(e={}){this.config={...Ca,...e}}register(e){this.extractors.push(e)}getExtractors(e){return this.extractors.filter(t=>t.tools.length===0?!0:t.tools.some(t=>{if(t===e||t===`*`||t===`*:*`)return!0;if(t.endsWith(`:*`)){let n=t.slice(0,-2);return e===n||e.startsWith(`${n}_`)||e.startsWith(`${n}-`)}return!1}))}extractAll(e){let t=this.getExtractors(e.toolName),n=[];for(let r of t){let i=r.maxFactsPerEvent??this.config.defaultMaxFactsPerEvent,a=r.extract(e);if(a.length>i?(Sa.warn(`Extractor "${r.name}" produced ${a.length} facts (cap: ${i}). Excess of ${a.length-i} facts discarded.`,{extractor:r.name,factsProduced:a.length,cap:i}),n.push(...a.slice(0,i))):n.push(...a),n.length>=this.config.globalMaxFactsPerEvent){let i=t.slice(t.indexOf(r)+1).map(e=>e.name);Sa.warn(`Global max facts per event reached`,{toolName:e.toolName,extractor:r.name,globalCap:this.config.globalMaxFactsPerEvent,skippedExtractors:i.length>0?i.join(`, `):void 0}),n.length=this.config.globalMaxFactsPerEvent;break}}return n}getStats(){let e={};for(let t of this.extractors)e[t.name]={tools:t.tools.length,maxFactsPerEvent:t.maxFactsPerEvent};return{count:this.extractors.length,byName:e}}reset(){this.extractors.length=0}};const Ta=new Set([`lifecycleOwnerToken`,`_ownerToken`,`ownerTokenSalt`,`ownerTokenHash`,`currentToken`]),H=k(`auto-knowledge`),Ea=2e3;var Da=class e{registry;curated;flowContextAdapter;promotionEngine;eventBus;stateStore;queue=[];timer=null;seenHashes=new Map;failedBuffer=[];maxBufferSize=50;storedCount=0;droppedCount=0;dedupedCount=0;bufferDropCount=0;collisionCount=0;promotedCount=0;evaluatedCount=0;heldCount=0;rejectedCount=0;deferredCount=0;recoveryListenerRegistered=!1;config;existingCuratedEntries=null;recoveryListener=null;constructor(e,t,n={},r,i,a,o){this.registry=e,this.curated=t,this.flowContextAdapter=r,this.promotionEngine=i,this.eventBus=a,this.stateStore=o,this.config={...Pr,...n},this.hydrateSeenHashes()}hydrateSeenHashes(){if(this.stateStore)try{let e=this.stateStore.stashGet(`auto-knowledge:seen-hashes`);if(e){let t=JSON.parse(e),n=Date.now();for(let[e,r]of t)n-r<1440*60*1e3&&this.seenHashes.set(e,r);H.info(`Hydrated ${this.seenHashes.size} seen hashes from store`)}}catch(e){H.warn(`Failed to hydrate seen hashes`,{error:String(e)})}}persistSeenHashes(){if(this.stateStore)try{let e=Array.from(this.seenHashes.entries()).filter(([e,t])=>Date.now()-t<1440*60*1e3);this.stateStore.stashSet(`auto-knowledge:seen-hashes`,JSON.stringify(e))}catch(e){H.warn(`Failed to persist seen hashes`,{error:String(e)})}}push(e){if(!(!this.config.enabled||!this.curated&&!this.flowContextAdapter)&&!(this.storedCount>=this.config.maxFactsPerSession)){if(this.queue.push(e),this.queue.length>=this.config.batchSize){this.flush().catch(e=>{H.warn(`Auto-knowledge flush error`,{error:String(e)})});return}this.scheduleBatch()}}async flush(){this.timer&&=(clearTimeout(this.timer),null);let e=this.queue.splice(0);if(e.length===0||!this.curated&&!this.flowContextAdapter)return;this.existingCuratedEntries===null&&(this.existingCuratedEntries=await this.loadExistingCuratedEntries());let t=new Map;for(let n of e)for(let e of this.registry.extractAll(n)){n.workspaceId!=null&&(e.workspaceId=n.workspaceId),e.evidenceRefs||=[];let r={sourceTool:n.toolName,requestId:n.requestId??n.toolName,timestamp:new Date(n.timestamp).getTime()};if(e.evidenceRefs.push(r),e.evidenceRefs.length>5&&(e.evidenceRefs=e.evidenceRefs.slice(e.evidenceRefs.length-5)),e.quality<this.config.minQuality){this.droppedCount++;continue}let i=this.buildFactIdentity(e);if(this.promotionEngine&&this.promotionEngine.recordObservation(e,i),this.isSeenRecently(e)){this.dedupedCount++;continue}let a=t.get(i);if(a){t.set(i,this.choosePreferredFact(a,e)),this.dedupedCount++;continue}t.set(i,e)}for(let[e,n]of t.entries()){let t;if(this.promotionEngine&&(t=await this.promotionEngine.evaluate(n,e),this.evaluatedCount++,t.status===`promoted`?this.promotedCount++:t.status===`held`?this.heldCount++:t.status===`rejected`&&this.rejectedCount++),this.storedCount>=this.config.maxFactsPerSession){t?.status===`promoted`&&this.deferredCount++;continue}let r=n.tags.includes(`flow-context`);if(!(this.promotionEngine&&!r&&t&&t.status!==`promoted`)){if(ge.instance().isDegraded(`embedder`)){H.debug?.(`Auto-knowledge embedder degraded — buffering fact`),this.bufferFact(n);continue}try{await this.storeFact(n,e)}catch(e){H.warn(`Auto-knowledge store failed — buffered for retry`,{title:n.title,error:String(e)}),this.bufferFact(n)}}}}reset(){this.queue=[],this.seenHashes.clear(),this.failedBuffer.length=0,this.storedCount=0,this.droppedCount=0,this.dedupedCount=0,this.bufferDropCount=0,this.collisionCount=0,this.promotedCount=0,this.evaluatedCount=0,this.heldCount=0,this.rejectedCount=0,this.deferredCount=0,this.existingCuratedEntries=null,this.removeRecoveryListener(),this.timer&&=(clearTimeout(this.timer),null)}getStats(){return{queued:this.queue.length,stored:this.storedCount,seen:this.seenHashes.size,dropped:this.droppedCount,deduped:this.dedupedCount,bufferSize:this.failedBuffer.length,bufferDropped:this.bufferDropCount,collisions:this.collisionCount,promoted:this.promotedCount,evaluated:this.evaluatedCount,held:this.heldCount,rejected:this.rejectedCount,deferred:this.deferredCount}}bufferFact(e){this.failedBuffer.length>=this.maxBufferSize&&(this.failedBuffer.shift(),this.bufferDropCount++),this.failedBuffer.push(e),this.ensureRecoveryListener()}ensureRecoveryListener(){if(this.recoveryListenerRegistered)return;let e=ge.instance(),t=n=>{n.subsystem===`embedder`&&(e.removeListener(`healthy`,t),this.recoveryListener=null,this.recoveryListenerRegistered=!1,this.flushBuffer().catch(e=>{H.warn(`Buffer flush failed`,{error:String(e)})}))};this.recoveryListener=t,this.recoveryListenerRegistered=!0,e.on(`healthy`,t)}removeRecoveryListener(){if(!this.recoveryListener){this.recoveryListenerRegistered=!1;return}ge.instance().removeListener(`healthy`,this.recoveryListener),this.recoveryListener=null,this.recoveryListenerRegistered=!1}async flushBuffer(){if(this.failedBuffer.length===0||!this.curated&&!this.flowContextAdapter)return;this.existingCuratedEntries===null&&(this.existingCuratedEntries=await this.loadExistingCuratedEntries()),H.info(`Flushing ${this.failedBuffer.length} buffered auto-knowledge facts`);let e=this.failedBuffer.splice(0);for(let t=0;t<e.length;t++){let n=e[t];if(n){if(this.storedCount>=this.config.maxFactsPerSession){this.failedBuffer.unshift(...e.slice(t));break}if(ge.instance().isDegraded(`embedder`)){this.failedBuffer.unshift(...e.slice(t)),this.ensureRecoveryListener();break}try{let e=this.buildFactIdentity(n),t=await this.storeFact(n,e);(t===`created`||t===`updated`)&&H.info(`Buffered fact stored on recovery`,{title:n.title,status:t})}catch(r){H.warn(`Auto-knowledge store failed — buffered for retry`,{title:n.title,error:String(r)}),this.failedBuffer.unshift(n,...e.slice(t+1)),this.ensureRecoveryListener();break}}}}isSeenRecently(e){let t=this.seenHashes.get(e.hash);return t==null?!1:e.ttlMs==null?!0:Date.now()-t<e.ttlMs}normalizeTitle(e){return e.toLowerCase().trim()}buildFactIdentity(e){let t=e.identityKey?`key:${e.identityKey}`:`hash:${e.hash||this.normalizeTitle(e.title)}`;return`${e.workspaceId?`ws:${e.workspaceId}`:`ws:global`}:${e.category}:${t}`}choosePreferredFact(e,t){return t.quality===e.quality?e:t.quality>e.quality?t:e}slugify(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``).slice(0,80)||`untitled`}resolveCuratedRelativePath(e){let t=`${e.category}/auto-${this.slugify(e.identityKey??e.title)}.md`,n=this.existingCuratedEntries??[],r=n.find(e=>e.path===t);if(r)return r.path;let i=this.normalizeTitle(e.title),a=n.filter(t=>t.category===e.category&&this.normalizeTitle(t.title)===i);return a.length===0?t:(a.sort((t,n)=>{let r=this.tagOverlapScore(n.tags,e.tags),i=this.tagOverlapScore(t.tags,e.tags);return r===i?t.path.localeCompare(n.path):r-i}),a[0]?.path??t)}resolveFlowContextRelativePath(e){return`${e.tags.find(e=>!e.startsWith(`flow:`)&&!e.startsWith(`tool:`)&&e!==`flow-context`)||`analysis`}/${this.slugify(e.identityKey??e.title)}.md`}tagOverlapScore(e,t){let n=new Set(e),r=0;for(let e of t)n.has(e)&&(r+=1);return r}markFactSeen(e){this.seenHashes.set(e.hash,Date.now()),this.persistSeenHashes()}rememberExistingCuratedFact(e,t){let n=this.existingCuratedEntries;if(!n)return;let r=n.find(t=>t.path===e);if(r){r.title=t.title,r.category=t.category,r.tags=[...t.tags];return}n.push({path:e,title:t.title,category:t.category,tags:[...t.tags]})}static OWNER_TOKEN_PATTERN=/\b[a-f0-9]{64}\b/g;applyContentBudget(e){return e.content.length<=2e3?e.content:(H.warn(`Fact "${e.title}" content truncated from ${e.content.length} to ${Ea} chars`,{title:e.title,originalLength:e.content.length,maxChars:Ea}),e.content.slice(0,Ea-50)+`\n\n[... truncated from ${e.content.length} chars to fit budget ...]`)}async storeFact(t,n){let r=this.applyContentBudget(t).replace(e.OWNER_TOKEN_PATTERN,`[REDACTED]`),i={...t,content:r},a=i.title.toLowerCase();for(let e of Ta)if(a.includes(e.toLowerCase()))return this.dedupedCount++,`unchanged`;if(i.tags.includes(`flow-context`)&&this.flowContextAdapter){let e=this.resolveFlowContextRelativePath(i),t=`# ${i.title}\n\n${i.content}`,n=await this.flowContextAdapter.read(e);if(n===t)return this.markFactSeen(i),this.dedupedCount++,`unchanged`;await this.flowContextAdapter.write(e,t);let r=n==null?`created`:`updated`;return this.markFactSeen(i),this.storedCount++,H.info(r===`created`?`Auto-knowledge stored`:`Auto-knowledge refreshed`,{title:i.title,category:i.category,quality:i.quality,source:i.source,status:r}),r}else if(this.curated){let e=this.resolveCuratedRelativePath(i),t=`Auto-knowledge refresh from ${i.source}`,r=await this.curated.upsertAutoKnowledge(e,i.title,i.content,i.category,i.tags,t);return this.markFactSeen(i),this.rememberExistingCuratedFact(r.path,i),this.eventBus&&this.eventBus.emit({type:`knowledge:promoted`,timestamp:Date.now(),eventId:`kp-${n}-${Date.now()}`,workspaceId:i.workspaceId??`ws:global`,source:`auto-knowledge-worker`,identityKey:n,toolName:i.source,result:r.status,confidence:i.quality}),r.status===`updated`&&this.collisionCount++,r.status===`unchanged`?(this.dedupedCount++,`unchanged`):(this.storedCount++,H.info(r.status===`created`?`Auto-knowledge stored`:`Auto-knowledge refreshed`,{title:i.title,category:i.category,quality:i.quality,source:i.source,status:r.status}),r.status)}throw Error(`AutoKnowledgeWorker: curated manager must implement upsertAutoKnowledge. The remember() fallback was removed per architecture invariant #4 (identity-keyed upserts required).`)}async loadExistingCuratedEntries(){let e=this.curated;if(!e)return[];try{return(await e.list()).map(e=>({path:e.path,title:e.title,category:e.category,tags:[...e.tags]}))}catch{H.warn(`Failed to load existing curated entries for dedup`,{})}return[]}scheduleBatch(){this.timer||=setTimeout(()=>{this.timer=null,this.flush().catch(e=>{H.warn(`Auto-knowledge flush error`,{error:String(e)})})},this.config.debounceMs)}};const Oa=/```/,ka=/^\s*(?:import|export|function|class|interface|type|const|let|var|return|if|for|while|switch|try|catch|throw|await|async)\b/,Aa=/=>|;\s*$|{\s*$|}\s*$|:\s*(?:string|number|boolean|unknown|void|any|Record|Array|Set|Map|Promise|ReadonlyArray)\b/;function ja(e){let t=e.trimStart();if(t.length===0)return!1;let n=t.charAt(0);return n!==`{`&&n!==`[`?!1:n===`{`?!(!t.includes(`"`)||!t.includes(`:`)):t.length>2}function Ma(e){if(ja(e)||e.includes("```")||Oa.test(e))return!0;let t=e.split(/\r?\n/u).filter(e=>e.trim().length>0);if(t.length<3)return!1;let n=0;for(let e of t)(ka.test(e)||Aa.test(e))&&(n+=1);return n/t.length>=.25}function Na(e){let t=e.meta?.compression?.preserve??`balanced`;if(t===`exact`||Ma(e.text))return{profile:`exact`,shouldCompress:!1,mode:`structural`,threshold:e.threshold,tokenBudget:e.tokenBudget,reason:t===`exact`?`tool-specific preservation profile`:`code-like output preserved verbatim`};if(t===`dense`){let t=Math.max(1,Math.floor(e.threshold*.65)),n=Math.max(1,Math.floor(e.tokenBudget*.6));return{profile:`dense`,shouldCompress:e.text.length>=t,mode:`aggressive`,threshold:t,tokenBudget:n,reason:`dense tool profile`}}return{profile:`balanced`,shouldCompress:e.text.length>=e.threshold,mode:`structural`,threshold:e.threshold,tokenBudget:e.tokenBudget,reason:`balanced tool profile`}}const Pa={search:{title:`Hybrid Search`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`search`],compression:{preserve:`dense`},planner:{costClass:`medium`,effect:`read`,indexDependency:`required`,availability:`full-only`,profileFit:[`search`],flowFit:[`orient`,`retrieve`],outputBudget:`balanced`,supportsRef:!0,supportsFreshness:!0,supportsConfidence:!0,explain:`Search codebase using hybrid vector+FTS search`}},find:{title:`Federated Find`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`search`],compression:{preserve:`dense`},planner:{costClass:`medium`,effect:`read`,indexDependency:`required`,availability:`full-only`,profileFit:[`search`],flowFit:[`orient`,`retrieve`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Multi-strategy search combining vector, FTS, glob, and regex`}},symbol:{title:`Symbol Resolver — Cross-Module Definitions & References`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`search`],compression:{preserve:`exact`},planner:{costClass:`small`,effect:`read`,indexDependency:`required`,availability:`full-only`,profileFit:[`search`],flowFit:[`retrieve`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Find symbol definitions and references across modules`}},trace:{title:`Data Flow Tracer — Cross-Module Call & Import Chains`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`search`],compression:{preserve:`exact`},planner:{costClass:`medium`,effect:`read`,indexDependency:`required`,availability:`full-only`,profileFit:[`search`],flowFit:[`analyze`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Trace data flow forward or backward across imports and call sites`}},scope_map:{title:`Task Scope Map`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`search`],compression:{preserve:`exact`},capabilities:{indexIndependent:!0},planner:{costClass:`small`,effect:`read`,indexDependency:`preferred`,availability:`full-only`,profileFit:[`search`],flowFit:[`orient`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Generate task-scoped reading plan with token estimates`}},file_summary:{title:`File Summary`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`search`,`compression`],compression:{preserve:`balanced`},capabilities:{indexIndependent:!0},planner:{costClass:`small`,effect:`read`,indexDependency:`preferred`,availability:`full-only`,profileFit:[`search`,`compression`],flowFit:[`compress`,`retrieve`],outputBudget:`rich`,supportsRef:!0,supportsFreshness:!1,supportsConfidence:!1,explain:`Get structured summary or compressed content from files`}},analyze:{title:`Analyze`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`analysis`],compression:{preserve:`exact`},planner:{costClass:`medium`,effect:`read`,indexDependency:`required`,availability:`full-only`,profileFit:[`analysis`],flowFit:[`analyze`],outputBudget:`rich`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Analyze codebase structure, dependencies, symbols, and patterns`}},blast_radius:{title:`Blast Radius`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`analysis`],compression:{preserve:`dense`},planner:{costClass:`large`,effect:`read`,indexDependency:`required`,availability:`full-only`,profileFit:[`analysis`],flowFit:[`analyze`],outputBudget:`rich`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Given changed files, trace dependency graph to find all affected files and their tests`}},knowledge:{title:`Knowledge`,annotations:{readOnlyHint:!1},category:[`knowledge`],compression:{preserve:`balanced`},capabilities:{indexIndependent:!0},planner:{costClass:`medium`,effect:`mixed`,indexDependency:`preferred`,availability:`full-only`,profileFit:[`knowledge`],flowFit:[`retrieve`,`memorize`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`Read, write, and manage curated knowledge entries and lessons`}},produce_knowledge:{title:`Produce Knowledge`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`knowledge`],compression:{preserve:`exact`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`knowledge`],flowFit:[`analyze`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Generate automated codebase analysis and synthesis instructions`}},digest:{title:`Multi-Source Digest`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`compression`],compression:{preserve:`balanced`},capabilities:{indexIndependent:!0},planner:{costClass:`medium`,effect:`read`,indexDependency:`preferred`,availability:`full-only`,profileFit:[`compression`],flowFit:[`compress`],outputBudget:`balanced`,supportsRef:!0,supportsFreshness:!1,supportsConfidence:!1,explain:`Compress multiple text sources into token-budgeted digest`}},forge_ground:{title:`FORGE Ground`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`forge`],compression:{preserve:`exact`},planner:{costClass:`large`,effect:`read`,indexDependency:`required`,availability:`full-only`,profileFit:[`forge`],flowFit:[`plan`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Execute complete FORGE Ground phase including scope map and evidence map creation`}},evidence_map:{title:`Evidence Map`,annotations:{readOnlyHint:!1},category:[`forge`],compression:{preserve:`exact`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`mixed`,indexDependency:`none`,availability:`always`,profileFit:[`forge`],flowFit:[`verify`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Track verified, assumed, and unresolved claims with gate readiness evaluation`}},present:{title:`Rich Content Presenter`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`presentation`],compression:{preserve:`balanced`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`presentation`],flowFit:[`present`],outputBudget:`rich`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Render rich content dashboards, charts, tables, and interactive surfaces`}},check:{title:`Typecheck & Lint`,annotations:{readOnlyHint:!0,openWorldHint:!0},category:[`execution`],compression:{preserve:`dense`,selfManaged:!0},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`medium`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`execution`],flowFit:[`verify`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Run incremental TypeScript typecheck and Biome lint`}},test_run:{title:`Run Tests`,annotations:{readOnlyHint:!0,openWorldHint:!0},category:[`execution`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`medium`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`execution`],flowFit:[`verify`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Run Vitest tests with structured pass/fail summary`}},eval:{title:`Evaluate Code`,annotations:{readOnlyHint:!1,openWorldHint:!0},category:[`execution`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`write`,indexDependency:`none`,availability:`always`,profileFit:[`execution`],flowFit:[`verify`,`act`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Execute JavaScript or TypeScript in a constrained VM sandbox`}},audit:{title:`Project Audit`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`execution`],compression:{preserve:`dense`,selfManaged:!0},planner:{costClass:`large`,effect:`read`,indexDependency:`required`,availability:`full-only`,profileFit:[`execution`],flowFit:[`analyze`],outputBudget:`rich`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Run unified audit across structure, dependencies, patterns, and health`}},browser:{title:`Browser Automation`,annotations:{readOnlyHint:!1,openWorldHint:!0},category:[`web`],compression:{preserve:`balanced`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`large`,effect:`mixed`,indexDependency:`none`,availability:`always`,profileFit:[`web`],flowFit:[`act`,`retrieve`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Automate web browser interactions via Chrome DevTools Protocol`}},rename:{title:`Rename Symbol`,annotations:{readOnlyHint:!1,destructiveHint:!0},category:[`manipulation`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`destructive`,indexDependency:`none`,availability:`always`,profileFit:[`manipulation`],flowFit:[`act`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Rename symbols across files with whole-word regex matching`}},restore:{title:`Restore`,annotations:{readOnlyHint:!1},category:[`manipulation`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`mixed`,indexDependency:`none`,availability:`always`,profileFit:[`manipulation`],flowFit:[`act`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`List and restore file snapshots from destructive operations`}},codemod:{title:`Codemod`,annotations:{readOnlyHint:!1,destructiveHint:!0},category:[`manipulation`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`destructive`,indexDependency:`none`,availability:`always`,profileFit:[`manipulation`],flowFit:[`act`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Apply regex-based codemod rules across files with preview`}},session:{title:`Session Manager`,annotations:{readOnlyHint:!1},category:[`session`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`mixed`,indexDependency:`none`,availability:`always`,profileFit:[`session`],flowFit:[`act`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Manage session signals, checkpoints, stashes, worksets, and lanes`}},git:{title:`Git — Context, Diff Parse, Changelog`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`git`],compression:{preserve:`exact`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`git`],flowFit:[`analyze`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Get branch, status, and commit context; parse diffs; generate changelogs`}},parse_output:{title:`Parse Build Output`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`git`],compression:{preserve:`exact`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`tiny`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`git`],flowFit:[`analyze`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Parse structured data from build tool terminal output`}},process:{title:`Process Manager`,annotations:{readOnlyHint:!1,openWorldHint:!0},category:[`process`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`mixed`,indexDependency:`none`,availability:`always`,profileFit:[`process`],flowFit:[`act`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Start, stop, inspect, and list managed child processes`}},delegate:{title:`Delegate Task`,annotations:{readOnlyHint:!1,openWorldHint:!0},category:[`process`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`mixed`,indexDependency:`none`,availability:`always`,profileFit:[`process`],flowFit:[`act`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Delegate subtasks to local Ollama models`}},config:{title:`Configuration Manager`,annotations:{readOnlyHint:!1},category:[`system`],compression:{preserve:`exact`},capabilities:{indexIndependent:!0},planner:{costClass:`small`,effect:`mixed`,indexDependency:`preferred`,availability:`full-only`,profileFit:[`system`],flowFit:[`configure`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`View and update AI Kit server configuration`}},status:{title:`AI Kit Status`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`system`],compression:{preserve:`balanced`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`tiny`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`system`],flowFit:[`orient`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`Get AI Kit index status, stats, and session prelude`}},reindex:{title:`Reindex`,annotations:{readOnlyHint:!1},category:[`system`],compression:{preserve:`dense`},capabilities:{indexIndependent:!0},planner:{costClass:`medium`,effect:`write`,indexDependency:`preferred`,availability:`full-only`,profileFit:[`system`],flowFit:[`act`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Trigger incremental or full re-indexing of the AI Kit search index`}},onboard:{title:`Onboard Codebase`,annotations:{readOnlyHint:!1},category:[`system`],compression:{preserve:`dense`},capabilities:{indexIndependent:!0},planner:{costClass:`large`,effect:`write`,indexDependency:`preferred`,availability:`full-only`,profileFit:[`system`],flowFit:[`analyze`,`compress`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Onboard a codebase with full structure, dependency, and symbol analysis`}},graph:{title:`Code Knowledge Graph — Module & Symbol Relationships`,annotations:{readOnlyHint:!1},category:[`system`],compression:{preserve:`balanced`},capabilities:{indexIndependent:!0},planner:{costClass:`medium`,effect:`mixed`,indexDependency:`preferred`,availability:`full-only`,profileFit:[`system`],flowFit:[`analyze`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Query and manage the auto-populated code knowledge graph`}},replay:{title:`Replay History`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`system`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`tiny`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`system`],flowFit:[`verify`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`View or clear the MCP tool and CLI invocation audit trail`}},measure:{title:`Code Metrics`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`utilities`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`tiny`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`utilities`],flowFit:[`measure`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Measure code complexity, line counts, and function counts for files`}},env:{title:`Environment Info`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`utilities`],compression:{preserve:`exact`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`tiny`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`utilities`],flowFit:[`orient`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Get system and runtime environment information`}},web_fetch:{title:`Web Fetch`,annotations:{readOnlyHint:!0,openWorldHint:!0},category:[`web`],compression:{preserve:`balanced`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`medium`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`web`],flowFit:[`retrieve`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Fetch web URLs and convert to LLM-optimized markdown`}},web_search:{title:`Web Search`,annotations:{readOnlyHint:!0,openWorldHint:!0},category:[`web`],compression:{preserve:`balanced`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`medium`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`web`],flowFit:[`retrieve`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Search the web with multi-provider fan-out and consensus ranking`}},queue:{title:`Operation Queue`,annotations:{readOnlyHint:!1},category:[`queue`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`tiny`,effect:`mixed`,indexDependency:`none`,availability:`always`,profileFit:[`queue`],flowFit:[`act`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Manage task queues with optional DAG dependencies`}},bridge_push:{title:`Bridge Push`,annotations:{readOnlyHint:!1},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`small`,effect:`write`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`act`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Push data from the workspace to an external enterprise system via bridge`}},bridge_pull:{title:`Bridge Pull`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`small`,effect:`read`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`retrieve`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`Pull data from an external enterprise system into the workspace via bridge`}},bridge_sync:{title:`Bridge Sync Status`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`tiny`,effect:`read`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`orient`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`Check the sync status between workspace and external enterprise system via bridge`}},er_push:{title:`Enterprise Push`,annotations:{readOnlyHint:!1},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`small`,effect:`write`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`act`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Push data to enterprise repository system`}},er_pull:{title:`Enterprise Pull`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`small`,effect:`read`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`retrieve`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`Pull data from enterprise repository system`}},er_sync_status:{title:`Enterprise Sync Status`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`tiny`,effect:`read`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`orient`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`Check enterprise repository sync status`}},er_update_policy:{title:`Enterprise Update Policy`,annotations:{readOnlyHint:!1},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`small`,effect:`write`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`act`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Update enterprise evolution policy settings`}},er_evolve_review:{title:`Enterprise Evolution Review`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`small`,effect:`read`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`analyze`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`Review enterprise evolution state and pending changes`}},evolution_state:{title:`Evolution State`,annotations:{readOnlyHint:!1},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`small`,effect:`mixed`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`analyze`,`act`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`View or update enterprise evolution state`}},policy_check:{title:`Policy Check`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`tiny`,effect:`read`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`verify`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`Check workspace content against enterprise policies`}},flow:{title:`Flow`,annotations:{readOnlyHint:!1},category:[`flow`],compression:{preserve:`balanced`},capabilities:{zeroDep:!0},planner:{costClass:`small`,effect:`mixed`,indexDependency:`none`,availability:`always`,profileFit:[`flow`],flowFit:[`plan`,`act`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`List, start, navigate, and manage development flow runs`}}},Fa=Object.keys(Pa).filter(e=>!Pa[e]?.capabilities?.conditional),Ia=new Set(Object.entries(Pa).filter(([e,t])=>t.capabilities?.zeroDep).map(([e])=>e)),La=new Set(Object.entries(Pa).filter(([e,t])=>t.capabilities?.indexIndependent).map(([e])=>e));function U(e){return Pa[e]??{title:e,annotations:{readOnlyHint:!1},category:[]}}function Ra(e){switch(e){case`efficient`:return{threshold:2e3,tokenBudget:1e3};case`full`:return{threshold:1/0};default:return{threshold:4e3,tokenBudget:2e3}}}function za(e){let t=e?.threshold??4e3,n=e?.tokenBudget??2e3;return async(e,r)=>{if(U(e.toolName).compression?.selfManaged)return r();let i=await r();if(!Array.isArray(i.content))return i;let a={profile:`balanced`,applied:!1,reason:`below threshold`,mode:`structural`,threshold:t,tokenBudget:n,originalChars:0,compressedChars:0,savedChars:0,compressedItems:0,preservedItems:0},o=i.content.map(r=>{if(r.type!==`text`||typeof r.text!=`string`)return r;a.originalChars+=r.text.length;let i=Na({meta:e.meta,text:r.text,threshold:t,tokenBudget:n});if(a.profile=i.profile,a.mode=i.mode,a.threshold=i.threshold,a.tokenBudget=i.tokenBudget,a.reason=i.reason,!i.shouldCompress||r.text.length<i.threshold)return a.preservedItems+=1,a.compressedChars+=r.text.length,r;let o=mt({text:r.text,tool:e.toolName,tokenBudget:i.tokenBudget,mode:i.mode});return a.applied=!0,a.compressedItems+=1,a.compressedChars+=o.text.length,o.text===r.text?r:{...r,text:o.text}});return a.originalChars===0?i:(a.savedChars=a.originalChars-a.compressedChars,{...i,content:o,_meta:{...i._meta??{},compression:a}})}}var Ba=class{baseDir;getActiveSlug;constructor(e,t){this.baseDir=e,this.getActiveSlug=t}async initialize(){await Be(this.baseDir,{recursive:!0})}async read(e){let t=this.resolveScopedPath(e);if(t==null)return null;try{return await Ve(t,`utf-8`)}catch(e){if(this.isMissingError(e))return null;throw e}}async write(e,t,n){let r=this.resolveScopedPath(e);r!=null&&(await Be(Ie(r),{recursive:!0}),await Ke(r,t,{encoding:`utf-8`,flag:n?.exclusive?`wx`:`w`}))}async delete(e){let t=this.resolveScopedPath(e);if(t==null)return!1;try{return await Ge(t),!0}catch(e){if(this.isMissingError(e))return!1;throw e}}async list(e){let t=this.getActiveSlugDir();if(t==null)return[];let n=e?this.resolveScopedPath(e):t;return n==null?[]:this.collectFiles(n,e??``)}async exists(e){let t=this.resolveScopedPath(e);if(t==null)return!1;try{return await We(t),!0}catch(e){if(this.isMissingError(e))return!1;throw e}}async listDirectories(){let e=this.getActiveSlugDir();if(e==null)return[];try{return(await He(e,{withFileTypes:!0})).filter(e=>e.isDirectory()&&/^[a-z][a-z0-9-]*$/.test(e.name)).map(e=>e.name).sort()}catch(e){if(this.isMissingError(e))return[];throw e}}async flushAll(){let e=this.getActiveSlugDir();if(e==null)return 0;let t=await this.countFiles(e);return t===0?0:(await Ue(e,{recursive:!0,force:!0}),t)}async close(){}getActiveSlugDir(){let e=this.getActiveSlug();return e?P(this.baseDir,e):null}resolveScopedPath(e){let t=this.getActiveSlugDir();if(t==null)return null;let n=F(t),r=F(n,e),i=Re(n,r);if(i===``||i===`..`||i.startsWith(`..${ze}`)||Le(i))throw Error(`Path escapes active flow context scope: ${e}`);return r}async collectFiles(e,t){let n;try{n=await He(e,{withFileTypes:!0})}catch(e){if(this.isMissingError(e))return[];throw e}let r=[];for(let i of n){let n=t?`${t}/${i.name}`:i.name,a=P(e,i.name);if(i.isDirectory()){r.push(...await this.collectFiles(a,n));continue}if(!(!i.isFile()||!i.name.endsWith(`.md`)))try{let e=await We(a);r.push({path:n,size:e.size,mtimeMs:e.mtimeMs})}catch(e){if(!this.isMissingError(e))throw e}}return r.sort((e,t)=>e.path.localeCompare(t.path))}async countFiles(e){let t;try{t=await He(e,{withFileTypes:!0})}catch(e){if(this.isMissingError(e))return 0;throw e}let n=0;for(let r of t){let t=P(e,r.name);if(r.isDirectory()){n+=await this.countFiles(t);continue}r.isFile()&&(n+=1)}return n}isMissingError(e){return typeof e==`object`&&!!e&&`code`in e&&(e.code===`ENOENT`||e.code===`ENOTDIR`)}};k(`procedural-memory`);const Va={minSequenceLength:3,minRepetitions:3,maxSequenceLength:10,confidenceIncrement:10,confidenceDecrement:20},Ha=new Set([`status`,`guide`,`health`,`onboard`,`reindex`,`replay`,`session_digest`,`process`,`watch`,`produce_knowledge`,`list_tools`,`describe_tool`,`search_tools`]);function Ua(e){return e.join(`→`)}function Wa(e){return{...e,steps:[...e.steps]}}function Ga(e){return e.every(e=>e.success)}var Ka=class{config;history=[];sequences=new Map;procedures=new Map;pendingProcedures=new Map;constructor(e=Va){this.config=e}record(e,t){let n=new Date().toISOString();this.history.push({toolName:e,timestamp:n,success:t}),this.history.length>100&&(this.history=this.history.slice(-100));let r=this.detectSequences(n);this.updateMatchedProcedures(n,r)}getExtractableSequences(){return[...this.sequences.entries()].filter(([,e])=>e.count>=this.config.minRepetitions).map(([e,t])=>({steps:e.split(`→`),count:t.count,lastSeen:t.lastSeen})).sort((e,t)=>t.count===e.count?t.steps.length-e.steps.length:t.count-e.count)}listProcedures(){return[...this.procedures.values()].map(e=>Wa(e)).sort((e,t)=>t.occurrences===e.occurrences?t.steps.length-e.steps.length:t.occurrences-e.occurrences)}drainNewProcedures(){let e=[...this.pendingProcedures.values()].map(e=>Wa(e));return this.pendingProcedures.clear(),e}requeueProcedures(e){for(let t of e)this.pendingProcedures.set(Ua(t.steps),Wa(t))}extractProcedure(e,t){return{id:Ye(),steps:[...e],occurrences:t,confidence:Math.min(50+(t-this.config.minRepetitions)*this.config.confidenceIncrement,100),lastSeen:new Date().toISOString(),conditions:`Use when these user-facing tools are run in this order within a single session.`}}adjustConfidence(e,t){return e.confidence=t?Math.min(100,e.confidence+this.config.confidenceIncrement):Math.max(0,e.confidence-this.config.confidenceDecrement),e.confidence}getHistoryLength(){return this.history.length}clear(){this.history=[],this.sequences.clear(),this.procedures.clear(),this.pendingProcedures.clear()}detectSequences(e){let t=this.history.map(e=>e.toolName),n=Math.min(this.config.maxSequenceLength,t.length),r=new Set,i=Math.max(1,Math.min(2,this.config.minRepetitions));for(let a=this.config.minSequenceLength;a<=n;a+=1){let n=t.slice(-a),o=Ua(n),s=0;for(let e=0;e<=t.length-a;e+=1)Ua(t.slice(e,e+a))===o&&(s+=1);if(!(s<i)&&(this.sequences.set(o,{count:s,lastSeen:e}),s>=this.config.minRepetitions&&!this.procedures.has(o))){let t=this.extractProcedure(n,s);t.lastSeen=e,this.procedures.set(o,t),this.pendingProcedures.set(o,Wa(t)),r.add(o)}}return r}updateMatchedProcedures(e,t){for(let[n,r]of this.procedures.entries()){if(t.has(n))continue;let i=n.split(`→`);if(this.history.length<i.length)continue;let a=this.history.slice(-i.length);Ua(a.map(e=>e.toolName))===n&&(r.occurrences+=1,r.lastSeen=e,this.adjustConfidence(r,Ga(a)))}}};const qa={recurrenceWeight:.3,confidenceWeight:.3,sourceDiversityWeight:.2,freshnessWeight:.1,actionabilityWeight:.1};function Ja(e){let t=0;return/\b(use|should|must|always|never|prefer|avoid|requires?)\b/i.test(e)&&(t+=.3),/```|```[\w]*\n|`\w+`|(?:^|\n)[*-] /m.test(e)&&(t+=.3),/\b\d+%|\d+\.\d+|\d+tps?\b/i.test(e)&&(t+=.2),/\b(next|todo|fixme|hack|bug|workaround)\b/i.test(e)&&(t+=.2),Math.min(t,1)}const Ya=k(`promotion-engine`);var Xa=class e{running=!1;records=[];config;observationCache=new Map;stateStore;static CACHE_KEY=`promotion:observation-cache`;static MAX_CACHE_AGE_MS=720*60*60*1e3;constructor(e,t){this.config={...qa,...e},this.stateStore=t,this.hydrateFromStore().catch(e=>{Ya.warn(`Failed to hydrate observation cache from store`,{error:String(e)})})}async hydrateFromStore(){if(!this.stateStore)return;let t=this.stateStore?.stashGet(e.CACHE_KEY);if(t)try{let n=JSON.parse(t),r=Date.now();for(let[t,i]of n)r-i.lastObservedAt>e.MAX_CACHE_AGE_MS||this.observationCache.set(t,i);Ya.info(`Hydrated ${this.observationCache.size} observation records from store`)}catch(e){Ya.warn(`Failed to parse stored observation cache`,{error:String(e)})}}async persistToStore(){if(!this.stateStore)return;let t=Date.now(),n=Array.from(this.observationCache.entries()).filter(([n,r])=>t-r.lastObservedAt<=e.MAX_CACHE_AGE_MS);try{this.stateStore.stashSet(e.CACHE_KEY,JSON.stringify(n))}catch(e){Ya.warn(`Failed to persist observation cache`,{error:String(e)})}}async evaluate(e,t){this.running&&Ya.warn(`Promotion cycle already running — queueing evaluation`),this.running=!0;try{return this.evaluateInner(e,t)}finally{this.running=!1}}recordObservation(e,t){let n=Date.now(),r=this.observationCache.get(t);r?(r.observationCount++,r.lastObservedAt=n,r.sourceDiversity.includes(e.source)||r.sourceDiversity.push(e.source)):this.observationCache.set(t,{observationCount:1,firstObservedAt:n,lastObservedAt:n,sourceDiversity:e.source?[e.source]:[],userCorrectionCount:0}),this.persistToStore().catch(()=>{})}getObservationMetadata(e){return this.observationCache.get(e)??{observationCount:0,firstObservedAt:0,lastObservedAt:0,sourceDiversity:[],userCorrectionCount:0}}recordDecision(e,t){this.records.push({decision:e,factTitle:t.title,factCategory:t.category,identityKey:t.identityKey??`unknown`}),this.records.length>1e4&&this.records.splice(0,this.records.length-1e4)}isSuperseded(e){return this.records.some(t=>t.decision.status===`promoted`&&t.decision.supersededBy===e)}getStats(){let e={promoted:0,held:0,rejected:0,superseded:0,decayed:0};for(let t of this.records)e[t.decision.status]!==void 0&&e[t.decision.status]++;return{totalEvaluated:this.records.length,...e,observedFacts:this.observationCache.size,recentDecisions:this.records.slice(-10)}}reset(){this.records=[],this.observationCache.clear(),this.running=!1,this.stateStore&&this.stateStore.stashDelete(e.CACHE_KEY)}evaluateInner(e,t){let n=this.getObservationMetadata(t),r=Date.now(),i={status:`rejected`,reason:`Default: not evaluated`,timestamp:r,evidenceRefs:this.collectEvidenceRefs(e)};if(this.isSuperseded(t))return i.status=`superseded`,i.reason=`Fact superseded: identityKey "${t}" has been superseded by a newer version`,this.recordDecision(i,e),i;if(n.observationCount>0&&this.hasExceededHoldTTL(n.firstObservedAt))return i.status=`decayed`,i.reason=`Held fact exceeded max hold TTL of 30 days without reaching promotion threshold`,this.recordDecision(i,e),i;if(this.isFastPathQualified(e,n))return i.status=`promoted`,i.tier=`fast-path`,i.reason=`Fast-path: quality=${e.quality.toFixed(2)}≥${.85.toFixed(2)}, observations=${n.observationCount}≥2, sources=${n.sourceDiversity.length}≥2`,this.recordDecision(i,e),i;let a=this.computeScore(e,n);return i.score=a,a.totalScore>=45?(i.status=`promoted`,i.tier=a.totalScore>=60?`standard`:`borderline`,n.observationCount<5||n.sourceDiversity.length<2?i.reason=`Promoted (score=${a.totalScore.toFixed(1)}). Auto-inject deferred: need 5 observations (have ${n.observationCount}) and 2 sources (have ${n.sourceDiversity.length}).`:(i.tier=`standard`,i.reason=`Promoted (score=${a.totalScore.toFixed(1)}). Recurrence=${a.components.recurrence.toFixed(1)}, confidence=${a.components.confidence.toFixed(1)}, sources=${a.components.sourceDiversity.toFixed(1)}, freshness=${a.components.freshness.toFixed(1)}, actionability=${a.components.actionability.toFixed(1)}`)):a.totalScore>=25?(i.status=`held`,i.heldUntil=r+720*60*60*1e3,i.reason=`Held (score=${a.totalScore.toFixed(1)}). Below promote threshold (45) but above decay (25). Will expire ${new Date(i.heldUntil).toISOString()}.`):(i.status=`rejected`,i.reason=`Rejected (score=${a.totalScore.toFixed(1)}). Below decay threshold (25). Consider improving fact quality or recurrence.`),this.recordDecision(i,e),i}computeScore(e,t){let{recurrenceWeight:n,confidenceWeight:r,sourceDiversityWeight:i,freshnessWeight:a,actionabilityWeight:o}=this.config,s=Math.min(t.observationCount/5,1)*100,c=e.quality*100,l=Math.min(t.sourceDiversity.length/3,1)*100,u=Date.now()-t.lastObservedAt,d=Math.max(0,1-u/(10080*60*1e3))*100,f=Ja(e.content)*100,p=s*n+c*r+l*i+d*a+f*o;return{totalScore:Math.round(p*10)/10,components:{recurrence:Math.round(s*10)/10,confidence:Math.round(c*10)/10,sourceDiversity:Math.round(l*10)/10,freshness:Math.round(d*10)/10,actionability:Math.round(f*10)/10}}}isFastPathQualified(e,t){return e.quality>=.85&&t.observationCount>=2&&t.sourceDiversity.length>=2}hasExceededHoldTTL(e){return Date.now()-e>720*60*60*1e3}collectEvidenceRefs(e){let t=[];if(e.evidenceRefs)for(let n of e.evidenceRefs)t.push(`${n.sourceTool}:${n.requestId}@${n.timestamp}`);return t.length===0&&t.push(`auto:${e.source}@${Date.now()}`),t}};const W=k(`skill-compiler`),Za=new Set([`user-preference`,`collaboration`,`decision-style`,`tradeoff`,`architecture-memory`,`invariant`,`pitfall`,`prevention`,`review-gate`,`validation`,`repo-rule`,`constraint`,`tool-use`,`retrieval`]),Qa=new Set([`observation`,`source-search`,`type-pattern`,`type-error`,`type-test_failure`,`type-test-error`]);function $a(e){if(e.title&&(/^observation[ -]/i.test(e.title)||/^auto[- ]/.test(e.title)))return!0;if(!e.tags)return!1;for(let t of e.tags)if(Qa.has(t)||t.startsWith(`auto-`)||t.startsWith(`observation-`))return!0;return!1}const eo={debounceMs:5e3,backgroundQueue:!0};var to=class{skillDir;curated;getFlowState;wsRoot;config;debounceTimer=null;eventBusDisposer=null;pendingRegeneration=!1;isCompiling=!1;totalCompiles=0;failedCompiles=0;skippedCompiles=0;lastCompiledAt=null;currentVersion=1;lastSkillQuality=void 0;lastSkillQualityWarnings=[];lastSkillQualityErrors=[];flowBriefingManager;constructor(e,t={},n,r,i,a){this.skillDir=e,this.curated=r,this.getFlowState=i,this.wsRoot=a,this.config={...eo,...t},this.curated=r??null,this.flowBriefingManager=new no(this.skillDir,this.config,this.curated,this.getFlowState),this.ensureDir(),this.loadVersion()}ensureDir(){M(this.skillDir)||Oe(this.skillDir,{recursive:!0});let e=P(this.skillDir,`references`);M(e)||Oe(e,{recursive:!0})}loadVersion(){let e=P(this.skillDir,`.aikit-skill.json`);try{if(M(e)){let t=JSON.parse(N(e,`utf-8`));this.currentVersion=t.version??1}}catch{this.currentVersion=1}}saveVersion(){let e=P(this.skillDir,`.aikit-skill.json`);try{Pe(e,JSON.stringify({version:this.currentVersion,updated:new Date().toISOString()},null,2),`utf-8`)}catch(e){W.warn(`Failed to save skill manifest`,{error:String(e)})}}getStats(){let e=P(this.skillDir,Qe),t=M(e);return{lastCompiledAt:this.lastCompiledAt,isStale:t?this.isStaleFromCacheOrCheck(e):!0,isCompiling:this.isCompiling,totalCompiles:this.totalCompiles,failedCompiles:this.failedCompiles,skippedCompiles:this.skippedCompiles,skillExists:t,skillPath:t?e:null,skillSize:t?Me(e).size:0,skillVersion:this.currentVersion,pendingRegeneration:this.pendingRegeneration,skillQuality:this.lastSkillQuality,skillQualityWarnings:this.lastSkillQualityWarnings.length>0?this.lastSkillQualityWarnings:void 0,skillQualityErrors:this.lastSkillQualityErrors.length>0?this.lastSkillQualityErrors:void 0}}getWarnings(e){let t=[];return this.failedCompiles>0&&t.push(`Skill compiler: ${this.failedCompiles} failed compile(s) out of ${this.totalCompiles} total. Check logs.`),!this.getFlowState&&e&&t.push(`Skill compiler: getFlowState callback not configured — flow briefings not compiled automatically.`),this.pendingRegeneration&&t.push(`Skill compiler: regeneration is pending.`),t}readCurrentSkill(){let e=P(this.skillDir,Qe);try{return M(e)?N(e,`utf-8`):null}catch(e){return W.warn(`Failed to read current skill file`,{error:String(e)}),null}}scheduleRegeneration(e){this.debounceTimer&&clearTimeout(this.debounceTimer),W.debug(`Skill compile scheduled (trigger: ${e}, debounce: ${this.config.debounceMs}ms)`),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.executeCompile(e).catch(t=>{W.error(`Scheduled compile failed`,{error:String(t),trigger:e})})},this.config.debounceMs)}scheduleImmediateRegeneration(e){this.debounceTimer&&=(clearTimeout(this.debounceTimer),null),W.debug(`Skill compile scheduled immediate (trigger: ${e})`),setImmediate(()=>{this.executeCompile(e).catch(t=>{W.error(`Immediate compile failed`,{error:String(t),trigger:e})})})}async compileNow(e=`manual`){this.debounceTimer&&=(clearTimeout(this.debounceTimer),null),await this.executeCompile(e)}scheduleFlowBriefingRegeneration(e,t){this.flowBriefingManager.scheduleFlowBriefingRegeneration(e,t)}async deleteFlowBriefing(e){await this.flowBriefingManager.deleteFlowBriefing(e)}readFlowBriefing(e){return this.flowBriefingManager.readFlowBriefing(e)}async loadFlowDecisions(e){return this.flowBriefingManager.loadFlowDecisions(e)}resolveActiveFlowSlug(){return this.flowBriefingManager.resolveActiveFlowSlug()}dispose(){this.eventBusDisposer&&=(this.eventBusDisposer(),null),this.debounceTimer&&=(clearTimeout(this.debounceTimer),null),this.flowBriefingManager.clearDebounceTimers()}subscribeToEventBus(e){let t=[];t.push(e.subscribe({eventType:`flow:step:eventbus`,policy:`async`,name:`skill-compiler-flow-step`,handler:async e=>{let t=typeof e.flowSlug==`string`?e.flowSlug:void 0;t&&this.scheduleFlowBriefingRegeneration(t,`flow:step:eventbus`)}})),t.push(e.subscribe({eventType:`flow:complete:eventbus`,policy:`async`,name:`skill-compiler-flow-complete`,handler:async e=>{let t=typeof e.flowSlug==`string`?e.flowSlug:void 0;t&&this.scheduleFlowBriefingRegeneration(t,`flow:complete:eventbus`)}})),t.push(e.subscribe({eventType:`flow:abandon`,policy:`async`,name:`skill-compiler-flow-abandon`,handler:async e=>{let t=typeof e.flowSlug==`string`?e.flowSlug:void 0;t&&await this.deleteFlowBriefing(t)}})),t.push(e.subscribe({eventType:`reindex:done`,policy:`async`,name:`skill-compiler-reindex`,handler:async()=>{this.scheduleRegeneration(`reindex:done`)}})),t.push(e.subscribe({eventType:`knowledge:promoted`,policy:`async`,name:`skill-compiler-knowledge`,handler:async()=>{this.scheduleRegeneration(`knowledge:promoted`)}})),t.push(e.subscribe({eventType:`session:start`,policy:`async`,name:`skill-compiler-session`,handler:async()=>{this.scheduleImmediateRegeneration(`session:start`)}}));let n=()=>{for(let e of t)e()};return this.eventBusDisposer=n,n}async executeCompile(e){if(this.isCompiling){this.pendingRegeneration=!0,W.debug(`Skill compile already in progress — pending flag set`);return}this.isCompiling=!0,this.pendingRegeneration=!1;try{do{let t=Xt(await this.loadSkillInput()),n=ht(t),r=this.readCurrentSkill();if(r&&!zt(r,n)){W.debug(`Skill up to date — skipping compile`,{sourceHash:n}),this.skippedCompiles++;continue}W.info(`Skill compile starting`,{trigger:e,sourceHash:n});let i=Date.now(),a=Nt(t,this.currentVersion),o=a.validation??{quality:`pass`,errors:[],warnings:[],sections:[],visibleLearnedSectionCount:0,hasFallbackGuidance:!1};if(this.lastSkillQuality=o.quality,this.lastSkillQualityWarnings=o.warnings,this.lastSkillQualityErrors=o.errors,o.quality===`fail`){let e=this.readCurrentSkill();if(e&&e.trim().length>0&&!gt(e)&&!_t(e)&&!this.isRuntimeSlugSkill(e))W.warn(`New skill render failed quality — keeping previous good artifact`,{errors:o.errors}),this.skippedCompiles++;else{W.warn(`No previous good artifact — writing diagnostic fallback skill`,{errors:o.errors});let r=this.buildFallbackSkill(t),i=a.validation??Hn({skillMarkdown:r.skillMarkdown,referencesMarkdown:r.referencesMarkdown??``,input:t,includedSections:[],warnings:a.warnings});if(i.quality!==`fail`||!e)await this.writeSkillAtomically(r.skillMarkdown,n),r.referencesMarkdown&&await this.writeReferencesAtomically(r.referencesMarkdown);else{W.error(`Fallback skill also failed validation — writing hardcoded diagnostic`,{errors:i.errors});let e=this.buildHardcodedFallback();await this.writeSkillAtomically(e,n)}}this.lastCompiledAt=Date.now(),this.currentVersion++,this.saveVersion(),this.totalCompiles++}else await this.writeSkillAtomically(a.skillMarkdown,n),a.referencesMarkdown&&await this.writeReferencesAtomically(a.referencesMarkdown),this.lastCompiledAt=Date.now(),this.currentVersion++,this.saveVersion(),this.totalCompiles++,W.info(`Skill compile complete`,{durationMs:Date.now()-i,skillSize:a.skillMarkdown.length,refsSize:a.referencesMarkdown?.length??0,warnings:a.warnings.length,quality:o.quality});this.pendingRegeneration&&(this.pendingRegeneration=!1,W.debug(`Pending regeneration detected — recompiling`))}while(this.pendingRegeneration)}catch(t){this.failedCompiles++,W.error(`Skill compile failed`,{error:String(t),trigger:e})}finally{this.isCompiling=!1}}async loadSkillInput(){let e=[],t={workspaceName:this.resolveWorkspaceIdentity(),promotedKnowledge:e,pitfalls:[],adrSummaries:[],validationCommands:[]};if(this.populateStructuralBridge(t),this.curated)try{let[n,r,i,a,o]=await Promise.all([this.curated.list({category:`conventions`,limit:15,orderBy:`updated`,order:`desc`}),this.curated.list({category:`patterns`,limit:10,orderBy:`updated`,order:`desc`}),this.curated.list({category:`context`,limit:10,orderBy:`updated`,order:`desc`}),this.curated.list({category:`lessons`,limit:10,orderBy:`updated`,order:`desc`}),this.curated.list({category:`decisions`,limit:5,orderBy:`updated`,order:`desc`})]),s=new Set;for(let t of n)$a(t)||s.has(t.title)||(s.add(t.title),t.contentPreview&&e.push({title:t.title,insight:t.contentPreview.slice(0,200),confidence:70,category:`conventions`}));for(let e of n.slice(0,5))s.has(e.title)||e.contentPreview&&e.contentPreview.length>5&&t.pitfalls?.push(`${e.title}: ${e.contentPreview.slice(0,150)}`);for(let t of r)$a(t)||t.contentPreview&&e.push({title:t.title,insight:t.contentPreview.slice(0,200),confidence:65,category:`retrieval`});for(let t of i)$a(t)||t.contentPreview&&e.push({title:t.title,insight:t.contentPreview.slice(0,150),confidence:70,category:`context`});for(let t of a)$a(t)||t.contentPreview&&e.push({title:t.title,insight:t.contentPreview.slice(0,200),confidence:t.tags.includes(`high-confidence`)?80:60,category:`lessons`});let c=[];for(let e of i)e.contentPreview&&e.tags?.some(e=>e===`user-preference`||e===`decision-style`)&&c.push(`- **${e.title}**: ${e.contentPreview.slice(0,150)}`);c.length>0&&(t.userPreferences=c);let l=[];for(let e of[...n,...r,...i])e.contentPreview&&e.tags?.includes(`architecture-memory`)&&l.push(`- **${e.title}**: ${e.contentPreview.slice(0,150)}`);l.length>0&&(t.architectureMemory=l);let u=[];for(let e of[...n,...i,...a])e.contentPreview&&e.tags?.some(e=>e===`pitfall`||e===`prevention`)&&u.push(`- ⚠ **${e.title}**: ${e.contentPreview.slice(0,150)}`);u.length>0&&(t.preventionRules=u);let d=[];for(let e of[...n,...r,...i,...a])e.contentPreview&&e.tags?.includes(`review-gate`)&&d.push(`- ✅ **${e.title}**: ${e.contentPreview.slice(0,150)}`);d.length>0&&(t.reviewGates=d);try{let e=[...n,...r,...i,...a,...o],t=new Set;for(let n of e)if(n.tags)for(let e of n.tags)Za.has(e)||e.startsWith(`flow:`)||e.startsWith(`tool:`)||e.startsWith(`detector:`)||[`architecture`,`structure`,`analysis`,`dependencies`,`testing`].includes(e)||t.add(e);t.size>0&&W.warn(`Unknown self-improvement tags detected (check spelling):`,{tags:[...t].sort().join(`, `)})}catch{}}catch(e){W.warn(`Failed to load curated knowledge for skill`,{error:String(e)})}return t}populateStructuralBridge(e){try{let t=this.findWorkspaceRoot();if(!t)return;let n=P(t,`package.json`);if(M(n)){e.hasPackageJson=!0;try{let r=JSON.parse(N(n,`utf-8`));e.structure=`**${r.name??Fe(t)}** — Node.js project at \`${t}\``;let i=r.scripts;i&&(e.validationCommands=Object.entries(i).slice(0,8).map(([e,t])=>`${e}: ${t}`));let a=[`src/index.ts`,`src/main.ts`,`src/app.ts`,`index.ts`,`main.ts`,`app.ts`,`src/index.js`,`src/main.js`].filter(e=>M(P(t,e)));a.length>0&&(e.entryPoints=a.map(e=>`- \`${e}\``).join(`
10
+ `)}`,category:`context`,tags:[`architecture`,`entry-points`,`architecture-memory`,`invariant`],hash:R(`entry-points`),identityKey:`analyze:entry-points`,quality:.7,source:e.toolName})}if(e.toolName===`scope_map`){let r=typeof e.args.task==`string`?e.args.task:``;r&&t.length>100&&n.push({title:`Scope map: ${r.slice(0,60)}`,content:`Scope analysis for "${r}":\n${t.slice(0,500)}`,category:`context`,tags:[`planning`,`scope-map`],hash:R(`scope-${r}`),identityKey:`scope-map:${r}`,quality:.6,source:e.toolName,ttlMs:72e5})}return e.toolName===`onboard`&&t.length>200&&n.push({title:`Onboard analysis summary`,content:`Codebase onboarding analysis:\n${t.slice(0,800)}`,category:`context`,tags:[`onboarding`,`analysis`,`structure`,`architecture-memory`,`invariant`],hash:R(`onboard-summary`),identityKey:`onboard:summary`,quality:.9,source:e.toolName}),n}};function hi(e,t,n,r,i,a,o,s){return{title:e,content:t,category:`context`,tags:s,hash:R(n),identityKey:r,quality:i,ttlMs:a,source:o}}const gi={name:`context-reads`,tools:[`file_summary`,`digest`,`lookup`,`compact`,`stratum_card`],extract(e){if(e.isError)return[];let t=L(e.result);if(!t)return[];if(e.toolName===`compact`){let n=typeof e.args.path==`string`?e.args.path:void 0,r=typeof e.args.query==`string`?e.args.query:void 0;return!n||!r||t.length<100?[]:[hi(`Context: ${n} (${r.slice(0,40)})`,t.slice(0,800),`compact-${n}-${r}`,`compact:${n}:${r}`,.7,72e5,e.toolName,[`context`,`compact`,`file-read`])]}if(e.toolName===`file_summary`){let n=Array.isArray(e.args.files)?e.args.files:[],r=typeof e.args.path==`string`?e.args.path:n[0],i=typeof e.args.query==`string`?e.args.query:void 0,a=typeof e.args.tier==`string`?e.args.tier:void 0;return r?a===`T2`||i&&n.length>0?!i||t.length<100?[]:[hi(`Context: ${r} (${i.slice(0,40)})`,t.slice(0,800),`file-summary-${r}-${i}`,`file-summary:${r}:${i}`,.7,72e5,e.toolName,[`context`,`file_summary`,`file-read`])]:t.length<50?[]:[hi(`Structure: ${r}`,t,`file-summary-${r}`,`file-summary:${r}`,.65,144e5,e.toolName,[`context`,`file-summary`,`structure`])]:[]}if(e.toolName===`digest`){let n=typeof e.args.query==`string`?e.args.query:void 0;if(!n||t.length<150)return[];let r=Array.isArray(e.args.sources)?e.args.sources.map(e=>{if(!e||typeof e!=`object`)return``;let t=e.id;return typeof t==`string`?t:``}).join(`,`):``;return[hi(`Digest: ${n.slice(0,60)}`,t.slice(0,1e3),`digest-${n}-${r}`,`digest:${n}:${r}`,.75,72e5,e.toolName,[`context`,`digest`,`compression`])]}if(e.toolName===`lookup`){let n=typeof e.args.path==`string`?e.args.path:void 0;return!n||t.length<100?[]:[hi(`Indexed: ${n}`,t.slice(0,600),`lookup-${n}`,`lookup:${n}`,.5,72e5,e.toolName,[`context`,`lookup`,`file-content`])]}if(e.toolName===`stratum_card`){let n=Array.isArray(e.args.files)?e.args.files.filter(e=>typeof e==`string`):[],r=typeof e.args.query==`string`?e.args.query:``,i=typeof e.args.tier==`string`?e.args.tier:void 0;if(n.length===0||!i||t.length<50)return[];let a=n.join(`,`),o=i===`T2`?`stratum-${a}-${i}-${r}`:`stratum-${a}-${i}`;return[hi(`Card [${i}]: ${n[0]} (+${n.length-1})`,t.slice(0,600),o,`stratum:${i}:${a}:${r}`,i===`T2`?.7:.55,72e5,e.toolName,[`context`,`stratum-card`,i])]}return[]}};function _i(e,t){let n=[],r=e.toLowerCase();r.includes(`biome`)?n.push({title:`Linter: Biome`,content:`This project uses Biome for linting and formatting.`,category:`conventions`,tags:[`tooling`,`linter`,`biome`],hash:R(`convention-linter-biome`),quality:.8,source:t}):r.includes(`eslint`)&&n.push({title:`Linter: ESLint`,content:`This project uses ESLint for linting.`,category:`conventions`,tags:[`tooling`,`linter`,`eslint`],hash:R(`convention-linter-eslint`),quality:.8,source:t}),r.includes(`prettier`)&&n.push({title:`Formatter: Prettier`,content:`This project uses Prettier for code formatting.`,category:`conventions`,tags:[`tooling`,`formatter`,`prettier`],hash:R(`convention-formatter-prettier`),quality:.8,source:t}),(/strict\s*(?:mode)?.*(?:enabled|true)/i.test(e)||/"strict"\s*:\s*true/.test(e))&&n.push({title:`TypeScript strict mode enabled`,content:`This project has TypeScript strict mode enabled. Ensure all types are explicit.`,category:`conventions`,tags:[`typescript`,`strict`,`config`],hash:R(`convention-ts-strict`),quality:.8,source:t});for(let e of[`pnpm`,`yarn`,`npm`,`bun`])if(r.includes(e)&&(r.includes(`lockfile`)||r.includes(`workspace`)||r.includes(`${e} run`))){n.push({title:`Package manager: ${e}`,content:`This project uses ${e} as its package manager.`,category:`conventions`,tags:[`tooling`,`package-manager`,e],hash:R(`convention-pm-${e}`),quality:.7,source:t});break}return(r.includes(`monorepo`)||r.includes(`workspaces`)||/packages\/\w+/.test(e))&&n.push({title:`Monorepo structure detected`,content:`This project uses a monorepo structure with multiple packages.`,category:`conventions`,tags:[`architecture`,`monorepo`],hash:R(`convention-monorepo`),quality:.7,source:t}),n}function vi(e,t){let n=[],r=e.matchAll(/(?:pattern|convention):\s*(.+?)(?:\n|$)/gi);for(let e of r){let r=e[1]?.trim();r&&r.length>20&&r.length<200&&n.push({title:`Pattern: ${r.slice(0,80)}`,content:r,category:`patterns`,tags:[`detected-pattern`],hash:R(`pattern-${r}`),quality:.6,source:t})}return n}const yi={name:`convention-detection`,tools:[`check`,`analyze`,`onboard`],extract(e){let t=L(e.result);if(!t||e.isError)return[];let n=[];return n.push(..._i(t,e.toolName)),e.toolName===`analyze`&&e.args.aspect===`patterns`&&n.push(...vi(t,e.toolName)),n}};function bi(e){return e.replace(/[^a-zA-Z0-9_-]/g,``).replace(/-+/g,`-`).replace(/^-|-$/g,``)||`flow`}function xi(e){let t=e&&typeof e==`object`&&`content`in e&&Array.isArray(e.content)?e.content.filter(e=>e?.text).map(e=>e.text).join(`
11
+ `):``;if(!t)return null;try{return JSON.parse(t)}catch{return null}}function Si(e,t,n,r,i,a,o,s,c){let l=[`decision-outcomes`,`flow`];return s&&l.push(`flow:${s}`),o&&l.push(...o),{title:e,content:t,category:`flow-context`,tags:l,hash:R(n),identityKey:r,quality:i,ttlMs:288e5,source:a,workspaceId:c}}function Ci(e){let t=.5;return e.length>=80&&(t+=.1),e.length>=160&&(t+=.05),/step[s]?[:/]\s*\w+/i.test(e)&&(t+=.1),/\d+\/\d+/.test(e)&&(t+=.05),/\b(completed|skipped|outcome|success)\b/i.test(e)&&(t+=.05),/\b(decision|decided|chose|selected|because|rationale)\b/i.test(e)&&(t+=.1),/\b(artifact|produced|created|generated|file:|\.md)\b/i.test(e)&&(t+=.05),Math.min(1,Math.max(0,t))}function wi(e){return typeof e.slug==`string`&&e.slug.length>0?e.slug:null}function Ti(e){let t=Array.isArray(e.completedSteps)?e.completedSteps.filter(e=>typeof e==`string`):[],n=Array.isArray(e.skippedSteps)?e.skippedSteps.filter(e=>typeof e==`string`):[],r=typeof e.totalSteps==`number`?e.totalSteps:t.length+n.length;return{stepId:typeof e.currentStep==`string`?e.currentStep:null,phase:typeof e.phase==`string`?e.phase:null,completedSteps:t,skippedSteps:n,totalSteps:r}}const Ei={name:`decision-outcomes`,tools:[`flow`,`knowledge:remember`,`knowledge:forget`],maxFactsPerEvent:5,extract(e){if(e.isError)return[];let t=[],n=typeof e.args.action==`string`?e.args.action:``,r=xi(e.result),i=r?wi(r):null,a=i?bi(i):null;if(n===`start`){let n=typeof e.args.name==`string`?e.args.name:`unknown`,i=typeof e.args.topic==`string`?e.args.topic:void 0,o=r?Ti(r):null,s=o?.stepId??`unknown`,c=o?.totalSteps??0,l=[`Flow started: "${n}".`,i?`Topic: "${i}".`:``,`First step: ${s}.`,c>0?`Total steps: ${c}.`:``,a?`Slug: ${a}.`:``].filter(Boolean).join(` `);t.push(Si(`Flow started: ${n}${i?` — ${i}`:``}`,l,`flow-start-${a??n}`,`flow:start:${a??n}`,Ci(l),e.toolName,[`flow:start`],a??void 0,e.workspaceId))}if(n===`step`){let n=typeof e.args.advance==`string`?e.args.advance:``,i=r?Ti(r):null,o=i?.stepId??`unknown`,s=i?.completedSteps??[],c=i?.skippedSteps??[],l=i?.totalSteps??0,u=s.length+c.length,d=n===`next`?`completed`:n===`skip`?`skipped`:n===`redo`?`redone`:`transitioned`,f=n===`next`?s[s.length-1]:n===`skip`?c[c.length-1]:null,p=[`Step ${d}: ${f??(n===`redo`?o:`initial`)}.`,`Current step: ${o}.`,`Progress: ${u}/${l} steps.`,a?`Slug: ${a}.`:``].filter(Boolean);if(t.push(Si(`Step ${d}: ${f??o} (${u}/${l})`,p.join(` `),`flow-step-${a??``}-${o}-${n}`,`flow:step:${a??``}:${o}:${n}`,Ci(p.join(` `)),e.toolName,[`flow:step`,`step:${n}`],a??void 0,e.workspaceId)),l>0&&t.push(Si(`Flow progress: ${u}/${l} (${o})`,`Progress: ${u}/${l} steps completed. Completed: ${s.join(`, `)||`none`}. Skipped: ${c.join(`, `)||`none`}. Current: ${o}.`+(a?` Slug: ${a}.`:``),`flow-progress-${a??``}-${u}`,`flow:progress:${a??``}`,.75,e.toolName,[`flow:progress`],a??void 0,e.workspaceId)),r&&r.status===`completed`){let n=[`Flow completed successfully.`,`Steps: ${u}/${l}.`,`Completed: ${s.join(`, `)||`none`}.`,`Skipped: ${c.join(`, `)||`none`}.`,`Duration: ${e.durationMs}ms.`,a?`Slug: ${a}.`:``].filter(Boolean);t.push(Si(`Flow completed: ${s.length+c.length}/${l} steps done`,n.join(` `),`flow-complete-${a??``}`,`flow:complete:${a??``}`,.8,e.toolName,[`flow:complete`],a??void 0,e.workspaceId))}}if(n===`reset`){let n=r?Ti(r):null,i=[`Flow abandoned or reset.`,`Completed: ${n?.completedSteps.length??0} steps.`,`Skipped: ${n?.skippedSteps.length??0} steps.`,a?`Slug: ${a}.`:``].filter(Boolean);t.push(Si(`Flow abandoned: ${a??`unknown`}`,i.join(` `),`flow-abandon-${a??``}`,`flow:abandon:${a??``}`,.5,e.toolName,[`flow:abandon`],a??void 0,e.workspaceId))}if(e.toolName===`knowledge:remember`){let n=typeof e.args.title==`string`?e.args.title:void 0;if(!n)return t;t.push(Si(`Memory recorded: ${n.slice(0,60)}`,`Explicit memory write for "${n}". Source: ${typeof e.args.source==`string`?e.args.source:`user`}.`,`memory-remember-${n}`,`memory:remember:${R(n).slice(0,12)}`,.9,e.toolName))}if(e.toolName===`knowledge:forget`){let n=typeof e.args.title==`string`?e.args.title:void 0;if(!n)return t;t.push(Si(`Memory removed: ${n.slice(0,60)}`,`Explicit memory removal for "${n}".`,`memory-forget-${n}`,`memory:forget:${R(n).slice(0,12)}`,.7,e.toolName))}return t}};function Di(e,t){return e.match(t)?.[1]?.trim()||null}function Oi(e,t,n,r,i,a){return{title:e,content:t,category:`context`,tags:n,hash:R(r),quality:i,source:a}}const ki={name:`environment-facts`,tools:[`env`,`config`,`status`],extract(e){let t=L(e.result);if(!t)return[];let n=[],r=Di(t,/node(?:\.js)?\s*[:=]\s*([^\r\n]+)/i);r&&n.push(Oi(`Node.js version`,`Detected Node.js version: ${r}`,[`environment`,`node`],`node-version-${r}`,.4,e.toolName));let i=Di(t,/(?:^|\n)os\s*[:=]\s*([^\r\n]+)/i);i&&n.push(Oi(`Operating system`,`Detected OS: ${i}`,[`environment`,`os`],`os-${i}`,.4,e.toolName));let a=Di(t,/workspace(?: path)?\s*[:=]\s*([^\r\n]+)/i);a&&n.push(Oi(`Workspace path`,`Primary workspace path: ${a}`,[`environment`,`workspace`],`workspace-${a}`,.4,e.toolName));let o=Di(t,/store(?: backend)?\s*[:=]\s*([^\r\n]+)/i);o&&n.push(Oi(`Store backend`,`Configured store backend: ${o}`,[`environment`,`storage`],`store-${o}`,.6,e.toolName));let s=Di(t,/embedding(?: model)?\s*[:=]\s*([^\r\n]+)/i);return s&&n.push(Oi(`Embedding model`,`Configured embedding model: ${s}`,[`environment`,`embedding`],`embedding-${s}`,.6,e.toolName)),n}},Ai={"search-result":800,"file-card":2e3,analysis:1500,"step-summary":3e3},ji=[`search`,`file_summary`,`stratum_card`,`compact`,`blast_radius`,`scope_map`,`flow`],Mi={search:`search-result`,file_summary:`file-card`,stratum_card:`file-card`,compact:`analysis`,blast_radius:`analysis`,scope_map:`step-summary`,flow:`step-summary`},Ni={"search-result":72e5,"file-card":144e5,analysis:144e5,"step-summary":288e5};function Pi(e){return e.replace(/\s+/g,` `).trim()}function Fi(e){return Math.max(.6,Math.min(.8,Ir(e)))}function z(e,t=500){let n=Pi(e);return n.length<=t?n:`${n.slice(0,Math.max(0,t-3)).trimEnd()}...`}function Ii(e){return typeof e==`object`&&!!e}function Li(e){try{return JSON.parse(e)}catch{return null}}function B(e){return typeof e==`string`?Pi(e):typeof e==`number`||typeof e==`boolean`?String(e):``}function Ri(e,t=5){if(!Array.isArray(e))return[];let n=[];for(let r of e){if(n.length>=t)break;if(typeof r==`string`){let e=Pi(r);e&&n.push(e);continue}if(Ii(r)){let e=B(r.path)||B(r.sourcePath)||B(r.title)||B(r.name)||B(r.label);e&&n.push(e)}}return n}function V(e,...t){for(let n of t){let t=B(e[n]);if(t)return t}return``}function zi(e){let t=[e.file,e.path,e.files,e.changed_files,e.changedFiles].flatMap(e=>typeof e==`string`?[Pi(e)]:Ri(e,6));return[...new Set(t.filter(Boolean))].slice(0,6)}function Bi(e,t=6){let n=e.match(/(?:[A-Za-z]:[\\/]|\.\/?|\.\.[\\/]|[A-Za-z0-9_.-]+\/)[^\s,:;]+\.[A-Za-z0-9]+/g)??[];return[...new Set(n.map(e=>Pi(e)))].slice(0,t)}function Vi(e,t){return e.length===0?``:`${t}: ${e.join(`, `)}`}function Hi(e,t=3){return e.split(/\r?\n/).map(e=>Pi(e)).filter(e=>e.length>=12).slice(0,t)}function Ui(e){if(!Ii(e))return``;let t=B(e.title)||B(e.path)||B(e.sourcePath)||B(e.file),n=B(e.snippet)||B(e.preview)||B(e.content)||B(e.summary);return Pi([t,n&&`- ${n}`].filter(Boolean).join(` `))}function Wi(e,t){let n=V(e,`query`),r=Li(t);if(Ii(r)&&Array.isArray(r.results)){let e=r.results.map(e=>Ui(e)).filter(Boolean).slice(0,3);if(e.length>0)return z(`Query: ${n||`unknown`}. Top hits: ${e.join(` | `)}`,Ai[`search-result`])}let i=Hi(t,3);return z(`Query: ${n||`unknown`}. Top hits: ${i.join(` | `)}`,Ai[`search-result`])}function Gi(e,t){let n=V(e,`path`,`file`),r=Li(t);if(Ii(r)){let e=B(r.path)||n||`unknown file`,t=Ri(r.imports,4),i=Ri(r.exports,5),a=Ri(r.functions,4),o=[`File: ${e}`,Vi(i,`Exports`),Vi(t,`Imports`),Vi(a,`Functions`)].filter(Boolean);if(o.length>1)return z(o.join(`. `),Ai[`file-card`])}let i=Hi(t,4);return z(`File: ${n||`unknown file`}. Structure: ${i.join(` | `)}`,Ai[`file-card`])}function Ki(e,t){let n=zi(e),r=V(e,`tier`)||`T1`,i=Li(t);if(Ii(i)){let e=(Array.isArray(i.cards)?i.cards:[]).map(e=>Ui(e)).filter(Boolean).slice(0,3);if(e.length>0)return z(`Tier: ${r}. Files: ${n.join(`, `)||`unknown`}. Cards: ${e.join(` | `)}`,Ai[`file-card`])}let a=Hi(t,3);return z(`Tier: ${r}. Files: ${n.join(`, `)||`unknown`}. Highlights: ${a.join(` | `)}`,Ai[`file-card`])}function qi(e,t){let n=V(e,`path`,`file`),r=V(e,`query`);return z(`Path: ${n||`unknown`}. Focus: ${r||`general`}. Summary: ${t}`,Ai.analysis)}function Ji(e,t){let n=zi(e),r=Li(t),i=Ii(r)?[...Ri(r.affectedFiles,8),...Ri(r.tests,4),...Ri(r.importers,4)]:[],a=[...new Set([...i,...Bi(t,8)])].slice(0,8),o=[`Changed: ${n.join(`, `)||`unknown`}`,Vi(a,`Affected`)].filter(Boolean);return o.length>1?z(o.join(`. `),Ai.analysis):z(`Changed: ${n.join(`, `)||`unknown`}. Summary: ${t}`,Ai.analysis)}function Yi(e,t){let n=V(e,`task`),r=Li(t);if(Ii(r)){let e=Ri(r.files,6),t=typeof r.totalFiles==`number`?r.totalFiles:e.length;if(e.length>0)return z(`Task: ${n||`unknown`}. Reading plan (${t} files): ${e.join(`, `)}`,Ai[`step-summary`])}let i=Bi(t,6);return z(`Task: ${n||`unknown`}. Reading plan: ${i.join(`, `)||Hi(t,3).join(` | `)}`,Ai[`step-summary`])}function Xi(e,t){let n=V(e,`action`),r=V(e,`advance`);try{let e=JSON.parse(t),i=typeof e.slug==`string`?e.slug:``,a=typeof e.currentStep==`string`?e.currentStep:``,o=Array.isArray(e.completedSteps)?e.completedSteps.join(`, `):``,s=Array.isArray(e.skippedSteps)?e.skippedSteps.join(`, `):``;typeof e.totalSteps==`number`&&e.totalSteps;let c=typeof e.progress==`string`?e.progress:``,l=typeof e.phase==`string`?e.phase:``;return z([`Action: ${n}${r?`/${r}`:``}.`,i?`Slug: ${i}.`:``,a?`Current: ${a}.`:``,c?`Progress: ${c}.`:``,o?`Completed: ${o}.`:``,s?`Skipped: ${s}.`:``,l?`Phase: ${l}.`:``].filter(Boolean).join(` `),Ai[`step-summary`])}catch{let e=Hi(t,3);return z(`Flow action: ${n||`unknown`}. ${e.join(` | `)}`,Ai[`step-summary`])}}function Zi(e){let t=V(e,`action`),n=V(e,`name`),r=V(e,`advance`);return z(t===`start`&&n?`Flow started: ${n}`:t===`step`&&r?`Flow step: ${r}`:t===`status`?`Flow status`:t===`reset`?`Flow abandoned`:`Flow: ${t||`unknown action`}`,120)}function Qi(e){let t=V(e,`action`),n=V(e,`name`),r=V(e,`advance`);return t===`start`?`flow:start:${n||`unknown`}`:t===`step`?`flow:step:${r||`unknown`}`:t===`status`?`flow:status`:t===`reset`?`flow:reset`:`flow:${t||`unknown`}`}function $i(e,t){switch(e.toolName){case`search`:return Wi(e.args,t);case`file_summary`:return Gi(e.args,t);case`stratum_card`:return Ki(e.args,t);case`compact`:return qi(e.args,t);case`blast_radius`:return Ji(e.args,t);case`scope_map`:return Yi(e.args,t);case`flow`:return Xi(e.args,t);default:return``}}function ea(e){switch(e.toolName){case`search`:return z(`Search: ${V(e.args,`query`)||`unknown query`}`,120);case`file_summary`:return z(`File summary: ${V(e.args,`path`,`file`)||`unknown file`}`,120);case`stratum_card`:return z(`Stratum card: ${zi(e.args).join(`, `)||`unknown files`}${V(e.args,`tier`)?` (${V(e.args,`tier`)})`:``}`,120);case`compact`:return z(`Compact: ${V(e.args,`path`,`file`)||`unknown path`}${V(e.args,`query`)?` - ${V(e.args,`query`)}`:``}`,120);case`blast_radius`:return z(`Blast radius: ${zi(e.args).join(`, `)||`unknown changes`}`,120);case`scope_map`:return z(`Scope map: ${V(e.args,`task`)||`unknown task`}`,120);case`flow`:return Zi(e.args);default:return z(`Flow context: ${e.toolName}`,120)}}function ta(e){switch(e.toolName){case`search`:return`search:${V(e.args,`query`)||`unknown-query`}`;case`file_summary`:return`file-summary:${V(e.args,`path`,`file`)||`unknown-file`}`;case`stratum_card`:{let t=zi(e.args).join(`,`),n=V(e.args,`tier`)||`unknown-tier`,r=V(e.args,`query`);return`stratum:${n}:${t}${r?`:${r}`:``}`}case`compact`:{let t=V(e.args,`path`,`file`)||`unknown-path`,n=V(e.args,`query`);return`compact:${t}${n?`:${n}`:``}`}case`blast_radius`:return`blast-radius:${zi(e.args).join(`,`)||`unknown-changes`}`;case`scope_map`:return`scope-map:${V(e.args,`task`)||`unknown-task`}`;case`flow`:return Qi(e.args);default:return`${e.toolName}:generic`}}function na(e){return{name:`flow-context`,tools:[...ji],extract(t){if(t.isError)return[];let n=e();if(!n?.active||!n.slug||!(t.toolName in Mi))return[];let r=L(t.result).trim();if(r.length<50)return[];let i=Mi[t.toolName],a=$i(t,r);if(a.length<50)return[];let o=ea(t);return[{title:o,content:a,category:`flow-context`,tags:[`flow-context`,`flow:${bi(n.slug)}`,i,`tool:${t.toolName}`],hash:R(`${n.slug}|${t.toolName}|${o}|${a}`),identityKey:ta(t),quality:Fi(a),ttlMs:Ni[i],source:t.toolName}]}}}const ra={name:`research-results`,tools:[`web_search`,`web_fetch`,`search`,`find`],extract(e){let t=L(e.result);if(!t||t.length<100||e.isError)return[];let n=[];if(e.toolName===`web_search`){let r=typeof e.args.query==`string`?e.args.query:``;if(r&&t.length>200){let i=t.slice(0,800);n.push({title:`Web research: ${r.slice(0,80)}`,content:`Research query: "${r}"\n\nKey findings:\n${i}`,category:`context`,tags:[`research`,`web-search`],hash:R(`web-search-${r}`),quality:Math.min(.8,Ir(i)+.2),source:e.toolName,ttlMs:864e5})}}if(e.toolName===`web_fetch`){let r=e.args.urls,i=Array.isArray(r)?String(r[0]??``):typeof e.args.url==`string`?e.args.url:``;if(i&&t.length>200){let r=t.split(/\r?\n/).find(e=>e.trim().length>10)?.trim()??i,a=t.slice(0,600);n.push({title:`Fetched: ${r.slice(0,80)}`,content:`Source: ${i}\n\n${a}`,category:`context`,tags:[`research`,`web-fetch`],hash:R(`web-fetch-${i}`),quality:Ir(a),source:e.toolName,ttlMs:864e5})}}if(e.toolName===`search`){let r=typeof e.args.query==`string`?e.args.query:``,i=typeof e.args.origin==`string`?e.args.origin:``,a=typeof e.args.search_mode==`string`?e.args.search_mode:`hybrid`;i===`curated`&&r&&t.length>100&&n.push({title:`Curated search: ${r.slice(0,80)}`,content:`Searched curated knowledge for: "${r}"\n\nResults:\n${t.slice(0,500)}`,category:`context`,tags:[`research`,`curated-search`],hash:R(`curated-search-${r}`),quality:.5,source:e.toolName,ttlMs:36e5}),i!==`curated`&&r&&t.length>150&&n.push({title:`Search: ${r.slice(0,80)}`,content:t.slice(0,500),category:`context`,tags:[`research`,`search`,i||`hybrid`,a],hash:R(`search-${r}-${i||`hybrid`}-${a}`),quality:.5,source:e.toolName,ttlMs:36e5})}if(e.toolName===`find`){let r=typeof e.args.query==`string`?e.args.query:``,i=typeof e.args.pattern==`string`?e.args.pattern:``,a=typeof e.args.glob==`string`?e.args.glob:``,o=typeof e.args.mode==`string`?e.args.mode:``,s=r||i||a||``;s&&t.length>100&&n.push({title:o?`Find (${o}): ${s.slice(0,60)}`:`Find: ${s.slice(0,60)}`,content:t.slice(0,600),category:`context`,tags:[`research`,`find`,o||`search`],hash:R(`find-${r}-${i}-${a}-${o}`),quality:.55,source:e.toolName,ttlMs:36e5})}return n}};function ia(e,t,n,r,i,a){return{title:e,content:t,category:`conventions`,tags:[`scaffold-behavior`,`tool-patterns`],hash:R(n),identityKey:r,quality:i,ttlMs:144e5,source:a}}const aa={name:`scaffold-behavior`,tools:[`init`,`status`],maxFactsPerEvent:3,extract(e){if(e.isError)return[];let t=L(e.result);if(!t||t.length<20)return[];let n=[];if(e.toolName===`init`&&n.push(ia(`Scaffold initialized`,`Workspace scaffold initialized. Result: ${t.slice(0,200)}.`,`scaffold-init-${e.timestamp}`,`scaffold:init:${R(t).slice(0,12)}`,.6,e.toolName)),e.toolName===`status`){let r=t.includes(`Extractor`)||t.includes(`extractor`),i=t.includes(`hook`)||t.includes(`Hook`),a=t.includes(`knowledge`)||t.includes(`curated`),o=`runtime status`;r&&i&&a?o=`full capability stack`:(r||i)&&(o=`partial capability`),n.push(ia(`Scaffold capability: ${o}`,`Runtime status detected: extractors=${r}, hooks=${i}, knowledge=${a}. Result length: ${t.length} chars.`,`scaffold-status-${e.timestamp}`,`scaffold:status:${R(t).slice(0,12)}`,Math.min(.7,.3+t.length/2e3),e.toolName))}return n}};function oa(e,t,n,r,i,a,o){return{title:e,content:t,category:`workflow`,tags:[`search-strategy`,`tool-patterns`],hash:R(n),identityKey:r,quality:i,ttlMs:a,source:o}}const sa={name:`search-strategy`,tools:[`search`,`find`,`web_search`,`web_fetch`],maxFactsPerEvent:3,extract(e){if(e.isError)return[];let t=typeof e.args.query==`string`?e.args.query:typeof e.args.pattern==`string`?e.args.pattern:``;if(!t||t.length<5)return[];let n=L(e.result);if(!n||n.length<50)return[];let r=typeof e.args.limit==`number`?e.args.limit:n.split(`
12
+ `).filter(e=>e.includes(`http`)||e.startsWith(`-`)).length,i=Math.min(.9,.3+r*.05+Math.min(t.length/100,.3));return[oa(`Search strategy: ${t.slice(0,60)}`,`Effective query "${t}" returned ${r} results across ${n.length} chars. Quality ${i.toFixed(2)} — ${i>.6?`repeatable strategy`:`exploratory query`}.`,`search-strategy-${t}-${e.toolName}`,`search:${R(t).slice(0,12)}:${e.toolName}`,Math.round(i*100)/100,144e5,e.toolName)]}},ca=new Set([`neighbors`,`traverse`,`find_nodes`,`symbol360`]),la=144e5;function ua(e,t){return e.slice(0,t).trim()}function da(e,t){let n=ua(t,800);return n.length<80?[]:[{title:`Symbol: ${e}`,content:n,category:`patterns`,tags:[`architecture`,`symbol`,`definition`,`architecture-memory`,`invariant`],hash:R(`symbol-${e}`),quality:.7,ttlMs:la,source:`symbol`}]}function fa(e,t,n){let r=ua(n,800);return r.length<100?[]:[{title:`Trace ${t}: ${e}`,content:r,category:`patterns`,tags:[`architecture`,`trace`,`data-flow`,t,`architecture-memory`,`invariant`],hash:R(`trace-${e}-${t}`),quality:.75,ttlMs:la,source:`trace`}]}function pa(e,t){return e===`find_nodes`?`Graph nodes: ${t}`:e===`neighbors`?`Graph neighbors: ${t}`:e===`traverse`?`Graph traverse: ${t}`:`Symbol360: ${t}`}function ma(e,t,n,r,i){let a=ua(i,600);return a.length<50?[]:[{title:pa(e,t),content:a,category:`patterns`,tags:[`architecture`,`graph`,e],hash:R(`graph-${e}-${t}-${n}-${r}`),quality:.6,ttlMs:la,source:`graph`}]}const ha={name:`symbol-analysis`,tools:[`symbol`,`trace`,`graph`],extract(e){let t=L(e.result);if(!t||e.isError)return[];if(e.toolName===`symbol`){let n=typeof e.args.name==`string`?e.args.name:``;return n?da(n,t):[]}if(e.toolName===`trace`){let n=typeof e.args.start==`string`?e.args.start:``,r=typeof e.args.direction==`string`?e.args.direction:``;return!n||!r?[]:fa(n,r,t)}if(e.toolName===`graph`){let n=typeof e.args.action==`string`?e.args.action:``;if(!ca.has(n))return[];let r=typeof e.args.node_id==`string`?e.args.node_id:``,i=typeof e.args.name_pattern==`string`?e.args.name_pattern:``;if(n===`find_nodes`&&!i||(n===`neighbors`||n===`traverse`||n===`symbol360`)&&!r)return[];let a=typeof e.args.direction==`string`?e.args.direction:`both`,o=typeof e.args.max_depth==`number`?String(e.args.max_depth):``;return ma(n,n===`find_nodes`?i:r,a,o,t)}return[]}};function ga(e){let t=e.toLowerCase();return t.includes(`vitest`)?`vitest`:t.includes(`jest`)?`jest`:t.includes(`mocha`)?`mocha`:t.includes(`playwright`)?`playwright`:t.includes(`cypress`)?`cypress`:null}function _a(e){let t=[/(\S+\.test\.\w+)/,/(\S+\.spec\.\w+)/,/(\S+_test\.\w+)/,/__tests__\/\S+/],n=new Set;for(let r of t){let t=e.matchAll(new RegExp(r.source,`g`));for(let e of t){let t=e[0].match(/\.(test|spec)\.\w+$/);t&&n.add(t[0])}}return n.size>0?[...n].join(`, `):null}const va={name:`test-results`,tools:[`check`,`test_run`],extract(e){let t=L(e.result);if(!t)return[];let n=[],r=ga(t);r&&n.push({title:`Test framework: ${r}`,content:`This project uses ${r} for testing. Detected from ${e.toolName} output.`,category:`context`,tags:[`testing`,`environment`,r],hash:R(`test-framework-${r}`),quality:.7,source:e.toolName});let i=_a(t);return i&&n.push({title:`Test file pattern: ${i}`,content:`Test files use the naming pattern: ${i}. Follow this convention when creating new tests.`,category:`conventions`,tags:[`testing`,`naming-convention`],hash:R(`test-pattern-${i}`),quality:.7,source:e.toolName}),n}};function ya(e,t,n,r,i,a){return{title:e,content:t,category:`workflow`,tags:[`token-efficiency`,`optimization`],hash:R(n),identityKey:r,quality:i,ttlMs:144e5,source:a}}const ba={name:`token-efficiency`,tools:[`compact`,`file_summary`],maxFactsPerEvent:3,extract(e){if(e.isError)return[];let t=L(e.result);if(!t||t.length<20)return[];let n=[];if(e.toolName===`compact`){let r=typeof e.args.path==`string`?e.args.path:void 0,i=typeof e.args.query==`string`?e.args.query:``;if(!r)return[];let a=Math.max(0,1-t.length/Math.max(1,e.args.originalSize??t.length)),o=Math.min(.85,.3+a*.5);n.push(ya(`Compact savings: ${r.slice(0,50)}`,`Ref reuse for "${i}" on ${r} saved ~${Math.round(a*100)}% tokens (${t.length} chars vs original). Quality: ${(o*100).toFixed(0)}%.`,`token-efficiency-compact-${r}-${i}`,`compact:savings:${R(r).slice(0,12)}`,Math.round(o*100)/100,e.toolName))}if(e.toolName===`file_summary`){let r=Array.isArray(e.args.files)?e.args.files:[],i=typeof e.args.query==`string`?e.args.query:void 0,a=typeof e.args.tier==`string`?e.args.tier:void 0;if(a!==`T1`&&!i)return[];let o=r.length,s=Math.min(.7,.2+o*.05);n.push(ya(`File summary reuse: ${o} files`,`Used file_summary on ${o} files${i?` for "${i}"`:``} (tier: ${a??`auto`}). Result: ${t.length} chars.`,`token-efficiency-file-summary-${o}-${i??`none`}`,`file-summary:reuse:${R(r.join(`,`)).slice(0,12)}`,Math.round(s*100)/100,e.toolName))}return n}};function xa(e){let t=e.toLowerCase();return/enoent|no such file|not found/i.test(e)?{type:`missing-file`,actionable:!1}:/econnreset|econnrefused|etimedout|fetch failed/i.test(e)?{type:`network`,actionable:!1}:/permission denied|eacces/i.test(e)?{type:`permission`,actionable:!0}:/type\s*error|cannot.*property|is not a function/i.test(e)?{type:`type-error`,actionable:!0}:/syntax\s*error|unexpected token|parsing error/i.test(e)?{type:`syntax`,actionable:!0}:/out of memory|heap|allocation/i.test(e)?{type:`memory`,actionable:!0}:/timeout|timed out/i.test(e)?{type:`timeout`,actionable:t.includes(`increase`)||t.includes(`config`)}:/import|require|module not found|cannot find module/i.test(e)?{type:`module-resolution`,actionable:!0}:{type:`unknown`,actionable:e.length>100}}const Sa={name:`tool-failure-patterns`,tools:[],extract(e){if(!e.isError)return[];let t=L(e.result);if(!t||t.length<30)return[];let{type:n,actionable:r}=xa(t);if(!r)return[];let i=t.slice(0,500),a=Ir(i);return a<.2?[]:[{title:`${n} error in ${e.toolName}`,content:`Tool \`${e.toolName}\` failed with a ${n} error.\n\nArgs: ${JSON.stringify(e.args,null,2).slice(0,200)}\n\nError:\n${i}`,category:`context`,tags:[`errors`,`pitfall`,n,e.toolName],hash:R(`smart-error-${n}-${e.toolName}-${t.slice(0,80)}`),quality:Math.min(.7,a+.1),source:e.toolName,ttlMs:72e5}]}},Ca=k(`extractor-registry`),wa={defaultMaxFactsPerEvent:20,globalMaxFactsPerEvent:200};var Ta=class{extractors=[];config;constructor(e={}){this.config={...wa,...e}}register(e){this.extractors.push(e)}getExtractors(e){return this.extractors.filter(t=>t.tools.length===0?!0:t.tools.some(t=>{if(t===e||t===`*`||t===`*:*`)return!0;if(t.endsWith(`:*`)){let n=t.slice(0,-2);return e===n||e.startsWith(`${n}_`)||e.startsWith(`${n}-`)}return!1}))}extractAll(e){let t=this.getExtractors(e.toolName),n=[];for(let r of t){let i=r.maxFactsPerEvent??this.config.defaultMaxFactsPerEvent,a=r.extract(e);if(a.length>i?(Ca.warn(`Extractor "${r.name}" produced ${a.length} facts (cap: ${i}). Excess of ${a.length-i} facts discarded.`,{extractor:r.name,factsProduced:a.length,cap:i}),n.push(...a.slice(0,i))):n.push(...a),n.length>=this.config.globalMaxFactsPerEvent){let i=t.slice(t.indexOf(r)+1).map(e=>e.name);Ca.warn(`Global max facts per event reached`,{toolName:e.toolName,extractor:r.name,globalCap:this.config.globalMaxFactsPerEvent,skippedExtractors:i.length>0?i.join(`, `):void 0}),n.length=this.config.globalMaxFactsPerEvent;break}}return n}getStats(){let e={};for(let t of this.extractors)e[t.name]={tools:t.tools.length,maxFactsPerEvent:t.maxFactsPerEvent};return{count:this.extractors.length,byName:e}}reset(){this.extractors.length=0}};const Ea=new Set([`lifecycleOwnerToken`,`_ownerToken`,`ownerTokenSalt`,`ownerTokenHash`,`currentToken`]),H=k(`auto-knowledge`),Da=2e3;var Oa=class e{registry;curated;flowContextAdapter;promotionEngine;eventBus;stateStore;queue=[];timer=null;seenHashes=new Map;failedBuffer=[];maxBufferSize=50;storedCount=0;droppedCount=0;dedupedCount=0;bufferDropCount=0;collisionCount=0;promotedCount=0;evaluatedCount=0;heldCount=0;rejectedCount=0;deferredCount=0;recoveryListenerRegistered=!1;config;existingCuratedEntries=null;recoveryListener=null;constructor(e,t,n={},r,i,a,o){this.registry=e,this.curated=t,this.flowContextAdapter=r,this.promotionEngine=i,this.eventBus=a,this.stateStore=o,this.config={...Fr,...n},this.hydrateSeenHashes()}hydrateSeenHashes(){if(this.stateStore)try{let e=this.stateStore.stashGet(`auto-knowledge:seen-hashes`);if(e){let t=JSON.parse(e),n=Date.now();for(let[e,r]of t)n-r<1440*60*1e3&&this.seenHashes.set(e,r);H.info(`Hydrated ${this.seenHashes.size} seen hashes from store`)}}catch(e){H.warn(`Failed to hydrate seen hashes`,{error:String(e)})}}persistSeenHashes(){if(this.stateStore)try{let e=Array.from(this.seenHashes.entries()).filter(([e,t])=>Date.now()-t<1440*60*1e3);this.stateStore.stashSet(`auto-knowledge:seen-hashes`,JSON.stringify(e))}catch(e){H.warn(`Failed to persist seen hashes`,{error:String(e)})}}push(e){if(!(!this.config.enabled||!this.curated&&!this.flowContextAdapter)&&!(this.storedCount>=this.config.maxFactsPerSession)){if(this.queue.push(e),this.queue.length>=this.config.batchSize){this.flush().catch(e=>{H.warn(`Auto-knowledge flush error`,{error:String(e)})});return}this.scheduleBatch()}}async flush(){this.timer&&=(clearTimeout(this.timer),null);let e=this.queue.splice(0);if(e.length===0||!this.curated&&!this.flowContextAdapter)return;this.existingCuratedEntries===null&&(this.existingCuratedEntries=await this.loadExistingCuratedEntries());let t=new Map;for(let n of e)for(let e of this.registry.extractAll(n)){n.workspaceId!=null&&(e.workspaceId=n.workspaceId),e.evidenceRefs||=[];let r={sourceTool:n.toolName,requestId:n.requestId??n.toolName,timestamp:new Date(n.timestamp).getTime()};if(e.evidenceRefs.push(r),e.evidenceRefs.length>5&&(e.evidenceRefs=e.evidenceRefs.slice(e.evidenceRefs.length-5)),e.quality<this.config.minQuality){this.droppedCount++;continue}let i=this.buildFactIdentity(e);if(this.promotionEngine&&this.promotionEngine.recordObservation(e,i),this.isSeenRecently(e)){this.dedupedCount++;continue}let a=t.get(i);if(a){t.set(i,this.choosePreferredFact(a,e)),this.dedupedCount++;continue}t.set(i,e)}for(let[e,n]of t.entries()){let t;if(this.promotionEngine&&(t=await this.promotionEngine.evaluate(n,e),this.evaluatedCount++,t.status===`promoted`?this.promotedCount++:t.status===`held`?this.heldCount++:t.status===`rejected`&&this.rejectedCount++),this.storedCount>=this.config.maxFactsPerSession){t?.status===`promoted`&&this.deferredCount++;continue}let r=n.tags.includes(`flow-context`);if(!(this.promotionEngine&&!r&&t&&t.status!==`promoted`)){if(ge.instance().isDegraded(`embedder`)){H.debug?.(`Auto-knowledge embedder degraded — buffering fact`),this.bufferFact(n);continue}try{await this.storeFact(n,e)}catch(e){H.warn(`Auto-knowledge store failed — buffered for retry`,{title:n.title,error:String(e)}),this.bufferFact(n)}}}}reset(){this.queue=[],this.seenHashes.clear(),this.failedBuffer.length=0,this.storedCount=0,this.droppedCount=0,this.dedupedCount=0,this.bufferDropCount=0,this.collisionCount=0,this.promotedCount=0,this.evaluatedCount=0,this.heldCount=0,this.rejectedCount=0,this.deferredCount=0,this.existingCuratedEntries=null,this.removeRecoveryListener(),this.timer&&=(clearTimeout(this.timer),null)}getStats(){return{queued:this.queue.length,stored:this.storedCount,seen:this.seenHashes.size,dropped:this.droppedCount,deduped:this.dedupedCount,bufferSize:this.failedBuffer.length,bufferDropped:this.bufferDropCount,collisions:this.collisionCount,promoted:this.promotedCount,evaluated:this.evaluatedCount,held:this.heldCount,rejected:this.rejectedCount,deferred:this.deferredCount}}bufferFact(e){this.failedBuffer.length>=this.maxBufferSize&&(this.failedBuffer.shift(),this.bufferDropCount++),this.failedBuffer.push(e),this.ensureRecoveryListener()}ensureRecoveryListener(){if(this.recoveryListenerRegistered)return;let e=ge.instance(),t=n=>{n.subsystem===`embedder`&&(e.removeListener(`healthy`,t),this.recoveryListener=null,this.recoveryListenerRegistered=!1,this.flushBuffer().catch(e=>{H.warn(`Buffer flush failed`,{error:String(e)})}))};this.recoveryListener=t,this.recoveryListenerRegistered=!0,e.on(`healthy`,t)}removeRecoveryListener(){if(!this.recoveryListener){this.recoveryListenerRegistered=!1;return}ge.instance().removeListener(`healthy`,this.recoveryListener),this.recoveryListener=null,this.recoveryListenerRegistered=!1}async flushBuffer(){if(this.failedBuffer.length===0||!this.curated&&!this.flowContextAdapter)return;this.existingCuratedEntries===null&&(this.existingCuratedEntries=await this.loadExistingCuratedEntries()),H.info(`Flushing ${this.failedBuffer.length} buffered auto-knowledge facts`);let e=this.failedBuffer.splice(0);for(let t=0;t<e.length;t++){let n=e[t];if(n){if(this.storedCount>=this.config.maxFactsPerSession){this.failedBuffer.unshift(...e.slice(t));break}if(ge.instance().isDegraded(`embedder`)){this.failedBuffer.unshift(...e.slice(t)),this.ensureRecoveryListener();break}try{let e=this.buildFactIdentity(n),t=await this.storeFact(n,e);(t===`created`||t===`updated`)&&H.info(`Buffered fact stored on recovery`,{title:n.title,status:t})}catch(r){H.warn(`Auto-knowledge store failed — buffered for retry`,{title:n.title,error:String(r)}),this.failedBuffer.unshift(n,...e.slice(t+1)),this.ensureRecoveryListener();break}}}}isSeenRecently(e){let t=this.seenHashes.get(e.hash);return t==null?!1:e.ttlMs==null?!0:Date.now()-t<e.ttlMs}normalizeTitle(e){return e.toLowerCase().trim()}buildFactIdentity(e){let t=e.identityKey?`key:${e.identityKey}`:`hash:${e.hash||this.normalizeTitle(e.title)}`;return`${e.workspaceId?`ws:${e.workspaceId}`:`ws:global`}:${e.category}:${t}`}choosePreferredFact(e,t){return t.quality===e.quality?e:t.quality>e.quality?t:e}slugify(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``).slice(0,80)||`untitled`}resolveCuratedRelativePath(e){let t=`${e.category}/auto-${this.slugify(e.identityKey??e.title)}.md`,n=this.existingCuratedEntries??[],r=n.find(e=>e.path===t);if(r)return r.path;let i=this.normalizeTitle(e.title),a=n.filter(t=>t.category===e.category&&this.normalizeTitle(t.title)===i);return a.length===0?t:(a.sort((t,n)=>{let r=this.tagOverlapScore(n.tags,e.tags),i=this.tagOverlapScore(t.tags,e.tags);return r===i?t.path.localeCompare(n.path):r-i}),a[0]?.path??t)}resolveFlowContextRelativePath(e){return`${e.tags.find(e=>!e.startsWith(`flow:`)&&!e.startsWith(`tool:`)&&e!==`flow-context`)||`analysis`}/${this.slugify(e.identityKey??e.title)}.md`}tagOverlapScore(e,t){let n=new Set(e),r=0;for(let e of t)n.has(e)&&(r+=1);return r}markFactSeen(e){this.seenHashes.set(e.hash,Date.now()),this.persistSeenHashes()}rememberExistingCuratedFact(e,t){let n=this.existingCuratedEntries;if(!n)return;let r=n.find(t=>t.path===e);if(r){r.title=t.title,r.category=t.category,r.tags=[...t.tags];return}n.push({path:e,title:t.title,category:t.category,tags:[...t.tags]})}static OWNER_TOKEN_PATTERN=/\b[a-f0-9]{64}\b/g;applyContentBudget(e){return e.content.length<=2e3?e.content:(H.warn(`Fact "${e.title}" content truncated from ${e.content.length} to ${Da} chars`,{title:e.title,originalLength:e.content.length,maxChars:Da}),e.content.slice(0,Da-50)+`\n\n[... truncated from ${e.content.length} chars to fit budget ...]`)}async storeFact(t,n){let r=this.applyContentBudget(t).replace(e.OWNER_TOKEN_PATTERN,`[REDACTED]`),i={...t,content:r},a=i.title.toLowerCase();for(let e of Ea)if(a.includes(e.toLowerCase()))return this.dedupedCount++,`unchanged`;if(i.tags.includes(`flow-context`)&&this.flowContextAdapter){let e=this.resolveFlowContextRelativePath(i),t=`# ${i.title}\n\n${i.content}`,n=await this.flowContextAdapter.read(e);if(n===t)return this.markFactSeen(i),this.dedupedCount++,`unchanged`;await this.flowContextAdapter.write(e,t);let r=n==null?`created`:`updated`;return this.markFactSeen(i),this.storedCount++,H.info(r===`created`?`Auto-knowledge stored`:`Auto-knowledge refreshed`,{title:i.title,category:i.category,quality:i.quality,source:i.source,status:r}),r}else if(this.curated){let e=this.resolveCuratedRelativePath(i),t=`Auto-knowledge refresh from ${i.source}`,r=await this.curated.upsertAutoKnowledge(e,i.title,i.content,i.category,i.tags,t);return this.markFactSeen(i),this.rememberExistingCuratedFact(r.path,i),this.eventBus&&this.eventBus.emit({type:`knowledge:promoted`,timestamp:Date.now(),eventId:`kp-${n}-${Date.now()}`,workspaceId:i.workspaceId??`ws:global`,source:`auto-knowledge-worker`,identityKey:n,toolName:i.source,result:r.status,confidence:i.quality}),r.status===`updated`&&this.collisionCount++,r.status===`unchanged`?(this.dedupedCount++,`unchanged`):(this.storedCount++,H.info(r.status===`created`?`Auto-knowledge stored`:`Auto-knowledge refreshed`,{title:i.title,category:i.category,quality:i.quality,source:i.source,status:r.status}),r.status)}throw Error(`AutoKnowledgeWorker: curated manager must implement upsertAutoKnowledge. The remember() fallback was removed per architecture invariant #4 (identity-keyed upserts required).`)}async loadExistingCuratedEntries(){let e=this.curated;if(!e)return[];try{return(await e.list()).map(e=>({path:e.path,title:e.title,category:e.category,tags:[...e.tags]}))}catch{H.warn(`Failed to load existing curated entries for dedup`,{})}return[]}scheduleBatch(){this.timer||=setTimeout(()=>{this.timer=null,this.flush().catch(e=>{H.warn(`Auto-knowledge flush error`,{error:String(e)})})},this.config.debounceMs)}};const ka=/```/,Aa=/^\s*(?:import|export|function|class|interface|type|const|let|var|return|if|for|while|switch|try|catch|throw|await|async)\b/,ja=/=>|;\s*$|{\s*$|}\s*$|:\s*(?:string|number|boolean|unknown|void|any|Record|Array|Set|Map|Promise|ReadonlyArray)\b/;function Ma(e){let t=e.trimStart();if(t.length===0)return!1;let n=t.charAt(0);return n!==`{`&&n!==`[`?!1:n===`{`?!(!t.includes(`"`)||!t.includes(`:`)):t.length>2}function Na(e){if(Ma(e)||e.includes("```")||ka.test(e))return!0;let t=e.split(/\r?\n/u).filter(e=>e.trim().length>0);if(t.length<3)return!1;let n=0;for(let e of t)(Aa.test(e)||ja.test(e))&&(n+=1);return n/t.length>=.25}function Pa(e){let t=e.meta?.compression?.preserve??`balanced`;if(t===`exact`||Na(e.text))return{profile:`exact`,shouldCompress:!1,mode:`structural`,threshold:e.threshold,tokenBudget:e.tokenBudget,reason:t===`exact`?`tool-specific preservation profile`:`code-like output preserved verbatim`};if(t===`dense`){let t=Math.max(1,Math.floor(e.threshold*.65)),n=Math.max(1,Math.floor(e.tokenBudget*.6));return{profile:`dense`,shouldCompress:e.text.length>=t,mode:`aggressive`,threshold:t,tokenBudget:n,reason:`dense tool profile`}}return{profile:`balanced`,shouldCompress:e.text.length>=e.threshold,mode:`structural`,threshold:e.threshold,tokenBudget:e.tokenBudget,reason:`balanced tool profile`}}const Fa={search:{title:`Hybrid Search`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`search`],compression:{preserve:`dense`},planner:{costClass:`medium`,effect:`read`,indexDependency:`required`,availability:`full-only`,profileFit:[`search`],flowFit:[`orient`,`retrieve`],outputBudget:`balanced`,supportsRef:!0,supportsFreshness:!0,supportsConfidence:!0,explain:`Search codebase using hybrid vector+FTS search`}},find:{title:`Federated Find`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`search`],compression:{preserve:`dense`},planner:{costClass:`medium`,effect:`read`,indexDependency:`required`,availability:`full-only`,profileFit:[`search`],flowFit:[`orient`,`retrieve`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Multi-strategy search combining vector, FTS, glob, and regex`}},symbol:{title:`Symbol Resolver — Cross-Module Definitions & References`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`search`],compression:{preserve:`exact`},planner:{costClass:`small`,effect:`read`,indexDependency:`required`,availability:`full-only`,profileFit:[`search`],flowFit:[`retrieve`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Find symbol definitions and references across modules`}},trace:{title:`Data Flow Tracer — Cross-Module Call & Import Chains`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`search`],compression:{preserve:`exact`},planner:{costClass:`medium`,effect:`read`,indexDependency:`required`,availability:`full-only`,profileFit:[`search`],flowFit:[`analyze`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Trace data flow forward or backward across imports and call sites`}},scope_map:{title:`Task Scope Map`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`search`],compression:{preserve:`exact`},capabilities:{indexIndependent:!0},planner:{costClass:`small`,effect:`read`,indexDependency:`preferred`,availability:`full-only`,profileFit:[`search`],flowFit:[`orient`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Generate task-scoped reading plan with token estimates`}},file_summary:{title:`File Summary`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`search`,`compression`],compression:{preserve:`balanced`},capabilities:{indexIndependent:!0},planner:{costClass:`small`,effect:`read`,indexDependency:`preferred`,availability:`full-only`,profileFit:[`search`,`compression`],flowFit:[`compress`,`retrieve`],outputBudget:`rich`,supportsRef:!0,supportsFreshness:!1,supportsConfidence:!1,explain:`Get structured summary or compressed content from files`}},analyze:{title:`Analyze`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`analysis`],compression:{preserve:`exact`},planner:{costClass:`medium`,effect:`read`,indexDependency:`required`,availability:`full-only`,profileFit:[`analysis`],flowFit:[`analyze`],outputBudget:`rich`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Analyze codebase structure, dependencies, symbols, and patterns`}},blast_radius:{title:`Blast Radius`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`analysis`],compression:{preserve:`dense`},planner:{costClass:`large`,effect:`read`,indexDependency:`required`,availability:`full-only`,profileFit:[`analysis`],flowFit:[`analyze`],outputBudget:`rich`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Given changed files, trace dependency graph to find all affected files and their tests`}},knowledge:{title:`Knowledge`,annotations:{readOnlyHint:!1},category:[`knowledge`],compression:{preserve:`balanced`},capabilities:{indexIndependent:!0},planner:{costClass:`medium`,effect:`mixed`,indexDependency:`preferred`,availability:`full-only`,profileFit:[`knowledge`],flowFit:[`retrieve`,`memorize`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`Read, write, and manage curated knowledge entries and lessons`}},produce_knowledge:{title:`Produce Knowledge`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`knowledge`],compression:{preserve:`exact`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`knowledge`],flowFit:[`analyze`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Generate automated codebase analysis and synthesis instructions`}},digest:{title:`Multi-Source Digest`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`compression`],compression:{preserve:`balanced`},capabilities:{indexIndependent:!0},planner:{costClass:`medium`,effect:`read`,indexDependency:`preferred`,availability:`full-only`,profileFit:[`compression`],flowFit:[`compress`],outputBudget:`balanced`,supportsRef:!0,supportsFreshness:!1,supportsConfidence:!1,explain:`Compress multiple text sources into token-budgeted digest`}},forge_ground:{title:`FORGE Ground`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`forge`],compression:{preserve:`exact`},planner:{costClass:`large`,effect:`read`,indexDependency:`required`,availability:`full-only`,profileFit:[`forge`],flowFit:[`plan`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Execute complete FORGE Ground phase including scope map and evidence map creation`}},evidence_map:{title:`Evidence Map`,annotations:{readOnlyHint:!1},category:[`forge`],compression:{preserve:`exact`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`mixed`,indexDependency:`none`,availability:`always`,profileFit:[`forge`],flowFit:[`verify`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Track verified, assumed, and unresolved claims with gate readiness evaluation`}},present:{title:`Rich Content Presenter`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`presentation`],compression:{preserve:`balanced`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`presentation`],flowFit:[`present`],outputBudget:`rich`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Render rich content dashboards, charts, tables, and interactive surfaces`}},check:{title:`Typecheck & Lint`,annotations:{readOnlyHint:!0,openWorldHint:!0},category:[`execution`],compression:{preserve:`dense`,selfManaged:!0},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`medium`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`execution`],flowFit:[`verify`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Run incremental TypeScript typecheck and Biome lint`}},test_run:{title:`Run Tests`,annotations:{readOnlyHint:!0,openWorldHint:!0},category:[`execution`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`medium`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`execution`],flowFit:[`verify`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Run Vitest tests with structured pass/fail summary`}},eval:{title:`Evaluate Code`,annotations:{readOnlyHint:!1,openWorldHint:!0},category:[`execution`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`write`,indexDependency:`none`,availability:`always`,profileFit:[`execution`],flowFit:[`verify`,`act`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Execute JavaScript or TypeScript in a constrained VM sandbox`}},audit:{title:`Project Audit`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`execution`],compression:{preserve:`dense`,selfManaged:!0},planner:{costClass:`large`,effect:`read`,indexDependency:`required`,availability:`full-only`,profileFit:[`execution`],flowFit:[`analyze`],outputBudget:`rich`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Run unified audit across structure, dependencies, patterns, and health`}},browser:{title:`Browser Automation`,annotations:{readOnlyHint:!1,openWorldHint:!0},category:[`web`],compression:{preserve:`balanced`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`large`,effect:`mixed`,indexDependency:`none`,availability:`always`,profileFit:[`web`],flowFit:[`act`,`retrieve`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Automate web browser interactions via Chrome DevTools Protocol`}},rename:{title:`Rename Symbol`,annotations:{readOnlyHint:!1,destructiveHint:!0},category:[`manipulation`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`destructive`,indexDependency:`none`,availability:`always`,profileFit:[`manipulation`],flowFit:[`act`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Rename symbols across files with whole-word regex matching`}},restore:{title:`Restore`,annotations:{readOnlyHint:!1},category:[`manipulation`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`mixed`,indexDependency:`none`,availability:`always`,profileFit:[`manipulation`],flowFit:[`act`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`List and restore file snapshots from destructive operations`}},codemod:{title:`Codemod`,annotations:{readOnlyHint:!1,destructiveHint:!0},category:[`manipulation`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`destructive`,indexDependency:`none`,availability:`always`,profileFit:[`manipulation`],flowFit:[`act`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Apply regex-based codemod rules across files with preview`}},session:{title:`Session Manager`,annotations:{readOnlyHint:!1},category:[`session`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`mixed`,indexDependency:`none`,availability:`always`,profileFit:[`session`],flowFit:[`act`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Manage session signals, checkpoints, stashes, worksets, and lanes`}},git:{title:`Git — Context, Diff Parse, Changelog`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`git`],compression:{preserve:`exact`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`git`],flowFit:[`analyze`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Get branch, status, and commit context; parse diffs; generate changelogs`}},parse_output:{title:`Parse Build Output`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`git`],compression:{preserve:`exact`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`tiny`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`git`],flowFit:[`analyze`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Parse structured data from build tool terminal output`}},process:{title:`Process Manager`,annotations:{readOnlyHint:!1,openWorldHint:!0},category:[`process`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`mixed`,indexDependency:`none`,availability:`always`,profileFit:[`process`],flowFit:[`act`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Start, stop, inspect, and list managed child processes`}},delegate:{title:`Delegate Task`,annotations:{readOnlyHint:!1,openWorldHint:!0},category:[`process`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`small`,effect:`mixed`,indexDependency:`none`,availability:`always`,profileFit:[`process`],flowFit:[`act`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Delegate subtasks to local Ollama models`}},config:{title:`Configuration Manager`,annotations:{readOnlyHint:!1},category:[`system`],compression:{preserve:`exact`},capabilities:{indexIndependent:!0},planner:{costClass:`small`,effect:`mixed`,indexDependency:`preferred`,availability:`full-only`,profileFit:[`system`],flowFit:[`configure`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`View and update AI Kit server configuration`}},status:{title:`AI Kit Status`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`system`],compression:{preserve:`balanced`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`tiny`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`system`],flowFit:[`orient`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`Get AI Kit index status, stats, and session prelude`}},reindex:{title:`Reindex`,annotations:{readOnlyHint:!1},category:[`system`],compression:{preserve:`dense`},capabilities:{indexIndependent:!0},planner:{costClass:`medium`,effect:`write`,indexDependency:`preferred`,availability:`full-only`,profileFit:[`system`],flowFit:[`act`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Trigger incremental or full re-indexing of the AI Kit search index`}},onboard:{title:`Onboard Codebase`,annotations:{readOnlyHint:!1},category:[`system`],compression:{preserve:`dense`},capabilities:{indexIndependent:!0},planner:{costClass:`large`,effect:`write`,indexDependency:`preferred`,availability:`full-only`,profileFit:[`system`],flowFit:[`analyze`,`compress`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Onboard a codebase with full structure, dependency, and symbol analysis`}},graph:{title:`Code Knowledge Graph — Module & Symbol Relationships`,annotations:{readOnlyHint:!1},category:[`system`],compression:{preserve:`balanced`},capabilities:{indexIndependent:!0},planner:{costClass:`medium`,effect:`mixed`,indexDependency:`preferred`,availability:`full-only`,profileFit:[`system`],flowFit:[`analyze`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Query and manage the auto-populated code knowledge graph`}},replay:{title:`Replay History`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`system`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`tiny`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`system`],flowFit:[`verify`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`View or clear the MCP tool and CLI invocation audit trail`}},measure:{title:`Code Metrics`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`utilities`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`tiny`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`utilities`],flowFit:[`measure`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Measure code complexity, line counts, and function counts for files`}},env:{title:`Environment Info`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`utilities`],compression:{preserve:`exact`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`tiny`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`utilities`],flowFit:[`orient`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Get system and runtime environment information`}},web_fetch:{title:`Web Fetch`,annotations:{readOnlyHint:!0,openWorldHint:!0},category:[`web`],compression:{preserve:`balanced`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`medium`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`web`],flowFit:[`retrieve`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Fetch web URLs and convert to LLM-optimized markdown`}},web_search:{title:`Web Search`,annotations:{readOnlyHint:!0,openWorldHint:!0},category:[`web`],compression:{preserve:`balanced`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`medium`,effect:`read`,indexDependency:`none`,availability:`always`,profileFit:[`web`],flowFit:[`retrieve`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Search the web with multi-provider fan-out and consensus ranking`}},queue:{title:`Operation Queue`,annotations:{readOnlyHint:!1},category:[`queue`],compression:{preserve:`dense`},capabilities:{zeroDep:!0,indexIndependent:!0},planner:{costClass:`tiny`,effect:`mixed`,indexDependency:`none`,availability:`always`,profileFit:[`queue`],flowFit:[`act`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Manage task queues with optional DAG dependencies`}},bridge_push:{title:`Bridge Push`,annotations:{readOnlyHint:!1},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`small`,effect:`write`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`act`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Push data from the workspace to an external enterprise system via bridge`}},bridge_pull:{title:`Bridge Pull`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`small`,effect:`read`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`retrieve`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`Pull data from an external enterprise system into the workspace via bridge`}},bridge_sync:{title:`Bridge Sync Status`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`tiny`,effect:`read`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`orient`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`Check the sync status between workspace and external enterprise system via bridge`}},er_push:{title:`Enterprise Push`,annotations:{readOnlyHint:!1},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`small`,effect:`write`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`act`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Push data to enterprise repository system`}},er_pull:{title:`Enterprise Pull`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`small`,effect:`read`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`retrieve`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`Pull data from enterprise repository system`}},er_sync_status:{title:`Enterprise Sync Status`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`tiny`,effect:`read`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`orient`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`Check enterprise repository sync status`}},er_update_policy:{title:`Enterprise Update Policy`,annotations:{readOnlyHint:!1},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`small`,effect:`write`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`act`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`Update enterprise evolution policy settings`}},er_evolve_review:{title:`Enterprise Evolution Review`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`small`,effect:`read`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`analyze`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`Review enterprise evolution state and pending changes`}},evolution_state:{title:`Evolution State`,annotations:{readOnlyHint:!1},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`small`,effect:`mixed`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`analyze`,`act`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`View or update enterprise evolution state`}},policy_check:{title:`Policy Check`,annotations:{readOnlyHint:!0,idempotentHint:!0},category:[`system`],compression:{preserve:`balanced`},capabilities:{conditional:!0},planner:{costClass:`tiny`,effect:`read`,indexDependency:`none`,availability:`conditional`,profileFit:[`system`],flowFit:[`verify`],outputBudget:`lean`,supportsRef:!1,supportsFreshness:!0,supportsConfidence:!1,explain:`Check workspace content against enterprise policies`}},flow:{title:`Flow`,annotations:{readOnlyHint:!1},category:[`flow`],compression:{preserve:`balanced`},capabilities:{zeroDep:!0},planner:{costClass:`small`,effect:`mixed`,indexDependency:`none`,availability:`always`,profileFit:[`flow`],flowFit:[`plan`,`act`],outputBudget:`balanced`,supportsRef:!1,supportsFreshness:!1,supportsConfidence:!1,explain:`List, start, navigate, and manage development flow runs`}}},Ia=Object.keys(Fa).filter(e=>!Fa[e]?.capabilities?.conditional),La=new Set(Object.entries(Fa).filter(([e,t])=>t.capabilities?.zeroDep).map(([e])=>e)),Ra=new Set(Object.entries(Fa).filter(([e,t])=>t.capabilities?.indexIndependent).map(([e])=>e));function U(e){return Fa[e]??{title:e,annotations:{readOnlyHint:!1},category:[]}}function za(e){switch(e){case`efficient`:return{threshold:2e3,tokenBudget:1e3};case`full`:return{threshold:1/0};default:return{threshold:4e3,tokenBudget:2e3}}}function Ba(e){let t=e?.threshold??4e3,n=e?.tokenBudget??2e3;return async(e,r)=>{if(U(e.toolName).compression?.selfManaged)return r();let i=await r();if(!Array.isArray(i.content))return i;let a={profile:`balanced`,applied:!1,reason:`below threshold`,mode:`structural`,threshold:t,tokenBudget:n,originalChars:0,compressedChars:0,savedChars:0,compressedItems:0,preservedItems:0},o=i.content.map(r=>{if(r.type!==`text`||typeof r.text!=`string`)return r;a.originalChars+=r.text.length;let i=Pa({meta:e.meta,text:r.text,threshold:t,tokenBudget:n});if(a.profile=i.profile,a.mode=i.mode,a.threshold=i.threshold,a.tokenBudget=i.tokenBudget,a.reason=i.reason,!i.shouldCompress||r.text.length<i.threshold)return a.preservedItems+=1,a.compressedChars+=r.text.length,r;let o=mt({text:r.text,tool:e.toolName,tokenBudget:i.tokenBudget,mode:i.mode});return a.applied=!0,a.compressedItems+=1,a.compressedChars+=o.text.length,o.text===r.text?r:{...r,text:o.text}});return a.originalChars===0?i:(a.savedChars=a.originalChars-a.compressedChars,{...i,content:o,_meta:{...i._meta??{},compression:a}})}}var Va=class{baseDir;getActiveSlug;constructor(e,t){this.baseDir=e,this.getActiveSlug=t}async initialize(){await Be(this.baseDir,{recursive:!0})}async read(e){let t=this.resolveScopedPath(e);if(t==null)return null;try{return await Ve(t,`utf-8`)}catch(e){if(this.isMissingError(e))return null;throw e}}async write(e,t,n){let r=this.resolveScopedPath(e);r!=null&&(await Be(Ie(r),{recursive:!0}),await Ke(r,t,{encoding:`utf-8`,flag:n?.exclusive?`wx`:`w`}))}async delete(e){let t=this.resolveScopedPath(e);if(t==null)return!1;try{return await Ge(t),!0}catch(e){if(this.isMissingError(e))return!1;throw e}}async list(e){let t=this.getActiveSlugDir();if(t==null)return[];let n=e?this.resolveScopedPath(e):t;return n==null?[]:this.collectFiles(n,e??``)}async exists(e){let t=this.resolveScopedPath(e);if(t==null)return!1;try{return await We(t),!0}catch(e){if(this.isMissingError(e))return!1;throw e}}async listDirectories(){let e=this.getActiveSlugDir();if(e==null)return[];try{return(await He(e,{withFileTypes:!0})).filter(e=>e.isDirectory()&&/^[a-z][a-z0-9-]*$/.test(e.name)).map(e=>e.name).sort()}catch(e){if(this.isMissingError(e))return[];throw e}}async flushAll(){let e=this.getActiveSlugDir();if(e==null)return 0;let t=await this.countFiles(e);return t===0?0:(await Ue(e,{recursive:!0,force:!0}),t)}async close(){}getActiveSlugDir(){let e=this.getActiveSlug();return e?P(this.baseDir,e):null}resolveScopedPath(e){let t=this.getActiveSlugDir();if(t==null)return null;let n=F(t),r=F(n,e),i=Re(n,r);if(i===``||i===`..`||i.startsWith(`..${ze}`)||Le(i))throw Error(`Path escapes active flow context scope: ${e}`);return r}async collectFiles(e,t){let n;try{n=await He(e,{withFileTypes:!0})}catch(e){if(this.isMissingError(e))return[];throw e}let r=[];for(let i of n){let n=t?`${t}/${i.name}`:i.name,a=P(e,i.name);if(i.isDirectory()){r.push(...await this.collectFiles(a,n));continue}if(!(!i.isFile()||!i.name.endsWith(`.md`)))try{let e=await We(a);r.push({path:n,size:e.size,mtimeMs:e.mtimeMs})}catch(e){if(!this.isMissingError(e))throw e}}return r.sort((e,t)=>e.path.localeCompare(t.path))}async countFiles(e){let t;try{t=await He(e,{withFileTypes:!0})}catch(e){if(this.isMissingError(e))return 0;throw e}let n=0;for(let r of t){let t=P(e,r.name);if(r.isDirectory()){n+=await this.countFiles(t);continue}r.isFile()&&(n+=1)}return n}isMissingError(e){return typeof e==`object`&&!!e&&`code`in e&&(e.code===`ENOENT`||e.code===`ENOTDIR`)}};k(`procedural-memory`);const Ha={minSequenceLength:3,minRepetitions:3,maxSequenceLength:10,confidenceIncrement:10,confidenceDecrement:20},Ua=new Set([`status`,`guide`,`health`,`onboard`,`reindex`,`replay`,`session_digest`,`process`,`watch`,`produce_knowledge`,`list_tools`,`describe_tool`,`search_tools`]);function Wa(e){return e.join(`→`)}function Ga(e){return{...e,steps:[...e.steps]}}function Ka(e){return e.every(e=>e.success)}var qa=class{config;history=[];sequences=new Map;procedures=new Map;pendingProcedures=new Map;constructor(e=Ha){this.config=e}record(e,t){let n=new Date().toISOString();this.history.push({toolName:e,timestamp:n,success:t}),this.history.length>100&&(this.history=this.history.slice(-100));let r=this.detectSequences(n);this.updateMatchedProcedures(n,r)}getExtractableSequences(){return[...this.sequences.entries()].filter(([,e])=>e.count>=this.config.minRepetitions).map(([e,t])=>({steps:e.split(`→`),count:t.count,lastSeen:t.lastSeen})).sort((e,t)=>t.count===e.count?t.steps.length-e.steps.length:t.count-e.count)}listProcedures(){return[...this.procedures.values()].map(e=>Ga(e)).sort((e,t)=>t.occurrences===e.occurrences?t.steps.length-e.steps.length:t.occurrences-e.occurrences)}drainNewProcedures(){let e=[...this.pendingProcedures.values()].map(e=>Ga(e));return this.pendingProcedures.clear(),e}requeueProcedures(e){for(let t of e)this.pendingProcedures.set(Wa(t.steps),Ga(t))}extractProcedure(e,t){return{id:Ye(),steps:[...e],occurrences:t,confidence:Math.min(50+(t-this.config.minRepetitions)*this.config.confidenceIncrement,100),lastSeen:new Date().toISOString(),conditions:`Use when these user-facing tools are run in this order within a single session.`}}adjustConfidence(e,t){return e.confidence=t?Math.min(100,e.confidence+this.config.confidenceIncrement):Math.max(0,e.confidence-this.config.confidenceDecrement),e.confidence}getHistoryLength(){return this.history.length}clear(){this.history=[],this.sequences.clear(),this.procedures.clear(),this.pendingProcedures.clear()}detectSequences(e){let t=this.history.map(e=>e.toolName),n=Math.min(this.config.maxSequenceLength,t.length),r=new Set,i=Math.max(1,Math.min(2,this.config.minRepetitions));for(let a=this.config.minSequenceLength;a<=n;a+=1){let n=t.slice(-a),o=Wa(n),s=0;for(let e=0;e<=t.length-a;e+=1)Wa(t.slice(e,e+a))===o&&(s+=1);if(!(s<i)&&(this.sequences.set(o,{count:s,lastSeen:e}),s>=this.config.minRepetitions&&!this.procedures.has(o))){let t=this.extractProcedure(n,s);t.lastSeen=e,this.procedures.set(o,t),this.pendingProcedures.set(o,Ga(t)),r.add(o)}}return r}updateMatchedProcedures(e,t){for(let[n,r]of this.procedures.entries()){if(t.has(n))continue;let i=n.split(`→`);if(this.history.length<i.length)continue;let a=this.history.slice(-i.length);Wa(a.map(e=>e.toolName))===n&&(r.occurrences+=1,r.lastSeen=e,this.adjustConfidence(r,Ka(a)))}}};const Ja={recurrenceWeight:.3,confidenceWeight:.3,sourceDiversityWeight:.2,freshnessWeight:.1,actionabilityWeight:.1};function Ya(e){let t=0;return/\b(use|should|must|always|never|prefer|avoid|requires?)\b/i.test(e)&&(t+=.3),/```|```[\w]*\n|`\w+`|(?:^|\n)[*-] /m.test(e)&&(t+=.3),/\b\d+%|\d+\.\d+|\d+tps?\b/i.test(e)&&(t+=.2),/\b(next|todo|fixme|hack|bug|workaround)\b/i.test(e)&&(t+=.2),Math.min(t,1)}const Xa=k(`promotion-engine`);var Za=class e{running=!1;records=[];config;observationCache=new Map;stateStore;static CACHE_KEY=`promotion:observation-cache`;static MAX_CACHE_AGE_MS=720*60*60*1e3;constructor(e,t){this.config={...Ja,...e},this.stateStore=t,this.hydrateFromStore().catch(e=>{Xa.warn(`Failed to hydrate observation cache from store`,{error:String(e)})})}async hydrateFromStore(){if(!this.stateStore)return;let t=this.stateStore?.stashGet(e.CACHE_KEY);if(t)try{let n=JSON.parse(t),r=Date.now();for(let[t,i]of n)r-i.lastObservedAt>e.MAX_CACHE_AGE_MS||this.observationCache.set(t,i);Xa.info(`Hydrated ${this.observationCache.size} observation records from store`)}catch(e){Xa.warn(`Failed to parse stored observation cache`,{error:String(e)})}}async persistToStore(){if(!this.stateStore)return;let t=Date.now(),n=Array.from(this.observationCache.entries()).filter(([n,r])=>t-r.lastObservedAt<=e.MAX_CACHE_AGE_MS);try{this.stateStore.stashSet(e.CACHE_KEY,JSON.stringify(n))}catch(e){Xa.warn(`Failed to persist observation cache`,{error:String(e)})}}async evaluate(e,t){this.running&&Xa.warn(`Promotion cycle already running — queueing evaluation`),this.running=!0;try{return this.evaluateInner(e,t)}finally{this.running=!1}}recordObservation(e,t){let n=Date.now(),r=this.observationCache.get(t);r?(r.observationCount++,r.lastObservedAt=n,r.sourceDiversity.includes(e.source)||r.sourceDiversity.push(e.source)):this.observationCache.set(t,{observationCount:1,firstObservedAt:n,lastObservedAt:n,sourceDiversity:e.source?[e.source]:[],userCorrectionCount:0}),this.persistToStore().catch(()=>{})}getObservationMetadata(e){return this.observationCache.get(e)??{observationCount:0,firstObservedAt:0,lastObservedAt:0,sourceDiversity:[],userCorrectionCount:0}}recordDecision(e,t){this.records.push({decision:e,factTitle:t.title,factCategory:t.category,identityKey:t.identityKey??`unknown`}),this.records.length>1e4&&this.records.splice(0,this.records.length-1e4)}isSuperseded(e){return this.records.some(t=>t.decision.status===`promoted`&&t.decision.supersededBy===e)}getStats(){let e={promoted:0,held:0,rejected:0,superseded:0,decayed:0};for(let t of this.records)e[t.decision.status]!==void 0&&e[t.decision.status]++;return{totalEvaluated:this.records.length,...e,observedFacts:this.observationCache.size,recentDecisions:this.records.slice(-10)}}reset(){this.records=[],this.observationCache.clear(),this.running=!1,this.stateStore&&this.stateStore.stashDelete(e.CACHE_KEY)}evaluateInner(e,t){let n=this.getObservationMetadata(t),r=Date.now(),i={status:`rejected`,reason:`Default: not evaluated`,timestamp:r,evidenceRefs:this.collectEvidenceRefs(e)};if(this.isSuperseded(t))return i.status=`superseded`,i.reason=`Fact superseded: identityKey "${t}" has been superseded by a newer version`,this.recordDecision(i,e),i;if(n.observationCount>0&&this.hasExceededHoldTTL(n.firstObservedAt))return i.status=`decayed`,i.reason=`Held fact exceeded max hold TTL of 30 days without reaching promotion threshold`,this.recordDecision(i,e),i;if(this.isFastPathQualified(e,n))return i.status=`promoted`,i.tier=`fast-path`,i.reason=`Fast-path: quality=${e.quality.toFixed(2)}≥${.85.toFixed(2)}, observations=${n.observationCount}≥2, sources=${n.sourceDiversity.length}≥2`,this.recordDecision(i,e),i;let a=this.computeScore(e,n);return i.score=a,a.totalScore>=45?(i.status=`promoted`,i.tier=a.totalScore>=60?`standard`:`borderline`,n.observationCount<5||n.sourceDiversity.length<2?i.reason=`Promoted (score=${a.totalScore.toFixed(1)}). Auto-inject deferred: need 5 observations (have ${n.observationCount}) and 2 sources (have ${n.sourceDiversity.length}).`:(i.tier=`standard`,i.reason=`Promoted (score=${a.totalScore.toFixed(1)}). Recurrence=${a.components.recurrence.toFixed(1)}, confidence=${a.components.confidence.toFixed(1)}, sources=${a.components.sourceDiversity.toFixed(1)}, freshness=${a.components.freshness.toFixed(1)}, actionability=${a.components.actionability.toFixed(1)}`)):a.totalScore>=25?(i.status=`held`,i.heldUntil=r+720*60*60*1e3,i.reason=`Held (score=${a.totalScore.toFixed(1)}). Below promote threshold (45) but above decay (25). Will expire ${new Date(i.heldUntil).toISOString()}.`):(i.status=`rejected`,i.reason=`Rejected (score=${a.totalScore.toFixed(1)}). Below decay threshold (25). Consider improving fact quality or recurrence.`),this.recordDecision(i,e),i}computeScore(e,t){let{recurrenceWeight:n,confidenceWeight:r,sourceDiversityWeight:i,freshnessWeight:a,actionabilityWeight:o}=this.config,s=Math.min(t.observationCount/5,1)*100,c=e.quality*100,l=Math.min(t.sourceDiversity.length/3,1)*100,u=Date.now()-t.lastObservedAt,d=Math.max(0,1-u/(10080*60*1e3))*100,f=Ya(e.content)*100,p=s*n+c*r+l*i+d*a+f*o;return{totalScore:Math.round(p*10)/10,components:{recurrence:Math.round(s*10)/10,confidence:Math.round(c*10)/10,sourceDiversity:Math.round(l*10)/10,freshness:Math.round(d*10)/10,actionability:Math.round(f*10)/10}}}isFastPathQualified(e,t){return e.quality>=.85&&t.observationCount>=2&&t.sourceDiversity.length>=2}hasExceededHoldTTL(e){return Date.now()-e>720*60*60*1e3}collectEvidenceRefs(e){let t=[];if(e.evidenceRefs)for(let n of e.evidenceRefs)t.push(`${n.sourceTool}:${n.requestId}@${n.timestamp}`);return t.length===0&&t.push(`auto:${e.source}@${Date.now()}`),t}};const W=k(`skill-compiler`),Qa=new Set([`user-preference`,`collaboration`,`decision-style`,`tradeoff`,`architecture-memory`,`invariant`,`pitfall`,`prevention`,`review-gate`,`validation`,`repo-rule`,`constraint`,`tool-use`,`retrieval`]),$a=new Set([`observation`,`source-search`,`type-pattern`,`type-error`,`type-test_failure`,`type-test-error`]);function eo(e){if(e.title&&(/^observation[ -]/i.test(e.title)||/^auto[- ]/.test(e.title)))return!0;if(!e.tags)return!1;for(let t of e.tags)if($a.has(t)||t.startsWith(`auto-`)||t.startsWith(`observation-`))return!0;return!1}const to={debounceMs:5e3,backgroundQueue:!0};var no=class{skillDir;curated;getFlowState;wsRoot;config;debounceTimer=null;eventBusDisposer=null;pendingRegeneration=!1;isCompiling=!1;totalCompiles=0;failedCompiles=0;skippedCompiles=0;lastCompiledAt=null;currentVersion=1;lastSkillQuality=void 0;lastSkillQualityWarnings=[];lastSkillQualityErrors=[];flowBriefingManager;constructor(e,t={},n,r,i,a){this.skillDir=e,this.curated=r,this.getFlowState=i,this.wsRoot=a,this.config={...to,...t},this.curated=r??null,this.flowBriefingManager=new ro(this.skillDir,this.config,this.curated,this.getFlowState),this.ensureDir(),this.loadVersion()}ensureDir(){M(this.skillDir)||Oe(this.skillDir,{recursive:!0});let e=P(this.skillDir,`references`);M(e)||Oe(e,{recursive:!0})}loadVersion(){let e=P(this.skillDir,`.aikit-skill.json`);try{if(M(e)){let t=JSON.parse(N(e,`utf-8`));this.currentVersion=t.version??1}}catch{this.currentVersion=1}}saveVersion(){let e=P(this.skillDir,`.aikit-skill.json`);try{Pe(e,JSON.stringify({version:this.currentVersion,updated:new Date().toISOString()},null,2),`utf-8`)}catch(e){W.warn(`Failed to save skill manifest`,{error:String(e)})}}getStats(){let e=P(this.skillDir,Qe),t=M(e);return{lastCompiledAt:this.lastCompiledAt,isStale:t?this.isStaleFromCacheOrCheck(e):!0,isCompiling:this.isCompiling,totalCompiles:this.totalCompiles,failedCompiles:this.failedCompiles,skippedCompiles:this.skippedCompiles,skillExists:t,skillPath:t?e:null,skillSize:t?Me(e).size:0,skillVersion:this.currentVersion,pendingRegeneration:this.pendingRegeneration,skillQuality:this.lastSkillQuality,skillQualityWarnings:this.lastSkillQualityWarnings.length>0?this.lastSkillQualityWarnings:void 0,skillQualityErrors:this.lastSkillQualityErrors.length>0?this.lastSkillQualityErrors:void 0}}getWarnings(e){let t=[];return this.failedCompiles>0&&t.push(`Skill compiler: ${this.failedCompiles} failed compile(s) out of ${this.totalCompiles} total. Check logs.`),!this.getFlowState&&e&&t.push(`Skill compiler: getFlowState callback not configured — flow briefings not compiled automatically.`),this.pendingRegeneration&&t.push(`Skill compiler: regeneration is pending.`),t}readCurrentSkill(){let e=P(this.skillDir,Qe);try{return M(e)?N(e,`utf-8`):null}catch(e){return W.warn(`Failed to read current skill file`,{error:String(e)}),null}}scheduleRegeneration(e){this.debounceTimer&&clearTimeout(this.debounceTimer),W.debug(`Skill compile scheduled (trigger: ${e}, debounce: ${this.config.debounceMs}ms)`),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.executeCompile(e).catch(t=>{W.error(`Scheduled compile failed`,{error:String(t),trigger:e})})},this.config.debounceMs)}scheduleImmediateRegeneration(e){this.debounceTimer&&=(clearTimeout(this.debounceTimer),null),W.debug(`Skill compile scheduled immediate (trigger: ${e})`),setImmediate(()=>{this.executeCompile(e).catch(t=>{W.error(`Immediate compile failed`,{error:String(t),trigger:e})})})}async compileNow(e=`manual`){this.debounceTimer&&=(clearTimeout(this.debounceTimer),null),await this.executeCompile(e)}scheduleFlowBriefingRegeneration(e,t){this.flowBriefingManager.scheduleFlowBriefingRegeneration(e,t)}async deleteFlowBriefing(e){await this.flowBriefingManager.deleteFlowBriefing(e)}readFlowBriefing(e){return this.flowBriefingManager.readFlowBriefing(e)}async loadFlowDecisions(e){return this.flowBriefingManager.loadFlowDecisions(e)}resolveActiveFlowSlug(){return this.flowBriefingManager.resolveActiveFlowSlug()}dispose(){this.eventBusDisposer&&=(this.eventBusDisposer(),null),this.debounceTimer&&=(clearTimeout(this.debounceTimer),null),this.flowBriefingManager.clearDebounceTimers()}subscribeToEventBus(e){let t=[];t.push(e.subscribe({eventType:`flow:step:eventbus`,policy:`async`,name:`skill-compiler-flow-step`,handler:async e=>{let t=typeof e.flowSlug==`string`?e.flowSlug:void 0;t&&this.scheduleFlowBriefingRegeneration(t,`flow:step:eventbus`)}})),t.push(e.subscribe({eventType:`flow:complete:eventbus`,policy:`async`,name:`skill-compiler-flow-complete`,handler:async e=>{let t=typeof e.flowSlug==`string`?e.flowSlug:void 0;t&&this.scheduleFlowBriefingRegeneration(t,`flow:complete:eventbus`)}})),t.push(e.subscribe({eventType:`flow:abandon`,policy:`async`,name:`skill-compiler-flow-abandon`,handler:async e=>{let t=typeof e.flowSlug==`string`?e.flowSlug:void 0;t&&await this.deleteFlowBriefing(t)}})),t.push(e.subscribe({eventType:`reindex:done`,policy:`async`,name:`skill-compiler-reindex`,handler:async()=>{this.scheduleRegeneration(`reindex:done`)}})),t.push(e.subscribe({eventType:`knowledge:promoted`,policy:`async`,name:`skill-compiler-knowledge`,handler:async()=>{this.scheduleRegeneration(`knowledge:promoted`)}})),t.push(e.subscribe({eventType:`session:start`,policy:`async`,name:`skill-compiler-session`,handler:async()=>{this.scheduleImmediateRegeneration(`session:start`)}}));let n=()=>{for(let e of t)e()};return this.eventBusDisposer=n,n}async executeCompile(e){if(this.isCompiling){this.pendingRegeneration=!0,W.debug(`Skill compile already in progress — pending flag set`);return}this.isCompiling=!0,this.pendingRegeneration=!1;try{do{let t=Xt(await this.loadSkillInput()),n=ht(t),r=this.readCurrentSkill();if(r&&!zt(r,n)){W.debug(`Skill up to date — skipping compile`,{sourceHash:n}),this.skippedCompiles++;continue}W.info(`Skill compile starting`,{trigger:e,sourceHash:n});let i=Date.now(),a=Nt(t,this.currentVersion),o=a.validation??{quality:`pass`,errors:[],warnings:[],sections:[],visibleLearnedSectionCount:0,hasFallbackGuidance:!1};if(this.lastSkillQuality=o.quality,this.lastSkillQualityWarnings=o.warnings,this.lastSkillQualityErrors=o.errors,o.quality===`fail`){let e=this.readCurrentSkill();if(e&&e.trim().length>0&&!gt(e)&&!_t(e)&&!this.isRuntimeSlugSkill(e))W.warn(`New skill render failed quality — keeping previous good artifact`,{errors:o.errors}),this.skippedCompiles++;else{W.warn(`No previous good artifact — writing diagnostic fallback skill`,{errors:o.errors});let r=this.buildFallbackSkill(t),i=a.validation??Hn({skillMarkdown:r.skillMarkdown,referencesMarkdown:r.referencesMarkdown??``,input:t,includedSections:[],warnings:a.warnings});if(i.quality!==`fail`||!e)await this.writeSkillAtomically(r.skillMarkdown,n),r.referencesMarkdown&&await this.writeReferencesAtomically(r.referencesMarkdown);else{W.error(`Fallback skill also failed validation — writing hardcoded diagnostic`,{errors:i.errors});let e=this.buildHardcodedFallback();await this.writeSkillAtomically(e,n)}}this.lastCompiledAt=Date.now(),this.currentVersion++,this.saveVersion(),this.totalCompiles++}else await this.writeSkillAtomically(a.skillMarkdown,n),a.referencesMarkdown&&await this.writeReferencesAtomically(a.referencesMarkdown),this.lastCompiledAt=Date.now(),this.currentVersion++,this.saveVersion(),this.totalCompiles++,W.info(`Skill compile complete`,{durationMs:Date.now()-i,skillSize:a.skillMarkdown.length,refsSize:a.referencesMarkdown?.length??0,warnings:a.warnings.length,quality:o.quality});this.pendingRegeneration&&(this.pendingRegeneration=!1,W.debug(`Pending regeneration detected — recompiling`))}while(this.pendingRegeneration)}catch(t){this.failedCompiles++,W.error(`Skill compile failed`,{error:String(t),trigger:e})}finally{this.isCompiling=!1}}async loadSkillInput(){let e=[],t={workspaceName:this.resolveWorkspaceIdentity(),promotedKnowledge:e,pitfalls:[],adrSummaries:[],validationCommands:[]};if(this.populateStructuralBridge(t),this.curated)try{let[n,r,i,a,o]=await Promise.all([this.curated.list({category:`conventions`,limit:15,orderBy:`updated`,order:`desc`}),this.curated.list({category:`patterns`,limit:10,orderBy:`updated`,order:`desc`}),this.curated.list({category:`context`,limit:10,orderBy:`updated`,order:`desc`}),this.curated.list({category:`lessons`,limit:10,orderBy:`updated`,order:`desc`}),this.curated.list({category:`decisions`,limit:5,orderBy:`updated`,order:`desc`})]),s=new Set;for(let t of n)eo(t)||s.has(t.title)||(s.add(t.title),t.contentPreview&&e.push({title:t.title,insight:t.contentPreview.slice(0,200),confidence:70,category:`conventions`}));for(let e of n.slice(0,5))s.has(e.title)||e.contentPreview&&e.contentPreview.length>5&&t.pitfalls?.push(`${e.title}: ${e.contentPreview.slice(0,150)}`);for(let t of r)eo(t)||t.contentPreview&&e.push({title:t.title,insight:t.contentPreview.slice(0,200),confidence:65,category:`retrieval`});for(let t of i)eo(t)||t.contentPreview&&e.push({title:t.title,insight:t.contentPreview.slice(0,150),confidence:70,category:`context`});for(let t of a)eo(t)||t.contentPreview&&e.push({title:t.title,insight:t.contentPreview.slice(0,200),confidence:t.tags.includes(`high-confidence`)?80:60,category:`lessons`});let c=[];for(let e of i)e.contentPreview&&e.tags?.some(e=>e===`user-preference`||e===`decision-style`)&&c.push(`- **${e.title}**: ${e.contentPreview.slice(0,150)}`);c.length>0&&(t.userPreferences=c);let l=[];for(let e of[...n,...r,...i])e.contentPreview&&e.tags?.includes(`architecture-memory`)&&l.push(`- **${e.title}**: ${e.contentPreview.slice(0,150)}`);l.length>0&&(t.architectureMemory=l);let u=[];for(let e of[...n,...i,...a])e.contentPreview&&e.tags?.some(e=>e===`pitfall`||e===`prevention`)&&u.push(`- ⚠ **${e.title}**: ${e.contentPreview.slice(0,150)}`);u.length>0&&(t.preventionRules=u);let d=[];for(let e of[...n,...r,...i,...a])e.contentPreview&&e.tags?.includes(`review-gate`)&&d.push(`- ✅ **${e.title}**: ${e.contentPreview.slice(0,150)}`);d.length>0&&(t.reviewGates=d);try{let e=[...n,...r,...i,...a,...o],t=new Set;for(let n of e)if(n.tags)for(let e of n.tags)Qa.has(e)||e.startsWith(`flow:`)||e.startsWith(`tool:`)||e.startsWith(`detector:`)||[`architecture`,`structure`,`analysis`,`dependencies`,`testing`].includes(e)||t.add(e);t.size>0&&W.warn(`Unknown self-improvement tags detected (check spelling):`,{tags:[...t].sort().join(`, `)})}catch{}}catch(e){W.warn(`Failed to load curated knowledge for skill`,{error:String(e)})}return t}populateStructuralBridge(e){try{let t=this.findWorkspaceRoot();if(!t)return;let n=P(t,`package.json`);if(M(n)){e.hasPackageJson=!0;try{let r=JSON.parse(N(n,`utf-8`));e.structure=`**${r.name??Fe(t)}** — Node.js project at \`${t}\``;let i=r.scripts;i&&(e.validationCommands=Object.entries(i).slice(0,8).map(([e,t])=>`${e}: ${t}`));let a=[`src/index.ts`,`src/main.ts`,`src/app.ts`,`index.ts`,`main.ts`,`app.ts`,`src/index.js`,`src/main.js`].filter(e=>M(P(t,e)));a.length>0&&(e.entryPoints=a.map(e=>`- \`${e}\``).join(`
13
13
  `))}catch{W.warn(`Failed to parse package.json — structural bridge degraded`)}}if(!e.structure){let n=ke(t,{withFileTypes:!0}),r=n.filter(e=>e.isDirectory()).map(e=>`- ${e.name}/`),i=n.filter(e=>e.isFile()).map(e=>`- ${e.name}`);(r.length>0||i.length>0)&&(e.structure=`**${Fe(t)}** workspace\n\n**Directories:**\n${r.slice(0,12).join(`
14
14
  `)}\n\n**Key files:**\n${i.slice(0,8).join(`
15
15
  `)}`)}}catch{W.warn(`Structural bridge failed — continuing with curated knowledge only`)}}findWorkspaceRoot(){let e=[];this.wsRoot&&e.push(this.wsRoot),e.push(Ie(this.skillDir)),e.push(Ie(Ie(this.skillDir)));for(let t of e)try{if(t&&M(P(t,`package.json`)))return t}catch{}return null}resolveWorkspaceIdentity(){if(this.wsRoot)try{let e=P(this.wsRoot,`package.json`);if(M(e)){let t=JSON.parse(N(e,`utf-8`));if(t.name&&typeof t.name==`string`&&t.name.length>0)return t.name}}catch{}let e=this.findWorkspaceRoot();if(e){try{let t=JSON.parse(N(P(e,`package.json`),`utf-8`));if(t.name&&typeof t.name==`string`&&t.name.length>0)return t.name}catch{}return Fe(e)}let t=Fe(Ie(this.skillDir));return/^[a-z]{2}-[a-f0-9]{8,}$/.test(t)?`unknown-target-workspace`:t}async writeSkillAtomically(e,t){let n=P(this.skillDir,Qe),r=P(this.skillDir,`.SKILL.tmp`),i=P(this.skillDir,`.SKILL.backup.md`);if(M(n))try{De(n,i)}catch{}if(Pe(r,e,`utf-8`),Ae(r,n),M(i))try{Date.now()-Me(i).mtimeMs>10080*60*1e3&&Ne(i)}catch{}}async writeReferencesAtomically(e){let t=P(this.skillDir,`references`);M(t)||Oe(t,{recursive:!0});let n=P(t,`workspace-memory.md`),r=P(t,`.workspace-memory.tmp`);Pe(r,e,`utf-8`),Ae(r,n)}isStaleFromCacheOrCheck(e){try{return!N(e,`utf-8`).match(/^---\n[\s\S]*?\n---\n/)}catch{return!0}}isRuntimeSlugSkill(e){let t=e.match(/\*\*([^*]+)\*\*/);if(!t)return!1;let n=t[1].trim();return Ze.test(n)||/^partition:/i.test(n)||n===`unknown`}buildHardcodedFallback(){return[`---`,`name: fallback-diagnostic`,`version: 1`,`schema_version: 2`,`updated: ${new Date().toISOString()}`,`sections: [critical-constraints, getting-started]`,`_generated_by: workspace-skill-compiler`,`---`,``,`## Critical Constraints`,``,`- Workspace: **workspace**`,``,`---`,``,`## Getting Started`,``,`- The workspace skill could not be generated.`,"- Check `status({ includePrelude: true })` for quality errors.",`- Ensure auto-knowledge and promotion pipelines are functional.`,'- Use `knowledge({ action: "remember", ... })` to persist durable facts.',``].join(`
16
- `)}buildFallbackSkill(e){let t=e.workspaceName||`workspace`,n=Nt({workspaceName:Ze.test(t)||/^partition:/i.test(t)?`workspace`:t,structure:e.structure,hasPackageJson:e.hasPackageJson,validationCommands:e.validationCommands,entryPoints:e.entryPoints,dependencies:e.dependencies,symbols:e.symbols,promotedKnowledge:[],pitfalls:[],adrSummaries:[],userPreferences:[],architectureMemory:[],preventionRules:[],reviewGates:[]},this.currentVersion);return{skillMarkdown:n.skillMarkdown,referencesMarkdown:n.referencesMarkdown}}},no=class{skillDir;config;curated;getFlowState;debounceTimers=new Map;compilingSlugs=new Set;pendingFlowBriefings=new Set;constructor(e,t,n,r){this.skillDir=e,this.config=t,this.curated=n,this.getFlowState=r}scheduleFlowBriefingRegeneration(e,t){let n=this.debounceTimers.get(e);n&&clearTimeout(n),W.debug(`Flow briefing regeneration scheduled for slug ${e} (trigger: ${t})`);let r=setTimeout(()=>{this.debounceTimers.delete(e),this.executeFlowBriefingCompile(e,t)},this.config.debounceMs);this.debounceTimers.set(e,r)}async deleteFlowBriefing(e){let t=yi(e),n=P(this.skillDir,`references`,`flow-${t}.md`);try{M(n)&&(Ne(n),W.debug(`Flow briefing deleted for slug ${e}`))}catch(t){W.warn(`Failed to delete flow briefing`,{slug:e,error:String(t)})}}readFlowBriefing(e){let t=yi(e),n=P(this.skillDir,`references`,`flow-${t}.md`);try{if(!M(n))return null;let e=N(n,`utf-8`);return e.length>0?e:null}catch{return null}}async executeFlowBriefingCompile(e,t){if(!this.getFlowState){W.warn(`getFlowState not configured — skipping flow briefing compile`,{slug:e});return}let n=yi(e);if(this.compilingSlugs.has(n)){this.pendingFlowBriefings.add(n),W.debug(`Flow briefing already compiling for ${n} — pending flag set`);return}this.compilingSlugs.add(n);try{let r=await this.getFlowState(e);if(!r?.flow){W.debug(`No active flow state — skipping flow briefing compile`,{slug:e});return}let i=await this.loadFlowDecisions(e),a=(r.completedSteps??[]).map(e=>({id:e,outcome:`completed`,summary:void 0,producedArtifacts:[]})),o=(r.skippedSteps??[]).map(e=>({id:e,outcome:`skipped`,summary:void 0,producedArtifacts:[]})),s=r.stepSequence??[],c=Mt({flowName:r.flow,slug:e,topic:r.topic??``,objective:r.objective,currentStep:r.currentStep,completedSteps:[...a,...o],totalSteps:s.length||a.length||1,decisions:i.map(e=>({title:e.title,summary:e.summary})),phase:r.phase??`flow`,stepSequence:s,acceptanceCriteria:r.acceptanceCriteria,scope:r.scope,exclusions:r.exclusions}),l=P(this.skillDir,`references`);M(l)||Oe(l,{recursive:!0});let u=P(l,`flow-${n}.md`),d=P(l,`.flow-${n}.tmp`);Pe(d,c,`utf-8`),Ae(d,u),W.info(`Flow briefing compiled`,{slug:e,trigger:t,size:c.length})}catch(t){W.error(`Flow briefing compile failed`,{slug:e,error:String(t)})}finally{this.compilingSlugs.delete(n),this.pendingFlowBriefings.has(n)&&(this.pendingFlowBriefings.delete(n),this.scheduleFlowBriefingRegeneration(e,t))}}async loadFlowDecisions(e){if(!this.curated)return[];try{let t=await this.curated.list({category:`flow-context`,limit:20,orderBy:`updated`,order:`desc`}),n=yi(e);return t.filter(e=>e.tags?.includes(`flow:${n}`)&&e.contentPreview&&e.contentPreview.length>10).map(e=>({title:e.title,summary:e.contentPreview.slice(0,200)}))}catch{return[]}}resolveActiveFlowSlug(){let e=P(this.skillDir,`references`);try{if(!M(e))return null;let t=ke(e).filter(e=>e.startsWith(`flow-`)&&e.endsWith(`.md`)).map(t=>({slug:t.replace(/^flow-/,``).replace(/\.md$/,``),mtime:Me(P(e,t)).mtimeMs})).sort((e,t)=>t.mtime-e.mtime);return t.length>0?t[0].slug:null}catch{return null}}clearDebounceTimers(){for(let e of this.debounceTimers.values())clearTimeout(e);this.debounceTimers.clear()}};const ro=k(`event-bus`);function io(e,t){if(typeof e!=`object`||!e)return e;t??=new WeakSet;let n=e;if(t.has(n))return e;t.add(n);let r=Object.getOwnPropertyNames(n);for(let n of r){let r=e[n];r&&typeof r==`object`&&io(r,t)}return Object.freeze(e)}const ao=[`compression`,`hookDebug`,`origin`,`workspace`];var oo=class{subscribers=new Map;subById=new Map;subCounter=0;failureCounts=new Map;consecutiveFailures=new Map;lastErrors=new Map;autoDisabled=new Map;subscribe(e){let t=e.id||`sub_${++this.subCounter}`,n={...e,id:t},r=this.subscribers.get(e.eventType);return r?r.push(n):this.subscribers.set(e.eventType,[n]),this.subById.set(t,e.eventType),ro.debug(`Subscriber registered`,{id:n.id,eventType:e.eventType}),()=>this.unsubscribe(t)}unsubscribe(e){let t=this.subById.get(e);if(!t)return;this.subById.delete(e);let n=this.subscribers.get(t);if(!n)return;let r=n.findIndex(t=>t.id===e);r!==-1&&(n.splice(r,1),n.length===0&&this.subscribers.delete(t)),ro.debug(`Subscriber unregistered`,{id:e,eventType:t})}emit(e){let t=this.subscribers.get(e.type);if(!(!t||t.length===0)){this.validateMeta(e.meta),io(e);for(let n=0;n<t.length;n+=10){let r=t.slice(n,n+10);queueMicrotask(()=>{for(let t of r)this.executeSubscriber(t,e)})}}}executeSubscriber(e,t){e.id&&this.autoDisabled.has(e.id)||Promise.resolve().then(()=>e.handler(t)).then(()=>{e.id&&this.consecutiveFailures.delete(e.id)}).catch(n=>{let r=n instanceof Error?n.message:String(n),i=e.id??`unknown`,a=(this.failureCounts.get(i)??0)+1;this.failureCounts.set(i,a);let o=(this.consecutiveFailures.get(i)??0)+1;if(this.consecutiveFailures.set(i,o),o>=10&&e.id){this.autoDisabled.set(e.id,{name:e.name,reason:`Auto-disabled after ${o} consecutive failures. Last error: ${r}`,disabledAt:Date.now()}),this.unsubscribe(e.id),this.failureCounts.delete(i),this.consecutiveFailures.delete(i),this.lastErrors.delete(i),ro.error(`Subscriber auto-disabled after consecutive failures`,{subscriber:e.name,id:e.id,eventType:t.type,consecutiveFailures:o});return}let s=this.lastErrors.get(i)??[];s.push({timestamp:Date.now(),error:r}),s.length>10&&s.splice(0,s.length-10),this.lastErrors.set(i,s),ro.error(`EventBus subscriber failed`,{subscriber:e.name,id:e.id,eventType:t.type,error:r,consecutiveFailures:o})})}validateMeta(e){if(e==null)return;if(typeof e!=`object`||Array.isArray(e)){ro.warn(`EventBus meta must be a known meta shape or null`,{type:typeof e});return}let t=Object.keys(e);if(t.length===0){ro.warn(`EventBus meta has no top-level keys`);return}for(let e of t)ao.includes(e)||ro.warn(`EventBus meta key not recognized`,{key:e,allowed:ao})}resetFailures(e){this.failureCounts.delete(e),this.consecutiveFailures.delete(e),this.lastErrors.delete(e),this.autoDisabled.delete(e)}getStats(){let e={},t=[];for(let[n,r]of this.subscribers)if(r.length!==0){e[n]=r.length;for(let e of r)t.push({id:e.id??`auto`,name:e.name,eventType:e.eventType,policy:e.policy})}let n=[];for(let[e,t]of this.lastErrors)for(let r of t)n.push({subscriberId:e,timestamp:r.timestamp,error:r.error});let r={};for(let[e,t]of this.failureCounts)r[e]=t;let i=[];for(let[e,t]of this.autoDisabled)i.push({id:e,name:t.name,reason:t.reason});return{totalSubscribers:t.length,byEvent:e,subscriptions:t,failureCounts:r,lastErrors:n,autoDisabled:i}}};const so=k(`observation-store`),co=1e3;var lo=class{entries=new Map;artifacts=new Map;maxEntries;entryTtlMs;maxArtifacts;artifactInsertionOrder=[];storeCounter=0;constructor(e,t,n){this.maxEntries=e??co,this.entryTtlMs=t??18e5,this.maxArtifacts=n??Math.floor((e??co)/2)}store(e){let t={data:e,storedAt:Date.now()};for(this.entries.set(e.requestId,t);this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;e&&this.entries.delete(e)}this.storeCounter++,this.storeCounter%100==0&&this.sweepStale()}get(e){let t=this.entries.get(e);if(t){if(Date.now()-t.storedAt>this.entryTtlMs){this.entries.delete(e);return}return t.data}}createArtifact(e,t,n,r){let i=r.length>256e3,a=i?r.slice(0,256e3):r;for(this.artifacts.set(e,{content:a,storedAt:Date.now(),contentType:n}),this.artifactInsertionOrder.push(e);this.artifactInsertionOrder.length>this.maxArtifacts;){let e=this.artifactInsertionOrder.shift();e&&this.artifacts.delete(e)}return so.debug(`Observation artifact stored`,{requestId:e,length:a.length,truncated:i}),{requestId:e,eventId:t,contentType:n,sizeChars:a.length,truncated:i}}getArtifact(e){let t=this.artifacts.get(e);if(t){if(Date.now()-t.storedAt>this.entryTtlMs){this.artifacts.delete(e);return}return{content:t.content,contentType:t.contentType}}}size(){return this.sweepStale(),this.entries.size}clear(){this.entries.clear(),this.artifacts.clear(),this.artifactInsertionOrder=[],this.storeCounter=0}sweepStale(){let e=Date.now(),t=[];for(let[n,r]of this.entries)e-r.storedAt>this.entryTtlMs&&t.push(n);for(let e of t)this.entries.delete(e);for(let[t,n]of this.artifacts)e-n.storedAt>this.entryTtlMs&&this.artifacts.delete(t);t.length>0&&so.debug(`Swept stale observation entries`,{count:t.length})}};const uo={search:5e4,check:1e5,test_run:1e5,onboard:5e5},fo={argsMaxChars:500,resultMaxChars:8e3,payloadMaxChars:16e3,artifactMaxChars:256e3};function po(e,t){if(e.length<=t)return e;let n=e.slice(0,t),r=Math.floor(t*.3),i=n.lastIndexOf(`.`,t);if(i>r)return n.slice(0,i+1);let a=n.lastIndexOf(`
17
- `,t);if(a>r)return n.slice(0,a);let o=n.lastIndexOf(`,`,t);return o>r?n.slice(0,o):`${n.slice(0,t-3)}...`}function mo(e,t,n=fo){let r=e.text.length+t.text.length+200;if(r<=n.payloadMaxChars)return{args:e,result:t};let i=r-n.payloadMaxChars,a=Math.max(t.text.length-i-10,Math.min(t.text.length,100)),o=po(t.text,a),s=e.text.length+o.length+200;if(s<=n.payloadMaxChars)return{args:e,result:{...t,text:o,truncated:!0}};let c=s-n.payloadMaxChars,l=Math.max(e.text.length-c-10,Math.min(e.text.length,50));return{args:{...e,text:po(e.text,l),truncated:!0},result:{...t,text:o,truncated:!0}}}function ho(e){try{return JSON.stringify(e)}catch{return`[Non-serializable args]`}}function go(e){if(e==null)return``;if(typeof e==`string`)return e;if(typeof e==`object`){let t=e;if(Array.isArray(t.content))return t.content.filter(e=>typeof e.text==`string`).map(e=>e.text).join(`
18
- `);try{return JSON.stringify(e)}catch{return String(e)}}return String(e)}const _o=k(`observation-compressor`);function vo(){return{total:0,byTool:new Map,byOrigin:new Map,errors:0,successes:0,artifacts:0,truncations:0}}var yo=class{store;counters=vo();budget;constructor(e,t){this.store=e??new lo,this.budget={...fo,...t}}getStore(){return this.store}buildObservation(e,t,n,r,i,a,o,s){this.counters.total++,this.counters.byTool.set(e,(this.counters.byTool.get(e)??0)+1),this.counters.byOrigin.set(a,(this.counters.byOrigin.get(a)??0)+1),i?this.counters.errors++:this.counters.successes++;let c=ho(t),l={text:po(c,this.budget.argsMaxChars),truncated:c.length>this.budget.argsMaxChars,originalLength:c.length};l.truncated&&this.counters.truncations++;let u=go(n),d,f;u.length>this.budget.artifactMaxChars?(_o.warn(`Tool result exceeds artifact max chars — data omitted from observation`,{toolName:e,resultLength:u.length,maxChars:this.budget.artifactMaxChars}),f={requestId:o,eventId:o,contentType:`text/plain`,sizeChars:u.length,truncated:!0},this.counters.truncations++,this.counters.artifacts++,d={text:`[Result too large: ${u.length} chars — truncated at ${this.budget.artifactMaxChars} limit]`,truncated:!0,originalLength:u.length,artifactRef:f}):u.length>this.budget.resultMaxChars?(f=this.store.createArtifact(o,o,`text/plain`,u),this.counters.artifacts++,d={text:po(u,this.budget.resultMaxChars),truncated:!0,originalLength:u.length,artifactRef:f}):d={text:u,truncated:!1,originalLength:u.length};let p={...this.budget,payloadMaxChars:uo[e]??this.budget.payloadMaxChars},m=mo(l,d,p);return this.store.store({requestId:o,eventId:o,toolName:e,args:t,result:n,durationMs:r,isError:i,timestamp:Date.now(),workspaceId:s}),{toolName:e,args:m.args,result:m.result,durationMs:r,isError:i,origin:a,requestId:o,workspaceId:s}}fromToolAfter(e){return this.buildObservation(e.toolName,e.args,e.result,e.durationMs,e.isError,e.origin,e.requestId,e.workspaceId)}getStats(){let e={};for(let[t,n]of this.counters.byTool)e[t]=n;let t={};for(let[e,n]of this.counters.byOrigin)t[e]=n;return{totalObservations:this.counters.total,byTool:e,byOrigin:t,byError:{success:this.counters.successes,error:this.counters.errors},artifactCount:this.counters.artifacts,truncationCount:this.counters.truncations,storeSize:this.store.size()}}reset(){this.counters=vo(),this.store.clear()}};function bo(e,t,n){let r={...t},i=new Map;for(let t of n)for(let[n,a]of Object.entries(t.args)){let o=i.get(n);if(o!==void 0&&r[n]!==a)throw Error(`MutateArgs conflict for arg "${n}" between hooks "${o}" and "${t.hookId}" on tool "${e}"`);r[n]=a,i.set(n,t.hookId)}return r}var xo=class{hooks=[];failureCounts=new Map;register(e){if(!e.id||!e.scope||e.timeoutMs==null)throw Error(`DecisionHook "${e.id}" missing required fields`);if(e.timeoutMs<1||e.timeoutMs>3e4)throw Error(`DecisionHook "${e.id}" timeoutMs must be 1-30000ms`);if(!e.decisionTypes||e.decisionTypes.length===0)throw Error(`DecisionHook "${e.id}" must declare at least one decision type`);if(this.hooks.some(t=>t.id===e.id))throw Error(`DecisionHook "${e.id}" is already registered`);let t=e=>typeof e==`string`&&e.length>0,n=Array.isArray(e.scope)?e.scope:[e.scope];if(n.length===0||!n.every(t))throw Error(`DecisionHook "${e.id}" has invalid scope`);this.hooks.push(e)}getHooksForTool(e){return this.hooks.filter(t=>(Array.isArray(t.scope)?t.scope:[t.scope]).some(t=>e.startsWith(t)||t===`*`||t===e)).sort((e,t)=>e.order-t.order)}async executeHooks(e,t){let n=this.getHooksForTool(e),r=[],i=[];for(let a of n)try{let n=await So(n=>a.fn(e,t,n),a);`timeout`in n&&n.timeout?(r.push(n.fallback),i.push({hookId:a.id,error:`Hook timed out, applied ${a.failurePolicy}`})):`result`in n&&r.push(n.result)}catch(e){if(this.failureCounts.set(a.id,(this.failureCounts.get(a.id)??0)+1),i.push({hookId:a.id,error:e instanceof Error?e.message:String(e)}),a.failurePolicy===`fail-closed`)throw Error(`Decision hook "${a.id}" fail-closed: ${e instanceof Error?e.message:String(e)}`)}return{results:r,errors:i}}getStats(){return{count:this.hooks.length,hooks:this.hooks.map(e=>({id:e.id,order:e.order,scope:e.scope,decisionTypes:e.decisionTypes,failurePolicy:e.failurePolicy})),failureCounts:Object.fromEntries(this.failureCounts)}}unregister(e){let t=this.hooks.findIndex(t=>t.id===e);return t===-1?!1:(this.hooks.splice(t,1),this.failureCounts.delete(e),!0)}get size(){return this.hooks.length}};async function So(e,t){let n=new AbortController,{signal:r}=n,i=setTimeout(()=>{n.abort()},t.timeoutMs),a=!1;try{let n=e(r);if(n instanceof Promise)throw clearTimeout(i),Error(`DecisionHook "${t.id}" returned a Promise. Async hooks are not supported in Phase 01 — all hooks must return synchronously.`);return a=!1,{result:n}}catch(e){if(a=e instanceof Error&&e.message.includes(`timed out`),t.failurePolicy===`fail-open`)return{fallback:{type:`decision`,hookId:t.id,decision:`allow`,reason:a?`Hook timed out after ${t.timeoutMs}ms — fail-open applied.`:`Hook failed: ${e instanceof Error?e.message:String(e)} — fail-open applied.`},timeout:a};if(t.failurePolicy===`degrade-with-warning`)return{fallback:{type:`decision`,hookId:t.id,decision:`allow`,reason:a?`Hook degraded after ${t.timeoutMs}ms — degrade-with-warning applied.`:`Hook degraded: ${e instanceof Error?e.message:String(e)}`},timeout:a};throw e}finally{clearTimeout(i)}}const Co=k(`tool-pipeline`);function wo(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function To(e,t){return e.tools?(Array.isArray(e.tools)?e.tools:[e.tools]).includes(t):!0}function Eo(e){return e.middleware.critical===!0}var Do=class{entries=[];middlewareCache=new Map;decisionHookRegistry=new xo;observationCompressor;constructor(e){this.observationCompressor=e??new yo}getObservationCompressor(){return this.observationCompressor}getObservationCompressorStats(){return this.observationCompressor.getStats()}use(e,t){this.entries.push({middleware:e,order:t?.order??100,tools:t?.tools,name:t?.name??e.name??`anonymous`}),this.middlewareCache.clear()}useFor(e,t,n){this.use(t,{order:n?.order,tools:e,name:n?.name})}getMiddleware(e){let t=this.middlewareCache.get(e);return t||(t=this.entries.filter(t=>To(t,e)).sort((e,t)=>e.order-t.order),this.middlewareCache.set(e,t)),t}emitToolAfterEvent(e,t){e.emit({type:`tool:after`,toolName:t.toolName,args:t.args,result:t.result,durationMs:t.durationMs,isError:t.isError,origin:t.origin,requestId:t.requestId,timestamp:Date.now(),eventId:t.requestId,workspaceId:t.workspaceId,source:`tool-pipeline`,observation:t.observation,...t.meta?{meta:t.meta}:{}})}addDecisionHook(e){this.decisionHookRegistry.register(e)}wrap(e,t,n,r,i,a,o){let s=this.getMiddleware(e);return async(c,l)=>{let u;try{u=typeof a==`function`?a():a}catch{Co.warn(`workspaceId resolution failed — using empty string`,{toolName:e}),u=``}let d={toolName:e,args:wo(c)?c:{},requestId:Ye(),meta:r,extra:l,toolConfig:n,eventBus:i,workspaceId:u,origin:o??`llm`},f=Date.now(),p,m;try{m=await this.decisionHookRegistry.executeHooks(e,d.args)}catch(e){p=e instanceof Error?e:Error(String(e))}m&&m.errors.length>0&&Co.warn(`Decision hook errors`,{toolName:e,errors:m.errors});let h=m?.results.find(e=>e.decision===`deny`);if(h||p){let t=Date.now()-f,n=h?{isError:!0,content:[{type:`error`,text:`Decision hook denied: ${h.reason}`}],structuredContent:{hookDenial:{hookId:h.hookId,reason:h.reason}}}:{isError:!0,content:[{type:`text`,text:`Decision hook fail-closed: ${p?.message??`Unknown error`}`}]},r=this.observationCompressor.buildObservation(e,d.args,n,t,!0,`hook`,d.requestId,d.workspaceId??``);if(i){let a=h?.hookId??(p?p.message.match(/^Decision hook "([^"]+)" fail-closed:/)?.[1]??`unknown`:`unknown`);this.emitToolAfterEvent(i,{toolName:e,args:d.args,result:n,durationMs:t,isError:!0,origin:`hook`,requestId:d.requestId,workspaceId:d.workspaceId??``,observation:r,meta:{hookDebug:{hookId:a,decision:h?`deny`:`fail-closed`,durationMs:t}}})}if(p)throw p;return n}let g=(m?.results??[]).filter(e=>e.decision===`mutateArgs`&&e.args!=null).map(e=>({hookId:e.hookId,args:e.args}));if(g.length>0)try{d.args=bo(e,d.args??{},g)}catch(t){let n=Date.now()-f,r=t instanceof Error?t.message:String(t),a={isError:!0,content:[{type:`error`,text:`Arg mutation conflict: ${r}`}],structuredContent:{isError:!0,mutationConflict:r}},o=this.observationCompressor.buildObservation(e,d.args,a,n,!0,`hook`,d.requestId,d.workspaceId??``);return i&&this.emitToolAfterEvent(i,{toolName:e,args:d.args,result:a,durationMs:n,isError:!0,origin:`hook`,requestId:d.requestId,workspaceId:d.workspaceId??``,observation:o,meta:{hookDebug:{hookId:`conflict`,decision:`conflict`,conflict:r,durationMs:n}}}),a}let _=async n=>{let r=s[n];if(!r)return await t(d.args,l);let i=!1,a=!1,o,c=async()=>{i=!0;let e=await _(n+1);return a=!0,o=e,e};try{return await r.middleware(d,c)}catch(t){if(Eo(r))throw t;if(Co.warn(`Middleware failed for tool`,{middleware:r.name,tool:e,error:String(t)}),i){if(a&&o)return o;throw t}return _(n+1)}};try{let t=await _(0),n=Date.now()-f,r=t?.isError===!0||t?.structuredContent?.isError===!0,a=d.origin??o??`llm`,s=this.observationCompressor.buildObservation(e,d.args,t,n,r,a,d.requestId,d.workspaceId??``);return i&&this.emitToolAfterEvent(i,{toolName:e,args:d.args,result:t,durationMs:n,isError:r,origin:a,requestId:d.requestId,workspaceId:d.workspaceId??``,observation:s}),t}catch(t){let n=Date.now()-f,r=d.origin??o??`llm`,a={isError:!0,content:[{type:`text`,text:String(t)}]},s=this.observationCompressor.buildObservation(e,d.args,a,n,!0,r,d.requestId,d.workspaceId??``);throw i&&this.emitToolAfterEvent(i,{toolName:e,args:d.args,result:a,durationMs:n,isError:!0,origin:r,requestId:d.requestId,workspaceId:d.workspaceId??``,observation:s}),t}}}getMiddlewareNames(){return this.entries.map(e=>e.name)}};const Oo=k(`metrics-collector`),ko={maxL0Chars:4500,maxL0StaleMs:36e5,maxDuplicateRate:.05,maxEventPayloadKB:48,maxEventErrorRate:.01,maxReportEntries:50,maxReportBytes:20480};var Ao=class{counters=new Map;gauges=new Map;thresholds;MAX_LABEL_COMBOS=50;constructor(e){this.thresholds={...ko,...e}}getThresholds(){return{...this.thresholds}}enforceCounterHardCap(){if(this.counters.size<=this.MAX_LABEL_COMBOS*2)return;let e=this.counters.size-this.MAX_LABEL_COMBOS;for(let t=0;t<e;t++){let e=this.counters.keys().next().value;e&&this.counters.delete(e)}Oo.warn(`Metrics: counter hard cap enforced, evicted oldest entries`,{evicted:e,remaining:this.counters.size})}incrementCounter(e,t){let n=this.buildKey(e,t);this.counters.set(n,(this.counters.get(n)??0)+1),this.counters.size>=this.MAX_LABEL_COMBOS&&(Oo.warn(`Metrics: label combination count exceeded ${this.MAX_LABEL_COMBOS}`,{counterKeys:this.counters.size}),this.enforceCounterHardCap())}addToCounter(e,t,n){let r=this.buildKey(e,n);this.counters.set(r,(this.counters.get(r)??0)+t),this.counters.size>=this.MAX_LABEL_COMBOS&&(Oo.warn(`Metrics: label combination count exceeded ${this.MAX_LABEL_COMBOS}`,{counterKeys:this.counters.size}),this.enforceCounterHardCap())}setGauge(e,t,n){let r=this.buildKey(e,n);this.gauges.set(r,t)}getCounter(e,t){return this.counters.get(this.buildKey(e,t))??0}getGauge(e,t){return this.gauges.get(this.buildKey(e,t))??0}buildKey(e,t){if(!t)return e;let n=Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{});return`${e}:${JSON.stringify(n)}`}getReport(){let e=Object.fromEntries(this.counters),t=Object.fromEntries(this.gauges);if(Object.keys(e).length>this.thresholds.maxReportEntries){let t=Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).slice(0,this.thresholds.maxReportEntries);e=Object.fromEntries(t)}if(Object.keys(t).length>this.thresholds.maxReportEntries){let e=Object.entries(t).sort(([e],[t])=>e.localeCompare(t)).slice(0,this.thresholds.maxReportEntries);t=Object.fromEntries(e)}let n=Object.entries(e),r=Object.entries(t);for(;n.length>0||r.length>0;){let e={counters:Object.fromEntries(n),gauges:Object.fromEntries(r)};if(JSON.stringify(e).length<=this.thresholds.maxReportBytes)return e;n.length>=r.length?n.pop():r.pop()}return Oo.warn(`Metrics report exceeds ${this.thresholds.maxReportBytes} bytes — all entries dropped`),{counters:{},gauges:{}}}checkThresholds(){let e=[],t=this.getReport(),n=t.gauges[`l0.size`];n!=null&&n>this.thresholds.maxL0Chars&&e.push(`L0 size ${n} chars > ${this.thresholds.maxL0Chars} threshold`);let r=t.gauges[`l0.age_ms`];r!=null&&r>this.thresholds.maxL0StaleMs&&e.push(`L0 age ${Math.round(r/1e3/60)}m > ${Math.round(this.thresholds.maxL0StaleMs/1e3/60)}m threshold`);let i=(t.counters[`fact.duplicate`]??0)/(t.counters[`fact.total`]??1);return i>this.thresholds.maxDuplicateRate&&e.push(`Duplicate fact rate ${(i*100).toFixed(1)}% > ${(this.thresholds.maxDuplicateRate*100).toFixed(1)}% threshold`),e}reset(){this.counters.clear(),this.gauges.clear()}};function jo(e,t){e.registerResource(`aikit-curated-index`,`aikit://curated`,{description:`Index of all curated knowledge entries`,mimeType:`text/markdown`},async()=>{let e=await t.listPage({limit:200,orderBy:`updated`,order:`desc`}),n=e.entries,r=n.map(e=>`- [${e.title}](aikit://curated/${e.path}) — ${e.category}`),i=e.hasMore?`\n\n_Showing ${n.length} of ${e.totalCount} entries. Use knowledge list for pagination._`:``;return{contents:[{uri:`aikit://curated`,text:`# Curated Knowledge Index\n\n${r.length>0?r.join(`
19
- `):`_No curated entries yet._`}${i}`,mimeType:`text/markdown`}]}});let n=new $n(`aikit://curated/{+path}`,{list:async()=>({resources:(await t.listPage({limit:200,orderBy:`updated`,order:`desc`})).entries.map(e=>({uri:`aikit://curated/${e.path}`,name:e.title,description:`[${e.category}] ${e.contentPreview?.slice(0,80)??``}`,mimeType:`text/markdown`}))})});e.registerResource(`aikit-curated-entry`,n,{description:`A curated knowledge entry`,mimeType:`text/markdown`},async(e,n)=>{let r=n.path;if(!r)throw Error(`Missing path variable in curated resource URI`);let i=await t.read(r);return{contents:[{uri:e.toString(),text:`---\ntitle: ${i.title}\ncategory: ${i.category}\ntags: ${i.tags?.join(`, `)??``}\nversion: ${i.version??1}\n---\n\n${i.content??i.contentPreview??``}`,mimeType:`text/markdown`}]}})}const Mo=k(`resources`);function No(e,t,n){if(!t){Mo.debug(`No EventBus available — hooks resource skipped`);return}e.registerResource(`aikit-hooks-config`,`aikit://hooks/config`,{description:`Active EventBus hook subscribers and decision hooks — lists all registered subscriptions, their event types, execution policies, and decision hook diagnostics. Read this to discover what automated behaviors (auto-knowledge, replay, observations, decision hooks) are currently active.`,mimeType:`application/json`},async()=>{let e=t.getStats(),r=n?.getStats();return{contents:[{uri:`aikit://hooks/config`,text:JSON.stringify({totalSubscribers:e.totalSubscribers,byEvent:e.byEvent,subscriptions:e.subscriptions.map(e=>({id:e.id,name:e.name,eventType:e.eventType,policy:e.policy})),diagnostics:{failureCounts:e.failureCounts,lastErrors:e.lastErrors,autoDisabled:e.autoDisabled},decisionHooks:r?{count:r.count,hooks:r.hooks}:null},null,2),mimeType:`application/json`}]}}),Mo.debug(`Hooks config resource registered`,{subscriberCount:t.getStats().totalSubscribers,decisionHookCount:n?.getStats().count??0})}const Po=k(`resources`),Fo=`aikit://schemas/channel-surface`,Io=new URL(`../../../blocks-core/schemas/channel-surface.schema.json`,import.meta.url);let Lo;function Ro(){return Lo??=Ve(Io,`utf8`),Lo}const zo=[{type:`markdown`,valueShape:`string`,example:`**bold**`},{type:`table`,valueShape:`{headers: string[], rows: string[][]}`,example:`{headers:["Name"], rows:[["Alice"]]}`},{type:`metrics`,valueShape:`{label:string, value:string|number}[]`,example:`[{label:"Pass", value:42}]`},{type:`checklist`,valueShape:`{label:string, checked:boolean}[]`,example:`[{label:"Done", checked:true}]`},{type:`chart`,valueShape:`{chartType, data, xKey, yKeys}`,example:`{chartType:"line", data:[{x:1}], xKey:"x", yKeys:["y"]}`},{type:`code`,valueShape:`string`,example:`const x = 1;`},{type:`heading`,valueShape:`string`,example:`## Section`},{type:`mermaid`,valueShape:`string`,example:`graph TD; A-->B;`},{type:`timeline`,valueShape:`{title, timestamp?, status?}[]`,example:`[{title:"Release", status:"done"}]`},{type:`cards`,valueShape:`{title, body?, status?}[]`,example:`[{title:"Card", body:"Content"}]`},{type:`comparison`,valueShape:`{title, items}[]`,example:`[{title:"Option A", items:["Fast"]}]`},{type:`kv`,valueShape:`Record<string, string>`,example:`{key: "value"}`},{type:`tree`,valueShape:`{name, children?}`,example:`{name:"root", children:[{name:"leaf"}]}`},{type:`status-board`,valueShape:`{category, items}[]`,example:`[{category:"Services", items:[{label:"API", status:"healthy"}]}]`},{type:`progress`,valueShape:`{label, value, max?}`,example:`{label:"Progress", value:75}`},{type:`separator`,valueShape:`none`,example:`separator`}];function Bo(e){let t={schema:JSON.parse(e),blockCatalog:zo,presetCatalog:`aikit://present/presets`,templateCatalog:`aikit://present/templates`};return JSON.stringify(t,null,2)}function Vo(e,t,n,r,i,a,o){No(e,i,a),e.registerResource(`aikit-status`,`aikit://status`,{description:`Current AI Kit status and statistics`,mimeType:`text/plain`},async()=>{let e=await t.getStats();return{contents:[{uri:`aikit://status`,text:`AI Kit: ${e.totalRecords} records from ${e.totalFiles} files. Last indexed: ${e.lastIndexedAt??`Never`}`,mimeType:`text/plain`}]}}),e.registerResource(`aikit-file-tree`,`aikit://file-tree`,{description:`List of all indexed source files`,mimeType:`text/plain`},async()=>({contents:[{uri:`aikit://file-tree`,text:(await t.listSourcePaths()).sort().join(`
20
- `),mimeType:`text/plain`}]})),e.registerResource(`aikit-channel-surface-schema`,Fo,{description:`Composite catalog: ChannelSurface JSON Schema, block types, and resource URIs`,mimeType:`application/json`},async()=>({contents:[{uri:Fo,text:Bo(await Ro()),mimeType:`application/json`}]})),jo(e,n),e.registerResource(`aikit-skill-index`,`aikit://skill`,{description:`Index of available workspace skill files for the current workspace`,mimeType:`text/markdown`},async()=>{let e=[];return r?e.push(`- [SKILL.md](aikit://skill/SKILL.md) — Workspace conventions, known issues, and workflow tips`):e.push("- (skillDir not configured — run `aikit init` to generate workspace skill)"),{contents:[{uri:`aikit://skill`,text:`# Workspace Skill\n\n${e.join(`
16
+ `)}buildFallbackSkill(e){let t=e.workspaceName||`workspace`,n=Nt({workspaceName:Ze.test(t)||/^partition:/i.test(t)?`workspace`:t,structure:e.structure,hasPackageJson:e.hasPackageJson,validationCommands:e.validationCommands,entryPoints:e.entryPoints,dependencies:e.dependencies,symbols:e.symbols,promotedKnowledge:[],pitfalls:[],adrSummaries:[],userPreferences:[],architectureMemory:[],preventionRules:[],reviewGates:[]},this.currentVersion);return{skillMarkdown:n.skillMarkdown,referencesMarkdown:n.referencesMarkdown}}},ro=class{skillDir;config;curated;getFlowState;debounceTimers=new Map;compilingSlugs=new Set;pendingFlowBriefings=new Set;constructor(e,t,n,r){this.skillDir=e,this.config=t,this.curated=n,this.getFlowState=r}scheduleFlowBriefingRegeneration(e,t){let n=this.debounceTimers.get(e);n&&clearTimeout(n),W.debug(`Flow briefing regeneration scheduled for slug ${e} (trigger: ${t})`);let r=setTimeout(()=>{this.debounceTimers.delete(e),this.executeFlowBriefingCompile(e,t)},this.config.debounceMs);this.debounceTimers.set(e,r)}async deleteFlowBriefing(e){let t=bi(e),n=P(this.skillDir,`references`,`flow-${t}.md`);try{M(n)&&(Ne(n),W.debug(`Flow briefing deleted for slug ${e}`))}catch(t){W.warn(`Failed to delete flow briefing`,{slug:e,error:String(t)})}}readFlowBriefing(e){let t=bi(e),n=P(this.skillDir,`references`,`flow-${t}.md`);try{if(!M(n))return null;let e=N(n,`utf-8`);return e.length>0?e:null}catch{return null}}async executeFlowBriefingCompile(e,t){if(!this.getFlowState){W.warn(`getFlowState not configured — skipping flow briefing compile`,{slug:e});return}let n=bi(e);if(this.compilingSlugs.has(n)){this.pendingFlowBriefings.add(n),W.debug(`Flow briefing already compiling for ${n} — pending flag set`);return}this.compilingSlugs.add(n);try{let r=await this.getFlowState(e);if(!r?.flow){W.debug(`No active flow state — skipping flow briefing compile`,{slug:e});return}let i=await this.loadFlowDecisions(e),a=(r.completedSteps??[]).map(e=>({id:e,outcome:`completed`,summary:void 0,producedArtifacts:[]})),o=(r.skippedSteps??[]).map(e=>({id:e,outcome:`skipped`,summary:void 0,producedArtifacts:[]})),s=r.stepSequence??[],c=Mt({flowName:r.flow,slug:e,topic:r.topic??``,objective:r.objective,currentStep:r.currentStep,completedSteps:[...a,...o],totalSteps:s.length||a.length||1,decisions:i.map(e=>({title:e.title,summary:e.summary})),phase:r.phase??`flow`,stepSequence:s,acceptanceCriteria:r.acceptanceCriteria,scope:r.scope,exclusions:r.exclusions}),l=P(this.skillDir,`references`);M(l)||Oe(l,{recursive:!0});let u=P(l,`flow-${n}.md`),d=P(l,`.flow-${n}.tmp`);Pe(d,c,`utf-8`),Ae(d,u),W.info(`Flow briefing compiled`,{slug:e,trigger:t,size:c.length})}catch(t){W.error(`Flow briefing compile failed`,{slug:e,error:String(t)})}finally{this.compilingSlugs.delete(n),this.pendingFlowBriefings.has(n)&&(this.pendingFlowBriefings.delete(n),this.scheduleFlowBriefingRegeneration(e,t))}}async loadFlowDecisions(e){if(!this.curated)return[];try{let t=await this.curated.list({category:`flow-context`,limit:20,orderBy:`updated`,order:`desc`}),n=bi(e);return t.filter(e=>e.tags?.includes(`flow:${n}`)&&e.contentPreview&&e.contentPreview.length>10).map(e=>({title:e.title,summary:e.contentPreview.slice(0,200)}))}catch{return[]}}resolveActiveFlowSlug(){let e=P(this.skillDir,`references`);try{if(!M(e))return null;let t=ke(e).filter(e=>e.startsWith(`flow-`)&&e.endsWith(`.md`)).map(t=>({slug:t.replace(/^flow-/,``).replace(/\.md$/,``),mtime:Me(P(e,t)).mtimeMs})).sort((e,t)=>t.mtime-e.mtime);return t.length>0?t[0].slug:null}catch{return null}}clearDebounceTimers(){for(let e of this.debounceTimers.values())clearTimeout(e);this.debounceTimers.clear()}};const io=k(`event-bus`);function ao(e,t){if(typeof e!=`object`||!e)return e;t??=new WeakSet;let n=e;if(t.has(n))return e;t.add(n);let r=Object.getOwnPropertyNames(n);for(let n of r){let r=e[n];r&&typeof r==`object`&&ao(r,t)}return Object.freeze(e)}const oo=[`compression`,`hookDebug`,`origin`,`workspace`];var so=class{subscribers=new Map;subById=new Map;subCounter=0;failureCounts=new Map;consecutiveFailures=new Map;lastErrors=new Map;autoDisabled=new Map;subscribe(e){let t=e.id||`sub_${++this.subCounter}`,n={...e,id:t},r=this.subscribers.get(e.eventType);return r?r.push(n):this.subscribers.set(e.eventType,[n]),this.subById.set(t,e.eventType),io.debug(`Subscriber registered`,{id:n.id,eventType:e.eventType}),()=>this.unsubscribe(t)}unsubscribe(e){let t=this.subById.get(e);if(!t)return;this.subById.delete(e);let n=this.subscribers.get(t);if(!n)return;let r=n.findIndex(t=>t.id===e);r!==-1&&(n.splice(r,1),n.length===0&&this.subscribers.delete(t)),io.debug(`Subscriber unregistered`,{id:e,eventType:t})}emit(e){let t=this.subscribers.get(e.type);if(!(!t||t.length===0)){this.validateMeta(e.meta),ao(e);for(let n=0;n<t.length;n+=10){let r=t.slice(n,n+10);queueMicrotask(()=>{for(let t of r)this.executeSubscriber(t,e)})}}}executeSubscriber(e,t){e.id&&this.autoDisabled.has(e.id)||Promise.resolve().then(()=>e.handler(t)).then(()=>{e.id&&this.consecutiveFailures.delete(e.id)}).catch(n=>{let r=n instanceof Error?n.message:String(n),i=e.id??`unknown`,a=(this.failureCounts.get(i)??0)+1;this.failureCounts.set(i,a);let o=(this.consecutiveFailures.get(i)??0)+1;if(this.consecutiveFailures.set(i,o),o>=10&&e.id){this.autoDisabled.set(e.id,{name:e.name,reason:`Auto-disabled after ${o} consecutive failures. Last error: ${r}`,disabledAt:Date.now()}),this.unsubscribe(e.id),this.failureCounts.delete(i),this.consecutiveFailures.delete(i),this.lastErrors.delete(i),io.error(`Subscriber auto-disabled after consecutive failures`,{subscriber:e.name,id:e.id,eventType:t.type,consecutiveFailures:o});return}let s=this.lastErrors.get(i)??[];s.push({timestamp:Date.now(),error:r}),s.length>10&&s.splice(0,s.length-10),this.lastErrors.set(i,s),io.error(`EventBus subscriber failed`,{subscriber:e.name,id:e.id,eventType:t.type,error:r,consecutiveFailures:o})})}validateMeta(e){if(e==null)return;if(typeof e!=`object`||Array.isArray(e)){io.warn(`EventBus meta must be a known meta shape or null`,{type:typeof e});return}let t=Object.keys(e);if(t.length===0){io.warn(`EventBus meta has no top-level keys`);return}for(let e of t)oo.includes(e)||io.warn(`EventBus meta key not recognized`,{key:e,allowed:oo})}resetFailures(e){this.failureCounts.delete(e),this.consecutiveFailures.delete(e),this.lastErrors.delete(e),this.autoDisabled.delete(e)}getStats(){let e={},t=[];for(let[n,r]of this.subscribers)if(r.length!==0){e[n]=r.length;for(let e of r)t.push({id:e.id??`auto`,name:e.name,eventType:e.eventType,policy:e.policy})}let n=[];for(let[e,t]of this.lastErrors)for(let r of t)n.push({subscriberId:e,timestamp:r.timestamp,error:r.error});let r={};for(let[e,t]of this.failureCounts)r[e]=t;let i=[];for(let[e,t]of this.autoDisabled)i.push({id:e,name:t.name,reason:t.reason});return{totalSubscribers:t.length,byEvent:e,subscriptions:t,failureCounts:r,lastErrors:n,autoDisabled:i}}};const co=k(`observation-store`),lo=1e3;var uo=class{entries=new Map;artifacts=new Map;maxEntries;entryTtlMs;maxArtifacts;artifactInsertionOrder=[];storeCounter=0;constructor(e,t,n){this.maxEntries=e??lo,this.entryTtlMs=t??18e5,this.maxArtifacts=n??Math.floor((e??lo)/2)}store(e){let t={data:e,storedAt:Date.now()};for(this.entries.set(e.requestId,t);this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;e&&this.entries.delete(e)}this.storeCounter++,this.storeCounter%100==0&&this.sweepStale()}get(e){let t=this.entries.get(e);if(t){if(Date.now()-t.storedAt>this.entryTtlMs){this.entries.delete(e);return}return t.data}}createArtifact(e,t,n,r){let i=r.length>256e3,a=i?r.slice(0,256e3):r;for(this.artifacts.set(e,{content:a,storedAt:Date.now(),contentType:n}),this.artifactInsertionOrder.push(e);this.artifactInsertionOrder.length>this.maxArtifacts;){let e=this.artifactInsertionOrder.shift();e&&this.artifacts.delete(e)}return co.debug(`Observation artifact stored`,{requestId:e,length:a.length,truncated:i}),{requestId:e,eventId:t,contentType:n,sizeChars:a.length,truncated:i}}getArtifact(e){let t=this.artifacts.get(e);if(t){if(Date.now()-t.storedAt>this.entryTtlMs){this.artifacts.delete(e);return}return{content:t.content,contentType:t.contentType}}}size(){return this.sweepStale(),this.entries.size}clear(){this.entries.clear(),this.artifacts.clear(),this.artifactInsertionOrder=[],this.storeCounter=0}sweepStale(){let e=Date.now(),t=[];for(let[n,r]of this.entries)e-r.storedAt>this.entryTtlMs&&t.push(n);for(let e of t)this.entries.delete(e);for(let[t,n]of this.artifacts)e-n.storedAt>this.entryTtlMs&&this.artifacts.delete(t);t.length>0&&co.debug(`Swept stale observation entries`,{count:t.length})}};const fo={search:5e4,check:1e5,test_run:1e5,onboard:5e5},po={argsMaxChars:500,resultMaxChars:8e3,payloadMaxChars:16e3,artifactMaxChars:256e3};function mo(e,t){if(e.length<=t)return e;let n=e.slice(0,t),r=Math.floor(t*.3),i=n.lastIndexOf(`.`,t);if(i>r)return n.slice(0,i+1);let a=n.lastIndexOf(`
17
+ `,t);if(a>r)return n.slice(0,a);let o=n.lastIndexOf(`,`,t);return o>r?n.slice(0,o):`${n.slice(0,t-3)}...`}function ho(e,t,n=po){let r=e.text.length+t.text.length+200;if(r<=n.payloadMaxChars)return{args:e,result:t};let i=r-n.payloadMaxChars,a=Math.max(t.text.length-i-10,Math.min(t.text.length,100)),o=mo(t.text,a),s=e.text.length+o.length+200;if(s<=n.payloadMaxChars)return{args:e,result:{...t,text:o,truncated:!0}};let c=s-n.payloadMaxChars,l=Math.max(e.text.length-c-10,Math.min(e.text.length,50));return{args:{...e,text:mo(e.text,l),truncated:!0},result:{...t,text:o,truncated:!0}}}function go(e){try{return JSON.stringify(e)}catch{return`[Non-serializable args]`}}function _o(e){if(e==null)return``;if(typeof e==`string`)return e;if(typeof e==`object`){let t=e;if(Array.isArray(t.content))return t.content.filter(e=>typeof e.text==`string`).map(e=>e.text).join(`
18
+ `);try{return JSON.stringify(e)}catch{return String(e)}}return String(e)}const vo=k(`observation-compressor`);function yo(){return{total:0,byTool:new Map,byOrigin:new Map,errors:0,successes:0,artifacts:0,truncations:0}}var bo=class{store;counters=yo();budget;constructor(e,t){this.store=e??new uo,this.budget={...po,...t}}getStore(){return this.store}buildObservation(e,t,n,r,i,a,o,s){this.counters.total++,this.counters.byTool.set(e,(this.counters.byTool.get(e)??0)+1),this.counters.byOrigin.set(a,(this.counters.byOrigin.get(a)??0)+1),i?this.counters.errors++:this.counters.successes++;let c=go(t),l={text:mo(c,this.budget.argsMaxChars),truncated:c.length>this.budget.argsMaxChars,originalLength:c.length};l.truncated&&this.counters.truncations++;let u=_o(n),d,f;u.length>this.budget.artifactMaxChars?(vo.warn(`Tool result exceeds artifact max chars — data omitted from observation`,{toolName:e,resultLength:u.length,maxChars:this.budget.artifactMaxChars}),f={requestId:o,eventId:o,contentType:`text/plain`,sizeChars:u.length,truncated:!0},this.counters.truncations++,this.counters.artifacts++,d={text:`[Result too large: ${u.length} chars — truncated at ${this.budget.artifactMaxChars} limit]`,truncated:!0,originalLength:u.length,artifactRef:f}):u.length>this.budget.resultMaxChars?(f=this.store.createArtifact(o,o,`text/plain`,u),this.counters.artifacts++,d={text:mo(u,this.budget.resultMaxChars),truncated:!0,originalLength:u.length,artifactRef:f}):d={text:u,truncated:!1,originalLength:u.length};let p={...this.budget,payloadMaxChars:fo[e]??this.budget.payloadMaxChars},m=ho(l,d,p);return this.store.store({requestId:o,eventId:o,toolName:e,args:t,result:n,durationMs:r,isError:i,timestamp:Date.now(),workspaceId:s}),{toolName:e,args:m.args,result:m.result,durationMs:r,isError:i,origin:a,requestId:o,workspaceId:s}}fromToolAfter(e){return this.buildObservation(e.toolName,e.args,e.result,e.durationMs,e.isError,e.origin,e.requestId,e.workspaceId)}getStats(){let e={};for(let[t,n]of this.counters.byTool)e[t]=n;let t={};for(let[e,n]of this.counters.byOrigin)t[e]=n;return{totalObservations:this.counters.total,byTool:e,byOrigin:t,byError:{success:this.counters.successes,error:this.counters.errors},artifactCount:this.counters.artifacts,truncationCount:this.counters.truncations,storeSize:this.store.size()}}reset(){this.counters=yo(),this.store.clear()}};function xo(e,t,n){let r={...t},i=new Map;for(let t of n)for(let[n,a]of Object.entries(t.args)){let o=i.get(n);if(o!==void 0&&r[n]!==a)throw Error(`MutateArgs conflict for arg "${n}" between hooks "${o}" and "${t.hookId}" on tool "${e}"`);r[n]=a,i.set(n,t.hookId)}return r}var So=class{hooks=[];failureCounts=new Map;register(e){if(!e.id||!e.scope||e.timeoutMs==null)throw Error(`DecisionHook "${e.id}" missing required fields`);if(e.timeoutMs<1||e.timeoutMs>3e4)throw Error(`DecisionHook "${e.id}" timeoutMs must be 1-30000ms`);if(!e.decisionTypes||e.decisionTypes.length===0)throw Error(`DecisionHook "${e.id}" must declare at least one decision type`);if(this.hooks.some(t=>t.id===e.id))throw Error(`DecisionHook "${e.id}" is already registered`);let t=e=>typeof e==`string`&&e.length>0,n=Array.isArray(e.scope)?e.scope:[e.scope];if(n.length===0||!n.every(t))throw Error(`DecisionHook "${e.id}" has invalid scope`);this.hooks.push(e)}getHooksForTool(e){return this.hooks.filter(t=>(Array.isArray(t.scope)?t.scope:[t.scope]).some(t=>e.startsWith(t)||t===`*`||t===e)).sort((e,t)=>e.order-t.order)}async executeHooks(e,t){let n=this.getHooksForTool(e),r=[],i=[];for(let a of n)try{let n=await Co(n=>a.fn(e,t,n),a);`timeout`in n&&n.timeout?(r.push(n.fallback),i.push({hookId:a.id,error:`Hook timed out, applied ${a.failurePolicy}`})):`result`in n&&r.push(n.result)}catch(e){if(this.failureCounts.set(a.id,(this.failureCounts.get(a.id)??0)+1),i.push({hookId:a.id,error:e instanceof Error?e.message:String(e)}),a.failurePolicy===`fail-closed`)throw Error(`Decision hook "${a.id}" fail-closed: ${e instanceof Error?e.message:String(e)}`)}return{results:r,errors:i}}getStats(){return{count:this.hooks.length,hooks:this.hooks.map(e=>({id:e.id,order:e.order,scope:e.scope,decisionTypes:e.decisionTypes,failurePolicy:e.failurePolicy})),failureCounts:Object.fromEntries(this.failureCounts)}}unregister(e){let t=this.hooks.findIndex(t=>t.id===e);return t===-1?!1:(this.hooks.splice(t,1),this.failureCounts.delete(e),!0)}get size(){return this.hooks.length}};async function Co(e,t){let n=new AbortController,{signal:r}=n,i=setTimeout(()=>{n.abort()},t.timeoutMs),a=!1;try{let n=e(r);if(n instanceof Promise)throw clearTimeout(i),Error(`DecisionHook "${t.id}" returned a Promise. Async hooks are not supported in Phase 01 — all hooks must return synchronously.`);return a=!1,{result:n}}catch(e){if(a=e instanceof Error&&e.message.includes(`timed out`),t.failurePolicy===`fail-open`)return{fallback:{type:`decision`,hookId:t.id,decision:`allow`,reason:a?`Hook timed out after ${t.timeoutMs}ms — fail-open applied.`:`Hook failed: ${e instanceof Error?e.message:String(e)} — fail-open applied.`},timeout:a};if(t.failurePolicy===`degrade-with-warning`)return{fallback:{type:`decision`,hookId:t.id,decision:`allow`,reason:a?`Hook degraded after ${t.timeoutMs}ms — degrade-with-warning applied.`:`Hook degraded: ${e instanceof Error?e.message:String(e)}`},timeout:a};throw e}finally{clearTimeout(i)}}const wo=k(`tool-pipeline`);function To(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Eo(e,t){return e.tools?(Array.isArray(e.tools)?e.tools:[e.tools]).includes(t):!0}function Do(e){return e.middleware.critical===!0}var Oo=class{entries=[];middlewareCache=new Map;decisionHookRegistry=new So;observationCompressor;constructor(e){this.observationCompressor=e??new bo}getObservationCompressor(){return this.observationCompressor}getObservationCompressorStats(){return this.observationCompressor.getStats()}use(e,t){this.entries.push({middleware:e,order:t?.order??100,tools:t?.tools,name:t?.name??e.name??`anonymous`}),this.middlewareCache.clear()}useFor(e,t,n){this.use(t,{order:n?.order,tools:e,name:n?.name})}getMiddleware(e){let t=this.middlewareCache.get(e);return t||(t=this.entries.filter(t=>Eo(t,e)).sort((e,t)=>e.order-t.order),this.middlewareCache.set(e,t)),t}emitToolAfterEvent(e,t){e.emit({type:`tool:after`,toolName:t.toolName,args:t.args,result:t.result,durationMs:t.durationMs,isError:t.isError,origin:t.origin,requestId:t.requestId,timestamp:Date.now(),eventId:t.requestId,workspaceId:t.workspaceId,source:`tool-pipeline`,observation:t.observation,...t.meta?{meta:t.meta}:{}})}addDecisionHook(e){this.decisionHookRegistry.register(e)}wrap(e,t,n,r,i,a,o){let s=this.getMiddleware(e);return async(c,l)=>{let u;try{u=typeof a==`function`?a():a}catch{wo.warn(`workspaceId resolution failed — using empty string`,{toolName:e}),u=``}let d={toolName:e,args:To(c)?c:{},requestId:Ye(),meta:r,extra:l,toolConfig:n,eventBus:i,workspaceId:u,origin:o??`llm`},f=Date.now(),p,m;try{m=await this.decisionHookRegistry.executeHooks(e,d.args)}catch(e){p=e instanceof Error?e:Error(String(e))}m&&m.errors.length>0&&wo.warn(`Decision hook errors`,{toolName:e,errors:m.errors});let h=m?.results.find(e=>e.decision===`deny`);if(h||p){let t=Date.now()-f,n=h?{isError:!0,content:[{type:`error`,text:`Decision hook denied: ${h.reason}`}],structuredContent:{hookDenial:{hookId:h.hookId,reason:h.reason}}}:{isError:!0,content:[{type:`text`,text:`Decision hook fail-closed: ${p?.message??`Unknown error`}`}]},r=this.observationCompressor.buildObservation(e,d.args,n,t,!0,`hook`,d.requestId,d.workspaceId??``);if(i){let a=h?.hookId??(p?p.message.match(/^Decision hook "([^"]+)" fail-closed:/)?.[1]??`unknown`:`unknown`);this.emitToolAfterEvent(i,{toolName:e,args:d.args,result:n,durationMs:t,isError:!0,origin:`hook`,requestId:d.requestId,workspaceId:d.workspaceId??``,observation:r,meta:{hookDebug:{hookId:a,decision:h?`deny`:`fail-closed`,durationMs:t}}})}if(p)throw p;return n}let g=(m?.results??[]).filter(e=>e.decision===`mutateArgs`&&e.args!=null).map(e=>({hookId:e.hookId,args:e.args}));if(g.length>0)try{d.args=xo(e,d.args??{},g)}catch(t){let n=Date.now()-f,r=t instanceof Error?t.message:String(t),a={isError:!0,content:[{type:`error`,text:`Arg mutation conflict: ${r}`}],structuredContent:{isError:!0,mutationConflict:r}},o=this.observationCompressor.buildObservation(e,d.args,a,n,!0,`hook`,d.requestId,d.workspaceId??``);return i&&this.emitToolAfterEvent(i,{toolName:e,args:d.args,result:a,durationMs:n,isError:!0,origin:`hook`,requestId:d.requestId,workspaceId:d.workspaceId??``,observation:o,meta:{hookDebug:{hookId:`conflict`,decision:`conflict`,conflict:r,durationMs:n}}}),a}let _=async n=>{let r=s[n];if(!r)return await t(d.args,l);let i=!1,a=!1,o,c=async()=>{i=!0;let e=await _(n+1);return a=!0,o=e,e};try{return await r.middleware(d,c)}catch(t){if(Do(r))throw t;if(wo.warn(`Middleware failed for tool`,{middleware:r.name,tool:e,error:String(t)}),i){if(a&&o)return o;throw t}return _(n+1)}};try{let t=await _(0),n=Date.now()-f,r=t?.isError===!0||t?.structuredContent?.isError===!0,a=d.origin??o??`llm`,s=this.observationCompressor.buildObservation(e,d.args,t,n,r,a,d.requestId,d.workspaceId??``);return i&&this.emitToolAfterEvent(i,{toolName:e,args:d.args,result:t,durationMs:n,isError:r,origin:a,requestId:d.requestId,workspaceId:d.workspaceId??``,observation:s}),t}catch(t){let n=Date.now()-f,r=d.origin??o??`llm`,a={isError:!0,content:[{type:`text`,text:String(t)}]},s=this.observationCompressor.buildObservation(e,d.args,a,n,!0,r,d.requestId,d.workspaceId??``);throw i&&this.emitToolAfterEvent(i,{toolName:e,args:d.args,result:a,durationMs:n,isError:!0,origin:r,requestId:d.requestId,workspaceId:d.workspaceId??``,observation:s}),t}}}getMiddlewareNames(){return this.entries.map(e=>e.name)}};const ko=k(`metrics-collector`),Ao={maxL0Chars:4500,maxL0StaleMs:36e5,maxDuplicateRate:.05,maxEventPayloadKB:48,maxEventErrorRate:.01,maxReportEntries:50,maxReportBytes:20480};var jo=class{counters=new Map;gauges=new Map;thresholds;MAX_LABEL_COMBOS=50;constructor(e){this.thresholds={...Ao,...e}}getThresholds(){return{...this.thresholds}}enforceCounterHardCap(){if(this.counters.size<=this.MAX_LABEL_COMBOS*2)return;let e=this.counters.size-this.MAX_LABEL_COMBOS;for(let t=0;t<e;t++){let e=this.counters.keys().next().value;e&&this.counters.delete(e)}ko.warn(`Metrics: counter hard cap enforced, evicted oldest entries`,{evicted:e,remaining:this.counters.size})}incrementCounter(e,t){let n=this.buildKey(e,t);this.counters.set(n,(this.counters.get(n)??0)+1),this.counters.size>=this.MAX_LABEL_COMBOS&&(ko.warn(`Metrics: label combination count exceeded ${this.MAX_LABEL_COMBOS}`,{counterKeys:this.counters.size}),this.enforceCounterHardCap())}addToCounter(e,t,n){let r=this.buildKey(e,n);this.counters.set(r,(this.counters.get(r)??0)+t),this.counters.size>=this.MAX_LABEL_COMBOS&&(ko.warn(`Metrics: label combination count exceeded ${this.MAX_LABEL_COMBOS}`,{counterKeys:this.counters.size}),this.enforceCounterHardCap())}setGauge(e,t,n){let r=this.buildKey(e,n);this.gauges.set(r,t)}getCounter(e,t){return this.counters.get(this.buildKey(e,t))??0}getGauge(e,t){return this.gauges.get(this.buildKey(e,t))??0}buildKey(e,t){if(!t)return e;let n=Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{});return`${e}:${JSON.stringify(n)}`}getReport(){let e=Object.fromEntries(this.counters),t=Object.fromEntries(this.gauges);if(Object.keys(e).length>this.thresholds.maxReportEntries){let t=Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).slice(0,this.thresholds.maxReportEntries);e=Object.fromEntries(t)}if(Object.keys(t).length>this.thresholds.maxReportEntries){let e=Object.entries(t).sort(([e],[t])=>e.localeCompare(t)).slice(0,this.thresholds.maxReportEntries);t=Object.fromEntries(e)}let n=Object.entries(e),r=Object.entries(t);for(;n.length>0||r.length>0;){let e={counters:Object.fromEntries(n),gauges:Object.fromEntries(r)};if(JSON.stringify(e).length<=this.thresholds.maxReportBytes)return e;n.length>=r.length?n.pop():r.pop()}return ko.warn(`Metrics report exceeds ${this.thresholds.maxReportBytes} bytes — all entries dropped`),{counters:{},gauges:{}}}checkThresholds(){let e=[],t=this.getReport(),n=t.gauges[`l0.size`];n!=null&&n>this.thresholds.maxL0Chars&&e.push(`L0 size ${n} chars > ${this.thresholds.maxL0Chars} threshold`);let r=t.gauges[`l0.age_ms`];r!=null&&r>this.thresholds.maxL0StaleMs&&e.push(`L0 age ${Math.round(r/1e3/60)}m > ${Math.round(this.thresholds.maxL0StaleMs/1e3/60)}m threshold`);let i=(t.counters[`fact.duplicate`]??0)/(t.counters[`fact.total`]??1);return i>this.thresholds.maxDuplicateRate&&e.push(`Duplicate fact rate ${(i*100).toFixed(1)}% > ${(this.thresholds.maxDuplicateRate*100).toFixed(1)}% threshold`),e}reset(){this.counters.clear(),this.gauges.clear()}};function Mo(e,t){e.registerResource(`aikit-curated-index`,`aikit://curated`,{description:`Index of all curated knowledge entries`,mimeType:`text/markdown`},async()=>{let e=await t.listPage({limit:200,orderBy:`updated`,order:`desc`}),n=e.entries,r=n.map(e=>`- [${e.title}](aikit://curated/${e.path}) — ${e.category}`),i=e.hasMore?`\n\n_Showing ${n.length} of ${e.totalCount} entries. Use knowledge list for pagination._`:``;return{contents:[{uri:`aikit://curated`,text:`# Curated Knowledge Index\n\n${r.length>0?r.join(`
19
+ `):`_No curated entries yet._`}${i}`,mimeType:`text/markdown`}]}});let n=new er(`aikit://curated/{+path}`,{list:async()=>({resources:(await t.listPage({limit:200,orderBy:`updated`,order:`desc`})).entries.map(e=>({uri:`aikit://curated/${e.path}`,name:e.title,description:`[${e.category}] ${e.contentPreview?.slice(0,80)??``}`,mimeType:`text/markdown`}))})});e.registerResource(`aikit-curated-entry`,n,{description:`A curated knowledge entry`,mimeType:`text/markdown`},async(e,n)=>{let r=n.path;if(!r)throw Error(`Missing path variable in curated resource URI`);let i=await t.read(r);return{contents:[{uri:e.toString(),text:`---\ntitle: ${i.title}\ncategory: ${i.category}\ntags: ${i.tags?.join(`, `)??``}\nversion: ${i.version??1}\n---\n\n${i.content??i.contentPreview??``}`,mimeType:`text/markdown`}]}})}const No=k(`resources`);function Po(e,t,n){if(!t){No.debug(`No EventBus available — hooks resource skipped`);return}e.registerResource(`aikit-hooks-config`,`aikit://hooks/config`,{description:`Active EventBus hook subscribers and decision hooks — lists all registered subscriptions, their event types, execution policies, and decision hook diagnostics. Read this to discover what automated behaviors (auto-knowledge, replay, observations, decision hooks) are currently active.`,mimeType:`application/json`},async()=>{let e=t.getStats(),r=n?.getStats();return{contents:[{uri:`aikit://hooks/config`,text:JSON.stringify({totalSubscribers:e.totalSubscribers,byEvent:e.byEvent,subscriptions:e.subscriptions.map(e=>({id:e.id,name:e.name,eventType:e.eventType,policy:e.policy})),diagnostics:{failureCounts:e.failureCounts,lastErrors:e.lastErrors,autoDisabled:e.autoDisabled},decisionHooks:r?{count:r.count,hooks:r.hooks}:null},null,2),mimeType:`application/json`}]}}),No.debug(`Hooks config resource registered`,{subscriberCount:t.getStats().totalSubscribers,decisionHookCount:n?.getStats().count??0})}const Fo=k(`resources`),Io=`aikit://schemas/channel-surface`,Lo=new URL(`../../../blocks-core/schemas/channel-surface.schema.json`,import.meta.url);let Ro;function zo(){return Ro??=Ve(Lo,`utf8`),Ro}const Bo=[{type:`markdown`,valueShape:`string`,example:`**bold**`},{type:`table`,valueShape:`{headers: string[], rows: string[][]}`,example:`{headers:["Name"], rows:[["Alice"]]}`},{type:`metrics`,valueShape:`{label:string, value:string|number}[]`,example:`[{label:"Pass", value:42}]`},{type:`checklist`,valueShape:`{label:string, checked:boolean}[]`,example:`[{label:"Done", checked:true}]`},{type:`chart`,valueShape:`{chartType, data, xKey, yKeys}`,example:`{chartType:"line", data:[{x:1}], xKey:"x", yKeys:["y"]}`},{type:`code`,valueShape:`string`,example:`const x = 1;`},{type:`heading`,valueShape:`string`,example:`## Section`},{type:`mermaid`,valueShape:`string`,example:`graph TD; A-->B;`},{type:`timeline`,valueShape:`{title, timestamp?, status?}[]`,example:`[{title:"Release", status:"done"}]`},{type:`cards`,valueShape:`{title, body?, status?}[]`,example:`[{title:"Card", body:"Content"}]`},{type:`comparison`,valueShape:`{title, items}[]`,example:`[{title:"Option A", items:["Fast"]}]`},{type:`kv`,valueShape:`Record<string, string>`,example:`{key: "value"}`},{type:`tree`,valueShape:`{name, children?}`,example:`{name:"root", children:[{name:"leaf"}]}`},{type:`status-board`,valueShape:`{category, items}[]`,example:`[{category:"Services", items:[{label:"API", status:"healthy"}]}]`},{type:`progress`,valueShape:`{label, value, max?}`,example:`{label:"Progress", value:75}`},{type:`separator`,valueShape:`none`,example:`separator`}];function Vo(e){let t={schema:JSON.parse(e),blockCatalog:Bo,presetCatalog:`aikit://present/presets`,templateCatalog:`aikit://present/templates`};return JSON.stringify(t,null,2)}function Ho(e,t,n,r,i,a,o){Po(e,i,a),e.registerResource(`aikit-status`,`aikit://status`,{description:`Current AI Kit status and statistics`,mimeType:`text/plain`},async()=>{let e=await t.getStats();return{contents:[{uri:`aikit://status`,text:`AI Kit: ${e.totalRecords} records from ${e.totalFiles} files. Last indexed: ${e.lastIndexedAt??`Never`}`,mimeType:`text/plain`}]}}),e.registerResource(`aikit-file-tree`,`aikit://file-tree`,{description:`List of all indexed source files`,mimeType:`text/plain`},async()=>({contents:[{uri:`aikit://file-tree`,text:(await t.listSourcePaths()).sort().join(`
20
+ `),mimeType:`text/plain`}]})),e.registerResource(`aikit-channel-surface-schema`,Io,{description:`Composite catalog: ChannelSurface JSON Schema, block types, and resource URIs`,mimeType:`application/json`},async()=>({contents:[{uri:Io,text:Vo(await zo()),mimeType:`application/json`}]})),Mo(e,n),e.registerResource(`aikit-skill-index`,`aikit://skill`,{description:`Index of available workspace skill files for the current workspace`,mimeType:`text/markdown`},async()=>{let e=[];return r?e.push(`- [SKILL.md](aikit://skill/SKILL.md) — Workspace conventions, known issues, and workflow tips`):e.push("- (skillDir not configured — run `aikit init` to generate workspace skill)"),{contents:[{uri:`aikit://skill`,text:`# Workspace Skill\n\n${e.join(`
21
21
  `)}`,mimeType:`text/markdown`}]}}),e.registerResource(`aikit-skill-file`,`aikit://skill/SKILL.md`,{description:`Workspace skill in SKILL.md format — conventions, known issues, workflow tips`,mimeType:`text/markdown`},async()=>{if(!r)return{contents:[{uri:`aikit://skill/SKILL.md`,text:`# Workspace Skill: not configured
22
22
 
23
23
  skillDir is not configured. Run \`aikit init\` or set skillDir in server config to generate and serve the workspace skill.`,mimeType:`text/markdown`}]};let e=P(r,`SKILL.md`),t,n=``;if(o){let e=o.getStats();e.isStale&&e.skillExists&&(n=`
@@ -27,19 +27,19 @@ skillDir is not configured. Run \`aikit init\` or set skillDir in server config
27
27
 
28
28
  Run \`onboard({ path: "." })\` to generate this skill.`+n}catch{t=`# Workspace Skill: error
29
29
 
30
- Failed to read skill file.`}return{contents:[{uri:`aikit://skill/SKILL.md`,text:t,mimeType:`text/markdown`}]}}),r?Po.debug(`Workspace skill resources registered`,{skillDir:r}):Po.debug(`skillDir not configured — skill resources registered with diagnostic messages`)}new Set(Object.entries(Pa).filter(([e,t])=>t.planner?.effect===`read`).map(([e])=>e)),new Set(Object.entries(Pa).filter(([e,t])=>{let n=t.planner?.effect;return n===`write`||n===`mixed`||n===`destructive`}).map(([e])=>e)),new Set(Object.entries(Pa).filter(([e,t])=>t.planner?.costClass===`tiny`).map(([e])=>e));const Ho=[`er_push`,`er_pull`,`er_sync_status`],Uo=[...Ho,`er_update_policy`,`er_evolve_review`],Wo=new Set(Uo);function Go(e){return e.toolProfiles}const Ko=5e3,qo=k(`structured-content-guard`);function Jo(){let e=(async(e,t)=>{let n;try{n=await t()}catch(e){n={content:[{type:`text`,text:`[ERROR:INTERNAL] ${e instanceof Error?e.message:String(e)}`}],isError:!0}}let r=(e.toolConfig??{}).outputSchema;if(r==null)return n;let i=null;if(n.structuredContent==null){let t=Yo(r);n.structuredContent=t,i=`synthesize`,n.structuredContent??(n.structuredContent={},i=`synthesize-null-fallback`,qo.error(`synthesizeStructuredContent returned null/undefined — using empty fallback`,{tool:e.toolName}))}let a=Xo(r,n.structuredContent);if(a.action!=null&&(n.structuredContent=a.structuredContent,i=a.action),Qo(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),Zo(r,n.structuredContent)===!1){let e=Yo(r);n.structuredContent=e??{},Zo(r,n.structuredContent)===!1?(n.structuredContent=Qo(n.structuredContent)?n.structuredContent:{},i=`final-validation-failed`):i??=`final-heal`}return n});return e.critical=!0,e}function Yo(e){try{return $o(e)??{}}catch{return{}}}function Xo(e,t){if(Zo(e,t)!==!1)return{structuredContent:t,action:null};try{let n=Yo(e);if(Qo(n)&&Qo(t)){let r={...n,...t};if(Zo(e,r)!==!1)return{structuredContent:r,action:`heal`}}return{structuredContent:n,action:`fallback-zero-value`}}catch{return{structuredContent:t,action:null}}}function Zo(e,t){let n=e.safeParse;if(typeof n==`function`)try{return n(t).success}catch{return}}function Qo(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function $o(e){if(!e)return{};if(e.anyOf){let t=e.anyOf.find(e=>e.type!==`null`);return t?$o(t):null}let t=e._def?.typeName;if(t&&!e.type)switch(t){case`ZodObject`:{let t={},n=null;try{n=e.shape??(typeof e._def?.shape==`function`?e._def.shape():e._def?.shape)}catch{n=null}if(n)for(let[e,r]of Object.entries(n))try{t[e]=$o(r)}catch{t[e]=null}return t}case`ZodArray`:return[];case`ZodString`:return``;case`ZodNumber`:return 0;case`ZodBoolean`:return!1;case`ZodNullable`:return null;case`ZodOptional`:return;case`ZodRecord`:return{};case`ZodEnum`:return e._def?.values?.[0]??``;default:return{}}switch(e.type){case`object`:{let t={},n=e.properties??e.shape;if(n)for(let[e,r]of Object.entries(n))t[e]=$o(r);return t}case`array`:return[];case`string`:return``;case`number`:case`integer`:return 0;case`boolean`:return!1;case`nullable`:return null;case`optional`:return;case`record`:return{};case`enum`:return e.options?.[0]??Object.values(e.enum??e._def?.entries??{})[0]??``;default:return{}}}function es(e){if(!e)return{};try{let t=$o(e);return Qo(t)?t:{}}catch{return{}}}const ts=Symbol(`toolPipelineState`);function ns(e){return e[ts]}function rs(e,t){e[ts]=t}function is(e,t){return t?async(...n)=>{let r=await e(...n);if(!r||typeof r!=`object`)return r;let i=r;return!(`content`in i)||i.structuredContent!=null&&typeof i.structuredContent==`object`?r:(i.structuredContent=es(t),i.structuredContent??={},r)}:e}function as(e,t,n=``,r,i){let a=ns(e);if(a){a.pipeline=t,a.prefix=n,r!==void 0&&(a.eventBus=r),i!==void 0&&(a.workspaceId=i);return}let o={originalRegisterTool:e.registerTool.bind(e),pipeline:t,prefix:n,eventBus:r,workspaceId:i};rs(e,o),e.registerTool=(n,r,i)=>{let a=ns(e),s=a?.prefix?`${a.prefix}${n}`:n;if(!i)return a?.originalRegisterTool(s,r);let c=r?.outputSchema;if((a?.pipeline??t).getMiddlewareNames().length===0){let e=is(i,c);return a?.originalRegisterTool(s,r,e)}let l=U(n),u=a??o,d=is(u.pipeline.wrap(n,i,r,l,u.eventBus,u.workspaceId),c);return a?.originalRegisterTool(s,r,d)}}const os={analyze:1,audit:1,check:2,codemod:2,config:0,delegate:3,digest:1,env:0,eval:2,evidence_map:2,file_summary:1,find:1,flow:3,forge_ground:2,git:1,graph:1,measure:1,onboard:3,parse_output:1,present:1,process:3,produce_knowledge:3,queue:3,reindex:3,rename:2,replay:1,restore:2,scope_map:1,search:1,session:2,status:0,symbol:1,test_run:2,trace:1,web_fetch:1,web_search:1};function ss(e,t){return e.filter(e=>(os[e]??0)<=t)}const cs=new Set([`status`,`config`]),ls={full:{description:`All tools enabled (default)`,includeCategories:[]},safe:{description:`Read-only tools — no file/state modifications`,includeCategories:[`search`,`analysis`,`compression`,`utilities`,`system`,`git`,`flow`],excludeTools:[`reindex`,`onboard`]},research:{description:`Search, analysis, knowledge, and web access`,includeCategories:[`search`,`analysis`,`knowledge`,`compression`,`web`,`system`,`flow`]},minimal:{description:`Essential tools only — search, status, basic operations`,includeCategories:[`search`,`system`],includeTools:[`file_summary`,`check`,`test_run`]},discovery:{description:`Full toolset plus discovery-oriented meta-tools for guided tool exploration`,includeCategories:[],includeTools:[`list_tools`],excludeTools:[`describe_tool`,`search_tools`]}};function us(e,t){let n=ls[e];if(n)return n;let r=t?.[e];if(r)return r;throw Error(`Unknown tool profile: ${e}`)}function ds(e,t,n){return t.includes(`*`)?!0:(n[e]?.category??[]).some(e=>t.includes(e))}function fs(e,t,n,r){if(t.includes(`*`)){for(let t of n)e.add(t);return}for(let i of n)ds(i,t,r)&&e.add(i)}function ps(e,t,n){if(t.includes(`*`)){e.clear();return}for(let r of[...e])ds(r,t,n)&&e.delete(r)}function ms(e,t,n){if(!e||e.length===0||e.includes(`*`))return new Set(t);let r=new Set;return fs(r,e,t,n),r}function hs(e,t){return e===void 0?t:t===void 0?e:Math.min(e,t)}function gs(e,t){for(let n of[...e])t[n]?.annotations?.readOnlyHint===!1&&e.delete(n)}function _s(e,t,n=0,r=[]){if(n>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...r,e].join(` -> `)}`);if(r.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...r,e].join(` -> `)}`);let i=us(e,t);return hs(i.extends?_s(i.extends,t,n+1,[...r,e]):void 0,i.maxTier)}function vs(e,t,n,r){let i=(e,a,o)=>{if(a>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...o,e].join(` -> `)}`);if(o.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...o,e].join(` -> `)}`);let s=us(e,r),c=[...o,e],l=s.extends?i(s.extends,a+1,c):ms(s.includeCategories,t,n);s.extends&&s.includeCategories?.length&&fs(l,s.includeCategories,t,n),s.excludeCategories?.length&&ps(l,s.excludeCategories,n);for(let e of s.includeTools??[])l.add(e);for(let e of s.excludeTools??[])l.delete(e);return l},a=i(e,0,[]),o=_s(e,r);if(o!==void 0){let e=ss([...a],o);a.clear();for(let t of e)a.add(t)}for(let e of cs)a.add(e);return e===`safe`&&gs(a,n),a}const ys=new Set([`search`,`analysis`,`knowledge`,`compression`,`forge`,`presentation`,`execution`,`manipulation`,`session`,`git`,`process`,`system`,`meta`,`utilities`,`web`,`queue`,`flow`]);function bs(e,t,n,r){let i=process.env.AIKIT_TOOLSET||e.toolProfile||`full`,a=vs(i,t,n,r);if(e.features&&e.features.length>0){let i=e.features.filter(e=>!ys.has(e));if(i.length>0)throw Error(`Unknown feature group(s): ${i.join(`, `)}. Valid categories: ${[...ys].join(`, `)}`);let o={description:`Synthetic profile from features config`,includeCategories:e.features},s=vs(`_features`,t,n,{...r,_features:o});for(let e of a)!s.has(e)&&!cs.has(e)&&a.delete(e)}if(e.readOnly)for(let e of[...a])n[e]?.annotations?.readOnlyHint===!1&&!cs.has(e)&&a.delete(e);for(let e of cs)a.add(e);return i===`safe`&&gs(a,n),a}const xs=I.object({mode:I.enum([`wasm`,`regex`,`unknown`]),reason:I.string(),pathsChecked:I.array(I.object({path:I.string(),exists:I.boolean()})),os:I.string(),arch:I.string(),nodeVersion:I.string(),webTreeSitterImportable:I.boolean(),healAttempted:I.boolean(),healSuccess:I.boolean(),healError:I.string().nullable(),initError:I.string().nullable(),wasmDir:I.string().nullable(),grammarCount:I.number()}),Ss=I.object({kind:I.enum([`onboard`,`update_onboard`,`reindex`,`handoff`,`proceed`]),reason:I.string(),command:I.string().optional()}),Cs=I.object({title:I.string(),insight:I.string(),confidence:I.number()}),ws=I.object({lessons:I.array(Cs),conventions:I.array(I.object({title:I.string(),preview:I.string()})),checkpoint:I.string().nullable()});I.object({totalRecords:I.number(),totalFiles:I.number(),lastIndexedAt:I.string().nullable(),onboarded:I.boolean(),onboardDir:I.string(),contentTypes:I.record(I.string(),I.number()),wasmAvailable:I.boolean(),wasmDiagnostics:xs,graphStats:I.object({nodes:I.number(),edges:I.number()}).nullable(),curatedCount:I.number(),serverVersion:I.string(),scaffoldVersion:I.string().nullable(),workspaceScaffoldVersion:I.string().nullable(),upgradeAvailable:I.boolean(),sessionTokens:I.object({callCount:I.number(),totalInputChars:I.number(),totalOutputChars:I.number(),estInputTokens:I.number(),estTotalTokens:I.number(),startTime:I.string()}).optional(),storeBackend:I.string().optional(),storeDiagnostics:I.object({adapterType:I.string(),vectorSearchEnabled:I.boolean(),ftsEnabled:I.boolean(),degradedMode:I.boolean(),dbPath:I.string(),dbSizeBytes:I.number().nullable(),embeddingDim:I.number(),vectorDtype:I.string()}).nullable().optional(),contextPressure:I.number().min(0).max(100).describe(`0–100 score indicating AI Kit saturation`),nextAction:Ss,prelude:ws.nullable().optional()}).catchall(I.any()),I.object({ok:I.boolean(),checks:I.array(I.object({name:I.string(),ok:I.boolean(),message:I.string().optional()}))});const Ts=I.object({summary:I.object({totalFiles:I.number(),totalLines:I.number(),totalCodeLines:I.number(),totalFunctions:I.number(),avgComplexity:I.number(),maxComplexity:I.object({value:I.number(),file:I.string()})}),files:I.array(I.object({path:I.string(),lines:I.number(),code:I.number(),complexity:I.number(),functions:I.number()}))}),Es=I.object({platform:I.string(),arch:I.string(),nodeVersion:I.string(),cwd:I.string(),cpus:I.number(),memoryFreeGb:I.number(),memoryTotalGb:I.number()});I.object({iso:I.string(),unix:I.number(),timezone:I.string(),formatted:I.string()});const Ds=I.object({passed:I.boolean(),errorCount:I.number(),warningCount:I.number(),topErrors:I.array(I.string())}),Os=I.object({passed:I.boolean(),tsc:Ds,biome:Ds}),ks=I.object({name:I.string(),path:I.string(),depth:I.number()}),As=I.object({name:I.string(),definedIn:I.object({path:I.string(),line:I.number(),kind:I.string(),signature:I.string().optional()}).nullable(),importedBy:I.array(I.object({path:I.string(),line:I.number(),importStatement:I.string()})),referencedIn:I.array(I.object({path:I.string(),line:I.number(),context:I.string(),scope:I.string().optional()})),graphContext:I.object({definingModule:I.string().optional(),importedByModules:I.array(I.string()),siblingSymbols:I.array(I.string())}).nullable(),trace:I.object({callers:I.array(ks),callees:I.array(ks)}).nullable(),confidence:I.number().nullable(),method:I.string().nullable(),rationale:I.string().nullable(),error:I.string().optional()}),js=I.object({symbols:I.array(As)}),Ms=I.object({sourcePath:I.string(),contentType:I.string(),score:I.number(),headingPath:I.string().optional(),startLine:I.number().optional(),endLine:I.number().optional(),origin:I.string().optional(),category:I.string().optional(),tags:I.array(I.string()).optional()}),Ns=I.object({results:I.array(Ms),totalResults:I.number(),searchMode:I.string(),query:I.string(),ref:I.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Ps=I.object({path:I.string(),line:I.number().optional(),matchType:I.string(),preview:I.string()}),Fs=I.object({matches:I.array(Ps),totalMatches:I.number(),pattern:I.string(),truncated:I.boolean(),ref:I.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Is=I.object({path:I.string(),relevance:I.number(),estimatedTokens:I.number(),focusLines:I.array(I.string()).optional()}),Ls=I.object({files:I.array(Is),totalFiles:I.number(),totalEstimatedTokens:I.number(),task:I.string()}),Rs=I.object({path:I.string(),impact:I.string(),reason:I.string()}),zs=I.object({changedFiles:I.array(I.string()),affectedFiles:I.array(Rs),totalAffected:I.number(),riskLevel:I.string()}),Bs=I.object({name:I.string(),passed:I.boolean(),message:I.string().optional(),severity:I.string().optional()}),Vs=I.object({passed:I.boolean(),score:I.number(),checks:I.array(Bs),summary:I.string()}),Hs=I.object({id:I.string(),name:I.string(),type:I.string(),sourcePath:I.string().optional()}),Us=I.object({fromId:I.string(),toId:I.string(),fromName:I.string(),toName:I.string(),type:I.string()}),Ws=I.object({id:I.string(),name:I.string(),type:I.string()}),Gs=I.object({id:I.string(),nodeCount:I.number(),types:I.record(I.string(),I.number()),samples:I.array(Ws)}),Ks=I.object({nodes:I.array(Hs),edges:I.array(Us),communities:I.array(Gs).optional(),totalNodes:I.number(),totalEdges:I.number(),query:I.string()});I.object({symbols:I.array(I.object({name:I.string(),path:I.string(),line:I.number().optional(),kind:I.string()})),totalDead:I.number()});const qs=I.object({gitRoot:I.string(),branch:I.string(),commitCount:I.number(),hasUncommitted:I.boolean(),recentCommits:I.array(I.object({hash:I.string(),message:I.string(),author:I.string(),date:I.string()}))}),Js=I.object({sourceId:I.string(),value:I.string()}),Ys=I.object({id:I.string(),originalChars:I.number(),keptChars:I.number(),segmentsKept:I.number(),segmentsTotal:I.number()}),Xs=I.object({text:I.string().describe(`The compressed digest text output`),ref:I.string().optional().describe(`Reusable cache reference`),fields:I.record(I.string(),I.array(Js)),sourceStats:I.array(Ys),totalOriginalChars:I.number(),totalCompressedChars:I.number(),ratio:I.number()}),Zs=I.object({passed:I.boolean(),totalTests:I.number(),passedTests:I.number(),failedTests:I.number(),skippedTests:I.number(),duration:I.number().describe(`Duration in milliseconds`),failures:I.array(I.object({name:I.string(),message:I.string(),file:I.string().optional()}))}),Qs=k(`utils:enrich`);async function G(e,t){let n={curated:[],graph:[]},r=t.limit??3,[i,a]=await Promise.allSettled([$s(e,t.query,r),ec(e,t.filePath)]);return i.status===`fulfilled`?n.curated=i.value:Qs.debug(`Curated enrichment failed`,{error:i.reason}),a.status===`fulfilled`?n.graph=a.value:Qs.debug(`Graph enrichment failed`,{error:a.reason}),n}async function $s(e,t,n){if(!e.store||!t)return[];try{let r=await e.store.ftsSearch(t,{origin:`curated`,limit:n});if(r.length>0)return r.map(e=>tc(e.record));if(e.embedder){let r=await e.embedder.embedQuery(t);return(await e.store.search(r,{origin:`curated`,limit:n,minScore:.3})).map(e=>tc(e.record))}return[]}catch(e){return Qs.debug(`Curated enrichment failed`,{error:e}),[]}}async function ec(e,t){if(!e.graphStore||!t)return[];try{let n=await e.graphStore.findNodes({sourcePath:t,limit:1});if(n.length===0){let r=t.split(/[/\\]/).pop()?.replace(/\.\w+$/,``)||``;if(!r)return[];let i=await e.graphStore.findNodes({namePattern:r,type:`module`,limit:1});if(i.length===0)return[];n.push(i[0])}let r=n[0],i=await e.graphStore.getNeighbors(r.id,{direction:`both`,limit:10}),a=[];for(let e of i.edges){let t=e.fromId===r.id?e.toId:e.fromId,n=i.nodes.find(e=>e.id===t);if(!n)continue;let o=e.fromId===r.id?`->`:`<-`;a.push(`${o} ${e.type}: ${n.name} (${n.type})`)}return a}catch(e){return Qs.debug(`Graph enrichment failed`,{error:e}),[]}}function K(e){let t=[];if(e.curated.length>0){t.push(`**Curated Knowledge:**`);for(let n of e.curated)t.push(`- ${n}`)}if(e.graph.length>0){t.push(`**Graph Context:**`);for(let n of e.graph)t.push(`- ${n}`)}return t.length===0?``:`\n\n---\n### Enrichment\n${t.join(`
31
- `)}`}function tc(e){let t=nc(e.metadata,`title`)||e.sourcePath||`Untitled`;return`[${nc(e.metadata,`category`)}] ${t}: ${e.content.slice(0,200)}`}function nc(e,t){let n=e?.[t];return typeof n==`string`?n:``}function q(e,t,n){return{content:[{type:`text`,text:`[ERROR:${e}] ${t}`}],isError:!0,...n==null?{}:{structuredContent:n}}}function J(e,t){return async(n,r)=>{let i=Date.now(),a=await t(n,r),o=Date.now()-i;return a._meta={...a._meta??{},durationMs:o,toolName:e},a}}const rc=k(`tools`),ic=I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`);function ac(e,t){return t?Vn(e,t):e}function oc(){let e=[];return lr.get()||e.push(`Tree-sitter unavailable — using regex fallback, symbol/pattern confidence reduced`),e.length===0?``:`\n\n> **⚠ Caveats:** ${e.join(`; `)}`}function sc(e){return(e??[]).map(e=>{if(typeof e==`string`)return e;if(e&&typeof e==`object`&&`path`in e)return typeof e.path==`string`?e.path:void 0}).filter(e=>!!e)}function cc(e){let t=[],n=e.filter(e=>/\.(ts|tsx|js|jsx)$/.test(e)&&/(service|store|model|schema|migration)/i.test(e)),r=e.filter(e=>/\.(ts|tsx|js|jsx)$/.test(e)&&!n.includes(e)),i=e.filter(e=>!/\.(ts|tsx|js|jsx)$/.test(e));return(n.length>0||r.length>0||i.length>0)&&(t.push(`
30
+ Failed to read skill file.`}return{contents:[{uri:`aikit://skill/SKILL.md`,text:t,mimeType:`text/markdown`}]}}),r?Fo.debug(`Workspace skill resources registered`,{skillDir:r}):Fo.debug(`skillDir not configured — skill resources registered with diagnostic messages`)}new Set(Object.entries(Fa).filter(([e,t])=>t.planner?.effect===`read`).map(([e])=>e)),new Set(Object.entries(Fa).filter(([e,t])=>{let n=t.planner?.effect;return n===`write`||n===`mixed`||n===`destructive`}).map(([e])=>e)),new Set(Object.entries(Fa).filter(([e,t])=>t.planner?.costClass===`tiny`).map(([e])=>e));const Uo=[`er_push`,`er_pull`,`er_sync_status`],Wo=[...Uo,`er_update_policy`,`er_evolve_review`],Go=new Set(Wo);function Ko(e){return e.toolProfiles}const qo=5e3,Jo=k(`structured-content-guard`);function Yo(){let e=(async(e,t)=>{let n;try{n=await t()}catch(e){n={content:[{type:`text`,text:`[ERROR:INTERNAL] ${e instanceof Error?e.message:String(e)}`}],isError:!0}}let r=(e.toolConfig??{}).outputSchema;if(r==null)return n;let i=null;if(n.structuredContent==null){let t=Xo(r);n.structuredContent=t,i=`synthesize`,n.structuredContent??(n.structuredContent={},i=`synthesize-null-fallback`,Jo.error(`synthesizeStructuredContent returned null/undefined — using empty fallback`,{tool:e.toolName}))}let a=Zo(r,n.structuredContent);if(a.action!=null&&(n.structuredContent=a.structuredContent,i=a.action),$o(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),Qo(r,n.structuredContent)===!1){let e=Xo(r);n.structuredContent=e??{},Qo(r,n.structuredContent)===!1?(n.structuredContent=$o(n.structuredContent)?n.structuredContent:{},i=`final-validation-failed`):i??=`final-heal`}return n});return e.critical=!0,e}function Xo(e){try{return es(e)??{}}catch{return{}}}function Zo(e,t){if(Qo(e,t)!==!1)return{structuredContent:t,action:null};try{let n=Xo(e);if($o(n)&&$o(t)){let r={...n,...t};if(Qo(e,r)!==!1)return{structuredContent:r,action:`heal`}}return{structuredContent:n,action:`fallback-zero-value`}}catch{return{structuredContent:t,action:null}}}function Qo(e,t){let n=e.safeParse;if(typeof n==`function`)try{return n(t).success}catch{return}}function $o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function es(e){if(!e)return{};if(e.anyOf){let t=e.anyOf.find(e=>e.type!==`null`);return t?es(t):null}let t=e._def?.typeName;if(t&&!e.type)switch(t){case`ZodObject`:{let t={},n=null;try{n=e.shape??(typeof e._def?.shape==`function`?e._def.shape():e._def?.shape)}catch{n=null}if(n)for(let[e,r]of Object.entries(n))try{t[e]=es(r)}catch{t[e]=null}return t}case`ZodArray`:return[];case`ZodString`:return``;case`ZodNumber`:return 0;case`ZodBoolean`:return!1;case`ZodNullable`:return null;case`ZodOptional`:return;case`ZodRecord`:return{};case`ZodEnum`:return e._def?.values?.[0]??``;default:return{}}switch(e.type){case`object`:{let t={},n=e.properties??e.shape;if(n)for(let[e,r]of Object.entries(n))t[e]=es(r);return t}case`array`:return[];case`string`:return``;case`number`:case`integer`:return 0;case`boolean`:return!1;case`nullable`:return null;case`optional`:return;case`record`:return{};case`enum`:return e.options?.[0]??Object.values(e.enum??e._def?.entries??{})[0]??``;default:return{}}}function ts(e){if(!e)return{};try{let t=es(e);return $o(t)?t:{}}catch{return{}}}const ns=Symbol(`toolPipelineState`);function rs(e){return e[ns]}function is(e,t){e[ns]=t}function as(e,t){return t?async(...n)=>{let r=await e(...n);if(!r||typeof r!=`object`)return r;let i=r;return!(`content`in i)||i.structuredContent!=null&&typeof i.structuredContent==`object`?r:(i.structuredContent=ts(t),i.structuredContent??={},r)}:e}function os(e,t,n=``,r,i){let a=rs(e);if(a){a.pipeline=t,a.prefix=n,r!==void 0&&(a.eventBus=r),i!==void 0&&(a.workspaceId=i);return}let o={originalRegisterTool:e.registerTool.bind(e),pipeline:t,prefix:n,eventBus:r,workspaceId:i};is(e,o),e.registerTool=(n,r,i)=>{let a=rs(e),s=a?.prefix?`${a.prefix}${n}`:n;if(!i)return a?.originalRegisterTool(s,r);let c=r?.outputSchema;if((a?.pipeline??t).getMiddlewareNames().length===0){let e=as(i,c);return a?.originalRegisterTool(s,r,e)}let l=U(n),u=a??o,d=as(u.pipeline.wrap(n,i,r,l,u.eventBus,u.workspaceId),c);return a?.originalRegisterTool(s,r,d)}}const ss={analyze:1,audit:1,check:2,codemod:2,config:0,delegate:3,digest:1,env:0,eval:2,evidence_map:2,file_summary:1,find:1,flow:3,forge_ground:2,git:1,graph:1,measure:1,onboard:3,parse_output:1,present:1,process:3,produce_knowledge:3,queue:3,reindex:3,rename:2,replay:1,restore:2,scope_map:1,search:1,session:2,status:0,symbol:1,test_run:2,trace:1,web_fetch:1,web_search:1};function cs(e,t){return e.filter(e=>(ss[e]??0)<=t)}const ls=new Set([`status`,`config`]),us={full:{description:`All tools enabled (default)`,includeCategories:[]},safe:{description:`Read-only tools — no file/state modifications`,includeCategories:[`search`,`analysis`,`compression`,`utilities`,`system`,`git`,`flow`],excludeTools:[`reindex`,`onboard`]},research:{description:`Search, analysis, knowledge, and web access`,includeCategories:[`search`,`analysis`,`knowledge`,`compression`,`web`,`system`,`flow`]},minimal:{description:`Essential tools only — search, status, basic operations`,includeCategories:[`search`,`system`],includeTools:[`file_summary`,`check`,`test_run`]},discovery:{description:`Full toolset plus discovery-oriented meta-tools for guided tool exploration`,includeCategories:[],includeTools:[`list_tools`],excludeTools:[`describe_tool`,`search_tools`]}};function ds(e,t){let n=us[e];if(n)return n;let r=t?.[e];if(r)return r;throw Error(`Unknown tool profile: ${e}`)}function fs(e,t,n){return t.includes(`*`)?!0:(n[e]?.category??[]).some(e=>t.includes(e))}function ps(e,t,n,r){if(t.includes(`*`)){for(let t of n)e.add(t);return}for(let i of n)fs(i,t,r)&&e.add(i)}function ms(e,t,n){if(t.includes(`*`)){e.clear();return}for(let r of[...e])fs(r,t,n)&&e.delete(r)}function hs(e,t,n){if(!e||e.length===0||e.includes(`*`))return new Set(t);let r=new Set;return ps(r,e,t,n),r}function gs(e,t){return e===void 0?t:t===void 0?e:Math.min(e,t)}function _s(e,t){for(let n of[...e])t[n]?.annotations?.readOnlyHint===!1&&e.delete(n)}function vs(e,t,n=0,r=[]){if(n>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...r,e].join(` -> `)}`);if(r.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...r,e].join(` -> `)}`);let i=ds(e,t);return gs(i.extends?vs(i.extends,t,n+1,[...r,e]):void 0,i.maxTier)}function ys(e,t,n,r){let i=(e,a,o)=>{if(a>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...o,e].join(` -> `)}`);if(o.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...o,e].join(` -> `)}`);let s=ds(e,r),c=[...o,e],l=s.extends?i(s.extends,a+1,c):hs(s.includeCategories,t,n);s.extends&&s.includeCategories?.length&&ps(l,s.includeCategories,t,n),s.excludeCategories?.length&&ms(l,s.excludeCategories,n);for(let e of s.includeTools??[])l.add(e);for(let e of s.excludeTools??[])l.delete(e);return l},a=i(e,0,[]),o=vs(e,r);if(o!==void 0){let e=cs([...a],o);a.clear();for(let t of e)a.add(t)}for(let e of ls)a.add(e);return e===`safe`&&_s(a,n),a}const bs=new Set([`search`,`analysis`,`knowledge`,`compression`,`forge`,`presentation`,`execution`,`manipulation`,`session`,`git`,`process`,`system`,`meta`,`utilities`,`web`,`queue`,`flow`]);function xs(e,t,n,r){let i=process.env.AIKIT_TOOLSET||e.toolProfile||`full`,a=ys(i,t,n,r);if(e.features&&e.features.length>0){let i=e.features.filter(e=>!bs.has(e));if(i.length>0)throw Error(`Unknown feature group(s): ${i.join(`, `)}. Valid categories: ${[...bs].join(`, `)}`);let o={description:`Synthetic profile from features config`,includeCategories:e.features},s=ys(`_features`,t,n,{...r,_features:o});for(let e of a)!s.has(e)&&!ls.has(e)&&a.delete(e)}if(e.readOnly)for(let e of[...a])n[e]?.annotations?.readOnlyHint===!1&&!ls.has(e)&&a.delete(e);for(let e of ls)a.add(e);return i===`safe`&&_s(a,n),a}const Ss=I.object({mode:I.enum([`wasm`,`regex`,`unknown`]),reason:I.string(),pathsChecked:I.array(I.object({path:I.string(),exists:I.boolean()})),os:I.string(),arch:I.string(),nodeVersion:I.string(),webTreeSitterImportable:I.boolean(),healAttempted:I.boolean(),healSuccess:I.boolean(),healError:I.string().nullable(),initError:I.string().nullable(),wasmDir:I.string().nullable(),grammarCount:I.number()}),Cs=I.object({kind:I.enum([`onboard`,`update_onboard`,`reindex`,`handoff`,`proceed`]),reason:I.string(),command:I.string().optional()}),ws=I.object({title:I.string(),insight:I.string(),confidence:I.number()}),Ts=I.object({lessons:I.array(ws),conventions:I.array(I.object({title:I.string(),preview:I.string()})),checkpoint:I.string().nullable()});I.object({totalRecords:I.number(),totalFiles:I.number(),lastIndexedAt:I.string().nullable(),onboarded:I.boolean(),onboardDir:I.string(),contentTypes:I.record(I.string(),I.number()),wasmAvailable:I.boolean(),wasmDiagnostics:Ss,graphStats:I.object({nodes:I.number(),edges:I.number()}).nullable(),curatedCount:I.number(),serverVersion:I.string(),scaffoldVersion:I.string().nullable(),workspaceScaffoldVersion:I.string().nullable(),upgradeAvailable:I.boolean(),sessionTokens:I.object({callCount:I.number(),totalInputChars:I.number(),totalOutputChars:I.number(),estInputTokens:I.number(),estTotalTokens:I.number(),startTime:I.string()}).optional(),storeBackend:I.string().optional(),storeDiagnostics:I.object({adapterType:I.string(),vectorSearchEnabled:I.boolean(),ftsEnabled:I.boolean(),degradedMode:I.boolean(),dbPath:I.string(),dbSizeBytes:I.number().nullable(),embeddingDim:I.number(),vectorDtype:I.string()}).nullable().optional(),contextPressure:I.number().min(0).max(100).describe(`0–100 score indicating AI Kit saturation`),nextAction:Cs,prelude:Ts.nullable().optional()}).catchall(I.any()),I.object({ok:I.boolean(),checks:I.array(I.object({name:I.string(),ok:I.boolean(),message:I.string().optional()}))});const Es=I.object({summary:I.object({totalFiles:I.number(),totalLines:I.number(),totalCodeLines:I.number(),totalFunctions:I.number(),avgComplexity:I.number(),maxComplexity:I.object({value:I.number(),file:I.string()})}),files:I.array(I.object({path:I.string(),lines:I.number(),code:I.number(),complexity:I.number(),functions:I.number()}))}),Ds=I.object({platform:I.string(),arch:I.string(),nodeVersion:I.string(),cwd:I.string(),cpus:I.number(),memoryFreeGb:I.number(),memoryTotalGb:I.number()});I.object({iso:I.string(),unix:I.number(),timezone:I.string(),formatted:I.string()});const Os=I.object({passed:I.boolean(),errorCount:I.number(),warningCount:I.number(),topErrors:I.array(I.string())}),ks=I.object({passed:I.boolean(),tsc:Os,biome:Os}),As=I.object({name:I.string(),path:I.string(),depth:I.number()}),js=I.object({name:I.string(),definedIn:I.object({path:I.string(),line:I.number(),kind:I.string(),signature:I.string().optional()}).nullable(),importedBy:I.array(I.object({path:I.string(),line:I.number(),importStatement:I.string()})),referencedIn:I.array(I.object({path:I.string(),line:I.number(),context:I.string(),scope:I.string().optional()})),graphContext:I.object({definingModule:I.string().optional(),importedByModules:I.array(I.string()),siblingSymbols:I.array(I.string())}).nullable(),trace:I.object({callers:I.array(As),callees:I.array(As)}).nullable(),confidence:I.number().nullable(),method:I.string().nullable(),rationale:I.string().nullable(),error:I.string().optional()}),Ms=I.object({symbols:I.array(js)}),Ns=I.object({sourcePath:I.string(),contentType:I.string(),score:I.number(),headingPath:I.string().optional(),startLine:I.number().optional(),endLine:I.number().optional(),origin:I.string().optional(),category:I.string().optional(),tags:I.array(I.string()).optional()}),Ps=I.object({results:I.array(Ns),totalResults:I.number(),searchMode:I.string(),query:I.string(),ref:I.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Fs=I.object({path:I.string(),line:I.number().optional(),matchType:I.string(),preview:I.string()}),Is=I.object({matches:I.array(Fs),totalMatches:I.number(),pattern:I.string(),truncated:I.boolean(),ref:I.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Ls=I.object({path:I.string(),relevance:I.number(),estimatedTokens:I.number(),focusLines:I.array(I.string()).optional()}),Rs=I.object({files:I.array(Ls),totalFiles:I.number(),totalEstimatedTokens:I.number(),task:I.string()}),zs=I.object({path:I.string(),impact:I.string(),reason:I.string()}),Bs=I.object({changedFiles:I.array(I.string()),affectedFiles:I.array(zs),totalAffected:I.number(),riskLevel:I.string()}),Vs=I.object({name:I.string(),passed:I.boolean(),message:I.string().optional(),severity:I.string().optional()}),Hs=I.object({passed:I.boolean(),score:I.number(),checks:I.array(Vs),summary:I.string()}),Us=I.object({id:I.string(),name:I.string(),type:I.string(),sourcePath:I.string().optional()}),Ws=I.object({fromId:I.string(),toId:I.string(),fromName:I.string(),toName:I.string(),type:I.string()}),Gs=I.object({id:I.string(),name:I.string(),type:I.string()}),Ks=I.object({id:I.string(),nodeCount:I.number(),types:I.record(I.string(),I.number()),samples:I.array(Gs)}),qs=I.object({nodes:I.array(Us),edges:I.array(Ws),communities:I.array(Ks).optional(),totalNodes:I.number(),totalEdges:I.number(),query:I.string()});I.object({symbols:I.array(I.object({name:I.string(),path:I.string(),line:I.number().optional(),kind:I.string()})),totalDead:I.number()});const Js=I.object({gitRoot:I.string(),branch:I.string(),commitCount:I.number(),hasUncommitted:I.boolean(),recentCommits:I.array(I.object({hash:I.string(),message:I.string(),author:I.string(),date:I.string()}))}),Ys=I.object({sourceId:I.string(),value:I.string()}),Xs=I.object({id:I.string(),originalChars:I.number(),keptChars:I.number(),segmentsKept:I.number(),segmentsTotal:I.number()}),Zs=I.object({text:I.string().describe(`The compressed digest text output`),ref:I.string().optional().describe(`Reusable cache reference`),fields:I.record(I.string(),I.array(Ys)),sourceStats:I.array(Xs),totalOriginalChars:I.number(),totalCompressedChars:I.number(),ratio:I.number()}),Qs=I.object({passed:I.boolean(),totalTests:I.number(),passedTests:I.number(),failedTests:I.number(),skippedTests:I.number(),duration:I.number().describe(`Duration in milliseconds`),failures:I.array(I.object({name:I.string(),message:I.string(),file:I.string().optional()}))}),$s=k(`utils:enrich`);async function G(e,t){let n={curated:[],graph:[]},r=t.limit??3,[i,a]=await Promise.allSettled([ec(e,t.query,r),tc(e,t.filePath)]);return i.status===`fulfilled`?n.curated=i.value:$s.debug(`Curated enrichment failed`,{error:i.reason}),a.status===`fulfilled`?n.graph=a.value:$s.debug(`Graph enrichment failed`,{error:a.reason}),n}async function ec(e,t,n){if(!e.store||!t)return[];try{let r=await e.store.ftsSearch(t,{origin:`curated`,limit:n});if(r.length>0)return r.map(e=>nc(e.record));if(e.embedder){let r=await e.embedder.embedQuery(t);return(await e.store.search(r,{origin:`curated`,limit:n,minScore:.3})).map(e=>nc(e.record))}return[]}catch(e){return $s.debug(`Curated enrichment failed`,{error:e}),[]}}async function tc(e,t){if(!e.graphStore||!t)return[];try{let n=await e.graphStore.findNodes({sourcePath:t,limit:1});if(n.length===0){let r=t.split(/[/\\]/).pop()?.replace(/\.\w+$/,``)||``;if(!r)return[];let i=await e.graphStore.findNodes({namePattern:r,type:`module`,limit:1});if(i.length===0)return[];n.push(i[0])}let r=n[0],i=await e.graphStore.getNeighbors(r.id,{direction:`both`,limit:10}),a=[];for(let e of i.edges){let t=e.fromId===r.id?e.toId:e.fromId,n=i.nodes.find(e=>e.id===t);if(!n)continue;let o=e.fromId===r.id?`->`:`<-`;a.push(`${o} ${e.type}: ${n.name} (${n.type})`)}return a}catch(e){return $s.debug(`Graph enrichment failed`,{error:e}),[]}}function K(e){let t=[];if(e.curated.length>0){t.push(`**Curated Knowledge:**`);for(let n of e.curated)t.push(`- ${n}`)}if(e.graph.length>0){t.push(`**Graph Context:**`);for(let n of e.graph)t.push(`- ${n}`)}return t.length===0?``:`\n\n---\n### Enrichment\n${t.join(`
31
+ `)}`}function nc(e){let t=rc(e.metadata,`title`)||e.sourcePath||`Untitled`;return`[${rc(e.metadata,`category`)}] ${t}: ${e.content.slice(0,200)}`}function rc(e,t){let n=e?.[t];return typeof n==`string`?n:``}function q(e,t,n){return{content:[{type:`text`,text:`[ERROR:${e}] ${t}`}],isError:!0,...n==null?{}:{structuredContent:n}}}function J(e,t){return async(n,r)=>{let i=Date.now(),a=await t(n,r),o=Date.now()-i;return a._meta={...a._meta??{},durationMs:o,toolName:e},a}}const ic=k(`tools`),ac=I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`);function oc(e,t){return t?Vn(e,t):e}function sc(){let e=[];return ur.get()||e.push(`Tree-sitter unavailable — using regex fallback, symbol/pattern confidence reduced`),e.length===0?``:`\n\n> **⚠ Caveats:** ${e.join(`; `)}`}function cc(e){return(e??[]).map(e=>{if(typeof e==`string`)return e;if(e&&typeof e==`object`&&`path`in e)return typeof e.path==`string`?e.path:void 0}).filter(e=>!!e)}function lc(e){let t=[],n=e.filter(e=>/\.(ts|tsx|js|jsx)$/.test(e)&&/(service|store|model|schema|migration)/i.test(e)),r=e.filter(e=>/\.(ts|tsx|js|jsx)$/.test(e)&&!n.includes(e)),i=e.filter(e=>!/\.(ts|tsx|js|jsx)$/.test(e));return(n.length>0||r.length>0||i.length>0)&&(t.push(`
32
32
 
33
33
  ### Risk Assessment`),n.length>0&&t.push(`- 🔴 **High risk** (${n.length}): ${n.slice(0,5).map(e=>`\`${e}\``).join(`, `)}`),r.length>0&&t.push(`- 🟡 **Medium risk** (${r.length}): source files`),i.length>0&&t.push(`- 🟢 **Low risk** (${i.length}): non-source files`)),t.join(`
34
- `)}function lc(e){let t=e.replace(/\\/g,`/`);return/(^|\/)__tests__\/|\.(test|spec)\.[jt]sx?$/i.test(t)?`Tests`:/(controller|route|handler|api)/i.test(t)?`API`:/(service|store|model|schema|migration|repo|repository|db|database)/i.test(t)?`Core/Data`:/\.(ts|tsx|js|jsx)$/.test(t)?`Source`:`Config/Docs`}function uc(e){if(e.length===0)return``;let t=[`Core/Data`,`API`,`Source`,`Tests`,`Config/Docs`],n=new Map;for(let t of e){let e=lc(t),r=n.get(e)??[];r.push(t),n.set(e,r)}let r=[`
34
+ `)}function uc(e){let t=e.replace(/\\/g,`/`);return/(^|\/)__tests__\/|\.(test|spec)\.[jt]sx?$/i.test(t)?`Tests`:/(controller|route|handler|api)/i.test(t)?`API`:/(service|store|model|schema|migration|repo|repository|db|database)/i.test(t)?`Core/Data`:/\.(ts|tsx|js|jsx)$/.test(t)?`Source`:`Config/Docs`}function dc(e){if(e.length===0)return``;let t=[`Core/Data`,`API`,`Source`,`Tests`,`Config/Docs`],n=new Map;for(let t of e){let e=uc(t),r=n.get(e)??[];r.push(t),n.set(e,r)}let r=[`
35
35
 
36
36
  ### Layer Classification`];for(let e of t){let t=n.get(e);if(!t?.length)continue;let i=t.slice(0,5).map(e=>`\`${e}\``).join(`, `),a=t.length>5?`, ... and ${t.length-5} more`:``;r.push(`- **${e}** (${t.length}): ${i}${a}`)}return r.join(`
37
- `)}async function dc(e,t){if(!e||t.length===0)return[];let n=new Set;for(let r of t){let i=await e.findNodes({sourcePath:r,limit:10});for(let r of i){let i=await e.getNeighbors(r.id,{direction:`incoming`,edgeType:`imports`});for(let e of i.nodes){let r=e.sourcePath??e.name;t.includes(r)||n.add(r)}}}return[...n]}async function fc(e,t,n,r,i){try{let a=`produced/analysis/${n}/${Ce(r,12)}.md`,o=qe(`sha256`).update(i).digest(`hex`).slice(0,16),s=new Date().toISOString(),c=i.length>2e3?i.split(/(?=^## )/m).filter(e=>e.trim().length>0):[i],l=c.map((e,t)=>({id:qe(`sha256`).update(`${a}::${t}`).digest(`hex`).slice(0,16),content:e.trim(),sourcePath:a,contentType:`produced-knowledge`,chunkIndex:t,totalChunks:c.length,startLine:0,endLine:0,fileHash:o,indexedAt:s,origin:`produced`,tags:[`analysis`,n],category:`analysis`,version:1})),u=await t.embedBatch(l.map(e=>e.content));await e.upsert(l,u),rc.info(`Auto-persisted analysis`,{analyzerName:n,chunkCount:l.length})}catch(e){rc.warn(`Auto-persist analysis failed`,{analyzerName:n,...j(e)})}}const pc=I.enum([`structure`,`dependencies`,`symbols`,`patterns`,`entry_points`,`diagram`]),mc=I.string().describe(`Root path to analyze`),hc=I.boolean().default(!1).describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens. Default false — set true when you need stored decisions, conventions, or relationship context.`),gc=I.object({path:mc,max_depth:I.number().min(1).max(10).default(6).describe(`Maximum directory depth`),format:I.enum([`json`,`markdown`]).default(`markdown`).describe(`Output format`),max_tokens:ic,enrich:hc}),_c=I.object({path:mc,format:I.enum([`json`,`markdown`,`mermaid`]).default(`markdown`).describe(`Output format`),max_tokens:ic,enrich:hc}),vc=I.object({path:mc,filter:I.string().optional().describe(`Filter symbols by name substring`),format:I.enum([`json`,`markdown`]).default(`markdown`).describe(`Output format`),enrich:hc}),yc=I.object({path:mc,enrich:hc}),bc=I.object({path:mc,enrich:hc}),xc=I.object({path:mc,diagram_type:I.enum([`architecture`,`dependencies`]).default(`architecture`).describe(`Type of diagram`),enrich:hc}),Sc=I.object({path:mc,aspect:pc.describe(`Analysis aspect to execute`),max_depth:I.number().min(1).max(10).optional(),format:I.enum([`json`,`markdown`,`mermaid`]).optional(),filter:I.string().optional().describe(`Filter symbols by name substring`),diagram_type:I.enum([`architecture`,`dependencies`]).optional().describe(`Type of diagram when aspect="diagram"`)}),Cc=I.object({items:I.array(Sc).min(1).describe(`Array of analysis requests to run in batch.`),max_tokens:ic,enrich:hc});async function wc(e,t,n,r){return!n||!r?e:e+K(await G(r,{query:t,filePath:t}))}async function Tc(e,{store:t,embedder:n,enrichDeps:r}){let i=new or,{path:a,max_depth:o,format:s,max_tokens:c,enrich:l}=gc.parse(e),u=await i.analyze(a,{format:s,maxDepth:o,maxTokens:c});fc(t,n,`structure`,a,u.output);let d=u.data;return{content:[{type:`text`,text:ac(await wc(u.output+'\n\n---\n_Analysis auto-saved to AI Kit memory. Next: Use `analyze({ aspect: "dependencies", ... })` for import graphs, or `analyze({ aspect: "patterns", ... })` to detect architecture patterns._',a,l,r),c)}],structuredContent:{files:d.fileCount??u.meta.fileCount,packages:d.packageCount??0,languages:d.languages??{},tree:u.output.slice(0,2e3)}}}async function Ec(e,{store:t,embedder:n,enrichDeps:r}){let i=new tr,{path:a,format:o,max_tokens:s,enrich:c}=_c.parse(e),l=await i.analyze(a,{format:o});return fc(t,n,`dependencies`,a,l.output),{content:[{type:`text`,text:ac(await wc(l.output+'\n\n---\n_Analysis auto-saved to AI Kit memory. Next: Use `analyze({ aspect: "symbols", ... })` to explore exported symbols, or `analyze({ aspect: "diagram", ... })` for visual representation._',a,c,r),s)}]}}async function Dc(e,{store:t,embedder:n,enrichDeps:r}){let i=new sr,{path:a,filter:o,format:s,enrich:c}=vc.parse(e),l=await i.analyze(a,{format:s,filter:o});return fc(t,n,`symbols`,a,l.output),{content:[{type:`text`,text:await wc(l.output+oc()+'\n\n---\n_Analysis auto-saved to AI Kit memory. Next: Use `analyze({ aspect: "dependencies", ... })` to see import relationships, or `search` to find usage patterns._',a,c,r)}]}}async function Oc(e,{store:t,embedder:n,enrichDeps:r}){let i=new ar,{path:a,enrich:o}=yc.parse(e),s=await i.analyze(a);return fc(t,n,`patterns`,a,s.output),{content:[{type:`text`,text:await wc(s.output+oc()+'\n\n---\n_Analysis auto-saved to AI Kit memory. Next: Use `analyze({ aspect: "entry_points", ... })` to find Lambda handlers and main exports, or `produce_knowledge` for full analysis._',a,o,r)}]}}async function kc(e,{store:t,embedder:n,enrichDeps:r}){let i=new rr,{path:a,enrich:o}=bc.parse(e),s=await i.analyze(a);return fc(t,n,`entry-points`,a,s.output),{content:[{type:`text`,text:await wc(s.output+oc()+'\n\n---\n_Analysis auto-saved to AI Kit memory. Next: Use `analyze({ aspect: "dependencies", ... })` to see what each entry point imports, or `produce_knowledge` for comprehensive analysis._',a,o,r)}]}}async function Ac(e,{store:t,embedder:n,enrichDeps:r}){let i=new nr,{path:a,diagram_type:o,enrich:s}=xc.parse(e),c=await i.analyze(a,{diagramType:o});return fc(t,n,`diagram`,a,c.output),{content:[{type:`text`,text:await wc(c.output+'\n\n---\n_Analysis auto-saved to AI Kit memory. Next: Use `analyze({ aspect: "structure", ... })` for detailed file tree, or `produce_knowledge` for comprehensive analysis._',a,s,r)}]}}async function jc(e,t,n){switch(e){case`structure`:return Tc(t,n);case`dependencies`:return Ec(t,n);case`symbols`:return Dc(t,n);case`patterns`:return Oc(t,n);case`entry_points`:return kc(t,n);case`diagram`:return Ac(t,n)}}function Mc(e,t,n,r){let i=U(`analyze`);e.registerTool(`analyze`,{title:i.title,description:"Analyze a codebase using one of the supported aspects. Set `aspect` to structure, dependencies, symbols, patterns, entry_points, or diagram.",inputSchema:Cc.shape,annotations:i.annotations},J(`analyze`,async e=>{try{let i=Cc.parse(e);if(!i.items||i.items.length===0)return q(`VALIDATION`,`"items[]" is required.`);let a=await Promise.allSettled(i.items.map(async e=>{let a={...e,enrich:i.enrich,max_tokens:i.max_tokens};return jc(e.aspect,a,{store:t,embedder:n,enrichDeps:r})})),o=[],s=[];for(let e=0;e<a.length;e++){let t=a[e],n=i.items[e],r=`${n.aspect}:${n.path}`;if(t.status===`fulfilled`){let i=t.value.content[0]?.text??``;o.push(`## ${e+1}. ${r}\n${i}`),s.push({aspect:n.aspect,path:n.path,...`structuredContent`in t.value?t.value.structuredContent:{}})}else{let i=t.reason instanceof Error?t.reason.message:String(t.reason);o.push(`## ${e+1}. ${r}\nERROR: ${i}`),s.push({aspect:n.aspect,path:n.path,error:i})}}return{content:[{type:`text`,text:o.join(`
37
+ `)}async function fc(e,t){if(!e||t.length===0)return[];let n=new Set;for(let r of t){let i=await e.findNodes({sourcePath:r,limit:10});for(let r of i){let i=await e.getNeighbors(r.id,{direction:`incoming`,edgeType:`imports`});for(let e of i.nodes){let r=e.sourcePath??e.name;t.includes(r)||n.add(r)}}}return[...n]}async function pc(e,t,n,r,i){try{let a=`produced/analysis/${n}/${Ce(r,12)}.md`,o=qe(`sha256`).update(i).digest(`hex`).slice(0,16),s=new Date().toISOString(),c=i.length>2e3?i.split(/(?=^## )/m).filter(e=>e.trim().length>0):[i],l=c.map((e,t)=>({id:qe(`sha256`).update(`${a}::${t}`).digest(`hex`).slice(0,16),content:e.trim(),sourcePath:a,contentType:`produced-knowledge`,chunkIndex:t,totalChunks:c.length,startLine:0,endLine:0,fileHash:o,indexedAt:s,origin:`produced`,tags:[`analysis`,n],category:`analysis`,version:1})),u=await t.embedBatch(l.map(e=>e.content));await e.upsert(l,u),ic.info(`Auto-persisted analysis`,{analyzerName:n,chunkCount:l.length})}catch(e){ic.warn(`Auto-persist analysis failed`,{analyzerName:n,...j(e)})}}const mc=I.enum([`structure`,`dependencies`,`symbols`,`patterns`,`entry_points`,`diagram`]),hc=I.string().describe(`Root path to analyze`),gc=I.boolean().default(!1).describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens. Default false — set true when you need stored decisions, conventions, or relationship context.`),_c=I.object({path:hc,max_depth:I.number().min(1).max(10).default(6).describe(`Maximum directory depth`),format:I.enum([`json`,`markdown`]).default(`markdown`).describe(`Output format`),max_tokens:ac,enrich:gc}),vc=I.object({path:hc,format:I.enum([`json`,`markdown`,`mermaid`]).default(`markdown`).describe(`Output format`),max_tokens:ac,enrich:gc}),yc=I.object({path:hc,filter:I.string().optional().describe(`Filter symbols by name substring`),format:I.enum([`json`,`markdown`]).default(`markdown`).describe(`Output format`),enrich:gc}),bc=I.object({path:hc,enrich:gc}),xc=I.object({path:hc,enrich:gc}),Sc=I.object({path:hc,diagram_type:I.enum([`architecture`,`dependencies`]).default(`architecture`).describe(`Type of diagram`),enrich:gc}),Cc=I.object({path:hc,aspect:mc.describe(`Analysis aspect to execute`),max_depth:I.number().min(1).max(10).optional(),format:I.enum([`json`,`markdown`,`mermaid`]).optional(),filter:I.string().optional().describe(`Filter symbols by name substring`),diagram_type:I.enum([`architecture`,`dependencies`]).optional().describe(`Type of diagram when aspect="diagram"`)}),wc=I.object({items:I.array(Cc).min(1).describe(`Array of analysis requests to run in batch.`),max_tokens:ac,enrich:gc});async function Tc(e,t,n,r){return!n||!r?e:e+K(await G(r,{query:t,filePath:t}))}async function Ec(e,{store:t,embedder:n,enrichDeps:r}){let i=new sr,{path:a,max_depth:o,format:s,max_tokens:c,enrich:l}=_c.parse(e),u=await i.analyze(a,{format:s,maxDepth:o,maxTokens:c});pc(t,n,`structure`,a,u.output);let d=u.data;return{content:[{type:`text`,text:oc(await Tc(u.output+'\n\n---\n_Analysis auto-saved to AI Kit memory. Next: Use `analyze({ aspect: "dependencies", ... })` for import graphs, or `analyze({ aspect: "patterns", ... })` to detect architecture patterns._',a,l,r),c)}],structuredContent:{files:d.fileCount??u.meta.fileCount,packages:d.packageCount??0,languages:d.languages??{},tree:u.output.slice(0,2e3)}}}async function Dc(e,{store:t,embedder:n,enrichDeps:r}){let i=new nr,{path:a,format:o,max_tokens:s,enrich:c}=vc.parse(e),l=await i.analyze(a,{format:o});return pc(t,n,`dependencies`,a,l.output),{content:[{type:`text`,text:oc(await Tc(l.output+'\n\n---\n_Analysis auto-saved to AI Kit memory. Next: Use `analyze({ aspect: "symbols", ... })` to explore exported symbols, or `analyze({ aspect: "diagram", ... })` for visual representation._',a,c,r),s)}]}}async function Oc(e,{store:t,embedder:n,enrichDeps:r}){let i=new cr,{path:a,filter:o,format:s,enrich:c}=yc.parse(e),l=await i.analyze(a,{format:s,filter:o});return pc(t,n,`symbols`,a,l.output),{content:[{type:`text`,text:await Tc(l.output+sc()+'\n\n---\n_Analysis auto-saved to AI Kit memory. Next: Use `analyze({ aspect: "dependencies", ... })` to see import relationships, or `search` to find usage patterns._',a,c,r)}]}}async function kc(e,{store:t,embedder:n,enrichDeps:r}){let i=new or,{path:a,enrich:o}=bc.parse(e),s=await i.analyze(a);return pc(t,n,`patterns`,a,s.output),{content:[{type:`text`,text:await Tc(s.output+sc()+'\n\n---\n_Analysis auto-saved to AI Kit memory. Next: Use `analyze({ aspect: "entry_points", ... })` to find Lambda handlers and main exports, or `produce_knowledge` for full analysis._',a,o,r)}]}}async function Ac(e,{store:t,embedder:n,enrichDeps:r}){let i=new ir,{path:a,enrich:o}=xc.parse(e),s=await i.analyze(a);return pc(t,n,`entry-points`,a,s.output),{content:[{type:`text`,text:await Tc(s.output+sc()+'\n\n---\n_Analysis auto-saved to AI Kit memory. Next: Use `analyze({ aspect: "dependencies", ... })` to see what each entry point imports, or `produce_knowledge` for comprehensive analysis._',a,o,r)}]}}async function jc(e,{store:t,embedder:n,enrichDeps:r}){let i=new rr,{path:a,diagram_type:o,enrich:s}=Sc.parse(e),c=await i.analyze(a,{diagramType:o});return pc(t,n,`diagram`,a,c.output),{content:[{type:`text`,text:await Tc(c.output+'\n\n---\n_Analysis auto-saved to AI Kit memory. Next: Use `analyze({ aspect: "structure", ... })` for detailed file tree, or `produce_knowledge` for comprehensive analysis._',a,s,r)}]}}async function Mc(e,t,n){switch(e){case`structure`:return Ec(t,n);case`dependencies`:return Dc(t,n);case`symbols`:return Oc(t,n);case`patterns`:return kc(t,n);case`entry_points`:return Ac(t,n);case`diagram`:return jc(t,n)}}function Nc(e,t,n,r){let i=U(`analyze`);e.registerTool(`analyze`,{title:i.title,description:"Analyze a codebase using one of the supported aspects. Set `aspect` to structure, dependencies, symbols, patterns, entry_points, or diagram.",inputSchema:wc.shape,annotations:i.annotations},J(`analyze`,async e=>{try{let i=wc.parse(e);if(!i.items||i.items.length===0)return q(`VALIDATION`,`"items[]" is required.`);let a=await Promise.allSettled(i.items.map(async e=>{let a={...e,enrich:i.enrich,max_tokens:i.max_tokens};return Mc(e.aspect,a,{store:t,embedder:n,enrichDeps:r})})),o=[],s=[];for(let e=0;e<a.length;e++){let t=a[e],n=i.items[e],r=`${n.aspect}:${n.path}`;if(t.status===`fulfilled`){let i=t.value.content[0]?.text??``;o.push(`## ${e+1}. ${r}\n${i}`),s.push({aspect:n.aspect,path:n.path,...`structuredContent`in t.value?t.value.structuredContent:{}})}else{let i=t.reason instanceof Error?t.reason.message:String(t.reason);o.push(`## ${e+1}. ${r}\nERROR: ${i}`),s.push({aspect:n.aspect,path:n.path,error:i})}}return{content:[{type:`text`,text:o.join(`
38
38
 
39
- `)}],structuredContent:{items:s}}}catch(e){return rc.error(`Analysis failed`,j(e)),q(`INTERNAL`,`Analysis failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Nc(e,t,n,r,i){let a=new er,o=U(`blast_radius`);e.registerTool(`blast_radius`,{title:o.title,description:`Given a list of changed files, trace the dependency graph to find all affected files (direct + transitive importers) and their tests. Useful for scoping code reviews and impact analysis.`,outputSchema:zs,inputSchema:{path:I.string().describe(`Root path of the codebase`),files:I.array(I.string()).optional().describe(`Changed file paths (relative to root). If omitted, auto-detects from git status.`),max_depth:I.number().min(1).max(20).default(5).describe(`Maximum transitive dependency depth`),format:I.enum([`json`,`markdown`]).default(`markdown`).describe(`Output format`),max_tokens:ic,enrich:I.boolean().default(!0).describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens. Default true for planning tools — set false to save tokens when enrichment is not needed.`)},annotations:o.annotations},J(`blast_radius`,async({path:e,files:o,max_depth:s,format:c,max_tokens:l,enrich:u})=>{try{let d=o??[];if(d.length===0)try{let t=await It({cwd:e,includeDiff:!1});if(d=Array.from(new Set([...sc(t.status?.staged),...sc(t.status?.modified),...sc(t.status?.untracked)])),d.length===0)return{content:[{type:`text`,text:"No changed files detected from git status. Provide `files` explicitly or make changes first."}]}}catch{return q(`VALIDATION`,"Could not detect changed files from git. Provide `files` explicitly.")}let f=await a.analyze(e,{files:d,maxDepth:s,format:c}),p=[],m=``;if(r)try{p=await dc(r,d),p.length>0&&(m=`\n\n### Graph-discovered importers (${p.length})\n`+p.slice(0,20).map(e=>`- \`${e}\``).join(`
40
- `),p.length>20&&(m+=`\n- ... and ${p.length-20} more`))}catch{}let h=uc(d),g=cc(d),_=f.output+m+h+g+oc()+'\n\n---\n_Analysis auto-saved to AI Kit memory. Next: Use `analyze({ aspect: "dependencies", ... })` to see the full import graph, or `analyze({ aspect: "symbols", ... })` to inspect affected exports._';if(u&&i){let t=await G(i,{query:e,filePath:e});_+=K(t)}fc(t,n,`blast-radius`,e,_);let v=p.map(e=>({path:e,impact:`transitive`,reason:`imports changed file`})),y=d.length>10?`high`:d.length>3?`medium`:`low`;return{content:[{type:`text`,text:ac(_,l)}],structuredContent:{changedFiles:d,affectedFiles:v,totalAffected:v.length,riskLevel:y}}}catch(e){return rc.error(`Blast radius analysis failed`,j(e)),q(`INTERNAL`,`Blast radius analysis failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Pc=k(`task-manager`);let Fc=0;function Ic(e){let t=typeof e?.sendNotification==`function`;return{createTask(n,r){let i=`aikit-task-${++Fc}`,a=(n,r,a)=>{t&&e.sendNotification?.({method:`notifications/progress`,params:{progressToken:i,progress:n,total:r,...a?{message:a}:{}}}).catch(e=>{Pc.debug(`Progress notification failed`,{token:i,error:String(e)})})};return t&&Pc.debug(`Task created`,{token:i,title:n,totalSteps:r}),{progress(e,t){a(e,r,t??`${n}: step ${e+1}/${r}`)},complete(e){a(r,r,e??`${n}: complete`)},fail(e){a(r,r,e??`${n}: failed`)}}}}}const Lc=k(`tools`);function Rc(e,t,n,r){let i=U(`audit`);e.registerTool(`audit`,{title:i.title,description:`Run a unified audit: structure, dependencies, patterns, health, dead_symbols, check, entry_points. Returns synthesized report with score, recommendations, and next steps. 6 round-trips → 1.`,outputSchema:Vs,inputSchema:{path:I.string().default(`.`).describe(`Root path to audit`),checks:I.array(I.enum([`structure`,`dependencies`,`patterns`,`health`,`dead_symbols`,`check`,`entry_points`])).optional().describe(`Which checks to run (default: all)`),detail:I.enum(ye).optional().describe(`'efficient' for overview (~500 tokens), 'full' includes pattern table`)},annotations:i.annotations},async({path:e,checks:i,detail:a},o)=>{try{let s=await tt(t,n,{path:e,checks:i,detail:a??r??`efficient`});return Ic(o).createTask(`Audit`,1).complete(`Audit complete: ${s.data?.recommendations?.length??0} recommendations`),{content:[{type:`text`,text:s.ok?`${s.summary}\n\n---\n_Audit score: ${s.data?.score}/100 | ${s.meta.durationMs}ms${s.next&&s.next.length>0?` | Next: ${s.next.map(e=>`\`${e.tool}\` (${e.reason})`).join(`, `)}`:``}_`:s.error?.message??`Audit failed`}],isError:!s.ok,...s.ok&&s.data?{structuredContent:{passed:s.ok,score:s.data.score??0,checks:(s.data.recommendations??[]).map(e=>({name:e.area,passed:e.priority!==`high`,message:e.message,severity:e.priority})),summary:s.summary??``}}:{}}}catch(e){return Lc.error(`Audit failed`,j(e)),q(`INTERNAL`,`Audit failed: ${e instanceof Error?e.message:String(e)}`)}})}const zc=k(`tools`);function Bc(e){if(!e?.enabled)return;let t=process.env.AIKIT_ER_API_KEY;if(!t){zc.warn(`ER bridge enabled but AIKIT_ER_API_KEY not set; disabling`);return}return{enabled:!0,baseUrl:e.baseUrl,apiKey:t,timeoutMs:e.timeoutMs??5e3,cacheTtlMs:e.cacheTtlMs??360*60*1e3,cacheMaxEntries:e.cacheMaxEntries??100,fallbackThreshold:e.fallbackThreshold??.45}}function Vc(e){let t=Bc(e);if(t)try{let e=new dr(t),n=new ur({maxEntries:t.cacheMaxEntries,defaultTtl:t.cacheTtlMs}),r=new fr(e);try{let e=new URL(t.baseUrl).hostname;zc.info(`ER bridge initialized`,{host:e})}catch{zc.info(`ER bridge initialized`)}return{client:e,cache:n,pushAdapter:r,config:t}}catch(e){zc.warn(`ER bridge initialization failed`,j(e));return}}function Hc(e,t,n){let r=U(`er_push`);e.registerTool(`er_push`,{title:r.title,description:`Push a curated knowledge entry to Enterprise RAG. The entry is stored via ER's curated_remember tool and becomes immediately searchable in the enterprise AI Kit.`,inputSchema:{title:I.string().min(3).max(120).describe(`Title for the knowledge entry`),content:I.string().min(10).max(1e5).describe(`Markdown content to push (max 100KB)`),category:I.string().regex(/^[a-z][a-z0-9-]*$/).default(`conventions`).describe(`Category slug (e.g., "decisions", "patterns", "conventions")`),tags:I.array(I.string()).default([]).describe(`Optional tags`),rule_id:I.string().optional().describe(`ID of the classification rule that motivated this push (from remember classification signals). Improves rule effectiveness tracking.`)},annotations:r.annotations},J(`er_push`,async({title:e,content:r,category:i,tags:a,rule_id:o})=>{try{let s=`${i}/${e.toLowerCase().replace(/[^a-z0-9]+/g,`-`)}`,c=await t.pushAdapter.push(s,{title:e,content:r,category:i,tags:a});return c.pushed?(n&&n.recordPush(s,c.pushed,o),{content:[{type:`text`,text:`Pushed to ER: **${e}**\n\nRemote path: \`${c.remotePath??`unknown`}\`\nTimestamp: ${c.timestamp}\n\n---\n_Next: Use \`er_pull\` to verify the entry is searchable in ER, or \`er_sync_status\` to see push history._`}]}):(n&&n.recordPush(s,!1,o),q(`INTERNAL`,`ER push failed: ${c.error??`Unknown error`}\n\n_The local AI Kit is unaffected. You can retry or check ER health with \`er_sync_status\`._`))}catch(t){if(zc.error(`ER push failed`,j(t)),n){let t=`${i}/${e.toLowerCase().replace(/[^a-z0-9]+/g,`-`)}`;n.recordPush(t,!1,o)}return q(`INTERNAL`,`ER push failed: operation unsuccessful
39
+ `)}],structuredContent:{items:s}}}catch(e){return ic.error(`Analysis failed`,j(e)),q(`INTERNAL`,`Analysis failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Pc(e,t,n,r,i){let a=new tr,o=U(`blast_radius`);e.registerTool(`blast_radius`,{title:o.title,description:`Given a list of changed files, trace the dependency graph to find all affected files (direct + transitive importers) and their tests. Useful for scoping code reviews and impact analysis.`,outputSchema:Bs,inputSchema:{path:I.string().describe(`Root path of the codebase`),files:I.array(I.string()).optional().describe(`Changed file paths (relative to root). If omitted, auto-detects from git status.`),max_depth:I.number().min(1).max(20).default(5).describe(`Maximum transitive dependency depth`),format:I.enum([`json`,`markdown`]).default(`markdown`).describe(`Output format`),max_tokens:ac,enrich:I.boolean().default(!0).describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens. Default true for planning tools — set false to save tokens when enrichment is not needed.`)},annotations:o.annotations},J(`blast_radius`,async({path:e,files:o,max_depth:s,format:c,max_tokens:l,enrich:u})=>{try{let d=o??[];if(d.length===0)try{let t=await It({cwd:e,includeDiff:!1});if(d=Array.from(new Set([...cc(t.status?.staged),...cc(t.status?.modified),...cc(t.status?.untracked)])),d.length===0)return{content:[{type:`text`,text:"No changed files detected from git status. Provide `files` explicitly or make changes first."}]}}catch{return q(`VALIDATION`,"Could not detect changed files from git. Provide `files` explicitly.")}let f=await a.analyze(e,{files:d,maxDepth:s,format:c}),p=[],m=``;if(r)try{p=await fc(r,d),p.length>0&&(m=`\n\n### Graph-discovered importers (${p.length})\n`+p.slice(0,20).map(e=>`- \`${e}\``).join(`
40
+ `),p.length>20&&(m+=`\n- ... and ${p.length-20} more`))}catch{}let h=dc(d),g=lc(d),_=f.output+m+h+g+sc()+'\n\n---\n_Analysis auto-saved to AI Kit memory. Next: Use `analyze({ aspect: "dependencies", ... })` to see the full import graph, or `analyze({ aspect: "symbols", ... })` to inspect affected exports._';if(u&&i){let t=await G(i,{query:e,filePath:e});_+=K(t)}pc(t,n,`blast-radius`,e,_);let v=p.map(e=>({path:e,impact:`transitive`,reason:`imports changed file`})),y=d.length>10?`high`:d.length>3?`medium`:`low`;return{content:[{type:`text`,text:oc(_,l)}],structuredContent:{changedFiles:d,affectedFiles:v,totalAffected:v.length,riskLevel:y}}}catch(e){return ic.error(`Blast radius analysis failed`,j(e)),q(`INTERNAL`,`Blast radius analysis failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Fc=k(`task-manager`);let Ic=0;function Lc(e){let t=typeof e?.sendNotification==`function`;return{createTask(n,r){let i=`aikit-task-${++Ic}`,a=(n,r,a)=>{t&&e.sendNotification?.({method:`notifications/progress`,params:{progressToken:i,progress:n,total:r,...a?{message:a}:{}}}).catch(e=>{Fc.debug(`Progress notification failed`,{token:i,error:String(e)})})};return t&&Fc.debug(`Task created`,{token:i,title:n,totalSteps:r}),{progress(e,t){a(e,r,t??`${n}: step ${e+1}/${r}`)},complete(e){a(r,r,e??`${n}: complete`)},fail(e){a(r,r,e??`${n}: failed`)}}}}}const Rc=k(`tools`);function zc(e,t,n,r){let i=U(`audit`);e.registerTool(`audit`,{title:i.title,description:`Run a unified audit: structure, dependencies, patterns, health, dead_symbols, check, entry_points. Returns synthesized report with score, recommendations, and next steps. 6 round-trips → 1.`,outputSchema:Hs,inputSchema:{path:I.string().default(`.`).describe(`Root path to audit`),checks:I.array(I.enum([`structure`,`dependencies`,`patterns`,`health`,`dead_symbols`,`check`,`entry_points`])).optional().describe(`Which checks to run (default: all)`),detail:I.enum(ye).optional().describe(`'efficient' for overview (~500 tokens), 'full' includes pattern table`)},annotations:i.annotations},async({path:e,checks:i,detail:a},o)=>{try{let s=await tt(t,n,{path:e,checks:i,detail:a??r??`efficient`});return Lc(o).createTask(`Audit`,1).complete(`Audit complete: ${s.data?.recommendations?.length??0} recommendations`),{content:[{type:`text`,text:s.ok?`${s.summary}\n\n---\n_Audit score: ${s.data?.score}/100 | ${s.meta.durationMs}ms${s.next&&s.next.length>0?` | Next: ${s.next.map(e=>`\`${e.tool}\` (${e.reason})`).join(`, `)}`:``}_`:s.error?.message??`Audit failed`}],isError:!s.ok,...s.ok&&s.data?{structuredContent:{passed:s.ok,score:s.data.score??0,checks:(s.data.recommendations??[]).map(e=>({name:e.area,passed:e.priority!==`high`,message:e.message,severity:e.priority})),summary:s.summary??``}}:{}}}catch(e){return Rc.error(`Audit failed`,j(e)),q(`INTERNAL`,`Audit failed: ${e instanceof Error?e.message:String(e)}`)}})}const Bc=k(`tools`);function Vc(e){if(!e?.enabled)return;let t=process.env.AIKIT_ER_API_KEY;if(!t){Bc.warn(`ER bridge enabled but AIKIT_ER_API_KEY not set; disabling`);return}return{enabled:!0,baseUrl:e.baseUrl,apiKey:t,timeoutMs:e.timeoutMs??5e3,cacheTtlMs:e.cacheTtlMs??360*60*1e3,cacheMaxEntries:e.cacheMaxEntries??100,fallbackThreshold:e.fallbackThreshold??.45}}function Hc(e){let t=Vc(e);if(t)try{let e=new fr(t),n=new dr({maxEntries:t.cacheMaxEntries,defaultTtl:t.cacheTtlMs}),r=new pr(e);try{let e=new URL(t.baseUrl).hostname;Bc.info(`ER bridge initialized`,{host:e})}catch{Bc.info(`ER bridge initialized`)}return{client:e,cache:n,pushAdapter:r,config:t}}catch(e){Bc.warn(`ER bridge initialization failed`,j(e));return}}function Uc(e,t,n){let r=U(`er_push`);e.registerTool(`er_push`,{title:r.title,description:`Push a curated knowledge entry to Enterprise RAG. The entry is stored via ER's curated_remember tool and becomes immediately searchable in the enterprise AI Kit.`,inputSchema:{title:I.string().min(3).max(120).describe(`Title for the knowledge entry`),content:I.string().min(10).max(1e5).describe(`Markdown content to push (max 100KB)`),category:I.string().regex(/^[a-z][a-z0-9-]*$/).default(`conventions`).describe(`Category slug (e.g., "decisions", "patterns", "conventions")`),tags:I.array(I.string()).default([]).describe(`Optional tags`),rule_id:I.string().optional().describe(`ID of the classification rule that motivated this push (from remember classification signals). Improves rule effectiveness tracking.`)},annotations:r.annotations},J(`er_push`,async({title:e,content:r,category:i,tags:a,rule_id:o})=>{try{let s=`${i}/${e.toLowerCase().replace(/[^a-z0-9]+/g,`-`)}`,c=await t.pushAdapter.push(s,{title:e,content:r,category:i,tags:a});return c.pushed?(n&&n.recordPush(s,c.pushed,o),{content:[{type:`text`,text:`Pushed to ER: **${e}**\n\nRemote path: \`${c.remotePath??`unknown`}\`\nTimestamp: ${c.timestamp}\n\n---\n_Next: Use \`er_pull\` to verify the entry is searchable in ER, or \`er_sync_status\` to see push history._`}]}):(n&&n.recordPush(s,!1,o),q(`INTERNAL`,`ER push failed: ${c.error??`Unknown error`}\n\n_The local AI Kit is unaffected. You can retry or check ER health with \`er_sync_status\`._`))}catch(t){if(Bc.error(`ER push failed`,j(t)),n){let t=`${i}/${e.toLowerCase().replace(/[^a-z0-9]+/g,`-`)}`;n.recordPush(t,!1,o)}return q(`INTERNAL`,`ER push failed: operation unsuccessful
41
41
 
42
- _The local AI Kit is unaffected. You can retry or check ER health with \`er_sync_status\`._`)}}))}function Uc(e,t){let n=U(`er_pull`);e.registerTool(`er_pull`,{title:n.title,description:`Explicitly search the Enterprise RAG AI Kit. Returns results from the enterprise system only (not local AI Kit). Uses a cache with 6-hour TTL to reduce API calls.`,inputSchema:{query:I.string().min(1).max(2e3).describe(`Search query for Enterprise RAG AI Kit (max 2000 chars)`),max_results:I.number().min(1).max(20).default(5).describe(`Maximum results to return`),bypass_cache:I.boolean().default(!0).describe(`Skip cache and fetch fresh results from ER (default: true per DR-001)`)},annotations:n.annotations},J(`er_pull`,async({query:e,max_results:n,bypass_cache:r})=>{try{if(!r){let r=t.cache.get(e);if(r)return{content:[{type:`text`,text:`${r.slice(0,n).map((e,t)=>`### Result ${t+1} (score: ${e.score.toFixed(3)}, source: ER cached)\n- **Source**: ${e.sourcePath}\n\n${e.content}`).join(`
42
+ _The local AI Kit is unaffected. You can retry or check ER health with \`er_sync_status\`._`)}}))}function Wc(e,t){let n=U(`er_pull`);e.registerTool(`er_pull`,{title:n.title,description:`Explicitly search the Enterprise RAG AI Kit. Returns results from the enterprise system only (not local AI Kit). Uses a cache with 6-hour TTL to reduce API calls.`,inputSchema:{query:I.string().min(1).max(2e3).describe(`Search query for Enterprise RAG AI Kit (max 2000 chars)`),max_results:I.number().min(1).max(20).default(5).describe(`Maximum results to return`),bypass_cache:I.boolean().default(!0).describe(`Skip cache and fetch fresh results from ER (default: true per DR-001)`)},annotations:n.annotations},J(`er_pull`,async({query:e,max_results:n,bypass_cache:r})=>{try{if(!r){let r=t.cache.get(e);if(r)return{content:[{type:`text`,text:`${r.slice(0,n).map((e,t)=>`### Result ${t+1} (score: ${e.score.toFixed(3)}, source: ER cached)\n- **Source**: ${e.sourcePath}\n\n${e.content}`).join(`
43
43
 
44
44
  ---
45
45
 
@@ -47,12 +47,12 @@ _The local AI Kit is unaffected. You can retry or check ER health with \`er_sync
47
47
 
48
48
  ---
49
49
 
50
- `)}\n\n---\n_Source: Enterprise RAG (${i.length} results) | Results cached for ${Math.floor(t.config.cacheTtlMs/36e5)}h_`}]}}catch(e){return zc.error(`ER pull failed`,j(e)),q(`INTERNAL`,`ER pull failed: search request unsuccessful
50
+ `)}\n\n---\n_Source: Enterprise RAG (${i.length} results) | Results cached for ${Math.floor(t.config.cacheTtlMs/36e5)}h_`}]}}catch(e){return Bc.error(`ER pull failed`,j(e)),q(`INTERNAL`,`ER pull failed: search request unsuccessful
51
51
 
52
- _Enterprise RAG may be unavailable. Local AI Kit search is unaffected._`)}}))}function Wc(e,t){let n=U(`er_sync_status`);e.registerTool(`er_sync_status`,{title:n.title,description:`Show the status of the Enterprise RAG bridge: health, cache stats, and push history.`,inputSchema:{check_health:I.boolean().default(!0).describe(`Whether to ping ER health endpoint (adds latency)`)},annotations:n.annotations},J(`er_sync_status`,async({check_health:e})=>{try{let n=t.cache.stats(),r=t.pushAdapter.getStatus(),i=new URL(t.config.baseUrl),a=`${i.protocol}//${i.hostname}${i.port?`:${i.port}`:``}`,o=`_Health check skipped_`;if(e){let e=await t.client.health();o=e.healthy?`✅ Healthy (HTTP ${e.status})`:`❌ Unhealthy${e.status?` (HTTP ${e.status})`:``}`}let s=[`## ER Bridge Status
52
+ _Enterprise RAG may be unavailable. Local AI Kit search is unaffected._`)}}))}function Gc(e,t){let n=U(`er_sync_status`);e.registerTool(`er_sync_status`,{title:n.title,description:`Show the status of the Enterprise RAG bridge: health, cache stats, and push history.`,inputSchema:{check_health:I.boolean().default(!0).describe(`Whether to ping ER health endpoint (adds latency)`)},annotations:n.annotations},J(`er_sync_status`,async({check_health:e})=>{try{let n=t.cache.stats(),r=t.pushAdapter.getStatus(),i=new URL(t.config.baseUrl),a=`${i.protocol}//${i.hostname}${i.port?`:${i.port}`:``}`,o=`_Health check skipped_`;if(e){let e=await t.client.health();o=e.healthy?`✅ Healthy (HTTP ${e.status})`:`❌ Unhealthy${e.status?` (HTTP ${e.status})`:``}`}let s=[`## ER Bridge Status
53
53
  `,`**Endpoint**: \`${a}\``,`**Health**: ${o}`,`**Threshold**: ${t.config.fallbackThreshold} (vector similarity for auto-fallback)`,``,`### Cache`,`- Entries: ${n.size} / ${n.maxEntries}`,`- TTL: ${Math.floor(n.defaultTtlMs/36e5)}h`,``,`### Push History`,`- Total pushed: ${r.totalPushed}`,`- Successful: ${r.successCount}`,`- Failed: ${r.failCount}`];return r.lastPush&&s.push(`- Last push: "${r.lastPush.title}" at ${r.lastPush.pushedAt} (${r.lastPush.status})`),s.push("\n---\n_Next: Use `er_push` to send knowledge to ER, or `er_pull` to search ER._"),{content:[{type:`text`,text:s.join(`
54
- `)}]}}catch(e){return zc.error(`ER sync status failed`,j(e)),q(`INTERNAL`,`ER sync status failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Y(e){return String(e??``).replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`)}const Gc=I.object({action:I.enum([`view`,`update`]).default(`view`).describe(`Action to perform: view current configuration or update it`),updates:I.record(I.string(),I.unknown()).optional().describe(`Partial configuration to merge when action is "update". Supports nested paths like { "indexing": { "chunkSize": 2000 } }`)}),Kc=k(`config-tool`),qc=`ui://aikit/config.html`,Jc=[`serverName`,`toolPrefix`,`autoIndex`,`sources`,`indexing`,`tokenBudget`];function Yc(){let e=process.env.AIKIT_CONFIG_PATH;if(e&&M(e))return e;let t=A();if(t){let e=F(t,`aikit.config.json`);if(M(e))return e}return``}function Xc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Zc(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];if(Xc(t)&&Xc(r)){n[e]=Zc(t,r);continue}n[e]=r}return n}function Qc(e){return e===void 0?`undefined`:JSON.stringify(e)}function $c(e,t,n,r=``){let i=[];for(let[a,o]of Object.entries(n)){let n=r?`${r}.${a}`:a,s=e[a],c=t[a];if(Xc(o)&&Xc(s)&&Xc(c)){i.push(...$c(s,c,o,n));continue}Qc(s)!==Qc(c)&&i.push(`- ${n}: ${Qc(s)} -> ${Qc(c)}`)}return i}function el(e){let t=[];for(let[n,r]of Object.entries(e)){if(n===`store`||n===`embedding`||n===`er`){t.push(`Field "${n}" cannot be updated through this tool because it requires a restart.`);continue}if(n===`onboardDir`||n===`stateDir`||n===`curated`){t.push(`Field "${n}" cannot be updated through this tool because it requires a restart.`);continue}if(n===`autoIndex`){typeof r!=`boolean`&&t.push(`autoIndex must be a boolean.`);continue}if(n===`serverName`||n===`toolPrefix`){typeof r!=`string`&&t.push(`${n} must be a string.`);continue}if(n===`sources`){(!Array.isArray(r)||r.length===0)&&t.push(`sources must be a non-empty array.`);continue}if(n===`indexing`){if(!Xc(r)){t.push(`indexing must be an object.`);continue}for(let[e,n]of Object.entries(r)){if(e!==`chunkSize`&&e!==`chunkOverlap`&&e!==`minChunkSize`&&e!==`concurrency`){t.push(`indexing.${e} is not updatable through this tool.`);continue}(typeof n!=`number`||!Number.isFinite(n)||n<=0)&&t.push(`indexing.${e} must be a positive number.`)}continue}if(n===`tokenBudget`){(typeof r!=`string`||!ye.includes(r))&&t.push(`tokenBudget must be one of: ${ye.join(`, `)}.`);continue}t.push(`Field "${n}" is not updatable through this tool.`)}return t}function tl(e){let t=[];if(`autoIndex`in e&&typeof e.autoIndex!=`boolean`&&t.push(`autoIndex must be a boolean.`),`serverName`in e&&e.serverName!==void 0&&typeof e.serverName!=`string`&&t.push(`serverName must be a string.`),`toolPrefix`in e&&e.toolPrefix!==void 0&&typeof e.toolPrefix!=`string`&&t.push(`toolPrefix must be a string.`),(!Array.isArray(e.sources)||e.sources.length===0)&&t.push(`sources must be a non-empty array.`),!Xc(e.indexing))return t.push(`indexing must be an object.`),t;for(let n of[`chunkSize`,`chunkOverlap`,`minChunkSize`,`concurrency`]){let r=e.indexing[n];r!==void 0&&(typeof r!=`number`||!Number.isFinite(r)||r<=0)&&t.push(`indexing.${n} must be a positive number.`)}return t}function nl(e){let t=JSON.parse(N(e,`utf-8`));if(!Xc(t))throw Error(`Config file must contain a JSON object.`);return t}function rl(e,t){return[`AI Kit Configuration`,`Config file: ${t}`,``,JSON.stringify(e,null,2)].join(`
55
- `)}function il(e){return e===void 0?``:Xc(e)||Array.isArray(e)?JSON.stringify(e,null,2):String(e)}function al(e){let t=e.metrics??[],n={success:`#22c55e`,warning:`#f59e0b`,error:`#ef4444`,info:`#38bdf8`},r={up:`↑`,down:`↓`,neutral:`→`};return`
54
+ `)}]}}catch(e){return Bc.error(`ER sync status failed`,j(e)),q(`INTERNAL`,`ER sync status failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Y(e){return String(e??``).replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`)}const Kc=I.object({action:I.enum([`view`,`update`]).default(`view`).describe(`Action to perform: view current configuration or update it`),updates:I.record(I.string(),I.unknown()).optional().describe(`Partial configuration to merge when action is "update". Supports nested paths like { "indexing": { "chunkSize": 2000 } }`)}),qc=k(`config-tool`),Jc=`ui://aikit/config.html`,Yc=[`serverName`,`toolPrefix`,`autoIndex`,`sources`,`indexing`,`tokenBudget`];function Xc(){let e=process.env.AIKIT_CONFIG_PATH;if(e&&M(e))return e;let t=A();if(t){let e=F(t,`aikit.config.json`);if(M(e))return e}return``}function Zc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Qc(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];if(Zc(t)&&Zc(r)){n[e]=Qc(t,r);continue}n[e]=r}return n}function $c(e){return e===void 0?`undefined`:JSON.stringify(e)}function el(e,t,n,r=``){let i=[];for(let[a,o]of Object.entries(n)){let n=r?`${r}.${a}`:a,s=e[a],c=t[a];if(Zc(o)&&Zc(s)&&Zc(c)){i.push(...el(s,c,o,n));continue}$c(s)!==$c(c)&&i.push(`- ${n}: ${$c(s)} -> ${$c(c)}`)}return i}function tl(e){let t=[];for(let[n,r]of Object.entries(e)){if(n===`store`||n===`embedding`||n===`er`){t.push(`Field "${n}" cannot be updated through this tool because it requires a restart.`);continue}if(n===`onboardDir`||n===`stateDir`||n===`curated`){t.push(`Field "${n}" cannot be updated through this tool because it requires a restart.`);continue}if(n===`autoIndex`){typeof r!=`boolean`&&t.push(`autoIndex must be a boolean.`);continue}if(n===`serverName`||n===`toolPrefix`){typeof r!=`string`&&t.push(`${n} must be a string.`);continue}if(n===`sources`){(!Array.isArray(r)||r.length===0)&&t.push(`sources must be a non-empty array.`);continue}if(n===`indexing`){if(!Zc(r)){t.push(`indexing must be an object.`);continue}for(let[e,n]of Object.entries(r)){if(e!==`chunkSize`&&e!==`chunkOverlap`&&e!==`minChunkSize`&&e!==`concurrency`){t.push(`indexing.${e} is not updatable through this tool.`);continue}(typeof n!=`number`||!Number.isFinite(n)||n<=0)&&t.push(`indexing.${e} must be a positive number.`)}continue}if(n===`tokenBudget`){(typeof r!=`string`||!ye.includes(r))&&t.push(`tokenBudget must be one of: ${ye.join(`, `)}.`);continue}t.push(`Field "${n}" is not updatable through this tool.`)}return t}function nl(e){let t=[];if(`autoIndex`in e&&typeof e.autoIndex!=`boolean`&&t.push(`autoIndex must be a boolean.`),`serverName`in e&&e.serverName!==void 0&&typeof e.serverName!=`string`&&t.push(`serverName must be a string.`),`toolPrefix`in e&&e.toolPrefix!==void 0&&typeof e.toolPrefix!=`string`&&t.push(`toolPrefix must be a string.`),(!Array.isArray(e.sources)||e.sources.length===0)&&t.push(`sources must be a non-empty array.`),!Zc(e.indexing))return t.push(`indexing must be an object.`),t;for(let n of[`chunkSize`,`chunkOverlap`,`minChunkSize`,`concurrency`]){let r=e.indexing[n];r!==void 0&&(typeof r!=`number`||!Number.isFinite(r)||r<=0)&&t.push(`indexing.${n} must be a positive number.`)}return t}function rl(e){let t=JSON.parse(N(e,`utf-8`));if(!Zc(t))throw Error(`Config file must contain a JSON object.`);return t}function il(e,t){return[`AI Kit Configuration`,`Config file: ${t}`,``,JSON.stringify(e,null,2)].join(`
55
+ `)}function al(e){return e===void 0?``:Zc(e)||Array.isArray(e)?JSON.stringify(e,null,2):String(e)}function ol(e){let t=e.metrics??[],n={success:`#22c55e`,warning:`#f59e0b`,error:`#ef4444`,info:`#38bdf8`},r={up:`↑`,down:`↓`,neutral:`→`};return`
56
56
  <style>
57
57
  .db-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px}
58
58
  .db-card{padding:14px;border:1px solid var(--aikit-border,#3c3c3c);border-left-width:4px;border-radius:8px;background:var(--aikit-surface,#252526)}
@@ -69,7 +69,7 @@ _Enterprise RAG may be unavailable. Local AI Kit search is unaffected._`)}}))}fu
69
69
  <div class="db-card" style="border-left-color:${t}">
70
70
  <div class="db-label">${Y(e.label)}</div>
71
71
  ${a}
72
- </div>`}).join(``)}</div>`}function ol(e){let t=e.fields??[];return`
72
+ </div>`}).join(``)}</div>`}function sl(e){let t=e.fields??[];return`
73
73
  <style>
74
74
  .fm-container{display:grid;grid-template-columns:1fr 280px;gap:24px}
75
75
  @media(max-width:640px){.fm-container{grid-template-columns:1fr}}
@@ -134,9 +134,9 @@ _Enterprise RAG may be unavailable. Local AI Kit search is unaffected._`)}}))}fu
134
134
  }
135
135
  });
136
136
  })();
137
- <\/script>`}function sl(e){return al({metrics:Object.entries(e).map(([e,t])=>({label:e,value:Xc(t)||Array.isArray(t)?JSON.stringify(t,null,2):String(t),status:`info`}))})}function cl(e){return ol({fields:Jc.map(t=>{let n=e[t];return typeof n==`boolean`?{name:t,label:t,type:`select`,options:[`true`,`false`],value:String(n)}:{name:t,label:t,type:Xc(n)||Array.isArray(n)?`textarea`:`text`,value:il(n)}})})}function ll(e,t){return`<!DOCTYPE html><html><head><meta charset="utf-8"><title>${e}</title><style>:root{--aikit-bg:#1e1e1e;--aikit-surface:#252526;--aikit-surface2:#2d2d30;--aikit-border:#3c3c3c;--aikit-text:#e5e7eb;--aikit-muted:#9ca3af;--aikit-accent:#60a5fa;--aikit-success:#22c55e;font-family:system-ui,sans-serif}body{margin:0;padding:20px;background:var(--aikit-bg);color:var(--aikit-text);font-family:system-ui,sans-serif}h2{margin:0 0 16px}</style></head><body><h2>${e}</h2>${t}</body></html>`}function ul(e){let t=``,n=``,r=!1;return function(i,a){t=i,n=a,!r&&(r=!0,gr(e,`AI Kit Config App`,qc,{description:`View and update AI Kit configuration`},async()=>({contents:[{uri:qc,mimeType:mr,text:ll(t,n)}]})))}}function dl(e,t){let n=U(`config`),r=ul(e);_r(e,`config`,{title:n.title,description:`View and update AI Kit server configuration. Use action "view" to see current settings, or "update" to modify configuration values. Changes are written to aikit.config.json and take effect on next server restart. Some settings (store, embedding) require a full restart.`,inputSchema:Gc,annotations:n.annotations,_meta:{ui:{resourceUri:qc}}},J(`config`,async e=>{let{action:n,updates:i}=e;if(t.readOnly&&n!==`view`)return q(`PERMISSION`,`Configuration updates are disabled in read-only mode`);if(n===`view`){let e=Yc(),n=e||`(runtime config only; no aikit.config.json found)`;try{let i=e?nl(e):t,a=rl(i,n);return r(`Configuration`,sl(i)),{content:[{type:`text`,text:a}],ui:{type:`resource`,uri:qc}}}catch(t){return Kc.error(`Failed to read config for view`,{configPath:e,error:t instanceof Error?t.message:String(t)}),{content:[{type:`text`,text:`Failed to read configuration from ${n}: ${t instanceof Error?t.message:String(t)}`}]}}}if(!i)return r(`Configuration Form`,cl(t)),{content:[{type:`text`,text:`No updates provided. Pass an updates object when action is "update".`}],ui:{type:`resource`,uri:qc}};let a=Yc();if(!a)return r(`Configuration Form`,cl(t)),{content:[{type:`text`,text:`No config file found to update.`}],ui:{type:`resource`,uri:qc}};let o=el(i);if(o.length>0)return r(`Configuration Form`,cl(nl(a))),{content:[{type:`text`,text:`Configuration update rejected:\n${o.map(e=>`- ${e}`).join(`
138
- `)}`}],ui:{type:`resource`,uri:qc}};try{let e=nl(a),t=Zc(e,i),n=tl(t);if(n.length>0)return r(`Configuration Form`,cl(e)),{content:[{type:`text`,text:`Configuration update rejected:\n${n.map(e=>`- ${e}`).join(`
139
- `)}`}],ui:{type:`resource`,uri:qc}};Pe(a,JSON.stringify(t,null,2),`utf-8`);let o=$c(e,t,i),s=`Configuration updated successfully.
137
+ <\/script>`}function cl(e){return ol({metrics:Object.entries(e).map(([e,t])=>({label:e,value:Zc(t)||Array.isArray(t)?JSON.stringify(t,null,2):String(t),status:`info`}))})}function ll(e){return sl({fields:Yc.map(t=>{let n=e[t];return typeof n==`boolean`?{name:t,label:t,type:`select`,options:[`true`,`false`],value:String(n)}:{name:t,label:t,type:Zc(n)||Array.isArray(n)?`textarea`:`text`,value:al(n)}})})}function ul(e,t){return`<!DOCTYPE html><html><head><meta charset="utf-8"><title>${e}</title><style>:root{--aikit-bg:#1e1e1e;--aikit-surface:#252526;--aikit-surface2:#2d2d30;--aikit-border:#3c3c3c;--aikit-text:#e5e7eb;--aikit-muted:#9ca3af;--aikit-accent:#60a5fa;--aikit-success:#22c55e;font-family:system-ui,sans-serif}body{margin:0;padding:20px;background:var(--aikit-bg);color:var(--aikit-text);font-family:system-ui,sans-serif}h2{margin:0 0 16px}</style></head><body><h2>${e}</h2>${t}</body></html>`}function dl(e){let t=``,n=``,r=!1;return function(i,a){t=i,n=a,!r&&(r=!0,_r(e,`AI Kit Config App`,Jc,{description:`View and update AI Kit configuration`},async()=>({contents:[{uri:Jc,mimeType:hr,text:ul(t,n)}]})))}}function fl(e,t){let n=U(`config`),r=dl(e);vr(e,`config`,{title:n.title,description:`View and update AI Kit server configuration. Use action "view" to see current settings, or "update" to modify configuration values. Changes are written to aikit.config.json and take effect on next server restart. Some settings (store, embedding) require a full restart.`,inputSchema:Kc,annotations:n.annotations,_meta:{ui:{resourceUri:Jc}}},J(`config`,async e=>{let{action:n,updates:i}=e;if(t.readOnly&&n!==`view`)return q(`PERMISSION`,`Configuration updates are disabled in read-only mode`);if(n===`view`){let e=Xc(),n=e||`(runtime config only; no aikit.config.json found)`;try{let i=e?rl(e):t,a=il(i,n);return r(`Configuration`,cl(i)),{content:[{type:`text`,text:a}],ui:{type:`resource`,uri:Jc}}}catch(t){return qc.error(`Failed to read config for view`,{configPath:e,error:t instanceof Error?t.message:String(t)}),{content:[{type:`text`,text:`Failed to read configuration from ${n}: ${t instanceof Error?t.message:String(t)}`}]}}}if(!i)return r(`Configuration Form`,ll(t)),{content:[{type:`text`,text:`No updates provided. Pass an updates object when action is "update".`}],ui:{type:`resource`,uri:Jc}};let a=Xc();if(!a)return r(`Configuration Form`,ll(t)),{content:[{type:`text`,text:`No config file found to update.`}],ui:{type:`resource`,uri:Jc}};let o=tl(i);if(o.length>0)return r(`Configuration Form`,ll(rl(a))),{content:[{type:`text`,text:`Configuration update rejected:\n${o.map(e=>`- ${e}`).join(`
138
+ `)}`}],ui:{type:`resource`,uri:Jc}};try{let e=rl(a),t=Qc(e,i),n=nl(t);if(n.length>0)return r(`Configuration Form`,ll(e)),{content:[{type:`text`,text:`Configuration update rejected:\n${n.map(e=>`- ${e}`).join(`
139
+ `)}`}],ui:{type:`resource`,uri:Jc}};Pe(a,JSON.stringify(t,null,2),`utf-8`);let o=el(e,t,i),s=`Configuration updated successfully.
140
140
 
141
141
  Config file: ${a}
142
142
 
@@ -144,31 +144,31 @@ Changed values:
144
144
  ${o.length>0?o.join(`
145
145
  `):`- No effective changes; requested values already matched the file.`}
146
146
 
147
- These changes take effect on the next server restart.`;return r(`Configuration`,sl(t)),{content:[{type:`text`,text:s}],ui:{type:`resource`,uri:qc}}}catch(e){return Kc.error(`Failed to update config`,{configPath:a,error:e instanceof Error?e.message:String(e)}),{content:[{type:`text`,text:`Failed to update configuration in ${a}: ${e instanceof Error?e.message:String(e)}`}]}}})),r(`Configuration`,sl(t))}const fl=k(`cross-workspace`);function pl(e,t){if(!we())return[];let n=Te();if(n.length===0)return[];if(e.includes(`*`))return t?n.filter(e=>e.partition!==t):n;let r=[];for(let i of e){let e=n.find(e=>e.partition===i);if(e){e.partition!==t&&r.push(e);continue}let a=n.filter(e=>e.partition!==t&&e.partition.replace(/-[a-f0-9]{8}$/,``)===i.toLowerCase());r.push(...a)}let i=new Set;return r.filter(e=>i.has(e.partition)?!1:(i.add(e.partition),!0))}async function ml(e){let t=new Map;for(let n of e){let e=Se(n.partition),r=P(e,`aikit.db`);try{let e=await vr({backend:`sqlite-vec`,path:r});await e.initialize(),t.set(n.partition,e)}catch(t){fl.warn(`Failed to open workspace store`,{partition:n.partition,partitionDir:e,storePath:r,error:j(t)})}}return{stores:t,closeAll:async()=>{for(let[,e]of t)try{await e.close()}catch{}}}}async function hl(e,t,n){let r=[...e.entries()].map(async([e,r])=>{try{return(await r.search(t,n)).map(t=>({...t,workspace:e}))}catch(t){return fl.warn(`Cross-workspace search failed for partition`,{partition:e,err:t}),[]}});return(await Promise.all(r)).flat().sort((e,t)=>t.score-e.score).slice(0,n.limit)}async function gl(e,t,n){let r=[...e.entries()].map(async([e,r])=>{try{return(await r.ftsSearch(t,n)).map(t=>({...t,workspace:e}))}catch(t){return fl.warn(`Cross-workspace FTS search failed for partition`,{partition:e,err:t}),[]}});return(await Promise.all(r)).flat().sort((e,t)=>t.score-e.score).slice(0,n.limit)}function _l(e){if(e.length!==0)return In({kind:`compact`,text:e,originalChars:e.length,compressedChars:e.length})?.ref??void 0}function vl(e,t){return t?`${e}\n\nRef: ${t}`:e}const yl=k(`tools:context`);function bl(e){return e instanceof Error?(`code`in e?e.code:void 0)===`ENOENT`||e.message.startsWith(`File not found:`)||e.message.startsWith(`Path not found:`):!1}function xl(e,t){return bl(t)?(yl.warn(`${e} failed`,{error:`File not found`}),q(`NOT_FOUND`,`File not found`)):(yl.error(`${e} failed`,j(t)),q(`INTERNAL`,`${e} failed: ${t instanceof Error?t.message:String(t)}`))}function Sl(e,t,n,r){let i=U(`scope_map`);e.registerTool(`scope_map`,{title:i.title,description:`Generate a task-scoped reading plan. Given a task description, identifies which files and sections are relevant, with estimated token counts and suggested reading order.`,outputSchema:Ls,inputSchema:{task:I.string().describe(`Description of the task to scope`),max_files:I.number().min(1).max(50).default(15).describe(`Maximum files to include`),content_type:I.enum(me).optional().describe(`Filter by content type`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),enrich:I.boolean().default(!0).describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens. Default true for planning tools — set false to save tokens when enrichment is not needed.`)},annotations:i.annotations},J(`scope_map`,async({task:e,max_files:i,content_type:a,max_tokens:o,enrich:s})=>{try{let c=await Dn(t,n,{task:e,maxFiles:i,contentType:a}),l=[`## Scope Map: ${e}`,`Total estimated tokens: ~${c.totalEstimatedTokens}`,``,`### Files (by relevance)`,...c.files.map((e,t)=>`${t+1}. **${e.path}** (~${e.estimatedTokens} tokens, ${(e.relevance*100).toFixed(0)}% relevant)\n ${e.reason}\n Focus: ${e.focusRanges.map(e=>`L${e.start}-${e.end}`).join(`, `)}`),``,`### Suggested Reading Order`,...c.readingOrder.map((e,t)=>`${t+1}. ${e}`),``,`### Suggested Compact Calls`,`_Estimated compressed total: ~${Math.ceil(c.totalEstimatedTokens/5)} tokens_`,...c.compactCommands.map((e,t)=>`${t+1}. ${e}`)].join(`
148
- `)+"\n\n---\n_Next: Use `search` to dive into specific files, or `compact` to compress file contents for context._";if(s&&r){let t=await G(r,{query:e});l+=K(t)}return{content:[{type:`text`,text:o?Vn(l,o):l}],structuredContent:{files:c.files.map(e=>({path:e.path,relevance:e.relevance,estimatedTokens:e.estimatedTokens,...e.focusRanges.length>0?{focusLines:e.focusRanges.map(e=>`L${e.start}-${e.end}`)}:{}})),totalFiles:c.files.length,totalEstimatedTokens:c.totalEstimatedTokens,task:e}}}catch(e){return xl(`Scope map`,e)}}))}function Cl(e,t,n,r,i,a){let o=U(`find`);e.registerTool(`find`,{title:o.title,description:`Multi-strategy search combining vector, FTS, glob, and regex. Use for precise queries needing multiple strategies. mode=examples finds real usage of a symbol. For general discovery use search instead.`,outputSchema:Fs,inputSchema:{query:I.string().optional().describe(`Semantic/keyword search query (required for mode "examples")`),glob:I.string().optional().describe(`File glob pattern (search mode only)`),pattern:I.string().optional().describe(`Regex pattern to match in content (search mode only)`),limit:I.number().min(1).max(50).default(10).describe(`Max results`),content_type:I.enum(me).optional().describe(`Filter by content type`),mode:I.enum([`search`,`examples`,`explore`]).default(`search`).describe(`Mode: "search" (default) for federated search, "examples" to find usage examples of a symbol/pattern, "explore" for enriched context with graph neighbors and related symbols`),explore:I.boolean().optional().describe(`Enable explore mode: enriches find results with related context (neighboring symbols, file summaries, dependency info) from the knowledge graph. Can be used alongside mode="search" or standalone.`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),workspaces:I.array(I.string()).optional().describe(`Cross-workspace search: partition names or folder basenames to include. Use ["*"] for all. User-level mode only.`),enrich:I.boolean().default(!1).describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens. Default false — set true when you need stored decisions, conventions, or relationship context for the file/query.`)},annotations:o.annotations},J(`find`,async({query:e,glob:o,pattern:s,limit:c,content_type:l,mode:u,max_tokens:d,workspaces:f,enrich:p,explore:m})=>{try{if(u===`examples`){if(!e)return q(`VALIDATION`,`"query" is required for mode "examples".`);let r=await At(t,n,{query:e,limit:c,contentType:l}),a=_l(JSON.stringify(r)),o=JSON.stringify(a?{ref:a,...r}:r);if(p&&i){let t=await G(i,{query:e});o+=K(t)}return{content:[{type:`text`,text:d?Vn(o,d):o}]}}if(u===`explore`||m){if(!e)return q(`VALIDATION`,`"query" is required for mode "explore".`);let a=await kt(t,n,{query:e,glob:o,pattern:s,limit:c,contentType:l,cwd:r,explore:!0}),u=[...new Set(a.results.map(e=>e.path))].slice(0,5),f=i?.graphStore?await Promise.allSettled(u.map(async e=>{let t=await G(i,{filePath:e,limit:3});return{filePath:e,graph:t.graph,curated:t.curated}})):[],m=new Map;for(let e of f)e.status===`fulfilled`&&e.value&&m.set(e.value.filePath,{graph:e.value.graph,curated:e.value.curated});let h=`## Explore: ${e}\n\nFound ${a.totalFound} results across ${a.results.length} files.\n\n`;for(let e of a.results.slice(0,c)){let t=e.lineRange?`:${e.lineRange.start}-${e.lineRange.end}`:``;h+=`### ${e.path}${t}\n`,h+=`- **Source:** ${e.source} | **Score:** ${e.score.toFixed(3)}\n`,e.preview&&(h+=`- **Preview:** ${e.preview.slice(0,200).replace(/\n/g,` `)}\n`);let n=m.get(e.path);n?.graph&&n.graph.length>0&&(h+=`- **Related symbols:** ${n.graph.slice(0,4).join(`; `)}\n`),n?.curated&&n.curated.length>0&&(h+=`- **Related knowledge:** ${n.curated.slice(0,2).join(`; `)}\n`),h+=`
147
+ These changes take effect on the next server restart.`;return r(`Configuration`,cl(t)),{content:[{type:`text`,text:s}],ui:{type:`resource`,uri:Jc}}}catch(e){return qc.error(`Failed to update config`,{configPath:a,error:e instanceof Error?e.message:String(e)}),{content:[{type:`text`,text:`Failed to update configuration in ${a}: ${e instanceof Error?e.message:String(e)}`}]}}})),r(`Configuration`,cl(t))}const pl=k(`cross-workspace`);function ml(e,t){if(!we())return[];let n=Te();if(n.length===0)return[];if(e.includes(`*`))return t?n.filter(e=>e.partition!==t):n;let r=[];for(let i of e){let e=n.find(e=>e.partition===i);if(e){e.partition!==t&&r.push(e);continue}let a=n.filter(e=>e.partition!==t&&e.partition.replace(/-[a-f0-9]{8}$/,``)===i.toLowerCase());r.push(...a)}let i=new Set;return r.filter(e=>i.has(e.partition)?!1:(i.add(e.partition),!0))}async function hl(e){let t=new Map;for(let n of e){let e=Se(n.partition),r=P(e,`aikit.db`);try{let e=await yr({backend:`sqlite-vec`,path:r});await e.initialize(),t.set(n.partition,e)}catch(t){pl.warn(`Failed to open workspace store`,{partition:n.partition,partitionDir:e,storePath:r,error:j(t)})}}return{stores:t,closeAll:async()=>{for(let[,e]of t)try{await e.close()}catch{}}}}async function gl(e,t,n){let r=[...e.entries()].map(async([e,r])=>{try{return(await r.search(t,n)).map(t=>({...t,workspace:e}))}catch(t){return pl.warn(`Cross-workspace search failed for partition`,{partition:e,err:t}),[]}});return(await Promise.all(r)).flat().sort((e,t)=>t.score-e.score).slice(0,n.limit)}async function _l(e,t,n){let r=[...e.entries()].map(async([e,r])=>{try{return(await r.ftsSearch(t,n)).map(t=>({...t,workspace:e}))}catch(t){return pl.warn(`Cross-workspace FTS search failed for partition`,{partition:e,err:t}),[]}});return(await Promise.all(r)).flat().sort((e,t)=>t.score-e.score).slice(0,n.limit)}function vl(e){if(e.length!==0)return In({kind:`compact`,text:e,originalChars:e.length,compressedChars:e.length})?.ref??void 0}function yl(e,t){return t?`${e}\n\nRef: ${t}`:e}const bl=k(`tools:context`);function xl(e){return e instanceof Error?(`code`in e?e.code:void 0)===`ENOENT`||e.message.startsWith(`File not found:`)||e.message.startsWith(`Path not found:`):!1}function Sl(e,t){return xl(t)?(bl.warn(`${e} failed`,{error:`File not found`}),q(`NOT_FOUND`,`File not found`)):(bl.error(`${e} failed`,j(t)),q(`INTERNAL`,`${e} failed: ${t instanceof Error?t.message:String(t)}`))}function Cl(e,t,n,r){let i=U(`scope_map`);e.registerTool(`scope_map`,{title:i.title,description:`Generate a task-scoped reading plan. Given a task description, identifies which files and sections are relevant, with estimated token counts and suggested reading order.`,outputSchema:Rs,inputSchema:{task:I.string().describe(`Description of the task to scope`),max_files:I.number().min(1).max(50).default(15).describe(`Maximum files to include`),content_type:I.enum(me).optional().describe(`Filter by content type`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),enrich:I.boolean().default(!0).describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens. Default true for planning tools — set false to save tokens when enrichment is not needed.`)},annotations:i.annotations},J(`scope_map`,async({task:e,max_files:i,content_type:a,max_tokens:o,enrich:s})=>{try{let c=await Dn(t,n,{task:e,maxFiles:i,contentType:a}),l=[`## Scope Map: ${e}`,`Total estimated tokens: ~${c.totalEstimatedTokens}`,``,`### Files (by relevance)`,...c.files.map((e,t)=>`${t+1}. **${e.path}** (~${e.estimatedTokens} tokens, ${(e.relevance*100).toFixed(0)}% relevant)\n ${e.reason}\n Focus: ${e.focusRanges.map(e=>`L${e.start}-${e.end}`).join(`, `)}`),``,`### Suggested Reading Order`,...c.readingOrder.map((e,t)=>`${t+1}. ${e}`),``,`### Suggested Compact Calls`,`_Estimated compressed total: ~${Math.ceil(c.totalEstimatedTokens/5)} tokens_`,...c.compactCommands.map((e,t)=>`${t+1}. ${e}`)].join(`
148
+ `)+"\n\n---\n_Next: Use `search` to dive into specific files, or `compact` to compress file contents for context._";if(s&&r){let t=await G(r,{query:e});l+=K(t)}return{content:[{type:`text`,text:o?Vn(l,o):l}],structuredContent:{files:c.files.map(e=>({path:e.path,relevance:e.relevance,estimatedTokens:e.estimatedTokens,...e.focusRanges.length>0?{focusLines:e.focusRanges.map(e=>`L${e.start}-${e.end}`)}:{}})),totalFiles:c.files.length,totalEstimatedTokens:c.totalEstimatedTokens,task:e}}}catch(e){return Sl(`Scope map`,e)}}))}function wl(e,t,n,r,i,a){let o=U(`find`);e.registerTool(`find`,{title:o.title,description:`Multi-strategy search combining vector, FTS, glob, and regex. Use for precise queries needing multiple strategies. mode=examples finds real usage of a symbol. For general discovery use search instead.`,outputSchema:Is,inputSchema:{query:I.string().optional().describe(`Semantic/keyword search query (required for mode "examples")`),glob:I.string().optional().describe(`File glob pattern (search mode only)`),pattern:I.string().optional().describe(`Regex pattern to match in content (search mode only)`),limit:I.number().min(1).max(50).default(10).describe(`Max results`),content_type:I.enum(me).optional().describe(`Filter by content type`),mode:I.enum([`search`,`examples`,`explore`]).default(`search`).describe(`Mode: "search" (default) for federated search, "examples" to find usage examples of a symbol/pattern, "explore" for enriched context with graph neighbors and related symbols`),explore:I.boolean().optional().describe(`Enable explore mode: enriches find results with related context (neighboring symbols, file summaries, dependency info) from the knowledge graph. Can be used alongside mode="search" or standalone.`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),workspaces:I.array(I.string()).optional().describe(`Cross-workspace search: partition names or folder basenames to include. Use ["*"] for all. User-level mode only.`),enrich:I.boolean().default(!1).describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens. Default false — set true when you need stored decisions, conventions, or relationship context for the file/query.`)},annotations:o.annotations},J(`find`,async({query:e,glob:o,pattern:s,limit:c,content_type:l,mode:u,max_tokens:d,workspaces:f,enrich:p,explore:m})=>{try{if(u===`examples`){if(!e)return q(`VALIDATION`,`"query" is required for mode "examples".`);let r=await At(t,n,{query:e,limit:c,contentType:l}),a=vl(JSON.stringify(r)),o=JSON.stringify(a?{ref:a,...r}:r);if(p&&i){let t=await G(i,{query:e});o+=K(t)}return{content:[{type:`text`,text:d?Vn(o,d):o}]}}if(u===`explore`||m){if(!e)return q(`VALIDATION`,`"query" is required for mode "explore".`);let a=await kt(t,n,{query:e,glob:o,pattern:s,limit:c,contentType:l,cwd:r,explore:!0}),u=[...new Set(a.results.map(e=>e.path))].slice(0,5),f=i?.graphStore?await Promise.allSettled(u.map(async e=>{let t=await G(i,{filePath:e,limit:3});return{filePath:e,graph:t.graph,curated:t.curated}})):[],m=new Map;for(let e of f)e.status===`fulfilled`&&e.value&&m.set(e.value.filePath,{graph:e.value.graph,curated:e.value.curated});let h=`## Explore: ${e}\n\nFound ${a.totalFound} results across ${a.results.length} files.\n\n`;for(let e of a.results.slice(0,c)){let t=e.lineRange?`:${e.lineRange.start}-${e.lineRange.end}`:``;h+=`### ${e.path}${t}\n`,h+=`- **Source:** ${e.source} | **Score:** ${e.score.toFixed(3)}\n`,e.preview&&(h+=`- **Preview:** ${e.preview.slice(0,200).replace(/\n/g,` `)}\n`);let n=m.get(e.path);n?.graph&&n.graph.length>0&&(h+=`- **Related symbols:** ${n.graph.slice(0,4).join(`; `)}\n`),n?.curated&&n.curated.length>0&&(h+=`- **Related knowledge:** ${n.curated.slice(0,2).join(`; `)}\n`),h+=`
149
149
  `}if(p&&i){let t=await G(i,{query:e});h+=K(t)}return h+=`
150
150
  ---
151
- _Explore mode: results enriched with graph neighbors, related symbols, and curated knowledge._`,{content:[{type:`text`,text:d?Vn(h,d):h}]}}let h=await kt(t,n,{query:e,glob:o,pattern:s,limit:c,contentType:l,cwd:r}),g=``;if(f&&f.length>0&&e){let n=pl(f,a);if(n.length>0){let{stores:r,closeAll:i}=await ml(n);try{let i=await hl(r,await t.embedQuery(e),{limit:c,contentType:l});for(let e of i)h.results.push({path:`[${e.workspace}] ${e.record.sourcePath}`,score:e.score,source:`cross-workspace`,lineRange:e.record.startLine?{start:e.record.startLine,end:e.record.endLine}:void 0,preview:e.record.content.slice(0,200)});h.results.sort((e,t)=>t.score-e.score),h.results=h.results.slice(0,c),h.totalFound=h.results.length,g=` + ${n.length} workspace(s)`}finally{await i()}}}if(h.results.length===0){let t=`No results found.${h.failedStrategies?.length?`\nStrategies attempted: ${h.strategies.join(`, `)}\nFailed: ${h.failedStrategies.map(e=>`${e.strategy} (${e.reason})`).join(`, `)}`:h.strategies.length===0?`
152
- No search strategies were activated. Provide at least one of: query, glob, or pattern.`:``}`;if(p&&i){let n=await G(i,{query:e});t+=K(n)}let n=d?Vn(t,d):t,r=_l(n);return{content:[{type:`text`,text:vl(n,r)}],structuredContent:{matches:[],totalMatches:0,pattern:e??o??s??``,truncated:!1,ref:r}}}let _=[`Found ${h.totalFound} results via ${h.strategies.join(` + `)}${g}`,``,...h.results.map(e=>{let t=e.lineRange?`:${e.lineRange.start}-${e.lineRange.end}`:``,n=e.preview?`\n ${e.preview.slice(0,100)}...`:``;return`- [${e.source}] ${e.path}${t} (${(e.score*100).toFixed(0)}%)${n}`})].join(`
153
- `);if(p&&i){let t=await G(i,{query:e,filePath:h.results[0]?.path});_+=K(t)}let v=d?Vn(_,d):_,y=_l(v);return{content:[{type:`text`,text:vl(v,y)}],structuredContent:{matches:h.results.map(e=>({path:e.path,...e.lineRange?{line:e.lineRange.start}:{},matchType:e.source,preview:e.preview?.slice(0,200)??``})),totalMatches:h.totalFound,pattern:e??o??s??``,truncated:h.results.length<h.totalFound,ref:y}}}catch(e){return xl(`Find`,e)}}))}function wl(e,t,n,r,i){let a=U(`symbol`);e.registerTool(`symbol`,{title:a.title,description:`Find definition, imports, and references of a named symbol (function, class, type). For tracing data flow across call sites use trace instead. Supports transitive trace with direction and maxDepth parameters when a graph store is available.`,inputSchema:{items:I.array(I.object({name:I.string().describe(`Symbol name to look up`),limit:I.number().min(1).max(50).default(20).optional().describe(`Max results per category`),direction:I.enum([`callers`,`callees`,`both`]).optional().describe(`Transitive trace direction: callers (who calls this), callees (what this calls), or both`),maxDepth:I.number().min(1).max(10).default(2).optional().describe(`Max traversal depth for transitive trace`),edgeKinds:I.array(I.string()).optional().describe(`Filter trace by edge types (e.g., ["imports", "calls"])`),use_llm:I.boolean().default(!1).optional().describe(`Enable Tier 3 LLM disambiguation for ambiguous symbols (uses local Ollama)`)})).nonempty().describe(`Array of symbol names to look up in batch.`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),enrich:I.boolean().default(!1).optional().describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens.`)},outputSchema:js,annotations:a.annotations},J(`symbol`,async({items:e,max_tokens:a,enrich:o})=>{try{if(!e||e.length===0)return q(`VALIDATION`,`"items[]" is required.`);let s=await Promise.allSettled(e.map(e=>Rn(t,n,{name:e.name,limit:e.limit,graphStore:r,direction:e.direction,maxDepth:e.maxDepth,edgeKinds:e.edgeKinds,useLLM:e.use_llm??!1}))),c=[],l=[];for(let t=0;t<s.length;t++){let n=s[t],r=e[t].name;if(n.status===`fulfilled`)c.push(`## ${t+1}. ${r}\n${El(n.value)}`),l.push({name:n.value.name,definedIn:n.value.definedIn??null,importedBy:n.value.importedBy??[],referencedIn:n.value.referencedIn??[],graphContext:n.value.graphContext??null,trace:n.value.trace??null,confidence:n.value.confidence??null,method:n.value.method??null,rationale:n.value.rationale??null});else{let e=n.reason instanceof Error?n.reason.message:String(n.reason);c.push(`## ${t+1}. ${r}\nERROR: ${e}`),l.push({name:r,definedIn:null,importedBy:[],referencedIn:[],graphContext:null,trace:null,confidence:null,method:null,rationale:null,error:e})}}let u=c.join(`
151
+ _Explore mode: results enriched with graph neighbors, related symbols, and curated knowledge._`,{content:[{type:`text`,text:d?Vn(h,d):h}]}}let h=await kt(t,n,{query:e,glob:o,pattern:s,limit:c,contentType:l,cwd:r}),g=``;if(f&&f.length>0&&e){let n=ml(f,a);if(n.length>0){let{stores:r,closeAll:i}=await hl(n);try{let i=await gl(r,await t.embedQuery(e),{limit:c,contentType:l});for(let e of i)h.results.push({path:`[${e.workspace}] ${e.record.sourcePath}`,score:e.score,source:`cross-workspace`,lineRange:e.record.startLine?{start:e.record.startLine,end:e.record.endLine}:void 0,preview:e.record.content.slice(0,200)});h.results.sort((e,t)=>t.score-e.score),h.results=h.results.slice(0,c),h.totalFound=h.results.length,g=` + ${n.length} workspace(s)`}finally{await i()}}}if(h.results.length===0){let t=`No results found.${h.failedStrategies?.length?`\nStrategies attempted: ${h.strategies.join(`, `)}\nFailed: ${h.failedStrategies.map(e=>`${e.strategy} (${e.reason})`).join(`, `)}`:h.strategies.length===0?`
152
+ No search strategies were activated. Provide at least one of: query, glob, or pattern.`:``}`;if(p&&i){let n=await G(i,{query:e});t+=K(n)}let n=d?Vn(t,d):t,r=vl(n);return{content:[{type:`text`,text:yl(n,r)}],structuredContent:{matches:[],totalMatches:0,pattern:e??o??s??``,truncated:!1,ref:r}}}let _=[`Found ${h.totalFound} results via ${h.strategies.join(` + `)}${g}`,``,...h.results.map(e=>{let t=e.lineRange?`:${e.lineRange.start}-${e.lineRange.end}`:``,n=e.preview?`\n ${e.preview.slice(0,100)}...`:``;return`- [${e.source}] ${e.path}${t} (${(e.score*100).toFixed(0)}%)${n}`})].join(`
153
+ `);if(p&&i){let t=await G(i,{query:e,filePath:h.results[0]?.path});_+=K(t)}let v=d?Vn(_,d):_,y=vl(v);return{content:[{type:`text`,text:yl(v,y)}],structuredContent:{matches:h.results.map(e=>({path:e.path,...e.lineRange?{line:e.lineRange.start}:{},matchType:e.source,preview:e.preview?.slice(0,200)??``})),totalMatches:h.totalFound,pattern:e??o??s??``,truncated:h.results.length<h.totalFound,ref:y}}}catch(e){return Sl(`Find`,e)}}))}function Tl(e,t,n,r,i){let a=U(`symbol`);e.registerTool(`symbol`,{title:a.title,description:`Find definition, imports, and references of a named symbol (function, class, type). For tracing data flow across call sites use trace instead. Supports transitive trace with direction and maxDepth parameters when a graph store is available.`,inputSchema:{items:I.array(I.object({name:I.string().describe(`Symbol name to look up`),limit:I.number().min(1).max(50).default(20).optional().describe(`Max results per category`),direction:I.enum([`callers`,`callees`,`both`]).optional().describe(`Transitive trace direction: callers (who calls this), callees (what this calls), or both`),maxDepth:I.number().min(1).max(10).default(2).optional().describe(`Max traversal depth for transitive trace`),edgeKinds:I.array(I.string()).optional().describe(`Filter trace by edge types (e.g., ["imports", "calls"])`),use_llm:I.boolean().default(!1).optional().describe(`Enable Tier 3 LLM disambiguation for ambiguous symbols (uses local Ollama)`)})).nonempty().describe(`Array of symbol names to look up in batch.`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),enrich:I.boolean().default(!1).optional().describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens.`)},outputSchema:Ms,annotations:a.annotations},J(`symbol`,async({items:e,max_tokens:a,enrich:o})=>{try{if(!e||e.length===0)return q(`VALIDATION`,`"items[]" is required.`);let s=await Promise.allSettled(e.map(e=>Rn(t,n,{name:e.name,limit:e.limit,graphStore:r,direction:e.direction,maxDepth:e.maxDepth,edgeKinds:e.edgeKinds,useLLM:e.use_llm??!1}))),c=[],l=[];for(let t=0;t<s.length;t++){let n=s[t],r=e[t].name;if(n.status===`fulfilled`)c.push(`## ${t+1}. ${r}\n${Dl(n.value)}`),l.push({name:n.value.name,definedIn:n.value.definedIn??null,importedBy:n.value.importedBy??[],referencedIn:n.value.referencedIn??[],graphContext:n.value.graphContext??null,trace:n.value.trace??null,confidence:n.value.confidence??null,method:n.value.method??null,rationale:n.value.rationale??null});else{let e=n.reason instanceof Error?n.reason.message:String(n.reason);c.push(`## ${t+1}. ${r}\nERROR: ${e}`),l.push({name:r,definedIn:null,importedBy:[],referencedIn:[],graphContext:null,trace:null,confidence:null,method:null,rationale:null,error:e})}}let u=c.join(`
154
154
 
155
- `);if(o&&i){let t=await G(i,{query:`symbols: ${e.map(e=>e.name).join(`, `)}`});u+=K(t)}return{content:[{type:`text`,text:a?Vn(u,a):u}],structuredContent:{symbols:l}}}catch(e){return xl(`Symbol lookup`,e)}}))}function Tl(e,t,n,r,i){let a=U(`trace`);function o(e){let t=[`## Trace: ${e.start}`,`Direction: ${e.direction} | Depth: ${e.depth}`,``];if(e.graphContext&&(t.push(`### Graph Context`),e.graphContext.definingModule&&t.push(`- Module: ${e.graphContext.definingModule}`),e.graphContext.community&&t.push(`- Community: ${e.graphContext.community}`),e.graphContext.importedByModules.length>0&&t.push(`- Imported by modules: ${e.graphContext.importedByModules.join(`, `)}`),e.graphContext.siblingSymbols.length>0&&t.push(`- Sibling symbols: ${e.graphContext.siblingSymbols.join(`, `)}`),t.push(``)),e.nodes.length===0)t.push(`No connections found.`);else{let n=e.nodes.filter(e=>e.relationship===`calls`),r=e.nodes.filter(e=>e.relationship===`called-by`),i=e.nodes.filter(e=>e.relationship===`imports`),a=e.nodes.filter(e=>e.relationship===`imported-by`),o=e.nodes.filter(e=>e.relationship===`references`);if(n.length>0){t.push(`### Calls (${n.length})`);for(let e of n){let n=e.scope?` (from ${e.scope}())`:``;t.push(`- ${e.symbol}() — ${e.path}:${e.line}${n}`)}t.push(``)}if(r.length>0){t.push(`### Called by (${r.length})`);for(let e of r){let n=e.scope?` in ${e.scope}()`:``;t.push(`- ${e.symbol}()${n} — ${e.path}:${e.line}`)}t.push(``)}if(i.length>0){t.push(`### Imports (${i.length})`);for(let e of i)t.push(`- ${e.symbol} — ${e.path}:${e.line}`);t.push(``)}if(a.length>0){t.push(`### Imported by (${a.length})`);for(let e of a)t.push(`- ${e.path}:${e.line}`);t.push(``)}if(o.length>0){t.push(`### References (${o.length})`);for(let e of o)t.push(`- ${e.path}:${e.line}`);t.push(``)}}return{lines:t,structured:{start:e.start,direction:e.direction,depth:e.depth,nodes:e.nodes,graphContext:e.graphContext??null}}}e.registerTool(`trace`,{title:a.title,description:`Follow data flow forward/backward across imports and call sites from a starting symbol or file:line. For finding a single symbol definition use symbol instead.`,inputSchema:{items:I.array(I.object({start:I.string().describe(`Starting point — symbol name or file:line reference`),direction:I.enum([`forward`,`backward`,`both`]).describe(`Which direction to trace relationships`),max_depth:I.number().min(1).max(10).default(3).optional().describe(`Maximum trace depth`),edge_kinds:I.array(I.string()).optional().describe(`Filter edges by type (e.g., ["calls", "imports"]). Default: all edge types`)})).min(1).describe(`Array of trace queries to run in batch.`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),enrich:I.boolean().default(!1).optional().describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens.`)},annotations:a.annotations},J(`trace`,async({items:e,max_tokens:a,enrich:s})=>{try{if(!e||e.length===0)return q(`VALIDATION`,`"items[]" is required.`);let c=await Promise.allSettled(e.map(e=>Bn(t,n,{start:e.start,direction:e.direction??`both`,maxDepth:e.max_depth,graphStore:r,edgeKinds:e.edge_kinds}))),l=[],u=[];for(let t=0;t<c.length;t++){let n=c[t],r=e[t].start;if(n.status===`fulfilled`){let e=o(n.value);l.push(`## ${t+1}. ${r}\n${e.lines.join(`
155
+ `);if(o&&i){let t=await G(i,{query:`symbols: ${e.map(e=>e.name).join(`, `)}`});u+=K(t)}return{content:[{type:`text`,text:a?Vn(u,a):u}],structuredContent:{symbols:l}}}catch(e){return Sl(`Symbol lookup`,e)}}))}function El(e,t,n,r,i){let a=U(`trace`);function o(e){let t=[`## Trace: ${e.start}`,`Direction: ${e.direction} | Depth: ${e.depth}`,``];if(e.graphContext&&(t.push(`### Graph Context`),e.graphContext.definingModule&&t.push(`- Module: ${e.graphContext.definingModule}`),e.graphContext.community&&t.push(`- Community: ${e.graphContext.community}`),e.graphContext.importedByModules.length>0&&t.push(`- Imported by modules: ${e.graphContext.importedByModules.join(`, `)}`),e.graphContext.siblingSymbols.length>0&&t.push(`- Sibling symbols: ${e.graphContext.siblingSymbols.join(`, `)}`),t.push(``)),e.nodes.length===0)t.push(`No connections found.`);else{let n=e.nodes.filter(e=>e.relationship===`calls`),r=e.nodes.filter(e=>e.relationship===`called-by`),i=e.nodes.filter(e=>e.relationship===`imports`),a=e.nodes.filter(e=>e.relationship===`imported-by`),o=e.nodes.filter(e=>e.relationship===`references`);if(n.length>0){t.push(`### Calls (${n.length})`);for(let e of n){let n=e.scope?` (from ${e.scope}())`:``;t.push(`- ${e.symbol}() — ${e.path}:${e.line}${n}`)}t.push(``)}if(r.length>0){t.push(`### Called by (${r.length})`);for(let e of r){let n=e.scope?` in ${e.scope}()`:``;t.push(`- ${e.symbol}()${n} — ${e.path}:${e.line}`)}t.push(``)}if(i.length>0){t.push(`### Imports (${i.length})`);for(let e of i)t.push(`- ${e.symbol} — ${e.path}:${e.line}`);t.push(``)}if(a.length>0){t.push(`### Imported by (${a.length})`);for(let e of a)t.push(`- ${e.path}:${e.line}`);t.push(``)}if(o.length>0){t.push(`### References (${o.length})`);for(let e of o)t.push(`- ${e.path}:${e.line}`);t.push(``)}}return{lines:t,structured:{start:e.start,direction:e.direction,depth:e.depth,nodes:e.nodes,graphContext:e.graphContext??null}}}e.registerTool(`trace`,{title:a.title,description:`Follow data flow forward/backward across imports and call sites from a starting symbol or file:line. For finding a single symbol definition use symbol instead.`,inputSchema:{items:I.array(I.object({start:I.string().describe(`Starting point — symbol name or file:line reference`),direction:I.enum([`forward`,`backward`,`both`]).describe(`Which direction to trace relationships`),max_depth:I.number().min(1).max(10).default(3).optional().describe(`Maximum trace depth`),edge_kinds:I.array(I.string()).optional().describe(`Filter edges by type (e.g., ["calls", "imports"]). Default: all edge types`)})).min(1).describe(`Array of trace queries to run in batch.`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),enrich:I.boolean().default(!1).optional().describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens.`)},annotations:a.annotations},J(`trace`,async({items:e,max_tokens:a,enrich:s})=>{try{if(!e||e.length===0)return q(`VALIDATION`,`"items[]" is required.`);let c=await Promise.allSettled(e.map(e=>Bn(t,n,{start:e.start,direction:e.direction??`both`,maxDepth:e.max_depth,graphStore:r,edgeKinds:e.edge_kinds}))),l=[],u=[];for(let t=0;t<c.length;t++){let n=c[t],r=e[t].start;if(n.status===`fulfilled`){let e=o(n.value);l.push(`## ${t+1}. ${r}\n${e.lines.join(`
156
156
  `)}`),u.push(e.structured)}else{let e=n.reason instanceof Error?n.reason.message:String(n.reason);l.push(`## ${t+1}. ${r}\nERROR: ${e}`),u.push({start:r,error:e})}}let d=l.join(`
157
157
 
158
- `)+"\n\n---\n_Next: `symbol` for definition details | `compact` to read a referenced file_";if(s&&i){let t=await G(i,{query:`traces: ${e.map(e=>e.start).join(`, `)}`});d+=K(t)}return{content:[{type:`text`,text:a?Vn(d,a):d}],structuredContent:{traces:u}}}catch(e){return xl(`Trace`,e)}}))}function El(e){let t=[`Symbol: ${e.name}`];if(e.confidence!==void 0){let n=(e.confidence*100).toFixed(0);t.push(`Confidence: ${n}% (${e.method??`unknown`})`)}if(e.definedIn){let n=`Defined in: ${e.definedIn.path}:${e.definedIn.line} (${e.definedIn.kind})`;e.definedIn.signature&&(n+=`\nSignature: ${e.definedIn.signature}`),e.rationale&&(n+=`\nRationale: ${e.rationale}`),t.push(n)}else t.push(`Defined in: not found`);if(t.push(``,`Imported by:`),e.importedBy.length===0)t.push(` none`);else for(let n of e.importedBy)t.push(` - ${n.path}:${n.line} ${n.importStatement}`);if(t.push(``,`Referenced in:`),e.referencedIn.length===0)t.push(` none`);else for(let n of e.referencedIn){let e=`scope`in n&&n.scope?` in ${n.scope}()`:``;t.push(` - ${n.path}:${n.line}${e} ${n.context}`)}if(e.graphContext){let n=e.graphContext;t.push(``,`Graph context:`),n.definingModule&&t.push(` Module: ${n.definingModule}`),n.importedByModules.length>0&&t.push(` Imported by modules: ${n.importedByModules.join(`, `)}`),n.siblingSymbols.length>0&&t.push(` Sibling symbols: ${n.siblingSymbols.join(`, `)}`)}if(e.trace){if(e.trace.callers.length>0){t.push(``,`Transitive callers:`);for(let n of e.trace.callers)t.push(` - ${n.name} (${n.path}) [depth: ${n.depth}]`)}if(e.trace.callees.length>0){t.push(``,`Transitive callees:`);for(let n of e.trace.callees)t.push(` - ${n.name} (${n.path}) [depth: ${n.depth}]`)}}return t.join(`
159
- `)}const Dl=k(`tools`);function Ol(e,t){let n=U(`er_evolve_review`);e.registerTool(`er_evolve_review`,{title:n.title,description:`Review evolution metrics for the AI Kit ↔ ER bridge. Shows local miss rates, push acceptance, rule effectiveness, and top missed queries. Use this to reason about improving classification rules and knowledge flow.`,inputSchema:{include_details:I.boolean().default(!0).describe(`Include detailed breakdowns (top missed queries, rule stats)`),reset_after:I.boolean().default(!1).describe(`Reset collected metrics after review`)},annotations:n.annotations},async({include_details:e,reset_after:n})=>{try{let r=t.getMetrics(),i=[`## ER Evolution Review
158
+ `)+"\n\n---\n_Next: `symbol` for definition details | `compact` to read a referenced file_";if(s&&i){let t=await G(i,{query:`traces: ${e.map(e=>e.start).join(`, `)}`});d+=K(t)}return{content:[{type:`text`,text:a?Vn(d,a):d}],structuredContent:{traces:u}}}catch(e){return Sl(`Trace`,e)}}))}function Dl(e){let t=[`Symbol: ${e.name}`];if(e.confidence!==void 0){let n=(e.confidence*100).toFixed(0);t.push(`Confidence: ${n}% (${e.method??`unknown`})`)}if(e.definedIn){let n=`Defined in: ${e.definedIn.path}:${e.definedIn.line} (${e.definedIn.kind})`;e.definedIn.signature&&(n+=`\nSignature: ${e.definedIn.signature}`),e.rationale&&(n+=`\nRationale: ${e.rationale}`),t.push(n)}else t.push(`Defined in: not found`);if(t.push(``,`Imported by:`),e.importedBy.length===0)t.push(` none`);else for(let n of e.importedBy)t.push(` - ${n.path}:${n.line} ${n.importStatement}`);if(t.push(``,`Referenced in:`),e.referencedIn.length===0)t.push(` none`);else for(let n of e.referencedIn){let e=`scope`in n&&n.scope?` in ${n.scope}()`:``;t.push(` - ${n.path}:${n.line}${e} ${n.context}`)}if(e.graphContext){let n=e.graphContext;t.push(``,`Graph context:`),n.definingModule&&t.push(` Module: ${n.definingModule}`),n.importedByModules.length>0&&t.push(` Imported by modules: ${n.importedByModules.join(`, `)}`),n.siblingSymbols.length>0&&t.push(` Sibling symbols: ${n.siblingSymbols.join(`, `)}`)}if(e.trace){if(e.trace.callers.length>0){t.push(``,`Transitive callers:`);for(let n of e.trace.callers)t.push(` - ${n.name} (${n.path}) [depth: ${n.depth}]`)}if(e.trace.callees.length>0){t.push(``,`Transitive callees:`);for(let n of e.trace.callees)t.push(` - ${n.name} (${n.path}) [depth: ${n.depth}]`)}}return t.join(`
159
+ `)}const Ol=k(`tools`);function kl(e,t){let n=U(`er_evolve_review`);e.registerTool(`er_evolve_review`,{title:n.title,description:`Review evolution metrics for the AI Kit ↔ ER bridge. Shows local miss rates, push acceptance, rule effectiveness, and top missed queries. Use this to reason about improving classification rules and knowledge flow.`,inputSchema:{include_details:I.boolean().default(!0).describe(`Include detailed breakdowns (top missed queries, rule stats)`),reset_after:I.boolean().default(!1).describe(`Reset collected metrics after review`)},annotations:n.annotations},async({include_details:e,reset_after:n})=>{try{let r=t.getMetrics(),i=[`## ER Evolution Review
160
160
  `,`**Period**: ${r.period.startedAt} → ${r.period.queriedAt}`,`**Total events**: ${r.period.totalEvents}\n`,`### Search`,`- Total searches: ${r.search.totalSearches}`,`- ER fallback triggered: ${r.search.erFallbackCount} (${(r.search.erFallbackRate*100).toFixed(1)}%)`,`- ER cache hits: ${r.search.erCacheHitCount} (${(r.search.erCacheHitRate*100).toFixed(1)}% of fallbacks)`];if(e&&r.search.topMissedQueries.length>0){i.push(`
161
- **Top missed queries** (triggered ER fallback):`);for(let e of r.search.topMissedQueries.slice(0,10)){let t=e.query.length>60?`${e.query.slice(0,57)}...`:e.query;i.push(` - "${t}" (${e.count}x)`)}}if(i.push(``,`### Push`,`- Total pushes: ${r.push.totalPushes} (${r.push.successCount} ok, ${r.push.failCount} failed)`,`- Classification match rate: ${(r.push.classificationMatchRate*100).toFixed(1)}%`,`- Push acceptance rate: ${(r.push.pushAcceptanceRate*100).toFixed(1)}%`),i.push(``,`### Rule Effectiveness`),Object.keys(r.rules.matchCounts).length>0)for(let[e,t]of Object.entries(r.rules.matchCounts)){let n=r.rules.pushCounts[e]??0,a=t>0?(n/t*100).toFixed(0):`0`;i.push(`- **${e}**: ${t} matches → ${n} pushes (${a}% conversion)`)}else i.push(`- _No rule activity recorded yet_`);if(e&&r.rules.lowConversionRules.length>0){i.push(``,`### ⚠️ Low Conversion Rules (potential false positives)`);for(let e of r.rules.lowConversionRules)i.push(`- **${e.ruleId}**: ${e.matchCount} matches, ${e.pushCount} pushes (${(e.conversionRate*100).toFixed(0)}% conversion) — consider tightening patterns`)}return i.push(``,`---`,"_Next: Use `er_update_policy` to refine rules based on these metrics, or `er_push` to share high-value knowledge._"),n&&(Dl.info(`Evolution metrics reset requested`,{requestedAt:new Date().toISOString(),clearedEvents:r.period.totalEvents}),t.reset(),i.push(`
161
+ **Top missed queries** (triggered ER fallback):`);for(let e of r.search.topMissedQueries.slice(0,10)){let t=e.query.length>60?`${e.query.slice(0,57)}...`:e.query;i.push(` - "${t}" (${e.count}x)`)}}if(i.push(``,`### Push`,`- Total pushes: ${r.push.totalPushes} (${r.push.successCount} ok, ${r.push.failCount} failed)`,`- Classification match rate: ${(r.push.classificationMatchRate*100).toFixed(1)}%`,`- Push acceptance rate: ${(r.push.pushAcceptanceRate*100).toFixed(1)}%`),i.push(``,`### Rule Effectiveness`),Object.keys(r.rules.matchCounts).length>0)for(let[e,t]of Object.entries(r.rules.matchCounts)){let n=r.rules.pushCounts[e]??0,a=t>0?(n/t*100).toFixed(0):`0`;i.push(`- **${e}**: ${t} matches → ${n} pushes (${a}% conversion)`)}else i.push(`- _No rule activity recorded yet_`);if(e&&r.rules.lowConversionRules.length>0){i.push(``,`### ⚠️ Low Conversion Rules (potential false positives)`);for(let e of r.rules.lowConversionRules)i.push(`- **${e.ruleId}**: ${e.matchCount} matches, ${e.pushCount} pushes (${(e.conversionRate*100).toFixed(0)}% conversion) — consider tightening patterns`)}return i.push(``,`---`,"_Next: Use `er_update_policy` to refine rules based on these metrics, or `er_push` to share high-value knowledge._"),n&&(Ol.info(`Evolution metrics reset requested`,{requestedAt:new Date().toISOString(),clearedEvents:r.period.totalEvents}),t.reset(),i.push(`
162
162
  _Metrics have been reset._`)),{content:[{type:`text`,text:i.join(`
163
- `)}]}}catch(e){return Dl.error(`Evolution review failed`,j(e)),q(`INTERNAL`,`Evolution review failed: unable to compute metrics`)}})}const kl=k(`tools:execution`);function Al(e,t,n){let r=U(`check`);e.registerTool(`check`,{title:r.title,description:`Run incremental typecheck (tsc) and lint (biome) on the project or specific files. Returns structured error and warning lists. Default detail level is "efficient" (~300 tokens).`,inputSchema:{files:I.array(I.string()).optional().describe(`Specific files to check (if omitted, checks all)`),cwd:I.string().optional().describe(`Working directory`),skip_types:I.boolean().default(!1).describe(`Skip TypeScript typecheck`),skip_lint:I.boolean().default(!1).describe(`Skip Biome lint`),detail:I.enum(ye).optional().describe(`Output detail level: efficient (default, ~300 tokens — pass/fail + counts + top errors), normal (parsed error objects), full (includes raw terminal output)`),enrich:I.boolean().default(!1).describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens. Default false — set true when you need stored decisions, conventions, or relationship context.`)},outputSchema:Os,annotations:r.annotations},J(`check`,async({files:e,cwd:r,skip_types:i,skip_lint:a,detail:o,enrich:s},c)=>{try{let l=o??n??`efficient`,u=await at({files:e,cwd:r,skipTypes:i,skipLint:a,detail:l===`efficient`?`normal`:l}),d=Ic(c).createTask(`Check`,2);d.progress(0,`tsc: ${u.tsc.errors.length} errors`),d.progress(1,`biome: ${u.biome.errors.length} errors`),d.complete(`Check ${u.passed?`passed`:`failed`}`);let f=Ln(u);if(l===`efficient`){let e=[];if(u.passed)e.push({tool:`test_run`,reason:`Types and lint clean — run tests next`});else{let t=u.tsc.errors[0]?.file??u.biome.errors[0]?.file,n=f.tsc.topErrors[0]??f.biome.topErrors[0]??`reported errors`;t&&e.push({tool:`compact`,reason:`Inspect failing code with compact({ path: ${JSON.stringify(t)}, query: ${JSON.stringify(n)} })`,suggested_args:{path:t,query:n}}),e.push({tool:`check`,reason:`Re-check after fixing errors`,suggested_args:{detail:`normal`}})}let n=[`## Check ${f.passed?`✅ PASS`:`❌ FAIL`}`,``,`**tsc**: ${f.tsc.passed?`✅`:`❌`} ${f.tsc.errorCount} errors, ${f.tsc.warningCount} warnings`];if(f.tsc.topErrors.length>0)for(let e of f.tsc.topErrors)n.push(` - ${e}`);if(n.push(`**biome**: ${f.biome.passed?`✅`:`❌`} ${f.biome.errorCount} errors, ${f.biome.warningCount} warnings`),f.biome.topErrors.length>0)for(let e of f.biome.topErrors)n.push(` - ${e}`);if(e.length>0){n.push(``,`**Next steps:**`);for(let t of e)n.push(`- \`${t.tool}\`: ${t.reason}`)}let r=n.join(`
164
- `);if(s&&t){let e=await G(t,{query:`known issues failures`});r+=K(e)}return{content:[{type:`text`,text:r}],structuredContent:{...f}}}let p=JSON.stringify(u);if(s&&t){let e=await G(t,{query:`known issues failures`});p+=K(e)}return{content:[{type:`text`,text:p}],structuredContent:{...f}}}catch(e){return kl.error(`Check failed`,j(e)),q(`INTERNAL`,`Check failed: ${e instanceof Error?e.message:String(e)}`)}}))}function jl(e){let t=U(`eval`);e.registerTool(`eval`,{title:t.title,description:`Execute a JavaScript or TypeScript snippet in a constrained VM sandbox with a timeout. Captures console output and returned values.`,inputSchema:{code:I.string().max(1e5).describe(`Code snippet to execute`),lang:I.enum([`js`,`ts`]).default(`js`).optional().describe(`Language mode: js executes directly, ts strips common type syntax first`),timeout:I.number().min(1).max(6e4).default(5e3).optional().describe(`Execution timeout in milliseconds`)},annotations:t.annotations},J(`eval`,async({code:e,lang:t,timeout:n})=>{try{let r=await Et({code:e,lang:t,timeout:n});return r.success?{content:[{type:`text`,text:`Eval succeeded in ${r.durationMs}ms\n\n${r.output}`}]}:q(`INTERNAL`,`Eval failed in ${r.durationMs}ms: ${r.error??`Unknown error`}`)}catch(e){return kl.error(`Eval failed`,j(e)),q(`INTERNAL`,`Eval failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Ml(e,t){let n=U(`test_run`);e.registerTool(`test_run`,{title:n.title,description:`Run Vitest for the current project or a subset of files, then return a structured summary of passing and failing tests.`,inputSchema:{files:I.array(I.string()).optional().describe(`Specific test files or patterns to run`),grep:I.string().optional().describe(`Only run tests whose names match this pattern`),cwd:I.string().optional().describe(`Working directory for the test run`),enrich:I.boolean().default(!1).describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens. Default false — set true when you need stored decisions, conventions, or relationship context.`)},annotations:n.annotations,outputSchema:Zs},J(`test_run`,async({files:e,grep:n,cwd:r,enrich:i},a)=>{try{let o=await zn({files:e,grep:n,cwd:r}),s=Ic(a).createTask(`Test Run`,1),c=o.summary.passed+o.summary.failed+o.summary.skipped;s.complete(`Tests: ${o.passed?`passed`:`failed`} (${c} tests)`);let l=Fl(o);if(i&&t){let e=await G(t,{query:`test patterns known failures`});l+=K(e)}return{content:[{type:`text`,text:l}],structuredContent:{passed:o.passed,totalTests:c,passedTests:o.summary.passed,failedTests:o.summary.failed,skippedTests:o.summary.skipped,duration:o.summary.duration??0,failures:o.summary.tests.filter(e=>e.status===`fail`).map(e=>({name:e.name,message:e.error??``,...e.file?{file:e.file}:{}}))},isError:!o.passed}}catch(e){return kl.error(`Test run failed`,j(e)),q(`INTERNAL`,`Test run failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Nl(e){let t=U(`parse_output`);e.registerTool(`parse_output`,{title:t.title,description:`Parse structured data from build tool output. Supports tsc, vitest, biome, and git status. Auto-detects the tool or specify explicitly.`,inputSchema:{output:I.string().max(5e5).describe(`Raw output text from a build tool`),tool:I.enum([`tsc`,`vitest`,`biome`,`git-status`]).optional().describe(`Tool to parse as (auto-detects if omitted)`)},annotations:t.annotations},async({output:e,tool:t})=>{try{let n=Qt(e.replace(/\\n/g,`
165
- `).replace(/\\t/g,` `),t);return{content:[{type:`text`,text:JSON.stringify(n)}]}}catch(e){return kl.error(`Parse failed`,j(e)),q(`INTERNAL`,`Parse failed: ${e instanceof Error?e.message:String(e)}`)}})}function Pl(e,t){let n=U(`delegate`);e.registerTool(`delegate`,{title:n.title,description:`Delegate a subtask to a local Ollama model. Use for summarization, classification, naming, or any task that can offload work from the host agent. Fails fast if Ollama is not running.`,inputSchema:{prompt:I.string().max(2e5).describe(`The task or question to send to the local model`),model:I.string().optional().describe(`Ollama model name (default: first available model)`),system:I.string().optional().describe(`System prompt for the model`),context:I.string().max(5e5).optional().describe(`Context text to include before the prompt (e.g. file contents)`),temperature:I.number().min(0).max(2).default(.3).optional().describe(`Sampling temperature (0=deterministic, default 0.3)`),timeout:I.number().min(1e3).max(6e5).default(12e4).optional().describe(`Timeout in milliseconds (default 120000)`),action:I.enum([`generate`,`list_models`]).default(`generate`).optional().describe(`Action: generate a response or list available models`)},annotations:n.annotations},async({prompt:e,model:n,system:r,context:i,temperature:a,timeout:o,action:s})=>{try{if(s===`list_models`){let e=await xt();return{content:[{type:`text`,text:JSON.stringify({models:e,count:e.length,_Next:`Use delegate with a model name`},null,2)}]}}if(t?.available)try{let n=await t.createMessage({prompt:e,systemPrompt:r,context:i,maxTokens:4e3,modelPreferences:{intelligencePriority:.8,speedPriority:.5,costPriority:.3}});return{content:[{type:`text`,text:JSON.stringify({model:n.model??`sampling`,response:n.text,provider:`mcp-sampling`,_Next:`Use the response in your workflow. stash to save it.`},null,2)}]}}catch{kl.debug(`Sampling failed, falling back to Ollama`)}let c=await bt({prompt:e,model:n,system:r,context:i,temperature:a,timeout:o});return c.error?q(`INTERNAL`,JSON.stringify({error:c.error,model:c.model,durationMs:c.durationMs},null,2)):{content:[{type:`text`,text:JSON.stringify({model:c.model,response:c.response,durationMs:c.durationMs,tokenCount:c.tokenCount,_Next:`Use the response in your workflow. stash to save it.`},null,2)}]}}catch(e){return kl.error(`Delegate failed`,j(e)),q(`INTERNAL`,`Delegate failed: ${e instanceof Error?e.message:String(e)}`)}})}function Fl(e){let t=[`Vitest run: ${e.passed?`passed`:`failed`}`,`Duration: ${e.durationMs}ms`,`Passed: ${e.summary.passed}`,`Failed: ${e.summary.failed}`,`Skipped: ${e.summary.skipped}`];e.summary.suites!==void 0&&t.push(`Suites: ${e.summary.suites}`);let n=e.summary.tests.filter(e=>e.status===`fail`);if(n.length>0){t.push(``,`Failed tests:`);for(let e of n)t.push(`- ${e.name}${e.file?` (${e.file})`:``}`),e.error&&t.push(` ${e.error}`)}return t.join(`
166
- `)}const Il=k(`tools:file-summary`);function Ll(e,t,n){let r=U(`file_summary`);e.registerTool(`file_summary`,{title:r.title,description:"Unified file/source summary tool. With `files`: T1=structural card (ROLE/DEPS/EXPORTS), T2=card + query-relevant content. With `text`: compress arbitrary text by relevance. With `ref`: restore cached result. Replaces file_summary + compact + stratum_card.",inputSchema:{files:I.array(I.string()).min(1).max(50).optional().describe(`File paths to summarize (card output: T1=structure, T2=structure+content)`),text:I.string().optional().describe(`Arbitrary text to compress (text output with ratio/segment stats)`),ref:I.string().optional().describe(`Cached ref to restore from file_summary/digest/find/knowledge output — use file_summary({ ref }) to consume`),query:I.string().optional().describe(`Focus query — guides relevance scoring. Triggers T2 when present without explicit tier`),tier:I.enum([`T1`,`T2`]).optional().describe(`Tier: T1=structure only, T2=structure+content. Default: T1, or T2 if query present`),max_content_chars:I.number().min(100).max(5e3).default(800).describe(`For T2/text: max chars for compressed content`),segmentation:I.enum([`paragraph`,`sentence`,`line`]).default(`paragraph`).describe(`How to split content for relevance scoring`),min_score:I.number().min(0).max(1).optional().describe(`Minimum relevance score threshold (0-1)`),mode:I.enum([`full`,`delta`]).default(`full`).describe(`'full'=compress everything, 'delta'=only changes since last read`)},annotations:r.annotations},J(`file_summary`,async({files:e,text:r,ref:i,query:a,tier:o,max_content_chars:s,segmentation:c,min_score:l,mode:u})=>{try{let d=await Ot(t,{files:e,text:r,ref:i,query:a,tier:o,maxContentChars:s,segmentation:c,minScore:l,mode:u,cache:n}),f=[];if(i)f.push(`## File Summary — Ref Restored`,`Ref: ${d.ref??i}`,``,d.text??``);else if(r){let e=d.ratio==null?`?`:(d.ratio*100).toFixed(0);f.push(`## File Summary — Text Compression`,`Original: ${d.originalChars??0} chars → ${d.compressedChars??0} chars (${e}%)`,...d.ref?[`Ref: ${d.ref}`]:[],``,d.text??``)}else if(d.cards){let e=o??`T1`;f.push(`## File Summary (${e}) — ${d.cards.length} files`,`Total: ~${d.totalTokenEstimate} tokens (was ~${d.totalOriginalTokenEstimate}, ${((d.compressionRatio??1)*100).toFixed(0)}% of original)`,``,...d.cards.map(e=>e.card),``)}return f.push(`---`,'_Next: Use `file_summary` with `tier: "T2"` and a query for deeper content or `digest` for multi-file synthesis._'),{content:[{type:`text`,text:f.filter(e=>typeof e==`string`).join(`
167
- `)}]}}catch(e){return Il.error(`file_summary failed`,j(e)),q(`INTERNAL`,`file_summary failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Rl=[],zl=[`_docs-sync`],Bl=new Map([[`_docs-sync`,`Synchronize project documentation — update docs/ folder based on changes made during the flow.`]]);function Vl(e){function t(t,n,r){let i=n?.installPath?Fe(n.installPath):t.replaceAll(`:`,`-`),a=F(Yn(),`.copilot`,`flows`,i).replaceAll(`\\`,`/`);if(M(a))return a;let o=F(Yn(),`.claude`,`flows`,i).replaceAll(`\\`,`/`);if(M(o))return o;let s=F(r??e(),`.github`,`flows`,i).replaceAll(`\\`,`/`);return M(s)?s:n?.installPath&&M(n.installPath)?n.installPath.replaceAll(`\\`,`/`):null}function n(e,n,r){let i=t(e.name,e,r);return i?F(i,n).replaceAll(`\\`,`/`):n}function r(t,n){let r=t.replace(/^_/,``),i=n??e(),a=[P(i,`.github`,`flows`,`_epilogue`,`steps`,r,`README.md`),P(i,`.github`,`flows`,`_epilogue`,r,`README.md`)];for(let e of a)if(M(e))return e.replaceAll(`\\`,`/`);return null}function i(e){return[...Rl,...e.manifest.steps.map(e=>e.id),...zl]}function a(e,t,r){let i=t?e.manifest.steps.find(e=>e.id===t)??null:null,a=t?Bl.get(t)??null:null;return{currentStep:i,epilogueStep:a?{id:t,description:a}:null,instructionPath:i&&t?n(e,i.instruction,r):null,description:i?.description??a}}function o(){try{let e=P(Jn(`npm root -g`,{encoding:`utf-8`}).trim(),`@fission-ai`,`openspec`);if(M(e))return{path:e,sourceType:`npm-global`,isGit:!1}}catch{}return{path:`https://github.com/Fission-AI/OpenSpec.git`,sourceType:`git`,isGit:!0}}function s(e){let t=F(e);if(M(P(t,`.claude-plugin`,`plugin.json`)))return{path:t,sourceType:`claude-plugin`};let n=Yn(),r=P(n,`.claude`,`plugins`,e);if(M(P(r,`.claude-plugin`,`plugin.json`)))return{path:r,sourceType:`claude-plugin`};let i=P(n,`.claude`,`plugins`);if(!M(i))return null;for(let t of ke(i,{withFileTypes:!0})){if(!t.isDirectory())continue;let n=P(i,t.name,`.claude-plugin`,`plugin.json`);if(M(n))try{if(JSON.parse(N(n,`utf-8`)).name===e)return{path:P(i,t.name),sourceType:`claude-plugin`}}catch{}}return null}return{resolveInstallPath:t,resolveInstructionPath:n,resolveEpilogueInstructionPath:r,getStepSequence:i,resolveCurrentStepInfo:a,resolveOpenSpecSource:o,resolveClaudePluginSource:s}}function Hl(e){function t(){return e.sources?.[0]?.path??Ee()}function n(){return e.allRoots?.length?e.allRoots:[t()]}function r(e){return e.map(e=>e.replaceAll(`\\`,`/`))}function i(e){let t=[];try{let n=ke(e,{withFileTypes:!0});for(let r of n){if(!r.isDirectory()||r.name.startsWith(`.`))continue;let n=P(e,r.name);M(P(n,`.git`))&&t.push(n)}}catch{}return t}function a(){let e=n(),t=new Set(e);for(let n of e)for(let e of i(n))t.add(e);return[...t]}function o(e){let t=e.replaceAll(`\\`,`/`);if(r(a()).includes(t))return!0;let i=r(n());for(let n of i)if(t.startsWith(`${n}/`)&&M(P(e,`.git`)))return!0;return!1}function s(e){return P(e??t(),`.flows`)}async function c(){let e=a();for(let t of e){let e=s(t);if(M(e))for(let n of ke(e,{withFileTypes:!0})){if(!n.isDirectory())continue;let r=P(e,n.name,`meta.json`);if(M(r))try{let e=JSON.parse(N(r,`utf-8`));if(e.status===`active`)return e.primaryRoot?e.primaryRoot:t}catch{}}}return null}async function l(e){return e||(await c()??t())}function u(){let e=t(),i=r(n()),o=a(),s=r(o),c=s.filter(e=>!i.includes(e));return{workspaceRoot:e,allRoots:o,normalizedAllRoots:s,discoveredRepos:c.length>0?c:void 0}}function d(e,t,n){let r=P(s(t),e,`meta.json`),i=N(r,`utf-8`),a=JSON.parse(i);a.roots=n.map(e=>e.replaceAll(`\\`,`/`)),a.primaryRoot=t.replaceAll(`\\`,`/`);let o=`${r}.tmp`;Pe(o,JSON.stringify(a,null,2),`utf-8`),Ae(o,r)}function f(e,t){let n=P(s(t),e,`meta.json`);if(!M(n))return;let r=N(n,`utf-8`),i=JSON.parse(r),a=i.roots;if(!a||a.length<=1)return;let o=t.replaceAll(`\\`,`/`);for(let t of a){if(t===o)continue;let n=P(t,`.flows`,e);Oe(n,{recursive:!0});let a=P(n,`meta.json`),s=`${a}.tmp`;Pe(s,r,`utf-8`),Ae(s,a),Oe(P(n,i.artifactsDir??`.spec`),{recursive:!0})}}return{getWorkspaceRoot:t,getAllRoots:a,getFlowsDir:s,isValidFlowRoot:o,resolveFlowRoot:l,resolveRoots:u,patchMetaRoots:d,syncMetaToRoots:f}}const Ul={design:`researcher`,spec:`researcher`,plan:`implementer`,task:`implementer`,execute:`implementer`,verify:`reviewer`,"basic-design":`researcher`,assess:`researcher`,"basic-implement":`implementer`,"basic-verify":`reviewer`,"docs-sync":`documenter`,"lesson-learned":`documenter`,epilogue:`documenter`},Wl={implementer:`implementer`,frontend:`implementer`,refactor:`implementer`,debugger:`debugger`,security:`reviewer`,documenter:`documenter`,planner:`implementer`,researcher:`researcher`,explorer:`researcher`,orchestrator:`implementer`,"code-reviewer":`reviewer`,"architect-reviewer":`reviewer`},Gl=new Set([`implementer`,`documenter`,`reviewer`,`researcher`,`debugger`]);function Kl(e){if(e.profile!==void 0&&e.profile!==null)return Gl.has(e.profile)?e.profile:`implementer`;if(e.id){let t=Ul[e.id];if(t)return t}if(e.agents&&e.agents.length>0)for(let t of e.agents){let e=Wl[t.toLowerCase()];if(e)return e}return`implementer`}function ql(e){let{manifest:t}=e;if(!t?.steps)return null;let n=t.steps.find(t=>t.id===e.stepId);return n?Kl(n):null}function Jl(e){return{name:`flow-context`,order:40,maxTokens:120,runInBrief:!0,async execute(t){let n=ql(t),r=[`**Flow Context:** Call \`knowledge({ action: 'withdraw', scope: 'flow', profile: '${e??n??`implementer`}', budget: 4000 })\` as FIRST action for prior context.`,"Remember decisions: `knowledge({ action: 'remember', title: '...', content: '...', category: 'flow-context', scope: 'flow' })`"];t.completedSteps.length>0&&r.push(`Completed steps: ${t.completedSteps.join(`, `)}`);let i=r.join(`
168
- `);return{content:i,tokens:Math.ceil(i.length/4)}}}}function Yl(e){return{name:`knowledge-recall`,order:20,maxTokens:200,runInBrief:!0,async execute(t){if(!e.store)return null;let n=[t.stepDescription,t.topic].filter(e=>typeof e==`string`&&e.trim().length>0);if(n.length===0)return null;let r=[...n,t.flowName].filter(Boolean).join(` `);if(!r.trim())return null;try{let t=await e.store.search(r,{limit:3});if(!t||t.length===0)return null;let n=t.map(e=>`• ${e.content.slice(0,200)}`).join(`
169
- `),i=Math.ceil(n.length/4);return{content:`**Recalled Knowledge:**\n${n}`,tokens:Math.min(i,200)}}catch{return null}}}}const Xl=[`**Read Code:** Structure → file_summary({ files, tier: 'T1' }). Specific section → file_summary({ files, tier: 'T2', query }).`,`Multiple files → digest(). Cached ref → file_summary({ ref, query }). Repeated file ref → file_summary(). Edit lines → read_file().`,`NEVER read_file >50 lines to understand. Use search() for discovery.`].join(` `),Zl={name:`token-efficiency`,order:30,maxTokens:80,runInBrief:!1,runOnce:!0,async execute(e){return{content:Xl,tokens:25}}},Ql=[`**Tool Routing:** search() not grep_search. file_summary() not read_file (for understanding).`,`check() not terminal tsc/lint. test_run() not terminal test. trace() for data flow.`,`read_file ONLY for exact lines before editing. symbol() for definition+refs.`].join(` `),$l={name:`tool-routing`,order:10,maxTokens:100,runInBrief:!0,runOnce:!0,async execute(e){return{content:Ql,tokens:30}}};function eu(e,t){return Promise.race([e,new Promise(e=>setTimeout(()=>e(null),t))])}var tu=class{hooks=[];firedOnce=new Set;sealed=!1;log;constructor(e){this.log=e?.log}seal(){this.sealed=!0}register(e){if(this.sealed){this.log?.warn(`Attempted to register hook "%s" on sealed pipeline`,e.name);return}this.hooks.push(e),this.hooks.sort((e,t)=>e.order-t.order)}get hookCount(){return this.hooks.length}async enrich(e,t,n){let r=this.resolveBudget(t.mode,n),i=new Set(n?.disable??[]),a=this.hooks.filter(e=>!(i.has(e.name)||t.mode===`brief`&&!e.runInBrief||e.runOnce&&this.firedOnce.has(e.name)));if(a.length===0)return e;let o=[],s=0;for(let e of a){if(s>=r){this.log?.debug(`[step-hooks] Budget exhausted (${s}/${r}), skipping remaining hooks`);break}try{let n=await eu(e.execute(t),5e3);if(!n||n.content.length===0)continue;e.runOnce&&this.firedOnce.add(e.name);let i=n.content.replace(/<\/(step-context|step-hints)>/gi,``);if(i.length===0)continue;let a=this.truncateToTokens(i,e.maxTokens),c=Math.min(n.tokens,e.maxTokens);if(s+c<=r){o.push({content:a,tokens:c}),s+=c;continue}let l=r-s;if(l<=0)break;o.push({content:this.truncateToTokens(a,l),tokens:l}),s=r}catch(t){this.log?.warn(`[step-hooks] Hook "${e.name}" failed: ${t instanceof Error?t.message:String(t)}`)}}if(o.length===0)return e;let c=t.mode===`full`?`<step-context>`:`<step-hints>`,l=t.mode===`full`?`</step-context>`:`</step-hints>`;return`${e}\n\n${c}\n${o.map(e=>e.content).join(`
163
+ `)}]}}catch(e){return Ol.error(`Evolution review failed`,j(e)),q(`INTERNAL`,`Evolution review failed: unable to compute metrics`)}})}const Al=k(`tools:execution`);function jl(e,t,n){let r=U(`check`);e.registerTool(`check`,{title:r.title,description:`Run incremental typecheck (tsc) and lint (biome) on the project or specific files. Returns structured error and warning lists. Default detail level is "efficient" (~300 tokens).`,inputSchema:{files:I.array(I.string()).optional().describe(`Specific files to check (if omitted, checks all)`),cwd:I.string().optional().describe(`Working directory`),skip_types:I.boolean().default(!1).describe(`Skip TypeScript typecheck`),skip_lint:I.boolean().default(!1).describe(`Skip Biome lint`),detail:I.enum(ye).optional().describe(`Output detail level: efficient (default, ~300 tokens — pass/fail + counts + top errors), normal (parsed error objects), full (includes raw terminal output)`),enrich:I.boolean().default(!1).describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens. Default false — set true when you need stored decisions, conventions, or relationship context.`)},outputSchema:ks,annotations:r.annotations},J(`check`,async({files:e,cwd:r,skip_types:i,skip_lint:a,detail:o,enrich:s},c)=>{try{let l=o??n??`efficient`,u=await at({files:e,cwd:r,skipTypes:i,skipLint:a,detail:l===`efficient`?`normal`:l}),d=Lc(c).createTask(`Check`,2);d.progress(0,`tsc: ${u.tsc.errors.length} errors`),d.progress(1,`biome: ${u.biome.errors.length} errors`),d.complete(`Check ${u.passed?`passed`:`failed`}`);let f=Ln(u);if(l===`efficient`){let e=[];if(u.passed)e.push({tool:`test_run`,reason:`Types and lint clean — run tests next`});else{let t=u.tsc.errors[0]?.file??u.biome.errors[0]?.file,n=f.tsc.topErrors[0]??f.biome.topErrors[0]??`reported errors`;t&&e.push({tool:`compact`,reason:`Inspect failing code with compact({ path: ${JSON.stringify(t)}, query: ${JSON.stringify(n)} })`,suggested_args:{path:t,query:n}}),e.push({tool:`check`,reason:`Re-check after fixing errors`,suggested_args:{detail:`normal`}})}let n=[`## Check ${f.passed?`✅ PASS`:`❌ FAIL`}`,``,`**tsc**: ${f.tsc.passed?`✅`:`❌`} ${f.tsc.errorCount} errors, ${f.tsc.warningCount} warnings`];if(f.tsc.topErrors.length>0)for(let e of f.tsc.topErrors)n.push(` - ${e}`);if(n.push(`**biome**: ${f.biome.passed?`✅`:`❌`} ${f.biome.errorCount} errors, ${f.biome.warningCount} warnings`),f.biome.topErrors.length>0)for(let e of f.biome.topErrors)n.push(` - ${e}`);if(e.length>0){n.push(``,`**Next steps:**`);for(let t of e)n.push(`- \`${t.tool}\`: ${t.reason}`)}let r=n.join(`
164
+ `);if(s&&t){let e=await G(t,{query:`known issues failures`});r+=K(e)}return{content:[{type:`text`,text:r}],structuredContent:{...f}}}let p=JSON.stringify(u);if(s&&t){let e=await G(t,{query:`known issues failures`});p+=K(e)}return{content:[{type:`text`,text:p}],structuredContent:{...f}}}catch(e){return Al.error(`Check failed`,j(e)),q(`INTERNAL`,`Check failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Ml(e){let t=U(`eval`);e.registerTool(`eval`,{title:t.title,description:`Execute a JavaScript or TypeScript snippet in a constrained VM sandbox with a timeout. Captures console output and returned values.`,inputSchema:{code:I.string().max(1e5).describe(`Code snippet to execute`),lang:I.enum([`js`,`ts`]).default(`js`).optional().describe(`Language mode: js executes directly, ts strips common type syntax first`),timeout:I.number().min(1).max(6e4).default(5e3).optional().describe(`Execution timeout in milliseconds`)},annotations:t.annotations},J(`eval`,async({code:e,lang:t,timeout:n})=>{try{let r=await Et({code:e,lang:t,timeout:n});return r.success?{content:[{type:`text`,text:`Eval succeeded in ${r.durationMs}ms\n\n${r.output}`}]}:q(`INTERNAL`,`Eval failed in ${r.durationMs}ms: ${r.error??`Unknown error`}`)}catch(e){return Al.error(`Eval failed`,j(e)),q(`INTERNAL`,`Eval failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Nl(e,t){let n=U(`test_run`);e.registerTool(`test_run`,{title:n.title,description:`Run Vitest for the current project or a subset of files, then return a structured summary of passing and failing tests.`,inputSchema:{files:I.array(I.string()).optional().describe(`Specific test files or patterns to run`),grep:I.string().optional().describe(`Only run tests whose names match this pattern`),cwd:I.string().optional().describe(`Working directory for the test run`),enrich:I.boolean().default(!1).describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens. Default false — set true when you need stored decisions, conventions, or relationship context.`)},annotations:n.annotations,outputSchema:Qs},J(`test_run`,async({files:e,grep:n,cwd:r,enrich:i},a)=>{try{let o=await zn({files:e,grep:n,cwd:r}),s=Lc(a).createTask(`Test Run`,1),c=o.summary.passed+o.summary.failed+o.summary.skipped;s.complete(`Tests: ${o.passed?`passed`:`failed`} (${c} tests)`);let l=Il(o);if(i&&t){let e=await G(t,{query:`test patterns known failures`});l+=K(e)}return{content:[{type:`text`,text:l}],structuredContent:{passed:o.passed,totalTests:c,passedTests:o.summary.passed,failedTests:o.summary.failed,skippedTests:o.summary.skipped,duration:o.summary.duration??0,failures:o.summary.tests.filter(e=>e.status===`fail`).map(e=>({name:e.name,message:e.error??``,...e.file?{file:e.file}:{}}))},isError:!o.passed}}catch(e){return Al.error(`Test run failed`,j(e)),q(`INTERNAL`,`Test run failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Pl(e){let t=U(`parse_output`);e.registerTool(`parse_output`,{title:t.title,description:`Parse structured data from build tool output. Supports tsc, vitest, biome, and git status. Auto-detects the tool or specify explicitly.`,inputSchema:{output:I.string().max(5e5).describe(`Raw output text from a build tool`),tool:I.enum([`tsc`,`vitest`,`biome`,`git-status`]).optional().describe(`Tool to parse as (auto-detects if omitted)`)},annotations:t.annotations},async({output:e,tool:t})=>{try{let n=Qt(e.replace(/\\n/g,`
165
+ `).replace(/\\t/g,` `),t);return{content:[{type:`text`,text:JSON.stringify(n)}]}}catch(e){return Al.error(`Parse failed`,j(e)),q(`INTERNAL`,`Parse failed: ${e instanceof Error?e.message:String(e)}`)}})}function Fl(e,t){let n=U(`delegate`);e.registerTool(`delegate`,{title:n.title,description:`Delegate a subtask to a local Ollama model. Use for summarization, classification, naming, or any task that can offload work from the host agent. Fails fast if Ollama is not running.`,inputSchema:{prompt:I.string().max(2e5).describe(`The task or question to send to the local model`),model:I.string().optional().describe(`Ollama model name (default: first available model)`),system:I.string().optional().describe(`System prompt for the model`),context:I.string().max(5e5).optional().describe(`Context text to include before the prompt (e.g. file contents)`),temperature:I.number().min(0).max(2).default(.3).optional().describe(`Sampling temperature (0=deterministic, default 0.3)`),timeout:I.number().min(1e3).max(6e5).default(12e4).optional().describe(`Timeout in milliseconds (default 120000)`),action:I.enum([`generate`,`list_models`]).default(`generate`).optional().describe(`Action: generate a response or list available models`)},annotations:n.annotations},async({prompt:e,model:n,system:r,context:i,temperature:a,timeout:o,action:s})=>{try{if(s===`list_models`){let e=await xt();return{content:[{type:`text`,text:JSON.stringify({models:e,count:e.length,_Next:`Use delegate with a model name`},null,2)}]}}if(t?.available)try{let n=await t.createMessage({prompt:e,systemPrompt:r,context:i,maxTokens:4e3,modelPreferences:{intelligencePriority:.8,speedPriority:.5,costPriority:.3}});return{content:[{type:`text`,text:JSON.stringify({model:n.model??`sampling`,response:n.text,provider:`mcp-sampling`,_Next:`Use the response in your workflow. stash to save it.`},null,2)}]}}catch{Al.debug(`Sampling failed, falling back to Ollama`)}let c=await bt({prompt:e,model:n,system:r,context:i,temperature:a,timeout:o});return c.error?q(`INTERNAL`,JSON.stringify({error:c.error,model:c.model,durationMs:c.durationMs},null,2)):{content:[{type:`text`,text:JSON.stringify({model:c.model,response:c.response,durationMs:c.durationMs,tokenCount:c.tokenCount,_Next:`Use the response in your workflow. stash to save it.`},null,2)}]}}catch(e){return Al.error(`Delegate failed`,j(e)),q(`INTERNAL`,`Delegate failed: ${e instanceof Error?e.message:String(e)}`)}})}function Il(e){let t=[`Vitest run: ${e.passed?`passed`:`failed`}`,`Duration: ${e.durationMs}ms`,`Passed: ${e.summary.passed}`,`Failed: ${e.summary.failed}`,`Skipped: ${e.summary.skipped}`];e.summary.suites!==void 0&&t.push(`Suites: ${e.summary.suites}`);let n=e.summary.tests.filter(e=>e.status===`fail`);if(n.length>0){t.push(``,`Failed tests:`);for(let e of n)t.push(`- ${e.name}${e.file?` (${e.file})`:``}`),e.error&&t.push(` ${e.error}`)}return t.join(`
166
+ `)}const Ll=k(`tools:file-summary`);function Rl(e,t,n){let r=U(`file_summary`);e.registerTool(`file_summary`,{title:r.title,description:"Unified file/source summary tool. With `files`: T1=structural card (ROLE/DEPS/EXPORTS), T2=card + query-relevant content. With `text`: compress arbitrary text by relevance. With `ref`: restore cached result. Replaces file_summary + compact + stratum_card.",inputSchema:{files:I.array(I.string()).min(1).max(50).optional().describe(`File paths to summarize (card output: T1=structure, T2=structure+content)`),text:I.string().optional().describe(`Arbitrary text to compress (text output with ratio/segment stats)`),ref:I.string().optional().describe(`Cached ref to restore from file_summary/digest/find/knowledge output — use file_summary({ ref }) to consume`),query:I.string().optional().describe(`Focus query — guides relevance scoring. Triggers T2 when present without explicit tier`),tier:I.enum([`T1`,`T2`]).optional().describe(`Tier: T1=structure only, T2=structure+content. Default: T1, or T2 if query present`),max_content_chars:I.number().min(100).max(5e3).default(800).describe(`For T2/text: max chars for compressed content`),segmentation:I.enum([`paragraph`,`sentence`,`line`]).default(`paragraph`).describe(`How to split content for relevance scoring`),min_score:I.number().min(0).max(1).optional().describe(`Minimum relevance score threshold (0-1)`),mode:I.enum([`full`,`delta`]).default(`full`).describe(`'full'=compress everything, 'delta'=only changes since last read`)},annotations:r.annotations},J(`file_summary`,async({files:e,text:r,ref:i,query:a,tier:o,max_content_chars:s,segmentation:c,min_score:l,mode:u})=>{try{let d=await Ot(t,{files:e,text:r,ref:i,query:a,tier:o,maxContentChars:s,segmentation:c,minScore:l,mode:u,cache:n}),f=[];if(i)f.push(`## File Summary — Ref Restored`,`Ref: ${d.ref??i}`,``,d.text??``);else if(r){let e=d.ratio==null?`?`:(d.ratio*100).toFixed(0);f.push(`## File Summary — Text Compression`,`Original: ${d.originalChars??0} chars → ${d.compressedChars??0} chars (${e}%)`,...d.ref?[`Ref: ${d.ref}`]:[],``,d.text??``)}else if(d.cards){let e=o??`T1`;f.push(`## File Summary (${e}) — ${d.cards.length} files`,`Total: ~${d.totalTokenEstimate} tokens (was ~${d.totalOriginalTokenEstimate}, ${((d.compressionRatio??1)*100).toFixed(0)}% of original)`,``,...d.cards.map(e=>e.card),``)}return f.push(`---`,'_Next: Use `file_summary` with `tier: "T2"` and a query for deeper content or `digest` for multi-file synthesis._'),{content:[{type:`text`,text:f.filter(e=>typeof e==`string`).join(`
167
+ `)}]}}catch(e){return Ll.error(`file_summary failed`,j(e)),q(`INTERNAL`,`file_summary failed: ${e instanceof Error?e.message:String(e)}`)}}))}const zl=[],Bl=[`_docs-sync`],Vl=new Map([[`_docs-sync`,`Synchronize project documentation — update docs/ folder based on changes made during the flow.`]]);function Hl(e){function t(t,n,r){let i=n?.installPath?Fe(n.installPath):t.replaceAll(`:`,`-`),a=F(Xn(),`.copilot`,`flows`,i).replaceAll(`\\`,`/`);if(M(a))return a;let o=F(Xn(),`.claude`,`flows`,i).replaceAll(`\\`,`/`);if(M(o))return o;let s=F(r??e(),`.github`,`flows`,i).replaceAll(`\\`,`/`);return M(s)?s:n?.installPath&&M(n.installPath)?n.installPath.replaceAll(`\\`,`/`):null}function n(e,n,r){let i=t(e.name,e,r);return i?F(i,n).replaceAll(`\\`,`/`):n}function r(t,n){let r=t.replace(/^_/,``),i=n??e(),a=[P(i,`.github`,`flows`,`_epilogue`,`steps`,r,`README.md`),P(i,`.github`,`flows`,`_epilogue`,r,`README.md`)];for(let e of a)if(M(e))return e.replaceAll(`\\`,`/`);return null}function i(e){return[...zl,...e.manifest.steps.map(e=>e.id),...Bl]}function a(e,t,r){let i=t?e.manifest.steps.find(e=>e.id===t)??null:null,a=t?Vl.get(t)??null:null;return{currentStep:i,epilogueStep:a?{id:t,description:a}:null,instructionPath:i&&t?n(e,i.instruction,r):null,description:i?.description??a}}function o(){try{let e=P(Jn(`npm root -g`,{encoding:`utf-8`}).trim(),`@fission-ai`,`openspec`);if(M(e))return{path:e,sourceType:`npm-global`,isGit:!1}}catch{}return{path:`https://github.com/Fission-AI/OpenSpec.git`,sourceType:`git`,isGit:!0}}function s(e){let t=F(e);if(M(P(t,`.claude-plugin`,`plugin.json`)))return{path:t,sourceType:`claude-plugin`};let n=Xn(),r=P(n,`.claude`,`plugins`,e);if(M(P(r,`.claude-plugin`,`plugin.json`)))return{path:r,sourceType:`claude-plugin`};let i=P(n,`.claude`,`plugins`);if(!M(i))return null;for(let t of ke(i,{withFileTypes:!0})){if(!t.isDirectory())continue;let n=P(i,t.name,`.claude-plugin`,`plugin.json`);if(M(n))try{if(JSON.parse(N(n,`utf-8`)).name===e)return{path:P(i,t.name),sourceType:`claude-plugin`}}catch{}}return null}return{resolveInstallPath:t,resolveInstructionPath:n,resolveEpilogueInstructionPath:r,getStepSequence:i,resolveCurrentStepInfo:a,resolveOpenSpecSource:o,resolveClaudePluginSource:s}}function Ul(e){function t(){return e.sources?.[0]?.path??Ee()}function n(){return e.allRoots?.length?e.allRoots:[t()]}function r(e){return e.map(e=>e.replaceAll(`\\`,`/`))}function i(e){let t=[];try{let n=ke(e,{withFileTypes:!0});for(let r of n){if(!r.isDirectory()||r.name.startsWith(`.`))continue;let n=P(e,r.name);M(P(n,`.git`))&&t.push(n)}}catch{}return t}function a(){let e=n(),t=new Set(e);for(let n of e)for(let e of i(n))t.add(e);return[...t]}function o(e){let t=e.replaceAll(`\\`,`/`);if(r(a()).includes(t))return!0;let i=r(n());for(let n of i)if(t.startsWith(`${n}/`)&&M(P(e,`.git`)))return!0;return!1}function s(e){return P(e??t(),`.flows`)}async function c(){let e=a();for(let t of e){let e=s(t);if(M(e))for(let n of ke(e,{withFileTypes:!0})){if(!n.isDirectory())continue;let r=P(e,n.name,`meta.json`);if(M(r))try{let e=JSON.parse(N(r,`utf-8`));if(e.status===`active`)return e.primaryRoot?e.primaryRoot:t}catch{}}}return null}async function l(e){return e||(await c()??t())}function u(){let e=t(),i=r(n()),o=a(),s=r(o),c=s.filter(e=>!i.includes(e));return{workspaceRoot:e,allRoots:o,normalizedAllRoots:s,discoveredRepos:c.length>0?c:void 0}}function d(e,t,n){let r=P(s(t),e,`meta.json`),i=N(r,`utf-8`),a=JSON.parse(i);a.roots=n.map(e=>e.replaceAll(`\\`,`/`)),a.primaryRoot=t.replaceAll(`\\`,`/`);let o=`${r}.tmp`;Pe(o,JSON.stringify(a,null,2),`utf-8`),Ae(o,r)}function f(e,t){let n=P(s(t),e,`meta.json`);if(!M(n))return;let r=N(n,`utf-8`),i=JSON.parse(r),a=i.roots;if(!a||a.length<=1)return;let o=t.replaceAll(`\\`,`/`);for(let t of a){if(t===o)continue;let n=P(t,`.flows`,e);Oe(n,{recursive:!0});let a=P(n,`meta.json`),s=`${a}.tmp`;Pe(s,r,`utf-8`),Ae(s,a),Oe(P(n,i.artifactsDir??`.spec`),{recursive:!0})}}return{getWorkspaceRoot:t,getAllRoots:a,getFlowsDir:s,isValidFlowRoot:o,resolveFlowRoot:l,resolveRoots:u,patchMetaRoots:d,syncMetaToRoots:f}}const Wl={design:`researcher`,spec:`researcher`,plan:`implementer`,task:`implementer`,execute:`implementer`,verify:`reviewer`,"basic-design":`researcher`,assess:`researcher`,"basic-implement":`implementer`,"basic-verify":`reviewer`,"docs-sync":`documenter`,"lesson-learned":`documenter`,epilogue:`documenter`},Gl={implementer:`implementer`,frontend:`implementer`,refactor:`implementer`,debugger:`debugger`,security:`reviewer`,documenter:`documenter`,planner:`implementer`,researcher:`researcher`,explorer:`researcher`,orchestrator:`implementer`,"code-reviewer":`reviewer`,"architect-reviewer":`reviewer`},Kl=new Set([`implementer`,`documenter`,`reviewer`,`researcher`,`debugger`]);function ql(e){if(e.profile!==void 0&&e.profile!==null)return Kl.has(e.profile)?e.profile:`implementer`;if(e.id){let t=Wl[e.id];if(t)return t}if(e.agents&&e.agents.length>0)for(let t of e.agents){let e=Gl[t.toLowerCase()];if(e)return e}return`implementer`}function Jl(e){let{manifest:t}=e;if(!t?.steps)return null;let n=t.steps.find(t=>t.id===e.stepId);return n?ql(n):null}function Yl(e){return{name:`flow-context`,order:40,maxTokens:120,runInBrief:!0,async execute(t){let n=Jl(t),r=[`**Flow Context:** Call \`knowledge({ action: 'withdraw', scope: 'flow', profile: '${e??n??`implementer`}', budget: 4000 })\` as FIRST action for prior context.`,"Remember decisions: `knowledge({ action: 'remember', title: '...', content: '...', category: 'flow-context', scope: 'flow' })`"];t.completedSteps.length>0&&r.push(`Completed steps: ${t.completedSteps.join(`, `)}`);let i=r.join(`
168
+ `);return{content:i,tokens:Math.ceil(i.length/4)}}}}function Xl(e){return{name:`knowledge-recall`,order:20,maxTokens:200,runInBrief:!0,async execute(t){if(!e.store)return null;let n=[t.stepDescription,t.topic].filter(e=>typeof e==`string`&&e.trim().length>0);if(n.length===0)return null;let r=[...n,t.flowName].filter(Boolean).join(` `);if(!r.trim())return null;try{let t=await e.store.search(r,{limit:3});if(!t||t.length===0)return null;let n=t.map(e=>`• ${e.content.slice(0,200)}`).join(`
169
+ `),i=Math.ceil(n.length/4);return{content:`**Recalled Knowledge:**\n${n}`,tokens:Math.min(i,200)}}catch{return null}}}}const Zl=[`**Read Code:** Structure → file_summary({ files, tier: 'T1' }). Specific section → file_summary({ files, tier: 'T2', query }).`,`Multiple files → digest(). Cached ref → file_summary({ ref, query }). Repeated file ref → file_summary(). Edit lines → read_file().`,`NEVER read_file >50 lines to understand. Use search() for discovery.`].join(` `),Ql={name:`token-efficiency`,order:30,maxTokens:80,runInBrief:!1,runOnce:!0,async execute(e){return{content:Zl,tokens:25}}},$l=[`**Tool Routing:** search() not grep_search. file_summary() not read_file (for understanding).`,`check() not terminal tsc/lint. test_run() not terminal test. trace() for data flow.`,`read_file ONLY for exact lines before editing. symbol() for definition+refs.`].join(` `),eu={name:`tool-routing`,order:10,maxTokens:100,runInBrief:!0,runOnce:!0,async execute(e){return{content:$l,tokens:30}}};function tu(e,t){return Promise.race([e,new Promise(e=>setTimeout(()=>e(null),t))])}var nu=class{hooks=[];firedOnce=new Set;sealed=!1;log;constructor(e){this.log=e?.log}seal(){this.sealed=!0}register(e){if(this.sealed){this.log?.warn(`Attempted to register hook "%s" on sealed pipeline`,e.name);return}this.hooks.push(e),this.hooks.sort((e,t)=>e.order-t.order)}get hookCount(){return this.hooks.length}async enrich(e,t,n){let r=this.resolveBudget(t.mode,n),i=new Set(n?.disable??[]),a=this.hooks.filter(e=>!(i.has(e.name)||t.mode===`brief`&&!e.runInBrief||e.runOnce&&this.firedOnce.has(e.name)));if(a.length===0)return e;let o=[],s=0;for(let e of a){if(s>=r){this.log?.debug(`[step-hooks] Budget exhausted (${s}/${r}), skipping remaining hooks`);break}try{let n=await tu(e.execute(t),5e3);if(!n||n.content.length===0)continue;e.runOnce&&this.firedOnce.add(e.name);let i=n.content.replace(/<\/(step-context|step-hints)>/gi,``);if(i.length===0)continue;let a=this.truncateToTokens(i,e.maxTokens),c=Math.min(n.tokens,e.maxTokens);if(s+c<=r){o.push({content:a,tokens:c}),s+=c;continue}let l=r-s;if(l<=0)break;o.push({content:this.truncateToTokens(a,l),tokens:l}),s=r}catch(t){this.log?.warn(`[step-hooks] Hook "${e.name}" failed: ${t instanceof Error?t.message:String(t)}`)}}if(o.length===0)return e;let c=t.mode===`full`?`<step-context>`:`<step-hints>`,l=t.mode===`full`?`</step-context>`:`</step-hints>`;return`${e}\n\n${c}\n${o.map(e=>e.content).join(`
170
170
 
171
- `)}\n${l}`}resolveBudget(e,t){return e===`full`?t?.tokenBudget?.full??500:t?.tokenBudget?.brief??300}truncateToTokens(e,t){let n=t*4;return e.length<=n?e:`${e.slice(0,n).trimEnd()}…`}};function nu(e={}){let t=new tu({log:e.log});return t.register($l),t.register(Yl({store:e.store,graphStore:e.graphStore,embedder:e.embedder})),t.register(Zl),t.register(Jl()),t.seal(),t}const ru=k(`flow-tools`);function iu(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`&&e.trim().length>0):[]}function au(e){return{content:[{type:`text`,text:e}]}}function ou(e){return e instanceof Error?e.message:String(e)}const su={before:[],after:[{id:`_docs-sync`,description:`Synchronize project documentation — update docs/ folder based on changes made during the flow.`,position:`after`,skills:[`docs`]}]};function cu(e,t,n,r,i,a){let o=Hl(t),s=Vl(o.getWorkspaceRoot),c=nu({store:n?.store,graphStore:n?.graphStore,embedder:n?.embedder,log:ru});function l(){return P(xe(),`flows`,`registry.json`)}function u(){let t=ie(e);return async({content:e,sourceFormat:n,stepName:r,metadata:i})=>{let a=r.charAt(0).toUpperCase()+r.slice(1),o=i?JSON.stringify(i,null,2):void 0,s=`You are converting a flow step definition from "${n}" format to aikit native flow step README.md format.
171
+ `)}\n${l}`}resolveBudget(e,t){return e===`full`?t?.tokenBudget?.full??500:t?.tokenBudget?.brief??300}truncateToTokens(e,t){let n=t*4;return e.length<=n?e:`${e.slice(0,n).trimEnd()}…`}};function ru(e={}){let t=new nu({log:e.log});return t.register(eu),t.register(Xl({store:e.store,graphStore:e.graphStore,embedder:e.embedder})),t.register(Ql),t.register(Yl()),t.seal(),t}const iu=k(`flow-tools`);function au(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`&&e.trim().length>0):[]}function ou(e){return{content:[{type:`text`,text:e}]}}function su(e){return e instanceof Error?e.message:String(e)}const cu={before:[],after:[{id:`_docs-sync`,description:`Synchronize project documentation — update docs/ folder based on changes made during the flow.`,position:`after`,skills:[`docs`]}]};function lu(e,t,n,r,i,a){let o=Ul(t),s=Hl(o.getWorkspaceRoot),c=ru({store:n?.store,graphStore:n?.graphStore,embedder:n?.embedder,log:iu});function l(){return P(xe(),`flows`,`registry.json`)}function u(){let t=ie(e);return async({content:e,sourceFormat:n,stepName:r,metadata:i})=>{let a=r.charAt(0).toUpperCase()+r.slice(1),o=i?JSON.stringify(i,null,2):void 0,s=`You are converting a flow step definition from "${n}" format to aikit native flow step README.md format.
172
172
 
173
173
  Convert the provided content into a well-structured README.md for a flow step named "${r}".
174
174
 
@@ -181,24 +181,24 @@ The output must:
181
181
  6. Preserve ALL tool restrictions, constraints, and requirements from the source
182
182
  7. Be formatted as clean Markdown
183
183
 
184
- Output ONLY the README.md content, nothing else.`;if(t.available)try{let i=(await t.createMessage({prompt:e,systemPrompt:s,context:o?`Step name: ${r}\nSource format: ${n}\nMetadata:\n${o}`:`Step name: ${r}\nSource format: ${n}`,maxTokens:4096,modelPreferences:{intelligencePriority:.8,speedPriority:.4,costPriority:.2}})).text.trim();if(i.length>0)return i}catch(e){ru.debug(`Flow transform sampling failed; using fallback formatting`,{error:ou(e),sourceFormat:n,stepName:r})}let c=typeof i?.description==`string`&&i.description.trim().length>0?i.description.trim():null,l=iu(i?.produces),u=iu(i?.requires);return[`# ${a}`,``,`## Purpose`,``,c??`${a} step.`,``,`## Instructions`,``,e.trim(),``,`## Artifacts`,``,...l.length>0?l.map(e=>`- ${e}`):[`- ${r}.md`],...u.length>0?[``,`## Prerequisites`,``,...u.map(e=>`- ${e}`)]:[],``].join(`
184
+ Output ONLY the README.md content, nothing else.`;if(t.available)try{let i=(await t.createMessage({prompt:e,systemPrompt:s,context:o?`Step name: ${r}\nSource format: ${n}\nMetadata:\n${o}`:`Step name: ${r}\nSource format: ${n}`,maxTokens:4096,modelPreferences:{intelligencePriority:.8,speedPriority:.4,costPriority:.2}})).text.trim();if(i.length>0)return i}catch(e){iu.debug(`Flow transform sampling failed; using fallback formatting`,{error:su(e),sourceFormat:n,stepName:r})}let c=typeof i?.description==`string`&&i.description.trim().length>0?i.description.trim():null,l=au(i?.produces),u=au(i?.requires);return[`# ${a}`,``,`## Purpose`,``,c??`${a} step.`,``,`## Instructions`,``,e.trim(),``,`## Artifacts`,``,...l.length>0?l.map(e=>`- ${e}`):[`- ${r}.md`],...u.length>0?[``,`## Prerequisites`,``,...u.map(e=>`- ${e}`)]:[],``].join(`
185
185
  `).trimEnd().concat(`
186
- `)}}async function d(e){let{FlowRegistryManager:n,FlowStateMachine:r,FlowLoader:i,GitInstaller:a}=await import(`../../flows/dist/index.js`),s=P(t.stateDir??``,`flows`,`installed`);return{registry:new n(l()),stateMachine:new r(o.getFlowsDir(e),su),loader:new i,installer:new a(s)}}async function f(e){if(!r)return[];try{return(await r.list({category:`flow-context`,limit:20,orderBy:`updated`,order:`desc`})).filter(t=>t.tags?.includes(`flow:${yi(e)}`)&&t.contentPreview&&t.contentPreview.length>10).map(e=>({title:e.title,summary:e.contentPreview.slice(0,200)}))}catch{return[]}}return{server:e,config:t,log:ru,toTextResponse:au,toErrorText:ou,createFlowTransform:u,getFlows:d,stepPipeline:c,stateDir:t.stateDir??``,loadFlowDecisions:f,eventBus:i??null,skillCompiler:a??null,...o,...s}}var lu=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`FlowError`}};function uu(e){return e instanceof lu}async function du(e){let{entry:t,stepId:n,runDir:r,slug:i,primaryRoot:a,roots:o,activeRoot:s,resolveInstructionPath:c,resolveEpilogueInstructionPath:l}=e;if(!n)return null;try{let e=t.manifest.steps.find(e=>e.id===n||e.name===n),u;if(e)u=await Ve(c(t,e.instruction,s),`utf-8`);else{let e=l(n,s);if(!e)return null;u=await Ve(e,`utf-8`)}let d=P(r,t.manifest.artifacts_dir).replaceAll(`\\`,`/`),f=r.replaceAll(`\\`,`/`);u=u.replaceAll(`{{artifacts_path}}`,d).replaceAll(`{{run_dir}}`,f).replaceAll(`{{workspace_root}}`,(a??s).replaceAll(`\\`,`/`)).replaceAll(`{{all_roots}}`,JSON.stringify(o??[s.replaceAll(`\\`,`/`)],null,2));for(let e of[`spec-driven`])u=u.replaceAll(`${e}/${i}/`,`${d}/`);return u}catch{return null}}async function fu(e,t){let{getFlows:n,log:r,resolveEpilogueInstructionPath:i,resolveFlowRoot:a,resolveInstructionPath:o,stepPipeline:s,toErrorText:c,toTextResponse:l}=t,{step:u}=e;try{let e=await a(),{registry:t,stateMachine:r}=await n(e),c=r.getStatus();if(!c.success||!c.data)throw new lu(`NO_ACTIVE_FLOW`,`No active flow. Use flow({ action: "start", name: "<flow>" }) to begin one, or flow({ action: "list" }) to see available flows.`);let d=c.data,f=t.get(d.flow);if(!f)throw new lu(`FLOW_NOT_FOUND`,`Flow "${d.flow}" not found in registry.`);let p=u??d.currentStep;if(!p)throw new lu(`STEP_OUT_OF_RANGE`,`No current step is available for the active flow.`);let m=await du({entry:f,stepId:p,runDir:d.runDir,slug:d.slug,primaryRoot:d.primaryRoot,roots:d.roots,activeRoot:e,resolveInstructionPath:o,resolveEpilogueInstructionPath:i});if(!m)throw new lu(`STEP_OUT_OF_RANGE`,`Step "${p}" not found in flow "${d.flow}".`);let h=f.manifest.steps.find(e=>e.id===p||e.name===p),g=P(d.runDir,f.manifest.artifacts_dir).replaceAll(`\\`,`/`),_={stepId:p,flowName:d.flow,flowSlug:d.slug,phase:d.phase??`flow`,runDir:d.runDir,artifactsPath:g,completedSteps:d.completedSteps??[],stepDescription:h?.description,agents:h?.agents??[],mode:`full`,topic:d.topic??``,activeRoot:e};return l(await s.enrich(m,_,f.manifest.hooks))}catch(e){return uu(e)?l(e.message):(r.error(`flow action read failed`,j(e)),e instanceof Error&&`code`in e&&e.code===`ENOENT`?l(`Could not read instruction file: ${e.message}`):l(`Error: ${c(e)}`))}}async function pu(e,t){let{registry:n,loader:r,installer:i}=await e.getFlows(),a=e.createFlowTransform(),o=F(t.source);if(!M(o))return e.toTextResponse(`Source path no longer exists: ${o}`);let s=`${t.installPath}.updating`,c=`${t.installPath}.backup`;M(s)&&je(s,{recursive:!0,force:!0}),M(c)&&je(c,{recursive:!0,force:!0});let l=i.copyLocal(o,Fe(s));if(!l.success||!l.data)return e.toTextResponse(`Failed to copy flow: ${l.error}`);let u=await r.load(s,{forceAssetSync:!0,transform:a});if(!u.success||!u.data)return i.remove(s),e.toTextResponse(`Failed to load flow manifest: ${u.error}`);let d=!1;try{Ae(t.installPath,c),Ae(s,t.installPath);let e=await r.load(t.installPath,{forceAssetSync:!0,transform:a});if(!e.success||!e.data)throw Error(`Failed to load flow manifest: ${e.error}`);let o=e.data.manifest,l=e.data.format,u=n.register({...t,version:o.version,format:l,installPath:t.installPath,manifest:o,updatedAt:new Date().toISOString()});if(!u.success)throw Error(`Failed to refresh flow registry entry: ${u.error}`);if(d=!0,o.install.length>0){let e=i.runInstallDeps(o.install);if(!e.success)throw Error(`Dependency install failed: ${e.error}`)}je(c,{recursive:!0,force:!0})}catch(r){return M(s)&&je(s,{recursive:!0,force:!0}),M(c)&&(M(t.installPath)&&je(t.installPath,{recursive:!0,force:!0}),Ae(c,t.installPath)),d&&n.register(t),e.toTextResponse(e.toErrorText(r))}return e.toTextResponse(`Flow "${t.name}" updated from ${t.sourceType} source successfully.`)}async function mu(e,t){let{registry:n,loader:r}=await e.getFlows(),i=e.createFlowTransform();try{Jn(`npm update -g @fission-ai/openspec`,{encoding:`utf-8`,stdio:`pipe`})}catch(t){return e.toTextResponse(`npm update failed: ${e.toErrorText(t)}`)}let a=e.resolveOpenSpecSource(),o=await r.load(a.path,{forceAssetSync:!0,transform:i}),s=o.success&&o.data?o.data.manifest:null,c=o.success&&o.data?o.data.format:t.format;if(s){let r=n.register({...t,version:s.version,format:c,installPath:a.path,manifest:s,updatedAt:new Date().toISOString()});if(!r.success)return e.toTextResponse(`Failed to refresh flow registry entry: ${r.error}`)}return e.toTextResponse(`Flow "${t.name}" updated via npm successfully.`)}async function hu(e,t){let{registry:n,loader:r,installer:i}=await e.getFlows(),a=e.createFlowTransform(),o=i.update(t.installPath);if(!o.success)return e.toTextResponse(`Update failed: ${o.error}`);let s=await r.load(t.installPath,{forceAssetSync:!0,transform:a}),c=s.success&&s.data?s.data.manifest:null,l=s.success&&s.data?s.data.format:t.format;if(c){let r=i.getLocalCommit(t.installPath),a=n.register({...t,version:c.version,format:l,manifest:c,updatedAt:new Date().toISOString(),...r?{commitSha:r}:{}});if(!a.success)return e.toTextResponse(`Failed to refresh flow registry entry: ${a.error}`)}let u=c?.install??t.manifest.install;if(u.length>0){let t=i.runInstallDeps(u);if(!t.success)return e.toTextResponse(`Dependency install failed: ${t.error}`)}return e.toTextResponse(`Flow "${t.name}" updated successfully.`)}async function gu(e,t){let{createFlowTransform:n,getFlows:r,log:i,resolveClaudePluginSource:a,resolveOpenSpecSource:o,toErrorText:s,toTextResponse:c}=t,{source:l,name:u,token:d}=e;try{let{registry:e,loader:t,installer:i}=await r(),s=n(),f=l===`openspec`||l.startsWith(`openspec:`),p,m=l,h;if(f){let e=o();m=e.path,p=e.sourceType}let g=f?null:a(m);g&&(m=g.path,p=g.sourceType);let _=/^https?:\/\/|^git@/.test(m),v;if(_){let e=i.clone(m,d);if(!e.success||!e.data)return c(`Failed to clone flow: ${e.error}`);v=e.data}else{let e=F(m);h=e;let t=u||Fe(e)||`custom-flow`,n=i.copyLocal(e,t);if(!n.success||!n.data)return c(`Failed to copy flow: ${n.error}`);v=n.data}let y=await t.load(v,{forceAssetSync:!0,transform:s});if(!y.success||!y.data)return i.remove(v),c(`Failed to load flow manifest: ${y.error}`);let{manifest:b,format:x}=y.data,S=u||b.name,C=p??(_?`git`:`local`);if(e.has(S))return i.remove(v),c(`Flow "${S}" is already installed. Use flow({ action: "update", name: "${S}" }) to update it, or flow({ action: "remove", name: "${S}" }) then flow({ action: "add", source: "..." }) to replace.`);if(b.install.length>0){let e=i.runInstallDeps(b.install);if(!e.success)return i.remove(v),c(`Dependency install failed: ${e.error}`)}let w=new Date().toISOString(),T=_?i.getLocalCommit(v):void 0,E=e.register({name:S,version:b.version,source:C===`local`||C===`claude-plugin`?h??l:l,sourceType:C,installPath:v,format:x,registeredAt:w,updatedAt:w,manifest:b,...T?{commitSha:T}:{}});if(!E.success)return i.remove(v),c(`Failed to register flow: ${E.error}`);let ee=b.steps.length;return c(`Flow "${S}" installed successfully (${ee} steps). Use flow({ action: "start", name: "${S}" }) to begin.`)}catch(e){return i.error(`flow action add failed`,j(e)),c(`Error: ${s(e)}`)}}async function _u(e,t){let{getFlows:n,log:r,toErrorText:i,toTextResponse:a}=t,{name:o}=e;try{let{registry:e,installer:t}=await n();if(!e.has(o))return a(`Flow "${o}" is not installed.`);let r=e.get(o);if(!r)return a(`Flow "${o}" is not installed.`);if(r.sourceType===`builtin`)return a(`Cannot remove builtin flow "${o}".`);let i=t.remove(r.installPath);if(!i.success)return a(`Failed to remove flow files: ${i.error}`);let s=e.unregister(o);return s.success?a(`Flow "${o}" removed successfully.`):a(`Failed to unregister flow: ${s.error}`)}catch(e){return r.error(`flow action remove failed`,j(e)),a(`Error: ${i(e)}`)}}async function vu(e,t){let{getFlows:n,log:r,toErrorText:i,toTextResponse:a}=t,{name:o}=e,s={createFlowTransform:t.createFlowTransform,getFlows:t.getFlows,resolveOpenSpecSource:t.resolveOpenSpecSource,toErrorText:t.toErrorText,toTextResponse:t.toTextResponse};try{let{registry:e}=await n();if(!e.has(o))return a(`Flow "${o}" is not installed.`);let t=e.get(o);return!t||t.sourceType!==`git`&&t.sourceType!==`npm-global`&&t.sourceType!==`local`&&t.sourceType!==`claude-plugin`?a(`Flow "${o}" was not installed from git, npm, or a local source — cannot update. Remove and re-add instead.`):t.sourceType===`local`||t.sourceType===`claude-plugin`?pu(s,t):t.sourceType===`npm-global`?mu(s,t):hu(s,t)}catch(e){return r.error(`flow action update failed`,j(e)),a(`Error: ${i(e)}`)}}function yu(e){return qe(`sha256`).update(e,`utf-8`).digest(`hex`).slice(0,16)}const bu=`IMPORTANT: Start/status/step only include a brief. Call flow({ action: "read" }) before executing this flow step.`,xu=1200,Su=/artifact|output contract|gate|completion criteria|deliverable|must|do not|forbidden/i;function Cu(){return{artifactsPath:null,currentStepInstruction:null,currentStepDescription:null,currentStepContent:null,currentStepBrief:null,currentStepPins:null,stepSequence:[]}}function wu(e){if(e.length<=xu)return e;let t=e.slice(0,xu-1),n=Math.max(t.lastIndexOf(`
187
- `),t.lastIndexOf(` `),t.lastIndexOf(` `));return`${(n>=Math.floor(t.length*.6)?t.slice(0,n):t).trimEnd()}…`}function Tu(e){if(!e?.trim())return{brief:null,pins:null};let t=/^##\s+/m.exec(e),n=(t?e.slice(0,t.index):e).trim(),r=null;if(n){let e=n.split(/\n\s*\n/).filter(e=>e.trim().length>0),t=(e[0]?.startsWith(`#`)&&e[1]?e.slice(0,2):e.slice(0,1)).join(`
186
+ `)}}async function d(e){let{FlowRegistryManager:n,FlowStateMachine:r,FlowLoader:i,GitInstaller:a}=await import(`../../flows/dist/index.js`),s=P(t.stateDir??``,`flows`,`installed`);return{registry:new n(l()),stateMachine:new r(o.getFlowsDir(e),cu),loader:new i,installer:new a(s)}}async function f(e){if(!r)return[];try{return(await r.list({category:`flow-context`,limit:20,orderBy:`updated`,order:`desc`})).filter(t=>t.tags?.includes(`flow:${bi(e)}`)&&t.contentPreview&&t.contentPreview.length>10).map(e=>({title:e.title,summary:e.contentPreview.slice(0,200)}))}catch{return[]}}return{server:e,config:t,log:iu,toTextResponse:ou,toErrorText:su,createFlowTransform:u,getFlows:d,stepPipeline:c,stateDir:t.stateDir??``,loadFlowDecisions:f,eventBus:i??null,skillCompiler:a??null,...o,...s}}var uu=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`FlowError`}};function du(e){return e instanceof uu}async function fu(e){let{entry:t,stepId:n,runDir:r,slug:i,primaryRoot:a,roots:o,activeRoot:s,resolveInstructionPath:c,resolveEpilogueInstructionPath:l}=e;if(!n)return null;try{let e=t.manifest.steps.find(e=>e.id===n||e.name===n),u;if(e)u=await Ve(c(t,e.instruction,s),`utf-8`);else{let e=l(n,s);if(!e)return null;u=await Ve(e,`utf-8`)}let d=P(r,t.manifest.artifacts_dir).replaceAll(`\\`,`/`),f=r.replaceAll(`\\`,`/`);u=u.replaceAll(`{{artifacts_path}}`,d).replaceAll(`{{run_dir}}`,f).replaceAll(`{{workspace_root}}`,(a??s).replaceAll(`\\`,`/`)).replaceAll(`{{all_roots}}`,JSON.stringify(o??[s.replaceAll(`\\`,`/`)],null,2));for(let e of[`spec-driven`])u=u.replaceAll(`${e}/${i}/`,`${d}/`);return u}catch{return null}}async function pu(e,t){let{getFlows:n,log:r,resolveEpilogueInstructionPath:i,resolveFlowRoot:a,resolveInstructionPath:o,stepPipeline:s,toErrorText:c,toTextResponse:l}=t,{step:u}=e;try{let e=await a(),{registry:t,stateMachine:r}=await n(e),c=r.getStatus();if(!c.success||!c.data)throw new uu(`NO_ACTIVE_FLOW`,`No active flow. Use flow({ action: "start", name: "<flow>" }) to begin one, or flow({ action: "list" }) to see available flows.`);let d=c.data,f=t.get(d.flow);if(!f)throw new uu(`FLOW_NOT_FOUND`,`Flow "${d.flow}" not found in registry.`);let p=u??d.currentStep;if(!p)throw new uu(`STEP_OUT_OF_RANGE`,`No current step is available for the active flow.`);let m=await fu({entry:f,stepId:p,runDir:d.runDir,slug:d.slug,primaryRoot:d.primaryRoot,roots:d.roots,activeRoot:e,resolveInstructionPath:o,resolveEpilogueInstructionPath:i});if(!m)throw new uu(`STEP_OUT_OF_RANGE`,`Step "${p}" not found in flow "${d.flow}".`);let h=f.manifest.steps.find(e=>e.id===p||e.name===p),g=P(d.runDir,f.manifest.artifacts_dir).replaceAll(`\\`,`/`),_={stepId:p,flowName:d.flow,flowSlug:d.slug,phase:d.phase??`flow`,runDir:d.runDir,artifactsPath:g,completedSteps:d.completedSteps??[],stepDescription:h?.description,agents:h?.agents??[],mode:`full`,topic:d.topic??``,activeRoot:e};return l(await s.enrich(m,_,f.manifest.hooks))}catch(e){return du(e)?l(e.message):(r.error(`flow action read failed`,j(e)),e instanceof Error&&`code`in e&&e.code===`ENOENT`?l(`Could not read instruction file: ${e.message}`):l(`Error: ${c(e)}`))}}async function mu(e,t){let{registry:n,loader:r,installer:i}=await e.getFlows(),a=e.createFlowTransform(),o=F(t.source);if(!M(o))return e.toTextResponse(`Source path no longer exists: ${o}`);let s=`${t.installPath}.updating`,c=`${t.installPath}.backup`;M(s)&&je(s,{recursive:!0,force:!0}),M(c)&&je(c,{recursive:!0,force:!0});let l=i.copyLocal(o,Fe(s));if(!l.success||!l.data)return e.toTextResponse(`Failed to copy flow: ${l.error}`);let u=await r.load(s,{forceAssetSync:!0,transform:a});if(!u.success||!u.data)return i.remove(s),e.toTextResponse(`Failed to load flow manifest: ${u.error}`);let d=!1;try{Ae(t.installPath,c),Ae(s,t.installPath);let e=await r.load(t.installPath,{forceAssetSync:!0,transform:a});if(!e.success||!e.data)throw Error(`Failed to load flow manifest: ${e.error}`);let o=e.data.manifest,l=e.data.format,u=n.register({...t,version:o.version,format:l,installPath:t.installPath,manifest:o,updatedAt:new Date().toISOString()});if(!u.success)throw Error(`Failed to refresh flow registry entry: ${u.error}`);if(d=!0,o.install.length>0){let e=i.runInstallDeps(o.install);if(!e.success)throw Error(`Dependency install failed: ${e.error}`)}je(c,{recursive:!0,force:!0})}catch(r){return M(s)&&je(s,{recursive:!0,force:!0}),M(c)&&(M(t.installPath)&&je(t.installPath,{recursive:!0,force:!0}),Ae(c,t.installPath)),d&&n.register(t),e.toTextResponse(e.toErrorText(r))}return e.toTextResponse(`Flow "${t.name}" updated from ${t.sourceType} source successfully.`)}async function hu(e,t){let{registry:n,loader:r}=await e.getFlows(),i=e.createFlowTransform();try{Jn(`npm update -g @fission-ai/openspec`,{encoding:`utf-8`,stdio:`pipe`})}catch(t){return e.toTextResponse(`npm update failed: ${e.toErrorText(t)}`)}let a=e.resolveOpenSpecSource(),o=await r.load(a.path,{forceAssetSync:!0,transform:i}),s=o.success&&o.data?o.data.manifest:null,c=o.success&&o.data?o.data.format:t.format;if(s){let r=n.register({...t,version:s.version,format:c,installPath:a.path,manifest:s,updatedAt:new Date().toISOString()});if(!r.success)return e.toTextResponse(`Failed to refresh flow registry entry: ${r.error}`)}return e.toTextResponse(`Flow "${t.name}" updated via npm successfully.`)}async function gu(e,t){let{registry:n,loader:r,installer:i}=await e.getFlows(),a=e.createFlowTransform(),o=i.update(t.installPath);if(!o.success)return e.toTextResponse(`Update failed: ${o.error}`);let s=await r.load(t.installPath,{forceAssetSync:!0,transform:a}),c=s.success&&s.data?s.data.manifest:null,l=s.success&&s.data?s.data.format:t.format;if(c){let r=i.getLocalCommit(t.installPath),a=n.register({...t,version:c.version,format:l,manifest:c,updatedAt:new Date().toISOString(),...r?{commitSha:r}:{}});if(!a.success)return e.toTextResponse(`Failed to refresh flow registry entry: ${a.error}`)}let u=c?.install??t.manifest.install;if(u.length>0){let t=i.runInstallDeps(u);if(!t.success)return e.toTextResponse(`Dependency install failed: ${t.error}`)}return e.toTextResponse(`Flow "${t.name}" updated successfully.`)}async function _u(e,t){let{createFlowTransform:n,getFlows:r,log:i,resolveClaudePluginSource:a,resolveOpenSpecSource:o,toErrorText:s,toTextResponse:c}=t,{source:l,name:u,token:d}=e;try{let{registry:e,loader:t,installer:i}=await r(),s=n(),f=l===`openspec`||l.startsWith(`openspec:`),p,m=l,h;if(f){let e=o();m=e.path,p=e.sourceType}let g=f?null:a(m);g&&(m=g.path,p=g.sourceType);let _=/^https?:\/\/|^git@/.test(m),v;if(_){let e=i.clone(m,d);if(!e.success||!e.data)return c(`Failed to clone flow: ${e.error}`);v=e.data}else{let e=F(m);h=e;let t=u||Fe(e)||`custom-flow`,n=i.copyLocal(e,t);if(!n.success||!n.data)return c(`Failed to copy flow: ${n.error}`);v=n.data}let y=await t.load(v,{forceAssetSync:!0,transform:s});if(!y.success||!y.data)return i.remove(v),c(`Failed to load flow manifest: ${y.error}`);let{manifest:b,format:x}=y.data,S=u||b.name,C=p??(_?`git`:`local`);if(e.has(S))return i.remove(v),c(`Flow "${S}" is already installed. Use flow({ action: "update", name: "${S}" }) to update it, or flow({ action: "remove", name: "${S}" }) then flow({ action: "add", source: "..." }) to replace.`);if(b.install.length>0){let e=i.runInstallDeps(b.install);if(!e.success)return i.remove(v),c(`Dependency install failed: ${e.error}`)}let w=new Date().toISOString(),T=_?i.getLocalCommit(v):void 0,E=e.register({name:S,version:b.version,source:C===`local`||C===`claude-plugin`?h??l:l,sourceType:C,installPath:v,format:x,registeredAt:w,updatedAt:w,manifest:b,...T?{commitSha:T}:{}});if(!E.success)return i.remove(v),c(`Failed to register flow: ${E.error}`);let ee=b.steps.length;return c(`Flow "${S}" installed successfully (${ee} steps). Use flow({ action: "start", name: "${S}" }) to begin.`)}catch(e){return i.error(`flow action add failed`,j(e)),c(`Error: ${s(e)}`)}}async function vu(e,t){let{getFlows:n,log:r,toErrorText:i,toTextResponse:a}=t,{name:o}=e;try{let{registry:e,installer:t}=await n();if(!e.has(o))return a(`Flow "${o}" is not installed.`);let r=e.get(o);if(!r)return a(`Flow "${o}" is not installed.`);if(r.sourceType===`builtin`)return a(`Cannot remove builtin flow "${o}".`);let i=t.remove(r.installPath);if(!i.success)return a(`Failed to remove flow files: ${i.error}`);let s=e.unregister(o);return s.success?a(`Flow "${o}" removed successfully.`):a(`Failed to unregister flow: ${s.error}`)}catch(e){return r.error(`flow action remove failed`,j(e)),a(`Error: ${i(e)}`)}}async function yu(e,t){let{getFlows:n,log:r,toErrorText:i,toTextResponse:a}=t,{name:o}=e,s={createFlowTransform:t.createFlowTransform,getFlows:t.getFlows,resolveOpenSpecSource:t.resolveOpenSpecSource,toErrorText:t.toErrorText,toTextResponse:t.toTextResponse};try{let{registry:e}=await n();if(!e.has(o))return a(`Flow "${o}" is not installed.`);let t=e.get(o);return!t||t.sourceType!==`git`&&t.sourceType!==`npm-global`&&t.sourceType!==`local`&&t.sourceType!==`claude-plugin`?a(`Flow "${o}" was not installed from git, npm, or a local source — cannot update. Remove and re-add instead.`):t.sourceType===`local`||t.sourceType===`claude-plugin`?mu(s,t):t.sourceType===`npm-global`?hu(s,t):gu(s,t)}catch(e){return r.error(`flow action update failed`,j(e)),a(`Error: ${i(e)}`)}}function bu(e){return qe(`sha256`).update(e,`utf-8`).digest(`hex`).slice(0,16)}const xu=`IMPORTANT: Start/status/step only include a brief. Call flow({ action: "read" }) before executing this flow step.`,Su=1200,Cu=/artifact|output contract|gate|completion criteria|deliverable|must|do not|forbidden/i;function wu(){return{artifactsPath:null,currentStepInstruction:null,currentStepDescription:null,currentStepContent:null,currentStepBrief:null,currentStepPins:null,stepSequence:[]}}function Tu(e){if(e.length<=Su)return e;let t=e.slice(0,Su-1),n=Math.max(t.lastIndexOf(`
187
+ `),t.lastIndexOf(` `),t.lastIndexOf(` `));return`${(n>=Math.floor(t.length*.6)?t.slice(0,n):t).trimEnd()}…`}function Eu(e){if(!e?.trim())return{brief:null,pins:null};let t=/^##\s+/m.exec(e),n=(t?e.slice(0,t.index):e).trim(),r=null;if(n){let e=n.split(/\n\s*\n/).filter(e=>e.trim().length>0),t=(e[0]?.startsWith(`#`)&&e[1]?e.slice(0,2):e.slice(0,1)).join(`
188
188
 
189
- `).trim();r=t?wu(t):null}let i=Array.from(e.matchAll(/^##\s+.*$/gm)),a=[];for(let[t,n]of i.entries()){let r=n[0];if(!Su.test(r))continue;let o=n.index??0,s=i[t+1]?.index??e.length;a.push(e.slice(o,s).replace(/\s+$/,``))}return{brief:r,pins:a.length>0?a.join(`
189
+ `).trim();r=t?Tu(t):null}let i=Array.from(e.matchAll(/^##\s+.*$/gm)),a=[];for(let[t,n]of i.entries()){let r=n[0];if(!Cu.test(r))continue;let o=n.index??0,s=i[t+1]?.index??e.length;a.push(e.slice(o,s).replace(/\s+$/,``))}return{brief:r,pins:a.length>0?a.join(`
190
190
 
191
- `):null}}function Eu(e,t){return t(e)}async function Du(e){let{context:t,entry:n,state:r,activeRoot:i,primaryRoot:a,roots:o}=e,{instructionPath:s,description:c}=t.resolveCurrentStepInfo(n,r.currentStep,i),l=Eu(n,t.getStepSequence),u=await du({entry:n,stepId:r.currentStep,runDir:r.runDir,slug:r.slug,primaryRoot:a,roots:o,activeRoot:i,resolveInstructionPath:t.resolveInstructionPath,resolveEpilogueInstructionPath:t.resolveEpilogueInstructionPath}),{brief:d,pins:f}=Tu(u),p=d;if(d&&r.currentStep){let e=n.manifest.steps.find(e=>e.id===r.currentStep),a={stepId:r.currentStep,flowName:r.flow,flowSlug:r.slug,phase:`flow`,runDir:r.runDir,artifactsPath:P(r.runDir,n.manifest.artifacts_dir).replaceAll(`\\`,`/`),completedSteps:r.completedSteps??[],stepDescription:e?.description??c??void 0,agents:e?.agents??[],mode:`brief`,topic:r.topic??``,activeRoot:i};p=await t.stepPipeline.enrich(d,a,n.manifest.hooks)}return{artifactsPath:P(r.runDir,n.manifest.artifacts_dir).replaceAll(`\\`,`/`),currentStepInstruction:s,currentStepDescription:c,currentStepContent:u,currentStepBrief:p,currentStepPins:f,stepSequence:l}}function Ou(e){let{state:t,data:n,started:r,includeStatus:i,action:a,includeInstructionPath:o}=e,s={};return r&&(s.started=!0),s.flow=t.flow,t.flowOrigin&&(s.flowOrigin=t.flowOrigin),i&&(s.status=t.status),a&&(s.action=a),s.slug=t.slug,s.topic=t.topic,s.runDir=t.runDir,s.artifactsPath=n.artifactsPath,s.currentStep=t.currentStep,s.currentStepInstruction=n.currentStepInstruction,o&&(s.instructionPath=n.currentStepInstruction),s.currentStepDescription=n.currentStepDescription,s.currentStepContent=n.currentStepContent,s.currentStepContentHash=n.currentStepContent?yu(n.currentStepContent):null,s.currentStepBrief=n.currentStepBrief,s.currentStepPins=n.currentStepPins,s.fullContentHint=`Call flow({ action: 'read' }) for the complete step instructions.`,s}function ku(e){return e.sourceType===`local`?{source:`local`,sourceType:e.sourceType,format:e.format,...e.commitSha?{commitSha:e.commitSha}:{}}:{source:e.source,sourceType:e.sourceType,format:e.format,...e.commitSha?{commitSha:e.commitSha}:{}}}async function Au(e,t){let{getAllRoots:n,getFlows:r,getWorkspaceRoot:i,isValidFlowRoot:a,log:o,patchMetaRoots:s,stateDir:c,toErrorText:l,toTextResponse:u}=t,{flow:d,topic:f,roots:p,objective:m,acceptanceCriteria:h,scope:g,exclusions:_}=e;try{if(p&&p.length>0){let e=n().map(e=>e.replaceAll(`\\`,`/`)),t=p.filter(e=>!a(e));if(t.length>0)return u(`Invalid roots — not part of the workspace or a recognized sub-repository: ${t.join(`, `)}. Available roots: ${e.join(`, `)}`)}let e=n(),o=e.map(e=>e.replaceAll(`\\`,`/`)),l=i(),v=e.length>1,y=!p&&v,b=p?.[0]??l,{registry:x,stateMachine:S}=await r(b),C=x.get(d);if(!C)throw new lu(`UNKNOWN_FLOW`,`Flow "${d}" not found. Use flow({ action: "list" }) to see available flows.`);let w=S.start(C.name,C.manifest,f,ku(C),{objective:m,acceptanceCriteria:h,scope:g,exclusions:_});if(!w.success||!w.data){let e=w.error??`Unknown flow start error.`;return e.includes(`already active`)?u(`Cannot start: ${new lu(`FLOW_ALREADY_ACTIVE`,e).message}`):u(`Cannot start: ${e}`)}let T=w.data;t.eventBus&&t.eventBus.emit({type:`flow:step:eventbus`,flowName:T.flow,flowSlug:T.slug,stepId:T.currentStep??``,status:`start`,action:`started`,phase:T.phase??`flow`,completedSteps:[],totalSteps:C.manifest.steps.length,timestamp:Date.now(),eventId:`flow-start-${T.slug}-${Date.now()}`,workspaceId:T.slug,source:`flow-tools`});let E;if(t.config.layeredKnowledge){let e=br(),t=S.setOwnerCapability({ownerTokenSalt:e.salt,ownerTokenHash:e.hash,ownerTokenVersion:e.version});if(!t.success)return u(`Cannot start in layered mode: failed to persist owner capability — ${t.error??`unknown error`}`);E=e.rawToken}if(p&&p.length>1)try{s(T.slug,b,p),t.syncMetaToRoots(T.slug,b)}catch(e){return S.reset(),u(`Flow created but failed to sync to secondary roots — rolled back. Error: ${e instanceof Error?e.message:String(e)}`)}let ee=P(c,`flow-context`),te=typeof He==`function`?await He(ee).catch(()=>[]):[];for(let e of te)e!==T.slug&&typeof Ue==`function`&&await Ue(P(ee,e),{recursive:!0,force:!0}).catch(()=>{});if(typeof Be==`function`)try{await Be(P(ee,T.slug),{recursive:!0})}catch{}let D=await Du({context:t,entry:C,state:T,activeRoot:b,primaryRoot:null,roots:p??null}),ne=yr(T,C.manifest,{objective:m,acceptanceCriteria:h,scope:g,exclusions:_}),re={...Ou({state:T,data:D,started:!0}),phase:T.phase,isEpilogue:T.isEpilogue,totalSteps:D.stepSequence.length,stepSequence:D.stepSequence,artifactsDir:C.manifest.artifacts_dir,roots:p??[b.replaceAll(`\\`,`/`)],snapshot:ne,_hint:bu,...y?{multiRootWarning:`No roots specified in multi-root workspace. Flow created at workspace root. Pass roots parameter with target repo for precise placement.`,availableRoots:o}:{},...E?{_ownerToken:E}:{}};return u(JSON.stringify(re,null,2))}catch(e){return uu(e)?u(e.message):(o.error(`flow action start failed`,j(e)),u(`Error: ${l(e)}`))}}async function ju(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{targetStep:c,lifecycleOwnerToken:l,currentToken:u}=e;try{let e=await i(),{registry:r,stateMachine:o}=await n(e),d=o.getStatus();if(!d.success||!d.data)return s(`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let f=d.data,p=r.get(f.flow);if(!p)return s(`Flow "${f.flow}" not found in registry.`);if(t.config.layeredKnowledge){if(!l)return s(`lifecycleOwnerToken required in layered mode.`);let e=f,t=e.ownerTokenSalt,n=e.ownerTokenHash;if(!t||!n)return s(`Flow has no owner capability — cannot backtrack.`);if(!Sr(l,t,n))return s(`Invalid lifecycleOwnerToken — backtrack denied.`);if(u&&u!==f.currentToken)return s(`Invalid currentToken — flow state changed since last status.`)}let m=o.backtrack(c,p.manifest);if(!m.success||!m.data)return s(`Cannot backtrack: ${m.error}`);a(m.data.slug,e);let h=m.data,g=await Du({context:t,entry:p,state:h,activeRoot:e,primaryRoot:h.primaryRoot,roots:h.roots}),_={...Ou({state:h,data:g,includeStatus:!0,action:`backtrack`}),_hint:h.currentStep?bu:void 0,phase:h.phase,isEpilogue:h.isEpilogue,completedSteps:h.completedSteps,skippedSteps:h.skippedSteps,totalSteps:g.stepSequence.length};return s(JSON.stringify(_,null,2))}catch(e){return uu(e)?s(e.message):(r.error(`flow action backtrack failed`,j(e)),s(`Error: ${o(e)}`))}}async function Mu(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{currentToken:c}=e;try{let e=await i(),{stateMachine:r}=await n(e),o=r.getStatus();if(!o.success||!o.data)return s(`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let l=o.data;if(c&&c!==l.currentToken)return s(`Invalid currentToken — claim denied.`);if(!t.config.layeredKnowledge)return s(`Claim requires layeredKnowledge mode.`);let u=t.server?(await import(`./startup-maintenance-QrloHssd.js`).then(e=>e.m)).createSamplingClient(t.server):null;if(u?.available){if((await u.createMessage({prompt:`You have been asked to transfer flow ownership. Do you confirm?`,systemPrompt:`Respond with "yes" to confirm or anything else to decline.`,maxTokens:16,modelPreferences:{intelligencePriority:.2,speedPriority:.9,costPriority:.9}})).text.trim().toLowerCase()!==`yes`)return s(`Ownership transfer declined by user.`)}else return s(`Cannot verify ownership transfer — no elicitor available.`);let d=xr(l.ownerTokenVersion??1),f=r.setOwnerCapability({ownerTokenSalt:d.salt,ownerTokenHash:d.hash,ownerTokenVersion:d.version});if(!f.success)return s(`Claim failed: ${f.error}`);let p=r.getStatus();if(p.success&&p.data){let t=p.data;a(t.slug,e)}let m={success:!0,_ownerToken:d.rawToken,version:d.version,message:`Ownership transferred successfully.`};return s(JSON.stringify(m,null,2))}catch(e){return uu(e)?s(e.message):(r.error(`flow action claim failed`,j(e)),s(`Error: ${o(e)}`))}}async function Nu(e){let{getFlows:t,log:n,resolveFlowRoot:r,resolveRoots:i,toErrorText:a,toTextResponse:o}=e;try{let n=await r(),{registry:a,stateMachine:s}=await t(n),c=s.getStatus();if(!c.success||!c.data)throw new lu(`NO_ACTIVE_FLOW`,`No active flow. Use flow({ action: "start", name: "<flow>" }) to begin one, or flow({ action: "list" }) to see available flows.`);let l=c.data,u=a.get(l.flow),d=u?await Du({context:e,entry:u,state:l,activeRoot:n,primaryRoot:l.primaryRoot,roots:l.roots}):Cu(),f={...Ou({state:l,data:d,includeStatus:!0,includeInstructionPath:!0}),_hint:l.currentStep?bu:void 0,phase:l.phase,isEpilogue:l.isEpilogue,completedSteps:l.completedSteps,skippedSteps:l.skippedSteps,artifacts:l.artifacts,startedAt:l.startedAt,updatedAt:l.updatedAt,totalSteps:d.stepSequence.length,progress:u?`${l.completedSteps.length+l.skippedSteps.length}/${d.stepSequence.length}`:`unknown`,decisions:await e.loadFlowDecisions(l.slug),briefing:{workspace_core:e.skillCompiler?.readCurrentSkill()??null,active_flow:e.skillCompiler?.readFlowBriefing(l.slug)??null},skill_warnings:e.skillCompiler?.getWarnings(l.slug)??[],workspaceRoot:n.replaceAll(`\\`,`/`),primaryRoot:(l.primaryRoot??n).replaceAll(`\\`,`/`),roots:l.roots??[n.replaceAll(`\\`,`/`)],allRoots:i().normalizedAllRoots,discoveredRepos:i().discoveredRepos};return o(JSON.stringify(f,null,2))}catch(e){return uu(e)?o(e.message):(n.error(`flow action status failed`,j(e)),o(`Error: ${a(e)}`))}}async function Pu(e){let{getFlows:t,log:n,resolveFlowRoot:r,stateDir:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=e;try{let n=await r(),{stateMachine:o}=await t(n),c=o.getStatus();if(c.success&&c.data){if(e.eventBus){let t=c.data.slug,n=typeof c.data.startedAt==`number`?c.data.startedAt:Date.now();e.eventBus.emit({type:`flow:abandon`,flowName:c.data.flow,flowSlug:t,completedCount:c.data.completedSteps?.length??0,skippedCount:c.data.skippedSteps?.length??0,durationMs:Date.now()-n,timestamp:Date.now(),eventId:`flow-abandon-${t}-${Date.now()}`,workspaceId:t,source:`flow-tools`})}a(c.data.slug,n)}let l=o.reset();if(!l.success)return s(`Reset failed: ${l.error}`);if(c.success&&c.data?.slug)try{await Ue(P(i,`flow-context`,c.data.slug),{recursive:!0,force:!0})}catch{}return s(`Flow abandoned. Use flow({ action: "start", name: "<flow>" }) to begin a new flow.`)}catch(e){return n.error(`flow action reset failed`,j(e)),s(`Error: ${o(e)}`)}}async function Fu(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{action:c,targetStep:l,lifecycleOwnerToken:u,currentToken:d}=e;if(c===`backtrack`)return l?ju({targetStep:l,lifecycleOwnerToken:u,currentToken:d},t):s(`Missing required parameter: targetStep for backtrack action.`);try{let e=await i(),{registry:r,stateMachine:o}=await n(e),l=o.getStatus();if(!l.success||!l.data)throw new lu(`NO_ACTIVE_FLOW`,`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let u=r.get(l.data.flow);if(!u)throw new lu(`FLOW_NOT_FOUND`,`Flow "${l.data.flow}" not found in registry.`);let d=o.step(c,u.manifest);if(!d.success||!d.data)return s(`Cannot ${c}: ${d.error}`);a(d.data.slug,e);let f=d.data;if(t.eventBus&&(t.eventBus.emit({type:`flow:step:eventbus`,flowName:f.flow,flowSlug:f.slug,stepId:f.currentStep??f.completedSteps[f.completedSteps.length-1]??``,status:{next:`complete`,skip:`complete`,redo:`start`}[c]??`complete`,action:{next:`completed`,skip:`skipped`,redo:`redo`}[c]??`completed`,phase:f.phase??`flow`,completedSteps:[...f.completedSteps,...f.skippedSteps],totalSteps:u.manifest.steps.length,timestamp:Date.now(),eventId:`flow-step-${f.slug}-${Date.now()}`,workspaceId:f.slug,source:`flow-tools`}),f.status===`completed`)){let e=typeof f.startedAt==`number`?f.startedAt:Date.now();t.eventBus.emit({type:`flow:complete:eventbus`,flowName:f.flow,flowSlug:f.slug,outcome:`success`,stepCount:u.manifest.steps.length,completedCount:f.completedSteps.length,skippedCount:f.skippedSteps.length,durationMs:Date.now()-e,timestamp:Date.now(),eventId:`flow-complete-${f.slug}-${Date.now()}`,workspaceId:f.slug,source:`flow-tools`})}let p=[];if(f.status===`completed`){let e=P(t.stateDir,`flow-context`,f.slug);for(let t of[`decision`,`pattern`]){let n=P(e,t);try{let e=await He(n);for(let r of e){if(!r.endsWith(`.md`))continue;let e=await Ve(P(n,r),`utf-8`);e.length>100&&p.push({type:t,title:r.replace(/\.md$/,``).replace(/-/g,` `),content:e.length>500?`${e.slice(0,497)}...`:e})}}catch{}}typeof Ue==`function`&&await Ue(e,{recursive:!0,force:!0}).catch(()=>{})}let m=await Du({context:t,entry:u,state:f,activeRoot:e,primaryRoot:f.primaryRoot,roots:f.roots}),h={...Ou({state:f,data:m,includeStatus:!0,action:c}),_hint:f.currentStep?bu:void 0,phase:f.phase,isEpilogue:f.isEpilogue,completedSteps:f.completedSteps,skippedSteps:f.skippedSteps,totalSteps:m.stepSequence.length,remaining:m.stepSequence.filter(e=>!f.completedSteps.includes(e)&&!f.skippedSteps.includes(e)&&e!==f.currentStep),...p.length>0?{promotionCandidates:p}:{}};return s(JSON.stringify(h,null,2))}catch(e){return uu(e)?s(e.message):(r.error(`flow action step failed`,j(e)),s(`Error: ${o(e)}`))}}async function Iu(e){let{getFlows:t,log:n,resolveFlowRoot:r,resolveRoots:i,toErrorText:a,toTextResponse:o}=e;try{let{registry:e,stateMachine:n,installer:a}=await t(await r()),s=e.list(),c=n.getStatus(),l={flows:s.map(e=>{let t={name:e.name,version:e.version,source:e.source,sourceType:e.sourceType,format:e.format,steps:e.manifest.steps.map(e=>e.id)};if(e.sourceType===`git`&&e.commitSha){let n=a.hasUpdates(e.installPath);return{...t,commitSha:e.commitSha,updateAvailable:n.success&&n.data?n.data.hasUpdates:void 0}}return t}),activeFlow:c.success&&c.data?{flow:c.data.flow,flowOrigin:c.data.flowOrigin,status:c.data.status,currentStep:c.data.currentStep,slug:c.data.slug,topic:c.data.topic,runDir:c.data.runDir}:null,allRoots:i().normalizedAllRoots,discoveredRepos:i().discoveredRepos};return o(JSON.stringify(l,null,2))}catch(e){return n.error(`flow action list failed`,j(e)),o(`Error: ${a(e)}`)}}async function Lu(e,t){let{getFlows:n,log:r,resolveInstallPath:i,resolveInstructionPath:a,toErrorText:o,toTextResponse:s}=t,{name:c}=e;try{let{registry:e,installer:t}=await n(),r=e.get(c);if(!r)throw new lu(`UNKNOWN_FLOW`,`Flow "${c}" not found. Use flow({ action: "list" }) to see available flows.`);let o=r.commitSha??null,l;if(r.sourceType===`git`&&r.installPath){let e=t.hasUpdates(r.installPath);l=e.success&&e.data?e.data.hasUpdates:void 0}let u={name:r.name,version:r.version,description:r.manifest.description,source:r.source,sourceType:r.sourceType,format:r.format,commitSha:o,updateAvailable:l,installPath:i(r.name,r),registeredAt:r.registeredAt,updatedAt:r.updatedAt,steps:r.manifest.steps.map(e=>({id:e.id,name:e.name,instruction:a(r,e.instruction),produces:e.produces,requires:e.requires,description:e.description})),agents:r.manifest.agents,artifactsDir:r.manifest.artifacts_dir,install:r.manifest.install};return s(JSON.stringify(u,null,2))}catch(e){return uu(e)?s(e.message):(r.error(`flow action info failed`,j(e)),s(`Error: ${o(e)}`))}}async function Ru(e,t){let{getAllRoots:n,getFlows:r,log:i,toErrorText:a,toTextResponse:o}=t,{flow:s,status:c,limit:l=50}=e,u=e=>{for(let t of[`updatedAt`,`startedAt`,`createdAt`]){let n=e[t];if(typeof n==`number`&&Number.isFinite(n))return n;if(typeof n==`string`){let e=Date.parse(n);if(!Number.isNaN(e))return e}}return null};try{let e=n(),t=[];for(let n of e){let{stateMachine:e}=await r(n),i=e.listRuns({flow:s,status:c});for(let e of i)t.push({...JSON.parse(JSON.stringify(e)),root:n.replaceAll(`\\`,`/`)})}let i=new Set,a=t.filter(e=>{let t=e.id;return i.has(t)?!1:(i.add(t),!0)});if(a.length===0)return o(`No flow runs found.`);let d=a.map((e,t)=>({run:e,index:t,recency:u(e)})).sort((e,t)=>e.recency==null&&t.recency==null?e.index-t.index:e.recency==null?1:t.recency==null?-1:t.recency===e.recency?e.index-t.index:t.recency-e.recency).map(({run:e})=>e).slice(0,l);return o(JSON.stringify({total:a.length,returned:d.length,truncated:a.length>d.length,runs:d},null,2))}catch(e){return i.error(`flow action runs failed`,j(e)),o(`Error: ${a(e)}`)}}function zu(e){let t=e.content?.find(e=>e.type===`text`)?.text??``;if(!t)return null;try{let e=JSON.parse(t);if(typeof e.slug==`string`&&e.slug.length>0)return e.slug}catch{}return t.match(/[Ss]lug[:\s]*`?([^`\s,]+)`?/)?.[1]??null}function Bu(e,t,n,r){let i=n&&typeof n!=`function`?n:void 0,a=typeof n==`function`?n:r,o=cu(e,t,i,i?.curated,i?.eventBus,i?.skillCompiler),s=U(`flow`);e.registerTool(`flow`,{title:s.title,description:`Manage development flows — list available flows, start/stop runs, navigate steps, read instructions, and install/remove/update flows. Use action parameter to select operation.`,annotations:s.annotations,inputSchema:{action:I.enum([`list`,`info`,`start`,`step`,`status`,`reset`,`read`,`runs`,`add`,`remove`,`update`,`backtrack`,`claim`]).describe(`The flow operation to perform.`),name:I.string().optional().describe(`Flow name — required for info, start, remove, update. Optional override for add.`),topic:I.string().optional().describe(`Human-readable topic for the run (used by start).`),objective:I.string().optional().describe(`L1 snapshot objective — the goal of this flow run. Falls back to topic when absent.`),acceptanceCriteria:I.array(I.string()).optional().describe(`L1 snapshot acceptance criteria (used by start).`),scope:I.array(I.string()).optional().describe(`L1 snapshot scope boundaries (used by start). Falls back to roots when absent.`),exclusions:I.array(I.string()).optional().describe(`L1 snapshot exclusions — what is out of scope (used by start).`),roots:I.array(I.string()).optional().describe(`Workspace roots participating in this flow (used by start).`),advance:I.enum([`next`,`skip`,`redo`,`backtrack`]).optional().describe(`Step navigation action — required for step.`),lifecycleOwnerToken:I.string().optional().describe(`Owner capability token for layered lifecycle mutations (required in layered mode for step/backtrack/claim/reset).`),currentToken:I.string().optional().describe(`Current step execution token from status response for optimistic concurrency.`),targetStep:I.string().optional().describe(`Target step ID for backtrack action — must be a completed prior step.`),step:I.string().optional().describe(`Step id or name to read (used by read). Defaults to current step.`),source:I.string().optional().describe(`Git URL, local path, or "openspec" shorthand — required for add.`),token:I.string().optional().describe(`Auth token for private repos (used by add).`),filter_flow:I.string().optional().describe(`Filter runs by flow name (used by runs).`),filter_status:I.string().optional().describe(`Filter runs by status: active, completed, abandoned (used by runs).`),limit:I.number().int().positive().optional().describe(`Max runs to return (default 50).`)}},J(`flow`,async e=>{switch(e.action){case`list`:return Iu(o);case`info`:return e.name?Lu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`start`:{if(!e.name)return o.toTextResponse(`Missing required parameter: name (flow to start)`);let t=await Au({flow:e.name,topic:e.topic,roots:e.roots,objective:e.objective,acceptanceCriteria:e.acceptanceCriteria,scope:e.scope,exclusions:e.exclusions},o),n=zu(t);return n&&a&&a(n),t}case`step`:return e.advance?Fu({action:e.advance,targetStep:e.targetStep,lifecycleOwnerToken:e.lifecycleOwnerToken,currentToken:e.currentToken},o):o.toTextResponse(`Missing required parameter: advance (next/skip/redo/backtrack)`);case`status`:{let e=await Nu(o);return a&&a(zu(e)),e}case`reset`:{let e=await Pu(o);return a&&a(null),e}case`read`:return fu({step:e.step},o);case`runs`:return Ru({flow:e.filter_flow,status:e.filter_status,limit:e.limit},o);case`add`:return e.source?gu({source:e.source,name:e.name,token:e.token},o):o.toTextResponse(`Missing required parameter: source`);case`remove`:return e.name?_u({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`update`:return e.name?vu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`backtrack`:return e.targetStep?ju({targetStep:e.targetStep,lifecycleOwnerToken:e.lifecycleOwnerToken,currentToken:e.currentToken},o):o.toTextResponse(`Missing required parameter: targetStep for backtrack action`);case`claim`:return Mu({currentToken:e.currentToken},o);default:return o.toTextResponse(`Unknown action: ${e.action}`)}}))}const Vu=k(`tools`);function Hu(e){let t=U(`evidence_map`);e.registerTool(`evidence_map`,{title:t.title,description:`Track verified/assumed/unresolved claims for complex tasks. Gate readiness: YIELD (proceed), HOLD (unknowns), HARD_BLOCK (critical gaps). Persists across calls.`,inputSchema:{action:I.enum([`create`,`add`,`update`,`get`,`gate`,`list`,`delete`]).describe(`Operation to perform`),task_id:I.string().optional().describe(`Task identifier (required for all except list)`),tier:I.enum([`floor`,`standard`,`critical`]).optional().describe(`FORGE tier (required for create)`),claim:I.string().optional().describe(`Critical-path claim text (for add)`),status:I.enum([`V`,`A`,`U`]).optional().describe(`Evidence status: V=Verified, A=Assumed, U=Unresolved`),receipt:I.string().optional().describe(`Evidence receipt: tool→ref for V, reasoning for A, attempts for U`),id:I.number().optional().describe(`Entry ID (for update)`),critical_path:I.boolean().default(!0).describe(`Whether this claim is on the critical path`),unknown_type:I.enum([`contract`,`convention`,`freshness`,`runtime`,`data-flow`,`impact`]).optional().describe(`Typed unknown classification`),safety_gate:I.enum([`provenance`,`commitment`,`coverage`]).optional().describe(`Safety gate tag: provenance (claim→evidence), commitment (user-approved), coverage (nothing dropped)`),retry_count:I.number().default(0).describe(`Retry count for gate evaluation (0 = first attempt)`),max_retries:I.number().int().min(0).optional().describe(`Maximum retries before escalating. Default: 3`),timeout_action:I.enum([`iterate`,`retry`,`manual`,`terminate`]).optional().describe(`Action to take when gate retries are exhausted. Default: manual`),cwd:I.string().optional().describe(`Working directory for evidence map storage (default: server cwd). Use root_path from forge_ground to match.`)},annotations:t.annotations},J(`evidence_map`,async({action:e,task_id:t,tier:n,claim:r,status:i,receipt:a,id:o,critical_path:s,unknown_type:c,safety_gate:l,retry_count:u,max_retries:d,timeout_action:f,cwd:p})=>{try{switch(e){case`create`:if(!t)throw Error(`task_id required for create`);if(!n)throw Error(`tier required for create`);return Dt({action:`create`,taskId:t,tier:n},p),{content:[{type:`text`,text:`Created evidence map "${t}" (tier: ${n}).\n\n---\n_Next: Use \`evidence_map\` with action "add" to record critical-path claims._`}]};case`add`:{if(!t)throw Error(`task_id required for add`);if(!r)throw Error(`claim required for add`);if(!i)throw Error(`status required for add`);let e=Dt({action:`add`,taskId:t,claim:r,status:i,receipt:a??``,criticalPath:s,unknownType:c,safetyGate:l},p),n=e.autoCreated?[`⚠️ Evidence map "${t}" was auto-created with tier "standard". Use \`create\` action to set a specific tier.`,``,`Added entry #${e.entry?.id} to "${t}": [${i}] ${r}`]:[`Added entry #${e.entry?.id} to "${t}": [${i}] ${r}`];return e.summary&&n.push(``,e.summary),{content:[{type:`text`,text:n.join(`
191
+ `):null}}function Du(e,t){return t(e)}async function Ou(e){let{context:t,entry:n,state:r,activeRoot:i,primaryRoot:a,roots:o}=e,{instructionPath:s,description:c}=t.resolveCurrentStepInfo(n,r.currentStep,i),l=Du(n,t.getStepSequence),u=await fu({entry:n,stepId:r.currentStep,runDir:r.runDir,slug:r.slug,primaryRoot:a,roots:o,activeRoot:i,resolveInstructionPath:t.resolveInstructionPath,resolveEpilogueInstructionPath:t.resolveEpilogueInstructionPath}),{brief:d,pins:f}=Eu(u),p=d;if(d&&r.currentStep){let e=n.manifest.steps.find(e=>e.id===r.currentStep),a={stepId:r.currentStep,flowName:r.flow,flowSlug:r.slug,phase:`flow`,runDir:r.runDir,artifactsPath:P(r.runDir,n.manifest.artifacts_dir).replaceAll(`\\`,`/`),completedSteps:r.completedSteps??[],stepDescription:e?.description??c??void 0,agents:e?.agents??[],mode:`brief`,topic:r.topic??``,activeRoot:i};p=await t.stepPipeline.enrich(d,a,n.manifest.hooks)}return{artifactsPath:P(r.runDir,n.manifest.artifacts_dir).replaceAll(`\\`,`/`),currentStepInstruction:s,currentStepDescription:c,currentStepContent:u,currentStepBrief:p,currentStepPins:f,stepSequence:l}}function ku(e){let{state:t,data:n,started:r,includeStatus:i,action:a,includeInstructionPath:o}=e,s={};return r&&(s.started=!0),s.flow=t.flow,t.flowOrigin&&(s.flowOrigin=t.flowOrigin),i&&(s.status=t.status),a&&(s.action=a),s.slug=t.slug,s.topic=t.topic,s.runDir=t.runDir,s.artifactsPath=n.artifactsPath,s.currentStep=t.currentStep,s.currentStepInstruction=n.currentStepInstruction,o&&(s.instructionPath=n.currentStepInstruction),s.currentStepDescription=n.currentStepDescription,s.currentStepContent=n.currentStepContent,s.currentStepContentHash=n.currentStepContent?bu(n.currentStepContent):null,s.currentStepBrief=n.currentStepBrief,s.currentStepPins=n.currentStepPins,s.fullContentHint=`Call flow({ action: 'read' }) for the complete step instructions.`,s}function Au(e){return e.sourceType===`local`?{source:`local`,sourceType:e.sourceType,format:e.format,...e.commitSha?{commitSha:e.commitSha}:{}}:{source:e.source,sourceType:e.sourceType,format:e.format,...e.commitSha?{commitSha:e.commitSha}:{}}}async function ju(e,t){let{getAllRoots:n,getFlows:r,getWorkspaceRoot:i,isValidFlowRoot:a,log:o,patchMetaRoots:s,stateDir:c,toErrorText:l,toTextResponse:u}=t,{flow:d,topic:f,roots:p,objective:m,acceptanceCriteria:h,scope:g,exclusions:_}=e;try{if(p&&p.length>0){let e=n().map(e=>e.replaceAll(`\\`,`/`)),t=p.filter(e=>!a(e));if(t.length>0)return u(`Invalid roots — not part of the workspace or a recognized sub-repository: ${t.join(`, `)}. Available roots: ${e.join(`, `)}`)}let e=n(),o=e.map(e=>e.replaceAll(`\\`,`/`)),l=i(),v=e.length>1,y=!p&&v,b=p?.[0]??l,{registry:x,stateMachine:S}=await r(b),C=x.get(d);if(!C)throw new uu(`UNKNOWN_FLOW`,`Flow "${d}" not found. Use flow({ action: "list" }) to see available flows.`);let w=S.start(C.name,C.manifest,f,Au(C),{objective:m,acceptanceCriteria:h,scope:g,exclusions:_});if(!w.success||!w.data){let e=w.error??`Unknown flow start error.`;return e.includes(`already active`)?u(`Cannot start: ${new uu(`FLOW_ALREADY_ACTIVE`,e).message}`):u(`Cannot start: ${e}`)}let T=w.data;t.eventBus&&t.eventBus.emit({type:`flow:step:eventbus`,flowName:T.flow,flowSlug:T.slug,stepId:T.currentStep??``,status:`start`,action:`started`,phase:T.phase??`flow`,completedSteps:[],totalSteps:C.manifest.steps.length,timestamp:Date.now(),eventId:`flow-start-${T.slug}-${Date.now()}`,workspaceId:T.slug,source:`flow-tools`});let E;if(t.config.layeredKnowledge){let e=xr(),t=S.setOwnerCapability({ownerTokenSalt:e.salt,ownerTokenHash:e.hash,ownerTokenVersion:e.version});if(!t.success)return u(`Cannot start in layered mode: failed to persist owner capability — ${t.error??`unknown error`}`);E=e.rawToken}if(p&&p.length>1)try{s(T.slug,b,p),t.syncMetaToRoots(T.slug,b)}catch(e){return S.reset(),u(`Flow created but failed to sync to secondary roots — rolled back. Error: ${e instanceof Error?e.message:String(e)}`)}let ee=P(c,`flow-context`),te=typeof He==`function`?await He(ee).catch(()=>[]):[];for(let e of te)e!==T.slug&&typeof Ue==`function`&&await Ue(P(ee,e),{recursive:!0,force:!0}).catch(()=>{});if(typeof Be==`function`)try{await Be(P(ee,T.slug),{recursive:!0})}catch{}let D=await Ou({context:t,entry:C,state:T,activeRoot:b,primaryRoot:null,roots:p??null}),ne=br(T,C.manifest,{objective:m,acceptanceCriteria:h,scope:g,exclusions:_}),re={...ku({state:T,data:D,started:!0}),phase:T.phase,isEpilogue:T.isEpilogue,totalSteps:D.stepSequence.length,stepSequence:D.stepSequence,artifactsDir:C.manifest.artifacts_dir,roots:p??[b.replaceAll(`\\`,`/`)],snapshot:ne,_hint:xu,...y?{multiRootWarning:`No roots specified in multi-root workspace. Flow created at workspace root. Pass roots parameter with target repo for precise placement.`,availableRoots:o}:{},...E?{_ownerToken:E}:{}};return u(JSON.stringify(re,null,2))}catch(e){return du(e)?u(e.message):(o.error(`flow action start failed`,j(e)),u(`Error: ${l(e)}`))}}async function Mu(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{targetStep:c,lifecycleOwnerToken:l,currentToken:u}=e;try{let e=await i(),{registry:r,stateMachine:o}=await n(e),d=o.getStatus();if(!d.success||!d.data)return s(`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let f=d.data,p=r.get(f.flow);if(!p)return s(`Flow "${f.flow}" not found in registry.`);if(t.config.layeredKnowledge){if(!l)return s(`lifecycleOwnerToken required in layered mode.`);let e=f,t=e.ownerTokenSalt,n=e.ownerTokenHash;if(!t||!n)return s(`Flow has no owner capability — cannot backtrack.`);if(!Cr(l,t,n))return s(`Invalid lifecycleOwnerToken — backtrack denied.`);if(u&&u!==f.currentToken)return s(`Invalid currentToken — flow state changed since last status.`)}let m=o.backtrack(c,p.manifest);if(!m.success||!m.data)return s(`Cannot backtrack: ${m.error}`);a(m.data.slug,e);let h=m.data,g=await Ou({context:t,entry:p,state:h,activeRoot:e,primaryRoot:h.primaryRoot,roots:h.roots}),_={...ku({state:h,data:g,includeStatus:!0,action:`backtrack`}),_hint:h.currentStep?xu:void 0,phase:h.phase,isEpilogue:h.isEpilogue,completedSteps:h.completedSteps,skippedSteps:h.skippedSteps,totalSteps:g.stepSequence.length};return s(JSON.stringify(_,null,2))}catch(e){return du(e)?s(e.message):(r.error(`flow action backtrack failed`,j(e)),s(`Error: ${o(e)}`))}}async function Nu(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{currentToken:c}=e;try{let e=await i(),{stateMachine:r}=await n(e),o=r.getStatus();if(!o.success||!o.data)return s(`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let l=o.data;if(c&&c!==l.currentToken)return s(`Invalid currentToken — claim denied.`);if(!t.config.layeredKnowledge)return s(`Claim requires layeredKnowledge mode.`);let u=t.server?(await import(`./startup-maintenance-QrloHssd.js`).then(e=>e.m)).createSamplingClient(t.server):null;if(u?.available){if((await u.createMessage({prompt:`You have been asked to transfer flow ownership. Do you confirm?`,systemPrompt:`Respond with "yes" to confirm or anything else to decline.`,maxTokens:16,modelPreferences:{intelligencePriority:.2,speedPriority:.9,costPriority:.9}})).text.trim().toLowerCase()!==`yes`)return s(`Ownership transfer declined by user.`)}else return s(`Cannot verify ownership transfer — no elicitor available.`);let d=Sr(l.ownerTokenVersion??1),f=r.setOwnerCapability({ownerTokenSalt:d.salt,ownerTokenHash:d.hash,ownerTokenVersion:d.version});if(!f.success)return s(`Claim failed: ${f.error}`);let p=r.getStatus();if(p.success&&p.data){let t=p.data;a(t.slug,e)}let m={success:!0,_ownerToken:d.rawToken,version:d.version,message:`Ownership transferred successfully.`};return s(JSON.stringify(m,null,2))}catch(e){return du(e)?s(e.message):(r.error(`flow action claim failed`,j(e)),s(`Error: ${o(e)}`))}}async function Pu(e){let{getFlows:t,log:n,resolveFlowRoot:r,resolveRoots:i,toErrorText:a,toTextResponse:o}=e;try{let n=await r(),{registry:a,stateMachine:s}=await t(n),c=s.getStatus();if(!c.success||!c.data)throw new uu(`NO_ACTIVE_FLOW`,`No active flow. Use flow({ action: "start", name: "<flow>" }) to begin one, or flow({ action: "list" }) to see available flows.`);let l=c.data,u=a.get(l.flow),d=u?await Ou({context:e,entry:u,state:l,activeRoot:n,primaryRoot:l.primaryRoot,roots:l.roots}):wu(),f={...ku({state:l,data:d,includeStatus:!0,includeInstructionPath:!0}),_hint:l.currentStep?xu:void 0,phase:l.phase,isEpilogue:l.isEpilogue,completedSteps:l.completedSteps,skippedSteps:l.skippedSteps,artifacts:l.artifacts,startedAt:l.startedAt,updatedAt:l.updatedAt,totalSteps:d.stepSequence.length,progress:u?`${l.completedSteps.length+l.skippedSteps.length}/${d.stepSequence.length}`:`unknown`,decisions:await e.loadFlowDecisions(l.slug),briefing:{workspace_core:e.skillCompiler?.readCurrentSkill()??null,active_flow:e.skillCompiler?.readFlowBriefing(l.slug)??null},skill_warnings:e.skillCompiler?.getWarnings(l.slug)??[],workspaceRoot:n.replaceAll(`\\`,`/`),primaryRoot:(l.primaryRoot??n).replaceAll(`\\`,`/`),roots:l.roots??[n.replaceAll(`\\`,`/`)],allRoots:i().normalizedAllRoots,discoveredRepos:i().discoveredRepos};return o(JSON.stringify(f,null,2))}catch(e){return du(e)?o(e.message):(n.error(`flow action status failed`,j(e)),o(`Error: ${a(e)}`))}}async function Fu(e){let{getFlows:t,log:n,resolveFlowRoot:r,stateDir:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=e;try{let n=await r(),{stateMachine:o}=await t(n),c=o.getStatus();if(c.success&&c.data){if(e.eventBus){let t=c.data.slug,n=typeof c.data.startedAt==`number`?c.data.startedAt:Date.now();e.eventBus.emit({type:`flow:abandon`,flowName:c.data.flow,flowSlug:t,completedCount:c.data.completedSteps?.length??0,skippedCount:c.data.skippedSteps?.length??0,durationMs:Date.now()-n,timestamp:Date.now(),eventId:`flow-abandon-${t}-${Date.now()}`,workspaceId:t,source:`flow-tools`})}a(c.data.slug,n)}let l=o.reset();if(!l.success)return s(`Reset failed: ${l.error}`);if(c.success&&c.data?.slug)try{await Ue(P(i,`flow-context`,c.data.slug),{recursive:!0,force:!0})}catch{}return s(`Flow abandoned. Use flow({ action: "start", name: "<flow>" }) to begin a new flow.`)}catch(e){return n.error(`flow action reset failed`,j(e)),s(`Error: ${o(e)}`)}}async function Iu(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{action:c,targetStep:l,lifecycleOwnerToken:u,currentToken:d}=e;if(c===`backtrack`)return l?Mu({targetStep:l,lifecycleOwnerToken:u,currentToken:d},t):s(`Missing required parameter: targetStep for backtrack action.`);try{let e=await i(),{registry:r,stateMachine:o}=await n(e),l=o.getStatus();if(!l.success||!l.data)throw new uu(`NO_ACTIVE_FLOW`,`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let u=r.get(l.data.flow);if(!u)throw new uu(`FLOW_NOT_FOUND`,`Flow "${l.data.flow}" not found in registry.`);let d=o.step(c,u.manifest);if(!d.success||!d.data)return s(`Cannot ${c}: ${d.error}`);a(d.data.slug,e);let f=d.data;if(t.eventBus&&(t.eventBus.emit({type:`flow:step:eventbus`,flowName:f.flow,flowSlug:f.slug,stepId:f.currentStep??f.completedSteps[f.completedSteps.length-1]??``,status:{next:`complete`,skip:`complete`,redo:`start`}[c]??`complete`,action:{next:`completed`,skip:`skipped`,redo:`redo`}[c]??`completed`,phase:f.phase??`flow`,completedSteps:[...f.completedSteps,...f.skippedSteps],totalSteps:u.manifest.steps.length,timestamp:Date.now(),eventId:`flow-step-${f.slug}-${Date.now()}`,workspaceId:f.slug,source:`flow-tools`}),f.status===`completed`)){let e=typeof f.startedAt==`number`?f.startedAt:Date.now();t.eventBus.emit({type:`flow:complete:eventbus`,flowName:f.flow,flowSlug:f.slug,outcome:`success`,stepCount:u.manifest.steps.length,completedCount:f.completedSteps.length,skippedCount:f.skippedSteps.length,durationMs:Date.now()-e,timestamp:Date.now(),eventId:`flow-complete-${f.slug}-${Date.now()}`,workspaceId:f.slug,source:`flow-tools`})}let p=[];if(f.status===`completed`){let e=P(t.stateDir,`flow-context`,f.slug);for(let t of[`decision`,`pattern`]){let n=P(e,t);try{let e=await He(n);for(let r of e){if(!r.endsWith(`.md`))continue;let e=await Ve(P(n,r),`utf-8`);e.length>100&&p.push({type:t,title:r.replace(/\.md$/,``).replace(/-/g,` `),content:e.length>500?`${e.slice(0,497)}...`:e})}}catch{}}typeof Ue==`function`&&await Ue(e,{recursive:!0,force:!0}).catch(()=>{})}let m=await Ou({context:t,entry:u,state:f,activeRoot:e,primaryRoot:f.primaryRoot,roots:f.roots}),h={...ku({state:f,data:m,includeStatus:!0,action:c}),_hint:f.currentStep?xu:void 0,phase:f.phase,isEpilogue:f.isEpilogue,completedSteps:f.completedSteps,skippedSteps:f.skippedSteps,totalSteps:m.stepSequence.length,remaining:m.stepSequence.filter(e=>!f.completedSteps.includes(e)&&!f.skippedSteps.includes(e)&&e!==f.currentStep),...p.length>0?{promotionCandidates:p}:{}};return s(JSON.stringify(h,null,2))}catch(e){return du(e)?s(e.message):(r.error(`flow action step failed`,j(e)),s(`Error: ${o(e)}`))}}async function Lu(e){let{getFlows:t,log:n,resolveFlowRoot:r,resolveRoots:i,toErrorText:a,toTextResponse:o}=e;try{let{registry:e,stateMachine:n,installer:a}=await t(await r()),s=e.list(),c=n.getStatus(),l={flows:s.map(e=>{let t={name:e.name,version:e.version,source:e.source,sourceType:e.sourceType,format:e.format,steps:e.manifest.steps.map(e=>e.id)};if(e.sourceType===`git`&&e.commitSha){let n=a.hasUpdates(e.installPath);return{...t,commitSha:e.commitSha,updateAvailable:n.success&&n.data?n.data.hasUpdates:void 0}}return t}),activeFlow:c.success&&c.data?{flow:c.data.flow,flowOrigin:c.data.flowOrigin,status:c.data.status,currentStep:c.data.currentStep,slug:c.data.slug,topic:c.data.topic,runDir:c.data.runDir}:null,allRoots:i().normalizedAllRoots,discoveredRepos:i().discoveredRepos};return o(JSON.stringify(l,null,2))}catch(e){return n.error(`flow action list failed`,j(e)),o(`Error: ${a(e)}`)}}async function Ru(e,t){let{getFlows:n,log:r,resolveInstallPath:i,resolveInstructionPath:a,toErrorText:o,toTextResponse:s}=t,{name:c}=e;try{let{registry:e,installer:t}=await n(),r=e.get(c);if(!r)throw new uu(`UNKNOWN_FLOW`,`Flow "${c}" not found. Use flow({ action: "list" }) to see available flows.`);let o=r.commitSha??null,l;if(r.sourceType===`git`&&r.installPath){let e=t.hasUpdates(r.installPath);l=e.success&&e.data?e.data.hasUpdates:void 0}let u={name:r.name,version:r.version,description:r.manifest.description,source:r.source,sourceType:r.sourceType,format:r.format,commitSha:o,updateAvailable:l,installPath:i(r.name,r),registeredAt:r.registeredAt,updatedAt:r.updatedAt,steps:r.manifest.steps.map(e=>({id:e.id,name:e.name,instruction:a(r,e.instruction),produces:e.produces,requires:e.requires,description:e.description})),agents:r.manifest.agents,artifactsDir:r.manifest.artifacts_dir,install:r.manifest.install};return s(JSON.stringify(u,null,2))}catch(e){return du(e)?s(e.message):(r.error(`flow action info failed`,j(e)),s(`Error: ${o(e)}`))}}async function zu(e,t){let{getAllRoots:n,getFlows:r,log:i,toErrorText:a,toTextResponse:o}=t,{flow:s,status:c,limit:l=50}=e,u=e=>{for(let t of[`updatedAt`,`startedAt`,`createdAt`]){let n=e[t];if(typeof n==`number`&&Number.isFinite(n))return n;if(typeof n==`string`){let e=Date.parse(n);if(!Number.isNaN(e))return e}}return null};try{let e=n(),t=[];for(let n of e){let{stateMachine:e}=await r(n),i=e.listRuns({flow:s,status:c});for(let e of i)t.push({...JSON.parse(JSON.stringify(e)),root:n.replaceAll(`\\`,`/`)})}let i=new Set,a=t.filter(e=>{let t=e.id;return i.has(t)?!1:(i.add(t),!0)});if(a.length===0)return o(`No flow runs found.`);let d=a.map((e,t)=>({run:e,index:t,recency:u(e)})).sort((e,t)=>e.recency==null&&t.recency==null?e.index-t.index:e.recency==null?1:t.recency==null?-1:t.recency===e.recency?e.index-t.index:t.recency-e.recency).map(({run:e})=>e).slice(0,l);return o(JSON.stringify({total:a.length,returned:d.length,truncated:a.length>d.length,runs:d},null,2))}catch(e){return i.error(`flow action runs failed`,j(e)),o(`Error: ${a(e)}`)}}function Bu(e){let t=e.content?.find(e=>e.type===`text`)?.text??``;if(!t)return null;try{let e=JSON.parse(t);if(typeof e.slug==`string`&&e.slug.length>0)return e.slug}catch{}return t.match(/[Ss]lug[:\s]*`?([^`\s,]+)`?/)?.[1]??null}function Vu(e,t,n,r){let i=n&&typeof n!=`function`?n:void 0,a=typeof n==`function`?n:r,o=lu(e,t,i,i?.curated,i?.eventBus,i?.skillCompiler),s=U(`flow`);e.registerTool(`flow`,{title:s.title,description:`Manage development flows — list available flows, start/stop runs, navigate steps, read instructions, and install/remove/update flows. Use action parameter to select operation.`,annotations:s.annotations,inputSchema:{action:I.enum([`list`,`info`,`start`,`step`,`status`,`reset`,`read`,`runs`,`add`,`remove`,`update`,`backtrack`,`claim`]).describe(`The flow operation to perform.`),name:I.string().optional().describe(`Flow name — required for info, start, remove, update. Optional override for add.`),topic:I.string().optional().describe(`Human-readable topic for the run (used by start).`),objective:I.string().optional().describe(`L1 snapshot objective — the goal of this flow run. Falls back to topic when absent.`),acceptanceCriteria:I.array(I.string()).optional().describe(`L1 snapshot acceptance criteria (used by start).`),scope:I.array(I.string()).optional().describe(`L1 snapshot scope boundaries (used by start). Falls back to roots when absent.`),exclusions:I.array(I.string()).optional().describe(`L1 snapshot exclusions — what is out of scope (used by start).`),roots:I.array(I.string()).optional().describe(`Workspace roots participating in this flow (used by start).`),advance:I.enum([`next`,`skip`,`redo`,`backtrack`]).optional().describe(`Step navigation action — required for step.`),lifecycleOwnerToken:I.string().optional().describe(`Owner capability token for layered lifecycle mutations (required in layered mode for step/backtrack/claim/reset).`),currentToken:I.string().optional().describe(`Current step execution token from status response for optimistic concurrency.`),targetStep:I.string().optional().describe(`Target step ID for backtrack action — must be a completed prior step.`),step:I.string().optional().describe(`Step id or name to read (used by read). Defaults to current step.`),source:I.string().optional().describe(`Git URL, local path, or "openspec" shorthand — required for add.`),token:I.string().optional().describe(`Auth token for private repos (used by add).`),filter_flow:I.string().optional().describe(`Filter runs by flow name (used by runs).`),filter_status:I.string().optional().describe(`Filter runs by status: active, completed, abandoned (used by runs).`),limit:I.number().int().positive().optional().describe(`Max runs to return (default 50).`)}},J(`flow`,async e=>{switch(e.action){case`list`:return Lu(o);case`info`:return e.name?Ru({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`start`:{if(!e.name)return o.toTextResponse(`Missing required parameter: name (flow to start)`);let t=await ju({flow:e.name,topic:e.topic,roots:e.roots,objective:e.objective,acceptanceCriteria:e.acceptanceCriteria,scope:e.scope,exclusions:e.exclusions},o),n=Bu(t);return n&&a&&a(n),t}case`step`:return e.advance?Iu({action:e.advance,targetStep:e.targetStep,lifecycleOwnerToken:e.lifecycleOwnerToken,currentToken:e.currentToken},o):o.toTextResponse(`Missing required parameter: advance (next/skip/redo/backtrack)`);case`status`:{let e=await Pu(o);return a&&a(Bu(e)),e}case`reset`:{let e=await Fu(o);return a&&a(null),e}case`read`:return pu({step:e.step},o);case`runs`:return zu({flow:e.filter_flow,status:e.filter_status,limit:e.limit},o);case`add`:return e.source?_u({source:e.source,name:e.name,token:e.token},o):o.toTextResponse(`Missing required parameter: source`);case`remove`:return e.name?vu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`update`:return e.name?yu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`backtrack`:return e.targetStep?Mu({targetStep:e.targetStep,lifecycleOwnerToken:e.lifecycleOwnerToken,currentToken:e.currentToken},o):o.toTextResponse(`Missing required parameter: targetStep for backtrack action`);case`claim`:return Nu({currentToken:e.currentToken},o);default:return o.toTextResponse(`Unknown action: ${e.action}`)}}))}const Hu=k(`tools`);function Uu(e){let t=U(`evidence_map`);e.registerTool(`evidence_map`,{title:t.title,description:`Track verified/assumed/unresolved claims for complex tasks. Gate readiness: YIELD (proceed), HOLD (unknowns), HARD_BLOCK (critical gaps). Persists across calls.`,inputSchema:{action:I.enum([`create`,`add`,`update`,`get`,`gate`,`list`,`delete`]).describe(`Operation to perform`),task_id:I.string().optional().describe(`Task identifier (required for all except list)`),tier:I.enum([`floor`,`standard`,`critical`]).optional().describe(`FORGE tier (required for create)`),claim:I.string().optional().describe(`Critical-path claim text (for add)`),status:I.enum([`V`,`A`,`U`]).optional().describe(`Evidence status: V=Verified, A=Assumed, U=Unresolved`),receipt:I.string().optional().describe(`Evidence receipt: tool→ref for V, reasoning for A, attempts for U`),id:I.number().optional().describe(`Entry ID (for update)`),critical_path:I.boolean().default(!0).describe(`Whether this claim is on the critical path`),unknown_type:I.enum([`contract`,`convention`,`freshness`,`runtime`,`data-flow`,`impact`]).optional().describe(`Typed unknown classification`),safety_gate:I.enum([`provenance`,`commitment`,`coverage`]).optional().describe(`Safety gate tag: provenance (claim→evidence), commitment (user-approved), coverage (nothing dropped)`),retry_count:I.number().default(0).describe(`Retry count for gate evaluation (0 = first attempt)`),max_retries:I.number().int().min(0).optional().describe(`Maximum retries before escalating. Default: 3`),timeout_action:I.enum([`iterate`,`retry`,`manual`,`terminate`]).optional().describe(`Action to take when gate retries are exhausted. Default: manual`),cwd:I.string().optional().describe(`Working directory for evidence map storage (default: server cwd). Use root_path from forge_ground to match.`)},annotations:t.annotations},J(`evidence_map`,async({action:e,task_id:t,tier:n,claim:r,status:i,receipt:a,id:o,critical_path:s,unknown_type:c,safety_gate:l,retry_count:u,max_retries:d,timeout_action:f,cwd:p})=>{try{switch(e){case`create`:if(!t)throw Error(`task_id required for create`);if(!n)throw Error(`tier required for create`);return Dt({action:`create`,taskId:t,tier:n},p),{content:[{type:`text`,text:`Created evidence map "${t}" (tier: ${n}).\n\n---\n_Next: Use \`evidence_map\` with action "add" to record critical-path claims._`}]};case`add`:{if(!t)throw Error(`task_id required for add`);if(!r)throw Error(`claim required for add`);if(!i)throw Error(`status required for add`);let e=Dt({action:`add`,taskId:t,claim:r,status:i,receipt:a??``,criticalPath:s,unknownType:c,safetyGate:l},p),n=e.autoCreated?[`⚠️ Evidence map "${t}" was auto-created with tier "standard". Use \`create\` action to set a specific tier.`,``,`Added entry #${e.entry?.id} to "${t}": [${i}] ${r}`]:[`Added entry #${e.entry?.id} to "${t}": [${i}] ${r}`];return e.summary&&n.push(``,e.summary),{content:[{type:`text`,text:n.join(`
192
192
  `)}]}}case`update`:{if(!t)throw Error(`task_id required for update`);if(o===void 0)throw Error(`id required for update`);if(!i)throw Error(`status required for update`);let e=Dt({action:`update`,taskId:t,id:o,status:i,receipt:a??``},p),n=[`Updated entry #${o} in "${t}" → ${i}`];return e.summary&&n.push(``,e.summary),{content:[{type:`text`,text:n.join(`
193
193
  `)}]}}case`get`:{if(!t)throw Error(`task_id required for get`);let e=Dt({action:`get`,taskId:t},p);return e.state?{content:[{type:`text`,text:[`## Evidence Map: ${t} (${e.state.tier})`,``,e.formattedMap??`No entries.`,``,`_${e.state.entries.length} entries — created ${e.state.createdAt}_`].join(`
194
194
  `)}]}:{content:[{type:`text`,text:`Evidence map "${t}" not found.`}]}}case`gate`:{if(!t)throw Error(`task_id required for gate`);let e=Dt({action:`gate`,taskId:t,retryCount:u,maxRetries:d,timeoutAction:f},p);if(!e.gate)return{content:[{type:`text`,text:`Evidence map "${t}" not found.`}]};let n=e.gate,r=[`## FORGE Gate: **${n.verdict}**`,``,`**Reason:** ${n.reason}`,``,`**Stats:** ${n.stats.verified}V / ${n.stats.assumed}A / ${n.stats.unresolved}U (${n.stats.total} total)`];return n.action&&r.push(``,`**Recommended action:** ${n.action}`),n.retriesRemaining!==void 0&&r.push(`**Retries remaining:** ${n.retriesRemaining}`),n.summary&&r.push(``,`**Summary:** ${n.summary}`),n.warnings.length>0&&r.push(``,`**Warnings:**`,...n.warnings.map(e=>`- ⚠️ ${e}`)),n.unresolvedCritical.length>0&&r.push(``,`**Blocking entries:**`,...n.unresolvedCritical.map(e=>`- #${e.id}: ${e.claim} [${e.unknownType??`untyped`}]`)),n.safetyGates&&(r.push(``,`**Safety Gates:**`,`- Provenance: ${n.safetyGates.provenance}`,`- Commitment: ${n.safetyGates.commitment}`,`- Coverage: ${n.safetyGates.coverage}`),n.safetyGates.failures.length>0&&r.push(``,`**Safety failures:**`,...n.safetyGates.failures.map(e=>`- \u{1F6D1} ${e}`))),n.annotation&&r.push(``,`**Annotation:**`,n.annotation),e.formattedMap&&r.push(``,`---`,``,e.formattedMap),r.push(``,`---`,`_Next: ${n.verdict===`YIELD`?`Proceed to implementation.`:n.action===`iterate`?`Re-run the build loop, then evaluate the gate again.`:n.action===`retry`?`Re-evaluate the gate after refreshing evidence.`:n.action===`manual`?`Ask for human review before proceeding.`:`Abort the current path and terminate the task.`}_`),{content:[{type:`text`,text:r.join(`
195
195
  `)}]}}case`list`:{let e=Dt({action:`list`},p);return!e.states||e.states.length===0?{content:[{type:`text`,text:`No evidence maps found.`}]}:{content:[{type:`text`,text:e.states.map(e=>`- **${e.taskId}** (${e.tier}) — ${e.entries.length} entries — ${e.updatedAt}`).join(`
196
- `)}]}}case`delete`:if(!t)throw Error(`task_id required for delete`);return{content:[{type:`text`,text:Dt({action:`delete`,taskId:t},p).deleted?`Deleted evidence map "${t}".`:`Evidence map "${t}" not found.`}]}}}catch(e){return Vu.error(`Evidence map error`,j(e)),q(`INTERNAL`,`Evidence map error: ${e instanceof Error?e.message:String(e)}`)}}))}function Uu(e,t){let n=U(`digest`);e.registerTool(`digest`,{title:n.title,description:`Compress multiple text sources (handoffs, debates, phase summaries) into a token-budgeted digest. Jointly ranks across all sources, pins structured fields (status, files, decisions, blockers), and allocates budget by priority weight.`,outputSchema:Xs,inputSchema:{sources:I.array(I.object({id:I.string().describe(`Source identifier (e.g., "phase-2-handoff")`),text:I.string().max(5e5).describe(`Source text to compress`),weight:I.number().min(0).default(1).describe(`Priority weight (higher = more budget)`)})).min(1).max(20).describe(`Text sources to compress`),query:I.string().describe(`Focus query — what matters for the next step?`),max_chars:I.number().min(100).max(5e4).default(4e3).describe(`Target budget in characters`),pin_fields:I.array(I.string()).optional().describe(`Key fields to always extract (default: status, files, decisions, blockers, next)`),segmentation:I.enum([`paragraph`,`sentence`,`line`]).default(`paragraph`).describe(`How to split text for scoring`),token_budget:I.number().min(50).max(12500).optional().describe(`Token budget — overrides max_chars (approx 4 chars per token). Use to fit output into a specific context window.`)},annotations:n.annotations},async({sources:e,query:n,max_chars:r,pin_fields:i,segmentation:a,token_budget:o})=>{try{let s=await wt(t,{sources:e,query:n,maxChars:o?o*4:r,pinFields:i,segmentation:a}),c=[`## Digest (${s.totalOriginalChars} → ${s.totalCompressedChars} chars, ${(s.ratio*100).toFixed(0)}%)`,s.ref?`Ref: ${s.ref}`:void 0,``],l=Object.keys(s.fields);if(l.length>0){c.push(`### Extracted Fields`);for(let e of l){let t=s.fields[e];c.push(`**${e}:**`);for(let e of t)c.push(` - [${e.sourceId}] ${e.value}`)}c.push(``)}c.push(`### Compressed Content`,``,s.text),c.push(``,`### Source Stats`);for(let e of s.sourceStats)c.push(`- **${e.id}**: ${e.originalChars} → ${e.keptChars} chars (${e.segmentsKept}/${e.segmentsTotal} segments)`);c.push(``,`---`,"_Next: Use the digest as compressed context for the next phase. Use `stash` to persist it if needed._");let u=c.filter(e=>typeof e==`string`).join(`
197
- `);return{content:[{type:`text`,text:u}],structuredContent:{text:u,ref:s.ref,fields:s.fields,sourceStats:s.sourceStats,totalOriginalChars:s.totalOriginalChars,totalCompressedChars:s.totalCompressedChars,ratio:s.ratio}}}catch(e){return Vu.error(`Digest failed`,j(e)),{...q(`INTERNAL`,`Digest failed: ${e instanceof Error?e.message:String(e)}`),structuredContent:{text:``,ref:void 0,fields:{},sourceStats:[],totalOriginalChars:0,totalCompressedChars:0,ratio:0}}}})}function Wu(e,t,n){let r=U(`forge_ground`);e.registerTool(`forge_ground`,{title:r.title,description:`Execute the complete FORGE Ground phase in a single call. Chains: tier classification → scope map → typed unknown seeds → constraint loading → file summaries → evidence map creation. Replaces 5-15 manual tool calls.`,inputSchema:{task:I.string().describe(`Task description`),files:I.array(I.string()).min(1).max(100).describe(`Target files being modified (absolute paths)`),root_path:I.string().describe(`Root path of the codebase`),max_constraints:I.number().min(0).max(10).default(3).describe(`Max constraint entries to load from AI Kit memory`),force_tier:I.enum([`floor`,`standard`,`critical`]).optional().describe(`Force a specific tier (skips auto-classification)`),task_id:I.string().optional().describe(`Custom task ID for evidence map (auto-generated if omitted)`)},annotations:r.annotations},J(`forge_ground`,async({task:e,files:r,root_path:i,max_constraints:a,force_tier:o,task_id:s},c)=>{try{let l=await jt(t,n,{task:e,files:r,rootPath:i,maxConstraints:a,forceTier:o,taskId:s}),u=Ic(c).createTask(`FORGE Ground`,3);u.progress(0,`Classification: ${l.tier}`),u.progress(1,`Files analyzed: ${l.fileSummaries.length}`),u.progress(2,`Unknowns: ${l.typedUnknownSeeds.length}`),u.complete(`FORGE Ground complete: tier=${l.tier}`);let d=[`## FORGE Ground: **${l.tier.toUpperCase()}**`,`Estimated output: ~${l.estimatedTokens} tokens`,``];if(l.classifyTriggers.length>0){d.push(`### Classification Triggers`);for(let e of l.classifyTriggers)d.push(`- **${e.rule}** (${e.source}): ${e.detail}`);d.push(``)}if(l.fileSummaries.length>0){d.push(`### Target Files`);for(let e of l.fileSummaries)d.push(`- **${e.path}** (${e.lines} lines) — exports: ${e.exports.join(`, `)||`none`} — functions: ${e.functions.join(`, `)||`none`}`);d.push(``)}if(l.typedUnknownSeeds.length>0){d.push(`### Typed Unknown Seeds`);for(let e of l.typedUnknownSeeds)d.push(`- [${e.type}] ${e.description} → \`${e.suggestedTool}\``);d.push(``)}if(l.constraints.length>0){d.push(`### Constraint Seed`);for(let e of l.constraints)d.push(`- **${e.source}** (${(e.relevance*100).toFixed(0)}%): ${e.snippet}`);d.push(``)}if(l.scopeMap){d.push(`### Scope Map: ${l.scopeMap.files.length} files (~${l.scopeMap.totalEstimatedTokens} tokens)`);for(let e of l.scopeMap.files.slice(0,5))d.push(`- ${e.path} (${(e.relevance*100).toFixed(0)}%) — ${e.reason}`);l.scopeMap.files.length>5&&d.push(`- _...and ${l.scopeMap.files.length-5} more_`),d.push(``)}l.evidenceMapTaskId&&(d.push(`**Evidence Map:** \`${l.evidenceMapTaskId}\` (initialized)`),d.push(``)),d.push(`### Ceremony Guidance`);let f=l.ceremony;return d.push(`- **Ground:** ${f.ground}`,`- **Build:** ${f.build}`,`- **Break:** ${f.break}`,`- **Evidence Map:** ${f.evidenceMap}`,`- **Gate:** ${f.gate}`),d.push(``,`---`,`_Next: ${l.tier===`floor`?`Proceed to Build phase.`:"Use `evidence_map` to track claims during Build, then `evidence_map` gate after Break."}_`),{content:[{type:`text`,text:d.join(`
198
- `)}]}}catch(e){return Vu.error(`FORGE Ground failed`,j(e)),q(`INTERNAL`,`FORGE Ground failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Gu=k(`tools:git`);function Ku(e){let t=U(`git`);e.registerTool(`git`,{title:t.title,description:`Unified git operations — branch/status/commit context, diff parsing, changelog generation.`,outputSchema:qs,inputSchema:{action:I.enum([`context`,`diff_parse`,`changelog`]).describe(`Which git sub-operation to perform`),cwd:I.string().optional().describe(`Repository root or working directory`),commit_count:I.number().min(1).max(50).default(5).optional().describe(`How many recent commits to include (context only)`),include_diff:I.boolean().default(!1).optional().describe(`Include diff stat for working tree changes (context only)`),diff:I.string().max(1e6).optional().describe(`Raw unified diff text (diff_parse only)`),from:I.string().max(200).optional().describe(`Start ref (tag, SHA, HEAD~N) — required for changelog`),to:I.string().max(200).default(`HEAD`).optional().describe(`End ref (changelog only)`),format:I.enum([`grouped`,`chronological`,`per-scope`]).default(`grouped`).optional().describe(`Output format (changelog only)`),include_breaking:I.boolean().default(!0).optional().describe(`Highlight breaking changes (changelog only)`)},annotations:t.annotations},async({action:e,cwd:t,commit_count:n,include_diff:r,diff:i,from:a,to:o,format:s,include_breaking:c})=>{try{switch(e){case`context`:{let e=await It({cwd:t,commitCount:n,includeDiff:r}),i=[`Git root: ${e.gitRoot}`,`Branch: ${e.branch}`,`Staged: ${e.status.staged.length}`,...e.status.staged.map(e=>` - ${e}`),`Modified: ${e.status.modified.length}`,...e.status.modified.map(e=>` - ${e}`),`Untracked: ${e.status.untracked.length}`,...e.status.untracked.map(e=>` - ${e}`),``,`Recent commits:`];if(e.recentCommits.length===0)i.push(` none`);else for(let t of e.recentCommits)i.push(` - ${t.hash} ${t.message}`),i.push(` ${t.author} @ ${t.date}`);return e.diff&&i.push(``,`Diff stat:`,e.diff),{content:[{type:`text`,text:i.join(`
196
+ `)}]}}case`delete`:if(!t)throw Error(`task_id required for delete`);return{content:[{type:`text`,text:Dt({action:`delete`,taskId:t},p).deleted?`Deleted evidence map "${t}".`:`Evidence map "${t}" not found.`}]}}}catch(e){return Hu.error(`Evidence map error`,j(e)),q(`INTERNAL`,`Evidence map error: ${e instanceof Error?e.message:String(e)}`)}}))}function Wu(e,t){let n=U(`digest`);e.registerTool(`digest`,{title:n.title,description:`Compress multiple text sources (handoffs, debates, phase summaries) into a token-budgeted digest. Jointly ranks across all sources, pins structured fields (status, files, decisions, blockers), and allocates budget by priority weight.`,outputSchema:Zs,inputSchema:{sources:I.array(I.object({id:I.string().describe(`Source identifier (e.g., "phase-2-handoff")`),text:I.string().max(5e5).describe(`Source text to compress`),weight:I.number().min(0).default(1).describe(`Priority weight (higher = more budget)`)})).min(1).max(20).describe(`Text sources to compress`),query:I.string().describe(`Focus query — what matters for the next step?`),max_chars:I.number().min(100).max(5e4).default(4e3).describe(`Target budget in characters`),pin_fields:I.array(I.string()).optional().describe(`Key fields to always extract (default: status, files, decisions, blockers, next)`),segmentation:I.enum([`paragraph`,`sentence`,`line`]).default(`paragraph`).describe(`How to split text for scoring`),token_budget:I.number().min(50).max(12500).optional().describe(`Token budget — overrides max_chars (approx 4 chars per token). Use to fit output into a specific context window.`)},annotations:n.annotations},async({sources:e,query:n,max_chars:r,pin_fields:i,segmentation:a,token_budget:o})=>{try{let s=await wt(t,{sources:e,query:n,maxChars:o?o*4:r,pinFields:i,segmentation:a}),c=[`## Digest (${s.totalOriginalChars} → ${s.totalCompressedChars} chars, ${(s.ratio*100).toFixed(0)}%)`,s.ref?`Ref: ${s.ref}`:void 0,``],l=Object.keys(s.fields);if(l.length>0){c.push(`### Extracted Fields`);for(let e of l){let t=s.fields[e];c.push(`**${e}:**`);for(let e of t)c.push(` - [${e.sourceId}] ${e.value}`)}c.push(``)}c.push(`### Compressed Content`,``,s.text),c.push(``,`### Source Stats`);for(let e of s.sourceStats)c.push(`- **${e.id}**: ${e.originalChars} → ${e.keptChars} chars (${e.segmentsKept}/${e.segmentsTotal} segments)`);c.push(``,`---`,"_Next: Use the digest as compressed context for the next phase. Use `stash` to persist it if needed._");let u=c.filter(e=>typeof e==`string`).join(`
197
+ `);return{content:[{type:`text`,text:u}],structuredContent:{text:u,ref:s.ref,fields:s.fields,sourceStats:s.sourceStats,totalOriginalChars:s.totalOriginalChars,totalCompressedChars:s.totalCompressedChars,ratio:s.ratio}}}catch(e){return Hu.error(`Digest failed`,j(e)),{...q(`INTERNAL`,`Digest failed: ${e instanceof Error?e.message:String(e)}`),structuredContent:{text:``,ref:void 0,fields:{},sourceStats:[],totalOriginalChars:0,totalCompressedChars:0,ratio:0}}}})}function Gu(e,t,n){let r=U(`forge_ground`);e.registerTool(`forge_ground`,{title:r.title,description:`Execute the complete FORGE Ground phase in a single call. Chains: tier classification → scope map → typed unknown seeds → constraint loading → file summaries → evidence map creation. Replaces 5-15 manual tool calls.`,inputSchema:{task:I.string().describe(`Task description`),files:I.array(I.string()).min(1).max(100).describe(`Target files being modified (absolute paths)`),root_path:I.string().describe(`Root path of the codebase`),max_constraints:I.number().min(0).max(10).default(3).describe(`Max constraint entries to load from AI Kit memory`),force_tier:I.enum([`floor`,`standard`,`critical`]).optional().describe(`Force a specific tier (skips auto-classification)`),task_id:I.string().optional().describe(`Custom task ID for evidence map (auto-generated if omitted)`)},annotations:r.annotations},J(`forge_ground`,async({task:e,files:r,root_path:i,max_constraints:a,force_tier:o,task_id:s},c)=>{try{let l=await jt(t,n,{task:e,files:r,rootPath:i,maxConstraints:a,forceTier:o,taskId:s}),u=Lc(c).createTask(`FORGE Ground`,3);u.progress(0,`Classification: ${l.tier}`),u.progress(1,`Files analyzed: ${l.fileSummaries.length}`),u.progress(2,`Unknowns: ${l.typedUnknownSeeds.length}`),u.complete(`FORGE Ground complete: tier=${l.tier}`);let d=[`## FORGE Ground: **${l.tier.toUpperCase()}**`,`Estimated output: ~${l.estimatedTokens} tokens`,``];if(l.classifyTriggers.length>0){d.push(`### Classification Triggers`);for(let e of l.classifyTriggers)d.push(`- **${e.rule}** (${e.source}): ${e.detail}`);d.push(``)}if(l.fileSummaries.length>0){d.push(`### Target Files`);for(let e of l.fileSummaries)d.push(`- **${e.path}** (${e.lines} lines) — exports: ${e.exports.join(`, `)||`none`} — functions: ${e.functions.join(`, `)||`none`}`);d.push(``)}if(l.typedUnknownSeeds.length>0){d.push(`### Typed Unknown Seeds`);for(let e of l.typedUnknownSeeds)d.push(`- [${e.type}] ${e.description} → \`${e.suggestedTool}\``);d.push(``)}if(l.constraints.length>0){d.push(`### Constraint Seed`);for(let e of l.constraints)d.push(`- **${e.source}** (${(e.relevance*100).toFixed(0)}%): ${e.snippet}`);d.push(``)}if(l.scopeMap){d.push(`### Scope Map: ${l.scopeMap.files.length} files (~${l.scopeMap.totalEstimatedTokens} tokens)`);for(let e of l.scopeMap.files.slice(0,5))d.push(`- ${e.path} (${(e.relevance*100).toFixed(0)}%) — ${e.reason}`);l.scopeMap.files.length>5&&d.push(`- _...and ${l.scopeMap.files.length-5} more_`),d.push(``)}l.evidenceMapTaskId&&(d.push(`**Evidence Map:** \`${l.evidenceMapTaskId}\` (initialized)`),d.push(``)),d.push(`### Ceremony Guidance`);let f=l.ceremony;return d.push(`- **Ground:** ${f.ground}`,`- **Build:** ${f.build}`,`- **Break:** ${f.break}`,`- **Evidence Map:** ${f.evidenceMap}`,`- **Gate:** ${f.gate}`),d.push(``,`---`,`_Next: ${l.tier===`floor`?`Proceed to Build phase.`:"Use `evidence_map` to track claims during Build, then `evidence_map` gate after Break."}_`),{content:[{type:`text`,text:d.join(`
198
+ `)}]}}catch(e){return Hu.error(`FORGE Ground failed`,j(e)),q(`INTERNAL`,`FORGE Ground failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Ku=k(`tools:git`);function qu(e){let t=U(`git`);e.registerTool(`git`,{title:t.title,description:`Unified git operations — branch/status/commit context, diff parsing, changelog generation.`,outputSchema:Js,inputSchema:{action:I.enum([`context`,`diff_parse`,`changelog`]).describe(`Which git sub-operation to perform`),cwd:I.string().optional().describe(`Repository root or working directory`),commit_count:I.number().min(1).max(50).default(5).optional().describe(`How many recent commits to include (context only)`),include_diff:I.boolean().default(!1).optional().describe(`Include diff stat for working tree changes (context only)`),diff:I.string().max(1e6).optional().describe(`Raw unified diff text (diff_parse only)`),from:I.string().max(200).optional().describe(`Start ref (tag, SHA, HEAD~N) — required for changelog`),to:I.string().max(200).default(`HEAD`).optional().describe(`End ref (changelog only)`),format:I.enum([`grouped`,`chronological`,`per-scope`]).default(`grouped`).optional().describe(`Output format (changelog only)`),include_breaking:I.boolean().default(!0).optional().describe(`Highlight breaking changes (changelog only)`)},annotations:t.annotations},async({action:e,cwd:t,commit_count:n,include_diff:r,diff:i,from:a,to:o,format:s,include_breaking:c})=>{try{switch(e){case`context`:{let e=await It({cwd:t,commitCount:n,includeDiff:r}),i=[`Git root: ${e.gitRoot}`,`Branch: ${e.branch}`,`Staged: ${e.status.staged.length}`,...e.status.staged.map(e=>` - ${e}`),`Modified: ${e.status.modified.length}`,...e.status.modified.map(e=>` - ${e}`),`Untracked: ${e.status.untracked.length}`,...e.status.untracked.map(e=>` - ${e}`),``,`Recent commits:`];if(e.recentCommits.length===0)i.push(` none`);else for(let t of e.recentCommits)i.push(` - ${t.hash} ${t.message}`),i.push(` ${t.author} @ ${t.date}`);return e.diff&&i.push(``,`Diff stat:`,e.diff),{content:[{type:`text`,text:i.join(`
199
199
  `)}],structuredContent:{gitRoot:e.gitRoot,branch:e.branch,commitCount:e.recentCommits.length,hasUncommitted:e.status.staged.length>0||e.status.modified.length>0||e.status.untracked.length>0,recentCommits:e.recentCommits.map(e=>({hash:e.hash,message:e.message,author:e.author,date:e.date}))}}}case`diff_parse`:{if(!i)return q(`VALIDATION`,`diff is required for diff_parse action`);let e=Ct({diff:i.replace(/\\n/g,`
200
200
  `).replace(/\\t/g,` `)});if(e.length===0)return{content:[{type:`text`,text:`No diff files found.`}]};let t=[];for(let n of e){let e=n.oldPath?` (from ${n.oldPath})`:``;t.push(`${n.path}${e} [${n.status}] +${n.additions} -${n.deletions} (${n.hunks.length} hunks)`);for(let e of n.hunks){let n=e.header?` ${e.header}`:``;t.push(` @@ -${e.oldStart},${e.oldLines} +${e.newStart},${e.newLines} @@${n}`)}}return{content:[{type:`text`,text:t.join(`
201
- `)}]}}case`changelog`:{if(!a)return q(`VALIDATION`,`from is required for changelog action`);let e=it({from:a,to:o,format:s,includeBreaking:c,cwd:t}),n=`${e.stats.total} commits (${Object.entries(e.stats.types).map(([e,t])=>`${t} ${e}`).join(`, `)})`;return{content:[{type:`text`,text:`${e.markdown}\n---\n_${n}_`}]}}}}catch(e){return Gu.error(`Git operation failed`,j(e)),q(`INTERNAL`,`Git operation failed: ${e instanceof Error?e.message:String(e)}`)}})}const qu=k(`tools`),Ju=I.object({id:I.string().optional().describe(`Node ID (auto-generated if omitted)`),type:I.string().describe(`Node type (entity, service, api, concept, decision)`),name:I.string().describe(`Display name`),properties:I.record(I.string(),I.unknown()).optional().describe(`Arbitrary properties`),sourceRecordId:I.string().optional().describe(`Back-link to knowledge record ID`),sourcePath:I.string().optional().describe(`Source file path`)}),Yu=I.object({id:I.string().optional().describe(`Edge ID (auto-generated if omitted)`),fromId:I.string().describe(`Source node ID`),toId:I.string().describe(`Target node ID`),type:I.string().describe(`Relationship type (depends-on, implements, calls, affects)`),weight:I.number().min(0).max(1).optional().describe(`Relationship weight`),properties:I.record(I.string(),I.unknown()).optional().describe(`Arbitrary properties`)});function Xu(e,t,n){let r=U(`graph`);e.registerTool(`graph`,{title:r.title,description:`Query the auto-populated code knowledge graph (modules, symbols, imports) to answer
201
+ `)}]}}case`changelog`:{if(!a)return q(`VALIDATION`,`from is required for changelog action`);let e=it({from:a,to:o,format:s,includeBreaking:c,cwd:t}),n=`${e.stats.total} commits (${Object.entries(e.stats.types).map(([e,t])=>`${t} ${e}`).join(`, `)})`;return{content:[{type:`text`,text:`${e.markdown}\n---\n_${n}_`}]}}}}catch(e){return Ku.error(`Git operation failed`,j(e)),q(`INTERNAL`,`Git operation failed: ${e instanceof Error?e.message:String(e)}`)}})}const Ju=k(`tools`),Yu=I.object({id:I.string().optional().describe(`Node ID (auto-generated if omitted)`),type:I.string().describe(`Node type (entity, service, api, concept, decision)`),name:I.string().describe(`Display name`),properties:I.record(I.string(),I.unknown()).optional().describe(`Arbitrary properties`),sourceRecordId:I.string().optional().describe(`Back-link to knowledge record ID`),sourcePath:I.string().optional().describe(`Source file path`)}),Xu=I.object({id:I.string().optional().describe(`Edge ID (auto-generated if omitted)`),fromId:I.string().describe(`Source node ID`),toId:I.string().describe(`Target node ID`),type:I.string().describe(`Relationship type (depends-on, implements, calls, affects)`),weight:I.number().min(0).max(1).optional().describe(`Relationship weight`),properties:I.record(I.string(),I.unknown()).optional().describe(`Arbitrary properties`)});function Zu(e,t,n){let r=U(`graph`);e.registerTool(`graph`,{title:r.title,description:`Query the auto-populated code knowledge graph (modules, symbols, imports) to answer
202
202
  structural questions vector search cannot.
203
203
 
204
204
  Common flow (when you don't have a node_id yet — TWO STEPS):
@@ -217,7 +217,7 @@ Single-step read actions:
217
217
  Mutating actions (use deliberately): add, delete, clear, set_community,
218
218
  detect_communities, trace_process, delete_process.
219
219
 
220
- Complements: \`symbol\` (single lookup), \`trace\` (call-chain AST), \`blast_radius\` (change impact).`,outputSchema:Ks,inputSchema:{action:I.enum([`find_nodes`,`find_edges`,`neighbors`,`traverse`,`stats`,`validate`,`add`,`delete`,`clear`,`detect_communities`,`set_community`,`trace_process`,`list_processes`,`delete_process`,`depth_traverse`,`cohesion`,`symbol360`]).describe(`Action: find_nodes (search nodes), find_edges (search edges), neighbors (direct connections), traverse (multi-hop), stats (graph overview), validate (check graph integrity), add (insert nodes/edges), delete (remove nodes), clear (remove all), detect_communities (find clusters), set_community (label a node), trace_process (persist execution flow), list_processes (list traced flows), delete_process (remove a flow), depth_traverse (bucket traversal by depth), cohesion (score a community), symbol360 (full node context)`),node_type:I.string().optional().describe(`Node type filter (for find_nodes)`),name_pattern:I.string().optional().describe(`Name substring match (for find_nodes)`),source_path:I.string().optional().describe(`Source path filter`),node_id:I.string().optional().describe(`Node ID (for neighbors, traverse, delete)`),edge_type:I.string().optional().describe(`Edge type filter`),from_id:I.string().optional().describe(`Source node ID (for find_edges)`),to_id:I.string().optional().describe(`Target node ID (for find_edges)`),direction:I.enum([`outgoing`,`incoming`,`both`]).default(`both`).describe(`Traversal direction`),max_depth:I.number().min(1).max(5).default(2).describe(`Max traversal depth`),limit:I.number().min(1).max(100).default(50).describe(`Max results`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),nodes:I.array(Ju).max(500).optional().describe(`Nodes to add (for action=add)`),edges:I.array(Yu).max(500).optional().describe(`Edges to add (for action=add)`),community:I.string().optional().describe(`Community label (for set_community, cohesion)`),process_id:I.string().optional().describe(`Process ID (for delete_process)`),label:I.string().optional().describe(`Label for process tracing (for trace_process)`),enrich:I.boolean().default(!1).optional().describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens.`)},annotations:r.annotations},J(`graph`,async e=>{try{let r=await Rt(t,{action:e.action,nodeType:e.node_type,namePattern:e.name_pattern,sourcePath:e.source_path,nodeId:e.node_id,edgeType:e.edge_type,fromId:e.from_id,toId:e.to_id,direction:e.direction,maxDepth:e.max_depth,limit:e.limit,nodes:e.nodes,edges:e.edges,community:e.community,processId:e.process_id,label:e.label}),i=[r.summary],a=rt(r.nodes??[]);if(r.nodes&&r.nodes.length>0){i.push(`
220
+ Complements: \`symbol\` (single lookup), \`trace\` (call-chain AST), \`blast_radius\` (change impact).`,outputSchema:qs,inputSchema:{action:I.enum([`find_nodes`,`find_edges`,`neighbors`,`traverse`,`stats`,`validate`,`add`,`delete`,`clear`,`detect_communities`,`set_community`,`trace_process`,`list_processes`,`delete_process`,`depth_traverse`,`cohesion`,`symbol360`]).describe(`Action: find_nodes (search nodes), find_edges (search edges), neighbors (direct connections), traverse (multi-hop), stats (graph overview), validate (check graph integrity), add (insert nodes/edges), delete (remove nodes), clear (remove all), detect_communities (find clusters), set_community (label a node), trace_process (persist execution flow), list_processes (list traced flows), delete_process (remove a flow), depth_traverse (bucket traversal by depth), cohesion (score a community), symbol360 (full node context)`),node_type:I.string().optional().describe(`Node type filter (for find_nodes)`),name_pattern:I.string().optional().describe(`Name substring match (for find_nodes)`),source_path:I.string().optional().describe(`Source path filter`),node_id:I.string().optional().describe(`Node ID (for neighbors, traverse, delete)`),edge_type:I.string().optional().describe(`Edge type filter`),from_id:I.string().optional().describe(`Source node ID (for find_edges)`),to_id:I.string().optional().describe(`Target node ID (for find_edges)`),direction:I.enum([`outgoing`,`incoming`,`both`]).default(`both`).describe(`Traversal direction`),max_depth:I.number().min(1).max(5).default(2).describe(`Max traversal depth`),limit:I.number().min(1).max(100).default(50).describe(`Max results`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),nodes:I.array(Yu).max(500).optional().describe(`Nodes to add (for action=add)`),edges:I.array(Xu).max(500).optional().describe(`Edges to add (for action=add)`),community:I.string().optional().describe(`Community label (for set_community, cohesion)`),process_id:I.string().optional().describe(`Process ID (for delete_process)`),label:I.string().optional().describe(`Label for process tracing (for trace_process)`),enrich:I.boolean().default(!1).optional().describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens.`)},annotations:r.annotations},J(`graph`,async e=>{try{let r=await Rt(t,{action:e.action,nodeType:e.node_type,namePattern:e.name_pattern,sourcePath:e.source_path,nodeId:e.node_id,edgeType:e.edge_type,fromId:e.from_id,toId:e.to_id,direction:e.direction,maxDepth:e.max_depth,limit:e.limit,nodes:e.nodes,edges:e.edges,community:e.community,processId:e.process_id,label:e.label}),i=[r.summary],a=rt(r.nodes??[]);if(r.nodes&&r.nodes.length>0){i.push(`
221
221
  ### Nodes`);for(let e of r.nodes){let t=Object.keys(e.properties).length>0?` — ${JSON.stringify(e.properties)}`:``;i.push(`- **${e.name}** (${e.type}, id: \`${e.id}\`)${t}`)}}if(r.edges&&r.edges.length>0){i.push(`
222
222
  ### Edges`);for(let e of r.edges){let t=xn(e.fromId,a),n=xn(e.toId,a);i.push(`- \`${t}\` —[${e.type}]→ \`${n}\`${e.weight===1?``:` (weight: ${e.weight})`}`)}}if(r.stats&&(i.push(`\nNode types: ${JSON.stringify(r.stats.nodeTypes)}`),i.push(`Edge types: ${JSON.stringify(r.stats.edgeTypes)}`)),r.validation){if(i.push(`
223
223
  ### Validation`),i.push(`- **Valid**: ${r.validation.valid?`yes`:`no`}`),r.validation.danglingEdges.length>0){i.push(`- **Dangling edges**:`);for(let e of r.validation.danglingEdges)i.push(` - \`${e.edgeId}\` references missing node \`${e.missingNodeId}\``)}r.validation.orphanNodes.length>0&&i.push(`- **Orphan nodes**: ${r.validation.orphanNodes.map(e=>`\`${e}\``).join(`, `)}`)}if(r.communities){i.push(`
@@ -226,40 +226,40 @@ Complements: \`symbol\` (single lookup), \`trace\` (call-chain AST), \`blast_rad
226
226
  ### Processes`);for(let e of r.processes)i.push(`- **${e.label}** (id: \`${e.id}\`) — ${e.steps.length} step(s)`)}if(r.depthGroups){i.push(`
227
227
  ### Depth Groups`);for(let[e,t]of Object.entries(r.depthGroups))i.push(`- **Depth ${e}**: ${t.map(e=>`${e.name} (${e.type})`).join(`, `)}`)}if(r.cohesionScore!==void 0&&i.push(`\n**Cohesion Score**: ${(r.cohesionScore*100).toFixed(1)}%`),r.symbol360){let e=r.symbol360;i.push(`
228
228
  ### 360° Symbol View`),i.push(`- **Node**: ${e.node.name} (${e.node.type})`),i.push(`- **Community**: ${e.community??`none`}`),i.push(`- **Incoming**: ${e.incoming.length} edge(s)`),i.push(`- **Outgoing**: ${e.outgoing.length} edge(s)`),i.push(`- **Processes**: ${e.processes.length}`)}i.push("\n---\n_Next: Use `graph(traverse)` to explore connections, `graph(add)` to insert entities, `graph(symbol360)` for full node context, or `graph(detect_communities)` to find clusters._");let o=i.join(`
229
- `);if(e.enrich&&n){let t=await G(n,{query:`graph ${e.action} ${e.name_pattern??e.node_id??e.community??``}`.trim(),filePath:e.source_path});o+=K(t)}return{content:[{type:`text`,text:e.max_tokens?Vn(o,e.max_tokens):o}],structuredContent:{nodes:(r.nodes??[]).map(e=>({id:e.id,name:e.name,type:e.type,...e.sourcePath?{sourcePath:e.sourcePath}:{}})),edges:(r.edges??[]).map(e=>({fromId:e.fromId,toId:e.toId,fromName:xn(e.fromId,a),toName:xn(e.toId,a),type:e.type})),communities:(r.communities??[]).map(e=>({id:e.id,nodeCount:e.nodeCount,types:e.types,samples:e.samples.slice(0,3)})),totalNodes:r.stats?.nodeCount??r.nodes?.length??0,totalEdges:r.stats?.edgeCount??r.edges?.length??0,query:e.action}}}catch(e){return qu.error(`Graph query failed`,j(e)),q(`INTERNAL`,`Graph query failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Zu=k(`tools:infra`);function Qu(e){let t=U(`process`);e.registerTool(`process`,{title:t.title,description:`Start, stop, inspect, list, and tail logs for in-memory managed child processes.`,inputSchema:{action:I.enum([`start`,`stop`,`status`,`list`,`logs`]).describe(`Process action to perform`),id:I.string().optional().describe(`Managed process ID`),command:I.string().optional().describe(`Executable to start`),args:I.array(I.string()).optional().describe(`Arguments for start actions`),tail:I.number().min(1).max(500).optional().describe(`Log lines to return for logs actions`)},annotations:t.annotations},J(`process`,async({action:e,id:t,command:n,args:r,tail:i})=>{try{switch(e){case`start`:if(!t||!n)throw Error(`id and command are required for start`);return{content:[{type:`text`,text:JSON.stringify(tn(t,n,r??[]))}]};case`stop`:if(!t)throw Error(`id is required for stop`);return{content:[{type:`text`,text:JSON.stringify(rn(t)??null)}]};case`status`:if(!t)throw Error(`id is required for status`);return{content:[{type:`text`,text:JSON.stringify(nn(t)??null)}]};case`list`:return{content:[{type:`text`,text:JSON.stringify($t())}]};case`logs`:if(!t)throw Error(`id is required for logs`);return{content:[{type:`text`,text:JSON.stringify(en(t,i))}]}}}catch(e){return Zu.error(`Process action failed`,j(e)),q(`INTERNAL`,`Process action failed: ${e instanceof Error?e.message:String(e)}`)}}))}function $u(e){let t=U(`web_fetch`);e.registerTool(`web_fetch`,{title:t.title,description:`PREFERRED web fetcher — fetch one or many URLs and convert to LLM-optimized markdown. Pass one URL or multiple for parallel fetching. Supports CSS selectors, 4 output modes (markdown/raw/links/outline), smart paragraph-boundary truncation. Strips scripts/styles/nav automatically.`,inputSchema:{urls:I.array(I.string().url()).min(1).max(10).describe('URLs to fetch (1–10). Single URL: `["https://..."]`. Multiple fetched in parallel.'),mode:I.enum([`markdown`,`raw`,`links`,`outline`]).default(`markdown`).describe(`Output mode: markdown (clean content), raw (HTML), links (extracted URLs), outline (heading hierarchy)`),selector:I.string().optional().describe(`CSS selector to extract a specific element instead of auto-detecting main content`),max_length:I.number().min(500).max(1e5).default(15e3).describe(`Max characters in output — truncates at paragraph boundaries`),include_metadata:I.boolean().default(!0).describe(`Include page title, description, and URL as a header`),include_links:I.boolean().default(!1).describe(`Append extracted links list at the end`),include_images:I.boolean().default(!1).describe(`Include image alt texts inline`),timeout:I.number().min(1e3).max(12e4).default(3e4).describe(`Request timeout in milliseconds`),allow_localhost:I.boolean().default(!1).describe(`Allow requests to localhost/loopback addresses (127.0.0.1, localhost, ::1). Default false for SSRF protection. Set true for local dev servers.`)},annotations:t.annotations},J(`web_fetch`,async({urls:e,mode:t,selector:n,max_length:r,include_metadata:i,include_links:a,include_images:o,timeout:s,allow_localhost:c})=>{let l=e,u=async(e,l)=>{let u=await Wn({url:e,mode:t,selector:n,maxLength:r,includeMetadata:i,includeLinks:a,includeImages:o,timeout:s,allowLocalhost:c}),d=[l?`## ${l} ${u.title||`Web Page`}\n> Source: ${e}`:`## ${u.title||`Web Page`}`,``,u.content];return u.truncated&&d.push(``,`_Original length: ${u.originalLength.toLocaleString()} chars_`),d.join(`
230
- `)};if(l.length===1)try{return{content:[{type:`text`,text:await u(l[0])+"\n\n---\n_Next: Use `remember` to save key findings, or `web_fetch` with a `selector` to extract a specific section._"}]}}catch(e){let t=e instanceof Error?e.message:String(e);return/HTTP [45]\d{2}/.test(t)?Zu.warn(`Web fetch failed`,{error:t}):Zu.error(`Web fetch failed`,j(e)),{...q(`INTERNAL`,`Web fetch failed: ${t}`)}}let d=l.length,f=await Promise.allSettled(l.map((e,t)=>u(e,`[${t+1}/${d}]`))),p=[],m=0;for(let e=0;e<f.length;e++){let t=f[e];if(t.status===`fulfilled`)p.push(t.value);else{m++;let n=t.reason instanceof Error?t.reason.message:String(t.reason);/HTTP [45]\d{2}/.test(n)?Zu.warn(`Web fetch failed`,{url:l[e],error:n}):Zu.error(`Web fetch failed`,{url:l[e],...j(t.reason)}),p.push(`## ❌ Failed: ${l[e]}\n\n${n}`)}}let h=`_Fetched ${f.length-m}/${f.length} URLs successfully._`;p.push(``,`---`,h,"_Next: Use `remember` to save key findings, or `web_fetch` with a `selector` to extract a specific section._");let g=p.join(`
231
-
232
- `);return m===f.length?q(`INTERNAL`,g):{content:[{type:`text`,text:g}]}}))}function ed(e,t,n){if(!(!e||typeof e!=`string`)&&!(e.includes(`..`)||e.startsWith(`/`)||e.startsWith(`[`)))return{type:`resource_link`,uri:`aikit://curated/${e}`,name:t??e,mimeType:`text/markdown`,...n?{description:n}:{}}}function td(e){let t=new Set,n=[];for(let r of e){let e=ed(r.path,r.title,r.category?`[${r.category}]`:void 0);e&&!t.has(e.uri)&&(t.add(e.uri),n.push(e))}return n}function nd(e){if(e.startsWith(`.ai/curated/`))return e.slice(12)}const rd={decisions:`decision`,patterns:`pattern`,conventions:`pattern`,context:`analysis`,session:`step-summary`},id=new Set([`decision`,`pattern`,`file-card`,`analysis`,`search-result`,`step-summary`]),ad=I.enum([`remember`,`read`,`update`,`forget`,`list`,`history`,`diff`,`recover`,`orphaned`,`withdraw`,`flush`,`flagged`,`lesson`,`gap-analysis`]),od=I.enum([`create`,`confirm`,`contradict`,`list-lessons`,`auto-observe`,`prune`,`group`,`promote`,`demote`]),sd=I.enum([`confidence`,`recent`]),cd=I.string().min(3).max(120).describe(`Short descriptive title for the knowledge entry`),ld=I.string().min(10).max(1e5),ud=I.string().regex(/^[a-z][a-z0-9-]*$/).describe(`Category slug (e.g., "decisions", "patterns", "conventions", "api-contracts")`),dd=I.array(I.string()).default([]).describe(`Optional tags for filtering`),fd=I.string().describe(`Relative path within .ai/curated/ (e.g., "decisions/use-lancedb.md")`),pd=I.string().min(3),md=I.number().int().min(0).max(100).describe(`Lesson confidence from 0-100`),hd=I.object({title:cd,content:ld.describe(`The markdown content to store`),category:ud,tags:dd,force:I.boolean().optional().describe(`When true, supersede flagged similar entries without waiting for confirmation`)}),gd=I.object({path:fd}),_d=I.object({path:fd,content:ld.describe(`New markdown content to replace existing content`),reason:pd.max(1e3).describe(`Why this update is being made (recorded in changelog)`)}),vd=I.object({path:I.string().describe(`Relative path within .ai/curated/ (e.g., "decisions/deprecated-approach.md")`),reason:pd.describe(`Why this entry is being removed`)}),yd=I.object({category:I.string().optional().describe(`Filter by category (e.g., "decisions", "patterns")`),tag:I.string().optional().describe(`Filter by tag`),limit:I.number().int().min(1).max(200).default(50).describe(`Maximum entries to return`),offset:I.number().int().min(0).default(0).describe(`Pagination offset`)}),bd=I.object({title:cd,context:ld.describe(`What happened (the situation)`),insight:ld.describe(`What was learned (the lesson)`),evidence:ld.describe(`Proof or justification`),confidence:md.default(50),tags:dd.optional().default([])}),xd=I.object({path:fd.optional(),id:fd.optional(),reason:pd.max(1e3).optional()}).refine(e=>!!(e.path??e.id),{message:`path or id is required`,path:[`path`]}),Sd=I.object({topic:I.string().optional(),minConfidence:md.optional(),tag:I.string().optional(),tags:I.array(I.string()).optional(),sortBy:sd.default(`confidence`),includeArchived:I.boolean().default(!1),limit:I.number().int().min(1).max(200).default(50),offset:I.number().int().min(0).default(0)}),Cd=I.object({bufferPath:I.string().optional()}),wd=I.object({maxConfidence:md.optional(),minIdleDays:I.number().int().min(1).optional(),safetyDays:I.number().int().min(0).optional(),maxPrune:I.number().int().min(1).max(1e3).optional(),dryRun:I.boolean().default(!0)}),Td=I.object({similarityThreshold:I.number().min(0).max(1).optional(),minGroupSize:I.number().int().min(2).max(1e3).optional(),maxGroups:I.number().int().min(1).max(1e3).optional(),dryRun:I.boolean().default(!0)}),Ed=I.object({minWorkspaces:I.number().int().min(2).max(1e3).optional(),minAvgConfidence:md.optional(),similarityThreshold:I.number().min(0).max(1).optional(),dryRun:I.boolean().default(!0)}),Dd=I.object({action:ad.describe(`Knowledge operation to perform`),title:cd.optional(),content:ld.optional(),category:ud.optional(),tags:I.array(I.string()).optional().describe(`Optional tags for remember`),path:fd.optional(),reason:pd.max(1e3).optional(),scope:I.enum([`curated`,`flow`]).optional().describe(`Storage scope: curated (default) or flow-scoped ephemeral context`),profile:I.string().optional().describe(`Role profile for withdraw filtering (e.g., "implementer", "reviewer", "debugger")`),budget:I.number().int().min(100).max(5e4).optional().describe(`Maximum character budget for withdraw results (default: 6000)`),token_budget:I.number().int().min(50).max(12500).optional().describe(`Token budget (overrides budget). Approx 4 chars per token.`),tag:I.string().optional().describe(`Filter by tag when action="list"`),id:fd.optional().describe(`Alias for path when action="lesson"`),subAction:od.optional().describe(`Lesson sub-action when action="lesson"`),bufferPath:I.string().optional().describe(`Optional observation buffer path for lesson auto-observe`),context:ld.optional().describe(`What happened (the situation) for lesson creation`),insight:ld.optional().describe(`What was learned (the lesson) for lesson creation`),evidence:ld.optional().describe(`Proof or justification for lesson creation`),confidence:md.optional(),minConfidence:md.optional().describe(`Minimum confidence when listing lessons`),topic:I.string().optional().describe(`Topic filter when listing lessons`),sortBy:sd.optional().describe(`Sort lessons by confidence or recency`),includeArchived:I.boolean().optional().describe(`Include auto-archived lessons in list-lessons`),maxConfidence:md.optional().describe(`Prune lessons below this effective confidence`),minIdleDays:I.number().int().min(1).optional().describe(`Minimum idle days required before pruning a lesson`),safetyDays:I.number().int().min(0).optional().describe(`Never prune if accessed within this many days`),maxPrune:I.number().int().min(1).max(1e3).optional().describe(`Maximum number of lessons to prune in one run`),similarityThreshold:I.number().min(0).max(1).optional().describe(`Minimum Jaccard similarity required to group lesson titles`),minGroupSize:I.number().int().min(2).max(1e3).optional().describe(`Minimum number of lessons required to form a group`),maxGroups:I.number().int().min(1).max(1e3).optional().describe(`Maximum number of lesson groups to create in one run`),minWorkspaces:I.number().int().min(2).max(1e3).optional().describe(`Minimum number of distinct workspaces required before promoting a lesson`),minAvgConfidence:md.optional().describe(`Minimum average lesson confidence required before promoting a lesson`),dryRun:I.boolean().optional().describe(`Preview the operation without modifying stored lessons`),limit:I.number().int().min(1).max(200).optional().describe(`Maximum entries to return for list/history operations`),offset:I.number().int().min(0).optional().describe(`Pagination offset when action="list"`),force:I.boolean().optional().describe(`When true, supersede flagged similar entries without waiting for confirmation`),from_sha:I.string().optional().describe(`Start SHA for diff (older version). If omitted with to_sha, shows full content.`),to_sha:I.string().optional().describe(`End SHA for diff (newer version). If omitted, uses the latest two versions.`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),enrich:I.boolean().default(!1).optional().describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens.`)}),Od=k(`tools`);function kd(e,t){return[`knowledge`,e,t.path,t.id,t.title,t.topic,t.category,t.tag,t.profile].filter(e=>typeof e==`string`&&e.length>0).join(` `)}async function Ad(e,t,n){let r=e.content?.find(e=>typeof e==`object`&&!!e&&`type`in e&&e.type===`text`);if(!r)return e;let i=r.text??``;if(t.enrich&&n){let e=await G(n,{query:kd(t.action,t)});i+=K(e)}t.max_tokens&&(i=Vn(i,t.max_tokens));let a=_l(i),o=vl(i,a),s=a&&e.structuredContent&&typeof e.structuredContent==`object`?{...e.structuredContent,ref:a}:a?{ref:a}:e.structuredContent;return{...e,content:e.content.map(e=>e.type===`text`?{...e,text:o}:e),structuredContent:s}}function jd(e,t,n,r){a(e,t,n);let i=e.memoryMetaGet(t);if(!i)return;let o=O(i,{...u,...r});return o?(l(e,t,o),m(e,t,n)??e.memoryMetaGet(t)):i}function Md(e,t){return`\n\n### ${e}\n${t.map(e=>`- **${e.title}** (${e.id}) — similarity ${e.similarity.toFixed(3)}`).join(`
233
- `)}`}async function Nd(e,t,n,r){if(typeof e.list!=`function`||typeof e.read!=`function`)return[];let i=te(r),a=await e.list({category:n,limit:i.maxCompare,orderBy:`updated`,order:`desc`});return a.length===0?[]:p(t,await Promise.all(a.map(async t=>{let n=await e.read(t.path);return{id:t.path,title:n.title,content:n.content,path:t.path}})),i)}function Pd(e,t,n){return{superseded:e.filter(e=>n||e.similarity>=t).map(e=>({id:e.entryId,title:e.title,similarity:e.similarity})),supersessionCandidates:n?[]:e.filter(e=>e.similarity<t).map(e=>({id:e.entryId,title:e.title,similarity:e.similarity}))}}function Fd(e){if(!e)return`analysis`;let t=rd[e]??e;return id.has(t)?t:`analysis`}function Id(e){let t=[...new Set(e.issues.filter(e=>e.code===`invalid_type`&&/received undefined$/i.test(e.message)).map(e=>e.path.join(`.`)).filter(e=>e.length>0))];if(t.length>0)return`Missing required fields: ${t.join(`, `)}`;let n=e.issues.map(e=>`${e.path.length>0?`${e.path.join(`.`)}: `:``}${e.message}`).join(`; `);return n.length>0?`Invalid parameters: ${n}`:`Invalid parameters.`}function Ld(e,t){return e??t??``}function Rd(e){return[...new Set([...e??[],`lesson`])]}function zd(e,t,n){if(e)return e.memoryMetaCreate(t,`working`),e.memoryMetaUpdateConfidence(t,n),e.memoryMetaGet(t)}function Bd(e,t,n,r=c){if(!e)return;let i=v(r);e.memoryMetaCreate(t,`working`),e.memoryMetaTouch(t);let a=n??e.memoryMetaGet(t)?.confidence??50,o=Math.min(100,a+i.implicitUseIncrement);return e.memoryMetaUpdateConfidence(t,o),e.memoryMetaGet(t)}function Vd(e){let t=e.matchAll(/(?:\.ai\/curated\/)?(lessons\/[A-Za-z0-9._/%-]+\.md)/g);return[...new Set(Array.from(t,e=>e[1]))]}async function Hd(e,t,n){let r=await e.read(n),i=s(r.content),a=t?.memoryMetaGet(n)?.confidence??i.confidence??50;return{entry:r,confidence:a,meta:zd(t,n,a)??t?.memoryMetaGet(n)}}function Ud(e){if(typeof e!=`object`||!e)return e;let t=e;if(t.title)return e;let n=typeof t.topic==`string`&&t.topic||typeof t.insight==`string`&&t.insight||``;if(!n)return e;let r=n.length<=120?n:`${n.slice(0,117)}...`;return{...t,title:r}}async function Wd(e){if(e){let t=F(e);try{return await We(t),t}catch{return}}let t=(await He(Xn(),{withFileTypes:!0})).filter(e=>e.isFile()&&e.name.startsWith(`aikit-obs-`)&&e.name.endsWith(`.jsonl`)).map(e=>P(Xn(),e.name)),n=await Promise.all(t.map(async e=>{try{return{path:e,mtimeMs:(await We(e)).mtimeMs}}catch{return{path:e,mtimeMs:0}}}));return n.sort((e,t)=>t.mtimeMs-e.mtimeMs),n[0]?.path}function Gd(e,t){return t.map(t=>({path:t.path,title:t.title,similarity:D(e,t.title)})).filter(e=>e.similarity>.8).sort((e,t)=>t.similarity-e.similarity)[0]}function Kd(e){let t=[`Lesson prune ${e.dryRun?`preview`:`completed`}: ${e.pruned.length} lessons selected.`,`Skipped ${e.skipped} lessons.`];return e.pruned.length>0&&(t.push(``,`Pruned:`),t.push(...e.pruned.map(e=>`- ${e}`))),t.join(`
234
- `)}function qd(e){let t=[`Lesson grouping ${e.dryRun?`preview`:`completed`}: ${e.groupsCreated} groups, ${e.lessonsGrouped} lessons.`];return e.groups.length>0&&(t.push(``,`Groups:`),t.push(...e.groups.map(e=>`- ${e.label}: ${e.members.join(`, `)}`))),t.join(`
235
- `)}function Jd(t,n){let r=t;return new e(n,r.store,r.embedder)}function Yd(e,t){let n=e.candidates.filter(e=>e.action===`promote`),r=e.candidates.filter(e=>e.action===`skip`),i=[`Lesson promotion ${t?`preview`:`completed`}: ${n.length} candidates ready.`,`Skipped ${r.length} candidates.`];return n.length>0&&(i.push(``,`Candidates:`),i.push(...n.map(e=>`- ${e.insight} (${e.foundIn.join(`, `)}) avg ${e.avgConfidence}/100`))),r.length>0&&(i.push(``,`Skipped:`),i.push(...r.map(e=>`- ${e.insight}: ${e.reason}`))),e.promoted.length>0&&(i.push(``,`Promoted:`),i.push(...e.promoted.map(e=>`- ${e}`))),i.join(`
236
- `)}async function Xd(e,n){let r=e;if(r.scope===`flow`&&n.flowContextAdapter){let{title:e,content:t,category:i}=r,a=(e??`untitled`).toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``),o=Fd(i),s=o?`${o}/${a}.md`:`${a}.md`,c=`# ${e}\n\n${t??``}`;return await n.flowContextAdapter.write(s,c),{content:[{type:`text`,text:`Deposited flow context at \`${s}\``}]}}let{curated:i,policyStore:a,evolutionCollector:o,resourceNotifier:s,stateStore:c,supersessionConfig:l}=n,{title:u,content:d,category:f,tags:p,force:m=!1}=hd.parse(e),h=te(l),g=await Nd(i,d,f,h),_=await i.remember(u,d,f,p);c?.memoryMetaCreate(_.path,`working`);let v=Pd(g,h.autoThreshold,m);if(c)for(let e of v.superseded)t(c,e.id,_.path);let y=``;if(a){let e=a.classify(u,d,p);o&&o.recordClassification(u,e.matchingRules.map(e=>e.ruleId),e.pushRecommended),e.matchingRules.length>0&&(y=`\n\n### Classification Signals\n${e.matchingRules.map(e=>` - **${e.ruleId}** (${e.category}, weight: ${e.pushWeight}) — matched: ${e.matchedPatterns.join(`, `)}`).join(`
229
+ `);if(e.enrich&&n){let t=await G(n,{query:`graph ${e.action} ${e.name_pattern??e.node_id??e.community??``}`.trim(),filePath:e.source_path});o+=K(t)}return{content:[{type:`text`,text:e.max_tokens?Vn(o,e.max_tokens):o}],structuredContent:{nodes:(r.nodes??[]).map(e=>({id:e.id,name:e.name,type:e.type,...e.sourcePath?{sourcePath:e.sourcePath}:{}})),edges:(r.edges??[]).map(e=>({fromId:e.fromId,toId:e.toId,fromName:xn(e.fromId,a),toName:xn(e.toId,a),type:e.type})),communities:(r.communities??[]).map(e=>({id:e.id,nodeCount:e.nodeCount,types:e.types,samples:e.samples.slice(0,3)})),totalNodes:r.stats?.nodeCount??r.nodes?.length??0,totalEdges:r.stats?.edgeCount??r.edges?.length??0,query:e.action}}}catch(e){return Ju.error(`Graph query failed`,j(e)),q(`INTERNAL`,`Graph query failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Qu=k(`tools:infra`);function $u(e){let t=U(`process`);e.registerTool(`process`,{title:t.title,description:`Start, stop, inspect, list, and tail logs for in-memory managed child processes.`,inputSchema:{action:I.enum([`start`,`stop`,`status`,`list`,`logs`]).describe(`Process action to perform`),id:I.string().optional().describe(`Managed process ID`),command:I.string().optional().describe(`Executable to start`),args:I.array(I.string()).optional().describe(`Arguments for start actions`),tail:I.number().min(1).max(500).optional().describe(`Log lines to return for logs actions`)},annotations:t.annotations},J(`process`,async({action:e,id:t,command:n,args:r,tail:i})=>{try{switch(e){case`start`:if(!t||!n)throw Error(`id and command are required for start`);return{content:[{type:`text`,text:JSON.stringify(tn(t,n,r??[]))}]};case`stop`:if(!t)throw Error(`id is required for stop`);return{content:[{type:`text`,text:JSON.stringify(rn(t)??null)}]};case`status`:if(!t)throw Error(`id is required for status`);return{content:[{type:`text`,text:JSON.stringify(nn(t)??null)}]};case`list`:return{content:[{type:`text`,text:JSON.stringify($t())}]};case`logs`:if(!t)throw Error(`id is required for logs`);return{content:[{type:`text`,text:JSON.stringify(en(t,i))}]}}}catch(e){return Qu.error(`Process action failed`,j(e)),q(`INTERNAL`,`Process action failed: ${e instanceof Error?e.message:String(e)}`)}}))}function ed(e){let t=U(`web_fetch`);e.registerTool(`web_fetch`,{title:t.title,description:`PREFERRED web fetcher — fetch one or many URLs and convert to LLM-optimized markdown. Pass one URL or multiple for parallel fetching. Supports CSS selectors, 4 output modes (markdown/raw/links/outline), smart paragraph-boundary truncation. Strips scripts/styles/nav automatically.`,inputSchema:{urls:I.array(I.string().url()).min(1).max(10).describe('URLs to fetch (1–10). Single URL: `["https://..."]`. Multiple fetched in parallel.'),mode:I.enum([`markdown`,`raw`,`links`,`outline`]).default(`markdown`).describe(`Output mode: markdown (clean content), raw (HTML), links (extracted URLs), outline (heading hierarchy)`),selector:I.string().optional().describe(`CSS selector to extract a specific element instead of auto-detecting main content`),max_length:I.number().min(500).max(1e5).default(15e3).describe(`Max characters in output — truncates at paragraph boundaries`),include_metadata:I.boolean().default(!0).describe(`Include page title, description, and URL as a header`),include_links:I.boolean().default(!1).describe(`Append extracted links list at the end`),include_images:I.boolean().default(!1).describe(`Include image alt texts inline`),timeout:I.number().min(1e3).max(12e4).default(3e4).describe(`Request timeout in milliseconds`),allow_localhost:I.boolean().default(!1).describe(`Allow requests to localhost/loopback addresses (127.0.0.1, localhost, ::1). Default false for SSRF protection. Set true for local dev servers.`)},annotations:t.annotations},J(`web_fetch`,async({urls:e,mode:t,selector:n,max_length:r,include_metadata:i,include_links:a,include_images:o,timeout:s,allow_localhost:c})=>{let l=e,u=async(e,l)=>{let u=await Wn({url:e,mode:t,selector:n,maxLength:r,includeMetadata:i,includeLinks:a,includeImages:o,timeout:s,allowLocalhost:c}),d=[l?`## ${l} ${u.title||`Web Page`}\n> Source: ${e}`:`## ${u.title||`Web Page`}`,``,u.content];return u.truncated&&d.push(``,`_Original length: ${u.originalLength.toLocaleString()} chars_`),d.join(`
230
+ `)};if(l.length===1)try{return{content:[{type:`text`,text:await u(l[0])+"\n\n---\n_Next: Use `remember` to save key findings, or `web_fetch` with a `selector` to extract a specific section._"}]}}catch(e){let t=e instanceof Error?e.message:String(e);return/HTTP [45]\d{2}/.test(t)?Qu.warn(`Web fetch failed`,{error:t}):Qu.error(`Web fetch failed`,j(e)),{...q(`INTERNAL`,`Web fetch failed: ${t}`)}}let d=l.length,f=await Promise.allSettled(l.map((e,t)=>u(e,`[${t+1}/${d}]`))),p=[],m=0;for(let e=0;e<f.length;e++){let t=f[e];if(t.status===`fulfilled`)p.push(t.value);else{m++;let n=t.reason instanceof Error?t.reason.message:String(t.reason);/HTTP [45]\d{2}/.test(n)?Qu.warn(`Web fetch failed`,{url:l[e],error:n}):Qu.error(`Web fetch failed`,{url:l[e],...j(t.reason)}),p.push(`## ❌ Failed: ${l[e]}\n\n${n}`)}}let h=`_Fetched ${f.length-m}/${f.length} URLs successfully._`;p.push(``,`---`,h,"_Next: Use `remember` to save key findings, or `web_fetch` with a `selector` to extract a specific section._");let g=p.join(`
231
+
232
+ `);return m===f.length?q(`INTERNAL`,g):{content:[{type:`text`,text:g}]}}))}function td(e,t,n){if(!(!e||typeof e!=`string`)&&!(e.includes(`..`)||e.startsWith(`/`)||e.startsWith(`[`)))return{type:`resource_link`,uri:`aikit://curated/${e}`,name:t??e,mimeType:`text/markdown`,...n?{description:n}:{}}}function nd(e){let t=new Set,n=[];for(let r of e){let e=td(r.path,r.title,r.category?`[${r.category}]`:void 0);e&&!t.has(e.uri)&&(t.add(e.uri),n.push(e))}return n}function rd(e){if(e.startsWith(`.ai/curated/`))return e.slice(12)}const id={decisions:`decision`,patterns:`pattern`,conventions:`pattern`,context:`analysis`,session:`step-summary`},ad=new Set([`decision`,`pattern`,`file-card`,`analysis`,`search-result`,`step-summary`]),od=I.enum([`remember`,`read`,`update`,`forget`,`list`,`history`,`diff`,`recover`,`orphaned`,`withdraw`,`flush`,`flagged`,`lesson`,`gap-analysis`]),sd=I.enum([`create`,`confirm`,`contradict`,`list-lessons`,`auto-observe`,`prune`,`group`,`promote`,`demote`]),cd=I.enum([`confidence`,`recent`]),ld=I.string().min(3).max(120).describe(`Short descriptive title for the knowledge entry`),ud=I.string().min(10).max(1e5),dd=I.string().regex(/^[a-z][a-z0-9-]*$/).describe(`Category slug (e.g., "decisions", "patterns", "conventions", "api-contracts")`),fd=I.array(I.string()).default([]).describe(`Optional tags for filtering`),pd=I.string().describe(`Relative path within .ai/curated/ (e.g., "decisions/use-lancedb.md")`),md=I.string().min(3),hd=I.number().int().min(0).max(100).describe(`Lesson confidence from 0-100`),gd=I.object({title:ld,content:ud.describe(`The markdown content to store`),category:dd,tags:fd,force:I.boolean().optional().describe(`When true, supersede flagged similar entries without waiting for confirmation`)}),_d=I.object({path:pd}),vd=I.object({path:pd,content:ud.describe(`New markdown content to replace existing content`),reason:md.max(1e3).describe(`Why this update is being made (recorded in changelog)`)}),yd=I.object({path:I.string().describe(`Relative path within .ai/curated/ (e.g., "decisions/deprecated-approach.md")`),reason:md.describe(`Why this entry is being removed`)}),bd=I.object({category:I.string().optional().describe(`Filter by category (e.g., "decisions", "patterns")`),tag:I.string().optional().describe(`Filter by tag`),limit:I.number().int().min(1).max(200).default(50).describe(`Maximum entries to return`),offset:I.number().int().min(0).default(0).describe(`Pagination offset`)}),xd=I.object({title:ld,context:ud.describe(`What happened (the situation)`),insight:ud.describe(`What was learned (the lesson)`),evidence:ud.describe(`Proof or justification`),confidence:hd.default(50),tags:fd.optional().default([])}),Sd=I.object({path:pd.optional(),id:pd.optional(),reason:md.max(1e3).optional()}).refine(e=>!!(e.path??e.id),{message:`path or id is required`,path:[`path`]}),Cd=I.object({topic:I.string().optional(),minConfidence:hd.optional(),tag:I.string().optional(),tags:I.array(I.string()).optional(),sortBy:cd.default(`confidence`),includeArchived:I.boolean().default(!1),limit:I.number().int().min(1).max(200).default(50),offset:I.number().int().min(0).default(0)}),wd=I.object({bufferPath:I.string().optional()}),Td=I.object({maxConfidence:hd.optional(),minIdleDays:I.number().int().min(1).optional(),safetyDays:I.number().int().min(0).optional(),maxPrune:I.number().int().min(1).max(1e3).optional(),dryRun:I.boolean().default(!0)}),Ed=I.object({similarityThreshold:I.number().min(0).max(1).optional(),minGroupSize:I.number().int().min(2).max(1e3).optional(),maxGroups:I.number().int().min(1).max(1e3).optional(),dryRun:I.boolean().default(!0)}),Dd=I.object({minWorkspaces:I.number().int().min(2).max(1e3).optional(),minAvgConfidence:hd.optional(),similarityThreshold:I.number().min(0).max(1).optional(),dryRun:I.boolean().default(!0)}),Od=I.object({action:od.describe(`Knowledge operation to perform`),title:ld.optional(),content:ud.optional(),category:dd.optional(),tags:I.array(I.string()).optional().describe(`Optional tags for remember`),path:pd.optional(),reason:md.max(1e3).optional(),scope:I.enum([`curated`,`flow`]).optional().describe(`Storage scope: curated (default) or flow-scoped ephemeral context`),profile:I.string().optional().describe(`Role profile for withdraw filtering (e.g., "implementer", "reviewer", "debugger")`),budget:I.number().int().min(100).max(5e4).optional().describe(`Maximum character budget for withdraw results (default: 6000)`),token_budget:I.number().int().min(50).max(12500).optional().describe(`Token budget (overrides budget). Approx 4 chars per token.`),tag:I.string().optional().describe(`Filter by tag when action="list"`),id:pd.optional().describe(`Alias for path when action="lesson"`),subAction:sd.optional().describe(`Lesson sub-action when action="lesson"`),bufferPath:I.string().optional().describe(`Optional observation buffer path for lesson auto-observe`),context:ud.optional().describe(`What happened (the situation) for lesson creation`),insight:ud.optional().describe(`What was learned (the lesson) for lesson creation`),evidence:ud.optional().describe(`Proof or justification for lesson creation`),confidence:hd.optional(),minConfidence:hd.optional().describe(`Minimum confidence when listing lessons`),topic:I.string().optional().describe(`Topic filter when listing lessons`),sortBy:cd.optional().describe(`Sort lessons by confidence or recency`),includeArchived:I.boolean().optional().describe(`Include auto-archived lessons in list-lessons`),maxConfidence:hd.optional().describe(`Prune lessons below this effective confidence`),minIdleDays:I.number().int().min(1).optional().describe(`Minimum idle days required before pruning a lesson`),safetyDays:I.number().int().min(0).optional().describe(`Never prune if accessed within this many days`),maxPrune:I.number().int().min(1).max(1e3).optional().describe(`Maximum number of lessons to prune in one run`),similarityThreshold:I.number().min(0).max(1).optional().describe(`Minimum Jaccard similarity required to group lesson titles`),minGroupSize:I.number().int().min(2).max(1e3).optional().describe(`Minimum number of lessons required to form a group`),maxGroups:I.number().int().min(1).max(1e3).optional().describe(`Maximum number of lesson groups to create in one run`),minWorkspaces:I.number().int().min(2).max(1e3).optional().describe(`Minimum number of distinct workspaces required before promoting a lesson`),minAvgConfidence:hd.optional().describe(`Minimum average lesson confidence required before promoting a lesson`),dryRun:I.boolean().optional().describe(`Preview the operation without modifying stored lessons`),limit:I.number().int().min(1).max(200).optional().describe(`Maximum entries to return for list/history operations`),offset:I.number().int().min(0).optional().describe(`Pagination offset when action="list"`),force:I.boolean().optional().describe(`When true, supersede flagged similar entries without waiting for confirmation`),from_sha:I.string().optional().describe(`Start SHA for diff (older version). If omitted with to_sha, shows full content.`),to_sha:I.string().optional().describe(`End SHA for diff (newer version). If omitted, uses the latest two versions.`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),enrich:I.boolean().default(!1).optional().describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens.`)}),kd=k(`tools`);function Ad(e,t){return[`knowledge`,e,t.path,t.id,t.title,t.topic,t.category,t.tag,t.profile].filter(e=>typeof e==`string`&&e.length>0).join(` `)}async function jd(e,t,n){let r=e.content?.find(e=>typeof e==`object`&&!!e&&`type`in e&&e.type===`text`);if(!r)return e;let i=r.text??``;if(t.enrich&&n){let e=await G(n,{query:Ad(t.action,t)});i+=K(e)}t.max_tokens&&(i=Vn(i,t.max_tokens));let a=vl(i),o=yl(i,a),s=a&&e.structuredContent&&typeof e.structuredContent==`object`?{...e.structuredContent,ref:a}:a?{ref:a}:e.structuredContent;return{...e,content:e.content.map(e=>e.type===`text`?{...e,text:o}:e),structuredContent:s}}function Md(e,t,n,r){a(e,t,n);let i=e.memoryMetaGet(t);if(!i)return;let o=O(i,{...u,...r});return o?(l(e,t,o),m(e,t,n)??e.memoryMetaGet(t)):i}function Nd(e,t){return`\n\n### ${e}\n${t.map(e=>`- **${e.title}** (${e.id}) — similarity ${e.similarity.toFixed(3)}`).join(`
233
+ `)}`}async function Pd(e,t,n,r){if(typeof e.list!=`function`||typeof e.read!=`function`)return[];let i=te(r),a=await e.list({category:n,limit:i.maxCompare,orderBy:`updated`,order:`desc`});return a.length===0?[]:p(t,await Promise.all(a.map(async t=>{let n=await e.read(t.path);return{id:t.path,title:n.title,content:n.content,path:t.path}})),i)}function Fd(e,t,n){return{superseded:e.filter(e=>n||e.similarity>=t).map(e=>({id:e.entryId,title:e.title,similarity:e.similarity})),supersessionCandidates:n?[]:e.filter(e=>e.similarity<t).map(e=>({id:e.entryId,title:e.title,similarity:e.similarity}))}}function Id(e){if(!e)return`analysis`;let t=id[e]??e;return ad.has(t)?t:`analysis`}function Ld(e){let t=[...new Set(e.issues.filter(e=>e.code===`invalid_type`&&/received undefined$/i.test(e.message)).map(e=>e.path.join(`.`)).filter(e=>e.length>0))];if(t.length>0)return`Missing required fields: ${t.join(`, `)}`;let n=e.issues.map(e=>`${e.path.length>0?`${e.path.join(`.`)}: `:``}${e.message}`).join(`; `);return n.length>0?`Invalid parameters: ${n}`:`Invalid parameters.`}function Rd(e,t){return e??t??``}function zd(e){return[...new Set([...e??[],`lesson`])]}function Bd(e,t,n){if(e)return e.memoryMetaCreate(t,`working`),e.memoryMetaUpdateConfidence(t,n),e.memoryMetaGet(t)}function Vd(e,t,n,r=c){if(!e)return;let i=v(r);e.memoryMetaCreate(t,`working`),e.memoryMetaTouch(t);let a=n??e.memoryMetaGet(t)?.confidence??50,o=Math.min(100,a+i.implicitUseIncrement);return e.memoryMetaUpdateConfidence(t,o),e.memoryMetaGet(t)}function Hd(e){let t=e.matchAll(/(?:\.ai\/curated\/)?(lessons\/[A-Za-z0-9._/%-]+\.md)/g);return[...new Set(Array.from(t,e=>e[1]))]}async function Ud(e,t,n){let r=await e.read(n),i=s(r.content),a=t?.memoryMetaGet(n)?.confidence??i.confidence??50;return{entry:r,confidence:a,meta:Bd(t,n,a)??t?.memoryMetaGet(n)}}function Wd(e){if(typeof e!=`object`||!e)return e;let t=e;if(t.title)return e;let n=typeof t.topic==`string`&&t.topic||typeof t.insight==`string`&&t.insight||``;if(!n)return e;let r=n.length<=120?n:`${n.slice(0,117)}...`;return{...t,title:r}}async function Gd(e){if(e){let t=F(e);try{return await We(t),t}catch{return}}let t=(await He(Zn(),{withFileTypes:!0})).filter(e=>e.isFile()&&e.name.startsWith(`aikit-obs-`)&&e.name.endsWith(`.jsonl`)).map(e=>P(Zn(),e.name)),n=await Promise.all(t.map(async e=>{try{return{path:e,mtimeMs:(await We(e)).mtimeMs}}catch{return{path:e,mtimeMs:0}}}));return n.sort((e,t)=>t.mtimeMs-e.mtimeMs),n[0]?.path}function Kd(e,t){return t.map(t=>({path:t.path,title:t.title,similarity:D(e,t.title)})).filter(e=>e.similarity>.8).sort((e,t)=>t.similarity-e.similarity)[0]}function qd(e){let t=[`Lesson prune ${e.dryRun?`preview`:`completed`}: ${e.pruned.length} lessons selected.`,`Skipped ${e.skipped} lessons.`];return e.pruned.length>0&&(t.push(``,`Pruned:`),t.push(...e.pruned.map(e=>`- ${e}`))),t.join(`
234
+ `)}function Jd(e){let t=[`Lesson grouping ${e.dryRun?`preview`:`completed`}: ${e.groupsCreated} groups, ${e.lessonsGrouped} lessons.`];return e.groups.length>0&&(t.push(``,`Groups:`),t.push(...e.groups.map(e=>`- ${e.label}: ${e.members.join(`, `)}`))),t.join(`
235
+ `)}function Yd(t,n){let r=t;return new e(n,r.store,r.embedder)}function Xd(e,t){let n=e.candidates.filter(e=>e.action===`promote`),r=e.candidates.filter(e=>e.action===`skip`),i=[`Lesson promotion ${t?`preview`:`completed`}: ${n.length} candidates ready.`,`Skipped ${r.length} candidates.`];return n.length>0&&(i.push(``,`Candidates:`),i.push(...n.map(e=>`- ${e.insight} (${e.foundIn.join(`, `)}) avg ${e.avgConfidence}/100`))),r.length>0&&(i.push(``,`Skipped:`),i.push(...r.map(e=>`- ${e.insight}: ${e.reason}`))),e.promoted.length>0&&(i.push(``,`Promoted:`),i.push(...e.promoted.map(e=>`- ${e}`))),i.join(`
236
+ `)}async function Zd(e,n){let r=e;if(r.scope===`flow`&&n.flowContextAdapter){let{title:e,content:t,category:i}=r,a=(e??`untitled`).toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``),o=Id(i),s=o?`${o}/${a}.md`:`${a}.md`,c=`# ${e}\n\n${t??``}`;return await n.flowContextAdapter.write(s,c),{content:[{type:`text`,text:`Deposited flow context at \`${s}\``}]}}let{curated:i,policyStore:a,evolutionCollector:o,resourceNotifier:s,stateStore:c,supersessionConfig:l}=n,{title:u,content:d,category:f,tags:p,force:m=!1}=gd.parse(e),h=te(l),g=await Pd(i,d,f,h),_=await i.remember(u,d,f,p);c?.memoryMetaCreate(_.path,`working`);let v=Fd(g,h.autoThreshold,m);if(c)for(let e of v.superseded)t(c,e.id,_.path);let y=``;if(a){let e=a.classify(u,d,p);o&&o.recordClassification(u,e.matchingRules.map(e=>e.ruleId),e.pushRecommended),e.matchingRules.length>0&&(y=`\n\n### Classification Signals\n${e.matchingRules.map(e=>` - **${e.ruleId}** (${e.category}, weight: ${e.pushWeight}) — matched: ${e.matchedPatterns.join(`, `)}`).join(`
237
237
  `)}\n- **Push recommended**: ${e.pushRecommended?`yes`:`no`} (max weight: ${e.maxPushWeight})`,e.pushRecommended&&(y+=`
238
238
 
239
- > 💡 This entry matches push rules. Consider \`er_push\` to share with Enterprise RAG.`))}s&&s.notifyAfterCuratedWrite(_.path).catch(()=>{});let b=ed(_.path,u,`[${f}]`),x=v.superseded.length>0?Md(`Superseded Entries`,v.superseded):``,S=v.supersessionCandidates.length>0?Md(`Supersession Suggestions`,v.supersessionCandidates):``;return{content:[{type:`text`,text:`Remembered: **${u}**\n\nStored at \`.ai/curated/${_.path}\` and indexed for semantic search.${y}${x}${S}\n\n---\n_Next: Use \`search\` to verify the entry is findable, or \`knowledge({ action: "list" })\` to see all curated entries._`},...b?[b]:[]],structuredContent:{path:_.path,superseded:v.superseded,supersessionCandidates:v.supersessionCandidates}}}async function Zd(e,{curated:t,stateStore:n,retentionConfig:r,consolidationConfig:i}){let{path:a}=gd.parse(e),o=await t.read(a),s=n?jd(n,a,r,i):void 0,c=[`## ${o.title}`,`- **Path**: .ai/curated/${a}`,`- **Category**: ${o.category}`,o.tags.length?`- **Tags**: ${o.tags.join(`, `)}`:null,`- **Version**: ${o.version}`,`- **Created**: ${o.created}`,o.updated===o.created?null:`- **Updated**: ${o.updated}`,s?`- **Tier**: ${s.tier}`:null,s?`- **Retention**: ${s.retentionScore.toFixed(3)}`:null,``].filter(e=>e!==null).join(`
240
- `),l=ed(a,o.title,`[${o.category}]`);return{content:[{type:`text`,text:`${c}\n${o.content}\n\n---\n_Next: Use \`knowledge({ action: "update", ... })\` to modify this entry, or \`search\` to find related entries._`},...l?[l]:[]]}}async function Qd(e,{curated:t,resourceNotifier:n}){let{path:r,content:i,reason:a}=_d.parse(e),o=await t.update(r,i,a);return n&&n.notifyAfterCuratedWrite(r).catch(()=>{}),{content:[{type:`text`,text:`Updated: \`.ai/curated/${o.path}\` → version ${o.version}\n\nReason: ${a}\n\n---\n_Next: Use \`knowledge({ action: "read", path: "${o.path}" })\` to verify the updated content, or \`search\` to test searchability._`}]}}async function $d(e,{curated:t,resourceNotifier:n}){let{path:r,reason:i}=vd.parse(e),a=F(t.curatedDir,r);if(M(a))try{vt(`forget`,[{path:a,content:N(a,`utf-8`)}],`forget: ${r}`)}catch{}let o=await t.forget(r,i);return Od.info(`Forgot entry`,{path:o.path,reason:i}),n&&(n.notifyAfterCuratedWrite().catch(()=>{}),n.notifyResourceListChanged().catch(()=>{})),{content:[{type:`text`,text:`Forgotten: \`.ai/curated/${o.path}\`\n\nRemoved from disk and vector store.\nReason: ${i}\n\n---\n_Next: Use \`knowledge({ action: "list" })\` to verify removal, or \`search\` to confirm the entry is no longer returned._`}]}}async function ef(e,t){if(e.scope===`flow`&&t.flowContextAdapter){let e=await t.flowContextAdapter.list();if(e.length===0)return{content:[{type:`text`,text:`## Flow Context
239
+ > 💡 This entry matches push rules. Consider \`er_push\` to share with Enterprise RAG.`))}s&&s.notifyAfterCuratedWrite(_.path).catch(()=>{});let b=td(_.path,u,`[${f}]`),x=v.superseded.length>0?Nd(`Superseded Entries`,v.superseded):``,S=v.supersessionCandidates.length>0?Nd(`Supersession Suggestions`,v.supersessionCandidates):``;return{content:[{type:`text`,text:`Remembered: **${u}**\n\nStored at \`.ai/curated/${_.path}\` and indexed for semantic search.${y}${x}${S}\n\n---\n_Next: Use \`search\` to verify the entry is findable, or \`knowledge({ action: "list" })\` to see all curated entries._`},...b?[b]:[]],structuredContent:{path:_.path,superseded:v.superseded,supersessionCandidates:v.supersessionCandidates}}}async function Qd(e,{curated:t,stateStore:n,retentionConfig:r,consolidationConfig:i}){let{path:a}=_d.parse(e),o=await t.read(a),s=n?Md(n,a,r,i):void 0,c=[`## ${o.title}`,`- **Path**: .ai/curated/${a}`,`- **Category**: ${o.category}`,o.tags.length?`- **Tags**: ${o.tags.join(`, `)}`:null,`- **Version**: ${o.version}`,`- **Created**: ${o.created}`,o.updated===o.created?null:`- **Updated**: ${o.updated}`,s?`- **Tier**: ${s.tier}`:null,s?`- **Retention**: ${s.retentionScore.toFixed(3)}`:null,``].filter(e=>e!==null).join(`
240
+ `),l=td(a,o.title,`[${o.category}]`);return{content:[{type:`text`,text:`${c}\n${o.content}\n\n---\n_Next: Use \`knowledge({ action: "update", ... })\` to modify this entry, or \`search\` to find related entries._`},...l?[l]:[]]}}async function $d(e,{curated:t,resourceNotifier:n}){let{path:r,content:i,reason:a}=vd.parse(e),o=await t.update(r,i,a);return n&&n.notifyAfterCuratedWrite(r).catch(()=>{}),{content:[{type:`text`,text:`Updated: \`.ai/curated/${o.path}\` → version ${o.version}\n\nReason: ${a}\n\n---\n_Next: Use \`knowledge({ action: "read", path: "${o.path}" })\` to verify the updated content, or \`search\` to test searchability._`}]}}async function ef(e,{curated:t,resourceNotifier:n}){let{path:r,reason:i}=yd.parse(e),a=F(t.curatedDir,r);if(M(a))try{vt(`forget`,[{path:a,content:N(a,`utf-8`)}],`forget: ${r}`)}catch{}let o=await t.forget(r,i);return kd.info(`Forgot entry`,{path:o.path,reason:i}),n&&(n.notifyAfterCuratedWrite().catch(()=>{}),n.notifyResourceListChanged().catch(()=>{})),{content:[{type:`text`,text:`Forgotten: \`.ai/curated/${o.path}\`\n\nRemoved from disk and vector store.\nReason: ${i}\n\n---\n_Next: Use \`knowledge({ action: "list" })\` to verify removal, or \`search\` to confirm the entry is no longer returned._`}]}}async function tf(e,t){if(e.scope===`flow`&&t.flowContextAdapter){let e=await t.flowContextAdapter.list();if(e.length===0)return{content:[{type:`text`,text:`## Flow Context
241
241
 
242
242
  No flow context entries found.`}]};let n=e.map(e=>` - \`${e.path}\` (${e.size} chars)`).join(`
243
- `);return{content:[{type:`text`,text:`## Flow Context (${e.length} entries)\n\n${n}`}]}}let{curated:n,stateStore:r,retentionConfig:i}=t,{category:a,tag:o,limit:s,offset:c}=yd.parse(e),l=await n.listPage({category:a,tag:o,limit:s,offset:c,orderBy:`updated`,order:`desc`}),u=l.entries,d=u.map(e=>({entry:e,retentionMeta:r?m(r,e.path,i):void 0})),f={entries:d.map(({entry:e,retentionMeta:t})=>({path:e.path,title:e.title,category:e.category,tags:e.tags,version:e.version,preview:e.contentPreview?.slice(0,120)??``,...t?{retentionScore:t.retentionScore,tier:t.tier}:{}})),totalCount:l.totalCount,returnedCount:u.length,limit:l.limit,offset:l.offset,hasMore:l.hasMore};if(u.length===0)return{content:[{type:`text`,text:`No curated knowledge entries found.`+(a?` (category: ${a})`:``)+(o?` (tag: ${o})`:``)}],structuredContent:f};let p=d.map(({entry:e,retentionMeta:t})=>{let n=e.tags.length>0?` [${e.tags.join(`, `)}]`:``,r=t?` | tier ${t.tier} | retention ${t.retentionScore.toFixed(3)}`:``;return`- **${e.title}** (v${e.version})${n}${r}\n \`${e.path}\` — ${e.contentPreview.slice(0,80)}…`}).join(`
244
- `),h=td(u),g=l.hasMore?`\n\n_Showing ${u.length} of ${l.totalCount} entries. Request \`offset: ${l.offset+u.length}\` for next page._`:l.totalCount>u.length?`\n\n_Showing ${u.length} of ${l.totalCount} entries._`:``;return{content:[{type:`text`,text:`## Curated Knowledge (${u.length} of ${l.totalCount} entries)\n\n${p}${g}\n\n---\n_Next: Use \`knowledge({ action: "read", path: "..." })\` to view full content of any entry, or \`knowledge({ action: "remember", ... })\` to store new knowledge._`},...h],structuredContent:f}}async function tf(e,{curated:t}){let{path:n}=gd.parse(e),r=e.limit??20,i=await t.history(n,r);if(i.length===0)return{content:[{type:`text`,text:`No git history available for this entry. Git-backing may not be available or the entry predates git-backing.`}]};let a=i.map((e,t)=>`${t+1}. **${e.date}** \`${e.sha.slice(0,8)}\` — ${e.message}`).join(`
245
- `);return{content:[{type:`text`,text:`## History for \`${n}\` (${i.length} entries)\n\n${a}\n\n_Use \`knowledge({ action: "diff", path: "${n}", from_sha: "...", to_sha: "..." })\` to compare versions._`}]}}async function nf(e,{curated:t}){let{path:n}=gd.parse(e),{from_sha:r,to_sha:i}=e,a=await t.diff(n,r,i);return a?{content:[{type:`text`,text:`## Diff for \`${n}\`\n\n\`\`\`diff\n${a}\n\`\`\``}]}:{content:[{type:`text`,text:`No diff available. Git-backing may not be available or the entry has no history.`}]}}async function rf(e,{curated:t}){let{path:n}=gd.parse(e),r=await t.recover(n);return r?{content:[{type:`text`,text:`✅ Recovered \`${r.path}\` (version ${r.version}) from git history. The entry has been restored to the filesystem and re-indexed.`}]}:{content:[{type:`text`,text:`No git history found for \`${n}\`. Cannot recover — the entry either never existed or was never git-backed.`}]}}async function af(e,{curated:t}){let n=await t.listOrphaned();if(n.length===0)return{content:[{type:`text`,text:`No orphaned entries found. All git-backed entries have corresponding filesystem files.`}]};let r=n.map((e,t)=>`${t+1}. \`${e.path}\` — last: ${e.lastMessage}`).join(`
246
- `);return{content:[{type:`text`,text:`## Orphaned Knowledge Entries (${n.length})\n\nThese entries exist in git but are missing from the filesystem:\n\n${r}\n\n_Use \`knowledge({ action: "recover", path: "..." })\` to restore any of these entries._`}]}}async function of(e,{curated:t,stateStore:n,retentionConfig:r,lessonConfig:i}){if(!n)return{content:[{type:`text`,text:`Retention state store not available.`}],structuredContent:{entries:[],totalCount:0}};let a=f(n,r),o=v(i??c),s=await t.list({category:`lessons`}),l=(await Promise.all(s.filter(e=>e.tags.includes(`lesson`)).map(async e=>{let r=n.memoryMetaGet(e.path);return r||=(await Hd(t,n,e.path)).meta,!r||!y(r,o)?null:{path:e.path,title:e.title,confidence:ce(r.confidence,r.lastAccessedAt,r.createdAt,o),createdAt:r.createdAt,lastAccessedAt:r.lastAccessedAt,supersededBy:r.supersededBy}}))).filter(e=>e!==null).sort((e,t)=>e.confidence-t.confidence||Date.parse(e.lastAccessedAt??e.createdAt)-Date.parse(t.lastAccessedAt??t.createdAt));if(a.length===0&&l.length===0)return{content:[{type:`text`,text:`No flagged knowledge entries found below the current retention threshold.`}],structuredContent:{entries:[],totalCount:0}};let u=a.length===0?`### Retention
243
+ `);return{content:[{type:`text`,text:`## Flow Context (${e.length} entries)\n\n${n}`}]}}let{curated:n,stateStore:r,retentionConfig:i}=t,{category:a,tag:o,limit:s,offset:c}=bd.parse(e),l=await n.listPage({category:a,tag:o,limit:s,offset:c,orderBy:`updated`,order:`desc`}),u=l.entries,d=u.map(e=>({entry:e,retentionMeta:r?m(r,e.path,i):void 0})),f={entries:d.map(({entry:e,retentionMeta:t})=>({path:e.path,title:e.title,category:e.category,tags:e.tags,version:e.version,preview:e.contentPreview?.slice(0,120)??``,...t?{retentionScore:t.retentionScore,tier:t.tier}:{}})),totalCount:l.totalCount,returnedCount:u.length,limit:l.limit,offset:l.offset,hasMore:l.hasMore};if(u.length===0)return{content:[{type:`text`,text:`No curated knowledge entries found.`+(a?` (category: ${a})`:``)+(o?` (tag: ${o})`:``)}],structuredContent:f};let p=d.map(({entry:e,retentionMeta:t})=>{let n=e.tags.length>0?` [${e.tags.join(`, `)}]`:``,r=t?` | tier ${t.tier} | retention ${t.retentionScore.toFixed(3)}`:``;return`- **${e.title}** (v${e.version})${n}${r}\n \`${e.path}\` — ${e.contentPreview.slice(0,80)}…`}).join(`
244
+ `),h=nd(u),g=l.hasMore?`\n\n_Showing ${u.length} of ${l.totalCount} entries. Request \`offset: ${l.offset+u.length}\` for next page._`:l.totalCount>u.length?`\n\n_Showing ${u.length} of ${l.totalCount} entries._`:``;return{content:[{type:`text`,text:`## Curated Knowledge (${u.length} of ${l.totalCount} entries)\n\n${p}${g}\n\n---\n_Next: Use \`knowledge({ action: "read", path: "..." })\` to view full content of any entry, or \`knowledge({ action: "remember", ... })\` to store new knowledge._`},...h],structuredContent:f}}async function nf(e,{curated:t}){let{path:n}=_d.parse(e),r=e.limit??20,i=await t.history(n,r);if(i.length===0)return{content:[{type:`text`,text:`No git history available for this entry. Git-backing may not be available or the entry predates git-backing.`}]};let a=i.map((e,t)=>`${t+1}. **${e.date}** \`${e.sha.slice(0,8)}\` — ${e.message}`).join(`
245
+ `);return{content:[{type:`text`,text:`## History for \`${n}\` (${i.length} entries)\n\n${a}\n\n_Use \`knowledge({ action: "diff", path: "${n}", from_sha: "...", to_sha: "..." })\` to compare versions._`}]}}async function rf(e,{curated:t}){let{path:n}=_d.parse(e),{from_sha:r,to_sha:i}=e,a=await t.diff(n,r,i);return a?{content:[{type:`text`,text:`## Diff for \`${n}\`\n\n\`\`\`diff\n${a}\n\`\`\``}]}:{content:[{type:`text`,text:`No diff available. Git-backing may not be available or the entry has no history.`}]}}async function af(e,{curated:t}){let{path:n}=_d.parse(e),r=await t.recover(n);return r?{content:[{type:`text`,text:`✅ Recovered \`${r.path}\` (version ${r.version}) from git history. The entry has been restored to the filesystem and re-indexed.`}]}:{content:[{type:`text`,text:`No git history found for \`${n}\`. Cannot recover — the entry either never existed or was never git-backed.`}]}}async function of(e,{curated:t}){let n=await t.listOrphaned();if(n.length===0)return{content:[{type:`text`,text:`No orphaned entries found. All git-backed entries have corresponding filesystem files.`}]};let r=n.map((e,t)=>`${t+1}. \`${e.path}\` — last: ${e.lastMessage}`).join(`
246
+ `);return{content:[{type:`text`,text:`## Orphaned Knowledge Entries (${n.length})\n\nThese entries exist in git but are missing from the filesystem:\n\n${r}\n\n_Use \`knowledge({ action: "recover", path: "..." })\` to restore any of these entries._`}]}}async function sf(e,{curated:t,stateStore:n,retentionConfig:r,lessonConfig:i}){if(!n)return{content:[{type:`text`,text:`Retention state store not available.`}],structuredContent:{entries:[],totalCount:0}};let a=f(n,r),o=v(i??c),s=await t.list({category:`lessons`}),l=(await Promise.all(s.filter(e=>e.tags.includes(`lesson`)).map(async e=>{let r=n.memoryMetaGet(e.path);return r||=(await Ud(t,n,e.path)).meta,!r||!y(r,o)?null:{path:e.path,title:e.title,confidence:ce(r.confidence,r.lastAccessedAt,r.createdAt,o),createdAt:r.createdAt,lastAccessedAt:r.lastAccessedAt,supersededBy:r.supersededBy}}))).filter(e=>e!==null).sort((e,t)=>e.confidence-t.confidence||Date.parse(e.lastAccessedAt??e.createdAt)-Date.parse(t.lastAccessedAt??t.createdAt));if(a.length===0&&l.length===0)return{content:[{type:`text`,text:`No flagged knowledge entries found below the current retention threshold.`}],structuredContent:{entries:[],totalCount:0}};let u=a.length===0?`### Retention
247
247
  None.`:`### Retention\n${a.map(e=>`- \`${e.entryId}\` — score ${e.retentionScore.toFixed(3)}, tier ${e.tier}, accesses ${e.accessCount}`).join(`
248
248
  `)}`,d=l.length===0?`### Stale Lessons
249
249
  None.`:`### Stale Lessons\n${l.map(e=>`- **${e.title}** (\`${e.path}\`) — effective confidence ${e.confidence}/100, last access ${e.lastAccessedAt??e.createdAt}`).join(`
250
- `)}`;return{content:[{type:`text`,text:`## Flagged Knowledge Entries (${a.length+l.length})\n\n${u}\n\n${d}`}],structuredContent:{entries:a,staleLessons:l,totalCount:a.length+l.length}}}const sf={decision:6,pattern:5,"file-card":4,analysis:3,"search-result":2,"step-summary":1},cf={"search-result":864e5,"file-card":1728e5,analysis:1728e5,"step-summary":2592e5,decision:6048e5,pattern:6048e5},lf={implementer:{name:`implementer`,contextTypes:[`file-card`,`decision`,`pattern`],priority:{...sf}},documenter:{name:`documenter`,contextTypes:[`decision`,`pattern`,`step-summary`],priority:{...sf}},reviewer:{name:`reviewer`,contextTypes:[`file-card`,`search-result`,`decision`,`pattern`,`step-summary`,`analysis`],priority:{...sf}},researcher:{name:`researcher`,contextTypes:[`search-result`,`decision`,`analysis`],priority:{...sf}},debugger:{name:`debugger`,contextTypes:[`file-card`,`search-result`,`pattern`,`analysis`],priority:{...sf}}};function uf(e){return lf[e]}function df(e,t,n=Date.now()){let r=n-t;if(r<36e5)return!1;let i=cf[e];return i==null?!1:r>i}function ff(e,t,n){if(n<=0)return[];let r=new Set(t.contextTypes),i=e.filter(e=>r.has(e.type)).map((e,t)=>({entry:e,index:t})).sort((e,n)=>{let r=t.priority[n.entry.type]-t.priority[e.entry.type];return r===0?e.index-n.index:r}),a=[],o=0;for(let{entry:e}of i){let t=w(e.type,e.content),r=t.length;o+r>n||(a.push({type:e.type,content:t}),o+=r)}return a}async function pf(e,{curated:t,flowContextAdapter:n,stateStore:r,retentionConfig:i,consolidationConfig:a,lessonConfig:o}){let s=I.object({profile:I.string(),budget:I.number().int().min(100).max(5e4).default(6e3).describe(`Character budget for withdraw results`),token_budget:I.number().int().min(50).max(12500).optional().describe(`Token budget (overrides budget). Approx 4 chars per token.`)}).parse(e),l=s.token_budget?s.token_budget*4:s.budget;if(!n)return{content:[{type:`text`,text:`Flow context not available — no active flow or adapter not configured.`}]};let u=uf(s.profile);if(!u)return{content:[{type:`text`,text:`Unknown profile: "implementer, documenter, reviewer, researcher, debugger".`}]};let d=await n.list();if(d.length===0)return{content:[{type:`text`,text:`No flow context available yet. Context is deposited automatically as agents use search, file_summary, and other analysis tools.`}]};let f=Date.now(),p=d.filter(e=>{let t=e.path.split(`/`)[0];return id.has(t)?!df(t,e.mtimeMs,f):!0}),m=(await Promise.all(p.map(async e=>{let t=e.path.split(`/`),o=t[0];if(t.length<2||!id.has(o))return null;let s=await n.read(e.path);return s?(r&&jd(r,e.path,i,a),{type:o,content:s}):null}))).filter(e=>e!==null),h=ff(m,u,l),g=v(o??c),_=[...new Set(h.flatMap(e=>Vd(e.content)))];if(await Promise.all(_.map(async e=>{let n=r?.memoryMetaGet(e)?.confidence;if(n===void 0)try{n=(await Hd(t,r,e)).confidence}catch{return}Bd(r,e,n,g)})),h.length===0)return{content:[{type:`text`,text:`No relevant context for profile "${s.profile}". ${m.length} entries available but none match your role's context types.`}]};let y=h.map(e=>`### [${e.type}]\n${e.content}`).join(`
250
+ `)}`;return{content:[{type:`text`,text:`## Flagged Knowledge Entries (${a.length+l.length})\n\n${u}\n\n${d}`}],structuredContent:{entries:a,staleLessons:l,totalCount:a.length+l.length}}}const cf={decision:6,pattern:5,"file-card":4,analysis:3,"search-result":2,"step-summary":1},lf={"search-result":864e5,"file-card":1728e5,analysis:1728e5,"step-summary":2592e5,decision:6048e5,pattern:6048e5},uf={implementer:{name:`implementer`,contextTypes:[`file-card`,`decision`,`pattern`],priority:{...cf}},documenter:{name:`documenter`,contextTypes:[`decision`,`pattern`,`step-summary`],priority:{...cf}},reviewer:{name:`reviewer`,contextTypes:[`file-card`,`search-result`,`decision`,`pattern`,`step-summary`,`analysis`],priority:{...cf}},researcher:{name:`researcher`,contextTypes:[`search-result`,`decision`,`analysis`],priority:{...cf}},debugger:{name:`debugger`,contextTypes:[`file-card`,`search-result`,`pattern`,`analysis`],priority:{...cf}}};function df(e){return uf[e]}function ff(e,t,n=Date.now()){let r=n-t;if(r<36e5)return!1;let i=lf[e];return i==null?!1:r>i}function pf(e,t,n){if(n<=0)return[];let r=new Set(t.contextTypes),i=e.filter(e=>r.has(e.type)).map((e,t)=>({entry:e,index:t})).sort((e,n)=>{let r=t.priority[n.entry.type]-t.priority[e.entry.type];return r===0?e.index-n.index:r}),a=[],o=0;for(let{entry:e}of i){let t=w(e.type,e.content),r=t.length;o+r>n||(a.push({type:e.type,content:t}),o+=r)}return a}async function mf(e,{curated:t,flowContextAdapter:n,stateStore:r,retentionConfig:i,consolidationConfig:a,lessonConfig:o}){let s=I.object({profile:I.string(),budget:I.number().int().min(100).max(5e4).default(6e3).describe(`Character budget for withdraw results`),token_budget:I.number().int().min(50).max(12500).optional().describe(`Token budget (overrides budget). Approx 4 chars per token.`)}).parse(e),l=s.token_budget?s.token_budget*4:s.budget;if(!n)return{content:[{type:`text`,text:`Flow context not available — no active flow or adapter not configured.`}]};let u=df(s.profile);if(!u)return{content:[{type:`text`,text:`Unknown profile: "implementer, documenter, reviewer, researcher, debugger".`}]};let d=await n.list();if(d.length===0)return{content:[{type:`text`,text:`No flow context available yet. Context is deposited automatically as agents use search, file_summary, and other analysis tools.`}]};let f=Date.now(),p=d.filter(e=>{let t=e.path.split(`/`)[0];return ad.has(t)?!ff(t,e.mtimeMs,f):!0}),m=(await Promise.all(p.map(async e=>{let t=e.path.split(`/`),o=t[0];if(t.length<2||!ad.has(o))return null;let s=await n.read(e.path);return s?(r&&Md(r,e.path,i,a),{type:o,content:s}):null}))).filter(e=>e!==null),h=pf(m,u,l),g=v(o??c),_=[...new Set(h.flatMap(e=>Hd(e.content)))];if(await Promise.all(_.map(async e=>{let n=r?.memoryMetaGet(e)?.confidence;if(n===void 0)try{n=(await Ud(t,r,e)).confidence}catch{return}Vd(r,e,n,g)})),h.length===0)return{content:[{type:`text`,text:`No relevant context for profile "${s.profile}". ${m.length} entries available but none match your role's context types.`}]};let y=h.map(e=>`### [${e.type}]\n${e.content}`).join(`
251
251
 
252
- `),b=h.reduce((e,t)=>e+t.content.length,0);return{content:[{type:`text`,text:`## Flow Context (${h.length}/${m.length} entries, ${b} chars, profile: ${s.profile})\n\n${y}`}]}}async function mf(e,{flowContextAdapter:t}){return t?{content:[{type:`text`,text:`Flushed ${await t.flushAll()} flow context entries.`}]}:{content:[{type:`text`,text:`Flow context not available — no active flow or adapter not configured.`}]}}async function hf(e){try{let t=await e.getStats(),n=await e.validate(),r=t.nodeCount,i=t.edgeCount,a=await e.findNodes({limit:1e4}),o=a.slice(0,500),s=Math.max(0,a.length-500),c=[];for(let t=0;t<o.length;t+=50){let n=o.slice(t,t+50),r=await Promise.allSettled(n.map(t=>e.getNeighbors(t.id,{direction:`both`,maxDepth:1})));for(let e=0;e<n.length;e++){let t=r[e],i=t.status===`fulfilled`&&t.value.nodes!=null&&t.value.nodes.length>0;c.push({id:n[e].id,hasNeighbors:i})}}let l=[];for(let e=0;e<o.length;e++)c[e].hasNeighbors||l.push({id:o[e].id,name:o[e].name,type:o[e].type});let u=l.length,d=r>0?u/r:0,f=[];if(t.communities)for(let[e,n]of Object.entries(t.communities))Array.isArray(n)&&n.length<3&&f.push({name:e,nodeCount:n.length,nodes:n});let p={danglingEdgeCount:n.danglingEdges.length,orphanNodeCount:n.orphanNodes.length},m=t.communityCount??0,h=m>0?f.length/m:0,g=i>0?p.danglingEdgeCount/i:0,_=Math.max(d,h,g),v=_<.1?`healthy`:_<.3?`fair`:`poor`,y={summary:[`# Knowledge Gap Analysis`,``,`**${r}** nodes, **${i}** edges across **${m}** communities.`,`**Overall health: ${v.toUpperCase()}**`,``,`## Key Metrics`,``,`| Metric | Value | Threshold |`,`|--------|-------|-----------|`,`| Isolated nodes | ${u} / ${r} (${(d*100).toFixed(1)}%)${s>0?` *(${s} unchecked)*`:``} | < 10% healthy |`,`| Thin communities | ${f.length} / ${m} (${(h*100).toFixed(1)}%) | < 10% healthy |`,`| Dangling edges | ${p.danglingEdgeCount} / ${i} (${(g*100).toFixed(1)}%) | < 10% healthy |`,``].join(`
252
+ `),b=h.reduce((e,t)=>e+t.content.length,0);return{content:[{type:`text`,text:`## Flow Context (${h.length}/${m.length} entries, ${b} chars, profile: ${s.profile})\n\n${y}`}]}}async function hf(e,{flowContextAdapter:t}){return t?{content:[{type:`text`,text:`Flushed ${await t.flushAll()} flow context entries.`}]}:{content:[{type:`text`,text:`Flow context not available — no active flow or adapter not configured.`}]}}async function gf(e){try{let t=await e.getStats(),n=await e.validate(),r=t.nodeCount,i=t.edgeCount,a=await e.findNodes({limit:1e4}),o=a.slice(0,500),s=Math.max(0,a.length-500),c=[];for(let t=0;t<o.length;t+=50){let n=o.slice(t,t+50),r=await Promise.allSettled(n.map(t=>e.getNeighbors(t.id,{direction:`both`,maxDepth:1})));for(let e=0;e<n.length;e++){let t=r[e],i=t.status===`fulfilled`&&t.value.nodes!=null&&t.value.nodes.length>0;c.push({id:n[e].id,hasNeighbors:i})}}let l=[];for(let e=0;e<o.length;e++)c[e].hasNeighbors||l.push({id:o[e].id,name:o[e].name,type:o[e].type});let u=l.length,d=r>0?u/r:0,f=[];if(t.communities)for(let[e,n]of Object.entries(t.communities))Array.isArray(n)&&n.length<3&&f.push({name:e,nodeCount:n.length,nodes:n});let p={danglingEdgeCount:n.danglingEdges.length,orphanNodeCount:n.orphanNodes.length},m=t.communityCount??0,h=m>0?f.length/m:0,g=i>0?p.danglingEdgeCount/i:0,_=Math.max(d,h,g),v=_<.1?`healthy`:_<.3?`fair`:`poor`,y={summary:[`# Knowledge Gap Analysis`,``,`**${r}** nodes, **${i}** edges across **${m}** communities.`,`**Overall health: ${v.toUpperCase()}**`,``,`## Key Metrics`,``,`| Metric | Value | Threshold |`,`|--------|-------|-----------|`,`| Isolated nodes | ${u} / ${r} (${(d*100).toFixed(1)}%)${s>0?` *(${s} unchecked)*`:``} | < 10% healthy |`,`| Thin communities | ${f.length} / ${m} (${(h*100).toFixed(1)}%) | < 10% healthy |`,`| Dangling edges | ${p.danglingEdgeCount} / ${i} (${(g*100).toFixed(1)}%) | < 10% healthy |`,``].join(`
253
253
  `),metadata:{analyzedAt:new Date().toISOString(),nodeCount:r,edgeCount:i},isolatedNodes:l,uncheckedNodeCount:s,thinCommunities:f,graphIntegrity:p,combinedScore:{overall:v,isolatedNodeRatio:d,thinCommunityRatio:h,integrityRatio:g}},b=[];if(s>0&&b.push(``,`> **Note:** ${s} nodes were not checked for isolation (limit: 500). Unchecked nodes are not classified as isolated.`),l.length>0){b.push(``,`## Isolated Nodes`);for(let e of l.slice(0,20))b.push(`- **${e.name}** (${e.type}, id: \`${e.id}\`)`);l.length>20&&b.push(`- ... and ${l.length-20} more`)}if(f.length>0){b.push(``,`## Thin Communities`);for(let e of f)b.push(`- **${e.name}**: ${e.nodeCount} node(s) — ${e.nodes.join(`, `)}`)}if(p.danglingEdgeCount>0){b.push(``,`## Dangling Edges (graph integrity)`);for(let e of n.danglingEdges.slice(0,20))b.push(`- Edge \`${e.edgeId}\` → missing node \`${e.missingNodeId}\``)}return p.orphanNodeCount>0&&(b.push(``,`## Orphan Nodes`),b.push(`- ${n.orphanNodes.join(`, `)}`)),y.summary+=b.join(`
254
- `),{content:[{type:`text`,text:y.summary}],isError:!1,report:y}}catch(e){return{content:[{type:`text`,text:`Gap analysis failed: ${e instanceof Error?e.message:j(e)}`}],isError:!0,report:null}}}async function gf(e,{curated:t,stateStore:r,resourceNotifier:i}){let a=Ud(e),{title:o,context:s,insight:c,evidence:l,confidence:u,tags:d}=bd.parse(a);try{let e=Gd(o,await t.list({category:`lessons`}));if(e)return{content:[{type:`text`,text:`Similar lesson already exists at \`${e.path}\`: **${e.title}** (${(e.similarity*100).toFixed(0)}% similar).\n\nUse \`confirm\` or \`contradict\` on the existing lesson instead of creating a duplicate.`}],structuredContent:{conflict:`duplicate`,existingPath:e.path,existingTitle:e.title,similarity:e.similarity}}}catch{}let f=n({title:o,context:s,insight:c,evidence:l,confidence:u,tags:d}),p=await t.remember(o,f,`lessons`,Rd(d));return zd(r,p.path,u),i&&i.notifyAfterCuratedWrite(p.path).catch(()=>{}),{content:[{type:`text`,text:`Recorded lesson: **${o}**\n\nStored at \`.ai/curated/${p.path}\` with confidence ${u}/100.`}],structuredContent:{path:p.path,confidence:u,category:`lessons`,tags:Rd(d)}}}async function _f(e,t,n){let{curated:r,stateStore:i,resourceNotifier:a,retentionConfig:o,consolidationConfig:s,lessonConfig:l}=n,u=xd.parse(e);if(t===`contradict`&&!u.reason)throw new I.ZodError([{code:`custom`,path:[`reason`],message:`reason is required`}]);let d=Ld(u.path,u.id),f=v(l??c);i&&jd(i,d,o,s);let{entry:p,confidence:m}=await Hd(r,i,d),g=h(m,t,f),_=b(p.content,g),y=t===`confirm`?u.reason??`Confirmed lesson confidence`:`Contradicted lesson confidence: ${u.reason}`,x=await r.update(d,_,y);return i&&i.memoryMetaUpdateConfidence(d,g),a&&a.notifyAfterCuratedWrite(d).catch(()=>{}),{content:[{type:`text`,text:`${t===`confirm`?`Confirmed`:`Contradicted`} lesson: \`${d}\`\n\nConfidence ${m}/100 → ${g}/100.`}],structuredContent:{path:x.path,confidence:g,previousConfidence:m,version:x.version}}}async function vf(e,{curated:t,stateStore:n,lessonConfig:r}){let{topic:i,minConfidence:a,tag:s,tags:l,sortBy:u,includeArchived:f,limit:p,offset:m}=Sd.parse(e),h=Rd([...l??[],...s?[s]:[]]),g=v(r??c),_=Math.max(p+m,500),y=await t.listPage({category:`lessons`,...s?{tag:s}:{},limit:_,orderBy:`updated`,order:`desc`}),b=y.entries,x=await Promise.all(b.filter(e=>e.tags.includes(`lesson`)).map(async e=>{let{entry:r,confidence:i,meta:a}=await Hd(t,n,e.path),s=a??n?.memoryMetaGet(e.path);s&&s.supersededBy===null&&o(s,g)&&n?.memoryMetaSetSuperseded(e.path,d);let c=n?.memoryMetaGet(e.path)??s,l=c?.createdAt??e.created,u=c?.confidence??i,f=ce(u,c?.lastAccessedAt,l,g),p=c?.lastAccessedAt??c?.createdAt??null;return{path:e.path,title:e.title,category:e.category,tags:e.tags,version:e.version,preview:e.contentPreview,content:r.content,confidence:f,storedConfidence:u,createdAt:l,lastAccessedAt:c?.lastAccessedAt??null,recency:p,archived:c?.supersededBy===d,supersededBy:c?.supersededBy??null}})),S=x.filter(e=>e.archived).length,C=x.filter(e=>f?!0:e.supersededBy===null).filter(e=>a===void 0?!0:e.confidence>=a).filter(e=>h.length===0?!0:h.every(t=>e.tags.includes(t))).filter(e=>!i||`${e.title}\n${e.preview}\n${e.tags.join(` `)}`.toLowerCase().includes(i.toLowerCase())?!0:e.content?e.content.toLowerCase().includes(i.toLowerCase()):!1).sort((e,t)=>u===`recent`?Date.parse(t.recency??``)-Date.parse(e.recency??``)||t.confidence-e.confidence:t.confidence-e.confidence||Date.parse(t.recency??``)-Date.parse(e.recency??``)),w=C.slice(m,m+p);if(C.forEach(e=>{Bd(n,e.path,e.storedConfidence,g)}),w.length===0)return{content:[{type:`text`,text:`No lessons matched the requested filters.`}],structuredContent:{entries:[],totalCount:C.length,scannedCount:x.length,limit:p,offset:m,hasMore:C.length>m+p||y.hasMore,archivedCount:S}};let T=w.map(e=>{let t=e.recency?` | recent ${e.recency}`:``;return`- **${e.title}** (${e.confidence}/100)${t}\n \`${e.path}\` — ${e.preview.slice(0,80)}…`}).join(`
255
- `);return{content:[{type:`text`,text:`## Lessons (${w.length} of ${C.length})\n\n${T}`}],structuredContent:{entries:w.map(({storedConfidence:e,...t})=>t),totalCount:C.length,scannedCount:x.length,limit:p,offset:m,hasMore:C.length>m+p||y.hasMore,archivedCount:S}}}async function yf(e,{curated:t,stateStore:r,resourceNotifier:i}){let{bufferPath:a}=Cd.parse(e),o=await Wd(a);if(!o)return{content:[{type:`text`,text:`No observation buffer found for auto-observe.`}],structuredContent:{bufferPath:null,observations:0,createdCount:0,skippedCount:0,candidates:[]}};let s=li(N(o,`utf8`)),c=ci(s,Ir),l=await t.list({category:`lessons`}),u=[],d=[];try{for(let e of c){let a=Gd(e.title,l);if(a){d.push({title:e.title,path:a.path,similarity:a.similarity});continue}let o=n({title:e.title,context:e.context,insight:e.insight,evidence:e.evidence,confidence:e.confidence,tags:e.tags}),s=await t.remember(e.title,o,`lessons`,Rd(e.tags));zd(r,s.path,e.confidence),u.push({path:s.path,title:e.title,detector:e.detector}),l.push({path:s.path,title:e.title,category:`lessons`,tags:Rd(e.tags),version:1,created:new Date().toISOString(),updated:new Date().toISOString(),contentPreview:e.insight}),i&&i.notifyAfterCuratedWrite(s.path).catch(()=>{})}}finally{try{Ne(o)}catch{}}let f=[`Auto-observe processed ${s.length} observations from \`${o}\`.`,`Created ${u.length} lessons and skipped ${d.length} duplicates from ${c.length} candidates.`];return u.length>0&&(f.push(``,`Created:`),f.push(...u.map(e=>`- **${e.title}** (${e.path})`))),d.length>0&&(f.push(``,`Skipped:`),f.push(...d.map(e=>`- **${e.title}** matched ${e.path} (${e.similarity.toFixed(2)})`))),{content:[{type:`text`,text:f.join(`
256
- `)}],structuredContent:{bufferPath:o,observations:s.length,createdCount:u.length,skippedCount:d.length,candidates:c.map(e=>({title:e.title,detector:e.detector,confidence:e.confidence,tags:e.tags})),created:u,skipped:d}}}async function bf(e,t){switch(e.subAction??`create`){case`create`:return gf(e,t);case`confirm`:return _f(e,`confirm`,t);case`contradict`:return _f(e,`contradict`,t);case`list-lessons`:return vf(e,t);case`auto-observe`:return yf(e,t);case`prune`:{if(!t.stateStore)return q(`VALIDATION`,`StateStore required for lesson/prune`);let n=wd.parse(e),i=await r(t.curated,t.stateStore,{maxConfidence:n.maxConfidence,minIdleDays:n.minIdleDays,safetyDays:n.safetyDays,maxPrune:n.maxPrune,dryRun:n.dryRun},t.lessonConfig?v(t.lessonConfig):c);return{content:[{type:`text`,text:Kd(i)}],structuredContent:i}}case`group`:{if(!t.stateStore)return q(`VALIDATION`,`StateStore required for lesson/group`);let n=Td.parse(e),r=await g(t.curated,t.stateStore,{similarityThreshold:n.similarityThreshold,minGroupSize:n.minGroupSize,maxGroups:n.maxGroups,dryRun:n.dryRun});return{content:[{type:`text`,text:qd(r)}],structuredContent:r}}case`promote`:{if(!we())return{content:[{type:`text`,text:`Promotion requires user-level install (not workspace-scoped).`}]};let n=Ed.parse(e),r={minWorkspaces:n.minWorkspaces??E.minWorkspaces,minAvgConfidence:n.minAvgConfidence??E.minAvgConfidence,similarityThreshold:n.similarityThreshold??E.similarityThreshold,dryRun:n.dryRun},i=await se(S(await T(),r),Jd(t.curated,oe()),r);return{content:[{type:`text`,text:Yd(i,r.dryRun)}],structuredContent:i}}case`demote`:{if(!we())return{content:[{type:`text`,text:`Demotion requires user-level install.`}]};let n=Ld(e.path,e.id);if(!n)return{content:[{type:`text`,text:`Missing required "path" or "id" parameter for demote.`}]};let r=await x(Jd(t.curated,oe()),n);return{content:[{type:`text`,text:r.removed?`Demoted: ${n}`:`Not found in global: ${n}`}],structuredContent:r}}}}async function xf(e,t,n){switch(e){case`remember`:return Xd(t,n);case`read`:return Zd(t,n);case`update`:return Qd(t,n);case`forget`:return $d(t,n);case`list`:return ef(t,n);case`history`:return tf(t,n);case`diff`:return nf(t,n);case`recover`:return rf(t,n);case`orphaned`:return af(t,n);case`withdraw`:return pf(t,n);case`flush`:return mf(t,n);case`flagged`:return of(t,n);case`lesson`:return bf(t,n);case`gap-analysis`:return n.graphStore?hf(n.graphStore):{content:[{type:`text`,text:`Gap analysis requires a graph store (not available).`}],isError:!0}}}function Sf(e,t,n,r,i,a,o,s,c,l,u,d,f){let p=U(`knowledge`),m={curated:t,policyStore:n,evolutionCollector:r,resourceNotifier:i,flowContextAdapter:a,stateStore:o,retentionConfig:s,consolidationConfig:l,supersessionConfig:c,lessonConfig:u,graphStore:f};e.registerTool(`knowledge`,{title:p.title,description:"Operate on curated knowledge entries with a single tool. Use `action` to remember, read, update, forget, list, history, diff, recover, orphaned, withdraw, flush, flagged, lesson, or gap-analysis entries. gap-analysis runs a knowledge graph health check: isolated nodes, thin communities, dangling edges.",inputSchema:Dd.shape,annotations:p.annotations},J(`knowledge`,async({action:e,...t})=>{try{let n=Dd.parse({action:e,...t}),r=await xf(n.action,n,m);return n.action===`read`?r:await Ad(r,n,d)}catch(e){return e instanceof I.ZodError?q(`VALIDATION`,Id(e)):(Od.error(`Knowledge operation failed`,j(e)),q(`INTERNAL`,`Knowledge operation failed: ${e instanceof Error?e.message:String(e)}`))}}))}const Cf=k(`tools:manipulation`);function wf(e){return e.sources[0]?.path??Ee()}function Tf(e,t){let n=F(t,e),r=Re(t,n);if(r.startsWith(`..`)||Le(r))throw Error(`Path "${e}" escapes workspace root: ${t}`);return n}function Ef(e,t){let n=U(`rename`),r=wf(t);e.registerTool(`rename`,{title:n.title,description:`Rename a symbol across files using whole-word regex matching for exports, imports, and general usage references.`,inputSchema:{old_name:I.string().describe(`Existing symbol name to replace`),new_name:I.string().describe(`New symbol name to use`),root_path:I.string().describe(`Root directory to search within`),extensions:I.array(I.string()).optional().describe(`Optional file extensions to include, such as .ts,.tsx,.js,.jsx`),dry_run:I.boolean().default(!0).describe(`Preview changes without writing files`)},annotations:n.annotations},J(`rename`,async({old_name:e,new_name:t,root_path:n,extensions:i,dry_run:a},o)=>{let s;try{s=Ic(o).createTask(`Rename Symbol`,2),s.progress(0,`Scanning for references`);let c=Tf(n,r);s.progress(1,`Applying renames`);let l=await _n({oldName:e,newName:t,rootPath:c,extensions:i,dryRun:a});return s.complete(`Rename complete`),{content:[{type:`text`,text:JSON.stringify(l)}]}}catch(e){return s?.fail?.(`Rename failed`),Cf.error(`Rename failed`,j(e)),q(`INTERNAL`,`Rename failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Df(e,t){let n=U(`codemod`),r=wf(t);e.registerTool(`codemod`,{title:n.title,description:`Apply regex-based codemod rules across files and return structured before/after changes for each affected line.`,inputSchema:{root_path:I.string().describe(`Root directory to transform within`),rules:I.array(I.object({description:I.string().describe(`What the codemod rule does`),pattern:I.string().describe(`Regex pattern in string form`),replacement:I.string().describe(`Replacement string with optional capture groups`)})).min(1).describe(`Codemod rules to apply`),dry_run:I.boolean().default(!0).describe(`Preview changes without writing files`)},annotations:n.annotations},J(`codemod`,async({root_path:e,rules:t,dry_run:n},i)=>{let a;try{a=Ic(i).createTask(`Codemod`,2),a.progress(0,`Scanning files`);let o=Tf(e,r);a.progress(1,`Applying transforms`);let s=await pt({rootPath:o,rules:t,dryRun:n});return a.complete(`Codemod complete`),{content:[{type:`text`,text:JSON.stringify(s)}]}}catch(e){return a?.fail?.(`Codemod failed`),Cf.error(`Codemod failed`,j(e)),q(`INTERNAL`,`Codemod failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Of={tiny:0,small:1,medium:2,large:3},kf=[`lean`,`balanced`,`rich`],Af=new Set(`a.an.the.is.it.to.and.or.of.in.for.on.with.at.by.from.as.be.has.have.had.was.were.will.would.could.should.may.might.can.do.does.did.not.no.but.if.so.about.into.over.after.before.between.up.down.out.off.under.again.then.once.here.there.when.where.why.how.all.each.every.both.few.more.most.other.some.such.only.own.same.too.very.just.also.now`.split(`.`));function jf(e){return e?e.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean).filter(e=>e.length>0&&!Af.has(e)):[]}function Mf(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Nf(e,t,n){if(n.length===0)return 0;let r=`${e} ${t}`.toLowerCase(),i=0;for(let e of n){let t=Mf(e);RegExp(`\\b${t}\\b`,`i`).test(r)&&i++}return i}function Pf(e,t){let n=[];return e&&n.push(`Flow step match`),t>0&&n.push(`Intent keyword match (${t}/${t})`),n.length===0&&n.push(`Available`),n.join(`, `)}function Ff(e,t,n){let r=n??(e=>Pa[e]),i=jf(e.intent),a=e.capabilities?.includes(`lazy`)??!1,o=[],s=[];for(let n of t){let t=r(n);if(!t){s.push({name:n,reason:`No metadata found`});continue}let c=t.planner;if(!c){s.push({name:n,reason:`No planner descriptor`});continue}if(!e.indexReady&&c.indexDependency===`required`){s.push({name:n,reason:`Index not ready`});continue}if(a&&c.availability===`full-only`){s.push({name:n,reason:`Not available in lazy context`});continue}if(!a&&c.availability===`lazy-only`){s.push({name:n,reason:`Not available in full context`});continue}if(e.readOnly&&c.effect!==`read`){s.push({name:n,reason:`Read-only mode`});continue}if(e.profile&&!c.profileFit.includes(e.profile)){s.push({name:n,reason:`Profile "${e.profile}" not in profileFit`});continue}let l=e.flowStep!==void 0&&c.flowFit.includes(e.flowStep),u=Nf(t.title,c.explain,i);o.push({name:n,title:t.title,reason:Pf(l,u),reasonBreakdown:{flowMatch:l,keywordScore:u,totalKeywords:i.length},budgetClass:c.outputBudget,effect:c.effect,costClass:c.costClass,supportsRef:c.supportsRef,_keywordScore:u,_flowMatch:l})}o.sort((e,t)=>{if(e._flowMatch!==t._flowMatch)return e._flowMatch?-1:1;if(e._keywordScore!==t._keywordScore)return t._keywordScore-e._keywordScore;let n=Of[e.costClass]??99,r=Of[t.costClass]??99;return n===r?e.name.localeCompare(t.name):n-r});let c=o.slice(0,5),l={lean:0,balanced:0,rich:0};for(let e of c)l[e.budgetClass]++;let u=`balanced`;for(let e of kf)l[e]>l[u]&&(u=e);let d=o.length>0?`Consider ${o[0].name} (${o[0].reason})`:`No tools available — all deferred`;return{ranked:o,deferred:s,recommendedBudget:u,nextActionHint:d}}const If=[`list_tools`];function Lf(e,t,n,r){let i=[...new Set(n)].sort();e.registerTool(`list_tools`,{title:U(`list_tools`).title,description:`List the available AI Kit tools with names, titles, and categories.`,inputSchema:{category:I.string().optional().describe(`Optional category filter`),intent:I.string().optional().describe(`Task intent for planner-based ranking hint`),profile:I.string().optional().describe(`Tool profile filter`),readOnly:I.boolean().optional().describe(`Whether read-only mode is active`)},annotations:U(`list_tools`).annotations},async({category:e,intent:t,profile:n,readOnly:a})=>{let o=e?.trim().toLowerCase(),s=i.filter(e=>o?(Pa[e]?.category??[]).some(e=>e.toLowerCase()===o):!0).map(e=>{let t=Pa[e]??{title:e,category:[]},n=t.category?.join(`, `)||`uncategorized`,r=t.planner,i=r?` | cost=${r.costClass} effect=${r.effect} budget=${r.outputBudget}`:``;return`${e}: ${t.title} [${n}]${i}`}).join(`
257
- `)||`No tools matched the filter.`;if(t!==void 0||n!==void 0||a!==void 0){let e=Ff({intent:t,profile:n,readOnly:a??!1,indexReady:r??!0},i),o=[``,`--- Planner ---`];if(e.ranked.length>0&&o.push(`Recommended: ${e.ranked[0].name} (${e.ranked[0].reason})`),o.push(`Budget: ${e.recommendedBudget}`),e.deferred.length>0){let t=e.deferred.map(e=>`${e.name} (${e.reason})`).join(`, `);o.push(`Deferred (${e.deferred.length}): ${t}`)}s+=o.join(`
258
- `)}return{content:[{type:`text`,text:s}]}})}const Rf=k(`server`),zf=de(qn),Bf={"@huggingface/transformers":`4.2.0`,"onnxruntime-common":`1.24.3`,"onnxruntime-node":`1.24.3`};function Vf(e){return e.replace(/\\/g,`/`)}function Hf(e){return process.platform===`win32`?e.replace(/\//g,ze):e}function Uf(){return F(Ie(ue(import.meta.url)),`..`,`..`,`..`)}function Wf(e){return Vf(e).includes(`/_npx/`)}function Gf(e){return/^(1|true)$/i.test(process.env.AIKIT_DISABLE_DEP_REPAIR??``)?!1:/^(1|true)$/i.test(process.env.AIKIT_ALLOW_DEP_REPAIR??``)?!0:Wf(e)}function Kf(e,t){let n=Vf(e),r=`/node_modules/${t}/`,i=n.lastIndexOf(r);if(i<0)return null;let a=i+r.length-1,o=n.slice(0,a),s=o.search(/[A-Za-z]:\/|\//);return s<0?null:Hf(o.slice(s))}function qf(e,t){if(!e)return Bf[t]??`latest`;try{return JSON.parse(N(P(e,`package.json`),`utf8`)).version??Bf[t]??`latest`}catch{return Bf[t]??`latest`}}function Jf(e){let t=Vf(e).toLowerCase();return/(cannot find module|cannot find package|module not found|err_module_not_found)/i.test(e)?t.includes(`@huggingface/transformers`)||t.includes(`transformers.node`)||t.includes(`onnxruntime-common`)||t.includes(`onnxruntime-node`):!1}function Yf(e){if(!Jf(e))return[];let t=Vf(e).toLowerCase(),n=new Map;if(t.includes(`@huggingface/transformers`)){let t=Kf(e,`@huggingface/transformers`);n.set(`@huggingface/transformers`,`@huggingface/transformers@${qf(t,`@huggingface/transformers`)}`)}if(t.includes(`onnxruntime-common`)){let t=Kf(e,`onnxruntime-common`);n.set(`onnxruntime-common`,`onnxruntime-common@${qf(t,`onnxruntime-common`)}`)}if(t.includes(`onnxruntime-node`)){let t=Kf(e,`onnxruntime-node`);n.set(`onnxruntime-node`,`onnxruntime-node@${qf(t,`onnxruntime-node`)}`)}return Array.from(n.values())}function Xf(e){if(!/index\.js/i.test(e)||!Vf(e).includes(`@huggingface`))return!1;let t=Kf(e,`@huggingface/transformers`);if(!t)return!1;let n=P(t,`index.js`),r=P(t,`dist`,`transformers.node.mjs`);return M(n)||!M(r)?!1:(Pe(n,[`// Auto-generated by AI Kit runtime dependency repair.`,`export * from './dist/transformers.node.mjs';`,`export { default } from './dist/transformers.node.mjs';`,``].join(`
259
- `),`utf8`),Rf.info(`Auto-heal: created @huggingface/transformers index.js shim`,{path:n}),!0)}async function Zf(e,t={}){let n=Yf(e),r=t.packageRoot??Uf(),i=Xf(e);if(n.length===0)return{attempted:i,repaired:i,packages:n,reason:i?`created transformer index shim`:`no missing runtime dependency detected`};if(!Gf(r))return{attempted:i,repaired:i,packages:n,reason:`runtime dependency auto-install disabled outside npx cache; set AIKIT_ALLOW_DEP_REPAIR=1 to enable`};let a=process.platform===`win32`?`npm.cmd`:`npm`,o=[`install`,`--no-save`,`--package-lock=false`,`--no-audit`,`--no-fund`,`--omit=dev`,`--prefer-online`,`--ignore-scripts`,...n];Rf.warn(`Auto-heal: repairing missing runtime dependencies`,{packages:n,packageRoot:r});try{return await zf(a,o,{cwd:r,timeout:t.timeoutMs??6e4,windowsHide:!0}),Rf.info(`Auto-heal: runtime dependency repair completed`,{packages:n,packageRoot:r}),{attempted:!0,repaired:!0,packages:n,reason:`npm install repair completed`}}catch(e){let t=e instanceof Error?e.message:String(e);return Rf.warn(`Auto-heal: runtime dependency repair failed`,{packages:n,packageRoot:r,...j(e)}),{attempted:!0,repaired:i,packages:n,reason:i?`created transformer shim but npm repair failed`:`npm repair failed`,error:t}}}const Qf=k(`tools`);let $f=!1;function ep(e){let t=e instanceof Error?e.message:String(e);return Jf(t)||/embedder worker|embedding worker|circuit breaker|timed out|killed|respawn|ipc_channel|epipe|econnreset/i.test(t)}async function tp(e,t,n){try{return await e.embedBatch(t,n)}catch(r){if((await Zf(r instanceof Error?r.message:String(r))).repaired)return e.embedBatch(t,n);throw r}}async function np(e,t,n){for(let r of n.steps)if(!(r.status!==`success`||!r.output))try{let i=Ce(n.path,12),a=`produced/onboard/${r.name}/${i}.md`,o=qe(`sha256`).update(r.output).digest(`hex`).slice(0,16),s=new Date().toISOString(),c=r.output.length>2e3?r.output.split(/(?=^## )/m).filter(e=>e.trim().length>0):[r.output],l=c.map((e,t)=>({id:qe(`sha256`).update(`${a}::${t}`).digest(`hex`).slice(0,16),content:e.trim(),sourcePath:a,contentType:`produced-knowledge`,chunkIndex:t,totalChunks:c.length,startLine:0,endLine:0,fileHash:o,indexedAt:s,origin:`produced`,tags:[`onboard`,r.name],category:`analysis`,version:1})),u=await tp(t,l.map(e=>e.content));await e.upsert(l,u)}catch(e){if(ep(e)){let t=e instanceof Error?e.message:String(e);ge.instance().reportDegraded(`embedder`,t),Qf.warn(`Auto-persist onboard disabled — embedder unavailable`,{stepName:r.name,...j(e)});return}Qf.warn(`Auto-persist onboard step failed`,{stepName:r.name,...j(e)})}}async function rp(e,t,n){if(n.autoRemember?.length)for(let r of n.autoRemember)try{let n=qe(`sha256`).update(`onboard-remember::${r.title}`).digest(`hex`).slice(0,16),i=new Date().toISOString(),a={id:n,content:`# ${r.title}\n\n${r.content}`,sourcePath:`curated/onboard/${r.category}/${n}.md`,contentType:`curated`,chunkIndex:0,totalChunks:1,startLine:0,endLine:0,fileHash:qe(`sha256`).update(r.content).digest(`hex`).slice(0,16),indexedAt:i,origin:`curated`,tags:r.tags,category:r.category,version:1},[o]=await tp(t,[a.content]);await e.upsert([a],[o])}catch(e){if(ep(e)){let t=e instanceof Error?e.message:String(e);ge.instance().reportDegraded(`embedder`,t),Qf.warn(`Auto-persist remember disabled — embedder unavailable`,{title:r.title,...j(e)});return}Qf.warn(`Auto-persist remember entry failed`,{title:r.title,...j(e)})}}function ip(e,t,n,r,i,a,o,s){let c=U(`onboard`);e.registerTool(`onboard`,{title:c.title,description:`Onboard a codebase: run all analyses (structure, deps, symbols, patterns, diagram) and persist to AI Kit memory + ~/.aikit/workspaces/. Also supports explore (context package), trace (BFS traversal), diff (impact analysis), and routes (framework detection) via dedicated modes. Output goes to ~/.aikit/workspaces/<name>/ — never inside the project.`,inputSchema:{path:I.string().describe(`Root path of the codebase to onboard`),mode:I.enum([`memory`,`generate`]).default(`generate`).describe(`Output mode: generate (default) = persist to AI Kit + write workspace files; memory = AI Kit vector store only`),out_dir:I.string().optional().describe(`Custom output directory (default: ~/.aikit/workspaces/<name>/onboard/)`),enrich:I.boolean().default(!0).describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens. Default true for planning tools — set false to save tokens when enrichment is not needed.`),explore:I.string().optional().describe(`Explore mode: given a topic, return entry points, related symbols, and code snippets as a single context package. Uses indexed knowledge from previous onboard.`),trace:I.string().optional().describe(`Trace mode: BFS traversal from a symbol. Returns callers and/or callees.`),direction:I.enum([`callers`,`callees`,`both`]).optional().default(`both`).describe(`Trace direction (default: both).`),maxDepth:I.number().min(1).max(10).optional().default(2).describe(`Trace max traversal depth (default: 2, max: 10).`),diff:I.union([I.boolean(),I.string()]).optional().describe(`Diff mode: analyze git diff for impact assessment. true = auto-detect, string = explicit diff content.`),routes:I.boolean().optional().describe(`Routes mode: detect web framework routes (Express, FastAPI, Django, NestJS).`),framework:I.enum([`express`,`fastify`,`nextjs`]).optional().describe(`Framework to scan for routes. Omit to detect all supported frameworks.`),update:I.boolean().optional().describe(`Incremental update mode: load existing index from ~/.aikit/workspaces/, re-extract changed files, merge.`),detail:I.enum([`summary`,`standard`,`full`]).optional().default(`standard`).describe(`Output detail level: summary (key concepts only), standard (recommended), full (all data).`),language:I.string().optional().describe(`Output language for localized content. Supported: en, zh, ja, ko, ru.`),llm_sampling:I.boolean().default(!1).optional().describe(`Enable LLM-based semantic enrichment (module summaries, architectural roles, tags). Uses the session LLM via MCP sampling.`)},annotations:c.annotations},J(`onboard`,async({path:e,mode:r,out_dir:s,enrich:c,explore:l,trace:u,direction:d,maxDepth:f,diff:p,routes:m,framework:h,update:g,detail:_,language:v,llm_sampling:y},b)=>{try{if($f)return{content:[{type:`text`,text:`Onboard is already running. Please wait for it to complete before starting another.`}]};$f=!0,Qf.info(`Starting onboard`,{path:e,mode:r,explore:l,trace:u,diff:p,routes:m,update:g});let x=await Zt({path:e,mode:r,outDir:s,explore:l,trace:u,direction:d,maxDepth:f,diff:typeof p==`string`?p:p===!0,routes:m,framework:h,update:g,detail:_,language:v,enrich:y??!1,llmCall:y&&o?.available?async(e,t)=>(await o.createMessage({prompt:e,systemPrompt:t,maxTokens:4e3,timeoutMs:6e4,modelPreferences:{intelligencePriority:.8,speedPriority:.5,costPriority:.3}})).text:void 0}),S=Ic(b).createTask(`Onboard`,x.steps.length);for(let e=0;e<x.steps.length;e++){let t=x.steps[e];S.progress(e,`${t.name}: ${t.status}`)}S.complete(`Onboard complete: ${x.steps.filter(e=>e.status===`success`).length}/${x.steps.length} steps succeeded`),np(t,n,x),x.autoRemember?.length&&rp(t,n,x).catch(e=>{Qf.debug(`Auto-persist autoRemember failed`,j(e))}),i&&(i.onboardComplete=!0,i.onboardTimestamp=new Date().toISOString());let C=[`## Onboard Complete`,``,`**Path:** \`${x.path}\``,`**Mode:** ${x.mode}`,`**Duration:** ${x.totalDurationMs}ms`,``];x.outDir&&(C.push(`**Output directory:** \`${x.outDir}\``),C.push(``)),C.push(`### Analysis Results`,``);let w=[],T=[];for(let e of x.steps)e.status===`success`?w.push(`- ✓ **${e.name}** (${e.durationMs}ms) — ${e.output.length} chars`):T.push(`- ✗ **${e.name}** — ${e.error}`);C.push(...w),T.length>0&&C.push(``,`### Failed`,``,...T),C.push(``,`---`,``);for(let e of x.steps)e.status===`success`&&C.push(`### ${e.name}`,``,e.output,``,`---`,``);C.push(`_All results auto-saved to AI Kit memory._`,x.mode===`generate`?` Files written to \`${x.outDir}\`.`:``,' Next: Use `search` to query the knowledge, or `knowledge({ action: "remember", ... })` to add custom insights.');let E=C.join(`
260
- `);if(c&&a){let e=await G(a,{query:`onboard codebase conventions`});E+=K(e)}return{content:[{type:`text`,text:E}]}}catch(e){return Qf.error(`Onboard failed`,j(e)),q(`INTERNAL`,`Onboard failed: ${e instanceof Error?e.message:String(e)}`)}finally{$f=!1}}))}const ap=k(`tools:persistence`);function op(e){let t=U(`queue`);e.registerTool(`queue`,{title:t.title,description:`Manage task queues with optional DAG dependencies. Push items with dependsOn for wave-based execution. Take next, mark done/failed, list queues.`,inputSchema:{action:I.enum([`create`,`push`,`next`,`done`,`fail`,`get`,`list`,`clear`,`delete`,`dag`]).describe(`Queue action`),name:I.string().optional().describe(`Queue name (required for most actions)`),title:I.string().optional().describe(`Item title (required for push)`),id:I.string().optional().describe(`Item ID (required for done/fail)`),data:I.unknown().optional().describe(`Arbitrary data to attach to a queue item`),error:I.string().optional().describe(`Error message (required for fail)`),dependsOn:I.array(I.string()).optional().describe(`Item IDs this task depends on. Dependent items start as blocked until deps complete.`)},annotations:t.annotations},J(`queue`,async({action:e,name:t,title:n,id:r,data:i,error:a,dependsOn:o})=>{try{switch(e){case`create`:if(!t)throw Error(`name is required for create`);return{content:[{type:`text`,text:JSON.stringify(on(t))}]};case`push`:if(!t)throw Error(`name is required for push`);if(!n)throw Error(`title is required for push`);return{content:[{type:`text`,text:JSON.stringify(mn(t,n,i,void 0,o))}]};case`next`:{if(!t)throw Error(`name is required for next`);let e=pn(t);return{content:[{type:`text`,text:JSON.stringify(e)}]}}case`done`:if(!t)throw Error(`name is required for done`);if(!r)throw Error(`id is required for done`);return{content:[{type:`text`,text:JSON.stringify(ln(t,r))}]};case`fail`:if(!t)throw Error(`name is required for fail`);if(!r)throw Error(`id is required for fail`);if(!a)throw Error(`error is required for fail`);return{content:[{type:`text`,text:JSON.stringify(un(t,r,a))}]};case`get`:if(!t)throw Error(`name is required for get`);return{content:[{type:`text`,text:JSON.stringify(dn(t))}]};case`list`:return{content:[{type:`text`,text:JSON.stringify(fn())}]};case`clear`:if(!t)throw Error(`name is required for clear`);return{content:[{type:`text`,text:JSON.stringify({cleared:an(t)})}]};case`delete`:if(!t)throw Error(`name is required for delete`);return{content:[{type:`text`,text:JSON.stringify({deleted:cn(t)})}]};case`dag`:if(!t)throw Error(`name is required for dag`);return{content:[{type:`text`,text:JSON.stringify(sn(t))}]}}}catch(e){return ap.error(`Queue action failed`,j(e)),q(`INTERNAL`,`Queue action failed: ${e instanceof Error?e.message:String(e)}`)}}))}const sp=k(`tools`);function cp(e){let t=[`## Rule: ${e.id}`,``,`- **Status**: ${e.enabled?`enabled`:`disabled`}`,`- **Description**: ${e.description??`—`}`,`- **Category**: ${e.category??`—`}`,`- **Push weight**: ${e.pushWeight??`—`}`];return e.patterns?.length&&t.push(`- **Patterns**: ${e.patterns.join(`, `)}`),e.examples?.length&&t.push(`- **Examples**: ${e.examples.join(`, `)}`),t.join(`
261
- `)}function lp(e,t){let n=U(`er_update_policy`);e.registerTool(`er_update_policy`,{title:n.title,description:`Manage ER push classification rules. Supports listing, updating, creating, and deleting rules that determine when knowledge should be pushed to Enterprise RAG.`,inputSchema:{action:I.enum([`list`,`get`,`update`,`create`,`delete`]).describe(`Action to perform on classification rules`),rule_id:I.string().optional().describe(`Rule ID (required for get, update, delete)`),changes:I.object({patterns:I.array(I.string()).optional(),category:I.string().optional(),pushWeight:I.number().min(0).max(1).optional(),description:I.string().optional(),examples:I.array(I.string()).optional(),enabled:I.boolean().optional()}).optional().describe(`Changes to apply (for update action)`),new_rule:I.object({id:I.string().regex(/^[a-z][a-z0-9-]*$/),patterns:I.array(I.string()).min(1),category:I.string(),pushWeight:I.number().min(0).max(1),description:I.string(),examples:I.array(I.string()).default([]),enabled:I.boolean().default(!0)}).optional().describe(`New rule definition (for create action)`)},annotations:n.annotations},J(`er_update_policy`,async({action:e,rule_id:n,changes:r,new_rule:i})=>{try{if(e===`list`){let e=t.getRules();return{content:[{type:`text`,text:`## Classification Rules\n\n${e.map(e=>`- **${e.id}** (${e.enabled?`enabled`:`disabled`}) — ${e.description}\n Category: ${e.category} | Weight: ${e.pushWeight} | Patterns: ${e.patterns.join(`, `)}`).join(`
262
- `)}\n\n---\n_${e.length} rules total. Use \`action: "update"\` to modify a rule._`}]}}if(e===`get`){if(!n)return q(`VALIDATION`,'`rule_id` is required for "get" action.');let e=t.getRule(n);return e?{content:[{type:`text`,text:cp(e)}]}:q(`NOT_FOUND`,`Rule "${n}" not found.`)}if(e===`update`){if(!n||!r)return q(`VALIDATION`,'`rule_id` and `changes` are required for "update" action.');let e=t.updateRule(n,r);return e?{content:[{type:`text`,text:`${cp(e)}\n\n---\n_Updated. Next: Use \`action: "list"\` to verify._`}]}:q(`NOT_FOUND`,`Rule "${n}" not found.`)}return e===`create`?i?{content:[{type:`text`,text:`${cp(t.addRule(i))}\n\n---\n_Created. Next: Test classification with \`remember\`._`}]}:q(`VALIDATION`,'`new_rule` is required for "create" action.'):e===`delete`?n?t.deleteRule(n)?{content:[{type:`text`,text:`Deleted rule **${n}**.\n\n---\n_Next: Use \`action: "list"\` to verify._`}]}:q(`NOT_FOUND`,`Rule "${n}" not found.`):q(`VALIDATION`,'`rule_id` is required for "delete" action.'):q(`VALIDATION`,`Unknown action: ${e}`)}catch(e){return sp.error(`Policy update failed`,j(e)),q(`INTERNAL`,`Policy update failed: ${e instanceof Error?e.message:String(e)}`)}}))}const up=new Map([{type:`markdown`,category:`content`,description:`Markdown content rendered with the marked parser.`,valueShape:`string`,relevantSkills:[`present`,`docs`]},{type:`code`,category:`content`,description:`Formatted code block rendered inside pre/code tags.`,valueShape:`string`,relevantSkills:[`present`,`docs`]},{type:`mermaid`,category:`visualization`,description:`Mermaid diagram source rendered in a mermaid pre block.`,valueShape:`string`,vendorScripts:[`mermaid`],relevantSkills:[`present`,`c4-architecture`,`docs`]},{type:`architecture-diagram`,category:`visualization`,description:`Architecture diagram with positioned components, connections, and boundary groups. Produces SVG with mermaid rendering.`,vendorScripts:[`mermaid`],valueShape:`object ({ components, connections, boundaries? })`,since:`1.0`,relevantSkills:[`present`,`c4-architecture`,`onboard`],usageExample:`{
254
+ `),{content:[{type:`text`,text:y.summary}],isError:!1,report:y}}catch(e){return{content:[{type:`text`,text:`Gap analysis failed: ${e instanceof Error?e.message:j(e)}`}],isError:!0,report:null}}}async function _f(e,{curated:t,stateStore:r,resourceNotifier:i}){let a=Wd(e),{title:o,context:s,insight:c,evidence:l,confidence:u,tags:d}=xd.parse(a);try{let e=Kd(o,await t.list({category:`lessons`}));if(e)return{content:[{type:`text`,text:`Similar lesson already exists at \`${e.path}\`: **${e.title}** (${(e.similarity*100).toFixed(0)}% similar).\n\nUse \`confirm\` or \`contradict\` on the existing lesson instead of creating a duplicate.`}],structuredContent:{conflict:`duplicate`,existingPath:e.path,existingTitle:e.title,similarity:e.similarity}}}catch{}let f=n({title:o,context:s,insight:c,evidence:l,confidence:u,tags:d}),p=await t.remember(o,f,`lessons`,zd(d));return Bd(r,p.path,u),i&&i.notifyAfterCuratedWrite(p.path).catch(()=>{}),{content:[{type:`text`,text:`Recorded lesson: **${o}**\n\nStored at \`.ai/curated/${p.path}\` with confidence ${u}/100.`}],structuredContent:{path:p.path,confidence:u,category:`lessons`,tags:zd(d)}}}async function vf(e,t,n){let{curated:r,stateStore:i,resourceNotifier:a,retentionConfig:o,consolidationConfig:s,lessonConfig:l}=n,u=Sd.parse(e);if(t===`contradict`&&!u.reason)throw new I.ZodError([{code:`custom`,path:[`reason`],message:`reason is required`}]);let d=Rd(u.path,u.id),f=v(l??c);i&&Md(i,d,o,s);let{entry:p,confidence:m}=await Ud(r,i,d),g=h(m,t,f),_=b(p.content,g),y=t===`confirm`?u.reason??`Confirmed lesson confidence`:`Contradicted lesson confidence: ${u.reason}`,x=await r.update(d,_,y);return i&&i.memoryMetaUpdateConfidence(d,g),a&&a.notifyAfterCuratedWrite(d).catch(()=>{}),{content:[{type:`text`,text:`${t===`confirm`?`Confirmed`:`Contradicted`} lesson: \`${d}\`\n\nConfidence ${m}/100 → ${g}/100.`}],structuredContent:{path:x.path,confidence:g,previousConfidence:m,version:x.version}}}async function yf(e,{curated:t,stateStore:n,lessonConfig:r}){let{topic:i,minConfidence:a,tag:s,tags:l,sortBy:u,includeArchived:f,limit:p,offset:m}=Cd.parse(e),h=zd([...l??[],...s?[s]:[]]),g=v(r??c),_=Math.max(p+m,500),y=await t.listPage({category:`lessons`,...s?{tag:s}:{},limit:_,orderBy:`updated`,order:`desc`}),b=y.entries,x=await Promise.all(b.filter(e=>e.tags.includes(`lesson`)).map(async e=>{let{entry:r,confidence:i,meta:a}=await Ud(t,n,e.path),s=a??n?.memoryMetaGet(e.path);s&&s.supersededBy===null&&o(s,g)&&n?.memoryMetaSetSuperseded(e.path,d);let c=n?.memoryMetaGet(e.path)??s,l=c?.createdAt??e.created,u=c?.confidence??i,f=ce(u,c?.lastAccessedAt,l,g),p=c?.lastAccessedAt??c?.createdAt??null;return{path:e.path,title:e.title,category:e.category,tags:e.tags,version:e.version,preview:e.contentPreview,content:r.content,confidence:f,storedConfidence:u,createdAt:l,lastAccessedAt:c?.lastAccessedAt??null,recency:p,archived:c?.supersededBy===d,supersededBy:c?.supersededBy??null}})),S=x.filter(e=>e.archived).length,C=x.filter(e=>f?!0:e.supersededBy===null).filter(e=>a===void 0?!0:e.confidence>=a).filter(e=>h.length===0?!0:h.every(t=>e.tags.includes(t))).filter(e=>!i||`${e.title}\n${e.preview}\n${e.tags.join(` `)}`.toLowerCase().includes(i.toLowerCase())?!0:e.content?e.content.toLowerCase().includes(i.toLowerCase()):!1).sort((e,t)=>u===`recent`?Date.parse(t.recency??``)-Date.parse(e.recency??``)||t.confidence-e.confidence:t.confidence-e.confidence||Date.parse(t.recency??``)-Date.parse(e.recency??``)),w=C.slice(m,m+p);if(C.forEach(e=>{Vd(n,e.path,e.storedConfidence,g)}),w.length===0)return{content:[{type:`text`,text:`No lessons matched the requested filters.`}],structuredContent:{entries:[],totalCount:C.length,scannedCount:x.length,limit:p,offset:m,hasMore:C.length>m+p||y.hasMore,archivedCount:S}};let T=w.map(e=>{let t=e.recency?` | recent ${e.recency}`:``;return`- **${e.title}** (${e.confidence}/100)${t}\n \`${e.path}\` — ${e.preview.slice(0,80)}…`}).join(`
255
+ `);return{content:[{type:`text`,text:`## Lessons (${w.length} of ${C.length})\n\n${T}`}],structuredContent:{entries:w.map(({storedConfidence:e,...t})=>t),totalCount:C.length,scannedCount:x.length,limit:p,offset:m,hasMore:C.length>m+p||y.hasMore,archivedCount:S}}}async function bf(e,{curated:t,stateStore:r,resourceNotifier:i}){let{bufferPath:a}=wd.parse(e),o=await Gd(a);if(!o)return{content:[{type:`text`,text:`No observation buffer found for auto-observe.`}],structuredContent:{bufferPath:null,observations:0,createdCount:0,skippedCount:0,candidates:[]}};let s=ui(N(o,`utf8`)),c=li(s,Lr),l=await t.list({category:`lessons`}),u=[],d=[];try{for(let e of c){let a=Kd(e.title,l);if(a){d.push({title:e.title,path:a.path,similarity:a.similarity});continue}let o=n({title:e.title,context:e.context,insight:e.insight,evidence:e.evidence,confidence:e.confidence,tags:e.tags}),s=await t.remember(e.title,o,`lessons`,zd(e.tags));Bd(r,s.path,e.confidence),u.push({path:s.path,title:e.title,detector:e.detector}),l.push({path:s.path,title:e.title,category:`lessons`,tags:zd(e.tags),version:1,created:new Date().toISOString(),updated:new Date().toISOString(),contentPreview:e.insight}),i&&i.notifyAfterCuratedWrite(s.path).catch(()=>{})}}finally{try{Ne(o)}catch{}}let f=[`Auto-observe processed ${s.length} observations from \`${o}\`.`,`Created ${u.length} lessons and skipped ${d.length} duplicates from ${c.length} candidates.`];return u.length>0&&(f.push(``,`Created:`),f.push(...u.map(e=>`- **${e.title}** (${e.path})`))),d.length>0&&(f.push(``,`Skipped:`),f.push(...d.map(e=>`- **${e.title}** matched ${e.path} (${e.similarity.toFixed(2)})`))),{content:[{type:`text`,text:f.join(`
256
+ `)}],structuredContent:{bufferPath:o,observations:s.length,createdCount:u.length,skippedCount:d.length,candidates:c.map(e=>({title:e.title,detector:e.detector,confidence:e.confidence,tags:e.tags})),created:u,skipped:d}}}async function xf(e,t){switch(e.subAction??`create`){case`create`:return _f(e,t);case`confirm`:return vf(e,`confirm`,t);case`contradict`:return vf(e,`contradict`,t);case`list-lessons`:return yf(e,t);case`auto-observe`:return bf(e,t);case`prune`:{if(!t.stateStore)return q(`VALIDATION`,`StateStore required for lesson/prune`);let n=Td.parse(e),i=await r(t.curated,t.stateStore,{maxConfidence:n.maxConfidence,minIdleDays:n.minIdleDays,safetyDays:n.safetyDays,maxPrune:n.maxPrune,dryRun:n.dryRun},t.lessonConfig?v(t.lessonConfig):c);return{content:[{type:`text`,text:qd(i)}],structuredContent:i}}case`group`:{if(!t.stateStore)return q(`VALIDATION`,`StateStore required for lesson/group`);let n=Ed.parse(e),r=await g(t.curated,t.stateStore,{similarityThreshold:n.similarityThreshold,minGroupSize:n.minGroupSize,maxGroups:n.maxGroups,dryRun:n.dryRun});return{content:[{type:`text`,text:Jd(r)}],structuredContent:r}}case`promote`:{if(!we())return{content:[{type:`text`,text:`Promotion requires user-level install (not workspace-scoped).`}]};let n=Dd.parse(e),r={minWorkspaces:n.minWorkspaces??E.minWorkspaces,minAvgConfidence:n.minAvgConfidence??E.minAvgConfidence,similarityThreshold:n.similarityThreshold??E.similarityThreshold,dryRun:n.dryRun},i=await se(S(await T(),r),Yd(t.curated,oe()),r);return{content:[{type:`text`,text:Xd(i,r.dryRun)}],structuredContent:i}}case`demote`:{if(!we())return{content:[{type:`text`,text:`Demotion requires user-level install.`}]};let n=Rd(e.path,e.id);if(!n)return{content:[{type:`text`,text:`Missing required "path" or "id" parameter for demote.`}]};let r=await x(Yd(t.curated,oe()),n);return{content:[{type:`text`,text:r.removed?`Demoted: ${n}`:`Not found in global: ${n}`}],structuredContent:r}}}}async function Sf(e,t,n){switch(e){case`remember`:return Zd(t,n);case`read`:return Qd(t,n);case`update`:return $d(t,n);case`forget`:return ef(t,n);case`list`:return tf(t,n);case`history`:return nf(t,n);case`diff`:return rf(t,n);case`recover`:return af(t,n);case`orphaned`:return of(t,n);case`withdraw`:return mf(t,n);case`flush`:return hf(t,n);case`flagged`:return sf(t,n);case`lesson`:return xf(t,n);case`gap-analysis`:return n.graphStore?gf(n.graphStore):{content:[{type:`text`,text:`Gap analysis requires a graph store (not available).`}],isError:!0}}}function Cf(e,t,n,r,i,a,o,s,c,l,u,d,f){let p=U(`knowledge`),m={curated:t,policyStore:n,evolutionCollector:r,resourceNotifier:i,flowContextAdapter:a,stateStore:o,retentionConfig:s,consolidationConfig:l,supersessionConfig:c,lessonConfig:u,graphStore:f};e.registerTool(`knowledge`,{title:p.title,description:"Operate on curated knowledge entries with a single tool. Use `action` to remember, read, update, forget, list, history, diff, recover, orphaned, withdraw, flush, flagged, lesson, or gap-analysis entries. gap-analysis runs a knowledge graph health check: isolated nodes, thin communities, dangling edges.",inputSchema:Od.shape,annotations:p.annotations},J(`knowledge`,async({action:e,...t})=>{try{let n=Od.parse({action:e,...t}),r=await Sf(n.action,n,m);return n.action===`read`?r:await jd(r,n,d)}catch(e){return e instanceof I.ZodError?q(`VALIDATION`,Ld(e)):(kd.error(`Knowledge operation failed`,j(e)),q(`INTERNAL`,`Knowledge operation failed: ${e instanceof Error?e.message:String(e)}`))}}))}const wf=k(`tools:manipulation`);function Tf(e){return e.sources[0]?.path??Ee()}function Ef(e,t){let n=F(t,e),r=Re(t,n);if(r.startsWith(`..`)||Le(r))throw Error(`Path "${e}" escapes workspace root: ${t}`);return n}function Df(e,t){let n=U(`rename`),r=Tf(t);e.registerTool(`rename`,{title:n.title,description:`Rename a symbol across files using whole-word regex matching for exports, imports, and general usage references.`,inputSchema:{old_name:I.string().describe(`Existing symbol name to replace`),new_name:I.string().describe(`New symbol name to use`),root_path:I.string().describe(`Root directory to search within`),extensions:I.array(I.string()).optional().describe(`Optional file extensions to include, such as .ts,.tsx,.js,.jsx`),dry_run:I.boolean().default(!0).describe(`Preview changes without writing files`)},annotations:n.annotations},J(`rename`,async({old_name:e,new_name:t,root_path:n,extensions:i,dry_run:a},o)=>{let s;try{s=Lc(o).createTask(`Rename Symbol`,2),s.progress(0,`Scanning for references`);let c=Ef(n,r);s.progress(1,`Applying renames`);let l=await _n({oldName:e,newName:t,rootPath:c,extensions:i,dryRun:a});return s.complete(`Rename complete`),{content:[{type:`text`,text:JSON.stringify(l)}]}}catch(e){return s?.fail?.(`Rename failed`),wf.error(`Rename failed`,j(e)),q(`INTERNAL`,`Rename failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Of(e,t){let n=U(`codemod`),r=Tf(t);e.registerTool(`codemod`,{title:n.title,description:`Apply regex-based codemod rules across files and return structured before/after changes for each affected line.`,inputSchema:{root_path:I.string().describe(`Root directory to transform within`),rules:I.array(I.object({description:I.string().describe(`What the codemod rule does`),pattern:I.string().describe(`Regex pattern in string form`),replacement:I.string().describe(`Replacement string with optional capture groups`)})).min(1).describe(`Codemod rules to apply`),dry_run:I.boolean().default(!0).describe(`Preview changes without writing files`)},annotations:n.annotations},J(`codemod`,async({root_path:e,rules:t,dry_run:n},i)=>{let a;try{a=Lc(i).createTask(`Codemod`,2),a.progress(0,`Scanning files`);let o=Ef(e,r);a.progress(1,`Applying transforms`);let s=await pt({rootPath:o,rules:t,dryRun:n});return a.complete(`Codemod complete`),{content:[{type:`text`,text:JSON.stringify(s)}]}}catch(e){return a?.fail?.(`Codemod failed`),wf.error(`Codemod failed`,j(e)),q(`INTERNAL`,`Codemod failed: ${e instanceof Error?e.message:String(e)}`)}}))}const kf={tiny:0,small:1,medium:2,large:3},Af=[`lean`,`balanced`,`rich`],jf=new Set(`a.an.the.is.it.to.and.or.of.in.for.on.with.at.by.from.as.be.has.have.had.was.were.will.would.could.should.may.might.can.do.does.did.not.no.but.if.so.about.into.over.after.before.between.up.down.out.off.under.again.then.once.here.there.when.where.why.how.all.each.every.both.few.more.most.other.some.such.only.own.same.too.very.just.also.now`.split(`.`));function Mf(e){return e?e.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean).filter(e=>e.length>0&&!jf.has(e)):[]}function Nf(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Pf(e,t,n){if(n.length===0)return 0;let r=`${e} ${t}`.toLowerCase(),i=0;for(let e of n){let t=Nf(e);RegExp(`\\b${t}\\b`,`i`).test(r)&&i++}return i}function Ff(e,t){let n=[];return e&&n.push(`Flow step match`),t>0&&n.push(`Intent keyword match (${t}/${t})`),n.length===0&&n.push(`Available`),n.join(`, `)}function If(e,t,n){let r=n??(e=>Fa[e]),i=Mf(e.intent),a=e.capabilities?.includes(`lazy`)??!1,o=[],s=[];for(let n of t){let t=r(n);if(!t){s.push({name:n,reason:`No metadata found`});continue}let c=t.planner;if(!c){s.push({name:n,reason:`No planner descriptor`});continue}if(!e.indexReady&&c.indexDependency===`required`){s.push({name:n,reason:`Index not ready`});continue}if(a&&c.availability===`full-only`){s.push({name:n,reason:`Not available in lazy context`});continue}if(!a&&c.availability===`lazy-only`){s.push({name:n,reason:`Not available in full context`});continue}if(e.readOnly&&c.effect!==`read`){s.push({name:n,reason:`Read-only mode`});continue}if(e.profile&&!c.profileFit.includes(e.profile)){s.push({name:n,reason:`Profile "${e.profile}" not in profileFit`});continue}let l=e.flowStep!==void 0&&c.flowFit.includes(e.flowStep),u=Pf(t.title,c.explain,i);o.push({name:n,title:t.title,reason:Ff(l,u),reasonBreakdown:{flowMatch:l,keywordScore:u,totalKeywords:i.length},budgetClass:c.outputBudget,effect:c.effect,costClass:c.costClass,supportsRef:c.supportsRef,_keywordScore:u,_flowMatch:l})}o.sort((e,t)=>{if(e._flowMatch!==t._flowMatch)return e._flowMatch?-1:1;if(e._keywordScore!==t._keywordScore)return t._keywordScore-e._keywordScore;let n=kf[e.costClass]??99,r=kf[t.costClass]??99;return n===r?e.name.localeCompare(t.name):n-r});let c=o.slice(0,5),l={lean:0,balanced:0,rich:0};for(let e of c)l[e.budgetClass]++;let u=`balanced`;for(let e of Af)l[e]>l[u]&&(u=e);let d=o.length>0?`Consider ${o[0].name} (${o[0].reason})`:`No tools available — all deferred`;return{ranked:o,deferred:s,recommendedBudget:u,nextActionHint:d}}const Lf=[`list_tools`];function Rf(e,t,n,r){let i=[...new Set(n)].sort();e.registerTool(`list_tools`,{title:U(`list_tools`).title,description:`List the available AI Kit tools with names, titles, and categories.`,inputSchema:{category:I.string().optional().describe(`Optional category filter`),intent:I.string().optional().describe(`Task intent for planner-based ranking hint`),profile:I.string().optional().describe(`Tool profile filter`),readOnly:I.boolean().optional().describe(`Whether read-only mode is active`)},annotations:U(`list_tools`).annotations},async({category:e,intent:t,profile:n,readOnly:a})=>{let o=e?.trim().toLowerCase(),s=i.filter(e=>o?(Fa[e]?.category??[]).some(e=>e.toLowerCase()===o):!0).map(e=>{let t=Fa[e]??{title:e,category:[]},n=t.category?.join(`, `)||`uncategorized`,r=t.planner,i=r?` | cost=${r.costClass} effect=${r.effect} budget=${r.outputBudget}`:``;return`${e}: ${t.title} [${n}]${i}`}).join(`
257
+ `)||`No tools matched the filter.`;if(t!==void 0||n!==void 0||a!==void 0){let e=If({intent:t,profile:n,readOnly:a??!1,indexReady:r??!0},i),o=[``,`--- Planner ---`];if(e.ranked.length>0&&o.push(`Recommended: ${e.ranked[0].name} (${e.ranked[0].reason})`),o.push(`Budget: ${e.recommendedBudget}`),e.deferred.length>0){let t=e.deferred.map(e=>`${e.name} (${e.reason})`).join(`, `);o.push(`Deferred (${e.deferred.length}): ${t}`)}s+=o.join(`
258
+ `)}return{content:[{type:`text`,text:s}]}})}const zf=k(`server`),Bf=de(qn),Vf={"@huggingface/transformers":`4.2.0`,"onnxruntime-common":`1.24.3`,"onnxruntime-node":`1.24.3`};function Hf(e){return e.replace(/\\/g,`/`)}function Uf(e){return process.platform===`win32`?e.replace(/\//g,ze):e}function Wf(){return F(Ie(ue(import.meta.url)),`..`,`..`,`..`)}function Gf(e){return Hf(e).includes(`/_npx/`)}function Kf(e){return/^(1|true)$/i.test(process.env.AIKIT_DISABLE_DEP_REPAIR??``)?!1:/^(1|true)$/i.test(process.env.AIKIT_ALLOW_DEP_REPAIR??``)?!0:Gf(e)}function qf(e,t){let n=Hf(e),r=`/node_modules/${t}/`,i=n.lastIndexOf(r);if(i<0)return null;let a=i+r.length-1,o=n.slice(0,a),s=o.search(/[A-Za-z]:\/|\//);return s<0?null:Uf(o.slice(s))}function Jf(e,t){if(!e)return Vf[t]??`latest`;try{return JSON.parse(N(P(e,`package.json`),`utf8`)).version??Vf[t]??`latest`}catch{return Vf[t]??`latest`}}function Yf(e){let t=Hf(e).toLowerCase();return/(cannot find module|cannot find package|module not found|err_module_not_found)/i.test(e)?t.includes(`@huggingface/transformers`)||t.includes(`transformers.node`)||t.includes(`onnxruntime-common`)||t.includes(`onnxruntime-node`):!1}function Xf(e){if(!Yf(e))return[];let t=Hf(e).toLowerCase(),n=new Map;if(t.includes(`@huggingface/transformers`)){let t=qf(e,`@huggingface/transformers`);n.set(`@huggingface/transformers`,`@huggingface/transformers@${Jf(t,`@huggingface/transformers`)}`)}if(t.includes(`onnxruntime-common`)){let t=qf(e,`onnxruntime-common`);n.set(`onnxruntime-common`,`onnxruntime-common@${Jf(t,`onnxruntime-common`)}`)}if(t.includes(`onnxruntime-node`)){let t=qf(e,`onnxruntime-node`);n.set(`onnxruntime-node`,`onnxruntime-node@${Jf(t,`onnxruntime-node`)}`)}return Array.from(n.values())}function Zf(e){if(!/index\.js/i.test(e)||!Hf(e).includes(`@huggingface`))return!1;let t=qf(e,`@huggingface/transformers`);if(!t)return!1;let n=P(t,`index.js`),r=P(t,`dist`,`transformers.node.mjs`);return M(n)||!M(r)?!1:(Pe(n,[`// Auto-generated by AI Kit runtime dependency repair.`,`export * from './dist/transformers.node.mjs';`,`export { default } from './dist/transformers.node.mjs';`,``].join(`
259
+ `),`utf8`),zf.info(`Auto-heal: created @huggingface/transformers index.js shim`,{path:n}),!0)}async function Qf(e,t={}){let n=Xf(e),r=t.packageRoot??Wf(),i=Zf(e);if(n.length===0)return{attempted:i,repaired:i,packages:n,reason:i?`created transformer index shim`:`no missing runtime dependency detected`};if(!Kf(r))return{attempted:i,repaired:i,packages:n,reason:`runtime dependency auto-install disabled outside npx cache; set AIKIT_ALLOW_DEP_REPAIR=1 to enable`};let a=process.platform===`win32`?`npm.cmd`:`npm`,o=[`install`,`--no-save`,`--package-lock=false`,`--no-audit`,`--no-fund`,`--omit=dev`,`--prefer-online`,`--ignore-scripts`,...n];zf.warn(`Auto-heal: repairing missing runtime dependencies`,{packages:n,packageRoot:r});try{return await Bf(a,o,{cwd:r,timeout:t.timeoutMs??6e4,windowsHide:!0}),zf.info(`Auto-heal: runtime dependency repair completed`,{packages:n,packageRoot:r}),{attempted:!0,repaired:!0,packages:n,reason:`npm install repair completed`}}catch(e){let t=e instanceof Error?e.message:String(e);return zf.warn(`Auto-heal: runtime dependency repair failed`,{packages:n,packageRoot:r,...j(e)}),{attempted:!0,repaired:i,packages:n,reason:i?`created transformer shim but npm repair failed`:`npm repair failed`,error:t}}}const $f=k(`tools`);let ep=!1;function tp(e){let t=e instanceof Error?e.message:String(e);return Yf(t)||/embedder worker|embedding worker|circuit breaker|timed out|killed|respawn|ipc_channel|epipe|econnreset/i.test(t)}async function np(e,t,n){try{return await e.embedBatch(t,n)}catch(r){if((await Qf(r instanceof Error?r.message:String(r))).repaired)return e.embedBatch(t,n);throw r}}async function rp(e,t,n){for(let r of n.steps)if(!(r.status!==`success`||!r.output))try{let i=Ce(n.path,12),a=`produced/onboard/${r.name}/${i}.md`,o=qe(`sha256`).update(r.output).digest(`hex`).slice(0,16),s=new Date().toISOString(),c=r.output.length>2e3?r.output.split(/(?=^## )/m).filter(e=>e.trim().length>0):[r.output],l=c.map((e,t)=>({id:qe(`sha256`).update(`${a}::${t}`).digest(`hex`).slice(0,16),content:e.trim(),sourcePath:a,contentType:`produced-knowledge`,chunkIndex:t,totalChunks:c.length,startLine:0,endLine:0,fileHash:o,indexedAt:s,origin:`produced`,tags:[`onboard`,r.name],category:`analysis`,version:1})),u=await np(t,l.map(e=>e.content));await e.upsert(l,u)}catch(e){if(tp(e)){let t=e instanceof Error?e.message:String(e);ge.instance().reportDegraded(`embedder`,t),$f.warn(`Auto-persist onboard disabled — embedder unavailable`,{stepName:r.name,...j(e)});return}$f.warn(`Auto-persist onboard step failed`,{stepName:r.name,...j(e)})}}async function ip(e,t,n){if(n.autoRemember?.length)for(let r of n.autoRemember)try{let n=qe(`sha256`).update(`onboard-remember::${r.title}`).digest(`hex`).slice(0,16),i=new Date().toISOString(),a={id:n,content:`# ${r.title}\n\n${r.content}`,sourcePath:`curated/onboard/${r.category}/${n}.md`,contentType:`curated`,chunkIndex:0,totalChunks:1,startLine:0,endLine:0,fileHash:qe(`sha256`).update(r.content).digest(`hex`).slice(0,16),indexedAt:i,origin:`curated`,tags:r.tags,category:r.category,version:1},[o]=await np(t,[a.content]);await e.upsert([a],[o])}catch(e){if(tp(e)){let t=e instanceof Error?e.message:String(e);ge.instance().reportDegraded(`embedder`,t),$f.warn(`Auto-persist remember disabled — embedder unavailable`,{title:r.title,...j(e)});return}$f.warn(`Auto-persist remember entry failed`,{title:r.title,...j(e)})}}function ap(e,t,n,r,i,a,o,s){let c=U(`onboard`);e.registerTool(`onboard`,{title:c.title,description:`Onboard a codebase: run all analyses (structure, deps, symbols, patterns, diagram) and persist to AI Kit memory + ~/.aikit/workspaces/. Also supports explore (context package), trace (BFS traversal), diff (impact analysis), and routes (framework detection) via dedicated modes. Output goes to ~/.aikit/workspaces/<name>/ — never inside the project.`,inputSchema:{path:I.string().describe(`Root path of the codebase to onboard`),mode:I.enum([`memory`,`generate`]).default(`generate`).describe(`Output mode: generate (default) = persist to AI Kit + write workspace files; memory = AI Kit vector store only`),out_dir:I.string().optional().describe(`Custom output directory (default: ~/.aikit/workspaces/<name>/onboard/)`),enrich:I.boolean().default(!0).describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens. Default true for planning tools — set false to save tokens when enrichment is not needed.`),explore:I.string().optional().describe(`Explore mode: given a topic, return entry points, related symbols, and code snippets as a single context package. Uses indexed knowledge from previous onboard.`),trace:I.string().optional().describe(`Trace mode: BFS traversal from a symbol. Returns callers and/or callees.`),direction:I.enum([`callers`,`callees`,`both`]).optional().default(`both`).describe(`Trace direction (default: both).`),maxDepth:I.number().min(1).max(10).optional().default(2).describe(`Trace max traversal depth (default: 2, max: 10).`),diff:I.union([I.boolean(),I.string()]).optional().describe(`Diff mode: analyze git diff for impact assessment. true = auto-detect, string = explicit diff content.`),routes:I.boolean().optional().describe(`Routes mode: detect web framework routes (Express, FastAPI, Django, NestJS).`),framework:I.enum([`express`,`fastify`,`nextjs`]).optional().describe(`Framework to scan for routes. Omit to detect all supported frameworks.`),update:I.boolean().optional().describe(`Incremental update mode: load existing index from ~/.aikit/workspaces/, re-extract changed files, merge.`),detail:I.enum([`summary`,`standard`,`full`]).optional().default(`standard`).describe(`Output detail level: summary (key concepts only), standard (recommended), full (all data).`),language:I.string().optional().describe(`Output language for localized content. Supported: en, zh, ja, ko, ru.`),llm_sampling:I.boolean().default(!1).optional().describe(`Enable LLM-based semantic enrichment (module summaries, architectural roles, tags). Uses the session LLM via MCP sampling.`)},annotations:c.annotations},J(`onboard`,async({path:e,mode:r,out_dir:s,enrich:c,explore:l,trace:u,direction:d,maxDepth:f,diff:p,routes:m,framework:h,update:g,detail:_,language:v,llm_sampling:y},b)=>{try{if(ep)return{content:[{type:`text`,text:`Onboard is already running. Please wait for it to complete before starting another.`}]};ep=!0,$f.info(`Starting onboard`,{path:e,mode:r,explore:l,trace:u,diff:p,routes:m,update:g});let x=await Zt({path:e,mode:r,outDir:s,explore:l,trace:u,direction:d,maxDepth:f,diff:typeof p==`string`?p:p===!0,routes:m,framework:h,update:g,detail:_,language:v,enrich:y??!1,llmCall:y&&o?.available?async(e,t)=>(await o.createMessage({prompt:e,systemPrompt:t,maxTokens:4e3,timeoutMs:6e4,modelPreferences:{intelligencePriority:.8,speedPriority:.5,costPriority:.3}})).text:void 0}),S=Lc(b).createTask(`Onboard`,x.steps.length);for(let e=0;e<x.steps.length;e++){let t=x.steps[e];S.progress(e,`${t.name}: ${t.status}`)}S.complete(`Onboard complete: ${x.steps.filter(e=>e.status===`success`).length}/${x.steps.length} steps succeeded`),rp(t,n,x),x.autoRemember?.length&&ip(t,n,x).catch(e=>{$f.debug(`Auto-persist autoRemember failed`,j(e))}),i&&(i.onboardComplete=!0,i.onboardTimestamp=new Date().toISOString());let C=[`## Onboard Complete`,``,`**Path:** \`${x.path}\``,`**Mode:** ${x.mode}`,`**Duration:** ${x.totalDurationMs}ms`,``];x.outDir&&(C.push(`**Output directory:** \`${x.outDir}\``),C.push(``)),C.push(`### Analysis Results`,``);let w=[],T=[];for(let e of x.steps)e.status===`success`?w.push(`- ✓ **${e.name}** (${e.durationMs}ms) — ${e.output.length} chars`):T.push(`- ✗ **${e.name}** — ${e.error}`);C.push(...w),T.length>0&&C.push(``,`### Failed`,``,...T),C.push(``,`---`,``);for(let e of x.steps)e.status===`success`&&C.push(`### ${e.name}`,``,e.output,``,`---`,``);C.push(`_All results auto-saved to AI Kit memory._`,x.mode===`generate`?` Files written to \`${x.outDir}\`.`:``,' Next: Use `search` to query the knowledge, or `knowledge({ action: "remember", ... })` to add custom insights.');let E=C.join(`
260
+ `);if(c&&a){let e=await G(a,{query:`onboard codebase conventions`});E+=K(e)}return{content:[{type:`text`,text:E}]}}catch(e){return $f.error(`Onboard failed`,j(e)),q(`INTERNAL`,`Onboard failed: ${e instanceof Error?e.message:String(e)}`)}finally{ep=!1}}))}const op=k(`tools:persistence`);function sp(e){let t=U(`queue`);e.registerTool(`queue`,{title:t.title,description:`Manage task queues with optional DAG dependencies. Push items with dependsOn for wave-based execution. Take next, mark done/failed, list queues.`,inputSchema:{action:I.enum([`create`,`push`,`next`,`done`,`fail`,`get`,`list`,`clear`,`delete`,`dag`]).describe(`Queue action`),name:I.string().optional().describe(`Queue name (required for most actions)`),title:I.string().optional().describe(`Item title (required for push)`),id:I.string().optional().describe(`Item ID (required for done/fail)`),data:I.unknown().optional().describe(`Arbitrary data to attach to a queue item`),error:I.string().optional().describe(`Error message (required for fail)`),dependsOn:I.array(I.string()).optional().describe(`Item IDs this task depends on. Dependent items start as blocked until deps complete.`)},annotations:t.annotations},J(`queue`,async({action:e,name:t,title:n,id:r,data:i,error:a,dependsOn:o})=>{try{switch(e){case`create`:if(!t)throw Error(`name is required for create`);return{content:[{type:`text`,text:JSON.stringify(on(t))}]};case`push`:if(!t)throw Error(`name is required for push`);if(!n)throw Error(`title is required for push`);return{content:[{type:`text`,text:JSON.stringify(mn(t,n,i,void 0,o))}]};case`next`:{if(!t)throw Error(`name is required for next`);let e=pn(t);return{content:[{type:`text`,text:JSON.stringify(e)}]}}case`done`:if(!t)throw Error(`name is required for done`);if(!r)throw Error(`id is required for done`);return{content:[{type:`text`,text:JSON.stringify(ln(t,r))}]};case`fail`:if(!t)throw Error(`name is required for fail`);if(!r)throw Error(`id is required for fail`);if(!a)throw Error(`error is required for fail`);return{content:[{type:`text`,text:JSON.stringify(un(t,r,a))}]};case`get`:if(!t)throw Error(`name is required for get`);return{content:[{type:`text`,text:JSON.stringify(dn(t))}]};case`list`:return{content:[{type:`text`,text:JSON.stringify(fn())}]};case`clear`:if(!t)throw Error(`name is required for clear`);return{content:[{type:`text`,text:JSON.stringify({cleared:an(t)})}]};case`delete`:if(!t)throw Error(`name is required for delete`);return{content:[{type:`text`,text:JSON.stringify({deleted:cn(t)})}]};case`dag`:if(!t)throw Error(`name is required for dag`);return{content:[{type:`text`,text:JSON.stringify(sn(t))}]}}}catch(e){return op.error(`Queue action failed`,j(e)),q(`INTERNAL`,`Queue action failed: ${e instanceof Error?e.message:String(e)}`)}}))}const cp=k(`tools`);function lp(e){let t=[`## Rule: ${e.id}`,``,`- **Status**: ${e.enabled?`enabled`:`disabled`}`,`- **Description**: ${e.description??`—`}`,`- **Category**: ${e.category??`—`}`,`- **Push weight**: ${e.pushWeight??`—`}`];return e.patterns?.length&&t.push(`- **Patterns**: ${e.patterns.join(`, `)}`),e.examples?.length&&t.push(`- **Examples**: ${e.examples.join(`, `)}`),t.join(`
261
+ `)}function up(e,t){let n=U(`er_update_policy`);e.registerTool(`er_update_policy`,{title:n.title,description:`Manage ER push classification rules. Supports listing, updating, creating, and deleting rules that determine when knowledge should be pushed to Enterprise RAG.`,inputSchema:{action:I.enum([`list`,`get`,`update`,`create`,`delete`]).describe(`Action to perform on classification rules`),rule_id:I.string().optional().describe(`Rule ID (required for get, update, delete)`),changes:I.object({patterns:I.array(I.string()).optional(),category:I.string().optional(),pushWeight:I.number().min(0).max(1).optional(),description:I.string().optional(),examples:I.array(I.string()).optional(),enabled:I.boolean().optional()}).optional().describe(`Changes to apply (for update action)`),new_rule:I.object({id:I.string().regex(/^[a-z][a-z0-9-]*$/),patterns:I.array(I.string()).min(1),category:I.string(),pushWeight:I.number().min(0).max(1),description:I.string(),examples:I.array(I.string()).default([]),enabled:I.boolean().default(!0)}).optional().describe(`New rule definition (for create action)`)},annotations:n.annotations},J(`er_update_policy`,async({action:e,rule_id:n,changes:r,new_rule:i})=>{try{if(e===`list`){let e=t.getRules();return{content:[{type:`text`,text:`## Classification Rules\n\n${e.map(e=>`- **${e.id}** (${e.enabled?`enabled`:`disabled`}) — ${e.description}\n Category: ${e.category} | Weight: ${e.pushWeight} | Patterns: ${e.patterns.join(`, `)}`).join(`
262
+ `)}\n\n---\n_${e.length} rules total. Use \`action: "update"\` to modify a rule._`}]}}if(e===`get`){if(!n)return q(`VALIDATION`,'`rule_id` is required for "get" action.');let e=t.getRule(n);return e?{content:[{type:`text`,text:lp(e)}]}:q(`NOT_FOUND`,`Rule "${n}" not found.`)}if(e===`update`){if(!n||!r)return q(`VALIDATION`,'`rule_id` and `changes` are required for "update" action.');let e=t.updateRule(n,r);return e?{content:[{type:`text`,text:`${lp(e)}\n\n---\n_Updated. Next: Use \`action: "list"\` to verify._`}]}:q(`NOT_FOUND`,`Rule "${n}" not found.`)}return e===`create`?i?{content:[{type:`text`,text:`${lp(t.addRule(i))}\n\n---\n_Created. Next: Test classification with \`remember\`._`}]}:q(`VALIDATION`,'`new_rule` is required for "create" action.'):e===`delete`?n?t.deleteRule(n)?{content:[{type:`text`,text:`Deleted rule **${n}**.\n\n---\n_Next: Use \`action: "list"\` to verify._`}]}:q(`NOT_FOUND`,`Rule "${n}" not found.`):q(`VALIDATION`,'`rule_id` is required for "delete" action.'):q(`VALIDATION`,`Unknown action: ${e}`)}catch(e){return cp.error(`Policy update failed`,j(e)),q(`INTERNAL`,`Policy update failed: ${e instanceof Error?e.message:String(e)}`)}}))}const dp=new Map([{type:`markdown`,category:`content`,description:`Markdown content rendered with the marked parser.`,valueShape:`string`,relevantSkills:[`present`,`docs`]},{type:`code`,category:`content`,description:`Formatted code block rendered inside pre/code tags.`,valueShape:`string`,relevantSkills:[`present`,`docs`]},{type:`mermaid`,category:`visualization`,description:`Mermaid diagram source rendered in a mermaid pre block.`,valueShape:`string`,vendorScripts:[`mermaid`],relevantSkills:[`present`,`c4-architecture`,`docs`]},{type:`architecture-diagram`,category:`visualization`,description:`Architecture diagram with positioned components, connections, and boundary groups. Produces SVG with mermaid rendering.`,vendorScripts:[`mermaid`],valueShape:`object ({ components, connections, boundaries? })`,since:`1.0`,relevantSkills:[`present`,`c4-architecture`,`onboard`],usageExample:`{
263
263
  type: 'architecture-diagram',
264
264
  value: {
265
265
  components: [
@@ -292,7 +292,7 @@ None.`:`### Stale Lessons\n${l.map(e=>`- **${e.title}** (\`${e.path}\`) — effe
292
292
  { path: 'docs/api.md', title: 'API Reference', status: 'stale' },
293
293
  ],
294
294
  },
295
- }`},{type:`text`,category:`content`,description:`Plain text content rendered through the markdown parser.`,valueShape:`string`},{type:`heading`,category:`content`,description:`Single heading with configurable level from h1 to h6.`,valueShape:`string`},{type:`paragraph`,category:`content`,description:`Single paragraph rendered inside a p tag.`,valueShape:`string`},{type:`separator`,category:`layout`,description:`Horizontal rule used to separate adjacent blocks.`,valueShape:`undefined`},{type:`actions`,category:`layout`,description:`Action bar containing button and select action definitions.`,valueShape:`Array<{ type: string; id: string; label: string; variant?: string; options?: Array<string | { label: string; value: string }> }>`},{type:`diff`,category:`content`,description:`Diff view with +/- lines for showing changes between text.`,valueShape:`string | { content: string } | { before: string; after: string }`},{type:`finding`,category:`content`,description:`Finding with severity pill showing title, severity, and detail.`,valueShape:`{ title?: string; severity?: string; detail?: unknown }`},{type:`kv`,category:`data`,description:`Key-value pairs rendered as labeled entries.`,valueShape:`Array<{ key: string; value: unknown }> | Record<string, unknown>`},{type:`tags`,category:`data`,description:`Tag pills rendered with optional tone/color.`,valueShape:`Array<string | { text?: string; label?: string; status?: string; tone?: string; color?: string }> | { items: Array<...> }`},{type:`list`,category:`content`,description:`Bullet list items rendered as an unordered list.`,valueShape:`string[]`},{type:`lifecycle-flow`,category:`visualization`,description:`SVG flow diagram with labeled steps, edges, and status colors.`,valueShape:`{ title?: string; steps: Array<{ id: string; label: string; type?: string; status?: string; description?: string }>; edges?: Array<{ from: string; to: string; label?: string }> }`},{type:`component-detail`,category:`visualization`,description:`Component detail view with name, type, technology, responsibilities, interfaces, dependencies, metrics, and code links.`,valueShape:`{ name: string; description?: string; type?: string; technology?: string; responsibilities?: string[]; interfaces?: Array<{ name: string; type: string; description?: string }>; dependencies?: Array<{ name: string; relationship?: string }>; metrics?: Record<string, string | number>; codeLinks?: Array<{ href: string; label: string }> }`},{type:`data-table-schema`,category:`data`,description:`Schema table with field names, types, constraints, and indexes.`,valueShape:`{ name: string; description?: string; fields: Array<{ name: string; type: string; required?: boolean; default?: unknown; constraints?: string[]; description?: string }>; indexes?: Array<{ name: string; columns: string[]; unique?: boolean }> }`},{type:`annotation`,category:`interactive`,description:`Annotation groups with COMMENT, DELETION, and GLOBAL_COMMENT types.`,valueShape:`Array<{ id: string; type: "COMMENT" | "DELETION" | "GLOBAL_COMMENT"; body: string; author?: string; createdAt?: string }>`},{type:`approval`,category:`interactive`,description:`Approval widget with radio options and optional comment textarea.`,valueShape:`{ prompt: string; options: Array<{ id: string; label: string; description?: string }>; requireComment?: boolean }`},{type:`docs-hub`,category:`content`,description:`Doc hub card grid with titled pages, descriptions, categories, and statuses.`,valueShape:`{ title?: string; description?: string; pages?: Array<{ title: string; description?: string; href?: string; icon?: string; category?: string; status?: "draft" | "published" | "deprecated" }> }`}].map(e=>[e.type,{...e}]));function dp(){let e={};for(let[t,n]of up)n.vendorScripts?.length&&(e[t]=n.vendorScripts);return e}function fp(e){return up.has(e)}const pp=new Map;function mp(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,`\\$&`)}function hp(e){let t=`(?=[^>]*\\bid=['"]${mp(e)}['"])`;return RegExp(`(<script\\b(?=[^>]*\\btype=['"]application\\/json['"])${t}[^>]*>)[\\s\\S]*?(<\/script>)`,`i`)}function gp(e){pp.has(e.id)&&console.warn(`[viewer-registry] Overwriting viewer template "${e.id}"`),pp.set(e.id,e)}function _p(e){return pp.get(e)}function vp(e){return typeof e==`string`&&pp.has(e)}function yp(){return[...pp.values()]}function bp(e,t,n,r){let i=hp(n);if(!i.test(e))throw Error(`No <script type="application/json" id="${n}"> found in template`);let a=r?r(t):t,o=JSON.stringify(a??null).replace(/<\/script/gi,`<\\/script`).replace(/<script/gi,`\\u003Cscript`).replace(/-->/g,`--\\u003E`).replace(/<!--/g,`\\u003C!--`);return e.replace(i,`$1\n${o}\n$2`)}const xp=import.meta.dirname??Ie(ue(import.meta.url)),Sp={type:`object`,properties:{title:{type:`string`},description:{type:`string`},layout:{type:`object`,properties:{direction:{type:`string`},spacing:{type:`number`},layerSpacing:{type:`number`}}},nodes:{type:`array`,items:{type:`object`,properties:{id:{type:`string`},type:{type:`string`,enum:[`person`,`system`,`container`,`component`,`database`,`queue`,`external`,`boundary`]},label:{type:`string`},technology:{type:`string`},icon:{type:`string`},description:{type:`string`}},required:[`id`,`type`,`label`]}},edges:{type:`array`,items:{type:`object`,properties:{source:{type:`string`},target:{type:`string`},label:{type:`string`},style:{type:`string`,enum:[`sync`,`async`,`dashed`,`dotted`,`solid`]}},required:[`source`,`target`]},default:[]}},required:[`nodes`]},Cp={type:`object`,properties:{nodes:{type:`array`,items:{type:`object`,properties:{id:{type:`string`},label:{type:`string`},type:{type:`string`,enum:[`start-end`,`manual`,`automated`,`integration`,`decision`,`prerequisite`]},description:{type:`string`}},required:[`id`,`label`]}},edges:{type:`array`,items:{type:`object`,properties:{source:{type:`string`},target:{type:`string`},label:{type:`string`},type:{type:`string`,enum:[`standard`,`loop-back`,`exception`]}},required:[`source`,`target`]}}},required:[`nodes`]},wp={type:`object`,properties:{title:{type:`string`},description:{type:`string`},phases:{type:`array`,items:{type:`object`,properties:{id:{type:`string`},label:{type:`string`},outcome:{type:`string`},batches:{type:`array`,items:{type:`object`,properties:{id:{type:`string`},order:{type:`number`},parallel:{type:`boolean`},label:{type:`string`},tasks:{type:`array`,items:{type:`object`,properties:{id:{type:`string`},title:{type:`string`},agent:{type:`string`},files:{type:`array`,items:{type:`string`},default:[]},status:{type:`string`,enum:[`pending`,`in-progress`,`done`,`blocked`]},dependsOn:{type:`array`,items:{type:`string`},default:[]}},required:[`id`,`title`]},default:[]}},required:[`id`,`tasks`]},default:[]}},required:[`id`,`label`,`batches`]}}},required:[`phases`]};function Tp(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ep(e,t){return Tp(t)?{...t,kind:e}:{kind:e}}function Dp(e){let t=e===`canvas.html`?[P(xp,`..`,`..`,`..`,`..`,`..`,`scaffold`,`general`,`viewers`,`src`,`canvas`,`index.html`),P(xp,`..`,`..`,`scaffold`,`general`,`viewers`,`src`,`canvas`,`index.html`)]:[],n=_(`server`,[P(`viewers`,`dist`,e),P(`viewers`,e)]),r=[...t,...n?[n]:[],P(xp,`..`,`..`,`..`,`viewers`,e),P(xp,`..`,`..`,`..`,`..`,`..`,`scaffold`,`general`,`viewers`,`src`,`static`,e),P(xp,`..`,`..`,`..`,`..`,`..`,`scaffold`,`general`,`viewers`,`dist`,e),P(xp,`..`,`..`,`..`,`..`,`..`,`scaffold`,`general`,`viewers`,e),P(xp,`..`,`..`,`scaffold`,`general`,`viewers`,`dist`,e),P(xp,`..`,`..`,`scaffold`,`general`,`viewers`,e),P(xp,`..`,`viewers`,`dist`,e),P(xp,`..`,`viewers`,e)];for(let e of r)try{return N(e,`utf8`)}catch{}throw Error(`Viewer HTML not found: ${e}. Searched: ${r.join(`, `)}`)}let Op,kp,Ap,jp,Mp,Np,Pp;function Fp(){return Op??=Dp(`c4-viewer.html`),Op}function Ip(){return kp??=Dp(`tour-viewer.html`),kp}function Lp(){return Ap??=Dp(`canvas.html`),Ap}function Rp(){return jp??=Dp(`architecture-static.html`),jp}function zp(){return Mp??=Dp(`process-flow-static.html`),Mp}function Bp(){return Np??=Dp(`task-plan-static.html`),Np}function Vp(){return Pp??=Dp(`code-review-viewer.html`),Pp}const Hp={type:`object`,properties:{title:{type:`string`,description:`PR or review title`},repo:{type:`string`,description:`Repository identifier (e.g., owner/repo)`},author:{type:`string`,description:`Author display name`},date:{type:`string`,description:`Date or relative time string`},branch:{type:`string`,description:`Source branch name`},targetBranch:{type:`string`,default:`main`},description:{type:`string`,description:`PR or change description`},additions:{type:`number`,default:0},deletions:{type:`number`,default:0},summary:{type:`string`,description:`Overall review summary`},summaryTitle:{type:`string`,default:`Summary`},conclusion:{type:`array`,items:{type:`string`},description:`Conclusion paragraphs`},files:{type:`array`,items:{type:`object`,properties:{path:{type:`string`},additions:{type:`number`,default:0},deletions:{type:`number`,default:0},risk:{type:`string`,enum:[`safe`,`medium`,`attention`],default:`safe`},collapsed:{type:`boolean`,default:!0},diff:{type:`array`,items:{type:`object`,properties:{t:{type:`string`,enum:[`add`,`del`,`ctx`,`hunk`],default:`ctx`},n:{type:`string`,description:`Line number`},c:{type:`string`,description:`Code content`}}}},comments:{type:`array`,items:{type:`object`,properties:{line:{type:`number`},text:{type:`string`},blocking:{type:`boolean`,default:!1}}}}},required:[`path`]}}},required:[`files`]};function Up(){gp({id:`c4@1`,label:`C4 Architecture Diagram`,description:`Interactive C4 architecture diagram with zoom, pan, and ELK auto-layout`,inputSchema:Sp,injectId:`diagram-data`,supportedTransports:[`browser`],resolveHtml:Fp}),gp({id:`c4-static@1`,label:`C4 Architecture Diagram (Static)`,description:`Static SVG architecture diagram for inline rendering`,inputSchema:Sp,injectId:`diagram-data`,supportedTransports:[`mcp-app`],resolveHtml:Rp}),gp({id:`tour@1`,label:`Code Tour Viewer`,description:`Interactive code tour with step navigation and dependency graph`,inputSchema:{type:`object`,properties:{title:{type:`string`},description:{type:`string`},estimatedTime:{type:`string`},steps:{type:`array`,items:{type:`object`,properties:{stepNumber:{type:`number`},id:{type:`string`},title:{type:`string`},file:{type:`string`},explanation:{type:`string`},description:{type:`string`},learnsConcept:{type:`string`},duration:{type:`string`},line:{type:`number`},code:{type:`string`}},required:[`id`,`title`]}},dependencies:{type:`array`,items:{type:`object`,properties:{source:{type:`string`},target:{type:`string`}},required:[`source`,`target`]},default:[]}},required:[`steps`]},injectId:`tour-data`,supportedTransports:[`browser`],resolveHtml:Ip}),gp({id:`process-flow-static@1`,label:`Process Flow Diagram (Static)`,description:`Static SVG process flow diagram for inline rendering`,inputSchema:Cp,injectId:`diagram-data`,supportedTransports:[`mcp-app`],resolveHtml:zp}),gp({id:`task-plan-static@1`,label:`Task Execution Plan (Static)`,description:`Static SVG task execution plan for inline rendering`,inputSchema:wp,injectId:`diagram-data`,supportedTransports:[`mcp-app`],resolveHtml:Bp}),gp({id:`process-flow@1`,label:`Process Flow Diagram (Interactive)`,description:`Interactive process flow diagram with ReactFlow`,inputSchema:Cp,injectId:`diagram-data`,supportedTransports:[`browser`],resolveHtml:Lp,transformData:e=>Ep(`process-flow`,e)}),gp({id:`code-review@1`,label:`Code Review`,description:`Annotated code review with diff display, risk map, and review bubbles. Supports text selection annotations when used with actions.`,inputSchema:Hp,injectId:`review-data`,supportedTransports:[`mcp-app`,`browser`],resolveHtml:Vp})}function Wp(){let e=new Cr;for(let t of Er.list())e.register(t);return e.register(Tr),e.register(Ar),e.register(jr),e.register(Dr),e}function Gp(e,t){return e?.supportedTransports.includes(t)??!1}const Kp=Wp();function qp(e){if(e.template)return Kp.get(e.template)}function Jp(e){if((e.actions?.length??0)>0)return!0;if(e.template&&vp(e.template)){let t=_p(e.template);return t?.supportedTransports.includes(`browser`)===!0&&!t.supportedTransports.includes(`mcp-app`)}let t=qp(e);return Gp(t,`browser`)&&!Gp(t,`mcp-app`)}Up();const X={TIMEOUT:`timeout`,DUPLICATE_CALLBACK:`duplicate_callback`,INVALID_NONCE:`invalid_nonce`,INVALID_ORIGIN:`invalid_origin`,SESSION_NOT_FOUND:`session_not_found`,SESSION_LIMIT_REACHED:`session_limit_reached`,ASSET_NOT_FOUND:`asset_not_found`,ASSET_FORBIDDEN:`asset_forbidden`,RATE_LIMITED:`rate_limited`,PAYLOAD_TOO_LARGE:`payload_too_large`,UNSUPPORTED_MEDIA_TYPE:`unsupported_media_type`,INVALID_TRANSITION:`invalid_transition`,ANNOTATION_CAP_EXCEEDED:`annotation_cap_exceeded`},Yp={[X.TIMEOUT]:408,[X.DUPLICATE_CALLBACK]:409,[X.INVALID_NONCE]:400,[X.INVALID_ORIGIN]:403,[X.SESSION_NOT_FOUND]:404,[X.SESSION_LIMIT_REACHED]:429,[X.ASSET_NOT_FOUND]:404,[X.ASSET_FORBIDDEN]:403,[X.RATE_LIMITED]:429,[X.PAYLOAD_TOO_LARGE]:413,[X.UNSUPPORTED_MEDIA_TYPE]:415,[X.INVALID_TRANSITION]:400,[X.ANNOTATION_CAP_EXCEEDED]:403};function Xp(e,t,n){return{code:e,message:t,httpStatus:n??Yp[e]}}const Zp={created:[`rendering`,`errored`,`cleaned_up`,`timed_out`,`cancelled`,`responded`],rendering:[`listening`,`errored`,`cleaned_up`,`timed_out`,`cancelled`],listening:[`connected`,`timed_out`,`cancelled`,`errored`,`cleaned_up`],connected:[`responded`,`timed_out`,`cancelled`,`errored`,`cleaned_up`],responded:[`cleaned_up`],timed_out:[`cleaned_up`],cancelled:[`cleaned_up`],errored:[`cleaned_up`],cleaned_up:[]};function Qp(e,t,n,r){return Zp[e].includes(t)?{ok:!0,to:t,entry:{from:e,to:t,timestamp:Date.now(),trigger:r}}:{ok:!1,error:{code:`invalid_transition`,message:`Cannot transition from "${e}" to "${t}"`,from:e,to:t}}}function $p(e){return Zp[e].length===0}const em=1024,tm=new Set([`user-closed`,`host-dismissed`,`replaced`]);function nm(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function rm(e,t,n){let r={code:e,message:t};return n!==void 0&&(r.details=n),{kind:`error`,error:r}}function im(e,t,n,r){e.writeHead(t,{"Content-Type":`application/json`,"Access-Control-Allow-Origin":r??`null`}),e.end(JSON.stringify(n))}async function am(e){return await new Promise((t,n)=>{let r=[],i=0;e.on(`data`,t=>{if(i+=t.length,i>65536){n(Error(`Callback payload exceeds 64KB limit`)),e.destroy();return}r.push(t)}),e.on(`end`,()=>t(Buffer.concat(r).toString(`utf8`))),e.on(`error`,n)})}function om(e,t){if(typeof e!=`string`||e.length!==t.length)return!1;let n=Buffer.from(e,`hex`),r=Buffer.from(t,`hex`);return n.length===r.length?Xe(n,r):!1}function sm(e,t){let n=e.headers.origin;if(n!==void 0)return n===t;let r=e.headers.referer;return r==null?!0:r.startsWith(t)}function cm(e){return(e.headers[`content-type`]??``).startsWith(`application/json`)}function lm(e){for(let[t,n]of Object.entries(e)){let e=typeof n==`string`?n:JSON.stringify(n);if(Buffer.byteLength(e,`utf8`)>8192)return`Form field "${t}" exceeds 8KB limit`}return null}function um(e){return Array.isArray(e)&&e.length>em?`Selection exceeds ${em} items (got ${e.length})`:null}function dm(e,t,n){let r=typeof e.actionId==`string`?e.actionId:``,i=n.find(e=>e.id===r);if(!i)return rm(`INVALID_ACTION`,`Unknown actionId: ${r||`(missing)`}`);let a=typeof e.selection==`string`||Array.isArray(e.selection)?e.selection:void 0,o=nm(e.formData)?e.formData:void 0,s={surfaceId:t,actionId:i.id,actionType:i.type,timestamp:typeof e.timestamp==`string`?e.timestamp:new Date().toISOString(),sourceTransport:`browser`};return e.value!==void 0&&(s.value=e.value),a!==void 0&&(s.selection=a),o!==void 0&&(s.formData=o),e.annotations!==void 0&&(s.annotations=e.annotations),typeof e.label==`string`?s.label=e.label:i.label&&(s.label=i.label),{kind:`result`,result:s}}function fm(e){switch(e.kind){case`timeout`:return`timed_out`;case`cancelled`:return`cancelled`;case`error`:return`errored`;case`result`:return`responded`;default:return`errored`}}function pm(e,t,n,r,i){let a=i??Je(16).toString(`hex`),o=`created`,s=[],c=!1,l,u,d=new Promise(e=>{u=e}),f=e=>{if($p(o))return l;let t=fm(e),i=Qp(o,t,s,`resolve`);return i.ok?(o=t,s.push(i.entry),l=e,u?.(e),n&&r&&n.transitionSession(r,t,`resolve`),e):l};return{nonce:a,promise:d,get state(){return o},get stateHistory(){return s},settleTimeout(e){return f({kind:`timeout`,waitedMs:e})},settleCancelled(e){return f({kind:`cancelled`,reason:e})},settleError(e,t,n){return f(rm(e,t,n))},async handle(n,r,i){if(!cm(n)){let e=f(rm(X.UNSUPPORTED_MEDIA_TYPE,`Content-Type must be application/json`));return im(r,415,{ok:!1,error:X.UNSUPPORTED_MEDIA_TYPE},i),e}if(!sm(n,i)){let e=n.headers.origin??n.headers.referer??`(missing)`,t=f(rm(X.INVALID_ORIGIN,`Unexpected callback origin: ${e}`));return im(r,403,{ok:!1,error:X.INVALID_ORIGIN},i),t}let o=``;try{o=await am(n)}catch(e){let t=f(rm(`INVALID_PAYLOAD`,e instanceof Error?e.message:`Unable to read callback payload`));return im(r,413,{ok:!1,error:X.PAYLOAD_TOO_LARGE},i),t}let s;try{let e=JSON.parse(o);if(!nm(e))throw Error(`Callback payload must be an object`);s=e}catch(e){let t=f(rm(`INVALID_PAYLOAD`,e instanceof Error?e.message:`Malformed callback payload`));return im(r,400,{ok:!1,error:`invalid-json`},i),t}if(c){let e=rm(X.DUPLICATE_CALLBACK,`Nonce has already been used`);return im(r,403,{ok:!1,error:X.DUPLICATE_CALLBACK},i),e}if(!om(typeof s.nonce==`string`?s.nonce:``,a)){let e=f(rm(X.INVALID_NONCE,`Callback nonce did not match`));return im(r,403,{ok:!1,error:X.INVALID_NONCE},i),e}c=!0;let l=um(s.selection);if(l){let e=f(rm(`SELECTION_TOO_LARGE`,l));return im(r,413,{ok:!1,error:`selection-too-large`},i),e}if(nm(s.formData)){let e=lm(s.formData);if(e){let t=f(rm(`PAYLOAD_FIELD_TOO_LARGE`,e));return im(r,413,{ok:!1,error:`field-too-large`},i),t}}if(s.kind===`cancelled`){let e=typeof s.reason==`string`?s.reason:``;if(!tm.has(e)){let t=f(rm(`INVALID_CANCEL_REASON`,`Unsupported cancel reason: ${e||`(missing)`}`));return im(r,400,{ok:!1,error:`invalid-cancel-reason`},i),t}let t=f({kind:`cancelled`,reason:e});return im(r,200,{ok:!0,kind:`cancelled`},i),t}let u=f(dm(s,e,t));return im(r,u.kind===`error`?400:200,{ok:u.kind!==`error`,kind:u.kind},i),u}}}const mm=`Install AI Kit with <code>${Y(`npx -y @vpxa/aikit@latest init --user`)}</code>.`;function hm(e){let t=Date.now();return{id:e.id,state:`created`,nonce:e.nonce,surfaceId:e.surfaceId,transport:e.transport,createdAt:t,updatedAt:t,stateHistory:[],responsePromise:null,resolveOutcome:null,cleanupCallbacks:[],nonceConsumed:!1}}var gm=class{sessions;maxSessions;rejectedCount;constructor(e=16){this.sessions=new Map,this.maxSessions=e,this.rejectedCount=0}createSession(e){if(this.sessions.size>=this.maxSessions)return this.rejectedCount++,{ok:!1,error:Xp(X.SESSION_LIMIT_REACHED,`Session limit reached`)};let t=Ye(),n=hm({id:t,nonce:e.nonce,surfaceId:e.surfaceId,transport:e.transport});return this.sessions.set(t,n),{ok:!0,session:n}}getSession(e){return this.sessions.get(e)||Xp(X.SESSION_NOT_FOUND,`Session ${e} not found`)}transitionSession(e,t,n){let r=this.sessions.get(e);if(!r)return{ok:!1,error:Xp(X.SESSION_NOT_FOUND,`Session ${e} not found`)};let i=Qp(r.state,t,r.stateHistory,n);return i.ok?(r.state=i.to,r.stateHistory.push(i.entry),r.updatedAt=Date.now(),{ok:!0,record:r}):{ok:!1,error:Xp(X.INVALID_TRANSITION,i.error.message)}}consumeNonce(e){let t=this.sessions.get(e);return t?t.nonceConsumed?{ok:!1,error:Xp(X.DUPLICATE_CALLBACK,`Nonce already consumed`)}:(t.nonceConsumed=!0,t.updatedAt=Date.now(),{ok:!0}):{ok:!1,error:Xp(X.SESSION_NOT_FOUND,`Session ${e} not found`)}}removeSession(e){return this.sessions.delete(e)}cleanupStale(e){let t=Date.now(),n=0;for(let[r,i]of this.sessions.entries())i.state!==`connected`&&t-i.updatedAt>e&&(i.resolveOutcome&&(i.resolveOutcome({outcome:`timeout`}),i.resolveOutcome=null,i.responsePromise=null),this.sessions.delete(r),n++);return n}shutdown(){for(let[,e]of this.sessions.entries()){e.resolveOutcome&&(e.resolveOutcome({outcome:`shutdown`}),e.resolveOutcome=null,e.responsePromise=null);for(let t of e.cleanupCallbacks)try{t()}catch{}e.cleanupCallbacks=[]}this.sessions.clear()}get activeCount(){return this.sessions.size}get rejectedSessionCount(){return this.rejectedCount}setResponseResolver(e,t){let n=this.sessions.get(e);return n?(n.resolveOutcome=t,n.updatedAt=Date.now(),{ok:!0}):{ok:!1,error:Xp(X.SESSION_NOT_FOUND,`Session ${e} not found`)}}};const _m=String.raw`(function(){
295
+ }`},{type:`text`,category:`content`,description:`Plain text content rendered through the markdown parser.`,valueShape:`string`},{type:`heading`,category:`content`,description:`Single heading with configurable level from h1 to h6.`,valueShape:`string`},{type:`paragraph`,category:`content`,description:`Single paragraph rendered inside a p tag.`,valueShape:`string`},{type:`separator`,category:`layout`,description:`Horizontal rule used to separate adjacent blocks.`,valueShape:`undefined`},{type:`actions`,category:`layout`,description:`Action bar containing button and select action definitions.`,valueShape:`Array<{ type: string; id: string; label: string; variant?: string; options?: Array<string | { label: string; value: string }> }>`},{type:`diff`,category:`content`,description:`Diff view with +/- lines for showing changes between text.`,valueShape:`string | { content: string } | { before: string; after: string }`},{type:`finding`,category:`content`,description:`Finding with severity pill showing title, severity, and detail.`,valueShape:`{ title?: string; severity?: string; detail?: unknown }`},{type:`kv`,category:`data`,description:`Key-value pairs rendered as labeled entries.`,valueShape:`Array<{ key: string; value: unknown }> | Record<string, unknown>`},{type:`tags`,category:`data`,description:`Tag pills rendered with optional tone/color.`,valueShape:`Array<string | { text?: string; label?: string; status?: string; tone?: string; color?: string }> | { items: Array<...> }`},{type:`list`,category:`content`,description:`Bullet list items rendered as an unordered list.`,valueShape:`string[]`},{type:`lifecycle-flow`,category:`visualization`,description:`SVG flow diagram with labeled steps, edges, and status colors.`,valueShape:`{ title?: string; steps: Array<{ id: string; label: string; type?: string; status?: string; description?: string }>; edges?: Array<{ from: string; to: string; label?: string }> }`},{type:`component-detail`,category:`visualization`,description:`Component detail view with name, type, technology, responsibilities, interfaces, dependencies, metrics, and code links.`,valueShape:`{ name: string; description?: string; type?: string; technology?: string; responsibilities?: string[]; interfaces?: Array<{ name: string; type: string; description?: string }>; dependencies?: Array<{ name: string; relationship?: string }>; metrics?: Record<string, string | number>; codeLinks?: Array<{ href: string; label: string }> }`},{type:`data-table-schema`,category:`data`,description:`Schema table with field names, types, constraints, and indexes.`,valueShape:`{ name: string; description?: string; fields: Array<{ name: string; type: string; required?: boolean; default?: unknown; constraints?: string[]; description?: string }>; indexes?: Array<{ name: string; columns: string[]; unique?: boolean }> }`},{type:`annotation`,category:`interactive`,description:`Annotation groups with COMMENT, DELETION, and GLOBAL_COMMENT types.`,valueShape:`Array<{ id: string; type: "COMMENT" | "DELETION" | "GLOBAL_COMMENT"; body: string; author?: string; createdAt?: string }>`},{type:`approval`,category:`interactive`,description:`Approval widget with radio options and optional comment textarea.`,valueShape:`{ prompt: string; options: Array<{ id: string; label: string; description?: string }>; requireComment?: boolean }`},{type:`docs-hub`,category:`content`,description:`Doc hub card grid with titled pages, descriptions, categories, and statuses.`,valueShape:`{ title?: string; description?: string; pages?: Array<{ title: string; description?: string; href?: string; icon?: string; category?: string; status?: "draft" | "published" | "deprecated" }> }`}].map(e=>[e.type,{...e}]));function fp(){let e={};for(let[t,n]of dp)n.vendorScripts?.length&&(e[t]=n.vendorScripts);return e}function pp(e){return dp.has(e)}const mp=new Map;function hp(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,`\\$&`)}function gp(e){let t=`(?=[^>]*\\bid=['"]${hp(e)}['"])`;return RegExp(`(<script\\b(?=[^>]*\\btype=['"]application\\/json['"])${t}[^>]*>)[\\s\\S]*?(<\/script>)`,`i`)}function _p(e){mp.has(e.id)&&console.warn(`[viewer-registry] Overwriting viewer template "${e.id}"`),mp.set(e.id,e)}function vp(e){return mp.get(e)}function yp(e){return typeof e==`string`&&mp.has(e)}function bp(){return[...mp.values()]}function xp(e,t,n,r){let i=gp(n);if(!i.test(e))throw Error(`No <script type="application/json" id="${n}"> found in template`);let a=r?r(t):t,o=JSON.stringify(a??null).replace(/<\/script/gi,`<\\/script`).replace(/<script/gi,`\\u003Cscript`).replace(/-->/g,`--\\u003E`).replace(/<!--/g,`\\u003C!--`);return e.replace(i,`$1\n${o}\n$2`)}const Sp=import.meta.dirname??Ie(ue(import.meta.url)),Cp={type:`object`,properties:{title:{type:`string`},description:{type:`string`},layout:{type:`object`,properties:{direction:{type:`string`},spacing:{type:`number`},layerSpacing:{type:`number`}}},nodes:{type:`array`,items:{type:`object`,properties:{id:{type:`string`},type:{type:`string`,enum:[`person`,`system`,`container`,`component`,`database`,`queue`,`external`,`boundary`]},label:{type:`string`},technology:{type:`string`},icon:{type:`string`},description:{type:`string`}},required:[`id`,`type`,`label`]}},edges:{type:`array`,items:{type:`object`,properties:{source:{type:`string`},target:{type:`string`},label:{type:`string`},style:{type:`string`,enum:[`sync`,`async`,`dashed`,`dotted`,`solid`]}},required:[`source`,`target`]},default:[]}},required:[`nodes`]},wp={type:`object`,properties:{nodes:{type:`array`,items:{type:`object`,properties:{id:{type:`string`},label:{type:`string`},type:{type:`string`,enum:[`start-end`,`manual`,`automated`,`integration`,`decision`,`prerequisite`]},description:{type:`string`}},required:[`id`,`label`]}},edges:{type:`array`,items:{type:`object`,properties:{source:{type:`string`},target:{type:`string`},label:{type:`string`},type:{type:`string`,enum:[`standard`,`loop-back`,`exception`]}},required:[`source`,`target`]}}},required:[`nodes`]},Tp={type:`object`,properties:{title:{type:`string`},description:{type:`string`},phases:{type:`array`,items:{type:`object`,properties:{id:{type:`string`},label:{type:`string`},outcome:{type:`string`},batches:{type:`array`,items:{type:`object`,properties:{id:{type:`string`},order:{type:`number`},parallel:{type:`boolean`},label:{type:`string`},tasks:{type:`array`,items:{type:`object`,properties:{id:{type:`string`},title:{type:`string`},agent:{type:`string`},files:{type:`array`,items:{type:`string`},default:[]},status:{type:`string`,enum:[`pending`,`in-progress`,`done`,`blocked`]},dependsOn:{type:`array`,items:{type:`string`},default:[]}},required:[`id`,`title`]},default:[]}},required:[`id`,`tasks`]},default:[]}},required:[`id`,`label`,`batches`]}}},required:[`phases`]};function Ep(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Dp(e,t){return Ep(t)?{...t,kind:e}:{kind:e}}function Op(e){let t=e===`canvas.html`?[P(Sp,`..`,`..`,`..`,`..`,`..`,`scaffold`,`general`,`viewers`,`src`,`canvas`,`index.html`),P(Sp,`..`,`..`,`scaffold`,`general`,`viewers`,`src`,`canvas`,`index.html`)]:[],n=_(`server`,[P(`viewers`,`dist`,e),P(`viewers`,e)]),r=[...t,...n?[n]:[],P(Sp,`..`,`..`,`..`,`viewers`,e),P(Sp,`..`,`..`,`..`,`..`,`..`,`scaffold`,`general`,`viewers`,`src`,`static`,e),P(Sp,`..`,`..`,`..`,`..`,`..`,`scaffold`,`general`,`viewers`,`dist`,e),P(Sp,`..`,`..`,`..`,`..`,`..`,`scaffold`,`general`,`viewers`,e),P(Sp,`..`,`..`,`scaffold`,`general`,`viewers`,`dist`,e),P(Sp,`..`,`..`,`scaffold`,`general`,`viewers`,e),P(Sp,`..`,`viewers`,`dist`,e),P(Sp,`..`,`viewers`,e)];for(let e of r)try{return N(e,`utf8`)}catch{}throw Error(`Viewer HTML not found: ${e}. Searched: ${r.join(`, `)}`)}let kp,Ap,jp,Mp,Np,Pp,Fp;function Ip(){return kp??=Op(`c4-viewer.html`),kp}function Lp(){return Ap??=Op(`tour-viewer.html`),Ap}function Rp(){return jp??=Op(`canvas.html`),jp}function zp(){return Mp??=Op(`architecture-static.html`),Mp}function Bp(){return Np??=Op(`process-flow-static.html`),Np}function Vp(){return Pp??=Op(`task-plan-static.html`),Pp}function Hp(){return Fp??=Op(`code-review-viewer.html`),Fp}const Up={type:`object`,properties:{title:{type:`string`,description:`PR or review title`},repo:{type:`string`,description:`Repository identifier (e.g., owner/repo)`},author:{type:`string`,description:`Author display name`},date:{type:`string`,description:`Date or relative time string`},branch:{type:`string`,description:`Source branch name`},targetBranch:{type:`string`,default:`main`},description:{type:`string`,description:`PR or change description`},additions:{type:`number`,default:0},deletions:{type:`number`,default:0},summary:{type:`string`,description:`Overall review summary`},summaryTitle:{type:`string`,default:`Summary`},conclusion:{type:`array`,items:{type:`string`},description:`Conclusion paragraphs`},files:{type:`array`,items:{type:`object`,properties:{path:{type:`string`},additions:{type:`number`,default:0},deletions:{type:`number`,default:0},risk:{type:`string`,enum:[`safe`,`medium`,`attention`],default:`safe`},collapsed:{type:`boolean`,default:!0},diff:{type:`array`,items:{type:`object`,properties:{t:{type:`string`,enum:[`add`,`del`,`ctx`,`hunk`],default:`ctx`},n:{type:`string`,description:`Line number`},c:{type:`string`,description:`Code content`}}}},comments:{type:`array`,items:{type:`object`,properties:{line:{type:`number`},text:{type:`string`},blocking:{type:`boolean`,default:!1}}}}},required:[`path`]}}},required:[`files`]};function Wp(){_p({id:`c4@1`,label:`C4 Architecture Diagram`,description:`Interactive C4 architecture diagram with zoom, pan, and ELK auto-layout`,inputSchema:Cp,injectId:`diagram-data`,supportedTransports:[`browser`],resolveHtml:Ip}),_p({id:`c4-static@1`,label:`C4 Architecture Diagram (Static)`,description:`Static SVG architecture diagram for inline rendering`,inputSchema:Cp,injectId:`diagram-data`,supportedTransports:[`mcp-app`],resolveHtml:zp}),_p({id:`tour@1`,label:`Code Tour Viewer`,description:`Interactive code tour with step navigation and dependency graph`,inputSchema:{type:`object`,properties:{title:{type:`string`},description:{type:`string`},estimatedTime:{type:`string`},steps:{type:`array`,items:{type:`object`,properties:{stepNumber:{type:`number`},id:{type:`string`},title:{type:`string`},file:{type:`string`},explanation:{type:`string`},description:{type:`string`},learnsConcept:{type:`string`},duration:{type:`string`},line:{type:`number`},code:{type:`string`}},required:[`id`,`title`]}},dependencies:{type:`array`,items:{type:`object`,properties:{source:{type:`string`},target:{type:`string`}},required:[`source`,`target`]},default:[]}},required:[`steps`]},injectId:`tour-data`,supportedTransports:[`browser`],resolveHtml:Lp}),_p({id:`process-flow-static@1`,label:`Process Flow Diagram (Static)`,description:`Static SVG process flow diagram for inline rendering`,inputSchema:wp,injectId:`diagram-data`,supportedTransports:[`mcp-app`],resolveHtml:Bp}),_p({id:`task-plan-static@1`,label:`Task Execution Plan (Static)`,description:`Static SVG task execution plan for inline rendering`,inputSchema:Tp,injectId:`diagram-data`,supportedTransports:[`mcp-app`],resolveHtml:Vp}),_p({id:`process-flow@1`,label:`Process Flow Diagram (Interactive)`,description:`Interactive process flow diagram with ReactFlow`,inputSchema:wp,injectId:`diagram-data`,supportedTransports:[`browser`],resolveHtml:Rp,transformData:e=>Dp(`process-flow`,e)}),_p({id:`code-review@1`,label:`Code Review`,description:`Annotated code review with diff display, risk map, and review bubbles. Supports text selection annotations when used with actions.`,inputSchema:Up,injectId:`review-data`,supportedTransports:[`mcp-app`,`browser`],resolveHtml:Hp})}function Gp(){let e=new wr;for(let t of Dr.list())e.register(t);return e.register(Er),e.register(jr),e.register(Mr),e.register(Or),e}function Kp(e,t){return e?.supportedTransports.includes(t)??!1}const qp=Gp();function Jp(e){if(e.template)return qp.get(e.template)}function Yp(e){if((e.actions?.length??0)>0)return!0;if(e.template&&yp(e.template)){let t=vp(e.template);return t?.supportedTransports.includes(`browser`)===!0&&!t.supportedTransports.includes(`mcp-app`)}let t=Jp(e);return Kp(t,`browser`)&&!Kp(t,`mcp-app`)}Wp();const X={TIMEOUT:`timeout`,DUPLICATE_CALLBACK:`duplicate_callback`,INVALID_NONCE:`invalid_nonce`,INVALID_ORIGIN:`invalid_origin`,SESSION_NOT_FOUND:`session_not_found`,SESSION_LIMIT_REACHED:`session_limit_reached`,ASSET_NOT_FOUND:`asset_not_found`,ASSET_FORBIDDEN:`asset_forbidden`,RATE_LIMITED:`rate_limited`,PAYLOAD_TOO_LARGE:`payload_too_large`,UNSUPPORTED_MEDIA_TYPE:`unsupported_media_type`,INVALID_TRANSITION:`invalid_transition`,ANNOTATION_CAP_EXCEEDED:`annotation_cap_exceeded`},Xp={[X.TIMEOUT]:408,[X.DUPLICATE_CALLBACK]:409,[X.INVALID_NONCE]:400,[X.INVALID_ORIGIN]:403,[X.SESSION_NOT_FOUND]:404,[X.SESSION_LIMIT_REACHED]:429,[X.ASSET_NOT_FOUND]:404,[X.ASSET_FORBIDDEN]:403,[X.RATE_LIMITED]:429,[X.PAYLOAD_TOO_LARGE]:413,[X.UNSUPPORTED_MEDIA_TYPE]:415,[X.INVALID_TRANSITION]:400,[X.ANNOTATION_CAP_EXCEEDED]:403};function Zp(e,t,n){return{code:e,message:t,httpStatus:n??Xp[e]}}const Qp={created:[`rendering`,`errored`,`cleaned_up`,`timed_out`,`cancelled`,`responded`],rendering:[`listening`,`errored`,`cleaned_up`,`timed_out`,`cancelled`],listening:[`connected`,`timed_out`,`cancelled`,`errored`,`cleaned_up`],connected:[`responded`,`timed_out`,`cancelled`,`errored`,`cleaned_up`],responded:[`cleaned_up`],timed_out:[`cleaned_up`],cancelled:[`cleaned_up`],errored:[`cleaned_up`],cleaned_up:[]};function $p(e,t,n,r){return Qp[e].includes(t)?{ok:!0,to:t,entry:{from:e,to:t,timestamp:Date.now(),trigger:r}}:{ok:!1,error:{code:`invalid_transition`,message:`Cannot transition from "${e}" to "${t}"`,from:e,to:t}}}function em(e){return Qp[e].length===0}const tm=1024,nm=new Set([`user-closed`,`host-dismissed`,`replaced`]);function rm(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function im(e,t,n){let r={code:e,message:t};return n!==void 0&&(r.details=n),{kind:`error`,error:r}}function am(e,t,n,r){e.writeHead(t,{"Content-Type":`application/json`,"Access-Control-Allow-Origin":r??`null`}),e.end(JSON.stringify(n))}async function om(e){return await new Promise((t,n)=>{let r=[],i=0;e.on(`data`,t=>{if(i+=t.length,i>65536){n(Error(`Callback payload exceeds 64KB limit`)),e.destroy();return}r.push(t)}),e.on(`end`,()=>t(Buffer.concat(r).toString(`utf8`))),e.on(`error`,n)})}function sm(e,t){if(typeof e!=`string`||e.length!==t.length)return!1;let n=Buffer.from(e,`hex`),r=Buffer.from(t,`hex`);return n.length===r.length?Xe(n,r):!1}function cm(e,t){let n=e.headers.origin;if(n!==void 0)return n===t;let r=e.headers.referer;return r==null?!0:r.startsWith(t)}function lm(e){return(e.headers[`content-type`]??``).startsWith(`application/json`)}function um(e){for(let[t,n]of Object.entries(e)){let e=typeof n==`string`?n:JSON.stringify(n);if(Buffer.byteLength(e,`utf8`)>8192)return`Form field "${t}" exceeds 8KB limit`}return null}function dm(e){return Array.isArray(e)&&e.length>tm?`Selection exceeds ${tm} items (got ${e.length})`:null}function fm(e,t,n){let r=typeof e.actionId==`string`?e.actionId:``,i=n.find(e=>e.id===r);if(!i)return im(`INVALID_ACTION`,`Unknown actionId: ${r||`(missing)`}`);let a=typeof e.selection==`string`||Array.isArray(e.selection)?e.selection:void 0,o=rm(e.formData)?e.formData:void 0,s={surfaceId:t,actionId:i.id,actionType:i.type,timestamp:typeof e.timestamp==`string`?e.timestamp:new Date().toISOString(),sourceTransport:`browser`};return e.value!==void 0&&(s.value=e.value),a!==void 0&&(s.selection=a),o!==void 0&&(s.formData=o),e.annotations!==void 0&&(s.annotations=e.annotations),typeof e.label==`string`?s.label=e.label:i.label&&(s.label=i.label),{kind:`result`,result:s}}function pm(e){switch(e.kind){case`timeout`:return`timed_out`;case`cancelled`:return`cancelled`;case`error`:return`errored`;case`result`:return`responded`;default:return`errored`}}function mm(e,t,n,r,i){let a=i??Je(16).toString(`hex`),o=`created`,s=[],c=!1,l,u,d=new Promise(e=>{u=e}),f=e=>{if(em(o))return l;let t=pm(e),i=$p(o,t,s,`resolve`);return i.ok?(o=t,s.push(i.entry),l=e,u?.(e),n&&r&&n.transitionSession(r,t,`resolve`),e):l};return{nonce:a,promise:d,get state(){return o},get stateHistory(){return s},settleTimeout(e){return f({kind:`timeout`,waitedMs:e})},settleCancelled(e){return f({kind:`cancelled`,reason:e})},settleError(e,t,n){return f(im(e,t,n))},async handle(n,r,i){if(!lm(n)){let e=f(im(X.UNSUPPORTED_MEDIA_TYPE,`Content-Type must be application/json`));return am(r,415,{ok:!1,error:X.UNSUPPORTED_MEDIA_TYPE},i),e}if(!cm(n,i)){let e=n.headers.origin??n.headers.referer??`(missing)`,t=f(im(X.INVALID_ORIGIN,`Unexpected callback origin: ${e}`));return am(r,403,{ok:!1,error:X.INVALID_ORIGIN},i),t}let o=``;try{o=await om(n)}catch(e){let t=f(im(`INVALID_PAYLOAD`,e instanceof Error?e.message:`Unable to read callback payload`));return am(r,413,{ok:!1,error:X.PAYLOAD_TOO_LARGE},i),t}let s;try{let e=JSON.parse(o);if(!rm(e))throw Error(`Callback payload must be an object`);s=e}catch(e){let t=f(im(`INVALID_PAYLOAD`,e instanceof Error?e.message:`Malformed callback payload`));return am(r,400,{ok:!1,error:`invalid-json`},i),t}if(c){let e=im(X.DUPLICATE_CALLBACK,`Nonce has already been used`);return am(r,403,{ok:!1,error:X.DUPLICATE_CALLBACK},i),e}if(!sm(typeof s.nonce==`string`?s.nonce:``,a)){let e=f(im(X.INVALID_NONCE,`Callback nonce did not match`));return am(r,403,{ok:!1,error:X.INVALID_NONCE},i),e}c=!0;let l=dm(s.selection);if(l){let e=f(im(`SELECTION_TOO_LARGE`,l));return am(r,413,{ok:!1,error:`selection-too-large`},i),e}if(rm(s.formData)){let e=um(s.formData);if(e){let t=f(im(`PAYLOAD_FIELD_TOO_LARGE`,e));return am(r,413,{ok:!1,error:`field-too-large`},i),t}}if(s.kind===`cancelled`){let e=typeof s.reason==`string`?s.reason:``;if(!nm.has(e)){let t=f(im(`INVALID_CANCEL_REASON`,`Unsupported cancel reason: ${e||`(missing)`}`));return am(r,400,{ok:!1,error:`invalid-cancel-reason`},i),t}let t=f({kind:`cancelled`,reason:e});return am(r,200,{ok:!0,kind:`cancelled`},i),t}let u=f(fm(s,e,t));return am(r,u.kind===`error`?400:200,{ok:u.kind!==`error`,kind:u.kind},i),u}}}const hm=`Install AI Kit with <code>${Y(`npx -y @vpxa/aikit@latest init --user`)}</code>.`;function gm(e){let t=Date.now();return{id:e.id,state:`created`,nonce:e.nonce,surfaceId:e.surfaceId,transport:e.transport,createdAt:t,updatedAt:t,stateHistory:[],responsePromise:null,resolveOutcome:null,cleanupCallbacks:[],nonceConsumed:!1}}var _m=class{sessions;maxSessions;rejectedCount;constructor(e=16){this.sessions=new Map,this.maxSessions=e,this.rejectedCount=0}createSession(e){if(this.sessions.size>=this.maxSessions)return this.rejectedCount++,{ok:!1,error:Zp(X.SESSION_LIMIT_REACHED,`Session limit reached`)};let t=Ye(),n=gm({id:t,nonce:e.nonce,surfaceId:e.surfaceId,transport:e.transport});return this.sessions.set(t,n),{ok:!0,session:n}}getSession(e){return this.sessions.get(e)||Zp(X.SESSION_NOT_FOUND,`Session ${e} not found`)}transitionSession(e,t,n){let r=this.sessions.get(e);if(!r)return{ok:!1,error:Zp(X.SESSION_NOT_FOUND,`Session ${e} not found`)};let i=$p(r.state,t,r.stateHistory,n);return i.ok?(r.state=i.to,r.stateHistory.push(i.entry),r.updatedAt=Date.now(),{ok:!0,record:r}):{ok:!1,error:Zp(X.INVALID_TRANSITION,i.error.message)}}consumeNonce(e){let t=this.sessions.get(e);return t?t.nonceConsumed?{ok:!1,error:Zp(X.DUPLICATE_CALLBACK,`Nonce already consumed`)}:(t.nonceConsumed=!0,t.updatedAt=Date.now(),{ok:!0}):{ok:!1,error:Zp(X.SESSION_NOT_FOUND,`Session ${e} not found`)}}removeSession(e){return this.sessions.delete(e)}cleanupStale(e){let t=Date.now(),n=0;for(let[r,i]of this.sessions.entries())i.state!==`connected`&&t-i.updatedAt>e&&(i.resolveOutcome&&(i.resolveOutcome({outcome:`timeout`}),i.resolveOutcome=null,i.responsePromise=null),this.sessions.delete(r),n++);return n}shutdown(){for(let[,e]of this.sessions.entries()){e.resolveOutcome&&(e.resolveOutcome({outcome:`shutdown`}),e.resolveOutcome=null,e.responsePromise=null);for(let t of e.cleanupCallbacks)try{t()}catch{}e.cleanupCallbacks=[]}this.sessions.clear()}get activeCount(){return this.sessions.size}get rejectedSessionCount(){return this.rejectedCount}setResponseResolver(e,t){let n=this.sessions.get(e);return n?(n.resolveOutcome=t,n.updatedAt=Date.now(),{ok:!0}):{ok:!1,error:Zp(X.SESSION_NOT_FOUND,`Session ${e} not found`)}}};const vm=String.raw`(function(){
296
296
  'use strict';
297
297
 
298
298
  var SVG_NS = 'http://www.w3.org/2000/svg';
@@ -2673,7 +2673,7 @@ None.`:`### Stale Lessons\n${l.map(e=>`- **${e.title}** (\`${e.path}\`) — effe
2673
2673
  };
2674
2674
 
2675
2675
  init();
2676
- })();`;function vm(){let e;return()=>{if(e!==void 0)return e;try{e=N(le(import.meta.url).resolve(`mermaid/dist/mermaid.min.js`),`utf-8`)}catch{e=``}return e}}const ym={id:`mermaid`,cdn:`https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js`,inlineSource:_m,initScript:`window.__aikit_initMermaid = function() {
2676
+ })();`;function ym(){let e;return()=>{if(e!==void 0)return e;try{e=N(le(import.meta.url).resolve(`mermaid/dist/mermaid.min.js`),`utf-8`)}catch{e=``}return e}}const bm={id:`mermaid`,cdn:`https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js`,inlineSource:vm,initScript:`window.__aikit_initMermaid = function() {
2677
2677
  if (typeof mermaid === 'undefined') return;
2678
2678
  if (document.readyState === 'loading') {
2679
2679
  document.addEventListener('DOMContentLoaded', window.__aikit_initMermaid);
@@ -2686,7 +2686,7 @@ None.`:`### Stale Lessons\n${l.map(e=>`- **${e.title}** (\`${e.path}\`) — effe
2686
2686
  }
2687
2687
  mermaid.initialize({ startOnLoad: false, theme: theme });
2688
2688
  mermaid.run();
2689
- };`,onload:`window.__aikit_initMermaid&&window.__aikit_initMermaid()`,local:{route:`/vendor/mermaid.min.js`,getSource:vm()}},bm=new Map([[`mermaid`,ym]]);function xm(e,t){if(!e?.length)return;let n=[];for(let r of e){let e=bm.get(r);if(e){if(t===`browser`){n.push({inlineSource:e.inlineSource,onload:e.onload});continue}if(t===`mcp-app`){n.push({inlineSource:e.inlineSource,onload:e.onload});continue}n.push({src:e.cdn,initScript:e.initScript,onload:e.onload})}}return n.length>0?n:void 0}function Sm(){let e=[];for(let t of bm.values())t.local&&e.push({route:t.local.route,getSource:t.local.getSource,cdn:t.cdn});return e}const Cm=300*1e3,wm=15*1e3,Tm=`/@aikit/blocks-interactive/dist/`;var Em=class{maxTokens;refillPerSecond;tokens;lastRefill;constructor(e,t){this.maxTokens=e,this.refillPerSecond=t,this.tokens=e,this.lastRefill=Date.now()}tryConsume(){return this.#e(),this.tokens>=1?(--this.tokens,!0):!1}#e(){let e=Date.now(),t=(e-this.lastRefill)/1e3;this.tokens=Math.min(this.maxTokens,this.tokens+t*this.refillPerSecond),this.lastRefill=e}};let Dm=null,Om=null;const Z=new Map,km=new Em(10,10),Am=new Em(50,50);function jm(){return Dm||(Dm={manager:new gm,server:null,port:0},process.on(`exit`,()=>{Z.clear(),Dm?.manager.shutdown()})),Dm.manager}async function Mm(){if(!Dm)throw Error(`Browser server state not initialized`);let e=Dm;if(e.server)return e.port;if(Om)return Om;let t=Nr((e,t)=>{Lm(e,t)});return e.server=t,Om=new Promise((n,r)=>{t.listen(0,`127.0.0.1`,()=>{let i=t.address();typeof i==`object`&&i?(e.port=i.port,n(i.port)):r(Error(`Failed to resolve local browser address`))}),t.on(`error`,r)}),Om}let Nm;function Pm(){return Nm===void 0&&(Nm=i(`blocks-interactive`)),Nm}function Fm(e){if(!e.startsWith(Tm))return null;let t=Pm();if(!t)return null;let n=F(P(t,`dist`,e.slice(32))),r=F(P(t,`dist`)),i=process.platform===`win32`?`\\`:`/`;return!n.startsWith(r+i)&&n!==r?null:n}function Im(e){return`script-src 'nonce-${e}' 'strict-dynamic'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; connect-src 'self'; frame-ancestors 'self'; base-uri 'none'; object-src 'none'`}function Lm(e,t){let n=Dm;if(!n){qm(t);return}try{let r=new URL(e.url??`/`,`http://${e.headers.host??`127.0.0.1`}`).pathname,i=e.method??`GET`;if(i===`OPTIONS`){t.writeHead(204,{"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":`POST, GET, OPTIONS`,"Access-Control-Allow-Headers":`Content-Type`}),t.end();return}if(r.startsWith(`/__aikit_clipboard.png`)){if(i!==`POST`){Q(t,405,`METHOD_NOT_ALLOWED`,`Clipboard capture requires POST.`);return}Zm(t,Jm(e,n));return}if(r.startsWith(`/__aikit_screenshot.png`)){Xm(t,Jm(e,n));return}if(r.startsWith(`/__aikit_system_clipboard`)){if(i!==`POST`){Q(t,405,`METHOD_NOT_ALLOWED`,`System clipboard write requires POST.`);return}Qm(e,t);return}let a=r.match(/^\/present\/([^/]+)(?:\/(.*))?$/);if(a){let r=a[1],o=a[2]??``,s=Z.get(r);if(!s){Q(t,404,X.SESSION_NOT_FOUND,`Session ${r} not found`);return}if(o===``||o===`/`){t.writeHead(200,{"Content-Type":`text/html; charset=utf-8`,"Content-Security-Policy":Im(s.callbackSession.nonce)}),t.end(s.html);return}if(o===`viewer`){if(!s.viewerHtml){t.writeHead(404,{"Content-Type":`text/plain`}),t.end(`Not Found`);return}t.writeHead(200,{"Content-Type":`text/html; charset=utf-8`,"Content-Security-Policy":Im(s.callbackSession.nonce)}),t.end(s.viewerHtml);return}if(o===`ready`){if(i!==`POST`){Q(t,405,`METHOD_NOT_ALLOWED`,`Ready requires POST.`);return}if(!km.tryConsume()){Q(t,429,X.RATE_LIMITED,`Too many requests`);return}Rm(e,t,s,r,n).catch(()=>{qm(t)});return}if(o===`callback`){if(s.completed){Q(t,410,`SESSION_COMPLETED`,`Session already completed`);return}if(!s.ready){Q(t,403,`session_not_ready`,`Session not ready yet. POST /present/{id}/ready with the session nonce first.`);return}if(!km.tryConsume()){Q(t,429,X.RATE_LIMITED,`Too many requests`);return}s.callbackSession.handle(e,t,`http://127.0.0.1:${n.port}`).catch(()=>{qm(t)});return}t.writeHead(404,{"Content-Type":`text/plain`}),t.end(`Not Found`);return}let o=Sm().find(t=>e.url===t.route);if(o){let e=o.getSource();if(e){t.writeHead(200,{"Content-Type":`application/javascript; charset=utf-8`,"Cache-Control":`public, max-age=86400`}),t.end(e);return}t.writeHead(302,{Location:o.cdn}),t.end();return}if(r.startsWith(Tm)){if(!Am.tryConsume()){Q(t,429,X.RATE_LIMITED,`Too many requests`);return}let e=Fm(r);if(e)try{let n=N(e,`utf8`);t.writeHead(200,{"Content-Type":`application/javascript; charset=utf-8`}),t.end(n);return}catch{}}t.writeHead(404,{"Content-Type":`text/plain`}),t.end(`Not Found`)}catch{qm(t)}}function Q(e,t,n,r){if(!e.headersSent)try{e.writeHead(t,{"Content-Type":`application/json; charset=utf-8`}),e.end(JSON.stringify({error:n,message:r}))}catch{try{e.end()}catch{}}}async function Rm(e,t,n,r,i){try{let a=[],o=0;for await(let n of e){let r=n;if(o+=r.length,o>4096){e.destroy(),Q(t,413,`PAYLOAD_TOO_LARGE`,`Request body too large`);return}a.push(r)}let s=Buffer.concat(a).toString(`utf8`),c;try{c=JSON.parse(s)}catch{Q(t,400,`INVALID_JSON`,`Request body must be valid JSON`);return}if(!om(typeof c.nonce==`string`?c.nonce:``,n.callbackSession.nonce)){Q(t,403,X.INVALID_NONCE,`Nonce does not match`);return}n.ready=!0,i.manager.transitionSession(r,`connected`,`client-ready`),t.writeHead(200,{"Content-Type":`application/json`}),t.end(JSON.stringify({ok:!0}))}catch{qm(t)}}function zm(e){let t=Y(e.id),n=Y(e.label);if(e.type===`select`||e.type===`multi-select`)return`<label class="present-action-field"><span>${n}</span><select data-action-id="${t}"${e.type===`multi-select`?` multiple`:``}>${(e.options??[]).map(e=>`<option value="${Y(e.value)}">${Y(e.label)}</option>`).join(``)}</select></label>`;if(e.type===`form-submit`){let r=e.schema;if(r)return`<form class="present-form" data-action-id="${t}" data-action-label="${n}">${Object.entries(r).map(([e,t])=>{let n=Y(t.description??e);return`<label class="present-action-field"><span>${n}</span><input type="${t.type===`number`?`number`:t.type===`boolean`?`checkbox`:`text`}" class="present-text-input" name="${Y(e)}" placeholder="${n}" /></label>`}).join(``)}<button type="submit" class="present-action-btn present-action-primary">${n}</button></form>`}return`<button type="button" class="present-action-btn present-action-${Y(e.variant??`default`)}" data-action-id="${t}" data-action-label="${n}">${n}</button>`}function Bm(e){return e.length===0?``:`<div class="bk-actions">${e.map(zm).join(``)}</div>`}function Vm(e,t){if(e.length===0)return``;let n=JSON.stringify(t);return`<style>
2689
+ };`,onload:`window.__aikit_initMermaid&&window.__aikit_initMermaid()`,local:{route:`/vendor/mermaid.min.js`,getSource:ym()}},xm=new Map([[`mermaid`,bm]]);function Sm(e,t){if(!e?.length)return;let n=[];for(let r of e){let e=xm.get(r);if(e){if(t===`browser`){n.push({inlineSource:e.inlineSource,onload:e.onload});continue}if(t===`mcp-app`){n.push({inlineSource:e.inlineSource,onload:e.onload});continue}n.push({src:e.cdn,initScript:e.initScript,onload:e.onload})}}return n.length>0?n:void 0}function Cm(){let e=[];for(let t of xm.values())t.local&&e.push({route:t.local.route,getSource:t.local.getSource,cdn:t.cdn});return e}const wm=300*1e3,Tm=15*1e3,Em=`/@aikit/blocks-interactive/dist/`;var Dm=class{maxTokens;refillPerSecond;tokens;lastRefill;constructor(e,t){this.maxTokens=e,this.refillPerSecond=t,this.tokens=e,this.lastRefill=Date.now()}tryConsume(){return this.#e(),this.tokens>=1?(--this.tokens,!0):!1}#e(){let e=Date.now(),t=(e-this.lastRefill)/1e3;this.tokens=Math.min(this.maxTokens,this.tokens+t*this.refillPerSecond),this.lastRefill=e}};let Om=null,km=null;const Z=new Map,Am=new Dm(10,10),jm=new Dm(50,50);function Mm(){return Om||(Om={manager:new _m,server:null,port:0},process.on(`exit`,()=>{Z.clear(),Om?.manager.shutdown()})),Om.manager}async function Nm(){if(!Om)throw Error(`Browser server state not initialized`);let e=Om;if(e.server)return e.port;if(km)return km;let t=Pr((e,t)=>{Rm(e,t)});return e.server=t,km=new Promise((n,r)=>{t.listen(0,`127.0.0.1`,()=>{let i=t.address();typeof i==`object`&&i?(e.port=i.port,n(i.port)):r(Error(`Failed to resolve local browser address`))}),t.on(`error`,r)}),km}let Pm;function Fm(){return Pm===void 0&&(Pm=i(`blocks-interactive`)),Pm}function Im(e){if(!e.startsWith(Em))return null;let t=Fm();if(!t)return null;let n=F(P(t,`dist`,e.slice(32))),r=F(P(t,`dist`)),i=process.platform===`win32`?`\\`:`/`;return!n.startsWith(r+i)&&n!==r?null:n}function Lm(e){return`script-src 'nonce-${e}' 'strict-dynamic'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; connect-src 'self'; frame-ancestors 'self'; base-uri 'none'; object-src 'none'`}function Rm(e,t){let n=Om;if(!n){Jm(t);return}try{let r=new URL(e.url??`/`,`http://${e.headers.host??`127.0.0.1`}`).pathname,i=e.method??`GET`;if(i===`OPTIONS`){t.writeHead(204,{"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":`POST, GET, OPTIONS`,"Access-Control-Allow-Headers":`Content-Type`}),t.end();return}if(r.startsWith(`/__aikit_clipboard.png`)){if(i!==`POST`){Q(t,405,`METHOD_NOT_ALLOWED`,`Clipboard capture requires POST.`);return}Qm(t,Ym(e,n));return}if(r.startsWith(`/__aikit_screenshot.png`)){Zm(t,Ym(e,n));return}if(r.startsWith(`/__aikit_system_clipboard`)){if(i!==`POST`){Q(t,405,`METHOD_NOT_ALLOWED`,`System clipboard write requires POST.`);return}$m(e,t);return}let a=r.match(/^\/present\/([^/]+)(?:\/(.*))?$/);if(a){let r=a[1],o=a[2]??``,s=Z.get(r);if(!s){Q(t,404,X.SESSION_NOT_FOUND,`Session ${r} not found`);return}if(o===``||o===`/`){t.writeHead(200,{"Content-Type":`text/html; charset=utf-8`,"Content-Security-Policy":Lm(s.callbackSession.nonce)}),t.end(s.html);return}if(o===`viewer`){if(!s.viewerHtml){t.writeHead(404,{"Content-Type":`text/plain`}),t.end(`Not Found`);return}t.writeHead(200,{"Content-Type":`text/html; charset=utf-8`,"Content-Security-Policy":Lm(s.callbackSession.nonce)}),t.end(s.viewerHtml);return}if(o===`ready`){if(i!==`POST`){Q(t,405,`METHOD_NOT_ALLOWED`,`Ready requires POST.`);return}if(!Am.tryConsume()){Q(t,429,X.RATE_LIMITED,`Too many requests`);return}zm(e,t,s,r,n).catch(()=>{Jm(t)});return}if(o===`callback`){if(s.completed){Q(t,410,`SESSION_COMPLETED`,`Session already completed`);return}if(!s.ready){Q(t,403,`session_not_ready`,`Session not ready yet. POST /present/{id}/ready with the session nonce first.`);return}if(!Am.tryConsume()){Q(t,429,X.RATE_LIMITED,`Too many requests`);return}s.callbackSession.handle(e,t,`http://127.0.0.1:${n.port}`).catch(()=>{Jm(t)});return}t.writeHead(404,{"Content-Type":`text/plain`}),t.end(`Not Found`);return}let o=Cm().find(t=>e.url===t.route);if(o){let e=o.getSource();if(e){t.writeHead(200,{"Content-Type":`application/javascript; charset=utf-8`,"Cache-Control":`public, max-age=86400`}),t.end(e);return}t.writeHead(302,{Location:o.cdn}),t.end();return}if(r.startsWith(Em)){if(!jm.tryConsume()){Q(t,429,X.RATE_LIMITED,`Too many requests`);return}let e=Im(r);if(e)try{let n=N(e,`utf8`);t.writeHead(200,{"Content-Type":`application/javascript; charset=utf-8`}),t.end(n);return}catch{}}t.writeHead(404,{"Content-Type":`text/plain`}),t.end(`Not Found`)}catch{Jm(t)}}function Q(e,t,n,r){if(!e.headersSent)try{e.writeHead(t,{"Content-Type":`application/json; charset=utf-8`}),e.end(JSON.stringify({error:n,message:r}))}catch{try{e.end()}catch{}}}async function zm(e,t,n,r,i){try{let a=[],o=0;for await(let n of e){let r=n;if(o+=r.length,o>4096){e.destroy(),Q(t,413,`PAYLOAD_TOO_LARGE`,`Request body too large`);return}a.push(r)}let s=Buffer.concat(a).toString(`utf8`),c;try{c=JSON.parse(s)}catch{Q(t,400,`INVALID_JSON`,`Request body must be valid JSON`);return}if(!sm(typeof c.nonce==`string`?c.nonce:``,n.callbackSession.nonce)){Q(t,403,X.INVALID_NONCE,`Nonce does not match`);return}n.ready=!0,i.manager.transitionSession(r,`connected`,`client-ready`),t.writeHead(200,{"Content-Type":`application/json`}),t.end(JSON.stringify({ok:!0}))}catch{Jm(t)}}function Bm(e){let t=Y(e.id),n=Y(e.label);if(e.type===`select`||e.type===`multi-select`)return`<label class="present-action-field"><span>${n}</span><select data-action-id="${t}"${e.type===`multi-select`?` multiple`:``}>${(e.options??[]).map(e=>`<option value="${Y(e.value)}">${Y(e.label)}</option>`).join(``)}</select></label>`;if(e.type===`form-submit`){let r=e.schema;if(r)return`<form class="present-form" data-action-id="${t}" data-action-label="${n}">${Object.entries(r).map(([e,t])=>{let n=Y(t.description??e);return`<label class="present-action-field"><span>${n}</span><input type="${t.type===`number`?`number`:t.type===`boolean`?`checkbox`:`text`}" class="present-text-input" name="${Y(e)}" placeholder="${n}" /></label>`}).join(``)}<button type="submit" class="present-action-btn present-action-primary">${n}</button></form>`}return`<button type="button" class="present-action-btn present-action-${Y(e.variant??`default`)}" data-action-id="${t}" data-action-label="${n}">${n}</button>`}function Vm(e){return e.length===0?``:`<div class="bk-actions">${e.map(Bm).join(``)}</div>`}function Hm(e,t){if(e.length===0)return``;let n=JSON.stringify(t);return`<style>
2690
2690
  .present-surface-title { margin: 0 0 0.75rem; font-size: 1.875rem; }
2691
2691
  .present-surface-description { margin: 0; color: var(--muted-foreground, #6b7280); }
2692
2692
  .present-actions-list { display: flex; flex-wrap: wrap; gap: 0.75rem; align-items: flex-end; }
@@ -2919,27 +2919,27 @@ None.`:`### Stale Lessons\n${l.map(e=>`- **${e.title}** (\`${e.path}\`) — effe
2919
2919
  navigator.sendBeacon('/callback', new Blob([body], { type: 'application/json' }));
2920
2920
  });
2921
2921
  })();
2922
- <\/script>`}function Hm(e){try{if(process.platform===`win32`){qn(`rundll32`,[`url.dll,FileProtocolHandler`,e]).on(`error`,()=>{});return}if(process.platform===`darwin`){qn(`open`,[e]);return}qn(`xdg-open`,[e])}catch{}}async function Um(e){try{let t=process.env.AGENT_BROWSER_ARGS??``,n=[`--start-maximized`,`--disable-infobars`,`--disable-popup-blocking`],r=t?t.split(`,`):[],i=!1;for(let e of n)r.includes(e)||(r.push(e),i=!0);i&&(process.env.AGENT_BROWSER_ARGS=r.join(`,`));let a=Zn();try{await a.launch(`ui`)}catch{await a.close().catch(()=>{}),await a.launch(`ui`)}a.resetIdleTimer();let o=`t0`;try{o=await a.open(e)}catch{await a.close().catch(()=>{}),await a.launch(`ui`),a.resetIdleTimer(),o=await a.open(e)}try{await a.exec(`set`,`viewport`,`1920`,`1080`),await a.exec(`eval`,`setTimeout(function(){window.focus()}, 300);`).catch(()=>{})}catch{}return{kind:`opened_managed`,url:e,pageId:o}}catch{return Hm(e),{kind:`opened_system`,url:e}}}function Wm(e,t,n,r){let i=[e.title];return e.description&&i.push(e.description),i.push(``),n.kind===`opened_managed`?i.push(`Opened in browser — ${t}`):n.kind===`opened_system`?i.push(`Opened in system browser — ${t}`):(i.push(`Failed to open browser: ${n.reason}`),i.push(`Manual URL: ${t}`)),i.push(r),i.join(`
2923
- `)}function Gm(e){return e.some(e=>e.id!==`__dismiss`)}function Km(e){return e.replace(`</head>`,`${Xh}\n</head>`).replace(`</body>`,`${Zh}\n</body>`)}function qm(e){if(!e.headersSent)try{e.writeHead(500,{"Content-Type":`text/plain`}),e.end(`Internal Server Error`)}catch{try{e.end()}catch{}}}function Jm(e,t){let n=e.headers.referer;return typeof n==`string`&&n.length>0?n:`http://127.0.0.1:${t.port}`}async function Ym(e,t){let n=Zn();n.isLaunched()||await n.launch(`headless`);let{base64:r}=await n.screenshotActiveTab({fullPage:t?.fullPage!==!1,format:t?.format,quality:t?.quality,annotate:t?.annotate});return Buffer.from(r,`base64`)}async function Xm(e,t){if(!t){e.writeHead(503,{"Content-Type":`text/plain; charset=utf-8`}),e.end(`Screenshot target is not ready.`);return}try{let n=await Ym(t);e.writeHead(200,{"Content-Type":`image/png`,"Cache-Control":`no-store`}),e.end(n)}catch(t){let n=t instanceof Error?t.message:String(t);console.warn(`[present] Screenshot capture failed:`,n),qm(e)}}async function Zm(e,t){if(!t){Q(e,503,`CLIPBOARD_CAPTURE_TARGET_MISSING`,`Clipboard target is not ready.`);return}try{let n=await Ym(t);e.writeHead(200,{"Content-Type":`image/png`,"Cache-Control":`no-store`}),e.end(n)}catch(t){let n=t instanceof Error?t.message:String(t);console.warn(`[present] Clipboard capture failed:`,n),Q(e,500,`CLIPBOARD_CAPTURE_FAILED`,`Clipboard capture failed: ${n}`)}}async function Qm(e,t){let n=[];e.on(`data`,e=>n.push(e)),e.on(`end`,async()=>{let e=Buffer.concat(n);if(e.length===0){Q(t,400,`EMPTY_BODY`,`No image data received.`);return}try{await $m(e),t.writeHead(200,{"Content-Type":`application/json`}),t.end(JSON.stringify({ok:!0}))}catch(e){let n=e instanceof Error?e.message:String(e);console.warn(`[present] System clipboard write failed:`,n),Q(t,500,`SYSTEM_CLIPBOARD_WRITE_FAILED`,`System clipboard write failed: ${n}`)}}),e.on(`error`,e=>{console.warn(`[present] System clipboard write request error:`,e.message),Q(t,500,`REQUEST_ERROR`,`Request stream error.`)})}async function $m(e){let t=P(Xn(),`aikit-clipboard-${Date.now()}-${Je(4).toString(`hex`)}.png`);try{if(Pe(t,e),process.platform===`win32`){let e=[`Add-Type -AssemblyName System.Drawing;`,`Add-Type -AssemblyName System.Windows.Forms;`,`$path = '${t.replace(/'/g,`''`)}';`,`$img = [System.Drawing.Image]::FromFile($path);`,`$img2 = [System.Drawing.Bitmap]::FromImage($img);`,`$img.Dispose();`,`[System.Windows.Forms.Clipboard]::SetImage($img2);`,`Start-Sleep -Milliseconds 500;`,`$img2.Dispose();`].join(` `);await new Promise((t,n)=>{Kn(`powershell.exe -NoProfile -STA -Command "${e.replace(/"/g,`\\"`)}"`,{timeout:15e3,windowsHide:!0},e=>{e?n(Error(`PowerShell clipboard write failed: ${e.message}`)):t()})})}else if(process.platform===`darwin`)await new Promise((e,n)=>{Kn(`osascript -e 'set the clipboard to (read (POSIX file "${t}") as picture)'`,{timeout:15e3},t=>{t?n(Error(`macOS clipboard write failed: ${t.message}`)):e()})});else try{await new Promise((e,n)=>{Kn(`wl-copy --type image/png < "${t}" 2>/dev/null`,{timeout:1e4},(t,r)=>{t?n(Error(`wl-copy failed: ${t.message}`)):e(r)})});return}catch{await new Promise((e,n)=>{Kn(`xclip -selection clipboard -t image/png -i "${t}"`,{timeout:15e3},t=>{t?n(Error(`Linux clipboard write failed (tried wl-copy then xclip): ${t.message}. Install wl-clipboard (Wayland) or xclip (X11) for clipboard image support.`)):e()})})}}finally{try{Ne(t)}catch{}}}function eh(e,t){return e.replace(/'\/callback'/g,`'/present/${t}/callback'`).replace(/"\/callback"/g,`"/present/${t}/callback"`).replace(/'\/ready'/g,`'/present/${t}/ready'`).replace(/"\/ready"/g,`"/present/${t}/ready"`)}function th(e,t){return e.replace(/src="\/viewer"/g,`src="/present/${t}/viewer"`)}async function nh(e,t,n){if(Oh(`<html><body style="font-family:system-ui;padding:2rem;color:#888;text-align:center"><p>Content opened in browser window.</p></body></html>`),e.data!=null&&t.inputSchema){let n=En({data:e.data,schema:t.inputSchema});if(!n.valid){let e=n.errors.map(e=>` ${e.path}: ${e.message}${e.expected?` (expected: ${e.expected}, got: ${e.received})`:``}`).join(`
2924
- `);return{content:[{type:`text`,text:`[ERROR:VALIDATION] Template "${t.id}" data validation failed:\n${e}\n\nExpected schema: ${JSON.stringify(t.inputSchema,null,2)}`}],structuredContent:{kind:`error`,error:{code:`VIEWER_DATA_INVALID`,message:`Template "${t.id}" data validation failed:\n${e}\n\nExpected schema: ${JSON.stringify(t.inputSchema,null,2)}`}},isError:!0}}}let r=Km(bp(t.resolveHtml(),e.data??null,t.injectId,t.transformData)),i=jm(),a=Je(16).toString(`hex`),o=i.createSession({surfaceId:`viewer`,transport:`viewer`,nonce:a});if(!o.ok)return{content:[{type:`text`,text:`${e.title}\n\nUnable to start local browser transport.`}],structuredContent:{kind:`error`,error:{code:`BROWSER_START_FAILED`,message:o.error.message}},isError:!0};let s=o.session.id,c=pm(`viewer`,e.actions??[],i,s,a),l=th(wr({title:e.title,subtitle:e.description,html:[`<div class="present-viewer-container">`,` <iframe class="present-viewer-iframe" src="/viewer" sandbox="allow-scripts allow-same-origin"></iframe>`,` ${Qh(a)}`,`</div>`].join(`
2922
+ <\/script>`}function Um(e){try{if(process.platform===`win32`){let t=Yn(`rundll32`,[`url.dll,FileProtocolHandler`,e],{detached:!0,stdio:`ignore`,windowsHide:!0});t.on(`error`,()=>{}),t.unref();return}if(process.platform===`darwin`){qn(`open`,[e]);return}qn(`xdg-open`,[e])}catch{}}async function Wm(e){try{let t=process.env.AGENT_BROWSER_ARGS??``,n=[`--start-maximized`,`--disable-infobars`,`--disable-popup-blocking`],r=t?t.split(`,`):[],i=!1;for(let e of n)r.includes(e)||(r.push(e),i=!0);i&&(process.env.AGENT_BROWSER_ARGS=r.join(`,`));let a=Qn();try{await a.launch(`ui`)}catch{await a.close().catch(()=>{}),await a.launch(`ui`)}a.resetIdleTimer();let o=`t0`;try{o=await a.open(e)}catch{await a.close().catch(()=>{}),await a.launch(`ui`),a.resetIdleTimer(),o=await a.open(e)}try{await a.exec(`set`,`viewport`,`1920`,`1080`),await a.exec(`eval`,`setTimeout(function(){window.focus()}, 300);`).catch(()=>{})}catch{}return{kind:`opened_managed`,url:e,pageId:o}}catch{return Um(e),{kind:`opened_system`,url:e}}}function Gm(e,t,n,r){let i=[e.title];return e.description&&i.push(e.description),i.push(``),n.kind===`opened_managed`?i.push(`Opened in browser — ${t}`):n.kind===`opened_system`?i.push(`Opened in system browser — ${t}`):(i.push(`Failed to open browser: ${n.reason}`),i.push(`Manual URL: ${t}`)),i.push(r),i.join(`
2923
+ `)}function Km(e){return e.some(e=>e.id!==`__dismiss`)}function qm(e){return e.replace(`</head>`,`${Zh}\n</head>`).replace(`</body>`,`${Qh}\n</body>`)}function Jm(e){if(!e.headersSent)try{e.writeHead(500,{"Content-Type":`text/plain`}),e.end(`Internal Server Error`)}catch{try{e.end()}catch{}}}function Ym(e,t){let n=e.headers.referer;return typeof n==`string`&&n.length>0?n:`http://127.0.0.1:${t.port}`}async function Xm(e,t){let n=Qn();n.isLaunched()||await n.launch(`headless`);let{base64:r}=await n.screenshotActiveTab({fullPage:t?.fullPage!==!1,format:t?.format,quality:t?.quality,annotate:t?.annotate});return Buffer.from(r,`base64`)}async function Zm(e,t){if(!t){e.writeHead(503,{"Content-Type":`text/plain; charset=utf-8`}),e.end(`Screenshot target is not ready.`);return}try{let n=await Xm(t);e.writeHead(200,{"Content-Type":`image/png`,"Cache-Control":`no-store`}),e.end(n)}catch(t){let n=t instanceof Error?t.message:String(t);console.warn(`[present] Screenshot capture failed:`,n),Jm(e)}}async function Qm(e,t){if(!t){Q(e,503,`CLIPBOARD_CAPTURE_TARGET_MISSING`,`Clipboard target is not ready.`);return}try{let n=await Xm(t);e.writeHead(200,{"Content-Type":`image/png`,"Cache-Control":`no-store`}),e.end(n)}catch(t){let n=t instanceof Error?t.message:String(t);console.warn(`[present] Clipboard capture failed:`,n),Q(e,500,`CLIPBOARD_CAPTURE_FAILED`,`Clipboard capture failed: ${n}`)}}async function $m(e,t){let n=[];e.on(`data`,e=>n.push(e)),e.on(`end`,async()=>{let e=Buffer.concat(n);if(e.length===0){Q(t,400,`EMPTY_BODY`,`No image data received.`);return}try{await eh(e),t.writeHead(200,{"Content-Type":`application/json`}),t.end(JSON.stringify({ok:!0}))}catch(e){let n=e instanceof Error?e.message:String(e);console.warn(`[present] System clipboard write failed:`,n),Q(t,500,`SYSTEM_CLIPBOARD_WRITE_FAILED`,`System clipboard write failed: ${n}`)}}),e.on(`error`,e=>{console.warn(`[present] System clipboard write request error:`,e.message),Q(t,500,`REQUEST_ERROR`,`Request stream error.`)})}async function eh(e){let t=P(Zn(),`aikit-clipboard-${Date.now()}-${Je(4).toString(`hex`)}.png`);try{if(Pe(t,e),process.platform===`win32`){let e=[`Add-Type -AssemblyName System.Drawing;`,`Add-Type -AssemblyName System.Windows.Forms;`,`$path = '${t.replace(/'/g,`''`)}';`,`$img = [System.Drawing.Image]::FromFile($path);`,`$img2 = [System.Drawing.Bitmap]::FromImage($img);`,`$img.Dispose();`,`[System.Windows.Forms.Clipboard]::SetImage($img2);`,`Start-Sleep -Milliseconds 500;`,`$img2.Dispose();`].join(` `);await new Promise((t,n)=>{Kn(`powershell.exe -NoProfile -STA -Command "${e.replace(/"/g,`\\"`)}"`,{timeout:15e3,windowsHide:!0},e=>{e?n(Error(`PowerShell clipboard write failed: ${e.message}`)):t()})})}else if(process.platform===`darwin`)await new Promise((e,n)=>{Kn(`osascript -e 'set the clipboard to (read (POSIX file "${t}") as picture)'`,{timeout:15e3},t=>{t?n(Error(`macOS clipboard write failed: ${t.message}`)):e()})});else try{await new Promise((e,n)=>{Kn(`wl-copy --type image/png < "${t}" 2>/dev/null`,{timeout:1e4},(t,r)=>{t?n(Error(`wl-copy failed: ${t.message}`)):e(r)})});return}catch{await new Promise((e,n)=>{Kn(`xclip -selection clipboard -t image/png -i "${t}"`,{timeout:15e3},t=>{t?n(Error(`Linux clipboard write failed (tried wl-copy then xclip): ${t.message}. Install wl-clipboard (Wayland) or xclip (X11) for clipboard image support.`)):e()})})}}finally{try{Ne(t)}catch{}}}function th(e,t){return e.replace(/'\/callback'/g,`'/present/${t}/callback'`).replace(/"\/callback"/g,`"/present/${t}/callback"`).replace(/'\/ready'/g,`'/present/${t}/ready'`).replace(/"\/ready"/g,`"/present/${t}/ready"`)}function nh(e,t){return e.replace(/src="\/viewer"/g,`src="/present/${t}/viewer"`)}async function rh(e,t,n){if(kh(`<html><body style="font-family:system-ui;padding:2rem;color:#888;text-align:center"><p>Content opened in browser window.</p></body></html>`),e.data!=null&&t.inputSchema){let n=En({data:e.data,schema:t.inputSchema});if(!n.valid){let e=n.errors.map(e=>` ${e.path}: ${e.message}${e.expected?` (expected: ${e.expected}, got: ${e.received})`:``}`).join(`
2924
+ `);return{content:[{type:`text`,text:`[ERROR:VALIDATION] Template "${t.id}" data validation failed:\n${e}\n\nExpected schema: ${JSON.stringify(t.inputSchema,null,2)}`}],structuredContent:{kind:`error`,error:{code:`VIEWER_DATA_INVALID`,message:`Template "${t.id}" data validation failed:\n${e}\n\nExpected schema: ${JSON.stringify(t.inputSchema,null,2)}`}},isError:!0}}}let r=qm(xp(t.resolveHtml(),e.data??null,t.injectId,t.transformData)),i=Mm(),a=Je(16).toString(`hex`),o=i.createSession({surfaceId:`viewer`,transport:`viewer`,nonce:a});if(!o.ok)return{content:[{type:`text`,text:`${e.title}\n\nUnable to start local browser transport.`}],structuredContent:{kind:`error`,error:{code:`BROWSER_START_FAILED`,message:o.error.message}},isError:!0};let s=o.session.id,c=mm(`viewer`,e.actions??[],i,s,a),l=nh(Tr({title:e.title,subtitle:e.description,html:[`<div class="present-viewer-container">`,` <iframe class="present-viewer-iframe" src="/viewer" sandbox="allow-scripts allow-same-origin"></iframe>`,` ${$h(a)}`,`</div>`].join(`
2925
2925
  `),css:[[`.present-viewer-container {`,` flex: 1;`,` min-height: calc(100vh - 12rem);`,` position: relative;`,` border-radius: 0.75rem;`,` overflow: hidden;`,` border: none;`,`}`,`.present-viewer-iframe {`,` border: none;`,` width: 100%;`,` height: 100%;`,` position: absolute;`,` inset: 0;`,` border-radius: inherit;`,`}`].join(`
2926
- `)],islands:[],payload:void 0,nonce:a,generatedAt:new Date().toISOString(),colorScheme:e.colorScheme,lang:e.lang,dir:e.dir,transport:`browser`,exportPolicy:`local-interactive`,imageExportMode:`browser-server`,footerContentHtml:mm}),s);Z.set(s,{callbackSession:c,html:l,viewerHtml:r,ready:!1,completed:!1,createdAt:Date.now()});let u=``;try{u=`http://127.0.0.1:${await Mm()}/present/${s}`}catch(t){return Z.delete(s),i.removeSession(s),{content:[{type:`text`,text:`${e.title}\n\nUnable to start local browser transport.`}],structuredContent:{kind:`error`,error:{code:`BROWSER_START_FAILED`,message:t instanceof Error?t.message:`Unable to start browser transport`}},isError:!0}}let d=await Um(u),f=Z.get(s);f&&(f.launchOutcome=d);let p=n?.responseTimeoutMs??Cm;return setTimeout(()=>{Z.delete(s),i.removeSession(s)},p),{content:[{type:`text`,text:Wm(e,u,d,`Rendered.`)}],structuredContent:{kind:`rendered`,reason:`no-response-required`}}}async function rh(e,t){Oh(`<html><body style="font-family:system-ui;padding:2rem;color:#888;text-align:center"><p>Content opened in browser window.</p></body></html>`);let n=jm(),r=Je(16).toString(`hex`),i=Mr(e,{transport:`browser`,registry:Kp,blockVendorScripts:dp(),nonce:r}),a=n.createSession({surfaceId:i.surfaceId,transport:`browser`,nonce:r});if(!a.ok)return{content:[{type:`text`,text:`${e.title}\n\nUnable to start local browser transport.`}],structuredContent:{kind:`error`,error:{code:`BROWSER_START_FAILED`,message:a.error.message}},isError:!0};let o=a.session.id,s=pm(i.surfaceId,i.actions,n,o,r),c=xm(i.vendorScripts,`browser`);Sm();let l=i.actions.length>0?Bm(i.actions):``,u=i.actions.length>0?Vm(i.actions,s.nonce):``,d=wr({title:e.title,subtitle:e.description,html:[i.html,l,u].filter(Boolean).join(`
2927
- `),css:i.css,islands:i.islands,payload:i.payload,nonce:i.nonce,generatedAt:new Date().toISOString(),colorScheme:e.colorScheme,lang:e.lang,dir:e.dir,transport:`browser`,exportPolicy:i.exportPolicy,imageExportMode:`browser-server`,footerContentHtml:mm,headScripts:c}),f=eh(i.actions.length>0?ig(d,i.nonce):d,o);Z.set(o,{callbackSession:s,html:f,ready:!1,completed:!1,createdAt:Date.now()});let p=``;try{p=`http://127.0.0.1:${await Mm()}/present/${o}`}catch(t){return Z.delete(o),n.removeSession(o),n.shutdown(),{content:[{type:`text`,text:`${e.title}\n\nUnable to start local browser transport.`}],structuredContent:s.settleError(`BROWSER_START_FAILED`,t instanceof Error?t.message:`Unable to start browser transport`),isError:!0}}let m=await Um(p),h=Z.get(o);h&&(h.launchOutcome=m);let g=Gm(i.actions),_=t?.responseTimeoutMs??Cm,v=t?.responseTimeoutMs?Math.min(t.responseTimeoutMs,wm):wm;if(!g)return t?.responseRequired?(setTimeout(()=>{Z.delete(o);try{n.removeSession(o)}catch{}},v),{content:[{type:`text`,text:Wm(e,p,m,`Response required but no interactive actions available.`)}],structuredContent:s.settleError(`NO_INTERACTIVE_ACTIONS`,`The surface has response.required=true but no interactive actions to respond to.`),isError:!0}):(setTimeout(()=>{Z.delete(o);try{n.removeSession(o)}catch{}},_),{content:[{type:`text`,text:Wm(e,p,m,`Rendered.`)}],structuredContent:{kind:`rendered`,reason:`no-response-required`}});let y=await Promise.race([s.promise,new Promise(e=>{setTimeout(()=>{let t=Z.get(o);if(t?.ready||t?.completed)return;Z.delete(o);let n=m.kind===`opened_managed`?`No browser client ready within ${v}ms.`:m.kind===`opened_system`?`Fell back to system browser, but no browser client ready within ${v}ms.`:`Browser open failed: ${m.reason}. No client ready within ${v}ms.`;e(s.settleError(`BROWSER_CONNECT_TIMEOUT`,n))},v)}),new Promise(e=>{setTimeout(()=>e(s.settleTimeout(_)),_)})]),b=Z.get(o);b&&(b.completed=!0),setTimeout(()=>{Z.delete(o);try{n.removeSession(o)}catch{}},_);let x=y.kind===`result`?`Selected action: ${y.result.actionId}`:y.kind===`timeout`?`Timed out after ${y.waitedMs}ms.`:y.kind===`cancelled`?`Cancelled: ${y.reason}.`:y.kind===`error`?`Error: ${y.error.message}`:`Rendered.`;return{content:[{type:`text`,text:Wm(e,p,m,x)}],structuredContent:y,isError:y.kind===`error`}}const ih={id:`browser`,priority:20,canHandle(e,t){let n=qh(e);return Jp(n)||!!t.preferBrowser&&!!Jh(n)},async render(e,t){return rh(e,t.session)}},ah=`openai/outputTemplate`,oh=`ui/resourceUri`,sh={connectDomains:[],resourceDomains:[]},ch={connect_domains:[],resource_domains:[]};function lh(e){return{ui:{resourceUri:e,visibility:[`model`,`app`]},[oh]:e,[ah]:e,"openai/widgetAccessible":!0}}function uh(){return{ui:{prefersBorder:!1,csp:sh},"openai/widgetDescription":`AI Kit renders structured visual surfaces such as dashboards, charts, reports, and diagrams.`,"openai/widgetPrefersBorder":!1,"openai/widgetCSP":ch}}function dh(e){return{ui:{resourceUri:e},[oh]:e,[ah]:e}}function fh(e){return{...e,schemaVersion:1}}function ph(e){try{let t=Mr(e,{transport:`mcp-app`,registry:Kp,blockVendorScripts:dp()}),n=xm(t.vendorScripts,`mcp-app`),r=wr({title:e.title,subtitle:e.description,html:t.html,css:t.css,islands:t.islands,payload:t.payload,nonce:t.nonce,colorScheme:e.colorScheme,lang:e.lang,dir:e.dir,transport:`mcp-app`,exportPolicy:t.exportPolicy,imageExportMode:`disabled`,showToolbox:t.exportPolicy!==`static-only`,showInstallGuide:!1,footerContentHtml:mm,headScripts:n}),i={kind:`rendered`,reason:`no-response-required`},a=eg(r);Oh(a);let o=Yh(e,i,{includeSurfaceHeader:!1}),s=Eh(),c=jh(s);return c&&kh(c,a),{content:[{type:`text`,text:o}],structuredContent:fh(e),_meta:dh(s),ui:{type:`resource`,uri:s}}}catch(t){return og(`RENDER_FAILED`,t instanceof Error?t.message:`Failed to render ChannelSurface`,void 0,e.title)}}const mh={id:`mcp-app`,priority:30,canHandle(e,t){return!0},async render(e,t){return ph(e)}};var hh=class{handlers=[];register(e){let t=this.handlers.findIndex(t=>t.id===e.id);t===-1?this.handlers.push(e):this.handlers[t]=e}unregister(e){let t=this.handlers.findIndex(t=>t.id===e);t!==-1&&this.handlers.splice(t,1)}select(e,t){return[...this.handlers].sort((e,t)=>(e.priority??99)-(t.priority??99)).find(n=>n.canHandle(e,t))??null}getAll(){return[...this.handlers]}};function gh(e){return`<script nonce="${Y(e)}">
2926
+ `)],islands:[],payload:void 0,nonce:a,generatedAt:new Date().toISOString(),colorScheme:e.colorScheme,lang:e.lang,dir:e.dir,transport:`browser`,exportPolicy:`local-interactive`,imageExportMode:`browser-server`,footerContentHtml:hm}),s);Z.set(s,{callbackSession:c,html:l,viewerHtml:r,ready:!1,completed:!1,createdAt:Date.now()});let u=``;try{u=`http://127.0.0.1:${await Nm()}/present/${s}`}catch(t){return Z.delete(s),i.removeSession(s),{content:[{type:`text`,text:`${e.title}\n\nUnable to start local browser transport.`}],structuredContent:{kind:`error`,error:{code:`BROWSER_START_FAILED`,message:t instanceof Error?t.message:`Unable to start browser transport`}},isError:!0}}let d=await Wm(u),f=Z.get(s);f&&(f.launchOutcome=d);let p=n?.responseTimeoutMs??wm;return setTimeout(()=>{Z.delete(s),i.removeSession(s)},p),{content:[{type:`text`,text:Gm(e,u,d,`Rendered.`)}],structuredContent:{kind:`rendered`,reason:`no-response-required`}}}async function ih(e,t){kh(`<html><body style="font-family:system-ui;padding:2rem;color:#888;text-align:center"><p>Content opened in browser window.</p></body></html>`);let n=Mm(),r=Je(16).toString(`hex`),i=Nr(e,{transport:`browser`,registry:qp,blockVendorScripts:fp(),nonce:r}),a=n.createSession({surfaceId:i.surfaceId,transport:`browser`,nonce:r});if(!a.ok)return{content:[{type:`text`,text:`${e.title}\n\nUnable to start local browser transport.`}],structuredContent:{kind:`error`,error:{code:`BROWSER_START_FAILED`,message:a.error.message}},isError:!0};let o=a.session.id,s=mm(i.surfaceId,i.actions,n,o,r),c=Sm(i.vendorScripts,`browser`);Cm();let l=i.actions.length>0?Vm(i.actions):``,u=i.actions.length>0?Hm(i.actions,s.nonce):``,d=Tr({title:e.title,subtitle:e.description,html:[i.html,l,u].filter(Boolean).join(`
2927
+ `),css:i.css,islands:i.islands,payload:i.payload,nonce:i.nonce,generatedAt:new Date().toISOString(),colorScheme:e.colorScheme,lang:e.lang,dir:e.dir,transport:`browser`,exportPolicy:i.exportPolicy,imageExportMode:`browser-server`,footerContentHtml:hm,headScripts:c}),f=th(i.actions.length>0?ag(d,i.nonce):d,o);Z.set(o,{callbackSession:s,html:f,ready:!1,completed:!1,createdAt:Date.now()});let p=``;try{p=`http://127.0.0.1:${await Nm()}/present/${o}`}catch(t){return Z.delete(o),n.removeSession(o),n.shutdown(),{content:[{type:`text`,text:`${e.title}\n\nUnable to start local browser transport.`}],structuredContent:s.settleError(`BROWSER_START_FAILED`,t instanceof Error?t.message:`Unable to start browser transport`),isError:!0}}let m=await Wm(p),h=Z.get(o);h&&(h.launchOutcome=m);let g=Km(i.actions),_=t?.responseTimeoutMs??wm,v=t?.responseTimeoutMs?Math.min(t.responseTimeoutMs,Tm):Tm;if(!g)return t?.responseRequired?(setTimeout(()=>{Z.delete(o);try{n.removeSession(o)}catch{}},v),{content:[{type:`text`,text:Gm(e,p,m,`Response required but no interactive actions available.`)}],structuredContent:s.settleError(`NO_INTERACTIVE_ACTIONS`,`The surface has response.required=true but no interactive actions to respond to.`),isError:!0}):(setTimeout(()=>{Z.delete(o);try{n.removeSession(o)}catch{}},_),{content:[{type:`text`,text:Gm(e,p,m,`Rendered.`)}],structuredContent:{kind:`rendered`,reason:`no-response-required`}});let y=await Promise.race([s.promise,new Promise(e=>{setTimeout(()=>{let t=Z.get(o);if(t?.ready||t?.completed)return;Z.delete(o);let n=m.kind===`opened_managed`?`No browser client ready within ${v}ms.`:m.kind===`opened_system`?`Fell back to system browser, but no browser client ready within ${v}ms.`:`Browser open failed: ${m.reason}. No client ready within ${v}ms.`;e(s.settleError(`BROWSER_CONNECT_TIMEOUT`,n))},v)}),new Promise(e=>{setTimeout(()=>e(s.settleTimeout(_)),_)})]),b=Z.get(o);b&&(b.completed=!0),setTimeout(()=>{Z.delete(o);try{n.removeSession(o)}catch{}},_);let x=y.kind===`result`?`Selected action: ${y.result.actionId}`:y.kind===`timeout`?`Timed out after ${y.waitedMs}ms.`:y.kind===`cancelled`?`Cancelled: ${y.reason}.`:y.kind===`error`?`Error: ${y.error.message}`:`Rendered.`;return{content:[{type:`text`,text:Gm(e,p,m,x)}],structuredContent:y,isError:y.kind===`error`}}const ah={id:`browser`,priority:20,canHandle(e,t){let n=Jh(e);return Yp(n)||!!t.preferBrowser&&!!Yh(n)},async render(e,t){return ih(e,t.session)}},oh=`openai/outputTemplate`,sh=`ui/resourceUri`,ch={connectDomains:[],resourceDomains:[]},lh={connect_domains:[],resource_domains:[]};function uh(e){return{ui:{resourceUri:e,visibility:[`model`,`app`]},[sh]:e,[oh]:e,"openai/widgetAccessible":!0}}function dh(){return{ui:{prefersBorder:!1,csp:ch},"openai/widgetDescription":`AI Kit renders structured visual surfaces such as dashboards, charts, reports, and diagrams.`,"openai/widgetPrefersBorder":!1,"openai/widgetCSP":lh}}function fh(e){return{ui:{resourceUri:e},[sh]:e,[oh]:e}}function ph(e){return{...e,schemaVersion:1}}function mh(e){try{let t=Nr(e,{transport:`mcp-app`,registry:qp,blockVendorScripts:fp()}),n=Sm(t.vendorScripts,`mcp-app`),r=Tr({title:e.title,subtitle:e.description,html:t.html,css:t.css,islands:t.islands,payload:t.payload,nonce:t.nonce,colorScheme:e.colorScheme,lang:e.lang,dir:e.dir,transport:`mcp-app`,exportPolicy:t.exportPolicy,imageExportMode:`disabled`,showToolbox:t.exportPolicy!==`static-only`,showInstallGuide:!1,footerContentHtml:hm,headScripts:n}),i={kind:`rendered`,reason:`no-response-required`},a=tg(r);kh(a);let o=Xh(e,i,{includeSurfaceHeader:!1}),s=Dh(),c=Mh(s);return c&&Ah(c,a),{content:[{type:`text`,text:o}],structuredContent:ph(e),_meta:fh(s),ui:{type:`resource`,uri:s}}}catch(t){return sg(`RENDER_FAILED`,t instanceof Error?t.message:`Failed to render ChannelSurface`,void 0,e.title)}}const hh={id:`mcp-app`,priority:30,canHandle(e,t){return!0},async render(e,t){return mh(e)}};var gh=class{handlers=[];register(e){let t=this.handlers.findIndex(t=>t.id===e.id);t===-1?this.handlers.push(e):this.handlers[t]=e}unregister(e){let t=this.handlers.findIndex(t=>t.id===e);t!==-1&&this.handlers.splice(t,1)}select(e,t){return[...this.handlers].sort((e,t)=>(e.priority??99)-(t.priority??99)).find(n=>n.canHandle(e,t))??null}getAll(){return[...this.handlers]}};function _h(e){return`<script nonce="${Y(e)}">
2928
2928
  window.addEventListener('message', function(e) {
2929
2929
  if (e.data && e.data.type === 'aikit-viewer-height') {
2930
2930
  var container = document.querySelector('.present-viewer-container');
2931
2931
  if (container) { container.style.minHeight = e.data.height + 'px'; }
2932
2932
  }
2933
2933
  });
2934
- <\/script>`}async function _h(e,t){try{let n=$h(bp(t.resolveHtml(),e.data??null,t.injectId,t.transformData)).replace(/&/g,`&amp;`).replace(/"/g,`&quot;`),r=Je(16).toString(`hex`),i={kind:`rendered`,reason:`no-response-required`};Oh(eg(wr({title:e.title,subtitle:e.description,html:[`<div class="present-viewer-container">`,` <iframe class="present-viewer-iframe" srcdoc="${n}" sandbox="allow-scripts allow-same-origin"></iframe>`,` ${Qh(r)}`,` ${gh(r)}`,`</div>`].join(`
2934
+ <\/script>`}async function vh(e,t){try{let n=eg(xp(t.resolveHtml(),e.data??null,t.injectId,t.transformData)).replace(/&/g,`&amp;`).replace(/"/g,`&quot;`),r=Je(16).toString(`hex`),i={kind:`rendered`,reason:`no-response-required`};kh(tg(Tr({title:e.title,subtitle:e.description,html:[`<div class="present-viewer-container">`,` <iframe class="present-viewer-iframe" srcdoc="${n}" sandbox="allow-scripts allow-same-origin"></iframe>`,` ${$h(r)}`,` ${_h(r)}`,`</div>`].join(`
2935
2935
  `),css:[[`.present-viewer-container {`,` flex: 1;`,` min-height: 640px;`,` position: relative;`,` border-radius: 0.75rem;`,` overflow: hidden;`,` border: none;`,`}`,`.present-viewer-iframe {`,` border: none;`,` width: 100%;`,` height: 100%;`,` position: absolute;`,` inset: 0;`,` border-radius: inherit;`,`}`].join(`
2936
- `)],islands:[],payload:void 0,nonce:r,generatedAt:new Date().toISOString(),footerContentHtml:mm,colorScheme:e.colorScheme,lang:e.lang,dir:e.dir,transport:`mcp-app`,exportPolicy:`local-interactive`,imageExportMode:`disabled`})));let a=Yh(e,i,{includeSurfaceHeader:!1}),o=Eh();return{content:[{type:`text`,text:a}],structuredContent:fh(e),_meta:dh(o),ui:{type:`resource`,uri:o}}}catch(t){return og(`VIEWER_RENDER_FAILED`,t instanceof Error?t.message:`Failed to render viewer template`,void 0,e.title)}}const vh={id:`viewer`,priority:10,canHandle(e,t){return e.template?_p(e.template)!=null:!1},async render(e,t){let n=_p(e.template??``);if(!n)return og(`VIEWER_NOT_FOUND`,`Viewer template "${e.template}" not found`,void 0,e.title);if(e.data!=null&&n.inputSchema){let t=En({data:e.data,schema:n.inputSchema});if(!t.valid){let r=t.errors.map(e=>` ${e.path}: ${e.message}${e.expected?` (expected: ${e.expected}, got: ${e.received})`:``}`).join(`
2937
- `);return og(`VIEWER_DATA_INVALID`,`Template "${n.id}" data validation failed:\n${r}\n\nExpected schema: ${JSON.stringify(n.inputSchema,null,2)}`,void 0,e.title)}}let r=n.supportedTransports.includes(`browser`),i=n.supportedTransports.includes(`mcp-app`);return t.preferBrowser||r&&!i?await nh(e,n,t.session):i?_h(e,n):og(`VIEWER_TRANSPORT_UNSUPPORTED`,`Viewer template "${n.id}" does not support an available transport`,void 0,e.title)}},yh=`ui://aikit/present.html`,bh=`ui://aikit/present/{id}.html`,xh=k(`present`);let Sh=0,Ch=``;const wh=new Map,Th=new Map;function Eh(){return`ui://aikit/present/${`${Date.now().toString(36)}_${(++Sh).toString(36)}`}.html`}function Dh(){return Ch}function Oh(e){Ch=e}function kh(e,t){let n=Th.get(e);n&&clearTimeout(n),wh.set(e,t),Th.set(e,setTimeout(()=>{wh.delete(e),Th.delete(e)},3e4))}function Ah(e){return wh.get(e)}function jh(e){return e.match(/\/present\/(.+)\.html$/)?.[1]}const Mh=new hh;Mh.register(vh),Mh.register(ih),Mh.register(mh);function Nh(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Ph=/\\u[0-9a-fA-F]{4}/,Fh=/^\s*\|(?:[^|\r\n]+\|){2,}\s*$/,Ih=/^\s*\|?(?:\s*:?-{3,}:?\s*\|){2,}\s*$/,Lh=/\b(cli|terminal|tty|console|command(?:-|\s)?line)\b/i;function Rh(e){let t=[e.value,e.markdown,e.text,e.content];for(let e of t)if(typeof e==`string`&&e.trim().length>0)return e}function zh(e){let t=e.split(/\r?\n/);for(let e=0;e<t.length-1;e+=1)if(Fh.test(t[e])&&Ih.test(t[e+1]))return!0;return!1}function Bh(e){let t=e.trim().split(`|`),n=+(t[0]?.trim()===``),r=t.at(-1)?.trim()===``?t.length-1:t.length;return t.slice(n,r).map(e=>e.trim())}function Vh(e,t){if(t<2)return!1;let n=e.trim();return n.startsWith(`|`)?Bh(n).length===t:!1}function Hh(e){let t=e.split(/\r?\n/),n=[],r=[],i=()=>{r.length!==0&&(n.push({type:`text`,content:r.join(`
2938
- `)}),r.length=0)},a=0;for(;a<t.length;){let e=t[a],o=t[a+1];if(o!==void 0&&Fh.test(e)&&Ih.test(o)){let r=Bh(e),o=[];i();let s=a+2;for(;s<t.length&&Vh(t[s],r.length);)o.push(Bh(t[s])),s+=1;n.push({type:`table`,headers:r,rows:o}),a=s;continue}r.push(e),a+=1}return i(),n}function Uh(e){let t=Rh(e);return!t||!zh(t)?[e]:Hh(t).flatMap(e=>{if(e.type===`text`){let t=e.content.trim();return t.length>0?[{type:`markdown`,value:t}]:[]}return[{type:`table`,value:{headers:e.headers,rows:e.rows}}]})}function Wh(e){if(typeof e==`string`)return Lh.test(e);if(Array.isArray(e))return e.some(e=>Wh(e));if(!Nh(e))return!1;let t=[`client`,`clientInfo`,`host`,`source`,`mode`,`name`,`title`,`channel`];return Object.entries(e).some(([e,n])=>t.includes(e)?Wh(n):!1)}function Gh(e,t){return{preferBrowser:[t,e._meta,Nh(e.metadata)?e.metadata.source:void 0].some(e=>Wh(e))}}const Kh={id:`__dismiss`,type:`button`,label:`Done`,variant:`default`};function qh(e){if((e.actions?.length??0)>0||!e.template)return e;let t=qp(e);return t?.supportedTransports.includes(`browser`)===!0&&!t.supportedTransports.includes(`mcp-app`)?{...e,actions:[Kh]}:e}function Jh(e){if(!e.template)return!0;let t=_p(e.template);return t?t.supportedTransports.includes(`browser`):qp(e)?.supportedTransports.includes(`browser`)??!1}function Yh(e,t,n={}){let r=n.includeSurfaceHeader??!0,i=r?[e.title]:[];return r&&e.description&&i.push(e.description),kr(t)?i.push(``,`Selected action: ${t.result.actionId}`):Or(t)?i.push(``,`Error: ${t.error.message}`):t.kind===`timeout`?i.push(``,`Timed out after ${t.waitedMs}ms.`):t.kind===`cancelled`?i.push(``,`Cancelled: ${t.reason}.`):r||i.push(`Rendered inline.`),i.join(`
2939
- `)}const Xh=`<style>
2936
+ `)],islands:[],payload:void 0,nonce:r,generatedAt:new Date().toISOString(),footerContentHtml:hm,colorScheme:e.colorScheme,lang:e.lang,dir:e.dir,transport:`mcp-app`,exportPolicy:`local-interactive`,imageExportMode:`disabled`})));let a=Xh(e,i,{includeSurfaceHeader:!1}),o=Dh();return{content:[{type:`text`,text:a}],structuredContent:ph(e),_meta:fh(o),ui:{type:`resource`,uri:o}}}catch(t){return sg(`VIEWER_RENDER_FAILED`,t instanceof Error?t.message:`Failed to render viewer template`,void 0,e.title)}}const yh={id:`viewer`,priority:10,canHandle(e,t){return e.template?vp(e.template)!=null:!1},async render(e,t){let n=vp(e.template??``);if(!n)return sg(`VIEWER_NOT_FOUND`,`Viewer template "${e.template}" not found`,void 0,e.title);if(e.data!=null&&n.inputSchema){let t=En({data:e.data,schema:n.inputSchema});if(!t.valid){let r=t.errors.map(e=>` ${e.path}: ${e.message}${e.expected?` (expected: ${e.expected}, got: ${e.received})`:``}`).join(`
2937
+ `);return sg(`VIEWER_DATA_INVALID`,`Template "${n.id}" data validation failed:\n${r}\n\nExpected schema: ${JSON.stringify(n.inputSchema,null,2)}`,void 0,e.title)}}let r=n.supportedTransports.includes(`browser`),i=n.supportedTransports.includes(`mcp-app`);return t.preferBrowser||r&&!i?await rh(e,n,t.session):i?vh(e,n):sg(`VIEWER_TRANSPORT_UNSUPPORTED`,`Viewer template "${n.id}" does not support an available transport`,void 0,e.title)}},bh=`ui://aikit/present.html`,xh=`ui://aikit/present/{id}.html`,Sh=k(`present`);let Ch=0,wh=``;const Th=new Map,Eh=new Map;function Dh(){return`ui://aikit/present/${`${Date.now().toString(36)}_${(++Ch).toString(36)}`}.html`}function Oh(){return wh}function kh(e){wh=e}function Ah(e,t){let n=Eh.get(e);n&&clearTimeout(n),Th.set(e,t),Eh.set(e,setTimeout(()=>{Th.delete(e),Eh.delete(e)},3e4))}function jh(e){return Th.get(e)}function Mh(e){return e.match(/\/present\/(.+)\.html$/)?.[1]}const Nh=new gh;Nh.register(yh),Nh.register(ah),Nh.register(hh);function Ph(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Fh=/\\u[0-9a-fA-F]{4}/,Ih=/^\s*\|(?:[^|\r\n]+\|){2,}\s*$/,Lh=/^\s*\|?(?:\s*:?-{3,}:?\s*\|){2,}\s*$/,Rh=/\b(cli|terminal|tty|console|command(?:-|\s)?line)\b/i;function zh(e){let t=[e.value,e.markdown,e.text,e.content];for(let e of t)if(typeof e==`string`&&e.trim().length>0)return e}function Bh(e){let t=e.split(/\r?\n/);for(let e=0;e<t.length-1;e+=1)if(Ih.test(t[e])&&Lh.test(t[e+1]))return!0;return!1}function Vh(e){let t=e.trim().split(`|`),n=+(t[0]?.trim()===``),r=t.at(-1)?.trim()===``?t.length-1:t.length;return t.slice(n,r).map(e=>e.trim())}function Hh(e,t){if(t<2)return!1;let n=e.trim();return n.startsWith(`|`)?Vh(n).length===t:!1}function Uh(e){let t=e.split(/\r?\n/),n=[],r=[],i=()=>{r.length!==0&&(n.push({type:`text`,content:r.join(`
2938
+ `)}),r.length=0)},a=0;for(;a<t.length;){let e=t[a],o=t[a+1];if(o!==void 0&&Ih.test(e)&&Lh.test(o)){let r=Vh(e),o=[];i();let s=a+2;for(;s<t.length&&Hh(t[s],r.length);)o.push(Vh(t[s])),s+=1;n.push({type:`table`,headers:r,rows:o}),a=s;continue}r.push(e),a+=1}return i(),n}function Wh(e){let t=zh(e);return!t||!Bh(t)?[e]:Uh(t).flatMap(e=>{if(e.type===`text`){let t=e.content.trim();return t.length>0?[{type:`markdown`,value:t}]:[]}return[{type:`table`,value:{headers:e.headers,rows:e.rows}}]})}function Gh(e){if(typeof e==`string`)return Rh.test(e);if(Array.isArray(e))return e.some(e=>Gh(e));if(!Ph(e))return!1;let t=[`client`,`clientInfo`,`host`,`source`,`mode`,`name`,`title`,`channel`];return Object.entries(e).some(([e,n])=>t.includes(e)?Gh(n):!1)}function Kh(e,t){return{preferBrowser:[t,e._meta,Ph(e.metadata)?e.metadata.source:void 0].some(e=>Gh(e))}}const qh={id:`__dismiss`,type:`button`,label:`Done`,variant:`default`};function Jh(e){if((e.actions?.length??0)>0||!e.template)return e;let t=Jp(e);return t?.supportedTransports.includes(`browser`)===!0&&!t.supportedTransports.includes(`mcp-app`)?{...e,actions:[qh]}:e}function Yh(e){if(!e.template)return!0;let t=vp(e.template);return t?t.supportedTransports.includes(`browser`):Jp(e)?.supportedTransports.includes(`browser`)??!1}function Xh(e,t,n={}){let r=n.includeSurfaceHeader??!0,i=r?[e.title]:[];return r&&e.description&&i.push(e.description),Ar(t)?i.push(``,`Selected action: ${t.result.actionId}`):kr(t)?i.push(``,`Error: ${t.error.message}`):t.kind===`timeout`?i.push(``,`Timed out after ${t.waitedMs}ms.`):t.kind===`cancelled`?i.push(``,`Cancelled: ${t.reason}.`):r||i.push(`Rendered inline.`),i.join(`
2939
+ `)}const Zh=`<style>
2940
2940
  .toolbar, .badge, .aikit-header, .aikit-footer { display: none !important; }
2941
2941
  body { padding-top: 0 !important; margin-top: 0 !important; }
2942
- </style>`,Zh=`<script>
2942
+ </style>`,Qh=`<script>
2943
2943
  window.addEventListener('message', function(e) {
2944
2944
  // Accept from any origin — theme change is cosmetic-only.
2945
2945
  // Strict origin check breaks in MCP host custom protocols (ui://, vscode-webview://)
@@ -2951,7 +2951,7 @@ window.addEventListener('message', function(e) {
2951
2951
  }
2952
2952
  }
2953
2953
  });
2954
- <\/script>`;function Qh(e){return`<script nonce="${e}">
2954
+ <\/script>`;function $h(e){return`<script nonce="${e}">
2955
2955
  (function() {
2956
2956
  var iframe = document.querySelector('.present-viewer-iframe');
2957
2957
  if (!iframe) return;
@@ -2970,7 +2970,7 @@ window.addEventListener('message', function(e) {
2970
2970
  iframe.addEventListener('load', sendTheme);
2971
2971
  trySend();
2972
2972
  })();
2973
- <\/script>`}function $h(e){let t=e.replace(`</head>`,`${Xh}\n</head>`);t===e&&xh.warn(`injectEmbeddedViewerRuntime: </head> not found — viewer style not injected`);let n=t.replace(`</body>`,`<script>
2973
+ <\/script>`}function eg(e){let t=e.replace(`</head>`,`${Zh}\n</head>`);t===e&&Sh.warn(`injectEmbeddedViewerRuntime: </head> not found — viewer style not injected`);let n=t.replace(`</body>`,`<script>
2974
2974
  (function() {
2975
2975
  function report() {
2976
2976
  var h = document.documentElement.scrollHeight;
@@ -2980,7 +2980,7 @@ window.addEventListener('message', function(e) {
2980
2980
  ro.observe(document.documentElement);
2981
2981
  report();
2982
2982
  })();
2983
- <\/script>\n${Zh}\n</body>`);return n===t&&xh.warn(`injectEmbeddedViewerRuntime: </body> not found — runtime scripts not injected`),n}function eg(e){let t=`<script>
2983
+ <\/script>\n${Qh}\n</body>`);return n===t&&Sh.warn(`injectEmbeddedViewerRuntime: </body> not found — runtime scripts not injected`),n}function tg(e){let t=`<script>
2984
2984
  (function(){
2985
2985
  var last=0;
2986
2986
  function notify(){
@@ -2991,7 +2991,7 @@ window.addEventListener('message', function(e) {
2991
2991
  if(typeof ResizeObserver!=="undefined"){new ResizeObserver(notify).observe(document.documentElement)}
2992
2992
  else{setInterval(notify,500)}
2993
2993
  })();
2994
- <\/script>`;return e.includes(`</body>`)?e.replace(`</body>`,`${t}</body>`):`${e}${t}`}let tg=``;function ng(e){return`<script${e?` nonce="${Y(e)}"`:``}>
2994
+ <\/script>`;return e.includes(`</body>`)?e.replace(`</body>`,`${t}</body>`):`${e}${t}`}let ng=``;function rg(e){return`<script${e?` nonce="${Y(e)}"`:``}>
2995
2995
  (function(){
2996
2996
  var readyState = document.readyState;
2997
2997
  var boot = function() {
@@ -3004,14 +3004,14 @@ window.addEventListener('message', function(e) {
3004
3004
  boot();
3005
3005
  }
3006
3006
  })();
3007
- <\/script>`}function rg(e){tg=e||``}function ig(e,t){if(!tg)return e;let n=`${`<script${t?` nonce="${Y(t)}"`:``}>${tg}<\/script>`}\n${ng(t||``)}`;return e.includes(`</body>`)?e.replace(`</body>`,`${n}\n</body>`):`${e}${n}`}function ag(e,t){return[`<!DOCTYPE html>`,`<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">`,`<title>Error — ${Y(e)}</title>`,`<style>`,` * { box-sizing: border-box; margin: 0; padding: 0; }`,` body { font-family: system-ui, -apple-system, sans-serif; min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 2rem; background: #fafafa; color: #333; }`,` .error-card { max-width: 560px; width: 100%; padding: 2.5rem; border-radius: 1rem; background: #fff; border: 1px solid #e5e7eb; box-shadow: 0 1px 3px rgba(0,0,0,0.06); }`,` .error-badge { display: inline-block; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: #dc2626; background: #fef2f2; border: 1px solid #fecaca; border-radius: 0.375rem; padding: 0.25rem 0.625rem; margin-bottom: 1rem; }`,` .error-title { font-size: 1.25rem; font-weight: 600; margin-bottom: 0.75rem; color: #111; }`,` .error-message { font-size: 0.875rem; line-height: 1.6; color: #6b7280; white-space: pre-wrap; word-break: break-word; }`,`</style></head><body>`,`<div class="error-card">`,` <span class="error-badge">Render Error</span>`,` <h1 class="error-title">${Y(e)}</h1>`,` <p class="error-message">${Y(t)}</p>`,`</div>`,`</body></html>`].join(`
3008
- `)}function og(e,t,n,r){return Oh(ag(r??`Present`,t)),{content:[{type:`text`,text:`[ERROR:VALIDATION] ${t}`}],isError:!0}}function sg(e,t){if(!Nh(e)||!(`schemaVersion`in e))return{ok:!1,response:og(`INVALID_CHANNEL_SURFACE`,`present expects a ChannelSurface object with schemaVersion: 1`)};if(e.schemaVersion!==1)return{ok:!1,response:og(`UNSUPPORTED_SCHEMA_VERSION`,`Unsupported ChannelSurface schemaVersion: ${String(e.schemaVersion)}`)};if(typeof e.title==`string`&&Ph.test(e.title))return{ok:!1,response:og(`TITLE_UNICODE_ESCAPE_NOT_ALLOWED`,`Use actual Unicode characters in title, not escape sequences.`)};let n=Array.isArray(e.blocks)?{...e,blocks:e.blocks.flatMap(e=>{if(!Nh(e)||e.type!==`markdown`)return[e];let t=Rh(e);return!t||!zh(t)?[e]:Uh(e)})}:e;return{ok:!0,surface:n,options:Gh(n,t)}}function cg(e){return(e.actions?.length??0)>0||e.response?.required===!0?Mh.getAll().some(e=>e.id===`browser`):!1}async function lg(e,t={}){let n=cg(e)?{...t,preferBrowser:!0}:t,r=qh(e),i=Mh.select(r,n),a;if(a=i?await i.render(r,n):ph(r),e.blocks&&e.blocks.length>0&&a.isError!==!0)try{let t=new Set;for(let n of e.blocks){if(typeof n!=`object`||!n)continue;let e=typeof n.type==`string`?n.type:null;e&&!fp(e)&&t.add(e)}if(t.size>0){let e=[...t].map(e=>`"${e}"`).join(`, `);xh.warn(`Unknown block types: ${e}`),a.content=[{type:`text`,text:`[Block type(s) not recognized: ${e}. They rendered as raw text. Use aikit://schemas/channel-surface for supported block types.]`},...a.content]}}catch(e){xh.warn(`Block type validation failed`,j(e))}if(t.compact){let{structuredContent:e,...t}=a;return t}return a}function ug(e,t=``){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):t}function dg(e){return{type:`kv`,value:e}}function fg(e){if(Array.isArray(e))return e}const pg=[{name:`summary`,description:`Title + markdown summary + optional metrics (pass/fail counts)`,expand(e){let t=ug(e.title,`Summary`),n=[{type:`heading`,value:t}],r=ug(e.summary);r&&n.push({type:`markdown`,value:r});let i=Number(e.passed)||0,a=Number(e.failed)||0;if(i>0||a>0){let e=[];i>0&&e.push({label:`Passed`,value:i,status:`success`}),a>0&&e.push({label:`Failed`,value:a,status:`error`}),n.push({type:`metrics`,value:e})}return{title:t,blocks:n}}},{name:`plan`,description:`Title + heading per step + checklist items`,expand(e){let t=ug(e.title,`Plan`),n=[{type:`heading`,value:t}],r=fg(e.steps);return r&&n.push({type:`checklist`,value:{items:r}}),{title:t,blocks:n}}},{name:`understanding`,description:`Title + markdown explanation + kv pairs`,expand(e){let t=ug(e.title,`Understanding`),n=[{type:`heading`,value:t}],r=ug(e.explanation);return r&&n.push({type:`markdown`,value:r}),e.details&&typeof e.details==`object`&&!Array.isArray(e.details)&&n.push(dg(e.details)),{title:t,blocks:n}}},{name:`bug-analyze`,description:`Title + heading + severity/status kv + code block + markdown`,expand(e){let t=ug(e.title,`Bug Analysis`),n=[{type:`heading`,value:t}],r={};e.severity&&(r.Severity=e.severity),e.status&&(r.Status=e.status),Object.keys(r).length>0&&n.push({type:`kv`,value:r});let i=ug(e.code);i&&n.push({type:`code`,value:i});let a=ug(e.analysis);return a&&n.push({type:`markdown`,value:a}),{title:t,blocks:n}}},{name:`task-done`,description:`Title + checklist of completed items + optional metrics`,expand(e){let t=ug(e.title,`Task Complete`),n=[{type:`heading`,value:t}],r=fg(e.items);r&&n.push({type:`checklist`,value:{items:r}});let i=e.completed,a=e.total;if(i!==void 0||a!==void 0){let e=[];i!==void 0&&e.push({label:`Completed`,value:Number(i)||i,status:`success`}),a!==void 0&&e.push({label:`Total`,value:Number(a)||a}),n.push({type:`metrics`,value:e})}return{title:t,blocks:n}}},{name:`review`,description:`Title + criteria checklist + annotation items + approval controls`,expand(e){let t=ug(e.title,`Review`),n=[{type:`heading`,value:t}],r=fg(e.criteria);r&&n.push({type:`checklist`,value:{items:r}});let i=e.annotations;Array.isArray(i)&&i.length>0&&n.push({type:`annotation`,value:i});let a=e.approval;return a&&typeof a==`object`?n.push({type:`approval`,value:a}):n.push({type:`actions`,value:[{type:`button`,id:`approve`,label:`Approve`,variant:`primary`},{type:`button`,id:`reject`,label:`Reject`,variant:`danger`}]}),{title:t,blocks:n}}},{name:`explore`,description:`Title + heading per finding + code blocks`,expand(e){let t=ug(e.title,`Exploration`),n=[{type:`heading`,value:t}],r=fg(e.findings);if(r)for(let e of r)n.push({type:`heading`,value:ug(e.heading,`Finding`)}),e.code&&n.push({type:`code`,value:e.code});return{title:t,blocks:n}}},{name:`decision`,description:`Title + kv for recommendation + comparison blocks per option`,expand(e){let t=ug(e.title,`Decision`),n=[{type:`heading`,value:t}];e.recommendation&&n.push({type:`kv`,value:{Recommendation:e.recommendation}});let r=fg(e.options);return r&&r.length>0&&n.push({type:`comparison`,value:r.map(e=>({title:ug(e.title,`Option`),items:Array.isArray(e.items)?e.items:[]}))}),{title:t,blocks:n}}}],mg=new Map;for(let e of pg)mg.set(e.name,e);function hg(e,t){let n=mg.get(e);return n?n.expand(t):null}function gg(e){let t=[],n=!1,r=!1;for(let i of e){if(r){r=!1,t.push(i);continue}if(i===`\\`&&n){r=!0,t.push(i);continue}if(i===`"`){n=!n,t.push(i);continue}if(n&&(i===`
3009
- `||i===`\r`)){t.push(`\\n`);continue}t.push(i)}return t.join(``)}function _g(e){let t=[],n=!1,r=!1;for(let i of e){if(r){r=!1,t.push(i);continue}if(i===`\\`&&n){r=!0,t.push(i);continue}if(i===`"`){n=!n,t.push(i);continue}if(n){t.push(i);continue}if(i===`]`||i===`}`)for(let e=t.length-1;e>=0;e--){let n=t[e];if(!(n===` `||n===`
3010
- `||n===` `||n===`\r`||n===``)){n===`,`&&(t[e]=``);break}}t.push(i)}return t.join(``)}function vg(e){try{return JSON.parse(e)}catch{}let t=_g(gg(e));try{return JSON.parse(t)}catch(e){try{return JSON.parse(t.replaceAll(`'`,`"`))}catch{throw e}}}const yg={h:`heading`,m:`markdown`,t:`table`,p:`paragraph`,c:`code`,s:`separator`,M:`metrics`,C:`chart`,T:`timeline`,g:`graph`,tr:`tree`,tl:`timeline`,cl:`checklist`,pr:`progress`,sb:`status-board`,kv:`kv`,ac:`actions`,di:`mermaid`},bg=/^(#{1,6})\s/,xg=/^(`{3,}|~{3,})/,Sg=/^\|.+\|.+\|/m;function Cg(e){let t=e.trim(),n=t.match(bg);if(n)return{type:`heading`,value:t.slice(n[0].length)};if(xg.test(t)){let e=t.indexOf(`
3011
- `),n=t.lastIndexOf(t[0]);return{type:`code`,value:e>=0?t.slice(e+1,n).trimEnd():t}}return Sg.test(t)?{type:`table`,value:t}:{type:`markdown`,value:t}}function wg(e,t){let n=yg[e];if(!n)return null;switch(e){case`M`:return{type:`metrics`,value:t};case`C`:return{type:`chart`,value:t};case`T`:case`tl`:return{type:`timeline`,value:t};case`g`:return{type:`graph`,value:t};case`tr`:return{type:`tree`,value:t};case`cl`:return{type:`checklist`,value:t};case`pr`:return{type:`progress`,value:t};case`sb`:return{type:`status-board`,value:t};case`kv`:return{type:`kv`,value:t};case`ac`:return{type:`actions`,value:t};case`di`:return{type:`mermaid`,value:t};case`s`:return{type:`separator`,value:t||!0};default:return{type:n,value:typeof t==`string`?t:String(t??``)}}}function Tg(e){if(typeof e==`string`){let t=Cg(e);return{type:t.type,value:t.value}}if(Array.isArray(e)){let[t,n]=e;if(typeof t==`string`){let e=wg(t,n);if(e)return e}return{type:`markdown`,value:String(t??``)}}if(typeof e==`object`&&e){let{blockId:t,...n}=e;return n}return{type:`markdown`,value:String(e??``)}}function Eg(e){return{title:e.title??``,blocks:Array.isArray(e.blocks)?e.blocks.map(Tg):[]}}function Dg(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Og(e){return Dg(e)&&typeof e.schemaVersion==`number`&&e.schemaVersion===1}function kg(e){return Dg(e)&&typeof e.schemaVersion==`number`&&e.schemaVersion!==1}function Ag(e){return e.schemaVersion===1?typeof e.title!=`string`||e.title.length===0?{ok:!1,error:{code:`MISSING_TITLE`,reason:`ChannelSurface requires a non-empty title`}}:e.blocks!==void 0&&!Array.isArray(e.blocks)?{ok:!1,error:{code:`INVALID_BLOCKS`,reason:`blocks must be an array of TypedBlock objects`}}:{ok:!0,surface:e}:{ok:!1,error:{code:`UNSUPPORTED_SCHEMA_VERSION`,reason:`Unsupported schemaVersion: ${String(e.schemaVersion)}`}}}function jg(e){try{let t=vg(e);return Dg(t)?(t.schemaVersion===void 0&&(t.schemaVersion=1),Mg(t)):{ok:!1,error:{code:`INVALID_RAW_INPUT`,reason:`raw field must contain a JSON object (ChannelSurface)`}}}catch(e){return{ok:!1,error:{code:`INVALID_RAW_JSON`,reason:`Failed to parse raw field: ${e.message}`,hint:`JSON repair attempted. Ensure the raw string contains a valid ChannelSurface object. Common LLM errors (newlines in strings, trailing commas) are auto-repaired.`}}}}function Mg(e){if(Array.isArray(e)){if(e.length!==2)return{ok:!1,error:{code:`INVALID_PRESET_INPUT`,reason:`Preset input must be a [name, data] tuple`,hint:`Use [presetName, { title, ...fields }]`}};let[t,n]=e;if(typeof t!=`string`)return{ok:!1,error:{code:`INVALID_PRESET_INPUT`,reason:`Preset name must be a string`}};if(!Dg(n))return{ok:!1,error:{code:`INVALID_PRESET_INPUT`,reason:`Preset data must be an object`}};let r=hg(t,n);return r?{ok:!0,surface:{schemaVersion:1,title:r.title,blocks:r.blocks}}:{ok:!1,error:{code:`UNKNOWN_PRESET`,reason:`Unknown preset: ${t}`,hint:`Available presets: summary, plan, understanding, bug-analyze, task-done, review, explore, decision`}}}if(kg(e))return{ok:!1,error:{code:`UNSUPPORTED_SCHEMA_VERSION`,reason:`Unsupported schemaVersion: ${String(e.schemaVersion)}`,hint:`Use schemaVersion: 1`}};if(Dg(e)&&typeof e.raw==`string`)return jg(e.raw);if(Og(e))return Ag(e);if(typeof e==`string`){let t=Eg({blocks:[e]});return{ok:!0,surface:{schemaVersion:1,title:t.title||`Present`,blocks:t.blocks}}}if(Dg(e)){if(!(`blocks`in e)&&!(`title`in e))return{ok:!1,error:{code:`INVALID_INPUT`,reason:`Expected a ChannelSurface object, preset tuple, or shorthand input`}};let t=Eg(e);return{ok:!0,surface:{schemaVersion:1,title:t.title||`Present`,blocks:t.blocks}}}return{ok:!1,error:{code:`INVALID_INPUT`,reason:`Expected a ChannelSurface object, preset tuple, or shorthand input`}}}const Ng=I.object({label:I.string(),value:I.string(),description:I.string().optional()}),Pg=I.object({id:I.string().describe(`Unique action identifier`),type:I.enum([`button`,`select`,`multi-select`,`form-submit`,`text-submit`,`confirm`,`custom`]).describe(`Interactive action type`),label:I.string().describe(`Visible action label`),variant:I.enum([`primary`,`danger`,`default`]).optional(),options:I.array(Ng).optional(),schema:I.record(I.string(),I.unknown()).optional()}),Fg=I.object({type:I.string(),title:I.string().optional(),value:I.unknown().optional(),language:I.string().optional()}).catchall(I.unknown()),Ig={schemaVersion:I.literal(1).describe(`ChannelSurface schema version. Must be 1.`),title:I.string().describe(`Surface title shown to the user.`),description:I.string().optional().describe(`Optional supporting copy for the surface.`),template:I.string().optional().describe(`Optional template id such as report@1.`),layout:I.object({maxWidth:I.string().optional(),padding:I.string().optional(),columns:I.number().optional()}).optional(),blocks:I.array(Fg).optional().describe(`Typed block content for the surface.`),data:I.unknown().optional().describe(`Template data payload, if the template expands data.`),actions:I.array(Pg).optional().describe(`Interactive actions. Presence triggers browser transport.`),response:I.object({timeout:I.number().finite().min(0).max(3e5).optional(),required:I.boolean().optional()}).optional(),metadata:I.object({surfaceId:I.string().optional(),createdAt:I.string().optional(),source:I.string().optional()}).optional(),colorScheme:I.enum([`light`,`dark`,`auto`]).optional(),lang:I.string().optional(),dir:I.enum([`ltr`,`rtl`,`auto`]).optional(),raw:I.string().optional().describe(`Raw JSON string with auto-repair. Accepts common LLM JSON errors (unescaped newlines in strings, trailing commas). Use for complex payloads with mermaid/code/markdown blocks.`),preferBrowser:I.boolean().optional().default(!0).describe(`Prefer browser transport instead of inline rendering. Default: true — most clients render in an external browser window. Set preferBrowser: false to request inline/embedded rendering (only honored when the client supports inline display; auto-falls back to browser if not).`)};I.object({surfaceId:I.string(),actionId:I.string(),actionType:I.enum([`button`,`select`,`multi-select`,`form-submit`,`text-submit`,`confirm`,`custom`]),value:I.unknown().optional(),formData:I.record(I.string(),I.unknown()).optional(),selection:I.union([I.string(),I.array(I.string())]).optional(),label:I.string().optional(),timestamp:I.string(),sourceTransport:I.enum([`mcp-app`,`browser`,`export`])});function Lg(e){let t=e.server?.getClientCapabilities?.();if(!t)return`unknown`;let n=hr(t);return!n||Array.isArray(n.mimeTypes)&&n.mimeTypes.length>0&&!n.mimeTypes.includes(mr)?`unsupported`:`supported`}const Rg=[{name:`summary`,description:`Title + markdown summary + optional metrics (pass/fail counts)`,inputSchema:{type:`object`,properties:{title:{type:`string`,description:`Section heading`},summary:{type:`string`,description:`Free-form markdown summary`},passed:{type:`number`,description:`Pass count for metrics`},failed:{type:`number`,description:`Fail count for metrics`}},required:[`title`]},example:JSON.stringify({title:`Build Summary`,summary:`All tests passed.`,passed:42,failed:0}),expandsTo:`blocks: [heading, markdown, metrics]`},{name:`plan`,description:`Title + heading per step + checklist items`,inputSchema:{type:`object`,properties:{title:{type:`string`},steps:{type:`array`,items:{type:`object`,properties:{label:{type:`string`},checked:{type:`boolean`}}}}},required:[`title`]},example:JSON.stringify({title:`Sprint Plan`,steps:[{label:`Write tests`,checked:!1},{label:`Deploy`,checked:!1}]}),expandsTo:`blocks: [heading, checklist]`},{name:`understanding`,description:`Title + markdown explanation + kv pairs`,inputSchema:{type:`object`,properties:{title:{type:`string`},explanation:{type:`string`},details:{type:`object`,additionalProperties:{type:`string`}}},required:[`title`,`explanation`]},example:JSON.stringify({title:`Architecture Overview`,explanation:`The system uses microservices.`,details:{Language:`TypeScript`,Runtime:`Node`}}),expandsTo:`blocks: [heading, markdown, kv]`},{name:`bug-analyze`,description:`Title + heading + severity/status kv + code block + markdown`,inputSchema:{type:`object`,properties:{title:{type:`string`},severity:{type:`string`},status:{type:`string`},code:{type:`string`},analysis:{type:`string`}},required:[`title`,`severity`,`status`]},example:JSON.stringify({title:`Null pointer in auth`,severity:`high`,status:`open`,code:`const x = obj.prop;`,analysis:`obj may be null when token missing.`}),expandsTo:`blocks: [heading, kv, code, markdown]`},{name:`task-done`,description:`Title + checklist of completed items + optional metrics`,inputSchema:{type:`object`,properties:{title:{type:`string`},items:{type:`array`,items:{type:`object`,properties:{label:{type:`string`},checked:{type:`boolean`}}}},completed:{type:`number`},total:{type:`number`}},required:[`title`,`items`]},example:JSON.stringify({title:`PR #42 Done`,items:[{label:`Lint pass`,checked:!0},{label:`Tests pass`,checked:!0}],completed:2,total:2}),expandsTo:`blocks: [heading, checklist, metrics]`},{name:`review`,description:`Title + criteria checklist + approval actions`,inputSchema:{type:`object`,properties:{title:{type:`string`,description:`Review title`},criteria:{type:`array`,description:`Checklist criteria items`,items:{type:`object`,properties:{label:{type:`string`},checked:{type:`boolean`}}}},annotations:{type:`array`,description:`Optional annotation items`,items:{type:`object`,properties:{label:{type:`string`},description:{type:`string`},severity:{type:`string`}}}},approval:{type:`object`,description:`Optional approval config`,properties:{prompt:{type:`string`},options:{type:`array`,items:{type:`object`,properties:{label:{type:`string`},value:{type:`string`}}}}}}},required:[`title`,`criteria`]},example:JSON.stringify({title:`Code Review`,criteria:[{label:`Tests included`,checked:!0},{label:`No regressions`,checked:!1}]}),expandsTo:`blocks: [heading, checklist] + actions: [approve, reject]`},{name:`explore`,description:`Title + heading per finding + code blocks`,inputSchema:{type:`object`,properties:{title:{type:`string`},findings:{type:`array`,items:{type:`object`,properties:{heading:{type:`string`},code:{type:`string`}}}}},required:[`title`,`findings`]},example:JSON.stringify({title:`Codebase Exploration`,findings:[{heading:`Auth flow`,code:`function login()`},{heading:`API routes`,code:`router.get("/api")`}]}),expandsTo:`blocks: [heading, code] per finding`},{name:`decision`,description:`Title + kv for recommendation + comparison blocks per option`,inputSchema:{type:`object`,properties:{title:{type:`string`},recommendation:{type:`string`},options:{type:`array`,items:{type:`object`,properties:{title:{type:`string`},items:{type:`array`,items:{type:`string`}}}}}},required:[`title`,`recommendation`]},example:JSON.stringify({title:`DB Choice`,recommendation:`PostgreSQL`,options:[{title:`Postgres`,items:[`ACID`,`Rich types`]},{title:`Mongo`,items:[`Schema-less`,`Horizontal`]}]}),expandsTo:`blocks: [heading, kv, comparison]`}];function zg(e,t){let n=U(`present`);try{let e=i(`present`);e&&rg(N(F(e,`dist`,`annotation-layer.js`),`utf8`))}catch{}_r(e,`present`,{title:n.title,description:"Render a ChannelSurface. Required: schemaVersion: 1, title. Supports blocks, template+data, named presets, and raw JSON string with auto-repair. Use `raw` for complex payloads (mermaid, code, many blocks) — common LLM JSON errors are auto-fixed. IMPORTANT: when using `raw`, do NOT pass `schemaVersion` or `title` at the top level — the `raw` JSON must be a self-contained ChannelSurface with its own `schemaVersion: 1`, `title`, and `blocks`. preferBrowser defaults to true (browser rendering). Set preferBrowser: false explicitly when you want inline — only honored if the client supports it; auto-falls back to browser otherwise. Actions always use browser transport. Resources: aikit://schemas/channel-surface (schema+blocks), aikit://present/presets (presets), aikit://present/templates (viewers).",inputSchema:Ig,annotations:n.annotations,_meta:lh(bh)},J(`present`,async(t,n)=>{let r=t,i=typeof r.preferBrowser==`boolean`?r.preferBrowser:void 0,a=Mg(t);if(!a.ok)return og(a.error.code,a.error.reason,void 0,`Present`);let o=sg(a.surface,n);if(!o.ok)return o.response;let s=Lg(e),c=!(i===!1&&s===`supported`),l={responseTimeoutMs:o.surface.response?.timeout,responseRequired:o.surface.response?.required,transportReason:c?`caller-preferred`:`inline-unsupported`};return await lg(o.surface,{...o.options,preferBrowser:c,session:l})}));try{let t=new $n(bh,{list:void 0});e.registerResource(`Present View`,t,{description:`AI Kit present tool viewer`},async(e,t,n)=>{let r=Array.isArray(t.id)?t.id[0]:t.id,i=r?Ah(r):void 0;return{contents:[{uri:e.href,mimeType:mr,_meta:uh(),text:i??Dh()??`<html><body><p>No content generated yet. Call the present tool first.</p></body></html>`}]}})}catch{}function r(){try{let e=i(`present`);if(e)return N(F(e,`dist`,`index.html`),`utf8`)}catch{}return Dh()||`<html><body><p>Loading...</p></body></html>`}try{e.registerResource(`Present App`,yh,{description:`AI Kit present app - entry point`},async()=>({contents:[{uri:yh,mimeType:mr,_meta:uh(),text:r()}]}))}catch{}try{e.registerResource(`present-templates`,`aikit://present/templates`,{description:`List all registered present viewer templates with their input schemas`},async()=>{let e=yp().map(e=>({id:e.id,label:e.label,description:e.description,transports:e.supportedTransports,inputSchema:e.inputSchema}));return{contents:[{uri:`aikit://present/templates`,mimeType:`application/json`,text:JSON.stringify(e,null,2)}]}})}catch{}try{e.registerResource(`present-presets`,`aikit://present/presets`,{description:`List all registered present presets with input schemas and examples`},async()=>({contents:[{uri:`aikit://present/presets`,mimeType:`application/json`,text:JSON.stringify(Rg,null,2)}]}))}catch{}}const Bg=k(`tools`);function Vg(e,t){let n=new ir({structure:new or,dependencies:new tr,symbols:new sr,patterns:new ar,entryPoints:new rr,diagrams:new nr}),r=U(`produce_knowledge`);e.registerTool(`produce_knowledge`,{title:r.title,description:`Run automated codebase analysis and produce synthesis instructions. Executes Tier 1 deterministic analyzers, then returns structured baselines and instructions for you to synthesize knowledge using remember.`,inputSchema:{scope:I.string().optional().describe(`Root path to analyze (defaults to workspace root)`),aspects:I.array(I.enum([`all`,`structure`,`dependencies`,`symbols`,`patterns`,`entry-points`,`diagrams`])).default([`all`]).describe(`Which analysis aspects to run`)},annotations:r.annotations},J(`produce_knowledge`,async({scope:e,aspects:t},r)=>{let i;try{i=Ic(r).createTask(`Produce Knowledge`,3),i.progress(0,`Running analyzers`);let a=e??`.`;Bg.info(`Running knowledge production`,{rootPath:a,aspects:t});let o=await n.runExtraction(a,t);try{let e=P(Cn(F(a)),pe.onboard);Oe(e,{recursive:!0});let t=`<!-- Generated by produce_knowledge at ${new Date().toISOString()} -->\n\n`;for(let[n,r]of Object.entries(o))r&&typeof r==`string`&&Pe(P(e,`${n}.md`),t+r,`utf-8`);Bg.info(`Knowledge persisted to .ai/context/`,{files:Object.keys(o).length})}catch(e){Bg.warn(`Failed to persist knowledge to .ai/context/`,{error:j(e)})}i.progress(1,`Synthesizing results`);let s=n.buildSynthesisInstructions(o,t);return i.complete(`Knowledge production complete`),{content:[{type:`text`,text:s+`
3007
+ <\/script>`}function ig(e){ng=e||``}function ag(e,t){if(!ng)return e;let n=`${`<script${t?` nonce="${Y(t)}"`:``}>${ng}<\/script>`}\n${rg(t||``)}`;return e.includes(`</body>`)?e.replace(`</body>`,`${n}\n</body>`):`${e}${n}`}function og(e,t){return[`<!DOCTYPE html>`,`<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">`,`<title>Error — ${Y(e)}</title>`,`<style>`,` * { box-sizing: border-box; margin: 0; padding: 0; }`,` body { font-family: system-ui, -apple-system, sans-serif; min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 2rem; background: #fafafa; color: #333; }`,` .error-card { max-width: 560px; width: 100%; padding: 2.5rem; border-radius: 1rem; background: #fff; border: 1px solid #e5e7eb; box-shadow: 0 1px 3px rgba(0,0,0,0.06); }`,` .error-badge { display: inline-block; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: #dc2626; background: #fef2f2; border: 1px solid #fecaca; border-radius: 0.375rem; padding: 0.25rem 0.625rem; margin-bottom: 1rem; }`,` .error-title { font-size: 1.25rem; font-weight: 600; margin-bottom: 0.75rem; color: #111; }`,` .error-message { font-size: 0.875rem; line-height: 1.6; color: #6b7280; white-space: pre-wrap; word-break: break-word; }`,`</style></head><body>`,`<div class="error-card">`,` <span class="error-badge">Render Error</span>`,` <h1 class="error-title">${Y(e)}</h1>`,` <p class="error-message">${Y(t)}</p>`,`</div>`,`</body></html>`].join(`
3008
+ `)}function sg(e,t,n,r){return kh(og(r??`Present`,t)),{content:[{type:`text`,text:`[ERROR:VALIDATION] ${t}`}],isError:!0}}function cg(e,t){if(!Ph(e)||!(`schemaVersion`in e))return{ok:!1,response:sg(`INVALID_CHANNEL_SURFACE`,`present expects a ChannelSurface object with schemaVersion: 1`)};if(e.schemaVersion!==1)return{ok:!1,response:sg(`UNSUPPORTED_SCHEMA_VERSION`,`Unsupported ChannelSurface schemaVersion: ${String(e.schemaVersion)}`)};if(typeof e.title==`string`&&Fh.test(e.title))return{ok:!1,response:sg(`TITLE_UNICODE_ESCAPE_NOT_ALLOWED`,`Use actual Unicode characters in title, not escape sequences.`)};let n=Array.isArray(e.blocks)?{...e,blocks:e.blocks.flatMap(e=>{if(!Ph(e)||e.type!==`markdown`)return[e];let t=zh(e);return!t||!Bh(t)?[e]:Wh(e)})}:e;return{ok:!0,surface:n,options:Kh(n,t)}}function lg(e){return(e.actions?.length??0)>0||e.response?.required===!0?Nh.getAll().some(e=>e.id===`browser`):!1}async function ug(e,t={}){let n=lg(e)?{...t,preferBrowser:!0}:t,r=Jh(e),i=Nh.select(r,n),a;if(a=i?await i.render(r,n):mh(r),e.blocks&&e.blocks.length>0&&a.isError!==!0)try{let t=new Set;for(let n of e.blocks){if(typeof n!=`object`||!n)continue;let e=typeof n.type==`string`?n.type:null;e&&!pp(e)&&t.add(e)}if(t.size>0){let e=[...t].map(e=>`"${e}"`).join(`, `);Sh.warn(`Unknown block types: ${e}`),a.content=[{type:`text`,text:`[Block type(s) not recognized: ${e}. They rendered as raw text. Use aikit://schemas/channel-surface for supported block types.]`},...a.content]}}catch(e){Sh.warn(`Block type validation failed`,j(e))}if(t.compact){let{structuredContent:e,...t}=a;return t}return a}function dg(e,t=``){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):t}function fg(e){return{type:`kv`,value:e}}function pg(e){if(Array.isArray(e))return e}const mg=[{name:`summary`,description:`Title + markdown summary + optional metrics (pass/fail counts)`,expand(e){let t=dg(e.title,`Summary`),n=[{type:`heading`,value:t}],r=dg(e.summary);r&&n.push({type:`markdown`,value:r});let i=Number(e.passed)||0,a=Number(e.failed)||0;if(i>0||a>0){let e=[];i>0&&e.push({label:`Passed`,value:i,status:`success`}),a>0&&e.push({label:`Failed`,value:a,status:`error`}),n.push({type:`metrics`,value:e})}return{title:t,blocks:n}}},{name:`plan`,description:`Title + heading per step + checklist items`,expand(e){let t=dg(e.title,`Plan`),n=[{type:`heading`,value:t}],r=pg(e.steps);return r&&n.push({type:`checklist`,value:{items:r}}),{title:t,blocks:n}}},{name:`understanding`,description:`Title + markdown explanation + kv pairs`,expand(e){let t=dg(e.title,`Understanding`),n=[{type:`heading`,value:t}],r=dg(e.explanation);return r&&n.push({type:`markdown`,value:r}),e.details&&typeof e.details==`object`&&!Array.isArray(e.details)&&n.push(fg(e.details)),{title:t,blocks:n}}},{name:`bug-analyze`,description:`Title + heading + severity/status kv + code block + markdown`,expand(e){let t=dg(e.title,`Bug Analysis`),n=[{type:`heading`,value:t}],r={};e.severity&&(r.Severity=e.severity),e.status&&(r.Status=e.status),Object.keys(r).length>0&&n.push({type:`kv`,value:r});let i=dg(e.code);i&&n.push({type:`code`,value:i});let a=dg(e.analysis);return a&&n.push({type:`markdown`,value:a}),{title:t,blocks:n}}},{name:`task-done`,description:`Title + checklist of completed items + optional metrics`,expand(e){let t=dg(e.title,`Task Complete`),n=[{type:`heading`,value:t}],r=pg(e.items);r&&n.push({type:`checklist`,value:{items:r}});let i=e.completed,a=e.total;if(i!==void 0||a!==void 0){let e=[];i!==void 0&&e.push({label:`Completed`,value:Number(i)||i,status:`success`}),a!==void 0&&e.push({label:`Total`,value:Number(a)||a}),n.push({type:`metrics`,value:e})}return{title:t,blocks:n}}},{name:`review`,description:`Title + criteria checklist + annotation items + approval controls`,expand(e){let t=dg(e.title,`Review`),n=[{type:`heading`,value:t}],r=pg(e.criteria);r&&n.push({type:`checklist`,value:{items:r}});let i=e.annotations;Array.isArray(i)&&i.length>0&&n.push({type:`annotation`,value:i});let a=e.approval;return a&&typeof a==`object`?n.push({type:`approval`,value:a}):n.push({type:`actions`,value:[{type:`button`,id:`approve`,label:`Approve`,variant:`primary`},{type:`button`,id:`reject`,label:`Reject`,variant:`danger`}]}),{title:t,blocks:n}}},{name:`explore`,description:`Title + heading per finding + code blocks`,expand(e){let t=dg(e.title,`Exploration`),n=[{type:`heading`,value:t}],r=pg(e.findings);if(r)for(let e of r)n.push({type:`heading`,value:dg(e.heading,`Finding`)}),e.code&&n.push({type:`code`,value:e.code});return{title:t,blocks:n}}},{name:`decision`,description:`Title + kv for recommendation + comparison blocks per option`,expand(e){let t=dg(e.title,`Decision`),n=[{type:`heading`,value:t}];e.recommendation&&n.push({type:`kv`,value:{Recommendation:e.recommendation}});let r=pg(e.options);return r&&r.length>0&&n.push({type:`comparison`,value:r.map(e=>({title:dg(e.title,`Option`),items:Array.isArray(e.items)?e.items:[]}))}),{title:t,blocks:n}}}],hg=new Map;for(let e of mg)hg.set(e.name,e);function gg(e,t){let n=hg.get(e);return n?n.expand(t):null}function _g(e){let t=[],n=!1,r=!1;for(let i of e){if(r){r=!1,t.push(i);continue}if(i===`\\`&&n){r=!0,t.push(i);continue}if(i===`"`){n=!n,t.push(i);continue}if(n&&(i===`
3009
+ `||i===`\r`)){t.push(`\\n`);continue}t.push(i)}return t.join(``)}function vg(e){let t=[],n=!1,r=!1;for(let i of e){if(r){r=!1,t.push(i);continue}if(i===`\\`&&n){r=!0,t.push(i);continue}if(i===`"`){n=!n,t.push(i);continue}if(n){t.push(i);continue}if(i===`]`||i===`}`)for(let e=t.length-1;e>=0;e--){let n=t[e];if(!(n===` `||n===`
3010
+ `||n===` `||n===`\r`||n===``)){n===`,`&&(t[e]=``);break}}t.push(i)}return t.join(``)}function yg(e){try{return JSON.parse(e)}catch{}let t=vg(_g(e));try{return JSON.parse(t)}catch(e){try{return JSON.parse(t.replaceAll(`'`,`"`))}catch{throw e}}}const bg={h:`heading`,m:`markdown`,t:`table`,p:`paragraph`,c:`code`,s:`separator`,M:`metrics`,C:`chart`,T:`timeline`,g:`graph`,tr:`tree`,tl:`timeline`,cl:`checklist`,pr:`progress`,sb:`status-board`,kv:`kv`,ac:`actions`,di:`mermaid`},xg=/^(#{1,6})\s/,Sg=/^(`{3,}|~{3,})/,Cg=/^\|.+\|.+\|/m;function wg(e){let t=e.trim(),n=t.match(xg);if(n)return{type:`heading`,value:t.slice(n[0].length)};if(Sg.test(t)){let e=t.indexOf(`
3011
+ `),n=t.lastIndexOf(t[0]);return{type:`code`,value:e>=0?t.slice(e+1,n).trimEnd():t}}return Cg.test(t)?{type:`table`,value:t}:{type:`markdown`,value:t}}function Tg(e,t){let n=bg[e];if(!n)return null;switch(e){case`M`:return{type:`metrics`,value:t};case`C`:return{type:`chart`,value:t};case`T`:case`tl`:return{type:`timeline`,value:t};case`g`:return{type:`graph`,value:t};case`tr`:return{type:`tree`,value:t};case`cl`:return{type:`checklist`,value:t};case`pr`:return{type:`progress`,value:t};case`sb`:return{type:`status-board`,value:t};case`kv`:return{type:`kv`,value:t};case`ac`:return{type:`actions`,value:t};case`di`:return{type:`mermaid`,value:t};case`s`:return{type:`separator`,value:t||!0};default:return{type:n,value:typeof t==`string`?t:String(t??``)}}}function Eg(e){if(typeof e==`string`){let t=wg(e);return{type:t.type,value:t.value}}if(Array.isArray(e)){let[t,n]=e;if(typeof t==`string`){let e=Tg(t,n);if(e)return e}return{type:`markdown`,value:String(t??``)}}if(typeof e==`object`&&e){let{blockId:t,...n}=e;return n}return{type:`markdown`,value:String(e??``)}}function Dg(e){return{title:e.title??``,blocks:Array.isArray(e.blocks)?e.blocks.map(Eg):[]}}function Og(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function kg(e){return Og(e)&&typeof e.schemaVersion==`number`&&e.schemaVersion===1}function Ag(e){return Og(e)&&typeof e.schemaVersion==`number`&&e.schemaVersion!==1}function jg(e){return e.schemaVersion===1?typeof e.title!=`string`||e.title.length===0?{ok:!1,error:{code:`MISSING_TITLE`,reason:`ChannelSurface requires a non-empty title`}}:e.blocks!==void 0&&!Array.isArray(e.blocks)?{ok:!1,error:{code:`INVALID_BLOCKS`,reason:`blocks must be an array of TypedBlock objects`}}:{ok:!0,surface:e}:{ok:!1,error:{code:`UNSUPPORTED_SCHEMA_VERSION`,reason:`Unsupported schemaVersion: ${String(e.schemaVersion)}`}}}function Mg(e){try{let t=yg(e);return Og(t)?(t.schemaVersion===void 0&&(t.schemaVersion=1),Ng(t)):{ok:!1,error:{code:`INVALID_RAW_INPUT`,reason:`raw field must contain a JSON object (ChannelSurface)`}}}catch(e){return{ok:!1,error:{code:`INVALID_RAW_JSON`,reason:`Failed to parse raw field: ${e.message}`,hint:`JSON repair attempted. Ensure the raw string contains a valid ChannelSurface object. Common LLM errors (newlines in strings, trailing commas) are auto-repaired.`}}}}function Ng(e){if(Array.isArray(e)){if(e.length!==2)return{ok:!1,error:{code:`INVALID_PRESET_INPUT`,reason:`Preset input must be a [name, data] tuple`,hint:`Use [presetName, { title, ...fields }]`}};let[t,n]=e;if(typeof t!=`string`)return{ok:!1,error:{code:`INVALID_PRESET_INPUT`,reason:`Preset name must be a string`}};if(!Og(n))return{ok:!1,error:{code:`INVALID_PRESET_INPUT`,reason:`Preset data must be an object`}};let r=gg(t,n);return r?{ok:!0,surface:{schemaVersion:1,title:r.title,blocks:r.blocks}}:{ok:!1,error:{code:`UNKNOWN_PRESET`,reason:`Unknown preset: ${t}`,hint:`Available presets: summary, plan, understanding, bug-analyze, task-done, review, explore, decision`}}}if(Ag(e))return{ok:!1,error:{code:`UNSUPPORTED_SCHEMA_VERSION`,reason:`Unsupported schemaVersion: ${String(e.schemaVersion)}`,hint:`Use schemaVersion: 1`}};if(Og(e)&&typeof e.raw==`string`)return Mg(e.raw);if(kg(e))return jg(e);if(typeof e==`string`){let t=Dg({blocks:[e]});return{ok:!0,surface:{schemaVersion:1,title:t.title||`Present`,blocks:t.blocks}}}if(Og(e)){if(!(`blocks`in e)&&!(`title`in e))return{ok:!1,error:{code:`INVALID_INPUT`,reason:`Expected a ChannelSurface object, preset tuple, or shorthand input`}};let t=Dg(e);return{ok:!0,surface:{schemaVersion:1,title:t.title||`Present`,blocks:t.blocks}}}return{ok:!1,error:{code:`INVALID_INPUT`,reason:`Expected a ChannelSurface object, preset tuple, or shorthand input`}}}const Pg=I.object({label:I.string(),value:I.string(),description:I.string().optional()}),Fg=I.object({id:I.string().describe(`Unique action identifier`),type:I.enum([`button`,`select`,`multi-select`,`form-submit`,`text-submit`,`confirm`,`custom`]).describe(`Interactive action type`),label:I.string().describe(`Visible action label`),variant:I.enum([`primary`,`danger`,`default`]).optional(),options:I.array(Pg).optional(),schema:I.record(I.string(),I.unknown()).optional()}),Ig=I.object({type:I.string(),title:I.string().optional(),value:I.unknown().optional(),language:I.string().optional()}).catchall(I.unknown()),Lg={schemaVersion:I.literal(1).describe(`ChannelSurface schema version. Must be 1.`),title:I.string().describe(`Surface title shown to the user.`),description:I.string().optional().describe(`Optional supporting copy for the surface.`),template:I.string().optional().describe(`Optional template id such as report@1.`),layout:I.object({maxWidth:I.string().optional(),padding:I.string().optional(),columns:I.number().optional()}).optional(),blocks:I.array(Ig).optional().describe(`Typed block content for the surface.`),data:I.unknown().optional().describe(`Template data payload, if the template expands data.`),actions:I.array(Fg).optional().describe(`Interactive actions. Presence triggers browser transport.`),response:I.object({timeout:I.number().finite().min(0).max(3e5).optional(),required:I.boolean().optional()}).optional(),metadata:I.object({surfaceId:I.string().optional(),createdAt:I.string().optional(),source:I.string().optional()}).optional(),colorScheme:I.enum([`light`,`dark`,`auto`]).optional(),lang:I.string().optional(),dir:I.enum([`ltr`,`rtl`,`auto`]).optional(),raw:I.string().optional().describe(`Raw JSON string with auto-repair. Accepts common LLM JSON errors (unescaped newlines in strings, trailing commas). Use for complex payloads with mermaid/code/markdown blocks.`),preferBrowser:I.boolean().optional().default(!0).describe(`Prefer browser transport instead of inline rendering. Default: true — most clients render in an external browser window. Set preferBrowser: false to request inline/embedded rendering (only honored when the client supports inline display; auto-falls back to browser if not).`)};I.object({surfaceId:I.string(),actionId:I.string(),actionType:I.enum([`button`,`select`,`multi-select`,`form-submit`,`text-submit`,`confirm`,`custom`]),value:I.unknown().optional(),formData:I.record(I.string(),I.unknown()).optional(),selection:I.union([I.string(),I.array(I.string())]).optional(),label:I.string().optional(),timestamp:I.string(),sourceTransport:I.enum([`mcp-app`,`browser`,`export`])});function Rg(e){let t=e.server?.getClientCapabilities?.();if(!t)return`unknown`;let n=gr(t);return!n||Array.isArray(n.mimeTypes)&&n.mimeTypes.length>0&&!n.mimeTypes.includes(hr)?`unsupported`:`supported`}const zg=[{name:`summary`,description:`Title + markdown summary + optional metrics (pass/fail counts)`,inputSchema:{type:`object`,properties:{title:{type:`string`,description:`Section heading`},summary:{type:`string`,description:`Free-form markdown summary`},passed:{type:`number`,description:`Pass count for metrics`},failed:{type:`number`,description:`Fail count for metrics`}},required:[`title`]},example:JSON.stringify({title:`Build Summary`,summary:`All tests passed.`,passed:42,failed:0}),expandsTo:`blocks: [heading, markdown, metrics]`},{name:`plan`,description:`Title + heading per step + checklist items`,inputSchema:{type:`object`,properties:{title:{type:`string`},steps:{type:`array`,items:{type:`object`,properties:{label:{type:`string`},checked:{type:`boolean`}}}}},required:[`title`]},example:JSON.stringify({title:`Sprint Plan`,steps:[{label:`Write tests`,checked:!1},{label:`Deploy`,checked:!1}]}),expandsTo:`blocks: [heading, checklist]`},{name:`understanding`,description:`Title + markdown explanation + kv pairs`,inputSchema:{type:`object`,properties:{title:{type:`string`},explanation:{type:`string`},details:{type:`object`,additionalProperties:{type:`string`}}},required:[`title`,`explanation`]},example:JSON.stringify({title:`Architecture Overview`,explanation:`The system uses microservices.`,details:{Language:`TypeScript`,Runtime:`Node`}}),expandsTo:`blocks: [heading, markdown, kv]`},{name:`bug-analyze`,description:`Title + heading + severity/status kv + code block + markdown`,inputSchema:{type:`object`,properties:{title:{type:`string`},severity:{type:`string`},status:{type:`string`},code:{type:`string`},analysis:{type:`string`}},required:[`title`,`severity`,`status`]},example:JSON.stringify({title:`Null pointer in auth`,severity:`high`,status:`open`,code:`const x = obj.prop;`,analysis:`obj may be null when token missing.`}),expandsTo:`blocks: [heading, kv, code, markdown]`},{name:`task-done`,description:`Title + checklist of completed items + optional metrics`,inputSchema:{type:`object`,properties:{title:{type:`string`},items:{type:`array`,items:{type:`object`,properties:{label:{type:`string`},checked:{type:`boolean`}}}},completed:{type:`number`},total:{type:`number`}},required:[`title`,`items`]},example:JSON.stringify({title:`PR #42 Done`,items:[{label:`Lint pass`,checked:!0},{label:`Tests pass`,checked:!0}],completed:2,total:2}),expandsTo:`blocks: [heading, checklist, metrics]`},{name:`review`,description:`Title + criteria checklist + approval actions`,inputSchema:{type:`object`,properties:{title:{type:`string`,description:`Review title`},criteria:{type:`array`,description:`Checklist criteria items`,items:{type:`object`,properties:{label:{type:`string`},checked:{type:`boolean`}}}},annotations:{type:`array`,description:`Optional annotation items`,items:{type:`object`,properties:{label:{type:`string`},description:{type:`string`},severity:{type:`string`}}}},approval:{type:`object`,description:`Optional approval config`,properties:{prompt:{type:`string`},options:{type:`array`,items:{type:`object`,properties:{label:{type:`string`},value:{type:`string`}}}}}}},required:[`title`,`criteria`]},example:JSON.stringify({title:`Code Review`,criteria:[{label:`Tests included`,checked:!0},{label:`No regressions`,checked:!1}]}),expandsTo:`blocks: [heading, checklist] + actions: [approve, reject]`},{name:`explore`,description:`Title + heading per finding + code blocks`,inputSchema:{type:`object`,properties:{title:{type:`string`},findings:{type:`array`,items:{type:`object`,properties:{heading:{type:`string`},code:{type:`string`}}}}},required:[`title`,`findings`]},example:JSON.stringify({title:`Codebase Exploration`,findings:[{heading:`Auth flow`,code:`function login()`},{heading:`API routes`,code:`router.get("/api")`}]}),expandsTo:`blocks: [heading, code] per finding`},{name:`decision`,description:`Title + kv for recommendation + comparison blocks per option`,inputSchema:{type:`object`,properties:{title:{type:`string`},recommendation:{type:`string`},options:{type:`array`,items:{type:`object`,properties:{title:{type:`string`},items:{type:`array`,items:{type:`string`}}}}}},required:[`title`,`recommendation`]},example:JSON.stringify({title:`DB Choice`,recommendation:`PostgreSQL`,options:[{title:`Postgres`,items:[`ACID`,`Rich types`]},{title:`Mongo`,items:[`Schema-less`,`Horizontal`]}]}),expandsTo:`blocks: [heading, kv, comparison]`}];function Bg(e,t){let n=U(`present`);try{let e=i(`present`);e&&ig(N(F(e,`dist`,`annotation-layer.js`),`utf8`))}catch{}vr(e,`present`,{title:n.title,description:"Render a ChannelSurface. Required: schemaVersion: 1, title. Supports blocks, template+data, named presets, and raw JSON string with auto-repair. Use `raw` for complex payloads (mermaid, code, many blocks) — common LLM JSON errors are auto-fixed. IMPORTANT: when using `raw`, do NOT pass `schemaVersion` or `title` at the top level — the `raw` JSON must be a self-contained ChannelSurface with its own `schemaVersion: 1`, `title`, and `blocks`. preferBrowser defaults to true (browser rendering). Set preferBrowser: false explicitly when you want inline — only honored if the client supports it; auto-falls back to browser otherwise. Actions always use browser transport. Resources: aikit://schemas/channel-surface (schema+blocks), aikit://present/presets (presets), aikit://present/templates (viewers).",inputSchema:Lg,annotations:n.annotations,_meta:uh(xh)},J(`present`,async(t,n)=>{let r=t,i=typeof r.preferBrowser==`boolean`?r.preferBrowser:void 0,a=Ng(t);if(!a.ok)return sg(a.error.code,a.error.reason,void 0,`Present`);let o=cg(a.surface,n);if(!o.ok)return o.response;let s=Rg(e),c=!(i===!1&&s===`supported`),l={responseTimeoutMs:o.surface.response?.timeout,responseRequired:o.surface.response?.required,transportReason:c?`caller-preferred`:`inline-unsupported`};return await ug(o.surface,{...o.options,preferBrowser:c,session:l})}));try{let t=new er(xh,{list:void 0});e.registerResource(`Present View`,t,{description:`AI Kit present tool viewer`},async(e,t,n)=>{let r=Array.isArray(t.id)?t.id[0]:t.id,i=r?jh(r):void 0;return{contents:[{uri:e.href,mimeType:hr,_meta:dh(),text:i??Oh()??`<html><body><p>No content generated yet. Call the present tool first.</p></body></html>`}]}})}catch{}function r(){try{let e=i(`present`);if(e)return N(F(e,`dist`,`index.html`),`utf8`)}catch{}return Oh()||`<html><body><p>Loading...</p></body></html>`}try{e.registerResource(`Present App`,bh,{description:`AI Kit present app - entry point`},async()=>({contents:[{uri:bh,mimeType:hr,_meta:dh(),text:r()}]}))}catch{}try{e.registerResource(`present-templates`,`aikit://present/templates`,{description:`List all registered present viewer templates with their input schemas`},async()=>{let e=bp().map(e=>({id:e.id,label:e.label,description:e.description,transports:e.supportedTransports,inputSchema:e.inputSchema}));return{contents:[{uri:`aikit://present/templates`,mimeType:`application/json`,text:JSON.stringify(e,null,2)}]}})}catch{}try{e.registerResource(`present-presets`,`aikit://present/presets`,{description:`List all registered present presets with input schemas and examples`},async()=>({contents:[{uri:`aikit://present/presets`,mimeType:`application/json`,text:JSON.stringify(zg,null,2)}]}))}catch{}}const Vg=k(`tools`);function Hg(e,t){let n=new ar({structure:new sr,dependencies:new nr,symbols:new cr,patterns:new or,entryPoints:new ir,diagrams:new rr}),r=U(`produce_knowledge`);e.registerTool(`produce_knowledge`,{title:r.title,description:`Run automated codebase analysis and produce synthesis instructions. Executes Tier 1 deterministic analyzers, then returns structured baselines and instructions for you to synthesize knowledge using remember.`,inputSchema:{scope:I.string().optional().describe(`Root path to analyze (defaults to workspace root)`),aspects:I.array(I.enum([`all`,`structure`,`dependencies`,`symbols`,`patterns`,`entry-points`,`diagrams`])).default([`all`]).describe(`Which analysis aspects to run`)},annotations:r.annotations},J(`produce_knowledge`,async({scope:e,aspects:t},r)=>{let i;try{i=Lc(r).createTask(`Produce Knowledge`,3),i.progress(0,`Running analyzers`);let a=e??`.`;Vg.info(`Running knowledge production`,{rootPath:a,aspects:t});let o=await n.runExtraction(a,t);try{let e=P(Cn(F(a)),pe.onboard);Oe(e,{recursive:!0});let t=`<!-- Generated by produce_knowledge at ${new Date().toISOString()} -->\n\n`;for(let[n,r]of Object.entries(o))r&&typeof r==`string`&&Pe(P(e,`${n}.md`),t+r,`utf-8`);Vg.info(`Knowledge persisted to .ai/context/`,{files:Object.keys(o).length})}catch(e){Vg.warn(`Failed to persist knowledge to .ai/context/`,{error:j(e)})}i.progress(1,`Synthesizing results`);let s=n.buildSynthesisInstructions(o,t);return i.complete(`Knowledge production complete`),{content:[{type:`text`,text:s+`
3012
3012
 
3013
3013
  ---
3014
- _Next: Review the baselines above and use \`remember\` to store synthesized knowledge entries._`}]}}catch(e){return i?.fail?.(`Production failed`),Bg.error(`Knowledge production failed`,j(e)),q(`INTERNAL`,`Knowledge production failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Hg=k(`tools`);function Ug(e,t,n,r,i,a,o,s){let c=U(`reindex`);e.registerTool(`reindex`,{title:c.title,description:`Trigger re-indexing of the AI Kit index. Can do incremental (only changed files) or full re-index. When smart indexing is active, use force: true to override the automatic trickle indexer.`,inputSchema:{full:I.boolean().default(!1).describe(`If true, force full re-index ignoring file hashes`),force:I.boolean().default(!1).describe(`If true, override smart indexing guard and run reindex anyway`)},annotations:c.annotations},J(`reindex`,async({full:e,force:c},l)=>{try{if(t.isIndexing)return{content:[{type:`text`,text:`## Reindex Already in Progress
3014
+ _Next: Review the baselines above and use \`remember\` to store synthesized knowledge entries._`}]}}catch(e){return i?.fail?.(`Production failed`),Vg.error(`Knowledge production failed`,j(e)),q(`INTERNAL`,`Knowledge production failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Ug=k(`tools`);function Wg(e,t,n,r,i,a,o,s){let c=U(`reindex`);e.registerTool(`reindex`,{title:c.title,description:`Trigger re-indexing of the AI Kit index. Can do incremental (only changed files) or full re-index. When smart indexing is active, use force: true to override the automatic trickle indexer.`,inputSchema:{full:I.boolean().default(!1).describe(`If true, force full re-index ignoring file hashes`),force:I.boolean().default(!1).describe(`If true, override smart indexing guard and run reindex anyway`)},annotations:c.annotations},J(`reindex`,async({full:e,force:c},l)=>{try{if(t.isIndexing)return{content:[{type:`text`,text:`## Reindex Already in Progress
3015
3015
 
3016
3016
  A reindex operation is currently running. Search and other tools continue to work with existing data. Use \`status({})\` to check when it completes.`}]};if(o===`smart`&&!c)return{content:[{type:`text`,text:`## Smart Indexing Active
3017
3017
 
@@ -3019,41 +3019,41 @@ Smart indexing (trickle mode) is enabled — files are automatically indexed as
3019
3019
 
3020
3020
  **If the index is severely outdated**, use \`reindex({ force: true })\` to override.
3021
3021
 
3022
- Use \`status({})\` to check smart indexing queue status.`}]};let u=Ic(l).createTask(`Reindex`,1);u.progress(0,`Starting ${e?`full`:`incremental`} reindex`),Hg.info(`Starting background re-index`,{mode:e?`full`:`incremental`});let d=e=>t=>{t.phase===`chunking`&&t.currentFile&&Hg.debug(`Re-index progress`,{prefix:e,current:t.filesProcessed+1,total:t.filesTotal,file:t.currentFile})};return(e?t.reindexAll(n,d(`Reindex`)):t.index(n,d(`Index`))).then(async e=>{if(Hg.info(`Background re-index complete`,{filesProcessed:e.filesProcessed,chunksCreated:e.chunksCreated,durationMs:e.durationMs}),u.complete(`Reindex complete: ${e.filesProcessed} files, ${e.chunksCreated} chunks in ${e.durationMs}ms`),i)try{await i.createFtsIndex(),Hg.info(`FTS index rebuilt after reindex`)}catch(e){Hg.warn(`FTS index rebuild failed`,j(e))}try{let e=await r.reindexAll();Hg.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){Hg.warn(`Curated re-index failed`,j(e))}if(a)try{await a.notifyAfterReindex()}catch(e){Hg.warn(`Post-reindex resource notification failed`,j(e))}if(s)try{s.emit({type:`reindex:done`,timestamp:Date.now(),eventId:`reindex-done-${Date.now()}`,workspaceId:`ws:default`,source:`reindex-tool`,result:`completed`,filesProcessed:e.filesProcessed,durationMs:e.durationMs}),Hg.info(`reindex:done event emitted`)}catch(e){Hg.warn(`Failed to emit reindex:done event`,j(e))}}).catch(e=>{u.fail(`Reindex failed: ${e instanceof Error?e.message:String(e)}`),Hg.error(`Background reindex failed`,j(e))}),{content:[{type:`text`,text:`## Reindex Started (Background)\n\n- **Mode**: ${e?`Full`:`Incremental`}\n- Search and other tools continue to work with existing data during reindex.\n- Completion will be logged. Use \`status({})\` to check index stats afterward.\n\n---\n_Next: Continue working — the reindex runs in the background._`}]}}catch(e){return Hg.error(`Reindex failed`,j(e)),q(`INTERNAL`,`Reindex failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Wg=k(`tools`);function Gg(e){let t=U(`replay`);e.registerTool(`replay`,{title:t.title,description:`View or clear the audit trail of recent MCP tool and CLI invocations. Shows tool name, duration, status, and input/output summaries.`,inputSchema:{action:I.enum([`list`,`clear`]).default(`list`).describe(`Action: "list" (default) to view entries, "clear" to wipe the log`),last:I.number().optional().describe(`Number of entries to return (default: 20, list only)`),tool:I.string().optional().describe(`Filter by tool name (list only)`),source:I.enum([`mcp`,`cli`]).optional().describe(`Filter by source: "mcp" or "cli" (list only)`),since:I.string().optional().describe(`ISO timestamp — only show entries after this time (list only)`),max_tokens:I.number().optional().describe(`Approximate token limit for output. Entries are condensed to fit.`)},annotations:t.annotations},J(`replay`,async({action:e,last:t,tool:n,source:r,since:i,max_tokens:a})=>{try{if(e===`clear`)return vn(),{content:[{type:`text`,text:`Replay log cleared.`}]};let o=yn({last:t,tool:n,source:r,since:i,maxTokens:a});if(o.length===0)return{content:[{type:`text`,text:`No replay entries found. Activity is logged when tools are invoked via MCP or CLI.`}]};let s=o.map(e=>`${e.ts.split(`T`)[1]?.split(`.`)[0]??e.ts} ${e.status===`ok`?`✓`:`✗`} ${e.tool} (${e.durationMs}ms) [${e.source}]\n in: ${e.input}\n out: ${e.output}`);return bn().catch(()=>{}),{content:[{type:`text`,text:`**Replay Log** (${o.length} entries)\n\n${s.join(`
3022
+ Use \`status({})\` to check smart indexing queue status.`}]};let u=Lc(l).createTask(`Reindex`,1);u.progress(0,`Starting ${e?`full`:`incremental`} reindex`),Ug.info(`Starting background re-index`,{mode:e?`full`:`incremental`});let d=e=>t=>{t.phase===`chunking`&&t.currentFile&&Ug.debug(`Re-index progress`,{prefix:e,current:t.filesProcessed+1,total:t.filesTotal,file:t.currentFile})};return(e?t.reindexAll(n,d(`Reindex`)):t.index(n,d(`Index`))).then(async e=>{if(Ug.info(`Background re-index complete`,{filesProcessed:e.filesProcessed,chunksCreated:e.chunksCreated,durationMs:e.durationMs}),u.complete(`Reindex complete: ${e.filesProcessed} files, ${e.chunksCreated} chunks in ${e.durationMs}ms`),i)try{await i.createFtsIndex(),Ug.info(`FTS index rebuilt after reindex`)}catch(e){Ug.warn(`FTS index rebuild failed`,j(e))}try{let e=await r.reindexAll();Ug.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){Ug.warn(`Curated re-index failed`,j(e))}if(a)try{await a.notifyAfterReindex()}catch(e){Ug.warn(`Post-reindex resource notification failed`,j(e))}if(s)try{s.emit({type:`reindex:done`,timestamp:Date.now(),eventId:`reindex-done-${Date.now()}`,workspaceId:`ws:default`,source:`reindex-tool`,result:`completed`,filesProcessed:e.filesProcessed,durationMs:e.durationMs}),Ug.info(`reindex:done event emitted`)}catch(e){Ug.warn(`Failed to emit reindex:done event`,j(e))}}).catch(e=>{u.fail(`Reindex failed: ${e instanceof Error?e.message:String(e)}`),Ug.error(`Background reindex failed`,j(e))}),{content:[{type:`text`,text:`## Reindex Started (Background)\n\n- **Mode**: ${e?`Full`:`Incremental`}\n- Search and other tools continue to work with existing data during reindex.\n- Completion will be logged. Use \`status({})\` to check index stats afterward.\n\n---\n_Next: Continue working — the reindex runs in the background._`}]}}catch(e){return Ug.error(`Reindex failed`,j(e)),q(`INTERNAL`,`Reindex failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Gg=k(`tools`);function Kg(e){let t=U(`replay`);e.registerTool(`replay`,{title:t.title,description:`View or clear the audit trail of recent MCP tool and CLI invocations. Shows tool name, duration, status, and input/output summaries.`,inputSchema:{action:I.enum([`list`,`clear`]).default(`list`).describe(`Action: "list" (default) to view entries, "clear" to wipe the log`),last:I.number().optional().describe(`Number of entries to return (default: 20, list only)`),tool:I.string().optional().describe(`Filter by tool name (list only)`),source:I.enum([`mcp`,`cli`]).optional().describe(`Filter by source: "mcp" or "cli" (list only)`),since:I.string().optional().describe(`ISO timestamp — only show entries after this time (list only)`),max_tokens:I.number().optional().describe(`Approximate token limit for output. Entries are condensed to fit.`)},annotations:t.annotations},J(`replay`,async({action:e,last:t,tool:n,source:r,since:i,max_tokens:a})=>{try{if(e===`clear`)return vn(),{content:[{type:`text`,text:`Replay log cleared.`}]};let o=yn({last:t,tool:n,source:r,since:i,maxTokens:a});if(o.length===0)return{content:[{type:`text`,text:`No replay entries found. Activity is logged when tools are invoked via MCP or CLI.`}]};let s=o.map(e=>`${e.ts.split(`T`)[1]?.split(`.`)[0]??e.ts} ${e.status===`ok`?`✓`:`✗`} ${e.tool} (${e.durationMs}ms) [${e.source}]\n in: ${e.input}\n out: ${e.output}`);return bn().catch(()=>{}),{content:[{type:`text`,text:`**Replay Log** (${o.length} entries)\n\n${s.join(`
3023
3023
 
3024
- `)}`}]}}catch(e){return Wg.error(`Replay failed`,j(e)),q(`INTERNAL`,`Replay failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Kg=k(`tools`);function qg(e){let t=U(`restore`);e.registerTool(`restore`,{title:t.title,description:`List and restore file snapshots taken before destructive operations (codemod, rename, forget). Use action=list to see available restore points, action=restore with an id to undo.`,inputSchema:{action:I.enum([`list`,`restore`]).describe(`list: show restore points, restore: apply a restore point`),id:I.string().optional().describe(`Restore point ID (required for action=restore)`),limit:I.number().min(1).max(50).default(10).describe(`Max restore points to list`)},annotations:t.annotations},async({action:e,id:t,limit:n})=>{try{if(e===`list`){let e=qt().slice(0,n);return e.length===0?{content:[{type:`text`,text:`No restore points found.`}]}:{content:[{type:`text`,text:`## Restore Points\n\n${e.map(e=>`- **${e.id}** (${e.timestamp}) — ${e.operation}: ${e.description} (${e.files.length} files)`).join(`
3024
+ `)}`}]}}catch(e){return Gg.error(`Replay failed`,j(e)),q(`INTERNAL`,`Replay failed: ${e instanceof Error?e.message:String(e)}`)}}))}const qg=k(`tools`);function Jg(e){let t=U(`restore`);e.registerTool(`restore`,{title:t.title,description:`List and restore file snapshots taken before destructive operations (codemod, rename, forget). Use action=list to see available restore points, action=restore with an id to undo.`,inputSchema:{action:I.enum([`list`,`restore`]).describe(`list: show restore points, restore: apply a restore point`),id:I.string().optional().describe(`Restore point ID (required for action=restore)`),limit:I.number().min(1).max(50).default(10).describe(`Max restore points to list`)},annotations:t.annotations},async({action:e,id:t,limit:n})=>{try{if(e===`list`){let e=qt().slice(0,n);return e.length===0?{content:[{type:`text`,text:`No restore points found.`}]}:{content:[{type:`text`,text:`## Restore Points\n\n${e.map(e=>`- **${e.id}** (${e.timestamp}) — ${e.operation}: ${e.description} (${e.files.length} files)`).join(`
3025
3025
  `)}`}]}}if(!t)throw Error(`id is required for restore action`);let r=await wn(t);return{content:[{type:`text`,text:`Restored ${r.length} files:\n${r.map(e=>`- \`${e}\``).join(`
3026
- `)}`}]}}catch(e){return Kg.error(`Restore failed`,j(e)),q(`INTERNAL`,`Restore failed: ${e instanceof Error?e.message:String(e)}`)}})}const Jg=/<\/?curated-context>/gi;function Yg(e){return e.replace(Jg,``)}function Xg(e){return`<curated-context>\n${Yg(e)}\n</curated-context>`}const Zg=k(`tools`);function Qg(e,t,n,r){a(e,t,n);let i=e.memoryMetaGet(t);if(!i)return;let o=O(i,{...u,...r});o&&(l(e,t,o),m(e,t,n))}function $g(e,t){let n=[],r=A(),i=r?Fe(r):``;i&&n.push(`[project: ${i}]`);let a=t?Nn(t,`__context_boost`):void 0;return a&&n.push(`[focus: ${a.value}]`),n.length===0?e:`${n.join(` `)} ${e}`}function e_(e,t,n){return n?e:t===`curated`?e*1.2:e}function t_(e,t){return t?e:e.map(e=>({record:e.record,score:e_(e.score,e.record.origin,t)})).sort((e,t)=>t.score-e.score)}function n_(e,t){let n=e?Math.floor(e/Math.max(1,t)):96;return Math.max(40,Math.min(160,n))}function r_(e,t){let n=e.origin===`curated`?Xg(e.content):e.content,r=Vn(n,t);return{body:r,truncated:r!==n}}async function i_(e,t,n,r,i){if(!e||t>=e.config.fallbackThreshold&&n.length>0)return{results:n,triggered:!1,cacheHit:!1};let a=!1;try{let t=e.cache.get(r);return t?a=!0:(t=await e.client.search(r,i),t.length>0&&e.cache.set(r,t)),t.length>0?{results:pr(n,t,i).map(e=>({record:{id:`er:${e.sourcePath}`,content:e.content,sourcePath:e.source===`er`?`[ER] ${e.sourcePath}`:e.sourcePath,startLine:e.startLine??0,endLine:e.endLine??0,contentType:e.contentType??`documentation`,headingPath:e.headingPath,origin:e.source===`er`?`curated`:e.origin??`indexed`,category:e.category,tags:e.tags??[],chunkIndex:0,totalChunks:1,fileHash:``,indexedAt:new Date().toISOString(),version:1},score:e.score})),triggered:!0,cacheHit:a}:{results:n,triggered:!0,cacheHit:a}}catch(e){return Zg.warn(`ER fallback failed`,j(e)),{results:n,triggered:!0,cacheHit:a}}}function a_(e,t,n=60){let r=new Map,i=e[0]?.score||1,a=t[0]?.score||1;for(let t=0;t<e.length;t++){let a=e[t],o=a.score/i;r.set(a.record.id,{record:a.record,score:1/(n+t+1)*o})}for(let e=0;e<t.length;e++){let i=t[e],o=i.score/a,s=r.get(i.record.id);s?s.score+=1/(n+e+1)*o:r.set(i.record.id,{record:i.record,score:1/(n+e+1)*o})}return[...r.values()].sort((e,t)=>t.score-e.score).map(({record:e,score:t})=>({record:e,score:t*(n+1)}))}function o_(e,t){let n=t.toLowerCase().split(/\s+/).filter(e=>e.length>=2);return n.length<2?e:e.map(e=>{let t=e.record.content.toLowerCase();if(t.length>5e3)return e;let r=n.map(e=>{let n=[],r=t.indexOf(e);for(;r!==-1&&n.length<10;)n.push(r),r=t.indexOf(e,r+1);return n});if(r.some(e=>e.length===0))return e;let i=t.length;for(let e of r[0]){let t=e,a=e+n[0].length;for(let i=1;i<r.length;i++){let o=r[i][0],s=Math.abs(o-e);for(let t=1;t<r[i].length;t++){let n=Math.abs(r[i][t]-e);n<s&&(s=n,o=r[i][t])}t=Math.min(t,o),a=Math.max(a,o+n[i].length)}i=Math.min(i,a-t)}let a=1+.25/(1+i/200);return{record:e.record,score:e.score*a}}).sort((e,t)=>t.score-e.score)}function s_(e){if(e.length<=1)return e;let t=new Set;return e.filter(e=>{let n=e.record.contentHash;return n?t.has(n)?!1:(t.add(n),!0):!0})}function c_(e,t,n=8){let r=new Set(t.toLowerCase().split(/\s+/).filter(e=>e.length>=2)),i=new Map,a=e.length;for(let t of e){let e=t.record.content.split(/[^a-zA-Z0-9_]+/).filter(e=>e.length>=3&&!l_.has(e.toLowerCase())),n=new Set;for(let t of e){let e=t.toLowerCase();/[_A-Z]/.test(t)&&i.set(`__id__${e}`,1),n.has(e)||(n.add(e),i.set(e,(i.get(e)??0)+1))}}let o=[];for(let[e,t]of i){if(e.startsWith(`__id__`)||r.has(e)||t>a*.8)continue;let n=Math.log(a/t),s=+!!i.has(`__id__${e}`),c=e.length>8?.5:0;o.push({term:e,score:n+s+c})}return o.sort((e,t)=>t.score-e.score).slice(0,n).map(e=>e.term)}const l_=new Set(`the.and.for.are.but.not.you.all.can.had.her.was.one.our.out.has.have.from.this.that.with.they.been.said.each.which.their.will.other.about.many.then.them.these.some.would.make.like.into.could.time.very.when.come.just.know.take.people.also.back.after.only.more.than.over.such.import.export.const.function.return.true.false.null.undefined.string.number.boolean.void.type.interface`.split(`.`));async function u_(e,t){try{let n=await e.getStats();if(!n.lastIndexedAt)return;let r=new Date(n.lastIndexedAt).getTime(),i=Date.now(),a=[...new Set(t.map(e=>e.record.sourcePath))].filter(e=>!e.startsWith(`[ER]`)).slice(0,5);if(a.length===0)return;let o=0;for(let e of a)try{(await We(e)).mtimeMs>r&&o++}catch{o++}let s=Math.max(1,Math.ceil(a.length*.3)),c=0;for(let e of a)try{(await We(e)).mtimeMs>r+12e4&&c++}catch{c++}if(c>=s){let e=i-r,t=Math.floor(e/6e4),n=t<1?`<1 min`:`${t} min`;return`> ⚠️ **Index may be stale** — ${c}/${a.length} sampled files modified since last index (${n} ago). Use \`reindex\` to refresh.`}}catch{}}function d_(e,t,n,r,i,a,o,s,c,l,u){let d=U(`search`);e.registerTool(`search`,{title:d.title,description:`Search AI Kit for code, docs, and prior decisions. Default choice for discovery. Modes: hybrid (default), semantic, keyword. For multi-strategy precision queries use find; for a known file path use lookup.`,outputSchema:Ns,inputSchema:{query:I.string().max(5e3).describe(`Natural language search query`),limit:I.number().min(1).max(20).default(5).describe(`Maximum results to return`),search_mode:I.enum([`hybrid`,`semantic`,`keyword`]).default(`hybrid`).describe(`Search strategy: hybrid (vector + FTS + RRF fusion, default), semantic (vector only), keyword (FTS only)`),content_type:I.enum(me).optional().describe(`Filter by content type`),source_type:I.enum(ve).optional().describe(`Coarse filter: "source" (code only), "documentation" (md, curated), "test", "config". Overrides content_type if both set.`),origin:I.enum(_e).optional().describe(`Filter by knowledge origin`),category:I.string().optional().describe(`Filter by category (e.g., decisions, patterns, conventions)`),tags:I.array(I.string()).optional().describe(`Filter by exact tag membership (any supplied tag may match)`),min_score:I.number().min(0).max(1).default(.25).describe(`Minimum similarity score`),graph_hops:I.number().min(0).max(3).default(1).describe(`Number of graph hops to augment results with connected entities (0 = disabled, 1 = direct connections, 2-3 = deeper traversal). Default 1 provides module/symbol context automatically.`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),min_confidence:I.enum([`extracted`,`inferred`,`ambiguous`]).optional().describe(`Minimum confidence level for results: "extracted" (guaranteed correct from source code), "inferred" (LLM-derived), "ambiguous" (uncertain, needs verification). Lower values include more results.`),dedup:I.enum([`file`,`chunk`]).default(`chunk`).describe(`Deduplication mode: "chunk" (default, show all matching chunks) or "file" (collapse chunks from same file into single result with merged line ranges)`),workspaces:I.array(I.string()).optional().describe(`Cross-workspace search: partition names or folder basenames to include. Use ["*"] for all registered workspaces. Only works in user-level install mode.`)},annotations:d.annotations},async({query:e,limit:d,search_mode:f,content_type:p,source_type:m,origin:h,category:g,tags:_,min_score:v,min_confidence:y,graph_hops:b,max_tokens:x,dedup:S,workspaces:C})=>{let w=Date.now();try{let T={limit:d,minScore:v,contentType:p,sourceType:m,origin:h,category:g,tags:_},E,ee=!1,te=!1,D=``,ne=f!==`keyword`,re=$g(e,s);if(f===`keyword`)E=await n.ftsSearch(e,T),E=E.slice(0,d);else if(f===`semantic`)try{let r=await t.embedQuery(re);E=await n.search(r,T);let a=await i_(i,E[0]?.score??0,E,e,d);E=a.results,ee=a.triggered,te=a.cacheHit}catch(t){ne=!1,Zg.warn(`Embedder unavailable in semantic mode, falling back to FTS`,j(t)),E=await n.ftsSearch(e,{...T,limit:d}),D=`> _⚠️ Semantic search unavailable (embedder recovering). Showing keyword results instead._
3026
+ `)}`}]}}catch(e){return qg.error(`Restore failed`,j(e)),q(`INTERNAL`,`Restore failed: ${e instanceof Error?e.message:String(e)}`)}})}const Yg=/<\/?curated-context>/gi;function Xg(e){return e.replace(Yg,``)}function Zg(e){return`<curated-context>\n${Xg(e)}\n</curated-context>`}const Qg=k(`tools`);function $g(e,t,n,r){a(e,t,n);let i=e.memoryMetaGet(t);if(!i)return;let o=O(i,{...u,...r});o&&(l(e,t,o),m(e,t,n))}function e_(e,t){let n=[],r=A(),i=r?Fe(r):``;i&&n.push(`[project: ${i}]`);let a=t?Nn(t,`__context_boost`):void 0;return a&&n.push(`[focus: ${a.value}]`),n.length===0?e:`${n.join(` `)} ${e}`}function t_(e,t,n){return n?e:t===`curated`?e*1.2:e}function n_(e,t){return t?e:e.map(e=>({record:e.record,score:t_(e.score,e.record.origin,t)})).sort((e,t)=>t.score-e.score)}function r_(e,t){let n=e?Math.floor(e/Math.max(1,t)):96;return Math.max(40,Math.min(160,n))}function i_(e,t){let n=e.origin===`curated`?Zg(e.content):e.content,r=Vn(n,t);return{body:r,truncated:r!==n}}async function a_(e,t,n,r,i){if(!e||t>=e.config.fallbackThreshold&&n.length>0)return{results:n,triggered:!1,cacheHit:!1};let a=!1;try{let t=e.cache.get(r);return t?a=!0:(t=await e.client.search(r,i),t.length>0&&e.cache.set(r,t)),t.length>0?{results:mr(n,t,i).map(e=>({record:{id:`er:${e.sourcePath}`,content:e.content,sourcePath:e.source===`er`?`[ER] ${e.sourcePath}`:e.sourcePath,startLine:e.startLine??0,endLine:e.endLine??0,contentType:e.contentType??`documentation`,headingPath:e.headingPath,origin:e.source===`er`?`curated`:e.origin??`indexed`,category:e.category,tags:e.tags??[],chunkIndex:0,totalChunks:1,fileHash:``,indexedAt:new Date().toISOString(),version:1},score:e.score})),triggered:!0,cacheHit:a}:{results:n,triggered:!0,cacheHit:a}}catch(e){return Qg.warn(`ER fallback failed`,j(e)),{results:n,triggered:!0,cacheHit:a}}}function o_(e,t,n=60){let r=new Map,i=e[0]?.score||1,a=t[0]?.score||1;for(let t=0;t<e.length;t++){let a=e[t],o=a.score/i;r.set(a.record.id,{record:a.record,score:1/(n+t+1)*o})}for(let e=0;e<t.length;e++){let i=t[e],o=i.score/a,s=r.get(i.record.id);s?s.score+=1/(n+e+1)*o:r.set(i.record.id,{record:i.record,score:1/(n+e+1)*o})}return[...r.values()].sort((e,t)=>t.score-e.score).map(({record:e,score:t})=>({record:e,score:t*(n+1)}))}function s_(e,t){let n=t.toLowerCase().split(/\s+/).filter(e=>e.length>=2);return n.length<2?e:e.map(e=>{let t=e.record.content.toLowerCase();if(t.length>5e3)return e;let r=n.map(e=>{let n=[],r=t.indexOf(e);for(;r!==-1&&n.length<10;)n.push(r),r=t.indexOf(e,r+1);return n});if(r.some(e=>e.length===0))return e;let i=t.length;for(let e of r[0]){let t=e,a=e+n[0].length;for(let i=1;i<r.length;i++){let o=r[i][0],s=Math.abs(o-e);for(let t=1;t<r[i].length;t++){let n=Math.abs(r[i][t]-e);n<s&&(s=n,o=r[i][t])}t=Math.min(t,o),a=Math.max(a,o+n[i].length)}i=Math.min(i,a-t)}let a=1+.25/(1+i/200);return{record:e.record,score:e.score*a}}).sort((e,t)=>t.score-e.score)}function c_(e){if(e.length<=1)return e;let t=new Set;return e.filter(e=>{let n=e.record.contentHash;return n?t.has(n)?!1:(t.add(n),!0):!0})}function l_(e,t,n=8){let r=new Set(t.toLowerCase().split(/\s+/).filter(e=>e.length>=2)),i=new Map,a=e.length;for(let t of e){let e=t.record.content.split(/[^a-zA-Z0-9_]+/).filter(e=>e.length>=3&&!u_.has(e.toLowerCase())),n=new Set;for(let t of e){let e=t.toLowerCase();/[_A-Z]/.test(t)&&i.set(`__id__${e}`,1),n.has(e)||(n.add(e),i.set(e,(i.get(e)??0)+1))}}let o=[];for(let[e,t]of i){if(e.startsWith(`__id__`)||r.has(e)||t>a*.8)continue;let n=Math.log(a/t),s=+!!i.has(`__id__${e}`),c=e.length>8?.5:0;o.push({term:e,score:n+s+c})}return o.sort((e,t)=>t.score-e.score).slice(0,n).map(e=>e.term)}const u_=new Set(`the.and.for.are.but.not.you.all.can.had.her.was.one.our.out.has.have.from.this.that.with.they.been.said.each.which.their.will.other.about.many.then.them.these.some.would.make.like.into.could.time.very.when.come.just.know.take.people.also.back.after.only.more.than.over.such.import.export.const.function.return.true.false.null.undefined.string.number.boolean.void.type.interface`.split(`.`));async function d_(e,t){try{let n=await e.getStats();if(!n.lastIndexedAt)return;let r=new Date(n.lastIndexedAt).getTime(),i=Date.now(),a=[...new Set(t.map(e=>e.record.sourcePath))].filter(e=>!e.startsWith(`[ER]`)).slice(0,5);if(a.length===0)return;let o=0;for(let e of a)try{(await We(e)).mtimeMs>r&&o++}catch{o++}let s=Math.max(1,Math.ceil(a.length*.3)),c=0;for(let e of a)try{(await We(e)).mtimeMs>r+12e4&&c++}catch{c++}if(c>=s){let e=i-r,t=Math.floor(e/6e4),n=t<1?`<1 min`:`${t} min`;return`> ⚠️ **Index may be stale** — ${c}/${a.length} sampled files modified since last index (${n} ago). Use \`reindex\` to refresh.`}}catch{}}function f_(e,t,n,r,i,a,o,s,c,l,u){let d=U(`search`);e.registerTool(`search`,{title:d.title,description:`Search AI Kit for code, docs, and prior decisions. Default choice for discovery. Modes: hybrid (default), semantic, keyword. For multi-strategy precision queries use find; for a known file path use lookup.`,outputSchema:Ps,inputSchema:{query:I.string().max(5e3).describe(`Natural language search query`),limit:I.number().min(1).max(20).default(5).describe(`Maximum results to return`),search_mode:I.enum([`hybrid`,`semantic`,`keyword`]).default(`hybrid`).describe(`Search strategy: hybrid (vector + FTS + RRF fusion, default), semantic (vector only), keyword (FTS only)`),content_type:I.enum(me).optional().describe(`Filter by content type`),source_type:I.enum(ve).optional().describe(`Coarse filter: "source" (code only), "documentation" (md, curated), "test", "config". Overrides content_type if both set.`),origin:I.enum(_e).optional().describe(`Filter by knowledge origin`),category:I.string().optional().describe(`Filter by category (e.g., decisions, patterns, conventions)`),tags:I.array(I.string()).optional().describe(`Filter by exact tag membership (any supplied tag may match)`),min_score:I.number().min(0).max(1).default(.25).describe(`Minimum similarity score`),graph_hops:I.number().min(0).max(3).default(1).describe(`Number of graph hops to augment results with connected entities (0 = disabled, 1 = direct connections, 2-3 = deeper traversal). Default 1 provides module/symbol context automatically.`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),min_confidence:I.enum([`extracted`,`inferred`,`ambiguous`]).optional().describe(`Minimum confidence level for results: "extracted" (guaranteed correct from source code), "inferred" (LLM-derived), "ambiguous" (uncertain, needs verification). Lower values include more results.`),dedup:I.enum([`file`,`chunk`]).default(`chunk`).describe(`Deduplication mode: "chunk" (default, show all matching chunks) or "file" (collapse chunks from same file into single result with merged line ranges)`),workspaces:I.array(I.string()).optional().describe(`Cross-workspace search: partition names or folder basenames to include. Use ["*"] for all registered workspaces. Only works in user-level install mode.`)},annotations:d.annotations},async({query:e,limit:d,search_mode:f,content_type:p,source_type:m,origin:h,category:g,tags:_,min_score:v,min_confidence:y,graph_hops:b,max_tokens:x,dedup:S,workspaces:C})=>{let w=Date.now();try{let T={limit:d,minScore:v,contentType:p,sourceType:m,origin:h,category:g,tags:_},E,ee=!1,te=!1,D=``,ne=f!==`keyword`,re=e_(e,s);if(f===`keyword`)E=await n.ftsSearch(e,T),E=E.slice(0,d);else if(f===`semantic`)try{let r=await t.embedQuery(re);E=await n.search(r,T);let a=await a_(i,E[0]?.score??0,E,e,d);E=a.results,ee=a.triggered,te=a.cacheHit}catch(t){ne=!1,Qg.warn(`Embedder unavailable in semantic mode, falling back to FTS`,j(t)),E=await n.ftsSearch(e,{...T,limit:d}),D=`> _⚠️ Semantic search unavailable (embedder recovering). Showing keyword results instead._
3027
3027
 
3028
- `}else{let r=[],a=[];try{let i=await t.embedQuery(re),o=n.coarseSearch,s=o?o.bind(n):n.search.bind(n);[r,a]=await Promise.all([s(i,{...T,limit:d*2}),n.ftsSearch(e,{...T,limit:d*2}).catch(()=>[])])}catch(t){ne=!1,Zg.warn(`Embedder unavailable, falling back to FTS-only`,j(t)),a=await n.ftsSearch(e,{...T,limit:d*2}),D=`> _⚠️ Vector search unavailable (embedder recovering). Results from keyword search only._
3028
+ `}else{let r=[],a=[];try{let i=await t.embedQuery(re),o=n.coarseSearch,s=o?o.bind(n):n.search.bind(n);[r,a]=await Promise.all([s(i,{...T,limit:d*2}),n.ftsSearch(e,{...T,limit:d*2}).catch(()=>[])])}catch(t){ne=!1,Qg.warn(`Embedder unavailable, falling back to FTS-only`,j(t)),a=await n.ftsSearch(e,{...T,limit:d*2}),D=`> _⚠️ Vector search unavailable (embedder recovering). Results from keyword search only._
3029
3029
 
3030
- `}if(ne?r.length===0&&a.length>0?(E=a.slice(0,d),D=` (FTS-only: vector index rebuilding)`):E=a.length===0&&r.length>0?r.slice(0,d):a_(r,a).slice(0,d):E=a.slice(0,d),ne){let t=await i_(i,r[0]?.score??0,E,e,d);E=t.results,ee=t.triggered,te=t.cacheHit}}E=t_(E,h).slice(0,d),a&&a.recordSearch(e,ee,te),E.length>1&&(E=o_(E,e)),E=s_(E);let ie=``;if(C&&C.length>0){let n=pl(C,u);if(n.length>0){let{stores:r,closeAll:i}=await ml(n);try{let i;i=f===`keyword`||!ne?await gl(r,e,{...T,limit:d}):await hl(r,await t.embedQuery(e),{...T,limit:d});for(let e of i)E.push({record:{...e.record,sourcePath:`[${e.workspace}] ${e.record.sourcePath}`},score:e.score});E=E.sort((e,t)=>t.score-e.score).slice(0,d),ie=` + ${n.length} workspace(s)`}finally{await i()}}}if(S===`file`&&E.length>1){let e=new Map;for(let t of E){let n=t.record.sourcePath,r=e.get(n);r?(t.score>r.best.score&&(r.best=t),r.ranges.push({start:t.record.startLine,end:t.record.endLine})):e.set(n,{best:t,ranges:[{start:t.record.startLine,end:t.record.endLine}]})}E=[...e.values()].sort((e,t)=>t.best.score-e.best.score).map(({best:e,ranges:t})=>({record:{...e.record,content:t.length>1?`${e.record.content}\n\n_Matched ${t.length} sections: ${t.sort((e,t)=>e.start-t.start).map(e=>`L${e.start}-${e.end}`).join(`, `)}_`:e.record.content},score:e.score}))}if(E.length>1){let e=E[0].score,t=Math.max(e*.4,.1);E=E.filter(e=>e.score>=t)}let O={extracted:3,inferred:2,ambiguous:1};if(y){let e=O[y]??0;E=E.filter(t=>(t.record.confidence?O[t.record.confidence]??2:2)>=e)}if(E.length===0){if(o?.available)try{let r=(await o.createMessage({prompt:`The search query "${e}" returned 0 results in AI Kit code search. Suggest ONE alternative search query that might find relevant results. Reply with ONLY the alternative query, nothing else.`,systemPrompt:`You are a search query optimizer for AI Kit code search. Generate a single alternative query.`,maxTokens:100,timeoutMs:1e4})).text.trim().split(`
3031
- `)[0].slice(0,500);if(r&&r!==e){let i=f===`keyword`||!ne?await n.ftsSearch(r,T):await n.search(await t.embedQuery(r),T);i.length>0&&(E=i,D=`> _Original query "${e}" returned 0 results. Auto-reformulated to "${r}"._\n\n`,Zg.debug(`Smart search fallback succeeded`,{originalQuery:e,altQuery:r,resultCount:i.length}))}}catch(e){Zg.debug(`Smart search fallback failed`,{error:String(e)})}if(E.length===0){let t=yt({text:`No results found for the given query.`,query:e,searchMode:f,limit:d,results:[],durationMs:Date.now()-w}),n=_l(t.summary);return{content:[{type:`text`,text:vl(t.summary,n)}],isError:!t.ok,structuredContent:{...t.data??{results:[],totalResults:0,searchMode:f,query:e},ref:n}}}}let ae,oe;if(b>0&&!r&&(oe="> **Note:** `graph_hops` was set but no graph store is available. Graph augmentation skipped."),b>0&&r)try{let e=await Lt(r,E.map(e=>({recordId:e.record.id,score:e.score,sourcePath:e.record.sourcePath})),{hops:b,maxPerHit:5});ae=new Map;for(let t of e)if(t.graphContext.nodes.length>0){let e=t.graphContext.nodes.slice(0,5).map(e=>` - **${e.name}** (${e.type})`).join(`
3030
+ `}if(ne?r.length===0&&a.length>0?(E=a.slice(0,d),D=` (FTS-only: vector index rebuilding)`):E=a.length===0&&r.length>0?r.slice(0,d):o_(r,a).slice(0,d):E=a.slice(0,d),ne){let t=await a_(i,r[0]?.score??0,E,e,d);E=t.results,ee=t.triggered,te=t.cacheHit}}E=n_(E,h).slice(0,d),a&&a.recordSearch(e,ee,te),E.length>1&&(E=s_(E,e)),E=c_(E);let ie=``;if(C&&C.length>0){let n=ml(C,u);if(n.length>0){let{stores:r,closeAll:i}=await hl(n);try{let i;i=f===`keyword`||!ne?await _l(r,e,{...T,limit:d}):await gl(r,await t.embedQuery(e),{...T,limit:d});for(let e of i)E.push({record:{...e.record,sourcePath:`[${e.workspace}] ${e.record.sourcePath}`},score:e.score});E=E.sort((e,t)=>t.score-e.score).slice(0,d),ie=` + ${n.length} workspace(s)`}finally{await i()}}}if(S===`file`&&E.length>1){let e=new Map;for(let t of E){let n=t.record.sourcePath,r=e.get(n);r?(t.score>r.best.score&&(r.best=t),r.ranges.push({start:t.record.startLine,end:t.record.endLine})):e.set(n,{best:t,ranges:[{start:t.record.startLine,end:t.record.endLine}]})}E=[...e.values()].sort((e,t)=>t.best.score-e.best.score).map(({best:e,ranges:t})=>({record:{...e.record,content:t.length>1?`${e.record.content}\n\n_Matched ${t.length} sections: ${t.sort((e,t)=>e.start-t.start).map(e=>`L${e.start}-${e.end}`).join(`, `)}_`:e.record.content},score:e.score}))}if(E.length>1){let e=E[0].score,t=Math.max(e*.4,.1);E=E.filter(e=>e.score>=t)}let O={extracted:3,inferred:2,ambiguous:1};if(y){let e=O[y]??0;E=E.filter(t=>(t.record.confidence?O[t.record.confidence]??2:2)>=e)}if(E.length===0){if(o?.available)try{let r=(await o.createMessage({prompt:`The search query "${e}" returned 0 results in AI Kit code search. Suggest ONE alternative search query that might find relevant results. Reply with ONLY the alternative query, nothing else.`,systemPrompt:`You are a search query optimizer for AI Kit code search. Generate a single alternative query.`,maxTokens:100,timeoutMs:1e4})).text.trim().split(`
3031
+ `)[0].slice(0,500);if(r&&r!==e){let i=f===`keyword`||!ne?await n.ftsSearch(r,T):await n.search(await t.embedQuery(r),T);i.length>0&&(E=i,D=`> _Original query "${e}" returned 0 results. Auto-reformulated to "${r}"._\n\n`,Qg.debug(`Smart search fallback succeeded`,{originalQuery:e,altQuery:r,resultCount:i.length}))}}catch(e){Qg.debug(`Smart search fallback failed`,{error:String(e)})}if(E.length===0){let t=yt({text:`No results found for the given query.`,query:e,searchMode:f,limit:d,results:[],durationMs:Date.now()-w}),n=vl(t.summary);return{content:[{type:`text`,text:yl(t.summary,n)}],isError:!t.ok,structuredContent:{...t.data??{results:[],totalResults:0,searchMode:f,query:e},ref:n}}}}let ae,oe;if(b>0&&!r&&(oe="> **Note:** `graph_hops` was set but no graph store is available. Graph augmentation skipped."),b>0&&r)try{let e=await Lt(r,E.map(e=>({recordId:e.record.id,score:e.score,sourcePath:e.record.sourcePath})),{hops:b,maxPerHit:5});ae=new Map;for(let t of e)if(t.graphContext.nodes.length>0){let e=t.graphContext.nodes.slice(0,5).map(e=>` - **${e.name}** (${e.type})`).join(`
3032
3032
  `),n=new Map;for(let e of t.graphContext.nodes)n.set(e.id,e.name);let r=t.graphContext.edges.slice(0,5).map(e=>` - ${n.get(e.fromId)??e.fromId} —[${e.type}]→ ${n.get(e.toId)??e.toId}`).join(`
3033
3033
  `),i=[`- **Graph Context** (${b} hop${b>1?`s`:``}):`];e&&i.push(` Entities:\n${e}`),r&&i.push(` Relationships:\n${r}`),ae.set(t.recordId,i.join(`
3034
- `))}}catch(e){Zg.warn(`Graph augmentation failed`,j(e)),oe=`> **Note:** Graph augmentation failed. Results shown without graph context.`}let se=Date.now();for(let e of E)if(e.record.origin===`curated`&&e.record.indexedAt){let t=se-new Date(e.record.indexedAt).getTime(),n=Math.max(0,t/864e5);e.score*=.95**n}if(E.sort((e,t)=>t.score-e.score),E=nt(E),s)for(let e of E){if(e.record.origin!==`curated`)continue;let t=nd(e.record.sourcePath);t&&Qg(s,t,c,l)}let ce=n_(x,E.length),le=!1,ue=E.map((e,t)=>{let n=e.record,r=`### Result ${t+1} (score: ${e.score.toFixed(3)})`,i=[`- **Source**: ${n.sourcePath}`,n.headingPath?`- **Section**: ${n.headingPath}`:null,`- **Type**: ${n.contentType}`,n.startLine?`- **Lines**: ${n.startLine}-${n.endLine}`:null,n.origin===`indexed`?null:`- **Origin**: ${n.origin}`,n.category?`- **Category**: ${n.category}`:null,n.tags?.length?`- **Tags**: ${n.tags.join(`, `)}`:null,ae?.get(n.id)??null].filter(Boolean).join(`
3035
- `),{body:a,truncated:o}=r_(n,ce);return le||=o,`${r}\n${i}\n\n${a}${o?`\n\n_Full content: use \`lookup\` on \`${n.sourcePath}\`._`:``}`}).join(`
3034
+ `))}}catch(e){Qg.warn(`Graph augmentation failed`,j(e)),oe=`> **Note:** Graph augmentation failed. Results shown without graph context.`}let se=Date.now();for(let e of E)if(e.record.origin===`curated`&&e.record.indexedAt){let t=se-new Date(e.record.indexedAt).getTime(),n=Math.max(0,t/864e5);e.score*=.95**n}if(E.sort((e,t)=>t.score-e.score),E=nt(E),s)for(let e of E){if(e.record.origin!==`curated`)continue;let t=rd(e.record.sourcePath);t&&$g(s,t,c,l)}let ce=r_(x,E.length),le=!1,ue=E.map((e,t)=>{let n=e.record,r=`### Result ${t+1} (score: ${e.score.toFixed(3)})`,i=[`- **Source**: ${n.sourcePath}`,n.headingPath?`- **Section**: ${n.headingPath}`:null,`- **Type**: ${n.contentType}`,n.startLine?`- **Lines**: ${n.startLine}-${n.endLine}`:null,n.origin===`indexed`?null:`- **Origin**: ${n.origin}`,n.category?`- **Category**: ${n.category}`:null,n.tags?.length?`- **Tags**: ${n.tags.join(`, `)}`:null,ae?.get(n.id)??null].filter(Boolean).join(`
3035
+ `),{body:a,truncated:o}=i_(n,ce);return le||=o,`${r}\n${i}\n\n${a}${o?`\n\n_Full content: use \`lookup\` on \`${n.sourcePath}\`._`:``}`}).join(`
3036
3036
 
3037
3037
  ---
3038
3038
 
3039
- `),de=(f===`hybrid`?`hybrid (vector + keyword RRF)`:f===`keyword`?`keyword (FTS)`:`semantic (vector)`)+ie,fe=c_(E,e),pe=fe.length>0?`\n_Distinctive terms: ${fe.map(e=>`\`${e}\``).join(`, `)}_`:``,me=await u_(n,E),he=[];if(E.length===0)he.push("`reindex` — no results found, index may be stale"),he.push("`find` — try federated search with glob/regex");else{let e=E[0]?.record.sourcePath;e&&he.push(`\`lookup\` — see all chunks from \`${e}\``),he.push("`symbol` — resolve a specific symbol from the results"),he.push("`compact` — compress a result file for focused reading"),he.push("reuse `ctxc_` ref above to avoid re-querying")}let ge=[oe?`${oe}\n\n`:``,me?`${me}\n\n`:``,ue,`\n\n---\n_Search mode: ${de} | ${E.length} results_${pe}`,`\n_Next: ${he.join(` | `)}_`],_e=D+ge.join(``),ve=!1;if(x){let e=Vn(_e,x);ve=e!==_e,_e=e}ve||=le;let ye=E.map(e=>({sourcePath:e.record.sourcePath,contentType:e.record.contentType,score:e.score,...e.record.headingPath?{headingPath:e.record.headingPath}:{},...e.record.startLine?{startLine:e.record.startLine}:{},...e.record.endLine?{endLine:e.record.endLine}:{},...e.record.origin===`indexed`?{}:{origin:e.record.origin},...e.record.category?{category:e.record.category}:{},...e.record.tags?.length?{tags:e.record.tags}:{}})),be=[oe,me].filter(e=>!!e),k=yt({text:_e,query:e,searchMode:f,limit:d,results:ye,durationMs:Date.now()-w,truncated:ve,caveats:be}),xe=_l(k.summary),Se=new Set,Ce=[];for(let e of E){if(e.record.origin!==`curated`||e.record.sourcePath.startsWith(`[`))continue;let t=nd(e.record.sourcePath);if(!t)continue;let n=ed(t,e.record.headingPath??t);n&&!Se.has(n.uri)&&(Se.add(n.uri),Ce.push(n))}return{content:[{type:`text`,text:vl(k.summary,xe)},...Ce],isError:!k.ok,structuredContent:{...k.data??{results:[],totalResults:0,searchMode:f,query:e},ref:xe}}}catch(t){Zg.error(`Search failed`,j(t));let n=yt({text:`Search failed: ${t instanceof Error?t.message:String(t)}`,query:e??``,searchMode:f??`hybrid`,limit:d,results:[],durationMs:Date.now()-w}),r=_l(n.summary);return{content:[{type:`text`,text:vl(n.summary,r)}],structuredContent:{...n.data??{results:[],totalResults:0,searchMode:f??`hybrid`,query:e??``},ref:r}}}})}const f_=1e4,p_={defaultTtlSeconds:300,defaultLeaseTtlMinutes:10,globalEnabled:!1};function m_(e){return e??p_}function h_(e,t){let n=e.trim();if(!n)throw Error(`${t} is required`);return n}function g_(e,t,n){let r=h_(e,t);if(r.length>n)throw Error(`${t} exceeds max length of ${n}`);return r}function __(e,t){if(!Number.isFinite(e)||e<=0)throw Error(`${t} must be greater than 0`);return Math.trunc(e)}function v_(e,t=!1,n){h_(e,`workspace`);let r=m_(n);if(!t)return e;if(!r.globalEnabled)throw Error(`Global signal scope is disabled`);return`__global__`}function y_(e,t,n){let r=m_(n),i=v_(t.workspace,t.global??!1,r),a=g_(t.key,`key`,500),o=g_(t.value,`value`,f_),s=t.agent?g_(t.agent,`agent`,500):void 0,c=__(t.ttlSeconds??r.defaultTtlSeconds,`ttlSeconds`);return e.signalPost(i,a,o,s,c)}function b_(e,t,n){let r=h_(t,`workspace`),i=g_(n,`key`,500);return e.signalGet(r,i)}function x_(e,t){let n=h_(t,`workspace`);return e.signalList(n)}function S_(e,t,n){let r=h_(t,`workspace`),i=n===void 0?void 0:g_(n,`key`,500);return e.signalClear(r,i)}function C_(e,t,n){let r=m_(n),i=g_(t.resource,`resource`,500),a=g_(t.holder,`holder`,500),o=h_(t.workspace,`workspace`),s=t.intent?g_(t.intent,`intent`,f_):void 0,c=__(t.ttlMinutes??r.defaultLeaseTtlMinutes,`ttlMinutes`);if(c>60)throw Error(`ttlMinutes exceeds max of 60`);let l=e.leaseAcquire(i,a,o,s,c),u=e.leaseGet(i,o);return u?{acquired:l,holder:u.holder,expiresAt:u.expiresAt}:{acquired:l}}function w_(e,t,n,r){let i=h_(t,`workspace`),a=g_(n,`resource`,500),o=g_(r,`holder`,500);return e.leaseRelease(a,o,i)}function T_(e,t){let n=h_(t,`workspace`);return e.leaseList(n)}const E_=k(`tools:session`);function $(e,t){if(e==null)throw Error(`${t} is required`)}function D_(e,t){if(!e||e.length===0)throw Error(`${t} are required`)}const O_={action:I.enum(`signal.post,signal.get,signal.list,signal.clear,signal.lease,signal.unlease,signal.leases,compliance.score,session.digest,stash.set,stash.get,stash.list,stash.delete,stash.clear,checkpoint.save,checkpoint.load,checkpoint.list,checkpoint.latest,checkpoint.diff,checkpoint.history,checkpoint.gc,workset.save,workset.get,workset.list,workset.delete,workset.add,workset.remove,lane.create,lane.list,lane.status,lane.diff,lane.merge,lane.discard,lane.lease,lane.unlease,lane.leases`.split(`,`)).describe(`Namespaced session action to perform (e.g. signal.post, stash.set, checkpoint.save)`),workspace:I.string().optional().describe(`Workspace identifier`),key:I.string().optional().describe(`Key (for signal get/post/clear, stash get/set/delete)`),value:I.string().optional().describe(`Value (for signal post, stash set)`),agent:I.string().optional().describe(`Agent identifier (for signal lease, lane lease)`),resource:I.string().optional().describe(`Resource path (for signal lease/unlease)`),holder:I.string().optional().describe(`Lease holder ID (for signal lease/unlease)`),intent:I.string().optional().describe(`What the holder plans to do`),ttl:I.number().optional().describe(`TTL (seconds for signals, minutes for leases)`),global:I.boolean().optional().describe(`Use global signal scope (default: false)`),last_n:I.number().min(1).max(500).optional().describe(`Max recent replay entries to score`),scope:I.enum([`tools`,`stash`,`all`]).optional().describe(`Digest scope`),since:I.string().optional().describe(`ISO timestamp — include activity after this time`),last:I.number().min(1).max(500).optional().describe(`Max replay entries to consider`),focus:I.string().optional().describe(`Focus query — prioritize entries matching this topic`),mode:I.enum([`deterministic`,`sampling`]).optional().describe(`Summary mode`),token_budget:I.number().min(100).max(8e3).optional().describe(`Target token budget`),persist:I.boolean().optional().describe(`Auto-save digest to stash for crash recovery`),label:I.string().optional().describe(`Checkpoint label / lane name / workset name`),data:I.string().max(5e5).optional().describe(`JSON object string for checkpoint save`),notes:I.string().max(1e4).optional().describe(`Optional notes for checkpoint save`),from_id:I.string().optional().describe(`Checkpoint ID to diff FROM`),to_id:I.string().optional().describe(`Checkpoint ID to diff TO`),limit:I.number().min(1).max(50).optional().describe(`Max entries to return`),keep_last:I.number().min(1).max(100).optional().describe(`Keep N recent checkpoints per label (gc)`),max_age_days:I.number().min(1).optional().describe(`Delete checkpoints older than N days (gc)`),dry_run:I.boolean().optional().describe(`Preview changes without deleting (gc)`),name:I.string().optional().describe(`Workset name or lane name`),files:I.array(I.string()).optional().describe(`File paths for workset/lane operations`),description:I.string().optional().describe(`Description (for workset save)`),id:I.string().optional().describe(`Lease ID (for lane unlease)`),symbols:I.array(I.string()).optional().describe(`Symbol names within files (for lane lease)`),ttl_minutes:I.number().optional().describe(`Lease TTL in minutes (for lane lease)`)};function k_(e,t,n){let r=U(`session`);e.registerTool(`session`,{title:r.title,description:`Unified session management — signals, compliance scoring, session digest, stash, checkpoints, worksets, and lanes. Use namespaced actions like signal.post, stash.set, checkpoint.save, workset.list, lane.create.`,inputSchema:O_,annotations:r.annotations},J(`session`,async e=>{try{let r=e.action,[i]=r.split(`.`);switch(i){case`signal`:return A_(t,r,e);case`compliance`:return j_(r,e);case`session`:return await M_(t,n,r,e);case`stash`:return N_(t,r,e);case`checkpoint`:return P_(t,r,e);case`workset`:return F_(r,e);case`lane`:return I_(r,e);default:throw Error(`Unknown session action namespace: ${i}`)}}catch(e){return E_.error(`Session operation failed`,j(e)),q(`INTERNAL`,`Session operation failed: ${e instanceof Error?e.message:String(e)}`)}}))}function A_(e,t,n){if(!e)throw Error(`stateStore is required for signal operations`);let{workspace:r,key:i,value:a,agent:o,resource:s,holder:c,intent:l,ttl:u,global:d}=n,f=p_;switch(t){case`signal.post`:{if($(i,`key`),a===void 0)throw Error(`value is required for signal.post`);let t=y_(e,{workspace:r,key:i,value:a,agent:o,ttlSeconds:u,global:d},f);return{content:[{type:`text`,text:JSON.stringify({id:t},null,2)}],structuredContent:{id:t}}}case`signal.get`:{$(i,`key`);let t=b_(e,v_(r,d??!1,f),i);return{content:[{type:`text`,text:t.length===0?`[]`:JSON.stringify(t,null,2)}],structuredContent:{signals:t}}}case`signal.list`:{let t=x_(e,v_(r,d??!1,f));return{content:[{type:`text`,text:t.length===0?`[]`:JSON.stringify(t,null,2)}],structuredContent:{signals:t}}}case`signal.clear`:{let t=S_(e,v_(r,d??!1,f),i);return{content:[{type:`text`,text:JSON.stringify({cleared:t},null,2)}],structuredContent:{cleared:t}}}case`signal.lease`:{$(s,`resource`),$(c,`holder`);let t=C_(e,{resource:s,holder:c,workspace:r,intent:l,ttlMinutes:u},f);return{content:[{type:`text`,text:JSON.stringify(t,null,2)}],structuredContent:t}}case`signal.unlease`:{$(s,`resource`),$(c,`holder`);let t=w_(e,r,s,c);return{content:[{type:`text`,text:JSON.stringify({released:t},null,2)}],structuredContent:{released:t}}}case`signal.leases`:{let t=T_(e,r);return{content:[{type:`text`,text:t.length===0?`[]`:JSON.stringify(t,null,2)}],structuredContent:{leases:t}}}default:throw Error(`Unknown signal action: ${t}`)}}function j_(e,t){switch(e){case`compliance.score`:{let e=t.last_n??50;return{content:[{type:`text`,text:L_(On(yn({last:e}),{lastN:e}))}]}}default:throw Error(`Unknown compliance action: ${e}`)}}async function M_(e,t,n,r){switch(n){case`session.digest`:{let n={scope:r.scope,since:r.since,last:r.last,focus:r.focus,mode:r.mode??`deterministic`,tokenBudget:r.token_budget??2e3,persist:r.persist??!0},i=e?{stateStore:e}:void 0;return{content:[{type:`text`,text:(n.mode===`sampling`&&t?.available?await An(n,async(e,n,r)=>(await t.createMessage({prompt:e,systemPrompt:n,maxTokens:r})).text,i):kn(n,i)).digest}]}}default:throw Error(`Unknown session action: ${n}`)}}function N_(e,t,n){if(!e)throw Error(`stateStore is required for stash operations`);let{key:r,value:i}=n;switch(t){case`stash.set`:{$(r,`key`);let t=Fn(e,r,z_(i??``));return{content:[{type:`text`,text:`Stored stash entry "${t.key}" (${t.type}) at ${t.storedAt}.`}]}}case`stash.get`:{$(r,`key`);let t=Nn(e,r);return{content:[{type:`text`,text:t?JSON.stringify(t):`Stash entry "${r}" not found.`}]}}case`stash.list`:{let t=Pn(e);return{content:[{type:`text`,text:t.length===0?`Stash is empty.`:t.map(e=>`- ${e.key} (${e.type}) — ${e.storedAt}`).join(`
3040
- `)}]}}case`stash.delete`:return $(r,`key`),{content:[{type:`text`,text:Mn(e,r)?`Deleted stash entry "${r}".`:`Stash entry "${r}" not found.`}]};case`stash.clear`:{let t=jn(e);return{content:[{type:`text`,text:`Cleared ${t} stash entr${t===1?`y`:`ies`}.`}]}}default:throw Error(`Unknown stash action: ${t}`)}}function P_(e,t,n){if(!e)throw Error(`stateStore is required for checkpoint operations`);let{label:r,data:i,notes:a,from_id:o,to_id:s,limit:c,keep_last:l,max_age_days:u,dry_run:d}=n;switch(t){case`checkpoint.save`:return $(r,`label`),{content:[{type:`text`,text:R_(ft(e,r,B_(i),{notes:a}))}]};case`checkpoint.load`:{$(r,`label`);let t=dt(e,r);return{content:[{type:`text`,text:t?R_(t):`Checkpoint "${r}" not found.`}]}}case`checkpoint.list`:{let t=ut(e,{label:r,limit:c});return{content:[{type:`text`,text:t.length===0?`No checkpoints saved.`:t.map(e=>`- ${e.id} — ${e.label} (${e.createdAt})`).join(`
3041
- `)}]}}case`checkpoint.latest`:{let t=lt(e,{label:r});return{content:[{type:`text`,text:t?R_(t):`No checkpoints saved.`}]}}case`checkpoint.diff`:{$(o,`from_id`),$(s,`to_id`);let t=ot(e,o,s);return t?{content:[{type:`text`,text:[`## Checkpoint Diff: ${o} → ${s}`,t.added.length?`**Added:** ${t.added.join(`, `)}`:``,t.removed.length?`**Removed:** ${t.removed.join(`, `)}`:``,t.modified.length?`**Modified:** ${t.modified.join(`, `)}`:``,!t.added.length&&!t.removed.length&&!t.modified.length?`No differences found.`:``].filter(Boolean).join(`
3039
+ `),de=(f===`hybrid`?`hybrid (vector + keyword RRF)`:f===`keyword`?`keyword (FTS)`:`semantic (vector)`)+ie,fe=l_(E,e),pe=fe.length>0?`\n_Distinctive terms: ${fe.map(e=>`\`${e}\``).join(`, `)}_`:``,me=await d_(n,E),he=[];if(E.length===0)he.push("`reindex` — no results found, index may be stale"),he.push("`find` — try federated search with glob/regex");else{let e=E[0]?.record.sourcePath;e&&he.push(`\`lookup\` — see all chunks from \`${e}\``),he.push("`symbol` — resolve a specific symbol from the results"),he.push("`compact` — compress a result file for focused reading"),he.push("reuse `ctxc_` ref above to avoid re-querying")}let ge=[oe?`${oe}\n\n`:``,me?`${me}\n\n`:``,ue,`\n\n---\n_Search mode: ${de} | ${E.length} results_${pe}`,`\n_Next: ${he.join(` | `)}_`],_e=D+ge.join(``),ve=!1;if(x){let e=Vn(_e,x);ve=e!==_e,_e=e}ve||=le;let ye=E.map(e=>({sourcePath:e.record.sourcePath,contentType:e.record.contentType,score:e.score,...e.record.headingPath?{headingPath:e.record.headingPath}:{},...e.record.startLine?{startLine:e.record.startLine}:{},...e.record.endLine?{endLine:e.record.endLine}:{},...e.record.origin===`indexed`?{}:{origin:e.record.origin},...e.record.category?{category:e.record.category}:{},...e.record.tags?.length?{tags:e.record.tags}:{}})),be=[oe,me].filter(e=>!!e),k=yt({text:_e,query:e,searchMode:f,limit:d,results:ye,durationMs:Date.now()-w,truncated:ve,caveats:be}),xe=vl(k.summary),Se=new Set,Ce=[];for(let e of E){if(e.record.origin!==`curated`||e.record.sourcePath.startsWith(`[`))continue;let t=rd(e.record.sourcePath);if(!t)continue;let n=td(t,e.record.headingPath??t);n&&!Se.has(n.uri)&&(Se.add(n.uri),Ce.push(n))}return{content:[{type:`text`,text:yl(k.summary,xe)},...Ce],isError:!k.ok,structuredContent:{...k.data??{results:[],totalResults:0,searchMode:f,query:e},ref:xe}}}catch(t){Qg.error(`Search failed`,j(t));let n=yt({text:`Search failed: ${t instanceof Error?t.message:String(t)}`,query:e??``,searchMode:f??`hybrid`,limit:d,results:[],durationMs:Date.now()-w}),r=vl(n.summary);return{content:[{type:`text`,text:yl(n.summary,r)}],structuredContent:{...n.data??{results:[],totalResults:0,searchMode:f??`hybrid`,query:e??``},ref:r}}}})}const p_=1e4,m_={defaultTtlSeconds:300,defaultLeaseTtlMinutes:10,globalEnabled:!1};function h_(e){return e??m_}function g_(e,t){let n=e.trim();if(!n)throw Error(`${t} is required`);return n}function __(e,t,n){let r=g_(e,t);if(r.length>n)throw Error(`${t} exceeds max length of ${n}`);return r}function v_(e,t){if(!Number.isFinite(e)||e<=0)throw Error(`${t} must be greater than 0`);return Math.trunc(e)}function y_(e,t=!1,n){g_(e,`workspace`);let r=h_(n);if(!t)return e;if(!r.globalEnabled)throw Error(`Global signal scope is disabled`);return`__global__`}function b_(e,t,n){let r=h_(n),i=y_(t.workspace,t.global??!1,r),a=__(t.key,`key`,500),o=__(t.value,`value`,p_),s=t.agent?__(t.agent,`agent`,500):void 0,c=v_(t.ttlSeconds??r.defaultTtlSeconds,`ttlSeconds`);return e.signalPost(i,a,o,s,c)}function x_(e,t,n){let r=g_(t,`workspace`),i=__(n,`key`,500);return e.signalGet(r,i)}function S_(e,t){let n=g_(t,`workspace`);return e.signalList(n)}function C_(e,t,n){let r=g_(t,`workspace`),i=n===void 0?void 0:__(n,`key`,500);return e.signalClear(r,i)}function w_(e,t,n){let r=h_(n),i=__(t.resource,`resource`,500),a=__(t.holder,`holder`,500),o=g_(t.workspace,`workspace`),s=t.intent?__(t.intent,`intent`,p_):void 0,c=v_(t.ttlMinutes??r.defaultLeaseTtlMinutes,`ttlMinutes`);if(c>60)throw Error(`ttlMinutes exceeds max of 60`);let l=e.leaseAcquire(i,a,o,s,c),u=e.leaseGet(i,o);return u?{acquired:l,holder:u.holder,expiresAt:u.expiresAt}:{acquired:l}}function T_(e,t,n,r){let i=g_(t,`workspace`),a=__(n,`resource`,500),o=__(r,`holder`,500);return e.leaseRelease(a,o,i)}function E_(e,t){let n=g_(t,`workspace`);return e.leaseList(n)}const D_=k(`tools:session`);function $(e,t){if(e==null)throw Error(`${t} is required`)}function O_(e,t){if(!e||e.length===0)throw Error(`${t} are required`)}const k_={action:I.enum(`signal.post,signal.get,signal.list,signal.clear,signal.lease,signal.unlease,signal.leases,compliance.score,session.digest,stash.set,stash.get,stash.list,stash.delete,stash.clear,checkpoint.save,checkpoint.load,checkpoint.list,checkpoint.latest,checkpoint.diff,checkpoint.history,checkpoint.gc,workset.save,workset.get,workset.list,workset.delete,workset.add,workset.remove,lane.create,lane.list,lane.status,lane.diff,lane.merge,lane.discard,lane.lease,lane.unlease,lane.leases`.split(`,`)).describe(`Namespaced session action to perform (e.g. signal.post, stash.set, checkpoint.save)`),workspace:I.string().optional().describe(`Workspace identifier`),key:I.string().optional().describe(`Key (for signal get/post/clear, stash get/set/delete)`),value:I.string().optional().describe(`Value (for signal post, stash set)`),agent:I.string().optional().describe(`Agent identifier (for signal lease, lane lease)`),resource:I.string().optional().describe(`Resource path (for signal lease/unlease)`),holder:I.string().optional().describe(`Lease holder ID (for signal lease/unlease)`),intent:I.string().optional().describe(`What the holder plans to do`),ttl:I.number().optional().describe(`TTL (seconds for signals, minutes for leases)`),global:I.boolean().optional().describe(`Use global signal scope (default: false)`),last_n:I.number().min(1).max(500).optional().describe(`Max recent replay entries to score`),scope:I.enum([`tools`,`stash`,`all`]).optional().describe(`Digest scope`),since:I.string().optional().describe(`ISO timestamp — include activity after this time`),last:I.number().min(1).max(500).optional().describe(`Max replay entries to consider`),focus:I.string().optional().describe(`Focus query — prioritize entries matching this topic`),mode:I.enum([`deterministic`,`sampling`]).optional().describe(`Summary mode`),token_budget:I.number().min(100).max(8e3).optional().describe(`Target token budget`),persist:I.boolean().optional().describe(`Auto-save digest to stash for crash recovery`),label:I.string().optional().describe(`Checkpoint label / lane name / workset name`),data:I.string().max(5e5).optional().describe(`JSON object string for checkpoint save`),notes:I.string().max(1e4).optional().describe(`Optional notes for checkpoint save`),from_id:I.string().optional().describe(`Checkpoint ID to diff FROM`),to_id:I.string().optional().describe(`Checkpoint ID to diff TO`),limit:I.number().min(1).max(50).optional().describe(`Max entries to return`),keep_last:I.number().min(1).max(100).optional().describe(`Keep N recent checkpoints per label (gc)`),max_age_days:I.number().min(1).optional().describe(`Delete checkpoints older than N days (gc)`),dry_run:I.boolean().optional().describe(`Preview changes without deleting (gc)`),name:I.string().optional().describe(`Workset name or lane name`),files:I.array(I.string()).optional().describe(`File paths for workset/lane operations`),description:I.string().optional().describe(`Description (for workset save)`),id:I.string().optional().describe(`Lease ID (for lane unlease)`),symbols:I.array(I.string()).optional().describe(`Symbol names within files (for lane lease)`),ttl_minutes:I.number().optional().describe(`Lease TTL in minutes (for lane lease)`)};function A_(e,t,n){let r=U(`session`);e.registerTool(`session`,{title:r.title,description:`Unified session management — signals, compliance scoring, session digest, stash, checkpoints, worksets, and lanes. Use namespaced actions like signal.post, stash.set, checkpoint.save, workset.list, lane.create.`,inputSchema:k_,annotations:r.annotations},J(`session`,async e=>{try{let r=e.action,[i]=r.split(`.`);switch(i){case`signal`:return j_(t,r,e);case`compliance`:return M_(r,e);case`session`:return await N_(t,n,r,e);case`stash`:return P_(t,r,e);case`checkpoint`:return F_(t,r,e);case`workset`:return I_(r,e);case`lane`:return L_(r,e);default:throw Error(`Unknown session action namespace: ${i}`)}}catch(e){return D_.error(`Session operation failed`,j(e)),q(`INTERNAL`,`Session operation failed: ${e instanceof Error?e.message:String(e)}`)}}))}function j_(e,t,n){if(!e)throw Error(`stateStore is required for signal operations`);let{workspace:r,key:i,value:a,agent:o,resource:s,holder:c,intent:l,ttl:u,global:d}=n,f=m_;switch(t){case`signal.post`:{if($(i,`key`),a===void 0)throw Error(`value is required for signal.post`);let t=b_(e,{workspace:r,key:i,value:a,agent:o,ttlSeconds:u,global:d},f);return{content:[{type:`text`,text:JSON.stringify({id:t},null,2)}],structuredContent:{id:t}}}case`signal.get`:{$(i,`key`);let t=x_(e,y_(r,d??!1,f),i);return{content:[{type:`text`,text:t.length===0?`[]`:JSON.stringify(t,null,2)}],structuredContent:{signals:t}}}case`signal.list`:{let t=S_(e,y_(r,d??!1,f));return{content:[{type:`text`,text:t.length===0?`[]`:JSON.stringify(t,null,2)}],structuredContent:{signals:t}}}case`signal.clear`:{let t=C_(e,y_(r,d??!1,f),i);return{content:[{type:`text`,text:JSON.stringify({cleared:t},null,2)}],structuredContent:{cleared:t}}}case`signal.lease`:{$(s,`resource`),$(c,`holder`);let t=w_(e,{resource:s,holder:c,workspace:r,intent:l,ttlMinutes:u},f);return{content:[{type:`text`,text:JSON.stringify(t,null,2)}],structuredContent:t}}case`signal.unlease`:{$(s,`resource`),$(c,`holder`);let t=T_(e,r,s,c);return{content:[{type:`text`,text:JSON.stringify({released:t},null,2)}],structuredContent:{released:t}}}case`signal.leases`:{let t=E_(e,r);return{content:[{type:`text`,text:t.length===0?`[]`:JSON.stringify(t,null,2)}],structuredContent:{leases:t}}}default:throw Error(`Unknown signal action: ${t}`)}}function M_(e,t){switch(e){case`compliance.score`:{let e=t.last_n??50;return{content:[{type:`text`,text:R_(On(yn({last:e}),{lastN:e}))}]}}default:throw Error(`Unknown compliance action: ${e}`)}}async function N_(e,t,n,r){switch(n){case`session.digest`:{let n={scope:r.scope,since:r.since,last:r.last,focus:r.focus,mode:r.mode??`deterministic`,tokenBudget:r.token_budget??2e3,persist:r.persist??!0},i=e?{stateStore:e}:void 0;return{content:[{type:`text`,text:(n.mode===`sampling`&&t?.available?await An(n,async(e,n,r)=>(await t.createMessage({prompt:e,systemPrompt:n,maxTokens:r})).text,i):kn(n,i)).digest}]}}default:throw Error(`Unknown session action: ${n}`)}}function P_(e,t,n){if(!e)throw Error(`stateStore is required for stash operations`);let{key:r,value:i}=n;switch(t){case`stash.set`:{$(r,`key`);let t=Fn(e,r,B_(i??``));return{content:[{type:`text`,text:`Stored stash entry "${t.key}" (${t.type}) at ${t.storedAt}.`}]}}case`stash.get`:{$(r,`key`);let t=Nn(e,r);return{content:[{type:`text`,text:t?JSON.stringify(t):`Stash entry "${r}" not found.`}]}}case`stash.list`:{let t=Pn(e);return{content:[{type:`text`,text:t.length===0?`Stash is empty.`:t.map(e=>`- ${e.key} (${e.type}) — ${e.storedAt}`).join(`
3040
+ `)}]}}case`stash.delete`:return $(r,`key`),{content:[{type:`text`,text:Mn(e,r)?`Deleted stash entry "${r}".`:`Stash entry "${r}" not found.`}]};case`stash.clear`:{let t=jn(e);return{content:[{type:`text`,text:`Cleared ${t} stash entr${t===1?`y`:`ies`}.`}]}}default:throw Error(`Unknown stash action: ${t}`)}}function F_(e,t,n){if(!e)throw Error(`stateStore is required for checkpoint operations`);let{label:r,data:i,notes:a,from_id:o,to_id:s,limit:c,keep_last:l,max_age_days:u,dry_run:d}=n;switch(t){case`checkpoint.save`:return $(r,`label`),{content:[{type:`text`,text:z_(ft(e,r,V_(i),{notes:a}))}]};case`checkpoint.load`:{$(r,`label`);let t=dt(e,r);return{content:[{type:`text`,text:t?z_(t):`Checkpoint "${r}" not found.`}]}}case`checkpoint.list`:{let t=ut(e,{label:r,limit:c});return{content:[{type:`text`,text:t.length===0?`No checkpoints saved.`:t.map(e=>`- ${e.id} — ${e.label} (${e.createdAt})`).join(`
3041
+ `)}]}}case`checkpoint.latest`:{let t=lt(e,{label:r});return{content:[{type:`text`,text:t?z_(t):`No checkpoints saved.`}]}}case`checkpoint.diff`:{$(o,`from_id`),$(s,`to_id`);let t=ot(e,o,s);return t?{content:[{type:`text`,text:[`## Checkpoint Diff: ${o} → ${s}`,t.added.length?`**Added:** ${t.added.join(`, `)}`:``,t.removed.length?`**Removed:** ${t.removed.join(`, `)}`:``,t.modified.length?`**Modified:** ${t.modified.join(`, `)}`:``,!t.added.length&&!t.removed.length&&!t.modified.length?`No differences found.`:``].filter(Boolean).join(`
3042
3042
  `)}]}:{content:[{type:`text`,text:`One or both checkpoints not found.`}]}}case`checkpoint.history`:{$(r,`label`);let t=ct(e,r,{limit:c??20});return t.length===0?{content:[{type:`text`,text:`No history found for "${r}".`}]}:{content:[{type:`text`,text:`## History: ${r}\n${t.map(e=>`- ${e.sha?e.sha.slice(0,8):e.id} — ${e.createdAt}${e.label?` (${e.label})`:``}`).join(`
3043
3043
  `)}`}]}}case`checkpoint.gc`:{let t=st(e,{label:r,keepLast:l,maxAgeDays:u,dryRun:d});return{content:[{type:`text`,text:[`## Checkpoint GC${t.labels.length?`: ${t.labels.join(`, `)}`:``}`,`Deleted: ${t.deleted}`,`Kept: ${t.kept}`,`Mode: ${d??!0?`dry-run`:`delete`}`,t.deletedIds.length?`Deleted IDs: ${t.deletedIds.join(`, `)}`:`Deleted IDs: none`].join(`
3044
- `)}]}}default:throw Error(`Unknown checkpoint action: ${t}`)}}function F_(e,t){let{name:n,files:r,description:i}=t;switch(e){case`workset.save`:{$(n,`name`),D_(r,`files`);let e=Tn(n,r,{description:i});return{content:[{type:`text`,text:`Saved workset "${e.name}" with ${e.files.length} files.`}]}}case`workset.get`:{$(n,`name`);let e=Ft(n);return e?{content:[{type:`text`,text:JSON.stringify(e)}]}:{content:[{type:`text`,text:`Workset "${n}" not found.`}]}}case`workset.list`:{let e=Jt();return e.length===0?{content:[{type:`text`,text:`No worksets.`}]}:{content:[{type:`text`,text:e.map(e=>`- **${e.name}** (${e.files.length} files) — ${e.description??`no description`}`).join(`
3045
- `)}]}}case`workset.delete`:return $(n,`name`),{content:[{type:`text`,text:St(n)?`Deleted workset "${n}".`:`Workset "${n}" not found.`}]};case`workset.add`:{$(n,`name`),D_(r,`files`);let e=et(n,r);return{content:[{type:`text`,text:`Added to workset "${e.name}": now ${e.files.length} files.`}]}}case`workset.remove`:{$(n,`name`),D_(r,`files`);let e=gn(n,r);return e?{content:[{type:`text`,text:`Removed from workset "${e.name}": now ${e.files.length} files.`}]}:{content:[{type:`text`,text:`Workset "${n}" not found.`}]}}default:throw Error(`Unknown workset action: ${e}`)}}function I_(e,t){let{name:n,files:r,agent:i,intent:a,id:o,symbols:s,ttl_minutes:c}=t;switch(e){case`lane.create`:{$(n,`name`),D_(r,`files`);let e=Bt(n,r);return{content:[{type:`text`,text:JSON.stringify(e)}]}}case`lane.list`:return{content:[{type:`text`,text:JSON.stringify(Ut())}]};case`lane.status`:return $(n,`name`),{content:[{type:`text`,text:JSON.stringify(Gt(n))}]};case`lane.diff`:return $(n,`name`),{content:[{type:`text`,text:JSON.stringify(Vt(n))}]};case`lane.merge`:return $(n,`name`),{content:[{type:`text`,text:JSON.stringify(Wt(n))}]};case`lane.discard`:return $(n,`name`),{content:[{type:`text`,text:JSON.stringify({discarded:Ht(n)})}]};case`lane.lease`:{$(i,`agent`),D_(r,`files`),$(a,`intent`);let e=$e({agent:i,files:r,intent:a,symbols:s,ttl_minutes:c});return{content:[{type:`text`,text:JSON.stringify(e)}]}}case`lane.unlease`:{$(o,`id`);let e=hn({id:o});return{content:[{type:`text`,text:JSON.stringify(e)}]}}case`lane.leases`:{let e=Kt({agent:i});return{content:[{type:`text`,text:JSON.stringify(e)}]}}default:throw Error(`Unknown lane action: ${e}`)}}function L_(e){let t=[`Compliance score: ${e.score}/100`,`Calls scored: ${e.totalCalls}`,`Summary: ${e.summary}`];if(e.violations.length===0)return`${t.join(`
3044
+ `)}]}}default:throw Error(`Unknown checkpoint action: ${t}`)}}function I_(e,t){let{name:n,files:r,description:i}=t;switch(e){case`workset.save`:{$(n,`name`),O_(r,`files`);let e=Tn(n,r,{description:i});return{content:[{type:`text`,text:`Saved workset "${e.name}" with ${e.files.length} files.`}]}}case`workset.get`:{$(n,`name`);let e=Ft(n);return e?{content:[{type:`text`,text:JSON.stringify(e)}]}:{content:[{type:`text`,text:`Workset "${n}" not found.`}]}}case`workset.list`:{let e=Jt();return e.length===0?{content:[{type:`text`,text:`No worksets.`}]}:{content:[{type:`text`,text:e.map(e=>`- **${e.name}** (${e.files.length} files) — ${e.description??`no description`}`).join(`
3045
+ `)}]}}case`workset.delete`:return $(n,`name`),{content:[{type:`text`,text:St(n)?`Deleted workset "${n}".`:`Workset "${n}" not found.`}]};case`workset.add`:{$(n,`name`),O_(r,`files`);let e=et(n,r);return{content:[{type:`text`,text:`Added to workset "${e.name}": now ${e.files.length} files.`}]}}case`workset.remove`:{$(n,`name`),O_(r,`files`);let e=gn(n,r);return e?{content:[{type:`text`,text:`Removed from workset "${e.name}": now ${e.files.length} files.`}]}:{content:[{type:`text`,text:`Workset "${n}" not found.`}]}}default:throw Error(`Unknown workset action: ${e}`)}}function L_(e,t){let{name:n,files:r,agent:i,intent:a,id:o,symbols:s,ttl_minutes:c}=t;switch(e){case`lane.create`:{$(n,`name`),O_(r,`files`);let e=Bt(n,r);return{content:[{type:`text`,text:JSON.stringify(e)}]}}case`lane.list`:return{content:[{type:`text`,text:JSON.stringify(Ut())}]};case`lane.status`:return $(n,`name`),{content:[{type:`text`,text:JSON.stringify(Gt(n))}]};case`lane.diff`:return $(n,`name`),{content:[{type:`text`,text:JSON.stringify(Vt(n))}]};case`lane.merge`:return $(n,`name`),{content:[{type:`text`,text:JSON.stringify(Wt(n))}]};case`lane.discard`:return $(n,`name`),{content:[{type:`text`,text:JSON.stringify({discarded:Ht(n)})}]};case`lane.lease`:{$(i,`agent`),O_(r,`files`),$(a,`intent`);let e=$e({agent:i,files:r,intent:a,symbols:s,ttl_minutes:c});return{content:[{type:`text`,text:JSON.stringify(e)}]}}case`lane.unlease`:{$(o,`id`);let e=hn({id:o});return{content:[{type:`text`,text:JSON.stringify(e)}]}}case`lane.leases`:{let e=Kt({agent:i});return{content:[{type:`text`,text:JSON.stringify(e)}]}}default:throw Error(`Unknown lane action: ${e}`)}}function R_(e){let t=[`Compliance score: ${e.score}/100`,`Calls scored: ${e.totalCalls}`,`Summary: ${e.summary}`];if(e.violations.length===0)return`${t.join(`
3046
3046
  `)}\n\nNo violations detected.`;let n=e.violations.map(e=>`- ${e.ruleId} | ${e.tool} | ${e.timestamp}\n ${e.rule}\n Suggestion: ${e.suggestion}`);return`${t.join(`
3047
3047
  `)}\n\nViolations:\n${n.join(`
3048
- `)}`}function R_(e){let t=[e.id,`Label: ${e.label}`,`Created: ${e.createdAt}`];return e.notes&&t.push(`Notes: ${e.notes}`),t.push(``,`Data:`,JSON.stringify(e.data)),t.join(`
3049
- `)}function z_(e){let t=e.trim();if(!t)return``;try{return JSON.parse(t)}catch{return e}}function B_(e){let t=e?.trim();if(!t)return{};let n;try{n=JSON.parse(t)}catch{throw Error(`data must be a valid JSON object string`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`data must be a JSON object string`);return n}let V_={totalInputChars:0,totalOutputChars:0,callCount:0,startTime:new Date().toISOString()};function H_(){return{...V_}}const U_=new Map,W_=[];function G_(){return Array.from(U_.entries()).map(([e,t])=>({tool:e,...t}))}function K_(){return W_}k(`auto-gc`);function q_(){let e=[...K_()];if(e.length<10)return 0;e.sort((e,t)=>e-t);let t=Math.floor(e.length*.95);return e[Math.min(t,e.length-1)]}function J_(){return{state:`warming`,p95:q_(),lastGcAt:null,gcCount:0,bufferSize:K_().length}}function Y_(e){if(!e||!Le(e))return;let t=F(e);if(Fe(t)!==pe.onboard)return;let n=Ie(t);if(Fe(Ie(n))===fe.workspaces)return Sn(n)}function X_(e){let t=[];if(e?.skillDir)t.push(e.skillDir);else if(e?.onboardDir){let n=Y_(e.onboardDir);n&&t.push(n)}return t}function Z_(e){return X_(e)[0]}const Q_=k(`tools`),$_=14400*1e3,ev={includePrelude:I.boolean().default(!1).describe(`Include session prelude with top lessons, conventions, and last checkpoint`)};function tv(e,t,n,r=15e3){let i,a=new Promise(e=>{i=setTimeout(()=>{Q_.warn(`Status sub-operation "${n}" timed out after ${r}ms`),e({value:t,timedOut:!0})},r)});return Promise.race([e.then(e=>(clearTimeout(i),{value:e,timedOut:!1}),e=>(clearTimeout(i),Q_.warn(`Status sub-operation "${n}" failed: ${e instanceof Error?e.message:String(e)}`),{value:t,timedOut:!1})),a])}function nv(e){return e.onboarded?e.onboardFreshness===`stale`||e.onboardFreshness===`unknown`?{kind:`update_onboard`,reason:`Onboard context is not fresh. Run onboard({ path: ".", update: true }) before relying on package map or architecture context.`,command:`onboard({ path: ".", update: true })`}:e.indexStale?{kind:`reindex`,reason:`Index stale. Run reindex() to update.`}:e.contextPressure>70?{kind:`handoff`,reason:`Context pressure high. Consider session handoff.`}:{kind:`proceed`,reason:`Ready to work.`}:{kind:`onboard`,reason:`Index not initialized. Run onboard({ path: "." }) first.`}}function rv(){let e=lr.get(),t=cr.get();if(e)return`- **Tree-sitter (WASM)**: ✅ Available (${t.grammarCount} grammars, dir: ${t.wasmDir})`;let n=t.pathsChecked.length?t.pathsChecked.map(e=>` ${e.exists?`✓`:`✗`} ${e.path}`).join(`
3048
+ `)}`}function z_(e){let t=[e.id,`Label: ${e.label}`,`Created: ${e.createdAt}`];return e.notes&&t.push(`Notes: ${e.notes}`),t.push(``,`Data:`,JSON.stringify(e.data)),t.join(`
3049
+ `)}function B_(e){let t=e.trim();if(!t)return``;try{return JSON.parse(t)}catch{return e}}function V_(e){let t=e?.trim();if(!t)return{};let n;try{n=JSON.parse(t)}catch{throw Error(`data must be a valid JSON object string`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`data must be a JSON object string`);return n}let H_={totalInputChars:0,totalOutputChars:0,callCount:0,startTime:new Date().toISOString()};function U_(){return{...H_}}const W_=new Map,G_=[];function K_(){return Array.from(W_.entries()).map(([e,t])=>({tool:e,...t}))}function q_(){return G_}k(`auto-gc`);function J_(){let e=[...q_()];if(e.length<10)return 0;e.sort((e,t)=>e-t);let t=Math.floor(e.length*.95);return e[Math.min(t,e.length-1)]}function Y_(){return{state:`warming`,p95:J_(),lastGcAt:null,gcCount:0,bufferSize:q_().length}}function X_(e){if(!e||!Le(e))return;let t=F(e);if(Fe(t)!==pe.onboard)return;let n=Ie(t);if(Fe(Ie(n))===fe.workspaces)return Sn(n)}function Z_(e){let t=[];if(e?.skillDir)t.push(e.skillDir);else if(e?.onboardDir){let n=X_(e.onboardDir);n&&t.push(n)}return t}function Q_(e){return Z_(e)[0]}const $_=k(`tools`),ev=14400*1e3,tv={includePrelude:I.boolean().default(!1).describe(`Include session prelude with top lessons, conventions, and last checkpoint`)};function nv(e,t,n,r=15e3){let i,a=new Promise(e=>{i=setTimeout(()=>{$_.warn(`Status sub-operation "${n}" timed out after ${r}ms`),e({value:t,timedOut:!0})},r)});return Promise.race([e.then(e=>(clearTimeout(i),{value:e,timedOut:!1}),e=>(clearTimeout(i),$_.warn(`Status sub-operation "${n}" failed: ${e instanceof Error?e.message:String(e)}`),{value:t,timedOut:!1})),a])}function rv(e){return e.onboarded?e.onboardFreshness===`stale`||e.onboardFreshness===`unknown`?{kind:`update_onboard`,reason:`Onboard context is not fresh. Run onboard({ path: ".", update: true }) before relying on package map or architecture context.`,command:`onboard({ path: ".", update: true })`}:e.indexStale?{kind:`reindex`,reason:`Index stale. Run reindex() to update.`}:e.contextPressure>70?{kind:`handoff`,reason:`Context pressure high. Consider session handoff.`}:{kind:`proceed`,reason:`Ready to work.`}:{kind:`onboard`,reason:`Index not initialized. Run onboard({ path: "." }) first.`}}function iv(){let e=ur.get(),t=lr.get();if(e)return`- **Tree-sitter (WASM)**: ✅ Available (${t.grammarCount} grammars, dir: ${t.wasmDir})`;let n=t.pathsChecked.length?t.pathsChecked.map(e=>` ${e.exists?`✓`:`✗`} ${e.path}`).join(`
3050
3050
  `):` none`,r=t.healAttempted?` Auto-heal: ${t.healSuccess?`✓ succeeded`:`✗ failed (${t.healError??`unknown`})`}`:` Auto-heal: not attempted`;return[`- **Tree-sitter (WASM)**: ⚠ Unavailable (regex fallback)`,` Reason: ${t.reason||`unknown`}`,` Paths checked:`,n,r,` OS: ${t.os} ${t.arch} | Node: ${t.nodeVersion}`,` Fix: Reinstall package or run vendor:wasm script`].join(`
3051
- `)}const iv=5*6e4;let av=null,ov=null;function sv(e,t,n,r){let i=Math.min(e/2e4,1),a=Math.min((t+n)/5e4,1),o=Math.min(r/200,1);return Math.round(i*40+a*35+o*25)}function cv(){let e=Date.now();if(av&&e-av.ts<iv)return av.value;try{let t=F(Yn(),`.copilot`,`.aikit-scaffold.json`);if(!M(t))return av={value:null,ts:e},null;let n=JSON.parse(N(t,`utf-8`)).version??null;return av={value:n,ts:e},n}catch{return av={value:null,ts:e},null}}function lv(){let e=Date.now();if(ov&&e-ov.ts<iv)return ov.value;try{let t=F(process.cwd(),`.github`,`.aikit-scaffold.json`);if(!M(t))return ov={value:null,ts:e},null;let n=JSON.parse(N(t,`utf-8`)).version??null;return ov={value:n,ts:e},n}catch{return ov={value:null,ts:e},null}}function uv(e){let t=U(`status`);e.registerTool(`status`,{title:t.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:ev,annotations:t.annotations},J(`status`,async()=>{let e=C(),t=cv(),n=lv(),r=t!=null&&t!==e,i=n!=null&&n!==e,a=[`## AI Kit Status`,``,`⏳ **AI Kit is initializing** — index stats will be available shortly.`,``,`### Runtime`,`- **Tree-sitter (WASM)**: ${lr.get()?`✅ Available (AST analysis)`:`⚠ Unavailable (regex fallback)`}`,``,`### Version`,`- **Server**: ${e}`,`- **Scaffold (user)**: ${t??`not installed`}`,`- **Scaffold (workspace)**: ${n??`not installed`}`];if(r||i){let o=ne(),s=[];r&&s.push(`user scaffold v${t}`),i&&s.push(`workspace scaffold v${n}`);let c=s.join(`, `);o.state===`success`?a.push(``,`### ✅ Upgrade Applied`,`- Server v${e} — ${c} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):o.state===`pending`?a.push(``,`### ⏳ Upgrade In Progress`,`- Server v${e} ≠ ${c}`,`- Auto-upgrade is running in the background…`):o.state===`failed`?(re(),a.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${e} ≠ ${c}`,`- Error: ${o.error??`unknown`}`)):(re(),a.push(``,`### ⬆ Upgrade Available`,`- Server v${e} ≠ ${c}`,`- Auto-upgrade triggered — check again shortly.`))}let o={totalRecords:0,totalFiles:0,lastIndexedAt:null,onboarded:!1,onboardDir:``,contentTypes:{},wasmAvailable:!!lr.get(),wasmDiagnostics:cr.get(),graphStats:null,curatedCount:0,serverVersion:e,scaffoldVersion:t??null,workspaceScaffoldVersion:n??null,upgradeAvailable:r||i,contextPressure:0,nextAction:nv({onboarded:!1,indexStale:!1,contextPressure:0})};return{content:[{type:`text`,text:a.join(`
3052
- `)}],structuredContent:o}}))}function dv(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){let g=U(`status`);e.registerTool(`status`,{title:g.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:ev,annotations:g.annotations},J(`status`,async({includePrelude:e=!1})=>{let g=[];try{let[_,v]=await Promise.all([tv(t.getStats(),{totalRecords:0,totalFiles:0,lastIndexedAt:null,contentTypeBreakdown:{}},`store.getStats`),tv(t.listSourcePaths(),[],`store.listSourcePaths`)]),y=_.value;_.timedOut&&g.push(`⚠ Index stats timed out — values may be incomplete`);let b=v.value;v.timedOut&&g.push(`⚠ File listing timed out`);let x=b.filter(e=>!e.startsWith(`.ai/curated/context/auto-`)&&!e.startsWith(`.ai/curated/workflow/auto-`)&&!e.includes(`node_modules/`)&&!e.startsWith(`.git/`)),S=b.length-x.length,w=null,T=0,E=[`## AI Kit Status`,``,`- **Total Records**: ${y.totalRecords}`,`- **Total Files**: ${y.totalFiles}`,`- **Last Indexed**: ${y.lastIndexedAt??`Never`}`,``,`### Content Types`,...Object.entries(y.contentTypeBreakdown).map(([e,t])=>`- ${e}: ${t}`),``,`### Indexed Files`,...x.slice(0,50).map(e=>`- ${e}`),x.length>50?`\n... and ${x.length-50} more files`:``,S>0?`\n_(${S} internal/auto-curated files hidden — use \`find\` to explore them)_`:``];if(n)try{let e=await tv(n.getStats(),{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}},`graphStore.getStats`);if(e.timedOut)g.push(`⚠ Graph stats timed out`),E.push(``,`### Knowledge Graph`,`- Graph stats timed out`);else{let t=e.value;w={nodes:t.nodeCount,edges:t.edgeCount},E.push(``,`### Knowledge Graph`,`- **Nodes**: ${t.nodeCount}`,`- **Edges**: ${t.edgeCount}`,...Object.entries(t.nodeTypes).map(([e,t])=>` - ${e}: ${t}`));try{let e=await tv(n.validate(),{valid:!0,danglingEdges:[],orphanNodes:[],stats:{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}}},`graphStore.validate`);if(!e.timedOut){let t=e.value;t.valid||E.push(`- **⚠ Integrity Issues**: ${t.danglingEdges.length} dangling edges`),t.orphanNodes.length>0&&E.push(`- **Orphan nodes**: ${t.orphanNodes.length}`)}}catch{}}}catch{E.push(``,`### Knowledge Graph`,`- Graph store unavailable`)}let te=a?.onboardDir??``,D=M(te),ie=i?.onboardComplete||D,O=ae(te,{lastIndexedAt:y.lastIndexedAt??null});if(E.push(``,`### Onboard Status`,ie?`- ✅ Complete${i?.onboardTimestamp?` (last: ${i.onboardTimestamp})`:``}`:'- ❌ Not run — call `onboard({ path: "." })` to analyze the codebase',`- **Onboard Directory**: \`${te}\``),O){let e=O.packageMap.totalPackages,t=O.freshness.status===`fresh`?`✅`:O.freshness.status===`stale`?`⚠`:`❔`;E.push(`- **Onboard context**: ${O.readInstruction}`,`- **Onboard freshness**: ${t} ${O.freshness.status} (${O.freshness.reason})`,e>0?`- **Package map**: ${e} packages/containers in \`${O.packageMap.sourcePath}\``:"- **Package map**: read `structure.md` and `dependencies.md` from the onboard directory")}if(r)try{let e=await tv(r.count(),0,`curated.count`);e.timedOut?(g.push(`⚠ Curated knowledge count timed out`),E.push(``,`### Curated Knowledge`,`- Listing timed out`)):(T=e.value,E.push(``,`### Curated Knowledge`,T>0?`- ${T} entries`:'- Empty — use `knowledge({ action: "remember", ... })` to persist decisions'))}catch{E.push(``,`### Curated Knowledge`,`- Unable to read curated entries`)}let oe=Un().filter(e=>e.status===`watching`);if(oe.length>0){E.push(``,`### File Watchers`,`- **Active**: ${oe.length}`);for(let e of oe){let t=e.pendingFiles?.length??0;if(E.push(` - \`${e.path}\`: ${e.eventCount} events, ${t} pending files`),t>0&&t<=10)for(let t of e.pendingFiles)E.push(` - \`${t}\``);else t>10&&E.push(` - ${t} pending files (use \`watch({ action: 'list' })\` for details)`)}}let se=sv(y.totalRecords,w?.nodes??0,w?.edges??0,T),ce=y.lastIndexedAt?new Date(y.lastIndexedAt).getTime():0,le=ce>0?Date.now()-ce:1/0,ue=ie&&le>1440*60*1e3,de=nv({onboarded:ie,onboardFreshness:O?.freshness.status??null,indexStale:ue,contextPressure:se});E.push(``),E.push(`## 📊 Context Pressure: ${se}/100`),se>=80?E.push(`⚠️ High pressure — consider pruning stale entries or compacting context.`):se>=50?E.push(`ℹ️ Moderate pressure — AI Kit memory is well-populated.`):E.push(`✅ Low pressure — plenty of headroom for more content.`);let fe=0;if(y.lastIndexedAt){fe=new Date(y.lastIndexedAt).getTime();let e=(Date.now()-fe)/(1e3*60*60);E.push(``,`### Index Freshness`,e>24?o===`smart`?`- ⚠ Last indexed ${Math.floor(e)}h ago — smart indexing will refresh automatically`:`- ⚠ Last indexed ${Math.floor(e)}h ago — may be stale. Run \`reindex({})\``:`- ✅ Last indexed ${e<1?`less than 1h`:`${Math.floor(e)}h`} ago`)}E.push(``,`### Next Action`,`- **${de.kind}**: ${de.reason}`);let pe=null,me=t;if(typeof me.getDiagnostics==`function`)try{let e=me.getDiagnostics();pe={adapterType:e.adapterType,vectorSearchEnabled:e.vectorSearchEnabled,ftsEnabled:e.ftsEnabled,degradedMode:e.degradedMode,dbPath:e.dbPath,dbSizeBytes:e.dbSizeBytes,embeddingDim:e.embeddingDim,vectorDtype:e.vectorDtype},E.push(``,`### Storage`,`- **Backend**: ${a?.store?.backend??`unknown`}`,`- **Adapter**: ${pe.adapterType}`,`- **Vector search**: ${pe.vectorSearchEnabled?`✅ enabled`:`⚠ disabled (FTS-only fallback)`}`,pe.dbPath?`- **DB**: ${pe.dbPath}`:``,pe.dbSizeBytes==null?``:`- **DB size**: ${(pe.dbSizeBytes/1024/1024).toFixed(2)} MB`,`- **Embedding dim**: ${pe.embeddingDim}`,`- **Vector dtype**: ${pe.vectorDtype}`)}catch{}if(o===`smart`)if(E.push(``,`### Smart Indexing`),s){let e=s();e?E.push(`- **Mode**: Smart (trickle)`,`- **Status**: ${e.running?`✅ Running`:`⏸ Stopped`}`,`- **Queue**: ${e.queueSize} files pending`,`- **Changed files**: ${e.changedFilesSize} detected`,`- **Interval**: ${Math.round(e.intervalMs/1e3)}s per batch of ${e.batchSize}`):E.push(`- **Mode**: Smart (trickle)`,`- **Status**: scheduler state unavailable (init may have failed)`)}else E.push(`- **Mode**: Smart (trickle) — scheduler state unavailable`);if(h)try{let e=h.getReport(),t=h.checkThresholds(),n=Object.entries(e.counters),r=Object.entries(e.gauges);if(n.length>0||r.length>0||t.length>0){if(E.push(``,`### 📊 Metrics`),n.length>0){E.push(`**Counters:**`);for(let[e,t]of n)E.push(`- \`${e}\`: ${t}`)}if(r.length>0){E.push(`**Gauges:**`);for(let[e,t]of r)E.push(`- \`${e}\`: ${t}`)}if(t.length>0){E.push(`**⚠ Threshold violations:**`);for(let e of t)E.push(`- ${e}`)}else(n.length>0||r.length>0)&&E.push(`- ✅ All thresholds within limits`)}}catch{E.push(``,`### 📊 Metrics`,`- Metrics unavailable`)}{let e=[];if(u)try{let t=u.getStats();e.push(`- **Decision Hooks**: ${t.count} registered${t.hooks.length>0?` (IDs: ${t.hooks.map(e=>e.id).join(`, `)})`:``}`)}catch{e.push(`- **Decision Hooks**: unavailable`)}else e.push(`- **Decision Hooks**: not configured`);if(d)try{let t=d.getStats(),n=Object.entries(t.byTool).map(([e,t])=>`${e}=${t}`).join(`, `);e.push(`- **Observations**: ${t.totalObservations} total, byTool: ${n||`none`}`)}catch{e.push(`- **Observations**: unavailable`)}else e.push(`- **Observations**: not configured`);if(f)try{let t=f.getStats(),n=Object.keys(t.byName);e.push(`- **Extractors**: ${t.count} registered${n.length>0?` (IDs: ${n.join(`, `)})`:``}`)}catch{e.push(`- **Extractors**: unavailable`)}else e.push(`- **Extractors**: not configured`);if(m)try{let t=m.getStats(),n=t.skillExists?t.isStale?`⚠ Stale`:`✅ Fresh`:`❌ No skill`;e.push(`- **Skill Compiler**: ${n}, version: ${t.skillVersion}, last compiled: ${t.lastCompiledAt?new Date(t.lastCompiledAt).toLocaleString():`Never`}`)}catch{e.push(`- **Skill Compiler**: unavailable`)}else e.push(`- **Skill Compiler**: not configured`);if(p)try{let t=p.getStats();e.push(`- **Promotion Engine**: ${t.held} candidates held, ${t.promoted} promoted, ${t.observedFacts} distinct facts tracked`)}catch{e.push(`- **Promotion Engine**: unavailable`)}else e.push(`- **Promotion Engine**: not configured`);E.push(``,`### 🧩 Feature Coverage`,...e)}let _e=0;{try{let e=a?.stateDir?P(a.stateDir,`stash`):null;if(e&&M(e)){let t=Me(e).mtimeMs;t>fe&&(fe=t)}}catch{}let e=[];if(r)try{let t=T>0?await r.list({limit:5,orderBy:`updated`,order:`desc`}):[];for(let e of t){let t=new Date(e.updated||e.created).getTime();t>fe&&(fe=t)}e.push(...t)}catch{}if(_e=fe>0?Date.now()-fe:0,_e>=$_){let t=Math.floor(_e/36e5);if(E.push(``,`### 🌅 Session Briefing`,`_${t}+ hours since last activity — here's what to pick up:_`,``),e.length>0){E.push(`**Recent decisions/notes:**`);for(let t of e)E.push(`- **${t.title}** (${t.category??`note`}) — ${(t.contentPreview??``).slice(0,80)}…`)}E.push(``,`**Suggested next steps:**`,'- `search({ query: "SESSION CHECKPOINT", origin: "curated" })` — find your last checkpoint',"- `restore({})` — resume from a saved checkpoint",'- `knowledge({ action: "list" })` — browse all stored knowledge')}}E.push(``,`### Runtime`,rv());let ve=ge.instance().getAll(),ye=ve.filter(e=>e.status!==`healthy`);if(ye.length>0){E.push(``,`### ⚠️ Subsystem Health`);for(let e of ye){let t=Math.round((Date.now()-e.since)/1e3);E.push(`- **${e.name}**: ${e.status} (${t}s ago${e.reason?` — ${e.reason}`:``})`)}}else ve.length>0&&E.push(``,`### ✅ Subsystem Health`,`- All ${ve.length} subsystems healthy`);let be=he.getAll();if(be.size>0){E.push(``,`### 🔌 Circuit Breakers`);for(let[e,t]of be){let n=t.getState(),r=`- **${e}**: ${n===`closed`?`🟢`:n===`open`?`🔴`:`🟡`} ${n}`;if(n===`open`){let e=t.remainingCooldownMs();r+=` (recovery in ${Math.ceil(e/1e3)}s)`}E.push(r)}}let k=cv(),xe=lv(),Se=C(),Ce=k!=null&&k!==Se,we=xe!=null&&xe!==Se;if(Ce||we){let e=ne(),t=[];Ce&&t.push(`user scaffold v${k}`),we&&t.push(`workspace scaffold v${xe}`);let n=t.join(`, `);e.state===`success`?E.push(``,`### ✅ Upgrade Applied`,`- Server v${Se} — ${n} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):e.state===`pending`?E.push(``,`### ⏳ Upgrade In Progress`,`- Server v${Se} ≠ ${n}`,`- Auto-upgrade is running in the background…`):e.state===`failed`?(re(),E.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${Se} ≠ ${n}`,`- Error: ${e.error??`unknown`}`)):(re(),E.push(``,`### ⬆ Upgrade Available`,`- Server v${Se} ≠ ${n}`,`- Auto-upgrade triggered — check again shortly.`))}g.length>0&&E.push(``,`### ⚠ Warnings`,...g.map(e=>`- ${e}`));let Te=G_();if(Te.length>0){let e=Te.sort((e,t)=>t.callCount-e.callCount);E.push(``,`### Tool Usage This Session`,``),E.push(`| Tool | Calls | Tokens In | Tokens Out | Errors | Avg Latency |`),E.push(`|------|-------|-----------|------------|--------|-------------|`);for(let t of e.slice(0,15)){let e=Math.round(t.totalInputChars/4),n=Math.round(t.totalOutputChars/4),r=Math.round(t.totalDurationMs/t.callCount);E.push(`| ${t.tool} | ${t.callCount} | ${e.toLocaleString()} | ${n.toLocaleString()} | ${t.errorCount} | ${r}ms |`)}}let A=H_();A.callCount>0&&(E.push(``),E.push(`### Session Token Usage`),E.push(`- Tool calls: ${A.callCount}`),E.push(`- Input chars: ${A.totalInputChars.toLocaleString()}`),E.push(`- Output chars: ${A.totalOutputChars.toLocaleString()}`),E.push(`- Est. input tokens: ${Math.round(A.totalInputChars/4).toLocaleString()}`),E.push(`- Est. total tokens: ${Math.round((A.totalInputChars+A.totalOutputChars)/4).toLocaleString()}`));let Ee=J_();if(Ee.bufferSize>=10){let e=Ee.state===`healthy`?`🟢`:Ee.state===`degraded`?`🔴`:`🟡`;E.push(``,`### Auto-GC: ${e} ${Ee.state}`),E.push(`- p95 latency: ${Ee.p95}ms | buffer: ${Ee.bufferSize} samples`),Ee.gcCount>0&&E.push(`- GC cycles triggered: ${Ee.gcCount}`)}if(l){let e=l.getStats();if(e.totalSubscribers>0){E.push(``,`### 🔌 Hooks (EventBus Subscribers)`),E.push(`- Total subscribers: ${e.totalSubscribers}`);for(let[t,n]of Object.entries(e.byEvent))E.push(` - ${t}: ${n} subscriber(s)`);for(let t of e.subscriptions)E.push(` - ${t.name} (${t.eventType}, ${t.policy})`);if(e.autoDisabled.length>0){E.push(``),E.push(` **Auto-disabled subscribers:**`);for(let t of e.autoDisabled)E.push(` - ${t.name} (${t.id}): ${t.reason}`)}}}if(u&&u.size>0){let e=u.getStats();E.push(``,`### 🪝 Decision Hooks`),E.push(`- Total hooks: ${e.count}`);for(let t of e.hooks){let e=t.decisionTypes.join(`, `);E.push(` - ${t.id} (order=${t.order}, policy=${t.failurePolicy}, types=[${e}])`)}}if(d){let e=d.getStats();E.push(``,`### 👁 Observations`),E.push(`- Total observations: ${e.totalObservations}`),E.push(` - Success: ${e.byError.success}, Error: ${e.byError.error}`),E.push(` - Artifacts stored: ${e.artifactCount}`),E.push(` - Truncations: ${e.truncationCount}`),E.push(` - Store entries: ${e.storeSize}`);let t=Object.entries(e.byOrigin);t.length>0&&E.push(` - By origin: ${t.map(([e,t])=>`${e}=${t}`).join(`, `)}`)}if(f){let e=f.getStats();E.push(``,`### 🧩 Extractors`),E.push(`- Total extractors: ${e.count}`);for(let[t,n]of Object.entries(e.byName))E.push(` - ${t} (${n.tools} tool(s), maxFacts: ${n.maxFactsPerEvent??`default`})`)}if(p){let e=p.getStats();if(E.push(``,`### 🏆 Promotion Engine`),E.push(`- Total evaluated: ${e.totalEvaluated}`),E.push(`- Promoted: ${e.promoted}`),E.push(`- Held: ${e.held}`),E.push(`- Rejected: ${e.rejected}`),E.push(`- Superseded: ${e.superseded}`),E.push(`- Decayed: ${e.decayed}`),E.push(`- Distinct facts tracked: ${e.observedFacts}`),e.recentDecisions.length>0){E.push(` Recent decisions:`);for(let t of e.recentDecisions.slice(-5))E.push(` - ${t.decision.status}: "${t.factTitle}" (${t.decision.reason.slice(0,80)})`)}}if(m){let e=m.getStats();if(E.push(``,`### 📋 Workspace Skill`),E.push(`- **Skill exists**: ${e.skillExists?`✅`:`❌`}`),E.push(`- **Stale**: ${e.isStale?`⚠ Yes — regenerating on next trigger`:`✅ Fresh`}`),E.push(`- **Last compiled**: ${e.lastCompiledAt?new Date(e.lastCompiledAt).toLocaleString():`Never`}`),E.push(`- **Version**: ${e.skillVersion}`),E.push(`- **Total compiles**: ${e.totalCompiles}`),e.failedCompiles>0&&E.push(`- **Failed compiles**: ${e.failedCompiles}`),e.skillSize>0&&E.push(`- **Skill size**: ${e.skillSize} bytes`),e.isCompiling&&E.push(`- ⏳ **Currently compiling**`),e.pendingRegeneration&&E.push(`- ⏳ **Regeneration pending**`),e.skillQuality&&E.push(`- **Quality**: ${e.skillQuality}`),e.skillQualityErrors&&e.skillQualityErrors.length>0){E.push(`- **Quality errors (${e.skillQualityErrors.length})**:`);for(let t of e.skillQualityErrors.slice(0,3))E.push(` - ${t}`)}if(e.skillQualityWarnings&&e.skillQualityWarnings.length>0){E.push(`- **Quality warnings (${e.skillQualityWarnings.length})**:`);for(let t of e.skillQualityWarnings.slice(0,3))E.push(` - ${t}`)}let t=m?.getWarnings()??[];if(t.length>0){E.push(`- **Compiler warnings (${t.length})**:`);for(let e of t.slice(0,5))E.push(` - ${e}`);t.length>5&&E.push(` - ... and ${t.length-5} more`)}E.push(``," Read `aikit://skill/SKILL.md` to load full workspace context.")}{let e=Pt();(e.cacheSize>0||e.refReuseCount>0)&&(E.push(``,`### 🔄 Ref Reuse`),E.push(`- **Refs stored**: ${e.refStoreCount}`),E.push(`- **Refs reused**: ${e.refReuseCount}`),e.refStaleCount>0&&E.push(`- **⚠ Stale refs detected**: ${e.refStaleCount}`),E.push(`- **Cache entries**: ${e.cacheSize}`))}let j=E.join(`
3053
- `),De=_e>=$_,Oe=X_(a),N=e||De?await ee(r,c,void 0,Oe.length>0?Oe:void 0,O):void 0,ke=oe.length>0?oe.map(e=>({id:e.id,path:e.path,eventCount:e.eventCount,pendingFiles:e.pendingFiles??[]})):void 0,Ae={totalRecords:y.totalRecords,totalFiles:y.totalFiles,lastIndexedAt:y.lastIndexedAt??null,onboarded:ie,onboardDir:te,onboard_context:O,contentTypes:y.contentTypeBreakdown,wasmAvailable:!!lr.get(),wasmDiagnostics:cr.get(),graphStats:w,curatedCount:T,serverVersion:Se,scaffoldVersion:k??null,workspaceScaffoldVersion:xe??null,upgradeAvailable:Ce||we,storeBackend:a?.store?.backend,storeDiagnostics:pe??null,contextPressure:se,nextAction:de,workspace_skill:(()=>{if(!m)return null;try{let e=m.getStats(),t=m?.getWarnings()??[],n=e.skillExists?e.skillQuality??`fallback`:`fallback`;return{exists:e.skillExists,version:e.skillVersion,fresh:!e.isStale,quality:n,warnings:t,uri:`aikit://skill/SKILL.md`,path:e.skillPath,read_instruction:`Read aikit://skill/SKILL.md before working in this repo for full workspace context.`,last_updated:e.lastCompiledAt?new Date(e.lastCompiledAt).toISOString():null,size:e.skillSize}}catch{return null}})(),skill_warnings:m?.getWarnings(m?.resolveActiveFlowSlug()??void 0)??[],watchers:ke,sessionTokens:{callCount:A.callCount,totalInputChars:A.totalInputChars,totalOutputChars:A.totalOutputChars,estInputTokens:Math.round(A.totalInputChars/4),estTotalTokens:Math.round((A.totalInputChars+A.totalOutputChars)/4),startTime:A.startTime},...N===void 0?{}:{prelude:N}};return{content:[{type:`text`,text:j+(o===`smart`?"\n\n---\n_Next: Use `search` to query indexed content or `graph({action:'find_nodes', name_pattern:'<top-level-module>'})` → then `graph({action:'neighbors', node_id})` for relationships. Smart indexing handles updates automatically._":"\n\n---\n_Next: Use `search` to query indexed content, `graph({action:'find_nodes', name_pattern:'<top-level-module>'})` → then `graph({action:'neighbors', node_id})` for relationships, or `reindex` to refresh the index._")}],structuredContent:Ae}}catch(e){return Q_.error(`Status failed`,j(e)),q(`INTERNAL`,`Status check failed: ${e instanceof Error?e.message:String(e)}`)}}))}const fv=k(`tools`);function pv(e){return e instanceof Error?(`code`in e?e.code:void 0)===`ENOENT`||e.message.startsWith(`File not found:`)||e.message.startsWith(`Path not found:`):!1}function mv(e){let t=U(`web_search`);e.registerTool(`web_search`,{title:t.title,description:`PREFERRED web search — fans out to multiple keyless providers (DuckDuckGo + Bing-HTML + Mojeek) by default, returning a deduplicated, consensus-ranked union within a 10s deadline. Optional providers (SearXNG, Google, Brave, Bing API) join the fan-out automatically when their env vars are set. Pass one query or multiple for parallel searching.`,inputSchema:{queries:I.array(I.string().max(2e3)).min(1).max(5).describe('Search queries (1–5). Single: `["react hooks"]`. Multiple searched in parallel.'),limit:I.number().min(1).max(20).default(5).describe(`Max results per query`),site:I.string().optional().describe(`Restrict to domain (e.g., "docs.aws.amazon.com")`),provider:I.enum([`multi`,`duckduckgo`,`bing-html`,`mojeek`,`searxng`,`google`,`brave`,`bing`]).optional().describe("Search provider. Defaults to env AIKIT_SEARCH_PROVIDER, then `multi` (fan-out). Single keyless: `duckduckgo`, `bing-html`, `mojeek`. Self-hosted: `searxng` (requires SEARXNG_URL). Keyed APIs: `google` (GOOGLE_API_KEY+GOOGLE_CSE_ID), `brave` (BRAVE_API_KEY), `bing` (BING_API_KEY). Missing keys auto-fall back to duckduckgo.")},annotations:t.annotations},J(`web_search`,async({queries:e,limit:t,site:n,provider:r})=>{let i=e,a=async e=>{let i=await Gn({query:e,limit:t,site:n,provider:r}),a=[`## Search: ${i.query} _(via ${i.provider})_`,``];if(i.results.length===0)a.push(`No results found.`);else for(let e of i.results)a.push(`### [${e.title}](${e.url})`,e.snippet,``);return a.join(`
3054
- `)};if(i.length===1)try{return{content:[{type:`text`,text:`${await a(i[0])}\n---\n_Next: Use \`web_fetch\` to read any of these pages in full._`}]}}catch(e){return fv.error(`Web search failed`,j(e)),q(`INTERNAL`,`Web search failed: ${e instanceof Error?e.message:String(e)}`)}let o=await Promise.allSettled(i.map(e=>a(e))),s=[],c=0;for(let e=0;e<o.length;e++){let t=o[e];if(t.status===`fulfilled`)s.push(t.value);else{c++;let n=t.reason instanceof Error?t.reason.message:String(t.reason);fv.error(`Web search failed`,{query:i[e],error:n}),s.push(`## ❌ Search failed: ${i[e]}\n\n${n}`)}}let l=`_Searched ${o.length-c}/${o.length} queries successfully._`;s.push(``,`---`,l,"_Next: Use `web_fetch` to read any of these pages in full._");let u=s.join(`
3051
+ `)}const av=5*6e4;let ov=null,sv=null;function cv(e,t,n,r){let i=Math.min(e/2e4,1),a=Math.min((t+n)/5e4,1),o=Math.min(r/200,1);return Math.round(i*40+a*35+o*25)}function lv(){let e=Date.now();if(ov&&e-ov.ts<av)return ov.value;try{let t=F(Xn(),`.copilot`,`.aikit-scaffold.json`);if(!M(t))return ov={value:null,ts:e},null;let n=JSON.parse(N(t,`utf-8`)).version??null;return ov={value:n,ts:e},n}catch{return ov={value:null,ts:e},null}}function uv(){let e=Date.now();if(sv&&e-sv.ts<av)return sv.value;try{let t=F(process.cwd(),`.github`,`.aikit-scaffold.json`);if(!M(t))return sv={value:null,ts:e},null;let n=JSON.parse(N(t,`utf-8`)).version??null;return sv={value:n,ts:e},n}catch{return sv={value:null,ts:e},null}}function dv(e){let t=U(`status`);e.registerTool(`status`,{title:t.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:tv,annotations:t.annotations},J(`status`,async()=>{let e=C(),t=lv(),n=uv(),r=t!=null&&t!==e,i=n!=null&&n!==e,a=[`## AI Kit Status`,``,`⏳ **AI Kit is initializing** — index stats will be available shortly.`,``,`### Runtime`,`- **Tree-sitter (WASM)**: ${ur.get()?`✅ Available (AST analysis)`:`⚠ Unavailable (regex fallback)`}`,``,`### Version`,`- **Server**: ${e}`,`- **Scaffold (user)**: ${t??`not installed`}`,`- **Scaffold (workspace)**: ${n??`not installed`}`];if(r||i){let o=ne(),s=[];r&&s.push(`user scaffold v${t}`),i&&s.push(`workspace scaffold v${n}`);let c=s.join(`, `);o.state===`success`?a.push(``,`### ✅ Upgrade Applied`,`- Server v${e} — ${c} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):o.state===`pending`?a.push(``,`### ⏳ Upgrade In Progress`,`- Server v${e} ≠ ${c}`,`- Auto-upgrade is running in the background…`):o.state===`failed`?(re(),a.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${e} ≠ ${c}`,`- Error: ${o.error??`unknown`}`)):(re(),a.push(``,`### ⬆ Upgrade Available`,`- Server v${e} ≠ ${c}`,`- Auto-upgrade triggered — check again shortly.`))}let o={totalRecords:0,totalFiles:0,lastIndexedAt:null,onboarded:!1,onboardDir:``,contentTypes:{},wasmAvailable:!!ur.get(),wasmDiagnostics:lr.get(),graphStats:null,curatedCount:0,serverVersion:e,scaffoldVersion:t??null,workspaceScaffoldVersion:n??null,upgradeAvailable:r||i,contextPressure:0,nextAction:rv({onboarded:!1,indexStale:!1,contextPressure:0})};return{content:[{type:`text`,text:a.join(`
3052
+ `)}],structuredContent:o}}))}function fv(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){let g=U(`status`);e.registerTool(`status`,{title:g.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:tv,annotations:g.annotations},J(`status`,async({includePrelude:e=!1})=>{let g=[];try{let[_,v]=await Promise.all([nv(t.getStats(),{totalRecords:0,totalFiles:0,lastIndexedAt:null,contentTypeBreakdown:{}},`store.getStats`),nv(t.listSourcePaths(),[],`store.listSourcePaths`)]),y=_.value;_.timedOut&&g.push(`⚠ Index stats timed out — values may be incomplete`);let b=v.value;v.timedOut&&g.push(`⚠ File listing timed out`);let x=b.filter(e=>!e.startsWith(`.ai/curated/context/auto-`)&&!e.startsWith(`.ai/curated/workflow/auto-`)&&!e.includes(`node_modules/`)&&!e.startsWith(`.git/`)),S=b.length-x.length,w=null,T=0,E=[`## AI Kit Status`,``,`- **Total Records**: ${y.totalRecords}`,`- **Total Files**: ${y.totalFiles}`,`- **Last Indexed**: ${y.lastIndexedAt??`Never`}`,``,`### Content Types`,...Object.entries(y.contentTypeBreakdown).map(([e,t])=>`- ${e}: ${t}`),``,`### Indexed Files`,...x.slice(0,50).map(e=>`- ${e}`),x.length>50?`\n... and ${x.length-50} more files`:``,S>0?`\n_(${S} internal/auto-curated files hidden — use \`find\` to explore them)_`:``];if(n)try{let e=await nv(n.getStats(),{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}},`graphStore.getStats`);if(e.timedOut)g.push(`⚠ Graph stats timed out`),E.push(``,`### Knowledge Graph`,`- Graph stats timed out`);else{let t=e.value;w={nodes:t.nodeCount,edges:t.edgeCount},E.push(``,`### Knowledge Graph`,`- **Nodes**: ${t.nodeCount}`,`- **Edges**: ${t.edgeCount}`,...Object.entries(t.nodeTypes).map(([e,t])=>` - ${e}: ${t}`));try{let e=await nv(n.validate(),{valid:!0,danglingEdges:[],orphanNodes:[],stats:{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}}},`graphStore.validate`);if(!e.timedOut){let t=e.value;t.valid||E.push(`- **⚠ Integrity Issues**: ${t.danglingEdges.length} dangling edges`),t.orphanNodes.length>0&&E.push(`- **Orphan nodes**: ${t.orphanNodes.length}`)}}catch{}}}catch{E.push(``,`### Knowledge Graph`,`- Graph store unavailable`)}let te=a?.onboardDir??``,D=M(te),ie=i?.onboardComplete||D,O=ae(te,{lastIndexedAt:y.lastIndexedAt??null});if(E.push(``,`### Onboard Status`,ie?`- ✅ Complete${i?.onboardTimestamp?` (last: ${i.onboardTimestamp})`:``}`:'- ❌ Not run — call `onboard({ path: "." })` to analyze the codebase',`- **Onboard Directory**: \`${te}\``),O){let e=O.packageMap.totalPackages,t=O.freshness.status===`fresh`?`✅`:O.freshness.status===`stale`?`⚠`:`❔`;E.push(`- **Onboard context**: ${O.readInstruction}`,`- **Onboard freshness**: ${t} ${O.freshness.status} (${O.freshness.reason})`,e>0?`- **Package map**: ${e} packages/containers in \`${O.packageMap.sourcePath}\``:"- **Package map**: read `structure.md` and `dependencies.md` from the onboard directory")}if(r)try{let e=await nv(r.count(),0,`curated.count`);e.timedOut?(g.push(`⚠ Curated knowledge count timed out`),E.push(``,`### Curated Knowledge`,`- Listing timed out`)):(T=e.value,E.push(``,`### Curated Knowledge`,T>0?`- ${T} entries`:'- Empty — use `knowledge({ action: "remember", ... })` to persist decisions'))}catch{E.push(``,`### Curated Knowledge`,`- Unable to read curated entries`)}let oe=Un().filter(e=>e.status===`watching`);if(oe.length>0){E.push(``,`### File Watchers`,`- **Active**: ${oe.length}`);for(let e of oe){let t=e.pendingFiles?.length??0;if(E.push(` - \`${e.path}\`: ${e.eventCount} events, ${t} pending files`),t>0&&t<=10)for(let t of e.pendingFiles)E.push(` - \`${t}\``);else t>10&&E.push(` - ${t} pending files (use \`watch({ action: 'list' })\` for details)`)}}let se=cv(y.totalRecords,w?.nodes??0,w?.edges??0,T),ce=y.lastIndexedAt?new Date(y.lastIndexedAt).getTime():0,le=ce>0?Date.now()-ce:1/0,ue=ie&&le>1440*60*1e3,de=rv({onboarded:ie,onboardFreshness:O?.freshness.status??null,indexStale:ue,contextPressure:se});E.push(``),E.push(`## 📊 Context Pressure: ${se}/100`),se>=80?E.push(`⚠️ High pressure — consider pruning stale entries or compacting context.`):se>=50?E.push(`ℹ️ Moderate pressure — AI Kit memory is well-populated.`):E.push(`✅ Low pressure — plenty of headroom for more content.`);let fe=0;if(y.lastIndexedAt){fe=new Date(y.lastIndexedAt).getTime();let e=(Date.now()-fe)/(1e3*60*60);E.push(``,`### Index Freshness`,e>24?o===`smart`?`- ⚠ Last indexed ${Math.floor(e)}h ago — smart indexing will refresh automatically`:`- ⚠ Last indexed ${Math.floor(e)}h ago — may be stale. Run \`reindex({})\``:`- ✅ Last indexed ${e<1?`less than 1h`:`${Math.floor(e)}h`} ago`)}E.push(``,`### Next Action`,`- **${de.kind}**: ${de.reason}`);let pe=null,me=t;if(typeof me.getDiagnostics==`function`)try{let e=me.getDiagnostics();pe={adapterType:e.adapterType,vectorSearchEnabled:e.vectorSearchEnabled,ftsEnabled:e.ftsEnabled,degradedMode:e.degradedMode,dbPath:e.dbPath,dbSizeBytes:e.dbSizeBytes,embeddingDim:e.embeddingDim,vectorDtype:e.vectorDtype},E.push(``,`### Storage`,`- **Backend**: ${a?.store?.backend??`unknown`}`,`- **Adapter**: ${pe.adapterType}`,`- **Vector search**: ${pe.vectorSearchEnabled?`✅ enabled`:`⚠ disabled (FTS-only fallback)`}`,pe.dbPath?`- **DB**: ${pe.dbPath}`:``,pe.dbSizeBytes==null?``:`- **DB size**: ${(pe.dbSizeBytes/1024/1024).toFixed(2)} MB`,`- **Embedding dim**: ${pe.embeddingDim}`,`- **Vector dtype**: ${pe.vectorDtype}`)}catch{}if(o===`smart`)if(E.push(``,`### Smart Indexing`),s){let e=s();e?E.push(`- **Mode**: Smart (trickle)`,`- **Status**: ${e.running?`✅ Running`:`⏸ Stopped`}`,`- **Queue**: ${e.queueSize} files pending`,`- **Changed files**: ${e.changedFilesSize} detected`,`- **Interval**: ${Math.round(e.intervalMs/1e3)}s per batch of ${e.batchSize}`):E.push(`- **Mode**: Smart (trickle)`,`- **Status**: scheduler state unavailable (init may have failed)`)}else E.push(`- **Mode**: Smart (trickle) — scheduler state unavailable`);if(h)try{let e=h.getReport(),t=h.checkThresholds(),n=Object.entries(e.counters),r=Object.entries(e.gauges);if(n.length>0||r.length>0||t.length>0){if(E.push(``,`### 📊 Metrics`),n.length>0){E.push(`**Counters:**`);for(let[e,t]of n)E.push(`- \`${e}\`: ${t}`)}if(r.length>0){E.push(`**Gauges:**`);for(let[e,t]of r)E.push(`- \`${e}\`: ${t}`)}if(t.length>0){E.push(`**⚠ Threshold violations:**`);for(let e of t)E.push(`- ${e}`)}else(n.length>0||r.length>0)&&E.push(`- ✅ All thresholds within limits`)}}catch{E.push(``,`### 📊 Metrics`,`- Metrics unavailable`)}{let e=[];if(u)try{let t=u.getStats();e.push(`- **Decision Hooks**: ${t.count} registered${t.hooks.length>0?` (IDs: ${t.hooks.map(e=>e.id).join(`, `)})`:``}`)}catch{e.push(`- **Decision Hooks**: unavailable`)}else e.push(`- **Decision Hooks**: not configured`);if(d)try{let t=d.getStats(),n=Object.entries(t.byTool).map(([e,t])=>`${e}=${t}`).join(`, `);e.push(`- **Observations**: ${t.totalObservations} total, byTool: ${n||`none`}`)}catch{e.push(`- **Observations**: unavailable`)}else e.push(`- **Observations**: not configured`);if(f)try{let t=f.getStats(),n=Object.keys(t.byName);e.push(`- **Extractors**: ${t.count} registered${n.length>0?` (IDs: ${n.join(`, `)})`:``}`)}catch{e.push(`- **Extractors**: unavailable`)}else e.push(`- **Extractors**: not configured`);if(m)try{let t=m.getStats(),n=t.skillExists?t.isStale?`⚠ Stale`:`✅ Fresh`:`❌ No skill`;e.push(`- **Skill Compiler**: ${n}, version: ${t.skillVersion}, last compiled: ${t.lastCompiledAt?new Date(t.lastCompiledAt).toLocaleString():`Never`}`)}catch{e.push(`- **Skill Compiler**: unavailable`)}else e.push(`- **Skill Compiler**: not configured`);if(p)try{let t=p.getStats();e.push(`- **Promotion Engine**: ${t.held} candidates held, ${t.promoted} promoted, ${t.observedFacts} distinct facts tracked`)}catch{e.push(`- **Promotion Engine**: unavailable`)}else e.push(`- **Promotion Engine**: not configured`);E.push(``,`### 🧩 Feature Coverage`,...e)}let _e=0;{try{let e=a?.stateDir?P(a.stateDir,`stash`):null;if(e&&M(e)){let t=Me(e).mtimeMs;t>fe&&(fe=t)}}catch{}let e=[];if(r)try{let t=T>0?await r.list({limit:5,orderBy:`updated`,order:`desc`}):[];for(let e of t){let t=new Date(e.updated||e.created).getTime();t>fe&&(fe=t)}e.push(...t)}catch{}if(_e=fe>0?Date.now()-fe:0,_e>=ev){let t=Math.floor(_e/36e5);if(E.push(``,`### 🌅 Session Briefing`,`_${t}+ hours since last activity — here's what to pick up:_`,``),e.length>0){E.push(`**Recent decisions/notes:**`);for(let t of e)E.push(`- **${t.title}** (${t.category??`note`}) — ${(t.contentPreview??``).slice(0,80)}…`)}E.push(``,`**Suggested next steps:**`,'- `search({ query: "SESSION CHECKPOINT", origin: "curated" })` — find your last checkpoint',"- `restore({})` — resume from a saved checkpoint",'- `knowledge({ action: "list" })` — browse all stored knowledge')}}E.push(``,`### Runtime`,iv());let ve=ge.instance().getAll(),ye=ve.filter(e=>e.status!==`healthy`);if(ye.length>0){E.push(``,`### ⚠️ Subsystem Health`);for(let e of ye){let t=Math.round((Date.now()-e.since)/1e3);E.push(`- **${e.name}**: ${e.status} (${t}s ago${e.reason?` — ${e.reason}`:``})`)}}else ve.length>0&&E.push(``,`### ✅ Subsystem Health`,`- All ${ve.length} subsystems healthy`);let be=he.getAll();if(be.size>0){E.push(``,`### 🔌 Circuit Breakers`);for(let[e,t]of be){let n=t.getState(),r=`- **${e}**: ${n===`closed`?`🟢`:n===`open`?`🔴`:`🟡`} ${n}`;if(n===`open`){let e=t.remainingCooldownMs();r+=` (recovery in ${Math.ceil(e/1e3)}s)`}E.push(r)}}let k=lv(),xe=uv(),Se=C(),Ce=k!=null&&k!==Se,we=xe!=null&&xe!==Se;if(Ce||we){let e=ne(),t=[];Ce&&t.push(`user scaffold v${k}`),we&&t.push(`workspace scaffold v${xe}`);let n=t.join(`, `);e.state===`success`?E.push(``,`### ✅ Upgrade Applied`,`- Server v${Se} — ${n} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):e.state===`pending`?E.push(``,`### ⏳ Upgrade In Progress`,`- Server v${Se} ≠ ${n}`,`- Auto-upgrade is running in the background…`):e.state===`failed`?(re(),E.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${Se} ≠ ${n}`,`- Error: ${e.error??`unknown`}`)):(re(),E.push(``,`### ⬆ Upgrade Available`,`- Server v${Se} ≠ ${n}`,`- Auto-upgrade triggered — check again shortly.`))}g.length>0&&E.push(``,`### ⚠ Warnings`,...g.map(e=>`- ${e}`));let Te=K_();if(Te.length>0){let e=Te.sort((e,t)=>t.callCount-e.callCount);E.push(``,`### Tool Usage This Session`,``),E.push(`| Tool | Calls | Tokens In | Tokens Out | Errors | Avg Latency |`),E.push(`|------|-------|-----------|------------|--------|-------------|`);for(let t of e.slice(0,15)){let e=Math.round(t.totalInputChars/4),n=Math.round(t.totalOutputChars/4),r=Math.round(t.totalDurationMs/t.callCount);E.push(`| ${t.tool} | ${t.callCount} | ${e.toLocaleString()} | ${n.toLocaleString()} | ${t.errorCount} | ${r}ms |`)}}let A=U_();A.callCount>0&&(E.push(``),E.push(`### Session Token Usage`),E.push(`- Tool calls: ${A.callCount}`),E.push(`- Input chars: ${A.totalInputChars.toLocaleString()}`),E.push(`- Output chars: ${A.totalOutputChars.toLocaleString()}`),E.push(`- Est. input tokens: ${Math.round(A.totalInputChars/4).toLocaleString()}`),E.push(`- Est. total tokens: ${Math.round((A.totalInputChars+A.totalOutputChars)/4).toLocaleString()}`));let Ee=Y_();if(Ee.bufferSize>=10){let e=Ee.state===`healthy`?`🟢`:Ee.state===`degraded`?`🔴`:`🟡`;E.push(``,`### Auto-GC: ${e} ${Ee.state}`),E.push(`- p95 latency: ${Ee.p95}ms | buffer: ${Ee.bufferSize} samples`),Ee.gcCount>0&&E.push(`- GC cycles triggered: ${Ee.gcCount}`)}if(l){let e=l.getStats();if(e.totalSubscribers>0){E.push(``,`### 🔌 Hooks (EventBus Subscribers)`),E.push(`- Total subscribers: ${e.totalSubscribers}`);for(let[t,n]of Object.entries(e.byEvent))E.push(` - ${t}: ${n} subscriber(s)`);for(let t of e.subscriptions)E.push(` - ${t.name} (${t.eventType}, ${t.policy})`);if(e.autoDisabled.length>0){E.push(``),E.push(` **Auto-disabled subscribers:**`);for(let t of e.autoDisabled)E.push(` - ${t.name} (${t.id}): ${t.reason}`)}}}if(u&&u.size>0){let e=u.getStats();E.push(``,`### 🪝 Decision Hooks`),E.push(`- Total hooks: ${e.count}`);for(let t of e.hooks){let e=t.decisionTypes.join(`, `);E.push(` - ${t.id} (order=${t.order}, policy=${t.failurePolicy}, types=[${e}])`)}}if(d){let e=d.getStats();E.push(``,`### 👁 Observations`),E.push(`- Total observations: ${e.totalObservations}`),E.push(` - Success: ${e.byError.success}, Error: ${e.byError.error}`),E.push(` - Artifacts stored: ${e.artifactCount}`),E.push(` - Truncations: ${e.truncationCount}`),E.push(` - Store entries: ${e.storeSize}`);let t=Object.entries(e.byOrigin);t.length>0&&E.push(` - By origin: ${t.map(([e,t])=>`${e}=${t}`).join(`, `)}`)}if(f){let e=f.getStats();E.push(``,`### 🧩 Extractors`),E.push(`- Total extractors: ${e.count}`);for(let[t,n]of Object.entries(e.byName))E.push(` - ${t} (${n.tools} tool(s), maxFacts: ${n.maxFactsPerEvent??`default`})`)}if(p){let e=p.getStats();if(E.push(``,`### 🏆 Promotion Engine`),E.push(`- Total evaluated: ${e.totalEvaluated}`),E.push(`- Promoted: ${e.promoted}`),E.push(`- Held: ${e.held}`),E.push(`- Rejected: ${e.rejected}`),E.push(`- Superseded: ${e.superseded}`),E.push(`- Decayed: ${e.decayed}`),E.push(`- Distinct facts tracked: ${e.observedFacts}`),e.recentDecisions.length>0){E.push(` Recent decisions:`);for(let t of e.recentDecisions.slice(-5))E.push(` - ${t.decision.status}: "${t.factTitle}" (${t.decision.reason.slice(0,80)})`)}}if(m){let e=m.getStats();if(E.push(``,`### 📋 Workspace Skill`),E.push(`- **Skill exists**: ${e.skillExists?`✅`:`❌`}`),E.push(`- **Stale**: ${e.isStale?`⚠ Yes — regenerating on next trigger`:`✅ Fresh`}`),E.push(`- **Last compiled**: ${e.lastCompiledAt?new Date(e.lastCompiledAt).toLocaleString():`Never`}`),E.push(`- **Version**: ${e.skillVersion}`),E.push(`- **Total compiles**: ${e.totalCompiles}`),e.failedCompiles>0&&E.push(`- **Failed compiles**: ${e.failedCompiles}`),e.skillSize>0&&E.push(`- **Skill size**: ${e.skillSize} bytes`),e.isCompiling&&E.push(`- ⏳ **Currently compiling**`),e.pendingRegeneration&&E.push(`- ⏳ **Regeneration pending**`),e.skillQuality&&E.push(`- **Quality**: ${e.skillQuality}`),e.skillQualityErrors&&e.skillQualityErrors.length>0){E.push(`- **Quality errors (${e.skillQualityErrors.length})**:`);for(let t of e.skillQualityErrors.slice(0,3))E.push(` - ${t}`)}if(e.skillQualityWarnings&&e.skillQualityWarnings.length>0){E.push(`- **Quality warnings (${e.skillQualityWarnings.length})**:`);for(let t of e.skillQualityWarnings.slice(0,3))E.push(` - ${t}`)}let t=m?.getWarnings()??[];if(t.length>0){E.push(`- **Compiler warnings (${t.length})**:`);for(let e of t.slice(0,5))E.push(` - ${e}`);t.length>5&&E.push(` - ... and ${t.length-5} more`)}E.push(``," Read `aikit://skill/SKILL.md` to load full workspace context.")}{let e=Pt();(e.cacheSize>0||e.refReuseCount>0)&&(E.push(``,`### 🔄 Ref Reuse`),E.push(`- **Refs stored**: ${e.refStoreCount}`),E.push(`- **Refs reused**: ${e.refReuseCount}`),e.refStaleCount>0&&E.push(`- **⚠ Stale refs detected**: ${e.refStaleCount}`),E.push(`- **Cache entries**: ${e.cacheSize}`))}let j=E.join(`
3053
+ `),De=_e>=ev,Oe=Z_(a),N=e||De?await ee(r,c,void 0,Oe.length>0?Oe:void 0,O):void 0,ke=oe.length>0?oe.map(e=>({id:e.id,path:e.path,eventCount:e.eventCount,pendingFiles:e.pendingFiles??[]})):void 0,Ae={totalRecords:y.totalRecords,totalFiles:y.totalFiles,lastIndexedAt:y.lastIndexedAt??null,onboarded:ie,onboardDir:te,onboard_context:O,contentTypes:y.contentTypeBreakdown,wasmAvailable:!!ur.get(),wasmDiagnostics:lr.get(),graphStats:w,curatedCount:T,serverVersion:Se,scaffoldVersion:k??null,workspaceScaffoldVersion:xe??null,upgradeAvailable:Ce||we,storeBackend:a?.store?.backend,storeDiagnostics:pe??null,contextPressure:se,nextAction:de,workspace_skill:(()=>{if(!m)return null;try{let e=m.getStats(),t=m?.getWarnings()??[],n=e.skillExists?e.skillQuality??`fallback`:`fallback`;return{exists:e.skillExists,version:e.skillVersion,fresh:!e.isStale,quality:n,warnings:t,uri:`aikit://skill/SKILL.md`,path:e.skillPath,read_instruction:`Read aikit://skill/SKILL.md before working in this repo for full workspace context.`,last_updated:e.lastCompiledAt?new Date(e.lastCompiledAt).toISOString():null,size:e.skillSize}}catch{return null}})(),skill_warnings:m?.getWarnings(m?.resolveActiveFlowSlug()??void 0)??[],watchers:ke,sessionTokens:{callCount:A.callCount,totalInputChars:A.totalInputChars,totalOutputChars:A.totalOutputChars,estInputTokens:Math.round(A.totalInputChars/4),estTotalTokens:Math.round((A.totalInputChars+A.totalOutputChars)/4),startTime:A.startTime},...N===void 0?{}:{prelude:N}};return{content:[{type:`text`,text:j+(o===`smart`?"\n\n---\n_Next: Use `search` to query indexed content or `graph({action:'find_nodes', name_pattern:'<top-level-module>'})` → then `graph({action:'neighbors', node_id})` for relationships. Smart indexing handles updates automatically._":"\n\n---\n_Next: Use `search` to query indexed content, `graph({action:'find_nodes', name_pattern:'<top-level-module>'})` → then `graph({action:'neighbors', node_id})` for relationships, or `reindex` to refresh the index._")}],structuredContent:Ae}}catch(e){return $_.error(`Status failed`,j(e)),q(`INTERNAL`,`Status check failed: ${e instanceof Error?e.message:String(e)}`)}}))}const pv=k(`tools`);function mv(e){return e instanceof Error?(`code`in e?e.code:void 0)===`ENOENT`||e.message.startsWith(`File not found:`)||e.message.startsWith(`Path not found:`):!1}function hv(e){let t=U(`web_search`);e.registerTool(`web_search`,{title:t.title,description:`PREFERRED web search — fans out to multiple keyless providers (DuckDuckGo + Bing-HTML + Mojeek) by default, returning a deduplicated, consensus-ranked union within a 10s deadline. Optional providers (SearXNG, Google, Brave, Bing API) join the fan-out automatically when their env vars are set. Pass one query or multiple for parallel searching.`,inputSchema:{queries:I.array(I.string().max(2e3)).min(1).max(5).describe('Search queries (1–5). Single: `["react hooks"]`. Multiple searched in parallel.'),limit:I.number().min(1).max(20).default(5).describe(`Max results per query`),site:I.string().optional().describe(`Restrict to domain (e.g., "docs.aws.amazon.com")`),provider:I.enum([`multi`,`duckduckgo`,`bing-html`,`mojeek`,`searxng`,`google`,`brave`,`bing`]).optional().describe("Search provider. Defaults to env AIKIT_SEARCH_PROVIDER, then `multi` (fan-out). Single keyless: `duckduckgo`, `bing-html`, `mojeek`. Self-hosted: `searxng` (requires SEARXNG_URL). Keyed APIs: `google` (GOOGLE_API_KEY+GOOGLE_CSE_ID), `brave` (BRAVE_API_KEY), `bing` (BING_API_KEY). Missing keys auto-fall back to duckduckgo.")},annotations:t.annotations},J(`web_search`,async({queries:e,limit:t,site:n,provider:r})=>{let i=e,a=async e=>{let i=await Gn({query:e,limit:t,site:n,provider:r}),a=[`## Search: ${i.query} _(via ${i.provider})_`,``];if(i.results.length===0)a.push(`No results found.`);else for(let e of i.results)a.push(`### [${e.title}](${e.url})`,e.snippet,``);return a.join(`
3054
+ `)};if(i.length===1)try{return{content:[{type:`text`,text:`${await a(i[0])}\n---\n_Next: Use \`web_fetch\` to read any of these pages in full._`}]}}catch(e){return pv.error(`Web search failed`,j(e)),q(`INTERNAL`,`Web search failed: ${e instanceof Error?e.message:String(e)}`)}let o=await Promise.allSettled(i.map(e=>a(e))),s=[],c=0;for(let e=0;e<o.length;e++){let t=o[e];if(t.status===`fulfilled`)s.push(t.value);else{c++;let n=t.reason instanceof Error?t.reason.message:String(t.reason);pv.error(`Web search failed`,{query:i[e],error:n}),s.push(`## ❌ Search failed: ${i[e]}\n\n${n}`)}}let l=`_Searched ${o.length-c}/${o.length} queries successfully._`;s.push(``,`---`,l,"_Next: Use `web_fetch` to read any of these pages in full._");let u=s.join(`
3055
3055
 
3056
- `);return c===o.length?q(`INTERNAL`,u):{content:[{type:`text`,text:u}]}}))}function hv(e){let t=U(`measure`);e.registerTool(`measure`,{title:t.title,description:`Measure code complexity, line counts, and function counts for a file or directory. Returns per-file metrics sorted by complexity.`,outputSchema:Ts,inputSchema:{path:I.string().describe(`File or directory path to measure`),extensions:I.array(I.string()).optional().describe(`File extensions to include (default: .ts,.tsx,.js,.jsx)`),include_hidden:I.boolean().optional().describe(`Include hidden trees such as .generated and .cache. Default false.`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`)},annotations:t.annotations},J(`measure`,async({path:e,extensions:t,include_hidden:n,max_tokens:r})=>{try{let i=await Yt({path:e,extensions:t,includeHidden:n}),a=[`## Code Metrics`,``,`**Files:** ${i.summary.totalFiles}`,`**Total lines:** ${i.summary.totalLines} (${i.summary.totalCodeLines} code)`,`**Functions:** ${i.summary.totalFunctions}`,`**Avg complexity:** ${i.summary.avgComplexity}`,`**Max complexity:** ${i.summary.maxComplexity.value} (${i.summary.maxComplexity.file})`,``,`### Top files by complexity`,``,`| File | Lines | Code | Complexity | Cognitive | Functions | Imports |`,`|------|-------|------|------------|-----------|-----------|---------|`];for(let e of i.files.slice(0,20)){let t=e.cognitiveComplexity===void 0?`—`:String(e.cognitiveComplexity);a.push(`| ${e.path} | ${e.lines.total} | ${e.lines.code} | ${e.complexity} | ${t} | ${e.functions} | ${e.imports} |`)}i.files.length>20&&a.push(``,`_...and ${i.files.length-20} more files_`);let o={summary:{totalFiles:i.summary.totalFiles,totalLines:i.summary.totalLines,totalCodeLines:i.summary.totalCodeLines,totalFunctions:i.summary.totalFunctions,avgComplexity:i.summary.avgComplexity,maxComplexity:{value:i.summary.maxComplexity.value,file:i.summary.maxComplexity.file}},files:i.files.map(e=>({path:e.path,lines:e.lines.total,code:e.lines.code,complexity:e.complexity,functions:e.functions}))};return{content:[{type:`text`,text:r?Vn(a.join(`
3056
+ `);return c===o.length?q(`INTERNAL`,u):{content:[{type:`text`,text:u}]}}))}function gv(e){let t=U(`measure`);e.registerTool(`measure`,{title:t.title,description:`Measure code complexity, line counts, and function counts for a file or directory. Returns per-file metrics sorted by complexity.`,outputSchema:Es,inputSchema:{path:I.string().describe(`File or directory path to measure`),extensions:I.array(I.string()).optional().describe(`File extensions to include (default: .ts,.tsx,.js,.jsx)`),include_hidden:I.boolean().optional().describe(`Include hidden trees such as .generated and .cache. Default false.`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`)},annotations:t.annotations},J(`measure`,async({path:e,extensions:t,include_hidden:n,max_tokens:r})=>{try{let i=await Yt({path:e,extensions:t,includeHidden:n}),a=[`## Code Metrics`,``,`**Files:** ${i.summary.totalFiles}`,`**Total lines:** ${i.summary.totalLines} (${i.summary.totalCodeLines} code)`,`**Functions:** ${i.summary.totalFunctions}`,`**Avg complexity:** ${i.summary.avgComplexity}`,`**Max complexity:** ${i.summary.maxComplexity.value} (${i.summary.maxComplexity.file})`,``,`### Top files by complexity`,``,`| File | Lines | Code | Complexity | Cognitive | Functions | Imports |`,`|------|-------|------|------------|-----------|-----------|---------|`];for(let e of i.files.slice(0,20)){let t=e.cognitiveComplexity===void 0?`—`:String(e.cognitiveComplexity);a.push(`| ${e.path} | ${e.lines.total} | ${e.lines.code} | ${e.complexity} | ${t} | ${e.functions} | ${e.imports} |`)}i.files.length>20&&a.push(``,`_...and ${i.files.length-20} more files_`);let o={summary:{totalFiles:i.summary.totalFiles,totalLines:i.summary.totalLines,totalCodeLines:i.summary.totalCodeLines,totalFunctions:i.summary.totalFunctions,avgComplexity:i.summary.avgComplexity,maxComplexity:{value:i.summary.maxComplexity.value,file:i.summary.maxComplexity.file}},files:i.files.map(e=>({path:e.path,lines:e.lines.total,code:e.lines.code,complexity:e.complexity,functions:e.functions}))};return{content:[{type:`text`,text:r?Vn(a.join(`
3057
3057
  `),r):a.join(`
3058
- `)}],structuredContent:o}}catch(e){return pv(e)?(fv.warn(`Measure failed`,{error:`File not found`}),q(`NOT_FOUND`,`File not found`)):(fv.error(`Measure failed`,j(e)),q(`INTERNAL`,`Measure failed: ${e instanceof Error?e.message:String(e)}`))}}))}function gv(e){let t=U(`env`);e.registerTool(`env`,{title:t.title,description:`Get system and runtime environment info. Sensitive env vars are redacted by default.`,outputSchema:Es,inputSchema:{include_env:I.boolean().default(!1).describe(`Include environment variables`),filter_env:I.string().optional().describe(`Filter env vars by name substring`),show_sensitive:I.boolean().default(!1).describe(`Show sensitive values (keys, tokens, etc.) — redacted by default`)},annotations:t.annotations},J(`env`,async({include_env:e,filter_env:t,show_sensitive:n})=>{let r=Tt({includeEnv:e,filterEnv:t,showSensitive:n}),i=[`## Environment`,``,`**Platform:** ${r.system.platform} ${r.system.arch}`,`**OS:** ${r.system.type} ${r.system.release}`,`**Host:** ${r.system.hostname}`,`**CPUs:** ${r.system.cpus}`,`**Memory:** ${r.system.memoryFreeGb}GB free / ${r.system.memoryTotalGb}GB total`,``,`**Node:** ${r.runtime.node}`,`**V8:** ${r.runtime.v8}`,`**CWD:** ${r.cwd}`];if(r.env){i.push(``,`### Environment Variables`,``);for(let[e,t]of Object.entries(r.env))i.push(`- \`${e}\`: ${t}`)}let a={platform:r.system.platform,arch:r.system.arch,nodeVersion:r.runtime.node,cwd:r.cwd,cpus:r.system.cpus,memoryFreeGb:r.system.memoryFreeGb,memoryTotalGb:r.system.memoryTotalGb};return{content:[{type:`text`,text:i.join(`
3059
- `)}],structuredContent:a}}))}const _v=k(`register-tools`);function vv(e){return t=>!e||e.has(t)}function yv(e){try{let t=P(e,`.flows`);if(!M(t))return null;let n=ke(t,{withFileTypes:!0});for(let e of n){if(!e.isDirectory())continue;let n=P(t,e.name,`meta.json`);if(M(n)&&JSON.parse(N(n,`utf-8`)).status===`active`)return e.name}}catch{return null}return null}let bv=null,xv=null;function Sv(){bv?.(),bv=null}function Cv(){return xv?.flush()??Promise.resolve()}function wv(e){let{server:t,aikit:n,config:r,elicitor:i,resourceNotifier:a,samplingClient:o,indexMode:s,getSmartState:c,getSmartScheduler:l,precomputedActiveTools:u}=e,d=new Do,f=r.sources[0]?.path??Ee(),p=be(f),m={activeSlug:null};m.activeSlug=yv(f);let h=new Ba(P(r.stateDir??``,`flow-context`),()=>m.activeSlug),g=new wa;g.register(di()),g.register(_a),g.register(Oi),g.register(na),g.register(vi),g.register(fi),g.register(pi),g.register(ma),g.register(hi),g.register(xa),g.register(ta(()=>m.activeSlug?{active:!0,slug:m.activeSlug}:null)),g.register(oa),g.register(ya),g.register(Ti),g.register(ia);let _=new Xa(void 0,n.stateStore),v=n.eventBus,y=Z_(r),b=y?new to(y,{debounceMs:5e3},v??void 0,n.curated,void 0,f):null;b&&b.compileNow(`startup`).catch(e=>{_v.warn(`Startup skill compile failed — will retry on next trigger`,{error:String(e)})});let x=new Da(g,n.curated,{},h,_,v??void 0,n.stateStore);xv=x;let S=u??bs(r,[...Fa,...Uo],Pa,Go(r)),C=vv(S),w=new Set([...S].filter(e=>!If.includes(e)&&!Ha.has(e))),T=new Ka;d.use(Jo(),{order:1,name:`structured-content-guard`}),d.use(za(Ra(r.tokenBudget)),{order:90,name:`compression`});let E=d.decisionHookRegistry;E.register({id:`search-budget`,order:10,scope:`search`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`budgetHint`],reason:`Enforce token budget on search results`,fn:()=>({type:`decision`,hookId:`search-budget`,decision:`allow`,reason:`Budget hook active`})}),E.register({id:`find-path-containment`,order:10,scope:`find`,timeoutMs:50,failurePolicy:`fail-closed`,decisionTypes:[`deny`],reason:`Validate find scope against workspace boundaries`,fn:()=>({type:`decision`,hookId:`find-path-containment`,decision:`allow`,reason:`Path permitted`})}),E.register({id:`knowledge-mutation-safety`,order:10,scope:`knowledge`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`deny`],reason:`Guard against unintended knowledge mutations`,fn:()=>({type:`decision`,hookId:`knowledge-mutation-safety`,decision:`allow`,reason:`Mutation permitted`})}),E.register({id:`check-scoped-run`,order:10,scope:`check`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log check run scope for audit`,fn:()=>({type:`decision`,hookId:`check-scoped-run`,decision:`allow`,reason:`Check run permitted`})}),E.register({id:`test-run-scoped`,order:10,scope:`test_run`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log test run scope for audit`,fn:()=>({type:`decision`,hookId:`test-run-scoped`,decision:`allow`,reason:`Test run permitted`})}),E.register({id:`onboard-path-correctness`,order:10,scope:`onboard`,timeoutMs:50,failurePolicy:`fail-closed`,decisionTypes:[`deny`],reason:`Validate onboard target path is valid and accessible`,fn:()=>({type:`decision`,hookId:`onboard-path-correctness`,decision:`allow`,reason:`Path valid`})}),E.register({id:`compact-budget-hints`,order:10,scope:`compact`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`budgetHint`],reason:`Enforce token budget on compact output`,fn:()=>({type:`decision`,hookId:`compact-budget-hints`,decision:`allow`,reason:`Budget hook active`})}),E.register({id:`flow-step-safety`,order:10,scope:`flow`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log flow step transitions`,fn:()=>({type:`decision`,hookId:`flow-step-safety`,decision:`allow`,reason:`Step permitted`})}),E.register({id:`present-transport-capability`,order:10,scope:`present`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Verify presentation transport is available`,fn:()=>({type:`decision`,hookId:`present-transport-capability`,decision:`allow`,reason:`Transport available`})});let ee=new Ao(r.metricThresholds);as(t,d,r.toolPrefix??``,n.eventBus,()=>{let e=r.sources[0]?.path??Ee();try{return be(e)}catch{return`partition:${qe(`sha256`).update(e).digest(`hex`).slice(0,8)}`}}),v&&(v.subscribe({id:`sub-auto-knowledge`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`args`in e)||!(`result`in e))return;let t=e;try{ee.incrementCounter(`tool.call`,{tool:t.toolName}),t.isError&&ee.incrementCounter(`tool.error`,{tool:t.toolName}),x.push({toolName:t.toolName,args:t.args,result:t.result,durationMs:t.durationMs,isError:t.isError,timestamp:new Date(t.timestamp).toISOString(),origin:t.origin,workspaceId:t.workspaceId,requestId:t.requestId})}catch{}},name:`auto-knowledge`}),v.subscribe({id:`sub-replay`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`args`in e)||!(`result`in e))return;let t=e;try{let{replayAppend:e}=await import(`../../tools/dist/index.js`),n=JSON.stringify(t.args),r=JSON.stringify(t.result);e({ts:new Date(t.timestamp).toISOString(),source:`mcp`,tool:t.toolName,input:n.slice(0,2e3),outputChars:r.length,inputChars:n.length,durationMs:t.durationMs,status:t.isError?`error`:`ok`,output:r.slice(0,2e3),traceId:t.requestId??``})}catch{}},name:`replay`}),v.subscribe({id:`sub-procedural`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`isError`in e))return;let t=e;try{w.has(t.toolName)&&T.record(t.toolName,!t.isError)}catch{}},name:`procedural-memory`}),v.subscribe({id:`sub-observations`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`result`in e))return;let t=e;try{let{ObservationEngine:e,DEFAULT_OBSERVATION_CONFIG:r}=await import(`./observations-Cri43dvk.js`),i=new e(n.stateStore,n.curated),{captureFrom:a}=r;a.includes(t.toolName)&&await i.processToolResult(t.toolName,t.result,{})}catch{}},name:`observation-capture`}),v.subscribe({id:`sub-knowledge-metrics`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`result`in e))return;let t=e;if(t.toolName===`knowledge`)try{let e=t.result,n=t.args?.action;(n===`remember`||n===`update`)&&(ee.incrementCounter(`fact.total`),(e?.status===`unchanged`||e?.result===`unchanged`)&&ee.incrementCounter(`fact.duplicate`))}catch{}},name:`knowledge-metrics`}),v.subscribe({id:`sub-session`,eventType:`session:start`,policy:`async`,handler:async e=>{let t=e,n={serverVersion:t.serverVersion,workspaceRoot:t.workspaceRoot,handoff:t.handoff?`${t.handoff.from} (session ${t.handoff.sessionId})`:void 0};_v.info(`Session started`,n)},name:`session-lifecycle`}),b&&(bv=b.subscribeToEventBus(v)));let te=[...S].filter(e=>Wo.has(e)?Ho.includes(e)?!!n.bridge:e===`er_update_policy`?!!n.policyStore:e===`er_evolve_review`?!!n.evolutionCollector:!1:!0),D={store:n.store,graphStore:n.graphStore,embedder:n.embedder},ne={onboardComplete:n.onboardComplete,onboardTimestamp:n.onboardTimestamp},re={search:[{name:`search`,register:()=>d_(t,n.embedder,n.store,n.graphStore,n.bridge,n.evolutionCollector,o,n.stateStore,r.memory?.retention,r.memory?.consolidation,p)},{name:`find`,register:()=>Cl(t,n.embedder,n.store)},{name:`symbol`,register:()=>wl(t,n.embedder,n.store,n.graphStore,D)},{name:`trace`,register:()=>Tl(t,n.embedder,n.store,n.graphStore,D)},{name:`scope_map`,register:()=>Sl(t,n.embedder,n.store,D)},{name:`file_summary`,register:()=>Ll(t,n.embedder,n.fileCache)}],analysis:[{name:`analyze`,register:()=>Mc(t,n.store,n.embedder)},{name:`blast_radius`,register:()=>Nc(t,n.store,n.embedder,n.graphStore,D)}],knowledge:[{name:`knowledge`,register:()=>Sf(t,n.curated,n.policyStore,n.evolutionCollector,a,void 0,n.stateStore,r.memory?.retention,r.memory?.supersession,r.memory?.consolidation,r.memory?.lessons,D,n.graphStore)},{name:`produce_knowledge`,register:()=>Vg(t,a)}],compression:[{name:`digest`,register:()=>Uu(t,n.embedder)}],forge:[{name:`forge_ground`,register:()=>Wu(t,n.embedder,n.store)},{name:`evidence_map`,register:()=>Hu(t)}],presentation:[{name:`present`,register:()=>zg(t,i)}],execution:[{name:`check`,register:()=>Al(t,D,r.tokenBudget)},{name:`test_run`,register:()=>Ml(t,D)},{name:`eval`,register:()=>jl(t)},{name:`audit`,register:()=>Rc(t,n.store,n.embedder)}],web:[{name:`browser`,register:()=>Qn(t,r)},{name:`web_fetch`,register:()=>$u(t)},{name:`web_search`,register:()=>mv(t)}],manipulation:[{name:`rename`,register:()=>Ef(t,r)},{name:`restore`,register:()=>qg(t)},{name:`codemod`,register:()=>Df(t,r)}],session:[{name:`session`,register:()=>k_(t,n.stateStore,o)}],git:[{name:`git`,register:()=>Ku(t)},{name:`parse_output`,register:()=>Nl(t)}],process:[{name:`process`,register:()=>Qu(t)},{name:`delegate`,register:()=>Pl(t,o)}],system:[{name:`config`,register:()=>dl(t,r)},{name:`status`,register:()=>dv(t,n.store,n.graphStore,n.curated,ne,r,s,c,n.stateStore,n.eventBus,d.decisionHookRegistry,d.getObservationCompressor(),g,_,b)},{name:`reindex`,register:()=>Ug(t,n.indexer,r,n.curated,n.store,a,s,n.eventBus)},{name:`onboard`,register:()=>ip(t,n.store,n.embedder,r,ne,D,o,a)},{name:`graph`,register:()=>Xu(t,n.graphStore)},{name:`replay`,register:()=>Gg(t)}],utilities:[{name:`measure`,register:()=>hv(t)},{name:`env`,register:()=>gv(t)}],queue:[{name:`queue`,register:()=>op(t)}],flow:[{name:`flow`,register:()=>Bu(t,r,{store:n.store?{search:async(e,t)=>(await n.store.ftsSearch(e,t)).map(e=>({content:e.record.content}))}:null,graphStore:n.graphStore,embedder:n.embedder,curated:n.curated??null,eventBus:n.eventBus??null,skillCompiler:b},e=>{m.activeSlug=e})}]};for(let[,e]of Object.entries(re))for(let{name:t,register:n}of e)C(t)&&n();n.bridge&&(C(`er_push`)&&Hc(t,n.bridge,n.evolutionCollector),C(`er_pull`)&&Uc(t,n.bridge),C(`er_sync_status`)&&Wc(t,n.bridge)),n.policyStore&&C(`er_update_policy`)&&lp(t,n.policyStore),n.evolutionCollector&&C(`er_evolve_review`)&&Ol(t,n.evolutionCollector),If.some(e=>C(e))&&Lf(t,r,te,n.onboardComplete),Vo(t,n.store,n.curated,y,n.eventBus,d.decisionHookRegistry,b)}function Tv(e,t,n){let r=vv(n);r(`check`)&&Al(e,void 0,t.tokenBudget),r(`eval`)&&jl(e),r(`test_run`)&&Ml(e),r(`parse_output`)&&Nl(e),r(`delegate`)&&Pl(e),r(`git`)&&Ku(e),r(`rename`)&&Ef(e,t),r(`codemod`)&&Df(e,t),r(`restore`)&&qg(e),r(`queue`)&&op(e),r(`process`)&&Qu(e),r(`web_fetch`)&&$u(e),If.some(e=>r(e))&&Lf(e,t,[...n??new Set(Fa)]),r(`evidence_map`)&&Hu(e),r(`present`)&&zg(e),r(`browser`)&&Qn(e,t),r(`produce_knowledge`)&&Vg(e),r(`replay`)&&Gg(e),r(`status`)&&uv(e),r(`flow`)&&Bu(e,t),r(`web_search`)&&mv(e),r(`measure`)&&hv(e),r(`env`)&&gv(e)}export{U as S,oo as _,vg as a,Pa as b,Vc as c,Jo as d,es as f,Do as g,Go as h,Tv as i,bs as l,Uo as m,Cv as n,Jf as o,Ko as p,wv as r,Zf as s,Sv as t,as as u,Fa as v,Ia as x,La as y};
3058
+ `)}],structuredContent:o}}catch(e){return mv(e)?(pv.warn(`Measure failed`,{error:`File not found`}),q(`NOT_FOUND`,`File not found`)):(pv.error(`Measure failed`,j(e)),q(`INTERNAL`,`Measure failed: ${e instanceof Error?e.message:String(e)}`))}}))}function _v(e){let t=U(`env`);e.registerTool(`env`,{title:t.title,description:`Get system and runtime environment info. Sensitive env vars are redacted by default.`,outputSchema:Ds,inputSchema:{include_env:I.boolean().default(!1).describe(`Include environment variables`),filter_env:I.string().optional().describe(`Filter env vars by name substring`),show_sensitive:I.boolean().default(!1).describe(`Show sensitive values (keys, tokens, etc.) — redacted by default`)},annotations:t.annotations},J(`env`,async({include_env:e,filter_env:t,show_sensitive:n})=>{let r=Tt({includeEnv:e,filterEnv:t,showSensitive:n}),i=[`## Environment`,``,`**Platform:** ${r.system.platform} ${r.system.arch}`,`**OS:** ${r.system.type} ${r.system.release}`,`**Host:** ${r.system.hostname}`,`**CPUs:** ${r.system.cpus}`,`**Memory:** ${r.system.memoryFreeGb}GB free / ${r.system.memoryTotalGb}GB total`,``,`**Node:** ${r.runtime.node}`,`**V8:** ${r.runtime.v8}`,`**CWD:** ${r.cwd}`];if(r.env){i.push(``,`### Environment Variables`,``);for(let[e,t]of Object.entries(r.env))i.push(`- \`${e}\`: ${t}`)}let a={platform:r.system.platform,arch:r.system.arch,nodeVersion:r.runtime.node,cwd:r.cwd,cpus:r.system.cpus,memoryFreeGb:r.system.memoryFreeGb,memoryTotalGb:r.system.memoryTotalGb};return{content:[{type:`text`,text:i.join(`
3059
+ `)}],structuredContent:a}}))}const vv=k(`register-tools`);function yv(e){return t=>!e||e.has(t)}function bv(e){try{let t=P(e,`.flows`);if(!M(t))return null;let n=ke(t,{withFileTypes:!0});for(let e of n){if(!e.isDirectory())continue;let n=P(t,e.name,`meta.json`);if(M(n)&&JSON.parse(N(n,`utf-8`)).status===`active`)return e.name}}catch{return null}return null}let xv=null,Sv=null;function Cv(){xv?.(),xv=null}function wv(){return Sv?.flush()??Promise.resolve()}function Tv(e){let{server:t,aikit:n,config:r,elicitor:i,resourceNotifier:a,samplingClient:o,indexMode:s,getSmartState:c,getSmartScheduler:l,precomputedActiveTools:u}=e,d=new Oo,f=r.sources[0]?.path??Ee(),p=be(f),m={activeSlug:null};m.activeSlug=bv(f);let h=new Va(P(r.stateDir??``,`flow-context`),()=>m.activeSlug),g=new Ta;g.register(fi()),g.register(va),g.register(ki),g.register(ra),g.register(yi),g.register(pi),g.register(mi),g.register(ha),g.register(gi),g.register(Sa),g.register(na(()=>m.activeSlug?{active:!0,slug:m.activeSlug}:null)),g.register(sa),g.register(ba),g.register(Ei),g.register(aa);let _=new Za(void 0,n.stateStore),v=n.eventBus,y=Q_(r),b=y?new no(y,{debounceMs:5e3},v??void 0,n.curated,void 0,f):null;b&&b.compileNow(`startup`).catch(e=>{vv.warn(`Startup skill compile failed — will retry on next trigger`,{error:String(e)})});let x=new Oa(g,n.curated,{},h,_,v??void 0,n.stateStore);Sv=x;let S=u??xs(r,[...Ia,...Wo],Fa,Ko(r)),C=yv(S),w=new Set([...S].filter(e=>!Lf.includes(e)&&!Ua.has(e))),T=new qa;d.use(Yo(),{order:1,name:`structured-content-guard`}),d.use(Ba(za(r.tokenBudget)),{order:90,name:`compression`});let E=d.decisionHookRegistry;E.register({id:`search-budget`,order:10,scope:`search`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`budgetHint`],reason:`Enforce token budget on search results`,fn:()=>({type:`decision`,hookId:`search-budget`,decision:`allow`,reason:`Budget hook active`})}),E.register({id:`find-path-containment`,order:10,scope:`find`,timeoutMs:50,failurePolicy:`fail-closed`,decisionTypes:[`deny`],reason:`Validate find scope against workspace boundaries`,fn:()=>({type:`decision`,hookId:`find-path-containment`,decision:`allow`,reason:`Path permitted`})}),E.register({id:`knowledge-mutation-safety`,order:10,scope:`knowledge`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`deny`],reason:`Guard against unintended knowledge mutations`,fn:()=>({type:`decision`,hookId:`knowledge-mutation-safety`,decision:`allow`,reason:`Mutation permitted`})}),E.register({id:`check-scoped-run`,order:10,scope:`check`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log check run scope for audit`,fn:()=>({type:`decision`,hookId:`check-scoped-run`,decision:`allow`,reason:`Check run permitted`})}),E.register({id:`test-run-scoped`,order:10,scope:`test_run`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log test run scope for audit`,fn:()=>({type:`decision`,hookId:`test-run-scoped`,decision:`allow`,reason:`Test run permitted`})}),E.register({id:`onboard-path-correctness`,order:10,scope:`onboard`,timeoutMs:50,failurePolicy:`fail-closed`,decisionTypes:[`deny`],reason:`Validate onboard target path is valid and accessible`,fn:()=>({type:`decision`,hookId:`onboard-path-correctness`,decision:`allow`,reason:`Path valid`})}),E.register({id:`compact-budget-hints`,order:10,scope:`compact`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`budgetHint`],reason:`Enforce token budget on compact output`,fn:()=>({type:`decision`,hookId:`compact-budget-hints`,decision:`allow`,reason:`Budget hook active`})}),E.register({id:`flow-step-safety`,order:10,scope:`flow`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log flow step transitions`,fn:()=>({type:`decision`,hookId:`flow-step-safety`,decision:`allow`,reason:`Step permitted`})}),E.register({id:`present-transport-capability`,order:10,scope:`present`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Verify presentation transport is available`,fn:()=>({type:`decision`,hookId:`present-transport-capability`,decision:`allow`,reason:`Transport available`})});let ee=new jo(r.metricThresholds);os(t,d,r.toolPrefix??``,n.eventBus,()=>{let e=r.sources[0]?.path??Ee();try{return be(e)}catch{return`partition:${qe(`sha256`).update(e).digest(`hex`).slice(0,8)}`}}),v&&(v.subscribe({id:`sub-auto-knowledge`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`args`in e)||!(`result`in e))return;let t=e;try{ee.incrementCounter(`tool.call`,{tool:t.toolName}),t.isError&&ee.incrementCounter(`tool.error`,{tool:t.toolName}),x.push({toolName:t.toolName,args:t.args,result:t.result,durationMs:t.durationMs,isError:t.isError,timestamp:new Date(t.timestamp).toISOString(),origin:t.origin,workspaceId:t.workspaceId,requestId:t.requestId})}catch{}},name:`auto-knowledge`}),v.subscribe({id:`sub-replay`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`args`in e)||!(`result`in e))return;let t=e;try{let{replayAppend:e}=await import(`../../tools/dist/index.js`),n=JSON.stringify(t.args),r=JSON.stringify(t.result);e({ts:new Date(t.timestamp).toISOString(),source:`mcp`,tool:t.toolName,input:n.slice(0,2e3),outputChars:r.length,inputChars:n.length,durationMs:t.durationMs,status:t.isError?`error`:`ok`,output:r.slice(0,2e3),traceId:t.requestId??``})}catch{}},name:`replay`}),v.subscribe({id:`sub-procedural`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`isError`in e))return;let t=e;try{w.has(t.toolName)&&T.record(t.toolName,!t.isError)}catch{}},name:`procedural-memory`}),v.subscribe({id:`sub-observations`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`result`in e))return;let t=e;try{let{ObservationEngine:e,DEFAULT_OBSERVATION_CONFIG:r}=await import(`./observations-Cri43dvk.js`),i=new e(n.stateStore,n.curated),{captureFrom:a}=r;a.includes(t.toolName)&&await i.processToolResult(t.toolName,t.result,{})}catch{}},name:`observation-capture`}),v.subscribe({id:`sub-knowledge-metrics`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`result`in e))return;let t=e;if(t.toolName===`knowledge`)try{let e=t.result,n=t.args?.action;(n===`remember`||n===`update`)&&(ee.incrementCounter(`fact.total`),(e?.status===`unchanged`||e?.result===`unchanged`)&&ee.incrementCounter(`fact.duplicate`))}catch{}},name:`knowledge-metrics`}),v.subscribe({id:`sub-session`,eventType:`session:start`,policy:`async`,handler:async e=>{let t=e,n={serverVersion:t.serverVersion,workspaceRoot:t.workspaceRoot,handoff:t.handoff?`${t.handoff.from} (session ${t.handoff.sessionId})`:void 0};vv.info(`Session started`,n)},name:`session-lifecycle`}),b&&(xv=b.subscribeToEventBus(v)));let te=[...S].filter(e=>Go.has(e)?Uo.includes(e)?!!n.bridge:e===`er_update_policy`?!!n.policyStore:e===`er_evolve_review`?!!n.evolutionCollector:!1:!0),D={store:n.store,graphStore:n.graphStore,embedder:n.embedder},ne={onboardComplete:n.onboardComplete,onboardTimestamp:n.onboardTimestamp},re={search:[{name:`search`,register:()=>f_(t,n.embedder,n.store,n.graphStore,n.bridge,n.evolutionCollector,o,n.stateStore,r.memory?.retention,r.memory?.consolidation,p)},{name:`find`,register:()=>wl(t,n.embedder,n.store)},{name:`symbol`,register:()=>Tl(t,n.embedder,n.store,n.graphStore,D)},{name:`trace`,register:()=>El(t,n.embedder,n.store,n.graphStore,D)},{name:`scope_map`,register:()=>Cl(t,n.embedder,n.store,D)},{name:`file_summary`,register:()=>Rl(t,n.embedder,n.fileCache)}],analysis:[{name:`analyze`,register:()=>Nc(t,n.store,n.embedder)},{name:`blast_radius`,register:()=>Pc(t,n.store,n.embedder,n.graphStore,D)}],knowledge:[{name:`knowledge`,register:()=>Cf(t,n.curated,n.policyStore,n.evolutionCollector,a,void 0,n.stateStore,r.memory?.retention,r.memory?.supersession,r.memory?.consolidation,r.memory?.lessons,D,n.graphStore)},{name:`produce_knowledge`,register:()=>Hg(t,a)}],compression:[{name:`digest`,register:()=>Wu(t,n.embedder)}],forge:[{name:`forge_ground`,register:()=>Gu(t,n.embedder,n.store)},{name:`evidence_map`,register:()=>Uu(t)}],presentation:[{name:`present`,register:()=>Bg(t,i)}],execution:[{name:`check`,register:()=>jl(t,D,r.tokenBudget)},{name:`test_run`,register:()=>Nl(t,D)},{name:`eval`,register:()=>Ml(t)},{name:`audit`,register:()=>zc(t,n.store,n.embedder)}],web:[{name:`browser`,register:()=>$n(t,r)},{name:`web_fetch`,register:()=>ed(t)},{name:`web_search`,register:()=>hv(t)}],manipulation:[{name:`rename`,register:()=>Df(t,r)},{name:`restore`,register:()=>Jg(t)},{name:`codemod`,register:()=>Of(t,r)}],session:[{name:`session`,register:()=>A_(t,n.stateStore,o)}],git:[{name:`git`,register:()=>qu(t)},{name:`parse_output`,register:()=>Pl(t)}],process:[{name:`process`,register:()=>$u(t)},{name:`delegate`,register:()=>Fl(t,o)}],system:[{name:`config`,register:()=>fl(t,r)},{name:`status`,register:()=>fv(t,n.store,n.graphStore,n.curated,ne,r,s,c,n.stateStore,n.eventBus,d.decisionHookRegistry,d.getObservationCompressor(),g,_,b)},{name:`reindex`,register:()=>Wg(t,n.indexer,r,n.curated,n.store,a,s,n.eventBus)},{name:`onboard`,register:()=>ap(t,n.store,n.embedder,r,ne,D,o,a)},{name:`graph`,register:()=>Zu(t,n.graphStore)},{name:`replay`,register:()=>Kg(t)}],utilities:[{name:`measure`,register:()=>gv(t)},{name:`env`,register:()=>_v(t)}],queue:[{name:`queue`,register:()=>sp(t)}],flow:[{name:`flow`,register:()=>Vu(t,r,{store:n.store?{search:async(e,t)=>(await n.store.ftsSearch(e,t)).map(e=>({content:e.record.content}))}:null,graphStore:n.graphStore,embedder:n.embedder,curated:n.curated??null,eventBus:n.eventBus??null,skillCompiler:b},e=>{m.activeSlug=e})}]};for(let[,e]of Object.entries(re))for(let{name:t,register:n}of e)C(t)&&n();n.bridge&&(C(`er_push`)&&Uc(t,n.bridge,n.evolutionCollector),C(`er_pull`)&&Wc(t,n.bridge),C(`er_sync_status`)&&Gc(t,n.bridge)),n.policyStore&&C(`er_update_policy`)&&up(t,n.policyStore),n.evolutionCollector&&C(`er_evolve_review`)&&kl(t,n.evolutionCollector),Lf.some(e=>C(e))&&Rf(t,r,te,n.onboardComplete),Ho(t,n.store,n.curated,y,n.eventBus,d.decisionHookRegistry,b)}function Ev(e,t,n){let r=yv(n);r(`check`)&&jl(e,void 0,t.tokenBudget),r(`eval`)&&Ml(e),r(`test_run`)&&Nl(e),r(`parse_output`)&&Pl(e),r(`delegate`)&&Fl(e),r(`git`)&&qu(e),r(`rename`)&&Df(e,t),r(`codemod`)&&Of(e,t),r(`restore`)&&Jg(e),r(`queue`)&&sp(e),r(`process`)&&$u(e),r(`web_fetch`)&&ed(e),Lf.some(e=>r(e))&&Rf(e,t,[...n??new Set(Ia)]),r(`evidence_map`)&&Uu(e),r(`present`)&&Bg(e),r(`browser`)&&$n(e,t),r(`produce_knowledge`)&&Hg(e),r(`replay`)&&Kg(e),r(`status`)&&dv(e),r(`flow`)&&Vu(e,t),r(`web_search`)&&hv(e),r(`measure`)&&gv(e),r(`env`)&&_v(e)}export{U as S,so as _,yg as a,Fa as b,Hc as c,Yo as d,ts as f,Oo as g,Ko as h,Ev as i,xs as l,Wo as m,wv as n,Yf as o,qo as p,Tv as r,Qf as s,Cv as t,os as u,Ia as v,La as x,Ra as y};