/** * DocsMint REST API client. * * Bun-native `fetch` wrapper. All authenticated requests send * `Authorization: Bearer `. Non-OK responses throw * `DocsApiError` carrying the HTTP status and parsed body. Transient * failures (502 / 503 / 504 / timeout / network reset) are retried * with exponential backoff up to `config.retries` attempts. */ import type { DocsApiKeyCreated, DocsApiKeyListResponse, DocsAttachment, DocsAttachmentConfirmInput, DocsAttachmentListResponse, DocsAttachmentPresignInput, DocsAttachmentPresignResponse, DocsCategory, DocsCategoryListItem, DocsCategoryInput, DocsCategoryUpdate, DocsDocument, DocsDocumentCreateInput, DocsDocumentCursorPage, DocsDocumentIndexRefresh, DocsDocumentIndexStatus, DocsDocumentKnowledgeSummary, DocsDocumentListResponse, DocsDocumentPipeline, DocsPipelineWarningRetry, DocsDocumentUpdateInput, DocsFolder, DocsFolderCreateInput, DocsFolderUpdateInput, DocsGraphEntitiesResponse, DocsGraphRelatedResponse, DocsGraphSearchResponse, DocsHealthResponse, DocsRequestContext, DocsSearchOptions, DocsSearchResponse, DocsSearchSuggestItem, DocsSharedContent, DocsShareLink, DocsShareListResponse, DocsShareRole, DocsTag, DocsVersion, DocsVersionDiff } from "./types.js"; export interface DocsClientConfig { /** Base URL of the DocsMint API, e.g. `http://localhost:50700`. */ baseUrl: string; /** Bearer token used as `Authorization: Bearer `. */ apiKey?: string; /** Default request-scoped credentials forwarded to every request. */ requestContext?: DocsRequestContext; /** Injectable fetch implementation for hosts and contract tests. */ fetch?: typeof fetch; /** Per-request timeout in milliseconds. Default: 10 000. */ timeout?: number; /** Retry attempts for transient failures. Default: 3. */ retries?: number; /** Initial backoff in milliseconds (doubles each attempt). Default: 250. */ retryBackoffMs?: number; } export declare class DocsApiError extends Error { readonly status: number; readonly code: string; readonly body: unknown; readonly url?: string; readonly requestId?: string; constructor(status: number, body: unknown, message?: string, metadata?: { url?: string; requestId?: string; }, code?: string); private static codeFromBody; } /** * Identify public API errors across independently bundled DocsMint entrypoints. * The global symbol is stable across bundles while the invariant checks avoid * treating an arbitrary field-shaped Error as an API response. */ export declare function isDocsApiError(error: unknown): error is DocsApiError; export declare class DocsNetworkError extends Error { readonly requestId?: string; constructor(message: string, options?: { cause?: unknown; requestId?: string; }); } export declare class DocsTimeoutError extends DocsNetworkError { readonly timeout: number; constructor(timeout: number, options?: { cause?: unknown; requestId?: string; }); } export declare class DocsClient { private readonly config; constructor(config: DocsClientConfig); /** Return a client with a merged request context for an incoming request. */ withRequestContext(context: DocsRequestContext): DocsClient; createDoc(input: DocsDocumentCreateInput, context?: DocsRequestContext): Promise; getDoc(id: string, context?: DocsRequestContext): Promise; /** * Fetch a document as raw markdown via the public export endpoint. * Returns just the markdown body as a string. */ getDocMarkdown(id: string, context?: DocsRequestContext): Promise; updateDoc(id: string, updates: DocsDocumentUpdateInput, context?: DocsRequestContext): Promise; deleteDoc(id: string, context?: DocsRequestContext): Promise; listDocs(options?: { folderId?: string; tag?: string; page?: number; limit?: number; }, context?: DocsRequestContext): Promise; /** * List documents through the bounded cursor API. Cursors are opaque and * bound by the server to the authenticated workspace and category scope. */ listDocuments(options?: { categoryId?: string; cursor?: string; limit?: number; sortBy?: import("./types").DocsDocumentSortField; sortOrder?: import("./types").DocsSortOrder; }, context?: DocsRequestContext): Promise; duplicateDoc(id: string, context?: DocsRequestContext): Promise; getDocumentPipeline(id: string, context?: DocsRequestContext): Promise; retryDocumentPipelineWarnings(id: string, context?: DocsRequestContext): Promise; getDocumentKnowledgeSummary(id: string, context?: DocsRequestContext): Promise; getDocumentIndexStatus(id: string, context?: DocsRequestContext): Promise; refreshDocumentIndex(id: string, context?: DocsRequestContext): Promise; publishDoc(id: string, context?: DocsRequestContext): Promise; unpublishDoc(id: string, context?: DocsRequestContext): Promise; /** * Convenience alias for `getDocMarkdown` — both go through the same * `/api/documents/:id/export` endpoint on the backend. */ exportDoc(id: string, context?: DocsRequestContext): Promise; /** * Import a document from raw content. Posts JSON to * `POST /api/documents/import`. */ importDoc(input: { title?: string; content: string; folderId?: string; }, context?: DocsRequestContext): Promise; listFolders(parentId?: string, context?: DocsRequestContext): Promise; getFolder(id: string, context?: DocsRequestContext): Promise; createFolder(input: DocsFolderCreateInput, context?: DocsRequestContext): Promise; updateFolder(id: string, updates: DocsFolderUpdateInput, context?: DocsRequestContext): Promise; deleteFolder(id: string, context?: DocsRequestContext): Promise; listTags(context?: DocsRequestContext): Promise; createTag(input: { name: string; color?: string; }, context?: DocsRequestContext): Promise; updateTag(id: string, updates: { name?: string; color?: string; }, context?: DocsRequestContext): Promise; deleteTag(id: string, context?: DocsRequestContext): Promise; addTagToDoc(documentId: string, tagId: string, context?: DocsRequestContext): Promise; removeTagFromDoc(documentId: string, tagId: string, context?: DocsRequestContext): Promise; listCategories(context?: DocsRequestContext): Promise; createCategory(input: DocsCategoryInput, context?: DocsRequestContext): Promise; updateCategory(id: string, updates: DocsCategoryUpdate, context?: DocsRequestContext): Promise; deleteCategory(id: string, context?: DocsRequestContext): Promise; createGlobalApiKey(name?: string, context?: DocsRequestContext): Promise; createCategoryApiKey(categoryId: string, name?: string, context?: DocsRequestContext): Promise; listApiKeys(context?: DocsRequestContext): Promise; revealCategoryApiKey(id: string, context?: DocsRequestContext): Promise<{ key: string; }>; revokeApiKey(id: string, context?: DocsRequestContext): Promise<{ success: true; }>; search(query: string, options?: DocsSearchOptions, context?: DocsRequestContext): Promise; /** * Product-facing search contract. The retrieval choice is explicitly typed * so server-side callers do not need to synthesize browser-only headers. * `graph` retains hybrid lexical/vector retrieval and enables AGE expansion; * `rag` keeps the lexical/vector channels while disabling graph traversal. */ searchDocuments(input: { query: string; retrievalMode: "graph" | "rag"; options?: Omit; }, context?: DocsRequestContext): Promise; suggest(query: string, context?: DocsRequestContext): Promise; /** Return entities linked to a document through the AGE graph. */ getGraphEntities(docId: string, context?: DocsRequestContext): Promise; listGraphEntities(docId: string, context?: DocsRequestContext): Promise; /** Return graph-related documents and their relation metadata. */ getRelatedDocuments(docId: string, context?: DocsRequestContext, options?: { limit?: number; }): Promise; listRelatedDocuments(docId: string, context?: DocsRequestContext): Promise; /** Bulk graph lookup for agent and product integrations. */ graphSearch(input: { query?: string; docIds: string[]; maxResults?: number; }, context?: DocsRequestContext): Promise; /** Compatibility alias for callers that prefer verb-first naming. */ searchGraph(input: { query?: string; docIds: string[]; maxResults?: number; }, context?: DocsRequestContext): Promise; createShare(input: { documentId?: string; folderId?: string; password?: string; expiresIn?: "1h" | "1d" | "7d" | "30d" | "never"; role?: DocsShareRole; }, context?: DocsRequestContext): Promise; listShares(context?: DocsRequestContext): Promise; deleteShare(id: string, context?: DocsRequestContext): Promise; updateShare(id: string, updates: { role?: DocsShareRole; expiresIn?: "1h" | "1d" | "7d" | "30d" | "never"; }, context?: DocsRequestContext): Promise; /** * Public endpoint — still sends `Authorization` if configured, but * the backend does not require it. */ getShareByToken(token: string, context?: DocsRequestContext): Promise; uploadAttachment(documentId: string, file: Blob | ArrayBuffer | Uint8Array, filename: string, mimeType: string, context?: DocsRequestContext): Promise; presignAttachment(documentId: string, input: DocsAttachmentPresignInput, context?: DocsRequestContext): Promise; confirmAttachment(documentId: string, input: DocsAttachmentConfirmInput, context?: DocsRequestContext): Promise; listAttachments(documentId: string, context?: DocsRequestContext): Promise; deleteAttachment(id: string, context?: DocsRequestContext): Promise; listVersions(documentId: string, options?: { onlySnapshots?: boolean; limit?: number; }, context?: DocsRequestContext): Promise; getVersion(documentId: string, versionId: string, context?: DocsRequestContext): Promise; createSnapshot(documentId: string, input: { label: string; description?: string; }, context?: DocsRequestContext): Promise; restoreVersion(documentId: string, versionId: string, context?: DocsRequestContext): Promise; diffVersions(documentId: string, from: string, to: string, context?: DocsRequestContext): Promise; health(context?: DocsRequestContext): Promise; private request; private fetchRaw; private buildUrl; private cleanQuery; private shouldRetryStatus; private isRetryableError; private backoffDelay; private sleep; private toApiError; private wrapNetworkError; private isTimeoutError; private mergeContext; /** * Capture transport defaults at the boundary. Hosts often reuse a mutable * request object for a whole incoming request; retaining its HeaderInit by * reference would let later mutations silently change this client's scope. */ private snapshotContext; private toBlob; }