@vpxa/kb 0.1.22 → 0.1.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vpxa/kb",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.23",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Local-first AI developer toolkit — knowledge base, code analysis, context management, and developer tools for LLM agents",
|
|
6
6
|
"license": "MIT",
|
|
@@ -49,9 +49,9 @@
|
|
|
49
49
|
"linkedom": "^0.x",
|
|
50
50
|
"minimatch": "^10.x",
|
|
51
51
|
"sql.js": "^1.x",
|
|
52
|
-
"tree-sitter-wasms": "
|
|
52
|
+
"tree-sitter-wasms": "~0.1.13",
|
|
53
53
|
"turndown": "^7.x",
|
|
54
|
-
"web-tree-sitter": "
|
|
54
|
+
"web-tree-sitter": "~0.24.7",
|
|
55
55
|
"zod": "^4.x"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"turbo": "^2.x",
|
|
63
63
|
"typescript": "^6.x",
|
|
64
64
|
"vitest": "^4.x",
|
|
65
|
-
"ws": "^8.
|
|
65
|
+
"ws": "^8.x"
|
|
66
66
|
},
|
|
67
67
|
"engines": {
|
|
68
68
|
"node": ">=24"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SUPPORTED_EXTENSIONS as e,resolveGrammarPath as t,resolveParserWasmPath as n}from"./languages.js";import{createLogger as r}from"../../../core/dist/index.js";const i=r(`wasm-runtime`);async function a(){
|
|
1
|
+
import{SUPPORTED_EXTENSIONS as e,resolveGrammarPath as t,resolveParserWasmPath as n}from"./languages.js";import{createLogger as r}from"../../../core/dist/index.js";const i=r(`wasm-runtime`);async function a(){let e=await import(`web-tree-sitter`),t=typeof e.default?.init==`function`?e.default:e.Parser;if(!t||typeof t.init!=`function`)throw Error(`Unsupported web-tree-sitter export shape: ${Object.keys(e).join(`, `)}`);return t}var o=class r{static instance=null;parser=null;languages=new Map;loadedGrammars=new Map;static async initialize(){if(r.instance)return r.instance;let e=new r;return await e.init()?(r.instance=e,e):null}static get(){return r.instance}static async ensure(){let e=r.get();if(e)return e;let t=await r.initialize();if(!t)throw Error(`Failed to initialize WASM tree-sitter runtime`);return t}static dispose(){r.instance&&=(r.instance.parser?.delete(),r.instance.parser=null,r.instance.languages.clear(),r.instance.loadedGrammars.clear(),null)}async init(){try{let e=n();if(!e)return i.warn(`Parser WASM file not found`),!1;let t=await a();return await t.init({locateFile:()=>e}),this.parser=new t,i.info(`WASM tree-sitter parser initialized`),!0}catch(e){return i.warn(`Failed to initialize WASM tree-sitter`,{error:String(e)}),!1}}async loadLanguage(e){let n=this.languages.get(e);if(n)return n;let r=t(e);if(!r)return null;let o=this.loadedGrammars.get(r);if(o)return this.languages.set(e,o),o;try{let t=await(await a()).Language.load(r);return this.loadedGrammars.set(r,t),this.languages.set(e,t),i.info(`Loaded grammar`,{ext:e}),t}catch(t){return i.warn(`Failed to load grammar`,{ext:e,error:String(t)}),null}}async parse(e,t){if(!this.parser)return null;let n=await this.loadLanguage(t);return n?(this.parser.setLanguage(n),this.parser.parse(e)):null}hasLanguage(t){return e.has(t)}isLanguageLoaded(e){return this.languages.has(e)}getParser(){return this.parser}getLanguage(e){return this.languages.get(e)??null}};async function s(){return await o.initialize()!==null}export{o as WasmRuntime,s as initializeWasm};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import{MCP_SERVER_ENTRY as e,SERVER_NAME as t,SKILL_NAMES as n,VSCODE_SETTINGS as r}from"./constants.js";import{buildAgentsMd as i,buildCopilotInstructions as a}from"./templates.js";import{copyDirectoryRecursive as o}from"./scaffold.js";import{copyFileSync as s,existsSync as c,mkdirSync as l,readFileSync as u,readdirSync as d,statSync as f,writeFileSync as p}from"node:fs";import{dirname as m,resolve as h}from"node:path";import{fileURLToPath as g}from"node:url";import{getGlobalDataDir as _,saveRegistry as v}from"../../../../core/dist/index.js";import{homedir as y}from"node:os";function b(){let e=y(),t=process.platform,n=[],r=h(e,`.copilot`),i=h(e,`.github`),a=h(e,`.claude`),o=h(e,`.cursor`),s=h(e,`.windsurf`);if(t===`win32`){let t=process.env.APPDATA??h(e,`AppData`,`Roaming`);n.push({ide:`VS Code`,configDir:h(t,`Code`,`User`),mcpConfigPath:h(t,`Code`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VS Code Insiders`,configDir:h(t,`Code - Insiders`,`User`),mcpConfigPath:h(t,`Code - Insiders`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VSCodium`,configDir:h(t,`VSCodium`,`User`),mcpConfigPath:h(t,`VSCodium`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`Cursor`,configDir:h(t,`Cursor`,`User`),mcpConfigPath:h(t,`Cursor`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Cursor Nightly`,configDir:h(t,`Cursor Nightly`,`User`),mcpConfigPath:h(t,`Cursor Nightly`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Windsurf`,configDir:h(t,`Windsurf`,`User`),mcpConfigPath:h(t,`Windsurf`,`User`,`mcp.json`),globalScaffoldRoot:s,instructionsRoot:null})}else if(t===`darwin`){let t=h(e,`Library`,`Application Support`);n.push({ide:`VS Code`,configDir:h(t,`Code`,`User`),mcpConfigPath:h(t,`Code`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VS Code Insiders`,configDir:h(t,`Code - Insiders`,`User`),mcpConfigPath:h(t,`Code - Insiders`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VSCodium`,configDir:h(t,`VSCodium`,`User`),mcpConfigPath:h(t,`VSCodium`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`Cursor`,configDir:h(t,`Cursor`,`User`),mcpConfigPath:h(t,`Cursor`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Cursor Nightly`,configDir:h(t,`Cursor Nightly`,`User`),mcpConfigPath:h(t,`Cursor Nightly`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Windsurf`,configDir:h(t,`Windsurf`,`User`),mcpConfigPath:h(t,`Windsurf`,`User`,`mcp.json`),globalScaffoldRoot:s,instructionsRoot:null})}else{let t=process.env.XDG_CONFIG_HOME??h(e,`.config`);n.push({ide:`VS Code`,configDir:h(t,`Code`,`User`),mcpConfigPath:h(t,`Code`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VS Code Insiders`,configDir:h(t,`Code - Insiders`,`User`),mcpConfigPath:h(t,`Code - Insiders`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VSCodium`,configDir:h(t,`VSCodium`,`User`),mcpConfigPath:h(t,`VSCodium`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`Cursor`,configDir:h(t,`Cursor`,`User`),mcpConfigPath:h(t,`Cursor`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Cursor Nightly`,configDir:h(t,`Cursor Nightly`,`User`),mcpConfigPath:h(t,`Cursor Nightly`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Windsurf`,configDir:h(t,`Windsurf`,`User`),mcpConfigPath:h(t,`Windsurf`,`User`,`mcp.json`),globalScaffoldRoot:s,instructionsRoot:null})}return n.push({ide:`Claude Code`,configDir:h(e,`.claude`),mcpConfigPath:h(e,`.claude`,`mcp.json`),globalScaffoldRoot:a,instructionsRoot:null}),n.filter(e=>c(e.configDir))}function x(t,n,r=!1){let{mcpConfigPath:i,configDir:a}=t,o={...e},s={};if(c(i)){try{let e=u(i,`utf-8`);s=JSON.parse(e)}catch{let e=`${i}.bak`;p(e,u(i,`utf-8`),`utf-8`),console.log(` Backed up invalid ${i} to ${e}`),s={}}if((s.servers??s.mcpServers??{})[n]&&!r){console.log(` ${t.ide}: ${n} already configured (use --force to update)`);return}}let d=new Set([`VS Code`,`VS Code Insiders`,`VSCodium`,`Windsurf`]).has(t.ide)?`servers`:`mcpServers`,f=s[d]??{};f[n]=o,s[d]=f,l(a,{recursive:!0}),p(i,`${JSON.stringify(s,null,2)}\n`,`utf-8`),console.log(` ${t.ide}: configured ${n} in ${i}`)}const S=new Set([`VS Code`,`VS Code Insiders`,`VSCodium`]);function C(e,t=!1){if(!S.has(e.ide))return;let n=h(e.configDir,`settings.json`),i={};if(c(n))try{let e=u(n,`utf-8`);i=JSON.parse(e)}catch{console.log(` ${e.ide}: skipped settings.json (invalid JSON)`);return}let a=!1;for(let[e,n]of Object.entries(r))if(typeof n==`object`&&n){let t=typeof i[e]==`object`&&i[e]!==null?i[e]:{},r={...t,...n};JSON.stringify(r)!==JSON.stringify(t)&&(i[e]=r,a=!0)}else (t||!(e in i))&&(i[e]=n,a=!0);a&&(p(n,`${JSON.stringify(i,null,2)}\n`,`utf-8`),console.log(` ${e.ide}: updated settings.json`))}function w(e,t,n,r){let i=h(t,n);l(i,{recursive:!0});let a=h(e,`scaffold`,`general`,n);if(!c(a))return 0;let u=0;for(let e of d(a)){let t=h(a,e),l=h(i,e);f(t).isDirectory()?o(t,l,`${n}/${e}`,r):(r||!c(l))&&(s(t,l),u++)}return u}function T(e,t,r,s=!1){let u=new Set;for(let e of t)e.globalScaffoldRoot&&u.add(e.globalScaffoldRoot);if(u.size===0){console.log(` No IDEs with global scaffold support detected.`);return}for(let t of u){let r=w(e,t,`agents`,s),i=w(e,t,`prompts`,s),a=h(t,`skills`),l=0;for(let t of n){let n=h(e,`skills`,t);c(n)&&(o(n,h(a,t),`skills/${t}`,s),l++)}console.log(` ${t}: ${r} agents, ${i} prompts, ${l} skills`)}let d=new Set,f=a(`kb`,r),m=i(`kb`,r);for(let e of t){if(!e.globalScaffoldRoot)continue;let t=e.globalScaffoldRoot;if(e.ide===`Claude Code`){let e=h(t,`CLAUDE.md`);(s||!c(e))&&(p(e,`${f}\n---\n\n${m}`,`utf-8`),d.add(e))}else if(e.ide===`VS Code`||e.ide===`VS Code Insiders`||e.ide===`VSCodium`){let n=e.instructionsRoot??t;l(n,{recursive:!0});let r=h(n,`copilot-instructions.md`);d.has(r)||(s||!c(r))&&(p(r,`${f}\n---\n\n${m}`,`utf-8`),d.add(r))}else if(e.ide===`Cursor`||e.ide===`Cursor Nightly`){let e=h(t,`rules`);l(e,{recursive:!0});let n=h(e,`kb.mdc`);d.has(n)||(s||!c(n))&&(p(n,`${f}\n---\n\n${m}`,`utf-8`),d.add(n))}else if(e.ide===`Windsurf`){let e=h(t,`rules`);l(e,{recursive:!0});let n=h(e,`kb.md`);d.has(n)||(s||!c(n))&&(p(n,`${f}\n---\n\n${m}`,`utf-8`),d.add(n))}}d.size>0&&console.log(` Instruction files: ${[...d].join(`, `)}`)}async function E(e){let n=t;console.log(`Initializing
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
Installing scaffold files:`),T(a,i,n,e.force),console.log(`
|
|
1
|
+
import{MCP_SERVER_ENTRY as e,SERVER_NAME as t,SKILL_NAMES as n,VSCODE_SETTINGS as r}from"./constants.js";import{buildAgentsMd as i,buildCopilotInstructions as a}from"./templates.js";import{copyDirectoryRecursive as o}from"./scaffold.js";import{copyFileSync as s,existsSync as c,mkdirSync as l,readFileSync as u,readdirSync as d,statSync as f,writeFileSync as p}from"node:fs";import{dirname as m,resolve as h}from"node:path";import{fileURLToPath as g}from"node:url";import{getGlobalDataDir as _,saveRegistry as v}from"../../../../core/dist/index.js";import{homedir as y}from"node:os";function b(){let e=y(),t=process.platform,n=[],r=h(e,`.copilot`),i=h(e,`.github`),a=h(e,`.claude`),o=h(e,`.cursor`),s=h(e,`.windsurf`);if(t===`win32`){let t=process.env.APPDATA??h(e,`AppData`,`Roaming`);n.push({ide:`VS Code`,configDir:h(t,`Code`,`User`),mcpConfigPath:h(t,`Code`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VS Code Insiders`,configDir:h(t,`Code - Insiders`,`User`),mcpConfigPath:h(t,`Code - Insiders`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VSCodium`,configDir:h(t,`VSCodium`,`User`),mcpConfigPath:h(t,`VSCodium`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`Cursor`,configDir:h(t,`Cursor`,`User`),mcpConfigPath:h(t,`Cursor`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Cursor Nightly`,configDir:h(t,`Cursor Nightly`,`User`),mcpConfigPath:h(t,`Cursor Nightly`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Windsurf`,configDir:h(t,`Windsurf`,`User`),mcpConfigPath:h(t,`Windsurf`,`User`,`mcp.json`),globalScaffoldRoot:s,instructionsRoot:null})}else if(t===`darwin`){let t=h(e,`Library`,`Application Support`);n.push({ide:`VS Code`,configDir:h(t,`Code`,`User`),mcpConfigPath:h(t,`Code`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VS Code Insiders`,configDir:h(t,`Code - Insiders`,`User`),mcpConfigPath:h(t,`Code - Insiders`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VSCodium`,configDir:h(t,`VSCodium`,`User`),mcpConfigPath:h(t,`VSCodium`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`Cursor`,configDir:h(t,`Cursor`,`User`),mcpConfigPath:h(t,`Cursor`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Cursor Nightly`,configDir:h(t,`Cursor Nightly`,`User`),mcpConfigPath:h(t,`Cursor Nightly`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Windsurf`,configDir:h(t,`Windsurf`,`User`),mcpConfigPath:h(t,`Windsurf`,`User`,`mcp.json`),globalScaffoldRoot:s,instructionsRoot:null})}else{let t=process.env.XDG_CONFIG_HOME??h(e,`.config`);n.push({ide:`VS Code`,configDir:h(t,`Code`,`User`),mcpConfigPath:h(t,`Code`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VS Code Insiders`,configDir:h(t,`Code - Insiders`,`User`),mcpConfigPath:h(t,`Code - Insiders`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VSCodium`,configDir:h(t,`VSCodium`,`User`),mcpConfigPath:h(t,`VSCodium`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`Cursor`,configDir:h(t,`Cursor`,`User`),mcpConfigPath:h(t,`Cursor`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Cursor Nightly`,configDir:h(t,`Cursor Nightly`,`User`),mcpConfigPath:h(t,`Cursor Nightly`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Windsurf`,configDir:h(t,`Windsurf`,`User`),mcpConfigPath:h(t,`Windsurf`,`User`,`mcp.json`),globalScaffoldRoot:s,instructionsRoot:null})}return n.push({ide:`Claude Code`,configDir:h(e,`.claude`),mcpConfigPath:h(e,`.claude`,`mcp.json`),globalScaffoldRoot:a,instructionsRoot:null}),n.filter(e=>c(e.configDir))}function x(t,n,r=!1){let{mcpConfigPath:i,configDir:a}=t,o={...e},s={};if(c(i)){try{let e=u(i,`utf-8`);s=JSON.parse(e)}catch{let e=`${i}.bak`;p(e,u(i,`utf-8`),`utf-8`),console.log(` Backed up invalid ${i} to ${e}`),s={}}if((s.servers??s.mcpServers??{})[n]&&!r){console.log(` ${t.ide}: ${n} already configured (use --force to update)`);return}}let d=new Set([`VS Code`,`VS Code Insiders`,`VSCodium`,`Windsurf`]).has(t.ide)?`servers`:`mcpServers`,f=s[d]??{};f[n]=o,s[d]=f,l(a,{recursive:!0}),p(i,`${JSON.stringify(s,null,2)}\n`,`utf-8`),console.log(` ${t.ide}: configured ${n} in ${i}`)}const S=new Set([`VS Code`,`VS Code Insiders`,`VSCodium`]);function C(e,t=!1){if(!S.has(e.ide))return;let n=h(e.configDir,`settings.json`),i={};if(c(n))try{let e=u(n,`utf-8`);i=JSON.parse(e)}catch{console.log(` ${e.ide}: skipped settings.json (invalid JSON)`);return}let a=!1;for(let[e,n]of Object.entries(r))if(typeof n==`object`&&n){let t=typeof i[e]==`object`&&i[e]!==null?i[e]:{},r={...t,...n};JSON.stringify(r)!==JSON.stringify(t)&&(i[e]=r,a=!0)}else (t||!(e in i))&&(i[e]=n,a=!0);a&&(p(n,`${JSON.stringify(i,null,2)}\n`,`utf-8`),console.log(` ${e.ide}: updated settings.json`))}function w(e,t,n,r){let i=h(t,n);l(i,{recursive:!0});let a=h(e,`scaffold`,`general`,n);if(!c(a))return 0;let u=0;for(let e of d(a)){let t=h(a,e),l=h(i,e);f(t).isDirectory()?o(t,l,`${n}/${e}`,r):(r||!c(l))&&(s(t,l),u++)}return u}function T(e,t,r,s=!1){let u=new Set;for(let e of t)e.globalScaffoldRoot&&u.add(e.globalScaffoldRoot);if(u.size===0){console.log(` No IDEs with global scaffold support detected.`);return}for(let t of u){let r=w(e,t,`agents`,s),i=w(e,t,`prompts`,s),a=h(t,`skills`),l=0;for(let t of n){let n=h(e,`skills`,t);c(n)&&(o(n,h(a,t),`skills/${t}`,s),l++)}console.log(` ${t}: ${r} agents, ${i} prompts, ${l} skills`)}let d=new Set,f=a(`kb`,r),m=i(`kb`,r);for(let e of t){if(!e.globalScaffoldRoot)continue;let t=e.globalScaffoldRoot;if(e.ide===`Claude Code`){let e=h(t,`CLAUDE.md`);(s||!c(e))&&(p(e,`${f}\n---\n\n${m}`,`utf-8`),d.add(e))}else if(e.ide===`VS Code`||e.ide===`VS Code Insiders`||e.ide===`VSCodium`){let n=e.instructionsRoot??t;l(n,{recursive:!0});let r=h(n,`copilot-instructions.md`);d.has(r)||(s||!c(r))&&(p(r,`${f}\n---\n\n${m}`,`utf-8`),d.add(r))}else if(e.ide===`Cursor`||e.ide===`Cursor Nightly`){let e=h(t,`rules`);l(e,{recursive:!0});let n=h(e,`kb.mdc`);d.has(n)||(s||!c(n))&&(p(n,`${f}\n---\n\n${m}`,`utf-8`),d.add(n))}else if(e.ide===`Windsurf`){let e=h(t,`rules`);l(e,{recursive:!0});let n=h(e,`kb.md`);d.has(n)||(s||!c(n))&&(p(n,`${f}\n---\n\n${m}`,`utf-8`),d.add(n))}}d.size>0&&console.log(` Instruction files: ${[...d].join(`, `)}`)}async function E(e){let n=t,r=h(m(g(import.meta.url)),`..`,`..`,`..`,`..`,`..`,`package.json`),i=JSON.parse(u(r,`utf-8`)).version;console.log(`Initializing @vpxa/kb v${i}...\n`);let a=_();l(a,{recursive:!0}),console.log(` Global data store: ${a}`),v({version:1,workspaces:{}}),console.log(` Created registry.json`);let o=b();if(o.length===0)console.log(`
|
|
2
|
+
No supported IDEs detected. You can manually add the MCP server config.`);else{console.log(`\n Detected ${o.length} IDE(s):`);for(let t of o)x(t,n,e.force),C(t,e.force)}let s=h(m(g(import.meta.url)),`..`,`..`,`..`,`..`,`..`);console.log(`
|
|
3
|
+
Installing scaffold files:`),T(s,o,n,e.force),console.log(`
|
|
5
4
|
User-level KB installation complete!`),console.log(`
|
|
6
5
|
Next steps:`),console.log(` 1. Open any workspace in your IDE`),console.log(` 2. The KB server will auto-start and index the workspace`),console.log(` 3. Agents, prompts, skills & instructions are available globally`),console.log(` 4. No per-workspace init needed — just open a project and start coding`)}export{b as detectInstalledIdes,E as initUser,T as installGlobalScaffold,x as writeUserLevelMcpConfig,C as writeVscodeSettings};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{CuratedKnowledgeManager as e}from"./curated-manager.js";import{bridgeMcpLogging as t}from"./mcp-logging.js";import{registerPrompts as n}from"./prompts.js";import{installReplayInterceptor as r}from"./replay-interceptor.js";import{registerResources as i}from"./resources/resources.js";import{getToolMeta as a}from"./tool-metadata.js";import{registerAnalyzeDependenciesTool as o,registerAnalyzeDiagramTool as s,registerAnalyzeEntryPointsTool as c,registerAnalyzePatternsTool as l,registerAnalyzeStructureTool as u,registerAnalyzeSymbolsTool as d,registerBlastRadiusTool as f}from"./tools/analyze.tools.js";import{registerAuditTool as p}from"./tools/audit.tool.js";import{initBridgeComponents as m,registerErPullTool as h,registerErPushTool as g,registerErSyncStatusTool as ee}from"./tools/bridge.tools.js";import{registerCompactTool as te,registerDeadSymbolsTool as ne,registerFileSummaryTool as re,registerFindTool as ie,registerScopeMapTool as ae,registerSymbolTool as oe,registerTraceTool as se}from"./tools/context.tools.js";import{registerErEvolveReviewTool as ce}from"./tools/evolution.tools.js";import{registerBatchTool as le,registerCheckTool as ue,registerDelegateTool as _,registerEvalTool as v,registerParseOutputTool as y,registerTestRunTool as b}from"./tools/execution.tools.js";import{registerDigestTool as x,registerEvidenceMapTool as S,registerForgeClassifyTool as C,registerForgeGroundTool as w,registerStratumCardTool as T}from"./tools/forge.tools.js";import{registerForgetTool as E}from"./tools/forget.tool.js";import{registerGraphTool as D}from"./tools/graph.tool.js";import{registerGuideTool as O,registerHealthTool as k,registerProcessTool as A,registerWatchTool as j,registerWebFetchTool as M}from"./tools/infra.tools.js";import{registerListTool as N}from"./tools/list.tool.js";import{registerLookupTool as P}from"./tools/lookup.tool.js";import{registerCodemodTool as F,registerDataTransformTool as I,registerDiffParseTool as L,registerGitContextTool as R,registerRenameTool as z}from"./tools/manipulation.tools.js";import{registerOnboardTool as B}from"./tools/onboard.tool.js";import{registerCheckpointTool as V,registerLaneTool as H,registerQueueTool as U,registerStashTool as de,registerWorksetTool as fe}from"./tools/persistence.tools.js";import{registerErUpdatePolicyTool as pe}from"./tools/policy.tools.js";import{registerProduceKnowledgeTool as me}from"./tools/produce.tool.js";import{registerReadTool as he}from"./tools/read.tool.js";import{registerReindexTool as ge}from"./tools/reindex.tool.js";import{registerRememberTool as _e}from"./tools/remember.tool.js";import{registerReplayTool as ve}from"./tools/replay.tool.js";import{registerRestoreTool as ye}from"./tools/restore.tool.js";import{registerSearchTool as be}from"./tools/search.tool.js";import{registerStatusTool as xe}from"./tools/status.tool.js";import{registerUpdateTool as Se}from"./tools/update.tool.js";import{registerChangelogTool as Ce,registerEncodeTool as we,registerEnvTool as Te,registerHttpTool as Ee,registerMeasureTool as De,registerRegexTestTool as Oe,registerSchemaValidateTool as ke,registerSnippetTool as Ae,registerTimeTool as je,registerWebSearchTool as Me}from"./tools/utility.tools.js";import{getCurrentVersion as W}from"./version-check.js";import{existsSync as Ne,statSync as Pe}from"node:fs";import{resolve as Fe}from"node:path";import{KB_PATHS as Ie,createLogger as Le,serializeError as G}from"../../core/dist/index.js";import{initializeWasm as Re}from"../../chunker/dist/index.js";import{OnnxEmbedder as ze}from"../../embeddings/dist/index.js";import{EvolutionCollector as Be,PolicyStore as Ve}from"../../enterprise-bridge/dist/index.js";import{FileHashCache as K,IncrementalIndexer as He}from"../../indexer/dist/index.js";import{SqliteGraphStore as Ue,createStore as We}from"../../store/dist/index.js";import{FileCache as Ge}from"../../tools/dist/index.js";import{McpServer as q}from"@modelcontextprotocol/sdk/server/mcp.js";const J=Le(`server`);async function Y(t){J.info(`Initializing knowledge base components`);let n=new ze({model:t.embedding.model,dimensions:t.embedding.dimensions});await n.initialize(),J.info(`Embedder loaded`,{modelId:n.modelId,dimensions:n.dimensions});let r=await We({backend:t.store.backend,path:t.store.path});await r.initialize(),J.info(`Store initialized`);let i=new He(n,r),a=new K(t.store.path);a.load(),i.setHashCache(a);let o=t.curated.path,s=new e(o,r,n),c=new Ue({path:t.store.path});await c.initialize(),J.info(`Graph store initialized`),i.setGraphStore(c),await Re()?J.info(`WASM tree-sitter enabled for AST analysis`):J.warn(`WASM tree-sitter not available; analyzers will use regex fallback`);let l=m(t.er),u=l?new Ve(t.curated.path):void 0;u&&J.info(`Policy store initialized`,{ruleCount:u.getRules().length});let d=l?new Be:void 0,f=Fe(t.sources[0]?.path??process.cwd(),Ie.aiKb),p=Ne(f),h;if(p)try{h=Pe(f).mtime.toISOString()}catch{}return J.info(`Onboard state detected`,{onboardComplete:p,onboardTimestamp:h}),{embedder:n,store:r,indexer:i,curated:s,graphStore:c,fileCache:new Ge,bridge:l,policyStore:u,evolutionCollector:d,onboardComplete:p,onboardTimestamp:h}}function X(e,r){let i=new q({name:r.serverName??`knowledge-base`,version:W()},{capabilities:{logging:{}}});return t(i),Z(i,e,r),n(i),i}function Z(e,t,n){r(e),be(e,t.embedder,t.store,t.graphStore,t.bridge,t.evolutionCollector),P(e,t.store),xe(e,t.store,t.graphStore,t.curated,{onboardComplete:t.onboardComplete,onboardTimestamp:t.onboardTimestamp}),ge(e,t.indexer,n,t.curated,t.store),_e(e,t.curated,t.policyStore,t.evolutionCollector),Se(e,t.curated),E(e,t.curated),he(e,t.curated),N(e,t.curated),u(e,t.store,t.embedder),o(e,t.store,t.embedder),d(e,t.store,t.embedder),l(e,t.store,t.embedder),c(e,t.store,t.embedder),s(e,t.store,t.embedder),f(e,t.store,t.embedder,t.graphStore),me(e),B(e,t.store,t.embedder),D(e,t.graphStore),p(e,t.store,t.embedder),te(e,t.embedder,t.fileCache),ae(e,t.embedder,t.store),ie(e,t.embedder,t.store),y(e),fe(e),ue(e),le(e,t.embedder,t.store),oe(e,t.embedder,t.store,t.graphStore),v(e),b(e),de(e),R(e),L(e),z(e),F(e),ye(e),re(e,t.fileCache),V(e),I(e),se(e,t.embedder,t.store),A(e),j(e),ne(e,t.embedder,t.store),_(e),k(e),H(e),U(e),M(e),O(e),S(e),x(e,t.embedder),C(e),T(e,t.embedder,t.fileCache),w(e,t.embedder,t.store),Me(e),Ee(e),Oe(e),we(e),De(e),Ce(e),ke(e),Ae(e),Te(e),je(e),t.bridge&&(g(e,t.bridge,t.evolutionCollector),h(e,t.bridge),ee(e,t.bridge)),t.policyStore&&pe(e,t.policyStore),t.evolutionCollector&&ce(e,t.evolutionCollector),i(e,t.store,t.curated),ve(e)}async function Ke(e){let t=await Y(e),n=X(t,e);J.info(`MCP server configured`,{toolCount:$.length,resourceCount:2});let r=async()=>{try{let n=e.sources.map(e=>e.path).join(`, `);J.info(`Running initial index`,{sourcePaths:n});let r=await t.indexer.index(e,e=>{e.phase===`crawling`||e.phase===`done`||(e.phase===`chunking`&&e.currentFile&&J.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&J.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});J.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await t.store.createFtsIndex()}catch(e){J.warn(`FTS index creation failed`,G(e))}try{let e=await t.curated.reindexAll();J.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){J.error(`Curated re-index failed`,G(e))}}catch(e){J.error(`Initial index failed; will retry on kb_reindex`,G(e))}},i=async()=>{J.info(`Shutting down`),await t.embedder.shutdown().catch(()=>{}),await t.graphStore.close().catch(()=>{}),await t.store.close(),process.exit(0)};process.on(`SIGINT`,i),process.on(`SIGTERM`,i);let a=process.ppid,o=setInterval(()=>{try{process.kill(a,0)}catch{J.info(`Parent process died; shutting down`,{parentPid:a}),clearInterval(o),i()}},5e3);return o.unref(),{server:n,runInitialIndex:r,shutdown:i}}const qe=new Set(`batch.changelog.check.checkpoint.codemod.compact.data_transform.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.forge_classify.git_context.graph.guide.health.http.lane.measure.onboard.parse_output.process.queue.read.regex_test.reindex.remember.rename.replay.restore.schema_validate.scope_map.snippet.stash.status.stratum_card.test_run.time.update.forget.list.watch.web_fetch.web_search.workset`.split(`.`)),Q=5e3,$=`analyze_dependencies.analyze_diagram.analyze_entry_points.analyze_patterns.analyze_structure.analyze_symbols.audit.batch.blast_radius.changelog.check.checkpoint.codemod.compact.data_transform.dead_symbols.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.find.forge_classify.forge_ground.forget.git_context.graph.guide.health.http.lane.list.lookup.measure.onboard.parse_output.process.produce_knowledge.queue.read.regex_test.reindex.remember.rename.replay.restore.schema_validate.scope_map.search.snippet.stash.status.stratum_card.symbol.test_run.time.trace.update.watch.web_fetch.web_search.workset`.split(`.`);function Je(e){let r=new q({name:e.serverName??`knowledge-base`,version:W()},{capabilities:{logging:{}}});t(r);let i=r.sendToolListChanged.bind(r);r.sendToolListChanged=()=>{};let o=$.map(e=>{let t=a(e);return r.registerTool(e,{title:t.title,description:`${e} (initializing...)`,inputSchema:{},annotations:t.annotations},async()=>({content:[{type:`text`,text:`KB is still initializing, please retry in a few seconds.`}]}))});r.sendToolListChanged=i;let s=r.resource(`kb-status`,`kb://status`,{description:`Knowledge base status (initializing...)`,mimeType:`text/plain`},async()=>({contents:[{uri:`kb://status`,text:`KB is initializing...`,mimeType:`text/plain`}]})),c,l=new Promise(e=>{c=e}),u,d=new Promise(e=>{u=e}),f=()=>u?.(),p=(async()=>{await d;let t=await Y(e),i=r.sendToolListChanged.bind(r);r.sendToolListChanged=()=>{};for(let e of o)e.remove();s.remove(),Z(r,t,e),n(r),r.sendToolListChanged=i,r.sendToolListChanged();let a=r._registeredTools??{};for(let[e,n]of Object.entries(a)){if(qe.has(e))continue;let r=n.handler;n.handler=async(...n)=>{if(!t.indexer.isIndexing)return r(...n);let i=new Promise(t=>setTimeout(()=>t({content:[{type:`text`,text:`⏳ KB is re-indexing. The tool "${e}" timed out waiting for index data (${Q/1e3}s).\n\nThe existing index may be temporarily locked. Please retry shortly — indexing will complete automatically.`}]}),Q));return Promise.race([r(...n),i])}}let l=Object.keys(a).length;l!==$.length&&J.warn(`ALL_TOOL_NAMES count mismatch`,{expectedToolCount:$.length,registeredToolCount:l}),J.info(`MCP server configured`,{toolCount:$.length,resourceCount:4}),c?.(t)})(),m=async()=>{let t=await l;try{let n=e.sources.map(e=>e.path).join(`, `);J.info(`Running initial index`,{sourcePaths:n});let r=await t.indexer.index(e,e=>{e.phase===`crawling`||e.phase===`done`||(e.phase===`chunking`&&e.currentFile&&J.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&J.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});J.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await t.store.createFtsIndex()}catch(e){J.warn(`FTS index creation failed`,G(e))}try{let e=await t.curated.reindexAll();J.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){J.error(`Curated re-index failed`,G(e))}}catch(e){J.error(`Initial index failed; will retry on kb_reindex`,G(e))}},h=process.ppid,g=setInterval(()=>{try{process.kill(h,0)}catch{J.info(`Parent process died; shutting down`,{parentPid:h}),clearInterval(g),l.then(async e=>{await e.embedder.shutdown().catch(()=>{}),await e.graphStore.close().catch(()=>{}),await e.store.close().catch(()=>{})}).catch(()=>{}).finally(()=>process.exit(0))}},5e3);return g.unref(),{server:r,startInit:f,ready:p,runInitialIndex:m}}export{$ as ALL_TOOL_NAMES,Je as createLazyServer,X as createMcpServer,Ke as createServer,Y as initializeKnowledgeBase,Z as registerMcpTools};
|
|
1
|
+
import{CuratedKnowledgeManager as e}from"./curated-manager.js";import{bridgeMcpLogging as t}from"./mcp-logging.js";import{registerPrompts as n}from"./prompts.js";import{installReplayInterceptor as r}from"./replay-interceptor.js";import{registerResources as i}from"./resources/resources.js";import{getToolMeta as a}from"./tool-metadata.js";import{registerAnalyzeDependenciesTool as o,registerAnalyzeDiagramTool as s,registerAnalyzeEntryPointsTool as c,registerAnalyzePatternsTool as l,registerAnalyzeStructureTool as u,registerAnalyzeSymbolsTool as d,registerBlastRadiusTool as f}from"./tools/analyze.tools.js";import{registerAuditTool as p}from"./tools/audit.tool.js";import{initBridgeComponents as m,registerErPullTool as h,registerErPushTool as ee,registerErSyncStatusTool as g}from"./tools/bridge.tools.js";import{registerCompactTool as _,registerDeadSymbolsTool as te,registerFileSummaryTool as ne,registerFindTool as re,registerScopeMapTool as ie,registerSymbolTool as ae,registerTraceTool as oe}from"./tools/context.tools.js";import{registerErEvolveReviewTool as se}from"./tools/evolution.tools.js";import{registerBatchTool as ce,registerCheckTool as v,registerDelegateTool as y,registerEvalTool as b,registerParseOutputTool as x,registerTestRunTool as S}from"./tools/execution.tools.js";import{registerDigestTool as le,registerEvidenceMapTool as C,registerForgeClassifyTool as w,registerForgeGroundTool as ue,registerStratumCardTool as de}from"./tools/forge.tools.js";import{registerForgetTool as fe}from"./tools/forget.tool.js";import{registerGraphTool as pe}from"./tools/graph.tool.js";import{registerGuideTool as T,registerHealthTool as E,registerProcessTool as D,registerWatchTool as O,registerWebFetchTool as k}from"./tools/infra.tools.js";import{registerListTool as me}from"./tools/list.tool.js";import{registerLookupTool as he}from"./tools/lookup.tool.js";import{registerCodemodTool as A,registerDataTransformTool as j,registerDiffParseTool as M,registerGitContextTool as N,registerRenameTool as P}from"./tools/manipulation.tools.js";import{registerOnboardTool as ge}from"./tools/onboard.tool.js";import{registerCheckpointTool as F,registerLaneTool as I,registerQueueTool as L,registerStashTool as R,registerWorksetTool as z}from"./tools/persistence.tools.js";import{registerErUpdatePolicyTool as _e}from"./tools/policy.tools.js";import{registerProduceKnowledgeTool as B}from"./tools/produce.tool.js";import{registerReadTool as ve}from"./tools/read.tool.js";import{registerReindexTool as ye}from"./tools/reindex.tool.js";import{registerRememberTool as be}from"./tools/remember.tool.js";import{registerReplayTool as V}from"./tools/replay.tool.js";import{registerRestoreTool as H}from"./tools/restore.tool.js";import{registerSearchTool as xe}from"./tools/search.tool.js";import{registerStatusTool as Se}from"./tools/status.tool.js";import{registerUpdateTool as Ce}from"./tools/update.tool.js";import{registerChangelogTool as we,registerEncodeTool as U,registerEnvTool as W,registerHttpTool as G,registerMeasureTool as K,registerRegexTestTool as q,registerSchemaValidateTool as Te,registerSnippetTool as Ee,registerTimeTool as De,registerWebSearchTool as Oe}from"./tools/utility.tools.js";import{getCurrentVersion as ke}from"./version-check.js";import{existsSync as Ae,statSync as je}from"node:fs";import{resolve as Me}from"node:path";import{KB_PATHS as Ne,createLogger as Pe,serializeError as J}from"../../core/dist/index.js";import{initializeWasm as Fe}from"../../chunker/dist/index.js";import{OnnxEmbedder as Ie}from"../../embeddings/dist/index.js";import{EvolutionCollector as Le,PolicyStore as Re}from"../../enterprise-bridge/dist/index.js";import{FileHashCache as ze,IncrementalIndexer as Be}from"../../indexer/dist/index.js";import{SqliteGraphStore as Ve,createStore as He}from"../../store/dist/index.js";import{FileCache as Ue}from"../../tools/dist/index.js";import{McpServer as We}from"@modelcontextprotocol/sdk/server/mcp.js";const Y=Pe(`server`);async function X(t){Y.info(`Initializing knowledge base components`);let n=new Ie({model:t.embedding.model,dimensions:t.embedding.dimensions});await n.initialize(),Y.info(`Embedder loaded`,{modelId:n.modelId,dimensions:n.dimensions});let r=await He({backend:t.store.backend,path:t.store.path});await r.initialize(),Y.info(`Store initialized`);let i=new Be(n,r),a=new ze(t.store.path);a.load(),i.setHashCache(a);let o=t.curated.path,s=new e(o,r,n),c=new Ve({path:t.store.path});await c.initialize(),Y.info(`Graph store initialized`),i.setGraphStore(c),await Fe()?Y.info(`WASM tree-sitter enabled for AST analysis`):Y.warn(`WASM tree-sitter not available; analyzers will use regex fallback`);let l=m(t.er),u=l?new Re(t.curated.path):void 0;u&&Y.info(`Policy store initialized`,{ruleCount:u.getRules().length});let d=l?new Le:void 0,f=Me(t.sources[0]?.path??process.cwd(),Ne.aiKb),p=Ae(f),h;if(p)try{h=je(f).mtime.toISOString()}catch{}return Y.info(`Onboard state detected`,{onboardComplete:p,onboardTimestamp:h}),{embedder:n,store:r,indexer:i,curated:s,graphStore:c,fileCache:new Ue,bridge:l,policyStore:u,evolutionCollector:d,onboardComplete:p,onboardTimestamp:h}}function Ge(e,r){let i=new We({name:r.serverName??`knowledge-base`,version:ke()},{capabilities:{logging:{}}});return t(i),Z(i,e,r),n(i),i}function Z(e,t,n){r(e),xe(e,t.embedder,t.store,t.graphStore,t.bridge,t.evolutionCollector),he(e,t.store),Se(e,t.store,t.graphStore,t.curated,{onboardComplete:t.onboardComplete,onboardTimestamp:t.onboardTimestamp}),ye(e,t.indexer,n,t.curated,t.store),be(e,t.curated,t.policyStore,t.evolutionCollector),Ce(e,t.curated),fe(e,t.curated),ve(e,t.curated),me(e,t.curated),u(e,t.store,t.embedder),o(e,t.store,t.embedder),d(e,t.store,t.embedder),l(e,t.store,t.embedder),c(e,t.store,t.embedder),s(e,t.store,t.embedder),f(e,t.store,t.embedder,t.graphStore),B(e),ge(e,t.store,t.embedder),pe(e,t.graphStore),p(e,t.store,t.embedder),_(e,t.embedder,t.fileCache),ie(e,t.embedder,t.store),re(e,t.embedder,t.store),x(e),z(e),v(e),ce(e,t.embedder,t.store),ae(e,t.embedder,t.store,t.graphStore),b(e),S(e),R(e),N(e),M(e),P(e),A(e),H(e),ne(e,t.fileCache),F(e),j(e),oe(e,t.embedder,t.store),D(e),O(e),te(e,t.embedder,t.store),y(e),E(e),I(e),L(e),k(e),T(e),C(e),le(e,t.embedder),w(e),de(e,t.embedder,t.fileCache),ue(e,t.embedder,t.store),Oe(e),G(e),q(e),U(e),K(e),we(e),Te(e),Ee(e),W(e),De(e),t.bridge&&(ee(e,t.bridge,t.evolutionCollector),h(e,t.bridge),g(e,t.bridge)),t.policyStore&&_e(e,t.policyStore),t.evolutionCollector&&se(e,t.evolutionCollector),i(e,t.store,t.curated),V(e)}async function Ke(e){let t=await X(e),n=Ge(t,e);Y.info(`MCP server configured`,{toolCount:$.length,resourceCount:2});let r=async()=>{try{let n=e.sources.map(e=>e.path).join(`, `);Y.info(`Running initial index`,{sourcePaths:n});let r=await t.indexer.index(e,e=>{e.phase===`crawling`||e.phase===`done`||(e.phase===`chunking`&&e.currentFile&&Y.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&Y.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});Y.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await t.store.createFtsIndex()}catch(e){Y.warn(`FTS index creation failed`,J(e))}try{let e=await t.curated.reindexAll();Y.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){Y.error(`Curated re-index failed`,J(e))}}catch(e){Y.error(`Initial index failed; will retry on kb_reindex`,J(e))}},i=async()=>{Y.info(`Shutting down`),await t.embedder.shutdown().catch(()=>{}),await t.graphStore.close().catch(()=>{}),await t.store.close(),process.exit(0)};process.on(`SIGINT`,i),process.on(`SIGTERM`,i);let a=process.ppid,o=setInterval(()=>{try{process.kill(a,0)}catch{Y.info(`Parent process died; shutting down`,{parentPid:a}),clearInterval(o),i()}},5e3);return o.unref(),{server:n,runInitialIndex:r,shutdown:i}}const qe=new Set(`batch.changelog.check.checkpoint.codemod.compact.data_transform.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.forge_classify.git_context.graph.guide.health.http.lane.measure.onboard.parse_output.process.queue.read.regex_test.reindex.remember.rename.replay.restore.schema_validate.scope_map.snippet.stash.status.stratum_card.test_run.time.update.forget.list.watch.web_fetch.web_search.workset`.split(`.`)),Je=5e3,Q=new Set(`changelog.check.checkpoint.codemod.data_transform.delegate.diff_parse.encode.env.eval.evidence_map.forge_classify.git_context.guide.health.http.lane.measure.parse_output.process.produce_knowledge.queue.regex_test.rename.replay.restore.schema_validate.snippet.stash.test_run.time.watch.web_fetch.web_search.workset`.split(`.`));function Ye(e){v(e),b(e),S(e),x(e),y(e),N(e),M(e),P(e),A(e),j(e),z(e),R(e),F(e),H(e),I(e),L(e),E(e),D(e),O(e),k(e),T(e),C(e),w(e),B(e),V(e),Oe(e),G(e),q(e),U(e),K(e),we(e),Te(e),Ee(e),W(e),De(e)}const $=`analyze_dependencies.analyze_diagram.analyze_entry_points.analyze_patterns.analyze_structure.analyze_symbols.audit.batch.blast_radius.changelog.check.checkpoint.codemod.compact.data_transform.dead_symbols.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.find.forge_classify.forge_ground.forget.git_context.graph.guide.health.http.lane.list.lookup.measure.onboard.parse_output.process.produce_knowledge.queue.read.regex_test.reindex.remember.rename.replay.restore.schema_validate.scope_map.search.snippet.stash.status.stratum_card.symbol.test_run.time.trace.update.watch.web_fetch.web_search.workset`.split(`.`);function Xe(e){let r=new We({name:e.serverName??`knowledge-base`,version:ke()},{capabilities:{logging:{}}}),i=`KB is still initializing, please retry in a few seconds.`;t(r);let o=r.sendToolListChanged.bind(r);r.sendToolListChanged=()=>{};let s=[];for(let e of $){let t=a(e),n=r.registerTool(e,{title:t.title,description:`${e} (initializing...)`,inputSchema:{},annotations:t.annotations},async()=>({content:[{type:`text`,text:i}]}));Q.has(e)?n.remove():s.push(n)}Ye(r),r.sendToolListChanged=o;let c=r.resource(`kb-status`,`kb://status`,{description:`Knowledge base status (initializing...)`,mimeType:`text/plain`},async()=>({contents:[{uri:`kb://status`,text:`KB is initializing...`,mimeType:`text/plain`}]})),l=r.prompt(`_init`,`KB is initializing prompts...`,async()=>({messages:[{role:`user`,content:{type:`text`,text:i}}]})),u,d=new Promise(e=>{u=e}),f,p=new Promise(e=>{f=e}),m=()=>f?.(),h=(async()=>{await p;let t=await X(e),i=r.sendToolListChanged.bind(r);r.sendToolListChanged=()=>{};for(let e of s)e.remove();c.remove(),l.remove();let a=r._registeredTools??{};for(let e of Q)a[e]?.remove();Z(r,t,e),n(r),r.sendToolListChanged=i,r.sendToolListChanged();let o=r._registeredTools??{};for(let[e,n]of Object.entries(o)){if(qe.has(e))continue;let r=n.handler;n.handler=async(...n)=>{if(!t.indexer.isIndexing)return r(...n);let i=new Promise(t=>setTimeout(()=>t({content:[{type:`text`,text:`⏳ KB is re-indexing. The tool "${e}" timed out waiting for index data (${Je/1e3}s).\n\nThe existing index may be temporarily locked. Please retry shortly — indexing will complete automatically.`}]}),Je));return Promise.race([r(...n),i])}}let d=Object.keys(o).length;d!==$.length&&Y.warn(`ALL_TOOL_NAMES count mismatch`,{expectedToolCount:$.length,registeredToolCount:d}),Y.info(`MCP server configured`,{toolCount:$.length,resourceCount:4}),u?.(t)})(),ee=async()=>{let t=await d;try{let n=e.sources.map(e=>e.path).join(`, `);Y.info(`Running initial index`,{sourcePaths:n});let r=await t.indexer.index(e,e=>{e.phase===`crawling`||e.phase===`done`||(e.phase===`chunking`&&e.currentFile&&Y.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&Y.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});Y.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await t.store.createFtsIndex()}catch(e){Y.warn(`FTS index creation failed`,J(e))}try{let e=await t.curated.reindexAll();Y.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){Y.error(`Curated re-index failed`,J(e))}}catch(e){Y.error(`Initial index failed; will retry on kb_reindex`,J(e))}},g=process.ppid,_=setInterval(()=>{try{process.kill(g,0)}catch{Y.info(`Parent process died; shutting down`,{parentPid:g}),clearInterval(_),d.then(async e=>{await e.embedder.shutdown().catch(()=>{}),await e.graphStore.close().catch(()=>{}),await e.store.close().catch(()=>{})}).catch(()=>{}).finally(()=>process.exit(0))}},5e3);return _.unref(),{server:r,startInit:m,ready:h,runInitialIndex:ee}}export{$ as ALL_TOOL_NAMES,Xe as createLazyServer,Ge as createMcpServer,Ke as createServer,X as initializeKnowledgeBase,Z as registerMcpTools};
|