@vpxa/aikit 0.1.397 → 0.1.398

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vpxa/aikit",
3
- "version": "0.1.397",
3
+ "version": "0.1.398",
4
4
  "type": "module",
5
5
  "description": "Local-first AI developer toolkit — knowledge base, code analysis, context management, and developer tools for LLM agents",
6
6
  "license": "MIT",
@@ -14,6 +14,7 @@ interface AikitStatus {
14
14
  totalRecords: number;
15
15
  totalFiles: number;
16
16
  lastIndexedAt: string | null;
17
+ lastSourceIndexedAt?: string | null;
17
18
  onboarded: boolean;
18
19
  }
19
20
  interface AikitSearchResult {
@@ -1,5 +1,5 @@
1
- const e=1e3;var t=class{deps;constructor(e){this.deps=e}async getStatus(){let e=await this.deps.store.getStats();return{totalRecords:e.totalRecords,totalFiles:e.totalFiles,lastIndexedAt:e.lastIndexedAt??null,onboarded:e.totalRecords>0}}async search(e,t){let n=t?.limit??10,i=t?.mode??`hybrid`;if(i===`keyword`)return(await this.deps.store.ftsSearch(e,{limit:n})).map(r);let a=await this.deps.embedder.embedQuery(e);if(i===`semantic`)return(await this.deps.store.search(a,{limit:n})).map(r);let[o,s]=await Promise.all([this.deps.store.search(a,{limit:n*2}),this.deps.store.ftsSearch(e,{limit:n*2}).catch(()=>[])]),c=new Map;for(let e of[...o,...s]){let t=c.get(e.record.id);(!t||e.score>t.score)&&c.set(e.record.id,e)}return[...c.values()].sort((e,t)=>t.score-e.score).slice(0,n).map(r)}async listKnowledge(){return this.deps.listCurated?(await this.deps.listCurated()).map(n):[]}async readKnowledge(e){if(!this.deps.readCurated)return null;let t=await this.deps.readCurated(e);return t?n(t):null}async getGraph(t){if(!this.deps.graphStore)return{nodes:[],edges:[]};let n=await this.deps.graphStore.findNodes(t?{namePattern:t,limit:500}:{limit:500});if(n.length===0)return{nodes:[],edges:[]};let r=t?await this.getEdgesForNodes(n):await this.deps.graphStore.findEdges({limit:e});return{nodes:n.map(e=>({id:e.id,name:e.name,type:e.type,...e.sourcePath?{sourcePath:e.sourcePath}:{}})),edges:i(r).map(e=>({fromId:e.fromId,toId:e.toId,type:e.type}))}}async getFileTree(){return this.deps.store.listSourcePaths()}async getEdgesForNodes(t){let n=this.deps.graphStore;if(!n)return[];let r=t.flatMap(t=>[n.findEdges({fromId:t.id,limit:e}),n.findEdges({toId:t.id,limit:e})]);return(await Promise.all(r)).flat()}};function n(e){return{path:e.path,title:e.title,category:e.category,tags:e.tags,content:e.content}}function r(e){return{sourcePath:e.record.sourcePath,contentType:e.record.contentType,score:e.score,content:e.record.content,headingPath:e.record.headingPath,startLine:e.record.startLine,endLine:e.record.endLine}}function i(e){let t=new Map;for(let n of e)t.set(n.id,n);return[...t.values()]}function a(e){return!Array.isArray(e?.content)||e.content.length===0?``:e.content.filter(e=>typeof e==`object`&&!!e).filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text).join(`
2
- `)}function o(e){return e?.structuredContent}function s(e){return{text:a(e),structured:o(e)}}function c(e){try{return JSON.parse(e)}catch{return}}var l=class{client;constructor(e){this.client=e}async getStatus(){let e=await this.client.callTool({name:`status`,arguments:{}}),t=d(e);if(t)return{totalRecords:g(t.totalRecords),totalFiles:g(t.totalFiles),lastIndexedAt:v(t.lastIndexedAt),onboarded:!!t.onboarded};let n=u(e);return{totalRecords:f(n,/Records:\s*(\d+)/i),totalFiles:f(n,/Files:\s*(\d+)/i),lastIndexedAt:null,onboarded:!/not onboarded/i.test(n)}}async search(e,t){let n=await this.client.callTool({name:`search`,arguments:{query:e,limit:t?.limit??10,search_mode:t?.mode??`hybrid`}}),r=d(n);return r?.results?r.results.map(e=>({sourcePath:y(e.sourcePath??e.path),contentType:y(e.contentType,`unknown`),score:g(e.score),content:y(e.content??e.snippet),headingPath:b(e.headingPath),startLine:_(e.startLine),endLine:_(e.endLine)})):p(u(n))}async listKnowledge(){let e=d(await this.client.callTool({name:`knowledge`,arguments:{action:`list`}}));return e?.entries?e.entries.map(e=>({path:y(e.path),title:y(e.title),category:y(e.category),tags:x(e.tags),content:y(e.content)})):[]}async readKnowledge(e){try{let t=u(await this.client.callTool({name:`knowledge`,arguments:{action:`read`,path:e}}));return!t||/not found/i.test(t)?null:{path:e,title:e.split(`/`).pop()??e,category:e.split(`/`).at(-2)??`uncategorized`,tags:[],content:t}}catch{return null}}async getGraph(e){let t=m(u(await this.client.callTool({name:`graph`,arguments:{action:`find_nodes`,...e?{name_pattern:e}:{},limit:500}})));return t.length===0?{nodes:[],edges:[]}:{nodes:t,edges:h(u(await this.client.callTool({name:`graph`,arguments:{action:`find_edges`,limit:1e3}})))}}async getFileTree(){let e=await this.client.callTool({name:`find`,arguments:{glob:`**/*`,limit:1e4}}),t=d(e);return t?.results?t.results.map(e=>typeof e==`string`?e:e.path??``).filter(e=>e.length>0):u(e).split(`
1
+ const e=1e3;var t=class{deps;constructor(e){this.deps=e}async getStatus(){let e=await this.deps.store.getStats();return{totalRecords:e.totalRecords,totalFiles:e.totalFiles,lastIndexedAt:e.lastIndexedAt??null,lastSourceIndexedAt:e.lastSourceIndexedAt??null,onboarded:e.totalRecords>0}}async search(e,t){let n=t?.limit??10,i=t?.mode??`hybrid`;if(i===`keyword`)return(await this.deps.store.ftsSearch(e,{limit:n})).map(r);let a=await this.deps.embedder.embedQuery(e);if(i===`semantic`)return(await this.deps.store.search(a,{limit:n})).map(r);let[o,s]=await Promise.all([this.deps.store.search(a,{limit:n*2}),this.deps.store.ftsSearch(e,{limit:n*2}).catch(()=>[])]),c=new Map;for(let e of[...o,...s]){let t=c.get(e.record.id);(!t||e.score>t.score)&&c.set(e.record.id,e)}return[...c.values()].sort((e,t)=>t.score-e.score).slice(0,n).map(r)}async listKnowledge(){return this.deps.listCurated?(await this.deps.listCurated()).map(n):[]}async readKnowledge(e){if(!this.deps.readCurated)return null;let t=await this.deps.readCurated(e);return t?n(t):null}async getGraph(t){if(!this.deps.graphStore)return{nodes:[],edges:[]};let n=await this.deps.graphStore.findNodes(t?{namePattern:t,limit:500}:{limit:500});if(n.length===0)return{nodes:[],edges:[]};let r=t?await this.getEdgesForNodes(n):await this.deps.graphStore.findEdges({limit:e});return{nodes:n.map(e=>({id:e.id,name:e.name,type:e.type,...e.sourcePath?{sourcePath:e.sourcePath}:{}})),edges:i(r).map(e=>({fromId:e.fromId,toId:e.toId,type:e.type}))}}async getFileTree(){return this.deps.store.listSourcePaths()}async getEdgesForNodes(t){let n=this.deps.graphStore;if(!n)return[];let r=t.flatMap(t=>[n.findEdges({fromId:t.id,limit:e}),n.findEdges({toId:t.id,limit:e})]);return(await Promise.all(r)).flat()}};function n(e){return{path:e.path,title:e.title,category:e.category,tags:e.tags,content:e.content}}function r(e){return{sourcePath:e.record.sourcePath,contentType:e.record.contentType,score:e.score,content:e.record.content,headingPath:e.record.headingPath,startLine:e.record.startLine,endLine:e.record.endLine}}function i(e){let t=new Map;for(let n of e)t.set(n.id,n);return[...t.values()]}function a(e){return!Array.isArray(e?.content)||e.content.length===0?``:e.content.filter(e=>typeof e==`object`&&!!e).filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text).join(`
2
+ `)}function o(e){return e?.structuredContent}function s(e){return{text:a(e),structured:o(e)}}function c(e){try{return JSON.parse(e)}catch{return}}var l=class{client;constructor(e){this.client=e}async getStatus(){let e=await this.client.callTool({name:`status`,arguments:{}}),t=d(e);if(t)return{totalRecords:g(t.totalRecords),totalFiles:g(t.totalFiles),lastIndexedAt:v(t.lastIndexedAt),lastSourceIndexedAt:v(t.lastSourceIndexedAt),onboarded:!!t.onboarded};let n=u(e);return{totalRecords:f(n,/Records:\s*(\d+)/i),totalFiles:f(n,/Files:\s*(\d+)/i),lastIndexedAt:null,onboarded:!/not onboarded/i.test(n)}}async search(e,t){let n=await this.client.callTool({name:`search`,arguments:{query:e,limit:t?.limit??10,search_mode:t?.mode??`hybrid`}}),r=d(n);return r?.results?r.results.map(e=>({sourcePath:y(e.sourcePath??e.path),contentType:y(e.contentType,`unknown`),score:g(e.score),content:y(e.content??e.snippet),headingPath:b(e.headingPath),startLine:_(e.startLine),endLine:_(e.endLine)})):p(u(n))}async listKnowledge(){let e=d(await this.client.callTool({name:`knowledge`,arguments:{action:`list`}}));return e?.entries?e.entries.map(e=>({path:y(e.path),title:y(e.title),category:y(e.category),tags:x(e.tags),content:y(e.content)})):[]}async readKnowledge(e){try{let t=u(await this.client.callTool({name:`knowledge`,arguments:{action:`read`,path:e}}));return!t||/not found/i.test(t)?null:{path:e,title:e.split(`/`).pop()??e,category:e.split(`/`).at(-2)??`uncategorized`,tags:[],content:t}}catch{return null}}async getGraph(e){let t=m(u(await this.client.callTool({name:`graph`,arguments:{action:`find_nodes`,...e?{name_pattern:e}:{},limit:500}})));return t.length===0?{nodes:[],edges:[]}:{nodes:t,edges:h(u(await this.client.callTool({name:`graph`,arguments:{action:`find_edges`,limit:1e3}})))}}async getFileTree(){let e=await this.client.callTool({name:`find`,arguments:{glob:`**/*`,limit:1e4}}),t=d(e);return t?.results?t.results.map(e=>typeof e==`string`?e:e.path??``).filter(e=>e.length>0):u(e).split(`
3
3
  `).map(e=>e.trim()).filter(e=>e.length>0)}};function u(e){return a(e)}function d(e){return o(e)}function f(e,t){let n=t.exec(e);return n?Number.parseInt(n[1],10):0}function p(e){let t=[],n=e.split(/\n(?=\d+\.\s|\*\*)/);for(let e of n){let n=/(?:\*\*|`)([^*`]+?)(?:\*\*|`)/.exec(e),r=/score:\s*([\d.]+)/i.exec(e);n&&t.push({sourcePath:n[1].trim(),contentType:`unknown`,score:r?Number.parseFloat(r[1]):0,content:e.replace(/^.*\n/,``).trim().slice(0,200)})}return t}function m(e){let t=[];for(let n of e.split(`
4
4
  `)){let e=/\*\*(.+?)\*\*\s*\(([^,)]+)(?:,\s*id:\s*`?([\w-]+)`?)?/.exec(n);e&&t.push({id:e[3]??`node-${t.length}`,name:e[1],type:e[2]})}return t}function h(e){let t=[];for(let n of e.split(`
5
5
  `)){let e=/`?([\w-]+)`?\s*[—-]+\[(\w+)\][→>]\s*`?([\w-]+)`?/.exec(n);e&&t.push({fromId:e[1],toId:e[3],type:e[2]})}return t}function g(e){return typeof e==`number`?e:0}function _(e){return typeof e==`number`?e:void 0}function v(e){return typeof e==`string`?e:null}function y(e,t=``){return typeof e==`string`?e:t}function b(e){return typeof e==`string`?e:void 0}function x(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}export{t as DirectAikitClient,l as McpAikitClient,o as extractStructured,a as extractText,s as parseToolResult,c as tryParseJson};
@@ -2,7 +2,7 @@
2
2
  "manifest_version": "0.3",
3
3
  "name": "aikit",
4
4
  "display_name": "AI Kit",
5
- "version": "0.1.397",
5
+ "version": "0.1.398",
6
6
  "description": "Local-first AI developer toolkit — knowledge base, code analysis, context management, and developer tools for LLM agents",
7
7
  "author": {
8
8
  "name": "AnVPX",
@@ -477,6 +477,8 @@ interface IndexStats {
477
477
  totalFiles: number;
478
478
  contentTypeBreakdown: Record<string, number>;
479
479
  lastIndexedAt: string | null;
480
+ /** Latest timestamp for records indexed from workspace source files. */
481
+ lastSourceIndexedAt?: string | null;
480
482
  storeBackend: string;
481
483
  embeddingModel: string;
482
484
  }
@@ -5,4 +5,4 @@ import{fileURLToPath as e,pathToFileURL as t}from"node:url";import{parseArgs as
5
5
  `).length,fileHash:this.hash(e.content),indexedAt:t,origin:`curated`,tags:e.frontmatter.tags,category:e.frontmatter.category,version:e.frontmatter.version}});try{return await this.store.upsert(i,r),e.length}catch(t){z.error(`Failed to upsert curated batch`,{batchSize:e.length,...o(t)});for(let t of e)n.push(`${t.relativePath}: upsert failed`);return 0}}catch(r){if(e.length===1)return z.error(`Failed to embed curated item`,{relativePath:e[0].relativePath,...o(r)}),n.push(`${e[0].relativePath}: reindex failed`),0;z.warn(`Curated embed batch failed, retrying with smaller chunks`,{batchSize:e.length,...o(r)});let i=Math.ceil(e.length/2),a=e.slice(0,i),s=e.slice(i);return await this.embedAndUpsertBatch(a,t,n)+await this.embedAndUpsertBatch(s,t,n)}}gitCommitKnowledge(e,t,n){try{if(!b(this.curatedDir))return;let r=this.knowledgeRefForPath(e);if(!r)return;x(r,`entry.md`,t,n,this.curatedDir)}catch{}}gitDeleteKnowledgeRef(e){try{if(!b(this.curatedDir))return;let t=this.knowledgeRefForPath(e);if(!t)return;S([`update-ref`,`-d`,t],this.curatedDir)}catch{}}knowledgeRefForPath(e){let t=e.replace(/\.md$/,``).split(`/`).map(e=>C(e)).join(`/`);return t.split(`/`).every(e=>y.test(e))?`${R}/${t}`:null}async indexCuratedFile(e,t,n){let r=await this.embedder.embed(t),i=`.ai/curated/${e}`,a=new Date().toISOString(),o={id:this.hashId(i,0),content:t,sourcePath:i,contentType:`curated-knowledge`,headingPath:n.title,chunkIndex:0,totalChunks:1,startLine:1,endLine:t.split(`
6
6
  `).length,fileHash:this.hash(t),indexedAt:a,origin:`curated`,tags:n.tags,category:n.category,version:n.version};await this.store.upsert([o],[r])}async indexCuratedFileBestEffort(e,t,n,i){if(r.instance().isDegraded(`embedder`)){z.debug(`Skipping vector indexing — embedder degraded`,{relativePath:e,operation:i,subsystem:`embedder`});return}try{await this.indexCuratedFile(e,t,n)}catch(t){z.warn(`Curated file persisted but vector indexing deferred`,{relativePath:e,operation:i,...o(t)})}}async discoverCategories(){return this.adapter.listDirectories()}guardPath(e){let t=e.replace(/^\.ai\/curated\//,``);if(t.endsWith(`.md`)||(t+=`.md`),t.includes(`..`)||l(t))throw Error(`Invalid path: ${t}. Must be relative within .ai/curated/ directory.`);let n=t.split(`/`)[0];return this.validateCategoryName(n),t}validateCategoryName(e){if(!/^[a-z][a-z0-9-]*$/.test(e))throw Error(`Invalid category name: "${e}". Must be lowercase kebab-case (e.g., "decisions", "api-contracts").`)}validateContentSize(e){if(Buffer.byteLength(e,`utf-8`)>L)throw Error(`Content exceeds maximum size of ${L/1024}KB`)}slugify(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``).slice(0,80)}normalizeTags(e){return[...new Set(e.map(e=>e.trim()).filter(Boolean))]}sameTags(e,t){if(e.length!==t.length)return!1;let n=new Set(e);return t.every(e=>n.has(e))}ensureCategoryPath(e,t){if(!e.startsWith(`${t}/`))throw Error(`Curated path "${e}" must stay within category "${t}"`)}async uniqueRelativePath(e,t){let n=`${e}/${t}.md`;if(!await this.adapter.exists(n))return n;for(let n=2;n<=100;n++){let r=`${e}/${t}-${n}.md`;if(!await this.adapter.exists(r))return r}throw Error(`Too many entries with slug "${t}" in category "${e}"`)}hash(e){return v(`sha256`).update(e).digest(`hex`).slice(0,16)}hashId(e,t){return this.hash(`${e}::${t}`)}serializeFile(e,t){return`${[`---`,`title: "${t.title.replace(/"/g,`\\"`)}"`,`category: ${t.category}`,`tags: [${t.tags.map(e=>`"${e}"`).join(`, `)}]`,`created: ${t.created}`,`updated: ${t.updated}`,`version: ${t.version}`,`origin: ${t.origin}`,`changelog:`,...t.changelog.map(e=>` - version: ${e.version}\n date: ${e.date}\n reason: "${e.reason.replace(/"/g,`\\"`)}"`),`---`].join(`
7
7
  `)}\n\n${e}\n`}parseFile(e){let t=e.match(/^---\n([\s\S]*?)\n---\n\n?([\s\S]*)$/);if(!t)return{frontmatter:{title:`Untitled`,category:`notes`,tags:[],created:``,updated:``,version:1,origin:`curated`,changelog:[]},content:e};let n=t[1],r=t[2].trim(),i={},a=[],o=n.split(`
8
- `),s=!1,c={};for(let e of o){if(/^changelog:\s*$/.test(e)){s=!0;continue}if(s){let t=e.match(/^\s+-\s+version:\s*(\d+)$/);if(t){c.version!=null&&a.push(c),c={version:parseInt(t[1],10)};continue}let n=e.match(/^\s+date:\s*(.+)$/);if(n){c.date=n[1].trim();continue}let r=e.match(/^\s+reason:\s*"?(.*?)"?\s*$/);if(r){c.reason=r[1];continue}/^\w/.test(e)&&(s=!1,c.version!=null&&a.push(c),c={});continue}let t=e.match(/^(\w+):\s*(.*)$/);if(t){let e=t[1],n=t[2];typeof n==`string`&&n.startsWith(`[`)&&n.endsWith(`]`)?n=n.slice(1,-1).split(`,`).map(e=>e.trim().replace(/^"|"$/g,``)).filter(e=>e.length>0):typeof n==`string`&&/^\d+$/.test(n)?n=parseInt(n,10):typeof n==`string`&&n.startsWith(`"`)&&n.endsWith(`"`)&&(n=n.slice(1,-1)),i[e]=n}}return c.version!=null&&a.push(c),{frontmatter:{title:i.title??`Untitled`,category:i.category??`notes`,tags:i.tags??[],created:i.created??``,updated:i.updated??``,version:i.version??1,origin:`curated`,changelog:a},content:r}}};const V=i(`server`);function H(e,t){return t?{version:e,...o(t)}:{version:e}}function U(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function W(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===t(e).href}catch{return!1}}function G(){return W()?n({allowPositionals:!0,options:{transport:{type:`string`,default:U()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:U(),port:process.env.AIKIT_PORT??`3210`}}async function K(){let e=t=>{t.name===`ExperimentalWarning`&&t.message.includes(`SQLite`)||(process.off(`warning`,e),process.emitWarning(t),process.on(`warning`,e))};process.on(`warning`,e);let t=w(),n=G();if(process.on(`unhandledRejection`,e=>{V.error(`Unhandled rejection`,H(t,e))}),process.on(`uncaughtException`,e=>{V.error(`Uncaught exception — exiting`,H(t,e)),process.exit(1)}),V.info(`Starting MCP AI Kit server`,{version:t}),n.transport===`http`){let{startHttpMode:e}=await import(`./server-http-0HPWzxA8.js`);await e(t,n.port)}else{let{startStdioMode:e}=await import(`./server-stdio-BgHgnVRD.js`);await e(t)}}K();export{T as a,k as i,I as n,E as o,F as r,O as s,B as t};
8
+ `),s=!1,c={};for(let e of o){if(/^changelog:\s*$/.test(e)){s=!0;continue}if(s){let t=e.match(/^\s+-\s+version:\s*(\d+)$/);if(t){c.version!=null&&a.push(c),c={version:parseInt(t[1],10)};continue}let n=e.match(/^\s+date:\s*(.+)$/);if(n){c.date=n[1].trim();continue}let r=e.match(/^\s+reason:\s*"?(.*?)"?\s*$/);if(r){c.reason=r[1];continue}/^\w/.test(e)&&(s=!1,c.version!=null&&a.push(c),c={});continue}let t=e.match(/^(\w+):\s*(.*)$/);if(t){let e=t[1],n=t[2];typeof n==`string`&&n.startsWith(`[`)&&n.endsWith(`]`)?n=n.slice(1,-1).split(`,`).map(e=>e.trim().replace(/^"|"$/g,``)).filter(e=>e.length>0):typeof n==`string`&&/^\d+$/.test(n)?n=parseInt(n,10):typeof n==`string`&&n.startsWith(`"`)&&n.endsWith(`"`)&&(n=n.slice(1,-1)),i[e]=n}}return c.version!=null&&a.push(c),{frontmatter:{title:i.title??`Untitled`,category:i.category??`notes`,tags:i.tags??[],created:i.created??``,updated:i.updated??``,version:i.version??1,origin:`curated`,changelog:a},content:r}}};const V=i(`server`);function H(e,t){return t?{version:e,...o(t)}:{version:e}}function U(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function W(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===t(e).href}catch{return!1}}function G(){return W()?n({allowPositionals:!0,options:{transport:{type:`string`,default:U()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:U(),port:process.env.AIKIT_PORT??`3210`}}async function K(){let e=t=>{t.name===`ExperimentalWarning`&&t.message.includes(`SQLite`)||(process.off(`warning`,e),process.emitWarning(t),process.on(`warning`,e))};process.on(`warning`,e);let t=w(),n=G();if(process.on(`unhandledRejection`,e=>{V.error(`Unhandled rejection`,H(t,e))}),process.on(`uncaughtException`,e=>{V.error(`Uncaught exception — exiting`,H(t,e)),process.exit(1)}),V.info(`Starting MCP AI Kit server`,{version:t}),n.transport===`http`){let{startHttpMode:e}=await import(`./server-http-DJGyY7DN.js`);await e(t,n.port)}else{let{startStdioMode:e}=await import(`./server-stdio-Bl3oSggo.js`);await e(t)}}K();export{T as a,k as i,I as n,E as o,F as r,O as s,B as t};
@@ -351,4 +351,4 @@ svg text{fill:var(--body);font-family:var(--sans);font-size:12px}
351
351
  <\/script>
352
352
  </body>
353
353
  </html>`}const U=`<!-- DIAGRAM:SVG -->`;function W(e){let t=e.indexOf(U);if(t===-1)return null;let n=t+20,r=e.indexOf(U,n);if(r===-1)return null;let i=e.slice(n,r).trim();if(i.startsWith(`<svg`))return i;let a=e.slice(Math.max(0,t),r+20),o=a.match(/viewBox="([^"]+)"/),s=o?o[1]:`0 0 1200 800`,c=a.match(/width="(\d+)"/),l=c?c[1]:`1200`,u=a.match(/height="(\d+)"/);return[`<svg xmlns="http://www.w3.org/2000/svg" viewBox="${s}" width="${l}" height="${u?u[1]:`800`}">`,` <defs>`,` <style>`,` text { font-family: system-ui, -apple-system, sans-serif; }`,` .title { font-size: 20px; font-weight: 600; fill: #fff; }`,` .subtitle { font-size: 14px; fill: #94a3b8; }`,` </style>`,` </defs>`,i,`</svg>`].join(`
354
- `)}function he(e){let t=e.match(/<title>([^<]+)<\/title>/);return t?t[1]:`diagram`}async function ge(e,t,n){let r=m(n);await h(r,{recursive:!0});let i=he(e).replace(/[^a-zA-Z0-9\s-]/g,``).replace(/\s+/g,`-`).replace(/-+/g,`-`).replace(/^-|-$/g,``).toLowerCase().slice(0,80)||`diagram`,a=p(r,`${i}.html`);await g(a,e,`utf-8`);let o=null,s=W(e);s&&(o=p(r,`${i}.svg`),await g(o,s,`utf-8`));let c=null;return t&&(c=p(r,`${i}.md`),await g(c,t,`utf-8`)),{htmlPath:a,svgPath:o,mdPath:c}}const G=10*1024*1024,K=2e3;function _e(e){try{return JSON.stringify(e)}catch{return``}}function ve(e){switch(e.diagram_type){case`architecture`:return ae(e);case`workflow`:return H(e);case`sequence`:return R(e);case`dataflow`:return ce(e);case`lifecycle`:return P(e)}}function q(e,t={}){Y(e);let n=J(e);if(n.length>0)throw Error(`Diagram validation failed: ${n.join(`; `)}`);let r=t.title??e.meta.title,i=t.subtitle??e.meta.subtitle,a=t.dualOutput??!0,{svg:o,cardsHtml:s,detailData:c}=ve(e),l=c&&Object.keys(c).length>0?`\n<script id="diagram-node-data" type="application/json">${_e(c)}<\/script>`:``,u=e.meta?.palette===`warm`?`warm`:`technical`;return{html:me().replaceAll(`[TITLE]`,X(r)).replaceAll(`[SUBTITLE]`,X(i??``)).replaceAll(`[PALETTE]`,u===`warm`?` data-palette="warm"`:``).replaceAll(`<!-- DIAGRAM:SVG -->`,o).replaceAll(`<!-- DIAGRAM:CARDS -->`,s).replace(`</body>`,`${l}\n</body>`),markdown:a?_(e):void 0}}function ye(e,t={}){return q(e,{...t,dualOutput:!1}).html}function be(e){return _(e)}function xe(e){try{return Y(e),J(e)}catch(e){return[e.message]}}function J(e){if(!e||typeof e!=`object`)return[`Input must be an object`];if(!e.diagram_type)return[`Missing diagram_type`];if(!e.meta?.title)return[`meta.title is required`];if(e.schema_version!==1)return[`schema_version must be 1`];let t=e.diagram_type,n=e,r=n.components??n.nodes??n.participants??n.states??[],i=n.connections??n.edges??n.messages??n.flows??n.transitions??[],a=new Set(r.map(e=>e.id));if(a.size!==r.length)return[`${t}: Node/component IDs must be unique`];for(let e of i){if(e.from&&!a.has(e.from))return[`${t}: Edge references unknown source "${e.from}"`];if(e.to&&!a.has(e.to))return[`${t}: Edge references unknown target "${e.to}"`]}return[]}function Y(e){let t=JSON.stringify(e),n=Buffer.byteLength(t,`utf-8`);if(n>G)throw Error(`Input too large: ${(n/1024/1024).toFixed(1)}MB (max ${G/1024/1024}MB)`);let r=e,i=r.components??r.nodes??r.participants??[];if(i.length>500)throw Error(`Too many components/nodes: ${i.length} (max 500)`);let a=r.connections??r.edges??r.messages??r.flows??r.transitions??[];if(a.length>K)throw Error(`Too many edges/connections: ${a.length} (max ${K})`)}function Se(e){return e.replace(/[^a-zA-Z0-9-_]/g,`_`).toLowerCase().slice(0,120)}function X(e){let t={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`};return String(e??``).replace(/[&<>"']/g,e=>t[e]??e)}const Z=d(`server`);function Q(e,t){return t?{version:e,...f(t)}:{version:e}}function $(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function Ce(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===l(e).href}catch{return!1}}function we(){return Ce()?u({allowPositionals:!0,options:{transport:{type:`string`,default:$()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:$(),port:process.env.AIKIT_PORT??`3210`}}async function Te(){let e=t=>{t.name===`ExperimentalWarning`&&t.message.includes(`SQLite`)||(process.off(`warning`,e),process.emitWarning(t),process.on(`warning`,e))};process.on(`warning`,e);let n=t(),r=we();if(process.on(`unhandledRejection`,e=>{Z.error(`Unhandled rejection`,Q(n,e))}),process.on(`uncaughtException`,e=>{Z.error(`Uncaught exception — exiting`,Q(n,e)),process.exit(1)}),Z.info(`Starting MCP AI Kit server`,{version:n}),r.transport===`http`){let{startHttpMode:e}=await import(`./server-http-B_mvnG_f.js`);await e(n,r.port)}else{let{startStdioMode:e}=await import(`./server-stdio-n6KheU1p.js`);await e(n)}}export{c as CuratedKnowledgeManager,s as applyWorkspaceRoots,a as bootstrapWorkspaceRoots,i as createSlidingWindowRateLimiter,ge as exportDiagram,W as extractSvg,n as getSessionIdHeader,Te as main,r as readPositiveIntEnv,t as readVersion,ye as renderHtml,be as renderMd,q as renderToResult,e as resolveCorsOrigin,Se as sanitizeTitle,o as selectWorkspaceRoot,xe as validate};
354
+ `)}function he(e){let t=e.match(/<title>([^<]+)<\/title>/);return t?t[1]:`diagram`}async function ge(e,t,n){let r=m(n);await h(r,{recursive:!0});let i=he(e).replace(/[^a-zA-Z0-9\s-]/g,``).replace(/\s+/g,`-`).replace(/-+/g,`-`).replace(/^-|-$/g,``).toLowerCase().slice(0,80)||`diagram`,a=p(r,`${i}.html`);await g(a,e,`utf-8`);let o=null,s=W(e);s&&(o=p(r,`${i}.svg`),await g(o,s,`utf-8`));let c=null;return t&&(c=p(r,`${i}.md`),await g(c,t,`utf-8`)),{htmlPath:a,svgPath:o,mdPath:c}}const G=10*1024*1024,K=2e3;function _e(e){try{return JSON.stringify(e)}catch{return``}}function ve(e){switch(e.diagram_type){case`architecture`:return ae(e);case`workflow`:return H(e);case`sequence`:return R(e);case`dataflow`:return ce(e);case`lifecycle`:return P(e)}}function q(e,t={}){Y(e);let n=J(e);if(n.length>0)throw Error(`Diagram validation failed: ${n.join(`; `)}`);let r=t.title??e.meta.title,i=t.subtitle??e.meta.subtitle,a=t.dualOutput??!0,{svg:o,cardsHtml:s,detailData:c}=ve(e),l=c&&Object.keys(c).length>0?`\n<script id="diagram-node-data" type="application/json">${_e(c)}<\/script>`:``,u=e.meta?.palette===`warm`?`warm`:`technical`;return{html:me().replaceAll(`[TITLE]`,X(r)).replaceAll(`[SUBTITLE]`,X(i??``)).replaceAll(`[PALETTE]`,u===`warm`?` data-palette="warm"`:``).replaceAll(`<!-- DIAGRAM:SVG -->`,o).replaceAll(`<!-- DIAGRAM:CARDS -->`,s).replace(`</body>`,`${l}\n</body>`),markdown:a?_(e):void 0}}function ye(e,t={}){return q(e,{...t,dualOutput:!1}).html}function be(e){return _(e)}function xe(e){try{return Y(e),J(e)}catch(e){return[e.message]}}function J(e){if(!e||typeof e!=`object`)return[`Input must be an object`];if(!e.diagram_type)return[`Missing diagram_type`];if(!e.meta?.title)return[`meta.title is required`];if(e.schema_version!==1)return[`schema_version must be 1`];let t=e.diagram_type,n=e,r=n.components??n.nodes??n.participants??n.states??[],i=n.connections??n.edges??n.messages??n.flows??n.transitions??[],a=new Set(r.map(e=>e.id));if(a.size!==r.length)return[`${t}: Node/component IDs must be unique`];for(let e of i){if(e.from&&!a.has(e.from))return[`${t}: Edge references unknown source "${e.from}"`];if(e.to&&!a.has(e.to))return[`${t}: Edge references unknown target "${e.to}"`]}return[]}function Y(e){let t=JSON.stringify(e),n=Buffer.byteLength(t,`utf-8`);if(n>G)throw Error(`Input too large: ${(n/1024/1024).toFixed(1)}MB (max ${G/1024/1024}MB)`);let r=e,i=r.components??r.nodes??r.participants??[];if(i.length>500)throw Error(`Too many components/nodes: ${i.length} (max 500)`);let a=r.connections??r.edges??r.messages??r.flows??r.transitions??[];if(a.length>K)throw Error(`Too many edges/connections: ${a.length} (max ${K})`)}function Se(e){return e.replace(/[^a-zA-Z0-9-_]/g,`_`).toLowerCase().slice(0,120)}function X(e){let t={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`};return String(e??``).replace(/[&<>"']/g,e=>t[e]??e)}const Z=d(`server`);function Q(e,t){return t?{version:e,...f(t)}:{version:e}}function $(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function Ce(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===l(e).href}catch{return!1}}function we(){return Ce()?u({allowPositionals:!0,options:{transport:{type:`string`,default:$()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:$(),port:process.env.AIKIT_PORT??`3210`}}async function Te(){let e=t=>{t.name===`ExperimentalWarning`&&t.message.includes(`SQLite`)||(process.off(`warning`,e),process.emitWarning(t),process.on(`warning`,e))};process.on(`warning`,e);let n=t(),r=we();if(process.on(`unhandledRejection`,e=>{Z.error(`Unhandled rejection`,Q(n,e))}),process.on(`uncaughtException`,e=>{Z.error(`Uncaught exception — exiting`,Q(n,e)),process.exit(1)}),Z.info(`Starting MCP AI Kit server`,{version:n}),r.transport===`http`){let{startHttpMode:e}=await import(`./server-http-C9Zw6erV.js`);await e(n,r.port)}else{let{startStdioMode:e}=await import(`./server-stdio-DsBR9uv4.js`);await e(n)}}export{c as CuratedKnowledgeManager,s as applyWorkspaceRoots,a as bootstrapWorkspaceRoots,i as createSlidingWindowRateLimiter,ge as exportDiagram,W as extractSvg,n as getSessionIdHeader,Te as main,r as readPositiveIntEnv,t as readVersion,ye as renderHtml,be as renderMd,q as renderToResult,e as resolveCorsOrigin,Se as sanitizeTitle,o as selectWorkspaceRoot,xe as validate};
@@ -28,7 +28,7 @@ skillDir is not configured. Run \`aikit init\` or set skillDir in server config
28
28
 
29
29
  Run \`onboard({ path: "." })\` to generate this skill.`+n}catch{t=`# Workspace Skill: error
30
30
 
31
- Failed to read skill file.`}return{contents:[{uri:`aikit://skill/SKILL.md`,text:t,mimeType:`text/markdown`}]}}),r?Fo.debug(`Workspace skill resources registered`,{skillDir:r}):Fo.debug(`skillDir not configured — skill resources registered with diagnostic messages`)}new Set(Object.entries(Fa).filter(([e,t])=>t.planner?.effect===`read`).map(([e])=>e)),new Set(Object.entries(Fa).filter(([e,t])=>{let n=t.planner?.effect;return n===`write`||n===`mixed`||n===`destructive`}).map(([e])=>e)),new Set(Object.entries(Fa).filter(([e,t])=>t.planner?.costClass===`tiny`).map(([e])=>e));const Uo=[`er_push`,`er_pull`,`er_sync_status`],Wo=[...Uo,`er_update_policy`,`er_evolve_review`],Go=new Set(Wo);function Ko(e){return e.toolProfiles}const qo=5e3,Jo=A(`structured-content-guard`);function Yo(){let e=(async(e,t)=>{let n;try{n=await t()}catch(e){n={content:[{type:`text`,text:`[ERROR:INTERNAL] ${e instanceof Error?e.message:String(e)}`}],isError:!0}}let r=(e.toolConfig??{}).outputSchema;if(r==null)return n;let i=null;if(n.structuredContent==null){let t=Xo(r);n.structuredContent=t,i=`synthesize`,n.structuredContent??(n.structuredContent={},i=`synthesize-null-fallback`,Jo.error(`synthesizeStructuredContent returned null/undefined — using empty fallback`,{tool:e.toolName}))}let a=Zo(r,n.structuredContent);if(a.action!=null&&(n.structuredContent=a.structuredContent,i=a.action),$o(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),Qo(r,n.structuredContent)===!1){let e=Xo(r);n.structuredContent=e??{},Qo(r,n.structuredContent)===!1?(n.structuredContent=$o(n.structuredContent)?n.structuredContent:{},i=`final-validation-failed`):i??=`final-heal`}return n});return e.critical=!0,e}function Xo(e){try{return es(e)??{}}catch{return{}}}function Zo(e,t){if(Qo(e,t)!==!1)return{structuredContent:t,action:null};try{let n=Xo(e);if($o(n)&&$o(t)){let r={...n,...t};if(Qo(e,r)!==!1)return{structuredContent:r,action:`heal`}}return{structuredContent:n,action:`fallback-zero-value`}}catch{return{structuredContent:t,action:null}}}function Qo(e,t){let n=e.safeParse;if(typeof n==`function`)try{return n(t).success}catch{return}}function $o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function es(e){if(!e)return{};if(e.anyOf){let t=e.anyOf.find(e=>e.type!==`null`);return t?es(t):null}let t=e._def?.typeName;if(t&&!e.type)switch(t){case`ZodObject`:{let t={},n=null;try{n=e.shape??(typeof e._def?.shape==`function`?e._def.shape():e._def?.shape)}catch{n=null}if(n)for(let[e,r]of Object.entries(n))try{t[e]=es(r)}catch{t[e]=null}return t}case`ZodArray`:return[];case`ZodString`:return``;case`ZodNumber`:return 0;case`ZodBoolean`:return!1;case`ZodNullable`:return null;case`ZodOptional`:return;case`ZodRecord`:return{};case`ZodEnum`:return e._def?.values?.[0]??``;default:return{}}switch(e.type){case`object`:{let t={},n=e.properties??e.shape;if(n)for(let[e,r]of Object.entries(n))t[e]=es(r);return t}case`array`:return[];case`string`:return``;case`number`:case`integer`:return 0;case`boolean`:return!1;case`nullable`:return null;case`optional`:return;case`record`:return{};case`enum`:return e.options?.[0]??Object.values(e.enum??e._def?.entries??{})[0]??``;default:return{}}}function ts(e){if(!e)return{};try{let t=es(e);return $o(t)?t:{}}catch{return{}}}const ns=Symbol(`toolPipelineState`);function rs(e){return e[ns]}function is(e,t){e[ns]=t}function as(e,t){return t?async(...n)=>{let r=await e(...n);if(!r||typeof r!=`object`)return r;let i=r;return!(`content`in i)||i.structuredContent!=null&&typeof i.structuredContent==`object`?r:(i.structuredContent=ts(t),i.structuredContent??={},r)}:e}function os(e,t,n=``,r,i){let a=rs(e);if(a){a.pipeline=t,a.prefix=n,r!==void 0&&(a.eventBus=r),i!==void 0&&(a.workspaceId=i);return}let o={originalRegisterTool:e.registerTool.bind(e),pipeline:t,prefix:n,eventBus:r,workspaceId:i};is(e,o),e.registerTool=(n,r,i)=>{let a=rs(e),s=a?.prefix?`${a.prefix}${n}`:n;if(!i)return a?.originalRegisterTool(s,r);let c=r?.outputSchema;if((a?.pipeline??t).getMiddlewareNames().length===0){let e=as(i,c);return a?.originalRegisterTool(s,r,e)}let l=U(n),u=a??o,d=as(u.pipeline.wrap(n,i,r,l,u.eventBus,u.workspaceId),c);return a?.originalRegisterTool(s,r,d)}}const ss={analyze:1,audit:1,check:2,codemod:2,config:0,delegate:3,digest:1,env:0,eval:2,evidence_map:2,file_summary:1,find:1,flow:3,forge_ground:2,git:1,graph:1,measure:1,onboard:3,parse_output:1,present:1,process:3,produce_knowledge:3,queue:3,reindex:3,rename:2,replay:1,restore:2,scope_map:1,search:1,session:2,status:0,symbol:1,test_run:2,trace:1,web_fetch:1,web_search:1};function cs(e,t){return e.filter(e=>(ss[e]??0)<=t)}const ls=new Set([`status`,`config`]),us={full:{description:`All tools enabled (default)`,includeCategories:[]},safe:{description:`Read-only tools — no file/state modifications`,includeCategories:[`search`,`analysis`,`compression`,`utilities`,`system`,`git`,`flow`],excludeTools:[`reindex`,`onboard`]},research:{description:`Search, analysis, knowledge, and web access`,includeCategories:[`search`,`analysis`,`knowledge`,`compression`,`web`,`system`,`flow`]},minimal:{description:`Essential tools only — search, status, basic operations`,includeCategories:[`search`,`system`],includeTools:[`file_summary`,`check`,`test_run`]},discovery:{description:`Full toolset plus discovery-oriented meta-tools for guided tool exploration`,includeCategories:[],includeTools:[`list_tools`],excludeTools:[`describe_tool`,`search_tools`]}};function ds(e,t){let n=us[e];if(n)return n;let r=t?.[e];if(r)return r;throw Error(`Unknown tool profile: ${e}`)}function fs(e,t,n){return t.includes(`*`)?!0:(n[e]?.category??[]).some(e=>t.includes(e))}function ps(e,t,n,r){if(t.includes(`*`)){for(let t of n)e.add(t);return}for(let i of n)fs(i,t,r)&&e.add(i)}function ms(e,t,n){if(t.includes(`*`)){e.clear();return}for(let r of[...e])fs(r,t,n)&&e.delete(r)}function hs(e,t,n){if(!e||e.length===0||e.includes(`*`))return new Set(t);let r=new Set;return ps(r,e,t,n),r}function gs(e,t){return e===void 0?t:t===void 0?e:Math.min(e,t)}function _s(e,t){for(let n of[...e])t[n]?.annotations?.readOnlyHint===!1&&e.delete(n)}function vs(e,t,n=0,r=[]){if(n>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...r,e].join(` -> `)}`);if(r.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...r,e].join(` -> `)}`);let i=ds(e,t);return gs(i.extends?vs(i.extends,t,n+1,[...r,e]):void 0,i.maxTier)}function ys(e,t,n,r){let i=(e,a,o)=>{if(a>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...o,e].join(` -> `)}`);if(o.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...o,e].join(` -> `)}`);let s=ds(e,r),c=[...o,e],l=s.extends?i(s.extends,a+1,c):hs(s.includeCategories,t,n);s.extends&&s.includeCategories?.length&&ps(l,s.includeCategories,t,n),s.excludeCategories?.length&&ms(l,s.excludeCategories,n);for(let e of s.includeTools??[])l.add(e);for(let e of s.excludeTools??[])l.delete(e);return l},a=i(e,0,[]),o=vs(e,r);if(o!==void 0){let e=cs([...a],o);a.clear();for(let t of e)a.add(t)}for(let e of ls)a.add(e);return e===`safe`&&_s(a,n),a}const bs=new Set([`search`,`analysis`,`knowledge`,`compression`,`forge`,`presentation`,`execution`,`manipulation`,`session`,`git`,`process`,`system`,`meta`,`utilities`,`web`,`queue`,`flow`]);function xs(e,t,n,r){let i=process.env.AIKIT_TOOLSET||e.toolProfile||`full`,a=ys(i,t,n,r);if(e.features&&e.features.length>0){let i=e.features.filter(e=>!bs.has(e));if(i.length>0)throw Error(`Unknown feature group(s): ${i.join(`, `)}. Valid categories: ${[...bs].join(`, `)}`);let o={description:`Synthetic profile from features config`,includeCategories:e.features},s=ys(`_features`,t,n,{...r,_features:o});for(let e of a)!s.has(e)&&!ls.has(e)&&a.delete(e)}if(e.readOnly)for(let e of[...a])n[e]?.annotations?.readOnlyHint===!1&&!ls.has(e)&&a.delete(e);for(let e of ls)a.add(e);return i===`safe`&&_s(a,n),a}const Ss=L.object({mode:L.enum([`wasm`,`regex`,`unknown`]),reason:L.string(),pathsChecked:L.array(L.object({path:L.string(),exists:L.boolean()})),os:L.string(),arch:L.string(),nodeVersion:L.string(),webTreeSitterImportable:L.boolean(),healAttempted:L.boolean(),healSuccess:L.boolean(),healError:L.string().nullable(),initError:L.string().nullable(),wasmDir:L.string().nullable(),grammarCount:L.number()}),Cs=L.object({kind:L.enum([`onboard`,`update_onboard`,`reindex`,`handoff`,`proceed`]),reason:L.string(),command:L.string().optional()}),ws=L.object({title:L.string(),insight:L.string(),confidence:L.number()}),Ts=L.object({lessons:L.array(ws),conventions:L.array(L.object({title:L.string(),preview:L.string()})),checkpoint:L.string().nullable()});L.object({totalRecords:L.number(),totalFiles:L.number(),lastIndexedAt:L.string().nullable(),onboarded:L.boolean(),onboardDir:L.string(),contentTypes:L.record(L.string(),L.number()),wasmAvailable:L.boolean(),wasmDiagnostics:Ss,graphStats:L.object({nodes:L.number(),edges:L.number()}).nullable(),curatedCount:L.number(),serverVersion:L.string(),scaffoldVersion:L.string().nullable(),workspaceScaffoldVersion:L.string().nullable(),upgradeAvailable:L.boolean(),sessionTokens:L.object({callCount:L.number(),totalInputChars:L.number(),totalOutputChars:L.number(),estInputTokens:L.number(),estTotalTokens:L.number(),startTime:L.string()}).optional(),storeBackend:L.string().optional(),storeDiagnostics:L.object({adapterType:L.string(),vectorSearchEnabled:L.boolean(),ftsEnabled:L.boolean(),degradedMode:L.boolean(),dbPath:L.string(),dbSizeBytes:L.number().nullable(),embeddingDim:L.number(),vectorDtype:L.string()}).nullable().optional(),contextPressure:L.number().min(0).max(100).describe(`0–100 score indicating AI Kit saturation`),nextAction:Cs,prelude:Ts.nullable().optional()}).catchall(L.any()),L.object({ok:L.boolean(),checks:L.array(L.object({name:L.string(),ok:L.boolean(),message:L.string().optional()}))});const Es=L.object({summary:L.object({totalFiles:L.number(),totalLines:L.number(),totalCodeLines:L.number(),totalFunctions:L.number(),avgComplexity:L.number(),maxComplexity:L.object({value:L.number(),file:L.string()})}),files:L.array(L.object({path:L.string(),lines:L.number(),code:L.number(),complexity:L.number(),functions:L.number()}))}),Ds=L.object({platform:L.string(),arch:L.string(),nodeVersion:L.string(),cwd:L.string(),cpus:L.number(),memoryFreeGb:L.number(),memoryTotalGb:L.number()});L.object({iso:L.string(),unix:L.number(),timezone:L.string(),formatted:L.string()});const Os=L.object({passed:L.boolean(),errorCount:L.number(),warningCount:L.number(),topErrors:L.array(L.string())}),ks=L.object({passed:L.boolean(),tsc:Os,biome:Os}),As=L.object({name:L.string(),path:L.string(),depth:L.number()}),js=L.object({name:L.string(),definedIn:L.object({path:L.string(),line:L.number(),kind:L.string(),signature:L.string().optional()}).nullable(),importedBy:L.array(L.object({path:L.string(),line:L.number(),importStatement:L.string()})),referencedIn:L.array(L.object({path:L.string(),line:L.number(),context:L.string(),scope:L.string().optional()})),graphContext:L.object({definingModule:L.string().optional(),importedByModules:L.array(L.string()),siblingSymbols:L.array(L.string())}).nullable(),trace:L.object({callers:L.array(As),callees:L.array(As)}).nullable(),confidence:L.number().nullable(),method:L.string().nullable(),rationale:L.string().nullable(),error:L.string().optional()}),Ms=L.object({symbols:L.array(js)}),Ns=L.object({sourcePath:L.string(),contentType:L.string(),score:L.number(),headingPath:L.string().optional(),startLine:L.number().optional(),endLine:L.number().optional(),origin:L.string().optional(),category:L.string().optional(),tags:L.array(L.string()).optional()}),Ps=L.object({results:L.array(Ns),totalResults:L.number(),searchMode:L.string(),query:L.string(),ref:L.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Fs=L.object({path:L.string(),line:L.number().optional(),matchType:L.string(),preview:L.string()}),Is=L.object({matches:L.array(Fs),totalMatches:L.number(),pattern:L.string(),truncated:L.boolean(),ref:L.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Ls=L.object({path:L.string(),relevance:L.number(),estimatedTokens:L.number(),focusLines:L.array(L.string()).optional()}),Rs=L.object({files:L.array(Ls),totalFiles:L.number(),totalEstimatedTokens:L.number(),task:L.string()}),zs=L.object({path:L.string(),impact:L.string(),reason:L.string()}),Bs=L.object({changedFiles:L.array(L.string()),affectedFiles:L.array(zs),totalAffected:L.number(),riskLevel:L.string()}),Vs=L.object({name:L.string(),passed:L.boolean(),message:L.string().optional(),severity:L.string().optional()}),Hs=L.object({passed:L.boolean(),score:L.number(),checks:L.array(Vs),summary:L.string()}),Us=L.object({id:L.string(),name:L.string(),type:L.string(),sourcePath:L.string().optional()}),Ws=L.object({fromId:L.string(),toId:L.string(),fromName:L.string(),toName:L.string(),type:L.string()}),Gs=L.object({id:L.string(),name:L.string(),type:L.string()}),Ks=L.object({id:L.string(),nodeCount:L.number(),types:L.record(L.string(),L.number()),samples:L.array(Gs)}),qs=L.object({nodes:L.array(Us),edges:L.array(Ws),communities:L.array(Ks).optional(),totalNodes:L.number(),totalEdges:L.number(),query:L.string()});L.object({symbols:L.array(L.object({name:L.string(),path:L.string(),line:L.number().optional(),kind:L.string()})),totalDead:L.number()});const Js=L.object({gitRoot:L.string(),branch:L.string(),commitCount:L.number(),hasUncommitted:L.boolean(),recentCommits:L.array(L.object({hash:L.string(),message:L.string(),author:L.string(),date:L.string()}))}),Ys=L.object({sourceId:L.string(),value:L.string()}),Xs=L.object({id:L.string(),originalChars:L.number(),keptChars:L.number(),segmentsKept:L.number(),segmentsTotal:L.number()}),Zs=L.object({text:L.string().describe(`The compressed digest text output`),ref:L.string().optional().describe(`Reusable cache reference`),fields:L.record(L.string(),L.array(Ys)),sourceStats:L.array(Xs),totalOriginalChars:L.number(),totalCompressedChars:L.number(),ratio:L.number()}),Qs=L.object({passed:L.boolean(),totalTests:L.number(),passedTests:L.number(),failedTests:L.number(),skippedTests:L.number(),duration:L.number().describe(`Duration in milliseconds`),failures:L.array(L.object({name:L.string(),message:L.string(),file:L.string().optional()}))}),$s=A(`utils:enrich`);async function G(e,t){let n={curated:[],graph:[]},r=t.limit??3,[i,a]=await Promise.allSettled([ec(e,t.query,r),tc(e,t.filePath)]);return i.status===`fulfilled`?n.curated=i.value:$s.debug(`Curated enrichment failed`,{error:i.reason}),a.status===`fulfilled`?n.graph=a.value:$s.debug(`Graph enrichment failed`,{error:a.reason}),n}async function ec(e,t,n){if(!e.store||!t)return[];try{let r=await e.store.ftsSearch(t,{origin:`curated`,limit:n});if(r.length>0)return r.map(e=>nc(e.record));if(e.embedder){let r=await e.embedder.embedQuery(t);return(await e.store.search(r,{origin:`curated`,limit:n,minScore:.3})).map(e=>nc(e.record))}return[]}catch(e){return $s.debug(`Curated enrichment failed`,{error:e}),[]}}async function tc(e,t){if(!e.graphStore||!t)return[];try{let n=await e.graphStore.findNodes({sourcePath:t,limit:1});if(n.length===0){let r=t.split(/[/\\]/).pop()?.replace(/\.\w+$/,``)||``;if(!r)return[];let i=await e.graphStore.findNodes({namePattern:r,type:`module`,limit:1});if(i.length===0)return[];n.push(i[0])}let r=n[0],i=await e.graphStore.getNeighbors(r.id,{direction:`both`,limit:10}),a=[];for(let e of i.edges){let t=e.fromId===r.id?e.toId:e.fromId,n=i.nodes.find(e=>e.id===t);if(!n)continue;let o=e.fromId===r.id?`->`:`<-`;a.push(`${o} ${e.type}: ${n.name} (${n.type})`)}return a}catch(e){return $s.debug(`Graph enrichment failed`,{error:e}),[]}}function K(e){let t=[];if(e.curated.length>0){t.push(`**Curated Knowledge:**`);for(let n of e.curated)t.push(`- ${n}`)}if(e.graph.length>0){t.push(`**Graph Context:**`);for(let n of e.graph)t.push(`- ${n}`)}return t.length===0?``:`\n\n---\n### Enrichment\n${t.join(`
31
+ Failed to read skill file.`}return{contents:[{uri:`aikit://skill/SKILL.md`,text:t,mimeType:`text/markdown`}]}}),r?Fo.debug(`Workspace skill resources registered`,{skillDir:r}):Fo.debug(`skillDir not configured — skill resources registered with diagnostic messages`)}new Set(Object.entries(Fa).filter(([e,t])=>t.planner?.effect===`read`).map(([e])=>e)),new Set(Object.entries(Fa).filter(([e,t])=>{let n=t.planner?.effect;return n===`write`||n===`mixed`||n===`destructive`}).map(([e])=>e)),new Set(Object.entries(Fa).filter(([e,t])=>t.planner?.costClass===`tiny`).map(([e])=>e));const Uo=[`er_push`,`er_pull`,`er_sync_status`],Wo=[...Uo,`er_update_policy`,`er_evolve_review`],Go=new Set(Wo);function Ko(e){return e.toolProfiles}const qo=5e3,Jo=A(`structured-content-guard`);function Yo(){let e=(async(e,t)=>{let n;try{n=await t()}catch(e){n={content:[{type:`text`,text:`[ERROR:INTERNAL] ${e instanceof Error?e.message:String(e)}`}],isError:!0}}let r=(e.toolConfig??{}).outputSchema;if(r==null)return n;let i=null;if(n.structuredContent==null){let t=Xo(r);n.structuredContent=t,i=`synthesize`,n.structuredContent??(n.structuredContent={},i=`synthesize-null-fallback`,Jo.error(`synthesizeStructuredContent returned null/undefined — using empty fallback`,{tool:e.toolName}))}let a=Zo(r,n.structuredContent);if(a.action!=null&&(n.structuredContent=a.structuredContent,i=a.action),$o(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),Qo(r,n.structuredContent)===!1){let e=Xo(r);n.structuredContent=e??{},Qo(r,n.structuredContent)===!1?(n.structuredContent=$o(n.structuredContent)?n.structuredContent:{},i=`final-validation-failed`):i??=`final-heal`}return n});return e.critical=!0,e}function Xo(e){try{return es(e)??{}}catch{return{}}}function Zo(e,t){if(Qo(e,t)!==!1)return{structuredContent:t,action:null};try{let n=Xo(e);if($o(n)&&$o(t)){let r={...n,...t};if(Qo(e,r)!==!1)return{structuredContent:r,action:`heal`}}return{structuredContent:n,action:`fallback-zero-value`}}catch{return{structuredContent:t,action:null}}}function Qo(e,t){let n=e.safeParse;if(typeof n==`function`)try{return n(t).success}catch{return}}function $o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function es(e){if(!e)return{};if(e.anyOf){let t=e.anyOf.find(e=>e.type!==`null`);return t?es(t):null}let t=e._def?.typeName;if(t&&!e.type)switch(t){case`ZodObject`:{let t={},n=null;try{n=e.shape??(typeof e._def?.shape==`function`?e._def.shape():e._def?.shape)}catch{n=null}if(n)for(let[e,r]of Object.entries(n))try{t[e]=es(r)}catch{t[e]=null}return t}case`ZodArray`:return[];case`ZodString`:return``;case`ZodNumber`:return 0;case`ZodBoolean`:return!1;case`ZodNullable`:return null;case`ZodOptional`:return;case`ZodRecord`:return{};case`ZodEnum`:return e._def?.values?.[0]??``;default:return{}}switch(e.type){case`object`:{let t={},n=e.properties??e.shape;if(n)for(let[e,r]of Object.entries(n))t[e]=es(r);return t}case`array`:return[];case`string`:return``;case`number`:case`integer`:return 0;case`boolean`:return!1;case`nullable`:return null;case`optional`:return;case`record`:return{};case`enum`:return e.options?.[0]??Object.values(e.enum??e._def?.entries??{})[0]??``;default:return{}}}function ts(e){if(!e)return{};try{let t=es(e);return $o(t)?t:{}}catch{return{}}}const ns=Symbol(`toolPipelineState`);function rs(e){return e[ns]}function is(e,t){e[ns]=t}function as(e,t){return t?async(...n)=>{let r=await e(...n);if(!r||typeof r!=`object`)return r;let i=r;return!(`content`in i)||i.structuredContent!=null&&typeof i.structuredContent==`object`?r:(i.structuredContent=ts(t),i.structuredContent??={},r)}:e}function os(e,t,n=``,r,i){let a=rs(e);if(a){a.pipeline=t,a.prefix=n,r!==void 0&&(a.eventBus=r),i!==void 0&&(a.workspaceId=i);return}let o={originalRegisterTool:e.registerTool.bind(e),pipeline:t,prefix:n,eventBus:r,workspaceId:i};is(e,o),e.registerTool=(n,r,i)=>{let a=rs(e),s=a?.prefix?`${a.prefix}${n}`:n;if(!i)return a?.originalRegisterTool(s,r);let c=r?.outputSchema;if((a?.pipeline??t).getMiddlewareNames().length===0){let e=as(i,c);return a?.originalRegisterTool(s,r,e)}let l=U(n),u=a??o,d=as(u.pipeline.wrap(n,i,r,l,u.eventBus,u.workspaceId),c);return a?.originalRegisterTool(s,r,d)}}const ss={analyze:1,audit:1,check:2,codemod:2,config:0,delegate:3,digest:1,env:0,eval:2,evidence_map:2,file_summary:1,find:1,flow:3,forge_ground:2,git:1,graph:1,measure:1,onboard:3,parse_output:1,present:1,process:3,produce_knowledge:3,queue:3,reindex:3,rename:2,replay:1,restore:2,scope_map:1,search:1,session:2,status:0,symbol:1,test_run:2,trace:1,web_fetch:1,web_search:1};function cs(e,t){return e.filter(e=>(ss[e]??0)<=t)}const ls=new Set([`status`,`config`]),us={full:{description:`All tools enabled (default)`,includeCategories:[]},safe:{description:`Read-only tools — no file/state modifications`,includeCategories:[`search`,`analysis`,`compression`,`utilities`,`system`,`git`,`flow`],excludeTools:[`reindex`,`onboard`]},research:{description:`Search, analysis, knowledge, and web access`,includeCategories:[`search`,`analysis`,`knowledge`,`compression`,`web`,`system`,`flow`]},minimal:{description:`Essential tools only — search, status, basic operations`,includeCategories:[`search`,`system`],includeTools:[`file_summary`,`check`,`test_run`]},discovery:{description:`Full toolset plus discovery-oriented meta-tools for guided tool exploration`,includeCategories:[],includeTools:[`list_tools`],excludeTools:[`describe_tool`,`search_tools`]}};function ds(e,t){let n=us[e];if(n)return n;let r=t?.[e];if(r)return r;throw Error(`Unknown tool profile: ${e}`)}function fs(e,t,n){return t.includes(`*`)?!0:(n[e]?.category??[]).some(e=>t.includes(e))}function ps(e,t,n,r){if(t.includes(`*`)){for(let t of n)e.add(t);return}for(let i of n)fs(i,t,r)&&e.add(i)}function ms(e,t,n){if(t.includes(`*`)){e.clear();return}for(let r of[...e])fs(r,t,n)&&e.delete(r)}function hs(e,t,n){if(!e||e.length===0||e.includes(`*`))return new Set(t);let r=new Set;return ps(r,e,t,n),r}function gs(e,t){return e===void 0?t:t===void 0?e:Math.min(e,t)}function _s(e,t){for(let n of[...e])t[n]?.annotations?.readOnlyHint===!1&&e.delete(n)}function vs(e,t,n=0,r=[]){if(n>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...r,e].join(` -> `)}`);if(r.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...r,e].join(` -> `)}`);let i=ds(e,t);return gs(i.extends?vs(i.extends,t,n+1,[...r,e]):void 0,i.maxTier)}function ys(e,t,n,r){let i=(e,a,o)=>{if(a>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...o,e].join(` -> `)}`);if(o.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...o,e].join(` -> `)}`);let s=ds(e,r),c=[...o,e],l=s.extends?i(s.extends,a+1,c):hs(s.includeCategories,t,n);s.extends&&s.includeCategories?.length&&ps(l,s.includeCategories,t,n),s.excludeCategories?.length&&ms(l,s.excludeCategories,n);for(let e of s.includeTools??[])l.add(e);for(let e of s.excludeTools??[])l.delete(e);return l},a=i(e,0,[]),o=vs(e,r);if(o!==void 0){let e=cs([...a],o);a.clear();for(let t of e)a.add(t)}for(let e of ls)a.add(e);return e===`safe`&&_s(a,n),a}const bs=new Set([`search`,`analysis`,`knowledge`,`compression`,`forge`,`presentation`,`execution`,`manipulation`,`session`,`git`,`process`,`system`,`meta`,`utilities`,`web`,`queue`,`flow`]);function xs(e,t,n,r){let i=process.env.AIKIT_TOOLSET||e.toolProfile||`full`,a=ys(i,t,n,r);if(e.features&&e.features.length>0){let i=e.features.filter(e=>!bs.has(e));if(i.length>0)throw Error(`Unknown feature group(s): ${i.join(`, `)}. Valid categories: ${[...bs].join(`, `)}`);let o={description:`Synthetic profile from features config`,includeCategories:e.features},s=ys(`_features`,t,n,{...r,_features:o});for(let e of a)!s.has(e)&&!ls.has(e)&&a.delete(e)}if(e.readOnly)for(let e of[...a])n[e]?.annotations?.readOnlyHint===!1&&!ls.has(e)&&a.delete(e);for(let e of ls)a.add(e);return i===`safe`&&_s(a,n),a}const Ss=L.object({mode:L.enum([`wasm`,`regex`,`unknown`]),reason:L.string(),pathsChecked:L.array(L.object({path:L.string(),exists:L.boolean()})),os:L.string(),arch:L.string(),nodeVersion:L.string(),webTreeSitterImportable:L.boolean(),healAttempted:L.boolean(),healSuccess:L.boolean(),healError:L.string().nullable(),initError:L.string().nullable(),wasmDir:L.string().nullable(),grammarCount:L.number()}),Cs=L.object({kind:L.enum([`onboard`,`update_onboard`,`reindex`,`handoff`,`proceed`]),reason:L.string(),command:L.string().optional()}),ws=L.object({title:L.string(),insight:L.string(),confidence:L.number()}),Ts=L.object({lessons:L.array(ws),conventions:L.array(L.object({title:L.string(),preview:L.string()})),checkpoint:L.string().nullable()});L.object({totalRecords:L.number(),totalFiles:L.number(),lastIndexedAt:L.string().nullable(),lastSourceIndexedAt:L.string().nullable().optional(),onboarded:L.boolean(),onboardDir:L.string(),contentTypes:L.record(L.string(),L.number()),wasmAvailable:L.boolean(),wasmDiagnostics:Ss,graphStats:L.object({nodes:L.number(),edges:L.number()}).nullable(),curatedCount:L.number(),serverVersion:L.string(),scaffoldVersion:L.string().nullable(),workspaceScaffoldVersion:L.string().nullable(),upgradeAvailable:L.boolean(),sessionTokens:L.object({callCount:L.number(),totalInputChars:L.number(),totalOutputChars:L.number(),estInputTokens:L.number(),estTotalTokens:L.number(),startTime:L.string()}).optional(),storeBackend:L.string().optional(),storeDiagnostics:L.object({adapterType:L.string(),vectorSearchEnabled:L.boolean(),ftsEnabled:L.boolean(),degradedMode:L.boolean(),dbPath:L.string(),dbSizeBytes:L.number().nullable(),embeddingDim:L.number(),vectorDtype:L.string()}).nullable().optional(),contextPressure:L.number().min(0).max(100).describe(`0–100 score indicating AI Kit saturation`),nextAction:Cs,prelude:Ts.nullable().optional()}).catchall(L.any()),L.object({ok:L.boolean(),checks:L.array(L.object({name:L.string(),ok:L.boolean(),message:L.string().optional()}))});const Es=L.object({summary:L.object({totalFiles:L.number(),totalLines:L.number(),totalCodeLines:L.number(),totalFunctions:L.number(),avgComplexity:L.number(),maxComplexity:L.object({value:L.number(),file:L.string()})}),files:L.array(L.object({path:L.string(),lines:L.number(),code:L.number(),complexity:L.number(),functions:L.number()}))}),Ds=L.object({platform:L.string(),arch:L.string(),nodeVersion:L.string(),cwd:L.string(),cpus:L.number(),memoryFreeGb:L.number(),memoryTotalGb:L.number()});L.object({iso:L.string(),unix:L.number(),timezone:L.string(),formatted:L.string()});const Os=L.object({passed:L.boolean(),errorCount:L.number(),warningCount:L.number(),topErrors:L.array(L.string())}),ks=L.object({passed:L.boolean(),tsc:Os,biome:Os}),As=L.object({name:L.string(),path:L.string(),depth:L.number()}),js=L.object({name:L.string(),definedIn:L.object({path:L.string(),line:L.number(),kind:L.string(),signature:L.string().optional()}).nullable(),importedBy:L.array(L.object({path:L.string(),line:L.number(),importStatement:L.string()})),referencedIn:L.array(L.object({path:L.string(),line:L.number(),context:L.string(),scope:L.string().optional()})),graphContext:L.object({definingModule:L.string().optional(),importedByModules:L.array(L.string()),siblingSymbols:L.array(L.string())}).nullable(),trace:L.object({callers:L.array(As),callees:L.array(As)}).nullable(),confidence:L.number().nullable(),method:L.string().nullable(),rationale:L.string().nullable(),error:L.string().optional()}),Ms=L.object({symbols:L.array(js)}),Ns=L.object({sourcePath:L.string(),contentType:L.string(),score:L.number(),headingPath:L.string().optional(),startLine:L.number().optional(),endLine:L.number().optional(),origin:L.string().optional(),category:L.string().optional(),tags:L.array(L.string()).optional()}),Ps=L.object({results:L.array(Ns),totalResults:L.number(),searchMode:L.string(),query:L.string(),ref:L.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Fs=L.object({path:L.string(),line:L.number().optional(),matchType:L.string(),preview:L.string()}),Is=L.object({matches:L.array(Fs),totalMatches:L.number(),pattern:L.string(),truncated:L.boolean(),ref:L.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Ls=L.object({path:L.string(),relevance:L.number(),estimatedTokens:L.number(),focusLines:L.array(L.string()).optional()}),Rs=L.object({files:L.array(Ls),totalFiles:L.number(),totalEstimatedTokens:L.number(),task:L.string()}),zs=L.object({path:L.string(),impact:L.string(),reason:L.string()}),Bs=L.object({changedFiles:L.array(L.string()),affectedFiles:L.array(zs),totalAffected:L.number(),riskLevel:L.string()}),Vs=L.object({name:L.string(),passed:L.boolean(),message:L.string().optional(),severity:L.string().optional()}),Hs=L.object({passed:L.boolean(),score:L.number(),checks:L.array(Vs),summary:L.string()}),Us=L.object({id:L.string(),name:L.string(),type:L.string(),sourcePath:L.string().optional()}),Ws=L.object({fromId:L.string(),toId:L.string(),fromName:L.string(),toName:L.string(),type:L.string()}),Gs=L.object({id:L.string(),name:L.string(),type:L.string()}),Ks=L.object({id:L.string(),nodeCount:L.number(),types:L.record(L.string(),L.number()),samples:L.array(Gs)}),qs=L.object({nodes:L.array(Us),edges:L.array(Ws),communities:L.array(Ks).optional(),totalNodes:L.number(),totalEdges:L.number(),query:L.string()});L.object({symbols:L.array(L.object({name:L.string(),path:L.string(),line:L.number().optional(),kind:L.string()})),totalDead:L.number()});const Js=L.object({gitRoot:L.string(),branch:L.string(),commitCount:L.number(),hasUncommitted:L.boolean(),recentCommits:L.array(L.object({hash:L.string(),message:L.string(),author:L.string(),date:L.string()}))}),Ys=L.object({sourceId:L.string(),value:L.string()}),Xs=L.object({id:L.string(),originalChars:L.number(),keptChars:L.number(),segmentsKept:L.number(),segmentsTotal:L.number()}),Zs=L.object({text:L.string().describe(`The compressed digest text output`),ref:L.string().optional().describe(`Reusable cache reference`),fields:L.record(L.string(),L.array(Ys)),sourceStats:L.array(Xs),totalOriginalChars:L.number(),totalCompressedChars:L.number(),ratio:L.number()}),Qs=L.object({passed:L.boolean(),totalTests:L.number(),passedTests:L.number(),failedTests:L.number(),skippedTests:L.number(),duration:L.number().describe(`Duration in milliseconds`),failures:L.array(L.object({name:L.string(),message:L.string(),file:L.string().optional()}))}),$s=A(`utils:enrich`);async function G(e,t){let n={curated:[],graph:[]},r=t.limit??3,[i,a]=await Promise.allSettled([ec(e,t.query,r),tc(e,t.filePath)]);return i.status===`fulfilled`?n.curated=i.value:$s.debug(`Curated enrichment failed`,{error:i.reason}),a.status===`fulfilled`?n.graph=a.value:$s.debug(`Graph enrichment failed`,{error:a.reason}),n}async function ec(e,t,n){if(!e.store||!t)return[];try{let r=await e.store.ftsSearch(t,{origin:`curated`,limit:n});if(r.length>0)return r.map(e=>nc(e.record));if(e.embedder){let r=await e.embedder.embedQuery(t);return(await e.store.search(r,{origin:`curated`,limit:n,minScore:.3})).map(e=>nc(e.record))}return[]}catch(e){return $s.debug(`Curated enrichment failed`,{error:e}),[]}}async function tc(e,t){if(!e.graphStore||!t)return[];try{let n=await e.graphStore.findNodes({sourcePath:t,limit:1});if(n.length===0){let r=t.split(/[/\\]/).pop()?.replace(/\.\w+$/,``)||``;if(!r)return[];let i=await e.graphStore.findNodes({namePattern:r,type:`module`,limit:1});if(i.length===0)return[];n.push(i[0])}let r=n[0],i=await e.graphStore.getNeighbors(r.id,{direction:`both`,limit:10}),a=[];for(let e of i.edges){let t=e.fromId===r.id?e.toId:e.fromId,n=i.nodes.find(e=>e.id===t);if(!n)continue;let o=e.fromId===r.id?`->`:`<-`;a.push(`${o} ${e.type}: ${n.name} (${n.type})`)}return a}catch(e){return $s.debug(`Graph enrichment failed`,{error:e}),[]}}function K(e){let t=[];if(e.curated.length>0){t.push(`**Curated Knowledge:**`);for(let n of e.curated)t.push(`- ${n}`)}if(e.graph.length>0){t.push(`**Graph Context:**`);for(let n of e.graph)t.push(`- ${n}`)}return t.length===0?``:`\n\n---\n### Enrichment\n${t.join(`
32
32
  `)}`}function nc(e){let t=rc(e.metadata,`title`)||e.sourcePath||`Untitled`;return`[${rc(e.metadata,`category`)}] ${t}: ${e.content.slice(0,200)}`}function rc(e,t){let n=e?.[t];return typeof n==`string`?n:``}function q(e,t,n){return{content:[{type:`text`,text:`[ERROR:${e}] ${t}`}],isError:!0,...n==null?{}:{structuredContent:n}}}function J(e,t){return async(n,r)=>{let i=Date.now(),a=await t(n,r),o=Date.now()-i;return a._meta={...a._meta??{},durationMs:o,toolName:e},a}}const ic=A(`tools`),ac=L.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`);function oc(e,t){return t?Bn(e,t):e}function sc(){let e=[];return ar.get()||e.push(`Tree-sitter unavailable — using regex fallback, symbol/pattern confidence reduced`),e.length===0?``:`\n\n> **⚠ Caveats:** ${e.join(`; `)}`}function cc(e){return(e??[]).map(e=>{if(typeof e==`string`)return e;if(e&&typeof e==`object`&&`path`in e)return typeof e.path==`string`?e.path:void 0}).filter(e=>!!e)}function lc(e){let t=[],n=e.filter(e=>/\.(ts|tsx|js|jsx)$/.test(e)&&/(service|store|model|schema|migration)/i.test(e)),r=e.filter(e=>/\.(ts|tsx|js|jsx)$/.test(e)&&!n.includes(e)),i=e.filter(e=>!/\.(ts|tsx|js|jsx)$/.test(e));return(n.length>0||r.length>0||i.length>0)&&(t.push(`
33
33
 
34
34
  ### Risk Assessment`),n.length>0&&t.push(`- 🔴 **High risk** (${n.length}): ${n.slice(0,5).map(e=>`\`${e}\``).join(`, `)}`),r.length>0&&t.push(`- 🟡 **Medium risk** (${r.length}): source files`),i.length>0&&t.push(`- 🟢 **Low risk** (${i.length}): non-source files`)),t.join(`
@@ -3047,14 +3047,14 @@ Use \`status({})\` to check smart indexing queue status.`}]};let u=Lc(l).createT
3047
3047
  `)}\n\nNo violations detected.`;let n=e.violations.map(e=>`- ${e.ruleId} | ${e.tool} | ${e.timestamp}\n ${e.rule}\n Suggestion: ${e.suggestion}`);return`${t.join(`
3048
3048
  `)}\n\nViolations:\n${n.join(`
3049
3049
  `)}`}function z_(e){let t=[e.id,`Label: ${e.label}`,`Created: ${e.createdAt}`];return e.notes&&t.push(`Notes: ${e.notes}`),t.push(``,`Data:`,JSON.stringify(e.data)),t.join(`
3050
- `)}function B_(e){let t=e.trim();if(!t)return``;try{return JSON.parse(t)}catch{return e}}function V_(e){let t=e?.trim();if(!t)return{};let n;try{n=JSON.parse(t)}catch{throw Error(`data must be a valid JSON object string`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`data must be a JSON object string`);return n}let H_={totalInputChars:0,totalOutputChars:0,callCount:0,startTime:new Date().toISOString()};function U_(){return{...H_}}const W_=new Map,G_=[];function K_(){return Array.from(W_.entries()).map(([e,t])=>({tool:e,...t}))}function q_(){return G_}A(`auto-gc`);function J_(){let e=[...q_()];if(e.length<10)return 0;e.sort((e,t)=>e-t);let t=Math.floor(e.length*.95);return e[Math.min(t,e.length-1)]}function Y_(){return{state:`warming`,p95:J_(),lastGcAt:null,gcCount:0,bufferSize:q_().length}}function X_(e){if(!e||!Ie(e))return;let t=I(e);if(Pe(t)!==fe.onboard)return;let n=Fe(t);if(Pe(Fe(n))===de.workspaces)return xn(n)}function Z_(e){let t=[];if(e?.skillDir)t.push(e.skillDir);else if(e?.onboardDir){let n=X_(e.onboardDir);n&&t.push(n)}return t}function Q_(e){return Z_(e)[0]}const $_=A(`tools`),ev=14400*1e3,tv={includePrelude:L.boolean().default(!1).describe(`Include session prelude with top lessons, conventions, and last checkpoint`)};function nv(e,t,n,r=15e3){let i,a=new Promise(e=>{i=setTimeout(()=>{$_.warn(`Status sub-operation "${n}" timed out after ${r}ms`),e({value:t,timedOut:!0})},r)});return Promise.race([e.then(e=>(clearTimeout(i),{value:e,timedOut:!1}),e=>(clearTimeout(i),$_.warn(`Status sub-operation "${n}" failed: ${e instanceof Error?e.message:String(e)}`),{value:t,timedOut:!1})),a])}function rv(e){return e.onboarded?e.onboardFreshness===`stale`||e.onboardFreshness===`unknown`?{kind:`update_onboard`,reason:`Onboard context is not fresh. Run onboard({ path: ".", update: true }) before relying on package map or architecture context.`,command:`onboard({ path: ".", update: true })`}:e.indexStale?{kind:`reindex`,reason:`Index stale. Run reindex() to update.`}:e.contextPressure>70?{kind:`handoff`,reason:`Context pressure high. Consider session handoff.`}:{kind:`proceed`,reason:`Ready to work.`}:{kind:`onboard`,reason:`Index not initialized. Run onboard({ path: "." }) first.`}}function iv(){let e=ar.get(),t=ir.get();if(e)return`- **Tree-sitter (WASM)**: ✅ Available (${t.grammarCount} grammars, dir: ${t.wasmDir})`;let n=t.pathsChecked.length?t.pathsChecked.map(e=>` ${e.exists?`✓`:`✗`} ${e.path}`).join(`
3050
+ `)}function B_(e){let t=e.trim();if(!t)return``;try{return JSON.parse(t)}catch{return e}}function V_(e){let t=e?.trim();if(!t)return{};let n;try{n=JSON.parse(t)}catch{throw Error(`data must be a valid JSON object string`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`data must be a JSON object string`);return n}let H_={totalInputChars:0,totalOutputChars:0,callCount:0,startTime:new Date().toISOString()};function U_(){return{...H_}}const W_=new Map,G_=[];function K_(){return Array.from(W_.entries()).map(([e,t])=>({tool:e,...t}))}function q_(){return G_}A(`auto-gc`);function J_(){let e=[...q_()];if(e.length<10)return 0;e.sort((e,t)=>e-t);let t=Math.floor(e.length*.95);return e[Math.min(t,e.length-1)]}function Y_(){return{state:`warming`,p95:J_(),lastGcAt:null,gcCount:0,bufferSize:q_().length}}function X_(e){if(!e||!Ie(e))return;let t=I(e);if(Pe(t)!==fe.onboard)return;let n=Fe(t);if(Pe(Fe(n))===de.workspaces)return xn(n)}function Z_(e){let t=[];if(e?.skillDir)t.push(e.skillDir);else if(e?.onboardDir){let n=X_(e.onboardDir);n&&t.push(n)}return t}function Q_(e){return Z_(e)[0]}const $_=A(`tools`),ev=14400*1e3,tv={includePrelude:L.boolean().default(!1).describe(`Include session prelude with top lessons, conventions, and last checkpoint`)};function nv(e,t,n,r=15e3){let i,a=new Promise(e=>{i=setTimeout(()=>{$_.warn(`Status sub-operation "${n}" timed out after ${r}ms`),e({value:t,timedOut:!0})},r)});return Promise.race([e.then(e=>(clearTimeout(i),{value:e,timedOut:!1}),e=>(clearTimeout(i),$_.warn(`Status sub-operation "${n}" failed: ${e instanceof Error?e.message:String(e)}`),{value:t,timedOut:!1})),a])}function rv(e){return e.onboarded?e.onboardFreshness===`stale`||e.onboardFreshness===`unknown`?{kind:`update_onboard`,reason:`Onboard context is not fresh. Run onboard({ path: ".", update: true }) before relying on package map or architecture context.`,command:`onboard({ path: ".", update: true })`}:e.indexStale?{kind:`reindex`,reason:`Index stale. Run reindex() to update.`}:e.contextPressure>70?{kind:`handoff`,reason:`Context pressure high. Consider session handoff.`}:{kind:`proceed`,reason:`Ready to work.`}:{kind:`onboard`,reason:`Index not initialized. Run onboard({ path: "." }) first.`}}function iv(e){return e.lastSourceIndexedAt??e.lastIndexedAt??null}function av(){let e=ar.get(),t=ir.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(`
3051
3051
  `):` 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(`
3052
- `)}const av=5*6e4;let ov=null,sv=null;function cv(e,t,n,r){let i=Math.min(e/2e4,1),a=Math.min((t+n)/5e4,1),o=Math.min(r/200,1);return Math.round(i*40+a*35+o*25)}function lv(){let e=Date.now();if(ov&&e-ov.ts<av)return ov.value;try{let t=I(Gn(),`.copilot`,`.aikit-scaffold.json`);if(!N(t))return ov={value:null,ts:e},null;let n=JSON.parse(P(t,`utf-8`)).version??null;return ov={value:n,ts:e},n}catch{return ov={value:null,ts:e},null}}function uv(){let e=Date.now();if(sv&&e-sv.ts<av)return sv.value;try{let t=I(process.cwd(),`.github`,`.aikit-scaffold.json`);if(!N(t))return sv={value:null,ts:e},null;let n=JSON.parse(P(t,`utf-8`)).version??null;return sv={value:n,ts:e},n}catch{return sv={value:null,ts:e},null}}function dv(e){let t=U(`status`);e.registerTool(`status`,{title:t.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:tv,annotations:t.annotations},J(`status`,async()=>{let e=S(),t=lv(),n=uv(),r=t!=null&&t!==e,i=n!=null&&n!==e,a=[`## AI Kit Status`,``,`⏳ **AI Kit is initializing** — index stats will be available shortly.`,``,`### Runtime`,`- **Tree-sitter (WASM)**: ${ar.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=O(),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`?(te(),a.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${e} ≠ ${c}`,`- Error: ${o.error??`unknown`}`)):(te(),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:!!ar.get(),wasmDiagnostics:ir.get(),graphStats:null,curatedCount:0,serverVersion:e,scaffoldVersion:t??null,workspaceScaffoldVersion:n??null,upgradeAvailable:r||i,contextPressure:0,nextAction:rv({onboarded:!1,indexStale:!1,contextPressure:0})};return{content:[{type:`text`,text:a.join(`
3053
- `)}],structuredContent:o}}))}function fv(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){let g=U(`status`);e.registerTool(`status`,{title:g.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:tv,annotations:g.annotations},J(`status`,async({includePrelude:e=!1})=>{let g=[];try{let[_,v]=await Promise.all([nv(t.getStats(),{totalRecords:0,totalFiles:0,lastIndexedAt:null,contentTypeBreakdown:{}},`store.getStats`),nv(t.listSourcePaths(),[],`store.listSourcePaths`)]),y=_.value;_.timedOut&&g.push(`⚠ Index stats timed out — values may be incomplete`);let b=v.value;v.timedOut&&g.push(`⚠ File listing timed out`);let x=b.filter(e=>!e.startsWith(`.ai/curated/context/auto-`)&&!e.startsWith(`.ai/curated/workflow/auto-`)&&!e.includes(`node_modules/`)&&!e.startsWith(`.git/`)),C=b.length-x.length,w=null,T=0,D=[`## AI Kit Status`,``,`- **Total Records**: ${y.totalRecords}`,`- **Total Files**: ${y.totalFiles}`,`- **Last Indexed**: ${y.lastIndexedAt??`Never`}`,``,`### Content Types`,...Object.entries(y.contentTypeBreakdown).map(([e,t])=>`- ${e}: ${t}`),``,`### Indexed Files`,...x.slice(0,50).map(e=>`- ${e}`),x.length>50?`\n... and ${x.length-50} more files`:``,C>0?`\n_(${C} internal/auto-curated files hidden — use \`find\` to explore them)_`:``];if(n)try{let e=await nv(n.getStats(),{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}},`graphStore.getStats`);if(e.timedOut)g.push(`⚠ Graph stats timed out`),D.push(``,`### Knowledge Graph`,`- Graph stats timed out`);else{let t=e.value;w={nodes:t.nodeCount,edges:t.edgeCount},D.push(``,`### Knowledge Graph`,`- **Nodes**: ${t.nodeCount}`,`- **Edges**: ${t.edgeCount}`,...Object.entries(t.nodeTypes).map(([e,t])=>` - ${e}: ${t}`));try{let e=await nv(n.validate(),{valid:!0,danglingEdges:[],orphanNodes:[],stats:{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}}},`graphStore.validate`);if(!e.timedOut){let t=e.value;t.valid||D.push(`- **⚠ Integrity Issues**: ${t.danglingEdges.length} dangling edges`),t.orphanNodes.length>0&&D.push(`- **Orphan nodes**: ${t.orphanNodes.length}`)}}catch{}}}catch{D.push(``,`### Knowledge Graph`,`- Graph store unavailable`)}let ee=a?.onboardDir??``,ne=N(ee),re=i?.onboardComplete||ne,k=ie(ee,{lastIndexedAt:y.lastIndexedAt??null});if(D.push(``,`### Onboard Status`,re?`- ✅ Complete${i?.onboardTimestamp?` (last: ${i.onboardTimestamp})`:``}`:'- ❌ Not run — call `onboard({ path: "." })` to analyze the codebase',`- **Onboard Directory**: \`${ee}\``),k){let e=k.packageMap.totalPackages,t=k.freshness.status===`fresh`?`✅`:k.freshness.status===`stale`?`⚠`:`❔`;D.push(`- **Onboard context**: ${k.readInstruction}`,`- **Onboard freshness**: ${t} ${k.freshness.status} (${k.freshness.reason})`,e>0?`- **Package map**: ${e} packages/containers in \`${k.packageMap.sourcePath}\``:"- **Package map**: read `structure.md` and `dependencies.md` from the onboard directory")}if(r)try{let e=await nv(r.count(),0,`curated.count`);e.timedOut?(g.push(`⚠ Curated knowledge count timed out`),D.push(``,`### Curated Knowledge`,`- Listing timed out`)):(T=e.value,D.push(``,`### Curated Knowledge`,T>0?`- ${T} entries`:'- Empty — use `knowledge({ action: "remember", ... })` to persist decisions'))}catch{D.push(``,`### Curated Knowledge`,`- Unable to read curated entries`)}let ae=Hn().filter(e=>e.status===`watching`);if(ae.length>0){D.push(``,`### File Watchers`,`- **Active**: ${ae.length}`);for(let e of ae){let t=e.pendingFiles?.length??0;if(D.push(` - \`${e.path}\`: ${e.eventCount} events, ${t} pending files`),t>0&&t<=10)for(let t of e.pendingFiles)D.push(` - \`${t}\``);else t>10&&D.push(` - ${t} pending files (use \`watch({ action: 'list' })\` for details)`)}}let oe=cv(y.totalRecords,w?.nodes??0,w?.edges??0,T),se=y.lastIndexedAt?new Date(y.lastIndexedAt).getTime():0,ce=se>0?Date.now()-se:1/0,le=re&&ce>1440*60*1e3,ue=rv({onboarded:re,onboardFreshness:k?.freshness.status??null,indexStale:le,contextPressure:oe});D.push(``),D.push(`## 📊 Context Pressure: ${oe}/100`),oe>=80?D.push(`⚠️ High pressure — consider pruning stale entries or compacting context.`):oe>=50?D.push(`ℹ️ Moderate pressure — AI Kit memory is well-populated.`):D.push(`✅ Low pressure — plenty of headroom for more content.`);let de=0;if(y.lastIndexedAt){de=new Date(y.lastIndexedAt).getTime();let e=(Date.now()-de)/(1e3*60*60);D.push(``,`### Index Freshness`,e>24?o===`smart`?`- ⚠ Last indexed ${Math.floor(e)}h ago — smart indexing will refresh automatically`:`- ⚠ Last indexed ${Math.floor(e)}h ago — may be stale. Run \`reindex({})\``:`- ✅ Last indexed ${e<1?`less than 1h`:`${Math.floor(e)}h`} ago`)}D.push(``,`### Next Action`,`- **${ue.kind}**: ${ue.reason}`);let fe=null,pe=t;if(typeof pe.getDiagnostics==`function`)try{let e=pe.getDiagnostics();fe={adapterType:e.adapterType,vectorSearchEnabled:e.vectorSearchEnabled,ftsEnabled:e.ftsEnabled,degradedMode:e.degradedMode,dbPath:e.dbPath,dbSizeBytes:e.dbSizeBytes,embeddingDim:e.embeddingDim,vectorDtype:e.vectorDtype},D.push(``,`### Storage`,`- **Backend**: ${a?.store?.backend??`unknown`}`,`- **Adapter**: ${fe.adapterType}`,`- **Vector search**: ${fe.vectorSearchEnabled?`✅ enabled`:`⚠ disabled (FTS-only fallback)`}`,fe.dbPath?`- **DB**: ${fe.dbPath}`:``,fe.dbSizeBytes==null?``:`- **DB size**: ${(fe.dbSizeBytes/1024/1024).toFixed(2)} MB`,`- **Embedding dim**: ${fe.embeddingDim}`,`- **Vector dtype**: ${fe.vectorDtype}`)}catch{}if(o===`smart`)if(D.push(``,`### Smart Indexing`),s){let e=s();e?D.push(`- **Mode**: Smart (trickle)`,`- **Status**: ${e.running?`✅ Running`:`⏸ Stopped`}`,`- **Queue**: ${e.queueSize} files pending`,`- **Changed files**: ${e.changedFilesSize} detected`,`- **Interval**: ${Math.round(e.intervalMs/1e3)}s per batch of ${e.batchSize}`):D.push(`- **Mode**: Smart (trickle)`,`- **Status**: scheduler state unavailable (init may have failed)`)}else D.push(`- **Mode**: Smart (trickle) — scheduler state unavailable`);if(h)try{let e=h.getReport(),t=h.checkThresholds(),n=Object.entries(e.counters),r=Object.entries(e.gauges);if(n.length>0||r.length>0||t.length>0){if(D.push(``,`### 📊 Metrics`),n.length>0){D.push(`**Counters:**`);for(let[e,t]of n)D.push(`- \`${e}\`: ${t}`)}if(r.length>0){D.push(`**Gauges:**`);for(let[e,t]of r)D.push(`- \`${e}\`: ${t}`)}if(t.length>0){D.push(`**⚠ Threshold violations:**`);for(let e of t)D.push(`- ${e}`)}else(n.length>0||r.length>0)&&D.push(`- ✅ All thresholds within limits`)}}catch{D.push(``,`### 📊 Metrics`,`- Metrics unavailable`)}{let e=[];if(u)try{let t=u.getStats();e.push(`- **Decision Hooks**: ${t.count} registered${t.hooks.length>0?` (IDs: ${t.hooks.map(e=>e.id).join(`, `)})`:``}`)}catch{e.push(`- **Decision Hooks**: unavailable`)}else e.push(`- **Decision Hooks**: not configured`);if(d)try{let t=d.getStats(),n=Object.entries(t.byTool).map(([e,t])=>`${e}=${t}`).join(`, `);e.push(`- **Observations**: ${t.totalObservations} total, byTool: ${n||`none`}`)}catch{e.push(`- **Observations**: unavailable`)}else e.push(`- **Observations**: not configured`);if(f)try{let t=f.getStats(),n=Object.keys(t.byName);e.push(`- **Extractors**: ${t.count} registered${n.length>0?` (IDs: ${n.join(`, `)})`:``}`)}catch{e.push(`- **Extractors**: unavailable`)}else e.push(`- **Extractors**: not configured`);if(m)try{let t=m.getStats(),n=t.skillExists?t.isStale?`⚠ Stale`:`✅ Fresh`:`❌ No skill`;e.push(`- **Skill Compiler**: ${n}, version: ${t.skillVersion}, last compiled: ${t.lastCompiledAt?new Date(t.lastCompiledAt).toLocaleString():`Never`}`)}catch{e.push(`- **Skill Compiler**: unavailable`)}else e.push(`- **Skill Compiler**: not configured`);if(p)try{let t=p.getStats();e.push(`- **Promotion Engine**: ${t.held} candidates held, ${t.promoted} promoted, ${t.observedFacts} distinct facts tracked`)}catch{e.push(`- **Promotion Engine**: unavailable`)}else e.push(`- **Promotion Engine**: not configured`);D.push(``,`### 🧩 Feature Coverage`,...e)}let ge=0;{try{let e=a?.stateDir?F(a.stateDir,`stash`):null;if(e&&N(e)){let t=je(e).mtimeMs;t>de&&(de=t)}}catch{}let e=[];if(r)try{let t=T>0?await r.list({limit:5,orderBy:`updated`,order:`desc`}):[];for(let e of t){let t=new Date(e.updated||e.created).getTime();t>de&&(de=t)}e.push(...t)}catch{}if(ge=de>0?Date.now()-de:0,ge>=ev){let t=Math.floor(ge/36e5);if(D.push(``,`### 🌅 Session Briefing`,`_${t}+ hours since last activity — here's what to pick up:_`,``),e.length>0){D.push(`**Recent decisions/notes:**`);for(let t of e)D.push(`- **${t.title}** (${t.category??`note`}) — ${(t.contentPreview??``).slice(0,80)}…`)}D.push(``,`**Suggested next steps:**`,'- `search({ query: "SESSION CHECKPOINT", origin: "curated" })` — find your last checkpoint',"- `restore({})` — resume from a saved checkpoint",'- `knowledge({ action: "list" })` — browse all stored knowledge')}}D.push(``,`### Runtime`,iv());let _e=he.instance().getAll(),ve=_e.filter(e=>e.status!==`healthy`);if(ve.length>0){D.push(``,`### ⚠️ Subsystem Health`);for(let e of ve){let t=Math.round((Date.now()-e.since)/1e3);D.push(`- **${e.name}**: ${e.status} (${t}s ago${e.reason?` — ${e.reason}`:``})`)}}else _e.length>0&&D.push(``,`### ✅ Subsystem Health`,`- All ${_e.length} subsystems healthy`);let ye=me.getAll();if(ye.size>0){D.push(``,`### 🔌 Circuit Breakers`);for(let[e,t]of ye){let n=t.getState(),r=`- **${e}**: ${n===`closed`?`🟢`:n===`open`?`🔴`:`🟡`} ${n}`;if(n===`open`){let e=t.remainingCooldownMs();r+=` (recovery in ${Math.ceil(e/1e3)}s)`}D.push(r)}}let A=lv(),be=uv(),xe=S(),Se=A!=null&&A!==xe,Ce=be!=null&&be!==xe;if(Se||Ce){let e=O(),t=[];Se&&t.push(`user scaffold v${A}`),Ce&&t.push(`workspace scaffold v${be}`);let n=t.join(`, `);e.state===`success`?D.push(``,`### ✅ Upgrade Applied`,`- Server v${xe} — ${n} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):e.state===`pending`?D.push(``,`### ⏳ Upgrade In Progress`,`- Server v${xe} ≠ ${n}`,`- Auto-upgrade is running in the background…`):e.state===`failed`?(te(),D.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${xe} ≠ ${n}`,`- Error: ${e.error??`unknown`}`)):(te(),D.push(``,`### ⬆ Upgrade Available`,`- Server v${xe} ≠ ${n}`,`- Auto-upgrade triggered — check again shortly.`))}g.length>0&&D.push(``,`### ⚠ Warnings`,...g.map(e=>`- ${e}`));let we=K_();if(we.length>0){let e=we.sort((e,t)=>t.callCount-e.callCount);D.push(``,`### Tool Usage This Session`,``),D.push(`| Tool | Calls | Tokens In | Tokens Out | Errors | Avg Latency |`),D.push(`|------|-------|-----------|------------|--------|-------------|`);for(let t of e.slice(0,15)){let e=Math.round(t.totalInputChars/4),n=Math.round(t.totalOutputChars/4),r=Math.round(t.totalDurationMs/t.callCount);D.push(`| ${t.tool} | ${t.callCount} | ${e.toLocaleString()} | ${n.toLocaleString()} | ${t.errorCount} | ${r}ms |`)}}let j=U_();j.callCount>0&&(D.push(``),D.push(`### Session Token Usage`),D.push(`- Tool calls: ${j.callCount}`),D.push(`- Input chars: ${j.totalInputChars.toLocaleString()}`),D.push(`- Output chars: ${j.totalOutputChars.toLocaleString()}`),D.push(`- Est. input tokens: ${Math.round(j.totalInputChars/4).toLocaleString()}`),D.push(`- Est. total tokens: ${Math.round((j.totalInputChars+j.totalOutputChars)/4).toLocaleString()}`));let Te=Y_();if(Te.bufferSize>=10){let e=Te.state===`healthy`?`🟢`:Te.state===`degraded`?`🔴`:`🟡`;D.push(``,`### Auto-GC: ${e} ${Te.state}`),D.push(`- p95 latency: ${Te.p95}ms | buffer: ${Te.bufferSize} samples`),Te.gcCount>0&&D.push(`- GC cycles triggered: ${Te.gcCount}`)}if(l){let e=l.getStats();if(e.totalSubscribers>0){D.push(``,`### 🔌 Hooks (EventBus Subscribers)`),D.push(`- Total subscribers: ${e.totalSubscribers}`);for(let[t,n]of Object.entries(e.byEvent))D.push(` - ${t}: ${n} subscriber(s)`);for(let t of e.subscriptions)D.push(` - ${t.name} (${t.eventType}, ${t.policy})`);if(e.autoDisabled.length>0){D.push(``),D.push(` **Auto-disabled subscribers:**`);for(let t of e.autoDisabled)D.push(` - ${t.name} (${t.id}): ${t.reason}`)}}}if(u&&u.size>0){let e=u.getStats();D.push(``,`### 🪝 Decision Hooks`),D.push(`- Total hooks: ${e.count}`);for(let t of e.hooks){let e=t.decisionTypes.join(`, `);D.push(` - ${t.id} (order=${t.order}, policy=${t.failurePolicy}, types=[${e}])`)}}if(d){let e=d.getStats();D.push(``,`### 👁 Observations`),D.push(`- Total observations: ${e.totalObservations}`),D.push(` - Success: ${e.byError.success}, Error: ${e.byError.error}`),D.push(` - Artifacts stored: ${e.artifactCount}`),D.push(` - Truncations: ${e.truncationCount}`),D.push(` - Store entries: ${e.storeSize}`);let t=Object.entries(e.byOrigin);t.length>0&&D.push(` - By origin: ${t.map(([e,t])=>`${e}=${t}`).join(`, `)}`)}if(f){let e=f.getStats();D.push(``,`### 🧩 Extractors`),D.push(`- Total extractors: ${e.count}`);for(let[t,n]of Object.entries(e.byName))D.push(` - ${t} (${n.tools} tool(s), maxFacts: ${n.maxFactsPerEvent??`default`})`)}if(p){let e=p.getStats();if(D.push(``,`### 🏆 Promotion Engine`),D.push(`- Total evaluated: ${e.totalEvaluated}`),D.push(`- Promoted: ${e.promoted}`),D.push(`- Held: ${e.held}`),D.push(`- Rejected: ${e.rejected}`),D.push(`- Superseded: ${e.superseded}`),D.push(`- Decayed: ${e.decayed}`),D.push(`- Distinct facts tracked: ${e.observedFacts}`),e.recentDecisions.length>0){D.push(` Recent decisions:`);for(let t of e.recentDecisions.slice(-5))D.push(` - ${t.decision.status}: "${t.factTitle}" (${t.decision.reason.slice(0,80)})`)}}if(m){let e=m.getStats();if(D.push(``,`### 📋 Workspace Skill`),D.push(`- **Skill exists**: ${e.skillExists?`✅`:`❌`}`),D.push(`- **Stale**: ${e.isStale?`⚠ Yes — regenerating on next trigger`:`✅ Fresh`}`),D.push(`- **Last compiled**: ${e.lastCompiledAt?new Date(e.lastCompiledAt).toLocaleString():`Never`}`),D.push(`- **Version**: ${e.skillVersion}`),D.push(`- **Total compiles**: ${e.totalCompiles}`),e.failedCompiles>0&&D.push(`- **Failed compiles**: ${e.failedCompiles}`),e.skillSize>0&&D.push(`- **Skill size**: ${e.skillSize} bytes`),e.isCompiling&&D.push(`- ⏳ **Currently compiling**`),e.pendingRegeneration&&D.push(`- ⏳ **Regeneration pending**`),e.skillQuality&&D.push(`- **Quality**: ${e.skillQuality}`),e.skillQualityErrors&&e.skillQualityErrors.length>0){D.push(`- **Quality errors (${e.skillQualityErrors.length})**:`);for(let t of e.skillQualityErrors.slice(0,3))D.push(` - ${t}`)}if(e.skillQualityWarnings&&e.skillQualityWarnings.length>0){D.push(`- **Quality warnings (${e.skillQualityWarnings.length})**:`);for(let t of e.skillQualityWarnings.slice(0,3))D.push(` - ${t}`)}let t=m?.getWarnings()??[];if(t.length>0){D.push(`- **Compiler warnings (${t.length})**:`);for(let e of t.slice(0,5))D.push(` - ${e}`);t.length>5&&D.push(` - ... and ${t.length-5} more`)}D.push(``," Read `aikit://skill/SKILL.md` to load full workspace context.")}{let e=Nt();(e.cacheSize>0||e.refReuseCount>0)&&(D.push(``,`### 🔄 Ref Reuse`),D.push(`- **Refs stored**: ${e.refStoreCount}`),D.push(`- **Refs reused**: ${e.refReuseCount}`),e.refStaleCount>0&&D.push(`- **⚠ Stale refs detected**: ${e.refStaleCount}`),D.push(`- **Cache entries**: ${e.cacheSize}`))}let M=D.join(`
3054
- `),Ee=ge>=ev,De=Z_(a),P=e||Ee?await E(r,c,void 0,De.length>0?De:void 0,k):void 0,Oe=ae.length>0?ae.map(e=>({id:e.id,path:e.path,eventCount:e.eventCount,pendingFiles:e.pendingFiles??[]})):void 0,ke={totalRecords:y.totalRecords,totalFiles:y.totalFiles,lastIndexedAt:y.lastIndexedAt??null,onboarded:re,onboardDir:ee,onboard_context:k,contentTypes:y.contentTypeBreakdown,wasmAvailable:!!ar.get(),wasmDiagnostics:ir.get(),graphStats:w,curatedCount:T,serverVersion:xe,scaffoldVersion:A??null,workspaceScaffoldVersion:be??null,upgradeAvailable:Se||Ce,storeBackend:a?.store?.backend,storeDiagnostics:fe??null,contextPressure:oe,nextAction:ue,workspace_skill:(()=>{if(!m)return null;try{let e=m.getStats(),t=m?.getWarnings()??[],n=e.skillExists?e.skillQuality??`fallback`:`fallback`;return{exists:e.skillExists,version:e.skillVersion,fresh:!e.isStale,quality:n,warnings:t,uri:`aikit://skill/SKILL.md`,path:e.skillPath,read_instruction:`Read aikit://skill/SKILL.md before working in this repo for full workspace context.`,last_updated:e.lastCompiledAt?new Date(e.lastCompiledAt).toISOString():null,size:e.skillSize}}catch{return null}})(),skill_warnings:m?.getWarnings(m?.resolveActiveFlowSlug()??void 0)??[],watchers:Oe,sessionTokens:{callCount:j.callCount,totalInputChars:j.totalInputChars,totalOutputChars:j.totalOutputChars,estInputTokens:Math.round(j.totalInputChars/4),estTotalTokens:Math.round((j.totalInputChars+j.totalOutputChars)/4),startTime:j.startTime},...P===void 0?{}:{prelude:P}};return{content:[{type:`text`,text:M+(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:ke}}catch(e){return $_.error(`Status failed`,M(e)),q(`INTERNAL`,`Status check failed: ${e instanceof Error?e.message:String(e)}`)}}))}const pv=A(`tools`);function mv(e){return e instanceof Error?(`code`in e?e.code:void 0)===`ENOENT`||e.message.startsWith(`File not found:`)||e.message.startsWith(`Path not found:`):!1}function hv(e){let t=U(`web_search`);e.registerTool(`web_search`,{title:t.title,description:`PREFERRED web search — fans out to multiple keyless providers (DuckDuckGo + Bing-HTML + Mojeek) by default, returning a deduplicated, consensus-ranked union within a 10s deadline. Optional providers (SearXNG, Google, Brave, Bing API) join the fan-out automatically when their env vars are set. Pass one query or multiple for parallel searching.`,inputSchema:{queries:L.array(L.string().max(2e3)).min(1).max(5).describe('Search queries (1–5). Single: `["react hooks"]`. Multiple searched in parallel.'),limit:L.number().min(1).max(20).default(5).describe(`Max results per query`),site:L.string().optional().describe(`Restrict to domain (e.g., "docs.aws.amazon.com")`),provider:L.enum([`multi`,`duckduckgo`,`bing-html`,`mojeek`,`searxng`,`google`,`brave`,`bing`]).optional().describe("Search provider. Defaults to env AIKIT_SEARCH_PROVIDER, then `multi` (fan-out). Single keyless: `duckduckgo`, `bing-html`, `mojeek`. Self-hosted: `searxng` (requires SEARXNG_URL). Keyed APIs: `google` (GOOGLE_API_KEY+GOOGLE_CSE_ID), `brave` (BRAVE_API_KEY), `bing` (BING_API_KEY). Missing keys auto-fall back to duckduckgo.")},annotations:t.annotations},J(`web_search`,async({queries:e,limit:t,site:n,provider:r})=>{let i=e,a=async e=>{let i=await Wn({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(`
3055
- `)};if(i.length===1)try{return{content:[{type:`text`,text:`${await a(i[0])}\n---\n_Next: Use \`web_fetch\` to read any of these pages in full._`}]}}catch(e){return pv.error(`Web search failed`,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);pv.error(`Web search failed`,{query:i[e],error:n}),s.push(`## ❌ Search failed: ${i[e]}\n\n${n}`)}}let l=`_Searched ${o.length-c}/${o.length} queries successfully._`;s.push(``,`---`,l,"_Next: Use `web_fetch` to read any of these pages in full._");let u=s.join(`
3052
+ `)}const ov=5*6e4;let sv=null,cv=null;function lv(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 uv(){let e=Date.now();if(sv&&e-sv.ts<ov)return sv.value;try{let t=I(Gn(),`.copilot`,`.aikit-scaffold.json`);if(!N(t))return sv={value:null,ts:e},null;let n=JSON.parse(P(t,`utf-8`)).version??null;return sv={value:n,ts:e},n}catch{return sv={value:null,ts:e},null}}function dv(){let e=Date.now();if(cv&&e-cv.ts<ov)return cv.value;try{let t=I(process.cwd(),`.github`,`.aikit-scaffold.json`);if(!N(t))return cv={value:null,ts:e},null;let n=JSON.parse(P(t,`utf-8`)).version??null;return cv={value:n,ts:e},n}catch{return cv={value:null,ts:e},null}}function fv(e){let t=U(`status`);e.registerTool(`status`,{title:t.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:tv,annotations:t.annotations},J(`status`,async()=>{let e=S(),t=uv(),n=dv(),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)**: ${ar.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=O(),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`?(te(),a.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${e} ≠ ${c}`,`- Error: ${o.error??`unknown`}`)):(te(),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:!!ar.get(),wasmDiagnostics:ir.get(),graphStats:null,curatedCount:0,serverVersion:e,scaffoldVersion:t??null,workspaceScaffoldVersion:n??null,upgradeAvailable:r||i,contextPressure:0,nextAction:rv({onboarded:!1,indexStale:!1,contextPressure:0})};return{content:[{type:`text`,text:a.join(`
3053
+ `)}],structuredContent:o}}))}function pv(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){let g=U(`status`);e.registerTool(`status`,{title:g.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:tv,annotations:g.annotations},J(`status`,async({includePrelude:e=!1})=>{let g=[];try{let[_,v]=await Promise.all([nv(t.getStats(),{totalRecords:0,totalFiles:0,lastIndexedAt:null,lastSourceIndexedAt:null,contentTypeBreakdown:{},storeBackend:`unknown`,embeddingModel:`unknown`},`store.getStats`),nv(t.listSourcePaths(),[],`store.listSourcePaths`)]),y=_.value;_.timedOut&&g.push(`⚠ Index stats timed out — values may be incomplete`);let b=v.value;v.timedOut&&g.push(`⚠ File listing timed out`);let x=b.filter(e=>!e.startsWith(`.ai/curated/context/auto-`)&&!e.startsWith(`.ai/curated/workflow/auto-`)&&!e.includes(`node_modules/`)&&!e.startsWith(`.git/`)),C=b.length-x.length,w=null,T=0,D=[`## AI Kit Status`,``,`- **Total Records**: ${y.totalRecords}`,`- **Total Files**: ${y.totalFiles}`,`- **Last Indexed**: ${y.lastIndexedAt??`Never`}`,``,`### Content Types`,...Object.entries(y.contentTypeBreakdown).map(([e,t])=>`- ${e}: ${t}`),``,`### Indexed Files`,...x.slice(0,50).map(e=>`- ${e}`),x.length>50?`\n... and ${x.length-50} more files`:``,C>0?`\n_(${C} internal/auto-curated files hidden — use \`find\` to explore them)_`:``];if(n)try{let e=await nv(n.getStats(),{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}},`graphStore.getStats`);if(e.timedOut)g.push(`⚠ Graph stats timed out`),D.push(``,`### Knowledge Graph`,`- Graph stats timed out`);else{let t=e.value;w={nodes:t.nodeCount,edges:t.edgeCount},D.push(``,`### Knowledge Graph`,`- **Nodes**: ${t.nodeCount}`,`- **Edges**: ${t.edgeCount}`,...Object.entries(t.nodeTypes).map(([e,t])=>` - ${e}: ${t}`));try{let e=await nv(n.validate(),{valid:!0,danglingEdges:[],orphanNodes:[],stats:{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}}},`graphStore.validate`);if(!e.timedOut){let t=e.value;t.valid||D.push(`- **⚠ Integrity Issues**: ${t.danglingEdges.length} dangling edges`),t.orphanNodes.length>0&&D.push(`- **Orphan nodes**: ${t.orphanNodes.length}`)}}catch{}}}catch{D.push(``,`### Knowledge Graph`,`- Graph store unavailable`)}let ee=a?.onboardDir??``,ne=N(ee),re=i?.onboardComplete||ne,k=ie(ee,{lastIndexedAt:iv(y)});if(D.push(``,`### Onboard Status`,re?`- ✅ Complete${i?.onboardTimestamp?` (last: ${i.onboardTimestamp})`:``}`:'- ❌ Not run — call `onboard({ path: "." })` to analyze the codebase',`- **Onboard Directory**: \`${ee}\``),k){let e=k.packageMap.totalPackages,t=k.freshness.status===`fresh`?`✅`:k.freshness.status===`stale`?`⚠`:`❔`;D.push(`- **Onboard context**: ${k.readInstruction}`,`- **Onboard freshness**: ${t} ${k.freshness.status} (${k.freshness.reason})`,e>0?`- **Package map**: ${e} packages/containers in \`${k.packageMap.sourcePath}\``:"- **Package map**: read `structure.md` and `dependencies.md` from the onboard directory")}if(r)try{let e=await nv(r.count(),0,`curated.count`);e.timedOut?(g.push(`⚠ Curated knowledge count timed out`),D.push(``,`### Curated Knowledge`,`- Listing timed out`)):(T=e.value,D.push(``,`### Curated Knowledge`,T>0?`- ${T} entries`:'- Empty — use `knowledge({ action: "remember", ... })` to persist decisions'))}catch{D.push(``,`### Curated Knowledge`,`- Unable to read curated entries`)}let ae=Hn().filter(e=>e.status===`watching`);if(ae.length>0){D.push(``,`### File Watchers`,`- **Active**: ${ae.length}`);for(let e of ae){let t=e.pendingFiles?.length??0;if(D.push(` - \`${e.path}\`: ${e.eventCount} events, ${t} pending files`),t>0&&t<=10)for(let t of e.pendingFiles)D.push(` - \`${t}\``);else t>10&&D.push(` - ${t} pending files (use \`watch({ action: 'list' })\` for details)`)}}let oe=lv(y.totalRecords,w?.nodes??0,w?.edges??0,T),se=y.lastIndexedAt?new Date(y.lastIndexedAt).getTime():0,ce=se>0?Date.now()-se:1/0,le=re&&ce>1440*60*1e3,ue=rv({onboarded:re,onboardFreshness:k?.freshness.status??null,indexStale:le,contextPressure:oe});D.push(``),D.push(`## 📊 Context Pressure: ${oe}/100`),oe>=80?D.push(`⚠️ High pressure — consider pruning stale entries or compacting context.`):oe>=50?D.push(`ℹ️ Moderate pressure — AI Kit memory is well-populated.`):D.push(`✅ Low pressure — plenty of headroom for more content.`);let de=0;if(y.lastIndexedAt){de=new Date(y.lastIndexedAt).getTime();let e=(Date.now()-de)/(1e3*60*60);D.push(``,`### Index Freshness`,e>24?o===`smart`?`- ⚠ Last indexed ${Math.floor(e)}h ago — smart indexing will refresh automatically`:`- ⚠ Last indexed ${Math.floor(e)}h ago — may be stale. Run \`reindex({})\``:`- ✅ Last indexed ${e<1?`less than 1h`:`${Math.floor(e)}h`} ago`)}D.push(``,`### Next Action`,`- **${ue.kind}**: ${ue.reason}`);let fe=null,pe=t;if(typeof pe.getDiagnostics==`function`)try{let e=pe.getDiagnostics();fe={adapterType:e.adapterType,vectorSearchEnabled:e.vectorSearchEnabled,ftsEnabled:e.ftsEnabled,degradedMode:e.degradedMode,dbPath:e.dbPath,dbSizeBytes:e.dbSizeBytes,embeddingDim:e.embeddingDim,vectorDtype:e.vectorDtype},D.push(``,`### Storage`,`- **Backend**: ${a?.store?.backend??`unknown`}`,`- **Adapter**: ${fe.adapterType}`,`- **Vector search**: ${fe.vectorSearchEnabled?`✅ enabled`:`⚠ disabled (FTS-only fallback)`}`,fe.dbPath?`- **DB**: ${fe.dbPath}`:``,fe.dbSizeBytes==null?``:`- **DB size**: ${(fe.dbSizeBytes/1024/1024).toFixed(2)} MB`,`- **Embedding dim**: ${fe.embeddingDim}`,`- **Vector dtype**: ${fe.vectorDtype}`)}catch{}if(o===`smart`)if(D.push(``,`### Smart Indexing`),s){let e=s();e?D.push(`- **Mode**: Smart (trickle)`,`- **Status**: ${e.running?`✅ Running`:`⏸ Stopped`}`,`- **Queue**: ${e.queueSize} files pending`,`- **Changed files**: ${e.changedFilesSize} detected`,`- **Interval**: ${Math.round(e.intervalMs/1e3)}s per batch of ${e.batchSize}`):D.push(`- **Mode**: Smart (trickle)`,`- **Status**: scheduler state unavailable (init may have failed)`)}else D.push(`- **Mode**: Smart (trickle) — scheduler state unavailable`);if(h)try{let e=h.getReport(),t=h.checkThresholds(),n=Object.entries(e.counters),r=Object.entries(e.gauges);if(n.length>0||r.length>0||t.length>0){if(D.push(``,`### 📊 Metrics`),n.length>0){D.push(`**Counters:**`);for(let[e,t]of n)D.push(`- \`${e}\`: ${t}`)}if(r.length>0){D.push(`**Gauges:**`);for(let[e,t]of r)D.push(`- \`${e}\`: ${t}`)}if(t.length>0){D.push(`**⚠ Threshold violations:**`);for(let e of t)D.push(`- ${e}`)}else(n.length>0||r.length>0)&&D.push(`- ✅ All thresholds within limits`)}}catch{D.push(``,`### 📊 Metrics`,`- Metrics unavailable`)}{let e=[];if(u)try{let t=u.getStats();e.push(`- **Decision Hooks**: ${t.count} registered${t.hooks.length>0?` (IDs: ${t.hooks.map(e=>e.id).join(`, `)})`:``}`)}catch{e.push(`- **Decision Hooks**: unavailable`)}else e.push(`- **Decision Hooks**: not configured`);if(d)try{let t=d.getStats(),n=Object.entries(t.byTool).map(([e,t])=>`${e}=${t}`).join(`, `);e.push(`- **Observations**: ${t.totalObservations} total, byTool: ${n||`none`}`)}catch{e.push(`- **Observations**: unavailable`)}else e.push(`- **Observations**: not configured`);if(f)try{let t=f.getStats(),n=Object.keys(t.byName);e.push(`- **Extractors**: ${t.count} registered${n.length>0?` (IDs: ${n.join(`, `)})`:``}`)}catch{e.push(`- **Extractors**: unavailable`)}else e.push(`- **Extractors**: not configured`);if(m)try{let t=m.getStats(),n=t.skillExists?t.isStale?`⚠ Stale`:`✅ Fresh`:`❌ No skill`;e.push(`- **Skill Compiler**: ${n}, version: ${t.skillVersion}, last compiled: ${t.lastCompiledAt?new Date(t.lastCompiledAt).toLocaleString():`Never`}`)}catch{e.push(`- **Skill Compiler**: unavailable`)}else e.push(`- **Skill Compiler**: not configured`);if(p)try{let t=p.getStats();e.push(`- **Promotion Engine**: ${t.held} candidates held, ${t.promoted} promoted, ${t.observedFacts} distinct facts tracked`)}catch{e.push(`- **Promotion Engine**: unavailable`)}else e.push(`- **Promotion Engine**: not configured`);D.push(``,`### 🧩 Feature Coverage`,...e)}let ge=0;{try{let e=a?.stateDir?F(a.stateDir,`stash`):null;if(e&&N(e)){let t=je(e).mtimeMs;t>de&&(de=t)}}catch{}let e=[];if(r)try{let t=T>0?await r.list({limit:5,orderBy:`updated`,order:`desc`}):[];for(let e of t){let t=new Date(e.updated||e.created).getTime();t>de&&(de=t)}e.push(...t)}catch{}if(ge=de>0?Date.now()-de:0,ge>=ev){let t=Math.floor(ge/36e5);if(D.push(``,`### 🌅 Session Briefing`,`_${t}+ hours since last activity — here's what to pick up:_`,``),e.length>0){D.push(`**Recent decisions/notes:**`);for(let t of e)D.push(`- **${t.title}** (${t.category??`note`}) — ${(t.contentPreview??``).slice(0,80)}…`)}D.push(``,`**Suggested next steps:**`,'- `search({ query: "SESSION CHECKPOINT", origin: "curated" })` — find your last checkpoint',"- `restore({})` — resume from a saved checkpoint",'- `knowledge({ action: "list" })` — browse all stored knowledge')}}D.push(``,`### Runtime`,av());let _e=he.instance().getAll(),ve=_e.filter(e=>e.status!==`healthy`);if(ve.length>0){D.push(``,`### ⚠️ Subsystem Health`);for(let e of ve){let t=Math.round((Date.now()-e.since)/1e3);D.push(`- **${e.name}**: ${e.status} (${t}s ago${e.reason?` — ${e.reason}`:``})`)}}else _e.length>0&&D.push(``,`### ✅ Subsystem Health`,`- All ${_e.length} subsystems healthy`);let ye=me.getAll();if(ye.size>0){D.push(``,`### 🔌 Circuit Breakers`);for(let[e,t]of ye){let n=t.getState(),r=`- **${e}**: ${n===`closed`?`🟢`:n===`open`?`🔴`:`🟡`} ${n}`;if(n===`open`){let e=t.remainingCooldownMs();r+=` (recovery in ${Math.ceil(e/1e3)}s)`}D.push(r)}}let A=uv(),be=dv(),xe=S(),Se=A!=null&&A!==xe,Ce=be!=null&&be!==xe;if(Se||Ce){let e=O(),t=[];Se&&t.push(`user scaffold v${A}`),Ce&&t.push(`workspace scaffold v${be}`);let n=t.join(`, `);e.state===`success`?D.push(``,`### ✅ Upgrade Applied`,`- Server v${xe} — ${n} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):e.state===`pending`?D.push(``,`### ⏳ Upgrade In Progress`,`- Server v${xe} ≠ ${n}`,`- Auto-upgrade is running in the background…`):e.state===`failed`?(te(),D.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${xe} ≠ ${n}`,`- Error: ${e.error??`unknown`}`)):(te(),D.push(``,`### ⬆ Upgrade Available`,`- Server v${xe} ≠ ${n}`,`- Auto-upgrade triggered — check again shortly.`))}g.length>0&&D.push(``,`### ⚠ Warnings`,...g.map(e=>`- ${e}`));let we=K_();if(we.length>0){let e=we.sort((e,t)=>t.callCount-e.callCount);D.push(``,`### Tool Usage This Session`,``),D.push(`| Tool | Calls | Tokens In | Tokens Out | Errors | Avg Latency |`),D.push(`|------|-------|-----------|------------|--------|-------------|`);for(let t of e.slice(0,15)){let e=Math.round(t.totalInputChars/4),n=Math.round(t.totalOutputChars/4),r=Math.round(t.totalDurationMs/t.callCount);D.push(`| ${t.tool} | ${t.callCount} | ${e.toLocaleString()} | ${n.toLocaleString()} | ${t.errorCount} | ${r}ms |`)}}let j=U_();j.callCount>0&&(D.push(``),D.push(`### Session Token Usage`),D.push(`- Tool calls: ${j.callCount}`),D.push(`- Input chars: ${j.totalInputChars.toLocaleString()}`),D.push(`- Output chars: ${j.totalOutputChars.toLocaleString()}`),D.push(`- Est. input tokens: ${Math.round(j.totalInputChars/4).toLocaleString()}`),D.push(`- Est. total tokens: ${Math.round((j.totalInputChars+j.totalOutputChars)/4).toLocaleString()}`));let Te=Y_();if(Te.bufferSize>=10){let e=Te.state===`healthy`?`🟢`:Te.state===`degraded`?`🔴`:`🟡`;D.push(``,`### Auto-GC: ${e} ${Te.state}`),D.push(`- p95 latency: ${Te.p95}ms | buffer: ${Te.bufferSize} samples`),Te.gcCount>0&&D.push(`- GC cycles triggered: ${Te.gcCount}`)}if(l){let e=l.getStats();if(e.totalSubscribers>0){D.push(``,`### 🔌 Hooks (EventBus Subscribers)`),D.push(`- Total subscribers: ${e.totalSubscribers}`);for(let[t,n]of Object.entries(e.byEvent))D.push(` - ${t}: ${n} subscriber(s)`);for(let t of e.subscriptions)D.push(` - ${t.name} (${t.eventType}, ${t.policy})`);if(e.autoDisabled.length>0){D.push(``),D.push(` **Auto-disabled subscribers:**`);for(let t of e.autoDisabled)D.push(` - ${t.name} (${t.id}): ${t.reason}`)}}}if(u&&u.size>0){let e=u.getStats();D.push(``,`### 🪝 Decision Hooks`),D.push(`- Total hooks: ${e.count}`);for(let t of e.hooks){let e=t.decisionTypes.join(`, `);D.push(` - ${t.id} (order=${t.order}, policy=${t.failurePolicy}, types=[${e}])`)}}if(d){let e=d.getStats();D.push(``,`### 👁 Observations`),D.push(`- Total observations: ${e.totalObservations}`),D.push(` - Success: ${e.byError.success}, Error: ${e.byError.error}`),D.push(` - Artifacts stored: ${e.artifactCount}`),D.push(` - Truncations: ${e.truncationCount}`),D.push(` - Store entries: ${e.storeSize}`);let t=Object.entries(e.byOrigin);t.length>0&&D.push(` - By origin: ${t.map(([e,t])=>`${e}=${t}`).join(`, `)}`)}if(f){let e=f.getStats();D.push(``,`### 🧩 Extractors`),D.push(`- Total extractors: ${e.count}`);for(let[t,n]of Object.entries(e.byName))D.push(` - ${t} (${n.tools} tool(s), maxFacts: ${n.maxFactsPerEvent??`default`})`)}if(p){let e=p.getStats();if(D.push(``,`### 🏆 Promotion Engine`),D.push(`- Total evaluated: ${e.totalEvaluated}`),D.push(`- Promoted: ${e.promoted}`),D.push(`- Held: ${e.held}`),D.push(`- Rejected: ${e.rejected}`),D.push(`- Superseded: ${e.superseded}`),D.push(`- Decayed: ${e.decayed}`),D.push(`- Distinct facts tracked: ${e.observedFacts}`),e.recentDecisions.length>0){D.push(` Recent decisions:`);for(let t of e.recentDecisions.slice(-5))D.push(` - ${t.decision.status}: "${t.factTitle}" (${t.decision.reason.slice(0,80)})`)}}if(m){let e=m.getStats();if(D.push(``,`### 📋 Workspace Skill`),D.push(`- **Skill exists**: ${e.skillExists?`✅`:`❌`}`),D.push(`- **Stale**: ${e.isStale?`⚠ Yes — regenerating on next trigger`:`✅ Fresh`}`),D.push(`- **Last compiled**: ${e.lastCompiledAt?new Date(e.lastCompiledAt).toLocaleString():`Never`}`),D.push(`- **Version**: ${e.skillVersion}`),D.push(`- **Total compiles**: ${e.totalCompiles}`),e.failedCompiles>0&&D.push(`- **Failed compiles**: ${e.failedCompiles}`),e.skillSize>0&&D.push(`- **Skill size**: ${e.skillSize} bytes`),e.isCompiling&&D.push(`- ⏳ **Currently compiling**`),e.pendingRegeneration&&D.push(`- ⏳ **Regeneration pending**`),e.skillQuality&&D.push(`- **Quality**: ${e.skillQuality}`),e.skillQualityErrors&&e.skillQualityErrors.length>0){D.push(`- **Quality errors (${e.skillQualityErrors.length})**:`);for(let t of e.skillQualityErrors.slice(0,3))D.push(` - ${t}`)}if(e.skillQualityWarnings&&e.skillQualityWarnings.length>0){D.push(`- **Quality warnings (${e.skillQualityWarnings.length})**:`);for(let t of e.skillQualityWarnings.slice(0,3))D.push(` - ${t}`)}let t=m?.getWarnings()??[];if(t.length>0){D.push(`- **Compiler warnings (${t.length})**:`);for(let e of t.slice(0,5))D.push(` - ${e}`);t.length>5&&D.push(` - ... and ${t.length-5} more`)}D.push(``," Read `aikit://skill/SKILL.md` to load full workspace context.")}{let e=Nt();(e.cacheSize>0||e.refReuseCount>0)&&(D.push(``,`### 🔄 Ref Reuse`),D.push(`- **Refs stored**: ${e.refStoreCount}`),D.push(`- **Refs reused**: ${e.refReuseCount}`),e.refStaleCount>0&&D.push(`- **⚠ Stale refs detected**: ${e.refStaleCount}`),D.push(`- **Cache entries**: ${e.cacheSize}`))}let M=D.join(`
3054
+ `),Ee=ge>=ev,De=Z_(a),P=e||Ee?await E(r,c,void 0,De.length>0?De:void 0,k):void 0,Oe=ae.length>0?ae.map(e=>({id:e.id,path:e.path,eventCount:e.eventCount,pendingFiles:e.pendingFiles??[]})):void 0,ke={totalRecords:y.totalRecords,totalFiles:y.totalFiles,lastIndexedAt:y.lastIndexedAt??null,lastSourceIndexedAt:y.lastSourceIndexedAt??null,onboarded:re,onboardDir:ee,onboard_context:k,contentTypes:y.contentTypeBreakdown,wasmAvailable:!!ar.get(),wasmDiagnostics:ir.get(),graphStats:w,curatedCount:T,serverVersion:xe,scaffoldVersion:A??null,workspaceScaffoldVersion:be??null,upgradeAvailable:Se||Ce,storeBackend:a?.store?.backend,storeDiagnostics:fe??null,contextPressure:oe,nextAction:ue,workspace_skill:(()=>{if(!m)return null;try{let e=m.getStats(),t=m?.getWarnings()??[],n=e.skillExists?e.skillQuality??`fallback`:`fallback`;return{exists:e.skillExists,version:e.skillVersion,fresh:!e.isStale,quality:n,warnings:t,uri:`aikit://skill/SKILL.md`,path:e.skillPath,read_instruction:`Read aikit://skill/SKILL.md before working in this repo for full workspace context.`,last_updated:e.lastCompiledAt?new Date(e.lastCompiledAt).toISOString():null,size:e.skillSize}}catch{return null}})(),skill_warnings:m?.getWarnings(m?.resolveActiveFlowSlug()??void 0)??[],watchers:Oe,sessionTokens:{callCount:j.callCount,totalInputChars:j.totalInputChars,totalOutputChars:j.totalOutputChars,estInputTokens:Math.round(j.totalInputChars/4),estTotalTokens:Math.round((j.totalInputChars+j.totalOutputChars)/4),startTime:j.startTime},...P===void 0?{}:{prelude:P}};return{content:[{type:`text`,text:M+(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:ke}}catch(e){return $_.error(`Status failed`,M(e)),q(`INTERNAL`,`Status check failed: ${e instanceof Error?e.message:String(e)}`)}}))}const mv=A(`tools`);function hv(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 gv(e){let t=U(`web_search`);e.registerTool(`web_search`,{title:t.title,description:`PREFERRED web search — fans out to multiple keyless providers (DuckDuckGo + Bing-HTML + Mojeek) by default, returning a deduplicated, consensus-ranked union within a 10s deadline. Optional providers (SearXNG, Google, Brave, Bing API) join the fan-out automatically when their env vars are set. Pass one query or multiple for parallel searching.`,inputSchema:{queries:L.array(L.string().max(2e3)).min(1).max(5).describe('Search queries (1–5). Single: `["react hooks"]`. Multiple searched in parallel.'),limit:L.number().min(1).max(20).default(5).describe(`Max results per query`),site:L.string().optional().describe(`Restrict to domain (e.g., "docs.aws.amazon.com")`),provider:L.enum([`multi`,`duckduckgo`,`bing-html`,`mojeek`,`searxng`,`google`,`brave`,`bing`]).optional().describe("Search provider. Defaults to env AIKIT_SEARCH_PROVIDER, then `multi` (fan-out). Single keyless: `duckduckgo`, `bing-html`, `mojeek`. Self-hosted: `searxng` (requires SEARXNG_URL). Keyed APIs: `google` (GOOGLE_API_KEY+GOOGLE_CSE_ID), `brave` (BRAVE_API_KEY), `bing` (BING_API_KEY). Missing keys auto-fall back to duckduckgo.")},annotations:t.annotations},J(`web_search`,async({queries:e,limit:t,site:n,provider:r})=>{let i=e,a=async e=>{let i=await Wn({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(`
3055
+ `)};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 mv.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);mv.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(`
3056
3056
 
3057
- `);return c===o.length?q(`INTERNAL`,u):{content:[{type:`text`,text:u}]}}))}function gv(e){let t=U(`measure`);e.registerTool(`measure`,{title:t.title,description:`Measure code complexity, line counts, and function counts for a file or directory. Returns per-file metrics sorted by complexity.`,outputSchema:Es,inputSchema:{path:L.string().describe(`File or directory path to measure`),extensions:L.array(L.string()).optional().describe(`File extensions to include (default: .ts,.tsx,.js,.jsx)`),include_hidden:L.boolean().optional().describe(`Include hidden trees such as .generated and .cache. Default false.`),max_tokens:L.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`)},annotations:t.annotations},J(`measure`,async({path:e,extensions:t,include_hidden:n,max_tokens:r})=>{try{let i=await Jt({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?Bn(a.join(`
3057
+ `);return c===o.length?q(`INTERNAL`,u):{content:[{type:`text`,text:u}]}}))}function _v(e){let t=U(`measure`);e.registerTool(`measure`,{title:t.title,description:`Measure code complexity, line counts, and function counts for a file or directory. Returns per-file metrics sorted by complexity.`,outputSchema:Es,inputSchema:{path:L.string().describe(`File or directory path to measure`),extensions:L.array(L.string()).optional().describe(`File extensions to include (default: .ts,.tsx,.js,.jsx)`),include_hidden:L.boolean().optional().describe(`Include hidden trees such as .generated and .cache. Default false.`),max_tokens:L.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`)},annotations:t.annotations},J(`measure`,async({path:e,extensions:t,include_hidden:n,max_tokens:r})=>{try{let i=await Jt({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?Bn(a.join(`
3058
3058
  `),r):a.join(`
3059
- `)}],structuredContent:o}}catch(e){return mv(e)?(pv.warn(`Measure failed`,{error:`File not found`}),q(`NOT_FOUND`,`File not found`)):(pv.error(`Measure failed`,M(e)),q(`INTERNAL`,`Measure failed: ${e instanceof Error?e.message:String(e)}`))}}))}function _v(e){let t=U(`env`);e.registerTool(`env`,{title:t.title,description:`Get system and runtime environment info. Sensitive env vars are redacted by default.`,outputSchema:Ds,inputSchema:{include_env:L.boolean().default(!1).describe(`Include environment variables`),filter_env:L.string().optional().describe(`Filter env vars by name substring`),show_sensitive:L.boolean().default(!1).describe(`Show sensitive values (keys, tokens, etc.) — redacted by default`)},annotations:t.annotations},J(`env`,async({include_env:e,filter_env:t,show_sensitive:n})=>{let r=wt({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(`
3060
- `)}],structuredContent:a}}))}const vv=A(`register-tools`);function yv(e){return t=>!e||e.has(t)}function bv(e){try{let t=F(e,`.flows`);if(!N(t))return null;let n=Oe(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}let xv=null,Sv=null;function Cv(){xv?.(),xv=null}function wv(){return Sv?.flush()??Promise.resolve()}function Tv(e){let{server:t,aikit:n,config:r,elicitor:i,resourceNotifier:a,samplingClient:o,indexMode:s,getSmartState:c,getSmartScheduler:l,precomputedActiveTools:u}=e,d=new Oo,f=r.sources[0]?.path??Te(),p=ye(f),m={activeSlug:null};m.activeSlug=bv(f);let h=new Va(F(r.stateDir??``,`flow-context`),()=>m.activeSlug),g=new Ta;g.register(fi()),g.register(va),g.register(ki),g.register(ra),g.register(yi),g.register(pi),g.register(mi),g.register(ha),g.register(gi),g.register(Sa),g.register(na(()=>m.activeSlug?{active:!0,slug:m.activeSlug}:null)),g.register(sa),g.register(ba),g.register(Ei),g.register(aa);let _=new Za(void 0,n.stateStore),v=n.eventBus,y=Q_(r),b=y?new no(y,{debounceMs:5e3},v??void 0,n.curated,void 0,f):null;b&&b.compileNow(`startup`).catch(e=>{vv.warn(`Startup skill compile failed — will retry on next trigger`,{error:String(e)})});let x=new Oa(g,n.curated,{},h,_,v??void 0,n.stateStore);Sv=x;let S=u??xs(r,[...Ia,...Wo],Fa,Ko(r)),C=yv(S),w=new Set([...S].filter(e=>!Lf.includes(e)&&!Ua.has(e))),T=new qa;d.use(Yo(),{order:1,name:`structured-content-guard`}),d.use(Ba(za(r.tokenBudget)),{order:90,name:`compression`});let E=d.decisionHookRegistry;E.register({id:`search-budget`,order:10,scope:`search`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`budgetHint`],reason:`Enforce token budget on search results`,fn:()=>({type:`decision`,hookId:`search-budget`,decision:`allow`,reason:`Budget hook active`})}),E.register({id:`find-path-containment`,order:10,scope:`find`,timeoutMs:50,failurePolicy:`fail-closed`,decisionTypes:[`deny`],reason:`Validate find scope against workspace boundaries`,fn:()=>({type:`decision`,hookId:`find-path-containment`,decision:`allow`,reason:`Path permitted`})}),E.register({id:`knowledge-mutation-safety`,order:10,scope:`knowledge`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`deny`],reason:`Guard against unintended knowledge mutations`,fn:()=>({type:`decision`,hookId:`knowledge-mutation-safety`,decision:`allow`,reason:`Mutation permitted`})}),E.register({id:`check-scoped-run`,order:10,scope:`check`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log check run scope for audit`,fn:()=>({type:`decision`,hookId:`check-scoped-run`,decision:`allow`,reason:`Check run permitted`})}),E.register({id:`test-run-scoped`,order:10,scope:`test_run`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log test run scope for audit`,fn:()=>({type:`decision`,hookId:`test-run-scoped`,decision:`allow`,reason:`Test run permitted`})}),E.register({id:`onboard-path-correctness`,order:10,scope:`onboard`,timeoutMs:50,failurePolicy:`fail-closed`,decisionTypes:[`deny`],reason:`Validate onboard target path is valid and accessible`,fn:()=>({type:`decision`,hookId:`onboard-path-correctness`,decision:`allow`,reason:`Path valid`})}),E.register({id:`compact-budget-hints`,order:10,scope:`compact`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`budgetHint`],reason:`Enforce token budget on compact output`,fn:()=>({type:`decision`,hookId:`compact-budget-hints`,decision:`allow`,reason:`Budget hook active`})}),E.register({id:`flow-step-safety`,order:10,scope:`flow`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log flow step transitions`,fn:()=>({type:`decision`,hookId:`flow-step-safety`,decision:`allow`,reason:`Step permitted`})}),E.register({id:`present-transport-capability`,order:10,scope:`present`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Verify presentation transport is available`,fn:()=>({type:`decision`,hookId:`present-transport-capability`,decision:`allow`,reason:`Transport available`})});let D=new jo(r.metricThresholds);os(t,d,r.toolPrefix??``,n.eventBus,()=>{let e=r.sources[0]?.path??Te();try{return ye(e)}catch{return`partition:${Ke(`sha256`).update(e).digest(`hex`).slice(0,8)}`}}),v&&(v.subscribe({id:`sub-auto-knowledge`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`args`in e)||!(`result`in e))return;let t=e;try{D.incrementCounter(`tool.call`,{tool:t.toolName}),t.isError&&D.incrementCounter(`tool.error`,{tool:t.toolName}),x.push({toolName:t.toolName,args:t.args,result:t.result,durationMs:t.durationMs,isError:t.isError,timestamp:new Date(t.timestamp).toISOString(),origin:t.origin,workspaceId:t.workspaceId,requestId:t.requestId})}catch{}},name:`auto-knowledge`}),v.subscribe({id:`sub-replay`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`args`in e)||!(`result`in e))return;let t=e;try{let{replayAppend:e}=await import(`../../tools/dist/index.js`),n=JSON.stringify(t.args),r=JSON.stringify(t.result);e({ts:new Date(t.timestamp).toISOString(),source:`mcp`,tool:t.toolName,input:n.slice(0,2e3),outputChars:r.length,inputChars:n.length,durationMs:t.durationMs,status:t.isError?`error`:`ok`,output:r.slice(0,2e3),traceId:t.requestId??``})}catch{}},name:`replay`}),v.subscribe({id:`sub-procedural`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`isError`in e))return;let t=e;try{w.has(t.toolName)&&T.record(t.toolName,!t.isError)}catch{}},name:`procedural-memory`}),v.subscribe({id:`sub-observations`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`result`in e))return;let t=e;try{let{ObservationEngine:e,DEFAULT_OBSERVATION_CONFIG:r}=await import(`./observations-BhMmh4uj.js`),i=new e(n.stateStore,n.curated),{captureFrom:a}=r;a.includes(t.toolName)&&await i.processToolResult(t.toolName,t.result,{})}catch{}},name:`observation-capture`}),v.subscribe({id:`sub-knowledge-metrics`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`result`in e))return;let t=e;if(t.toolName===`knowledge`)try{let e=t.result,n=t.args?.action;(n===`remember`||n===`update`)&&(D.incrementCounter(`fact.total`),(e?.status===`unchanged`||e?.result===`unchanged`)&&D.incrementCounter(`fact.duplicate`))}catch{}},name:`knowledge-metrics`}),v.subscribe({id:`sub-session`,eventType:`session:start`,policy:`async`,handler:async e=>{let t=e,n={serverVersion:t.serverVersion,workspaceRoot:t.workspaceRoot,handoff:t.handoff?`${t.handoff.from} (session ${t.handoff.sessionId})`:void 0};vv.info(`Session started`,n)},name:`session-lifecycle`}),b&&(xv=b.subscribeToEventBus(v)));let ee=[...S].filter(e=>Go.has(e)?Uo.includes(e)?!!n.bridge:e===`er_update_policy`?!!n.policyStore:e===`er_evolve_review`?!!n.evolutionCollector:!1:!0),O={store:n.store,graphStore:n.graphStore,embedder:n.embedder},te={onboardComplete:n.onboardComplete,onboardTimestamp:n.onboardTimestamp},ne={search:[{name:`search`,register:()=>f_(t,n.embedder,n.store,n.graphStore,n.bridge,n.evolutionCollector,o,n.stateStore,r.memory?.retention,r.memory?.consolidation,p)},{name:`find`,register:()=>wl(t,n.embedder,n.store)},{name:`symbol`,register:()=>Tl(t,n.embedder,n.store,n.graphStore,O)},{name:`trace`,register:()=>El(t,n.embedder,n.store,n.graphStore,O)},{name:`scope_map`,register:()=>Cl(t,n.embedder,n.store,O)},{name:`file_summary`,register:()=>Rl(t,n.embedder,n.fileCache)}],analysis:[{name:`analyze`,register:()=>Nc(t,n.store,n.embedder)},{name:`blast_radius`,register:()=>Pc(t,n.store,n.embedder,n.graphStore,O)}],knowledge:[{name:`knowledge`,register:()=>Cf(t,n.curated,n.policyStore,n.evolutionCollector,a,void 0,n.stateStore,r.memory?.retention,r.memory?.supersession,r.memory?.consolidation,r.memory?.lessons,O,n.graphStore)},{name:`produce_knowledge`,register:()=>Hg(t,a)}],compression:[{name:`digest`,register:()=>Wu(t,n.embedder)}],forge:[{name:`forge_ground`,register:()=>Gu(t,n.embedder,n.store)},{name:`evidence_map`,register:()=>Uu(t)}],presentation:[{name:`present`,register:()=>Bg(t,i)}],execution:[{name:`check`,register:()=>jl(t,O,r.tokenBudget)},{name:`test_run`,register:()=>Nl(t,O)},{name:`eval`,register:()=>Ml(t)},{name:`audit`,register:()=>zc(t,n.store,n.embedder)}],web:[{name:`browser`,register:()=>Jn(t,r)},{name:`web_fetch`,register:()=>ed(t)},{name:`web_search`,register:()=>hv(t)}],manipulation:[{name:`rename`,register:()=>Df(t,r)},{name:`restore`,register:()=>Jg(t)},{name:`codemod`,register:()=>Of(t,r)}],session:[{name:`session`,register:()=>A_(t,n.stateStore,o)}],git:[{name:`git`,register:()=>qu(t)},{name:`parse_output`,register:()=>Pl(t)}],process:[{name:`process`,register:()=>$u(t)},{name:`delegate`,register:()=>Fl(t,o)}],system:[{name:`config`,register:()=>fl(t,r)},{name:`status`,register:()=>fv(t,n.store,n.graphStore,n.curated,te,r,s,c,n.stateStore,n.eventBus,d.decisionHookRegistry,d.getObservationCompressor(),g,_,b)},{name:`reindex`,register:()=>Wg(t,n.indexer,r,n.curated,n.store,a,s,n.eventBus)},{name:`onboard`,register:()=>ap(t,n.store,n.embedder,r,te,O,o,a)},{name:`graph`,register:()=>Zu(t,n.graphStore)},{name:`replay`,register:()=>Kg(t)}],utilities:[{name:`measure`,register:()=>gv(t)},{name:`env`,register:()=>_v(t)}],queue:[{name:`queue`,register:()=>sp(t)}],flow:[{name:`flow`,register:()=>Vu(t,r,{store:n.store?{search:async(e,t)=>(await n.store.ftsSearch(e,t)).map(e=>({content:e.record.content}))}:null,graphStore:n.graphStore,embedder:n.embedder,curated:n.curated??null,eventBus:n.eventBus??null,skillCompiler:b},e=>{m.activeSlug=e})}]};for(let[,e]of Object.entries(ne))for(let{name:t,register:n}of e)C(t)&&n();n.bridge&&(C(`er_push`)&&Uc(t,n.bridge,n.evolutionCollector),C(`er_pull`)&&Wc(t,n.bridge),C(`er_sync_status`)&&Gc(t,n.bridge)),n.policyStore&&C(`er_update_policy`)&&up(t,n.policyStore),n.evolutionCollector&&C(`er_evolve_review`)&&kl(t,n.evolutionCollector),Lf.some(e=>C(e))&&Rf(t,r,ee,n.onboardComplete),Ho(t,n.store,n.curated,y,n.eventBus,d.decisionHookRegistry,b)}function Ev(e,t,n){let r=yv(n);r(`check`)&&jl(e,void 0,t.tokenBudget),r(`eval`)&&Ml(e),r(`test_run`)&&Nl(e),r(`parse_output`)&&Pl(e),r(`delegate`)&&Fl(e),r(`git`)&&qu(e),r(`rename`)&&Df(e,t),r(`codemod`)&&Of(e,t),r(`restore`)&&Jg(e),r(`queue`)&&sp(e),r(`process`)&&$u(e),r(`web_fetch`)&&ed(e),Lf.some(e=>r(e))&&Rf(e,t,[...n??new Set(Ia)]),r(`evidence_map`)&&Uu(e),r(`present`)&&Bg(e),r(`browser`)&&Jn(e,t),r(`produce_knowledge`)&&Hg(e),r(`replay`)&&Kg(e),r(`status`)&&dv(e),r(`flow`)&&Vu(e,t),r(`web_search`)&&hv(e),r(`measure`)&&gv(e),r(`env`)&&_v(e)}export{U as S,so as _,yg as a,Fa as b,Hc as c,Yo as d,ts as f,Oo as g,Ko as h,Ev as i,xs as l,Wo as m,wv as n,Yf as o,qo as p,Tv as r,Qf as s,Cv as t,os as u,Ia as v,La as x,Ra as y};
3059
+ `)}],structuredContent:o}}catch(e){return hv(e)?(mv.warn(`Measure failed`,{error:`File not found`}),q(`NOT_FOUND`,`File not found`)):(mv.error(`Measure failed`,M(e)),q(`INTERNAL`,`Measure failed: ${e instanceof Error?e.message:String(e)}`))}}))}function vv(e){let t=U(`env`);e.registerTool(`env`,{title:t.title,description:`Get system and runtime environment info. Sensitive env vars are redacted by default.`,outputSchema:Ds,inputSchema:{include_env:L.boolean().default(!1).describe(`Include environment variables`),filter_env:L.string().optional().describe(`Filter env vars by name substring`),show_sensitive:L.boolean().default(!1).describe(`Show sensitive values (keys, tokens, etc.) — redacted by default`)},annotations:t.annotations},J(`env`,async({include_env:e,filter_env:t,show_sensitive:n})=>{let r=wt({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(`
3060
+ `)}],structuredContent:a}}))}const yv=A(`register-tools`);function bv(e){return t=>!e||e.has(t)}function xv(e){try{let t=F(e,`.flows`);if(!N(t))return null;let n=Oe(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}let Sv=null,Cv=null;function wv(){Sv?.(),Sv=null}function Tv(){return Cv?.flush()??Promise.resolve()}function Ev(e){let{server:t,aikit:n,config:r,elicitor:i,resourceNotifier:a,samplingClient:o,indexMode:s,getSmartState:c,getSmartScheduler:l,precomputedActiveTools:u}=e,d=new Oo,f=r.sources[0]?.path??Te(),p=ye(f),m={activeSlug:null};m.activeSlug=xv(f);let h=new Va(F(r.stateDir??``,`flow-context`),()=>m.activeSlug),g=new Ta;g.register(fi()),g.register(va),g.register(ki),g.register(ra),g.register(yi),g.register(pi),g.register(mi),g.register(ha),g.register(gi),g.register(Sa),g.register(na(()=>m.activeSlug?{active:!0,slug:m.activeSlug}:null)),g.register(sa),g.register(ba),g.register(Ei),g.register(aa);let _=new Za(void 0,n.stateStore),v=n.eventBus,y=Q_(r),b=y?new no(y,{debounceMs:5e3},v??void 0,n.curated,void 0,f):null;b&&b.compileNow(`startup`).catch(e=>{yv.warn(`Startup skill compile failed — will retry on next trigger`,{error:String(e)})});let x=new Oa(g,n.curated,{},h,_,v??void 0,n.stateStore);Cv=x;let S=u??xs(r,[...Ia,...Wo],Fa,Ko(r)),C=bv(S),w=new Set([...S].filter(e=>!Lf.includes(e)&&!Ua.has(e))),T=new qa;d.use(Yo(),{order:1,name:`structured-content-guard`}),d.use(Ba(za(r.tokenBudget)),{order:90,name:`compression`});let E=d.decisionHookRegistry;E.register({id:`search-budget`,order:10,scope:`search`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`budgetHint`],reason:`Enforce token budget on search results`,fn:()=>({type:`decision`,hookId:`search-budget`,decision:`allow`,reason:`Budget hook active`})}),E.register({id:`find-path-containment`,order:10,scope:`find`,timeoutMs:50,failurePolicy:`fail-closed`,decisionTypes:[`deny`],reason:`Validate find scope against workspace boundaries`,fn:()=>({type:`decision`,hookId:`find-path-containment`,decision:`allow`,reason:`Path permitted`})}),E.register({id:`knowledge-mutation-safety`,order:10,scope:`knowledge`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`deny`],reason:`Guard against unintended knowledge mutations`,fn:()=>({type:`decision`,hookId:`knowledge-mutation-safety`,decision:`allow`,reason:`Mutation permitted`})}),E.register({id:`check-scoped-run`,order:10,scope:`check`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log check run scope for audit`,fn:()=>({type:`decision`,hookId:`check-scoped-run`,decision:`allow`,reason:`Check run permitted`})}),E.register({id:`test-run-scoped`,order:10,scope:`test_run`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log test run scope for audit`,fn:()=>({type:`decision`,hookId:`test-run-scoped`,decision:`allow`,reason:`Test run permitted`})}),E.register({id:`onboard-path-correctness`,order:10,scope:`onboard`,timeoutMs:50,failurePolicy:`fail-closed`,decisionTypes:[`deny`],reason:`Validate onboard target path is valid and accessible`,fn:()=>({type:`decision`,hookId:`onboard-path-correctness`,decision:`allow`,reason:`Path valid`})}),E.register({id:`compact-budget-hints`,order:10,scope:`compact`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`budgetHint`],reason:`Enforce token budget on compact output`,fn:()=>({type:`decision`,hookId:`compact-budget-hints`,decision:`allow`,reason:`Budget hook active`})}),E.register({id:`flow-step-safety`,order:10,scope:`flow`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log flow step transitions`,fn:()=>({type:`decision`,hookId:`flow-step-safety`,decision:`allow`,reason:`Step permitted`})}),E.register({id:`present-transport-capability`,order:10,scope:`present`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Verify presentation transport is available`,fn:()=>({type:`decision`,hookId:`present-transport-capability`,decision:`allow`,reason:`Transport available`})});let D=new jo(r.metricThresholds);os(t,d,r.toolPrefix??``,n.eventBus,()=>{let e=r.sources[0]?.path??Te();try{return ye(e)}catch{return`partition:${Ke(`sha256`).update(e).digest(`hex`).slice(0,8)}`}}),v&&(v.subscribe({id:`sub-auto-knowledge`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`args`in e)||!(`result`in e))return;let t=e;try{D.incrementCounter(`tool.call`,{tool:t.toolName}),t.isError&&D.incrementCounter(`tool.error`,{tool:t.toolName}),x.push({toolName:t.toolName,args:t.args,result:t.result,durationMs:t.durationMs,isError:t.isError,timestamp:new Date(t.timestamp).toISOString(),origin:t.origin,workspaceId:t.workspaceId,requestId:t.requestId})}catch{}},name:`auto-knowledge`}),v.subscribe({id:`sub-replay`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`args`in e)||!(`result`in e))return;let t=e;try{let{replayAppend:e}=await import(`../../tools/dist/index.js`),n=JSON.stringify(t.args),r=JSON.stringify(t.result);e({ts:new Date(t.timestamp).toISOString(),source:`mcp`,tool:t.toolName,input:n.slice(0,2e3),outputChars:r.length,inputChars:n.length,durationMs:t.durationMs,status:t.isError?`error`:`ok`,output:r.slice(0,2e3),traceId:t.requestId??``})}catch{}},name:`replay`}),v.subscribe({id:`sub-procedural`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`isError`in e))return;let t=e;try{w.has(t.toolName)&&T.record(t.toolName,!t.isError)}catch{}},name:`procedural-memory`}),v.subscribe({id:`sub-observations`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`result`in e))return;let t=e;try{let{ObservationEngine:e,DEFAULT_OBSERVATION_CONFIG:r}=await import(`./observations-BhMmh4uj.js`),i=new e(n.stateStore,n.curated),{captureFrom:a}=r;a.includes(t.toolName)&&await i.processToolResult(t.toolName,t.result,{})}catch{}},name:`observation-capture`}),v.subscribe({id:`sub-knowledge-metrics`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`result`in e))return;let t=e;if(t.toolName===`knowledge`)try{let e=t.result,n=t.args?.action;(n===`remember`||n===`update`)&&(D.incrementCounter(`fact.total`),(e?.status===`unchanged`||e?.result===`unchanged`)&&D.incrementCounter(`fact.duplicate`))}catch{}},name:`knowledge-metrics`}),v.subscribe({id:`sub-session`,eventType:`session:start`,policy:`async`,handler:async e=>{let t=e,n={serverVersion:t.serverVersion,workspaceRoot:t.workspaceRoot,handoff:t.handoff?`${t.handoff.from} (session ${t.handoff.sessionId})`:void 0};yv.info(`Session started`,n)},name:`session-lifecycle`}),b&&(Sv=b.subscribeToEventBus(v)));let ee=[...S].filter(e=>Go.has(e)?Uo.includes(e)?!!n.bridge:e===`er_update_policy`?!!n.policyStore:e===`er_evolve_review`?!!n.evolutionCollector:!1:!0),O={store:n.store,graphStore:n.graphStore,embedder:n.embedder},te={onboardComplete:n.onboardComplete,onboardTimestamp:n.onboardTimestamp},ne={search:[{name:`search`,register:()=>f_(t,n.embedder,n.store,n.graphStore,n.bridge,n.evolutionCollector,o,n.stateStore,r.memory?.retention,r.memory?.consolidation,p)},{name:`find`,register:()=>wl(t,n.embedder,n.store)},{name:`symbol`,register:()=>Tl(t,n.embedder,n.store,n.graphStore,O)},{name:`trace`,register:()=>El(t,n.embedder,n.store,n.graphStore,O)},{name:`scope_map`,register:()=>Cl(t,n.embedder,n.store,O)},{name:`file_summary`,register:()=>Rl(t,n.embedder,n.fileCache)}],analysis:[{name:`analyze`,register:()=>Nc(t,n.store,n.embedder)},{name:`blast_radius`,register:()=>Pc(t,n.store,n.embedder,n.graphStore,O)}],knowledge:[{name:`knowledge`,register:()=>Cf(t,n.curated,n.policyStore,n.evolutionCollector,a,void 0,n.stateStore,r.memory?.retention,r.memory?.supersession,r.memory?.consolidation,r.memory?.lessons,O,n.graphStore)},{name:`produce_knowledge`,register:()=>Hg(t,a)}],compression:[{name:`digest`,register:()=>Wu(t,n.embedder)}],forge:[{name:`forge_ground`,register:()=>Gu(t,n.embedder,n.store)},{name:`evidence_map`,register:()=>Uu(t)}],presentation:[{name:`present`,register:()=>Bg(t,i)}],execution:[{name:`check`,register:()=>jl(t,O,r.tokenBudget)},{name:`test_run`,register:()=>Nl(t,O)},{name:`eval`,register:()=>Ml(t)},{name:`audit`,register:()=>zc(t,n.store,n.embedder)}],web:[{name:`browser`,register:()=>Jn(t,r)},{name:`web_fetch`,register:()=>ed(t)},{name:`web_search`,register:()=>gv(t)}],manipulation:[{name:`rename`,register:()=>Df(t,r)},{name:`restore`,register:()=>Jg(t)},{name:`codemod`,register:()=>Of(t,r)}],session:[{name:`session`,register:()=>A_(t,n.stateStore,o)}],git:[{name:`git`,register:()=>qu(t)},{name:`parse_output`,register:()=>Pl(t)}],process:[{name:`process`,register:()=>$u(t)},{name:`delegate`,register:()=>Fl(t,o)}],system:[{name:`config`,register:()=>fl(t,r)},{name:`status`,register:()=>pv(t,n.store,n.graphStore,n.curated,te,r,s,c,n.stateStore,n.eventBus,d.decisionHookRegistry,d.getObservationCompressor(),g,_,b)},{name:`reindex`,register:()=>Wg(t,n.indexer,r,n.curated,n.store,a,s,n.eventBus)},{name:`onboard`,register:()=>ap(t,n.store,n.embedder,r,te,O,o,a)},{name:`graph`,register:()=>Zu(t,n.graphStore)},{name:`replay`,register:()=>Kg(t)}],utilities:[{name:`measure`,register:()=>_v(t)},{name:`env`,register:()=>vv(t)}],queue:[{name:`queue`,register:()=>sp(t)}],flow:[{name:`flow`,register:()=>Vu(t,r,{store:n.store?{search:async(e,t)=>(await n.store.ftsSearch(e,t)).map(e=>({content:e.record.content}))}:null,graphStore:n.graphStore,embedder:n.embedder,curated:n.curated??null,eventBus:n.eventBus??null,skillCompiler:b},e=>{m.activeSlug=e})}]};for(let[,e]of Object.entries(ne))for(let{name:t,register:n}of e)C(t)&&n();n.bridge&&(C(`er_push`)&&Uc(t,n.bridge,n.evolutionCollector),C(`er_pull`)&&Wc(t,n.bridge),C(`er_sync_status`)&&Gc(t,n.bridge)),n.policyStore&&C(`er_update_policy`)&&up(t,n.policyStore),n.evolutionCollector&&C(`er_evolve_review`)&&kl(t,n.evolutionCollector),Lf.some(e=>C(e))&&Rf(t,r,ee,n.onboardComplete),Ho(t,n.store,n.curated,y,n.eventBus,d.decisionHookRegistry,b)}function Dv(e,t,n){let r=bv(n);r(`check`)&&jl(e,void 0,t.tokenBudget),r(`eval`)&&Ml(e),r(`test_run`)&&Nl(e),r(`parse_output`)&&Pl(e),r(`delegate`)&&Fl(e),r(`git`)&&qu(e),r(`rename`)&&Df(e,t),r(`codemod`)&&Of(e,t),r(`restore`)&&Jg(e),r(`queue`)&&sp(e),r(`process`)&&$u(e),r(`web_fetch`)&&ed(e),Lf.some(e=>r(e))&&Rf(e,t,[...n??new Set(Ia)]),r(`evidence_map`)&&Uu(e),r(`present`)&&Bg(e),r(`browser`)&&Jn(e,t),r(`produce_knowledge`)&&Hg(e),r(`replay`)&&Kg(e),r(`status`)&&fv(e),r(`flow`)&&Vu(e,t),r(`web_search`)&&gv(e),r(`measure`)&&_v(e),r(`env`)&&vv(e)}export{U as S,so as _,yg as a,Fa as b,Hc as c,Yo as d,ts as f,Oo as g,Ko as h,Dv as i,xs as l,Wo as m,Tv as n,Yf as o,qo as p,Ev as r,Qf as s,wv as t,os as u,Ia as v,La as x,Ra as y};
@@ -27,7 +27,7 @@ skillDir is not configured. Run \`aikit init\` or set skillDir in server config
27
27
 
28
28
  Run \`onboard({ path: "." })\` to generate this skill.`+n}catch{t=`# Workspace Skill: error
29
29
 
30
- Failed to read skill file.`}return{contents:[{uri:`aikit://skill/SKILL.md`,text:t,mimeType:`text/markdown`}]}}),r?Fo.debug(`Workspace skill resources registered`,{skillDir:r}):Fo.debug(`skillDir not configured — skill resources registered with diagnostic messages`)}new Set(Object.entries(Fa).filter(([e,t])=>t.planner?.effect===`read`).map(([e])=>e)),new Set(Object.entries(Fa).filter(([e,t])=>{let n=t.planner?.effect;return n===`write`||n===`mixed`||n===`destructive`}).map(([e])=>e)),new Set(Object.entries(Fa).filter(([e,t])=>t.planner?.costClass===`tiny`).map(([e])=>e));const Uo=[`er_push`,`er_pull`,`er_sync_status`],Wo=[...Uo,`er_update_policy`,`er_evolve_review`],Go=new Set(Wo);function Ko(e){return e.toolProfiles}const qo=5e3,Jo=k(`structured-content-guard`);function Yo(){let e=(async(e,t)=>{let n;try{n=await t()}catch(e){n={content:[{type:`text`,text:`[ERROR:INTERNAL] ${e instanceof Error?e.message:String(e)}`}],isError:!0}}let r=(e.toolConfig??{}).outputSchema;if(r==null)return n;let i=null;if(n.structuredContent==null){let t=Xo(r);n.structuredContent=t,i=`synthesize`,n.structuredContent??(n.structuredContent={},i=`synthesize-null-fallback`,Jo.error(`synthesizeStructuredContent returned null/undefined — using empty fallback`,{tool:e.toolName}))}let a=Zo(r,n.structuredContent);if(a.action!=null&&(n.structuredContent=a.structuredContent,i=a.action),$o(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),Qo(r,n.structuredContent)===!1){let e=Xo(r);n.structuredContent=e??{},Qo(r,n.structuredContent)===!1?(n.structuredContent=$o(n.structuredContent)?n.structuredContent:{},i=`final-validation-failed`):i??=`final-heal`}return n});return e.critical=!0,e}function Xo(e){try{return es(e)??{}}catch{return{}}}function Zo(e,t){if(Qo(e,t)!==!1)return{structuredContent:t,action:null};try{let n=Xo(e);if($o(n)&&$o(t)){let r={...n,...t};if(Qo(e,r)!==!1)return{structuredContent:r,action:`heal`}}return{structuredContent:n,action:`fallback-zero-value`}}catch{return{structuredContent:t,action:null}}}function Qo(e,t){let n=e.safeParse;if(typeof n==`function`)try{return n(t).success}catch{return}}function $o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function es(e){if(!e)return{};if(e.anyOf){let t=e.anyOf.find(e=>e.type!==`null`);return t?es(t):null}let t=e._def?.typeName;if(t&&!e.type)switch(t){case`ZodObject`:{let t={},n=null;try{n=e.shape??(typeof e._def?.shape==`function`?e._def.shape():e._def?.shape)}catch{n=null}if(n)for(let[e,r]of Object.entries(n))try{t[e]=es(r)}catch{t[e]=null}return t}case`ZodArray`:return[];case`ZodString`:return``;case`ZodNumber`:return 0;case`ZodBoolean`:return!1;case`ZodNullable`:return null;case`ZodOptional`:return;case`ZodRecord`:return{};case`ZodEnum`:return e._def?.values?.[0]??``;default:return{}}switch(e.type){case`object`:{let t={},n=e.properties??e.shape;if(n)for(let[e,r]of Object.entries(n))t[e]=es(r);return t}case`array`:return[];case`string`:return``;case`number`:case`integer`:return 0;case`boolean`:return!1;case`nullable`:return null;case`optional`:return;case`record`:return{};case`enum`:return e.options?.[0]??Object.values(e.enum??e._def?.entries??{})[0]??``;default:return{}}}function ts(e){if(!e)return{};try{let t=es(e);return $o(t)?t:{}}catch{return{}}}const ns=Symbol(`toolPipelineState`);function rs(e){return e[ns]}function is(e,t){e[ns]=t}function as(e,t){return t?async(...n)=>{let r=await e(...n);if(!r||typeof r!=`object`)return r;let i=r;return!(`content`in i)||i.structuredContent!=null&&typeof i.structuredContent==`object`?r:(i.structuredContent=ts(t),i.structuredContent??={},r)}:e}function os(e,t,n=``,r,i){let a=rs(e);if(a){a.pipeline=t,a.prefix=n,r!==void 0&&(a.eventBus=r),i!==void 0&&(a.workspaceId=i);return}let o={originalRegisterTool:e.registerTool.bind(e),pipeline:t,prefix:n,eventBus:r,workspaceId:i};is(e,o),e.registerTool=(n,r,i)=>{let a=rs(e),s=a?.prefix?`${a.prefix}${n}`:n;if(!i)return a?.originalRegisterTool(s,r);let c=r?.outputSchema;if((a?.pipeline??t).getMiddlewareNames().length===0){let e=as(i,c);return a?.originalRegisterTool(s,r,e)}let l=U(n),u=a??o,d=as(u.pipeline.wrap(n,i,r,l,u.eventBus,u.workspaceId),c);return a?.originalRegisterTool(s,r,d)}}const ss={analyze:1,audit:1,check:2,codemod:2,config:0,delegate:3,digest:1,env:0,eval:2,evidence_map:2,file_summary:1,find:1,flow:3,forge_ground:2,git:1,graph:1,measure:1,onboard:3,parse_output:1,present:1,process:3,produce_knowledge:3,queue:3,reindex:3,rename:2,replay:1,restore:2,scope_map:1,search:1,session:2,status:0,symbol:1,test_run:2,trace:1,web_fetch:1,web_search:1};function cs(e,t){return e.filter(e=>(ss[e]??0)<=t)}const ls=new Set([`status`,`config`]),us={full:{description:`All tools enabled (default)`,includeCategories:[]},safe:{description:`Read-only tools — no file/state modifications`,includeCategories:[`search`,`analysis`,`compression`,`utilities`,`system`,`git`,`flow`],excludeTools:[`reindex`,`onboard`]},research:{description:`Search, analysis, knowledge, and web access`,includeCategories:[`search`,`analysis`,`knowledge`,`compression`,`web`,`system`,`flow`]},minimal:{description:`Essential tools only — search, status, basic operations`,includeCategories:[`search`,`system`],includeTools:[`file_summary`,`check`,`test_run`]},discovery:{description:`Full toolset plus discovery-oriented meta-tools for guided tool exploration`,includeCategories:[],includeTools:[`list_tools`],excludeTools:[`describe_tool`,`search_tools`]}};function ds(e,t){let n=us[e];if(n)return n;let r=t?.[e];if(r)return r;throw Error(`Unknown tool profile: ${e}`)}function fs(e,t,n){return t.includes(`*`)?!0:(n[e]?.category??[]).some(e=>t.includes(e))}function ps(e,t,n,r){if(t.includes(`*`)){for(let t of n)e.add(t);return}for(let i of n)fs(i,t,r)&&e.add(i)}function ms(e,t,n){if(t.includes(`*`)){e.clear();return}for(let r of[...e])fs(r,t,n)&&e.delete(r)}function hs(e,t,n){if(!e||e.length===0||e.includes(`*`))return new Set(t);let r=new Set;return ps(r,e,t,n),r}function gs(e,t){return e===void 0?t:t===void 0?e:Math.min(e,t)}function _s(e,t){for(let n of[...e])t[n]?.annotations?.readOnlyHint===!1&&e.delete(n)}function vs(e,t,n=0,r=[]){if(n>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...r,e].join(` -> `)}`);if(r.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...r,e].join(` -> `)}`);let i=ds(e,t);return gs(i.extends?vs(i.extends,t,n+1,[...r,e]):void 0,i.maxTier)}function ys(e,t,n,r){let i=(e,a,o)=>{if(a>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...o,e].join(` -> `)}`);if(o.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...o,e].join(` -> `)}`);let s=ds(e,r),c=[...o,e],l=s.extends?i(s.extends,a+1,c):hs(s.includeCategories,t,n);s.extends&&s.includeCategories?.length&&ps(l,s.includeCategories,t,n),s.excludeCategories?.length&&ms(l,s.excludeCategories,n);for(let e of s.includeTools??[])l.add(e);for(let e of s.excludeTools??[])l.delete(e);return l},a=i(e,0,[]),o=vs(e,r);if(o!==void 0){let e=cs([...a],o);a.clear();for(let t of e)a.add(t)}for(let e of ls)a.add(e);return e===`safe`&&_s(a,n),a}const bs=new Set([`search`,`analysis`,`knowledge`,`compression`,`forge`,`presentation`,`execution`,`manipulation`,`session`,`git`,`process`,`system`,`meta`,`utilities`,`web`,`queue`,`flow`]);function xs(e,t,n,r){let i=process.env.AIKIT_TOOLSET||e.toolProfile||`full`,a=ys(i,t,n,r);if(e.features&&e.features.length>0){let i=e.features.filter(e=>!bs.has(e));if(i.length>0)throw Error(`Unknown feature group(s): ${i.join(`, `)}. Valid categories: ${[...bs].join(`, `)}`);let o={description:`Synthetic profile from features config`,includeCategories:e.features},s=ys(`_features`,t,n,{...r,_features:o});for(let e of a)!s.has(e)&&!ls.has(e)&&a.delete(e)}if(e.readOnly)for(let e of[...a])n[e]?.annotations?.readOnlyHint===!1&&!ls.has(e)&&a.delete(e);for(let e of ls)a.add(e);return i===`safe`&&_s(a,n),a}const Ss=I.object({mode:I.enum([`wasm`,`regex`,`unknown`]),reason:I.string(),pathsChecked:I.array(I.object({path:I.string(),exists:I.boolean()})),os:I.string(),arch:I.string(),nodeVersion:I.string(),webTreeSitterImportable:I.boolean(),healAttempted:I.boolean(),healSuccess:I.boolean(),healError:I.string().nullable(),initError:I.string().nullable(),wasmDir:I.string().nullable(),grammarCount:I.number()}),Cs=I.object({kind:I.enum([`onboard`,`update_onboard`,`reindex`,`handoff`,`proceed`]),reason:I.string(),command:I.string().optional()}),ws=I.object({title:I.string(),insight:I.string(),confidence:I.number()}),Ts=I.object({lessons:I.array(ws),conventions:I.array(I.object({title:I.string(),preview:I.string()})),checkpoint:I.string().nullable()});I.object({totalRecords:I.number(),totalFiles:I.number(),lastIndexedAt:I.string().nullable(),onboarded:I.boolean(),onboardDir:I.string(),contentTypes:I.record(I.string(),I.number()),wasmAvailable:I.boolean(),wasmDiagnostics:Ss,graphStats:I.object({nodes:I.number(),edges:I.number()}).nullable(),curatedCount:I.number(),serverVersion:I.string(),scaffoldVersion:I.string().nullable(),workspaceScaffoldVersion:I.string().nullable(),upgradeAvailable:I.boolean(),sessionTokens:I.object({callCount:I.number(),totalInputChars:I.number(),totalOutputChars:I.number(),estInputTokens:I.number(),estTotalTokens:I.number(),startTime:I.string()}).optional(),storeBackend:I.string().optional(),storeDiagnostics:I.object({adapterType:I.string(),vectorSearchEnabled:I.boolean(),ftsEnabled:I.boolean(),degradedMode:I.boolean(),dbPath:I.string(),dbSizeBytes:I.number().nullable(),embeddingDim:I.number(),vectorDtype:I.string()}).nullable().optional(),contextPressure:I.number().min(0).max(100).describe(`0–100 score indicating AI Kit saturation`),nextAction:Cs,prelude:Ts.nullable().optional()}).catchall(I.any()),I.object({ok:I.boolean(),checks:I.array(I.object({name:I.string(),ok:I.boolean(),message:I.string().optional()}))});const Es=I.object({summary:I.object({totalFiles:I.number(),totalLines:I.number(),totalCodeLines:I.number(),totalFunctions:I.number(),avgComplexity:I.number(),maxComplexity:I.object({value:I.number(),file:I.string()})}),files:I.array(I.object({path:I.string(),lines:I.number(),code:I.number(),complexity:I.number(),functions:I.number()}))}),Ds=I.object({platform:I.string(),arch:I.string(),nodeVersion:I.string(),cwd:I.string(),cpus:I.number(),memoryFreeGb:I.number(),memoryTotalGb:I.number()});I.object({iso:I.string(),unix:I.number(),timezone:I.string(),formatted:I.string()});const Os=I.object({passed:I.boolean(),errorCount:I.number(),warningCount:I.number(),topErrors:I.array(I.string())}),ks=I.object({passed:I.boolean(),tsc:Os,biome:Os}),As=I.object({name:I.string(),path:I.string(),depth:I.number()}),js=I.object({name:I.string(),definedIn:I.object({path:I.string(),line:I.number(),kind:I.string(),signature:I.string().optional()}).nullable(),importedBy:I.array(I.object({path:I.string(),line:I.number(),importStatement:I.string()})),referencedIn:I.array(I.object({path:I.string(),line:I.number(),context:I.string(),scope:I.string().optional()})),graphContext:I.object({definingModule:I.string().optional(),importedByModules:I.array(I.string()),siblingSymbols:I.array(I.string())}).nullable(),trace:I.object({callers:I.array(As),callees:I.array(As)}).nullable(),confidence:I.number().nullable(),method:I.string().nullable(),rationale:I.string().nullable(),error:I.string().optional()}),Ms=I.object({symbols:I.array(js)}),Ns=I.object({sourcePath:I.string(),contentType:I.string(),score:I.number(),headingPath:I.string().optional(),startLine:I.number().optional(),endLine:I.number().optional(),origin:I.string().optional(),category:I.string().optional(),tags:I.array(I.string()).optional()}),Ps=I.object({results:I.array(Ns),totalResults:I.number(),searchMode:I.string(),query:I.string(),ref:I.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Fs=I.object({path:I.string(),line:I.number().optional(),matchType:I.string(),preview:I.string()}),Is=I.object({matches:I.array(Fs),totalMatches:I.number(),pattern:I.string(),truncated:I.boolean(),ref:I.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Ls=I.object({path:I.string(),relevance:I.number(),estimatedTokens:I.number(),focusLines:I.array(I.string()).optional()}),Rs=I.object({files:I.array(Ls),totalFiles:I.number(),totalEstimatedTokens:I.number(),task:I.string()}),zs=I.object({path:I.string(),impact:I.string(),reason:I.string()}),Bs=I.object({changedFiles:I.array(I.string()),affectedFiles:I.array(zs),totalAffected:I.number(),riskLevel:I.string()}),Vs=I.object({name:I.string(),passed:I.boolean(),message:I.string().optional(),severity:I.string().optional()}),Hs=I.object({passed:I.boolean(),score:I.number(),checks:I.array(Vs),summary:I.string()}),Us=I.object({id:I.string(),name:I.string(),type:I.string(),sourcePath:I.string().optional()}),Ws=I.object({fromId:I.string(),toId:I.string(),fromName:I.string(),toName:I.string(),type:I.string()}),Gs=I.object({id:I.string(),name:I.string(),type:I.string()}),Ks=I.object({id:I.string(),nodeCount:I.number(),types:I.record(I.string(),I.number()),samples:I.array(Gs)}),qs=I.object({nodes:I.array(Us),edges:I.array(Ws),communities:I.array(Ks).optional(),totalNodes:I.number(),totalEdges:I.number(),query:I.string()});I.object({symbols:I.array(I.object({name:I.string(),path:I.string(),line:I.number().optional(),kind:I.string()})),totalDead:I.number()});const Js=I.object({gitRoot:I.string(),branch:I.string(),commitCount:I.number(),hasUncommitted:I.boolean(),recentCommits:I.array(I.object({hash:I.string(),message:I.string(),author:I.string(),date:I.string()}))}),Ys=I.object({sourceId:I.string(),value:I.string()}),Xs=I.object({id:I.string(),originalChars:I.number(),keptChars:I.number(),segmentsKept:I.number(),segmentsTotal:I.number()}),Zs=I.object({text:I.string().describe(`The compressed digest text output`),ref:I.string().optional().describe(`Reusable cache reference`),fields:I.record(I.string(),I.array(Ys)),sourceStats:I.array(Xs),totalOriginalChars:I.number(),totalCompressedChars:I.number(),ratio:I.number()}),Qs=I.object({passed:I.boolean(),totalTests:I.number(),passedTests:I.number(),failedTests:I.number(),skippedTests:I.number(),duration:I.number().describe(`Duration in milliseconds`),failures:I.array(I.object({name:I.string(),message:I.string(),file:I.string().optional()}))}),$s=k(`utils:enrich`);async function G(e,t){let n={curated:[],graph:[]},r=t.limit??3,[i,a]=await Promise.allSettled([ec(e,t.query,r),tc(e,t.filePath)]);return i.status===`fulfilled`?n.curated=i.value:$s.debug(`Curated enrichment failed`,{error:i.reason}),a.status===`fulfilled`?n.graph=a.value:$s.debug(`Graph enrichment failed`,{error:a.reason}),n}async function ec(e,t,n){if(!e.store||!t)return[];try{let r=await e.store.ftsSearch(t,{origin:`curated`,limit:n});if(r.length>0)return r.map(e=>nc(e.record));if(e.embedder){let r=await e.embedder.embedQuery(t);return(await e.store.search(r,{origin:`curated`,limit:n,minScore:.3})).map(e=>nc(e.record))}return[]}catch(e){return $s.debug(`Curated enrichment failed`,{error:e}),[]}}async function tc(e,t){if(!e.graphStore||!t)return[];try{let n=await e.graphStore.findNodes({sourcePath:t,limit:1});if(n.length===0){let r=t.split(/[/\\]/).pop()?.replace(/\.\w+$/,``)||``;if(!r)return[];let i=await e.graphStore.findNodes({namePattern:r,type:`module`,limit:1});if(i.length===0)return[];n.push(i[0])}let r=n[0],i=await e.graphStore.getNeighbors(r.id,{direction:`both`,limit:10}),a=[];for(let e of i.edges){let t=e.fromId===r.id?e.toId:e.fromId,n=i.nodes.find(e=>e.id===t);if(!n)continue;let o=e.fromId===r.id?`->`:`<-`;a.push(`${o} ${e.type}: ${n.name} (${n.type})`)}return a}catch(e){return $s.debug(`Graph enrichment failed`,{error:e}),[]}}function K(e){let t=[];if(e.curated.length>0){t.push(`**Curated Knowledge:**`);for(let n of e.curated)t.push(`- ${n}`)}if(e.graph.length>0){t.push(`**Graph Context:**`);for(let n of e.graph)t.push(`- ${n}`)}return t.length===0?``:`\n\n---\n### Enrichment\n${t.join(`
30
+ Failed to read skill file.`}return{contents:[{uri:`aikit://skill/SKILL.md`,text:t,mimeType:`text/markdown`}]}}),r?Fo.debug(`Workspace skill resources registered`,{skillDir:r}):Fo.debug(`skillDir not configured — skill resources registered with diagnostic messages`)}new Set(Object.entries(Fa).filter(([e,t])=>t.planner?.effect===`read`).map(([e])=>e)),new Set(Object.entries(Fa).filter(([e,t])=>{let n=t.planner?.effect;return n===`write`||n===`mixed`||n===`destructive`}).map(([e])=>e)),new Set(Object.entries(Fa).filter(([e,t])=>t.planner?.costClass===`tiny`).map(([e])=>e));const Uo=[`er_push`,`er_pull`,`er_sync_status`],Wo=[...Uo,`er_update_policy`,`er_evolve_review`],Go=new Set(Wo);function Ko(e){return e.toolProfiles}const qo=5e3,Jo=k(`structured-content-guard`);function Yo(){let e=(async(e,t)=>{let n;try{n=await t()}catch(e){n={content:[{type:`text`,text:`[ERROR:INTERNAL] ${e instanceof Error?e.message:String(e)}`}],isError:!0}}let r=(e.toolConfig??{}).outputSchema;if(r==null)return n;let i=null;if(n.structuredContent==null){let t=Xo(r);n.structuredContent=t,i=`synthesize`,n.structuredContent??(n.structuredContent={},i=`synthesize-null-fallback`,Jo.error(`synthesizeStructuredContent returned null/undefined — using empty fallback`,{tool:e.toolName}))}let a=Zo(r,n.structuredContent);if(a.action!=null&&(n.structuredContent=a.structuredContent,i=a.action),$o(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),Qo(r,n.structuredContent)===!1){let e=Xo(r);n.structuredContent=e??{},Qo(r,n.structuredContent)===!1?(n.structuredContent=$o(n.structuredContent)?n.structuredContent:{},i=`final-validation-failed`):i??=`final-heal`}return n});return e.critical=!0,e}function Xo(e){try{return es(e)??{}}catch{return{}}}function Zo(e,t){if(Qo(e,t)!==!1)return{structuredContent:t,action:null};try{let n=Xo(e);if($o(n)&&$o(t)){let r={...n,...t};if(Qo(e,r)!==!1)return{structuredContent:r,action:`heal`}}return{structuredContent:n,action:`fallback-zero-value`}}catch{return{structuredContent:t,action:null}}}function Qo(e,t){let n=e.safeParse;if(typeof n==`function`)try{return n(t).success}catch{return}}function $o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function es(e){if(!e)return{};if(e.anyOf){let t=e.anyOf.find(e=>e.type!==`null`);return t?es(t):null}let t=e._def?.typeName;if(t&&!e.type)switch(t){case`ZodObject`:{let t={},n=null;try{n=e.shape??(typeof e._def?.shape==`function`?e._def.shape():e._def?.shape)}catch{n=null}if(n)for(let[e,r]of Object.entries(n))try{t[e]=es(r)}catch{t[e]=null}return t}case`ZodArray`:return[];case`ZodString`:return``;case`ZodNumber`:return 0;case`ZodBoolean`:return!1;case`ZodNullable`:return null;case`ZodOptional`:return;case`ZodRecord`:return{};case`ZodEnum`:return e._def?.values?.[0]??``;default:return{}}switch(e.type){case`object`:{let t={},n=e.properties??e.shape;if(n)for(let[e,r]of Object.entries(n))t[e]=es(r);return t}case`array`:return[];case`string`:return``;case`number`:case`integer`:return 0;case`boolean`:return!1;case`nullable`:return null;case`optional`:return;case`record`:return{};case`enum`:return e.options?.[0]??Object.values(e.enum??e._def?.entries??{})[0]??``;default:return{}}}function ts(e){if(!e)return{};try{let t=es(e);return $o(t)?t:{}}catch{return{}}}const ns=Symbol(`toolPipelineState`);function rs(e){return e[ns]}function is(e,t){e[ns]=t}function as(e,t){return t?async(...n)=>{let r=await e(...n);if(!r||typeof r!=`object`)return r;let i=r;return!(`content`in i)||i.structuredContent!=null&&typeof i.structuredContent==`object`?r:(i.structuredContent=ts(t),i.structuredContent??={},r)}:e}function os(e,t,n=``,r,i){let a=rs(e);if(a){a.pipeline=t,a.prefix=n,r!==void 0&&(a.eventBus=r),i!==void 0&&(a.workspaceId=i);return}let o={originalRegisterTool:e.registerTool.bind(e),pipeline:t,prefix:n,eventBus:r,workspaceId:i};is(e,o),e.registerTool=(n,r,i)=>{let a=rs(e),s=a?.prefix?`${a.prefix}${n}`:n;if(!i)return a?.originalRegisterTool(s,r);let c=r?.outputSchema;if((a?.pipeline??t).getMiddlewareNames().length===0){let e=as(i,c);return a?.originalRegisterTool(s,r,e)}let l=U(n),u=a??o,d=as(u.pipeline.wrap(n,i,r,l,u.eventBus,u.workspaceId),c);return a?.originalRegisterTool(s,r,d)}}const ss={analyze:1,audit:1,check:2,codemod:2,config:0,delegate:3,digest:1,env:0,eval:2,evidence_map:2,file_summary:1,find:1,flow:3,forge_ground:2,git:1,graph:1,measure:1,onboard:3,parse_output:1,present:1,process:3,produce_knowledge:3,queue:3,reindex:3,rename:2,replay:1,restore:2,scope_map:1,search:1,session:2,status:0,symbol:1,test_run:2,trace:1,web_fetch:1,web_search:1};function cs(e,t){return e.filter(e=>(ss[e]??0)<=t)}const ls=new Set([`status`,`config`]),us={full:{description:`All tools enabled (default)`,includeCategories:[]},safe:{description:`Read-only tools — no file/state modifications`,includeCategories:[`search`,`analysis`,`compression`,`utilities`,`system`,`git`,`flow`],excludeTools:[`reindex`,`onboard`]},research:{description:`Search, analysis, knowledge, and web access`,includeCategories:[`search`,`analysis`,`knowledge`,`compression`,`web`,`system`,`flow`]},minimal:{description:`Essential tools only — search, status, basic operations`,includeCategories:[`search`,`system`],includeTools:[`file_summary`,`check`,`test_run`]},discovery:{description:`Full toolset plus discovery-oriented meta-tools for guided tool exploration`,includeCategories:[],includeTools:[`list_tools`],excludeTools:[`describe_tool`,`search_tools`]}};function ds(e,t){let n=us[e];if(n)return n;let r=t?.[e];if(r)return r;throw Error(`Unknown tool profile: ${e}`)}function fs(e,t,n){return t.includes(`*`)?!0:(n[e]?.category??[]).some(e=>t.includes(e))}function ps(e,t,n,r){if(t.includes(`*`)){for(let t of n)e.add(t);return}for(let i of n)fs(i,t,r)&&e.add(i)}function ms(e,t,n){if(t.includes(`*`)){e.clear();return}for(let r of[...e])fs(r,t,n)&&e.delete(r)}function hs(e,t,n){if(!e||e.length===0||e.includes(`*`))return new Set(t);let r=new Set;return ps(r,e,t,n),r}function gs(e,t){return e===void 0?t:t===void 0?e:Math.min(e,t)}function _s(e,t){for(let n of[...e])t[n]?.annotations?.readOnlyHint===!1&&e.delete(n)}function vs(e,t,n=0,r=[]){if(n>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...r,e].join(` -> `)}`);if(r.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...r,e].join(` -> `)}`);let i=ds(e,t);return gs(i.extends?vs(i.extends,t,n+1,[...r,e]):void 0,i.maxTier)}function ys(e,t,n,r){let i=(e,a,o)=>{if(a>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...o,e].join(` -> `)}`);if(o.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...o,e].join(` -> `)}`);let s=ds(e,r),c=[...o,e],l=s.extends?i(s.extends,a+1,c):hs(s.includeCategories,t,n);s.extends&&s.includeCategories?.length&&ps(l,s.includeCategories,t,n),s.excludeCategories?.length&&ms(l,s.excludeCategories,n);for(let e of s.includeTools??[])l.add(e);for(let e of s.excludeTools??[])l.delete(e);return l},a=i(e,0,[]),o=vs(e,r);if(o!==void 0){let e=cs([...a],o);a.clear();for(let t of e)a.add(t)}for(let e of ls)a.add(e);return e===`safe`&&_s(a,n),a}const bs=new Set([`search`,`analysis`,`knowledge`,`compression`,`forge`,`presentation`,`execution`,`manipulation`,`session`,`git`,`process`,`system`,`meta`,`utilities`,`web`,`queue`,`flow`]);function xs(e,t,n,r){let i=process.env.AIKIT_TOOLSET||e.toolProfile||`full`,a=ys(i,t,n,r);if(e.features&&e.features.length>0){let i=e.features.filter(e=>!bs.has(e));if(i.length>0)throw Error(`Unknown feature group(s): ${i.join(`, `)}. Valid categories: ${[...bs].join(`, `)}`);let o={description:`Synthetic profile from features config`,includeCategories:e.features},s=ys(`_features`,t,n,{...r,_features:o});for(let e of a)!s.has(e)&&!ls.has(e)&&a.delete(e)}if(e.readOnly)for(let e of[...a])n[e]?.annotations?.readOnlyHint===!1&&!ls.has(e)&&a.delete(e);for(let e of ls)a.add(e);return i===`safe`&&_s(a,n),a}const Ss=I.object({mode:I.enum([`wasm`,`regex`,`unknown`]),reason:I.string(),pathsChecked:I.array(I.object({path:I.string(),exists:I.boolean()})),os:I.string(),arch:I.string(),nodeVersion:I.string(),webTreeSitterImportable:I.boolean(),healAttempted:I.boolean(),healSuccess:I.boolean(),healError:I.string().nullable(),initError:I.string().nullable(),wasmDir:I.string().nullable(),grammarCount:I.number()}),Cs=I.object({kind:I.enum([`onboard`,`update_onboard`,`reindex`,`handoff`,`proceed`]),reason:I.string(),command:I.string().optional()}),ws=I.object({title:I.string(),insight:I.string(),confidence:I.number()}),Ts=I.object({lessons:I.array(ws),conventions:I.array(I.object({title:I.string(),preview:I.string()})),checkpoint:I.string().nullable()});I.object({totalRecords:I.number(),totalFiles:I.number(),lastIndexedAt:I.string().nullable(),lastSourceIndexedAt:I.string().nullable().optional(),onboarded:I.boolean(),onboardDir:I.string(),contentTypes:I.record(I.string(),I.number()),wasmAvailable:I.boolean(),wasmDiagnostics:Ss,graphStats:I.object({nodes:I.number(),edges:I.number()}).nullable(),curatedCount:I.number(),serverVersion:I.string(),scaffoldVersion:I.string().nullable(),workspaceScaffoldVersion:I.string().nullable(),upgradeAvailable:I.boolean(),sessionTokens:I.object({callCount:I.number(),totalInputChars:I.number(),totalOutputChars:I.number(),estInputTokens:I.number(),estTotalTokens:I.number(),startTime:I.string()}).optional(),storeBackend:I.string().optional(),storeDiagnostics:I.object({adapterType:I.string(),vectorSearchEnabled:I.boolean(),ftsEnabled:I.boolean(),degradedMode:I.boolean(),dbPath:I.string(),dbSizeBytes:I.number().nullable(),embeddingDim:I.number(),vectorDtype:I.string()}).nullable().optional(),contextPressure:I.number().min(0).max(100).describe(`0–100 score indicating AI Kit saturation`),nextAction:Cs,prelude:Ts.nullable().optional()}).catchall(I.any()),I.object({ok:I.boolean(),checks:I.array(I.object({name:I.string(),ok:I.boolean(),message:I.string().optional()}))});const Es=I.object({summary:I.object({totalFiles:I.number(),totalLines:I.number(),totalCodeLines:I.number(),totalFunctions:I.number(),avgComplexity:I.number(),maxComplexity:I.object({value:I.number(),file:I.string()})}),files:I.array(I.object({path:I.string(),lines:I.number(),code:I.number(),complexity:I.number(),functions:I.number()}))}),Ds=I.object({platform:I.string(),arch:I.string(),nodeVersion:I.string(),cwd:I.string(),cpus:I.number(),memoryFreeGb:I.number(),memoryTotalGb:I.number()});I.object({iso:I.string(),unix:I.number(),timezone:I.string(),formatted:I.string()});const Os=I.object({passed:I.boolean(),errorCount:I.number(),warningCount:I.number(),topErrors:I.array(I.string())}),ks=I.object({passed:I.boolean(),tsc:Os,biome:Os}),As=I.object({name:I.string(),path:I.string(),depth:I.number()}),js=I.object({name:I.string(),definedIn:I.object({path:I.string(),line:I.number(),kind:I.string(),signature:I.string().optional()}).nullable(),importedBy:I.array(I.object({path:I.string(),line:I.number(),importStatement:I.string()})),referencedIn:I.array(I.object({path:I.string(),line:I.number(),context:I.string(),scope:I.string().optional()})),graphContext:I.object({definingModule:I.string().optional(),importedByModules:I.array(I.string()),siblingSymbols:I.array(I.string())}).nullable(),trace:I.object({callers:I.array(As),callees:I.array(As)}).nullable(),confidence:I.number().nullable(),method:I.string().nullable(),rationale:I.string().nullable(),error:I.string().optional()}),Ms=I.object({symbols:I.array(js)}),Ns=I.object({sourcePath:I.string(),contentType:I.string(),score:I.number(),headingPath:I.string().optional(),startLine:I.number().optional(),endLine:I.number().optional(),origin:I.string().optional(),category:I.string().optional(),tags:I.array(I.string()).optional()}),Ps=I.object({results:I.array(Ns),totalResults:I.number(),searchMode:I.string(),query:I.string(),ref:I.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Fs=I.object({path:I.string(),line:I.number().optional(),matchType:I.string(),preview:I.string()}),Is=I.object({matches:I.array(Fs),totalMatches:I.number(),pattern:I.string(),truncated:I.boolean(),ref:I.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Ls=I.object({path:I.string(),relevance:I.number(),estimatedTokens:I.number(),focusLines:I.array(I.string()).optional()}),Rs=I.object({files:I.array(Ls),totalFiles:I.number(),totalEstimatedTokens:I.number(),task:I.string()}),zs=I.object({path:I.string(),impact:I.string(),reason:I.string()}),Bs=I.object({changedFiles:I.array(I.string()),affectedFiles:I.array(zs),totalAffected:I.number(),riskLevel:I.string()}),Vs=I.object({name:I.string(),passed:I.boolean(),message:I.string().optional(),severity:I.string().optional()}),Hs=I.object({passed:I.boolean(),score:I.number(),checks:I.array(Vs),summary:I.string()}),Us=I.object({id:I.string(),name:I.string(),type:I.string(),sourcePath:I.string().optional()}),Ws=I.object({fromId:I.string(),toId:I.string(),fromName:I.string(),toName:I.string(),type:I.string()}),Gs=I.object({id:I.string(),name:I.string(),type:I.string()}),Ks=I.object({id:I.string(),nodeCount:I.number(),types:I.record(I.string(),I.number()),samples:I.array(Gs)}),qs=I.object({nodes:I.array(Us),edges:I.array(Ws),communities:I.array(Ks).optional(),totalNodes:I.number(),totalEdges:I.number(),query:I.string()});I.object({symbols:I.array(I.object({name:I.string(),path:I.string(),line:I.number().optional(),kind:I.string()})),totalDead:I.number()});const Js=I.object({gitRoot:I.string(),branch:I.string(),commitCount:I.number(),hasUncommitted:I.boolean(),recentCommits:I.array(I.object({hash:I.string(),message:I.string(),author:I.string(),date:I.string()}))}),Ys=I.object({sourceId:I.string(),value:I.string()}),Xs=I.object({id:I.string(),originalChars:I.number(),keptChars:I.number(),segmentsKept:I.number(),segmentsTotal:I.number()}),Zs=I.object({text:I.string().describe(`The compressed digest text output`),ref:I.string().optional().describe(`Reusable cache reference`),fields:I.record(I.string(),I.array(Ys)),sourceStats:I.array(Xs),totalOriginalChars:I.number(),totalCompressedChars:I.number(),ratio:I.number()}),Qs=I.object({passed:I.boolean(),totalTests:I.number(),passedTests:I.number(),failedTests:I.number(),skippedTests:I.number(),duration:I.number().describe(`Duration in milliseconds`),failures:I.array(I.object({name:I.string(),message:I.string(),file:I.string().optional()}))}),$s=k(`utils:enrich`);async function G(e,t){let n={curated:[],graph:[]},r=t.limit??3,[i,a]=await Promise.allSettled([ec(e,t.query,r),tc(e,t.filePath)]);return i.status===`fulfilled`?n.curated=i.value:$s.debug(`Curated enrichment failed`,{error:i.reason}),a.status===`fulfilled`?n.graph=a.value:$s.debug(`Graph enrichment failed`,{error:a.reason}),n}async function ec(e,t,n){if(!e.store||!t)return[];try{let r=await e.store.ftsSearch(t,{origin:`curated`,limit:n});if(r.length>0)return r.map(e=>nc(e.record));if(e.embedder){let r=await e.embedder.embedQuery(t);return(await e.store.search(r,{origin:`curated`,limit:n,minScore:.3})).map(e=>nc(e.record))}return[]}catch(e){return $s.debug(`Curated enrichment failed`,{error:e}),[]}}async function tc(e,t){if(!e.graphStore||!t)return[];try{let n=await e.graphStore.findNodes({sourcePath:t,limit:1});if(n.length===0){let r=t.split(/[/\\]/).pop()?.replace(/\.\w+$/,``)||``;if(!r)return[];let i=await e.graphStore.findNodes({namePattern:r,type:`module`,limit:1});if(i.length===0)return[];n.push(i[0])}let r=n[0],i=await e.graphStore.getNeighbors(r.id,{direction:`both`,limit:10}),a=[];for(let e of i.edges){let t=e.fromId===r.id?e.toId:e.fromId,n=i.nodes.find(e=>e.id===t);if(!n)continue;let o=e.fromId===r.id?`->`:`<-`;a.push(`${o} ${e.type}: ${n.name} (${n.type})`)}return a}catch(e){return $s.debug(`Graph enrichment failed`,{error:e}),[]}}function K(e){let t=[];if(e.curated.length>0){t.push(`**Curated Knowledge:**`);for(let n of e.curated)t.push(`- ${n}`)}if(e.graph.length>0){t.push(`**Graph Context:**`);for(let n of e.graph)t.push(`- ${n}`)}return t.length===0?``:`\n\n---\n### Enrichment\n${t.join(`
31
31
  `)}`}function nc(e){let t=rc(e.metadata,`title`)||e.sourcePath||`Untitled`;return`[${rc(e.metadata,`category`)}] ${t}: ${e.content.slice(0,200)}`}function rc(e,t){let n=e?.[t];return typeof n==`string`?n:``}function q(e,t,n){return{content:[{type:`text`,text:`[ERROR:${e}] ${t}`}],isError:!0,...n==null?{}:{structuredContent:n}}}function J(e,t){return async(n,r)=>{let i=Date.now(),a=await t(n,r),o=Date.now()-i;return a._meta={...a._meta??{},durationMs:o,toolName:e},a}}const ic=k(`tools`),ac=I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`);function oc(e,t){return t?Vn(e,t):e}function sc(){let e=[];return ur.get()||e.push(`Tree-sitter unavailable — using regex fallback, symbol/pattern confidence reduced`),e.length===0?``:`\n\n> **⚠ Caveats:** ${e.join(`; `)}`}function cc(e){return(e??[]).map(e=>{if(typeof e==`string`)return e;if(e&&typeof e==`object`&&`path`in e)return typeof e.path==`string`?e.path:void 0}).filter(e=>!!e)}function lc(e){let t=[],n=e.filter(e=>/\.(ts|tsx|js|jsx)$/.test(e)&&/(service|store|model|schema|migration)/i.test(e)),r=e.filter(e=>/\.(ts|tsx|js|jsx)$/.test(e)&&!n.includes(e)),i=e.filter(e=>!/\.(ts|tsx|js|jsx)$/.test(e));return(n.length>0||r.length>0||i.length>0)&&(t.push(`
32
32
 
33
33
  ### Risk Assessment`),n.length>0&&t.push(`- 🔴 **High risk** (${n.length}): ${n.slice(0,5).map(e=>`\`${e}\``).join(`, `)}`),r.length>0&&t.push(`- 🟡 **Medium risk** (${r.length}): source files`),i.length>0&&t.push(`- 🟢 **Low risk** (${i.length}): non-source files`)),t.join(`
@@ -3046,14 +3046,14 @@ Use \`status({})\` to check smart indexing queue status.`}]};let u=Lc(l).createT
3046
3046
  `)}\n\nNo violations detected.`;let n=e.violations.map(e=>`- ${e.ruleId} | ${e.tool} | ${e.timestamp}\n ${e.rule}\n Suggestion: ${e.suggestion}`);return`${t.join(`
3047
3047
  `)}\n\nViolations:\n${n.join(`
3048
3048
  `)}`}function z_(e){let t=[e.id,`Label: ${e.label}`,`Created: ${e.createdAt}`];return e.notes&&t.push(`Notes: ${e.notes}`),t.push(``,`Data:`,JSON.stringify(e.data)),t.join(`
3049
- `)}function B_(e){let t=e.trim();if(!t)return``;try{return JSON.parse(t)}catch{return e}}function V_(e){let t=e?.trim();if(!t)return{};let n;try{n=JSON.parse(t)}catch{throw Error(`data must be a valid JSON object string`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`data must be a JSON object string`);return n}let H_={totalInputChars:0,totalOutputChars:0,callCount:0,startTime:new Date().toISOString()};function U_(){return{...H_}}const W_=new Map,G_=[];function K_(){return Array.from(W_.entries()).map(([e,t])=>({tool:e,...t}))}function q_(){return G_}k(`auto-gc`);function J_(){let e=[...q_()];if(e.length<10)return 0;e.sort((e,t)=>e-t);let t=Math.floor(e.length*.95);return e[Math.min(t,e.length-1)]}function Y_(){return{state:`warming`,p95:J_(),lastGcAt:null,gcCount:0,bufferSize:q_().length}}function X_(e){if(!e||!Le(e))return;let t=F(e);if(Fe(t)!==pe.onboard)return;let n=Ie(t);if(Fe(Ie(n))===fe.workspaces)return Sn(n)}function Z_(e){let t=[];if(e?.skillDir)t.push(e.skillDir);else if(e?.onboardDir){let n=X_(e.onboardDir);n&&t.push(n)}return t}function Q_(e){return Z_(e)[0]}const $_=k(`tools`),ev=14400*1e3,tv={includePrelude:I.boolean().default(!1).describe(`Include session prelude with top lessons, conventions, and last checkpoint`)};function nv(e,t,n,r=15e3){let i,a=new Promise(e=>{i=setTimeout(()=>{$_.warn(`Status sub-operation "${n}" timed out after ${r}ms`),e({value:t,timedOut:!0})},r)});return Promise.race([e.then(e=>(clearTimeout(i),{value:e,timedOut:!1}),e=>(clearTimeout(i),$_.warn(`Status sub-operation "${n}" failed: ${e instanceof Error?e.message:String(e)}`),{value:t,timedOut:!1})),a])}function rv(e){return e.onboarded?e.onboardFreshness===`stale`||e.onboardFreshness===`unknown`?{kind:`update_onboard`,reason:`Onboard context is not fresh. Run onboard({ path: ".", update: true }) before relying on package map or architecture context.`,command:`onboard({ path: ".", update: true })`}:e.indexStale?{kind:`reindex`,reason:`Index stale. Run reindex() to update.`}:e.contextPressure>70?{kind:`handoff`,reason:`Context pressure high. Consider session handoff.`}:{kind:`proceed`,reason:`Ready to work.`}:{kind:`onboard`,reason:`Index not initialized. Run onboard({ path: "." }) first.`}}function iv(){let e=ur.get(),t=lr.get();if(e)return`- **Tree-sitter (WASM)**: ✅ Available (${t.grammarCount} grammars, dir: ${t.wasmDir})`;let n=t.pathsChecked.length?t.pathsChecked.map(e=>` ${e.exists?`✓`:`✗`} ${e.path}`).join(`
3049
+ `)}function B_(e){let t=e.trim();if(!t)return``;try{return JSON.parse(t)}catch{return e}}function V_(e){let t=e?.trim();if(!t)return{};let n;try{n=JSON.parse(t)}catch{throw Error(`data must be a valid JSON object string`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`data must be a JSON object string`);return n}let H_={totalInputChars:0,totalOutputChars:0,callCount:0,startTime:new Date().toISOString()};function U_(){return{...H_}}const W_=new Map,G_=[];function K_(){return Array.from(W_.entries()).map(([e,t])=>({tool:e,...t}))}function q_(){return G_}k(`auto-gc`);function J_(){let e=[...q_()];if(e.length<10)return 0;e.sort((e,t)=>e-t);let t=Math.floor(e.length*.95);return e[Math.min(t,e.length-1)]}function Y_(){return{state:`warming`,p95:J_(),lastGcAt:null,gcCount:0,bufferSize:q_().length}}function X_(e){if(!e||!Le(e))return;let t=F(e);if(Fe(t)!==pe.onboard)return;let n=Ie(t);if(Fe(Ie(n))===fe.workspaces)return Sn(n)}function Z_(e){let t=[];if(e?.skillDir)t.push(e.skillDir);else if(e?.onboardDir){let n=X_(e.onboardDir);n&&t.push(n)}return t}function Q_(e){return Z_(e)[0]}const $_=k(`tools`),ev=14400*1e3,tv={includePrelude:I.boolean().default(!1).describe(`Include session prelude with top lessons, conventions, and last checkpoint`)};function nv(e,t,n,r=15e3){let i,a=new Promise(e=>{i=setTimeout(()=>{$_.warn(`Status sub-operation "${n}" timed out after ${r}ms`),e({value:t,timedOut:!0})},r)});return Promise.race([e.then(e=>(clearTimeout(i),{value:e,timedOut:!1}),e=>(clearTimeout(i),$_.warn(`Status sub-operation "${n}" failed: ${e instanceof Error?e.message:String(e)}`),{value:t,timedOut:!1})),a])}function rv(e){return e.onboarded?e.onboardFreshness===`stale`||e.onboardFreshness===`unknown`?{kind:`update_onboard`,reason:`Onboard context is not fresh. Run onboard({ path: ".", update: true }) before relying on package map or architecture context.`,command:`onboard({ path: ".", update: true })`}:e.indexStale?{kind:`reindex`,reason:`Index stale. Run reindex() to update.`}:e.contextPressure>70?{kind:`handoff`,reason:`Context pressure high. Consider session handoff.`}:{kind:`proceed`,reason:`Ready to work.`}:{kind:`onboard`,reason:`Index not initialized. Run onboard({ path: "." }) first.`}}function iv(e){return e.lastSourceIndexedAt??e.lastIndexedAt??null}function av(){let e=ur.get(),t=lr.get();if(e)return`- **Tree-sitter (WASM)**: ✅ Available (${t.grammarCount} grammars, dir: ${t.wasmDir})`;let n=t.pathsChecked.length?t.pathsChecked.map(e=>` ${e.exists?`✓`:`✗`} ${e.path}`).join(`
3050
3050
  `):` none`,r=t.healAttempted?` Auto-heal: ${t.healSuccess?`✓ succeeded`:`✗ failed (${t.healError??`unknown`})`}`:` Auto-heal: not attempted`;return[`- **Tree-sitter (WASM)**: ⚠ Unavailable (regex fallback)`,` Reason: ${t.reason||`unknown`}`,` Paths checked:`,n,r,` OS: ${t.os} ${t.arch} | Node: ${t.nodeVersion}`,` Fix: Reinstall package or run vendor:wasm script`].join(`
3051
- `)}const av=5*6e4;let ov=null,sv=null;function cv(e,t,n,r){let i=Math.min(e/2e4,1),a=Math.min((t+n)/5e4,1),o=Math.min(r/200,1);return Math.round(i*40+a*35+o*25)}function lv(){let e=Date.now();if(ov&&e-ov.ts<av)return ov.value;try{let t=F(Xn(),`.copilot`,`.aikit-scaffold.json`);if(!M(t))return ov={value:null,ts:e},null;let n=JSON.parse(N(t,`utf-8`)).version??null;return ov={value:n,ts:e},n}catch{return ov={value:null,ts:e},null}}function uv(){let e=Date.now();if(sv&&e-sv.ts<av)return sv.value;try{let t=F(process.cwd(),`.github`,`.aikit-scaffold.json`);if(!M(t))return sv={value:null,ts:e},null;let n=JSON.parse(N(t,`utf-8`)).version??null;return sv={value:n,ts:e},n}catch{return sv={value:null,ts:e},null}}function dv(e){let t=U(`status`);e.registerTool(`status`,{title:t.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:tv,annotations:t.annotations},J(`status`,async()=>{let e=C(),t=lv(),n=uv(),r=t!=null&&t!==e,i=n!=null&&n!==e,a=[`## AI Kit Status`,``,`⏳ **AI Kit is initializing** — index stats will be available shortly.`,``,`### Runtime`,`- **Tree-sitter (WASM)**: ${ur.get()?`✅ Available (AST analysis)`:`⚠ Unavailable (regex fallback)`}`,``,`### Version`,`- **Server**: ${e}`,`- **Scaffold (user)**: ${t??`not installed`}`,`- **Scaffold (workspace)**: ${n??`not installed`}`];if(r||i){let o=ne(),s=[];r&&s.push(`user scaffold v${t}`),i&&s.push(`workspace scaffold v${n}`);let c=s.join(`, `);o.state===`success`?a.push(``,`### ✅ Upgrade Applied`,`- Server v${e} — ${c} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):o.state===`pending`?a.push(``,`### ⏳ Upgrade In Progress`,`- Server v${e} ≠ ${c}`,`- Auto-upgrade is running in the background…`):o.state===`failed`?(re(),a.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${e} ≠ ${c}`,`- Error: ${o.error??`unknown`}`)):(re(),a.push(``,`### ⬆ Upgrade Available`,`- Server v${e} ≠ ${c}`,`- Auto-upgrade triggered — check again shortly.`))}let o={totalRecords:0,totalFiles:0,lastIndexedAt:null,onboarded:!1,onboardDir:``,contentTypes:{},wasmAvailable:!!ur.get(),wasmDiagnostics:lr.get(),graphStats:null,curatedCount:0,serverVersion:e,scaffoldVersion:t??null,workspaceScaffoldVersion:n??null,upgradeAvailable:r||i,contextPressure:0,nextAction:rv({onboarded:!1,indexStale:!1,contextPressure:0})};return{content:[{type:`text`,text:a.join(`
3052
- `)}],structuredContent:o}}))}function fv(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){let g=U(`status`);e.registerTool(`status`,{title:g.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:tv,annotations:g.annotations},J(`status`,async({includePrelude:e=!1})=>{let g=[];try{let[_,v]=await Promise.all([nv(t.getStats(),{totalRecords:0,totalFiles:0,lastIndexedAt:null,contentTypeBreakdown:{}},`store.getStats`),nv(t.listSourcePaths(),[],`store.listSourcePaths`)]),y=_.value;_.timedOut&&g.push(`⚠ Index stats timed out — values may be incomplete`);let b=v.value;v.timedOut&&g.push(`⚠ File listing timed out`);let x=b.filter(e=>!e.startsWith(`.ai/curated/context/auto-`)&&!e.startsWith(`.ai/curated/workflow/auto-`)&&!e.includes(`node_modules/`)&&!e.startsWith(`.git/`)),S=b.length-x.length,w=null,T=0,E=[`## AI Kit Status`,``,`- **Total Records**: ${y.totalRecords}`,`- **Total Files**: ${y.totalFiles}`,`- **Last Indexed**: ${y.lastIndexedAt??`Never`}`,``,`### Content Types`,...Object.entries(y.contentTypeBreakdown).map(([e,t])=>`- ${e}: ${t}`),``,`### Indexed Files`,...x.slice(0,50).map(e=>`- ${e}`),x.length>50?`\n... and ${x.length-50} more files`:``,S>0?`\n_(${S} internal/auto-curated files hidden — use \`find\` to explore them)_`:``];if(n)try{let e=await nv(n.getStats(),{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}},`graphStore.getStats`);if(e.timedOut)g.push(`⚠ Graph stats timed out`),E.push(``,`### Knowledge Graph`,`- Graph stats timed out`);else{let t=e.value;w={nodes:t.nodeCount,edges:t.edgeCount},E.push(``,`### Knowledge Graph`,`- **Nodes**: ${t.nodeCount}`,`- **Edges**: ${t.edgeCount}`,...Object.entries(t.nodeTypes).map(([e,t])=>` - ${e}: ${t}`));try{let e=await nv(n.validate(),{valid:!0,danglingEdges:[],orphanNodes:[],stats:{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}}},`graphStore.validate`);if(!e.timedOut){let t=e.value;t.valid||E.push(`- **⚠ Integrity Issues**: ${t.danglingEdges.length} dangling edges`),t.orphanNodes.length>0&&E.push(`- **Orphan nodes**: ${t.orphanNodes.length}`)}}catch{}}}catch{E.push(``,`### Knowledge Graph`,`- Graph store unavailable`)}let te=a?.onboardDir??``,D=M(te),ie=i?.onboardComplete||D,O=ae(te,{lastIndexedAt:y.lastIndexedAt??null});if(E.push(``,`### Onboard Status`,ie?`- ✅ Complete${i?.onboardTimestamp?` (last: ${i.onboardTimestamp})`:``}`:'- ❌ Not run — call `onboard({ path: "." })` to analyze the codebase',`- **Onboard Directory**: \`${te}\``),O){let e=O.packageMap.totalPackages,t=O.freshness.status===`fresh`?`✅`:O.freshness.status===`stale`?`⚠`:`❔`;E.push(`- **Onboard context**: ${O.readInstruction}`,`- **Onboard freshness**: ${t} ${O.freshness.status} (${O.freshness.reason})`,e>0?`- **Package map**: ${e} packages/containers in \`${O.packageMap.sourcePath}\``:"- **Package map**: read `structure.md` and `dependencies.md` from the onboard directory")}if(r)try{let e=await nv(r.count(),0,`curated.count`);e.timedOut?(g.push(`⚠ Curated knowledge count timed out`),E.push(``,`### Curated Knowledge`,`- Listing timed out`)):(T=e.value,E.push(``,`### Curated Knowledge`,T>0?`- ${T} entries`:'- Empty — use `knowledge({ action: "remember", ... })` to persist decisions'))}catch{E.push(``,`### Curated Knowledge`,`- Unable to read curated entries`)}let oe=Un().filter(e=>e.status===`watching`);if(oe.length>0){E.push(``,`### File Watchers`,`- **Active**: ${oe.length}`);for(let e of oe){let t=e.pendingFiles?.length??0;if(E.push(` - \`${e.path}\`: ${e.eventCount} events, ${t} pending files`),t>0&&t<=10)for(let t of e.pendingFiles)E.push(` - \`${t}\``);else t>10&&E.push(` - ${t} pending files (use \`watch({ action: 'list' })\` for details)`)}}let se=cv(y.totalRecords,w?.nodes??0,w?.edges??0,T),ce=y.lastIndexedAt?new Date(y.lastIndexedAt).getTime():0,le=ce>0?Date.now()-ce:1/0,ue=ie&&le>1440*60*1e3,de=rv({onboarded:ie,onboardFreshness:O?.freshness.status??null,indexStale:ue,contextPressure:se});E.push(``),E.push(`## 📊 Context Pressure: ${se}/100`),se>=80?E.push(`⚠️ High pressure — consider pruning stale entries or compacting context.`):se>=50?E.push(`ℹ️ Moderate pressure — AI Kit memory is well-populated.`):E.push(`✅ Low pressure — plenty of headroom for more content.`);let fe=0;if(y.lastIndexedAt){fe=new Date(y.lastIndexedAt).getTime();let e=(Date.now()-fe)/(1e3*60*60);E.push(``,`### Index Freshness`,e>24?o===`smart`?`- ⚠ Last indexed ${Math.floor(e)}h ago — smart indexing will refresh automatically`:`- ⚠ Last indexed ${Math.floor(e)}h ago — may be stale. Run \`reindex({})\``:`- ✅ Last indexed ${e<1?`less than 1h`:`${Math.floor(e)}h`} ago`)}E.push(``,`### Next Action`,`- **${de.kind}**: ${de.reason}`);let pe=null,me=t;if(typeof me.getDiagnostics==`function`)try{let e=me.getDiagnostics();pe={adapterType:e.adapterType,vectorSearchEnabled:e.vectorSearchEnabled,ftsEnabled:e.ftsEnabled,degradedMode:e.degradedMode,dbPath:e.dbPath,dbSizeBytes:e.dbSizeBytes,embeddingDim:e.embeddingDim,vectorDtype:e.vectorDtype},E.push(``,`### Storage`,`- **Backend**: ${a?.store?.backend??`unknown`}`,`- **Adapter**: ${pe.adapterType}`,`- **Vector search**: ${pe.vectorSearchEnabled?`✅ enabled`:`⚠ disabled (FTS-only fallback)`}`,pe.dbPath?`- **DB**: ${pe.dbPath}`:``,pe.dbSizeBytes==null?``:`- **DB size**: ${(pe.dbSizeBytes/1024/1024).toFixed(2)} MB`,`- **Embedding dim**: ${pe.embeddingDim}`,`- **Vector dtype**: ${pe.vectorDtype}`)}catch{}if(o===`smart`)if(E.push(``,`### Smart Indexing`),s){let e=s();e?E.push(`- **Mode**: Smart (trickle)`,`- **Status**: ${e.running?`✅ Running`:`⏸ Stopped`}`,`- **Queue**: ${e.queueSize} files pending`,`- **Changed files**: ${e.changedFilesSize} detected`,`- **Interval**: ${Math.round(e.intervalMs/1e3)}s per batch of ${e.batchSize}`):E.push(`- **Mode**: Smart (trickle)`,`- **Status**: scheduler state unavailable (init may have failed)`)}else E.push(`- **Mode**: Smart (trickle) — scheduler state unavailable`);if(h)try{let e=h.getReport(),t=h.checkThresholds(),n=Object.entries(e.counters),r=Object.entries(e.gauges);if(n.length>0||r.length>0||t.length>0){if(E.push(``,`### 📊 Metrics`),n.length>0){E.push(`**Counters:**`);for(let[e,t]of n)E.push(`- \`${e}\`: ${t}`)}if(r.length>0){E.push(`**Gauges:**`);for(let[e,t]of r)E.push(`- \`${e}\`: ${t}`)}if(t.length>0){E.push(`**⚠ Threshold violations:**`);for(let e of t)E.push(`- ${e}`)}else(n.length>0||r.length>0)&&E.push(`- ✅ All thresholds within limits`)}}catch{E.push(``,`### 📊 Metrics`,`- Metrics unavailable`)}{let e=[];if(u)try{let t=u.getStats();e.push(`- **Decision Hooks**: ${t.count} registered${t.hooks.length>0?` (IDs: ${t.hooks.map(e=>e.id).join(`, `)})`:``}`)}catch{e.push(`- **Decision Hooks**: unavailable`)}else e.push(`- **Decision Hooks**: not configured`);if(d)try{let t=d.getStats(),n=Object.entries(t.byTool).map(([e,t])=>`${e}=${t}`).join(`, `);e.push(`- **Observations**: ${t.totalObservations} total, byTool: ${n||`none`}`)}catch{e.push(`- **Observations**: unavailable`)}else e.push(`- **Observations**: not configured`);if(f)try{let t=f.getStats(),n=Object.keys(t.byName);e.push(`- **Extractors**: ${t.count} registered${n.length>0?` (IDs: ${n.join(`, `)})`:``}`)}catch{e.push(`- **Extractors**: unavailable`)}else e.push(`- **Extractors**: not configured`);if(m)try{let t=m.getStats(),n=t.skillExists?t.isStale?`⚠ Stale`:`✅ Fresh`:`❌ No skill`;e.push(`- **Skill Compiler**: ${n}, version: ${t.skillVersion}, last compiled: ${t.lastCompiledAt?new Date(t.lastCompiledAt).toLocaleString():`Never`}`)}catch{e.push(`- **Skill Compiler**: unavailable`)}else e.push(`- **Skill Compiler**: not configured`);if(p)try{let t=p.getStats();e.push(`- **Promotion Engine**: ${t.held} candidates held, ${t.promoted} promoted, ${t.observedFacts} distinct facts tracked`)}catch{e.push(`- **Promotion Engine**: unavailable`)}else e.push(`- **Promotion Engine**: not configured`);E.push(``,`### 🧩 Feature Coverage`,...e)}let _e=0;{try{let e=a?.stateDir?P(a.stateDir,`stash`):null;if(e&&M(e)){let t=Me(e).mtimeMs;t>fe&&(fe=t)}}catch{}let e=[];if(r)try{let t=T>0?await r.list({limit:5,orderBy:`updated`,order:`desc`}):[];for(let e of t){let t=new Date(e.updated||e.created).getTime();t>fe&&(fe=t)}e.push(...t)}catch{}if(_e=fe>0?Date.now()-fe:0,_e>=ev){let t=Math.floor(_e/36e5);if(E.push(``,`### 🌅 Session Briefing`,`_${t}+ hours since last activity — here's what to pick up:_`,``),e.length>0){E.push(`**Recent decisions/notes:**`);for(let t of e)E.push(`- **${t.title}** (${t.category??`note`}) — ${(t.contentPreview??``).slice(0,80)}…`)}E.push(``,`**Suggested next steps:**`,'- `search({ query: "SESSION CHECKPOINT", origin: "curated" })` — find your last checkpoint',"- `restore({})` — resume from a saved checkpoint",'- `knowledge({ action: "list" })` — browse all stored knowledge')}}E.push(``,`### Runtime`,iv());let ve=ge.instance().getAll(),ye=ve.filter(e=>e.status!==`healthy`);if(ye.length>0){E.push(``,`### ⚠️ Subsystem Health`);for(let e of ye){let t=Math.round((Date.now()-e.since)/1e3);E.push(`- **${e.name}**: ${e.status} (${t}s ago${e.reason?` — ${e.reason}`:``})`)}}else ve.length>0&&E.push(``,`### ✅ Subsystem Health`,`- All ${ve.length} subsystems healthy`);let be=he.getAll();if(be.size>0){E.push(``,`### 🔌 Circuit Breakers`);for(let[e,t]of be){let n=t.getState(),r=`- **${e}**: ${n===`closed`?`🟢`:n===`open`?`🔴`:`🟡`} ${n}`;if(n===`open`){let e=t.remainingCooldownMs();r+=` (recovery in ${Math.ceil(e/1e3)}s)`}E.push(r)}}let k=lv(),xe=uv(),Se=C(),Ce=k!=null&&k!==Se,we=xe!=null&&xe!==Se;if(Ce||we){let e=ne(),t=[];Ce&&t.push(`user scaffold v${k}`),we&&t.push(`workspace scaffold v${xe}`);let n=t.join(`, `);e.state===`success`?E.push(``,`### ✅ Upgrade Applied`,`- Server v${Se} — ${n} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):e.state===`pending`?E.push(``,`### ⏳ Upgrade In Progress`,`- Server v${Se} ≠ ${n}`,`- Auto-upgrade is running in the background…`):e.state===`failed`?(re(),E.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${Se} ≠ ${n}`,`- Error: ${e.error??`unknown`}`)):(re(),E.push(``,`### ⬆ Upgrade Available`,`- Server v${Se} ≠ ${n}`,`- Auto-upgrade triggered — check again shortly.`))}g.length>0&&E.push(``,`### ⚠ Warnings`,...g.map(e=>`- ${e}`));let Te=K_();if(Te.length>0){let e=Te.sort((e,t)=>t.callCount-e.callCount);E.push(``,`### Tool Usage This Session`,``),E.push(`| Tool | Calls | Tokens In | Tokens Out | Errors | Avg Latency |`),E.push(`|------|-------|-----------|------------|--------|-------------|`);for(let t of e.slice(0,15)){let e=Math.round(t.totalInputChars/4),n=Math.round(t.totalOutputChars/4),r=Math.round(t.totalDurationMs/t.callCount);E.push(`| ${t.tool} | ${t.callCount} | ${e.toLocaleString()} | ${n.toLocaleString()} | ${t.errorCount} | ${r}ms |`)}}let A=U_();A.callCount>0&&(E.push(``),E.push(`### Session Token Usage`),E.push(`- Tool calls: ${A.callCount}`),E.push(`- Input chars: ${A.totalInputChars.toLocaleString()}`),E.push(`- Output chars: ${A.totalOutputChars.toLocaleString()}`),E.push(`- Est. input tokens: ${Math.round(A.totalInputChars/4).toLocaleString()}`),E.push(`- Est. total tokens: ${Math.round((A.totalInputChars+A.totalOutputChars)/4).toLocaleString()}`));let Ee=Y_();if(Ee.bufferSize>=10){let e=Ee.state===`healthy`?`🟢`:Ee.state===`degraded`?`🔴`:`🟡`;E.push(``,`### Auto-GC: ${e} ${Ee.state}`),E.push(`- p95 latency: ${Ee.p95}ms | buffer: ${Ee.bufferSize} samples`),Ee.gcCount>0&&E.push(`- GC cycles triggered: ${Ee.gcCount}`)}if(l){let e=l.getStats();if(e.totalSubscribers>0){E.push(``,`### 🔌 Hooks (EventBus Subscribers)`),E.push(`- Total subscribers: ${e.totalSubscribers}`);for(let[t,n]of Object.entries(e.byEvent))E.push(` - ${t}: ${n} subscriber(s)`);for(let t of e.subscriptions)E.push(` - ${t.name} (${t.eventType}, ${t.policy})`);if(e.autoDisabled.length>0){E.push(``),E.push(` **Auto-disabled subscribers:**`);for(let t of e.autoDisabled)E.push(` - ${t.name} (${t.id}): ${t.reason}`)}}}if(u&&u.size>0){let e=u.getStats();E.push(``,`### 🪝 Decision Hooks`),E.push(`- Total hooks: ${e.count}`);for(let t of e.hooks){let e=t.decisionTypes.join(`, `);E.push(` - ${t.id} (order=${t.order}, policy=${t.failurePolicy}, types=[${e}])`)}}if(d){let e=d.getStats();E.push(``,`### 👁 Observations`),E.push(`- Total observations: ${e.totalObservations}`),E.push(` - Success: ${e.byError.success}, Error: ${e.byError.error}`),E.push(` - Artifacts stored: ${e.artifactCount}`),E.push(` - Truncations: ${e.truncationCount}`),E.push(` - Store entries: ${e.storeSize}`);let t=Object.entries(e.byOrigin);t.length>0&&E.push(` - By origin: ${t.map(([e,t])=>`${e}=${t}`).join(`, `)}`)}if(f){let e=f.getStats();E.push(``,`### 🧩 Extractors`),E.push(`- Total extractors: ${e.count}`);for(let[t,n]of Object.entries(e.byName))E.push(` - ${t} (${n.tools} tool(s), maxFacts: ${n.maxFactsPerEvent??`default`})`)}if(p){let e=p.getStats();if(E.push(``,`### 🏆 Promotion Engine`),E.push(`- Total evaluated: ${e.totalEvaluated}`),E.push(`- Promoted: ${e.promoted}`),E.push(`- Held: ${e.held}`),E.push(`- Rejected: ${e.rejected}`),E.push(`- Superseded: ${e.superseded}`),E.push(`- Decayed: ${e.decayed}`),E.push(`- Distinct facts tracked: ${e.observedFacts}`),e.recentDecisions.length>0){E.push(` Recent decisions:`);for(let t of e.recentDecisions.slice(-5))E.push(` - ${t.decision.status}: "${t.factTitle}" (${t.decision.reason.slice(0,80)})`)}}if(m){let e=m.getStats();if(E.push(``,`### 📋 Workspace Skill`),E.push(`- **Skill exists**: ${e.skillExists?`✅`:`❌`}`),E.push(`- **Stale**: ${e.isStale?`⚠ Yes — regenerating on next trigger`:`✅ Fresh`}`),E.push(`- **Last compiled**: ${e.lastCompiledAt?new Date(e.lastCompiledAt).toLocaleString():`Never`}`),E.push(`- **Version**: ${e.skillVersion}`),E.push(`- **Total compiles**: ${e.totalCompiles}`),e.failedCompiles>0&&E.push(`- **Failed compiles**: ${e.failedCompiles}`),e.skillSize>0&&E.push(`- **Skill size**: ${e.skillSize} bytes`),e.isCompiling&&E.push(`- ⏳ **Currently compiling**`),e.pendingRegeneration&&E.push(`- ⏳ **Regeneration pending**`),e.skillQuality&&E.push(`- **Quality**: ${e.skillQuality}`),e.skillQualityErrors&&e.skillQualityErrors.length>0){E.push(`- **Quality errors (${e.skillQualityErrors.length})**:`);for(let t of e.skillQualityErrors.slice(0,3))E.push(` - ${t}`)}if(e.skillQualityWarnings&&e.skillQualityWarnings.length>0){E.push(`- **Quality warnings (${e.skillQualityWarnings.length})**:`);for(let t of e.skillQualityWarnings.slice(0,3))E.push(` - ${t}`)}let t=m?.getWarnings()??[];if(t.length>0){E.push(`- **Compiler warnings (${t.length})**:`);for(let e of t.slice(0,5))E.push(` - ${e}`);t.length>5&&E.push(` - ... and ${t.length-5} more`)}E.push(``," Read `aikit://skill/SKILL.md` to load full workspace context.")}{let e=Pt();(e.cacheSize>0||e.refReuseCount>0)&&(E.push(``,`### 🔄 Ref Reuse`),E.push(`- **Refs stored**: ${e.refStoreCount}`),E.push(`- **Refs reused**: ${e.refReuseCount}`),e.refStaleCount>0&&E.push(`- **⚠ Stale refs detected**: ${e.refStaleCount}`),E.push(`- **Cache entries**: ${e.cacheSize}`))}let j=E.join(`
3053
- `),De=_e>=ev,Oe=Z_(a),N=e||De?await ee(r,c,void 0,Oe.length>0?Oe:void 0,O):void 0,ke=oe.length>0?oe.map(e=>({id:e.id,path:e.path,eventCount:e.eventCount,pendingFiles:e.pendingFiles??[]})):void 0,Ae={totalRecords:y.totalRecords,totalFiles:y.totalFiles,lastIndexedAt:y.lastIndexedAt??null,onboarded:ie,onboardDir:te,onboard_context:O,contentTypes:y.contentTypeBreakdown,wasmAvailable:!!ur.get(),wasmDiagnostics:lr.get(),graphStats:w,curatedCount:T,serverVersion:Se,scaffoldVersion:k??null,workspaceScaffoldVersion:xe??null,upgradeAvailable:Ce||we,storeBackend:a?.store?.backend,storeDiagnostics:pe??null,contextPressure:se,nextAction:de,workspace_skill:(()=>{if(!m)return null;try{let e=m.getStats(),t=m?.getWarnings()??[],n=e.skillExists?e.skillQuality??`fallback`:`fallback`;return{exists:e.skillExists,version:e.skillVersion,fresh:!e.isStale,quality:n,warnings:t,uri:`aikit://skill/SKILL.md`,path:e.skillPath,read_instruction:`Read aikit://skill/SKILL.md before working in this repo for full workspace context.`,last_updated:e.lastCompiledAt?new Date(e.lastCompiledAt).toISOString():null,size:e.skillSize}}catch{return null}})(),skill_warnings:m?.getWarnings(m?.resolveActiveFlowSlug()??void 0)??[],watchers:ke,sessionTokens:{callCount:A.callCount,totalInputChars:A.totalInputChars,totalOutputChars:A.totalOutputChars,estInputTokens:Math.round(A.totalInputChars/4),estTotalTokens:Math.round((A.totalInputChars+A.totalOutputChars)/4),startTime:A.startTime},...N===void 0?{}:{prelude:N}};return{content:[{type:`text`,text:j+(o===`smart`?"\n\n---\n_Next: Use `search` to query indexed content or `graph({action:'find_nodes', name_pattern:'<top-level-module>'})` → then `graph({action:'neighbors', node_id})` for relationships. Smart indexing handles updates automatically._":"\n\n---\n_Next: Use `search` to query indexed content, `graph({action:'find_nodes', name_pattern:'<top-level-module>'})` → then `graph({action:'neighbors', node_id})` for relationships, or `reindex` to refresh the index._")}],structuredContent:Ae}}catch(e){return $_.error(`Status failed`,j(e)),q(`INTERNAL`,`Status check failed: ${e instanceof Error?e.message:String(e)}`)}}))}const pv=k(`tools`);function mv(e){return e instanceof Error?(`code`in e?e.code:void 0)===`ENOENT`||e.message.startsWith(`File not found:`)||e.message.startsWith(`Path not found:`):!1}function hv(e){let t=U(`web_search`);e.registerTool(`web_search`,{title:t.title,description:`PREFERRED web search — fans out to multiple keyless providers (DuckDuckGo + Bing-HTML + Mojeek) by default, returning a deduplicated, consensus-ranked union within a 10s deadline. Optional providers (SearXNG, Google, Brave, Bing API) join the fan-out automatically when their env vars are set. Pass one query or multiple for parallel searching.`,inputSchema:{queries:I.array(I.string().max(2e3)).min(1).max(5).describe('Search queries (1–5). Single: `["react hooks"]`. Multiple searched in parallel.'),limit:I.number().min(1).max(20).default(5).describe(`Max results per query`),site:I.string().optional().describe(`Restrict to domain (e.g., "docs.aws.amazon.com")`),provider:I.enum([`multi`,`duckduckgo`,`bing-html`,`mojeek`,`searxng`,`google`,`brave`,`bing`]).optional().describe("Search provider. Defaults to env AIKIT_SEARCH_PROVIDER, then `multi` (fan-out). Single keyless: `duckduckgo`, `bing-html`, `mojeek`. Self-hosted: `searxng` (requires SEARXNG_URL). Keyed APIs: `google` (GOOGLE_API_KEY+GOOGLE_CSE_ID), `brave` (BRAVE_API_KEY), `bing` (BING_API_KEY). Missing keys auto-fall back to duckduckgo.")},annotations:t.annotations},J(`web_search`,async({queries:e,limit:t,site:n,provider:r})=>{let i=e,a=async e=>{let i=await Gn({query:e,limit:t,site:n,provider:r}),a=[`## Search: ${i.query} _(via ${i.provider})_`,``];if(i.results.length===0)a.push(`No results found.`);else for(let e of i.results)a.push(`### [${e.title}](${e.url})`,e.snippet,``);return a.join(`
3054
- `)};if(i.length===1)try{return{content:[{type:`text`,text:`${await a(i[0])}\n---\n_Next: Use \`web_fetch\` to read any of these pages in full._`}]}}catch(e){return pv.error(`Web search failed`,j(e)),q(`INTERNAL`,`Web search failed: ${e instanceof Error?e.message:String(e)}`)}let o=await Promise.allSettled(i.map(e=>a(e))),s=[],c=0;for(let e=0;e<o.length;e++){let t=o[e];if(t.status===`fulfilled`)s.push(t.value);else{c++;let n=t.reason instanceof Error?t.reason.message:String(t.reason);pv.error(`Web search failed`,{query:i[e],error:n}),s.push(`## ❌ Search failed: ${i[e]}\n\n${n}`)}}let l=`_Searched ${o.length-c}/${o.length} queries successfully._`;s.push(``,`---`,l,"_Next: Use `web_fetch` to read any of these pages in full._");let u=s.join(`
3051
+ `)}const ov=5*6e4;let sv=null,cv=null;function lv(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 uv(){let e=Date.now();if(sv&&e-sv.ts<ov)return sv.value;try{let t=F(Xn(),`.copilot`,`.aikit-scaffold.json`);if(!M(t))return sv={value:null,ts:e},null;let n=JSON.parse(N(t,`utf-8`)).version??null;return sv={value:n,ts:e},n}catch{return sv={value:null,ts:e},null}}function dv(){let e=Date.now();if(cv&&e-cv.ts<ov)return cv.value;try{let t=F(process.cwd(),`.github`,`.aikit-scaffold.json`);if(!M(t))return cv={value:null,ts:e},null;let n=JSON.parse(N(t,`utf-8`)).version??null;return cv={value:n,ts:e},n}catch{return cv={value:null,ts:e},null}}function fv(e){let t=U(`status`);e.registerTool(`status`,{title:t.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:tv,annotations:t.annotations},J(`status`,async()=>{let e=C(),t=uv(),n=dv(),r=t!=null&&t!==e,i=n!=null&&n!==e,a=[`## AI Kit Status`,``,`⏳ **AI Kit is initializing** — index stats will be available shortly.`,``,`### Runtime`,`- **Tree-sitter (WASM)**: ${ur.get()?`✅ Available (AST analysis)`:`⚠ Unavailable (regex fallback)`}`,``,`### Version`,`- **Server**: ${e}`,`- **Scaffold (user)**: ${t??`not installed`}`,`- **Scaffold (workspace)**: ${n??`not installed`}`];if(r||i){let o=ne(),s=[];r&&s.push(`user scaffold v${t}`),i&&s.push(`workspace scaffold v${n}`);let c=s.join(`, `);o.state===`success`?a.push(``,`### ✅ Upgrade Applied`,`- Server v${e} — ${c} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):o.state===`pending`?a.push(``,`### ⏳ Upgrade In Progress`,`- Server v${e} ≠ ${c}`,`- Auto-upgrade is running in the background…`):o.state===`failed`?(re(),a.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${e} ≠ ${c}`,`- Error: ${o.error??`unknown`}`)):(re(),a.push(``,`### ⬆ Upgrade Available`,`- Server v${e} ≠ ${c}`,`- Auto-upgrade triggered — check again shortly.`))}let o={totalRecords:0,totalFiles:0,lastIndexedAt:null,onboarded:!1,onboardDir:``,contentTypes:{},wasmAvailable:!!ur.get(),wasmDiagnostics:lr.get(),graphStats:null,curatedCount:0,serverVersion:e,scaffoldVersion:t??null,workspaceScaffoldVersion:n??null,upgradeAvailable:r||i,contextPressure:0,nextAction:rv({onboarded:!1,indexStale:!1,contextPressure:0})};return{content:[{type:`text`,text:a.join(`
3052
+ `)}],structuredContent:o}}))}function pv(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){let g=U(`status`);e.registerTool(`status`,{title:g.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:tv,annotations:g.annotations},J(`status`,async({includePrelude:e=!1})=>{let g=[];try{let[_,v]=await Promise.all([nv(t.getStats(),{totalRecords:0,totalFiles:0,lastIndexedAt:null,lastSourceIndexedAt:null,contentTypeBreakdown:{},storeBackend:`unknown`,embeddingModel:`unknown`},`store.getStats`),nv(t.listSourcePaths(),[],`store.listSourcePaths`)]),y=_.value;_.timedOut&&g.push(`⚠ Index stats timed out — values may be incomplete`);let b=v.value;v.timedOut&&g.push(`⚠ File listing timed out`);let x=b.filter(e=>!e.startsWith(`.ai/curated/context/auto-`)&&!e.startsWith(`.ai/curated/workflow/auto-`)&&!e.includes(`node_modules/`)&&!e.startsWith(`.git/`)),S=b.length-x.length,w=null,T=0,E=[`## AI Kit Status`,``,`- **Total Records**: ${y.totalRecords}`,`- **Total Files**: ${y.totalFiles}`,`- **Last Indexed**: ${y.lastIndexedAt??`Never`}`,``,`### Content Types`,...Object.entries(y.contentTypeBreakdown).map(([e,t])=>`- ${e}: ${t}`),``,`### Indexed Files`,...x.slice(0,50).map(e=>`- ${e}`),x.length>50?`\n... and ${x.length-50} more files`:``,S>0?`\n_(${S} internal/auto-curated files hidden — use \`find\` to explore them)_`:``];if(n)try{let e=await nv(n.getStats(),{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}},`graphStore.getStats`);if(e.timedOut)g.push(`⚠ Graph stats timed out`),E.push(``,`### Knowledge Graph`,`- Graph stats timed out`);else{let t=e.value;w={nodes:t.nodeCount,edges:t.edgeCount},E.push(``,`### Knowledge Graph`,`- **Nodes**: ${t.nodeCount}`,`- **Edges**: ${t.edgeCount}`,...Object.entries(t.nodeTypes).map(([e,t])=>` - ${e}: ${t}`));try{let e=await nv(n.validate(),{valid:!0,danglingEdges:[],orphanNodes:[],stats:{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}}},`graphStore.validate`);if(!e.timedOut){let t=e.value;t.valid||E.push(`- **⚠ Integrity Issues**: ${t.danglingEdges.length} dangling edges`),t.orphanNodes.length>0&&E.push(`- **Orphan nodes**: ${t.orphanNodes.length}`)}}catch{}}}catch{E.push(``,`### Knowledge Graph`,`- Graph store unavailable`)}let te=a?.onboardDir??``,D=M(te),ie=i?.onboardComplete||D,O=ae(te,{lastIndexedAt:iv(y)});if(E.push(``,`### Onboard Status`,ie?`- ✅ Complete${i?.onboardTimestamp?` (last: ${i.onboardTimestamp})`:``}`:'- ❌ Not run — call `onboard({ path: "." })` to analyze the codebase',`- **Onboard Directory**: \`${te}\``),O){let e=O.packageMap.totalPackages,t=O.freshness.status===`fresh`?`✅`:O.freshness.status===`stale`?`⚠`:`❔`;E.push(`- **Onboard context**: ${O.readInstruction}`,`- **Onboard freshness**: ${t} ${O.freshness.status} (${O.freshness.reason})`,e>0?`- **Package map**: ${e} packages/containers in \`${O.packageMap.sourcePath}\``:"- **Package map**: read `structure.md` and `dependencies.md` from the onboard directory")}if(r)try{let e=await nv(r.count(),0,`curated.count`);e.timedOut?(g.push(`⚠ Curated knowledge count timed out`),E.push(``,`### Curated Knowledge`,`- Listing timed out`)):(T=e.value,E.push(``,`### Curated Knowledge`,T>0?`- ${T} entries`:'- Empty — use `knowledge({ action: "remember", ... })` to persist decisions'))}catch{E.push(``,`### Curated Knowledge`,`- Unable to read curated entries`)}let oe=Un().filter(e=>e.status===`watching`);if(oe.length>0){E.push(``,`### File Watchers`,`- **Active**: ${oe.length}`);for(let e of oe){let t=e.pendingFiles?.length??0;if(E.push(` - \`${e.path}\`: ${e.eventCount} events, ${t} pending files`),t>0&&t<=10)for(let t of e.pendingFiles)E.push(` - \`${t}\``);else t>10&&E.push(` - ${t} pending files (use \`watch({ action: 'list' })\` for details)`)}}let se=lv(y.totalRecords,w?.nodes??0,w?.edges??0,T),ce=y.lastIndexedAt?new Date(y.lastIndexedAt).getTime():0,le=ce>0?Date.now()-ce:1/0,ue=ie&&le>1440*60*1e3,de=rv({onboarded:ie,onboardFreshness:O?.freshness.status??null,indexStale:ue,contextPressure:se});E.push(``),E.push(`## 📊 Context Pressure: ${se}/100`),se>=80?E.push(`⚠️ High pressure — consider pruning stale entries or compacting context.`):se>=50?E.push(`ℹ️ Moderate pressure — AI Kit memory is well-populated.`):E.push(`✅ Low pressure — plenty of headroom for more content.`);let fe=0;if(y.lastIndexedAt){fe=new Date(y.lastIndexedAt).getTime();let e=(Date.now()-fe)/(1e3*60*60);E.push(``,`### Index Freshness`,e>24?o===`smart`?`- ⚠ Last indexed ${Math.floor(e)}h ago — smart indexing will refresh automatically`:`- ⚠ Last indexed ${Math.floor(e)}h ago — may be stale. Run \`reindex({})\``:`- ✅ Last indexed ${e<1?`less than 1h`:`${Math.floor(e)}h`} ago`)}E.push(``,`### Next Action`,`- **${de.kind}**: ${de.reason}`);let pe=null,me=t;if(typeof me.getDiagnostics==`function`)try{let e=me.getDiagnostics();pe={adapterType:e.adapterType,vectorSearchEnabled:e.vectorSearchEnabled,ftsEnabled:e.ftsEnabled,degradedMode:e.degradedMode,dbPath:e.dbPath,dbSizeBytes:e.dbSizeBytes,embeddingDim:e.embeddingDim,vectorDtype:e.vectorDtype},E.push(``,`### Storage`,`- **Backend**: ${a?.store?.backend??`unknown`}`,`- **Adapter**: ${pe.adapterType}`,`- **Vector search**: ${pe.vectorSearchEnabled?`✅ enabled`:`⚠ disabled (FTS-only fallback)`}`,pe.dbPath?`- **DB**: ${pe.dbPath}`:``,pe.dbSizeBytes==null?``:`- **DB size**: ${(pe.dbSizeBytes/1024/1024).toFixed(2)} MB`,`- **Embedding dim**: ${pe.embeddingDim}`,`- **Vector dtype**: ${pe.vectorDtype}`)}catch{}if(o===`smart`)if(E.push(``,`### Smart Indexing`),s){let e=s();e?E.push(`- **Mode**: Smart (trickle)`,`- **Status**: ${e.running?`✅ Running`:`⏸ Stopped`}`,`- **Queue**: ${e.queueSize} files pending`,`- **Changed files**: ${e.changedFilesSize} detected`,`- **Interval**: ${Math.round(e.intervalMs/1e3)}s per batch of ${e.batchSize}`):E.push(`- **Mode**: Smart (trickle)`,`- **Status**: scheduler state unavailable (init may have failed)`)}else E.push(`- **Mode**: Smart (trickle) — scheduler state unavailable`);if(h)try{let e=h.getReport(),t=h.checkThresholds(),n=Object.entries(e.counters),r=Object.entries(e.gauges);if(n.length>0||r.length>0||t.length>0){if(E.push(``,`### 📊 Metrics`),n.length>0){E.push(`**Counters:**`);for(let[e,t]of n)E.push(`- \`${e}\`: ${t}`)}if(r.length>0){E.push(`**Gauges:**`);for(let[e,t]of r)E.push(`- \`${e}\`: ${t}`)}if(t.length>0){E.push(`**⚠ Threshold violations:**`);for(let e of t)E.push(`- ${e}`)}else(n.length>0||r.length>0)&&E.push(`- ✅ All thresholds within limits`)}}catch{E.push(``,`### 📊 Metrics`,`- Metrics unavailable`)}{let e=[];if(u)try{let t=u.getStats();e.push(`- **Decision Hooks**: ${t.count} registered${t.hooks.length>0?` (IDs: ${t.hooks.map(e=>e.id).join(`, `)})`:``}`)}catch{e.push(`- **Decision Hooks**: unavailable`)}else e.push(`- **Decision Hooks**: not configured`);if(d)try{let t=d.getStats(),n=Object.entries(t.byTool).map(([e,t])=>`${e}=${t}`).join(`, `);e.push(`- **Observations**: ${t.totalObservations} total, byTool: ${n||`none`}`)}catch{e.push(`- **Observations**: unavailable`)}else e.push(`- **Observations**: not configured`);if(f)try{let t=f.getStats(),n=Object.keys(t.byName);e.push(`- **Extractors**: ${t.count} registered${n.length>0?` (IDs: ${n.join(`, `)})`:``}`)}catch{e.push(`- **Extractors**: unavailable`)}else e.push(`- **Extractors**: not configured`);if(m)try{let t=m.getStats(),n=t.skillExists?t.isStale?`⚠ Stale`:`✅ Fresh`:`❌ No skill`;e.push(`- **Skill Compiler**: ${n}, version: ${t.skillVersion}, last compiled: ${t.lastCompiledAt?new Date(t.lastCompiledAt).toLocaleString():`Never`}`)}catch{e.push(`- **Skill Compiler**: unavailable`)}else e.push(`- **Skill Compiler**: not configured`);if(p)try{let t=p.getStats();e.push(`- **Promotion Engine**: ${t.held} candidates held, ${t.promoted} promoted, ${t.observedFacts} distinct facts tracked`)}catch{e.push(`- **Promotion Engine**: unavailable`)}else e.push(`- **Promotion Engine**: not configured`);E.push(``,`### 🧩 Feature Coverage`,...e)}let _e=0;{try{let e=a?.stateDir?P(a.stateDir,`stash`):null;if(e&&M(e)){let t=Me(e).mtimeMs;t>fe&&(fe=t)}}catch{}let e=[];if(r)try{let t=T>0?await r.list({limit:5,orderBy:`updated`,order:`desc`}):[];for(let e of t){let t=new Date(e.updated||e.created).getTime();t>fe&&(fe=t)}e.push(...t)}catch{}if(_e=fe>0?Date.now()-fe:0,_e>=ev){let t=Math.floor(_e/36e5);if(E.push(``,`### 🌅 Session Briefing`,`_${t}+ hours since last activity — here's what to pick up:_`,``),e.length>0){E.push(`**Recent decisions/notes:**`);for(let t of e)E.push(`- **${t.title}** (${t.category??`note`}) — ${(t.contentPreview??``).slice(0,80)}…`)}E.push(``,`**Suggested next steps:**`,'- `search({ query: "SESSION CHECKPOINT", origin: "curated" })` — find your last checkpoint',"- `restore({})` — resume from a saved checkpoint",'- `knowledge({ action: "list" })` — browse all stored knowledge')}}E.push(``,`### Runtime`,av());let ve=ge.instance().getAll(),ye=ve.filter(e=>e.status!==`healthy`);if(ye.length>0){E.push(``,`### ⚠️ Subsystem Health`);for(let e of ye){let t=Math.round((Date.now()-e.since)/1e3);E.push(`- **${e.name}**: ${e.status} (${t}s ago${e.reason?` — ${e.reason}`:``})`)}}else ve.length>0&&E.push(``,`### ✅ Subsystem Health`,`- All ${ve.length} subsystems healthy`);let be=he.getAll();if(be.size>0){E.push(``,`### 🔌 Circuit Breakers`);for(let[e,t]of be){let n=t.getState(),r=`- **${e}**: ${n===`closed`?`🟢`:n===`open`?`🔴`:`🟡`} ${n}`;if(n===`open`){let e=t.remainingCooldownMs();r+=` (recovery in ${Math.ceil(e/1e3)}s)`}E.push(r)}}let k=uv(),xe=dv(),Se=C(),Ce=k!=null&&k!==Se,we=xe!=null&&xe!==Se;if(Ce||we){let e=ne(),t=[];Ce&&t.push(`user scaffold v${k}`),we&&t.push(`workspace scaffold v${xe}`);let n=t.join(`, `);e.state===`success`?E.push(``,`### ✅ Upgrade Applied`,`- Server v${Se} — ${n} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):e.state===`pending`?E.push(``,`### ⏳ Upgrade In Progress`,`- Server v${Se} ≠ ${n}`,`- Auto-upgrade is running in the background…`):e.state===`failed`?(re(),E.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${Se} ≠ ${n}`,`- Error: ${e.error??`unknown`}`)):(re(),E.push(``,`### ⬆ Upgrade Available`,`- Server v${Se} ≠ ${n}`,`- Auto-upgrade triggered — check again shortly.`))}g.length>0&&E.push(``,`### ⚠ Warnings`,...g.map(e=>`- ${e}`));let Te=K_();if(Te.length>0){let e=Te.sort((e,t)=>t.callCount-e.callCount);E.push(``,`### Tool Usage This Session`,``),E.push(`| Tool | Calls | Tokens In | Tokens Out | Errors | Avg Latency |`),E.push(`|------|-------|-----------|------------|--------|-------------|`);for(let t of e.slice(0,15)){let e=Math.round(t.totalInputChars/4),n=Math.round(t.totalOutputChars/4),r=Math.round(t.totalDurationMs/t.callCount);E.push(`| ${t.tool} | ${t.callCount} | ${e.toLocaleString()} | ${n.toLocaleString()} | ${t.errorCount} | ${r}ms |`)}}let A=U_();A.callCount>0&&(E.push(``),E.push(`### Session Token Usage`),E.push(`- Tool calls: ${A.callCount}`),E.push(`- Input chars: ${A.totalInputChars.toLocaleString()}`),E.push(`- Output chars: ${A.totalOutputChars.toLocaleString()}`),E.push(`- Est. input tokens: ${Math.round(A.totalInputChars/4).toLocaleString()}`),E.push(`- Est. total tokens: ${Math.round((A.totalInputChars+A.totalOutputChars)/4).toLocaleString()}`));let Ee=Y_();if(Ee.bufferSize>=10){let e=Ee.state===`healthy`?`🟢`:Ee.state===`degraded`?`🔴`:`🟡`;E.push(``,`### Auto-GC: ${e} ${Ee.state}`),E.push(`- p95 latency: ${Ee.p95}ms | buffer: ${Ee.bufferSize} samples`),Ee.gcCount>0&&E.push(`- GC cycles triggered: ${Ee.gcCount}`)}if(l){let e=l.getStats();if(e.totalSubscribers>0){E.push(``,`### 🔌 Hooks (EventBus Subscribers)`),E.push(`- Total subscribers: ${e.totalSubscribers}`);for(let[t,n]of Object.entries(e.byEvent))E.push(` - ${t}: ${n} subscriber(s)`);for(let t of e.subscriptions)E.push(` - ${t.name} (${t.eventType}, ${t.policy})`);if(e.autoDisabled.length>0){E.push(``),E.push(` **Auto-disabled subscribers:**`);for(let t of e.autoDisabled)E.push(` - ${t.name} (${t.id}): ${t.reason}`)}}}if(u&&u.size>0){let e=u.getStats();E.push(``,`### 🪝 Decision Hooks`),E.push(`- Total hooks: ${e.count}`);for(let t of e.hooks){let e=t.decisionTypes.join(`, `);E.push(` - ${t.id} (order=${t.order}, policy=${t.failurePolicy}, types=[${e}])`)}}if(d){let e=d.getStats();E.push(``,`### 👁 Observations`),E.push(`- Total observations: ${e.totalObservations}`),E.push(` - Success: ${e.byError.success}, Error: ${e.byError.error}`),E.push(` - Artifacts stored: ${e.artifactCount}`),E.push(` - Truncations: ${e.truncationCount}`),E.push(` - Store entries: ${e.storeSize}`);let t=Object.entries(e.byOrigin);t.length>0&&E.push(` - By origin: ${t.map(([e,t])=>`${e}=${t}`).join(`, `)}`)}if(f){let e=f.getStats();E.push(``,`### 🧩 Extractors`),E.push(`- Total extractors: ${e.count}`);for(let[t,n]of Object.entries(e.byName))E.push(` - ${t} (${n.tools} tool(s), maxFacts: ${n.maxFactsPerEvent??`default`})`)}if(p){let e=p.getStats();if(E.push(``,`### 🏆 Promotion Engine`),E.push(`- Total evaluated: ${e.totalEvaluated}`),E.push(`- Promoted: ${e.promoted}`),E.push(`- Held: ${e.held}`),E.push(`- Rejected: ${e.rejected}`),E.push(`- Superseded: ${e.superseded}`),E.push(`- Decayed: ${e.decayed}`),E.push(`- Distinct facts tracked: ${e.observedFacts}`),e.recentDecisions.length>0){E.push(` Recent decisions:`);for(let t of e.recentDecisions.slice(-5))E.push(` - ${t.decision.status}: "${t.factTitle}" (${t.decision.reason.slice(0,80)})`)}}if(m){let e=m.getStats();if(E.push(``,`### 📋 Workspace Skill`),E.push(`- **Skill exists**: ${e.skillExists?`✅`:`❌`}`),E.push(`- **Stale**: ${e.isStale?`⚠ Yes — regenerating on next trigger`:`✅ Fresh`}`),E.push(`- **Last compiled**: ${e.lastCompiledAt?new Date(e.lastCompiledAt).toLocaleString():`Never`}`),E.push(`- **Version**: ${e.skillVersion}`),E.push(`- **Total compiles**: ${e.totalCompiles}`),e.failedCompiles>0&&E.push(`- **Failed compiles**: ${e.failedCompiles}`),e.skillSize>0&&E.push(`- **Skill size**: ${e.skillSize} bytes`),e.isCompiling&&E.push(`- ⏳ **Currently compiling**`),e.pendingRegeneration&&E.push(`- ⏳ **Regeneration pending**`),e.skillQuality&&E.push(`- **Quality**: ${e.skillQuality}`),e.skillQualityErrors&&e.skillQualityErrors.length>0){E.push(`- **Quality errors (${e.skillQualityErrors.length})**:`);for(let t of e.skillQualityErrors.slice(0,3))E.push(` - ${t}`)}if(e.skillQualityWarnings&&e.skillQualityWarnings.length>0){E.push(`- **Quality warnings (${e.skillQualityWarnings.length})**:`);for(let t of e.skillQualityWarnings.slice(0,3))E.push(` - ${t}`)}let t=m?.getWarnings()??[];if(t.length>0){E.push(`- **Compiler warnings (${t.length})**:`);for(let e of t.slice(0,5))E.push(` - ${e}`);t.length>5&&E.push(` - ... and ${t.length-5} more`)}E.push(``," Read `aikit://skill/SKILL.md` to load full workspace context.")}{let e=Pt();(e.cacheSize>0||e.refReuseCount>0)&&(E.push(``,`### 🔄 Ref Reuse`),E.push(`- **Refs stored**: ${e.refStoreCount}`),E.push(`- **Refs reused**: ${e.refReuseCount}`),e.refStaleCount>0&&E.push(`- **⚠ Stale refs detected**: ${e.refStaleCount}`),E.push(`- **Cache entries**: ${e.cacheSize}`))}let j=E.join(`
3053
+ `),De=_e>=ev,Oe=Z_(a),N=e||De?await ee(r,c,void 0,Oe.length>0?Oe:void 0,O):void 0,ke=oe.length>0?oe.map(e=>({id:e.id,path:e.path,eventCount:e.eventCount,pendingFiles:e.pendingFiles??[]})):void 0,Ae={totalRecords:y.totalRecords,totalFiles:y.totalFiles,lastIndexedAt:y.lastIndexedAt??null,lastSourceIndexedAt:y.lastSourceIndexedAt??null,onboarded:ie,onboardDir:te,onboard_context:O,contentTypes:y.contentTypeBreakdown,wasmAvailable:!!ur.get(),wasmDiagnostics:lr.get(),graphStats:w,curatedCount:T,serverVersion:Se,scaffoldVersion:k??null,workspaceScaffoldVersion:xe??null,upgradeAvailable:Ce||we,storeBackend:a?.store?.backend,storeDiagnostics:pe??null,contextPressure:se,nextAction:de,workspace_skill:(()=>{if(!m)return null;try{let e=m.getStats(),t=m?.getWarnings()??[],n=e.skillExists?e.skillQuality??`fallback`:`fallback`;return{exists:e.skillExists,version:e.skillVersion,fresh:!e.isStale,quality:n,warnings:t,uri:`aikit://skill/SKILL.md`,path:e.skillPath,read_instruction:`Read aikit://skill/SKILL.md before working in this repo for full workspace context.`,last_updated:e.lastCompiledAt?new Date(e.lastCompiledAt).toISOString():null,size:e.skillSize}}catch{return null}})(),skill_warnings:m?.getWarnings(m?.resolveActiveFlowSlug()??void 0)??[],watchers:ke,sessionTokens:{callCount:A.callCount,totalInputChars:A.totalInputChars,totalOutputChars:A.totalOutputChars,estInputTokens:Math.round(A.totalInputChars/4),estTotalTokens:Math.round((A.totalInputChars+A.totalOutputChars)/4),startTime:A.startTime},...N===void 0?{}:{prelude:N}};return{content:[{type:`text`,text:j+(o===`smart`?"\n\n---\n_Next: Use `search` to query indexed content or `graph({action:'find_nodes', name_pattern:'<top-level-module>'})` → then `graph({action:'neighbors', node_id})` for relationships. Smart indexing handles updates automatically._":"\n\n---\n_Next: Use `search` to query indexed content, `graph({action:'find_nodes', name_pattern:'<top-level-module>'})` → then `graph({action:'neighbors', node_id})` for relationships, or `reindex` to refresh the index._")}],structuredContent:Ae}}catch(e){return $_.error(`Status failed`,j(e)),q(`INTERNAL`,`Status check failed: ${e instanceof Error?e.message:String(e)}`)}}))}const mv=k(`tools`);function hv(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 gv(e){let t=U(`web_search`);e.registerTool(`web_search`,{title:t.title,description:`PREFERRED web search — fans out to multiple keyless providers (DuckDuckGo + Bing-HTML + Mojeek) by default, returning a deduplicated, consensus-ranked union within a 10s deadline. Optional providers (SearXNG, Google, Brave, Bing API) join the fan-out automatically when their env vars are set. Pass one query or multiple for parallel searching.`,inputSchema:{queries:I.array(I.string().max(2e3)).min(1).max(5).describe('Search queries (1–5). Single: `["react hooks"]`. Multiple searched in parallel.'),limit:I.number().min(1).max(20).default(5).describe(`Max results per query`),site:I.string().optional().describe(`Restrict to domain (e.g., "docs.aws.amazon.com")`),provider:I.enum([`multi`,`duckduckgo`,`bing-html`,`mojeek`,`searxng`,`google`,`brave`,`bing`]).optional().describe("Search provider. Defaults to env AIKIT_SEARCH_PROVIDER, then `multi` (fan-out). Single keyless: `duckduckgo`, `bing-html`, `mojeek`. Self-hosted: `searxng` (requires SEARXNG_URL). Keyed APIs: `google` (GOOGLE_API_KEY+GOOGLE_CSE_ID), `brave` (BRAVE_API_KEY), `bing` (BING_API_KEY). Missing keys auto-fall back to duckduckgo.")},annotations:t.annotations},J(`web_search`,async({queries:e,limit:t,site:n,provider:r})=>{let i=e,a=async e=>{let i=await Gn({query:e,limit:t,site:n,provider:r}),a=[`## Search: ${i.query} _(via ${i.provider})_`,``];if(i.results.length===0)a.push(`No results found.`);else for(let e of i.results)a.push(`### [${e.title}](${e.url})`,e.snippet,``);return a.join(`
3054
+ `)};if(i.length===1)try{return{content:[{type:`text`,text:`${await a(i[0])}\n---\n_Next: Use \`web_fetch\` to read any of these pages in full._`}]}}catch(e){return mv.error(`Web search failed`,j(e)),q(`INTERNAL`,`Web search failed: ${e instanceof Error?e.message:String(e)}`)}let o=await Promise.allSettled(i.map(e=>a(e))),s=[],c=0;for(let e=0;e<o.length;e++){let t=o[e];if(t.status===`fulfilled`)s.push(t.value);else{c++;let n=t.reason instanceof Error?t.reason.message:String(t.reason);mv.error(`Web search failed`,{query:i[e],error:n}),s.push(`## ❌ Search failed: ${i[e]}\n\n${n}`)}}let l=`_Searched ${o.length-c}/${o.length} queries successfully._`;s.push(``,`---`,l,"_Next: Use `web_fetch` to read any of these pages in full._");let u=s.join(`
3055
3055
 
3056
- `);return c===o.length?q(`INTERNAL`,u):{content:[{type:`text`,text:u}]}}))}function gv(e){let t=U(`measure`);e.registerTool(`measure`,{title:t.title,description:`Measure code complexity, line counts, and function counts for a file or directory. Returns per-file metrics sorted by complexity.`,outputSchema:Es,inputSchema:{path:I.string().describe(`File or directory path to measure`),extensions:I.array(I.string()).optional().describe(`File extensions to include (default: .ts,.tsx,.js,.jsx)`),include_hidden:I.boolean().optional().describe(`Include hidden trees such as .generated and .cache. Default false.`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`)},annotations:t.annotations},J(`measure`,async({path:e,extensions:t,include_hidden:n,max_tokens:r})=>{try{let i=await Yt({path:e,extensions:t,includeHidden:n}),a=[`## Code Metrics`,``,`**Files:** ${i.summary.totalFiles}`,`**Total lines:** ${i.summary.totalLines} (${i.summary.totalCodeLines} code)`,`**Functions:** ${i.summary.totalFunctions}`,`**Avg complexity:** ${i.summary.avgComplexity}`,`**Max complexity:** ${i.summary.maxComplexity.value} (${i.summary.maxComplexity.file})`,``,`### Top files by complexity`,``,`| File | Lines | Code | Complexity | Cognitive | Functions | Imports |`,`|------|-------|------|------------|-----------|-----------|---------|`];for(let e of i.files.slice(0,20)){let t=e.cognitiveComplexity===void 0?`—`:String(e.cognitiveComplexity);a.push(`| ${e.path} | ${e.lines.total} | ${e.lines.code} | ${e.complexity} | ${t} | ${e.functions} | ${e.imports} |`)}i.files.length>20&&a.push(``,`_...and ${i.files.length-20} more files_`);let o={summary:{totalFiles:i.summary.totalFiles,totalLines:i.summary.totalLines,totalCodeLines:i.summary.totalCodeLines,totalFunctions:i.summary.totalFunctions,avgComplexity:i.summary.avgComplexity,maxComplexity:{value:i.summary.maxComplexity.value,file:i.summary.maxComplexity.file}},files:i.files.map(e=>({path:e.path,lines:e.lines.total,code:e.lines.code,complexity:e.complexity,functions:e.functions}))};return{content:[{type:`text`,text:r?Vn(a.join(`
3056
+ `);return c===o.length?q(`INTERNAL`,u):{content:[{type:`text`,text:u}]}}))}function _v(e){let t=U(`measure`);e.registerTool(`measure`,{title:t.title,description:`Measure code complexity, line counts, and function counts for a file or directory. Returns per-file metrics sorted by complexity.`,outputSchema:Es,inputSchema:{path:I.string().describe(`File or directory path to measure`),extensions:I.array(I.string()).optional().describe(`File extensions to include (default: .ts,.tsx,.js,.jsx)`),include_hidden:I.boolean().optional().describe(`Include hidden trees such as .generated and .cache. Default false.`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`)},annotations:t.annotations},J(`measure`,async({path:e,extensions:t,include_hidden:n,max_tokens:r})=>{try{let i=await Yt({path:e,extensions:t,includeHidden:n}),a=[`## Code Metrics`,``,`**Files:** ${i.summary.totalFiles}`,`**Total lines:** ${i.summary.totalLines} (${i.summary.totalCodeLines} code)`,`**Functions:** ${i.summary.totalFunctions}`,`**Avg complexity:** ${i.summary.avgComplexity}`,`**Max complexity:** ${i.summary.maxComplexity.value} (${i.summary.maxComplexity.file})`,``,`### Top files by complexity`,``,`| File | Lines | Code | Complexity | Cognitive | Functions | Imports |`,`|------|-------|------|------------|-----------|-----------|---------|`];for(let e of i.files.slice(0,20)){let t=e.cognitiveComplexity===void 0?`—`:String(e.cognitiveComplexity);a.push(`| ${e.path} | ${e.lines.total} | ${e.lines.code} | ${e.complexity} | ${t} | ${e.functions} | ${e.imports} |`)}i.files.length>20&&a.push(``,`_...and ${i.files.length-20} more files_`);let o={summary:{totalFiles:i.summary.totalFiles,totalLines:i.summary.totalLines,totalCodeLines:i.summary.totalCodeLines,totalFunctions:i.summary.totalFunctions,avgComplexity:i.summary.avgComplexity,maxComplexity:{value:i.summary.maxComplexity.value,file:i.summary.maxComplexity.file}},files:i.files.map(e=>({path:e.path,lines:e.lines.total,code:e.lines.code,complexity:e.complexity,functions:e.functions}))};return{content:[{type:`text`,text:r?Vn(a.join(`
3057
3057
  `),r):a.join(`
3058
- `)}],structuredContent:o}}catch(e){return mv(e)?(pv.warn(`Measure failed`,{error:`File not found`}),q(`NOT_FOUND`,`File not found`)):(pv.error(`Measure failed`,j(e)),q(`INTERNAL`,`Measure failed: ${e instanceof Error?e.message:String(e)}`))}}))}function _v(e){let t=U(`env`);e.registerTool(`env`,{title:t.title,description:`Get system and runtime environment info. Sensitive env vars are redacted by default.`,outputSchema:Ds,inputSchema:{include_env:I.boolean().default(!1).describe(`Include environment variables`),filter_env:I.string().optional().describe(`Filter env vars by name substring`),show_sensitive:I.boolean().default(!1).describe(`Show sensitive values (keys, tokens, etc.) — redacted by default`)},annotations:t.annotations},J(`env`,async({include_env:e,filter_env:t,show_sensitive:n})=>{let r=Tt({includeEnv:e,filterEnv:t,showSensitive:n}),i=[`## Environment`,``,`**Platform:** ${r.system.platform} ${r.system.arch}`,`**OS:** ${r.system.type} ${r.system.release}`,`**Host:** ${r.system.hostname}`,`**CPUs:** ${r.system.cpus}`,`**Memory:** ${r.system.memoryFreeGb}GB free / ${r.system.memoryTotalGb}GB total`,``,`**Node:** ${r.runtime.node}`,`**V8:** ${r.runtime.v8}`,`**CWD:** ${r.cwd}`];if(r.env){i.push(``,`### Environment Variables`,``);for(let[e,t]of Object.entries(r.env))i.push(`- \`${e}\`: ${t}`)}let a={platform:r.system.platform,arch:r.system.arch,nodeVersion:r.runtime.node,cwd:r.cwd,cpus:r.system.cpus,memoryFreeGb:r.system.memoryFreeGb,memoryTotalGb:r.system.memoryTotalGb};return{content:[{type:`text`,text:i.join(`
3059
- `)}],structuredContent:a}}))}const vv=k(`register-tools`);function yv(e){return t=>!e||e.has(t)}function bv(e){try{let t=P(e,`.flows`);if(!M(t))return null;let n=ke(t,{withFileTypes:!0});for(let e of n){if(!e.isDirectory())continue;let n=P(t,e.name,`meta.json`);if(M(n)&&JSON.parse(N(n,`utf-8`)).status===`active`)return e.name}}catch{return null}return null}let xv=null,Sv=null;function Cv(){xv?.(),xv=null}function wv(){return Sv?.flush()??Promise.resolve()}function Tv(e){let{server:t,aikit:n,config:r,elicitor:i,resourceNotifier:a,samplingClient:o,indexMode:s,getSmartState:c,getSmartScheduler:l,precomputedActiveTools:u}=e,d=new Oo,f=r.sources[0]?.path??Ee(),p=be(f),m={activeSlug:null};m.activeSlug=bv(f);let h=new Va(P(r.stateDir??``,`flow-context`),()=>m.activeSlug),g=new Ta;g.register(fi()),g.register(va),g.register(ki),g.register(ra),g.register(yi),g.register(pi),g.register(mi),g.register(ha),g.register(gi),g.register(Sa),g.register(na(()=>m.activeSlug?{active:!0,slug:m.activeSlug}:null)),g.register(sa),g.register(ba),g.register(Ei),g.register(aa);let _=new Za(void 0,n.stateStore),v=n.eventBus,y=Q_(r),b=y?new no(y,{debounceMs:5e3},v??void 0,n.curated,void 0,f):null;b&&b.compileNow(`startup`).catch(e=>{vv.warn(`Startup skill compile failed — will retry on next trigger`,{error:String(e)})});let x=new Oa(g,n.curated,{},h,_,v??void 0,n.stateStore);Sv=x;let S=u??xs(r,[...Ia,...Wo],Fa,Ko(r)),C=yv(S),w=new Set([...S].filter(e=>!Lf.includes(e)&&!Ua.has(e))),T=new qa;d.use(Yo(),{order:1,name:`structured-content-guard`}),d.use(Ba(za(r.tokenBudget)),{order:90,name:`compression`});let E=d.decisionHookRegistry;E.register({id:`search-budget`,order:10,scope:`search`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`budgetHint`],reason:`Enforce token budget on search results`,fn:()=>({type:`decision`,hookId:`search-budget`,decision:`allow`,reason:`Budget hook active`})}),E.register({id:`find-path-containment`,order:10,scope:`find`,timeoutMs:50,failurePolicy:`fail-closed`,decisionTypes:[`deny`],reason:`Validate find scope against workspace boundaries`,fn:()=>({type:`decision`,hookId:`find-path-containment`,decision:`allow`,reason:`Path permitted`})}),E.register({id:`knowledge-mutation-safety`,order:10,scope:`knowledge`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`deny`],reason:`Guard against unintended knowledge mutations`,fn:()=>({type:`decision`,hookId:`knowledge-mutation-safety`,decision:`allow`,reason:`Mutation permitted`})}),E.register({id:`check-scoped-run`,order:10,scope:`check`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log check run scope for audit`,fn:()=>({type:`decision`,hookId:`check-scoped-run`,decision:`allow`,reason:`Check run permitted`})}),E.register({id:`test-run-scoped`,order:10,scope:`test_run`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log test run scope for audit`,fn:()=>({type:`decision`,hookId:`test-run-scoped`,decision:`allow`,reason:`Test run permitted`})}),E.register({id:`onboard-path-correctness`,order:10,scope:`onboard`,timeoutMs:50,failurePolicy:`fail-closed`,decisionTypes:[`deny`],reason:`Validate onboard target path is valid and accessible`,fn:()=>({type:`decision`,hookId:`onboard-path-correctness`,decision:`allow`,reason:`Path valid`})}),E.register({id:`compact-budget-hints`,order:10,scope:`compact`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`budgetHint`],reason:`Enforce token budget on compact output`,fn:()=>({type:`decision`,hookId:`compact-budget-hints`,decision:`allow`,reason:`Budget hook active`})}),E.register({id:`flow-step-safety`,order:10,scope:`flow`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log flow step transitions`,fn:()=>({type:`decision`,hookId:`flow-step-safety`,decision:`allow`,reason:`Step permitted`})}),E.register({id:`present-transport-capability`,order:10,scope:`present`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Verify presentation transport is available`,fn:()=>({type:`decision`,hookId:`present-transport-capability`,decision:`allow`,reason:`Transport available`})});let ee=new jo(r.metricThresholds);os(t,d,r.toolPrefix??``,n.eventBus,()=>{let e=r.sources[0]?.path??Ee();try{return be(e)}catch{return`partition:${qe(`sha256`).update(e).digest(`hex`).slice(0,8)}`}}),v&&(v.subscribe({id:`sub-auto-knowledge`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`args`in e)||!(`result`in e))return;let t=e;try{ee.incrementCounter(`tool.call`,{tool:t.toolName}),t.isError&&ee.incrementCounter(`tool.error`,{tool:t.toolName}),x.push({toolName:t.toolName,args:t.args,result:t.result,durationMs:t.durationMs,isError:t.isError,timestamp:new Date(t.timestamp).toISOString(),origin:t.origin,workspaceId:t.workspaceId,requestId:t.requestId})}catch{}},name:`auto-knowledge`}),v.subscribe({id:`sub-replay`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`args`in e)||!(`result`in e))return;let t=e;try{let{replayAppend:e}=await import(`../../tools/dist/index.js`),n=JSON.stringify(t.args),r=JSON.stringify(t.result);e({ts:new Date(t.timestamp).toISOString(),source:`mcp`,tool:t.toolName,input:n.slice(0,2e3),outputChars:r.length,inputChars:n.length,durationMs:t.durationMs,status:t.isError?`error`:`ok`,output:r.slice(0,2e3),traceId:t.requestId??``})}catch{}},name:`replay`}),v.subscribe({id:`sub-procedural`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`isError`in e))return;let t=e;try{w.has(t.toolName)&&T.record(t.toolName,!t.isError)}catch{}},name:`procedural-memory`}),v.subscribe({id:`sub-observations`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`result`in e))return;let t=e;try{let{ObservationEngine:e,DEFAULT_OBSERVATION_CONFIG:r}=await import(`./observations-Cri43dvk.js`),i=new e(n.stateStore,n.curated),{captureFrom:a}=r;a.includes(t.toolName)&&await i.processToolResult(t.toolName,t.result,{})}catch{}},name:`observation-capture`}),v.subscribe({id:`sub-knowledge-metrics`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`result`in e))return;let t=e;if(t.toolName===`knowledge`)try{let e=t.result,n=t.args?.action;(n===`remember`||n===`update`)&&(ee.incrementCounter(`fact.total`),(e?.status===`unchanged`||e?.result===`unchanged`)&&ee.incrementCounter(`fact.duplicate`))}catch{}},name:`knowledge-metrics`}),v.subscribe({id:`sub-session`,eventType:`session:start`,policy:`async`,handler:async e=>{let t=e,n={serverVersion:t.serverVersion,workspaceRoot:t.workspaceRoot,handoff:t.handoff?`${t.handoff.from} (session ${t.handoff.sessionId})`:void 0};vv.info(`Session started`,n)},name:`session-lifecycle`}),b&&(xv=b.subscribeToEventBus(v)));let te=[...S].filter(e=>Go.has(e)?Uo.includes(e)?!!n.bridge:e===`er_update_policy`?!!n.policyStore:e===`er_evolve_review`?!!n.evolutionCollector:!1:!0),D={store:n.store,graphStore:n.graphStore,embedder:n.embedder},ne={onboardComplete:n.onboardComplete,onboardTimestamp:n.onboardTimestamp},re={search:[{name:`search`,register:()=>f_(t,n.embedder,n.store,n.graphStore,n.bridge,n.evolutionCollector,o,n.stateStore,r.memory?.retention,r.memory?.consolidation,p)},{name:`find`,register:()=>wl(t,n.embedder,n.store)},{name:`symbol`,register:()=>Tl(t,n.embedder,n.store,n.graphStore,D)},{name:`trace`,register:()=>El(t,n.embedder,n.store,n.graphStore,D)},{name:`scope_map`,register:()=>Cl(t,n.embedder,n.store,D)},{name:`file_summary`,register:()=>Rl(t,n.embedder,n.fileCache)}],analysis:[{name:`analyze`,register:()=>Nc(t,n.store,n.embedder)},{name:`blast_radius`,register:()=>Pc(t,n.store,n.embedder,n.graphStore,D)}],knowledge:[{name:`knowledge`,register:()=>Cf(t,n.curated,n.policyStore,n.evolutionCollector,a,void 0,n.stateStore,r.memory?.retention,r.memory?.supersession,r.memory?.consolidation,r.memory?.lessons,D,n.graphStore)},{name:`produce_knowledge`,register:()=>Hg(t,a)}],compression:[{name:`digest`,register:()=>Wu(t,n.embedder)}],forge:[{name:`forge_ground`,register:()=>Gu(t,n.embedder,n.store)},{name:`evidence_map`,register:()=>Uu(t)}],presentation:[{name:`present`,register:()=>Bg(t,i)}],execution:[{name:`check`,register:()=>jl(t,D,r.tokenBudget)},{name:`test_run`,register:()=>Nl(t,D)},{name:`eval`,register:()=>Ml(t)},{name:`audit`,register:()=>zc(t,n.store,n.embedder)}],web:[{name:`browser`,register:()=>$n(t,r)},{name:`web_fetch`,register:()=>ed(t)},{name:`web_search`,register:()=>hv(t)}],manipulation:[{name:`rename`,register:()=>Df(t,r)},{name:`restore`,register:()=>Jg(t)},{name:`codemod`,register:()=>Of(t,r)}],session:[{name:`session`,register:()=>A_(t,n.stateStore,o)}],git:[{name:`git`,register:()=>qu(t)},{name:`parse_output`,register:()=>Pl(t)}],process:[{name:`process`,register:()=>$u(t)},{name:`delegate`,register:()=>Fl(t,o)}],system:[{name:`config`,register:()=>fl(t,r)},{name:`status`,register:()=>fv(t,n.store,n.graphStore,n.curated,ne,r,s,c,n.stateStore,n.eventBus,d.decisionHookRegistry,d.getObservationCompressor(),g,_,b)},{name:`reindex`,register:()=>Wg(t,n.indexer,r,n.curated,n.store,a,s,n.eventBus)},{name:`onboard`,register:()=>ap(t,n.store,n.embedder,r,ne,D,o,a)},{name:`graph`,register:()=>Zu(t,n.graphStore)},{name:`replay`,register:()=>Kg(t)}],utilities:[{name:`measure`,register:()=>gv(t)},{name:`env`,register:()=>_v(t)}],queue:[{name:`queue`,register:()=>sp(t)}],flow:[{name:`flow`,register:()=>Vu(t,r,{store:n.store?{search:async(e,t)=>(await n.store.ftsSearch(e,t)).map(e=>({content:e.record.content}))}:null,graphStore:n.graphStore,embedder:n.embedder,curated:n.curated??null,eventBus:n.eventBus??null,skillCompiler:b},e=>{m.activeSlug=e})}]};for(let[,e]of Object.entries(re))for(let{name:t,register:n}of e)C(t)&&n();n.bridge&&(C(`er_push`)&&Uc(t,n.bridge,n.evolutionCollector),C(`er_pull`)&&Wc(t,n.bridge),C(`er_sync_status`)&&Gc(t,n.bridge)),n.policyStore&&C(`er_update_policy`)&&up(t,n.policyStore),n.evolutionCollector&&C(`er_evolve_review`)&&kl(t,n.evolutionCollector),Lf.some(e=>C(e))&&Rf(t,r,te,n.onboardComplete),Ho(t,n.store,n.curated,y,n.eventBus,d.decisionHookRegistry,b)}function Ev(e,t,n){let r=yv(n);r(`check`)&&jl(e,void 0,t.tokenBudget),r(`eval`)&&Ml(e),r(`test_run`)&&Nl(e),r(`parse_output`)&&Pl(e),r(`delegate`)&&Fl(e),r(`git`)&&qu(e),r(`rename`)&&Df(e,t),r(`codemod`)&&Of(e,t),r(`restore`)&&Jg(e),r(`queue`)&&sp(e),r(`process`)&&$u(e),r(`web_fetch`)&&ed(e),Lf.some(e=>r(e))&&Rf(e,t,[...n??new Set(Ia)]),r(`evidence_map`)&&Uu(e),r(`present`)&&Bg(e),r(`browser`)&&$n(e,t),r(`produce_knowledge`)&&Hg(e),r(`replay`)&&Kg(e),r(`status`)&&dv(e),r(`flow`)&&Vu(e,t),r(`web_search`)&&hv(e),r(`measure`)&&gv(e),r(`env`)&&_v(e)}export{U as S,so as _,yg as a,Fa as b,Hc as c,Yo as d,ts as f,Oo as g,Ko as h,Ev as i,xs as l,Wo as m,wv as n,Yf as o,qo as p,Tv as r,Qf as s,Cv as t,os as u,Ia as v,La as x,Ra as y};
3058
+ `)}],structuredContent:o}}catch(e){return hv(e)?(mv.warn(`Measure failed`,{error:`File not found`}),q(`NOT_FOUND`,`File not found`)):(mv.error(`Measure failed`,j(e)),q(`INTERNAL`,`Measure failed: ${e instanceof Error?e.message:String(e)}`))}}))}function vv(e){let t=U(`env`);e.registerTool(`env`,{title:t.title,description:`Get system and runtime environment info. Sensitive env vars are redacted by default.`,outputSchema:Ds,inputSchema:{include_env:I.boolean().default(!1).describe(`Include environment variables`),filter_env:I.string().optional().describe(`Filter env vars by name substring`),show_sensitive:I.boolean().default(!1).describe(`Show sensitive values (keys, tokens, etc.) — redacted by default`)},annotations:t.annotations},J(`env`,async({include_env:e,filter_env:t,show_sensitive:n})=>{let r=Tt({includeEnv:e,filterEnv:t,showSensitive:n}),i=[`## Environment`,``,`**Platform:** ${r.system.platform} ${r.system.arch}`,`**OS:** ${r.system.type} ${r.system.release}`,`**Host:** ${r.system.hostname}`,`**CPUs:** ${r.system.cpus}`,`**Memory:** ${r.system.memoryFreeGb}GB free / ${r.system.memoryTotalGb}GB total`,``,`**Node:** ${r.runtime.node}`,`**V8:** ${r.runtime.v8}`,`**CWD:** ${r.cwd}`];if(r.env){i.push(``,`### Environment Variables`,``);for(let[e,t]of Object.entries(r.env))i.push(`- \`${e}\`: ${t}`)}let a={platform:r.system.platform,arch:r.system.arch,nodeVersion:r.runtime.node,cwd:r.cwd,cpus:r.system.cpus,memoryFreeGb:r.system.memoryFreeGb,memoryTotalGb:r.system.memoryTotalGb};return{content:[{type:`text`,text:i.join(`
3059
+ `)}],structuredContent:a}}))}const yv=k(`register-tools`);function bv(e){return t=>!e||e.has(t)}function xv(e){try{let t=P(e,`.flows`);if(!M(t))return null;let n=ke(t,{withFileTypes:!0});for(let e of n){if(!e.isDirectory())continue;let n=P(t,e.name,`meta.json`);if(M(n)&&JSON.parse(N(n,`utf-8`)).status===`active`)return e.name}}catch{return null}return null}let Sv=null,Cv=null;function wv(){Sv?.(),Sv=null}function Tv(){return Cv?.flush()??Promise.resolve()}function Ev(e){let{server:t,aikit:n,config:r,elicitor:i,resourceNotifier:a,samplingClient:o,indexMode:s,getSmartState:c,getSmartScheduler:l,precomputedActiveTools:u}=e,d=new Oo,f=r.sources[0]?.path??Ee(),p=be(f),m={activeSlug:null};m.activeSlug=xv(f);let h=new Va(P(r.stateDir??``,`flow-context`),()=>m.activeSlug),g=new Ta;g.register(fi()),g.register(va),g.register(ki),g.register(ra),g.register(yi),g.register(pi),g.register(mi),g.register(ha),g.register(gi),g.register(Sa),g.register(na(()=>m.activeSlug?{active:!0,slug:m.activeSlug}:null)),g.register(sa),g.register(ba),g.register(Ei),g.register(aa);let _=new Za(void 0,n.stateStore),v=n.eventBus,y=Q_(r),b=y?new no(y,{debounceMs:5e3},v??void 0,n.curated,void 0,f):null;b&&b.compileNow(`startup`).catch(e=>{yv.warn(`Startup skill compile failed — will retry on next trigger`,{error:String(e)})});let x=new Oa(g,n.curated,{},h,_,v??void 0,n.stateStore);Cv=x;let S=u??xs(r,[...Ia,...Wo],Fa,Ko(r)),C=bv(S),w=new Set([...S].filter(e=>!Lf.includes(e)&&!Ua.has(e))),T=new qa;d.use(Yo(),{order:1,name:`structured-content-guard`}),d.use(Ba(za(r.tokenBudget)),{order:90,name:`compression`});let E=d.decisionHookRegistry;E.register({id:`search-budget`,order:10,scope:`search`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`budgetHint`],reason:`Enforce token budget on search results`,fn:()=>({type:`decision`,hookId:`search-budget`,decision:`allow`,reason:`Budget hook active`})}),E.register({id:`find-path-containment`,order:10,scope:`find`,timeoutMs:50,failurePolicy:`fail-closed`,decisionTypes:[`deny`],reason:`Validate find scope against workspace boundaries`,fn:()=>({type:`decision`,hookId:`find-path-containment`,decision:`allow`,reason:`Path permitted`})}),E.register({id:`knowledge-mutation-safety`,order:10,scope:`knowledge`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`deny`],reason:`Guard against unintended knowledge mutations`,fn:()=>({type:`decision`,hookId:`knowledge-mutation-safety`,decision:`allow`,reason:`Mutation permitted`})}),E.register({id:`check-scoped-run`,order:10,scope:`check`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log check run scope for audit`,fn:()=>({type:`decision`,hookId:`check-scoped-run`,decision:`allow`,reason:`Check run permitted`})}),E.register({id:`test-run-scoped`,order:10,scope:`test_run`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log test run scope for audit`,fn:()=>({type:`decision`,hookId:`test-run-scoped`,decision:`allow`,reason:`Test run permitted`})}),E.register({id:`onboard-path-correctness`,order:10,scope:`onboard`,timeoutMs:50,failurePolicy:`fail-closed`,decisionTypes:[`deny`],reason:`Validate onboard target path is valid and accessible`,fn:()=>({type:`decision`,hookId:`onboard-path-correctness`,decision:`allow`,reason:`Path valid`})}),E.register({id:`compact-budget-hints`,order:10,scope:`compact`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`budgetHint`],reason:`Enforce token budget on compact output`,fn:()=>({type:`decision`,hookId:`compact-budget-hints`,decision:`allow`,reason:`Budget hook active`})}),E.register({id:`flow-step-safety`,order:10,scope:`flow`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log flow step transitions`,fn:()=>({type:`decision`,hookId:`flow-step-safety`,decision:`allow`,reason:`Step permitted`})}),E.register({id:`present-transport-capability`,order:10,scope:`present`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Verify presentation transport is available`,fn:()=>({type:`decision`,hookId:`present-transport-capability`,decision:`allow`,reason:`Transport available`})});let ee=new jo(r.metricThresholds);os(t,d,r.toolPrefix??``,n.eventBus,()=>{let e=r.sources[0]?.path??Ee();try{return be(e)}catch{return`partition:${qe(`sha256`).update(e).digest(`hex`).slice(0,8)}`}}),v&&(v.subscribe({id:`sub-auto-knowledge`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`args`in e)||!(`result`in e))return;let t=e;try{ee.incrementCounter(`tool.call`,{tool:t.toolName}),t.isError&&ee.incrementCounter(`tool.error`,{tool:t.toolName}),x.push({toolName:t.toolName,args:t.args,result:t.result,durationMs:t.durationMs,isError:t.isError,timestamp:new Date(t.timestamp).toISOString(),origin:t.origin,workspaceId:t.workspaceId,requestId:t.requestId})}catch{}},name:`auto-knowledge`}),v.subscribe({id:`sub-replay`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`args`in e)||!(`result`in e))return;let t=e;try{let{replayAppend:e}=await import(`../../tools/dist/index.js`),n=JSON.stringify(t.args),r=JSON.stringify(t.result);e({ts:new Date(t.timestamp).toISOString(),source:`mcp`,tool:t.toolName,input:n.slice(0,2e3),outputChars:r.length,inputChars:n.length,durationMs:t.durationMs,status:t.isError?`error`:`ok`,output:r.slice(0,2e3),traceId:t.requestId??``})}catch{}},name:`replay`}),v.subscribe({id:`sub-procedural`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`isError`in e))return;let t=e;try{w.has(t.toolName)&&T.record(t.toolName,!t.isError)}catch{}},name:`procedural-memory`}),v.subscribe({id:`sub-observations`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`result`in e))return;let t=e;try{let{ObservationEngine:e,DEFAULT_OBSERVATION_CONFIG:r}=await import(`./observations-Cri43dvk.js`),i=new e(n.stateStore,n.curated),{captureFrom:a}=r;a.includes(t.toolName)&&await i.processToolResult(t.toolName,t.result,{})}catch{}},name:`observation-capture`}),v.subscribe({id:`sub-knowledge-metrics`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`result`in e))return;let t=e;if(t.toolName===`knowledge`)try{let e=t.result,n=t.args?.action;(n===`remember`||n===`update`)&&(ee.incrementCounter(`fact.total`),(e?.status===`unchanged`||e?.result===`unchanged`)&&ee.incrementCounter(`fact.duplicate`))}catch{}},name:`knowledge-metrics`}),v.subscribe({id:`sub-session`,eventType:`session:start`,policy:`async`,handler:async e=>{let t=e,n={serverVersion:t.serverVersion,workspaceRoot:t.workspaceRoot,handoff:t.handoff?`${t.handoff.from} (session ${t.handoff.sessionId})`:void 0};yv.info(`Session started`,n)},name:`session-lifecycle`}),b&&(Sv=b.subscribeToEventBus(v)));let te=[...S].filter(e=>Go.has(e)?Uo.includes(e)?!!n.bridge:e===`er_update_policy`?!!n.policyStore:e===`er_evolve_review`?!!n.evolutionCollector:!1:!0),D={store:n.store,graphStore:n.graphStore,embedder:n.embedder},ne={onboardComplete:n.onboardComplete,onboardTimestamp:n.onboardTimestamp},re={search:[{name:`search`,register:()=>f_(t,n.embedder,n.store,n.graphStore,n.bridge,n.evolutionCollector,o,n.stateStore,r.memory?.retention,r.memory?.consolidation,p)},{name:`find`,register:()=>wl(t,n.embedder,n.store)},{name:`symbol`,register:()=>Tl(t,n.embedder,n.store,n.graphStore,D)},{name:`trace`,register:()=>El(t,n.embedder,n.store,n.graphStore,D)},{name:`scope_map`,register:()=>Cl(t,n.embedder,n.store,D)},{name:`file_summary`,register:()=>Rl(t,n.embedder,n.fileCache)}],analysis:[{name:`analyze`,register:()=>Nc(t,n.store,n.embedder)},{name:`blast_radius`,register:()=>Pc(t,n.store,n.embedder,n.graphStore,D)}],knowledge:[{name:`knowledge`,register:()=>Cf(t,n.curated,n.policyStore,n.evolutionCollector,a,void 0,n.stateStore,r.memory?.retention,r.memory?.supersession,r.memory?.consolidation,r.memory?.lessons,D,n.graphStore)},{name:`produce_knowledge`,register:()=>Hg(t,a)}],compression:[{name:`digest`,register:()=>Wu(t,n.embedder)}],forge:[{name:`forge_ground`,register:()=>Gu(t,n.embedder,n.store)},{name:`evidence_map`,register:()=>Uu(t)}],presentation:[{name:`present`,register:()=>Bg(t,i)}],execution:[{name:`check`,register:()=>jl(t,D,r.tokenBudget)},{name:`test_run`,register:()=>Nl(t,D)},{name:`eval`,register:()=>Ml(t)},{name:`audit`,register:()=>zc(t,n.store,n.embedder)}],web:[{name:`browser`,register:()=>$n(t,r)},{name:`web_fetch`,register:()=>ed(t)},{name:`web_search`,register:()=>gv(t)}],manipulation:[{name:`rename`,register:()=>Df(t,r)},{name:`restore`,register:()=>Jg(t)},{name:`codemod`,register:()=>Of(t,r)}],session:[{name:`session`,register:()=>A_(t,n.stateStore,o)}],git:[{name:`git`,register:()=>qu(t)},{name:`parse_output`,register:()=>Pl(t)}],process:[{name:`process`,register:()=>$u(t)},{name:`delegate`,register:()=>Fl(t,o)}],system:[{name:`config`,register:()=>fl(t,r)},{name:`status`,register:()=>pv(t,n.store,n.graphStore,n.curated,ne,r,s,c,n.stateStore,n.eventBus,d.decisionHookRegistry,d.getObservationCompressor(),g,_,b)},{name:`reindex`,register:()=>Wg(t,n.indexer,r,n.curated,n.store,a,s,n.eventBus)},{name:`onboard`,register:()=>ap(t,n.store,n.embedder,r,ne,D,o,a)},{name:`graph`,register:()=>Zu(t,n.graphStore)},{name:`replay`,register:()=>Kg(t)}],utilities:[{name:`measure`,register:()=>_v(t)},{name:`env`,register:()=>vv(t)}],queue:[{name:`queue`,register:()=>sp(t)}],flow:[{name:`flow`,register:()=>Vu(t,r,{store:n.store?{search:async(e,t)=>(await n.store.ftsSearch(e,t)).map(e=>({content:e.record.content}))}:null,graphStore:n.graphStore,embedder:n.embedder,curated:n.curated??null,eventBus:n.eventBus??null,skillCompiler:b},e=>{m.activeSlug=e})}]};for(let[,e]of Object.entries(re))for(let{name:t,register:n}of e)C(t)&&n();n.bridge&&(C(`er_push`)&&Uc(t,n.bridge,n.evolutionCollector),C(`er_pull`)&&Wc(t,n.bridge),C(`er_sync_status`)&&Gc(t,n.bridge)),n.policyStore&&C(`er_update_policy`)&&up(t,n.policyStore),n.evolutionCollector&&C(`er_evolve_review`)&&kl(t,n.evolutionCollector),Lf.some(e=>C(e))&&Rf(t,r,te,n.onboardComplete),Ho(t,n.store,n.curated,y,n.eventBus,d.decisionHookRegistry,b)}function Dv(e,t,n){let r=bv(n);r(`check`)&&jl(e,void 0,t.tokenBudget),r(`eval`)&&Ml(e),r(`test_run`)&&Nl(e),r(`parse_output`)&&Pl(e),r(`delegate`)&&Fl(e),r(`git`)&&qu(e),r(`rename`)&&Df(e,t),r(`codemod`)&&Of(e,t),r(`restore`)&&Jg(e),r(`queue`)&&sp(e),r(`process`)&&$u(e),r(`web_fetch`)&&ed(e),Lf.some(e=>r(e))&&Rf(e,t,[...n??new Set(Ia)]),r(`evidence_map`)&&Uu(e),r(`present`)&&Bg(e),r(`browser`)&&$n(e,t),r(`produce_knowledge`)&&Hg(e),r(`replay`)&&Kg(e),r(`status`)&&fv(e),r(`flow`)&&Vu(e,t),r(`web_search`)&&gv(e),r(`measure`)&&_v(e),r(`env`)&&vv(e)}export{U as S,so as _,yg as a,Fa as b,Hc as c,Yo as d,ts as f,Oo as g,Ko as h,Dv as i,xs as l,Wo as m,Tv as n,Yf as o,qo as p,Ev as r,Qf as s,wv as t,os as u,Ia as v,La as x,Ra as y};
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{c as e,f as t,p as n,s as r}from"./startup-maintenance-D7tKqECM.js";import{n as i,t as a}from"./bin.js";import{reconfigureForWorkspace as o}from"./config-CkXCQx7E.js";import{S as s,_ as c,b as l,c as u,d,f,g as p,h as m,i as h,l as g,m as _,n as ee,o as v,p as te,r as y,s as b,t as x,u as S,v as C,x as w,y as ne}from"./register-tools-BGjUluQH.js";import{fileURLToPath as T}from"node:url";import{AIKIT_PATHS as re,DISPLAY_SERVER_NAME as E,EMBEDDING_DEFAULTS as D,MODEL_REGISTRY as O,addLogListener as k,computePartitionKey as A,createLogger as j,safeCwdOrHome as M,serializeError as N}from"../../core/dist/index.js";import{existsSync as P,mkdirSync as F,statSync as ie}from"node:fs";import{join as I,resolve as ae}from"node:path";import{FileCache as oe,checkpointList as L,checkpointSave as se,listWorksets as R,stashList as ce}from"../../tools/dist/index.js";import{homedir as z}from"node:os";import{McpServer as le}from"@modelcontextprotocol/sdk/server/mcp.js";import{WasmDiagnostics as B,initializeWasm as ue}from"../../chunker/dist/index.js";import{z as V}from"zod";import{EvolutionCollector as de,PolicyStore as fe}from"../../enterprise-bridge/dist/index.js";import{SqliteGraphStore as pe,allMigrations as me,createSqliteAdapter as H,createStateStore as he,createStore as ge,runMigrations as _e}from"../../store/dist/index.js";import{RootsListChangedNotificationSchema as ve}from"@modelcontextprotocol/sdk/types.js";import{buildFormSchema as U,field as W,normalizeResponse as ye}from"../../elicitation/dist/index.js";import{completable as G}from"@modelcontextprotocol/sdk/server/completable.js";import{EmbedderProxy as be}from"../../embeddings/dist/index.js";import{FileHashCache as xe,IncrementalIndexer as Se}from"../../indexer/dist/index.js";import{AsyncLocalStorage as Ce}from"node:async_hooks";function we(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 ye(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,U({confirmed:W.confirm(e)}));return t?.action===`accept`&&t.content?.confirmed===!0},async selectOne(e,t){let r=await n(e,U({selection:W.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,U({selections:W.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,U({text:W.text(e,{description:t})}));if(r?.action!==`accept`)return null;let i=r.content?.text;return typeof i==`string`?i:null}}}const Te={debug:`debug`,info:`info`,warn:`warning`,error:`error`};function Ee(e){return k(({level:t,component:n,message:r,data:i})=>{try{Promise.resolve(e.sendLoggingMessage({level:Te[t],logger:n,data:i?{message:r,...i}:r})).catch(()=>{})}catch{}})}const K=3e4,q=new Map;function De(e,t,n){let r=q.get(e);if(r&&Date.now()<r.expires)return Promise.resolve(r.data);let i=n();return Promise.resolve(i).then(n=>(q.set(e,{data:n,expires:Date.now()+t}),n))}function Oe(){q.clear()}function ke(e,t){return De(`curated-paths`,K,async()=>e.listPaths({limit:5e3})).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Ae(e,t){return De(`file-paths`,K,()=>e.listSourcePaths()).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function je(e,t){return De(`symbol-names`,K,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 Me(e,t){return t?ce(t).map(e=>e.key).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Ne(e){return R().map(e=>e.name).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20)}function Pe(e,t){return t?L(t).map(e=>e.label).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Fe(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(`
2
+ import{c as e,f as t,p as n,s as r}from"./startup-maintenance-D7tKqECM.js";import{n as i,t as a}from"./bin.js";import{reconfigureForWorkspace as o}from"./config-CkXCQx7E.js";import{S as s,_ as c,b as l,c as u,d,f,g as p,h as m,i as h,l as g,m as _,n as ee,o as v,p as te,r as y,s as b,t as x,u as S,v as C,x as w,y as ne}from"./register-tools-BaddGXqY.js";import{fileURLToPath as T}from"node:url";import{AIKIT_PATHS as re,DISPLAY_SERVER_NAME as E,EMBEDDING_DEFAULTS as D,MODEL_REGISTRY as O,addLogListener as k,computePartitionKey as A,createLogger as j,safeCwdOrHome as M,serializeError as N}from"../../core/dist/index.js";import{existsSync as P,mkdirSync as F,statSync as ie}from"node:fs";import{join as I,resolve as ae}from"node:path";import{FileCache as oe,checkpointList as L,checkpointSave as se,listWorksets as R,stashList as ce}from"../../tools/dist/index.js";import{homedir as z}from"node:os";import{McpServer as le}from"@modelcontextprotocol/sdk/server/mcp.js";import{WasmDiagnostics as B,initializeWasm as ue}from"../../chunker/dist/index.js";import{z as V}from"zod";import{EvolutionCollector as de,PolicyStore as fe}from"../../enterprise-bridge/dist/index.js";import{SqliteGraphStore as pe,allMigrations as me,createSqliteAdapter as H,createStateStore as he,createStore as ge,runMigrations as _e}from"../../store/dist/index.js";import{RootsListChangedNotificationSchema as ve}from"@modelcontextprotocol/sdk/types.js";import{buildFormSchema as U,field as W,normalizeResponse as ye}from"../../elicitation/dist/index.js";import{completable as G}from"@modelcontextprotocol/sdk/server/completable.js";import{EmbedderProxy as be}from"../../embeddings/dist/index.js";import{FileHashCache as xe,IncrementalIndexer as Se}from"../../indexer/dist/index.js";import{AsyncLocalStorage as Ce}from"node:async_hooks";function we(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 ye(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,U({confirmed:W.confirm(e)}));return t?.action===`accept`&&t.content?.confirmed===!0},async selectOne(e,t){let r=await n(e,U({selection:W.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,U({selections:W.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,U({text:W.text(e,{description:t})}));if(r?.action!==`accept`)return null;let i=r.content?.text;return typeof i==`string`?i:null}}}const Te={debug:`debug`,info:`info`,warn:`warning`,error:`error`};function Ee(e){return k(({level:t,component:n,message:r,data:i})=>{try{Promise.resolve(e.sendLoggingMessage({level:Te[t],logger:n,data:i?{message:r,...i}:r})).catch(()=>{})}catch{}})}const K=3e4,q=new Map;function De(e,t,n){let r=q.get(e);if(r&&Date.now()<r.expires)return Promise.resolve(r.data);let i=n();return Promise.resolve(i).then(n=>(q.set(e,{data:n,expires:Date.now()+t}),n))}function Oe(){q.clear()}function ke(e,t){return De(`curated-paths`,K,async()=>e.listPaths({limit:5e3})).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Ae(e,t){return De(`file-paths`,K,()=>e.listSourcePaths()).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function je(e,t){return De(`symbol-names`,K,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 Me(e,t){return t?ce(t).map(e=>e.key).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Ne(e){return R().map(e=>e.name).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20)}function Pe(e,t){return t?L(t).map(e=>e.label).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Fe(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:V.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:V.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(`
@@ -1,4 +1,4 @@
1
- import{n as e,t}from"./curated-manager-D4MOFQ-t.js";import{c as n,f as r,p as i,s as a}from"./startup-maintenance-QrloHssd.js";import{reconfigureForWorkspace as o}from"./config-BS9mkd50.js";import{S as s,_ as c,b as l,c as u,d,f,g as p,h as m,i as h,l as g,m as _,n as ee,o as v,p as te,r as y,s as b,t as x,u as S,v as C,x as w,y as ne}from"./register-tools-o8bU18BA.js";import{fileURLToPath as T}from"node:url";import{AIKIT_PATHS as re,DISPLAY_SERVER_NAME as E,EMBEDDING_DEFAULTS as D,MODEL_REGISTRY as O,addLogListener as k,computePartitionKey as A,createLogger as j,safeCwdOrHome as M,serializeError as N}from"../../core/dist/index.js";import{existsSync as P,mkdirSync as F,statSync as ie}from"node:fs";import{join as I,resolve as ae}from"node:path";import{FileCache as oe,checkpointList as L,checkpointSave as se,listWorksets as R,stashList as ce}from"../../tools/dist/index.js";import{homedir as z}from"node:os";import{McpServer as le}from"@modelcontextprotocol/sdk/server/mcp.js";import{WasmDiagnostics as B,initializeWasm as ue}from"../../chunker/dist/index.js";import{z as V}from"zod";import{EvolutionCollector as de,PolicyStore as fe}from"../../enterprise-bridge/dist/index.js";import{SqliteGraphStore as pe,allMigrations as me,createSqliteAdapter as H,createStateStore as he,createStore as ge,runMigrations as _e}from"../../store/dist/index.js";import{RootsListChangedNotificationSchema as ve}from"@modelcontextprotocol/sdk/types.js";import{buildFormSchema as U,field as W,normalizeResponse as ye}from"../../elicitation/dist/index.js";import{completable as G}from"@modelcontextprotocol/sdk/server/completable.js";import{EmbedderProxy as be}from"../../embeddings/dist/index.js";import{FileHashCache as xe,IncrementalIndexer as Se}from"../../indexer/dist/index.js";import{AsyncLocalStorage as Ce}from"node:async_hooks";function we(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 ye(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,U({confirmed:W.confirm(e)}));return t?.action===`accept`&&t.content?.confirmed===!0},async selectOne(e,t){let r=await n(e,U({selection:W.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,U({selections:W.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,U({text:W.text(e,{description:t})}));if(r?.action!==`accept`)return null;let i=r.content?.text;return typeof i==`string`?i:null}}}const Te={debug:`debug`,info:`info`,warn:`warning`,error:`error`};function Ee(e){return k(({level:t,component:n,message:r,data:i})=>{try{Promise.resolve(e.sendLoggingMessage({level:Te[t],logger:n,data:i?{message:r,...i}:r})).catch(()=>{})}catch{}})}const K=3e4,q=new Map;function De(e,t,n){let r=q.get(e);if(r&&Date.now()<r.expires)return Promise.resolve(r.data);let i=n();return Promise.resolve(i).then(n=>(q.set(e,{data:n,expires:Date.now()+t}),n))}function Oe(){q.clear()}function ke(e,t){return De(`curated-paths`,K,async()=>e.listPaths({limit:5e3})).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Ae(e,t){return De(`file-paths`,K,()=>e.listSourcePaths()).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function je(e,t){return De(`symbol-names`,K,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 Me(e,t){return t?ce(t).map(e=>e.key).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Ne(e){return R().map(e=>e.name).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20)}function Pe(e,t){return t?L(t).map(e=>e.label).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Fe(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(`
1
+ import{n as e,t}from"./curated-manager-D4MOFQ-t.js";import{c as n,f as r,p as i,s as a}from"./startup-maintenance-QrloHssd.js";import{reconfigureForWorkspace as o}from"./config-BS9mkd50.js";import{S as s,_ as c,b as l,c as u,d,f,g as p,h as m,i as h,l as g,m as _,n as ee,o as v,p as te,r as y,s as b,t as x,u as S,v as C,x as w,y as ne}from"./register-tools-DWTLkaFG.js";import{fileURLToPath as T}from"node:url";import{AIKIT_PATHS as re,DISPLAY_SERVER_NAME as E,EMBEDDING_DEFAULTS as D,MODEL_REGISTRY as O,addLogListener as k,computePartitionKey as A,createLogger as j,safeCwdOrHome as M,serializeError as N}from"../../core/dist/index.js";import{existsSync as P,mkdirSync as F,statSync as ie}from"node:fs";import{join as I,resolve as ae}from"node:path";import{FileCache as oe,checkpointList as L,checkpointSave as se,listWorksets as R,stashList as ce}from"../../tools/dist/index.js";import{homedir as z}from"node:os";import{McpServer as le}from"@modelcontextprotocol/sdk/server/mcp.js";import{WasmDiagnostics as B,initializeWasm as ue}from"../../chunker/dist/index.js";import{z as V}from"zod";import{EvolutionCollector as de,PolicyStore as fe}from"../../enterprise-bridge/dist/index.js";import{SqliteGraphStore as pe,allMigrations as me,createSqliteAdapter as H,createStateStore as he,createStore as ge,runMigrations as _e}from"../../store/dist/index.js";import{RootsListChangedNotificationSchema as ve}from"@modelcontextprotocol/sdk/types.js";import{buildFormSchema as U,field as W,normalizeResponse as ye}from"../../elicitation/dist/index.js";import{completable as G}from"@modelcontextprotocol/sdk/server/completable.js";import{EmbedderProxy as be}from"../../embeddings/dist/index.js";import{FileHashCache as xe,IncrementalIndexer as Se}from"../../indexer/dist/index.js";import{AsyncLocalStorage as Ce}from"node:async_hooks";function we(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 ye(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,U({confirmed:W.confirm(e)}));return t?.action===`accept`&&t.content?.confirmed===!0},async selectOne(e,t){let r=await n(e,U({selection:W.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,U({selections:W.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,U({text:W.text(e,{description:t})}));if(r?.action!==`accept`)return null;let i=r.content?.text;return typeof i==`string`?i:null}}}const Te={debug:`debug`,info:`info`,warn:`warning`,error:`error`};function Ee(e){return k(({level:t,component:n,message:r,data:i})=>{try{Promise.resolve(e.sendLoggingMessage({level:Te[t],logger:n,data:i?{message:r,...i}:r})).catch(()=>{})}catch{}})}const K=3e4,q=new Map;function De(e,t,n){let r=q.get(e);if(r&&Date.now()<r.expires)return Promise.resolve(r.data);let i=n();return Promise.resolve(i).then(n=>(q.set(e,{data:n,expires:Date.now()+t}),n))}function Oe(){q.clear()}function ke(e,t){return De(`curated-paths`,K,async()=>e.listPaths({limit:5e3})).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Ae(e,t){return De(`file-paths`,K,()=>e.listSourcePaths()).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function je(e,t){return De(`symbol-names`,K,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 Me(e,t){return t?ce(t).map(e=>e.key).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Ne(e){return R().map(e=>e.name).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20)}function Pe(e,t){return t?L(t).map(e=>e.label).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Fe(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(`
2
2
  `)}}]})),e.registerPrompt(`onboard`,{title:`Onboard Codebase`,description:`Analyze the codebase for first-time onboarding — runs all analyzers and produces a knowledge summary`,argsSchema:{path:V.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(`
3
3
  `)}}]})),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(`
4
4
  `)}}]})),e.registerPrompt(`sessionEnd`,{title:`End AI Kit Session`,description:`Persist decisions and create a session checkpoint before ending`,argsSchema:{summary:V.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(`
@@ -1 +1 @@
1
- import{a as e,n as t,r as n,t as r}from"./server-utils-De-aZNQa.js";import{n as i,t as a}from"./startup-maintenance-QrloHssd.js";import{t as o}from"./register-tools-o8bU18BA.js";import{createLogger as s,serializeError as c,setDetailedErrorLoggingEnabled as l}from"../../core/dist/index.js";import{randomUUID as u}from"node:crypto";const d=`__pending__:`;function f(e){return e.startsWith(d)}function p(e){let t=e.headers[`mcp-session-id`];return Array.isArray(t)?t[0]:t}function m(e,t,n,r){e.status(t).json({jsonrpc:`2.0`,error:{code:n,message:r},id:null})}var h=class{options;runtimes=new Map;maxSessions;sessionTimeoutMs;now;constructor(e){this.options=e,this.maxSessions=e.maxSessions??8,this.sessionTimeoutMs=(e.sessionTimeoutMinutes??30)*60*1e3,this.now=e.now??(()=>Date.now())}hasSession(e){return this.runtimes.has(e)}getSessionCount(){return this.runtimes.size}async handleRequest(e,t,n=e.body){let r=p(e),i=r?this.runtimes.get(r):void 0;if(r&&!i){m(t,404,-32001,`Session not found`);return}if(!i){if(e.method!==`POST`){m(t,400,-32e3,`Session required`);return}if(i=await this.createRuntime(t),!i)return}await this.withRuntimeLock(i,async()=>{await i.transport.handleRequest(e,t,n),i.lastAccessAt=this.now();let r=i.transport.sessionId??i.id;e.method!==`DELETE`&&!f(r)&&this.options.onSessionActivity?.(r),e.method===`DELETE`&&!f(r)&&await this.closeSession(r,{closeTransport:!1})})}async closeExpiredSessions(){let e=[...this.runtimes.values()].filter(e=>this.now()-e.lastAccessAt>=this.sessionTimeoutMs).map(e=>e.id);for(let t of e)await this.closeSession(t);return e.length}async closeSession(e,t={}){let n=this.runtimes.get(e);return n?(this.runtimes.delete(e),t.notifySessionEnd!==!1&&!f(e)&&this.options.onSessionEnd?.(e),t.closeTransport!==!1&&await n.transport.close().catch(()=>void 0),await n.server.close().catch(()=>void 0),!0):!1}async closeAll(){let e=[...this.runtimes.keys()];for(let t of e)await this.closeSession(t)}async createRuntime(e){if(await this.closeExpiredSessions(),this.runtimes.size>=this.maxSessions){m(e,503,-32003,`Session capacity reached`);return}let t=this.now(),n=await this.options.createServer(),r={id:`${d}${u()}`,transport:void 0,createdAt:t,lastAccessAt:t,server:n,requestChain:Promise.resolve()},i=this.options.createTransport({sessionIdGenerator:()=>u(),onsessioninitialized:async e=>{this.runtimes.delete(r.id),r.id=e,this.runtimes.set(e,r),this.options.onSessionStart?.(e)},onsessionclosed:async e=>{e&&await this.closeSession(e,{closeTransport:!1})}});return r.transport=i,i.onclose=()=>{let e=r.transport.sessionId??r.id;this.closeSession(e,{closeTransport:!1})},this.runtimes.set(r.id,r),await n.connect(i),r}async withRuntimeLock(e,t){let n=e.requestChain,r;e.requestChain=new Promise(e=>{r=e}),await n;try{await t()}finally{r()}}};function g(e){let t=e.includes(`T`)?e:`${e.replace(` `,`T`)}Z`;return Date.parse(t)}var _=class{stateStore;options;gcTimer=null;constructor(e,t={}){this.stateStore=e,this.options=t}onSessionStart(e,t){this.stateStore.sessionCreate(e,t)}onSessionActivity(e){this.stateStore.sessionTouch(e)}onSessionEnd(e){this.stateStore.sessionDelete(e),Promise.resolve(this.options.onSessionEndMaintenance?.(e)).catch(()=>{})}startGC(){if(this.gcTimer)return;let e=(this.options.gcIntervalMinutes??5)*60*1e3;this.gcTimer=setInterval(()=>{this.runGC()},e),this.gcTimer.unref()}runGC(){let e=this.getStaleSessionIds();for(let t of e)this.options.onBeforeSessionDelete?.(t),Promise.resolve(this.options.onSessionEndMaintenance?.(t)).catch(()=>{}),this.stateStore.sessionDelete(t);return e.length}stop(){this.gcTimer&&=(clearInterval(this.gcTimer),null)}getActiveSessions(){return this.stateStore.sessionList().length}listSessions(){return this.stateStore.sessionList()}getStaleSessionIds(e=Date.now()){let t=(this.options.staleTimeoutMinutes??30)*60*1e3;return this.stateStore.sessionList().filter(n=>{let r=g(n.lastActivity);return Number.isFinite(r)&&e-r>=t}).map(e=>e.sessionId)}};const v=s(`server`);async function y(s,d){let[{default:f},{loadConfig:p,resolveIndexMode:m},{registerDashboardRoutes:g,resolveDashboardDir:y},{registerSettingsRoutes:b,resolveSettingsDir:x},{createSettingsRouter:S},{authMiddleware:C,getOrCreateToken:w}]=await Promise.all([import(`express`),import(`./config-BS9mkd50.js`),import(`./dashboard-static-q97RHnd3.js`),import(`./settings-static-HY0egyKG.js`),import(`./routes-DsSm9ea0.js`),import(`./auth-7LFAZQBu.js`).then(e=>e.t)]),T=p();l(T.logging?.errorDetails===!0),T.configError&&v.warn(`Config load failure`,{error:T.configError}),v.info(`Config loaded`,{sourceCount:T.sources.length,storePath:T.store.path});let E=f();E.use(f.json({limit:`1mb`}));let D=Number(d),O=`http://localhost:${D}`,k=process.env.AIKIT_CORS_ORIGIN??O,A=process.env.AIKIT_ALLOW_ANY_ORIGIN===`true`,j=n(`AIKIT_HTTP_MAX_SESSIONS`,8),M=n(`AIKIT_HTTP_SESSION_TIMEOUT_MINUTES`,30),N=n(`AIKIT_HTTP_SESSION_GC_INTERVAL_MINUTES`,5),P=r({limit:100,windowMs:6e4}),F=!1;E.use((t,n,r)=>{let i=Array.isArray(t.headers.origin)?t.headers.origin[0]:t.headers.origin,a=e({requestOrigin:i,configuredOrigin:k,allowAnyOrigin:A,fallbackOrigin:O});if(a.warn&&!F&&(F=!0,v.warn(`Rejected non-local CORS origin while AIKIT_CORS_ORIGIN=*`,{origin:i,allowAnyOriginEnv:`AIKIT_ALLOW_ANY_ORIGIN=true`})),i&&!a.allowOrigin){n.status(403).json({error:`Origin not allowed`});return}if(a.allowOrigin&&n.setHeader(`Access-Control-Allow-Origin`,a.allowOrigin),n.setHeader(`Access-Control-Allow-Methods`,`GET, POST, PUT, PATCH, DELETE, OPTIONS`),n.setHeader(`Access-Control-Allow-Headers`,`Content-Type, Authorization, Mcp-Session-Id, Mcp-Protocol-Version, Last-Event-ID`),n.setHeader(`Access-Control-Expose-Headers`,`Mcp-Session-Id`),t.method===`OPTIONS`){n.status(204).end();return}r()});let I=w();E.use(C(I)),E.use(`/mcp`,(e,n,r)=>{let i=t(e)??e.ip??e.socket.remoteAddress??`anonymous`;if(P.allow(i)){r();return}let a=Math.max(1,Math.ceil(P.getRetryAfterMs(i)/1e3));n.setHeader(`Retry-After`,String(a)),n.status(429).json({jsonrpc:`2.0`,error:{code:-32003,message:`Rate limit exceeded`},id:null})});let L;E.use(`/mcp`,(e,t,n)=>{if(!L){let t=e.headers[`x-workspace-root`];typeof t==`string`&&t.length>0&&(L=t,v.debug(`Captured workspace root from proxy header`,{wsRoot:t}))}n()}),g(E,y(),v);let R=new Date().toISOString();E.use(`/settings/api`,S({log:v,mcpInfo:()=>({transport:`http`,port:D,pid:process.pid,startedAt:R})})),b(E,x(),v),E.get(`/health`,(e,t)=>{t.json({status:`ok`})});let z=!1,B=null,V=null,H=null,U=null,W=null,G=null,K=null,q=null,J=Promise.resolve(),Y=async(e,n)=>{if(!z||!H||!U){n.status(503).json({jsonrpc:`2.0`,error:{code:-32603,message:`Server initializing — please retry in a few seconds`},id:null});return}let r=J,i;J=new Promise(e=>{i=e});let a={POST:6e4,GET:1e4,DELETE:1e4}[e.method]??3e4;if(!await Promise.race([r.then(()=>!0),new Promise(t=>{let n=setTimeout(()=>{v.warn(`mcpLock timed out waiting for previous request, resetting lock chain`,{method:e.method,timeoutMs:a}),t(!1)},a);n.unref&&n.unref()})])&&(J=Promise.resolve(),i=()=>{},G)){let e=G;G=null,K=null,e.close().catch(()=>{})}try{let r=t(e);if(!G){if(r){n.status(404).json({jsonrpc:`2.0`,error:{code:-32001,message:`Session not found`},id:null});return}let e=new U({sessionIdGenerator:()=>u(),onsessioninitialized:async e=>{K=e,V?.onSessionStart(e,{transport:`http`})},onsessionclosed:async e=>{e&&V?.onSessionEnd(e),K=null}});e.onclose=()=>{G===e&&(G=null),K===e.sessionId&&(K=null)},G=e,await H.connect(e)}let i=G;await i.handleRequest(e,n,e.body),e.method!==`DELETE`&&(!r&&i.sessionId?(K=i.sessionId,V?.onSessionStart(i.sessionId,{transport:`http`}),V?.onSessionActivity(i.sessionId)):r&&V?.onSessionActivity(r))}catch(e){if(v.error(`MCP handler error`,c(e)),!n.headersSent){let t=e instanceof Error?e.message:String(e),r=t.includes(`Not Acceptable`);n.status(r?406:500).json({jsonrpc:`2.0`,error:{code:r?-32e3:-32603,message:r?t:`Internal server error`},id:null})}}finally{i()}},X=async(e,n)=>{let r=t(e);if(W&&(!G||r!==K)){await W.handleRequest(e,n,e.body);return}await Y(e,n)};E.post(`/mcp`,X),E.get(`/mcp`,X),E.delete(`/mcp`,X);let Z=E.listen(D,`127.0.0.1`,()=>{v.info(`MCP server listening`,{url:`http://127.0.0.1:${D}/mcp`,port:D}),setTimeout(async()=>{try{typeof L==`string`&&L.length>0&&(T.sources[0]={path:L,excludePatterns:T.sources[0]?.excludePatterns??[]},T.allRoots=[L],v.debug(`Workspace root applied from proxy header`,{wsRoot:L}));let[{createLazyServer:e,createMcpServer:t,ALL_TOOL_NAMES:n},{StreamableHTTPServerTransport:r},{checkForUpdates:o,autoUpgradeScaffold:l}]=await Promise.all([import(`./server-B4hZQsSd.js`),import(`@modelcontextprotocol/sdk/server/streamableHttp.js`),import(`./startup-maintenance-QrloHssd.js`).then(e=>e.u)]);o(),l(),setInterval(o,1440*60*1e3).unref();let u=!1,d=m(T),f=e(T,d);q=async()=>{f.aikit&&await Promise.all([f.aikit.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),f.aikit.graphStore.close().catch(()=>{}),f.aikit.closeStateStore?.().catch(()=>{})??Promise.resolve(),f.aikit.store.close().catch(()=>{})])},H=f.server,U=r,z=!0,v.debug(`MCP server configured (lazy — AI Kit initializing in background)`,{toolCount:n.length,resourceCount:2}),f.startInit(),f.ready.then(async()=>{try{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);V=new _(f.aikit.stateStore,{staleTimeoutMinutes:M,gcIntervalMinutes:N,onBeforeSessionDelete:e=>{if(K===e&&G){let e=G;G=null,K=null,e.close().catch(()=>void 0)}W?.closeSession(e,{notifySessionEnd:!1})},onSessionEndMaintenance:async()=>{if(!f.aikit?.curated||!f.aikit?.stateStore)return;let{pruneLessons:e}=await import(`./startup-maintenance-QrloHssd.js`).then(e=>e.x),t=await e(f.aikit.curated,f.aikit.stateStore,{dryRun:!1});t.pruned.length>0&&v.info(`Session-end lesson prune`,{pruned:t.pruned.length})}}),W=new h({createServer:()=>{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);return t(f.aikit,T)},createTransport:e=>new r(e),maxSessions:j,sessionTimeoutMinutes:M,onSessionStart:e=>V?.onSessionStart(e,{transport:`http`}),onSessionActivity:e=>V?.onSessionActivity(e),onSessionEnd:e=>V?.onSessionEnd(e)}),V.startGC(),K&&(V.onSessionStart(K,{transport:`http`}),V.onSessionActivity(K)),v.info(`HTTP session runtime ready`,{maxSessions:j,sessionTimeoutMinutes:M,gcIntervalMinutes:N})}catch(e){v.error(`Failed to start session manager`,c(e)),z=!1,u=!0,H=null,U=null,q=null}}),d===`auto`?f.ready.then(async()=>{try{let e=T.sources.map(e=>e.path).join(`, `);v.info(`Running initial index`,{sourcePaths:e}),await f.runInitialIndex(),v.info(`Initial index complete`)}catch(e){v.error(`Initial index failed; will retry on aikit_reindex`,i(s,e))}}):d===`smart`?u||f.ready.then(async()=>{try{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(f.aikit.indexer,T,f.aikit.store),n=f.aikit.store;B=t,t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),f.setSmartScheduler(t),v.debug(`Smart index scheduler started (HTTP mode)`)}catch(e){v.error(`Failed to start smart index scheduler`,i(s,e))}}):v.info(`Initial full indexing skipped in HTTP mode`,{indexMode:d}),f.ready.catch(e=>{v.error(`AI Kit initialization failed`,i(s,e)),z=!1,u=!0,H=null,U=null,q=null}),a(f.ready,()=>f.aikit?{curated:f.aikit.curated,stateStore:f.aikit.stateStore}:null,s)}catch(e){v.error(`Failed to load server modules`,i(s,e)),z=!1,q=null}},100)}),Q=!1,$=async e=>{Q||(Q=!0,v.info(`Shutdown signal received`,{signal:e}),o(),B?.stop(),V?.stop(),await import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),await W?.closeAll().catch(()=>void 0),K&&V?.onSessionEnd(K),G&&(await G.close().catch(()=>void 0),G=null,K=null),Z.close(),H&&await H.close(),await q?.().catch(()=>void 0),process.exit(0))};process.on(`SIGINT`,()=>$(`SIGINT`)),process.on(`SIGTERM`,()=>$(`SIGTERM`))}export{y as startHttpMode};
1
+ import{a as e,n as t,r as n,t as r}from"./server-utils-De-aZNQa.js";import{n as i,t as a}from"./startup-maintenance-QrloHssd.js";import{t as o}from"./register-tools-DWTLkaFG.js";import{createLogger as s,serializeError as c,setDetailedErrorLoggingEnabled as l}from"../../core/dist/index.js";import{randomUUID as u}from"node:crypto";const d=`__pending__:`;function f(e){return e.startsWith(d)}function p(e){let t=e.headers[`mcp-session-id`];return Array.isArray(t)?t[0]:t}function m(e,t,n,r){e.status(t).json({jsonrpc:`2.0`,error:{code:n,message:r},id:null})}var h=class{options;runtimes=new Map;maxSessions;sessionTimeoutMs;now;constructor(e){this.options=e,this.maxSessions=e.maxSessions??8,this.sessionTimeoutMs=(e.sessionTimeoutMinutes??30)*60*1e3,this.now=e.now??(()=>Date.now())}hasSession(e){return this.runtimes.has(e)}getSessionCount(){return this.runtimes.size}async handleRequest(e,t,n=e.body){let r=p(e),i=r?this.runtimes.get(r):void 0;if(r&&!i){m(t,404,-32001,`Session not found`);return}if(!i){if(e.method!==`POST`){m(t,400,-32e3,`Session required`);return}if(i=await this.createRuntime(t),!i)return}await this.withRuntimeLock(i,async()=>{await i.transport.handleRequest(e,t,n),i.lastAccessAt=this.now();let r=i.transport.sessionId??i.id;e.method!==`DELETE`&&!f(r)&&this.options.onSessionActivity?.(r),e.method===`DELETE`&&!f(r)&&await this.closeSession(r,{closeTransport:!1})})}async closeExpiredSessions(){let e=[...this.runtimes.values()].filter(e=>this.now()-e.lastAccessAt>=this.sessionTimeoutMs).map(e=>e.id);for(let t of e)await this.closeSession(t);return e.length}async closeSession(e,t={}){let n=this.runtimes.get(e);return n?(this.runtimes.delete(e),t.notifySessionEnd!==!1&&!f(e)&&this.options.onSessionEnd?.(e),t.closeTransport!==!1&&await n.transport.close().catch(()=>void 0),await n.server.close().catch(()=>void 0),!0):!1}async closeAll(){let e=[...this.runtimes.keys()];for(let t of e)await this.closeSession(t)}async createRuntime(e){if(await this.closeExpiredSessions(),this.runtimes.size>=this.maxSessions){m(e,503,-32003,`Session capacity reached`);return}let t=this.now(),n=await this.options.createServer(),r={id:`${d}${u()}`,transport:void 0,createdAt:t,lastAccessAt:t,server:n,requestChain:Promise.resolve()},i=this.options.createTransport({sessionIdGenerator:()=>u(),onsessioninitialized:async e=>{this.runtimes.delete(r.id),r.id=e,this.runtimes.set(e,r),this.options.onSessionStart?.(e)},onsessionclosed:async e=>{e&&await this.closeSession(e,{closeTransport:!1})}});return r.transport=i,i.onclose=()=>{let e=r.transport.sessionId??r.id;this.closeSession(e,{closeTransport:!1})},this.runtimes.set(r.id,r),await n.connect(i),r}async withRuntimeLock(e,t){let n=e.requestChain,r;e.requestChain=new Promise(e=>{r=e}),await n;try{await t()}finally{r()}}};function g(e){let t=e.includes(`T`)?e:`${e.replace(` `,`T`)}Z`;return Date.parse(t)}var _=class{stateStore;options;gcTimer=null;constructor(e,t={}){this.stateStore=e,this.options=t}onSessionStart(e,t){this.stateStore.sessionCreate(e,t)}onSessionActivity(e){this.stateStore.sessionTouch(e)}onSessionEnd(e){this.stateStore.sessionDelete(e),Promise.resolve(this.options.onSessionEndMaintenance?.(e)).catch(()=>{})}startGC(){if(this.gcTimer)return;let e=(this.options.gcIntervalMinutes??5)*60*1e3;this.gcTimer=setInterval(()=>{this.runGC()},e),this.gcTimer.unref()}runGC(){let e=this.getStaleSessionIds();for(let t of e)this.options.onBeforeSessionDelete?.(t),Promise.resolve(this.options.onSessionEndMaintenance?.(t)).catch(()=>{}),this.stateStore.sessionDelete(t);return e.length}stop(){this.gcTimer&&=(clearInterval(this.gcTimer),null)}getActiveSessions(){return this.stateStore.sessionList().length}listSessions(){return this.stateStore.sessionList()}getStaleSessionIds(e=Date.now()){let t=(this.options.staleTimeoutMinutes??30)*60*1e3;return this.stateStore.sessionList().filter(n=>{let r=g(n.lastActivity);return Number.isFinite(r)&&e-r>=t}).map(e=>e.sessionId)}};const v=s(`server`);async function y(s,d){let[{default:f},{loadConfig:p,resolveIndexMode:m},{registerDashboardRoutes:g,resolveDashboardDir:y},{registerSettingsRoutes:b,resolveSettingsDir:x},{createSettingsRouter:S},{authMiddleware:C,getOrCreateToken:w}]=await Promise.all([import(`express`),import(`./config-BS9mkd50.js`),import(`./dashboard-static-q97RHnd3.js`),import(`./settings-static-HY0egyKG.js`),import(`./routes-DsSm9ea0.js`),import(`./auth-7LFAZQBu.js`).then(e=>e.t)]),T=p();l(T.logging?.errorDetails===!0),T.configError&&v.warn(`Config load failure`,{error:T.configError}),v.info(`Config loaded`,{sourceCount:T.sources.length,storePath:T.store.path});let E=f();E.use(f.json({limit:`1mb`}));let D=Number(d),O=`http://localhost:${D}`,k=process.env.AIKIT_CORS_ORIGIN??O,A=process.env.AIKIT_ALLOW_ANY_ORIGIN===`true`,j=n(`AIKIT_HTTP_MAX_SESSIONS`,8),M=n(`AIKIT_HTTP_SESSION_TIMEOUT_MINUTES`,30),N=n(`AIKIT_HTTP_SESSION_GC_INTERVAL_MINUTES`,5),P=r({limit:100,windowMs:6e4}),F=!1;E.use((t,n,r)=>{let i=Array.isArray(t.headers.origin)?t.headers.origin[0]:t.headers.origin,a=e({requestOrigin:i,configuredOrigin:k,allowAnyOrigin:A,fallbackOrigin:O});if(a.warn&&!F&&(F=!0,v.warn(`Rejected non-local CORS origin while AIKIT_CORS_ORIGIN=*`,{origin:i,allowAnyOriginEnv:`AIKIT_ALLOW_ANY_ORIGIN=true`})),i&&!a.allowOrigin){n.status(403).json({error:`Origin not allowed`});return}if(a.allowOrigin&&n.setHeader(`Access-Control-Allow-Origin`,a.allowOrigin),n.setHeader(`Access-Control-Allow-Methods`,`GET, POST, PUT, PATCH, DELETE, OPTIONS`),n.setHeader(`Access-Control-Allow-Headers`,`Content-Type, Authorization, Mcp-Session-Id, Mcp-Protocol-Version, Last-Event-ID`),n.setHeader(`Access-Control-Expose-Headers`,`Mcp-Session-Id`),t.method===`OPTIONS`){n.status(204).end();return}r()});let I=w();E.use(C(I)),E.use(`/mcp`,(e,n,r)=>{let i=t(e)??e.ip??e.socket.remoteAddress??`anonymous`;if(P.allow(i)){r();return}let a=Math.max(1,Math.ceil(P.getRetryAfterMs(i)/1e3));n.setHeader(`Retry-After`,String(a)),n.status(429).json({jsonrpc:`2.0`,error:{code:-32003,message:`Rate limit exceeded`},id:null})});let L;E.use(`/mcp`,(e,t,n)=>{if(!L){let t=e.headers[`x-workspace-root`];typeof t==`string`&&t.length>0&&(L=t,v.debug(`Captured workspace root from proxy header`,{wsRoot:t}))}n()}),g(E,y(),v);let R=new Date().toISOString();E.use(`/settings/api`,S({log:v,mcpInfo:()=>({transport:`http`,port:D,pid:process.pid,startedAt:R})})),b(E,x(),v),E.get(`/health`,(e,t)=>{t.json({status:`ok`})});let z=!1,B=null,V=null,H=null,U=null,W=null,G=null,K=null,q=null,J=Promise.resolve(),Y=async(e,n)=>{if(!z||!H||!U){n.status(503).json({jsonrpc:`2.0`,error:{code:-32603,message:`Server initializing — please retry in a few seconds`},id:null});return}let r=J,i;J=new Promise(e=>{i=e});let a={POST:6e4,GET:1e4,DELETE:1e4}[e.method]??3e4;if(!await Promise.race([r.then(()=>!0),new Promise(t=>{let n=setTimeout(()=>{v.warn(`mcpLock timed out waiting for previous request, resetting lock chain`,{method:e.method,timeoutMs:a}),t(!1)},a);n.unref&&n.unref()})])&&(J=Promise.resolve(),i=()=>{},G)){let e=G;G=null,K=null,e.close().catch(()=>{})}try{let r=t(e);if(!G){if(r){n.status(404).json({jsonrpc:`2.0`,error:{code:-32001,message:`Session not found`},id:null});return}let e=new U({sessionIdGenerator:()=>u(),onsessioninitialized:async e=>{K=e,V?.onSessionStart(e,{transport:`http`})},onsessionclosed:async e=>{e&&V?.onSessionEnd(e),K=null}});e.onclose=()=>{G===e&&(G=null),K===e.sessionId&&(K=null)},G=e,await H.connect(e)}let i=G;await i.handleRequest(e,n,e.body),e.method!==`DELETE`&&(!r&&i.sessionId?(K=i.sessionId,V?.onSessionStart(i.sessionId,{transport:`http`}),V?.onSessionActivity(i.sessionId)):r&&V?.onSessionActivity(r))}catch(e){if(v.error(`MCP handler error`,c(e)),!n.headersSent){let t=e instanceof Error?e.message:String(e),r=t.includes(`Not Acceptable`);n.status(r?406:500).json({jsonrpc:`2.0`,error:{code:r?-32e3:-32603,message:r?t:`Internal server error`},id:null})}}finally{i()}},X=async(e,n)=>{let r=t(e);if(W&&(!G||r!==K)){await W.handleRequest(e,n,e.body);return}await Y(e,n)};E.post(`/mcp`,X),E.get(`/mcp`,X),E.delete(`/mcp`,X);let Z=E.listen(D,`127.0.0.1`,()=>{v.info(`MCP server listening`,{url:`http://127.0.0.1:${D}/mcp`,port:D}),setTimeout(async()=>{try{typeof L==`string`&&L.length>0&&(T.sources[0]={path:L,excludePatterns:T.sources[0]?.excludePatterns??[]},T.allRoots=[L],v.debug(`Workspace root applied from proxy header`,{wsRoot:L}));let[{createLazyServer:e,createMcpServer:t,ALL_TOOL_NAMES:n},{StreamableHTTPServerTransport:r},{checkForUpdates:o,autoUpgradeScaffold:l}]=await Promise.all([import(`./server-by4LpJpg.js`),import(`@modelcontextprotocol/sdk/server/streamableHttp.js`),import(`./startup-maintenance-QrloHssd.js`).then(e=>e.u)]);o(),l(),setInterval(o,1440*60*1e3).unref();let u=!1,d=m(T),f=e(T,d);q=async()=>{f.aikit&&await Promise.all([f.aikit.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),f.aikit.graphStore.close().catch(()=>{}),f.aikit.closeStateStore?.().catch(()=>{})??Promise.resolve(),f.aikit.store.close().catch(()=>{})])},H=f.server,U=r,z=!0,v.debug(`MCP server configured (lazy — AI Kit initializing in background)`,{toolCount:n.length,resourceCount:2}),f.startInit(),f.ready.then(async()=>{try{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);V=new _(f.aikit.stateStore,{staleTimeoutMinutes:M,gcIntervalMinutes:N,onBeforeSessionDelete:e=>{if(K===e&&G){let e=G;G=null,K=null,e.close().catch(()=>void 0)}W?.closeSession(e,{notifySessionEnd:!1})},onSessionEndMaintenance:async()=>{if(!f.aikit?.curated||!f.aikit?.stateStore)return;let{pruneLessons:e}=await import(`./startup-maintenance-QrloHssd.js`).then(e=>e.x),t=await e(f.aikit.curated,f.aikit.stateStore,{dryRun:!1});t.pruned.length>0&&v.info(`Session-end lesson prune`,{pruned:t.pruned.length})}}),W=new h({createServer:()=>{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);return t(f.aikit,T)},createTransport:e=>new r(e),maxSessions:j,sessionTimeoutMinutes:M,onSessionStart:e=>V?.onSessionStart(e,{transport:`http`}),onSessionActivity:e=>V?.onSessionActivity(e),onSessionEnd:e=>V?.onSessionEnd(e)}),V.startGC(),K&&(V.onSessionStart(K,{transport:`http`}),V.onSessionActivity(K)),v.info(`HTTP session runtime ready`,{maxSessions:j,sessionTimeoutMinutes:M,gcIntervalMinutes:N})}catch(e){v.error(`Failed to start session manager`,c(e)),z=!1,u=!0,H=null,U=null,q=null}}),d===`auto`?f.ready.then(async()=>{try{let e=T.sources.map(e=>e.path).join(`, `);v.info(`Running initial index`,{sourcePaths:e}),await f.runInitialIndex(),v.info(`Initial index complete`)}catch(e){v.error(`Initial index failed; will retry on aikit_reindex`,i(s,e))}}):d===`smart`?u||f.ready.then(async()=>{try{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(f.aikit.indexer,T,f.aikit.store),n=f.aikit.store;B=t,t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),f.setSmartScheduler(t),v.debug(`Smart index scheduler started (HTTP mode)`)}catch(e){v.error(`Failed to start smart index scheduler`,i(s,e))}}):v.info(`Initial full indexing skipped in HTTP mode`,{indexMode:d}),f.ready.catch(e=>{v.error(`AI Kit initialization failed`,i(s,e)),z=!1,u=!0,H=null,U=null,q=null}),a(f.ready,()=>f.aikit?{curated:f.aikit.curated,stateStore:f.aikit.stateStore}:null,s)}catch(e){v.error(`Failed to load server modules`,i(s,e)),z=!1,q=null}},100)}),Q=!1,$=async e=>{Q||(Q=!0,v.info(`Shutdown signal received`,{signal:e}),o(),B?.stop(),V?.stop(),await import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),await W?.closeAll().catch(()=>void 0),K&&V?.onSessionEnd(K),G&&(await G.close().catch(()=>void 0),G=null,K=null),Z.close(),H&&await H.close(),await q?.().catch(()=>void 0),process.exit(0))};process.on(`SIGINT`,()=>$(`SIGINT`)),process.on(`SIGTERM`,()=>$(`SIGTERM`))}export{y as startHttpMode};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{n as e,t}from"./startup-maintenance-D7tKqECM.js";import{a as n,i as r,o as i,s as a}from"./bin.js";import{t as o}from"./register-tools-BGjUluQH.js";import{createLogger as s,serializeError as c,setDetailedErrorLoggingEnabled as l}from"../../core/dist/index.js";import{randomUUID as u}from"node:crypto";const d=`__pending__:`;function f(e){return e.startsWith(d)}function p(e){let t=e.headers[`mcp-session-id`];return Array.isArray(t)?t[0]:t}function m(e,t,n,r){e.status(t).json({jsonrpc:`2.0`,error:{code:n,message:r},id:null})}var h=class{options;runtimes=new Map;maxSessions;sessionTimeoutMs;now;constructor(e){this.options=e,this.maxSessions=e.maxSessions??8,this.sessionTimeoutMs=(e.sessionTimeoutMinutes??30)*60*1e3,this.now=e.now??(()=>Date.now())}hasSession(e){return this.runtimes.has(e)}getSessionCount(){return this.runtimes.size}async handleRequest(e,t,n=e.body){let r=p(e),i=r?this.runtimes.get(r):void 0;if(r&&!i){m(t,404,-32001,`Session not found`);return}if(!i){if(e.method!==`POST`){m(t,400,-32e3,`Session required`);return}if(i=await this.createRuntime(t),!i)return}await this.withRuntimeLock(i,async()=>{await i.transport.handleRequest(e,t,n),i.lastAccessAt=this.now();let r=i.transport.sessionId??i.id;e.method!==`DELETE`&&!f(r)&&this.options.onSessionActivity?.(r),e.method===`DELETE`&&!f(r)&&await this.closeSession(r,{closeTransport:!1})})}async closeExpiredSessions(){let e=[...this.runtimes.values()].filter(e=>this.now()-e.lastAccessAt>=this.sessionTimeoutMs).map(e=>e.id);for(let t of e)await this.closeSession(t);return e.length}async closeSession(e,t={}){let n=this.runtimes.get(e);return n?(this.runtimes.delete(e),t.notifySessionEnd!==!1&&!f(e)&&this.options.onSessionEnd?.(e),t.closeTransport!==!1&&await n.transport.close().catch(()=>void 0),await n.server.close().catch(()=>void 0),!0):!1}async closeAll(){let e=[...this.runtimes.keys()];for(let t of e)await this.closeSession(t)}async createRuntime(e){if(await this.closeExpiredSessions(),this.runtimes.size>=this.maxSessions){m(e,503,-32003,`Session capacity reached`);return}let t=this.now(),n=await this.options.createServer(),r={id:`${d}${u()}`,transport:void 0,createdAt:t,lastAccessAt:t,server:n,requestChain:Promise.resolve()},i=this.options.createTransport({sessionIdGenerator:()=>u(),onsessioninitialized:async e=>{this.runtimes.delete(r.id),r.id=e,this.runtimes.set(e,r),this.options.onSessionStart?.(e)},onsessionclosed:async e=>{e&&await this.closeSession(e,{closeTransport:!1})}});return r.transport=i,i.onclose=()=>{let e=r.transport.sessionId??r.id;this.closeSession(e,{closeTransport:!1})},this.runtimes.set(r.id,r),await n.connect(i),r}async withRuntimeLock(e,t){let n=e.requestChain,r;e.requestChain=new Promise(e=>{r=e}),await n;try{await t()}finally{r()}}};function g(e){let t=e.includes(`T`)?e:`${e.replace(` `,`T`)}Z`;return Date.parse(t)}var _=class{stateStore;options;gcTimer=null;constructor(e,t={}){this.stateStore=e,this.options=t}onSessionStart(e,t){this.stateStore.sessionCreate(e,t)}onSessionActivity(e){this.stateStore.sessionTouch(e)}onSessionEnd(e){this.stateStore.sessionDelete(e),Promise.resolve(this.options.onSessionEndMaintenance?.(e)).catch(()=>{})}startGC(){if(this.gcTimer)return;let e=(this.options.gcIntervalMinutes??5)*60*1e3;this.gcTimer=setInterval(()=>{this.runGC()},e),this.gcTimer.unref()}runGC(){let e=this.getStaleSessionIds();for(let t of e)this.options.onBeforeSessionDelete?.(t),Promise.resolve(this.options.onSessionEndMaintenance?.(t)).catch(()=>{}),this.stateStore.sessionDelete(t);return e.length}stop(){this.gcTimer&&=(clearInterval(this.gcTimer),null)}getActiveSessions(){return this.stateStore.sessionList().length}listSessions(){return this.stateStore.sessionList()}getStaleSessionIds(e=Date.now()){let t=(this.options.staleTimeoutMinutes??30)*60*1e3;return this.stateStore.sessionList().filter(n=>{let r=g(n.lastActivity);return Number.isFinite(r)&&e-r>=t}).map(e=>e.sessionId)}};const v=s(`server`);async function y(s,d){let[{default:f},{loadConfig:p,resolveIndexMode:m},{registerDashboardRoutes:g,resolveDashboardDir:y},{registerSettingsRoutes:b,resolveSettingsDir:x},{createSettingsRouter:S},{authMiddleware:C,getOrCreateToken:w}]=await Promise.all([import(`express`),import(`./config-CkXCQx7E.js`),import(`./dashboard-static-CVRj5Cbv.js`),import(`./settings-static-VnUkp9iU.js`),import(`./routes-Ct7q5jrL.js`),import(`./auth-bEP-6uqy.js`)]),T=p();l(T.logging?.errorDetails===!0),T.configError&&v.warn(`Config load failure`,{error:T.configError}),v.info(`Config loaded`,{sourceCount:T.sources.length,storePath:T.store.path});let E=f();E.use(f.json({limit:`1mb`}));let D=Number(d),O=`http://localhost:${D}`,k=process.env.AIKIT_CORS_ORIGIN??O,A=process.env.AIKIT_ALLOW_ANY_ORIGIN===`true`,j=i(`AIKIT_HTTP_MAX_SESSIONS`,8),M=i(`AIKIT_HTTP_SESSION_TIMEOUT_MINUTES`,30),N=i(`AIKIT_HTTP_SESSION_GC_INTERVAL_MINUTES`,5),P=r({limit:100,windowMs:6e4}),F=!1;E.use((e,t,n)=>{let r=Array.isArray(e.headers.origin)?e.headers.origin[0]:e.headers.origin,i=a({requestOrigin:r,configuredOrigin:k,allowAnyOrigin:A,fallbackOrigin:O});if(i.warn&&!F&&(F=!0,v.warn(`Rejected non-local CORS origin while AIKIT_CORS_ORIGIN=*`,{origin:r,allowAnyOriginEnv:`AIKIT_ALLOW_ANY_ORIGIN=true`})),r&&!i.allowOrigin){t.status(403).json({error:`Origin not allowed`});return}if(i.allowOrigin&&t.setHeader(`Access-Control-Allow-Origin`,i.allowOrigin),t.setHeader(`Access-Control-Allow-Methods`,`GET, POST, PUT, PATCH, DELETE, OPTIONS`),t.setHeader(`Access-Control-Allow-Headers`,`Content-Type, Authorization, Mcp-Session-Id, Mcp-Protocol-Version, Last-Event-ID`),t.setHeader(`Access-Control-Expose-Headers`,`Mcp-Session-Id`),e.method===`OPTIONS`){t.status(204).end();return}n()});let I=w();E.use(C(I)),E.use(`/mcp`,(e,t,r)=>{let i=n(e)??e.ip??e.socket.remoteAddress??`anonymous`;if(P.allow(i)){r();return}let a=Math.max(1,Math.ceil(P.getRetryAfterMs(i)/1e3));t.setHeader(`Retry-After`,String(a)),t.status(429).json({jsonrpc:`2.0`,error:{code:-32003,message:`Rate limit exceeded`},id:null})});let L;E.use(`/mcp`,(e,t,n)=>{if(!L){let t=e.headers[`x-workspace-root`];typeof t==`string`&&t.length>0&&(L=t,v.debug(`Captured workspace root from proxy header`,{wsRoot:t}))}n()}),g(E,y(),v);let R=new Date().toISOString();E.use(`/settings/api`,S({log:v,mcpInfo:()=>({transport:`http`,port:D,pid:process.pid,startedAt:R})})),b(E,x(),v),E.get(`/health`,(e,t)=>{t.json({status:`ok`})});let z=!1,B=null,V=null,H=null,U=null,W=null,G=null,K=null,q=null,J=Promise.resolve(),Y=async(e,t)=>{if(!z||!H||!U){t.status(503).json({jsonrpc:`2.0`,error:{code:-32603,message:`Server initializing — please retry in a few seconds`},id:null});return}let r=J,i;J=new Promise(e=>{i=e});let a={POST:6e4,GET:1e4,DELETE:1e4}[e.method]??3e4;if(!await Promise.race([r.then(()=>!0),new Promise(t=>{let n=setTimeout(()=>{v.warn(`mcpLock timed out waiting for previous request, resetting lock chain`,{method:e.method,timeoutMs:a}),t(!1)},a);n.unref&&n.unref()})])&&(J=Promise.resolve(),i=()=>{},G)){let e=G;G=null,K=null,e.close().catch(()=>{})}try{let r=n(e);if(!G){if(r){t.status(404).json({jsonrpc:`2.0`,error:{code:-32001,message:`Session not found`},id:null});return}let e=new U({sessionIdGenerator:()=>u(),onsessioninitialized:async e=>{K=e,V?.onSessionStart(e,{transport:`http`})},onsessionclosed:async e=>{e&&V?.onSessionEnd(e),K=null}});e.onclose=()=>{G===e&&(G=null),K===e.sessionId&&(K=null)},G=e,await H.connect(e)}let i=G;await i.handleRequest(e,t,e.body),e.method!==`DELETE`&&(!r&&i.sessionId?(K=i.sessionId,V?.onSessionStart(i.sessionId,{transport:`http`}),V?.onSessionActivity(i.sessionId)):r&&V?.onSessionActivity(r))}catch(e){if(v.error(`MCP handler error`,c(e)),!t.headersSent){let n=e instanceof Error?e.message:String(e),r=n.includes(`Not Acceptable`);t.status(r?406:500).json({jsonrpc:`2.0`,error:{code:r?-32e3:-32603,message:r?n:`Internal server error`},id:null})}}finally{i()}},X=async(e,t)=>{let r=n(e);if(W&&(!G||r!==K)){await W.handleRequest(e,t,e.body);return}await Y(e,t)};E.post(`/mcp`,X),E.get(`/mcp`,X),E.delete(`/mcp`,X);let Z=E.listen(D,`127.0.0.1`,()=>{v.info(`MCP server listening`,{url:`http://127.0.0.1:${D}/mcp`,port:D}),setTimeout(async()=>{try{typeof L==`string`&&L.length>0&&(T.sources[0]={path:L,excludePatterns:T.sources[0]?.excludePatterns??[]},T.allRoots=[L],v.debug(`Workspace root applied from proxy header`,{wsRoot:L}));let[{createLazyServer:n,createMcpServer:r,ALL_TOOL_NAMES:i},{StreamableHTTPServerTransport:a},{checkForUpdates:o,autoUpgradeScaffold:l}]=await Promise.all([import(`./server-DyfH0LuD.js`),import(`@modelcontextprotocol/sdk/server/streamableHttp.js`),import(`./startup-maintenance-D7tKqECM.js`).then(e=>e.u)]);o(),l(),setInterval(o,1440*60*1e3).unref();let u=!1,d=m(T),f=n(T,d);q=async()=>{f.aikit&&await Promise.all([f.aikit.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),f.aikit.graphStore.close().catch(()=>{}),f.aikit.closeStateStore?.().catch(()=>{})??Promise.resolve(),f.aikit.store.close().catch(()=>{})])},H=f.server,U=a,z=!0,v.debug(`MCP server configured (lazy — AI Kit initializing in background)`,{toolCount:i.length,resourceCount:2}),f.startInit(),f.ready.then(async()=>{try{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);V=new _(f.aikit.stateStore,{staleTimeoutMinutes:M,gcIntervalMinutes:N,onBeforeSessionDelete:e=>{if(K===e&&G){let e=G;G=null,K=null,e.close().catch(()=>void 0)}W?.closeSession(e,{notifySessionEnd:!1})},onSessionEndMaintenance:async()=>{if(!f.aikit?.curated||!f.aikit?.stateStore)return;let{pruneLessons:e}=await import(`./startup-maintenance-D7tKqECM.js`).then(e=>e.x),t=await e(f.aikit.curated,f.aikit.stateStore,{dryRun:!1});t.pruned.length>0&&v.info(`Session-end lesson prune`,{pruned:t.pruned.length})}}),W=new h({createServer:()=>{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);return r(f.aikit,T)},createTransport:e=>new a(e),maxSessions:j,sessionTimeoutMinutes:M,onSessionStart:e=>V?.onSessionStart(e,{transport:`http`}),onSessionActivity:e=>V?.onSessionActivity(e),onSessionEnd:e=>V?.onSessionEnd(e)}),V.startGC(),K&&(V.onSessionStart(K,{transport:`http`}),V.onSessionActivity(K)),v.info(`HTTP session runtime ready`,{maxSessions:j,sessionTimeoutMinutes:M,gcIntervalMinutes:N})}catch(e){v.error(`Failed to start session manager`,c(e)),z=!1,u=!0,H=null,U=null,q=null}}),d===`auto`?f.ready.then(async()=>{try{let e=T.sources.map(e=>e.path).join(`, `);v.info(`Running initial index`,{sourcePaths:e}),await f.runInitialIndex(),v.info(`Initial index complete`)}catch(t){v.error(`Initial index failed; will retry on aikit_reindex`,e(s,t))}}):d===`smart`?u||f.ready.then(async()=>{try{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(f.aikit.indexer,T,f.aikit.store),n=f.aikit.store;B=t,t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),f.setSmartScheduler(t),v.debug(`Smart index scheduler started (HTTP mode)`)}catch(t){v.error(`Failed to start smart index scheduler`,e(s,t))}}):v.info(`Initial full indexing skipped in HTTP mode`,{indexMode:d}),f.ready.catch(t=>{v.error(`AI Kit initialization failed`,e(s,t)),z=!1,u=!0,H=null,U=null,q=null}),t(f.ready,()=>f.aikit?{curated:f.aikit.curated,stateStore:f.aikit.stateStore}:null,s)}catch(t){v.error(`Failed to load server modules`,e(s,t)),z=!1,q=null}},100)}),Q=!1,$=async e=>{Q||(Q=!0,v.info(`Shutdown signal received`,{signal:e}),o(),B?.stop(),V?.stop(),await import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),await W?.closeAll().catch(()=>void 0),K&&V?.onSessionEnd(K),G&&(await G.close().catch(()=>void 0),G=null,K=null),Z.close(),H&&await H.close(),await q?.().catch(()=>void 0),process.exit(0))};process.on(`SIGINT`,()=>$(`SIGINT`)),process.on(`SIGTERM`,()=>$(`SIGTERM`))}export{y as startHttpMode};
2
+ import{n as e,t}from"./startup-maintenance-D7tKqECM.js";import{a as n,i as r,o as i,s as a}from"./bin.js";import{t as o}from"./register-tools-BaddGXqY.js";import{createLogger as s,serializeError as c,setDetailedErrorLoggingEnabled as l}from"../../core/dist/index.js";import{randomUUID as u}from"node:crypto";const d=`__pending__:`;function f(e){return e.startsWith(d)}function p(e){let t=e.headers[`mcp-session-id`];return Array.isArray(t)?t[0]:t}function m(e,t,n,r){e.status(t).json({jsonrpc:`2.0`,error:{code:n,message:r},id:null})}var h=class{options;runtimes=new Map;maxSessions;sessionTimeoutMs;now;constructor(e){this.options=e,this.maxSessions=e.maxSessions??8,this.sessionTimeoutMs=(e.sessionTimeoutMinutes??30)*60*1e3,this.now=e.now??(()=>Date.now())}hasSession(e){return this.runtimes.has(e)}getSessionCount(){return this.runtimes.size}async handleRequest(e,t,n=e.body){let r=p(e),i=r?this.runtimes.get(r):void 0;if(r&&!i){m(t,404,-32001,`Session not found`);return}if(!i){if(e.method!==`POST`){m(t,400,-32e3,`Session required`);return}if(i=await this.createRuntime(t),!i)return}await this.withRuntimeLock(i,async()=>{await i.transport.handleRequest(e,t,n),i.lastAccessAt=this.now();let r=i.transport.sessionId??i.id;e.method!==`DELETE`&&!f(r)&&this.options.onSessionActivity?.(r),e.method===`DELETE`&&!f(r)&&await this.closeSession(r,{closeTransport:!1})})}async closeExpiredSessions(){let e=[...this.runtimes.values()].filter(e=>this.now()-e.lastAccessAt>=this.sessionTimeoutMs).map(e=>e.id);for(let t of e)await this.closeSession(t);return e.length}async closeSession(e,t={}){let n=this.runtimes.get(e);return n?(this.runtimes.delete(e),t.notifySessionEnd!==!1&&!f(e)&&this.options.onSessionEnd?.(e),t.closeTransport!==!1&&await n.transport.close().catch(()=>void 0),await n.server.close().catch(()=>void 0),!0):!1}async closeAll(){let e=[...this.runtimes.keys()];for(let t of e)await this.closeSession(t)}async createRuntime(e){if(await this.closeExpiredSessions(),this.runtimes.size>=this.maxSessions){m(e,503,-32003,`Session capacity reached`);return}let t=this.now(),n=await this.options.createServer(),r={id:`${d}${u()}`,transport:void 0,createdAt:t,lastAccessAt:t,server:n,requestChain:Promise.resolve()},i=this.options.createTransport({sessionIdGenerator:()=>u(),onsessioninitialized:async e=>{this.runtimes.delete(r.id),r.id=e,this.runtimes.set(e,r),this.options.onSessionStart?.(e)},onsessionclosed:async e=>{e&&await this.closeSession(e,{closeTransport:!1})}});return r.transport=i,i.onclose=()=>{let e=r.transport.sessionId??r.id;this.closeSession(e,{closeTransport:!1})},this.runtimes.set(r.id,r),await n.connect(i),r}async withRuntimeLock(e,t){let n=e.requestChain,r;e.requestChain=new Promise(e=>{r=e}),await n;try{await t()}finally{r()}}};function g(e){let t=e.includes(`T`)?e:`${e.replace(` `,`T`)}Z`;return Date.parse(t)}var _=class{stateStore;options;gcTimer=null;constructor(e,t={}){this.stateStore=e,this.options=t}onSessionStart(e,t){this.stateStore.sessionCreate(e,t)}onSessionActivity(e){this.stateStore.sessionTouch(e)}onSessionEnd(e){this.stateStore.sessionDelete(e),Promise.resolve(this.options.onSessionEndMaintenance?.(e)).catch(()=>{})}startGC(){if(this.gcTimer)return;let e=(this.options.gcIntervalMinutes??5)*60*1e3;this.gcTimer=setInterval(()=>{this.runGC()},e),this.gcTimer.unref()}runGC(){let e=this.getStaleSessionIds();for(let t of e)this.options.onBeforeSessionDelete?.(t),Promise.resolve(this.options.onSessionEndMaintenance?.(t)).catch(()=>{}),this.stateStore.sessionDelete(t);return e.length}stop(){this.gcTimer&&=(clearInterval(this.gcTimer),null)}getActiveSessions(){return this.stateStore.sessionList().length}listSessions(){return this.stateStore.sessionList()}getStaleSessionIds(e=Date.now()){let t=(this.options.staleTimeoutMinutes??30)*60*1e3;return this.stateStore.sessionList().filter(n=>{let r=g(n.lastActivity);return Number.isFinite(r)&&e-r>=t}).map(e=>e.sessionId)}};const v=s(`server`);async function y(s,d){let[{default:f},{loadConfig:p,resolveIndexMode:m},{registerDashboardRoutes:g,resolveDashboardDir:y},{registerSettingsRoutes:b,resolveSettingsDir:x},{createSettingsRouter:S},{authMiddleware:C,getOrCreateToken:w}]=await Promise.all([import(`express`),import(`./config-CkXCQx7E.js`),import(`./dashboard-static-CVRj5Cbv.js`),import(`./settings-static-VnUkp9iU.js`),import(`./routes-Ct7q5jrL.js`),import(`./auth-bEP-6uqy.js`)]),T=p();l(T.logging?.errorDetails===!0),T.configError&&v.warn(`Config load failure`,{error:T.configError}),v.info(`Config loaded`,{sourceCount:T.sources.length,storePath:T.store.path});let E=f();E.use(f.json({limit:`1mb`}));let D=Number(d),O=`http://localhost:${D}`,k=process.env.AIKIT_CORS_ORIGIN??O,A=process.env.AIKIT_ALLOW_ANY_ORIGIN===`true`,j=i(`AIKIT_HTTP_MAX_SESSIONS`,8),M=i(`AIKIT_HTTP_SESSION_TIMEOUT_MINUTES`,30),N=i(`AIKIT_HTTP_SESSION_GC_INTERVAL_MINUTES`,5),P=r({limit:100,windowMs:6e4}),F=!1;E.use((e,t,n)=>{let r=Array.isArray(e.headers.origin)?e.headers.origin[0]:e.headers.origin,i=a({requestOrigin:r,configuredOrigin:k,allowAnyOrigin:A,fallbackOrigin:O});if(i.warn&&!F&&(F=!0,v.warn(`Rejected non-local CORS origin while AIKIT_CORS_ORIGIN=*`,{origin:r,allowAnyOriginEnv:`AIKIT_ALLOW_ANY_ORIGIN=true`})),r&&!i.allowOrigin){t.status(403).json({error:`Origin not allowed`});return}if(i.allowOrigin&&t.setHeader(`Access-Control-Allow-Origin`,i.allowOrigin),t.setHeader(`Access-Control-Allow-Methods`,`GET, POST, PUT, PATCH, DELETE, OPTIONS`),t.setHeader(`Access-Control-Allow-Headers`,`Content-Type, Authorization, Mcp-Session-Id, Mcp-Protocol-Version, Last-Event-ID`),t.setHeader(`Access-Control-Expose-Headers`,`Mcp-Session-Id`),e.method===`OPTIONS`){t.status(204).end();return}n()});let I=w();E.use(C(I)),E.use(`/mcp`,(e,t,r)=>{let i=n(e)??e.ip??e.socket.remoteAddress??`anonymous`;if(P.allow(i)){r();return}let a=Math.max(1,Math.ceil(P.getRetryAfterMs(i)/1e3));t.setHeader(`Retry-After`,String(a)),t.status(429).json({jsonrpc:`2.0`,error:{code:-32003,message:`Rate limit exceeded`},id:null})});let L;E.use(`/mcp`,(e,t,n)=>{if(!L){let t=e.headers[`x-workspace-root`];typeof t==`string`&&t.length>0&&(L=t,v.debug(`Captured workspace root from proxy header`,{wsRoot:t}))}n()}),g(E,y(),v);let R=new Date().toISOString();E.use(`/settings/api`,S({log:v,mcpInfo:()=>({transport:`http`,port:D,pid:process.pid,startedAt:R})})),b(E,x(),v),E.get(`/health`,(e,t)=>{t.json({status:`ok`})});let z=!1,B=null,V=null,H=null,U=null,W=null,G=null,K=null,q=null,J=Promise.resolve(),Y=async(e,t)=>{if(!z||!H||!U){t.status(503).json({jsonrpc:`2.0`,error:{code:-32603,message:`Server initializing — please retry in a few seconds`},id:null});return}let r=J,i;J=new Promise(e=>{i=e});let a={POST:6e4,GET:1e4,DELETE:1e4}[e.method]??3e4;if(!await Promise.race([r.then(()=>!0),new Promise(t=>{let n=setTimeout(()=>{v.warn(`mcpLock timed out waiting for previous request, resetting lock chain`,{method:e.method,timeoutMs:a}),t(!1)},a);n.unref&&n.unref()})])&&(J=Promise.resolve(),i=()=>{},G)){let e=G;G=null,K=null,e.close().catch(()=>{})}try{let r=n(e);if(!G){if(r){t.status(404).json({jsonrpc:`2.0`,error:{code:-32001,message:`Session not found`},id:null});return}let e=new U({sessionIdGenerator:()=>u(),onsessioninitialized:async e=>{K=e,V?.onSessionStart(e,{transport:`http`})},onsessionclosed:async e=>{e&&V?.onSessionEnd(e),K=null}});e.onclose=()=>{G===e&&(G=null),K===e.sessionId&&(K=null)},G=e,await H.connect(e)}let i=G;await i.handleRequest(e,t,e.body),e.method!==`DELETE`&&(!r&&i.sessionId?(K=i.sessionId,V?.onSessionStart(i.sessionId,{transport:`http`}),V?.onSessionActivity(i.sessionId)):r&&V?.onSessionActivity(r))}catch(e){if(v.error(`MCP handler error`,c(e)),!t.headersSent){let n=e instanceof Error?e.message:String(e),r=n.includes(`Not Acceptable`);t.status(r?406:500).json({jsonrpc:`2.0`,error:{code:r?-32e3:-32603,message:r?n:`Internal server error`},id:null})}}finally{i()}},X=async(e,t)=>{let r=n(e);if(W&&(!G||r!==K)){await W.handleRequest(e,t,e.body);return}await Y(e,t)};E.post(`/mcp`,X),E.get(`/mcp`,X),E.delete(`/mcp`,X);let Z=E.listen(D,`127.0.0.1`,()=>{v.info(`MCP server listening`,{url:`http://127.0.0.1:${D}/mcp`,port:D}),setTimeout(async()=>{try{typeof L==`string`&&L.length>0&&(T.sources[0]={path:L,excludePatterns:T.sources[0]?.excludePatterns??[]},T.allRoots=[L],v.debug(`Workspace root applied from proxy header`,{wsRoot:L}));let[{createLazyServer:n,createMcpServer:r,ALL_TOOL_NAMES:i},{StreamableHTTPServerTransport:a},{checkForUpdates:o,autoUpgradeScaffold:l}]=await Promise.all([import(`./server-Zs9-tb2g.js`),import(`@modelcontextprotocol/sdk/server/streamableHttp.js`),import(`./startup-maintenance-D7tKqECM.js`).then(e=>e.u)]);o(),l(),setInterval(o,1440*60*1e3).unref();let u=!1,d=m(T),f=n(T,d);q=async()=>{f.aikit&&await Promise.all([f.aikit.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),f.aikit.graphStore.close().catch(()=>{}),f.aikit.closeStateStore?.().catch(()=>{})??Promise.resolve(),f.aikit.store.close().catch(()=>{})])},H=f.server,U=a,z=!0,v.debug(`MCP server configured (lazy — AI Kit initializing in background)`,{toolCount:i.length,resourceCount:2}),f.startInit(),f.ready.then(async()=>{try{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);V=new _(f.aikit.stateStore,{staleTimeoutMinutes:M,gcIntervalMinutes:N,onBeforeSessionDelete:e=>{if(K===e&&G){let e=G;G=null,K=null,e.close().catch(()=>void 0)}W?.closeSession(e,{notifySessionEnd:!1})},onSessionEndMaintenance:async()=>{if(!f.aikit?.curated||!f.aikit?.stateStore)return;let{pruneLessons:e}=await import(`./startup-maintenance-D7tKqECM.js`).then(e=>e.x),t=await e(f.aikit.curated,f.aikit.stateStore,{dryRun:!1});t.pruned.length>0&&v.info(`Session-end lesson prune`,{pruned:t.pruned.length})}}),W=new h({createServer:()=>{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);return r(f.aikit,T)},createTransport:e=>new a(e),maxSessions:j,sessionTimeoutMinutes:M,onSessionStart:e=>V?.onSessionStart(e,{transport:`http`}),onSessionActivity:e=>V?.onSessionActivity(e),onSessionEnd:e=>V?.onSessionEnd(e)}),V.startGC(),K&&(V.onSessionStart(K,{transport:`http`}),V.onSessionActivity(K)),v.info(`HTTP session runtime ready`,{maxSessions:j,sessionTimeoutMinutes:M,gcIntervalMinutes:N})}catch(e){v.error(`Failed to start session manager`,c(e)),z=!1,u=!0,H=null,U=null,q=null}}),d===`auto`?f.ready.then(async()=>{try{let e=T.sources.map(e=>e.path).join(`, `);v.info(`Running initial index`,{sourcePaths:e}),await f.runInitialIndex(),v.info(`Initial index complete`)}catch(t){v.error(`Initial index failed; will retry on aikit_reindex`,e(s,t))}}):d===`smart`?u||f.ready.then(async()=>{try{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(f.aikit.indexer,T,f.aikit.store),n=f.aikit.store;B=t,t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),f.setSmartScheduler(t),v.debug(`Smart index scheduler started (HTTP mode)`)}catch(t){v.error(`Failed to start smart index scheduler`,e(s,t))}}):v.info(`Initial full indexing skipped in HTTP mode`,{indexMode:d}),f.ready.catch(t=>{v.error(`AI Kit initialization failed`,e(s,t)),z=!1,u=!0,H=null,U=null,q=null}),t(f.ready,()=>f.aikit?{curated:f.aikit.curated,stateStore:f.aikit.stateStore}:null,s)}catch(t){v.error(`Failed to load server modules`,e(s,t)),z=!1,q=null}},100)}),Q=!1,$=async e=>{Q||(Q=!0,v.info(`Shutdown signal received`,{signal:e}),o(),B?.stop(),V?.stop(),await import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),await W?.closeAll().catch(()=>void 0),K&&V?.onSessionEnd(K),G&&(await G.close().catch(()=>void 0),G=null,K=null),Z.close(),H&&await H.close(),await q?.().catch(()=>void 0),process.exit(0))};process.on(`SIGINT`,()=>$(`SIGINT`)),process.on(`SIGTERM`,()=>$(`SIGTERM`))}export{y as startHttpMode};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{n as e,t}from"./startup-maintenance-D7tKqECM.js";import{r as n}from"./bin.js";import{a as r,t as i}from"./register-tools-BGjUluQH.js";import{createLogger as a,serializeError as o,setDetailedErrorLoggingEnabled as s}from"../../core/dist/index.js";const c=a(`server`);var l=class{buffer;append(e){this.buffer=this.buffer?Buffer.concat([this.buffer,e]):e}readMessage(){if(!this.buffer)return null;for(let e=0;e<this.buffer.length;e++){if(this.buffer[e]!==10)continue;let t=this.buffer.toString(`utf8`,0,e).replace(/\r$/,``),n=e+1;try{let e=JSON.parse(t);return this.buffer=this.buffer.subarray(n),e}catch{try{let e=r(t);return c.warn(`JSON parse failed on MCP message — repair succeeded`,{preview:t.slice(0,80)}),this.buffer=this.buffer.subarray(n),e}catch{}}}return null}clear(){this.buffer=void 0}};async function u(r){let[{loadConfig:a,reconfigureForWorkspace:u,resolveIndexMode:d},{createLazyServer:f},{checkForUpdates:p,autoUpgradeScaffold:m},{RootsListChangedNotificationSchema:h}]=await Promise.all([import(`./config-CkXCQx7E.js`),import(`./server-DyfH0LuD.js`),import(`./startup-maintenance-D7tKqECM.js`).then(e=>e.u),import(`@modelcontextprotocol/sdk/types.js`)]),g=a();s(g.logging?.errorDetails===!0),g.configError&&c.warn(`Config load failure`,{error:g.configError}),c.info(`Config loaded`,{sourceCount:g.sources.length,storePath:g.store.path}),m(),setInterval(p,1440*60*1e3).unref();let _=d(g),v=f(g,_),{server:y,startInit:b,ready:x,runInitialIndex:S}=v,{StdioServerTransport:C}=await import(`@modelcontextprotocol/sdk/server/stdio.js`),w=new C;if(typeof w._readBuffer?.readMessage!=`function`)throw Error(`Cannot install JSON repair: StdioServerTransport._readBuffer has unexpected shape`);w._readBuffer=new l,c.debug(`JSON repair installed on stdio transport`),await y.connect(w),c.debug(`MCP server started`,{transport:`stdio`}),await n({config:g,indexMode:_,log:c,rootsChangedNotificationSchema:h,reconfigureForWorkspace:u,runInitialIndex:S,server:y,startInit:b,version:r});let T=null,E=null,D=!1,O=async e=>{D||(D=!0,c.info(`Shutdown signal received`,{signal:e}),i(),T&&=(clearTimeout(T),null),E?.stop(),await import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),await w.close().catch(()=>void 0),await y.close().catch(()=>void 0),v.aikit&&await Promise.all([v.aikit.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),v.aikit.graphStore.close().catch(()=>{}),v.aikit.closeStateStore?.().catch(()=>{})??Promise.resolve(),v.aikit.store.close().catch(()=>{})]),process.exit(0))},k=()=>{T&&clearTimeout(T),T=setTimeout(async()=>{c.info(`Auto-shutdown: no activity for 30 minutes — releasing resources`),i();try{let e=v.aikit;e&&(e.embedder.shutdown?.().catch(()=>{}),e.store.releaseMemory?.(),e.graphStore.releaseMemory?.())}catch(e){c.warn(`Resource release failed during shutdown`,o(e))}},18e5),T.unref&&T.unref()};k(),process.stdin.on(`data`,()=>k()),process.stdin.on(`end`,()=>void O(`stdin-end`)),process.stdin.on(`close`,()=>void O(`stdin-close`)),process.stdin.on(`error`,()=>void O(`stdin-error`)),process.on(`SIGINT`,()=>void O(`SIGINT`)),process.on(`SIGTERM`,()=>void O(`SIGTERM`)),x.catch(t=>{c.error(`Initialization failed — server will continue with limited tools`,e(r,t))}),_===`smart`?x.then(async()=>{try{if(!v.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(v.aikit.indexer,g,v.aikit.store);E=t;let n=v.aikit.store;t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),v.setSmartScheduler(t),c.debug(`Smart index scheduler started (stdio mode)`)}catch(t){c.error(`Failed to start smart index scheduler`,e(r,t))}}).catch(t=>c.error(`AI Kit init failed for smart scheduler`,e(r,t))):c.warn(`Initial full indexing skipped; use aikit_reindex to index manually`,{indexMode:_}),t(x,()=>v.aikit?{curated:v.aikit.curated,stateStore:v.aikit.stateStore}:null,r)}export{u as startStdioMode};
2
+ import{n as e,t}from"./startup-maintenance-D7tKqECM.js";import{r as n}from"./bin.js";import{a as r,t as i}from"./register-tools-BaddGXqY.js";import{createLogger as a,serializeError as o,setDetailedErrorLoggingEnabled as s}from"../../core/dist/index.js";const c=a(`server`);var l=class{buffer;append(e){this.buffer=this.buffer?Buffer.concat([this.buffer,e]):e}readMessage(){if(!this.buffer)return null;for(let e=0;e<this.buffer.length;e++){if(this.buffer[e]!==10)continue;let t=this.buffer.toString(`utf8`,0,e).replace(/\r$/,``),n=e+1;try{let e=JSON.parse(t);return this.buffer=this.buffer.subarray(n),e}catch{try{let e=r(t);return c.warn(`JSON parse failed on MCP message — repair succeeded`,{preview:t.slice(0,80)}),this.buffer=this.buffer.subarray(n),e}catch{}}}return null}clear(){this.buffer=void 0}};async function u(r){let[{loadConfig:a,reconfigureForWorkspace:u,resolveIndexMode:d},{createLazyServer:f},{checkForUpdates:p,autoUpgradeScaffold:m},{RootsListChangedNotificationSchema:h}]=await Promise.all([import(`./config-CkXCQx7E.js`),import(`./server-Zs9-tb2g.js`),import(`./startup-maintenance-D7tKqECM.js`).then(e=>e.u),import(`@modelcontextprotocol/sdk/types.js`)]),g=a();s(g.logging?.errorDetails===!0),g.configError&&c.warn(`Config load failure`,{error:g.configError}),c.info(`Config loaded`,{sourceCount:g.sources.length,storePath:g.store.path}),m(),setInterval(p,1440*60*1e3).unref();let _=d(g),v=f(g,_),{server:y,startInit:b,ready:x,runInitialIndex:S}=v,{StdioServerTransport:C}=await import(`@modelcontextprotocol/sdk/server/stdio.js`),w=new C;if(typeof w._readBuffer?.readMessage!=`function`)throw Error(`Cannot install JSON repair: StdioServerTransport._readBuffer has unexpected shape`);w._readBuffer=new l,c.debug(`JSON repair installed on stdio transport`),await y.connect(w),c.debug(`MCP server started`,{transport:`stdio`}),await n({config:g,indexMode:_,log:c,rootsChangedNotificationSchema:h,reconfigureForWorkspace:u,runInitialIndex:S,server:y,startInit:b,version:r});let T=null,E=null,D=!1,O=async e=>{D||(D=!0,c.info(`Shutdown signal received`,{signal:e}),i(),T&&=(clearTimeout(T),null),E?.stop(),await import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),await w.close().catch(()=>void 0),await y.close().catch(()=>void 0),v.aikit&&await Promise.all([v.aikit.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),v.aikit.graphStore.close().catch(()=>{}),v.aikit.closeStateStore?.().catch(()=>{})??Promise.resolve(),v.aikit.store.close().catch(()=>{})]),process.exit(0))},k=()=>{T&&clearTimeout(T),T=setTimeout(async()=>{c.info(`Auto-shutdown: no activity for 30 minutes — releasing resources`),i();try{let e=v.aikit;e&&(e.embedder.shutdown?.().catch(()=>{}),e.store.releaseMemory?.(),e.graphStore.releaseMemory?.())}catch(e){c.warn(`Resource release failed during shutdown`,o(e))}},18e5),T.unref&&T.unref()};k(),process.stdin.on(`data`,()=>k()),process.stdin.on(`end`,()=>void O(`stdin-end`)),process.stdin.on(`close`,()=>void O(`stdin-close`)),process.stdin.on(`error`,()=>void O(`stdin-error`)),process.on(`SIGINT`,()=>void O(`SIGINT`)),process.on(`SIGTERM`,()=>void O(`SIGTERM`)),x.catch(t=>{c.error(`Initialization failed — server will continue with limited tools`,e(r,t))}),_===`smart`?x.then(async()=>{try{if(!v.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(v.aikit.indexer,g,v.aikit.store);E=t;let n=v.aikit.store;t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),v.setSmartScheduler(t),c.debug(`Smart index scheduler started (stdio mode)`)}catch(t){c.error(`Failed to start smart index scheduler`,e(r,t))}}).catch(t=>c.error(`AI Kit init failed for smart scheduler`,e(r,t))):c.warn(`Initial full indexing skipped; use aikit_reindex to index manually`,{indexMode:_}),t(x,()=>v.aikit?{curated:v.aikit.curated,stateStore:v.aikit.stateStore}:null,r)}export{u as startStdioMode};
@@ -1 +1 @@
1
- import{n as e}from"./workspace-bootstrap-DTnTU8p2.js";import{n as t,t as n}from"./startup-maintenance-QrloHssd.js";import{a as r,t as i}from"./register-tools-o8bU18BA.js";import{createLogger as a,serializeError as o,setDetailedErrorLoggingEnabled as s}from"../../core/dist/index.js";const c=a(`server`);var l=class{buffer;append(e){this.buffer=this.buffer?Buffer.concat([this.buffer,e]):e}readMessage(){if(!this.buffer)return null;for(let e=0;e<this.buffer.length;e++){if(this.buffer[e]!==10)continue;let t=this.buffer.toString(`utf8`,0,e).replace(/\r$/,``),n=e+1;try{let e=JSON.parse(t);return this.buffer=this.buffer.subarray(n),e}catch{try{let e=r(t);return c.warn(`JSON parse failed on MCP message — repair succeeded`,{preview:t.slice(0,80)}),this.buffer=this.buffer.subarray(n),e}catch{}}}return null}clear(){this.buffer=void 0}};async function u(r){let[{loadConfig:a,reconfigureForWorkspace:u,resolveIndexMode:d},{createLazyServer:f},{checkForUpdates:p,autoUpgradeScaffold:m},{RootsListChangedNotificationSchema:h}]=await Promise.all([import(`./config-BS9mkd50.js`),import(`./server-B4hZQsSd.js`),import(`./startup-maintenance-QrloHssd.js`).then(e=>e.u),import(`@modelcontextprotocol/sdk/types.js`)]),g=a();s(g.logging?.errorDetails===!0),g.configError&&c.warn(`Config load failure`,{error:g.configError}),c.info(`Config loaded`,{sourceCount:g.sources.length,storePath:g.store.path}),m(),setInterval(p,1440*60*1e3).unref();let _=d(g),v=f(g,_),{server:y,startInit:b,ready:x,runInitialIndex:S}=v,{StdioServerTransport:C}=await import(`@modelcontextprotocol/sdk/server/stdio.js`),w=new C;if(typeof w._readBuffer?.readMessage!=`function`)throw Error(`Cannot install JSON repair: StdioServerTransport._readBuffer has unexpected shape`);w._readBuffer=new l,c.debug(`JSON repair installed on stdio transport`),await y.connect(w),c.debug(`MCP server started`,{transport:`stdio`}),await e({config:g,indexMode:_,log:c,rootsChangedNotificationSchema:h,reconfigureForWorkspace:u,runInitialIndex:S,server:y,startInit:b,version:r});let T=null,E=null,D=!1,O=async e=>{D||(D=!0,c.info(`Shutdown signal received`,{signal:e}),i(),T&&=(clearTimeout(T),null),E?.stop(),await import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),await w.close().catch(()=>void 0),await y.close().catch(()=>void 0),v.aikit&&await Promise.all([v.aikit.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),v.aikit.graphStore.close().catch(()=>{}),v.aikit.closeStateStore?.().catch(()=>{})??Promise.resolve(),v.aikit.store.close().catch(()=>{})]),process.exit(0))},k=()=>{T&&clearTimeout(T),T=setTimeout(async()=>{c.info(`Auto-shutdown: no activity for 30 minutes — releasing resources`),i();try{let e=v.aikit;e&&(e.embedder.shutdown?.().catch(()=>{}),e.store.releaseMemory?.(),e.graphStore.releaseMemory?.())}catch(e){c.warn(`Resource release failed during shutdown`,o(e))}},18e5),T.unref&&T.unref()};k(),process.stdin.on(`data`,()=>k()),process.stdin.on(`end`,()=>void O(`stdin-end`)),process.stdin.on(`close`,()=>void O(`stdin-close`)),process.stdin.on(`error`,()=>void O(`stdin-error`)),process.on(`SIGINT`,()=>void O(`SIGINT`)),process.on(`SIGTERM`,()=>void O(`SIGTERM`)),x.catch(e=>{c.error(`Initialization failed — server will continue with limited tools`,t(r,e))}),_===`smart`?x.then(async()=>{try{if(!v.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(v.aikit.indexer,g,v.aikit.store);E=t;let n=v.aikit.store;t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),v.setSmartScheduler(t),c.debug(`Smart index scheduler started (stdio mode)`)}catch(e){c.error(`Failed to start smart index scheduler`,t(r,e))}}).catch(e=>c.error(`AI Kit init failed for smart scheduler`,t(r,e))):c.warn(`Initial full indexing skipped; use aikit_reindex to index manually`,{indexMode:_}),n(x,()=>v.aikit?{curated:v.aikit.curated,stateStore:v.aikit.stateStore}:null,r)}export{u as startStdioMode};
1
+ import{n as e}from"./workspace-bootstrap-DTnTU8p2.js";import{n as t,t as n}from"./startup-maintenance-QrloHssd.js";import{a as r,t as i}from"./register-tools-DWTLkaFG.js";import{createLogger as a,serializeError as o,setDetailedErrorLoggingEnabled as s}from"../../core/dist/index.js";const c=a(`server`);var l=class{buffer;append(e){this.buffer=this.buffer?Buffer.concat([this.buffer,e]):e}readMessage(){if(!this.buffer)return null;for(let e=0;e<this.buffer.length;e++){if(this.buffer[e]!==10)continue;let t=this.buffer.toString(`utf8`,0,e).replace(/\r$/,``),n=e+1;try{let e=JSON.parse(t);return this.buffer=this.buffer.subarray(n),e}catch{try{let e=r(t);return c.warn(`JSON parse failed on MCP message — repair succeeded`,{preview:t.slice(0,80)}),this.buffer=this.buffer.subarray(n),e}catch{}}}return null}clear(){this.buffer=void 0}};async function u(r){let[{loadConfig:a,reconfigureForWorkspace:u,resolveIndexMode:d},{createLazyServer:f},{checkForUpdates:p,autoUpgradeScaffold:m},{RootsListChangedNotificationSchema:h}]=await Promise.all([import(`./config-BS9mkd50.js`),import(`./server-by4LpJpg.js`),import(`./startup-maintenance-QrloHssd.js`).then(e=>e.u),import(`@modelcontextprotocol/sdk/types.js`)]),g=a();s(g.logging?.errorDetails===!0),g.configError&&c.warn(`Config load failure`,{error:g.configError}),c.info(`Config loaded`,{sourceCount:g.sources.length,storePath:g.store.path}),m(),setInterval(p,1440*60*1e3).unref();let _=d(g),v=f(g,_),{server:y,startInit:b,ready:x,runInitialIndex:S}=v,{StdioServerTransport:C}=await import(`@modelcontextprotocol/sdk/server/stdio.js`),w=new C;if(typeof w._readBuffer?.readMessage!=`function`)throw Error(`Cannot install JSON repair: StdioServerTransport._readBuffer has unexpected shape`);w._readBuffer=new l,c.debug(`JSON repair installed on stdio transport`),await y.connect(w),c.debug(`MCP server started`,{transport:`stdio`}),await e({config:g,indexMode:_,log:c,rootsChangedNotificationSchema:h,reconfigureForWorkspace:u,runInitialIndex:S,server:y,startInit:b,version:r});let T=null,E=null,D=!1,O=async e=>{D||(D=!0,c.info(`Shutdown signal received`,{signal:e}),i(),T&&=(clearTimeout(T),null),E?.stop(),await import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),await w.close().catch(()=>void 0),await y.close().catch(()=>void 0),v.aikit&&await Promise.all([v.aikit.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),v.aikit.graphStore.close().catch(()=>{}),v.aikit.closeStateStore?.().catch(()=>{})??Promise.resolve(),v.aikit.store.close().catch(()=>{})]),process.exit(0))},k=()=>{T&&clearTimeout(T),T=setTimeout(async()=>{c.info(`Auto-shutdown: no activity for 30 minutes — releasing resources`),i();try{let e=v.aikit;e&&(e.embedder.shutdown?.().catch(()=>{}),e.store.releaseMemory?.(),e.graphStore.releaseMemory?.())}catch(e){c.warn(`Resource release failed during shutdown`,o(e))}},18e5),T.unref&&T.unref()};k(),process.stdin.on(`data`,()=>k()),process.stdin.on(`end`,()=>void O(`stdin-end`)),process.stdin.on(`close`,()=>void O(`stdin-close`)),process.stdin.on(`error`,()=>void O(`stdin-error`)),process.on(`SIGINT`,()=>void O(`SIGINT`)),process.on(`SIGTERM`,()=>void O(`SIGTERM`)),x.catch(e=>{c.error(`Initialization failed — server will continue with limited tools`,t(r,e))}),_===`smart`?x.then(async()=>{try{if(!v.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(v.aikit.indexer,g,v.aikit.store);E=t;let n=v.aikit.store;t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),v.setSmartScheduler(t),c.debug(`Smart index scheduler started (stdio mode)`)}catch(e){c.error(`Failed to start smart index scheduler`,t(r,e))}}).catch(e=>c.error(`AI Kit init failed for smart scheduler`,t(r,e))):c.warn(`Initial full indexing skipped; use aikit_reindex to index manually`,{indexMode:_}),n(x,()=>v.aikit?{curated:v.aikit.curated,stateStore:v.aikit.stateStore}:null,r)}export{u as startStdioMode};
@@ -293,7 +293,7 @@ import{createRequire as e}from"node:module";import{AIKIT_PATHS as t,EMBEDDING_DE
293
293
  ${a.sql}
294
294
  ORDER BY _bm25 ASC
295
295
  LIMIT ?
296
- `,c;try{let t=$e(e);c=n.queryAll(s,[t,...a.params,i])}catch(e){return q.warn(`fts search failed`,o(e)),[]}return c.map(e=>({record:this.fromRow(e),score:et(e._bm25)}))}async getById(e){let t=this.getAdapter().queryAll(`SELECT * FROM knowledge WHERE id = ? LIMIT 1`,[e]);return t.length===0?null:this.fromRow(t[0])}async deleteBySourcePath(e){return this.enqueueWrite(()=>this._deleteBySourcePathImpl(e))}async _deleteBySourcePathImpl(e){let t=this.getAdapter(),n=t.queryAll(`SELECT id FROM knowledge WHERE sourcePath = ?`,[e]);if(n.length===0)return 0;t.exec(`BEGIN IMMEDIATE`);try{for(let{id:e}of n)this.vectorEnabled&&(t.run(`DELETE FROM ${this.vecTableName} WHERE knowledge_id = ?`,[e]),this.coarseDim<this.embeddingDim&&t.run(`DELETE FROM ${this.vecTableCoarseName} WHERE knowledge_id = ?`,[e])),t.run(`DELETE FROM memory_embeddings WHERE memory_id = ?`,[e]),t.run(`DELETE FROM knowledge_tags WHERE knowledge_id = ?`,[e]),this.ftsEnabled&&t.run(`DELETE FROM knowledge_fts WHERE id = ?`,[e]);t.run(`DELETE FROM knowledge WHERE sourcePath = ?`,[e]),t.exec(`COMMIT`)}catch(e){try{t.exec(`ROLLBACK`)}catch{}throw t.flush(),e}return t.flush(),n.length}async deleteById(e){return this.enqueueWrite(()=>this._deleteByIdImpl(e))}async deleteByIdInteractive(e){return this.enqueueWrite(()=>this._deleteByIdImpl(e),!0)}async _deleteByIdImpl(e){let t=this.getAdapter();if(t.queryAll(`SELECT id FROM knowledge WHERE id = ? LIMIT 1`,[e]).length===0)return!1;t.exec(`BEGIN IMMEDIATE`);try{this.vectorEnabled&&(t.run(`DELETE FROM ${this.vecTableName} WHERE knowledge_id = ?`,[e]),this.coarseDim<this.embeddingDim&&t.run(`DELETE FROM ${this.vecTableCoarseName} WHERE knowledge_id = ?`,[e])),t.run(`DELETE FROM memory_embeddings WHERE memory_id = ?`,[e]),t.run(`DELETE FROM knowledge_tags WHERE knowledge_id = ?`,[e]),this.ftsEnabled&&t.run(`DELETE FROM knowledge_fts WHERE id = ?`,[e]),t.run(`DELETE FROM knowledge WHERE id = ?`,[e]),t.exec(`COMMIT`)}catch(e){try{t.exec(`ROLLBACK`)}catch{}throw t.flush(),e}return t.flush(),!0}async getBySourcePath(e){return this.getAdapter().queryAll(`SELECT * FROM knowledge WHERE sourcePath = ? ORDER BY chunkIndex ASC`,[e]).map(e=>this.fromRow(e))}async getStats(){let e=this.getAdapter(),t=e.queryAll(`SELECT COUNT(*) AS n FROM knowledge`)[0]?.n??0;if(t===0)return{totalRecords:0,totalFiles:0,contentTypeBreakdown:{},lastIndexedAt:null,storeBackend:`sqlite-vec`,embeddingModel:this.embeddingProfile.model};let n=e.queryAll(`SELECT COUNT(DISTINCT sourcePath) AS n FROM knowledge`),r=e.queryAll(`SELECT contentType, COUNT(*) AS n FROM knowledge GROUP BY contentType`),i=e.queryAll(`SELECT MAX(indexedAt) AS ts FROM knowledge`),a={};for(let e of r)a[e.contentType]=e.n;return{totalRecords:t,totalFiles:n[0]?.n??0,contentTypeBreakdown:a,lastIndexedAt:i[0]?.ts??null,storeBackend:`sqlite-vec`,embeddingModel:this.embeddingProfile.model}}async listSourcePaths(){return this.getAdapter().queryAll(`SELECT DISTINCT sourcePath FROM knowledge ORDER BY sourcePath`).map(e=>e.sourcePath)}async createFtsIndex(){this.createFtsTable()}async dropTable(){return this.enqueueWrite(()=>this._dropTableImpl())}async _dropTableImpl(){let e=this.getAdapter();this.ftsEnabled&&e.exec(`DROP TABLE IF EXISTS knowledge_fts`),this.vectorEnabled&&this.dropVectorTables(),e.exec(`DROP TABLE IF EXISTS ${Y}`),e.exec(`DROP TABLE IF EXISTS knowledge_tags`),e.exec(`DROP TABLE IF EXISTS knowledge`),e.flush(),this.createKnowledgeTable(),this.createKnowledgeTagsTable(),this.createFtsTable(),this.vectorEnabled&&this.ensureVecTable()}releaseMemory(){if(this.adapter)try{this.adapter.exec(`PRAGMA shrink_memory`),this.adapter.exec(`PRAGMA wal_checkpoint(TRUNCATE)`)}catch{}}onBeforeClose(e){this._onCloseHooks.push(e)}async close(e=5e3){this._closing=!0;for(let e of this._onCloseHooks)try{e()}catch{}this._onCloseHooks.length=0,(this._priorityQueue.length>0||this._normalQueue.length>0||this._drainState!==`idle`)&&await new Promise(t=>{this._closeWaiter={resolve:t};let n=setTimeout(()=>{q.warn(`SqliteVecStore.close() timed out waiting for queue drain — force closing`),this._closeWaiter=null,t(!0)},e);n.unref&&n.unref(),this._drainState===`idle`&&(this._drainState=`scheduled`,queueMicrotask(()=>this._drain()))})&&(this._priorityQueue.length=0,this._normalQueue.length=0),this.adapter&&!this.externalAdapter&&this.adapter.close(),this.adapter=null}getAdapter(){if(!this.adapter)throw Error(`SqliteVecStore: not initialized — call initialize() first`);return this.adapter}runAdaptiveVectorSearch(e,t,n){let i=n?.limit??r.maxResults;if(i<=0)return[];let a=this.buildFilterSqlSuffix(n),o=this.buildVectorSearchPlan(i,a.profile),s=o.initialCandidateLimit,c=this.queryVectorRows(e,t,a,s,i);for(;o.hasFilters&&c.length<i&&s<o.maxCandidateLimit;)s=Math.min(o.maxCandidateLimit,Math.max(s+i,s*X.filteredRetryMultiplier)),c=this.queryVectorRows(e,t,a,s,i);return c}queryVectorRows(e,t,n,r,i){let a=this.getAdapter(),o=`
296
+ `,c;try{let t=$e(e);c=n.queryAll(s,[t,...a.params,i])}catch(e){return q.warn(`fts search failed`,o(e)),[]}return c.map(e=>({record:this.fromRow(e),score:et(e._bm25)}))}async getById(e){let t=this.getAdapter().queryAll(`SELECT * FROM knowledge WHERE id = ? LIMIT 1`,[e]);return t.length===0?null:this.fromRow(t[0])}async deleteBySourcePath(e){return this.enqueueWrite(()=>this._deleteBySourcePathImpl(e))}async _deleteBySourcePathImpl(e){let t=this.getAdapter(),n=t.queryAll(`SELECT id FROM knowledge WHERE sourcePath = ?`,[e]);if(n.length===0)return 0;t.exec(`BEGIN IMMEDIATE`);try{for(let{id:e}of n)this.vectorEnabled&&(t.run(`DELETE FROM ${this.vecTableName} WHERE knowledge_id = ?`,[e]),this.coarseDim<this.embeddingDim&&t.run(`DELETE FROM ${this.vecTableCoarseName} WHERE knowledge_id = ?`,[e])),t.run(`DELETE FROM memory_embeddings WHERE memory_id = ?`,[e]),t.run(`DELETE FROM knowledge_tags WHERE knowledge_id = ?`,[e]),this.ftsEnabled&&t.run(`DELETE FROM knowledge_fts WHERE id = ?`,[e]);t.run(`DELETE FROM knowledge WHERE sourcePath = ?`,[e]),t.exec(`COMMIT`)}catch(e){try{t.exec(`ROLLBACK`)}catch{}throw t.flush(),e}return t.flush(),n.length}async deleteById(e){return this.enqueueWrite(()=>this._deleteByIdImpl(e))}async deleteByIdInteractive(e){return this.enqueueWrite(()=>this._deleteByIdImpl(e),!0)}async _deleteByIdImpl(e){let t=this.getAdapter();if(t.queryAll(`SELECT id FROM knowledge WHERE id = ? LIMIT 1`,[e]).length===0)return!1;t.exec(`BEGIN IMMEDIATE`);try{this.vectorEnabled&&(t.run(`DELETE FROM ${this.vecTableName} WHERE knowledge_id = ?`,[e]),this.coarseDim<this.embeddingDim&&t.run(`DELETE FROM ${this.vecTableCoarseName} WHERE knowledge_id = ?`,[e])),t.run(`DELETE FROM memory_embeddings WHERE memory_id = ?`,[e]),t.run(`DELETE FROM knowledge_tags WHERE knowledge_id = ?`,[e]),this.ftsEnabled&&t.run(`DELETE FROM knowledge_fts WHERE id = ?`,[e]),t.run(`DELETE FROM knowledge WHERE id = ?`,[e]),t.exec(`COMMIT`)}catch(e){try{t.exec(`ROLLBACK`)}catch{}throw t.flush(),e}return t.flush(),!0}async getBySourcePath(e){return this.getAdapter().queryAll(`SELECT * FROM knowledge WHERE sourcePath = ? ORDER BY chunkIndex ASC`,[e]).map(e=>this.fromRow(e))}async getStats(){let e=this.getAdapter(),t=e.queryAll(`SELECT COUNT(*) AS n FROM knowledge`)[0]?.n??0;if(t===0)return{totalRecords:0,totalFiles:0,contentTypeBreakdown:{},lastIndexedAt:null,lastSourceIndexedAt:null,storeBackend:`sqlite-vec`,embeddingModel:this.embeddingProfile.model};let n=e.queryAll(`SELECT COUNT(DISTINCT sourcePath) AS n FROM knowledge`),r=e.queryAll(`SELECT contentType, COUNT(*) AS n FROM knowledge GROUP BY contentType`),i=e.queryAll(`SELECT MAX(indexedAt) AS ts FROM knowledge`),a=e.queryAll(`SELECT MAX(indexedAt) AS ts FROM knowledge WHERE origin = 'indexed'`),o={};for(let e of r)o[e.contentType]=e.n;return{totalRecords:t,totalFiles:n[0]?.n??0,contentTypeBreakdown:o,lastIndexedAt:i[0]?.ts??null,lastSourceIndexedAt:a[0]?.ts??null,storeBackend:`sqlite-vec`,embeddingModel:this.embeddingProfile.model}}async listSourcePaths(){return this.getAdapter().queryAll(`SELECT DISTINCT sourcePath FROM knowledge ORDER BY sourcePath`).map(e=>e.sourcePath)}async createFtsIndex(){this.createFtsTable()}async dropTable(){return this.enqueueWrite(()=>this._dropTableImpl())}async _dropTableImpl(){let e=this.getAdapter();this.ftsEnabled&&e.exec(`DROP TABLE IF EXISTS knowledge_fts`),this.vectorEnabled&&this.dropVectorTables(),e.exec(`DROP TABLE IF EXISTS ${Y}`),e.exec(`DROP TABLE IF EXISTS knowledge_tags`),e.exec(`DROP TABLE IF EXISTS knowledge`),e.flush(),this.createKnowledgeTable(),this.createKnowledgeTagsTable(),this.createFtsTable(),this.vectorEnabled&&this.ensureVecTable()}releaseMemory(){if(this.adapter)try{this.adapter.exec(`PRAGMA shrink_memory`),this.adapter.exec(`PRAGMA wal_checkpoint(TRUNCATE)`)}catch{}}onBeforeClose(e){this._onCloseHooks.push(e)}async close(e=5e3){this._closing=!0;for(let e of this._onCloseHooks)try{e()}catch{}this._onCloseHooks.length=0,(this._priorityQueue.length>0||this._normalQueue.length>0||this._drainState!==`idle`)&&await new Promise(t=>{this._closeWaiter={resolve:t};let n=setTimeout(()=>{q.warn(`SqliteVecStore.close() timed out waiting for queue drain — force closing`),this._closeWaiter=null,t(!0)},e);n.unref&&n.unref(),this._drainState===`idle`&&(this._drainState=`scheduled`,queueMicrotask(()=>this._drain()))})&&(this._priorityQueue.length=0,this._normalQueue.length=0),this.adapter&&!this.externalAdapter&&this.adapter.close(),this.adapter=null}getAdapter(){if(!this.adapter)throw Error(`SqliteVecStore: not initialized — call initialize() first`);return this.adapter}runAdaptiveVectorSearch(e,t,n){let i=n?.limit??r.maxResults;if(i<=0)return[];let a=this.buildFilterSqlSuffix(n),o=this.buildVectorSearchPlan(i,a.profile),s=o.initialCandidateLimit,c=this.queryVectorRows(e,t,a,s,i);for(;o.hasFilters&&c.length<i&&s<o.maxCandidateLimit;)s=Math.min(o.maxCandidateLimit,Math.max(s+i,s*X.filteredRetryMultiplier)),c=this.queryVectorRows(e,t,a,s,i);return c}queryVectorRows(e,t,n,r,i){let a=this.getAdapter(),o=`
297
297
  SELECT k.*, v.distance AS _distance
298
298
  FROM (
299
299
  SELECT knowledge_id, distance
@@ -660,4 +660,4 @@ import{createRequire as e}from"node:module";import{AIKIT_PATHS as t,EMBEDDING_DE
660
660
  ORDER BY retention_score ASC,
661
661
  COALESCE(last_accessed_at, created_at) ASC,
662
662
  entry_id ASC
663
- LIMIT ?`);return{create(e,n){t.run(e,n??`working`)},get(e){return n.get(e)},touch(e){r.run(e)},updateScore(e,t){i.run(t,e)},updateConfidence(e,t){a.run(t,e)},updateTier(e,t){o.run(t,t,t,e)},setSuperseded(e,t){s.run(t,e)},list(e){return e?.tier!==void 0&&e?.belowScore!==void 0&&e?.limit!==void 0?te.all(e.tier,e.belowScore,e.limit):e?.tier!==void 0&&e?.belowScore!==void 0?p.all(e.tier,e.belowScore):e?.tier!==void 0&&e?.limit!==void 0?d.all(e.tier,e.limit):e?.tier===void 0?e?.belowScore!==void 0&&e?.limit!==void 0?f.all(e.belowScore,e.limit):e?.belowScore===void 0?e?.limit===void 0?c.all():l.all(e.limit):ee.all(e.belowScore):u.all(e.tier)}}}function pt(e){let t=Q(e)?tt(e):st(e),n=Q(e)?it(e):ut(e),r=Q(e)?at(e):dt(e),i=Q(e)?rt(e):lt(e),a=Q(e)?nt(e):ct(e),o=Q(e)?ot(e):ft(e);return{stashGet(e){return t.get(e)?.value},stashSet(e,n){t.set(e,n)},stashList(){return t.list()},stashDelete(e){return t.has(e)?(t.delete(e),!0):!1},stashClear(){t.clear()},signalPost(e,t,r,i,a){return n.post(e,t,r,i,a)},signalGet(e,t){return n.cleanExpired(),n.get(e,t).map(e=>({id:e.id,value:e.value,createdAt:Z(e.createdAt),expiresAt:Z(e.expiresAt),...e.agent?{agent:e.agent}:{}}))},signalList(e){return n.cleanExpired(),n.list(e).map(e=>({id:e.id,key:e.key,value:e.value,createdAt:Z(e.createdAt),...e.agent?{agent:e.agent}:{}}))},signalClear(e,t){return n.cleanExpired(),n.clear(e,t)},signalCleanExpired(){return n.cleanExpired()},leaseAcquire(e,t,n,i,a){r.cleanExpired();let o=r.get(e,n);return o&&o.holder!==t?!1:(r.upsert(e,t,n,i??o?.intent??void 0,a),!0)},leaseRelease(e,t,n){r.cleanExpired();let i=r.get(e,n);return!i||i.holder!==t?!1:(r.delete(e,n),!0)},leaseGet(e,t){r.cleanExpired();let n=r.get(e,t);if(n)return{resource:n.resource,holder:n.holder,workspace:n.workspace,acquiredAt:Z(n.acquiredAt),expiresAt:Z(n.expiresAt),...n.intent?{intent:n.intent}:{}}},leaseList(e){return r.cleanExpired(),r.list(e).map(e=>({resource:e.resource,holder:e.holder,acquiredAt:Z(e.acquiredAt),expiresAt:Z(e.expiresAt),...e.intent?{intent:e.intent}:{}}))},leaseCleanExpired(){return r.cleanExpired()},sessionCreate(e,t){i.create(e,t?JSON.stringify(t):void 0)},sessionTouch(e){i.touch(e)},sessionGet(e){let t=i.get(e);if(t)return{sessionId:t.sessionId,createdAt:t.createdAt,lastActivity:t.lastActivity,...t.metadata?{metadata:t.metadata}:{}}},sessionList(){return i.list().map(e=>({sessionId:e.sessionId,createdAt:e.createdAt,lastActivity:e.lastActivity}))},sessionDelete(e){return i.has(e)?(i.delete(e),!0):!1},sessionDeleteStale(e){return i.deleteStale(e)},checkpointSave(e,t,n,r){a.save(e,t,n,r)},checkpointLoad(e){let t=a.get(e);if(t)return{id:t.id,label:t.label,data:t.data,createdAt:t.createdAt,...t.notes?{notes:t.notes}:{}}},checkpointList(e,t){return a.list(e,t).map(e=>({id:e.id,label:e.label,createdAt:e.createdAt,...e.notes?{notes:e.notes}:{}}))},checkpointLatest(e){let t=a.latest(e);if(t)return{id:t.id,label:t.label,data:t.data,createdAt:t.createdAt,...t.notes?{notes:t.notes}:{}}},checkpointDelete(e){return a.has(e)?(a.delete(e),!0):!1},checkpointDiff(e,t){let n=a.get(e),r=a.get(t);if(!(!n||!r))return{from:n.data,to:r.data}},checkpointHistory(e,t){return a.list(e,t).map(e=>({id:e.id,label:e.label,createdAt:e.createdAt,...e.notes?{notes:e.notes}:{}}))},checkpointGc(e,t){return a.gc(e,t)},memoryMetaCreate(e,t){o.create(e,t)},memoryMetaGet(e){return o.get(e)},memoryMetaTouch(e){o.touch(e)},memoryMetaUpdateScore(e,t){o.updateScore(e,t)},memoryMetaUpdateConfidence(e,t){o.updateConfidence(e,t)},memoryMetaUpdateTier(e,t){o.updateTier(e,t)},memoryMetaSetSuperseded(e,t){o.setSuperseded(e,t)},memoryMetaList(e){return o.list(e)}}}var mt=ae({NodeSqliteAdapter:()=>ht}),ht=class{type=`node-sqlite`;kind=`node-sqlite`;_sqliteVecLoaded=!1;get vectorCapable(){return this._sqliteVecLoaded}get capabilities(){return{vectorCapable:this.vectorCapable,persistentFile:!0,concurrentReaders:!0}}db=null;getDb(){if(!this.db)throw Error(`NodeSqliteAdapter: database not opened`);return this.db}ensureOpen(){this.getDb()}async open(e){let t=m(e);t&&!c(t)&&l(t,{recursive:!0});let n;try{let e=await import(`node:sqlite`);if(!ye(e.DatabaseSync))throw Error(`node:sqlite DatabaseSync extension loading APIs are unavailable`);n=e.DatabaseSync}catch(e){throw Error(`node:sqlite unavailable (requires Node ≥22.13): ${e instanceof Error?e.message:String(e)}`)}this.db=new n(e,{allowExtension:!0,timeout:5e3});try{this.loadSqliteVec(),this.getDb().exec(`PRAGMA foreign_keys = ON`),this.getDb().exec(`PRAGMA journal_mode = WAL`),this.getDb().exec(`PRAGMA synchronous = NORMAL`),this.getDb().exec(`PRAGMA busy_timeout = 5000`)}finally{this.getDb().enableLoadExtension(!1)}}exec(e){this.ensureOpen(),this.getDb().exec(e)}pragma(e){this.ensureOpen(),this.getDb().exec(`PRAGMA ${e}`)}bindArgs(e){return e===void 0?[]:Array.isArray(e)?e:[e]}queryAll(e,t){return this.all(e,t)}get(e,t){this.ensureOpen();let n=this.getDb().prepare(e),r=this.bindArgs(t),i=r.length>0?n.get(...r):n.get();if(i!=null)return this.normalizeRow(i)}all(e,t){this.ensureOpen();let n=this.getDb().prepare(e),r=this.bindArgs(t);return(r.length>0?n.all(...r):n.all()).map(e=>this.normalizeRow(e))}run(e,t){this.ensureOpen();let n=this.getDb().prepare(e),r=this.bindArgs(t),i=r.length>0?n.run(...r):n.run();return{changes:i.changes,lastInsertRowid:i.lastInsertRowid}}transaction(e){this.ensureOpen(),this.getDb().exec(`BEGIN IMMEDIATE`);let t={exec:e=>{this.ensureOpen(),this.getDb().exec(e)},get:(e,t)=>{this.ensureOpen();let n=this.getDb().prepare(e),r=this.bindArgs(t),i=r.length>0?n.get(...r):n.get();if(i!=null)return this.normalizeRow(i)},all:(e,t)=>{this.ensureOpen();let n=this.getDb().prepare(e),r=this.bindArgs(t);return(r.length>0?n.all(...r):n.all()).map(e=>this.normalizeRow(e))},run:(e,t)=>{this.ensureOpen();let n=this.getDb().prepare(e),r=this.bindArgs(t),i=r.length>0?n.run(...r):n.run();return{changes:i.changes,lastInsertRowid:i.lastInsertRowid}}};try{let n=e(t);return this.getDb().exec(`COMMIT`),n}catch(e){try{this.getDb().exec(`ROLLBACK`)}catch{}throw e}}flush(){}async close(){this.db&&=(this.getDb().close(),null)}normalizeRow(e){if(typeof e!=`object`||!e||Array.isArray(e))return e;let t=e;for(let e of Object.keys(t)){let n=t[e];Buffer.isBuffer(n)&&(t[e]=new Uint8Array(n.buffer,n.byteOffset,n.byteLength))}return e}loadSqliteVec(){try{let e=be();if(!e)throw Error(`Could not locate sqlite-vec extension binary`);if(this.getDb().enableLoadExtension(!0),this.getDb().loadExtension(e),!this.getDb().prepare(`SELECT vec_version() AS version`).get()?.version)throw Error(`sqlite-vec loaded but vec_version() returned no data`);let t=new Uint8Array(new Float32Array([1,0,0]).buffer),n=new Uint8Array(new Float32Array([0,1,0]).buffer),r=this.getDb().prepare(`SELECT vec_distance_cosine(?, ?) AS d`).get(t,n);if(!r||typeof r.d!=`number`)throw Error(`sqlite-vec smoke test failed: unexpected result ${JSON.stringify(r)}`);this._sqliteVecLoaded=!0}catch(e){this._sqliteVecLoaded=!1,console.warn(`[NodeSqliteAdapter] sqlite-vec loading failed, vector search disabled:`,e instanceof Error?e.message:String(e))}}};const $=a(`store-factory`);async function gt(e){if(e.adapter)return{adapter:e.adapter,selection:null};let t=e.sqliteDriver??process.env.AI_KIT_SQLITE_DRIVER??`auto`,n=e.allowFallback??process.env.AI_KIT_SQLITE_ALLOW_FALLBACK!==`false`,r;try{r=await P({driver:t,databasePath:e.path})}catch(i){if(n&&t!==`auto`)$.warn(`Forced driver "${t}" failed — falling back to auto selection`),r=await P({databasePath:e.path});else throw i}let i;switch(r.kind){case`node-sqlite`:i=new ht;break;case`better-sqlite3`:i=new E;break;case`sqljs`:i=new F;break;default:{let e=r.kind;throw Error(`Unknown driver kind: ${e}`)}}if($.debug(`Storage backend: ${r.kind}`),r.failures.length>0){$.warn(`Fallback reasons:`);for(let e of r.failures)$.warn(` ${e.driver}: ${e.code} — ${e.message}`)}return{adapter:i,selection:r}}async function _t(e){switch(e.backend){case`lancedb`:{let{LanceStore:t}=await import(`./lance-store-B1Gim3h9.js`);return new t({path:e.path})}case`sqlite-vec`:{let{adapter:t}=await gt(e);return new Qe({path:e.path,adapter:t,embeddingDim:e.embeddingDim,embeddingProfile:e.embeddingProfile,partition:e.partition})}default:{let t=e.backend;throw Error(`Unknown store backend: "${t}". Supported: lancedb, sqlite-vec`)}}}export{z as CONTROL_TABLES,Ue as SqliteGraphStore,Qe as SqliteVecStore,_ as allMigrations,Ae as createSqlJsAdapter,L as createSqliteAdapter,pt as createStateStore,_t as createStore,Me as getTablePartition,He as migrateToSplitState,Ne as readStatePartitionConfigFromEnv,B as resolveStatePartitionConfig,g as runMigrations};
663
+ LIMIT ?`);return{create(e,n){t.run(e,n??`working`)},get(e){return n.get(e)},touch(e){r.run(e)},updateScore(e,t){i.run(t,e)},updateConfidence(e,t){a.run(t,e)},updateTier(e,t){o.run(t,t,t,e)},setSuperseded(e,t){s.run(t,e)},list(e){return e?.tier!==void 0&&e?.belowScore!==void 0&&e?.limit!==void 0?te.all(e.tier,e.belowScore,e.limit):e?.tier!==void 0&&e?.belowScore!==void 0?p.all(e.tier,e.belowScore):e?.tier!==void 0&&e?.limit!==void 0?d.all(e.tier,e.limit):e?.tier===void 0?e?.belowScore!==void 0&&e?.limit!==void 0?f.all(e.belowScore,e.limit):e?.belowScore===void 0?e?.limit===void 0?c.all():l.all(e.limit):ee.all(e.belowScore):u.all(e.tier)}}}function pt(e){let t=Q(e)?tt(e):st(e),n=Q(e)?it(e):ut(e),r=Q(e)?at(e):dt(e),i=Q(e)?rt(e):lt(e),a=Q(e)?nt(e):ct(e),o=Q(e)?ot(e):ft(e);return{stashGet(e){return t.get(e)?.value},stashSet(e,n){t.set(e,n)},stashList(){return t.list()},stashDelete(e){return t.has(e)?(t.delete(e),!0):!1},stashClear(){t.clear()},signalPost(e,t,r,i,a){return n.post(e,t,r,i,a)},signalGet(e,t){return n.cleanExpired(),n.get(e,t).map(e=>({id:e.id,value:e.value,createdAt:Z(e.createdAt),expiresAt:Z(e.expiresAt),...e.agent?{agent:e.agent}:{}}))},signalList(e){return n.cleanExpired(),n.list(e).map(e=>({id:e.id,key:e.key,value:e.value,createdAt:Z(e.createdAt),...e.agent?{agent:e.agent}:{}}))},signalClear(e,t){return n.cleanExpired(),n.clear(e,t)},signalCleanExpired(){return n.cleanExpired()},leaseAcquire(e,t,n,i,a){r.cleanExpired();let o=r.get(e,n);return o&&o.holder!==t?!1:(r.upsert(e,t,n,i??o?.intent??void 0,a),!0)},leaseRelease(e,t,n){r.cleanExpired();let i=r.get(e,n);return!i||i.holder!==t?!1:(r.delete(e,n),!0)},leaseGet(e,t){r.cleanExpired();let n=r.get(e,t);if(n)return{resource:n.resource,holder:n.holder,workspace:n.workspace,acquiredAt:Z(n.acquiredAt),expiresAt:Z(n.expiresAt),...n.intent?{intent:n.intent}:{}}},leaseList(e){return r.cleanExpired(),r.list(e).map(e=>({resource:e.resource,holder:e.holder,acquiredAt:Z(e.acquiredAt),expiresAt:Z(e.expiresAt),...e.intent?{intent:e.intent}:{}}))},leaseCleanExpired(){return r.cleanExpired()},sessionCreate(e,t){i.create(e,t?JSON.stringify(t):void 0)},sessionTouch(e){i.touch(e)},sessionGet(e){let t=i.get(e);if(t)return{sessionId:t.sessionId,createdAt:t.createdAt,lastActivity:t.lastActivity,...t.metadata?{metadata:t.metadata}:{}}},sessionList(){return i.list().map(e=>({sessionId:e.sessionId,createdAt:e.createdAt,lastActivity:e.lastActivity}))},sessionDelete(e){return i.has(e)?(i.delete(e),!0):!1},sessionDeleteStale(e){return i.deleteStale(e)},checkpointSave(e,t,n,r){a.save(e,t,n,r)},checkpointLoad(e){let t=a.get(e);if(t)return{id:t.id,label:t.label,data:t.data,createdAt:t.createdAt,...t.notes?{notes:t.notes}:{}}},checkpointList(e,t){return a.list(e,t).map(e=>({id:e.id,label:e.label,createdAt:e.createdAt,...e.notes?{notes:e.notes}:{}}))},checkpointLatest(e){let t=a.latest(e);if(t)return{id:t.id,label:t.label,data:t.data,createdAt:t.createdAt,...t.notes?{notes:t.notes}:{}}},checkpointDelete(e){return a.has(e)?(a.delete(e),!0):!1},checkpointDiff(e,t){let n=a.get(e),r=a.get(t);if(!(!n||!r))return{from:n.data,to:r.data}},checkpointHistory(e,t){return a.list(e,t).map(e=>({id:e.id,label:e.label,createdAt:e.createdAt,...e.notes?{notes:e.notes}:{}}))},checkpointGc(e,t){return a.gc(e,t)},memoryMetaCreate(e,t){o.create(e,t)},memoryMetaGet(e){return o.get(e)},memoryMetaTouch(e){o.touch(e)},memoryMetaUpdateScore(e,t){o.updateScore(e,t)},memoryMetaUpdateConfidence(e,t){o.updateConfidence(e,t)},memoryMetaUpdateTier(e,t){o.updateTier(e,t)},memoryMetaSetSuperseded(e,t){o.setSuperseded(e,t)},memoryMetaList(e){return o.list(e)}}}var mt=ae({NodeSqliteAdapter:()=>ht}),ht=class{type=`node-sqlite`;kind=`node-sqlite`;_sqliteVecLoaded=!1;get vectorCapable(){return this._sqliteVecLoaded}get capabilities(){return{vectorCapable:this.vectorCapable,persistentFile:!0,concurrentReaders:!0}}db=null;getDb(){if(!this.db)throw Error(`NodeSqliteAdapter: database not opened`);return this.db}ensureOpen(){this.getDb()}async open(e){let t=m(e);t&&!c(t)&&l(t,{recursive:!0});let n;try{let e=await import(`node:sqlite`);if(!ye(e.DatabaseSync))throw Error(`node:sqlite DatabaseSync extension loading APIs are unavailable`);n=e.DatabaseSync}catch(e){throw Error(`node:sqlite unavailable (requires Node ≥22.13): ${e instanceof Error?e.message:String(e)}`)}this.db=new n(e,{allowExtension:!0,timeout:5e3});try{this.loadSqliteVec(),this.getDb().exec(`PRAGMA foreign_keys = ON`),this.getDb().exec(`PRAGMA journal_mode = WAL`),this.getDb().exec(`PRAGMA synchronous = NORMAL`),this.getDb().exec(`PRAGMA busy_timeout = 5000`)}finally{this.getDb().enableLoadExtension(!1)}}exec(e){this.ensureOpen(),this.getDb().exec(e)}pragma(e){this.ensureOpen(),this.getDb().exec(`PRAGMA ${e}`)}bindArgs(e){return e===void 0?[]:Array.isArray(e)?e:[e]}queryAll(e,t){return this.all(e,t)}get(e,t){this.ensureOpen();let n=this.getDb().prepare(e),r=this.bindArgs(t),i=r.length>0?n.get(...r):n.get();if(i!=null)return this.normalizeRow(i)}all(e,t){this.ensureOpen();let n=this.getDb().prepare(e),r=this.bindArgs(t);return(r.length>0?n.all(...r):n.all()).map(e=>this.normalizeRow(e))}run(e,t){this.ensureOpen();let n=this.getDb().prepare(e),r=this.bindArgs(t),i=r.length>0?n.run(...r):n.run();return{changes:i.changes,lastInsertRowid:i.lastInsertRowid}}transaction(e){this.ensureOpen(),this.getDb().exec(`BEGIN IMMEDIATE`);let t={exec:e=>{this.ensureOpen(),this.getDb().exec(e)},get:(e,t)=>{this.ensureOpen();let n=this.getDb().prepare(e),r=this.bindArgs(t),i=r.length>0?n.get(...r):n.get();if(i!=null)return this.normalizeRow(i)},all:(e,t)=>{this.ensureOpen();let n=this.getDb().prepare(e),r=this.bindArgs(t);return(r.length>0?n.all(...r):n.all()).map(e=>this.normalizeRow(e))},run:(e,t)=>{this.ensureOpen();let n=this.getDb().prepare(e),r=this.bindArgs(t),i=r.length>0?n.run(...r):n.run();return{changes:i.changes,lastInsertRowid:i.lastInsertRowid}}};try{let n=e(t);return this.getDb().exec(`COMMIT`),n}catch(e){try{this.getDb().exec(`ROLLBACK`)}catch{}throw e}}flush(){}async close(){this.db&&=(this.getDb().close(),null)}normalizeRow(e){if(typeof e!=`object`||!e||Array.isArray(e))return e;let t=e;for(let e of Object.keys(t)){let n=t[e];Buffer.isBuffer(n)&&(t[e]=new Uint8Array(n.buffer,n.byteOffset,n.byteLength))}return e}loadSqliteVec(){try{let e=be();if(!e)throw Error(`Could not locate sqlite-vec extension binary`);if(this.getDb().enableLoadExtension(!0),this.getDb().loadExtension(e),!this.getDb().prepare(`SELECT vec_version() AS version`).get()?.version)throw Error(`sqlite-vec loaded but vec_version() returned no data`);let t=new Uint8Array(new Float32Array([1,0,0]).buffer),n=new Uint8Array(new Float32Array([0,1,0]).buffer),r=this.getDb().prepare(`SELECT vec_distance_cosine(?, ?) AS d`).get(t,n);if(!r||typeof r.d!=`number`)throw Error(`sqlite-vec smoke test failed: unexpected result ${JSON.stringify(r)}`);this._sqliteVecLoaded=!0}catch(e){this._sqliteVecLoaded=!1,console.warn(`[NodeSqliteAdapter] sqlite-vec loading failed, vector search disabled:`,e instanceof Error?e.message:String(e))}}};const $=a(`store-factory`);async function gt(e){if(e.adapter)return{adapter:e.adapter,selection:null};let t=e.sqliteDriver??process.env.AI_KIT_SQLITE_DRIVER??`auto`,n=e.allowFallback??process.env.AI_KIT_SQLITE_ALLOW_FALLBACK!==`false`,r;try{r=await P({driver:t,databasePath:e.path})}catch(i){if(n&&t!==`auto`)$.warn(`Forced driver "${t}" failed — falling back to auto selection`),r=await P({databasePath:e.path});else throw i}let i;switch(r.kind){case`node-sqlite`:i=new ht;break;case`better-sqlite3`:i=new E;break;case`sqljs`:i=new F;break;default:{let e=r.kind;throw Error(`Unknown driver kind: ${e}`)}}if($.debug(`Storage backend: ${r.kind}`),r.failures.length>0){$.warn(`Fallback reasons:`);for(let e of r.failures)$.warn(` ${e.driver}: ${e.code} — ${e.message}`)}return{adapter:i,selection:r}}async function _t(e){switch(e.backend){case`lancedb`:{let{LanceStore:t}=await import(`./lance-store-CbTCT5kb.js`);return new t({path:e.path})}case`sqlite-vec`:{let{adapter:t}=await gt(e);return new Qe({path:e.path,adapter:t,embeddingDim:e.embeddingDim,embeddingProfile:e.embeddingProfile,partition:e.partition})}default:{let t=e.backend;throw Error(`Unknown store backend: "${t}". Supported: lancedb, sqlite-vec`)}}}export{z as CONTROL_TABLES,Ue as SqliteGraphStore,Qe as SqliteVecStore,_ as allMigrations,Ae as createSqlJsAdapter,L as createSqliteAdapter,pt as createStateStore,_t as createStore,Me as getTablePartition,He as migrateToSplitState,Ne as readStatePartitionConfigFromEnv,B as resolveStatePartitionConfig,g as runMigrations};
@@ -1 +1 @@
1
- import{EMBEDDING_DEFAULTS as e,SEARCH_DEFAULTS as t,STORE_DEFAULTS as n,createLogger as r,serializeError as i,sourceTypeContentTypes as a}from"../../core/dist/index.js";import{Index as o,connect as s,makeArrowTable as c}from"@lancedb/lancedb";function l(e){if(!e)return[];if(Array.isArray(e))return e.filter(e=>typeof e==`string`);try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}catch{return[]}}function u(e){return c([{...e,tags:Array.isArray(e.tags)&&e.tags.length===0?[`__schema_seed__`]:e.tags}]).schema}const d=/^[\w.\-/ ]+$/,f=r(`store`);function p(e,t){if(!d.test(e))throw Error(`Invalid ${t} filter value: contains disallowed characters`);return e.replace(/'/g,`''`)}var m=class r{db=null;table=null;dbPath;tableName;_draining=!1;_priorityQueue=[];_normalQueue=[];_ftsReady=!1;_ftsRecoveryAttemptAt=0;static FTS_RECOVERY_COOLDOWN_MS=300*1e3;enqueueWrite(e,t=!1){return new Promise((n,r)=>{let i=async()=>{try{n(await e())}catch(e){r(e)}};t?this._priorityQueue.push(i):this._normalQueue.push(i),this._drain()})}async _drain(){if(!this._draining){this._draining=!0;try{for(;this._priorityQueue.length>0||this._normalQueue.length>0;){let e=this._priorityQueue.shift()??this._normalQueue.shift();e&&await e()}}finally{this._draining=!1}}}constructor(e){this.dbPath=e?.path??n.path,this.tableName=e?.tableName??n.tableName}async initialize(){this.db=await s(this.dbPath),(await this.db.tableNames()).includes(this.tableName)&&(this.table=await this.db.openTable(this.tableName),await this.createFtsIndex())}async upsert(e,t){if(e.length!==0){if(e.length!==t.length)throw Error(`Record count (${e.length}) does not match vector count (${t.length})`);for(let n=0;n<t.length;n++)if(t[n].length===0)throw Error(`Zero-length vector at index ${n} for record ${e[n].sourcePath}`);return this.enqueueWrite(()=>this._upsertImpl(e,t))}}async upsertInteractive(e,t){if(e.length!==0){if(e.length!==t.length)throw Error(`Record count (${e.length}) does not match vector count (${t.length})`);for(let n=0;n<t.length;n++)if(t[n].length===0)throw Error(`Zero-length vector at index ${n} for record ${e[n].sourcePath}`);return this.enqueueWrite(()=>this._upsertImpl(e,t),!0)}}async _upsertImpl(e,t){let n=e.map((e,n)=>({id:e.id,vector:Array.from(t[n]),content:e.content,sourcePath:e.sourcePath,contentType:e.contentType,headingPath:e.headingPath??``,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,startLine:e.startLine,endLine:e.endLine,fileHash:e.fileHash,indexedAt:e.indexedAt,origin:e.origin,tags:e.tags,category:e.category??``,version:e.version})),r=c(n,{schema:this.table?await this.table.schema():u(n[0])});if(this.table){let t=[...new Set(e.map(e=>e.sourcePath))];for(let e of t)try{await this.table.delete(`sourcePath = '${p(e,`sourcePath`)}'`)}catch{}await this.table.add(r)}else try{this.table=await this.db?.createTable(this.tableName,r)??null}catch(e){if(String(e).includes(`already exists`)&&this.db)this.table=await this.db.openTable(this.tableName),await this.table.add(r);else throw e}}async search(e,n){if(e.length===0||!this.table)return[];let r=n?.limit??t.maxResults,i=n?.minScore??t.minScore,a=this.table.search(e).limit(r*2),o=this.buildFilterString(n);return o&&(a=a.where(o)),(await a.toArray()).map(e=>({record:this.fromLanceRecord(e),score:1-(e._distance??1)})).filter(e=>e.score>=i).slice(0,r)}async createFtsIndex(){return this.enqueueWrite(()=>this._createFtsIndexImpl())}async _createFtsIndexImpl(){if(this.table)try{await this.table.createIndex(`content`,{config:o.fts({withPosition:!0}),replace:!0}),this._ftsReady=!0,this._ftsRecoveryAttemptAt=0,f.info(`FTS index created/updated`,{column:`content`})}catch(e){f.warn(`FTS index creation failed`,i(e))}}async ftsSearch(e,n){if(!this.table)return[];if(!this._ftsReady){let e=Date.now();if(e-this._ftsRecoveryAttemptAt<r.FTS_RECOVERY_COOLDOWN_MS)return[];this._ftsRecoveryAttemptAt=e;try{await this.createFtsIndex()}catch{return[]}if(!this._ftsReady)return[]}let a=n?.limit??t.maxResults;try{let t=this.table.search(e).limit(a*2),r=this.buildFilterString(n);return r&&(t=t.where(r)),(await t.toArray()).map(e=>({record:this.fromLanceRecord(e),score:e._score??e._relevance_score??0}))}catch(e){return(e instanceof Error?e.message:String(e)).includes(`INVERTED index`)?(f.debug(`FTS search skipped — index not yet available`),this._ftsReady=!1):f.warn(`FTS search failed`,i(e)),[]}}async getById(e){if(!this.table)return null;let t=await this.table.query().where(`id = '${p(e,`id`)}'`).limit(1).toArray();return t.length===0?null:this.fromLanceRecord(t[0])}async deleteBySourcePath(e){return this.enqueueWrite(()=>this._deleteBySourcePathImpl(e))}async _deleteBySourcePathImpl(e){if(!this.table)return 0;let t=await this.getBySourcePath(e);return t.length===0?0:(await this.table.delete(`sourcePath = '${p(e,`sourcePath`)}'`),t.length)}async deleteById(e){return this.enqueueWrite(()=>this._deleteByIdImpl(e))}async deleteByIdInteractive(e){return this.enqueueWrite(()=>this._deleteByIdImpl(e),!0)}async _deleteByIdImpl(e){return!this.table||!await this.getById(e)?!1:(await this.table.delete(`id = '${p(e,`id`)}'`),!0)}async getBySourcePath(e){return this.table?(await this.table.query().where(`sourcePath = '${p(e,`sourcePath`)}'`).limit(1e3).toArray()).map(e=>this.fromLanceRecord(e)):[]}async getStats(){if(!this.table)return{totalRecords:0,totalFiles:0,contentTypeBreakdown:{},lastIndexedAt:null,storeBackend:`lancedb`,embeddingModel:e.model};let t=await this.table.countRows(),n=await this.table.query().select([`sourcePath`,`contentType`,`indexedAt`]).limit(1e5).toArray(),r={},i=new Set,a=null;for(let e of n){let t=e;r[t.contentType]=(r[t.contentType]??0)+1,i.add(t.sourcePath),(!a||t.indexedAt>a)&&(a=t.indexedAt)}return{totalRecords:t,totalFiles:i.size,contentTypeBreakdown:r,lastIndexedAt:a,storeBackend:`lancedb`,embeddingModel:e.model}}async listSourcePaths(){if(!this.table)return[];let e=await this.table.query().select([`sourcePath`]).limit(1e5).toArray();return[...new Set(e.map(e=>e.sourcePath))]}async dropTable(){return this.enqueueWrite(()=>this._dropTableImpl())}async _dropTableImpl(){if(this.db&&(await this.db.tableNames()).includes(this.tableName))for(let e=1;e<=3;e++)try{await this.db.dropTable(this.tableName);break}catch(t){if(e===3)throw t;let n=e*500;f.warn(`dropTable attempt failed, retrying`,{attempt:e,delayMs:n}),await new Promise(e=>setTimeout(e,n))}this.table=null}async close(){try{this.db&&typeof this.db.close==`function`&&await this.db.close()}catch{}this.table=null,this.db=null}buildFilterString(e){let t=[];if(e?.contentType&&t.push(`contentType = '${p(e.contentType,`contentType`)}'`),e?.sourceType){let n=a(e.sourceType);if(n.length>0){let e=n.map(e=>`'${p(e,`sourceType`)}'`).join(`, `);t.push(`contentType IN (${e})`)}}if(e?.origin&&t.push(`origin = '${p(e.origin,`origin`)}'`),e?.category&&t.push(`category = '${p(e.category,`category`)}'`),e?.tags&&e.tags.length>0){let n=e.tags.map(e=>`'${p(e,`tag`)}'`).join(`, `);t.push(`array_has_any(tags, [${n}])`)}return t.length>0?t.join(` AND `):null}fromLanceRecord(e){return{id:e.id,content:e.content,sourcePath:e.sourcePath,contentType:e.contentType,headingPath:e.headingPath||void 0,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,startLine:e.startLine,endLine:e.endLine,fileHash:e.fileHash,indexedAt:e.indexedAt,origin:e.origin,tags:l(e.tags),category:e.category||void 0,version:e.version}}};export{m as LanceStore};
1
+ import{EMBEDDING_DEFAULTS as e,SEARCH_DEFAULTS as t,STORE_DEFAULTS as n,createLogger as r,serializeError as i,sourceTypeContentTypes as a}from"../../core/dist/index.js";import{Index as o,connect as s,makeArrowTable as c}from"@lancedb/lancedb";function l(e){if(!e)return[];if(Array.isArray(e))return e.filter(e=>typeof e==`string`);try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}catch{return[]}}function u(e){return c([{...e,tags:Array.isArray(e.tags)&&e.tags.length===0?[`__schema_seed__`]:e.tags}]).schema}const d=/^[\w.\-/ ]+$/,f=r(`store`);function p(e,t){if(!d.test(e))throw Error(`Invalid ${t} filter value: contains disallowed characters`);return e.replace(/'/g,`''`)}var m=class r{db=null;table=null;dbPath;tableName;_draining=!1;_priorityQueue=[];_normalQueue=[];_ftsReady=!1;_ftsRecoveryAttemptAt=0;static FTS_RECOVERY_COOLDOWN_MS=300*1e3;enqueueWrite(e,t=!1){return new Promise((n,r)=>{let i=async()=>{try{n(await e())}catch(e){r(e)}};t?this._priorityQueue.push(i):this._normalQueue.push(i),this._drain()})}async _drain(){if(!this._draining){this._draining=!0;try{for(;this._priorityQueue.length>0||this._normalQueue.length>0;){let e=this._priorityQueue.shift()??this._normalQueue.shift();e&&await e()}}finally{this._draining=!1}}}constructor(e){this.dbPath=e?.path??n.path,this.tableName=e?.tableName??n.tableName}async initialize(){this.db=await s(this.dbPath),(await this.db.tableNames()).includes(this.tableName)&&(this.table=await this.db.openTable(this.tableName),await this.createFtsIndex())}async upsert(e,t){if(e.length!==0){if(e.length!==t.length)throw Error(`Record count (${e.length}) does not match vector count (${t.length})`);for(let n=0;n<t.length;n++)if(t[n].length===0)throw Error(`Zero-length vector at index ${n} for record ${e[n].sourcePath}`);return this.enqueueWrite(()=>this._upsertImpl(e,t))}}async upsertInteractive(e,t){if(e.length!==0){if(e.length!==t.length)throw Error(`Record count (${e.length}) does not match vector count (${t.length})`);for(let n=0;n<t.length;n++)if(t[n].length===0)throw Error(`Zero-length vector at index ${n} for record ${e[n].sourcePath}`);return this.enqueueWrite(()=>this._upsertImpl(e,t),!0)}}async _upsertImpl(e,t){let n=e.map((e,n)=>({id:e.id,vector:Array.from(t[n]),content:e.content,sourcePath:e.sourcePath,contentType:e.contentType,headingPath:e.headingPath??``,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,startLine:e.startLine,endLine:e.endLine,fileHash:e.fileHash,indexedAt:e.indexedAt,origin:e.origin,tags:e.tags,category:e.category??``,version:e.version})),r=c(n,{schema:this.table?await this.table.schema():u(n[0])});if(this.table){let t=[...new Set(e.map(e=>e.sourcePath))];for(let e of t)try{await this.table.delete(`sourcePath = '${p(e,`sourcePath`)}'`)}catch{}await this.table.add(r)}else try{this.table=await this.db?.createTable(this.tableName,r)??null}catch(e){if(String(e).includes(`already exists`)&&this.db)this.table=await this.db.openTable(this.tableName),await this.table.add(r);else throw e}}async search(e,n){if(e.length===0||!this.table)return[];let r=n?.limit??t.maxResults,i=n?.minScore??t.minScore,a=this.table.search(e).limit(r*2),o=this.buildFilterString(n);return o&&(a=a.where(o)),(await a.toArray()).map(e=>({record:this.fromLanceRecord(e),score:1-(e._distance??1)})).filter(e=>e.score>=i).slice(0,r)}async createFtsIndex(){return this.enqueueWrite(()=>this._createFtsIndexImpl())}async _createFtsIndexImpl(){if(this.table)try{await this.table.createIndex(`content`,{config:o.fts({withPosition:!0}),replace:!0}),this._ftsReady=!0,this._ftsRecoveryAttemptAt=0,f.info(`FTS index created/updated`,{column:`content`})}catch(e){f.warn(`FTS index creation failed`,i(e))}}async ftsSearch(e,n){if(!this.table)return[];if(!this._ftsReady){let e=Date.now();if(e-this._ftsRecoveryAttemptAt<r.FTS_RECOVERY_COOLDOWN_MS)return[];this._ftsRecoveryAttemptAt=e;try{await this.createFtsIndex()}catch{return[]}if(!this._ftsReady)return[]}let a=n?.limit??t.maxResults;try{let t=this.table.search(e).limit(a*2),r=this.buildFilterString(n);return r&&(t=t.where(r)),(await t.toArray()).map(e=>({record:this.fromLanceRecord(e),score:e._score??e._relevance_score??0}))}catch(e){return(e instanceof Error?e.message:String(e)).includes(`INVERTED index`)?(f.debug(`FTS search skipped — index not yet available`),this._ftsReady=!1):f.warn(`FTS search failed`,i(e)),[]}}async getById(e){if(!this.table)return null;let t=await this.table.query().where(`id = '${p(e,`id`)}'`).limit(1).toArray();return t.length===0?null:this.fromLanceRecord(t[0])}async deleteBySourcePath(e){return this.enqueueWrite(()=>this._deleteBySourcePathImpl(e))}async _deleteBySourcePathImpl(e){if(!this.table)return 0;let t=await this.getBySourcePath(e);return t.length===0?0:(await this.table.delete(`sourcePath = '${p(e,`sourcePath`)}'`),t.length)}async deleteById(e){return this.enqueueWrite(()=>this._deleteByIdImpl(e))}async deleteByIdInteractive(e){return this.enqueueWrite(()=>this._deleteByIdImpl(e),!0)}async _deleteByIdImpl(e){return!this.table||!await this.getById(e)?!1:(await this.table.delete(`id = '${p(e,`id`)}'`),!0)}async getBySourcePath(e){return this.table?(await this.table.query().where(`sourcePath = '${p(e,`sourcePath`)}'`).limit(1e3).toArray()).map(e=>this.fromLanceRecord(e)):[]}async getStats(){if(!this.table)return{totalRecords:0,totalFiles:0,contentTypeBreakdown:{},lastIndexedAt:null,lastSourceIndexedAt:null,storeBackend:`lancedb`,embeddingModel:e.model};let t=await this.table.countRows(),n=await this.table.query().select([`sourcePath`,`contentType`,`indexedAt`,`origin`]).limit(1e5).toArray(),r={},i=new Set,a=null,o=null;for(let e of n){let t=e;r[t.contentType]=(r[t.contentType]??0)+1,i.add(t.sourcePath),(!a||t.indexedAt>a)&&(a=t.indexedAt),t.origin===`indexed`&&(!o||t.indexedAt>o)&&(o=t.indexedAt)}return{totalRecords:t,totalFiles:i.size,contentTypeBreakdown:r,lastIndexedAt:a,lastSourceIndexedAt:o,storeBackend:`lancedb`,embeddingModel:e.model}}async listSourcePaths(){if(!this.table)return[];let e=await this.table.query().select([`sourcePath`]).limit(1e5).toArray();return[...new Set(e.map(e=>e.sourcePath))]}async dropTable(){return this.enqueueWrite(()=>this._dropTableImpl())}async _dropTableImpl(){if(this.db&&(await this.db.tableNames()).includes(this.tableName))for(let e=1;e<=3;e++)try{await this.db.dropTable(this.tableName);break}catch(t){if(e===3)throw t;let n=e*500;f.warn(`dropTable attempt failed, retrying`,{attempt:e,delayMs:n}),await new Promise(e=>setTimeout(e,n))}this.table=null}async close(){try{this.db&&typeof this.db.close==`function`&&await this.db.close()}catch{}this.table=null,this.db=null}buildFilterString(e){let t=[];if(e?.contentType&&t.push(`contentType = '${p(e.contentType,`contentType`)}'`),e?.sourceType){let n=a(e.sourceType);if(n.length>0){let e=n.map(e=>`'${p(e,`sourceType`)}'`).join(`, `);t.push(`contentType IN (${e})`)}}if(e?.origin&&t.push(`origin = '${p(e.origin,`origin`)}'`),e?.category&&t.push(`category = '${p(e.category,`category`)}'`),e?.tags&&e.tags.length>0){let n=e.tags.map(e=>`'${p(e,`tag`)}'`).join(`, `);t.push(`array_has_any(tags, [${n}])`)}return t.length>0?t.join(` AND `):null}fromLanceRecord(e){return{id:e.id,content:e.content,sourcePath:e.sourcePath,contentType:e.contentType,headingPath:e.headingPath||void 0,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,startLine:e.startLine,endLine:e.endLine,fileHash:e.fileHash,indexedAt:e.indexedAt,origin:e.origin,tags:l(e.tags),category:e.category||void 0,version:e.version}}};export{m as LanceStore};