@vpxa/kb 0.1.27 → 0.1.29

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.
Files changed (107) hide show
  1. package/package.json +1 -1
  2. package/packages/analyzers/dist/symbol-analyzer.js +4 -4
  3. package/packages/analyzers/dist/types.d.ts +8 -0
  4. package/packages/chunker/dist/chunker.interface.d.ts +1 -1
  5. package/packages/chunker/dist/code-chunker.d.ts +1 -1
  6. package/packages/chunker/dist/extractors/symbol-extractor.js +3 -1
  7. package/packages/chunker/dist/extractors/types.d.ts +8 -0
  8. package/packages/chunker/dist/generic-chunker.d.ts +1 -1
  9. package/packages/chunker/dist/markdown-chunker.d.ts +1 -1
  10. package/packages/chunker/dist/wasm-chunker.d.ts +1 -1
  11. package/packages/cli/dist/commands/upgrade.d.ts +6 -0
  12. package/packages/cli/dist/commands/upgrade.js +1 -0
  13. package/packages/cli/dist/helpers.d.ts +2 -2
  14. package/packages/cli/dist/index.js +2 -2
  15. package/packages/cli/dist/kb-init.d.ts +4 -4
  16. package/packages/core/dist/types.d.ts +2 -0
  17. package/packages/elicitation/dist/index.d.ts +2 -2
  18. package/packages/elicitation/dist/index.js +2 -2
  19. package/packages/enterprise-bridge/dist/result-merger.d.ts +1 -1
  20. package/packages/indexer/dist/graph-extractor.d.ts +1 -1
  21. package/packages/indexer/dist/incremental-indexer.d.ts +3 -3
  22. package/packages/kb-client/dist/direct-client.d.ts +2 -2
  23. package/packages/present/dist/index.html +4 -4
  24. package/packages/server/dist/completions.d.ts +1 -1
  25. package/packages/server/dist/config.d.ts +1 -1
  26. package/packages/server/dist/config.js +1 -1
  27. package/packages/server/dist/cross-workspace.d.ts +2 -2
  28. package/packages/server/dist/curated-manager.d.ts +2 -2
  29. package/packages/server/dist/dashboard-static.d.ts +2 -2
  30. package/packages/server/dist/elicitor.d.ts +1 -1
  31. package/packages/server/dist/index.js +1 -1
  32. package/packages/server/dist/output-schemas.d.ts +4 -0
  33. package/packages/server/dist/output-schemas.js +1 -1
  34. package/packages/server/dist/prompts.d.ts +1 -1
  35. package/packages/server/dist/resources/resources.d.ts +1 -1
  36. package/packages/server/dist/server.d.ts +7 -7
  37. package/packages/server/dist/server.js +2 -2
  38. package/packages/server/dist/structured-content-guard.d.ts +26 -0
  39. package/packages/server/dist/structured-content-guard.js +1 -0
  40. package/packages/server/dist/tools/analyze.tools.d.ts +2 -2
  41. package/packages/server/dist/tools/audit.tool.d.ts +2 -2
  42. package/packages/server/dist/tools/brainstorm.tool.d.ts +1 -1
  43. package/packages/server/dist/tools/bridge.tools.d.ts +1 -1
  44. package/packages/server/dist/tools/context.tools.d.ts +3 -3
  45. package/packages/server/dist/tools/context.tools.js +2 -1
  46. package/packages/server/dist/tools/evolution.tools.d.ts +1 -1
  47. package/packages/server/dist/tools/execution.tools.d.ts +2 -2
  48. package/packages/server/dist/tools/forge.tools.d.ts +3 -3
  49. package/packages/server/dist/tools/graph.tool.d.ts +1 -1
  50. package/packages/server/dist/tools/infra.tools.js +4 -2
  51. package/packages/server/dist/tools/lookup.tool.d.ts +1 -1
  52. package/packages/server/dist/tools/onboard.tool.d.ts +4 -3
  53. package/packages/server/dist/tools/onboard.tool.js +1 -1
  54. package/packages/server/dist/tools/policy.tools.d.ts +1 -1
  55. package/packages/server/dist/tools/present.tool.d.ts +1 -1
  56. package/packages/server/dist/tools/produce.tool.d.ts +2 -1
  57. package/packages/server/dist/tools/produce.tool.js +2 -2
  58. package/packages/server/dist/tools/reindex.tool.d.ts +3 -3
  59. package/packages/server/dist/tools/remember.tool.d.ts +1 -1
  60. package/packages/server/dist/tools/search.tool.d.ts +3 -3
  61. package/packages/server/dist/tools/status.tool.d.ts +3 -2
  62. package/packages/server/dist/tools/status.tool.js +2 -2
  63. package/packages/server/dist/tools/utility.tools.js +4 -2
  64. package/packages/server/dist/version-check.js +1 -1
  65. package/packages/store/dist/lance-store.d.ts +1 -1
  66. package/packages/store/dist/store.interface.d.ts +1 -1
  67. package/packages/tools/dist/audit.d.ts +2 -2
  68. package/packages/tools/dist/compact.d.ts +1 -1
  69. package/packages/tools/dist/dead-symbols.d.ts +2 -2
  70. package/packages/tools/dist/digest.d.ts +1 -1
  71. package/packages/tools/dist/find-examples.d.ts +3 -3
  72. package/packages/tools/dist/find.d.ts +7 -3
  73. package/packages/tools/dist/find.js +1 -1
  74. package/packages/tools/dist/forge-ground.d.ts +2 -2
  75. package/packages/tools/dist/graph-query.d.ts +1 -1
  76. package/packages/tools/dist/onboard.js +18 -2
  77. package/packages/tools/dist/scope-map.d.ts +3 -3
  78. package/packages/tools/dist/stratum-card.d.ts +1 -1
  79. package/packages/tools/dist/symbol.d.ts +2 -2
  80. package/packages/tools/dist/trace.d.ts +2 -2
  81. package/packages/tui/dist/App.d.ts +1 -1
  82. package/packages/tui/dist/hooks/useKBClient.d.ts +3 -3
  83. package/packages/tui/dist/index.d.ts +1 -1
  84. package/scaffold/README.md +192 -0
  85. package/scaffold/definitions/bodies.mjs +140 -28
  86. package/scaffold/definitions/protocols.mjs +232 -24
  87. package/scaffold/general/agents/Debugger.agent.md +9 -6
  88. package/scaffold/general/agents/Documenter.agent.md +13 -2
  89. package/scaffold/general/agents/Explorer.agent.md +12 -0
  90. package/scaffold/general/agents/Frontend.agent.md +1 -1
  91. package/scaffold/general/agents/Implementer.agent.md +3 -1
  92. package/scaffold/general/agents/Orchestrator.agent.md +67 -11
  93. package/scaffold/general/agents/Planner.agent.md +19 -2
  94. package/scaffold/general/agents/Refactor.agent.md +1 -1
  95. package/scaffold/general/agents/Security.agent.md +13 -2
  96. package/scaffold/general/agents/_shared/architect-reviewer-base.md +11 -2
  97. package/scaffold/general/agents/_shared/code-agent-base.md +181 -17
  98. package/scaffold/general/agents/_shared/code-reviewer-base.md +11 -2
  99. package/scaffold/general/agents/_shared/researcher-base.md +29 -3
  100. package/packages/elicitation/dist/__tests__/build.test.d.ts +0 -1
  101. package/packages/elicitation/dist/__tests__/fields.test.d.ts +0 -1
  102. package/packages/elicitation/dist/__tests__/normalize.test.d.ts +0 -1
  103. package/packages/elicitation/dist/build.d.ts +0 -13
  104. package/packages/elicitation/dist/fields.d.ts +0 -41
  105. package/packages/elicitation/dist/normalize.d.ts +0 -15
  106. package/packages/elicitation/dist/types.d.ts +0 -85
  107. /package/packages/tui/dist/{types-VcTHNV6s.d.ts → index-Cvx1a7S7.d.ts} +0 -0
@@ -1 +1 @@
1
- import{fileURLToPath as e}from"node:url";import{createLogger as t,serializeError as n}from"../../core/dist/index.js";import{parseArgs as r}from"node:util";const i=t(`server`),{values:a}=r({options:{transport:{type:`string`,default:process.env.KB_TRANSPORT??`stdio`},port:{type:`string`,default:process.env.KB_PORT??`3210`}}});async function o(){if(process.on(`unhandledRejection`,e=>{i.error(`Unhandled rejection`,n(e))}),i.info(`Starting MCP Knowledge Base server`),a.transport===`http`){let[{default:e},{loadConfig:t},{registerDashboardRoutes:r,resolveDashboardDir:o}]=await Promise.all([import(`express`),import(`./config.js`),import(`./dashboard-static.js`)]),s=t();i.info(`Config loaded`,{sourceCount:s.sources.length,storePath:s.store.path});let c=e();c.use(e.json());let l=Number(a.port);c.use((e,t,n)=>{if(t.setHeader(`Access-Control-Allow-Origin`,process.env.KB_CORS_ORIGIN??`http://localhost:${l}`),t.setHeader(`Access-Control-Allow-Methods`,`GET, POST, DELETE, OPTIONS`),t.setHeader(`Access-Control-Allow-Headers`,`Content-Type, Authorization`),e.method===`OPTIONS`){t.status(204).end();return}n()}),r(c,o(),i),c.get(`/health`,(e,t)=>{t.json({status:`ok`})});let u=!1,d=null,f=null,p=Promise.resolve();c.post(`/mcp`,async(e,t)=>{if(!u||!d||!f){t.status(503).json({jsonrpc:`2.0`,error:{code:-32603,message:`Server initializing — please retry in a few seconds`},id:null});return}let r=p,a;p=new Promise(e=>{a=e}),await r;try{let n=new f({sessionIdGenerator:void 0});await d.connect(n),await n.handleRequest(e,t,e.body),n.close()}catch(e){if(i.error(`MCP handler error`,n(e)),!t.headersSent){let n=e instanceof Error?e.message:String(e),r=n.includes(`Not Acceptable`);t.status(r?406:500).json({jsonrpc:`2.0`,error:{code:r?-32e3:-32603,message:r?n:`Internal server error`},id:null})}}finally{a()}}),c.get(`/mcp`,(e,t)=>{t.writeHead(405).end(JSON.stringify({jsonrpc:`2.0`,error:{code:-32e3,message:`Method not allowed.`},id:null}))}),c.delete(`/mcp`,(e,t)=>{t.writeHead(405).end(JSON.stringify({jsonrpc:`2.0`,error:{code:-32e3,message:`Method not allowed.`},id:null}))});let m=c.listen(l,`127.0.0.1`,()=>{i.info(`MCP server listening`,{url:`http://127.0.0.1:${l}/mcp`,port:l}),setTimeout(async()=>{try{let[{createLazyServer:e,ALL_TOOL_NAMES:t},{StreamableHTTPServerTransport:r},{checkForUpdates:a}]=await Promise.all([import(`./server.js`),import(`@modelcontextprotocol/sdk/server/streamableHttp.js`),import(`./version-check.js`)]);a();let o=e(s);d=o.server,f=r,u=!0,i.info(`MCP server configured (lazy — KB initializing in background)`,{toolCount:t.length,resourceCount:2}),o.startInit(),process.env.KB_AUTO_INDEX===`true`?o.ready.then(async()=>{try{let e=s.sources.map(e=>e.path).join(`, `);i.info(`Running initial index`,{sourcePaths:e}),await o.runInitialIndex(),i.info(`Initial index complete`)}catch(e){i.error(`Initial index failed; will retry on kb_reindex`,n(e))}}).catch(e=>i.error(`KB init or indexing failed`,n(e))):(o.ready.catch(e=>i.error(`KB initialization failed`,n(e))),i.info(`Auto-index disabled in HTTP mode (set KB_AUTO_INDEX=true to enable)`))}catch(e){i.error(`Failed to load server modules`,n(e))}},100)}),h=async e=>{i.info(`Shutdown signal received`,{signal:e}),m.close(),d&&await d.close(),process.exit(0)};process.on(`SIGINT`,()=>h(`SIGINT`)),process.on(`SIGTERM`,()=>h(`SIGTERM`))}else{let[{loadConfig:t,reconfigureForWorkspace:r},{createLazyServer:a},{checkForUpdates:o},{RootsListChangedNotificationSchema:s}]=await Promise.all([import(`./config.js`),import(`./server.js`),import(`./version-check.js`),import(`@modelcontextprotocol/sdk/types.js`)]),c=t();i.info(`Config loaded`,{sourceCount:c.sources.length,storePath:c.store.path}),o();let{server:l,startInit:u,ready:d,runInitialIndex:f}=a(c),{StdioServerTransport:p}=await import(`@modelcontextprotocol/sdk/server/stdio.js`),m=new p;await l.connect(m),i.info(`MCP server started`,{transport:`stdio`});let h=t=>{if(t.length===0)return!1;let n=t[0].uri,a=n.startsWith(`file://`)?e(n):n;return i.info(`MCP roots resolved`,{rootUri:n,rootPath:a,rootCount:t.length}),r(c,a),!0},g=!1;try{g=h((await l.server.listRoots()).roots),g||i.info(`No MCP roots yet; waiting for roots/list_changed notification`)}catch(e){i.warn(`MCP roots/list not supported by client; using cwd fallback`,{cwd:process.cwd(),...n(e)}),g=!0}g||=await new Promise(e=>{let t=setTimeout(()=>{i.warn(`Timed out waiting for MCP roots/list_changed; using cwd fallback`,{cwd:process.cwd()}),e(!1)},5e3);l.server.setNotificationHandler(s,async()=>{clearTimeout(t);try{e(h((await l.server.listRoots()).roots))}catch(t){i.warn(`roots/list retry failed after notification`,n(t)),e(!1)}})}),u(),d.catch(e=>{i.error(`Initialization failed — server will continue with limited tools`,n(e))}),process.env.KB_AUTO_INDEX===`false`?i.warn(`Auto-index disabled; use kb_reindex to index manually`):f().catch(e=>i.error(`Initial index failed`,n(e)))}}o().catch(e=>{i.error(`Fatal error`,n(e)),process.exit(1)});export{};
1
+ import{createRequire as e}from"node:module";import{fileURLToPath as t}from"node:url";import{createLogger as n,serializeError as r}from"../../core/dist/index.js";import{parseArgs as i}from"node:util";const{version:a}=e(import.meta.url)(`../package.json`),o=n(`server`),{values:s}=i({options:{transport:{type:`string`,default:process.env.KB_TRANSPORT??`stdio`},port:{type:`string`,default:process.env.KB_PORT??`3210`}}});async function c(){if(process.on(`unhandledRejection`,e=>{o.error(`Unhandled rejection`,r(e))}),o.info(`Starting MCP Knowledge Base server`,{version:a}),s.transport===`http`){let[{default:e},{loadConfig:t},{registerDashboardRoutes:n,resolveDashboardDir:i}]=await Promise.all([import(`express`),import(`./config.js`),import(`./dashboard-static.js`)]),a=t();o.info(`Config loaded`,{sourceCount:a.sources.length,storePath:a.store.path});let c=e();c.use(e.json());let l=Number(s.port);c.use((e,t,n)=>{if(t.setHeader(`Access-Control-Allow-Origin`,process.env.KB_CORS_ORIGIN??`http://localhost:${l}`),t.setHeader(`Access-Control-Allow-Methods`,`GET, POST, DELETE, OPTIONS`),t.setHeader(`Access-Control-Allow-Headers`,`Content-Type, Authorization`),e.method===`OPTIONS`){t.status(204).end();return}n()}),n(c,i(),o),c.get(`/health`,(e,t)=>{t.json({status:`ok`})});let u=!1,d=null,f=null,p=Promise.resolve();c.post(`/mcp`,async(e,t)=>{if(!u||!d||!f){t.status(503).json({jsonrpc:`2.0`,error:{code:-32603,message:`Server initializing — please retry in a few seconds`},id:null});return}let n=p,i;p=new Promise(e=>{i=e}),await n;try{let n=new f({sessionIdGenerator:void 0});await d.connect(n),await n.handleRequest(e,t,e.body),n.close()}catch(e){if(o.error(`MCP handler error`,r(e)),!t.headersSent){let n=e instanceof Error?e.message:String(e),r=n.includes(`Not Acceptable`);t.status(r?406:500).json({jsonrpc:`2.0`,error:{code:r?-32e3:-32603,message:r?n:`Internal server error`},id:null})}}finally{i()}}),c.get(`/mcp`,(e,t)=>{t.writeHead(405).end(JSON.stringify({jsonrpc:`2.0`,error:{code:-32e3,message:`Method not allowed.`},id:null}))}),c.delete(`/mcp`,(e,t)=>{t.writeHead(405).end(JSON.stringify({jsonrpc:`2.0`,error:{code:-32e3,message:`Method not allowed.`},id:null}))});let m=c.listen(l,`127.0.0.1`,()=>{o.info(`MCP server listening`,{url:`http://127.0.0.1:${l}/mcp`,port:l}),setTimeout(async()=>{try{let[{createLazyServer:e,ALL_TOOL_NAMES:t},{StreamableHTTPServerTransport:n},{checkForUpdates:i}]=await Promise.all([import(`./server.js`),import(`@modelcontextprotocol/sdk/server/streamableHttp.js`),import(`./version-check.js`)]);i();let s=e(a);d=s.server,f=n,u=!0,o.info(`MCP server configured (lazy — KB initializing in background)`,{toolCount:t.length,resourceCount:2}),s.startInit(),process.env.KB_AUTO_INDEX===`true`?s.ready.then(async()=>{try{let e=a.sources.map(e=>e.path).join(`, `);o.info(`Running initial index`,{sourcePaths:e}),await s.runInitialIndex(),o.info(`Initial index complete`)}catch(e){o.error(`Initial index failed; will retry on kb_reindex`,r(e))}}).catch(e=>o.error(`KB init or indexing failed`,r(e))):(s.ready.catch(e=>o.error(`KB initialization failed`,r(e))),o.info(`Auto-index disabled in HTTP mode (set KB_AUTO_INDEX=true to enable)`))}catch(e){o.error(`Failed to load server modules`,r(e))}},100)}),h=async e=>{o.info(`Shutdown signal received`,{signal:e}),m.close(),d&&await d.close(),process.exit(0)};process.on(`SIGINT`,()=>h(`SIGINT`)),process.on(`SIGTERM`,()=>h(`SIGTERM`))}else{let[{loadConfig:e,reconfigureForWorkspace:n},{createLazyServer:i},{checkForUpdates:a},{RootsListChangedNotificationSchema:s}]=await Promise.all([import(`./config.js`),import(`./server.js`),import(`./version-check.js`),import(`@modelcontextprotocol/sdk/types.js`)]),c=e();o.info(`Config loaded`,{sourceCount:c.sources.length,storePath:c.store.path}),a();let{server:l,startInit:u,ready:d,runInitialIndex:f}=i(c),{StdioServerTransport:p}=await import(`@modelcontextprotocol/sdk/server/stdio.js`),m=new p;await l.connect(m),o.info(`MCP server started`,{transport:`stdio`});let h=e=>{if(e.length===0)return!1;let r=e[0].uri,i=r.startsWith(`file://`)?t(r):r;return o.info(`MCP roots resolved`,{rootUri:r,rootPath:i,rootCount:e.length}),n(c,i),!0},g=!1;try{g=h((await l.server.listRoots()).roots),g||o.info(`No MCP roots yet; waiting for roots/list_changed notification`)}catch(e){o.warn(`MCP roots/list not supported by client; using cwd fallback`,{cwd:process.cwd(),...r(e)}),g=!0}g||=await new Promise(e=>{let t=setTimeout(()=>{o.warn(`Timed out waiting for MCP roots/list_changed; using cwd fallback`,{cwd:process.cwd()}),e(!1)},5e3);l.server.setNotificationHandler(s,async()=>{clearTimeout(t);try{e(h((await l.server.listRoots()).roots))}catch(t){o.warn(`roots/list retry failed after notification`,r(t)),e(!1)}})}),u(),d.catch(e=>{o.error(`Initialization failed — server will continue with limited tools`,r(e))}),process.env.KB_AUTO_INDEX===`false`?o.warn(`Auto-index disabled; use kb_reindex to index manually`):f().catch(e=>o.error(`Initial index failed`,r(e)))}}c().catch(e=>{o.error(`Fatal error`,r(e)),process.exit(1)});export{};
@@ -14,6 +14,7 @@ declare const StatusOutputSchema: z.ZodObject<{
14
14
  totalFiles: z.ZodNumber;
15
15
  lastIndexedAt: z.ZodNullable<z.ZodString>;
16
16
  onboarded: z.ZodBoolean;
17
+ onboardDir: z.ZodString;
17
18
  contentTypes: z.ZodRecord<z.ZodString, z.ZodNumber>;
18
19
  wasmAvailable: z.ZodBoolean;
19
20
  graphStats: z.ZodNullable<z.ZodObject<{
@@ -21,6 +22,9 @@ declare const StatusOutputSchema: z.ZodObject<{
21
22
  edges: z.ZodNumber;
22
23
  }, z.core.$strip>>;
23
24
  curatedCount: z.ZodNumber;
25
+ serverVersion: z.ZodString;
26
+ scaffoldVersion: z.ZodNullable<z.ZodString>;
27
+ upgradeAvailable: z.ZodBoolean;
24
28
  }, z.core.$strip>;
25
29
  declare const ListOutputSchema: z.ZodObject<{
26
30
  entries: z.ZodArray<z.ZodObject<{
@@ -1 +1 @@
1
- import{z as e}from"zod";const t=e.object({totalRecords:e.number(),totalFiles:e.number(),lastIndexedAt:e.string().nullable(),onboarded:e.boolean(),contentTypes:e.record(e.string(),e.number()),wasmAvailable:e.boolean(),graphStats:e.object({nodes:e.number(),edges:e.number()}).nullable(),curatedCount:e.number()}),n=e.object({entries:e.array(e.object({path:e.string(),title:e.string(),category:e.string(),tags:e.array(e.string()),version:e.number(),preview:e.string()})),totalCount:e.number()}),r=e.object({ok:e.boolean(),checks:e.array(e.object({name:e.string(),ok:e.boolean(),message:e.string().optional()}))}),i=e.object({summary:e.object({totalFiles:e.number(),totalLines:e.number(),totalCodeLines:e.number(),totalFunctions:e.number(),avgComplexity:e.number(),maxComplexity:e.object({value:e.number(),file:e.string()})}),files:e.array(e.object({path:e.string(),lines:e.number(),code:e.number(),complexity:e.number(),functions:e.number()}))}),a=e.object({platform:e.string(),arch:e.string(),nodeVersion:e.string(),cwd:e.string(),cpus:e.number(),memoryFreeGb:e.number(),memoryTotalGb:e.number()}),o=e.object({iso:e.string(),unix:e.number(),timezone:e.string(),formatted:e.string()}),s=e.object({passed:e.boolean(),errorCount:e.number(),warningCount:e.number(),topErrors:e.array(e.string())}),c=e.object({passed:e.boolean(),tsc:s,biome:s}),l=e.object({name:e.string(),definedIn:e.object({path:e.string(),line:e.number(),kind:e.string(),signature:e.string().optional()}).nullable(),importedBy:e.array(e.object({path:e.string(),line:e.number(),importStatement:e.string()})),referencedIn:e.array(e.object({path:e.string(),line:e.number(),context:e.string(),scope:e.string().optional()})),graphContext:e.object({definingModule:e.string().optional(),importedByModules:e.array(e.string()),siblingSymbols:e.array(e.string())}).nullable()}),u=e.object({sourcePath:e.string(),contentType:e.string(),score:e.number(),headingPath:e.string().optional(),startLine:e.number().optional(),endLine:e.number().optional(),origin:e.string().optional(),category:e.string().optional(),tags:e.array(e.string()).optional()}),d=e.object({results:e.array(u),totalResults:e.number(),searchMode:e.string(),query:e.string()}),f=e.object({path:e.string(),line:e.number().optional(),matchType:e.string(),preview:e.string()}),p=e.object({matches:e.array(f),totalMatches:e.number(),pattern:e.string(),truncated:e.boolean()}),m=e.object({path:e.string(),relevance:e.number(),estimatedTokens:e.number(),focusLines:e.array(e.string()).optional()}),h=e.object({files:e.array(m),totalFiles:e.number(),totalEstimatedTokens:e.number(),task:e.string()}),g=e.object({path:e.string(),impact:e.string(),reason:e.string()}),_=e.object({changedFiles:e.array(e.string()),affectedFiles:e.array(g),totalAffected:e.number(),riskLevel:e.string()}),v=e.object({name:e.string(),passed:e.boolean(),message:e.string().optional(),severity:e.string().optional()}),y=e.object({passed:e.boolean(),score:e.number(),checks:e.array(v),summary:e.string()}),b=e.object({id:e.string(),name:e.string(),type:e.string(),sourcePath:e.string().optional()}),x=e.object({fromId:e.string(),toId:e.string(),type:e.string()}),S=e.object({nodes:e.array(b),edges:e.array(x),totalNodes:e.number(),totalEdges:e.number(),query:e.string()}),C=e.object({symbols:e.array(e.object({name:e.string(),path:e.string(),line:e.number().optional(),kind:e.string()})),totalDead:e.number()}),w=e.object({files:e.number(),packages:e.number(),languages:e.record(e.string(),e.number()),tree:e.string()}),T=e.object({path:e.string(),language:e.string(),lines:e.number(),imports:e.number(),exports:e.number(),functions:e.number(),classes:e.number()}),E=e.object({gitRoot:e.string(),branch:e.string(),commitCount:e.number(),hasUncommitted:e.boolean(),recentCommits:e.array(e.object({hash:e.string(),message:e.string(),author:e.string()}))}),D=e.object({originalChars:e.number(),compressedChars:e.number(),ratio:e.number(),segmentsKept:e.number(),segmentsTotal:e.number()});export{w as AnalyzeStructureOutputSchema,y as AuditOutputSchema,_ as BlastRadiusOutputSchema,c as CheckOutputSchema,D as CompactOutputSchema,C as DeadSymbolsOutputSchema,a as EnvOutputSchema,T as FileSummaryOutputSchema,p as FindOutputSchema,E as GitContextOutputSchema,S as GraphOutputSchema,r as HealthOutputSchema,n as ListOutputSchema,i as MeasureOutputSchema,h as ScopeMapOutputSchema,d as SearchOutputSchema,t as StatusOutputSchema,l as SymbolOutputSchema,o as TimeOutputSchema};
1
+ import{z as e}from"zod";const t=e.object({totalRecords:e.number(),totalFiles:e.number(),lastIndexedAt:e.string().nullable(),onboarded:e.boolean(),onboardDir:e.string(),contentTypes:e.record(e.string(),e.number()),wasmAvailable:e.boolean(),graphStats:e.object({nodes:e.number(),edges:e.number()}).nullable(),curatedCount:e.number(),serverVersion:e.string(),scaffoldVersion:e.string().nullable(),upgradeAvailable:e.boolean()}),n=e.object({entries:e.array(e.object({path:e.string(),title:e.string(),category:e.string(),tags:e.array(e.string()),version:e.number(),preview:e.string()})),totalCount:e.number()}),r=e.object({ok:e.boolean(),checks:e.array(e.object({name:e.string(),ok:e.boolean(),message:e.string().optional()}))}),i=e.object({summary:e.object({totalFiles:e.number(),totalLines:e.number(),totalCodeLines:e.number(),totalFunctions:e.number(),avgComplexity:e.number(),maxComplexity:e.object({value:e.number(),file:e.string()})}),files:e.array(e.object({path:e.string(),lines:e.number(),code:e.number(),complexity:e.number(),functions:e.number()}))}),a=e.object({platform:e.string(),arch:e.string(),nodeVersion:e.string(),cwd:e.string(),cpus:e.number(),memoryFreeGb:e.number(),memoryTotalGb:e.number()}),o=e.object({iso:e.string(),unix:e.number(),timezone:e.string(),formatted:e.string()}),s=e.object({passed:e.boolean(),errorCount:e.number(),warningCount:e.number(),topErrors:e.array(e.string())}),c=e.object({passed:e.boolean(),tsc:s,biome:s}),l=e.object({name:e.string(),definedIn:e.object({path:e.string(),line:e.number(),kind:e.string(),signature:e.string().optional()}).nullable(),importedBy:e.array(e.object({path:e.string(),line:e.number(),importStatement:e.string()})),referencedIn:e.array(e.object({path:e.string(),line:e.number(),context:e.string(),scope:e.string().optional()})),graphContext:e.object({definingModule:e.string().optional(),importedByModules:e.array(e.string()),siblingSymbols:e.array(e.string())}).nullable()}),u=e.object({sourcePath:e.string(),contentType:e.string(),score:e.number(),headingPath:e.string().optional(),startLine:e.number().optional(),endLine:e.number().optional(),origin:e.string().optional(),category:e.string().optional(),tags:e.array(e.string()).optional()}),d=e.object({results:e.array(u),totalResults:e.number(),searchMode:e.string(),query:e.string()}),f=e.object({path:e.string(),line:e.number().optional(),matchType:e.string(),preview:e.string()}),p=e.object({matches:e.array(f),totalMatches:e.number(),pattern:e.string(),truncated:e.boolean()}),m=e.object({path:e.string(),relevance:e.number(),estimatedTokens:e.number(),focusLines:e.array(e.string()).optional()}),h=e.object({files:e.array(m),totalFiles:e.number(),totalEstimatedTokens:e.number(),task:e.string()}),g=e.object({path:e.string(),impact:e.string(),reason:e.string()}),_=e.object({changedFiles:e.array(e.string()),affectedFiles:e.array(g),totalAffected:e.number(),riskLevel:e.string()}),v=e.object({name:e.string(),passed:e.boolean(),message:e.string().optional(),severity:e.string().optional()}),y=e.object({passed:e.boolean(),score:e.number(),checks:e.array(v),summary:e.string()}),b=e.object({id:e.string(),name:e.string(),type:e.string(),sourcePath:e.string().optional()}),x=e.object({fromId:e.string(),toId:e.string(),type:e.string()}),S=e.object({nodes:e.array(b),edges:e.array(x),totalNodes:e.number(),totalEdges:e.number(),query:e.string()}),C=e.object({symbols:e.array(e.object({name:e.string(),path:e.string(),line:e.number().optional(),kind:e.string()})),totalDead:e.number()}),w=e.object({files:e.number(),packages:e.number(),languages:e.record(e.string(),e.number()),tree:e.string()}),T=e.object({path:e.string(),language:e.string(),lines:e.number(),imports:e.number(),exports:e.number(),functions:e.number(),classes:e.number()}),E=e.object({gitRoot:e.string(),branch:e.string(),commitCount:e.number(),hasUncommitted:e.boolean(),recentCommits:e.array(e.object({hash:e.string(),message:e.string(),author:e.string()}))}),D=e.object({originalChars:e.number(),compressedChars:e.number(),ratio:e.number(),segmentsKept:e.number(),segmentsTotal:e.number()});export{w as AnalyzeStructureOutputSchema,y as AuditOutputSchema,_ as BlastRadiusOutputSchema,c as CheckOutputSchema,D as CompactOutputSchema,C as DeadSymbolsOutputSchema,a as EnvOutputSchema,T as FileSummaryOutputSchema,p as FindOutputSchema,E as GitContextOutputSchema,S as GraphOutputSchema,r as HealthOutputSchema,n as ListOutputSchema,i as MeasureOutputSchema,h as ScopeMapOutputSchema,d as SearchOutputSchema,t as StatusOutputSchema,l as SymbolOutputSchema,o as TimeOutputSchema};
@@ -1,6 +1,6 @@
1
1
  import { CuratedKnowledgeManager } from "./curated-manager.js";
2
+ import { IGraphStore, IKnowledgeStore } from "../../store/dist/index.js";
2
3
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
- import { IGraphStore, IKnowledgeStore } from "@kb/store";
4
4
 
5
5
  //#region packages/server/src/prompts.d.ts
6
6
  interface PromptDependencies {
@@ -1,6 +1,6 @@
1
1
  import { CuratedKnowledgeManager } from "../curated-manager.js";
2
2
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
- import { IKnowledgeStore } from "@kb/store";
3
+ import { IKnowledgeStore } from "../../../store/dist/index.js";
4
4
 
5
5
  //#region packages/server/src/resources/resources.d.ts
6
6
  declare function registerResources(server: McpServer, store: IKnowledgeStore, curated: CuratedKnowledgeManager): void;
@@ -2,14 +2,14 @@ import { CuratedKnowledgeManager } from "./curated-manager.js";
2
2
  import { ResourceNotifier } from "./resources/resource-notifier.js";
3
3
  import { ISamplingClient } from "./sampling.js";
4
4
  import { BridgeComponents } from "./tools/bridge.tools.js";
5
+ import { KBConfig } from "../../core/dist/index.js";
6
+ import { OnnxEmbedder } from "../../embeddings/dist/index.js";
7
+ import { EvolutionCollector, PolicyStore } from "../../enterprise-bridge/dist/index.js";
8
+ import { IncrementalIndexer } from "../../indexer/dist/index.js";
9
+ import { IGraphStore, createStore } from "../../store/dist/index.js";
10
+ import { FileCache } from "../../tools/dist/index.js";
5
11
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
- import { KBConfig } from "@kb/core";
7
- import { Elicitor } from "@kb/elicitation";
8
- import { OnnxEmbedder } from "@kb/embeddings";
9
- import { EvolutionCollector, PolicyStore } from "@kb/enterprise-bridge";
10
- import { IncrementalIndexer } from "@kb/indexer";
11
- import { IGraphStore, createStore } from "@kb/store";
12
- import { FileCache } from "@kb/tools";
12
+ import { Elicitor } from "../../elicitation/dist/index.js";
13
13
 
14
14
  //#region packages/server/src/server.d.ts
15
15
  interface KnowledgeBaseComponents {
@@ -1,3 +1,3 @@
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(`
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{installStructuredContentGuard as l}from"./structured-content-guard.js";import{getToolMeta as u}from"./tool-metadata.js";import{installToolPrefix as d}from"./tool-prefix.js";import{registerAnalyzeDependenciesTool as f,registerAnalyzeDiagramTool as p,registerAnalyzeEntryPointsTool as m,registerAnalyzePatternsTool as h,registerAnalyzeStructureTool as ee,registerAnalyzeSymbolsTool as g,registerBlastRadiusTool as _}from"./tools/analyze.tools.js";import{registerAuditTool as v}from"./tools/audit.tool.js";import{registerBrainstormTool as y}from"./tools/brainstorm.tool.js";import{initBridgeComponents as b,registerErPullTool as x,registerErPushTool as S,registerErSyncStatusTool as C}from"./tools/bridge.tools.js";import{registerCompactTool as w,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 le,registerDelegateTool as ue,registerEvalTool as de,registerParseOutputTool as fe,registerTestRunTool as T}from"./tools/execution.tools.js";import{registerDigestTool as pe,registerEvidenceMapTool as E,registerForgeClassifyTool as D,registerForgeGroundTool as me,registerStratumCardTool as he}from"./tools/forge.tools.js";import{registerForgetTool as ge}from"./tools/forget.tool.js";import{registerGraphTool as _e}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 ve}from"./tools/list.tool.js";import{registerLookupTool as ye}from"./tools/lookup.tool.js";import{registerCodemodTool as N,registerDataTransformTool as P,registerDiffParseTool as F,registerGitContextTool as I,registerRenameTool as L}from"./tools/manipulation.tools.js";import{registerOnboardTool as be}from"./tools/onboard.tool.js";import{registerCheckpointTool as R,registerLaneTool as z,registerQueueTool as B,registerStashTool as V,registerWorksetTool as H}from"./tools/persistence.tools.js";import{registerErUpdatePolicyTool as xe}from"./tools/policy.tools.js";import{registerPresentTool as U}from"./tools/present.tool.js";import{registerProduceKnowledgeTool as W}from"./tools/produce.tool.js";import{registerReadTool as Se}from"./tools/read.tool.js";import{registerReindexTool as Ce}from"./tools/reindex.tool.js";import{registerRememberTool as we}from"./tools/remember.tool.js";import{registerReplayTool as G}from"./tools/replay.tool.js";import{registerRestoreTool as Te}from"./tools/restore.tool.js";import{registerSearchTool as Ee}from"./tools/search.tool.js";import{getCurrentVersion as K}from"./version-check.js";import{registerStatusTool as De}from"./tools/status.tool.js";import{registerUpdateTool as Oe}from"./tools/update.tool.js";import{registerChangelogTool as q,registerEncodeTool as J,registerEnvTool as ke,registerHttpTool as Ae,registerMeasureTool as je,registerRegexTestTool as Me,registerSchemaValidateTool as Ne,registerSnippetTool as Pe,registerTimeTool as Fe,registerWebSearchTool as Ie}from"./tools/utility.tools.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 Y}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 X=Ve(`server`);async function Z(t){X.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(),X.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(),X.info(`Store initialized`),e})(),(async()=>{let e=new Je({path:t.store.path});return await e.initialize(),X.info(`Graph store initialized`),e})(),(async()=>{let e=await He();return e?X.info(`WASM tree-sitter enabled for AST analysis`):X.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=b(t.er),d=u?new Ge(t.curated.path):void 0;d&&X.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 X.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:K()},{capabilities:{logging:{}}});return r(a),d(a,n.toolPrefix??``),Q(a,e,n,t(a),new o(a),c(a)),i(a,{curated:e.curated,store:e.store,graphStore:e.graphStore}),a}function Q(e,t,n,r,i,o){a(e),l(e),Ee(e,t.embedder,t.store,t.graphStore,t.bridge,t.evolutionCollector,o),ye(e,t.store),De(e,t.store,t.graphStore,t.curated,{onboardComplete:t.onboardComplete,onboardTimestamp:t.onboardTimestamp},n),Ce(e,t.indexer,n,t.curated,t.store,i),we(e,t.curated,t.policyStore,t.evolutionCollector,i),Oe(e,t.curated,i),ge(e,t.curated,i),Se(e,t.curated),ve(e,t.curated),ee(e,t.store,t.embedder),f(e,t.store,t.embedder),g(e,t.store,t.embedder),h(e,t.store,t.embedder),m(e,t.store,t.embedder),p(e,t.store,t.embedder),_(e,t.store,t.embedder,t.graphStore),W(e,n),be(e,t.store,t.embedder,n),_e(e,t.graphStore),v(e,t.store,t.embedder),w(e,t.embedder,t.fileCache),ie(e,t.embedder,t.store),re(e,t.embedder,t.store),fe(e),H(e),le(e),ce(e,t.embedder,t.store),ae(e,t.embedder,t.store,t.graphStore),de(e),T(e),V(e),I(e),F(e),L(e),N(e),Te(e),ne(e,t.fileCache),R(e),P(e),oe(e,t.embedder,t.store),A(e),j(e),te(e,t.embedder,t.store),ue(e,o),k(e),z(e),B(e),M(e),O(e),E(e),pe(e,t.embedder),D(e),he(e,t.embedder,t.fileCache),me(e,t.embedder,t.store),U(e,r),r&&y(e,r),Ie(e),Ae(e),Me(e),J(e),je(e),q(e),Ne(e),Pe(e),ke(e),Fe(e),t.bridge&&(S(e,t.bridge,t.evolutionCollector),x(e,t.bridge),C(e,t.bridge)),t.policyStore&&xe(e,t.policyStore),t.evolutionCollector&&se(e,t.evolutionCollector),s(e,t.store,t.curated),G(e)}async function $e(e){let t=await Z(e),n=Qe(t,e);X.info(`MCP server configured`,{toolCount:$.length,resourceCount:2});let r=async()=>{try{let n=e.sources.map(e=>e.path).join(`, `);X.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&&X.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&X.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});X.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await t.store.createFtsIndex()}catch(e){X.warn(`FTS index creation failed`,Y(e))}try{let e=await t.curated.reindexAll();X.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){X.error(`Curated re-index failed`,Y(e))}}catch(e){X.error(`Initial index failed; will retry on kb_reindex`,Y(e))}},i=async()=>{X.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{X.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,nt=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 rt(e){le(e),de(e),T(e),fe(e),ue(e),I(e),F(e),L(e),N(e),P(e),H(e),V(e),R(e),Te(e),z(e),B(e),k(e),A(e),j(e),M(e),O(e),E(e),D(e),U(e),y(e,n),W(e),G(e),Ie(e),Ae(e),Me(e),J(e),je(e),q(e),Ne(e),Pe(e),ke(e),Fe(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 it(e){let n=new Ze({name:e.serverName??`knowledge-base`,version:K()},{capabilities:{logging:{}}}),a=`initializing`,s=``,l=!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
- `);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};
3
+ `);r(n),d(n,e.toolPrefix??``);let p=n.sendToolListChanged.bind(n);n.sendToolListChanged=()=>{};let m=[];for(let e of $){let t=u(e),r=n.registerTool(e,{title:t.title,description:`${t.title} — initializing, available shortly`,inputSchema:{},annotations:t.annotations},async()=>({content:[{type:`text`,text:f()}]}));nt.has(e)?r.remove():m.push(r)}rt(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,y=new Promise(e=>{v=e}),b=()=>v?.(),x=(async()=>{await y;let r;try{r=await Z(e)}catch(e){a=`failed`,s=e instanceof Error?e.message:String(e),X.error(`KB initialization failed — server continuing with zero-dep tools only`,{error:s});return}let u=n.sendToolListChanged.bind(n);n.sendToolListChanged=()=>{};let d=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 nt)p[e]?.remove();let _=new o(n),v=c(n);Q(n,r,e,t(n),_,v),i(n),n.sendToolListChanged=u,n.sendPromptListChanged=d,n.sendResourceListChanged=f,Promise.resolve(n.sendToolListChanged()).catch(()=>{}),Promise.resolve(n.sendPromptListChanged()).catch(()=>{}),Promise.resolve(n.sendResourceListChanged()).catch(()=>{});let b=n._registeredTools??{};for(let[e,t]of Object.entries(b)){if(et.has(e))continue;let n=t.handler;t.handler=async(...t)=>{if(!r.indexer.isIndexing)return n(...t);let i=l?`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 x=Object.keys(b).length;x!==$.length&&X.warn(`ALL_TOOL_NAMES count mismatch`,{expectedToolCount:$.length,registeredToolCount:x}),X.info(`MCP server configured`,{toolCount:$.length,resourceCount:4}),g?.(r)})(),S=async()=>{let t=await _;try{let n=e.sources.map(e=>e.path).join(`, `);X.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&&X.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&X.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});l=!0,X.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await t.store.createFtsIndex()}catch(e){X.warn(`FTS index creation failed`,Y(e))}try{let e=await t.curated.reindexAll();X.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){X.error(`Curated re-index failed`,Y(e))}}catch(e){X.error(`Initial index failed; will retry on kb_reindex`,Y(e))}},C=process.ppid,w=setInterval(()=>{try{process.kill(C,0)}catch{X.info(`Parent process died; shutting down`,{parentPid:C}),clearInterval(w),_.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 w.unref(),{server:n,startInit:b,ready:x,runInitialIndex:S}}export{$ as ALL_TOOL_NAMES,it as createLazyServer,Qe as createMcpServer,$e as createServer,Z as initializeKnowledgeBase,Q as registerMcpTools};
@@ -0,0 +1,26 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+
3
+ //#region packages/server/src/structured-content-guard.d.ts
4
+ /**
5
+ * Build a minimal `structuredContent` placeholder when the handler didn't
6
+ * provide one. The SDK only checks that the value is a non-null object and
7
+ * validates it against the tool's Zod-driven JSON-Schema.
8
+ *
9
+ * We extract the error message from the text content blocks and store it
10
+ * under an `_error` key. Because `outputSchema` Zod schemas are compiled
11
+ * with `strict: false` by default via `zodToJsonSchema`, additional
12
+ * properties are tolerated and the SDK validator will not reject the
13
+ * placeholder.
14
+ *
15
+ * UPDATE: The SDK uses passthrough-style validation which DOES reject
16
+ * unknown keys on strict schemas. Instead, we build a "zero-value"
17
+ * object from the registered outputSchema (if available) so it always
18
+ * passes validation.
19
+ */
20
+ /**
21
+ * Wrap `server.registerTool` so that every handler result is guaranteed
22
+ * to include `structuredContent` when the tool declares `outputSchema`.
23
+ */
24
+ declare function installStructuredContentGuard(server: McpServer): void;
25
+ //#endregion
26
+ export { installStructuredContentGuard };
@@ -0,0 +1 @@
1
+ function e(e){let n=e.registerTool.bind(e);e.registerTool=(e,r,i)=>r?.outputSchema==null?n(e,r,i):n(e,r,async(e,n)=>{let a=await i(e,n);return a.structuredContent??=t(r.outputSchema),a})}function t(e){if(!e)return{};if(e.anyOf){let n=e.anyOf.find(e=>e.type!==`null`);return n?t(n):null}switch(e.type){case`object`:{let n={};if(e.properties)for(let[r,i]of Object.entries(e.properties))n[r]=t(i);return n}case`array`:return[];case`string`:return``;case`number`:case`integer`:return 0;case`boolean`:return!1;default:return{}}}export{e as installStructuredContentGuard};
@@ -1,6 +1,6 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { IEmbedder } from "@kb/embeddings";
3
- import { IGraphStore, IKnowledgeStore } from "@kb/store";
2
+ import { IGraphStore, IKnowledgeStore } from "../../../store/dist/index.js";
3
+ import { IEmbedder } from "../../../embeddings/dist/index.js";
4
4
 
5
5
  //#region packages/server/src/tools/analyze.tools.d.ts
6
6
  declare function registerAnalyzeStructureTool(server: McpServer, store: IKnowledgeStore, embedder: IEmbedder): void;
@@ -1,6 +1,6 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { IEmbedder } from "@kb/embeddings";
3
- import { IKnowledgeStore } from "@kb/store";
2
+ import { IKnowledgeStore } from "../../../store/dist/index.js";
3
+ import { IEmbedder } from "../../../embeddings/dist/index.js";
4
4
 
5
5
  //#region packages/server/src/tools/audit.tool.d.ts
6
6
  declare function registerAuditTool(server: McpServer, store: IKnowledgeStore, embedder: IEmbedder): void;
@@ -1,5 +1,5 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { Elicitor } from "@kb/elicitation";
2
+ import { Elicitor } from "../../../elicitation/dist/index.js";
3
3
 
4
4
  //#region packages/server/src/tools/brainstorm.tool.d.ts
5
5
  declare function registerBrainstormTool(server: McpServer, elicitor: Elicitor): void;
@@ -1,5 +1,5 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { ERBridgeConfig, ERCache, ERClient, EvolutionCollector, PushAdapter } from "@kb/enterprise-bridge";
2
+ import { ERBridgeConfig, ERCache, ERClient, EvolutionCollector, PushAdapter } from "../../../enterprise-bridge/dist/index.js";
3
3
 
4
4
  //#region packages/server/src/tools/bridge.tools.d.ts
5
5
  /** Resolve ER bridge config from KBConfig.er + env */
@@ -1,7 +1,7 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { IEmbedder } from "@kb/embeddings";
3
- import { IGraphStore, IKnowledgeStore } from "@kb/store";
4
- import { FileCache } from "@kb/tools";
2
+ import { FileCache } from "../../../tools/dist/index.js";
3
+ import { IGraphStore, IKnowledgeStore } from "../../../store/dist/index.js";
4
+ import { IEmbedder } from "../../../embeddings/dist/index.js";
5
5
 
6
6
  //#region packages/server/src/tools/context.tools.d.ts
7
7
  declare function registerCompactTool(server: McpServer, embedder: IEmbedder, cache: FileCache): void;
@@ -1,6 +1,7 @@
1
1
  import{getToolMeta as e}from"../tool-metadata.js";import{CompactOutputSchema as t,DeadSymbolsOutputSchema as n,FileSummaryOutputSchema as r,FindOutputSchema as i,ScopeMapOutputSchema as a,SymbolOutputSchema as o}from"../output-schemas.js";import{fanOutSearch as s,openWorkspaceStores as c,resolveWorkspaces as l}from"../cross-workspace.js";import{z as u}from"zod";import{CONTENT_TYPES as d,computePartitionKey as f,createLogger as p,serializeError as m}from"../../../core/dist/index.js";import{compact as h,fileSummary as g,find as _,findDeadSymbols as v,findExamples as y,scopeMap as b,symbol as x,trace as S,truncateToTokenBudget as C}from"../../../tools/dist/index.js";const w=p(`tools:context`);function T(n,r,i){let a=e(`compact`);n.registerTool(`compact`,{title:a.title,description:"Compress text to relevant sections using embedding similarity (no LLM). Provide either `text` or `path` (server reads the file — saves a round-trip). Segments by paragraph/sentence/line.",outputSchema:t,inputSchema:{text:u.string().optional().describe(`The text to compress (provide this OR path, not both)`),path:u.string().optional().describe(`File path to read server-side — avoids read_file round-trip + token doubling (provide this OR text)`),query:u.string().describe(`Focus query — what are you trying to understand?`),max_chars:u.number().min(100).max(5e4).default(3e3).describe(`Target output size in characters`),segmentation:u.enum([`paragraph`,`sentence`,`line`]).default(`paragraph`).describe(`How to split the text for scoring`)},annotations:a.annotations},async({text:e,path:t,query:n,max_chars:a,segmentation:o})=>{try{if(!e&&!t)return{content:[{type:`text`,text:`Error: Either "text" or "path" must be provided.`}],isError:!0};let s=await h(r,{text:e,path:t,query:n,maxChars:a,segmentation:o,cache:i});return{content:[{type:`text`,text:[`Compressed ${s.originalChars} → ${s.compressedChars} chars (${(s.ratio*100).toFixed(0)}%)`,`Kept ${s.segmentsKept}/${s.segmentsTotal} segments`,``,s.text].join(`
2
2
  `)}],structuredContent:{originalChars:s.originalChars,compressedChars:s.compressedChars,ratio:s.ratio,segmentsKept:s.segmentsKept,segmentsTotal:s.segmentsTotal}}}catch(e){return w.error(`Compact failed`,m(e)),{content:[{type:`text`,text:`Compact failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function E(t,n,r){let i=e(`scope_map`);t.registerTool(`scope_map`,{title:i.title,description:`Generate a task-scoped reading plan. Given a task description, identifies which files and sections are relevant, with estimated token counts and suggested reading order.`,outputSchema:a,inputSchema:{task:u.string().describe(`Description of the task to scope`),max_files:u.number().min(1).max(50).default(15).describe(`Maximum files to include`),content_type:u.enum(d).optional().describe(`Filter by content type`),max_tokens:u.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`)},annotations:i.annotations},async({task:e,max_files:t,content_type:i,max_tokens:a})=>{try{let o=await b(n,r,{task:e,maxFiles:t,contentType:i}),s=[`## Scope Map: ${e}`,`Total estimated tokens: ~${o.totalEstimatedTokens}`,``,`### Files (by relevance)`,...o.files.map((e,t)=>`${t+1}. **${e.path}** (~${e.estimatedTokens} tokens, ${(e.relevance*100).toFixed(0)}% relevant)\n ${e.reason}\n Focus: ${e.focusRanges.map(e=>`L${e.start}-${e.end}`).join(`, `)}`),``,`### Suggested Reading Order`,...o.readingOrder.map((e,t)=>`${t+1}. ${e}`),``,`### Suggested Compact Calls`,`_Estimated compressed total: ~${Math.ceil(o.totalEstimatedTokens/5)} tokens_`,...o.compactCommands.map((e,t)=>`${t+1}. ${e}`)].join(`
3
- `)+"\n\n---\n_Next: Use `search` to dive into specific files, or `compact` to compress file contents for context._";return{content:[{type:`text`,text:a?C(s,a):s}],structuredContent:{files:o.files.map(e=>({path:e.path,relevance:e.relevance,estimatedTokens:e.estimatedTokens,...e.focusRanges.length>0?{focusLines:e.focusRanges.map(e=>`L${e.start}-${e.end}`)}:{}})),totalFiles:o.files.length,totalEstimatedTokens:o.totalEstimatedTokens,task:e}}}catch(e){return w.error(`Scope map failed`,m(e)),{content:[{type:`text`,text:`Scope map failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function D(t,n,r){let a=e(`find`);t.registerTool(`find`,{title:a.title,description:`Multi-strategy search combining vector, FTS, glob, and regex. Use for precise queries needing multiple strategies. mode=examples finds real usage of a symbol. For general discovery use search instead.`,outputSchema:i,inputSchema:{query:u.string().optional().describe(`Semantic/keyword search query (required for mode "examples")`),glob:u.string().optional().describe(`File glob pattern (search mode only)`),pattern:u.string().optional().describe(`Regex pattern to match in content (search mode only)`),limit:u.number().min(1).max(50).default(10).describe(`Max results`),content_type:u.enum(d).optional().describe(`Filter by content type`),mode:u.enum([`search`,`examples`]).default(`search`).describe(`Mode: "search" (default) for federated search, "examples" to find usage examples of a symbol/pattern`),max_tokens:u.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),workspaces:u.array(u.string()).optional().describe(`Cross-workspace search: partition names or folder basenames to include. Use ["*"] for all. User-level mode only.`)},annotations:a.annotations},async({query:e,glob:t,pattern:i,limit:a,content_type:o,mode:u,max_tokens:d,workspaces:p})=>{try{if(u===`examples`){if(!e)return{content:[{type:`text`,text:`Error: "query" is required for mode "examples".`}],isError:!0};let t=await y(n,r,{query:e,limit:a,contentType:o}),i=JSON.stringify(t);return{content:[{type:`text`,text:d?C(i,d):i}]}}let m=await _(n,r,{query:e,glob:t,pattern:i,limit:a,contentType:o}),h=``;if(p&&p.length>0&&e){let t=l(p,f(process.cwd()));if(t.length>0){let{stores:r,closeAll:i}=await c(t);try{let i=await s(r,await n.embedQuery(e),{limit:a,contentType:o});for(let e of i)m.results.push({path:`[${e.workspace}] ${e.record.sourcePath}`,score:e.score,source:`cross-workspace`,lineRange:e.record.startLine?{start:e.record.startLine,end:e.record.endLine}:void 0,preview:e.record.content.slice(0,200)});m.results.sort((e,t)=>t.score-e.score),m.results=m.results.slice(0,a),m.totalFound=m.results.length,h=` + ${t.length} workspace(s)`}finally{await i()}}}if(m.results.length===0)return{content:[{type:`text`,text:`No results found.`}],structuredContent:{matches:[],totalMatches:0,pattern:e??t??i??``,truncated:!1}};let g=[`Found ${m.totalFound} results via ${m.strategies.join(` + `)}${h}`,``,...m.results.map(e=>{let t=e.lineRange?`:${e.lineRange.start}-${e.lineRange.end}`:``,n=e.preview?`\n ${e.preview.slice(0,100)}...`:``;return`- [${e.source}] ${e.path}${t} (${(e.score*100).toFixed(0)}%)${n}`})];return{content:[{type:`text`,text:d?C(g.join(`
3
+ `)+"\n\n---\n_Next: Use `search` to dive into specific files, or `compact` to compress file contents for context._";return{content:[{type:`text`,text:a?C(s,a):s}],structuredContent:{files:o.files.map(e=>({path:e.path,relevance:e.relevance,estimatedTokens:e.estimatedTokens,...e.focusRanges.length>0?{focusLines:e.focusRanges.map(e=>`L${e.start}-${e.end}`)}:{}})),totalFiles:o.files.length,totalEstimatedTokens:o.totalEstimatedTokens,task:e}}}catch(e){return w.error(`Scope map failed`,m(e)),{content:[{type:`text`,text:`Scope map failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function D(t,n,r){let a=e(`find`);t.registerTool(`find`,{title:a.title,description:`Multi-strategy search combining vector, FTS, glob, and regex. Use for precise queries needing multiple strategies. mode=examples finds real usage of a symbol. For general discovery use search instead.`,outputSchema:i,inputSchema:{query:u.string().optional().describe(`Semantic/keyword search query (required for mode "examples")`),glob:u.string().optional().describe(`File glob pattern (search mode only)`),pattern:u.string().optional().describe(`Regex pattern to match in content (search mode only)`),limit:u.number().min(1).max(50).default(10).describe(`Max results`),content_type:u.enum(d).optional().describe(`Filter by content type`),mode:u.enum([`search`,`examples`]).default(`search`).describe(`Mode: "search" (default) for federated search, "examples" to find usage examples of a symbol/pattern`),max_tokens:u.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),workspaces:u.array(u.string()).optional().describe(`Cross-workspace search: partition names or folder basenames to include. Use ["*"] for all. User-level mode only.`)},annotations:a.annotations},async({query:e,glob:t,pattern:i,limit:a,content_type:o,mode:u,max_tokens:d,workspaces:p})=>{try{if(u===`examples`){if(!e)return{content:[{type:`text`,text:`Error: "query" is required for mode "examples".`}],isError:!0};let t=await y(n,r,{query:e,limit:a,contentType:o}),i=JSON.stringify(t);return{content:[{type:`text`,text:d?C(i,d):i}]}}let m=await _(n,r,{query:e,glob:t,pattern:i,limit:a,contentType:o}),h=``;if(p&&p.length>0&&e){let t=l(p,f(process.cwd()));if(t.length>0){let{stores:r,closeAll:i}=await c(t);try{let i=await s(r,await n.embedQuery(e),{limit:a,contentType:o});for(let e of i)m.results.push({path:`[${e.workspace}] ${e.record.sourcePath}`,score:e.score,source:`cross-workspace`,lineRange:e.record.startLine?{start:e.record.startLine,end:e.record.endLine}:void 0,preview:e.record.content.slice(0,200)});m.results.sort((e,t)=>t.score-e.score),m.results=m.results.slice(0,a),m.totalFound=m.results.length,h=` + ${t.length} workspace(s)`}finally{await i()}}}if(m.results.length===0)return{content:[{type:`text`,text:`No results found.${m.failedStrategies?.length?`\nStrategies attempted: ${m.strategies.join(`, `)}\nFailed: ${m.failedStrategies.map(e=>`${e.strategy} (${e.reason})`).join(`, `)}`:m.strategies.length===0?`
4
+ No search strategies were activated. Provide at least one of: query, glob, or pattern.`:``}`}],structuredContent:{matches:[],totalMatches:0,pattern:e??t??i??``,truncated:!1}};let g=[`Found ${m.totalFound} results via ${m.strategies.join(` + `)}${h}`,``,...m.results.map(e=>{let t=e.lineRange?`:${e.lineRange.start}-${e.lineRange.end}`:``,n=e.preview?`\n ${e.preview.slice(0,100)}...`:``;return`- [${e.source}] ${e.path}${t} (${(e.score*100).toFixed(0)}%)${n}`})];return{content:[{type:`text`,text:d?C(g.join(`
4
5
  `),d):g.join(`
5
6
  `)}],structuredContent:{matches:m.results.map(e=>({path:e.path,...e.lineRange?{line:e.lineRange.start}:{},matchType:e.source,preview:e.preview?.slice(0,200)??``})),totalMatches:m.totalFound,pattern:e??t??i??``,truncated:m.results.length<m.totalFound}}}catch(e){return w.error(`Find failed`,m(e)),{content:[{type:`text`,text:`Find failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function O(t,n,r,i){let a=e(`symbol`);t.registerTool(`symbol`,{title:a.title,description:`Find definition, imports, and references of a named symbol (function, class, type). For tracing data flow across call sites use trace instead.`,inputSchema:{name:u.string().describe(`Symbol name to look up (function, class, type, etc.)`),limit:u.number().min(1).max(50).default(20).describe(`Max results per category`),workspaces:u.array(u.string()).optional().describe(`Cross-workspace search: partition names or folder basenames to include. Use ["*"] for all. User-level mode only.`)},outputSchema:o,annotations:a.annotations},async({name:e,limit:t,workspaces:a})=>{try{let o=await x(n,r,{name:e,limit:t,graphStore:i});if(a&&a.length>0){let r=l(a,f(process.cwd()));if(r.length>0){let{stores:i,closeAll:a}=await c(r);try{for(let[r,a]of i){let i=await x(n,a,{name:e,limit:t});i.definedIn&&!o.definedIn&&(o.definedIn={...i.definedIn,path:`[${r}] ${i.definedIn.path}`});for(let e of i.referencedIn)o.referencedIn.push({...e,path:`[${r}] ${e.path}`});if(i.importedBy){o.importedBy=o.importedBy??[];for(let e of i.importedBy)o.importedBy.push({...e,path:`[${r}] ${e.path}`})}}}finally{await a()}}}let s={name:o.name,definedIn:o.definedIn??null,importedBy:o.importedBy??[],referencedIn:o.referencedIn??[],graphContext:o.graphContext??null};return{content:[{type:`text`,text:M(o)}],structuredContent:s}}catch(e){return w.error(`Symbol lookup failed`,m(e)),{content:[{type:`text`,text:`Symbol lookup failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function k(t,n){let i=e(`file_summary`);t.registerTool(`file_summary`,{title:i.title,description:`Create a concise structural summary of a source file: imports, exports, functions, classes, interfaces, and types.`,outputSchema:r,inputSchema:{path:u.string().describe(`Absolute path to the file to summarize`)},annotations:i.annotations},async({path:e})=>{try{let t=await g({path:e,content:(await n.get(e)).content});return{content:[{type:`text`,text:N(t)}],structuredContent:{path:t.path,language:t.language,lines:t.lines,imports:t.imports?.length??0,exports:t.exports?.length??0,functions:t.functions?.length??0,classes:t.classes?.length??0}}}catch(e){return w.error(`File summary failed`,m(e)),{content:[{type:`text`,text:`File summary failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function A(t,n,r){let i=e(`trace`);t.registerTool(`trace`,{title:i.title,description:`Follow data flow forward/backward across imports and call sites from a starting symbol or file:line. For finding a single symbol definition use symbol instead.`,inputSchema:{start:u.string().describe(`Starting point — symbol name or file:line reference`),direction:u.enum([`forward`,`backward`,`both`]).describe(`Which direction to trace relationships`),max_depth:u.number().min(1).max(10).default(3).optional().describe(`Maximum trace depth`)},annotations:i.annotations},async({start:e,direction:t,max_depth:i})=>{try{let a=await S(n,r,{start:e,direction:t,maxDepth:i}),o=[`## Trace: ${a.start}`,`Direction: ${a.direction} | Depth: ${a.depth}`,``];if(a.nodes.length===0)o.push(`No connections found.`);else{let e=a.nodes.filter(e=>e.relationship===`calls`),t=a.nodes.filter(e=>e.relationship===`called-by`),n=a.nodes.filter(e=>e.relationship===`imports`),r=a.nodes.filter(e=>e.relationship===`imported-by`),i=a.nodes.filter(e=>e.relationship===`references`);if(e.length>0){o.push(`### Calls (${e.length})`);for(let t of e){let e=t.scope?` (from ${t.scope}())`:``;o.push(`- ${t.symbol}() — ${t.path}:${t.line}${e}`)}o.push(``)}if(t.length>0){o.push(`### Called by (${t.length})`);for(let e of t){let t=e.scope?` in ${e.scope}()`:``;o.push(`- ${e.symbol}()${t} — ${e.path}:${e.line}`)}o.push(``)}if(n.length>0){o.push(`### Imports (${n.length})`);for(let e of n)o.push(`- ${e.symbol} — ${e.path}:${e.line}`);o.push(``)}if(r.length>0){o.push(`### Imported by (${r.length})`);for(let e of r)o.push(`- ${e.path}:${e.line}`);o.push(``)}if(i.length>0){o.push(`### References (${i.length})`);for(let e of i)o.push(`- ${e.path}:${e.line}`);o.push(``)}}return o.push(`---`,"_Next: `symbol` for definition details | `compact` to read a referenced file | `blast_radius` for impact analysis_"),{content:[{type:`text`,text:o.join(`
6
7
  `)}]}}catch(e){return w.error(`Trace failed`,m(e)),{content:[{type:`text`,text:`Trace failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function j(t,r,i){let a=e(`dead_symbols`);t.registerTool(`dead_symbols`,{title:a.title,description:`Find exported symbols that appear to be unused because they are never imported or re-exported.`,outputSchema:n,inputSchema:{path:u.string().optional().describe(`Root path to scope the search (default: cwd)`),limit:u.number().min(1).max(500).default(100).optional().describe(`Maximum exported symbols to scan`)},annotations:a.annotations},async({path:e,limit:t})=>{try{let n=await v(r,i,{rootPath:e,limit:t}),a=[`## Dead Symbol Analysis`,``,`**Exports scanned:** ${n.totalExports}`,`**Dead in source:** ${n.totalDeadSource} (actionable)`,`**Dead in docs:** ${n.totalDeadDocs} (informational — code samples in .md files)`,``];if(n.deadInSource.length>0){a.push(`### Dead in Source (actionable)`);for(let e of n.deadInSource)a.push(`- \`${e.name}\` (${e.kind}) — ${e.path}:${e.line}`);a.push(``)}if(n.deadInDocs.length>0){a.push(`### Dead in Docs (informational)`),a.push(`_${n.totalDeadDocs} symbol(s) found only in documentation code samples — not actionable dead code._`);for(let e of n.deadInDocs.slice(0,5))a.push(`- \`${e.name}\` — ${e.path}:${e.line}`);n.deadInDocs.length>5&&a.push(`- _... ${n.deadInDocs.length-5} more omitted_`)}return n.totalDeadSource>0?a.push(``,`---`,`_Next: \`codemod\` to remove ${n.totalDeadSource} unused exports | \`symbol\` to verify usage before removing_`):a.push(``,`---`,"_Next: `check` — no dead symbols found, validate types and lint_"),{content:[{type:`text`,text:a.join(`
@@ -1,5 +1,5 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { EvolutionCollector } from "@kb/enterprise-bridge";
2
+ import { EvolutionCollector } from "../../../enterprise-bridge/dist/index.js";
3
3
 
4
4
  //#region packages/server/src/tools/evolution.tools.d.ts
5
5
  declare function registerErEvolveReviewTool(server: McpServer, collector: EvolutionCollector): void;
@@ -1,7 +1,7 @@
1
1
  import { ISamplingClient } from "../sampling.js";
2
2
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
- import { IEmbedder } from "@kb/embeddings";
4
- import { IKnowledgeStore } from "@kb/store";
3
+ import { IKnowledgeStore } from "../../../store/dist/index.js";
4
+ import { IEmbedder } from "../../../embeddings/dist/index.js";
5
5
 
6
6
  //#region packages/server/src/tools/execution.tools.d.ts
7
7
  declare function registerCheckTool(server: McpServer): void;
@@ -1,7 +1,7 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { IEmbedder } from "@kb/embeddings";
3
- import { IKnowledgeStore } from "@kb/store";
4
- import { FileCache } from "@kb/tools";
2
+ import { FileCache } from "../../../tools/dist/index.js";
3
+ import { IKnowledgeStore } from "../../../store/dist/index.js";
4
+ import { IEmbedder } from "../../../embeddings/dist/index.js";
5
5
 
6
6
  //#region packages/server/src/tools/forge.tools.d.ts
7
7
  declare function registerEvidenceMapTool(server: McpServer): void;
@@ -1,5 +1,5 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { IGraphStore } from "@kb/store";
2
+ import { IGraphStore } from "../../../store/dist/index.js";
3
3
 
4
4
  //#region packages/server/src/tools/graph.tool.d.ts
5
5
  declare function registerGraphTool(server: McpServer, graphStore: IGraphStore): void;
@@ -1,3 +1,5 @@
1
- import{getToolMeta as e}from"../tool-metadata.js";import{HealthOutputSchema as t}from"../output-schemas.js";import{z as n}from"zod";import{createLogger as r,serializeError as i}from"../../../core/dist/index.js";import{guide as a,health as o,processList as s,processLogs as c,processStart as l,processStatus as u,processStop as d,watchList as f,watchStart as p,watchStop as m,webFetch as h}from"../../../tools/dist/index.js";const g=r(`tools:infra`);function _(t){let r=e(`process`);t.registerTool(`process`,{title:r.title,description:`Start, stop, inspect, list, and tail logs for in-memory managed child processes.`,inputSchema:{action:n.enum([`start`,`stop`,`status`,`list`,`logs`]).describe(`Process action to perform`),id:n.string().optional().describe(`Managed process ID`),command:n.string().optional().describe(`Executable to start`),args:n.array(n.string()).optional().describe(`Arguments for start actions`),tail:n.number().min(1).max(500).optional().describe(`Log lines to return for logs actions`)},annotations:r.annotations},async({action:e,id:t,command:n,args:r,tail:a})=>{try{switch(e){case`start`:if(!t||!n)throw Error(`id and command are required for start`);return{content:[{type:`text`,text:JSON.stringify(l(t,n,r??[]))}]};case`stop`:if(!t)throw Error(`id is required for stop`);return{content:[{type:`text`,text:JSON.stringify(d(t)??null)}]};case`status`:if(!t)throw Error(`id is required for status`);return{content:[{type:`text`,text:JSON.stringify(u(t)??null)}]};case`list`:return{content:[{type:`text`,text:JSON.stringify(s())}]};case`logs`:if(!t)throw Error(`id is required for logs`);return{content:[{type:`text`,text:JSON.stringify(c(t,a))}]}}}catch(e){return g.error(`Process action failed`,i(e)),{content:[{type:`text`,text:`Process action failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function v(t){let r=e(`watch`);t.registerTool(`watch`,{title:r.title,description:`Watch a directory for file changes (create/modify/delete). Actions: start (begin watching), stop (by ID), list (show active watchers). Events are emitted as structured JSON with path, event type, and timestamp.`,inputSchema:{action:n.enum([`start`,`stop`,`list`]).describe(`Watch action to perform`),path:n.string().optional().describe(`Directory path to watch for start actions`),id:n.string().optional().describe(`Watcher ID for stop actions`)},annotations:r.annotations},async({action:e,path:t,id:n})=>{try{switch(e){case`start`:if(!t)throw Error(`path is required for start`);return{content:[{type:`text`,text:JSON.stringify(p({path:t}))}]};case`stop`:if(!n)throw Error(`id is required for stop`);return{content:[{type:`text`,text:JSON.stringify({stopped:m(n)})}]};case`list`:return{content:[{type:`text`,text:JSON.stringify(f())}]}}}catch(e){return g.error(`Watch action failed`,i(e)),{content:[{type:`text`,text:`Watch action failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function y(r){let a=e(`health`);r.registerTool(`health`,{title:a.title,description:`Run project health checks — verifies package.json, tsconfig, scripts, lockfile, README, LICENSE, .gitignore.`,outputSchema:t,inputSchema:{path:n.string().optional().describe(`Root directory to check (defaults to cwd)`)},annotations:a.annotations},async({path:e})=>{try{let t=o(e),n={ok:t.checks.every(e=>e.status!==`fail`),checks:t.checks.map(e=>({name:e.name,ok:e.status===`pass`,message:e.message}))};return{content:[{type:`text`,text:JSON.stringify(t)}],structuredContent:n}}catch(e){return g.error(`Health check failed`,i(e)),{content:[{type:`text`,text:`Health check failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function b(t){let r=e(`web_fetch`);t.registerTool(`web_fetch`,{title:r.title,description:`PREFERRED web fetcher — fetch any URL and convert to LLM-optimized markdown. Supports CSS selectors, 4 output modes (markdown/raw/links/outline), smart paragraph-boundary truncation. Strips scripts/styles/nav automatically.`,inputSchema:{url:n.string().url().describe(`URL to fetch (http/https only)`),mode:n.enum([`markdown`,`raw`,`links`,`outline`]).default(`markdown`).describe(`Output mode: markdown (clean content), raw (HTML), links (extracted URLs), outline (heading hierarchy)`),selector:n.string().optional().describe(`CSS selector to extract a specific element instead of auto-detecting main content`),max_length:n.number().min(500).max(1e5).default(15e3).describe(`Max characters in output — truncates at paragraph boundaries`),include_metadata:n.boolean().default(!0).describe(`Include page title, description, and URL as a header`),include_links:n.boolean().default(!1).describe(`Append extracted links list at the end`),include_images:n.boolean().default(!1).describe(`Include image alt texts inline`),timeout:n.number().min(1e3).max(6e4).default(15e3).describe(`Request timeout in milliseconds`)},annotations:r.annotations},async({url:e,mode:t,selector:n,max_length:r,include_metadata:a,include_links:o,include_images:s,timeout:c})=>{try{let i=await h({url:e,mode:t,selector:n,maxLength:r,includeMetadata:a,includeLinks:o,includeImages:s,timeout:c}),l=[`## ${i.title||`Web Page`}`,``,i.content];return i.truncated&&l.push(``,`_Original length: ${i.originalLength.toLocaleString()} chars_`),l.push(``,`---`,"_Next: Use `remember` to save key findings, or `web_fetch` with a `selector` to extract a specific section._"),{content:[{type:`text`,text:l.join(`
2
- `)}]}}catch(e){return g.error(`Web fetch failed`,i(e)),{content:[{type:`text`,text:`Web fetch failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function x(t){let r=e(`guide`);t.registerTool(`guide`,{title:r.title,description:`Tool discovery — given a goal description, recommends which KB tools to use and in what order. Matches against 10 predefined workflows: onboard, audit, bugfix, implement, refactor, search, context, memory, validate, analyze.`,inputSchema:{goal:n.string().describe(`What you want to accomplish (e.g., "audit this monorepo", "fix a failing test")`),max_recommendations:n.number().min(1).max(10).default(5).describe(`Maximum number of tool recommendations`)},annotations:r.annotations},async({goal:e,max_recommendations:t})=>{try{let n=a(e,t),r=[`## Recommended Workflow: **${n.workflow}**`,n.description,``,`### Tools`,...n.tools.map(e=>{let t=e.suggestedArgs?` — \`${JSON.stringify(e.suggestedArgs)}\``:``;return`${e.order}. **${e.tool}** ${e.reason}${t}`})];return n.alternativeWorkflows.length>0&&r.push(``,`_Alternative workflows: ${n.alternativeWorkflows.join(`, `)}_`),r.push(``,`---`,"_Next: Run the first recommended tool, or use `guide` again with a more specific goal._"),{content:[{type:`text`,text:r.join(`
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{HealthOutputSchema as t}from"../output-schemas.js";import{z as n}from"zod";import{createLogger as r,serializeError as i}from"../../../core/dist/index.js";import{guide as a,health as o,processList as s,processLogs as c,processStart as l,processStatus as u,processStop as d,watchList as f,watchStart as p,watchStop as m,webFetch as h}from"../../../tools/dist/index.js";const g=r(`tools:infra`);function _(t){let r=e(`process`);t.registerTool(`process`,{title:r.title,description:`Start, stop, inspect, list, and tail logs for in-memory managed child processes.`,inputSchema:{action:n.enum([`start`,`stop`,`status`,`list`,`logs`]).describe(`Process action to perform`),id:n.string().optional().describe(`Managed process ID`),command:n.string().optional().describe(`Executable to start`),args:n.array(n.string()).optional().describe(`Arguments for start actions`),tail:n.number().min(1).max(500).optional().describe(`Log lines to return for logs actions`)},annotations:r.annotations},async({action:e,id:t,command:n,args:r,tail:a})=>{try{switch(e){case`start`:if(!t||!n)throw Error(`id and command are required for start`);return{content:[{type:`text`,text:JSON.stringify(l(t,n,r??[]))}]};case`stop`:if(!t)throw Error(`id is required for stop`);return{content:[{type:`text`,text:JSON.stringify(d(t)??null)}]};case`status`:if(!t)throw Error(`id is required for status`);return{content:[{type:`text`,text:JSON.stringify(u(t)??null)}]};case`list`:return{content:[{type:`text`,text:JSON.stringify(s())}]};case`logs`:if(!t)throw Error(`id is required for logs`);return{content:[{type:`text`,text:JSON.stringify(c(t,a))}]}}}catch(e){return g.error(`Process action failed`,i(e)),{content:[{type:`text`,text:`Process action failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function v(t){let r=e(`watch`);t.registerTool(`watch`,{title:r.title,description:`Watch a directory for file changes (create/modify/delete). Actions: start (begin watching), stop (by ID), list (show active watchers). Events are emitted as structured JSON with path, event type, and timestamp.`,inputSchema:{action:n.enum([`start`,`stop`,`list`]).describe(`Watch action to perform`),path:n.string().optional().describe(`Directory path to watch for start actions`),id:n.string().optional().describe(`Watcher ID for stop actions`)},annotations:r.annotations},async({action:e,path:t,id:n})=>{try{switch(e){case`start`:if(!t)throw Error(`path is required for start`);return{content:[{type:`text`,text:JSON.stringify(p({path:t}))}]};case`stop`:if(!n)throw Error(`id is required for stop`);return{content:[{type:`text`,text:JSON.stringify({stopped:m(n)})}]};case`list`:return{content:[{type:`text`,text:JSON.stringify(f())}]}}}catch(e){return g.error(`Watch action failed`,i(e)),{content:[{type:`text`,text:`Watch action failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function y(r){let a=e(`health`);r.registerTool(`health`,{title:a.title,description:`Run project health checks — verifies package.json, tsconfig, scripts, lockfile, README, LICENSE, .gitignore.`,outputSchema:t,inputSchema:{path:n.string().optional().describe(`Root directory to check (defaults to cwd)`)},annotations:a.annotations},async({path:e})=>{try{let t=o(e),n={ok:t.checks.every(e=>e.status!==`fail`),checks:t.checks.map(e=>({name:e.name,ok:e.status===`pass`,message:e.message}))};return{content:[{type:`text`,text:JSON.stringify(t)}],structuredContent:n}}catch(e){return g.error(`Health check failed`,i(e)),{content:[{type:`text`,text:`Health check failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function b(t){let r=e(`web_fetch`);t.registerTool(`web_fetch`,{title:r.title,description:`PREFERRED web fetcher — fetch one or many URLs and convert to LLM-optimized markdown. Pass one URL or multiple for parallel fetching. Supports CSS selectors, 4 output modes (markdown/raw/links/outline), smart paragraph-boundary truncation. Strips scripts/styles/nav automatically.`,inputSchema:{urls:n.array(n.string().url()).min(1).max(10).describe('URLs to fetch (1–10). Single URL: `["https://..."]`. Multiple fetched in parallel.'),mode:n.enum([`markdown`,`raw`,`links`,`outline`]).default(`markdown`).describe(`Output mode: markdown (clean content), raw (HTML), links (extracted URLs), outline (heading hierarchy)`),selector:n.string().optional().describe(`CSS selector to extract a specific element instead of auto-detecting main content`),max_length:n.number().min(500).max(1e5).default(15e3).describe(`Max characters in output — truncates at paragraph boundaries`),include_metadata:n.boolean().default(!0).describe(`Include page title, description, and URL as a header`),include_links:n.boolean().default(!1).describe(`Append extracted links list at the end`),include_images:n.boolean().default(!1).describe(`Include image alt texts inline`),timeout:n.number().min(1e3).max(6e4).default(15e3).describe(`Request timeout in milliseconds`)},annotations:r.annotations},async({urls:e,mode:t,selector:n,max_length:r,include_metadata:a,include_links:o,include_images:s,timeout:c})=>{let l=e,u=async(e,i)=>{let l=await h({url:e,mode:t,selector:n,maxLength:r,includeMetadata:a,includeLinks:o,includeImages:s,timeout:c}),u=[i?`## ${i} ${l.title||`Web Page`}\n> Source: ${e}`:`## ${l.title||`Web Page`}`,``,l.content];return l.truncated&&u.push(``,`_Original length: ${l.originalLength.toLocaleString()} chars_`),u.join(`
2
+ `)};if(l.length===1)try{return{content:[{type:`text`,text:await u(l[0])+"\n\n---\n_Next: Use `remember` to save key findings, or `web_fetch` with a `selector` to extract a specific section._"}]}}catch(e){let t=e instanceof Error?e.message:String(e);return/HTTP [45]\d{2}/.test(t)?g.warn(`Web fetch failed`,{error:t}):g.error(`Web fetch failed`,i(e)),{content:[{type:`text`,text:`Web fetch failed: ${t}`}],isError:!0}}let d=l.length,f=await Promise.allSettled(l.map((e,t)=>u(e,`[${t+1}/${d}]`))),p=[],m=0;for(let e=0;e<f.length;e++){let t=f[e];if(t.status===`fulfilled`)p.push(t.value);else{m++;let n=t.reason instanceof Error?t.reason.message:String(t.reason);/HTTP [45]\d{2}/.test(n)?g.warn(`Web fetch failed`,{url:l[e],error:n}):g.error(`Web fetch failed`,{url:l[e],...i(t.reason)}),p.push(`## Failed: ${l[e]}\n\n${n}`)}}let _=`_Fetched ${f.length-m}/${f.length} URLs successfully._`;return p.push(``,`---`,_,"_Next: Use `remember` to save key findings, or `web_fetch` with a `selector` to extract a specific section._"),{content:[{type:`text`,text:p.join(`
3
+
4
+ `)}],...m===f.length?{isError:!0}:{}}})}function x(t){let r=e(`guide`);t.registerTool(`guide`,{title:r.title,description:`Tool discovery — given a goal description, recommends which KB tools to use and in what order. Matches against 10 predefined workflows: onboard, audit, bugfix, implement, refactor, search, context, memory, validate, analyze.`,inputSchema:{goal:n.string().describe(`What you want to accomplish (e.g., "audit this monorepo", "fix a failing test")`),max_recommendations:n.number().min(1).max(10).default(5).describe(`Maximum number of tool recommendations`)},annotations:r.annotations},async({goal:e,max_recommendations:t})=>{try{let n=a(e,t),r=[`## Recommended Workflow: **${n.workflow}**`,n.description,``,`### Tools`,...n.tools.map(e=>{let t=e.suggestedArgs?` — \`${JSON.stringify(e.suggestedArgs)}\``:``;return`${e.order}. **${e.tool}** — ${e.reason}${t}`})];return n.alternativeWorkflows.length>0&&r.push(``,`_Alternative workflows: ${n.alternativeWorkflows.join(`, `)}_`),r.push(``,`---`,"_Next: Run the first recommended tool, or use `guide` again with a more specific goal._"),{content:[{type:`text`,text:r.join(`
3
5
  `)}]}}catch(e){return g.error(`Guide failed`,i(e)),{content:[{type:`text`,text:`Guide failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{x as registerGuideTool,y as registerHealthTool,_ as registerProcessTool,v as registerWatchTool,b as registerWebFetchTool};
@@ -1,5 +1,5 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { IKnowledgeStore } from "@kb/store";
2
+ import { IKnowledgeStore } from "../../../store/dist/index.js";
3
3
 
4
4
  //#region packages/server/src/tools/lookup.tool.d.ts
5
5
  declare function registerLookupTool(server: McpServer, store: IKnowledgeStore): void;
@@ -1,8 +1,9 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { IEmbedder } from "@kb/embeddings";
3
- import { IKnowledgeStore } from "@kb/store";
2
+ import { KBConfig } from "../../../core/dist/index.js";
3
+ import { IKnowledgeStore } from "../../../store/dist/index.js";
4
+ import { IEmbedder } from "../../../embeddings/dist/index.js";
4
5
 
5
6
  //#region packages/server/src/tools/onboard.tool.d.ts
6
- declare function registerOnboardTool(server: McpServer, store: IKnowledgeStore, embedder: IEmbedder): void;
7
+ declare function registerOnboardTool(server: McpServer, store: IKnowledgeStore, embedder: IEmbedder, config?: KBConfig): void;
7
8
  //#endregion
8
9
  export { registerOnboardTool };
@@ -1,2 +1,2 @@
1
- import{getToolMeta as e}from"../tool-metadata.js";import{createTaskRunner as t}from"../task-manager.js";import{createHash as n}from"node:crypto";import{z as r}from"zod";import{createLogger as i,serializeError as a}from"../../../core/dist/index.js";import{onboard as o}from"../../../tools/dist/index.js";const s=i(`tools`);let c=!1;async function l(e,t,r){for(let i of r.steps)if(!(i.status!==`success`||!i.output))try{let a=n(`sha256`).update(r.path).digest(`hex`).slice(0,12),o=`produced/onboard/${i.name}/${a}.md`,s=n(`sha256`).update(i.output).digest(`hex`).slice(0,16),c=new Date().toISOString(),l=i.output.length>2e3?i.output.split(/(?=^## )/m).filter(e=>e.trim().length>0):[i.output],u=l.map((e,t)=>({id:n(`sha256`).update(`${o}::${t}`).digest(`hex`).slice(0,16),content:e.trim(),sourcePath:o,contentType:`produced-knowledge`,chunkIndex:t,totalChunks:l.length,startLine:0,endLine:0,fileHash:s,indexedAt:c,origin:`produced`,tags:[`onboard`,i.name],category:`analysis`,version:1})),d=await t.embedBatch(u.map(e=>e.content));await e.upsert(u,d)}catch(e){s.warn(`Auto-persist onboard step failed`,{stepName:i.name,...a(e)})}}function u(n,i,u){let d=e(`onboard`);n.registerTool(`onboard`,{title:d.title,description:`First-time codebase onboarding: runs all analysis tools (structure, dependencies, entry-points, symbols, patterns, diagram) in one command. Results are auto-persisted to KB. Use mode=generate to also write structured output to .ai/kb/ directory.`,inputSchema:{path:r.string().describe(`Root path of the codebase to onboard`),mode:r.enum([`memory`,`generate`]).default(`memory`).describe(`Output mode: memory = KB vector store only; generate = also write to .ai/kb/ directory`),out_dir:r.string().optional().describe(`Custom output directory for generate mode (default: <path>/.ai/kb)`)},annotations:d.annotations},async({path:e,mode:n,out_dir:r},d)=>{try{if(c)return{content:[{type:`text`,text:`Onboard is already running. Please wait for it to complete before starting another.`}]};c=!0,s.info(`Starting onboard`,{path:e,mode:n});let a=await o({path:e,mode:n,outDir:r}),f=t(d).createTask(`Onboard`,a.steps.length);for(let e=0;e<a.steps.length;e++){let t=a.steps[e];f.progress(e,`${t.name}: ${t.status}`)}f.complete(`Onboard complete: ${a.steps.filter(e=>e.status===`success`).length}/${a.steps.length} steps succeeded`),l(i,u,a);let p=[`## Onboard Complete`,``,`**Path:** \`${a.path}\``,`**Mode:** ${a.mode}`,`**Duration:** ${a.totalDurationMs}ms`,``];a.outDir&&(p.push(`**Output directory:** \`${a.outDir}\``),p.push(``)),p.push(`### Analysis Results`,``);let m=[],h=[];for(let e of a.steps)e.status===`success`?m.push(`- ✓ **${e.name}** (${e.durationMs}ms) — ${e.output.length} chars`):h.push(`- ✗ **${e.name}** — ${e.error}`);p.push(...m),h.length>0&&p.push(``,`### Failed`,``,...h),p.push(``,`---`,``);for(let e of a.steps)e.status===`success`&&p.push(`### ${e.name}`,``,e.output,``,`---`,``);return p.push(`_All results auto-saved to KB.`,a.mode===`generate`?` Files written to \`${a.outDir}\`.`:``," Next: Use `search` to query the knowledge, or `remember` to add custom insights._"),{content:[{type:`text`,text:p.join(`
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{createTaskRunner as t}from"../task-manager.js";import{createHash as n}from"node:crypto";import{z as r}from"zod";import{createLogger as i,serializeError as a}from"../../../core/dist/index.js";import{onboard as o}from"../../../tools/dist/index.js";const s=i(`tools`);let c=!1;async function l(e,t,r){for(let i of r.steps)if(!(i.status!==`success`||!i.output))try{let a=n(`sha256`).update(r.path).digest(`hex`).slice(0,12),o=`produced/onboard/${i.name}/${a}.md`,s=n(`sha256`).update(i.output).digest(`hex`).slice(0,16),c=new Date().toISOString(),l=i.output.length>2e3?i.output.split(/(?=^## )/m).filter(e=>e.trim().length>0):[i.output],u=l.map((e,t)=>({id:n(`sha256`).update(`${o}::${t}`).digest(`hex`).slice(0,16),content:e.trim(),sourcePath:o,contentType:`produced-knowledge`,chunkIndex:t,totalChunks:l.length,startLine:0,endLine:0,fileHash:s,indexedAt:c,origin:`produced`,tags:[`onboard`,i.name],category:`analysis`,version:1})),d=await t.embedBatch(u.map(e=>e.content));await e.upsert(u,d)}catch(e){s.warn(`Auto-persist onboard step failed`,{stepName:i.name,...a(e)})}}function u(n,i,u,d){let f=e(`onboard`);n.registerTool(`onboard`,{title:f.title,description:`First-time codebase onboarding: runs all analysis tools (structure, dependencies, entry-points, symbols, patterns, diagram) in one command. Results are auto-persisted to KB. Use mode=generate to also write structured output to .ai/kb/ directory.`,inputSchema:{path:r.string().describe(`Root path of the codebase to onboard`),mode:r.enum([`memory`,`generate`]).default(`generate`).describe(`Output mode: generate (default) = persist to KB + write .ai/kb/ files; memory = KB vector store only`),out_dir:r.string().optional().describe(`Custom output directory for generate mode (default: <path>/.ai/kb)`)},annotations:f.annotations},async({path:e,mode:n,out_dir:r},f)=>{try{if(c)return{content:[{type:`text`,text:`Onboard is already running. Please wait for it to complete before starting another.`}]};c=!0,s.info(`Starting onboard`,{path:e,mode:n});let a=await o({path:e,mode:n,outDir:r??d?.onboardDir}),p=t(f).createTask(`Onboard`,a.steps.length);for(let e=0;e<a.steps.length;e++){let t=a.steps[e];p.progress(e,`${t.name}: ${t.status}`)}p.complete(`Onboard complete: ${a.steps.filter(e=>e.status===`success`).length}/${a.steps.length} steps succeeded`),l(i,u,a);let m=[`## Onboard Complete`,``,`**Path:** \`${a.path}\``,`**Mode:** ${a.mode}`,`**Duration:** ${a.totalDurationMs}ms`,``];a.outDir&&(m.push(`**Output directory:** \`${a.outDir}\``),m.push(``)),m.push(`### Analysis Results`,``);let h=[],g=[];for(let e of a.steps)e.status===`success`?h.push(`- ✓ **${e.name}** (${e.durationMs}ms) — ${e.output.length} chars`):g.push(`- ✗ **${e.name}** — ${e.error}`);m.push(...h),g.length>0&&m.push(``,`### Failed`,``,...g),m.push(``,`---`,``);for(let e of a.steps)e.status===`success`&&m.push(`### ${e.name}`,``,e.output,``,`---`,``);return m.push(`_All results auto-saved to KB.`,a.mode===`generate`?` Files written to \`${a.outDir}\`.`:``," Next: Use `search` to query the knowledge, or `remember` to add custom insights._"),{content:[{type:`text`,text:m.join(`
2
2
  `)}]}}catch(e){return s.error(`Onboard failed`,a(e)),{content:[{type:`text`,text:`Onboard failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}finally{c=!1}})}export{u as registerOnboardTool};
@@ -1,5 +1,5 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { PolicyStore } from "@kb/enterprise-bridge";
2
+ import { PolicyStore } from "../../../enterprise-bridge/dist/index.js";
3
3
 
4
4
  //#region packages/server/src/tools/policy.tools.d.ts
5
5
  declare function registerErUpdatePolicyTool(server: McpServer, policyStore: PolicyStore): void;
@@ -1,5 +1,5 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { Elicitor } from "@kb/elicitation";
2
+ import { Elicitor } from "../../../elicitation/dist/index.js";
3
3
 
4
4
  //#region packages/server/src/tools/present.tool.d.ts
5
5
  declare function registerPresentTool(server: McpServer, elicitor?: Elicitor): void;
@@ -1,6 +1,7 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { KBConfig } from "../../../core/dist/index.js";
2
3
 
3
4
  //#region packages/server/src/tools/produce.tool.d.ts
4
- declare function registerProduceKnowledgeTool(server: McpServer): void;
5
+ declare function registerProduceKnowledgeTool(server: McpServer, config?: KBConfig): void;
5
6
  //#endregion
6
7
  export { registerProduceKnowledgeTool };
@@ -1,4 +1,4 @@
1
- import{getToolMeta as e}from"../tool-metadata.js";import{z as t}from"zod";import{createLogger as n,serializeError as r}from"../../../core/dist/index.js";import{DependencyAnalyzer as i,DiagramGenerator as a,EntryPointAnalyzer as o,KnowledgeProducer as s,PatternAnalyzer as c,StructureAnalyzer as l,SymbolAnalyzer as u}from"../../../analyzers/dist/index.js";const d=n(`tools`);function f(n){let f=new s({structure:new l,dependencies:new i,symbols:new u,patterns:new c,entryPoints:new o,diagrams:new a}),p=e(`produce_knowledge`);n.registerTool(`produce_knowledge`,{title:p.title,description:`Run automated codebase analysis and produce synthesis instructions. Executes Tier 1 deterministic analyzers, then returns structured baselines and instructions for you to synthesize knowledge using remember.`,inputSchema:{scope:t.string().optional().describe(`Root path to analyze (defaults to workspace root)`),aspects:t.array(t.enum([`all`,`structure`,`dependencies`,`symbols`,`patterns`,`entry-points`,`diagrams`])).default([`all`]).describe(`Which analysis aspects to run`)},annotations:p.annotations},async({scope:e,aspects:t})=>{try{let n=e??`.`;d.info(`Running knowledge production`,{rootPath:n,aspects:t});let r=await f.runExtraction(n,t);return{content:[{type:`text`,text:f.buildSynthesisInstructions(r,t)+`
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{mkdirSync as t,writeFileSync as n}from"node:fs";import{join as r}from"node:path";import{z as i}from"zod";import{createLogger as a,serializeError as o}from"../../../core/dist/index.js";import{DependencyAnalyzer as s,DiagramGenerator as c,EntryPointAnalyzer as l,KnowledgeProducer as u,PatternAnalyzer as d,StructureAnalyzer as f,SymbolAnalyzer as p}from"../../../analyzers/dist/index.js";const m=a(`tools`);function h(a,h){let g=new u({structure:new f,dependencies:new s,symbols:new p,patterns:new d,entryPoints:new l,diagrams:new c}),_=e(`produce_knowledge`);a.registerTool(`produce_knowledge`,{title:_.title,description:`Run automated codebase analysis and produce synthesis instructions. Executes Tier 1 deterministic analyzers, then returns structured baselines and instructions for you to synthesize knowledge using remember.`,inputSchema:{scope:i.string().optional().describe(`Root path to analyze (defaults to workspace root)`),aspects:i.array(i.enum([`all`,`structure`,`dependencies`,`symbols`,`patterns`,`entry-points`,`diagrams`])).default([`all`]).describe(`Which analysis aspects to run`)},annotations:_.annotations},async({scope:e,aspects:i})=>{try{let a=e??`.`;m.info(`Running knowledge production`,{rootPath:a,aspects:i});let s=await g.runExtraction(a,i);try{let e=h?.onboardDir??r(a,`.ai`,`kb`);t(e,{recursive:!0});let i=`<!-- Generated by produce_knowledge at ${new Date().toISOString()} -->\n\n`;for(let[t,a]of Object.entries(s))a&&typeof a==`string`&&n(r(e,`${t}.md`),i+a,`utf-8`);m.info(`Knowledge persisted to .ai/kb/`,{files:Object.keys(s).length})}catch(e){m.warn(`Failed to persist knowledge to .ai/kb/`,{error:o(e)})}return{content:[{type:`text`,text:g.buildSynthesisInstructions(s,i)+`
2
2
 
3
3
  ---
4
- _Next: Review the baselines above and use \`remember\` to store synthesized knowledge entries._`}]}}catch(e){return d.error(`Knowledge production failed`,r(e)),{content:[{type:`text`,text:`Knowledge production failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{f as registerProduceKnowledgeTool};
4
+ _Next: Review the baselines above and use \`remember\` to store synthesized knowledge entries._`}]}}catch(e){return m.error(`Knowledge production failed`,o(e)),{content:[{type:`text`,text:`Knowledge production failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{h as registerProduceKnowledgeTool};
@@ -1,9 +1,9 @@
1
1
  import { CuratedKnowledgeManager } from "../curated-manager.js";
2
2
  import { ResourceNotifier } from "../resources/resource-notifier.js";
3
3
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
- import { KBConfig } from "@kb/core";
5
- import { IncrementalIndexer } from "@kb/indexer";
6
- import { IKnowledgeStore } from "@kb/store";
4
+ import { KBConfig } from "../../../core/dist/index.js";
5
+ import { IKnowledgeStore } from "../../../store/dist/index.js";
6
+ import { IncrementalIndexer } from "../../../indexer/dist/index.js";
7
7
 
8
8
  //#region packages/server/src/tools/reindex.tool.d.ts
9
9
  declare function registerReindexTool(server: McpServer, indexer: IncrementalIndexer, config: KBConfig, curated: CuratedKnowledgeManager, store?: IKnowledgeStore, resourceNotifier?: ResourceNotifier): void;
@@ -1,7 +1,7 @@
1
1
  import { CuratedKnowledgeManager } from "../curated-manager.js";
2
2
  import { ResourceNotifier } from "../resources/resource-notifier.js";
3
3
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
- import { EvolutionCollector, PolicyStore } from "@kb/enterprise-bridge";
4
+ import { EvolutionCollector, PolicyStore } from "../../../enterprise-bridge/dist/index.js";
5
5
 
6
6
  //#region packages/server/src/tools/remember.tool.d.ts
7
7
  declare function registerRememberTool(server: McpServer, curated: CuratedKnowledgeManager, policyStore?: PolicyStore, evolutionCollector?: EvolutionCollector, resourceNotifier?: ResourceNotifier): void;
@@ -1,9 +1,9 @@
1
1
  import { ISamplingClient } from "../sampling.js";
2
2
  import { BridgeComponents } from "./bridge.tools.js";
3
3
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
- import { IEmbedder } from "@kb/embeddings";
5
- import { EvolutionCollector } from "@kb/enterprise-bridge";
6
- import { IGraphStore, IKnowledgeStore } from "@kb/store";
4
+ import { EvolutionCollector } from "../../../enterprise-bridge/dist/index.js";
5
+ import { IGraphStore, IKnowledgeStore } from "../../../store/dist/index.js";
6
+ import { IEmbedder } from "../../../embeddings/dist/index.js";
7
7
 
8
8
  //#region packages/server/src/tools/search.tool.d.ts
9
9
  declare function registerSearchTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore, graphStore?: IGraphStore, bridge?: BridgeComponents, evolutionCollector?: EvolutionCollector, samplingClient?: ISamplingClient): void;
@@ -1,12 +1,13 @@
1
1
  import { CuratedKnowledgeManager } from "../curated-manager.js";
2
2
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
- import { IGraphStore, IKnowledgeStore } from "@kb/store";
3
+ import { KBConfig } from "../../../core/dist/index.js";
4
+ import { IGraphStore, IKnowledgeStore } from "../../../store/dist/index.js";
4
5
 
5
6
  //#region packages/server/src/tools/status.tool.d.ts
6
7
  interface OnboardState {
7
8
  onboardComplete: boolean;
8
9
  onboardTimestamp?: string;
9
10
  }
10
- declare function registerStatusTool(server: McpServer, store: IKnowledgeStore, graphStore?: IGraphStore, curated?: CuratedKnowledgeManager, onboardState?: OnboardState): void;
11
+ declare function registerStatusTool(server: McpServer, store: IKnowledgeStore, graphStore?: IGraphStore, curated?: CuratedKnowledgeManager, onboardState?: OnboardState, config?: KBConfig): void;
11
12
  //#endregion
12
13
  export { OnboardState, registerStatusTool };
@@ -1,2 +1,2 @@
1
- import{getToolMeta as e}from"../tool-metadata.js";import{StatusOutputSchema as t}from"../output-schemas.js";import{existsSync as n}from"node:fs";import{resolve as r}from"node:path";import{KB_PATHS as i,createLogger as a,serializeError as o}from"../../../core/dist/index.js";import{WasmRuntime as s}from"../../../chunker/dist/index.js";const c=a(`tools`);function l(e,t,n,r=4e3){let i,a=new Promise(e=>{i=setTimeout(()=>{c.warn(`Status sub-operation "${n}" timed out after ${r}ms`),e({value:t,timedOut:!0})},r)});return Promise.race([e.then(e=>(clearTimeout(i),{value:e,timedOut:!1}),e=>(clearTimeout(i),c.warn(`Status sub-operation "${n}" failed: ${e instanceof Error?e.message:String(e)}`),{value:t,timedOut:!1})),a])}function u(a,u,d,f,p){let m=e(`status`);a.registerTool(`status`,{title:m.title,description:`Get the current status and statistics of the knowledge base index.`,outputSchema:t,annotations:m.annotations},async()=>{let e=[];try{let t=await l(u.getStats(),{totalRecords:0,totalFiles:0,lastIndexedAt:null,contentTypeBreakdown:{}},`store.getStats`),a=t.value;t.timedOut&&e.push(`⚠ Index stats timed out — values may be incomplete`);let o=await l(u.listSourcePaths(),[],`store.listSourcePaths`),c=o.value;o.timedOut&&e.push(`⚠ File listing timed out`);let m=null,h=0,g=[`## Knowledge Base Status`,``,`- **Total Records**: ${a.totalRecords}`,`- **Total Files**: ${a.totalFiles}`,`- **Last Indexed**: ${a.lastIndexedAt??`Never`}`,``,`### Content Types`,...Object.entries(a.contentTypeBreakdown).map(([e,t])=>`- ${e}: ${t}`),``,`### Indexed Files`,...c.slice(0,50).map(e=>`- ${e}`),c.length>50?`\n... and ${c.length-50} more files`:``];if(d)try{let t=await l(d.getStats(),{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}},`graphStore.getStats`);if(t.timedOut)e.push(`⚠ Graph stats timed out`),g.push(``,`### Knowledge Graph`,`- Graph stats timed out`);else{let e=t.value;m={nodes:e.nodeCount,edges:e.edgeCount},g.push(``,`### Knowledge Graph`,`- **Nodes**: ${e.nodeCount}`,`- **Edges**: ${e.edgeCount}`,...Object.entries(e.nodeTypes).map(([e,t])=>` - ${e}: ${t}`));try{let e=await l(d.validate(),{valid:!0,danglingEdges:[],orphanNodes:[],stats:{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}}},`graphStore.validate`);if(!e.timedOut){let t=e.value;t.valid||g.push(`- **⚠ Integrity Issues**: ${t.danglingEdges.length} dangling edges`),t.orphanNodes.length>0&&g.push(`- **Orphan nodes**: ${t.orphanNodes.length}`)}}catch{}}}catch{g.push(``,`### Knowledge Graph`,`- Graph store unavailable`)}let _=n(r(process.cwd(),i.aiKb)),v=p?.onboardComplete??_;if(g.push(``,`### Onboard Status`,v?`- ✅ Complete${p?.onboardTimestamp?` (last: ${p.onboardTimestamp})`:``}`:'- ❌ Not run — call `onboard({ path: "." })` to analyze the codebase'),f)try{let t=await l(f.list(),[],`curated.list`);if(t.timedOut)e.push(`⚠ Curated knowledge listing timed out`),g.push(``,`### Curated Knowledge`,`- Listing timed out`);else{let e=t.value;h=e.length,g.push(``,`### Curated Knowledge`,e.length>0?`- ${e.length} entries`:"- Empty — use `remember()` to persist decisions")}}catch{g.push(``,`### Curated Knowledge`,`- Unable to read curated entries`)}if(a.lastIndexedAt){let e=new Date(a.lastIndexedAt),t=(Date.now()-e.getTime())/(1e3*60*60);g.push(``,`### Index Freshness`,t>24?`- ⚠ Last indexed ${Math.floor(t)}h ago — may be stale. Run \`reindex({})\``:`- ✅ Last indexed ${t<1?`less than 1h`:`${Math.floor(t)}h`} ago`)}g.push(``,`### Runtime`,`- **Tree-sitter (WASM)**: ${s.get()?`✅ Available (AST analysis)`:`⚠ Unavailable (regex fallback)`}`),e.length>0&&g.push(``,`### ⚠ Warnings`,...e.map(e=>`- ${e}`));let y=g.join(`
2
- `),b={totalRecords:a.totalRecords,totalFiles:a.totalFiles,lastIndexedAt:a.lastIndexedAt??null,onboarded:v,contentTypes:a.contentTypeBreakdown,wasmAvailable:!!s.get(),graphStats:m,curatedCount:h};return{content:[{type:`text`,text:y+"\n\n---\n_Next: Use `search` to query indexed content, `graph(stats)` to explore the knowledge graph, or `reindex` to refresh the index._"}],structuredContent:b}}catch(e){return c.error(`Status failed`,o(e)),{content:[{type:`text`,text:`Status check failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{u as registerStatusTool};
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{StatusOutputSchema as t}from"../output-schemas.js";import{getCurrentVersion as n}from"../version-check.js";import{existsSync as r,readFileSync as i}from"node:fs";import{resolve as a}from"node:path";import{KB_PATHS as o,createLogger as s,serializeError as c}from"../../../core/dist/index.js";import{WasmRuntime as l}from"../../../chunker/dist/index.js";import{homedir as u}from"node:os";const d=s(`tools`);function f(e,t,n,r=4e3){let i,a=new Promise(e=>{i=setTimeout(()=>{d.warn(`Status sub-operation "${n}" timed out after ${r}ms`),e({value:t,timedOut:!0})},r)});return Promise.race([e.then(e=>(clearTimeout(i),{value:e,timedOut:!1}),e=>(clearTimeout(i),d.warn(`Status sub-operation "${n}" failed: ${e instanceof Error?e.message:String(e)}`),{value:t,timedOut:!1})),a])}function p(){try{let e=a(u(),`.copilot`,`.kb-scaffold.json`);return r(e)?JSON.parse(i(e,`utf-8`)).version??null:null}catch{return null}}function m(i,s,u,m,h,g){let _=e(`status`);i.registerTool(`status`,{title:_.title,description:`Get the current status and statistics of the knowledge base index.`,outputSchema:t,annotations:_.annotations},async()=>{let e=[];try{let t=await f(s.getStats(),{totalRecords:0,totalFiles:0,lastIndexedAt:null,contentTypeBreakdown:{}},`store.getStats`),i=t.value;t.timedOut&&e.push(`⚠ Index stats timed out — values may be incomplete`);let c=await f(s.listSourcePaths(),[],`store.listSourcePaths`),d=c.value;c.timedOut&&e.push(`⚠ File listing timed out`);let _=null,v=0,y=[`## Knowledge Base Status`,``,`- **Total Records**: ${i.totalRecords}`,`- **Total Files**: ${i.totalFiles}`,`- **Last Indexed**: ${i.lastIndexedAt??`Never`}`,``,`### Content Types`,...Object.entries(i.contentTypeBreakdown).map(([e,t])=>`- ${e}: ${t}`),``,`### Indexed Files`,...d.slice(0,50).map(e=>`- ${e}`),d.length>50?`\n... and ${d.length-50} more files`:``];if(u)try{let t=await f(u.getStats(),{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}},`graphStore.getStats`);if(t.timedOut)e.push(`⚠ Graph stats timed out`),y.push(``,`### Knowledge Graph`,`- Graph stats timed out`);else{let e=t.value;_={nodes:e.nodeCount,edges:e.edgeCount},y.push(``,`### Knowledge Graph`,`- **Nodes**: ${e.nodeCount}`,`- **Edges**: ${e.edgeCount}`,...Object.entries(e.nodeTypes).map(([e,t])=>` - ${e}: ${t}`));try{let e=await f(u.validate(),{valid:!0,danglingEdges:[],orphanNodes:[],stats:{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}}},`graphStore.validate`);if(!e.timedOut){let t=e.value;t.valid||y.push(`- **⚠ Integrity Issues**: ${t.danglingEdges.length} dangling edges`),t.orphanNodes.length>0&&y.push(`- **Orphan nodes**: ${t.orphanNodes.length}`)}}catch{}}}catch{y.push(``,`### Knowledge Graph`,`- Graph store unavailable`)}let b=g?.onboardDir??a(process.cwd(),o.aiKb),x=r(b),S=h?.onboardComplete??x;if(y.push(``,`### Onboard Status`,S?`- ✅ Complete${h?.onboardTimestamp?` (last: ${h.onboardTimestamp})`:``}`:'- ❌ Not run — call `onboard({ path: "." })` to analyze the codebase',`- **Onboard Directory**: \`${b}\``),m)try{let t=await f(m.list(),[],`curated.list`);if(t.timedOut)e.push(`⚠ Curated knowledge listing timed out`),y.push(``,`### Curated Knowledge`,`- Listing timed out`);else{let e=t.value;v=e.length,y.push(``,`### Curated Knowledge`,e.length>0?`- ${e.length} entries`:"- Empty — use `remember()` to persist decisions")}}catch{y.push(``,`### Curated Knowledge`,`- Unable to read curated entries`)}if(i.lastIndexedAt){let e=new Date(i.lastIndexedAt),t=(Date.now()-e.getTime())/(1e3*60*60);y.push(``,`### Index Freshness`,t>24?`- ⚠ Last indexed ${Math.floor(t)}h ago — may be stale. Run \`reindex({})\``:`- ✅ Last indexed ${t<1?`less than 1h`:`${Math.floor(t)}h`} ago`)}y.push(``,`### Runtime`,`- **Tree-sitter (WASM)**: ${l.get()?`✅ Available (AST analysis)`:`⚠ Unavailable (regex fallback)`}`);let C=p(),w=n();C&&C!==w&&y.push(``,`### Upgrade Available`,`- New version available (${w}). Run: \`npx -y @vpxa/kb upgrade\``),e.length>0&&y.push(``,`### ⚠ Warnings`,...e.map(e=>`- ${e}`));let T=y.join(`
2
+ `),E={totalRecords:i.totalRecords,totalFiles:i.totalFiles,lastIndexedAt:i.lastIndexedAt??null,onboarded:S,onboardDir:b,contentTypes:i.contentTypeBreakdown,wasmAvailable:!!l.get(),graphStats:_,curatedCount:v,serverVersion:w,scaffoldVersion:C??null,upgradeAvailable:C!=null&&C!==w};return{content:[{type:`text`,text:T+"\n\n---\n_Next: Use `search` to query indexed content, `graph(stats)` to explore the knowledge graph, or `reindex` to refresh the index._"}],structuredContent:E}}catch(e){return d.error(`Status failed`,c(e)),{content:[{type:`text`,text:`Status check failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{m as registerStatusTool};