keywordgraph-mcp-server 1.6.2 → 1.7.3

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 (124) hide show
  1. package/README.md +108 -101
  2. package/dist/api/client.d.ts.map +1 -1
  3. package/dist/api/client.js +8 -2
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/api/config-store.d.ts +2 -0
  6. package/dist/api/config-store.d.ts.map +1 -1
  7. package/dist/api/config-store.js +7 -0
  8. package/dist/api/config-store.js.map +1 -1
  9. package/dist/auth/oauth-provider.d.ts +3 -2
  10. package/dist/auth/oauth-provider.d.ts.map +1 -1
  11. package/dist/auth/oauth-provider.js +83 -28
  12. package/dist/auth/oauth-provider.js.map +1 -1
  13. package/dist/http-server.js +1 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +9 -6
  16. package/dist/index.js.map +1 -1
  17. package/dist/instructions.js +2 -2
  18. package/dist/resources/about.d.ts.map +1 -1
  19. package/dist/resources/about.js +15 -14
  20. package/dist/resources/about.js.map +1 -1
  21. package/dist/schemas/index.d.ts +452 -15
  22. package/dist/schemas/index.d.ts.map +1 -1
  23. package/dist/schemas/index.js +190 -32
  24. package/dist/schemas/index.js.map +1 -1
  25. package/dist/tools/addMemory.d.ts +4 -2
  26. package/dist/tools/addMemory.d.ts.map +1 -1
  27. package/dist/tools/addMemory.js +15 -1
  28. package/dist/tools/addMemory.js.map +1 -1
  29. package/dist/tools/analyzeExistingGraph.d.ts +1 -0
  30. package/dist/tools/analyzeExistingGraph.d.ts.map +1 -1
  31. package/dist/tools/analyzeExistingGraph.js +13 -4
  32. package/dist/tools/analyzeExistingGraph.js.map +1 -1
  33. package/dist/tools/analyzeText.d.ts +5 -0
  34. package/dist/tools/analyzeText.d.ts.map +1 -1
  35. package/dist/tools/analyzeText.js +18 -21
  36. package/dist/tools/analyzeText.js.map +1 -1
  37. package/dist/tools/createKnowledgeGraph.d.ts +6 -0
  38. package/dist/tools/createKnowledgeGraph.d.ts.map +1 -1
  39. package/dist/tools/createKnowledgeGraph.js +25 -22
  40. package/dist/tools/createKnowledgeGraph.js.map +1 -1
  41. package/dist/tools/developConceptualBridges.d.ts +3 -0
  42. package/dist/tools/developConceptualBridges.d.ts.map +1 -1
  43. package/dist/tools/developConceptualBridges.js +5 -17
  44. package/dist/tools/developConceptualBridges.js.map +1 -1
  45. package/dist/tools/developLatentTopics.d.ts +3 -0
  46. package/dist/tools/developLatentTopics.d.ts.map +1 -1
  47. package/dist/tools/developLatentTopics.js +5 -17
  48. package/dist/tools/developLatentTopics.js.map +1 -1
  49. package/dist/tools/developTextTool.d.ts +3 -0
  50. package/dist/tools/developTextTool.d.ts.map +1 -1
  51. package/dist/tools/developTextTool.js +9 -19
  52. package/dist/tools/developTextTool.js.map +1 -1
  53. package/dist/tools/generateContentGaps.d.ts +3 -0
  54. package/dist/tools/generateContentGaps.d.ts.map +1 -1
  55. package/dist/tools/generateContentGaps.js +5 -17
  56. package/dist/tools/generateContentGaps.js.map +1 -1
  57. package/dist/tools/generateContextualHint.d.ts +3 -0
  58. package/dist/tools/generateContextualHint.d.ts.map +1 -1
  59. package/dist/tools/generateContextualHint.js +5 -17
  60. package/dist/tools/generateContextualHint.js.map +1 -1
  61. package/dist/tools/generateDifferenceGraphFromTexts.d.ts +15 -3
  62. package/dist/tools/generateDifferenceGraphFromTexts.d.ts.map +1 -1
  63. package/dist/tools/generateDifferenceGraphFromTexts.js +9 -30
  64. package/dist/tools/generateDifferenceGraphFromTexts.js.map +1 -1
  65. package/dist/tools/generateKnowledgeGraph.d.ts +6 -0
  66. package/dist/tools/generateKnowledgeGraph.d.ts.map +1 -1
  67. package/dist/tools/generateKnowledgeGraph.js +19 -22
  68. package/dist/tools/generateKnowledgeGraph.js.map +1 -1
  69. package/dist/tools/generateMergedGraphFromTexts.d.ts +15 -3
  70. package/dist/tools/generateMergedGraphFromTexts.d.ts.map +1 -1
  71. package/dist/tools/generateMergedGraphFromTexts.js +9 -30
  72. package/dist/tools/generateMergedGraphFromTexts.js.map +1 -1
  73. package/dist/tools/generateOntologyGraph.d.ts +2 -0
  74. package/dist/tools/generateOntologyGraph.d.ts.map +1 -1
  75. package/dist/tools/generateOntologyGraph.js +9 -2
  76. package/dist/tools/generateOntologyGraph.js.map +1 -1
  77. package/dist/tools/generateOverlapGraphFromTexts.d.ts +15 -3
  78. package/dist/tools/generateOverlapGraphFromTexts.d.ts.map +1 -1
  79. package/dist/tools/generateOverlapGraphFromTexts.js +9 -30
  80. package/dist/tools/generateOverlapGraphFromTexts.js.map +1 -1
  81. package/dist/tools/generateResearchIdeas.d.ts +3 -0
  82. package/dist/tools/generateResearchIdeas.d.ts.map +1 -1
  83. package/dist/tools/generateResearchIdeas.js +5 -17
  84. package/dist/tools/generateResearchIdeas.js.map +1 -1
  85. package/dist/tools/generateResearchQuestions.d.ts +3 -0
  86. package/dist/tools/generateResearchQuestions.d.ts.map +1 -1
  87. package/dist/tools/generateResearchQuestions.js +5 -17
  88. package/dist/tools/generateResearchQuestions.js.map +1 -1
  89. package/dist/tools/generateResponses.d.ts +3 -0
  90. package/dist/tools/generateResponses.d.ts.map +1 -1
  91. package/dist/tools/generateResponses.js +5 -17
  92. package/dist/tools/generateResponses.js.map +1 -1
  93. package/dist/tools/generateSEOGraphTool.d.ts +2 -0
  94. package/dist/tools/generateSEOGraphTool.d.ts.map +1 -1
  95. package/dist/tools/generateSEOGraphTool.js +47 -9
  96. package/dist/tools/generateSEOGraphTool.js.map +1 -1
  97. package/dist/tools/generateTopicalClusters.d.ts +3 -0
  98. package/dist/tools/generateTopicalClusters.d.ts.map +1 -1
  99. package/dist/tools/generateTopicalClusters.js +5 -17
  100. package/dist/tools/generateTopicalClusters.js.map +1 -1
  101. package/dist/tools/generateYoutubeSearchResultsGraph.d.ts.map +1 -1
  102. package/dist/tools/generateYoutubeSearchResultsGraph.js +2 -2
  103. package/dist/tools/generateYoutubeSearchResultsGraph.js.map +1 -1
  104. package/dist/tools/index.d.ts +1 -0
  105. package/dist/tools/index.d.ts.map +1 -1
  106. package/dist/tools/index.js +1 -0
  107. package/dist/tools/index.js.map +1 -1
  108. package/dist/tools/optimizeReasoning.d.ts +34 -0
  109. package/dist/tools/optimizeReasoning.d.ts.map +1 -0
  110. package/dist/tools/optimizeReasoning.js +84 -0
  111. package/dist/tools/optimizeReasoning.js.map +1 -0
  112. package/dist/tools/optimizeTextStructure.d.ts +3 -0
  113. package/dist/tools/optimizeTextStructure.d.ts.map +1 -1
  114. package/dist/tools/optimizeTextStructure.js +7 -19
  115. package/dist/tools/optimizeTextStructure.js.map +1 -1
  116. package/dist/utils/graphInput.d.ts +72 -0
  117. package/dist/utils/graphInput.d.ts.map +1 -0
  118. package/dist/utils/graphInput.js +167 -0
  119. package/dist/utils/graphInput.js.map +1 -0
  120. package/dist/utils/wikilinksMode.d.ts +65 -0
  121. package/dist/utils/wikilinksMode.d.ts.map +1 -0
  122. package/dist/utils/wikilinksMode.js +188 -0
  123. package/dist/utils/wikilinksMode.js.map +1 -0
  124. package/package.json +1 -1
@@ -0,0 +1,167 @@
1
+ import { fetchUrlContentAsText } from "./urlContent.js";
2
+ import { prepareStatementsPayload, prepareWikilinksPayload, statementsContextSettings, } from "./wikilinksMode.js";
3
+ // ISO 8601 only, deliberately. The API's convertAnyDate() reorders D/M/Y and
4
+ // M/D/Y only when one component exceeds 12, so "03.05.2026" meant as 3 May is
5
+ // stored as 5 March — silent, plausible, wrong. And what it cannot read at all
6
+ // it returns false for, which becomes 1970-01-01 downstream. Neither failure is
7
+ // visible to the caller, so anything ambiguous is refused here instead.
8
+ const ISO_DATE = /^\d{4}-\d{2}-\d{2}([T ]\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:?\d{2})?)?$/;
9
+ function timestampIsParsable(value) {
10
+ const trimmed = value.trim();
11
+ return ISO_DATE.test(trimmed) && Number.isFinite(Date.parse(trimmed));
12
+ }
13
+ /**
14
+ * Validate a caller-supplied statements array and its parallel metadata.
15
+ * Returns null when valid, otherwise the error message to hand back.
16
+ */
17
+ export function validateStatementsInput(statements, categories, timestamps) {
18
+ if (statements.length === 0)
19
+ return "statements must not be an empty array";
20
+ if (statements.some((statement) => !statement?.trim()))
21
+ return "statements must not contain empty entries — drop them (and their categories / timestamps entry) before sending";
22
+ // Empty metadata arrays mean "none provided" — only enforce the per-statement
23
+ // pairing when there is actual metadata to pair
24
+ if (categories && categories.length > 0 && categories.length !== statements.length)
25
+ return `categories must have exactly one entry per statement (got ${categories.length} categories for ${statements.length} statements); use an empty array for statements without metadata`;
26
+ if (timestamps && timestamps.length > 0) {
27
+ if (timestamps.length !== statements.length)
28
+ return `timestamps must have exactly one entry per statement (got ${timestamps.length} timestamps for ${statements.length} statements); use an empty string for statements without a date`;
29
+ const bad = timestamps.find((timestamp) => timestamp?.trim() && !timestampIsParsable(timestamp));
30
+ if (bad)
31
+ return `timestamp "${bad}" is not ISO 8601 — use 2026-08-02 or 2026-08-02T14:30:00Z. Day-first and month-first formats are refused because the API cannot tell them apart below the 13th of the month.`;
32
+ }
33
+ return null;
34
+ }
35
+ /**
36
+ * Resolve the mutually exclusive content inputs (text / url / statements) into
37
+ * the body fields of a graph request. `statements` skips the text-splitting
38
+ * path entirely and carries optional parallel `categories` (metadata labels)
39
+ * and `timestamps` (dates) arrays, one entry per statement.
40
+ */
41
+ export async function resolveGraphInput(params) {
42
+ const { statements, categories, timestamps, wikilinksMode } = params;
43
+ const hasText = Boolean(params.text?.trim());
44
+ const hasUrl = Boolean(params.url);
45
+ if (statements && statements.length > 0) {
46
+ if (hasText || hasUrl) {
47
+ return {
48
+ ok: false,
49
+ error: "Provide only one of: statements, text, or url — not statements together with text/url",
50
+ };
51
+ }
52
+ const invalid = validateStatementsInput(statements, categories, timestamps);
53
+ if (invalid)
54
+ return { ok: false, error: invalid };
55
+ return {
56
+ ok: true,
57
+ payload: prepareStatementsPayload(statements, categories, wikilinksMode, timestamps),
58
+ };
59
+ }
60
+ let contentText;
61
+ if (hasUrl) {
62
+ const result = await fetchUrlContentAsText(params.url);
63
+ if (!result.ok)
64
+ return { ok: false, error: result.error };
65
+ contentText = result.contentText;
66
+ if (!contentText?.trim())
67
+ return { ok: false, error: "URL did not return any text content" };
68
+ }
69
+ else if (hasText) {
70
+ contentText = params.text;
71
+ }
72
+ else {
73
+ return {
74
+ ok: false,
75
+ error: "Provide one of: text, url, or statements for analysis",
76
+ };
77
+ }
78
+ return {
79
+ ok: true,
80
+ payload: {
81
+ text: contentText,
82
+ ...prepareWikilinksPayload(contentText, wikilinksMode),
83
+ },
84
+ };
85
+ }
86
+ /**
87
+ * Resolve the `contexts` array of the multi-graph comparison tools into the
88
+ * items of a /graphsAndStatements body.
89
+ *
90
+ * Statements are only read when EVERY context has them (routes/graphs.js:
91
+ * `contexts.every(context => context.statements)`), so a statements item in a
92
+ * mixed array is joined into text — what url and graphName items resolve to
93
+ * anyway, and its categories and timestamps are dropped with it.
94
+ *
95
+ * Naming is the app's job: getContextForEntry (lib/context.js) gives every
96
+ * unnamed statements context a uuid fragment, because upstream creates the
97
+ * context by name. Sending statements to an app that predates that fix hangs
98
+ * for two minutes and returns 504, as does sending timestamps to one that
99
+ * predates the missing-`Instruments`-require fix in routes/graphs.js.
100
+ */
101
+ export async function resolveContexts(items, fetchGraphTextByName) {
102
+ const resolved = [];
103
+ for (let i = 0; i < items.length; i++) {
104
+ const item = items[i];
105
+ if ("statements" in item) {
106
+ const invalid = validateStatementsInput(item.statements, item.categories, item.timestamps);
107
+ if (invalid)
108
+ return { ok: false, error: `Context at index ${i}: ${invalid}` };
109
+ resolved.push({
110
+ statements: item.statements,
111
+ ...(item.categories?.length ? { categories: item.categories } : {}),
112
+ ...(item.timestamps?.length ? { timestamps: item.timestamps } : {}),
113
+ });
114
+ continue;
115
+ }
116
+ if ("text" in item) {
117
+ if (!item.text.trim())
118
+ return { ok: false, error: `Context at index ${i} has empty text.` };
119
+ resolved.push({ text: item.text });
120
+ continue;
121
+ }
122
+ if ("url" in item) {
123
+ const result = await fetchUrlContentAsText(item.url);
124
+ if (!result.ok)
125
+ return {
126
+ ok: false,
127
+ error: `URL at context index ${i} failed: ${result.error}`,
128
+ };
129
+ if (!result.contentText?.trim())
130
+ return {
131
+ ok: false,
132
+ error: `URL at context index ${i} did not return any text content`,
133
+ };
134
+ resolved.push({ text: result.contentText });
135
+ continue;
136
+ }
137
+ if ("graphName" in item) {
138
+ const result = await fetchGraphTextByName(item.graphName);
139
+ if (!result.ok)
140
+ return {
141
+ ok: false,
142
+ error: `Graph at context index ${i} failed: ${result.error}`,
143
+ };
144
+ resolved.push({ text: result.text });
145
+ continue;
146
+ }
147
+ return {
148
+ ok: false,
149
+ error: `Context at index ${i} must be { text }, { statements }, { url }, or { graphName }.`,
150
+ };
151
+ }
152
+ if (!resolved.every((item) => "statements" in item)) {
153
+ return {
154
+ ok: true,
155
+ contexts: resolved.map((item) => "statements" in item ? { text: item.statements.join("\n") } : item),
156
+ };
157
+ }
158
+ const hasCategories = resolved.some((item) => "categories" in item &&
159
+ (item.categories ?? []).some((entry) => entry.length > 0));
160
+ const contextSettings = statementsContextSettings(undefined, hasCategories);
161
+ return {
162
+ ok: true,
163
+ contexts: resolved,
164
+ ...(Object.keys(contextSettings).length > 0 ? { contextSettings } : {}),
165
+ };
166
+ }
167
+ //# sourceMappingURL=graphInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphInput.js","sourceRoot":"","sources":["../../src/utils/graphInput.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * LLM-facing presets for how [[wikilinks]] in the submitted text are turned
4
+ * into graph nodes. Each preset maps to a consistent combination of the
5
+ * engine's textProcessingSettings (and, for the parent modes, a statements +
6
+ * per-statement categories payload), so callers never compose the raw
7
+ * vocabulary (doubleSquarebracketsProcessing / mentionsProcessing /
8
+ * partOfSpeechToProcess / categoriesAsMentions) themselves.
9
+ *
10
+ * The settings are applied by the backend only when the graph context is
11
+ * created: always for doNotSave generation (ephemeral context), and on the
12
+ * FIRST upload for saved graphs. An existing saved graph keeps the settings
13
+ * it was created with.
14
+ *
15
+ * Parent modes ('obsidianStyle', 'parentAndConcepts') use the same mechanism
16
+ * as the InfraNodus Obsidian plugin: statements travel as an array with a
17
+ * per-statement categories array, and categoriesAsMentions turns each
18
+ * category into a mention token attached to that statement only. The engine
19
+ * names those mentions [[category]] (bracketed) when doublebrackets are
20
+ * processed and single squarebrackets are ignored — so parent-page nodes
21
+ * share the exact [[name]] namespace with inline wikilinks and merge with
22
+ * nodes from graphs built in 'default'/'wikilinksOnly' modes.
23
+ *
24
+ * Parent extraction contract (parent modes), in priority order per line:
25
+ * 1. A markdown heading (# through ######) sets the CURRENT PARENT for all
26
+ * statements below it, until the next heading. `## [[Page A]]` sets the
27
+ * parent to "Page A"; a plain heading `## Introduction` sets it to
28
+ * "Introduction". Heading lines are not statements themselves.
29
+ * 2. A line starting with `[[Parent Page]]: ` (colon required) overrides
30
+ * the section parent for that line only; the prefix is removed from the
31
+ * statement text.
32
+ * 3. Any other line becomes a statement under the current section parent
33
+ * (or no parent before the first heading).
34
+ * Note `#tag` without a space after the hashes is a hashtag, not a heading.
35
+ */
36
+ export declare const WikilinksModeEnum: z.ZodEnum<["default", "wikilinksOnly", "obsidianStyle", "parentAndConcepts", "plainText"]>;
37
+ export type WikilinksMode = z.infer<typeof WikilinksModeEnum>;
38
+ export declare const wikilinksModeDescription: string;
39
+ export interface WikilinksPayload {
40
+ text?: string;
41
+ statements?: string[];
42
+ categories?: string[][];
43
+ timestamps?: string[];
44
+ contextSettings?: Record<string, unknown>;
45
+ }
46
+ /**
47
+ * Payload for callers that already hold discrete statements (and optionally
48
+ * parallel per-statement categories / timestamps arrays), so nothing has to be
49
+ * parsed out of a text blob. Mode-specific bracket handling still applies and
50
+ * overrides the category defaults where the two disagree.
51
+ */
52
+ export declare function prepareStatementsPayload(statements: string[], categories: string[][] | undefined, mode: WikilinksMode | undefined, timestamps?: string[]): WikilinksPayload;
53
+ /**
54
+ * Processing settings for a statements upload. The API reads these from the
55
+ * top level of the body (`contextSettings`), so multi-context requests share
56
+ * one set across all of their contexts.
57
+ */
58
+ export declare function statementsContextSettings(mode: WikilinksMode | undefined, hasCategories: boolean): Record<string, unknown>;
59
+ /**
60
+ * Translate the mode + content into the request-body fields to merge into
61
+ * the /graphAndStatements payload. Returns {} for 'default' so callers can
62
+ * spread it unconditionally over a body that already carries `text`.
63
+ */
64
+ export declare function prepareWikilinksPayload(contentText: string, mode: WikilinksMode | undefined): WikilinksPayload;
65
+ //# sourceMappingURL=wikilinksMode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wikilinksMode.d.ts","sourceRoot":"","sources":["../../src/utils/wikilinksMode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,iBAAiB,4FAM5B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE9D,eAAO,MAAM,wBAAwB,QAS4E,CAAC;AAQlH,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAsDD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACvC,UAAU,EAAE,MAAM,EAAE,EACpB,UAAU,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,EAClC,IAAI,EAAE,aAAa,GAAG,SAAS,EAC/B,UAAU,CAAC,EAAE,MAAM,EAAE,GACnB,gBAAgB,CAiBlB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACxC,IAAI,EAAE,aAAa,GAAG,SAAS,EAC/B,aAAa,EAAE,OAAO,GACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACtC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,aAAa,GAAG,SAAS,GAC7B,gBAAgB,CAyClB"}
@@ -0,0 +1,188 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * LLM-facing presets for how [[wikilinks]] in the submitted text are turned
4
+ * into graph nodes. Each preset maps to a consistent combination of the
5
+ * engine's textProcessingSettings (and, for the parent modes, a statements +
6
+ * per-statement categories payload), so callers never compose the raw
7
+ * vocabulary (doubleSquarebracketsProcessing / mentionsProcessing /
8
+ * partOfSpeechToProcess / categoriesAsMentions) themselves.
9
+ *
10
+ * The settings are applied by the backend only when the graph context is
11
+ * created: always for doNotSave generation (ephemeral context), and on the
12
+ * FIRST upload for saved graphs. An existing saved graph keeps the settings
13
+ * it was created with.
14
+ *
15
+ * Parent modes ('obsidianStyle', 'parentAndConcepts') use the same mechanism
16
+ * as the InfraNodus Obsidian plugin: statements travel as an array with a
17
+ * per-statement categories array, and categoriesAsMentions turns each
18
+ * category into a mention token attached to that statement only. The engine
19
+ * names those mentions [[category]] (bracketed) when doublebrackets are
20
+ * processed and single squarebrackets are ignored — so parent-page nodes
21
+ * share the exact [[name]] namespace with inline wikilinks and merge with
22
+ * nodes from graphs built in 'default'/'wikilinksOnly' modes.
23
+ *
24
+ * Parent extraction contract (parent modes), in priority order per line:
25
+ * 1. A markdown heading (# through ######) sets the CURRENT PARENT for all
26
+ * statements below it, until the next heading. `## [[Page A]]` sets the
27
+ * parent to "Page A"; a plain heading `## Introduction` sets it to
28
+ * "Introduction". Heading lines are not statements themselves.
29
+ * 2. A line starting with `[[Parent Page]]: ` (colon required) overrides
30
+ * the section parent for that line only; the prefix is removed from the
31
+ * statement text.
32
+ * 3. Any other line becomes a statement under the current section parent
33
+ * (or no parent before the first heading).
34
+ * Note `#tag` without a space after the hashes is a hashtag, not a heading.
35
+ */
36
+ export const WikilinksModeEnum = z.enum([
37
+ "default",
38
+ "wikilinksOnly",
39
+ "obsidianStyle",
40
+ "parentAndConcepts",
41
+ "plainText",
42
+ ]);
43
+ export const wikilinksModeDescription = "How [[wikilinks]] in the text become graph nodes. " +
44
+ "'default': wikilinks become [[entity]] nodes; statements that contain wikilinks use only those, statements without any are processed word-by-word. " +
45
+ "'wikilinksOnly': ONLY [[wikilinks]] become nodes, all other words are ignored; nearby wikilinks connect via a sliding co-occurrence window — use for entity/ontology/link statements like '[[alice]] works with [[bob]]' or '[[Page A]] links to [[Page B]]'. " +
46
+ "'obsidianStyle': like Obsidian's graph view — markdown headings set the parent page for the statements below them ('## [[Page A]]' or a plain '## Section Title'), and a line may override its parent with a '[[Parent Page]]: ' prefix (colon required); the parent becomes a [[page]] node connected to every concept of its statements, while concepts do NOT connect to each other (star topology around pages/sections). " +
47
+ "'parentAndConcepts': same heading/prefix parent contract, but concepts also keep their normal co-occurrence connections — best for mixed content (notes, docs, articles) where you want both section/page provenance and a real concept graph. " +
48
+ "'plainText': brackets are stripped and everything is processed as ordinary words. " +
49
+ "In all modes parent and wikilink nodes share the [[name]] namespace, so graphs remain comparable/mergeable. " +
50
+ "With `statements` + `categories` supplied directly, parent extraction is skipped and those categories become the mention labels ('obsidianStyle' still gives the star topology). " +
51
+ "Takes effect when the graph is generated or first created; an existing saved graph keeps its original setting.";
52
+ const PARENT_PREFIX_RE = /^\s*\[\[([^\]]+)\]\]:\s*/;
53
+ // Heading: 1-6 hashes followed by whitespace ("#tag" without a space is a
54
+ // hashtag, not a heading). Trailing closing hashes (ATX style) are dropped.
55
+ const HEADING_RE = /^\s*(#{1,6})\s+(.+?)\s*#*\s*$/;
56
+ const HEADING_WIKILINK_RE = /^\[\[([^\]]+)\]\]$/;
57
+ /**
58
+ * Bracket handling for a mode, independent of where the statements come from
59
+ * (split out of the text or supplied directly by the caller).
60
+ */
61
+ function bracketSettings(mode) {
62
+ switch (mode) {
63
+ case "wikilinksOnly":
64
+ return {
65
+ doubleSquarebracketsProcessing: "PROCESS_AS_HASHTAGS_IGNORE_THE_REST",
66
+ partOfSpeechToProcess: "HASHTAGS_ONLY",
67
+ };
68
+ case "plainText":
69
+ return { doubleSquarebracketsProcessing: "IGNORE_BRACKETS" };
70
+ default:
71
+ return {};
72
+ }
73
+ }
74
+ /**
75
+ * Settings that turn each per-statement category into a mention node attached
76
+ * to that statement only. See the module note above for why the bracket
77
+ * combination matters: it keeps category nodes in the [[name]] namespace.
78
+ */
79
+ function categorySettings(mode) {
80
+ if (mode === "plainText") {
81
+ // Brackets stay stripped in this mode; the mentions still become nodes,
82
+ // just outside the [[name]] namespace.
83
+ return {
84
+ categoriesAsMentions: true,
85
+ mentionsProcessing: "CONNECT_TO_ALL_CONCEPTS",
86
+ doubleSquarebracketsProcessing: "IGNORE_BRACKETS",
87
+ };
88
+ }
89
+ return {
90
+ categoriesAsMentions: true,
91
+ mentionsProcessing: mode === "obsidianStyle"
92
+ ? "CONNECT_TO_CONCEPTS_ONLY"
93
+ : "CONNECT_TO_ALL_CONCEPTS",
94
+ // IGNORE_BRACKETS on single brackets + processed doublebrackets is the
95
+ // combination that makes the engine name category mentions [[category]]
96
+ // instead of @category — keeping them in the same namespace as inline
97
+ // wikilinks.
98
+ squareBracketsProcessing: "IGNORE_BRACKETS",
99
+ doubleSquarebracketsProcessing: "PROCESS_AS_HASHTAGS",
100
+ };
101
+ }
102
+ /**
103
+ * Payload for callers that already hold discrete statements (and optionally
104
+ * parallel per-statement categories / timestamps arrays), so nothing has to be
105
+ * parsed out of a text blob. Mode-specific bracket handling still applies and
106
+ * overrides the category defaults where the two disagree.
107
+ */
108
+ export function prepareStatementsPayload(statements, categories, mode, timestamps) {
109
+ // Only actual labels matter: a model that sends [[], [], []] for "no
110
+ // metadata" must not flip the processing settings for the whole upload.
111
+ const hasCategories = Array.isArray(categories) &&
112
+ categories.some((entry) => Array.isArray(entry) && entry.length > 0);
113
+ const hasTimestamps = Array.isArray(timestamps) && timestamps.length > 0;
114
+ const contextSettings = statementsContextSettings(mode, hasCategories);
115
+ return {
116
+ text: "",
117
+ statements,
118
+ ...(hasCategories ? { categories } : {}),
119
+ ...(hasTimestamps ? { timestamps } : {}),
120
+ // Omit rather than send {} — an empty settings object is not what the
121
+ // text path sends for the default mode either.
122
+ ...(Object.keys(contextSettings).length > 0 ? { contextSettings } : {}),
123
+ };
124
+ }
125
+ /**
126
+ * Processing settings for a statements upload. The API reads these from the
127
+ * top level of the body (`contextSettings`), so multi-context requests share
128
+ * one set across all of their contexts.
129
+ */
130
+ export function statementsContextSettings(mode, hasCategories) {
131
+ // Category mentions only survive under the bracket combination in
132
+ // categorySettings, so it overrides the mode's own bracket handling where
133
+ // the two disagree. 'wikilinksOnly' keeps its HASHTAGS_ONLY part-of-speech
134
+ // filter — that is what restricts concept nodes to [[wikilinks]]; its
135
+ // PROCESS_AS_HASHTAGS_IGNORE_THE_REST would drop the category mentions
136
+ // along with everything else.
137
+ return hasCategories
138
+ ? { ...bracketSettings(mode), ...categorySettings(mode) }
139
+ : bracketSettings(mode);
140
+ }
141
+ /**
142
+ * Translate the mode + content into the request-body fields to merge into
143
+ * the /graphAndStatements payload. Returns {} for 'default' so callers can
144
+ * spread it unconditionally over a body that already carries `text`.
145
+ */
146
+ export function prepareWikilinksPayload(contentText, mode) {
147
+ switch (mode) {
148
+ case "wikilinksOnly":
149
+ case "plainText":
150
+ return { contextSettings: bracketSettings(mode) };
151
+ case "obsidianStyle":
152
+ case "parentAndConcepts": {
153
+ const statements = [];
154
+ const categories = [];
155
+ let sectionParent = null;
156
+ for (const rawLine of contentText.split("\n")) {
157
+ const line = rawLine.trim();
158
+ if (!line)
159
+ continue;
160
+ const heading = line.match(HEADING_RE);
161
+ if (heading) {
162
+ const title = heading[2].trim();
163
+ const wikilink = title.match(HEADING_WIKILINK_RE);
164
+ sectionParent = (wikilink ? wikilink[1] : title).trim() || null;
165
+ continue; // heading lines are structure, not statements
166
+ }
167
+ const prefix = line.match(PARENT_PREFIX_RE);
168
+ if (prefix && line.slice(prefix[0].length).trim()) {
169
+ statements.push(line.slice(prefix[0].length).trim());
170
+ categories.push([prefix[1]]);
171
+ }
172
+ else {
173
+ statements.push(line);
174
+ categories.push(sectionParent ? [sectionParent] : []);
175
+ }
176
+ }
177
+ return {
178
+ text: "",
179
+ statements,
180
+ categories,
181
+ contextSettings: categorySettings(mode),
182
+ };
183
+ }
184
+ default:
185
+ return {};
186
+ }
187
+ }
188
+ //# sourceMappingURL=wikilinksMode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wikilinksMode.js","sourceRoot":"","sources":["../../src/utils/wikilinksMode.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "keywordgraph-mcp-server",
3
- "version": "1.6.2",
3
+ "version": "1.7.3",
4
4
  "description": "KeywordGraph MCP server - A Model Context Protocol server for network thinking and graph analysis",
5
5
  "type": "module",
6
6
  "module": "src/index.ts",