@mcp-graph-workflow/mcp-graph 5.29.1 → 5.30.0

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.
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * Docs Reference API — serves introspected tool/route catalogs and markdown docs.
3
3
  * Powers the Docs tab in the dashboard.
4
+ *
5
+ * In dev mode (source files present), introspects live from filesystem.
6
+ * In npm-installed mode, falls back to a pre-computed docs-manifest.json.
4
7
  */
5
8
  import { Router } from "express";
6
9
  export declare function createDocsReferenceRouter(getBasePath: () => string): Router;
@@ -1 +1 @@
1
- {"version":3,"file":"docs-reference.d.ts","sourceRoot":"","sources":["../../../src/api/routes/docs-reference.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAoEjC,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,MAAM,GAAG,MAAM,CAuF3E"}
1
+ {"version":3,"file":"docs-reference.d.ts","sourceRoot":"","sources":["../../../src/api/routes/docs-reference.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AA0IjC,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,MAAM,GAAG,MAAM,CAiG3E"}
@@ -1,13 +1,40 @@
1
1
  /**
2
2
  * Docs Reference API — serves introspected tool/route catalogs and markdown docs.
3
3
  * Powers the Docs tab in the dashboard.
4
+ *
5
+ * In dev mode (source files present), introspects live from filesystem.
6
+ * In npm-installed mode, falls back to a pre-computed docs-manifest.json.
4
7
  */
5
8
  import { Router } from "express";
6
9
  import { readFileSync, existsSync, readdirSync, statSync } from "node:fs";
7
10
  import path from "node:path";
11
+ import { fileURLToPath } from "node:url";
8
12
  import { introspectTools } from "../../core/docs/tool-introspector.js";
9
13
  import { introspectRoutes } from "../../core/docs/route-introspector.js";
10
14
  import { logger } from "../../core/utils/logger.js";
15
+ // ── Manifest loader (npm-installed fallback) ───────
16
+ let _manifest; // undefined = not loaded yet
17
+ function loadManifest() {
18
+ if (_manifest !== undefined)
19
+ return _manifest;
20
+ try {
21
+ const __filename = fileURLToPath(import.meta.url);
22
+ const __dirname = path.dirname(__filename);
23
+ // dist/api/routes/ → dist/docs-manifest.json
24
+ const manifestPath = path.resolve(__dirname, "..", "..", "docs-manifest.json");
25
+ if (existsSync(manifestPath)) {
26
+ const raw = readFileSync(manifestPath, "utf-8");
27
+ _manifest = JSON.parse(raw);
28
+ logger.debug("docs:manifest:loaded", { path: manifestPath, tools: _manifest.tools.length, routes: _manifest.routes.length, docs: _manifest.docs.length });
29
+ return _manifest;
30
+ }
31
+ }
32
+ catch (err) {
33
+ logger.warn("docs:manifest:error", { error: String(err) });
34
+ }
35
+ _manifest = null;
36
+ return null;
37
+ }
11
38
  // ── Cached introspection results ────────────────────
12
39
  let _toolsCache = null;
13
40
  let _routesCache = null;
@@ -16,40 +43,65 @@ const CACHE_TTL_MS = 60_000; // 1 minute
16
43
  function getTools(basePath) {
17
44
  if (_toolsCache && Date.now() - _cacheTimestamp < CACHE_TTL_MS)
18
45
  return _toolsCache;
46
+ // Try live filesystem first (dev mode)
19
47
  const toolsDir = path.join(basePath, "src", "mcp", "tools");
20
- _toolsCache = existsSync(toolsDir) ? introspectTools(toolsDir) : [];
21
- _cacheTimestamp = Date.now();
22
- return _toolsCache;
48
+ if (existsSync(toolsDir)) {
49
+ _toolsCache = introspectTools(toolsDir);
50
+ _cacheTimestamp = Date.now();
51
+ return _toolsCache;
52
+ }
53
+ // Fallback to manifest (npm-installed mode)
54
+ const manifest = loadManifest();
55
+ return manifest?.tools ?? [];
23
56
  }
24
57
  function getRoutes(basePath) {
25
58
  if (_routesCache && Date.now() - _cacheTimestamp < CACHE_TTL_MS)
26
59
  return _routesCache;
60
+ // Try live filesystem first (dev mode)
27
61
  const apiDir = path.join(basePath, "src", "api");
28
- _routesCache = existsSync(apiDir) ? introspectRoutes(apiDir) : [];
29
- return _routesCache;
62
+ if (existsSync(apiDir)) {
63
+ _routesCache = introspectRoutes(apiDir);
64
+ _cacheTimestamp = Date.now();
65
+ return _routesCache;
66
+ }
67
+ // Fallback to manifest (npm-installed mode)
68
+ const manifest = loadManifest();
69
+ return manifest?.routes ?? [];
30
70
  }
31
71
  function discoverDocs(basePath) {
72
+ // Try live filesystem first (dev mode)
32
73
  const docsDir = path.join(basePath, "docs");
33
- if (!existsSync(docsDir))
34
- return [];
35
- const entries = [];
36
- const categories = readdirSync(docsDir).filter((d) => {
37
- const full = path.join(docsDir, d);
38
- return existsSync(full) && statSync(full).isDirectory();
39
- });
40
- for (const category of categories) {
41
- const catDir = path.join(docsDir, category);
42
- const files = readdirSync(catDir).filter((f) => f.endsWith(".md"));
43
- for (const file of files) {
44
- const slug = `${category}/${file.replace(/\.md$/, "")}`;
45
- const title = file
46
- .replace(/\.md$/, "")
47
- .replace(/-/g, " ")
48
- .replace(/\b\w/g, (c) => c.toUpperCase());
49
- entries.push({ slug, title, category, path: path.join(catDir, file) });
74
+ if (existsSync(docsDir)) {
75
+ const entries = [];
76
+ const categories = readdirSync(docsDir).filter((d) => {
77
+ const full = path.join(docsDir, d);
78
+ return existsSync(full) && statSync(full).isDirectory();
79
+ });
80
+ for (const category of categories) {
81
+ const catDir = path.join(docsDir, category);
82
+ const files = readdirSync(catDir).filter((f) => f.endsWith(".md"));
83
+ for (const file of files) {
84
+ const slug = `${category}/${file.replace(/\.md$/, "")}`;
85
+ const title = file
86
+ .replace(/\.md$/, "")
87
+ .replace(/-/g, " ")
88
+ .replace(/\b\w/g, (c) => c.toUpperCase());
89
+ entries.push({ slug, title, category, path: path.join(catDir, file) });
90
+ }
50
91
  }
92
+ return entries;
51
93
  }
52
- return entries;
94
+ // Fallback to manifest (npm-installed mode)
95
+ const manifest = loadManifest();
96
+ if (manifest) {
97
+ return manifest.docs.map((d) => ({
98
+ slug: d.slug,
99
+ title: d.title,
100
+ category: d.category,
101
+ path: "", // no filesystem path in manifest mode
102
+ }));
103
+ }
104
+ return [];
53
105
  }
54
106
  // ── Router ──────────────────────────────────────────
55
107
  export function createDocsReferenceRouter(getBasePath) {
@@ -118,14 +170,24 @@ export function createDocsReferenceRouter(getBasePath) {
118
170
  router.get("/:category/:slug", (req, res, next) => {
119
171
  try {
120
172
  const { category, slug } = req.params;
173
+ // Try live filesystem first (dev mode)
121
174
  const filePath = path.join(getBasePath(), "docs", category, `${slug}.md`);
122
- if (!existsSync(filePath)) {
123
- res.status(404).json({ error: `Doc not found: ${category}/${slug}` });
175
+ if (existsSync(filePath)) {
176
+ const content = readFileSync(filePath, "utf-8");
177
+ logger.debug("docs:read", { category, slug });
178
+ res.json({ slug: `${category}/${slug}`, content });
179
+ return;
180
+ }
181
+ // Fallback to manifest (npm-installed mode)
182
+ const manifest = loadManifest();
183
+ const fullSlug = `${category}/${slug}`;
184
+ const entry = manifest?.docs.find((d) => d.slug === fullSlug);
185
+ if (entry) {
186
+ logger.debug("docs:read:manifest", { category, slug });
187
+ res.json({ slug: fullSlug, content: entry.content });
124
188
  return;
125
189
  }
126
- const content = readFileSync(filePath, "utf-8");
127
- logger.debug("docs:read", { category, slug });
128
- res.json({ slug: `${category}/${slug}`, content });
190
+ res.status(404).json({ error: `Doc not found: ${category}/${slug}` });
129
191
  }
130
192
  catch (err) {
131
193
  next(err);
@@ -1 +1 @@
1
- {"version":3,"file":"docs-reference.js","sourceRoot":"","sources":["../../../src/api/routes/docs-reference.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"docs-reference.js","sourceRoot":"","sources":["../../../src/api/routes/docs-reference.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Generate Docs Manifest — build-time script that pre-computes
3
+ * tools, routes, and docs into a single JSON file for npm-installed users.
4
+ *
5
+ * Run after `tsc`: `node dist/core/docs/generate-docs-manifest.js`
6
+ */
7
+ import type { ToolInfo } from "./tool-introspector.js";
8
+ import type { RouteInfo } from "./route-introspector.js";
9
+ interface ManifestDocEntry {
10
+ slug: string;
11
+ title: string;
12
+ category: string;
13
+ content: string;
14
+ }
15
+ export interface DocsManifest {
16
+ generatedAt: string;
17
+ tools: ToolInfo[];
18
+ routes: RouteInfo[];
19
+ docs: ManifestDocEntry[];
20
+ }
21
+ export {};
22
+ //# sourceMappingURL=generate-docs-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-docs-manifest.d.ts","sourceRoot":"","sources":["../../../src/core/docs/generate-docs-manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,IAAI,EAAE,gBAAgB,EAAE,CAAC;CAC1B"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Generate Docs Manifest — build-time script that pre-computes
3
+ * tools, routes, and docs into a single JSON file for npm-installed users.
4
+ *
5
+ * Run after `tsc`: `node dist/core/docs/generate-docs-manifest.js`
6
+ */
7
+ import { writeFileSync, readFileSync, readdirSync, existsSync, statSync } from "node:fs";
8
+ import path from "node:path";
9
+ import { fileURLToPath } from "node:url";
10
+ import { introspectTools } from "./tool-introspector.js";
11
+ import { introspectRoutes } from "./route-introspector.js";
12
+ function discoverDocsWithContent(docsDir) {
13
+ if (!existsSync(docsDir))
14
+ return [];
15
+ const entries = [];
16
+ const categories = readdirSync(docsDir).filter((d) => {
17
+ const full = path.join(docsDir, d);
18
+ return existsSync(full) && statSync(full).isDirectory();
19
+ });
20
+ for (const category of categories) {
21
+ const catDir = path.join(docsDir, category);
22
+ const files = readdirSync(catDir).filter((f) => f.endsWith(".md"));
23
+ for (const file of files) {
24
+ const slug = `${category}/${file.replace(/\.md$/, "")}`;
25
+ const title = file
26
+ .replace(/\.md$/, "")
27
+ .replace(/-/g, " ")
28
+ .replace(/\b\w/g, (c) => c.toUpperCase());
29
+ const content = readFileSync(path.join(catDir, file), "utf-8");
30
+ entries.push({ slug, title, category, content });
31
+ }
32
+ }
33
+ return entries;
34
+ }
35
+ function generate() {
36
+ const __filename = fileURLToPath(import.meta.url);
37
+ const __dirname = path.dirname(__filename);
38
+ // Resolve project root: dist/core/docs/ → project root
39
+ const projectRoot = path.resolve(__dirname, "..", "..", "..");
40
+ const toolsDir = path.join(projectRoot, "src", "mcp", "tools");
41
+ const apiDir = path.join(projectRoot, "src", "api");
42
+ const docsDir = path.join(projectRoot, "docs");
43
+ const outPath = path.join(projectRoot, "dist", "docs-manifest.json");
44
+ const tools = existsSync(toolsDir) ? introspectTools(toolsDir) : [];
45
+ const routes = existsSync(apiDir) ? introspectRoutes(apiDir) : [];
46
+ const docs = discoverDocsWithContent(docsDir);
47
+ const manifest = {
48
+ generatedAt: new Date().toISOString(),
49
+ tools,
50
+ routes,
51
+ docs,
52
+ };
53
+ writeFileSync(outPath, JSON.stringify(manifest, null, 2), "utf-8");
54
+ // eslint-disable-next-line no-console
55
+ console.log(`[docs-manifest] Generated: ${tools.length} tools, ${routes.length} routes, ${docs.length} docs → ${outPath}`);
56
+ }
57
+ generate();
58
+ //# sourceMappingURL=generate-docs-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-docs-manifest.js","sourceRoot":"","sources":["../../../src/core/docs/generate-docs-manifest.ts"],"names":[],"mappings":"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"}