@vpxa/kb 0.1.25 → 0.1.27

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.25",
3
+ "version": "0.1.27",
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",
@@ -51,6 +51,7 @@
51
51
  "@modelcontextprotocol/sdk": "^1.x",
52
52
  "express": "^5.x",
53
53
  "linkedom": "^0.x",
54
+ "marked": "^17.x",
54
55
  "minimatch": "^10.x",
55
56
  "sql.js": "^1.x",
56
57
  "tree-sitter-wasms": "~0.1.13",
@@ -18,7 +18,7 @@ interface UserLevelIdePath {
18
18
  globalScaffoldRoot: string | null;
19
19
  /**
20
20
  * User-level instruction file root (may differ from scaffold root).
21
- * VS Code uses ~/.github for copilot-instructions.md but ~/.copilot for agents.
21
+ * VS Code uses ~/.copilot/instructions/ for .instructions.md files.
22
22
  * When null, falls back to globalScaffoldRoot.
23
23
  */
24
24
  instructionsRoot: string | null;
@@ -42,7 +42,7 @@ declare function writeVscodeSettings(idePath: UserLevelIdePath, force?: boolean)
42
42
  * global scaffold root.
43
43
  *
44
44
  * Each IDE has its own global discovery path:
45
- * - VS Code / VSCodium: ~/.copilot/ (agents/, prompts/, skills/) + ~/.github/ (copilot-instructions.md)
45
+ * - VS Code / VSCodium: ~/.copilot/ (agents/, prompts/, skills/, instructions/)
46
46
  * - Claude Code: ~/.claude/ (CLAUDE.md, agents/)
47
47
  * - Cursor: ~/.cursor/ (rules/kb.mdc, agents/, prompts/, skills/)
48
48
  * - Windsurf: ~/.windsurf/ (rules/kb.md, agents/, prompts/, skills/)
@@ -1,4 +1,4 @@
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{smartCopySubdir as o}from"./scaffold.js";import{existsSync as s,mkdirSync as c,readFileSync as l,writeFileSync as u}from"node:fs";import{dirname as d,resolve as f}from"node:path";import{fileURLToPath as p}from"node:url";import{getGlobalDataDir as m,saveRegistry as h}from"../../../../core/dist/index.js";import{homedir as g}from"node:os";function _(){let e=g(),t=process.platform,n=[],r=f(e,`.copilot`),i=f(e,`.github`),a=f(e,`.claude`),o=f(e,`.cursor`),c=f(e,`.windsurf`);if(t===`win32`){let t=process.env.APPDATA??f(e,`AppData`,`Roaming`);n.push({ide:`VS Code`,configDir:f(t,`Code`,`User`),mcpConfigPath:f(t,`Code`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VS Code Insiders`,configDir:f(t,`Code - Insiders`,`User`),mcpConfigPath:f(t,`Code - Insiders`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VSCodium`,configDir:f(t,`VSCodium`,`User`),mcpConfigPath:f(t,`VSCodium`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`Cursor`,configDir:f(t,`Cursor`,`User`),mcpConfigPath:f(t,`Cursor`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Cursor Nightly`,configDir:f(t,`Cursor Nightly`,`User`),mcpConfigPath:f(t,`Cursor Nightly`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Windsurf`,configDir:f(t,`Windsurf`,`User`),mcpConfigPath:f(t,`Windsurf`,`User`,`mcp.json`),globalScaffoldRoot:c,instructionsRoot:null})}else if(t===`darwin`){let t=f(e,`Library`,`Application Support`);n.push({ide:`VS Code`,configDir:f(t,`Code`,`User`),mcpConfigPath:f(t,`Code`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VS Code Insiders`,configDir:f(t,`Code - Insiders`,`User`),mcpConfigPath:f(t,`Code - Insiders`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VSCodium`,configDir:f(t,`VSCodium`,`User`),mcpConfigPath:f(t,`VSCodium`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`Cursor`,configDir:f(t,`Cursor`,`User`),mcpConfigPath:f(t,`Cursor`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Cursor Nightly`,configDir:f(t,`Cursor Nightly`,`User`),mcpConfigPath:f(t,`Cursor Nightly`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Windsurf`,configDir:f(t,`Windsurf`,`User`),mcpConfigPath:f(t,`Windsurf`,`User`,`mcp.json`),globalScaffoldRoot:c,instructionsRoot:null})}else{let t=process.env.XDG_CONFIG_HOME??f(e,`.config`);n.push({ide:`VS Code`,configDir:f(t,`Code`,`User`),mcpConfigPath:f(t,`Code`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VS Code Insiders`,configDir:f(t,`Code - Insiders`,`User`),mcpConfigPath:f(t,`Code - Insiders`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VSCodium`,configDir:f(t,`VSCodium`,`User`),mcpConfigPath:f(t,`VSCodium`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`Cursor`,configDir:f(t,`Cursor`,`User`),mcpConfigPath:f(t,`Cursor`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Cursor Nightly`,configDir:f(t,`Cursor Nightly`,`User`),mcpConfigPath:f(t,`Cursor Nightly`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Windsurf`,configDir:f(t,`Windsurf`,`User`),mcpConfigPath:f(t,`Windsurf`,`User`,`mcp.json`),globalScaffoldRoot:c,instructionsRoot:null})}return n.push({ide:`Claude Code`,configDir:f(e,`.claude`),mcpConfigPath:f(e,`.claude`,`mcp.json`),globalScaffoldRoot:a,instructionsRoot:null}),n.filter(e=>s(e.configDir))}function v(t,n,r=!1){let{mcpConfigPath:i,configDir:a}=t,o={...e},d={};if(s(i)){try{let e=l(i,`utf-8`);d=JSON.parse(e)}catch{let e=`${i}.bak`;u(e,l(i,`utf-8`),`utf-8`),console.log(` Backed up invalid ${i} to ${e}`),d={}}if((d.servers??d.mcpServers??{})[n]&&!r){console.log(` ${t.ide}: ${n} already configured (use --force to update)`);return}}let f=new Set([`VS Code`,`VS Code Insiders`,`VSCodium`,`Windsurf`]).has(t.ide)?`servers`:`mcpServers`,p=d[f]??{};p[n]=o,d[f]=p,c(a,{recursive:!0}),u(i,`${JSON.stringify(d,null,2)}\n`,`utf-8`),console.log(` ${t.ide}: configured ${n} in ${i}`)}const y=new Set([`VS Code`,`VS Code Insiders`,`VSCodium`]);function b(e,t=!1){if(!y.has(e.ide))return;let n=f(e.configDir,`settings.json`),i={};if(s(n))try{let e=l(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&&(u(n,`${JSON.stringify(i,null,2)}\n`,`utf-8`),console.log(` ${e.ide}: updated settings.json`))}function x(e,t,r,l,d=!1){let p=new Set;for(let e of t)e.globalScaffoldRoot&&p.add(e.globalScaffoldRoot);if(p.size===0){console.log(` No IDEs with global scaffold support detected.`);return}let m=f(e,`scaffold`,`general`);for(let t of p){o(m,t,`agents`,l,d),o(m,t,`prompts`,l,d);let r=0;for(let i of n)s(f(e,`skills`,i))&&(o(e,t,`skills/${i}`,l,d),r++);console.log(` ${t}: scaffold updated (${r} skills)`)}let h=new Set,g=a(`kb`,r),_=i(`kb`,r);for(let e of t){if(!e.globalScaffoldRoot)continue;let t=e.globalScaffoldRoot;if(e.ide===`Claude Code`){let e=f(t,`CLAUDE.md`);u(e,`${g}\n---\n\n${_}`,`utf-8`),h.add(e)}else if(e.ide===`VS Code`||e.ide===`VS Code Insiders`||e.ide===`VSCodium`){let n=e.instructionsRoot??t;c(n,{recursive:!0});let r=f(n,`copilot-instructions.md`);h.has(r)||(u(r,`${g}\n---\n\n${_}`,`utf-8`),h.add(r))}else if(e.ide===`Cursor`||e.ide===`Cursor Nightly`){let e=f(t,`rules`);c(e,{recursive:!0});let n=f(e,`kb.mdc`);h.has(n)||(u(n,`${g}\n---\n\n${_}`,`utf-8`),h.add(n))}else if(e.ide===`Windsurf`){let e=f(t,`rules`);c(e,{recursive:!0});let n=f(e,`kb.md`);h.has(n)||(u(n,`${g}\n---\n\n${_}`,`utf-8`),h.add(n))}}h.size>0&&console.log(` Instruction files: ${[...h].join(`, `)}`)}async function S(e){let n=t,r=f(d(p(import.meta.url)),`..`,`..`,`..`,`..`,`..`,`package.json`),i=JSON.parse(l(r,`utf-8`)).version;console.log(`Initializing @vpxa/kb v${i}...\n`);let a=m();c(a,{recursive:!0}),console.log(` Global data store: ${a}`),h({version:1,workspaces:{}}),console.log(` Created registry.json`);let o=_();if(o.length===0)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{smartCopySubdir as o}from"./scaffold.js";import{existsSync as s,mkdirSync as c,readFileSync as l,writeFileSync as u}from"node:fs";import{dirname as d,resolve as f}from"node:path";import{fileURLToPath as p}from"node:url";import{getGlobalDataDir as m,saveRegistry as h}from"../../../../core/dist/index.js";import{homedir as g}from"node:os";function _(){let e=g(),t=process.platform,n=[],r=f(e,`.copilot`),i=f(r,`instructions`),a=f(e,`.claude`),o=f(e,`.cursor`),c=f(e,`.windsurf`);if(t===`win32`){let t=process.env.APPDATA??f(e,`AppData`,`Roaming`);n.push({ide:`VS Code`,configDir:f(t,`Code`,`User`),mcpConfigPath:f(t,`Code`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VS Code Insiders`,configDir:f(t,`Code - Insiders`,`User`),mcpConfigPath:f(t,`Code - Insiders`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VSCodium`,configDir:f(t,`VSCodium`,`User`),mcpConfigPath:f(t,`VSCodium`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`Cursor`,configDir:f(t,`Cursor`,`User`),mcpConfigPath:f(t,`Cursor`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Cursor Nightly`,configDir:f(t,`Cursor Nightly`,`User`),mcpConfigPath:f(t,`Cursor Nightly`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Windsurf`,configDir:f(t,`Windsurf`,`User`),mcpConfigPath:f(t,`Windsurf`,`User`,`mcp.json`),globalScaffoldRoot:c,instructionsRoot:null})}else if(t===`darwin`){let t=f(e,`Library`,`Application Support`);n.push({ide:`VS Code`,configDir:f(t,`Code`,`User`),mcpConfigPath:f(t,`Code`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VS Code Insiders`,configDir:f(t,`Code - Insiders`,`User`),mcpConfigPath:f(t,`Code - Insiders`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VSCodium`,configDir:f(t,`VSCodium`,`User`),mcpConfigPath:f(t,`VSCodium`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`Cursor`,configDir:f(t,`Cursor`,`User`),mcpConfigPath:f(t,`Cursor`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Cursor Nightly`,configDir:f(t,`Cursor Nightly`,`User`),mcpConfigPath:f(t,`Cursor Nightly`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Windsurf`,configDir:f(t,`Windsurf`,`User`),mcpConfigPath:f(t,`Windsurf`,`User`,`mcp.json`),globalScaffoldRoot:c,instructionsRoot:null})}else{let t=process.env.XDG_CONFIG_HOME??f(e,`.config`);n.push({ide:`VS Code`,configDir:f(t,`Code`,`User`),mcpConfigPath:f(t,`Code`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VS Code Insiders`,configDir:f(t,`Code - Insiders`,`User`),mcpConfigPath:f(t,`Code - Insiders`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VSCodium`,configDir:f(t,`VSCodium`,`User`),mcpConfigPath:f(t,`VSCodium`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`Cursor`,configDir:f(t,`Cursor`,`User`),mcpConfigPath:f(t,`Cursor`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Cursor Nightly`,configDir:f(t,`Cursor Nightly`,`User`),mcpConfigPath:f(t,`Cursor Nightly`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Windsurf`,configDir:f(t,`Windsurf`,`User`),mcpConfigPath:f(t,`Windsurf`,`User`,`mcp.json`),globalScaffoldRoot:c,instructionsRoot:null})}return n.push({ide:`Claude Code`,configDir:f(e,`.claude`),mcpConfigPath:f(e,`.claude`,`mcp.json`),globalScaffoldRoot:a,instructionsRoot:null}),n.filter(e=>s(e.configDir))}function v(t,n,r=!1){let{mcpConfigPath:i,configDir:a}=t,o={...e},d={};if(s(i)){try{let e=l(i,`utf-8`);d=JSON.parse(e)}catch{let e=`${i}.bak`;u(e,l(i,`utf-8`),`utf-8`),console.log(` Backed up invalid ${i} to ${e}`),d={}}if((d.servers??d.mcpServers??{})[n]&&!r){console.log(` ${t.ide}: ${n} already configured (use --force to update)`);return}}let f=new Set([`VS Code`,`VS Code Insiders`,`VSCodium`,`Windsurf`]).has(t.ide)?`servers`:`mcpServers`,p=d[f]??{};p[n]=o,d[f]=p,c(a,{recursive:!0}),u(i,`${JSON.stringify(d,null,2)}\n`,`utf-8`),console.log(` ${t.ide}: configured ${n} in ${i}`)}const y=new Set([`VS Code`,`VS Code Insiders`,`VSCodium`]);function b(e,t=!1){if(!y.has(e.ide))return;let n=f(e.configDir,`settings.json`),i={};if(s(n))try{let e=l(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&&(u(n,`${JSON.stringify(i,null,2)}\n`,`utf-8`),console.log(` ${e.ide}: updated settings.json`))}function x(e,t,r,l,d=!1){let p=new Set;for(let e of t)e.globalScaffoldRoot&&p.add(e.globalScaffoldRoot);if(p.size===0){console.log(` No IDEs with global scaffold support detected.`);return}let m=f(e,`scaffold`,`general`);for(let t of p){o(m,t,`agents`,l,d),o(m,t,`prompts`,l,d);let r=0;for(let i of n)s(f(e,`skills`,i))&&(o(e,t,`skills/${i}`,l,d),r++);console.log(` ${t}: scaffold updated (${r} skills)`)}let h=new Set,g=a(`kb`,r),_=i(`kb`,r);for(let e of t){if(!e.globalScaffoldRoot)continue;let t=e.globalScaffoldRoot;if(e.ide===`Claude Code`){let e=f(t,`CLAUDE.md`);u(e,`${g}\n---\n\n${_}`,`utf-8`),h.add(e)}else if(e.ide===`VS Code`||e.ide===`VS Code Insiders`||e.ide===`VSCodium`){let n=e.instructionsRoot??t;c(n,{recursive:!0});let r=f(n,`kb.instructions.md`);h.has(r)||(u(r,`---\napplyTo: "**"\n---\n\n${g}\n---\n\n${_}`,`utf-8`),h.add(r))}else if(e.ide===`Cursor`||e.ide===`Cursor Nightly`){let e=f(t,`rules`);c(e,{recursive:!0});let n=f(e,`kb.mdc`);h.has(n)||(u(n,`${g}\n---\n\n${_}`,`utf-8`),h.add(n))}else if(e.ide===`Windsurf`){let e=f(t,`rules`);c(e,{recursive:!0});let n=f(e,`kb.md`);h.has(n)||(u(n,`${g}\n---\n\n${_}`,`utf-8`),h.add(n))}}h.size>0&&console.log(` Instruction files: ${[...h].join(`, `)}`)}async function S(e){let n=t,r=f(d(p(import.meta.url)),`..`,`..`,`..`,`..`,`..`,`package.json`),i=JSON.parse(l(r,`utf-8`)).version;console.log(`Initializing @vpxa/kb v${i}...\n`);let a=m();c(a,{recursive:!0}),console.log(` Global data store: ${a}`),h({version:1,workspaces:{}}),console.log(` Created registry.json`);let o=_();if(o.length===0)console.log(`
2
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)v(t,n,e.force),b(t,e.force)}let s=f(d(p(import.meta.url)),`..`,`..`,`..`,`..`,`..`);console.log(`
3
3
  Installing scaffold files:`),x(s,o,n,i,e.force),console.log(`
4
4
  User-level KB installation complete!`),console.log(`
@@ -1,3 +1,3 @@
1
- import{CuratedKnowledgeManager as e}from"./curated-manager.js";import{createElicitor as t}from"./elicitor.js";import{bridgeMcpLogging as n}from"./mcp-logging.js";import{registerPrompts as r}from"./prompts.js";import{installReplayInterceptor as i}from"./replay-interceptor.js";import{ResourceNotifier as a}from"./resources/resource-notifier.js";import{registerResources as o}from"./resources/resources.js";import{createSamplingClient as s}from"./sampling.js";import{getToolMeta as c}from"./tool-metadata.js";import{installToolPrefix as l}from"./tool-prefix.js";import{registerAnalyzeDependenciesTool as u,registerAnalyzeDiagramTool as d,registerAnalyzeEntryPointsTool as f,registerAnalyzePatternsTool as p,registerAnalyzeStructureTool as m,registerAnalyzeSymbolsTool as h,registerBlastRadiusTool as ee}from"./tools/analyze.tools.js";import{registerAuditTool as g}from"./tools/audit.tool.js";import{registerBrainstormTool as _}from"./tools/brainstorm.tool.js";import{initBridgeComponents as v,registerErPullTool as te,registerErPushTool as y,registerErSyncStatusTool as b}from"./tools/bridge.tools.js";import{registerCompactTool as x,registerDeadSymbolsTool as S,registerFileSummaryTool as C,registerFindTool as ne,registerScopeMapTool as re,registerSymbolTool as ie,registerTraceTool as ae}from"./tools/context.tools.js";import{registerErEvolveReviewTool as oe}from"./tools/evolution.tools.js";import{registerBatchTool as se,registerCheckTool as w,registerDelegateTool as T,registerEvalTool as E,registerParseOutputTool as D,registerTestRunTool as O}from"./tools/execution.tools.js";import{registerDigestTool as ce,registerEvidenceMapTool as k,registerForgeClassifyTool as A,registerForgeGroundTool as le,registerStratumCardTool as ue}from"./tools/forge.tools.js";import{registerForgetTool as de}from"./tools/forget.tool.js";import{registerGraphTool as fe}from"./tools/graph.tool.js";import{registerGuideTool as j,registerHealthTool as M,registerProcessTool as N,registerWatchTool as P,registerWebFetchTool as F}from"./tools/infra.tools.js";import{registerListTool as pe}from"./tools/list.tool.js";import{registerLookupTool as me}from"./tools/lookup.tool.js";import{registerCodemodTool as I,registerDataTransformTool as L,registerDiffParseTool as R,registerGitContextTool as z,registerRenameTool as B}from"./tools/manipulation.tools.js";import{registerOnboardTool as he}from"./tools/onboard.tool.js";import{registerCheckpointTool as V,registerLaneTool as H,registerQueueTool as U,registerStashTool as W,registerWorksetTool as G}from"./tools/persistence.tools.js";import{registerErUpdatePolicyTool as ge}from"./tools/policy.tools.js";import{registerPresentTool as K}from"./tools/present.tool.js";import{registerProduceKnowledgeTool as q}from"./tools/produce.tool.js";import{registerReadTool as _e}from"./tools/read.tool.js";import{registerReindexTool as ve}from"./tools/reindex.tool.js";import{registerRememberTool as ye}from"./tools/remember.tool.js";import{registerReplayTool as be}from"./tools/replay.tool.js";import{registerRestoreTool as xe}from"./tools/restore.tool.js";import{registerSearchTool as Se}from"./tools/search.tool.js";import{registerStatusTool as Ce}from"./tools/status.tool.js";import{registerUpdateTool as we}from"./tools/update.tool.js";import{registerChangelogTool as Te,registerEncodeTool as Ee,registerEnvTool as De,registerHttpTool as Oe,registerMeasureTool as ke,registerRegexTestTool as Ae,registerSchemaValidateTool as je,registerSnippetTool as Me,registerTimeTool as Ne,registerWebSearchTool as Pe}from"./tools/utility.tools.js";import{getCurrentVersion as Fe}from"./version-check.js";import{existsSync as Ie,statSync as Le}from"node:fs";import{resolve as Re}from"node:path";import{KB_PATHS as ze,createLogger as Be,serializeError as J}from"../../core/dist/index.js";import{initializeWasm as Ve}from"../../chunker/dist/index.js";import{OnnxEmbedder as He}from"../../embeddings/dist/index.js";import{EvolutionCollector as Ue,PolicyStore as We}from"../../enterprise-bridge/dist/index.js";import{FileHashCache as Ge,IncrementalIndexer as Ke}from"../../indexer/dist/index.js";import{SqliteGraphStore as qe,createStore as Je}from"../../store/dist/index.js";import{FileCache as Ye}from"../../tools/dist/index.js";import{McpServer as Xe}from"@modelcontextprotocol/sdk/server/mcp.js";const Y=Be(`server`);async function X(t){Y.info(`Initializing knowledge base components`);let[n,r,i,a]=await Promise.all([(async()=>{let e=new He({model:t.embedding.model,dimensions:t.embedding.dimensions});return await e.initialize(),Y.info(`Embedder loaded`,{modelId:e.modelId,dimensions:e.dimensions}),e})(),(async()=>{let e=await Je({backend:t.store.backend,path:t.store.path});return await e.initialize(),Y.info(`Store initialized`),e})(),(async()=>{let e=new qe({path:t.store.path});return await e.initialize(),Y.info(`Graph store initialized`),e})(),(async()=>{let e=await Ve();return e?Y.info(`WASM tree-sitter enabled for AST analysis`):Y.warn(`WASM tree-sitter not available; analyzers will use regex fallback`),e})()]),o=new Ke(n,r),s=new Ge(t.store.path);s.load(),o.setHashCache(s);let c=t.curated.path,l=new e(c,r,n);o.setGraphStore(i);let u=v(t.er),d=u?new We(t.curated.path):void 0;d&&Y.info(`Policy store initialized`,{ruleCount:d.getRules().length});let f=u?new Ue:void 0,p=Re(t.sources[0]?.path??process.cwd(),ze.aiKb),m=Ie(p),h;if(m)try{h=Le(p).mtime.toISOString()}catch{}return Y.info(`Onboard state detected`,{onboardComplete:m,onboardTimestamp:h}),{embedder:n,store:r,indexer:o,curated:l,graphStore:i,fileCache:new Ye,bridge:u,policyStore:d,evolutionCollector:f,onboardComplete:m,onboardTimestamp:h}}function Ze(e,i){let o=new Xe({name:i.serverName??`knowledge-base`,version:Fe()},{capabilities:{logging:{}}});return n(o),l(o,i.toolPrefix??``),Z(o,e,i,t(o),new a(o),s(o)),r(o,{curated:e.curated,store:e.store,graphStore:e.graphStore}),o}function Z(e,t,n,r,a,s){i(e),Se(e,t.embedder,t.store,t.graphStore,t.bridge,t.evolutionCollector,s),me(e,t.store),Ce(e,t.store,t.graphStore,t.curated,{onboardComplete:t.onboardComplete,onboardTimestamp:t.onboardTimestamp}),ve(e,t.indexer,n,t.curated,t.store,a),ye(e,t.curated,t.policyStore,t.evolutionCollector,a),we(e,t.curated,a),de(e,t.curated,a),_e(e,t.curated),pe(e,t.curated),m(e,t.store,t.embedder),u(e,t.store,t.embedder),h(e,t.store,t.embedder),p(e,t.store,t.embedder),f(e,t.store,t.embedder),d(e,t.store,t.embedder),ee(e,t.store,t.embedder,t.graphStore),q(e),he(e,t.store,t.embedder),fe(e,t.graphStore),g(e,t.store,t.embedder),x(e,t.embedder,t.fileCache),re(e,t.embedder,t.store),ne(e,t.embedder,t.store),D(e),G(e),w(e),se(e,t.embedder,t.store),ie(e,t.embedder,t.store,t.graphStore),E(e),O(e),W(e),z(e),R(e),B(e),I(e),xe(e),C(e,t.fileCache),V(e),L(e),ae(e,t.embedder,t.store),N(e),P(e),S(e,t.embedder,t.store),T(e,s),M(e),H(e),U(e),F(e),j(e),k(e),ce(e,t.embedder),A(e),ue(e,t.embedder,t.fileCache),le(e,t.embedder,t.store),K(e,r),r&&_(e,r),Pe(e),Oe(e),Ae(e),Ee(e),ke(e),Te(e),je(e),Me(e),De(e),Ne(e),t.bridge&&(y(e,t.bridge,t.evolutionCollector),te(e,t.bridge),b(e,t.bridge)),t.policyStore&&ge(e,t.policyStore),t.evolutionCollector&&oe(e,t.evolutionCollector),o(e,t.store,t.curated),be(e)}async function Qe(e){let t=await X(e),n=Ze(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 $e=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.present.process.produce_knowledge.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(`.`)),et=5e3,Q=new Set(`changelog.check.checkpoint.codemod.data_transform.delegate.diff_parse.encode.env.eval.evidence_map.forge_classify.git_context.guide.present.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 tt(e){w(e),E(e),O(e),D(e),T(e),z(e),R(e),B(e),I(e),L(e),G(e),W(e),V(e),xe(e),H(e),U(e),M(e),N(e),P(e),F(e),j(e),k(e),A(e),K(e),q(e),be(e),Pe(e),Oe(e),Ae(e),Ee(e),ke(e),Te(e),je(e),Me(e),De(e),Ne(e)}const $=`analyze_dependencies.analyze_diagram.analyze_entry_points.analyze_patterns.analyze_structure.analyze_symbols.audit.batch.blast_radius.brainstorm.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.present.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 nt(e){let i=new Xe({name:e.serverName??`knowledge-base`,version:Fe()},{capabilities:{logging:{}}}),o=`initializing`,u=``,d=!1,f=()=>o===`failed`?[`❌ KB initialization failed — this tool is unavailable.`,``,u?`Error: ${u}`:``,``,`**35 tools are still available** and fully functional:`,`check, eval, test_run, git_context, health, measure, web_fetch, web_search,`,`regex_test, encode, stash, checkpoint, lane, process, time, env, and more.`,``,`Try restarting the MCP server to retry initialization.`].filter(Boolean).join(`
1
+ import{CuratedKnowledgeManager as e}from"./curated-manager.js";import{createElicitor as t,noopElicitor as n}from"./elicitor.js";import{bridgeMcpLogging as r}from"./mcp-logging.js";import{registerPrompts as i}from"./prompts.js";import{installReplayInterceptor as a}from"./replay-interceptor.js";import{ResourceNotifier as o}from"./resources/resource-notifier.js";import{registerResources as s}from"./resources/resources.js";import{createSamplingClient as c}from"./sampling.js";import{getToolMeta as l}from"./tool-metadata.js";import{installToolPrefix as u}from"./tool-prefix.js";import{registerAnalyzeDependenciesTool as d,registerAnalyzeDiagramTool as f,registerAnalyzeEntryPointsTool as p,registerAnalyzePatternsTool as m,registerAnalyzeStructureTool as h,registerAnalyzeSymbolsTool as ee,registerBlastRadiusTool as g}from"./tools/analyze.tools.js";import{registerAuditTool as _}from"./tools/audit.tool.js";import{registerBrainstormTool as v}from"./tools/brainstorm.tool.js";import{initBridgeComponents as te,registerErPullTool as y,registerErPushTool as b,registerErSyncStatusTool as x}from"./tools/bridge.tools.js";import{registerCompactTool as S,registerDeadSymbolsTool as C,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 le,registerDelegateTool as w,registerEvalTool as T,registerParseOutputTool as E,registerTestRunTool as D}from"./tools/execution.tools.js";import{registerDigestTool as ue,registerEvidenceMapTool as O,registerForgeClassifyTool as k,registerForgeGroundTool as de,registerStratumCardTool as fe}from"./tools/forge.tools.js";import{registerForgetTool as pe}from"./tools/forget.tool.js";import{registerGraphTool as me}from"./tools/graph.tool.js";import{registerGuideTool as A,registerHealthTool as j,registerProcessTool as M,registerWatchTool as N,registerWebFetchTool as P}from"./tools/infra.tools.js";import{registerListTool as he}from"./tools/list.tool.js";import{registerLookupTool as ge}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 _e}from"./tools/onboard.tool.js";import{registerCheckpointTool as B,registerLaneTool as V,registerQueueTool as H,registerStashTool as U,registerWorksetTool as W}from"./tools/persistence.tools.js";import{registerErUpdatePolicyTool as ve}from"./tools/policy.tools.js";import{registerPresentTool as G}from"./tools/present.tool.js";import{registerProduceKnowledgeTool as K}from"./tools/produce.tool.js";import{registerReadTool as ye}from"./tools/read.tool.js";import{registerReindexTool as be}from"./tools/reindex.tool.js";import{registerRememberTool as xe}from"./tools/remember.tool.js";import{registerReplayTool as q}from"./tools/replay.tool.js";import{registerRestoreTool as Se}from"./tools/restore.tool.js";import{registerSearchTool as Ce}from"./tools/search.tool.js";import{registerStatusTool as we}from"./tools/status.tool.js";import{registerUpdateTool as Te}from"./tools/update.tool.js";import{registerChangelogTool as Ee,registerEncodeTool as De,registerEnvTool as Oe,registerHttpTool as ke,registerMeasureTool as Ae,registerRegexTestTool as je,registerSchemaValidateTool as Me,registerSnippetTool as Ne,registerTimeTool as Pe,registerWebSearchTool as Fe}from"./tools/utility.tools.js";import{getCurrentVersion as Ie}from"./version-check.js";import{existsSync as Le,statSync as Re}from"node:fs";import{resolve as ze}from"node:path";import{KB_PATHS as Be,createLogger as Ve,serializeError as J}from"../../core/dist/index.js";import{initializeWasm as He}from"../../chunker/dist/index.js";import{OnnxEmbedder as Ue}from"../../embeddings/dist/index.js";import{EvolutionCollector as We,PolicyStore as Ge}from"../../enterprise-bridge/dist/index.js";import{FileHashCache as Ke,IncrementalIndexer as qe}from"../../indexer/dist/index.js";import{SqliteGraphStore as Je,createStore as Ye}from"../../store/dist/index.js";import{FileCache as Xe}from"../../tools/dist/index.js";import{McpServer as Ze}from"@modelcontextprotocol/sdk/server/mcp.js";const Y=Ve(`server`);async function X(t){Y.info(`Initializing knowledge base components`);let[n,r,i,a]=await Promise.all([(async()=>{let e=new Ue({model:t.embedding.model,dimensions:t.embedding.dimensions});return await e.initialize(),Y.info(`Embedder loaded`,{modelId:e.modelId,dimensions:e.dimensions}),e})(),(async()=>{let e=await Ye({backend:t.store.backend,path:t.store.path});return await e.initialize(),Y.info(`Store initialized`),e})(),(async()=>{let e=new Je({path:t.store.path});return await e.initialize(),Y.info(`Graph store initialized`),e})(),(async()=>{let e=await He();return e?Y.info(`WASM tree-sitter enabled for AST analysis`):Y.warn(`WASM tree-sitter not available; analyzers will use regex fallback`),e})()]),o=new qe(n,r),s=new Ke(t.store.path);s.load(),o.setHashCache(s);let c=t.curated.path,l=new e(c,r,n);o.setGraphStore(i);let u=te(t.er),d=u?new Ge(t.curated.path):void 0;d&&Y.info(`Policy store initialized`,{ruleCount:d.getRules().length});let f=u?new We:void 0,p=ze(t.sources[0]?.path??process.cwd(),Be.aiKb),m=Le(p),h;if(m)try{h=Re(p).mtime.toISOString()}catch{}return Y.info(`Onboard state detected`,{onboardComplete:m,onboardTimestamp:h}),{embedder:n,store:r,indexer:o,curated:l,graphStore:i,fileCache:new Xe,bridge:u,policyStore:d,evolutionCollector:f,onboardComplete:m,onboardTimestamp:h}}function Qe(e,n){let a=new Ze({name:n.serverName??`knowledge-base`,version:Ie()},{capabilities:{logging:{}}});return r(a),u(a,n.toolPrefix??``),Z(a,e,n,t(a),new o(a),c(a)),i(a,{curated:e.curated,store:e.store,graphStore:e.graphStore}),a}function Z(e,t,n,r,i,o){a(e),Ce(e,t.embedder,t.store,t.graphStore,t.bridge,t.evolutionCollector,o),ge(e,t.store),we(e,t.store,t.graphStore,t.curated,{onboardComplete:t.onboardComplete,onboardTimestamp:t.onboardTimestamp}),be(e,t.indexer,n,t.curated,t.store,i),xe(e,t.curated,t.policyStore,t.evolutionCollector,i),Te(e,t.curated,i),pe(e,t.curated,i),ye(e,t.curated),he(e,t.curated),h(e,t.store,t.embedder),d(e,t.store,t.embedder),ee(e,t.store,t.embedder),m(e,t.store,t.embedder),p(e,t.store,t.embedder),f(e,t.store,t.embedder),g(e,t.store,t.embedder,t.graphStore),K(e),_e(e,t.store,t.embedder),me(e,t.graphStore),_(e,t.store,t.embedder),S(e,t.embedder,t.fileCache),ie(e,t.embedder,t.store),re(e,t.embedder,t.store),E(e),W(e),le(e),ce(e,t.embedder,t.store),ae(e,t.embedder,t.store,t.graphStore),T(e),D(e),U(e),R(e),L(e),z(e),F(e),Se(e),ne(e,t.fileCache),B(e),I(e),oe(e,t.embedder,t.store),M(e),N(e),C(e,t.embedder,t.store),w(e,o),j(e),V(e),H(e),P(e),A(e),O(e),ue(e,t.embedder),k(e),fe(e,t.embedder,t.fileCache),de(e,t.embedder,t.store),G(e,r),r&&v(e,r),Fe(e),ke(e),je(e),De(e),Ae(e),Ee(e),Me(e),Ne(e),Oe(e),Pe(e),t.bridge&&(b(e,t.bridge,t.evolutionCollector),y(e,t.bridge),x(e,t.bridge)),t.policyStore&&ve(e,t.policyStore),t.evolutionCollector&&se(e,t.evolutionCollector),s(e,t.store,t.curated),q(e)}async function $e(e){let t=await X(e),n=Qe(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 et=new Set(`batch.brainstorm.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.present.process.produce_knowledge.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(`.`)),tt=5e3,Q=new Set(`brainstorm.changelog.check.checkpoint.codemod.data_transform.delegate.diff_parse.encode.env.eval.evidence_map.forge_classify.git_context.guide.present.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 nt(e){le(e),T(e),D(e),E(e),w(e),R(e),L(e),z(e),F(e),I(e),W(e),U(e),B(e),Se(e),V(e),H(e),j(e),M(e),N(e),P(e),A(e),O(e),k(e),G(e),v(e,n),K(e),q(e),Fe(e),ke(e),je(e),De(e),Ae(e),Ee(e),Me(e),Ne(e),Oe(e),Pe(e)}const $=`analyze_dependencies.analyze_diagram.analyze_entry_points.analyze_patterns.analyze_structure.analyze_symbols.audit.batch.blast_radius.brainstorm.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.present.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 rt(e){let n=new Ze({name:e.serverName??`knowledge-base`,version:Ie()},{capabilities:{logging:{}}}),a=`initializing`,s=``,d=!1,f=()=>a===`failed`?[`❌ KB initialization failed — this tool is unavailable.`,``,s?`Error: ${s}`:``,``,`**35 tools are still available** and fully functional:`,`check, eval, test_run, git_context, health, measure, web_fetch, web_search,`,`regex_test, encode, stash, checkpoint, lane, process, time, env, and more.`,``,`Try restarting the MCP server to retry initialization.`].filter(Boolean).join(`
2
2
  `):[`KB is still initializing (loading embeddings model & store).`,``,`**35 tools are already available** while initialization completes — including:`,`check, eval, test_run, git_context, health, measure, web_fetch, web_search,`,`regex_test, encode, stash, checkpoint, lane, process, time, env, and more.`,``,`This tool requires the knowledge base index. Please retry in a few seconds,`,`or use one of the available tools above in the meantime.`].join(`
3
- `);n(i),l(i,e.toolPrefix??``);let p=i.sendToolListChanged.bind(i);i.sendToolListChanged=()=>{};let m=[];for(let e of $){let t=c(e),n=i.registerTool(e,{title:t.title,description:`${t.title} — initializing, available shortly`,inputSchema:{},annotations:t.annotations},async()=>({content:[{type:`text`,text:f()}]}));Q.has(e)?n.remove():m.push(n)}tt(i),i.sendToolListChanged=p;let h=i.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`}]})),ee=i.prompt(`_init`,`KB is initializing prompts...`,async()=>({messages:[{role:`user`,content:{type:`text`,text:f()}}]})),g,_=new Promise(e=>{g=e}),v,te=new Promise(e=>{v=e}),y=()=>v?.(),b=(async()=>{await te;let n;try{n=await X(e)}catch(e){o=`failed`,u=e instanceof Error?e.message:String(e),Y.error(`KB initialization failed — server continuing with zero-dep tools only`,{error:u});return}let c=i.sendToolListChanged.bind(i);i.sendToolListChanged=()=>{};let l=i.sendPromptListChanged.bind(i);i.sendPromptListChanged=()=>{};let f=i.sendResourceListChanged.bind(i);i.sendResourceListChanged=()=>{};for(let e of m)e.remove();h.remove(),ee.remove();let p=i._registeredTools??{};for(let e of Q)p[e]?.remove();let _=new a(i),v=s(i);Z(i,n,e,t(i),_,v),r(i),i.sendToolListChanged=c,i.sendPromptListChanged=l,i.sendResourceListChanged=f,Promise.resolve(i.sendToolListChanged()).catch(()=>{}),Promise.resolve(i.sendPromptListChanged()).catch(()=>{}),Promise.resolve(i.sendResourceListChanged()).catch(()=>{});let y=i._registeredTools??{};for(let[e,t]of Object.entries(y)){if($e.has(e))continue;let r=t.handler;t.handler=async(...t)=>{if(!n.indexer.isIndexing)return r(...t);let i=d?`re-indexing`:`running initial index`,a=new Promise(t=>setTimeout(()=>t({content:[{type:`text`,text:`⏳ KB is ${i}. The tool "${e}" timed out waiting for index data (${et/1e3}s).\n\nThe existing index may be temporarily locked. Please retry shortly — indexing will complete automatically.`}]}),et));return Promise.race([r(...t),a])}}let b=Object.keys(y).length;b!==$.length&&Y.warn(`ALL_TOOL_NAMES count mismatch`,{expectedToolCount:$.length,registeredToolCount:b}),Y.info(`MCP server configured`,{toolCount:$.length,resourceCount:4}),g?.(n)})(),x=async()=>{let t=await _;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}))});d=!0,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))}},S=process.ppid,C=setInterval(()=>{try{process.kill(S,0)}catch{Y.info(`Parent process died; shutting down`,{parentPid:S}),clearInterval(C),_.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 C.unref(),{server:i,startInit:y,ready:b,runInitialIndex:x}}export{$ as ALL_TOOL_NAMES,nt as createLazyServer,Ze as createMcpServer,Qe as createServer,X as initializeKnowledgeBase,Z as registerMcpTools};
3
+ `);r(n),u(n,e.toolPrefix??``);let p=n.sendToolListChanged.bind(n);n.sendToolListChanged=()=>{};let m=[];for(let e of $){let t=l(e),r=n.registerTool(e,{title:t.title,description:`${t.title} — initializing, available shortly`,inputSchema:{},annotations:t.annotations},async()=>({content:[{type:`text`,text:f()}]}));Q.has(e)?r.remove():m.push(r)}nt(n),n.sendToolListChanged=p;let h=n.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`}]})),ee=n.prompt(`_init`,`KB is initializing prompts...`,async()=>({messages:[{role:`user`,content:{type:`text`,text:f()}}]})),g,_=new Promise(e=>{g=e}),v,te=new Promise(e=>{v=e}),y=()=>v?.(),b=(async()=>{await te;let r;try{r=await X(e)}catch(e){a=`failed`,s=e instanceof Error?e.message:String(e),Y.error(`KB initialization failed — server continuing with zero-dep tools only`,{error:s});return}let l=n.sendToolListChanged.bind(n);n.sendToolListChanged=()=>{};let u=n.sendPromptListChanged.bind(n);n.sendPromptListChanged=()=>{};let f=n.sendResourceListChanged.bind(n);n.sendResourceListChanged=()=>{};for(let e of m)e.remove();h.remove(),ee.remove();let p=n._registeredTools??{};for(let e of Q)p[e]?.remove();let _=new o(n),v=c(n);Z(n,r,e,t(n),_,v),i(n),n.sendToolListChanged=l,n.sendPromptListChanged=u,n.sendResourceListChanged=f,Promise.resolve(n.sendToolListChanged()).catch(()=>{}),Promise.resolve(n.sendPromptListChanged()).catch(()=>{}),Promise.resolve(n.sendResourceListChanged()).catch(()=>{});let y=n._registeredTools??{};for(let[e,t]of Object.entries(y)){if(et.has(e))continue;let n=t.handler;t.handler=async(...t)=>{if(!r.indexer.isIndexing)return n(...t);let i=d?`re-indexing`:`running initial index`,a=new Promise(t=>setTimeout(()=>t({content:[{type:`text`,text:`⏳ KB is ${i}. The tool "${e}" timed out waiting for index data (${tt/1e3}s).\n\nThe existing index may be temporarily locked. Please retry shortly — indexing will complete automatically.`}]}),tt));return Promise.race([n(...t),a])}}let b=Object.keys(y).length;b!==$.length&&Y.warn(`ALL_TOOL_NAMES count mismatch`,{expectedToolCount:$.length,registeredToolCount:b}),Y.info(`MCP server configured`,{toolCount:$.length,resourceCount:4}),g?.(r)})(),x=async()=>{let t=await _;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}))});d=!0,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))}},S=process.ppid,C=setInterval(()=>{try{process.kill(S,0)}catch{Y.info(`Parent process died; shutting down`,{parentPid:S}),clearInterval(C),_.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 C.unref(),{server:n,startInit:y,ready:b,runInitialIndex:x}}export{$ as ALL_TOOL_NAMES,rt as createLazyServer,Qe as createMcpServer,$e as createServer,X as initializeKnowledgeBase,Z as registerMcpTools};