feat(hub): switch capability provider to Aliyun Doc Mind (ADR-0027) (#6)

Co-authored-by: Hong Jiarong <me@jrhim.com>
Co-committed-by: Hong Jiarong <me@jrhim.com>
This commit is contained in:
2026-07-18 16:42:42 +08:00
committed by 洪佳荣
parent b673dd1fe9
commit 64b3d1fc64
8 changed files with 593 additions and 113 deletions
+8 -8
View File
@@ -20,7 +20,7 @@ import { join, resolve, relative, isAbsolute } from "node:path";
import type { PrismaClient } from "@prisma/client";
import { LocalSecretEnvelope } from "../security/secretEnvelope.js";
import { resolveCapabilityCredential } from "./capabilityConnections.js";
import { MineruClientError, type MineruClient } from "./mineruClient.js";
import { DocmindClientError, type CapabilityProviderClient } from "./docmindClient.js";
import {
CAPABILITIES,
type CapabilityAdapter,
@@ -30,7 +30,7 @@ import {
} from "./types.js";
const CAPABILITY_ID = "pdf_to_md_bundle" as const;
const PROVIDER_ID = "mineru";
const PROVIDER_ID = "aliyun_docmind";
/** Thrown when a requested path escapes the workspace root (ADR-0018). */
export class CapabilityPathEscape extends Error {
@@ -59,11 +59,11 @@ function confineToWorkspace(requestedPath: string, workspaceDir: string): string
export interface PdfToMdBundleDeps {
readonly secrets: LocalSecretEnvelope;
readonly client: MineruClient;
readonly client: CapabilityProviderClient;
readonly prisma: PrismaClient;
}
/** Build the pdf_to_md_bundle adapter. The MineruClient is injectable for testing. */
/** Build the pdf_to_md_bundle adapter. The client is injectable for testing. */
export function createPdfToMdBundleAdapter(deps: PdfToMdBundleDeps): CapabilityAdapter {
return {
capabilityId: CAPABILITY_ID,
@@ -85,14 +85,14 @@ export function createPdfToMdBundleAdapter(deps: PdfToMdBundleDeps): CapabilityA
try {
result = await deps.client.parse(credential, { inputFilePath: absoluteInput });
} catch (e) {
if (e instanceof MineruClientError) throw e;
throw new MineruClientError(
if (e instanceof DocmindClientError) throw e;
throw new DocmindClientError(
e instanceof Error ? e.message : String(e),
"mineru_unreachable",
"docmind_unreachable",
);
}
if (result.markdown === "") {
throw new MineruClientError("MinerU returned empty markdown", "mineru_no_output");
throw new DocmindClientError("docmind returned empty markdown", "docmind_no_output");
}
// 4. Write outputs into the workspace.