@pageindex/sdk 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -13
- package/dist/index.cjs +101 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +85 -6
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +85 -6
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +101 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +59 -10
package/dist/index.d.mts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { ImageContent } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
|
|
1
3
|
//#region src/api/types.d.ts
|
|
2
4
|
interface SubmitDocumentOptions {
|
|
3
5
|
mode?: string;
|
|
@@ -38,13 +40,29 @@ interface ListDocumentsResponse {
|
|
|
38
40
|
interface DeleteDocumentResponse {
|
|
39
41
|
message: string;
|
|
40
42
|
}
|
|
43
|
+
interface GetTreeOptions {
|
|
44
|
+
nodeSummary?: boolean;
|
|
45
|
+
}
|
|
46
|
+
interface TreeNode {
|
|
47
|
+
title: string;
|
|
48
|
+
node_id: string;
|
|
49
|
+
page_index: number;
|
|
50
|
+
text: string;
|
|
51
|
+
summary?: string;
|
|
52
|
+
nodes?: TreeNode[];
|
|
53
|
+
}
|
|
54
|
+
interface GetTreeResponse {
|
|
55
|
+
doc_id: string;
|
|
56
|
+
status: string;
|
|
57
|
+
retrieval_ready?: boolean;
|
|
58
|
+
result?: TreeNode[];
|
|
59
|
+
}
|
|
41
60
|
interface ChatCompletionsParams {
|
|
42
61
|
messages: Array<{
|
|
43
62
|
role: "system" | "user" | "assistant";
|
|
44
63
|
content: string;
|
|
45
64
|
}>;
|
|
46
|
-
doc_id?: string;
|
|
47
|
-
doc_ids?: string[];
|
|
65
|
+
doc_id?: string | string[];
|
|
48
66
|
model?: string;
|
|
49
67
|
stream?: boolean;
|
|
50
68
|
temperature?: number;
|
|
@@ -53,6 +71,8 @@ interface ChatCompletionsParams {
|
|
|
53
71
|
}
|
|
54
72
|
interface ChatCompletionsResponse {
|
|
55
73
|
id: string;
|
|
74
|
+
object?: string;
|
|
75
|
+
created?: number;
|
|
56
76
|
choices: Array<{
|
|
57
77
|
index: number;
|
|
58
78
|
message: {
|
|
@@ -67,6 +87,21 @@ interface ChatCompletionsResponse {
|
|
|
67
87
|
total_tokens: number;
|
|
68
88
|
};
|
|
69
89
|
}
|
|
90
|
+
interface ChatCompletionChunk {
|
|
91
|
+
choices: Array<{
|
|
92
|
+
index: number;
|
|
93
|
+
delta: {
|
|
94
|
+
role?: string;
|
|
95
|
+
content?: string;
|
|
96
|
+
};
|
|
97
|
+
finish_reason?: string | null;
|
|
98
|
+
}>;
|
|
99
|
+
block_metadata?: {
|
|
100
|
+
type: string;
|
|
101
|
+
tool_name?: string;
|
|
102
|
+
[key: string]: unknown;
|
|
103
|
+
};
|
|
104
|
+
}
|
|
70
105
|
//#endregion
|
|
71
106
|
//#region src/api/client.d.ts
|
|
72
107
|
interface PageIndexApiConfig {
|
|
@@ -81,11 +116,19 @@ declare class PageIndexApi {
|
|
|
81
116
|
constructor(config: PageIndexApiConfig);
|
|
82
117
|
submitDocument(file: Blob | Buffer | ArrayBuffer, fileName: string, options?: SubmitDocumentOptions): Promise<SubmitDocumentResponse>;
|
|
83
118
|
getDocument(docId: string): Promise<GetDocumentMetadataResponse>;
|
|
119
|
+
getTree(docId: string, options?: GetTreeOptions): Promise<GetTreeResponse>;
|
|
84
120
|
listDocuments(options?: ListDocumentsOptions): Promise<ListDocumentsResponse>;
|
|
85
121
|
deleteDocument(docId: string): Promise<DeleteDocumentResponse>;
|
|
86
|
-
chatCompletions(params: ChatCompletionsParams
|
|
122
|
+
chatCompletions(params: ChatCompletionsParams & {
|
|
123
|
+
stream: true;
|
|
124
|
+
}): Promise<AsyncIterable<ChatCompletionChunk>>;
|
|
125
|
+
chatCompletions(params: ChatCompletionsParams & {
|
|
126
|
+
stream?: false;
|
|
127
|
+
}): Promise<ChatCompletionsResponse>;
|
|
87
128
|
private request;
|
|
88
129
|
private requestMultipart;
|
|
130
|
+
private requestStream;
|
|
131
|
+
private parseSSEStream;
|
|
89
132
|
private handleResponse;
|
|
90
133
|
private mapStatusToErrorCode;
|
|
91
134
|
}
|
|
@@ -111,6 +154,7 @@ declare class McpTransport {
|
|
|
111
154
|
isConnected: () => boolean;
|
|
112
155
|
connect(): Promise<void>;
|
|
113
156
|
callTool<T = unknown>(name: string, args: Record<string, unknown>): Promise<T>;
|
|
157
|
+
callToolForImage(name: string, args: Record<string, unknown>): Promise<ImageContent>;
|
|
114
158
|
close(): Promise<void>;
|
|
115
159
|
}
|
|
116
160
|
//#endregion
|
|
@@ -133,6 +177,7 @@ interface FolderItem {
|
|
|
133
177
|
description: string | null;
|
|
134
178
|
parent_folder_id: string | null;
|
|
135
179
|
created_at: string;
|
|
180
|
+
updated_at: string;
|
|
136
181
|
file_count: number;
|
|
137
182
|
children_count: number;
|
|
138
183
|
}
|
|
@@ -143,9 +188,12 @@ interface CreateFolderResult {
|
|
|
143
188
|
//#endregion
|
|
144
189
|
//#region src/tools/find-relevant-documents.d.ts
|
|
145
190
|
interface FindRelevantDocumentsParams {
|
|
191
|
+
query?: string;
|
|
192
|
+
/** @deprecated Use `query` instead. */
|
|
146
193
|
nameOrDescriptionFilter?: string;
|
|
147
194
|
cursor?: string;
|
|
148
195
|
limit?: number;
|
|
196
|
+
folderId?: string | null;
|
|
149
197
|
}
|
|
150
198
|
interface SearchDocumentItem {
|
|
151
199
|
id: string;
|
|
@@ -158,16 +206,31 @@ interface SearchDocumentItem {
|
|
|
158
206
|
}
|
|
159
207
|
interface FindRelevantDocumentsResult {
|
|
160
208
|
docs: SearchDocumentItem[];
|
|
161
|
-
|
|
209
|
+
search_mode: "keyword" | "smart";
|
|
210
|
+
next_cursor?: string;
|
|
211
|
+
total_returned: number;
|
|
162
212
|
has_more: boolean;
|
|
163
213
|
next_steps: NextSteps;
|
|
164
214
|
}
|
|
165
215
|
//#endregion
|
|
216
|
+
//#region src/tools/get-document-image.d.ts
|
|
217
|
+
interface GetDocumentImageParams {
|
|
218
|
+
/**
|
|
219
|
+
* Image path from get_page_content() response, format: <docName>/<imagePath>
|
|
220
|
+
*/
|
|
221
|
+
imagePath: string;
|
|
222
|
+
}
|
|
223
|
+
interface GetDocumentImageResult {
|
|
224
|
+
data: string;
|
|
225
|
+
mimeType: string;
|
|
226
|
+
}
|
|
227
|
+
//#endregion
|
|
166
228
|
//#region src/tools/get-document-structure.d.ts
|
|
167
229
|
interface GetDocumentStructureParams {
|
|
168
230
|
docName: string;
|
|
169
231
|
part?: number;
|
|
170
232
|
waitForCompletion?: boolean;
|
|
233
|
+
folderId?: string | null;
|
|
171
234
|
}
|
|
172
235
|
interface GetDocumentStructureResult {
|
|
173
236
|
doc_name: string;
|
|
@@ -180,6 +243,7 @@ interface GetDocumentStructureResult {
|
|
|
180
243
|
interface GetDocumentParams {
|
|
181
244
|
docName: string;
|
|
182
245
|
waitForCompletion?: boolean;
|
|
246
|
+
folderId?: string | null;
|
|
183
247
|
}
|
|
184
248
|
interface GetDocumentResult {
|
|
185
249
|
id: string;
|
|
@@ -201,6 +265,7 @@ interface GetPageContentParams {
|
|
|
201
265
|
docName: string;
|
|
202
266
|
pages: string;
|
|
203
267
|
waitForCompletion?: boolean;
|
|
268
|
+
folderId?: string | null;
|
|
204
269
|
}
|
|
205
270
|
interface PageContentItem {
|
|
206
271
|
page: number;
|
|
@@ -227,10 +292,20 @@ interface ListFoldersParams {
|
|
|
227
292
|
}
|
|
228
293
|
interface ListFoldersResult {
|
|
229
294
|
folders: FolderItem[];
|
|
295
|
+
total: number;
|
|
296
|
+
filter: {
|
|
297
|
+
parent_folder_id?: string;
|
|
298
|
+
scope: string;
|
|
299
|
+
};
|
|
230
300
|
next_steps: NextSteps;
|
|
231
301
|
}
|
|
232
302
|
//#endregion
|
|
233
303
|
//#region src/tools/recent-documents.d.ts
|
|
304
|
+
interface RecentDocumentsParams {
|
|
305
|
+
folderId?: string | null;
|
|
306
|
+
cursor?: string;
|
|
307
|
+
limit?: number;
|
|
308
|
+
}
|
|
234
309
|
interface RecentDocumentItem {
|
|
235
310
|
id: string;
|
|
236
311
|
name: string;
|
|
@@ -242,6 +317,8 @@ interface RecentDocumentItem {
|
|
|
242
317
|
interface RecentDocumentsResult {
|
|
243
318
|
docs: RecentDocumentItem[];
|
|
244
319
|
total_shown: number;
|
|
320
|
+
next_cursor?: string;
|
|
321
|
+
has_more: boolean;
|
|
245
322
|
processing_count: number;
|
|
246
323
|
ready_count: number;
|
|
247
324
|
failed_count: number;
|
|
@@ -251,6 +328,7 @@ interface RecentDocumentsResult {
|
|
|
251
328
|
//#region src/tools/remove-document.d.ts
|
|
252
329
|
interface RemoveDocumentParams {
|
|
253
330
|
docNames: string[];
|
|
331
|
+
folderId?: string | null;
|
|
254
332
|
}
|
|
255
333
|
interface RemoveDocumentResult {
|
|
256
334
|
results: {
|
|
@@ -269,11 +347,12 @@ interface RemoveDocumentResult {
|
|
|
269
347
|
declare class PageIndexTools {
|
|
270
348
|
private transport;
|
|
271
349
|
constructor(transport: McpTransport);
|
|
272
|
-
recentDocuments: () => Promise<RecentDocumentsResult>;
|
|
350
|
+
recentDocuments: (params?: RecentDocumentsParams) => Promise<RecentDocumentsResult>;
|
|
273
351
|
findRelevantDocuments: (params?: FindRelevantDocumentsParams) => Promise<FindRelevantDocumentsResult>;
|
|
274
352
|
createFolder: (params: CreateFolderParams) => Promise<CreateFolderResult>;
|
|
275
353
|
listFolders: (params?: ListFoldersParams) => Promise<ListFoldersResult>;
|
|
276
354
|
getDocument: (params: GetDocumentParams) => Promise<GetDocumentResult>;
|
|
355
|
+
getDocumentImage: (params: GetDocumentImageParams) => Promise<GetDocumentImageResult>;
|
|
277
356
|
getDocumentStructure: (params: GetDocumentStructureParams) => Promise<GetDocumentStructureResult>;
|
|
278
357
|
getPageContent: (params: GetPageContentParams) => Promise<GetPageContentResult>;
|
|
279
358
|
removeDocument: (params: RemoveDocumentParams) => Promise<RemoveDocumentResult>;
|
|
@@ -310,5 +389,5 @@ declare class PageIndexError extends Error {
|
|
|
310
389
|
constructor(message: string, code?: PageIndexErrorCode | undefined, details?: Record<string, unknown> | undefined, statusCode?: number | undefined);
|
|
311
390
|
}
|
|
312
391
|
//#endregion
|
|
313
|
-
export { ChatCompletionsParams, ChatCompletionsResponse, type CreateFolderParams, type CreateFolderResult, DeleteDocumentResponse, DocumentItem, type FindRelevantDocumentsParams, type FindRelevantDocumentsResult, type FolderItem, GetDocumentMetadataResponse, type GetDocumentParams, type GetDocumentResult, type GetDocumentStructureParams, type GetDocumentStructureResult, type GetPageContentParams, type GetPageContentResult, ListDocumentsOptions, ListDocumentsResponse, type ListFoldersParams, type ListFoldersResult, type NextSteps, type PageContentItem, PageIndexApi, type PageIndexApiConfig, PageIndexClient, type PageIndexClientConfig, PageIndexError, type PageIndexErrorCode, PageIndexTools, type RecentDocumentItem, type RecentDocumentsResult, type RemoveDocumentParams, type RemoveDocumentResult, type SearchDocumentItem, SubmitDocumentOptions, SubmitDocumentResponse };
|
|
392
|
+
export { ChatCompletionChunk, ChatCompletionsParams, ChatCompletionsResponse, type CreateFolderParams, type CreateFolderResult, DeleteDocumentResponse, DocumentItem, type FindRelevantDocumentsParams, type FindRelevantDocumentsResult, type FolderItem, type GetDocumentImageParams, type GetDocumentImageResult, GetDocumentMetadataResponse, type GetDocumentParams, type GetDocumentResult, type GetDocumentStructureParams, type GetDocumentStructureResult, type GetPageContentParams, type GetPageContentResult, GetTreeOptions, GetTreeResponse, ListDocumentsOptions, ListDocumentsResponse, type ListFoldersParams, type ListFoldersResult, type NextSteps, type PageContentItem, PageIndexApi, type PageIndexApiConfig, PageIndexClient, type PageIndexClientConfig, PageIndexError, type PageIndexErrorCode, PageIndexTools, type RecentDocumentItem, type RecentDocumentsParams, type RecentDocumentsResult, type RemoveDocumentParams, type RemoveDocumentResult, type SearchDocumentItem, SubmitDocumentOptions, SubmitDocumentResponse, TreeNode };
|
|
314
393
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/api/types.ts","../src/api/client.ts","../src/transport.ts","../src/tools/types.ts","../src/tools/create-folder.ts","../src/tools/find-relevant-documents.ts","../src/tools/get-document-structure.ts","../src/tools/get-document.ts","../src/tools/get-page-content.ts","../src/tools/list-folders.ts","../src/tools/recent-documents.ts","../src/tools/remove-document.ts","../src/tools/index.ts","../src/client.ts","../src/errors.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/api/types.ts","../src/api/client.ts","../src/transport.ts","../src/tools/types.ts","../src/tools/create-folder.ts","../src/tools/find-relevant-documents.ts","../src/tools/get-document-image.ts","../src/tools/get-document-structure.ts","../src/tools/get-document.ts","../src/tools/get-page-content.ts","../src/tools/list-folders.ts","../src/tools/recent-documents.ts","../src/tools/remove-document.ts","../src/tools/index.ts","../src/client.ts","../src/errors.ts"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -35,6 +35,11 @@ var PageIndexApi = class {
|
|
|
35
35
|
async getDocument(docId) {
|
|
36
36
|
return this.request(`/doc/${encodeURIComponent(docId)}/metadata`);
|
|
37
37
|
}
|
|
38
|
+
async getTree(docId, options) {
|
|
39
|
+
const params = new URLSearchParams({ type: "tree" });
|
|
40
|
+
if (options?.nodeSummary) params.set("summary", "true");
|
|
41
|
+
return this.request(`/doc/${encodeURIComponent(docId)}/?${params.toString()}`);
|
|
42
|
+
}
|
|
38
43
|
async listDocuments(options) {
|
|
39
44
|
const params = new URLSearchParams();
|
|
40
45
|
if (options?.limit !== void 0) params.set("limit", String(options.limit));
|
|
@@ -48,6 +53,7 @@ var PageIndexApi = class {
|
|
|
48
53
|
return this.request(`/doc/${encodeURIComponent(docId)}/`, { method: "DELETE" });
|
|
49
54
|
}
|
|
50
55
|
async chatCompletions(params) {
|
|
56
|
+
if (params.stream) return this.requestStream("/chat/completions", params);
|
|
51
57
|
return this.request("/chat/completions", {
|
|
52
58
|
method: "POST",
|
|
53
59
|
headers: { "Content-Type": "application/json" },
|
|
@@ -74,6 +80,43 @@ var PageIndexApi = class {
|
|
|
74
80
|
});
|
|
75
81
|
return this.handleResponse(response);
|
|
76
82
|
}
|
|
83
|
+
async requestStream(path, params) {
|
|
84
|
+
const url = `${this.baseUrl}${path}`;
|
|
85
|
+
const response = await fetch(url, {
|
|
86
|
+
method: "POST",
|
|
87
|
+
headers: {
|
|
88
|
+
"Content-Type": "application/json",
|
|
89
|
+
api_key: this.apiKey
|
|
90
|
+
},
|
|
91
|
+
body: JSON.stringify(params)
|
|
92
|
+
});
|
|
93
|
+
if (!response.ok) await this.handleResponse(response);
|
|
94
|
+
if (!response.body) throw new PageIndexError("Response body is empty", "INTERNAL_ERROR", void 0, response.status);
|
|
95
|
+
return this.parseSSEStream(response.body);
|
|
96
|
+
}
|
|
97
|
+
async *parseSSEStream(body) {
|
|
98
|
+
const reader = body.getReader();
|
|
99
|
+
const decoder = new TextDecoder();
|
|
100
|
+
let buffer = "";
|
|
101
|
+
try {
|
|
102
|
+
while (true) {
|
|
103
|
+
const { done, value } = await reader.read();
|
|
104
|
+
if (done) break;
|
|
105
|
+
buffer += decoder.decode(value, { stream: true });
|
|
106
|
+
const lines = buffer.split("\n");
|
|
107
|
+
buffer = lines.pop() ?? "";
|
|
108
|
+
for (const line of lines) {
|
|
109
|
+
const trimmed = line.trim();
|
|
110
|
+
if (!trimmed || !trimmed.startsWith("data: ")) continue;
|
|
111
|
+
const data = trimmed.slice(6);
|
|
112
|
+
if (data === "[DONE]") return;
|
|
113
|
+
yield JSON.parse(data);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
} finally {
|
|
117
|
+
reader.releaseLock();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
77
120
|
async handleResponse(response) {
|
|
78
121
|
if (!response.ok) {
|
|
79
122
|
const text = await response.text().catch(() => "");
|
|
@@ -117,19 +160,31 @@ async function createFolder(transport, params) {
|
|
|
117
160
|
//#region src/tools/find-relevant-documents.ts
|
|
118
161
|
async function findRelevantDocuments(transport, params) {
|
|
119
162
|
return transport.callTool("find_relevant_documents", {
|
|
120
|
-
|
|
163
|
+
query: params?.query ?? params?.nameOrDescriptionFilter,
|
|
121
164
|
cursor: params?.cursor,
|
|
122
|
-
limit: params?.limit
|
|
165
|
+
limit: params?.limit,
|
|
166
|
+
folder_id: params?.folderId
|
|
123
167
|
});
|
|
124
168
|
}
|
|
125
169
|
|
|
170
|
+
//#endregion
|
|
171
|
+
//#region src/tools/get-document-image.ts
|
|
172
|
+
async function getDocumentImage(transport, params) {
|
|
173
|
+
const imageContent = await transport.callToolForImage("get_document_image", { image_path: params.imagePath });
|
|
174
|
+
return {
|
|
175
|
+
data: imageContent.data,
|
|
176
|
+
mimeType: imageContent.mimeType
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
|
|
126
180
|
//#endregion
|
|
127
181
|
//#region src/tools/get-document-structure.ts
|
|
128
182
|
async function getDocumentStructure(transport, params) {
|
|
129
183
|
return transport.callTool("get_document_structure", {
|
|
130
184
|
doc_name: params.docName,
|
|
131
185
|
part: params.part,
|
|
132
|
-
wait_for_completion: params.waitForCompletion
|
|
186
|
+
wait_for_completion: params.waitForCompletion,
|
|
187
|
+
folder_id: params.folderId
|
|
133
188
|
});
|
|
134
189
|
}
|
|
135
190
|
|
|
@@ -138,7 +193,8 @@ async function getDocumentStructure(transport, params) {
|
|
|
138
193
|
async function getDocument(transport, params) {
|
|
139
194
|
return transport.callTool("get_document", {
|
|
140
195
|
doc_name: params.docName,
|
|
141
|
-
wait_for_completion: params.waitForCompletion
|
|
196
|
+
wait_for_completion: params.waitForCompletion,
|
|
197
|
+
folder_id: params.folderId
|
|
142
198
|
});
|
|
143
199
|
}
|
|
144
200
|
|
|
@@ -148,7 +204,8 @@ async function getPageContent(transport, params) {
|
|
|
148
204
|
return transport.callTool("get_page_content", {
|
|
149
205
|
doc_name: params.docName,
|
|
150
206
|
pages: params.pages,
|
|
151
|
-
wait_for_completion: params.waitForCompletion
|
|
207
|
+
wait_for_completion: params.waitForCompletion,
|
|
208
|
+
folder_id: params.folderId
|
|
152
209
|
});
|
|
153
210
|
}
|
|
154
211
|
|
|
@@ -160,14 +217,21 @@ async function listFolders(transport, params) {
|
|
|
160
217
|
|
|
161
218
|
//#endregion
|
|
162
219
|
//#region src/tools/recent-documents.ts
|
|
163
|
-
async function recentDocuments(transport) {
|
|
164
|
-
return transport.callTool("recent_documents", {
|
|
220
|
+
async function recentDocuments(transport, params) {
|
|
221
|
+
return transport.callTool("recent_documents", {
|
|
222
|
+
folder_id: params?.folderId,
|
|
223
|
+
cursor: params?.cursor,
|
|
224
|
+
limit: params?.limit
|
|
225
|
+
});
|
|
165
226
|
}
|
|
166
227
|
|
|
167
228
|
//#endregion
|
|
168
229
|
//#region src/tools/remove-document.ts
|
|
169
230
|
async function removeDocument(transport, params) {
|
|
170
|
-
return transport.callTool("remove_document", {
|
|
231
|
+
return transport.callTool("remove_document", {
|
|
232
|
+
doc_names: params.docNames,
|
|
233
|
+
folder_id: params.folderId
|
|
234
|
+
});
|
|
171
235
|
}
|
|
172
236
|
|
|
173
237
|
//#endregion
|
|
@@ -176,11 +240,12 @@ var PageIndexTools = class {
|
|
|
176
240
|
constructor(transport) {
|
|
177
241
|
this.transport = transport;
|
|
178
242
|
}
|
|
179
|
-
recentDocuments = () => recentDocuments(this.transport);
|
|
243
|
+
recentDocuments = (params) => recentDocuments(this.transport, params);
|
|
180
244
|
findRelevantDocuments = (params) => findRelevantDocuments(this.transport, params);
|
|
181
245
|
createFolder = (params) => createFolder(this.transport, params);
|
|
182
246
|
listFolders = (params) => listFolders(this.transport, params);
|
|
183
247
|
getDocument = (params) => getDocument(this.transport, params);
|
|
248
|
+
getDocumentImage = (params) => getDocumentImage(this.transport, params);
|
|
184
249
|
getDocumentStructure = (params) => getDocumentStructure(this.transport, params);
|
|
185
250
|
getPageContent = (params) => getPageContent(this.transport, params);
|
|
186
251
|
removeDocument = (params) => removeDocument(this.transport, params);
|
|
@@ -189,7 +254,7 @@ var PageIndexTools = class {
|
|
|
189
254
|
//#endregion
|
|
190
255
|
//#region package.json
|
|
191
256
|
var name = "@pageindex/sdk";
|
|
192
|
-
var version = "0.
|
|
257
|
+
var version = "0.7.0";
|
|
193
258
|
|
|
194
259
|
//#endregion
|
|
195
260
|
//#region src/transport.ts
|
|
@@ -259,6 +324,32 @@ var McpTransport = class {
|
|
|
259
324
|
}
|
|
260
325
|
return data;
|
|
261
326
|
}
|
|
327
|
+
async callToolForImage(name$1, args) {
|
|
328
|
+
if (!this.connected) await this.connect();
|
|
329
|
+
this.resetIdleTimer();
|
|
330
|
+
const r = await this.client.callTool({
|
|
331
|
+
name: name$1,
|
|
332
|
+
arguments: args
|
|
333
|
+
});
|
|
334
|
+
if (r.isError) {
|
|
335
|
+
const textContent = r.content.find((c) => c.type === "text");
|
|
336
|
+
const text = textContent?.type === "text" ? textContent.text : void 0;
|
|
337
|
+
if (text) {
|
|
338
|
+
let data;
|
|
339
|
+
try {
|
|
340
|
+
data = JSON.parse(text);
|
|
341
|
+
} catch {
|
|
342
|
+
throw new PageIndexError(text, "INTERNAL_ERROR");
|
|
343
|
+
}
|
|
344
|
+
const { error, errorCode, ...details } = data;
|
|
345
|
+
throw new PageIndexError(error, errorCode, details);
|
|
346
|
+
}
|
|
347
|
+
throw new PageIndexError("Image retrieval failed", "INTERNAL_ERROR");
|
|
348
|
+
}
|
|
349
|
+
const imageContent = r.content.find((c) => c.type === "image");
|
|
350
|
+
if (!imageContent) throw new PageIndexError("No image content in response", "INTERNAL_ERROR");
|
|
351
|
+
return imageContent;
|
|
352
|
+
}
|
|
262
353
|
async close() {
|
|
263
354
|
this.clearIdleTimer();
|
|
264
355
|
if (this.connected) {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["pkg.name","pkg.version"],"sources":["../src/errors.ts","../src/api/client.ts","../src/tools/create-folder.ts","../src/tools/find-relevant-documents.ts","../src/tools/get-document-structure.ts","../src/tools/get-document.ts","../src/tools/get-page-content.ts","../src/tools/list-folders.ts","../src/tools/recent-documents.ts","../src/tools/remove-document.ts","../src/tools/index.ts","../package.json","../src/transport.ts","../src/client.ts"],"sourcesContent":["export type PageIndexErrorCode =\n | \"USAGE_LIMIT_REACHED\"\n | \"INVALID_INPUT\"\n | \"NOT_FOUND\"\n | \"UNAUTHORIZED\"\n | \"RATE_LIMITED\"\n | \"SERVICE_UNAVAILABLE\"\n | \"INTERNAL_ERROR\";\n\nexport class PageIndexError extends Error {\n constructor(\n message: string,\n public readonly code?: PageIndexErrorCode,\n public readonly details?: Record<string, unknown>,\n public readonly statusCode?: number,\n ) {\n super(message);\n this.name = \"PageIndexError\";\n }\n}\n","import { PageIndexError } from \"../errors.js\";\nimport type {\n ChatCompletionsParams,\n ChatCompletionsResponse,\n DeleteDocumentResponse,\n GetDocumentMetadataResponse,\n ListDocumentsOptions,\n ListDocumentsResponse,\n SubmitDocumentOptions,\n SubmitDocumentResponse,\n} from \"./types.js\";\n\nexport interface PageIndexApiConfig {\n apiUrl: string;\n apiKey: string;\n folderScope?: string;\n}\n\nexport class PageIndexApi {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly folderScope?: string;\n\n constructor(config: PageIndexApiConfig) {\n this.baseUrl = config.apiUrl.replace(/\\/$/, \"\");\n this.apiKey = config.apiKey;\n this.folderScope = config.folderScope;\n }\n\n async submitDocument(\n file: Blob | Buffer | ArrayBuffer,\n fileName: string,\n options?: SubmitDocumentOptions,\n ): Promise<SubmitDocumentResponse> {\n const formData = new FormData();\n const blob =\n file instanceof Blob\n ? file\n : new Blob([file], { type: \"application/octet-stream\" });\n formData.append(\"file\", blob, fileName);\n if (options?.mode) {\n formData.append(\"mode\", options.mode);\n }\n const folderId = options?.folderId ?? this.folderScope;\n if (folderId) {\n formData.append(\"folder_id\", folderId);\n }\n return this.requestMultipart<SubmitDocumentResponse>(\"/doc/\", formData);\n }\n\n async getDocument(docId: string): Promise<GetDocumentMetadataResponse> {\n return this.request<GetDocumentMetadataResponse>(\n `/doc/${encodeURIComponent(docId)}/metadata`,\n );\n }\n\n async listDocuments(\n options?: ListDocumentsOptions,\n ): Promise<ListDocumentsResponse> {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) {\n params.set(\"limit\", String(options.limit));\n }\n if (options?.offset !== undefined) {\n params.set(\"offset\", String(options.offset));\n }\n const folderId = options?.folderId ?? this.folderScope;\n if (folderId) {\n params.set(\"folder_id\", folderId);\n }\n const qs = params.toString();\n return this.request<ListDocumentsResponse>(`/docs${qs ? `?${qs}` : \"\"}`);\n }\n\n async deleteDocument(docId: string): Promise<DeleteDocumentResponse> {\n return this.request<DeleteDocumentResponse>(\n `/doc/${encodeURIComponent(docId)}/`,\n { method: \"DELETE\" },\n );\n }\n\n async chatCompletions(\n params: ChatCompletionsParams,\n ): Promise<ChatCompletionsResponse> {\n return this.request<ChatCompletionsResponse>(\"/chat/completions\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(params),\n });\n }\n\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const response = await fetch(url, {\n ...init,\n headers: {\n api_key: this.apiKey,\n ...init?.headers,\n },\n });\n return this.handleResponse<T>(response);\n }\n\n private async requestMultipart<T>(\n path: string,\n formData: FormData,\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { api_key: this.apiKey },\n body: formData,\n });\n return this.handleResponse<T>(response);\n }\n\n private async handleResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let message = `API request failed with status ${response.status}`;\n let errorCode = this.mapStatusToErrorCode(response.status);\n let details: Record<string, unknown> | undefined;\n\n try {\n const json = JSON.parse(text) as Record<string, unknown>;\n if (json.error && typeof json.error === \"string\") {\n message = json.error;\n }\n if (json.errorCode && typeof json.errorCode === \"string\") {\n errorCode = json.errorCode as typeof errorCode;\n }\n details = json;\n } catch {\n if (text) message = text;\n }\n\n throw new PageIndexError(message, errorCode, details, response.status);\n }\n\n return response.json() as Promise<T>;\n }\n\n private mapStatusToErrorCode(status: number) {\n switch (status) {\n case 401:\n return \"UNAUTHORIZED\" as const;\n case 404:\n return \"NOT_FOUND\" as const;\n case 429:\n return \"RATE_LIMITED\" as const;\n case 503:\n return \"SERVICE_UNAVAILABLE\" as const;\n default:\n return \"INTERNAL_ERROR\" as const;\n }\n }\n}\n","import type { McpTransport } from \"../transport.js\";\nimport type { NextSteps } from \"./types.js\";\n\nexport interface CreateFolderParams {\n name: string;\n description?: string;\n parentFolderId?: string;\n}\n\nexport interface FolderItem {\n id: string;\n name: string;\n description: string | null;\n parent_folder_id: string | null;\n created_at: string;\n file_count: number;\n children_count: number;\n}\n\nexport interface CreateFolderResult {\n folder: FolderItem;\n next_steps: NextSteps;\n}\n\nexport async function createFolder(\n transport: McpTransport,\n params: CreateFolderParams,\n): Promise<CreateFolderResult> {\n return transport.callTool<CreateFolderResult>(\"create_folder\", {\n name: params.name,\n description: params.description,\n parent_folder_id: params.parentFolderId,\n });\n}\n","import type { McpTransport } from \"../transport.js\";\nimport type { NextSteps } from \"./types.js\";\n\nexport interface FindRelevantDocumentsParams {\n nameOrDescriptionFilter?: string;\n cursor?: string;\n limit?: number;\n}\n\nexport interface SearchDocumentItem {\n id: string;\n name: string;\n description: string;\n status: string;\n pageNum: number;\n createdAt: string;\n folderId: string | null;\n}\n\nexport interface FindRelevantDocumentsResult {\n docs: SearchDocumentItem[];\n cursor?: string;\n has_more: boolean;\n next_steps: NextSteps;\n}\n\nexport async function findRelevantDocuments(\n transport: McpTransport,\n params?: FindRelevantDocumentsParams,\n): Promise<FindRelevantDocumentsResult> {\n return transport.callTool<FindRelevantDocumentsResult>(\n \"find_relevant_documents\",\n {\n name_or_description_filter: params?.nameOrDescriptionFilter,\n cursor: params?.cursor,\n limit: params?.limit,\n },\n );\n}\n","import type { McpTransport } from \"../transport.js\";\nimport type { NextSteps } from \"./types.js\";\n\nexport interface GetDocumentStructureParams {\n docName: string;\n part?: number;\n waitForCompletion?: boolean;\n}\n\nexport interface GetDocumentStructureResult {\n doc_name: string;\n structure: unknown;\n total_parts?: number;\n next_steps: NextSteps;\n}\n\nexport async function getDocumentStructure(\n transport: McpTransport,\n params: GetDocumentStructureParams,\n): Promise<GetDocumentStructureResult> {\n return transport.callTool<GetDocumentStructureResult>(\n \"get_document_structure\",\n {\n doc_name: params.docName,\n part: params.part,\n wait_for_completion: params.waitForCompletion,\n },\n );\n}\n","import type { McpTransport } from \"../transport.js\";\nimport type { NextSteps } from \"./types.js\";\n\nexport interface GetDocumentParams {\n docName: string;\n waitForCompletion?: boolean;\n}\n\nexport interface GetDocumentResult {\n id: string;\n name: string;\n description: string;\n status: string;\n createdAt: string;\n pageNum?: number;\n wait_info?: {\n waited: boolean;\n elapsed_seconds?: number;\n final_status?: string;\n };\n next_steps: NextSteps;\n}\n\nexport async function getDocument(\n transport: McpTransport,\n params: GetDocumentParams,\n): Promise<GetDocumentResult> {\n return transport.callTool<GetDocumentResult>(\"get_document\", {\n doc_name: params.docName,\n wait_for_completion: params.waitForCompletion,\n });\n}\n","import type { McpTransport } from \"../transport.js\";\nimport type { NextSteps } from \"./types.js\";\n\nexport interface GetPageContentParams {\n docName: string;\n pages: string;\n waitForCompletion?: boolean;\n}\n\nexport interface PageContentItem {\n page: number;\n text: string;\n block_id?: string;\n image_count?: number;\n image_annotations?: string[];\n}\n\nexport interface GetPageContentResult {\n doc_name: string;\n total_pages: number;\n requested_pages: string;\n returned_pages: string;\n content: PageContentItem[];\n next_steps: NextSteps;\n}\n\nexport async function getPageContent(\n transport: McpTransport,\n params: GetPageContentParams,\n): Promise<GetPageContentResult> {\n return transport.callTool<GetPageContentResult>(\"get_page_content\", {\n doc_name: params.docName,\n pages: params.pages,\n wait_for_completion: params.waitForCompletion,\n });\n}\n","import type { McpTransport } from \"../transport.js\";\nimport type { FolderItem } from \"./create-folder.js\";\nimport type { NextSteps } from \"./types.js\";\n\nexport interface ListFoldersParams {\n /**\n * Use \"root\" for root-level folders only, a folder ID for subfolders, or omit for all folders\n */\n parentFolderId?: string;\n}\n\nexport interface ListFoldersResult {\n folders: FolderItem[];\n next_steps: NextSteps;\n}\n\nexport async function listFolders(\n transport: McpTransport,\n params?: ListFoldersParams,\n): Promise<ListFoldersResult> {\n return transport.callTool<ListFoldersResult>(\"list_folders\", {\n parent_folder_id: params?.parentFolderId,\n });\n}\n","import type { McpTransport } from \"../transport.js\";\nimport type { NextSteps } from \"./types.js\";\n\nexport interface RecentDocumentItem {\n id: string;\n name: string;\n description: string;\n status: string;\n createdAt: string;\n pageNum?: number;\n}\n\nexport interface RecentDocumentsResult {\n docs: RecentDocumentItem[];\n total_shown: number;\n processing_count: number;\n ready_count: number;\n failed_count: number;\n next_steps: NextSteps;\n}\n\nexport async function recentDocuments(\n transport: McpTransport,\n): Promise<RecentDocumentsResult> {\n return transport.callTool<RecentDocumentsResult>(\"recent_documents\", {});\n}\n","import type { McpTransport } from \"../transport.js\";\nimport type { NextSteps } from \"./types.js\";\n\nexport interface RemoveDocumentParams {\n docNames: string[];\n}\n\nexport interface RemoveDocumentResult {\n results: {\n successful: number;\n failed: number;\n details: Array<{\n doc_name: string;\n success: boolean;\n error?: string;\n }>;\n };\n next_steps: NextSteps;\n}\n\nexport async function removeDocument(\n transport: McpTransport,\n params: RemoveDocumentParams,\n): Promise<RemoveDocumentResult> {\n return transport.callTool<RemoveDocumentResult>(\"remove_document\", {\n doc_names: params.docNames,\n });\n}\n","import type { McpTransport } from \"../transport.js\";\nimport {\n type CreateFolderParams,\n type CreateFolderResult,\n createFolder,\n} from \"./create-folder.js\";\nimport {\n type FindRelevantDocumentsParams,\n type FindRelevantDocumentsResult,\n findRelevantDocuments,\n} from \"./find-relevant-documents.js\";\nimport {\n type GetDocumentStructureParams,\n type GetDocumentStructureResult,\n getDocumentStructure,\n} from \"./get-document-structure.js\";\nimport {\n type GetDocumentParams,\n type GetDocumentResult,\n getDocument,\n} from \"./get-document.js\";\nimport {\n type GetPageContentParams,\n type GetPageContentResult,\n getPageContent,\n} from \"./get-page-content.js\";\nimport {\n type ListFoldersParams,\n type ListFoldersResult,\n listFolders,\n} from \"./list-folders.js\";\nimport {\n type RecentDocumentsResult,\n recentDocuments,\n} from \"./recent-documents.js\";\nimport {\n type RemoveDocumentParams,\n type RemoveDocumentResult,\n removeDocument,\n} from \"./remove-document.js\";\n\nexport type { NextSteps } from \"./types.js\";\nexport type {\n CreateFolderParams,\n CreateFolderResult,\n FolderItem,\n} from \"./create-folder.js\";\nexport type { ListFoldersParams, ListFoldersResult } from \"./list-folders.js\";\nexport type {\n RecentDocumentItem,\n RecentDocumentsResult,\n} from \"./recent-documents.js\";\nexport type {\n FindRelevantDocumentsParams,\n FindRelevantDocumentsResult,\n SearchDocumentItem,\n} from \"./find-relevant-documents.js\";\nexport type { GetDocumentParams, GetDocumentResult } from \"./get-document.js\";\nexport type {\n GetDocumentStructureParams,\n GetDocumentStructureResult,\n} from \"./get-document-structure.js\";\nexport type {\n GetPageContentParams,\n GetPageContentResult,\n PageContentItem,\n} from \"./get-page-content.js\";\nexport type {\n RemoveDocumentParams,\n RemoveDocumentResult,\n} from \"./remove-document.js\";\n\nexport class PageIndexTools {\n constructor(private transport: McpTransport) {}\n\n recentDocuments = (): Promise<RecentDocumentsResult> =>\n recentDocuments(this.transport);\n\n findRelevantDocuments = (\n params?: FindRelevantDocumentsParams,\n ): Promise<FindRelevantDocumentsResult> =>\n findRelevantDocuments(this.transport, params);\n\n createFolder = (params: CreateFolderParams): Promise<CreateFolderResult> =>\n createFolder(this.transport, params);\n\n listFolders = (params?: ListFoldersParams): Promise<ListFoldersResult> =>\n listFolders(this.transport, params);\n\n getDocument = (params: GetDocumentParams): Promise<GetDocumentResult> =>\n getDocument(this.transport, params);\n\n getDocumentStructure = (\n params: GetDocumentStructureParams,\n ): Promise<GetDocumentStructureResult> =>\n getDocumentStructure(this.transport, params);\n\n getPageContent = (\n params: GetPageContentParams,\n ): Promise<GetPageContentResult> => getPageContent(this.transport, params);\n\n removeDocument = (\n params: RemoveDocumentParams,\n ): Promise<RemoveDocumentResult> => removeDocument(this.transport, params);\n}\n","","import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport pkg from \"../package.json\" assert { type: \"json\" };\nimport { PageIndexError, type PageIndexErrorCode } from \"./errors.js\";\n\nexport class McpTransport {\n private client = new Client(\n { name: pkg.name, version: pkg.version },\n { capabilities: {} },\n );\n private transport: StreamableHTTPClientTransport | null = null;\n private connected = false;\n private folderScope: string | undefined;\n private idleTimeout: number;\n private idleTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private config: {\n apiUrl: string;\n apiKey: string;\n folderScope?: string;\n idleTimeout?: number;\n },\n ) {\n this.folderScope = config.folderScope;\n this.idleTimeout = config.idleTimeout ?? 60_000;\n }\n\n private resetIdleTimer(): void {\n if (this.idleTimer) clearTimeout(this.idleTimer);\n if (this.idleTimeout > 0) {\n this.idleTimer = setTimeout(() => this.close(), this.idleTimeout);\n }\n }\n\n private clearIdleTimer(): void {\n if (this.idleTimer) {\n clearTimeout(this.idleTimer);\n this.idleTimer = null;\n }\n }\n\n async setFolderScope(scope: string | undefined): Promise<void> {\n if (this.folderScope === scope) return;\n this.folderScope = scope;\n if (this.connected) {\n await this.close();\n await this.connect();\n }\n }\n\n isConnected = () => this.connected;\n\n async connect(): Promise<void> {\n if (this.connected) return;\n const url = new URL(\"/mcp\", this.config.apiUrl);\n url.searchParams.set(\"folder\", \"1\");\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.config.apiKey}`,\n };\n if (this.folderScope) {\n headers[\"X-Folder-Scope\"] = this.folderScope;\n }\n this.transport = new StreamableHTTPClientTransport(url, {\n requestInit: { headers },\n });\n await this.client.connect(this.transport);\n this.connected = true;\n }\n\n async callTool<T = unknown>(\n name: string,\n args: Record<string, unknown>,\n ): Promise<T> {\n if (!this.connected) await this.connect();\n this.resetIdleTimer();\n\n const r = (await this.client.callTool({\n name,\n arguments: args,\n })) as CallToolResult;\n\n const textContent = r.content.find((c) => c.type === \"text\");\n const text = textContent?.type === \"text\" ? textContent.text : undefined;\n\n if (!text) {\n throw new PageIndexError(\"Empty response from server\", \"INTERNAL_ERROR\");\n }\n\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch {\n // Response is not JSON - treat it as a plain text error\n throw new PageIndexError(text, \"INTERNAL_ERROR\");\n }\n\n if (r.isError) {\n const { error, errorCode, ...details } = data as {\n error: string;\n errorCode?: PageIndexErrorCode;\n [key: string]: unknown;\n };\n throw new PageIndexError(error, errorCode, details);\n }\n\n return data as T;\n }\n\n async close(): Promise<void> {\n this.clearIdleTimer();\n if (this.connected) {\n await this.client.close().catch(() => {});\n this.transport = null;\n this.connected = false;\n }\n }\n}\n","import { PageIndexApi } from \"./api/client.js\";\nimport { PageIndexTools } from \"./tools/index.js\";\nimport { McpTransport } from \"./transport.js\";\n\nexport interface PageIndexClientConfig {\n apiKey: string;\n apiUrl?: string;\n folderScope?: string;\n /** MCP connection idle timeout in ms. Set 0 to disable. Default: 60000 (60s) */\n idleTimeout?: number;\n}\n\nconst DEFAULT_API_URL = \"https://api.pageindex.ai\";\n\nexport class PageIndexClient {\n private transport: McpTransport;\n private _api: PageIndexApi;\n private _tools: PageIndexTools | null = null;\n\n constructor(config: PageIndexClientConfig) {\n const apiUrl = (config.apiUrl || DEFAULT_API_URL).replace(/\\/$/, \"\");\n\n this.transport = new McpTransport({\n apiUrl,\n apiKey: config.apiKey,\n folderScope: config.folderScope,\n idleTimeout: config.idleTimeout,\n });\n\n this._api = new PageIndexApi({\n apiUrl,\n apiKey: config.apiKey,\n folderScope: config.folderScope,\n });\n }\n\n get api(): PageIndexApi {\n return this._api;\n }\n\n get tools(): PageIndexTools {\n if (!this._tools) {\n this._tools = new PageIndexTools(this.transport);\n }\n return this._tools;\n }\n\n setFolderScope(scope: string | undefined): Promise<void> {\n return this.transport.setFolderScope(scope);\n }\n\n connect = () => this.transport.connect();\n isConnected = () => this.transport.isConnected();\n close = () => this.transport.close();\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close();\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["pkg.name","pkg.version"],"sources":["../src/errors.ts","../src/api/client.ts","../src/tools/create-folder.ts","../src/tools/find-relevant-documents.ts","../src/tools/get-document-image.ts","../src/tools/get-document-structure.ts","../src/tools/get-document.ts","../src/tools/get-page-content.ts","../src/tools/list-folders.ts","../src/tools/recent-documents.ts","../src/tools/remove-document.ts","../src/tools/index.ts","../package.json","../src/transport.ts","../src/client.ts"],"sourcesContent":["export type PageIndexErrorCode =\n | \"USAGE_LIMIT_REACHED\"\n | \"INVALID_INPUT\"\n | \"NOT_FOUND\"\n | \"UNAUTHORIZED\"\n | \"RATE_LIMITED\"\n | \"SERVICE_UNAVAILABLE\"\n | \"INTERNAL_ERROR\";\n\nexport class PageIndexError extends Error {\n constructor(\n message: string,\n public readonly code?: PageIndexErrorCode,\n public readonly details?: Record<string, unknown>,\n public readonly statusCode?: number,\n ) {\n super(message);\n this.name = \"PageIndexError\";\n }\n}\n","import { PageIndexError } from \"../errors.js\";\nimport type {\n ChatCompletionChunk,\n ChatCompletionsParams,\n ChatCompletionsResponse,\n DeleteDocumentResponse,\n GetDocumentMetadataResponse,\n GetTreeOptions,\n GetTreeResponse,\n ListDocumentsOptions,\n ListDocumentsResponse,\n SubmitDocumentOptions,\n SubmitDocumentResponse,\n} from \"./types.js\";\n\nexport interface PageIndexApiConfig {\n apiUrl: string;\n apiKey: string;\n folderScope?: string;\n}\n\nexport class PageIndexApi {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly folderScope?: string;\n\n constructor(config: PageIndexApiConfig) {\n this.baseUrl = config.apiUrl.replace(/\\/$/, \"\");\n this.apiKey = config.apiKey;\n this.folderScope = config.folderScope;\n }\n\n async submitDocument(\n file: Blob | Buffer | ArrayBuffer,\n fileName: string,\n options?: SubmitDocumentOptions,\n ): Promise<SubmitDocumentResponse> {\n const formData = new FormData();\n const blob =\n file instanceof Blob\n ? file\n : new Blob([file], { type: \"application/octet-stream\" });\n formData.append(\"file\", blob, fileName);\n if (options?.mode) {\n formData.append(\"mode\", options.mode);\n }\n const folderId = options?.folderId ?? this.folderScope;\n if (folderId) {\n formData.append(\"folder_id\", folderId);\n }\n return this.requestMultipart<SubmitDocumentResponse>(\"/doc/\", formData);\n }\n\n async getDocument(docId: string): Promise<GetDocumentMetadataResponse> {\n return this.request<GetDocumentMetadataResponse>(\n `/doc/${encodeURIComponent(docId)}/metadata`,\n );\n }\n\n async getTree(\n docId: string,\n options?: GetTreeOptions,\n ): Promise<GetTreeResponse> {\n const params = new URLSearchParams({ type: \"tree\" });\n if (options?.nodeSummary) {\n params.set(\"summary\", \"true\");\n }\n return this.request<GetTreeResponse>(\n `/doc/${encodeURIComponent(docId)}/?${params.toString()}`,\n );\n }\n\n async listDocuments(\n options?: ListDocumentsOptions,\n ): Promise<ListDocumentsResponse> {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) {\n params.set(\"limit\", String(options.limit));\n }\n if (options?.offset !== undefined) {\n params.set(\"offset\", String(options.offset));\n }\n const folderId = options?.folderId ?? this.folderScope;\n if (folderId) {\n params.set(\"folder_id\", folderId);\n }\n const qs = params.toString();\n return this.request<ListDocumentsResponse>(`/docs${qs ? `?${qs}` : \"\"}`);\n }\n\n async deleteDocument(docId: string): Promise<DeleteDocumentResponse> {\n return this.request<DeleteDocumentResponse>(\n `/doc/${encodeURIComponent(docId)}/`,\n { method: \"DELETE\" },\n );\n }\n\n async chatCompletions(\n params: ChatCompletionsParams & { stream: true },\n ): Promise<AsyncIterable<ChatCompletionChunk>>;\n async chatCompletions(\n params: ChatCompletionsParams & { stream?: false },\n ): Promise<ChatCompletionsResponse>;\n async chatCompletions(\n params: ChatCompletionsParams,\n ): Promise<ChatCompletionsResponse | AsyncIterable<ChatCompletionChunk>> {\n if (params.stream) {\n return this.requestStream(\"/chat/completions\", params);\n }\n return this.request<ChatCompletionsResponse>(\"/chat/completions\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(params),\n });\n }\n\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const response = await fetch(url, {\n ...init,\n headers: {\n api_key: this.apiKey,\n ...init?.headers,\n },\n });\n return this.handleResponse<T>(response);\n }\n\n private async requestMultipart<T>(\n path: string,\n formData: FormData,\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { api_key: this.apiKey },\n body: formData,\n });\n return this.handleResponse<T>(response);\n }\n\n private async requestStream(\n path: string,\n params: ChatCompletionsParams,\n ): Promise<AsyncIterable<ChatCompletionChunk>> {\n const url = `${this.baseUrl}${path}`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n api_key: this.apiKey,\n },\n body: JSON.stringify(params),\n });\n\n if (!response.ok) {\n await this.handleResponse(response);\n }\n\n if (!response.body) {\n throw new PageIndexError(\n \"Response body is empty\",\n \"INTERNAL_ERROR\",\n undefined,\n response.status,\n );\n }\n\n return this.parseSSEStream(response.body);\n }\n\n private async *parseSSEStream(\n body: ReadableStream<Uint8Array>,\n ): AsyncIterable<ChatCompletionChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith(\"data: \")) continue;\n const data = trimmed.slice(6);\n if (data === \"[DONE]\") return;\n yield JSON.parse(data) as ChatCompletionChunk;\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n private async handleResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let message = `API request failed with status ${response.status}`;\n let errorCode = this.mapStatusToErrorCode(response.status);\n let details: Record<string, unknown> | undefined;\n\n try {\n const json = JSON.parse(text) as Record<string, unknown>;\n if (json.error && typeof json.error === \"string\") {\n message = json.error;\n }\n if (json.errorCode && typeof json.errorCode === \"string\") {\n errorCode = json.errorCode as typeof errorCode;\n }\n details = json;\n } catch {\n if (text) message = text;\n }\n\n throw new PageIndexError(message, errorCode, details, response.status);\n }\n\n return response.json() as Promise<T>;\n }\n\n private mapStatusToErrorCode(status: number) {\n switch (status) {\n case 401:\n return \"UNAUTHORIZED\" as const;\n case 404:\n return \"NOT_FOUND\" as const;\n case 429:\n return \"RATE_LIMITED\" as const;\n case 503:\n return \"SERVICE_UNAVAILABLE\" as const;\n default:\n return \"INTERNAL_ERROR\" as const;\n }\n }\n}\n","import type { McpTransport } from \"../transport.js\";\nimport type { NextSteps } from \"./types.js\";\n\nexport interface CreateFolderParams {\n name: string;\n description?: string;\n parentFolderId?: string;\n}\n\nexport interface FolderItem {\n id: string;\n name: string;\n description: string | null;\n parent_folder_id: string | null;\n created_at: string;\n updated_at: string;\n file_count: number;\n children_count: number;\n}\n\nexport interface CreateFolderResult {\n folder: FolderItem;\n next_steps: NextSteps;\n}\n\nexport async function createFolder(\n transport: McpTransport,\n params: CreateFolderParams,\n): Promise<CreateFolderResult> {\n return transport.callTool<CreateFolderResult>(\"create_folder\", {\n name: params.name,\n description: params.description,\n parent_folder_id: params.parentFolderId,\n });\n}\n","import type { McpTransport } from \"../transport.js\";\nimport type { NextSteps } from \"./types.js\";\n\nexport interface FindRelevantDocumentsParams {\n query?: string;\n /** @deprecated Use `query` instead. */\n nameOrDescriptionFilter?: string;\n cursor?: string;\n limit?: number;\n folderId?: string | null;\n}\n\nexport interface SearchDocumentItem {\n id: string;\n name: string;\n description: string;\n status: string;\n pageNum: number;\n createdAt: string;\n folderId: string | null;\n}\n\nexport interface FindRelevantDocumentsResult {\n docs: SearchDocumentItem[];\n search_mode: \"keyword\" | \"smart\";\n next_cursor?: string;\n total_returned: number;\n has_more: boolean;\n next_steps: NextSteps;\n}\n\nexport async function findRelevantDocuments(\n transport: McpTransport,\n params?: FindRelevantDocumentsParams,\n): Promise<FindRelevantDocumentsResult> {\n return transport.callTool<FindRelevantDocumentsResult>(\n \"find_relevant_documents\",\n {\n query: params?.query ?? params?.nameOrDescriptionFilter,\n cursor: params?.cursor,\n limit: params?.limit,\n folder_id: params?.folderId,\n },\n );\n}\n","import type { McpTransport } from \"../transport.js\";\n\nexport interface GetDocumentImageParams {\n /**\n * Image path from get_page_content() response, format: <docName>/<imagePath>\n */\n imagePath: string;\n}\n\nexport interface GetDocumentImageResult {\n data: string;\n mimeType: string;\n}\n\nexport async function getDocumentImage(\n transport: McpTransport,\n params: GetDocumentImageParams,\n): Promise<GetDocumentImageResult> {\n const imageContent = await transport.callToolForImage(\"get_document_image\", {\n image_path: params.imagePath,\n });\n return {\n data: imageContent.data,\n mimeType: imageContent.mimeType,\n };\n}\n","import type { McpTransport } from \"../transport.js\";\nimport type { NextSteps } from \"./types.js\";\n\nexport interface GetDocumentStructureParams {\n docName: string;\n part?: number;\n waitForCompletion?: boolean;\n folderId?: string | null;\n}\n\nexport interface GetDocumentStructureResult {\n doc_name: string;\n structure: unknown;\n total_parts?: number;\n next_steps: NextSteps;\n}\n\nexport async function getDocumentStructure(\n transport: McpTransport,\n params: GetDocumentStructureParams,\n): Promise<GetDocumentStructureResult> {\n return transport.callTool<GetDocumentStructureResult>(\n \"get_document_structure\",\n {\n doc_name: params.docName,\n part: params.part,\n wait_for_completion: params.waitForCompletion,\n folder_id: params.folderId,\n },\n );\n}\n","import type { McpTransport } from \"../transport.js\";\nimport type { NextSteps } from \"./types.js\";\n\nexport interface GetDocumentParams {\n docName: string;\n waitForCompletion?: boolean;\n folderId?: string | null;\n}\n\nexport interface GetDocumentResult {\n id: string;\n name: string;\n description: string;\n status: string;\n createdAt: string;\n pageNum?: number;\n wait_info?: {\n waited: boolean;\n elapsed_seconds?: number;\n final_status?: string;\n };\n next_steps: NextSteps;\n}\n\nexport async function getDocument(\n transport: McpTransport,\n params: GetDocumentParams,\n): Promise<GetDocumentResult> {\n return transport.callTool<GetDocumentResult>(\"get_document\", {\n doc_name: params.docName,\n wait_for_completion: params.waitForCompletion,\n folder_id: params.folderId,\n });\n}\n","import type { McpTransport } from \"../transport.js\";\nimport type { NextSteps } from \"./types.js\";\n\nexport interface GetPageContentParams {\n docName: string;\n pages: string;\n waitForCompletion?: boolean;\n folderId?: string | null;\n}\n\nexport interface PageContentItem {\n page: number;\n text: string;\n block_id?: string;\n image_count?: number;\n image_annotations?: string[];\n}\n\nexport interface GetPageContentResult {\n doc_name: string;\n total_pages: number;\n requested_pages: string;\n returned_pages: string;\n content: PageContentItem[];\n next_steps: NextSteps;\n}\n\nexport async function getPageContent(\n transport: McpTransport,\n params: GetPageContentParams,\n): Promise<GetPageContentResult> {\n return transport.callTool<GetPageContentResult>(\"get_page_content\", {\n doc_name: params.docName,\n pages: params.pages,\n wait_for_completion: params.waitForCompletion,\n folder_id: params.folderId,\n });\n}\n","import type { McpTransport } from \"../transport.js\";\nimport type { FolderItem } from \"./create-folder.js\";\nimport type { NextSteps } from \"./types.js\";\n\nexport interface ListFoldersParams {\n /**\n * Use \"root\" for root-level folders only, a folder ID for subfolders, or omit for all folders\n */\n parentFolderId?: string;\n}\n\nexport interface ListFoldersResult {\n folders: FolderItem[];\n total: number;\n filter: {\n parent_folder_id?: string;\n scope: string;\n };\n next_steps: NextSteps;\n}\n\nexport async function listFolders(\n transport: McpTransport,\n params?: ListFoldersParams,\n): Promise<ListFoldersResult> {\n return transport.callTool<ListFoldersResult>(\"list_folders\", {\n parent_folder_id: params?.parentFolderId,\n });\n}\n","import type { McpTransport } from \"../transport.js\";\nimport type { NextSteps } from \"./types.js\";\n\nexport interface RecentDocumentsParams {\n folderId?: string | null;\n cursor?: string;\n limit?: number;\n}\n\nexport interface RecentDocumentItem {\n id: string;\n name: string;\n description: string;\n status: string;\n createdAt: string;\n pageNum?: number;\n}\n\nexport interface RecentDocumentsResult {\n docs: RecentDocumentItem[];\n total_shown: number;\n next_cursor?: string;\n has_more: boolean;\n processing_count: number;\n ready_count: number;\n failed_count: number;\n next_steps: NextSteps;\n}\n\nexport async function recentDocuments(\n transport: McpTransport,\n params?: RecentDocumentsParams,\n): Promise<RecentDocumentsResult> {\n return transport.callTool<RecentDocumentsResult>(\"recent_documents\", {\n folder_id: params?.folderId,\n cursor: params?.cursor,\n limit: params?.limit,\n });\n}\n","import type { McpTransport } from \"../transport.js\";\nimport type { NextSteps } from \"./types.js\";\n\nexport interface RemoveDocumentParams {\n docNames: string[];\n folderId?: string | null;\n}\n\nexport interface RemoveDocumentResult {\n results: {\n successful: number;\n failed: number;\n details: Array<{\n doc_name: string;\n success: boolean;\n error?: string;\n }>;\n };\n next_steps: NextSteps;\n}\n\nexport async function removeDocument(\n transport: McpTransport,\n params: RemoveDocumentParams,\n): Promise<RemoveDocumentResult> {\n return transport.callTool<RemoveDocumentResult>(\"remove_document\", {\n doc_names: params.docNames,\n folder_id: params.folderId,\n });\n}\n","import type { McpTransport } from \"../transport.js\";\nimport {\n type CreateFolderParams,\n type CreateFolderResult,\n createFolder,\n} from \"./create-folder.js\";\nimport {\n type FindRelevantDocumentsParams,\n type FindRelevantDocumentsResult,\n findRelevantDocuments,\n} from \"./find-relevant-documents.js\";\nimport {\n type GetDocumentImageParams,\n type GetDocumentImageResult,\n getDocumentImage,\n} from \"./get-document-image.js\";\nimport {\n type GetDocumentStructureParams,\n type GetDocumentStructureResult,\n getDocumentStructure,\n} from \"./get-document-structure.js\";\nimport {\n type GetDocumentParams,\n type GetDocumentResult,\n getDocument,\n} from \"./get-document.js\";\nimport {\n type GetPageContentParams,\n type GetPageContentResult,\n getPageContent,\n} from \"./get-page-content.js\";\nimport {\n type ListFoldersParams,\n type ListFoldersResult,\n listFolders,\n} from \"./list-folders.js\";\nimport {\n type RecentDocumentsParams,\n type RecentDocumentsResult,\n recentDocuments,\n} from \"./recent-documents.js\";\nimport {\n type RemoveDocumentParams,\n type RemoveDocumentResult,\n removeDocument,\n} from \"./remove-document.js\";\n\nexport type { NextSteps } from \"./types.js\";\nexport type {\n CreateFolderParams,\n CreateFolderResult,\n FolderItem,\n} from \"./create-folder.js\";\nexport type { ListFoldersParams, ListFoldersResult } from \"./list-folders.js\";\nexport type {\n RecentDocumentItem,\n RecentDocumentsParams,\n RecentDocumentsResult,\n} from \"./recent-documents.js\";\nexport type {\n FindRelevantDocumentsParams,\n FindRelevantDocumentsResult,\n SearchDocumentItem,\n} from \"./find-relevant-documents.js\";\nexport type { GetDocumentParams, GetDocumentResult } from \"./get-document.js\";\nexport type {\n GetDocumentImageParams,\n GetDocumentImageResult,\n} from \"./get-document-image.js\";\nexport type {\n GetDocumentStructureParams,\n GetDocumentStructureResult,\n} from \"./get-document-structure.js\";\nexport type {\n GetPageContentParams,\n GetPageContentResult,\n PageContentItem,\n} from \"./get-page-content.js\";\nexport type {\n RemoveDocumentParams,\n RemoveDocumentResult,\n} from \"./remove-document.js\";\n\nexport class PageIndexTools {\n constructor(private transport: McpTransport) {}\n\n recentDocuments = (\n params?: RecentDocumentsParams,\n ): Promise<RecentDocumentsResult> => recentDocuments(this.transport, params);\n\n findRelevantDocuments = (\n params?: FindRelevantDocumentsParams,\n ): Promise<FindRelevantDocumentsResult> =>\n findRelevantDocuments(this.transport, params);\n\n createFolder = (params: CreateFolderParams): Promise<CreateFolderResult> =>\n createFolder(this.transport, params);\n\n listFolders = (params?: ListFoldersParams): Promise<ListFoldersResult> =>\n listFolders(this.transport, params);\n\n getDocument = (params: GetDocumentParams): Promise<GetDocumentResult> =>\n getDocument(this.transport, params);\n\n getDocumentImage = (\n params: GetDocumentImageParams,\n ): Promise<GetDocumentImageResult> =>\n getDocumentImage(this.transport, params);\n\n getDocumentStructure = (\n params: GetDocumentStructureParams,\n ): Promise<GetDocumentStructureResult> =>\n getDocumentStructure(this.transport, params);\n\n getPageContent = (\n params: GetPageContentParams,\n ): Promise<GetPageContentResult> => getPageContent(this.transport, params);\n\n removeDocument = (\n params: RemoveDocumentParams,\n ): Promise<RemoveDocumentResult> => removeDocument(this.transport, params);\n}\n","","import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type {\n CallToolResult,\n ImageContent,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport pkg from \"../package.json\" assert { type: \"json\" };\nimport { PageIndexError, type PageIndexErrorCode } from \"./errors.js\";\n\nexport class McpTransport {\n private client = new Client(\n { name: pkg.name, version: pkg.version },\n { capabilities: {} },\n );\n private transport: StreamableHTTPClientTransport | null = null;\n private connected = false;\n private folderScope: string | undefined;\n private idleTimeout: number;\n private idleTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private config: {\n apiUrl: string;\n apiKey: string;\n folderScope?: string;\n idleTimeout?: number;\n },\n ) {\n this.folderScope = config.folderScope;\n this.idleTimeout = config.idleTimeout ?? 60_000;\n }\n\n private resetIdleTimer(): void {\n if (this.idleTimer) clearTimeout(this.idleTimer);\n if (this.idleTimeout > 0) {\n this.idleTimer = setTimeout(() => this.close(), this.idleTimeout);\n }\n }\n\n private clearIdleTimer(): void {\n if (this.idleTimer) {\n clearTimeout(this.idleTimer);\n this.idleTimer = null;\n }\n }\n\n async setFolderScope(scope: string | undefined): Promise<void> {\n if (this.folderScope === scope) return;\n this.folderScope = scope;\n if (this.connected) {\n await this.close();\n await this.connect();\n }\n }\n\n isConnected = () => this.connected;\n\n async connect(): Promise<void> {\n if (this.connected) return;\n const url = new URL(\"/mcp\", this.config.apiUrl);\n url.searchParams.set(\"folder\", \"1\");\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.config.apiKey}`,\n };\n if (this.folderScope) {\n headers[\"X-Folder-Scope\"] = this.folderScope;\n }\n this.transport = new StreamableHTTPClientTransport(url, {\n requestInit: { headers },\n });\n await this.client.connect(this.transport);\n this.connected = true;\n }\n\n async callTool<T = unknown>(\n name: string,\n args: Record<string, unknown>,\n ): Promise<T> {\n if (!this.connected) await this.connect();\n this.resetIdleTimer();\n\n const r = (await this.client.callTool({\n name,\n arguments: args,\n })) as CallToolResult;\n\n const textContent = r.content.find((c) => c.type === \"text\");\n const text = textContent?.type === \"text\" ? textContent.text : undefined;\n\n if (!text) {\n throw new PageIndexError(\"Empty response from server\", \"INTERNAL_ERROR\");\n }\n\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch {\n // Response is not JSON - treat it as a plain text error\n throw new PageIndexError(text, \"INTERNAL_ERROR\");\n }\n\n if (r.isError) {\n const { error, errorCode, ...details } = data as {\n error: string;\n errorCode?: PageIndexErrorCode;\n [key: string]: unknown;\n };\n throw new PageIndexError(error, errorCode, details);\n }\n\n return data as T;\n }\n\n async callToolForImage(\n name: string,\n args: Record<string, unknown>,\n ): Promise<ImageContent> {\n if (!this.connected) await this.connect();\n this.resetIdleTimer();\n\n const r = (await this.client.callTool({\n name,\n arguments: args,\n })) as CallToolResult;\n\n if (r.isError) {\n const textContent = r.content.find((c) => c.type === \"text\");\n const text = textContent?.type === \"text\" ? textContent.text : undefined;\n if (text) {\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(text) as Record<string, unknown>;\n } catch {\n throw new PageIndexError(text, \"INTERNAL_ERROR\");\n }\n const { error, errorCode, ...details } = data as {\n error: string;\n errorCode?: PageIndexErrorCode;\n [key: string]: unknown;\n };\n throw new PageIndexError(error, errorCode, details);\n }\n throw new PageIndexError(\"Image retrieval failed\", \"INTERNAL_ERROR\");\n }\n\n const imageContent = r.content.find(\n (c): c is ImageContent => c.type === \"image\",\n );\n if (!imageContent) {\n throw new PageIndexError(\n \"No image content in response\",\n \"INTERNAL_ERROR\",\n );\n }\n\n return imageContent;\n }\n\n async close(): Promise<void> {\n this.clearIdleTimer();\n if (this.connected) {\n await this.client.close().catch(() => {});\n this.transport = null;\n this.connected = false;\n }\n }\n}\n","import { PageIndexApi } from \"./api/client.js\";\nimport { PageIndexTools } from \"./tools/index.js\";\nimport { McpTransport } from \"./transport.js\";\n\nexport interface PageIndexClientConfig {\n apiKey: string;\n apiUrl?: string;\n folderScope?: string;\n /** MCP connection idle timeout in ms. Set 0 to disable. Default: 60000 (60s) */\n idleTimeout?: number;\n}\n\nconst DEFAULT_API_URL = \"https://api.pageindex.ai\";\n\nexport class PageIndexClient {\n private transport: McpTransport;\n private _api: PageIndexApi;\n private _tools: PageIndexTools | null = null;\n\n constructor(config: PageIndexClientConfig) {\n const apiUrl = (config.apiUrl || DEFAULT_API_URL).replace(/\\/$/, \"\");\n\n this.transport = new McpTransport({\n apiUrl,\n apiKey: config.apiKey,\n folderScope: config.folderScope,\n idleTimeout: config.idleTimeout,\n });\n\n this._api = new PageIndexApi({\n apiUrl,\n apiKey: config.apiKey,\n folderScope: config.folderScope,\n });\n }\n\n get api(): PageIndexApi {\n return this._api;\n }\n\n get tools(): PageIndexTools {\n if (!this._tools) {\n this._tools = new PageIndexTools(this.transport);\n }\n return this._tools;\n }\n\n setFolderScope(scope: string | undefined): Promise<void> {\n return this.transport.setFolderScope(scope);\n }\n\n connect = () => this.transport.connect();\n isConnected = () => this.transport.isConnected();\n close = () => this.transport.close();\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close();\n }\n}\n"],"mappings":"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"}
|