keywordgraph-mcp-server 1.7.4 → 1.8.5

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 (161) hide show
  1. package/README.md +73 -8
  2. package/dist/api/client.d.ts +3 -1
  3. package/dist/api/client.d.ts.map +1 -1
  4. package/dist/api/client.js +2 -1
  5. package/dist/api/client.js.map +1 -1
  6. package/dist/api/config-store.d.ts +11 -0
  7. package/dist/api/config-store.d.ts.map +1 -1
  8. package/dist/api/config-store.js +7 -0
  9. package/dist/api/config-store.js.map +1 -1
  10. package/dist/config/brand.d.ts.map +1 -1
  11. package/dist/config/brand.js +11 -0
  12. package/dist/config/brand.js.map +1 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +83 -6
  15. package/dist/index.js.map +1 -1
  16. package/dist/instructions.d.ts.map +1 -1
  17. package/dist/instructions.js +10 -3
  18. package/dist/instructions.js.map +1 -1
  19. package/dist/prompts/index.d.ts.map +1 -1
  20. package/dist/prompts/index.js +32 -0
  21. package/dist/prompts/index.js.map +1 -1
  22. package/dist/resources/about.d.ts.map +1 -1
  23. package/dist/resources/about.js +9 -1
  24. package/dist/resources/about.js.map +1 -1
  25. package/dist/schemas/index.d.ts +466 -63
  26. package/dist/schemas/index.d.ts.map +1 -1
  27. package/dist/schemas/index.js +435 -34
  28. package/dist/schemas/index.js.map +1 -1
  29. package/dist/tools/addMemory.d.ts +1 -0
  30. package/dist/tools/addMemory.d.ts.map +1 -1
  31. package/dist/tools/addProjectLearnings.d.ts +30 -0
  32. package/dist/tools/addProjectLearnings.d.ts.map +1 -0
  33. package/dist/tools/addProjectLearnings.js +197 -0
  34. package/dist/tools/addProjectLearnings.js.map +1 -0
  35. package/dist/tools/analyzeLlmResults.d.ts +1 -1
  36. package/dist/tools/analyzeLlmResults.d.ts.map +1 -1
  37. package/dist/tools/analyzeLlmResults.js +5 -2
  38. package/dist/tools/analyzeLlmResults.js.map +1 -1
  39. package/dist/tools/analyzeText.d.ts +1 -0
  40. package/dist/tools/analyzeText.d.ts.map +1 -1
  41. package/dist/tools/analyzeTextSignature.d.ts +38 -0
  42. package/dist/tools/analyzeTextSignature.d.ts.map +1 -0
  43. package/dist/tools/analyzeTextSignature.js +82 -0
  44. package/dist/tools/analyzeTextSignature.js.map +1 -0
  45. package/dist/tools/createKnowledgeGraph.d.ts +1 -0
  46. package/dist/tools/createKnowledgeGraph.d.ts.map +1 -1
  47. package/dist/tools/deleteGraph.d.ts +43 -0
  48. package/dist/tools/deleteGraph.d.ts.map +1 -0
  49. package/dist/tools/deleteGraph.js +145 -0
  50. package/dist/tools/deleteGraph.js.map +1 -0
  51. package/dist/tools/deleteStatements.d.ts +106 -0
  52. package/dist/tools/deleteStatements.d.ts.map +1 -0
  53. package/dist/tools/deleteStatements.js +288 -0
  54. package/dist/tools/deleteStatements.js.map +1 -0
  55. package/dist/tools/developConceptualBridges.d.ts +2 -1
  56. package/dist/tools/developConceptualBridges.d.ts.map +1 -1
  57. package/dist/tools/developLatentTopics.d.ts +2 -1
  58. package/dist/tools/developLatentTopics.d.ts.map +1 -1
  59. package/dist/tools/developTextTool.d.ts +2 -1
  60. package/dist/tools/developTextTool.d.ts.map +1 -1
  61. package/dist/tools/enableProjectLearnings.d.ts +27 -0
  62. package/dist/tools/enableProjectLearnings.d.ts.map +1 -0
  63. package/dist/tools/enableProjectLearnings.js +68 -0
  64. package/dist/tools/enableProjectLearnings.js.map +1 -0
  65. package/dist/tools/generateContentGaps.d.ts +1 -0
  66. package/dist/tools/generateContentGaps.d.ts.map +1 -1
  67. package/dist/tools/generateContextualHint.d.ts +1 -0
  68. package/dist/tools/generateContextualHint.d.ts.map +1 -1
  69. package/dist/tools/generateDifferenceGraphFromTexts.d.ts +1 -0
  70. package/dist/tools/generateDifferenceGraphFromTexts.d.ts.map +1 -1
  71. package/dist/tools/generateDifferenceGraphFromTexts.js +1 -1
  72. package/dist/tools/generateDifferenceGraphFromTexts.js.map +1 -1
  73. package/dist/tools/generateKnowledgeGraph.d.ts +1 -0
  74. package/dist/tools/generateKnowledgeGraph.d.ts.map +1 -1
  75. package/dist/tools/generateMergedGraphFromTexts.d.ts +1 -0
  76. package/dist/tools/generateMergedGraphFromTexts.d.ts.map +1 -1
  77. package/dist/tools/generateMergedGraphFromTexts.js +1 -1
  78. package/dist/tools/generateMergedGraphFromTexts.js.map +1 -1
  79. package/dist/tools/generateOntologyGraph.d.ts +10 -3
  80. package/dist/tools/generateOntologyGraph.d.ts.map +1 -1
  81. package/dist/tools/generateOntologyGraph.js +142 -34
  82. package/dist/tools/generateOntologyGraph.js.map +1 -1
  83. package/dist/tools/generateOverlapGraphFromTexts.d.ts +1 -0
  84. package/dist/tools/generateOverlapGraphFromTexts.d.ts.map +1 -1
  85. package/dist/tools/generateOverlapGraphFromTexts.js +1 -1
  86. package/dist/tools/generateOverlapGraphFromTexts.js.map +1 -1
  87. package/dist/tools/generateResearchIdeas.d.ts +2 -1
  88. package/dist/tools/generateResearchIdeas.d.ts.map +1 -1
  89. package/dist/tools/generateResearchQuestions.d.ts +2 -1
  90. package/dist/tools/generateResearchQuestions.d.ts.map +1 -1
  91. package/dist/tools/generateResponses.d.ts +2 -1
  92. package/dist/tools/generateResponses.d.ts.map +1 -1
  93. package/dist/tools/generateSEOGraphTool.d.ts +1 -0
  94. package/dist/tools/generateSEOGraphTool.d.ts.map +1 -1
  95. package/dist/tools/generateSEOGraphTool.js +1 -1
  96. package/dist/tools/generateSEOGraphTool.js.map +1 -1
  97. package/dist/tools/generateTopicalClusters.d.ts +1 -0
  98. package/dist/tools/generateTopicalClusters.d.ts.map +1 -1
  99. package/dist/tools/getProjectLearnings.d.ts +30 -0
  100. package/dist/tools/getProjectLearnings.d.ts.map +1 -0
  101. package/dist/tools/getProjectLearnings.js +151 -0
  102. package/dist/tools/getProjectLearnings.js.map +1 -0
  103. package/dist/tools/index.d.ts +8 -0
  104. package/dist/tools/index.d.ts.map +1 -1
  105. package/dist/tools/index.js +8 -0
  106. package/dist/tools/index.js.map +1 -1
  107. package/dist/tools/optimizeKnowledgeBase.d.ts +41 -0
  108. package/dist/tools/optimizeKnowledgeBase.d.ts.map +1 -0
  109. package/dist/tools/optimizeKnowledgeBase.js +230 -0
  110. package/dist/tools/optimizeKnowledgeBase.js.map +1 -0
  111. package/dist/tools/optimizeReasoning.d.ts +2 -1
  112. package/dist/tools/optimizeReasoning.d.ts.map +1 -1
  113. package/dist/tools/optimizeTextStructure.d.ts +2 -1
  114. package/dist/tools/optimizeTextStructure.d.ts.map +1 -1
  115. package/dist/tools/submitWorkflowFeedback.d.ts +35 -0
  116. package/dist/tools/submitWorkflowFeedback.d.ts.map +1 -0
  117. package/dist/tools/submitWorkflowFeedback.js +62 -0
  118. package/dist/tools/submitWorkflowFeedback.js.map +1 -0
  119. package/dist/tools/updateStatements.d.ts +134 -0
  120. package/dist/tools/updateStatements.d.ts.map +1 -0
  121. package/dist/tools/updateStatements.js +378 -0
  122. package/dist/tools/updateStatements.js.map +1 -0
  123. package/dist/types/index.d.ts +30 -0
  124. package/dist/types/index.d.ts.map +1 -1
  125. package/dist/utils/callTracking.d.ts +29 -0
  126. package/dist/utils/callTracking.d.ts.map +1 -0
  127. package/dist/utils/callTracking.js +88 -0
  128. package/dist/utils/callTracking.js.map +1 -0
  129. package/dist/utils/feedback.d.ts +63 -0
  130. package/dist/utils/feedback.d.ts.map +1 -0
  131. package/dist/utils/feedback.js +115 -0
  132. package/dist/utils/feedback.js.map +1 -0
  133. package/dist/utils/graphInput.d.ts +6 -1
  134. package/dist/utils/graphInput.d.ts.map +1 -1
  135. package/dist/utils/graphInput.js +5 -4
  136. package/dist/utils/graphInput.js.map +1 -1
  137. package/dist/utils/graphLookup.d.ts +29 -0
  138. package/dist/utils/graphLookup.d.ts.map +1 -0
  139. package/dist/utils/graphLookup.js +57 -0
  140. package/dist/utils/graphLookup.js.map +1 -0
  141. package/dist/utils/knowledgeBase.d.ts +21 -0
  142. package/dist/utils/knowledgeBase.d.ts.map +1 -0
  143. package/dist/utils/knowledgeBase.js +110 -0
  144. package/dist/utils/knowledgeBase.js.map +1 -0
  145. package/dist/utils/learnings.d.ts +121 -0
  146. package/dist/utils/learnings.d.ts.map +1 -0
  147. package/dist/utils/learnings.js +339 -0
  148. package/dist/utils/learnings.js.map +1 -0
  149. package/dist/utils/textSignature.d.ts +231 -0
  150. package/dist/utils/textSignature.d.ts.map +1 -0
  151. package/dist/utils/textSignature.js +738 -0
  152. package/dist/utils/textSignature.js.map +1 -0
  153. package/dist/utils/wikilinksMode.d.ts +12 -2
  154. package/dist/utils/wikilinksMode.d.ts.map +1 -1
  155. package/dist/utils/wikilinksMode.js +18 -5
  156. package/dist/utils/wikilinksMode.js.map +1 -1
  157. package/llms-full.infranodus.txt +39 -1
  158. package/llms-full.txt +39 -1
  159. package/llms.infranodus.txt +2 -0
  160. package/llms.txt +2 -0
  161. package/package.json +4 -2
@@ -0,0 +1,82 @@
1
+ import { brand } from "../config/brand.js";
2
+ import { AnalyzeTextSignatureSchemaBase, } from "../schemas/index.js";
3
+ import { makeInfraNodusRequest } from "../api/client.js";
4
+ import { resolveGraphInput } from "../utils/graphInput.js";
5
+ import { buildTextSignature } from "../utils/textSignature.js";
6
+ function errorContent(message) {
7
+ return {
8
+ content: [
9
+ { type: "text", text: JSON.stringify({ error: message }) },
10
+ ],
11
+ isError: true,
12
+ };
13
+ }
14
+ export const analyzeTextSignatureTool = {
15
+ name: "analyze_text_signature",
16
+ definition: {
17
+ title: "Text Signature: structure, rhythm, and AI-likeness of a text",
18
+ description: `Structural and rhythmic signature of a text, URL, or YouTube transcript: how the discourse moves through its ${brand.name} concept network (burstiness, fractal scaling, multifractality, topic crossings), how its topics are distributed (modularity, diversity, entropy), and the sentence-length rhythm of the source. Every number comes with a plain-language reading, the profile gets a name (essay, digest, anthology, notes...), and a final layer weighs the rhythm evidence into a hedged AI-likeness estimate. Use to compare writing styles, characterise an author or genre, and flag flat, uniformly paced text typical of generated content. Not a detector on its own.`,
19
+ inputSchema: AnalyzeTextSignatureSchemaBase.shape,
20
+ annotations: {
21
+ readOnlyHint: true,
22
+ idempotentHint: true,
23
+ destructiveHint: false,
24
+ },
25
+ },
26
+ handler: async (params) => {
27
+ try {
28
+ // The amplitude and sentence measures need the raw graph (node
29
+ // positions and communities) and the raw statements (their
30
+ // graphCoordinates, statementHashtags and content), so the compaction
31
+ // flags are off. No AI topics, no summary: the tool is numeric.
32
+ const queryParams = new URLSearchParams({
33
+ doNotSave: "true",
34
+ addStats: "true",
35
+ ...(params.multifractal ? { multifractal: "true" } : {}),
36
+ includeStatements: "true",
37
+ includeGraph: "true",
38
+ compactGraph: "false",
39
+ compactStatements: "false",
40
+ includeGraphSummary: "false",
41
+ });
42
+ if (params.maxNodes && params.maxNodes > 0) {
43
+ queryParams.set("maxnodes", String(params.maxNodes));
44
+ }
45
+ const endpoint = `/graphAndStatements?${queryParams.toString()}`;
46
+ const input = await resolveGraphInput(params);
47
+ if (!input.ok)
48
+ return errorContent(input.error);
49
+ const response = await makeInfraNodusRequest(endpoint, {
50
+ ...input.payload,
51
+ modifyAnalyzedText: params.modifyAnalyzedText ?? "none",
52
+ });
53
+ if (response.error)
54
+ return errorContent(response.error);
55
+ // The raw (non-compacted) graph carries more than the typed
56
+ // GraphResponse declares: node keys and positions, statement
57
+ // hashtags and coordinates.
58
+ const graph = response.graph?.graphologyGraph;
59
+ const attributes = graph?.attributes ?? {};
60
+ if (!attributes.fractal_variability && !attributes.diversity_stats) {
61
+ return errorContent("The API returned no network statistics for this text (too short, or a backend without fractal_variability).");
62
+ }
63
+ const output = buildTextSignature({
64
+ modularity: attributes.modularity,
65
+ diversity: attributes.diversity_stats,
66
+ fractal: attributes.fractal_variability,
67
+ degreeDistribution: attributes.degree_distribution ?? null,
68
+ nodes: graph?.nodes ?? [],
69
+ statements: response.statements ?? [],
70
+ });
71
+ return {
72
+ content: [
73
+ { type: "text", text: JSON.stringify(output, null, 2) },
74
+ ],
75
+ };
76
+ }
77
+ catch (error) {
78
+ return errorContent(error instanceof Error ? error.message : String(error));
79
+ }
80
+ },
81
+ };
82
+ //# sourceMappingURL=analyzeTextSignature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzeTextSignature.js","sourceRoot":"","sources":["../../src/tools/analyzeTextSignature.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ export declare const createKnowledgeGraphTool: {
11
11
  url: z.ZodOptional<z.ZodString>;
12
12
  statements: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
13
13
  categories: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodString, "many">, "many">>;
14
+ categoriesAsNodes: z.ZodDefault<z.ZodBoolean>;
14
15
  timestamps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
15
16
  includeStatements: z.ZodDefault<z.ZodBoolean>;
16
17
  includeGraph: z.ZodDefault<z.ZodBoolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"createKnowledgeGraph.d.ts","sourceRoot":"","sources":["../../src/tools/createKnowledgeGraph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAcxD,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;sBAaZ,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC;;;;;;;;;;;;CAiGzD,CAAC"}
1
+ {"version":3,"file":"createKnowledgeGraph.d.ts","sourceRoot":"","sources":["../../src/tools/createKnowledgeGraph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAcxD,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAaZ,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC;;;;;;;;;;;;CAiGzD,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * delete_graph — remove one graph from the caller's own account entirely:
3
+ * statements, revisions, settings, and URL. The companion of
4
+ * delete_statements (which keeps the graph) for the case where the graph
5
+ * itself should go.
6
+ *
7
+ * Same safety shape: the graph must exist in this account, a dry run is
8
+ * the default, and the write only happens with `confirm: true` or an
9
+ * elicitation form the user accepts. Ownership is enforced by the app
10
+ * (the graph is resolved from the API key's own contexts list; userName
11
+ * is refused) and again by the backend, which scopes the delete to the
12
+ * same user.
13
+ */
14
+ import { z } from "zod";
15
+ import { DeleteGraphSchema } from "../schemas/index.js";
16
+ import type { ToolExtra } from "../types/index.js";
17
+ type Params = z.infer<typeof DeleteGraphSchema>;
18
+ export declare const deleteGraphTool: {
19
+ name: string;
20
+ definition: {
21
+ title: string;
22
+ description: string;
23
+ inputSchema: {
24
+ graphName: z.ZodString;
25
+ confirm: z.ZodDefault<z.ZodBoolean>;
26
+ };
27
+ annotations: {
28
+ readOnlyHint: boolean;
29
+ destructiveHint: boolean;
30
+ idempotentHint: boolean;
31
+ openWorldHint: boolean;
32
+ };
33
+ };
34
+ handler: (params: Params, extra?: ToolExtra) => Promise<{
35
+ isError?: boolean | undefined;
36
+ content: {
37
+ type: "text";
38
+ text: string;
39
+ }[];
40
+ }>;
41
+ };
42
+ export {};
43
+ //# sourceMappingURL=deleteGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteGraph.d.ts","sourceRoot":"","sources":["../../src/tools/deleteGraph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAIxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,KAAK,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAgFhD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;sBAiBH,MAAM,UAAU,SAAS;;;;;;;CAwEjD,CAAC"}
@@ -0,0 +1,145 @@
1
+ import { brand } from "../config/brand.js";
2
+ import { DeleteGraphSchema } from "../schemas/index.js";
3
+ import { makeInfraNodusRequest } from "../api/client.js";
4
+ import { errorText, findGraphByName } from "../utils/graphLookup.js";
5
+ import { describeRequestError } from "./deleteStatements.js";
6
+ function textResult(payload, isError = false) {
7
+ return {
8
+ content: [
9
+ { type: "text", text: JSON.stringify(payload, null, 2) },
10
+ ],
11
+ ...(isError ? { isError: true } : {}),
12
+ };
13
+ }
14
+ async function requestGraphDeletion(graphName, dryRun) {
15
+ try {
16
+ const data = (await makeInfraNodusRequest("/deleteGraph", {
17
+ name: graphName,
18
+ dryRun,
19
+ }));
20
+ if (!data || typeof data !== "object") {
21
+ return { ok: false, error: "Unexpected response from /deleteGraph." };
22
+ }
23
+ if (data.error)
24
+ return { ok: false, error: errorText(data.error) };
25
+ return { ok: true, data };
26
+ }
27
+ catch (error) {
28
+ return { ok: false, error: describeRequestError(error) };
29
+ }
30
+ }
31
+ /**
32
+ * Ask the user directly through MCP elicitation: a plain Accept / Decline
33
+ * (the spec defines "accept" as explicit approval; no extra form field, see
34
+ * delete_statements). A dismissed dialog or a client without the capability
35
+ * is "unavailable": the caller then returns the dry run so the question can
36
+ * be asked in chat.
37
+ */
38
+ async function elicitApproval(extra, graphName, plan) {
39
+ if (!extra?.elicit || !extra.clientCapabilities?.elicitation) {
40
+ return { kind: "unavailable", detail: "client does not support elicitation" };
41
+ }
42
+ const lines = [
43
+ `Permanently delete the graph "${graphName}" from ${brand.name}, with all of its statements? This cannot be undone.`,
44
+ ...(plan.isLive ? ["It is a live graph: its scheduled imports will stop."] : []),
45
+ ...(plan.graphUrl ? ["", plan.graphUrl] : []),
46
+ ];
47
+ try {
48
+ const result = await extra.elicit({
49
+ message: lines.join("\n"),
50
+ requestedSchema: { type: "object", properties: {} },
51
+ });
52
+ if (result.action === "accept")
53
+ return { kind: "accepted" };
54
+ if (result.action === "decline")
55
+ return { kind: "declined" };
56
+ return { kind: "unavailable", detail: "the user dismissed the dialog without answering" };
57
+ }
58
+ catch (error) {
59
+ return {
60
+ kind: "unavailable",
61
+ detail: `elicitation failed: ${error instanceof Error ? error.message : String(error)}`,
62
+ };
63
+ }
64
+ }
65
+ export const deleteGraphTool = {
66
+ name: "delete_graph",
67
+ definition: {
68
+ title: `Delete a ${brand.name} Graph`,
69
+ description: `Delete one graph from the user's own ${brand.name} account entirely — all of its statements, revisions, settings, and its URL; the name becomes free again. IRREVERSIBLE once confirmed. ` +
70
+ `To empty a graph but keep it (for a rebuild in place), use delete_statements with deleteAll instead. ` +
71
+ `By default this is a DRY RUN: the response confirms the graph exists and reports its URL and whether it is a live graph, and nothing is deleted. Show that to the user; only if they agree, call again with the SAME graphName and confirm: true. If the client supports elicitation the user is asked directly and the deletion happens in the same call. ` +
72
+ `Never call this on your own initiative — only when the user asked to delete a graph. Only graphs in the user's own account can be targeted (there is no userName parameter); a name that is not in the account is an error and nothing is deleted.`,
73
+ inputSchema: DeleteGraphSchema.shape,
74
+ annotations: {
75
+ readOnlyHint: false,
76
+ destructiveHint: true,
77
+ idempotentHint: false,
78
+ openWorldHint: false,
79
+ },
80
+ },
81
+ handler: async (params, extra) => {
82
+ try {
83
+ const graphName = params.graphName.trim();
84
+ // 1. The graph must exist in this account.
85
+ const graph = await findGraphByName(graphName);
86
+ if (!graph) {
87
+ return textResult({
88
+ error: `No graph named "${graphName}" in this ${brand.name} account. Nothing was deleted. Use list_graphs to check the exact name.`,
89
+ }, true);
90
+ }
91
+ // 2. Preview: the app resolves the same graph it will delete.
92
+ const preview = await requestGraphDeletion(graphName, true);
93
+ if (!preview.ok) {
94
+ return textResult({ error: `Dry run failed — nothing was deleted. ${preview.error}` }, true);
95
+ }
96
+ const plan = preview.data;
97
+ const graphUrl = plan.graphUrl ?? graph.defaultRevisionUrl ?? undefined;
98
+ // 3. Consent: confirm: true from the caller, or an accepted form.
99
+ let approved = params.confirm === true;
100
+ let elicitationDetail;
101
+ if (!approved) {
102
+ const answer = await elicitApproval(extra, graphName, plan);
103
+ if (answer.kind === "accepted") {
104
+ approved = true;
105
+ }
106
+ else if (answer.kind === "declined") {
107
+ return textResult({
108
+ deleted: false,
109
+ declined: true,
110
+ graphName,
111
+ message: "The user declined the deletion. Nothing was deleted. Do not retry.",
112
+ });
113
+ }
114
+ else {
115
+ elicitationDetail = answer.detail;
116
+ }
117
+ }
118
+ if (!approved) {
119
+ return textResult({
120
+ deleted: false,
121
+ dryRun: true,
122
+ graphName,
123
+ ...(graphUrl ? { graphUrl } : {}),
124
+ isLive: plan.isLive === true,
125
+ ...(elicitationDetail ? { elicitation: elicitationDetail } : {}),
126
+ nextStep: "Nothing was deleted. Ask the user to confirm; if they agree, call delete_graph again with the SAME graphName and confirm: true.",
127
+ });
128
+ }
129
+ // 4. Delete.
130
+ const write = await requestGraphDeletion(graphName, false);
131
+ if (!write.ok) {
132
+ return textResult({ error: `Deletion failed. ${write.error}` }, true);
133
+ }
134
+ return textResult({
135
+ deleted: write.data.deleted === true,
136
+ graphName: write.data.graphName ?? graphName,
137
+ message: `The graph "${graphName}" and all of its statements were deleted.`,
138
+ });
139
+ }
140
+ catch (error) {
141
+ return textResult({ error: error instanceof Error ? error.message : String(error) }, true);
142
+ }
143
+ },
144
+ };
145
+ //# sourceMappingURL=deleteGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteGraph.js","sourceRoot":"","sources":["../../src/tools/deleteGraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * delete_statements — remove statements from a graph in the caller's own
3
+ * account by a filter the app resolves (see docs/drafts/delete-statements-tool.md).
4
+ *
5
+ * The first destructive tool in this server. Its safety comes from the
6
+ * shape of the call, not from trust in the model: exactly one selector, the
7
+ * graph must already exist, a dry run is the default, and the write only
8
+ * happens with `confirm: true` or an elicitation form the user accepts.
9
+ * The same filter is sent for the preview and for the write, so what the
10
+ * user approved is what gets removed.
11
+ */
12
+ import { z } from "zod";
13
+ import { DeleteStatementsSchema } from "../schemas/index.js";
14
+ import type { ToolExtra } from "../types/index.js";
15
+ type Params = z.infer<typeof DeleteStatementsSchema>;
16
+ /** How many matched statements the dry run echoes back to the model. */
17
+ export declare const MATCHED_SHOWN = 50;
18
+ /** The filter part of the /deleteStatements body (everything but name/dryRun). */
19
+ export type Selector = {
20
+ categories: string[];
21
+ } | {
22
+ statements: string[];
23
+ } | {
24
+ query: string;
25
+ } | {
26
+ before?: string;
27
+ after?: string;
28
+ } | {
29
+ all: true;
30
+ } | {
31
+ statementIds: number[];
32
+ };
33
+ export type SelectorResult = {
34
+ ok: true;
35
+ selector: Selector;
36
+ kind: string;
37
+ } | {
38
+ ok: false;
39
+ error: string;
40
+ };
41
+ /** The selector fields shared by delete_statements and update_statements. */
42
+ export interface SelectorParams {
43
+ categories?: string[];
44
+ statements?: string[];
45
+ query?: string;
46
+ before?: string;
47
+ after?: string;
48
+ deleteAll?: boolean;
49
+ all?: boolean;
50
+ statementIds?: number[];
51
+ }
52
+ /**
53
+ * Resolve exactly one selector from the parameters. Empty arrays, blank
54
+ * strings and `deleteAll: false` count as "not given". `before` and `after`
55
+ * are one selector together (a time window). Pure; no network.
56
+ *
57
+ * `allField` names the whole-graph flag: `deleteAll` for delete_statements,
58
+ * `all` for update_statements (both are sent to the app as `all: true`).
59
+ */
60
+ export declare function buildSelector(params: SelectorParams, allField?: "deleteAll" | "all"): SelectorResult;
61
+ export interface MatchedStatement {
62
+ id: number;
63
+ content: string;
64
+ categories?: string[];
65
+ timestamp?: string;
66
+ }
67
+ /**
68
+ * makeInfraNodusRequest throws `API request failed (status): body` on a
69
+ * non-2xx; the body is `{ error }`. Turn that into one readable line, with
70
+ * the status-specific meaning the model needs to act on it. Shared with
71
+ * update_statements, whose endpoint answers the same status codes.
72
+ */
73
+ export declare function describeRequestError(error: unknown): string;
74
+ export declare const deleteStatementsTool: {
75
+ name: string;
76
+ definition: {
77
+ title: string;
78
+ description: string;
79
+ inputSchema: {
80
+ graphName: z.ZodString;
81
+ categories: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
82
+ statements: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
83
+ query: z.ZodOptional<z.ZodString>;
84
+ before: z.ZodOptional<z.ZodString>;
85
+ after: z.ZodOptional<z.ZodString>;
86
+ deleteAll: z.ZodOptional<z.ZodBoolean>;
87
+ statementIds: z.ZodOptional<z.ZodArray<z.ZodNumber, "many">>;
88
+ confirm: z.ZodDefault<z.ZodBoolean>;
89
+ };
90
+ annotations: {
91
+ readOnlyHint: boolean;
92
+ idempotentHint: boolean;
93
+ destructiveHint: boolean;
94
+ openWorldHint: boolean;
95
+ };
96
+ };
97
+ handler: (params: Params, extra?: ToolExtra) => Promise<{
98
+ isError?: boolean | undefined;
99
+ content: {
100
+ type: "text";
101
+ text: string;
102
+ }[];
103
+ }>;
104
+ };
105
+ export {};
106
+ //# sourceMappingURL=deleteStatements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteStatements.d.ts","sourceRoot":"","sources":["../../src/tools/deleteStatements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAI7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,KAAK,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAWrD,wEAAwE;AACxE,eAAO,MAAM,aAAa,KAAK,CAAC;AAShC,kFAAkF;AAClF,MAAM,MAAM,QAAQ,GACjB;IAAE,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,GACxB;IAAE,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,GACxB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,GAAG,EAAE,IAAI,CAAA;CAAE,GACb;IAAE,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE9B,MAAM,MAAM,cAAc,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhC,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC9B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC5B,MAAM,EAAE,cAAc,EACtB,QAAQ,GAAE,WAAW,GAAG,KAAmB,GACzC,cAAc,CAkDhB;AAMD,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAgBD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAqB3D;AAwFD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;sBAkBR,MAAM,UAAU,SAAS;;;;;;;CAyGjD,CAAC"}