@cosmocoder/mcp-web-docs 2.0.21 → 2.0.22
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/build/config.d.ts +0 -1
- package/build/config.js +0 -30
- package/build/config.js.map +1 -1
- package/build/config.test.js +1 -15
- package/build/config.test.js.map +1 -1
- package/build/crawler/base.d.ts +0 -13
- package/build/crawler/base.js +4 -116
- package/build/crawler/base.js.map +1 -1
- package/build/crawler/base.test.js +2 -172
- package/build/crawler/base.test.js.map +1 -1
- package/build/crawler/crawlee-crawler.js +0 -1
- package/build/crawler/crawlee-crawler.js.map +1 -1
- package/build/crawler/crawlee-crawler.test.js +13 -0
- package/build/crawler/crawlee-crawler.test.js.map +1 -1
- package/build/crawler/docs-crawler.d.ts +1 -2
- package/build/crawler/docs-crawler.js +3 -5
- package/build/crawler/docs-crawler.js.map +1 -1
- package/build/crawler/docs-crawler.test.js +3 -9
- package/build/crawler/docs-crawler.test.js.map +1 -1
- package/build/crawler/github.d.ts +1 -1
- package/build/crawler/github.js +7 -7
- package/build/crawler/github.js.map +1 -1
- package/build/crawler/github.test.js +8 -19
- package/build/crawler/github.test.js.map +1 -1
- package/build/crawler/llms-txt.js +5 -3
- package/build/crawler/llms-txt.js.map +1 -1
- package/build/crawler/llms-txt.test.js +2 -0
- package/build/crawler/llms-txt.test.js.map +1 -1
- package/build/index.js +7 -1687
- package/build/index.js.map +1 -1
- package/build/index.test.js +124 -422
- package/build/index.test.js.map +1 -1
- package/build/indexing/queue-manager.js +3 -2
- package/build/indexing/queue-manager.js.map +1 -1
- package/build/indexing/workflow.d.ts +38 -0
- package/build/indexing/workflow.js +223 -0
- package/build/indexing/workflow.js.map +1 -0
- package/build/indexing/workflow.test.d.ts +1 -0
- package/build/indexing/workflow.test.js +218 -0
- package/build/indexing/workflow.test.js.map +1 -0
- package/build/server.d.ts +88 -0
- package/build/server.js +1460 -0
- package/build/server.js.map +1 -0
- package/build/server.test.d.ts +1 -0
- package/build/server.test.js +27 -0
- package/build/server.test.js.map +1 -0
- package/build/storage/storage.js +1 -0
- package/build/storage/storage.js.map +1 -1
- package/build/storage/storage.test.js +25 -8
- package/build/storage/storage.test.js.map +1 -1
- package/build/util/docs.js +1 -2
- package/build/util/docs.js.map +1 -1
- package/build/util/docs.test.js +8 -2
- package/build/util/docs.test.js.map +1 -1
- package/build/util/security.d.ts +1 -0
- package/build/util/security.js +6 -5
- package/build/util/security.js.map +1 -1
- package/build/util/security.test.js +7 -1
- package/build/util/security.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { SessionExpiredError } from '../util/security.js';
|
|
2
|
+
import { DocsCrawler } from '../crawler/docs-crawler.js';
|
|
3
|
+
import { IndexingWorkflow } from './workflow.js';
|
|
4
|
+
const request = {
|
|
5
|
+
operationId: 'operation-1',
|
|
6
|
+
url: 'https://docs.example.com',
|
|
7
|
+
title: 'Example Docs',
|
|
8
|
+
};
|
|
9
|
+
const page = {
|
|
10
|
+
url: request.url,
|
|
11
|
+
path: '/',
|
|
12
|
+
content: '<h1>Example</h1>',
|
|
13
|
+
contentFormat: 'text',
|
|
14
|
+
title: request.title,
|
|
15
|
+
};
|
|
16
|
+
const chunk = {
|
|
17
|
+
content: 'Example content',
|
|
18
|
+
url: request.url,
|
|
19
|
+
title: request.title,
|
|
20
|
+
path: '/',
|
|
21
|
+
startLine: 0,
|
|
22
|
+
endLine: 0,
|
|
23
|
+
vector: [0.1, 0.2],
|
|
24
|
+
metadata: { type: 'overview' },
|
|
25
|
+
};
|
|
26
|
+
function createHarness(options = {}) {
|
|
27
|
+
const addDocument = vi.fn().mockResolvedValue(undefined);
|
|
28
|
+
const store = {
|
|
29
|
+
addDocument,
|
|
30
|
+
getDocument: vi.fn().mockResolvedValue(options.existingDocument ?? null),
|
|
31
|
+
optimize: vi.fn().mockResolvedValue({ compacted: false, cleanedUp: false }),
|
|
32
|
+
};
|
|
33
|
+
const statusTracker = {
|
|
34
|
+
cancelIndexing: vi.fn(),
|
|
35
|
+
completeIndexing: vi.fn(),
|
|
36
|
+
failIndexing: vi.fn(),
|
|
37
|
+
getStatus: vi.fn(),
|
|
38
|
+
updateProgress: vi.fn(),
|
|
39
|
+
updateStats: vi.fn(),
|
|
40
|
+
};
|
|
41
|
+
const authManager = {
|
|
42
|
+
clearSession: vi.fn().mockResolvedValue(undefined),
|
|
43
|
+
loadSession: vi.fn().mockResolvedValue(options.savedSession ?? null),
|
|
44
|
+
};
|
|
45
|
+
const crawler = {
|
|
46
|
+
abort: vi.fn(),
|
|
47
|
+
crawl: options.crawl ??
|
|
48
|
+
async function* () {
|
|
49
|
+
yield page;
|
|
50
|
+
},
|
|
51
|
+
setPathPrefix: vi.fn(),
|
|
52
|
+
setStorageState: vi.fn(),
|
|
53
|
+
};
|
|
54
|
+
const process = vi.fn(options.process ??
|
|
55
|
+
(async () => ({
|
|
56
|
+
metadata: { url: page.url, title: page.title, lastIndexed: new Date() },
|
|
57
|
+
chunks: [chunk],
|
|
58
|
+
})));
|
|
59
|
+
const processor = { process };
|
|
60
|
+
const createCrawler = vi.fn(options.createCrawler ?? (() => crawler));
|
|
61
|
+
const fetchFavicon = vi.fn().mockResolvedValue('data:image/x-icon;base64,AA==');
|
|
62
|
+
const workflow = new IndexingWorkflow({ store, processor, statusTracker, authManager, createCrawler, fetchFavicon });
|
|
63
|
+
return { workflow, store, statusTracker, authManager, crawler, createCrawler, fetchFavicon, addDocument, process };
|
|
64
|
+
}
|
|
65
|
+
const runWorkflow = (workflow, indexingRequest, signal = new AbortController().signal) => workflow.run(indexingRequest, signal);
|
|
66
|
+
describe('IndexingWorkflow', () => {
|
|
67
|
+
it('crawls, processes, stores, tags, completes, and optimizes a document', async () => {
|
|
68
|
+
const harness = createHarness();
|
|
69
|
+
await runWorkflow(harness.workflow, { ...request, pathPrefix: '/guide', tags: ['guide'], version: '2' });
|
|
70
|
+
expect(harness.createCrawler).toHaveBeenCalledWith();
|
|
71
|
+
expect(harness.crawler.setPathPrefix).toHaveBeenCalledWith('/guide');
|
|
72
|
+
expect(harness.addDocument).toHaveBeenCalledWith({
|
|
73
|
+
metadata: expect.objectContaining({
|
|
74
|
+
url: request.url,
|
|
75
|
+
title: request.title,
|
|
76
|
+
favicon: 'data:image/x-icon;base64,AA==',
|
|
77
|
+
version: '2',
|
|
78
|
+
pathPrefix: '/guide',
|
|
79
|
+
}),
|
|
80
|
+
chunks: [chunk],
|
|
81
|
+
}, { signal: expect.any(AbortSignal), tags: ['guide'] });
|
|
82
|
+
expect(harness.statusTracker.completeIndexing).toHaveBeenCalledWith(request.operationId);
|
|
83
|
+
expect(harness.store.optimize).toHaveBeenCalledOnce();
|
|
84
|
+
const progressStages = harness.statusTracker.updateProgress.mock.calls.map((call) => call[2]);
|
|
85
|
+
expect(progressStages).toEqual(expect.arrayContaining(['Finding subpages', 'Finding subpages (/)', 'Creating embeddings (1/1)', 'Storing 1 chunks']));
|
|
86
|
+
expect(progressStages.indexOf('Finding subpages')).toBeLessThan(progressStages.indexOf('Creating embeddings (1/1)'));
|
|
87
|
+
expect(progressStages.indexOf('Creating embeddings (1/1)')).toBeLessThan(progressStages.indexOf('Storing 1 chunks'));
|
|
88
|
+
expect(harness.statusTracker.updateStats).toHaveBeenCalledWith(request.operationId, { pagesFound: 1 });
|
|
89
|
+
expect(harness.statusTracker.updateStats).toHaveBeenCalledWith(request.operationId, { pagesProcessed: 1, chunksCreated: 1 });
|
|
90
|
+
expect(harness.statusTracker.updateStats).toHaveBeenCalledWith(request.operationId, { chunksCreated: 1 });
|
|
91
|
+
});
|
|
92
|
+
it('reindexes only after processing and finishes metadata after the replacement write', async () => {
|
|
93
|
+
const harness = createHarness({
|
|
94
|
+
existingDocument: { url: request.url, title: request.title, lastIndexed: new Date() },
|
|
95
|
+
});
|
|
96
|
+
await runWorkflow(harness.workflow, { ...request, reIndex: true, tags: ['existing'] });
|
|
97
|
+
const processOrder = harness.process.mock.invocationCallOrder[0];
|
|
98
|
+
const addOrder = harness.addDocument.mock.invocationCallOrder[0];
|
|
99
|
+
expect(processOrder).toBeLessThan(addOrder);
|
|
100
|
+
expect(addOrder).toBeLessThan(harness.statusTracker.completeIndexing.mock.invocationCallOrder[0]);
|
|
101
|
+
const progressStages = harness.statusTracker.updateProgress.mock.calls.map((call) => call[2]);
|
|
102
|
+
expect(progressStages.indexOf('Creating embeddings (1/1)')).toBeLessThan(progressStages.indexOf('Storing 1 chunks'));
|
|
103
|
+
expect(harness.statusTracker.updateStats).toHaveBeenCalledWith(request.operationId, {
|
|
104
|
+
pagesProcessed: 1,
|
|
105
|
+
chunksCreated: 1,
|
|
106
|
+
});
|
|
107
|
+
const failedWrite = createHarness({
|
|
108
|
+
existingDocument: { url: request.url, title: request.title, lastIndexed: new Date() },
|
|
109
|
+
});
|
|
110
|
+
failedWrite.addDocument.mockRejectedValue(new Error('write failed'));
|
|
111
|
+
await runWorkflow(failedWrite.workflow, { ...request, reIndex: true, tags: ['existing'] });
|
|
112
|
+
expect(failedWrite.addDocument).toHaveBeenCalledOnce();
|
|
113
|
+
expect(failedWrite.statusTracker.completeIndexing).not.toHaveBeenCalled();
|
|
114
|
+
expect(failedWrite.statusTracker.failIndexing).toHaveBeenCalledWith(request.operationId, 'write failed');
|
|
115
|
+
});
|
|
116
|
+
it('completes an existing add without crawling or writing', async () => {
|
|
117
|
+
const harness = createHarness({
|
|
118
|
+
existingDocument: { url: request.url, title: request.title, lastIndexed: new Date() },
|
|
119
|
+
});
|
|
120
|
+
await runWorkflow(harness.workflow, request);
|
|
121
|
+
expect(harness.statusTracker.completeIndexing).toHaveBeenCalledWith(request.operationId);
|
|
122
|
+
expect(harness.createCrawler).not.toHaveBeenCalled();
|
|
123
|
+
expect(harness.addDocument).not.toHaveBeenCalled();
|
|
124
|
+
});
|
|
125
|
+
it('fails without writing when processing produces no chunks', async () => {
|
|
126
|
+
const harness = createHarness({
|
|
127
|
+
existingDocument: { url: request.url, title: request.title, lastIndexed: new Date() },
|
|
128
|
+
process: vi.fn().mockResolvedValue({
|
|
129
|
+
metadata: { url: page.url, title: page.title, lastIndexed: new Date() },
|
|
130
|
+
chunks: [],
|
|
131
|
+
}),
|
|
132
|
+
});
|
|
133
|
+
await runWorkflow(harness.workflow, { ...request, reIndex: true });
|
|
134
|
+
expect(harness.statusTracker.failIndexing).toHaveBeenCalledWith(request.operationId, 'No content was extracted from the pages');
|
|
135
|
+
expect(harness.addDocument).not.toHaveBeenCalled();
|
|
136
|
+
});
|
|
137
|
+
it.each([
|
|
138
|
+
['valid', JSON.stringify({ cookies: [] }), { cookies: [] }],
|
|
139
|
+
['malformed', '{not json', undefined],
|
|
140
|
+
])('continues crawling with a %s saved session', async (_label, savedSession, expectedState) => {
|
|
141
|
+
const harness = createHarness({ savedSession });
|
|
142
|
+
await runWorkflow(harness.workflow, request);
|
|
143
|
+
if (expectedState) {
|
|
144
|
+
expect(harness.crawler.setStorageState).toHaveBeenCalledWith(expectedState);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
expect(harness.crawler.setStorageState).not.toHaveBeenCalled();
|
|
148
|
+
}
|
|
149
|
+
expect(harness.addDocument).toHaveBeenCalledOnce();
|
|
150
|
+
expect(harness.statusTracker.completeIndexing).toHaveBeenCalledWith(request.operationId);
|
|
151
|
+
});
|
|
152
|
+
it('aborts an in-progress crawl without writing', async () => {
|
|
153
|
+
const controller = new AbortController();
|
|
154
|
+
const harness = createHarness({
|
|
155
|
+
crawl: async function* () {
|
|
156
|
+
yield page;
|
|
157
|
+
controller.abort();
|
|
158
|
+
yield { ...page, path: '/second' };
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
await runWorkflow(harness.workflow, request, controller.signal);
|
|
162
|
+
expect(harness.crawler.abort).toHaveBeenCalledOnce();
|
|
163
|
+
expect(harness.statusTracker.cancelIndexing).toHaveBeenCalledWith(request.operationId);
|
|
164
|
+
expect(harness.addDocument).not.toHaveBeenCalled();
|
|
165
|
+
});
|
|
166
|
+
it('clears an expired session and reports the friendly authentication failure', async () => {
|
|
167
|
+
const harness = createHarness({
|
|
168
|
+
crawl: async function* () {
|
|
169
|
+
yield* [];
|
|
170
|
+
throw new SessionExpiredError('redirected', request.url, 'https://docs.example.com/login', {
|
|
171
|
+
isLoginPage: true,
|
|
172
|
+
confidence: 1,
|
|
173
|
+
reasons: ['login URL'],
|
|
174
|
+
});
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
await runWorkflow(harness.workflow, request);
|
|
178
|
+
expect(harness.authManager.clearSession).toHaveBeenCalledWith(request.url);
|
|
179
|
+
expect(harness.statusTracker.failIndexing).toHaveBeenCalledWith(request.operationId, expect.stringContaining("Please use the 'authenticate' tool"));
|
|
180
|
+
expect(harness.addDocument).not.toHaveBeenCalled();
|
|
181
|
+
});
|
|
182
|
+
it('consumes generic failures and marks the operation failed', async () => {
|
|
183
|
+
const harness = createHarness({
|
|
184
|
+
crawl: async function* () {
|
|
185
|
+
yield* [];
|
|
186
|
+
throw new Error('crawl failed');
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
await expect(runWorkflow(harness.workflow, request)).resolves.toBeUndefined();
|
|
190
|
+
expect(harness.statusTracker.failIndexing).toHaveBeenCalledWith(request.operationId, 'crawl failed');
|
|
191
|
+
expect(harness.addDocument).not.toHaveBeenCalled();
|
|
192
|
+
});
|
|
193
|
+
it('surfaces unsupported GitHub blob URLs through indexing status', async () => {
|
|
194
|
+
const harness = createHarness({ createCrawler: () => new DocsCrawler() });
|
|
195
|
+
const blobUrl = 'https://github.com/owner/repo/blob/main/README.md';
|
|
196
|
+
await runWorkflow(harness.workflow, { ...request, url: blobUrl });
|
|
197
|
+
expect(harness.statusTracker.failIndexing).toHaveBeenCalledWith(request.operationId, `Unsupported GitHub URL: ${blobUrl}. Use a repository root or /tree/<branch>[/path] URL.`);
|
|
198
|
+
expect(fetchMock).not.toHaveBeenCalled();
|
|
199
|
+
expect(harness.fetchFavicon).not.toHaveBeenCalled();
|
|
200
|
+
expect(harness.addDocument).not.toHaveBeenCalled();
|
|
201
|
+
});
|
|
202
|
+
it('retries transient commit conflicts before succeeding', async () => {
|
|
203
|
+
vi.useFakeTimers();
|
|
204
|
+
const harness = createHarness();
|
|
205
|
+
harness.addDocument.mockRejectedValueOnce(new Error('Commit conflict')).mockResolvedValueOnce(undefined);
|
|
206
|
+
const run = runWorkflow(harness.workflow, request);
|
|
207
|
+
await vi.runAllTimersAsync();
|
|
208
|
+
await run;
|
|
209
|
+
expect(harness.addDocument).toHaveBeenCalledTimes(2);
|
|
210
|
+
expect(harness.addDocument).toHaveBeenLastCalledWith(expect.any(Object), {
|
|
211
|
+
signal: expect.any(AbortSignal),
|
|
212
|
+
tags: [],
|
|
213
|
+
});
|
|
214
|
+
expect(harness.statusTracker.completeIndexing).toHaveBeenCalledWith(request.operationId);
|
|
215
|
+
vi.useRealTimers();
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
//# sourceMappingURL=workflow.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.test.js","sourceRoot":"","sources":["../../src/indexing/workflow.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export declare class WebDocsServer {
|
|
2
|
+
private server;
|
|
3
|
+
private config;
|
|
4
|
+
private store;
|
|
5
|
+
private processor;
|
|
6
|
+
private statusTracker;
|
|
7
|
+
private indexingQueue;
|
|
8
|
+
private authManager;
|
|
9
|
+
private indexingWorkflow;
|
|
10
|
+
private runPromise?;
|
|
11
|
+
private closePromise?;
|
|
12
|
+
private activeToolCalls;
|
|
13
|
+
/** Maps operation ID to progress token for MCP notifications */
|
|
14
|
+
private progressTokens;
|
|
15
|
+
/** Tracks last notified progress to throttle notifications */
|
|
16
|
+
private lastNotifiedProgress;
|
|
17
|
+
constructor();
|
|
18
|
+
/**
|
|
19
|
+
* Send MCP progress notification to client.
|
|
20
|
+
* Only sends if the client provided a progressToken in the original request.
|
|
21
|
+
* Throttled to avoid flooding - sends on 5% increments or status changes.
|
|
22
|
+
*/
|
|
23
|
+
private sendProgressNotification;
|
|
24
|
+
private initialize;
|
|
25
|
+
private setupToolHandlers;
|
|
26
|
+
private handleAddDocumentation;
|
|
27
|
+
private handleListDocumentation;
|
|
28
|
+
private handleSearchDocumentation;
|
|
29
|
+
private handleReindexDocumentation;
|
|
30
|
+
private handleGetIndexingStatus;
|
|
31
|
+
/**
|
|
32
|
+
* Handle interactive authentication request.
|
|
33
|
+
* Opens a visible browser for the user to login manually.
|
|
34
|
+
*/
|
|
35
|
+
private handleAuthenticate;
|
|
36
|
+
/**
|
|
37
|
+
* Handle clearing saved authentication for a domain
|
|
38
|
+
*/
|
|
39
|
+
private handleClearAuth;
|
|
40
|
+
/**
|
|
41
|
+
* Handle deleting an indexed documentation site and all its data
|
|
42
|
+
*/
|
|
43
|
+
private handleDeleteDocumentation;
|
|
44
|
+
/**
|
|
45
|
+
* Handle setting tags for a documentation site
|
|
46
|
+
*/
|
|
47
|
+
private handleSetTags;
|
|
48
|
+
/**
|
|
49
|
+
* Handle listing all tags with usage counts
|
|
50
|
+
*/
|
|
51
|
+
private handleListTags;
|
|
52
|
+
/**
|
|
53
|
+
* Handle creating a new collection
|
|
54
|
+
*/
|
|
55
|
+
private handleCreateCollection;
|
|
56
|
+
/**
|
|
57
|
+
* Handle deleting a collection
|
|
58
|
+
*/
|
|
59
|
+
private handleDeleteCollection;
|
|
60
|
+
/**
|
|
61
|
+
* Handle updating a collection's metadata
|
|
62
|
+
*/
|
|
63
|
+
private handleUpdateCollection;
|
|
64
|
+
/**
|
|
65
|
+
* Handle listing all collections
|
|
66
|
+
*/
|
|
67
|
+
private handleListCollections;
|
|
68
|
+
/**
|
|
69
|
+
* Handle getting a specific collection with its documents
|
|
70
|
+
*/
|
|
71
|
+
private handleGetCollection;
|
|
72
|
+
/**
|
|
73
|
+
* Handle adding documents to a collection
|
|
74
|
+
*/
|
|
75
|
+
private handleAddToCollection;
|
|
76
|
+
/**
|
|
77
|
+
* Handle removing documents from a collection
|
|
78
|
+
*/
|
|
79
|
+
private handleRemoveFromCollection;
|
|
80
|
+
/**
|
|
81
|
+
* Handle searching within a collection
|
|
82
|
+
*/
|
|
83
|
+
private handleSearchCollection;
|
|
84
|
+
run(): Promise<void>;
|
|
85
|
+
private start;
|
|
86
|
+
close(): Promise<void>;
|
|
87
|
+
private closeResources;
|
|
88
|
+
}
|