@@ -11,20 +11,21 @@ import { createRestApp } from '@/api/rest/index';
1111import { attachWebSocket } from '@/api/rest/websocket' ;
1212import { resolveUserFromBearer , resolveAccess , canWrite , canRead } from '@/lib/access' ;
1313import { MAX_BODY_SIZE , SESSION_SWEEP_INTERVAL_MS } from '@/lib/defaults' ;
14- import { GRAPH_NAMES , type GraphName , type AccessLevel , resolveRequestAuthor , type UserConfig } from '@/lib/multi-config' ;
14+ import { GRAPH_NAMES , type GraphName , type AccessLevel , type UserConfig } from '@/lib/multi-config' ;
1515import type { DocGraph } from '@/graphs/docs' ;
1616import { DocGraphManager } from '@/graphs/docs' ;
1717import type { CodeGraph } from '@/graphs/code-types' ;
1818import { CodeGraphManager } from '@/graphs/code' ;
1919import type { KnowledgeGraph } from '@/graphs/knowledge-types' ;
20- import { KnowledgeGraphManager } from '@/graphs/knowledge' ;
20+ // KnowledgeGraphManager removed — using StoreManager
2121import type { FileIndexGraph } from '@/graphs/file-index-types' ;
2222import { FileIndexGraphManager } from '@/graphs/file-index' ;
2323import type { TaskGraph } from '@/graphs/task-types' ;
24- import { TaskGraphManager } from '@/graphs/task' ;
24+ // TaskGraphManager removed — using StoreManager
2525import type { SkillGraph } from '@/graphs/skill-types' ;
26- import { SkillGraphManager } from '@/graphs/skill' ;
27- import { noopContext , type ExternalGraphs } from '@/graphs/manager-types' ;
26+ // SkillGraphManager removed — using StoreManager
27+ import { type ExternalGraphs } from '@/graphs/manager-types' ;
28+ import type { StoreManager } from '@/lib/store-manager' ;
2829import * as listTopics from '@/api/tools/docs/list-topics' ;
2930import * as getToc from '@/api/tools/docs/get-toc' ;
3031import * as search from '@/api/tools/docs/search' ;
@@ -184,13 +185,14 @@ export function createMcpServer(
184185 taskGraph ?: TaskGraph ,
185186 embedFn ?: EmbedFn | Partial < EmbedFnMap > ,
186187 mutationQueue ?: PromiseQueue ,
187- projectDir ?: string ,
188+ _projectDir ?: string ,
188189 skillGraph ?: SkillGraph ,
189190 sessionContext ?: McpSessionContext ,
190191 readonlyGraphs ?: Set < string > ,
191192 userAccess ?: Map < string , AccessLevel > ,
192193 getSessionId ?: ( ) => string | undefined ,
193- users ?: Record < string , UserConfig > ,
194+ _users ?: Record < string , UserConfig > ,
195+ storeManager ?: StoreManager ,
194196) : McpServer {
195197 // Backward-compat: single EmbedFn → use for both document and query
196198 const defaultPair : EmbedFns = { document : ( q ) => embed ( q , '' ) , query : ( q ) => embed ( q , '' ) } ;
@@ -222,7 +224,7 @@ export function createMcpServer(
222224 ) ;
223225 // Mutation tools are registered through mutServer to serialize concurrent writes
224226 const mutServer = mutationQueue ? createMutationServer ( server , mutationQueue , getSessionId ) : server ;
225- const resolveAuthor = ( ) => resolveRequestAuthor ( sessionContext ?. userId , users ) ;
227+ void _users ; // reserved for future author resolution wiring
226228
227229 // Check if mutation tools should be registered for a graph:
228230 // - graph must not be readonly (global setting — tools hidden for all)
@@ -288,88 +290,76 @@ export function createMcpServer(
288290 getFileInfo . register ( server , fileIndexMgr ) ;
289291 }
290292
291- // Knowledge tools — read tools gated by canAccess, mutation tools gated by canMutate
292- if ( knowledgeGraph && canAccess ( 'knowledge' ) ) {
293- const ctx = projectDir ? { ...noopContext ( ) , projectDir } : noopContext ( ) ;
294- const knowledgeMgr = new KnowledgeGraphManager ( knowledgeGraph , fns . knowledge , ctx , {
295- docGraph, codeGraph, fileIndexGraph, taskGraph, skillGraph,
296- } ) ;
297- getNote . register ( server , knowledgeMgr ) ;
298- listNotes . register ( server , knowledgeMgr ) ;
299- searchNotes . register ( server , knowledgeMgr ) ;
300- listRelations . register ( server , knowledgeMgr ) ;
301- findLinkedNotes . register ( server , knowledgeMgr ) ;
293+ // Knowledge tools — uses StoreManager (read gated by canAccess, mutation by canMutate)
294+ if ( storeManager && canAccess ( 'knowledge' ) ) {
295+ getNote . register ( server , storeManager ) ;
296+ listNotes . register ( server , storeManager ) ;
297+ searchNotes . register ( server , storeManager ) ;
298+ listRelations . register ( server , storeManager ) ;
299+ findLinkedNotes . register ( server , storeManager ) ;
302300 if ( canMutate ( 'knowledge' ) ) {
303- createNote . register ( mutServer , knowledgeMgr , resolveAuthor ) ;
304- updateNote . register ( mutServer , knowledgeMgr , resolveAuthor ) ;
305- deleteNote . register ( mutServer , knowledgeMgr , resolveAuthor ) ;
306- createRelation . register ( mutServer , knowledgeMgr , resolveAuthor ) ;
307- deleteRelation . register ( mutServer , knowledgeMgr , resolveAuthor ) ;
308- addNoteAttachment . register ( mutServer , knowledgeMgr , resolveAuthor ) ;
309- removeNoteAttachment . register ( mutServer , knowledgeMgr , resolveAuthor ) ;
301+ createNote . register ( mutServer , storeManager ) ;
302+ updateNote . register ( mutServer , storeManager ) ;
303+ deleteNote . register ( mutServer , storeManager ) ;
304+ createRelation . register ( mutServer , storeManager ) ;
305+ deleteRelation . register ( mutServer , storeManager ) ;
306+ addNoteAttachment . register ( mutServer , storeManager ) ;
307+ removeNoteAttachment . register ( mutServer , storeManager ) ;
310308 }
311309 }
312310
313- // Task tools — read tools gated by canAccess, mutation tools gated by canMutate
314- if ( taskGraph && canAccess ( 'tasks' ) ) {
315- const taskCtx = projectDir ? { ...noopContext ( ) , projectDir } : noopContext ( ) ;
316- const taskMgr = new TaskGraphManager ( taskGraph , fns . tasks , taskCtx , {
317- docGraph, codeGraph, knowledgeGraph, fileIndexGraph, skillGraph,
318- } ) ;
319- getTask . register ( server , taskMgr ) ;
320- listTasksTool . register ( server , taskMgr ) ;
321- searchTasksTool . register ( server , taskMgr ) ;
322- findLinkedTasks . register ( server , taskMgr ) ;
311+ // Task tools — uses StoreManager (read gated by canAccess, mutation by canMutate)
312+ if ( storeManager && canAccess ( 'tasks' ) ) {
313+ getTask . register ( server , storeManager ) ;
314+ listTasksTool . register ( server , storeManager ) ;
315+ searchTasksTool . register ( server , storeManager ) ;
316+ findLinkedTasks . register ( server , storeManager ) ;
323317 if ( canMutate ( 'tasks' ) ) {
324- createTask . register ( mutServer , taskMgr , resolveAuthor ) ;
325- updateTask . register ( mutServer , taskMgr , resolveAuthor ) ;
326- deleteTask . register ( mutServer , taskMgr , resolveAuthor ) ;
327- moveTask . register ( mutServer , taskMgr , resolveAuthor ) ;
328- reorderTaskTool . register ( mutServer , taskMgr , resolveAuthor ) ;
329- linkTask . register ( mutServer , taskMgr , resolveAuthor ) ;
330- createTaskLink . register ( mutServer , taskMgr , resolveAuthor ) ;
331- deleteTaskLink . register ( mutServer , taskMgr , resolveAuthor ) ;
332- bulkMove . register ( mutServer , taskMgr , resolveAuthor ) ;
333- bulkPriority . register ( mutServer , taskMgr , resolveAuthor ) ;
334- bulkDelete . register ( mutServer , taskMgr , resolveAuthor ) ;
335- addTaskAttachment . register ( mutServer , taskMgr , resolveAuthor ) ;
336- removeTaskAttachment . register ( mutServer , taskMgr , resolveAuthor ) ;
318+ createTask . register ( mutServer , storeManager ) ;
319+ updateTask . register ( mutServer , storeManager ) ;
320+ deleteTask . register ( mutServer , storeManager ) ;
321+ moveTask . register ( mutServer , storeManager ) ;
322+ reorderTaskTool . register ( mutServer , storeManager ) ;
323+ linkTask . register ( mutServer , storeManager ) ;
324+ createTaskLink . register ( mutServer , storeManager ) ;
325+ deleteTaskLink . register ( mutServer , storeManager ) ;
326+ bulkMove . register ( mutServer , storeManager ) ;
327+ bulkPriority . register ( mutServer , storeManager ) ;
328+ bulkDelete . register ( mutServer , storeManager ) ;
329+ addTaskAttachment . register ( mutServer , storeManager ) ;
330+ removeTaskAttachment . register ( mutServer , storeManager ) ;
337331 }
338332
339- // Epic tools (same graph, same access )
340- getEpicTool . register ( server , taskMgr ) ;
341- listEpicsTool . register ( server , taskMgr ) ;
342- searchEpicsTool . register ( server , taskMgr ) ;
333+ // Epic tools (same access as tasks )
334+ getEpicTool . register ( server , storeManager ) ;
335+ listEpicsTool . register ( server , storeManager ) ;
336+ searchEpicsTool . register ( server , storeManager ) ;
343337 if ( canMutate ( 'tasks' ) ) {
344- createEpicTool . register ( mutServer , taskMgr , resolveAuthor ) ;
345- updateEpicTool . register ( mutServer , taskMgr , resolveAuthor ) ;
346- deleteEpicTool . register ( mutServer , taskMgr , resolveAuthor ) ;
347- linkEpicTaskTool . register ( mutServer , taskMgr , resolveAuthor ) ;
348- unlinkEpicTaskTool . register ( mutServer , taskMgr , resolveAuthor ) ;
338+ createEpicTool . register ( mutServer , storeManager ) ;
339+ updateEpicTool . register ( mutServer , storeManager ) ;
340+ deleteEpicTool . register ( mutServer , storeManager ) ;
341+ linkEpicTaskTool . register ( mutServer , storeManager ) ;
342+ unlinkEpicTaskTool . register ( mutServer , storeManager ) ;
349343 }
350344 }
351345
352- // Skill tools — read tools gated by canAccess, mutation tools gated by canMutate
353- if ( skillGraph && canAccess ( 'skills' ) ) {
354- const skillCtx = projectDir ? { ...noopContext ( ) , projectDir } : noopContext ( ) ;
355- const skillMgr = new SkillGraphManager ( skillGraph , fns . skills , skillCtx , {
356- docGraph, codeGraph, knowledgeGraph, fileIndexGraph, taskGraph,
357- } ) ;
358- getSkillTool . register ( server , skillMgr ) ;
359- listSkillsTool . register ( server , skillMgr ) ;
360- searchSkillsTool . register ( server , skillMgr ) ;
361- findLinkedSkills . register ( server , skillMgr ) ;
362- recallSkills . register ( server , skillMgr ) ;
346+ // Skill tools — uses StoreManager (read gated by canAccess, mutation by canMutate)
347+ if ( storeManager && canAccess ( 'skills' ) ) {
348+ getSkillTool . register ( server , storeManager ) ;
349+ listSkillsTool . register ( server , storeManager ) ;
350+ searchSkillsTool . register ( server , storeManager ) ;
351+ findLinkedSkills . register ( server , storeManager ) ;
352+ recallSkills . register ( server , storeManager ) ;
363353 if ( canMutate ( 'skills' ) ) {
364- createSkillTool . register ( mutServer , skillMgr , resolveAuthor ) ;
365- updateSkillTool . register ( mutServer , skillMgr , resolveAuthor ) ;
366- deleteSkillTool . register ( mutServer , skillMgr , resolveAuthor ) ;
367- linkSkill . register ( mutServer , skillMgr , resolveAuthor ) ;
368- createSkillLink . register ( mutServer , skillMgr , resolveAuthor ) ;
369- deleteSkillLink . register ( mutServer , skillMgr , resolveAuthor ) ;
370- addSkillAttachment . register ( mutServer , skillMgr , resolveAuthor ) ;
371- removeSkillAttachment . register ( mutServer , skillMgr , resolveAuthor ) ;
372- bumpSkillUsage . register ( mutServer , skillMgr , resolveAuthor ) ;
354+ createSkillTool . register ( mutServer , storeManager ) ;
355+ updateSkillTool . register ( mutServer , storeManager ) ;
356+ deleteSkillTool . register ( mutServer , storeManager ) ;
357+ linkSkill . register ( mutServer , storeManager ) ;
358+ createSkillLink . register ( mutServer , storeManager ) ;
359+ deleteSkillLink . register ( mutServer , storeManager ) ;
360+ addSkillAttachment . register ( mutServer , storeManager ) ;
361+ removeSkillAttachment . register ( mutServer , storeManager ) ;
362+ bumpSkillUsage . register ( mutServer , storeManager ) ;
373363 }
374364 }
375365
@@ -687,6 +677,7 @@ export async function startMultiProjectHttpServer(
687677 mcpUserAccess ,
688678 ( ) => transport . sessionId ,
689679 users ,
680+ project . storeManager ,
690681 ) ;
691682 await mcpServer . connect ( transport ) ;
692683 await transport . handleRequest ( req , res , body ) ;
0 commit comments