@assistant-ui/mcp-docs-server 0.1.17 → 0.1.19

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 (202) hide show
  1. package/.docs/organized/code-examples/with-ag-ui.md +518 -234
  2. package/.docs/organized/code-examples/{with-ai-sdk-v5.md → with-ai-sdk-v6.md} +476 -189
  3. package/.docs/organized/code-examples/with-assistant-transport.md +503 -301
  4. package/.docs/organized/code-examples/with-cloud.md +524 -226
  5. package/.docs/organized/code-examples/with-custom-thread-list.md +433 -146
  6. package/.docs/organized/code-examples/with-elevenlabs-scribe.md +2241 -0
  7. package/.docs/organized/code-examples/with-external-store.md +517 -231
  8. package/.docs/organized/code-examples/with-ffmpeg.md +500 -220
  9. package/.docs/organized/code-examples/with-langgraph.md +630 -319
  10. package/.docs/organized/code-examples/with-parent-id-grouping.md +517 -231
  11. package/.docs/organized/code-examples/with-react-hook-form.md +517 -233
  12. package/.docs/organized/code-examples/with-react-router.md +2167 -0
  13. package/.docs/organized/code-examples/{store-example.md → with-store.md} +18 -22
  14. package/.docs/organized/code-examples/with-tanstack.md +23 -41
  15. package/.docs/raw/blog/2025-01-31-changelog/index.mdx +0 -2
  16. package/.docs/raw/docs/{about-assistantui.mdx → (docs)/about-assistantui.mdx} +2 -1
  17. package/.docs/raw/docs/{architecture.mdx → (docs)/architecture.mdx} +3 -2
  18. package/.docs/raw/docs/{cli.mdx → (docs)/cli.mdx} +1 -19
  19. package/.docs/raw/docs/{copilots → (docs)/copilots}/make-assistant-readable.mdx +1 -0
  20. package/.docs/raw/docs/{copilots → (docs)/copilots}/make-assistant-tool-ui.mdx +2 -1
  21. package/.docs/raw/docs/{copilots → (docs)/copilots}/make-assistant-tool.mdx +2 -1
  22. package/.docs/raw/docs/{copilots → (docs)/copilots}/model-context.mdx +1 -0
  23. package/.docs/raw/docs/{copilots → (docs)/copilots}/motivation.mdx +1 -0
  24. package/.docs/raw/docs/{copilots → (docs)/copilots}/use-assistant-instructions.mdx +1 -0
  25. package/.docs/raw/docs/{devtools.mdx → (docs)/devtools.mdx} +4 -4
  26. package/.docs/raw/docs/{guides/Attachments.mdx → (docs)/guides/attachments.mdx} +4 -5
  27. package/.docs/raw/docs/{guides/Branching.mdx → (docs)/guides/branching.mdx} +2 -1
  28. package/.docs/raw/docs/{guides → (docs)/guides}/context-api.mdx +1 -0
  29. package/.docs/raw/docs/(docs)/guides/dictation.mdx +370 -0
  30. package/.docs/raw/docs/{guides/Editing.mdx → (docs)/guides/editing.mdx} +1 -0
  31. package/.docs/raw/docs/{guides/Latex.mdx → (docs)/guides/latex.mdx} +1 -2
  32. package/.docs/raw/docs/{guides/Speech.mdx → (docs)/guides/speech.mdx} +9 -10
  33. package/.docs/raw/docs/{guides/ToolUI.mdx → (docs)/guides/tool-ui.mdx} +15 -14
  34. package/.docs/raw/docs/{guides/Tools.mdx → (docs)/guides/tools.mdx} +10 -7
  35. package/.docs/raw/docs/{getting-started.mdx → (docs)/index.mdx} +17 -22
  36. package/.docs/raw/docs/{mcp-docs-server.mdx → (docs)/mcp-docs-server.mdx} +1 -2
  37. package/.docs/raw/docs/{api-reference/context-providers/AssistantRuntimeProvider.mdx → (reference)/api-reference/context-providers/assistant-runtime-provider.mdx} +2 -1
  38. package/.docs/raw/docs/{api-reference/context-providers/TextMessagePartProvider.mdx → (reference)/api-reference/context-providers/text-message-part-provider.mdx} +2 -1
  39. package/.docs/raw/docs/{api-reference → (reference)/api-reference}/integrations/react-data-stream.mdx +2 -1
  40. package/.docs/raw/docs/{api-reference → (reference)/api-reference}/integrations/react-hook-form.mdx +2 -1
  41. package/.docs/raw/docs/{api-reference → (reference)/api-reference}/integrations/vercel-ai-sdk.mdx +2 -2
  42. package/.docs/raw/docs/{api-reference → (reference)/api-reference}/overview.mdx +1 -1
  43. package/.docs/raw/docs/(reference)/api-reference/primitives/action-bar-more.mdx +327 -0
  44. package/.docs/raw/docs/{api-reference/primitives/ActionBar.mdx → (reference)/api-reference/primitives/action-bar.mdx} +3 -1
  45. package/.docs/raw/docs/{api-reference/primitives/AssistantIf.mdx → (reference)/api-reference/primitives/assistant-if.mdx} +2 -2
  46. package/.docs/raw/docs/{api-reference/primitives/AssistantModal.mdx → (reference)/api-reference/primitives/assistant-modal.mdx} +3 -1
  47. package/.docs/raw/docs/{api-reference/primitives/Attachment.mdx → (reference)/api-reference/primitives/attachment.mdx} +3 -2
  48. package/.docs/raw/docs/{api-reference/primitives/BranchPicker.mdx → (reference)/api-reference/primitives/branch-picker.mdx} +2 -1
  49. package/.docs/raw/docs/{api-reference/primitives/Composer.mdx → (reference)/api-reference/primitives/composer.mdx} +101 -2
  50. package/.docs/raw/docs/{api-reference → (reference)/api-reference}/primitives/composition.mdx +1 -0
  51. package/.docs/raw/docs/{api-reference/primitives/Error.mdx → (reference)/api-reference/primitives/error.mdx} +2 -1
  52. package/.docs/raw/docs/{api-reference/primitives/MessagePart.mdx → (reference)/api-reference/primitives/message-part.mdx} +2 -2
  53. package/.docs/raw/docs/{api-reference/primitives/Message.mdx → (reference)/api-reference/primitives/message.mdx} +2 -1
  54. package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list-item-more.mdx +221 -0
  55. package/.docs/raw/docs/{api-reference/primitives/ThreadListItem.mdx → (reference)/api-reference/primitives/thread-list-item.mdx} +2 -1
  56. package/.docs/raw/docs/{api-reference/primitives/ThreadList.mdx → (reference)/api-reference/primitives/thread-list.mdx} +2 -1
  57. package/.docs/raw/docs/{api-reference/primitives/Thread.mdx → (reference)/api-reference/primitives/thread.mdx} +2 -1
  58. package/.docs/raw/docs/{api-reference/runtimes/AssistantRuntime.mdx → (reference)/api-reference/runtimes/assistant-runtime.mdx} +2 -1
  59. package/.docs/raw/docs/{api-reference/runtimes/AttachmentRuntime.mdx → (reference)/api-reference/runtimes/attachment-runtime.mdx} +3 -2
  60. package/.docs/raw/docs/{api-reference/runtimes/ComposerRuntime.mdx → (reference)/api-reference/runtimes/composer-runtime.mdx} +2 -1
  61. package/.docs/raw/docs/{api-reference/runtimes/MessagePartRuntime.mdx → (reference)/api-reference/runtimes/message-part-runtime.mdx} +3 -2
  62. package/.docs/raw/docs/{api-reference/runtimes/MessageRuntime.mdx → (reference)/api-reference/runtimes/message-runtime.mdx} +3 -2
  63. package/.docs/raw/docs/{api-reference/runtimes/ThreadListItemRuntime.mdx → (reference)/api-reference/runtimes/thread-list-item-runtime.mdx} +2 -1
  64. package/.docs/raw/docs/{api-reference/runtimes/ThreadListRuntime.mdx → (reference)/api-reference/runtimes/thread-list-runtime.mdx} +2 -1
  65. package/.docs/raw/docs/{api-reference/runtimes/ThreadRuntime.mdx → (reference)/api-reference/runtimes/thread-runtime.mdx} +3 -5
  66. package/.docs/raw/docs/{legacy/styled/AssistantModal.mdx → (reference)/legacy/styled/assistant-modal.mdx} +2 -3
  67. package/.docs/raw/docs/{legacy/styled/Decomposition.mdx → (reference)/legacy/styled/decomposition.mdx} +1 -0
  68. package/.docs/raw/docs/{legacy/styled/Markdown.mdx → (reference)/legacy/styled/markdown.mdx} +2 -4
  69. package/.docs/raw/docs/{legacy/styled/Scrollbar.mdx → (reference)/legacy/styled/scrollbar.mdx} +2 -1
  70. package/.docs/raw/docs/{legacy/styled/ThreadWidth.mdx → (reference)/legacy/styled/thread-width.mdx} +1 -0
  71. package/.docs/raw/docs/{legacy/styled/Thread.mdx → (reference)/legacy/styled/thread.mdx} +2 -3
  72. package/.docs/raw/docs/{migrations → (reference)/migrations}/deprecation-policy.mdx +1 -0
  73. package/.docs/raw/docs/{migrations → (reference)/migrations}/react-langgraph-v0-7.mdx +1 -2
  74. package/.docs/raw/docs/{migrations → (reference)/migrations}/v0-11.mdx +1 -0
  75. package/.docs/raw/docs/{migrations → (reference)/migrations}/v0-12.mdx +1 -0
  76. package/.docs/raw/docs/{react-compatibility.mdx → (reference)/react-compatibility.mdx} +2 -3
  77. package/.docs/raw/docs/cloud/authorization.mdx +1 -0
  78. package/.docs/raw/docs/cloud/overview.mdx +1 -0
  79. package/.docs/raw/docs/cloud/persistence/ai-sdk.mdx +2 -3
  80. package/.docs/raw/docs/cloud/persistence/langgraph.mdx +5 -7
  81. package/.docs/raw/docs/runtimes/ai-sdk/use-chat.mdx +9 -8
  82. package/.docs/raw/docs/runtimes/ai-sdk/v4-legacy.mdx +2 -3
  83. package/.docs/raw/docs/runtimes/assistant-transport.mdx +7 -6
  84. package/.docs/raw/docs/runtimes/custom/custom-thread-list.mdx +38 -3
  85. package/.docs/raw/docs/runtimes/custom/external-store.mdx +6 -8
  86. package/.docs/raw/docs/runtimes/custom/local.mdx +43 -16
  87. package/.docs/raw/docs/runtimes/data-stream.mdx +32 -4
  88. package/.docs/raw/docs/runtimes/helicone.mdx +1 -0
  89. package/.docs/raw/docs/runtimes/langgraph/index.mdx +3 -3
  90. package/.docs/raw/docs/runtimes/langgraph/tutorial/index.mdx +1 -0
  91. package/.docs/raw/docs/runtimes/langgraph/tutorial/introduction.mdx +1 -0
  92. package/.docs/raw/docs/runtimes/langgraph/tutorial/part-1.mdx +1 -0
  93. package/.docs/raw/docs/runtimes/langgraph/tutorial/part-2.mdx +1 -0
  94. package/.docs/raw/docs/runtimes/langgraph/tutorial/part-3.mdx +2 -1
  95. package/.docs/raw/docs/runtimes/langserve.mdx +2 -2
  96. package/.docs/raw/docs/runtimes/mastra/full-stack-integration.mdx +4 -5
  97. package/.docs/raw/docs/runtimes/mastra/overview.mdx +1 -0
  98. package/.docs/raw/docs/runtimes/mastra/separate-server-integration.mdx +3 -4
  99. package/.docs/raw/docs/runtimes/pick-a-runtime.mdx +2 -4
  100. package/.docs/raw/docs/ui/assistant-modal.mdx +163 -0
  101. package/.docs/raw/docs/ui/assistant-sidebar.mdx +90 -0
  102. package/.docs/raw/docs/ui/attachment.mdx +227 -0
  103. package/.docs/raw/docs/ui/{Markdown.mdx → markdown.mdx} +11 -6
  104. package/.docs/raw/docs/ui/{Mermaid.mdx → mermaid.mdx} +12 -5
  105. package/.docs/raw/docs/ui/{PartGrouping.mdx → part-grouping.mdx} +4 -6
  106. package/.docs/raw/docs/ui/reasoning.mdx +148 -0
  107. package/.docs/raw/docs/ui/{Scrollbar.mdx → scrollbar.mdx} +9 -7
  108. package/.docs/raw/docs/ui/sources.mdx +87 -0
  109. package/.docs/raw/docs/ui/{SyntaxHighlighting.mdx → syntax-highlighting.mdx} +9 -5
  110. package/.docs/raw/docs/ui/thread-list.mdx +275 -0
  111. package/.docs/raw/docs/ui/{Thread.mdx → thread.mdx} +5 -6
  112. package/.docs/raw/docs/ui/tool-fallback.mdx +112 -0
  113. package/.docs/raw/docs/ui/tool-group.mdx +214 -0
  114. package/dist/constants.d.ts +10 -0
  115. package/dist/constants.d.ts.map +1 -0
  116. package/dist/constants.js +14 -0
  117. package/dist/constants.js.map +1 -0
  118. package/dist/index.d.ts +4 -0
  119. package/dist/index.d.ts.map +1 -0
  120. package/dist/index.js +33 -1
  121. package/dist/index.js.map +1 -0
  122. package/dist/prepare-docs/code-examples.d.ts +2 -0
  123. package/dist/prepare-docs/code-examples.d.ts.map +1 -0
  124. package/dist/prepare-docs/code-examples.js +129 -0
  125. package/dist/prepare-docs/code-examples.js.map +1 -0
  126. package/dist/prepare-docs/copy-raw.d.ts +2 -0
  127. package/dist/prepare-docs/copy-raw.d.ts.map +1 -0
  128. package/dist/prepare-docs/copy-raw.js +50 -0
  129. package/dist/prepare-docs/copy-raw.js.map +1 -0
  130. package/dist/prepare-docs/prepare.d.ts +2 -0
  131. package/dist/prepare-docs/prepare.d.ts.map +1 -0
  132. package/dist/prepare-docs/prepare.js +18 -195
  133. package/dist/prepare-docs/prepare.js.map +1 -0
  134. package/dist/stdio.d.ts +3 -0
  135. package/dist/stdio.d.ts.map +1 -0
  136. package/dist/stdio.js +4 -5
  137. package/dist/stdio.js.map +1 -0
  138. package/dist/tools/docs.d.ts +23 -0
  139. package/dist/tools/docs.d.ts.map +1 -0
  140. package/dist/tools/docs.js +168 -0
  141. package/dist/tools/docs.js.map +1 -0
  142. package/dist/tools/examples.d.ts +23 -0
  143. package/dist/tools/examples.d.ts.map +1 -0
  144. package/dist/tools/examples.js +95 -0
  145. package/dist/tools/examples.js.map +1 -0
  146. package/dist/tools/tests/test-setup.d.ts +4 -0
  147. package/dist/tools/tests/test-setup.d.ts.map +1 -0
  148. package/dist/tools/tests/test-setup.js +36 -0
  149. package/dist/tools/tests/test-setup.js.map +1 -0
  150. package/dist/utils/logger.d.ts +7 -0
  151. package/dist/utils/logger.d.ts.map +1 -0
  152. package/dist/utils/logger.js +20 -0
  153. package/dist/utils/logger.js.map +1 -0
  154. package/dist/utils/mcp-format.d.ts +7 -0
  155. package/dist/utils/mcp-format.d.ts.map +1 -0
  156. package/dist/utils/mcp-format.js +11 -0
  157. package/dist/utils/mcp-format.js.map +1 -0
  158. package/dist/utils/mdx.d.ts +9 -0
  159. package/dist/utils/mdx.d.ts.map +1 -0
  160. package/dist/utils/mdx.js +27 -0
  161. package/dist/utils/mdx.js.map +1 -0
  162. package/dist/utils/paths.d.ts +8 -0
  163. package/dist/utils/paths.d.ts.map +1 -0
  164. package/dist/utils/paths.js +84 -0
  165. package/dist/utils/paths.js.map +1 -0
  166. package/dist/utils/security.d.ts +2 -0
  167. package/dist/utils/security.d.ts.map +1 -0
  168. package/dist/utils/security.js +43 -0
  169. package/dist/utils/security.js.map +1 -0
  170. package/package.json +37 -19
  171. package/src/constants.ts +22 -0
  172. package/src/index.ts +51 -0
  173. package/src/prepare-docs/code-examples.ts +158 -0
  174. package/src/prepare-docs/copy-raw.ts +55 -0
  175. package/src/prepare-docs/prepare.ts +24 -0
  176. package/src/stdio.ts +7 -0
  177. package/src/tools/docs.ts +207 -0
  178. package/src/tools/examples.ts +107 -0
  179. package/src/tools/tests/docs.test.ts +124 -0
  180. package/src/tools/tests/examples.test.ts +94 -0
  181. package/src/tools/tests/integration.test.ts +46 -0
  182. package/src/tools/tests/json-parsing.test.ts +23 -0
  183. package/src/tools/tests/mcp-protocol.test.ts +133 -0
  184. package/src/tools/tests/path-traversal.test.ts +81 -0
  185. package/src/tools/tests/test-setup.ts +40 -0
  186. package/src/utils/logger.ts +20 -0
  187. package/src/utils/mcp-format.ts +12 -0
  188. package/src/utils/mdx.ts +39 -0
  189. package/src/utils/paths.ts +114 -0
  190. package/src/utils/security.ts +52 -0
  191. package/src/utils/tests/security.test.ts +119 -0
  192. package/.docs/raw/docs/index.mdx +0 -7
  193. package/.docs/raw/docs/ui/AssistantModal.mdx +0 -45
  194. package/.docs/raw/docs/ui/AssistantSidebar.mdx +0 -41
  195. package/.docs/raw/docs/ui/Attachment.mdx +0 -84
  196. package/.docs/raw/docs/ui/Reasoning.mdx +0 -152
  197. package/.docs/raw/docs/ui/ThreadList.mdx +0 -90
  198. package/.docs/raw/docs/ui/ToolFallback.mdx +0 -63
  199. package/.docs/raw/docs/ui/ToolGroup.mdx +0 -96
  200. package/dist/chunk-M2RKUM66.js +0 -38
  201. package/dist/chunk-NVNFQ5ZO.js +0 -423
  202. /package/.docs/raw/docs/{copilots → (docs)/copilots}/assistant-frame.mdx +0 -0
@@ -0,0 +1,168 @@
1
+ import { z } from "zod/v3";
2
+ import { stat, lstat } from "node:fs/promises";
3
+ import { join, extname } from "node:path";
4
+ import { DOCS_PATH, MDX_EXTENSION, MAX_FILE_SIZE } from "../constants.js";
5
+ import { logger } from "../utils/logger.js";
6
+ import { listDirContents, getAvailablePaths, findNearestPaths, pathExists, } from "../utils/paths.js";
7
+ import { readMDXFile, formatMDXContent } from "../utils/mdx.js";
8
+ import { formatMCPResponse } from "../utils/mcp-format.js";
9
+ import { sanitizePath } from "../utils/security.js";
10
+ const docsInputSchema = z.object({
11
+ paths: z
12
+ .array(z.string())
13
+ .min(1)
14
+ .describe('Documentation paths to retrieve (e.g., ["getting-started", "api-reference/primitives/thread"])'),
15
+ });
16
+ async function readDocumentation(docPath) {
17
+ logger.debug(`Reading documentation for path: ${docPath}`);
18
+ if (docPath === "/" || docPath === "") {
19
+ const { directories, files } = await listDirContents(DOCS_PATH);
20
+ return {
21
+ path: "/",
22
+ found: true,
23
+ type: "directory",
24
+ directories,
25
+ files: files.map((f) => f.replace(MDX_EXTENSION, "")),
26
+ };
27
+ }
28
+ try {
29
+ const sanitized = sanitizePath(docPath);
30
+ const fullPath = join(DOCS_PATH, sanitized);
31
+ try {
32
+ const lstats = await lstat(fullPath);
33
+ if (lstats.isSymbolicLink()) {
34
+ logger.warn(`Symlink detected at path: ${fullPath}`);
35
+ return {
36
+ path: docPath,
37
+ found: false,
38
+ error: "Symlinks are not allowed for security reasons",
39
+ };
40
+ }
41
+ }
42
+ catch { }
43
+ if (await pathExists(fullPath)) {
44
+ const stats = await stat(fullPath);
45
+ if (stats.isFile() && stats.size > MAX_FILE_SIZE) {
46
+ logger.warn(`File too large: ${fullPath} (${stats.size} bytes)`);
47
+ return {
48
+ path: docPath,
49
+ found: false,
50
+ error: `File size exceeds maximum allowed size of ${MAX_FILE_SIZE} bytes`,
51
+ };
52
+ }
53
+ if (stats.isDirectory()) {
54
+ const { directories, files } = await listDirContents(fullPath);
55
+ const contents = {};
56
+ for (const file of files) {
57
+ const mdxContent = await readMDXFile(join(fullPath, file));
58
+ if (mdxContent) {
59
+ const fileName = file.replace(MDX_EXTENSION, "");
60
+ contents[fileName] = formatMDXContent(mdxContent);
61
+ }
62
+ }
63
+ const content = Object.keys(contents).length > 0
64
+ ? JSON.stringify(contents, null, 2)
65
+ : undefined;
66
+ return {
67
+ path: docPath,
68
+ found: true,
69
+ type: "directory",
70
+ directories,
71
+ files: files.map((f) => f.replace(MDX_EXTENSION, "")),
72
+ ...(content !== undefined && { content }),
73
+ };
74
+ }
75
+ }
76
+ const mdxPath = extname(fullPath) === MDX_EXTENSION
77
+ ? fullPath
78
+ : `${fullPath}${MDX_EXTENSION}`;
79
+ try {
80
+ const mdxLstats = await lstat(mdxPath);
81
+ if (mdxLstats.isSymbolicLink()) {
82
+ logger.warn(`Symlink detected at MDX path: ${mdxPath}`);
83
+ return {
84
+ path: docPath,
85
+ found: false,
86
+ error: "Symlinks are not allowed for security reasons",
87
+ };
88
+ }
89
+ if (mdxLstats.size > MAX_FILE_SIZE) {
90
+ logger.warn(`MDX file too large: ${mdxPath} (${mdxLstats.size} bytes)`);
91
+ return {
92
+ path: docPath,
93
+ found: false,
94
+ error: `File size exceeds maximum allowed size of ${MAX_FILE_SIZE} bytes`,
95
+ };
96
+ }
97
+ }
98
+ catch { }
99
+ if (await pathExists(mdxPath)) {
100
+ const mdxContent = await readMDXFile(mdxPath);
101
+ if (mdxContent) {
102
+ return {
103
+ path: docPath,
104
+ found: true,
105
+ type: "file",
106
+ content: formatMDXContent(mdxContent),
107
+ };
108
+ }
109
+ }
110
+ const availablePaths = await getAvailablePaths();
111
+ const suggestions = findNearestPaths(docPath, availablePaths);
112
+ return {
113
+ path: docPath,
114
+ found: false,
115
+ suggestions,
116
+ };
117
+ }
118
+ catch (error) {
119
+ if (error instanceof Error && error.message.includes("Invalid path")) {
120
+ return {
121
+ path: docPath,
122
+ found: false,
123
+ error: error.message,
124
+ };
125
+ }
126
+ throw error;
127
+ }
128
+ }
129
+ export const docsTools = {
130
+ name: "assistantUIDocs",
131
+ description: 'Retrieve assistant-ui documentation by path. Use "/" to list all sections. Supports multiple paths in a single request.',
132
+ parameters: docsInputSchema.shape,
133
+ execute: async ({ paths }) => {
134
+ logger.info(`Retrieving documentation for paths: ${paths.join(", ")}`);
135
+ try {
136
+ const results = await Promise.all(paths.map((path) => readDocumentation(path)));
137
+ if (results.length === 1) {
138
+ const result = results[0];
139
+ if (result.error) {
140
+ return formatMCPResponse({
141
+ error: result.error,
142
+ path: result.path,
143
+ });
144
+ }
145
+ if (!result.found) {
146
+ return formatMCPResponse({
147
+ error: `Documentation not found for path: ${result.path}`,
148
+ suggestions: result.suggestions,
149
+ hint: 'Use "/" to list all available documentation sections',
150
+ });
151
+ }
152
+ return formatMCPResponse(result);
153
+ }
154
+ return formatMCPResponse({
155
+ results,
156
+ summary: `Retrieved ${results.filter((r) => r.found).length} of ${results.length} requested paths`,
157
+ });
158
+ }
159
+ catch (error) {
160
+ logger.error("Failed to retrieve documentation", error);
161
+ return formatMCPResponse({
162
+ error: "Failed to retrieve documentation",
163
+ message: error instanceof Error ? error.message : String(error),
164
+ });
165
+ }
166
+ },
167
+ };
168
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/tools/docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,GACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,KAAK,EAAE,CAAC;SACL,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CACP,gGAAgG,CACjG;CACJ,CAAC,CAAC;AAaH,KAAK,UAAU,iBAAiB,CAAC,OAAe;IAC9C,MAAM,CAAC,KAAK,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;IAE3D,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACtC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;QAChE,OAAO;YACL,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,WAAW;YACjB,WAAW;YACX,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;SACtD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAE5C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;gBACrD,OAAO;oBACL,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,+CAA+C;iBACvD,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAEV,IAAI,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEnC,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,GAAG,aAAa,EAAE,CAAC;gBACjD,MAAM,CAAC,IAAI,CAAC,mBAAmB,QAAQ,KAAK,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC;gBACjE,OAAO;oBACL,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,6CAA6C,aAAa,QAAQ;iBAC1E,CAAC;YACJ,CAAC;YAED,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAE/D,MAAM,QAAQ,GAA2B,EAAE,CAAC;gBAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;oBAC3D,IAAI,UAAU,EAAE,CAAC;wBACf,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;wBACjD,QAAQ,CAAC,QAAQ,CAAC,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;oBACpD,CAAC;gBACH,CAAC;gBAED,MAAM,OAAO,GACX,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC;oBAC9B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;oBACnC,CAAC,CAAC,SAAS,CAAC;gBAChB,OAAO;oBACL,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,IAAI;oBACX,IAAI,EAAE,WAAW;oBACjB,WAAW;oBACX,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;oBACrD,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,CAAC;iBAC1C,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GACX,OAAO,CAAC,QAAQ,CAAC,KAAK,aAAa;YACjC,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,GAAG,QAAQ,GAAG,aAAa,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;gBACxD,OAAO;oBACL,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,+CAA+C;iBACvD,CAAC;YACJ,CAAC;YAED,IAAI,SAAS,CAAC,IAAI,GAAG,aAAa,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,uBAAuB,OAAO,KAAK,SAAS,CAAC,IAAI,SAAS,CAAC,CAAC;gBACxE,OAAO;oBACL,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,6CAA6C,aAAa,QAAQ;iBAC1E,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAEV,IAAI,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;YAE9C,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO;oBACL,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,IAAI;oBACX,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,gBAAgB,CAAC,UAAU,CAAC;iBACtC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAC;QACjD,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAE9D,OAAO;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,KAAK;YACZ,WAAW;SACZ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACrE,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,KAAK,CAAC,OAAO;aACrB,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,iBAAiB;IACvB,WAAW,EACT,yHAAyH;IAC3H,UAAU,EAAE,eAAe,CAAC,KAAK;IACjC,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAmC,EAAE,EAAE;QAC5D,MAAM,CAAC,IAAI,CAAC,uCAAuC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEvE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAC7C,CAAC;YAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;gBAC3B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,OAAO,iBAAiB,CAAC;wBACvB,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;qBAClB,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBAClB,OAAO,iBAAiB,CAAC;wBACvB,KAAK,EAAE,qCAAqC,MAAM,CAAC,IAAI,EAAE;wBACzD,WAAW,EAAE,MAAM,CAAC,WAAW;wBAC/B,IAAI,EAAE,sDAAsD;qBAC7D,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;YAED,OAAO,iBAAiB,CAAC;gBACvB,OAAO;gBACP,OAAO,EAAE,aAAa,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM,kBAAkB;aACnG,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;YACxD,OAAO,iBAAiB,CAAC;gBACvB,KAAK,EAAE,kCAAkC;gBACzC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAChE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { z } from "zod/v3";
2
+ declare const examplesInputSchema: z.ZodObject<{
3
+ example: z.ZodOptional<z.ZodString>;
4
+ }, "strip", z.ZodTypeAny, {
5
+ example?: string | undefined;
6
+ }, {
7
+ example?: string | undefined;
8
+ }>;
9
+ export declare const examplesTools: {
10
+ name: string;
11
+ description: string;
12
+ parameters: {
13
+ example: z.ZodOptional<z.ZodString>;
14
+ };
15
+ execute: ({ example }: z.infer<typeof examplesInputSchema>) => Promise<{
16
+ content: Array<{
17
+ type: "text";
18
+ text: string;
19
+ }>;
20
+ }>;
21
+ };
22
+ export {};
23
+ //# sourceMappingURL=examples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"examples.d.ts","sourceRoot":"","sources":["../../src/tools/examples.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAQ3B,QAAA,MAAM,mBAAmB;;;;;;EAOvB,CAAC;AAuCH,eAAO,MAAM,aAAa;;;;;;2BAKK,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC;;;;;;CA+CjE,CAAC"}
@@ -0,0 +1,95 @@
1
+ import { z } from "zod/v3";
2
+ import { readFile, readdir, lstat } from "node:fs/promises";
3
+ import { join, extname } from "node:path";
4
+ import { CODE_EXAMPLES_PATH, MAX_FILE_SIZE } from "../constants.js";
5
+ import { logger } from "../utils/logger.js";
6
+ import { formatMCPResponse } from "../utils/mcp-format.js";
7
+ import { sanitizePath } from "../utils/security.js";
8
+ const examplesInputSchema = z.object({
9
+ example: z
10
+ .string()
11
+ .optional()
12
+ .describe('Example name (e.g., "with-ai-sdk-v6"). Leave empty to list all examples.'),
13
+ });
14
+ async function listCodeExamples() {
15
+ try {
16
+ const files = await readdir(CODE_EXAMPLES_PATH);
17
+ return files
18
+ .filter((file) => extname(file) === ".md")
19
+ .map((file) => file.replace(".md", ""))
20
+ .sort();
21
+ }
22
+ catch (error) {
23
+ logger.error("Failed to list code examples", error);
24
+ return [];
25
+ }
26
+ }
27
+ async function readCodeExample(exampleName) {
28
+ try {
29
+ const sanitized = sanitizePath(exampleName);
30
+ const filePath = join(CODE_EXAMPLES_PATH, `${sanitized}.md`);
31
+ const stats = await lstat(filePath);
32
+ if (stats.isSymbolicLink()) {
33
+ logger.warn(`Attempted to read symlink: ${filePath}`);
34
+ return null;
35
+ }
36
+ if (stats.size > MAX_FILE_SIZE) {
37
+ logger.warn(`File size exceeds limit: ${filePath} (${stats.size} bytes)`);
38
+ return null;
39
+ }
40
+ const content = await readFile(filePath, "utf-8");
41
+ return content;
42
+ }
43
+ catch (error) {
44
+ logger.error(`Failed to read example: ${exampleName}`, error);
45
+ return null;
46
+ }
47
+ }
48
+ export const examplesTools = {
49
+ name: "assistantUIExamples",
50
+ description: "List available examples or retrieve complete code for a specific example",
51
+ parameters: examplesInputSchema.shape,
52
+ execute: async ({ example }) => {
53
+ try {
54
+ if (!example) {
55
+ logger.info("Listing all available examples");
56
+ const examples = await listCodeExamples();
57
+ if (examples.length === 0) {
58
+ return formatMCPResponse({
59
+ error: "No examples found. Please run documentation preparation first.",
60
+ hint: "Run: pnpm prepare-docs",
61
+ });
62
+ }
63
+ return formatMCPResponse({
64
+ type: "list",
65
+ examples,
66
+ total: examples.length,
67
+ hint: "Use example parameter to get complete code for any example",
68
+ });
69
+ }
70
+ logger.info(`Retrieving example: ${example}`);
71
+ const content = await readCodeExample(example);
72
+ if (!content) {
73
+ const availableExamples = await listCodeExamples();
74
+ return formatMCPResponse({
75
+ error: `Example not found: ${example}`,
76
+ availableExamples,
77
+ hint: "Use without example parameter to list all available examples",
78
+ });
79
+ }
80
+ return formatMCPResponse({
81
+ type: "example",
82
+ name: example,
83
+ content,
84
+ });
85
+ }
86
+ catch (error) {
87
+ logger.error("Failed to retrieve examples", error);
88
+ return formatMCPResponse({
89
+ error: "Failed to retrieve examples",
90
+ message: error instanceof Error ? error.message : String(error),
91
+ });
92
+ }
93
+ },
94
+ };
95
+ //# sourceMappingURL=examples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"examples.js","sourceRoot":"","sources":["../../src/tools/examples.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const testContext: {
2
+ callTool: (name: string, args: any) => Promise<any>;
3
+ };
4
+ //# sourceMappingURL=test-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-setup.d.ts","sourceRoot":"","sources":["../../../src/tools/tests/test-setup.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,WAAW;qBACC,MAAM,QAAQ,GAAG;CAmBzC,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { beforeAll } from "vitest";
2
+ import { existsSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { PACKAGE_DIR } from "../../constants.js";
5
+ import { docsTools } from "../docs.js";
6
+ import { examplesTools } from "../examples.js";
7
+ const tools = {
8
+ assistantUIDocs: docsTools,
9
+ assistantUIExamples: examplesTools,
10
+ };
11
+ export const testContext = {
12
+ callTool: async (name, args) => {
13
+ const tool = tools[name];
14
+ if (!tool) {
15
+ throw new Error(`Tool ${name} not found`);
16
+ }
17
+ const result = await tool.execute(args);
18
+ const text = result.content?.[0]?.text;
19
+ if (text === undefined) {
20
+ throw new Error(`Tool ${name} returned no content`);
21
+ }
22
+ try {
23
+ return JSON.parse(text);
24
+ }
25
+ catch (error) {
26
+ throw new Error(`Tool ${name} returned invalid JSON. Output: ${text}\nParse error: ${error instanceof Error ? error.message : String(error)}`);
27
+ }
28
+ },
29
+ };
30
+ beforeAll(() => {
31
+ const docsPath = join(PACKAGE_DIR, ".docs");
32
+ if (!existsSync(docsPath)) {
33
+ throw new Error("Documentation not prepared. Run: pnpm build");
34
+ }
35
+ });
36
+ //# sourceMappingURL=test-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-setup.js","sourceRoot":"","sources":["../../../src/tools/tests/test-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,KAAK,GAAG;IACZ,eAAe,EAAE,SAAS;IAC1B,mBAAmB,EAAE,aAAa;CACnC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,QAAQ,EAAE,KAAK,EAAE,IAAY,EAAE,IAAS,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,IAA0B,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,YAAY,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAExC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QACvC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,sBAAsB,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,QAAQ,IAAI,mCAAmC,IAAI,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC9H,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC;AAEF,SAAS,CAAC,GAAG,EAAE;IACb,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const logger: {
2
+ debug: (message: string, ...args: any[]) => void;
3
+ info: (message: string, ...args: any[]) => void;
4
+ error: (message: string, ...args: any[]) => void;
5
+ warn: (message: string, ...args: any[]) => void;
6
+ };
7
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;qBACA,MAAM,WAAW,GAAG,EAAE;oBAKvB,MAAM,WAAW,GAAG,EAAE;qBAKrB,MAAM,WAAW,GAAG,EAAE;oBAGvB,MAAM,WAAW,GAAG,EAAE;CAGvC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { IS_PREPARE_MODE } from "../constants.js";
2
+ export const logger = {
3
+ debug: (message, ...args) => {
4
+ if (process.env["DEBUG"]) {
5
+ console.debug(`[DEBUG] ${message}`, ...args);
6
+ }
7
+ },
8
+ info: (message, ...args) => {
9
+ if (IS_PREPARE_MODE) {
10
+ console.log(`[INFO] ${message}`, ...args);
11
+ }
12
+ },
13
+ error: (message, ...args) => {
14
+ console.error(`[ERROR] ${message}`, ...args);
15
+ },
16
+ warn: (message, ...args) => {
17
+ console.warn(`[WARN] ${message}`, ...args);
18
+ },
19
+ };
20
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE;QACzC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE;QACxC,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE;QACzC,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE;QACxC,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IAC7C,CAAC;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function formatMCPResponse(data: any): {
2
+ content: Array<{
3
+ type: "text";
4
+ text: string;
5
+ }>;
6
+ };
7
+ //# sourceMappingURL=mcp-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-format.d.ts","sourceRoot":"","sources":["../../src/utils/mcp-format.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,GAAG;IAC5C,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD,CASA"}
@@ -0,0 +1,11 @@
1
+ export function formatMCPResponse(data) {
2
+ return {
3
+ content: [
4
+ {
5
+ type: "text",
6
+ text: typeof data === "string" ? data : JSON.stringify(data, null, 2),
7
+ },
8
+ ],
9
+ };
10
+ }
11
+ //# sourceMappingURL=mcp-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-format.js","sourceRoot":"","sources":["../../src/utils/mcp-format.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,IAAS;IAGzC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aACtE;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface MDXContent {
2
+ content: string;
3
+ frontmatter: Record<string, any>;
4
+ excerpt?: string;
5
+ }
6
+ export declare function readMDXFile(filePath: string): Promise<MDXContent | null>;
7
+ export declare function formatMDXContent(mdxContent: MDXContent): string;
8
+ export {};
9
+ //# sourceMappingURL=mdx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdx.d.ts","sourceRoot":"","sources":["../../src/utils/mdx.ts"],"names":[],"mappings":"AAIA,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAoB5B;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAI/D"}
@@ -0,0 +1,27 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import matter from "gray-matter";
3
+ import { logger } from "./logger.js";
4
+ export async function readMDXFile(filePath) {
5
+ try {
6
+ const fileContent = await readFile(filePath, "utf-8");
7
+ const { content, data } = matter(fileContent);
8
+ const excerptMatch = content.match(/^(.+?)(?:\n\n|$)/);
9
+ const excerpt = excerptMatch?.[1] !== undefined
10
+ ? excerptMatch[1].replace(/^#+ /, "")
11
+ : undefined;
12
+ return {
13
+ content,
14
+ frontmatter: data,
15
+ ...(excerpt !== undefined && { excerpt }),
16
+ };
17
+ }
18
+ catch (error) {
19
+ logger.error(`Failed to read MDX file: ${filePath}`, error);
20
+ return null;
21
+ }
22
+ }
23
+ export function formatMDXContent(mdxContent) {
24
+ const { content, frontmatter } = mdxContent;
25
+ return matter.stringify(content, frontmatter);
26
+ }
27
+ //# sourceMappingURL=mdx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdx.js","sourceRoot":"","sources":["../../src/utils/mdx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAQrC,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QAE9C,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,OAAO,GACX,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS;YAC7B,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACrC,CAAC,CAAC,SAAS,CAAC;QAEhB,OAAO;YACL,OAAO;YACP,WAAW,EAAE,IAAI;YACjB,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,CAAC;SAC1C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,4BAA4B,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAsB;IACrD,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC;IAE5C,OAAO,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function listDirContents(dirPath: string): Promise<{
2
+ directories: string[];
3
+ files: string[];
4
+ }>;
5
+ export declare function getAvailablePaths(): Promise<string[]>;
6
+ export declare function findNearestPaths(requestedPath: string, availablePaths: string[]): string[];
7
+ export declare function pathExists(path: string): Promise<boolean>;
8
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAYA,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9D,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC,CAyBD;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAwB3D;AAED,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EAAE,GACvB,MAAM,EAAE,CAiCV;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D"}
@@ -0,0 +1,84 @@
1
+ import { readdir, stat } from "node:fs/promises";
2
+ import { join, extname } from "node:path";
3
+ import { DOCS_PATH, MDX_EXTENSION, MD_EXTENSION } from "../constants.js";
4
+ import { logger } from "./logger.js";
5
+ const SIMILARITY_THRESHOLDS = {
6
+ EXACT_MATCH: 1,
7
+ CONTAINS_MATCH: 0.8,
8
+ PARTIAL_MATCH: 0.5,
9
+ MIN_SUGGESTION: 0.3,
10
+ };
11
+ export async function listDirContents(dirPath) {
12
+ try {
13
+ const items = await readdir(dirPath, { withFileTypes: true });
14
+ const directories = items
15
+ .filter((item) => item.isDirectory())
16
+ .map((item) => item.name)
17
+ .filter((name) => !name.startsWith("."))
18
+ .sort();
19
+ const files = items
20
+ .filter((item) => item.isFile() &&
21
+ (extname(item.name) === MDX_EXTENSION ||
22
+ extname(item.name) === MD_EXTENSION))
23
+ .map((item) => item.name)
24
+ .sort();
25
+ return { directories, files };
26
+ }
27
+ catch (error) {
28
+ logger.error(`Failed to list directory contents: ${dirPath}`, error);
29
+ return { directories: [], files: [] };
30
+ }
31
+ }
32
+ export async function getAvailablePaths() {
33
+ const paths = [];
34
+ async function scanDirectory(dir, prefix = "") {
35
+ const { directories, files } = await listDirContents(dir);
36
+ for (const file of files) {
37
+ const name = file.replace(MDX_EXTENSION, "").replace(MD_EXTENSION, "");
38
+ paths.push(prefix ? `${prefix}/${name}` : name);
39
+ }
40
+ for (const subdir of directories) {
41
+ const subdirPath = join(dir, subdir);
42
+ const newPrefix = prefix ? `${prefix}/${subdir}` : subdir;
43
+ paths.push(newPrefix);
44
+ await scanDirectory(subdirPath, newPrefix);
45
+ }
46
+ }
47
+ await scanDirectory(DOCS_PATH);
48
+ return paths.sort();
49
+ }
50
+ export function findNearestPaths(requestedPath, availablePaths) {
51
+ const normalizedRequest = requestedPath
52
+ .toLowerCase()
53
+ .replace(/[^a-z0-9]/g, "");
54
+ const scored = availablePaths.map((path) => {
55
+ const normalizedPath = path.toLowerCase().replace(/[^a-z0-9]/g, "");
56
+ if (normalizedPath.includes(normalizedRequest)) {
57
+ return { path, score: SIMILARITY_THRESHOLDS.EXACT_MATCH };
58
+ }
59
+ if (normalizedRequest.includes(normalizedPath)) {
60
+ return { path, score: SIMILARITY_THRESHOLDS.CONTAINS_MATCH };
61
+ }
62
+ const overlap = [...normalizedRequest].filter((char) => normalizedPath.includes(char)).length;
63
+ return {
64
+ path,
65
+ score: (overlap / normalizedRequest.length) *
66
+ SIMILARITY_THRESHOLDS.PARTIAL_MATCH,
67
+ };
68
+ });
69
+ return scored
70
+ .filter((item) => item.score > SIMILARITY_THRESHOLDS.MIN_SUGGESTION)
71
+ .sort((a, b) => b.score - a.score)
72
+ .slice(0, 3)
73
+ .map((item) => item.path);
74
+ }
75
+ export async function pathExists(path) {
76
+ try {
77
+ await stat(path);
78
+ return true;
79
+ }
80
+ catch {
81
+ return false;
82
+ }
83
+ }
84
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function sanitizePath(userPath: string): string;
2
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiDrD"}
@@ -0,0 +1,43 @@
1
+ import path from "node:path";
2
+ export function sanitizePath(userPath) {
3
+ if (!userPath || typeof userPath !== "string") {
4
+ throw new Error("Invalid path: Path must be a non-empty string");
5
+ }
6
+ // Check for traversal patterns before normalization - defense in depth
7
+ if (userPath.includes("../") || userPath.includes("..\\")) {
8
+ throw new Error("Invalid path: Directory traversal attempt detected");
9
+ }
10
+ const normalized = path.normalize(userPath);
11
+ if (path.isAbsolute(normalized)) {
12
+ throw new Error("Invalid path: Absolute paths are not allowed");
13
+ }
14
+ const relativePath = path.relative("", normalized);
15
+ if (relativePath.startsWith("..")) {
16
+ throw new Error("Invalid path: Directory traversal attempt detected");
17
+ }
18
+ if (relativePath.includes("..")) {
19
+ throw new Error("Invalid path: Path contains invalid traversal sequences");
20
+ }
21
+ if (relativePath.includes("\0")) {
22
+ throw new Error("Invalid path: Path contains null bytes");
23
+ }
24
+ if (process.platform !== "win32") {
25
+ if (normalized.includes("\\")) {
26
+ throw new Error("Invalid path: Backslashes not allowed");
27
+ }
28
+ }
29
+ else {
30
+ if (normalized.includes(":") || normalized.startsWith("\\\\")) {
31
+ throw new Error("Invalid path: Path contains invalid Windows characters");
32
+ }
33
+ }
34
+ const segments = relativePath.split(path.sep);
35
+ for (const segment of segments) {
36
+ if (segment.startsWith(".") && segment !== ".") {
37
+ throw new Error("Invalid path: Hidden files are not allowed");
38
+ }
39
+ }
40
+ // Always return Unix-style paths for consistency across platforms
41
+ return relativePath.replace(/\\/g, "/");
42
+ }
43
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,uEAAuE;IACvE,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAEnD,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC"}