@vpxa/aikit 0.1.380 → 0.1.381

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/package.json +1 -1
  2. package/packages/claude-desktop/dist/manifest.json +1 -1
  3. package/packages/cli/dist/index.js +3 -3
  4. package/packages/cli/dist/{init-BTsNYC02.js → init-Be3nyugf.js} +1 -1
  5. package/packages/cli/dist/{templates-CRs_gkfS.js → templates-CK9mSHyJ.js} +24 -24
  6. package/packages/server/dist/bin.js +2 -2
  7. package/packages/server/dist/{config-DZskEKrY.js → config-CTYSUkDf.js} +1 -1
  8. package/packages/server/dist/{curated-manager-CBKTmAjM.js → curated-manager-D4MOFQ-t.js} +1 -1
  9. package/packages/server/dist/{dashboard-static-NghHzTNh.js → dashboard-static-BbHMHkQ3.js} +1 -1
  10. package/packages/server/dist/index.d.ts +1 -1
  11. package/packages/server/dist/index.js +2 -2
  12. package/packages/server/dist/{observations-CfglxBMB.js → observations-BhMmh4uj.js} +1 -1
  13. package/packages/server/dist/{observations-CrQU_HVm.js → observations-Cri43dvk.js} +1 -1
  14. package/packages/server/dist/{register-tools-Dgu64Px5.js → register-tools-0E-d3SIk.js} +147 -138
  15. package/packages/server/dist/{register-tools-jgdif5r4.js → register-tools-fdniAqWz.js} +147 -138
  16. package/packages/server/dist/{server-C43D7SrT.js → server-C4qsakCZ.js} +6 -6
  17. package/packages/server/dist/{server-BmVdf84Q.js → server-DHdcyAmX.js} +7 -7
  18. package/packages/server/dist/{server-http-BCpGwi0k.js → server-http-CC39yGVF.js} +1 -1
  19. package/packages/server/dist/{server-http-YQ9jxThI.js → server-http-DlTdz6ch.js} +1 -1
  20. package/packages/server/dist/{server-stdio-CuLAgQjc.js → server-stdio-CTbBp6wO.js} +1 -1
  21. package/packages/server/dist/{server-stdio-3hhuJU8B.js → server-stdio-Colzu8Wb.js} +1 -1
  22. package/packages/server/dist/{settings-static-DcTUiqr7.js → settings-static-DV2hXZgq.js} +1 -1
  23. package/packages/server/dist/{startup-maintenance-B4xWqEjc.js → startup-maintenance-CxAICs-n.js} +1 -1
  24. package/packages/tools/dist/index.d.ts +23 -3
  25. package/packages/tools/dist/index.js +111 -105
  26. package/scaffold/dist/adapters/_shared.mjs +1 -1
  27. package/scaffold/dist/adapters/hermes.mjs +1 -1
  28. package/scaffold/dist/definitions/agents.mjs +1 -1
  29. package/scaffold/dist/definitions/exec-hooks.mjs +1 -1
  30. package/scaffold/dist/definitions/hooks.mjs +1 -1
  31. package/scaffold/dist/definitions/protocols.mjs +20 -20
  32. package/scaffold/dist/definitions/skills/aikit.mjs +10 -4
  33. package/scaffold/dist/definitions/skills/browser-use.mjs +1 -1
  34. package/scaffold/dist/definitions/skills/orchestrator.mjs +45 -8
@@ -1,35 +1,44 @@
1
- import{t as e}from"./curated-manager-CBKTmAjM.js";import{A as t,B as n,D as r,F as i,G as a,H as o,I as s,K as c,L as l,M as u,N as d,O as f,P as p,R as m,S as h,T as g,U as _,V as v,W as y,_ as b,a as x,c as S,f as C,g as w,h as T,k as E,m as ee,q as D,r as te,s as ne,u as re,v as ie,w as ae,x as oe,y as se,z as ce}from"./startup-maintenance-B4xWqEjc.js";import{createRequire as le}from"node:module";import{fileURLToPath as ue}from"node:url";import{promisify as de}from"node:util";import{AIKIT_RUNTIME_PATHS as fe,CONTENT_TYPES as pe,CircuitBreaker as me,HealthBus as he,KNOWLEDGE_ORIGINS as ge,SOURCE_TYPES as _e,TOKEN_BUDGETS as ve,computePartitionKey as ye,createLogger as O,getGlobalDataDir as be,getPartitionDir as xe,hashPath as k,isUserInstalled as Se,listWorkspaces as Ce,safeCwd as we,safeCwdOrHome as Te,serializeError as A}from"../../core/dist/index.js";import{copyFileSync as Ee,existsSync as j,mkdirSync as De,readFileSync as M,readdirSync as Oe,renameSync as ke,rmSync as Ae,statSync as je,unlinkSync as Me,writeFileSync as Ne}from"node:fs";import{basename as Pe,dirname as Fe,isAbsolute as Ie,join as N,relative as Le,resolve as P,sep as Re}from"node:path";import{mkdir as ze,readFile as Be,readdir as Ve,rm as He,stat as Ue,unlink as We,writeFile as Ge}from"node:fs/promises";import{createHash as Ke,randomBytes as qe,randomUUID as Je,timingSafeEqual as Ye}from"node:crypto";import{WORKSPACE_SKILL_FILENAME as Xe,acquireLease as Ze,addToWorkset as Qe,audit as $e,bookendReorder as et,buildNodeNameMap as tt,changelog as nt,check as rt,checkpointDiff as it,checkpointGC as at,checkpointHistory as ot,checkpointLatest as st,checkpointList as ct,checkpointLoad as lt,checkpointSave as ut,codemod as dt,compressTerminalOutput as ft,computeSourceHash as pt,createRestorePoint as mt,createSearchSuccessResponse as ht,delegate as gt,delegateListModels as _t,deleteWorkset as vt,diffParse as yt,digest as bt,envInfo as xt,evaluate as St,evidenceMap as Ct,fileSummaryTool as wt,find as Tt,findExamples as Et,forgeGround as Dt,generateFlowBriefing as Ot,generateWorkspaceSkill as kt,getRefTelemetry as At,getWorkset as jt,gitContext as Mt,graphAugmentSearch as Nt,graphQuery as Pt,isSkillStale as Ft,laneCreate as It,laneDiff as Lt,laneDiscard as Rt,laneList as zt,laneMerge as Bt,laneStatus as Vt,listActiveLeases as Ht,listRestorePoints as Ut,listWorksets as Wt,measure as Gt,onboard as Kt,parseOutput as qt,processList as Jt,processLogs as Yt,processStart as Xt,processStatus as Zt,processStop as Qt,queueClear as $t,queueCreate as en,queueDag as tn,queueDelete as nn,queueDone as rn,queueFail as an,queueGet as on,queueList as sn,queueNext as cn,queuePush as ln,releaseLease as un,removeFromWorkset as dn,rename as fn,replayClear as pn,replayList as mn,replayTrim as hn,resolveNodeName as gn,resolveSkillDir as _n,resolveWorkspaceDir as vn,restoreFromPoint as yn,saveWorkset as bn,schemaValidate as xn,scopeMap as Sn,scoreCompliance as Cn,sessionDigest as wn,sessionDigestSampling as Tn,stashClear as En,stashDelete as Dn,stashGet as On,stashList as kn,stashSet as An,storeReversibleContext as jn,summarizeCheckResult as Mn,symbol as Nn,testRun as Pn,trace as Fn,truncateToTokenBudget as F,watchList as In,webFetch as Ln,webSearch as Rn}from"../../tools/dist/index.js";import{exec as zn,execFile as Bn,execSync as Vn}from"node:child_process";import{homedir as Hn,tmpdir as Un}from"node:os";import{getEngine as Wn,registerBrowserTools as Gn}from"../../browser/dist/index.js";import{ResourceTemplate as Kn}from"@modelcontextprotocol/sdk/server/mcp.js";import{DependencyAnalyzer as qn,DiagramGenerator as Jn,EntryPointAnalyzer as Yn,KnowledgeProducer as Xn,PatternAnalyzer as Zn,StructureAnalyzer as Qn,SymbolAnalyzer as $n}from"../../analyzers/dist/index.js";import{WasmDiagnostics as er,WasmRuntime as tr}from"../../chunker/dist/index.js";import{z as I}from"zod";import{ERCache as nr,ERClient as rr,PushAdapter as ir,mergeResults as ar}from"../../enterprise-bridge/dist/index.js";import{RESOURCE_MIME_TYPE as or,getUiCapability as sr,registerAppResource as cr,registerAppTool as lr}from"@modelcontextprotocol/ext-apps/server";import{createStore as ur}from"../../store/dist/index.js";import{buildSnapshot as dr,createOwnerCapability as fr,rotateOwnerCapability as pr,validateToken as mr}from"../../flows/dist/index.js";import{TemplateRegistry as hr,buildShell as gr,dashboardTemplateDefinition as _r,defaultRegistry as vr,flameGraphTemplateDefinition as yr,isError as br,isResult as xr,kanbanTemplateDefinition as Sr,listSortTemplateDefinition as Cr,renderSurface as wr}from"../../blocks-core/dist/index.mjs";import{createServer as Tr}from"node:http";import"../../tool-routing/dist/index.mjs";const Er={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 Ke(`sha256`).update(e).digest(`hex`).slice(0,16)}function Dr(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 Or={enabled:!0,batchThreshold:20,cooldownMs:3e5,maxCandidatesPerSession:5,initialConfidence:40,excludeTools:[`knowledge`,`replay`,`stash`,`checkpoint`,`session_digest`,`reindex`,`status`,`flow`,`evidence_map`,`present`]},kr=new Set([`search`,`find`,`symbol`,`grep_search`,`semantic_search`]),Ar=new Set([`replace_string_in_file`,`editfiles`,`create_file`,`apply_patch`]),jr=new Set([`check`,`test_run`]),Mr=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 Nr(e){let t=e.toLowerCase().match(/[a-z0-9]{2,}/g)??[];return new Set(t)}function Pr(e,t){let n=Nr(e),r=Nr(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 Fr(e,t){return e.length<=t?e:`${e.slice(0,Math.max(0,t-1))}...`}function Ir(e){try{return JSON.stringify(e)}catch{return`[unserializable args]`}}function Lr(e){return e.replace(/^mcp_[^_]+_/,``).toLowerCase()}function Rr(e){return[...new Set(e.filter(e=>e.length>0))]}function zr(e,t){return{...t,confidence:Or.initialConfidence,tags:[`auto-observed`,`detector:${e}`],detector:e}}function Br(e,t){let n=new Map;for(let t of e)for(let e of Nr(t))Mr.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 Vr(e){return e.length>0?e.join(`, `):`similar tasks`}function Hr(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 Ur(e){let t=[];for(let n of e)t.some(e=>Pr(e.title,n.title)>.8)||t.push(n);return t}function Wr(e){return typeof e==`string`?[e]:Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Gr(e){return typeof e==`string`?[...e.matchAll(/^\*\*\* (?:Add|Delete|Update) File: (.+)$/gm)].map(e=>e[1]?.trim()??``).filter(Boolean):[]}function Kr(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(...Wr(i)),n(i)}};return n(e),t.push(...Gr(e.input)),Rr(t)}function qr(e){return{tool:e.toolName,input:Fr(Ir(e.args),200),output:Fr(L(e.result),500),files:Kr(e.args),ts:Date.now()}}function Jr(e){return{title:e.title,content:`${e.context}\n\n${e.insight}\n\nEvidence:\n${e.evidence}`,category:`conventions`,tags:Rr([`auto-observed`,`detector:${e.detector}`,...e.tags]),hash:Ke(`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 Yr(e){let t=new Map;for(let n of e){let e=Lr(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=Vr(Br(t.map(e=>e.input),Math.max(2,Math.ceil(t.length/2))));return zr(`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(`
1
+ import{t as e}from"./curated-manager-D4MOFQ-t.js";import{A as t,B as n,D as r,F as i,G as a,H as o,I as s,K as c,L as l,M as u,N as d,O as f,P as p,R as m,S as h,T as g,U as _,V as v,W as y,_ as b,a as x,c as S,f as C,g as w,h as T,k as E,m as D,q as O,r as ee,s as te,u as ne,v as re,w as ie,x as ae,y as oe,z as se}from"./startup-maintenance-CxAICs-n.js";import{createRequire as ce}from"node:module";import{fileURLToPath as le}from"node:url";import{promisify as ue}from"node:util";import{AIKIT_RUNTIME_PATHS as de,CONTENT_TYPES as fe,CircuitBreaker as pe,HealthBus as me,KNOWLEDGE_ORIGINS as he,SOURCE_TYPES as ge,TOKEN_BUDGETS as _e,computePartitionKey as ve,createLogger as k,getGlobalDataDir as ye,getPartitionDir as be,hashPath as xe,isUserInstalled as Se,listWorkspaces as A,safeCwd as Ce,safeCwdOrHome as we,serializeError as j}from"../../core/dist/index.js";import{copyFileSync as Te,existsSync as M,mkdirSync as Ee,readFileSync as N,readdirSync as De,renameSync as Oe,rmSync as ke,statSync as Ae,unlinkSync as je,writeFileSync as Me}from"node:fs";import{basename as Ne,dirname as Pe,isAbsolute as Fe,join as P,relative as Ie,resolve as F,sep as Le}from"node:path";import{mkdir as Re,readFile as ze,readdir as Be,rm as Ve,stat as He,unlink as Ue,writeFile as We}from"node:fs/promises";import{createHash as Ge,randomBytes as Ke,randomUUID as qe,timingSafeEqual as Je}from"node:crypto";import{WORKSPACE_SKILL_FILENAME as Ye,acquireLease as Xe,addToWorkset as Ze,audit as Qe,bookendReorder as $e,buildNodeNameMap as et,changelog as tt,check as nt,checkpointDiff as rt,checkpointGC as it,checkpointHistory as at,checkpointLatest as ot,checkpointList as st,checkpointLoad as ct,checkpointSave as lt,codemod as ut,compressTerminalOutput as dt,computeSourceHash as ft,createRestorePoint as pt,createSearchSuccessResponse as mt,delegate as ht,delegateListModels as gt,deleteWorkset as _t,diffParse as vt,digest as yt,envInfo as bt,evaluate as xt,evidenceMap as St,fileSummaryTool as Ct,find as wt,findExamples as Tt,forgeGround as Et,generateFlowBriefing as Dt,generateWorkspaceSkill as Ot,getRefTelemetry as kt,getWorkset as At,gitContext as jt,graphAugmentSearch as Mt,graphQuery as Nt,isSkillStale as Pt,laneCreate as Ft,laneDiff as It,laneDiscard as Lt,laneList as Rt,laneMerge as zt,laneStatus as Bt,listActiveLeases as Vt,listRestorePoints as Ht,listWorksets as Ut,measure as Wt,onboard as Gt,parseOutput as Kt,processList as qt,processLogs as Jt,processStart as Yt,processStatus as Xt,processStop as Zt,queueClear as Qt,queueCreate as $t,queueDag as en,queueDelete as tn,queueDone as nn,queueFail as rn,queueGet as an,queueList as on,queueNext as sn,queuePush as cn,releaseLease as ln,removeFromWorkset as un,rename as dn,replayClear as fn,replayList as pn,replayTrim as mn,resolveNodeName as hn,resolveSkillDir as gn,resolveWorkspaceDir as _n,restoreFromPoint as vn,saveWorkset as yn,schemaValidate as bn,scopeMap as xn,scoreCompliance as Sn,sessionDigest as Cn,sessionDigestSampling as wn,stashClear as Tn,stashDelete as En,stashGet as Dn,stashList as On,stashSet as kn,storeReversibleContext as An,summarizeCheckResult as jn,symbol as Mn,testRun as Nn,trace as Pn,truncateToTokenBudget as I,watchList as Fn,webFetch as In,webSearch as Ln}from"../../tools/dist/index.js";import{exec as Rn,execFile as zn,execSync as Bn}from"node:child_process";import{homedir as Vn,tmpdir as Hn}from"node:os";import{getEngine as Un,registerBrowserTools as Wn}from"../../browser/dist/index.js";import{ResourceTemplate as Gn}from"@modelcontextprotocol/sdk/server/mcp.js";import{BlastRadiusAnalyzer as Kn,DependencyAnalyzer as qn,DiagramGenerator as Jn,EntryPointAnalyzer as Yn,KnowledgeProducer as Xn,PatternAnalyzer as Zn,StructureAnalyzer as Qn,SymbolAnalyzer as $n}from"../../analyzers/dist/index.js";import{WasmDiagnostics as er,WasmRuntime as tr}from"../../chunker/dist/index.js";import{z as L}from"zod";import{ERCache as nr,ERClient as rr,PushAdapter as ir,mergeResults as ar}from"../../enterprise-bridge/dist/index.js";import{RESOURCE_MIME_TYPE as or,getUiCapability as sr,registerAppResource as cr,registerAppTool as lr}from"@modelcontextprotocol/ext-apps/server";import{createStore as ur}from"../../store/dist/index.js";import{buildSnapshot as dr,createOwnerCapability as fr,rotateOwnerCapability as pr,validateToken as mr}from"../../flows/dist/index.js";import{TemplateRegistry as hr,buildShell as gr,dashboardTemplateDefinition as _r,defaultRegistry as vr,flameGraphTemplateDefinition as yr,isError as br,isResult as xr,kanbanTemplateDefinition as Sr,listSortTemplateDefinition as Cr,renderSurface as wr}from"../../blocks-core/dist/index.mjs";import{createServer as Tr}from"node:http";import"../../tool-routing/dist/index.mjs";const Er={enabled:!0,batchSize:10,debounceMs:5e3,maxFactsPerSession:50,minQuality:.3};function R(e){return(e.content??[]).filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text??``).join(`
2
+ `)}function z(e){return Ge(`sha256`).update(e).digest(`hex`).slice(0,16)}function Dr(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 Or={enabled:!0,batchThreshold:20,cooldownMs:3e5,maxCandidatesPerSession:5,initialConfidence:40,excludeTools:[`knowledge`,`replay`,`stash`,`checkpoint`,`session_digest`,`reindex`,`status`,`flow`,`evidence_map`,`present`]},kr=new Set([`search`,`find`,`symbol`,`grep_search`,`semantic_search`]),Ar=new Set([`replace_string_in_file`,`editfiles`,`create_file`,`apply_patch`]),jr=new Set([`check`,`test_run`]),Mr=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 Nr(e){let t=e.toLowerCase().match(/[a-z0-9]{2,}/g)??[];return new Set(t)}function Pr(e,t){let n=Nr(e),r=Nr(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 Fr(e,t){return e.length<=t?e:`${e.slice(0,Math.max(0,t-1))}...`}function Ir(e){try{return JSON.stringify(e)}catch{return`[unserializable args]`}}function Lr(e){return e.replace(/^mcp_[^_]+_/,``).toLowerCase()}function Rr(e){return[...new Set(e.filter(e=>e.length>0))]}function zr(e,t){return{...t,confidence:Or.initialConfidence,tags:[`auto-observed`,`detector:${e}`],detector:e}}function Br(e,t){let n=new Map;for(let t of e)for(let e of Nr(t))Mr.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 Vr(e){return e.length>0?e.join(`, `):`similar tasks`}function Hr(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 Ur(e){let t=[];for(let n of e)t.some(e=>Pr(e.title,n.title)>.8)||t.push(n);return t}function Wr(e){return typeof e==`string`?[e]:Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Gr(e){return typeof e==`string`?[...e.matchAll(/^\*\*\* (?:Add|Delete|Update) File: (.+)$/gm)].map(e=>e[1]?.trim()??``).filter(Boolean):[]}function Kr(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(...Wr(i)),n(i)}};return n(e),t.push(...Gr(e.input)),Rr(t)}function qr(e){return{tool:e.toolName,input:Fr(Ir(e.args),200),output:Fr(R(e.result),500),files:Kr(e.args),ts:Date.now()}}function Jr(e){return{title:e.title,content:`${e.context}\n\n${e.insight}\n\nEvidence:\n${e.evidence}`,category:`conventions`,tags:Rr([`auto-observed`,`detector:${e.detector}`,...e.tags]),hash:Ge(`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 Yr(e){let t=new Map;for(let n of e){let e=Lr(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=Vr(Br(t.map(e=>e.input),Math.max(2,Math.ceil(t.length/2))));return zr(`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
3
  `)})})}function Xr(e){let t=new Map;for(let n=0;n<e.length;n+=1){let r=e[n];if(kr.has(Lr(r.tool)))for(let i=n+1;i<e.length&&i<=n+5;i+=1){let n=e[i];if(!(!Ar.has(Lr(n.tool))||n.files.length===0))for(let e of Rr(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=Vr(Br(t.queries,Math.max(2,Math.ceil(t.count/2))));return zr(`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
4
  `)})})}function Zr(e){let t=new Map;for(let n=0;n<e.length-2;n+=1){let r=e[n];if(!jr.has(Lr(r.tool)))continue;let i=new Set,a=!1;for(let o=n+1;o<e.length;o+=1){let n=e[o],s=Lr(n.tool);if(Ar.has(s)){a=!0;for(let e of n.files)i.add(e);continue}if(jr.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 zr(`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
5
  `)})})}function Qr(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=Vr(Br(n.map(e=>e.input),Math.max(2,Math.ceil(n.length/2)))),i=zr(`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
6
  `)});return i.tags=Rr([...i.tags,`user-preference`,`collaboration`]),[i]}function $r(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=Vr(Br(n.map(e=>e.input),Math.max(2,Math.ceil(n.length/2)))),i=zr(`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
7
  `)});return i.tags=Rr([...i.tags,`user-preference`,`decision-style`,`tradeoff`]),[i]}function ei(e,t=Or){if(!t.enabled||e.length===0)return[];let n=new Set(t.excludeTools.map(e=>e.toLowerCase())),r=e.filter(e=>!n.has(Lr(e.tool)));return Ur([...Yr(r),...Xr(r),...Zr(r),...Qr(r),...$r(r)].map(e=>({...e,confidence:t.initialConfidence,tags:Rr([`auto-observed`,`detector:${e.detector}`,...e.tags])}))).slice(0,t.maxCandidatesPerSession)}function ti(e){return e.split(`
8
- `).filter(Boolean).map(e=>{try{return JSON.parse(e)}catch{return null}}).filter(Hr).map(e=>({...e,output:e.output??``}))}var ni=class{name=`behavioral`;tools=[];buffer=[];eventCounter=0;lastDetectionTs=0;extract(e){if(this.push(qr(e)),this.eventCounter+=1,this.eventCounter%50!=0)return[];let t=Date.now();if(t-this.lastDetectionTs<3e5)return[];let n=ei(this.buffer).map(Jr);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 ri(){return new ni}ri();const ii={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}},ai={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,Dr(i)+.2)>=.7?[`architecture-memory`,`invariant`]:[]],hash:R(`structure-${r}`),identityKey:`analyze:structure:${r}`,quality:Math.min(.9,Dr(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
- `)}`;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 oi(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 si={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?[]:[oi(`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?[]:[oi(`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?[]:[oi(`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[oi(`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?[]:[oi(`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[oi(`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 ci(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 li(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 ui={name:`convention-detection`,tools:[`check`,`analyze`,`onboard`],extract(e){let t=L(e.result);if(!t||e.isError)return[];let n=[];return n.push(...ci(t,e.toolName)),e.toolName===`analyze`&&e.args.aspect===`patterns`&&n.push(...li(t,e.toolName)),n}};function di(e){return e.replace(/[^a-zA-Z0-9_-]/g,``).replace(/-+/g,`-`).replace(/^-|-$/g,``)||`flow`}function fi(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 pi(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 mi(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 hi(e){return typeof e.slug==`string`&&e.slug.length>0?e.slug:null}function gi(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 _i={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=fi(e.result),i=r?hi(r):null,a=i?di(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?gi(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(pi(`Flow started: ${n}${i?` — ${i}`:``}`,l,`flow-start-${a??n}`,`flow:start:${a??n}`,mi(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?gi(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(pi(`Step ${d}: ${f??o} (${u}/${l})`,p.join(` `),`flow-step-${a??``}-${o}-${n}`,`flow:step:${a??``}:${o}:${n}`,mi(p.join(` `)),e.toolName,[`flow:step`,`step:${n}`],a??void 0,e.workspaceId)),l>0&&t.push(pi(`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(pi(`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?gi(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(pi(`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(pi(`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(pi(`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 vi(e,t){return e.match(t)?.[1]?.trim()||null}function yi(e,t,n,r,i,a){return{title:e,content:t,category:`context`,tags:n,hash:R(r),quality:i,source:a}}const bi={name:`environment-facts`,tools:[`env`,`config`,`status`],extract(e){let t=L(e.result);if(!t)return[];let n=[],r=vi(t,/node(?:\.js)?\s*[:=]\s*([^\r\n]+)/i);r&&n.push(yi(`Node.js version`,`Detected Node.js version: ${r}`,[`environment`,`node`],`node-version-${r}`,.4,e.toolName));let i=vi(t,/(?:^|\n)os\s*[:=]\s*([^\r\n]+)/i);i&&n.push(yi(`Operating system`,`Detected OS: ${i}`,[`environment`,`os`],`os-${i}`,.4,e.toolName));let a=vi(t,/workspace(?: path)?\s*[:=]\s*([^\r\n]+)/i);a&&n.push(yi(`Workspace path`,`Primary workspace path: ${a}`,[`environment`,`workspace`],`workspace-${a}`,.4,e.toolName));let o=vi(t,/store(?: backend)?\s*[:=]\s*([^\r\n]+)/i);o&&n.push(yi(`Store backend`,`Configured store backend: ${o}`,[`environment`,`storage`],`store-${o}`,.6,e.toolName));let s=vi(t,/embedding(?: model)?\s*[:=]\s*([^\r\n]+)/i);return s&&n.push(yi(`Embedding model`,`Configured embedding model: ${s}`,[`environment`,`embedding`],`embedding-${s}`,.6,e.toolName)),n}},xi={"search-result":800,"file-card":2e3,analysis:1500,"step-summary":3e3},Si=[`search`,`file_summary`,`stratum_card`,`compact`,`blast_radius`,`scope_map`,`flow`],Ci={search:`search-result`,file_summary:`file-card`,stratum_card:`file-card`,compact:`analysis`,blast_radius:`analysis`,scope_map:`step-summary`,flow:`step-summary`},wi={"search-result":72e5,"file-card":144e5,analysis:144e5,"step-summary":288e5};function Ti(e){return e.replace(/\s+/g,` `).trim()}function Ei(e){return Math.max(.6,Math.min(.8,Dr(e)))}function z(e,t=500){let n=Ti(e);return n.length<=t?n:`${n.slice(0,Math.max(0,t-3)).trimEnd()}...`}function Di(e){return typeof e==`object`&&!!e}function Oi(e){try{return JSON.parse(e)}catch{return null}}function B(e){return typeof e==`string`?Ti(e):typeof e==`number`||typeof e==`boolean`?String(e):``}function ki(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=Ti(r);e&&n.push(e);continue}if(Di(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 Ai(e){let t=[e.file,e.path,e.files,e.changed_files,e.changedFiles].flatMap(e=>typeof e==`string`?[Ti(e)]:ki(e,6));return[...new Set(t.filter(Boolean))].slice(0,6)}function ji(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=>Ti(e)))].slice(0,t)}function Mi(e,t){return e.length===0?``:`${t}: ${e.join(`, `)}`}function Ni(e,t=3){return e.split(/\r?\n/).map(e=>Ti(e)).filter(e=>e.length>=12).slice(0,t)}function Pi(e){if(!Di(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 Ti([t,n&&`- ${n}`].filter(Boolean).join(` `))}function Fi(e,t){let n=V(e,`query`),r=Oi(t);if(Di(r)&&Array.isArray(r.results)){let e=r.results.map(e=>Pi(e)).filter(Boolean).slice(0,3);if(e.length>0)return z(`Query: ${n||`unknown`}. Top hits: ${e.join(` | `)}`,xi[`search-result`])}let i=Ni(t,3);return z(`Query: ${n||`unknown`}. Top hits: ${i.join(` | `)}`,xi[`search-result`])}function Ii(e,t){let n=V(e,`path`,`file`),r=Oi(t);if(Di(r)){let e=B(r.path)||n||`unknown file`,t=ki(r.imports,4),i=ki(r.exports,5),a=ki(r.functions,4),o=[`File: ${e}`,Mi(i,`Exports`),Mi(t,`Imports`),Mi(a,`Functions`)].filter(Boolean);if(o.length>1)return z(o.join(`. `),xi[`file-card`])}let i=Ni(t,4);return z(`File: ${n||`unknown file`}. Structure: ${i.join(` | `)}`,xi[`file-card`])}function Li(e,t){let n=Ai(e),r=V(e,`tier`)||`T1`,i=Oi(t);if(Di(i)){let e=(Array.isArray(i.cards)?i.cards:[]).map(e=>Pi(e)).filter(Boolean).slice(0,3);if(e.length>0)return z(`Tier: ${r}. Files: ${n.join(`, `)||`unknown`}. Cards: ${e.join(` | `)}`,xi[`file-card`])}let a=Ni(t,3);return z(`Tier: ${r}. Files: ${n.join(`, `)||`unknown`}. Highlights: ${a.join(` | `)}`,xi[`file-card`])}function Ri(e,t){let n=V(e,`path`,`file`),r=V(e,`query`);return z(`Path: ${n||`unknown`}. Focus: ${r||`general`}. Summary: ${t}`,xi.analysis)}function zi(e,t){let n=Ai(e),r=Oi(t),i=Di(r)?[...ki(r.affectedFiles,8),...ki(r.tests,4),...ki(r.importers,4)]:[],a=[...new Set([...i,...ji(t,8)])].slice(0,8),o=[`Changed: ${n.join(`, `)||`unknown`}`,Mi(a,`Affected`)].filter(Boolean);return o.length>1?z(o.join(`. `),xi.analysis):z(`Changed: ${n.join(`, `)||`unknown`}. Summary: ${t}`,xi.analysis)}function Bi(e,t){let n=V(e,`task`),r=Oi(t);if(Di(r)){let e=ki(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(`, `)}`,xi[`step-summary`])}let i=ji(t,6);return z(`Task: ${n||`unknown`}. Reading plan: ${i.join(`, `)||Ni(t,3).join(` | `)}`,xi[`step-summary`])}function Vi(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(` `),xi[`step-summary`])}catch{let e=Ni(t,3);return z(`Flow action: ${n||`unknown`}. ${e.join(` | `)}`,xi[`step-summary`])}}function Hi(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 Ui(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 Wi(e,t){switch(e.toolName){case`search`:return Fi(e.args,t);case`file_summary`:return Ii(e.args,t);case`stratum_card`:return Li(e.args,t);case`compact`:return Ri(e.args,t);case`blast_radius`:return zi(e.args,t);case`scope_map`:return Bi(e.args,t);case`flow`:return Vi(e.args,t);default:return``}}function Gi(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: ${Ai(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: ${Ai(e.args).join(`, `)||`unknown changes`}`,120);case`scope_map`:return z(`Scope map: ${V(e.args,`task`)||`unknown task`}`,120);case`flow`:return Hi(e.args);default:return z(`Flow context: ${e.toolName}`,120)}}function Ki(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=Ai(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:${Ai(e.args).join(`,`)||`unknown-changes`}`;case`scope_map`:return`scope-map:${V(e.args,`task`)||`unknown-task`}`;case`flow`:return Ui(e.args);default:return`${e.toolName}:generic`}}function qi(e){return{name:`flow-context`,tools:[...Si],extract(t){if(t.isError)return[];let n=e();if(!n?.active||!n.slug||!(t.toolName in Ci))return[];let r=L(t.result).trim();if(r.length<50)return[];let i=Ci[t.toolName],a=Wi(t,r);if(a.length<50)return[];let o=Gi(t);return[{title:o,content:a,category:`flow-context`,tags:[`flow-context`,`flow:${di(n.slug)}`,i,`tool:${t.toolName}`],hash:R(`${n.slug}|${t.toolName}|${o}|${a}`),identityKey:Ki(t),quality:Ei(a),ttlMs:wi[i],source:t.toolName}]}}}const Ji={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,Dr(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:Dr(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 Yi(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 Xi={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(Yi(`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(Yi(`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 Zi(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 Qi={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[Zi(`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)]}},$i=new Set([`neighbors`,`traverse`,`find_nodes`,`symbol360`]),ea=144e5;function ta(e,t){return e.slice(0,t).trim()}function na(e,t){let n=ta(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:ea,source:`symbol`}]}function ra(e,t,n){let r=ta(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:ea,source:`trace`}]}function ia(e,t){return e===`find_nodes`?`Graph nodes: ${t}`:e===`neighbors`?`Graph neighbors: ${t}`:e===`traverse`?`Graph traverse: ${t}`:`Symbol360: ${t}`}function aa(e,t,n,r,i){let a=ta(i,600);return a.length<50?[]:[{title:ia(e,t),content:a,category:`patterns`,tags:[`architecture`,`graph`,e],hash:R(`graph-${e}-${t}-${n}-${r}`),quality:.6,ttlMs:ea,source:`graph`}]}const oa={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?na(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?[]:ra(n,r,t)}if(e.toolName===`graph`){let n=typeof e.args.action==`string`?e.args.action:``;if(!$i.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 aa(n,n===`find_nodes`?i:r,a,o,t)}return[]}};function sa(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 ca(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 la={name:`test-results`,tools:[`check`,`test_run`],extract(e){let t=L(e.result);if(!t)return[];let n=[],r=sa(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=ca(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 ua(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 da={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(ua(`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(ua(`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 fa(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 pa={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}=fa(t);if(!r)return[];let i=t.slice(0,500),a=Dr(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}]}},ma=O(`extractor-registry`),ha={defaultMaxFactsPerEvent:20,globalMaxFactsPerEvent:200};var ga=class{extractors=[];config;constructor(e={}){this.config={...ha,...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?(ma.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);ma.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 _a=new Set([`lifecycleOwnerToken`,`_ownerToken`,`ownerTokenSalt`,`ownerTokenHash`,`currentToken`]),H=O(`auto-knowledge`),va=2e3;var ya=class e{registry;curated;flowContextAdapter;promotionEngine;eventBus;queue=[];timer=null;seenHashes=new Map;failedBuffer=[];maxBufferSize=50;storedCount=0;droppedCount=0;dedupedCount=0;bufferDropCount=0;collisionCount=0;promotedCount=0;recoveryListenerRegistered=!1;config;existingCuratedEntries=null;recoveryListener=null;constructor(e,t,n={},r,i,a){this.registry=e,this.curated=t,this.flowContextAdapter=r,this.promotionEngine=i,this.eventBus=a,this.config={...Er,...n}}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}if(this.isSeenRecently(e)){this.dedupedCount++;continue}let i=this.buildFactIdentity(e);this.promotionEngine&&this.promotionEngine.recordObservation(e,i);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()){if(this.storedCount>=this.config.maxFactsPerSession)break;if(he.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.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}}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=he.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}he.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(he.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())}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 ${va} chars`,{title:e.title,originalLength:e.content.length,maxChars:va}),e.content.slice(0,va-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 _a)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}`;if(this.promotionEngine){let e=await this.promotionEngine.evaluate(i,n);if(e.status!==`promoted`)return this.droppedCount++,H.debug(`Fact not promoted`,{title:i.title,status:e.status,reason:e.reason}),`skipped`;this.promotedCount++}let 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 ba=/```/,xa=/^\s*(?:import|export|function|class|interface|type|const|let|var|return|if|for|while|switch|try|catch|throw|await|async)\b/,Sa=/=>|;\s*$|{\s*$|}\s*$|:\s*(?:string|number|boolean|unknown|void|any|Record|Array|Set|Map|Promise|ReadonlyArray)\b/;function Ca(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 wa(e){if(Ca(e)||e.includes("```")||ba.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)(xa.test(e)||Sa.test(e))&&(n+=1);return n/t.length>=.25}function Ta(e){let t=e.meta?.compression?.preserve??`balanced`;if(t===`exact`||wa(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 U={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`}},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`}}},Ea=Object.keys(U).filter(e=>!U[e]?.capabilities?.conditional),Da=new Set(Object.entries(U).filter(([e,t])=>t.capabilities?.zeroDep).map(([e])=>e)),Oa=new Set(Object.entries(U).filter(([e,t])=>t.capabilities?.indexIndependent).map(([e])=>e));function W(e){return U[e]??{title:e,annotations:{readOnlyHint:!1},category:[]}}function ka(e){switch(e){case`efficient`:return{threshold:2e3,tokenBudget:1e3};case`full`:return{threshold:1/0};default:return{threshold:4e3,tokenBudget:2e3}}}function Aa(e){let t=e?.threshold??4e3,n=e?.tokenBudget??2e3;return async(e,r)=>{if(W(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=Ta({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=ft({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 ja=class{baseDir;getActiveSlug;constructor(e,t){this.baseDir=e,this.getActiveSlug=t}async initialize(){await ze(this.baseDir,{recursive:!0})}async read(e){let t=this.resolveScopedPath(e);if(t==null)return null;try{return await Be(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 ze(Fe(r),{recursive:!0}),await Ge(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 We(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 Ue(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 Ve(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 He(e,{recursive:!0,force:!0}),t)}async close(){}getActiveSlugDir(){let e=this.getActiveSlug();return e?N(this.baseDir,e):null}resolveScopedPath(e){let t=this.getActiveSlugDir();if(t==null)return null;let n=P(t),r=P(n,e),i=Le(n,r);if(i===``||i===`..`||i.startsWith(`..${Re}`)||Ie(i))throw Error(`Path escapes active flow context scope: ${e}`);return r}async collectFiles(e,t){let n;try{n=await Ve(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=N(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 Ue(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 Ve(e,{withFileTypes:!0})}catch(e){if(this.isMissingError(e))return 0;throw e}let n=0;for(let r of t){let t=N(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`)}};O(`procedural-memory`);const Ma={minSequenceLength:3,minRepetitions:3,maxSequenceLength:10,confidenceIncrement:10,confidenceDecrement:20},Na=new Set([`status`,`guide`,`health`,`onboard`,`reindex`,`replay`,`session_digest`,`process`,`watch`,`produce_knowledge`,`list_tools`,`describe_tool`,`search_tools`]);function Pa(e){return e.join(`→`)}function Fa(e){return{...e,steps:[...e.steps]}}function Ia(e){return e.every(e=>e.success)}var La=class{config;history=[];sequences=new Map;procedures=new Map;pendingProcedures=new Map;constructor(e=Ma){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=>Fa(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=>Fa(e));return this.pendingProcedures.clear(),e}requeueProcedures(e){for(let t of e)this.pendingProcedures.set(Pa(t.steps),Fa(t))}extractProcedure(e,t){return{id:Je(),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=Pa(n),s=0;for(let e=0;e<=t.length-a;e+=1)Pa(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,Fa(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);Pa(a.map(e=>e.toolName))===n&&(r.occurrences+=1,r.lastSeen=e,this.adjustConfidence(r,Ia(a)))}}};const Ra={recurrenceWeight:.3,confidenceWeight:.3,sourceDiversityWeight:.2,freshnessWeight:.1,actionabilityWeight:.1};function za(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 Ba=O(`promotion-engine`);var Va=class{running=!1;records=[];config;observationCache=new Map;constructor(e){this.config={...Ra,...e}}async evaluate(e,t){this.running&&Ba.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})}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}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>=55?(i.status=`promoted`,i.tier=a.totalScore>=70?`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>=35?(i.status=`held`,i.heldUntil=r+720*60*60*1e3,i.reason=`Held (score=${a.totalScore.toFixed(1)}). Below promote threshold (55) but above decay (35). Will expire ${new Date(i.heldUntil).toISOString()}.`):(i.status=`rejected`,i.reason=`Rejected (score=${a.totalScore.toFixed(1)}). Below decay threshold (35). 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=za(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 G=O(`skill-compiler`),Ha=new Set([`user-preference`,`collaboration`,`decision-style`,`tradeoff`,`architecture-memory`,`invariant`,`pitfall`,`prevention`,`review-gate`,`validation`,`repo-rule`,`constraint`,`tool-use`,`retrieval`]),Ua={debounceMs:5e3,backgroundQueue:!0};var Wa=class{skillDir;curated;getFlowState;wsRoot;config;debounceTimer=null;eventBusDisposer=null;pendingRegeneration=!1;isCompiling=!1;totalCompiles=0;failedCompiles=0;skippedCompiles=0;lastCompiledAt=null;currentVersion=1;flowBriefingManager;constructor(e,t={},n,r,i,a){this.skillDir=e,this.curated=r,this.getFlowState=i,this.wsRoot=a,this.config={...Ua,...t},this.curated=r??null,this.flowBriefingManager=new Ga(this.skillDir,this.config,this.curated,this.getFlowState),this.ensureDir(),this.loadVersion()}ensureDir(){j(this.skillDir)||De(this.skillDir,{recursive:!0});let e=N(this.skillDir,`references`);j(e)||De(e,{recursive:!0})}loadVersion(){let e=N(this.skillDir,`.aikit-skill.json`);try{if(j(e)){let t=JSON.parse(M(e,`utf-8`));this.currentVersion=t.version??1}}catch{this.currentVersion=1}}saveVersion(){let e=N(this.skillDir,`.aikit-skill.json`);try{Ne(e,JSON.stringify({version:this.currentVersion,updated:new Date().toISOString()},null,2),`utf-8`)}catch(e){G.warn(`Failed to save skill manifest`,{error:String(e)})}}getStats(){let e=N(this.skillDir,Xe),t=j(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?je(e).size:0,skillVersion:this.currentVersion,pendingRegeneration:this.pendingRegeneration}}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=N(this.skillDir,Xe);try{return j(e)?M(e,`utf-8`):null}catch(e){return G.warn(`Failed to read current skill file`,{error:String(e)}),null}}scheduleRegeneration(e){this.debounceTimer&&clearTimeout(this.debounceTimer),G.debug(`Skill compile scheduled (trigger: ${e}, debounce: ${this.config.debounceMs}ms)`),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.executeCompile(e).catch(t=>{G.error(`Scheduled compile failed`,{error:String(t),trigger:e})})},this.config.debounceMs)}scheduleImmediateRegeneration(e){this.debounceTimer&&=(clearTimeout(this.debounceTimer),null),G.debug(`Skill compile scheduled immediate (trigger: ${e})`),setImmediate(()=>{this.executeCompile(e).catch(t=>{G.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,G.debug(`Skill compile already in progress — pending flag set`);return}this.isCompiling=!0,this.pendingRegeneration=!1;try{do{let t=await this.loadSkillInput(),n=pt(t),r=this.readCurrentSkill();if(r&&!Ft(r,n)){G.debug(`Skill up to date — skipping compile`,{sourceHash:n}),this.skippedCompiles++;continue}G.info(`Skill compile starting`,{trigger:e,sourceHash:n});let i=Date.now(),a=kt(t,this.currentVersion);await this.writeSkillAtomically(a,n),this.lastCompiledAt=Date.now(),this.currentVersion++,this.saveVersion(),this.totalCompiles++,G.info(`Skill compile complete`,{durationMs:Date.now()-i,size:a.length}),this.pendingRegeneration&&(this.pendingRegeneration=!1,G.debug(`Pending regeneration detected — recompiling`))}while(this.pendingRegeneration)}catch(t){this.failedCompiles++,G.error(`Skill compile failed`,{error:String(t),trigger:e})}finally{this.isCompiling=!1}}async loadSkillInput(){let e=[],t={workspaceName:Pe(Fe(this.skillDir)),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`})]);for(let t of n)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))e.contentPreview&&e.contentPreview.length>5&&t.pitfalls?.push(`${e.title}: ${e.contentPreview.slice(0,150)}`);for(let t of r)t.contentPreview&&e.push({title:t.title,insight:t.contentPreview.slice(0,200),confidence:65,category:`retrieval`});for(let t of i)t.contentPreview&&e.push({title:t.title,insight:t.contentPreview.slice(0,150),confidence:70,category:`context`});for(let t of a)t.contentPreview&&e.push({title:t.title,insight:t.contentPreview.slice(0,200),confidence:t.tags.includes(`high-confidence`)?80:60,category:`lessons`});let s=[];for(let e of i)e.contentPreview&&e.tags?.some(e=>e===`user-preference`||e===`decision-style`)&&s.push(`- **${e.title}**: ${e.contentPreview.slice(0,150)}`);s.length>0&&(t.userPreferences=s);let c=[];for(let e of[...n,...r,...i])e.contentPreview&&e.tags?.includes(`architecture-memory`)&&c.push(`- **${e.title}**: ${e.contentPreview.slice(0,150)}`);c.length>0&&(t.architectureMemory=c);let l=[];for(let e of[...n,...i,...a])e.contentPreview&&e.tags?.some(e=>e===`pitfall`||e===`prevention`)&&l.push(`- ⚠ **${e.title}**: ${e.contentPreview.slice(0,150)}`);l.length>0&&(t.preventionRules=l);let u=[];for(let e of[...n,...r,...i,...a])e.contentPreview&&e.tags?.includes(`review-gate`)&&u.push(`- ✅ **${e.title}**: ${e.contentPreview.slice(0,150)}`);u.length>0&&(t.reviewGates=u);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)Ha.has(e)||e.startsWith(`flow:`)||e.startsWith(`tool:`)||e.startsWith(`detector:`)||[`architecture`,`structure`,`analysis`,`dependencies`,`testing`].includes(e)||t.add(e);t.size>0&&G.warn(`Unknown self-improvement tags detected (check spelling):`,{tags:[...t].sort().join(`, `)})}catch{}}catch(e){G.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=N(t,`package.json`);if(j(n))try{let r=JSON.parse(M(n,`utf-8`));e.structure=`**${r.name??Pe(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=>j(N(t,e)));a.length>0&&(e.entryPoints=a.map(e=>`- \`${e}\``).join(`
13
- `))}catch{G.warn(`Failed to parse package.json — structural bridge degraded`)}if(!e.structure){let n=Oe(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=`**${Pe(t)}** workspace\n\n**Directories:**\n${r.slice(0,12).join(`
8
+ `).filter(Boolean).map(e=>{try{return JSON.parse(e)}catch{return null}}).filter(Hr).map(e=>({...e,output:e.output??``}))}var ni=class{name=`behavioral`;tools=[];buffer=[];eventCounter=0;lastDetectionTs=0;extract(e){if(this.push(qr(e)),this.eventCounter+=1,this.eventCounter%50!=0)return[];let t=Date.now();if(t-this.lastDetectionTs<3e5)return[];let n=ei(this.buffer).map(Jr);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 ri(){return new ni}ri();const ii={name:`build-commands`,tools:[`check`,`test_run`],extract(e){if(e.isError)return[];let t=R(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:z(`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:z(`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:z(`test-cmd-${t}`),quality:.9,source:e.toolName})}}return n}},ai={name:`codebase-insights`,tools:[`analyze`,`scope_map`,`blast_radius`,`onboard`],extract(e){let t=R(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,Dr(i)+.2)>=.7?[`architecture-memory`,`invariant`]:[]],hash:z(`structure-${r}`),identityKey:`analyze:structure:${r}`,quality:Math.min(.9,Dr(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
+ `)}`;n.push({title:`Dependencies: ${r}`,content:t,category:`context`,tags:[`architecture`,`dependencies`,`analysis`,`architecture-memory`,`invariant`],hash:z(`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:z(`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:z(`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:z(`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:z(`onboard-summary`),identityKey:`onboard:summary`,quality:.9,source:e.toolName}),n}};function oi(e,t,n,r,i,a,o,s){return{title:e,content:t,category:`context`,tags:s,hash:z(n),identityKey:r,quality:i,ttlMs:a,source:o}}const si={name:`context-reads`,tools:[`file_summary`,`digest`,`lookup`,`compact`,`stratum_card`],extract(e){if(e.isError)return[];let t=R(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?[]:[oi(`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?[]:[oi(`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?[]:[oi(`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[oi(`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?[]:[oi(`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[oi(`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 ci(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:z(`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:z(`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:z(`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:z(`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:z(`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:z(`convention-monorepo`),quality:.7,source:t}),n}function li(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:z(`pattern-${r}`),quality:.6,source:t})}return n}const ui={name:`convention-detection`,tools:[`check`,`analyze`,`onboard`],extract(e){let t=R(e.result);if(!t||e.isError)return[];let n=[];return n.push(...ci(t,e.toolName)),e.toolName===`analyze`&&e.args.aspect===`patterns`&&n.push(...li(t,e.toolName)),n}};function di(e){return e.replace(/[^a-zA-Z0-9_-]/g,``).replace(/-+/g,`-`).replace(/^-|-$/g,``)||`flow`}function fi(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 pi(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:z(n),identityKey:r,quality:i,ttlMs:288e5,source:a,workspaceId:c}}function mi(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 hi(e){return typeof e.slug==`string`&&e.slug.length>0?e.slug:null}function gi(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 _i={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=fi(e.result),i=r?hi(r):null,a=i?di(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?gi(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(pi(`Flow started: ${n}${i?` — ${i}`:``}`,l,`flow-start-${a??n}`,`flow:start:${a??n}`,mi(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?gi(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(pi(`Step ${d}: ${f??o} (${u}/${l})`,p.join(` `),`flow-step-${a??``}-${o}-${n}`,`flow:step:${a??``}:${o}:${n}`,mi(p.join(` `)),e.toolName,[`flow:step`,`step:${n}`],a??void 0,e.workspaceId)),l>0&&t.push(pi(`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(pi(`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?gi(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(pi(`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(pi(`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:${z(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(pi(`Memory removed: ${n.slice(0,60)}`,`Explicit memory removal for "${n}".`,`memory-forget-${n}`,`memory:forget:${z(n).slice(0,12)}`,.7,e.toolName))}return t}};function vi(e,t){return e.match(t)?.[1]?.trim()||null}function yi(e,t,n,r,i,a){return{title:e,content:t,category:`context`,tags:n,hash:z(r),quality:i,source:a}}const bi={name:`environment-facts`,tools:[`env`,`config`,`status`],extract(e){let t=R(e.result);if(!t)return[];let n=[],r=vi(t,/node(?:\.js)?\s*[:=]\s*([^\r\n]+)/i);r&&n.push(yi(`Node.js version`,`Detected Node.js version: ${r}`,[`environment`,`node`],`node-version-${r}`,.4,e.toolName));let i=vi(t,/(?:^|\n)os\s*[:=]\s*([^\r\n]+)/i);i&&n.push(yi(`Operating system`,`Detected OS: ${i}`,[`environment`,`os`],`os-${i}`,.4,e.toolName));let a=vi(t,/workspace(?: path)?\s*[:=]\s*([^\r\n]+)/i);a&&n.push(yi(`Workspace path`,`Primary workspace path: ${a}`,[`environment`,`workspace`],`workspace-${a}`,.4,e.toolName));let o=vi(t,/store(?: backend)?\s*[:=]\s*([^\r\n]+)/i);o&&n.push(yi(`Store backend`,`Configured store backend: ${o}`,[`environment`,`storage`],`store-${o}`,.6,e.toolName));let s=vi(t,/embedding(?: model)?\s*[:=]\s*([^\r\n]+)/i);return s&&n.push(yi(`Embedding model`,`Configured embedding model: ${s}`,[`environment`,`embedding`],`embedding-${s}`,.6,e.toolName)),n}},xi={"search-result":800,"file-card":2e3,analysis:1500,"step-summary":3e3},Si=[`search`,`file_summary`,`stratum_card`,`compact`,`blast_radius`,`scope_map`,`flow`],Ci={search:`search-result`,file_summary:`file-card`,stratum_card:`file-card`,compact:`analysis`,blast_radius:`analysis`,scope_map:`step-summary`,flow:`step-summary`},wi={"search-result":72e5,"file-card":144e5,analysis:144e5,"step-summary":288e5};function Ti(e){return e.replace(/\s+/g,` `).trim()}function Ei(e){return Math.max(.6,Math.min(.8,Dr(e)))}function B(e,t=500){let n=Ti(e);return n.length<=t?n:`${n.slice(0,Math.max(0,t-3)).trimEnd()}...`}function Di(e){return typeof e==`object`&&!!e}function Oi(e){try{return JSON.parse(e)}catch{return null}}function V(e){return typeof e==`string`?Ti(e):typeof e==`number`||typeof e==`boolean`?String(e):``}function ki(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=Ti(r);e&&n.push(e);continue}if(Di(r)){let e=V(r.path)||V(r.sourcePath)||V(r.title)||V(r.name)||V(r.label);e&&n.push(e)}}return n}function H(e,...t){for(let n of t){let t=V(e[n]);if(t)return t}return``}function Ai(e){let t=[e.file,e.path,e.files,e.changed_files,e.changedFiles].flatMap(e=>typeof e==`string`?[Ti(e)]:ki(e,6));return[...new Set(t.filter(Boolean))].slice(0,6)}function ji(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=>Ti(e)))].slice(0,t)}function Mi(e,t){return e.length===0?``:`${t}: ${e.join(`, `)}`}function Ni(e,t=3){return e.split(/\r?\n/).map(e=>Ti(e)).filter(e=>e.length>=12).slice(0,t)}function Pi(e){if(!Di(e))return``;let t=V(e.title)||V(e.path)||V(e.sourcePath)||V(e.file),n=V(e.snippet)||V(e.preview)||V(e.content)||V(e.summary);return Ti([t,n&&`- ${n}`].filter(Boolean).join(` `))}function Fi(e,t){let n=H(e,`query`),r=Oi(t);if(Di(r)&&Array.isArray(r.results)){let e=r.results.map(e=>Pi(e)).filter(Boolean).slice(0,3);if(e.length>0)return B(`Query: ${n||`unknown`}. Top hits: ${e.join(` | `)}`,xi[`search-result`])}let i=Ni(t,3);return B(`Query: ${n||`unknown`}. Top hits: ${i.join(` | `)}`,xi[`search-result`])}function Ii(e,t){let n=H(e,`path`,`file`),r=Oi(t);if(Di(r)){let e=V(r.path)||n||`unknown file`,t=ki(r.imports,4),i=ki(r.exports,5),a=ki(r.functions,4),o=[`File: ${e}`,Mi(i,`Exports`),Mi(t,`Imports`),Mi(a,`Functions`)].filter(Boolean);if(o.length>1)return B(o.join(`. `),xi[`file-card`])}let i=Ni(t,4);return B(`File: ${n||`unknown file`}. Structure: ${i.join(` | `)}`,xi[`file-card`])}function Li(e,t){let n=Ai(e),r=H(e,`tier`)||`T1`,i=Oi(t);if(Di(i)){let e=(Array.isArray(i.cards)?i.cards:[]).map(e=>Pi(e)).filter(Boolean).slice(0,3);if(e.length>0)return B(`Tier: ${r}. Files: ${n.join(`, `)||`unknown`}. Cards: ${e.join(` | `)}`,xi[`file-card`])}let a=Ni(t,3);return B(`Tier: ${r}. Files: ${n.join(`, `)||`unknown`}. Highlights: ${a.join(` | `)}`,xi[`file-card`])}function Ri(e,t){let n=H(e,`path`,`file`),r=H(e,`query`);return B(`Path: ${n||`unknown`}. Focus: ${r||`general`}. Summary: ${t}`,xi.analysis)}function zi(e,t){let n=Ai(e),r=Oi(t),i=Di(r)?[...ki(r.affectedFiles,8),...ki(r.tests,4),...ki(r.importers,4)]:[],a=[...new Set([...i,...ji(t,8)])].slice(0,8),o=[`Changed: ${n.join(`, `)||`unknown`}`,Mi(a,`Affected`)].filter(Boolean);return o.length>1?B(o.join(`. `),xi.analysis):B(`Changed: ${n.join(`, `)||`unknown`}. Summary: ${t}`,xi.analysis)}function Bi(e,t){let n=H(e,`task`),r=Oi(t);if(Di(r)){let e=ki(r.files,6),t=typeof r.totalFiles==`number`?r.totalFiles:e.length;if(e.length>0)return B(`Task: ${n||`unknown`}. Reading plan (${t} files): ${e.join(`, `)}`,xi[`step-summary`])}let i=ji(t,6);return B(`Task: ${n||`unknown`}. Reading plan: ${i.join(`, `)||Ni(t,3).join(` | `)}`,xi[`step-summary`])}function Vi(e,t){let n=H(e,`action`),r=H(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 B([`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(` `),xi[`step-summary`])}catch{let e=Ni(t,3);return B(`Flow action: ${n||`unknown`}. ${e.join(` | `)}`,xi[`step-summary`])}}function Hi(e){let t=H(e,`action`),n=H(e,`name`),r=H(e,`advance`);return B(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 Ui(e){let t=H(e,`action`),n=H(e,`name`),r=H(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 Wi(e,t){switch(e.toolName){case`search`:return Fi(e.args,t);case`file_summary`:return Ii(e.args,t);case`stratum_card`:return Li(e.args,t);case`compact`:return Ri(e.args,t);case`blast_radius`:return zi(e.args,t);case`scope_map`:return Bi(e.args,t);case`flow`:return Vi(e.args,t);default:return``}}function Gi(e){switch(e.toolName){case`search`:return B(`Search: ${H(e.args,`query`)||`unknown query`}`,120);case`file_summary`:return B(`File summary: ${H(e.args,`path`,`file`)||`unknown file`}`,120);case`stratum_card`:return B(`Stratum card: ${Ai(e.args).join(`, `)||`unknown files`}${H(e.args,`tier`)?` (${H(e.args,`tier`)})`:``}`,120);case`compact`:return B(`Compact: ${H(e.args,`path`,`file`)||`unknown path`}${H(e.args,`query`)?` - ${H(e.args,`query`)}`:``}`,120);case`blast_radius`:return B(`Blast radius: ${Ai(e.args).join(`, `)||`unknown changes`}`,120);case`scope_map`:return B(`Scope map: ${H(e.args,`task`)||`unknown task`}`,120);case`flow`:return Hi(e.args);default:return B(`Flow context: ${e.toolName}`,120)}}function Ki(e){switch(e.toolName){case`search`:return`search:${H(e.args,`query`)||`unknown-query`}`;case`file_summary`:return`file-summary:${H(e.args,`path`,`file`)||`unknown-file`}`;case`stratum_card`:{let t=Ai(e.args).join(`,`),n=H(e.args,`tier`)||`unknown-tier`,r=H(e.args,`query`);return`stratum:${n}:${t}${r?`:${r}`:``}`}case`compact`:{let t=H(e.args,`path`,`file`)||`unknown-path`,n=H(e.args,`query`);return`compact:${t}${n?`:${n}`:``}`}case`blast_radius`:return`blast-radius:${Ai(e.args).join(`,`)||`unknown-changes`}`;case`scope_map`:return`scope-map:${H(e.args,`task`)||`unknown-task`}`;case`flow`:return Ui(e.args);default:return`${e.toolName}:generic`}}function qi(e){return{name:`flow-context`,tools:[...Si],extract(t){if(t.isError)return[];let n=e();if(!n?.active||!n.slug||!(t.toolName in Ci))return[];let r=R(t.result).trim();if(r.length<50)return[];let i=Ci[t.toolName],a=Wi(t,r);if(a.length<50)return[];let o=Gi(t);return[{title:o,content:a,category:`flow-context`,tags:[`flow-context`,`flow:${di(n.slug)}`,i,`tool:${t.toolName}`],hash:z(`${n.slug}|${t.toolName}|${o}|${a}`),identityKey:Ki(t),quality:Ei(a),ttlMs:wi[i],source:t.toolName}]}}}const Ji={name:`research-results`,tools:[`web_search`,`web_fetch`,`search`,`find`],extract(e){let t=R(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:z(`web-search-${r}`),quality:Math.min(.8,Dr(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:z(`web-fetch-${i}`),quality:Dr(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:z(`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:z(`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:z(`find-${r}-${i}-${a}-${o}`),quality:.55,source:e.toolName,ttlMs:36e5})}return n}};function Yi(e,t,n,r,i,a){return{title:e,content:t,category:`conventions`,tags:[`scaffold-behavior`,`tool-patterns`],hash:z(n),identityKey:r,quality:i,ttlMs:144e5,source:a}}const Xi={name:`scaffold-behavior`,tools:[`init`,`status`],maxFactsPerEvent:3,extract(e){if(e.isError)return[];let t=R(e.result);if(!t||t.length<20)return[];let n=[];if(e.toolName===`init`&&n.push(Yi(`Scaffold initialized`,`Workspace scaffold initialized. Result: ${t.slice(0,200)}.`,`scaffold-init-${e.timestamp}`,`scaffold:init:${z(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(Yi(`Scaffold capability: ${o}`,`Runtime status detected: extractors=${r}, hooks=${i}, knowledge=${a}. Result length: ${t.length} chars.`,`scaffold-status-${e.timestamp}`,`scaffold:status:${z(t).slice(0,12)}`,Math.min(.7,.3+t.length/2e3),e.toolName))}return n}};function Zi(e,t,n,r,i,a,o){return{title:e,content:t,category:`workflow`,tags:[`search-strategy`,`tool-patterns`],hash:z(n),identityKey:r,quality:i,ttlMs:a,source:o}}const Qi={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=R(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[Zi(`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:${z(t).slice(0,12)}:${e.toolName}`,Math.round(i*100)/100,144e5,e.toolName)]}},$i=new Set([`neighbors`,`traverse`,`find_nodes`,`symbol360`]),ea=144e5;function ta(e,t){return e.slice(0,t).trim()}function na(e,t){let n=ta(t,800);return n.length<80?[]:[{title:`Symbol: ${e}`,content:n,category:`patterns`,tags:[`architecture`,`symbol`,`definition`,`architecture-memory`,`invariant`],hash:z(`symbol-${e}`),quality:.7,ttlMs:ea,source:`symbol`}]}function ra(e,t,n){let r=ta(n,800);return r.length<100?[]:[{title:`Trace ${t}: ${e}`,content:r,category:`patterns`,tags:[`architecture`,`trace`,`data-flow`,t,`architecture-memory`,`invariant`],hash:z(`trace-${e}-${t}`),quality:.75,ttlMs:ea,source:`trace`}]}function ia(e,t){return e===`find_nodes`?`Graph nodes: ${t}`:e===`neighbors`?`Graph neighbors: ${t}`:e===`traverse`?`Graph traverse: ${t}`:`Symbol360: ${t}`}function aa(e,t,n,r,i){let a=ta(i,600);return a.length<50?[]:[{title:ia(e,t),content:a,category:`patterns`,tags:[`architecture`,`graph`,e],hash:z(`graph-${e}-${t}-${n}-${r}`),quality:.6,ttlMs:ea,source:`graph`}]}const oa={name:`symbol-analysis`,tools:[`symbol`,`trace`,`graph`],extract(e){let t=R(e.result);if(!t||e.isError)return[];if(e.toolName===`symbol`){let n=typeof e.args.name==`string`?e.args.name:``;return n?na(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?[]:ra(n,r,t)}if(e.toolName===`graph`){let n=typeof e.args.action==`string`?e.args.action:``;if(!$i.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 aa(n,n===`find_nodes`?i:r,a,o,t)}return[]}};function sa(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 ca(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 la={name:`test-results`,tools:[`check`,`test_run`],extract(e){let t=R(e.result);if(!t)return[];let n=[],r=sa(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:z(`test-framework-${r}`),quality:.7,source:e.toolName});let i=ca(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:z(`test-pattern-${i}`),quality:.7,source:e.toolName}),n}};function ua(e,t,n,r,i,a){return{title:e,content:t,category:`workflow`,tags:[`token-efficiency`,`optimization`],hash:z(n),identityKey:r,quality:i,ttlMs:144e5,source:a}}const da={name:`token-efficiency`,tools:[`compact`,`file_summary`],maxFactsPerEvent:3,extract(e){if(e.isError)return[];let t=R(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(ua(`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:${z(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(ua(`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:${z(r.join(`,`)).slice(0,12)}`,Math.round(s*100)/100,e.toolName))}return n}};function fa(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 pa={name:`tool-failure-patterns`,tools:[],extract(e){if(!e.isError)return[];let t=R(e.result);if(!t||t.length<30)return[];let{type:n,actionable:r}=fa(t);if(!r)return[];let i=t.slice(0,500),a=Dr(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:z(`smart-error-${n}-${e.toolName}-${t.slice(0,80)}`),quality:Math.min(.7,a+.1),source:e.toolName,ttlMs:72e5}]}},ma=k(`extractor-registry`),ha={defaultMaxFactsPerEvent:20,globalMaxFactsPerEvent:200};var ga=class{extractors=[];config;constructor(e={}){this.config={...ha,...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?(ma.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);ma.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 _a=new Set([`lifecycleOwnerToken`,`_ownerToken`,`ownerTokenSalt`,`ownerTokenHash`,`currentToken`]),U=k(`auto-knowledge`),va=2e3;var ya=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;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={...Er,...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);U.info(`Hydrated ${this.seenHashes.size} seen hashes from store`)}}catch(e){U.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){U.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=>{U.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}if(this.isSeenRecently(e)){this.dedupedCount++;continue}let i=this.buildFactIdentity(e);this.promotionEngine&&this.promotionEngine.recordObservation(e,i);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()){if(this.storedCount>=this.config.maxFactsPerSession)break;if(me.instance().isDegraded(`embedder`)){U.debug?.(`Auto-knowledge embedder degraded — buffering fact`),this.bufferFact(n);continue}try{await this.storeFact(n,e)}catch(e){U.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.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}}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=me.instance(),t=n=>{n.subsystem===`embedder`&&(e.removeListener(`healthy`,t),this.recoveryListener=null,this.recoveryListenerRegistered=!1,this.flushBuffer().catch(e=>{U.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}me.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()),U.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(me.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`)&&U.info(`Buffered fact stored on recovery`,{title:n.title,status:t})}catch(r){U.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:(U.warn(`Fact "${e.title}" content truncated from ${e.content.length} to ${va} chars`,{title:e.title,originalLength:e.content.length,maxChars:va}),e.content.slice(0,va-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 _a)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++,U.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}`;if(this.promotionEngine){let e=await this.promotionEngine.evaluate(i,n);if(e.status!==`promoted`)return this.droppedCount++,U.debug(`Fact not promoted`,{title:i.title,status:e.status,reason:e.reason}),`skipped`;this.promotedCount++}let 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++,U.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{U.warn(`Failed to load existing curated entries for dedup`,{})}return[]}scheduleBatch(){this.timer||=setTimeout(()=>{this.timer=null,this.flush().catch(e=>{U.warn(`Auto-knowledge flush error`,{error:String(e)})})},this.config.debounceMs)}};const ba=/```/,xa=/^\s*(?:import|export|function|class|interface|type|const|let|var|return|if|for|while|switch|try|catch|throw|await|async)\b/,Sa=/=>|;\s*$|{\s*$|}\s*$|:\s*(?:string|number|boolean|unknown|void|any|Record|Array|Set|Map|Promise|ReadonlyArray)\b/;function Ca(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 wa(e){if(Ca(e)||e.includes("```")||ba.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)(xa.test(e)||Sa.test(e))&&(n+=1);return n/t.length>=.25}function Ta(e){let t=e.meta?.compression?.preserve??`balanced`;if(t===`exact`||wa(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 Ea={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`}}},Da=Object.keys(Ea).filter(e=>!Ea[e]?.capabilities?.conditional),Oa=new Set(Object.entries(Ea).filter(([e,t])=>t.capabilities?.zeroDep).map(([e])=>e)),ka=new Set(Object.entries(Ea).filter(([e,t])=>t.capabilities?.indexIndependent).map(([e])=>e));function W(e){return Ea[e]??{title:e,annotations:{readOnlyHint:!1},category:[]}}function Aa(e){switch(e){case`efficient`:return{threshold:2e3,tokenBudget:1e3};case`full`:return{threshold:1/0};default:return{threshold:4e3,tokenBudget:2e3}}}function ja(e){let t=e?.threshold??4e3,n=e?.tokenBudget??2e3;return async(e,r)=>{if(W(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=Ta({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=dt({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 Ma=class{baseDir;getActiveSlug;constructor(e,t){this.baseDir=e,this.getActiveSlug=t}async initialize(){await Re(this.baseDir,{recursive:!0})}async read(e){let t=this.resolveScopedPath(e);if(t==null)return null;try{return await ze(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 Re(Pe(r),{recursive:!0}),await We(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 Ue(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 He(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 Be(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 Ve(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=Ie(n,r);if(i===``||i===`..`||i.startsWith(`..${Le}`)||Fe(i))throw Error(`Path escapes active flow context scope: ${e}`);return r}async collectFiles(e,t){let n;try{n=await Be(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 He(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 Be(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 Na={minSequenceLength:3,minRepetitions:3,maxSequenceLength:10,confidenceIncrement:10,confidenceDecrement:20},Pa=new Set([`status`,`guide`,`health`,`onboard`,`reindex`,`replay`,`session_digest`,`process`,`watch`,`produce_knowledge`,`list_tools`,`describe_tool`,`search_tools`]);function Fa(e){return e.join(`→`)}function Ia(e){return{...e,steps:[...e.steps]}}function La(e){return e.every(e=>e.success)}var Ra=class{config;history=[];sequences=new Map;procedures=new Map;pendingProcedures=new Map;constructor(e=Na){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=>Ia(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=>Ia(e));return this.pendingProcedures.clear(),e}requeueProcedures(e){for(let t of e)this.pendingProcedures.set(Fa(t.steps),Ia(t))}extractProcedure(e,t){return{id:qe(),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=Fa(n),s=0;for(let e=0;e<=t.length-a;e+=1)Fa(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,Ia(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);Fa(a.map(e=>e.toolName))===n&&(r.occurrences+=1,r.lastSeen=e,this.adjustConfidence(r,La(a)))}}};const za={recurrenceWeight:.3,confidenceWeight:.3,sourceDiversityWeight:.2,freshnessWeight:.1,actionabilityWeight:.1};function Ba(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 Va=k(`promotion-engine`);var Ha=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={...za,...e},this.stateStore=t,this.hydrateFromStore().catch(e=>{Va.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);Va.info(`Hydrated ${this.observationCache.size} observation records from store`)}catch(e){Va.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){Va.warn(`Failed to persist observation cache`,{error:String(e)})}}async evaluate(e,t){this.running&&Va.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=Ba(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 G=k(`skill-compiler`),Ua=new Set([`user-preference`,`collaboration`,`decision-style`,`tradeoff`,`architecture-memory`,`invariant`,`pitfall`,`prevention`,`review-gate`,`validation`,`repo-rule`,`constraint`,`tool-use`,`retrieval`]),Wa=new Set([`observation`,`source-search`,`type-pattern`,`type-error`,`type-test_failure`,`type-test-error`]);function Ga(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(Wa.has(t)||t.startsWith(`auto-`)||t.startsWith(`observation-`))return!0;return!1}const Ka={debounceMs:5e3,backgroundQueue:!0};var qa=class{skillDir;curated;getFlowState;wsRoot;config;debounceTimer=null;eventBusDisposer=null;pendingRegeneration=!1;isCompiling=!1;totalCompiles=0;failedCompiles=0;skippedCompiles=0;lastCompiledAt=null;currentVersion=1;flowBriefingManager;constructor(e,t={},n,r,i,a){this.skillDir=e,this.curated=r,this.getFlowState=i,this.wsRoot=a,this.config={...Ka,...t},this.curated=r??null,this.flowBriefingManager=new Ja(this.skillDir,this.config,this.curated,this.getFlowState),this.ensureDir(),this.loadVersion()}ensureDir(){M(this.skillDir)||Ee(this.skillDir,{recursive:!0});let e=P(this.skillDir,`references`);M(e)||Ee(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{Me(e,JSON.stringify({version:this.currentVersion,updated:new Date().toISOString()},null,2),`utf-8`)}catch(e){G.warn(`Failed to save skill manifest`,{error:String(e)})}}getStats(){let e=P(this.skillDir,Ye),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?Ae(e).size:0,skillVersion:this.currentVersion,pendingRegeneration:this.pendingRegeneration}}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,Ye);try{return M(e)?N(e,`utf-8`):null}catch(e){return G.warn(`Failed to read current skill file`,{error:String(e)}),null}}scheduleRegeneration(e){this.debounceTimer&&clearTimeout(this.debounceTimer),G.debug(`Skill compile scheduled (trigger: ${e}, debounce: ${this.config.debounceMs}ms)`),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.executeCompile(e).catch(t=>{G.error(`Scheduled compile failed`,{error:String(t),trigger:e})})},this.config.debounceMs)}scheduleImmediateRegeneration(e){this.debounceTimer&&=(clearTimeout(this.debounceTimer),null),G.debug(`Skill compile scheduled immediate (trigger: ${e})`),setImmediate(()=>{this.executeCompile(e).catch(t=>{G.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,G.debug(`Skill compile already in progress — pending flag set`);return}this.isCompiling=!0,this.pendingRegeneration=!1;try{do{let t=await this.loadSkillInput(),n=ft(t),r=this.readCurrentSkill();if(r&&!Pt(r,n)){G.debug(`Skill up to date — skipping compile`,{sourceHash:n}),this.skippedCompiles++;continue}G.info(`Skill compile starting`,{trigger:e,sourceHash:n});let i=Date.now(),a=Ot(t,this.currentVersion);await this.writeSkillAtomically(a.skillMarkdown,n),a.referencesMarkdown&&await this.writeReferencesAtomically(a.referencesMarkdown),this.lastCompiledAt=Date.now(),this.currentVersion++,this.saveVersion(),this.totalCompiles++,G.info(`Skill compile complete`,{durationMs:Date.now()-i,skillSize:a.skillMarkdown.length,refsSize:a.referencesMarkdown?.length??0,warnings:a.warnings.length}),this.pendingRegeneration&&(this.pendingRegeneration=!1,G.debug(`Pending regeneration detected — recompiling`))}while(this.pendingRegeneration)}catch(t){this.failedCompiles++,G.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)Ga(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)Ga(t)||t.contentPreview&&e.push({title:t.title,insight:t.contentPreview.slice(0,200),confidence:65,category:`retrieval`});for(let t of i)Ga(t)||t.contentPreview&&e.push({title:t.title,insight:t.contentPreview.slice(0,150),confidence:70,category:`context`});for(let t of a)Ga(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)Ua.has(e)||e.startsWith(`flow:`)||e.startsWith(`tool:`)||e.startsWith(`detector:`)||[`architecture`,`structure`,`analysis`,`dependencies`,`testing`].includes(e)||t.add(e);t.size>0&&G.warn(`Unknown self-improvement tags detected (check spelling):`,{tags:[...t].sort().join(`, `)})}catch{}}catch(e){G.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??Ne(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
+ `))}catch{G.warn(`Failed to parse package.json — structural bridge degraded`)}}if(!e.structure){let n=De(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=`**${Ne(t)}** workspace\n\n**Directories:**\n${r.slice(0,12).join(`
14
14
  `)}\n\n**Key files:**\n${i.slice(0,8).join(`
15
- `)}`)}}catch{G.warn(`Structural bridge failed — continuing with curated knowledge only`)}}findWorkspaceRoot(){let e=[];this.wsRoot&&e.push(this.wsRoot),e.push(Fe(this.skillDir)),e.push(Fe(Fe(this.skillDir)));for(let t of e)try{if(t&&j(N(t,`package.json`)))return t}catch{}return null}async writeSkillAtomically(e,t){let n=N(this.skillDir,Xe),r=N(this.skillDir,`.SKILL.tmp`),i=N(this.skillDir,`.SKILL.backup.md`);if(j(n))try{Ee(n,i)}catch{}if(Ne(r,e,`utf-8`),ke(r,n),j(i))try{Date.now()-je(i).mtimeMs>10080*60*1e3&&Me(i)}catch{}}isStaleFromCacheOrCheck(e){try{return!M(e,`utf-8`).match(/^---\n[\s\S]*?\n---\n/)}catch{return!0}}},Ga=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),G.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=di(e),n=N(this.skillDir,`references`,`flow-${t}.md`);try{j(n)&&(Me(n),G.debug(`Flow briefing deleted for slug ${e}`))}catch(t){G.warn(`Failed to delete flow briefing`,{slug:e,error:String(t)})}}readFlowBriefing(e){let t=di(e),n=N(this.skillDir,`references`,`flow-${t}.md`);try{if(!j(n))return null;let e=M(n,`utf-8`);return e.length>0?e:null}catch{return null}}async executeFlowBriefingCompile(e,t){if(!this.getFlowState){G.warn(`getFlowState not configured — skipping flow briefing compile`,{slug:e});return}let n=di(e);if(this.compilingSlugs.has(n)){this.pendingFlowBriefings.add(n),G.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){G.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=Ot({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=N(this.skillDir,`references`);j(l)||De(l,{recursive:!0});let u=N(l,`flow-${n}.md`),d=N(l,`.flow-${n}.tmp`);Ne(d,c,`utf-8`),ke(d,u),G.info(`Flow briefing compiled`,{slug:e,trigger:t,size:c.length})}catch(t){G.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=di(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=N(this.skillDir,`references`);try{if(!j(e))return null;let t=Oe(e).filter(e=>e.startsWith(`flow-`)&&e.endsWith(`.md`)).map(t=>({slug:t.replace(/^flow-/,``).replace(/\.md$/,``),mtime:je(N(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 Ka=O(`event-bus`);function qa(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`&&qa(r,t)}return Object.freeze(e)}const Ja=[`compression`,`hookDebug`,`origin`,`workspace`];var Ya=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),Ka.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)),Ka.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),qa(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),Ka.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),Ka.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)){Ka.warn(`EventBus meta must be a known meta shape or null`,{type:typeof e});return}let t=Object.keys(e);if(t.length===0){Ka.warn(`EventBus meta has no top-level keys`);return}for(let e of t)Ja.includes(e)||Ka.warn(`EventBus meta key not recognized`,{key:e,allowed:Ja})}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 Xa=O(`observation-store`),Za=1e3;var Qa=class{entries=new Map;artifacts=new Map;maxEntries;entryTtlMs;maxArtifacts;artifactInsertionOrder=[];storeCounter=0;constructor(e,t,n){this.maxEntries=e??Za,this.entryTtlMs=t??18e5,this.maxArtifacts=n??Math.floor((e??Za)/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 Xa.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&&Xa.debug(`Swept stale observation entries`,{count:t.length})}};const $a={search:5e4,check:1e5,test_run:1e5,onboard:5e5},eo={argsMaxChars:500,resultMaxChars:8e3,payloadMaxChars:16e3,artifactMaxChars:256e3};function to(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(`
16
- `,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 no(e,t,n=eo){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=to(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:to(e.text,l),truncated:!0},result:{...t,text:o,truncated:!0}}}function ro(e){try{return JSON.stringify(e)}catch{return`[Non-serializable args]`}}function io(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(`
17
- `);try{return JSON.stringify(e)}catch{return String(e)}}return String(e)}const ao=O(`observation-compressor`);function oo(){return{total:0,byTool:new Map,byOrigin:new Map,errors:0,successes:0,artifacts:0,truncations:0}}var so=class{store;counters=oo();budget;constructor(e,t){this.store=e??new Qa,this.budget={...eo,...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=ro(t),l={text:to(c,this.budget.argsMaxChars),truncated:c.length>this.budget.argsMaxChars,originalLength:c.length};l.truncated&&this.counters.truncations++;let u=io(n),d,f;u.length>this.budget.artifactMaxChars?(ao.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:to(u,this.budget.resultMaxChars),truncated:!0,originalLength:u.length,artifactRef:f}):d={text:u,truncated:!1,originalLength:u.length};let p={...this.budget,payloadMaxChars:$a[e]??this.budget.payloadMaxChars},m=no(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=oo(),this.store.clear()}};function co(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 lo=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 uo(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 uo(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 fo=O(`tool-pipeline`);function po(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function mo(e,t){return e.tools?(Array.isArray(e.tools)?e.tools:[e.tools]).includes(t):!0}function ho(e){return e.middleware.critical===!0}var go=class{entries=[];middlewareCache=new Map;decisionHookRegistry=new lo;observationCompressor;constructor(e){this.observationCompressor=e??new so}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=>mo(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{fo.warn(`workspaceId resolution failed — using empty string`,{toolName:e}),u=``}let d={toolName:e,args:po(c)?c:{},requestId:Je(),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&&fo.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=co(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(ho(r))throw t;if(fo.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 _o=O(`metrics-collector`),vo={maxL0Chars:4500,maxL0StaleMs:36e5,maxDuplicateRate:.05,maxEventPayloadKB:48,maxEventErrorRate:.01,maxReportEntries:50,maxReportBytes:20480};var yo=class{counters=new Map;gauges=new Map;thresholds;MAX_LABEL_COMBOS=50;constructor(e){this.thresholds={...vo,...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)}_o.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&&(_o.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&&(_o.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 _o.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 bo(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(`
18
- `):`_No curated entries yet._`}${i}`,mimeType:`text/markdown`}]}});let n=new Kn(`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 xo=O(`resources`);function So(e,t,n){if(!t){xo.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`}]}}),xo.debug(`Hooks config resource registered`,{subscriberCount:t.getStats().totalSubscribers,decisionHookCount:n?.getStats().count??0})}const Co=O(`resources`),wo=`aikit://schemas/channel-surface`,To=new URL(`../../../blocks-core/schemas/channel-surface.schema.json`,import.meta.url);let Eo;function Do(){return Eo??=Be(To,`utf8`),Eo}const Oo=[{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 ko(e){let t={schema:JSON.parse(e),blockCatalog:Oo,presetCatalog:`aikit://present/presets`,templateCatalog:`aikit://present/templates`};return JSON.stringify(t,null,2)}function Ao(e,t,n,r,i,a,o){So(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(`
19
- `),mimeType:`text/plain`}]})),e.registerResource(`aikit-channel-surface-schema`,wo,{description:`Composite catalog: ChannelSurface JSON Schema, block types, and resource URIs`,mimeType:`application/json`},async()=>({contents:[{uri:wo,text:ko(await Do()),mimeType:`application/json`}]})),bo(e,n),r?(e.registerResource(`aikit-skill-index`,`aikit://skill`,{description:`Index of available workspace skill files for the current workspace`,mimeType:`text/markdown`},async()=>({contents:[{uri:`aikit://skill`,text:`# Workspace Skill\n\n${[`- [SKILL.md](aikit://skill/SKILL.md) — Workspace conventions, known issues, and workflow tips`].join(`
20
- `)}`,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()=>{let e=N(r,`SKILL.md`),t,n=``;if(o){let e=o.getStats();e.isStale&&e.skillExists&&(n=`
15
+ `)}`)}}catch{G.warn(`Structural bridge failed — continuing with curated knowledge only`)}}findWorkspaceRoot(){let e=[];this.wsRoot&&e.push(this.wsRoot),e.push(Pe(this.skillDir)),e.push(Pe(Pe(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 Ne(e)}let t=Ne(Pe(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,Ye),r=P(this.skillDir,`.SKILL.tmp`),i=P(this.skillDir,`.SKILL.backup.md`);if(M(n))try{Te(n,i)}catch{}if(Me(r,e,`utf-8`),Oe(r,n),M(i))try{Date.now()-Ae(i).mtimeMs>10080*60*1e3&&je(i)}catch{}}async writeReferencesAtomically(e){let t=P(this.skillDir,`references`);M(t)||Ee(t,{recursive:!0});let n=P(t,`workspace-memory.md`),r=P(t,`.workspace-memory.tmp`);Me(r,e,`utf-8`),Oe(r,n)}isStaleFromCacheOrCheck(e){try{return!N(e,`utf-8`).match(/^---\n[\s\S]*?\n---\n/)}catch{return!0}}},Ja=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),G.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=di(e),n=P(this.skillDir,`references`,`flow-${t}.md`);try{M(n)&&(je(n),G.debug(`Flow briefing deleted for slug ${e}`))}catch(t){G.warn(`Failed to delete flow briefing`,{slug:e,error:String(t)})}}readFlowBriefing(e){let t=di(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){G.warn(`getFlowState not configured — skipping flow briefing compile`,{slug:e});return}let n=di(e);if(this.compilingSlugs.has(n)){this.pendingFlowBriefings.add(n),G.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){G.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=Dt({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)||Ee(l,{recursive:!0});let u=P(l,`flow-${n}.md`),d=P(l,`.flow-${n}.tmp`);Me(d,c,`utf-8`),Oe(d,u),G.info(`Flow briefing compiled`,{slug:e,trigger:t,size:c.length})}catch(t){G.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=di(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=De(e).filter(e=>e.startsWith(`flow-`)&&e.endsWith(`.md`)).map(t=>({slug:t.replace(/^flow-/,``).replace(/\.md$/,``),mtime:Ae(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 Ya=k(`event-bus`);function Xa(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`&&Xa(r,t)}return Object.freeze(e)}const Za=[`compression`,`hookDebug`,`origin`,`workspace`];var Qa=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),Ya.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)),Ya.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),Xa(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),Ya.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),Ya.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)){Ya.warn(`EventBus meta must be a known meta shape or null`,{type:typeof e});return}let t=Object.keys(e);if(t.length===0){Ya.warn(`EventBus meta has no top-level keys`);return}for(let e of t)Za.includes(e)||Ya.warn(`EventBus meta key not recognized`,{key:e,allowed:Za})}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 $a=k(`observation-store`),eo=1e3;var to=class{entries=new Map;artifacts=new Map;maxEntries;entryTtlMs;maxArtifacts;artifactInsertionOrder=[];storeCounter=0;constructor(e,t,n){this.maxEntries=e??eo,this.entryTtlMs=t??18e5,this.maxArtifacts=n??Math.floor((e??eo)/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 $a.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&&$a.debug(`Swept stale observation entries`,{count:t.length})}};const no={search:5e4,check:1e5,test_run:1e5,onboard:5e5},ro={argsMaxChars:500,resultMaxChars:8e3,payloadMaxChars:16e3,artifactMaxChars:256e3};function io(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(`
16
+ `,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 ao(e,t,n=ro){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=io(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:io(e.text,l),truncated:!0},result:{...t,text:o,truncated:!0}}}function oo(e){try{return JSON.stringify(e)}catch{return`[Non-serializable args]`}}function so(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(`
17
+ `);try{return JSON.stringify(e)}catch{return String(e)}}return String(e)}const co=k(`observation-compressor`);function lo(){return{total:0,byTool:new Map,byOrigin:new Map,errors:0,successes:0,artifacts:0,truncations:0}}var uo=class{store;counters=lo();budget;constructor(e,t){this.store=e??new to,this.budget={...ro,...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=oo(t),l={text:io(c,this.budget.argsMaxChars),truncated:c.length>this.budget.argsMaxChars,originalLength:c.length};l.truncated&&this.counters.truncations++;let u=so(n),d,f;u.length>this.budget.artifactMaxChars?(co.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:io(u,this.budget.resultMaxChars),truncated:!0,originalLength:u.length,artifactRef:f}):d={text:u,truncated:!1,originalLength:u.length};let p={...this.budget,payloadMaxChars:no[e]??this.budget.payloadMaxChars},m=ao(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=lo(),this.store.clear()}};function fo(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 po=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 mo(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 mo(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 ho=k(`tool-pipeline`);function go(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function _o(e,t){return e.tools?(Array.isArray(e.tools)?e.tools:[e.tools]).includes(t):!0}function vo(e){return e.middleware.critical===!0}var yo=class{entries=[];middlewareCache=new Map;decisionHookRegistry=new po;observationCompressor;constructor(e){this.observationCompressor=e??new uo}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=>_o(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{ho.warn(`workspaceId resolution failed — using empty string`,{toolName:e}),u=``}let d={toolName:e,args:go(c)?c:{},requestId:qe(),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&&ho.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=fo(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(vo(r))throw t;if(ho.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 bo=k(`metrics-collector`),xo={maxL0Chars:4500,maxL0StaleMs:36e5,maxDuplicateRate:.05,maxEventPayloadKB:48,maxEventErrorRate:.01,maxReportEntries:50,maxReportBytes:20480};var So=class{counters=new Map;gauges=new Map;thresholds;MAX_LABEL_COMBOS=50;constructor(e){this.thresholds={...xo,...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)}bo.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&&(bo.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&&(bo.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 bo.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 Co(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(`
18
+ `):`_No curated entries yet._`}${i}`,mimeType:`text/markdown`}]}});let n=new Gn(`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 wo=k(`resources`);function To(e,t,n){if(!t){wo.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`}]}}),wo.debug(`Hooks config resource registered`,{subscriberCount:t.getStats().totalSubscribers,decisionHookCount:n?.getStats().count??0})}const Eo=k(`resources`),Do=`aikit://schemas/channel-surface`,Oo=new URL(`../../../blocks-core/schemas/channel-surface.schema.json`,import.meta.url);let ko;function Ao(){return ko??=ze(Oo,`utf8`),ko}const jo=[{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 Mo(e){let t={schema:JSON.parse(e),blockCatalog:jo,presetCatalog:`aikit://present/presets`,templateCatalog:`aikit://present/templates`};return JSON.stringify(t,null,2)}function No(e,t,n,r,i,a,o){To(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(`
19
+ `),mimeType:`text/plain`}]})),e.registerResource(`aikit-channel-surface-schema`,Do,{description:`Composite catalog: ChannelSurface JSON Schema, block types, and resource URIs`,mimeType:`application/json`},async()=>({contents:[{uri:Do,text:Mo(await Ao()),mimeType:`application/json`}]})),Co(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(`
20
+ `)}`,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
21
+
22
+ 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=`
21
23
 
22
24
  > ⚠ *This skill may be stale. Trigger regeneration via onboard, reindex, or flow completion.*
23
- `)}try{t=j(e)?M(e,`utf-8`)+n:`# Workspace Skill: not generated
25
+ `)}try{t=M(e)?N(e,`utf-8`)+n:`# Workspace Skill: not generated
24
26
 
25
27
  Run \`onboard({ path: "." })\` to generate this skill.`+n}catch{t=`# Workspace Skill: error
26
28
 
27
- Failed to read skill file.`}return{contents:[{uri:`aikit://skill/SKILL.md`,text:t,mimeType:`text/markdown`}]}}),Co.debug(`Workspace skill resources registered`,{skillDir:r})):Co.debug(`skillDir not configured — skill resources skipped`)}new Set(Object.entries(U).filter(([e,t])=>t.planner?.effect===`read`).map(([e])=>e)),new Set(Object.entries(U).filter(([e,t])=>{let n=t.planner?.effect;return n===`write`||n===`mixed`||n===`destructive`}).map(([e])=>e)),new Set(Object.entries(U).filter(([e,t])=>t.planner?.costClass===`tiny`).map(([e])=>e));const jo=[`er_push`,`er_pull`,`er_sync_status`],Mo=[...jo,`er_update_policy`,`er_evolve_review`],No=new Set(Mo);function Po(e){return e.toolProfiles}const Fo=5e3,Io=O(`structured-content-guard`);function Lo(){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=Ro(r);n.structuredContent=t,i=`synthesize`,n.structuredContent??(n.structuredContent={},i=`synthesize-null-fallback`,Io.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),Vo(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),Bo(r,n.structuredContent)===!1){let e=Ro(r);n.structuredContent=e??{},Bo(r,n.structuredContent)===!1?(n.structuredContent=Vo(n.structuredContent)?n.structuredContent:{},i=`final-validation-failed`):i??=`final-heal`}return n});return e.critical=!0,e}function Ro(e){try{return Ho(e)??{}}catch{return{}}}function zo(e,t){if(Bo(e,t)!==!1)return{structuredContent:t,action:null};try{let n=Ro(e);if(Vo(n)&&Vo(t)){let r={...n,...t};if(Bo(e,r)!==!1)return{structuredContent:r,action:`heal`}}return{structuredContent:n,action:`fallback-zero-value`}}catch{return{structuredContent:t,action:null}}}function Bo(e,t){let n=e.safeParse;if(typeof n==`function`)try{return n(t).success}catch{return}}function Vo(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ho(e){if(!e)return{};if(e.anyOf){let t=e.anyOf.find(e=>e.type!==`null`);return t?Ho(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]=Ho(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]=Ho(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 Uo(e){if(!e)return{};try{let t=Ho(e);return Vo(t)?t:{}}catch{return{}}}const Wo=Symbol(`toolPipelineState`);function Go(e){return e[Wo]}function Ko(e,t){e[Wo]=t}function qo(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=Uo(t),i.structuredContent??={},r)}:e}function Jo(e,t,n=``,r,i){let a=Go(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};Ko(e,o),e.registerTool=(n,r,i)=>{let a=Go(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=qo(i,c);return a?.originalRegisterTool(s,r,e)}let l=W(n),u=a??o,d=qo(u.pipeline.wrap(n,i,r,l,u.eventBus,u.workspaceId),c);return a?.originalRegisterTool(s,r,d)}}const Yo={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 Xo(e,t){return e.filter(e=>(Yo[e]??0)<=t)}const Zo=new Set([`status`,`config`]),Qo={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`,`describe_tool`,`search_tools`]}};function $o(e,t){let n=Qo[e];if(n)return n;let r=t?.[e];if(r)return r;throw Error(`Unknown tool profile: ${e}`)}function es(e,t,n){return t.includes(`*`)?!0:(n[e]?.category??[]).some(e=>t.includes(e))}function ts(e,t,n,r){if(t.includes(`*`)){for(let t of n)e.add(t);return}for(let i of n)es(i,t,r)&&e.add(i)}function ns(e,t,n){if(t.includes(`*`)){e.clear();return}for(let r of[...e])es(r,t,n)&&e.delete(r)}function rs(e,t,n){if(!e||e.length===0||e.includes(`*`))return new Set(t);let r=new Set;return ts(r,e,t,n),r}function is(e,t){return e===void 0?t:t===void 0?e:Math.min(e,t)}function as(e,t){for(let n of[...e])t[n]?.annotations?.readOnlyHint===!1&&e.delete(n)}function os(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=$o(e,t);return is(i.extends?os(i.extends,t,n+1,[...r,e]):void 0,i.maxTier)}function ss(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=$o(e,r),c=[...o,e],l=s.extends?i(s.extends,a+1,c):rs(s.includeCategories,t,n);s.extends&&s.includeCategories?.length&&ts(l,s.includeCategories,t,n),s.excludeCategories?.length&&ns(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=os(e,r);if(o!==void 0){let e=Xo([...a],o);a.clear();for(let t of e)a.add(t)}for(let e of Zo)a.add(e);return e===`safe`&&as(a,n),a}const cs=new Set([`search`,`analysis`,`knowledge`,`compression`,`forge`,`presentation`,`execution`,`manipulation`,`session`,`git`,`process`,`system`,`meta`,`utilities`,`web`,`queue`,`flow`]);function ls(e,t,n,r){let i=process.env.AIKIT_TOOLSET||e.toolProfile||`full`,a=ss(i,t,n,r);if(e.features&&e.features.length>0){let i=e.features.filter(e=>!cs.has(e));if(i.length>0)throw Error(`Unknown feature group(s): ${i.join(`, `)}. Valid categories: ${[...cs].join(`, `)}`);let o={description:`Synthetic profile from features config`,includeCategories:e.features},s=ss(`_features`,t,n,{...r,_features:o});for(let e of a)!s.has(e)&&!Zo.has(e)&&a.delete(e)}if(e.readOnly)for(let e of[...a])n[e]?.annotations?.readOnlyHint===!1&&!Zo.has(e)&&a.delete(e);for(let e of Zo)a.add(e);return i===`safe`&&as(a,n),a}const us=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()}),ds=I.object({kind:I.enum([`onboard`,`reindex`,`handoff`,`proceed`]),reason:I.string()}),fs=I.object({title:I.string(),insight:I.string(),confidence:I.number()}),ps=I.object({lessons:I.array(fs),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:us,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:ds,prelude:ps.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 ms=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()}))}),hs=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 gs=I.object({passed:I.boolean(),errorCount:I.number(),warningCount:I.number(),topErrors:I.array(I.string())}),_s=I.object({passed:I.boolean(),tsc:gs,biome:gs}),vs=I.object({name:I.string(),path:I.string(),depth:I.number()}),ys=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(vs),callees:I.array(vs)}).nullable(),confidence:I.number().nullable(),method:I.string().nullable(),rationale:I.string().nullable(),error:I.string().optional()}),bs=I.object({symbols:I.array(ys)}),xs=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()}),Ss=I.object({results:I.array(xs),totalResults:I.number(),searchMode:I.string(),query:I.string(),ref:I.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Cs=I.object({path:I.string(),line:I.number().optional(),matchType:I.string(),preview:I.string()}),ws=I.object({matches:I.array(Cs),totalMatches:I.number(),pattern:I.string(),truncated:I.boolean(),ref:I.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Ts=I.object({path:I.string(),relevance:I.number(),estimatedTokens:I.number(),focusLines:I.array(I.string()).optional()}),Es=I.object({files:I.array(Ts),totalFiles:I.number(),totalEstimatedTokens:I.number(),task:I.string()}),Ds=I.object({path:I.string(),impact:I.string(),reason:I.string()});I.object({changedFiles:I.array(I.string()),affectedFiles:I.array(Ds),totalAffected:I.number(),riskLevel:I.string()});const Os=I.object({name:I.string(),passed:I.boolean(),message:I.string().optional(),severity:I.string().optional()}),ks=I.object({passed:I.boolean(),score:I.number(),checks:I.array(Os),summary:I.string()}),As=I.object({id:I.string(),name:I.string(),type:I.string(),sourcePath:I.string().optional()}),js=I.object({fromId:I.string(),toId:I.string(),fromName:I.string(),toName:I.string(),type:I.string()}),Ms=I.object({id:I.string(),name:I.string(),type:I.string()}),Ns=I.object({id:I.string(),nodeCount:I.number(),types:I.record(I.string(),I.number()),samples:I.array(Ms)}),Ps=I.object({nodes:I.array(As),edges:I.array(js),communities:I.array(Ns).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 Fs=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()}))}),Is=I.object({sourceId:I.string(),value:I.string()}),Ls=I.object({id:I.string(),originalChars:I.number(),keptChars:I.number(),segmentsKept:I.number(),segmentsTotal:I.number()}),Rs=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(Is)),sourceStats:I.array(Ls),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()}))}),Bs=O(`utils:enrich`);async function K(e,t){let n={curated:[],graph:[]},r=t.limit??3,[i,a]=await Promise.allSettled([Vs(e,t.query,r),Hs(e,t.filePath)]);return i.status===`fulfilled`?n.curated=i.value:Bs.debug(`Curated enrichment failed`,{error:i.reason}),a.status===`fulfilled`?n.graph=a.value:Bs.debug(`Graph enrichment failed`,{error:a.reason}),n}async function Vs(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=>Us(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=>Us(e.record))}return[]}catch(e){return Bs.debug(`Curated enrichment failed`,{error:e}),[]}}async function Hs(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 Bs.debug(`Graph enrichment failed`,{error:e}),[]}}function q(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(`
28
- `)}`}function Us(e){let t=Ws(e.metadata,`title`)||e.sourcePath||`Untitled`;return`[${Ws(e.metadata,`category`)}] ${t}: ${e.content.slice(0,200)}`}function Ws(e,t){let n=e?.[t];return typeof n==`string`?n:``}function J(e,t,n){return{content:[{type:`text`,text:`[ERROR:${e}] ${t}`}],isError:!0,...n==null?{}:{structuredContent:n}}}function Y(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 Gs=O(`tools`),Ks=I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`);function qs(e,t){return t?F(e,t):e}function Js(){let e=[];return tr.get()||e.push(`Tree-sitter unavailable — using regex fallback, symbol/pattern confidence reduced`),e.length===0?``:`\n\n> **⚠ Caveats:** ${e.join(`; `)}`}async function Ys(e,t,n,r,i){try{let a=`produced/analysis/${n}/${k(r,12)}.md`,o=Ke(`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:Ke(`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),Gs.info(`Auto-persisted analysis`,{analyzerName:n,chunkCount:l.length})}catch(e){Gs.warn(`Auto-persist analysis failed`,{analyzerName:n,...A(e)})}}const Xs=I.enum([`structure`,`dependencies`,`symbols`,`patterns`,`entry_points`,`diagram`]),Zs=I.string().describe(`Root path to analyze`),Qs=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.`),$s=I.object({path:Zs,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:Ks,enrich:Qs}),ec=I.object({path:Zs,format:I.enum([`json`,`markdown`,`mermaid`]).default(`markdown`).describe(`Output format`),max_tokens:Ks,enrich:Qs}),tc=I.object({path:Zs,filter:I.string().optional().describe(`Filter symbols by name substring`),format:I.enum([`json`,`markdown`]).default(`markdown`).describe(`Output format`),enrich:Qs}),nc=I.object({path:Zs,enrich:Qs}),rc=I.object({path:Zs,enrich:Qs}),ic=I.object({path:Zs,diagram_type:I.enum([`architecture`,`dependencies`]).default(`architecture`).describe(`Type of diagram`),enrich:Qs}),ac=I.object({path:Zs,aspect:Xs.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"`)}),oc=I.object({items:I.array(ac).min(1).describe(`Array of analysis requests to run in batch.`),max_tokens:Ks,enrich:Qs});async function sc(e,t,n,r){return!n||!r?e:e+q(await K(r,{query:t,filePath:t}))}async function cc(e,{store:t,embedder:n,enrichDeps:r}){let i=new Qn,{path:a,max_depth:o,format:s,max_tokens:c,enrich:l}=$s.parse(e),u=await i.analyze(a,{format:s,maxDepth:o,maxTokens:c});Ys(t,n,`structure`,a,u.output);let d=u.data;return{content:[{type:`text`,text:qs(await sc(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 lc(e,{store:t,embedder:n,enrichDeps:r}){let i=new qn,{path:a,format:o,max_tokens:s,enrich:c}=ec.parse(e),l=await i.analyze(a,{format:o});return Ys(t,n,`dependencies`,a,l.output),{content:[{type:`text`,text:qs(await sc(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 uc(e,{store:t,embedder:n,enrichDeps:r}){let i=new $n,{path:a,filter:o,format:s,enrich:c}=tc.parse(e),l=await i.analyze(a,{format:s,filter:o});return Ys(t,n,`symbols`,a,l.output),{content:[{type:`text`,text:await sc(l.output+Js()+'\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 dc(e,{store:t,embedder:n,enrichDeps:r}){let i=new Zn,{path:a,enrich:o}=nc.parse(e),s=await i.analyze(a);return Ys(t,n,`patterns`,a,s.output),{content:[{type:`text`,text:await sc(s.output+Js()+'\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 fc(e,{store:t,embedder:n,enrichDeps:r}){let i=new Yn,{path:a,enrich:o}=rc.parse(e),s=await i.analyze(a);return Ys(t,n,`entry-points`,a,s.output),{content:[{type:`text`,text:await sc(s.output+Js()+'\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 pc(e,{store:t,embedder:n,enrichDeps:r}){let i=new Jn,{path:a,diagram_type:o,enrich:s}=ic.parse(e),c=await i.analyze(a,{diagramType:o});return Ys(t,n,`diagram`,a,c.output),{content:[{type:`text`,text:await sc(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 cc(t,n);case`dependencies`:return lc(t,n);case`symbols`:return uc(t,n);case`patterns`:return dc(t,n);case`entry_points`:return fc(t,n);case`diagram`:return pc(t,n)}}function hc(e,t,n,r){let i=W(`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:oc.shape,annotations:i.annotations},Y(`analyze`,async e=>{try{let i=oc.parse(e);if(!i.items||i.items.length===0)return J(`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(`
29
+ Failed to read skill file.`}return{contents:[{uri:`aikit://skill/SKILL.md`,text:t,mimeType:`text/markdown`}]}}),r?Eo.debug(`Workspace skill resources registered`,{skillDir:r}):Eo.debug(`skillDir not configured — skill resources registered with diagnostic messages`)}new Set(Object.entries(Ea).filter(([e,t])=>t.planner?.effect===`read`).map(([e])=>e)),new Set(Object.entries(Ea).filter(([e,t])=>{let n=t.planner?.effect;return n===`write`||n===`mixed`||n===`destructive`}).map(([e])=>e)),new Set(Object.entries(Ea).filter(([e,t])=>t.planner?.costClass===`tiny`).map(([e])=>e));const Po=[`er_push`,`er_pull`,`er_sync_status`],Fo=[...Po,`er_update_policy`,`er_evolve_review`],Io=new Set(Fo);function Lo(e){return e.toolProfiles}const Ro=5e3,zo=k(`structured-content-guard`);function Bo(){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=Vo(r);n.structuredContent=t,i=`synthesize`,n.structuredContent??(n.structuredContent={},i=`synthesize-null-fallback`,zo.error(`synthesizeStructuredContent returned null/undefined — using empty fallback`,{tool:e.toolName}))}let a=Ho(r,n.structuredContent);if(a.action!=null&&(n.structuredContent=a.structuredContent,i=a.action),Wo(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),Uo(r,n.structuredContent)===!1){let e=Vo(r);n.structuredContent=e??{},Uo(r,n.structuredContent)===!1?(n.structuredContent=Wo(n.structuredContent)?n.structuredContent:{},i=`final-validation-failed`):i??=`final-heal`}return n});return e.critical=!0,e}function Vo(e){try{return Go(e)??{}}catch{return{}}}function Ho(e,t){if(Uo(e,t)!==!1)return{structuredContent:t,action:null};try{let n=Vo(e);if(Wo(n)&&Wo(t)){let r={...n,...t};if(Uo(e,r)!==!1)return{structuredContent:r,action:`heal`}}return{structuredContent:n,action:`fallback-zero-value`}}catch{return{structuredContent:t,action:null}}}function Uo(e,t){let n=e.safeParse;if(typeof n==`function`)try{return n(t).success}catch{return}}function Wo(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Go(e){if(!e)return{};if(e.anyOf){let t=e.anyOf.find(e=>e.type!==`null`);return t?Go(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]=Go(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]=Go(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 Ko(e){if(!e)return{};try{let t=Go(e);return Wo(t)?t:{}}catch{return{}}}const qo=Symbol(`toolPipelineState`);function Jo(e){return e[qo]}function Yo(e,t){e[qo]=t}function Xo(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=Ko(t),i.structuredContent??={},r)}:e}function Zo(e,t,n=``,r,i){let a=Jo(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};Yo(e,o),e.registerTool=(n,r,i)=>{let a=Jo(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=Xo(i,c);return a?.originalRegisterTool(s,r,e)}let l=W(n),u=a??o,d=Xo(u.pipeline.wrap(n,i,r,l,u.eventBus,u.workspaceId),c);return a?.originalRegisterTool(s,r,d)}}const Qo={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 $o(e,t){return e.filter(e=>(Qo[e]??0)<=t)}const es=new Set([`status`,`config`]),ts={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 ns(e,t){let n=ts[e];if(n)return n;let r=t?.[e];if(r)return r;throw Error(`Unknown tool profile: ${e}`)}function rs(e,t,n){return t.includes(`*`)?!0:(n[e]?.category??[]).some(e=>t.includes(e))}function is(e,t,n,r){if(t.includes(`*`)){for(let t of n)e.add(t);return}for(let i of n)rs(i,t,r)&&e.add(i)}function as(e,t,n){if(t.includes(`*`)){e.clear();return}for(let r of[...e])rs(r,t,n)&&e.delete(r)}function os(e,t,n){if(!e||e.length===0||e.includes(`*`))return new Set(t);let r=new Set;return is(r,e,t,n),r}function ss(e,t){return e===void 0?t:t===void 0?e:Math.min(e,t)}function cs(e,t){for(let n of[...e])t[n]?.annotations?.readOnlyHint===!1&&e.delete(n)}function ls(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=ns(e,t);return ss(i.extends?ls(i.extends,t,n+1,[...r,e]):void 0,i.maxTier)}function us(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=ns(e,r),c=[...o,e],l=s.extends?i(s.extends,a+1,c):os(s.includeCategories,t,n);s.extends&&s.includeCategories?.length&&is(l,s.includeCategories,t,n),s.excludeCategories?.length&&as(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=ls(e,r);if(o!==void 0){let e=$o([...a],o);a.clear();for(let t of e)a.add(t)}for(let e of es)a.add(e);return e===`safe`&&cs(a,n),a}const ds=new Set([`search`,`analysis`,`knowledge`,`compression`,`forge`,`presentation`,`execution`,`manipulation`,`session`,`git`,`process`,`system`,`meta`,`utilities`,`web`,`queue`,`flow`]);function fs(e,t,n,r){let i=process.env.AIKIT_TOOLSET||e.toolProfile||`full`,a=us(i,t,n,r);if(e.features&&e.features.length>0){let i=e.features.filter(e=>!ds.has(e));if(i.length>0)throw Error(`Unknown feature group(s): ${i.join(`, `)}. Valid categories: ${[...ds].join(`, `)}`);let o={description:`Synthetic profile from features config`,includeCategories:e.features},s=us(`_features`,t,n,{...r,_features:o});for(let e of a)!s.has(e)&&!es.has(e)&&a.delete(e)}if(e.readOnly)for(let e of[...a])n[e]?.annotations?.readOnlyHint===!1&&!es.has(e)&&a.delete(e);for(let e of es)a.add(e);return i===`safe`&&cs(a,n),a}const ps=L.object({mode:L.enum([`wasm`,`regex`,`unknown`]),reason:L.string(),pathsChecked:L.array(L.object({path:L.string(),exists:L.boolean()})),os:L.string(),arch:L.string(),nodeVersion:L.string(),webTreeSitterImportable:L.boolean(),healAttempted:L.boolean(),healSuccess:L.boolean(),healError:L.string().nullable(),initError:L.string().nullable(),wasmDir:L.string().nullable(),grammarCount:L.number()}),ms=L.object({kind:L.enum([`onboard`,`reindex`,`handoff`,`proceed`]),reason:L.string()}),hs=L.object({title:L.string(),insight:L.string(),confidence:L.number()}),gs=L.object({lessons:L.array(hs),conventions:L.array(L.object({title:L.string(),preview:L.string()})),checkpoint:L.string().nullable()});L.object({totalRecords:L.number(),totalFiles:L.number(),lastIndexedAt:L.string().nullable(),onboarded:L.boolean(),onboardDir:L.string(),contentTypes:L.record(L.string(),L.number()),wasmAvailable:L.boolean(),wasmDiagnostics:ps,graphStats:L.object({nodes:L.number(),edges:L.number()}).nullable(),curatedCount:L.number(),serverVersion:L.string(),scaffoldVersion:L.string().nullable(),workspaceScaffoldVersion:L.string().nullable(),upgradeAvailable:L.boolean(),sessionTokens:L.object({callCount:L.number(),totalInputChars:L.number(),totalOutputChars:L.number(),estInputTokens:L.number(),estTotalTokens:L.number(),startTime:L.string()}).optional(),storeBackend:L.string().optional(),storeDiagnostics:L.object({adapterType:L.string(),vectorSearchEnabled:L.boolean(),ftsEnabled:L.boolean(),degradedMode:L.boolean(),dbPath:L.string(),dbSizeBytes:L.number().nullable(),embeddingDim:L.number(),vectorDtype:L.string()}).nullable().optional(),contextPressure:L.number().min(0).max(100).describe(`0–100 score indicating AI Kit saturation`),nextAction:ms,prelude:gs.nullable().optional()}).catchall(L.any()),L.object({ok:L.boolean(),checks:L.array(L.object({name:L.string(),ok:L.boolean(),message:L.string().optional()}))});const _s=L.object({summary:L.object({totalFiles:L.number(),totalLines:L.number(),totalCodeLines:L.number(),totalFunctions:L.number(),avgComplexity:L.number(),maxComplexity:L.object({value:L.number(),file:L.string()})}),files:L.array(L.object({path:L.string(),lines:L.number(),code:L.number(),complexity:L.number(),functions:L.number()}))}),vs=L.object({platform:L.string(),arch:L.string(),nodeVersion:L.string(),cwd:L.string(),cpus:L.number(),memoryFreeGb:L.number(),memoryTotalGb:L.number()});L.object({iso:L.string(),unix:L.number(),timezone:L.string(),formatted:L.string()});const ys=L.object({passed:L.boolean(),errorCount:L.number(),warningCount:L.number(),topErrors:L.array(L.string())}),bs=L.object({passed:L.boolean(),tsc:ys,biome:ys}),xs=L.object({name:L.string(),path:L.string(),depth:L.number()}),Ss=L.object({name:L.string(),definedIn:L.object({path:L.string(),line:L.number(),kind:L.string(),signature:L.string().optional()}).nullable(),importedBy:L.array(L.object({path:L.string(),line:L.number(),importStatement:L.string()})),referencedIn:L.array(L.object({path:L.string(),line:L.number(),context:L.string(),scope:L.string().optional()})),graphContext:L.object({definingModule:L.string().optional(),importedByModules:L.array(L.string()),siblingSymbols:L.array(L.string())}).nullable(),trace:L.object({callers:L.array(xs),callees:L.array(xs)}).nullable(),confidence:L.number().nullable(),method:L.string().nullable(),rationale:L.string().nullable(),error:L.string().optional()}),Cs=L.object({symbols:L.array(Ss)}),ws=L.object({sourcePath:L.string(),contentType:L.string(),score:L.number(),headingPath:L.string().optional(),startLine:L.number().optional(),endLine:L.number().optional(),origin:L.string().optional(),category:L.string().optional(),tags:L.array(L.string()).optional()}),Ts=L.object({results:L.array(ws),totalResults:L.number(),searchMode:L.string(),query:L.string(),ref:L.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Es=L.object({path:L.string(),line:L.number().optional(),matchType:L.string(),preview:L.string()}),Ds=L.object({matches:L.array(Es),totalMatches:L.number(),pattern:L.string(),truncated:L.boolean(),ref:L.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Os=L.object({path:L.string(),relevance:L.number(),estimatedTokens:L.number(),focusLines:L.array(L.string()).optional()}),ks=L.object({files:L.array(Os),totalFiles:L.number(),totalEstimatedTokens:L.number(),task:L.string()}),As=L.object({path:L.string(),impact:L.string(),reason:L.string()}),js=L.object({changedFiles:L.array(L.string()),affectedFiles:L.array(As),totalAffected:L.number(),riskLevel:L.string()}),Ms=L.object({name:L.string(),passed:L.boolean(),message:L.string().optional(),severity:L.string().optional()}),Ns=L.object({passed:L.boolean(),score:L.number(),checks:L.array(Ms),summary:L.string()}),Ps=L.object({id:L.string(),name:L.string(),type:L.string(),sourcePath:L.string().optional()}),Fs=L.object({fromId:L.string(),toId:L.string(),fromName:L.string(),toName:L.string(),type:L.string()}),Is=L.object({id:L.string(),name:L.string(),type:L.string()}),Ls=L.object({id:L.string(),nodeCount:L.number(),types:L.record(L.string(),L.number()),samples:L.array(Is)}),Rs=L.object({nodes:L.array(Ps),edges:L.array(Fs),communities:L.array(Ls).optional(),totalNodes:L.number(),totalEdges:L.number(),query:L.string()});L.object({symbols:L.array(L.object({name:L.string(),path:L.string(),line:L.number().optional(),kind:L.string()})),totalDead:L.number()});const zs=L.object({gitRoot:L.string(),branch:L.string(),commitCount:L.number(),hasUncommitted:L.boolean(),recentCommits:L.array(L.object({hash:L.string(),message:L.string(),author:L.string(),date:L.string()}))}),Bs=L.object({sourceId:L.string(),value:L.string()}),Vs=L.object({id:L.string(),originalChars:L.number(),keptChars:L.number(),segmentsKept:L.number(),segmentsTotal:L.number()}),Hs=L.object({text:L.string().describe(`The compressed digest text output`),ref:L.string().optional().describe(`Reusable cache reference`),fields:L.record(L.string(),L.array(Bs)),sourceStats:L.array(Vs),totalOriginalChars:L.number(),totalCompressedChars:L.number(),ratio:L.number()}),Us=L.object({passed:L.boolean(),totalTests:L.number(),passedTests:L.number(),failedTests:L.number(),skippedTests:L.number(),duration:L.number().describe(`Duration in milliseconds`),failures:L.array(L.object({name:L.string(),message:L.string(),file:L.string().optional()}))}),Ws=k(`utils:enrich`);async function K(e,t){let n={curated:[],graph:[]},r=t.limit??3,[i,a]=await Promise.allSettled([Gs(e,t.query,r),Ks(e,t.filePath)]);return i.status===`fulfilled`?n.curated=i.value:Ws.debug(`Curated enrichment failed`,{error:i.reason}),a.status===`fulfilled`?n.graph=a.value:Ws.debug(`Graph enrichment failed`,{error:a.reason}),n}async function Gs(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=>qs(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=>qs(e.record))}return[]}catch(e){return Ws.debug(`Curated enrichment failed`,{error:e}),[]}}async function Ks(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 Ws.debug(`Graph enrichment failed`,{error:e}),[]}}function q(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(`
30
+ `)}`}function qs(e){let t=Js(e.metadata,`title`)||e.sourcePath||`Untitled`;return`[${Js(e.metadata,`category`)}] ${t}: ${e.content.slice(0,200)}`}function Js(e,t){let n=e?.[t];return typeof n==`string`?n:``}function J(e,t,n){return{content:[{type:`text`,text:`[ERROR:${e}] ${t}`}],isError:!0,...n==null?{}:{structuredContent:n}}}function Y(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 Ys=k(`tools`),Xs=L.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`);function Zs(e,t){return t?I(e,t):e}function Qs(){let e=[];return tr.get()||e.push(`Tree-sitter unavailable — using regex fallback, symbol/pattern confidence reduced`),e.length===0?``:`\n\n> **⚠ Caveats:** ${e.join(`; `)}`}function $s(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 ec(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(`
31
+
32
+ ### 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(`
33
+ `)}function tc(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 nc(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=tc(t),r=n.get(e)??[];r.push(t),n.set(e,r)}let r=[`
34
+
35
+ ### 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(`
36
+ `)}async function rc(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 ic(e,t,n,r,i){try{let a=`produced/analysis/${n}/${xe(r,12)}.md`,o=Ge(`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:Ge(`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),Ys.info(`Auto-persisted analysis`,{analyzerName:n,chunkCount:l.length})}catch(e){Ys.warn(`Auto-persist analysis failed`,{analyzerName:n,...j(e)})}}const ac=L.enum([`structure`,`dependencies`,`symbols`,`patterns`,`entry_points`,`diagram`]),oc=L.string().describe(`Root path to analyze`),sc=L.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.`),cc=L.object({path:oc,max_depth:L.number().min(1).max(10).default(6).describe(`Maximum directory depth`),format:L.enum([`json`,`markdown`]).default(`markdown`).describe(`Output format`),max_tokens:Xs,enrich:sc}),lc=L.object({path:oc,format:L.enum([`json`,`markdown`,`mermaid`]).default(`markdown`).describe(`Output format`),max_tokens:Xs,enrich:sc}),uc=L.object({path:oc,filter:L.string().optional().describe(`Filter symbols by name substring`),format:L.enum([`json`,`markdown`]).default(`markdown`).describe(`Output format`),enrich:sc}),dc=L.object({path:oc,enrich:sc}),fc=L.object({path:oc,enrich:sc}),pc=L.object({path:oc,diagram_type:L.enum([`architecture`,`dependencies`]).default(`architecture`).describe(`Type of diagram`),enrich:sc}),mc=L.object({path:oc,aspect:ac.describe(`Analysis aspect to execute`),max_depth:L.number().min(1).max(10).optional(),format:L.enum([`json`,`markdown`,`mermaid`]).optional(),filter:L.string().optional().describe(`Filter symbols by name substring`),diagram_type:L.enum([`architecture`,`dependencies`]).optional().describe(`Type of diagram when aspect="diagram"`)}),hc=L.object({items:L.array(mc).min(1).describe(`Array of analysis requests to run in batch.`),max_tokens:Xs,enrich:sc});async function gc(e,t,n,r){return!n||!r?e:e+q(await K(r,{query:t,filePath:t}))}async function _c(e,{store:t,embedder:n,enrichDeps:r}){let i=new Qn,{path:a,max_depth:o,format:s,max_tokens:c,enrich:l}=cc.parse(e),u=await i.analyze(a,{format:s,maxDepth:o,maxTokens:c});ic(t,n,`structure`,a,u.output);let d=u.data;return{content:[{type:`text`,text:Zs(await gc(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 vc(e,{store:t,embedder:n,enrichDeps:r}){let i=new qn,{path:a,format:o,max_tokens:s,enrich:c}=lc.parse(e),l=await i.analyze(a,{format:o});return ic(t,n,`dependencies`,a,l.output),{content:[{type:`text`,text:Zs(await gc(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 yc(e,{store:t,embedder:n,enrichDeps:r}){let i=new $n,{path:a,filter:o,format:s,enrich:c}=uc.parse(e),l=await i.analyze(a,{format:s,filter:o});return ic(t,n,`symbols`,a,l.output),{content:[{type:`text`,text:await gc(l.output+Qs()+'\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 bc(e,{store:t,embedder:n,enrichDeps:r}){let i=new Zn,{path:a,enrich:o}=dc.parse(e),s=await i.analyze(a);return ic(t,n,`patterns`,a,s.output),{content:[{type:`text`,text:await gc(s.output+Qs()+'\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 xc(e,{store:t,embedder:n,enrichDeps:r}){let i=new Yn,{path:a,enrich:o}=fc.parse(e),s=await i.analyze(a);return ic(t,n,`entry-points`,a,s.output),{content:[{type:`text`,text:await gc(s.output+Qs()+'\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 Sc(e,{store:t,embedder:n,enrichDeps:r}){let i=new Jn,{path:a,diagram_type:o,enrich:s}=pc.parse(e),c=await i.analyze(a,{diagramType:o});return ic(t,n,`diagram`,a,c.output),{content:[{type:`text`,text:await gc(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 Cc(e,t,n){switch(e){case`structure`:return _c(t,n);case`dependencies`:return vc(t,n);case`symbols`:return yc(t,n);case`patterns`:return bc(t,n);case`entry_points`:return xc(t,n);case`diagram`:return Sc(t,n)}}function wc(e,t,n,r){let i=W(`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:hc.shape,annotations:i.annotations},Y(`analyze`,async e=>{try{let i=hc.parse(e);if(!i.items||i.items.length===0)return J(`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 Cc(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(`
29
37
 
30
- `)}],structuredContent:{items:s}}}catch(e){return Gs.error(`Analysis failed`,A(e)),J(`INTERNAL`,`Analysis failed: ${e instanceof Error?e.message:String(e)}`)}}))}const gc=O(`task-manager`);let _c=0;function vc(e){let t=typeof e?.sendNotification==`function`;return{createTask(n,r){let i=`aikit-task-${++_c}`,a=(n,r,a)=>{t&&e.sendNotification?.({method:`notifications/progress`,params:{progressToken:i,progress:n,total:r,...a?{message:a}:{}}}).catch(e=>{gc.debug(`Progress notification failed`,{token:i,error:String(e)})})};return t&&gc.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 yc=O(`tools`);function bc(e,t,n,r){let i=W(`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:ks,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(ve).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 $e(t,n,{path:e,checks:i,detail:a??r??`efficient`});return vc(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 yc.error(`Audit failed`,A(e)),J(`INTERNAL`,`Audit failed: ${e instanceof Error?e.message:String(e)}`)}})}const xc=O(`tools`);function Sc(e){if(!e?.enabled)return;let t=process.env.AIKIT_ER_API_KEY;if(!t){xc.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 Cc(e){let t=Sc(e);if(t)try{let e=new rr(t),n=new nr({maxEntries:t.cacheMaxEntries,defaultTtl:t.cacheTtlMs}),r=new ir(e);try{let e=new URL(t.baseUrl).hostname;xc.info(`ER bridge initialized`,{host:e})}catch{xc.info(`ER bridge initialized`)}return{client:e,cache:n,pushAdapter:r,config:t}}catch(e){xc.warn(`ER bridge initialization failed`,A(e));return}}function wc(e,t,n){let r=W(`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},Y(`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),J(`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(xc.error(`ER push failed`,A(t)),n){let t=`${i}/${e.toLowerCase().replace(/[^a-z0-9]+/g,`-`)}`;n.recordPush(t,!1,o)}return J(`INTERNAL`,`ER push failed: operation unsuccessful
38
+ `)}],structuredContent:{items:s}}}catch(e){return Ys.error(`Analysis failed`,j(e)),J(`INTERNAL`,`Analysis failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Tc(e,t,n,r,i){let a=new Kn,o=W(`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:js,inputSchema:{path:L.string().describe(`Root path of the codebase`),files:L.array(L.string()).optional().describe(`Changed file paths (relative to root). If omitted, auto-detects from git status.`),max_depth:L.number().min(1).max(20).default(5).describe(`Maximum transitive dependency depth`),format:L.enum([`json`,`markdown`]).default(`markdown`).describe(`Output format`),max_tokens:Xs,enrich:L.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},Y(`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 jt({cwd:e,includeDiff:!1});if(d=Array.from(new Set([...$s(t.status?.staged),...$s(t.status?.modified),...$s(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 J(`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 rc(r,d),p.length>0&&(m=`\n\n### Graph-discovered importers (${p.length})\n`+p.slice(0,20).map(e=>`- \`${e}\``).join(`
39
+ `),p.length>20&&(m+=`\n- ... and ${p.length-20} more`))}catch{}let h=nc(d),g=ec(d),_=f.output+m+h+g+Qs()+'\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 K(i,{query:e,filePath:e});_+=q(t)}ic(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:Zs(_,l)}],structuredContent:{changedFiles:d,affectedFiles:v,totalAffected:v.length,riskLevel:y}}}catch(e){return Ys.error(`Blast radius analysis failed`,j(e)),J(`INTERNAL`,`Blast radius analysis failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Ec=k(`task-manager`);let Dc=0;function Oc(e){let t=typeof e?.sendNotification==`function`;return{createTask(n,r){let i=`aikit-task-${++Dc}`,a=(n,r,a)=>{t&&e.sendNotification?.({method:`notifications/progress`,params:{progressToken:i,progress:n,total:r,...a?{message:a}:{}}}).catch(e=>{Ec.debug(`Progress notification failed`,{token:i,error:String(e)})})};return t&&Ec.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 kc=k(`tools`);function Ac(e,t,n,r){let i=W(`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:Ns,inputSchema:{path:L.string().default(`.`).describe(`Root path to audit`),checks:L.array(L.enum([`structure`,`dependencies`,`patterns`,`health`,`dead_symbols`,`check`,`entry_points`])).optional().describe(`Which checks to run (default: all)`),detail:L.enum(_e).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 Qe(t,n,{path:e,checks:i,detail:a??r??`efficient`});return Oc(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 kc.error(`Audit failed`,j(e)),J(`INTERNAL`,`Audit failed: ${e instanceof Error?e.message:String(e)}`)}})}const jc=k(`tools`);function Mc(e){if(!e?.enabled)return;let t=process.env.AIKIT_ER_API_KEY;if(!t){jc.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 Nc(e){let t=Mc(e);if(t)try{let e=new rr(t),n=new nr({maxEntries:t.cacheMaxEntries,defaultTtl:t.cacheTtlMs}),r=new ir(e);try{let e=new URL(t.baseUrl).hostname;jc.info(`ER bridge initialized`,{host:e})}catch{jc.info(`ER bridge initialized`)}return{client:e,cache:n,pushAdapter:r,config:t}}catch(e){jc.warn(`ER bridge initialization failed`,j(e));return}}function Pc(e,t,n){let r=W(`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:L.string().min(3).max(120).describe(`Title for the knowledge entry`),content:L.string().min(10).max(1e5).describe(`Markdown content to push (max 100KB)`),category:L.string().regex(/^[a-z][a-z0-9-]*$/).default(`conventions`).describe(`Category slug (e.g., "decisions", "patterns", "conventions")`),tags:L.array(L.string()).default([]).describe(`Optional tags`),rule_id:L.string().optional().describe(`ID of the classification rule that motivated this push (from remember classification signals). Improves rule effectiveness tracking.`)},annotations:r.annotations},Y(`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),J(`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(jc.error(`ER push failed`,j(t)),n){let t=`${i}/${e.toLowerCase().replace(/[^a-z0-9]+/g,`-`)}`;n.recordPush(t,!1,o)}return J(`INTERNAL`,`ER push failed: operation unsuccessful
31
40
 
32
- _The local AI Kit is unaffected. You can retry or check ER health with \`er_sync_status\`._`)}}))}function Tc(e,t){let n=W(`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},Y(`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(`
41
+ _The local AI Kit is unaffected. You can retry or check ER health with \`er_sync_status\`._`)}}))}function Fc(e,t){let n=W(`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:L.string().min(1).max(2e3).describe(`Search query for Enterprise RAG AI Kit (max 2000 chars)`),max_results:L.number().min(1).max(20).default(5).describe(`Maximum results to return`),bypass_cache:L.boolean().default(!0).describe(`Skip cache and fetch fresh results from ER (default: true per DR-001)`)},annotations:n.annotations},Y(`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(`
33
42
 
34
43
  ---
35
44
 
@@ -37,12 +46,12 @@ _The local AI Kit is unaffected. You can retry or check ER health with \`er_sync
37
46
 
38
47
  ---
39
48
 
40
- `)}\n\n---\n_Source: Enterprise RAG (${i.length} results) | Results cached for ${Math.floor(t.config.cacheTtlMs/36e5)}h_`}]}}catch(e){return xc.error(`ER pull failed`,A(e)),J(`INTERNAL`,`ER pull failed: search request unsuccessful
49
+ `)}\n\n---\n_Source: Enterprise RAG (${i.length} results) | Results cached for ${Math.floor(t.config.cacheTtlMs/36e5)}h_`}]}}catch(e){return jc.error(`ER pull failed`,j(e)),J(`INTERNAL`,`ER pull failed: search request unsuccessful
41
50
 
42
- _Enterprise RAG may be unavailable. Local AI Kit search is unaffected._`)}}))}function Ec(e,t){let n=W(`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},Y(`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
51
+ _Enterprise RAG may be unavailable. Local AI Kit search is unaffected._`)}}))}function Ic(e,t){let n=W(`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:L.boolean().default(!0).describe(`Whether to ping ER health endpoint (adds latency)`)},annotations:n.annotations},Y(`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
43
52
  `,`**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(`
44
- `)}]}}catch(e){return xc.error(`ER sync status failed`,A(e)),J(`INTERNAL`,`ER sync status failed: ${e instanceof Error?e.message:String(e)}`)}}))}function X(e){return String(e??``).replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`)}const Dc=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 } }`)}),Oc=O(`config-tool`),kc=`ui://aikit/config.html`,Ac=[`serverName`,`toolPrefix`,`autoIndex`,`sources`,`indexing`,`tokenBudget`];function jc(){let e=process.env.AIKIT_CONFIG_PATH;if(e&&j(e))return e;let t=we();if(t){let e=P(t,`aikit.config.json`);if(j(e))return e}return``}function Mc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Nc(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];if(Mc(t)&&Mc(r)){n[e]=Nc(t,r);continue}n[e]=r}return n}function Pc(e){return e===void 0?`undefined`:JSON.stringify(e)}function Fc(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(Mc(o)&&Mc(s)&&Mc(c)){i.push(...Fc(s,c,o,n));continue}Pc(s)!==Pc(c)&&i.push(`- ${n}: ${Pc(s)} -> ${Pc(c)}`)}return i}function Ic(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(!Mc(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`||!ve.includes(r))&&t.push(`tokenBudget must be one of: ${ve.join(`, `)}.`);continue}t.push(`Field "${n}" is not updatable through this tool.`)}return t}function Lc(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.`),!Mc(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 Rc(e){let t=JSON.parse(M(e,`utf-8`));if(!Mc(t))throw Error(`Config file must contain a JSON object.`);return t}function zc(e,t){return[`AI Kit Configuration`,`Config file: ${t}`,``,JSON.stringify(e,null,2)].join(`
45
- `)}function Bc(e){return e===void 0?``:Mc(e)||Array.isArray(e)?JSON.stringify(e,null,2):String(e)}function Vc(e){let t=e.metrics??[],n={success:`#22c55e`,warning:`#f59e0b`,error:`#ef4444`,info:`#38bdf8`},r={up:`↑`,down:`↓`,neutral:`→`};return`
53
+ `)}]}}catch(e){return jc.error(`ER sync status failed`,j(e)),J(`INTERNAL`,`ER sync status failed: ${e instanceof Error?e.message:String(e)}`)}}))}function X(e){return String(e??``).replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`)}const Lc=L.object({action:L.enum([`view`,`update`]).default(`view`).describe(`Action to perform: view current configuration or update it`),updates:L.record(L.string(),L.unknown()).optional().describe(`Partial configuration to merge when action is "update". Supports nested paths like { "indexing": { "chunkSize": 2000 } }`)}),Rc=k(`config-tool`),zc=`ui://aikit/config.html`,Bc=[`serverName`,`toolPrefix`,`autoIndex`,`sources`,`indexing`,`tokenBudget`];function Vc(){let e=process.env.AIKIT_CONFIG_PATH;if(e&&M(e))return e;let t=Ce();if(t){let e=F(t,`aikit.config.json`);if(M(e))return e}return``}function Hc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Uc(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];if(Hc(t)&&Hc(r)){n[e]=Uc(t,r);continue}n[e]=r}return n}function Wc(e){return e===void 0?`undefined`:JSON.stringify(e)}function Gc(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(Hc(o)&&Hc(s)&&Hc(c)){i.push(...Gc(s,c,o,n));continue}Wc(s)!==Wc(c)&&i.push(`- ${n}: ${Wc(s)} -> ${Wc(c)}`)}return i}function Kc(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(!Hc(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`||!_e.includes(r))&&t.push(`tokenBudget must be one of: ${_e.join(`, `)}.`);continue}t.push(`Field "${n}" is not updatable through this tool.`)}return t}function qc(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.`),!Hc(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 Jc(e){let t=JSON.parse(N(e,`utf-8`));if(!Hc(t))throw Error(`Config file must contain a JSON object.`);return t}function Yc(e,t){return[`AI Kit Configuration`,`Config file: ${t}`,``,JSON.stringify(e,null,2)].join(`
54
+ `)}function Xc(e){return e===void 0?``:Hc(e)||Array.isArray(e)?JSON.stringify(e,null,2):String(e)}function Zc(e){let t=e.metrics??[],n={success:`#22c55e`,warning:`#f59e0b`,error:`#ef4444`,info:`#38bdf8`},r={up:`↑`,down:`↓`,neutral:`→`};return`
46
55
  <style>
47
56
  .db-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px}
48
57
  .db-card{padding:14px;border:1px solid var(--aikit-border,#3c3c3c);border-left-width:4px;border-radius:8px;background:var(--aikit-surface,#252526)}
@@ -59,7 +68,7 @@ _Enterprise RAG may be unavailable. Local AI Kit search is unaffected._`)}}))}fu
59
68
  <div class="db-card" style="border-left-color:${t}">
60
69
  <div class="db-label">${X(e.label)}</div>
61
70
  ${a}
62
- </div>`}).join(``)}</div>`}function Hc(e){let t=e.fields??[];return`
71
+ </div>`}).join(``)}</div>`}function Qc(e){let t=e.fields??[];return`
63
72
  <style>
64
73
  .fm-container{display:grid;grid-template-columns:1fr 280px;gap:24px}
65
74
  @media(max-width:640px){.fm-container{grid-template-columns:1fr}}
@@ -124,9 +133,9 @@ _Enterprise RAG may be unavailable. Local AI Kit search is unaffected._`)}}))}fu
124
133
  }
125
134
  });
126
135
  })();
127
- <\/script>`}function Uc(e){return Vc({metrics:Object.entries(e).map(([e,t])=>({label:e,value:Mc(t)||Array.isArray(t)?JSON.stringify(t,null,2):String(t),status:`info`}))})}function Wc(e){return Hc({fields:Ac.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:Mc(n)||Array.isArray(n)?`textarea`:`text`,value:Bc(n)}})})}function Gc(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 Kc(e){let t=``,n=``,r=!1;return function(i,a){t=i,n=a,!r&&(r=!0,cr(e,`AI Kit Config App`,kc,{description:`View and update AI Kit configuration`},async()=>({contents:[{uri:kc,mimeType:or,text:Gc(t,n)}]})))}}function qc(e,t){let n=W(`config`),r=Kc(e);lr(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:Dc,annotations:n.annotations,_meta:{ui:{resourceUri:kc}}},Y(`config`,async e=>{let{action:n,updates:i}=e;if(t.readOnly&&n!==`view`)return J(`PERMISSION`,`Configuration updates are disabled in read-only mode`);if(n===`view`){let e=jc(),n=e||`(runtime config only; no aikit.config.json found)`;try{let i=e?Rc(e):t,a=zc(i,n);return r(`Configuration`,Uc(i)),{content:[{type:`text`,text:a}],ui:{type:`resource`,uri:kc}}}catch(t){return Oc.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`,Wc(t)),{content:[{type:`text`,text:`No updates provided. Pass an updates object when action is "update".`}],ui:{type:`resource`,uri:kc}};let a=jc();if(!a)return r(`Configuration Form`,Wc(t)),{content:[{type:`text`,text:`No config file found to update.`}],ui:{type:`resource`,uri:kc}};let o=Ic(i);if(o.length>0)return r(`Configuration Form`,Wc(Rc(a))),{content:[{type:`text`,text:`Configuration update rejected:\n${o.map(e=>`- ${e}`).join(`
128
- `)}`}],ui:{type:`resource`,uri:kc}};try{let e=Rc(a),t=Nc(e,i),n=Lc(t);if(n.length>0)return r(`Configuration Form`,Wc(e)),{content:[{type:`text`,text:`Configuration update rejected:\n${n.map(e=>`- ${e}`).join(`
129
- `)}`}],ui:{type:`resource`,uri:kc}};Ne(a,JSON.stringify(t,null,2),`utf-8`);let o=Fc(e,t,i),s=`Configuration updated successfully.
136
+ <\/script>`}function $c(e){return Zc({metrics:Object.entries(e).map(([e,t])=>({label:e,value:Hc(t)||Array.isArray(t)?JSON.stringify(t,null,2):String(t),status:`info`}))})}function el(e){return Qc({fields:Bc.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:Hc(n)||Array.isArray(n)?`textarea`:`text`,value:Xc(n)}})})}function tl(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 nl(e){let t=``,n=``,r=!1;return function(i,a){t=i,n=a,!r&&(r=!0,cr(e,`AI Kit Config App`,zc,{description:`View and update AI Kit configuration`},async()=>({contents:[{uri:zc,mimeType:or,text:tl(t,n)}]})))}}function rl(e,t){let n=W(`config`),r=nl(e);lr(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:Lc,annotations:n.annotations,_meta:{ui:{resourceUri:zc}}},Y(`config`,async e=>{let{action:n,updates:i}=e;if(t.readOnly&&n!==`view`)return J(`PERMISSION`,`Configuration updates are disabled in read-only mode`);if(n===`view`){let e=Vc(),n=e||`(runtime config only; no aikit.config.json found)`;try{let i=e?Jc(e):t,a=Yc(i,n);return r(`Configuration`,$c(i)),{content:[{type:`text`,text:a}],ui:{type:`resource`,uri:zc}}}catch(t){return Rc.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`,el(t)),{content:[{type:`text`,text:`No updates provided. Pass an updates object when action is "update".`}],ui:{type:`resource`,uri:zc}};let a=Vc();if(!a)return r(`Configuration Form`,el(t)),{content:[{type:`text`,text:`No config file found to update.`}],ui:{type:`resource`,uri:zc}};let o=Kc(i);if(o.length>0)return r(`Configuration Form`,el(Jc(a))),{content:[{type:`text`,text:`Configuration update rejected:\n${o.map(e=>`- ${e}`).join(`
137
+ `)}`}],ui:{type:`resource`,uri:zc}};try{let e=Jc(a),t=Uc(e,i),n=qc(t);if(n.length>0)return r(`Configuration Form`,el(e)),{content:[{type:`text`,text:`Configuration update rejected:\n${n.map(e=>`- ${e}`).join(`
138
+ `)}`}],ui:{type:`resource`,uri:zc}};Me(a,JSON.stringify(t,null,2),`utf-8`);let o=Gc(e,t,i),s=`Configuration updated successfully.
130
139
 
131
140
  Config file: ${a}
132
141
 
@@ -134,31 +143,31 @@ Changed values:
134
143
  ${o.length>0?o.join(`
135
144
  `):`- No effective changes; requested values already matched the file.`}
136
145
 
137
- These changes take effect on the next server restart.`;return r(`Configuration`,Uc(t)),{content:[{type:`text`,text:s}],ui:{type:`resource`,uri:kc}}}catch(e){return Oc.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`,Uc(t))}const Jc=O(`cross-workspace`);function Yc(e,t){if(!Se())return[];let n=Ce();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 Xc(e){let t=new Map;for(let n of e){let e=xe(n.partition),r=N(e,`aikit.db`);try{let e=await ur({backend:`sqlite-vec`,path:r});await e.initialize(),t.set(n.partition,e)}catch(t){Jc.warn(`Failed to open workspace store`,{partition:n.partition,partitionDir:e,storePath:r,error:A(t)})}}return{stores:t,closeAll:async()=>{for(let[,e]of t)try{await e.close()}catch{}}}}async function Zc(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 Jc.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 Qc(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 Jc.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 $c(e){if(e.length!==0)return jn({kind:`compact`,text:e,originalChars:e.length,compressedChars:e.length})?.ref??void 0}function el(e,t){return t?`${e}\n\nRef: ${t}`:e}const tl=O(`tools:context`);function nl(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 rl(e,t){return nl(t)?(tl.warn(`${e} failed`,{error:`File not found`}),J(`NOT_FOUND`,`File not found`)):(tl.error(`${e} failed`,A(t)),J(`INTERNAL`,`${e} failed: ${t instanceof Error?t.message:String(t)}`))}function il(e,t,n,r){let i=W(`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:Es,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(pe).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},Y(`scope_map`,async({task:e,max_files:i,content_type:a,max_tokens:o,enrich:s})=>{try{let c=await Sn(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(`
138
- `)+"\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 K(r,{query:e});l+=q(t)}return{content:[{type:`text`,text:o?F(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 rl(`Scope map`,e)}}))}function al(e,t,n,r,i,a){let o=W(`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:ws,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(pe).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},Y(`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 J(`VALIDATION`,`"query" is required for mode "examples".`);let r=await Et(t,n,{query:e,limit:c,contentType:l}),a=$c(JSON.stringify(r)),o=JSON.stringify(a?{ref:a,...r}:r);if(p&&i){let t=await K(i,{query:e});o+=q(t)}return{content:[{type:`text`,text:d?F(o,d):o}]}}if(u===`explore`||m){if(!e)return J(`VALIDATION`,`"query" is required for mode "explore".`);let a=await Tt(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 K(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+=`
146
+ These changes take effect on the next server restart.`;return r(`Configuration`,$c(t)),{content:[{type:`text`,text:s}],ui:{type:`resource`,uri:zc}}}catch(e){return Rc.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`,$c(t))}const il=k(`cross-workspace`);function al(e,t){if(!Se())return[];let n=A();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 ol(e){let t=new Map;for(let n of e){let e=be(n.partition),r=P(e,`aikit.db`);try{let e=await ur({backend:`sqlite-vec`,path:r});await e.initialize(),t.set(n.partition,e)}catch(t){il.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 sl(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 il.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 cl(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 il.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 ll(e){if(e.length!==0)return An({kind:`compact`,text:e,originalChars:e.length,compressedChars:e.length})?.ref??void 0}function ul(e,t){return t?`${e}\n\nRef: ${t}`:e}const dl=k(`tools:context`);function fl(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 pl(e,t){return fl(t)?(dl.warn(`${e} failed`,{error:`File not found`}),J(`NOT_FOUND`,`File not found`)):(dl.error(`${e} failed`,j(t)),J(`INTERNAL`,`${e} failed: ${t instanceof Error?t.message:String(t)}`))}function ml(e,t,n,r){let i=W(`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:ks,inputSchema:{task:L.string().describe(`Description of the task to scope`),max_files:L.number().min(1).max(50).default(15).describe(`Maximum files to include`),content_type:L.enum(fe).optional().describe(`Filter by content type`),max_tokens:L.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),enrich:L.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},Y(`scope_map`,async({task:e,max_files:i,content_type:a,max_tokens:o,enrich:s})=>{try{let c=await xn(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(`
147
+ `)+"\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 K(r,{query:e});l+=q(t)}return{content:[{type:`text`,text:o?I(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 pl(`Scope map`,e)}}))}function hl(e,t,n,r,i,a){let o=W(`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:Ds,inputSchema:{query:L.string().optional().describe(`Semantic/keyword search query (required for mode "examples")`),glob:L.string().optional().describe(`File glob pattern (search mode only)`),pattern:L.string().optional().describe(`Regex pattern to match in content (search mode only)`),limit:L.number().min(1).max(50).default(10).describe(`Max results`),content_type:L.enum(fe).optional().describe(`Filter by content type`),mode:L.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:L.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:L.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),workspaces:L.array(L.string()).optional().describe(`Cross-workspace search: partition names or folder basenames to include. Use ["*"] for all. User-level mode only.`),enrich:L.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},Y(`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 J(`VALIDATION`,`"query" is required for mode "examples".`);let r=await Tt(t,n,{query:e,limit:c,contentType:l}),a=ll(JSON.stringify(r)),o=JSON.stringify(a?{ref:a,...r}:r);if(p&&i){let t=await K(i,{query:e});o+=q(t)}return{content:[{type:`text`,text:d?I(o,d):o}]}}if(u===`explore`||m){if(!e)return J(`VALIDATION`,`"query" is required for mode "explore".`);let a=await wt(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 K(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+=`
139
148
  `}if(p&&i){let t=await K(i,{query:e});h+=q(t)}return h+=`
140
149
  ---
141
- _Explore mode: results enriched with graph neighbors, related symbols, and curated knowledge._`,{content:[{type:`text`,text:d?F(h,d):h}]}}let h=await Tt(t,n,{query:e,glob:o,pattern:s,limit:c,contentType:l,cwd:r}),g=``;if(f&&f.length>0&&e){let n=Yc(f,a);if(n.length>0){let{stores:r,closeAll:i}=await Xc(n);try{let i=await Zc(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?`
142
- No search strategies were activated. Provide at least one of: query, glob, or pattern.`:``}`;if(p&&i){let n=await K(i,{query:e});t+=q(n)}let n=d?F(t,d):t,r=$c(n);return{content:[{type:`text`,text:el(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(`
143
- `);if(p&&i){let t=await K(i,{query:e,filePath:h.results[0]?.path});_+=q(t)}let v=d?F(_,d):_,y=$c(v);return{content:[{type:`text`,text:el(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 rl(`Find`,e)}}))}function ol(e,t,n,r,i){let a=W(`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:bs,annotations:a.annotations},Y(`symbol`,async({items:e,max_tokens:a,enrich:o})=>{try{if(!e||e.length===0)return J(`VALIDATION`,`"items[]" is required.`);let s=await Promise.allSettled(e.map(e=>Nn(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${cl(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(`
150
+ _Explore mode: results enriched with graph neighbors, related symbols, and curated knowledge._`,{content:[{type:`text`,text:d?I(h,d):h}]}}let h=await wt(t,n,{query:e,glob:o,pattern:s,limit:c,contentType:l,cwd:r}),g=``;if(f&&f.length>0&&e){let n=al(f,a);if(n.length>0){let{stores:r,closeAll:i}=await ol(n);try{let i=await sl(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?`
151
+ No search strategies were activated. Provide at least one of: query, glob, or pattern.`:``}`;if(p&&i){let n=await K(i,{query:e});t+=q(n)}let n=d?I(t,d):t,r=ll(n);return{content:[{type:`text`,text:ul(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(`
152
+ `);if(p&&i){let t=await K(i,{query:e,filePath:h.results[0]?.path});_+=q(t)}let v=d?I(_,d):_,y=ll(v);return{content:[{type:`text`,text:ul(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 pl(`Find`,e)}}))}function gl(e,t,n,r,i){let a=W(`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:L.array(L.object({name:L.string().describe(`Symbol name to look up`),limit:L.number().min(1).max(50).default(20).optional().describe(`Max results per category`),direction:L.enum([`callers`,`callees`,`both`]).optional().describe(`Transitive trace direction: callers (who calls this), callees (what this calls), or both`),maxDepth:L.number().min(1).max(10).default(2).optional().describe(`Max traversal depth for transitive trace`),edgeKinds:L.array(L.string()).optional().describe(`Filter trace by edge types (e.g., ["imports", "calls"])`),use_llm:L.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:L.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),enrich:L.boolean().default(!1).optional().describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens.`)},outputSchema:Cs,annotations:a.annotations},Y(`symbol`,async({items:e,max_tokens:a,enrich:o})=>{try{if(!e||e.length===0)return J(`VALIDATION`,`"items[]" is required.`);let s=await Promise.allSettled(e.map(e=>Mn(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${vl(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(`
144
153
 
145
- `);if(o&&i){let t=await K(i,{query:`symbols: ${e.map(e=>e.name).join(`, `)}`});u+=q(t)}return{content:[{type:`text`,text:a?F(u,a):u}],structuredContent:{symbols:l}}}catch(e){return rl(`Symbol lookup`,e)}}))}function sl(e,t,n,r,i){let a=W(`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},Y(`trace`,async({items:e,max_tokens:a,enrich:s})=>{try{if(!e||e.length===0)return J(`VALIDATION`,`"items[]" is required.`);let c=await Promise.allSettled(e.map(e=>Fn(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(`
154
+ `);if(o&&i){let t=await K(i,{query:`symbols: ${e.map(e=>e.name).join(`, `)}`});u+=q(t)}return{content:[{type:`text`,text:a?I(u,a):u}],structuredContent:{symbols:l}}}catch(e){return pl(`Symbol lookup`,e)}}))}function _l(e,t,n,r,i){let a=W(`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:L.array(L.object({start:L.string().describe(`Starting point — symbol name or file:line reference`),direction:L.enum([`forward`,`backward`,`both`]).describe(`Which direction to trace relationships`),max_depth:L.number().min(1).max(10).default(3).optional().describe(`Maximum trace depth`),edge_kinds:L.array(L.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:L.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),enrich:L.boolean().default(!1).optional().describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens.`)},annotations:a.annotations},Y(`trace`,async({items:e,max_tokens:a,enrich:s})=>{try{if(!e||e.length===0)return J(`VALIDATION`,`"items[]" is required.`);let c=await Promise.allSettled(e.map(e=>Pn(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(`
146
155
  `)}`),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(`
147
156
 
148
- `)+"\n\n---\n_Next: `symbol` for definition details | `compact` to read a referenced file_";if(s&&i){let t=await K(i,{query:`traces: ${e.map(e=>e.start).join(`, `)}`});d+=q(t)}return{content:[{type:`text`,text:a?F(d,a):d}],structuredContent:{traces:u}}}catch(e){return rl(`Trace`,e)}}))}function cl(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(`
149
- `)}const ll=O(`tools`);function ul(e,t){let n=W(`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
157
+ `)+"\n\n---\n_Next: `symbol` for definition details | `compact` to read a referenced file_";if(s&&i){let t=await K(i,{query:`traces: ${e.map(e=>e.start).join(`, `)}`});d+=q(t)}return{content:[{type:`text`,text:a?I(d,a):d}],structuredContent:{traces:u}}}catch(e){return pl(`Trace`,e)}}))}function vl(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(`
158
+ `)}const yl=k(`tools`);function bl(e,t){let n=W(`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:L.boolean().default(!0).describe(`Include detailed breakdowns (top missed queries, rule stats)`),reset_after:L.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
150
159
  `,`**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(`
151
- **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&&(ll.info(`Evolution metrics reset requested`,{requestedAt:new Date().toISOString(),clearedEvents:r.period.totalEvents}),t.reset(),i.push(`
160
+ **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&&(yl.info(`Evolution metrics reset requested`,{requestedAt:new Date().toISOString(),clearedEvents:r.period.totalEvents}),t.reset(),i.push(`
152
161
  _Metrics have been reset._`)),{content:[{type:`text`,text:i.join(`
153
- `)}]}}catch(e){return ll.error(`Evolution review failed`,A(e)),J(`INTERNAL`,`Evolution review failed: unable to compute metrics`)}})}const dl=O(`tools:execution`);function fl(e,t,n){let r=W(`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(ve).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:_s,annotations:r.annotations},Y(`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 rt({files:e,cwd:r,skipTypes:i,skipLint:a,detail:l===`efficient`?`normal`:l}),d=vc(c).createTask(`Check`,2);if(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`}`),l===`efficient`){let e=Mn(u),n=[];if(u.passed)n.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,r=e.tsc.topErrors[0]??e.biome.topErrors[0]??`reported errors`;t&&n.push({tool:`compact`,reason:`Inspect failing code with compact({ path: ${JSON.stringify(t)}, query: ${JSON.stringify(r)} })`,suggested_args:{path:t,query:r}}),n.push({tool:`check`,reason:`Re-check after fixing errors`,suggested_args:{detail:`normal`}})}let r=[`## Check ${e.passed?`✅ PASS`:`❌ FAIL`}`,``,`**tsc**: ${e.tsc.passed?`✅`:`❌`} ${e.tsc.errorCount} errors, ${e.tsc.warningCount} warnings`];if(e.tsc.topErrors.length>0)for(let t of e.tsc.topErrors)r.push(` - ${t}`);if(r.push(`**biome**: ${e.biome.passed?`✅`:`❌`} ${e.biome.errorCount} errors, ${e.biome.warningCount} warnings`),e.biome.topErrors.length>0)for(let t of e.biome.topErrors)r.push(` - ${t}`);if(n.length>0){r.push(``,`**Next steps:**`);for(let e of n)r.push(`- \`${e.tool}\`: ${e.reason}`)}let i=r.join(`
154
- `);if(s&&t){let e=await K(t,{query:`known issues failures`});i+=q(e)}return{content:[{type:`text`,text:i}],structuredContent:{...e}}}let f=JSON.stringify(u);if(s&&t){let e=await K(t,{query:`known issues failures`});f+=q(e)}return{content:[{type:`text`,text:f}]}}catch(e){return dl.error(`Check failed`,A(e)),J(`INTERNAL`,`Check failed: ${e instanceof Error?e.message:String(e)}`)}}))}function pl(e){let t=W(`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},Y(`eval`,async({code:e,lang:t,timeout:n})=>{try{let r=await St({code:e,lang:t,timeout:n});return r.success?{content:[{type:`text`,text:`Eval succeeded in ${r.durationMs}ms\n\n${r.output}`}]}:J(`INTERNAL`,`Eval failed in ${r.durationMs}ms: ${r.error??`Unknown error`}`)}catch(e){return dl.error(`Eval failed`,A(e)),J(`INTERNAL`,`Eval failed: ${e instanceof Error?e.message:String(e)}`)}}))}function ml(e,t){let n=W(`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},Y(`test_run`,async({files:e,grep:n,cwd:r,enrich:i},a)=>{try{let o=await Pn({files:e,grep:n,cwd:r}),s=vc(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=_l(o);if(i&&t){let e=await K(t,{query:`test patterns known failures`});l+=q(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 dl.error(`Test run failed`,A(e)),J(`INTERNAL`,`Test run failed: ${e instanceof Error?e.message:String(e)}`)}}))}function hl(e){let t=W(`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,`
155
- `).replace(/\\t/g,` `),t);return{content:[{type:`text`,text:JSON.stringify(n)}]}}catch(e){return dl.error(`Parse failed`,A(e)),J(`INTERNAL`,`Parse failed: ${e instanceof Error?e.message:String(e)}`)}})}function gl(e,t){let n=W(`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 _t();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{dl.debug(`Sampling failed, falling back to Ollama`)}let c=await gt({prompt:e,model:n,system:r,context:i,temperature:a,timeout:o});return c.error?J(`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 dl.error(`Delegate failed`,A(e)),J(`INTERNAL`,`Delegate failed: ${e instanceof Error?e.message:String(e)}`)}})}function _l(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(`
156
- `)}const vl=O(`tools:file-summary`);function yl(e,t,n){let r=W(`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 compact/digest/find/knowledge output`),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},Y(`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 wt(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(`
157
- `)}]}}catch(e){return vl.error(`file_summary failed`,A(e)),J(`INTERNAL`,`file_summary failed: ${e instanceof Error?e.message:String(e)}`)}}))}const bl=[],xl=[`_docs-sync`],Sl=new Map([[`_docs-sync`,`Synchronize project documentation — update docs/ folder based on changes made during the flow.`]]);function Cl(e){function t(t,n,r){let i=n?.installPath?Pe(n.installPath):t.replaceAll(`:`,`-`),a=P(Hn(),`.copilot`,`flows`,i).replaceAll(`\\`,`/`);if(j(a))return a;let o=P(Hn(),`.claude`,`flows`,i).replaceAll(`\\`,`/`);if(j(o))return o;let s=P(r??e(),`.github`,`flows`,i).replaceAll(`\\`,`/`);return j(s)?s:n?.installPath&&j(n.installPath)?n.installPath.replaceAll(`\\`,`/`):null}function n(e,n,r){let i=t(e.name,e,r);return i?P(i,n).replaceAll(`\\`,`/`):n}function r(t,n){let r=t.replace(/^_/,``),i=n??e(),a=[N(i,`.github`,`flows`,`_epilogue`,`steps`,r,`README.md`),N(i,`.github`,`flows`,`_epilogue`,r,`README.md`)];for(let e of a)if(j(e))return e.replaceAll(`\\`,`/`);return null}function i(e){return[...bl,...e.manifest.steps.map(e=>e.id),...xl]}function a(e,t,r){let i=t?e.manifest.steps.find(e=>e.id===t)??null:null,a=t?Sl.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=N(Vn(`npm root -g`,{encoding:`utf-8`}).trim(),`@fission-ai`,`openspec`);if(j(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=P(e);if(j(N(t,`.claude-plugin`,`plugin.json`)))return{path:t,sourceType:`claude-plugin`};let n=Hn(),r=N(n,`.claude`,`plugins`,e);if(j(N(r,`.claude-plugin`,`plugin.json`)))return{path:r,sourceType:`claude-plugin`};let i=N(n,`.claude`,`plugins`);if(!j(i))return null;for(let t of Oe(i,{withFileTypes:!0})){if(!t.isDirectory())continue;let n=N(i,t.name,`.claude-plugin`,`plugin.json`);if(j(n))try{if(JSON.parse(M(n,`utf-8`)).name===e)return{path:N(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 wl(e){function t(){return e.sources?.[0]?.path??Te()}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=Oe(e,{withFileTypes:!0});for(let r of n){if(!r.isDirectory()||r.name.startsWith(`.`))continue;let n=N(e,r.name);j(N(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}/`)&&j(N(e,`.git`)))return!0;return!1}function s(e){return N(e??t(),`.flows`)}async function c(){let e=a();for(let t of e){let e=s(t);if(j(e))for(let n of Oe(e,{withFileTypes:!0})){if(!n.isDirectory())continue;let r=N(e,n.name,`meta.json`);if(j(r))try{let e=JSON.parse(M(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=N(s(t),e,`meta.json`),i=M(r,`utf-8`),a=JSON.parse(i);a.roots=n.map(e=>e.replaceAll(`\\`,`/`)),a.primaryRoot=t.replaceAll(`\\`,`/`);let o=`${r}.tmp`;Ne(o,JSON.stringify(a,null,2),`utf-8`),ke(o,r)}function f(e,t){let n=N(s(t),e,`meta.json`);if(!j(n))return;let r=M(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=N(t,`.flows`,e);De(n,{recursive:!0});let a=N(n,`meta.json`),s=`${a}.tmp`;Ne(s,r,`utf-8`),ke(s,a),De(N(n,i.artifactsDir??`.spec`),{recursive:!0})}}return{getWorkspaceRoot:t,getAllRoots:a,getFlowsDir:s,isValidFlowRoot:o,resolveFlowRoot:l,resolveRoots:u,patchMetaRoots:d,syncMetaToRoots:f}}const Tl={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`},El={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`},Dl=new Set([`implementer`,`documenter`,`reviewer`,`researcher`,`debugger`]);function Ol(e){if(e.profile!==void 0&&e.profile!==null)return Dl.has(e.profile)?e.profile:`implementer`;if(e.id){let t=Tl[e.id];if(t)return t}if(e.agents&&e.agents.length>0)for(let t of e.agents){let e=El[t.toLowerCase()];if(e)return e}return`implementer`}function kl(e){let{manifest:t}=e;if(!t?.steps)return null;let n=t.steps.find(t=>t.id===e.stepId);return n?Ol(n):null}function Al(e){return{name:`flow-context`,order:40,maxTokens:120,runInBrief:!0,async execute(t){let n=kl(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(`
158
- `);return{content:i,tokens:Math.ceil(i.length/4)}}}}function jl(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(`
159
- `),i=Math.ceil(n.length/4);return{content:`**Recalled Knowledge:**\n${n}`,tokens:Math.min(i,200)}}catch{return null}}}}const Ml=[`**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(` `),Nl={name:`token-efficiency`,order:30,maxTokens:80,runInBrief:!1,runOnce:!0,async execute(e){return{content:Ml,tokens:25}}},Pl=[`**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(` `),Fl={name:`tool-routing`,order:10,maxTokens:100,runInBrief:!0,runOnce:!0,async execute(e){return{content:Pl,tokens:30}}};function Il(e,t){return Promise.race([e,new Promise(e=>setTimeout(()=>e(null),t))])}var Ll=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 Il(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(`
162
+ `)}]}}catch(e){return yl.error(`Evolution review failed`,j(e)),J(`INTERNAL`,`Evolution review failed: unable to compute metrics`)}})}const xl=k(`tools:execution`);function Sl(e,t,n){let r=W(`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:L.array(L.string()).optional().describe(`Specific files to check (if omitted, checks all)`),cwd:L.string().optional().describe(`Working directory`),skip_types:L.boolean().default(!1).describe(`Skip TypeScript typecheck`),skip_lint:L.boolean().default(!1).describe(`Skip Biome lint`),detail:L.enum(_e).optional().describe(`Output detail level: efficient (default, ~300 tokens — pass/fail + counts + top errors), normal (parsed error objects), full (includes raw terminal output)`),enrich:L.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:bs,annotations:r.annotations},Y(`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 nt({files:e,cwd:r,skipTypes:i,skipLint:a,detail:l===`efficient`?`normal`:l}),d=Oc(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=jn(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(`
163
+ `);if(s&&t){let e=await K(t,{query:`known issues failures`});r+=q(e)}return{content:[{type:`text`,text:r}],structuredContent:{...f}}}let p=JSON.stringify(u);if(s&&t){let e=await K(t,{query:`known issues failures`});p+=q(e)}return{content:[{type:`text`,text:p}],structuredContent:{...f}}}catch(e){return xl.error(`Check failed`,j(e)),J(`INTERNAL`,`Check failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Cl(e){let t=W(`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:L.string().max(1e5).describe(`Code snippet to execute`),lang:L.enum([`js`,`ts`]).default(`js`).optional().describe(`Language mode: js executes directly, ts strips common type syntax first`),timeout:L.number().min(1).max(6e4).default(5e3).optional().describe(`Execution timeout in milliseconds`)},annotations:t.annotations},Y(`eval`,async({code:e,lang:t,timeout:n})=>{try{let r=await xt({code:e,lang:t,timeout:n});return r.success?{content:[{type:`text`,text:`Eval succeeded in ${r.durationMs}ms\n\n${r.output}`}]}:J(`INTERNAL`,`Eval failed in ${r.durationMs}ms: ${r.error??`Unknown error`}`)}catch(e){return xl.error(`Eval failed`,j(e)),J(`INTERNAL`,`Eval failed: ${e instanceof Error?e.message:String(e)}`)}}))}function wl(e,t){let n=W(`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:L.array(L.string()).optional().describe(`Specific test files or patterns to run`),grep:L.string().optional().describe(`Only run tests whose names match this pattern`),cwd:L.string().optional().describe(`Working directory for the test run`),enrich:L.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:Us},Y(`test_run`,async({files:e,grep:n,cwd:r,enrich:i},a)=>{try{let o=await Nn({files:e,grep:n,cwd:r}),s=Oc(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=Dl(o);if(i&&t){let e=await K(t,{query:`test patterns known failures`});l+=q(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 xl.error(`Test run failed`,j(e)),J(`INTERNAL`,`Test run failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Tl(e){let t=W(`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:L.string().max(5e5).describe(`Raw output text from a build tool`),tool:L.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=Kt(e.replace(/\\n/g,`
164
+ `).replace(/\\t/g,` `),t);return{content:[{type:`text`,text:JSON.stringify(n)}]}}catch(e){return xl.error(`Parse failed`,j(e)),J(`INTERNAL`,`Parse failed: ${e instanceof Error?e.message:String(e)}`)}})}function El(e,t){let n=W(`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:L.string().max(2e5).describe(`The task or question to send to the local model`),model:L.string().optional().describe(`Ollama model name (default: first available model)`),system:L.string().optional().describe(`System prompt for the model`),context:L.string().max(5e5).optional().describe(`Context text to include before the prompt (e.g. file contents)`),temperature:L.number().min(0).max(2).default(.3).optional().describe(`Sampling temperature (0=deterministic, default 0.3)`),timeout:L.number().min(1e3).max(6e5).default(12e4).optional().describe(`Timeout in milliseconds (default 120000)`),action:L.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 gt();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{xl.debug(`Sampling failed, falling back to Ollama`)}let c=await ht({prompt:e,model:n,system:r,context:i,temperature:a,timeout:o});return c.error?J(`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 xl.error(`Delegate failed`,j(e)),J(`INTERNAL`,`Delegate failed: ${e instanceof Error?e.message:String(e)}`)}})}function Dl(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(`
165
+ `)}const Ol=k(`tools:file-summary`);function kl(e,t,n){let r=W(`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:L.array(L.string()).min(1).max(50).optional().describe(`File paths to summarize (card output: T1=structure, T2=structure+content)`),text:L.string().optional().describe(`Arbitrary text to compress (text output with ratio/segment stats)`),ref:L.string().optional().describe(`Cached ref to restore from file_summary/digest/find/knowledge output — use file_summary({ ref }) to consume`),query:L.string().optional().describe(`Focus query — guides relevance scoring. Triggers T2 when present without explicit tier`),tier:L.enum([`T1`,`T2`]).optional().describe(`Tier: T1=structure only, T2=structure+content. Default: T1, or T2 if query present`),max_content_chars:L.number().min(100).max(5e3).default(800).describe(`For T2/text: max chars for compressed content`),segmentation:L.enum([`paragraph`,`sentence`,`line`]).default(`paragraph`).describe(`How to split content for relevance scoring`),min_score:L.number().min(0).max(1).optional().describe(`Minimum relevance score threshold (0-1)`),mode:L.enum([`full`,`delta`]).default(`full`).describe(`'full'=compress everything, 'delta'=only changes since last read`)},annotations:r.annotations},Y(`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 Ct(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(`
166
+ `)}]}}catch(e){return Ol.error(`file_summary failed`,j(e)),J(`INTERNAL`,`file_summary failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Al=[],jl=[`_docs-sync`],Ml=new Map([[`_docs-sync`,`Synchronize project documentation — update docs/ folder based on changes made during the flow.`]]);function Nl(e){function t(t,n,r){let i=n?.installPath?Ne(n.installPath):t.replaceAll(`:`,`-`),a=F(Vn(),`.copilot`,`flows`,i).replaceAll(`\\`,`/`);if(M(a))return a;let o=F(Vn(),`.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[...Al,...e.manifest.steps.map(e=>e.id),...jl]}function a(e,t,r){let i=t?e.manifest.steps.find(e=>e.id===t)??null:null,a=t?Ml.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(Bn(`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=Vn(),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 De(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 Pl(e){function t(){return e.sources?.[0]?.path??we()}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=De(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 De(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`;Me(o,JSON.stringify(a,null,2),`utf-8`),Oe(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);Ee(n,{recursive:!0});let a=P(n,`meta.json`),s=`${a}.tmp`;Me(s,r,`utf-8`),Oe(s,a),Ee(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 Fl={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`},Il={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`},Ll=new Set([`implementer`,`documenter`,`reviewer`,`researcher`,`debugger`]);function Rl(e){if(e.profile!==void 0&&e.profile!==null)return Ll.has(e.profile)?e.profile:`implementer`;if(e.id){let t=Fl[e.id];if(t)return t}if(e.agents&&e.agents.length>0)for(let t of e.agents){let e=Il[t.toLowerCase()];if(e)return e}return`implementer`}function zl(e){let{manifest:t}=e;if(!t?.steps)return null;let n=t.steps.find(t=>t.id===e.stepId);return n?Rl(n):null}function Bl(e){return{name:`flow-context`,order:40,maxTokens:120,runInBrief:!0,async execute(t){let n=zl(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(`
167
+ `);return{content:i,tokens:Math.ceil(i.length/4)}}}}function Vl(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(`
168
+ `),i=Math.ceil(n.length/4);return{content:`**Recalled Knowledge:**\n${n}`,tokens:Math.min(i,200)}}catch{return null}}}}const Hl=[`**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(` `),Ul={name:`token-efficiency`,order:30,maxTokens:80,runInBrief:!1,runOnce:!0,async execute(e){return{content:Hl,tokens:25}}},Wl=[`**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(` `),Gl={name:`tool-routing`,order:10,maxTokens:100,runInBrief:!0,runOnce:!0,async execute(e){return{content:Wl,tokens:30}}};function Kl(e,t){return Promise.race([e,new Promise(e=>setTimeout(()=>e(null),t))])}var ql=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 Kl(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(`
160
169
 
161
- `)}\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 Rl(e={}){let t=new Ll({log:e.log});return t.register(Fl),t.register(jl({store:e.store,graphStore:e.graphStore,embedder:e.embedder})),t.register(Nl),t.register(Al()),t.seal(),t}const zl=O(`flow-tools`);function Bl(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`&&e.trim().length>0):[]}function Vl(e){return{content:[{type:`text`,text:e}]}}function Hl(e){return e instanceof Error?e.message:String(e)}const Ul={before:[],after:[{id:`_docs-sync`,description:`Synchronize project documentation — update docs/ folder based on changes made during the flow.`,position:`after`,skills:[`docs`]}]};function Wl(e,t,n,r,i,a){let o=wl(t),s=Cl(o.getWorkspaceRoot),c=Rl({store:n?.store,graphStore:n?.graphStore,embedder:n?.embedder,log:zl});function l(){return N(be(),`flows`,`registry.json`)}function u(){let t=C(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.
170
+ `)}\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 Jl(e={}){let t=new ql({log:e.log});return t.register(Gl),t.register(Vl({store:e.store,graphStore:e.graphStore,embedder:e.embedder})),t.register(Ul),t.register(Bl()),t.seal(),t}const Yl=k(`flow-tools`);function Xl(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`&&e.trim().length>0):[]}function Zl(e){return{content:[{type:`text`,text:e}]}}function Ql(e){return e instanceof Error?e.message:String(e)}const $l={before:[],after:[{id:`_docs-sync`,description:`Synchronize project documentation — update docs/ folder based on changes made during the flow.`,position:`after`,skills:[`docs`]}]};function eu(e,t,n,r,i,a){let o=Pl(t),s=Nl(o.getWorkspaceRoot),c=Jl({store:n?.store,graphStore:n?.graphStore,embedder:n?.embedder,log:Yl});function l(){return P(ye(),`flows`,`registry.json`)}function u(){let t=C(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.
162
171
 
163
172
  Convert the provided content into a well-structured README.md for a flow step named "${r}".
164
173
 
@@ -171,24 +180,24 @@ The output must:
171
180
  6. Preserve ALL tool restrictions, constraints, and requirements from the source
172
181
  7. Be formatted as clean Markdown
173
182
 
174
- 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){zl.debug(`Flow transform sampling failed; using fallback formatting`,{error:Hl(e),sourceFormat:n,stepName:r})}let c=typeof i?.description==`string`&&i.description.trim().length>0?i.description.trim():null,l=Bl(i?.produces),u=Bl(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(`
183
+ 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){Yl.debug(`Flow transform sampling failed; using fallback formatting`,{error:Ql(e),sourceFormat:n,stepName:r})}let c=typeof i?.description==`string`&&i.description.trim().length>0?i.description.trim():null,l=Xl(i?.produces),u=Xl(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(`
175
184
  `).trimEnd().concat(`
176
- `)}}async function d(e){let{FlowRegistryManager:n,FlowStateMachine:r,FlowLoader:i,GitInstaller:a}=await import(`../../flows/dist/index.js`),s=N(t.stateDir??``,`flows`,`installed`);return{registry:new n(l()),stateMachine:new r(o.getFlowsDir(e),Ul),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:${di(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:zl,toTextResponse:Vl,toErrorText:Hl,createFlowTransform:u,getFlows:d,stepPipeline:c,stateDir:t.stateDir??``,loadFlowDecisions:f,eventBus:i??null,skillCompiler:a??null,...o,...s}}var Gl=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`FlowError`}};function Kl(e){return e instanceof Gl}async function ql(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 Be(c(t,e.instruction,s),`utf-8`);else{let e=l(n,s);if(!e)return null;u=await Be(e,`utf-8`)}let d=N(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 Jl(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 Gl(`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 Gl(`FLOW_NOT_FOUND`,`Flow "${d.flow}" not found in registry.`);let p=u??d.currentStep;if(!p)throw new Gl(`STEP_OUT_OF_RANGE`,`No current step is available for the active flow.`);let m=await ql({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 Gl(`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=N(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 Kl(e)?l(e.message):(r.error(`flow action read failed`,A(e)),e instanceof Error&&`code`in e&&e.code===`ENOENT`?l(`Could not read instruction file: ${e.message}`):l(`Error: ${c(e)}`))}}async function Yl(e,t){let{registry:n,loader:r,installer:i}=await e.getFlows(),a=e.createFlowTransform(),o=P(t.source);if(!j(o))return e.toTextResponse(`Source path no longer exists: ${o}`);let s=`${t.installPath}.updating`,c=`${t.installPath}.backup`;j(s)&&Ae(s,{recursive:!0,force:!0}),j(c)&&Ae(c,{recursive:!0,force:!0});let l=i.copyLocal(o,Pe(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{ke(t.installPath,c),ke(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}`)}Ae(c,{recursive:!0,force:!0})}catch(r){return j(s)&&Ae(s,{recursive:!0,force:!0}),j(c)&&(j(t.installPath)&&Ae(t.installPath,{recursive:!0,force:!0}),ke(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 Xl(e,t){let{registry:n,loader:r}=await e.getFlows(),i=e.createFlowTransform();try{Vn(`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 Zl(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 Ql(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=P(m);h=e;let t=u||Pe(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`,A(e)),c(`Error: ${s(e)}`)}}async function $l(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`,A(e)),a(`Error: ${i(e)}`)}}async function eu(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`?Yl(s,t):t.sourceType===`npm-global`?Xl(s,t):Zl(s,t)}catch(e){return r.error(`flow action update failed`,A(e)),a(`Error: ${i(e)}`)}}function tu(e){return Ke(`sha256`).update(e,`utf-8`).digest(`hex`).slice(0,16)}const nu=`IMPORTANT: Start/status/step only include a brief. Call flow({ action: "read" }) before executing this flow step.`,ru=1200,iu=/artifact|output contract|gate|completion criteria|deliverable|must|do not|forbidden/i;function au(){return{artifactsPath:null,currentStepInstruction:null,currentStepDescription:null,currentStepContent:null,currentStepBrief:null,currentStepPins:null,stepSequence:[]}}function ou(e){if(e.length<=ru)return e;let t=e.slice(0,ru-1),n=Math.max(t.lastIndexOf(`
177
- `),t.lastIndexOf(` `),t.lastIndexOf(` `));return`${(n>=Math.floor(t.length*.6)?t.slice(0,n):t).trimEnd()}…`}function su(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(`
178
-
179
- `).trim();r=t?ou(t):null}let i=Array.from(e.matchAll(/^##\s+.*$/gm)),a=[];for(let[t,n]of i.entries()){let r=n[0];if(!iu.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(`
180
-
181
- `):null}}function cu(e,t){return t(e)}async function lu(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=cu(n,t.getStepSequence),u=await ql({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}=su(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:N(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:N(r.runDir,n.manifest.artifacts_dir).replaceAll(`\\`,`/`),currentStepInstruction:s,currentStepDescription:c,currentStepContent:u,currentStepBrief:p,currentStepPins:f,stepSequence:l}}function uu(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?tu(n.currentStepContent):null,s.currentStepBrief=n.currentStepBrief,s.currentStepPins=n.currentStepPins,s.fullContentHint=`Call flow({ action: 'read' }) for the complete step instructions.`,s}function du(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 fu(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 Gl(`UNKNOWN_FLOW`,`Flow "${d}" not found. Use flow({ action: "list" }) to see available flows.`);let w=S.start(C.name,C.manifest,f,du(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 Gl(`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=fr(),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=N(c,`flow-context`),D=typeof Ve==`function`?await Ve(ee).catch(()=>[]):[];for(let e of D)e!==T.slug&&typeof He==`function`&&await He(N(ee,e),{recursive:!0,force:!0}).catch(()=>{});if(typeof ze==`function`)try{await ze(N(ee,T.slug),{recursive:!0})}catch{}let te=await lu({context:t,entry:C,state:T,activeRoot:b,primaryRoot:null,roots:p??null}),ne=dr(T,C.manifest,{objective:m,acceptanceCriteria:h,scope:g,exclusions:_}),re={...uu({state:T,data:te,started:!0}),phase:T.phase,isEpilogue:T.isEpilogue,totalSteps:te.stepSequence.length,stepSequence:te.stepSequence,artifactsDir:C.manifest.artifacts_dir,roots:p??[b.replaceAll(`\\`,`/`)],snapshot:ne,_hint:nu,...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 Kl(e)?u(e.message):(o.error(`flow action start failed`,A(e)),u(`Error: ${l(e)}`))}}async function pu(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(!mr(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 lu({context:t,entry:p,state:h,activeRoot:e,primaryRoot:h.primaryRoot,roots:h.roots}),_={...uu({state:h,data:g,includeStatus:!0,action:`backtrack`}),_hint:h.currentStep?nu: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 Kl(e)?s(e.message):(r.error(`flow action backtrack failed`,A(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-B4xWqEjc.js`).then(e=>e.p)).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=pr(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 Kl(e)?s(e.message):(r.error(`flow action claim failed`,A(e)),s(`Error: ${o(e)}`))}}async function hu(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 Gl(`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 lu({context:e,entry:u,state:l,activeRoot:n,primaryRoot:l.primaryRoot,roots:l.roots}):au(),f={...uu({state:l,data:d,includeStatus:!0,includeInstructionPath:!0}),_hint:l.currentStep?nu: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 Kl(e)?o(e.message):(n.error(`flow action status failed`,A(e)),o(`Error: ${a(e)}`))}}async function gu(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 He(N(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`,A(e)),s(`Error: ${o(e)}`)}}async function _u(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?pu({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 Gl(`NO_ACTIVE_FLOW`,`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let u=r.get(l.data.flow);if(!u)throw new Gl(`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=N(t.stateDir,`flow-context`,f.slug);for(let t of[`decision`,`pattern`]){let n=N(e,t);try{let e=await Ve(n);for(let r of e){if(!r.endsWith(`.md`))continue;let e=await Be(N(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 He==`function`&&await He(e,{recursive:!0,force:!0}).catch(()=>{})}let m=await lu({context:t,entry:u,state:f,activeRoot:e,primaryRoot:f.primaryRoot,roots:f.roots}),h={...uu({state:f,data:m,includeStatus:!0,action:c}),_hint:f.currentStep?nu: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 Kl(e)?s(e.message):(r.error(`flow action step failed`,A(e)),s(`Error: ${o(e)}`))}}async function vu(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`,A(e)),o(`Error: ${a(e)}`)}}async function yu(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 Gl(`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 Kl(e)?s(e.message):(r.error(`flow action info failed`,A(e)),s(`Error: ${o(e)}`))}}async function bu(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`,A(e)),o(`Error: ${a(e)}`)}}function xu(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 Su(e,t,n,r){let i=n&&typeof n!=`function`?n:void 0,a=typeof n==`function`?n:r,o=Wl(e,t,i,i?.curated,i?.eventBus,i?.skillCompiler),s=W(`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).`)}},Y(`flow`,async e=>{switch(e.action){case`list`:return vu(o);case`info`:return e.name?yu({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 fu({flow:e.name,topic:e.topic,roots:e.roots,objective:e.objective,acceptanceCriteria:e.acceptanceCriteria,scope:e.scope,exclusions:e.exclusions},o),n=xu(t);return n&&a&&a(n),t}case`step`:return e.advance?_u({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 hu(o);return a&&a(xu(e)),e}case`reset`:{let e=await gu(o);return a&&a(null),e}case`read`:return Jl({step:e.step},o);case`runs`:return bu({flow:e.filter_flow,status:e.filter_status,limit:e.limit},o);case`add`:return e.source?Ql({source:e.source,name:e.name,token:e.token},o):o.toTextResponse(`Missing required parameter: source`);case`remove`:return e.name?$l({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`update`:return e.name?eu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`backtrack`:return e.targetStep?pu({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 Cu=O(`tools`);function wu(e){let t=W(`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},Y(`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 Ct({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=Ct({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(`
182
- `)}]}}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=Ct({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(`
183
- `)}]}}case`get`:{if(!t)throw Error(`task_id required for get`);let e=Ct({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(`
184
- `)}]}:{content:[{type:`text`,text:`Evidence map "${t}" not found.`}]}}case`gate`:{if(!t)throw Error(`task_id required for gate`);let e=Ct({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(`
185
- `)}]}}case`list`:{let e=Ct({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(`
186
- `)}]}}case`delete`:if(!t)throw Error(`task_id required for delete`);return{content:[{type:`text`,text:Ct({action:`delete`,taskId:t},p).deleted?`Deleted evidence map "${t}".`:`Evidence map "${t}" not found.`}]}}}catch(e){return Cu.error(`Evidence map error`,A(e)),J(`INTERNAL`,`Evidence map error: ${e instanceof Error?e.message:String(e)}`)}}))}function Tu(e,t){let n=W(`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:Rs,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 bt(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(`
187
- `);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 Cu.error(`Digest failed`,A(e)),{...J(`INTERNAL`,`Digest failed: ${e instanceof Error?e.message:String(e)}`),structuredContent:{text:``,ref:void 0,fields:{},sourceStats:[],totalOriginalChars:0,totalCompressedChars:0,ratio:0}}}})}function Eu(e,t,n){let r=W(`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},Y(`forge_ground`,async({task:e,files:r,root_path:i,max_constraints:a,force_tier:o,task_id:s},c)=>{try{let l=await Dt(t,n,{task:e,files:r,rootPath:i,maxConstraints:a,forceTier:o,taskId:s}),u=vc(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(`
188
- `)}]}}catch(e){return Cu.error(`FORGE Ground failed`,A(e)),J(`INTERNAL`,`FORGE Ground failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Du=O(`tools:git`);function Ou(e){let t=W(`git`);e.registerTool(`git`,{title:t.title,description:`Unified git operations — branch/status/commit context, diff parsing, changelog generation.`,outputSchema:Fs,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 Mt({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(`
189
- `)}],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 J(`VALIDATION`,`diff is required for diff_parse action`);let e=yt({diff:i.replace(/\\n/g,`
185
+ `)}}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),$l),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:${di(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:Yl,toTextResponse:Zl,toErrorText:Ql,createFlowTransform:u,getFlows:d,stepPipeline:c,stateDir:t.stateDir??``,loadFlowDecisions:f,eventBus:i??null,skillCompiler:a??null,...o,...s}}var tu=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`FlowError`}};function nu(e){return e instanceof tu}async function ru(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 ze(c(t,e.instruction,s),`utf-8`);else{let e=l(n,s);if(!e)return null;u=await ze(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 iu(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 tu(`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 tu(`FLOW_NOT_FOUND`,`Flow "${d.flow}" not found in registry.`);let p=u??d.currentStep;if(!p)throw new tu(`STEP_OUT_OF_RANGE`,`No current step is available for the active flow.`);let m=await ru({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 tu(`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 nu(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 au(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)&&ke(s,{recursive:!0,force:!0}),M(c)&&ke(c,{recursive:!0,force:!0});let l=i.copyLocal(o,Ne(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{Oe(t.installPath,c),Oe(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}`)}ke(c,{recursive:!0,force:!0})}catch(r){return M(s)&&ke(s,{recursive:!0,force:!0}),M(c)&&(M(t.installPath)&&ke(t.installPath,{recursive:!0,force:!0}),Oe(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 ou(e,t){let{registry:n,loader:r}=await e.getFlows(),i=e.createFlowTransform();try{Bn(`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 su(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 cu(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||Ne(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 D=b.steps.length;return c(`Flow "${S}" installed successfully (${D} 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 lu(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 uu(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`?au(s,t):t.sourceType===`npm-global`?ou(s,t):su(s,t)}catch(e){return r.error(`flow action update failed`,j(e)),a(`Error: ${i(e)}`)}}function du(e){return Ge(`sha256`).update(e,`utf-8`).digest(`hex`).slice(0,16)}const fu=`IMPORTANT: Start/status/step only include a brief. Call flow({ action: "read" }) before executing this flow step.`,pu=1200,mu=/artifact|output contract|gate|completion criteria|deliverable|must|do not|forbidden/i;function hu(){return{artifactsPath:null,currentStepInstruction:null,currentStepDescription:null,currentStepContent:null,currentStepBrief:null,currentStepPins:null,stepSequence:[]}}function gu(e){if(e.length<=pu)return e;let t=e.slice(0,pu-1),n=Math.max(t.lastIndexOf(`
186
+ `),t.lastIndexOf(` `),t.lastIndexOf(` `));return`${(n>=Math.floor(t.length*.6)?t.slice(0,n):t).trimEnd()}…`}function _u(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(`
187
+
188
+ `).trim();r=t?gu(t):null}let i=Array.from(e.matchAll(/^##\s+.*$/gm)),a=[];for(let[t,n]of i.entries()){let r=n[0];if(!mu.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
+
190
+ `):null}}function vu(e,t){return t(e)}async function yu(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=vu(n,t.getStepSequence),u=await ru({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}=_u(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 bu(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?du(n.currentStepContent):null,s.currentStepBrief=n.currentStepBrief,s.currentStepPins=n.currentStepPins,s.fullContentHint=`Call flow({ action: 'read' }) for the complete step instructions.`,s}function xu(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 Su(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 tu(`UNKNOWN_FLOW`,`Flow "${d}" not found. Use flow({ action: "list" }) to see available flows.`);let w=S.start(C.name,C.manifest,f,xu(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 tu(`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=fr(),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 D=P(c,`flow-context`),O=typeof Be==`function`?await Be(D).catch(()=>[]):[];for(let e of O)e!==T.slug&&typeof Ve==`function`&&await Ve(P(D,e),{recursive:!0,force:!0}).catch(()=>{});if(typeof Re==`function`)try{await Re(P(D,T.slug),{recursive:!0})}catch{}let ee=await yu({context:t,entry:C,state:T,activeRoot:b,primaryRoot:null,roots:p??null}),te=dr(T,C.manifest,{objective:m,acceptanceCriteria:h,scope:g,exclusions:_}),ne={...bu({state:T,data:ee,started:!0}),phase:T.phase,isEpilogue:T.isEpilogue,totalSteps:ee.stepSequence.length,stepSequence:ee.stepSequence,artifactsDir:C.manifest.artifacts_dir,roots:p??[b.replaceAll(`\\`,`/`)],snapshot:te,_hint:fu,...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(ne,null,2))}catch(e){return nu(e)?u(e.message):(o.error(`flow action start failed`,j(e)),u(`Error: ${l(e)}`))}}async function Cu(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(!mr(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 yu({context:t,entry:p,state:h,activeRoot:e,primaryRoot:h.primaryRoot,roots:h.roots}),_={...bu({state:h,data:g,includeStatus:!0,action:`backtrack`}),_hint:h.currentStep?fu: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 nu(e)?s(e.message):(r.error(`flow action backtrack failed`,j(e)),s(`Error: ${o(e)}`))}}async function wu(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-CxAICs-n.js`).then(e=>e.p)).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=pr(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 nu(e)?s(e.message):(r.error(`flow action claim failed`,j(e)),s(`Error: ${o(e)}`))}}async function Tu(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 tu(`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 yu({context:e,entry:u,state:l,activeRoot:n,primaryRoot:l.primaryRoot,roots:l.roots}):hu(),f={...bu({state:l,data:d,includeStatus:!0,includeInstructionPath:!0}),_hint:l.currentStep?fu: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 nu(e)?o(e.message):(n.error(`flow action status failed`,j(e)),o(`Error: ${a(e)}`))}}async function Eu(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 Ve(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 Du(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?Cu({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 tu(`NO_ACTIVE_FLOW`,`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let u=r.get(l.data.flow);if(!u)throw new tu(`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 Be(n);for(let r of e){if(!r.endsWith(`.md`))continue;let e=await ze(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 Ve==`function`&&await Ve(e,{recursive:!0,force:!0}).catch(()=>{})}let m=await yu({context:t,entry:u,state:f,activeRoot:e,primaryRoot:f.primaryRoot,roots:f.roots}),h={...bu({state:f,data:m,includeStatus:!0,action:c}),_hint:f.currentStep?fu: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 nu(e)?s(e.message):(r.error(`flow action step failed`,j(e)),s(`Error: ${o(e)}`))}}async function Ou(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 ku(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 tu(`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 nu(e)?s(e.message):(r.error(`flow action info failed`,j(e)),s(`Error: ${o(e)}`))}}async function Au(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 ju(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 Mu(e,t,n,r){let i=n&&typeof n!=`function`?n:void 0,a=typeof n==`function`?n:r,o=eu(e,t,i,i?.curated,i?.eventBus,i?.skillCompiler),s=W(`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:L.enum([`list`,`info`,`start`,`step`,`status`,`reset`,`read`,`runs`,`add`,`remove`,`update`,`backtrack`,`claim`]).describe(`The flow operation to perform.`),name:L.string().optional().describe(`Flow name — required for info, start, remove, update. Optional override for add.`),topic:L.string().optional().describe(`Human-readable topic for the run (used by start).`),objective:L.string().optional().describe(`L1 snapshot objective — the goal of this flow run. Falls back to topic when absent.`),acceptanceCriteria:L.array(L.string()).optional().describe(`L1 snapshot acceptance criteria (used by start).`),scope:L.array(L.string()).optional().describe(`L1 snapshot scope boundaries (used by start). Falls back to roots when absent.`),exclusions:L.array(L.string()).optional().describe(`L1 snapshot exclusions — what is out of scope (used by start).`),roots:L.array(L.string()).optional().describe(`Workspace roots participating in this flow (used by start).`),advance:L.enum([`next`,`skip`,`redo`,`backtrack`]).optional().describe(`Step navigation action — required for step.`),lifecycleOwnerToken:L.string().optional().describe(`Owner capability token for layered lifecycle mutations (required in layered mode for step/backtrack/claim/reset).`),currentToken:L.string().optional().describe(`Current step execution token from status response for optimistic concurrency.`),targetStep:L.string().optional().describe(`Target step ID for backtrack action — must be a completed prior step.`),step:L.string().optional().describe(`Step id or name to read (used by read). Defaults to current step.`),source:L.string().optional().describe(`Git URL, local path, or "openspec" shorthand — required for add.`),token:L.string().optional().describe(`Auth token for private repos (used by add).`),filter_flow:L.string().optional().describe(`Filter runs by flow name (used by runs).`),filter_status:L.string().optional().describe(`Filter runs by status: active, completed, abandoned (used by runs).`),limit:L.number().int().positive().optional().describe(`Max runs to return (default 50).`)}},Y(`flow`,async e=>{switch(e.action){case`list`:return Ou(o);case`info`:return e.name?ku({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 Su({flow:e.name,topic:e.topic,roots:e.roots,objective:e.objective,acceptanceCriteria:e.acceptanceCriteria,scope:e.scope,exclusions:e.exclusions},o),n=ju(t);return n&&a&&a(n),t}case`step`:return e.advance?Du({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 Tu(o);return a&&a(ju(e)),e}case`reset`:{let e=await Eu(o);return a&&a(null),e}case`read`:return iu({step:e.step},o);case`runs`:return Au({flow:e.filter_flow,status:e.filter_status,limit:e.limit},o);case`add`:return e.source?cu({source:e.source,name:e.name,token:e.token},o):o.toTextResponse(`Missing required parameter: source`);case`remove`:return e.name?lu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`update`:return e.name?uu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`backtrack`:return e.targetStep?Cu({targetStep:e.targetStep,lifecycleOwnerToken:e.lifecycleOwnerToken,currentToken:e.currentToken},o):o.toTextResponse(`Missing required parameter: targetStep for backtrack action`);case`claim`:return wu({currentToken:e.currentToken},o);default:return o.toTextResponse(`Unknown action: ${e.action}`)}}))}const Nu=k(`tools`);function Pu(e){let t=W(`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:L.enum([`create`,`add`,`update`,`get`,`gate`,`list`,`delete`]).describe(`Operation to perform`),task_id:L.string().optional().describe(`Task identifier (required for all except list)`),tier:L.enum([`floor`,`standard`,`critical`]).optional().describe(`FORGE tier (required for create)`),claim:L.string().optional().describe(`Critical-path claim text (for add)`),status:L.enum([`V`,`A`,`U`]).optional().describe(`Evidence status: V=Verified, A=Assumed, U=Unresolved`),receipt:L.string().optional().describe(`Evidence receipt: tool→ref for V, reasoning for A, attempts for U`),id:L.number().optional().describe(`Entry ID (for update)`),critical_path:L.boolean().default(!0).describe(`Whether this claim is on the critical path`),unknown_type:L.enum([`contract`,`convention`,`freshness`,`runtime`,`data-flow`,`impact`]).optional().describe(`Typed unknown classification`),safety_gate:L.enum([`provenance`,`commitment`,`coverage`]).optional().describe(`Safety gate tag: provenance (claim→evidence), commitment (user-approved), coverage (nothing dropped)`),retry_count:L.number().default(0).describe(`Retry count for gate evaluation (0 = first attempt)`),max_retries:L.number().int().min(0).optional().describe(`Maximum retries before escalating. Default: 3`),timeout_action:L.enum([`iterate`,`retry`,`manual`,`terminate`]).optional().describe(`Action to take when gate retries are exhausted. Default: manual`),cwd:L.string().optional().describe(`Working directory for evidence map storage (default: server cwd). Use root_path from forge_ground to match.`)},annotations:t.annotations},Y(`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 St({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=St({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
+ `)}]}}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=St({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(`
192
+ `)}]}}case`get`:{if(!t)throw Error(`task_id required for get`);let e=St({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(`
193
+ `)}]}:{content:[{type:`text`,text:`Evidence map "${t}" not found.`}]}}case`gate`:{if(!t)throw Error(`task_id required for gate`);let e=St({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(`
194
+ `)}]}}case`list`:{let e=St({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(`
195
+ `)}]}}case`delete`:if(!t)throw Error(`task_id required for delete`);return{content:[{type:`text`,text:St({action:`delete`,taskId:t},p).deleted?`Deleted evidence map "${t}".`:`Evidence map "${t}" not found.`}]}}}catch(e){return Nu.error(`Evidence map error`,j(e)),J(`INTERNAL`,`Evidence map error: ${e instanceof Error?e.message:String(e)}`)}}))}function Fu(e,t){let n=W(`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:Hs,inputSchema:{sources:L.array(L.object({id:L.string().describe(`Source identifier (e.g., "phase-2-handoff")`),text:L.string().max(5e5).describe(`Source text to compress`),weight:L.number().min(0).default(1).describe(`Priority weight (higher = more budget)`)})).min(1).max(20).describe(`Text sources to compress`),query:L.string().describe(`Focus query — what matters for the next step?`),max_chars:L.number().min(100).max(5e4).default(4e3).describe(`Target budget in characters`),pin_fields:L.array(L.string()).optional().describe(`Key fields to always extract (default: status, files, decisions, blockers, next)`),segmentation:L.enum([`paragraph`,`sentence`,`line`]).default(`paragraph`).describe(`How to split text for scoring`),token_budget:L.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 yt(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(`
196
+ `);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 Nu.error(`Digest failed`,j(e)),{...J(`INTERNAL`,`Digest failed: ${e instanceof Error?e.message:String(e)}`),structuredContent:{text:``,ref:void 0,fields:{},sourceStats:[],totalOriginalChars:0,totalCompressedChars:0,ratio:0}}}})}function Iu(e,t,n){let r=W(`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:L.string().describe(`Task description`),files:L.array(L.string()).min(1).max(100).describe(`Target files being modified (absolute paths)`),root_path:L.string().describe(`Root path of the codebase`),max_constraints:L.number().min(0).max(10).default(3).describe(`Max constraint entries to load from AI Kit memory`),force_tier:L.enum([`floor`,`standard`,`critical`]).optional().describe(`Force a specific tier (skips auto-classification)`),task_id:L.string().optional().describe(`Custom task ID for evidence map (auto-generated if omitted)`)},annotations:r.annotations},Y(`forge_ground`,async({task:e,files:r,root_path:i,max_constraints:a,force_tier:o,task_id:s},c)=>{try{let l=await Et(t,n,{task:e,files:r,rootPath:i,maxConstraints:a,forceTier:o,taskId:s}),u=Oc(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(`
197
+ `)}]}}catch(e){return Nu.error(`FORGE Ground failed`,j(e)),J(`INTERNAL`,`FORGE Ground failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Lu=k(`tools:git`);function Ru(e){let t=W(`git`);e.registerTool(`git`,{title:t.title,description:`Unified git operations — branch/status/commit context, diff parsing, changelog generation.`,outputSchema:zs,inputSchema:{action:L.enum([`context`,`diff_parse`,`changelog`]).describe(`Which git sub-operation to perform`),cwd:L.string().optional().describe(`Repository root or working directory`),commit_count:L.number().min(1).max(50).default(5).optional().describe(`How many recent commits to include (context only)`),include_diff:L.boolean().default(!1).optional().describe(`Include diff stat for working tree changes (context only)`),diff:L.string().max(1e6).optional().describe(`Raw unified diff text (diff_parse only)`),from:L.string().max(200).optional().describe(`Start ref (tag, SHA, HEAD~N) — required for changelog`),to:L.string().max(200).default(`HEAD`).optional().describe(`End ref (changelog only)`),format:L.enum([`grouped`,`chronological`,`per-scope`]).default(`grouped`).optional().describe(`Output format (changelog only)`),include_breaking:L.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 jt({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(`
198
+ `)}],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 J(`VALIDATION`,`diff is required for diff_parse action`);let e=vt({diff:i.replace(/\\n/g,`
190
199
  `).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(`
191
- `)}]}}case`changelog`:{if(!a)return J(`VALIDATION`,`from is required for changelog action`);let e=nt({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 Du.error(`Git operation failed`,A(e)),J(`INTERNAL`,`Git operation failed: ${e instanceof Error?e.message:String(e)}`)}})}const ku=O(`tools`),Au=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`)}),ju=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 Mu(e,t,n){let r=W(`graph`);e.registerTool(`graph`,{title:r.title,description:`Query the auto-populated code knowledge graph (modules, symbols, imports) to answer
200
+ `)}]}}case`changelog`:{if(!a)return J(`VALIDATION`,`from is required for changelog action`);let e=tt({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 Lu.error(`Git operation failed`,j(e)),J(`INTERNAL`,`Git operation failed: ${e instanceof Error?e.message:String(e)}`)}})}const zu=k(`tools`),Bu=L.object({id:L.string().optional().describe(`Node ID (auto-generated if omitted)`),type:L.string().describe(`Node type (entity, service, api, concept, decision)`),name:L.string().describe(`Display name`),properties:L.record(L.string(),L.unknown()).optional().describe(`Arbitrary properties`),sourceRecordId:L.string().optional().describe(`Back-link to knowledge record ID`),sourcePath:L.string().optional().describe(`Source file path`)}),Vu=L.object({id:L.string().optional().describe(`Edge ID (auto-generated if omitted)`),fromId:L.string().describe(`Source node ID`),toId:L.string().describe(`Target node ID`),type:L.string().describe(`Relationship type (depends-on, implements, calls, affects)`),weight:L.number().min(0).max(1).optional().describe(`Relationship weight`),properties:L.record(L.string(),L.unknown()).optional().describe(`Arbitrary properties`)});function Hu(e,t,n){let r=W(`graph`);e.registerTool(`graph`,{title:r.title,description:`Query the auto-populated code knowledge graph (modules, symbols, imports) to answer
192
201
  structural questions vector search cannot.
193
202
 
194
203
  Common flow (when you don't have a node_id yet — TWO STEPS):
@@ -207,49 +216,49 @@ Single-step read actions:
207
216
  Mutating actions (use deliberately): add, delete, clear, set_community,
208
217
  detect_communities, trace_process, delete_process.
209
218
 
210
- Complements: \`symbol\` (single lookup), \`trace\` (call-chain AST), \`blast_radius\` (change impact).`,outputSchema:Ps,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(Au).max(500).optional().describe(`Nodes to add (for action=add)`),edges:I.array(ju).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},Y(`graph`,async e=>{try{let r=await Pt(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=tt(r.nodes??[]);if(r.nodes&&r.nodes.length>0){i.push(`
219
+ Complements: \`symbol\` (single lookup), \`trace\` (call-chain AST), \`blast_radius\` (change impact).`,outputSchema:Rs,inputSchema:{action:L.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:L.string().optional().describe(`Node type filter (for find_nodes)`),name_pattern:L.string().optional().describe(`Name substring match (for find_nodes)`),source_path:L.string().optional().describe(`Source path filter`),node_id:L.string().optional().describe(`Node ID (for neighbors, traverse, delete)`),edge_type:L.string().optional().describe(`Edge type filter`),from_id:L.string().optional().describe(`Source node ID (for find_edges)`),to_id:L.string().optional().describe(`Target node ID (for find_edges)`),direction:L.enum([`outgoing`,`incoming`,`both`]).default(`both`).describe(`Traversal direction`),max_depth:L.number().min(1).max(5).default(2).describe(`Max traversal depth`),limit:L.number().min(1).max(100).default(50).describe(`Max results`),max_tokens:L.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),nodes:L.array(Bu).max(500).optional().describe(`Nodes to add (for action=add)`),edges:L.array(Vu).max(500).optional().describe(`Edges to add (for action=add)`),community:L.string().optional().describe(`Community label (for set_community, cohesion)`),process_id:L.string().optional().describe(`Process ID (for delete_process)`),label:L.string().optional().describe(`Label for process tracing (for trace_process)`),enrich:L.boolean().default(!1).optional().describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens.`)},annotations:r.annotations},Y(`graph`,async e=>{try{let r=await Nt(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=et(r.nodes??[]);if(r.nodes&&r.nodes.length>0){i.push(`
211
220
  ### 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(`
212
- ### Edges`);for(let e of r.edges){let t=gn(e.fromId,a),n=gn(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(`
221
+ ### Edges`);for(let e of r.edges){let t=hn(e.fromId,a),n=hn(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(`
213
222
  ### 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(`
214
223
  ### Communities`);let e=r.communities,t=e.slice(0,15),n=e.slice(15);for(let e of t){let t=Object.entries(e.types).sort((e,t)=>t[1]-e[1]).map(([e,t])=>`${e}(${t})`).join(`, `),n=e.samples.map(e=>`\`${e.name}\``).join(`, `);i.push(`- **${e.id.slice(0,8)}…**: ${e.nodeCount} node(s) — ${t} — ${n}`)}if(n.length>0){let e=n.reduce((e,t)=>e+t.nodeCount,0),t={};for(let e of n)for(let[n,r]of Object.entries(e.types))t[n]=(t[n]??0)+r;let r=Object.entries(t).sort((e,t)=>t[1]-e[1]).map(([t,n])=>`${t}(${Math.round(n/e*100)}%)`).join(`, `);i.push(`+ **${n.length} smaller communities** (${e} nodes): ${r}`)}}if(r.process&&(i.push(`
215
224
  ### Process`),i.push(`- **${r.process.label}** (id: \`${r.process.id}\`)`),i.push(`- Entry: \`${r.process.entryNodeId}\``),i.push(`- Steps: ${r.process.steps.map(e=>`\`${e}\``).join(` → `)}`)),r.processes&&r.processes.length>0){i.push(`
216
225
  ### Processes`);for(let e of r.processes)i.push(`- **${e.label}** (id: \`${e.id}\`) — ${e.steps.length} step(s)`)}if(r.depthGroups){i.push(`
217
226
  ### 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(`
218
227
  ### 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(`
219
- `);if(e.enrich&&n){let t=await K(n,{query:`graph ${e.action} ${e.name_pattern??e.node_id??e.community??``}`.trim(),filePath:e.source_path});o+=q(t)}return{content:[{type:`text`,text:e.max_tokens?F(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:gn(e.fromId,a),toName:gn(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 ku.error(`Graph query failed`,A(e)),J(`INTERNAL`,`Graph query failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Nu=O(`tools:infra`);function Pu(e){let t=W(`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},Y(`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(Xt(t,n,r??[]))}]};case`stop`:if(!t)throw Error(`id is required for stop`);return{content:[{type:`text`,text:JSON.stringify(Qt(t)??null)}]};case`status`:if(!t)throw Error(`id is required for status`);return{content:[{type:`text`,text:JSON.stringify(Zt(t)??null)}]};case`list`:return{content:[{type:`text`,text:JSON.stringify(Jt())}]};case`logs`:if(!t)throw Error(`id is required for logs`);return{content:[{type:`text`,text:JSON.stringify(Yt(t,i))}]}}}catch(e){return Nu.error(`Process action failed`,A(e)),J(`INTERNAL`,`Process action failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Fu(e){let t=W(`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},Y(`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 Ln({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(`
220
- `)};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)?Nu.warn(`Web fetch failed`,{error:t}):Nu.error(`Web fetch failed`,A(e)),{...J(`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)?Nu.warn(`Web fetch failed`,{url:l[e],error:n}):Nu.error(`Web fetch failed`,{url:l[e],...A(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(`
221
-
222
- `);return m===f.length?J(`INTERNAL`,g):{content:[{type:`text`,text:g}]}}))}function Iu(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 Lu(e){let t=new Set,n=[];for(let r of e){let e=Iu(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 Ru(e){if(e.startsWith(`.ai/curated/`))return e.slice(12)}const zu={decisions:`decision`,patterns:`pattern`,conventions:`pattern`,context:`analysis`,session:`step-summary`},Bu=new Set([`decision`,`pattern`,`file-card`,`analysis`,`search-result`,`step-summary`]),Vu=I.enum([`remember`,`read`,`update`,`forget`,`list`,`history`,`diff`,`recover`,`orphaned`,`withdraw`,`flush`,`flagged`,`lesson`,`gap-analysis`]),Hu=I.enum([`create`,`confirm`,`contradict`,`list-lessons`,`auto-observe`,`prune`,`group`,`promote`,`demote`]),Uu=I.enum([`confidence`,`recent`]),Wu=I.string().min(3).max(120).describe(`Short descriptive title for the knowledge entry`),Gu=I.string().min(10).max(1e5),Ku=I.string().regex(/^[a-z][a-z0-9-]*$/).describe(`Category slug (e.g., "decisions", "patterns", "conventions", "api-contracts")`),qu=I.array(I.string()).default([]).describe(`Optional tags for filtering`),Ju=I.string().describe(`Relative path within .ai/curated/ (e.g., "decisions/use-lancedb.md")`),Yu=I.string().min(3),Xu=I.number().int().min(0).max(100).describe(`Lesson confidence from 0-100`),Zu=I.object({title:Wu,content:Gu.describe(`The markdown content to store`),category:Ku,tags:qu,force:I.boolean().optional().describe(`When true, supersede flagged similar entries without waiting for confirmation`)}),Qu=I.object({path:Ju}),$u=I.object({path:Ju,content:Gu.describe(`New markdown content to replace existing content`),reason:Yu.max(1e3).describe(`Why this update is being made (recorded in changelog)`)}),ed=I.object({path:I.string().describe(`Relative path within .ai/curated/ (e.g., "decisions/deprecated-approach.md")`),reason:Yu.describe(`Why this entry is being removed`)}),td=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`)}),nd=I.object({title:Wu,context:Gu.describe(`What happened (the situation)`),insight:Gu.describe(`What was learned (the lesson)`),evidence:Gu.describe(`Proof or justification`),confidence:Xu.default(50),tags:qu.optional().default([])}),rd=I.object({path:Ju.optional(),id:Ju.optional(),reason:Yu.max(1e3).optional()}).refine(e=>!!(e.path??e.id),{message:`path or id is required`,path:[`path`]}),id=I.object({topic:I.string().optional(),minConfidence:Xu.optional(),tag:I.string().optional(),tags:I.array(I.string()).optional(),sortBy:Uu.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)}),ad=I.object({bufferPath:I.string().optional()}),od=I.object({maxConfidence:Xu.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)}),sd=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)}),cd=I.object({minWorkspaces:I.number().int().min(2).max(1e3).optional(),minAvgConfidence:Xu.optional(),similarityThreshold:I.number().min(0).max(1).optional(),dryRun:I.boolean().default(!0)}),ld=I.object({action:Vu.describe(`Knowledge operation to perform`),title:Wu.optional(),content:Gu.optional(),category:Ku.optional(),tags:I.array(I.string()).optional().describe(`Optional tags for remember`),path:Ju.optional(),reason:Yu.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:Ju.optional().describe(`Alias for path when action="lesson"`),subAction:Hu.optional().describe(`Lesson sub-action when action="lesson"`),bufferPath:I.string().optional().describe(`Optional observation buffer path for lesson auto-observe`),context:Gu.optional().describe(`What happened (the situation) for lesson creation`),insight:Gu.optional().describe(`What was learned (the lesson) for lesson creation`),evidence:Gu.optional().describe(`Proof or justification for lesson creation`),confidence:Xu.optional(),minConfidence:Xu.optional().describe(`Minimum confidence when listing lessons`),topic:I.string().optional().describe(`Topic filter when listing lessons`),sortBy:Uu.optional().describe(`Sort lessons by confidence or recency`),includeArchived:I.boolean().optional().describe(`Include auto-archived lessons in list-lessons`),maxConfidence:Xu.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:Xu.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.`)}),ud=O(`tools`);function dd(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 fd(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 K(n,{query:dd(t.action,t)});i+=q(e)}t.max_tokens&&(i=F(i,t.max_tokens));let a=$c(i),o=el(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 pd(e,t,n,r){p(e,t,n);let i=e.memoryMetaGet(t);if(!i)return;let o=c(i,{...a,...r});return o?(D(e,t,o),d(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(`
223
- `)}`}async function hd(e,n,i,a){if(typeof e.list!=`function`||typeof e.read!=`function`)return[];let o=t(a),s=await e.list({category:i,limit:o.maxCompare,orderBy:`updated`,order:`desc`});return s.length===0?[]:r(n,await Promise.all(s.map(async t=>{let n=await e.read(t.path);return{id:t.path,title:n.title,content:n.content,path:t.path}})),o)}function gd(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 _d(e){if(!e)return`analysis`;let t=zu[e]??e;return Bu.has(t)?t:`analysis`}function vd(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 yd(e,t){return e??t??``}function bd(e){return[...new Set([...e??[],`lesson`])]}function xd(e,t,n){if(e)return e.memoryMetaCreate(t,`working`),e.memoryMetaUpdateConfidence(t,n),e.memoryMetaGet(t)}function Sd(e,t,n,r=i){if(!e)return;let a=o(r);e.memoryMetaCreate(t,`working`),e.memoryMetaTouch(t);let s=n??e.memoryMetaGet(t)?.confidence??50,c=Math.min(100,s+a.implicitUseIncrement);return e.memoryMetaUpdateConfidence(t,c),e.memoryMetaGet(t)}function Cd(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 wd(e,t,n){let r=await e.read(n),i=v(r.content),a=t?.memoryMetaGet(n)?.confidence??i.confidence??50;return{entry:r,confidence:a,meta:xd(t,n,a)??t?.memoryMetaGet(n)}}function Td(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 Ed(e){if(e){let t=P(e);try{return await Ue(t),t}catch{return}}let t=(await Ve(Un(),{withFileTypes:!0})).filter(e=>e.isFile()&&e.name.startsWith(`aikit-obs-`)&&e.name.endsWith(`.jsonl`)).map(e=>N(Un(),e.name)),n=await Promise.all(t.map(async e=>{try{return{path:e,mtimeMs:(await Ue(e)).mtimeMs}}catch{return{path:e,mtimeMs:0}}}));return n.sort((e,t)=>t.mtimeMs-e.mtimeMs),n[0]?.path}function Dd(e,t){return t.map(t=>({path:t.path,title:t.title,similarity:f(e,t.title)})).filter(e=>e.similarity>.8).sort((e,t)=>t.similarity-e.similarity)[0]}function Od(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(`
224
- `)}function kd(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(`
225
- `)}function Ad(t,n){let r=t;return new e(n,r.store,r.embedder)}function jd(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(`
226
- `)}async function Md(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=_d(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}=Zu.parse(e),h=t(l),g=await hd(i,d,f,h),_=await i.remember(u,d,f,p);c?.memoryMetaCreate(_.path,`working`);let v=gd(g,h.autoThreshold,m);if(c)for(let e of v.superseded)E(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(`
228
+ `);if(e.enrich&&n){let t=await K(n,{query:`graph ${e.action} ${e.name_pattern??e.node_id??e.community??``}`.trim(),filePath:e.source_path});o+=q(t)}return{content:[{type:`text`,text:e.max_tokens?I(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:hn(e.fromId,a),toName:hn(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 zu.error(`Graph query failed`,j(e)),J(`INTERNAL`,`Graph query failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Uu=k(`tools:infra`);function Wu(e){let t=W(`process`);e.registerTool(`process`,{title:t.title,description:`Start, stop, inspect, list, and tail logs for in-memory managed child processes.`,inputSchema:{action:L.enum([`start`,`stop`,`status`,`list`,`logs`]).describe(`Process action to perform`),id:L.string().optional().describe(`Managed process ID`),command:L.string().optional().describe(`Executable to start`),args:L.array(L.string()).optional().describe(`Arguments for start actions`),tail:L.number().min(1).max(500).optional().describe(`Log lines to return for logs actions`)},annotations:t.annotations},Y(`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(Yt(t,n,r??[]))}]};case`stop`:if(!t)throw Error(`id is required for stop`);return{content:[{type:`text`,text:JSON.stringify(Zt(t)??null)}]};case`status`:if(!t)throw Error(`id is required for status`);return{content:[{type:`text`,text:JSON.stringify(Xt(t)??null)}]};case`list`:return{content:[{type:`text`,text:JSON.stringify(qt())}]};case`logs`:if(!t)throw Error(`id is required for logs`);return{content:[{type:`text`,text:JSON.stringify(Jt(t,i))}]}}}catch(e){return Uu.error(`Process action failed`,j(e)),J(`INTERNAL`,`Process action failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Gu(e){let t=W(`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:L.array(L.string().url()).min(1).max(10).describe('URLs to fetch (1–10). Single URL: `["https://..."]`. Multiple fetched in parallel.'),mode:L.enum([`markdown`,`raw`,`links`,`outline`]).default(`markdown`).describe(`Output mode: markdown (clean content), raw (HTML), links (extracted URLs), outline (heading hierarchy)`),selector:L.string().optional().describe(`CSS selector to extract a specific element instead of auto-detecting main content`),max_length:L.number().min(500).max(1e5).default(15e3).describe(`Max characters in output — truncates at paragraph boundaries`),include_metadata:L.boolean().default(!0).describe(`Include page title, description, and URL as a header`),include_links:L.boolean().default(!1).describe(`Append extracted links list at the end`),include_images:L.boolean().default(!1).describe(`Include image alt texts inline`),timeout:L.number().min(1e3).max(12e4).default(3e4).describe(`Request timeout in milliseconds`),allow_localhost:L.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},Y(`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 In({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(`
229
+ `)};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)?Uu.warn(`Web fetch failed`,{error:t}):Uu.error(`Web fetch failed`,j(e)),{...J(`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)?Uu.warn(`Web fetch failed`,{url:l[e],error:n}):Uu.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(`
230
+
231
+ `);return m===f.length?J(`INTERNAL`,g):{content:[{type:`text`,text:g}]}}))}function Ku(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 qu(e){let t=new Set,n=[];for(let r of e){let e=Ku(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 Ju(e){if(e.startsWith(`.ai/curated/`))return e.slice(12)}const Yu={decisions:`decision`,patterns:`pattern`,conventions:`pattern`,context:`analysis`,session:`step-summary`},Xu=new Set([`decision`,`pattern`,`file-card`,`analysis`,`search-result`,`step-summary`]),Zu=L.enum([`remember`,`read`,`update`,`forget`,`list`,`history`,`diff`,`recover`,`orphaned`,`withdraw`,`flush`,`flagged`,`lesson`,`gap-analysis`]),Qu=L.enum([`create`,`confirm`,`contradict`,`list-lessons`,`auto-observe`,`prune`,`group`,`promote`,`demote`]),$u=L.enum([`confidence`,`recent`]),ed=L.string().min(3).max(120).describe(`Short descriptive title for the knowledge entry`),td=L.string().min(10).max(1e5),nd=L.string().regex(/^[a-z][a-z0-9-]*$/).describe(`Category slug (e.g., "decisions", "patterns", "conventions", "api-contracts")`),rd=L.array(L.string()).default([]).describe(`Optional tags for filtering`),id=L.string().describe(`Relative path within .ai/curated/ (e.g., "decisions/use-lancedb.md")`),ad=L.string().min(3),od=L.number().int().min(0).max(100).describe(`Lesson confidence from 0-100`),sd=L.object({title:ed,content:td.describe(`The markdown content to store`),category:nd,tags:rd,force:L.boolean().optional().describe(`When true, supersede flagged similar entries without waiting for confirmation`)}),cd=L.object({path:id}),ld=L.object({path:id,content:td.describe(`New markdown content to replace existing content`),reason:ad.max(1e3).describe(`Why this update is being made (recorded in changelog)`)}),ud=L.object({path:L.string().describe(`Relative path within .ai/curated/ (e.g., "decisions/deprecated-approach.md")`),reason:ad.describe(`Why this entry is being removed`)}),dd=L.object({category:L.string().optional().describe(`Filter by category (e.g., "decisions", "patterns")`),tag:L.string().optional().describe(`Filter by tag`),limit:L.number().int().min(1).max(200).default(50).describe(`Maximum entries to return`),offset:L.number().int().min(0).default(0).describe(`Pagination offset`)}),fd=L.object({title:ed,context:td.describe(`What happened (the situation)`),insight:td.describe(`What was learned (the lesson)`),evidence:td.describe(`Proof or justification`),confidence:od.default(50),tags:rd.optional().default([])}),pd=L.object({path:id.optional(),id:id.optional(),reason:ad.max(1e3).optional()}).refine(e=>!!(e.path??e.id),{message:`path or id is required`,path:[`path`]}),md=L.object({topic:L.string().optional(),minConfidence:od.optional(),tag:L.string().optional(),tags:L.array(L.string()).optional(),sortBy:$u.default(`confidence`),includeArchived:L.boolean().default(!1),limit:L.number().int().min(1).max(200).default(50),offset:L.number().int().min(0).default(0)}),hd=L.object({bufferPath:L.string().optional()}),gd=L.object({maxConfidence:od.optional(),minIdleDays:L.number().int().min(1).optional(),safetyDays:L.number().int().min(0).optional(),maxPrune:L.number().int().min(1).max(1e3).optional(),dryRun:L.boolean().default(!0)}),_d=L.object({similarityThreshold:L.number().min(0).max(1).optional(),minGroupSize:L.number().int().min(2).max(1e3).optional(),maxGroups:L.number().int().min(1).max(1e3).optional(),dryRun:L.boolean().default(!0)}),vd=L.object({minWorkspaces:L.number().int().min(2).max(1e3).optional(),minAvgConfidence:od.optional(),similarityThreshold:L.number().min(0).max(1).optional(),dryRun:L.boolean().default(!0)}),yd=L.object({action:Zu.describe(`Knowledge operation to perform`),title:ed.optional(),content:td.optional(),category:nd.optional(),tags:L.array(L.string()).optional().describe(`Optional tags for remember`),path:id.optional(),reason:ad.max(1e3).optional(),scope:L.enum([`curated`,`flow`]).optional().describe(`Storage scope: curated (default) or flow-scoped ephemeral context`),profile:L.string().optional().describe(`Role profile for withdraw filtering (e.g., "implementer", "reviewer", "debugger")`),budget:L.number().int().min(100).max(5e4).optional().describe(`Maximum character budget for withdraw results (default: 6000)`),token_budget:L.number().int().min(50).max(12500).optional().describe(`Token budget (overrides budget). Approx 4 chars per token.`),tag:L.string().optional().describe(`Filter by tag when action="list"`),id:id.optional().describe(`Alias for path when action="lesson"`),subAction:Qu.optional().describe(`Lesson sub-action when action="lesson"`),bufferPath:L.string().optional().describe(`Optional observation buffer path for lesson auto-observe`),context:td.optional().describe(`What happened (the situation) for lesson creation`),insight:td.optional().describe(`What was learned (the lesson) for lesson creation`),evidence:td.optional().describe(`Proof or justification for lesson creation`),confidence:od.optional(),minConfidence:od.optional().describe(`Minimum confidence when listing lessons`),topic:L.string().optional().describe(`Topic filter when listing lessons`),sortBy:$u.optional().describe(`Sort lessons by confidence or recency`),includeArchived:L.boolean().optional().describe(`Include auto-archived lessons in list-lessons`),maxConfidence:od.optional().describe(`Prune lessons below this effective confidence`),minIdleDays:L.number().int().min(1).optional().describe(`Minimum idle days required before pruning a lesson`),safetyDays:L.number().int().min(0).optional().describe(`Never prune if accessed within this many days`),maxPrune:L.number().int().min(1).max(1e3).optional().describe(`Maximum number of lessons to prune in one run`),similarityThreshold:L.number().min(0).max(1).optional().describe(`Minimum Jaccard similarity required to group lesson titles`),minGroupSize:L.number().int().min(2).max(1e3).optional().describe(`Minimum number of lessons required to form a group`),maxGroups:L.number().int().min(1).max(1e3).optional().describe(`Maximum number of lesson groups to create in one run`),minWorkspaces:L.number().int().min(2).max(1e3).optional().describe(`Minimum number of distinct workspaces required before promoting a lesson`),minAvgConfidence:od.optional().describe(`Minimum average lesson confidence required before promoting a lesson`),dryRun:L.boolean().optional().describe(`Preview the operation without modifying stored lessons`),limit:L.number().int().min(1).max(200).optional().describe(`Maximum entries to return for list/history operations`),offset:L.number().int().min(0).optional().describe(`Pagination offset when action="list"`),force:L.boolean().optional().describe(`When true, supersede flagged similar entries without waiting for confirmation`),from_sha:L.string().optional().describe(`Start SHA for diff (older version). If omitted with to_sha, shows full content.`),to_sha:L.string().optional().describe(`End SHA for diff (newer version). If omitted, uses the latest two versions.`),max_tokens:L.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),enrich:L.boolean().default(!1).optional().describe(`Append curated knowledge and graph context to output. Adds ~150-250 tokens.`)}),bd=k(`tools`);function xd(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 Sd(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 K(n,{query:xd(t.action,t)});i+=q(e)}t.max_tokens&&(i=I(i,t.max_tokens));let a=ll(i),o=ul(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 Cd(e,t,n,r){p(e,t,n);let i=e.memoryMetaGet(t);if(!i)return;let o=c(i,{...a,...r});return o?(O(e,t,o),d(e,t,n)??e.memoryMetaGet(t)):i}function wd(e,t){return`\n\n### ${e}\n${t.map(e=>`- **${e.title}** (${e.id}) — similarity ${e.similarity.toFixed(3)}`).join(`
232
+ `)}`}async function Td(e,n,i,a){if(typeof e.list!=`function`||typeof e.read!=`function`)return[];let o=t(a),s=await e.list({category:i,limit:o.maxCompare,orderBy:`updated`,order:`desc`});return s.length===0?[]:r(n,await Promise.all(s.map(async t=>{let n=await e.read(t.path);return{id:t.path,title:n.title,content:n.content,path:t.path}})),o)}function Ed(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 Dd(e){if(!e)return`analysis`;let t=Yu[e]??e;return Xu.has(t)?t:`analysis`}function Od(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 kd(e,t){return e??t??``}function Ad(e){return[...new Set([...e??[],`lesson`])]}function jd(e,t,n){if(e)return e.memoryMetaCreate(t,`working`),e.memoryMetaUpdateConfidence(t,n),e.memoryMetaGet(t)}function Md(e,t,n,r=i){if(!e)return;let a=o(r);e.memoryMetaCreate(t,`working`),e.memoryMetaTouch(t);let s=n??e.memoryMetaGet(t)?.confidence??50,c=Math.min(100,s+a.implicitUseIncrement);return e.memoryMetaUpdateConfidence(t,c),e.memoryMetaGet(t)}function Nd(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 Pd(e,t,n){let r=await e.read(n),i=v(r.content),a=t?.memoryMetaGet(n)?.confidence??i.confidence??50;return{entry:r,confidence:a,meta:jd(t,n,a)??t?.memoryMetaGet(n)}}function Fd(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 Id(e){if(e){let t=F(e);try{return await He(t),t}catch{return}}let t=(await Be(Hn(),{withFileTypes:!0})).filter(e=>e.isFile()&&e.name.startsWith(`aikit-obs-`)&&e.name.endsWith(`.jsonl`)).map(e=>P(Hn(),e.name)),n=await Promise.all(t.map(async e=>{try{return{path:e,mtimeMs:(await He(e)).mtimeMs}}catch{return{path:e,mtimeMs:0}}}));return n.sort((e,t)=>t.mtimeMs-e.mtimeMs),n[0]?.path}function Ld(e,t){return t.map(t=>({path:t.path,title:t.title,similarity:f(e,t.title)})).filter(e=>e.similarity>.8).sort((e,t)=>t.similarity-e.similarity)[0]}function Rd(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(`
233
+ `)}function zd(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(`
234
+ `)}function Bd(t,n){let r=t;return new e(n,r.store,r.embedder)}function Vd(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(`
235
+ `)}async function Hd(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=Dd(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}=sd.parse(e),h=t(l),g=await Td(i,d,f,h),_=await i.remember(u,d,f,p);c?.memoryMetaCreate(_.path,`working`);let v=Ed(g,h.autoThreshold,m);if(c)for(let e of v.superseded)E(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(`
227
236
  `)}\n- **Push recommended**: ${e.pushRecommended?`yes`:`no`} (max weight: ${e.maxPushWeight})`,e.pushRecommended&&(y+=`
228
237
 
229
- > 💡 This entry matches push rules. Consider \`er_push\` to share with Enterprise RAG.`))}s&&s.notifyAfterCuratedWrite(_.path).catch(()=>{});let b=Iu(_.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 Nd(e,{curated:t,stateStore:n,retentionConfig:r,consolidationConfig:i}){let{path:a}=Qu.parse(e),o=await t.read(a),s=n?pd(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(`
230
- `),l=Iu(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 Pd(e,{curated:t,resourceNotifier:n}){let{path:r,content:i,reason:a}=$u.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 Fd(e,{curated:t,resourceNotifier:n}){let{path:r,reason:i}=ed.parse(e),a=P(t.curatedDir,r);if(j(a))try{mt(`forget`,[{path:a,content:M(a,`utf-8`)}],`forget: ${r}`)}catch{}let o=await t.forget(r,i);return ud.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 Id(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
238
+ > 💡 This entry matches push rules. Consider \`er_push\` to share with Enterprise RAG.`))}s&&s.notifyAfterCuratedWrite(_.path).catch(()=>{});let b=Ku(_.path,u,`[${f}]`),x=v.superseded.length>0?wd(`Superseded Entries`,v.superseded):``,S=v.supersessionCandidates.length>0?wd(`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 Ud(e,{curated:t,stateStore:n,retentionConfig:r,consolidationConfig:i}){let{path:a}=cd.parse(e),o=await t.read(a),s=n?Cd(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(`
239
+ `),l=Ku(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 Wd(e,{curated:t,resourceNotifier:n}){let{path:r,content:i,reason:a}=ld.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 Gd(e,{curated:t,resourceNotifier:n}){let{path:r,reason:i}=ud.parse(e),a=F(t.curatedDir,r);if(M(a))try{pt(`forget`,[{path:a,content:N(a,`utf-8`)}],`forget: ${r}`)}catch{}let o=await t.forget(r,i);return bd.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 Kd(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
231
240
 
232
241
  No flow context entries found.`}]};let n=e.map(e=>` - \`${e.path}\` (${e.size} chars)`).join(`
233
- `);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}=td.parse(e),l=await n.listPage({category:a,tag:o,limit:s,offset:c,orderBy:`updated`,order:`desc`}),u=l.entries,f=u.map(e=>({entry:e,retentionMeta:r?d(r,e.path,i):void 0})),p={entries:f.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:p};let m=f.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(`
234
- `),h=Lu(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${m}${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:p}}async function Ld(e,{curated:t}){let{path:n}=Qu.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(`
235
- `);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 Rd(e,{curated:t}){let{path:n}=Qu.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 zd(e,{curated:t}){let{path:n}=Qu.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 Bd(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(`
236
- `);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 Vd(e,{curated:t,stateStore:r,retentionConfig:a,lessonConfig:s}){if(!r)return{content:[{type:`text`,text:`Retention state store not available.`}],structuredContent:{entries:[],totalCount:0}};let c=u(r,a),l=o(s??i),d=await t.list({category:`lessons`}),f=(await Promise.all(d.filter(e=>e.tags.includes(`lesson`)).map(async e=>{let i=r.memoryMetaGet(e.path);return i||=(await wd(t,r,e.path)).meta,!i||!n(i,l)?null:{path:e.path,title:e.title,confidence:m(i.confidence,i.lastAccessedAt,i.createdAt,l),createdAt:i.createdAt,lastAccessedAt:i.lastAccessedAt,supersededBy:i.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(c.length===0&&f.length===0)return{content:[{type:`text`,text:`No flagged knowledge entries found below the current retention threshold.`}],structuredContent:{entries:[],totalCount:0}};let p=c.length===0?`### Retention
242
+ `);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}=dd.parse(e),l=await n.listPage({category:a,tag:o,limit:s,offset:c,orderBy:`updated`,order:`desc`}),u=l.entries,f=u.map(e=>({entry:e,retentionMeta:r?d(r,e.path,i):void 0})),p={entries:f.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:p};let m=f.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(`
243
+ `),h=qu(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${m}${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:p}}async function qd(e,{curated:t}){let{path:n}=cd.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(`
244
+ `);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 Jd(e,{curated:t}){let{path:n}=cd.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 Yd(e,{curated:t}){let{path:n}=cd.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 Xd(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(`
245
+ `);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 Zd(e,{curated:t,stateStore:r,retentionConfig:a,lessonConfig:s}){if(!r)return{content:[{type:`text`,text:`Retention state store not available.`}],structuredContent:{entries:[],totalCount:0}};let c=u(r,a),l=o(s??i),d=await t.list({category:`lessons`}),f=(await Promise.all(d.filter(e=>e.tags.includes(`lesson`)).map(async e=>{let i=r.memoryMetaGet(e.path);return i||=(await Pd(t,r,e.path)).meta,!i||!n(i,l)?null:{path:e.path,title:e.title,confidence:m(i.confidence,i.lastAccessedAt,i.createdAt,l),createdAt:i.createdAt,lastAccessedAt:i.lastAccessedAt,supersededBy:i.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(c.length===0&&f.length===0)return{content:[{type:`text`,text:`No flagged knowledge entries found below the current retention threshold.`}],structuredContent:{entries:[],totalCount:0}};let p=c.length===0?`### Retention
237
246
  None.`:`### Retention\n${c.map(e=>`- \`${e.entryId}\` — score ${e.retentionScore.toFixed(3)}, tier ${e.tier}, accesses ${e.accessCount}`).join(`
238
247
  `)}`,h=f.length===0?`### Stale Lessons
239
248
  None.`:`### Stale Lessons\n${f.map(e=>`- **${e.title}** (\`${e.path}\`) — effective confidence ${e.confidence}/100, last access ${e.lastAccessedAt??e.createdAt}`).join(`
240
- `)}`;return{content:[{type:`text`,text:`## Flagged Knowledge Entries (${c.length+f.length})\n\n${p}\n\n${h}`}],structuredContent:{entries:c,staleLessons:f,totalCount:c.length+f.length}}}const Hd={decision:6,pattern:5,"file-card":4,analysis:3,"search-result":2,"step-summary":1},Ud={"search-result":864e5,"file-card":1728e5,analysis:1728e5,"step-summary":2592e5,decision:6048e5,pattern:6048e5},Wd={implementer:{name:`implementer`,contextTypes:[`file-card`,`decision`,`pattern`],priority:{...Hd}},documenter:{name:`documenter`,contextTypes:[`decision`,`pattern`,`step-summary`],priority:{...Hd}},reviewer:{name:`reviewer`,contextTypes:[`file-card`,`search-result`,`decision`,`pattern`,`step-summary`,`analysis`],priority:{...Hd}},researcher:{name:`researcher`,contextTypes:[`search-result`,`decision`,`analysis`],priority:{...Hd}},debugger:{name:`debugger`,contextTypes:[`file-card`,`search-result`,`pattern`,`analysis`],priority:{...Hd}}};function Gd(e){return Wd[e]}function Kd(e,t,n=Date.now()){let r=n-t;if(r<36e5)return!1;let i=Ud[e];return i==null?!1:r>i}function qd(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=re(e.type,e.content),r=t.length;o+r>n||(a.push({type:e.type,content:t}),o+=r)}return a}async function Jd(e,{curated:t,flowContextAdapter:n,stateStore:r,retentionConfig:a,consolidationConfig:s,lessonConfig:c}){let l=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),u=l.token_budget?l.token_budget*4:l.budget;if(!n)return{content:[{type:`text`,text:`Flow context not available — no active flow or adapter not configured.`}]};let d=Gd(l.profile);if(!d)return{content:[{type:`text`,text:`Unknown profile: "implementer, documenter, reviewer, researcher, debugger".`}]};let f=await n.list();if(f.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 p=Date.now(),m=f.filter(e=>{let t=e.path.split(`/`)[0];return Bu.has(t)?!Kd(t,e.mtimeMs,p):!0}),h=(await Promise.all(m.map(async e=>{let t=e.path.split(`/`),i=t[0];if(t.length<2||!Bu.has(i))return null;let o=await n.read(e.path);return o?(r&&pd(r,e.path,a,s),{type:i,content:o}):null}))).filter(e=>e!==null),g=qd(h,d,u),_=o(c??i),v=[...new Set(g.flatMap(e=>Cd(e.content)))];if(await Promise.all(v.map(async e=>{let n=r?.memoryMetaGet(e)?.confidence;if(n===void 0)try{n=(await wd(t,r,e)).confidence}catch{return}Sd(r,e,n,_)})),g.length===0)return{content:[{type:`text`,text:`No relevant context for profile "${l.profile}". ${h.length} entries available but none match your role's context types.`}]};let y=g.map(e=>`### [${e.type}]\n${e.content}`).join(`
249
+ `)}`;return{content:[{type:`text`,text:`## Flagged Knowledge Entries (${c.length+f.length})\n\n${p}\n\n${h}`}],structuredContent:{entries:c,staleLessons:f,totalCount:c.length+f.length}}}const Qd={decision:6,pattern:5,"file-card":4,analysis:3,"search-result":2,"step-summary":1},$d={"search-result":864e5,"file-card":1728e5,analysis:1728e5,"step-summary":2592e5,decision:6048e5,pattern:6048e5},ef={implementer:{name:`implementer`,contextTypes:[`file-card`,`decision`,`pattern`],priority:{...Qd}},documenter:{name:`documenter`,contextTypes:[`decision`,`pattern`,`step-summary`],priority:{...Qd}},reviewer:{name:`reviewer`,contextTypes:[`file-card`,`search-result`,`decision`,`pattern`,`step-summary`,`analysis`],priority:{...Qd}},researcher:{name:`researcher`,contextTypes:[`search-result`,`decision`,`analysis`],priority:{...Qd}},debugger:{name:`debugger`,contextTypes:[`file-card`,`search-result`,`pattern`,`analysis`],priority:{...Qd}}};function tf(e){return ef[e]}function nf(e,t,n=Date.now()){let r=n-t;if(r<36e5)return!1;let i=$d[e];return i==null?!1:r>i}function rf(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=ne(e.type,e.content),r=t.length;o+r>n||(a.push({type:e.type,content:t}),o+=r)}return a}async function af(e,{curated:t,flowContextAdapter:n,stateStore:r,retentionConfig:a,consolidationConfig:s,lessonConfig:c}){let l=L.object({profile:L.string(),budget:L.number().int().min(100).max(5e4).default(6e3).describe(`Character budget for withdraw results`),token_budget:L.number().int().min(50).max(12500).optional().describe(`Token budget (overrides budget). Approx 4 chars per token.`)}).parse(e),u=l.token_budget?l.token_budget*4:l.budget;if(!n)return{content:[{type:`text`,text:`Flow context not available — no active flow or adapter not configured.`}]};let d=tf(l.profile);if(!d)return{content:[{type:`text`,text:`Unknown profile: "implementer, documenter, reviewer, researcher, debugger".`}]};let f=await n.list();if(f.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 p=Date.now(),m=f.filter(e=>{let t=e.path.split(`/`)[0];return Xu.has(t)?!nf(t,e.mtimeMs,p):!0}),h=(await Promise.all(m.map(async e=>{let t=e.path.split(`/`),i=t[0];if(t.length<2||!Xu.has(i))return null;let o=await n.read(e.path);return o?(r&&Cd(r,e.path,a,s),{type:i,content:o}):null}))).filter(e=>e!==null),g=rf(h,d,u),_=o(c??i),v=[...new Set(g.flatMap(e=>Nd(e.content)))];if(await Promise.all(v.map(async e=>{let n=r?.memoryMetaGet(e)?.confidence;if(n===void 0)try{n=(await Pd(t,r,e)).confidence}catch{return}Md(r,e,n,_)})),g.length===0)return{content:[{type:`text`,text:`No relevant context for profile "${l.profile}". ${h.length} entries available but none match your role's context types.`}]};let y=g.map(e=>`### [${e.type}]\n${e.content}`).join(`
241
250
 
242
- `),b=g.reduce((e,t)=>e+t.content.length,0);return{content:[{type:`text`,text:`## Flow Context (${g.length}/${h.length} entries, ${b} chars, profile: ${l.profile})\n\n${y}`}]}}async function Yd(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 Xd(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(`
251
+ `),b=g.reduce((e,t)=>e+t.content.length,0);return{content:[{type:`text`,text:`## Flow Context (${g.length}/${h.length} entries, ${b} chars, profile: ${l.profile})\n\n${y}`}]}}async function of(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 sf(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(`
243
252
  `),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(`
244
- `),{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:A(e)}`}],isError:!0,report:null}}}async function Zd(e,{curated:t,stateStore:n,resourceNotifier:r}){let i=Td(e),{title:a,context:o,insight:s,evidence:c,confidence:l,tags:u}=nd.parse(i),d=ce({title:a,context:o,insight:s,evidence:c,confidence:l,tags:u}),f=await t.remember(a,d,`lessons`,bd(u));return xd(n,f.path,l),r&&r.notifyAfterCuratedWrite(f.path).catch(()=>{}),{content:[{type:`text`,text:`Recorded lesson: **${a}**\n\nStored at \`.ai/curated/${f.path}\` with confidence ${l}/100.`}],structuredContent:{path:f.path,confidence:l,category:`lessons`,tags:bd(u)}}}async function Qd(e,t,n){let{curated:r,stateStore:a,resourceNotifier:s,retentionConfig:c,consolidationConfig:u,lessonConfig:d}=n,f=rd.parse(e);if(t===`contradict`&&!f.reason)throw new I.ZodError([{code:`custom`,path:[`reason`],message:`reason is required`}]);let p=yd(f.path,f.id),m=o(d??i);a&&pd(a,p,c,u);let{entry:h,confidence:g}=await wd(r,a,p),v=l(g,t,m),y=_(h.content,v),b=t===`confirm`?f.reason??`Confirmed lesson confidence`:`Contradicted lesson confidence: ${f.reason}`,x=await r.update(p,y,b);return a&&a.memoryMetaUpdateConfidence(p,v),s&&s.notifyAfterCuratedWrite(p).catch(()=>{}),{content:[{type:`text`,text:`${t===`confirm`?`Confirmed`:`Contradicted`} lesson: \`${p}\`\n\nConfidence ${g}/100 → ${v}/100.`}],structuredContent:{path:x.path,confidence:v,previousConfidence:g,version:x.version}}}async function $d(e,{curated:t,stateStore:n,lessonConfig:r}){let{topic:a,minConfidence:c,tag:l,tags:u,sortBy:d,includeArchived:f,limit:p,offset:h}=id.parse(e),g=bd([...u??[],...l?[l]:[]]),_=o(r??i),v=Math.max(p+h,500),b=await t.listPage({category:`lessons`,...l?{tag:l}:{},limit:v,orderBy:`updated`,order:`desc`}),x=b.entries,S=await Promise.all(x.filter(e=>e.tags.includes(`lesson`)).map(async e=>{let{confidence:r,meta:i}=await wd(t,n,e.path),a=i??n?.memoryMetaGet(e.path);a&&a.supersededBy===null&&y(a,_)&&n?.memoryMetaSetSuperseded(e.path,s);let o=n?.memoryMetaGet(e.path)??a,c=o?.createdAt??e.created,l=o?.confidence??r,u=m(l,o?.lastAccessedAt,c,_),d=o?.lastAccessedAt??o?.createdAt??null;return{path:e.path,title:e.title,category:e.category,tags:e.tags,version:e.version,preview:e.contentPreview,confidence:u,storedConfidence:l,createdAt:c,lastAccessedAt:o?.lastAccessedAt??null,recency:d,archived:o?.supersededBy===s,supersededBy:o?.supersededBy??null}})),C=S.filter(e=>e.archived).length,w=S.filter(e=>f?!0:e.supersededBy===null).filter(e=>c===void 0?!0:e.confidence>=c).filter(e=>g.length===0?!0:g.every(t=>e.tags.includes(t))).filter(e=>a?`${e.title}\n${e.preview}\n${e.tags.join(` `)}`.toLowerCase().includes(a.toLowerCase()):!0).sort((e,t)=>d===`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??``)),T=w.slice(h,h+p);if(w.forEach(e=>{Sd(n,e.path,e.storedConfidence,_)}),T.length===0)return{content:[{type:`text`,text:`No lessons matched the requested filters.`}],structuredContent:{entries:[],totalCount:w.length,scannedCount:S.length,limit:p,offset:h,hasMore:w.length>h+p||b.hasMore,archivedCount:C}};let E=T.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(`
245
- `);return{content:[{type:`text`,text:`## Lessons (${T.length} of ${w.length})\n\n${E}`}],structuredContent:{entries:T.map(({storedConfidence:e,...t})=>t),totalCount:w.length,scannedCount:S.length,limit:p,offset:h,hasMore:w.length>h+p||b.hasMore,archivedCount:C}}}async function ef(e,{curated:t,stateStore:n,resourceNotifier:r}){let{bufferPath:i}=ad.parse(e),a=await Ed(i);if(!a)return{content:[{type:`text`,text:`No observation buffer found for auto-observe.`}],structuredContent:{bufferPath:null,observations:0,createdCount:0,skippedCount:0,candidates:[]}};let o=ti(M(a,`utf8`)),s=ei(o,Or),c=await t.list({category:`lessons`}),l=[],u=[];try{for(let e of s){let i=Dd(e.title,c);if(i){u.push({title:e.title,path:i.path,similarity:i.similarity});continue}let a=ce({title:e.title,context:e.context,insight:e.insight,evidence:e.evidence,confidence:e.confidence,tags:e.tags}),o=await t.remember(e.title,a,`lessons`,bd(e.tags));xd(n,o.path,e.confidence),l.push({path:o.path,title:e.title,detector:e.detector}),c.push({path:o.path,title:e.title,category:`lessons`,tags:bd(e.tags),version:1,created:new Date().toISOString(),updated:new Date().toISOString(),contentPreview:e.insight}),r&&r.notifyAfterCuratedWrite(o.path).catch(()=>{})}}finally{try{Me(a)}catch{}}let d=[`Auto-observe processed ${o.length} observations from \`${a}\`.`,`Created ${l.length} lessons and skipped ${u.length} duplicates from ${s.length} candidates.`];return l.length>0&&(d.push(``,`Created:`),d.push(...l.map(e=>`- **${e.title}** (${e.path})`))),u.length>0&&(d.push(``,`Skipped:`),d.push(...u.map(e=>`- **${e.title}** matched ${e.path} (${e.similarity.toFixed(2)})`))),{content:[{type:`text`,text:d.join(`
246
- `)}],structuredContent:{bufferPath:a,observations:o.length,createdCount:l.length,skippedCount:u.length,candidates:s.map(e=>({title:e.title,detector:e.detector,confidence:e.confidence,tags:e.tags})),created:l,skipped:u}}}async function tf(e,t){switch(e.subAction??`create`){case`create`:return Zd(e,t);case`confirm`:return Qd(e,`confirm`,t);case`contradict`:return Qd(e,`contradict`,t);case`list-lessons`:return $d(e,t);case`auto-observe`:return ef(e,t);case`prune`:{if(!t.stateStore)return J(`VALIDATION`,`StateStore required for lesson/prune`);let n=od.parse(e),r=await h(t.curated,t.stateStore,{maxConfidence:n.maxConfidence,minIdleDays:n.minIdleDays,safetyDays:n.safetyDays,maxPrune:n.maxPrune,dryRun:n.dryRun},t.lessonConfig?o(t.lessonConfig):i);return{content:[{type:`text`,text:Od(r)}],structuredContent:r}}case`group`:{if(!t.stateStore)return J(`VALIDATION`,`StateStore required for lesson/group`);let n=sd.parse(e),r=await oe(t.curated,t.stateStore,{similarityThreshold:n.similarityThreshold,minGroupSize:n.minGroupSize,maxGroups:n.maxGroups,dryRun:n.dryRun});return{content:[{type:`text`,text:kd(r)}],structuredContent:r}}case`promote`:{if(!Se())return{content:[{type:`text`,text:`Promotion requires user-level install (not workspace-scoped).`}]};let n=cd.parse(e),r={minWorkspaces:n.minWorkspaces??ee.minWorkspaces,minAvgConfidence:n.minAvgConfidence??ee.minAvgConfidence,similarityThreshold:n.similarityThreshold??ee.similarityThreshold,dryRun:n.dryRun},i=await ie(se(await T(),r),Ad(t.curated,b()),r);return{content:[{type:`text`,text:jd(i,r.dryRun)}],structuredContent:i}}case`demote`:{if(!Se())return{content:[{type:`text`,text:`Demotion requires user-level install.`}]};let n=yd(e.path,e.id);if(!n)return{content:[{type:`text`,text:`Missing required "path" or "id" parameter for demote.`}]};let r=await w(Ad(t.curated,b()),n);return{content:[{type:`text`,text:r.removed?`Demoted: ${n}`:`Not found in global: ${n}`}],structuredContent:r}}}}async function nf(e,t,n){switch(e){case`remember`:return Md(t,n);case`read`:return Nd(t,n);case`update`:return Pd(t,n);case`forget`:return Fd(t,n);case`list`:return Id(t,n);case`history`:return Ld(t,n);case`diff`:return Rd(t,n);case`recover`:return zd(t,n);case`orphaned`:return Bd(t,n);case`withdraw`:return Jd(t,n);case`flush`:return Yd(t,n);case`flagged`:return Vd(t,n);case`lesson`:return tf(t,n);case`gap-analysis`:return n.graphStore?Xd(n.graphStore):{content:[{type:`text`,text:`Gap analysis requires a graph store (not available).`}],isError:!0}}}function rf(e,t,n,r,i,a,o,s,c,l,u,d,f){let p=W(`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:ld.shape,annotations:p.annotations},Y(`knowledge`,async({action:e,...t})=>{try{let n=ld.parse({action:e,...t});return await fd(await nf(n.action,n,m),n,d)}catch(e){return e instanceof I.ZodError?J(`VALIDATION`,vd(e)):(ud.error(`Knowledge operation failed`,A(e)),J(`INTERNAL`,`Knowledge operation failed: ${e instanceof Error?e.message:String(e)}`))}}))}const af=O(`tools:manipulation`);function of(e){return e.sources[0]?.path??Te()}function sf(e,t){let n=P(t,e),r=Le(t,n);if(r.startsWith(`..`)||Ie(r))throw Error(`Path "${e}" escapes workspace root: ${t}`);return n}function cf(e,t){let n=W(`rename`),r=of(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},Y(`rename`,async({old_name:e,new_name:t,root_path:n,extensions:i,dry_run:a},o)=>{let s;try{s=vc(o).createTask(`Rename Symbol`,2),s.progress(0,`Scanning for references`);let c=sf(n,r);s.progress(1,`Applying renames`);let l=await fn({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`),af.error(`Rename failed`,A(e)),J(`INTERNAL`,`Rename failed: ${e instanceof Error?e.message:String(e)}`)}}))}function lf(e,t){let n=W(`codemod`),r=of(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},Y(`codemod`,async({root_path:e,rules:t,dry_run:n},i)=>{let a;try{a=vc(i).createTask(`Codemod`,2),a.progress(0,`Scanning files`);let o=sf(e,r);a.progress(1,`Applying transforms`);let s=await dt({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`),af.error(`Codemod failed`,A(e)),J(`INTERNAL`,`Codemod failed: ${e instanceof Error?e.message:String(e)}`)}}))}const uf={tiny:0,small:1,medium:2,large:3},df=[`lean`,`balanced`,`rich`],ff=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 pf(e){return e?e.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean).filter(e=>e.length>0&&!ff.has(e)):[]}function mf(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function hf(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 gf(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 _f(e,t,n){let r=n??(e=>U[e]),i=pf(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=hf(t.title,c.explain,i);o.push({name:n,title:t.title,reason:gf(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=uf[e.costClass]??99,r=uf[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 df)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 vf=[`list_tools`];function yf(e,t,n,r){let i=[...new Set(n)].sort();e.registerTool(`list_tools`,{title:W(`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:W(`list_tools`).annotations},async({category:e,intent:t,profile:n,readOnly:a})=>{let o=e?.trim().toLowerCase(),s=i.filter(e=>o?(U[e]?.category??[]).some(e=>e.toLowerCase()===o):!0).map(e=>{let t=U[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(`
247
- `)||`No tools matched the filter.`;if(t!==void 0||n!==void 0||a!==void 0){let e=_f({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(`
248
- `)}return{content:[{type:`text`,text:s}]}})}const bf=O(`server`),xf=de(Bn),Sf={"@huggingface/transformers":`4.2.0`,"onnxruntime-common":`1.24.3`,"onnxruntime-node":`1.24.3`};function Cf(e){return e.replace(/\\/g,`/`)}function wf(e){return process.platform===`win32`?e.replace(/\//g,Re):e}function Tf(){return P(Fe(ue(import.meta.url)),`..`,`..`,`..`)}function Ef(e){return Cf(e).includes(`/_npx/`)}function Df(e){return/^(1|true)$/i.test(process.env.AIKIT_DISABLE_DEP_REPAIR??``)?!1:/^(1|true)$/i.test(process.env.AIKIT_ALLOW_DEP_REPAIR??``)?!0:Ef(e)}function Of(e,t){let n=Cf(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:wf(o.slice(s))}function kf(e,t){if(!e)return Sf[t]??`latest`;try{return JSON.parse(M(N(e,`package.json`),`utf8`)).version??Sf[t]??`latest`}catch{return Sf[t]??`latest`}}function Af(e){let t=Cf(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 jf(e){if(!Af(e))return[];let t=Cf(e).toLowerCase(),n=new Map;if(t.includes(`@huggingface/transformers`)){let t=Of(e,`@huggingface/transformers`);n.set(`@huggingface/transformers`,`@huggingface/transformers@${kf(t,`@huggingface/transformers`)}`)}if(t.includes(`onnxruntime-common`)){let t=Of(e,`onnxruntime-common`);n.set(`onnxruntime-common`,`onnxruntime-common@${kf(t,`onnxruntime-common`)}`)}if(t.includes(`onnxruntime-node`)){let t=Of(e,`onnxruntime-node`);n.set(`onnxruntime-node`,`onnxruntime-node@${kf(t,`onnxruntime-node`)}`)}return Array.from(n.values())}function Mf(e){if(!/index\.js/i.test(e)||!Cf(e).includes(`@huggingface`))return!1;let t=Of(e,`@huggingface/transformers`);if(!t)return!1;let n=N(t,`index.js`),r=N(t,`dist`,`transformers.node.mjs`);return j(n)||!j(r)?!1:(Ne(n,[`// Auto-generated by AI Kit runtime dependency repair.`,`export * from './dist/transformers.node.mjs';`,`export { default } from './dist/transformers.node.mjs';`,``].join(`
249
- `),`utf8`),bf.info(`Auto-heal: created @huggingface/transformers index.js shim`,{path:n}),!0)}async function Nf(e,t={}){let n=jf(e),r=t.packageRoot??Tf(),i=Mf(e);if(n.length===0)return{attempted:i,repaired:i,packages:n,reason:i?`created transformer index shim`:`no missing runtime dependency detected`};if(!Df(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];bf.warn(`Auto-heal: repairing missing runtime dependencies`,{packages:n,packageRoot:r});try{return await xf(a,o,{cwd:r,timeout:t.timeoutMs??6e4,windowsHide:!0}),bf.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 bf.warn(`Auto-heal: runtime dependency repair failed`,{packages:n,packageRoot:r,...A(e)}),{attempted:!0,repaired:i,packages:n,reason:i?`created transformer shim but npm repair failed`:`npm repair failed`,error:t}}}const Pf=O(`tools`);let Ff=!1;function If(e){let t=e instanceof Error?e.message:String(e);return Af(t)||/embedder worker|embedding worker|circuit breaker|timed out|killed|respawn|ipc_channel|epipe|econnreset/i.test(t)}async function Lf(e,t,n){try{return await e.embedBatch(t,n)}catch(r){if((await Nf(r instanceof Error?r.message:String(r))).repaired)return e.embedBatch(t,n);throw r}}async function Rf(e,t,n){for(let r of n.steps)if(!(r.status!==`success`||!r.output))try{let i=k(n.path,12),a=`produced/onboard/${r.name}/${i}.md`,o=Ke(`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:Ke(`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 Lf(t,l.map(e=>e.content));await e.upsert(l,u)}catch(e){if(If(e)){let t=e instanceof Error?e.message:String(e);he.instance().reportDegraded(`embedder`,t),Pf.warn(`Auto-persist onboard disabled — embedder unavailable`,{stepName:r.name,...A(e)});return}Pf.warn(`Auto-persist onboard step failed`,{stepName:r.name,...A(e)})}}async function zf(e,t,n){if(n.autoRemember?.length)for(let r of n.autoRemember)try{let n=Ke(`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:Ke(`sha256`).update(r.content).digest(`hex`).slice(0,16),indexedAt:i,origin:`curated`,tags:r.tags,category:r.category,version:1},[o]=await Lf(t,[a.content]);await e.upsert([a],[o])}catch(e){if(If(e)){let t=e instanceof Error?e.message:String(e);he.instance().reportDegraded(`embedder`,t),Pf.warn(`Auto-persist remember disabled — embedder unavailable`,{title:r.title,...A(e)});return}Pf.warn(`Auto-persist remember entry failed`,{title:r.title,...A(e)})}}function Bf(e,t,n,r,i,a,o,s){let c=W(`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},Y(`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(Ff)return{content:[{type:`text`,text:`Onboard is already running. Please wait for it to complete before starting another.`}]};Ff=!0,Pf.info(`Starting onboard`,{path:e,mode:r,explore:l,trace:u,diff:p,routes:m,update:g});let x=await Kt({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=vc(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`),Rf(t,n,x),x.autoRemember?.length&&zf(t,n,x).catch(e=>{Pf.debug(`Auto-persist autoRemember failed`,A(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(`
250
- `);if(c&&a){let e=await K(a,{query:`onboard codebase conventions`});E+=q(e)}return{content:[{type:`text`,text:E}]}}catch(e){return Pf.error(`Onboard failed`,A(e)),J(`INTERNAL`,`Onboard failed: ${e instanceof Error?e.message:String(e)}`)}finally{Ff=!1}}))}const Vf=O(`tools:persistence`);function Hf(e){let t=W(`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},Y(`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(en(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(ln(t,n,i,void 0,o))}]};case`next`:{if(!t)throw Error(`name is required for next`);let e=cn(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(rn(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(an(t,r,a))}]};case`get`:if(!t)throw Error(`name is required for get`);return{content:[{type:`text`,text:JSON.stringify(on(t))}]};case`list`:return{content:[{type:`text`,text:JSON.stringify(sn())}]};case`clear`:if(!t)throw Error(`name is required for clear`);return{content:[{type:`text`,text:JSON.stringify({cleared:$t(t)})}]};case`delete`:if(!t)throw Error(`name is required for delete`);return{content:[{type:`text`,text:JSON.stringify({deleted:nn(t)})}]};case`dag`:if(!t)throw Error(`name is required for dag`);return{content:[{type:`text`,text:JSON.stringify(tn(t))}]}}}catch(e){return Vf.error(`Queue action failed`,A(e)),J(`INTERNAL`,`Queue action failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Uf=O(`tools`);function Wf(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(`
251
- `)}function Gf(e,t){let n=W(`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},Y(`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(`
252
- `)}\n\n---\n_${e.length} rules total. Use \`action: "update"\` to modify a rule._`}]}}if(e===`get`){if(!n)return J(`VALIDATION`,'`rule_id` is required for "get" action.');let e=t.getRule(n);return e?{content:[{type:`text`,text:Wf(e)}]}:J(`NOT_FOUND`,`Rule "${n}" not found.`)}if(e===`update`){if(!n||!r)return J(`VALIDATION`,'`rule_id` and `changes` are required for "update" action.');let e=t.updateRule(n,r);return e?{content:[{type:`text`,text:`${Wf(e)}\n\n---\n_Updated. Next: Use \`action: "list"\` to verify._`}]}:J(`NOT_FOUND`,`Rule "${n}" not found.`)}return e===`create`?i?{content:[{type:`text`,text:`${Wf(t.addRule(i))}\n\n---\n_Created. Next: Test classification with \`remember\`._`}]}:J(`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._`}]}:J(`NOT_FOUND`,`Rule "${n}" not found.`):J(`VALIDATION`,'`rule_id` is required for "delete" action.'):J(`VALIDATION`,`Unknown action: ${e}`)}catch(e){return Uf.error(`Policy update failed`,A(e)),J(`INTERNAL`,`Policy update failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Kf=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:`{
253
+ `),{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 cf(e,{curated:t,stateStore:n,resourceNotifier:r}){let i=Fd(e),{title:a,context:o,insight:s,evidence:c,confidence:l,tags:u}=fd.parse(i);try{let e=Ld(a,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 d=se({title:a,context:o,insight:s,evidence:c,confidence:l,tags:u}),f=await t.remember(a,d,`lessons`,Ad(u));return jd(n,f.path,l),r&&r.notifyAfterCuratedWrite(f.path).catch(()=>{}),{content:[{type:`text`,text:`Recorded lesson: **${a}**\n\nStored at \`.ai/curated/${f.path}\` with confidence ${l}/100.`}],structuredContent:{path:f.path,confidence:l,category:`lessons`,tags:Ad(u)}}}async function lf(e,t,n){let{curated:r,stateStore:a,resourceNotifier:s,retentionConfig:c,consolidationConfig:u,lessonConfig:d}=n,f=pd.parse(e);if(t===`contradict`&&!f.reason)throw new L.ZodError([{code:`custom`,path:[`reason`],message:`reason is required`}]);let p=kd(f.path,f.id),m=o(d??i);a&&Cd(a,p,c,u);let{entry:h,confidence:g}=await Pd(r,a,p),v=l(g,t,m),y=_(h.content,v),b=t===`confirm`?f.reason??`Confirmed lesson confidence`:`Contradicted lesson confidence: ${f.reason}`,x=await r.update(p,y,b);return a&&a.memoryMetaUpdateConfidence(p,v),s&&s.notifyAfterCuratedWrite(p).catch(()=>{}),{content:[{type:`text`,text:`${t===`confirm`?`Confirmed`:`Contradicted`} lesson: \`${p}\`\n\nConfidence ${g}/100 → ${v}/100.`}],structuredContent:{path:x.path,confidence:v,previousConfidence:g,version:x.version}}}async function uf(e,{curated:t,stateStore:n,lessonConfig:r}){let{topic:a,minConfidence:c,tag:l,tags:u,sortBy:d,includeArchived:f,limit:p,offset:h}=md.parse(e),g=Ad([...u??[],...l?[l]:[]]),_=o(r??i),v=Math.max(p+h,500),b=await t.listPage({category:`lessons`,...l?{tag:l}:{},limit:v,orderBy:`updated`,order:`desc`}),x=b.entries,S=await Promise.all(x.filter(e=>e.tags.includes(`lesson`)).map(async e=>{let{entry:r,confidence:i,meta:a}=await Pd(t,n,e.path),o=a??n?.memoryMetaGet(e.path);o&&o.supersededBy===null&&y(o,_)&&n?.memoryMetaSetSuperseded(e.path,s);let c=n?.memoryMetaGet(e.path)??o,l=c?.createdAt??e.created,u=c?.confidence??i,d=m(u,c?.lastAccessedAt,l,_),f=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:d,storedConfidence:u,createdAt:l,lastAccessedAt:c?.lastAccessedAt??null,recency:f,archived:c?.supersededBy===s,supersededBy:c?.supersededBy??null}})),C=S.filter(e=>e.archived).length,w=S.filter(e=>f?!0:e.supersededBy===null).filter(e=>c===void 0?!0:e.confidence>=c).filter(e=>g.length===0?!0:g.every(t=>e.tags.includes(t))).filter(e=>!a||`${e.title}\n${e.preview}\n${e.tags.join(` `)}`.toLowerCase().includes(a.toLowerCase())?!0:e.content?e.content.toLowerCase().includes(a.toLowerCase()):!1).sort((e,t)=>d===`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??``)),T=w.slice(h,h+p);if(w.forEach(e=>{Md(n,e.path,e.storedConfidence,_)}),T.length===0)return{content:[{type:`text`,text:`No lessons matched the requested filters.`}],structuredContent:{entries:[],totalCount:w.length,scannedCount:S.length,limit:p,offset:h,hasMore:w.length>h+p||b.hasMore,archivedCount:C}};let E=T.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(`
254
+ `);return{content:[{type:`text`,text:`## Lessons (${T.length} of ${w.length})\n\n${E}`}],structuredContent:{entries:T.map(({storedConfidence:e,...t})=>t),totalCount:w.length,scannedCount:S.length,limit:p,offset:h,hasMore:w.length>h+p||b.hasMore,archivedCount:C}}}async function df(e,{curated:t,stateStore:n,resourceNotifier:r}){let{bufferPath:i}=hd.parse(e),a=await Id(i);if(!a)return{content:[{type:`text`,text:`No observation buffer found for auto-observe.`}],structuredContent:{bufferPath:null,observations:0,createdCount:0,skippedCount:0,candidates:[]}};let o=ti(N(a,`utf8`)),s=ei(o,Or),c=await t.list({category:`lessons`}),l=[],u=[];try{for(let e of s){let i=Ld(e.title,c);if(i){u.push({title:e.title,path:i.path,similarity:i.similarity});continue}let a=se({title:e.title,context:e.context,insight:e.insight,evidence:e.evidence,confidence:e.confidence,tags:e.tags}),o=await t.remember(e.title,a,`lessons`,Ad(e.tags));jd(n,o.path,e.confidence),l.push({path:o.path,title:e.title,detector:e.detector}),c.push({path:o.path,title:e.title,category:`lessons`,tags:Ad(e.tags),version:1,created:new Date().toISOString(),updated:new Date().toISOString(),contentPreview:e.insight}),r&&r.notifyAfterCuratedWrite(o.path).catch(()=>{})}}finally{try{je(a)}catch{}}let d=[`Auto-observe processed ${o.length} observations from \`${a}\`.`,`Created ${l.length} lessons and skipped ${u.length} duplicates from ${s.length} candidates.`];return l.length>0&&(d.push(``,`Created:`),d.push(...l.map(e=>`- **${e.title}** (${e.path})`))),u.length>0&&(d.push(``,`Skipped:`),d.push(...u.map(e=>`- **${e.title}** matched ${e.path} (${e.similarity.toFixed(2)})`))),{content:[{type:`text`,text:d.join(`
255
+ `)}],structuredContent:{bufferPath:a,observations:o.length,createdCount:l.length,skippedCount:u.length,candidates:s.map(e=>({title:e.title,detector:e.detector,confidence:e.confidence,tags:e.tags})),created:l,skipped:u}}}async function ff(e,t){switch(e.subAction??`create`){case`create`:return cf(e,t);case`confirm`:return lf(e,`confirm`,t);case`contradict`:return lf(e,`contradict`,t);case`list-lessons`:return uf(e,t);case`auto-observe`:return df(e,t);case`prune`:{if(!t.stateStore)return J(`VALIDATION`,`StateStore required for lesson/prune`);let n=gd.parse(e),r=await h(t.curated,t.stateStore,{maxConfidence:n.maxConfidence,minIdleDays:n.minIdleDays,safetyDays:n.safetyDays,maxPrune:n.maxPrune,dryRun:n.dryRun},t.lessonConfig?o(t.lessonConfig):i);return{content:[{type:`text`,text:Rd(r)}],structuredContent:r}}case`group`:{if(!t.stateStore)return J(`VALIDATION`,`StateStore required for lesson/group`);let n=_d.parse(e),r=await ae(t.curated,t.stateStore,{similarityThreshold:n.similarityThreshold,minGroupSize:n.minGroupSize,maxGroups:n.maxGroups,dryRun:n.dryRun});return{content:[{type:`text`,text:zd(r)}],structuredContent:r}}case`promote`:{if(!Se())return{content:[{type:`text`,text:`Promotion requires user-level install (not workspace-scoped).`}]};let n=vd.parse(e),r={minWorkspaces:n.minWorkspaces??D.minWorkspaces,minAvgConfidence:n.minAvgConfidence??D.minAvgConfidence,similarityThreshold:n.similarityThreshold??D.similarityThreshold,dryRun:n.dryRun},i=await re(oe(await T(),r),Bd(t.curated,b()),r);return{content:[{type:`text`,text:Vd(i,r.dryRun)}],structuredContent:i}}case`demote`:{if(!Se())return{content:[{type:`text`,text:`Demotion requires user-level install.`}]};let n=kd(e.path,e.id);if(!n)return{content:[{type:`text`,text:`Missing required "path" or "id" parameter for demote.`}]};let r=await w(Bd(t.curated,b()),n);return{content:[{type:`text`,text:r.removed?`Demoted: ${n}`:`Not found in global: ${n}`}],structuredContent:r}}}}async function pf(e,t,n){switch(e){case`remember`:return Hd(t,n);case`read`:return Ud(t,n);case`update`:return Wd(t,n);case`forget`:return Gd(t,n);case`list`:return Kd(t,n);case`history`:return qd(t,n);case`diff`:return Jd(t,n);case`recover`:return Yd(t,n);case`orphaned`:return Xd(t,n);case`withdraw`:return af(t,n);case`flush`:return of(t,n);case`flagged`:return Zd(t,n);case`lesson`:return ff(t,n);case`gap-analysis`:return n.graphStore?sf(n.graphStore):{content:[{type:`text`,text:`Gap analysis requires a graph store (not available).`}],isError:!0}}}function mf(e,t,n,r,i,a,o,s,c,l,u,d,f){let p=W(`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:yd.shape,annotations:p.annotations},Y(`knowledge`,async({action:e,...t})=>{try{let n=yd.parse({action:e,...t}),r=await pf(n.action,n,m);return n.action===`read`?r:await Sd(r,n,d)}catch(e){return e instanceof L.ZodError?J(`VALIDATION`,Od(e)):(bd.error(`Knowledge operation failed`,j(e)),J(`INTERNAL`,`Knowledge operation failed: ${e instanceof Error?e.message:String(e)}`))}}))}const hf=k(`tools:manipulation`);function gf(e){return e.sources[0]?.path??we()}function _f(e,t){let n=F(t,e),r=Ie(t,n);if(r.startsWith(`..`)||Fe(r))throw Error(`Path "${e}" escapes workspace root: ${t}`);return n}function vf(e,t){let n=W(`rename`),r=gf(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:L.string().describe(`Existing symbol name to replace`),new_name:L.string().describe(`New symbol name to use`),root_path:L.string().describe(`Root directory to search within`),extensions:L.array(L.string()).optional().describe(`Optional file extensions to include, such as .ts,.tsx,.js,.jsx`),dry_run:L.boolean().default(!0).describe(`Preview changes without writing files`)},annotations:n.annotations},Y(`rename`,async({old_name:e,new_name:t,root_path:n,extensions:i,dry_run:a},o)=>{let s;try{s=Oc(o).createTask(`Rename Symbol`,2),s.progress(0,`Scanning for references`);let c=_f(n,r);s.progress(1,`Applying renames`);let l=await dn({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`),hf.error(`Rename failed`,j(e)),J(`INTERNAL`,`Rename failed: ${e instanceof Error?e.message:String(e)}`)}}))}function yf(e,t){let n=W(`codemod`),r=gf(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:L.string().describe(`Root directory to transform within`),rules:L.array(L.object({description:L.string().describe(`What the codemod rule does`),pattern:L.string().describe(`Regex pattern in string form`),replacement:L.string().describe(`Replacement string with optional capture groups`)})).min(1).describe(`Codemod rules to apply`),dry_run:L.boolean().default(!0).describe(`Preview changes without writing files`)},annotations:n.annotations},Y(`codemod`,async({root_path:e,rules:t,dry_run:n},i)=>{let a;try{a=Oc(i).createTask(`Codemod`,2),a.progress(0,`Scanning files`);let o=_f(e,r);a.progress(1,`Applying transforms`);let s=await ut({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`),hf.error(`Codemod failed`,j(e)),J(`INTERNAL`,`Codemod failed: ${e instanceof Error?e.message:String(e)}`)}}))}const bf={tiny:0,small:1,medium:2,large:3},xf=[`lean`,`balanced`,`rich`],Sf=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 Cf(e){return e?e.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean).filter(e=>e.length>0&&!Sf.has(e)):[]}function wf(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Tf(e,t,n){if(n.length===0)return 0;let r=`${e} ${t}`.toLowerCase(),i=0;for(let e of n){let t=wf(e);RegExp(`\\b${t}\\b`,`i`).test(r)&&i++}return i}function Ef(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 Df(e,t,n){let r=n??(e=>Ea[e]),i=Cf(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=Tf(t.title,c.explain,i);o.push({name:n,title:t.title,reason:Ef(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=bf[e.costClass]??99,r=bf[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 xf)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 Of=[`list_tools`];function kf(e,t,n,r){let i=[...new Set(n)].sort();e.registerTool(`list_tools`,{title:W(`list_tools`).title,description:`List the available AI Kit tools with names, titles, and categories.`,inputSchema:{category:L.string().optional().describe(`Optional category filter`),intent:L.string().optional().describe(`Task intent for planner-based ranking hint`),profile:L.string().optional().describe(`Tool profile filter`),readOnly:L.boolean().optional().describe(`Whether read-only mode is active`)},annotations:W(`list_tools`).annotations},async({category:e,intent:t,profile:n,readOnly:a})=>{let o=e?.trim().toLowerCase(),s=i.filter(e=>o?(Ea[e]?.category??[]).some(e=>e.toLowerCase()===o):!0).map(e=>{let t=Ea[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(`
256
+ `)||`No tools matched the filter.`;if(t!==void 0||n!==void 0||a!==void 0){let e=Df({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(`
257
+ `)}return{content:[{type:`text`,text:s}]}})}const Af=k(`server`),jf=ue(zn),Mf={"@huggingface/transformers":`4.2.0`,"onnxruntime-common":`1.24.3`,"onnxruntime-node":`1.24.3`};function Nf(e){return e.replace(/\\/g,`/`)}function Pf(e){return process.platform===`win32`?e.replace(/\//g,Le):e}function Ff(){return F(Pe(le(import.meta.url)),`..`,`..`,`..`)}function If(e){return Nf(e).includes(`/_npx/`)}function Lf(e){return/^(1|true)$/i.test(process.env.AIKIT_DISABLE_DEP_REPAIR??``)?!1:/^(1|true)$/i.test(process.env.AIKIT_ALLOW_DEP_REPAIR??``)?!0:If(e)}function Rf(e,t){let n=Nf(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:Pf(o.slice(s))}function zf(e,t){if(!e)return Mf[t]??`latest`;try{return JSON.parse(N(P(e,`package.json`),`utf8`)).version??Mf[t]??`latest`}catch{return Mf[t]??`latest`}}function Bf(e){let t=Nf(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 Vf(e){if(!Bf(e))return[];let t=Nf(e).toLowerCase(),n=new Map;if(t.includes(`@huggingface/transformers`)){let t=Rf(e,`@huggingface/transformers`);n.set(`@huggingface/transformers`,`@huggingface/transformers@${zf(t,`@huggingface/transformers`)}`)}if(t.includes(`onnxruntime-common`)){let t=Rf(e,`onnxruntime-common`);n.set(`onnxruntime-common`,`onnxruntime-common@${zf(t,`onnxruntime-common`)}`)}if(t.includes(`onnxruntime-node`)){let t=Rf(e,`onnxruntime-node`);n.set(`onnxruntime-node`,`onnxruntime-node@${zf(t,`onnxruntime-node`)}`)}return Array.from(n.values())}function Hf(e){if(!/index\.js/i.test(e)||!Nf(e).includes(`@huggingface`))return!1;let t=Rf(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:(Me(n,[`// Auto-generated by AI Kit runtime dependency repair.`,`export * from './dist/transformers.node.mjs';`,`export { default } from './dist/transformers.node.mjs';`,``].join(`
258
+ `),`utf8`),Af.info(`Auto-heal: created @huggingface/transformers index.js shim`,{path:n}),!0)}async function Uf(e,t={}){let n=Vf(e),r=t.packageRoot??Ff(),i=Hf(e);if(n.length===0)return{attempted:i,repaired:i,packages:n,reason:i?`created transformer index shim`:`no missing runtime dependency detected`};if(!Lf(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];Af.warn(`Auto-heal: repairing missing runtime dependencies`,{packages:n,packageRoot:r});try{return await jf(a,o,{cwd:r,timeout:t.timeoutMs??6e4,windowsHide:!0}),Af.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 Af.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 Wf=k(`tools`);let Gf=!1;function Kf(e){let t=e instanceof Error?e.message:String(e);return Bf(t)||/embedder worker|embedding worker|circuit breaker|timed out|killed|respawn|ipc_channel|epipe|econnreset/i.test(t)}async function qf(e,t,n){try{return await e.embedBatch(t,n)}catch(r){if((await Uf(r instanceof Error?r.message:String(r))).repaired)return e.embedBatch(t,n);throw r}}async function Jf(e,t,n){for(let r of n.steps)if(!(r.status!==`success`||!r.output))try{let i=xe(n.path,12),a=`produced/onboard/${r.name}/${i}.md`,o=Ge(`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:Ge(`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 qf(t,l.map(e=>e.content));await e.upsert(l,u)}catch(e){if(Kf(e)){let t=e instanceof Error?e.message:String(e);me.instance().reportDegraded(`embedder`,t),Wf.warn(`Auto-persist onboard disabled — embedder unavailable`,{stepName:r.name,...j(e)});return}Wf.warn(`Auto-persist onboard step failed`,{stepName:r.name,...j(e)})}}async function Yf(e,t,n){if(n.autoRemember?.length)for(let r of n.autoRemember)try{let n=Ge(`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:Ge(`sha256`).update(r.content).digest(`hex`).slice(0,16),indexedAt:i,origin:`curated`,tags:r.tags,category:r.category,version:1},[o]=await qf(t,[a.content]);await e.upsert([a],[o])}catch(e){if(Kf(e)){let t=e instanceof Error?e.message:String(e);me.instance().reportDegraded(`embedder`,t),Wf.warn(`Auto-persist remember disabled — embedder unavailable`,{title:r.title,...j(e)});return}Wf.warn(`Auto-persist remember entry failed`,{title:r.title,...j(e)})}}function Xf(e,t,n,r,i,a,o,s){let c=W(`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:L.string().describe(`Root path of the codebase to onboard`),mode:L.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:L.string().optional().describe(`Custom output directory (default: ~/.aikit/workspaces/<name>/onboard/)`),enrich:L.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:L.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:L.string().optional().describe(`Trace mode: BFS traversal from a symbol. Returns callers and/or callees.`),direction:L.enum([`callers`,`callees`,`both`]).optional().default(`both`).describe(`Trace direction (default: both).`),maxDepth:L.number().min(1).max(10).optional().default(2).describe(`Trace max traversal depth (default: 2, max: 10).`),diff:L.union([L.boolean(),L.string()]).optional().describe(`Diff mode: analyze git diff for impact assessment. true = auto-detect, string = explicit diff content.`),routes:L.boolean().optional().describe(`Routes mode: detect web framework routes (Express, FastAPI, Django, NestJS).`),framework:L.enum([`express`,`fastify`,`nextjs`]).optional().describe(`Framework to scan for routes. Omit to detect all supported frameworks.`),update:L.boolean().optional().describe(`Incremental update mode: load existing index from ~/.aikit/workspaces/, re-extract changed files, merge.`),detail:L.enum([`summary`,`standard`,`full`]).optional().default(`standard`).describe(`Output detail level: summary (key concepts only), standard (recommended), full (all data).`),language:L.string().optional().describe(`Output language for localized content. Supported: en, zh, ja, ko, ru.`),llm_sampling:L.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},Y(`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(Gf)return{content:[{type:`text`,text:`Onboard is already running. Please wait for it to complete before starting another.`}]};Gf=!0,Wf.info(`Starting onboard`,{path:e,mode:r,explore:l,trace:u,diff:p,routes:m,update:g});let x=await Gt({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=Oc(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`),Jf(t,n,x),x.autoRemember?.length&&Yf(t,n,x).catch(e=>{Wf.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(`
259
+ `);if(c&&a){let e=await K(a,{query:`onboard codebase conventions`});E+=q(e)}return{content:[{type:`text`,text:E}]}}catch(e){return Wf.error(`Onboard failed`,j(e)),J(`INTERNAL`,`Onboard failed: ${e instanceof Error?e.message:String(e)}`)}finally{Gf=!1}}))}const Zf=k(`tools:persistence`);function Qf(e){let t=W(`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:L.enum([`create`,`push`,`next`,`done`,`fail`,`get`,`list`,`clear`,`delete`,`dag`]).describe(`Queue action`),name:L.string().optional().describe(`Queue name (required for most actions)`),title:L.string().optional().describe(`Item title (required for push)`),id:L.string().optional().describe(`Item ID (required for done/fail)`),data:L.unknown().optional().describe(`Arbitrary data to attach to a queue item`),error:L.string().optional().describe(`Error message (required for fail)`),dependsOn:L.array(L.string()).optional().describe(`Item IDs this task depends on. Dependent items start as blocked until deps complete.`)},annotations:t.annotations},Y(`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($t(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(cn(t,n,i,void 0,o))}]};case`next`:{if(!t)throw Error(`name is required for next`);let e=sn(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(nn(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(rn(t,r,a))}]};case`get`:if(!t)throw Error(`name is required for get`);return{content:[{type:`text`,text:JSON.stringify(an(t))}]};case`list`:return{content:[{type:`text`,text:JSON.stringify(on())}]};case`clear`:if(!t)throw Error(`name is required for clear`);return{content:[{type:`text`,text:JSON.stringify({cleared:Qt(t)})}]};case`delete`:if(!t)throw Error(`name is required for delete`);return{content:[{type:`text`,text:JSON.stringify({deleted:tn(t)})}]};case`dag`:if(!t)throw Error(`name is required for dag`);return{content:[{type:`text`,text:JSON.stringify(en(t))}]}}}catch(e){return Zf.error(`Queue action failed`,j(e)),J(`INTERNAL`,`Queue action failed: ${e instanceof Error?e.message:String(e)}`)}}))}const $f=k(`tools`);function ep(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(`
260
+ `)}function tp(e,t){let n=W(`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:L.enum([`list`,`get`,`update`,`create`,`delete`]).describe(`Action to perform on classification rules`),rule_id:L.string().optional().describe(`Rule ID (required for get, update, delete)`),changes:L.object({patterns:L.array(L.string()).optional(),category:L.string().optional(),pushWeight:L.number().min(0).max(1).optional(),description:L.string().optional(),examples:L.array(L.string()).optional(),enabled:L.boolean().optional()}).optional().describe(`Changes to apply (for update action)`),new_rule:L.object({id:L.string().regex(/^[a-z][a-z0-9-]*$/),patterns:L.array(L.string()).min(1),category:L.string(),pushWeight:L.number().min(0).max(1),description:L.string(),examples:L.array(L.string()).default([]),enabled:L.boolean().default(!0)}).optional().describe(`New rule definition (for create action)`)},annotations:n.annotations},Y(`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(`
261
+ `)}\n\n---\n_${e.length} rules total. Use \`action: "update"\` to modify a rule._`}]}}if(e===`get`){if(!n)return J(`VALIDATION`,'`rule_id` is required for "get" action.');let e=t.getRule(n);return e?{content:[{type:`text`,text:ep(e)}]}:J(`NOT_FOUND`,`Rule "${n}" not found.`)}if(e===`update`){if(!n||!r)return J(`VALIDATION`,'`rule_id` and `changes` are required for "update" action.');let e=t.updateRule(n,r);return e?{content:[{type:`text`,text:`${ep(e)}\n\n---\n_Updated. Next: Use \`action: "list"\` to verify._`}]}:J(`NOT_FOUND`,`Rule "${n}" not found.`)}return e===`create`?i?{content:[{type:`text`,text:`${ep(t.addRule(i))}\n\n---\n_Created. Next: Test classification with \`remember\`._`}]}:J(`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._`}]}:J(`NOT_FOUND`,`Rule "${n}" not found.`):J(`VALIDATION`,'`rule_id` is required for "delete" action.'):J(`VALIDATION`,`Unknown action: ${e}`)}catch(e){return $f.error(`Policy update failed`,j(e)),J(`INTERNAL`,`Policy update failed: ${e instanceof Error?e.message:String(e)}`)}}))}const np=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:`{
253
262
  type: 'architecture-diagram',
254
263
  value: {
255
264
  components: [
@@ -282,7 +291,7 @@ None.`:`### Stale Lessons\n${f.map(e=>`- **${e.title}** (\`${e.path}\`) — effe
282
291
  { path: 'docs/api.md', title: 'API Reference', status: 'stale' },
283
292
  ],
284
293
  },
285
- }`},{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 qf(){let e={};for(let[t,n]of Kf)n.vendorScripts?.length&&(e[t]=n.vendorScripts);return e}function Jf(e){return Kf.has(e)}const Yf=new Map;function Xf(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,`\\$&`)}function Zf(e){let t=`(?=[^>]*\\bid=['"]${Xf(e)}['"])`;return RegExp(`(<script\\b(?=[^>]*\\btype=['"]application\\/json['"])${t}[^>]*>)[\\s\\S]*?(<\/script>)`,`i`)}function Qf(e){Yf.has(e.id)&&console.warn(`[viewer-registry] Overwriting viewer template "${e.id}"`),Yf.set(e.id,e)}function $f(e){return Yf.get(e)}function ep(e){return typeof e==`string`&&Yf.has(e)}function tp(){return[...Yf.values()]}function np(e,t,n,r){let i=Zf(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 rp=import.meta.dirname??Fe(ue(import.meta.url)),ip={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`]},ap={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`]},op={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 sp(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function cp(e,t){return sp(t)?{...t,kind:e}:{kind:e}}function lp(e){let t=e===`canvas.html`?[N(rp,`..`,`..`,`..`,`..`,`..`,`scaffold`,`general`,`viewers`,`src`,`canvas`,`index.html`),N(rp,`..`,`..`,`scaffold`,`general`,`viewers`,`src`,`canvas`,`index.html`)]:[],n=ae(`server`,[N(`viewers`,`dist`,e),N(`viewers`,e)]),r=[...t,...n?[n]:[],N(rp,`..`,`..`,`..`,`viewers`,e),N(rp,`..`,`..`,`..`,`..`,`..`,`scaffold`,`general`,`viewers`,`src`,`static`,e),N(rp,`..`,`..`,`..`,`..`,`..`,`scaffold`,`general`,`viewers`,`dist`,e),N(rp,`..`,`..`,`..`,`..`,`..`,`scaffold`,`general`,`viewers`,e),N(rp,`..`,`..`,`scaffold`,`general`,`viewers`,`dist`,e),N(rp,`..`,`..`,`scaffold`,`general`,`viewers`,e),N(rp,`..`,`viewers`,`dist`,e),N(rp,`..`,`viewers`,e)];for(let e of r)try{return M(e,`utf8`)}catch{}throw Error(`Viewer HTML not found: ${e}. Searched: ${r.join(`, `)}`)}let up,dp,fp,pp,mp,hp,gp;function _p(){return up??=lp(`c4-viewer.html`),up}function vp(){return dp??=lp(`tour-viewer.html`),dp}function yp(){return fp??=lp(`canvas.html`),fp}function bp(){return pp??=lp(`architecture-static.html`),pp}function xp(){return mp??=lp(`process-flow-static.html`),mp}function Sp(){return hp??=lp(`task-plan-static.html`),hp}function Cp(){return gp??=lp(`code-review-viewer.html`),gp}const wp={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 Tp(){Qf({id:`c4@1`,label:`C4 Architecture Diagram`,description:`Interactive C4 architecture diagram with zoom, pan, and ELK auto-layout`,inputSchema:ip,injectId:`diagram-data`,supportedTransports:[`browser`],resolveHtml:_p}),Qf({id:`c4-static@1`,label:`C4 Architecture Diagram (Static)`,description:`Static SVG architecture diagram for inline rendering`,inputSchema:ip,injectId:`diagram-data`,supportedTransports:[`mcp-app`],resolveHtml:bp}),Qf({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:vp}),Qf({id:`process-flow-static@1`,label:`Process Flow Diagram (Static)`,description:`Static SVG process flow diagram for inline rendering`,inputSchema:ap,injectId:`diagram-data`,supportedTransports:[`mcp-app`],resolveHtml:xp}),Qf({id:`task-plan-static@1`,label:`Task Execution Plan (Static)`,description:`Static SVG task execution plan for inline rendering`,inputSchema:op,injectId:`diagram-data`,supportedTransports:[`mcp-app`],resolveHtml:Sp}),Qf({id:`process-flow@1`,label:`Process Flow Diagram (Interactive)`,description:`Interactive process flow diagram with ReactFlow`,inputSchema:ap,injectId:`diagram-data`,supportedTransports:[`browser`],resolveHtml:yp,transformData:e=>cp(`process-flow`,e)}),Qf({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:wp,injectId:`review-data`,supportedTransports:[`mcp-app`,`browser`],resolveHtml:Cp})}function Ep(){let e=new hr;for(let t of vr.list())e.register(t);return e.register(_r),e.register(Sr),e.register(Cr),e.register(yr),e}function Dp(e,t){return e?.supportedTransports.includes(t)??!1}const Op=Ep();function kp(e){if(e.template)return Op.get(e.template)}function Ap(e){if((e.actions?.length??0)>0)return!0;if(e.template&&ep(e.template)){let t=$f(e.template);return t?.supportedTransports.includes(`browser`)===!0&&!t.supportedTransports.includes(`mcp-app`)}let t=kp(e);return Dp(t,`browser`)&&!Dp(t,`mcp-app`)}Tp();const Z={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`},jp={[Z.TIMEOUT]:408,[Z.DUPLICATE_CALLBACK]:409,[Z.INVALID_NONCE]:400,[Z.INVALID_ORIGIN]:403,[Z.SESSION_NOT_FOUND]:404,[Z.SESSION_LIMIT_REACHED]:429,[Z.ASSET_NOT_FOUND]:404,[Z.ASSET_FORBIDDEN]:403,[Z.RATE_LIMITED]:429,[Z.PAYLOAD_TOO_LARGE]:413,[Z.UNSUPPORTED_MEDIA_TYPE]:415,[Z.INVALID_TRANSITION]:400,[Z.ANNOTATION_CAP_EXCEEDED]:403};function Mp(e,t,n){return{code:e,message:t,httpStatus:n??jp[e]}}const Np={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 Pp(e,t,n,r){return Np[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 Fp(e){return Np[e].length===0}const Ip=1024,Lp=new Set([`user-closed`,`host-dismissed`,`replaced`]);function Rp(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function zp(e,t,n){let r={code:e,message:t};return n!==void 0&&(r.details=n),{kind:`error`,error:r}}function Bp(e,t,n,r){e.writeHead(t,{"Content-Type":`application/json`,"Access-Control-Allow-Origin":r??`null`}),e.end(JSON.stringify(n))}async function Vp(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 Hp(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?Ye(n,r):!1}function Up(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 Wp(e){return(e.headers[`content-type`]??``).startsWith(`application/json`)}function Gp(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 Kp(e){return Array.isArray(e)&&e.length>Ip?`Selection exceeds ${Ip} items (got ${e.length})`:null}function qp(e,t,n){let r=typeof e.actionId==`string`?e.actionId:``,i=n.find(e=>e.id===r);if(!i)return zp(`INVALID_ACTION`,`Unknown actionId: ${r||`(missing)`}`);let a=typeof e.selection==`string`||Array.isArray(e.selection)?e.selection:void 0,o=Rp(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 Jp(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 Yp(e,t,n,r,i){let a=i??qe(16).toString(`hex`),o=`created`,s=[],c=!1,l,u,d=new Promise(e=>{u=e}),f=e=>{if(Fp(o))return l;let t=Jp(e),i=Pp(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(zp(e,t,n))},async handle(n,r,i){if(!Wp(n)){let e=f(zp(Z.UNSUPPORTED_MEDIA_TYPE,`Content-Type must be application/json`));return Bp(r,415,{ok:!1,error:Z.UNSUPPORTED_MEDIA_TYPE},i),e}if(!Up(n,i)){let e=n.headers.origin??n.headers.referer??`(missing)`,t=f(zp(Z.INVALID_ORIGIN,`Unexpected callback origin: ${e}`));return Bp(r,403,{ok:!1,error:Z.INVALID_ORIGIN},i),t}let o=``;try{o=await Vp(n)}catch(e){let t=f(zp(`INVALID_PAYLOAD`,e instanceof Error?e.message:`Unable to read callback payload`));return Bp(r,413,{ok:!1,error:Z.PAYLOAD_TOO_LARGE},i),t}let s;try{let e=JSON.parse(o);if(!Rp(e))throw Error(`Callback payload must be an object`);s=e}catch(e){let t=f(zp(`INVALID_PAYLOAD`,e instanceof Error?e.message:`Malformed callback payload`));return Bp(r,400,{ok:!1,error:`invalid-json`},i),t}if(c){let e=zp(Z.DUPLICATE_CALLBACK,`Nonce has already been used`);return Bp(r,403,{ok:!1,error:Z.DUPLICATE_CALLBACK},i),e}if(!Hp(typeof s.nonce==`string`?s.nonce:``,a)){let e=f(zp(Z.INVALID_NONCE,`Callback nonce did not match`));return Bp(r,403,{ok:!1,error:Z.INVALID_NONCE},i),e}c=!0;let l=Kp(s.selection);if(l){let e=f(zp(`SELECTION_TOO_LARGE`,l));return Bp(r,413,{ok:!1,error:`selection-too-large`},i),e}if(Rp(s.formData)){let e=Gp(s.formData);if(e){let t=f(zp(`PAYLOAD_FIELD_TOO_LARGE`,e));return Bp(r,413,{ok:!1,error:`field-too-large`},i),t}}if(s.kind===`cancelled`){let e=typeof s.reason==`string`?s.reason:``;if(!Lp.has(e)){let t=f(zp(`INVALID_CANCEL_REASON`,`Unsupported cancel reason: ${e||`(missing)`}`));return Bp(r,400,{ok:!1,error:`invalid-cancel-reason`},i),t}let t=f({kind:`cancelled`,reason:e});return Bp(r,200,{ok:!0,kind:`cancelled`},i),t}let u=f(qp(s,e,t));return Bp(r,u.kind===`error`?400:200,{ok:u.kind!==`error`,kind:u.kind},i),u}}}const Xp=`Install AI Kit with <code>${X(`npx -y @vpxa/aikit@latest init --user`)}</code>.`;function Zp(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 Qp=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:Mp(Z.SESSION_LIMIT_REACHED,`Session limit reached`)};let t=Je(),n=Zp({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)||Mp(Z.SESSION_NOT_FOUND,`Session ${e} not found`)}transitionSession(e,t,n){let r=this.sessions.get(e);if(!r)return{ok:!1,error:Mp(Z.SESSION_NOT_FOUND,`Session ${e} not found`)};let i=Pp(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:Mp(Z.INVALID_TRANSITION,i.error.message)}}consumeNonce(e){let t=this.sessions.get(e);return t?t.nonceConsumed?{ok:!1,error:Mp(Z.DUPLICATE_CALLBACK,`Nonce already consumed`)}:(t.nonceConsumed=!0,t.updatedAt=Date.now(),{ok:!0}):{ok:!1,error:Mp(Z.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:Mp(Z.SESSION_NOT_FOUND,`Session ${e} not found`)}}};const $p=String.raw`(function(){
294
+ }`},{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 rp(){let e={};for(let[t,n]of np)n.vendorScripts?.length&&(e[t]=n.vendorScripts);return e}function ip(e){return np.has(e)}const ap=new Map;function op(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,`\\$&`)}function sp(e){let t=`(?=[^>]*\\bid=['"]${op(e)}['"])`;return RegExp(`(<script\\b(?=[^>]*\\btype=['"]application\\/json['"])${t}[^>]*>)[\\s\\S]*?(<\/script>)`,`i`)}function cp(e){ap.has(e.id)&&console.warn(`[viewer-registry] Overwriting viewer template "${e.id}"`),ap.set(e.id,e)}function lp(e){return ap.get(e)}function up(e){return typeof e==`string`&&ap.has(e)}function dp(){return[...ap.values()]}function fp(e,t,n,r){let i=sp(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 pp=import.meta.dirname??Pe(le(import.meta.url)),mp={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`]},hp={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`]},gp={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 _p(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function vp(e,t){return _p(t)?{...t,kind:e}:{kind:e}}function yp(e){let t=e===`canvas.html`?[P(pp,`..`,`..`,`..`,`..`,`..`,`scaffold`,`general`,`viewers`,`src`,`canvas`,`index.html`),P(pp,`..`,`..`,`scaffold`,`general`,`viewers`,`src`,`canvas`,`index.html`)]:[],n=ie(`server`,[P(`viewers`,`dist`,e),P(`viewers`,e)]),r=[...t,...n?[n]:[],P(pp,`..`,`..`,`..`,`viewers`,e),P(pp,`..`,`..`,`..`,`..`,`..`,`scaffold`,`general`,`viewers`,`src`,`static`,e),P(pp,`..`,`..`,`..`,`..`,`..`,`scaffold`,`general`,`viewers`,`dist`,e),P(pp,`..`,`..`,`..`,`..`,`..`,`scaffold`,`general`,`viewers`,e),P(pp,`..`,`..`,`scaffold`,`general`,`viewers`,`dist`,e),P(pp,`..`,`..`,`scaffold`,`general`,`viewers`,e),P(pp,`..`,`viewers`,`dist`,e),P(pp,`..`,`viewers`,e)];for(let e of r)try{return N(e,`utf8`)}catch{}throw Error(`Viewer HTML not found: ${e}. Searched: ${r.join(`, `)}`)}let bp,xp,Sp,Cp,wp,Tp,Ep;function Dp(){return bp??=yp(`c4-viewer.html`),bp}function Op(){return xp??=yp(`tour-viewer.html`),xp}function kp(){return Sp??=yp(`canvas.html`),Sp}function Ap(){return Cp??=yp(`architecture-static.html`),Cp}function jp(){return wp??=yp(`process-flow-static.html`),wp}function Mp(){return Tp??=yp(`task-plan-static.html`),Tp}function Np(){return Ep??=yp(`code-review-viewer.html`),Ep}const Pp={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 Fp(){cp({id:`c4@1`,label:`C4 Architecture Diagram`,description:`Interactive C4 architecture diagram with zoom, pan, and ELK auto-layout`,inputSchema:mp,injectId:`diagram-data`,supportedTransports:[`browser`],resolveHtml:Dp}),cp({id:`c4-static@1`,label:`C4 Architecture Diagram (Static)`,description:`Static SVG architecture diagram for inline rendering`,inputSchema:mp,injectId:`diagram-data`,supportedTransports:[`mcp-app`],resolveHtml:Ap}),cp({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:Op}),cp({id:`process-flow-static@1`,label:`Process Flow Diagram (Static)`,description:`Static SVG process flow diagram for inline rendering`,inputSchema:hp,injectId:`diagram-data`,supportedTransports:[`mcp-app`],resolveHtml:jp}),cp({id:`task-plan-static@1`,label:`Task Execution Plan (Static)`,description:`Static SVG task execution plan for inline rendering`,inputSchema:gp,injectId:`diagram-data`,supportedTransports:[`mcp-app`],resolveHtml:Mp}),cp({id:`process-flow@1`,label:`Process Flow Diagram (Interactive)`,description:`Interactive process flow diagram with ReactFlow`,inputSchema:hp,injectId:`diagram-data`,supportedTransports:[`browser`],resolveHtml:kp,transformData:e=>vp(`process-flow`,e)}),cp({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:Pp,injectId:`review-data`,supportedTransports:[`mcp-app`,`browser`],resolveHtml:Np})}function Ip(){let e=new hr;for(let t of vr.list())e.register(t);return e.register(_r),e.register(Sr),e.register(Cr),e.register(yr),e}function Lp(e,t){return e?.supportedTransports.includes(t)??!1}const Rp=Ip();function zp(e){if(e.template)return Rp.get(e.template)}function Bp(e){if((e.actions?.length??0)>0)return!0;if(e.template&&up(e.template)){let t=lp(e.template);return t?.supportedTransports.includes(`browser`)===!0&&!t.supportedTransports.includes(`mcp-app`)}let t=zp(e);return Lp(t,`browser`)&&!Lp(t,`mcp-app`)}Fp();const Z={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`},Vp={[Z.TIMEOUT]:408,[Z.DUPLICATE_CALLBACK]:409,[Z.INVALID_NONCE]:400,[Z.INVALID_ORIGIN]:403,[Z.SESSION_NOT_FOUND]:404,[Z.SESSION_LIMIT_REACHED]:429,[Z.ASSET_NOT_FOUND]:404,[Z.ASSET_FORBIDDEN]:403,[Z.RATE_LIMITED]:429,[Z.PAYLOAD_TOO_LARGE]:413,[Z.UNSUPPORTED_MEDIA_TYPE]:415,[Z.INVALID_TRANSITION]:400,[Z.ANNOTATION_CAP_EXCEEDED]:403};function Hp(e,t,n){return{code:e,message:t,httpStatus:n??Vp[e]}}const Up={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 Wp(e,t,n,r){return Up[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 Gp(e){return Up[e].length===0}const Kp=1024,qp=new Set([`user-closed`,`host-dismissed`,`replaced`]);function Jp(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Yp(e,t,n){let r={code:e,message:t};return n!==void 0&&(r.details=n),{kind:`error`,error:r}}function Xp(e,t,n,r){e.writeHead(t,{"Content-Type":`application/json`,"Access-Control-Allow-Origin":r??`null`}),e.end(JSON.stringify(n))}async function Zp(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 Qp(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?Je(n,r):!1}function $p(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 em(e){return(e.headers[`content-type`]??``).startsWith(`application/json`)}function tm(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 nm(e){return Array.isArray(e)&&e.length>Kp?`Selection exceeds ${Kp} items (got ${e.length})`:null}function rm(e,t,n){let r=typeof e.actionId==`string`?e.actionId:``,i=n.find(e=>e.id===r);if(!i)return Yp(`INVALID_ACTION`,`Unknown actionId: ${r||`(missing)`}`);let a=typeof e.selection==`string`||Array.isArray(e.selection)?e.selection:void 0,o=Jp(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 im(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 am(e,t,n,r,i){let a=i??Ke(16).toString(`hex`),o=`created`,s=[],c=!1,l,u,d=new Promise(e=>{u=e}),f=e=>{if(Gp(o))return l;let t=im(e),i=Wp(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(Yp(e,t,n))},async handle(n,r,i){if(!em(n)){let e=f(Yp(Z.UNSUPPORTED_MEDIA_TYPE,`Content-Type must be application/json`));return Xp(r,415,{ok:!1,error:Z.UNSUPPORTED_MEDIA_TYPE},i),e}if(!$p(n,i)){let e=n.headers.origin??n.headers.referer??`(missing)`,t=f(Yp(Z.INVALID_ORIGIN,`Unexpected callback origin: ${e}`));return Xp(r,403,{ok:!1,error:Z.INVALID_ORIGIN},i),t}let o=``;try{o=await Zp(n)}catch(e){let t=f(Yp(`INVALID_PAYLOAD`,e instanceof Error?e.message:`Unable to read callback payload`));return Xp(r,413,{ok:!1,error:Z.PAYLOAD_TOO_LARGE},i),t}let s;try{let e=JSON.parse(o);if(!Jp(e))throw Error(`Callback payload must be an object`);s=e}catch(e){let t=f(Yp(`INVALID_PAYLOAD`,e instanceof Error?e.message:`Malformed callback payload`));return Xp(r,400,{ok:!1,error:`invalid-json`},i),t}if(c){let e=Yp(Z.DUPLICATE_CALLBACK,`Nonce has already been used`);return Xp(r,403,{ok:!1,error:Z.DUPLICATE_CALLBACK},i),e}if(!Qp(typeof s.nonce==`string`?s.nonce:``,a)){let e=f(Yp(Z.INVALID_NONCE,`Callback nonce did not match`));return Xp(r,403,{ok:!1,error:Z.INVALID_NONCE},i),e}c=!0;let l=nm(s.selection);if(l){let e=f(Yp(`SELECTION_TOO_LARGE`,l));return Xp(r,413,{ok:!1,error:`selection-too-large`},i),e}if(Jp(s.formData)){let e=tm(s.formData);if(e){let t=f(Yp(`PAYLOAD_FIELD_TOO_LARGE`,e));return Xp(r,413,{ok:!1,error:`field-too-large`},i),t}}if(s.kind===`cancelled`){let e=typeof s.reason==`string`?s.reason:``;if(!qp.has(e)){let t=f(Yp(`INVALID_CANCEL_REASON`,`Unsupported cancel reason: ${e||`(missing)`}`));return Xp(r,400,{ok:!1,error:`invalid-cancel-reason`},i),t}let t=f({kind:`cancelled`,reason:e});return Xp(r,200,{ok:!0,kind:`cancelled`},i),t}let u=f(rm(s,e,t));return Xp(r,u.kind===`error`?400:200,{ok:u.kind!==`error`,kind:u.kind},i),u}}}const om=`Install AI Kit with <code>${X(`npx -y @vpxa/aikit@latest init --user`)}</code>.`;function sm(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 cm=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:Hp(Z.SESSION_LIMIT_REACHED,`Session limit reached`)};let t=qe(),n=sm({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)||Hp(Z.SESSION_NOT_FOUND,`Session ${e} not found`)}transitionSession(e,t,n){let r=this.sessions.get(e);if(!r)return{ok:!1,error:Hp(Z.SESSION_NOT_FOUND,`Session ${e} not found`)};let i=Wp(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:Hp(Z.INVALID_TRANSITION,i.error.message)}}consumeNonce(e){let t=this.sessions.get(e);return t?t.nonceConsumed?{ok:!1,error:Hp(Z.DUPLICATE_CALLBACK,`Nonce already consumed`)}:(t.nonceConsumed=!0,t.updatedAt=Date.now(),{ok:!0}):{ok:!1,error:Hp(Z.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:Hp(Z.SESSION_NOT_FOUND,`Session ${e} not found`)}}};const lm=String.raw`(function(){
286
295
  'use strict';
287
296
 
288
297
  var SVG_NS = 'http://www.w3.org/2000/svg';
@@ -2663,7 +2672,7 @@ None.`:`### Stale Lessons\n${f.map(e=>`- **${e.title}** (\`${e.path}\`) — effe
2663
2672
  };
2664
2673
 
2665
2674
  init();
2666
- })();`;function em(){let e;return()=>{if(e!==void 0)return e;try{e=M(le(import.meta.url).resolve(`mermaid/dist/mermaid.min.js`),`utf-8`)}catch{e=``}return e}}const tm={id:`mermaid`,cdn:`https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js`,inlineSource:$p,initScript:`window.__aikit_initMermaid = function() {
2675
+ })();`;function um(){let e;return()=>{if(e!==void 0)return e;try{e=N(ce(import.meta.url).resolve(`mermaid/dist/mermaid.min.js`),`utf-8`)}catch{e=``}return e}}const dm={id:`mermaid`,cdn:`https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js`,inlineSource:lm,initScript:`window.__aikit_initMermaid = function() {
2667
2676
  if (typeof mermaid === 'undefined') return;
2668
2677
  if (document.readyState === 'loading') {
2669
2678
  document.addEventListener('DOMContentLoaded', window.__aikit_initMermaid);
@@ -2676,7 +2685,7 @@ None.`:`### Stale Lessons\n${f.map(e=>`- **${e.title}** (\`${e.path}\`) — effe
2676
2685
  }
2677
2686
  mermaid.initialize({ startOnLoad: false, theme: theme });
2678
2687
  mermaid.run();
2679
- };`,onload:`window.__aikit_initMermaid&&window.__aikit_initMermaid()`,local:{route:`/vendor/mermaid.min.js`,getSource:em()}},nm=new Map([[`mermaid`,tm]]);function rm(e,t){if(!e?.length)return;let n=[];for(let r of e){let e=nm.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 im(){let e=[];for(let t of nm.values())t.local&&e.push({route:t.local.route,getSource:t.local.getSource,cdn:t.cdn});return e}const am=300*1e3,om=15*1e3,sm=`/@aikit/blocks-interactive/dist/`;var cm=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 lm=null,um=null;const dm=new Map,fm=new cm(10,10),pm=new cm(50,50);function mm(){return lm||(lm={manager:new Qp,server:null,port:0},process.on(`exit`,()=>{lm?.manager.shutdown()})),lm.manager}async function hm(){if(!lm)throw Error(`Browser server state not initialized`);let e=lm;if(e.server)return e.port;if(um)return um;let t=Tr((e,t)=>{bm(e,t)});return e.server=t,um=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)}),um}let gm;function _m(){return gm===void 0&&(gm=g(`blocks-interactive`)),gm}function vm(e){if(!e.startsWith(sm))return null;let t=_m();if(!t)return null;let n=P(N(t,`dist`,e.slice(32))),r=P(N(t,`dist`)),i=process.platform===`win32`?`\\`:`/`;return!n.startsWith(r+i)&&n!==r?null:n}function ym(e){return`script-src 'nonce-${e}' 'strict-dynamic'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; connect-src 'self'; frame-ancestors 'self'`}function bm(e,t){let n=lm;if(!n){Am(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`){xm(t,405,`METHOD_NOT_ALLOWED`,`Clipboard capture requires POST.`);return}Pm(t,jm(e,n));return}if(r.startsWith(`/__aikit_screenshot.png`)){Nm(t,jm(e,n));return}if(r.startsWith(`/__aikit_system_clipboard`)){if(i!==`POST`){xm(t,405,`METHOD_NOT_ALLOWED`,`System clipboard write requires POST.`);return}Fm(e,t);return}let a=r.match(/^\/present\/([^/]+)(?:\/(.*))?$/);if(a){let r=a[1],i=a[2]??``,o=dm.get(r);if(!o){xm(t,404,Z.SESSION_NOT_FOUND,`Session ${r} not found`);return}if(o.hasClientConnected=!0,n.manager.transitionSession(r,`connected`,`client-connect`),i===``||i===`/`){t.writeHead(200,{"Content-Type":`text/html; charset=utf-8`,"Content-Security-Policy":ym(o.callbackSession.nonce)}),t.end(o.html);return}if(i===`viewer`){if(!o.viewerHtml){t.writeHead(404,{"Content-Type":`text/plain`}),t.end(`Not Found`);return}t.writeHead(200,{"Content-Type":`text/html; charset=utf-8`}),t.end(o.viewerHtml);return}if(i===`callback`){if(!fm.tryConsume()){xm(t,429,Z.RATE_LIMITED,`Too many requests`);return}o.callbackSession.handle(e,t,`http://127.0.0.1:${n.port}`).catch(()=>{Am(t)});return}t.writeHead(404,{"Content-Type":`text/plain`}),t.end(`Not Found`);return}let o=im().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(sm)){if(!pm.tryConsume()){xm(t,429,Z.RATE_LIMITED,`Too many requests`);return}let e=vm(r);if(e)try{let n=M(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{Am(t)}}function xm(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{}}}function Sm(e){let t=X(e.id),n=X(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="${X(e.value)}">${X(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=X(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="${X(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-${X(e.variant??`default`)}" data-action-id="${t}" data-action-label="${n}">${n}</button>`}function Cm(e){return e.length===0?``:`<div class="bk-actions">${e.map(Sm).join(``)}</div>`}function wm(e,t){if(e.length===0)return``;let n=JSON.stringify(t);return`<style>
2688
+ };`,onload:`window.__aikit_initMermaid&&window.__aikit_initMermaid()`,local:{route:`/vendor/mermaid.min.js`,getSource:um()}},fm=new Map([[`mermaid`,dm]]);function pm(e,t){if(!e?.length)return;let n=[];for(let r of e){let e=fm.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 mm(){let e=[];for(let t of fm.values())t.local&&e.push({route:t.local.route,getSource:t.local.getSource,cdn:t.cdn});return e}const hm=300*1e3,gm=15*1e3,_m=`/@aikit/blocks-interactive/dist/`;var vm=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 ym=null,bm=null;const xm=new Map,Sm=new vm(10,10),Cm=new vm(50,50);function wm(){return ym||(ym={manager:new cm,server:null,port:0},process.on(`exit`,()=>{ym?.manager.shutdown()})),ym.manager}async function Tm(){if(!ym)throw Error(`Browser server state not initialized`);let e=ym;if(e.server)return e.port;if(bm)return bm;let t=Tr((e,t)=>{Am(e,t)});return e.server=t,bm=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)}),bm}let Em;function Dm(){return Em===void 0&&(Em=g(`blocks-interactive`)),Em}function Om(e){if(!e.startsWith(_m))return null;let t=Dm();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 km(e){return`script-src 'nonce-${e}' 'strict-dynamic'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; connect-src 'self'; frame-ancestors 'self'`}function Am(e,t){let n=ym;if(!n){Bm(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`){jm(t,405,`METHOD_NOT_ALLOWED`,`Clipboard capture requires POST.`);return}Wm(t,Vm(e,n));return}if(r.startsWith(`/__aikit_screenshot.png`)){Um(t,Vm(e,n));return}if(r.startsWith(`/__aikit_system_clipboard`)){if(i!==`POST`){jm(t,405,`METHOD_NOT_ALLOWED`,`System clipboard write requires POST.`);return}Gm(e,t);return}let a=r.match(/^\/present\/([^/]+)(?:\/(.*))?$/);if(a){let r=a[1],i=a[2]??``,o=xm.get(r);if(!o){jm(t,404,Z.SESSION_NOT_FOUND,`Session ${r} not found`);return}if(o.hasClientConnected=!0,n.manager.transitionSession(r,`connected`,`client-connect`),i===``||i===`/`){t.writeHead(200,{"Content-Type":`text/html; charset=utf-8`,"Content-Security-Policy":km(o.callbackSession.nonce)}),t.end(o.html);return}if(i===`viewer`){if(!o.viewerHtml){t.writeHead(404,{"Content-Type":`text/plain`}),t.end(`Not Found`);return}t.writeHead(200,{"Content-Type":`text/html; charset=utf-8`}),t.end(o.viewerHtml);return}if(i===`callback`){if(!Sm.tryConsume()){jm(t,429,Z.RATE_LIMITED,`Too many requests`);return}o.callbackSession.handle(e,t,`http://127.0.0.1:${n.port}`).catch(()=>{Bm(t)});return}t.writeHead(404,{"Content-Type":`text/plain`}),t.end(`Not Found`);return}let o=mm().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(_m)){if(!Cm.tryConsume()){jm(t,429,Z.RATE_LIMITED,`Too many requests`);return}let e=Om(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{Bm(t)}}function jm(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{}}}function Mm(e){let t=X(e.id),n=X(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="${X(e.value)}">${X(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=X(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="${X(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-${X(e.variant??`default`)}" data-action-id="${t}" data-action-label="${n}">${n}</button>`}function Nm(e){return e.length===0?``:`<div class="bk-actions">${e.map(Mm).join(``)}</div>`}function Pm(e,t){if(e.length===0)return``;let n=JSON.stringify(t);return`<style>
2680
2689
  .present-surface-title { margin: 0 0 0.75rem; font-size: 1.875rem; }
2681
2690
  .present-surface-description { margin: 0; color: var(--muted-foreground, #6b7280); }
2682
2691
  .present-actions-list { display: flex; flex-wrap: wrap; gap: 0.75rem; align-items: flex-end; }
@@ -2894,27 +2903,27 @@ None.`:`### Stale Lessons\n${f.map(e=>`- **${e.title}** (\`${e.path}\`) — effe
2894
2903
  navigator.sendBeacon('/callback', new Blob([body], { type: 'application/json' }));
2895
2904
  });
2896
2905
  })();
2897
- <\/script>`}function Tm(e){try{if(process.platform===`win32`){Bn(`cmd`,[`/c`,`start`,``,e],{windowsHide:!0});return}if(process.platform===`darwin`){Bn(`open`,[e]);return}Bn(`xdg-open`,[e])}catch{}}async function Em(e){try{let t=Wn();return await t.launch(`ui`),t.resetIdleTimer(),await t.open(e),!0}catch{return Tm(e),!1}}function Dm(e,t,n){let r=[e.title];return e.description&&r.push(e.description),r.push(``,`Opened in browser at ${t}`,n),r.join(`
2898
- `)}function Om(e){return e.some(e=>e.id!==`__dismiss`)}function km(e){return e.replace(`</head>`,`${Nh}\n</head>`).replace(`</body>`,`${Ph}\n</body>`)}function Am(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 Mm(e,t){let n=Wn(),r=`ss-${Date.now()}`;n.isLaunched()||await n.launch(`headless`);let{base64:i}=await n.screenshot(r,{fullPage:t?.fullPage!==!1,format:t?.format,quality:t?.quality,annotate:t?.annotate});return Buffer.from(i,`base64`)}async function Nm(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 Mm(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),Am(e)}}async function Pm(e,t){if(!t){xm(e,503,`CLIPBOARD_CAPTURE_TARGET_MISSING`,`Clipboard target is not ready.`);return}try{let n=await Mm(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),xm(e,500,`CLIPBOARD_CAPTURE_FAILED`,`Clipboard capture failed: ${n}`)}}async function Fm(e,t){let n=[];e.on(`data`,e=>n.push(e)),e.on(`end`,async()=>{let e=Buffer.concat(n);if(e.length===0){xm(t,400,`EMPTY_BODY`,`No image data received.`);return}try{await Im(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),xm(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),xm(t,500,`REQUEST_ERROR`,`Request stream error.`)})}async function Im(e){let t=N(Un(),`aikit-clipboard-${Date.now()}-${qe(4).toString(`hex`)}.png`);Ne(t,e);try{if(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)=>{zn(`powershell.exe -NoProfile -STA -Command "${e.replace(/"/g,`\\"`)}"`,{timeout:15e3},e=>{e?n(Error(`PowerShell clipboard write failed: ${e.message}`)):t()})})}else if(process.platform===`darwin`)await new Promise((e,n)=>{zn(`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)=>{zn(`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)=>{zn(`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{Me(t)}catch{}}}function Lm(e,t){return e.replace(/'\/callback'/g,`'/present/${t}/callback'`).replace(/"\/callback"/g,`"/present/${t}/callback"`)}function Rm(e,t){return e.replace(/src="\/viewer"/g,`src="/present/${t}/viewer"`)}async function zm(e,t){if(dh(`<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=xn({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(`
2899
- `);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 n=km(np(t.resolveHtml(),e.data??null,t.injectId,t.transformData)),r=mm(),i=qe(16).toString(`hex`),a=r.createSession({surfaceId:`viewer`,transport:`viewer`,nonce:i});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=Yp(`viewer`,e.actions??[],r,o,i),c=Rm(gr({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>`,` ${Fh(i)}`,`</div>`].join(`
2906
+ <\/script>`}function Fm(e){try{if(process.platform===`win32`){zn(`cmd`,[`/c`,`start`,``,e],{windowsHide:!0});return}if(process.platform===`darwin`){zn(`open`,[e]);return}zn(`xdg-open`,[e])}catch{}}async function Im(e){try{let t=Un();return await t.launch(`ui`),t.resetIdleTimer(),await t.open(e),!0}catch{return Fm(e),!1}}function Lm(e,t,n){let r=[e.title];return e.description&&r.push(e.description),r.push(``,`Opened in browser at ${t}`,n),r.join(`
2907
+ `)}function Rm(e){return e.some(e=>e.id!==`__dismiss`)}function zm(e){return e.replace(`</head>`,`${Uh}\n</head>`).replace(`</body>`,`${Wh}\n</body>`)}function Bm(e){if(!e.headersSent)try{e.writeHead(500,{"Content-Type":`text/plain`}),e.end(`Internal Server Error`)}catch{try{e.end()}catch{}}}function Vm(e,t){let n=e.headers.referer;return typeof n==`string`&&n.length>0?n:`http://127.0.0.1:${t.port}`}async function Hm(e,t){let n=Un(),r=`ss-${Date.now()}`;n.isLaunched()||await n.launch(`headless`);let{base64:i}=await n.screenshot(r,{fullPage:t?.fullPage!==!1,format:t?.format,quality:t?.quality,annotate:t?.annotate});return Buffer.from(i,`base64`)}async function Um(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 Hm(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),Bm(e)}}async function Wm(e,t){if(!t){jm(e,503,`CLIPBOARD_CAPTURE_TARGET_MISSING`,`Clipboard target is not ready.`);return}try{let n=await Hm(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),jm(e,500,`CLIPBOARD_CAPTURE_FAILED`,`Clipboard capture failed: ${n}`)}}async function Gm(e,t){let n=[];e.on(`data`,e=>n.push(e)),e.on(`end`,async()=>{let e=Buffer.concat(n);if(e.length===0){jm(t,400,`EMPTY_BODY`,`No image data received.`);return}try{await Km(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),jm(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),jm(t,500,`REQUEST_ERROR`,`Request stream error.`)})}async function Km(e){let t=P(Hn(),`aikit-clipboard-${Date.now()}-${Ke(4).toString(`hex`)}.png`);Me(t,e);try{if(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)=>{Rn(`powershell.exe -NoProfile -STA -Command "${e.replace(/"/g,`\\"`)}"`,{timeout:15e3},e=>{e?n(Error(`PowerShell clipboard write failed: ${e.message}`)):t()})})}else if(process.platform===`darwin`)await new Promise((e,n)=>{Rn(`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)=>{Rn(`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)=>{Rn(`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{je(t)}catch{}}}function qm(e,t){return e.replace(/'\/callback'/g,`'/present/${t}/callback'`).replace(/"\/callback"/g,`"/present/${t}/callback"`)}function Jm(e,t){return e.replace(/src="\/viewer"/g,`src="/present/${t}/viewer"`)}async function Ym(e,t){if(xh(`<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=bn({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(`
2908
+ `);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 n=zm(fp(t.resolveHtml(),e.data??null,t.injectId,t.transformData)),r=wm(),i=Ke(16).toString(`hex`),a=r.createSession({surfaceId:`viewer`,transport:`viewer`,nonce:i});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=am(`viewer`,e.actions??[],r,o,i),c=Jm(gr({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>`,` ${Gh(i)}`,`</div>`].join(`
2900
2909
  `),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(`
2901
- `)],islands:[],payload:void 0,nonce:i,generatedAt:new Date().toISOString(),colorScheme:e.colorScheme,lang:e.lang,dir:e.dir,transport:`browser`,exportPolicy:`local-interactive`,imageExportMode:`browser-server`,footerContentHtml:Xp}),o);dm.set(o,{callbackSession:s,html:c,viewerHtml:n,hasClientConnected:!1,createdAt:Date.now()});let l=``;try{l=`http://127.0.0.1:${await hm()}/present/${o}`}catch(t){return dm.delete(o),r.removeSession(o),{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}}return await Em(l),setTimeout(()=>{dm.delete(o),r.removeSession(o)},am),{content:[{type:`text`,text:Dm(e,l,`Rendered.`)}],structuredContent:{kind:`rendered`,reason:`no-response-required`}}}async function Bm(e){dh(`<html><body style="font-family:system-ui;padding:2rem;color:#888;text-align:center"><p>Content opened in browser window.</p></body></html>`);let t=mm(),n=qe(16).toString(`hex`),r=wr(e,{transport:`browser`,registry:Op,blockVendorScripts:qf(),nonce:n}),i=t.createSession({surfaceId:r.surfaceId,transport:`browser`,nonce:n});if(!i.ok)return{content:[{type:`text`,text:`${e.title}\n\nUnable to start local browser transport.`}],structuredContent:{kind:`error`,error:{code:`BROWSER_START_FAILED`,message:i.error.message}},isError:!0};let a=i.session.id,o=Yp(r.surfaceId,r.actions,t,a,n),s=rm(r.vendorScripts,`browser`);im();let c=r.actions.length>0?Cm(r.actions):``,l=r.actions.length>0?wm(r.actions,o.nonce):``,u=gr({title:e.title,subtitle:e.description,html:[r.html,c,l].filter(Boolean).join(`
2902
- `),css:r.css,islands:r.islands,payload:r.payload,nonce:r.nonce,generatedAt:new Date().toISOString(),colorScheme:e.colorScheme,lang:e.lang,dir:e.dir,transport:`browser`,exportPolicy:r.exportPolicy,imageExportMode:`browser-server`,footerContentHtml:Xp,headScripts:s}),d=Lm(r.actions.length>0?Vh(u,r.nonce):u,a);dm.set(a,{callbackSession:o,html:d,hasClientConnected:!1,createdAt:Date.now()});let f=``;try{f=`http://127.0.0.1:${await hm()}/present/${a}`;let e=dm.get(a);e&&e.hasClientConnected}catch(n){return dm.delete(a),t.removeSession(a),t.shutdown(),{content:[{type:`text`,text:`${e.title}\n\nUnable to start local browser transport.`}],structuredContent:o.settleError(`BROWSER_START_FAILED`,n instanceof Error?n.message:`Unable to start browser transport`),isError:!0}}let p=await Em(f);if(!Om(r.actions))return setTimeout(()=>{dm.delete(a);try{t.removeSession(a)}catch{}},am),{content:[{type:`text`,text:Dm(e,f,`Rendered.`)}],structuredContent:{kind:`rendered`,reason:`no-response-required`}};let m=await Promise.race([o.promise,new Promise(e=>{setTimeout(()=>{dm.get(a)?.hasClientConnected||(dm.delete(a),e(o.settleError(`BROWSER_CONNECT_TIMEOUT`,p?`No browser client connected within ${om}ms.`:`Fell back to system browser, but no browser client connected within ${om}ms.`)))},om)}),new Promise(e=>{setTimeout(()=>e(o.settleTimeout(am)),am)})]);setTimeout(()=>{dm.delete(a);try{t.removeSession(a)}catch{}},am);let h=m.kind===`result`?`Selected action: ${m.result.actionId}`:m.kind===`timeout`?`Timed out after ${m.waitedMs}ms.`:m.kind===`cancelled`?`Cancelled: ${m.reason}.`:m.kind===`error`?`Error: ${m.error.message}`:`Rendered.`;return{content:[{type:`text`,text:Dm(e,f,h)}],structuredContent:m,isError:m.kind===`error`}}const Vm={id:`browser`,priority:20,canHandle(e,t){let n=Ah(e);return Ap(n)||!!t.preferBrowser&&!!jh(n)},async render(e,t){return Bm(e)}},Hm=`openai/outputTemplate`,Um=`ui/resourceUri`,Wm={connectDomains:[],resourceDomains:[]},Gm={connect_domains:[],resource_domains:[]};function Km(e){return{ui:{resourceUri:e,visibility:[`model`,`app`]},[Um]:e,[Hm]:e,"openai/widgetAccessible":!0}}function qm(){return{ui:{prefersBorder:!1,csp:Wm},"openai/widgetDescription":`AI Kit renders structured visual surfaces such as dashboards, charts, reports, and diagrams.`,"openai/widgetPrefersBorder":!1,"openai/widgetCSP":Gm}}function Jm(e){return{ui:{resourceUri:e},[Um]:e,[Hm]:e}}function Ym(e){return{...e,schemaVersion:1}}function Xm(e){try{let t=wr(e,{transport:`mcp-app`,registry:Op,blockVendorScripts:qf()}),n=rm(t.vendorScripts,`mcp-app`),r=gr({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:Xp,headScripts:n}),i={kind:`rendered`,reason:`no-response-required`},a=Lh(r);dh(a);let o=Mh(e,i,{includeSurfaceHeader:!1}),s=lh(),c=mh(s);return c&&fh(c,a),{content:[{type:`text`,text:o}],structuredContent:Ym(e),_meta:Jm(s),ui:{type:`resource`,uri:s}}}catch(t){return Uh(`RENDER_FAILED`,t instanceof Error?t.message:`Failed to render ChannelSurface`,void 0,e.title)}}const Zm={id:`mcp-app`,priority:30,canHandle(e,t){return!0},async render(e,t){return Xm(e)}};var Qm=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 $m(e){return`<script nonce="${X(e)}">
2910
+ `)],islands:[],payload:void 0,nonce:i,generatedAt:new Date().toISOString(),colorScheme:e.colorScheme,lang:e.lang,dir:e.dir,transport:`browser`,exportPolicy:`local-interactive`,imageExportMode:`browser-server`,footerContentHtml:om}),o);xm.set(o,{callbackSession:s,html:c,viewerHtml:n,hasClientConnected:!1,createdAt:Date.now()});let l=``;try{l=`http://127.0.0.1:${await Tm()}/present/${o}`}catch(t){return xm.delete(o),r.removeSession(o),{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}}return await Im(l),setTimeout(()=>{xm.delete(o),r.removeSession(o)},hm),{content:[{type:`text`,text:Lm(e,l,`Rendered.`)}],structuredContent:{kind:`rendered`,reason:`no-response-required`}}}async function Xm(e){xh(`<html><body style="font-family:system-ui;padding:2rem;color:#888;text-align:center"><p>Content opened in browser window.</p></body></html>`);let t=wm(),n=Ke(16).toString(`hex`),r=wr(e,{transport:`browser`,registry:Rp,blockVendorScripts:rp(),nonce:n}),i=t.createSession({surfaceId:r.surfaceId,transport:`browser`,nonce:n});if(!i.ok)return{content:[{type:`text`,text:`${e.title}\n\nUnable to start local browser transport.`}],structuredContent:{kind:`error`,error:{code:`BROWSER_START_FAILED`,message:i.error.message}},isError:!0};let a=i.session.id,o=am(r.surfaceId,r.actions,t,a,n),s=pm(r.vendorScripts,`browser`);mm();let c=r.actions.length>0?Nm(r.actions):``,l=r.actions.length>0?Pm(r.actions,o.nonce):``,u=gr({title:e.title,subtitle:e.description,html:[r.html,c,l].filter(Boolean).join(`
2911
+ `),css:r.css,islands:r.islands,payload:r.payload,nonce:r.nonce,generatedAt:new Date().toISOString(),colorScheme:e.colorScheme,lang:e.lang,dir:e.dir,transport:`browser`,exportPolicy:r.exportPolicy,imageExportMode:`browser-server`,footerContentHtml:om,headScripts:s}),d=qm(r.actions.length>0?Zh(u,r.nonce):u,a);xm.set(a,{callbackSession:o,html:d,hasClientConnected:!1,createdAt:Date.now()});let f=``;try{f=`http://127.0.0.1:${await Tm()}/present/${a}`;let e=xm.get(a);e&&e.hasClientConnected}catch(n){return xm.delete(a),t.removeSession(a),t.shutdown(),{content:[{type:`text`,text:`${e.title}\n\nUnable to start local browser transport.`}],structuredContent:o.settleError(`BROWSER_START_FAILED`,n instanceof Error?n.message:`Unable to start browser transport`),isError:!0}}let p=await Im(f);if(!Rm(r.actions))return setTimeout(()=>{xm.delete(a);try{t.removeSession(a)}catch{}},hm),{content:[{type:`text`,text:Lm(e,f,`Rendered.`)}],structuredContent:{kind:`rendered`,reason:`no-response-required`}};let m=await Promise.race([o.promise,new Promise(e=>{setTimeout(()=>{xm.get(a)?.hasClientConnected||(xm.delete(a),e(o.settleError(`BROWSER_CONNECT_TIMEOUT`,p?`No browser client connected within ${gm}ms.`:`Fell back to system browser, but no browser client connected within ${gm}ms.`)))},gm)}),new Promise(e=>{setTimeout(()=>e(o.settleTimeout(hm)),hm)})]);setTimeout(()=>{xm.delete(a);try{t.removeSession(a)}catch{}},hm);let h=m.kind===`result`?`Selected action: ${m.result.actionId}`:m.kind===`timeout`?`Timed out after ${m.waitedMs}ms.`:m.kind===`cancelled`?`Cancelled: ${m.reason}.`:m.kind===`error`?`Error: ${m.error.message}`:`Rendered.`;return{content:[{type:`text`,text:Lm(e,f,h)}],structuredContent:m,isError:m.kind===`error`}}const Zm={id:`browser`,priority:20,canHandle(e,t){let n=Bh(e);return Bp(n)||!!t.preferBrowser&&!!Vh(n)},async render(e,t){return Xm(e)}},Qm=`openai/outputTemplate`,$m=`ui/resourceUri`,eh={connectDomains:[],resourceDomains:[]},th={connect_domains:[],resource_domains:[]};function nh(e){return{ui:{resourceUri:e,visibility:[`model`,`app`]},[$m]:e,[Qm]:e,"openai/widgetAccessible":!0}}function rh(){return{ui:{prefersBorder:!1,csp:eh},"openai/widgetDescription":`AI Kit renders structured visual surfaces such as dashboards, charts, reports, and diagrams.`,"openai/widgetPrefersBorder":!1,"openai/widgetCSP":th}}function ih(e){return{ui:{resourceUri:e},[$m]:e,[Qm]:e}}function ah(e){return{...e,schemaVersion:1}}function oh(e){try{let t=wr(e,{transport:`mcp-app`,registry:Rp,blockVendorScripts:rp()}),n=pm(t.vendorScripts,`mcp-app`),r=gr({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:om,headScripts:n}),i={kind:`rendered`,reason:`no-response-required`},a=qh(r);xh(a);let o=Hh(e,i,{includeSurfaceHeader:!1}),s=yh(),c=wh(s);return c&&Sh(c,a),{content:[{type:`text`,text:o}],structuredContent:ah(e),_meta:ih(s),ui:{type:`resource`,uri:s}}}catch(t){return $h(`RENDER_FAILED`,t instanceof Error?t.message:`Failed to render ChannelSurface`,void 0,e.title)}}const sh={id:`mcp-app`,priority:30,canHandle(e,t){return!0},async render(e,t){return oh(e)}};var ch=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 lh(e){return`<script nonce="${X(e)}">
2903
2912
  window.addEventListener('message', function(e) {
2904
2913
  if (e.data && e.data.type === 'aikit-viewer-height') {
2905
2914
  var container = document.querySelector('.present-viewer-container');
2906
2915
  if (container) { container.style.minHeight = e.data.height + 'px'; }
2907
2916
  }
2908
2917
  });
2909
- <\/script>`}async function eh(e,t){try{let n=Ih(np(t.resolveHtml(),e.data??null,t.injectId,t.transformData)).replace(/&/g,`&amp;`).replace(/"/g,`&quot;`),r=qe(16).toString(`hex`),i={kind:`rendered`,reason:`no-response-required`};dh(Lh(gr({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>`,` ${Fh(r)}`,` ${$m(r)}`,`</div>`].join(`
2918
+ <\/script>`}async function uh(e,t){try{let n=Kh(fp(t.resolveHtml(),e.data??null,t.injectId,t.transformData)).replace(/&/g,`&amp;`).replace(/"/g,`&quot;`),r=Ke(16).toString(`hex`),i={kind:`rendered`,reason:`no-response-required`};xh(qh(gr({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>`,` ${Gh(r)}`,` ${lh(r)}`,`</div>`].join(`
2910
2919
  `),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(`
2911
- `)],islands:[],payload:void 0,nonce:r,generatedAt:new Date().toISOString(),footerContentHtml:Xp,colorScheme:e.colorScheme,lang:e.lang,dir:e.dir,transport:`mcp-app`,exportPolicy:`local-interactive`,imageExportMode:`disabled`})));let a=Mh(e,i,{includeSurfaceHeader:!1}),o=lh();return{content:[{type:`text`,text:a}],structuredContent:Ym(e),_meta:Jm(o),ui:{type:`resource`,uri:o}}}catch(t){return Uh(`VIEWER_RENDER_FAILED`,t instanceof Error?t.message:`Failed to render viewer template`,void 0,e.title)}}const th={id:`viewer`,priority:10,canHandle(e,t){return e.template?$f(e.template)!=null:!1},async render(e,t){let n=$f(e.template??``);if(!n)return Uh(`VIEWER_NOT_FOUND`,`Viewer template "${e.template}" not found`,void 0,e.title);if(e.data!=null&&n.inputSchema){let t=xn({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(`
2912
- `);return Uh(`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 zm(e,n):i?eh(e,n):Uh(`VIEWER_TRANSPORT_UNSUPPORTED`,`Viewer template "${n.id}" does not support an available transport`,void 0,e.title)}},nh=`ui://aikit/present.html`,rh=`ui://aikit/present/{id}.html`,ih=O(`present`);let ah=0,oh=``;const sh=new Map,ch=new Map;function lh(){return`ui://aikit/present/${`${Date.now().toString(36)}_${(++ah).toString(36)}`}.html`}function uh(){return oh}function dh(e){oh=e}function fh(e,t){let n=ch.get(e);n&&clearTimeout(n),sh.set(e,t),ch.set(e,setTimeout(()=>{sh.delete(e),ch.delete(e)},3e4))}function ph(e){return sh.get(e)}function mh(e){return e.match(/\/present\/(.+)\.html$/)?.[1]}const hh=new Qm;hh.register(th),hh.register(Vm),hh.register(Zm);function gh(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const _h=/\\u[0-9a-fA-F]{4}/,vh=/^\s*\|(?:[^|\r\n]+\|){2,}\s*$/,yh=/^\s*\|?(?:\s*:?-{3,}:?\s*\|){2,}\s*$/,bh=/\b(cli|terminal|tty|console|command(?:-|\s)?line)\b/i;function xh(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 Sh(e){let t=e.split(/\r?\n/);for(let e=0;e<t.length-1;e+=1)if(vh.test(t[e])&&yh.test(t[e+1]))return!0;return!1}function Ch(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 wh(e,t){if(t<2)return!1;let n=e.trim();return n.startsWith(`|`)?Ch(n).length===t:!1}function Th(e){let t=e.split(/\r?\n/),n=[],r=[],i=()=>{r.length!==0&&(n.push({type:`text`,content:r.join(`
2913
- `)}),r.length=0)},a=0;for(;a<t.length;){let e=t[a],o=t[a+1];if(o!==void 0&&vh.test(e)&&yh.test(o)){let r=Ch(e),o=[];i();let s=a+2;for(;s<t.length&&wh(t[s],r.length);)o.push(Ch(t[s])),s+=1;n.push({type:`table`,headers:r,rows:o}),a=s;continue}r.push(e),a+=1}return i(),n}function Eh(e){let t=xh(e);return!t||!Sh(t)?[e]:Th(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 Dh(e){if(typeof e==`string`)return bh.test(e);if(Array.isArray(e))return e.some(e=>Dh(e));if(!gh(e))return!1;let t=[`client`,`clientInfo`,`host`,`source`,`mode`,`name`,`title`,`channel`];return Object.entries(e).some(([e,n])=>t.includes(e)?Dh(n):!1)}function Oh(e,t){return{preferBrowser:[t,e._meta,gh(e.metadata)?e.metadata.source:void 0].some(e=>Dh(e))}}const kh={id:`__dismiss`,type:`button`,label:`Done`,variant:`default`};function Ah(e){if((e.actions?.length??0)>0||!e.template)return e;let t=kp(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=$f(e.template);return t?t.supportedTransports.includes(`browser`):kp(e)?.supportedTransports.includes(`browser`)??!1}function Mh(e,t,n={}){let r=n.includeSurfaceHeader??!0,i=r?[e.title]:[];return r&&e.description&&i.push(e.description),xr(t)?i.push(``,`Selected action: ${t.result.actionId}`):br(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(`
2914
- `)}const Nh=`<style>
2920
+ `)],islands:[],payload:void 0,nonce:r,generatedAt:new Date().toISOString(),footerContentHtml:om,colorScheme:e.colorScheme,lang:e.lang,dir:e.dir,transport:`mcp-app`,exportPolicy:`local-interactive`,imageExportMode:`disabled`})));let a=Hh(e,i,{includeSurfaceHeader:!1}),o=yh();return{content:[{type:`text`,text:a}],structuredContent:ah(e),_meta:ih(o),ui:{type:`resource`,uri:o}}}catch(t){return $h(`VIEWER_RENDER_FAILED`,t instanceof Error?t.message:`Failed to render viewer template`,void 0,e.title)}}const dh={id:`viewer`,priority:10,canHandle(e,t){return e.template?lp(e.template)!=null:!1},async render(e,t){let n=lp(e.template??``);if(!n)return $h(`VIEWER_NOT_FOUND`,`Viewer template "${e.template}" not found`,void 0,e.title);if(e.data!=null&&n.inputSchema){let t=bn({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(`
2921
+ `);return $h(`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 Ym(e,n):i?uh(e,n):$h(`VIEWER_TRANSPORT_UNSUPPORTED`,`Viewer template "${n.id}" does not support an available transport`,void 0,e.title)}},fh=`ui://aikit/present.html`,ph=`ui://aikit/present/{id}.html`,mh=k(`present`);let hh=0,gh=``;const _h=new Map,vh=new Map;function yh(){return`ui://aikit/present/${`${Date.now().toString(36)}_${(++hh).toString(36)}`}.html`}function bh(){return gh}function xh(e){gh=e}function Sh(e,t){let n=vh.get(e);n&&clearTimeout(n),_h.set(e,t),vh.set(e,setTimeout(()=>{_h.delete(e),vh.delete(e)},3e4))}function Ch(e){return _h.get(e)}function wh(e){return e.match(/\/present\/(.+)\.html$/)?.[1]}const Th=new ch;Th.register(dh),Th.register(Zm),Th.register(sh);function Eh(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Dh=/\\u[0-9a-fA-F]{4}/,Oh=/^\s*\|(?:[^|\r\n]+\|){2,}\s*$/,kh=/^\s*\|?(?:\s*:?-{3,}:?\s*\|){2,}\s*$/,Ah=/\b(cli|terminal|tty|console|command(?:-|\s)?line)\b/i;function jh(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 Mh(e){let t=e.split(/\r?\n/);for(let e=0;e<t.length-1;e+=1)if(Oh.test(t[e])&&kh.test(t[e+1]))return!0;return!1}function Nh(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 Ph(e,t){if(t<2)return!1;let n=e.trim();return n.startsWith(`|`)?Nh(n).length===t:!1}function Fh(e){let t=e.split(/\r?\n/),n=[],r=[],i=()=>{r.length!==0&&(n.push({type:`text`,content:r.join(`
2922
+ `)}),r.length=0)},a=0;for(;a<t.length;){let e=t[a],o=t[a+1];if(o!==void 0&&Oh.test(e)&&kh.test(o)){let r=Nh(e),o=[];i();let s=a+2;for(;s<t.length&&Ph(t[s],r.length);)o.push(Nh(t[s])),s+=1;n.push({type:`table`,headers:r,rows:o}),a=s;continue}r.push(e),a+=1}return i(),n}function Ih(e){let t=jh(e);return!t||!Mh(t)?[e]:Fh(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 Lh(e){if(typeof e==`string`)return Ah.test(e);if(Array.isArray(e))return e.some(e=>Lh(e));if(!Eh(e))return!1;let t=[`client`,`clientInfo`,`host`,`source`,`mode`,`name`,`title`,`channel`];return Object.entries(e).some(([e,n])=>t.includes(e)?Lh(n):!1)}function Rh(e,t){return{preferBrowser:[t,e._meta,Eh(e.metadata)?e.metadata.source:void 0].some(e=>Lh(e))}}const zh={id:`__dismiss`,type:`button`,label:`Done`,variant:`default`};function Bh(e){if((e.actions?.length??0)>0||!e.template)return e;let t=zp(e);return t?.supportedTransports.includes(`browser`)===!0&&!t.supportedTransports.includes(`mcp-app`)?{...e,actions:[zh]}:e}function Vh(e){if(!e.template)return!0;let t=lp(e.template);return t?t.supportedTransports.includes(`browser`):zp(e)?.supportedTransports.includes(`browser`)??!1}function Hh(e,t,n={}){let r=n.includeSurfaceHeader??!0,i=r?[e.title]:[];return r&&e.description&&i.push(e.description),xr(t)?i.push(``,`Selected action: ${t.result.actionId}`):br(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(`
2923
+ `)}const Uh=`<style>
2915
2924
  .toolbar, .badge, .aikit-header, .aikit-footer { display: none !important; }
2916
2925
  body { padding-top: 0 !important; margin-top: 0 !important; }
2917
- </style>`,Ph=`<script>
2926
+ </style>`,Wh=`<script>
2918
2927
  window.addEventListener('message', function(e) {
2919
2928
  // Accept from any origin — theme change is cosmetic-only.
2920
2929
  // Strict origin check breaks in MCP host custom protocols (ui://, vscode-webview://)
@@ -2926,7 +2935,7 @@ window.addEventListener('message', function(e) {
2926
2935
  }
2927
2936
  }
2928
2937
  });
2929
- <\/script>`;function Fh(e){return`<script nonce="${e}">
2938
+ <\/script>`;function Gh(e){return`<script nonce="${e}">
2930
2939
  (function() {
2931
2940
  var iframe = document.querySelector('.present-viewer-iframe');
2932
2941
  if (!iframe) return;
@@ -2945,7 +2954,7 @@ window.addEventListener('message', function(e) {
2945
2954
  iframe.addEventListener('load', sendTheme);
2946
2955
  trySend();
2947
2956
  })();
2948
- <\/script>`}function Ih(e){let t=e.replace(`</head>`,`${Nh}\n</head>`);t===e&&ih.warn(`injectEmbeddedViewerRuntime: </head> not found — viewer style not injected`);let n=t.replace(`</body>`,`<script>
2957
+ <\/script>`}function Kh(e){let t=e.replace(`</head>`,`${Uh}\n</head>`);t===e&&mh.warn(`injectEmbeddedViewerRuntime: </head> not found — viewer style not injected`);let n=t.replace(`</body>`,`<script>
2949
2958
  (function() {
2950
2959
  function report() {
2951
2960
  var h = document.documentElement.scrollHeight;
@@ -2955,7 +2964,7 @@ window.addEventListener('message', function(e) {
2955
2964
  ro.observe(document.documentElement);
2956
2965
  report();
2957
2966
  })();
2958
- <\/script>\n${Ph}\n</body>`);return n===t&&ih.warn(`injectEmbeddedViewerRuntime: </body> not found — runtime scripts not injected`),n}function Lh(e){let t=`<script>
2967
+ <\/script>\n${Wh}\n</body>`);return n===t&&mh.warn(`injectEmbeddedViewerRuntime: </body> not found — runtime scripts not injected`),n}function qh(e){let t=`<script>
2959
2968
  (function(){
2960
2969
  var last=0;
2961
2970
  function notify(){
@@ -2966,7 +2975,7 @@ window.addEventListener('message', function(e) {
2966
2975
  if(typeof ResizeObserver!=="undefined"){new ResizeObserver(notify).observe(document.documentElement)}
2967
2976
  else{setInterval(notify,500)}
2968
2977
  })();
2969
- <\/script>`;return e.includes(`</body>`)?e.replace(`</body>`,`${t}</body>`):`${e}${t}`}let Rh=``;function zh(e){return`<script${e?` nonce="${X(e)}"`:``}>
2978
+ <\/script>`;return e.includes(`</body>`)?e.replace(`</body>`,`${t}</body>`):`${e}${t}`}let Jh=``;function Yh(e){return`<script${e?` nonce="${X(e)}"`:``}>
2970
2979
  (function(){
2971
2980
  var readyState = document.readyState;
2972
2981
  var boot = function() {
@@ -2979,56 +2988,56 @@ window.addEventListener('message', function(e) {
2979
2988
  boot();
2980
2989
  }
2981
2990
  })();
2982
- <\/script>`}function Bh(e){Rh=e||``}function Vh(e,t){if(!Rh)return e;let n=`${`<script${t?` nonce="${X(t)}"`:``}>${Rh}<\/script>`}\n${zh(t||``)}`;return e.includes(`</body>`)?e.replace(`</body>`,`${n}\n</body>`):`${e}${n}`}function Hh(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 — ${X(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">${X(e)}</h1>`,` <p class="error-message">${X(t)}</p>`,`</div>`,`</body></html>`].join(`
2983
- `)}function Uh(e,t,n,r){return dh(Hh(r??`Present`,t)),{content:[{type:`text`,text:`[ERROR:VALIDATION] ${t}`}],isError:!0}}function Wh(e,t){if(!gh(e)||!(`schemaVersion`in e))return{ok:!1,response:Uh(`INVALID_CHANNEL_SURFACE`,`present expects a ChannelSurface object with schemaVersion: 1`)};if(e.schemaVersion!==1)return{ok:!1,response:Uh(`UNSUPPORTED_SCHEMA_VERSION`,`Unsupported ChannelSurface schemaVersion: ${String(e.schemaVersion)}`)};if(typeof e.title==`string`&&_h.test(e.title))return{ok:!1,response:Uh(`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(!gh(e)||e.type!==`markdown`)return[e];let t=xh(e);return!t||!Sh(t)?[e]:Eh(e)})}:e;return{ok:!0,surface:n,options:Oh(n,t)}}function Gh(e){return(e.actions?.length??0)>0||e.response?.required===!0?hh.getAll().some(e=>e.id===`browser`):!1}async function Kh(e,t={}){let n=Gh(e)?{...t,preferBrowser:!0}:t,r=Ah(e),i=hh.select(r,n),a;if(a=i?await i.render(r,n):Xm(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&&!Jf(e)&&t.add(e)}if(t.size>0){let e=[...t].map(e=>`"${e}"`).join(`, `);ih.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){ih.warn(`Block type validation failed`,A(e))}if(t.compact){let{structuredContent:e,...t}=a;return t}return a}function Q(e,t=``){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):t}function qh(e){return{type:`kv`,value:e}}function Jh(e){if(Array.isArray(e))return e}const Yh=[{name:`summary`,description:`Title + markdown summary + optional metrics (pass/fail counts)`,expand(e){let t=Q(e.title,`Summary`),n=[{type:`heading`,value:t}],r=Q(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=Q(e.title,`Plan`),n=[{type:`heading`,value:t}],r=Jh(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=Q(e.title,`Understanding`),n=[{type:`heading`,value:t}],r=Q(e.explanation);return r&&n.push({type:`markdown`,value:r}),e.details&&typeof e.details==`object`&&!Array.isArray(e.details)&&n.push(qh(e.details)),{title:t,blocks:n}}},{name:`bug-analyze`,description:`Title + heading + severity/status kv + code block + markdown`,expand(e){let t=Q(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=Q(e.code);i&&n.push({type:`code`,value:i});let a=Q(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=Q(e.title,`Task Complete`),n=[{type:`heading`,value:t}],r=Jh(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=Q(e.title,`Review`),n=[{type:`heading`,value:t}],r=Jh(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=Q(e.title,`Exploration`),n=[{type:`heading`,value:t}],r=Jh(e.findings);if(r)for(let e of r)n.push({type:`heading`,value:Q(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=Q(e.title,`Decision`),n=[{type:`heading`,value:t}];e.recommendation&&n.push({type:`kv`,value:{Recommendation:e.recommendation}});let r=Jh(e.options);return r&&r.length>0&&n.push({type:`comparison`,value:r.map(e=>({title:Q(e.title,`Option`),items:Array.isArray(e.items)?e.items:[]}))}),{title:t,blocks:n}}}],Xh=new Map;for(let e of Yh)Xh.set(e.name,e);function Zh(e,t){let n=Xh.get(e);return n?n.expand(t):null}function Qh(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===`
2984
- `||i===`\r`)){t.push(`\\n`);continue}t.push(i)}return t.join(``)}function $h(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===`
2985
- `||n===` `||n===`\r`||n===``)){n===`,`&&(t[e]=``);break}}t.push(i)}return t.join(``)}function eg(e){try{return JSON.parse(e)}catch{}let t=$h(Qh(e));try{return JSON.parse(t)}catch(e){try{return JSON.parse(t.replaceAll(`'`,`"`))}catch{throw e}}}const tg={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`},ng=/^(#{1,6})\s/,rg=/^(`{3,}|~{3,})/,ig=/^\|.+\|.+\|/m;function ag(e){let t=e.trim(),n=t.match(ng);if(n)return{type:`heading`,value:t.slice(n[0].length)};if(rg.test(t)){let e=t.indexOf(`
2986
- `),n=t.lastIndexOf(t[0]);return{type:`code`,value:e>=0?t.slice(e+1,n).trimEnd():t}}return ig.test(t)?{type:`table`,value:t}:{type:`markdown`,value:t}}function og(e,t){let n=tg[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 sg(e){if(typeof e==`string`){let t=ag(e);return{type:t.type,value:t.value}}if(Array.isArray(e)){let[t,n]=e;if(typeof t==`string`){let e=og(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 cg(e){return{title:e.title??``,blocks:Array.isArray(e.blocks)?e.blocks.map(sg):[]}}function lg(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ug(e){return lg(e)&&typeof e.schemaVersion==`number`&&e.schemaVersion===1}function dg(e){return lg(e)&&typeof e.schemaVersion==`number`&&e.schemaVersion!==1}function fg(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 pg(e){try{let t=eg(e);return lg(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(!lg(n))return{ok:!1,error:{code:`INVALID_PRESET_INPUT`,reason:`Preset data must be an object`}};let r=Zh(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(dg(e))return{ok:!1,error:{code:`UNSUPPORTED_SCHEMA_VERSION`,reason:`Unsupported schemaVersion: ${String(e.schemaVersion)}`,hint:`Use schemaVersion: 1`}};if(lg(e)&&typeof e.raw==`string`)return pg(e.raw);if(ug(e))return fg(e);if(typeof e==`string`){let t=cg({blocks:[e]});return{ok:!0,surface:{schemaVersion:1,title:t.title||`Present`,blocks:t.blocks}}}if(lg(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=cg(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 hg=I.object({label:I.string(),value:I.string(),description:I.string().optional()}),gg=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(hg).optional(),schema:I.record(I.string(),I.unknown()).optional()}),_g=I.object({type:I.string(),title:I.string().optional(),value:I.unknown().optional(),language:I.string().optional()}).catchall(I.unknown()),vg={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(_g).optional().describe(`Typed block content for the surface.`),data:I.unknown().optional().describe(`Template data payload, if the template expands data.`),actions:I.array(gg).optional().describe(`Interactive actions. Presence triggers browser transport.`),response:I.object({timeout:I.number().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 yg(e){let t=e.server?.getClientCapabilities?.();if(!t)return`unknown`;let n=sr(t);return!n||Array.isArray(n.mimeTypes)&&n.mimeTypes.length>0&&!n.mimeTypes.includes(or)?`unsupported`:`supported`}const bg=[{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 xg(e,t){let n=W(`present`);try{let e=g(`present`);e&&Bh(M(P(e,`dist`,`annotation-layer.js`),`utf8`))}catch{}lr(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:vg,annotations:n.annotations,_meta:Km(rh)},Y(`present`,async(t,n)=>{let r=t,i=typeof r.preferBrowser==`boolean`?r.preferBrowser:void 0,a=mg(t);if(!a.ok)return Uh(a.error.code,a.error.reason,void 0,`Present`);let o=Wh(a.surface,n);if(!o.ok)return o.response;let s=yg(e),c=!(i===!1&&s===`supported`);return await Kh(o.surface,{...o.options,preferBrowser:c})}));try{let t=new Kn(rh,{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?ph(r):void 0;return{contents:[{uri:e.href,mimeType:or,_meta:qm(),text:i??uh()??`<html><body><p>No content generated yet. Call the present tool first.</p></body></html>`}]}})}catch{}function r(){try{let e=g(`present`);if(e)return M(P(e,`dist`,`index.html`),`utf8`)}catch{}return uh()||`<html><body><p>Loading...</p></body></html>`}try{e.registerResource(`Present App`,nh,{description:`AI Kit present app - entry point`},async()=>({contents:[{uri:nh,mimeType:or,_meta:qm(),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=tp().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(bg,null,2)}]}))}catch{}}const Sg=O(`tools`);function Cg(e,t){let n=new Xn({structure:new Qn,dependencies:new qn,symbols:new $n,patterns:new Zn,entryPoints:new Yn,diagrams:new Jn}),r=W(`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},Y(`produce_knowledge`,async({scope:e,aspects:t},r)=>{let i;try{i=vc(r).createTask(`Produce Knowledge`,3),i.progress(0,`Running analyzers`);let a=e??`.`;Sg.info(`Running knowledge production`,{rootPath:a,aspects:t});let o=await n.runExtraction(a,t);try{let e=N(vn(P(a)),fe.onboard);De(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`&&Ne(N(e,`${n}.md`),t+r,`utf-8`);Sg.info(`Knowledge persisted to .ai/context/`,{files:Object.keys(o).length})}catch(e){Sg.warn(`Failed to persist knowledge to .ai/context/`,{error:A(e)})}i.progress(1,`Synthesizing results`);let s=n.buildSynthesisInstructions(o,t);return i.complete(`Knowledge production complete`),{content:[{type:`text`,text:s+`
2991
+ <\/script>`}function Xh(e){Jh=e||``}function Zh(e,t){if(!Jh)return e;let n=`${`<script${t?` nonce="${X(t)}"`:``}>${Jh}<\/script>`}\n${Yh(t||``)}`;return e.includes(`</body>`)?e.replace(`</body>`,`${n}\n</body>`):`${e}${n}`}function Qh(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 — ${X(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">${X(e)}</h1>`,` <p class="error-message">${X(t)}</p>`,`</div>`,`</body></html>`].join(`
2992
+ `)}function $h(e,t,n,r){return xh(Qh(r??`Present`,t)),{content:[{type:`text`,text:`[ERROR:VALIDATION] ${t}`}],isError:!0}}function eg(e,t){if(!Eh(e)||!(`schemaVersion`in e))return{ok:!1,response:$h(`INVALID_CHANNEL_SURFACE`,`present expects a ChannelSurface object with schemaVersion: 1`)};if(e.schemaVersion!==1)return{ok:!1,response:$h(`UNSUPPORTED_SCHEMA_VERSION`,`Unsupported ChannelSurface schemaVersion: ${String(e.schemaVersion)}`)};if(typeof e.title==`string`&&Dh.test(e.title))return{ok:!1,response:$h(`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(!Eh(e)||e.type!==`markdown`)return[e];let t=jh(e);return!t||!Mh(t)?[e]:Ih(e)})}:e;return{ok:!0,surface:n,options:Rh(n,t)}}function tg(e){return(e.actions?.length??0)>0||e.response?.required===!0?Th.getAll().some(e=>e.id===`browser`):!1}async function ng(e,t={}){let n=tg(e)?{...t,preferBrowser:!0}:t,r=Bh(e),i=Th.select(r,n),a;if(a=i?await i.render(r,n):oh(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&&!ip(e)&&t.add(e)}if(t.size>0){let e=[...t].map(e=>`"${e}"`).join(`, `);mh.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){mh.warn(`Block type validation failed`,j(e))}if(t.compact){let{structuredContent:e,...t}=a;return t}return a}function Q(e,t=``){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):t}function rg(e){return{type:`kv`,value:e}}function ig(e){if(Array.isArray(e))return e}const ag=[{name:`summary`,description:`Title + markdown summary + optional metrics (pass/fail counts)`,expand(e){let t=Q(e.title,`Summary`),n=[{type:`heading`,value:t}],r=Q(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=Q(e.title,`Plan`),n=[{type:`heading`,value:t}],r=ig(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=Q(e.title,`Understanding`),n=[{type:`heading`,value:t}],r=Q(e.explanation);return r&&n.push({type:`markdown`,value:r}),e.details&&typeof e.details==`object`&&!Array.isArray(e.details)&&n.push(rg(e.details)),{title:t,blocks:n}}},{name:`bug-analyze`,description:`Title + heading + severity/status kv + code block + markdown`,expand(e){let t=Q(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=Q(e.code);i&&n.push({type:`code`,value:i});let a=Q(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=Q(e.title,`Task Complete`),n=[{type:`heading`,value:t}],r=ig(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=Q(e.title,`Review`),n=[{type:`heading`,value:t}],r=ig(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=Q(e.title,`Exploration`),n=[{type:`heading`,value:t}],r=ig(e.findings);if(r)for(let e of r)n.push({type:`heading`,value:Q(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=Q(e.title,`Decision`),n=[{type:`heading`,value:t}];e.recommendation&&n.push({type:`kv`,value:{Recommendation:e.recommendation}});let r=ig(e.options);return r&&r.length>0&&n.push({type:`comparison`,value:r.map(e=>({title:Q(e.title,`Option`),items:Array.isArray(e.items)?e.items:[]}))}),{title:t,blocks:n}}}],og=new Map;for(let e of ag)og.set(e.name,e);function sg(e,t){let n=og.get(e);return n?n.expand(t):null}function cg(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===`
2993
+ `||i===`\r`)){t.push(`\\n`);continue}t.push(i)}return t.join(``)}function lg(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===`
2994
+ `||n===` `||n===`\r`||n===``)){n===`,`&&(t[e]=``);break}}t.push(i)}return t.join(``)}function ug(e){try{return JSON.parse(e)}catch{}let t=lg(cg(e));try{return JSON.parse(t)}catch(e){try{return JSON.parse(t.replaceAll(`'`,`"`))}catch{throw e}}}const dg={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`},fg=/^(#{1,6})\s/,pg=/^(`{3,}|~{3,})/,mg=/^\|.+\|.+\|/m;function hg(e){let t=e.trim(),n=t.match(fg);if(n)return{type:`heading`,value:t.slice(n[0].length)};if(pg.test(t)){let e=t.indexOf(`
2995
+ `),n=t.lastIndexOf(t[0]);return{type:`code`,value:e>=0?t.slice(e+1,n).trimEnd():t}}return mg.test(t)?{type:`table`,value:t}:{type:`markdown`,value:t}}function gg(e,t){let n=dg[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 _g(e){if(typeof e==`string`){let t=hg(e);return{type:t.type,value:t.value}}if(Array.isArray(e)){let[t,n]=e;if(typeof t==`string`){let e=gg(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 vg(e){return{title:e.title??``,blocks:Array.isArray(e.blocks)?e.blocks.map(_g):[]}}function yg(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function bg(e){return yg(e)&&typeof e.schemaVersion==`number`&&e.schemaVersion===1}function xg(e){return yg(e)&&typeof e.schemaVersion==`number`&&e.schemaVersion!==1}function Sg(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 Cg(e){try{let t=ug(e);return yg(t)?(t.schemaVersion===void 0&&(t.schemaVersion=1),wg(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 wg(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(!yg(n))return{ok:!1,error:{code:`INVALID_PRESET_INPUT`,reason:`Preset data must be an object`}};let r=sg(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(xg(e))return{ok:!1,error:{code:`UNSUPPORTED_SCHEMA_VERSION`,reason:`Unsupported schemaVersion: ${String(e.schemaVersion)}`,hint:`Use schemaVersion: 1`}};if(yg(e)&&typeof e.raw==`string`)return Cg(e.raw);if(bg(e))return Sg(e);if(typeof e==`string`){let t=vg({blocks:[e]});return{ok:!0,surface:{schemaVersion:1,title:t.title||`Present`,blocks:t.blocks}}}if(yg(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=vg(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 Tg=L.object({label:L.string(),value:L.string(),description:L.string().optional()}),Eg=L.object({id:L.string().describe(`Unique action identifier`),type:L.enum([`button`,`select`,`multi-select`,`form-submit`,`text-submit`,`confirm`,`custom`]).describe(`Interactive action type`),label:L.string().describe(`Visible action label`),variant:L.enum([`primary`,`danger`,`default`]).optional(),options:L.array(Tg).optional(),schema:L.record(L.string(),L.unknown()).optional()}),Dg=L.object({type:L.string(),title:L.string().optional(),value:L.unknown().optional(),language:L.string().optional()}).catchall(L.unknown()),Og={schemaVersion:L.literal(1).describe(`ChannelSurface schema version. Must be 1.`),title:L.string().describe(`Surface title shown to the user.`),description:L.string().optional().describe(`Optional supporting copy for the surface.`),template:L.string().optional().describe(`Optional template id such as report@1.`),layout:L.object({maxWidth:L.string().optional(),padding:L.string().optional(),columns:L.number().optional()}).optional(),blocks:L.array(Dg).optional().describe(`Typed block content for the surface.`),data:L.unknown().optional().describe(`Template data payload, if the template expands data.`),actions:L.array(Eg).optional().describe(`Interactive actions. Presence triggers browser transport.`),response:L.object({timeout:L.number().optional(),required:L.boolean().optional()}).optional(),metadata:L.object({surfaceId:L.string().optional(),createdAt:L.string().optional(),source:L.string().optional()}).optional(),colorScheme:L.enum([`light`,`dark`,`auto`]).optional(),lang:L.string().optional(),dir:L.enum([`ltr`,`rtl`,`auto`]).optional(),raw:L.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:L.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).`)};L.object({surfaceId:L.string(),actionId:L.string(),actionType:L.enum([`button`,`select`,`multi-select`,`form-submit`,`text-submit`,`confirm`,`custom`]),value:L.unknown().optional(),formData:L.record(L.string(),L.unknown()).optional(),selection:L.union([L.string(),L.array(L.string())]).optional(),label:L.string().optional(),timestamp:L.string(),sourceTransport:L.enum([`mcp-app`,`browser`,`export`])});function kg(e){let t=e.server?.getClientCapabilities?.();if(!t)return`unknown`;let n=sr(t);return!n||Array.isArray(n.mimeTypes)&&n.mimeTypes.length>0&&!n.mimeTypes.includes(or)?`unsupported`:`supported`}const Ag=[{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 jg(e,t){let n=W(`present`);try{let e=g(`present`);e&&Xh(N(F(e,`dist`,`annotation-layer.js`),`utf8`))}catch{}lr(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:Og,annotations:n.annotations,_meta:nh(ph)},Y(`present`,async(t,n)=>{let r=t,i=typeof r.preferBrowser==`boolean`?r.preferBrowser:void 0,a=wg(t);if(!a.ok)return $h(a.error.code,a.error.reason,void 0,`Present`);let o=eg(a.surface,n);if(!o.ok)return o.response;let s=kg(e),c=!(i===!1&&s===`supported`);return await ng(o.surface,{...o.options,preferBrowser:c})}));try{let t=new Gn(ph,{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?Ch(r):void 0;return{contents:[{uri:e.href,mimeType:or,_meta:rh(),text:i??bh()??`<html><body><p>No content generated yet. Call the present tool first.</p></body></html>`}]}})}catch{}function r(){try{let e=g(`present`);if(e)return N(F(e,`dist`,`index.html`),`utf8`)}catch{}return bh()||`<html><body><p>Loading...</p></body></html>`}try{e.registerResource(`Present App`,fh,{description:`AI Kit present app - entry point`},async()=>({contents:[{uri:fh,mimeType:or,_meta:rh(),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=dp().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(Ag,null,2)}]}))}catch{}}const Mg=k(`tools`);function Ng(e,t){let n=new Xn({structure:new Qn,dependencies:new qn,symbols:new $n,patterns:new Zn,entryPoints:new Yn,diagrams:new Jn}),r=W(`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:L.string().optional().describe(`Root path to analyze (defaults to workspace root)`),aspects:L.array(L.enum([`all`,`structure`,`dependencies`,`symbols`,`patterns`,`entry-points`,`diagrams`])).default([`all`]).describe(`Which analysis aspects to run`)},annotations:r.annotations},Y(`produce_knowledge`,async({scope:e,aspects:t},r)=>{let i;try{i=Oc(r).createTask(`Produce Knowledge`,3),i.progress(0,`Running analyzers`);let a=e??`.`;Mg.info(`Running knowledge production`,{rootPath:a,aspects:t});let o=await n.runExtraction(a,t);try{let e=P(_n(F(a)),de.onboard);Ee(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`&&Me(P(e,`${n}.md`),t+r,`utf-8`);Mg.info(`Knowledge persisted to .ai/context/`,{files:Object.keys(o).length})}catch(e){Mg.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+`
2987
2996
 
2988
2997
  ---
2989
- _Next: Review the baselines above and use \`remember\` to store synthesized knowledge entries._`}]}}catch(e){return i?.fail?.(`Production failed`),Sg.error(`Knowledge production failed`,A(e)),J(`INTERNAL`,`Knowledge production failed: ${e instanceof Error?e.message:String(e)}`)}}))}const wg=O(`tools`);function Tg(e,t,n,r,i,a,o){let s=W(`reindex`);e.registerTool(`reindex`,{title:s.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:s.annotations},Y(`reindex`,async({full:e,force:s},c)=>{try{if(t.isIndexing)return{content:[{type:`text`,text:`## Reindex Already in Progress
2998
+ _Next: Review the baselines above and use \`remember\` to store synthesized knowledge entries._`}]}}catch(e){return i?.fail?.(`Production failed`),Mg.error(`Knowledge production failed`,j(e)),J(`INTERNAL`,`Knowledge production failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Pg=k(`tools`);function Fg(e,t,n,r,i,a,o,s){let c=W(`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:L.boolean().default(!1).describe(`If true, force full re-index ignoring file hashes`),force:L.boolean().default(!1).describe(`If true, override smart indexing guard and run reindex anyway`)},annotations:c.annotations},Y(`reindex`,async({full:e,force:c},l)=>{try{if(t.isIndexing)return{content:[{type:`text`,text:`## Reindex Already in Progress
2990
2999
 
2991
- 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`&&!s)return{content:[{type:`text`,text:`## Smart Indexing Active
3000
+ 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
2992
3001
 
2993
3002
  Smart indexing (trickle mode) is enabled — files are automatically indexed as they are accessed by tools. Manual reindex is not needed.
2994
3003
 
2995
3004
  **If the index is severely outdated**, use \`reindex({ force: true })\` to override.
2996
3005
 
2997
- Use \`status({})\` to check smart indexing queue status.`}]};let l=vc(c).createTask(`Reindex`,1);l.progress(0,`Starting ${e?`full`:`incremental`} reindex`),wg.info(`Starting background re-index`,{mode:e?`full`:`incremental`});let u=e=>t=>{t.phase===`chunking`&&t.currentFile&&wg.debug(`Re-index progress`,{prefix:e,current:t.filesProcessed+1,total:t.filesTotal,file:t.currentFile})};return(e?t.reindexAll(n,u(`Reindex`)):t.index(n,u(`Index`))).then(async e=>{if(wg.info(`Background re-index complete`,{filesProcessed:e.filesProcessed,chunksCreated:e.chunksCreated,durationMs:e.durationMs}),l.complete(`Reindex complete: ${e.filesProcessed} files, ${e.chunksCreated} chunks in ${e.durationMs}ms`),i)try{await i.createFtsIndex(),wg.info(`FTS index rebuilt after reindex`)}catch(e){wg.warn(`FTS index rebuild failed`,A(e))}try{let e=await r.reindexAll();wg.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){wg.warn(`Curated re-index failed`,A(e))}if(a)try{await a.notifyAfterReindex()}catch(e){wg.warn(`Post-reindex resource notification failed`,A(e))}}).catch(e=>{l.fail(`Reindex failed: ${e instanceof Error?e.message:String(e)}`),wg.error(`Background reindex failed`,A(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 wg.error(`Reindex failed`,A(e)),J(`INTERNAL`,`Reindex failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Eg=O(`tools`);function Dg(e){let t=W(`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)`)},annotations:t.annotations},Y(`replay`,async({action:e,last:t,tool:n,source:r,since:i})=>{try{if(e===`clear`)return pn(),{content:[{type:`text`,text:`Replay log cleared.`}]};let a=mn({last:t,tool:n,source:r,since:i});if(a.length===0)return{content:[{type:`text`,text:`No replay entries found. Activity is logged when tools are invoked via MCP or CLI.`}]};let o=a.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 hn().catch(()=>{}),{content:[{type:`text`,text:`**Replay Log** (${a.length} entries)\n\n${o.join(`
3006
+ Use \`status({})\` to check smart indexing queue status.`}]};let u=Oc(l).createTask(`Reindex`,1);u.progress(0,`Starting ${e?`full`:`incremental`} reindex`),Pg.info(`Starting background re-index`,{mode:e?`full`:`incremental`});let d=e=>t=>{t.phase===`chunking`&&t.currentFile&&Pg.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(Pg.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(),Pg.info(`FTS index rebuilt after reindex`)}catch(e){Pg.warn(`FTS index rebuild failed`,j(e))}try{let e=await r.reindexAll();Pg.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){Pg.warn(`Curated re-index failed`,j(e))}if(a)try{await a.notifyAfterReindex()}catch(e){Pg.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}),Pg.info(`reindex:done event emitted`)}catch(e){Pg.warn(`Failed to emit reindex:done event`,j(e))}}).catch(e=>{u.fail(`Reindex failed: ${e instanceof Error?e.message:String(e)}`),Pg.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 Pg.error(`Reindex failed`,j(e)),J(`INTERNAL`,`Reindex failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Ig=k(`tools`);function Lg(e){let t=W(`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:L.enum([`list`,`clear`]).default(`list`).describe(`Action: "list" (default) to view entries, "clear" to wipe the log`),last:L.number().optional().describe(`Number of entries to return (default: 20, list only)`),tool:L.string().optional().describe(`Filter by tool name (list only)`),source:L.enum([`mcp`,`cli`]).optional().describe(`Filter by source: "mcp" or "cli" (list only)`),since:L.string().optional().describe(`ISO timestamp — only show entries after this time (list only)`),max_tokens:L.number().optional().describe(`Approximate token limit for output. Entries are condensed to fit.`)},annotations:t.annotations},Y(`replay`,async({action:e,last:t,tool:n,source:r,since:i,max_tokens:a})=>{try{if(e===`clear`)return fn(),{content:[{type:`text`,text:`Replay log cleared.`}]};let o=pn({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 mn().catch(()=>{}),{content:[{type:`text`,text:`**Replay Log** (${o.length} entries)\n\n${s.join(`
2998
3007
 
2999
- `)}`}]}}catch(e){return Eg.error(`Replay failed`,A(e)),J(`INTERNAL`,`Replay failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Og=O(`tools`);function kg(e){let t=W(`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=Ut().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(`
3000
- `)}`}]}}if(!t)throw Error(`id is required for restore action`);let r=await yn(t);return{content:[{type:`text`,text:`Restored ${r.length} files:\n${r.map(e=>`- \`${e}\``).join(`
3001
- `)}`}]}}catch(e){return Og.error(`Restore failed`,A(e)),J(`INTERNAL`,`Restore failed: ${e instanceof Error?e.message:String(e)}`)}})}const Ag=/<\/?curated-context>/gi;function jg(e){return e.replace(Ag,``)}function Mg(e){return`<curated-context>\n${jg(e)}\n</curated-context>`}const Ng=O(`tools`);function Pg(e,t,n,r){p(e,t,n);let i=e.memoryMetaGet(t);if(!i)return;let o=c(i,{...a,...r});o&&(D(e,t,o),d(e,t,n))}function Fg(e,t){let n=[],r=we(),i=r?Pe(r):``;i&&n.push(`[project: ${i}]`);let a=t?On(t,`__context_boost`):void 0;return a&&n.push(`[focus: ${a.value}]`),n.length===0?e:`${n.join(` `)} ${e}`}function Ig(e,t,n){return n?e:t===`curated`?e*1.2:e}function Lg(e,t){return t?e:e.map(e=>({record:e.record,score:Ig(e.score,e.record.origin,t)})).sort((e,t)=>t.score-e.score)}function Rg(e,t){let n=e?Math.floor(e/Math.max(1,t)):96;return Math.max(40,Math.min(160,n))}function zg(e,t){let n=e.origin===`curated`?Mg(e.content):e.content,r=F(n,t);return{body:r,truncated:r!==n}}async function Bg(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:ar(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 Ng.warn(`ER fallback failed`,A(e)),{results:n,triggered:!0,cacheHit:a}}}function Vg(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 Hg(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 Ug(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 Wg(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&&!Gg.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 Gg=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 Kg(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 Ue(e)).mtimeMs>r&&o++}catch{o++}if(o>0){let e=i-r,t=Math.floor(e/6e4),n=t<1?`<1 min`:`${t} min`;return`> ⚠️ **Index may be stale** — ${o} file(s) modified since last index (${n} ago). Use \`reindex\` to refresh.`}}catch{}}function qg(e,t,n,r,i,a,o,s,c,l,u){let d=W(`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:Ss,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(pe).optional().describe(`Filter by content type`),source_type:I.enum(_e).optional().describe(`Coarse filter: "source" (code only), "documentation" (md, curated), "test", "config". Overrides content_type if both set.`),origin:I.enum(ge).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,D=!1,te=``,ne=f!==`keyword`,re=Fg(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 Bg(i,E[0]?.score??0,E,e,d);E=a.results,ee=a.triggered,D=a.cacheHit}catch(t){ne=!1,Ng.warn(`Embedder unavailable in semantic mode, falling back to FTS`,A(t)),E=await n.ftsSearch(e,{...T,limit:d}),te=`> _⚠️ Semantic search unavailable (embedder recovering). Showing keyword results instead._
3008
+ `)}`}]}}catch(e){return Ig.error(`Replay failed`,j(e)),J(`INTERNAL`,`Replay failed: ${e instanceof Error?e.message:String(e)}`)}}))}const Rg=k(`tools`);function zg(e){let t=W(`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:L.enum([`list`,`restore`]).describe(`list: show restore points, restore: apply a restore point`),id:L.string().optional().describe(`Restore point ID (required for action=restore)`),limit:L.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=Ht().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(`
3009
+ `)}`}]}}if(!t)throw Error(`id is required for restore action`);let r=await vn(t);return{content:[{type:`text`,text:`Restored ${r.length} files:\n${r.map(e=>`- \`${e}\``).join(`
3010
+ `)}`}]}}catch(e){return Rg.error(`Restore failed`,j(e)),J(`INTERNAL`,`Restore failed: ${e instanceof Error?e.message:String(e)}`)}})}const Bg=/<\/?curated-context>/gi;function Vg(e){return e.replace(Bg,``)}function Hg(e){return`<curated-context>\n${Vg(e)}\n</curated-context>`}const Ug=k(`tools`);function Wg(e,t,n,r){p(e,t,n);let i=e.memoryMetaGet(t);if(!i)return;let o=c(i,{...a,...r});o&&(O(e,t,o),d(e,t,n))}function Gg(e,t){let n=[],r=Ce(),i=r?Ne(r):``;i&&n.push(`[project: ${i}]`);let a=t?Dn(t,`__context_boost`):void 0;return a&&n.push(`[focus: ${a.value}]`),n.length===0?e:`${n.join(` `)} ${e}`}function Kg(e,t,n){return n?e:t===`curated`?e*1.2:e}function qg(e,t){return t?e:e.map(e=>({record:e.record,score:Kg(e.score,e.record.origin,t)})).sort((e,t)=>t.score-e.score)}function Jg(e,t){let n=e?Math.floor(e/Math.max(1,t)):96;return Math.max(40,Math.min(160,n))}function Yg(e,t){let n=e.origin===`curated`?Hg(e.content):e.content,r=I(n,t);return{body:r,truncated:r!==n}}async function Xg(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:ar(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 Ug.warn(`ER fallback failed`,j(e)),{results:n,triggered:!0,cacheHit:a}}}function Zg(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 Qg(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 $g(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 e_(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&&!t_.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 t_=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 n_(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 He(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 He(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 r_(e,t,n,r,i,a,o,s,c,l,u){let d=W(`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:Ts,inputSchema:{query:L.string().max(5e3).describe(`Natural language search query`),limit:L.number().min(1).max(20).default(5).describe(`Maximum results to return`),search_mode:L.enum([`hybrid`,`semantic`,`keyword`]).default(`hybrid`).describe(`Search strategy: hybrid (vector + FTS + RRF fusion, default), semantic (vector only), keyword (FTS only)`),content_type:L.enum(fe).optional().describe(`Filter by content type`),source_type:L.enum(ge).optional().describe(`Coarse filter: "source" (code only), "documentation" (md, curated), "test", "config". Overrides content_type if both set.`),origin:L.enum(he).optional().describe(`Filter by knowledge origin`),category:L.string().optional().describe(`Filter by category (e.g., decisions, patterns, conventions)`),tags:L.array(L.string()).optional().describe(`Filter by exact tag membership (any supplied tag may match)`),min_score:L.number().min(0).max(1).default(.25).describe(`Minimum similarity score`),graph_hops:L.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:L.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),min_confidence:L.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:L.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:L.array(L.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,D=!1,O=!1,ee=``,te=f!==`keyword`,ne=Gg(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(ne);E=await n.search(r,T);let a=await Xg(i,E[0]?.score??0,E,e,d);E=a.results,D=a.triggered,O=a.cacheHit}catch(t){te=!1,Ug.warn(`Embedder unavailable in semantic mode, falling back to FTS`,j(t)),E=await n.ftsSearch(e,{...T,limit:d}),ee=`> _⚠️ Semantic search unavailable (embedder recovering). Showing keyword results instead._
3002
3011
 
3003
- `}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,Ng.warn(`Embedder unavailable, falling back to FTS-only`,A(t)),a=await n.ftsSearch(e,{...T,limit:d*2}),te=`> _⚠️ Vector search unavailable (embedder recovering). Results from keyword search only._
3012
+ `}else{let r=[],a=[];try{let i=await t.embedQuery(ne),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){te=!1,Ug.warn(`Embedder unavailable, falling back to FTS-only`,j(t)),a=await n.ftsSearch(e,{...T,limit:d*2}),ee=`> _⚠️ Vector search unavailable (embedder recovering). Results from keyword search only._
3004
3013
 
3005
- `}if(ne?r.length===0&&a.length>0?(E=a.slice(0,d),te=` (FTS-only: vector index rebuilding)`):E=a.length===0&&r.length>0?r.slice(0,d):Vg(r,a).slice(0,d):E=a.slice(0,d),ne){let t=await Bg(i,r[0]?.score??0,E,e,d);E=t.results,ee=t.triggered,D=t.cacheHit}}E=Lg(E,h).slice(0,d),a&&a.recordSearch(e,ee,D),E.length>1&&(E=Hg(E,e)),E=Ug(E);let ie=``;if(C&&C.length>0){let n=Yc(C,u);if(n.length>0){let{stores:r,closeAll:i}=await Xc(n);try{let i;i=f===`keyword`||!ne?await Qc(r,e,{...T,limit:d}):await Zc(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 ae={extracted:3,inferred:2,ambiguous:1};if(y){let e=ae[y]??0;E=E.filter(t=>(t.record.confidence?ae[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(`
3006
- `)[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,te=`> _Original query "${e}" returned 0 results. Auto-reformulated to "${r}"._\n\n`,Ng.debug(`Smart search fallback succeeded`,{originalQuery:e,altQuery:r,resultCount:i.length}))}}catch(e){Ng.debug(`Smart search fallback failed`,{error:String(e)})}if(E.length===0){let t=ht({text:`No results found for the given query.`,query:e,searchMode:f,limit:d,results:[],durationMs:Date.now()-w}),n=$c(t.summary);return{content:[{type:`text`,text:el(t.summary,n)}],isError:!t.ok,structuredContent:{...t.data??{results:[],totalResults:0,searchMode:f,query:e},ref:n}}}}let oe,se;if(b>0&&!r&&(se="> **Note:** `graph_hops` was set but no graph store is available. Graph augmentation skipped."),b>0&&r)try{let e=await Nt(r,E.map(e=>({recordId:e.record.id,score:e.score,sourcePath:e.record.sourcePath})),{hops:b,maxPerHit:5});oe=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(`
3014
+ `}if(te?r.length===0&&a.length>0?(E=a.slice(0,d),ee=` (FTS-only: vector index rebuilding)`):E=a.length===0&&r.length>0?r.slice(0,d):Zg(r,a).slice(0,d):E=a.slice(0,d),te){let t=await Xg(i,r[0]?.score??0,E,e,d);E=t.results,D=t.triggered,O=t.cacheHit}}E=qg(E,h).slice(0,d),a&&a.recordSearch(e,D,O),E.length>1&&(E=Qg(E,e)),E=$g(E);let re=``;if(C&&C.length>0){let n=al(C,u);if(n.length>0){let{stores:r,closeAll:i}=await ol(n);try{let i;i=f===`keyword`||!te?await cl(r,e,{...T,limit:d}):await sl(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),re=` + ${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 ie={extracted:3,inferred:2,ambiguous:1};if(y){let e=ie[y]??0;E=E.filter(t=>(t.record.confidence?ie[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(`
3015
+ `)[0].slice(0,500);if(r&&r!==e){let i=f===`keyword`||!te?await n.ftsSearch(r,T):await n.search(await t.embedQuery(r),T);i.length>0&&(E=i,ee=`> _Original query "${e}" returned 0 results. Auto-reformulated to "${r}"._\n\n`,Ug.debug(`Smart search fallback succeeded`,{originalQuery:e,altQuery:r,resultCount:i.length}))}}catch(e){Ug.debug(`Smart search fallback failed`,{error:String(e)})}if(E.length===0){let t=mt({text:`No results found for the given query.`,query:e,searchMode:f,limit:d,results:[],durationMs:Date.now()-w}),n=ll(t.summary);return{content:[{type:`text`,text:ul(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 Mt(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(`
3007
3016
  `),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(`
3008
- `),i=[`- **Graph Context** (${b} hop${b>1?`s`:``}):`];e&&i.push(` Entities:\n${e}`),r&&i.push(` Relationships:\n${r}`),oe.set(t.recordId,i.join(`
3009
- `))}}catch(e){Ng.warn(`Graph augmentation failed`,A(e)),se=`> **Note:** Graph augmentation failed. Results shown without graph context.`}let ce=Date.now();for(let e of E)if(e.record.origin===`curated`&&e.record.indexedAt){let t=ce-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=et(E),s)for(let e of E){if(e.record.origin!==`curated`)continue;let t=Ru(e.record.sourcePath);t&&Pg(s,t,c,l)}let le=Rg(x,E.length),ue=!1,de=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,oe?.get(n.id)??null].filter(Boolean).join(`
3010
- `),{body:a,truncated:o}=zg(n,le);return ue||=o,`${r}\n${i}\n\n${a}${o?`\n\n_Full content: use \`lookup\` on \`${n.sourcePath}\`._`:``}`}).join(`
3017
+ `),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(`
3018
+ `))}}catch(e){Ug.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=$e(E),s)for(let e of E){if(e.record.origin!==`curated`)continue;let t=Ju(e.record.sourcePath);t&&Wg(s,t,c,l)}let ce=Jg(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(`
3019
+ `),{body:a,truncated:o}=Yg(n,ce);return le||=o,`${r}\n${i}\n\n${a}${o?`\n\n_Full content: use \`lookup\` on \`${n.sourcePath}\`._`:``}`}).join(`
3011
3020
 
3012
3021
  ---
3013
3022
 
3014
- `),fe=(f===`hybrid`?`hybrid (vector + keyword RRF)`:f===`keyword`?`keyword (FTS)`:`semantic (vector)`)+ie,pe=Wg(E,e),me=pe.length>0?`\n_Distinctive terms: ${pe.map(e=>`\`${e}\``).join(`, `)}_`:``,he=await Kg(n,E),ge=[];if(E.length===0)ge.push("`reindex` — no results found, index may be stale"),ge.push("`find` — try federated search with glob/regex");else{let e=E[0]?.record.sourcePath;e&&ge.push(`\`lookup\` — see all chunks from \`${e}\``),ge.push("`symbol` — resolve a specific symbol from the results"),ge.push("`compact` — compress a result file for focused reading"),ge.push("reuse `ctxc_` ref above to avoid re-querying")}let _e=[se?`${se}\n\n`:``,he?`${he}\n\n`:``,de,`\n\n---\n_Search mode: ${fe} | ${E.length} results_${me}`,`\n_Next: ${ge.join(` | `)}_`],ve=te+_e.join(``),ye=!1;if(x){let e=F(ve,x);ye=e!==ve,ve=e}ye||=ue;let O=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=[se,he].filter(e=>!!e),xe=ht({text:ve,query:e,searchMode:f,limit:d,results:O,durationMs:Date.now()-w,truncated:ye,caveats:be}),k=$c(xe.summary),Se=new Set,Ce=[];for(let e of E){if(e.record.origin!==`curated`||e.record.sourcePath.startsWith(`[`))continue;let t=Ru(e.record.sourcePath);if(!t)continue;let n=Iu(t,e.record.headingPath??t);n&&!Se.has(n.uri)&&(Se.add(n.uri),Ce.push(n))}return{content:[{type:`text`,text:el(xe.summary,k)},...Ce],isError:!xe.ok,structuredContent:{...xe.data??{results:[],totalResults:0,searchMode:f,query:e},ref:k}}}catch(t){Ng.error(`Search failed`,A(t));let n=ht({text:`Search failed: ${t instanceof Error?t.message:String(t)}`,query:e??``,searchMode:f??`hybrid`,limit:d,results:[],durationMs:Date.now()-w}),r=$c(n.summary);return{content:[{type:`text`,text:el(n.summary,r)}],structuredContent:{...n.data??{results:[],totalResults:0,searchMode:f??`hybrid`,query:e??``},ref:r}}}})}const Jg=1e4,Yg={defaultTtlSeconds:300,defaultLeaseTtlMinutes:10,globalEnabled:!1};function Xg(e){return e??Yg}function Zg(e,t){let n=e.trim();if(!n)throw Error(`${t} is required`);return n}function Qg(e,t,n){let r=Zg(e,t);if(r.length>n)throw Error(`${t} exceeds max length of ${n}`);return r}function $g(e,t){if(!Number.isFinite(e)||e<=0)throw Error(`${t} must be greater than 0`);return Math.trunc(e)}function e_(e,t=!1,n){Zg(e,`workspace`);let r=Xg(n);if(!t)return e;if(!r.globalEnabled)throw Error(`Global signal scope is disabled`);return`__global__`}function t_(e,t,n){let r=Xg(n),i=e_(t.workspace,t.global??!1,r),a=Qg(t.key,`key`,500),o=Qg(t.value,`value`,Jg),s=t.agent?Qg(t.agent,`agent`,500):void 0,c=$g(t.ttlSeconds??r.defaultTtlSeconds,`ttlSeconds`);return e.signalPost(i,a,o,s,c)}function n_(e,t,n){let r=Zg(t,`workspace`),i=Qg(n,`key`,500);return e.signalGet(r,i)}function r_(e,t){let n=Zg(t,`workspace`);return e.signalList(n)}function i_(e,t,n){let r=Zg(t,`workspace`),i=n===void 0?void 0:Qg(n,`key`,500);return e.signalClear(r,i)}function a_(e,t,n){let r=Xg(n),i=Qg(t.resource,`resource`,500),a=Qg(t.holder,`holder`,500),o=Zg(t.workspace,`workspace`),s=t.intent?Qg(t.intent,`intent`,Jg):void 0,c=$g(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 o_(e,t,n,r){let i=Zg(t,`workspace`),a=Qg(n,`resource`,500),o=Qg(r,`holder`,500);return e.leaseRelease(a,o,i)}function s_(e,t){let n=Zg(t,`workspace`);return e.leaseList(n)}const c_=O(`tools:session`);function $(e,t){if(e==null)throw Error(`${t} is required`)}function l_(e,t){if(!e||e.length===0)throw Error(`${t} are required`)}const u_={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 d_(e,t,n){let r=W(`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:u_,annotations:r.annotations},Y(`session`,async e=>{try{let r=e.action,[i]=r.split(`.`);switch(i){case`signal`:return f_(t,r,e);case`compliance`:return p_(r,e);case`session`:return await m_(t,n,r,e);case`stash`:return h_(t,r,e);case`checkpoint`:return g_(t,r,e);case`workset`:return __(r,e);case`lane`:return v_(r,e);default:throw Error(`Unknown session action namespace: ${i}`)}}catch(e){return c_.error(`Session operation failed`,A(e)),J(`INTERNAL`,`Session operation failed: ${e instanceof Error?e.message:String(e)}`)}}))}function f_(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=Yg;switch(t){case`signal.post`:{if($(i,`key`),a===void 0)throw Error(`value is required for signal.post`);let t=t_(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=n_(e,e_(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=r_(e,e_(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=i_(e,e_(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=a_(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=o_(e,r,s,c);return{content:[{type:`text`,text:JSON.stringify({released:t},null,2)}],structuredContent:{released:t}}}case`signal.leases`:{let t=s_(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 p_(e,t){switch(e){case`compliance.score`:{let e=t.last_n??50;return{content:[{type:`text`,text:y_(Cn(mn({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 Tn(n,async(e,n,r)=>(await t.createMessage({prompt:e,systemPrompt:n,maxTokens:r})).text,i):wn(n,i)).digest}]}}default:throw Error(`Unknown session action: ${n}`)}}function h_(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=An(e,r,x_(i??``));return{content:[{type:`text`,text:`Stored stash entry "${t.key}" (${t.type}) at ${t.storedAt}.`}]}}case`stash.get`:{$(r,`key`);let t=On(e,r);return{content:[{type:`text`,text:t?JSON.stringify(t):`Stash entry "${r}" not found.`}]}}case`stash.list`:{let t=kn(e);return{content:[{type:`text`,text:t.length===0?`Stash is empty.`:t.map(e=>`- ${e.key} (${e.type}) — ${e.storedAt}`).join(`
3015
- `)}]}}case`stash.delete`:return $(r,`key`),{content:[{type:`text`,text:Dn(e,r)?`Deleted stash entry "${r}".`:`Stash entry "${r}" not found.`}]};case`stash.clear`:{let t=En(e);return{content:[{type:`text`,text:`Cleared ${t} stash entr${t===1?`y`:`ies`}.`}]}}default:throw Error(`Unknown stash action: ${t}`)}}function g_(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:b_(ut(e,r,S_(i),{notes:a}))}]};case`checkpoint.load`:{$(r,`label`);let t=lt(e,r);return{content:[{type:`text`,text:t?b_(t):`Checkpoint "${r}" not found.`}]}}case`checkpoint.list`:{let t=ct(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(`
3016
- `)}]}}case`checkpoint.latest`:{let t=st(e,{label:r});return{content:[{type:`text`,text:t?b_(t):`No checkpoints saved.`}]}}case`checkpoint.diff`:{$(o,`from_id`),$(s,`to_id`);let t=it(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(`
3017
- `)}]}:{content:[{type:`text`,text:`One or both checkpoints not found.`}]}}case`checkpoint.history`:{$(r,`label`);let t=ot(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(`
3018
- `)}`}]}}case`checkpoint.gc`:{let t=at(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(`
3019
- `)}]}}default:throw Error(`Unknown checkpoint action: ${t}`)}}function __(e,t){let{name:n,files:r,description:i}=t;switch(e){case`workset.save`:{$(n,`name`),l_(r,`files`);let e=bn(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=jt(n);return e?{content:[{type:`text`,text:JSON.stringify(e)}]}:{content:[{type:`text`,text:`Workset "${n}" not found.`}]}}case`workset.list`:{let e=Wt();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(`
3020
- `)}]}}case`workset.delete`:return $(n,`name`),{content:[{type:`text`,text:vt(n)?`Deleted workset "${n}".`:`Workset "${n}" not found.`}]};case`workset.add`:{$(n,`name`),l_(r,`files`);let e=Qe(n,r);return{content:[{type:`text`,text:`Added to workset "${e.name}": now ${e.files.length} files.`}]}}case`workset.remove`:{$(n,`name`),l_(r,`files`);let e=dn(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 v_(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`),l_(r,`files`);let e=It(n,r);return{content:[{type:`text`,text:JSON.stringify(e)}]}}case`lane.list`:return{content:[{type:`text`,text:JSON.stringify(zt())}]};case`lane.status`:return $(n,`name`),{content:[{type:`text`,text:JSON.stringify(Vt(n))}]};case`lane.diff`:return $(n,`name`),{content:[{type:`text`,text:JSON.stringify(Lt(n))}]};case`lane.merge`:return $(n,`name`),{content:[{type:`text`,text:JSON.stringify(Bt(n))}]};case`lane.discard`:return $(n,`name`),{content:[{type:`text`,text:JSON.stringify({discarded:Rt(n)})}]};case`lane.lease`:{$(i,`agent`),l_(r,`files`),$(a,`intent`);let e=Ze({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=un({id:o});return{content:[{type:`text`,text:JSON.stringify(e)}]}}case`lane.leases`:{let e=Ht({agent:i});return{content:[{type:`text`,text:JSON.stringify(e)}]}}default:throw Error(`Unknown lane action: ${e}`)}}function y_(e){let t=[`Compliance score: ${e.score}/100`,`Calls scored: ${e.totalCalls}`,`Summary: ${e.summary}`];if(e.violations.length===0)return`${t.join(`
3023
+ `),de=(f===`hybrid`?`hybrid (vector + keyword RRF)`:f===`keyword`?`keyword (FTS)`:`semantic (vector)`)+re,fe=e_(E,e),pe=fe.length>0?`\n_Distinctive terms: ${fe.map(e=>`\`${e}\``).join(`, `)}_`:``,me=await n_(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=ee+ge.join(``),ve=!1;if(x){let e=I(_e,x);ve=e!==_e,_e=e}ve||=le;let k=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}:{}})),ye=[oe,me].filter(e=>!!e),be=mt({text:_e,query:e,searchMode:f,limit:d,results:k,durationMs:Date.now()-w,truncated:ve,caveats:ye}),xe=ll(be.summary),Se=new Set,A=[];for(let e of E){if(e.record.origin!==`curated`||e.record.sourcePath.startsWith(`[`))continue;let t=Ju(e.record.sourcePath);if(!t)continue;let n=Ku(t,e.record.headingPath??t);n&&!Se.has(n.uri)&&(Se.add(n.uri),A.push(n))}return{content:[{type:`text`,text:ul(be.summary,xe)},...A],isError:!be.ok,structuredContent:{...be.data??{results:[],totalResults:0,searchMode:f,query:e},ref:xe}}}catch(t){Ug.error(`Search failed`,j(t));let n=mt({text:`Search failed: ${t instanceof Error?t.message:String(t)}`,query:e??``,searchMode:f??`hybrid`,limit:d,results:[],durationMs:Date.now()-w}),r=ll(n.summary);return{content:[{type:`text`,text:ul(n.summary,r)}],structuredContent:{...n.data??{results:[],totalResults:0,searchMode:f??`hybrid`,query:e??``},ref:r}}}})}const i_=1e4,a_={defaultTtlSeconds:300,defaultLeaseTtlMinutes:10,globalEnabled:!1};function o_(e){return e??a_}function s_(e,t){let n=e.trim();if(!n)throw Error(`${t} is required`);return n}function c_(e,t,n){let r=s_(e,t);if(r.length>n)throw Error(`${t} exceeds max length of ${n}`);return r}function l_(e,t){if(!Number.isFinite(e)||e<=0)throw Error(`${t} must be greater than 0`);return Math.trunc(e)}function u_(e,t=!1,n){s_(e,`workspace`);let r=o_(n);if(!t)return e;if(!r.globalEnabled)throw Error(`Global signal scope is disabled`);return`__global__`}function d_(e,t,n){let r=o_(n),i=u_(t.workspace,t.global??!1,r),a=c_(t.key,`key`,500),o=c_(t.value,`value`,i_),s=t.agent?c_(t.agent,`agent`,500):void 0,c=l_(t.ttlSeconds??r.defaultTtlSeconds,`ttlSeconds`);return e.signalPost(i,a,o,s,c)}function f_(e,t,n){let r=s_(t,`workspace`),i=c_(n,`key`,500);return e.signalGet(r,i)}function p_(e,t){let n=s_(t,`workspace`);return e.signalList(n)}function m_(e,t,n){let r=s_(t,`workspace`),i=n===void 0?void 0:c_(n,`key`,500);return e.signalClear(r,i)}function h_(e,t,n){let r=o_(n),i=c_(t.resource,`resource`,500),a=c_(t.holder,`holder`,500),o=s_(t.workspace,`workspace`),s=t.intent?c_(t.intent,`intent`,i_):void 0,c=l_(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 g_(e,t,n,r){let i=s_(t,`workspace`),a=c_(n,`resource`,500),o=c_(r,`holder`,500);return e.leaseRelease(a,o,i)}function __(e,t){let n=s_(t,`workspace`);return e.leaseList(n)}const v_=k(`tools:session`);function $(e,t){if(e==null)throw Error(`${t} is required`)}function y_(e,t){if(!e||e.length===0)throw Error(`${t} are required`)}const b_={action:L.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:L.string().optional().describe(`Workspace identifier`),key:L.string().optional().describe(`Key (for signal get/post/clear, stash get/set/delete)`),value:L.string().optional().describe(`Value (for signal post, stash set)`),agent:L.string().optional().describe(`Agent identifier (for signal lease, lane lease)`),resource:L.string().optional().describe(`Resource path (for signal lease/unlease)`),holder:L.string().optional().describe(`Lease holder ID (for signal lease/unlease)`),intent:L.string().optional().describe(`What the holder plans to do`),ttl:L.number().optional().describe(`TTL (seconds for signals, minutes for leases)`),global:L.boolean().optional().describe(`Use global signal scope (default: false)`),last_n:L.number().min(1).max(500).optional().describe(`Max recent replay entries to score`),scope:L.enum([`tools`,`stash`,`all`]).optional().describe(`Digest scope`),since:L.string().optional().describe(`ISO timestamp — include activity after this time`),last:L.number().min(1).max(500).optional().describe(`Max replay entries to consider`),focus:L.string().optional().describe(`Focus query — prioritize entries matching this topic`),mode:L.enum([`deterministic`,`sampling`]).optional().describe(`Summary mode`),token_budget:L.number().min(100).max(8e3).optional().describe(`Target token budget`),persist:L.boolean().optional().describe(`Auto-save digest to stash for crash recovery`),label:L.string().optional().describe(`Checkpoint label / lane name / workset name`),data:L.string().max(5e5).optional().describe(`JSON object string for checkpoint save`),notes:L.string().max(1e4).optional().describe(`Optional notes for checkpoint save`),from_id:L.string().optional().describe(`Checkpoint ID to diff FROM`),to_id:L.string().optional().describe(`Checkpoint ID to diff TO`),limit:L.number().min(1).max(50).optional().describe(`Max entries to return`),keep_last:L.number().min(1).max(100).optional().describe(`Keep N recent checkpoints per label (gc)`),max_age_days:L.number().min(1).optional().describe(`Delete checkpoints older than N days (gc)`),dry_run:L.boolean().optional().describe(`Preview changes without deleting (gc)`),name:L.string().optional().describe(`Workset name or lane name`),files:L.array(L.string()).optional().describe(`File paths for workset/lane operations`),description:L.string().optional().describe(`Description (for workset save)`),id:L.string().optional().describe(`Lease ID (for lane unlease)`),symbols:L.array(L.string()).optional().describe(`Symbol names within files (for lane lease)`),ttl_minutes:L.number().optional().describe(`Lease TTL in minutes (for lane lease)`)};function x_(e,t,n){let r=W(`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:b_,annotations:r.annotations},Y(`session`,async e=>{try{let r=e.action,[i]=r.split(`.`);switch(i){case`signal`:return S_(t,r,e);case`compliance`:return C_(r,e);case`session`:return await w_(t,n,r,e);case`stash`:return T_(t,r,e);case`checkpoint`:return E_(t,r,e);case`workset`:return D_(r,e);case`lane`:return O_(r,e);default:throw Error(`Unknown session action namespace: ${i}`)}}catch(e){return v_.error(`Session operation failed`,j(e)),J(`INTERNAL`,`Session operation failed: ${e instanceof Error?e.message:String(e)}`)}}))}function S_(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=a_;switch(t){case`signal.post`:{if($(i,`key`),a===void 0)throw Error(`value is required for signal.post`);let t=d_(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=f_(e,u_(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=p_(e,u_(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=m_(e,u_(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=h_(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=g_(e,r,s,c);return{content:[{type:`text`,text:JSON.stringify({released:t},null,2)}],structuredContent:{released:t}}}case`signal.leases`:{let 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 C_(e,t){switch(e){case`compliance.score`:{let e=t.last_n??50;return{content:[{type:`text`,text:k_(Sn(pn({last:e}),{lastN:e}))}]}}default:throw Error(`Unknown compliance action: ${e}`)}}async function w_(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 wn(n,async(e,n,r)=>(await t.createMessage({prompt:e,systemPrompt:n,maxTokens:r})).text,i):Cn(n,i)).digest}]}}default:throw Error(`Unknown session action: ${n}`)}}function T_(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=kn(e,r,j_(i??``));return{content:[{type:`text`,text:`Stored stash entry "${t.key}" (${t.type}) at ${t.storedAt}.`}]}}case`stash.get`:{$(r,`key`);let t=Dn(e,r);return{content:[{type:`text`,text:t?JSON.stringify(t):`Stash entry "${r}" not found.`}]}}case`stash.list`:{let t=On(e);return{content:[{type:`text`,text:t.length===0?`Stash is empty.`:t.map(e=>`- ${e.key} (${e.type}) — ${e.storedAt}`).join(`
3024
+ `)}]}}case`stash.delete`:return $(r,`key`),{content:[{type:`text`,text:En(e,r)?`Deleted stash entry "${r}".`:`Stash entry "${r}" not found.`}]};case`stash.clear`:{let t=Tn(e);return{content:[{type:`text`,text:`Cleared ${t} stash entr${t===1?`y`:`ies`}.`}]}}default:throw Error(`Unknown stash action: ${t}`)}}function E_(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:A_(lt(e,r,M_(i),{notes:a}))}]};case`checkpoint.load`:{$(r,`label`);let t=ct(e,r);return{content:[{type:`text`,text:t?A_(t):`Checkpoint "${r}" not found.`}]}}case`checkpoint.list`:{let t=st(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(`
3025
+ `)}]}}case`checkpoint.latest`:{let t=ot(e,{label:r});return{content:[{type:`text`,text:t?A_(t):`No checkpoints saved.`}]}}case`checkpoint.diff`:{$(o,`from_id`),$(s,`to_id`);let t=rt(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(`
3026
+ `)}]}:{content:[{type:`text`,text:`One or both checkpoints not found.`}]}}case`checkpoint.history`:{$(r,`label`);let t=at(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(`
3027
+ `)}`}]}}case`checkpoint.gc`:{let t=it(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(`
3028
+ `)}]}}default:throw Error(`Unknown checkpoint action: ${t}`)}}function D_(e,t){let{name:n,files:r,description:i}=t;switch(e){case`workset.save`:{$(n,`name`),y_(r,`files`);let e=yn(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=At(n);return e?{content:[{type:`text`,text:JSON.stringify(e)}]}:{content:[{type:`text`,text:`Workset "${n}" not found.`}]}}case`workset.list`:{let e=Ut();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(`
3029
+ `)}]}}case`workset.delete`:return $(n,`name`),{content:[{type:`text`,text:_t(n)?`Deleted workset "${n}".`:`Workset "${n}" not found.`}]};case`workset.add`:{$(n,`name`),y_(r,`files`);let e=Ze(n,r);return{content:[{type:`text`,text:`Added to workset "${e.name}": now ${e.files.length} files.`}]}}case`workset.remove`:{$(n,`name`),y_(r,`files`);let e=un(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 O_(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`),y_(r,`files`);let e=Ft(n,r);return{content:[{type:`text`,text:JSON.stringify(e)}]}}case`lane.list`:return{content:[{type:`text`,text:JSON.stringify(Rt())}]};case`lane.status`:return $(n,`name`),{content:[{type:`text`,text:JSON.stringify(Bt(n))}]};case`lane.diff`:return $(n,`name`),{content:[{type:`text`,text:JSON.stringify(It(n))}]};case`lane.merge`:return $(n,`name`),{content:[{type:`text`,text:JSON.stringify(zt(n))}]};case`lane.discard`:return $(n,`name`),{content:[{type:`text`,text:JSON.stringify({discarded:Lt(n)})}]};case`lane.lease`:{$(i,`agent`),y_(r,`files`),$(a,`intent`);let e=Xe({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=ln({id:o});return{content:[{type:`text`,text:JSON.stringify(e)}]}}case`lane.leases`:{let e=Vt({agent:i});return{content:[{type:`text`,text:JSON.stringify(e)}]}}default:throw Error(`Unknown lane action: ${e}`)}}function k_(e){let t=[`Compliance score: ${e.score}/100`,`Calls scored: ${e.totalCalls}`,`Summary: ${e.summary}`];if(e.violations.length===0)return`${t.join(`
3021
3030
  `)}\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(`
3022
3031
  `)}\n\nViolations:\n${n.join(`
3023
- `)}`}function b_(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(`
3024
- `)}function x_(e){let t=e.trim();if(!t)return``;try{return JSON.parse(t)}catch{return e}}function S_(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 C_={totalInputChars:0,totalOutputChars:0,callCount:0,startTime:new Date().toISOString()};function w_(){return{...C_}}const T_=new Map,E_=[];function D_(){return Array.from(T_.entries()).map(([e,t])=>({tool:e,...t}))}function O_(){return E_}O(`auto-gc`);function k_(){let e=[...O_()];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 A_(){return{state:`warming`,p95:k_(),lastGcAt:null,gcCount:0,bufferSize:O_().length}}const j_=O(`tools`),M_=14400*1e3,N_={includePrelude:I.boolean().default(!1).describe(`Include session prelude with top lessons, conventions, and last checkpoint`)};function P_(e,t,n,r=15e3){let i,a=new Promise(e=>{i=setTimeout(()=>{j_.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),j_.warn(`Status sub-operation "${n}" failed: ${e instanceof Error?e.message:String(e)}`),{value:t,timedOut:!1})),a])}function F_(e){return e.onboarded?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 I_(){let e=tr.get(),t=er.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(`
3032
+ `)}`}function A_(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(`
3033
+ `)}function j_(e){let t=e.trim();if(!t)return``;try{return JSON.parse(t)}catch{return e}}function M_(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 N_={totalInputChars:0,totalOutputChars:0,callCount:0,startTime:new Date().toISOString()};function P_(){return{...N_}}const F_=new Map,I_=[];function L_(){return Array.from(F_.entries()).map(([e,t])=>({tool:e,...t}))}function R_(){return I_}k(`auto-gc`);function z_(){let e=[...R_()];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 B_(){return{state:`warming`,p95:z_(),lastGcAt:null,gcCount:0,bufferSize:R_().length}}const V_=k(`tools`),H_=14400*1e3,U_={includePrelude:L.boolean().default(!1).describe(`Include session prelude with top lessons, conventions, and last checkpoint`)};function W_(e,t,n,r=15e3){let i,a=new Promise(e=>{i=setTimeout(()=>{V_.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),V_.warn(`Status sub-operation "${n}" failed: ${e instanceof Error?e.message:String(e)}`),{value:t,timedOut:!1})),a])}function G_(e){return e.onboarded?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 K_(){let e=tr.get(),t=er.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(`
3025
3034
  `):` 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(`
3026
- `)}const L_=5*6e4;let R_=null,z_=null;function B_(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 V_(){let e=Date.now();if(R_&&e-R_.ts<L_)return R_.value;try{let t=P(Hn(),`.copilot`,`.aikit-scaffold.json`);if(!j(t))return R_={value:null,ts:e},null;let n=JSON.parse(M(t,`utf-8`)).version??null;return R_={value:n,ts:e},n}catch{return R_={value:null,ts:e},null}}function H_(){let e=Date.now();if(z_&&e-z_.ts<L_)return z_.value;try{let t=P(process.cwd(),`.github`,`.aikit-scaffold.json`);if(!j(t))return z_={value:null,ts:e},null;let n=JSON.parse(M(t,`utf-8`)).version??null;return z_={value:n,ts:e},n}catch{return z_={value:null,ts:e},null}}function U_(e){let t=W(`status`);e.registerTool(`status`,{title:t.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:N_,annotations:t.annotations},Y(`status`,async()=>{let e=ne(),t=V_(),n=H_(),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)**: ${tr.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=S(),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`?(x(),a.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${e} ≠ ${c}`,`- Error: ${o.error??`unknown`}`)):(x(),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:!!tr.get(),wasmDiagnostics:er.get(),graphStats:null,curatedCount:0,serverVersion:e,scaffoldVersion:t??null,workspaceScaffoldVersion:n??null,upgradeAvailable:r||i,contextPressure:0,nextAction:F_({onboarded:!1,indexStale:!1,contextPressure:0})};return{content:[{type:`text`,text:a.join(`
3027
- `)}],structuredContent:o}}))}function W_(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){let g=W(`status`);e.registerTool(`status`,{title:g.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:N_,annotations:g.annotations},Y(`status`,async({includePrelude:e=!1})=>{let g=[];try{let[_,v]=await Promise.all([P_(t.getStats(),{totalRecords:0,totalFiles:0,lastIndexedAt:null,contentTypeBreakdown:{}},`store.getStats`),P_(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 C=null,w=0,T=[`## 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`,...b.slice(0,50).map(e=>`- ${e}`),b.length>50?`\n... and ${b.length-50} more files`:``];if(n)try{let e=await P_(n.getStats(),{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}},`graphStore.getStats`);if(e.timedOut)g.push(`⚠ Graph stats timed out`),T.push(``,`### Knowledge Graph`,`- Graph stats timed out`);else{let t=e.value;C={nodes:t.nodeCount,edges:t.edgeCount},T.push(``,`### Knowledge Graph`,`- **Nodes**: ${t.nodeCount}`,`- **Edges**: ${t.edgeCount}`,...Object.entries(t.nodeTypes).map(([e,t])=>` - ${e}: ${t}`));try{let e=await P_(n.validate(),{valid:!0,danglingEdges:[],orphanNodes:[],stats:{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}}},`graphStore.validate`);if(!e.timedOut){let t=e.value;t.valid||T.push(`- **⚠ Integrity Issues**: ${t.danglingEdges.length} dangling edges`),t.orphanNodes.length>0&&T.push(`- **Orphan nodes**: ${t.orphanNodes.length}`)}}catch{}}}catch{T.push(``,`### Knowledge Graph`,`- Graph store unavailable`)}let E=a?.onboardDir??``,ee=j(E),D=i?.onboardComplete||ee;if(T.push(``,`### Onboard Status`,D?`- ✅ Complete${i?.onboardTimestamp?` (last: ${i.onboardTimestamp})`:``}`:'- ❌ Not run — call `onboard({ path: "." })` to analyze the codebase',`- **Onboard Directory**: \`${E}\``),r)try{let e=await P_(r.count(),0,`curated.count`);e.timedOut?(g.push(`⚠ Curated knowledge count timed out`),T.push(``,`### Curated Knowledge`,`- Listing timed out`)):(w=e.value,T.push(``,`### Curated Knowledge`,w>0?`- ${w} entries`:'- Empty — use `knowledge({ action: "remember", ... })` to persist decisions'))}catch{T.push(``,`### Curated Knowledge`,`- Unable to read curated entries`)}let re=In().filter(e=>e.status===`watching`);if(re.length>0){T.push(``,`### File Watchers`,`- **Active**: ${re.length}`);for(let e of re){let t=e.pendingFiles?.length??0;if(T.push(` - \`${e.path}\`: ${e.eventCount} events, ${t} pending files`),t>0&&t<=10)for(let t of e.pendingFiles)T.push(` - \`${t}\``);else t>10&&T.push(` - ${t} pending files (use \`watch({ action: 'list' })\` for details)`)}}let ie=B_(y.totalRecords,C?.nodes??0,C?.edges??0,w),ae=y.lastIndexedAt?new Date(y.lastIndexedAt).getTime():0,oe=ae>0?Date.now()-ae:1/0,se=F_({onboarded:D,indexStale:D&&oe>1440*60*1e3,contextPressure:ie});T.push(``),T.push(`## 📊 Context Pressure: ${ie}/100`),ie>=80?T.push(`⚠️ High pressure — consider pruning stale entries or compacting context.`):ie>=50?T.push(`ℹ️ Moderate pressure — AI Kit memory is well-populated.`):T.push(`✅ Low pressure — plenty of headroom for more content.`);let ce=0;if(y.lastIndexedAt){ce=new Date(y.lastIndexedAt).getTime();let e=(Date.now()-ce)/(1e3*60*60);T.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`)}T.push(``,`### Next Action`,`- **${se.kind}**: ${se.reason}`);let le=null,ue=t;if(typeof ue.getDiagnostics==`function`)try{let e=ue.getDiagnostics();le={adapterType:e.adapterType,vectorSearchEnabled:e.vectorSearchEnabled,ftsEnabled:e.ftsEnabled,degradedMode:e.degradedMode,dbPath:e.dbPath,dbSizeBytes:e.dbSizeBytes,embeddingDim:e.embeddingDim,vectorDtype:e.vectorDtype},T.push(``,`### Storage`,`- **Backend**: ${a?.store?.backend??`unknown`}`,`- **Adapter**: ${le.adapterType}`,`- **Vector search**: ${le.vectorSearchEnabled?`✅ enabled`:`⚠ disabled (FTS-only fallback)`}`,le.dbPath?`- **DB**: ${le.dbPath}`:``,le.dbSizeBytes==null?``:`- **DB size**: ${(le.dbSizeBytes/1024/1024).toFixed(2)} MB`,`- **Embedding dim**: ${le.embeddingDim}`,`- **Vector dtype**: ${le.vectorDtype}`)}catch{}if(o===`smart`)if(T.push(``,`### Smart Indexing`),s){let e=s();e?T.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}`):T.push(`- **Mode**: Smart (trickle)`,`- **Status**: scheduler state unavailable (init may have failed)`)}else T.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(T.push(``,`### 📊 Metrics`),n.length>0){T.push(`**Counters:**`);for(let[e,t]of n)T.push(`- \`${e}\`: ${t}`)}if(r.length>0){T.push(`**Gauges:**`);for(let[e,t]of r)T.push(`- \`${e}\`: ${t}`)}if(t.length>0){T.push(`**⚠ Threshold violations:**`);for(let e of t)T.push(`- ${e}`)}else(n.length>0||r.length>0)&&T.push(`- ✅ All thresholds within limits`)}}catch{T.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`);T.push(``,`### 🧩 Feature Coverage`,...e)}let de=0;{try{let e=a?.stateDir?N(a.stateDir,`stash`):null;if(e&&j(e)){let t=je(e).mtimeMs;t>ce&&(ce=t)}}catch{}let e=[];if(r)try{let t=w>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>ce&&(ce=t)}e.push(...t)}catch{}if(de=ce>0?Date.now()-ce:0,de>=M_){let t=Math.floor(de/36e5);if(T.push(``,`### 🌅 Session Briefing`,`_${t}+ hours since last activity — here's what to pick up:_`,``),e.length>0){T.push(`**Recent decisions/notes:**`);for(let t of e)T.push(`- **${t.title}** (${t.category??`note`}) — ${(t.contentPreview??``).slice(0,80)}…`)}T.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')}}T.push(``,`### Runtime`,I_());let fe=he.instance().getAll(),pe=fe.filter(e=>e.status!==`healthy`);if(pe.length>0){T.push(``,`### ⚠️ Subsystem Health`);for(let e of pe){let t=Math.round((Date.now()-e.since)/1e3);T.push(`- **${e.name}**: ${e.status} (${t}s ago${e.reason?` — ${e.reason}`:``})`)}}else fe.length>0&&T.push(``,`### ✅ Subsystem Health`,`- All ${fe.length} subsystems healthy`);let ge=me.getAll();if(ge.size>0){T.push(``,`### 🔌 Circuit Breakers`);for(let[e,t]of ge){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)`}T.push(r)}}let _e=V_(),ve=H_(),ye=ne(),O=_e!=null&&_e!==ye,be=ve!=null&&ve!==ye;if(O||be){let e=S(),t=[];O&&t.push(`user scaffold v${_e}`),be&&t.push(`workspace scaffold v${ve}`);let n=t.join(`, `);e.state===`success`?T.push(``,`### ✅ Upgrade Applied`,`- Server v${ye} — ${n} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):e.state===`pending`?T.push(``,`### ⏳ Upgrade In Progress`,`- Server v${ye} ≠ ${n}`,`- Auto-upgrade is running in the background…`):e.state===`failed`?(x(),T.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${ye} ≠ ${n}`,`- Error: ${e.error??`unknown`}`)):(x(),T.push(``,`### ⬆ Upgrade Available`,`- Server v${ye} ≠ ${n}`,`- Auto-upgrade triggered — check again shortly.`))}g.length>0&&T.push(``,`### ⚠ Warnings`,...g.map(e=>`- ${e}`));let xe=D_();if(xe.length>0){let e=xe.sort((e,t)=>t.callCount-e.callCount);T.push(``,`### Tool Usage This Session`,``),T.push(`| Tool | Calls | Tokens In | Tokens Out | Errors | Avg Latency |`),T.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);T.push(`| ${t.tool} | ${t.callCount} | ${e.toLocaleString()} | ${n.toLocaleString()} | ${t.errorCount} | ${r}ms |`)}}let k=w_();k.callCount>0&&(T.push(``),T.push(`### Session Token Usage`),T.push(`- Tool calls: ${k.callCount}`),T.push(`- Input chars: ${k.totalInputChars.toLocaleString()}`),T.push(`- Output chars: ${k.totalOutputChars.toLocaleString()}`),T.push(`- Est. input tokens: ${Math.round(k.totalInputChars/4).toLocaleString()}`),T.push(`- Est. total tokens: ${Math.round((k.totalInputChars+k.totalOutputChars)/4).toLocaleString()}`));let Se=A_();if(Se.bufferSize>=10){let e=Se.state===`healthy`?`🟢`:Se.state===`degraded`?`🔴`:`🟡`;T.push(``,`### Auto-GC: ${e} ${Se.state}`),T.push(`- p95 latency: ${Se.p95}ms | buffer: ${Se.bufferSize} samples`),Se.gcCount>0&&T.push(`- GC cycles triggered: ${Se.gcCount}`)}if(l){let e=l.getStats();if(e.totalSubscribers>0){T.push(``,`### 🔌 Hooks (EventBus Subscribers)`),T.push(`- Total subscribers: ${e.totalSubscribers}`);for(let[t,n]of Object.entries(e.byEvent))T.push(` - ${t}: ${n} subscriber(s)`);for(let t of e.subscriptions)T.push(` - ${t.name} (${t.eventType}, ${t.policy})`);if(e.autoDisabled.length>0){T.push(``),T.push(` **Auto-disabled subscribers:**`);for(let t of e.autoDisabled)T.push(` - ${t.name} (${t.id}): ${t.reason}`)}}}if(u&&u.size>0){let e=u.getStats();T.push(``,`### 🪝 Decision Hooks`),T.push(`- Total hooks: ${e.count}`);for(let t of e.hooks){let e=t.decisionTypes.join(`, `);T.push(` - ${t.id} (order=${t.order}, policy=${t.failurePolicy}, types=[${e}])`)}}if(d){let e=d.getStats();T.push(``,`### 👁 Observations`),T.push(`- Total observations: ${e.totalObservations}`),T.push(` - Success: ${e.byError.success}, Error: ${e.byError.error}`),T.push(` - Artifacts stored: ${e.artifactCount}`),T.push(` - Truncations: ${e.truncationCount}`),T.push(` - Store entries: ${e.storeSize}`);let t=Object.entries(e.byOrigin);t.length>0&&T.push(` - By origin: ${t.map(([e,t])=>`${e}=${t}`).join(`, `)}`)}if(f){let e=f.getStats();T.push(``,`### 🧩 Extractors`),T.push(`- Total extractors: ${e.count}`);for(let[t,n]of Object.entries(e.byName))T.push(` - ${t} (${n.tools} tool(s), maxFacts: ${n.maxFactsPerEvent??`default`})`)}if(p){let e=p.getStats();if(T.push(``,`### 🏆 Promotion Engine`),T.push(`- Total evaluated: ${e.totalEvaluated}`),T.push(`- Promoted: ${e.promoted}`),T.push(`- Held: ${e.held}`),T.push(`- Rejected: ${e.rejected}`),T.push(`- Superseded: ${e.superseded}`),T.push(`- Decayed: ${e.decayed}`),T.push(`- Distinct facts tracked: ${e.observedFacts}`),e.recentDecisions.length>0){T.push(` Recent decisions:`);for(let t of e.recentDecisions.slice(-5))T.push(` - ${t.decision.status}: "${t.factTitle}" (${t.decision.reason.slice(0,80)})`)}}if(m){let e=m.getStats();T.push(``,`### 📋 Workspace Skill`),T.push(`- **Skill exists**: ${e.skillExists?`✅`:`❌`}`),T.push(`- **Stale**: ${e.isStale?`⚠ Yes — regenerating on next trigger`:`✅ Fresh`}`),T.push(`- **Last compiled**: ${e.lastCompiledAt?new Date(e.lastCompiledAt).toLocaleString():`Never`}`),T.push(`- **Version**: ${e.skillVersion}`),T.push(`- **Total compiles**: ${e.totalCompiles}`),e.failedCompiles>0&&T.push(`- **Failed compiles**: ${e.failedCompiles}`),e.skillSize>0&&T.push(`- **Skill size**: ${e.skillSize} bytes`),e.isCompiling&&T.push(`- ⏳ **Currently compiling**`),e.pendingRegeneration&&T.push(`- ⏳ **Regeneration pending**`),T.push(``," Call `skill_view('<ws-name>')` to load workspace context.")}{let e=At();(e.cacheSize>0||e.refReuseCount>0)&&(T.push(``,`### 🔄 Ref Reuse`),T.push(`- **Refs stored**: ${e.refStoreCount}`),T.push(`- **Refs reused**: ${e.refReuseCount}`),e.refStaleCount>0&&T.push(`- **⚠ Stale refs detected**: ${e.refStaleCount}`),T.push(`- **Cache entries**: ${e.cacheSize}`))}let Ce=T.join(`
3028
- `),we=de>=M_,Te=[a?.onboardDir?_n(P(a.onboardDir,`..`)):void 0,a?.skillDir].filter(e=>typeof e==`string`&&e.length>0);Te[0];let A=e||we?await te(r,c,void 0,Te.length>0?Te:void 0):void 0,Ee=re.length>0?re.map(e=>({id:e.id,path:e.path,eventCount:e.eventCount,pendingFiles:e.pendingFiles??[]})):void 0,De={totalRecords:y.totalRecords,totalFiles:y.totalFiles,lastIndexedAt:y.lastIndexedAt??null,onboarded:D,onboardDir:E,contentTypes:y.contentTypeBreakdown,wasmAvailable:!!tr.get(),wasmDiagnostics:er.get(),graphStats:C,curatedCount:w,serverVersion:ye,scaffoldVersion:_e??null,workspaceScaffoldVersion:ve??null,upgradeAvailable:O||be,storeBackend:a?.store?.backend,storeDiagnostics:le??null,contextPressure:ie,nextAction:se,workspace_skill:(()=>{if(!m)return null;try{let e=m.getStats();return{exists:e.skillExists,version:e.skillVersion,fresh:!e.isStale,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:Ee,sessionTokens:{callCount:k.callCount,totalInputChars:k.totalInputChars,totalOutputChars:k.totalOutputChars,estInputTokens:Math.round(k.totalInputChars/4),estTotalTokens:Math.round((k.totalInputChars+k.totalOutputChars)/4),startTime:k.startTime},...A===void 0?{}:{prelude:A}};return{content:[{type:`text`,text:Ce+(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:De}}catch(e){return j_.error(`Status failed`,A(e)),J(`INTERNAL`,`Status check failed: ${e instanceof Error?e.message:String(e)}`)}}))}const G_=O(`tools`);function K_(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 q_(e){let t=W(`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},Y(`web_search`,async({queries:e,limit:t,site:n,provider:r})=>{let i=e,a=async e=>{let i=await Rn({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(`
3029
- `)};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 G_.error(`Web search failed`,A(e)),J(`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);G_.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(`
3035
+ `)}const q_=5*6e4;let J_=null,Y_=null;function X_(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 Z_(){let e=Date.now();if(J_&&e-J_.ts<q_)return J_.value;try{let t=F(Vn(),`.copilot`,`.aikit-scaffold.json`);if(!M(t))return J_={value:null,ts:e},null;let n=JSON.parse(N(t,`utf-8`)).version??null;return J_={value:n,ts:e},n}catch{return J_={value:null,ts:e},null}}function Q_(){let e=Date.now();if(Y_&&e-Y_.ts<q_)return Y_.value;try{let t=F(process.cwd(),`.github`,`.aikit-scaffold.json`);if(!M(t))return Y_={value:null,ts:e},null;let n=JSON.parse(N(t,`utf-8`)).version??null;return Y_={value:n,ts:e},n}catch{return Y_={value:null,ts:e},null}}function $_(e){let t=W(`status`);e.registerTool(`status`,{title:t.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:U_,annotations:t.annotations},Y(`status`,async()=>{let e=te(),t=Z_(),n=Q_(),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)**: ${tr.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=S(),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`?(x(),a.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${e} ≠ ${c}`,`- Error: ${o.error??`unknown`}`)):(x(),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:!!tr.get(),wasmDiagnostics:er.get(),graphStats:null,curatedCount:0,serverVersion:e,scaffoldVersion:t??null,workspaceScaffoldVersion:n??null,upgradeAvailable:r||i,contextPressure:0,nextAction:G_({onboarded:!1,indexStale:!1,contextPressure:0})};return{content:[{type:`text`,text:a.join(`
3036
+ `)}],structuredContent:o}}))}function ev(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){let g=W(`status`);e.registerTool(`status`,{title:g.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:U_,annotations:g.annotations},Y(`status`,async({includePrelude:e=!1})=>{let g=[];try{let[_,v]=await Promise.all([W_(t.getStats(),{totalRecords:0,totalFiles:0,lastIndexedAt:null,contentTypeBreakdown:{}},`store.getStats`),W_(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 C=b.filter(e=>!e.startsWith(`.ai/curated/context/auto-`)&&!e.startsWith(`.ai/curated/workflow/auto-`)&&!e.includes(`node_modules/`)&&!e.startsWith(`.git/`)),w=b.length-C.length,T=null,E=0,D=[`## 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`,...C.slice(0,50).map(e=>`- ${e}`),C.length>50?`\n... and ${C.length-50} more files`:``,w>0?`\n_(${w} internal/auto-curated files hidden — use \`find\` to explore them)_`:``];if(n)try{let e=await W_(n.getStats(),{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}},`graphStore.getStats`);if(e.timedOut)g.push(`⚠ Graph stats timed out`),D.push(``,`### Knowledge Graph`,`- Graph stats timed out`);else{let t=e.value;T={nodes:t.nodeCount,edges:t.edgeCount},D.push(``,`### Knowledge Graph`,`- **Nodes**: ${t.nodeCount}`,`- **Edges**: ${t.edgeCount}`,...Object.entries(t.nodeTypes).map(([e,t])=>` - ${e}: ${t}`));try{let e=await W_(n.validate(),{valid:!0,danglingEdges:[],orphanNodes:[],stats:{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}}},`graphStore.validate`);if(!e.timedOut){let t=e.value;t.valid||D.push(`- **⚠ Integrity Issues**: ${t.danglingEdges.length} dangling edges`),t.orphanNodes.length>0&&D.push(`- **Orphan nodes**: ${t.orphanNodes.length}`)}}catch{}}}catch{D.push(``,`### Knowledge Graph`,`- Graph store unavailable`)}let O=a?.onboardDir??``,ne=M(O),re=i?.onboardComplete||ne;if(D.push(``,`### Onboard Status`,re?`- ✅ Complete${i?.onboardTimestamp?` (last: ${i.onboardTimestamp})`:``}`:'- ❌ Not run — call `onboard({ path: "." })` to analyze the codebase',`- **Onboard Directory**: \`${O}\``),r)try{let e=await W_(r.count(),0,`curated.count`);e.timedOut?(g.push(`⚠ Curated knowledge count timed out`),D.push(``,`### Curated Knowledge`,`- Listing timed out`)):(E=e.value,D.push(``,`### Curated Knowledge`,E>0?`- ${E} entries`:'- Empty — use `knowledge({ action: "remember", ... })` to persist decisions'))}catch{D.push(``,`### Curated Knowledge`,`- Unable to read curated entries`)}let ie=Fn().filter(e=>e.status===`watching`);if(ie.length>0){D.push(``,`### File Watchers`,`- **Active**: ${ie.length}`);for(let e of ie){let t=e.pendingFiles?.length??0;if(D.push(` - \`${e.path}\`: ${e.eventCount} events, ${t} pending files`),t>0&&t<=10)for(let t of e.pendingFiles)D.push(` - \`${t}\``);else t>10&&D.push(` - ${t} pending files (use \`watch({ action: 'list' })\` for details)`)}}let ae=X_(y.totalRecords,T?.nodes??0,T?.edges??0,E),oe=y.lastIndexedAt?new Date(y.lastIndexedAt).getTime():0,se=oe>0?Date.now()-oe:1/0,ce=G_({onboarded:re,indexStale:re&&se>1440*60*1e3,contextPressure:ae});D.push(``),D.push(`## 📊 Context Pressure: ${ae}/100`),ae>=80?D.push(`⚠️ High pressure — consider pruning stale entries or compacting context.`):ae>=50?D.push(`ℹ️ Moderate pressure — AI Kit memory is well-populated.`):D.push(`✅ Low pressure — plenty of headroom for more content.`);let le=0;if(y.lastIndexedAt){le=new Date(y.lastIndexedAt).getTime();let e=(Date.now()-le)/(1e3*60*60);D.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`)}D.push(``,`### Next Action`,`- **${ce.kind}**: ${ce.reason}`);let ue=null,de=t;if(typeof de.getDiagnostics==`function`)try{let e=de.getDiagnostics();ue={adapterType:e.adapterType,vectorSearchEnabled:e.vectorSearchEnabled,ftsEnabled:e.ftsEnabled,degradedMode:e.degradedMode,dbPath:e.dbPath,dbSizeBytes:e.dbSizeBytes,embeddingDim:e.embeddingDim,vectorDtype:e.vectorDtype},D.push(``,`### Storage`,`- **Backend**: ${a?.store?.backend??`unknown`}`,`- **Adapter**: ${ue.adapterType}`,`- **Vector search**: ${ue.vectorSearchEnabled?`✅ enabled`:`⚠ disabled (FTS-only fallback)`}`,ue.dbPath?`- **DB**: ${ue.dbPath}`:``,ue.dbSizeBytes==null?``:`- **DB size**: ${(ue.dbSizeBytes/1024/1024).toFixed(2)} MB`,`- **Embedding dim**: ${ue.embeddingDim}`,`- **Vector dtype**: ${ue.vectorDtype}`)}catch{}if(o===`smart`)if(D.push(``,`### Smart Indexing`),s){let e=s();e?D.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}`):D.push(`- **Mode**: Smart (trickle)`,`- **Status**: scheduler state unavailable (init may have failed)`)}else D.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(D.push(``,`### 📊 Metrics`),n.length>0){D.push(`**Counters:**`);for(let[e,t]of n)D.push(`- \`${e}\`: ${t}`)}if(r.length>0){D.push(`**Gauges:**`);for(let[e,t]of r)D.push(`- \`${e}\`: ${t}`)}if(t.length>0){D.push(`**⚠ Threshold violations:**`);for(let e of t)D.push(`- ${e}`)}else(n.length>0||r.length>0)&&D.push(`- ✅ All thresholds within limits`)}}catch{D.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`);D.push(``,`### 🧩 Feature Coverage`,...e)}let fe=0;{try{let e=a?.stateDir?P(a.stateDir,`stash`):null;if(e&&M(e)){let t=Ae(e).mtimeMs;t>le&&(le=t)}}catch{}let e=[];if(r)try{let t=E>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>le&&(le=t)}e.push(...t)}catch{}if(fe=le>0?Date.now()-le:0,fe>=H_){let t=Math.floor(fe/36e5);if(D.push(``,`### 🌅 Session Briefing`,`_${t}+ hours since last activity — here's what to pick up:_`,``),e.length>0){D.push(`**Recent decisions/notes:**`);for(let t of e)D.push(`- **${t.title}** (${t.category??`note`}) — ${(t.contentPreview??``).slice(0,80)}…`)}D.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')}}D.push(``,`### Runtime`,K_());let he=me.instance().getAll(),ge=he.filter(e=>e.status!==`healthy`);if(ge.length>0){D.push(``,`### ⚠️ Subsystem Health`);for(let e of ge){let t=Math.round((Date.now()-e.since)/1e3);D.push(`- **${e.name}**: ${e.status} (${t}s ago${e.reason?` — ${e.reason}`:``})`)}}else he.length>0&&D.push(``,`### ✅ Subsystem Health`,`- All ${he.length} subsystems healthy`);let _e=pe.getAll();if(_e.size>0){D.push(``,`### 🔌 Circuit Breakers`);for(let[e,t]of _e){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)`}D.push(r)}}let ve=Z_(),k=Q_(),ye=te(),be=ve!=null&&ve!==ye,xe=k!=null&&k!==ye;if(be||xe){let e=S(),t=[];be&&t.push(`user scaffold v${ve}`),xe&&t.push(`workspace scaffold v${k}`);let n=t.join(`, `);e.state===`success`?D.push(``,`### ✅ Upgrade Applied`,`- Server v${ye} — ${n} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):e.state===`pending`?D.push(``,`### ⏳ Upgrade In Progress`,`- Server v${ye} ≠ ${n}`,`- Auto-upgrade is running in the background…`):e.state===`failed`?(x(),D.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${ye} ≠ ${n}`,`- Error: ${e.error??`unknown`}`)):(x(),D.push(``,`### ⬆ Upgrade Available`,`- Server v${ye} ≠ ${n}`,`- Auto-upgrade triggered — check again shortly.`))}g.length>0&&D.push(``,`### ⚠ Warnings`,...g.map(e=>`- ${e}`));let Se=L_();if(Se.length>0){let e=Se.sort((e,t)=>t.callCount-e.callCount);D.push(``,`### Tool Usage This Session`,``),D.push(`| Tool | Calls | Tokens In | Tokens Out | Errors | Avg Latency |`),D.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);D.push(`| ${t.tool} | ${t.callCount} | ${e.toLocaleString()} | ${n.toLocaleString()} | ${t.errorCount} | ${r}ms |`)}}let A=P_();A.callCount>0&&(D.push(``),D.push(`### Session Token Usage`),D.push(`- Tool calls: ${A.callCount}`),D.push(`- Input chars: ${A.totalInputChars.toLocaleString()}`),D.push(`- Output chars: ${A.totalOutputChars.toLocaleString()}`),D.push(`- Est. input tokens: ${Math.round(A.totalInputChars/4).toLocaleString()}`),D.push(`- Est. total tokens: ${Math.round((A.totalInputChars+A.totalOutputChars)/4).toLocaleString()}`));let Ce=B_();if(Ce.bufferSize>=10){let e=Ce.state===`healthy`?`🟢`:Ce.state===`degraded`?`🔴`:`🟡`;D.push(``,`### Auto-GC: ${e} ${Ce.state}`),D.push(`- p95 latency: ${Ce.p95}ms | buffer: ${Ce.bufferSize} samples`),Ce.gcCount>0&&D.push(`- GC cycles triggered: ${Ce.gcCount}`)}if(l){let e=l.getStats();if(e.totalSubscribers>0){D.push(``,`### 🔌 Hooks (EventBus Subscribers)`),D.push(`- Total subscribers: ${e.totalSubscribers}`);for(let[t,n]of Object.entries(e.byEvent))D.push(` - ${t}: ${n} subscriber(s)`);for(let t of e.subscriptions)D.push(` - ${t.name} (${t.eventType}, ${t.policy})`);if(e.autoDisabled.length>0){D.push(``),D.push(` **Auto-disabled subscribers:**`);for(let t of e.autoDisabled)D.push(` - ${t.name} (${t.id}): ${t.reason}`)}}}if(u&&u.size>0){let e=u.getStats();D.push(``,`### 🪝 Decision Hooks`),D.push(`- Total hooks: ${e.count}`);for(let t of e.hooks){let e=t.decisionTypes.join(`, `);D.push(` - ${t.id} (order=${t.order}, policy=${t.failurePolicy}, types=[${e}])`)}}if(d){let e=d.getStats();D.push(``,`### 👁 Observations`),D.push(`- Total observations: ${e.totalObservations}`),D.push(` - Success: ${e.byError.success}, Error: ${e.byError.error}`),D.push(` - Artifacts stored: ${e.artifactCount}`),D.push(` - Truncations: ${e.truncationCount}`),D.push(` - Store entries: ${e.storeSize}`);let t=Object.entries(e.byOrigin);t.length>0&&D.push(` - By origin: ${t.map(([e,t])=>`${e}=${t}`).join(`, `)}`)}if(f){let e=f.getStats();D.push(``,`### 🧩 Extractors`),D.push(`- Total extractors: ${e.count}`);for(let[t,n]of Object.entries(e.byName))D.push(` - ${t} (${n.tools} tool(s), maxFacts: ${n.maxFactsPerEvent??`default`})`)}if(p){let e=p.getStats();if(D.push(``,`### 🏆 Promotion Engine`),D.push(`- Total evaluated: ${e.totalEvaluated}`),D.push(`- Promoted: ${e.promoted}`),D.push(`- Held: ${e.held}`),D.push(`- Rejected: ${e.rejected}`),D.push(`- Superseded: ${e.superseded}`),D.push(`- Decayed: ${e.decayed}`),D.push(`- Distinct facts tracked: ${e.observedFacts}`),e.recentDecisions.length>0){D.push(` Recent decisions:`);for(let t of e.recentDecisions.slice(-5))D.push(` - ${t.decision.status}: "${t.factTitle}" (${t.decision.reason.slice(0,80)})`)}}if(m){let e=m.getStats();D.push(``,`### 📋 Workspace Skill`),D.push(`- **Skill exists**: ${e.skillExists?`✅`:`❌`}`),D.push(`- **Stale**: ${e.isStale?`⚠ Yes — regenerating on next trigger`:`✅ Fresh`}`),D.push(`- **Last compiled**: ${e.lastCompiledAt?new Date(e.lastCompiledAt).toLocaleString():`Never`}`),D.push(`- **Version**: ${e.skillVersion}`),D.push(`- **Total compiles**: ${e.totalCompiles}`),e.failedCompiles>0&&D.push(`- **Failed compiles**: ${e.failedCompiles}`),e.skillSize>0&&D.push(`- **Skill size**: ${e.skillSize} bytes`),e.isCompiling&&D.push(`- ⏳ **Currently compiling**`),e.pendingRegeneration&&D.push(`- ⏳ **Regeneration pending**`);let t=m?.getWarnings()??[];if(t.length>0){D.push(`- **Quality warnings (${t.length})**:`);for(let e of t.slice(0,5))D.push(` - ${e}`);t.length>5&&D.push(` - ... and ${t.length-5} more`)}D.push(``," Call `skill_view('<ws-name>')` to load workspace context.")}{let e=kt();(e.cacheSize>0||e.refReuseCount>0)&&(D.push(``,`### 🔄 Ref Reuse`),D.push(`- **Refs stored**: ${e.refStoreCount}`),D.push(`- **Refs reused**: ${e.refReuseCount}`),e.refStaleCount>0&&D.push(`- **⚠ Stale refs detected**: ${e.refStaleCount}`),D.push(`- **Cache entries**: ${e.cacheSize}`))}let we=D.join(`
3037
+ `),j=fe>=H_,Te=[a?.onboardDir?gn(F(a.onboardDir,`..`)):void 0,a?.skillDir].filter(e=>typeof e==`string`&&e.length>0);Te[0];let Ee=e||j?await ee(r,c,void 0,Te.length>0?Te:void 0):void 0,N=ie.length>0?ie.map(e=>({id:e.id,path:e.path,eventCount:e.eventCount,pendingFiles:e.pendingFiles??[]})):void 0,De={totalRecords:y.totalRecords,totalFiles:y.totalFiles,lastIndexedAt:y.lastIndexedAt??null,onboarded:re,onboardDir:O,contentTypes:y.contentTypeBreakdown,wasmAvailable:!!tr.get(),wasmDiagnostics:er.get(),graphStats:T,curatedCount:E,serverVersion:ye,scaffoldVersion:ve??null,workspaceScaffoldVersion:k??null,upgradeAvailable:be||xe,storeBackend:a?.store?.backend,storeDiagnostics:ue??null,contextPressure:ae,nextAction:ce,workspace_skill:(()=>{if(!m)return null;try{let e=m.getStats(),t=m?.getWarnings()??[],n=e.skillExists?t.length>0?`warn`:`pass`:`fallback`;return{exists:e.skillExists,version:e.skillVersion,fresh:!e.isStale,quality:n,warnings:t,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:N,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},...Ee===void 0?{}:{prelude:Ee}};return{content:[{type:`text`,text:we+(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:De}}catch(e){return V_.error(`Status failed`,j(e)),J(`INTERNAL`,`Status check failed: ${e instanceof Error?e.message:String(e)}`)}}))}const tv=k(`tools`);function nv(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 rv(e){let t=W(`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:L.array(L.string().max(2e3)).min(1).max(5).describe('Search queries (1–5). Single: `["react hooks"]`. Multiple searched in parallel.'),limit:L.number().min(1).max(20).default(5).describe(`Max results per query`),site:L.string().optional().describe(`Restrict to domain (e.g., "docs.aws.amazon.com")`),provider:L.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},Y(`web_search`,async({queries:e,limit:t,site:n,provider:r})=>{let i=e,a=async e=>{let i=await Ln({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(`
3038
+ `)};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 tv.error(`Web search failed`,j(e)),J(`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);tv.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(`
3030
3039
 
3031
- `);return c===o.length?J(`INTERNAL`,u):{content:[{type:`text`,text:u}]}}))}function J_(e){let t=W(`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:ms,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},Y(`measure`,async({path:e,extensions:t,include_hidden:n,max_tokens:r})=>{try{let i=await Gt({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?F(a.join(`
3040
+ `);return c===o.length?J(`INTERNAL`,u):{content:[{type:`text`,text:u}]}}))}function iv(e){let t=W(`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:_s,inputSchema:{path:L.string().describe(`File or directory path to measure`),extensions:L.array(L.string()).optional().describe(`File extensions to include (default: .ts,.tsx,.js,.jsx)`),include_hidden:L.boolean().optional().describe(`Include hidden trees such as .generated and .cache. Default false.`),max_tokens:L.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`)},annotations:t.annotations},Y(`measure`,async({path:e,extensions:t,include_hidden:n,max_tokens:r})=>{try{let i=await Wt({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?I(a.join(`
3032
3041
  `),r):a.join(`
3033
- `)}],structuredContent:o}}catch(e){return K_(e)?(G_.warn(`Measure failed`,{error:`File not found`}),J(`NOT_FOUND`,`File not found`)):(G_.error(`Measure failed`,A(e)),J(`INTERNAL`,`Measure failed: ${e instanceof Error?e.message:String(e)}`))}}))}function Y_(e){let t=W(`env`);e.registerTool(`env`,{title:t.title,description:`Get system and runtime environment info. Sensitive env vars are redacted by default.`,outputSchema:hs,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},Y(`env`,async({include_env:e,filter_env:t,show_sensitive:n})=>{let r=xt({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(`
3034
- `)}],structuredContent:a}}))}const X_=O(`register-tools`);function Z_(e){return t=>!e||e.has(t)}function Q_(e){try{let t=N(e,`.flows`);if(!j(t))return null;let n=Oe(t,{withFileTypes:!0});for(let e of n){if(!e.isDirectory())continue;let n=N(t,e.name,`meta.json`);if(j(n)&&JSON.parse(M(n,`utf-8`)).status===`active`)return e.name}}catch{return null}return null}let $_=null,ev=null;function tv(){$_?.(),$_=null}function nv(){return ev?.flush()??Promise.resolve()}function rv(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 go,f=r.sources[0]?.path??Te(),p=ye(f),m={activeSlug:null};m.activeSlug=Q_(f);let h=new ja(N(r.stateDir??``,`flow-context`),()=>m.activeSlug),g=new ga;g.register(ri()),g.register(la),g.register(bi),g.register(Ji),g.register(ui),g.register(ii),g.register(ai),g.register(oa),g.register(si),g.register(pa),g.register(qi(()=>m.activeSlug?{active:!0,slug:m.activeSlug}:null)),g.register(Qi),g.register(da),g.register(_i),g.register(Xi);let _=new Va,v=n.eventBus,y=r.skillDir?new Wa(r.skillDir,{debounceMs:5e3},v??void 0,n.curated,void 0,f):null;y&&y.compileNow(`startup`).catch(e=>{X_.warn(`Startup skill compile failed — will retry on next trigger`,{error:String(e)})});let b=new ya(g,n.curated,{},h,_,v??void 0);ev=b;let x=u??ls(r,[...Ea,...Mo],U,Po(r)),S=Z_(x),C=new Set([...x].filter(e=>!vf.includes(e)&&!Na.has(e))),w=new La;d.use(Lo(),{order:1,name:`structured-content-guard`}),d.use(Aa(ka(r.tokenBudget)),{order:90,name:`compression`});let T=d.decisionHookRegistry;T.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`})}),T.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`})}),T.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`})}),T.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`})}),T.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`})}),T.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`})}),T.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`})}),T.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`})}),T.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 E=new yo(r.metricThresholds);Jo(t,d,r.toolPrefix??``,n.eventBus,()=>{let e=r.sources[0]?.path??Te();try{return ye(e)}catch{return`partition:${Ke(`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{E.incrementCounter(`tool.call`,{tool:t.toolName}),t.isError&&E.incrementCounter(`tool.error`,{tool:t.toolName}),b.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{C.has(t.toolName)&&w.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-CrQU_HVm.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`)&&(E.incrementCounter(`fact.total`),(e?.status===`unchanged`||e?.result===`unchanged`)&&E.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};X_.info(`Session started`,n)},name:`session-lifecycle`}),y&&($_=y.subscribeToEventBus(v)));let ee=[...x].filter(e=>No.has(e)?jo.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},te={onboardComplete:n.onboardComplete,onboardTimestamp:n.onboardTimestamp},ne={search:[{name:`search`,register:()=>qg(t,n.embedder,n.store,n.graphStore,n.bridge,n.evolutionCollector,o,n.stateStore,r.memory?.retention,r.memory?.consolidation,p)},{name:`find`,register:()=>al(t,n.embedder,n.store)},{name:`symbol`,register:()=>ol(t,n.embedder,n.store,n.graphStore,D)},{name:`trace`,register:()=>sl(t,n.embedder,n.store,n.graphStore,D)},{name:`scope_map`,register:()=>il(t,n.embedder,n.store,D)},{name:`file_summary`,register:()=>yl(t,n.embedder,n.fileCache)}],analysis:[{name:`analyze`,register:()=>hc(t,n.store,n.embedder)}],knowledge:[{name:`knowledge`,register:()=>rf(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:()=>Cg(t,a)}],compression:[{name:`digest`,register:()=>Tu(t,n.embedder)}],forge:[{name:`forge_ground`,register:()=>Eu(t,n.embedder,n.store)},{name:`evidence_map`,register:()=>wu(t)}],presentation:[{name:`present`,register:()=>xg(t,i)}],execution:[{name:`check`,register:()=>fl(t,D,r.tokenBudget)},{name:`test_run`,register:()=>ml(t,D)},{name:`eval`,register:()=>pl(t)},{name:`audit`,register:()=>bc(t,n.store,n.embedder)}],web:[{name:`browser`,register:()=>Gn(t,r)},{name:`web_fetch`,register:()=>Fu(t)},{name:`web_search`,register:()=>q_(t)}],manipulation:[{name:`rename`,register:()=>cf(t,r)},{name:`restore`,register:()=>kg(t)},{name:`codemod`,register:()=>lf(t,r)}],session:[{name:`session`,register:()=>d_(t,n.stateStore,o)}],git:[{name:`git`,register:()=>Ou(t)},{name:`parse_output`,register:()=>hl(t)}],process:[{name:`process`,register:()=>Pu(t)},{name:`delegate`,register:()=>gl(t,o)}],system:[{name:`config`,register:()=>qc(t,r)},{name:`status`,register:()=>W_(t,n.store,n.graphStore,n.curated,te,r,s,c,n.stateStore,n.eventBus,d.decisionHookRegistry,d.getObservationCompressor(),g,_,y)},{name:`reindex`,register:()=>Tg(t,n.indexer,r,n.curated,n.store,a,s)},{name:`onboard`,register:()=>Bf(t,n.store,n.embedder,r,te,D,o,a)},{name:`graph`,register:()=>Mu(t,n.graphStore)},{name:`replay`,register:()=>Dg(t)}],utilities:[{name:`measure`,register:()=>J_(t)},{name:`env`,register:()=>Y_(t)}],queue:[{name:`queue`,register:()=>Hf(t)}],flow:[{name:`flow`,register:()=>Su(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:y},e=>{m.activeSlug=e})}]};for(let[,e]of Object.entries(ne))for(let{name:t,register:n}of e)S(t)&&n();n.bridge&&(S(`er_push`)&&wc(t,n.bridge,n.evolutionCollector),S(`er_pull`)&&Tc(t,n.bridge),S(`er_sync_status`)&&Ec(t,n.bridge)),n.policyStore&&S(`er_update_policy`)&&Gf(t,n.policyStore),n.evolutionCollector&&S(`er_evolve_review`)&&ul(t,n.evolutionCollector),vf.some(e=>S(e))&&yf(t,r,ee,n.onboardComplete),Ao(t,n.store,n.curated,r.skillDir,n.eventBus,d.decisionHookRegistry,y)}function iv(e,t,n){let r=Z_(n);r(`check`)&&fl(e,void 0,t.tokenBudget),r(`eval`)&&pl(e),r(`test_run`)&&ml(e),r(`parse_output`)&&hl(e),r(`delegate`)&&gl(e),r(`git`)&&Ou(e),r(`rename`)&&cf(e,t),r(`codemod`)&&lf(e,t),r(`restore`)&&kg(e),r(`queue`)&&Hf(e),r(`process`)&&Pu(e),r(`web_fetch`)&&Fu(e),vf.some(e=>r(e))&&yf(e,t,[...n??new Set(Ea)]),r(`evidence_map`)&&wu(e),r(`present`)&&xg(e),r(`browser`)&&Gn(e,t),r(`produce_knowledge`)&&Cg(e),r(`replay`)&&Dg(e),r(`status`)&&U_(e),r(`flow`)&&Su(e,t),r(`web_search`)&&q_(e),r(`measure`)&&J_(e),r(`env`)&&Y_(e)}export{W as S,Ya as _,eg as a,U as b,Cc as c,Lo as d,Uo as f,go as g,Po as h,iv as i,ls as l,Mo as m,nv as n,Af as o,Fo as p,rv as r,Nf as s,tv as t,Jo as u,Ea as v,Da as x,Oa as y};
3042
+ `)}],structuredContent:o}}catch(e){return nv(e)?(tv.warn(`Measure failed`,{error:`File not found`}),J(`NOT_FOUND`,`File not found`)):(tv.error(`Measure failed`,j(e)),J(`INTERNAL`,`Measure failed: ${e instanceof Error?e.message:String(e)}`))}}))}function av(e){let t=W(`env`);e.registerTool(`env`,{title:t.title,description:`Get system and runtime environment info. Sensitive env vars are redacted by default.`,outputSchema:vs,inputSchema:{include_env:L.boolean().default(!1).describe(`Include environment variables`),filter_env:L.string().optional().describe(`Filter env vars by name substring`),show_sensitive:L.boolean().default(!1).describe(`Show sensitive values (keys, tokens, etc.) — redacted by default`)},annotations:t.annotations},Y(`env`,async({include_env:e,filter_env:t,show_sensitive:n})=>{let r=bt({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(`
3043
+ `)}],structuredContent:a}}))}const ov=k(`register-tools`);function sv(e){return t=>!e||e.has(t)}function cv(e){try{let t=P(e,`.flows`);if(!M(t))return null;let n=De(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 lv=null,uv=null;function dv(){lv?.(),lv=null}function fv(){return uv?.flush()??Promise.resolve()}function pv(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 yo,f=r.sources[0]?.path??we(),p=ve(f),m={activeSlug:null};m.activeSlug=cv(f);let h=new Ma(P(r.stateDir??``,`flow-context`),()=>m.activeSlug),g=new ga;g.register(ri()),g.register(la),g.register(bi),g.register(Ji),g.register(ui),g.register(ii),g.register(ai),g.register(oa),g.register(si),g.register(pa),g.register(qi(()=>m.activeSlug?{active:!0,slug:m.activeSlug}:null)),g.register(Qi),g.register(da),g.register(_i),g.register(Xi);let _=new Ha(void 0,n.stateStore),v=n.eventBus,y=r.skillDir?new qa(r.skillDir,{debounceMs:5e3},v??void 0,n.curated,void 0,f):null;y&&y.compileNow(`startup`).catch(e=>{ov.warn(`Startup skill compile failed — will retry on next trigger`,{error:String(e)})});let b=new ya(g,n.curated,{},h,_,v??void 0,n.stateStore);uv=b;let x=u??fs(r,[...Da,...Fo],Ea,Lo(r)),S=sv(x),C=new Set([...x].filter(e=>!Of.includes(e)&&!Pa.has(e))),w=new Ra;d.use(Bo(),{order:1,name:`structured-content-guard`}),d.use(ja(Aa(r.tokenBudget)),{order:90,name:`compression`});let T=d.decisionHookRegistry;T.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`})}),T.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`})}),T.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`})}),T.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`})}),T.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`})}),T.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`})}),T.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`})}),T.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`})}),T.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 E=new So(r.metricThresholds);Zo(t,d,r.toolPrefix??``,n.eventBus,()=>{let e=r.sources[0]?.path??we();try{return ve(e)}catch{return`partition:${Ge(`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{E.incrementCounter(`tool.call`,{tool:t.toolName}),t.isError&&E.incrementCounter(`tool.error`,{tool:t.toolName}),b.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{C.has(t.toolName)&&w.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`)&&(E.incrementCounter(`fact.total`),(e?.status===`unchanged`||e?.result===`unchanged`)&&E.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};ov.info(`Session started`,n)},name:`session-lifecycle`}),y&&(lv=y.subscribeToEventBus(v)));let D=[...x].filter(e=>Io.has(e)?Po.includes(e)?!!n.bridge:e===`er_update_policy`?!!n.policyStore:e===`er_evolve_review`?!!n.evolutionCollector:!1:!0),O={store:n.store,graphStore:n.graphStore,embedder:n.embedder},ee={onboardComplete:n.onboardComplete,onboardTimestamp:n.onboardTimestamp},te={search:[{name:`search`,register:()=>r_(t,n.embedder,n.store,n.graphStore,n.bridge,n.evolutionCollector,o,n.stateStore,r.memory?.retention,r.memory?.consolidation,p)},{name:`find`,register:()=>hl(t,n.embedder,n.store)},{name:`symbol`,register:()=>gl(t,n.embedder,n.store,n.graphStore,O)},{name:`trace`,register:()=>_l(t,n.embedder,n.store,n.graphStore,O)},{name:`scope_map`,register:()=>ml(t,n.embedder,n.store,O)},{name:`file_summary`,register:()=>kl(t,n.embedder,n.fileCache)}],analysis:[{name:`analyze`,register:()=>wc(t,n.store,n.embedder)},{name:`blast_radius`,register:()=>Tc(t,n.store,n.embedder,n.graphStore,O)}],knowledge:[{name:`knowledge`,register:()=>mf(t,n.curated,n.policyStore,n.evolutionCollector,a,void 0,n.stateStore,r.memory?.retention,r.memory?.supersession,r.memory?.consolidation,r.memory?.lessons,O,n.graphStore)},{name:`produce_knowledge`,register:()=>Ng(t,a)}],compression:[{name:`digest`,register:()=>Fu(t,n.embedder)}],forge:[{name:`forge_ground`,register:()=>Iu(t,n.embedder,n.store)},{name:`evidence_map`,register:()=>Pu(t)}],presentation:[{name:`present`,register:()=>jg(t,i)}],execution:[{name:`check`,register:()=>Sl(t,O,r.tokenBudget)},{name:`test_run`,register:()=>wl(t,O)},{name:`eval`,register:()=>Cl(t)},{name:`audit`,register:()=>Ac(t,n.store,n.embedder)}],web:[{name:`browser`,register:()=>Wn(t,r)},{name:`web_fetch`,register:()=>Gu(t)},{name:`web_search`,register:()=>rv(t)}],manipulation:[{name:`rename`,register:()=>vf(t,r)},{name:`restore`,register:()=>zg(t)},{name:`codemod`,register:()=>yf(t,r)}],session:[{name:`session`,register:()=>x_(t,n.stateStore,o)}],git:[{name:`git`,register:()=>Ru(t)},{name:`parse_output`,register:()=>Tl(t)}],process:[{name:`process`,register:()=>Wu(t)},{name:`delegate`,register:()=>El(t,o)}],system:[{name:`config`,register:()=>rl(t,r)},{name:`status`,register:()=>ev(t,n.store,n.graphStore,n.curated,ee,r,s,c,n.stateStore,n.eventBus,d.decisionHookRegistry,d.getObservationCompressor(),g,_,y)},{name:`reindex`,register:()=>Fg(t,n.indexer,r,n.curated,n.store,a,s,n.eventBus)},{name:`onboard`,register:()=>Xf(t,n.store,n.embedder,r,ee,O,o,a)},{name:`graph`,register:()=>Hu(t,n.graphStore)},{name:`replay`,register:()=>Lg(t)}],utilities:[{name:`measure`,register:()=>iv(t)},{name:`env`,register:()=>av(t)}],queue:[{name:`queue`,register:()=>Qf(t)}],flow:[{name:`flow`,register:()=>Mu(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:y},e=>{m.activeSlug=e})}]};for(let[,e]of Object.entries(te))for(let{name:t,register:n}of e)S(t)&&n();n.bridge&&(S(`er_push`)&&Pc(t,n.bridge,n.evolutionCollector),S(`er_pull`)&&Fc(t,n.bridge),S(`er_sync_status`)&&Ic(t,n.bridge)),n.policyStore&&S(`er_update_policy`)&&tp(t,n.policyStore),n.evolutionCollector&&S(`er_evolve_review`)&&bl(t,n.evolutionCollector),Of.some(e=>S(e))&&kf(t,r,D,n.onboardComplete),No(t,n.store,n.curated,r.skillDir,n.eventBus,d.decisionHookRegistry,y)}function mv(e,t,n){let r=sv(n);r(`check`)&&Sl(e,void 0,t.tokenBudget),r(`eval`)&&Cl(e),r(`test_run`)&&wl(e),r(`parse_output`)&&Tl(e),r(`delegate`)&&El(e),r(`git`)&&Ru(e),r(`rename`)&&vf(e,t),r(`codemod`)&&yf(e,t),r(`restore`)&&zg(e),r(`queue`)&&Qf(e),r(`process`)&&Wu(e),r(`web_fetch`)&&Gu(e),Of.some(e=>r(e))&&kf(e,t,[...n??new Set(Da)]),r(`evidence_map`)&&Pu(e),r(`present`)&&jg(e),r(`browser`)&&Wn(e,t),r(`produce_knowledge`)&&Ng(e),r(`replay`)&&Lg(e),r(`status`)&&$_(e),r(`flow`)&&Mu(e,t),r(`web_search`)&&rv(e),r(`measure`)&&iv(e),r(`env`)&&av(e)}export{W as S,Qa as _,ug as a,Ea as b,Nc as c,Bo as d,Ko as f,yo as g,Lo as h,mv as i,fs as l,Fo as m,fv as n,Bf as o,Ro as p,pv as r,Uf as s,dv as t,Zo as u,Da as v,Oa as x,ka as y};