@vpxa/aikit 0.1.341 → 0.1.343
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/postinstall-managed-launcher.mjs +86 -0
- package/package.json +2 -1
- package/packages/blocks-core/dist/index.mjs +3 -1
- package/packages/browser/dist/index.js +4 -3
- package/packages/cli/dist/index.js +16 -16
- package/packages/flows/dist/index.d.ts +1 -1
- package/packages/flows/dist/index.js +2 -2
- package/packages/server/dist/bin.js +1 -1
- package/packages/server/dist/index.js +1 -1
- package/packages/server/dist/prelude-CYbX3SD5.js +1 -0
- package/packages/server/dist/prelude-SM1mxlBF.js +2 -0
- package/packages/server/dist/{server-LFvVKN0j.js → server-QHpy3Vo9.js} +56 -70
- package/packages/server/dist/{server-DU6Jsp0h.js → server-WTo9MN4i.js} +56 -70
- package/packages/server/dist/{server-http-DhxqJtr-.js → server-http-Cxq-Bg3K.js} +1 -1
- package/packages/server/dist/{server-http-BNooFgZY.js → server-http-fvgPEVn5.js} +1 -1
- package/packages/server/dist/{server-stdio-yLODmHTh.js → server-stdio-DiT0r0Q3.js} +1 -1
- package/packages/server/dist/{server-stdio-qlRhmE4f.js → server-stdio-vC20j-3j.js} +1 -1
- package/packages/server/dist/version-check-2-tfmCnt.js +2 -0
- package/packages/server/dist/version-check-BKtLrLhw.js +1 -0
- package/packages/server/viewers/architecture-static.html +802 -789
- package/packages/server/viewers/c4-viewer.html +27 -27
- package/packages/server/viewers/canvas.html +83 -83
- package/packages/server/viewers/process-flow-static.html +13 -2
- package/packages/server/viewers/task-plan-static.html +7 -7
- package/packages/server/viewers/tour-viewer.html +3 -3
- package/scaffold/dist/adapters/_shared.mjs +2 -1
- package/scaffold/dist/adapters/claude-code.mjs +7 -10
- package/scaffold/dist/adapters/copilot.mjs +14 -16
- package/scaffold/dist/adapters/gemini.mjs +6 -8
- package/scaffold/dist/adapters/hermes-agent.mjs +14 -16
- package/scaffold/dist/adapters/hermes.mjs +5 -7
- package/scaffold/dist/adapters/opencode.mjs +7 -9
- package/scaffold/dist/definitions/flows.mjs +84 -138
- package/scaffold/dist/definitions/skills/browser-use.mjs +63 -33
- package/scaffold/dist/definitions/skills/c4-architecture.mjs +1 -1
- package/scaffold/dist/definitions/skills/docs.mjs +1 -1
- package/packages/server/dist/prelude-CQibCk9Y.js +0 -1
- package/packages/server/dist/prelude-ClS2lMwX.js +0 -2
- package/packages/server/dist/version-check-Bx7ump1d.js +0 -1
- package/packages/server/dist/version-check-obaVU70k.js +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{n as e,t}from"./bin.js";import{a as n,c as r,d as i,f as a,h as o,i as s,l as c,m as l,n as u,o as d,p as f,r as p,s as m,u as h}from"./supersession-DO_ZROFl.js";import{a as g,i as _,n as v,o as y,r as b,reconfigureForWorkspace as x,t as S}from"./config-Bx85fwRX.js";import{n as C,r as w}from"./resolve-sibling-DrGKPpb0.js";import{n as T,r as E}from"./evolution-DWaEE6XW.js";import{a as D,i as O,n as k,r as ee,s as te,t as ne}from"./promotion-RbjKfC88.js";import{t as re}from"./repair-json-D4mft_HA.js";import{autoUpgradeScaffold as ie,cleanupOldVersions as ae,getCurrentVersion as oe,getUpgradeState as se}from"./version-check-
|
|
2
|
+
import{n as e,t}from"./bin.js";import{a as n,c as r,d as i,f as a,h as o,i as s,l as c,m as l,n as u,o as d,p as f,r as p,s as m,u as h}from"./supersession-DO_ZROFl.js";import{a as g,i as _,n as v,o as y,r as b,reconfigureForWorkspace as x,t as S}from"./config-Bx85fwRX.js";import{n as C,r as w}from"./resolve-sibling-DrGKPpb0.js";import{n as T,r as E}from"./evolution-DWaEE6XW.js";import{a as D,i as O,n as k,r as ee,s as te,t as ne}from"./promotion-RbjKfC88.js";import{t as re}from"./repair-json-D4mft_HA.js";import{autoUpgradeScaffold as ie,cleanupOldVersions as ae,getCurrentVersion as oe,getUpgradeState as se}from"./version-check-2-tfmCnt.js";import{createRequire as ce}from"node:module";import{fileURLToPath as le}from"node:url";import{promisify as ue}from"node:util";import{AIKIT_PATHS as A,CONTENT_TYPES as de,CircuitBreaker as fe,EMBEDDING_DEFAULTS as pe,HealthBus as me,KNOWLEDGE_ORIGINS as he,MODEL_REGISTRY as ge,SOURCE_TYPES as _e,TOKEN_BUDGETS as ve,addLogListener as ye,computePartitionKey as be,createLogger as j,getGlobalDataDir as xe,getPartitionDir as Se,isUserInstalled as Ce,listWorkspaces as we,serializeError as M}from"../../core/dist/index.js";import{existsSync as N,mkdirSync as Te,readFileSync as P,readdirSync as Ee,renameSync as De,rmSync as Oe,statSync as ke,unlinkSync as Ae,writeFileSync as je}from"node:fs";import{basename as Me,dirname as Ne,isAbsolute as Pe,join as F,relative as Fe,resolve as I,sep as Ie}from"node:path";import{mkdir as Le,readFile as Re,readdir as ze,rm as Be,stat as Ve,unlink as He,writeFile as Ue}from"node:fs/promises";import{createHash as We,randomBytes as Ge,randomUUID as Ke,timingSafeEqual as qe}from"node:crypto";import{FileCache as Je,acquireLease as Ye,addToWorkset as Xe,audit as Ze,bookendReorder as Qe,changelog as $e,check as et,checkpointDiff as tt,checkpointGC as nt,checkpointHistory as rt,checkpointLatest as it,checkpointList as at,checkpointLoad as ot,checkpointSave as st,codemod as ct,compact as lt,compressTerminalOutput as ut,createRestorePoint as dt,createSearchSuccessResponse as ft,dataTransform as pt,delegate as mt,delegateListModels as ht,deleteWorkset as gt,diffParse as _t,digest as vt,encode as yt,envInfo as bt,evaluate as xt,evidenceMap as St,fileSummary as Ct,find as wt,findDeadSymbols as Tt,findExamples as Et,forgeClassify as Dt,forgeGround as Ot,getWorkset as kt,gitContext as At,graphAugmentSearch as jt,graphQuery as Mt,guide as Nt,health as Pt,httpRequest 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,regexTest as un,releaseLease as dn,removeFromWorkset as fn,rename as pn,replayAppend as mn,replayClear as hn,replayList as gn,replayTrim 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,stratumCard as jn,summarizeCheckResult as Mn,symbol as Nn,testRun as Pn,timeUtils as Fn,trace as In,truncateToTokenBudget as L,watchList as Ln,watchStart as Rn,watchStop as zn,webFetch as Bn,webSearch as Vn}from"../../tools/dist/index.js";import{homedir as Hn,tmpdir as Un}from"node:os";import{McpServer as Wn,ResourceTemplate as Gn}from"@modelcontextprotocol/sdk/server/mcp.js";import{RootsListChangedNotificationSchema as Kn}from"@modelcontextprotocol/sdk/types.js";import{buildFormSchema as qn,field as Jn,normalizeResponse as Yn}from"../../elicitation/dist/index.js";import{completable as Xn}from"@modelcontextprotocol/sdk/server/completable.js";import{z as R}from"zod";import{getEngine as Zn,registerBrowserTools as Qn}from"../../browser/dist/index.js";import{BlastRadiusAnalyzer as $n,DependencyAnalyzer as er,DiagramGenerator as tr,EntryPointAnalyzer as nr,KnowledgeProducer as rr,PatternAnalyzer as ir,StructureAnalyzer as ar,SymbolAnalyzer as or}from"../../analyzers/dist/index.js";import{WasmDiagnostics as sr,WasmRuntime as cr,initializeWasm as lr}from"../../chunker/dist/index.js";import{ERCache as ur,ERClient as dr,EvolutionCollector as fr,PolicyStore as pr,PushAdapter as mr,mergeResults as hr}from"../../enterprise-bridge/dist/index.js";import"../../tool-routing/dist/index.mjs";import{RESOURCE_MIME_TYPE as gr,getUiCapability as _r,registerAppResource as vr,registerAppTool as yr}from"@modelcontextprotocol/ext-apps/server";import{SqliteGraphStore as br,allMigrations as xr,createSqliteAdapter as Sr,createStateStore as Cr,createStore as wr,runMigrations as Tr}from"../../store/dist/index.js";import{exec as Er,execFile as Dr,execSync as Or}from"node:child_process";import{TemplateRegistry as kr,buildShell as Ar,dashboardTemplateDefinition as jr,defaultRegistry as Mr,flameGraphTemplateDefinition as Nr,isError as Pr,isResult as Fr,kanbanTemplateDefinition as Ir,listSortTemplateDefinition as Lr,renderSurface as Rr}from"../../blocks-core/dist/index.mjs";import{createServer as zr}from"node:http";import{EmbedderProxy as Br}from"../../embeddings/dist/index.js";import{FileHashCache as Vr,IncrementalIndexer as Hr}from"../../indexer/dist/index.js";import{AsyncLocalStorage as Ur}from"node:async_hooks";function Wr(e){function t(){return!!e.server?.getClientCapabilities?.()?.elicitation}async function n(n,r){if(t())try{let t=await e.server.elicitInput({message:n,requestedSchema:r});return Yn(t?{action:t.action,content:t.content}:void 0)}catch{return}}return{get available(){return t()},async ask(e){return await n(e.message,e.schema)||{action:`decline`}},async confirm(e){let t=await n(e,qn({confirmed:Jn.confirm(e)}));return t?.action===`accept`&&t.content?.confirmed===!0},async selectOne(e,t){let r=await n(e,qn({selection:Jn.select(`Choose one`,t)}));if(r?.action!==`accept`)return null;let i=r.content?.selection;return typeof i==`string`?i:null},async selectMany(e,t){let r=await n(e,qn({selections:Jn.multi(`Choose one or more`,t)}));if(r?.action!==`accept`)return[];let i=r.content?.selections;return Array.isArray(i)?i:[]},async promptText(e,t){let r=await n(e,qn({text:Jn.text(e,{description:t})}));if(r?.action!==`accept`)return null;let i=r.content?.text;return typeof i==`string`?i:null}}}const Gr={debug:`debug`,info:`info`,warn:`warning`,error:`error`};function Kr(e){return ye(({level:t,component:n,message:r,data:i})=>{try{Promise.resolve(e.sendLoggingMessage({level:Gr[t],logger:n,data:i?{message:r,...i}:r})).catch(()=>{})}catch{}})}const qr=3e4,Jr=new Map;function Yr(e,t,n){let r=Jr.get(e);if(r&&Date.now()<r.expires)return Promise.resolve(r.data);let i=n();return Promise.resolve(i).then(n=>(Jr.set(e,{data:n,expires:Date.now()+t}),n))}function Xr(){Jr.clear()}function Zr(e,t){return Yr(`curated-paths`,qr,async()=>e.listPaths({limit:5e3})).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Qr(e,t){return Yr(`file-paths`,qr,()=>e.listSourcePaths()).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function $r(e,t){return Yr(`symbol-names`,qr,async()=>(await e.findNodes({type:`symbol`,limit:500})).map(e=>e.name)).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function ei(e,t){return t?On(t).map(e=>e.key).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function ti(e){return Wt().map(e=>e.name).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20)}function ni(e,t){return t?at(t).map(e=>e.label).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function ri(e,t,n){if(e.registerPrompt(`ready`,{title:`AI Kit Ready`,description:`AI Kit is ready — quick-start guide for search, onboard, and workflows`},async()=>({messages:[{role:`user`,content:{type:`text`,text:[`AI Kit is ready. Quick start:`,``,'• **New project?** → `onboard({ path: "." })` for full codebase analysis','• **Returning?** → `status({})` then `search({ query: "SESSION CHECKPOINT", origin: "curated" })`','• **Exploring?** → `guide({ goal: "your task" })` for workflow recommendations','• **Quick lookup?** → `search({ query: "your question" })`'].join(`
|
|
3
3
|
`)}}]})),e.registerPrompt(`onboard`,{title:`Onboard Codebase`,description:`Analyze the codebase for first-time onboarding — runs all analyzers and produces a knowledge summary`,argsSchema:{path:R.string().optional().describe(`Path to analyze (default: workspace root)`)}},async({path:e})=>({messages:[{role:`user`,content:{type:`text`,text:[`Run the full onboarding workflow for "${e??`.`}"`,``,`1. \`onboard({ path: "${e??`.`}" })\` — full codebase analysis`,`2. \`produce_knowledge({ path: "${e??`.`}" })\` — generate synthesis`,'3. `knowledge({ action: "remember", ... })` for key curated entries',"4. `status` to verify index health"].join(`
|
|
4
4
|
`)}}]})),e.registerPrompt(`sessionStart`,{title:`Start AI Kit Session`,description:`Initialize an AI Kit session — check status, list knowledge, and resume from last checkpoint`},async()=>({messages:[{role:`user`,content:{type:`text`,text:[`Run the session start protocol:`,``,"1. `status({})` — check AI Kit health and onboard state",'2. `knowledge({ action: "list" })` — see stored knowledge entries','3. `search({ query: "SESSION CHECKPOINT", origin: "curated" })` — resume prior work'].join(`
|
|
5
5
|
`)}}]})),e.registerPrompt(`sessionEnd`,{title:`End AI Kit Session`,description:`Persist decisions and create a session checkpoint before ending`,argsSchema:{summary:R.string().describe(`Brief summary of decisions made, blockers encountered, and next steps`)}},async({summary:e})=>({messages:[{role:`user`,content:{type:`text`,text:[`Run the session end protocol:`,``,'1. `knowledge({ action: "remember", title: "Session checkpoint: '+e.slice(0,60)+`...", content: "`+e.replace(/"/g,`\\"`)+'", category: "session" })` — persist findings',n===`smart`?`2. Smart indexing is active — index refreshes automatically`:"2. `reindex({})` — refresh search index if files changed",`3. Confirm session data saved`].join(`
|
|
@@ -2933,36 +2933,25 @@ None.`:`### Stale Lessons\n${u.map(e=>`- **${e.title}** (\`${e.path}\`) — effe
|
|
|
2933
2933
|
const sendTheme = function() {
|
|
2934
2934
|
const theme = document.documentElement.getAttribute('data-theme');
|
|
2935
2935
|
if (iframe.contentWindow) {
|
|
2936
|
-
iframe.contentWindow.postMessage({ type: 'aikit-theme-change', theme: theme },
|
|
2936
|
+
iframe.contentWindow.postMessage({ type: 'aikit-theme-change', theme: theme }, window.location.origin);
|
|
2937
2937
|
}
|
|
2938
2938
|
};
|
|
2939
2939
|
const observer = new MutationObserver(sendTheme);
|
|
2940
2940
|
observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] });
|
|
2941
2941
|
iframe.addEventListener('load', sendTheme);
|
|
2942
2942
|
})();
|
|
2943
|
-
<\/script>`}function Qh(e){return e.replace(`</head
|
|
2944
|
-
.toolbar, .badge, body > header, body > footer { display: none !important; }
|
|
2945
|
-
body { padding-top: 0 !important; margin-top: 0 !important; }
|
|
2946
|
-
</style>
|
|
2947
|
-
</head>`).replace(`</body>`,`<script>
|
|
2948
|
-
window.addEventListener('message', function(e) {
|
|
2949
|
-
if (e.data && e.data.type === 'aikit-theme-change') {
|
|
2950
|
-
document.documentElement.setAttribute('data-theme', e.data.theme);
|
|
2951
|
-
}
|
|
2952
|
-
});
|
|
2953
|
-
<\/script>
|
|
2954
|
-
</body>`)}function $h(e){if(!e.headersSent)try{e.writeHead(500,{"Content-Type":`text/plain`}),e.end(`Internal Server Error`)}catch{try{e.end()}catch{}}}function eg(e,t){let n=e.headers.referer;return typeof n==`string`&&n.length>0?n:`http://127.0.0.1:${t.port}`}async function tg(e,t){let n=Zn(),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 ng(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 tg(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),$h(e)}}async function rg(e,t){if(!t){Uh(e,503,`CLIPBOARD_CAPTURE_TARGET_MISSING`,`Clipboard target is not ready.`);return}try{let n=await tg(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),Uh(e,500,`CLIPBOARD_CAPTURE_FAILED`,`Clipboard capture failed: ${n}`)}}async function ig(e,t){let n=[];e.on(`data`,e=>n.push(e)),e.on(`end`,async()=>{let e=Buffer.concat(n);if(e.length===0){Uh(t,400,`EMPTY_BODY`,`No image data received.`);return}try{await ag(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),Uh(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),Uh(t,500,`REQUEST_ERROR`,`Request stream error.`)})}async function ag(e){let t=F(Un(),`aikit-clipboard-${Date.now()}-${Ge(4).toString(`hex`)}.png`);je(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)=>{Er(`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)=>{Er(`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)=>{Er(`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)=>{Er(`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{Ae(t)}catch{}}}function og(e,t){return e.replace(/'\/callback'/g,`'/present/${t}/callback'`).replace(/"\/callback"/g,`"/present/${t}/callback"`)}function sg(e,t){return e.replace(/src="\/viewer"/g,`src="/present/${t}/viewer"`)}async function cg(e,t){if(Fg(`<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(`
|
|
2943
|
+
<\/script>`}function Qh(e){return e.replace(`</head>`,`${r_}\n</head>`).replace(`</body>`,`${i_}\n</body>`)}function $h(e){if(!e.headersSent)try{e.writeHead(500,{"Content-Type":`text/plain`}),e.end(`Internal Server Error`)}catch{try{e.end()}catch{}}}function eg(e,t){let n=e.headers.referer;return typeof n==`string`&&n.length>0?n:`http://127.0.0.1:${t.port}`}async function tg(e,t){let n=Zn(),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 ng(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 tg(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),$h(e)}}async function rg(e,t){if(!t){Uh(e,503,`CLIPBOARD_CAPTURE_TARGET_MISSING`,`Clipboard target is not ready.`);return}try{let n=await tg(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),Uh(e,500,`CLIPBOARD_CAPTURE_FAILED`,`Clipboard capture failed: ${n}`)}}async function ig(e,t){let n=[];e.on(`data`,e=>n.push(e)),e.on(`end`,async()=>{let e=Buffer.concat(n);if(e.length===0){Uh(t,400,`EMPTY_BODY`,`No image data received.`);return}try{await ag(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),Uh(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),Uh(t,500,`REQUEST_ERROR`,`Request stream error.`)})}async function ag(e){let t=F(Un(),`aikit-clipboard-${Date.now()}-${Ge(4).toString(`hex`)}.png`);je(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)=>{Er(`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)=>{Er(`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)=>{Er(`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)=>{Er(`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{Ae(t)}catch{}}}function og(e,t){return e.replace(/'\/callback'/g,`'/present/${t}/callback'`).replace(/"\/callback"/g,`"/present/${t}/callback"`)}function sg(e,t){return e.replace(/src="\/viewer"/g,`src="/present/${t}/viewer"`)}async function cg(e,t){if(Fg(`<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(`
|
|
2955
2944
|
`);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=Qh(Tm(t.resolveHtml(),e.data??null,t.injectId,t.transformData)),r=Ih(),i=Ge(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=_h(`viewer`,e.actions??[],r,o,i),c=sg(Ar({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>`,` ${Zh(i)}`,`</div>`].join(`
|
|
2956
2945
|
`),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(`
|
|
2957
|
-
`)],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:vh}),o);Nh.set(o,{callbackSession:s,html:c,viewerHtml:n,hasClientConnected:!1,createdAt:Date.now()});let l=``;try{l=`http://127.0.0.1:${await Lh()}/present/${o}`}catch(t){return Nh.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 Jh(l),setTimeout(()=>{Nh.delete(o),r.removeSession(o)},Dh),{content:[{type:`text`,text:Yh(e,l,`Rendered.`)}],structuredContent:{kind:`rendered`,reason:`no-response-required`}}}async function lg(e){Fg(`<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=Ih(),n=Ge(16).toString(`hex`),r=Rr(e,{transport:`browser`,registry:Jm,blockVendorScripts:Qm(),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=_h(r.surfaceId,r.actions,t,a,n),s=Th(r.vendorScripts,`browser`);Eh();let c=r.actions.length>0?Gh(r.actions):``,l=r.actions.length>0?Kh(r.actions,o.nonce):``,u=og(
|
|
2958
|
-
`),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:vh,headScripts:s}),r.nonce),a);Nh.set(a,{callbackSession:o,html:u,hasClientConnected:!1,createdAt:Date.now()});let d=``;try{d=`http://127.0.0.1:${await Lh()}/present/${a}`;let e=Nh.get(a);e&&e.hasClientConnected}catch(n){return Nh.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 f=await Jh(d);if(!Xh(r.actions))return setTimeout(()=>{Nh.delete(a);try{t.removeSession(a)}catch{}},Dh),{content:[{type:`text`,text:Yh(e,d,`Rendered.`)}],structuredContent:{kind:`rendered`,reason:`no-response-required`}};let p=await Promise.race([o.promise,new Promise(e=>{setTimeout(()=>{Nh.get(a)?.hasClientConnected||(Nh.delete(a),e(o.settleError(`BROWSER_CONNECT_TIMEOUT`,f?`No browser client connected within ${Oh}ms.`:`Fell back to system browser, but no browser client connected within ${Oh}ms.`)))},Oh)}),new Promise(e=>{setTimeout(()=>e(o.settleTimeout(Dh)),Dh)})]);setTimeout(()=>{Nh.delete(a);try{t.removeSession(a)}catch{}},Dh);let m=p.kind===`result`?`Selected action: ${p.result.actionId}`:p.kind===`timeout`?`Timed out after ${p.waitedMs}ms.`:p.kind===`cancelled`?`Cancelled: ${p.reason}.`:p.kind===`error`?`Error: ${p.error.message}`:`Rendered.`;return{content:[{type:`text`,text:Yh(e,d,m)}],structuredContent:p,isError:p.kind===`error`}}const ug={id:`browser`,priority:20,canHandle(e,t){let n=e_(e);return Xm(n)||!!t.preferBrowser&&!!t_(n)},async render(e,t){return lg(e)}},dg=`openai/outputTemplate`,fg=`ui/resourceUri`,pg={connectDomains:[],resourceDomains:[]},mg={connect_domains:[],resource_domains:[]};function hg(e){return{ui:{resourceUri:e,visibility:[`model`,`app`]},[fg]:e,[dg]:e,"openai/widgetAccessible":!0}}function gg(){return{ui:{prefersBorder:!1,csp:pg},"openai/widgetDescription":`AI Kit renders structured visual surfaces such as dashboards, charts, reports, and diagrams.`,"openai/widgetPrefersBorder":!1,"openai/widgetCSP":mg}}function _g(e){return{ui:{resourceUri:e},[fg]:e,[dg]:e}}function vg(e){return{...e,schemaVersion:1}}function yg(e){try{let t=Rr(e,{transport:`mcp-app`,registry:Jm,blockVendorScripts:Qm()}),n=Th(t.vendorScripts,`mcp-app`),r=Ar({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:vh,headScripts:n}),i={kind:`rendered`,reason:`no-response-required`},a=
|
|
2946
|
+
`)],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:vh}),o);Nh.set(o,{callbackSession:s,html:c,viewerHtml:n,hasClientConnected:!1,createdAt:Date.now()});let l=``;try{l=`http://127.0.0.1:${await Lh()}/present/${o}`}catch(t){return Nh.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 Jh(l),setTimeout(()=>{Nh.delete(o),r.removeSession(o)},Dh),{content:[{type:`text`,text:Yh(e,l,`Rendered.`)}],structuredContent:{kind:`rendered`,reason:`no-response-required`}}}async function lg(e){Fg(`<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=Ih(),n=Ge(16).toString(`hex`),r=Rr(e,{transport:`browser`,registry:Jm,blockVendorScripts:Qm(),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=_h(r.surfaceId,r.actions,t,a,n),s=Th(r.vendorScripts,`browser`);Eh();let c=r.actions.length>0?Gh(r.actions):``,l=r.actions.length>0?Kh(r.actions,o.nonce):``,u=og(u_(Ar({title:e.title,subtitle:e.description,html:[r.html,c,l].filter(Boolean).join(`
|
|
2947
|
+
`),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:vh,headScripts:s}),r.nonce),a);Nh.set(a,{callbackSession:o,html:u,hasClientConnected:!1,createdAt:Date.now()});let d=``;try{d=`http://127.0.0.1:${await Lh()}/present/${a}`;let e=Nh.get(a);e&&e.hasClientConnected}catch(n){return Nh.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 f=await Jh(d);if(!Xh(r.actions))return setTimeout(()=>{Nh.delete(a);try{t.removeSession(a)}catch{}},Dh),{content:[{type:`text`,text:Yh(e,d,`Rendered.`)}],structuredContent:{kind:`rendered`,reason:`no-response-required`}};let p=await Promise.race([o.promise,new Promise(e=>{setTimeout(()=>{Nh.get(a)?.hasClientConnected||(Nh.delete(a),e(o.settleError(`BROWSER_CONNECT_TIMEOUT`,f?`No browser client connected within ${Oh}ms.`:`Fell back to system browser, but no browser client connected within ${Oh}ms.`)))},Oh)}),new Promise(e=>{setTimeout(()=>e(o.settleTimeout(Dh)),Dh)})]);setTimeout(()=>{Nh.delete(a);try{t.removeSession(a)}catch{}},Dh);let m=p.kind===`result`?`Selected action: ${p.result.actionId}`:p.kind===`timeout`?`Timed out after ${p.waitedMs}ms.`:p.kind===`cancelled`?`Cancelled: ${p.reason}.`:p.kind===`error`?`Error: ${p.error.message}`:`Rendered.`;return{content:[{type:`text`,text:Yh(e,d,m)}],structuredContent:p,isError:p.kind===`error`}}const ug={id:`browser`,priority:20,canHandle(e,t){let n=e_(e);return Xm(n)||!!t.preferBrowser&&!!t_(n)},async render(e,t){return lg(e)}},dg=`openai/outputTemplate`,fg=`ui/resourceUri`,pg={connectDomains:[],resourceDomains:[]},mg={connect_domains:[],resource_domains:[]};function hg(e){return{ui:{resourceUri:e,visibility:[`model`,`app`]},[fg]:e,[dg]:e,"openai/widgetAccessible":!0}}function gg(){return{ui:{prefersBorder:!1,csp:pg},"openai/widgetDescription":`AI Kit renders structured visual surfaces such as dashboards, charts, reports, and diagrams.`,"openai/widgetPrefersBorder":!1,"openai/widgetCSP":mg}}function _g(e){return{ui:{resourceUri:e},[fg]:e,[dg]:e}}function vg(e){return{...e,schemaVersion:1}}function yg(e){try{let t=Rr(e,{transport:`mcp-app`,registry:Jm,blockVendorScripts:Qm()}),n=Th(t.vendorScripts,`mcp-app`),r=Ar({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:vh,headScripts:n}),i={kind:`rendered`,reason:`no-response-required`},a=o_(r);Fg(a);let o=n_(e,i,{includeSurfaceHeader:!1}),s=Ng(),c=Rg(s);return c&&Ig(c,a),{content:[{type:`text`,text:o}],structuredContent:vg(e),_meta:_g(s),ui:{type:`resource`,uri:s}}}catch(t){return f_(`RENDER_FAILED`,t instanceof Error?t.message:`Failed to render ChannelSurface`,void 0,e.title)}}const bg={id:`mcp-app`,priority:30,canHandle(e,t){return!0},async render(e,t){return yg(e)}};var xg=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 Sg(e){return`<script nonce="${Y(e)}">
|
|
2959
2948
|
(function() {
|
|
2960
2949
|
const iframe = document.querySelector('.present-viewer-iframe');
|
|
2961
2950
|
if (!iframe) return;
|
|
2962
2951
|
const sendTheme = function() {
|
|
2963
2952
|
const theme = document.documentElement.getAttribute('data-theme');
|
|
2964
2953
|
if (iframe.contentWindow) {
|
|
2965
|
-
iframe.contentWindow.postMessage({ type: 'aikit-theme-change', theme: theme },
|
|
2954
|
+
iframe.contentWindow.postMessage({ type: 'aikit-theme-change', theme: theme }, window.location.origin);
|
|
2966
2955
|
}
|
|
2967
2956
|
};
|
|
2968
2957
|
const observer = new MutationObserver(sendTheme);
|
|
@@ -2973,19 +2962,25 @@ window.addEventListener('message', function(e) {
|
|
|
2973
2962
|
window.addEventListener('message', function(e) {
|
|
2974
2963
|
if (e.data && e.data.type === 'aikit-viewer-height') {
|
|
2975
2964
|
var container = document.querySelector('.present-viewer-container');
|
|
2976
|
-
|
|
2965
|
+
if (container) { container.style.minHeight = e.data.height + 'px'; }
|
|
2977
2966
|
}
|
|
2978
2967
|
});
|
|
2979
|
-
<\/script>`}async function wg(e,t){try{let n=
|
|
2968
|
+
<\/script>`}async function wg(e,t){try{let n=a_(Tm(t.resolveHtml(),e.data??null,t.injectId,t.transformData)).replace(/&/g,`&`).replace(/"/g,`"`),r=Ge(16).toString(`hex`),i={kind:`rendered`,reason:`no-response-required`};Fg(o_(Ar({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>`,` ${Sg(r)}`,` ${Cg(r)}`,`</div>`].join(`
|
|
2980
2969
|
`),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(`
|
|
2981
|
-
`)],islands:[],payload:void 0,nonce:r,generatedAt:new Date().toISOString(),footerContentHtml:vh,colorScheme:e.colorScheme,lang:e.lang,dir:e.dir,transport:`mcp-app`,exportPolicy:`local-interactive`,imageExportMode:`disabled`})));let a=n_(e,i,{includeSurfaceHeader:!1}),o=Ng();return{content:[{type:`text`,text:a}],structuredContent:vg(e),_meta:_g(o),ui:{type:`resource`,uri:o}}}catch(t){return
|
|
2982
|
-
`);return
|
|
2970
|
+
`)],islands:[],payload:void 0,nonce:r,generatedAt:new Date().toISOString(),footerContentHtml:vh,colorScheme:e.colorScheme,lang:e.lang,dir:e.dir,transport:`mcp-app`,exportPolicy:`local-interactive`,imageExportMode:`disabled`})));let a=n_(e,i,{includeSurfaceHeader:!1}),o=Ng();return{content:[{type:`text`,text:a}],structuredContent:vg(e),_meta:_g(o),ui:{type:`resource`,uri:o}}}catch(t){return f_(`VIEWER_RENDER_FAILED`,t instanceof Error?t.message:`Failed to render viewer template`,void 0,e.title)}}const Tg={id:`viewer`,priority:10,canHandle(e,t){return e.template?Sm(e.template)!=null:!1},async render(e,t){let n=Sm(e.template??``);if(!n)return f_(`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(`
|
|
2971
|
+
`);return f_(`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||r&&!i?await cg(e,n):i?wg(e,n):f_(`VIEWER_TRANSPORT_UNSUPPORTED`,`Viewer template "${n.id}" does not support an available transport`,void 0,e.title)}},Eg=`ui://aikit/present.html`,Dg=`ui://aikit/present/{id}.html`,Og=j(`present`);let kg=0,Ag=``;const jg=new Map,Mg=new Map;function Ng(){return`ui://aikit/present/${`${Date.now().toString(36)}_${(++kg).toString(36)}`}.html`}function Pg(){return Ag}function Fg(e){Ag=e}function Ig(e,t){let n=Mg.get(e);n&&clearTimeout(n),jg.set(e,t),Mg.set(e,setTimeout(()=>{jg.delete(e),Mg.delete(e)},3e4))}function Lg(e){return jg.get(e)}function Rg(e){return e.match(/\/present\/(.+)\.html$/)?.[1]}const zg=new xg;zg.register(Tg),zg.register(ug),zg.register(bg);function Bg(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Vg=/\\u[0-9a-fA-F]{4}/,Hg=/^\s*\|(?:[^|\r\n]+\|){2,}\s*$/,Ug=/^\s*\|?(?:\s*:?-{3,}:?\s*\|){2,}\s*$/,Wg=/\b(cli|terminal|tty|console|command(?:-|\s)?line)\b/i;function Gg(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 Kg(e){let t=e.split(/\r?\n/);for(let e=0;e<t.length-1;e+=1)if(Hg.test(t[e])&&Ug.test(t[e+1]))return!0;return!1}function qg(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 Jg(e,t){if(t<2)return!1;let n=e.trim();return n.startsWith(`|`)?qg(n).length===t:!1}function Yg(e){let t=e.split(/\r?\n/),n=[],r=[],i=()=>{r.length!==0&&(n.push({type:`text`,content:r.join(`
|
|
2983
2972
|
`)}),r.length=0)},a=0;for(;a<t.length;){let e=t[a],o=t[a+1];if(o!==void 0&&Hg.test(e)&&Ug.test(o)){let r=qg(e),o=[];i();let s=a+2;for(;s<t.length&&Jg(t[s],r.length);)o.push(qg(t[s])),s+=1;n.push({type:`table`,headers:r,rows:o}),a=s;continue}r.push(e),a+=1}return i(),n}function Xg(e){let t=Gg(e);return!t||!Kg(t)?[e]:Yg(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 Zg(e){if(typeof e==`string`)return Wg.test(e);if(Array.isArray(e))return e.some(e=>Zg(e));if(!Bg(e))return!1;let t=[`client`,`clientInfo`,`host`,`source`,`mode`,`name`,`title`,`channel`];return Object.entries(e).some(([e,n])=>t.includes(e)?Zg(n):!1)}function Qg(e,t){return{preferBrowser:[t,e._meta,Bg(e.metadata)?e.metadata.source:void 0].some(e=>Zg(e))}}const $g={id:`__dismiss`,type:`button`,label:`Done`,variant:`default`};function e_(e){if((e.actions?.length??0)>0||!e.template)return e;let t=Ym(e);return t?.supportedTransports.includes(`browser`)===!0&&!t.supportedTransports.includes(`mcp-app`)?{...e,actions:[$g]}:e}function t_(e){if(!e.template)return!0;let t=Sm(e.template);return t?t.supportedTransports.includes(`browser`):Ym(e)?.supportedTransports.includes(`browser`)??!1}function n_(e,t,n={}){let r=n.includeSurfaceHeader??!0,i=r?[e.title]:[];return r&&e.description&&i.push(e.description),Fr(t)?i.push(``,`Selected action: ${t.result.actionId}`):Pr(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(`
|
|
2984
|
-
`)}
|
|
2985
|
-
.toolbar, .badge,
|
|
2973
|
+
`)}const r_=`<style>
|
|
2974
|
+
.toolbar, .badge, .aikit-header, .aikit-footer { display: none !important; }
|
|
2986
2975
|
body { padding-top: 0 !important; margin-top: 0 !important; }
|
|
2987
|
-
</style>
|
|
2988
|
-
|
|
2976
|
+
</style>`,i_=`<script>
|
|
2977
|
+
window.addEventListener('message', function(e) {
|
|
2978
|
+
if (e.origin !== window.location.origin) return;
|
|
2979
|
+
if (e.data && e.data.type === 'aikit-theme-change') {
|
|
2980
|
+
document.documentElement.setAttribute('data-theme', e.data.theme);
|
|
2981
|
+
}
|
|
2982
|
+
});
|
|
2983
|
+
<\/script>`;function a_(e){let t=e.replace(`</head>`,`${r_}\n</head>`);t===e&&Og.warn(`injectEmbeddedViewerRuntime: </head> not found — viewer style not injected`);let n=t.replace(`</body>`,`<script>
|
|
2989
2984
|
(function() {
|
|
2990
2985
|
function report() {
|
|
2991
2986
|
var h = document.documentElement.scrollHeight;
|
|
@@ -2995,16 +2990,7 @@ window.addEventListener('message', function(e) {
|
|
|
2995
2990
|
ro.observe(document.documentElement);
|
|
2996
2991
|
report();
|
|
2997
2992
|
})();
|
|
2998
|
-
<\/script>
|
|
2999
|
-
<script>
|
|
3000
|
-
window.addEventListener('message', function(e) {
|
|
3001
|
-
if (e.origin !== window.location.origin) return;
|
|
3002
|
-
if (e.data && e.data.type === 'aikit-theme-change') {
|
|
3003
|
-
document.documentElement.setAttribute('data-theme', e.data.theme);
|
|
3004
|
-
}
|
|
3005
|
-
});
|
|
3006
|
-
<\/script>
|
|
3007
|
-
</body>`);return n===t&&Og.warn(`injectEmbeddedViewerRuntime: </body> not found — runtime scripts not injected`),n}function i_(e){let t=`<script>
|
|
2993
|
+
<\/script>\n${i_}\n</body>`);return n===t&&Og.warn(`injectEmbeddedViewerRuntime: </body> not found — runtime scripts not injected`),n}function o_(e){let t=`<script>
|
|
3008
2994
|
(function(){
|
|
3009
2995
|
var last=0;
|
|
3010
2996
|
function notify(){
|
|
@@ -3015,7 +3001,7 @@ window.addEventListener('message', function(e) {
|
|
|
3015
3001
|
if(typeof ResizeObserver!=="undefined"){new ResizeObserver(notify).observe(document.documentElement)}
|
|
3016
3002
|
else{setInterval(notify,500)}
|
|
3017
3003
|
})();
|
|
3018
|
-
<\/script>`;return e.includes(`</body>`)?e.replace(`</body>`,`${t}</body>`):`${e}${t}`}let
|
|
3004
|
+
<\/script>`;return e.includes(`</body>`)?e.replace(`</body>`,`${t}</body>`):`${e}${t}`}let s_=``;function c_(e){return`<script${e?` nonce="${Y(e)}"`:``}>
|
|
3019
3005
|
(function(){
|
|
3020
3006
|
var readyState = document.readyState;
|
|
3021
3007
|
var boot = function() {
|
|
@@ -3028,12 +3014,12 @@ window.addEventListener('message', function(e) {
|
|
|
3028
3014
|
boot();
|
|
3029
3015
|
}
|
|
3030
3016
|
})();
|
|
3031
|
-
<\/script>`}function
|
|
3032
|
-
`)}function
|
|
3033
|
-
`),n=t.lastIndexOf(t[0]);return{type:`code`,value:e>=0?t.slice(e+1,n).trimEnd():t}}return w_.test(t)?{type:`table`,value:t}:{type:`markdown`,value:t}}function E_(e,t){let n=x_[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 D_(e){if(typeof e==`string`){let t=T_(e);return{type:t.type,value:t.value}}if(Array.isArray(e)){let[t,n]=e;if(typeof t==`string`){let e=E_(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 O_(e){return{title:e.title??``,blocks:Array.isArray(e.blocks)?e.blocks.map(D_):[]}}function k_(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function A_(e){return k_(e)&&typeof e.schemaVersion==`number`&&e.schemaVersion===1}function j_(e){return k_(e)&&typeof e.schemaVersion==`number`&&e.schemaVersion!==1}function M_(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 N_(e){try{let t=re(e);return k_(t)?(t.schemaVersion===void 0&&(t.schemaVersion=1),P_(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 P_(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(!k_(n))return{ok:!1,error:{code:`INVALID_PRESET_INPUT`,reason:`Preset data must be an object`}};let r=b_(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(j_(e))return{ok:!1,error:{code:`UNSUPPORTED_SCHEMA_VERSION`,reason:`Unsupported schemaVersion: ${String(e.schemaVersion)}`,hint:`Use schemaVersion: 1`}};if(A_(e))return M_(e);if(typeof e==`string`){let t=O_({blocks:[e]});return{ok:!0,surface:{schemaVersion:1,title:t.title||`Present`,blocks:t.blocks}}}if(k_(e)){if(typeof e.raw==`string`)return N_(e.raw);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=O_(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 F_=R.object({label:R.string(),value:R.string(),description:R.string().optional()}),I_=R.object({id:R.string().describe(`Unique action identifier`),type:R.enum([`button`,`select`,`multi-select`,`form-submit`,`text-submit`,`confirm`,`custom`]).describe(`Interactive action type`),label:R.string().describe(`Visible action label`),variant:R.enum([`primary`,`danger`,`default`]).optional(),options:R.array(F_).optional(),schema:R.record(R.string(),R.unknown()).optional()}),L_=R.object({type:R.string(),title:R.string().optional(),value:R.unknown().optional(),language:R.string().optional()}).catchall(R.unknown()),R_={schemaVersion:R.literal(1).describe(`ChannelSurface schema version. Must be 1.`),title:R.string().describe(`Surface title shown to the user.`),description:R.string().optional().describe(`Optional supporting copy for the surface.`),template:R.string().optional().describe(`Optional template id such as report@1.`),layout:R.object({maxWidth:R.string().optional(),padding:R.string().optional(),columns:R.number().optional()}).optional(),blocks:R.array(L_).optional().describe(`Typed block content for the surface.`),data:R.unknown().optional().describe(`Template data payload, if the template expands data.`),actions:R.array(I_).optional().describe(`Interactive actions. Presence triggers browser transport.`),response:R.object({timeout:R.number().optional(),required:R.boolean().optional()}).optional(),metadata:R.object({surfaceId:R.string().optional(),createdAt:R.string().optional(),source:R.string().optional()}).optional(),colorScheme:R.enum([`light`,`dark`,`auto`]).optional(),lang:R.string().optional(),dir:R.enum([`ltr`,`rtl`,`auto`]).optional(),raw:R.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.`)};R.object({surfaceId:R.string(),actionId:R.string(),actionType:R.enum([`button`,`select`,`multi-select`,`form-submit`,`text-submit`,`confirm`,`custom`]),value:R.unknown().optional(),formData:R.record(R.string(),R.unknown()).optional(),selection:R.union([R.string(),R.array(R.string())]).optional(),label:R.string().optional(),timestamp:R.string(),sourceTransport:R.enum([`mcp-app`,`browser`,`export`])});function z_(e){let t=e.server?.getClientCapabilities?.();if(!t)return`unknown`;let n=_r(t);return!n||Array.isArray(n.mimeTypes)&&n.mimeTypes.length>0&&!n.mimeTypes.includes(gr)?`unsupported`:`supported`}const B_=[{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 V_(e,t){let n=W(`present`);try{let e=w(`present`);e&&s_(P(I(e,`dist`,`annotation-layer.js`),`utf8`))}catch{}yr(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. Actions use browser transport. Resources: aikit://schemas/channel-surface (schema+blocks), aikit://present/presets (presets), aikit://present/templates (viewers).",inputSchema:R_,annotations:n.annotations,_meta:hg(Dg)},J(`present`,async(t,n)=>{let r=P_(t);if(!r.ok)return u_(r.error.code,r.error.reason,void 0,`Present`);let i=d_(r.surface,n);if(!i.ok)return i.response;let a=z_(e);return await h_(i.surface,{...i.options,preferBrowser:i.options.preferBrowser||a===`unsupported`})}));try{let t=new Gn(Dg,{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?Lg(r):void 0;return{contents:[{uri:e.href,mimeType:gr,_meta:gg(),text:i??Pg()??`<html><body><p>No content generated yet. Call the present tool first.</p></body></html>`}]}})}catch{}function r(){try{let e=w(`present`);if(e)return P(I(e,`dist`,`index.html`),`utf8`)}catch{}return Pg()||`<html><body><p>Loading...</p></body></html>`}try{e.registerResource(`Present App`,Eg,{description:`AI Kit present app - entry point`},async()=>({contents:[{uri:Eg,mimeType:gr,_meta:gg(),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=wm().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(B_,null,2)}]}))}catch{}}const H_=j(`tools`);function U_(e,t){let n=new rr({structure:new ar,dependencies:new er,symbols:new or,patterns:new ir,entryPoints:new nr,diagrams:new tr}),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:R.string().optional().describe(`Root path to analyze (defaults to workspace root)`),aspects:R.array(R.enum([`all`,`structure`,`dependencies`,`symbols`,`patterns`,`entry-points`,`diagrams`])).default([`all`]).describe(`Which analysis aspects to run`)},annotations:r.annotations},J(`produce_knowledge`,async({scope:e,aspects:r},i)=>{let a;try{a=$c(i).createTask(`Produce Knowledge`,3),a.progress(0,`Running analyzers`);let o=e??`.`;H_.info(`Running knowledge production`,{rootPath:o,aspects:r});let s=await n.runExtraction(o,r);try{let e=t?.onboardDir??``;if(!e)throw H_.warn(`onboardDir not configured — skipping artifact persistence.`),Error(`skip`);Te(e,{recursive:!0});let n=`<!-- Generated by produce_knowledge at ${new Date().toISOString()} -->\n\n`;for(let[t,r]of Object.entries(s))r&&typeof r==`string`&&je(F(e,`${t}.md`),n+r,`utf-8`);H_.info(`Knowledge persisted to .ai/context/`,{files:Object.keys(s).length})}catch(e){H_.warn(`Failed to persist knowledge to .ai/context/`,{error:M(e)})}a.progress(1,`Synthesizing results`);let c=n.buildSynthesisInstructions(s,r);return a.complete(`Knowledge production complete`),{content:[{type:`text`,text:c+`
|
|
3017
|
+
<\/script>`}function l_(e){s_=e||``}function u_(e,t){if(!s_)return e;let n=`${`<script${t?` nonce="${Y(t)}"`:``}>${s_}<\/script>`}\n${c_(t||``)}`;return e.includes(`</body>`)?e.replace(`</body>`,`${n}\n</body>`):`${e}${n}`}function d_(e,t){return[`<!DOCTYPE html>`,`<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">`,`<title>Error — ${Y(e)}</title>`,`<style>`,` * { box-sizing: border-box; margin: 0; padding: 0; }`,` body { font-family: system-ui, -apple-system, sans-serif; min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 2rem; background: #fafafa; color: #333; }`,` .error-card { max-width: 560px; width: 100%; padding: 2.5rem; border-radius: 1rem; background: #fff; border: 1px solid #e5e7eb; box-shadow: 0 1px 3px rgba(0,0,0,0.06); }`,` .error-badge { display: inline-block; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: #dc2626; background: #fef2f2; border: 1px solid #fecaca; border-radius: 0.375rem; padding: 0.25rem 0.625rem; margin-bottom: 1rem; }`,` .error-title { font-size: 1.25rem; font-weight: 600; margin-bottom: 0.75rem; color: #111; }`,` .error-message { font-size: 0.875rem; line-height: 1.6; color: #6b7280; white-space: pre-wrap; word-break: break-word; }`,`</style></head><body>`,`<div class="error-card">`,` <span class="error-badge">Render Error</span>`,` <h1 class="error-title">${Y(e)}</h1>`,` <p class="error-message">${Y(t)}</p>`,`</div>`,`</body></html>`].join(`
|
|
3018
|
+
`)}function f_(e,t,n,r){return Fg(d_(r??`Present`,t)),{content:[{type:`text`,text:`[ERROR:VALIDATION] ${t}`}],isError:!0}}function p_(e,t){if(!Bg(e)||!(`schemaVersion`in e))return{ok:!1,response:f_(`INVALID_CHANNEL_SURFACE`,`present expects a ChannelSurface object with schemaVersion: 1`)};if(e.schemaVersion!==1)return{ok:!1,response:f_(`UNSUPPORTED_SCHEMA_VERSION`,`Unsupported ChannelSurface schemaVersion: ${String(e.schemaVersion)}`)};if(typeof e.title==`string`&&Vg.test(e.title))return{ok:!1,response:f_(`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(!Bg(e)||e.type!==`markdown`)return[e];let t=Gg(e);return!t||!Kg(t)?[e]:Xg(e)})}:e;return{ok:!0,surface:n,options:Qg(n,t)}}const m_={id:`__feedback`,type:`text-submit`,label:`💬 Feedback`,variant:`default`};function h_(e){return!e.actions||e.actions.length===0||e.actions.some(e=>e.id===`__feedback`)?e:{...e,actions:[...e.actions,m_]}}function g_(e){return(e.actions?.length??0)>0||e.response?.required===!0?zg.getAll().some(e=>e.id===`browser`):!1}async function __(e,t={}){let n=g_(e)?{...t,preferBrowser:!0}:t,r=e_(e),i=zg.select(r,n),a=i?.id===`browser`?h_(r):r,o;if(o=i?await i.render(a,n):yg(a),t.compact){let{structuredContent:e,...t}=o;return t}return o}function Z(e,t=``){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):t}function v_(e){return{type:`kv`,value:e}}function y_(e){if(Array.isArray(e))return e}const b_=[{name:`summary`,description:`Title + markdown summary + optional metrics (pass/fail counts)`,expand(e){let t=Z(e.title,`Summary`),n=[{type:`heading`,value:t}],r=Z(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=Z(e.title,`Plan`),n=[{type:`heading`,value:t}],r=y_(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=Z(e.title,`Understanding`),n=[{type:`heading`,value:t}],r=Z(e.explanation);return r&&n.push({type:`markdown`,value:r}),e.details&&typeof e.details==`object`&&!Array.isArray(e.details)&&n.push(v_(e.details)),{title:t,blocks:n}}},{name:`bug-analyze`,description:`Title + heading + severity/status kv + code block + markdown`,expand(e){let t=Z(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=Z(e.code);i&&n.push({type:`code`,value:i});let a=Z(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=Z(e.title,`Task Complete`),n=[{type:`heading`,value:t}],r=y_(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=Z(e.title,`Review`),n=[{type:`heading`,value:t}],r=y_(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=Z(e.title,`Exploration`),n=[{type:`heading`,value:t}],r=y_(e.findings);if(r)for(let e of r)n.push({type:`heading`,value:Z(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=Z(e.title,`Decision`),n=[{type:`heading`,value:t}];e.recommendation&&n.push({type:`kv`,value:{Recommendation:e.recommendation}});let r=y_(e.options);return r&&r.length>0&&n.push({type:`comparison`,value:r.map(e=>({title:Z(e.title,`Option`),items:Array.isArray(e.items)?e.items:[]}))}),{title:t,blocks:n}}}],x_=new Map;for(let e of b_)x_.set(e.name,e);function S_(e,t){let n=x_.get(e);return n?n.expand(t):null}const C_={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`},w_=/^(#{1,6})\s/,T_=/^(`{3,}|~{3,})/,E_=/^\|.+\|.+\|/m;function D_(e){let t=e.trim(),n=t.match(w_);if(n)return{type:`heading`,value:t.slice(n[0].length)};if(T_.test(t)){let e=t.indexOf(`
|
|
3019
|
+
`),n=t.lastIndexOf(t[0]);return{type:`code`,value:e>=0?t.slice(e+1,n).trimEnd():t}}return E_.test(t)?{type:`table`,value:t}:{type:`markdown`,value:t}}function O_(e,t){let n=C_[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 k_(e){if(typeof e==`string`){let t=D_(e);return{type:t.type,value:t.value}}if(Array.isArray(e)){let[t,n]=e;if(typeof t==`string`){let e=O_(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 A_(e){return{title:e.title??``,blocks:Array.isArray(e.blocks)?e.blocks.map(k_):[]}}function j_(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function M_(e){return j_(e)&&typeof e.schemaVersion==`number`&&e.schemaVersion===1}function N_(e){return j_(e)&&typeof e.schemaVersion==`number`&&e.schemaVersion!==1}function P_(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 F_(e){try{let t=re(e);return j_(t)?(t.schemaVersion===void 0&&(t.schemaVersion=1),I_(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 I_(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(!j_(n))return{ok:!1,error:{code:`INVALID_PRESET_INPUT`,reason:`Preset data must be an object`}};let r=S_(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(N_(e))return{ok:!1,error:{code:`UNSUPPORTED_SCHEMA_VERSION`,reason:`Unsupported schemaVersion: ${String(e.schemaVersion)}`,hint:`Use schemaVersion: 1`}};if(M_(e))return P_(e);if(typeof e==`string`){let t=A_({blocks:[e]});return{ok:!0,surface:{schemaVersion:1,title:t.title||`Present`,blocks:t.blocks}}}if(j_(e)){if(typeof e.raw==`string`)return F_(e.raw);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=A_(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 L_=R.object({label:R.string(),value:R.string(),description:R.string().optional()}),R_=R.object({id:R.string().describe(`Unique action identifier`),type:R.enum([`button`,`select`,`multi-select`,`form-submit`,`text-submit`,`confirm`,`custom`]).describe(`Interactive action type`),label:R.string().describe(`Visible action label`),variant:R.enum([`primary`,`danger`,`default`]).optional(),options:R.array(L_).optional(),schema:R.record(R.string(),R.unknown()).optional()}),z_=R.object({type:R.string(),title:R.string().optional(),value:R.unknown().optional(),language:R.string().optional()}).catchall(R.unknown()),B_={schemaVersion:R.literal(1).describe(`ChannelSurface schema version. Must be 1.`),title:R.string().describe(`Surface title shown to the user.`),description:R.string().optional().describe(`Optional supporting copy for the surface.`),template:R.string().optional().describe(`Optional template id such as report@1.`),layout:R.object({maxWidth:R.string().optional(),padding:R.string().optional(),columns:R.number().optional()}).optional(),blocks:R.array(z_).optional().describe(`Typed block content for the surface.`),data:R.unknown().optional().describe(`Template data payload, if the template expands data.`),actions:R.array(R_).optional().describe(`Interactive actions. Presence triggers browser transport.`),response:R.object({timeout:R.number().optional(),required:R.boolean().optional()}).optional(),metadata:R.object({surfaceId:R.string().optional(),createdAt:R.string().optional(),source:R.string().optional()}).optional(),colorScheme:R.enum([`light`,`dark`,`auto`]).optional(),lang:R.string().optional(),dir:R.enum([`ltr`,`rtl`,`auto`]).optional(),raw:R.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.`)};R.object({surfaceId:R.string(),actionId:R.string(),actionType:R.enum([`button`,`select`,`multi-select`,`form-submit`,`text-submit`,`confirm`,`custom`]),value:R.unknown().optional(),formData:R.record(R.string(),R.unknown()).optional(),selection:R.union([R.string(),R.array(R.string())]).optional(),label:R.string().optional(),timestamp:R.string(),sourceTransport:R.enum([`mcp-app`,`browser`,`export`])});function V_(e){let t=e.server?.getClientCapabilities?.();if(!t)return`unknown`;let n=_r(t);return!n||Array.isArray(n.mimeTypes)&&n.mimeTypes.length>0&&!n.mimeTypes.includes(gr)?`unsupported`:`supported`}const H_=[{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 U_(e,t){let n=W(`present`);try{let e=w(`present`);e&&l_(P(I(e,`dist`,`annotation-layer.js`),`utf8`))}catch{}yr(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. Actions use browser transport. Resources: aikit://schemas/channel-surface (schema+blocks), aikit://present/presets (presets), aikit://present/templates (viewers).",inputSchema:B_,annotations:n.annotations,_meta:hg(Dg)},J(`present`,async(t,n)=>{let r=I_(t);if(!r.ok)return f_(r.error.code,r.error.reason,void 0,`Present`);let i=p_(r.surface,n);if(!i.ok)return i.response;let a=V_(e);return await __(i.surface,{...i.options,preferBrowser:i.options.preferBrowser||a===`unsupported`})}));try{let t=new Gn(Dg,{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?Lg(r):void 0;return{contents:[{uri:e.href,mimeType:gr,_meta:gg(),text:i??Pg()??`<html><body><p>No content generated yet. Call the present tool first.</p></body></html>`}]}})}catch{}function r(){try{let e=w(`present`);if(e)return P(I(e,`dist`,`index.html`),`utf8`)}catch{}return Pg()||`<html><body><p>Loading...</p></body></html>`}try{e.registerResource(`Present App`,Eg,{description:`AI Kit present app - entry point`},async()=>({contents:[{uri:Eg,mimeType:gr,_meta:gg(),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=wm().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(H_,null,2)}]}))}catch{}}const W_=j(`tools`);function G_(e,t){let n=new rr({structure:new ar,dependencies:new er,symbols:new or,patterns:new ir,entryPoints:new nr,diagrams:new tr}),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:R.string().optional().describe(`Root path to analyze (defaults to workspace root)`),aspects:R.array(R.enum([`all`,`structure`,`dependencies`,`symbols`,`patterns`,`entry-points`,`diagrams`])).default([`all`]).describe(`Which analysis aspects to run`)},annotations:r.annotations},J(`produce_knowledge`,async({scope:e,aspects:r},i)=>{let a;try{a=$c(i).createTask(`Produce Knowledge`,3),a.progress(0,`Running analyzers`);let o=e??`.`;W_.info(`Running knowledge production`,{rootPath:o,aspects:r});let s=await n.runExtraction(o,r);try{let e=t?.onboardDir??``;if(!e)throw W_.warn(`onboardDir not configured — skipping artifact persistence.`),Error(`skip`);Te(e,{recursive:!0});let n=`<!-- Generated by produce_knowledge at ${new Date().toISOString()} -->\n\n`;for(let[t,r]of Object.entries(s))r&&typeof r==`string`&&je(F(e,`${t}.md`),n+r,`utf-8`);W_.info(`Knowledge persisted to .ai/context/`,{files:Object.keys(s).length})}catch(e){W_.warn(`Failed to persist knowledge to .ai/context/`,{error:M(e)})}a.progress(1,`Synthesizing results`);let c=n.buildSynthesisInstructions(s,r);return a.complete(`Knowledge production complete`),{content:[{type:`text`,text:c+`
|
|
3034
3020
|
|
|
3035
3021
|
---
|
|
3036
|
-
_Next: Review the baselines above and use \`remember\` to store synthesized knowledge entries._`}]}}catch(e){return a?.fail?.(`Production failed`),
|
|
3022
|
+
_Next: Review the baselines above and use \`remember\` to store synthesized knowledge entries._`}]}}catch(e){return a?.fail?.(`Production failed`),W_.error(`Knowledge production failed`,M(e)),q(`INTERNAL`,`Knowledge production failed: ${e instanceof Error?e.message:String(e)}`)}}))}const K_=j(`tools`);function q_(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:R.boolean().default(!1).describe(`If true, force full re-index ignoring file hashes`),force:R.boolean().default(!1).describe(`If true, override smart indexing guard and run reindex anyway`)},annotations:s.annotations},J(`reindex`,async({full:e,force:s},c)=>{try{if(t.isIndexing)return{content:[{type:`text`,text:`## Reindex Already in Progress
|
|
3037
3023
|
|
|
3038
3024
|
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
|
|
3039
3025
|
|
|
@@ -3041,52 +3027,52 @@ Smart indexing (trickle mode) is enabled — files are automatically indexed as
|
|
|
3041
3027
|
|
|
3042
3028
|
**If the index is severely outdated**, use \`reindex({ force: true })\` to override.
|
|
3043
3029
|
|
|
3044
|
-
Use \`status({})\` to check smart indexing queue status.`}]};let l=$c(c).createTask(`Reindex`,1);l.progress(0,`Starting ${e?`full`:`incremental`} reindex`),
|
|
3030
|
+
Use \`status({})\` to check smart indexing queue status.`}]};let l=$c(c).createTask(`Reindex`,1);l.progress(0,`Starting ${e?`full`:`incremental`} reindex`),K_.info(`Starting background re-index`,{mode:e?`full`:`incremental`});let u=e=>t=>{t.phase===`chunking`&&t.currentFile&&K_.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(K_.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(),K_.info(`FTS index rebuilt after reindex`)}catch(e){K_.warn(`FTS index rebuild failed`,M(e))}try{let e=await r.reindexAll();K_.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){K_.warn(`Curated re-index failed`,M(e))}if(a)try{await a.notifyAfterReindex()}catch(e){K_.warn(`Post-reindex resource notification failed`,M(e))}}).catch(e=>{l.fail(`Reindex failed: ${e instanceof Error?e.message:String(e)}`),K_.error(`Background reindex failed`,M(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 K_.error(`Reindex failed`,M(e)),q(`INTERNAL`,`Reindex failed: ${e instanceof Error?e.message:String(e)}`)}}))}const J_=j(`tools`);function Y_(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:R.enum([`list`,`clear`]).default(`list`).describe(`Action: "list" (default) to view entries, "clear" to wipe the log`),last:R.number().optional().describe(`Number of entries to return (default: 20, list only)`),tool:R.string().optional().describe(`Filter by tool name (list only)`),source:R.enum([`mcp`,`cli`]).optional().describe(`Filter by source: "mcp" or "cli" (list only)`),since:R.string().optional().describe(`ISO timestamp — only show entries after this time (list only)`)},annotations:t.annotations},J(`replay`,async({action:e,last:t,tool:n,source:r,since:i})=>{try{if(e===`clear`)return hn(),{content:[{type:`text`,text:`Replay log cleared.`}]};let a=gn({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 _n().catch(()=>{}),{content:[{type:`text`,text:`**Replay Log** (${a.length} entries)\n\n${o.join(`
|
|
3045
3031
|
|
|
3046
|
-
`)}`}]}}catch(e){return
|
|
3032
|
+
`)}`}]}}catch(e){return J_.error(`Replay failed`,M(e)),q(`INTERNAL`,`Replay failed: ${e instanceof Error?e.message:String(e)}`)}}))}const X_=j(`tools`);function Z_(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:R.enum([`list`,`restore`]).describe(`list: show restore points, restore: apply a restore point`),id:R.string().optional().describe(`Restore point ID (required for action=restore)`),limit:R.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(`
|
|
3047
3033
|
`)}`}]}}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(`
|
|
3048
|
-
`)}`}]}}catch(e){return
|
|
3034
|
+
`)}`}]}}catch(e){return X_.error(`Restore failed`,M(e)),q(`INTERNAL`,`Restore failed: ${e instanceof Error?e.message:String(e)}`)}})}const Q_=/<\/?curated-context>/gi;function $_(e){return e.replace(Q_,``)}function ev(e){return`<curated-context>\n${$_(e)}\n</curated-context>`}const tv=j(`tools`);function nv(e,t,n,r){b(e,t,n);let i=e.memoryMetaGet(t);if(!i)return;let a=g(i,{..._,...r});a&&(y(e,t,a),v(e,t,n))}function rv(e,t){let n=[],r=Me(process.cwd());r&&n.push(`[project: ${r}]`);let i=t?Dn(t,`__context_boost`):void 0;return i&&n.push(`[focus: ${i.value}]`),n.length===0?e:`${n.join(` `)} ${e}`}function iv(e,t,n){return n?e:t===`curated`?e*1.2:e}function av(e,t){return t?e:e.map(e=>({record:e.record,score:iv(e.score,e.record.origin,t)})).sort((e,t)=>t.score-e.score)}function ov(e,t){let n=e?Math.floor(e/Math.max(1,t)):96;return Math.max(40,Math.min(160,n))}function sv(e,t){let n=e.origin===`curated`?ev(e.content):e.content,r=L(n,t);return{body:r,truncated:r!==n}}async function cv(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:hr(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 tv.warn(`ER fallback failed`,M(e)),{results:n,triggered:!0,cacheHit:a}}}function lv(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 uv(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 dv(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 fv(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&&!pv.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 pv=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 mv(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 Ve(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 hv(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:qs,inputSchema:{query:R.string().max(5e3).describe(`Natural language search query`),limit:R.number().min(1).max(20).default(5).describe(`Maximum results to return`),search_mode:R.enum([`hybrid`,`semantic`,`keyword`]).default(`hybrid`).describe(`Search strategy: hybrid (vector + FTS + RRF fusion, default), semantic (vector only), keyword (FTS only)`),content_type:R.enum(de).optional().describe(`Filter by content type`),source_type:R.enum(_e).optional().describe(`Coarse filter: "source" (code only), "documentation" (md, curated), "test", "config". Overrides content_type if both set.`),origin:R.enum(he).optional().describe(`Filter by knowledge origin`),category:R.string().optional().describe(`Filter by category (e.g., decisions, patterns, conventions)`),tags:R.array(R.string()).optional().describe(`Filter by exact tag membership (any supplied tag may match)`),min_score:R.number().min(0).max(1).default(.25).describe(`Minimum similarity score`),graph_hops:R.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:R.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),min_confidence:R.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:R.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:R.array(R.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,k=``,ee=f!==`keyword`,te=rv(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(te);E=await n.search(r,T);let a=await cv(i,E[0]?.score??0,E,e,d);E=a.results,D=a.triggered,O=a.cacheHit}catch(t){ee=!1,tv.warn(`Embedder unavailable in semantic mode, falling back to FTS`,M(t)),E=await n.ftsSearch(e,{...T,limit:d}),k=`> _⚠️ Semantic search unavailable (embedder recovering). Showing keyword results instead._
|
|
3049
3035
|
|
|
3050
|
-
`}else{let r=[],a=[];try{let i=await t.embedQuery(te),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){ee=!1
|
|
3036
|
+
`}else{let r=[],a=[];try{let i=await t.embedQuery(te),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){ee=!1,tv.warn(`Embedder unavailable, falling back to FTS-only`,M(t)),a=await n.ftsSearch(e,{...T,limit:d*2}),k=`> _⚠️ Vector search unavailable (embedder recovering). Results from keyword search only._
|
|
3051
3037
|
|
|
3052
|
-
`}if(ee?r.length===0&&a.length>0?(E=a.slice(0,d),k=` (FTS-only: vector index rebuilding)`):E=a.length===0&&r.length>0?r.slice(0,d):
|
|
3053
|
-
`)[0].slice(0,500);if(r&&r!==e){let i=f===`keyword`||!ee?await n.ftsSearch(r,T):await n.search(await t.embedQuery(r),T);i.length>0&&(E=i,k=`> _Original query "${e}" returned 0 results. Auto-reformulated to "${r}"._\n\n
|
|
3038
|
+
`}if(ee?r.length===0&&a.length>0?(E=a.slice(0,d),k=` (FTS-only: vector index rebuilding)`):E=a.length===0&&r.length>0?r.slice(0,d):lv(r,a).slice(0,d):E=a.slice(0,d),ee){let t=await cv(i,r[0]?.score??0,E,e,d);E=t.results,D=t.triggered,O=t.cacheHit}}E=av(E,h).slice(0,d),a&&a.recordSearch(e,D,O),E.length>1&&(E=uv(E,e)),E=dv(E);let ne=``;if(C&&C.length>0){let n=Nl(C,u);if(n.length>0){let{stores:r,closeAll:i}=await Pl(n);try{let i;i=f===`keyword`||!ee?await Il(r,e,{...T,limit:d}):await Fl(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),ne=` + ${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 re={extracted:3,inferred:2,ambiguous:1};if(y){let e=re[y]??0;E=E.filter(t=>(t.record.confidence?re[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(`
|
|
3039
|
+
`)[0].slice(0,500);if(r&&r!==e){let i=f===`keyword`||!ee?await n.ftsSearch(r,T):await n.search(await t.embedQuery(r),T);i.length>0&&(E=i,k=`> _Original query "${e}" returned 0 results. Auto-reformulated to "${r}"._\n\n`,tv.debug(`Smart search fallback succeeded`,{originalQuery:e,altQuery:r,resultCount:i.length}))}}catch(e){tv.debug(`Smart search fallback failed`,{error:String(e)})}if(E.length===0){let t=ft({text:`No results found for the given query.`,query:e,searchMode:f,limit:d,results:[],durationMs:Date.now()-w}),n=Bl(t.summary);return{content:[{type:`text`,text:Vl(t.summary,n)}],isError:!t.ok,structuredContent:{...t.data??{results:[],totalResults:0,searchMode:f,query:e},ref:n}}}}let ie,ae;if(b>0&&!r&&(ae="> **Note:** `graph_hops` was set but no graph store is available. Graph augmentation skipped."),b>0&&r)try{let e=await jt(r,E.map(e=>({recordId:e.record.id,score:e.score,sourcePath:e.record.sourcePath})),{hops:b,maxPerHit:5});ie=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(`
|
|
3054
3040
|
`),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(`
|
|
3055
3041
|
`),i=[`- **Graph Context** (${b} hop${b>1?`s`:``}):`];e&&i.push(` Entities:\n${e}`),r&&i.push(` Relationships:\n${r}`),ie.set(t.recordId,i.join(`
|
|
3056
|
-
`))}}catch(e){
|
|
3057
|
-
`),{body:a,truncated:o}=
|
|
3042
|
+
`))}}catch(e){tv.warn(`Graph augmentation failed`,M(e)),ae=`> **Note:** Graph augmentation failed. Results shown without graph context.`}let oe=Date.now();for(let e of E)if(e.record.origin===`curated`&&e.record.indexedAt){let t=oe-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=Qe(E),s)for(let e of E){if(e.record.origin!==`curated`)continue;let t=jd(e.record.sourcePath);t&&nv(s,t,c,l)}let se=ov(x,E.length),ce=!1,le=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,ie?.get(n.id)??null].filter(Boolean).join(`
|
|
3043
|
+
`),{body:a,truncated:o}=sv(n,se);return ce||=o,`${r}\n${i}\n\n${a}${o?`\n\n_Full content: use \`lookup\` on \`${n.sourcePath}\`._`:``}`}).join(`
|
|
3058
3044
|
|
|
3059
3045
|
---
|
|
3060
3046
|
|
|
3061
|
-
`),ue=(f===`hybrid`?`hybrid (vector + keyword RRF)`:f===`keyword`?`keyword (FTS)`:`semantic (vector)`)+ne,A=
|
|
3047
|
+
`),ue=(f===`hybrid`?`hybrid (vector + keyword RRF)`:f===`keyword`?`keyword (FTS)`:`semantic (vector)`)+ne,A=fv(E,e),de=A.length>0?`\n_Distinctive terms: ${A.map(e=>`\`${e}\``).join(`, `)}_`:``,fe=await mv(n,E),pe=[];if(E.length===0)pe.push("`reindex` — no results found, index may be stale"),pe.push("`find` — try federated search with glob/regex");else{let e=E[0]?.record.sourcePath;e&&pe.push(`\`lookup\` — see all chunks from \`${e}\``),pe.push("`symbol` — resolve a specific symbol from the results"),pe.push("`compact` — compress a result file for focused reading")}let me=[ae?`${ae}\n\n`:``,fe?`${fe}\n\n`:``,le,`\n\n---\n_Search mode: ${ue} | ${E.length} results_${de}`,`\n_Next: ${pe.join(` | `)}_`],he=k+me.join(``),ge=!1;if(x){let e=L(he,x);ge=e!==he,he=e}ge||=ce;let _e=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}:{}})),ve=[ae,fe].filter(e=>!!e),ye=ft({text:he,query:e,searchMode:f,limit:d,results:_e,durationMs:Date.now()-w,truncated:ge,caveats:ve}),be=Bl(ye.summary),j=new Set,xe=[];for(let e of E){if(e.record.origin!==`curated`||e.record.sourcePath.startsWith(`[`))continue;let t=jd(e.record.sourcePath);if(!t)continue;let n=kd(t,e.record.headingPath??t);n&&!j.has(n.uri)&&(j.add(n.uri),xe.push(n))}return{content:[{type:`text`,text:Vl(ye.summary,be)},...xe],isError:!ye.ok,structuredContent:{...ye.data??{results:[],totalResults:0,searchMode:f,query:e},ref:be}}}catch(t){tv.error(`Search failed`,M(t));let n=ft({text:`Search failed: ${t instanceof Error?t.message:String(t)}`,query:e??``,searchMode:f??`hybrid`,limit:d,results:[],durationMs:Date.now()-w}),r=Bl(n.summary);return{content:[{type:`text`,text:Vl(n.summary,r)}],structuredContent:{...n.data??{results:[],totalResults:0,searchMode:f??`hybrid`,query:e??``},ref:r}}}})}const gv=j(`tools`);function _v(e,t,n){let r=W(`session_digest`);e.registerTool(`session_digest`,{title:r.title,description:`Compress the current session's tool trajectory into a focused digest. Aggregates replay log, stash state, and checkpoints. Supports deterministic and LLM-assisted (sampling) modes with configurable token budget.`,inputSchema:{scope:R.enum([`tools`,`stash`,`all`]).default(`all`).describe(`What to include: tools (replay only), stash (stash + checkpoints only), or all`),since:R.string().optional().describe(`ISO timestamp — only include activity after this time`),last:R.number().min(1).max(500).optional().describe(`Max replay entries to consider (default: 50)`),focus:R.string().optional().describe(`Focus query — prioritize entries matching this topic`),mode:R.enum([`deterministic`,`sampling`]).default(`deterministic`).describe(`Summary mode: deterministic (fast, template-based) or sampling (LLM-assisted, richer)`),token_budget:R.number().min(100).max(8e3).default(2e3).describe(`Target token budget for the digest output`),persist:R.boolean().default(!0).describe(`Auto-save digest to stash for crash recovery`)},annotations:r.annotations},J(`session_digest`,async({scope:e,since:r,last:i,focus:a,mode:o,token_budget:s,persist:c})=>{try{let l={scope:e,since:r,last:i,focus:a,mode:o,tokenBudget:s,persist:c},u=t?{stateStore:t}:void 0;return{content:[{type:`text`,text:(o===`sampling`&&n?.available?await wn(l,async(e,t,r)=>(await n.createMessage({prompt:e,systemPrompt:t,maxTokens:r})).text,u):Cn(l,u)).digest}]}}catch(e){return gv.error(`Session digest failed`,M(e)),q(`INTERNAL`,`Session digest failed: ${e instanceof Error?e.message:String(e)}`)}}))}const vv=1e4,yv={defaultTtlSeconds:300,defaultLeaseTtlMinutes:10,globalEnabled:!1};function bv(e){return e??yv}function xv(e,t){let n=e.trim();if(!n)throw Error(`${t} is required`);return n}function Sv(e,t,n){let r=xv(e,t);if(r.length>n)throw Error(`${t} exceeds max length of ${n}`);return r}function Cv(e,t){if(!Number.isFinite(e)||e<=0)throw Error(`${t} must be greater than 0`);return Math.trunc(e)}function wv(e,t=!1,n){xv(e,`workspace`);let r=bv(n);if(!t)return e;if(!r.globalEnabled)throw Error(`Global signal scope is disabled`);return`__global__`}function Tv(e,t,n){let r=bv(n),i=wv(t.workspace,t.global??!1,r),a=Sv(t.key,`key`,500),o=Sv(t.value,`value`,vv),s=t.agent?Sv(t.agent,`agent`,500):void 0,c=Cv(t.ttlSeconds??r.defaultTtlSeconds,`ttlSeconds`);return e.signalPost(i,a,o,s,c)}function Ev(e,t,n){let r=xv(t,`workspace`),i=Sv(n,`key`,500);return e.signalGet(r,i)}function Dv(e,t){let n=xv(t,`workspace`);return e.signalList(n)}function Ov(e,t,n){let r=xv(t,`workspace`),i=n===void 0?void 0:Sv(n,`key`,500);return e.signalClear(r,i)}function kv(e,t,n){let r=bv(n),i=Sv(t.resource,`resource`,500),a=Sv(t.holder,`holder`,500),o=xv(t.workspace,`workspace`),s=t.intent?Sv(t.intent,`intent`,vv):void 0,c=Cv(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 Av(e,t,n,r){let i=xv(t,`workspace`),a=Sv(n,`resource`,500),o=Sv(r,`holder`,500);return e.leaseRelease(a,o,i)}function jv(e,t){let n=xv(t,`workspace`);return e.leaseList(n)}const Mv=j(`tools:signal`);function Nv(e){return JSON.stringify(e,null,2)}function Pv(e,t,n){let r=W(`signal`),i={...yv,...n};e.registerTool(`signal`,{title:r.title,description:`Inter-agent signaling and lease coordination`,inputSchema:{action:R.enum([`post`,`get`,`list`,`clear`,`lease`,`unlease`,`leases`]).describe(`Signal action to perform`),workspace:R.string().describe(`Workspace identifier (required)`),key:R.string().optional().describe(`Signal key (for post/get/clear)`),value:R.string().optional().describe(`Signal value (for post)`),agent:R.string().optional().describe(`Agent identifier`),resource:R.string().optional().describe(`Resource path (for lease/unlease)`),holder:R.string().optional().describe(`Lease holder ID (for lease/unlease)`),intent:R.string().optional().describe(`What the holder plans to do`),ttl:R.number().optional().describe(`TTL (seconds for signals, minutes for leases)`),global:R.boolean().optional().describe(`Use global scope (default: false)`)},annotations:r.annotations},J(`signal`,async({action:e,workspace:n,key:r,value:a,agent:o,resource:s,holder:c,intent:l,ttl:u,global:d})=>{try{switch(e){case`post`:{if(!r||a===void 0)throw Error(`key and value are required for post`);let e=Tv(t,{workspace:n,key:r,value:a,agent:o,ttlSeconds:u,global:d},i);return{content:[{type:`text`,text:Nv({id:e})}],structuredContent:{id:e}}}case`get`:{if(!r)throw Error(`key is required for get`);let e=Ev(t,wv(n,d??!1,i),r);return{content:[{type:`text`,text:e.length===0?`[]`:Nv(e)}],structuredContent:{signals:e}}}case`list`:{let e=Dv(t,wv(n,d??!1,i));return{content:[{type:`text`,text:e.length===0?`[]`:Nv(e)}],structuredContent:{signals:e}}}case`clear`:{let e=Ov(t,wv(n,d??!1,i),r);return{content:[{type:`text`,text:Nv({cleared:e})}],structuredContent:{cleared:e}}}case`lease`:{if(!s||!c)throw Error(`resource and holder are required for lease`);let e=kv(t,{resource:s,holder:c,workspace:n,intent:l,ttlMinutes:u},i);return{content:[{type:`text`,text:Nv(e)}],structuredContent:e}}case`unlease`:{if(!s||!c)throw Error(`resource and holder are required for unlease`);let e=Av(t,n,s,c);return{content:[{type:`text`,text:Nv({released:e})}],structuredContent:{released:e}}}case`leases`:{let e=jv(t,n);return{content:[{type:`text`,text:e.length===0?`[]`:Nv(e)}],structuredContent:{leases:e}}}}}catch(e){return Mv.error(`Signal operation failed`,M(e)),q(`INTERNAL`,`Signal operation failed: ${e instanceof Error?e.message:String(e)}`)}}))}function Fv(e,t){return e.length<=t?e:e.slice(0,t)}function Iv(e){if(!e)return 0;let t=Date.parse(e);return Number.isNaN(t)?0:t}async function Lv(e,t,n=d){if(!e||!t)return null;try{let[r,i,o]=await Promise.all([e.list({category:`lessons`,limit:200,orderBy:`updated`,order:`desc`}),e.list({category:`conventions`,limit:200,orderBy:`updated`,order:`desc`}),e.list({category:`session`,limit:200,orderBy:`updated`,order:`desc`})]),s=r.filter(e=>e.tags.includes(`lesson`)).map(e=>{let r=t.memoryMetaGet(e.path);return!r||r.supersededBy!=null?null:{entry:e,confidence:c(r.confidence,r.lastAccessedAt,r.createdAt,n)}}).filter(e=>e!==null).sort((e,t)=>t.confidence-e.confidence).slice(0,3);return{lessons:await Promise.all(s.map(async({entry:t,confidence:n})=>{let r=a((await e.read(t.path)).content);return{title:t.title,insight:Fv(r.insight??``,150),confidence:n}})),conventions:i.map(e=>({entry:e,lastAccessedAt:t.memoryMetaGet(e.path)?.lastAccessedAt??null})).filter(({entry:e})=>(e.contentPreview?.trim()??``).length>5).sort((e,t)=>Iv(t.lastAccessedAt)-Iv(e.lastAccessedAt)).slice(0,2).map(({entry:e})=>({title:e.title,preview:e.contentPreview})),checkpoint:o.map(e=>({entry:e,lastAccessedAt:t.memoryMetaGet(e.path)?.lastAccessedAt??null})).sort((e,t)=>Iv(t.lastAccessedAt)-Iv(e.lastAccessedAt)).map(({entry:e})=>Fv(e.contentPreview,200))[0]??null}}catch{return null}}function Rv(e,t=600){if(!e)return{lines:[],totalChars:0,autoInjectCount:0};let n=[],r=0;for(let t of e.lessons){if(t.confidence<45)continue;let e=rp(t.title,t.insight,t.confidence,200);n.push(`• ${e}`),r++}for(let t of e.conventions){let e=t.preview?.trim()||``;if(e){let r=e.length>120?`${e.slice(0,117)}...`:e;n.push(`• ${t.title}: ${r}`)}else n.push(`• ${t.title}`)}if(n.length===0)return{lines:[],totalChars:0,autoInjectCount:0};let i=[`━━ Knowledge ━━`,...n,`───`],a=i.join(`
|
|
3062
3048
|
`);if(a.length>t)for(;i.length>3&&a.length>t;)i.splice(1,1)[0]?.startsWith(`•`)&&r--;return{lines:i,totalChars:i.join(`
|
|
3063
|
-
`).length,autoInjectCount:r}}const
|
|
3049
|
+
`).length,autoInjectCount:r}}const zv=j(`tools`),Bv=14400*1e3,Vv={includePrelude:R.boolean().default(!1).describe(`Include session prelude with top lessons, conventions, and last checkpoint`)};function Hv(e,t,n,r=15e3){let i,a=new Promise(e=>{i=setTimeout(()=>{zv.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),zv.warn(`Status sub-operation "${n}" failed: ${e instanceof Error?e.message:String(e)}`),{value:t,timedOut:!1})),a])}function Uv(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 Wv(){let e=cr.get(),t=sr.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(`
|
|
3064
3050
|
`):` none`,r=t.healAttempted?` Auto-heal: ${t.healSuccess?`✓ succeeded`:`✗ failed (${t.healError??`unknown`})`}`:` Auto-heal: not attempted`;return[`- **Tree-sitter (WASM)**: ⚠ Unavailable (regex fallback)`,` Reason: ${t.reason||`unknown`}`,` Paths checked:`,n,r,` OS: ${t.os} ${t.arch} | Node: ${t.nodeVersion}`,` Fix: Reinstall package or run vendor:wasm script`].join(`
|
|
3065
|
-
`)}const
|
|
3066
|
-
`)}],structuredContent:o}}))}function
|
|
3067
|
-
`),he=e||O>=
|
|
3068
|
-
`)};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
|
|
3069
|
-
|
|
3070
|
-
`);return c===o.length?q(`INTERNAL`,u):{content:[{type:`text`,text:u}]}}))}function
|
|
3071
|
-
`)}]}}catch(e){return
|
|
3072
|
-
`)}]}}))}function
|
|
3051
|
+
`)}const Gv=5*6e4;let Kv=null,qv=null;function Jv(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 Yv(){let e=Date.now();if(Kv&&e-Kv.ts<Gv)return Kv.value;try{let t=I(Hn(),`.copilot`,`.aikit-scaffold.json`);if(!N(t))return Kv={value:null,ts:e},null;let n=JSON.parse(P(t,`utf-8`)).version??null;return Kv={value:n,ts:e},n}catch{return Kv={value:null,ts:e},null}}function Xv(){let e=Date.now();if(qv&&e-qv.ts<Gv)return qv.value;try{let t=I(process.cwd(),`.github`,`.aikit-scaffold.json`);if(!N(t))return qv={value:null,ts:e},null;let n=JSON.parse(P(t,`utf-8`)).version??null;return qv={value:n,ts:e},n}catch{return qv={value:null,ts:e},null}}function Zv(e){let t=W(`status`);e.registerTool(`status`,{title:t.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:Vv,annotations:t.annotations},J(`status`,async()=>{let e=oe(),t=Yv(),n=Xv(),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)**: ${cr.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=se(),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`?(ie(),a.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${e} ≠ ${c}`,`- Error: ${o.error??`unknown`}`)):(ie(),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:!!cr.get(),wasmDiagnostics:sr.get(),graphStats:null,curatedCount:0,serverVersion:e,scaffoldVersion:t??null,workspaceScaffoldVersion:n??null,upgradeAvailable:r||i,contextPressure:0,nextAction:Uv({onboarded:!1,indexStale:!1,contextPressure:0})};return{content:[{type:`text`,text:a.join(`
|
|
3052
|
+
`)}],structuredContent:o}}))}function Qv(e,t,n,r,i,a,o,s,c){let l=W(`status`);e.registerTool(`status`,{title:l.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:Vv,annotations:l.annotations},J(`status`,async({includePrelude:e=!1})=>{let l=[];try{let[u,d]=await Promise.all([Hv(t.getStats(),{totalRecords:0,totalFiles:0,lastIndexedAt:null,contentTypeBreakdown:{}},`store.getStats`),Hv(t.listSourcePaths(),[],`store.listSourcePaths`)]),f=u.value;u.timedOut&&l.push(`⚠ Index stats timed out — values may be incomplete`);let p=d.value;d.timedOut&&l.push(`⚠ File listing timed out`);let m=null,h=0,g=[`## AI Kit Status`,``,`- **Total Records**: ${f.totalRecords}`,`- **Total Files**: ${f.totalFiles}`,`- **Last Indexed**: ${f.lastIndexedAt??`Never`}`,``,`### Content Types`,...Object.entries(f.contentTypeBreakdown).map(([e,t])=>`- ${e}: ${t}`),``,`### Indexed Files`,...p.slice(0,50).map(e=>`- ${e}`),p.length>50?`\n... and ${p.length-50} more files`:``];if(n)try{let e=await Hv(n.getStats(),{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}},`graphStore.getStats`);if(e.timedOut)l.push(`⚠ Graph stats timed out`),g.push(``,`### Knowledge Graph`,`- Graph stats timed out`);else{let t=e.value;m={nodes:t.nodeCount,edges:t.edgeCount},g.push(``,`### Knowledge Graph`,`- **Nodes**: ${t.nodeCount}`,`- **Edges**: ${t.edgeCount}`,...Object.entries(t.nodeTypes).map(([e,t])=>` - ${e}: ${t}`));try{let e=await Hv(n.validate(),{valid:!0,danglingEdges:[],orphanNodes:[],stats:{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}}},`graphStore.validate`);if(!e.timedOut){let t=e.value;t.valid||g.push(`- **⚠ Integrity Issues**: ${t.danglingEdges.length} dangling edges`),t.orphanNodes.length>0&&g.push(`- **Orphan nodes**: ${t.orphanNodes.length}`)}}catch{}}}catch{g.push(``,`### Knowledge Graph`,`- Graph store unavailable`)}let _=a?.onboardDir??``,v=N(_),y=i?.onboardComplete||v;if(g.push(``,`### Onboard Status`,y?`- ✅ Complete${i?.onboardTimestamp?` (last: ${i.onboardTimestamp})`:``}`:'- ❌ Not run — call `onboard({ path: "." })` to analyze the codebase',`- **Onboard Directory**: \`${_}\``),r)try{let e=await Hv(r.count(),0,`curated.count`);e.timedOut?(l.push(`⚠ Curated knowledge count timed out`),g.push(``,`### Curated Knowledge`,`- Listing timed out`)):(h=e.value,g.push(``,`### Curated Knowledge`,h>0?`- ${h} entries`:'- Empty — use `knowledge({ action: "remember", ... })` to persist decisions'))}catch{g.push(``,`### Curated Knowledge`,`- Unable to read curated entries`)}let b=Ln().filter(e=>e.status===`watching`);if(b.length>0){g.push(``,`### File Watchers`,`- **Active**: ${b.length}`);for(let e of b){let t=e.pendingFiles?.length??0;if(g.push(` - \`${e.path}\`: ${e.eventCount} events, ${t} pending files`),t>0&&t<=10)for(let t of e.pendingFiles)g.push(` - \`${t}\``);else t>10&&g.push(` - ${t} pending files (use \`watch({ action: 'list' })\` for details)`)}}let x=Jv(f.totalRecords,m?.nodes??0,m?.edges??0,h),S=f.lastIndexedAt?new Date(f.lastIndexedAt).getTime():0,C=S>0?Date.now()-S:1/0,w=Uv({onboarded:y,indexStale:y&&C>1440*60*1e3,contextPressure:x});g.push(``),g.push(`## 📊 Context Pressure: ${x}/100`),x>=80?g.push(`⚠️ High pressure — consider pruning stale entries or compacting context.`):x>=50?g.push(`ℹ️ Moderate pressure — AI Kit memory is well-populated.`):g.push(`✅ Low pressure — plenty of headroom for more content.`);let T=0;if(f.lastIndexedAt){T=new Date(f.lastIndexedAt).getTime();let e=(Date.now()-T)/(1e3*60*60);g.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`)}g.push(``,`### Next Action`,`- **${w.kind}**: ${w.reason}`);let E=null,D=t;if(typeof D.getDiagnostics==`function`)try{let e=D.getDiagnostics();E={adapterType:e.adapterType,vectorSearchEnabled:e.vectorSearchEnabled,ftsEnabled:e.ftsEnabled,degradedMode:e.degradedMode,dbPath:e.dbPath,dbSizeBytes:e.dbSizeBytes,embeddingDim:e.embeddingDim,vectorDtype:e.vectorDtype},g.push(``,`### Storage`,`- **Backend**: ${a?.store?.backend??`unknown`}`,`- **Adapter**: ${E.adapterType}`,`- **Vector search**: ${E.vectorSearchEnabled?`✅ enabled`:`⚠ disabled (FTS-only fallback)`}`,E.dbPath?`- **DB**: ${E.dbPath}`:``,E.dbSizeBytes==null?``:`- **DB size**: ${(E.dbSizeBytes/1024/1024).toFixed(2)} MB`,`- **Embedding dim**: ${E.embeddingDim}`,`- **Vector dtype**: ${E.vectorDtype}`)}catch{}if(o===`smart`)if(g.push(``,`### Smart Indexing`),s){let e=s();e?g.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}`):g.push(`- **Mode**: Smart (trickle)`,`- **Status**: scheduler state unavailable (init may have failed)`)}else g.push(`- **Mode**: Smart (trickle) — scheduler state unavailable`);let O=0;{try{let e=a?.stateDir?F(a.stateDir,`stash`):null;if(e&&N(e)){let t=ke(e).mtimeMs;t>T&&(T=t)}}catch{}let e=[];if(r)try{let t=h>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>T&&(T=t)}e.push(...t)}catch{}if(O=T>0?Date.now()-T:0,O>=Bv){let t=Math.floor(O/36e5);if(g.push(``,`### 🌅 Session Briefing`,`_${t}+ hours since last activity — here's what to pick up:_`,``),e.length>0){g.push(`**Recent decisions/notes:**`);for(let t of e)g.push(`- **${t.title}** (${t.category??`note`}) — ${(t.contentPreview??``).slice(0,80)}…`)}g.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')}}g.push(``,`### Runtime`,Wv());let k=me.instance().getAll(),ee=k.filter(e=>e.status!==`healthy`);if(ee.length>0){g.push(``,`### ⚠️ Subsystem Health`);for(let e of ee){let t=Math.round((Date.now()-e.since)/1e3);g.push(`- **${e.name}**: ${e.status} (${t}s ago${e.reason?` — ${e.reason}`:``})`)}}else k.length>0&&g.push(``,`### ✅ Subsystem Health`,`- All ${k.length} subsystems healthy`);let te=fe.getAll();if(te.size>0){g.push(``,`### 🔌 Circuit Breakers`);for(let[e,t]of te){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)`}g.push(r)}}let ne=Yv(),re=Xv(),ae=oe(),ce=ne!=null&&ne!==ae,le=re!=null&&re!==ae;if(ce||le){let e=se(),t=[];ce&&t.push(`user scaffold v${ne}`),le&&t.push(`workspace scaffold v${re}`);let n=t.join(`, `);e.state===`success`?g.push(``,`### ✅ Upgrade Applied`,`- Server v${ae} — ${n} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):e.state===`pending`?g.push(``,`### ⏳ Upgrade In Progress`,`- Server v${ae} ≠ ${n}`,`- Auto-upgrade is running in the background…`):e.state===`failed`?(ie(),g.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${ae} ≠ ${n}`,`- Error: ${e.error??`unknown`}`)):(ie(),g.push(``,`### ⬆ Upgrade Available`,`- Server v${ae} ≠ ${n}`,`- Auto-upgrade triggered — check again shortly.`))}l.length>0&&g.push(``,`### ⚠ Warnings`,...l.map(e=>`- ${e}`));let ue=Go();if(ue.length>0){let e=ue.sort((e,t)=>t.callCount-e.callCount);g.push(``,`### Tool Usage This Session`,``),g.push(`| Tool | Calls | Tokens In | Tokens Out | Errors | Avg Latency |`),g.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);g.push(`| ${t.tool} | ${t.callCount} | ${e.toLocaleString()} | ${n.toLocaleString()} | ${t.errorCount} | ${r}ms |`)}}let A=Vo();A.callCount>0&&(g.push(``),g.push(`### Session Token Usage`),g.push(`- Tool calls: ${A.callCount}`),g.push(`- Input chars: ${A.totalInputChars.toLocaleString()}`),g.push(`- Output chars: ${A.totalOutputChars.toLocaleString()}`),g.push(`- Est. input tokens: ${Math.round(A.totalInputChars/4).toLocaleString()}`),g.push(`- Est. total tokens: ${Math.round((A.totalInputChars+A.totalOutputChars)/4).toLocaleString()}`));let de=Po();if(de.bufferSize>=10){let e=de.state===`healthy`?`🟢`:de.state===`degraded`?`🔴`:`🟡`;g.push(``,`### Auto-GC: ${e} ${de.state}`),g.push(`- p95 latency: ${de.p95}ms | buffer: ${de.bufferSize} samples`),de.gcCount>0&&g.push(`- GC cycles triggered: ${de.gcCount}`)}let pe=g.join(`
|
|
3053
|
+
`),he=e||O>=Bv?await Lv(r,c):void 0,ge=b.length>0?b.map(e=>({id:e.id,path:e.path,eventCount:e.eventCount,pendingFiles:e.pendingFiles??[]})):void 0,_e={totalRecords:f.totalRecords,totalFiles:f.totalFiles,lastIndexedAt:f.lastIndexedAt??null,onboarded:y,onboardDir:_,contentTypes:f.contentTypeBreakdown,wasmAvailable:!!cr.get(),wasmDiagnostics:sr.get(),graphStats:m,curatedCount:h,serverVersion:ae,scaffoldVersion:ne??null,workspaceScaffoldVersion:re??null,upgradeAvailable:ce||le,storeBackend:a?.store?.backend,storeDiagnostics:E??null,contextPressure:x,nextAction:w,watchers:ge,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},...he===void 0?{}:{prelude:he}};return{content:[{type:`text`,text:pe+(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:_e}}catch(e){return zv.error(`Status failed`,M(e)),q(`INTERNAL`,`Status check failed: ${e instanceof Error?e.message:String(e)}`)}}))}const $v=j(`tools`);function ey(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 ty(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:R.array(R.string().max(2e3)).min(1).max(5).describe('Search queries (1–5). Single: `["react hooks"]`. Multiple searched in parallel.'),limit:R.number().min(1).max(20).default(5).describe(`Max results per query`),site:R.string().optional().describe(`Restrict to domain (e.g., "docs.aws.amazon.com")`),provider:R.enum([`multi`,`duckduckgo`,`bing-html`,`mojeek`,`searxng`,`google`,`brave`,`bing`]).optional().describe("Search provider. Defaults to env AIKIT_SEARCH_PROVIDER, then `multi` (fan-out). Single keyless: `duckduckgo`, `bing-html`, `mojeek`. Self-hosted: `searxng` (requires SEARXNG_URL). Keyed APIs: `google` (GOOGLE_API_KEY+GOOGLE_CSE_ID), `brave` (BRAVE_API_KEY), `bing` (BING_API_KEY). Missing keys auto-fall back to duckduckgo.")},annotations:t.annotations},J(`web_search`,async({queries:e,limit:t,site:n,provider:r})=>{let i=e,a=async e=>{let i=await Vn({query:e,limit:t,site:n,provider:r}),a=[`## Search: ${i.query} _(via ${i.provider})_`,``];if(i.results.length===0)a.push(`No results found.`);else for(let e of i.results)a.push(`### [${e.title}](${e.url})`,e.snippet,``);return a.join(`
|
|
3054
|
+
`)};if(i.length===1)try{return{content:[{type:`text`,text:`${await a(i[0])}\n---\n_Next: Use \`web_fetch\` to read any of these pages in full._`}]}}catch(e){return $v.error(`Web search failed`,M(e)),q(`INTERNAL`,`Web search failed: ${e instanceof Error?e.message:String(e)}`)}let o=await Promise.allSettled(i.map(e=>a(e))),s=[],c=0;for(let e=0;e<o.length;e++){let t=o[e];if(t.status===`fulfilled`)s.push(t.value);else{c++;let n=t.reason instanceof Error?t.reason.message:String(t.reason);$v.error(`Web search failed`,{query:i[e],error:n}),s.push(`## ❌ Search failed: ${i[e]}\n\n${n}`)}}let l=`_Searched ${o.length-c}/${o.length} queries successfully._`;s.push(``,`---`,l,"_Next: Use `web_fetch` to read any of these pages in full._");let u=s.join(`
|
|
3055
|
+
|
|
3056
|
+
`);return c===o.length?q(`INTERNAL`,u):{content:[{type:`text`,text:u}]}}))}function ny(e){let t=W(`http`);e.registerTool(`http`,{title:t.title,description:`Make HTTP requests (GET/POST/PUT/PATCH/DELETE/HEAD) for API testing. Returns status, headers, and formatted body with timing info.`,inputSchema:{url:R.string().url().describe(`Request URL (http/https only)`),method:R.enum([`GET`,`POST`,`PUT`,`PATCH`,`DELETE`,`HEAD`]).default(`GET`).describe(`HTTP method`),headers:R.record(R.string(),R.string()).optional().describe(`Request headers as key-value pairs`),body:R.string().optional().describe(`Request body (for POST/PUT/PATCH)`),timeout:R.number().min(1e3).max(6e4).default(15e3).describe(`Timeout in milliseconds`)},annotations:t.annotations},J(`http`,async({url:e,method:t,headers:n,body:r,timeout:i})=>{try{let a=await Ft({url:e,method:t,headers:n,body:r,timeout:i}),o=[`## ${t} ${e}`,``,`**Status:** ${a.status} ${a.statusText}`,`**Time:** ${a.durationMs}ms`,`**Size:** ${a.sizeBytes} bytes`,`**Content-Type:** ${a.contentType}`,``,`### Headers`,"```json",JSON.stringify(a.headers),"```",``,`### Body`,a.contentType.includes(`json`)?"```json":"```",a.body,"```"];return a.truncated&&o.push(``,`_Response truncated — total size: ${a.sizeBytes} bytes_`),{content:[{type:`text`,text:o.join(`
|
|
3057
|
+
`)}]}}catch(e){return $v.error(`HTTP request failed`,M(e)),q(`INTERNAL`,`HTTP request failed: ${e instanceof Error?e.message:String(e)}`)}}))}function ry(e){let t=W(`regex_test`);e.registerTool(`regex_test`,{title:t.title,description:`Test a regex pattern against sample strings. Supports match, replace, and split modes.`,inputSchema:{pattern:R.string().max(500).describe(`Regex pattern (without delimiters)`),flags:R.string().max(10).regex(/^[gimsuy]*$/).default(``).describe(`Regex flags (g, i, m, s, etc.)`),test_strings:R.array(R.string().max(1e4)).max(50).describe(`Strings to test the pattern against`),mode:R.enum([`match`,`replace`,`split`]).default(`match`).describe(`Test mode`),replacement:R.string().optional().describe(`Replacement string (for replace mode)`)},annotations:t.annotations},J(`regex_test`,async({pattern:e,flags:t,test_strings:n,mode:r,replacement:i})=>{let a=un({pattern:e,flags:t,testStrings:n,mode:r,replacement:i});if(!a.valid)return q(`VALIDATION`,`Invalid regex: ${a.error}`);let o=[`## Regex: \`/${a.pattern}/${a.flags}\``,``,`Mode: ${r}`,``];for(let e of a.results){if(o.push(`**Input:** \`${e.input}\``),o.push(`**Matched:** ${e.matched}`),e.matches)for(let t of e.matches){let e=t.groups.length>0?` groups: [${t.groups.join(`, `)}]`:``;o.push(` - "${t.full}" at index ${t.index}${e}`)}e.replaced!==void 0&&o.push(`**Result:** \`${e.replaced}\``),e.split&&o.push(`**Split:** ${JSON.stringify(e.split)}`),o.push(``)}return{content:[{type:`text`,text:o.join(`
|
|
3058
|
+
`)}]}}))}function iy(e){let t=W(`encode`);e.registerTool(`encode`,{title:t.title,description:`Encode, decode, or hash text. Supports base64, URL encoding, SHA-256, MD5, JWT decode, hex.`,inputSchema:{operation:R.enum([`base64_encode`,`base64_decode`,`url_encode`,`url_decode`,`sha256`,`md5`,`jwt_decode`,`hex_encode`,`hex_decode`]).describe(`Operation to perform`),input:R.string().max(1e6).describe(`Input text`)},annotations:t.annotations},J(`encode`,async({operation:e,input:t})=>{try{let n=yt({operation:e,input:t});return{content:[{type:`text`,text:`## ${e}\n\n**Input:** \`${t.length>100?`${t.slice(0,100)}...`:t}\`\n**Output:**\n\`\`\`\n${n.output}\n\`\`\``}]}}catch(e){return $v.error(`Encode failed`,M(e)),q(`INTERNAL`,`Encode failed: ${e instanceof Error?e.message:String(e)}`)}}))}function ay(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:Bs,inputSchema:{path:R.string().describe(`File or directory path to measure`),extensions:R.array(R.string()).optional().describe(`File extensions to include (default: .ts,.tsx,.js,.jsx)`),include_hidden:R.boolean().optional().describe(`Include hidden trees such as .generated and .cache. Default false.`),max_tokens:R.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`)},annotations:t.annotations},J(`measure`,async({path:e,extensions:t,include_hidden:n,max_tokens:r})=>{try{let i=await 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?L(a.join(`
|
|
3073
3059
|
`),r):a.join(`
|
|
3074
|
-
`)}],structuredContent:o}}catch(e){return
|
|
3060
|
+
`)}],structuredContent:o}}catch(e){return ey(e)?($v.warn(`Measure failed`,{error:`File not found`}),q(`NOT_FOUND`,`File not found`)):($v.error(`Measure failed`,M(e)),q(`INTERNAL`,`Measure failed: ${e instanceof Error?e.message:String(e)}`))}}))}function oy(e){let t=W(`changelog`);e.registerTool(`changelog`,{title:t.title,description:`Generate a changelog from git history between two refs. Groups by conventional commit type.`,inputSchema:{from:R.string().max(200).describe(`Start ref (tag, SHA, HEAD~N)`),to:R.string().max(200).default(`HEAD`).describe(`End ref (default: HEAD)`),format:R.enum([`grouped`,`chronological`,`per-scope`]).default(`grouped`).describe(`Output format`),include_breaking:R.boolean().default(!0).describe(`Highlight breaking changes`),cwd:R.string().optional().describe(`Repository root or working directory`)},annotations:t.annotations},J(`changelog`,async({from:e,to:t,format:n,include_breaking:r,cwd:i})=>{try{let a=$e({from:e,to:t,format:n,includeBreaking:r,cwd:i}),o=`${a.stats.total} commits (${Object.entries(a.stats.types).map(([e,t])=>`${t} ${e}`).join(`, `)})`;return{content:[{type:`text`,text:`${a.markdown}\n---\n_${o}_`}]}}catch(e){return $v.error(`Changelog failed`,M(e)),q(`INTERNAL`,`Changelog failed: ${e instanceof Error?e.message:String(e)}`)}}))}function sy(e){let t=W(`schema_validate`);e.registerTool(`schema_validate`,{title:t.title,description:`Validate JSON data against a JSON Schema. Supports type, required, properties, items, enum, pattern, min/max.`,inputSchema:{data:R.string().max(5e5).describe(`JSON data to validate (as string)`),schema:R.string().max(5e5).describe(`JSON Schema to validate against (as string)`)},annotations:t.annotations},J(`schema_validate`,async({data:e,schema:t})=>{try{let n=bn({data:JSON.parse(e),schema:JSON.parse(t)});if(n.valid)return{content:[{type:`text`,text:`## Validation: PASSED
|
|
3075
3061
|
|
|
3076
3062
|
Data matches the schema.`}]};let r=[`## Validation: FAILED`,``,`**${n.errors.length} error(s):**`,``];for(let e of n.errors){let t=e.expected?` (expected: ${e.expected}, got: ${e.received})`:``;r.push(`- \`${e.path}\`: ${e.message}${t}`)}return{content:[{type:`text`,text:r.join(`
|
|
3077
|
-
`)}]}}catch(e){return
|
|
3078
|
-
`)}],structuredContent:a}}))}function
|
|
3079
|
-
`)}],structuredContent:o}}catch(e){return
|
|
3063
|
+
`)}]}}catch(e){return $v.error(`Schema validation failed`,M(e)),q(`INTERNAL`,`Schema validation failed: ${e instanceof Error?e.message:String(e)}`)}}))}function cy(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:R.boolean().default(!1).describe(`Include environment variables`),filter_env:R.string().optional().describe(`Filter env vars by name substring`),show_sensitive:R.boolean().default(!1).describe(`Show sensitive values (keys, tokens, etc.) — redacted by default`)},annotations:t.annotations},J(`env`,async({include_env:e,filter_env:t,show_sensitive:n})=>{let r=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(`
|
|
3064
|
+
`)}],structuredContent:a}}))}function ly(e){let t=W(`time`);e.registerTool(`time`,{title:t.title,description:`Parse dates, convert timezones, calculate durations, add time. Supports ISO 8601, unix timestamps, and human-readable formats.`,outputSchema:Hs,inputSchema:{operation:R.enum([`now`,`parse`,`convert`,`diff`,`add`]).describe(`now: current time | parse: parse a date string | convert: timezone conversion | diff: duration between two dates | add: add duration to date`),input:R.string().optional().describe(`Date input (ISO, unix timestamp, or parseable string). For diff: two comma-separated dates`),timezone:R.string().optional().describe(`Target timezone (e.g., "America/New_York", "Asia/Tokyo")`),duration:R.string().optional().describe(`Duration to add (e.g., "2h30m", "1d", "30s") — for add operation`)},annotations:t.annotations},J(`time`,async({operation:e,input:t,timezone:n,duration:r})=>{try{let i=Fn({operation:e,input:t,timezone:n,duration:r}),a=[`**${i.output}**`,``,`ISO: ${i.iso}`,`Unix: ${i.unix}`];i.details&&a.push(``,"```json",JSON.stringify(i.details),"```");let o={iso:i.iso,unix:i.unix,timezone:n??Intl.DateTimeFormat().resolvedOptions().timeZone,formatted:i.output};return{content:[{type:`text`,text:a.join(`
|
|
3065
|
+
`)}],structuredContent:o}}catch(e){return $v.error(`Time failed`,M(e)),q(`INTERNAL`,`Time failed: ${e instanceof Error?e.message:String(e)}`)}}))}function uy(e){try{let t=F(e,`.flows`);if(!N(t))return null;let n=Ee(t,{withFileTypes:!0});for(let e of n){if(!e.isDirectory())continue;let n=F(t,e.name,`meta.json`);if(N(n)&&JSON.parse(P(n,`utf-8`)).status===`active`)return e.name}}catch{return null}return null}function dy(e){let{server:t,aikit:n,config:r,elicitor:i,resourceNotifier:a,samplingClient:o,indexMode:s,getSmartState:c,getSmartScheduler:l,precomputedActiveTools:u}=e,d=new Do,f=r.sources[0]?.path??process.cwd(),p=be(f),m={activeSlug:null};m.activeSlug=uy(f);let h=new Ka(F(r.stateDir??``,`flow-context`),()=>m.activeSlug),g=new ka;g.register(Pi()),g.register(Ea),g.register(Wi),g.register(ha),g.register(Vi),g.register(Fi),g.register(Ii),g.register(Ca),g.register(Ri),g.register(Oa),g.register(ma(()=>m.activeSlug?{active:!0,slug:m.activeSlug}:null));let _=new Pa(g,n.curated,{},h),v=u??Ps(r,[...Va,...rs],U,as(r)),y=e=>v.has(e),b=new Set([...v].filter(e=>!Lp.includes(e)&&!po.has(e))),x=new _o;d.use(Ma(_),{order:5,name:`auto-knowledge`}),d.use(qo(),{order:10,name:`replay`}),d.use(bo(x,{stateStore:n.stateStore,curatedStore:n.curated},{trackedTools:b}),{order:94,name:`procedural-memory`}),d.use(co(new oo(n.stateStore,n.curated)),{order:95,name:`observation-capture`}),d.use(cs(),{order:1,name:`structured-content-guard`}),d.use(Ga(Wa(r.tokenBudget)),{order:90,name:`compression`}),ys(t,d,r.toolPrefix??``);let S=[...v].filter(e=>is.has(e)?ns.includes(e)?!!n.bridge:e===`er_update_policy`?!!n.policyStore:e===`er_evolve_review`?!!n.evolutionCollector:!1:!0);y(`search`)&&hv(t,n.embedder,n.store,n.graphStore,n.bridge,n.evolutionCollector,o,n.stateStore,r.memory?.retention,r.memory?.consolidation,p);let C={store:n.store,graphStore:n.graphStore,embedder:n.embedder},w=l?e=>{l()?.prioritize(e)}:void 0;y(`lookup`)&&xp(t,n.store,C);let T={onboardComplete:n.onboardComplete,onboardTimestamp:n.onboardTimestamp};y(`status`)&&Qv(t,n.store,n.graphStore,n.curated,T,r,s,c,n.stateStore),y(`config`)&&jl(t,r),y(`reindex`)&&q_(t,n.indexer,r,n.curated,n.store,a,s),y(`knowledge`)&&yp(t,n.curated,n.policyStore,n.evolutionCollector,a,h,n.stateStore,r.memory?.retention,r.memory?.supersession,r.memory?.consolidation,r.memory?.lessons,C,n.graphStore),y(`memory_explain`)&&Ip(t,n.embedder,n.store),y(`analyze`)&&Yc(t,n.store,n.embedder,C),y(`blast_radius`)&&Xc(t,n.store,n.embedder,n.graphStore,C),y(`produce_knowledge`)&&G_(t,r),y(`onboard`)&&am(t,n.store,n.embedder,r,T,C,o),y(`graph`)&&Sd(t,n.graphStore,C),y(`audit`)&&tl(t,n.store,n.embedder,r.tokenBudget),y(`compact`)&&Yl(t,n.embedder,n.fileCache,f,r.allRoots,C,w),y(`scope_map`)&&Xl(t,n.embedder,n.store,C),y(`find`)&&Zl(t,n.embedder,n.store,f,C,p),y(`parse_output`)&&du(t),y(`workset`)&&sm(t),y(`check`)&&cu(t,C,r.tokenBudget),y(`symbol`)&&Ql(t,n.embedder,n.store,n.graphStore,C),y(`eval`)&&lu(t),y(`test_run`)&&uu(t,C),y(`stash`)&&cm(t,n.stateStore),y(`signal`)&&Pv(t,n.stateStore),y(`git_context`)&&Tp(t),y(`diff_parse`)&&Ep(t),y(`rename`)&&Dp(t,r),y(`codemod`)&&Op(t,r),y(`restore`)&&Z_(t),y(`file_summary`)&&$l(t,n.fileCache,f,r.allRoots,C,w),y(`checkpoint`)&&lm(t,n.stateStore),y(`data_transform`)&&kp(t),y(`trace`)&&eu(t,n.embedder,n.store,n.graphStore,C),y(`process`)&&wd(t),y(`watch`)&&Td(t),y(`dead_symbols`)&&tu(t,n.embedder,n.store,f,r.allRoots,C),y(`delegate`)&&fu(t,o),y(`health`)&&Ed(t),y(`lane`)&&um(t),y(`queue`)&&dm(t),y(`web_fetch`)&&Dd(t),y(`guide`)&&Od(t,s),Lp.some(e=>y(e))&&Rp(t,r,S),y(`evidence_map`)&&md(t),y(`digest`)&&hd(t,n.embedder),y(`forge_classify`)&&gd(t,C),y(`stratum_card`)&&_d(t,n.embedder,n.fileCache),y(`forge_ground`)&&vd(t,n.embedder,n.store),y(`present`)&&U_(t,i),y(`browser`)&&Qn(t,r),y(`web_search`)&&ty(t),y(`http`)&&ny(t),y(`regex_test`)&&ry(t),y(`encode`)&&iy(t),y(`measure`)&&ay(t),y(`changelog`)&&oy(t),y(`schema_validate`)&&sy(t),y(`env`)&&cy(t),y(`time`)&&ly(t),y(`flow`)&&fd(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},e=>{m.activeSlug=e}),n.bridge&&ns.some(e=>y(e))&&(al(t,n.bridge,n.evolutionCollector),ol(t,n.bridge),sl(t,n.bridge)),n.policyStore&&y(`er_update_policy`)&&_m(t,n.policyStore),n.evolutionCollector&&y(`er_evolve_review`)&&ou(t,n.evolutionCollector),ts(t,n.store,n.curated),y(`compliance_score`)&&ul(t),y(`replay`)&&Y_(t),y(`session_digest`)&&_v(t,n.stateStore,o)}function fy(e,t,n){let r=e=>!n||n.has(e);r(`check`)&&cu(e,void 0,t.tokenBudget),r(`eval`)&&lu(e),r(`test_run`)&&uu(e),r(`parse_output`)&&du(e),r(`delegate`)&&fu(e),r(`git_context`)&&Tp(e),r(`diff_parse`)&&Ep(e),r(`rename`)&&Dp(e,t),r(`codemod`)&&Op(e,t),r(`data_transform`)&&kp(e),r(`workset`)&&sm(e),r(`restore`)&&Z_(e),r(`lane`)&&um(e),r(`queue`)&&dm(e),r(`session_digest`)&&_v(e),r(`health`)&&Ed(e),r(`process`)&&wd(e),r(`watch`)&&Td(e),r(`web_fetch`)&&Dd(e),r(`guide`)&&Od(e),Lp.some(e=>r(e))&&Rp(e,t,[...n??new Set(Va)]),r(`evidence_map`)&&md(e),r(`forge_classify`)&&gd(e),r(`present`)&&U_(e),r(`browser`)&&Qn(e,t),r(`produce_knowledge`)&&G_(e),r(`compliance_score`)&&ul(e),r(`replay`)&&Y_(e),r(`status`)&&Zv(e),r(`flow`)&&fd(e,t),r(`web_search`)&&ty(e),r(`http`)&&ny(e),r(`regex_test`)&&ry(e),r(`encode`)&&iy(e),r(`measure`)&&ay(e),r(`changelog`)&&oy(e),r(`schema_validate`)&&sy(e),r(`env`)&&cy(e),r(`time`)&&ly(e)}const py=j(`resource-notifier`);var my=class{mcpServer;constructor(e){this.mcpServer=e}async notifyStatusChanged(){await this.sendUpdate(`aikit://status`)}async notifyFileTreeChanged(){await this.sendUpdate(`aikit://file-tree`)}async notifyCuratedIndexChanged(){await this.sendUpdate(`aikit://curated`)}async notifyCuratedEntryChanged(e){await this.sendUpdate(`aikit://curated/${e}`)}async notifyResourceListChanged(){try{await this.mcpServer.server.sendResourceListChanged()}catch(e){py.debug(`sendResourceListChanged failed`,{error:String(e)})}}async notifyAfterReindex(){await Promise.allSettled([this.notifyStatusChanged(),this.notifyFileTreeChanged()])}async notifyAfterCuratedWrite(e){let t=[this.notifyStatusChanged(),this.notifyCuratedIndexChanged()];e&&t.push(this.notifyCuratedEntryChanged(e)),await Promise.allSettled(t)}async sendUpdate(e){try{await this.mcpServer.server.sendResourceUpdated({uri:e})}catch(t){py.debug(`sendResourceUpdated failed`,{uri:e,error:String(t)})}}};const Q=j(`server`);function hy(e){let t=e?.trim().toLowerCase();return t===`1`||t===`true`||t===`yes`||t===`on`}async function gy(n){Q.info(`Initializing AI Kit components`);let r=n.store.backend,i=n.embedding,a=ge[i.model],o={model:i.model,nativeDim:i.nativeDim??a?.nativeDim??pe.nativeDim,dimensions:i.dimensions??a?.dimensions??pe.dimensions,queryPrefix:i.queryPrefix??a?.queryPrefix??pe.queryPrefix,pooling:i.pooling??a?.pooling??`mean`},s=n.store.path,c=hy(process.env.AIKIT_SPLIT_STATE),l=F(s,`aikit.db`),u={splitEnabled:c,contentDbPath:l,controlDbPath:c?F(s,`aikit-control.db`):l},d=null;if(r===`sqlite-vec`){let e=u.contentDbPath;N(s)||Te(s,{recursive:!0}),d=await Sr(e),Q.debug(`SQLite adapter ready`,{type:d.type,vectorCapable:d.vectorCapable,dbPath:e}),d.vectorCapable||Q.warn(`┌──────────────────────────────────────────────────────────────────┐
|
|
3080
3066
|
│ ⚠ SQLite vector extension unavailable — DEGRADED MODE │
|
|
3081
3067
|
│ Vector search is disabled. Hybrid search returns FTS only. │
|
|
3082
3068
|
│ To enable: install/rebuild better-sqlite3 (native module). │
|
|
3083
|
-
└──────────────────────────────────────────────────────────────────┘`);let t=F(s,`lance`);N(t)&&
|
|
3084
|
-
`)}const
|
|
3085
|
-
`))}catch(e){
|
|
3086
|
-
`)}`}async function
|
|
3087
|
-
`)}catch{return null}}function
|
|
3069
|
+
└──────────────────────────────────────────────────────────────────┘`);let t=F(s,`lance`);N(t)&&Q.info(`Old LanceDB data found at ${t} — ignored. Safe to delete after verifying sqlite-vec works.`)}let f;if(d)if(u.splitEnabled&&u.controlDbPath!==u.contentDbPath){let{migrateToSplitState:e}=await import(`../../store/dist/index.js`);await e(u),f=await Sr(u.controlDbPath),Tr(f,xr),Q.info(`State store adapter ready`,{type:f.type,dbPath:u.controlDbPath,splitEnabled:!0})}else f=d;else{let e=F(s,`aikit-state.db`);N(s)||Te(s,{recursive:!0}),f=await Sr(e),Tr(f,xr),Q.info(`State store adapter ready`,{type:f.type,dbPath:e})}let[p,m,h,g]=await Promise.all([(async()=>{if(n.embedding.childProcess!==!1){let e=new Br({model:o.model,dimensions:o.dimensions,nativeDim:o.nativeDim,queryPrefix:o.queryPrefix,pooling:o.pooling,interOpNumThreads:i.interOpNumThreads,intraOpNumThreads:i.intraOpNumThreads,idleTimeoutMs:i.idleTimeoutMs});return await e.initialize(),Q.debug(`Embedder loaded (child process)`,{modelId:e.modelId,dimensions:e.dimensions}),e}let{OnnxEmbedder:e}=await import(`../../embeddings/dist/index.js`),t=new e({model:o.model,dimensions:o.dimensions,nativeDim:o.nativeDim,queryPrefix:o.queryPrefix,pooling:o.pooling,interOpNumThreads:i.interOpNumThreads,intraOpNumThreads:i.intraOpNumThreads});return await t.initialize(),Q.debug(`Embedder loaded (in-process)`,{modelId:t.modelId,dimensions:t.dimensions}),t})(),(async()=>{let e=r===`sqlite-vec`?await wr({backend:r,path:s,adapter:d??void 0,embeddingDim:o.dimensions,embeddingProfile:o,partition:u}):await wr({backend:r,path:s,adapter:d??void 0,embeddingDim:o.dimensions,partition:void 0});return await e.initialize(),Q.debug(`Store initialized`,{backend:r}),e})(),(async()=>{let e=d?new br({adapter:d}):new br({path:s});return await e.initialize(),Q.debug(`Graph store initialized`,{shared:!!d}),e})(),(async()=>{let e=await lr();if(e){let e=sr.get();Q.debug(`WASM tree-sitter enabled`,{grammars:e.grammarCount,dir:e.wasmDir})}else{let e=sr.get();Q.warn(`WASM tree-sitter not available; analyzers will use regex fallback`,{reason:e.reason,os:e.os,arch:e.arch,healAttempted:e.healAttempted,healSuccess:e.healSuccess,healError:e.healError,pathsChecked:e.pathsChecked.map(e=>`${e.path} (${e.exists?`found`:`missing`})`)})}return e})()]),_=new Hr(p,m),v=Cr(f),y=new Vr(n.store.path);y.load(),_.setHashCache(y);let b=n.curated.path,x=new e(b);await x.initialize();let S=new t(b,m,p,x);_.setGraphStore(h);let C=il(n.er),w=C?new pr(n.curated.path):void 0;w&&Q.debug(`Policy store initialized`,{ruleCount:w.getRules().length});let T=C?new fr:void 0,E=I(n.sources[0]?.path??process.cwd(),A.aiContext),D=N(E),O=n.onboardDir?N(n.onboardDir):!1,k=D||O,ee,te=D?E:n.onboardDir;if(k&&te)try{ee=ke(te).mtime.toISOString()}catch{}return Q.debug(`Onboard state detected`,{onboardComplete:k,onboardTimestamp:ee,aiKbExists:D,onboardDirExists:O}),{embedder:p,store:m,stateStore:v,closeStateStore:f===d?void 0:async()=>f.close(),indexer:_,curated:S,graphStore:h,fileCache:new Je,bridge:C,policyStore:w,evolutionCollector:T,onboardComplete:k,onboardTimestamp:ee}}function _y(e,t,n){if(e.serverInstructions)return e.serverInstructions;let r=new Set;for(let e of t){let t=n[e];if(t?.category)for(let e of t.category)r.add(e)}let i=[`This server provides ${t.size} tools across ${r.size} categories: ${[...r].sort().join(`, `)}.`,`TOOL ROUTING:`,`- Understand a file -> file_summary (structure) or compact (extract section)`,`- Find code/symbols -> search (hybrid) or symbol (definition + refs)`,`- Validate changes -> check (typecheck+lint) or test_run (tests)`,`- Read file for editing -> read_file (only for exact lines before edits)`,`FORBIDDEN: DO NOT USE native equivalents when AI Kit provides same:`,`- grep/find -> search or find tool`,`- cat/read_file (for understanding) -> file_summary or compact`,`- terminal tsc/lint -> check tool`,`- terminal test -> test_run tool`];return e.readOnly&&i.push(`Server is in read-only mode. Mutating operations are disabled.`),e.features?.length&&i.push(`Active feature groups: ${e.features.join(`, `)}.`),i.join(`
|
|
3070
|
+
`)}const vy=j(`background-task`);var yy=class{queue=[];running=null;get isRunning(){return this.running!==null}get currentTask(){return this.running}get pendingCount(){return this.queue.length}schedule(e){return new Promise((t,n)=>{this.queue.push({...e,resolve:t,reject:n}),this.running||this.processQueue()})}async processQueue(){for(;this.queue.length>0;){let e=this.queue.shift();if(!e)break;this.running=e.name,vy.info(`Background task started`,{task:e.name,pending:this.queue.length});let t=Date.now();try{await e.fn();let n=Date.now()-t;vy.info(`Background task completed`,{task:e.name,durationMs:n}),e.resolve()}catch(n){let r=Date.now()-t;vy.error(`Background task failed`,{task:e.name,durationMs:r,err:n}),e.reject(n instanceof Error?n:Error(String(n)))}}this.running=null}};const by=j(`idle-timer`);var xy=class{timer=null;cleanupFns=[];idleMs;disposed=!1;sessionActive=!1;_busy=!1;constructor(e){this.idleMs=e?.idleMs??3e5}setBusy(e){this._busy=e,e?this.cancel():this.touch()}onIdle(e){this.cleanupFns.push(e)}markSessionActive(){this.sessionActive=!0}touch(){this.disposed||this._busy||(this.cancel(),this.timer=setTimeout(()=>{this.runCleanup()},this.idleMs),this.timer.unref&&this.timer.unref())}cancel(){this.timer&&=(clearTimeout(this.timer),null)}dispose(){this.cancel(),this.cleanupFns.length=0,this.disposed=!0}async runCleanup(){if(!this.sessionActive){by.info(`Idle timeout reached with no active session — skipping cleanup (waiting for first tool call)`);return}if(this._busy){by.info(`Skipping idle cleanup — background work in progress`);return}by.info(`Idle for ${this.idleMs/1e3}s — running cleanup`);let e=await Promise.allSettled(this.cleanupFns.map(e=>e()));for(let t of e)t.status===`rejected`&&by.warn(`Idle cleanup callback failed`,{error:String(t.reason)})}};const Sy=j(`memory-monitor`);var Cy=class{timer=null;warningBytes;criticalBytes;intervalMs;pressureFns=[];memoryPressureFns=[];lastLevel=`normal`;constructor(e){this.warningBytes=e?.warningBytes??3221225472,this.criticalBytes=e?.criticalBytes??6442450944,this.intervalMs=e?.intervalMs??3e4}onPressure(e){this.pressureFns.push(e)}registerMemoryPressureCallback(e){this.memoryPressureFns.push(e)}start(){this.timer||(this.timer=setInterval(()=>this.check(),this.intervalMs),this.timer.unref&&this.timer.unref(),Sy.debug(`Memory monitor started`,{warningMB:Math.round(this.warningBytes/1024/1024),criticalMB:Math.round(this.criticalBytes/1024/1024),intervalSec:Math.round(this.intervalMs/1e3)}))}stop(){this.timer&&=(clearInterval(this.timer),null)}getRssBytes(){return process.memoryUsage.rss()}check(){let e=this.getRssBytes(),t=`normal`;if(e>=this.criticalBytes?t=`critical`:e>=this.warningBytes&&(t=`warning`),t!==this.lastLevel||t===`critical`){let n=Math.round(e/1024/1024);t===`critical`?Sy.warn(`Memory CRITICAL: ${n}MB RSS — consider restarting the server`):t===`warning`?Sy.warn(`Memory WARNING: ${n}MB RSS`):this.lastLevel!==`normal`&&Sy.info(`Memory returned to normal: ${n}MB RSS`),this.lastLevel=t}if(t!==`normal`)for(let n of this.pressureFns)try{n(t,e)}catch{}if(t===`critical`)for(let e of this.memoryPressureFns)try{let t=e();t&&typeof t.catch==`function`&&t.catch(()=>{})}catch{}return t===`critical`&&typeof globalThis.gc==`function`&&globalThis.gc(),t}};const wy=new Ur;function Ty(e,t){return wy.run(e,async()=>{try{return await t()}finally{}})}j(`tool-timeout`);const Ey=new Set([`onboard`,`reindex`,`produce_knowledge`,`analyze`,`codemod`,`audit`]);var Dy=class extends Error{toolName;timeoutMs;constructor(e,t){super(`Tool "${e}" timed out after ${t}ms`),this.toolName=e,this.timeoutMs=t,this.name=`ToolTimeoutError`}};function Oy(e){return Ey.has(e)?6e5:12e4}function ky(e,t,n){let r=new AbortController,i=r.signal;return new Promise((a,o)=>{let s=setTimeout(()=>{let e=new Dy(n,t);i.aborted||r.abort(e),o(e)},t);s.unref();try{e(i).then(a,o).finally(()=>clearTimeout(s))}catch(e){clearTimeout(s),o(e instanceof Error?e:Error(String(e)))}})}const $=j(`server`),Ay=new Set([`status`,`list_tools`,`describe_tool`,`config`,`env`,`present`]);function jy(e,t=28){let n=e.replace(/\s+/g,` `).trim();return n.length<=t?n:`${n.slice(0,t-3)}...`}function My(e){let t=[`query`,`path`,`task`,`name`,`start`,`symbol`,`file`,`pattern`],n=[];for(let r of t){let t=e[r];typeof t==`string`&&t.length>0&&t.length<200&&n.push(t)}return n.join(` `).slice(0,200)}async function Ny(e,t,n,r){let i=[];if(n){let t=await Py(e,n);t&&i.push(t)}try{if(t.statePath){let{ensureLegacyStashImported:n}=await import(`../../tools/dist/index.js`);n(e.stateStore,{stateDir:t.statePath})}let r=e.stateStore.stashList().map(e=>e.key);if(r.length>0){let e=n?n.toLowerCase().split(/\s+/).filter(e=>e.length>2):[];if(e.length===0)i.push(`📦 stash: ${r.length} entries`);else{let t=r.filter(t=>e.some(e=>t.toLowerCase().includes(e))).slice(0,3);t.length>0&&i.push(`📦 stash: ${t.map(e=>`"${jy(e)}"`).join(`, `)}${r.length>t.length?` (+${r.length-t.length})`:``}`)}}}catch{}if(i.length===0&&!r)return null;if(r){let t=e,n=t.curated;if(n?.list&&t.stateStore)try{let{buildPreludeInjection:e,generatePrelude:r}=await import(`./prelude-SM1mxlBF.js`),a=e(await r(n,t.stateStore),500);a.lines.length>0&&i.push(a.lines.join(`
|
|
3071
|
+
`))}catch(e){$.debug?.(`Periodic prelude injection failed`,{error:String(e)})}}return i.length===0?null:`\n${i.join(`
|
|
3072
|
+
`)}`}async function Py(e,t){try{let n=await Promise.race([e.store.ftsSearch(t,{limit:3}),new Promise(e=>{let t=setTimeout(()=>e(null),1e3);t.unref&&t.unref()})]);if(!Array.isArray(n)||n.length===0)return null;let r=[];for(let e of n){if(!e||typeof e!=`object`)continue;let t=e.record;if(!t)continue;let n=t.origin;if(n!==`curated`&&n!==`produced`)continue;let i=t.content??``;if(!(!i||i.length<20)){if(i.length<=400){let e=t.headingPath?.trim()||``,n=i.slice(0,400),a=e?`📚 ${e}: ${n}`:`📚 ${n}`;r.push(a)}else{let e=np(i,400),n=t.headingPath?.trim()||``,a=n?`📚 ${n}: ${e}`:`📚 ${e}`;r.push(a)}if(r.length>=2)break}}return r.length===0?null:r.join(`
|
|
3073
|
+
`)}catch{return null}}function Fy(e,t,n){let r=5,i=0;for(let[a,o]of Object.entries(e)){let e=o.handler;o.handler=async(...o)=>{let s=await e(...o);if(!s||typeof s!=`object`||r<=0||s.isError||Ay.has(a))return s;try{r--,i++;let e=o[0],a=await Ny(t,n,My(e&&typeof e==`object`?e:{}),i%5==0);a&&(s.content=Array.isArray(s.content)?s.content:[],s.content.push({type:`text`,text:a}))}catch{}return s}}}function Iy(e){let t=e.toLowerCase();return[`protobuf`,`invalid model`,`invalid onnx`,`unexpected end`,`unexpected token`,`failed to load`,`failed to initialize embedding`,`checksum`,`corrupt`,`malformed`,`could not load`,`onnx`,`database disk image is malformed`,`file is not a database`,`lance`,`cannot find module`,`cannot find package`,`module not found`].some(e=>t.includes(e))}function Ly(e){return Yp(e)?[`Auto-heal tried to repair missing runtime dependency files in the npx install.`,`If this persists, clear the broken npx cache and restart:`,` npm cache clean --force`,` npx -y @vpxa/aikit@latest serve`].join(`
|
|
3088
3074
|
`):[`To fix embedding errors, try deleting the cached model:`,` rm -rf ~/.cache/huggingface/transformers-js/mixedbread-ai/`,`Then restart the server to re-download a fresh copy.`].join(`
|
|
3089
|
-
`)}async function
|
|
3090
|
-
`),`utf8`)
|
|
3075
|
+
`)}async function Ry(){try{let{existsSync:e,readFileSync:t}=await import(`node:fs`),n=F(Hn(),`.aikit`,`current-version.json`);if(!e(n))return null;let r=JSON.parse(t(n,`utf-8`));if(!r.version)return null;let i=oe();return r.version===i?null:r.version}catch{return null}}async function zy(e,t){let n=t.toLowerCase(),r;try{({rm:r}=await import(`node:fs/promises`))}catch{return}if(n.includes(`transformers.node.mjs`)&&n.includes(`cannot find module`)){let e=t.match(/Cannot find module '([^']+transformers\.node\.mjs)'/);if(e){let t=e[1],n=t.replace(/\.mjs$/,`.cjs`);try{let{existsSync:e,writeFileSync:r}=await import(`node:fs`);e(n)&&!e(t)&&(r(t,[`// Auto-generated ESM shim — published package missing this file`,`import { createRequire } from 'node:module';`,`const require = createRequire(import.meta.url);`,`const mod = require('./transformers.node.cjs');`,`export default mod;`,``].join(`
|
|
3076
|
+
`),`utf8`),$.info(`Auto-heal: created ESM shim for @huggingface/transformers (.mjs wrapper → .cjs)`,{path:t}))}catch(e){$.warn(`Auto-heal: failed to create ESM shim`,{error:e instanceof Error?e.message:String(e),path:t})}}}if(n.includes(`embedding`)||n.includes(`onnx`)||n.includes(`protobuf`)||n.includes(`model`)){let t=e.embedding?.model;if(t){let e=F(Hn(),`.cache`,`huggingface`,`transformers-js`,t);try{await r(e,{recursive:!0,force:!0}),$.info(`Auto-heal: cleared embedding model cache`,{path:e})}catch{}}}if(n.includes(`lance`)||n.includes(`database`)||n.includes(`store`)){let t=F(e.store.path,`lance`);try{await r(t,{recursive:!0,force:!0}),$.info(`Auto-heal: cleared LanceDB store`,{path:t})}catch{}}if(n.includes(`sqlite`)||n.includes(`database disk image`)||n.includes(`graph`)){let t=F(e.store.path,`graph.db`);try{await r(t,{force:!0}),$.info(`Auto-heal: cleared graph database`,{path:t})}catch{}let n=F(e.store.path,`aikit.db`);try{await r(n,{force:!0}),await r(`${n}-wal`,{force:!0}).catch(()=>{}),await r(`${n}-shm`,{force:!0}).catch(()=>{}),$.info(`Auto-heal: cleared corrupted aikit database`,{path:n})}catch{}}if(Yp(t)){let e=await Qp(t);e.repaired||$.warn(`Auto-heal: missing runtime dependency repair did not complete`,{packages:e.packages,reason:e.reason,error:e.error,hint:`Run: npm cache clean --force && npx -y @vpxa/aikit@latest serve`})}else n.includes(`cannot find module`)&&!n.includes(`.cache`)&&$.warn(`Auto-heal: missing module detected during initialization cleanup`,{hint:`Run: npm cache clean --force && npx -y @vpxa/aikit@latest serve`})}function By(e,t){let n=Ps(e,Va,U,as(e)),r=_y(e,n,U),i=new Wn({name:e.serverName??`aikit`,version:oe()},{capabilities:{logging:{},completions:{},prompts:{}},instructions:r}),a=`initializing`,o=``,s=!1,c=null,l=null,u=null;function d(e){if(!e||typeof e!=`object`)return[];let t=e,n=[];for(let e of[`path`,`file`,`source_path`,`sourcePath`,`filePath`]){let r=t[e];typeof r==`string`&&r&&n.push(r)}for(let e of[`changed_files`,`paths`,`files`]){let r=t[e];if(Array.isArray(r))for(let e of r){if(typeof e==`string`){n.push(e);continue}e&&typeof e==`object`&&typeof e.path==`string`&&n.push(e.path)}}if(Array.isArray(t.sources))for(let e of t.sources)e&&typeof e==`object`&&typeof e.path==`string`&&n.push(e.path);return n}let f=()=>a===`failed`?[`❌ AI Kit initialization failed — this tool is unavailable.`,``,o?`Error: ${o}`:``,``,`**${Ha.size} tools are still available** and fully functional:`,`check, eval, test_run, git_context, health, measure, web_fetch, web_search,`,`flow, regex_test, encode,`,`stash, checkpoint, lane, process, time, env, and more.`,``,Ly(o),``,`Try restarting the MCP server to retry initialization.`].filter(Boolean).join(`
|
|
3091
3077
|
`):[`AI Kit is still initializing (loading embeddings model & store).`,``,`**${Ha.size} tools are already available** while initialization completes — including:`,`check, eval, test_run, git_context, health, measure, web_fetch, web_search,`,`flow, regex_test, encode,`,`stash, checkpoint, lane, process, time, env, and more.`,``,`This tool requires the AI Kit index. Please retry in a few seconds,`,`or use one of the available tools above in the meantime.`].join(`
|
|
3092
|
-
`);Kr(i);let p=new Do;p.use(cs(),{order:1,name:`structured-content-guard`}),ys(i,p,e.toolPrefix??``);let m=i.sendToolListChanged.bind(i);i.sendToolListChanged=()=>{};let h=[];for(let e of Va){if(!n.has(e))continue;let t=W(e),r=i.registerTool(e,{title:t.title,description:`${t.title} — initializing, available shortly`,inputSchema:{},annotations:t.annotations},async()=>({content:[{type:`text`,text:f()}]}));Ha.has(e)?r.remove():h.push(r)}uy(i,e,n),i.sendToolListChanged=m;let g=i.registerResource(`aikit-status`,`aikit://status`,{description:`AI Kit status (initializing...)`,mimeType:`text/plain`},async()=>({contents:[{uri:`aikit://status`,text:`AI Kit is initializing...`,mimeType:`text/plain`}]})),_=i.registerPrompt(`_init`,{description:`Initializing AI Kit…`,argsSchema:{_dummy:Xn(R.string(),()=>[])}},async()=>({messages:[]})),v,y,b=new Promise((e,t)=>{v=e,y=t}),x,S=new Promise(e=>{x=e}),C=()=>x?.(),w=(async()=>{await S;try{let{createRequire:e}=await import(`node:module`),{readFileSync:t,existsSync:n}=await import(`node:fs`),{fileURLToPath:r}=await import(`node:url`),{resolve:i,dirname:a}=await import(`node:path`),o=e(import.meta.url),s=a(r(import.meta.url)),c=i(s,`..`,`package.json`),l=i(s,`..`,`..`),u=JSON.parse(t(c,`utf8`)),d=Object.keys(u.dependencies??{}),f=[`@mixmark-io/domino`],p=[...d,...f.filter(e=>!d.includes(e))],m=p.filter(e=>!e.startsWith(`@aikit/`)),h=p.filter(e=>e.startsWith(`@aikit/`)),g=[];for(let e of m)try{o.resolve(e)}catch{try{o.resolve(`${e}/package.json`)}catch{g.push(e)}}g.length>0&&Q.warn(`Dependencies not resolvable — server may operate in degraded mode`,{missing:g,hint:`Run: npm cache clean --force && npx -y @vpxa/aikit@latest serve`});let _=[];if(h.length>0){for(let e of h)n(i(l,e.slice(7),`dist`))||_.push(e);_.length>0&&Q.warn(`Workspace sibling packages missing dist — server may have degraded features`,{missing:_,hint:`Reinstall: npm cache clean --force && npx -y @vpxa/aikit@latest serve`})}}catch{}let n;try{n=await hy(e)}catch(t){let r=t instanceof Error?t.message:String(t);if(Fy(r)){let t=await Ly();if(t){a=`failed`,o=`Server v${oe()} superseded by installed v${t}. Restart the MCP server to use the new version.`,Q.info(o),y?.(Error(o));return}Q.warn(`AI Kit initialization failed with recoverable error — attempting auto-heal retry`,{error:r}),await Ry(e,r);try{n=await hy(e),Q.info(`AI Kit auto-heal successful — initialization recovered after retry`)}catch(e){a=`failed`,o=e instanceof Error?e.message:String(e),Q.error(`AI Kit initialization failed after auto-heal attempt — server continuing with zero-dep tools only`,{error:o,originalError:r}),y?.(e instanceof Error?e:Error(o));return}}else{a=`failed`,o=r,Q.error(`AI Kit initialization failed — server continuing with zero-dep tools only`,{error:o}),y?.(t instanceof Error?t:Error(o));return}}ae();let r=i.sendToolListChanged.bind(i);i.sendToolListChanged=()=>{};let f=i.sendPromptListChanged.bind(i);i.sendPromptListChanged=()=>{};let p=i.sendResourceListChanged.bind(i);i.sendResourceListChanged=()=>{};for(let e of h)e.remove();g.remove(),_.remove();let m=i._registeredTools??{};for(let e of Ha)m[e]?.remove();let b=new fy(i),x=_u(i);ly({server:i,aikit:n,config:e,elicitor:Wr(i),resourceNotifier:b,samplingClient:x,indexMode:t,getSmartState:t===`smart`?(()=>{let e=u;return e?.getState?e.getState():null}):null,getSmartScheduler:t===`smart`?()=>{let e=u;return e?{prioritize:e.prioritize.bind(e)}:null}:null}),ri(i,{curated:n.curated,store:n.store,graphStore:n.graphStore,stateStore:n.stateStore},t),i.sendToolListChanged=r,i.sendPromptListChanged=f,i.sendResourceListChanged=p,Promise.resolve(i.sendToolListChanged()).catch(()=>{}),Promise.resolve(i.sendPromptListChanged()).catch(()=>{}),Promise.resolve(i.sendResourceListChanged()).catch(()=>{});let C=i._registeredTools??{};for(let[e,t]of Object.entries(C)){if(Ua.has(e))continue;let r=t.handler;t.handler=async(...i)=>{if(!n.indexer.isIndexing)return r(...i);let a=s?`re-indexing`:`running initial index`,o=new Promise(n=>setTimeout(()=>n({content:[{type:`text`,text:`⏳ AI Kit is ${a}. The tool "${e}" timed out waiting for index data (${os/1e3}s).\n\nThe existing index may be temporarily locked. Please retry shortly — indexing will complete automatically.`}],...t.config?.outputSchema?{structuredContent:ms(t.config.outputSchema)}:{}}),os));return Promise.race([r(...i),o])}}for(let[e,t]of Object.entries(C)){let n=t.handler,r=Dy(e);t.handler=async(...i)=>{try{return await Oy(e=>wy(e,()=>n(...i)),r,e)}catch(n){if(n instanceof Ey)return{content:[{type:`text`,text:`⏳ Tool "${e}" timed out after ${r/1e3}s. This may indicate a long-running operation. Please retry or break the task into smaller steps.`}],...t.config?.outputSchema?{structuredContent:ms(t.config.outputSchema)}:{}};throw n}}}let w=Object.keys(C).length;w<Va.length&&Q.warn(`ALL_TOOL_NAMES count mismatch`,{expectedToolCount:Va.length,registeredToolCount:w}),Q.debug(`MCP server configured`,{toolCount:Va.length,resourceCount:4});let T=new Sy;T.onPressure((e,t)=>{e===`warning`&&Xr(),e===`critical`&&(Q.warn(`Memory pressure critical — consider restarting`,{rssMB:Math.round(t/1024/1024)}),Xr())}),T.registerMemoryPressureCallback(()=>n.embedder.shutdown?.()),T.start();let D=new by;l=D,D.onIdle(async()=>{if(E.isRunning||n.indexer.isIndexing){Q.info(`Idle cleanup deferred — background tasks still running`),D.touch();return}Q.info(`Idle cleanup: releasing cached memory (connections stay open)`);try{n.store.releaseMemory?.(),n.graphStore.releaseMemory?.()}catch{}}),D.touch();let O=!1;for(let e of Object.values(C)){let t=e.handler;e.handler=async(...e)=>{if(O||(O=!0,D.markSessionActive()),D.touch(),u){let t=d(e[0]);t.length>0&&u.prioritize(...t)}return t(...e)}}Py(C,n,{statePath:e.stateDir??``});for(let[,e]of Object.entries(C)){let t=e.config?.outputSchema;if(!t)continue;let n=e.handler;e.handler=async(...e)=>{let r=await n(...e);if(!r||typeof r!=`object`)return r;let i=r;return!(`content`in i)||i.isError||i.structuredContent!=null&&typeof i.structuredContent==`object`?r:(i.structuredContent=ms(t),i.structuredContent??={},r)}}process.stdin.on(`end`,()=>(Q.info(`stdin closed — MCP client disconnected. Shutting down.`),process.exit(0))),process.stdin.on(`error`,()=>(Q.info(`stdin error — MCP client disconnected. Shutting down.`),process.exit(0))),c=n,v?.(n)})(),T=async()=>{let t;try{t=await b}catch{Q.warn(`Skipping initial index — AI Kit initialization failed`);return}l?.setBusy(!0);try{let n=e.sources.map(e=>e.path).join(`, `);Q.info(`Running initial index`,{sourcePaths:n});let r=await t.indexer.index(e,e=>{e.phase===`crawling`||e.phase===`done`||(e.phase===`chunking`&&e.currentFile&&Q.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&Q.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});s=!0,Q.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await t.store.createFtsIndex()}catch(e){Q.warn(`FTS index creation failed`,M(e))}try{let e=await t.curated.reindexAll();Q.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){Q.error(`Curated re-index failed`,M(e))}}catch(e){Q.error(`Initial index failed; will retry on aikit_reindex`,M(e))}finally{l?.setBusy(!1)}},E=new vy,D=()=>E.schedule({name:`initial-index`,fn:T}),O=process.ppid,k=setInterval(()=>{try{process.kill(O,0)}catch{Q.info(`Parent process died; shutting down`,{parentPid:O}),clearInterval(k),u?.stop&&u.stop(),import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),b.then(async e=>{await Promise.all([e.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),e.graphStore.close().catch(()=>{}),e.closeStateStore?.().catch(()=>{})??Promise.resolve(),e.store.close().catch(()=>{})])}).catch(()=>{}).finally(()=>process.exit(0))}},5e3);return k.unref(),{server:i,startInit:C,ready:w,runInitialIndex:D,get aikit(){return c},scheduler:E,setSmartScheduler(e){u=e}}}const $=j(`server`);function By(e,t){let n=Ps(t,[...Va,...rs],U,as(t)),r=gy(t,n,U),i=new Wn({name:t.serverName??`aikit`,version:oe()},{capabilities:{logging:{},completions:{},prompts:{},extensions:{roots:{}}},instructions:r}),a=i;return a.setNotificationHandler(Kn,async()=>{try{let{roots:e}=await a.listRoots();if(e&&e.length>0){let n=le(e[0].uri);process.env.AIKIT_TRANSPORT===`http`?(t.sources[0]={path:n,excludePatterns:t.sources[0]?.excludePatterns??[]},t.allRoots=e.map(e=>le(e.uri)),$.info(`Workspace root updated (HTTP mode)`,{rootPath:n,sourceCount:t.sources.length})):(x(t,n),$.info(`Workspace root updated (stdio mode)`,{rootPath:n}))}}catch(e){$.debug(`MCP roots/list not available`,{error:M(e)})}}),Kr(i),ly({server:i,aikit:e,config:t,elicitor:Wr(i),resourceNotifier:new fy(i),samplingClient:_u(i),precomputedActiveTools:n}),ri(i,{curated:e.curated,store:e.store,graphStore:e.graphStore,stateStore:e.stateStore},t.indexMode),i}async function Vy(e){let t=await hy(e),n=By(t,e);$.debug(`MCP server configured`,{toolCount:Va.length,resourceCount:2});let r=async()=>{try{let n=e.sources.map(e=>e.path).join(`, `);$.info(`Running initial index`,{sourcePaths:n});let r=await t.indexer.index(e,e=>{e.phase===`crawling`||e.phase===`done`||(e.phase===`chunking`&&e.currentFile&&$.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&$.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});$.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await t.store.createFtsIndex()}catch(e){$.warn(`FTS index creation failed`,M(e))}try{let e=await t.curated.reindexAll();$.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){$.error(`Curated re-index failed`,M(e))}}catch(e){$.error(`Initial index failed; will retry on aikit_reindex`,M(e))}},i=async()=>{$.info(`Shutting down`),await import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),await Promise.all([t.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),t.graphStore.close().catch(()=>{}),t.closeStateStore?.().catch(()=>{})??Promise.resolve(),t.store.close().catch(()=>{})]),process.exit(0)};process.on(`SIGINT`,i),process.on(`SIGTERM`,i);let a=process.ppid,o=setInterval(()=>{try{process.kill(a,0)}catch{$.info(`Parent process died; shutting down`,{parentPid:a}),clearInterval(o),i()}},5e3);return o.unref(),{server:n,runInitialIndex:r,shutdown:i}}export{Va as ALL_TOOL_NAMES,zy as createLazyServer,By as createMcpServer,Vy as createServer,hy as initializeAikit,Fv as n,ly as registerMcpTools,Iv as t};
|
|
3078
|
+
`);Kr(i);let p=new Do;p.use(cs(),{order:1,name:`structured-content-guard`}),ys(i,p,e.toolPrefix??``);let m=i.sendToolListChanged.bind(i);i.sendToolListChanged=()=>{};let h=[];for(let e of Va){if(!n.has(e))continue;let t=W(e),r=i.registerTool(e,{title:t.title,description:`${t.title} — initializing, available shortly`,inputSchema:{},annotations:t.annotations},async()=>({content:[{type:`text`,text:f()}]}));Ha.has(e)?r.remove():h.push(r)}fy(i,e,n),i.sendToolListChanged=m;let g=i.registerResource(`aikit-status`,`aikit://status`,{description:`AI Kit status (initializing...)`,mimeType:`text/plain`},async()=>({contents:[{uri:`aikit://status`,text:`AI Kit is initializing...`,mimeType:`text/plain`}]})),_=i.registerPrompt(`_init`,{description:`Initializing AI Kit…`,argsSchema:{_dummy:Xn(R.string(),()=>[])}},async()=>({messages:[]})),v,y,b=new Promise((e,t)=>{v=e,y=t}),x,S=new Promise(e=>{x=e}),C=()=>x?.(),w=(async()=>{await S;try{let{createRequire:e}=await import(`node:module`),{readFileSync:t,existsSync:n}=await import(`node:fs`),{fileURLToPath:r}=await import(`node:url`),{resolve:i,dirname:a}=await import(`node:path`),o=e(import.meta.url),s=a(r(import.meta.url)),c=i(s,`..`,`package.json`),l=i(s,`..`,`..`),u=JSON.parse(t(c,`utf8`)),d=Object.keys(u.dependencies??{}),f=[`@mixmark-io/domino`],p=[...d,...f.filter(e=>!d.includes(e))],m=p.filter(e=>!e.startsWith(`@aikit/`)),h=p.filter(e=>e.startsWith(`@aikit/`)),g=[];for(let e of m)try{o.resolve(e)}catch{try{o.resolve(`${e}/package.json`)}catch{g.push(e)}}g.length>0&&$.warn(`Dependencies not resolvable — server may operate in degraded mode`,{missing:g,hint:`Run: npm cache clean --force && npx -y @vpxa/aikit@latest serve`});let _=[];if(h.length>0){for(let e of h)n(i(l,e.slice(7),`dist`))||_.push(e);_.length>0&&$.warn(`Workspace sibling packages missing dist — server may have degraded features`,{missing:_,hint:`Reinstall: npm cache clean --force && npx -y @vpxa/aikit@latest serve`})}}catch{}let n;try{n=await gy(e)}catch(t){let r=t instanceof Error?t.message:String(t);if(Iy(r)){let t=await Ry();if(t){a=`failed`,o=`Server v${oe()} superseded by installed v${t}. Restart the MCP server to use the new version.`,$.info(o),y?.(Error(o));return}$.warn(`AI Kit initialization failed with recoverable error — attempting auto-heal retry`,{error:r}),await zy(e,r);try{n=await gy(e),$.info(`AI Kit auto-heal successful — initialization recovered after retry`)}catch(e){a=`failed`,o=e instanceof Error?e.message:String(e),$.error(`AI Kit initialization failed after auto-heal attempt — server continuing with zero-dep tools only`,{error:o,originalError:r}),y?.(e instanceof Error?e:Error(o));return}}else{a=`failed`,o=r,$.error(`AI Kit initialization failed — server continuing with zero-dep tools only`,{error:o}),y?.(t instanceof Error?t:Error(o));return}}ae();let r=i.sendToolListChanged.bind(i);i.sendToolListChanged=()=>{};let f=i.sendPromptListChanged.bind(i);i.sendPromptListChanged=()=>{};let p=i.sendResourceListChanged.bind(i);i.sendResourceListChanged=()=>{};for(let e of h)e.remove();g.remove(),_.remove();let m=i._registeredTools??{};for(let e of Ha)m[e]?.remove();let b=new my(i),x=_u(i);dy({server:i,aikit:n,config:e,elicitor:Wr(i),resourceNotifier:b,samplingClient:x,indexMode:t,getSmartState:t===`smart`?(()=>{let e=u;return e?.getState?e.getState():null}):null,getSmartScheduler:t===`smart`?()=>{let e=u;return e?{prioritize:e.prioritize.bind(e)}:null}:null}),ri(i,{curated:n.curated,store:n.store,graphStore:n.graphStore,stateStore:n.stateStore},t),i.sendToolListChanged=r,i.sendPromptListChanged=f,i.sendResourceListChanged=p,Promise.resolve(i.sendToolListChanged()).catch(()=>{}),Promise.resolve(i.sendPromptListChanged()).catch(()=>{}),Promise.resolve(i.sendResourceListChanged()).catch(()=>{});let C=i._registeredTools??{};for(let[e,t]of Object.entries(C)){if(Ua.has(e))continue;let r=t.handler;t.handler=async(...i)=>{if(!n.indexer.isIndexing)return r(...i);let a=s?`re-indexing`:`running initial index`,o=new Promise(n=>setTimeout(()=>n({content:[{type:`text`,text:`⏳ AI Kit is ${a}. The tool "${e}" timed out waiting for index data (${os/1e3}s).\n\nThe existing index may be temporarily locked. Please retry shortly — indexing will complete automatically.`}],...t.config?.outputSchema?{structuredContent:ms(t.config.outputSchema)}:{}}),os));return Promise.race([r(...i),o])}}for(let[e,t]of Object.entries(C)){let n=t.handler,r=Oy(e);t.handler=async(...i)=>{try{return await ky(e=>Ty(e,()=>n(...i)),r,e)}catch(n){if(n instanceof Dy)return{content:[{type:`text`,text:`⏳ Tool "${e}" timed out after ${r/1e3}s. This may indicate a long-running operation. Please retry or break the task into smaller steps.`}],...t.config?.outputSchema?{structuredContent:ms(t.config.outputSchema)}:{}};throw n}}}let w=Object.keys(C).length;w<Va.length&&$.warn(`ALL_TOOL_NAMES count mismatch`,{expectedToolCount:Va.length,registeredToolCount:w}),$.debug(`MCP server configured`,{toolCount:Va.length,resourceCount:4});let T=new Cy;T.onPressure((e,t)=>{e===`warning`&&Xr(),e===`critical`&&($.warn(`Memory pressure critical — consider restarting`,{rssMB:Math.round(t/1024/1024)}),Xr())}),T.registerMemoryPressureCallback(()=>n.embedder.shutdown?.()),T.start();let D=new xy;l=D,D.onIdle(async()=>{if(E.isRunning||n.indexer.isIndexing){$.info(`Idle cleanup deferred — background tasks still running`),D.touch();return}$.info(`Idle cleanup: releasing cached memory (connections stay open)`);try{n.store.releaseMemory?.(),n.graphStore.releaseMemory?.()}catch{}}),D.touch();let O=!1;for(let e of Object.values(C)){let t=e.handler;e.handler=async(...e)=>{if(O||(O=!0,D.markSessionActive()),D.touch(),u){let t=d(e[0]);t.length>0&&u.prioritize(...t)}return t(...e)}}Fy(C,n,{statePath:e.stateDir??``});for(let[,e]of Object.entries(C)){let t=e.config?.outputSchema;if(!t)continue;let n=e.handler;e.handler=async(...e)=>{let r=await n(...e);if(!r||typeof r!=`object`)return r;let i=r;return!(`content`in i)||i.isError||i.structuredContent!=null&&typeof i.structuredContent==`object`?r:(i.structuredContent=ms(t),i.structuredContent??={},r)}}process.stdin.on(`end`,()=>($.info(`stdin closed — MCP client disconnected. Shutting down.`),process.exit(0))),process.stdin.on(`error`,()=>($.info(`stdin error — MCP client disconnected. Shutting down.`),process.exit(0))),c=n,v?.(n)})(),T=async()=>{let t;try{t=await b}catch{$.warn(`Skipping initial index — AI Kit initialization failed`);return}l?.setBusy(!0);try{let n=e.sources.map(e=>e.path).join(`, `);$.info(`Running initial index`,{sourcePaths:n});let r=await t.indexer.index(e,e=>{e.phase===`crawling`||e.phase===`done`||(e.phase===`chunking`&&e.currentFile&&$.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&$.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});s=!0,$.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await t.store.createFtsIndex()}catch(e){$.warn(`FTS index creation failed`,M(e))}try{let e=await t.curated.reindexAll();$.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){$.error(`Curated re-index failed`,M(e))}}catch(e){$.error(`Initial index failed; will retry on aikit_reindex`,M(e))}finally{l?.setBusy(!1)}},E=new yy,D=()=>E.schedule({name:`initial-index`,fn:T}),O=process.ppid,k=setInterval(()=>{try{process.kill(O,0)}catch{$.info(`Parent process died; shutting down`,{parentPid:O}),clearInterval(k),u?.stop&&u.stop(),import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),b.then(async e=>{await Promise.all([e.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),e.graphStore.close().catch(()=>{}),e.closeStateStore?.().catch(()=>{})??Promise.resolve(),e.store.close().catch(()=>{})])}).catch(()=>{}).finally(()=>process.exit(0))}},5e3);return k.unref(),{server:i,startInit:C,ready:w,runInitialIndex:D,get aikit(){return c},scheduler:E,setSmartScheduler(e){u=e}}}const Vy=j(`server`);function Hy(e,t){let n=Ps(t,[...Va,...rs],U,as(t)),r=_y(t,n,U),i=new Wn({name:t.serverName??`aikit`,version:oe()},{capabilities:{logging:{},completions:{},prompts:{},extensions:{roots:{}}},instructions:r}),a=i;return a.setNotificationHandler(Kn,async()=>{try{let{roots:e}=await a.listRoots();if(e&&e.length>0){let n=le(e[0].uri);process.env.AIKIT_TRANSPORT===`http`?(t.sources[0]={path:n,excludePatterns:t.sources[0]?.excludePatterns??[]},t.allRoots=e.map(e=>le(e.uri)),Vy.info(`Workspace root updated (HTTP mode)`,{rootPath:n,sourceCount:t.sources.length})):(x(t,n),Vy.info(`Workspace root updated (stdio mode)`,{rootPath:n}))}}catch(e){Vy.debug(`MCP roots/list not available`,{error:M(e)})}}),Kr(i),dy({server:i,aikit:e,config:t,elicitor:Wr(i),resourceNotifier:new my(i),samplingClient:_u(i),precomputedActiveTools:n}),ri(i,{curated:e.curated,store:e.store,graphStore:e.graphStore,stateStore:e.stateStore},t.indexMode),i}async function Uy(e){let t=await gy(e),n=Hy(t,e);Vy.debug(`MCP server configured`,{toolCount:Va.length,resourceCount:2});let r=async()=>{try{let n=e.sources.map(e=>e.path).join(`, `);Vy.info(`Running initial index`,{sourcePaths:n});let r=await t.indexer.index(e,e=>{e.phase===`crawling`||e.phase===`done`||(e.phase===`chunking`&&e.currentFile&&Vy.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&Vy.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});Vy.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await t.store.createFtsIndex()}catch(e){Vy.warn(`FTS index creation failed`,M(e))}try{let e=await t.curated.reindexAll();Vy.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){Vy.error(`Curated re-index failed`,M(e))}}catch(e){Vy.error(`Initial index failed; will retry on aikit_reindex`,M(e))}},i=async()=>{Vy.info(`Shutting down`),await import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),await Promise.all([t.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),t.graphStore.close().catch(()=>{}),t.closeStateStore?.().catch(()=>{})??Promise.resolve(),t.store.close().catch(()=>{})]),process.exit(0)};process.on(`SIGINT`,i),process.on(`SIGTERM`,i);let a=process.ppid,o=setInterval(()=>{try{process.kill(a,0)}catch{Vy.info(`Parent process died; shutting down`,{parentPid:a}),clearInterval(o),i()}},5e3);return o.unref(),{server:n,runInitialIndex:r,shutdown:i}}export{Va as ALL_TOOL_NAMES,By as createLazyServer,Hy as createMcpServer,Uy as createServer,gy as initializeAikit,Lv as n,dy as registerMcpTools,Rv as t};
|