@grafema/mcp 0.3.28 → 0.3.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/definitions/enox-tools.d.ts +10 -0
  2. package/dist/definitions/enox-tools.d.ts.map +1 -0
  3. package/dist/definitions/enox-tools.js +451 -0
  4. package/dist/definitions/enox-tools.js.map +1 -0
  5. package/dist/definitions/index.js +2 -2
  6. package/dist/definitions/index.js.map +1 -1
  7. package/dist/handlers/coverage-handlers.d.ts.map +1 -1
  8. package/dist/handlers/coverage-handlers.js +9 -0
  9. package/dist/handlers/coverage-handlers.js.map +1 -1
  10. package/dist/handlers/documentation-handlers.d.ts.map +1 -1
  11. package/dist/handlers/documentation-handlers.js +26 -5
  12. package/dist/handlers/documentation-handlers.js.map +1 -1
  13. package/dist/handlers/enox-handlers.d.ts +113 -0
  14. package/dist/handlers/enox-handlers.d.ts.map +1 -0
  15. package/dist/handlers/enox-handlers.js +877 -0
  16. package/dist/handlers/enox-handlers.js.map +1 -0
  17. package/dist/handlers/index.d.ts +1 -1
  18. package/dist/handlers/index.d.ts.map +1 -1
  19. package/dist/handlers/index.js +1 -1
  20. package/dist/handlers/index.js.map +1 -1
  21. package/dist/handlers/query-handlers.d.ts +7 -0
  22. package/dist/handlers/query-handlers.d.ts.map +1 -1
  23. package/dist/handlers/query-handlers.js +28 -14
  24. package/dist/handlers/query-handlers.js.map +1 -1
  25. package/dist/server.js +45 -17
  26. package/dist/server.js.map +1 -1
  27. package/dist/types.d.ts +64 -0
  28. package/dist/types.d.ts.map +1 -1
  29. package/package.json +12 -12
  30. package/src/definitions/enox-tools.ts +454 -0
  31. package/src/definitions/index.ts +2 -2
  32. package/src/handlers/coverage-handlers.ts +10 -0
  33. package/src/handlers/documentation-handlers.ts +26 -5
  34. package/src/handlers/enox-handlers.ts +1125 -0
  35. package/src/handlers/index.ts +1 -1
  36. package/src/handlers/query-handlers.ts +25 -12
  37. package/src/server.ts +86 -29
  38. package/src/types.ts +78 -0
  39. package/dist/definitions.d.ts +0 -23
  40. package/dist/definitions.d.ts.map +0 -1
  41. package/dist/definitions.js +0 -644
  42. package/dist/definitions.js.map +0 -1
  43. package/dist/handlers.d.ts +0 -61
  44. package/dist/handlers.d.ts.map +0 -1
  45. package/dist/handlers.js +0 -1310
  46. package/dist/handlers.js.map +0 -1
@@ -14,7 +14,7 @@ export { handleFindGuards } from './guard-handlers.js';
14
14
  export { handleGetDocumentation } from './documentation-handlers.js';
15
15
  export { handleReportIssue } from './issue-handlers.js';
16
16
  export { handleGetNode, handleGetNeighbors, handleTraverseGraph } from './graph-handlers.js';
17
- export { handleAddKnowledge, handleQueryKnowledge, handleQueryDecisions, handleSupersedeFact, handleGetKnowledgeStats } from './knowledge-handlers.js';
17
+ export { handleRemember, handleRecall, handleSemanticSearch, handleExploreEntity, handleAddAssertion, handleUpdateAssertion, handleDeleteAssertion, handleEnoxQuery, handleEnoxTraverse, handleEnoxStats, handleRecentActivity, handleUpdateNode, handleCrawlEntity, handleSaveDocument } from './enox-handlers.js';
18
18
  // Disabled: requires git-ingest (US-17). See US-17 in AI-AGENT-STORIES.md
19
19
  // export { handleGitChurn, handleGitCoChange, handleGitOwnership, handleGitArchaeology } from './knowledge-handlers.js';
20
20
  export { handleDescribe } from './notation-handlers.js';
@@ -524,22 +524,35 @@ async function enrichNodes(
524
524
 
525
525
  /** Convert a semantic ID to human-readable "name in file.ts" format.
526
526
  * Handles: grafema://host/path/file.ts#TYPE->name[scope], path/file.ts#TYPE->name,
527
- * TYPE-%3Ename (URL-encoded, no file prefix), or raw node IDs. */
528
- function humanReadableId(semanticId: string): string {
527
+ * TYPE-%3Ename (URL-encoded, no file prefix), or raw node IDs.
528
+ *
529
+ * Exported for unit testing.
530
+ * @internal */
531
+ export function humanReadableId(semanticId: string): string {
529
532
  if (!semanticId) return '?';
530
- // Decode URI components first
531
- let id = semanticId;
532
- try { id = decodeURIComponent(id); } catch { /* keep as-is */ }
533
-
534
- // Find the # separator between file path and node descriptor
535
- const hashIdx = id.lastIndexOf('#');
536
- let filePart = '';
537
- let nodePart = id;
533
+
534
+ // Split file path from node descriptor on the FIRST literal '#' of the RAW
535
+ // (still percent-encoded) id, BEFORE decoding. The grafema:// URI form encodes
536
+ // the disambiguation counter ('#N', appended by computeSemanticIdV2 for hash
537
+ // collisions) as '%23N' inside the fragment. Decoding first and then splitting
538
+ // on the LAST '#' would mistake that counter for the path/fragment boundary and
539
+ // corrupt the label. A file path never contains a literal '#'. This mirrors the
540
+ // canonical parseSemanticIdV2 (packages/util/src/core/SemanticId.ts).
541
+ const hashIdx = semanticId.indexOf('#');
542
+ let rawFile = '';
543
+ let rawNode = semanticId;
538
544
  if (hashIdx !== -1) {
539
- filePart = id.slice(0, hashIdx);
540
- nodePart = id.slice(hashIdx + 1);
545
+ rawFile = semanticId.slice(0, hashIdx);
546
+ rawNode = semanticId.slice(hashIdx + 1);
541
547
  }
542
548
 
549
+ const decode = (s: string): string => {
550
+ try { return decodeURIComponent(s); } catch { return s; }
551
+ };
552
+ const filePart = decode(rawFile);
553
+ // Strip the trailing disambiguation counter ('#N') from the decoded descriptor.
554
+ const nodePart = decode(rawNode).replace(/#\d+$/, '');
555
+
543
556
  const fileName = filePart ? (filePart.split('/').pop() || '') : '';
544
557
 
545
558
  // Extract name from TYPE->name or TYPE->name[in:scope,h:hash]
package/src/server.ts CHANGED
@@ -67,11 +67,6 @@ import {
67
67
  handleGetNode,
68
68
  handleGetNeighbors,
69
69
  handleTraverseGraph,
70
- handleAddKnowledge,
71
- handleQueryKnowledge,
72
- handleQueryDecisions,
73
- handleSupersedeFact,
74
- handleGetKnowledgeStats,
75
70
  // Disabled: requires git-ingest (US-17). See US-17 in AI-AGENT-STORIES.md
76
71
  // handleGitChurn,
77
72
  // handleGitCoChange,
@@ -83,6 +78,20 @@ import {
83
78
  handleExplain,
84
79
  handleTraceEffects,
85
80
  handleFindSharedBehaviors,
81
+ handleRemember,
82
+ handleRecall,
83
+ handleSemanticSearch,
84
+ handleExploreEntity,
85
+ handleAddAssertion,
86
+ handleUpdateAssertion,
87
+ handleDeleteAssertion,
88
+ handleEnoxQuery,
89
+ handleEnoxTraverse,
90
+ handleEnoxStats,
91
+ handleRecentActivity,
92
+ handleUpdateNode,
93
+ handleCrawlEntity,
94
+ handleSaveDocument,
86
95
  } from './handlers/index.js';
87
96
  import type { ExplainArgs } from './handlers/index.js';
88
97
  import type {
@@ -112,10 +121,6 @@ import type {
112
121
  GetNodeArgs,
113
122
  GetNeighborsArgs,
114
123
  TraverseGraphArgs,
115
- AddKnowledgeArgs,
116
- QueryKnowledgeArgs,
117
- QueryDecisionsArgs,
118
- SupersedeFactArgs,
119
124
  // Disabled: requires git-ingest (US-17). See US-17 in AI-AGENT-STORIES.md
120
125
  // GitChurnArgs,
121
126
  // GitCoChangeArgs,
@@ -127,6 +132,21 @@ import type {
127
132
  QueryRegistryArgs,
128
133
  FindSharedBehaviorsArgs,
129
134
  } from './types.js';
135
+ import type {
136
+ RememberArgs,
137
+ RecallArgs,
138
+ SemanticSearchArgs,
139
+ ExploreEntityArgs,
140
+ AddAssertionArgs,
141
+ UpdateAssertionArgs,
142
+ DeleteAssertionArgs,
143
+ QueryGraphKnowledgeArgs,
144
+ TraverseArgs as EnoxTraverseArgs,
145
+ RecentActivityArgs,
146
+ UpdateNodeArgs as EnoxUpdateNodeArgs,
147
+ CrawlEntityArgs,
148
+ SaveDocumentArgs,
149
+ } from './handlers/enox-handlers.js';
130
150
 
131
151
  /**
132
152
  * Type-safe argument casting helper.
@@ -358,26 +378,6 @@ server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
358
378
  result = await handleTraverseGraph(asArgs<TraverseGraphArgs>(args));
359
379
  break;
360
380
 
361
- case 'add_knowledge':
362
- result = await handleAddKnowledge(asArgs<AddKnowledgeArgs>(args));
363
- break;
364
-
365
- case 'query_knowledge':
366
- result = await handleQueryKnowledge(asArgs<QueryKnowledgeArgs>(args));
367
- break;
368
-
369
- case 'query_decisions':
370
- result = await handleQueryDecisions(asArgs<QueryDecisionsArgs>(args));
371
- break;
372
-
373
- case 'supersede_fact':
374
- result = await handleSupersedeFact(asArgs<SupersedeFactArgs>(args));
375
- break;
376
-
377
- case 'get_knowledge_stats':
378
- result = await handleGetKnowledgeStats();
379
- break;
380
-
381
381
  // Disabled: requires git-ingest (US-17). See US-17 in AI-AGENT-STORIES.md
382
382
  // case 'git_churn':
383
383
  // result = await handleGitChurn(asArgs<GitChurnArgs>(args));
@@ -411,6 +411,63 @@ server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
411
411
  result = await handleFindSharedBehaviors(asArgs<FindSharedBehaviorsArgs>(args));
412
412
  break;
413
413
 
414
+ // === Enox knowledge graph ===
415
+ case 'remember':
416
+ result = await handleRemember(asArgs<RememberArgs>(args));
417
+ break;
418
+
419
+ case 'recall':
420
+ result = await handleRecall(asArgs<RecallArgs>(args));
421
+ break;
422
+
423
+ case 'semantic_search':
424
+ result = await handleSemanticSearch(asArgs<SemanticSearchArgs>(args));
425
+ break;
426
+
427
+ case 'enox_explore':
428
+ result = await handleExploreEntity(asArgs<ExploreEntityArgs>(args));
429
+ break;
430
+
431
+ case 'add_assertion':
432
+ result = await handleAddAssertion(asArgs<AddAssertionArgs>(args));
433
+ break;
434
+
435
+ case 'update_assertion':
436
+ result = await handleUpdateAssertion(asArgs<UpdateAssertionArgs>(args));
437
+ break;
438
+
439
+ case 'delete_assertion':
440
+ result = await handleDeleteAssertion(asArgs<DeleteAssertionArgs>(args));
441
+ break;
442
+
443
+ case 'enox_query':
444
+ result = await handleEnoxQuery(asArgs<QueryGraphKnowledgeArgs>(args));
445
+ break;
446
+
447
+ case 'enox_traverse':
448
+ result = await handleEnoxTraverse(asArgs<EnoxTraverseArgs>(args));
449
+ break;
450
+
451
+ case 'enox_stats':
452
+ result = await handleEnoxStats();
453
+ break;
454
+
455
+ case 'recent_activity':
456
+ result = await handleRecentActivity(asArgs<RecentActivityArgs>(args));
457
+ break;
458
+
459
+ case 'update_node':
460
+ result = await handleUpdateNode(asArgs<EnoxUpdateNodeArgs>(args));
461
+ break;
462
+
463
+ case 'crawl_entity':
464
+ result = await handleCrawlEntity(asArgs<CrawlEntityArgs>(args));
465
+ break;
466
+
467
+ case 'save_document':
468
+ result = await handleSaveDocument(asArgs<SaveDocumentArgs>(args));
469
+ break;
470
+
414
471
  default:
415
472
  result = errorResult(`Unknown tool: ${name}`);
416
473
  }
package/src/types.ts CHANGED
@@ -428,6 +428,84 @@ export interface SupersedeFactArgs {
428
428
  new_slug?: string;
429
429
  }
430
430
 
431
+ // === ENOX ARGS (knowledge graph) ===
432
+
433
+ export interface EnoxRememberArgs {
434
+ subject: string;
435
+ fact: string;
436
+ domain?: string;
437
+ confidence?: number;
438
+ relation?: string;
439
+ }
440
+
441
+ export interface EnoxRecallArgs {
442
+ query: string;
443
+ depth?: number;
444
+ }
445
+
446
+ export interface EnoxSemanticSearchArgs {
447
+ query: string;
448
+ top_k?: number;
449
+ domain?: string;
450
+ include_edges?: boolean;
451
+ }
452
+
453
+ export interface EnoxExploreArgs {
454
+ entity: string;
455
+ }
456
+
457
+ export interface EnoxAddAssertionArgs {
458
+ from: string;
459
+ relation: string;
460
+ to: string;
461
+ context?: string;
462
+ confidence?: number;
463
+ domain?: string;
464
+ }
465
+
466
+ export interface EnoxUpdateAssertionArgs {
467
+ fact_id: string;
468
+ context?: string;
469
+ confidence?: number;
470
+ }
471
+
472
+ export interface EnoxDeleteAssertionArgs {
473
+ fact_id: string;
474
+ }
475
+
476
+ export interface EnoxQueryGraphArgs {
477
+ type?: string;
478
+ domain?: string;
479
+ name?: string;
480
+ limit?: number;
481
+ }
482
+
483
+ export interface EnoxTraverseArgs {
484
+ start: string;
485
+ direction?: string;
486
+ edge_types?: string[];
487
+ max_depth?: number;
488
+ }
489
+
490
+ export interface EnoxRecentActivityArgs {
491
+ since?: string;
492
+ limit?: number;
493
+ }
494
+
495
+ export interface EnoxUpdateNodeArgs {
496
+ node_id: string;
497
+ name?: string;
498
+ domain?: string;
499
+ description?: string;
500
+ }
501
+
502
+ export interface EnoxSaveDocumentArgs {
503
+ title: string;
504
+ content: string;
505
+ doc_type?: string;
506
+ relates_to?: string[];
507
+ }
508
+
431
509
  // === DESCRIBE ARGS (DSL notation) ===
432
510
 
433
511
  export interface DescribeArgs {
@@ -1,23 +0,0 @@
1
- /**
2
- * MCP Tool Definitions
3
- */
4
- interface SchemaProperty {
5
- type: string;
6
- description?: string;
7
- enum?: string[];
8
- items?: SchemaProperty;
9
- properties?: Record<string, SchemaProperty>;
10
- required?: string[];
11
- }
12
- export interface ToolDefinition {
13
- name: string;
14
- description: string;
15
- inputSchema: {
16
- type: 'object';
17
- properties: Record<string, SchemaProperty>;
18
- required?: string[];
19
- };
20
- }
21
- export declare const TOOLS: ToolDefinition[];
22
- export {};
23
- //# sourceMappingURL=definitions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../src/definitions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC3C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,eAAO,MAAM,KAAK,EAAE,cAAc,EA+nBjC,CAAC"}