@vpxa/aikit 0.1.282 → 0.1.283

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.
@@ -2,7 +2,7 @@ import{createRequire as e}from"node:module";import{readFileSync as t}from"node:f
2
2
  `))console.log(` ${e}`)}}function E(e){console.log(e.id),console.log(` Command: ${e.command}${e.args.length>0?` ${e.args.join(` `)}`:``}`),console.log(` PID: ${e.pid??`unknown`}`),console.log(` Status: ${e.status}`),console.log(` Started: ${e.startedAt}`),e.exitCode!==void 0&&console.log(` Exit code: ${e.exitCode}`),console.log(` Logs: ${e.logs.length}`)}function D(e){if(console.log(`Exports scanned: ${e.totalExports}`),console.log(`Dead in source: ${e.totalDeadSource} (actionable)`),console.log(`Dead in docs: ${e.totalDeadDocs} (informational)`),e.totalDeadSource===0&&e.totalDeadDocs===0){console.log(`No dead symbols found.`);return}if(e.deadInSource.length>0){console.log(`
3
3
  Dead in source (actionable):`);for(let t of e.deadInSource)console.log(` - ${t.path}:${t.line} ${t.kind} ${t.name}`)}if(e.deadInDocs.length>0){console.log(`
4
4
  Dead in docs (informational):`);for(let t of e.deadInDocs)console.log(` - ${t.path}:${t.line} ${t.kind} ${t.name}`)}}function O(e){console.log(e.path),console.log(` Language: ${e.language}`),console.log(` Lines: ${e.lines}`),console.log(` Estimated tokens: ~${e.estimatedTokens}`),console.log(``),M(`Imports`,e.imports),M(`Exports`,e.exports),M(`Functions`,e.functions.map(e=>`${e.name} @ line ${e.line}${e.exported?` [exported]`:``}`)),M(`Classes`,e.classes.map(e=>`${e.name} @ line ${e.line}${e.exported?` [exported]`:``}`)),M(`Interfaces`,e.interfaces.map(e=>`${e.name} @ line ${e.line}`)),M(`Types`,e.types.map(e=>`${e.name} @ line ${e.line}`))}function k(e){if(console.log(`Symbol: ${e.name}`),e.definedIn?console.log(`Defined in: ${e.definedIn.path}:${e.definedIn.line} (${e.definedIn.kind})`):console.log(`Defined in: not found`),console.log(``),console.log(`Imported by:`),e.importedBy.length===0)console.log(` none`);else for(let t of e.importedBy)console.log(` - ${t.path}:${t.line} ${t.importStatement}`);if(console.log(``),console.log(`Referenced in:`),e.referencedIn.length===0)console.log(` none`);else for(let t of e.referencedIn)console.log(` - ${t.path}:${t.line} ${t.context}`)}function A(e){console.log(e.name),console.log(` Files: ${e.files.length}`),console.log(` Updated: ${e.updated}`),e.description&&console.log(` Description: ${e.description}`);for(let t of e.files)console.log(` - ${t}`)}function j(e){let t=Array.isArray(e.data.files)?e.data.files.filter(e=>typeof e==`string`):[];if(console.log(e.id),console.log(` Label: ${e.label}`),console.log(` Created: ${e.createdAt}`),e.notes&&console.log(` Notes: ${e.notes}`),t.length>0){console.log(` Files: ${t.length}`);for(let e of t)console.log(` - ${e}`)}console.log(` Data:`);for(let t of JSON.stringify(e.data,null,2).split(`
5
- `))console.log(` ${t}`)}function M(e,t){if(console.log(`${e}:`),t.length===0){console.log(` none`),console.log(``);return}for(let e of t)console.log(` - ${e}`);console.log(``)}function N(e){let t=e.trim();if(!t)return``;try{return JSON.parse(t)}catch{return e}}function P(e){let t=e.trim();if(!t)return{};let n=JSON.parse(t);if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`Checkpoint data must be a JSON object.`);return n}function ne(e,t,n=60){let r=new Map;for(let t=0;t<e.length;t++){let i=e[t];r.set(i.record.id,{record:i.record,score:1/(n+t+1)})}for(let e=0;e<t.length;e++){let i=t[e],a=r.get(i.record.id);a?a.score+=1/(n+e+1):r.set(i.record.id,{record:i.record,score:1/(n+e+1)})}return[...r.values()].sort((e,t)=>t.score-e.score)}const F=[`const{execSync:x}=require('child_process')`,`const{existsSync:e,renameSync:m}=require('fs')`,`const{join:j}=require('path')`,`const c=j(process.env.LOCALAPPDATA||process.env.HOME||'','npm-cache')`,`const s={stdio:'inherit'}`,`try{x('npx -y @vpxa/aikit@latest serve',s)}catch{try{const d=j(c,'_npx');if(e(d))m(d,j(c,'_npx_'+Date.now()))}catch{};try{x('npm cache verify',{stdio:'ignore',timeout:30000})}catch{};try{x('npx -y @vpxa/aikit@latest serve',s)}catch(e){process.stderr.write('aikit: all recovery attempts failed. Run: npm cache clean --force && npx -y @vpxa/aikit@latest serve');process.exit(1)}}`].join(`;`),I=`aikit`,L={type:`stdio`,command:`node`,args:[`-e`,F]},R=[`aikit`,`brainstorming`,`multi-agents-development`,`session-handoff`,`requirements-clarity`,`lesson-learned`,`c4-architecture`,`adr-skill`,`present`,`frontend-design`,`react`,`typescript`,`docs`,`repo-access`],z=[`aikit-basic`,`aikit-advanced`,`_epilogue`],B={"chat.agentFilesLocations":{"~/.claude/agents":!1},"chat.useClaudeMdFile":!1,"github.copilot.chat.copilotMemory.enabled":!0,"chat.customAgentInSubagent.enabled":!0,"chat.useNestedAgentsMdFiles":!0,"chat.useAgentSkills":!0,"github.copilot.chat.switchAgent.enabled":!0,"workbench.browser.enableChatTools":!0,"chat.mcp.apps.enabled":!0,"chat.instructionsFilesLocations":{"~/.copilot/instructions":!0,".github/instructions":!0,".claude/rules":!1,"~/.claude/rules":!1}},V=[{id:`no-grep-search`,toolName:`grep_search`,description:`grep_search / semantic_search → use search`,alternative:`search({ query })`,reason:`Hybrid search across all indexed + curated content — richer results than grep`,severity:`error`,action:`redirect`},{id:`no-semantic-search`,toolName:`semantic_search`,description:`semantic_search → use search`,alternative:`search({ query })`,reason:`Hybrid search across all indexed + curated content — vector + FTS fusion`,severity:`error`,action:`redirect`},{id:`no-grep-symbol`,toolName:`grep_search`,description:`grep_search for a symbol → use symbol`,alternative:`symbol({ name })`,reason:`Definition + references with scope and call context`,severity:`error`,action:`redirect`,heuristic:`grep_search for a specific symbol name`},{id:`no-read-file-understanding`,toolName:`read_file`,description:`read_file to understand a file → use file_summary`,alternative:`file_summary({ path })`,reason:`Structure, exports, imports — 10x fewer tokens than raw file reads`,severity:`error`,action:`warn`,heuristic:`read_file with range > 50 lines and no subsequent edit`},{id:`no-read-file-find-code`,toolName:`read_file`,description:`read_file to find specific code → use compact`,alternative:`compact({ path, query })`,reason:`Fresh compression: compact({ path, query }); query is required unless ref is supplied`,severity:`error`,action:`warn`,heuristic:`read_file to locate specific code without editing`},{id:`no-read-file-multiple`,toolName:`read_file`,description:`Multiple read_file calls → use digest`,alternative:`digest({ sources, query: "<task description>" })`,reason:`Compresses multiple files into token-budgeted summary`,severity:`error`,action:`warn`,heuristic:`consecutive read_file calls on different files without edits`},{id:`no-read-file-large`,toolName:`read_file`,description:`read_file (>50 lines to understand) → use file_summary → compact → digest`,alternative:`file_summary → compact → digest`,reason:`Use compressed context, not raw reads — 10x fewer tokens`,severity:`warning`,action:`warn`,heuristic:`read_file with endLine - startLine > 50 and no subsequent edit on same file`},{id:`no-ctxc-misuse`,toolName:`compact`,description:`Cached ctxc ref to refocus prior output → use compact with ref`,alternative:`compact({ ref }) or compact({ ref, query? })`,reason:`ctxc_... values are reversible refs, not ids or file paths. Prefer enrich: true on follow-up retrieval`,severity:`error`,action:`warn`,heuristic:`using ctxc_ value as a file path instead of as a ref`},{id:`no-terminal-test`,toolName:`run_in_terminal`,description:`run_in_terminal for tests → use test_run`,alternative:`test_run({})`,reason:`Run tests with structured output — no shell needed`,severity:`error`,action:`redirect`,commandPatterns:[`vitest`,`jest`,`mocha`,`pnpm test`,`npm test`]},{id:`no-terminal-typecheck`,toolName:`run_in_terminal`,description:`run_in_terminal for tsc/lint → use check`,alternative:`check({})`,reason:`Typecheck + lint combined, summary output — no shell needed`,severity:`error`,action:`redirect`,commandPatterns:[`\\btsc\\b`,`pnpm check`,`pnpm typecheck`,`pnpm lint`,`biome`]},{id:`no-terminal-grep`,toolName:`run_in_terminal`,description:`run_in_terminal for find/grep → use find or search`,alternative:`find({ pattern }) or search({ query })`,reason:`No shell needed, richer results with AI Kit search`,severity:`error`,action:`redirect`,commandPatterns:[`\\bgrep\\b`,`\\bfind\\b`,`\\brg\\b`,`Select-String`]},{id:`no-terminal-code-edits`,toolName:`run_in_terminal`,description:`run_in_terminal for code edits → use replace_string_in_file`,alternative:`replace_string_in_file`,reason:`Avoid shell-edit loops; use native edit tool instead`,severity:`error`,action:`redirect`,commandPatterns:[`sed`,`awk`,`Set-Content`,`Out-File`,`>>`,`\\| tee`]},{id:`no-edit-without-reading`,toolName:`replace_string_in_file`,description:`Editing without reading → use file_summary then targeted read_file`,alternative:`file_summary({ path }) → read_file({ path, offset, limit })`,reason:`Safer edits: understand structure before modifying`,severity:`error`,action:`warn`,heuristic:`replace_string_in_file on a file not previously read`},{id:`no-get-changed-files`,toolName:`get_changed_files`,description:`get_changed_files → use run_in_terminal with git diff`,alternative:"run_in_terminal with `git diff <specific-file>`",reason:`Diff only target file instead of all uncommitted diffs (100K+ tokens)`,severity:`error`,action:`redirect`},{id:`no-fetch-webpage`,toolName:`fetch_webpage`,description:`fetch_webpage → use web_fetch`,alternative:`web_fetch({ url })`,reason:`Readability extract + token budget — richer output than raw fetch`,severity:`error`,action:`redirect`},{id:`no-subagent-present`,toolName:`present`,description:`present (from subagent) → return structured text`,alternative:`Return findings as structured text`,reason:`Subagent present calls are invisible to the user (only Orchestrator should present)`,severity:`error`,action:`warn`,heuristic:`present called in subagent context`},{id:`no-apply-patch`,toolName:`apply_patch`,description:`apply_patch → use native edit tool`,alternative:`edit file tool`,reason:`AI Kit does not manage apply_patch; use the host environment edit tool`,severity:`warning`,action:`warn`},{id:`no-memory-native`,toolName:`memory`,description:`memory tool → use knowledge tool`,alternative:`knowledge (remember / search / list)`,reason:`AI Kit knowledge tool provides persistent cross-session memory with categories and tags`,severity:`warning`,action:`warn`}];function H(e){let t=e.toolName;if(e.commandPatterns&&e.commandPatterns.length>0){let n=e.description.match(/^(.*?)\s*→/);n&&(t=n[1].trim())}else if(e.heuristic){let n=e.description.match(/^(.*?)\s*→/);n&&(t=n[1].trim())}return{id:e.id,forbidden:t,alternative:e.alternative,severity:e.severity,reason:e.reason,matchPattern:e.commandPatterns?null:e.toolName,commandPatterns:e.commandPatterns??null,heuristic:e.heuristic??null}}const U=V.map(H);function W(){return[`| NEVER use this | USE THIS AI Kit TOOL INSTEAD | Why |`,`|---|---|---|`,...U.filter(e=>e.severity===`error`).map(e=>`| \`${e.forbidden}\` | \`${e.alternative}\` | ${e.reason} |`)].join(`
5
+ `))console.log(` ${t}`)}function M(e,t){if(console.log(`${e}:`),t.length===0){console.log(` none`),console.log(``);return}for(let e of t)console.log(` - ${e}`);console.log(``)}function N(e){let t=e.trim();if(!t)return``;try{return JSON.parse(t)}catch{return e}}function P(e){let t=e.trim();if(!t)return{};let n=JSON.parse(t);if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`Checkpoint data must be a JSON object.`);return n}function ne(e,t,n=60){let r=new Map;for(let t=0;t<e.length;t++){let i=e[t];r.set(i.record.id,{record:i.record,score:1/(n+t+1)})}for(let e=0;e<t.length;e++){let i=t[e],a=r.get(i.record.id);a?a.score+=1/(n+e+1):r.set(i.record.id,{record:i.record,score:1/(n+e+1)})}return[...r.values()].sort((e,t)=>t.score-e.score)}const F=[`const{execSync:x}=require('child_process')`,`const{existsSync:e,renameSync:m}=require('fs')`,`const{join:j}=require('path')`,`const c=j(process.env.LOCALAPPDATA||process.env.HOME||'','npm-cache')`,`const s={stdio:'inherit'}`,`try{x('npx -y @vpxa/aikit@latest serve',{...s,timeout:180000})}catch{try{const d=j(c,'_npx');if(e(d))m(d,j(c,'_npx_'+Date.now()))}catch{};try{x('npm cache verify',{stdio:'ignore',timeout:30000})}catch{};try{x('npm cache clean --force',{stdio:'ignore',timeout:30000})}catch{};try{x('npx -y @vpxa/aikit@latest serve',s)}catch(e){process.stderr.write('aikit: all recovery attempts failed. Run: npm cache clean --force && npx -y @vpxa/aikit@latest serve');process.exit(1)}}`].join(`;`),I=`aikit`,L={type:`stdio`,command:`node`,args:[`-e`,F]},R=[`aikit`,`brainstorming`,`multi-agents-development`,`session-handoff`,`requirements-clarity`,`lesson-learned`,`c4-architecture`,`adr-skill`,`present`,`frontend-design`,`react`,`typescript`,`docs`,`repo-access`],z=[`aikit-basic`,`aikit-advanced`,`_epilogue`],B={"chat.agentFilesLocations":{"~/.claude/agents":!1},"chat.useClaudeMdFile":!1,"github.copilot.chat.copilotMemory.enabled":!0,"chat.customAgentInSubagent.enabled":!0,"chat.useNestedAgentsMdFiles":!0,"chat.useAgentSkills":!0,"github.copilot.chat.switchAgent.enabled":!0,"workbench.browser.enableChatTools":!0,"chat.mcp.apps.enabled":!0,"chat.instructionsFilesLocations":{"~/.copilot/instructions":!0,".github/instructions":!0,".claude/rules":!1,"~/.claude/rules":!1}},V=[{id:`no-grep-search`,toolName:`grep_search`,description:`grep_search / semantic_search → use search`,alternative:`search({ query })`,reason:`Hybrid search across all indexed + curated content — richer results than grep`,severity:`error`,action:`redirect`},{id:`no-semantic-search`,toolName:`semantic_search`,description:`semantic_search → use search`,alternative:`search({ query })`,reason:`Hybrid search across all indexed + curated content — vector + FTS fusion`,severity:`error`,action:`redirect`},{id:`no-grep-symbol`,toolName:`grep_search`,description:`grep_search for a symbol → use symbol`,alternative:`symbol({ name })`,reason:`Definition + references with scope and call context`,severity:`error`,action:`redirect`,heuristic:`grep_search for a specific symbol name`},{id:`no-read-file-understanding`,toolName:`read_file`,description:`read_file to understand a file → use file_summary`,alternative:`file_summary({ path })`,reason:`Structure, exports, imports — 10x fewer tokens than raw file reads`,severity:`error`,action:`warn`,heuristic:`read_file with range > 50 lines and no subsequent edit`},{id:`no-read-file-find-code`,toolName:`read_file`,description:`read_file to find specific code → use compact`,alternative:`compact({ path, query })`,reason:`Fresh compression: compact({ path, query }); query is required unless ref is supplied`,severity:`error`,action:`warn`,heuristic:`read_file to locate specific code without editing`},{id:`no-read-file-multiple`,toolName:`read_file`,description:`Multiple read_file calls → use digest`,alternative:`digest({ sources, query: "<task description>" })`,reason:`Compresses multiple files into token-budgeted summary`,severity:`error`,action:`warn`,heuristic:`consecutive read_file calls on different files without edits`},{id:`no-read-file-large`,toolName:`read_file`,description:`read_file (>50 lines to understand) → use file_summary → compact → digest`,alternative:`file_summary → compact → digest`,reason:`Use compressed context, not raw reads — 10x fewer tokens`,severity:`warning`,action:`warn`,heuristic:`read_file with endLine - startLine > 50 and no subsequent edit on same file`},{id:`no-ctxc-misuse`,toolName:`compact`,description:`Cached ctxc ref to refocus prior output → use compact with ref`,alternative:`compact({ ref }) or compact({ ref, query? })`,reason:`ctxc_... values are reversible refs, not ids or file paths. Prefer enrich: true on follow-up retrieval`,severity:`error`,action:`warn`,heuristic:`using ctxc_ value as a file path instead of as a ref`},{id:`no-terminal-test`,toolName:`run_in_terminal`,description:`run_in_terminal for tests → use test_run`,alternative:`test_run({})`,reason:`Run tests with structured output — no shell needed`,severity:`error`,action:`redirect`,commandPatterns:[`vitest`,`jest`,`mocha`,`pnpm test`,`npm test`]},{id:`no-terminal-typecheck`,toolName:`run_in_terminal`,description:`run_in_terminal for tsc/lint → use check`,alternative:`check({})`,reason:`Typecheck + lint combined, summary output — no shell needed`,severity:`error`,action:`redirect`,commandPatterns:[`\\btsc\\b`,`pnpm check`,`pnpm typecheck`,`pnpm lint`,`biome`]},{id:`no-terminal-grep`,toolName:`run_in_terminal`,description:`run_in_terminal for find/grep → use find or search`,alternative:`find({ pattern }) or search({ query })`,reason:`No shell needed, richer results with AI Kit search`,severity:`error`,action:`redirect`,commandPatterns:[`\\bgrep\\b`,`\\bfind\\b`,`\\brg\\b`,`Select-String`]},{id:`no-terminal-code-edits`,toolName:`run_in_terminal`,description:`run_in_terminal for code edits → use replace_string_in_file`,alternative:`replace_string_in_file`,reason:`Avoid shell-edit loops; use native edit tool instead`,severity:`error`,action:`redirect`,commandPatterns:[`sed`,`awk`,`Set-Content`,`Out-File`,`>>`,`\\| tee`]},{id:`no-edit-without-reading`,toolName:`replace_string_in_file`,description:`Editing without reading → use file_summary then targeted read_file`,alternative:`file_summary({ path }) → read_file({ path, offset, limit })`,reason:`Safer edits: understand structure before modifying`,severity:`error`,action:`warn`,heuristic:`replace_string_in_file on a file not previously read`},{id:`no-get-changed-files`,toolName:`get_changed_files`,description:`get_changed_files → use run_in_terminal with git diff`,alternative:"run_in_terminal with `git diff <specific-file>`",reason:`Diff only target file instead of all uncommitted diffs (100K+ tokens)`,severity:`error`,action:`redirect`},{id:`no-fetch-webpage`,toolName:`fetch_webpage`,description:`fetch_webpage → use web_fetch`,alternative:`web_fetch({ url })`,reason:`Readability extract + token budget — richer output than raw fetch`,severity:`error`,action:`redirect`},{id:`no-subagent-present`,toolName:`present`,description:`present (from subagent) → return structured text`,alternative:`Return findings as structured text`,reason:`Subagent present calls are invisible to the user (only Orchestrator should present)`,severity:`error`,action:`warn`,heuristic:`present called in subagent context`},{id:`no-apply-patch`,toolName:`apply_patch`,description:`apply_patch → use native edit tool`,alternative:`edit file tool`,reason:`AI Kit does not manage apply_patch; use the host environment edit tool`,severity:`warning`,action:`warn`},{id:`no-memory-native`,toolName:`memory`,description:`memory tool → use knowledge tool`,alternative:`knowledge (remember / search / list)`,reason:`AI Kit knowledge tool provides persistent cross-session memory with categories and tags`,severity:`warning`,action:`warn`}];function H(e){let t=e.toolName;if(e.commandPatterns&&e.commandPatterns.length>0){let n=e.description.match(/^(.*?)\s*→/);n&&(t=n[1].trim())}else if(e.heuristic){let n=e.description.match(/^(.*?)\s*→/);n&&(t=n[1].trim())}return{id:e.id,forbidden:t,alternative:e.alternative,severity:e.severity,reason:e.reason,matchPattern:e.commandPatterns?null:e.toolName,commandPatterns:e.commandPatterns??null,heuristic:e.heuristic??null}}const U=V.map(H);function W(){return[`| NEVER use this | USE THIS AI Kit TOOL INSTEAD | Why |`,`|---|---|---|`,...U.filter(e=>e.severity===`error`).map(e=>`| \`${e.forbidden}\` | \`${e.alternative}\` | ${e.reason} |`)].join(`
6
6
  `)}function G(e){return`
7
7
  ## Flow Context Bootstrap
8
8
 
@@ -5,4 +5,4 @@ import{createHash as e,randomUUID as t}from"node:crypto";import{readFileSync 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){O.error(`Failed to upsert curated batch`,{batchSize:e.length,...f(t)});for(let t of e)n.push(`${t.relativePath}: upsert failed`);return 0}}catch(r){if(e.length===1)return O.error(`Failed to embed curated item`,{relativePath:e[0].relativePath,...f(r)}),n.push(`${e[0].relativePath}: reindex failed`),0;O.warn(`Curated embed batch failed, retrying with smaller chunks`,{batchSize:e.length,...f(r)});let i=Math.ceil(e.length/2),a=e.slice(0,i),o=e.slice(i);return await this.embedAndUpsertBatch(a,t,n)+await this.embedAndUpsertBatch(o,t,n)}}gitCommitKnowledge(e,t,n){try{if(!h(this.curatedDir))return;let r=this.knowledgeRefForPath(e);if(!r)return;g(r,`entry.md`,t,n,this.curatedDir)}catch{}}gitDeleteKnowledgeRef(e){try{if(!h(this.curatedDir))return;let t=this.knowledgeRefForPath(e);if(!t)return;_([`update-ref`,`-d`,t],this.curatedDir)}catch{}}knowledgeRefForPath(e){let t=e.replace(/\.md$/,``).split(`/`).map(e=>v(e)).join(`/`);return t.split(`/`).every(e=>m.test(e))?`${D}/${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,r){if(u.instance().isDegraded(`embedder`)){O.debug(`Skipping vector indexing — embedder degraded`,{relativePath:e,operation:r,subsystem:`embedder`});return}try{await this.indexCuratedFile(e,t,n)}catch(t){O.warn(`Curated file persisted but vector indexing deferred`,{relativePath:e,operation:r,...f(t)})}}async discoverCategories(){return this.adapter.listDirectories()}guardPath(e){let t=e.replace(/^\.ai\/curated\//,``);if(t.endsWith(`.md`)||(t+=`.md`),t.includes(`..`)||i(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`)>E)throw Error(`Content exceeds maximum size of ${E/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(t){return e(`sha256`).update(t).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 A=`__pending__:`;function j(e){return e.startsWith(A)}function M(e){let t=e.headers[`mcp-session-id`];return Array.isArray(t)?t[0]:t}function N(e,t,n,r){e.status(t).json({jsonrpc:`2.0`,error:{code:n,message:r},id:null})}var P=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=M(e),i=r?this.runtimes.get(r):void 0;if(r&&!i){N(t,404,-32001,`Session not found`);return}if(!i){if(e.method!==`POST`){N(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`&&!j(r)&&this.options.onSessionActivity?.(r),e.method===`DELETE`&&!j(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&&!j(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){N(e,503,-32003,`Session capacity reached`);return}let n=this.now(),r=await this.options.createServer(),i={id:`${A}${t()}`,transport:void 0,createdAt:n,lastAccessAt:n,server:r,requestChain:Promise.resolve()},a=this.options.createTransport({sessionIdGenerator:()=>t(),onsessioninitialized:async e=>{this.runtimes.delete(i.id),i.id=e,this.runtimes.set(e,i),this.options.onSessionStart?.(e)},onsessionclosed:async e=>{e&&await this.closeSession(e,{closeTransport:!1})}});return i.transport=a,a.onclose=()=>{let e=i.transport.sessionId??i.id;this.closeSession(e,{closeTransport:!1})},this.runtimes.set(i.id,i),await r.connect(a),i}async withRuntimeLock(e,t){let n=e.requestChain,r;e.requestChain=new Promise(e=>{r=e}),await n;try{await t()}finally{r()}}};function F(e){let t=e.includes(`T`)?e:`${e.replace(` `,`T`)}Z`;return Date.parse(t)}var I=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=F(n.lastActivity);return Number.isFinite(r)&&e-r>=t}).map(e=>e.sessionId)}};function L(){try{let e=o(r(s(import.meta.url)),`..`,`..`,`..`,`package.json`);return JSON.parse(n(e,`utf-8`)).version??`0.0.0`}catch{return`0.0.0`}}const R=d(`server`);function z(e,t){return t?{version:e,...f(t)}:{version:e}}const B=/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/i;function V({requestOrigin:e,configuredOrigin:t,allowAnyOrigin:n,fallbackOrigin:r}){let i=t??r;return i===`*`?n?{allowOrigin:`*`,warn:!1}:e?B.test(e)?{allowOrigin:e,warn:!1}:{allowOrigin:null,warn:!0}:{allowOrigin:r,warn:!1}:{allowOrigin:i,warn:!1}}function H({limit:e,windowMs:t}){let n=new Map,r=(e,r)=>{let i=r-t,a=n.get(e)?.filter(e=>e>i)??[];return a.length===0?(n.delete(e),[]):(n.set(e,a),a)};return{allow(t,i=Date.now()){let a=r(t,i);return a.length>=e?!1:(a.push(i),n.set(t,a),!0)},getRetryAfterMs(n,i=Date.now()){let a=r(n,i);return a.length<e?0:Math.max(0,a[0]+t-i)}}}function U(e){return e.startsWith(`file://`)?s(e):e}function W(e){let t=o(e);return process.platform===`win32`?t.toLowerCase():t}function G(e){let t=new Map;for(let n of e){let e=U(n.uri);t.set(W(e),e)}return[...t.values()].sort((e,t)=>W(e).localeCompare(W(t)))}function K({config:e,roots:t}){let n=G(t);if(n.length===0)return null;let r=e.sources?.[0]?.path;if(r){let e=W(r),t=n.find(t=>W(t)===e);if(t)return t}return n[0]}function q({config:e,log:t,reconfigureForWorkspace:n,roots:r}){let i=G(r);if(i.length===0)return!1;let a=K({config:e,roots:i.map(e=>({uri:e}))});if(!a)return!1;let o=e.sources?.[0]?.path,s=o&&W(o)===W(a)?`configured-source`:`stable-sorted-root`;return t.debug(`MCP roots resolved`,{rootPath:a,rootCount:i.length,selectedBy:s}),n(e,a),e.allRoots=i,!0}async function J({config:e,indexMode:t,log:n,rootsChangedNotificationSchema:r,reconfigureForWorkspace:i,runInitialIndex:a,server:o,startInit:s,timeoutMs:c=5e3,getCwd:l=()=>process.cwd()}){let u=L(),d=!1,p=!1,m,h=o.server,g=e=>{let t=f(e),n=`${String(e)} ${String(t.message??``)}`.toLowerCase();return n.includes(`method not found`)||n.includes(`not supported`)||n.includes(`unsupported`)||n.includes(`unknown method`)||n.includes(`roots/list`)},_=()=>{d||(d=!0,s())},v=()=>{p||t!==`auto`||(p=!0,(async()=>{try{await a()}catch(e){n.error(`Initial index failed`,z(u,e))}})())},y=t=>t.length===0||(m&&=(clearTimeout(m),void 0),!q({config:e,log:n,reconfigureForWorkspace:i,roots:t}))?!1:(_(),v(),!0);try{if(y((await h.listRoots()).roots))return;n.debug(`No MCP roots yet; waiting for roots/list_changed notification`)}catch(e){if(g(e)){n.warn(`MCP roots/list not supported by client; using cwd fallback`,{version:u,cwd:l(),...f(e)}),_(),v();return}n.warn(`MCP roots/list failed during bootstrap; waiting for roots/list_changed notification`,{version:u,cwd:l(),...f(e)})}h.setNotificationHandler(r,async()=>{try{y((await h.listRoots()).roots)}catch(e){n.warn(`roots/list retry failed after notification`,z(u,e))}}),m=setTimeout(()=>{let t=l();n.debug(`Timed out waiting for MCP roots/list_changed; falling back to cwd workspace`,{cwd:t}),q({config:e,log:n,reconfigureForWorkspace:i,roots:[{uri:t}]})&&(_(),v())},c)}function Y(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function X(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===c(e).href}catch{return!1}}function Z(e){let t=e.headers[`mcp-session-id`];return Array.isArray(t)?t[0]:t}function Q(e,t){let n=process.env[e];if(!n)return t;let r=Number.parseInt(n,10);return Number.isFinite(r)&&r>0?r:t}function $(){return X()?l({allowPositionals:!0,options:{transport:{type:`string`,default:Y()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:Y(),port:process.env.AIKIT_PORT??`3210`}}async function ee(){let e=L(),n=$();process.on(`unhandledRejection`,t=>{R.error(`Unhandled rejection`,z(e,t))}),process.on(`uncaughtException`,t=>{R.error(`Uncaught exception — exiting`,z(e,t)),process.exit(1)});let r=(t,n)=>{t.then(async()=>{try{let{markPromoteRun:e,markPruneRun:t,prune:r,shouldRunStartupPrune:i,shouldRunWeeklyPromote:a}=await import(`../../tools/dist/index.js`),o=n();if(!o)return;if(i()){let e=await r({});t(),e.totalBytesFreed>0&&R.info(`Storage maintenance complete`,{forgeOrphans:e.forgeGroundOrphans.count,legacyLance:e.legacyLance.count,bytesFreed:e.totalBytesFreed});let{groupLessons:n,pruneLessons:i}=await import(`./evolution-DWaEE6XW.js`).then(e=>e.t),a=await i(o.curated,o.stateStore,{dryRun:!1});a.pruned.length>0&&R.info(`Startup lesson prune complete`,{pruned:a.pruned.length});let s=await n(o.curated,o.stateStore,{dryRun:!1});(s.groupsCreated>0||s.lessonsGrouped>0)&&R.info(`Startup lesson grouping complete`,{groupsCreated:s.groupsCreated,lessonsGrouped:s.lessonsGrouped})}if(a()){let{DEFAULT_PROMOTE_CONFIG:t,collectWorkspaceLessons:n,getGlobalCuratedDir:r,promoteLessons:i,scanForDuplicates:a}=await import(`./promotion-CJFYv4Ye.js`).then(e=>e.o),s=o.curated,c=new k(r(),s.store,s.embedder),l=await n(),u={...t,dryRun:!1},d=await i(a(l,u),c,u);e(),d.promoted.length>0&&R.info(`Weekly lesson promotion complete`,{promoted:d.promoted.length,candidates:d.candidates.length})}}catch(t){R.warn(`Startup maintenance failed (non-critical)`,z(e,t))}}).catch(()=>{})};if(R.info(`Starting MCP AI Kit server`,{version:e}),n.transport===`http`){let[{default:i},{loadConfig:a,resolveIndexMode:o},{registerDashboardRoutes:s,resolveDashboardDir:c},{registerSettingsRoutes:l,resolveSettingsDir:u},{createSettingsRouter:d},{authMiddleware:m,getOrCreateToken:h}]=await Promise.all([import(`express`),import(`./config-DZ-6Zy94.js`),import(`./dashboard-static-CRfR1yKU.js`),import(`./settings-static-B3lnYvcb.js`),import(`./routes-KC-D2U8n.js`),import(`./auth-lzZKfxlV.js`)]),g=a();p(g.logging?.errorDetails===!0),R.info(`Config loaded`,{sourceCount:g.sources.length,storePath:g.store.path});let _=i();_.use(i.json({limit:`1mb`}));let v=Number(n.port),y=`http://localhost:${v}`,b=process.env.AIKIT_CORS_ORIGIN??y,x=process.env.AIKIT_ALLOW_ANY_ORIGIN===`true`,S=Q(`AIKIT_HTTP_MAX_SESSIONS`,8),C=Q(`AIKIT_HTTP_SESSION_TIMEOUT_MINUTES`,30),w=Q(`AIKIT_HTTP_SESSION_GC_INTERVAL_MINUTES`,5),T=H({limit:100,windowMs:6e4}),E=!1;_.use((e,t,n)=>{let r=Array.isArray(e.headers.origin)?e.headers.origin[0]:e.headers.origin,i=V({requestOrigin:r,configuredOrigin:b,allowAnyOrigin:x,fallbackOrigin:y});if(i.warn&&!E&&(E=!0,R.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 D=h();console.error(`[aikit] Auth token: ~/.aikit/token`),_.use(m(D)),_.use(`/mcp`,(e,t,n)=>{let r=Z(e)??e.ip??e.socket.remoteAddress??`anonymous`;if(T.allow(r)){n();return}let i=Math.max(1,Math.ceil(T.getRetryAfterMs(r)/1e3));t.setHeader(`Retry-After`,String(i)),t.status(429).json({jsonrpc:`2.0`,error:{code:-32003,message:`Rate limit exceeded`},id:null})}),s(_,c(),R);let O=new Date().toISOString();_.use(`/settings/api`,d({log:R,mcpInfo:()=>({transport:`http`,port:v,pid:process.pid,startedAt:O})})),l(_,u(),R),_.get(`/health`,(e,t)=>{t.json({status:`ok`})});let k=!1,A=null,j=null,M=null,N=null,F=null,L=null,B=null,U=Promise.resolve(),W=async(e,n)=>{if(!k||!M||!N){n.status(503).json({jsonrpc:`2.0`,error:{code:-32603,message:`Server initializing — please retry in a few seconds`},id:null});return}let r=U,i;U=new Promise(e=>{i=e}),await r;try{let r=Z(e);if(!L){if(r){n.status(404).json({jsonrpc:`2.0`,error:{code:-32001,message:`Session not found`},id:null});return}let e=new N({sessionIdGenerator:()=>t(),onsessioninitialized:async e=>{B=e,j?.onSessionStart(e,{transport:`http`})},onsessionclosed:async e=>{e&&j?.onSessionEnd(e),B=null}});e.onclose=()=>{L===e&&(L=null),B===e.sessionId&&(B=null)},L=e,await M.connect(e)}let i=L;await i.handleRequest(e,n,e.body),e.method!==`DELETE`&&(!r&&i.sessionId?(B=i.sessionId,j?.onSessionStart(i.sessionId,{transport:`http`}),j?.onSessionActivity(i.sessionId)):r&&j?.onSessionActivity(r))}catch(e){if(R.error(`MCP handler error`,f(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()}},G=async(e,t)=>{let n=Z(e);if(F&&(!L||n!==B)){await F.handleRequest(e,t,e.body);return}await W(e,t)};_.post(`/mcp`,G),_.get(`/mcp`,G),_.delete(`/mcp`,G);let K=_.listen(v,`127.0.0.1`,()=>{R.info(`MCP server listening`,{url:`http://127.0.0.1:${v}/mcp`,port:v}),setTimeout(async()=>{try{let[{createLazyServer:t,createMcpServer:n,ALL_TOOL_NAMES:i},{StreamableHTTPServerTransport:a},{checkForUpdates:s,autoUpgradeScaffold:c}]=await Promise.all([import(`./server-CuHLSa6U.js`),import(`@modelcontextprotocol/sdk/server/streamableHttp.js`),import(`./version-check-CgfflkJX.js`)]);s(),c();let l=o(g),u=t(g,l);M=u.server,N=a,k=!0,R.debug(`MCP server configured (lazy — AI Kit initializing in background)`,{toolCount:i.length,resourceCount:2}),u.startInit(),u.ready.then(()=>{if(!u.aikit)throw Error(`AI Kit components are not available after initialization`);j=new I(u.aikit.stateStore,{staleTimeoutMinutes:C,gcIntervalMinutes:w,onBeforeSessionDelete:e=>{if(B===e&&L){let e=L;L=null,B=null,e.close().catch(()=>void 0)}F?.closeSession(e,{notifySessionEnd:!1})},onSessionEndMaintenance:async()=>{if(!u.aikit?.curated||!u.aikit?.stateStore)return;let{pruneLessons:e}=await import(`./evolution-DWaEE6XW.js`).then(e=>e.t),t=await e(u.aikit.curated,u.aikit.stateStore,{dryRun:!1});t.pruned.length>0&&R.info(`Session-end lesson prune`,{pruned:t.pruned.length})}}),F=new P({createServer:()=>{if(!u.aikit)throw Error(`AI Kit components are not available after initialization`);return n(u.aikit,g)},createTransport:e=>new a(e),maxSessions:S,sessionTimeoutMinutes:C,onSessionStart:e=>j?.onSessionStart(e,{transport:`http`}),onSessionActivity:e=>j?.onSessionActivity(e),onSessionEnd:e=>j?.onSessionEnd(e)}),j.startGC(),B&&(j.onSessionStart(B,{transport:`http`}),j.onSessionActivity(B)),R.info(`HTTP session runtime ready`,{maxSessions:S,sessionTimeoutMinutes:C,gcIntervalMinutes:w})}).catch(e=>R.error(`Failed to start session manager`,f(e))),l===`auto`?u.ready.then(async()=>{try{let e=g.sources.map(e=>e.path).join(`, `);R.info(`Running initial index`,{sourcePaths:e}),await u.runInitialIndex(),R.info(`Initial index complete`)}catch(t){R.error(`Initial index failed; will retry on aikit_reindex`,z(e,t))}}).catch(t=>R.error(`AI Kit init or indexing failed`,z(e,t))):l===`smart`?u.ready.then(async()=>{try{if(!u.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(u.aikit.indexer,g,u.aikit.store),n=u.aikit.store;A=t,t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),u.setSmartScheduler(t),R.debug(`Smart index scheduler started (HTTP mode)`)}catch(t){R.error(`Failed to start smart index scheduler`,z(e,t))}}).catch(t=>R.error(`AI Kit initialization failed`,z(e,t))):(u.ready.catch(t=>R.error(`AI Kit initialization failed`,z(e,t))),R.info(`Initial full indexing skipped in HTTP mode`,{indexMode:l})),r(u.ready,()=>u.aikit?{curated:u.aikit.curated,stateStore:u.aikit.stateStore}:null)}catch(t){R.error(`Failed to load server modules`,z(e,t))}},100)}),q=async e=>{R.info(`Shutdown signal received`,{signal:e}),A?.stop(),j?.stop(),await F?.closeAll().catch(()=>void 0),B&&j?.onSessionEnd(B),L&&(await L.close().catch(()=>void 0),L=null,B=null),K.close(),M&&await M.close(),process.exit(0)};process.on(`SIGINT`,()=>q(`SIGINT`)),process.on(`SIGTERM`,()=>q(`SIGTERM`))}else{let[{loadConfig:t,reconfigureForWorkspace:n,resolveIndexMode:i},{createLazyServer:a},{checkForUpdates:o,autoUpgradeScaffold:s},{RootsListChangedNotificationSchema:c}]=await Promise.all([import(`./config-DZ-6Zy94.js`),import(`./server-CuHLSa6U.js`),import(`./version-check-CgfflkJX.js`),import(`@modelcontextprotocol/sdk/types.js`)]),l=t();p(l.logging?.errorDetails===!0),R.info(`Config loaded`,{sourceCount:l.sources.length,storePath:l.store.path}),o(),s();let u=i(l),d=a(l,u),{server:f,startInit:m,ready:h,runInitialIndex:g}=d,{StdioServerTransport:_}=await import(`@modelcontextprotocol/sdk/server/stdio.js`),v=new _;await f.connect(v),R.debug(`MCP server started`,{transport:`stdio`}),await J({config:l,indexMode:u,log:R,rootsChangedNotificationSchema:c,reconfigureForWorkspace:n,runInitialIndex:g,server:f,startInit:m});let y=null,b=()=>{y&&clearTimeout(y),y=setTimeout(async()=>{R.info(`Auto-shutdown: no activity for 30 minutes — releasing resources`);try{let e=d.aikit;e&&(e.embedder.shutdown?.().catch(()=>{}),e.store.releaseMemory?.(),e.graphStore.releaseMemory?.())}catch{}},18e5),y.unref&&y.unref()};b(),process.stdin.on(`data`,()=>b()),h.catch(t=>{R.error(`Initialization failed — server will continue with limited tools`,z(e,t))}),u===`smart`?h.then(async()=>{try{if(!d.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(d.aikit.indexer,l,d.aikit.store),n=d.aikit.store;t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),d.setSmartScheduler(t),R.debug(`Smart index scheduler started (stdio mode)`)}catch(t){R.error(`Failed to start smart index scheduler`,z(e,t))}}).catch(t=>R.error(`AI Kit init failed for smart scheduler`,z(e,t))):R.warn(`Initial full indexing skipped; use aikit_reindex to index manually`,{indexMode:u}),r(h,()=>d.aikit?{curated:d.aikit.curated,stateStore:d.aikit.stateStore}:null)}}ee();export{T as n,k 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 A=`__pending__:`;function j(e){return e.startsWith(A)}function M(e){let t=e.headers[`mcp-session-id`];return Array.isArray(t)?t[0]:t}function N(e,t,n,r){e.status(t).json({jsonrpc:`2.0`,error:{code:n,message:r},id:null})}var P=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=M(e),i=r?this.runtimes.get(r):void 0;if(r&&!i){N(t,404,-32001,`Session not found`);return}if(!i){if(e.method!==`POST`){N(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`&&!j(r)&&this.options.onSessionActivity?.(r),e.method===`DELETE`&&!j(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&&!j(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){N(e,503,-32003,`Session capacity reached`);return}let n=this.now(),r=await this.options.createServer(),i={id:`${A}${t()}`,transport:void 0,createdAt:n,lastAccessAt:n,server:r,requestChain:Promise.resolve()},a=this.options.createTransport({sessionIdGenerator:()=>t(),onsessioninitialized:async e=>{this.runtimes.delete(i.id),i.id=e,this.runtimes.set(e,i),this.options.onSessionStart?.(e)},onsessionclosed:async e=>{e&&await this.closeSession(e,{closeTransport:!1})}});return i.transport=a,a.onclose=()=>{let e=i.transport.sessionId??i.id;this.closeSession(e,{closeTransport:!1})},this.runtimes.set(i.id,i),await r.connect(a),i}async withRuntimeLock(e,t){let n=e.requestChain,r;e.requestChain=new Promise(e=>{r=e}),await n;try{await t()}finally{r()}}};function F(e){let t=e.includes(`T`)?e:`${e.replace(` `,`T`)}Z`;return Date.parse(t)}var I=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=F(n.lastActivity);return Number.isFinite(r)&&e-r>=t}).map(e=>e.sessionId)}};function L(){try{let e=o(r(s(import.meta.url)),`..`,`..`,`..`,`package.json`);return JSON.parse(n(e,`utf-8`)).version??`0.0.0`}catch{return`0.0.0`}}const R=d(`server`);function z(e,t){return t?{version:e,...f(t)}:{version:e}}const B=/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/i;function V({requestOrigin:e,configuredOrigin:t,allowAnyOrigin:n,fallbackOrigin:r}){let i=t??r;return i===`*`?n?{allowOrigin:`*`,warn:!1}:e?B.test(e)?{allowOrigin:e,warn:!1}:{allowOrigin:null,warn:!0}:{allowOrigin:r,warn:!1}:{allowOrigin:i,warn:!1}}function H({limit:e,windowMs:t}){let n=new Map,r=(e,r)=>{let i=r-t,a=n.get(e)?.filter(e=>e>i)??[];return a.length===0?(n.delete(e),[]):(n.set(e,a),a)};return{allow(t,i=Date.now()){let a=r(t,i);return a.length>=e?!1:(a.push(i),n.set(t,a),!0)},getRetryAfterMs(n,i=Date.now()){let a=r(n,i);return a.length<e?0:Math.max(0,a[0]+t-i)}}}function U(e){return e.startsWith(`file://`)?s(e):e}function W(e){let t=o(e);return process.platform===`win32`?t.toLowerCase():t}function G(e){let t=new Map;for(let n of e){let e=U(n.uri);t.set(W(e),e)}return[...t.values()].sort((e,t)=>W(e).localeCompare(W(t)))}function K({config:e,roots:t}){let n=G(t);if(n.length===0)return null;let r=e.sources?.[0]?.path;if(r){let e=W(r),t=n.find(t=>W(t)===e);if(t)return t}return n[0]}function q({config:e,log:t,reconfigureForWorkspace:n,roots:r}){let i=G(r);if(i.length===0)return!1;let a=K({config:e,roots:i.map(e=>({uri:e}))});if(!a)return!1;let o=e.sources?.[0]?.path,s=o&&W(o)===W(a)?`configured-source`:`stable-sorted-root`;return t.debug(`MCP roots resolved`,{rootPath:a,rootCount:i.length,selectedBy:s}),n(e,a),e.allRoots=i,!0}async function J({config:e,indexMode:t,log:n,rootsChangedNotificationSchema:r,reconfigureForWorkspace:i,runInitialIndex:a,server:o,startInit:s,timeoutMs:c=5e3,getCwd:l=()=>process.cwd()}){let u=L(),d=!1,p=!1,m,h=o.server,g=e=>{let t=f(e),n=`${String(e)} ${String(t.message??``)}`.toLowerCase();return n.includes(`method not found`)||n.includes(`not supported`)||n.includes(`unsupported`)||n.includes(`unknown method`)||n.includes(`roots/list`)},_=()=>{d||(d=!0,s())},v=()=>{p||t!==`auto`||(p=!0,(async()=>{try{await a()}catch(e){n.error(`Initial index failed`,z(u,e))}})())},y=t=>t.length===0||(m&&=(clearTimeout(m),void 0),!q({config:e,log:n,reconfigureForWorkspace:i,roots:t}))?!1:(_(),v(),!0);try{if(y((await h.listRoots()).roots))return;n.debug(`No MCP roots yet; waiting for roots/list_changed notification`)}catch(e){if(g(e)){n.warn(`MCP roots/list not supported by client; using cwd fallback`,{version:u,cwd:l(),...f(e)}),_(),v();return}n.warn(`MCP roots/list failed during bootstrap; waiting for roots/list_changed notification`,{version:u,cwd:l(),...f(e)})}h.setNotificationHandler(r,async()=>{try{y((await h.listRoots()).roots)}catch(e){n.warn(`roots/list retry failed after notification`,z(u,e))}}),m=setTimeout(()=>{let t=l();n.debug(`Timed out waiting for MCP roots/list_changed; falling back to cwd workspace`,{cwd:t}),q({config:e,log:n,reconfigureForWorkspace:i,roots:[{uri:t}]})&&(_(),v())},c)}function Y(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function X(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===c(e).href}catch{return!1}}function Z(e){let t=e.headers[`mcp-session-id`];return Array.isArray(t)?t[0]:t}function Q(e,t){let n=process.env[e];if(!n)return t;let r=Number.parseInt(n,10);return Number.isFinite(r)&&r>0?r:t}function $(){return X()?l({allowPositionals:!0,options:{transport:{type:`string`,default:Y()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:Y(),port:process.env.AIKIT_PORT??`3210`}}async function ee(){let e=L(),n=$();process.on(`unhandledRejection`,t=>{R.error(`Unhandled rejection`,z(e,t))}),process.on(`uncaughtException`,t=>{R.error(`Uncaught exception — exiting`,z(e,t)),process.exit(1)});let r=(t,n)=>{t.then(async()=>{try{let{markPromoteRun:e,markPruneRun:t,prune:r,shouldRunStartupPrune:i,shouldRunWeeklyPromote:a}=await import(`../../tools/dist/index.js`),o=n();if(!o)return;if(i()){let e=await r({});t(),e.totalBytesFreed>0&&R.info(`Storage maintenance complete`,{forgeOrphans:e.forgeGroundOrphans.count,legacyLance:e.legacyLance.count,bytesFreed:e.totalBytesFreed});let{groupLessons:n,pruneLessons:i}=await import(`./evolution-DWaEE6XW.js`).then(e=>e.t),a=await i(o.curated,o.stateStore,{dryRun:!1});a.pruned.length>0&&R.info(`Startup lesson prune complete`,{pruned:a.pruned.length});let s=await n(o.curated,o.stateStore,{dryRun:!1});(s.groupsCreated>0||s.lessonsGrouped>0)&&R.info(`Startup lesson grouping complete`,{groupsCreated:s.groupsCreated,lessonsGrouped:s.lessonsGrouped})}if(a()){let{DEFAULT_PROMOTE_CONFIG:t,collectWorkspaceLessons:n,getGlobalCuratedDir:r,promoteLessons:i,scanForDuplicates:a}=await import(`./promotion-CJFYv4Ye.js`).then(e=>e.o),s=o.curated,c=new k(r(),s.store,s.embedder),l=await n(),u={...t,dryRun:!1},d=await i(a(l,u),c,u);e(),d.promoted.length>0&&R.info(`Weekly lesson promotion complete`,{promoted:d.promoted.length,candidates:d.candidates.length})}}catch(t){R.warn(`Startup maintenance failed (non-critical)`,z(e,t))}}).catch(()=>{})};if(R.info(`Starting MCP AI Kit server`,{version:e}),n.transport===`http`){let[{default:i},{loadConfig:a,resolveIndexMode:o},{registerDashboardRoutes:s,resolveDashboardDir:c},{registerSettingsRoutes:l,resolveSettingsDir:u},{createSettingsRouter:d},{authMiddleware:m,getOrCreateToken:h}]=await Promise.all([import(`express`),import(`./config-DZ-6Zy94.js`),import(`./dashboard-static-CRfR1yKU.js`),import(`./settings-static-B3lnYvcb.js`),import(`./routes-KC-D2U8n.js`),import(`./auth-lzZKfxlV.js`)]),g=a();p(g.logging?.errorDetails===!0),R.info(`Config loaded`,{sourceCount:g.sources.length,storePath:g.store.path});let _=i();_.use(i.json({limit:`1mb`}));let v=Number(n.port),y=`http://localhost:${v}`,b=process.env.AIKIT_CORS_ORIGIN??y,x=process.env.AIKIT_ALLOW_ANY_ORIGIN===`true`,S=Q(`AIKIT_HTTP_MAX_SESSIONS`,8),C=Q(`AIKIT_HTTP_SESSION_TIMEOUT_MINUTES`,30),w=Q(`AIKIT_HTTP_SESSION_GC_INTERVAL_MINUTES`,5),T=H({limit:100,windowMs:6e4}),E=!1;_.use((e,t,n)=>{let r=Array.isArray(e.headers.origin)?e.headers.origin[0]:e.headers.origin,i=V({requestOrigin:r,configuredOrigin:b,allowAnyOrigin:x,fallbackOrigin:y});if(i.warn&&!E&&(E=!0,R.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 D=h();console.error(`[aikit] Auth token: ~/.aikit/token`),_.use(m(D)),_.use(`/mcp`,(e,t,n)=>{let r=Z(e)??e.ip??e.socket.remoteAddress??`anonymous`;if(T.allow(r)){n();return}let i=Math.max(1,Math.ceil(T.getRetryAfterMs(r)/1e3));t.setHeader(`Retry-After`,String(i)),t.status(429).json({jsonrpc:`2.0`,error:{code:-32003,message:`Rate limit exceeded`},id:null})}),s(_,c(),R);let O=new Date().toISOString();_.use(`/settings/api`,d({log:R,mcpInfo:()=>({transport:`http`,port:v,pid:process.pid,startedAt:O})})),l(_,u(),R),_.get(`/health`,(e,t)=>{t.json({status:`ok`})});let k=!1,A=null,j=null,M=null,N=null,F=null,L=null,B=null,U=Promise.resolve(),W=async(e,n)=>{if(!k||!M||!N){n.status(503).json({jsonrpc:`2.0`,error:{code:-32603,message:`Server initializing — please retry in a few seconds`},id:null});return}let r=U,i;U=new Promise(e=>{i=e}),await r;try{let r=Z(e);if(!L){if(r){n.status(404).json({jsonrpc:`2.0`,error:{code:-32001,message:`Session not found`},id:null});return}let e=new N({sessionIdGenerator:()=>t(),onsessioninitialized:async e=>{B=e,j?.onSessionStart(e,{transport:`http`})},onsessionclosed:async e=>{e&&j?.onSessionEnd(e),B=null}});e.onclose=()=>{L===e&&(L=null),B===e.sessionId&&(B=null)},L=e,await M.connect(e)}let i=L;await i.handleRequest(e,n,e.body),e.method!==`DELETE`&&(!r&&i.sessionId?(B=i.sessionId,j?.onSessionStart(i.sessionId,{transport:`http`}),j?.onSessionActivity(i.sessionId)):r&&j?.onSessionActivity(r))}catch(e){if(R.error(`MCP handler error`,f(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()}},G=async(e,t)=>{let n=Z(e);if(F&&(!L||n!==B)){await F.handleRequest(e,t,e.body);return}await W(e,t)};_.post(`/mcp`,G),_.get(`/mcp`,G),_.delete(`/mcp`,G);let K=_.listen(v,`127.0.0.1`,()=>{R.info(`MCP server listening`,{url:`http://127.0.0.1:${v}/mcp`,port:v}),setTimeout(async()=>{try{let[{createLazyServer:t,createMcpServer:n,ALL_TOOL_NAMES:i},{StreamableHTTPServerTransport:a},{checkForUpdates:s,autoUpgradeScaffold:c}]=await Promise.all([import(`./server-GTvNc3rR.js`),import(`@modelcontextprotocol/sdk/server/streamableHttp.js`),import(`./version-check-BhvsN1fC.js`)]);s(),c(),setInterval(s,1440*60*1e3).unref();let l=o(g),u=t(g,l);M=u.server,N=a,k=!0,R.debug(`MCP server configured (lazy — AI Kit initializing in background)`,{toolCount:i.length,resourceCount:2}),u.startInit(),u.ready.then(()=>{if(!u.aikit)throw Error(`AI Kit components are not available after initialization`);j=new I(u.aikit.stateStore,{staleTimeoutMinutes:C,gcIntervalMinutes:w,onBeforeSessionDelete:e=>{if(B===e&&L){let e=L;L=null,B=null,e.close().catch(()=>void 0)}F?.closeSession(e,{notifySessionEnd:!1})},onSessionEndMaintenance:async()=>{if(!u.aikit?.curated||!u.aikit?.stateStore)return;let{pruneLessons:e}=await import(`./evolution-DWaEE6XW.js`).then(e=>e.t),t=await e(u.aikit.curated,u.aikit.stateStore,{dryRun:!1});t.pruned.length>0&&R.info(`Session-end lesson prune`,{pruned:t.pruned.length})}}),F=new P({createServer:()=>{if(!u.aikit)throw Error(`AI Kit components are not available after initialization`);return n(u.aikit,g)},createTransport:e=>new a(e),maxSessions:S,sessionTimeoutMinutes:C,onSessionStart:e=>j?.onSessionStart(e,{transport:`http`}),onSessionActivity:e=>j?.onSessionActivity(e),onSessionEnd:e=>j?.onSessionEnd(e)}),j.startGC(),B&&(j.onSessionStart(B,{transport:`http`}),j.onSessionActivity(B)),R.info(`HTTP session runtime ready`,{maxSessions:S,sessionTimeoutMinutes:C,gcIntervalMinutes:w})}).catch(e=>R.error(`Failed to start session manager`,f(e))),l===`auto`?u.ready.then(async()=>{try{let e=g.sources.map(e=>e.path).join(`, `);R.info(`Running initial index`,{sourcePaths:e}),await u.runInitialIndex(),R.info(`Initial index complete`)}catch(t){R.error(`Initial index failed; will retry on aikit_reindex`,z(e,t))}}).catch(t=>R.error(`AI Kit init or indexing failed`,z(e,t))):l===`smart`?u.ready.then(async()=>{try{if(!u.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(u.aikit.indexer,g,u.aikit.store),n=u.aikit.store;A=t,t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),u.setSmartScheduler(t),R.debug(`Smart index scheduler started (HTTP mode)`)}catch(t){R.error(`Failed to start smart index scheduler`,z(e,t))}}).catch(t=>R.error(`AI Kit initialization failed`,z(e,t))):(u.ready.catch(t=>R.error(`AI Kit initialization failed`,z(e,t))),R.info(`Initial full indexing skipped in HTTP mode`,{indexMode:l})),r(u.ready,()=>u.aikit?{curated:u.aikit.curated,stateStore:u.aikit.stateStore}:null)}catch(t){R.error(`Failed to load server modules`,z(e,t))}},100)}),q=async e=>{R.info(`Shutdown signal received`,{signal:e}),A?.stop(),j?.stop(),await F?.closeAll().catch(()=>void 0),B&&j?.onSessionEnd(B),L&&(await L.close().catch(()=>void 0),L=null,B=null),K.close(),M&&await M.close(),process.exit(0)};process.on(`SIGINT`,()=>q(`SIGINT`)),process.on(`SIGTERM`,()=>q(`SIGTERM`))}else{let[{loadConfig:t,reconfigureForWorkspace:n,resolveIndexMode:i},{createLazyServer:a},{checkForUpdates:o,autoUpgradeScaffold:s},{RootsListChangedNotificationSchema:c}]=await Promise.all([import(`./config-DZ-6Zy94.js`),import(`./server-GTvNc3rR.js`),import(`./version-check-BhvsN1fC.js`),import(`@modelcontextprotocol/sdk/types.js`)]),l=t();p(l.logging?.errorDetails===!0),R.info(`Config loaded`,{sourceCount:l.sources.length,storePath:l.store.path}),o(),s(),setInterval(o,1440*60*1e3).unref();let u=i(l),d=a(l,u),{server:f,startInit:m,ready:h,runInitialIndex:g}=d,{StdioServerTransport:_}=await import(`@modelcontextprotocol/sdk/server/stdio.js`),v=new _;await f.connect(v),R.debug(`MCP server started`,{transport:`stdio`}),await J({config:l,indexMode:u,log:R,rootsChangedNotificationSchema:c,reconfigureForWorkspace:n,runInitialIndex:g,server:f,startInit:m});let y=null,b=()=>{y&&clearTimeout(y),y=setTimeout(async()=>{R.info(`Auto-shutdown: no activity for 30 minutes — releasing resources`);try{let e=d.aikit;e&&(e.embedder.shutdown?.().catch(()=>{}),e.store.releaseMemory?.(),e.graphStore.releaseMemory?.())}catch{}},18e5),y.unref&&y.unref()};b(),process.stdin.on(`data`,()=>b()),h.catch(t=>{R.error(`Initialization failed — server will continue with limited tools`,z(e,t))}),u===`smart`?h.then(async()=>{try{if(!d.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(d.aikit.indexer,l,d.aikit.store),n=d.aikit.store;t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),d.setSmartScheduler(t),R.debug(`Smart index scheduler started (stdio mode)`)}catch(t){R.error(`Failed to start smart index scheduler`,z(e,t))}}).catch(t=>R.error(`AI Kit init failed for smart scheduler`,z(e,t))):R.warn(`Initial full indexing skipped; use aikit_reindex to index manually`,{indexMode:u}),r(h,()=>d.aikit?{curated:d.aikit.curated,stateStore:d.aikit.stateStore}:null)}}ee();export{T as n,k as t};
@@ -1 +1 @@
1
- import{t as e}from"./curated-manager-C5uOPept.js";import{randomUUID as t}from"node:crypto";import{readFileSync as n}from"node:fs";import{dirname as r,resolve as i}from"node:path";import{fileURLToPath as a,pathToFileURL as o}from"node:url";import{parseArgs as s}from"node:util";import{createLogger as c,serializeError as l,setDetailedErrorLoggingEnabled as u}from"../../core/dist/index.js";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 n=this.now(),r=await this.options.createServer(),i={id:`${d}${t()}`,transport:void 0,createdAt:n,lastAccessAt:n,server:r,requestChain:Promise.resolve()},a=this.options.createTransport({sessionIdGenerator:()=>t(),onsessioninitialized:async e=>{this.runtimes.delete(i.id),i.id=e,this.runtimes.set(e,i),this.options.onSessionStart?.(e)},onsessionclosed:async e=>{e&&await this.closeSession(e,{closeTransport:!1})}});return i.transport=a,a.onclose=()=>{let e=i.transport.sessionId??i.id;this.closeSession(e,{closeTransport:!1})},this.runtimes.set(i.id,i),await r.connect(a),i}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)}};function v(){try{let e=i(r(a(import.meta.url)),`..`,`..`,`..`,`package.json`);return JSON.parse(n(e,`utf-8`)).version??`0.0.0`}catch{return`0.0.0`}}const y=c(`server`);function b(e,t){return t?{version:e,...l(t)}:{version:e}}const x=/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/i;function S({requestOrigin:e,configuredOrigin:t,allowAnyOrigin:n,fallbackOrigin:r}){let i=t??r;return i===`*`?n?{allowOrigin:`*`,warn:!1}:e?x.test(e)?{allowOrigin:e,warn:!1}:{allowOrigin:null,warn:!0}:{allowOrigin:r,warn:!1}:{allowOrigin:i,warn:!1}}function C({limit:e,windowMs:t}){let n=new Map,r=(e,r)=>{let i=r-t,a=n.get(e)?.filter(e=>e>i)??[];return a.length===0?(n.delete(e),[]):(n.set(e,a),a)};return{allow(t,i=Date.now()){let a=r(t,i);return a.length>=e?!1:(a.push(i),n.set(t,a),!0)},getRetryAfterMs(n,i=Date.now()){let a=r(n,i);return a.length<e?0:Math.max(0,a[0]+t-i)}}}function w(e){return e.startsWith(`file://`)?a(e):e}function T(e){let t=i(e);return process.platform===`win32`?t.toLowerCase():t}function E(e){let t=new Map;for(let n of e){let e=w(n.uri);t.set(T(e),e)}return[...t.values()].sort((e,t)=>T(e).localeCompare(T(t)))}function D({config:e,roots:t}){let n=E(t);if(n.length===0)return null;let r=e.sources?.[0]?.path;if(r){let e=T(r),t=n.find(t=>T(t)===e);if(t)return t}return n[0]}function O({config:e,log:t,reconfigureForWorkspace:n,roots:r}){let i=E(r);if(i.length===0)return!1;let a=D({config:e,roots:i.map(e=>({uri:e}))});if(!a)return!1;let o=e.sources?.[0]?.path,s=o&&T(o)===T(a)?`configured-source`:`stable-sorted-root`;return t.debug(`MCP roots resolved`,{rootPath:a,rootCount:i.length,selectedBy:s}),n(e,a),e.allRoots=i,!0}async function k({config:e,indexMode:t,log:n,rootsChangedNotificationSchema:r,reconfigureForWorkspace:i,runInitialIndex:a,server:o,startInit:s,timeoutMs:c=5e3,getCwd:u=()=>process.cwd()}){let d=v(),f=!1,p=!1,m,h=o.server,g=e=>{let t=l(e),n=`${String(e)} ${String(t.message??``)}`.toLowerCase();return n.includes(`method not found`)||n.includes(`not supported`)||n.includes(`unsupported`)||n.includes(`unknown method`)||n.includes(`roots/list`)},_=()=>{f||(f=!0,s())},y=()=>{p||t!==`auto`||(p=!0,(async()=>{try{await a()}catch(e){n.error(`Initial index failed`,b(d,e))}})())},x=t=>t.length===0||(m&&=(clearTimeout(m),void 0),!O({config:e,log:n,reconfigureForWorkspace:i,roots:t}))?!1:(_(),y(),!0);try{if(x((await h.listRoots()).roots))return;n.debug(`No MCP roots yet; waiting for roots/list_changed notification`)}catch(e){if(g(e)){n.warn(`MCP roots/list not supported by client; using cwd fallback`,{version:d,cwd:u(),...l(e)}),_(),y();return}n.warn(`MCP roots/list failed during bootstrap; waiting for roots/list_changed notification`,{version:d,cwd:u(),...l(e)})}h.setNotificationHandler(r,async()=>{try{x((await h.listRoots()).roots)}catch(e){n.warn(`roots/list retry failed after notification`,b(d,e))}}),m=setTimeout(()=>{let t=u();n.debug(`Timed out waiting for MCP roots/list_changed; falling back to cwd workspace`,{cwd:t}),O({config:e,log:n,reconfigureForWorkspace:i,roots:[{uri:t}]})&&(_(),y())},c)}function A(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function j(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===o(e).href}catch{return!1}}function M(e){let t=e.headers[`mcp-session-id`];return Array.isArray(t)?t[0]:t}function N(e,t){let n=process.env[e];if(!n)return t;let r=Number.parseInt(n,10);return Number.isFinite(r)&&r>0?r:t}function P(){return j()?s({allowPositionals:!0,options:{transport:{type:`string`,default:A()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:A(),port:process.env.AIKIT_PORT??`3210`}}async function F(){let n=v(),r=P();process.on(`unhandledRejection`,e=>{y.error(`Unhandled rejection`,b(n,e))}),process.on(`uncaughtException`,e=>{y.error(`Uncaught exception — exiting`,b(n,e)),process.exit(1)});let i=(t,r)=>{t.then(async()=>{try{let{markPromoteRun:t,markPruneRun:n,prune:i,shouldRunStartupPrune:a,shouldRunWeeklyPromote:o}=await import(`../../tools/dist/index.js`),s=r();if(!s)return;if(a()){let e=await i({});n(),e.totalBytesFreed>0&&y.info(`Storage maintenance complete`,{forgeOrphans:e.forgeGroundOrphans.count,legacyLance:e.legacyLance.count,bytesFreed:e.totalBytesFreed});let{groupLessons:t,pruneLessons:r}=await import(`./evolution-BX_zTSdj.js`).then(e=>e.t),a=await r(s.curated,s.stateStore,{dryRun:!1});a.pruned.length>0&&y.info(`Startup lesson prune complete`,{pruned:a.pruned.length});let o=await t(s.curated,s.stateStore,{dryRun:!1});(o.groupsCreated>0||o.lessonsGrouped>0)&&y.info(`Startup lesson grouping complete`,{groupsCreated:o.groupsCreated,lessonsGrouped:o.lessonsGrouped})}if(o()){let{DEFAULT_PROMOTE_CONFIG:n,collectWorkspaceLessons:r,getGlobalCuratedDir:i,promoteLessons:a,scanForDuplicates:o}=await import(`./promotion-D9anNXv8.js`).then(e=>e.o),c=s.curated,l=new e(i(),c.store,c.embedder),u=await r(),d={...n,dryRun:!1},f=await a(o(u,d),l,d);t(),f.promoted.length>0&&y.info(`Weekly lesson promotion complete`,{promoted:f.promoted.length,candidates:f.candidates.length})}}catch(e){y.warn(`Startup maintenance failed (non-critical)`,b(n,e))}}).catch(()=>{})};if(y.info(`Starting MCP AI Kit server`,{version:n}),r.transport===`http`){let[{default:e},{loadConfig:a,resolveIndexMode:o},{registerDashboardRoutes:s,resolveDashboardDir:c},{registerSettingsRoutes:d,resolveSettingsDir:f},{createSettingsRouter:p},{authMiddleware:m,getOrCreateToken:g}]=await Promise.all([import(`express`),import(`./config-DxWyWSb9.js`),import(`./dashboard-static-FmfoS46e.js`),import(`./settings-static-BtvyIrza.js`),import(`./routes-1wkXLxXe.js`),import(`./auth-Bz5dmZgR.js`).then(e=>e.t)]),v=a();u(v.logging?.errorDetails===!0),y.info(`Config loaded`,{sourceCount:v.sources.length,storePath:v.store.path});let x=e();x.use(e.json({limit:`1mb`}));let w=Number(r.port),T=`http://localhost:${w}`,E=process.env.AIKIT_CORS_ORIGIN??T,D=process.env.AIKIT_ALLOW_ANY_ORIGIN===`true`,O=N(`AIKIT_HTTP_MAX_SESSIONS`,8),k=N(`AIKIT_HTTP_SESSION_TIMEOUT_MINUTES`,30),A=N(`AIKIT_HTTP_SESSION_GC_INTERVAL_MINUTES`,5),j=C({limit:100,windowMs:6e4}),P=!1;x.use((e,t,n)=>{let r=Array.isArray(e.headers.origin)?e.headers.origin[0]:e.headers.origin,i=S({requestOrigin:r,configuredOrigin:E,allowAnyOrigin:D,fallbackOrigin:T});if(i.warn&&!P&&(P=!0,y.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 F=g();console.error(`[aikit] Auth token: ~/.aikit/token`),x.use(m(F)),x.use(`/mcp`,(e,t,n)=>{let r=M(e)??e.ip??e.socket.remoteAddress??`anonymous`;if(j.allow(r)){n();return}let i=Math.max(1,Math.ceil(j.getRetryAfterMs(r)/1e3));t.setHeader(`Retry-After`,String(i)),t.status(429).json({jsonrpc:`2.0`,error:{code:-32003,message:`Rate limit exceeded`},id:null})}),s(x,c(),y);let I=new Date().toISOString();x.use(`/settings/api`,p({log:y,mcpInfo:()=>({transport:`http`,port:w,pid:process.pid,startedAt:I})})),d(x,f(),y),x.get(`/health`,(e,t)=>{t.json({status:`ok`})});let L=!1,R=null,z=null,B=null,V=null,H=null,U=null,W=null,G=Promise.resolve(),K=async(e,n)=>{if(!L||!B||!V){n.status(503).json({jsonrpc:`2.0`,error:{code:-32603,message:`Server initializing — please retry in a few seconds`},id:null});return}let r=G,i;G=new Promise(e=>{i=e}),await r;try{let r=M(e);if(!U){if(r){n.status(404).json({jsonrpc:`2.0`,error:{code:-32001,message:`Session not found`},id:null});return}let e=new V({sessionIdGenerator:()=>t(),onsessioninitialized:async e=>{W=e,z?.onSessionStart(e,{transport:`http`})},onsessionclosed:async e=>{e&&z?.onSessionEnd(e),W=null}});e.onclose=()=>{U===e&&(U=null),W===e.sessionId&&(W=null)},U=e,await B.connect(e)}let i=U;await i.handleRequest(e,n,e.body),e.method!==`DELETE`&&(!r&&i.sessionId?(W=i.sessionId,z?.onSessionStart(i.sessionId,{transport:`http`}),z?.onSessionActivity(i.sessionId)):r&&z?.onSessionActivity(r))}catch(e){if(y.error(`MCP handler error`,l(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()}},q=async(e,t)=>{let n=M(e);if(H&&(!U||n!==W)){await H.handleRequest(e,t,e.body);return}await K(e,t)};x.post(`/mcp`,q),x.get(`/mcp`,q),x.delete(`/mcp`,q);let J=x.listen(w,`127.0.0.1`,()=>{y.info(`MCP server listening`,{url:`http://127.0.0.1:${w}/mcp`,port:w}),setTimeout(async()=>{try{let[{createLazyServer:e,createMcpServer:t,ALL_TOOL_NAMES:r},{StreamableHTTPServerTransport:a},{checkForUpdates:s,autoUpgradeScaffold:c}]=await Promise.all([import(`./server-ChL1FsjF.js`),import(`@modelcontextprotocol/sdk/server/streamableHttp.js`),import(`./version-check-ruLtfyDd.js`)]);s(),c();let u=o(v),d=e(v,u);B=d.server,V=a,L=!0,y.debug(`MCP server configured (lazy — AI Kit initializing in background)`,{toolCount:r.length,resourceCount:2}),d.startInit(),d.ready.then(()=>{if(!d.aikit)throw Error(`AI Kit components are not available after initialization`);z=new _(d.aikit.stateStore,{staleTimeoutMinutes:k,gcIntervalMinutes:A,onBeforeSessionDelete:e=>{if(W===e&&U){let e=U;U=null,W=null,e.close().catch(()=>void 0)}H?.closeSession(e,{notifySessionEnd:!1})},onSessionEndMaintenance:async()=>{if(!d.aikit?.curated||!d.aikit?.stateStore)return;let{pruneLessons:e}=await import(`./evolution-BX_zTSdj.js`).then(e=>e.t),t=await e(d.aikit.curated,d.aikit.stateStore,{dryRun:!1});t.pruned.length>0&&y.info(`Session-end lesson prune`,{pruned:t.pruned.length})}}),H=new h({createServer:()=>{if(!d.aikit)throw Error(`AI Kit components are not available after initialization`);return t(d.aikit,v)},createTransport:e=>new a(e),maxSessions:O,sessionTimeoutMinutes:k,onSessionStart:e=>z?.onSessionStart(e,{transport:`http`}),onSessionActivity:e=>z?.onSessionActivity(e),onSessionEnd:e=>z?.onSessionEnd(e)}),z.startGC(),W&&(z.onSessionStart(W,{transport:`http`}),z.onSessionActivity(W)),y.info(`HTTP session runtime ready`,{maxSessions:O,sessionTimeoutMinutes:k,gcIntervalMinutes:A})}).catch(e=>y.error(`Failed to start session manager`,l(e))),u===`auto`?d.ready.then(async()=>{try{let e=v.sources.map(e=>e.path).join(`, `);y.info(`Running initial index`,{sourcePaths:e}),await d.runInitialIndex(),y.info(`Initial index complete`)}catch(e){y.error(`Initial index failed; will retry on aikit_reindex`,b(n,e))}}).catch(e=>y.error(`AI Kit init or indexing failed`,b(n,e))):u===`smart`?d.ready.then(async()=>{try{if(!d.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(d.aikit.indexer,v,d.aikit.store),n=d.aikit.store;R=t,t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),d.setSmartScheduler(t),y.debug(`Smart index scheduler started (HTTP mode)`)}catch(e){y.error(`Failed to start smart index scheduler`,b(n,e))}}).catch(e=>y.error(`AI Kit initialization failed`,b(n,e))):(d.ready.catch(e=>y.error(`AI Kit initialization failed`,b(n,e))),y.info(`Initial full indexing skipped in HTTP mode`,{indexMode:u})),i(d.ready,()=>d.aikit?{curated:d.aikit.curated,stateStore:d.aikit.stateStore}:null)}catch(e){y.error(`Failed to load server modules`,b(n,e))}},100)}),Y=async e=>{y.info(`Shutdown signal received`,{signal:e}),R?.stop(),z?.stop(),await H?.closeAll().catch(()=>void 0),W&&z?.onSessionEnd(W),U&&(await U.close().catch(()=>void 0),U=null,W=null),J.close(),B&&await B.close(),process.exit(0)};process.on(`SIGINT`,()=>Y(`SIGINT`)),process.on(`SIGTERM`,()=>Y(`SIGTERM`))}else{let[{loadConfig:e,reconfigureForWorkspace:t,resolveIndexMode:r},{createLazyServer:a},{checkForUpdates:o,autoUpgradeScaffold:s},{RootsListChangedNotificationSchema:c}]=await Promise.all([import(`./config-DxWyWSb9.js`),import(`./server-ChL1FsjF.js`),import(`./version-check-ruLtfyDd.js`),import(`@modelcontextprotocol/sdk/types.js`)]),l=e();u(l.logging?.errorDetails===!0),y.info(`Config loaded`,{sourceCount:l.sources.length,storePath:l.store.path}),o(),s();let d=r(l),f=a(l,d),{server:p,startInit:m,ready:h,runInitialIndex:g}=f,{StdioServerTransport:_}=await import(`@modelcontextprotocol/sdk/server/stdio.js`),v=new _;await p.connect(v),y.debug(`MCP server started`,{transport:`stdio`}),await k({config:l,indexMode:d,log:y,rootsChangedNotificationSchema:c,reconfigureForWorkspace:t,runInitialIndex:g,server:p,startInit:m});let x=null,S=()=>{x&&clearTimeout(x),x=setTimeout(async()=>{y.info(`Auto-shutdown: no activity for 30 minutes — releasing resources`);try{let e=f.aikit;e&&(e.embedder.shutdown?.().catch(()=>{}),e.store.releaseMemory?.(),e.graphStore.releaseMemory?.())}catch{}},18e5),x.unref&&x.unref()};S(),process.stdin.on(`data`,()=>S()),h.catch(e=>{y.error(`Initialization failed — server will continue with limited tools`,b(n,e))}),d===`smart`?h.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,l,f.aikit.store),n=f.aikit.store;t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),f.setSmartScheduler(t),y.debug(`Smart index scheduler started (stdio mode)`)}catch(e){y.error(`Failed to start smart index scheduler`,b(n,e))}}).catch(e=>y.error(`AI Kit init failed for smart scheduler`,b(n,e))):y.warn(`Initial full indexing skipped; use aikit_reindex to index manually`,{indexMode:d}),i(h,()=>f.aikit?{curated:f.aikit.curated,stateStore:f.aikit.stateStore}:null)}}export{e as CuratedKnowledgeManager,O as applyWorkspaceRoots,k as bootstrapWorkspaceRoots,C as createSlidingWindowRateLimiter,F as main,S as resolveCorsOrigin,D as selectWorkspaceRoot};
1
+ import{t as e}from"./curated-manager-C5uOPept.js";import{randomUUID as t}from"node:crypto";import{readFileSync as n}from"node:fs";import{dirname as r,resolve as i}from"node:path";import{fileURLToPath as a,pathToFileURL as o}from"node:url";import{parseArgs as s}from"node:util";import{createLogger as c,serializeError as l,setDetailedErrorLoggingEnabled as u}from"../../core/dist/index.js";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 n=this.now(),r=await this.options.createServer(),i={id:`${d}${t()}`,transport:void 0,createdAt:n,lastAccessAt:n,server:r,requestChain:Promise.resolve()},a=this.options.createTransport({sessionIdGenerator:()=>t(),onsessioninitialized:async e=>{this.runtimes.delete(i.id),i.id=e,this.runtimes.set(e,i),this.options.onSessionStart?.(e)},onsessionclosed:async e=>{e&&await this.closeSession(e,{closeTransport:!1})}});return i.transport=a,a.onclose=()=>{let e=i.transport.sessionId??i.id;this.closeSession(e,{closeTransport:!1})},this.runtimes.set(i.id,i),await r.connect(a),i}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)}};function v(){try{let e=i(r(a(import.meta.url)),`..`,`..`,`..`,`package.json`);return JSON.parse(n(e,`utf-8`)).version??`0.0.0`}catch{return`0.0.0`}}const y=c(`server`);function b(e,t){return t?{version:e,...l(t)}:{version:e}}const x=/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/i;function S({requestOrigin:e,configuredOrigin:t,allowAnyOrigin:n,fallbackOrigin:r}){let i=t??r;return i===`*`?n?{allowOrigin:`*`,warn:!1}:e?x.test(e)?{allowOrigin:e,warn:!1}:{allowOrigin:null,warn:!0}:{allowOrigin:r,warn:!1}:{allowOrigin:i,warn:!1}}function C({limit:e,windowMs:t}){let n=new Map,r=(e,r)=>{let i=r-t,a=n.get(e)?.filter(e=>e>i)??[];return a.length===0?(n.delete(e),[]):(n.set(e,a),a)};return{allow(t,i=Date.now()){let a=r(t,i);return a.length>=e?!1:(a.push(i),n.set(t,a),!0)},getRetryAfterMs(n,i=Date.now()){let a=r(n,i);return a.length<e?0:Math.max(0,a[0]+t-i)}}}function w(e){return e.startsWith(`file://`)?a(e):e}function T(e){let t=i(e);return process.platform===`win32`?t.toLowerCase():t}function E(e){let t=new Map;for(let n of e){let e=w(n.uri);t.set(T(e),e)}return[...t.values()].sort((e,t)=>T(e).localeCompare(T(t)))}function D({config:e,roots:t}){let n=E(t);if(n.length===0)return null;let r=e.sources?.[0]?.path;if(r){let e=T(r),t=n.find(t=>T(t)===e);if(t)return t}return n[0]}function O({config:e,log:t,reconfigureForWorkspace:n,roots:r}){let i=E(r);if(i.length===0)return!1;let a=D({config:e,roots:i.map(e=>({uri:e}))});if(!a)return!1;let o=e.sources?.[0]?.path,s=o&&T(o)===T(a)?`configured-source`:`stable-sorted-root`;return t.debug(`MCP roots resolved`,{rootPath:a,rootCount:i.length,selectedBy:s}),n(e,a),e.allRoots=i,!0}async function k({config:e,indexMode:t,log:n,rootsChangedNotificationSchema:r,reconfigureForWorkspace:i,runInitialIndex:a,server:o,startInit:s,timeoutMs:c=5e3,getCwd:u=()=>process.cwd()}){let d=v(),f=!1,p=!1,m,h=o.server,g=e=>{let t=l(e),n=`${String(e)} ${String(t.message??``)}`.toLowerCase();return n.includes(`method not found`)||n.includes(`not supported`)||n.includes(`unsupported`)||n.includes(`unknown method`)||n.includes(`roots/list`)},_=()=>{f||(f=!0,s())},y=()=>{p||t!==`auto`||(p=!0,(async()=>{try{await a()}catch(e){n.error(`Initial index failed`,b(d,e))}})())},x=t=>t.length===0||(m&&=(clearTimeout(m),void 0),!O({config:e,log:n,reconfigureForWorkspace:i,roots:t}))?!1:(_(),y(),!0);try{if(x((await h.listRoots()).roots))return;n.debug(`No MCP roots yet; waiting for roots/list_changed notification`)}catch(e){if(g(e)){n.warn(`MCP roots/list not supported by client; using cwd fallback`,{version:d,cwd:u(),...l(e)}),_(),y();return}n.warn(`MCP roots/list failed during bootstrap; waiting for roots/list_changed notification`,{version:d,cwd:u(),...l(e)})}h.setNotificationHandler(r,async()=>{try{x((await h.listRoots()).roots)}catch(e){n.warn(`roots/list retry failed after notification`,b(d,e))}}),m=setTimeout(()=>{let t=u();n.debug(`Timed out waiting for MCP roots/list_changed; falling back to cwd workspace`,{cwd:t}),O({config:e,log:n,reconfigureForWorkspace:i,roots:[{uri:t}]})&&(_(),y())},c)}function A(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function j(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===o(e).href}catch{return!1}}function M(e){let t=e.headers[`mcp-session-id`];return Array.isArray(t)?t[0]:t}function N(e,t){let n=process.env[e];if(!n)return t;let r=Number.parseInt(n,10);return Number.isFinite(r)&&r>0?r:t}function P(){return j()?s({allowPositionals:!0,options:{transport:{type:`string`,default:A()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:A(),port:process.env.AIKIT_PORT??`3210`}}async function F(){let n=v(),r=P();process.on(`unhandledRejection`,e=>{y.error(`Unhandled rejection`,b(n,e))}),process.on(`uncaughtException`,e=>{y.error(`Uncaught exception — exiting`,b(n,e)),process.exit(1)});let i=(t,r)=>{t.then(async()=>{try{let{markPromoteRun:t,markPruneRun:n,prune:i,shouldRunStartupPrune:a,shouldRunWeeklyPromote:o}=await import(`../../tools/dist/index.js`),s=r();if(!s)return;if(a()){let e=await i({});n(),e.totalBytesFreed>0&&y.info(`Storage maintenance complete`,{forgeOrphans:e.forgeGroundOrphans.count,legacyLance:e.legacyLance.count,bytesFreed:e.totalBytesFreed});let{groupLessons:t,pruneLessons:r}=await import(`./evolution-BX_zTSdj.js`).then(e=>e.t),a=await r(s.curated,s.stateStore,{dryRun:!1});a.pruned.length>0&&y.info(`Startup lesson prune complete`,{pruned:a.pruned.length});let o=await t(s.curated,s.stateStore,{dryRun:!1});(o.groupsCreated>0||o.lessonsGrouped>0)&&y.info(`Startup lesson grouping complete`,{groupsCreated:o.groupsCreated,lessonsGrouped:o.lessonsGrouped})}if(o()){let{DEFAULT_PROMOTE_CONFIG:n,collectWorkspaceLessons:r,getGlobalCuratedDir:i,promoteLessons:a,scanForDuplicates:o}=await import(`./promotion-D9anNXv8.js`).then(e=>e.o),c=s.curated,l=new e(i(),c.store,c.embedder),u=await r(),d={...n,dryRun:!1},f=await a(o(u,d),l,d);t(),f.promoted.length>0&&y.info(`Weekly lesson promotion complete`,{promoted:f.promoted.length,candidates:f.candidates.length})}}catch(e){y.warn(`Startup maintenance failed (non-critical)`,b(n,e))}}).catch(()=>{})};if(y.info(`Starting MCP AI Kit server`,{version:n}),r.transport===`http`){let[{default:e},{loadConfig:a,resolveIndexMode:o},{registerDashboardRoutes:s,resolveDashboardDir:c},{registerSettingsRoutes:d,resolveSettingsDir:f},{createSettingsRouter:p},{authMiddleware:m,getOrCreateToken:g}]=await Promise.all([import(`express`),import(`./config-DxWyWSb9.js`),import(`./dashboard-static-FmfoS46e.js`),import(`./settings-static-BtvyIrza.js`),import(`./routes-1wkXLxXe.js`),import(`./auth-Bz5dmZgR.js`).then(e=>e.t)]),v=a();u(v.logging?.errorDetails===!0),y.info(`Config loaded`,{sourceCount:v.sources.length,storePath:v.store.path});let x=e();x.use(e.json({limit:`1mb`}));let w=Number(r.port),T=`http://localhost:${w}`,E=process.env.AIKIT_CORS_ORIGIN??T,D=process.env.AIKIT_ALLOW_ANY_ORIGIN===`true`,O=N(`AIKIT_HTTP_MAX_SESSIONS`,8),k=N(`AIKIT_HTTP_SESSION_TIMEOUT_MINUTES`,30),A=N(`AIKIT_HTTP_SESSION_GC_INTERVAL_MINUTES`,5),j=C({limit:100,windowMs:6e4}),P=!1;x.use((e,t,n)=>{let r=Array.isArray(e.headers.origin)?e.headers.origin[0]:e.headers.origin,i=S({requestOrigin:r,configuredOrigin:E,allowAnyOrigin:D,fallbackOrigin:T});if(i.warn&&!P&&(P=!0,y.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 F=g();console.error(`[aikit] Auth token: ~/.aikit/token`),x.use(m(F)),x.use(`/mcp`,(e,t,n)=>{let r=M(e)??e.ip??e.socket.remoteAddress??`anonymous`;if(j.allow(r)){n();return}let i=Math.max(1,Math.ceil(j.getRetryAfterMs(r)/1e3));t.setHeader(`Retry-After`,String(i)),t.status(429).json({jsonrpc:`2.0`,error:{code:-32003,message:`Rate limit exceeded`},id:null})}),s(x,c(),y);let I=new Date().toISOString();x.use(`/settings/api`,p({log:y,mcpInfo:()=>({transport:`http`,port:w,pid:process.pid,startedAt:I})})),d(x,f(),y),x.get(`/health`,(e,t)=>{t.json({status:`ok`})});let L=!1,R=null,z=null,B=null,V=null,H=null,U=null,W=null,G=Promise.resolve(),K=async(e,n)=>{if(!L||!B||!V){n.status(503).json({jsonrpc:`2.0`,error:{code:-32603,message:`Server initializing — please retry in a few seconds`},id:null});return}let r=G,i;G=new Promise(e=>{i=e}),await r;try{let r=M(e);if(!U){if(r){n.status(404).json({jsonrpc:`2.0`,error:{code:-32001,message:`Session not found`},id:null});return}let e=new V({sessionIdGenerator:()=>t(),onsessioninitialized:async e=>{W=e,z?.onSessionStart(e,{transport:`http`})},onsessionclosed:async e=>{e&&z?.onSessionEnd(e),W=null}});e.onclose=()=>{U===e&&(U=null),W===e.sessionId&&(W=null)},U=e,await B.connect(e)}let i=U;await i.handleRequest(e,n,e.body),e.method!==`DELETE`&&(!r&&i.sessionId?(W=i.sessionId,z?.onSessionStart(i.sessionId,{transport:`http`}),z?.onSessionActivity(i.sessionId)):r&&z?.onSessionActivity(r))}catch(e){if(y.error(`MCP handler error`,l(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()}},q=async(e,t)=>{let n=M(e);if(H&&(!U||n!==W)){await H.handleRequest(e,t,e.body);return}await K(e,t)};x.post(`/mcp`,q),x.get(`/mcp`,q),x.delete(`/mcp`,q);let J=x.listen(w,`127.0.0.1`,()=>{y.info(`MCP server listening`,{url:`http://127.0.0.1:${w}/mcp`,port:w}),setTimeout(async()=>{try{let[{createLazyServer:e,createMcpServer:t,ALL_TOOL_NAMES:r},{StreamableHTTPServerTransport:a},{checkForUpdates:s,autoUpgradeScaffold:c}]=await Promise.all([import(`./server-BiFuQDqy.js`),import(`@modelcontextprotocol/sdk/server/streamableHttp.js`),import(`./version-check-DAQdKLy7.js`)]);s(),c(),setInterval(s,1440*60*1e3).unref();let u=o(v),d=e(v,u);B=d.server,V=a,L=!0,y.debug(`MCP server configured (lazy — AI Kit initializing in background)`,{toolCount:r.length,resourceCount:2}),d.startInit(),d.ready.then(()=>{if(!d.aikit)throw Error(`AI Kit components are not available after initialization`);z=new _(d.aikit.stateStore,{staleTimeoutMinutes:k,gcIntervalMinutes:A,onBeforeSessionDelete:e=>{if(W===e&&U){let e=U;U=null,W=null,e.close().catch(()=>void 0)}H?.closeSession(e,{notifySessionEnd:!1})},onSessionEndMaintenance:async()=>{if(!d.aikit?.curated||!d.aikit?.stateStore)return;let{pruneLessons:e}=await import(`./evolution-BX_zTSdj.js`).then(e=>e.t),t=await e(d.aikit.curated,d.aikit.stateStore,{dryRun:!1});t.pruned.length>0&&y.info(`Session-end lesson prune`,{pruned:t.pruned.length})}}),H=new h({createServer:()=>{if(!d.aikit)throw Error(`AI Kit components are not available after initialization`);return t(d.aikit,v)},createTransport:e=>new a(e),maxSessions:O,sessionTimeoutMinutes:k,onSessionStart:e=>z?.onSessionStart(e,{transport:`http`}),onSessionActivity:e=>z?.onSessionActivity(e),onSessionEnd:e=>z?.onSessionEnd(e)}),z.startGC(),W&&(z.onSessionStart(W,{transport:`http`}),z.onSessionActivity(W)),y.info(`HTTP session runtime ready`,{maxSessions:O,sessionTimeoutMinutes:k,gcIntervalMinutes:A})}).catch(e=>y.error(`Failed to start session manager`,l(e))),u===`auto`?d.ready.then(async()=>{try{let e=v.sources.map(e=>e.path).join(`, `);y.info(`Running initial index`,{sourcePaths:e}),await d.runInitialIndex(),y.info(`Initial index complete`)}catch(e){y.error(`Initial index failed; will retry on aikit_reindex`,b(n,e))}}).catch(e=>y.error(`AI Kit init or indexing failed`,b(n,e))):u===`smart`?d.ready.then(async()=>{try{if(!d.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(d.aikit.indexer,v,d.aikit.store),n=d.aikit.store;R=t,t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),d.setSmartScheduler(t),y.debug(`Smart index scheduler started (HTTP mode)`)}catch(e){y.error(`Failed to start smart index scheduler`,b(n,e))}}).catch(e=>y.error(`AI Kit initialization failed`,b(n,e))):(d.ready.catch(e=>y.error(`AI Kit initialization failed`,b(n,e))),y.info(`Initial full indexing skipped in HTTP mode`,{indexMode:u})),i(d.ready,()=>d.aikit?{curated:d.aikit.curated,stateStore:d.aikit.stateStore}:null)}catch(e){y.error(`Failed to load server modules`,b(n,e))}},100)}),Y=async e=>{y.info(`Shutdown signal received`,{signal:e}),R?.stop(),z?.stop(),await H?.closeAll().catch(()=>void 0),W&&z?.onSessionEnd(W),U&&(await U.close().catch(()=>void 0),U=null,W=null),J.close(),B&&await B.close(),process.exit(0)};process.on(`SIGINT`,()=>Y(`SIGINT`)),process.on(`SIGTERM`,()=>Y(`SIGTERM`))}else{let[{loadConfig:e,reconfigureForWorkspace:t,resolveIndexMode:r},{createLazyServer:a},{checkForUpdates:o,autoUpgradeScaffold:s},{RootsListChangedNotificationSchema:c}]=await Promise.all([import(`./config-DxWyWSb9.js`),import(`./server-BiFuQDqy.js`),import(`./version-check-DAQdKLy7.js`),import(`@modelcontextprotocol/sdk/types.js`)]),l=e();u(l.logging?.errorDetails===!0),y.info(`Config loaded`,{sourceCount:l.sources.length,storePath:l.store.path}),o(),s(),setInterval(o,1440*60*1e3).unref();let d=r(l),f=a(l,d),{server:p,startInit:m,ready:h,runInitialIndex:g}=f,{StdioServerTransport:_}=await import(`@modelcontextprotocol/sdk/server/stdio.js`),v=new _;await p.connect(v),y.debug(`MCP server started`,{transport:`stdio`}),await k({config:l,indexMode:d,log:y,rootsChangedNotificationSchema:c,reconfigureForWorkspace:t,runInitialIndex:g,server:p,startInit:m});let x=null,S=()=>{x&&clearTimeout(x),x=setTimeout(async()=>{y.info(`Auto-shutdown: no activity for 30 minutes — releasing resources`);try{let e=f.aikit;e&&(e.embedder.shutdown?.().catch(()=>{}),e.store.releaseMemory?.(),e.graphStore.releaseMemory?.())}catch{}},18e5),x.unref&&x.unref()};S(),process.stdin.on(`data`,()=>S()),h.catch(e=>{y.error(`Initialization failed — server will continue with limited tools`,b(n,e))}),d===`smart`?h.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,l,f.aikit.store),n=f.aikit.store;t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),f.setSmartScheduler(t),y.debug(`Smart index scheduler started (stdio mode)`)}catch(e){y.error(`Failed to start smart index scheduler`,b(n,e))}}).catch(e=>y.error(`AI Kit init failed for smart scheduler`,b(n,e))):y.warn(`Initial full indexing skipped; use aikit_reindex to index manually`,{indexMode:d}),i(h,()=>f.aikit?{curated:f.aikit.curated,stateStore:f.aikit.stateStore}:null)}}export{e as CuratedKnowledgeManager,O as applyWorkspaceRoots,k as bootstrapWorkspaceRoots,C as createSlidingWindowRateLimiter,F as main,S as resolveCorsOrigin,D as selectWorkspaceRoot};
@@ -1,4 +1,4 @@
1
- import{n as e,t}from"./curated-manager-C5uOPept.js";import{a as n,i as r,n as i,o as a,r as o,s}from"./retention-B4ITAs7F.js";import{a as c,c as l,d as u,f as d,h as f,i as p,l as m,m as h,n as g,o as _,p as v,r as y,s as b,u as x}from"./supersession-CWEne3av.js";import{n as S,r as C}from"./resolve-sibling-1oDoO-Re.js";import{n as w,r as T}from"./evolution-BX_zTSdj.js";import{a as E,i as D,n as O,r as k,s as ee,t as te}from"./promotion-D9anNXv8.js";import{autoUpgradeScaffold as ne,getCurrentVersion as re,getUpgradeState as ie}from"./version-check-ruLtfyDd.js";import{createRequire as ae}from"node:module";import{createHash as A,randomBytes as oe,randomUUID as se,timingSafeEqual as ce}from"node:crypto";import{existsSync as j,mkdirSync as M,readFileSync as N,readdirSync as le,renameSync as ue,rmSync as de,statSync as fe,unlinkSync as pe,writeFileSync as me}from"node:fs";import{basename as he,dirname as ge,isAbsolute as _e,join as P,relative as ve,resolve as F,sep as ye}from"node:path";import{fileURLToPath as be}from"node:url";import{promisify as xe}from"node:util";import{AIKIT_PATHS as Se,CONTENT_TYPES as Ce,CircuitBreaker as we,EMBEDDING_DEFAULTS as Te,HealthBus as Ee,KNOWLEDGE_ORIGINS as De,SOURCE_TYPES as Oe,TOKEN_BUDGETS as ke,addLogListener as Ae,computePartitionKey as je,createLogger as I,getGlobalDataDir as Me,getPartitionDir as Ne,isUserInstalled as Pe,listWorkspaces as Fe,serializeError as L}from"../../core/dist/index.js";import{FileCache as Ie,acquireLease as Le,addToWorkset as Re,audit as ze,bookendReorder as Be,changelog as Ve,check as He,checkpointDiff as Ue,checkpointGC as We,checkpointHistory as Ge,checkpointLatest as Ke,checkpointList as qe,checkpointLoad as Je,checkpointSave as Ye,codemod as Xe,compact as Ze,compressTerminalOutput as Qe,createRestorePoint as $e,createSearchSuccessResponse as et,dataTransform as tt,delegate as nt,delegateListModels as rt,deleteWorkset as it,diffParse as at,digest as ot,encode as st,ensureLegacyStashImported as ct,envInfo as lt,evaluate as ut,evidenceMap as dt,fileSummary as ft,find as pt,findDeadSymbols as mt,findExamples as ht,forgeClassify as gt,forgeGround as _t,getWorkset as vt,gitContext as yt,graphAugmentSearch as bt,graphQuery as xt,guide as St,health as Ct,httpRequest as wt,laneCreate as Tt,laneDiff as Et,laneDiscard as Dt,laneList as Ot,laneMerge as kt,laneStatus as At,listActiveLeases as jt,listRestorePoints as Mt,listWorksets as Nt,measure as Pt,onboard as Ft,parseOutput as It,processList as Lt,processLogs as Rt,processStart as zt,processStatus as Bt,processStop as Vt,queueClear as Ht,queueCreate as Ut,queueDag as Wt,queueDelete as Gt,queueDone as Kt,queueFail as qt,queueGet as Jt,queueList as Yt,queueNext as Xt,queuePush as Zt,regexTest as Qt,releaseLease as $t,removeFromWorkset as en,rename as tn,replayAppend as nn,replayClear as rn,replayList as an,replayTrim as on,restoreFromPoint as sn,saveWorkset as cn,schemaValidate as ln,scopeMap as un,scoreCompliance as dn,sessionDigest as fn,sessionDigestSampling as pn,stashClear as mn,stashDelete as hn,stashGet as gn,stashList as _n,stashSet as vn,storeReversibleContext as yn,stratumCard as bn,summarizeCheckResult as xn,symbol as Sn,testRun as Cn,timeUtils as wn,trace as Tn,truncateToTokenBudget as R,watchList as En,watchStart as Dn,watchStop as On,webFetch as kn,webSearch as An}from"../../tools/dist/index.js";import{mkdir as jn,readFile as Mn,readdir as Nn,rm as Pn,stat as Fn,unlink as In,writeFile as Ln}from"node:fs/promises";import{execFile as Rn,execSync as zn}from"node:child_process";import{homedir as Bn,tmpdir as Vn}from"node:os";import{McpServer as Hn,ResourceTemplate as Un}from"@modelcontextprotocol/sdk/server/mcp.js";import{buildFormSchema as Wn,field as Gn,normalizeResponse as Kn}from"../../elicitation/dist/index.js";import{completable as qn}from"@modelcontextprotocol/sdk/server/completable.js";import{z}from"zod";import{getEngine as Jn,registerBrowserTools as Yn}from"../../browser/dist/index.js";import{BlastRadiusAnalyzer as Xn,DependencyAnalyzer as Zn,DiagramGenerator as Qn,EntryPointAnalyzer as $n,KnowledgeProducer as er,PatternAnalyzer as tr,StructureAnalyzer as nr,SymbolAnalyzer as rr}from"../../analyzers/dist/index.js";import{WasmDiagnostics as ir,WasmRuntime as ar,initializeWasm as or}from"../../chunker/dist/index.js";import{ERCache as sr,ERClient as cr,EvolutionCollector as lr,PolicyStore as ur,PushAdapter as dr,mergeResults as fr}from"../../enterprise-bridge/dist/index.js";import"../../tool-routing/dist/index.mjs";import{RESOURCE_MIME_TYPE as pr,getUiCapability as mr,registerAppResource as hr,registerAppTool as gr}from"@modelcontextprotocol/ext-apps/server";import{SqliteGraphStore as _r,allMigrations as vr,createSqliteAdapter as yr,createStateStore as br,createStore as xr,runMigrations as Sr}from"../../store/dist/index.js";import{TemplateRegistry as Cr,buildShell as wr,dashboardTemplateDefinition as Tr,defaultRegistry as Er,flameGraphTemplateDefinition as Dr,isError as Or,isResult as kr,kanbanTemplateDefinition as Ar,listSortTemplateDefinition as jr,renderSurface as Mr}from"../../blocks-core/dist/index.mjs";import{createServer as Nr}from"node:http";import{EmbedderProxy as Pr}from"../../embeddings/dist/index.js";import{FileHashCache as Fr,IncrementalIndexer as Ir}from"../../indexer/dist/index.js";function Lr(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 Kn(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,Wn({confirmed:Gn.confirm(e)}));return t?.action===`accept`&&t.content?.confirmed===!0},async selectOne(e,t){let r=await n(e,Wn({selection:Gn.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,Wn({selections:Gn.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,Wn({text:Gn.text(e,{description:t})}));if(r?.action!==`accept`)return null;let i=r.content?.text;return typeof i==`string`?i:null}}}const Rr={debug:`debug`,info:`info`,warn:`warning`,error:`error`};function zr(e){return Ae(({level:t,component:n,message:r,data:i})=>{try{Promise.resolve(e.sendLoggingMessage({level:Rr[t],logger:n,data:i?{message:r,...i}:r})).catch(()=>{})}catch{}})}const Br=3e4,Vr=new Map;function Hr(e,t,n){let r=Vr.get(e);if(r&&Date.now()<r.expires)return Promise.resolve(r.data);let i=n();return Promise.resolve(i).then(n=>(Vr.set(e,{data:n,expires:Date.now()+t}),n))}function Ur(){Vr.clear()}function Wr(e,t){return Hr(`curated-paths`,Br,async()=>(await e.list()).map(e=>e.path)).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Gr(e,t){return Hr(`file-paths`,Br,()=>e.listSourcePaths()).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Kr(e,t){return Hr(`symbol-names`,Br,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 qr(e,t){return t?_n(t).map(e=>e.key).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Jr(e){return Nt().map(e=>e.name).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20)}function Yr(e,t){return t?qe(t).map(e=>e.label).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Xr(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-C5uOPept.js";import{a as n,i as r,n as i,o as a,r as o,s}from"./retention-B4ITAs7F.js";import{a as c,c as l,d as u,f as d,h as f,i as p,l as m,m as h,n as g,o as _,p as v,r as y,s as b,u as x}from"./supersession-CWEne3av.js";import{n as S,r as C}from"./resolve-sibling-1oDoO-Re.js";import{n as w,r as T}from"./evolution-BX_zTSdj.js";import{a as E,i as D,n as O,r as k,s as ee,t as te}from"./promotion-D9anNXv8.js";import{autoUpgradeScaffold as ne,getCurrentVersion as re,getUpgradeState as ie}from"./version-check-DAQdKLy7.js";import{createRequire as ae}from"node:module";import{createHash as A,randomBytes as oe,randomUUID as se,timingSafeEqual as ce}from"node:crypto";import{existsSync as j,mkdirSync as M,readFileSync as N,readdirSync as le,renameSync as ue,rmSync as de,statSync as fe,unlinkSync as pe,writeFileSync as me}from"node:fs";import{basename as he,dirname as ge,isAbsolute as _e,join as P,relative as ve,resolve as F,sep as ye}from"node:path";import{fileURLToPath as be}from"node:url";import{promisify as xe}from"node:util";import{AIKIT_PATHS as Se,CONTENT_TYPES as Ce,CircuitBreaker as we,EMBEDDING_DEFAULTS as Te,HealthBus as Ee,KNOWLEDGE_ORIGINS as De,SOURCE_TYPES as Oe,TOKEN_BUDGETS as ke,addLogListener as Ae,computePartitionKey as je,createLogger as I,getGlobalDataDir as Me,getPartitionDir as Ne,isUserInstalled as Pe,listWorkspaces as Fe,serializeError as L}from"../../core/dist/index.js";import{FileCache as Ie,acquireLease as Le,addToWorkset as Re,audit as ze,bookendReorder as Be,changelog as Ve,check as He,checkpointDiff as Ue,checkpointGC as We,checkpointHistory as Ge,checkpointLatest as Ke,checkpointList as qe,checkpointLoad as Je,checkpointSave as Ye,codemod as Xe,compact as Ze,compressTerminalOutput as Qe,createRestorePoint as $e,createSearchSuccessResponse as et,dataTransform as tt,delegate as nt,delegateListModels as rt,deleteWorkset as it,diffParse as at,digest as ot,encode as st,ensureLegacyStashImported as ct,envInfo as lt,evaluate as ut,evidenceMap as dt,fileSummary as ft,find as pt,findDeadSymbols as mt,findExamples as ht,forgeClassify as gt,forgeGround as _t,getWorkset as vt,gitContext as yt,graphAugmentSearch as bt,graphQuery as xt,guide as St,health as Ct,httpRequest as wt,laneCreate as Tt,laneDiff as Et,laneDiscard as Dt,laneList as Ot,laneMerge as kt,laneStatus as At,listActiveLeases as jt,listRestorePoints as Mt,listWorksets as Nt,measure as Pt,onboard as Ft,parseOutput as It,processList as Lt,processLogs as Rt,processStart as zt,processStatus as Bt,processStop as Vt,queueClear as Ht,queueCreate as Ut,queueDag as Wt,queueDelete as Gt,queueDone as Kt,queueFail as qt,queueGet as Jt,queueList as Yt,queueNext as Xt,queuePush as Zt,regexTest as Qt,releaseLease as $t,removeFromWorkset as en,rename as tn,replayAppend as nn,replayClear as rn,replayList as an,replayTrim as on,restoreFromPoint as sn,saveWorkset as cn,schemaValidate as ln,scopeMap as un,scoreCompliance as dn,sessionDigest as fn,sessionDigestSampling as pn,stashClear as mn,stashDelete as hn,stashGet as gn,stashList as _n,stashSet as vn,storeReversibleContext as yn,stratumCard as bn,summarizeCheckResult as xn,symbol as Sn,testRun as Cn,timeUtils as wn,trace as Tn,truncateToTokenBudget as R,watchList as En,watchStart as Dn,watchStop as On,webFetch as kn,webSearch as An}from"../../tools/dist/index.js";import{mkdir as jn,readFile as Mn,readdir as Nn,rm as Pn,stat as Fn,unlink as In,writeFile as Ln}from"node:fs/promises";import{execFile as Rn,execSync as zn}from"node:child_process";import{homedir as Bn,tmpdir as Vn}from"node:os";import{McpServer as Hn,ResourceTemplate as Un}from"@modelcontextprotocol/sdk/server/mcp.js";import{buildFormSchema as Wn,field as Gn,normalizeResponse as Kn}from"../../elicitation/dist/index.js";import{completable as qn}from"@modelcontextprotocol/sdk/server/completable.js";import{z}from"zod";import{getEngine as Jn,registerBrowserTools as Yn}from"../../browser/dist/index.js";import{BlastRadiusAnalyzer as Xn,DependencyAnalyzer as Zn,DiagramGenerator as Qn,EntryPointAnalyzer as $n,KnowledgeProducer as er,PatternAnalyzer as tr,StructureAnalyzer as nr,SymbolAnalyzer as rr}from"../../analyzers/dist/index.js";import{WasmDiagnostics as ir,WasmRuntime as ar,initializeWasm as or}from"../../chunker/dist/index.js";import{ERCache as sr,ERClient as cr,EvolutionCollector as lr,PolicyStore as ur,PushAdapter as dr,mergeResults as fr}from"../../enterprise-bridge/dist/index.js";import"../../tool-routing/dist/index.mjs";import{RESOURCE_MIME_TYPE as pr,getUiCapability as mr,registerAppResource as hr,registerAppTool as gr}from"@modelcontextprotocol/ext-apps/server";import{SqliteGraphStore as _r,allMigrations as vr,createSqliteAdapter as yr,createStateStore as br,createStore as xr,runMigrations as Sr}from"../../store/dist/index.js";import{TemplateRegistry as Cr,buildShell as wr,dashboardTemplateDefinition as Tr,defaultRegistry as Er,flameGraphTemplateDefinition as Dr,isError as Or,isResult as kr,kanbanTemplateDefinition as Ar,listSortTemplateDefinition as jr,renderSurface as Mr}from"../../blocks-core/dist/index.mjs";import{createServer as Nr}from"node:http";import{EmbedderProxy as Pr}from"../../embeddings/dist/index.js";import{FileHashCache as Fr,IncrementalIndexer as Ir}from"../../indexer/dist/index.js";function Lr(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 Kn(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,Wn({confirmed:Gn.confirm(e)}));return t?.action===`accept`&&t.content?.confirmed===!0},async selectOne(e,t){let r=await n(e,Wn({selection:Gn.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,Wn({selections:Gn.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,Wn({text:Gn.text(e,{description:t})}));if(r?.action!==`accept`)return null;let i=r.content?.text;return typeof i==`string`?i:null}}}const Rr={debug:`debug`,info:`info`,warn:`warning`,error:`error`};function zr(e){return Ae(({level:t,component:n,message:r,data:i})=>{try{Promise.resolve(e.sendLoggingMessage({level:Rr[t],logger:n,data:i?{message:r,...i}:r})).catch(()=>{})}catch{}})}const Br=3e4,Vr=new Map;function Hr(e,t,n){let r=Vr.get(e);if(r&&Date.now()<r.expires)return Promise.resolve(r.data);let i=n();return Promise.resolve(i).then(n=>(Vr.set(e,{data:n,expires:Date.now()+t}),n))}function Ur(){Vr.clear()}function Wr(e,t){return Hr(`curated-paths`,Br,async()=>(await e.list()).map(e=>e.path)).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Gr(e,t){return Hr(`file-paths`,Br,()=>e.listSourcePaths()).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Kr(e,t){return Hr(`symbol-names`,Br,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 qr(e,t){return t?_n(t).map(e=>e.key).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Jr(e){return Nt().map(e=>e.name).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20)}function Yr(e,t){return t?qe(t).map(e=>e.label).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Xr(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:z.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:z.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: "conventions" })` — 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(`
@@ -24,7 +24,7 @@ import{n as e,t}from"./curated-manager-C5uOPept.js";import{a as n,i as r,n as i,
24
24
  `),r=await this.curatedStore.remember(t,n,`context`,[`observation`,`source-${e.source}`,`type-${e.type}`]);this.stateStore.memoryMetaCreate(r.path,`working`)}};function Xa(e){let t=[e.cwd,e.workspace,e.root_path,e.path];for(let e of t)if(typeof e==`string`&&e.length>0)return e}function Za(e){return async(t,n)=>{let r=await n();try{await e.processToolResult(t.toolName,r,{workspace:Xa(t.args),args:t.args})}catch(e){Ia.warn(`Observation capture failed`,{toolName:t.toolName,requestId:t.requestId,error:e instanceof Error?e.message:String(e)})}return r}}const Qa=I(`procedural-memory`),$a=`Use when these user-facing tools are run in this order within a single session.`,eo={minSequenceLength:3,minRepetitions:3,maxSequenceLength:10,confidenceIncrement:10,confidenceDecrement:20},to=new Set([`status`,`guide`,`health`,`onboard`,`reindex`,`replay`,`session_digest`,`process`,`watch`,`produce_knowledge`,`list_tools`,`describe_tool`,`search_tools`]);function no(e){return e.join(`→`)}function ro(e){return{...e,steps:[...e.steps]}}function io(e){return e.every(e=>e.success)}var ao=class{config;history=[];sequences=new Map;procedures=new Map;pendingProcedures=new Map;constructor(e=eo){this.config=e}record(e,t){let n=new Date().toISOString();this.history.push({toolName:e,timestamp:n,success:t}),this.history.length>100&&(this.history=this.history.slice(-100));let r=this.detectSequences(n);this.updateMatchedProcedures(n,r)}getExtractableSequences(){return[...this.sequences.entries()].filter(([,e])=>e.count>=this.config.minRepetitions).map(([e,t])=>({steps:e.split(`→`),count:t.count,lastSeen:t.lastSeen})).sort((e,t)=>t.count===e.count?t.steps.length-e.steps.length:t.count-e.count)}listProcedures(){return[...this.procedures.values()].map(e=>ro(e)).sort((e,t)=>t.occurrences===e.occurrences?t.steps.length-e.steps.length:t.occurrences-e.occurrences)}drainNewProcedures(){let e=[...this.pendingProcedures.values()].map(e=>ro(e));return this.pendingProcedures.clear(),e}requeueProcedures(e){for(let t of e)this.pendingProcedures.set(no(t.steps),ro(t))}extractProcedure(e,t){return{id:se(),steps:[...e],occurrences:t,confidence:Math.min(50+(t-this.config.minRepetitions)*this.config.confidenceIncrement,100),lastSeen:new Date().toISOString(),conditions:$a}}adjustConfidence(e,t){return e.confidence=t?Math.min(100,e.confidence+this.config.confidenceIncrement):Math.max(0,e.confidence-this.config.confidenceDecrement),e.confidence}getHistoryLength(){return this.history.length}clear(){this.history=[],this.sequences.clear(),this.procedures.clear(),this.pendingProcedures.clear()}detectSequences(e){let t=this.history.map(e=>e.toolName),n=Math.min(this.config.maxSequenceLength,t.length),r=new Set,i=Math.max(1,Math.min(2,this.config.minRepetitions));for(let a=this.config.minSequenceLength;a<=n;a+=1){let n=t.slice(-a),o=no(n),s=0;for(let e=0;e<=t.length-a;e+=1)no(t.slice(e,e+a))===o&&(s+=1);if(!(s<i)&&(this.sequences.set(o,{count:s,lastSeen:e}),s>=this.config.minRepetitions&&!this.procedures.has(o))){let t=this.extractProcedure(n,s);t.lastSeen=e,this.procedures.set(o,t),this.pendingProcedures.set(o,ro(t)),r.add(o)}}return r}updateMatchedProcedures(e,t){for(let[n,r]of this.procedures.entries()){if(t.has(n))continue;let i=n.split(`→`);if(this.history.length<i.length)continue;let a=this.history.slice(-i.length);no(a.map(e=>e.toolName))===n&&(r.occurrences+=1,r.lastSeen=e,this.adjustConfidence(r,io(a)))}}};async function oo(e,t,n){let r=await t.remember(`Procedure: ${n.steps.join(` → `)}`,so(n),`patterns`,[`procedure`,`auto-extracted`]);return e.memoryMetaCreate(r.path,`procedural`),r.path}function so(e){return[`## Procedure: ${e.steps.join(` → `)}`,``,`**Confidence:** ${e.confidence}/100`,`**Occurrences:** ${e.occurrences}`,`**Last Seen:** ${e.lastSeen}`,``,`### Steps`,...e.steps.map((e,t)=>`${t+1}. \`${e}\``),``,`### When to Use`,e.conditions??$a].join(`
25
25
  `)}function co(e,t,n={}){return async(r,i)=>{if(!lo(r.toolName,n))return i();try{let n=await i();return e.record(r.toolName,n.isError!==!0),await uo(e,t,r.toolName),n}catch(n){throw e.record(r.toolName,!1),await uo(e,t,r.toolName),n}}}function lo(e,t){return t.trackedTools&&!t.trackedTools.has(e)?!1:!(t.ignoredTools??to).has(e)}async function uo(e,t,n){if(Ee.instance().isDegraded(`embedder`)){Qa.debug?.(`Skipping procedural memory persist — embedder degraded`);return}let r=e.drainNewProcedures();if(r.length===0)return;let i=[];for(let e of r)try{await oo(t.stateStore,t.curatedStore,e)}catch(t){let r=t instanceof Error?t.message:String(t),a=/circuit breaker|timed out|worker.*killed|respawn/i.test(r);Qa.warn(`Failed to store procedural memory`,{toolName:n,sequence:e.steps.join(` -> `),error:r}),a||i.push(e)}i.length>0&&e.requeueProcedures(i)}const fo=I(`tool-pipeline`);function po(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function mo(e,t){return e.tools?(Array.isArray(e.tools)?e.tools:[e.tools]).includes(t):!0}function ho(e){return e.middleware.critical===!0}var go=class{entries=[];use(e,t){this.entries.push({middleware:e,order:t?.order??100,tools:t?.tools,name:t?.name??e.name??`anonymous`})}useFor(e,t,n){this.use(t,{order:n?.order,tools:e,name:n?.name})}wrap(e,t,n,r){let i=this.entries.filter(t=>mo(t,e)).sort((e,t)=>e.order-t.order);return async(a,o)=>{let s={toolName:e,args:po(a)?a:{},requestId:se(),meta:r,extra:o,toolConfig:n},c=async n=>{let r=i[n];if(!r)return await t(s.args,o);let a=!1,l=!1,u,d=async()=>{a=!0;let e=await c(n+1);return l=!0,u=e,e};try{return await r.middleware(s,d)}catch(t){if(ho(r))throw t;if(fo.warn(`Middleware failed for tool`,{middleware:r.name,tool:e,error:String(t)}),a){if(l&&u)return u;throw t}return c(n+1)}};return c(0)}}getMiddlewareNames(){return this.entries.map(e=>e.name)}};const _o=I(`auto-gc`);let vo=`warming`,yo=null,bo=0;function xo(){let e=[...Fo()];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 So(e){let t=xo();if(t===0){vo=`warming`;return}if(t>500){vo=`degraded`;let n=Date.now();if(yo&&n-yo<36e5){_o.debug(`GC cooldown active — skipping`,{lastGcAgoMs:n-yo});return}yo=n,bo++,_o.warn(`p95 latency exceeds threshold, triggering GC`,{p95:t,cycle:bo}),e&&e().catch(e=>_o.error(`GC callback failed`,{err:String(e)}))}else t<200&&(vo=`healthy`)}function Co(){return{state:vo,p95:xo(),lastGcAt:yo,gcCount:bo,bufferSize:Fo().length}}const wo=/key|token|secret|auth|password|bearer/i,To=new Set([`eval`,`env`]);function Eo(e){if(typeof e==`string`)return/^(Bearer |sk-|ghp_|glpat-|ghu_|ghs_|github_pat_)/i.test(e)?`[REDACTED]`:e;if(Array.isArray(e))return e.map(Eo);if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))/(?:token|secret|password|passphrase|key|auth|credential|api.?key)/i.test(n)?t[n]=`[REDACTED]`:t[n]=Eo(r);return t}return e}function Do(e,t){if(To.has(e))return JSON.stringify({_redacted:!0,tool:e});let n=Eo(t);if(e===`http`&&n.headers&&typeof n.headers==`object`){let e={};for(let[t,r]of Object.entries(n.headers))e[t]=wo.test(t)?`[REDACTED]`:r;return n.headers=e,JSON.stringify(n).slice(0,2e3)}return JSON.stringify(n).slice(0,2e3)}let Oo={totalInputChars:0,totalOutputChars:0,callCount:0,startTime:new Date().toISOString()};function ko(e,t){Oo.totalInputChars+=e,Oo.totalOutputChars+=t,Oo.callCount++}function Ao(){return{...Oo}}const jo=new Map,Mo=[];function No(e,t,n,r,i){let a=jo.get(e);a||(a={callCount:0,totalDurationMs:0,totalInputChars:0,totalOutputChars:0,errorCount:0},jo.set(e,a)),a.callCount++,a.totalDurationMs+=t,a.totalInputChars+=n,a.totalOutputChars+=r,i&&a.errorCount++,Mo.push(t),Mo.length>100&&Mo.shift(),Mo.length>=10&&Mo.length%20==0&&So()}function Po(){return Array.from(jo.entries()).map(([e,t])=>({tool:e,...t}))}function Fo(){return Mo}function Io(){return async(e,t)=>{let n=Date.now(),r=JSON.stringify(e.args??{}).length;try{let i=await t(),a=Date.now()-n,o=JSON.stringify(i);return nn({ts:new Date().toISOString(),source:`mcp`,tool:e.toolName,input:Do(e.toolName,e.args),durationMs:a,status:`ok`,output:o,traceId:e.requestId,outputChars:o.length,inputChars:r}),No(e.toolName,a,r,o.length,!1),ko(r,o.length),i}catch(t){let i=Date.now()-n,a=t instanceof Error?t.message:String(t);throw nn({ts:new Date().toISOString(),source:`mcp`,tool:e.toolName,input:Do(e.toolName,e.args),durationMs:i,status:`error`,output:a,traceId:e.requestId,outputChars:0,inputChars:r}),No(e.toolName,i,r,0,!0),ko(r,a.length),t}}}function Lo(e,t){e.registerResource(`aikit-curated-index`,`aikit://curated`,{description:`Index of all curated knowledge entries`,mimeType:`text/markdown`},async()=>{let e=(await t.list()).map(e=>`- [${e.title}](aikit://curated/${e.path}) — ${e.category}`);return{contents:[{uri:`aikit://curated`,text:`# Curated Knowledge Index\n\n${e.length>0?e.join(`
26
26
  `):`_No curated entries yet._`}`,mimeType:`text/markdown`}]}});let n=new Un(`aikit://curated/{+path}`,{list:async()=>({resources:(await t.list()).map(e=>({uri:`aikit://curated/${e.path}`,name:e.title,description:`[${e.category}] ${e.contentPreview?.slice(0,80)??``}`,mimeType:`text/markdown`}))})});e.registerResource(`aikit-curated-entry`,n,{description:`A curated knowledge entry`,mimeType:`text/markdown`},async(e,n)=>{let r=n.path;if(!r)throw Error(`Missing path variable in curated resource URI`);let i=await t.read(r);return{contents:[{uri:e.toString(),text:`---\ntitle: ${i.title}\ncategory: ${i.category}\ntags: ${i.tags?.join(`, `)??``}\nversion: ${i.version??1}\n---\n\n${i.content??i.contentPreview??``}`,mimeType:`text/markdown`}]}})}const Ro=`aikit://schemas/channel-surface`,zo=new URL(`../../../blocks-core/schemas/channel-surface.schema.json`,import.meta.url);let Bo;function Vo(){return Bo??=Mn(zo,`utf8`),Bo}function Ho(e,t,n){e.registerResource(`aikit-status`,`aikit://status`,{description:`Current AI Kit status and statistics`,mimeType:`text/plain`},async()=>{let e=await t.getStats();return{contents:[{uri:`aikit://status`,text:`AI Kit: ${e.totalRecords} records from ${e.totalFiles} files. Last indexed: ${e.lastIndexedAt??`Never`}`,mimeType:`text/plain`}]}}),e.registerResource(`aikit-file-tree`,`aikit://file-tree`,{description:`List of all indexed source files`,mimeType:`text/plain`},async()=>({contents:[{uri:`aikit://file-tree`,text:(await t.listSourcePaths()).sort().join(`
27
- `),mimeType:`text/plain`}]})),e.registerResource(`aikit-channel-surface-schema`,Ro,{description:`JSON Schema for the ChannelSurface communication contract`,mimeType:`application/schema+json`},async()=>({contents:[{uri:Ro,text:await Vo(),mimeType:`application/schema+json`}]})),Lo(e,n)}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=new Set(`browser.changelog.check.compliance_score.checkpoint.codemod.compact.config.data_transform.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.forge_classify.git_context.graph.guide.health.http.knowledge.lane.measure.onboard.parse_output.present.process.produce_knowledge.queue.regex_test.reindex.rename.replay.restore.schema_validate.session_digest.scope_map.stash.status.stratum_card.signal.test_run.time.watch.web_fetch.web_search.workset`.split(`.`)),Jo=5e3,Yo=new Set(`browser.changelog.check.compliance_score.checkpoint.codemod.data_transform.delegate.diff_parse.encode.env.eval.evidence_map.flow.describe_tool.list_tools.search_tools.forge_classify.git_context.guide.present.health.http.lane.measure.parse_output.process.produce_knowledge.queue.regex_test.rename.replay.restore.schema_validate.session_digest.status.test_run.time.watch.web_fetch.web_search.workset`.split(`.`)),Xo=`analyze.audit.blast_radius.browser.changelog.check.compliance_score.checkpoint.codemod.compact.config.data_transform.dead_symbols.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.find.flow.forge_classify.forge_ground.git_context.graph.guide.health.http.knowledge.memory_explain.lane.describe_tool.list_tools.lookup.measure.onboard.parse_output.present.process.produce_knowledge.queue.regex_test.reindex.rename.replay.restore.schema_validate.scope_map.search.search_tools.signal.session_digest.stash.status.stratum_card.symbol.test_run.time.trace.watch.web_fetch.web_search.workset`.split(`.`),Zo=I(`structured-content-guard`);function Qo(){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=$o(r);n.structuredContent=t,i=`synthesize`,n.structuredContent??(n.structuredContent={},i=`synthesize-null-fallback`,Zo.error(`synthesizeStructuredContent returned null/undefined — using empty fallback`,{tool:e.toolName}))}let a=es(r,n.structuredContent);if(a.action!=null&&(n.structuredContent=a.structuredContent,i=a.action),ns(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),ts(r,n.structuredContent)===!1){let e=$o(r);n.structuredContent=e??{},ts(r,n.structuredContent)===!1?(n.structuredContent=ns(n.structuredContent)?n.structuredContent:{},i=`final-validation-failed`):i??=`final-heal`}return ns(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),i!=null&&(i===`synthesize`||i===`final-heal`?Zo.debug:Zo.warn)(`Structured content guard activated`,{tool:e.toolName,action:i}),n});return e.critical=!0,e}function $o(e){try{return rs(e)??{}}catch{return{}}}function es(e,t){if(ts(e,t)!==!1)return{structuredContent:t,action:null};try{let n=$o(e);if(ns(n)&&ns(t)){let r={...n,...t};if(ts(e,r)!==!1)return{structuredContent:r,action:`heal`}}return{structuredContent:n,action:`fallback-zero-value`}}catch{return{structuredContent:t,action:null}}}function ts(e,t){let n=e.safeParse;if(typeof n==`function`)try{return n(t).success}catch{return}}function ns(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function rs(e){if(!e)return{};if(e.anyOf){let t=e.anyOf.find(e=>e.type!==`null`);return t?rs(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]=rs(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]=rs(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 is(e){if(!e)return{};try{let t=rs(e);return ns(t)?t:{}}catch{return{}}}const as=Symbol(`toolPipelineState`);function os(e){return e[as]}function ss(e,t){e[as]=t}function cs(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=is(t),i.structuredContent??={},r)}:e}function ls(e,t,n=``){let r=os(e);if(r){r.pipeline=t,r.prefix=n;return}ss(e,{originalRegisterTool:e.registerTool.bind(e),pipeline:t,prefix:n}),e.registerTool=(n,r,i)=>{let a=os(e),o=a?.prefix?`${a.prefix}${n}`:n;if(!i)return a?.originalRegisterTool(o,r);let s=r?.outputSchema;if((a?.pipeline??t).getMiddlewareNames().length===0){let e=cs(i,s);return a?.originalRegisterTool(o,r,e)}let c=G(n),l=cs((a?.pipeline??t).wrap(n,i,r,c),s);return a?.originalRegisterTool(o,r,l)}}const us={analyze:1,audit:1,blast_radius:1,changelog:1,check:2,checkpoint:2,codemod:2,compact:1,config:0,data_transform:1,dead_symbols:1,delegate:3,describe_tool:1,diff_parse:1,digest:1,encode:1,env:0,eval:2,evidence_map:2,file_summary:1,find:1,flow:3,forge_classify:1,forge_ground:2,git_context:1,graph:1,guide:0,health:0,http:1,lane:2,list_tools:1,lookup:1,measure:1,onboard:3,parse_output:1,present:1,process:3,produce_knowledge:3,queue:3,regex_test:1,reindex:3,rename:2,replay:1,restore:2,schema_validate:1,scope_map:1,search:1,search_tools:1,signal:2,session_digest:2,stash:2,status:0,stratum_card:1,symbol:1,test_run:2,time:0,trace:1,watch:3,web_fetch:1,web_search:1,workset:2};function ds(e,t){return e.filter(e=>(us[e]??0)<=t)}const fs=new Set([`status`,`config`,`guide`,`health`]),ps={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:[`compact`,`file_summary`,`check`,`test_run`]},discovery:{description:`Full toolset plus discovery-oriented meta-tools for guided tool exploration`,includeCategories:[],includeTools:[`list_tools`,`describe_tool`,`search_tools`]}};function ms(e,t){let n=ps[e];if(n)return n;let r=t?.[e];if(r)return r;throw Error(`Unknown tool profile: ${e}`)}function hs(e,t,n){return t.includes(`*`)?!0:(n[e]?.category??[]).some(e=>t.includes(e))}function gs(e,t,n,r){if(t.includes(`*`)){for(let t of n)e.add(t);return}for(let i of n)hs(i,t,r)&&e.add(i)}function _s(e,t,n){if(t.includes(`*`)){e.clear();return}for(let r of[...e])hs(r,t,n)&&e.delete(r)}function vs(e,t,n){if(!e||e.length===0||e.includes(`*`))return new Set(t);let r=new Set;return gs(r,e,t,n),r}function ys(e,t){return e===void 0?t:t===void 0?e:Math.min(e,t)}function bs(e,t){for(let n of[...e])t[n]?.annotations?.readOnlyHint===!1&&e.delete(n)}function xs(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=ms(e,t);return ys(i.extends?xs(i.extends,t,n+1,[...r,e]):void 0,i.maxTier)}function Ss(e,t,n,r){let i=(e,a,o)=>{if(a>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...o,e].join(` -> `)}`);if(o.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...o,e].join(` -> `)}`);let s=ms(e,r),c=[...o,e],l=s.extends?i(s.extends,a+1,c):vs(s.includeCategories,t,n);s.extends&&s.includeCategories?.length&&gs(l,s.includeCategories,t,n),s.excludeCategories?.length&&_s(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=xs(e,r);if(o!==void 0){let e=ds([...a],o);a.clear();for(let t of e)a.add(t)}for(let e of fs)a.add(e);return e===`safe`&&bs(a,n),a}const Cs=new Set([`search`,`analysis`,`knowledge`,`compression`,`forge`,`presentation`,`execution`,`manipulation`,`session`,`git`,`process`,`system`,`meta`,`utilities`,`web`,`queue`,`flow`]);function ws(e,t,n,r){let i=process.env.AIKIT_TOOLSET||e.toolProfile||`full`,a=Ss(i,t,n,r);if(e.features&&e.features.length>0){let i=e.features.filter(e=>!Cs.has(e));if(i.length>0)throw Error(`Unknown feature group(s): ${i.join(`, `)}. Valid categories: ${[...Cs].join(`, `)}`);let o={description:`Synthetic profile from features config`,includeCategories:e.features},s=Ss(`_features`,t,n,{...r,_features:o});for(let e of a)!s.has(e)&&!fs.has(e)&&a.delete(e)}if(e.readOnly)for(let e of[...a])n[e]?.annotations?.readOnlyHint===!1&&!fs.has(e)&&a.delete(e);for(let e of fs)a.add(e);return i===`safe`&&bs(a,n),a}const Ts=z.object({mode:z.enum([`wasm`,`regex`,`unknown`]),reason:z.string(),pathsChecked:z.array(z.object({path:z.string(),exists:z.boolean()})),os:z.string(),arch:z.string(),nodeVersion:z.string(),webTreeSitterImportable:z.boolean(),healAttempted:z.boolean(),healSuccess:z.boolean(),healError:z.string().nullable(),initError:z.string().nullable(),wasmDir:z.string().nullable(),grammarCount:z.number()}),Es=z.object({kind:z.enum([`onboard`,`reindex`,`handoff`,`proceed`]),reason:z.string()}),Ds=z.object({title:z.string(),insight:z.string(),confidence:z.number()}),Os=z.object({lessons:z.array(Ds),conventions:z.array(z.object({title:z.string(),preview:z.string()})),checkpoint:z.string().nullable()}),ks=z.object({totalRecords:z.number(),totalFiles:z.number(),lastIndexedAt:z.string().nullable(),onboarded:z.boolean(),onboardDir:z.string(),contentTypes:z.record(z.string(),z.number()),wasmAvailable:z.boolean(),wasmDiagnostics:Ts,graphStats:z.object({nodes:z.number(),edges:z.number()}).nullable(),curatedCount:z.number(),serverVersion:z.string(),scaffoldVersion:z.string().nullable(),workspaceScaffoldVersion:z.string().nullable(),upgradeAvailable:z.boolean(),storeBackend:z.string().optional(),storeDiagnostics:z.object({adapterType:z.string(),vectorSearchEnabled:z.boolean(),ftsEnabled:z.boolean(),degradedMode:z.boolean(),dbPath:z.string(),dbSizeBytes:z.number().nullable(),embeddingDim:z.number(),vectorDtype:z.string()}).nullable().optional(),contextPressure:z.number().min(0).max(100).describe(`0–100 score indicating AI Kit saturation`),nextAction:Es,prelude:Os.nullable().optional()});z.object({entries:z.array(z.object({path:z.string(),title:z.string(),category:z.string(),tags:z.array(z.string()),version:z.number(),preview:z.string()})),totalCount:z.number()});const As=z.object({ok:z.boolean(),checks:z.array(z.object({name:z.string(),ok:z.boolean(),message:z.string().optional()}))}),js=z.object({summary:z.object({totalFiles:z.number(),totalLines:z.number(),totalCodeLines:z.number(),totalFunctions:z.number(),avgComplexity:z.number(),maxComplexity:z.object({value:z.number(),file:z.string()})}),files:z.array(z.object({path:z.string(),lines:z.number(),code:z.number(),complexity:z.number(),functions:z.number()}))}),Ms=z.object({platform:z.string(),arch:z.string(),nodeVersion:z.string(),cwd:z.string(),cpus:z.number(),memoryFreeGb:z.number(),memoryTotalGb:z.number()}),Ns=z.object({iso:z.string(),unix:z.number(),timezone:z.string(),formatted:z.string()}),Ps=z.object({passed:z.boolean(),errorCount:z.number(),warningCount:z.number(),topErrors:z.array(z.string())}),Fs=z.object({passed:z.boolean(),tsc:Ps,biome:Ps}),Is=z.object({name:z.string(),definedIn:z.object({path:z.string(),line:z.number(),kind:z.string(),signature:z.string().optional()}).nullable(),importedBy:z.array(z.object({path:z.string(),line:z.number(),importStatement:z.string()})),referencedIn:z.array(z.object({path:z.string(),line:z.number(),context:z.string(),scope:z.string().optional()})),graphContext:z.object({definingModule:z.string().optional(),importedByModules:z.array(z.string()),siblingSymbols:z.array(z.string())}).nullable()}),Ls=z.object({sourcePath:z.string(),contentType:z.string(),score:z.number(),headingPath:z.string().optional(),startLine:z.number().optional(),endLine:z.number().optional(),origin:z.string().optional(),category:z.string().optional(),tags:z.array(z.string()).optional()}),Rs=z.object({results:z.array(Ls),totalResults:z.number(),searchMode:z.string(),query:z.string(),ref:z.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),zs=z.object({path:z.string(),line:z.number().optional(),matchType:z.string(),preview:z.string()}),Bs=z.object({matches:z.array(zs),totalMatches:z.number(),pattern:z.string(),truncated:z.boolean(),ref:z.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Vs=z.object({path:z.string(),relevance:z.number(),estimatedTokens:z.number(),focusLines:z.array(z.string()).optional()}),Hs=z.object({files:z.array(Vs),totalFiles:z.number(),totalEstimatedTokens:z.number(),task:z.string()}),Us=z.object({path:z.string(),impact:z.string(),reason:z.string()}),Ws=z.object({changedFiles:z.array(z.string()),affectedFiles:z.array(Us),totalAffected:z.number(),riskLevel:z.string()}),Gs=z.object({name:z.string(),passed:z.boolean(),message:z.string().optional(),severity:z.string().optional()}),Ks=z.object({passed:z.boolean(),score:z.number(),checks:z.array(Gs),summary:z.string()}),qs=z.object({id:z.string(),name:z.string(),type:z.string(),sourcePath:z.string().optional()}),Js=z.object({fromId:z.string(),toId:z.string(),type:z.string()}),Ys=z.object({nodes:z.array(qs),edges:z.array(Js),totalNodes:z.number(),totalEdges:z.number(),query:z.string()}),Xs=z.object({symbols:z.array(z.object({name:z.string(),path:z.string(),line:z.number().optional(),kind:z.string()})),totalDead:z.number()});z.object({files:z.number(),packages:z.number(),languages:z.record(z.string(),z.number()),tree:z.string()});const Zs=z.object({path:z.string(),language:z.string(),lines:z.number(),imports:z.number(),exports:z.number(),functions:z.number(),classes:z.number()}),Qs=z.object({gitRoot:z.string(),branch:z.string(),commitCount:z.number(),hasUncommitted:z.boolean(),recentCommits:z.array(z.object({hash:z.string(),message:z.string(),author:z.string(),date:z.string()}))}),$s=z.object({text:z.string().describe(`The compressed text output`),ref:z.string().optional().describe(`Reusable cache reference`),originalChars:z.number(),compressedChars:z.number(),ratio:z.number(),segmentsKept:z.number(),segmentsTotal:z.number()}),ec=z.object({sourceId:z.string(),value:z.string()}),tc=z.object({id:z.string(),originalChars:z.number(),keptChars:z.number(),segmentsKept:z.number(),segmentsTotal:z.number()}),nc=z.object({text:z.string().describe(`The compressed digest text output`),ref:z.string().optional().describe(`Reusable cache reference`),fields:z.record(z.string(),z.array(ec)),sourceStats:z.array(tc),totalOriginalChars:z.number(),totalCompressedChars:z.number(),ratio:z.number()}),rc=z.object({passed:z.boolean(),totalTests:z.number(),passedTests:z.number(),failedTests:z.number(),skippedTests:z.number(),duration:z.number().describe(`Duration in milliseconds`),failures:z.array(z.object({name:z.string(),message:z.string(),file:z.string().optional()}))}),ic=I(`utils:enrich`);async function K(e,t){let n={curated:[],graph:[]},r=t.limit??3,[i,a]=await Promise.allSettled([ac(e,t.query,r),oc(e,t.filePath)]);return i.status===`fulfilled`?n.curated=i.value:ic.debug(`Curated enrichment failed`,{error:i.reason}),a.status===`fulfilled`?n.graph=a.value:ic.debug(`Graph enrichment failed`,{error:a.reason}),n}async function ac(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=>sc(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=>sc(e.record))}return[]}catch(e){return ic.debug(`Curated enrichment failed`,{error:e}),[]}}async function oc(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 ic.debug(`Graph enrichment failed`,{error:e}),[]}}function q(e){let t=[];if(e.curated.length>0){t.push(`**Curated Knowledge:**`);for(let n of e.curated)t.push(`- ${n}`)}if(e.graph.length>0){t.push(`**Graph Context:**`);for(let n of e.graph)t.push(`- ${n}`)}return t.length===0?``:`\n\n---\n### Enrichment\n${t.join(`
27
+ `),mimeType:`text/plain`}]})),e.registerResource(`aikit-channel-surface-schema`,Ro,{description:`JSON Schema for the ChannelSurface communication contract`,mimeType:`application/schema+json`},async()=>({contents:[{uri:Ro,text:await Vo(),mimeType:`application/schema+json`}]})),Lo(e,n)}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=new Set(`browser.changelog.check.compliance_score.checkpoint.codemod.compact.config.data_transform.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.forge_classify.git_context.graph.guide.health.http.knowledge.lane.measure.onboard.parse_output.present.process.produce_knowledge.queue.regex_test.reindex.rename.replay.restore.schema_validate.session_digest.scope_map.stash.status.stratum_card.signal.test_run.time.watch.web_fetch.web_search.workset`.split(`.`)),Jo=5e3,Yo=new Set(`browser.changelog.check.compliance_score.checkpoint.codemod.data_transform.delegate.diff_parse.encode.env.eval.evidence_map.flow.describe_tool.list_tools.search_tools.forge_classify.git_context.guide.present.health.http.lane.measure.parse_output.process.produce_knowledge.queue.regex_test.rename.replay.restore.schema_validate.session_digest.status.test_run.time.watch.web_fetch.web_search.workset`.split(`.`)),Xo=`analyze.audit.blast_radius.browser.changelog.check.compliance_score.checkpoint.codemod.compact.config.data_transform.dead_symbols.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.find.flow.forge_classify.forge_ground.git_context.graph.guide.health.http.knowledge.memory_explain.lane.describe_tool.list_tools.lookup.measure.onboard.parse_output.present.process.produce_knowledge.queue.regex_test.reindex.rename.replay.restore.schema_validate.scope_map.search.search_tools.signal.session_digest.stash.status.stratum_card.symbol.test_run.time.trace.watch.web_fetch.web_search.workset`.split(`.`),Zo=I(`structured-content-guard`);function Qo(){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=$o(r);n.structuredContent=t,i=`synthesize`,n.structuredContent??(n.structuredContent={},i=`synthesize-null-fallback`,Zo.error(`synthesizeStructuredContent returned null/undefined — using empty fallback`,{tool:e.toolName}))}let a=es(r,n.structuredContent);if(a.action!=null&&(n.structuredContent=a.structuredContent,i=a.action),ns(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),ts(r,n.structuredContent)===!1){let e=$o(r);n.structuredContent=e??{},ts(r,n.structuredContent)===!1?(n.structuredContent=ns(n.structuredContent)?n.structuredContent:{},i=`final-validation-failed`):i??=`final-heal`}return ns(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),i!=null&&(i===`synthesize`||i===`final-heal`?Zo.debug:Zo.warn)(`Structured content guard activated`,{tool:e.toolName,action:i}),n});return e.critical=!0,e}function $o(e){try{return rs(e)??{}}catch{return{}}}function es(e,t){if(ts(e,t)!==!1)return{structuredContent:t,action:null};try{let n=$o(e);if(ns(n)&&ns(t)){let r={...n,...t};if(ts(e,r)!==!1)return{structuredContent:r,action:`heal`}}return{structuredContent:n,action:`fallback-zero-value`}}catch{return{structuredContent:t,action:null}}}function ts(e,t){let n=e.safeParse;if(typeof n==`function`)try{return n(t).success}catch{return}}function ns(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function rs(e){if(!e)return{};if(e.anyOf){let t=e.anyOf.find(e=>e.type!==`null`);return t?rs(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]=rs(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]=rs(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 is(e){if(!e)return{};try{let t=rs(e);return ns(t)?t:{}}catch{return{}}}const as=Symbol(`toolPipelineState`);function os(e){return e[as]}function ss(e,t){e[as]=t}function cs(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=is(t),i.structuredContent??={},r)}:e}function ls(e,t,n=``){let r=os(e);if(r){r.pipeline=t,r.prefix=n;return}ss(e,{originalRegisterTool:e.registerTool.bind(e),pipeline:t,prefix:n}),e.registerTool=(n,r,i)=>{let a=os(e),o=a?.prefix?`${a.prefix}${n}`:n;if(!i)return a?.originalRegisterTool(o,r);let s=r?.outputSchema;if((a?.pipeline??t).getMiddlewareNames().length===0){let e=cs(i,s);return a?.originalRegisterTool(o,r,e)}let c=G(n),l=cs((a?.pipeline??t).wrap(n,i,r,c),s);return a?.originalRegisterTool(o,r,l)}}const us={analyze:1,audit:1,blast_radius:1,changelog:1,check:2,checkpoint:2,codemod:2,compact:1,config:0,data_transform:1,dead_symbols:1,delegate:3,describe_tool:1,diff_parse:1,digest:1,encode:1,env:0,eval:2,evidence_map:2,file_summary:1,find:1,flow:3,forge_classify:1,forge_ground:2,git_context:1,graph:1,guide:0,health:0,http:1,lane:2,list_tools:1,lookup:1,measure:1,onboard:3,parse_output:1,present:1,process:3,produce_knowledge:3,queue:3,regex_test:1,reindex:3,rename:2,replay:1,restore:2,schema_validate:1,scope_map:1,search:1,search_tools:1,signal:2,session_digest:2,stash:2,status:0,stratum_card:1,symbol:1,test_run:2,time:0,trace:1,watch:3,web_fetch:1,web_search:1,workset:2};function ds(e,t){return e.filter(e=>(us[e]??0)<=t)}const fs=new Set([`status`,`config`,`guide`,`health`]),ps={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:[`compact`,`file_summary`,`check`,`test_run`]},discovery:{description:`Full toolset plus discovery-oriented meta-tools for guided tool exploration`,includeCategories:[],includeTools:[`list_tools`,`describe_tool`,`search_tools`]}};function ms(e,t){let n=ps[e];if(n)return n;let r=t?.[e];if(r)return r;throw Error(`Unknown tool profile: ${e}`)}function hs(e,t,n){return t.includes(`*`)?!0:(n[e]?.category??[]).some(e=>t.includes(e))}function gs(e,t,n,r){if(t.includes(`*`)){for(let t of n)e.add(t);return}for(let i of n)hs(i,t,r)&&e.add(i)}function _s(e,t,n){if(t.includes(`*`)){e.clear();return}for(let r of[...e])hs(r,t,n)&&e.delete(r)}function vs(e,t,n){if(!e||e.length===0||e.includes(`*`))return new Set(t);let r=new Set;return gs(r,e,t,n),r}function ys(e,t){return e===void 0?t:t===void 0?e:Math.min(e,t)}function bs(e,t){for(let n of[...e])t[n]?.annotations?.readOnlyHint===!1&&e.delete(n)}function xs(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=ms(e,t);return ys(i.extends?xs(i.extends,t,n+1,[...r,e]):void 0,i.maxTier)}function Ss(e,t,n,r){let i=(e,a,o)=>{if(a>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...o,e].join(` -> `)}`);if(o.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...o,e].join(` -> `)}`);let s=ms(e,r),c=[...o,e],l=s.extends?i(s.extends,a+1,c):vs(s.includeCategories,t,n);s.extends&&s.includeCategories?.length&&gs(l,s.includeCategories,t,n),s.excludeCategories?.length&&_s(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=xs(e,r);if(o!==void 0){let e=ds([...a],o);a.clear();for(let t of e)a.add(t)}for(let e of fs)a.add(e);return e===`safe`&&bs(a,n),a}const Cs=new Set([`search`,`analysis`,`knowledge`,`compression`,`forge`,`presentation`,`execution`,`manipulation`,`session`,`git`,`process`,`system`,`meta`,`utilities`,`web`,`queue`,`flow`]);function ws(e,t,n,r){let i=process.env.AIKIT_TOOLSET||e.toolProfile||`full`,a=Ss(i,t,n,r);if(e.features&&e.features.length>0){let i=e.features.filter(e=>!Cs.has(e));if(i.length>0)throw Error(`Unknown feature group(s): ${i.join(`, `)}. Valid categories: ${[...Cs].join(`, `)}`);let o={description:`Synthetic profile from features config`,includeCategories:e.features},s=Ss(`_features`,t,n,{...r,_features:o});for(let e of a)!s.has(e)&&!fs.has(e)&&a.delete(e)}if(e.readOnly)for(let e of[...a])n[e]?.annotations?.readOnlyHint===!1&&!fs.has(e)&&a.delete(e);for(let e of fs)a.add(e);return i===`safe`&&bs(a,n),a}const Ts=z.object({mode:z.enum([`wasm`,`regex`,`unknown`]),reason:z.string(),pathsChecked:z.array(z.object({path:z.string(),exists:z.boolean()})),os:z.string(),arch:z.string(),nodeVersion:z.string(),webTreeSitterImportable:z.boolean(),healAttempted:z.boolean(),healSuccess:z.boolean(),healError:z.string().nullable(),initError:z.string().nullable(),wasmDir:z.string().nullable(),grammarCount:z.number()}),Es=z.object({kind:z.enum([`onboard`,`reindex`,`handoff`,`proceed`]),reason:z.string()}),Ds=z.object({title:z.string(),insight:z.string(),confidence:z.number()}),Os=z.object({lessons:z.array(Ds),conventions:z.array(z.object({title:z.string(),preview:z.string()})),checkpoint:z.string().nullable()}),ks=z.object({totalRecords:z.number(),totalFiles:z.number(),lastIndexedAt:z.string().nullable(),onboarded:z.boolean(),onboardDir:z.string(),contentTypes:z.record(z.string(),z.number()),wasmAvailable:z.boolean(),wasmDiagnostics:Ts,graphStats:z.object({nodes:z.number(),edges:z.number()}).nullable(),curatedCount:z.number(),serverVersion:z.string(),scaffoldVersion:z.string().nullable(),workspaceScaffoldVersion:z.string().nullable(),upgradeAvailable:z.boolean(),sessionTokens:z.object({callCount:z.number(),totalInputChars:z.number(),totalOutputChars:z.number(),estInputTokens:z.number(),estTotalTokens:z.number(),startTime:z.string()}).optional(),storeBackend:z.string().optional(),storeDiagnostics:z.object({adapterType:z.string(),vectorSearchEnabled:z.boolean(),ftsEnabled:z.boolean(),degradedMode:z.boolean(),dbPath:z.string(),dbSizeBytes:z.number().nullable(),embeddingDim:z.number(),vectorDtype:z.string()}).nullable().optional(),contextPressure:z.number().min(0).max(100).describe(`0–100 score indicating AI Kit saturation`),nextAction:Es,prelude:Os.nullable().optional()});z.object({entries:z.array(z.object({path:z.string(),title:z.string(),category:z.string(),tags:z.array(z.string()),version:z.number(),preview:z.string()})),totalCount:z.number()});const As=z.object({ok:z.boolean(),checks:z.array(z.object({name:z.string(),ok:z.boolean(),message:z.string().optional()}))}),js=z.object({summary:z.object({totalFiles:z.number(),totalLines:z.number(),totalCodeLines:z.number(),totalFunctions:z.number(),avgComplexity:z.number(),maxComplexity:z.object({value:z.number(),file:z.string()})}),files:z.array(z.object({path:z.string(),lines:z.number(),code:z.number(),complexity:z.number(),functions:z.number()}))}),Ms=z.object({platform:z.string(),arch:z.string(),nodeVersion:z.string(),cwd:z.string(),cpus:z.number(),memoryFreeGb:z.number(),memoryTotalGb:z.number()}),Ns=z.object({iso:z.string(),unix:z.number(),timezone:z.string(),formatted:z.string()}),Ps=z.object({passed:z.boolean(),errorCount:z.number(),warningCount:z.number(),topErrors:z.array(z.string())}),Fs=z.object({passed:z.boolean(),tsc:Ps,biome:Ps}),Is=z.object({name:z.string(),definedIn:z.object({path:z.string(),line:z.number(),kind:z.string(),signature:z.string().optional()}).nullable(),importedBy:z.array(z.object({path:z.string(),line:z.number(),importStatement:z.string()})),referencedIn:z.array(z.object({path:z.string(),line:z.number(),context:z.string(),scope:z.string().optional()})),graphContext:z.object({definingModule:z.string().optional(),importedByModules:z.array(z.string()),siblingSymbols:z.array(z.string())}).nullable()}),Ls=z.object({sourcePath:z.string(),contentType:z.string(),score:z.number(),headingPath:z.string().optional(),startLine:z.number().optional(),endLine:z.number().optional(),origin:z.string().optional(),category:z.string().optional(),tags:z.array(z.string()).optional()}),Rs=z.object({results:z.array(Ls),totalResults:z.number(),searchMode:z.string(),query:z.string(),ref:z.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),zs=z.object({path:z.string(),line:z.number().optional(),matchType:z.string(),preview:z.string()}),Bs=z.object({matches:z.array(zs),totalMatches:z.number(),pattern:z.string(),truncated:z.boolean(),ref:z.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Vs=z.object({path:z.string(),relevance:z.number(),estimatedTokens:z.number(),focusLines:z.array(z.string()).optional()}),Hs=z.object({files:z.array(Vs),totalFiles:z.number(),totalEstimatedTokens:z.number(),task:z.string()}),Us=z.object({path:z.string(),impact:z.string(),reason:z.string()}),Ws=z.object({changedFiles:z.array(z.string()),affectedFiles:z.array(Us),totalAffected:z.number(),riskLevel:z.string()}),Gs=z.object({name:z.string(),passed:z.boolean(),message:z.string().optional(),severity:z.string().optional()}),Ks=z.object({passed:z.boolean(),score:z.number(),checks:z.array(Gs),summary:z.string()}),qs=z.object({id:z.string(),name:z.string(),type:z.string(),sourcePath:z.string().optional()}),Js=z.object({fromId:z.string(),toId:z.string(),type:z.string()}),Ys=z.object({nodes:z.array(qs),edges:z.array(Js),totalNodes:z.number(),totalEdges:z.number(),query:z.string()}),Xs=z.object({symbols:z.array(z.object({name:z.string(),path:z.string(),line:z.number().optional(),kind:z.string()})),totalDead:z.number()});z.object({files:z.number(),packages:z.number(),languages:z.record(z.string(),z.number()),tree:z.string()});const Zs=z.object({path:z.string(),language:z.string(),lines:z.number(),imports:z.number(),exports:z.number(),functions:z.number(),classes:z.number()}),Qs=z.object({gitRoot:z.string(),branch:z.string(),commitCount:z.number(),hasUncommitted:z.boolean(),recentCommits:z.array(z.object({hash:z.string(),message:z.string(),author:z.string(),date:z.string()}))}),$s=z.object({text:z.string().describe(`The compressed text output`),ref:z.string().optional().describe(`Reusable cache reference`),originalChars:z.number(),compressedChars:z.number(),ratio:z.number(),segmentsKept:z.number(),segmentsTotal:z.number()}),ec=z.object({sourceId:z.string(),value:z.string()}),tc=z.object({id:z.string(),originalChars:z.number(),keptChars:z.number(),segmentsKept:z.number(),segmentsTotal:z.number()}),nc=z.object({text:z.string().describe(`The compressed digest text output`),ref:z.string().optional().describe(`Reusable cache reference`),fields:z.record(z.string(),z.array(ec)),sourceStats:z.array(tc),totalOriginalChars:z.number(),totalCompressedChars:z.number(),ratio:z.number()}),rc=z.object({passed:z.boolean(),totalTests:z.number(),passedTests:z.number(),failedTests:z.number(),skippedTests:z.number(),duration:z.number().describe(`Duration in milliseconds`),failures:z.array(z.object({name:z.string(),message:z.string(),file:z.string().optional()}))}),ic=I(`utils:enrich`);async function K(e,t){let n={curated:[],graph:[]},r=t.limit??3,[i,a]=await Promise.allSettled([ac(e,t.query,r),oc(e,t.filePath)]);return i.status===`fulfilled`?n.curated=i.value:ic.debug(`Curated enrichment failed`,{error:i.reason}),a.status===`fulfilled`?n.graph=a.value:ic.debug(`Graph enrichment failed`,{error:a.reason}),n}async function ac(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=>sc(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=>sc(e.record))}return[]}catch(e){return ic.debug(`Curated enrichment failed`,{error:e}),[]}}async function oc(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 ic.debug(`Graph enrichment failed`,{error:e}),[]}}function q(e){let t=[];if(e.curated.length>0){t.push(`**Curated Knowledge:**`);for(let n of e.curated)t.push(`- ${n}`)}if(e.graph.length>0){t.push(`**Graph Context:**`);for(let n of e.graph)t.push(`- ${n}`)}return t.length===0?``:`\n\n---\n### Enrichment\n${t.join(`
28
28
  `)}`}function sc(e){let t=cc(e.metadata,`title`)||e.sourcePath||`Untitled`;return`[${cc(e.metadata,`category`)}] ${t}: ${e.content.slice(0,200)}`}function cc(e,t){let n=e?.[t];return typeof n==`string`?n:``}function J(e,t,n){return{content:[{type:`text`,text:`[ERROR:${e}] ${t}`}],isError:!0,...n==null?{}:{structuredContent:n}}}function Y(e,t){return async(n,r)=>{let i=Date.now(),a=await t(n,r),o=Date.now()-i;return a._meta={...a._meta??{},durationMs:o,toolName:e},a}}const lc=I(`tools`),uc=z.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`);function dc(e,t){return t?R(e,t):e}function fc(){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 pc(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 mc(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(`
29
29
 
30
30
  ### 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(`
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{n as e,t}from"./bin.js";import{a as n,i as r,n as i,o as a,r as o,s}from"./retention-C3tsarCT.js";import{a as c,c as l,d as u,f as d,h as f,i as p,l as m,m as h,n as g,o as _,p as v,r as y,s as b,u as x}from"./supersession-DO_ZROFl.js";import{n as S,r as C}from"./resolve-sibling-ByoHo7Tp.js";import{n as w,r as T}from"./evolution-DWaEE6XW.js";import{a as E,i as D,n as O,r as k,s as ee,t as te}from"./promotion-CJFYv4Ye.js";import{autoUpgradeScaffold as ne,getCurrentVersion as re,getUpgradeState as ie}from"./version-check-CgfflkJX.js";import{createRequire as ae}from"node:module";import{createHash as A,randomBytes as oe,randomUUID as se,timingSafeEqual as ce}from"node:crypto";import{existsSync as j,mkdirSync as M,readFileSync as N,readdirSync as le,renameSync as ue,rmSync as de,statSync as fe,unlinkSync as pe,writeFileSync as me}from"node:fs";import{basename as he,dirname as ge,isAbsolute as _e,join as P,relative as ve,resolve as F,sep as ye}from"node:path";import{fileURLToPath as be}from"node:url";import{promisify as xe}from"node:util";import{AIKIT_PATHS as Se,CONTENT_TYPES as Ce,CircuitBreaker as we,EMBEDDING_DEFAULTS as Te,HealthBus as Ee,KNOWLEDGE_ORIGINS as De,SOURCE_TYPES as Oe,TOKEN_BUDGETS as ke,addLogListener as Ae,computePartitionKey as je,createLogger as I,getGlobalDataDir as Me,getPartitionDir as Ne,isUserInstalled as Pe,listWorkspaces as Fe,serializeError as L}from"../../core/dist/index.js";import{FileCache as Ie,acquireLease as Le,addToWorkset as Re,audit as ze,bookendReorder as Be,changelog as Ve,check as He,checkpointDiff as Ue,checkpointGC as We,checkpointHistory as Ge,checkpointLatest as Ke,checkpointList as qe,checkpointLoad as Je,checkpointSave as Ye,codemod as Xe,compact as Ze,compressTerminalOutput as Qe,createRestorePoint as $e,createSearchSuccessResponse as et,dataTransform as tt,delegate as nt,delegateListModels as rt,deleteWorkset as it,diffParse as at,digest as ot,encode as st,ensureLegacyStashImported as ct,envInfo as lt,evaluate as ut,evidenceMap as dt,fileSummary as ft,find as pt,findDeadSymbols as mt,findExamples as ht,forgeClassify as gt,forgeGround as _t,getWorkset as vt,gitContext as yt,graphAugmentSearch as bt,graphQuery as xt,guide as St,health as Ct,httpRequest as wt,laneCreate as Tt,laneDiff as Et,laneDiscard as Dt,laneList as Ot,laneMerge as kt,laneStatus as At,listActiveLeases as jt,listRestorePoints as Mt,listWorksets as Nt,measure as Pt,onboard as Ft,parseOutput as It,processList as Lt,processLogs as Rt,processStart as zt,processStatus as Bt,processStop as Vt,queueClear as Ht,queueCreate as Ut,queueDag as Wt,queueDelete as Gt,queueDone as Kt,queueFail as qt,queueGet as Jt,queueList as Yt,queueNext as Xt,queuePush as Zt,regexTest as Qt,releaseLease as $t,removeFromWorkset as en,rename as tn,replayAppend as nn,replayClear as rn,replayList as an,replayTrim as on,restoreFromPoint as sn,saveWorkset as cn,schemaValidate as ln,scopeMap as un,scoreCompliance as dn,sessionDigest as fn,sessionDigestSampling as pn,stashClear as mn,stashDelete as hn,stashGet as gn,stashList as _n,stashSet as vn,storeReversibleContext as yn,stratumCard as bn,summarizeCheckResult as xn,symbol as Sn,testRun as Cn,timeUtils as wn,trace as Tn,truncateToTokenBudget as R,watchList as En,watchStart as Dn,watchStop as On,webFetch as kn,webSearch as An}from"../../tools/dist/index.js";import{mkdir as jn,readFile as Mn,readdir as Nn,rm as Pn,stat as Fn,unlink as In,writeFile as Ln}from"node:fs/promises";import{homedir as Rn,tmpdir as zn}from"node:os";import{McpServer as Bn,ResourceTemplate as Vn}from"@modelcontextprotocol/sdk/server/mcp.js";import{buildFormSchema as Hn,field as Un,normalizeResponse as Wn}from"../../elicitation/dist/index.js";import{completable as Gn}from"@modelcontextprotocol/sdk/server/completable.js";import{z}from"zod";import{getEngine as Kn,registerBrowserTools as qn}from"../../browser/dist/index.js";import{BlastRadiusAnalyzer as Jn,DependencyAnalyzer as Yn,DiagramGenerator as Xn,EntryPointAnalyzer as Zn,KnowledgeProducer as Qn,PatternAnalyzer as $n,StructureAnalyzer as er,SymbolAnalyzer as tr}from"../../analyzers/dist/index.js";import{WasmDiagnostics as nr,WasmRuntime as rr,initializeWasm as ir}from"../../chunker/dist/index.js";import{ERCache as ar,ERClient as or,EvolutionCollector as sr,PolicyStore as cr,PushAdapter as lr,mergeResults as ur}from"../../enterprise-bridge/dist/index.js";import"../../tool-routing/dist/index.mjs";import{RESOURCE_MIME_TYPE as dr,getUiCapability as fr,registerAppResource as pr,registerAppTool as mr}from"@modelcontextprotocol/ext-apps/server";import{SqliteGraphStore as hr,allMigrations as gr,createSqliteAdapter as _r,createStateStore as vr,createStore as yr,runMigrations as br}from"../../store/dist/index.js";import{execFile as xr,execSync as Sr}from"node:child_process";import{TemplateRegistry as Cr,buildShell as wr,dashboardTemplateDefinition as Tr,defaultRegistry as Er,flameGraphTemplateDefinition as Dr,isError as Or,isResult as kr,kanbanTemplateDefinition as Ar,listSortTemplateDefinition as jr,renderSurface as Mr}from"../../blocks-core/dist/index.mjs";import{createServer as Nr}from"node:http";import{EmbedderProxy as Pr}from"../../embeddings/dist/index.js";import{FileHashCache as Fr,IncrementalIndexer as Ir}from"../../indexer/dist/index.js";function Lr(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 Wn(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,Hn({confirmed:Un.confirm(e)}));return t?.action===`accept`&&t.content?.confirmed===!0},async selectOne(e,t){let r=await n(e,Hn({selection:Un.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,Hn({selections:Un.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,Hn({text:Un.text(e,{description:t})}));if(r?.action!==`accept`)return null;let i=r.content?.text;return typeof i==`string`?i:null}}}const Rr={debug:`debug`,info:`info`,warn:`warning`,error:`error`};function zr(e){return Ae(({level:t,component:n,message:r,data:i})=>{try{Promise.resolve(e.sendLoggingMessage({level:Rr[t],logger:n,data:i?{message:r,...i}:r})).catch(()=>{})}catch{}})}const Br=3e4,Vr=new Map;function Hr(e,t,n){let r=Vr.get(e);if(r&&Date.now()<r.expires)return Promise.resolve(r.data);let i=n();return Promise.resolve(i).then(n=>(Vr.set(e,{data:n,expires:Date.now()+t}),n))}function Ur(){Vr.clear()}function Wr(e,t){return Hr(`curated-paths`,Br,async()=>(await e.list()).map(e=>e.path)).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Gr(e,t){return Hr(`file-paths`,Br,()=>e.listSourcePaths()).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Kr(e,t){return Hr(`symbol-names`,Br,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 qr(e,t){return t?_n(t).map(e=>e.key).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Jr(e){return Nt().map(e=>e.name).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20)}function Yr(e,t){return t?qe(t).map(e=>e.label).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Xr(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{n as e,t}from"./bin.js";import{a as n,i as r,n as i,o as a,r as o,s}from"./retention-C3tsarCT.js";import{a as c,c as l,d as u,f as d,h as f,i as p,l as m,m as h,n as g,o as _,p as v,r as y,s as b,u as x}from"./supersession-DO_ZROFl.js";import{n as S,r as C}from"./resolve-sibling-ByoHo7Tp.js";import{n as w,r as T}from"./evolution-DWaEE6XW.js";import{a as E,i as D,n as O,r as k,s as ee,t as te}from"./promotion-CJFYv4Ye.js";import{autoUpgradeScaffold as ne,getCurrentVersion as re,getUpgradeState as ie}from"./version-check-BhvsN1fC.js";import{createRequire as ae}from"node:module";import{createHash as A,randomBytes as oe,randomUUID as se,timingSafeEqual as ce}from"node:crypto";import{existsSync as j,mkdirSync as M,readFileSync as N,readdirSync as le,renameSync as ue,rmSync as de,statSync as fe,unlinkSync as pe,writeFileSync as me}from"node:fs";import{basename as he,dirname as ge,isAbsolute as _e,join as P,relative as ve,resolve as F,sep as ye}from"node:path";import{fileURLToPath as be}from"node:url";import{promisify as xe}from"node:util";import{AIKIT_PATHS as Se,CONTENT_TYPES as Ce,CircuitBreaker as we,EMBEDDING_DEFAULTS as Te,HealthBus as Ee,KNOWLEDGE_ORIGINS as De,SOURCE_TYPES as Oe,TOKEN_BUDGETS as ke,addLogListener as Ae,computePartitionKey as je,createLogger as I,getGlobalDataDir as Me,getPartitionDir as Ne,isUserInstalled as Pe,listWorkspaces as Fe,serializeError as L}from"../../core/dist/index.js";import{FileCache as Ie,acquireLease as Le,addToWorkset as Re,audit as ze,bookendReorder as Be,changelog as Ve,check as He,checkpointDiff as Ue,checkpointGC as We,checkpointHistory as Ge,checkpointLatest as Ke,checkpointList as qe,checkpointLoad as Je,checkpointSave as Ye,codemod as Xe,compact as Ze,compressTerminalOutput as Qe,createRestorePoint as $e,createSearchSuccessResponse as et,dataTransform as tt,delegate as nt,delegateListModels as rt,deleteWorkset as it,diffParse as at,digest as ot,encode as st,ensureLegacyStashImported as ct,envInfo as lt,evaluate as ut,evidenceMap as dt,fileSummary as ft,find as pt,findDeadSymbols as mt,findExamples as ht,forgeClassify as gt,forgeGround as _t,getWorkset as vt,gitContext as yt,graphAugmentSearch as bt,graphQuery as xt,guide as St,health as Ct,httpRequest as wt,laneCreate as Tt,laneDiff as Et,laneDiscard as Dt,laneList as Ot,laneMerge as kt,laneStatus as At,listActiveLeases as jt,listRestorePoints as Mt,listWorksets as Nt,measure as Pt,onboard as Ft,parseOutput as It,processList as Lt,processLogs as Rt,processStart as zt,processStatus as Bt,processStop as Vt,queueClear as Ht,queueCreate as Ut,queueDag as Wt,queueDelete as Gt,queueDone as Kt,queueFail as qt,queueGet as Jt,queueList as Yt,queueNext as Xt,queuePush as Zt,regexTest as Qt,releaseLease as $t,removeFromWorkset as en,rename as tn,replayAppend as nn,replayClear as rn,replayList as an,replayTrim as on,restoreFromPoint as sn,saveWorkset as cn,schemaValidate as ln,scopeMap as un,scoreCompliance as dn,sessionDigest as fn,sessionDigestSampling as pn,stashClear as mn,stashDelete as hn,stashGet as gn,stashList as _n,stashSet as vn,storeReversibleContext as yn,stratumCard as bn,summarizeCheckResult as xn,symbol as Sn,testRun as Cn,timeUtils as wn,trace as Tn,truncateToTokenBudget as R,watchList as En,watchStart as Dn,watchStop as On,webFetch as kn,webSearch as An}from"../../tools/dist/index.js";import{mkdir as jn,readFile as Mn,readdir as Nn,rm as Pn,stat as Fn,unlink as In,writeFile as Ln}from"node:fs/promises";import{homedir as Rn,tmpdir as zn}from"node:os";import{McpServer as Bn,ResourceTemplate as Vn}from"@modelcontextprotocol/sdk/server/mcp.js";import{buildFormSchema as Hn,field as Un,normalizeResponse as Wn}from"../../elicitation/dist/index.js";import{completable as Gn}from"@modelcontextprotocol/sdk/server/completable.js";import{z}from"zod";import{getEngine as Kn,registerBrowserTools as qn}from"../../browser/dist/index.js";import{BlastRadiusAnalyzer as Jn,DependencyAnalyzer as Yn,DiagramGenerator as Xn,EntryPointAnalyzer as Zn,KnowledgeProducer as Qn,PatternAnalyzer as $n,StructureAnalyzer as er,SymbolAnalyzer as tr}from"../../analyzers/dist/index.js";import{WasmDiagnostics as nr,WasmRuntime as rr,initializeWasm as ir}from"../../chunker/dist/index.js";import{ERCache as ar,ERClient as or,EvolutionCollector as sr,PolicyStore as cr,PushAdapter as lr,mergeResults as ur}from"../../enterprise-bridge/dist/index.js";import"../../tool-routing/dist/index.mjs";import{RESOURCE_MIME_TYPE as dr,getUiCapability as fr,registerAppResource as pr,registerAppTool as mr}from"@modelcontextprotocol/ext-apps/server";import{SqliteGraphStore as hr,allMigrations as gr,createSqliteAdapter as _r,createStateStore as vr,createStore as yr,runMigrations as br}from"../../store/dist/index.js";import{execFile as xr,execSync as Sr}from"node:child_process";import{TemplateRegistry as Cr,buildShell as wr,dashboardTemplateDefinition as Tr,defaultRegistry as Er,flameGraphTemplateDefinition as Dr,isError as Or,isResult as kr,kanbanTemplateDefinition as Ar,listSortTemplateDefinition as jr,renderSurface as Mr}from"../../blocks-core/dist/index.mjs";import{createServer as Nr}from"node:http";import{EmbedderProxy as Pr}from"../../embeddings/dist/index.js";import{FileHashCache as Fr,IncrementalIndexer as Ir}from"../../indexer/dist/index.js";function Lr(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 Wn(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,Hn({confirmed:Un.confirm(e)}));return t?.action===`accept`&&t.content?.confirmed===!0},async selectOne(e,t){let r=await n(e,Hn({selection:Un.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,Hn({selections:Un.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,Hn({text:Un.text(e,{description:t})}));if(r?.action!==`accept`)return null;let i=r.content?.text;return typeof i==`string`?i:null}}}const Rr={debug:`debug`,info:`info`,warn:`warning`,error:`error`};function zr(e){return Ae(({level:t,component:n,message:r,data:i})=>{try{Promise.resolve(e.sendLoggingMessage({level:Rr[t],logger:n,data:i?{message:r,...i}:r})).catch(()=>{})}catch{}})}const Br=3e4,Vr=new Map;function Hr(e,t,n){let r=Vr.get(e);if(r&&Date.now()<r.expires)return Promise.resolve(r.data);let i=n();return Promise.resolve(i).then(n=>(Vr.set(e,{data:n,expires:Date.now()+t}),n))}function Ur(){Vr.clear()}function Wr(e,t){return Hr(`curated-paths`,Br,async()=>(await e.list()).map(e=>e.path)).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Gr(e,t){return Hr(`file-paths`,Br,()=>e.listSourcePaths()).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Kr(e,t){return Hr(`symbol-names`,Br,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 qr(e,t){return t?_n(t).map(e=>e.key).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Jr(e){return Nt().map(e=>e.name).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20)}function Yr(e,t){return t?qe(t).map(e=>e.label).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Xr(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:z.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:z.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: "conventions" })` — 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(`
@@ -25,7 +25,7 @@ import{n as e,t}from"./bin.js";import{a as n,i as r,n as i,o as a,r as o,s}from"
25
25
  `),r=await this.curatedStore.remember(t,n,`context`,[`observation`,`source-${e.source}`,`type-${e.type}`]);this.stateStore.memoryMetaCreate(r.path,`working`)}};function Xa(e){let t=[e.cwd,e.workspace,e.root_path,e.path];for(let e of t)if(typeof e==`string`&&e.length>0)return e}function Za(e){return async(t,n)=>{let r=await n();try{await e.processToolResult(t.toolName,r,{workspace:Xa(t.args),args:t.args})}catch(e){Ia.warn(`Observation capture failed`,{toolName:t.toolName,requestId:t.requestId,error:e instanceof Error?e.message:String(e)})}return r}}const Qa=I(`procedural-memory`),$a=`Use when these user-facing tools are run in this order within a single session.`,eo={minSequenceLength:3,minRepetitions:3,maxSequenceLength:10,confidenceIncrement:10,confidenceDecrement:20},to=new Set([`status`,`guide`,`health`,`onboard`,`reindex`,`replay`,`session_digest`,`process`,`watch`,`produce_knowledge`,`list_tools`,`describe_tool`,`search_tools`]);function no(e){return e.join(`→`)}function ro(e){return{...e,steps:[...e.steps]}}function io(e){return e.every(e=>e.success)}var ao=class{config;history=[];sequences=new Map;procedures=new Map;pendingProcedures=new Map;constructor(e=eo){this.config=e}record(e,t){let n=new Date().toISOString();this.history.push({toolName:e,timestamp:n,success:t}),this.history.length>100&&(this.history=this.history.slice(-100));let r=this.detectSequences(n);this.updateMatchedProcedures(n,r)}getExtractableSequences(){return[...this.sequences.entries()].filter(([,e])=>e.count>=this.config.minRepetitions).map(([e,t])=>({steps:e.split(`→`),count:t.count,lastSeen:t.lastSeen})).sort((e,t)=>t.count===e.count?t.steps.length-e.steps.length:t.count-e.count)}listProcedures(){return[...this.procedures.values()].map(e=>ro(e)).sort((e,t)=>t.occurrences===e.occurrences?t.steps.length-e.steps.length:t.occurrences-e.occurrences)}drainNewProcedures(){let e=[...this.pendingProcedures.values()].map(e=>ro(e));return this.pendingProcedures.clear(),e}requeueProcedures(e){for(let t of e)this.pendingProcedures.set(no(t.steps),ro(t))}extractProcedure(e,t){return{id:se(),steps:[...e],occurrences:t,confidence:Math.min(50+(t-this.config.minRepetitions)*this.config.confidenceIncrement,100),lastSeen:new Date().toISOString(),conditions:$a}}adjustConfidence(e,t){return e.confidence=t?Math.min(100,e.confidence+this.config.confidenceIncrement):Math.max(0,e.confidence-this.config.confidenceDecrement),e.confidence}getHistoryLength(){return this.history.length}clear(){this.history=[],this.sequences.clear(),this.procedures.clear(),this.pendingProcedures.clear()}detectSequences(e){let t=this.history.map(e=>e.toolName),n=Math.min(this.config.maxSequenceLength,t.length),r=new Set,i=Math.max(1,Math.min(2,this.config.minRepetitions));for(let a=this.config.minSequenceLength;a<=n;a+=1){let n=t.slice(-a),o=no(n),s=0;for(let e=0;e<=t.length-a;e+=1)no(t.slice(e,e+a))===o&&(s+=1);if(!(s<i)&&(this.sequences.set(o,{count:s,lastSeen:e}),s>=this.config.minRepetitions&&!this.procedures.has(o))){let t=this.extractProcedure(n,s);t.lastSeen=e,this.procedures.set(o,t),this.pendingProcedures.set(o,ro(t)),r.add(o)}}return r}updateMatchedProcedures(e,t){for(let[n,r]of this.procedures.entries()){if(t.has(n))continue;let i=n.split(`→`);if(this.history.length<i.length)continue;let a=this.history.slice(-i.length);no(a.map(e=>e.toolName))===n&&(r.occurrences+=1,r.lastSeen=e,this.adjustConfidence(r,io(a)))}}};async function oo(e,t,n){let r=await t.remember(`Procedure: ${n.steps.join(` → `)}`,so(n),`patterns`,[`procedure`,`auto-extracted`]);return e.memoryMetaCreate(r.path,`procedural`),r.path}function so(e){return[`## Procedure: ${e.steps.join(` → `)}`,``,`**Confidence:** ${e.confidence}/100`,`**Occurrences:** ${e.occurrences}`,`**Last Seen:** ${e.lastSeen}`,``,`### Steps`,...e.steps.map((e,t)=>`${t+1}. \`${e}\``),``,`### When to Use`,e.conditions??$a].join(`
26
26
  `)}function co(e,t,n={}){return async(r,i)=>{if(!lo(r.toolName,n))return i();try{let n=await i();return e.record(r.toolName,n.isError!==!0),await uo(e,t,r.toolName),n}catch(n){throw e.record(r.toolName,!1),await uo(e,t,r.toolName),n}}}function lo(e,t){return t.trackedTools&&!t.trackedTools.has(e)?!1:!(t.ignoredTools??to).has(e)}async function uo(e,t,n){if(Ee.instance().isDegraded(`embedder`)){Qa.debug?.(`Skipping procedural memory persist — embedder degraded`);return}let r=e.drainNewProcedures();if(r.length===0)return;let i=[];for(let e of r)try{await oo(t.stateStore,t.curatedStore,e)}catch(t){let r=t instanceof Error?t.message:String(t),a=/circuit breaker|timed out|worker.*killed|respawn/i.test(r);Qa.warn(`Failed to store procedural memory`,{toolName:n,sequence:e.steps.join(` -> `),error:r}),a||i.push(e)}i.length>0&&e.requeueProcedures(i)}const fo=I(`tool-pipeline`);function po(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function mo(e,t){return e.tools?(Array.isArray(e.tools)?e.tools:[e.tools]).includes(t):!0}function ho(e){return e.middleware.critical===!0}var go=class{entries=[];use(e,t){this.entries.push({middleware:e,order:t?.order??100,tools:t?.tools,name:t?.name??e.name??`anonymous`})}useFor(e,t,n){this.use(t,{order:n?.order,tools:e,name:n?.name})}wrap(e,t,n,r){let i=this.entries.filter(t=>mo(t,e)).sort((e,t)=>e.order-t.order);return async(a,o)=>{let s={toolName:e,args:po(a)?a:{},requestId:se(),meta:r,extra:o,toolConfig:n},c=async n=>{let r=i[n];if(!r)return await t(s.args,o);let a=!1,l=!1,u,d=async()=>{a=!0;let e=await c(n+1);return l=!0,u=e,e};try{return await r.middleware(s,d)}catch(t){if(ho(r))throw t;if(fo.warn(`Middleware failed for tool`,{middleware:r.name,tool:e,error:String(t)}),a){if(l&&u)return u;throw t}return c(n+1)}};return c(0)}}getMiddlewareNames(){return this.entries.map(e=>e.name)}};const _o=I(`auto-gc`);let vo=`warming`,yo=null,bo=0;function xo(){let e=[...Fo()];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 So(e){let t=xo();if(t===0){vo=`warming`;return}if(t>500){vo=`degraded`;let n=Date.now();if(yo&&n-yo<36e5){_o.debug(`GC cooldown active — skipping`,{lastGcAgoMs:n-yo});return}yo=n,bo++,_o.warn(`p95 latency exceeds threshold, triggering GC`,{p95:t,cycle:bo}),e&&e().catch(e=>_o.error(`GC callback failed`,{err:String(e)}))}else t<200&&(vo=`healthy`)}function Co(){return{state:vo,p95:xo(),lastGcAt:yo,gcCount:bo,bufferSize:Fo().length}}const wo=/key|token|secret|auth|password|bearer/i,To=new Set([`eval`,`env`]);function Eo(e){if(typeof e==`string`)return/^(Bearer |sk-|ghp_|glpat-|ghu_|ghs_|github_pat_)/i.test(e)?`[REDACTED]`:e;if(Array.isArray(e))return e.map(Eo);if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))/(?:token|secret|password|passphrase|key|auth|credential|api.?key)/i.test(n)?t[n]=`[REDACTED]`:t[n]=Eo(r);return t}return e}function Do(e,t){if(To.has(e))return JSON.stringify({_redacted:!0,tool:e});let n=Eo(t);if(e===`http`&&n.headers&&typeof n.headers==`object`){let e={};for(let[t,r]of Object.entries(n.headers))e[t]=wo.test(t)?`[REDACTED]`:r;return n.headers=e,JSON.stringify(n).slice(0,2e3)}return JSON.stringify(n).slice(0,2e3)}let Oo={totalInputChars:0,totalOutputChars:0,callCount:0,startTime:new Date().toISOString()};function ko(e,t){Oo.totalInputChars+=e,Oo.totalOutputChars+=t,Oo.callCount++}function Ao(){return{...Oo}}const jo=new Map,Mo=[];function No(e,t,n,r,i){let a=jo.get(e);a||(a={callCount:0,totalDurationMs:0,totalInputChars:0,totalOutputChars:0,errorCount:0},jo.set(e,a)),a.callCount++,a.totalDurationMs+=t,a.totalInputChars+=n,a.totalOutputChars+=r,i&&a.errorCount++,Mo.push(t),Mo.length>100&&Mo.shift(),Mo.length>=10&&Mo.length%20==0&&So()}function Po(){return Array.from(jo.entries()).map(([e,t])=>({tool:e,...t}))}function Fo(){return Mo}function Io(){return async(e,t)=>{let n=Date.now(),r=JSON.stringify(e.args??{}).length;try{let i=await t(),a=Date.now()-n,o=JSON.stringify(i);return nn({ts:new Date().toISOString(),source:`mcp`,tool:e.toolName,input:Do(e.toolName,e.args),durationMs:a,status:`ok`,output:o,traceId:e.requestId,outputChars:o.length,inputChars:r}),No(e.toolName,a,r,o.length,!1),ko(r,o.length),i}catch(t){let i=Date.now()-n,a=t instanceof Error?t.message:String(t);throw nn({ts:new Date().toISOString(),source:`mcp`,tool:e.toolName,input:Do(e.toolName,e.args),durationMs:i,status:`error`,output:a,traceId:e.requestId,outputChars:0,inputChars:r}),No(e.toolName,i,r,0,!0),ko(r,a.length),t}}}function Lo(e,t){e.registerResource(`aikit-curated-index`,`aikit://curated`,{description:`Index of all curated knowledge entries`,mimeType:`text/markdown`},async()=>{let e=(await t.list()).map(e=>`- [${e.title}](aikit://curated/${e.path}) — ${e.category}`);return{contents:[{uri:`aikit://curated`,text:`# Curated Knowledge Index\n\n${e.length>0?e.join(`
27
27
  `):`_No curated entries yet._`}`,mimeType:`text/markdown`}]}});let n=new Vn(`aikit://curated/{+path}`,{list:async()=>({resources:(await t.list()).map(e=>({uri:`aikit://curated/${e.path}`,name:e.title,description:`[${e.category}] ${e.contentPreview?.slice(0,80)??``}`,mimeType:`text/markdown`}))})});e.registerResource(`aikit-curated-entry`,n,{description:`A curated knowledge entry`,mimeType:`text/markdown`},async(e,n)=>{let r=n.path;if(!r)throw Error(`Missing path variable in curated resource URI`);let i=await t.read(r);return{contents:[{uri:e.toString(),text:`---\ntitle: ${i.title}\ncategory: ${i.category}\ntags: ${i.tags?.join(`, `)??``}\nversion: ${i.version??1}\n---\n\n${i.content??i.contentPreview??``}`,mimeType:`text/markdown`}]}})}const Ro=`aikit://schemas/channel-surface`,zo=new URL(`../../../blocks-core/schemas/channel-surface.schema.json`,import.meta.url);let Bo;function Vo(){return Bo??=Mn(zo,`utf8`),Bo}function Ho(e,t,n){e.registerResource(`aikit-status`,`aikit://status`,{description:`Current AI Kit status and statistics`,mimeType:`text/plain`},async()=>{let e=await t.getStats();return{contents:[{uri:`aikit://status`,text:`AI Kit: ${e.totalRecords} records from ${e.totalFiles} files. Last indexed: ${e.lastIndexedAt??`Never`}`,mimeType:`text/plain`}]}}),e.registerResource(`aikit-file-tree`,`aikit://file-tree`,{description:`List of all indexed source files`,mimeType:`text/plain`},async()=>({contents:[{uri:`aikit://file-tree`,text:(await t.listSourcePaths()).sort().join(`
28
- `),mimeType:`text/plain`}]})),e.registerResource(`aikit-channel-surface-schema`,Ro,{description:`JSON Schema for the ChannelSurface communication contract`,mimeType:`application/schema+json`},async()=>({contents:[{uri:Ro,text:await Vo(),mimeType:`application/schema+json`}]})),Lo(e,n)}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=new Set(`browser.changelog.check.compliance_score.checkpoint.codemod.compact.config.data_transform.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.forge_classify.git_context.graph.guide.health.http.knowledge.lane.measure.onboard.parse_output.present.process.produce_knowledge.queue.regex_test.reindex.rename.replay.restore.schema_validate.session_digest.scope_map.stash.status.stratum_card.signal.test_run.time.watch.web_fetch.web_search.workset`.split(`.`)),Jo=5e3,Yo=new Set(`browser.changelog.check.compliance_score.checkpoint.codemod.data_transform.delegate.diff_parse.encode.env.eval.evidence_map.flow.describe_tool.list_tools.search_tools.forge_classify.git_context.guide.present.health.http.lane.measure.parse_output.process.produce_knowledge.queue.regex_test.rename.replay.restore.schema_validate.session_digest.status.test_run.time.watch.web_fetch.web_search.workset`.split(`.`)),Xo=`analyze.audit.blast_radius.browser.changelog.check.compliance_score.checkpoint.codemod.compact.config.data_transform.dead_symbols.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.find.flow.forge_classify.forge_ground.git_context.graph.guide.health.http.knowledge.memory_explain.lane.describe_tool.list_tools.lookup.measure.onboard.parse_output.present.process.produce_knowledge.queue.regex_test.reindex.rename.replay.restore.schema_validate.scope_map.search.search_tools.signal.session_digest.stash.status.stratum_card.symbol.test_run.time.trace.watch.web_fetch.web_search.workset`.split(`.`),Zo=I(`structured-content-guard`);function Qo(){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=$o(r);n.structuredContent=t,i=`synthesize`,n.structuredContent??(n.structuredContent={},i=`synthesize-null-fallback`,Zo.error(`synthesizeStructuredContent returned null/undefined — using empty fallback`,{tool:e.toolName}))}let a=es(r,n.structuredContent);if(a.action!=null&&(n.structuredContent=a.structuredContent,i=a.action),ns(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),ts(r,n.structuredContent)===!1){let e=$o(r);n.structuredContent=e??{},ts(r,n.structuredContent)===!1?(n.structuredContent=ns(n.structuredContent)?n.structuredContent:{},i=`final-validation-failed`):i??=`final-heal`}return ns(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),i!=null&&(i===`synthesize`||i===`final-heal`?Zo.debug:Zo.warn)(`Structured content guard activated`,{tool:e.toolName,action:i}),n});return e.critical=!0,e}function $o(e){try{return rs(e)??{}}catch{return{}}}function es(e,t){if(ts(e,t)!==!1)return{structuredContent:t,action:null};try{let n=$o(e);if(ns(n)&&ns(t)){let r={...n,...t};if(ts(e,r)!==!1)return{structuredContent:r,action:`heal`}}return{structuredContent:n,action:`fallback-zero-value`}}catch{return{structuredContent:t,action:null}}}function ts(e,t){let n=e.safeParse;if(typeof n==`function`)try{return n(t).success}catch{return}}function ns(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function rs(e){if(!e)return{};if(e.anyOf){let t=e.anyOf.find(e=>e.type!==`null`);return t?rs(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]=rs(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]=rs(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 is(e){if(!e)return{};try{let t=rs(e);return ns(t)?t:{}}catch{return{}}}const as=Symbol(`toolPipelineState`);function os(e){return e[as]}function ss(e,t){e[as]=t}function cs(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=is(t),i.structuredContent??={},r)}:e}function ls(e,t,n=``){let r=os(e);if(r){r.pipeline=t,r.prefix=n;return}ss(e,{originalRegisterTool:e.registerTool.bind(e),pipeline:t,prefix:n}),e.registerTool=(n,r,i)=>{let a=os(e),o=a?.prefix?`${a.prefix}${n}`:n;if(!i)return a?.originalRegisterTool(o,r);let s=r?.outputSchema;if((a?.pipeline??t).getMiddlewareNames().length===0){let e=cs(i,s);return a?.originalRegisterTool(o,r,e)}let c=G(n),l=cs((a?.pipeline??t).wrap(n,i,r,c),s);return a?.originalRegisterTool(o,r,l)}}const us={analyze:1,audit:1,blast_radius:1,changelog:1,check:2,checkpoint:2,codemod:2,compact:1,config:0,data_transform:1,dead_symbols:1,delegate:3,describe_tool:1,diff_parse:1,digest:1,encode:1,env:0,eval:2,evidence_map:2,file_summary:1,find:1,flow:3,forge_classify:1,forge_ground:2,git_context:1,graph:1,guide:0,health:0,http:1,lane:2,list_tools:1,lookup:1,measure:1,onboard:3,parse_output:1,present:1,process:3,produce_knowledge:3,queue:3,regex_test:1,reindex:3,rename:2,replay:1,restore:2,schema_validate:1,scope_map:1,search:1,search_tools:1,signal:2,session_digest:2,stash:2,status:0,stratum_card:1,symbol:1,test_run:2,time:0,trace:1,watch:3,web_fetch:1,web_search:1,workset:2};function ds(e,t){return e.filter(e=>(us[e]??0)<=t)}const fs=new Set([`status`,`config`,`guide`,`health`]),ps={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:[`compact`,`file_summary`,`check`,`test_run`]},discovery:{description:`Full toolset plus discovery-oriented meta-tools for guided tool exploration`,includeCategories:[],includeTools:[`list_tools`,`describe_tool`,`search_tools`]}};function ms(e,t){let n=ps[e];if(n)return n;let r=t?.[e];if(r)return r;throw Error(`Unknown tool profile: ${e}`)}function hs(e,t,n){return t.includes(`*`)?!0:(n[e]?.category??[]).some(e=>t.includes(e))}function gs(e,t,n,r){if(t.includes(`*`)){for(let t of n)e.add(t);return}for(let i of n)hs(i,t,r)&&e.add(i)}function _s(e,t,n){if(t.includes(`*`)){e.clear();return}for(let r of[...e])hs(r,t,n)&&e.delete(r)}function vs(e,t,n){if(!e||e.length===0||e.includes(`*`))return new Set(t);let r=new Set;return gs(r,e,t,n),r}function ys(e,t){return e===void 0?t:t===void 0?e:Math.min(e,t)}function bs(e,t){for(let n of[...e])t[n]?.annotations?.readOnlyHint===!1&&e.delete(n)}function xs(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=ms(e,t);return ys(i.extends?xs(i.extends,t,n+1,[...r,e]):void 0,i.maxTier)}function Ss(e,t,n,r){let i=(e,a,o)=>{if(a>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...o,e].join(` -> `)}`);if(o.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...o,e].join(` -> `)}`);let s=ms(e,r),c=[...o,e],l=s.extends?i(s.extends,a+1,c):vs(s.includeCategories,t,n);s.extends&&s.includeCategories?.length&&gs(l,s.includeCategories,t,n),s.excludeCategories?.length&&_s(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=xs(e,r);if(o!==void 0){let e=ds([...a],o);a.clear();for(let t of e)a.add(t)}for(let e of fs)a.add(e);return e===`safe`&&bs(a,n),a}const Cs=new Set([`search`,`analysis`,`knowledge`,`compression`,`forge`,`presentation`,`execution`,`manipulation`,`session`,`git`,`process`,`system`,`meta`,`utilities`,`web`,`queue`,`flow`]);function ws(e,t,n,r){let i=process.env.AIKIT_TOOLSET||e.toolProfile||`full`,a=Ss(i,t,n,r);if(e.features&&e.features.length>0){let i=e.features.filter(e=>!Cs.has(e));if(i.length>0)throw Error(`Unknown feature group(s): ${i.join(`, `)}. Valid categories: ${[...Cs].join(`, `)}`);let o={description:`Synthetic profile from features config`,includeCategories:e.features},s=Ss(`_features`,t,n,{...r,_features:o});for(let e of a)!s.has(e)&&!fs.has(e)&&a.delete(e)}if(e.readOnly)for(let e of[...a])n[e]?.annotations?.readOnlyHint===!1&&!fs.has(e)&&a.delete(e);for(let e of fs)a.add(e);return i===`safe`&&bs(a,n),a}const Ts=z.object({mode:z.enum([`wasm`,`regex`,`unknown`]),reason:z.string(),pathsChecked:z.array(z.object({path:z.string(),exists:z.boolean()})),os:z.string(),arch:z.string(),nodeVersion:z.string(),webTreeSitterImportable:z.boolean(),healAttempted:z.boolean(),healSuccess:z.boolean(),healError:z.string().nullable(),initError:z.string().nullable(),wasmDir:z.string().nullable(),grammarCount:z.number()}),Es=z.object({kind:z.enum([`onboard`,`reindex`,`handoff`,`proceed`]),reason:z.string()}),Ds=z.object({title:z.string(),insight:z.string(),confidence:z.number()}),Os=z.object({lessons:z.array(Ds),conventions:z.array(z.object({title:z.string(),preview:z.string()})),checkpoint:z.string().nullable()}),ks=z.object({totalRecords:z.number(),totalFiles:z.number(),lastIndexedAt:z.string().nullable(),onboarded:z.boolean(),onboardDir:z.string(),contentTypes:z.record(z.string(),z.number()),wasmAvailable:z.boolean(),wasmDiagnostics:Ts,graphStats:z.object({nodes:z.number(),edges:z.number()}).nullable(),curatedCount:z.number(),serverVersion:z.string(),scaffoldVersion:z.string().nullable(),workspaceScaffoldVersion:z.string().nullable(),upgradeAvailable:z.boolean(),storeBackend:z.string().optional(),storeDiagnostics:z.object({adapterType:z.string(),vectorSearchEnabled:z.boolean(),ftsEnabled:z.boolean(),degradedMode:z.boolean(),dbPath:z.string(),dbSizeBytes:z.number().nullable(),embeddingDim:z.number(),vectorDtype:z.string()}).nullable().optional(),contextPressure:z.number().min(0).max(100).describe(`0–100 score indicating AI Kit saturation`),nextAction:Es,prelude:Os.nullable().optional()});z.object({entries:z.array(z.object({path:z.string(),title:z.string(),category:z.string(),tags:z.array(z.string()),version:z.number(),preview:z.string()})),totalCount:z.number()});const As=z.object({ok:z.boolean(),checks:z.array(z.object({name:z.string(),ok:z.boolean(),message:z.string().optional()}))}),js=z.object({summary:z.object({totalFiles:z.number(),totalLines:z.number(),totalCodeLines:z.number(),totalFunctions:z.number(),avgComplexity:z.number(),maxComplexity:z.object({value:z.number(),file:z.string()})}),files:z.array(z.object({path:z.string(),lines:z.number(),code:z.number(),complexity:z.number(),functions:z.number()}))}),Ms=z.object({platform:z.string(),arch:z.string(),nodeVersion:z.string(),cwd:z.string(),cpus:z.number(),memoryFreeGb:z.number(),memoryTotalGb:z.number()}),Ns=z.object({iso:z.string(),unix:z.number(),timezone:z.string(),formatted:z.string()}),Ps=z.object({passed:z.boolean(),errorCount:z.number(),warningCount:z.number(),topErrors:z.array(z.string())}),Fs=z.object({passed:z.boolean(),tsc:Ps,biome:Ps}),Is=z.object({name:z.string(),definedIn:z.object({path:z.string(),line:z.number(),kind:z.string(),signature:z.string().optional()}).nullable(),importedBy:z.array(z.object({path:z.string(),line:z.number(),importStatement:z.string()})),referencedIn:z.array(z.object({path:z.string(),line:z.number(),context:z.string(),scope:z.string().optional()})),graphContext:z.object({definingModule:z.string().optional(),importedByModules:z.array(z.string()),siblingSymbols:z.array(z.string())}).nullable()}),Ls=z.object({sourcePath:z.string(),contentType:z.string(),score:z.number(),headingPath:z.string().optional(),startLine:z.number().optional(),endLine:z.number().optional(),origin:z.string().optional(),category:z.string().optional(),tags:z.array(z.string()).optional()}),Rs=z.object({results:z.array(Ls),totalResults:z.number(),searchMode:z.string(),query:z.string(),ref:z.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),zs=z.object({path:z.string(),line:z.number().optional(),matchType:z.string(),preview:z.string()}),Bs=z.object({matches:z.array(zs),totalMatches:z.number(),pattern:z.string(),truncated:z.boolean(),ref:z.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Vs=z.object({path:z.string(),relevance:z.number(),estimatedTokens:z.number(),focusLines:z.array(z.string()).optional()}),Hs=z.object({files:z.array(Vs),totalFiles:z.number(),totalEstimatedTokens:z.number(),task:z.string()}),Us=z.object({path:z.string(),impact:z.string(),reason:z.string()}),Ws=z.object({changedFiles:z.array(z.string()),affectedFiles:z.array(Us),totalAffected:z.number(),riskLevel:z.string()}),Gs=z.object({name:z.string(),passed:z.boolean(),message:z.string().optional(),severity:z.string().optional()}),Ks=z.object({passed:z.boolean(),score:z.number(),checks:z.array(Gs),summary:z.string()}),qs=z.object({id:z.string(),name:z.string(),type:z.string(),sourcePath:z.string().optional()}),Js=z.object({fromId:z.string(),toId:z.string(),type:z.string()}),Ys=z.object({nodes:z.array(qs),edges:z.array(Js),totalNodes:z.number(),totalEdges:z.number(),query:z.string()}),Xs=z.object({symbols:z.array(z.object({name:z.string(),path:z.string(),line:z.number().optional(),kind:z.string()})),totalDead:z.number()});z.object({files:z.number(),packages:z.number(),languages:z.record(z.string(),z.number()),tree:z.string()});const Zs=z.object({path:z.string(),language:z.string(),lines:z.number(),imports:z.number(),exports:z.number(),functions:z.number(),classes:z.number()}),Qs=z.object({gitRoot:z.string(),branch:z.string(),commitCount:z.number(),hasUncommitted:z.boolean(),recentCommits:z.array(z.object({hash:z.string(),message:z.string(),author:z.string(),date:z.string()}))}),$s=z.object({text:z.string().describe(`The compressed text output`),ref:z.string().optional().describe(`Reusable cache reference`),originalChars:z.number(),compressedChars:z.number(),ratio:z.number(),segmentsKept:z.number(),segmentsTotal:z.number()}),ec=z.object({sourceId:z.string(),value:z.string()}),tc=z.object({id:z.string(),originalChars:z.number(),keptChars:z.number(),segmentsKept:z.number(),segmentsTotal:z.number()}),nc=z.object({text:z.string().describe(`The compressed digest text output`),ref:z.string().optional().describe(`Reusable cache reference`),fields:z.record(z.string(),z.array(ec)),sourceStats:z.array(tc),totalOriginalChars:z.number(),totalCompressedChars:z.number(),ratio:z.number()}),rc=z.object({passed:z.boolean(),totalTests:z.number(),passedTests:z.number(),failedTests:z.number(),skippedTests:z.number(),duration:z.number().describe(`Duration in milliseconds`),failures:z.array(z.object({name:z.string(),message:z.string(),file:z.string().optional()}))}),ic=I(`utils:enrich`);async function K(e,t){let n={curated:[],graph:[]},r=t.limit??3,[i,a]=await Promise.allSettled([ac(e,t.query,r),oc(e,t.filePath)]);return i.status===`fulfilled`?n.curated=i.value:ic.debug(`Curated enrichment failed`,{error:i.reason}),a.status===`fulfilled`?n.graph=a.value:ic.debug(`Graph enrichment failed`,{error:a.reason}),n}async function ac(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=>sc(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=>sc(e.record))}return[]}catch(e){return ic.debug(`Curated enrichment failed`,{error:e}),[]}}async function oc(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 ic.debug(`Graph enrichment failed`,{error:e}),[]}}function q(e){let t=[];if(e.curated.length>0){t.push(`**Curated Knowledge:**`);for(let n of e.curated)t.push(`- ${n}`)}if(e.graph.length>0){t.push(`**Graph Context:**`);for(let n of e.graph)t.push(`- ${n}`)}return t.length===0?``:`\n\n---\n### Enrichment\n${t.join(`
28
+ `),mimeType:`text/plain`}]})),e.registerResource(`aikit-channel-surface-schema`,Ro,{description:`JSON Schema for the ChannelSurface communication contract`,mimeType:`application/schema+json`},async()=>({contents:[{uri:Ro,text:await Vo(),mimeType:`application/schema+json`}]})),Lo(e,n)}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=new Set(`browser.changelog.check.compliance_score.checkpoint.codemod.compact.config.data_transform.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.forge_classify.git_context.graph.guide.health.http.knowledge.lane.measure.onboard.parse_output.present.process.produce_knowledge.queue.regex_test.reindex.rename.replay.restore.schema_validate.session_digest.scope_map.stash.status.stratum_card.signal.test_run.time.watch.web_fetch.web_search.workset`.split(`.`)),Jo=5e3,Yo=new Set(`browser.changelog.check.compliance_score.checkpoint.codemod.data_transform.delegate.diff_parse.encode.env.eval.evidence_map.flow.describe_tool.list_tools.search_tools.forge_classify.git_context.guide.present.health.http.lane.measure.parse_output.process.produce_knowledge.queue.regex_test.rename.replay.restore.schema_validate.session_digest.status.test_run.time.watch.web_fetch.web_search.workset`.split(`.`)),Xo=`analyze.audit.blast_radius.browser.changelog.check.compliance_score.checkpoint.codemod.compact.config.data_transform.dead_symbols.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.find.flow.forge_classify.forge_ground.git_context.graph.guide.health.http.knowledge.memory_explain.lane.describe_tool.list_tools.lookup.measure.onboard.parse_output.present.process.produce_knowledge.queue.regex_test.reindex.rename.replay.restore.schema_validate.scope_map.search.search_tools.signal.session_digest.stash.status.stratum_card.symbol.test_run.time.trace.watch.web_fetch.web_search.workset`.split(`.`),Zo=I(`structured-content-guard`);function Qo(){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=$o(r);n.structuredContent=t,i=`synthesize`,n.structuredContent??(n.structuredContent={},i=`synthesize-null-fallback`,Zo.error(`synthesizeStructuredContent returned null/undefined — using empty fallback`,{tool:e.toolName}))}let a=es(r,n.structuredContent);if(a.action!=null&&(n.structuredContent=a.structuredContent,i=a.action),ns(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),ts(r,n.structuredContent)===!1){let e=$o(r);n.structuredContent=e??{},ts(r,n.structuredContent)===!1?(n.structuredContent=ns(n.structuredContent)?n.structuredContent:{},i=`final-validation-failed`):i??=`final-heal`}return ns(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),i!=null&&(i===`synthesize`||i===`final-heal`?Zo.debug:Zo.warn)(`Structured content guard activated`,{tool:e.toolName,action:i}),n});return e.critical=!0,e}function $o(e){try{return rs(e)??{}}catch{return{}}}function es(e,t){if(ts(e,t)!==!1)return{structuredContent:t,action:null};try{let n=$o(e);if(ns(n)&&ns(t)){let r={...n,...t};if(ts(e,r)!==!1)return{structuredContent:r,action:`heal`}}return{structuredContent:n,action:`fallback-zero-value`}}catch{return{structuredContent:t,action:null}}}function ts(e,t){let n=e.safeParse;if(typeof n==`function`)try{return n(t).success}catch{return}}function ns(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function rs(e){if(!e)return{};if(e.anyOf){let t=e.anyOf.find(e=>e.type!==`null`);return t?rs(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]=rs(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]=rs(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 is(e){if(!e)return{};try{let t=rs(e);return ns(t)?t:{}}catch{return{}}}const as=Symbol(`toolPipelineState`);function os(e){return e[as]}function ss(e,t){e[as]=t}function cs(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=is(t),i.structuredContent??={},r)}:e}function ls(e,t,n=``){let r=os(e);if(r){r.pipeline=t,r.prefix=n;return}ss(e,{originalRegisterTool:e.registerTool.bind(e),pipeline:t,prefix:n}),e.registerTool=(n,r,i)=>{let a=os(e),o=a?.prefix?`${a.prefix}${n}`:n;if(!i)return a?.originalRegisterTool(o,r);let s=r?.outputSchema;if((a?.pipeline??t).getMiddlewareNames().length===0){let e=cs(i,s);return a?.originalRegisterTool(o,r,e)}let c=G(n),l=cs((a?.pipeline??t).wrap(n,i,r,c),s);return a?.originalRegisterTool(o,r,l)}}const us={analyze:1,audit:1,blast_radius:1,changelog:1,check:2,checkpoint:2,codemod:2,compact:1,config:0,data_transform:1,dead_symbols:1,delegate:3,describe_tool:1,diff_parse:1,digest:1,encode:1,env:0,eval:2,evidence_map:2,file_summary:1,find:1,flow:3,forge_classify:1,forge_ground:2,git_context:1,graph:1,guide:0,health:0,http:1,lane:2,list_tools:1,lookup:1,measure:1,onboard:3,parse_output:1,present:1,process:3,produce_knowledge:3,queue:3,regex_test:1,reindex:3,rename:2,replay:1,restore:2,schema_validate:1,scope_map:1,search:1,search_tools:1,signal:2,session_digest:2,stash:2,status:0,stratum_card:1,symbol:1,test_run:2,time:0,trace:1,watch:3,web_fetch:1,web_search:1,workset:2};function ds(e,t){return e.filter(e=>(us[e]??0)<=t)}const fs=new Set([`status`,`config`,`guide`,`health`]),ps={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:[`compact`,`file_summary`,`check`,`test_run`]},discovery:{description:`Full toolset plus discovery-oriented meta-tools for guided tool exploration`,includeCategories:[],includeTools:[`list_tools`,`describe_tool`,`search_tools`]}};function ms(e,t){let n=ps[e];if(n)return n;let r=t?.[e];if(r)return r;throw Error(`Unknown tool profile: ${e}`)}function hs(e,t,n){return t.includes(`*`)?!0:(n[e]?.category??[]).some(e=>t.includes(e))}function gs(e,t,n,r){if(t.includes(`*`)){for(let t of n)e.add(t);return}for(let i of n)hs(i,t,r)&&e.add(i)}function _s(e,t,n){if(t.includes(`*`)){e.clear();return}for(let r of[...e])hs(r,t,n)&&e.delete(r)}function vs(e,t,n){if(!e||e.length===0||e.includes(`*`))return new Set(t);let r=new Set;return gs(r,e,t,n),r}function ys(e,t){return e===void 0?t:t===void 0?e:Math.min(e,t)}function bs(e,t){for(let n of[...e])t[n]?.annotations?.readOnlyHint===!1&&e.delete(n)}function xs(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=ms(e,t);return ys(i.extends?xs(i.extends,t,n+1,[...r,e]):void 0,i.maxTier)}function Ss(e,t,n,r){let i=(e,a,o)=>{if(a>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...o,e].join(` -> `)}`);if(o.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...o,e].join(` -> `)}`);let s=ms(e,r),c=[...o,e],l=s.extends?i(s.extends,a+1,c):vs(s.includeCategories,t,n);s.extends&&s.includeCategories?.length&&gs(l,s.includeCategories,t,n),s.excludeCategories?.length&&_s(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=xs(e,r);if(o!==void 0){let e=ds([...a],o);a.clear();for(let t of e)a.add(t)}for(let e of fs)a.add(e);return e===`safe`&&bs(a,n),a}const Cs=new Set([`search`,`analysis`,`knowledge`,`compression`,`forge`,`presentation`,`execution`,`manipulation`,`session`,`git`,`process`,`system`,`meta`,`utilities`,`web`,`queue`,`flow`]);function ws(e,t,n,r){let i=process.env.AIKIT_TOOLSET||e.toolProfile||`full`,a=Ss(i,t,n,r);if(e.features&&e.features.length>0){let i=e.features.filter(e=>!Cs.has(e));if(i.length>0)throw Error(`Unknown feature group(s): ${i.join(`, `)}. Valid categories: ${[...Cs].join(`, `)}`);let o={description:`Synthetic profile from features config`,includeCategories:e.features},s=Ss(`_features`,t,n,{...r,_features:o});for(let e of a)!s.has(e)&&!fs.has(e)&&a.delete(e)}if(e.readOnly)for(let e of[...a])n[e]?.annotations?.readOnlyHint===!1&&!fs.has(e)&&a.delete(e);for(let e of fs)a.add(e);return i===`safe`&&bs(a,n),a}const Ts=z.object({mode:z.enum([`wasm`,`regex`,`unknown`]),reason:z.string(),pathsChecked:z.array(z.object({path:z.string(),exists:z.boolean()})),os:z.string(),arch:z.string(),nodeVersion:z.string(),webTreeSitterImportable:z.boolean(),healAttempted:z.boolean(),healSuccess:z.boolean(),healError:z.string().nullable(),initError:z.string().nullable(),wasmDir:z.string().nullable(),grammarCount:z.number()}),Es=z.object({kind:z.enum([`onboard`,`reindex`,`handoff`,`proceed`]),reason:z.string()}),Ds=z.object({title:z.string(),insight:z.string(),confidence:z.number()}),Os=z.object({lessons:z.array(Ds),conventions:z.array(z.object({title:z.string(),preview:z.string()})),checkpoint:z.string().nullable()}),ks=z.object({totalRecords:z.number(),totalFiles:z.number(),lastIndexedAt:z.string().nullable(),onboarded:z.boolean(),onboardDir:z.string(),contentTypes:z.record(z.string(),z.number()),wasmAvailable:z.boolean(),wasmDiagnostics:Ts,graphStats:z.object({nodes:z.number(),edges:z.number()}).nullable(),curatedCount:z.number(),serverVersion:z.string(),scaffoldVersion:z.string().nullable(),workspaceScaffoldVersion:z.string().nullable(),upgradeAvailable:z.boolean(),sessionTokens:z.object({callCount:z.number(),totalInputChars:z.number(),totalOutputChars:z.number(),estInputTokens:z.number(),estTotalTokens:z.number(),startTime:z.string()}).optional(),storeBackend:z.string().optional(),storeDiagnostics:z.object({adapterType:z.string(),vectorSearchEnabled:z.boolean(),ftsEnabled:z.boolean(),degradedMode:z.boolean(),dbPath:z.string(),dbSizeBytes:z.number().nullable(),embeddingDim:z.number(),vectorDtype:z.string()}).nullable().optional(),contextPressure:z.number().min(0).max(100).describe(`0–100 score indicating AI Kit saturation`),nextAction:Es,prelude:Os.nullable().optional()});z.object({entries:z.array(z.object({path:z.string(),title:z.string(),category:z.string(),tags:z.array(z.string()),version:z.number(),preview:z.string()})),totalCount:z.number()});const As=z.object({ok:z.boolean(),checks:z.array(z.object({name:z.string(),ok:z.boolean(),message:z.string().optional()}))}),js=z.object({summary:z.object({totalFiles:z.number(),totalLines:z.number(),totalCodeLines:z.number(),totalFunctions:z.number(),avgComplexity:z.number(),maxComplexity:z.object({value:z.number(),file:z.string()})}),files:z.array(z.object({path:z.string(),lines:z.number(),code:z.number(),complexity:z.number(),functions:z.number()}))}),Ms=z.object({platform:z.string(),arch:z.string(),nodeVersion:z.string(),cwd:z.string(),cpus:z.number(),memoryFreeGb:z.number(),memoryTotalGb:z.number()}),Ns=z.object({iso:z.string(),unix:z.number(),timezone:z.string(),formatted:z.string()}),Ps=z.object({passed:z.boolean(),errorCount:z.number(),warningCount:z.number(),topErrors:z.array(z.string())}),Fs=z.object({passed:z.boolean(),tsc:Ps,biome:Ps}),Is=z.object({name:z.string(),definedIn:z.object({path:z.string(),line:z.number(),kind:z.string(),signature:z.string().optional()}).nullable(),importedBy:z.array(z.object({path:z.string(),line:z.number(),importStatement:z.string()})),referencedIn:z.array(z.object({path:z.string(),line:z.number(),context:z.string(),scope:z.string().optional()})),graphContext:z.object({definingModule:z.string().optional(),importedByModules:z.array(z.string()),siblingSymbols:z.array(z.string())}).nullable()}),Ls=z.object({sourcePath:z.string(),contentType:z.string(),score:z.number(),headingPath:z.string().optional(),startLine:z.number().optional(),endLine:z.number().optional(),origin:z.string().optional(),category:z.string().optional(),tags:z.array(z.string()).optional()}),Rs=z.object({results:z.array(Ls),totalResults:z.number(),searchMode:z.string(),query:z.string(),ref:z.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),zs=z.object({path:z.string(),line:z.number().optional(),matchType:z.string(),preview:z.string()}),Bs=z.object({matches:z.array(zs),totalMatches:z.number(),pattern:z.string(),truncated:z.boolean(),ref:z.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Vs=z.object({path:z.string(),relevance:z.number(),estimatedTokens:z.number(),focusLines:z.array(z.string()).optional()}),Hs=z.object({files:z.array(Vs),totalFiles:z.number(),totalEstimatedTokens:z.number(),task:z.string()}),Us=z.object({path:z.string(),impact:z.string(),reason:z.string()}),Ws=z.object({changedFiles:z.array(z.string()),affectedFiles:z.array(Us),totalAffected:z.number(),riskLevel:z.string()}),Gs=z.object({name:z.string(),passed:z.boolean(),message:z.string().optional(),severity:z.string().optional()}),Ks=z.object({passed:z.boolean(),score:z.number(),checks:z.array(Gs),summary:z.string()}),qs=z.object({id:z.string(),name:z.string(),type:z.string(),sourcePath:z.string().optional()}),Js=z.object({fromId:z.string(),toId:z.string(),type:z.string()}),Ys=z.object({nodes:z.array(qs),edges:z.array(Js),totalNodes:z.number(),totalEdges:z.number(),query:z.string()}),Xs=z.object({symbols:z.array(z.object({name:z.string(),path:z.string(),line:z.number().optional(),kind:z.string()})),totalDead:z.number()});z.object({files:z.number(),packages:z.number(),languages:z.record(z.string(),z.number()),tree:z.string()});const Zs=z.object({path:z.string(),language:z.string(),lines:z.number(),imports:z.number(),exports:z.number(),functions:z.number(),classes:z.number()}),Qs=z.object({gitRoot:z.string(),branch:z.string(),commitCount:z.number(),hasUncommitted:z.boolean(),recentCommits:z.array(z.object({hash:z.string(),message:z.string(),author:z.string(),date:z.string()}))}),$s=z.object({text:z.string().describe(`The compressed text output`),ref:z.string().optional().describe(`Reusable cache reference`),originalChars:z.number(),compressedChars:z.number(),ratio:z.number(),segmentsKept:z.number(),segmentsTotal:z.number()}),ec=z.object({sourceId:z.string(),value:z.string()}),tc=z.object({id:z.string(),originalChars:z.number(),keptChars:z.number(),segmentsKept:z.number(),segmentsTotal:z.number()}),nc=z.object({text:z.string().describe(`The compressed digest text output`),ref:z.string().optional().describe(`Reusable cache reference`),fields:z.record(z.string(),z.array(ec)),sourceStats:z.array(tc),totalOriginalChars:z.number(),totalCompressedChars:z.number(),ratio:z.number()}),rc=z.object({passed:z.boolean(),totalTests:z.number(),passedTests:z.number(),failedTests:z.number(),skippedTests:z.number(),duration:z.number().describe(`Duration in milliseconds`),failures:z.array(z.object({name:z.string(),message:z.string(),file:z.string().optional()}))}),ic=I(`utils:enrich`);async function K(e,t){let n={curated:[],graph:[]},r=t.limit??3,[i,a]=await Promise.allSettled([ac(e,t.query,r),oc(e,t.filePath)]);return i.status===`fulfilled`?n.curated=i.value:ic.debug(`Curated enrichment failed`,{error:i.reason}),a.status===`fulfilled`?n.graph=a.value:ic.debug(`Graph enrichment failed`,{error:a.reason}),n}async function ac(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=>sc(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=>sc(e.record))}return[]}catch(e){return ic.debug(`Curated enrichment failed`,{error:e}),[]}}async function oc(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 ic.debug(`Graph enrichment failed`,{error:e}),[]}}function q(e){let t=[];if(e.curated.length>0){t.push(`**Curated Knowledge:**`);for(let n of e.curated)t.push(`- ${n}`)}if(e.graph.length>0){t.push(`**Graph Context:**`);for(let n of e.graph)t.push(`- ${n}`)}return t.length===0?``:`\n\n---\n### Enrichment\n${t.join(`
29
29
  `)}`}function sc(e){let t=cc(e.metadata,`title`)||e.sourcePath||`Untitled`;return`[${cc(e.metadata,`category`)}] ${t}: ${e.content.slice(0,200)}`}function cc(e,t){let n=e?.[t];return typeof n==`string`?n:``}function J(e,t,n){return{content:[{type:`text`,text:`[ERROR:${e}] ${t}`}],isError:!0,...n==null?{}:{structuredContent:n}}}function Y(e,t){return async(n,r)=>{let i=Date.now(),a=await t(n,r),o=Date.now()-i;return a._meta={...a._meta??{},durationMs:o,toolName:e},a}}const lc=I(`tools`),uc=z.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`);function dc(e,t){return t?R(e,t):e}function fc(){let e=[];return rr.get()||e.push(`Tree-sitter unavailable — using regex fallback, symbol/pattern confidence reduced`),e.length===0?``:`\n\n> **⚠ Caveats:** ${e.join(`; `)}`}function pc(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 mc(e){let t=[],n=e.filter(e=>/\.(ts|tsx|js|jsx)$/.test(e)&&/(service|store|model|schema|migration)/i.test(e)),r=e.filter(e=>/\.(ts|tsx|js|jsx)$/.test(e)&&!n.includes(e)),i=e.filter(e=>!/\.(ts|tsx|js|jsx)$/.test(e));return(n.length>0||r.length>0||i.length>0)&&(t.push(`
30
30
 
31
31
  ### 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(`