@llmindset/hf-mcp 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.
- package/dist/docs-search/doc-fetch.d.ts +24 -0
- package/dist/docs-search/doc-fetch.d.ts.map +1 -0
- package/dist/docs-search/doc-fetch.js +53 -0
- package/dist/docs-search/doc-fetch.js.map +1 -0
- package/dist/docs-search/doc-fetch.test.d.ts +2 -0
- package/dist/docs-search/doc-fetch.test.d.ts.map +1 -0
- package/dist/docs-search/doc-fetch.test.js +52 -0
- package/dist/docs-search/doc-fetch.test.js.map +1 -0
- package/dist/docs-search/doc-mappings.d.ts +7 -0
- package/dist/docs-search/doc-mappings.d.ts.map +1 -0
- package/dist/docs-search/doc-mappings.js +75 -0
- package/dist/docs-search/doc-mappings.js.map +1 -0
- package/dist/docs-search/docs-semantic-search.d.ts +41 -0
- package/dist/docs-search/docs-semantic-search.d.ts.map +1 -0
- package/dist/docs-search/docs-semantic-search.js +162 -0
- package/dist/docs-search/docs-semantic-search.js.map +1 -0
- package/dist/docs-search/docs-semantic-search.test.d.ts +2 -0
- package/dist/docs-search/docs-semantic-search.test.d.ts.map +1 -0
- package/dist/docs-search/docs-semantic-search.test.js +283 -0
- package/dist/docs-search/docs-semantic-search.test.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/tool-ids.d.ts +6 -4
- package/dist/tool-ids.d.ts.map +1 -1
- package/dist/tool-ids.js +7 -16
- package/dist/tool-ids.js.map +1 -1
- package/package.json +2 -2
- package/src/docs-search/doc-fetch.test.ts +74 -0
- package/src/docs-search/doc-fetch.ts +92 -0
- package/src/docs-search/doc-mappings.ts +79 -0
- package/src/docs-search/docs-semantic-search.test.ts +365 -0
- package/src/docs-search/docs-semantic-search.ts +244 -0
- package/src/index.ts +2 -0
- package/src/tool-ids.ts +9 -18
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { DocSearchTool } from './docs-semantic-search.js';
|
|
3
|
+
import { DOC_FETCH_CONFIG } from './doc-fetch.js';
|
|
4
|
+
const mockFetch = vi.fn();
|
|
5
|
+
global.fetch = mockFetch;
|
|
6
|
+
describe('DocSearchTool', () => {
|
|
7
|
+
let docSearchTool;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
docSearchTool = new DocSearchTool();
|
|
10
|
+
vi.clearAllMocks();
|
|
11
|
+
});
|
|
12
|
+
describe('search', () => {
|
|
13
|
+
it('should return error when query is too short', async () => {
|
|
14
|
+
await expect(docSearchTool.search({ query: 'ab' })).rejects.toThrow();
|
|
15
|
+
});
|
|
16
|
+
it('should return no results message when API returns empty array', async () => {
|
|
17
|
+
mockFetch.mockResolvedValueOnce({
|
|
18
|
+
ok: true,
|
|
19
|
+
json: () => Promise.resolve([]),
|
|
20
|
+
});
|
|
21
|
+
const result = await docSearchTool.search({ query: 'nonexistent' });
|
|
22
|
+
expect(result).toBe(`No documentation found for query 'nonexistent'`);
|
|
23
|
+
});
|
|
24
|
+
it('should return no results message with product filter', async () => {
|
|
25
|
+
mockFetch.mockResolvedValueOnce({
|
|
26
|
+
ok: true,
|
|
27
|
+
json: () => Promise.resolve([]),
|
|
28
|
+
});
|
|
29
|
+
const result = await docSearchTool.search({ query: 'nonexistent', product: 'hub' });
|
|
30
|
+
expect(result).toBe(`No documentation found for query 'nonexistent' in product 'hub'`);
|
|
31
|
+
});
|
|
32
|
+
it('should format results grouped by product and page', async () => {
|
|
33
|
+
const sampleResults = [
|
|
34
|
+
{
|
|
35
|
+
text: 'Download a comprehensive CSV file containing analytics',
|
|
36
|
+
product: 'hub',
|
|
37
|
+
heading1: 'Analytics',
|
|
38
|
+
source_page_url: 'https://huggingface.co/docs/hub/enterprise-hub-analytics#export-analytics-as-csv',
|
|
39
|
+
source_page_title: 'Enterprise-hub-analytics',
|
|
40
|
+
heading2: 'Export Analytics as CSV',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
text: 'View analytics for your repositories',
|
|
44
|
+
product: 'hub',
|
|
45
|
+
heading1: 'Analytics',
|
|
46
|
+
source_page_url: 'https://huggingface.co/docs/hub/enterprise-hub-analytics#export-analytics-as-csv',
|
|
47
|
+
source_page_title: 'Enterprise-hub-analytics',
|
|
48
|
+
heading2: 'View Analytics',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
text: 'In this quickstart, you will learn how to use the dataset viewer REST API',
|
|
52
|
+
product: 'dataset-viewer',
|
|
53
|
+
heading1: 'Quickstart',
|
|
54
|
+
source_page_url: 'https://huggingface.co/docs/dataset-viewer/quick_start#quickstart',
|
|
55
|
+
source_page_title: 'Quick start',
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
mockFetch.mockResolvedValueOnce({
|
|
59
|
+
ok: true,
|
|
60
|
+
json: () => Promise.resolve(sampleResults),
|
|
61
|
+
});
|
|
62
|
+
const result = await docSearchTool.search({ query: 'analytics' });
|
|
63
|
+
expect(result).toContain('# Documentation Library Search Results for "analytics"');
|
|
64
|
+
expect(result).toContain('Found 3 results');
|
|
65
|
+
const hubIndex = result.indexOf('## Results for Product: hub');
|
|
66
|
+
const datasetViewerIndex = result.indexOf('## Results for Product: dataset-viewer');
|
|
67
|
+
expect(hubIndex).toBeLessThan(datasetViewerIndex);
|
|
68
|
+
expect(hubIndex).toBeGreaterThan(-1);
|
|
69
|
+
expect(datasetViewerIndex).toBeGreaterThan(-1);
|
|
70
|
+
expect(result).toContain('## Results for Product: hub (2 results)');
|
|
71
|
+
expect(result).toContain('## Results for Product: dataset-viewer (1 results)');
|
|
72
|
+
expect(result).toContain('### Results from [Analytics](https://huggingface.co/docs/hub/enterprise-hub-analytics)');
|
|
73
|
+
expect(result).toContain('### Results from [Quickstart](https://huggingface.co/docs/dataset-viewer/quick_start)');
|
|
74
|
+
expect(result).toContain('#### Excerpt from the "Export Analytics as CSV" section');
|
|
75
|
+
expect(result).toContain('#### Excerpt from the "View Analytics" section');
|
|
76
|
+
expect(result).toContain('Download a comprehensive CSV file containing analytics');
|
|
77
|
+
expect(result).toContain('View analytics for your repositories');
|
|
78
|
+
expect(result).toContain('In this quickstart, you will learn how to use the dataset viewer REST API');
|
|
79
|
+
expect(result).toContain('Use the "' + DOC_FETCH_CONFIG.name + '" tool to fetch a document from the library.');
|
|
80
|
+
});
|
|
81
|
+
it('should handle results without heading2', async () => {
|
|
82
|
+
const sampleResults = [
|
|
83
|
+
{
|
|
84
|
+
text: 'This is a simple text without heading2',
|
|
85
|
+
product: 'transformers',
|
|
86
|
+
heading1: 'Introduction',
|
|
87
|
+
source_page_url: 'https://huggingface.co/docs/transformers/index',
|
|
88
|
+
source_page_title: 'Transformers',
|
|
89
|
+
},
|
|
90
|
+
];
|
|
91
|
+
mockFetch.mockResolvedValueOnce({
|
|
92
|
+
ok: true,
|
|
93
|
+
json: () => Promise.resolve(sampleResults),
|
|
94
|
+
});
|
|
95
|
+
const result = await docSearchTool.search({ query: 'transformers' });
|
|
96
|
+
expect(result).not.toContain('#### Excerpt from');
|
|
97
|
+
expect(result).toContain('This is a simple text without heading2');
|
|
98
|
+
});
|
|
99
|
+
it('should properly escape markdown special characters', async () => {
|
|
100
|
+
const sampleResults = [
|
|
101
|
+
{
|
|
102
|
+
text: 'Text with [brackets] and *asterisks* and _underscores_',
|
|
103
|
+
product: 'hub',
|
|
104
|
+
heading1: 'Special * Characters',
|
|
105
|
+
source_page_url: 'https://huggingface.co/docs/hub/test',
|
|
106
|
+
source_page_title: 'Test',
|
|
107
|
+
heading2: 'Section with [brackets]',
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
mockFetch.mockResolvedValueOnce({
|
|
111
|
+
ok: true,
|
|
112
|
+
json: () => Promise.resolve(sampleResults),
|
|
113
|
+
});
|
|
114
|
+
const result = await docSearchTool.search({ query: 'special' });
|
|
115
|
+
expect(result).toContain('Special \\* Characters');
|
|
116
|
+
expect(result).toContain('#### Excerpt from the "Section with [brackets]" section');
|
|
117
|
+
});
|
|
118
|
+
it('should clean HTML tags from text', async () => {
|
|
119
|
+
const sampleResults = [
|
|
120
|
+
{
|
|
121
|
+
text: 'Text with <div class="test">HTML tags</div> and <img src="test.png" alt="image"/>',
|
|
122
|
+
product: 'hub',
|
|
123
|
+
heading1: 'HTML Test',
|
|
124
|
+
source_page_url: 'https://huggingface.co/docs/hub/html-test',
|
|
125
|
+
source_page_title: 'HTML Test',
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
mockFetch.mockResolvedValueOnce({
|
|
129
|
+
ok: true,
|
|
130
|
+
json: () => Promise.resolve(sampleResults),
|
|
131
|
+
});
|
|
132
|
+
const result = await docSearchTool.search({ query: 'html' });
|
|
133
|
+
expect(result).toContain('Text with HTML tags and');
|
|
134
|
+
expect(result).not.toContain('<div');
|
|
135
|
+
expect(result).not.toContain('<img');
|
|
136
|
+
});
|
|
137
|
+
it('should sort multiple products and pages correctly by count', async () => {
|
|
138
|
+
const sampleResults = [
|
|
139
|
+
{
|
|
140
|
+
text: 'Result from hub page 1 - first',
|
|
141
|
+
product: 'hub',
|
|
142
|
+
heading1: 'Page 1',
|
|
143
|
+
source_page_url: 'https://huggingface.co/docs/hub/page1',
|
|
144
|
+
source_page_title: 'Page 1',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
text: 'Result from hub page 1 - second',
|
|
148
|
+
product: 'hub',
|
|
149
|
+
heading1: 'Page 1',
|
|
150
|
+
source_page_url: 'https://huggingface.co/docs/hub/page1',
|
|
151
|
+
source_page_title: 'Page 1',
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
text: 'Result from hub page 2',
|
|
155
|
+
product: 'hub',
|
|
156
|
+
heading1: 'Page 2',
|
|
157
|
+
source_page_url: 'https://huggingface.co/docs/hub/page2',
|
|
158
|
+
source_page_title: 'Page 2',
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
text: 'Result from transformers',
|
|
162
|
+
product: 'transformers',
|
|
163
|
+
heading1: 'Transformers Page',
|
|
164
|
+
source_page_url: 'https://huggingface.co/docs/transformers/page1',
|
|
165
|
+
source_page_title: 'Transformers',
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
text: 'Result from datasets',
|
|
169
|
+
product: 'datasets',
|
|
170
|
+
heading1: 'Datasets Page',
|
|
171
|
+
source_page_url: 'https://huggingface.co/docs/datasets/page1',
|
|
172
|
+
source_page_title: 'Datasets',
|
|
173
|
+
},
|
|
174
|
+
];
|
|
175
|
+
mockFetch.mockResolvedValueOnce({
|
|
176
|
+
ok: true,
|
|
177
|
+
json: () => Promise.resolve(sampleResults),
|
|
178
|
+
});
|
|
179
|
+
const result = await docSearchTool.search({ query: 'test' });
|
|
180
|
+
const hubIndex = result.indexOf('## Results for Product: hub');
|
|
181
|
+
const transformersIndex = result.indexOf('## Results for Product: transformers');
|
|
182
|
+
const datasetsIndex = result.indexOf('## Results for Product: datasets');
|
|
183
|
+
expect(hubIndex).toBeLessThan(transformersIndex);
|
|
184
|
+
expect(hubIndex).toBeLessThan(datasetsIndex);
|
|
185
|
+
expect(result).toContain('## Results for Product: hub (3 results)');
|
|
186
|
+
const page1Index = result.indexOf('https://huggingface.co/docs/hub/page1');
|
|
187
|
+
const page2Index = result.indexOf('https://huggingface.co/docs/hub/page2');
|
|
188
|
+
expect(page1Index).toBeLessThan(page2Index);
|
|
189
|
+
expect(result).toContain('### Results from [Page 1](https://huggingface.co/docs/hub/page1) (2 results)');
|
|
190
|
+
});
|
|
191
|
+
it('should include product filter in API call when provided', async () => {
|
|
192
|
+
mockFetch.mockResolvedValueOnce({
|
|
193
|
+
ok: true,
|
|
194
|
+
json: () => Promise.resolve([]),
|
|
195
|
+
});
|
|
196
|
+
await docSearchTool.search({ query: 'test', product: 'hub' });
|
|
197
|
+
expect(mockFetch).toHaveBeenCalledWith(expect.stringContaining('q=test&product=hub'), expect.any(Object));
|
|
198
|
+
});
|
|
199
|
+
it('should group results from the same page with different anchors together', async () => {
|
|
200
|
+
const sampleResults = [
|
|
201
|
+
{
|
|
202
|
+
text: 'First result from section 1',
|
|
203
|
+
product: 'hub',
|
|
204
|
+
heading1: 'Analytics',
|
|
205
|
+
source_page_url: 'https://huggingface.co/docs/hub/analytics#section1',
|
|
206
|
+
source_page_title: 'Analytics Page',
|
|
207
|
+
heading2: 'Section 1',
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
text: 'Second result from section 2',
|
|
211
|
+
product: 'hub',
|
|
212
|
+
heading1: 'Analytics',
|
|
213
|
+
source_page_url: 'https://huggingface.co/docs/hub/analytics#section2',
|
|
214
|
+
source_page_title: 'Analytics Page',
|
|
215
|
+
heading2: 'Section 2',
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
text: 'Third result from section 3',
|
|
219
|
+
product: 'hub',
|
|
220
|
+
heading1: 'Analytics',
|
|
221
|
+
source_page_url: 'https://huggingface.co/docs/hub/analytics#section3',
|
|
222
|
+
source_page_title: 'Analytics Page',
|
|
223
|
+
heading2: 'Section 3',
|
|
224
|
+
},
|
|
225
|
+
];
|
|
226
|
+
mockFetch.mockResolvedValueOnce({
|
|
227
|
+
ok: true,
|
|
228
|
+
json: () => Promise.resolve(sampleResults),
|
|
229
|
+
});
|
|
230
|
+
const result = await docSearchTool.search({ query: 'analytics' });
|
|
231
|
+
expect(result).toContain('### Results from [Analytics](https://huggingface.co/docs/hub/analytics) (3 results)');
|
|
232
|
+
expect(result).toContain('First result from section 1');
|
|
233
|
+
expect(result).toContain('Second result from section 2');
|
|
234
|
+
expect(result).toContain('Third result from section 3');
|
|
235
|
+
const resultsFromCount = (result.match(/### Results from/g) || []).length;
|
|
236
|
+
expect(resultsFromCount).toBe(1);
|
|
237
|
+
});
|
|
238
|
+
it('should handle API errors gracefully', async () => {
|
|
239
|
+
mockFetch.mockRejectedValueOnce(new Error('Network error'));
|
|
240
|
+
await expect(docSearchTool.search({ query: 'test' })).rejects.toThrow('Failed to search documentation:');
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
describe('groupResults', () => {
|
|
244
|
+
it('should group results by product and page URL', async () => {
|
|
245
|
+
const sampleResults = [
|
|
246
|
+
{
|
|
247
|
+
text: 'Result 1',
|
|
248
|
+
product: 'hub',
|
|
249
|
+
heading1: 'Page 1',
|
|
250
|
+
source_page_url: 'https://example.com/page1',
|
|
251
|
+
source_page_title: 'Page 1',
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
text: 'Result 2',
|
|
255
|
+
product: 'hub',
|
|
256
|
+
heading1: 'Page 1',
|
|
257
|
+
source_page_url: 'https://example.com/page1',
|
|
258
|
+
source_page_title: 'Page 1',
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
text: 'Result 3',
|
|
262
|
+
product: 'transformers',
|
|
263
|
+
heading1: 'Page 2',
|
|
264
|
+
source_page_url: 'https://example.com/page2',
|
|
265
|
+
source_page_title: 'Page 2',
|
|
266
|
+
},
|
|
267
|
+
];
|
|
268
|
+
mockFetch.mockResolvedValueOnce({
|
|
269
|
+
ok: true,
|
|
270
|
+
json: () => Promise.resolve(sampleResults),
|
|
271
|
+
});
|
|
272
|
+
const result = await docSearchTool.search({ query: 'test' });
|
|
273
|
+
expect(result).toContain('## Results for Product: hub');
|
|
274
|
+
expect(result).toContain('## Results for Product: transformers');
|
|
275
|
+
const result1Index = result.indexOf('Result 1');
|
|
276
|
+
const result2Index = result.indexOf('Result 2');
|
|
277
|
+
const result3Index = result.indexOf('Result 3');
|
|
278
|
+
expect(Math.abs(result2Index - result1Index)).toBeLessThan(100);
|
|
279
|
+
expect(Math.abs(result3Index - result1Index)).toBeGreaterThan(50);
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
//# sourceMappingURL=docs-semantic-search.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-semantic-search.test.js","sourceRoot":"","sources":["../../src/docs-search/docs-semantic-search.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC1B,MAAM,CAAC,KAAK,GAAG,SAAyB,CAAC;AAEzC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC9B,IAAI,aAA4B,CAAC;IAEjC,UAAU,CAAC,GAAG,EAAE;QACf,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QACpC,EAAE,CAAC,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC9E,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;aAC/B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACrE,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;aAC/B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACpF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,aAAa,GAAG;gBACrB;oBACC,IAAI,EAAE,wDAAwD;oBAC9D,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,WAAW;oBACrB,eAAe,EAAE,kFAAkF;oBACnG,iBAAiB,EAAE,0BAA0B;oBAC7C,QAAQ,EAAE,yBAAyB;iBACnC;gBACD;oBACC,IAAI,EAAE,sCAAsC;oBAC5C,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,WAAW;oBACrB,eAAe,EAAE,kFAAkF;oBACnG,iBAAiB,EAAE,0BAA0B;oBAC7C,QAAQ,EAAE,gBAAgB;iBAC1B;gBACD;oBACC,IAAI,EAAE,2EAA2E;oBACjF,OAAO,EAAE,gBAAgB;oBACzB,QAAQ,EAAE,YAAY;oBACtB,eAAe,EAAE,mEAAmE;oBACpF,iBAAiB,EAAE,aAAa;iBAChC;aACD,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC1C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YAGlE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wDAAwD,CAAC,CAAC;YACnF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAG5C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;YAC/D,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;YACpF,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;YAClD,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,kBAAkB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YAG/C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oDAAoD,CAAC,CAAC;YAG/E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CACvB,wFAAwF,CACxF,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uFAAuF,CAAC,CAAC;YAGlH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yDAAyD,CAAC,CAAC;YACpF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gDAAgD,CAAC,CAAC;YAG3E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wDAAwD,CAAC,CAAC;YACnF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2EAA2E,CAAC,CAAC;YAGtG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,GAAG,gBAAgB,CAAC,IAAI,GAAG,8CAA8C,CAAC,CAAC;QAChH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,aAAa,GAAG;gBACrB;oBACC,IAAI,EAAE,wCAAwC;oBAC9C,OAAO,EAAE,cAAc;oBACvB,QAAQ,EAAE,cAAc;oBACxB,eAAe,EAAE,gDAAgD;oBACjE,iBAAiB,EAAE,cAAc;iBACjC;aACD,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC1C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;YAGrE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,aAAa,GAAG;gBACrB;oBACC,IAAI,EAAE,wDAAwD;oBAC9D,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,sBAAsB;oBAChC,eAAe,EAAE,sCAAsC;oBACvD,iBAAiB,EAAE,MAAM;oBACzB,QAAQ,EAAE,yBAAyB;iBACnC;aACD,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC1C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAGhE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;YAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yDAAyD,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,aAAa,GAAG;gBACrB;oBACC,IAAI,EAAE,mFAAmF;oBACzF,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,WAAW;oBACrB,eAAe,EAAE,2CAA2C;oBAC5D,iBAAiB,EAAE,WAAW;iBAC9B;aACD,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC1C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAG7D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,aAAa,GAAG;gBAErB;oBACC,IAAI,EAAE,gCAAgC;oBACtC,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,uCAAuC;oBACxD,iBAAiB,EAAE,QAAQ;iBAC3B;gBACD;oBACC,IAAI,EAAE,iCAAiC;oBACvC,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,uCAAuC;oBACxD,iBAAiB,EAAE,QAAQ;iBAC3B;gBACD;oBACC,IAAI,EAAE,wBAAwB;oBAC9B,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,uCAAuC;oBACxD,iBAAiB,EAAE,QAAQ;iBAC3B;gBAED;oBACC,IAAI,EAAE,0BAA0B;oBAChC,OAAO,EAAE,cAAc;oBACvB,QAAQ,EAAE,mBAAmB;oBAC7B,eAAe,EAAE,gDAAgD;oBACjE,iBAAiB,EAAE,cAAc;iBACjC;gBAED;oBACC,IAAI,EAAE,sBAAsB;oBAC5B,OAAO,EAAE,UAAU;oBACnB,QAAQ,EAAE,eAAe;oBACzB,eAAe,EAAE,4CAA4C;oBAC7D,iBAAiB,EAAE,UAAU;iBAC7B;aACD,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC1C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAG7D,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;YAC/D,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;YACjF,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;YAEzE,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;YACjD,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAG7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;YAGpE,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;YAC3E,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;YAC3E,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAG5C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8EAA8E,CAAC,CAAC;QAC1G,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACxE,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;aAC/B,CAAC,CAAC;YAEH,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAE9D,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3G,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;YACxF,MAAM,aAAa,GAAG;gBACrB;oBACC,IAAI,EAAE,6BAA6B;oBACnC,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,WAAW;oBACrB,eAAe,EAAE,oDAAoD;oBACrE,iBAAiB,EAAE,gBAAgB;oBACnC,QAAQ,EAAE,WAAW;iBACrB;gBACD;oBACC,IAAI,EAAE,8BAA8B;oBACpC,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,WAAW;oBACrB,eAAe,EAAE,oDAAoD;oBACrE,iBAAiB,EAAE,gBAAgB;oBACnC,QAAQ,EAAE,WAAW;iBACrB;gBACD;oBACC,IAAI,EAAE,6BAA6B;oBACnC,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,WAAW;oBACrB,eAAe,EAAE,oDAAoD;oBACrE,iBAAiB,EAAE,gBAAgB;oBACnC,QAAQ,EAAE,WAAW;iBACrB;aACD,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC1C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YAGlE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qFAAqF,CAAC,CAAC;YAGhH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;YAGxD,MAAM,gBAAgB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAC1E,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACpD,SAAS,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;YAE5D,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;QAC1G,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,aAAa,GAAG;gBACrB;oBACC,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,2BAA2B;oBAC5C,iBAAiB,EAAE,QAAQ;iBAC3B;gBACD;oBACC,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,2BAA2B;oBAC5C,iBAAiB,EAAE,QAAQ;iBAC3B;gBACD;oBACC,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,cAAc;oBACvB,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,2BAA2B;oBAC5C,iBAAiB,EAAE,QAAQ;iBAC3B;aACD,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC1C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAG7D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAC;YAGjE,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAGhD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAEhE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,5 +12,7 @@ export * from './space-info.js';
|
|
|
12
12
|
export * from './space-files.js';
|
|
13
13
|
export * from './user-summary.js';
|
|
14
14
|
export * from './paper-summary.js';
|
|
15
|
+
export * from './docs-search/docs-semantic-search.js';
|
|
16
|
+
export * from './docs-search/doc-fetch.js';
|
|
15
17
|
export * from './tool-ids.js';
|
|
16
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAG3C,cAAc,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -12,5 +12,7 @@ export * from './space-info.js';
|
|
|
12
12
|
export * from './space-files.js';
|
|
13
13
|
export * from './user-summary.js';
|
|
14
14
|
export * from './paper-summary.js';
|
|
15
|
+
export * from './docs-search/docs-semantic-search.js';
|
|
16
|
+
export * from './docs-search/doc-fetch.js';
|
|
15
17
|
export * from './tool-ids.js';
|
|
16
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAG3C,cAAc,eAAe,CAAC"}
|
package/dist/tool-ids.d.ts
CHANGED
|
@@ -7,17 +7,19 @@ export declare const DATASET_DETAIL_TOOL_ID: "dataset_details";
|
|
|
7
7
|
export declare const DUPLICATE_SPACE_TOOL_ID: "duplicate_space";
|
|
8
8
|
export declare const SPACE_INFO_TOOL_ID: "space_info";
|
|
9
9
|
export declare const SPACE_FILES_TOOL_ID: "space_files";
|
|
10
|
+
export declare const DOCS_SEMANTIC_SEARCH_TOOL_ID: "hf_doc_search";
|
|
11
|
+
export declare const DOC_FETCH_TOOL_ID: "hf_doc_fetch";
|
|
10
12
|
export declare const USER_SUMMARY_PROMPT_ID: "User Summary";
|
|
11
13
|
export declare const PAPER_SUMMARY_PROMPT_ID: "Paper Summary";
|
|
12
|
-
export declare const ALL_BUILTIN_TOOL_IDS: readonly ["space_search", "model_search", "model_details", "paper_search", "dataset_search", "dataset_details", "duplicate_space", "space_info", "space_files"];
|
|
14
|
+
export declare const ALL_BUILTIN_TOOL_IDS: readonly ["space_search", "model_search", "model_details", "paper_search", "dataset_search", "dataset_details", "duplicate_space", "space_info", "space_files", "hf_doc_search", "hf_doc_fetch"];
|
|
13
15
|
export declare const TOOL_ID_GROUPS: {
|
|
14
|
-
readonly search: readonly ["space_search", "model_search", "dataset_search", "paper_search"];
|
|
16
|
+
readonly search: readonly ["space_search", "model_search", "dataset_search", "paper_search", "hf_doc_search"];
|
|
15
17
|
readonly spaces: readonly ["space_search", "duplicate_space", "space_info", "space_files"];
|
|
16
18
|
readonly detail: readonly ["model_details", "dataset_details"];
|
|
19
|
+
readonly docs: readonly ["hf_doc_search", "hf_doc_fetch"];
|
|
17
20
|
readonly hf_api: readonly ["space_search", "model_search", "dataset_search", "paper_search", "model_details", "dataset_details"];
|
|
18
|
-
readonly all: readonly ["space_search", "model_search", "model_details", "paper_search", "dataset_search", "dataset_details", "duplicate_space", "space_info", "space_files"];
|
|
21
|
+
readonly all: readonly ["space_search", "model_search", "model_details", "paper_search", "dataset_search", "dataset_details", "duplicate_space", "space_info", "space_files", "hf_doc_search", "hf_doc_fetch"];
|
|
19
22
|
};
|
|
20
23
|
export type BuiltinToolId = (typeof ALL_BUILTIN_TOOL_IDS)[number];
|
|
21
24
|
export declare function isValidBuiltinToolId(toolId: string): toolId is BuiltinToolId;
|
|
22
|
-
export declare function getToolDescription(toolId: BuiltinToolId): string;
|
|
23
25
|
//# sourceMappingURL=tool-ids.d.ts.map
|
package/dist/tool-ids.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-ids.d.ts","sourceRoot":"","sources":["../src/tool-ids.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool-ids.d.ts","sourceRoot":"","sources":["../src/tool-ids.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,oBAAoB,gBAAmC,CAAC;AACrE,eAAO,MAAM,oBAAoB,gBAAgC,CAAC;AAClE,eAAO,MAAM,oBAAoB,iBAAgC,CAAC;AAClE,eAAO,MAAM,oBAAoB,gBAAgC,CAAC;AAClE,eAAO,MAAM,sBAAsB,kBAAkC,CAAC;AACtE,eAAO,MAAM,sBAAsB,mBAAkC,CAAC;AACtE,eAAO,MAAM,uBAAuB,mBAAmC,CAAC;AACxE,eAAO,MAAM,kBAAkB,cAA8B,CAAC;AAC9D,eAAO,MAAM,mBAAmB,eAA+B,CAAC;AAChE,eAAO,MAAM,4BAA4B,iBAAmC,CAAC;AAC7E,eAAO,MAAM,iBAAiB,gBAAwB,CAAC;AACvD,eAAO,MAAM,sBAAsB,gBAAkC,CAAC;AACtE,eAAO,MAAM,uBAAuB,iBAAmC,CAAC;AAIxE,eAAO,MAAM,oBAAoB,kMAYvB,CAAC;AAEX,eAAO,MAAM,cAAc;;;;;;;CAcjB,CAAC;AAGX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAGlE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,aAAa,CAE5E"}
|
package/dist/tool-ids.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SEMANTIC_SEARCH_TOOL_CONFIG, MODEL_SEARCH_TOOL_CONFIG, MODEL_DETAIL_TOOL_CONFIG, PAPER_SEARCH_TOOL_CONFIG, DATASET_SEARCH_TOOL_CONFIG, DATASET_DETAIL_TOOL_CONFIG, DUPLICATE_SPACE_TOOL_CONFIG, SPACE_INFO_TOOL_CONFIG, SPACE_FILES_TOOL_CONFIG, USER_SUMMARY_PROMPT_CONFIG, PAPER_SUMMARY_PROMPT_CONFIG, } from './index.js';
|
|
1
|
+
import { SEMANTIC_SEARCH_TOOL_CONFIG, MODEL_SEARCH_TOOL_CONFIG, MODEL_DETAIL_TOOL_CONFIG, PAPER_SEARCH_TOOL_CONFIG, DATASET_SEARCH_TOOL_CONFIG, DATASET_DETAIL_TOOL_CONFIG, DUPLICATE_SPACE_TOOL_CONFIG, SPACE_INFO_TOOL_CONFIG, SPACE_FILES_TOOL_CONFIG, USER_SUMMARY_PROMPT_CONFIG, PAPER_SUMMARY_PROMPT_CONFIG, DOCS_SEMANTIC_SEARCH_CONFIG, DOC_FETCH_CONFIG, } from './index.js';
|
|
2
2
|
export const SPACE_SEARCH_TOOL_ID = SEMANTIC_SEARCH_TOOL_CONFIG.name;
|
|
3
3
|
export const MODEL_SEARCH_TOOL_ID = MODEL_SEARCH_TOOL_CONFIG.name;
|
|
4
4
|
export const MODEL_DETAIL_TOOL_ID = MODEL_DETAIL_TOOL_CONFIG.name;
|
|
@@ -8,6 +8,8 @@ export const DATASET_DETAIL_TOOL_ID = DATASET_DETAIL_TOOL_CONFIG.name;
|
|
|
8
8
|
export const DUPLICATE_SPACE_TOOL_ID = DUPLICATE_SPACE_TOOL_CONFIG.name;
|
|
9
9
|
export const SPACE_INFO_TOOL_ID = SPACE_INFO_TOOL_CONFIG.name;
|
|
10
10
|
export const SPACE_FILES_TOOL_ID = SPACE_FILES_TOOL_CONFIG.name;
|
|
11
|
+
export const DOCS_SEMANTIC_SEARCH_TOOL_ID = DOCS_SEMANTIC_SEARCH_CONFIG.name;
|
|
12
|
+
export const DOC_FETCH_TOOL_ID = DOC_FETCH_CONFIG.name;
|
|
11
13
|
export const USER_SUMMARY_PROMPT_ID = USER_SUMMARY_PROMPT_CONFIG.name;
|
|
12
14
|
export const PAPER_SUMMARY_PROMPT_ID = PAPER_SUMMARY_PROMPT_CONFIG.name;
|
|
13
15
|
export const ALL_BUILTIN_TOOL_IDS = [
|
|
@@ -20,11 +22,14 @@ export const ALL_BUILTIN_TOOL_IDS = [
|
|
|
20
22
|
DUPLICATE_SPACE_TOOL_ID,
|
|
21
23
|
SPACE_INFO_TOOL_ID,
|
|
22
24
|
SPACE_FILES_TOOL_ID,
|
|
25
|
+
DOCS_SEMANTIC_SEARCH_TOOL_ID,
|
|
26
|
+
DOC_FETCH_TOOL_ID,
|
|
23
27
|
];
|
|
24
28
|
export const TOOL_ID_GROUPS = {
|
|
25
|
-
search: [SPACE_SEARCH_TOOL_ID, MODEL_SEARCH_TOOL_ID, DATASET_SEARCH_TOOL_ID, PAPER_SEARCH_TOOL_ID],
|
|
29
|
+
search: [SPACE_SEARCH_TOOL_ID, MODEL_SEARCH_TOOL_ID, DATASET_SEARCH_TOOL_ID, PAPER_SEARCH_TOOL_ID, DOCS_SEMANTIC_SEARCH_TOOL_ID],
|
|
26
30
|
spaces: [SPACE_SEARCH_TOOL_ID, DUPLICATE_SPACE_TOOL_ID, SPACE_INFO_TOOL_ID, SPACE_FILES_TOOL_ID],
|
|
27
31
|
detail: [MODEL_DETAIL_TOOL_ID, DATASET_DETAIL_TOOL_ID],
|
|
32
|
+
docs: [DOCS_SEMANTIC_SEARCH_TOOL_ID, DOC_FETCH_TOOL_ID],
|
|
28
33
|
hf_api: [
|
|
29
34
|
SPACE_SEARCH_TOOL_ID,
|
|
30
35
|
MODEL_SEARCH_TOOL_ID,
|
|
@@ -38,18 +43,4 @@ export const TOOL_ID_GROUPS = {
|
|
|
38
43
|
export function isValidBuiltinToolId(toolId) {
|
|
39
44
|
return ALL_BUILTIN_TOOL_IDS.includes(toolId);
|
|
40
45
|
}
|
|
41
|
-
export function getToolDescription(toolId) {
|
|
42
|
-
const configs = {
|
|
43
|
-
[SPACE_SEARCH_TOOL_ID]: SEMANTIC_SEARCH_TOOL_CONFIG,
|
|
44
|
-
[MODEL_SEARCH_TOOL_ID]: MODEL_SEARCH_TOOL_CONFIG,
|
|
45
|
-
[MODEL_DETAIL_TOOL_ID]: MODEL_DETAIL_TOOL_CONFIG,
|
|
46
|
-
[PAPER_SEARCH_TOOL_ID]: PAPER_SEARCH_TOOL_CONFIG,
|
|
47
|
-
[DATASET_SEARCH_TOOL_ID]: DATASET_SEARCH_TOOL_CONFIG,
|
|
48
|
-
[DATASET_DETAIL_TOOL_ID]: DATASET_DETAIL_TOOL_CONFIG,
|
|
49
|
-
[DUPLICATE_SPACE_TOOL_ID]: DUPLICATE_SPACE_TOOL_CONFIG,
|
|
50
|
-
[SPACE_INFO_TOOL_ID]: SPACE_INFO_TOOL_CONFIG,
|
|
51
|
-
[SPACE_FILES_TOOL_ID]: SPACE_FILES_TOOL_CONFIG,
|
|
52
|
-
};
|
|
53
|
-
return configs[toolId]?.description || `Tool: ${toolId}`;
|
|
54
|
-
}
|
|
55
46
|
//# sourceMappingURL=tool-ids.js.map
|
package/dist/tool-ids.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-ids.js","sourceRoot":"","sources":["../src/tool-ids.ts"],"names":[],"mappings":"AAKA,OAAO,EACN,2BAA2B,EAC3B,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,0BAA0B,EAC1B,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,
|
|
1
|
+
{"version":3,"file":"tool-ids.js","sourceRoot":"","sources":["../src/tool-ids.ts"],"names":[],"mappings":"AAKA,OAAO,EACN,2BAA2B,EAC3B,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,0BAA0B,EAC1B,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,2BAA2B,EAC3B,gBAAgB,GAChB,MAAM,YAAY,CAAC;AAGpB,MAAM,CAAC,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,IAAI,CAAC;AACrE,MAAM,CAAC,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,IAAI,CAAC;AAClE,MAAM,CAAC,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,IAAI,CAAC;AAClE,MAAM,CAAC,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,IAAI,CAAC;AAClE,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC,IAAI,CAAC;AACtE,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC,IAAI,CAAC;AACtE,MAAM,CAAC,MAAM,uBAAuB,GAAG,2BAA2B,CAAC,IAAI,CAAC;AACxE,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,IAAI,CAAC;AAC9D,MAAM,CAAC,MAAM,mBAAmB,GAAG,uBAAuB,CAAC,IAAI,CAAC;AAChE,MAAM,CAAC,MAAM,4BAA4B,GAAG,2BAA2B,CAAC,IAAI,CAAC;AAC7E,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,IAAI,CAAC;AACvD,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC,IAAI,CAAC;AACtE,MAAM,CAAC,MAAM,uBAAuB,GAAG,2BAA2B,CAAC,IAAI,CAAC;AAIxE,MAAM,CAAC,MAAM,oBAAoB,GAAG;IACnC,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,sBAAsB;IACtB,sBAAsB;IACtB,uBAAuB;IACvB,kBAAkB;IAClB,mBAAmB;IACnB,4BAA4B;IAC5B,iBAAiB;CACR,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,MAAM,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,4BAA4B,CAAU;IACzI,MAAM,EAAE,CAAC,oBAAoB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,mBAAmB,CAAU;IACzG,MAAM,EAAE,CAAC,oBAAoB,EAAE,sBAAsB,CAAU;IAC/D,IAAI,EAAE,CAAC,4BAA4B,EAAE,iBAAiB,CAAU;IAChE,MAAM,EAAE;QACP,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;QACtB,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;KACb;IACV,GAAG,EAAE,CAAC,GAAG,oBAAoB,CAAU;CAC9B,CAAC;AAMX,MAAM,UAAU,oBAAoB,CAAC,MAAc;IAClD,OAAQ,oBAA0C,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACrE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@llmindset/hf-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.19",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"@types/node": "^22.15.18",
|
|
32
32
|
"eslint": "^9.25.0",
|
|
33
33
|
"globals": "^16.0.0",
|
|
34
|
-
"rimraf": "^
|
|
34
|
+
"rimraf": "^6.0.1",
|
|
35
35
|
"typescript-eslint": "^8.32.1",
|
|
36
36
|
"vitest": "^3.1.3"
|
|
37
37
|
},
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { DocFetchTool } from './doc-fetch.js';
|
|
3
|
+
|
|
4
|
+
describe('DocFetchTool', () => {
|
|
5
|
+
const tool = new DocFetchTool();
|
|
6
|
+
|
|
7
|
+
describe('URL conversion', () => {
|
|
8
|
+
it('should convert basic HF docs URL to GitHub URL', () => {
|
|
9
|
+
const hfUrl = 'https://huggingface.co/docs/dataset-viewer/index';
|
|
10
|
+
const expectedUrl =
|
|
11
|
+
'https://raw.githubusercontent.com/huggingface/dataset-viewer/refs/heads/main/docs/source/index.md';
|
|
12
|
+
|
|
13
|
+
const result = tool.processUrl(hfUrl);
|
|
14
|
+
expect(result).toBe(expectedUrl);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('should handle URLs with fragments by removing them', () => {
|
|
18
|
+
const hfUrl = 'https://huggingface.co/docs/huggingface_hub/guides/upload#faster-uploads';
|
|
19
|
+
const expectedUrl =
|
|
20
|
+
'https://raw.githubusercontent.com/huggingface/huggingface_hub/refs/heads/main/docs/source/en/guides/upload.md';
|
|
21
|
+
|
|
22
|
+
const result = tool.processUrl(hfUrl);
|
|
23
|
+
expect(result).toBe(expectedUrl);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('should handle transformers documentation', () => {
|
|
27
|
+
const hfUrl = 'https://huggingface.co/docs/transformers/model_doc/bert';
|
|
28
|
+
const expectedUrl =
|
|
29
|
+
'https://raw.githubusercontent.com/huggingface/transformers/refs/heads/main/docs/source/en/model_doc/bert.md';
|
|
30
|
+
|
|
31
|
+
const result = tool.processUrl(hfUrl);
|
|
32
|
+
expect(result).toBe(expectedUrl);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('should handle diffusers documentation', () => {
|
|
36
|
+
const hfUrl = 'https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion';
|
|
37
|
+
const expectedUrl =
|
|
38
|
+
'https://raw.githubusercontent.com/huggingface/diffusers/refs/heads/main/docs/source/en/api/pipelines/stable_diffusion.md';
|
|
39
|
+
|
|
40
|
+
const result = tool.processUrl(hfUrl);
|
|
41
|
+
expect(result).toBe(expectedUrl);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('should handle timm documentation with custom package name', () => {
|
|
45
|
+
const hfUrl = 'https://huggingface.co/docs/timm/models';
|
|
46
|
+
const expectedUrl =
|
|
47
|
+
'https://raw.githubusercontent.com/huggingface/pytorch-image-models/refs/heads/main/hfdocs/source/models.md';
|
|
48
|
+
|
|
49
|
+
const result = tool.processUrl(hfUrl);
|
|
50
|
+
expect(result).toBe(expectedUrl);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('should default to index.md when no path is provided', () => {
|
|
54
|
+
const hfUrl = 'https://huggingface.co/docs/transformers';
|
|
55
|
+
const expectedUrl =
|
|
56
|
+
'https://raw.githubusercontent.com/huggingface/transformers/refs/heads/main/docs/source/en/index.md';
|
|
57
|
+
|
|
58
|
+
const result = tool.processUrl(hfUrl);
|
|
59
|
+
expect(result).toBe(expectedUrl);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('should throw error for URLs not starting with correct prefix', () => {
|
|
63
|
+
const invalidUrl = 'https://example.com/docs/something';
|
|
64
|
+
|
|
65
|
+
expect(() => tool.processUrl(invalidUrl)).toThrow('That was not a valid Hugging Face document URL');
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('should throw error for unknown package names', () => {
|
|
69
|
+
const unknownPackageUrl = 'https://huggingface.co/docs/unknown-package/guide';
|
|
70
|
+
|
|
71
|
+
expect(tool.processUrl(unknownPackageUrl)).toBe('https://huggingface.co/docs/unknown-package/guide');
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
});
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { DOC_MAPPINGS } from './doc-mappings.js';
|
|
3
|
+
|
|
4
|
+
export const DOC_FETCH_CONFIG = {
|
|
5
|
+
name: 'hf_doc_fetch',
|
|
6
|
+
description: 'Fetch a document from the Hugging Face documentation library.',
|
|
7
|
+
schema: z.object({
|
|
8
|
+
doc_url: z
|
|
9
|
+
.string()
|
|
10
|
+
.min(28, 'Url should start with https://huggingface.co/docs/')
|
|
11
|
+
.max(200, 'Query too long')
|
|
12
|
+
.describe('Hugging Face documentation URL'),
|
|
13
|
+
}),
|
|
14
|
+
annotations: {
|
|
15
|
+
title: 'Fetch a document from the Hugging Face library',
|
|
16
|
+
destructiveHint: false,
|
|
17
|
+
readOnlyHint: true,
|
|
18
|
+
openWorldHint: true,
|
|
19
|
+
},
|
|
20
|
+
} as const;
|
|
21
|
+
|
|
22
|
+
export type DocFetchParams = z.infer<typeof DOC_FETCH_CONFIG.schema>;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Return a (usually) markdown document for a Doc URL
|
|
26
|
+
*
|
|
27
|
+
* There were a few different options for this...
|
|
28
|
+
* 1) Return the HTML directly. Good option would include any post-processing (but prefer markdown)
|
|
29
|
+
* 2) Get the HTML and convert to markdown
|
|
30
|
+
* 3) Get the HTML and follow the GitHub link to get the raw markdown file
|
|
31
|
+
* 4) Use a mapping.
|
|
32
|
+
*
|
|
33
|
+
* There is also the risk that the GitHub HEAD is newer than the indexed version. Will leave as is for now
|
|
34
|
+
* but might want to reconsider this. Mappings were built from:
|
|
35
|
+
* https://github.com/huggingface/doc-builder/blob/main/.github/workflows/build_embeddings.yml
|
|
36
|
+
*
|
|
37
|
+
* Falls back to HTML if no mapping is found...
|
|
38
|
+
*
|
|
39
|
+
*/
|
|
40
|
+
export class DocFetchTool {
|
|
41
|
+
/**
|
|
42
|
+
* Convert HF docs URL to GitHub raw content URL
|
|
43
|
+
*/
|
|
44
|
+
processUrl(hfUrl: string): string {
|
|
45
|
+
// Validate URL format
|
|
46
|
+
if (!hfUrl.startsWith('https://huggingface.co/docs/')) {
|
|
47
|
+
throw new Error('That was not a valid Hugging Face document URL');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Remove the base URL and any fragment identifier
|
|
51
|
+
const urlPath = hfUrl.replace('https://huggingface.co/docs/', '').split('#')[0] || '';
|
|
52
|
+
|
|
53
|
+
// Extract package name and path
|
|
54
|
+
const parts = urlPath.split('/');
|
|
55
|
+
const packageName = parts[0] || '';
|
|
56
|
+
|
|
57
|
+
// Check if package exists in mapping
|
|
58
|
+
let fetchUrl = hfUrl;
|
|
59
|
+
const mapping = DOC_MAPPINGS[packageName];
|
|
60
|
+
if (mapping) {
|
|
61
|
+
const remainingPath = parts.slice(1).join('/');
|
|
62
|
+
const filePath = remainingPath ? `${remainingPath}.md` : 'index.md';
|
|
63
|
+
|
|
64
|
+
// Construct GitHub raw URL
|
|
65
|
+
const githubUrl = `https://raw.githubusercontent.com/${mapping.repo_id}/refs/heads/main/${mapping.doc_folder}/${filePath}`;
|
|
66
|
+
fetchUrl = githubUrl;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Build the file path
|
|
70
|
+
return fetchUrl;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Fetch markdown content from GitHub
|
|
75
|
+
*/
|
|
76
|
+
async fetch(url: string): Promise<string> {
|
|
77
|
+
try {
|
|
78
|
+
const githubUrl = this.processUrl(url);
|
|
79
|
+
|
|
80
|
+
const response = await fetch(githubUrl);
|
|
81
|
+
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
throw new Error(`Failed to fetch document: ${response.status} ${response.statusText}`);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const content = await response.text();
|
|
87
|
+
return content;
|
|
88
|
+
} catch (error) {
|
|
89
|
+
throw new Error(`Failed to fetch document: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|