@hilbras/omninode 2.0.0-alpha.18 → 2.0.0-alpha.19
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 +2 -2
- package/dist/cli/{chunk-6Z6O63SS.js → chunk-BTJDQTWH.js} +15 -1
- package/dist/cli/{chunk-6Z6O63SS.js.map → chunk-BTJDQTWH.js.map} +1 -1
- package/dist/cli/index.js +12 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/{providers-OYXBAQTX.js → providers-KPW3FURD.js} +2 -2
- package/dist/index.d.ts +104 -155
- package/dist/index.js +25 -36
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- /package/dist/cli/{providers-OYXBAQTX.js.map → providers-KPW3FURD.js.map} +0 -0
package/README.md
CHANGED
|
@@ -58,8 +58,8 @@ release — is in progress**, shipping as tagged prereleases (`v2.0.0-alpha.N`).
|
|
|
58
58
|
| 16 | Configuration v2 | precedence, profiles, `OMNINODE_*`, diagnostics |
|
|
59
59
|
| 17 | Testing expansion | explicit failure matrix + regression tests |
|
|
60
60
|
| 18 | Documentation overhaul | complete document set, rewritten README |
|
|
61
|
-
| 19 |
|
|
62
|
-
| 20–24 | Performance · developer experience · CI/CD · migration tooling · final hardening |
|
|
61
|
+
| 19 | API & package quality | curated public surface with CI guards, boundary validation, verified package contents |
|
|
62
|
+
| 20–24 | Performance · developer experience · CI/CD · migration tooling · final hardening | next: performance |
|
|
63
63
|
|
|
64
64
|
The roadmap is [docs/ROADMAP_V2.md](docs/ROADMAP_V2.md); the completed v1 plan is
|
|
65
65
|
[docs/DEVELOPMENT_PLAN.md](docs/DEVELOPMENT_PLAN.md).
|
|
@@ -662,7 +662,21 @@ var OPENAI_COMPATIBLE_TYPES = [
|
|
|
662
662
|
"local",
|
|
663
663
|
"custom"
|
|
664
664
|
];
|
|
665
|
+
function assertProviderConfig(config) {
|
|
666
|
+
if (!config.name || config.name.trim().length === 0) {
|
|
667
|
+
throw new ConfigError("CONFIG_INVALID", "Provider name must not be empty.");
|
|
668
|
+
}
|
|
669
|
+
if (!config.baseUrl || config.baseUrl.trim().length === 0) {
|
|
670
|
+
throw new ConfigError("CONFIG_INVALID", `Provider "${config.name}" needs a baseUrl.`);
|
|
671
|
+
}
|
|
672
|
+
try {
|
|
673
|
+
new URL(config.baseUrl);
|
|
674
|
+
} catch {
|
|
675
|
+
throw new ConfigError("CONFIG_INVALID", `Provider "${config.name}" has an invalid baseUrl: ${config.baseUrl}`);
|
|
676
|
+
}
|
|
677
|
+
}
|
|
665
678
|
function createProvider(config, options = {}) {
|
|
679
|
+
assertProviderConfig(config);
|
|
666
680
|
const shared = {
|
|
667
681
|
...options.env !== void 0 ? { env: options.env } : {},
|
|
668
682
|
...options.audit !== void 0 ? { audit: options.audit } : {}
|
|
@@ -705,4 +719,4 @@ export {
|
|
|
705
719
|
OPENAI_COMPATIBLE_TYPES,
|
|
706
720
|
createProvider
|
|
707
721
|
};
|
|
708
|
-
//# sourceMappingURL=chunk-
|
|
722
|
+
//# sourceMappingURL=chunk-BTJDQTWH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/errors/index.ts","../../src/providers/auth.ts","../../src/providers/http.ts","../../src/logger/index.ts","../../src/providers/errors.ts","../../src/providers/openai-compatible/index.ts","../../src/providers/omnihilbras/index.ts","../../src/providers/factory.ts"],"sourcesContent":["/** Typed error hierarchy shared across the whole codebase (§4.1 — error model). */\n\nexport type OmniNodeErrorCode =\n | \"CONFIG_NOT_FOUND\"\n | \"CONFIG_INVALID\"\n | \"PROVIDER_NOT_FOUND\"\n | \"PROVIDER_UNAVAILABLE\"\n | \"PROVIDER_AUTH_FAILED\"\n | \"MODEL_NOT_FOUND\"\n | \"AGENT_NOT_FOUND\"\n | \"AGENT_FAILED\"\n | \"AGENT_TIMEOUT\"\n | \"TASK_INVALID\"\n | \"TASK_NOT_FOUND\"\n | \"TASK_FAILED\"\n | \"PIPELINE_NOT_FOUND\"\n | \"PIPELINE_INVALID\"\n | \"PIPELINE_FAILED\"\n | \"PLANNER_FAILED\"\n | \"PLAN_INVALID\"\n | \"TASK_NOT_FOUND\"\n | \"PROVIDER_NOT_FOUND\"\n | \"PROTOCOL_VIOLATION\"\n | \"MEMORY_UNAVAILABLE\"\n | \"REPORT_NOT_FOUND\"\n | \"NOT_IMPLEMENTED\"\n | \"CLI_USAGE\"\n | \"INTERNAL\";\n\nexport interface OmniNodeErrorOptions {\n cause?: unknown;\n details?: Record<string, unknown>;\n}\n\nexport class OmniNodeError extends Error {\n readonly code: OmniNodeErrorCode;\n readonly details?: Record<string, unknown>;\n\n constructor(code: OmniNodeErrorCode, message: string, options: OmniNodeErrorOptions = {}) {\n super(message, { cause: options.cause });\n this.name = new.target.name;\n this.code = code;\n this.details = options.details;\n }\n}\n\nexport class ConfigError extends OmniNodeError {\n constructor(\n code: \"CONFIG_NOT_FOUND\" | \"CONFIG_INVALID\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class ProviderError extends OmniNodeError {\n constructor(\n code:\n | \"PROVIDER_NOT_FOUND\"\n | \"PROVIDER_UNAVAILABLE\"\n | \"PROVIDER_AUTH_FAILED\"\n | \"MODEL_NOT_FOUND\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class AgentError extends OmniNodeError {\n constructor(\n code: \"AGENT_NOT_FOUND\" | \"AGENT_FAILED\" | \"AGENT_TIMEOUT\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class TaskError extends OmniNodeError {\n constructor(\n code: \"TASK_INVALID\" | \"TASK_NOT_FOUND\" | \"TASK_FAILED\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class PipelineError extends OmniNodeError {\n constructor(\n code: \"PIPELINE_NOT_FOUND\" | \"PIPELINE_INVALID\" | \"PIPELINE_FAILED\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class ProtocolError extends OmniNodeError {\n constructor(message: string, options: OmniNodeErrorOptions = {}) {\n super(\"PROTOCOL_VIOLATION\", message, options);\n }\n}\n\nexport class PlannerError extends OmniNodeError {\n constructor(\n code: \"PLANNER_FAILED\" | \"PLAN_INVALID\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class MemoryError extends OmniNodeError {\n constructor(message: string, options: OmniNodeErrorOptions = {}) {\n super(\"MEMORY_UNAVAILABLE\", message, options);\n }\n}\n\nexport function isOmniNodeError(value: unknown): value is OmniNodeError {\n return value instanceof OmniNodeError;\n}\n","/**\n * Authentication resolution (§24): API keys live in the environment and are\n * referenced from configuration by variable name — never stored in files.\n */\nimport { ProviderError } from \"../errors/index.js\";\n// AuthRef is structurally satisfied by ProviderConfig.\n\n/** Minimal provider identity — any config object with a name and optional env var reference. */\nexport interface AuthRef {\n name: string;\n apiKeyEnvVar?: string;\n headers?: Record<string, string>;\n}\n\nexport function resolveApiKey(\n config: AuthRef,\n env: Record<string, string | undefined> = process.env,\n): string | undefined {\n if (!config.apiKeyEnvVar) return undefined;\n const value = env[config.apiKeyEnvVar];\n if (!value) {\n throw new ProviderError(\n \"PROVIDER_AUTH_FAILED\",\n `Environment variable \"${config.apiKeyEnvVar}\" (referenced by provider \"${config.name}\") is not set.`,\n );\n }\n return value;\n}\n\nexport function authHeaders(\n config: AuthRef,\n env: Record<string, string | undefined> = process.env,\n): Record<string, string> {\n const key = resolveApiKey(config, env);\n const base = { ...(config.headers ?? {}) };\n return key ? { ...base, authorization: `Bearer ${key}` } : base;\n}\n","/**\n * Thin JSON HTTP layer over global fetch. HTTP error statuses are returned to\n * the caller, not thrown — provider methods interpret them; only transport\n * failures (network, timeout, unparseable body) throw.\n */\n/** Raised for malformed provider responses so adapters can classify them. */\nexport class HttpResponseError extends Error {\n constructor(message: string, readonly status: number, cause?: unknown) {\n super(message, { cause });\n this.name = \"HttpResponseError\";\n }\n}\n\nexport interface HttpRequestOptions {\n method?: \"GET\" | \"POST\";\n headers?: Record<string, string>;\n body?: unknown;\n timeoutMs?: number;\n}\n\nexport interface HttpResponse {\n status: number;\n body: unknown;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport async function requestJson(\n url: string,\n options: HttpRequestOptions = {},\n): Promise<HttpResponse> {\n const { method = \"GET\", headers = {}, body, timeoutMs = DEFAULT_TIMEOUT_MS } = options;\n\n // Transport failures propagate raw: adapters normalize them into provider\n // error kinds (roadmap §10).\n const response: Response = await fetch(url, {\n method,\n headers: {\n accept: \"application/json\",\n ...(body !== undefined ? { \"content-type\": \"application/json\" } : {}),\n ...headers,\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n let parsed: unknown;\n try {\n parsed = await response.json();\n } catch (error) {\n throw new HttpResponseError(`Response from ${url} was not valid JSON.`, response.status, error);\n }\n\n return { status: response.status, body: parsed };\n}\n","/** Leveled logger with a pluggable sink and child loggers (§4.1 — logging). */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface LogSink {\n write(level: LogLevel, line: string): void;\n}\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n};\n\nexport interface WritableLike {\n write(chunk: string): unknown;\n}\n\nexport class ConsoleLogSink implements LogSink {\n constructor(private readonly stream: WritableLike = process.stderr) {}\n\n write(_level: LogLevel, line: string): void {\n this.stream.write(line + \"\\n\");\n }\n}\n\nexport type LogFormat = \"text\" | \"json\";\n\nexport interface LoggerOptions {\n level?: LogLevel;\n sink?: LogSink;\n /** \"text\" (default) or machine-readable \"json\" lines (roadmap §18). */\n format?: LogFormat;\n /** Structured fields attached to every line, e.g. { component: \"config\" }. */\n context?: Record<string, unknown>;\n}\n\nexport class Logger {\n level: LogLevel;\n format: LogFormat;\n private readonly sink: LogSink;\n private readonly context: Record<string, unknown>;\n\n constructor(options: LoggerOptions = {}) {\n this.level = options.level ?? \"info\";\n this.format = options.format ?? \"text\";\n this.sink = options.sink ?? new ConsoleLogSink();\n this.context = options.context ?? {};\n }\n\n child(context: Record<string, unknown>): Logger {\n return new Logger({\n level: this.level,\n format: this.format,\n sink: this.sink,\n context: { ...this.context, ...context },\n });\n }\n\n debug(message: string, data?: Record<string, unknown>): void {\n this.log(\"debug\", message, data);\n }\n\n info(message: string, data?: Record<string, unknown>): void {\n this.log(\"info\", message, data);\n }\n\n warn(message: string, data?: Record<string, unknown>): void {\n this.log(\"warn\", message, data);\n }\n\n error(message: string, data?: Record<string, unknown>): void {\n this.log(\"error\", message, data);\n }\n\n private log(level: LogLevel, message: string, data?: Record<string, unknown>): void {\n if (LEVEL_ORDER[level] < LEVEL_ORDER[this.level]) return;\n const at = new Date().toISOString();\n const merged = { ...this.context, ...data };\n if (this.format === \"json\") {\n this.sink.write(level, JSON.stringify({ at, level, message, ...merged }));\n return;\n }\n const parts = [at, level.toUpperCase(), message];\n if (Object.keys(merged).length > 0) {\n parts.push(JSON.stringify(merged));\n }\n this.sink.write(level, parts.join(\" \"));\n }\n}\n\n/** Default application logger. Writes to stderr so stdout stays clean for CLI output. */\nexport const logger = new Logger();\n\n/** Applies configuration (level/format) to the default logger — used by the CLI. */\nexport function configureLogger(options: { level?: LogLevel; format?: LogFormat }): void {\n if (options.level !== undefined) logger.level = options.level;\n if (options.format !== undefined) logger.format = options.format;\n}\n","/**\n * Provider error normalization (roadmap §10).\n *\n * Every provider failure is mapped to one stable kind, so callers can react\n * (retry a rate limit, surface an auth problem, treat a missing model\n * differently) without string-matching provider-specific payloads.\n */\nimport { ProviderError } from \"../errors/index.js\";\n\nexport type ProviderErrorKind =\n | \"AUTHENTICATION_ERROR\"\n | \"RATE_LIMIT_ERROR\"\n | \"INVALID_REQUEST\"\n | \"MODEL_NOT_FOUND\"\n | \"TIMEOUT\"\n | \"NETWORK_ERROR\"\n | \"SERVER_ERROR\"\n | \"UNKNOWN_ERROR\";\n\nexport interface ProviderErrorContext {\n provider: string;\n operation: string;\n status?: number;\n body?: unknown;\n retryAfterMs?: number;\n cause?: unknown;\n /** Maps the normalized kind onto the legacy stable error code. */\n code?:\n | \"PROVIDER_UNAVAILABLE\"\n | \"PROVIDER_AUTH_FAILED\"\n | \"MODEL_NOT_FOUND\";\n}\n\nfunction kindToCode(kind: ProviderErrorKind): NonNullable<ProviderErrorContext[\"code\"]> {\n switch (kind) {\n case \"AUTHENTICATION_ERROR\":\n return \"PROVIDER_AUTH_FAILED\";\n case \"MODEL_NOT_FOUND\":\n return \"MODEL_NOT_FOUND\";\n default:\n return \"PROVIDER_UNAVAILABLE\";\n }\n}\n\n/** Kinds worth retrying automatically (rate limits and transient server errors). */\nexport function isRetryable(kind: ProviderErrorKind): boolean {\n return kind === \"RATE_LIMIT_ERROR\" || kind === \"SERVER_ERROR\" || kind === \"NETWORK_ERROR\";\n}\n\n/** Maps an HTTP status (and optional body) to a normalized kind. */\nexport function kindFromStatus(status: number): ProviderErrorKind {\n if (status === 401 || status === 403) return \"AUTHENTICATION_ERROR\";\n if (status === 429) return \"RATE_LIMIT_ERROR\";\n if (status === 404) return \"MODEL_NOT_FOUND\";\n if (status === 408 || status === 504) return \"TIMEOUT\";\n if (status >= 500) return \"SERVER_ERROR\";\n if (status >= 400) return \"INVALID_REQUEST\";\n return \"UNKNOWN_ERROR\";\n}\n\n/** Extracts a human message from common provider error body shapes. */\nexport function extractMessage(body: unknown): string | undefined {\n if (body === null || typeof body !== \"object\") return undefined;\n const root = body as Record<string, unknown>;\n const error = (root.error ?? root) as Record<string, unknown>;\n const message = error.message ?? error.detail ?? root.message;\n return typeof message === \"string\" ? message : undefined;\n}\n\n/** Parses `Retry-After` (seconds or HTTP-date) into milliseconds. */\nexport function parseRetryAfter(value: string | null | undefined, now = Date.now()): number | undefined {\n if (!value) return undefined;\n const seconds = Number(value);\n if (Number.isFinite(seconds)) return Math.max(0, seconds * 1000);\n const date = Date.parse(value);\n return Number.isNaN(date) ? undefined : Math.max(0, date - now);\n}\n\n/** True for the abort/timeout errors raised by fetch's AbortSignal.timeout. */\nexport function isTimeoutError(error: unknown): boolean {\n return (\n (error instanceof Error && (error.name === \"TimeoutError\" || error.name === \"AbortError\")) ||\n (typeof (error as { code?: string })?.code === \"string\" &&\n (error as { code?: string }).code === \"ABORT_ERR\")\n );\n}\n\n/** True for transport failures (DNS, refused, TLS, offline). */\nexport function isNetworkError(error: unknown): boolean {\n return error instanceof TypeError || (typeof (error as { cause?: unknown })?.cause === \"object\" && error instanceof Error && !(error as { code?: string }).code);\n}\n\n/**\n * Builds a normalized ProviderError from an HTTP failure.\n */\n/** Actionable fallback text per kind (used when the provider sent no message). */\nfunction fallbackMessage(kind: ProviderErrorKind, context: ProviderErrorContext, status: number): string {\n const { provider, operation } = context;\n switch (kind) {\n case \"AUTHENTICATION_ERROR\":\n return `Authentication with provider \"${provider}\" failed (HTTP ${status}). Check that the referenced API key is set and valid.`;\n case \"RATE_LIMIT_ERROR\":\n return `Provider \"${provider}\" rate-limited ${operation} (HTTP ${status}). Retry later.`;\n case \"MODEL_NOT_FOUND\":\n return `Provider \"${provider}\" does not expose the requested model (HTTP ${status}).`;\n case \"TIMEOUT\":\n return `Provider \"${provider}\" timed out during ${operation} (HTTP ${status}).`;\n case \"SERVER_ERROR\":\n return `Provider \"${provider}\" returned a server error during ${operation} (HTTP ${status}).`;\n case \"INVALID_REQUEST\":\n return `Provider \"${provider}\" rejected ${operation} as invalid (HTTP ${status}).`;\n default:\n return `Provider \"${provider}\" failed during ${operation} (HTTP ${status}).`;\n }\n}\n\nexport function providerHttpError(context: ProviderErrorContext): ProviderError {\n const status = context.status ?? 0;\n const kind = kindFromStatus(status);\n const detail = extractMessage(context.body);\n const retryAfterMs = context.retryAfterMs ?? parseRetryAfter(undefined);\n return new ProviderError(\n context.code ?? kindToCode(kind),\n detail ?? fallbackMessage(kind, context, status),\n {\n cause: context.cause,\n details: {\n kind,\n provider: context.provider,\n operation: context.operation,\n status,\n retryable: isRetryable(kind),\n ...(retryAfterMs !== undefined ? { retryAfterMs } : {}),\n ...(detail ? { providerMessage: detail } : {}),\n },\n },\n );\n}\n\n/** Wraps a thrown transport/abort error into a normalized ProviderError. */\nexport function providerTransportError(context: Omit<ProviderErrorContext, \"status\" | \"body\">): ProviderError {\n const cause = context.cause;\n const kind: ProviderErrorKind = isTimeoutError(cause)\n ? \"TIMEOUT\"\n : cause instanceof SyntaxError || (cause as { name?: string })?.name === \"HttpResponseError\"\n ? \"UNKNOWN_ERROR\"\n : \"NETWORK_ERROR\";\n const message = context.cause instanceof Error ? context.cause.message : String(context.cause);\n return new ProviderError(\"PROVIDER_UNAVAILABLE\", `Provider request failed: ${message}`, {\n cause: context.cause,\n details: {\n kind,\n provider: context.provider,\n operation: context.operation,\n retryable: isRetryable(kind),\n },\n });\n}","/**\n * OpenAI-compatible provider adapter (§5, §7): works with OpenAI, OpenRouter,\n * local runtimes (Ollama/LM Studio/vLLM) and custom gateways that expose the\n * /models and /chat/completions endpoints.\n */\nimport { ProviderError } from \"../../errors/index.js\";\nimport { logger, type Logger } from \"../../logger/index.js\";\n\n/** Default provider request timeout when the config does not set one. */\nconst DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\nimport type { ChatRequest, ChatResponse, ChatStreamChunk } from \"../../types/chat.js\";\nimport type { AuditSink } from \"../../audit/index.js\";\nimport type { Modality, ModelInfo } from \"../../types/model.js\";\nimport type { IChatProvider, ProviderConfig, ProviderStatus } from \"../../types/provider.js\";\nimport { authHeaders } from \"../auth.js\";\nimport { requestJson } from \"../http.js\";\nimport { providerHttpError, providerTransportError } from \"../errors.js\";\nimport type { ProviderAuthentication } from \"../../types/provider.js\";\n\ninterface OpenAIModelEntry {\n id?: unknown;\n name?: unknown;\n owned_by?: unknown;\n created?: unknown;\n context_length?: unknown;\n context_window?: unknown;\n input_modalities?: unknown;\n output_modalities?: unknown;\n supported_parameters?: unknown;\n}\n\ninterface OpenAIChatResponse {\n model?: unknown;\n choices?: unknown;\n usage?: unknown;\n}\n\nexport class OpenAICompatibleProvider implements IChatProvider {\n readonly config: ProviderConfig;\n readonly providerId: string;\n readonly authentication: ProviderAuthentication;\n private readonly log: Logger;\n /** Discovered models, so getModel() answers without another round-trip. */\n private discovered?: ModelInfo[];\n\n private readonly env: Record<string, string | undefined>;\n\n private readonly audit?: AuditSink;\n\n constructor(\n config: ProviderConfig,\n log: Logger = logger,\n env: Record<string, string | undefined> = process.env,\n audit?: AuditSink,\n ) {\n this.audit = audit;\n this.config = { ...config, baseUrl: normalizeBaseUrl(config.baseUrl) };\n this.env = env;\n this.providerId = config.providerId ?? config.name;\n this.authentication = {\n method: config.apiKeyEnvVar ? \"bearer\" : \"none\",\n ...(config.apiKeyEnvVar ? { envVar: config.apiKeyEnvVar } : {}),\n configured: config.apiKeyEnvVar ? Boolean(env[config.apiKeyEnvVar]) : true,\n };\n this.log = log.child({ provider: config.name });\n }\n\n /** Provider-level request timeout (roadmap §6.6/§11) with the shared default. */\n private get requestTimeoutMs(): number {\n return this.config.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n }\n\n /** Authenticate + discover (roadmap §10, Model Discovery). */\n async connect(): Promise<ModelInfo[]> {\n authHeaders(this.config, this.env); // throws PROVIDER_AUTH_FAILED when the env var is unset\n const models = await this.listModels();\n this.discovered = models;\n return models;\n }\n\n async getModel(modelId: string): Promise<ModelInfo | undefined> {\n const models = this.discovered ?? (await this.connect());\n return models.find((m) => m.id === modelId);\n }\n\n /** Raw /models body (protected so adapters can capture gateway-level metadata). */\n protected async rawModelsResponse(): Promise<unknown> {\n const response = await this.modelsRequest();\n return response.body;\n }\n\n private async modelsRequest(): Promise<{ status: number; body: unknown }> {\n let response: { status: number; body: unknown };\n try {\n response = await requestJson(`${this.config.baseUrl}/models`, {\n headers: authHeaders(this.config, this.env),\n timeoutMs: this.requestTimeoutMs,\n });\n } catch (error) {\n if (error instanceof ProviderError) {\n await this.recordProviderError(\"listModels\", error);\n throw error; // auth problem — keep the precise error\n }\n const normalized = providerTransportError({\n provider: this.config.name,\n operation: \"listModels\",\n cause: error,\n });\n await this.recordProviderError(\"listModels\", normalized);\n throw normalized;\n }\n const { status, body } = response;\n if (status !== 200) {\n const httpError = providerHttpError({\n provider: this.config.name,\n operation: \"listModels\",\n status,\n body,\n });\n await this.recordProviderError(\"listModels\", httpError);\n throw httpError;\n }\n return response;\n }\n\n async listModels(): Promise<ModelInfo[]> {\n const body = await this.rawModelsResponse();\n\n const entries = extractModelEntries(body, this.config);\n const models: ModelInfo[] = [];\n let skipped = 0;\n for (const entry of entries) {\n if (typeof entry.id !== \"string\" || entry.id.length === 0) {\n skipped += 1;\n continue;\n }\n models.push(this.toModelInfo(entry as OpenAIModelEntry & { id: string }));\n }\n if (skipped > 0) {\n this.log.warn(`Skipped ${skipped} model entr(y/ies) without a valid id.`);\n }\n return models;\n }\n\n /** Maps a raw model entry onto the normalized metadata shape (§10). */\n private toModelInfo(entry: OpenAIModelEntry & { id: string }): ModelInfo {\n const parameters = Array.isArray(entry.supported_parameters)\n ? (entry.supported_parameters.filter((p): p is string => typeof p === \"string\") as string[])\n : undefined;\n const contextWindow =\n typeof entry.context_length === \"number\"\n ? entry.context_length\n : typeof entry.context_window === \"number\"\n ? entry.context_window\n : undefined;\n const inputTypes = normalizeModalities(entry.input_modalities);\n const outputTypes = normalizeModalities(entry.output_modalities);\n return {\n provider: this.config.name,\n id: entry.id,\n displayName: entry.id,\n ...(typeof entry.name === \"string\" ? { name: entry.name } : {}),\n status: \"available\",\n ...(contextWindow !== undefined ? { contextWindow } : {}),\n ...(inputTypes !== undefined ? { inputTypes } : {}),\n ...(outputTypes !== undefined ? { outputTypes } : {}),\n ...(parameters !== undefined\n ? {\n supportsTools: parameters.includes(\"tools\") || parameters.includes(\"tool_choice\"),\n supportsStructuredOutput: parameters.includes(\"response_format\"),\n supportsStreaming: parameters.includes(\"stream\"),\n }\n : {}),\n metadata: {\n ...(typeof entry.owned_by === \"string\" ? { ownedBy: entry.owned_by } : {}),\n ...(typeof entry.created === \"number\" ? { createdAt: entry.created } : {}),\n ...(parameters !== undefined ? { supportedParameters: parameters } : {}),\n },\n };\n }\n\n /** Streaming where the gateway supports it (§11). */\n stream(request: ChatRequest, onChunk: (chunk: ChatStreamChunk) => void): Promise<ChatResponse> {\n return streamChatCompletion(this.config, request, onChunk, this.env);\n }\n\n /** Provider errors are part of the audit trail (§14 correlation, §18 observability). */\n private async recordProviderError(operation: string, error: ProviderError): Promise<void> {\n await this.audit?.record({\n at: new Date().toISOString(),\n action: \"provider.error\",\n id: this.providerId,\n providerId: this.providerId,\n detail: {\n operation,\n code: error.code,\n kind: (error.details as { kind?: string } | undefined)?.kind,\n message: error.message,\n },\n });\n }\n\n async healthCheck(): Promise<ProviderStatus> {\n const lastCheckedAt = new Date().toISOString();\n try {\n const started = Date.now();\n const models = await this.listModels();\n return {\n name: this.config.name,\n type: this.config.type,\n baseUrl: this.config.baseUrl,\n health: \"healthy\",\n connected: true,\n modelCount: models.length,\n lastCheckedAt,\n message: `Discovered ${models.length} model(s) in ${Date.now() - started}ms.`,\n };\n } catch (error) {\n return {\n name: this.config.name,\n type: this.config.type,\n baseUrl: this.config.baseUrl,\n health: inferHealth(error),\n connected: false,\n modelCount: 0,\n lastCheckedAt,\n message: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async chat(request: ChatRequest): Promise<ChatResponse> {\n let response: { status: number; body: unknown };\n try {\n response = await requestJson(`${this.config.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: authHeaders(this.config, this.env),\n timeoutMs: this.requestTimeoutMs,\n body: {\n model: request.model,\n messages: request.messages,\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n ...(request.maxTokens !== undefined ? { max_tokens: request.maxTokens } : {}),\n ...(request.stop !== undefined ? { stop: request.stop } : {}),\n },\n });\n } catch (error) {\n if (error instanceof ProviderError) {\n await this.recordProviderError(\"chat\", error);\n throw error;\n }\n const normalized = providerTransportError({ provider: this.config.name, operation: \"chat\", cause: error });\n await this.recordProviderError(\"chat\", normalized);\n throw normalized;\n }\n const { status, body } = response;\n\n if (status !== 200) {\n const httpError = providerHttpError({\n provider: this.config.name,\n operation: \"chat\",\n status,\n body,\n ...(status === 404\n ? {\n code: \"MODEL_NOT_FOUND\" as const,\n }\n : {}),\n });\n await this.recordProviderError(\"chat\", httpError);\n throw httpError;\n }\n\n const payload = body as OpenAIChatResponse;\n const choices = Array.isArray(payload.choices) ? payload.choices : [];\n const first = choices[0] as { message?: { content?: unknown }; finish_reason?: unknown } | undefined;\n if (!first || typeof first.message?.content !== \"string\") {\n throw unavailable(this.config, \"Chat completion response had no message content.\", status);\n }\n\n const usage = (payload.usage ?? {}) as {\n prompt_tokens?: unknown;\n completion_tokens?: unknown;\n total_tokens?: unknown;\n };\n\n return {\n model: typeof payload.model === \"string\" ? payload.model : request.model,\n content: first.message.content,\n finishReason: typeof first.finish_reason === \"string\" ? first.finish_reason : undefined,\n usage: {\n promptTokens: typeof usage.prompt_tokens === \"number\" ? usage.prompt_tokens : undefined,\n completionTokens:\n typeof usage.completion_tokens === \"number\" ? usage.completion_tokens : undefined,\n totalTokens: typeof usage.total_tokens === \"number\" ? usage.total_tokens : undefined,\n },\n raw: body,\n };\n }\n}\n\n/**\n * Streams a chat completion from an OpenAI-compatible SSE endpoint (§11).\n * Emits deltas through `onChunk` and returns the assembled response.\n */\nexport async function streamChatCompletion(\n config: ProviderConfig,\n request: ChatRequest,\n onChunk: (chunk: ChatStreamChunk) => void,\n env: Record<string, string | undefined> = process.env,\n): Promise<ChatResponse> {\n const baseUrl = normalizeBaseUrl(config.baseUrl);\n const timeoutMs = config.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n let response: Response;\n try {\n response = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n accept: \"text/event-stream\",\n \"content-type\": \"application/json\",\n ...authHeaders(config, env),\n },\n body: JSON.stringify({\n model: request.model,\n messages: request.messages,\n stream: true,\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n ...(request.maxTokens !== undefined ? { max_tokens: request.maxTokens } : {}),\n }),\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (error) {\n throw providerTransportError({ provider: config.name, operation: \"stream\", cause: error });\n }\n if (!response.ok) {\n const body: unknown = await response.json().catch(() => undefined);\n throw providerHttpError({ provider: config.name, operation: \"stream\", status: response.status, body });\n }\n if (!response.body) {\n throw providerHttpError({\n provider: config.name,\n operation: \"stream\",\n status: 500,\n body: { error: { message: \"streaming is not supported by this endpoint\" } },\n });\n }\n\n let content = \"\";\n let model = request.model;\n let finishReason: string | undefined;\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n for await (const piece of response.body as unknown as AsyncIterable<Uint8Array>) {\n buffer += decoder.decode(piece, { stream: true });\n let newline = buffer.indexOf(\"\\n\");\n while (newline >= 0) {\n const line = buffer.slice(0, newline).trim();\n buffer = buffer.slice(newline + 1);\n newline = buffer.indexOf(\"\\n\");\n if (line.length === 0 || line.startsWith(\":\")) continue;\n const data = line.startsWith(\"data:\") ? line.slice(5).trim() : line;\n if (data === \"[DONE]\") continue;\n let event: Record<string, unknown>;\n try {\n event = JSON.parse(data) as Record<string, unknown>;\n } catch {\n continue; // tolerate non-JSON SSE noise\n }\n if (typeof event.model === \"string\") model = event.model;\n const choices = Array.isArray(event.choices) ? event.choices : [];\n const first = choices[0] as { delta?: { content?: unknown }; finish_reason?: unknown } | undefined;\n const delta = typeof first?.delta?.content === \"string\" ? first.delta.content : \"\";\n if (delta.length > 0) content += delta;\n if (typeof first?.finish_reason === \"string\") finishReason = first.finish_reason;\n onChunk({ delta, ...(finishReason !== undefined ? { finishReason } : {}), raw: event });\n }\n }\n\n return { model, content, ...(finishReason !== undefined ? { finishReason } : {}) };\n}\n\n/** Normalizes provider modality lists (\"text\", [\"text\",\"image\"], …). */\nfunction normalizeModalities(value: unknown): Modality[] | undefined {\n const list = Array.isArray(value) ? value : typeof value === \"string\" ? [value] : undefined;\n if (!list) return undefined;\n const allowed = new Set<Modality>([\"text\", \"image\", \"audio\", \"video\", \"embedding\"]);\n const modalities = list.filter((m): m is Modality => typeof m === \"string\" && allowed.has(m as Modality));\n return modalities.length > 0 ? modalities : undefined;\n}\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n return baseUrl.replace(/\\/+$/, \"\");\n}\n\nfunction extractModelEntries(body: unknown, config: ProviderConfig): OpenAIModelEntry[] {\n if (Array.isArray(body)) return body as OpenAIModelEntry[];\n if (body !== null && typeof body === \"object\" && Array.isArray((body as { data?: unknown }).data)) {\n return (body as { data: OpenAIModelEntry[] }).data;\n }\n throw new ProviderError(\n \"PROVIDER_UNAVAILABLE\",\n `Provider \"${config.name}\" returned an unrecognized model list shape.`,\n { details: { endpoint: \"models\" } },\n );\n}\n\nfunction unavailable(config: ProviderConfig, message: string, status: number): ProviderError {\n return new ProviderError(\"PROVIDER_UNAVAILABLE\", `Provider \"${config.name}\": ${message}`, {\n details: { status },\n });\n}\n\nfunction inferHealth(error: unknown): \"degraded\" | \"unreachable\" {\n const status =\n error instanceof ProviderError && typeof error.details?.status === \"number\"\n ? error.details.status\n : undefined;\n return status !== undefined && status >= 500 ? \"degraded\" : \"unreachable\";\n}\n","/**\n * OmniHilbras provider adapter (§6, Phase 2).\n *\n * OmniHilbras is one provider source among many — always optional (§2: the\n * core runs with zero Hilbras dependencies). The gateway exposes an\n * OpenAI-compatible API surface, so this adapter rides the OpenAI-compatible\n * transport and implements the plan's connect flow on top of it:\n *\n * Connect → Authenticate → Fetch Models → Validate Models → Register\n */\nimport { resolveApiKey } from \"../auth.js\";\nimport { OpenAICompatibleProvider } from \"../openai-compatible/index.js\";\nimport type { ModelRegistry } from \"../../registry/index.js\";\nimport type { ModelInfo } from \"../../types/model.js\";\nimport type { ProviderStatus } from \"../../types/provider.js\";\n\nexport interface OmniHilbrasConnectionResult {\n status: ProviderStatus;\n /** Validated, deduplicated models — registered when a registry was given. */\n models: ModelInfo[];\n /** Model ids that appeared more than once in the gateway's list. */\n duplicates: string[];\n /** Number of models written into the registry (0 when no registry given). */\n registered: number;\n}\n\nexport class OmniHilbrasProvider extends OpenAICompatibleProvider {\n private gateway?: Record<string, unknown>;\n\n override async listModels(): Promise<ModelInfo[]> {\n // Capture gateway-level metadata from the discovery response, then\n // delegate to the shared OpenAI-compatible discovery.\n const raw = await this.rawModelsResponse();\n await this.extractGatewayMetadata(raw);\n const models = await super.listModels();\n return this.gateway\n ? models.map((model) => ({ ...model, metadata: { ...model.metadata, gateway: this.gateway } }))\n : models;\n }\n /**\n * Run the full connect flow. Throws on authentication or transport failure\n * (use healthCheck() for a non-throwing probe).\n */\n /**\n * Gateway metadata reported alongside the model list (gateway version, tier,\n * region…), kept separate from per-model metadata (§11 — provider metadata).\n */\n gatewayMetadata(): Record<string, unknown> | undefined {\n return this.gateway;\n }\n\n protected async extractGatewayMetadata(body: unknown): Promise<void> {\n if (body !== null && typeof body === \"object\") {\n const gateway = (body as Record<string, unknown>).gateway;\n if (gateway !== null && typeof gateway === \"object\") {\n this.gateway = gateway as Record<string, unknown>;\n }\n }\n }\n\n async connectAndRegister(registry?: ModelRegistry): Promise<OmniHilbrasConnectionResult> {\n // Authenticate — throws PROVIDER_AUTH_FAILED when the referenced env var is unset.\n const apiKey = resolveApiKey(this.config);\n\n // Fetch models — throws on transport errors and non-2xx responses.\n const discovered = await this.listModels();\n\n // Validate — deduplicate ids, annotate gateway metadata, force availability.\n const seen = new Set<string>();\n const models: ModelInfo[] = [];\n const duplicates: string[] = [];\n for (const model of discovered) {\n if (seen.has(model.id)) {\n duplicates.push(model.id);\n continue;\n }\n seen.add(model.id);\n models.push({\n ...model,\n provider: this.config.name,\n status: \"available\",\n metadata: { ...model.metadata, gateway: \"omnihilbras\" },\n });\n }\n\n // Register.\n if (registry) {\n for (const model of models) registry.register(model);\n }\n\n const message =\n `Authenticated${apiKey ? \" with API key\" : \" (no API key configured)\"}; ` +\n `validated ${models.length} unique model(s)` +\n (duplicates.length > 0 ? `, skipped ${duplicates.length} duplicate(s)` : \"\") +\n \".\";\n\n const status: ProviderStatus = {\n name: this.config.name,\n type: this.config.type,\n baseUrl: this.config.baseUrl,\n health: \"healthy\",\n connected: true,\n modelCount: models.length,\n lastCheckedAt: new Date().toISOString(),\n message,\n };\n\n return { status, models, duplicates, registered: registry ? models.length : 0 };\n }\n}\n","/**\n * Provider factory: builds adapter instances from configuration (§5, §7).\n * Custom and local gateways ride the OpenAI-compatible adapter unless a\n * dedicated one exists.\n */\nimport { OmniNodeError } from \"../errors/index.js\";\nimport type { AuditSink } from \"../audit/index.js\";\nimport type { IChatProvider, ProviderConfig, ProviderType } from \"../types/provider.js\";\nimport { OmniHilbrasProvider } from \"./omnihilbras/index.js\";\nimport { OpenAICompatibleProvider } from \"./openai-compatible/index.js\";\n\n/** Provider types served by the OpenAI-compatible adapter. */\nexport const OPENAI_COMPATIBLE_TYPES: readonly ProviderType[] = [\n \"openai-compatible\",\n \"openrouter\",\n \"local\",\n \"custom\",\n];\n\nexport interface CreateProviderOptions {\n /** Correlates provider errors in the audit log (§18). */\n audit?: AuditSink;\n env?: Record<string, string | undefined>;\n}\n\nexport function createProvider(config: ProviderConfig, options: CreateProviderOptions = {}): IChatProvider {\n const shared = {\n ...(options.env !== undefined ? { env: options.env } : {}),\n ...(options.audit !== undefined ? { audit: options.audit } : {}),\n };\n if (config.type === \"omnihilbras\") {\n return new OmniHilbrasProvider(config, undefined, options.env, options.audit);\n }\n if (OPENAI_COMPATIBLE_TYPES.includes(config.type)) {\n return new OpenAICompatibleProvider(config, undefined, options.env, options.audit);\n }\n void shared;\n throw new OmniNodeError(\"NOT_IMPLEMENTED\", `Provider type \"${config.type}\" has no adapter yet.`);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/errors/index.ts","../../src/providers/auth.ts","../../src/providers/http.ts","../../src/logger/index.ts","../../src/providers/errors.ts","../../src/providers/openai-compatible/index.ts","../../src/providers/omnihilbras/index.ts","../../src/providers/factory.ts"],"sourcesContent":["/** Typed error hierarchy shared across the whole codebase (§4.1 — error model). */\n\nexport type OmniNodeErrorCode =\n | \"CONFIG_NOT_FOUND\"\n | \"CONFIG_INVALID\"\n | \"PROVIDER_NOT_FOUND\"\n | \"PROVIDER_UNAVAILABLE\"\n | \"PROVIDER_AUTH_FAILED\"\n | \"MODEL_NOT_FOUND\"\n | \"AGENT_NOT_FOUND\"\n | \"AGENT_FAILED\"\n | \"AGENT_TIMEOUT\"\n | \"TASK_INVALID\"\n | \"TASK_NOT_FOUND\"\n | \"TASK_FAILED\"\n | \"PIPELINE_NOT_FOUND\"\n | \"PIPELINE_INVALID\"\n | \"PIPELINE_FAILED\"\n | \"PLANNER_FAILED\"\n | \"PLAN_INVALID\"\n | \"TASK_NOT_FOUND\"\n | \"PROVIDER_NOT_FOUND\"\n | \"PROTOCOL_VIOLATION\"\n | \"MEMORY_UNAVAILABLE\"\n | \"REPORT_NOT_FOUND\"\n | \"NOT_IMPLEMENTED\"\n | \"CLI_USAGE\"\n | \"INTERNAL\";\n\nexport interface OmniNodeErrorOptions {\n cause?: unknown;\n details?: Record<string, unknown>;\n}\n\nexport class OmniNodeError extends Error {\n readonly code: OmniNodeErrorCode;\n readonly details?: Record<string, unknown>;\n\n constructor(code: OmniNodeErrorCode, message: string, options: OmniNodeErrorOptions = {}) {\n super(message, { cause: options.cause });\n this.name = new.target.name;\n this.code = code;\n this.details = options.details;\n }\n}\n\nexport class ConfigError extends OmniNodeError {\n constructor(\n code: \"CONFIG_NOT_FOUND\" | \"CONFIG_INVALID\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class ProviderError extends OmniNodeError {\n constructor(\n code:\n | \"PROVIDER_NOT_FOUND\"\n | \"PROVIDER_UNAVAILABLE\"\n | \"PROVIDER_AUTH_FAILED\"\n | \"MODEL_NOT_FOUND\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class AgentError extends OmniNodeError {\n constructor(\n code: \"AGENT_NOT_FOUND\" | \"AGENT_FAILED\" | \"AGENT_TIMEOUT\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class TaskError extends OmniNodeError {\n constructor(\n code: \"TASK_INVALID\" | \"TASK_NOT_FOUND\" | \"TASK_FAILED\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class PipelineError extends OmniNodeError {\n constructor(\n code: \"PIPELINE_NOT_FOUND\" | \"PIPELINE_INVALID\" | \"PIPELINE_FAILED\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class ProtocolError extends OmniNodeError {\n constructor(message: string, options: OmniNodeErrorOptions = {}) {\n super(\"PROTOCOL_VIOLATION\", message, options);\n }\n}\n\nexport class PlannerError extends OmniNodeError {\n constructor(\n code: \"PLANNER_FAILED\" | \"PLAN_INVALID\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class MemoryError extends OmniNodeError {\n constructor(message: string, options: OmniNodeErrorOptions = {}) {\n super(\"MEMORY_UNAVAILABLE\", message, options);\n }\n}\n\nexport function isOmniNodeError(value: unknown): value is OmniNodeError {\n return value instanceof OmniNodeError;\n}\n","/**\n * Authentication resolution (§24): API keys live in the environment and are\n * referenced from configuration by variable name — never stored in files.\n */\nimport { ProviderError } from \"../errors/index.js\";\n// AuthRef is structurally satisfied by ProviderConfig.\n\n/** Minimal provider identity — any config object with a name and optional env var reference. */\nexport interface AuthRef {\n name: string;\n apiKeyEnvVar?: string;\n headers?: Record<string, string>;\n}\n\nexport function resolveApiKey(\n config: AuthRef,\n env: Record<string, string | undefined> = process.env,\n): string | undefined {\n if (!config.apiKeyEnvVar) return undefined;\n const value = env[config.apiKeyEnvVar];\n if (!value) {\n throw new ProviderError(\n \"PROVIDER_AUTH_FAILED\",\n `Environment variable \"${config.apiKeyEnvVar}\" (referenced by provider \"${config.name}\") is not set.`,\n );\n }\n return value;\n}\n\nexport function authHeaders(\n config: AuthRef,\n env: Record<string, string | undefined> = process.env,\n): Record<string, string> {\n const key = resolveApiKey(config, env);\n const base = { ...(config.headers ?? {}) };\n return key ? { ...base, authorization: `Bearer ${key}` } : base;\n}\n","/**\n * Thin JSON HTTP layer over global fetch. HTTP error statuses are returned to\n * the caller, not thrown — provider methods interpret them; only transport\n * failures (network, timeout, unparseable body) throw.\n */\n/** Raised for malformed provider responses so adapters can classify them. */\nexport class HttpResponseError extends Error {\n constructor(message: string, readonly status: number, cause?: unknown) {\n super(message, { cause });\n this.name = \"HttpResponseError\";\n }\n}\n\nexport interface HttpRequestOptions {\n method?: \"GET\" | \"POST\";\n headers?: Record<string, string>;\n body?: unknown;\n timeoutMs?: number;\n}\n\nexport interface HttpResponse {\n status: number;\n body: unknown;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport async function requestJson(\n url: string,\n options: HttpRequestOptions = {},\n): Promise<HttpResponse> {\n const { method = \"GET\", headers = {}, body, timeoutMs = DEFAULT_TIMEOUT_MS } = options;\n\n // Transport failures propagate raw: adapters normalize them into provider\n // error kinds (roadmap §10).\n const response: Response = await fetch(url, {\n method,\n headers: {\n accept: \"application/json\",\n ...(body !== undefined ? { \"content-type\": \"application/json\" } : {}),\n ...headers,\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n let parsed: unknown;\n try {\n parsed = await response.json();\n } catch (error) {\n throw new HttpResponseError(`Response from ${url} was not valid JSON.`, response.status, error);\n }\n\n return { status: response.status, body: parsed };\n}\n","/** Leveled logger with a pluggable sink and child loggers (§4.1 — logging). */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface LogSink {\n write(level: LogLevel, line: string): void;\n}\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n};\n\nexport interface WritableLike {\n write(chunk: string): unknown;\n}\n\nexport class ConsoleLogSink implements LogSink {\n constructor(private readonly stream: WritableLike = process.stderr) {}\n\n write(_level: LogLevel, line: string): void {\n this.stream.write(line + \"\\n\");\n }\n}\n\nexport type LogFormat = \"text\" | \"json\";\n\nexport interface LoggerOptions {\n level?: LogLevel;\n sink?: LogSink;\n /** \"text\" (default) or machine-readable \"json\" lines (roadmap §18). */\n format?: LogFormat;\n /** Structured fields attached to every line, e.g. { component: \"config\" }. */\n context?: Record<string, unknown>;\n}\n\nexport class Logger {\n level: LogLevel;\n format: LogFormat;\n private readonly sink: LogSink;\n private readonly context: Record<string, unknown>;\n\n constructor(options: LoggerOptions = {}) {\n this.level = options.level ?? \"info\";\n this.format = options.format ?? \"text\";\n this.sink = options.sink ?? new ConsoleLogSink();\n this.context = options.context ?? {};\n }\n\n child(context: Record<string, unknown>): Logger {\n return new Logger({\n level: this.level,\n format: this.format,\n sink: this.sink,\n context: { ...this.context, ...context },\n });\n }\n\n debug(message: string, data?: Record<string, unknown>): void {\n this.log(\"debug\", message, data);\n }\n\n info(message: string, data?: Record<string, unknown>): void {\n this.log(\"info\", message, data);\n }\n\n warn(message: string, data?: Record<string, unknown>): void {\n this.log(\"warn\", message, data);\n }\n\n error(message: string, data?: Record<string, unknown>): void {\n this.log(\"error\", message, data);\n }\n\n private log(level: LogLevel, message: string, data?: Record<string, unknown>): void {\n if (LEVEL_ORDER[level] < LEVEL_ORDER[this.level]) return;\n const at = new Date().toISOString();\n const merged = { ...this.context, ...data };\n if (this.format === \"json\") {\n this.sink.write(level, JSON.stringify({ at, level, message, ...merged }));\n return;\n }\n const parts = [at, level.toUpperCase(), message];\n if (Object.keys(merged).length > 0) {\n parts.push(JSON.stringify(merged));\n }\n this.sink.write(level, parts.join(\" \"));\n }\n}\n\n/** Default application logger. Writes to stderr so stdout stays clean for CLI output. */\nexport const logger = new Logger();\n\n/** Applies configuration (level/format) to the default logger — used by the CLI. */\nexport function configureLogger(options: { level?: LogLevel; format?: LogFormat }): void {\n if (options.level !== undefined) logger.level = options.level;\n if (options.format !== undefined) logger.format = options.format;\n}\n","/**\n * Provider error normalization (roadmap §10).\n *\n * Every provider failure is mapped to one stable kind, so callers can react\n * (retry a rate limit, surface an auth problem, treat a missing model\n * differently) without string-matching provider-specific payloads.\n */\nimport { ProviderError } from \"../errors/index.js\";\n\nexport type ProviderErrorKind =\n | \"AUTHENTICATION_ERROR\"\n | \"RATE_LIMIT_ERROR\"\n | \"INVALID_REQUEST\"\n | \"MODEL_NOT_FOUND\"\n | \"TIMEOUT\"\n | \"NETWORK_ERROR\"\n | \"SERVER_ERROR\"\n | \"UNKNOWN_ERROR\";\n\nexport interface ProviderErrorContext {\n provider: string;\n operation: string;\n status?: number;\n body?: unknown;\n retryAfterMs?: number;\n cause?: unknown;\n /** Maps the normalized kind onto the legacy stable error code. */\n code?:\n | \"PROVIDER_UNAVAILABLE\"\n | \"PROVIDER_AUTH_FAILED\"\n | \"MODEL_NOT_FOUND\";\n}\n\nfunction kindToCode(kind: ProviderErrorKind): NonNullable<ProviderErrorContext[\"code\"]> {\n switch (kind) {\n case \"AUTHENTICATION_ERROR\":\n return \"PROVIDER_AUTH_FAILED\";\n case \"MODEL_NOT_FOUND\":\n return \"MODEL_NOT_FOUND\";\n default:\n return \"PROVIDER_UNAVAILABLE\";\n }\n}\n\n/** Kinds worth retrying automatically (rate limits and transient server errors). */\nexport function isRetryable(kind: ProviderErrorKind): boolean {\n return kind === \"RATE_LIMIT_ERROR\" || kind === \"SERVER_ERROR\" || kind === \"NETWORK_ERROR\";\n}\n\n/** Maps an HTTP status (and optional body) to a normalized kind. */\nexport function kindFromStatus(status: number): ProviderErrorKind {\n if (status === 401 || status === 403) return \"AUTHENTICATION_ERROR\";\n if (status === 429) return \"RATE_LIMIT_ERROR\";\n if (status === 404) return \"MODEL_NOT_FOUND\";\n if (status === 408 || status === 504) return \"TIMEOUT\";\n if (status >= 500) return \"SERVER_ERROR\";\n if (status >= 400) return \"INVALID_REQUEST\";\n return \"UNKNOWN_ERROR\";\n}\n\n/** Extracts a human message from common provider error body shapes. */\nexport function extractMessage(body: unknown): string | undefined {\n if (body === null || typeof body !== \"object\") return undefined;\n const root = body as Record<string, unknown>;\n const error = (root.error ?? root) as Record<string, unknown>;\n const message = error.message ?? error.detail ?? root.message;\n return typeof message === \"string\" ? message : undefined;\n}\n\n/** Parses `Retry-After` (seconds or HTTP-date) into milliseconds. */\nexport function parseRetryAfter(value: string | null | undefined, now = Date.now()): number | undefined {\n if (!value) return undefined;\n const seconds = Number(value);\n if (Number.isFinite(seconds)) return Math.max(0, seconds * 1000);\n const date = Date.parse(value);\n return Number.isNaN(date) ? undefined : Math.max(0, date - now);\n}\n\n/** True for the abort/timeout errors raised by fetch's AbortSignal.timeout. */\nexport function isTimeoutError(error: unknown): boolean {\n return (\n (error instanceof Error && (error.name === \"TimeoutError\" || error.name === \"AbortError\")) ||\n (typeof (error as { code?: string })?.code === \"string\" &&\n (error as { code?: string }).code === \"ABORT_ERR\")\n );\n}\n\n/** True for transport failures (DNS, refused, TLS, offline). */\nexport function isNetworkError(error: unknown): boolean {\n return error instanceof TypeError || (typeof (error as { cause?: unknown })?.cause === \"object\" && error instanceof Error && !(error as { code?: string }).code);\n}\n\n/**\n * Builds a normalized ProviderError from an HTTP failure.\n */\n/** Actionable fallback text per kind (used when the provider sent no message). */\nfunction fallbackMessage(kind: ProviderErrorKind, context: ProviderErrorContext, status: number): string {\n const { provider, operation } = context;\n switch (kind) {\n case \"AUTHENTICATION_ERROR\":\n return `Authentication with provider \"${provider}\" failed (HTTP ${status}). Check that the referenced API key is set and valid.`;\n case \"RATE_LIMIT_ERROR\":\n return `Provider \"${provider}\" rate-limited ${operation} (HTTP ${status}). Retry later.`;\n case \"MODEL_NOT_FOUND\":\n return `Provider \"${provider}\" does not expose the requested model (HTTP ${status}).`;\n case \"TIMEOUT\":\n return `Provider \"${provider}\" timed out during ${operation} (HTTP ${status}).`;\n case \"SERVER_ERROR\":\n return `Provider \"${provider}\" returned a server error during ${operation} (HTTP ${status}).`;\n case \"INVALID_REQUEST\":\n return `Provider \"${provider}\" rejected ${operation} as invalid (HTTP ${status}).`;\n default:\n return `Provider \"${provider}\" failed during ${operation} (HTTP ${status}).`;\n }\n}\n\nexport function providerHttpError(context: ProviderErrorContext): ProviderError {\n const status = context.status ?? 0;\n const kind = kindFromStatus(status);\n const detail = extractMessage(context.body);\n const retryAfterMs = context.retryAfterMs ?? parseRetryAfter(undefined);\n return new ProviderError(\n context.code ?? kindToCode(kind),\n detail ?? fallbackMessage(kind, context, status),\n {\n cause: context.cause,\n details: {\n kind,\n provider: context.provider,\n operation: context.operation,\n status,\n retryable: isRetryable(kind),\n ...(retryAfterMs !== undefined ? { retryAfterMs } : {}),\n ...(detail ? { providerMessage: detail } : {}),\n },\n },\n );\n}\n\n/** Wraps a thrown transport/abort error into a normalized ProviderError. */\nexport function providerTransportError(context: Omit<ProviderErrorContext, \"status\" | \"body\">): ProviderError {\n const cause = context.cause;\n const kind: ProviderErrorKind = isTimeoutError(cause)\n ? \"TIMEOUT\"\n : cause instanceof SyntaxError || (cause as { name?: string })?.name === \"HttpResponseError\"\n ? \"UNKNOWN_ERROR\"\n : \"NETWORK_ERROR\";\n const message = context.cause instanceof Error ? context.cause.message : String(context.cause);\n return new ProviderError(\"PROVIDER_UNAVAILABLE\", `Provider request failed: ${message}`, {\n cause: context.cause,\n details: {\n kind,\n provider: context.provider,\n operation: context.operation,\n retryable: isRetryable(kind),\n },\n });\n}","/**\n * OpenAI-compatible provider adapter (§5, §7): works with OpenAI, OpenRouter,\n * local runtimes (Ollama/LM Studio/vLLM) and custom gateways that expose the\n * /models and /chat/completions endpoints.\n */\nimport { ProviderError } from \"../../errors/index.js\";\nimport { logger, type Logger } from \"../../logger/index.js\";\n\n/** Default provider request timeout when the config does not set one. */\nconst DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\nimport type { ChatRequest, ChatResponse, ChatStreamChunk } from \"../../types/chat.js\";\nimport type { AuditSink } from \"../../audit/index.js\";\nimport type { Modality, ModelInfo } from \"../../types/model.js\";\nimport type { IChatProvider, ProviderConfig, ProviderStatus } from \"../../types/provider.js\";\nimport { authHeaders } from \"../auth.js\";\nimport { requestJson } from \"../http.js\";\nimport { providerHttpError, providerTransportError } from \"../errors.js\";\nimport type { ProviderAuthentication } from \"../../types/provider.js\";\n\ninterface OpenAIModelEntry {\n id?: unknown;\n name?: unknown;\n owned_by?: unknown;\n created?: unknown;\n context_length?: unknown;\n context_window?: unknown;\n input_modalities?: unknown;\n output_modalities?: unknown;\n supported_parameters?: unknown;\n}\n\ninterface OpenAIChatResponse {\n model?: unknown;\n choices?: unknown;\n usage?: unknown;\n}\n\nexport class OpenAICompatibleProvider implements IChatProvider {\n readonly config: ProviderConfig;\n readonly providerId: string;\n readonly authentication: ProviderAuthentication;\n private readonly log: Logger;\n /** Discovered models, so getModel() answers without another round-trip. */\n private discovered?: ModelInfo[];\n\n private readonly env: Record<string, string | undefined>;\n\n private readonly audit?: AuditSink;\n\n constructor(\n config: ProviderConfig,\n log: Logger = logger,\n env: Record<string, string | undefined> = process.env,\n audit?: AuditSink,\n ) {\n this.audit = audit;\n this.config = { ...config, baseUrl: normalizeBaseUrl(config.baseUrl) };\n this.env = env;\n this.providerId = config.providerId ?? config.name;\n this.authentication = {\n method: config.apiKeyEnvVar ? \"bearer\" : \"none\",\n ...(config.apiKeyEnvVar ? { envVar: config.apiKeyEnvVar } : {}),\n configured: config.apiKeyEnvVar ? Boolean(env[config.apiKeyEnvVar]) : true,\n };\n this.log = log.child({ provider: config.name });\n }\n\n /** Provider-level request timeout (roadmap §6.6/§11) with the shared default. */\n private get requestTimeoutMs(): number {\n return this.config.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n }\n\n /** Authenticate + discover (roadmap §10, Model Discovery). */\n async connect(): Promise<ModelInfo[]> {\n authHeaders(this.config, this.env); // throws PROVIDER_AUTH_FAILED when the env var is unset\n const models = await this.listModels();\n this.discovered = models;\n return models;\n }\n\n async getModel(modelId: string): Promise<ModelInfo | undefined> {\n const models = this.discovered ?? (await this.connect());\n return models.find((m) => m.id === modelId);\n }\n\n /** Raw /models body (protected so adapters can capture gateway-level metadata). */\n protected async rawModelsResponse(): Promise<unknown> {\n const response = await this.modelsRequest();\n return response.body;\n }\n\n private async modelsRequest(): Promise<{ status: number; body: unknown }> {\n let response: { status: number; body: unknown };\n try {\n response = await requestJson(`${this.config.baseUrl}/models`, {\n headers: authHeaders(this.config, this.env),\n timeoutMs: this.requestTimeoutMs,\n });\n } catch (error) {\n if (error instanceof ProviderError) {\n await this.recordProviderError(\"listModels\", error);\n throw error; // auth problem — keep the precise error\n }\n const normalized = providerTransportError({\n provider: this.config.name,\n operation: \"listModels\",\n cause: error,\n });\n await this.recordProviderError(\"listModels\", normalized);\n throw normalized;\n }\n const { status, body } = response;\n if (status !== 200) {\n const httpError = providerHttpError({\n provider: this.config.name,\n operation: \"listModels\",\n status,\n body,\n });\n await this.recordProviderError(\"listModels\", httpError);\n throw httpError;\n }\n return response;\n }\n\n async listModels(): Promise<ModelInfo[]> {\n const body = await this.rawModelsResponse();\n\n const entries = extractModelEntries(body, this.config);\n const models: ModelInfo[] = [];\n let skipped = 0;\n for (const entry of entries) {\n if (typeof entry.id !== \"string\" || entry.id.length === 0) {\n skipped += 1;\n continue;\n }\n models.push(this.toModelInfo(entry as OpenAIModelEntry & { id: string }));\n }\n if (skipped > 0) {\n this.log.warn(`Skipped ${skipped} model entr(y/ies) without a valid id.`);\n }\n return models;\n }\n\n /** Maps a raw model entry onto the normalized metadata shape (§10). */\n private toModelInfo(entry: OpenAIModelEntry & { id: string }): ModelInfo {\n const parameters = Array.isArray(entry.supported_parameters)\n ? (entry.supported_parameters.filter((p): p is string => typeof p === \"string\") as string[])\n : undefined;\n const contextWindow =\n typeof entry.context_length === \"number\"\n ? entry.context_length\n : typeof entry.context_window === \"number\"\n ? entry.context_window\n : undefined;\n const inputTypes = normalizeModalities(entry.input_modalities);\n const outputTypes = normalizeModalities(entry.output_modalities);\n return {\n provider: this.config.name,\n id: entry.id,\n displayName: entry.id,\n ...(typeof entry.name === \"string\" ? { name: entry.name } : {}),\n status: \"available\",\n ...(contextWindow !== undefined ? { contextWindow } : {}),\n ...(inputTypes !== undefined ? { inputTypes } : {}),\n ...(outputTypes !== undefined ? { outputTypes } : {}),\n ...(parameters !== undefined\n ? {\n supportsTools: parameters.includes(\"tools\") || parameters.includes(\"tool_choice\"),\n supportsStructuredOutput: parameters.includes(\"response_format\"),\n supportsStreaming: parameters.includes(\"stream\"),\n }\n : {}),\n metadata: {\n ...(typeof entry.owned_by === \"string\" ? { ownedBy: entry.owned_by } : {}),\n ...(typeof entry.created === \"number\" ? { createdAt: entry.created } : {}),\n ...(parameters !== undefined ? { supportedParameters: parameters } : {}),\n },\n };\n }\n\n /** Streaming where the gateway supports it (§11). */\n stream(request: ChatRequest, onChunk: (chunk: ChatStreamChunk) => void): Promise<ChatResponse> {\n return streamChatCompletion(this.config, request, onChunk, this.env);\n }\n\n /** Provider errors are part of the audit trail (§14 correlation, §18 observability). */\n private async recordProviderError(operation: string, error: ProviderError): Promise<void> {\n await this.audit?.record({\n at: new Date().toISOString(),\n action: \"provider.error\",\n id: this.providerId,\n providerId: this.providerId,\n detail: {\n operation,\n code: error.code,\n kind: (error.details as { kind?: string } | undefined)?.kind,\n message: error.message,\n },\n });\n }\n\n async healthCheck(): Promise<ProviderStatus> {\n const lastCheckedAt = new Date().toISOString();\n try {\n const started = Date.now();\n const models = await this.listModels();\n return {\n name: this.config.name,\n type: this.config.type,\n baseUrl: this.config.baseUrl,\n health: \"healthy\",\n connected: true,\n modelCount: models.length,\n lastCheckedAt,\n message: `Discovered ${models.length} model(s) in ${Date.now() - started}ms.`,\n };\n } catch (error) {\n return {\n name: this.config.name,\n type: this.config.type,\n baseUrl: this.config.baseUrl,\n health: inferHealth(error),\n connected: false,\n modelCount: 0,\n lastCheckedAt,\n message: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async chat(request: ChatRequest): Promise<ChatResponse> {\n let response: { status: number; body: unknown };\n try {\n response = await requestJson(`${this.config.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: authHeaders(this.config, this.env),\n timeoutMs: this.requestTimeoutMs,\n body: {\n model: request.model,\n messages: request.messages,\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n ...(request.maxTokens !== undefined ? { max_tokens: request.maxTokens } : {}),\n ...(request.stop !== undefined ? { stop: request.stop } : {}),\n },\n });\n } catch (error) {\n if (error instanceof ProviderError) {\n await this.recordProviderError(\"chat\", error);\n throw error;\n }\n const normalized = providerTransportError({ provider: this.config.name, operation: \"chat\", cause: error });\n await this.recordProviderError(\"chat\", normalized);\n throw normalized;\n }\n const { status, body } = response;\n\n if (status !== 200) {\n const httpError = providerHttpError({\n provider: this.config.name,\n operation: \"chat\",\n status,\n body,\n ...(status === 404\n ? {\n code: \"MODEL_NOT_FOUND\" as const,\n }\n : {}),\n });\n await this.recordProviderError(\"chat\", httpError);\n throw httpError;\n }\n\n const payload = body as OpenAIChatResponse;\n const choices = Array.isArray(payload.choices) ? payload.choices : [];\n const first = choices[0] as { message?: { content?: unknown }; finish_reason?: unknown } | undefined;\n if (!first || typeof first.message?.content !== \"string\") {\n throw unavailable(this.config, \"Chat completion response had no message content.\", status);\n }\n\n const usage = (payload.usage ?? {}) as {\n prompt_tokens?: unknown;\n completion_tokens?: unknown;\n total_tokens?: unknown;\n };\n\n return {\n model: typeof payload.model === \"string\" ? payload.model : request.model,\n content: first.message.content,\n finishReason: typeof first.finish_reason === \"string\" ? first.finish_reason : undefined,\n usage: {\n promptTokens: typeof usage.prompt_tokens === \"number\" ? usage.prompt_tokens : undefined,\n completionTokens:\n typeof usage.completion_tokens === \"number\" ? usage.completion_tokens : undefined,\n totalTokens: typeof usage.total_tokens === \"number\" ? usage.total_tokens : undefined,\n },\n raw: body,\n };\n }\n}\n\n/**\n * Streams a chat completion from an OpenAI-compatible SSE endpoint (§11).\n * Emits deltas through `onChunk` and returns the assembled response.\n */\nexport async function streamChatCompletion(\n config: ProviderConfig,\n request: ChatRequest,\n onChunk: (chunk: ChatStreamChunk) => void,\n env: Record<string, string | undefined> = process.env,\n): Promise<ChatResponse> {\n const baseUrl = normalizeBaseUrl(config.baseUrl);\n const timeoutMs = config.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n let response: Response;\n try {\n response = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n accept: \"text/event-stream\",\n \"content-type\": \"application/json\",\n ...authHeaders(config, env),\n },\n body: JSON.stringify({\n model: request.model,\n messages: request.messages,\n stream: true,\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n ...(request.maxTokens !== undefined ? { max_tokens: request.maxTokens } : {}),\n }),\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (error) {\n throw providerTransportError({ provider: config.name, operation: \"stream\", cause: error });\n }\n if (!response.ok) {\n const body: unknown = await response.json().catch(() => undefined);\n throw providerHttpError({ provider: config.name, operation: \"stream\", status: response.status, body });\n }\n if (!response.body) {\n throw providerHttpError({\n provider: config.name,\n operation: \"stream\",\n status: 500,\n body: { error: { message: \"streaming is not supported by this endpoint\" } },\n });\n }\n\n let content = \"\";\n let model = request.model;\n let finishReason: string | undefined;\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n for await (const piece of response.body as unknown as AsyncIterable<Uint8Array>) {\n buffer += decoder.decode(piece, { stream: true });\n let newline = buffer.indexOf(\"\\n\");\n while (newline >= 0) {\n const line = buffer.slice(0, newline).trim();\n buffer = buffer.slice(newline + 1);\n newline = buffer.indexOf(\"\\n\");\n if (line.length === 0 || line.startsWith(\":\")) continue;\n const data = line.startsWith(\"data:\") ? line.slice(5).trim() : line;\n if (data === \"[DONE]\") continue;\n let event: Record<string, unknown>;\n try {\n event = JSON.parse(data) as Record<string, unknown>;\n } catch {\n continue; // tolerate non-JSON SSE noise\n }\n if (typeof event.model === \"string\") model = event.model;\n const choices = Array.isArray(event.choices) ? event.choices : [];\n const first = choices[0] as { delta?: { content?: unknown }; finish_reason?: unknown } | undefined;\n const delta = typeof first?.delta?.content === \"string\" ? first.delta.content : \"\";\n if (delta.length > 0) content += delta;\n if (typeof first?.finish_reason === \"string\") finishReason = first.finish_reason;\n onChunk({ delta, ...(finishReason !== undefined ? { finishReason } : {}), raw: event });\n }\n }\n\n return { model, content, ...(finishReason !== undefined ? { finishReason } : {}) };\n}\n\n/** Normalizes provider modality lists (\"text\", [\"text\",\"image\"], …). */\nfunction normalizeModalities(value: unknown): Modality[] | undefined {\n const list = Array.isArray(value) ? value : typeof value === \"string\" ? [value] : undefined;\n if (!list) return undefined;\n const allowed = new Set<Modality>([\"text\", \"image\", \"audio\", \"video\", \"embedding\"]);\n const modalities = list.filter((m): m is Modality => typeof m === \"string\" && allowed.has(m as Modality));\n return modalities.length > 0 ? modalities : undefined;\n}\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n return baseUrl.replace(/\\/+$/, \"\");\n}\n\nfunction extractModelEntries(body: unknown, config: ProviderConfig): OpenAIModelEntry[] {\n if (Array.isArray(body)) return body as OpenAIModelEntry[];\n if (body !== null && typeof body === \"object\" && Array.isArray((body as { data?: unknown }).data)) {\n return (body as { data: OpenAIModelEntry[] }).data;\n }\n throw new ProviderError(\n \"PROVIDER_UNAVAILABLE\",\n `Provider \"${config.name}\" returned an unrecognized model list shape.`,\n { details: { endpoint: \"models\" } },\n );\n}\n\nfunction unavailable(config: ProviderConfig, message: string, status: number): ProviderError {\n return new ProviderError(\"PROVIDER_UNAVAILABLE\", `Provider \"${config.name}\": ${message}`, {\n details: { status },\n });\n}\n\nfunction inferHealth(error: unknown): \"degraded\" | \"unreachable\" {\n const status =\n error instanceof ProviderError && typeof error.details?.status === \"number\"\n ? error.details.status\n : undefined;\n return status !== undefined && status >= 500 ? \"degraded\" : \"unreachable\";\n}\n","/**\n * OmniHilbras provider adapter (§6, Phase 2).\n *\n * OmniHilbras is one provider source among many — always optional (§2: the\n * core runs with zero Hilbras dependencies). The gateway exposes an\n * OpenAI-compatible API surface, so this adapter rides the OpenAI-compatible\n * transport and implements the plan's connect flow on top of it:\n *\n * Connect → Authenticate → Fetch Models → Validate Models → Register\n */\nimport { resolveApiKey } from \"../auth.js\";\nimport { OpenAICompatibleProvider } from \"../openai-compatible/index.js\";\nimport type { ModelRegistry } from \"../../registry/index.js\";\nimport type { ModelInfo } from \"../../types/model.js\";\nimport type { ProviderStatus } from \"../../types/provider.js\";\n\nexport interface OmniHilbrasConnectionResult {\n status: ProviderStatus;\n /** Validated, deduplicated models — registered when a registry was given. */\n models: ModelInfo[];\n /** Model ids that appeared more than once in the gateway's list. */\n duplicates: string[];\n /** Number of models written into the registry (0 when no registry given). */\n registered: number;\n}\n\nexport class OmniHilbrasProvider extends OpenAICompatibleProvider {\n private gateway?: Record<string, unknown>;\n\n override async listModels(): Promise<ModelInfo[]> {\n // Capture gateway-level metadata from the discovery response, then\n // delegate to the shared OpenAI-compatible discovery.\n const raw = await this.rawModelsResponse();\n await this.extractGatewayMetadata(raw);\n const models = await super.listModels();\n return this.gateway\n ? models.map((model) => ({ ...model, metadata: { ...model.metadata, gateway: this.gateway } }))\n : models;\n }\n /**\n * Run the full connect flow. Throws on authentication or transport failure\n * (use healthCheck() for a non-throwing probe).\n */\n /**\n * Gateway metadata reported alongside the model list (gateway version, tier,\n * region…), kept separate from per-model metadata (§11 — provider metadata).\n */\n gatewayMetadata(): Record<string, unknown> | undefined {\n return this.gateway;\n }\n\n protected async extractGatewayMetadata(body: unknown): Promise<void> {\n if (body !== null && typeof body === \"object\") {\n const gateway = (body as Record<string, unknown>).gateway;\n if (gateway !== null && typeof gateway === \"object\") {\n this.gateway = gateway as Record<string, unknown>;\n }\n }\n }\n\n async connectAndRegister(registry?: ModelRegistry): Promise<OmniHilbrasConnectionResult> {\n // Authenticate — throws PROVIDER_AUTH_FAILED when the referenced env var is unset.\n const apiKey = resolveApiKey(this.config);\n\n // Fetch models — throws on transport errors and non-2xx responses.\n const discovered = await this.listModels();\n\n // Validate — deduplicate ids, annotate gateway metadata, force availability.\n const seen = new Set<string>();\n const models: ModelInfo[] = [];\n const duplicates: string[] = [];\n for (const model of discovered) {\n if (seen.has(model.id)) {\n duplicates.push(model.id);\n continue;\n }\n seen.add(model.id);\n models.push({\n ...model,\n provider: this.config.name,\n status: \"available\",\n metadata: { ...model.metadata, gateway: \"omnihilbras\" },\n });\n }\n\n // Register.\n if (registry) {\n for (const model of models) registry.register(model);\n }\n\n const message =\n `Authenticated${apiKey ? \" with API key\" : \" (no API key configured)\"}; ` +\n `validated ${models.length} unique model(s)` +\n (duplicates.length > 0 ? `, skipped ${duplicates.length} duplicate(s)` : \"\") +\n \".\";\n\n const status: ProviderStatus = {\n name: this.config.name,\n type: this.config.type,\n baseUrl: this.config.baseUrl,\n health: \"healthy\",\n connected: true,\n modelCount: models.length,\n lastCheckedAt: new Date().toISOString(),\n message,\n };\n\n return { status, models, duplicates, registered: registry ? models.length : 0 };\n }\n}\n","/**\n * Provider factory: builds adapter instances from configuration (§5, §7).\n * Custom and local gateways ride the OpenAI-compatible adapter unless a\n * dedicated one exists.\n */\nimport { ConfigError, OmniNodeError } from \"../errors/index.js\";\nimport type { AuditSink } from \"../audit/index.js\";\nimport type { IChatProvider, ProviderConfig, ProviderType } from \"../types/provider.js\";\nimport { OmniHilbrasProvider } from \"./omnihilbras/index.js\";\nimport { OpenAICompatibleProvider } from \"./openai-compatible/index.js\";\n\n/** Provider types served by the OpenAI-compatible adapter. */\nexport const OPENAI_COMPATIBLE_TYPES: readonly ProviderType[] = [\n \"openai-compatible\",\n \"openrouter\",\n \"local\",\n \"custom\",\n];\n\nexport interface CreateProviderOptions {\n /** Correlates provider errors in the audit log (§18). */\n audit?: AuditSink;\n env?: Record<string, string | undefined>;\n}\n\nfunction assertProviderConfig(config: ProviderConfig): void {\n // Library consumers bypass the config schema — validate here (§23).\n if (!config.name || config.name.trim().length === 0) {\n throw new ConfigError(\"CONFIG_INVALID\", \"Provider name must not be empty.\");\n }\n if (!config.baseUrl || config.baseUrl.trim().length === 0) {\n throw new ConfigError(\"CONFIG_INVALID\", `Provider \"${config.name}\" needs a baseUrl.`);\n }\n try {\n new URL(config.baseUrl);\n } catch {\n throw new ConfigError(\"CONFIG_INVALID\", `Provider \"${config.name}\" has an invalid baseUrl: ${config.baseUrl}`);\n }\n}\n\nexport function createProvider(config: ProviderConfig, options: CreateProviderOptions = {}): IChatProvider {\n assertProviderConfig(config);\n const shared = {\n ...(options.env !== undefined ? { env: options.env } : {}),\n ...(options.audit !== undefined ? { audit: options.audit } : {}),\n };\n if (config.type === \"omnihilbras\") {\n return new OmniHilbrasProvider(config, undefined, options.env, options.audit);\n }\n if (OPENAI_COMPATIBLE_TYPES.includes(config.type)) {\n return new OpenAICompatibleProvider(config, undefined, options.env, options.audit);\n }\n void shared;\n throw new OmniNodeError(\"NOT_IMPLEMENTED\", `Provider type \"${config.type}\" has no adapter yet.`);\n}\n"],"mappings":"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","names":[]}
|
package/dist/cli/index.js
CHANGED
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
logger,
|
|
16
16
|
requestJson,
|
|
17
17
|
resolveApiKey
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-BTJDQTWH.js";
|
|
19
19
|
|
|
20
20
|
// src/cli/index.ts
|
|
21
21
|
import { pathToFileURL } from "url";
|
|
@@ -23,7 +23,7 @@ import { realpathSync } from "fs";
|
|
|
23
23
|
import { Command } from "commander";
|
|
24
24
|
|
|
25
25
|
// src/version.ts
|
|
26
|
-
var OMNINODE_VERSION = "2.0.0-alpha.
|
|
26
|
+
var OMNINODE_VERSION = "2.0.0-alpha.19";
|
|
27
27
|
|
|
28
28
|
// src/cli/exit-codes.ts
|
|
29
29
|
var EXIT = {
|
|
@@ -1473,7 +1473,16 @@ var AgentRegistry = class {
|
|
|
1473
1473
|
// src/agents/factory.ts
|
|
1474
1474
|
var defaultAgentAdapters = new AgentAdapterRegistry();
|
|
1475
1475
|
defaultAgentAdapters.register(new ProcessAgentAdapter((config) => new ProcessAgent(config)));
|
|
1476
|
+
function assertAgentConfig(config) {
|
|
1477
|
+
if (!config.name || config.name.trim().length === 0) {
|
|
1478
|
+
throw new ConfigError("CONFIG_INVALID", "Agent name must not be empty.");
|
|
1479
|
+
}
|
|
1480
|
+
if (config.integration === "process" && (!config.command || config.command.trim().length === 0)) {
|
|
1481
|
+
throw new ConfigError("CONFIG_INVALID", `Agent "${config.name}" needs a command for the process adapter.`);
|
|
1482
|
+
}
|
|
1483
|
+
}
|
|
1476
1484
|
function createAgent(config, adapters = defaultAgentAdapters) {
|
|
1485
|
+
assertAgentConfig(config);
|
|
1477
1486
|
const registered = adapters.get(config.integration);
|
|
1478
1487
|
if (registered) return registered.create(config);
|
|
1479
1488
|
if (config.integration === "native") {
|
|
@@ -2174,7 +2183,7 @@ function registerProviderInspect(providerGroup) {
|
|
|
2174
2183
|
const config = loadProjectConfig();
|
|
2175
2184
|
const providerConfig = config.project.providers.find((p) => p.name === name);
|
|
2176
2185
|
if (!providerConfig) throw new OmniNodeError("PROVIDER_NOT_FOUND", `No provider "${name}" is configured.`);
|
|
2177
|
-
const { createProvider: createProvider2 } = await import("./providers-
|
|
2186
|
+
const { createProvider: createProvider2 } = await import("./providers-KPW3FURD.js");
|
|
2178
2187
|
const provider = createProvider2(providerConfig);
|
|
2179
2188
|
const payload = {
|
|
2180
2189
|
config: providerConfig,
|