@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/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): Promise<ChatCompletionsResponse>;
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
- cursor?: string;
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
@@ -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":"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"}
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
- name_or_description_filter: params?.nameOrDescriptionFilter,
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", { doc_names: params.docNames });
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.5.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) {
@@ -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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"}