@vpxa/kb 0.1.24 → 0.1.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/package.json +9 -2
- package/packages/analyzers/dist/symbol-analyzer.js +5 -5
- package/packages/cli/dist/commands/init/adapters.js +1 -1
- package/packages/cli/dist/commands/init/constants.d.ts +4 -1
- package/packages/cli/dist/commands/init/constants.js +1 -1
- package/packages/cli/dist/commands/init/frontmatter.d.ts +54 -0
- package/packages/cli/dist/commands/init/frontmatter.js +2 -0
- package/packages/cli/dist/commands/init/index.js +4 -4
- package/packages/cli/dist/commands/init/manifest.d.ts +71 -0
- package/packages/cli/dist/commands/init/manifest.js +1 -0
- package/packages/cli/dist/commands/init/scaffold.d.ts +28 -5
- package/packages/cli/dist/commands/init/scaffold.js +1 -1
- package/packages/cli/dist/commands/init/templates.js +38 -9
- package/packages/cli/dist/commands/init/user.d.ts +1 -1
- package/packages/cli/dist/commands/init/user.js +4 -4
- package/packages/cli/dist/commands/system.js +2 -2
- package/packages/cli/dist/kb-init.js +1 -1
- package/packages/core/dist/errors.d.ts +2 -2
- package/packages/core/dist/errors.js +1 -1
- package/packages/core/dist/logger.d.ts +2 -1
- package/packages/core/dist/logger.js +1 -1
- package/packages/core/dist/types.d.ts +6 -0
- package/packages/dashboard/dist/assets/index-9ysCkze9.js +21 -0
- package/packages/dashboard/dist/assets/index-9ysCkze9.js.map +1 -0
- package/packages/dashboard/dist/assets/index-CHpVij2M.css +1 -0
- package/packages/dashboard/dist/index.html +18 -0
- package/packages/elicitation/dist/__tests__/build.test.d.ts +1 -0
- package/packages/elicitation/dist/__tests__/build.test.js +35 -0
- package/packages/elicitation/dist/__tests__/fields.test.d.ts +1 -0
- package/packages/elicitation/dist/__tests__/fields.test.js +81 -0
- package/packages/elicitation/dist/__tests__/normalize.test.d.ts +1 -0
- package/packages/elicitation/dist/__tests__/normalize.test.js +60 -0
- package/packages/elicitation/dist/build.d.ts +13 -0
- package/packages/elicitation/dist/build.js +23 -0
- package/packages/elicitation/dist/fields.d.ts +41 -0
- package/packages/elicitation/dist/fields.js +62 -0
- package/packages/elicitation/dist/index.d.ts +10 -0
- package/packages/elicitation/dist/index.js +12 -0
- package/packages/elicitation/dist/normalize.d.ts +15 -0
- package/packages/elicitation/dist/normalize.js +31 -0
- package/packages/elicitation/dist/types.d.ts +85 -0
- package/packages/elicitation/dist/types.js +8 -0
- package/packages/kb-client/dist/direct-client.d.ts +37 -0
- package/packages/kb-client/dist/direct-client.js +1 -0
- package/packages/kb-client/dist/index.d.ts +5 -0
- package/packages/kb-client/dist/index.js +1 -0
- package/packages/kb-client/dist/mcp-client.d.ts +19 -0
- package/packages/kb-client/dist/mcp-client.js +4 -0
- package/packages/kb-client/dist/parsers.d.ts +35 -0
- package/packages/kb-client/dist/parsers.js +2 -0
- package/packages/kb-client/dist/types.d.ts +62 -0
- package/packages/kb-client/dist/types.js +1 -0
- package/packages/present/dist/index.html +384 -0
- package/packages/server/dist/completions.d.ts +14 -0
- package/packages/server/dist/completions.js +1 -0
- package/packages/server/dist/dashboard-static.d.ts +27 -0
- package/packages/server/dist/dashboard-static.js +1 -0
- package/packages/server/dist/elicitor.d.ts +18 -0
- package/packages/server/dist/elicitor.js +1 -0
- package/packages/server/dist/index.js +1 -1
- package/packages/server/dist/mcp-logging.js +1 -1
- package/packages/server/dist/output-schemas.d.ts +118 -1
- package/packages/server/dist/output-schemas.js +1 -1
- package/packages/server/dist/prompts.d.ts +9 -2
- package/packages/server/dist/prompts.js +13 -7
- package/packages/server/dist/resources/curated-resources.js +1 -1
- package/packages/server/dist/resources/resource-notifier.d.ts +45 -0
- package/packages/server/dist/resources/resource-notifier.js +1 -0
- package/packages/server/dist/sampling.d.ts +41 -0
- package/packages/server/dist/sampling.js +2 -0
- package/packages/server/dist/server.d.ts +5 -2
- package/packages/server/dist/server.js +2 -2
- package/packages/server/dist/task-manager.d.ts +40 -0
- package/packages/server/dist/task-manager.js +1 -0
- package/packages/server/dist/tool-metadata.js +1 -1
- package/packages/server/dist/tool-prefix.d.ts +12 -0
- package/packages/server/dist/tool-prefix.js +1 -0
- package/packages/server/dist/tools/analyze.tools.js +4 -4
- package/packages/server/dist/tools/audit.tool.js +1 -1
- package/packages/server/dist/tools/brainstorm.tool.d.ts +7 -0
- package/packages/server/dist/tools/brainstorm.tool.js +9 -0
- package/packages/server/dist/tools/context.tools.js +9 -9
- package/packages/server/dist/tools/execution.tools.d.ts +2 -1
- package/packages/server/dist/tools/execution.tools.js +4 -4
- package/packages/server/dist/tools/forge.tools.js +10 -10
- package/packages/server/dist/tools/forget.tool.d.ts +2 -1
- package/packages/server/dist/tools/forget.tool.js +1 -1
- package/packages/server/dist/tools/graph.tool.js +2 -2
- package/packages/server/dist/tools/manipulation.tools.js +4 -4
- package/packages/server/dist/tools/onboard.tool.js +2 -2
- package/packages/server/dist/tools/present-blocks.d.ts +46 -0
- package/packages/server/dist/tools/present-blocks.js +27 -0
- package/packages/server/dist/tools/present-charts.d.ts +31 -0
- package/packages/server/dist/tools/present-charts.js +34 -0
- package/packages/server/dist/tools/present-theme.d.ts +14 -0
- package/packages/server/dist/tools/present-theme.js +395 -0
- package/packages/server/dist/tools/present-utils.d.ts +11 -0
- package/packages/server/dist/tools/present-utils.js +1 -0
- package/packages/server/dist/tools/present.tool.d.ts +7 -0
- package/packages/server/dist/tools/present.tool.js +113 -0
- package/packages/server/dist/tools/produce.tool.js +2 -2
- package/packages/server/dist/tools/reindex.tool.d.ts +2 -1
- package/packages/server/dist/tools/reindex.tool.js +2 -2
- package/packages/server/dist/tools/remember.tool.d.ts +2 -1
- package/packages/server/dist/tools/remember.tool.js +2 -2
- package/packages/server/dist/tools/replay.tool.js +1 -1
- package/packages/server/dist/tools/search.tool.d.ts +2 -1
- package/packages/server/dist/tools/search.tool.js +5 -4
- package/packages/server/dist/tools/status.tool.js +2 -2
- package/packages/server/dist/tools/update.tool.d.ts +2 -1
- package/packages/server/dist/tools/update.tool.js +1 -1
- package/packages/server/dist/tools/utility.tools.js +1 -1
- package/packages/tools/dist/batch.js +1 -1
- package/packages/tools/dist/checkpoint.js +1 -1
- package/packages/tools/dist/config-extractor.d.ts +9 -0
- package/packages/tools/dist/config-extractor.js +7 -0
- package/packages/tools/dist/dead-symbols.js +2 -2
- package/packages/tools/dist/diagram-builder.d.ts +9 -0
- package/packages/tools/dist/diagram-builder.js +9 -0
- package/packages/tools/dist/evidence-map.d.ts +12 -1
- package/packages/tools/dist/evidence-map.js +2 -2
- package/packages/tools/dist/find-examples.js +2 -2
- package/packages/tools/dist/forge-classify.d.ts +4 -0
- package/packages/tools/dist/forge-classify.js +1 -1
- package/packages/tools/dist/git-context.d.ts +1 -0
- package/packages/tools/dist/git-context.js +3 -3
- package/packages/tools/dist/index.d.ts +3 -2
- package/packages/tools/dist/index.js +1 -1
- package/packages/tools/dist/onboard-utils.d.ts +12 -0
- package/packages/tools/dist/onboard-utils.js +1 -0
- package/packages/tools/dist/onboard.js +2 -21
- package/packages/tools/dist/regex-utils.d.ts +8 -0
- package/packages/tools/dist/regex-utils.js +1 -0
- package/packages/tools/dist/rename.js +2 -2
- package/packages/tools/dist/replay.d.ts +2 -1
- package/packages/tools/dist/replay.js +4 -4
- package/packages/tools/dist/symbol.js +3 -3
- package/packages/tools/dist/synthesis-engine.d.ts +13 -0
- package/packages/tools/dist/synthesis-engine.js +6 -0
- package/packages/tools/dist/trace.js +2 -2
- package/packages/tui/dist/App-DXY0-tlW.js +2 -0
- package/packages/tui/dist/App.d.ts +3 -3
- package/packages/tui/dist/App.js +1 -1
- package/packages/tui/dist/CuratedPanel-BIamXLNy.js +2 -0
- package/packages/tui/dist/LogPanel-D6u6o84n.js +3 -0
- package/packages/tui/dist/SearchPanel-CpJGczAc.js +2 -0
- package/packages/tui/dist/StatusPanel-BAbUxyqQ.js +2 -0
- package/packages/tui/dist/hooks/useKBClient.d.ts +9 -0
- package/packages/tui/dist/hooks/useKBClient.js +2 -0
- package/packages/tui/dist/hooks/usePolling.d.ts +8 -0
- package/packages/tui/dist/hooks/usePolling.js +2 -0
- package/packages/tui/dist/index.d.ts +6 -2
- package/packages/tui/dist/index.js +1 -1
- package/packages/tui/dist/jsx-runtime-y6Gdq5PZ.js +294 -0
- package/packages/tui/dist/panels/CuratedPanel.d.ts +1 -7
- package/packages/tui/dist/panels/CuratedPanel.js +1 -1
- package/packages/tui/dist/panels/LogPanel.js +1 -1
- package/packages/tui/dist/panels/SearchPanel.d.ts +1 -10
- package/packages/tui/dist/panels/SearchPanel.js +1 -1
- package/packages/tui/dist/panels/StatusPanel.d.ts +1 -7
- package/packages/tui/dist/panels/StatusPanel.js +1 -1
- package/packages/tui/dist/react-D__J1GQe.js +24 -0
- package/packages/tui/dist/types-VcTHNV6s.d.ts +64 -0
- package/packages/tui/dist/useKBClient-C35iA4uG.js +2 -0
- package/packages/tui/dist/usePolling-BbjnRWgx.js +2 -0
- package/scaffold/adapters/copilot.mjs +9 -81
- package/scaffold/definitions/agents.mjs +12 -0
- package/scaffold/definitions/bodies.mjs +39 -14
- package/scaffold/definitions/protocols.mjs +149 -0
- package/scaffold/definitions/tools.mjs +40 -5
- package/scaffold/general/agents/Architect-Reviewer-Alpha.agent.md +1 -1
- package/scaffold/general/agents/Architect-Reviewer-Beta.agent.md +1 -1
- package/scaffold/general/agents/Code-Reviewer-Alpha.agent.md +1 -1
- package/scaffold/general/agents/Code-Reviewer-Beta.agent.md +1 -1
- package/scaffold/general/agents/Debugger.agent.md +2 -2
- package/scaffold/general/agents/Documenter.agent.md +2 -2
- package/scaffold/general/agents/Explorer.agent.md +4 -3
- package/scaffold/general/agents/Frontend.agent.md +1 -1
- package/scaffold/general/agents/Implementer.agent.md +1 -1
- package/scaffold/general/agents/Orchestrator.agent.md +16 -1
- package/scaffold/general/agents/Planner.agent.md +11 -4
- package/scaffold/general/agents/Refactor.agent.md +1 -1
- package/scaffold/general/agents/Researcher-Alpha.agent.md +1 -1
- package/scaffold/general/agents/Researcher-Beta.agent.md +1 -1
- package/scaffold/general/agents/Researcher-Delta.agent.md +1 -1
- package/scaffold/general/agents/Researcher-Gamma.agent.md +1 -1
- package/scaffold/general/agents/Security.agent.md +10 -8
- package/scaffold/general/agents/_shared/architect-reviewer-base.md +1 -0
- package/scaffold/general/agents/_shared/code-agent-base.md +28 -0
- package/scaffold/general/agents/_shared/code-reviewer-base.md +1 -0
- package/scaffold/general/agents/_shared/forge-protocol.md +44 -0
- package/scaffold/general/agents/_shared/researcher-base.md +14 -0
- package/scaffold/general/agents/templates/adr-template.md +1 -0
- package/scaffold/general/agents/templates/execution-state.md +1 -0
- package/skills/knowledge-base/SKILL.md +19 -6
- package/skills/present/SKILL.md +153 -0
- package/packages/server/dist/tools/toolkit.tools.d.ts +0 -36
- package/packages/server/dist/tools/toolkit.tools.js +0 -20
- package/packages/tui/dist/App-DE_tdOhs.js +0 -2
- package/packages/tui/dist/CuratedPanel-sYdZAICX.js +0 -2
- package/packages/tui/dist/LogPanel-Ce3jMQbH.js +0 -3
- package/packages/tui/dist/SearchPanel-DREo6zgt.js +0 -2
- package/packages/tui/dist/StatusPanel-2ex8fLOO.js +0 -2
- package/packages/tui/dist/embedder.interface-IFCBpOlX.d.ts +0 -28
- package/packages/tui/dist/index-C8NmOF18.d.ts +0 -13
- package/packages/tui/dist/jsx-runtime-Cof-kwFn.js +0 -316
- package/packages/tui/dist/store.interface-CnY6SPOH.d.ts +0 -150
- /package/packages/tui/dist/{devtools-DUyj952l.js → devtools-DMOZMn70.js} +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CuratedKnowledgeManager } from "./curated-manager.js";
|
|
2
|
+
import { IGraphStore, IKnowledgeStore } from "@kb/store";
|
|
3
|
+
|
|
4
|
+
//#region packages/server/src/completions.d.ts
|
|
5
|
+
/** Clear all completion caches (useful for testing). */
|
|
6
|
+
declare function clearCompletionCache(): void;
|
|
7
|
+
declare function completeCuratedPaths(curated: CuratedKnowledgeManager, partial: string): Promise<string[]>;
|
|
8
|
+
declare function completeFilePaths(store: IKnowledgeStore, partial: string): Promise<string[]>;
|
|
9
|
+
declare function completeSymbolNames(graphStore: IGraphStore, partial: string): Promise<string[]>;
|
|
10
|
+
declare function completeStashKeys(partial: string): string[];
|
|
11
|
+
declare function completeWorksetNames(partial: string): string[];
|
|
12
|
+
declare function completeCheckpointNames(partial: string): string[];
|
|
13
|
+
//#endregion
|
|
14
|
+
export { clearCompletionCache, completeCheckpointNames, completeCuratedPaths, completeFilePaths, completeStashKeys, completeSymbolNames, completeWorksetNames };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{checkpointList as e,listWorksets as t,stashList as n}from"../../tools/dist/index.js";const r=3e4,i=new Map;function a(e,t,n){let r=i.get(e);if(r&&Date.now()<r.expires)return Promise.resolve(r.data);let a=n();return Promise.resolve(a).then(n=>(i.set(e,{data:n,expires:Date.now()+t}),n))}function o(){i.clear()}function s(e,t){return a(`curated-paths`,r,async()=>(await e.list()).map(e=>e.path)).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function c(e,t){return a(`file-paths`,r,()=>e.listSourcePaths()).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function l(e,t){return a(`symbol-names`,r,async()=>(await e.findNodes({type:`symbol`,limit:500})).map(e=>e.name)).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function u(e){return n().map(e=>e.key).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20)}function d(e){return t().map(e=>e.name).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20)}function f(t){return e().map(e=>e.label).filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20)}export{o as clearCompletionCache,f as completeCheckpointNames,s as completeCuratedPaths,c as completeFilePaths,u as completeStashKeys,l as completeSymbolNames,d as completeWorksetNames};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as express from "express";
|
|
2
|
+
|
|
3
|
+
//#region packages/server/src/dashboard-static.d.ts
|
|
4
|
+
type DashboardApp = {
|
|
5
|
+
get: (path: string, handler: (req: express.Request, res: express.Response) => void) => void;
|
|
6
|
+
};
|
|
7
|
+
type DashboardLogger = {
|
|
8
|
+
info: (message: string, meta?: Record<string, unknown>) => void;
|
|
9
|
+
};
|
|
10
|
+
type DashboardRequestResolution = {
|
|
11
|
+
kind: 'file';
|
|
12
|
+
path: string;
|
|
13
|
+
contentType: string;
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'spa';
|
|
16
|
+
path: string;
|
|
17
|
+
contentType: 'text/html';
|
|
18
|
+
} | {
|
|
19
|
+
kind: 'forbidden';
|
|
20
|
+
} | {
|
|
21
|
+
kind: 'not-found';
|
|
22
|
+
};
|
|
23
|
+
declare function resolveDashboardDir(baseDir?: string): string;
|
|
24
|
+
declare function resolveDashboardRequest(dashboardDir: string, requestPath: string): DashboardRequestResolution;
|
|
25
|
+
declare function registerDashboardRoutes(app: DashboardApp, dashboardDir: string, logger: DashboardLogger): boolean;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { DashboardRequestResolution, registerDashboardRoutes, resolveDashboardDir, resolveDashboardRequest };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createReadStream as e,existsSync as t,statSync as n}from"node:fs";import{dirname as r,extname as i,join as a,resolve as o,sep as s}from"node:path";import{fileURLToPath as c}from"node:url";const l=import.meta.dirname??r(c(import.meta.url)),u={".html":`text/html`,".js":`application/javascript`,".css":`text/css`,".json":`application/json`,".png":`image/png`,".svg":`image/svg+xml`,".ico":`image/x-icon`,".woff":`font/woff`,".woff2":`font/woff2`};function d(e=l){return a(e,`..`,`..`,`dashboard`,`dist`)}function f(e,r){let c=r.replace(/^\/_dashboard\/?/,``)||`index.html`;try{c=decodeURIComponent(c)}catch{}let l=o(e,c);if(!(l===e||l.startsWith(`${e}${s}`)))return{kind:`forbidden`};try{if(n(l).isFile())return{kind:`file`,path:l,contentType:u[i(l)]??`application/octet-stream`}}catch{}let d=a(e,`index.html`);return t(d)?{kind:`spa`,path:d,contentType:`text/html`}:{kind:`not-found`}}function p(n,r,i){return t(r)?(n.get(`/_dashboard{/*path}`,(t,n)=>{let i=f(r,t.path);if(i.kind===`forbidden`){n.status(403).end(`Forbidden`);return}if(i.kind===`not-found`){n.status(404).end(`Not found`);return}n.setHeader(`Content-Type`,i.contentType),i.kind===`file`&&/\.[a-f0-9]{8,}\.(js|css)$/i.test(i.path)?n.setHeader(`Cache-Control`,`public, max-age=31536000, immutable`):n.setHeader(`Cache-Control`,`no-cache`),e(i.path).pipe(n)}),i.info(`Dashboard available`,{url:`/_dashboard/`,dir:r}),!0):!1}export{p as registerDashboardRoutes,d as resolveDashboardDir,f as resolveDashboardRequest};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { Elicitor } from "@kb/elicitation";
|
|
3
|
+
|
|
4
|
+
//#region packages/server/src/elicitor.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Create an Elicitor backed by the MCP server's elicitInput capability.
|
|
7
|
+
*
|
|
8
|
+
* All methods degrade gracefully: if the client does not support elicitation,
|
|
9
|
+
* they return decline / false / null / [] defaults without throwing.
|
|
10
|
+
*/
|
|
11
|
+
declare function createElicitor(mcpServer: McpServer): Elicitor;
|
|
12
|
+
/**
|
|
13
|
+
* No-op Elicitor — always returns decline / false / null / [].
|
|
14
|
+
* Used when no MCP server is available.
|
|
15
|
+
*/
|
|
16
|
+
declare const noopElicitor: Elicitor;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { createElicitor, noopElicitor };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{buildFormSchema as e,field as t,normalizeResponse as n}from"../../elicitation/dist/index.js";function r(r){function i(){return!!r.server?.getClientCapabilities?.()?.elicitation}async function a(e,t){if(i())try{let i=await r.server.elicitInput({message:e,requestedSchema:t});return n(i?{action:i.action,content:i.content}:void 0)}catch{return}}return{get available(){return i()},async ask(e){return await a(e.message,e.schema)||{action:`decline`}},async confirm(n){let r=await a(n,e({confirmed:t.confirm(n)}));return r?.action===`accept`&&r.content?.confirmed===!0},async selectOne(n,r){let i=await a(n,e({selection:t.select(`Choose one`,r)}));if(i?.action!==`accept`)return null;let o=i.content?.selection;return typeof o==`string`?o:null},async selectMany(n,r){let i=await a(n,e({selections:t.multi(`Choose one or more`,r)}));if(i?.action!==`accept`)return[];let o=i.content?.selections;return Array.isArray(o)?o:[]},async promptText(n,r){let i=await a(n,e({text:t.text(n,{description:r})}));if(i?.action!==`accept`)return null;let o=i.content?.text;return typeof o==`string`?o:null}}}const i={available:!1,async ask(){return{action:`decline`}},async confirm(){return!1},async selectOne(){return null},async selectMany(){return[]},async promptText(){return null}};export{r as createElicitor,i as noopElicitor};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
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 +1 @@
|
|
|
1
|
-
import{addLogListener as e}from"../../core/dist/index.js";const t={debug:`debug`,info:`info`,warn:`warning`,error:`error`};function n(n){return e(({level:e,component:r,message:i,data:a})=>{try{n.sendLoggingMessage({level:t[e],logger:r,data:a?{message:i,...a}:i})}catch{}})}export{n as bridgeMcpLogging};
|
|
1
|
+
import{addLogListener as e}from"../../core/dist/index.js";const t={debug:`debug`,info:`info`,warn:`warning`,error:`error`};function n(n){return e(({level:e,component:r,message:i,data:a})=>{try{Promise.resolve(n.sendLoggingMessage({level:t[e],logger:r,data:a?{message:i,...a}:i})).catch(()=>{})}catch{}})}export{n as bridgeMcpLogging};
|
|
@@ -116,5 +116,122 @@ declare const SymbolOutputSchema: z.ZodObject<{
|
|
|
116
116
|
siblingSymbols: z.ZodArray<z.ZodString>;
|
|
117
117
|
}, z.core.$strip>>;
|
|
118
118
|
}, z.core.$strip>;
|
|
119
|
+
declare const SearchOutputSchema: z.ZodObject<{
|
|
120
|
+
results: z.ZodArray<z.ZodObject<{
|
|
121
|
+
sourcePath: z.ZodString;
|
|
122
|
+
contentType: z.ZodString;
|
|
123
|
+
score: z.ZodNumber;
|
|
124
|
+
headingPath: z.ZodOptional<z.ZodString>;
|
|
125
|
+
startLine: z.ZodOptional<z.ZodNumber>;
|
|
126
|
+
endLine: z.ZodOptional<z.ZodNumber>;
|
|
127
|
+
origin: z.ZodOptional<z.ZodString>;
|
|
128
|
+
category: z.ZodOptional<z.ZodString>;
|
|
129
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
130
|
+
}, z.core.$strip>>;
|
|
131
|
+
totalResults: z.ZodNumber;
|
|
132
|
+
searchMode: z.ZodString;
|
|
133
|
+
query: z.ZodString;
|
|
134
|
+
}, z.core.$strip>;
|
|
135
|
+
declare const FindOutputSchema: z.ZodObject<{
|
|
136
|
+
matches: z.ZodArray<z.ZodObject<{
|
|
137
|
+
path: z.ZodString;
|
|
138
|
+
line: z.ZodOptional<z.ZodNumber>;
|
|
139
|
+
matchType: z.ZodString;
|
|
140
|
+
preview: z.ZodString;
|
|
141
|
+
}, z.core.$strip>>;
|
|
142
|
+
totalMatches: z.ZodNumber;
|
|
143
|
+
pattern: z.ZodString;
|
|
144
|
+
truncated: z.ZodBoolean;
|
|
145
|
+
}, z.core.$strip>;
|
|
146
|
+
declare const ScopeMapOutputSchema: z.ZodObject<{
|
|
147
|
+
files: z.ZodArray<z.ZodObject<{
|
|
148
|
+
path: z.ZodString;
|
|
149
|
+
relevance: z.ZodNumber;
|
|
150
|
+
estimatedTokens: z.ZodNumber;
|
|
151
|
+
focusLines: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
152
|
+
}, z.core.$strip>>;
|
|
153
|
+
totalFiles: z.ZodNumber;
|
|
154
|
+
totalEstimatedTokens: z.ZodNumber;
|
|
155
|
+
task: z.ZodString;
|
|
156
|
+
}, z.core.$strip>;
|
|
157
|
+
declare const BlastRadiusOutputSchema: z.ZodObject<{
|
|
158
|
+
changedFiles: z.ZodArray<z.ZodString>;
|
|
159
|
+
affectedFiles: z.ZodArray<z.ZodObject<{
|
|
160
|
+
path: z.ZodString;
|
|
161
|
+
impact: z.ZodString;
|
|
162
|
+
reason: z.ZodString;
|
|
163
|
+
}, z.core.$strip>>;
|
|
164
|
+
totalAffected: z.ZodNumber;
|
|
165
|
+
riskLevel: z.ZodString;
|
|
166
|
+
}, z.core.$strip>;
|
|
167
|
+
declare const AuditOutputSchema: z.ZodObject<{
|
|
168
|
+
passed: z.ZodBoolean;
|
|
169
|
+
score: z.ZodNumber;
|
|
170
|
+
checks: z.ZodArray<z.ZodObject<{
|
|
171
|
+
name: z.ZodString;
|
|
172
|
+
passed: z.ZodBoolean;
|
|
173
|
+
message: z.ZodOptional<z.ZodString>;
|
|
174
|
+
severity: z.ZodOptional<z.ZodString>;
|
|
175
|
+
}, z.core.$strip>>;
|
|
176
|
+
summary: z.ZodString;
|
|
177
|
+
}, z.core.$strip>;
|
|
178
|
+
declare const GraphOutputSchema: z.ZodObject<{
|
|
179
|
+
nodes: z.ZodArray<z.ZodObject<{
|
|
180
|
+
id: z.ZodString;
|
|
181
|
+
name: z.ZodString;
|
|
182
|
+
type: z.ZodString;
|
|
183
|
+
sourcePath: z.ZodOptional<z.ZodString>;
|
|
184
|
+
}, z.core.$strip>>;
|
|
185
|
+
edges: z.ZodArray<z.ZodObject<{
|
|
186
|
+
fromId: z.ZodString;
|
|
187
|
+
toId: z.ZodString;
|
|
188
|
+
type: z.ZodString;
|
|
189
|
+
}, z.core.$strip>>;
|
|
190
|
+
totalNodes: z.ZodNumber;
|
|
191
|
+
totalEdges: z.ZodNumber;
|
|
192
|
+
query: z.ZodString;
|
|
193
|
+
}, z.core.$strip>;
|
|
194
|
+
declare const DeadSymbolsOutputSchema: z.ZodObject<{
|
|
195
|
+
symbols: z.ZodArray<z.ZodObject<{
|
|
196
|
+
name: z.ZodString;
|
|
197
|
+
path: z.ZodString;
|
|
198
|
+
line: z.ZodOptional<z.ZodNumber>;
|
|
199
|
+
kind: z.ZodString;
|
|
200
|
+
}, z.core.$strip>>;
|
|
201
|
+
totalDead: z.ZodNumber;
|
|
202
|
+
}, z.core.$strip>;
|
|
203
|
+
declare const AnalyzeStructureOutputSchema: z.ZodObject<{
|
|
204
|
+
files: z.ZodNumber;
|
|
205
|
+
packages: z.ZodNumber;
|
|
206
|
+
languages: z.ZodRecord<z.ZodString, z.ZodNumber>;
|
|
207
|
+
tree: z.ZodString;
|
|
208
|
+
}, z.core.$strip>;
|
|
209
|
+
declare const FileSummaryOutputSchema: z.ZodObject<{
|
|
210
|
+
path: z.ZodString;
|
|
211
|
+
language: z.ZodString;
|
|
212
|
+
lines: z.ZodNumber;
|
|
213
|
+
imports: z.ZodNumber;
|
|
214
|
+
exports: z.ZodNumber;
|
|
215
|
+
functions: z.ZodNumber;
|
|
216
|
+
classes: z.ZodNumber;
|
|
217
|
+
}, z.core.$strip>;
|
|
218
|
+
declare const GitContextOutputSchema: z.ZodObject<{
|
|
219
|
+
gitRoot: z.ZodString;
|
|
220
|
+
branch: z.ZodString;
|
|
221
|
+
commitCount: z.ZodNumber;
|
|
222
|
+
hasUncommitted: z.ZodBoolean;
|
|
223
|
+
recentCommits: z.ZodArray<z.ZodObject<{
|
|
224
|
+
hash: z.ZodString;
|
|
225
|
+
message: z.ZodString;
|
|
226
|
+
author: z.ZodString;
|
|
227
|
+
}, z.core.$strip>>;
|
|
228
|
+
}, z.core.$strip>;
|
|
229
|
+
declare const CompactOutputSchema: z.ZodObject<{
|
|
230
|
+
originalChars: z.ZodNumber;
|
|
231
|
+
compressedChars: z.ZodNumber;
|
|
232
|
+
ratio: z.ZodNumber;
|
|
233
|
+
segmentsKept: z.ZodNumber;
|
|
234
|
+
segmentsTotal: z.ZodNumber;
|
|
235
|
+
}, z.core.$strip>;
|
|
119
236
|
//#endregion
|
|
120
|
-
export { CheckOutputSchema, EnvOutputSchema, HealthOutputSchema, ListOutputSchema, MeasureOutputSchema, StatusOutputSchema, SymbolOutputSchema, TimeOutputSchema };
|
|
237
|
+
export { AnalyzeStructureOutputSchema, AuditOutputSchema, BlastRadiusOutputSchema, CheckOutputSchema, CompactOutputSchema, DeadSymbolsOutputSchema, EnvOutputSchema, FileSummaryOutputSchema, FindOutputSchema, GitContextOutputSchema, GraphOutputSchema, HealthOutputSchema, ListOutputSchema, MeasureOutputSchema, ScopeMapOutputSchema, SearchOutputSchema, StatusOutputSchema, SymbolOutputSchema, TimeOutputSchema };
|
|
@@ -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()});export{c as CheckOutputSchema,a as EnvOutputSchema,r as HealthOutputSchema,n as ListOutputSchema,i as MeasureOutputSchema,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(),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,6 +1,13 @@
|
|
|
1
|
+
import { CuratedKnowledgeManager } from "./curated-manager.js";
|
|
1
2
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { IGraphStore, IKnowledgeStore } from "@kb/store";
|
|
2
4
|
|
|
3
5
|
//#region packages/server/src/prompts.d.ts
|
|
4
|
-
|
|
6
|
+
interface PromptDependencies {
|
|
7
|
+
curated: CuratedKnowledgeManager;
|
|
8
|
+
store: IKnowledgeStore;
|
|
9
|
+
graphStore: IGraphStore;
|
|
10
|
+
}
|
|
11
|
+
declare function registerPrompts(server: McpServer, deps?: PromptDependencies): void;
|
|
5
12
|
//#endregion
|
|
6
|
-
export { registerPrompts };
|
|
13
|
+
export { PromptDependencies, registerPrompts };
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`)}}]})),
|
|
3
|
-
`)}}]})),
|
|
4
|
-
`)}}]})),
|
|
5
|
-
`)}}]})),
|
|
6
|
-
`)}}]})),
|
|
7
|
-
`)}}]}))}
|
|
1
|
+
import{completeCheckpointNames as e,completeCuratedPaths as t,completeFilePaths as n,completeStashKeys as r,completeSymbolNames as i,completeWorksetNames as a}from"./completions.js";import{completable as o}from"@modelcontextprotocol/sdk/server/completable.js";import{z as s}from"zod";function c(c,l){if(c.registerPrompt(`ready`,{title:`KB Ready`,description:`Knowledge base is ready — quick-start guide for search, onboard, and workflows`},async()=>({messages:[{role:`user`,content:{type:`text`,text:[`Knowledge base is ready. Quick start:`,``,'• **New project?** → `onboard({ path: "." })` for full codebase analysis','• **Returning?** → `status({})` then `search({ query: "SESSION CHECKPOINT", origin: "curated" })`','• **Exploring?** → `guide({ goal: "your task" })` for workflow recommendations','• **Quick lookup?** → `search({ query: "your question" })`'].join(`
|
|
2
|
+
`)}}]})),c.registerPrompt(`onboard`,{title:`Onboard Codebase`,description:`Analyze the codebase for first-time onboarding — runs all analyzers and produces a knowledge summary`,argsSchema:{path:s.string().optional().describe(`Path to analyze (default: workspace root)`)}},async({path:e})=>({messages:[{role:`user`,content:{type:`text`,text:[`Run the full onboarding workflow for "${e??`.`}"`,``,`1. \`onboard({ path: "${e??`.`}" })\` — full codebase analysis`,`2. \`produce_knowledge({ path: "${e??`.`}" })\` — generate synthesis`,"3. `remember` key findings as curated entries","4. `status` to verify index health"].join(`
|
|
3
|
+
`)}}]})),c.registerPrompt(`sessionStart`,{title:`Start KB Session`,description:`Initialize a KB session — check status, list knowledge, and resume from last checkpoint`},async()=>({messages:[{role:`user`,content:{type:`text`,text:[`Run the session start protocol:`,``,"1. `status({})` — check KB health and onboard state","2. `list()` — see stored knowledge entries",'3. `search({ query: "SESSION CHECKPOINT", origin: "curated" })` — resume prior work'].join(`
|
|
4
|
+
`)}}]})),c.registerPrompt(`sessionEnd`,{title:`End KB Session`,description:`Persist decisions and create a session checkpoint before ending`,argsSchema:{summary:s.string().describe(`Brief summary of decisions made, blockers encountered, and next steps`)}},async({summary:e})=>({messages:[{role:`user`,content:{type:`text`,text:[`Run the session end protocol:`,``,'1. `remember({ title: "Session checkpoint: '+e.slice(0,60)+`...", content: "`+e.replace(/"/g,`\\"`)+'", category: "conventions" })` — persist findings',"2. `reindex({})` — refresh search index if files changed",`3. Confirm session data saved`].join(`
|
|
5
|
+
`)}}]})),c.registerPrompt(`search`,{title:`Search Knowledge Base`,description:`Search the knowledge base with hybrid semantic + keyword search`,argsSchema:{query:s.string().describe(`Search query`)}},async({query:e})=>({messages:[{role:`user`,content:{type:`text`,text:`Search the knowledge base for: "${e}"\n\nUse \`search({ query: "${e.replace(/"/g,`\\"`)}" })\` to find relevant code, documentation, and curated knowledge.`}}]})),c.registerPrompt(`remember`,{title:`Remember Knowledge`,description:`Store a decision, convention, or finding as curated knowledge`,argsSchema:{title:s.string().describe(`Title of the knowledge entry`),content:s.string().describe(`Content to remember`),category:s.enum([`conventions`,`decisions`,`patterns`,`blockers`,`tasks`]).optional().describe(`Category (default: conventions)`)}},async({title:e,content:t,category:n})=>({messages:[{role:`user`,content:{type:`text`,text:`Store this knowledge:\n\n\`remember({ title: "${e.replace(/"/g,`\\"`)}", content: "${t.replace(/"/g,`\\"`).slice(0,200)}...", category: "${n??`conventions`}" })\``}}]})),c.registerPrompt(`planTask`,{title:`Plan a Task`,description:`Generate a reading plan and scope map for a development task`,argsSchema:{task:s.string().describe(`Description of the task to plan`)}},async({task:e})=>({messages:[{role:`user`,content:{type:`text`,text:[`Plan implementation for: "${e}"`,``,'1. `search({ query: "'+e.replace(/"/g,`\\"`)+'" })` — find related code and prior decisions','2. `scope_map({ task: "'+e.replace(/"/g,`\\"`)+'" })` — generate a reading plan',"3. For each recommended file, use `file_summary` then `compact` for detail","4. `blast_radius` on planned changes to assess impact"].join(`
|
|
6
|
+
`)}}]})),c.registerPrompt(`investigate`,{title:`Investigate Bug`,description:`Bug investigation workflow — parse error, find symbols, trace data flow, assess impact`,argsSchema:{error:s.string().describe(`Error message, stack trace, or bug description`)}},async({error:e})=>({messages:[{role:`user`,content:{type:`text`,text:[`Investigate this error:`,"```",e,"```",``,`Follow the bug investigation workflow:`,"1. `parse_output({ text: <error> })` — extract structured data from the error","2. `symbol({ name: <relevant symbol> })` — find definition and references",'3. `trace({ symbol: <symbol>, direction: "backward" })` — trace data flow to find root cause',"4. `blast_radius({ changed_files: [<affected files>] })` — assess fix impact"].join(`
|
|
7
|
+
`)}}]})),!l)return;let{curated:u,store:d,graphStore:f}=l;c.registerPrompt(`read_knowledge`,{title:`Read Knowledge`,description:`Read a curated knowledge entry by path — with autocomplete`,argsSchema:{path:o(s.string().describe(`Path of the curated entry (e.g. conventions/naming.md)`),async e=>t(u,e))}},async({path:e})=>({messages:[{role:`user`,content:{type:`text`,text:`Read the curated knowledge entry: \`read({ path: "${e}" })\``}}]})),c.registerPrompt(`update_knowledge`,{title:`Update Knowledge`,description:`Update an existing curated knowledge entry — with autocomplete`,argsSchema:{path:o(s.string().describe(`Path of the curated entry to update`),async e=>t(u,e)),content:s.string().describe(`New content for the entry`)}},async({path:e,content:t})=>({messages:[{role:`user`,content:{type:`text`,text:`Update the curated entry at "${e}":\n\n\`update({ path: "${e}", content: "${t.replace(/"/g,`\\"`).slice(0,200)}..." })\``}}]})),c.registerPrompt(`forget_knowledge`,{title:`Forget Knowledge`,description:`Delete a curated knowledge entry — with autocomplete`,argsSchema:{path:o(s.string().describe(`Path of the curated entry to delete`),async e=>t(u,e))}},async({path:e})=>({messages:[{role:`user`,content:{type:`text`,text:`Delete the curated entry: \`forget({ path: "${e}" })\``}}]})),c.registerPrompt(`lookup_file`,{title:`Lookup File`,description:`Look up an indexed file — with autocomplete`,argsSchema:{path:o(s.string().describe(`Source file path`),async e=>n(d,e))}},async({path:e})=>({messages:[{role:`user`,content:{type:`text`,text:`Look up the indexed file: \`file_summary({ path: "${e}" })\``}}]})),c.registerPrompt(`find_symbol`,{title:`Find Symbol`,description:`Find a symbol definition and references — with autocomplete`,argsSchema:{name:o(s.string().describe(`Symbol name`),async e=>i(f,e))}},async({name:e})=>({messages:[{role:`user`,content:{type:`text`,text:`Find symbol: \`symbol({ name: "${e}" })\``}}]})),c.registerPrompt(`get_stash`,{title:`Get Stash`,description:`Retrieve a stashed value by key — with autocomplete`,argsSchema:{key:o(s.string().describe(`Stash key`),e=>r(e))}},async({key:e})=>({messages:[{role:`user`,content:{type:`text`,text:`Get stashed value: \`stash({ action: "get", key: "${e}" })\``}}]})),c.registerPrompt(`get_workset`,{title:`Get Workset`,description:`Load a saved workset by name — with autocomplete`,argsSchema:{name:o(s.string().describe(`Workset name`),e=>a(e))}},async({name:e})=>({messages:[{role:`user`,content:{type:`text`,text:`Load workset: \`workset({ action: "load", name: "${e}" })\``}}]})),c.registerPrompt(`load_checkpoint`,{title:`Load Checkpoint`,description:`Restore a saved checkpoint by name — with autocomplete`,argsSchema:{name:o(s.string().describe(`Checkpoint name`),t=>e(t))}},async({name:e})=>({messages:[{role:`user`,content:{type:`text`,text:`Load checkpoint: \`checkpoint({ action: "load", name: "${e}" })\``}}]})),c.registerPrompt(`audit_workflow`,{title:`Audit Workflow`,description:`Run a full project quality audit: check → test_run → audit → produce recommendations`},async()=>({messages:[{role:`user`,content:{type:`text`,text:[`## Audit Workflow`,``,`Execute the following tools in sequence:`,``,"1. `check({})` — Run typecheck + lint","2. `test_run({})` — Run all tests","3. `audit({})` — Full project audit","4. Review findings and `remember` important patterns",``,`Report: pass/fail status, error counts, audit recommendations, and suggested next steps.`].join(`
|
|
8
|
+
`)}}]})),c.registerPrompt(`refactor_workflow`,{title:`Refactor Workflow`,description:`Safe refactoring workflow: analyze → blast_radius → implement → verify`},async()=>({messages:[{role:`user`,content:{type:`text`,text:[`## Refactor Workflow`,``,`For the target files/symbols:`,``,"1. `analyze_structure({ path })` — Understand current structure","2. `analyze_dependencies({ path })` — Map dependency graph","3. `blast_radius({ changed_files })` — Assess impact scope",`4. Implement changes carefully`,"5. `check({})` + `test_run({})` — Verify nothing broke","6. `reindex({})` — Update KB with changes",``,`What would you like to refactor?`].join(`
|
|
9
|
+
`)}}]})),c.registerPrompt(`forge_workflow`,{title:`FORGE Workflow`,description:`Full FORGE protocol: classify → ground → implement with quality gates`},async()=>({messages:[{role:`user`,content:{type:`text`,text:[`## FORGE Quality Gate Workflow`,``,"1. `forge_classify({ task })` — Determine complexity tier (floor/standard/critical)","2. `forge_ground({ task, files, root_path })` — Full grounding analysis",`3. Review typed unknowns and constraints`,`4. Implement with evidence tracking`,'5. `evidence_map({ action: "validate" })` — Verify all claims',"6. `check({})` + `test_run({})` — Final verification",``,`Describe the task to classify:`].join(`
|
|
10
|
+
`)}}]})),c.registerPrompt(`investigate_workflow`,{title:`Investigate Issue`,description:`Bug investigation workflow: trace → analyze → find root cause → fix`},async()=>({messages:[{role:`user`,content:{type:`text`,text:[`## Bug Investigation Workflow`,``,"1. `parse_output({ output })` — Parse error messages if available","2. `symbol({ name })` — Find the failing symbol",'3. `trace({ symbol, direction: "backward" })` — Trace data flow to root cause',"4. `blast_radius({ changed_files })` — Assess impact of fix",`5. Implement fix`,"6. `check({})` + `test_run({})` — Verify fix works",``,`Describe the issue:`].join(`
|
|
11
|
+
`)}}]})),c.registerPrompt(`context_workflow`,{title:`Build Context`,description:`Progressive context building: file_summary → compact → digest for deep understanding`},async()=>({messages:[{role:`user`,content:{type:`text`,text:[`## Context Building Workflow`,``,`Build understanding progressively:`,``,"1. `file_summary({ path })` — Structure overview (~50 tokens)","2. `compact({ path, query })` — Extract relevant sections (5-20x reduction)","3. `digest({ sources })` — Multi-file compressed summary","4. `stratum_card({ files })` — Reusable reference card",``,`For project-wide context:`,"- `scope_map({ task })` — Reading plan for a specific task",'- `workset({ action: "save" })` — Save working set for later',``,`What do you need to understand?`].join(`
|
|
12
|
+
`)}}]})),c.registerPrompt(`migrate_workflow`,{title:`Migration Workflow`,description:`Code migration workflow: analyze → plan → migrate → verify → document`},async()=>({messages:[{role:`user`,content:{type:`text`,text:[`## Migration Workflow`,``,"1. `analyze_structure({ path })` — Current codebase state","2. `analyze_patterns({ path })` — Identify patterns to migrate","3. `dead_symbols({ path })` — Find unused code to remove",'4. `scope_map({ task: "migration" })` — Plan migration scope',"5. Use `codemod` for bulk transformations","6. `check({})` + `test_run({})` — Verify after each step","7. `changelog({ from })` — Document changes",``,`What are you migrating from/to?`].join(`
|
|
13
|
+
`)}}]}))}export{c as registerPrompts};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{ResourceTemplate as e}from"@modelcontextprotocol/sdk/server/mcp.js";function t(t,n){t.resource(`kb-curated-index`,`kb://curated`,{description:`Index of all curated knowledge entries`,mimeType:`text/markdown`},async()=>{let e=(await n.list()).map(e=>`- [${e.title}](kb://curated/${e.path}) — ${e.category}`);return{contents:[{uri:`kb://curated`,text:`# Curated Knowledge Index\n\n${e.length>0?e.join(`
|
|
2
|
-
`):`_No curated entries yet._`}`,mimeType:`text/markdown`}]}});let r=new e(`kb://curated/{path}`,{list:async()=>({resources:(await n.list()).map(e=>({uri:`kb://curated/${e.path}`,name:e.title,description:`[${e.category}] ${e.contentPreview?.slice(0,80)??``}`,mimeType:`text/markdown`}))})});t.resource(`kb-curated-entry`,r,{description:`A curated knowledge entry`,mimeType:`text/markdown`},async(e,t)=>{let r=t.path;if(!r)throw Error(`Missing path variable in curated resource URI`);let i=await n.read(r);return{contents:[{uri:e.toString(),text:`---\ntitle: ${i.title}\ncategory: ${i.category}\ntags: ${i.tags?.join(`, `)??``}\nversion: ${i.version??1}\n---\n\n${i.content??i.contentPreview??``}`,mimeType:`text/markdown`}]}})}export{t as registerCuratedResources};
|
|
2
|
+
`):`_No curated entries yet._`}`,mimeType:`text/markdown`}]}});let r=new e(`kb://curated/{+path}`,{list:async()=>({resources:(await n.list()).map(e=>({uri:`kb://curated/${e.path}`,name:e.title,description:`[${e.category}] ${e.contentPreview?.slice(0,80)??``}`,mimeType:`text/markdown`}))})});t.resource(`kb-curated-entry`,r,{description:`A curated knowledge entry`,mimeType:`text/markdown`},async(e,t)=>{let r=t.path;if(!r)throw Error(`Missing path variable in curated resource URI`);let i=await n.read(r);return{contents:[{uri:e.toString(),text:`---\ntitle: ${i.title}\ncategory: ${i.category}\ntags: ${i.tags?.join(`, `)??``}\nversion: ${i.version??1}\n---\n\n${i.content??i.contentPreview??``}`,mimeType:`text/markdown`}]}})}export{t as registerCuratedResources};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
|
|
3
|
+
//#region packages/server/src/resources/resource-notifier.d.ts
|
|
4
|
+
declare class ResourceNotifier {
|
|
5
|
+
private readonly mcpServer;
|
|
6
|
+
constructor(mcpServer: McpServer);
|
|
7
|
+
/**
|
|
8
|
+
* Notify that the KB status resource has changed.
|
|
9
|
+
* Call after: reindex, onboard, remember, forget operations.
|
|
10
|
+
*/
|
|
11
|
+
notifyStatusChanged(): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Notify that the file tree resource has changed.
|
|
14
|
+
* Call after: reindex operations.
|
|
15
|
+
*/
|
|
16
|
+
notifyFileTreeChanged(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Notify that the curated knowledge index has changed.
|
|
19
|
+
* Call after: remember, update, forget operations.
|
|
20
|
+
*/
|
|
21
|
+
notifyCuratedIndexChanged(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Notify that a specific curated entry has changed.
|
|
24
|
+
* Call after: update or remember operations for a specific path.
|
|
25
|
+
*/
|
|
26
|
+
notifyCuratedEntryChanged(path: string): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Notify that the resource list itself changed (new/removed resources).
|
|
29
|
+
* Call after: curated entries are added or removed.
|
|
30
|
+
*/
|
|
31
|
+
notifyResourceListChanged(): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Convenience: notify all relevant resources after a reindex.
|
|
34
|
+
*/
|
|
35
|
+
notifyAfterReindex(): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Convenience: notify all relevant resources after a curated write.
|
|
38
|
+
*/
|
|
39
|
+
notifyAfterCuratedWrite(path?: string): Promise<void>;
|
|
40
|
+
private sendUpdate;
|
|
41
|
+
}
|
|
42
|
+
/** No-op resource notifier — all methods silently succeed. */
|
|
43
|
+
declare const noopResourceNotifier: ResourceNotifier;
|
|
44
|
+
//#endregion
|
|
45
|
+
export { ResourceNotifier, noopResourceNotifier };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createLogger as e}from"../../../core/dist/index.js";const t=e(`resource-notifier`);var n=class{constructor(e){this.mcpServer=e}async notifyStatusChanged(){await this.sendUpdate(`kb://status`)}async notifyFileTreeChanged(){await this.sendUpdate(`kb://file-tree`)}async notifyCuratedIndexChanged(){await this.sendUpdate(`kb://curated`)}async notifyCuratedEntryChanged(e){await this.sendUpdate(`kb://curated/${e}`)}async notifyResourceListChanged(){try{await this.mcpServer.server.sendResourceListChanged()}catch(e){t.debug(`sendResourceListChanged failed`,{error:String(e)})}}async notifyAfterReindex(){await Promise.allSettled([this.notifyStatusChanged(),this.notifyFileTreeChanged()])}async notifyAfterCuratedWrite(e){let t=[this.notifyStatusChanged(),this.notifyCuratedIndexChanged()];e&&t.push(this.notifyCuratedEntryChanged(e)),await Promise.allSettled(t)}async sendUpdate(e){try{await this.mcpServer.server.sendResourceUpdated({uri:e})}catch(n){t.debug(`sendResourceUpdated failed`,{uri:e,error:String(n)})}}};const r={notifyStatusChanged:async()=>{},notifyFileTreeChanged:async()=>{},notifyCuratedIndexChanged:async()=>{},notifyCuratedEntryChanged:async()=>{},notifyResourceListChanged:async()=>{},notifyAfterReindex:async()=>{},notifyAfterCuratedWrite:async()=>{}};export{n as ResourceNotifier,r as noopResourceNotifier};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
|
|
3
|
+
//#region packages/server/src/sampling.d.ts
|
|
4
|
+
interface SamplingRequest {
|
|
5
|
+
/** The user prompt to send. */
|
|
6
|
+
prompt: string;
|
|
7
|
+
/** Optional system prompt. */
|
|
8
|
+
systemPrompt?: string;
|
|
9
|
+
/** Optional context to prepend to the prompt. */
|
|
10
|
+
context?: string;
|
|
11
|
+
/** Max tokens in the response (default: 4000). */
|
|
12
|
+
maxTokens?: number;
|
|
13
|
+
/** Model preferences. */
|
|
14
|
+
modelPreferences?: {
|
|
15
|
+
costPriority?: number;
|
|
16
|
+
speedPriority?: number;
|
|
17
|
+
intelligencePriority?: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
interface SamplingResponse {
|
|
21
|
+
/** The model's text response. */
|
|
22
|
+
text: string;
|
|
23
|
+
/** Which model was used. */
|
|
24
|
+
model?: string;
|
|
25
|
+
/** Stop reason. */
|
|
26
|
+
stopReason?: string;
|
|
27
|
+
}
|
|
28
|
+
interface ISamplingClient {
|
|
29
|
+
/** Whether the sampling capability is available. */
|
|
30
|
+
readonly available: boolean;
|
|
31
|
+
/** Send a prompt to the host LLM. */
|
|
32
|
+
createMessage(request: SamplingRequest): Promise<SamplingResponse>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a sampling client backed by the MCP server.
|
|
36
|
+
*/
|
|
37
|
+
declare function createSamplingClient(mcpServer: McpServer): ISamplingClient;
|
|
38
|
+
/** No-op sampling client — always reports unavailable. */
|
|
39
|
+
declare const noopSamplingClient: ISamplingClient;
|
|
40
|
+
//#endregion
|
|
41
|
+
export { ISamplingClient, SamplingRequest, SamplingResponse, createSamplingClient, noopSamplingClient };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createLogger as e}from"../../core/dist/index.js";const t=e(`sampling`);function n(e){if(!e.modelPreferences)return;let t={...e.modelPreferences.costPriority===void 0?{}:{costPriority:e.modelPreferences.costPriority},...e.modelPreferences.speedPriority===void 0?{}:{speedPriority:e.modelPreferences.speedPriority},...e.modelPreferences.intelligencePriority===void 0?{}:{intelligencePriority:e.modelPreferences.intelligencePriority}};return Object.keys(t).length>0?t:void 0}function r(e){if(Array.isArray(e))return e.map(e=>r(e)).filter(e=>e.length>0).join(`
|
|
2
|
+
`);if(e&&typeof e==`object`&&`type`in e){let t=e;if(t.type===`text`&&typeof t.text==`string`)return t.text}return JSON.stringify(e)}function i(e){let i=e.server,a=typeof i?.createMessage==`function`;return{get available(){return a},async createMessage(e){if(!a)throw Error(`Sampling not available: client does not support createMessage`);let o=e.context?`${e.context}\n\n---\n\n${e.prompt}`:e.prompt;try{let t=await i.createMessage({messages:[{role:`user`,content:{type:`text`,text:o}}],systemPrompt:e.systemPrompt,modelPreferences:n(e),maxTokens:e.maxTokens??4e3});return{text:r(t.content),model:t.model,stopReason:t.stopReason}}catch(e){throw t.warn(`Sampling createMessage failed`,{error:String(e)}),e}}}}const a={available:!1,async createMessage(){throw Error(`Sampling not available`)}};export{i as createSamplingClient,a as noopSamplingClient};
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { CuratedKnowledgeManager } from "./curated-manager.js";
|
|
2
|
+
import { ResourceNotifier } from "./resources/resource-notifier.js";
|
|
3
|
+
import { ISamplingClient } from "./sampling.js";
|
|
2
4
|
import { BridgeComponents } from "./tools/bridge.tools.js";
|
|
3
5
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
6
|
import { KBConfig } from "@kb/core";
|
|
7
|
+
import { Elicitor } from "@kb/elicitation";
|
|
5
8
|
import { OnnxEmbedder } from "@kb/embeddings";
|
|
6
9
|
import { EvolutionCollector, PolicyStore } from "@kb/enterprise-bridge";
|
|
7
10
|
import { IncrementalIndexer } from "@kb/indexer";
|
|
@@ -24,7 +27,7 @@ interface KnowledgeBaseComponents {
|
|
|
24
27
|
}
|
|
25
28
|
declare function initializeKnowledgeBase(config: KBConfig): Promise<KnowledgeBaseComponents>;
|
|
26
29
|
declare function createMcpServer(kb: KnowledgeBaseComponents, config: KBConfig): McpServer;
|
|
27
|
-
declare function registerMcpTools(server: McpServer, kb: KnowledgeBaseComponents, config: KBConfig): void;
|
|
30
|
+
declare function registerMcpTools(server: McpServer, kb: KnowledgeBaseComponents, config: KBConfig, elicitor?: Elicitor, resourceNotifier?: ResourceNotifier, samplingClient?: ISamplingClient): void;
|
|
28
31
|
/**
|
|
29
32
|
* Create a fully-initialized server (HTTP mode or when immediate readiness is needed).
|
|
30
33
|
*/
|
|
@@ -33,7 +36,7 @@ declare function createServer(config: KBConfig): Promise<{
|
|
|
33
36
|
runInitialIndex: () => Promise<void>;
|
|
34
37
|
shutdown: () => Promise<void>;
|
|
35
38
|
}>;
|
|
36
|
-
declare const ALL_TOOL_NAMES: readonly ["analyze_dependencies", "analyze_diagram", "analyze_entry_points", "analyze_patterns", "analyze_structure", "analyze_symbols", "audit", "batch", "blast_radius", "changelog", "check", "checkpoint", "codemod", "compact", "data_transform", "dead_symbols", "delegate", "diff_parse", "digest", "encode", "env", "eval", "evidence_map", "file_summary", "find", "forge_classify", "forge_ground", "forget", "git_context", "graph", "guide", "health", "http", "lane", "list", "lookup", "measure", "onboard", "parse_output", "process", "produce_knowledge", "queue", "read", "regex_test", "reindex", "remember", "rename", "replay", "restore", "schema_validate", "scope_map", "search", "snippet", "stash", "status", "stratum_card", "symbol", "test_run", "time", "trace", "update", "watch", "web_fetch", "web_search", "workset"];
|
|
39
|
+
declare const ALL_TOOL_NAMES: readonly ["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"];
|
|
37
40
|
declare function createLazyServer(config: KBConfig): {
|
|
38
41
|
server: McpServer; /** Call after MCP roots are resolved (or fallback decided) to start heavy init. */
|
|
39
42
|
startInit: () => void;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{CuratedKnowledgeManager as e}from"./curated-manager.js";import{bridgeMcpLogging as t}from"./mcp-logging.js";import{registerPrompts as n}from"./prompts.js";import{installReplayInterceptor as r}from"./replay-interceptor.js";import{registerResources as i}from"./resources/resources.js";import{getToolMeta as a}from"./tool-metadata.js";import{registerAnalyzeDependenciesTool as o,registerAnalyzeDiagramTool as s,registerAnalyzeEntryPointsTool as c,registerAnalyzePatternsTool as l,registerAnalyzeStructureTool as u,registerAnalyzeSymbolsTool as d,registerBlastRadiusTool as f}from"./tools/analyze.tools.js";import{registerAuditTool as p}from"./tools/audit.tool.js";import{initBridgeComponents as m,registerErPullTool as h,registerErPushTool as g,registerErSyncStatusTool as ee}from"./tools/bridge.tools.js";import{registerCompactTool as te,registerDeadSymbolsTool as _,registerFileSummaryTool as v,registerFindTool as y,registerScopeMapTool as ne,registerSymbolTool as re,registerTraceTool as ie}from"./tools/context.tools.js";import{registerErEvolveReviewTool as ae}from"./tools/evolution.tools.js";import{registerBatchTool as oe,registerCheckTool as b,registerDelegateTool as x,registerEvalTool as S,registerParseOutputTool as C,registerTestRunTool as w}from"./tools/execution.tools.js";import{registerDigestTool as se,registerEvidenceMapTool as T,registerForgeClassifyTool as E,registerForgeGroundTool as ce,registerStratumCardTool as le}from"./tools/forge.tools.js";import{registerForgetTool as ue}from"./tools/forget.tool.js";import{registerGraphTool as de}from"./tools/graph.tool.js";import{registerGuideTool as D,registerHealthTool as O,registerProcessTool as k,registerWatchTool as A,registerWebFetchTool as j}from"./tools/infra.tools.js";import{registerListTool as fe}from"./tools/list.tool.js";import{registerLookupTool as pe}from"./tools/lookup.tool.js";import{registerCodemodTool as M,registerDataTransformTool as N,registerDiffParseTool as P,registerGitContextTool as F,registerRenameTool as I}from"./tools/manipulation.tools.js";import{registerOnboardTool as me}from"./tools/onboard.tool.js";import{registerCheckpointTool as L,registerLaneTool as R,registerQueueTool as he,registerStashTool as z,registerWorksetTool as B}from"./tools/persistence.tools.js";import{registerErUpdatePolicyTool as ge}from"./tools/policy.tools.js";import{registerProduceKnowledgeTool as V}from"./tools/produce.tool.js";import{registerReadTool as _e}from"./tools/read.tool.js";import{registerReindexTool as ve}from"./tools/reindex.tool.js";import{registerRememberTool as ye}from"./tools/remember.tool.js";import{registerReplayTool as H}from"./tools/replay.tool.js";import{registerRestoreTool as U}from"./tools/restore.tool.js";import{registerSearchTool as be}from"./tools/search.tool.js";import{registerStatusTool as xe}from"./tools/status.tool.js";import{registerUpdateTool as Se}from"./tools/update.tool.js";import{registerChangelogTool as W,registerEncodeTool as G,registerEnvTool as K,registerHttpTool as q,registerMeasureTool as Ce,registerRegexTestTool as we,registerSchemaValidateTool as Te,registerSnippetTool as Ee,registerTimeTool as De,registerWebSearchTool as Oe}from"./tools/utility.tools.js";import{getCurrentVersion as ke}from"./version-check.js";import{existsSync as Ae,statSync as je}from"node:fs";import{resolve as Me}from"node:path";import{KB_PATHS as Ne,createLogger as Pe,serializeError as J}from"../../core/dist/index.js";import{initializeWasm as Fe}from"../../chunker/dist/index.js";import{OnnxEmbedder as Ie}from"../../embeddings/dist/index.js";import{EvolutionCollector as Le,PolicyStore as Re}from"../../enterprise-bridge/dist/index.js";import{FileHashCache as ze,IncrementalIndexer as Be}from"../../indexer/dist/index.js";import{SqliteGraphStore as Ve,createStore as He}from"../../store/dist/index.js";import{FileCache as Ue}from"../../tools/dist/index.js";import{McpServer as We}from"@modelcontextprotocol/sdk/server/mcp.js";const Y=Pe(`server`);async function X(t){Y.info(`Initializing knowledge base components`);let[n,r,i,a]=await Promise.all([(async()=>{let e=new Ie({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 He({backend:t.store.backend,path:t.store.path});return await e.initialize(),Y.info(`Store initialized`),e})(),(async()=>{let e=new Ve({path:t.store.path});return await e.initialize(),Y.info(`Graph store initialized`),e})(),(async()=>{let e=await Fe();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 Be(n,r),s=new ze(t.store.path);s.load(),o.setHashCache(s);let c=t.curated.path,l=new e(c,r,n);o.setGraphStore(i);let u=m(t.er),d=u?new Re(t.curated.path):void 0;d&&Y.info(`Policy store initialized`,{ruleCount:d.getRules().length});let f=u?new Le:void 0,p=Me(t.sources[0]?.path??process.cwd(),Ne.aiKb),h=Ae(p),g;if(h)try{g=je(p).mtime.toISOString()}catch{}return Y.info(`Onboard state detected`,{onboardComplete:h,onboardTimestamp:g}),{embedder:n,store:r,indexer:o,curated:l,graphStore:i,fileCache:new Ue,bridge:u,policyStore:d,evolutionCollector:f,onboardComplete:h,onboardTimestamp:g}}function Ge(e,r){let i=new We({name:r.serverName??`knowledge-base`,version:ke()},{capabilities:{logging:{}}});return t(i),Z(i,e,r),n(i),i}function Z(e,t,n){r(e),be(e,t.embedder,t.store,t.graphStore,t.bridge,t.evolutionCollector),pe(e,t.store),xe(e,t.store,t.graphStore,t.curated,{onboardComplete:t.onboardComplete,onboardTimestamp:t.onboardTimestamp}),ve(e,t.indexer,n,t.curated,t.store),ye(e,t.curated,t.policyStore,t.evolutionCollector),Se(e,t.curated),ue(e,t.curated),_e(e,t.curated),fe(e,t.curated),u(e,t.store,t.embedder),o(e,t.store,t.embedder),d(e,t.store,t.embedder),l(e,t.store,t.embedder),c(e,t.store,t.embedder),s(e,t.store,t.embedder),f(e,t.store,t.embedder,t.graphStore),V(e),me(e,t.store,t.embedder),de(e,t.graphStore),p(e,t.store,t.embedder),te(e,t.embedder,t.fileCache),ne(e,t.embedder,t.store),y(e,t.embedder,t.store),C(e),B(e),b(e),oe(e,t.embedder,t.store),re(e,t.embedder,t.store,t.graphStore),S(e),w(e),z(e),F(e),P(e),I(e),M(e),U(e),v(e,t.fileCache),L(e),N(e),ie(e,t.embedder,t.store),k(e),A(e),_(e,t.embedder,t.store),x(e),O(e),R(e),he(e),j(e),D(e),T(e),se(e,t.embedder),E(e),le(e,t.embedder,t.fileCache),ce(e,t.embedder,t.store),Oe(e),q(e),we(e),G(e),Ce(e),W(e),Te(e),Ee(e),K(e),De(e),t.bridge&&(g(e,t.bridge,t.evolutionCollector),h(e,t.bridge),ee(e,t.bridge)),t.policyStore&&ge(e,t.policyStore),t.evolutionCollector&&ae(e,t.evolutionCollector),i(e,t.store,t.curated),H(e)}async function Ke(e){let t=await X(e),n=Ge(t,e);Y.info(`MCP server configured`,{toolCount:$.length,resourceCount:2});let r=async()=>{try{let n=e.sources.map(e=>e.path).join(`, `);Y.info(`Running initial index`,{sourcePaths:n});let r=await t.indexer.index(e,e=>{e.phase===`crawling`||e.phase===`done`||(e.phase===`chunking`&&e.currentFile&&Y.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&Y.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});Y.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await t.store.createFtsIndex()}catch(e){Y.warn(`FTS index creation failed`,J(e))}try{let e=await t.curated.reindexAll();Y.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){Y.error(`Curated re-index failed`,J(e))}}catch(e){Y.error(`Initial index failed; will retry on kb_reindex`,J(e))}},i=async()=>{Y.info(`Shutting down`),await t.embedder.shutdown().catch(()=>{}),await t.graphStore.close().catch(()=>{}),await t.store.close(),process.exit(0)};process.on(`SIGINT`,i),process.on(`SIGTERM`,i);let a=process.ppid,o=setInterval(()=>{try{process.kill(a,0)}catch{Y.info(`Parent process died; shutting down`,{parentPid:a}),clearInterval(o),i()}},5e3);return o.unref(),{server:n,runInitialIndex:r,shutdown:i}}const qe=new Set(`batch.changelog.check.checkpoint.codemod.compact.data_transform.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.forge_classify.git_context.graph.guide.health.http.lane.measure.onboard.parse_output.process.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(`.`)),Je=5e3,Q=new Set(`changelog.check.checkpoint.codemod.data_transform.delegate.diff_parse.encode.env.eval.evidence_map.forge_classify.git_context.guide.health.http.lane.measure.parse_output.process.produce_knowledge.queue.regex_test.rename.replay.restore.schema_validate.snippet.stash.test_run.time.watch.web_fetch.web_search.workset`.split(`.`));function Ye(e){b(e),S(e),w(e),C(e),x(e),F(e),P(e),I(e),M(e),N(e),B(e),z(e),L(e),U(e),R(e),he(e),O(e),k(e),A(e),j(e),D(e),T(e),E(e),V(e),H(e),Oe(e),q(e),we(e),G(e),Ce(e),W(e),Te(e),Ee(e),K(e),De(e)}const $=`analyze_dependencies.analyze_diagram.analyze_entry_points.analyze_patterns.analyze_structure.analyze_symbols.audit.batch.blast_radius.changelog.check.checkpoint.codemod.compact.data_transform.dead_symbols.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.find.forge_classify.forge_ground.forget.git_context.graph.guide.health.http.lane.list.lookup.measure.onboard.parse_output.process.produce_knowledge.queue.read.regex_test.reindex.remember.rename.replay.restore.schema_validate.scope_map.search.snippet.stash.status.stratum_card.symbol.test_run.time.trace.update.watch.web_fetch.web_search.workset`.split(`.`);function Xe(e){let r=new We({name:e.serverName??`knowledge-base`,version:ke()},{capabilities:{logging:{}}}),i=`initializing`,o=``,s=!1,c=()=>i===`failed`?[`❌ KB initialization failed — this tool is unavailable.`,``,o?`Error: ${o}`:``,``,`**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}from"./elicitor.js";import{bridgeMcpLogging as n}from"./mcp-logging.js";import{registerPrompts as r}from"./prompts.js";import{installReplayInterceptor as i}from"./replay-interceptor.js";import{ResourceNotifier as a}from"./resources/resource-notifier.js";import{registerResources as o}from"./resources/resources.js";import{createSamplingClient as s}from"./sampling.js";import{getToolMeta as c}from"./tool-metadata.js";import{installToolPrefix as l}from"./tool-prefix.js";import{registerAnalyzeDependenciesTool as u,registerAnalyzeDiagramTool as d,registerAnalyzeEntryPointsTool as f,registerAnalyzePatternsTool as p,registerAnalyzeStructureTool as m,registerAnalyzeSymbolsTool as h,registerBlastRadiusTool as ee}from"./tools/analyze.tools.js";import{registerAuditTool as g}from"./tools/audit.tool.js";import{registerBrainstormTool as _}from"./tools/brainstorm.tool.js";import{initBridgeComponents as v,registerErPullTool as te,registerErPushTool as y,registerErSyncStatusTool as b}from"./tools/bridge.tools.js";import{registerCompactTool as x,registerDeadSymbolsTool as S,registerFileSummaryTool as C,registerFindTool as ne,registerScopeMapTool as re,registerSymbolTool as ie,registerTraceTool as ae}from"./tools/context.tools.js";import{registerErEvolveReviewTool as oe}from"./tools/evolution.tools.js";import{registerBatchTool as se,registerCheckTool as w,registerDelegateTool as T,registerEvalTool as E,registerParseOutputTool as D,registerTestRunTool as O}from"./tools/execution.tools.js";import{registerDigestTool as ce,registerEvidenceMapTool as k,registerForgeClassifyTool as A,registerForgeGroundTool as le,registerStratumCardTool as ue}from"./tools/forge.tools.js";import{registerForgetTool as de}from"./tools/forget.tool.js";import{registerGraphTool as fe}from"./tools/graph.tool.js";import{registerGuideTool as j,registerHealthTool as M,registerProcessTool as N,registerWatchTool as P,registerWebFetchTool as F}from"./tools/infra.tools.js";import{registerListTool as pe}from"./tools/list.tool.js";import{registerLookupTool as me}from"./tools/lookup.tool.js";import{registerCodemodTool as I,registerDataTransformTool as L,registerDiffParseTool as R,registerGitContextTool as z,registerRenameTool as B}from"./tools/manipulation.tools.js";import{registerOnboardTool as he}from"./tools/onboard.tool.js";import{registerCheckpointTool as V,registerLaneTool as H,registerQueueTool as U,registerStashTool as W,registerWorksetTool as G}from"./tools/persistence.tools.js";import{registerErUpdatePolicyTool as ge}from"./tools/policy.tools.js";import{registerPresentTool as K}from"./tools/present.tool.js";import{registerProduceKnowledgeTool as q}from"./tools/produce.tool.js";import{registerReadTool as _e}from"./tools/read.tool.js";import{registerReindexTool as ve}from"./tools/reindex.tool.js";import{registerRememberTool as ye}from"./tools/remember.tool.js";import{registerReplayTool as be}from"./tools/replay.tool.js";import{registerRestoreTool as xe}from"./tools/restore.tool.js";import{registerSearchTool as Se}from"./tools/search.tool.js";import{registerStatusTool as Ce}from"./tools/status.tool.js";import{registerUpdateTool as we}from"./tools/update.tool.js";import{registerChangelogTool as Te,registerEncodeTool as Ee,registerEnvTool as De,registerHttpTool as Oe,registerMeasureTool as ke,registerRegexTestTool as Ae,registerSchemaValidateTool as je,registerSnippetTool as Me,registerTimeTool as Ne,registerWebSearchTool as Pe}from"./tools/utility.tools.js";import{getCurrentVersion as Fe}from"./version-check.js";import{existsSync as Ie,statSync as Le}from"node:fs";import{resolve as Re}from"node:path";import{KB_PATHS as ze,createLogger as Be,serializeError as J}from"../../core/dist/index.js";import{initializeWasm as Ve}from"../../chunker/dist/index.js";import{OnnxEmbedder as He}from"../../embeddings/dist/index.js";import{EvolutionCollector as Ue,PolicyStore as We}from"../../enterprise-bridge/dist/index.js";import{FileHashCache as Ge,IncrementalIndexer as Ke}from"../../indexer/dist/index.js";import{SqliteGraphStore as qe,createStore as Je}from"../../store/dist/index.js";import{FileCache as Ye}from"../../tools/dist/index.js";import{McpServer as Xe}from"@modelcontextprotocol/sdk/server/mcp.js";const Y=Be(`server`);async function X(t){Y.info(`Initializing knowledge base components`);let[n,r,i,a]=await Promise.all([(async()=>{let e=new He({model:t.embedding.model,dimensions:t.embedding.dimensions});return await e.initialize(),Y.info(`Embedder loaded`,{modelId:e.modelId,dimensions:e.dimensions}),e})(),(async()=>{let e=await Je({backend:t.store.backend,path:t.store.path});return await e.initialize(),Y.info(`Store initialized`),e})(),(async()=>{let e=new qe({path:t.store.path});return await e.initialize(),Y.info(`Graph store initialized`),e})(),(async()=>{let e=await Ve();return e?Y.info(`WASM tree-sitter enabled for AST analysis`):Y.warn(`WASM tree-sitter not available; analyzers will use regex fallback`),e})()]),o=new Ke(n,r),s=new Ge(t.store.path);s.load(),o.setHashCache(s);let c=t.curated.path,l=new e(c,r,n);o.setGraphStore(i);let u=v(t.er),d=u?new We(t.curated.path):void 0;d&&Y.info(`Policy store initialized`,{ruleCount:d.getRules().length});let f=u?new Ue:void 0,p=Re(t.sources[0]?.path??process.cwd(),ze.aiKb),m=Ie(p),h;if(m)try{h=Le(p).mtime.toISOString()}catch{}return Y.info(`Onboard state detected`,{onboardComplete:m,onboardTimestamp:h}),{embedder:n,store:r,indexer:o,curated:l,graphStore:i,fileCache:new Ye,bridge:u,policyStore:d,evolutionCollector:f,onboardComplete:m,onboardTimestamp:h}}function Ze(e,i){let o=new Xe({name:i.serverName??`knowledge-base`,version:Fe()},{capabilities:{logging:{}}});return n(o),l(o,i.toolPrefix??``),Z(o,e,i,t(o),new a(o),s(o)),r(o,{curated:e.curated,store:e.store,graphStore:e.graphStore}),o}function Z(e,t,n,r,a,s){i(e),Se(e,t.embedder,t.store,t.graphStore,t.bridge,t.evolutionCollector,s),me(e,t.store),Ce(e,t.store,t.graphStore,t.curated,{onboardComplete:t.onboardComplete,onboardTimestamp:t.onboardTimestamp}),ve(e,t.indexer,n,t.curated,t.store,a),ye(e,t.curated,t.policyStore,t.evolutionCollector,a),we(e,t.curated,a),de(e,t.curated,a),_e(e,t.curated),pe(e,t.curated),m(e,t.store,t.embedder),u(e,t.store,t.embedder),h(e,t.store,t.embedder),p(e,t.store,t.embedder),f(e,t.store,t.embedder),d(e,t.store,t.embedder),ee(e,t.store,t.embedder,t.graphStore),q(e),he(e,t.store,t.embedder),fe(e,t.graphStore),g(e,t.store,t.embedder),x(e,t.embedder,t.fileCache),re(e,t.embedder,t.store),ne(e,t.embedder,t.store),D(e),G(e),w(e),se(e,t.embedder,t.store),ie(e,t.embedder,t.store,t.graphStore),E(e),O(e),W(e),z(e),R(e),B(e),I(e),xe(e),C(e,t.fileCache),V(e),L(e),ae(e,t.embedder,t.store),N(e),P(e),S(e,t.embedder,t.store),T(e,s),M(e),H(e),U(e),F(e),j(e),k(e),ce(e,t.embedder),A(e),ue(e,t.embedder,t.fileCache),le(e,t.embedder,t.store),K(e,r),r&&_(e,r),Pe(e),Oe(e),Ae(e),Ee(e),ke(e),Te(e),je(e),Me(e),De(e),Ne(e),t.bridge&&(y(e,t.bridge,t.evolutionCollector),te(e,t.bridge),b(e,t.bridge)),t.policyStore&&ge(e,t.policyStore),t.evolutionCollector&&oe(e,t.evolutionCollector),o(e,t.store,t.curated),be(e)}async function Qe(e){let t=await X(e),n=Ze(t,e);Y.info(`MCP server configured`,{toolCount:$.length,resourceCount:2});let r=async()=>{try{let n=e.sources.map(e=>e.path).join(`, `);Y.info(`Running initial index`,{sourcePaths:n});let r=await t.indexer.index(e,e=>{e.phase===`crawling`||e.phase===`done`||(e.phase===`chunking`&&e.currentFile&&Y.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&Y.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});Y.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await t.store.createFtsIndex()}catch(e){Y.warn(`FTS index creation failed`,J(e))}try{let e=await t.curated.reindexAll();Y.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){Y.error(`Curated re-index failed`,J(e))}}catch(e){Y.error(`Initial index failed; will retry on kb_reindex`,J(e))}},i=async()=>{Y.info(`Shutting down`),await t.embedder.shutdown().catch(()=>{}),await t.graphStore.close().catch(()=>{}),await t.store.close(),process.exit(0)};process.on(`SIGINT`,i),process.on(`SIGTERM`,i);let a=process.ppid,o=setInterval(()=>{try{process.kill(a,0)}catch{Y.info(`Parent process died; shutting down`,{parentPid:a}),clearInterval(o),i()}},5e3);return o.unref(),{server:n,runInitialIndex:r,shutdown:i}}const $e=new Set(`batch.changelog.check.checkpoint.codemod.compact.data_transform.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.forge_classify.git_context.graph.guide.health.http.lane.measure.onboard.parse_output.present.process.produce_knowledge.queue.read.regex_test.reindex.remember.rename.replay.restore.schema_validate.scope_map.snippet.stash.status.stratum_card.test_run.time.update.forget.list.watch.web_fetch.web_search.workset`.split(`.`)),et=5e3,Q=new Set(`changelog.check.checkpoint.codemod.data_transform.delegate.diff_parse.encode.env.eval.evidence_map.forge_classify.git_context.guide.present.health.http.lane.measure.parse_output.process.produce_knowledge.queue.regex_test.rename.replay.restore.schema_validate.snippet.stash.test_run.time.watch.web_fetch.web_search.workset`.split(`.`));function tt(e){w(e),E(e),O(e),D(e),T(e),z(e),R(e),B(e),I(e),L(e),G(e),W(e),V(e),xe(e),H(e),U(e),M(e),N(e),P(e),F(e),j(e),k(e),A(e),K(e),q(e),be(e),Pe(e),Oe(e),Ae(e),Ee(e),ke(e),Te(e),je(e),Me(e),De(e),Ne(e)}const $=`analyze_dependencies.analyze_diagram.analyze_entry_points.analyze_patterns.analyze_structure.analyze_symbols.audit.batch.blast_radius.brainstorm.changelog.check.checkpoint.codemod.compact.data_transform.dead_symbols.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.find.forge_classify.forge_ground.forget.git_context.graph.guide.health.http.lane.list.lookup.measure.onboard.parse_output.present.process.produce_knowledge.queue.read.regex_test.reindex.remember.rename.replay.restore.schema_validate.scope_map.search.snippet.stash.status.stratum_card.symbol.test_run.time.trace.update.watch.web_fetch.web_search.workset`.split(`.`);function nt(e){let i=new Xe({name:e.serverName??`knowledge-base`,version:Fe()},{capabilities:{logging:{}}}),o=`initializing`,u=``,d=!1,f=()=>o===`failed`?[`❌ KB initialization failed — this tool is unavailable.`,``,u?`Error: ${u}`:``,``,`**35 tools are still available** and fully functional:`,`check, eval, test_run, git_context, health, measure, web_fetch, web_search,`,`regex_test, encode, stash, checkpoint, lane, process, time, env, and more.`,``,`Try restarting the MCP server to retry initialization.`].filter(Boolean).join(`
|
|
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
|
-
`);
|
|
3
|
+
`);n(i),l(i,e.toolPrefix??``);let p=i.sendToolListChanged.bind(i);i.sendToolListChanged=()=>{};let m=[];for(let e of $){let t=c(e),n=i.registerTool(e,{title:t.title,description:`${t.title} — initializing, available shortly`,inputSchema:{},annotations:t.annotations},async()=>({content:[{type:`text`,text:f()}]}));Q.has(e)?n.remove():m.push(n)}tt(i),i.sendToolListChanged=p;let h=i.resource(`kb-status`,`kb://status`,{description:`Knowledge base status (initializing...)`,mimeType:`text/plain`},async()=>({contents:[{uri:`kb://status`,text:`KB is initializing...`,mimeType:`text/plain`}]})),ee=i.prompt(`_init`,`KB is initializing prompts...`,async()=>({messages:[{role:`user`,content:{type:`text`,text:f()}}]})),g,_=new Promise(e=>{g=e}),v,te=new Promise(e=>{v=e}),y=()=>v?.(),b=(async()=>{await te;let n;try{n=await X(e)}catch(e){o=`failed`,u=e instanceof Error?e.message:String(e),Y.error(`KB initialization failed — server continuing with zero-dep tools only`,{error:u});return}let c=i.sendToolListChanged.bind(i);i.sendToolListChanged=()=>{};let l=i.sendPromptListChanged.bind(i);i.sendPromptListChanged=()=>{};let f=i.sendResourceListChanged.bind(i);i.sendResourceListChanged=()=>{};for(let e of m)e.remove();h.remove(),ee.remove();let p=i._registeredTools??{};for(let e of Q)p[e]?.remove();let _=new a(i),v=s(i);Z(i,n,e,t(i),_,v),r(i),i.sendToolListChanged=c,i.sendPromptListChanged=l,i.sendResourceListChanged=f,Promise.resolve(i.sendToolListChanged()).catch(()=>{}),Promise.resolve(i.sendPromptListChanged()).catch(()=>{}),Promise.resolve(i.sendResourceListChanged()).catch(()=>{});let y=i._registeredTools??{};for(let[e,t]of Object.entries(y)){if($e.has(e))continue;let r=t.handler;t.handler=async(...t)=>{if(!n.indexer.isIndexing)return r(...t);let i=d?`re-indexing`:`running initial index`,a=new Promise(t=>setTimeout(()=>t({content:[{type:`text`,text:`⏳ KB is ${i}. The tool "${e}" timed out waiting for index data (${et/1e3}s).\n\nThe existing index may be temporarily locked. Please retry shortly — indexing will complete automatically.`}]}),et));return Promise.race([r(...t),a])}}let b=Object.keys(y).length;b!==$.length&&Y.warn(`ALL_TOOL_NAMES count mismatch`,{expectedToolCount:$.length,registeredToolCount:b}),Y.info(`MCP server configured`,{toolCount:$.length,resourceCount:4}),g?.(n)})(),x=async()=>{let t=await _;try{let n=e.sources.map(e=>e.path).join(`, `);Y.info(`Running initial index`,{sourcePaths:n});let r=await t.indexer.index(e,e=>{e.phase===`crawling`||e.phase===`done`||(e.phase===`chunking`&&e.currentFile&&Y.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&Y.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});d=!0,Y.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await t.store.createFtsIndex()}catch(e){Y.warn(`FTS index creation failed`,J(e))}try{let e=await t.curated.reindexAll();Y.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){Y.error(`Curated re-index failed`,J(e))}}catch(e){Y.error(`Initial index failed; will retry on kb_reindex`,J(e))}},S=process.ppid,C=setInterval(()=>{try{process.kill(S,0)}catch{Y.info(`Parent process died; shutting down`,{parentPid:S}),clearInterval(C),_.then(async e=>{await e.embedder.shutdown().catch(()=>{}),await e.graphStore.close().catch(()=>{}),await e.store.close().catch(()=>{})}).catch(()=>{}).finally(()=>process.exit(0))}},5e3);return C.unref(),{server:i,startInit:y,ready:b,runInitialIndex:x}}export{$ as ALL_TOOL_NAMES,nt as createLazyServer,Ze as createMcpServer,Qe as createServer,X as initializeKnowledgeBase,Z as registerMcpTools};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
//#region packages/server/src/task-manager.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Lightweight progress reporting for long-running tool operations.
|
|
4
|
+
*
|
|
5
|
+
* Wraps MCP progress notifications (`notifications/progress`) with a simple
|
|
6
|
+
* TaskHandle API. Degrades gracefully when the client doesn't support progress.
|
|
7
|
+
*
|
|
8
|
+
* @see E-027 — Tasks + Progress enhancement
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Minimal type for the tool handler `extra` parameter we need.
|
|
12
|
+
* Avoids importing full SDK types for testing flexibility.
|
|
13
|
+
*/
|
|
14
|
+
interface ToolHandlerExtra {
|
|
15
|
+
sendNotification?: (notification: {
|
|
16
|
+
method: string;
|
|
17
|
+
params?: Record<string, unknown>;
|
|
18
|
+
}) => Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
interface TaskHandle {
|
|
21
|
+
/** Report progress. `current` is 0-based step number. */
|
|
22
|
+
progress(current: number, message?: string): void;
|
|
23
|
+
/** Mark the task as complete. */
|
|
24
|
+
complete(message?: string): void;
|
|
25
|
+
/** Mark the task as failed. */
|
|
26
|
+
fail(error?: string): void;
|
|
27
|
+
}
|
|
28
|
+
interface ITaskRunner {
|
|
29
|
+
/** Create a task with a descriptive title and expected total steps. */
|
|
30
|
+
createTask(title: string, totalSteps: number): TaskHandle;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a task runner that sends MCP progress notifications.
|
|
34
|
+
* If `extra` is undefined or lacks sendNotification, returns a no-op runner.
|
|
35
|
+
*/
|
|
36
|
+
declare function createTaskRunner(extra?: ToolHandlerExtra): ITaskRunner;
|
|
37
|
+
/** No-op task runner — all methods silently succeed. */
|
|
38
|
+
declare const noopTaskRunner: ITaskRunner;
|
|
39
|
+
//#endregion
|
|
40
|
+
export { ITaskRunner, TaskHandle, ToolHandlerExtra, createTaskRunner, noopTaskRunner };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createLogger as e}from"../../core/dist/index.js";const t=e(`task-manager`);let n=0;function r(e){let r=typeof e?.sendNotification==`function`;return{createTask(i,a){let o=`kb-task-${++n}`,s=(n,i,a)=>{r&&e.sendNotification?.({method:`notifications/progress`,params:{progressToken:o,progress:n,total:i,...a?{message:a}:{}}}).catch(e=>{t.debug(`Progress notification failed`,{token:o,error:String(e)})})};return r&&t.debug(`Task created`,{token:o,title:i,totalSteps:a}),{progress(e,t){s(e,a,t??`${i}: step ${e+1}/${a}`)},complete(e){s(a,a,e??`${i}: complete`)},fail(e){s(a,a,e??`${i}: failed`)}}}}}const i={createTask(){return{progress(){},complete(){},fail(){}}}};export{r as createTaskRunner,i as noopTaskRunner};
|