keywordgraph-mcp-server 1.7.0 → 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.
- package/README.md +27 -20
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +8 -2
- package/dist/api/client.js.map +1 -1
- package/dist/api/config-store.d.ts +2 -0
- package/dist/api/config-store.d.ts.map +1 -1
- package/dist/api/config-store.js +7 -0
- package/dist/api/config-store.js.map +1 -1
- package/dist/auth/oauth-provider.d.ts +3 -2
- package/dist/auth/oauth-provider.d.ts.map +1 -1
- package/dist/auth/oauth-provider.js +83 -28
- package/dist/auth/oauth-provider.js.map +1 -1
- package/dist/http-server.js +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -6
- package/dist/index.js.map +1 -1
- package/dist/instructions.js +2 -2
- package/dist/resources/about.d.ts.map +1 -1
- package/dist/resources/about.js +15 -14
- package/dist/resources/about.js.map +1 -1
- package/dist/schemas/index.d.ts +452 -15
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +190 -32
- package/dist/schemas/index.js.map +1 -1
- package/dist/tools/addMemory.d.ts +4 -2
- package/dist/tools/addMemory.d.ts.map +1 -1
- package/dist/tools/addMemory.js +15 -1
- package/dist/tools/addMemory.js.map +1 -1
- package/dist/tools/analyzeExistingGraph.d.ts +1 -0
- package/dist/tools/analyzeExistingGraph.d.ts.map +1 -1
- package/dist/tools/analyzeExistingGraph.js +13 -4
- package/dist/tools/analyzeExistingGraph.js.map +1 -1
- package/dist/tools/analyzeText.d.ts +5 -0
- package/dist/tools/analyzeText.d.ts.map +1 -1
- package/dist/tools/analyzeText.js +18 -21
- package/dist/tools/analyzeText.js.map +1 -1
- package/dist/tools/createKnowledgeGraph.d.ts +6 -0
- package/dist/tools/createKnowledgeGraph.d.ts.map +1 -1
- package/dist/tools/createKnowledgeGraph.js +25 -22
- package/dist/tools/createKnowledgeGraph.js.map +1 -1
- package/dist/tools/developConceptualBridges.d.ts +3 -0
- package/dist/tools/developConceptualBridges.d.ts.map +1 -1
- package/dist/tools/developConceptualBridges.js +5 -17
- package/dist/tools/developConceptualBridges.js.map +1 -1
- package/dist/tools/developLatentTopics.d.ts +3 -0
- package/dist/tools/developLatentTopics.d.ts.map +1 -1
- package/dist/tools/developLatentTopics.js +5 -17
- package/dist/tools/developLatentTopics.js.map +1 -1
- package/dist/tools/developTextTool.d.ts +3 -0
- package/dist/tools/developTextTool.d.ts.map +1 -1
- package/dist/tools/developTextTool.js +9 -19
- package/dist/tools/developTextTool.js.map +1 -1
- package/dist/tools/generateContentGaps.d.ts +3 -0
- package/dist/tools/generateContentGaps.d.ts.map +1 -1
- package/dist/tools/generateContentGaps.js +5 -17
- package/dist/tools/generateContentGaps.js.map +1 -1
- package/dist/tools/generateContextualHint.d.ts +3 -0
- package/dist/tools/generateContextualHint.d.ts.map +1 -1
- package/dist/tools/generateContextualHint.js +5 -17
- package/dist/tools/generateContextualHint.js.map +1 -1
- package/dist/tools/generateDifferenceGraphFromTexts.d.ts +15 -3
- package/dist/tools/generateDifferenceGraphFromTexts.d.ts.map +1 -1
- package/dist/tools/generateDifferenceGraphFromTexts.js +9 -30
- package/dist/tools/generateDifferenceGraphFromTexts.js.map +1 -1
- package/dist/tools/generateKnowledgeGraph.d.ts +6 -0
- package/dist/tools/generateKnowledgeGraph.d.ts.map +1 -1
- package/dist/tools/generateKnowledgeGraph.js +19 -22
- package/dist/tools/generateKnowledgeGraph.js.map +1 -1
- package/dist/tools/generateMergedGraphFromTexts.d.ts +15 -3
- package/dist/tools/generateMergedGraphFromTexts.d.ts.map +1 -1
- package/dist/tools/generateMergedGraphFromTexts.js +9 -30
- package/dist/tools/generateMergedGraphFromTexts.js.map +1 -1
- package/dist/tools/generateOntologyGraph.d.ts +2 -0
- package/dist/tools/generateOntologyGraph.d.ts.map +1 -1
- package/dist/tools/generateOntologyGraph.js +9 -2
- package/dist/tools/generateOntologyGraph.js.map +1 -1
- package/dist/tools/generateOverlapGraphFromTexts.d.ts +15 -3
- package/dist/tools/generateOverlapGraphFromTexts.d.ts.map +1 -1
- package/dist/tools/generateOverlapGraphFromTexts.js +9 -30
- package/dist/tools/generateOverlapGraphFromTexts.js.map +1 -1
- package/dist/tools/generateResearchIdeas.d.ts +3 -0
- package/dist/tools/generateResearchIdeas.d.ts.map +1 -1
- package/dist/tools/generateResearchIdeas.js +5 -17
- package/dist/tools/generateResearchIdeas.js.map +1 -1
- package/dist/tools/generateResearchQuestions.d.ts +3 -0
- package/dist/tools/generateResearchQuestions.d.ts.map +1 -1
- package/dist/tools/generateResearchQuestions.js +5 -17
- package/dist/tools/generateResearchQuestions.js.map +1 -1
- package/dist/tools/generateResponses.d.ts +3 -0
- package/dist/tools/generateResponses.d.ts.map +1 -1
- package/dist/tools/generateResponses.js +5 -17
- package/dist/tools/generateResponses.js.map +1 -1
- package/dist/tools/generateSEOGraphTool.d.ts +2 -0
- package/dist/tools/generateSEOGraphTool.d.ts.map +1 -1
- package/dist/tools/generateSEOGraphTool.js +47 -9
- package/dist/tools/generateSEOGraphTool.js.map +1 -1
- package/dist/tools/generateTopicalClusters.d.ts +3 -0
- package/dist/tools/generateTopicalClusters.d.ts.map +1 -1
- package/dist/tools/generateTopicalClusters.js +5 -17
- package/dist/tools/generateTopicalClusters.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/optimizeReasoning.d.ts +34 -0
- package/dist/tools/optimizeReasoning.d.ts.map +1 -0
- package/dist/tools/optimizeReasoning.js +84 -0
- package/dist/tools/optimizeReasoning.js.map +1 -0
- package/dist/tools/optimizeTextStructure.d.ts +3 -0
- package/dist/tools/optimizeTextStructure.d.ts.map +1 -1
- package/dist/tools/optimizeTextStructure.js +7 -19
- package/dist/tools/optimizeTextStructure.js.map +1 -1
- package/dist/utils/graphInput.d.ts +72 -0
- package/dist/utils/graphInput.d.ts.map +1 -0
- package/dist/utils/graphInput.js +167 -0
- package/dist/utils/graphInput.js.map +1 -0
- package/dist/utils/wikilinksMode.d.ts +65 -0
- package/dist/utils/wikilinksMode.d.ts.map +1 -0
- package/dist/utils/wikilinksMode.js +188 -0
- package/dist/utils/wikilinksMode.js.map +1 -0
- 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":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EACN,wBAAwB,EACxB,uBAAuB,EACvB,yBAAyB,GAGzB,MAAM,oBAAoB,CAAC;AAe5B,6EAA6E;AAC7E,8EAA8E;AAC9E,+EAA+E;AAC/E,gFAAgF;AAChF,wEAAwE;AACxE,MAAM,QAAQ,GAAG,6EAA6E,CAAC;AAE/F,SAAS,mBAAmB,CAAC,KAAa;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACtC,UAAoB,EACpB,UAAuB,EACvB,UAAqB;IAErB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,uCAAuC,CAAC;IAC5E,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;QACrD,OAAO,gHAAgH,CAAC;IACzH,8EAA8E;IAC9E,gDAAgD;IAChD,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM;QACjF,OAAO,6DAA6D,UAAU,CAAC,MAAM,mBAAmB,UAAU,CAAC,MAAM,kEAAkE,CAAC;IAC7L,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM;YAC1C,OAAO,6DAA6D,UAAU,CAAC,MAAM,mBAAmB,UAAU,CAAC,MAAM,iEAAiE,CAAC;QAC5L,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAC1B,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CACnE,CAAC;QACF,IAAI,GAAG;YACN,OAAO,cAAc,GAAG,+KAA+K,CAAC;IAC1M,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,MAAwB;IAExB,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;IACrE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEnC,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACvB,OAAO;gBACN,EAAE,EAAE,KAAK;gBACT,KAAK,EACJ,uFAAuF;aACxF,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,uBAAuB,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAC5E,IAAI,OAAO;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAClD,OAAO;YACN,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,wBAAwB,CAChC,UAAU,EACV,UAAU,EACV,aAAa,EACb,UAAU,CAC6B;SACxC,CAAC;IACH,CAAC;IAED,IAAI,WAAmB,CAAC;IACxB,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,GAAa,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1D,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACjC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;YACvB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC;IACrE,CAAC;SAAM,IAAI,OAAO,EAAE,CAAC;QACpB,WAAW,GAAG,MAAM,CAAC,IAAc,CAAC;IACrC,CAAC;SAAM,CAAC;QACP,OAAO;YACN,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,uDAAuD;SAC9D,CAAC;IACH,CAAC;IAED,OAAO;QACN,EAAE,EAAE,IAAI;QACR,OAAO,EAAE;YACR,IAAI,EAAE,WAAW;YACjB,GAAG,uBAAuB,CAAC,WAAW,EAAE,aAAa,CAAC;SACtD;KACD,CAAC;AACH,CAAC;AAoBD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,KAAoB,EACpB,oBAEuE;IAEvE,MAAM,QAAQ,GAAmB,EAAE,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,uBAAuB,CACtC,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CACf,CAAC;YACF,IAAI,OAAO;gBACV,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,CAAC,KAAK,OAAO,EAAE,EAAE,CAAC;YAClE,QAAQ,CAAC,IAAI,CAAC;gBACb,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnE,CAAC,CAAC;YACH,SAAS;QACV,CAAC;QACD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,CAAC,kBAAkB,EAAE,CAAC;YACtE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACnC,SAAS;QACV,CAAC;QACD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,EAAE;gBACb,OAAO;oBACN,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,wBAAwB,CAAC,YAAY,MAAM,CAAC,KAAK,EAAE;iBAC1D,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE;gBAC9B,OAAO;oBACN,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,wBAAwB,CAAC,kCAAkC;iBAClE,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YAC5C,SAAS;QACV,CAAC;QACD,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,EAAE;gBACb,OAAO;oBACN,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,0BAA0B,CAAC,YAAY,MAAM,CAAC,KAAK,EAAE;iBAC5D,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACrC,SAAS;QACV,CAAC;QACD,OAAO;YACN,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,oBAAoB,CAAC,+DAA+D;SAC3F,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,IAAI,IAAI,CAAC,EAAE,CAAC;QACrD,OAAO;YACN,EAAE,EAAE,IAAI;YACR,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC/B,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAClE;SACD,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAClC,CAAC,IAAI,EAAE,EAAE,CACR,YAAY,IAAI,IAAI;QACpB,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAC1D,CAAC;IACF,MAAM,eAAe,GAAG,yBAAyB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAC5E,OAAO;QACN,EAAE,EAAE,IAAI;QACR,QAAQ,EAAE,QAA0C;QACpD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvE,CAAC;AACH,CAAC"}
|
|
@@ -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