@nexus-ai-fs/api-client 0.9.18
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 +12 -0
- package/dist/index.cjs +769 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +352 -0
- package/dist/index.d.ts +352 -0
- package/dist/index.js +749 -0
- package/dist/index.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/case-transform.ts","../src/fetch-client.ts","../src/sse-client.ts","../src/config.ts"],"names":["sleep","DEFAULT_BASE_URL"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Base error hierarchy for all Nexus API interactions.\n *\n * HTTP-level errors live here; domain-specific errors (e.g. InsufficientCreditsError)\n * belong in consumer packages that extend NexusApiError.\n *\n * Hierarchy:\n * NexusApiError (base)\n * ├── AuthenticationError (401)\n * ├── ForbiddenError (403)\n * ├── NotFoundError (404)\n * ├── ConflictError (409)\n * ├── RateLimitError (429)\n * ├── ServerError (5xx)\n * ├── NetworkError (fetch failed)\n * ├── TimeoutError (request timed out)\n * └── AbortError (user-cancelled)\n */\n\nexport class NexusApiError extends Error {\n readonly status: number;\n readonly code: string;\n\n constructor(message: string, status: number, code: string) {\n super(message);\n this.name = \"NexusApiError\";\n this.status = status;\n this.code = code;\n }\n}\n\nexport class AuthenticationError extends NexusApiError {\n constructor(message: string) {\n super(message, 401, \"authentication_error\");\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class ForbiddenError extends NexusApiError {\n constructor(message: string) {\n super(message, 403, \"forbidden\");\n this.name = \"ForbiddenError\";\n }\n}\n\nexport class NotFoundError extends NexusApiError {\n constructor(message: string) {\n super(message, 404, \"not_found\");\n this.name = \"NotFoundError\";\n }\n}\n\nexport class ConflictError extends NexusApiError {\n constructor(message: string) {\n super(message, 409, \"conflict\");\n this.name = \"ConflictError\";\n }\n}\n\nexport class RateLimitError extends NexusApiError {\n readonly retryAfter: number | undefined;\n\n constructor(message: string, retryAfter?: number) {\n super(message, 429, \"rate_limit_error\");\n this.name = \"RateLimitError\";\n this.retryAfter = retryAfter;\n }\n}\n\nexport class ServerError extends NexusApiError {\n constructor(message: string, status: number) {\n super(message, status, \"server_error\");\n this.name = \"ServerError\";\n }\n}\n\nexport class NetworkError extends NexusApiError {\n constructor(message: string) {\n super(message, 0, \"network_error\");\n this.name = \"NetworkError\";\n }\n}\n\nexport class TimeoutError extends NexusApiError {\n constructor(message: string) {\n super(message, 0, \"timeout_error\");\n this.name = \"TimeoutError\";\n }\n}\n\nexport class AbortError extends NexusApiError {\n constructor(message: string) {\n super(message, 0, \"abort_error\");\n this.name = \"AbortError\";\n }\n}\n","/**\n * Pure utility functions for snake_case ↔ camelCase key transformation.\n *\n * Handles nested objects, arrays, null, and preserves non-plain values (Date, etc.).\n */\n\n/** Convert a single snake_case string to camelCase. */\nexport function snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\n/** Convert a single camelCase string to snake_case. */\nexport function camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Recursively transform all keys in an object/array using the given transformer.\n *\n * - Arrays: each element is recursively transformed\n * - null/undefined: returned as-is\n * - Primitives (string, number, boolean): returned as-is\n * - Date: returned as-is (not a plain object)\n * - Plain objects: keys are transformed, values are recursively transformed\n */\nexport function transformKeys<T>(\n value: unknown,\n transformer: (key: string) => string,\n): T {\n if (value === null || value === undefined) {\n return value as T;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => transformKeys(item, transformer)) as T;\n }\n\n if (typeof value !== \"object\") {\n return value as T;\n }\n\n // Skip non-plain objects (Date, RegExp, etc.)\n if (Object.getPrototypeOf(value) !== Object.prototype) {\n return value as T;\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n result[transformer(key)] = transformKeys(val, transformer);\n }\n return result as T;\n}\n\n/** Transform all keys from snake_case to camelCase. */\nexport function snakeToCamelKeys<T>(value: unknown): T {\n return transformKeys<T>(value, snakeToCamel);\n}\n\n/** Transform all keys from camelCase to snake_case. */\nexport function camelToSnakeKeys<T>(value: unknown): T {\n return transformKeys<T>(value, camelToSnake);\n}\n","/**\n * Core HTTP client with retry, timeout, auth, error mapping,\n * and automatic snake_case ↔ camelCase key transformation.\n *\n * Generalized from nexus-pay-ts's FetchClient. Consumer packages\n * can subclass and override `buildError()` for domain-specific error mapping.\n */\n\nimport {\n AbortError,\n AuthenticationError,\n ConflictError,\n ForbiddenError,\n NetworkError,\n NexusApiError,\n NotFoundError,\n RateLimitError,\n ServerError,\n TimeoutError,\n} from \"./errors.js\";\nimport type {\n ApiErrorResponse,\n AspectEnvelope,\n CatalogSchemaResponse,\n ColumnSearchResponse,\n NexusClientOptions,\n ReplayResponse,\n RequestOptions,\n} from \"./types.js\";\nimport { camelToSnakeKeys, snakeToCamelKeys } from \"./case-transform.js\";\n\nconst DEFAULT_BASE_URL = \"http://localhost:2026\";\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_MAX_RETRIES = 3;\nconst INITIAL_RETRY_DELAY = 500;\nconst MAX_RETRY_DELAY = 8_000;\nconst RETRYABLE_STATUS_CODES = new Set([429, 500, 502, 503, 504]);\n\nexport class FetchClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly fetchFn: typeof globalThis.fetch;\n private readonly transformEnabled: boolean;\n private readonly agentId: string | undefined;\n private readonly subject: string | undefined;\n private readonly zoneId: string | undefined;\n\n constructor(options: NexusClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.fetchFn = options.fetch ?? globalThis.fetch;\n this.transformEnabled = options.transformKeys ?? true;\n this.agentId = options.agentId;\n this.subject = options.subject;\n this.zoneId = options.zoneId;\n }\n\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>(\"GET\", path, undefined, options);\n }\n\n async post<T>(path: string, body: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>(\"POST\", path, body, options);\n }\n\n async put<T>(path: string, body: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>(\"PUT\", path, body, options);\n }\n\n async patch<T>(path: string, body: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>(\"PATCH\", path, body, options);\n }\n\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>(\"DELETE\", path, undefined, options);\n }\n\n async postNoContent(path: string, body?: unknown, options?: RequestOptions): Promise<void> {\n await this.requestRaw(\"POST\", path, body, options);\n }\n\n async deleteNoContent(path: string, options?: RequestOptions): Promise<void> {\n await this.requestRaw(\"DELETE\", path, undefined, options);\n }\n\n /**\n * Execute an arbitrary HTTP request through the authenticated client.\n *\n * Returns the raw `Response` — no JSON parsing, no key transformation,\n * no retries. Auth and identity headers are injected automatically.\n * Timeout is enforced (defaults to client timeout, overridable per-request).\n *\n * Body is sent as-is (no JSON.stringify) since callers provide pre-formatted strings.\n *\n * Intended for the API Console and similar exploratory tools that need\n * full control over the request/response while still using real auth.\n */\n async rawRequest(\n method: string,\n path: string,\n body?: string,\n options?: RequestOptions,\n ): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n const headers = this.buildHeaders(method, options);\n const effectiveTimeout = options?.timeout ?? this.timeout;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), effectiveTimeout);\n const userSignal = options?.signal;\n const onUserAbort = (): void => controller.abort();\n\n if (userSignal) {\n if (userSignal.aborted) {\n clearTimeout(timeoutId);\n throw new AbortError(\"Request aborted\");\n }\n userSignal.addEventListener(\"abort\", onUserAbort, { once: true });\n }\n\n try {\n return await this.fetchFn(url, {\n method,\n headers,\n body: body ?? undefined,\n signal: controller.signal,\n });\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n if (userSignal?.aborted) {\n throw new AbortError(\"Request aborted\");\n }\n throw new TimeoutError(\"Request timed out\");\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n if (userSignal) {\n userSignal.removeEventListener(\"abort\", onUserAbort);\n }\n }\n }\n\n // ===========================================================================\n // Core request logic\n // ===========================================================================\n\n private async request<T>(\n method: string,\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n const response = await this.requestRaw(method, path, body, options);\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n const json: unknown = await response.json();\n return this.transformEnabled ? snakeToCamelKeys<T>(json) : (json as T);\n }\n\n private async requestRaw(\n method: string,\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n const headers = this.buildHeaders(method, options);\n const effectiveTimeout = options?.timeout ?? this.timeout;\n\n // Transform request body keys to snake_case\n const transformedBody =\n body !== undefined && this.transformEnabled ? camelToSnakeKeys(body) : body;\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0 && lastError) {\n const delay = this.computeRetryDelay(attempt, lastError);\n await sleep(delay);\n }\n\n try {\n const response = await this.executeFetch(\n url,\n method,\n headers,\n transformedBody,\n effectiveTimeout,\n options?.signal,\n );\n\n if (response.ok || response.status === 204) {\n return response;\n }\n\n const error = await this.buildError(response);\n\n if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < this.maxRetries) {\n lastError = error;\n continue;\n }\n\n throw error;\n } catch (error) {\n if (error instanceof NexusApiError && !RETRYABLE_STATUS_CODES.has(error.status)) {\n throw error;\n }\n\n if (attempt < this.maxRetries) {\n lastError = error instanceof Error ? error : new Error(String(error));\n continue;\n }\n\n if (error instanceof NexusApiError) {\n throw error;\n }\n throw new NetworkError(\n error instanceof Error ? error.message : \"Request failed\",\n );\n }\n }\n\n throw lastError ?? new NetworkError(\"Request failed\");\n }\n\n // ===========================================================================\n // Helpers\n // ===========================================================================\n\n private async executeFetch(\n url: string,\n method: string,\n headers: Record<string, string>,\n body: unknown,\n timeout: number,\n userSignal?: AbortSignal,\n ): Promise<Response> {\n if (userSignal?.aborted) {\n throw new AbortError(\"Request aborted\");\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n const onUserAbort = (): void => controller.abort();\n\n if (userSignal) {\n userSignal.addEventListener(\"abort\", onUserAbort, { once: true });\n }\n\n try {\n return await this.fetchFn(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n if (userSignal?.aborted) {\n throw new AbortError(\"Request aborted\");\n }\n throw new TimeoutError(\"Request timed out\");\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n if (userSignal) {\n userSignal.removeEventListener(\"abort\", onUserAbort);\n }\n }\n }\n\n private buildHeaders(method: string, options?: RequestOptions): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n Accept: \"application/json\",\n };\n\n if (method === \"POST\" || method === \"PUT\" || method === \"PATCH\") {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n if (options?.idempotencyKey) {\n headers[\"Idempotency-Key\"] = options.idempotencyKey;\n }\n\n // Default identity headers from client config\n if (this.agentId) headers[\"X-Agent-ID\"] = this.agentId;\n if (this.subject) headers[\"X-Nexus-Subject\"] = this.subject;\n if (this.zoneId) headers[\"X-Nexus-Zone-ID\"] = this.zoneId;\n\n // Merge extra headers (per-request overrides take precedence)\n if (options?.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n headers[key] = value;\n }\n }\n\n return headers;\n }\n\n /**\n * Map HTTP response to a typed error.\n *\n * Subclasses can override this to add domain-specific error mapping\n * (e.g. 402 → InsufficientCreditsError in nexus-pay-ts).\n */\n protected async buildError(response: Response): Promise<NexusApiError> {\n let message: string;\n try {\n const body = (await response.json()) as ApiErrorResponse;\n message = body.detail ?? `HTTP ${response.status}`;\n } catch {\n message = `HTTP ${response.status}`;\n }\n\n switch (response.status) {\n case 401:\n return new AuthenticationError(message);\n case 403:\n return new ForbiddenError(message);\n case 404:\n return new NotFoundError(message);\n case 409:\n return new ConflictError(message);\n case 429: {\n const retryAfterHeader = response.headers.get(\"Retry-After\");\n const retryAfter = retryAfterHeader ? parseInt(retryAfterHeader, 10) : undefined;\n return new RateLimitError(\n message,\n Number.isNaN(retryAfter) ? undefined : retryAfter,\n );\n }\n default:\n if (response.status >= 500) {\n return new ServerError(message, response.status);\n }\n return new NexusApiError(message, response.status, \"api_error\");\n }\n }\n\n private computeRetryDelay(attempt: number, lastError: Error): number {\n if (lastError instanceof RateLimitError && lastError.retryAfter !== undefined) {\n return lastError.retryAfter * 1000;\n }\n\n const exponentialDelay = INITIAL_RETRY_DELAY * Math.pow(2, attempt - 1);\n const cappedDelay = Math.min(exponentialDelay, MAX_RETRY_DELAY);\n return Math.random() * cappedDelay;\n }\n\n // ===========================================================================\n // Knowledge platform helpers (Issue #2930)\n // ===========================================================================\n\n /**\n * List all aspect names attached to an entity.\n */\n async getAspects(urn: string): Promise<string[]> {\n const result = await this.get<{ aspects: string[] }>(\n `/api/v2/aspects/${encodeURIComponent(urn)}`,\n );\n return result.aspects ?? [];\n }\n\n /**\n * Get a specific aspect for an entity. Returns null if not found.\n */\n async getAspect(urn: string, name: string): Promise<AspectEnvelope | null> {\n try {\n return await this.get<AspectEnvelope>(\n `/api/v2/aspects/${encodeURIComponent(urn)}/${encodeURIComponent(name)}`,\n );\n } catch {\n return null;\n }\n }\n\n /**\n * Get extracted schema for a data file. Returns null if no schema.\n */\n async getCatalogSchema(\n path: string,\n ): Promise<CatalogSchemaResponse[\"schema\"]> {\n const encodedPath = encodeURIComponent(path.replace(/^\\//, \"\"));\n const result = await this.get<CatalogSchemaResponse>(\n `/api/v2/catalog/schema/${encodedPath}`,\n );\n return result.schema ?? null;\n }\n\n /**\n * Search for data files containing a specific column name.\n */\n async searchByColumn(\n column: string,\n ): Promise<ColumnSearchResponse[\"results\"]> {\n const result = await this.get<ColumnSearchResponse>(\n `/api/v2/catalog/search?column=${encodeURIComponent(column)}`,\n );\n return result.results ?? [];\n }\n\n /**\n * Replay metadata change log records.\n */\n async replayChanges(opts?: {\n fromSequence?: number;\n entityUrn?: string;\n limit?: number;\n }): Promise<ReplayResponse> {\n const params = new URLSearchParams();\n if (opts?.fromSequence !== undefined) params.set(\"from_sequence\", String(opts.fromSequence));\n if (opts?.entityUrn) params.set(\"entity_urn\", opts.entityUrn);\n if (opts?.limit !== undefined) params.set(\"limit\", String(opts.limit));\n const qs = params.toString();\n return this.get<ReplayResponse>(`/api/v2/ops/replay${qs ? `?${qs}` : \"\"}`);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * SSE connection manager with ring buffer, throttled flush,\n * and exponential backoff reconnection.\n */\n\nimport type { SseEvent } from \"./types.js\";\n\nconst DEFAULT_BUFFER_CAPACITY = 1000;\nconst DEFAULT_FLUSH_INTERVAL_MS = 100;\nconst INITIAL_RECONNECT_DELAY_MS = 500;\nconst MAX_RECONNECT_DELAY_MS = 30_000;\n\n/** Fixed-size circular buffer that drops oldest entries when full. */\nexport class RingBuffer<T> {\n private readonly buffer: (T | undefined)[];\n private head = 0;\n private count = 0;\n /** Monotonically increasing counter of total items ever pushed (never wraps). */\n private _totalPushed = 0;\n\n constructor(readonly capacity: number) {\n this.buffer = new Array<T | undefined>(capacity);\n }\n\n get size(): number {\n return this.count;\n }\n\n /** Total number of items pushed since creation/clear (never decreases). */\n get totalPushed(): number {\n return this._totalPushed;\n }\n\n push(item: T): void {\n this.buffer[this.head] = item;\n this.head = (this.head + 1) % this.capacity;\n if (this.count < this.capacity) {\n this.count++;\n }\n this._totalPushed++;\n }\n\n /** Return items in insertion order (oldest first). */\n toArray(): readonly T[] {\n if (this.count === 0) return [];\n\n const result: T[] = [];\n const start = this.count < this.capacity ? 0 : this.head;\n for (let i = 0; i < this.count; i++) {\n const index = (start + i) % this.capacity;\n result.push(this.buffer[index] as T);\n }\n return result;\n }\n\n /** Return the last N items (newest first becomes oldest first). */\n lastN(n: number): readonly T[] {\n if (n <= 0 || this.count === 0) return [];\n const take = Math.min(n, this.count);\n const all = this.toArray();\n return all.slice(all.length - take);\n }\n\n clear(): void {\n this.buffer.fill(undefined);\n this.head = 0;\n this.count = 0;\n this._totalPushed = 0;\n }\n}\n\nexport interface SseClientOptions {\n readonly baseUrl: string;\n readonly apiKey: string;\n readonly bufferCapacity?: number;\n readonly flushIntervalMs?: number;\n readonly fetch?: typeof globalThis.fetch;\n /** Agent identity sent as X-Agent-ID header. */\n readonly agentId?: string;\n /** Subject identity sent as X-Nexus-Subject header. */\n readonly subject?: string;\n /** Zone ID sent as X-Nexus-Zone-ID header. */\n readonly zoneId?: string;\n}\n\nexport type SseEventHandler = (events: readonly SseEvent[]) => void;\nexport type SseErrorHandler = (error: Error) => void;\nexport type SseReconnectHandler = (attempt: number) => void;\n\nexport class SseClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly fetchFn: typeof globalThis.fetch;\n private readonly buffer: RingBuffer<SseEvent>;\n private readonly flushIntervalMs: number;\n private readonly agentId: string | undefined;\n private readonly subject: string | undefined;\n private readonly zoneId: string | undefined;\n\n private abortController: AbortController | null = null;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private reconnectAttempt = 0;\n private lastEventId: string | undefined;\n private connected = false;\n\n private eventHandler: SseEventHandler | null = null;\n private errorHandler: SseErrorHandler | null = null;\n private reconnectHandler: SseReconnectHandler | null = null;\n\n constructor(options: SseClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = options.apiKey;\n this.fetchFn = options.fetch ?? globalThis.fetch;\n this.buffer = new RingBuffer(options.bufferCapacity ?? DEFAULT_BUFFER_CAPACITY);\n this.flushIntervalMs = options.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS;\n this.agentId = options.agentId;\n this.subject = options.subject;\n this.zoneId = options.zoneId;\n }\n\n onEvent(handler: SseEventHandler): void {\n this.eventHandler = handler;\n }\n\n onError(handler: SseErrorHandler): void {\n this.errorHandler = handler;\n }\n\n onReconnect(handler: SseReconnectHandler): void {\n this.reconnectHandler = handler;\n }\n\n get isConnected(): boolean {\n return this.connected;\n }\n\n async connect(path: string): Promise<void> {\n this.disconnect();\n\n this.abortController = new AbortController();\n this.startFlushTimer();\n\n await this.connectWithRetry(path);\n }\n\n disconnect(): void {\n this.abortController?.abort();\n this.abortController = null;\n this.stopFlushTimer();\n this.connected = false;\n this.reconnectAttempt = 0;\n this.lastFlushedTotal = 0;\n }\n\n getBufferedEvents(): readonly SseEvent[] {\n return this.buffer.toArray();\n }\n\n clearBuffer(): void {\n this.buffer.clear();\n this.lastFlushedTotal = 0;\n }\n\n // ===========================================================================\n // Internal\n // ===========================================================================\n\n private async connectWithRetry(path: string): Promise<void> {\n while (this.abortController && !this.abortController.signal.aborted) {\n try {\n await this.streamEvents(path);\n } catch (error) {\n if (this.abortController?.signal.aborted) return;\n\n this.connected = false;\n this.reconnectAttempt++;\n this.errorHandler?.(error instanceof Error ? error : new Error(String(error)));\n this.reconnectHandler?.(this.reconnectAttempt);\n\n const delay = this.computeReconnectDelay();\n await sleep(delay);\n }\n }\n }\n\n private async streamEvents(path: string): Promise<void> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n Accept: \"text/event-stream\",\n };\n\n if (this.agentId) headers[\"X-Agent-ID\"] = this.agentId;\n if (this.subject) headers[\"X-Nexus-Subject\"] = this.subject;\n if (this.zoneId) headers[\"X-Nexus-Zone-ID\"] = this.zoneId;\n\n if (this.lastEventId) {\n headers[\"Last-Event-ID\"] = this.lastEventId;\n }\n\n const response = await this.fetchFn(url, {\n headers,\n signal: this.abortController?.signal,\n });\n\n if (!response.ok) {\n throw new Error(`SSE connection failed: HTTP ${response.status}`);\n }\n\n if (!response.body) {\n throw new Error(\"SSE response has no body\");\n }\n\n this.connected = true;\n this.reconnectAttempt = 0;\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let partial = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n partial += decoder.decode(value, { stream: true });\n const events = this.parseEvents(partial);\n partial = events.remaining;\n\n for (const event of events.parsed) {\n this.buffer.push(event);\n if (event.id) {\n this.lastEventId = event.id;\n }\n }\n }\n } finally {\n reader.releaseLock();\n this.connected = false;\n }\n }\n\n private parseEvents(text: string): {\n parsed: SseEvent[];\n remaining: string;\n } {\n const parsed: SseEvent[] = [];\n const blocks = text.split(\"\\n\\n\");\n\n // Last block may be incomplete — keep it as remaining\n const remaining = blocks.pop() ?? \"\";\n\n for (const block of blocks) {\n if (!block.trim()) continue;\n\n let id: string | undefined;\n let event = \"message\";\n let data = \"\";\n let retry: number | undefined;\n\n for (const line of block.split(\"\\n\")) {\n if (line.startsWith(\"id:\")) {\n id = line.slice(3).trim();\n } else if (line.startsWith(\"event:\")) {\n event = line.slice(6).trim();\n } else if (line.startsWith(\"data:\")) {\n data += (data ? \"\\n\" : \"\") + line.slice(5).trim();\n } else if (line.startsWith(\"retry:\")) {\n const val = parseInt(line.slice(6).trim(), 10);\n if (!Number.isNaN(val)) retry = val;\n }\n }\n\n if (data || event !== \"message\") {\n parsed.push({ id, event, data, retry });\n }\n }\n\n return { parsed, remaining };\n }\n\n /** Tracks total events flushed via the monotonic totalPushed counter. */\n private lastFlushedTotal = 0;\n\n private startFlushTimer(): void {\n this.lastFlushedTotal = this.buffer.totalPushed;\n this.flushTimer = setInterval(() => {\n const currentTotal = this.buffer.totalPushed;\n if (currentTotal > this.lastFlushedTotal) {\n const newCount = currentTotal - this.lastFlushedTotal;\n const newEvents = this.buffer.lastN(newCount);\n this.lastFlushedTotal = currentTotal;\n if (newEvents.length > 0) {\n this.eventHandler?.(newEvents);\n }\n }\n }, this.flushIntervalMs);\n }\n\n private stopFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n private computeReconnectDelay(): number {\n const exponential = INITIAL_RECONNECT_DELAY_MS * Math.pow(2, this.reconnectAttempt - 1);\n const capped = Math.min(exponential, MAX_RECONNECT_DELAY_MS);\n return capped + Math.random() * capped * 0.1; // 10% jitter\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Config resolution from multiple sources with precedence:\n *\n * 1. Explicit overrides (constructor args / CLI flags)\n * 2. Config file (./nexus.yaml → ./nexus.yml → ~/.nexus/config.yaml)\n * 3. Environment variables (NEXUS_URL, NEXUS_API_KEY, etc.)\n * 4. Defaults\n *\n * Matches the Python CLI (`config.py:_auto_discover`): if a config file\n * exists, its values take priority over environment variables.\n */\n\nimport type { NexusClientOptions } from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"http://localhost:2026\";\n\n/**\n * Resolve Nexus client config from multiple sources.\n *\n * Works in Node, Bun, and Deno. Gracefully degrades in browsers\n * (no env vars or filesystem — uses defaults + overrides only).\n */\nexport function resolveConfig(\n overrides?: Partial<NexusClientOptions>,\n): NexusClientOptions {\n // Layer 2: Config file — check ./nexus.yaml, ./nexus.yml, then ~/.nexus/config.yaml\n const yamlConfig = readYamlConfig();\n\n // Layer 3: Environment variables (lower priority than config file)\n const envUrl = readEnv(\"NEXUS_URL\");\n const envApiKey = readEnv(\"NEXUS_API_KEY\");\n\n // Layer 1 wins over 2 (file) wins over 3 (env) wins over defaults\n return {\n apiKey: overrides?.apiKey ?? yamlConfig.apiKey ?? envApiKey ?? \"\",\n baseUrl: overrides?.baseUrl ?? yamlConfig.url ?? envUrl ?? DEFAULT_BASE_URL,\n timeout: overrides?.timeout,\n maxRetries: overrides?.maxRetries,\n fetch: overrides?.fetch,\n transformKeys: overrides?.transformKeys,\n agentId: overrides?.agentId ?? yamlConfig.agentId ?? readEnv(\"NEXUS_AGENT_ID\"),\n subject: overrides?.subject ?? readEnv(\"NEXUS_SUBJECT\"),\n zoneId: overrides?.zoneId ?? yamlConfig.zoneId ?? readEnv(\"NEXUS_ZONE_ID\"),\n };\n}\n\n// =============================================================================\n// Internal helpers\n// =============================================================================\n\nfunction readEnv(name: string): string | undefined {\n try {\n // Works in Node, Bun, Deno\n return typeof process !== \"undefined\" ? process.env[name] : undefined;\n } catch {\n return undefined;\n }\n}\n\ninterface YamlConfig {\n url?: string;\n apiKey?: string;\n agentId?: string;\n zoneId?: string;\n}\n\n/**\n * Minimal YAML reader matching the Python CLI search order:\n * 1. Walk up from CWD looking for nexus.yaml / nexus.yml\n * 2. ~/.nexus/config.yaml\n *\n * Walking up from CWD handles two important cases:\n * - Running the TUI from a subdirectory (e.g. packages/nexus-tui/)\n * - Running from a git worktree inside the main repo tree, where\n * nexus.yaml is gitignored and only exists in the original repo root\n *\n * Only reads top-level `url:` and `api_key:` fields via regex.\n * Avoids pulling in a full YAML parser dependency.\n */\nfunction readYamlConfig(): YamlConfig {\n try {\n // Dynamic import to avoid bundler issues in browsers\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const fs = require(\"node:fs\") as typeof import(\"node:fs\");\n const os = require(\"node:os\") as typeof import(\"node:os\");\n const path = require(\"node:path\") as typeof import(\"node:path\");\n\n // Walk up from CWD looking for nexus.yaml or nexus.yml.\n // Stops at the git root (.git file or directory) to avoid leaking\n // into a parent repository. For git worktrees, this means the search\n // stops at the worktree root — each worktree should have its own\n // nexus.yaml (created via `nexus init` from the pre-connection screen).\n const candidates: string[] = [];\n let dir = path.resolve(\".\");\n for (let i = 0; i < 20; i++) {\n candidates.push(path.join(dir, \"nexus.yaml\"));\n candidates.push(path.join(dir, \"nexus.yml\"));\n // Stop after reaching a git root (both regular repos and worktrees)\n try {\n if (fs.existsSync(path.join(dir, \".git\"))) break;\n } catch { /* ignore */ }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n // Fallback: home dir config\n candidates.push(path.join(os.homedir(), \".nexus\", \"config.yaml\"));\n\n for (const configPath of candidates) {\n try {\n const content = fs.readFileSync(configPath, \"utf-8\");\n let url = extractYamlValue(content, \"url\");\n const apiKey = extractYamlValue(content, \"api_key\");\n const agentId = extractYamlValue(content, \"agent_id\");\n const zoneId = extractYamlValue(content, \"zone_id\");\n\n // If no explicit url but ports.http exists, build URL from port\n // (nexus init --preset shared/demo writes ports.http instead of url)\n if (!url) {\n const httpPort = extractIndentedYamlValue(content, \"ports\", \"http\");\n if (httpPort) {\n url = `http://localhost:${httpPort}`;\n }\n }\n\n return {\n url: url ?? undefined,\n apiKey: apiKey ?? undefined,\n agentId: agentId ?? undefined,\n zoneId: zoneId ?? undefined,\n };\n } catch {\n // File doesn't exist or isn't readable, try next candidate\n }\n }\n\n return {};\n } catch {\n return {};\n }\n}\n\nfunction extractYamlValue(content: string, key: string): string | null {\n const regex = new RegExp(`^${key}:\\\\s*[\"']?([^\"'\\\\n]+)[\"']?`, \"m\");\n const match = regex.exec(content);\n return match?.[1]?.trim() ?? null;\n}\n\n/**\n * Extract a nested YAML value like `ports:\\n http: 2027`.\n * Only handles one level of nesting with 2-space indent.\n */\nfunction extractIndentedYamlValue(content: string, parent: string, child: string): string | null {\n const regex = new RegExp(`^${parent}:\\\\s*\\\\n(?:[ ]{2}\\\\w+:[^\\\\n]*\\\\n)*?[ ]{2}${child}:\\\\s*[\"']?([^\"'\\\\n]+)[\"']?`, \"m\");\n const match = regex.exec(content);\n return match?.[1]?.trim() ?? null;\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nexus-ai-fs/api-client",
|
|
3
|
+
"version": "0.9.18",
|
|
4
|
+
"description": "Shared HTTP client for Nexus APIs — retry, auth, error mapping, case transform",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/index.d.cts",
|
|
17
|
+
"default": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md"
|
|
24
|
+
],
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsup",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"test:watch": "vitest",
|
|
29
|
+
"test:coverage": "vitest run --coverage",
|
|
30
|
+
"lint": "tsc --noEmit",
|
|
31
|
+
"clean": "rm -rf dist"
|
|
32
|
+
},
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=18"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/node": "^25.4.0",
|
|
38
|
+
"@vitest/coverage-v8": "^2.0.0",
|
|
39
|
+
"tsup": "^8.0.0",
|
|
40
|
+
"typescript": "^5.5.0",
|
|
41
|
+
"vitest": "^2.0.0"
|
|
42
|
+
},
|
|
43
|
+
"keywords": [
|
|
44
|
+
"nexus",
|
|
45
|
+
"api",
|
|
46
|
+
"client",
|
|
47
|
+
"sdk"
|
|
48
|
+
],
|
|
49
|
+
"publishConfig": {
|
|
50
|
+
"access": "public"
|
|
51
|
+
},
|
|
52
|
+
"license": "MIT",
|
|
53
|
+
"repository": {
|
|
54
|
+
"type": "git",
|
|
55
|
+
"url": "https://github.com/nexi-lab/nexus",
|
|
56
|
+
"directory": "packages/nexus-api-client"
|
|
57
|
+
}
|
|
58
|
+
}
|