/** 발견이 왜 아무것도 주지 못했나 — 언어 중립 코드. */ export type DiscoveryErrorCode = 'reference-not-found' | 'adapter-unknown' | 'discovery-failed' | 'discovery-timeout'; export interface DiscoveryError { code: DiscoveryErrorCode; params?: Record; /** 영어 canonical — 로그에 남고, 번역이 없으면 그대로 보인다. */ message: string; } export interface DiscoveryResult { /** 발견된 사이트들. 실패했으면 빈 배열이고 `error` 가 이유를 말한다. */ sites: S[]; /** 실패 사유. **없으면 성공이다** — 빈 배열 + 사유 없음 = "연결은 됐지만 사이트가 없다". */ error?: DiscoveryError; } /** 등록된 레퍼런스가 없다 — 목록이 낡았거나 다른 테넌트의 것이다. */ export declare const referenceNotFound: (source: string) => DiscoveryError; /** 어댑터 종류를 모른다 — 배포에 그 커넥터가 없다(패키지 미설치·오타). */ export declare const adapterUnknown: (adapterType: string, source: string) => DiscoveryError; /** 연결·조회가 실패했다 — 원 시스템이 준 사유를 그대로 싣는다. */ export declare const discoveryFailed: (source: string, detail: string) => DiscoveryError; /** 기다려도 답이 없었다 — 무한히 도는 화면보다 사유가 낫다. */ export declare const discoveryTimedOut: (source: string, seconds: number) => DiscoveryError; /** * 어댑터가 준 것을 결과로 처리한다. * * **사이트가 없는 것을 실패로 만들지 않는다** — 연결이 되고 조회가 성공했는데 공장이 하나도 없는 * 시스템은 있을 수 있다(권한이 좁거나 아직 등록되지 않은 경우). 그것은 사실이고, 화면은 "없다" 고 * 말해야 한다. 실패로 합치면 사용자가 있지도 않은 문제를 찾는다. */ export declare function discovered(sites: readonly S[] | undefined | null): DiscoveryResult; /** 실패를 결과로 처리한다 — 사이트는 비어 있다(반쪽 목록을 성공처럼 보이게 하지 않는다). */ export declare function failed(error: DiscoveryError): DiscoveryResult; /** 어댑터가 오류를 낸 것에서 사람이 읽을 사유를 뽑는다 — 형태를 가정하지 않는다. */ export declare function detailOf(e: unknown): string;