@seclai/sdk 1.1.0 → 1.1.2
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 +46 -5
- package/dist/index.cjs +350 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +476 -364
- package/dist/index.d.ts +476 -364
- package/dist/index.js +340 -15
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts"],"sourcesContent":["/**\n * @module\n *\n * Seclai JavaScript/TypeScript SDK.\n *\n * ```ts\n * import { Seclai } from \"@seclai/sdk\";\n *\n * const client = new Seclai({ apiKey: process.env.SECLAI_API_KEY });\n * const agents = await client.listAgents();\n * ```\n *\n * @see {@link Seclai} for the main client class.\n * @packageDocumentation\n */\nexport {\n Seclai,\n SECLAI_API_URL,\n type SeclaiOptions,\n type FetchLike,\n} from \"./client\";\n\nexport {\n SeclaiError,\n SeclaiConfigurationError,\n SeclaiAPIStatusError,\n SeclaiAPIValidationError,\n SeclaiStreamingError,\n} from \"./errors\";\n\nexport type {\n // General\n JSONValue,\n HTTPValidationError,\n ValidationError,\n PaginationResponse,\n ListOptions,\n SortableListOptions,\n\n // Agents\n AgentListResponse,\n AgentDefinitionResponse,\n AgentSummaryResponse,\n CreateAgentRequest,\n UpdateAgentRequest,\n UpdateAgentDefinitionRequest,\n\n // Agent Runs\n AgentRunRequest,\n AgentRunStreamRequest,\n AgentRunResponse,\n AgentRunListResponse,\n AgentRunStepResponse,\n AgentRunAttemptResponse,\n AgentTraceSearchRequest,\n AgentTraceSearchResponse,\n AgentTraceMatchResponse,\n AgentRunEvent,\n\n // Agent Input Uploads\n UploadAgentInputApiResponse,\n\n // Agent AI Assistant\n GenerateAgentStepsRequest,\n GenerateAgentStepsResponse,\n GenerateStepConfigRequest,\n GenerateStepConfigResponse,\n ExamplePrompt,\n MarkAiSuggestionRequest,\n AiConversationHistoryResponse,\n AiConversationTurnResponse,\n\n // Agent Evaluations\n AgentEvaluationTier,\n EvaluationCriteriaResponse,\n CreateEvaluationCriteriaRequest,\n UpdateEvaluationCriteriaRequest,\n EvaluationResultResponse,\n EvaluationResultListResponse,\n CreateEvaluationResultRequest,\n EvaluationResultSummaryResponse,\n EvaluationResultWithCriteriaResponse,\n EvaluationResultWithCriteriaListResponse,\n EvaluationRunSummaryResponse,\n EvaluationRunSummaryListResponse,\n EvaluationStatus,\n NonManualEvaluationSummaryResponse,\n NonManualEvaluationModeStatResponse,\n TestDraftEvaluationRequest,\n TestDraftEvaluationResponse,\n CompatibleRunListResponse,\n CompatibleRunResponse,\n\n // Knowledge Bases\n KnowledgeBaseListResponse,\n KnowledgeBaseResponse,\n CreateKnowledgeBaseBody,\n UpdateKnowledgeBaseBody,\n\n // Memory Banks\n MemoryBankListResponse,\n MemoryBankResponse,\n CreateMemoryBankBody,\n UpdateMemoryBankBody,\n MemoryBankAiAssistantRequest,\n MemoryBankAiAssistantResponse,\n MemoryBankAcceptRequest,\n MemoryBankConfigResponse,\n MemoryBankLastConversationResponse,\n MemoryBankConversationTurnResponse,\n TestCompactionRequest,\n CompactionTestResponse,\n CompactionEvaluationModel,\n StandaloneTestCompactionRequest,\n\n // Sources\n SourceListResponse,\n SourceResponse,\n SourceConnectionResponse,\n CreateSourceBody,\n UpdateSourceBody,\n FileUploadResponse,\n InlineTextUploadRequest,\n InlineTextReplaceRequest,\n\n // Source Exports\n ExportListResponse,\n ExportResponse,\n CreateExportRequest,\n EstimateExportRequest,\n EstimateExportResponse,\n ExportFormat,\n\n // Source Embedding Migrations\n SourceEmbeddingMigrationResponse,\n StartSourceEmbeddingMigrationRequest,\n\n // Content\n ContentDetailResponse,\n ContentEmbeddingsListResponse,\n ContentEmbeddingResponse,\n ContentFileUploadResponse,\n\n // Solutions\n SolutionListResponse,\n SolutionResponse,\n SolutionSummaryResponse,\n CreateSolutionRequest,\n UpdateSolutionRequest,\n SolutionAgentResponse,\n SolutionKnowledgeBaseResponse,\n SolutionSourceConnectionResponse,\n SolutionConversationResponse,\n AddConversationTurnRequest,\n MarkConversationTurnRequest,\n AiAssistantGenerateRequest,\n AiAssistantGenerateResponse,\n AiAssistantAcceptRequest,\n AiAssistantAcceptResponse,\n ProposedActionResponse,\n ExecutedActionResponse,\n\n // Resource Linking\n LinkResourcesRequest,\n UnlinkResourcesRequest,\n\n // Governance\n GovernanceAiAssistantRequest,\n GovernanceAiAssistantResponse,\n GovernanceAiAcceptResponse,\n GovernanceConversationResponse,\n GovernanceProposedPolicyActionResponse,\n GovernanceAppliedActionResponse,\n\n // Alerts\n CreateAlertConfigRequest,\n UpdateAlertConfigRequest,\n ChangeStatusRequest,\n AddCommentRequest,\n OrganizationAlertPreferenceResponse,\n OrganizationAlertPreferenceListResponse,\n UpdateOrganizationAlertPreferenceRequest,\n\n // AI Assistant (top-level)\n AiAssistantFeedbackRequest,\n AiAssistantFeedbackResponse,\n\n // Models\n PromptModelAutoUpgradeStrategy,\n\n // Enums\n PendingProcessingCompletedFailedStatus,\n} from \"./types\";\n","/**\n * @module\n *\n * Error classes thrown by the Seclai SDK.\n *\n * All errors extend {@link SeclaiError}, so a single `catch (err instanceof SeclaiError)`\n * handles every SDK error. Narrow to more specific subclasses for finer handling.\n */\n\n/** Base error class for the Seclai SDK. */\nexport class SeclaiError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SeclaiError\";\n }\n}\n\n/** Thrown when the SDK is misconfigured (for example, missing API key). */\nexport class SeclaiConfigurationError extends SeclaiError {\n constructor(message: string) {\n super(message);\n this.name = \"SeclaiConfigurationError\";\n }\n}\n\n/**\n * Thrown when the API returns a non-success status code.\n *\n * @remarks\n * Use {@link SeclaiAPIValidationError} for HTTP 422 validation errors.\n */\nexport class SeclaiAPIStatusError extends SeclaiError {\n /** HTTP status code returned by the API. */\n public readonly statusCode: number;\n /** HTTP method used for the request. */\n public readonly method: string;\n /** Full request URL. */\n public readonly url: string;\n /** Best-effort response body text (if available). */\n public readonly responseText: string | undefined;\n\n constructor(opts: {\n /** Human-readable error message. */\n message: string;\n statusCode: number;\n method: string;\n url: string;\n responseText: string | undefined;\n }) {\n super(opts.message);\n this.name = \"SeclaiAPIStatusError\";\n this.statusCode = opts.statusCode;\n this.method = opts.method;\n this.url = opts.url;\n this.responseText = opts.responseText;\n }\n}\n\n/**\n * Thrown when the API returns a validation error response (typically HTTP 422).\n *\n * The `validationError` field contains the decoded validation payload when available.\n */\nexport class SeclaiAPIValidationError extends SeclaiAPIStatusError {\n /** Parsed validation error payload (best-effort). */\n public readonly validationError: unknown;\n\n constructor(opts: {\n message: string;\n statusCode: number;\n method: string;\n url: string;\n responseText: string | undefined;\n validationError: unknown;\n }) {\n super(opts);\n this.name = \"SeclaiAPIValidationError\";\n this.validationError = opts.validationError;\n }\n}\n\n/** Thrown when a streaming operation fails (e.g. stream ends unexpectedly). */\nexport class SeclaiStreamingError extends SeclaiError {\n /** The run ID associated with the failed stream, when available. */\n public readonly runId: string | undefined;\n\n constructor(message: string, runId?: string) {\n super(message);\n this.name = \"SeclaiStreamingError\";\n this.runId = runId;\n }\n}\n","/**\n * @module\n *\n * Main SDK client for the Seclai API.\n *\n * Exports the {@link Seclai} class which provides typed convenience methods for\n * every API endpoint, plus low-level {@link Seclai.request | request()} and\n * {@link Seclai.requestRaw | requestRaw()} escape hatches, streaming helpers,\n * and automatic pagination.\n */\nimport {\n SeclaiAPIStatusError,\n SeclaiAPIValidationError,\n SeclaiConfigurationError,\n SeclaiError,\n SeclaiStreamingError,\n} from \"./errors\";\nimport type {\n AgentRunEvent,\n AgentDefinitionResponse,\n AgentListResponse,\n AgentRunListResponse,\n AgentRunRequest,\n AgentRunResponse,\n AgentRunStreamRequest,\n AgentSummaryResponse,\n AgentTraceSearchRequest,\n AgentTraceSearchResponse,\n AiAssistantAcceptRequest,\n AiAssistantAcceptResponse,\n AiAssistantFeedbackRequest,\n AiAssistantFeedbackResponse,\n AiAssistantGenerateRequest,\n AiAssistantGenerateResponse,\n AiConversationHistoryResponse,\n AddCommentRequest,\n AddConversationTurnRequest,\n ChangeStatusRequest,\n CompatibleRunListResponse,\n CompactionTestResponse,\n ContentDetailResponse,\n ContentEmbeddingsListResponse,\n ContentFileUploadResponse,\n CreateAgentRequest,\n CreateAlertConfigRequest,\n CreateEvaluationCriteriaRequest,\n CreateEvaluationResultRequest,\n CreateExportRequest,\n CreateKnowledgeBaseBody,\n CreateMemoryBankBody,\n CreateSolutionRequest,\n CreateSourceBody,\n EstimateExportRequest,\n EstimateExportResponse,\n EvaluationCriteriaResponse,\n EvaluationResultListResponse,\n EvaluationResultResponse,\n EvaluationResultSummaryResponse,\n EvaluationResultWithCriteriaListResponse,\n EvaluationRunSummaryListResponse,\n ExportListResponse,\n ExportResponse,\n FileUploadResponse,\n GenerateAgentStepsRequest,\n GenerateAgentStepsResponse,\n GenerateStepConfigRequest,\n GenerateStepConfigResponse,\n GovernanceAiAcceptResponse,\n GovernanceAiAssistantRequest,\n GovernanceAiAssistantResponse,\n GovernanceConversationResponse,\n HTTPValidationError,\n InlineTextReplaceRequest,\n InlineTextUploadRequest,\n KnowledgeBaseListResponse,\n KnowledgeBaseResponse,\n LinkResourcesRequest,\n ListOptions,\n MarkAiSuggestionRequest,\n MarkConversationTurnRequest,\n MemoryBankAcceptRequest,\n MemoryBankAiAssistantRequest,\n MemoryBankAiAssistantResponse,\n MemoryBankLastConversationResponse,\n MemoryBankListResponse,\n MemoryBankResponse,\n NonManualEvaluationSummaryResponse,\n OrganizationAlertPreferenceListResponse,\n SolutionConversationResponse,\n SolutionListResponse,\n SolutionResponse,\n SortableListOptions,\n SourceEmbeddingMigrationResponse,\n SourceListResponse,\n SourceResponse,\n StandaloneTestCompactionRequest,\n StartSourceEmbeddingMigrationRequest,\n TestCompactionRequest,\n TestDraftEvaluationRequest,\n TestDraftEvaluationResponse,\n UnlinkResourcesRequest,\n UpdateAgentDefinitionRequest,\n UpdateAgentRequest,\n UpdateAlertConfigRequest,\n UpdateEvaluationCriteriaRequest,\n UpdateKnowledgeBaseBody,\n UpdateMemoryBankBody,\n UpdateOrganizationAlertPreferenceRequest,\n UpdateSolutionRequest,\n UpdateSourceBody,\n UploadAgentInputApiResponse,\n} from \"./types\";\n\n/** Default API base URL (can be overridden with `baseUrl` or `SECLAI_API_URL`). */\nexport const SECLAI_API_URL = \"https://api.seclai.com\";\n\n/** A `fetch`-compatible function (e.g. `globalThis.fetch` or `undici.fetch`). */\nexport type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\n/** Configuration for the {@link Seclai} client. */\nexport interface SeclaiOptions {\n /** API key used for authentication. Defaults to `process.env.SECLAI_API_KEY` when available. */\n apiKey?: string;\n /** API base URL. Defaults to `process.env.SECLAI_API_URL` when available, else {@link SECLAI_API_URL}. */\n baseUrl?: string;\n /** Header name to use for the API key. Defaults to `x-api-key`. */\n apiKeyHeader?: string;\n /** Extra headers to include on every request. */\n defaultHeaders?: Record<string, string>;\n /** Optional `fetch` implementation for environments without a global `fetch`. */\n fetch?: FetchLike;\n}\n\n// ─── Internal Helpers ────────────────────────────────────────────────────────\n\nfunction getEnv(name: string): string | undefined {\n const p = (globalThis as any)?.process;\n return p?.env?.[name];\n}\n\nfunction buildURL(baseUrl: string, path: string, query?: Record<string, unknown>): URL {\n const url = new URL(path, baseUrl);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url;\n}\n\nasync function safeText(response: Response): Promise<string | undefined> {\n try {\n return await response.clone().text();\n } catch {\n return undefined;\n }\n}\n\nasync function safeJson(response: Response): Promise<unknown | undefined> {\n try {\n return await response.clone().json();\n } catch {\n return undefined;\n }\n}\n\ntype SseMessage = { event?: string; data?: string };\n\nfunction createSseParser(onMessage: (msg: SseMessage) => void) {\n let buffer = \"\";\n let eventName: string | undefined;\n let dataLines: string[] = [];\n\n function dispatch() {\n if (!eventName && dataLines.length === 0) return;\n const msg: SseMessage = { data: dataLines.join(\"\\n\") };\n if (eventName !== undefined) msg.event = eventName;\n onMessage(msg);\n eventName = undefined;\n dataLines = [];\n }\n\n function feed(textChunk: string) {\n buffer += textChunk;\n while (true) {\n const newlineIdx = buffer.indexOf(\"\\n\");\n if (newlineIdx === -1) return;\n\n let line = buffer.slice(0, newlineIdx);\n buffer = buffer.slice(newlineIdx + 1);\n\n if (line.endsWith(\"\\r\")) line = line.slice(0, -1);\n\n if (line === \"\") {\n dispatch();\n continue;\n }\n\n if (line.startsWith(\":\")) continue;\n\n const colon = line.indexOf(\":\");\n const field = colon === -1 ? line : line.slice(0, colon);\n let value = colon === -1 ? \"\" : line.slice(colon + 1);\n if (value.startsWith(\" \")) value = value.slice(1);\n\n if (field === \"event\") {\n eventName = value;\n } else if (field === \"data\") {\n dataLines.push(value);\n }\n }\n }\n\n return { feed, end: dispatch };\n}\n\nfunction anySignal(signals: Array<AbortSignal | undefined>): AbortSignal | undefined {\n const present = signals.filter(Boolean) as AbortSignal[];\n if (present.length === 0) return undefined;\n if (present.length === 1) return present[0];\n const controller = new AbortController();\n const onAbort = () => controller.abort();\n for (const s of present) {\n if (s.aborted) {\n controller.abort();\n break;\n }\n s.addEventListener(\"abort\", onAbort, { once: true });\n }\n return controller.signal;\n}\n\nfunction toBlob(\n file: Blob | Uint8Array | ArrayBuffer | BufferSource,\n mimeType?: string,\n): Blob {\n if (file instanceof Blob) return file;\n const opts = mimeType ? { type: mimeType } : undefined;\n if (file instanceof ArrayBuffer) return new Blob([new Uint8Array(file)], opts);\n return new Blob([file as unknown as BlobPart], opts);\n}\n\nconst MIME_TYPES: Record<string, string> = {\n txt: \"text/plain\", html: \"text/html\", htm: \"text/html\", md: \"text/markdown\",\n csv: \"text/csv\", xml: \"text/xml\", json: \"application/json\",\n pdf: \"application/pdf\", doc: \"application/msword\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n ppt: \"application/vnd.ms-powerpoint\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n xls: \"application/vnd.ms-excel\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n msg: \"application/vnd.ms-outlook\", zip: \"application/zip\",\n epub: \"application/epub+zip\",\n png: \"image/png\", jpg: \"image/jpeg\", jpeg: \"image/jpeg\", gif: \"image/gif\",\n bmp: \"image/bmp\", tiff: \"image/tiff\", webp: \"image/webp\",\n mp3: \"audio/mpeg\", wav: \"audio/wav\", m4a: \"audio/mp4\", flac: \"audio/flac\",\n ogg: \"audio/ogg\", mp4: \"video/mp4\", mov: \"video/quicktime\", avi: \"video/x-msvideo\",\n};\n\nfunction inferMimeType(fileName: string | undefined): string | undefined {\n if (!fileName) return undefined;\n const ext = fileName.split(\".\").pop()?.toLowerCase();\n return ext ? MIME_TYPES[ext] : undefined;\n}\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\n/**\n * Seclai JavaScript/TypeScript client.\n *\n * Provides typed methods for every Seclai API endpoint, plus higher-level\n * abstractions for streaming, polling, and pagination.\n *\n * @example\n * ```ts\n * import { Seclai } from \"@seclai/sdk\";\n *\n * const client = new Seclai({ apiKey: \"sk-...\" });\n *\n * // List agents\n * const { items } = await client.listAgents();\n *\n * // Run an agent\n * const run = await client.runAgent(\"agent-id\", { input: \"Hello!\" });\n *\n * // Stream an agent run\n * for await (const event of client.runStreamingAgent(\"agent-id\", { input: \"Hello!\" })) {\n * console.log(event.event, event.data);\n * }\n * ```\n */\nexport class Seclai {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly apiKeyHeader: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly fetcher: FetchLike;\n\n /**\n * Create a new Seclai client.\n *\n * @param opts - Client configuration.\n * @throws {@link SeclaiConfigurationError} If no API key is provided (and `SECLAI_API_KEY` is not set).\n * @throws {@link SeclaiConfigurationError} If no `fetch` implementation is available.\n */\n constructor(opts: SeclaiOptions = {}) {\n const apiKey = opts.apiKey ?? getEnv(\"SECLAI_API_KEY\");\n if (!apiKey) {\n throw new SeclaiConfigurationError(\n \"Missing API key. Provide apiKey or set SECLAI_API_KEY.\"\n );\n }\n\n const fetcher = opts.fetch ?? (globalThis.fetch as FetchLike | undefined);\n if (!fetcher) {\n throw new SeclaiConfigurationError(\n \"No fetch implementation available. Provide opts.fetch or run in an environment with global fetch.\"\n );\n }\n\n this.apiKey = apiKey;\n this.baseUrl = opts.baseUrl ?? getEnv(\"SECLAI_API_URL\") ?? SECLAI_API_URL;\n this.apiKeyHeader = opts.apiKeyHeader ?? \"x-api-key\";\n this.defaultHeaders = { ...(opts.defaultHeaders ?? {}) };\n this.fetcher = fetcher;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Low-level request\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Make a raw HTTP request to the Seclai API.\n *\n * This is a low-level escape hatch. For most operations, prefer the typed convenience methods.\n *\n * @param method - HTTP method (e.g. `\"GET\"`, `\"POST\"`).\n * @param path - Request path relative to `baseUrl` (e.g. `\"/sources/\"`).\n * @param opts - Query params, JSON body, per-request headers, and optional AbortSignal.\n * @returns Parsed JSON for JSON responses, raw text for non-JSON responses, or `null` for empty bodies.\n * @throws {@link SeclaiAPIValidationError} For validation errors (typically HTTP 422).\n * @throws {@link SeclaiAPIStatusError} For other non-success HTTP status codes.\n */\n async request(\n method: string,\n path: string,\n opts?: {\n query?: Record<string, unknown>;\n json?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n }\n ): Promise<unknown | string | null> {\n const url = buildURL(this.baseUrl, path, opts?.query);\n\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n ...(opts?.headers ?? {}),\n [this.apiKeyHeader]: this.apiKey,\n };\n\n let body: BodyInit | undefined;\n if (opts?.json !== undefined) {\n headers[\"content-type\"] = headers[\"content-type\"] ?? \"application/json\";\n body = JSON.stringify(opts.json);\n }\n\n const init: RequestInit = { method, headers };\n if (body !== undefined) {\n init.body = body;\n }\n if (opts?.signal) {\n init.signal = opts.signal;\n }\n const response = await this.fetcher(url, init);\n\n if (response.status === 204) return null;\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const isJson = contentType.includes(\"application/json\");\n\n if (!response.ok) {\n const responseText = await safeText(response);\n if (response.status === 422) {\n const validation = (await safeJson(response)) as HTTPValidationError | undefined;\n throw new SeclaiAPIValidationError({\n message: \"Validation error\",\n statusCode: response.status,\n method,\n url: url.toString(),\n responseText,\n validationError: validation,\n });\n }\n throw new SeclaiAPIStatusError({\n message: `Request failed with status ${response.status}`,\n statusCode: response.status,\n method,\n url: url.toString(),\n responseText,\n });\n }\n\n if (!response.body) return null;\n\n if (isJson) {\n return (await response.json()) as unknown;\n }\n return await response.text();\n }\n\n /**\n * Make a raw HTTP request and return the raw `Response` object (for binary downloads, etc.).\n *\n * @param method - HTTP method.\n * @param path - Request path relative to `baseUrl`.\n * @param opts - Query params, JSON body, per-request headers, and optional AbortSignal.\n * @returns The raw `Response` object.\n */\n async requestRaw(\n method: string,\n path: string,\n opts?: {\n query?: Record<string, unknown>;\n json?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n }\n ): Promise<Response> {\n const url = buildURL(this.baseUrl, path, opts?.query);\n\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n ...(opts?.headers ?? {}),\n [this.apiKeyHeader]: this.apiKey,\n };\n\n let body: BodyInit | undefined;\n if (opts?.json !== undefined) {\n headers[\"content-type\"] = headers[\"content-type\"] ?? \"application/json\";\n body = JSON.stringify(opts.json);\n }\n\n const init: RequestInit = { method, headers };\n if (body !== undefined) init.body = body;\n if (opts?.signal) init.signal = opts.signal;\n\n const response = await this.fetcher(url, init);\n\n if (!response.ok) {\n const responseText = await safeText(response);\n if (response.status === 422) {\n const validation = (await safeJson(response)) as HTTPValidationError | undefined;\n throw new SeclaiAPIValidationError({\n message: \"Validation error\",\n statusCode: response.status,\n method,\n url: url.toString(),\n responseText,\n validationError: validation,\n });\n }\n throw new SeclaiAPIStatusError({\n message: `Request failed with status ${response.status}`,\n statusCode: response.status,\n method,\n url: url.toString(),\n responseText,\n });\n }\n\n return response;\n }\n\n /** Shared multipart upload helper. */\n private async uploadFile(\n path: string,\n opts: {\n file: Blob | Uint8Array | ArrayBuffer | BufferSource;\n title?: string;\n metadata?: Record<string, unknown>;\n fileName?: string;\n mimeType?: string;\n signal?: AbortSignal;\n },\n ): Promise<unknown> {\n const url = buildURL(this.baseUrl, path);\n\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n [this.apiKeyHeader]: this.apiKey,\n };\n // Let fetch set the correct multipart Content-Type with boundary\n delete headers[\"content-type\"];\n delete headers[\"Content-Type\"];\n\n const form = new FormData();\n const mimeType = opts.mimeType ?? inferMimeType(opts.fileName);\n const blob = toBlob(opts.file, mimeType);\n form.set(\"file\", blob, opts.fileName ?? \"upload\");\n\n if (opts.title !== undefined) form.set(\"title\", opts.title);\n if (opts.metadata !== undefined) form.set(\"metadata\", JSON.stringify(opts.metadata));\n\n const init: RequestInit = { method: \"POST\", headers, body: form };\n if (opts.signal) init.signal = opts.signal;\n\n const response = await this.fetcher(url, init);\n\n if (!response.ok) {\n const responseText = await safeText(response);\n if (response.status === 422) {\n const validation = (await safeJson(response)) as HTTPValidationError | undefined;\n throw new SeclaiAPIValidationError({\n message: \"Validation error\",\n statusCode: response.status,\n method: \"POST\",\n url: url.toString(),\n responseText,\n validationError: validation,\n });\n }\n throw new SeclaiAPIStatusError({\n message: `Request failed with status ${response.status}`,\n statusCode: response.status,\n method: \"POST\",\n url: url.toString(),\n responseText,\n });\n }\n\n return await response.json();\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agents — CRUD\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List agents.\n *\n * @param opts - Pagination options.\n * @returns Paginated list of agents.\n */\n async listAgents(opts: ListOptions = {}): Promise<AgentListResponse> {\n return (await this.request(\"GET\", \"/agents\", {\n query: { page: opts.page, limit: opts.limit },\n })) as AgentListResponse;\n }\n\n /**\n * Create a new agent.\n *\n * @param body - Agent creation payload (name, trigger type, template, etc.).\n * @returns Summary of the created agent.\n */\n async createAgent(body: CreateAgentRequest): Promise<AgentSummaryResponse> {\n return (await this.request(\"POST\", \"/agents\", { json: body })) as AgentSummaryResponse;\n }\n\n /**\n * Get agent details including its definition.\n *\n * @param agentId - Agent identifier.\n * @returns Full agent metadata.\n */\n async getAgent(agentId: string): Promise<AgentSummaryResponse> {\n return (await this.request(\"GET\", `/agents/${agentId}`)) as AgentSummaryResponse;\n }\n\n /**\n * Update an agent.\n *\n * @param agentId - Agent identifier.\n * @param body - Fields to update.\n * @returns Updated agent summary.\n */\n async updateAgent(agentId: string, body: UpdateAgentRequest): Promise<AgentSummaryResponse> {\n return (await this.request(\"PUT\", `/agents/${agentId}`, { json: body })) as AgentSummaryResponse;\n }\n\n /**\n * Delete an agent.\n *\n * @param agentId - Agent identifier.\n */\n async deleteAgent(agentId: string): Promise<void> {\n await this.request(\"DELETE\", `/agents/${agentId}`);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agent Definitions\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Get an agent's full definition (steps, model config, etc.).\n *\n * @param agentId - Agent identifier.\n * @returns The agent definition.\n */\n async getAgentDefinition(agentId: string): Promise<AgentDefinitionResponse> {\n return (await this.request(\"GET\", `/agents/${agentId}/definition`)) as AgentDefinitionResponse;\n }\n\n /**\n * Update an agent's definition.\n *\n * @param agentId - Agent identifier.\n * @param body - Updated definition payload.\n * @returns Updated agent definition.\n */\n async updateAgentDefinition(agentId: string, body: UpdateAgentDefinitionRequest): Promise<AgentDefinitionResponse> {\n return (await this.request(\"PUT\", `/agents/${agentId}/definition`, { json: body })) as AgentDefinitionResponse;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agent Runs\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Start an agent run.\n *\n * @param agentId - Agent identifier.\n * @param body - Run request payload (`input`, `metadata`, `priority`, etc.).\n * @returns The created agent run.\n */\n async runAgent(agentId: string, body: AgentRunRequest): Promise<AgentRunResponse> {\n return (await this.request(\"POST\", `/agents/${agentId}/runs`, { json: body })) as AgentRunResponse;\n }\n\n /**\n * List runs for a specific agent.\n *\n * @param agentId - Agent identifier.\n * @param opts - Pagination and filter options.\n * @returns Paginated list of runs.\n */\n async listAgentRuns(\n agentId: string,\n opts: ListOptions & { status?: string } = {},\n ): Promise<AgentRunListResponse> {\n return (await this.request(\"GET\", `/agents/${agentId}/runs`, {\n query: { page: opts.page, limit: opts.limit, status: opts.status },\n })) as AgentRunListResponse;\n }\n\n /**\n * Search agent runs (traces) across all agents.\n *\n * @param body - Search query and filters.\n * @returns Search results with matching runs.\n */\n async searchAgentRuns(body: AgentTraceSearchRequest): Promise<AgentTraceSearchResponse> {\n return (await this.request(\"POST\", \"/agents/runs/search\", { json: body })) as AgentTraceSearchResponse;\n }\n\n /**\n * Get details of a specific agent run.\n *\n * @param runId - Run identifier.\n * @param opts - Optional flags.\n * @returns Agent run details.\n */\n async getAgentRun(\n runId: string,\n opts?: { includeStepOutputs?: boolean },\n ): Promise<AgentRunResponse> {\n return (await this.request(\"GET\", `/agents/runs/${runId}`, opts?.includeStepOutputs ? {\n query: { include_step_outputs: true },\n } : undefined)) as AgentRunResponse;\n }\n\n /**\n * Delete an agent run.\n *\n * @param runId - Run identifier.\n */\n async deleteAgentRun(runId: string): Promise<void> {\n await this.request(\"DELETE\", `/agents/runs/${runId}`);\n }\n\n /**\n * Cancel a running agent run.\n *\n * @param runId - Run identifier.\n * @returns Updated run (with cancelled status).\n */\n async cancelAgentRun(runId: string): Promise<AgentRunResponse> {\n return (await this.request(\"POST\", `/agents/runs/${runId}/cancel`)) as AgentRunResponse;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agent Runs — Streaming\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Run an agent in streaming mode (SSE) and wait for the final result.\n *\n * Consumes the entire SSE stream and returns only the terminal `done` payload.\n * For real-time event access, use {@link runStreamingAgent} instead.\n *\n * @param agentId - Agent identifier.\n * @param body - Streaming run request payload.\n * @param opts - Timeout and abort signal options.\n * @returns Final agent run payload from the `done` event.\n * @throws {@link SeclaiStreamingError} If the stream ends before a `done` event.\n */\n async runStreamingAgentAndWait(\n agentId: string,\n body: AgentRunStreamRequest,\n opts?: { timeoutMs?: number; signal?: AbortSignal },\n ): Promise<AgentRunResponse> {\n const url = buildURL(this.baseUrl, `/agents/${agentId}/runs/stream`);\n\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n [this.apiKeyHeader]: this.apiKey,\n accept: \"text/event-stream\",\n \"content-type\": \"application/json\",\n };\n\n const timeoutMs = opts?.timeoutMs ?? 60_000;\n const timeoutController = new AbortController();\n let timedOut = false;\n const timeoutId = setTimeout(() => {\n timedOut = true;\n timeoutController.abort();\n }, timeoutMs);\n\n const signal = anySignal([opts?.signal, timeoutController.signal]);\n\n let lastSeen: AgentRunResponse | undefined;\n\n try {\n const init: RequestInit = { method: \"POST\", headers, body: JSON.stringify(body) };\n if (signal) init.signal = signal;\n\n const response = await this.fetcher(url, init);\n\n // Handle error responses\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const isJson = contentType.includes(\"application/json\");\n\n if (!response.ok) {\n const responseText = await safeText(response);\n if (response.status === 422) {\n const validation = (await safeJson(response)) as HTTPValidationError | undefined;\n throw new SeclaiAPIValidationError({\n message: \"Validation error\",\n statusCode: response.status,\n method: \"POST\",\n url: url.toString(),\n responseText,\n validationError: validation,\n });\n }\n throw new SeclaiAPIStatusError({\n message: `Request failed with status ${response.status}`,\n statusCode: response.status,\n method: \"POST\",\n url: url.toString(),\n responseText,\n });\n }\n\n // If server returned JSON instead of SSE\n if (isJson) {\n return (await response.json()) as AgentRunResponse;\n }\n\n if (!response.body) {\n throw new SeclaiConfigurationError(\n \"Streaming response body is not available in this environment. Provide a fetch implementation that supports ReadableStream bodies.\"\n );\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n let final: AgentRunResponse | undefined;\n\n const parser = createSseParser((msg) => {\n if (!msg.data) return;\n if (msg.event === \"init\" || msg.event === \"done\") {\n try {\n const parsed = JSON.parse(msg.data) as AgentRunResponse;\n lastSeen = parsed;\n if (msg.event === \"done\") final = parsed;\n } catch { /* ignore malformed JSON */ }\n }\n });\n\n while (!final) {\n const { value, done } = await reader.read();\n if (done) break;\n if (value) parser.feed(decoder.decode(value, { stream: true }));\n }\n\n parser.end();\n\n if (final) return final;\n if (lastSeen && (lastSeen as any).status && (lastSeen as any).status !== \"pending\") {\n return lastSeen;\n }\n\n throw new SeclaiStreamingError(\"Stream ended before receiving a 'done' event.\", lastSeen?.run_id);\n } catch (err) {\n if (timedOut) {\n throw new SeclaiStreamingError(\n `Timed out after ${timeoutMs}ms waiting for streaming agent run to complete.`,\n lastSeen?.run_id,\n );\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Run an agent in streaming mode and yield each SSE event as it arrives.\n *\n * This is an `AsyncGenerator` suitable for real-time UIs that want to render\n * step progress as it happens.\n *\n * @param agentId - Agent identifier.\n * @param body - Streaming run request payload.\n * @param opts - Timeout and abort signal options.\n * @yields {@link AgentRunEvent} for each SSE message.\n *\n * @example\n * ```ts\n * for await (const event of client.runStreamingAgent(\"agent-id\", { input: \"Hello!\" })) {\n * if (event.event === \"done\") {\n * console.log(\"Final:\", event.data);\n * }\n * }\n * ```\n */\n async *runStreamingAgent(\n agentId: string,\n body: AgentRunStreamRequest,\n opts?: { timeoutMs?: number; signal?: AbortSignal },\n ): AsyncGenerator<AgentRunEvent, void, undefined> {\n const url = buildURL(this.baseUrl, `/agents/${agentId}/runs/stream`);\n\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n [this.apiKeyHeader]: this.apiKey,\n accept: \"text/event-stream\",\n \"content-type\": \"application/json\",\n };\n\n const timeoutMs = opts?.timeoutMs ?? 60_000;\n const timeoutController = new AbortController();\n let timedOut = false;\n const timeoutId = setTimeout(() => {\n timedOut = true;\n timeoutController.abort();\n }, timeoutMs);\n\n const signal = anySignal([opts?.signal, timeoutController.signal]);\n\n try {\n const init: RequestInit = { method: \"POST\", headers, body: JSON.stringify(body) };\n if (signal) init.signal = signal;\n\n const response = await this.fetcher(url, init);\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const isJson = contentType.includes(\"application/json\");\n\n if (!response.ok) {\n const responseText = await safeText(response);\n if (response.status === 422) {\n const validation = (await safeJson(response)) as HTTPValidationError | undefined;\n throw new SeclaiAPIValidationError({\n message: \"Validation error\",\n statusCode: response.status,\n method: \"POST\",\n url: url.toString(),\n responseText,\n validationError: validation,\n });\n }\n throw new SeclaiAPIStatusError({\n message: `Request failed with status ${response.status}`,\n statusCode: response.status,\n method: \"POST\",\n url: url.toString(),\n responseText,\n });\n }\n\n // If server returned JSON instead of SSE, yield it as a single \"done\" event\n if (isJson) {\n const data = (await response.json()) as AgentRunResponse;\n yield { event: \"done\", data };\n return;\n }\n\n if (!response.body) {\n throw new SeclaiConfigurationError(\n \"Streaming response body is not available in this environment.\"\n );\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const events: AgentRunEvent[] = [];\n\n const parser = createSseParser((msg) => {\n if (!msg.data) return;\n let data: unknown;\n try {\n data = JSON.parse(msg.data);\n } catch {\n data = msg.data;\n }\n events.push({ event: msg.event ?? \"message\", data });\n });\n\n while (true) {\n const { value, done } = await reader.read();\n if (value) parser.feed(decoder.decode(value, { stream: true }));\n\n // Yield all events that were parsed from this chunk\n while (events.length > 0) {\n yield events.shift()!;\n }\n\n if (done) break;\n }\n parser.end();\n\n // Yield any remaining events from end()\n while (events.length > 0) {\n yield events.shift()!;\n }\n } catch (err) {\n if (timedOut) {\n throw new SeclaiStreamingError(\n `Timed out after ${timeoutMs}ms waiting for streaming agent run to complete.`\n );\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agent Runs — Polling\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Run an agent and poll until it reaches a terminal status.\n *\n * This is useful in environments where SSE streaming is unavailable.\n *\n * @param agentId - Agent identifier.\n * @param body - Run request payload.\n * @param opts - Polling configuration and abort signal.\n * @returns The terminal agent run.\n * @throws {@link SeclaiStreamingError} On timeout.\n */\n async runAgentAndPoll(\n agentId: string,\n body: AgentRunRequest,\n opts?: {\n /** Polling interval in ms (default: 2000). */\n pollIntervalMs?: number;\n /** Maximum time to wait in ms (default: 300000 = 5 min). */\n timeoutMs?: number;\n /** Include per-step outputs in the final result. */\n includeStepOutputs?: boolean;\n signal?: AbortSignal;\n },\n ): Promise<AgentRunResponse> {\n const pollInterval = opts?.pollIntervalMs ?? 2_000;\n const timeout = opts?.timeoutMs ?? 300_000;\n const startTime = Date.now();\n\n const run = await this.runAgent(agentId, body);\n const runId = (run as any).id ?? (run as any).run_id;\n if (!runId) throw new SeclaiError(\"Agent run response did not contain an id.\");\n\n while (true) {\n if (opts?.signal?.aborted) throw new SeclaiError(\"Polling aborted.\");\n if (Date.now() - startTime > timeout) {\n throw new SeclaiStreamingError(`Polling timed out after ${timeout}ms.`, runId);\n }\n\n await new Promise((r) => setTimeout(r, pollInterval));\n\n const current = await this.getAgentRun(runId,\n opts?.includeStepOutputs ? { includeStepOutputs: true } : undefined,\n );\n const status = (current as any).status;\n if (status === \"completed\" || status === \"failed\" || status === \"cancelled\") {\n return current;\n }\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agent Run Evaluation Results\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List evaluation results for a specific agent run.\n *\n * @param agentId - Agent identifier.\n * @param runId - Run identifier.\n * @param opts - Pagination options.\n * @returns Paginated list of evaluation results.\n */\n async listRunEvaluationResults(\n agentId: string,\n runId: string,\n opts: ListOptions = {},\n ): Promise<EvaluationResultWithCriteriaListResponse> {\n return (await this.request(\"GET\", `/agents/${agentId}/runs/${runId}/evaluation-results`, {\n query: { page: opts.page, limit: opts.limit },\n })) as EvaluationResultWithCriteriaListResponse;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agent Input Uploads\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Upload a file to use as input for a `dynamic_input` agent run.\n *\n * After uploading, poll {@link getAgentInputUploadStatus} until `status` is `ready`,\n * then pass `input_upload_id` to {@link runAgent}.\n *\n * @param agentId - Agent identifier.\n * @param opts - File payload and optional metadata.\n * @returns Upload response with the upload ID and status.\n */\n async uploadAgentInput(\n agentId: string,\n opts: {\n file: Blob | Uint8Array | ArrayBuffer | BufferSource;\n fileName?: string;\n mimeType?: string;\n },\n ): Promise<UploadAgentInputApiResponse> {\n return (await this.uploadFile(`/agents/${agentId}/upload-input`, opts)) as UploadAgentInputApiResponse;\n }\n\n /**\n * Get the status of an agent input upload.\n *\n * @param agentId - Agent identifier.\n * @param uploadId - Upload identifier.\n * @returns Upload status and metadata.\n */\n async getAgentInputUploadStatus(agentId: string, uploadId: string): Promise<UploadAgentInputApiResponse> {\n return (await this.request(\"GET\", `/agents/${agentId}/input-uploads/${uploadId}`)) as UploadAgentInputApiResponse;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agent AI Assistant (Steps Generation)\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Generate agent workflow steps from natural language using AI.\n *\n * @param agentId - Agent identifier.\n * @param body - Generation request with user instructions.\n * @returns AI-generated step configuration.\n */\n async generateAgentSteps(agentId: string, body: GenerateAgentStepsRequest): Promise<GenerateAgentStepsResponse> {\n return (await this.request(\"POST\", `/agents/${agentId}/ai-assistant/generate-steps`, { json: body })) as GenerateAgentStepsResponse;\n }\n\n /**\n * Generate a single step configuration using AI.\n *\n * @param agentId - Agent identifier.\n * @param body - Step config generation request.\n * @returns AI-generated step config.\n */\n async generateStepConfig(agentId: string, body: GenerateStepConfigRequest): Promise<GenerateStepConfigResponse> {\n return (await this.request(\"POST\", `/agents/${agentId}/ai-assistant/step-config`, { json: body })) as GenerateStepConfigResponse;\n }\n\n /**\n * Get AI conversation history for an agent.\n *\n * @param agentId - Agent identifier.\n * @returns Conversation history.\n */\n async getAgentAiConversationHistory(agentId: string): Promise<AiConversationHistoryResponse> {\n return (await this.request(\"GET\", `/agents/${agentId}/ai-assistant/conversations`)) as AiConversationHistoryResponse;\n }\n\n /**\n * Mark an AI suggestion as accepted or rejected.\n *\n * @param agentId - Agent identifier.\n * @param conversationId - Conversation turn identifier.\n * @param body - Mark request payload.\n */\n async markAgentAiSuggestion(agentId: string, conversationId: string, body: MarkAiSuggestionRequest): Promise<void> {\n await this.request(\"PATCH\", `/agents/${agentId}/ai-assistant/${conversationId}`, { json: body });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agent Evaluation Criteria\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List evaluation criteria for an agent.\n *\n * @param agentId - Agent identifier.\n * @param opts - Pagination options.\n */\n async listEvaluationCriteria(agentId: string, opts: ListOptions = {}): Promise<EvaluationCriteriaResponse[]> {\n return (await this.request(\"GET\", `/agents/${agentId}/evaluation-criteria`, {\n query: { page: opts.page, limit: opts.limit },\n })) as EvaluationCriteriaResponse[];\n }\n\n /**\n * Create evaluation criteria for an agent.\n *\n * @param agentId - Agent identifier.\n * @param body - Criteria definition.\n * @returns Created evaluation criteria.\n */\n async createEvaluationCriteria(agentId: string, body: CreateEvaluationCriteriaRequest): Promise<EvaluationCriteriaResponse> {\n return (await this.request(\"POST\", `/agents/${agentId}/evaluation-criteria`, { json: body })) as EvaluationCriteriaResponse;\n }\n\n /**\n * Get a single evaluation criteria by ID.\n *\n * @param criteriaId - Criteria identifier.\n * @returns Evaluation criteria details.\n */\n async getEvaluationCriteria(criteriaId: string): Promise<EvaluationCriteriaResponse> {\n return (await this.request(\"GET\", `/agents/evaluation-criteria/${criteriaId}`)) as EvaluationCriteriaResponse;\n }\n\n /**\n * Update an evaluation criteria.\n *\n * @param criteriaId - Criteria identifier.\n * @param body - Fields to update.\n * @returns Updated evaluation criteria.\n */\n async updateEvaluationCriteria(criteriaId: string, body: UpdateEvaluationCriteriaRequest): Promise<EvaluationCriteriaResponse> {\n return (await this.request(\"PATCH\", `/agents/evaluation-criteria/${criteriaId}`, { json: body })) as EvaluationCriteriaResponse;\n }\n\n /**\n * Delete an evaluation criteria and all associated results.\n *\n * @param criteriaId - Criteria identifier.\n */\n async deleteEvaluationCriteria(criteriaId: string): Promise<void> {\n await this.request(\"DELETE\", `/agents/evaluation-criteria/${criteriaId}`);\n }\n\n /**\n * Get the evaluation summary for a specific criteria.\n *\n * @param criteriaId - Criteria identifier.\n * @returns Evaluation result summary.\n */\n async getEvaluationCriteriaSummary(criteriaId: string): Promise<EvaluationResultSummaryResponse> {\n return (await this.request(\"GET\", `/agents/evaluation-criteria/${criteriaId}/summary`)) as EvaluationResultSummaryResponse;\n }\n\n /**\n * List evaluation results for a specific criteria.\n *\n * @param criteriaId - Criteria identifier.\n * @param opts - Pagination options.\n */\n async listEvaluationResults(criteriaId: string, opts: ListOptions = {}): Promise<EvaluationResultListResponse> {\n return (await this.request(\"GET\", `/agents/evaluation-criteria/${criteriaId}/results`, {\n query: { page: opts.page, limit: opts.limit },\n })) as EvaluationResultListResponse;\n }\n\n /**\n * Create a manual evaluation result for a criteria.\n *\n * @param criteriaId - Criteria identifier.\n * @param body - Evaluation result payload.\n * @returns Created evaluation result.\n */\n async createEvaluationResult(criteriaId: string, body: CreateEvaluationResultRequest): Promise<EvaluationResultResponse> {\n return (await this.request(\"POST\", `/agents/evaluation-criteria/${criteriaId}/results`, { json: body })) as EvaluationResultResponse;\n }\n\n /**\n * List runs compatible with a specific evaluation criteria.\n *\n * @param criteriaId - Criteria identifier.\n * @param opts - Pagination options.\n */\n async listCompatibleRuns(criteriaId: string, opts: ListOptions = {}): Promise<CompatibleRunListResponse> {\n return (await this.request(\"GET\", `/agents/evaluation-criteria/${criteriaId}/compatible-runs`, {\n query: { page: opts.page, limit: opts.limit },\n })) as CompatibleRunListResponse;\n }\n\n /**\n * Test a draft evaluation criteria without persisting it.\n *\n * @param agentId - Agent identifier.\n * @param body - Draft evaluation to test.\n * @returns Test evaluation response.\n */\n async testDraftEvaluation(agentId: string, body: TestDraftEvaluationRequest): Promise<TestDraftEvaluationResponse> {\n return (await this.request(\"POST\", `/agents/${agentId}/evaluation-criteria/test-draft`, { json: body })) as TestDraftEvaluationResponse;\n }\n\n /**\n * List all evaluation results for an agent.\n *\n * @param agentId - Agent identifier.\n * @param opts - Pagination options.\n */\n async listAgentEvaluationResults(agentId: string, opts: ListOptions = {}): Promise<EvaluationResultWithCriteriaListResponse> {\n return (await this.request(\"GET\", `/agents/${agentId}/evaluation-results`, {\n query: { page: opts.page, limit: opts.limit },\n })) as EvaluationResultWithCriteriaListResponse;\n }\n\n /**\n * List evaluation run summaries for an agent.\n *\n * @param agentId - Agent identifier.\n * @param opts - Pagination options.\n */\n async listEvaluationRuns(agentId: string, opts: ListOptions = {}): Promise<EvaluationRunSummaryListResponse> {\n return (await this.request(\"GET\", `/agents/${agentId}/evaluation-runs`, {\n query: { page: opts.page, limit: opts.limit },\n })) as EvaluationRunSummaryListResponse;\n }\n\n /**\n * Get a summary of non-manual evaluations across an agent's runs.\n *\n * @param agentId - Agent identifier.\n */\n async getNonManualEvaluationSummary(agentId: string): Promise<NonManualEvaluationSummaryResponse> {\n return (await this.request(\"GET\", \"/agents/evaluation-results/non-manual-summary\", {\n query: { agent_id: agentId },\n })) as NonManualEvaluationSummaryResponse;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Knowledge Bases\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List knowledge bases.\n *\n * @param opts - Pagination and sorting options.\n * @returns Paginated list of knowledge bases.\n */\n async listKnowledgeBases(opts: SortableListOptions = {}): Promise<KnowledgeBaseListResponse> {\n return (await this.request(\"GET\", \"/knowledge_bases\", {\n query: { page: opts.page, limit: opts.limit, sort: opts.sort, order: opts.order },\n })) as KnowledgeBaseListResponse;\n }\n\n /**\n * Create a new knowledge base.\n *\n * @param body - Knowledge base configuration.\n * @returns The created knowledge base.\n */\n async createKnowledgeBase(body: CreateKnowledgeBaseBody): Promise<KnowledgeBaseResponse> {\n return (await this.request(\"POST\", \"/knowledge_bases\", { json: body })) as KnowledgeBaseResponse;\n }\n\n /**\n * Get a knowledge base by ID.\n *\n * @param knowledgeBaseId - Knowledge base identifier.\n * @returns Knowledge base details.\n */\n async getKnowledgeBase(knowledgeBaseId: string): Promise<KnowledgeBaseResponse> {\n return (await this.request(\"GET\", `/knowledge_bases/${knowledgeBaseId}`)) as KnowledgeBaseResponse;\n }\n\n /**\n * Update a knowledge base.\n *\n * @param knowledgeBaseId - Knowledge base identifier.\n * @param body - Fields to update.\n * @returns Updated knowledge base.\n */\n async updateKnowledgeBase(knowledgeBaseId: string, body: UpdateKnowledgeBaseBody): Promise<KnowledgeBaseResponse> {\n return (await this.request(\"PUT\", `/knowledge_bases/${knowledgeBaseId}`, { json: body })) as KnowledgeBaseResponse;\n }\n\n /**\n * Delete a knowledge base.\n *\n * @param knowledgeBaseId - Knowledge base identifier.\n */\n async deleteKnowledgeBase(knowledgeBaseId: string): Promise<void> {\n await this.request(\"DELETE\", `/knowledge_bases/${knowledgeBaseId}`);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Memory Banks\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List memory banks.\n *\n * @param opts - Pagination and sorting options.\n * @returns Paginated list of memory banks.\n */\n async listMemoryBanks(opts: SortableListOptions = {}): Promise<MemoryBankListResponse> {\n return (await this.request(\"GET\", \"/memory_banks\", {\n query: { page: opts.page, limit: opts.limit, sort: opts.sort, order: opts.order },\n })) as MemoryBankListResponse;\n }\n\n /**\n * Create a new memory bank.\n *\n * Memory banks give agents persistent memory across conversations.\n * Types: `conversation` (chat-style history) or `general` (flat factual entries).\n *\n * @param body - Memory bank configuration.\n * @returns The created memory bank.\n */\n async createMemoryBank(body: CreateMemoryBankBody): Promise<MemoryBankResponse> {\n return (await this.request(\"POST\", \"/memory_banks\", { json: body })) as MemoryBankResponse;\n }\n\n /**\n * Get a memory bank by ID.\n *\n * @param memoryBankId - Memory bank identifier.\n * @returns Memory bank details.\n */\n async getMemoryBank(memoryBankId: string): Promise<MemoryBankResponse> {\n return (await this.request(\"GET\", `/memory_banks/${memoryBankId}`)) as MemoryBankResponse;\n }\n\n /**\n * Update a memory bank.\n *\n * @param memoryBankId - Memory bank identifier.\n * @param body - Fields to update.\n * @returns Updated memory bank.\n */\n async updateMemoryBank(memoryBankId: string, body: UpdateMemoryBankBody): Promise<MemoryBankResponse> {\n return (await this.request(\"PUT\", `/memory_banks/${memoryBankId}`, { json: body })) as MemoryBankResponse;\n }\n\n /**\n * Delete a memory bank.\n *\n * @param memoryBankId - Memory bank identifier.\n */\n async deleteMemoryBank(memoryBankId: string): Promise<void> {\n await this.request(\"DELETE\", `/memory_banks/${memoryBankId}`);\n }\n\n /**\n * Get agents that are using a specific memory bank.\n *\n * @param memoryBankId - Memory bank identifier.\n */\n async getAgentsUsingMemoryBank(memoryBankId: string): Promise<unknown> {\n return await this.request(\"GET\", `/memory_banks/${memoryBankId}/agents`);\n }\n\n /**\n * Get stats for a memory bank.\n *\n * @param memoryBankId - Memory bank identifier.\n */\n async getMemoryBankStats(memoryBankId: string): Promise<unknown> {\n return await this.request(\"GET\", `/memory_banks/${memoryBankId}/stats`);\n }\n\n /**\n * Compact a memory bank (trigger compaction).\n *\n * @param memoryBankId - Memory bank identifier.\n */\n async compactMemoryBank(memoryBankId: string): Promise<void> {\n await this.request(\"POST\", `/memory_banks/${memoryBankId}/compact`);\n }\n\n /**\n * Delete a memory bank source.\n *\n * @param memoryBankId - Memory bank identifier.\n */\n async deleteMemoryBankSource(memoryBankId: string): Promise<void> {\n await this.request(\"DELETE\", `/memory_banks/${memoryBankId}/source`);\n }\n\n /**\n * Test compaction for a specific memory bank.\n *\n * @param memoryBankId - Memory bank identifier.\n * @param body - Test compaction request.\n */\n async testMemoryBankCompaction(memoryBankId: string, body: TestCompactionRequest): Promise<CompactionTestResponse> {\n return (await this.request(\"POST\", `/memory_banks/${memoryBankId}/test-compaction`, { json: body })) as CompactionTestResponse;\n }\n\n /**\n * Test compaction prompt standalone (not tied to a specific memory bank).\n *\n * @param body - Standalone compaction test request.\n */\n async testCompactionPromptStandalone(body: StandaloneTestCompactionRequest): Promise<CompactionTestResponse> {\n return (await this.request(\"POST\", \"/memory_banks/test-compaction\", { json: body })) as CompactionTestResponse;\n }\n\n /**\n * List available memory bank templates.\n */\n async listMemoryBankTemplates(): Promise<unknown> {\n return await this.request(\"GET\", \"/memory_banks/templates\");\n }\n\n // ─── Memory Bank AI Assistant ──────────────────────────────────────────────\n\n /**\n * Generate memory bank configuration using AI.\n *\n * @param body - AI assistant request with user instructions.\n * @returns AI-generated memory bank config.\n */\n async generateMemoryBankConfig(body: MemoryBankAiAssistantRequest): Promise<MemoryBankAiAssistantResponse> {\n return (await this.request(\"POST\", \"/memory_banks/ai-assistant\", { json: body })) as MemoryBankAiAssistantResponse;\n }\n\n /**\n * Get the last AI conversation for memory banks.\n */\n async getMemoryBankAiLastConversation(): Promise<MemoryBankLastConversationResponse> {\n return (await this.request(\"GET\", \"/memory_banks/ai-assistant/last-conversation\")) as MemoryBankLastConversationResponse;\n }\n\n /**\n * Accept a memory bank AI suggestion.\n *\n * @param conversationId - Conversation identifier.\n * @param body - Accept request payload.\n */\n async acceptMemoryBankAiSuggestion(conversationId: string, body: MemoryBankAcceptRequest): Promise<unknown> {\n return await this.request(\"PATCH\", `/memory_banks/ai-assistant/${conversationId}`, { json: body });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Sources\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List sources.\n *\n * @param opts - Pagination, sorting, and filter options.\n * @returns Paginated list of sources.\n */\n async listSources(\n opts: SortableListOptions & { accountId?: string } = {},\n ): Promise<SourceListResponse> {\n return (await this.request(\"GET\", \"/sources/\", {\n query: {\n page: opts.page,\n limit: opts.limit,\n sort: opts.sort,\n order: opts.order,\n account_id: opts.accountId,\n },\n })) as SourceListResponse;\n }\n\n /**\n * Create a new content source.\n *\n * @param body - Source configuration (type, name, knowledge base link, etc.).\n * @returns The created source.\n */\n async createSource(body: CreateSourceBody): Promise<SourceResponse> {\n return (await this.request(\"POST\", \"/sources\", { json: body })) as SourceResponse;\n }\n\n /**\n * Get a source by ID.\n *\n * @param sourceId - Source connection identifier.\n * @returns Source details.\n */\n async getSource(sourceId: string): Promise<SourceResponse> {\n return (await this.request(\"GET\", `/sources/${sourceId}`)) as SourceResponse;\n }\n\n /**\n * Update a source.\n *\n * @param sourceId - Source connection identifier.\n * @param body - Fields to update.\n * @returns Updated source.\n */\n async updateSource(sourceId: string, body: UpdateSourceBody): Promise<SourceResponse> {\n return (await this.request(\"PUT\", `/sources/${sourceId}`, { json: body })) as SourceResponse;\n }\n\n /**\n * Delete a source.\n *\n * @param sourceId - Source connection identifier.\n */\n async deleteSource(sourceId: string): Promise<void> {\n await this.request(\"DELETE\", `/sources/${sourceId}`);\n }\n\n /**\n * Upload a file to a source.\n *\n * Maximum file size: 200 MiB. Supports text, PDF, DOCX, audio, video, images, and more.\n * If `mimeType` is omitted, it will be inferred from the `fileName` extension when possible.\n *\n * @param sourceId - Source connection identifier.\n * @param opts - File payload and optional metadata.\n * @returns Upload response details.\n */\n async uploadFileToSource(\n sourceId: string,\n opts: {\n file: Blob | Uint8Array | ArrayBuffer | BufferSource;\n title?: string;\n metadata?: Record<string, unknown>;\n fileName?: string;\n mimeType?: string;\n },\n ): Promise<FileUploadResponse> {\n return (await this.uploadFile(`/sources/${sourceId}/upload`, opts)) as FileUploadResponse;\n }\n\n /**\n * Upload inline text to a source.\n *\n * @param sourceId - Source connection identifier.\n * @param body - Inline text upload payload.\n * @returns Upload response.\n */\n async uploadInlineTextToSource(sourceId: string, body: InlineTextUploadRequest): Promise<FileUploadResponse> {\n return (await this.request(\"POST\", `/sources/${sourceId}`, { json: body })) as FileUploadResponse;\n }\n\n // ─── Source Exports ────────────────────────────────────────────────────────\n\n /**\n * List exports for a source.\n *\n * @param sourceId - Source connection identifier.\n * @param opts - Pagination options.\n * @returns Paginated list of exports.\n */\n async listSourceExports(sourceId: string, opts: ListOptions = {}): Promise<ExportListResponse> {\n return (await this.request(\"GET\", `/sources/${sourceId}/exports`, {\n query: { page: opts.page, limit: opts.limit },\n })) as ExportListResponse;\n }\n\n /**\n * Create a source data export.\n *\n * @param sourceId - Source connection identifier.\n * @param body - Export configuration (format, etc.).\n * @returns Export response with job status.\n */\n async createSourceExport(sourceId: string, body: CreateExportRequest): Promise<ExportResponse> {\n return (await this.request(\"POST\", `/sources/${sourceId}/exports`, { json: body })) as ExportResponse;\n }\n\n /**\n * Get a specific source export.\n *\n * @param sourceId - Source connection identifier.\n * @param exportId - Export identifier.\n * @returns Export details.\n */\n async getSourceExport(sourceId: string, exportId: string): Promise<ExportResponse> {\n return (await this.request(\"GET\", `/sources/${sourceId}/exports/${exportId}`)) as ExportResponse;\n }\n\n /**\n * Cancel a source export.\n *\n * @param sourceId - Source connection identifier.\n * @param exportId - Export identifier.\n */\n async cancelSourceExport(sourceId: string, exportId: string): Promise<ExportResponse> {\n return (await this.request(\"POST\", `/sources/${sourceId}/exports/${exportId}/cancel`)) as ExportResponse;\n }\n\n /**\n * Download a source export file.\n *\n * Returns the raw `Response` so you can stream or save the binary data.\n *\n * @param sourceId - Source connection identifier.\n * @param exportId - Export identifier.\n * @returns Raw response with the export file.\n */\n async downloadSourceExport(sourceId: string, exportId: string): Promise<Response> {\n return await this.requestRaw(\"GET\", `/sources/${sourceId}/exports/${exportId}/download`);\n }\n\n /**\n * Estimate a source export.\n *\n * @param sourceId - Source connection identifier.\n * @param body - Estimate request.\n * @returns Export estimate.\n */\n async estimateSourceExport(sourceId: string, body: EstimateExportRequest): Promise<EstimateExportResponse> {\n return (await this.request(\"POST\", `/sources/${sourceId}/exports/estimate`, { json: body })) as EstimateExportResponse;\n }\n\n /**\n * Delete a source export.\n *\n * @param sourceId - Source connection identifier.\n * @param exportId - Export identifier.\n */\n async deleteSourceExport(sourceId: string, exportId: string): Promise<void> {\n await this.request(\"DELETE\", `/sources/${sourceId}/exports/${exportId}`);\n }\n\n // ─── Source Embedding Migrations ───────────────────────────────────────────\n\n /**\n * Get the status of a source embedding migration.\n *\n * @param sourceId - Source connection identifier.\n * @returns Migration status.\n */\n async getSourceEmbeddingMigration(sourceId: string): Promise<SourceEmbeddingMigrationResponse> {\n return (await this.request(\"GET\", `/sources/${sourceId}/embedding-migration`)) as SourceEmbeddingMigrationResponse;\n }\n\n /**\n * Start a source embedding migration.\n *\n * @param sourceId - Source connection identifier.\n * @param body - Migration configuration (target embedding model, etc.).\n * @returns Migration status.\n */\n async startSourceEmbeddingMigration(sourceId: string, body: StartSourceEmbeddingMigrationRequest): Promise<SourceEmbeddingMigrationResponse> {\n return (await this.request(\"POST\", `/sources/${sourceId}/embedding-migration`, { json: body })) as SourceEmbeddingMigrationResponse;\n }\n\n /**\n * Cancel a source embedding migration.\n *\n * @param sourceId - Source connection identifier.\n * @returns Updated migration status.\n */\n async cancelSourceEmbeddingMigration(sourceId: string): Promise<SourceEmbeddingMigrationResponse> {\n return (await this.request(\"POST\", `/sources/${sourceId}/embedding-migration/cancel`)) as SourceEmbeddingMigrationResponse;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Content\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Get content detail for a specific content version.\n *\n * @param contentVersionId - Content version identifier.\n * @param opts - Range options for slicing large content.\n * @returns Content details for the requested range.\n */\n async getContentDetail(\n contentVersionId: string,\n opts: { start?: number; end?: number } = {},\n ): Promise<ContentDetailResponse> {\n return (await this.request(\"GET\", `/contents/${contentVersionId}`, {\n query: { start: opts.start ?? 0, end: opts.end ?? 5000 },\n })) as ContentDetailResponse;\n }\n\n /**\n * Replace content with inline text.\n *\n * @param contentVersionId - Content version identifier.\n * @param body - Inline text replacement payload.\n */\n async replaceContentWithInlineText(contentVersionId: string, body: InlineTextReplaceRequest): Promise<ContentFileUploadResponse> {\n return (await this.request(\"PUT\", `/contents/${contentVersionId}`, { json: body })) as ContentFileUploadResponse;\n }\n\n /**\n * Delete a specific content version.\n *\n * @param contentVersionId - Content version identifier.\n */\n async deleteContent(contentVersionId: string): Promise<void> {\n await this.request(\"DELETE\", `/contents/${contentVersionId}`);\n }\n\n /**\n * List embeddings for a content version.\n *\n * @param contentVersionId - Content version identifier.\n * @param opts - Pagination options.\n * @returns Paginated list of embeddings.\n */\n async listContentEmbeddings(\n contentVersionId: string,\n opts: ListOptions = {},\n ): Promise<ContentEmbeddingsListResponse> {\n return (await this.request(\"GET\", `/contents/${contentVersionId}/embeddings`, {\n query: { page: opts.page ?? 1, limit: opts.limit ?? 20 },\n })) as ContentEmbeddingsListResponse;\n }\n\n /**\n * Upload a file to replace content for an existing content version.\n *\n * @param contentVersionId - Content version identifier.\n * @param opts - File payload and optional metadata.\n * @returns Upload response.\n */\n async uploadFileToContent(\n contentVersionId: string,\n opts: {\n file: Blob | Uint8Array | ArrayBuffer | BufferSource;\n title?: string;\n metadata?: Record<string, unknown>;\n fileName?: string;\n mimeType?: string;\n },\n ): Promise<ContentFileUploadResponse> {\n return (await this.uploadFile(`/contents/${contentVersionId}/upload`, opts)) as ContentFileUploadResponse;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Solutions\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List solutions.\n *\n * @param opts - Pagination and sorting options.\n * @returns Paginated list of solutions.\n */\n async listSolutions(opts: SortableListOptions = {}): Promise<SolutionListResponse> {\n return (await this.request(\"GET\", \"/solutions\", {\n query: { page: opts.page, limit: opts.limit, sort: opts.sort, order: opts.order },\n })) as SolutionListResponse;\n }\n\n /**\n * Create a new solution.\n *\n * @param body - Solution configuration.\n * @returns The created solution.\n */\n async createSolution(body: CreateSolutionRequest): Promise<SolutionResponse> {\n return (await this.request(\"POST\", \"/solutions\", { json: body })) as SolutionResponse;\n }\n\n /**\n * Get a solution by ID.\n *\n * @param solutionId - Solution identifier.\n * @returns Solution details.\n */\n async getSolution(solutionId: string): Promise<SolutionResponse> {\n return (await this.request(\"GET\", `/solutions/${solutionId}`)) as SolutionResponse;\n }\n\n /**\n * Update a solution.\n *\n * @param solutionId - Solution identifier.\n * @param body - Fields to update.\n * @returns Updated solution.\n */\n async updateSolution(solutionId: string, body: UpdateSolutionRequest): Promise<SolutionResponse> {\n return (await this.request(\"PATCH\", `/solutions/${solutionId}`, { json: body })) as SolutionResponse;\n }\n\n /**\n * Delete a solution.\n *\n * @param solutionId - Solution identifier.\n */\n async deleteSolution(solutionId: string): Promise<void> {\n await this.request(\"DELETE\", `/solutions/${solutionId}`);\n }\n\n // ─── Solution Resource Linking ─────────────────────────────────────────────\n\n /**\n * Link agents to a solution.\n *\n * @param solutionId - Solution identifier.\n * @param body - Resource IDs to link.\n * @returns Updated solution.\n */\n async linkAgentsToSolution(solutionId: string, body: LinkResourcesRequest): Promise<SolutionResponse> {\n return (await this.request(\"POST\", `/solutions/${solutionId}/agents`, { json: body })) as SolutionResponse;\n }\n\n /**\n * Unlink agents from a solution.\n *\n * @param solutionId - Solution identifier.\n * @param body - Resource IDs to unlink.\n * @returns Updated solution.\n */\n async unlinkAgentsFromSolution(solutionId: string, body: UnlinkResourcesRequest): Promise<SolutionResponse> {\n return (await this.request(\"DELETE\", `/solutions/${solutionId}/agents`, { json: body })) as SolutionResponse;\n }\n\n /**\n * Link knowledge bases to a solution.\n *\n * @param solutionId - Solution identifier.\n * @param body - Resource IDs to link.\n * @returns Updated solution.\n */\n async linkKnowledgeBasesToSolution(solutionId: string, body: LinkResourcesRequest): Promise<SolutionResponse> {\n return (await this.request(\"POST\", `/solutions/${solutionId}/knowledge-bases`, { json: body })) as SolutionResponse;\n }\n\n /**\n * Unlink knowledge bases from a solution.\n *\n * @param solutionId - Solution identifier.\n * @param body - Resource IDs to unlink.\n * @returns Updated solution.\n */\n async unlinkKnowledgeBasesFromSolution(solutionId: string, body: UnlinkResourcesRequest): Promise<SolutionResponse> {\n return (await this.request(\"DELETE\", `/solutions/${solutionId}/knowledge-bases`, { json: body })) as SolutionResponse;\n }\n\n /**\n * Link source connections to a solution.\n *\n * @param solutionId - Solution identifier.\n * @param body - Resource IDs to link.\n * @returns Updated solution.\n */\n async linkSourceConnectionsToSolution(solutionId: string, body: LinkResourcesRequest): Promise<SolutionResponse> {\n return (await this.request(\"POST\", `/solutions/${solutionId}/source-connections`, { json: body })) as SolutionResponse;\n }\n\n /**\n * Unlink source connections from a solution.\n *\n * @param solutionId - Solution identifier.\n * @param body - Resource IDs to unlink.\n * @returns Updated solution.\n */\n async unlinkSourceConnectionsFromSolution(solutionId: string, body: UnlinkResourcesRequest): Promise<SolutionResponse> {\n return (await this.request(\"DELETE\", `/solutions/${solutionId}/source-connections`, { json: body })) as SolutionResponse;\n }\n\n // ─── Solution Conversations ────────────────────────────────────────────────\n\n /**\n * List conversations for a solution.\n *\n * @param solutionId - Solution identifier.\n * @returns List of conversations.\n */\n async listSolutionConversations(solutionId: string): Promise<SolutionConversationResponse[]> {\n return (await this.request(\"GET\", `/solutions/${solutionId}/conversations`)) as SolutionConversationResponse[];\n }\n\n /**\n * Add a conversation turn to a solution.\n *\n * @param solutionId - Solution identifier.\n * @param body - Conversation turn payload.\n * @returns Updated conversation.\n */\n async addSolutionConversationTurn(solutionId: string, body: AddConversationTurnRequest): Promise<SolutionConversationResponse> {\n return (await this.request(\"POST\", `/solutions/${solutionId}/conversations`, { json: body })) as SolutionConversationResponse;\n }\n\n /**\n * Mark a conversation turn (e.g. accepted/rejected).\n *\n * @param solutionId - Solution identifier.\n * @param conversationId - Conversation identifier.\n * @param body - Mark payload.\n */\n async markSolutionConversationTurn(solutionId: string, conversationId: string, body: MarkConversationTurnRequest): Promise<void> {\n await this.request(\"PATCH\", `/solutions/${solutionId}/conversations/${conversationId}`, { json: body });\n }\n\n // ─── Solution AI Assistant ─────────────────────────────────────────────────\n\n /**\n * Generate a solution AI plan.\n *\n * @param solutionId - Solution identifier.\n * @param body - Generation request.\n * @returns AI-generated plan.\n */\n async generateSolutionAiPlan(solutionId: string, body: AiAssistantGenerateRequest): Promise<AiAssistantGenerateResponse> {\n return (await this.request(\"POST\", `/solutions/${solutionId}/ai-assistant/generate`, { json: body })) as AiAssistantGenerateResponse;\n }\n\n /**\n * Generate a knowledge base configuration via solution AI.\n *\n * @param solutionId - Solution identifier.\n * @param body - Generation request.\n * @returns AI-generated knowledge base config.\n */\n async generateSolutionAiKnowledgeBase(solutionId: string, body: AiAssistantGenerateRequest): Promise<AiAssistantGenerateResponse> {\n return (await this.request(\"POST\", `/solutions/${solutionId}/ai-assistant/knowledge-base`, { json: body })) as AiAssistantGenerateResponse;\n }\n\n /**\n * Generate a source configuration via solution AI.\n *\n * @param solutionId - Solution identifier.\n * @param body - Generation request.\n * @returns AI-generated source config.\n */\n async generateSolutionAiSource(solutionId: string, body: AiAssistantGenerateRequest): Promise<AiAssistantGenerateResponse> {\n return (await this.request(\"POST\", `/solutions/${solutionId}/ai-assistant/source`, { json: body })) as AiAssistantGenerateResponse;\n }\n\n /**\n * Accept a solution AI plan.\n *\n * @param solutionId - Solution identifier.\n * @param conversationId - Conversation identifier.\n * @param body - Accept request.\n * @returns Acceptance result with executed actions.\n */\n async acceptSolutionAiPlan(solutionId: string, conversationId: string, body: AiAssistantAcceptRequest): Promise<AiAssistantAcceptResponse> {\n return (await this.request(\"POST\", `/solutions/${solutionId}/ai-assistant/${conversationId}/accept`, { json: body })) as AiAssistantAcceptResponse;\n }\n\n /**\n * Decline a solution AI plan.\n *\n * @param solutionId - Solution identifier.\n * @param conversationId - Conversation identifier.\n */\n async declineSolutionAiPlan(solutionId: string, conversationId: string): Promise<void> {\n await this.request(\"POST\", `/solutions/${solutionId}/ai-assistant/${conversationId}/decline`);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Governance — AI Assistant\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Generate governance policy suggestions using AI.\n *\n * @param body - AI governance request.\n * @returns AI-generated governance suggestions.\n */\n async generateGovernanceAiPlan(body: GovernanceAiAssistantRequest): Promise<GovernanceAiAssistantResponse> {\n return (await this.request(\"POST\", \"/governance/ai-assistant\", { json: body })) as GovernanceAiAssistantResponse;\n }\n\n /**\n * List governance AI conversations.\n */\n async listGovernanceAiConversations(): Promise<GovernanceConversationResponse[]> {\n return (await this.request(\"GET\", \"/governance/ai-assistant/conversations\")) as GovernanceConversationResponse[];\n }\n\n /**\n * Accept a governance AI plan.\n *\n * @param conversationId - Conversation identifier.\n * @returns Acceptance result.\n */\n async acceptGovernanceAiPlan(conversationId: string): Promise<GovernanceAiAcceptResponse> {\n return (await this.request(\"POST\", `/governance/ai-assistant/${conversationId}/accept`)) as GovernanceAiAcceptResponse;\n }\n\n /**\n * Decline a governance AI plan.\n *\n * @param conversationId - Conversation identifier.\n */\n async declineGovernanceAiPlan(conversationId: string): Promise<void> {\n await this.request(\"POST\", `/governance/ai-assistant/${conversationId}/decline`);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Alerts\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List alerts.\n *\n * @param opts - Pagination and filter options.\n * @returns Paginated list of alerts.\n */\n async listAlerts(opts: ListOptions & { status?: string; severity?: string } = {}): Promise<unknown> {\n return await this.request(\"GET\", \"/alerts\", {\n query: { page: opts.page, limit: opts.limit, status: opts.status, severity: opts.severity },\n });\n }\n\n /**\n * Get alert details by ID.\n *\n * @param alertId - Alert identifier.\n * @returns Alert details.\n */\n async getAlert(alertId: string): Promise<unknown> {\n return await this.request(\"GET\", `/alerts/${alertId}`);\n }\n\n /**\n * Change the status of an alert.\n *\n * @param alertId - Alert identifier.\n * @param body - Status change request.\n */\n async changeAlertStatus(alertId: string, body: ChangeStatusRequest): Promise<unknown> {\n return await this.request(\"POST\", `/alerts/${alertId}/status`, { json: body });\n }\n\n /**\n * Add a comment to an alert.\n *\n * @param alertId - Alert identifier.\n * @param body - Comment payload.\n */\n async addAlertComment(alertId: string, body: AddCommentRequest): Promise<unknown> {\n return await this.request(\"POST\", `/alerts/${alertId}/comments`, { json: body });\n }\n\n /**\n * Subscribe to an alert.\n *\n * @param alertId - Alert identifier.\n */\n async subscribeToAlert(alertId: string): Promise<unknown> {\n return await this.request(\"POST\", `/alerts/${alertId}/subscribe`);\n }\n\n /**\n * Unsubscribe from an alert.\n *\n * @param alertId - Alert identifier.\n */\n async unsubscribeFromAlert(alertId: string): Promise<unknown> {\n return await this.request(\"POST\", `/alerts/${alertId}/unsubscribe`);\n }\n\n // ─── Alert Configs ─────────────────────────────────────────────────────────\n\n /**\n * List alert configurations.\n *\n * @param opts - Pagination options.\n * @returns Paginated list of alert configs.\n */\n async listAlertConfigs(opts: ListOptions = {}): Promise<unknown> {\n return await this.request(\"GET\", \"/alerts/configs\", {\n query: { page: opts.page, limit: opts.limit },\n });\n }\n\n /**\n * Create an alert configuration.\n *\n * @param body - Alert config definition.\n * @returns Created alert config.\n */\n async createAlertConfig(body: CreateAlertConfigRequest): Promise<unknown> {\n return await this.request(\"POST\", \"/alerts/configs\", { json: body });\n }\n\n /**\n * Get an alert configuration by ID.\n *\n * @param configId - Alert config identifier.\n * @returns Alert config details.\n */\n async getAlertConfig(configId: string): Promise<unknown> {\n return await this.request(\"GET\", `/alerts/configs/${configId}`);\n }\n\n /**\n * Update an alert configuration.\n *\n * @param configId - Alert config identifier.\n * @param body - Fields to update.\n * @returns Updated alert config.\n */\n async updateAlertConfig(configId: string, body: UpdateAlertConfigRequest): Promise<unknown> {\n return await this.request(\"PATCH\", `/alerts/configs/${configId}`, { json: body });\n }\n\n /**\n * Delete an alert configuration.\n *\n * @param configId - Alert config identifier.\n */\n async deleteAlertConfig(configId: string): Promise<void> {\n await this.request(\"DELETE\", `/alerts/configs/${configId}`);\n }\n\n // ─── Organization Alert Preferences ────────────────────────────────────────\n\n /**\n * List organization alert preferences.\n */\n async listOrganizationAlertPreferences(): Promise<OrganizationAlertPreferenceListResponse> {\n return (await this.request(\"GET\", \"/alerts/organization-preferences/list\")) as OrganizationAlertPreferenceListResponse;\n }\n\n /**\n * Update an organization alert preference.\n *\n * @param organizationId - Organization identifier.\n * @param alertType - Alert type.\n * @param body - Preference update.\n */\n async updateOrganizationAlertPreference(\n organizationId: string,\n alertType: string,\n body: UpdateOrganizationAlertPreferenceRequest,\n ): Promise<unknown> {\n return await this.request(\"PATCH\", `/alerts/organization-preferences/${organizationId}/${alertType}`, { json: body });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Models & Model Alerts\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List model alerts.\n *\n * @param opts - Pagination options.\n */\n async listModelAlerts(opts: ListOptions = {}): Promise<unknown> {\n return await this.request(\"GET\", \"/models/alerts\", {\n query: { page: opts.page, limit: opts.limit },\n });\n }\n\n /**\n * Mark all model alerts as read.\n */\n async markAllModelAlertsRead(): Promise<void> {\n await this.request(\"POST\", \"/models/alerts/mark-all-read\");\n }\n\n /**\n * Get unread model alert count.\n */\n async getUnreadModelAlertCount(): Promise<unknown> {\n return await this.request(\"GET\", \"/models/alerts/unread-count\");\n }\n\n /**\n * Mark a specific model alert as read.\n *\n * @param alertId - Model alert identifier.\n */\n async markModelAlertRead(alertId: string): Promise<void> {\n await this.request(\"PATCH\", `/models/alerts/${alertId}/read`);\n }\n\n /**\n * Get model recommendations.\n *\n * @param modelId - Model identifier.\n */\n async getModelRecommendations(modelId: string): Promise<unknown> {\n return await this.request(\"GET\", `/models/${modelId}/recommendations`);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Search\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Search across all resource types in your account.\n *\n * Accepts a free-text keyword query or a UUID. Results are ranked:\n * name-prefix > name-substring > description-substring.\n *\n * @param opts - Search options.\n * @param opts.query - Search query string (required, 1-200 chars).\n * @param opts.limit - Maximum results (1-50, default 10).\n * @param opts.entityType - Optional entity type filter (e.g. \"agent\", \"knowledge_base\").\n * @returns Search results.\n */\n async search(opts: { query: string; limit?: number; entityType?: string }): Promise<unknown> {\n return await this.request(\"GET\", \"/search\", {\n query: { q: opts.query, limit: opts.limit, entity_type: opts.entityType },\n });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Top-Level AI Assistant\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Submit feedback on an AI assistant interaction.\n *\n * @param body - Feedback payload (thumbs up/down, optional comment).\n * @returns Feedback response.\n */\n async submitAiFeedback(body: AiAssistantFeedbackRequest): Promise<AiAssistantFeedbackResponse> {\n return (await this.request(\"POST\", \"/ai-assistant/feedback\", { json: body })) as AiAssistantFeedbackResponse;\n }\n\n /**\n * Generate a knowledge base configuration via AI assistant.\n *\n * @param body - Generation request.\n */\n async aiAssistantKnowledgeBase(body: AiAssistantGenerateRequest): Promise<AiAssistantGenerateResponse> {\n return (await this.request(\"POST\", \"/ai-assistant/knowledge-base\", { json: body })) as AiAssistantGenerateResponse;\n }\n\n /**\n * Generate a source configuration via AI assistant.\n *\n * @param body - Generation request.\n */\n async aiAssistantSource(body: AiAssistantGenerateRequest): Promise<AiAssistantGenerateResponse> {\n return (await this.request(\"POST\", \"/ai-assistant/source\", { json: body })) as AiAssistantGenerateResponse;\n }\n\n /**\n * Generate a solution via AI assistant.\n *\n * @param body - Generation request.\n */\n async aiAssistantSolution(body: AiAssistantGenerateRequest): Promise<AiAssistantGenerateResponse> {\n return (await this.request(\"POST\", \"/ai-assistant/solution\", { json: body })) as AiAssistantGenerateResponse;\n }\n\n /**\n * Generate a memory bank configuration via AI assistant.\n *\n * @param body - Generation request.\n */\n async aiAssistantMemoryBank(body: AiAssistantGenerateRequest): Promise<MemoryBankAiAssistantResponse> {\n return (await this.request(\"POST\", \"/ai-assistant/memory-bank\", { json: body })) as MemoryBankAiAssistantResponse;\n }\n\n /**\n * Get AI assistant memory bank conversation history.\n */\n async getAiAssistantMemoryBankHistory(): Promise<MemoryBankLastConversationResponse> {\n return (await this.request(\"GET\", \"/ai-assistant/memory-bank/last-conversation\")) as MemoryBankLastConversationResponse;\n }\n\n /**\n * Accept an AI assistant suggestion.\n *\n * @param conversationId - Conversation identifier.\n * @param body - Acceptance request payload.\n */\n async acceptAiAssistantPlan(conversationId: string, body: AiAssistantAcceptRequest): Promise<AiAssistantAcceptResponse> {\n return (await this.request(\"POST\", `/ai-assistant/${conversationId}/accept`, { json: body })) as AiAssistantAcceptResponse;\n }\n\n /**\n * Decline an AI assistant suggestion.\n *\n * @param conversationId - Conversation identifier.\n */\n async declineAiAssistantPlan(conversationId: string): Promise<void> {\n await this.request(\"POST\", `/ai-assistant/${conversationId}/decline`);\n }\n\n /**\n * Accept/mark an AI memory bank suggestion.\n *\n * @param conversationId - Conversation identifier.\n * @param body - Acceptance payload for the memory bank suggestion.\n */\n async acceptAiMemoryBankSuggestion(conversationId: string, body: MemoryBankAcceptRequest): Promise<unknown> {\n return await this.request(\"PATCH\", `/ai-assistant/memory-bank/${conversationId}`, { json: body });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Pagination Helpers\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Auto-paginate through a list endpoint.\n *\n * Yields individual items from each page, automatically fetching the next page\n * until all items have been returned.\n *\n * @param fetchPage - A function that fetches a single page given `{ page, limit }`.\n * @param opts - Page size (default: 50).\n *\n * @example\n * ```ts\n * for await (const agent of client.paginate(\n * (opts) => client.listAgents(opts),\n * )) {\n * console.log(agent);\n * }\n * ```\n */\n async *paginate<T>(\n fetchPage: (opts: { page: number; limit: number }) => Promise<{ items: T[]; pagination?: { page: number; total_pages: number } }>,\n opts?: { limit?: number },\n ): AsyncGenerator<T, void, undefined> {\n const limit = opts?.limit ?? 50;\n let page = 1;\n\n while (true) {\n const result = await fetchPage({ page, limit });\n for (const item of result.items) {\n yield item;\n }\n\n if (\n !result.pagination ||\n result.items.length < limit ||\n page >= result.pagination.total_pages\n ) {\n break;\n }\n page++;\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/auth.ts","../src/client.ts"],"sourcesContent":["/**\n * @module\n *\n * Seclai JavaScript/TypeScript SDK.\n *\n * ```ts\n * import { Seclai } from \"@seclai/sdk\";\n *\n * const client = new Seclai({ apiKey: process.env.SECLAI_API_KEY });\n * const agents = await client.listAgents();\n * ```\n *\n * @see {@link Seclai} for the main client class.\n * @packageDocumentation\n */\nexport {\n Seclai,\n SECLAI_API_URL,\n type SeclaiOptions,\n type FetchLike,\n type AccessTokenProvider,\n} from \"./client\";\n\nexport {\n type SsoProfile,\n type SsoCacheEntry,\n type AuthState,\n type CredentialChainOptions,\n} from \"./auth\";\n\nexport {\n SeclaiError,\n SeclaiConfigurationError,\n SeclaiAPIStatusError,\n SeclaiAPIValidationError,\n SeclaiStreamingError,\n} from \"./errors\";\n\nexport type {\n // General\n JSONValue,\n HTTPValidationError,\n ValidationError,\n PaginationResponse,\n ListOptions,\n SortableListOptions,\n\n // Agents\n AgentListResponse,\n AgentDefinitionResponse,\n AgentSummaryResponse,\n CreateAgentRequest,\n UpdateAgentRequest,\n UpdateAgentDefinitionRequest,\n\n // Agent Runs\n AgentRunRequest,\n AgentRunStreamRequest,\n AgentRunResponse,\n AgentRunListResponse,\n AgentRunStepResponse,\n AgentRunAttemptResponse,\n AgentTraceSearchRequest,\n AgentTraceSearchResponse,\n AgentTraceMatchResponse,\n AgentRunEvent,\n\n // Agent Input Uploads\n UploadAgentInputApiResponse,\n\n // Agent AI Assistant\n GenerateAgentStepsRequest,\n GenerateAgentStepsResponse,\n GenerateStepConfigRequest,\n GenerateStepConfigResponse,\n ExamplePrompt,\n MarkAiSuggestionRequest,\n AiConversationHistoryResponse,\n AiConversationTurnResponse,\n\n // Agent Evaluations\n AgentEvaluationTier,\n EvaluationCriteriaResponse,\n CreateEvaluationCriteriaRequest,\n UpdateEvaluationCriteriaRequest,\n EvaluationResultResponse,\n EvaluationResultListResponse,\n CreateEvaluationResultRequest,\n EvaluationResultSummaryResponse,\n EvaluationResultWithCriteriaResponse,\n EvaluationResultWithCriteriaListResponse,\n EvaluationRunSummaryResponse,\n EvaluationRunSummaryListResponse,\n EvaluationStatus,\n NonManualEvaluationSummaryResponse,\n NonManualEvaluationModeStatResponse,\n TestDraftEvaluationRequest,\n TestDraftEvaluationResponse,\n CompatibleRunListResponse,\n CompatibleRunResponse,\n\n // Knowledge Bases\n KnowledgeBaseListResponse,\n KnowledgeBaseResponse,\n CreateKnowledgeBaseBody,\n UpdateKnowledgeBaseBody,\n\n // Memory Banks\n MemoryBankListResponse,\n MemoryBankResponse,\n CreateMemoryBankBody,\n UpdateMemoryBankBody,\n MemoryBankAiAssistantRequest,\n MemoryBankAiAssistantResponse,\n MemoryBankAcceptRequest,\n MemoryBankConfigResponse,\n MemoryBankLastConversationResponse,\n MemoryBankConversationTurnResponse,\n TestCompactionRequest,\n CompactionTestResponse,\n CompactionEvaluationModel,\n StandaloneTestCompactionRequest,\n\n // Sources\n SourceListResponse,\n SourceResponse,\n SourceConnectionResponse,\n CreateSourceBody,\n UpdateSourceBody,\n FileUploadResponse,\n InlineTextUploadRequest,\n InlineTextReplaceRequest,\n\n // Source Exports\n ExportListResponse,\n ExportResponse,\n CreateExportRequest,\n EstimateExportRequest,\n EstimateExportResponse,\n ExportFormat,\n\n // Source Embedding Migrations\n SourceEmbeddingMigrationResponse,\n StartSourceEmbeddingMigrationRequest,\n\n // Content\n ContentDetailResponse,\n ContentEmbeddingsListResponse,\n ContentEmbeddingResponse,\n ContentFileUploadResponse,\n\n // Solutions\n SolutionListResponse,\n SolutionResponse,\n SolutionSummaryResponse,\n CreateSolutionRequest,\n UpdateSolutionRequest,\n SolutionAgentResponse,\n SolutionKnowledgeBaseResponse,\n SolutionSourceConnectionResponse,\n SolutionConversationResponse,\n AddConversationTurnRequest,\n MarkConversationTurnRequest,\n AiAssistantGenerateRequest,\n AiAssistantGenerateResponse,\n AiAssistantAcceptRequest,\n AiAssistantAcceptResponse,\n ProposedActionResponse,\n ExecutedActionResponse,\n\n // Resource Linking\n LinkResourcesRequest,\n UnlinkResourcesRequest,\n\n // Governance\n GovernanceAiAssistantRequest,\n GovernanceAiAssistantResponse,\n GovernanceAiAcceptResponse,\n GovernanceConversationResponse,\n GovernanceProposedPolicyActionResponse,\n GovernanceAppliedActionResponse,\n\n // Alerts\n CreateAlertConfigRequest,\n UpdateAlertConfigRequest,\n ChangeStatusRequest,\n AddCommentRequest,\n OrganizationAlertPreferenceResponse,\n OrganizationAlertPreferenceListResponse,\n UpdateOrganizationAlertPreferenceRequest,\n\n // AI Assistant (top-level)\n AiAssistantFeedbackRequest,\n AiAssistantFeedbackResponse,\n\n // Models\n PromptModelAutoUpgradeStrategy,\n\n // Enums\n PendingProcessingCompletedFailedStatus,\n} from \"./types\";\n","/**\n * @module\n *\n * Error classes thrown by the Seclai SDK.\n *\n * All errors extend {@link SeclaiError}, so a single `catch (err instanceof SeclaiError)`\n * handles every SDK error. Narrow to more specific subclasses for finer handling.\n */\n\n/** Base error class for the Seclai SDK. */\nexport class SeclaiError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SeclaiError\";\n }\n}\n\n/** Thrown when the SDK is misconfigured (for example, missing API key). */\nexport class SeclaiConfigurationError extends SeclaiError {\n constructor(message: string) {\n super(message);\n this.name = \"SeclaiConfigurationError\";\n }\n}\n\n/**\n * Thrown when the API returns a non-success status code.\n *\n * @remarks\n * Use {@link SeclaiAPIValidationError} for HTTP 422 validation errors.\n */\nexport class SeclaiAPIStatusError extends SeclaiError {\n /** HTTP status code returned by the API. */\n public readonly statusCode: number;\n /** HTTP method used for the request. */\n public readonly method: string;\n /** Full request URL. */\n public readonly url: string;\n /** Best-effort response body text (if available). */\n public readonly responseText: string | undefined;\n\n constructor(opts: {\n /** Human-readable error message. */\n message: string;\n statusCode: number;\n method: string;\n url: string;\n responseText: string | undefined;\n }) {\n super(opts.message);\n this.name = \"SeclaiAPIStatusError\";\n this.statusCode = opts.statusCode;\n this.method = opts.method;\n this.url = opts.url;\n this.responseText = opts.responseText;\n }\n}\n\n/**\n * Thrown when the API returns a validation error response (typically HTTP 422).\n *\n * The `validationError` field contains the decoded validation payload when available.\n */\nexport class SeclaiAPIValidationError extends SeclaiAPIStatusError {\n /** Parsed validation error payload (best-effort). */\n public readonly validationError: unknown;\n\n constructor(opts: {\n message: string;\n statusCode: number;\n method: string;\n url: string;\n responseText: string | undefined;\n validationError: unknown;\n }) {\n super(opts);\n this.name = \"SeclaiAPIValidationError\";\n this.validationError = opts.validationError;\n }\n}\n\n/** Thrown when a streaming operation fails (e.g. stream ends unexpectedly). */\nexport class SeclaiStreamingError extends SeclaiError {\n /** The run ID associated with the failed stream, when available. */\n public readonly runId: string | undefined;\n\n constructor(message: string, runId?: string) {\n super(message);\n this.name = \"SeclaiStreamingError\";\n this.runId = runId;\n }\n}\n","/**\n * @module\n *\n * SSO credential resolution: config file parsing, token caching, and automatic\n * token refresh against AWS Cognito.\n *\n * @internal — not part of the public API surface. Consumed by {@link Seclai}.\n */\nimport type { FetchLike } from \"./client\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/** Resolved SSO profile settings. */\nexport interface SsoProfile {\n ssoAccountId: string;\n ssoRegion: string;\n ssoClientId: string;\n ssoDomain: string;\n}\n\n/** Contents of a single SSO cache file. */\nexport interface SsoCacheEntry {\n accessToken: string;\n refreshToken?: string;\n idToken?: string | undefined;\n expiresAt: string; // ISO-8601\n clientId: string;\n region: string;\n cognitoDomain: string;\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst DEFAULT_CONFIG_DIR = \".seclai\";\nconst SSO_CACHE_DIR = \"sso/cache\";\nconst CONFIG_FILE = \"config\";\nconst EXPIRY_BUFFER_MS = 30_000; // 30 seconds\nconst DEFAULT_API_KEY_HEADER = \"x-api-key\";\n\n// ─── Environment helpers ─────────────────────────────────────────────────────\n\nfunction getEnv(name: string): string | undefined {\n const p = (globalThis as any)?.process;\n return p?.env?.[name];\n}\n\nfunction getHomeDir(): string | undefined {\n const p = (globalThis as any)?.process;\n return p?.env?.HOME ?? p?.env?.USERPROFILE;\n}\n\n// ─── SHA-1 hash ──────────────────────────────────────────────────────────────\n\nasync function sha1Hex(input: string): Promise<string> {\n // Prefer Node.js crypto when available\n try {\n // @ts-expect-error -- resolved at runtime; no @types/node in this package\n const { createHash } = await import(\"node:crypto\");\n return createHash(\"sha1\").update(input).digest(\"hex\");\n } catch {\n // Fall back to Web Crypto API\n const encoded = new TextEncoder().encode(input);\n const buffer = await crypto.subtle.digest(\"SHA-1\", encoded);\n return Array.from(new Uint8Array(buffer))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n}\n\n/**\n * Compute the cache filename for a given domain + clientId.\n *\n * @param domain - The Cognito domain (e.g. `\"auth.example.com\"`).\n * @param clientId - The Cognito app client ID.\n * @returns SHA-1 hex digest of `\"domain|clientId\"`.\n */\nexport async function cacheFileName(domain: string, clientId: string): Promise<string> {\n return sha1Hex(`${domain}|${clientId}`);\n}\n\n// ─── INI parser ──────────────────────────────────────────────────────────────\n\n/**\n * Minimal INI parser matching AWS config format:\n * - `[default]` section\n * - `[profile <name>]` sections\n * - `key = value` pairs\n * - Lines starting with `#` or `;` are comments\n *\n * @param content - Raw INI file content.\n * @returns Map of section names to key-value pairs.\n */\nexport function parseIni(content: string): Record<string, Record<string, string>> {\n const sections: Record<string, Record<string, string>> = {};\n let currentSection: string | null = null;\n\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n\n if (!line || line.startsWith(\"#\") || line.startsWith(\";\")) continue;\n\n const sectionMatch = line.match(/^\\[(.+)\\]$/);\n if (sectionMatch) {\n const raw = sectionMatch[1]!.trim();\n // `[default]` stays as \"default\", `[profile foo]` becomes \"foo\"\n currentSection = raw.startsWith(\"profile \")\n ? raw.slice(\"profile \".length).trim()\n : raw;\n sections[currentSection] ??= {};\n continue;\n }\n\n if (currentSection !== null) {\n const eqIdx = line.indexOf(\"=\");\n if (eqIdx > 0) {\n const key = line.slice(0, eqIdx).trim();\n const value = line.slice(eqIdx + 1).trim();\n sections[currentSection]![key] = value;\n }\n }\n }\n\n return sections;\n}\n\n// ─── File system (Node.js only) ──────────────────────────────────────────────\n\ninterface FsModule {\n readFileSync(path: string, encoding: string): string;\n writeFileSync(path: string, data: string, options?: { mode?: number }): void;\n mkdirSync(path: string, options?: { recursive?: boolean; mode?: number }): void;\n existsSync(path: string): boolean;\n unlinkSync(path: string): void;\n renameSync(oldPath: string, newPath: string): void;\n}\n\ninterface PathModule {\n join(...parts: string[]): string;\n}\n\nlet _fs: FsModule | null = null;\nlet _path: PathModule | null = null;\n\nasync function getFs(): Promise<FsModule> {\n if (!_fs) {\n // @ts-expect-error -- resolved at runtime; no @types/node in this package\n _fs = (await import(\"node:fs\")) as unknown as FsModule;\n }\n return _fs;\n}\n\nasync function getPath(): Promise<PathModule> {\n if (!_path) {\n // @ts-expect-error -- resolved at runtime; no @types/node in this package\n _path = (await import(\"node:path\")) as unknown as PathModule;\n }\n return _path;\n}\n\n// ─── Config dir resolution ───────────────────────────────────────────────────\n\n/**\n * Resolve the config directory path.\n *\n * @param override - Explicit directory path (highest priority).\n * @returns Resolved absolute path to the config directory.\n * @throws {Error} If the home directory cannot be determined and no override is provided.\n */\nexport async function resolveConfigDir(override?: string): Promise<string> {\n if (override) return override;\n\n const envDir = getEnv(\"SECLAI_CONFIG_DIR\");\n if (envDir) return envDir;\n\n const home = getHomeDir();\n if (!home) {\n throw new Error(\"Cannot determine home directory. Set SECLAI_CONFIG_DIR.\");\n }\n\n const pathMod = await getPath();\n return pathMod.join(home, DEFAULT_CONFIG_DIR);\n}\n\n// ─── Profile resolution ─────────────────────────────────────────────────────\n\n/**\n * Load and resolve an SSO profile from the config file.\n * Non-default profiles inherit unset keys from `[default]`.\n *\n * @param configDir - Resolved config directory path.\n * @param profileName - Profile name to look up (`\"default\"` or a named profile).\n * @returns The resolved profile, or `null` if not found or incomplete.\n */\nexport async function loadSsoProfile(\n configDir: string,\n profileName: string,\n): Promise<SsoProfile | null> {\n const fs = await getFs();\n const pathMod = await getPath();\n\n const configPath = pathMod.join(configDir, CONFIG_FILE);\n if (!fs.existsSync(configPath)) return null;\n\n const content = fs.readFileSync(configPath, \"utf-8\");\n const sections = parseIni(content);\n\n const defaultSection = sections[\"default\"] ?? {};\n const profileSection = profileName === \"default\" ? defaultSection : sections[profileName];\n\n if (!profileSection) return null;\n\n // Non-default profiles inherit from [default]\n const merged = profileName === \"default\" ? profileSection : { ...defaultSection, ...profileSection };\n\n const ssoAccountId = merged[\"sso_account_id\"];\n const ssoRegion = merged[\"sso_region\"];\n const ssoClientId = merged[\"sso_client_id\"];\n const ssoDomain = merged[\"sso_domain\"];\n\n if (!ssoAccountId || !ssoRegion || !ssoClientId || !ssoDomain) return null;\n\n return { ssoAccountId, ssoRegion, ssoClientId, ssoDomain };\n}\n\n// ─── Cache I/O ───────────────────────────────────────────────────────────────\n\n/**\n * Read a cached SSO token from disk.\n *\n * @param configDir - Resolved config directory path.\n * @param profile - SSO profile (used to derive the cache filename).\n * @returns The cached entry, or `null` if not found or unreadable.\n */\n/** Resolve the full path to a profile's SSO cache file. */\nasync function resolveCachePath(\n configDir: string,\n profile: SsoProfile,\n): Promise<string> {\n const pathMod = await getPath();\n const hash = await cacheFileName(profile.ssoDomain, profile.ssoClientId);\n return pathMod.join(configDir, SSO_CACHE_DIR, `${hash}.json`);\n}\n\nexport async function readSsoCache(\n configDir: string,\n profile: SsoProfile,\n): Promise<SsoCacheEntry | null> {\n const fs = await getFs();\n\n const cachePath = await resolveCachePath(configDir, profile);\n\n if (!fs.existsSync(cachePath)) return null;\n\n try {\n const raw = fs.readFileSync(cachePath, \"utf-8\");\n return JSON.parse(raw) as SsoCacheEntry;\n } catch {\n return null;\n }\n}\n\n/**\n * Write a cached SSO token to disk atomically.\n * Creates the cache directory if it doesn't exist.\n *\n * @param configDir - Resolved config directory path.\n * @param profile - SSO profile (used to derive the cache filename).\n * @param entry - Token data to persist.\n */\nexport async function writeSsoCache(\n configDir: string,\n profile: SsoProfile,\n entry: SsoCacheEntry,\n): Promise<void> {\n const fs = await getFs();\n const pathMod = await getPath();\n\n const cacheDir = pathMod.join(configDir, SSO_CACHE_DIR);\n fs.mkdirSync(cacheDir, { recursive: true, mode: 0o700 });\n\n const cachePath = await resolveCachePath(configDir, profile);\n const tmpPath = `${cachePath}.tmp`;\n\n fs.writeFileSync(tmpPath, JSON.stringify(entry, null, 2), { mode: 0o600 });\n // On Windows, renameSync fails if destination exists — delete first (best-effort)\n if (fs.existsSync(cachePath)) {\n try { fs.unlinkSync(cachePath); } catch { /* let renameSync throw if needed */ }\n }\n fs.renameSync(tmpPath, cachePath);\n}\n\n/**\n * Delete a cached SSO token file.\n *\n * @param configDir - Resolved config directory path.\n * @param profile - SSO profile (used to derive the cache filename).\n */\nexport async function deleteSsoCache(\n configDir: string,\n profile: SsoProfile,\n): Promise<void> {\n const fs = await getFs();\n\n const cachePath = await resolveCachePath(configDir, profile);\n\n if (fs.existsSync(cachePath)) {\n fs.unlinkSync(cachePath);\n }\n}\n\n// ─── Token validation ────────────────────────────────────────────────────────\n\n/**\n * Check if a cached token is still valid (with 30s buffer).\n *\n * @param entry - The cached token entry to check.\n * @returns `true` if the token expires more than 30 seconds in the future.\n */\nexport function isTokenValid(entry: SsoCacheEntry): boolean {\n const expiresAt = new Date(entry.expiresAt).getTime();\n return Date.now() + EXPIRY_BUFFER_MS < expiresAt;\n}\n\n// ─── Token refresh ───────────────────────────────────────────────────────────\n\n/**\n * Refresh an access token using a Cognito refresh_token grant.\n *\n * @param profile - SSO profile with Cognito domain and client ID.\n * @param refreshTokenValue - The refresh token to exchange.\n * @param fetcher - A `fetch`-compatible function for making HTTP requests.\n * @returns A fresh {@link SsoCacheEntry} with the new tokens.\n * @throws {Error} If the Cognito token endpoint returns a non-OK status.\n */\nexport async function refreshToken(\n profile: SsoProfile,\n refreshTokenValue: string,\n fetcher: FetchLike,\n): Promise<SsoCacheEntry> {\n const tokenUrl = `https://${profile.ssoDomain}/oauth2/token`;\n\n const body = new URLSearchParams({\n grant_type: \"refresh_token\",\n client_id: profile.ssoClientId,\n refresh_token: refreshTokenValue,\n });\n\n const response = await fetcher(tokenUrl, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new Error(`Token refresh failed (HTTP ${response.status}): ${text}`);\n }\n\n const data = (await response.json()) as {\n access_token: string;\n id_token?: string;\n refresh_token?: string;\n expires_in: number;\n };\n\n const expiresAt = new Date(Date.now() + data.expires_in * 1000).toISOString();\n\n return {\n accessToken: data.access_token,\n refreshToken: data.refresh_token ?? refreshTokenValue,\n idToken: data.id_token ?? undefined,\n expiresAt,\n clientId: profile.ssoClientId,\n region: profile.ssoRegion,\n cognitoDomain: profile.ssoDomain,\n };\n}\n\n// ─── Credential chain resolver ───────────────────────────────────────────────\n\n/** Options for resolving the credential chain. */\nexport interface CredentialChainOptions {\n /** Explicit API key (highest priority). */\n apiKey?: string | undefined;\n /** Explicit static bearer token. */\n accessToken?: string | undefined;\n /** Dynamic bearer token provider. */\n accessTokenProvider?: (() => string | Promise<string>) | undefined;\n /** Name of the profile from ~/.seclai/config. */\n profile?: string | undefined;\n /** Override config directory path. */\n configDir?: string | undefined;\n /** Whether to auto-refresh expired SSO tokens. Defaults to true. */\n autoRefresh?: boolean | undefined;\n /** Account ID override (takes precedence over profile's sso_account_id). */\n accountId?: string | undefined;\n /** Header name for API key auth. */\n apiKeyHeader?: string | undefined;\n /** fetch implementation for token refresh. */\n fetch?: FetchLike | undefined;\n}\n\n/**\n * Resolved authentication state used throughout the client lifecycle.\n * Created once by {@link resolveCredentialChain} and passed to\n * {@link resolveAuthHeaders} on every request.\n */\nexport interface AuthState {\n mode: \"apiKey\" | \"bearerStatic\" | \"bearerProvider\" | \"sso\";\n apiKey?: string;\n apiKeyHeader: string;\n accessToken?: string;\n accessTokenProvider?: () => string | Promise<string>;\n accountId?: string | undefined;\n ssoProfile?: SsoProfile;\n configDir?: string;\n autoRefresh: boolean;\n fetcher?: FetchLike | undefined;\n /** @internal Coalesces concurrent SSO token refresh attempts. */\n _refreshPromise?: Promise<string> | undefined;\n}\n\n/**\n * Resolve the credential chain and return an AuthState.\n * This is called once at client construction time.\n *\n * Resolution order:\n * 1. Explicit `apiKey` option\n * 2. Explicit `accessToken` option\n * 3. Explicit `accessTokenProvider` option\n * 4. `SECLAI_API_KEY` environment variable\n * 5. SSO profile from `~/.seclai/config`\n *\n * @param opts - Credential chain options.\n * @returns Resolved authentication state.\n * @throws {Error} If no credentials are found.\n */\nexport async function resolveCredentialChain(\n opts: CredentialChainOptions,\n): Promise<AuthState> {\n const apiKeyHeader = opts.apiKeyHeader ?? DEFAULT_API_KEY_HEADER;\n\n // 1. Explicit apiKey option\n if (opts.apiKey) {\n return {\n mode: \"apiKey\",\n apiKey: opts.apiKey,\n apiKeyHeader,\n accountId: opts.accountId,\n autoRefresh: false,\n };\n }\n\n // 2. Explicit accessToken (mutual exclusion already checked by caller)\n if (opts.accessToken) {\n return {\n mode: \"bearerStatic\",\n accessToken: opts.accessToken,\n apiKeyHeader,\n accountId: opts.accountId,\n autoRefresh: false,\n };\n }\n\n // 3. Explicit accessTokenProvider\n if (opts.accessTokenProvider) {\n return {\n mode: \"bearerProvider\",\n accessTokenProvider: opts.accessTokenProvider,\n apiKeyHeader,\n accountId: opts.accountId,\n autoRefresh: false,\n };\n }\n\n // 4. SECLAI_API_KEY env var\n const envApiKey = getEnv(\"SECLAI_API_KEY\");\n if (envApiKey) {\n return {\n mode: \"apiKey\",\n apiKey: envApiKey,\n apiKeyHeader,\n accountId: opts.accountId,\n autoRefresh: false,\n };\n }\n\n // 5. Profile-based SSO resolution\n try {\n const configDir = await resolveConfigDir(opts.configDir);\n const profileName = opts.profile ?? getEnv(\"SECLAI_PROFILE\") ?? \"default\";\n const ssoProfile = await loadSsoProfile(configDir, profileName);\n\n if (ssoProfile) {\n return {\n mode: \"sso\",\n apiKeyHeader,\n accountId: opts.accountId ?? ssoProfile.ssoAccountId,\n ssoProfile,\n configDir,\n autoRefresh: opts.autoRefresh !== false,\n fetcher: opts.fetch,\n };\n }\n } catch {\n // Config dir not found or profile not configured — fall through\n }\n\n // 6. Nothing found\n throw new Error(\n \"Missing credentials. Provide apiKey, accessToken, set SECLAI_API_KEY, or run `seclai auth login`.\",\n );\n}\n\n/**\n * Resolve authentication headers from the current AuthState.\n * Called per-request to handle dynamic token providers and SSO cache refresh.\n *\n * @param state - The resolved authentication state.\n * @returns Headers object with the appropriate auth header(s) set.\n */\nexport async function resolveAuthHeaders(\n state: AuthState,\n): Promise<Record<string, string>> {\n const headers: Record<string, string> = {};\n\n switch (state.mode) {\n case \"apiKey\":\n headers[state.apiKeyHeader] = state.apiKey!;\n break;\n\n case \"bearerStatic\":\n headers[\"authorization\"] = `Bearer ${state.accessToken!}`;\n break;\n\n case \"bearerProvider\": {\n const token = await Promise.resolve(state.accessTokenProvider!());\n headers[\"authorization\"] = `Bearer ${token}`;\n break;\n }\n\n case \"sso\": {\n const token = await resolveSsoToken(state);\n headers[\"authorization\"] = `Bearer ${token}`;\n break;\n }\n }\n\n if (state.accountId) {\n headers[\"x-account-id\"] = state.accountId;\n }\n\n return headers;\n}\n\n/** Resolve a valid SSO token, refreshing from cache if needed. */\nasync function resolveSsoToken(state: AuthState): Promise<string> {\n const profile = state.ssoProfile!;\n const configDir = state.configDir!;\n\n const cached = await readSsoCache(configDir, profile);\n\n if (cached && isTokenValid(cached)) {\n return cached.accessToken;\n }\n\n if (cached?.refreshToken && state.autoRefresh) {\n // Coalesce concurrent refresh attempts\n if (state._refreshPromise) {\n return state._refreshPromise;\n }\n\n const fetcher = state.fetcher ?? (globalThis.fetch as FetchLike | undefined);\n if (!fetcher) {\n throw new Error(\"No fetch implementation available for token refresh.\");\n }\n\n state._refreshPromise = (async () => {\n try {\n const refreshed = await refreshToken(profile, cached.refreshToken!, fetcher);\n await writeSsoCache(configDir, profile, refreshed);\n return refreshed.accessToken;\n } finally {\n state._refreshPromise = undefined;\n }\n })();\n return state._refreshPromise;\n }\n\n throw new Error(\n `SSO token expired. Run \\`seclai auth login\\` to re-authenticate.`,\n );\n}\n","/**\n * @module\n *\n * Main SDK client for the Seclai API.\n *\n * Exports the {@link Seclai} class which provides typed convenience methods for\n * every API endpoint, plus low-level {@link Seclai.request | request()} and\n * {@link Seclai.requestRaw | requestRaw()} escape hatches, streaming helpers,\n * and automatic pagination.\n */\nimport {\n SeclaiAPIStatusError,\n SeclaiAPIValidationError,\n SeclaiConfigurationError,\n SeclaiError,\n SeclaiStreamingError,\n} from \"./errors\";\nimport type { AuthState } from \"./auth\";\nimport { resolveCredentialChain, resolveAuthHeaders } from \"./auth\";\nimport type {\n AgentRunEvent,\n AgentDefinitionResponse,\n AgentListResponse,\n AgentRunListResponse,\n AgentRunRequest,\n AgentRunResponse,\n AgentRunStreamRequest,\n AgentSummaryResponse,\n AgentTraceSearchRequest,\n AgentTraceSearchResponse,\n AiAssistantAcceptRequest,\n AiAssistantAcceptResponse,\n AiAssistantFeedbackRequest,\n AiAssistantFeedbackResponse,\n AiAssistantGenerateRequest,\n AiAssistantGenerateResponse,\n AiConversationHistoryResponse,\n AddCommentRequest,\n AddConversationTurnRequest,\n ChangeStatusRequest,\n CompatibleRunListResponse,\n CompactionTestResponse,\n ContentDetailResponse,\n ContentEmbeddingsListResponse,\n ContentFileUploadResponse,\n CreateAgentRequest,\n CreateAlertConfigRequest,\n CreateEvaluationCriteriaRequest,\n CreateEvaluationResultRequest,\n CreateExportRequest,\n CreateKnowledgeBaseBody,\n CreateMemoryBankBody,\n CreateSolutionRequest,\n CreateSourceBody,\n EstimateExportRequest,\n EstimateExportResponse,\n EvaluationCriteriaResponse,\n EvaluationResultListResponse,\n EvaluationResultResponse,\n EvaluationResultSummaryResponse,\n EvaluationResultWithCriteriaListResponse,\n EvaluationRunSummaryListResponse,\n ExportListResponse,\n ExportResponse,\n FileUploadResponse,\n GenerateAgentStepsRequest,\n GenerateAgentStepsResponse,\n GenerateStepConfigRequest,\n GenerateStepConfigResponse,\n GovernanceAiAcceptResponse,\n GovernanceAiAssistantRequest,\n GovernanceAiAssistantResponse,\n GovernanceConversationResponse,\n HTTPValidationError,\n InlineTextReplaceRequest,\n InlineTextUploadRequest,\n KnowledgeBaseListResponse,\n KnowledgeBaseResponse,\n LinkResourcesRequest,\n ListOptions,\n MarkAiSuggestionRequest,\n MarkConversationTurnRequest,\n MemoryBankAcceptRequest,\n MemoryBankAiAssistantRequest,\n MemoryBankAiAssistantResponse,\n MemoryBankLastConversationResponse,\n MemoryBankListResponse,\n MemoryBankResponse,\n NonManualEvaluationSummaryResponse,\n OrganizationAlertPreferenceListResponse,\n SolutionConversationResponse,\n SolutionListResponse,\n SolutionResponse,\n SortableListOptions,\n SourceEmbeddingMigrationResponse,\n SourceListResponse,\n SourceResponse,\n StandaloneTestCompactionRequest,\n StartSourceEmbeddingMigrationRequest,\n TestCompactionRequest,\n TestDraftEvaluationRequest,\n TestDraftEvaluationResponse,\n UnlinkResourcesRequest,\n UpdateAgentDefinitionRequest,\n UpdateAgentRequest,\n UpdateAlertConfigRequest,\n UpdateEvaluationCriteriaRequest,\n UpdateKnowledgeBaseBody,\n UpdateMemoryBankBody,\n UpdateOrganizationAlertPreferenceRequest,\n UpdateSolutionRequest,\n UpdateSourceBody,\n UploadAgentInputApiResponse,\n} from \"./types\";\n\n/** Default API base URL (can be overridden with `baseUrl` or `SECLAI_API_URL`). */\nexport const SECLAI_API_URL = \"https://api.seclai.com\";\n\n/** A `fetch`-compatible function (e.g. `globalThis.fetch` or `undici.fetch`). */\nexport type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\n/**\n * Token provider: a synchronous or asynchronous function that returns an\n * access token string. Called on every request to allow automatic refresh.\n */\nexport type AccessTokenProvider = () => string | Promise<string>;\n\n/** Configuration for the {@link Seclai} client. */\nexport interface SeclaiOptions {\n /** API key used for authentication. Defaults to `process.env.SECLAI_API_KEY` when available. */\n apiKey?: string;\n /**\n * Static bearer access token **or** a provider function that returns one.\n * Mutually exclusive with `apiKey`.\n */\n accessToken?: string | AccessTokenProvider;\n /** API base URL. Defaults to `process.env.SECLAI_API_URL` when available, else {@link SECLAI_API_URL}. */\n baseUrl?: string;\n /** Header name to use for the API key. Defaults to `x-api-key`. */\n apiKeyHeader?: string;\n /** Extra headers to include on every request. */\n defaultHeaders?: Record<string, string>;\n /** Optional `fetch` implementation for environments without a global `fetch`. */\n fetch?: FetchLike;\n /**\n * SSO profile name to load from `~/.seclai/config`.\n * Defaults to `process.env.SECLAI_PROFILE`, then `\"default\"`.\n */\n profile?: string;\n /**\n * Override the config directory path (default: `SECLAI_CONFIG_DIR` env var or `~/.seclai/`).\n */\n configDir?: string;\n /**\n * Whether to auto-refresh expired SSO tokens. Defaults to `true`.\n * Set to `false` in environments that should not write to disk.\n */\n autoRefresh?: boolean;\n /**\n * Target organization account ID. Sent as `X-Account-Id` header.\n * Overrides the profile's `sso_account_id` when using SSO auth.\n */\n accountId?: string;\n}\n\n// ─── Internal Helpers ────────────────────────────────────────────────────────\n\nfunction getEnv(name: string): string | undefined {\n const p = (globalThis as any)?.process;\n return p?.env?.[name];\n}\n\nfunction buildURL(baseUrl: string, path: string, query?: Record<string, unknown>): URL {\n const url = new URL(path, baseUrl);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url;\n}\n\nasync function safeText(response: Response): Promise<string | undefined> {\n try {\n return await response.clone().text();\n } catch {\n return undefined;\n }\n}\n\nasync function safeJson(response: Response): Promise<unknown | undefined> {\n try {\n return await response.clone().json();\n } catch {\n return undefined;\n }\n}\n\ntype SseMessage = { event?: string; data?: string };\n\nfunction createSseParser(onMessage: (msg: SseMessage) => void) {\n let buffer = \"\";\n let eventName: string | undefined;\n let dataLines: string[] = [];\n\n function dispatch() {\n if (!eventName && dataLines.length === 0) return;\n const msg: SseMessage = { data: dataLines.join(\"\\n\") };\n if (eventName !== undefined) msg.event = eventName;\n onMessage(msg);\n eventName = undefined;\n dataLines = [];\n }\n\n function feed(textChunk: string) {\n buffer += textChunk;\n while (true) {\n const newlineIdx = buffer.indexOf(\"\\n\");\n if (newlineIdx === -1) return;\n\n let line = buffer.slice(0, newlineIdx);\n buffer = buffer.slice(newlineIdx + 1);\n\n if (line.endsWith(\"\\r\")) line = line.slice(0, -1);\n\n if (line === \"\") {\n dispatch();\n continue;\n }\n\n if (line.startsWith(\":\")) continue;\n\n const colon = line.indexOf(\":\");\n const field = colon === -1 ? line : line.slice(0, colon);\n let value = colon === -1 ? \"\" : line.slice(colon + 1);\n if (value.startsWith(\" \")) value = value.slice(1);\n\n if (field === \"event\") {\n eventName = value;\n } else if (field === \"data\") {\n dataLines.push(value);\n }\n }\n }\n\n return { feed, end: dispatch };\n}\n\nfunction anySignal(signals: Array<AbortSignal | undefined>): AbortSignal | undefined {\n const present = signals.filter(Boolean) as AbortSignal[];\n if (present.length === 0) return undefined;\n if (present.length === 1) return present[0];\n const controller = new AbortController();\n const onAbort = () => controller.abort();\n for (const s of present) {\n if (s.aborted) {\n controller.abort();\n break;\n }\n s.addEventListener(\"abort\", onAbort, { once: true });\n }\n return controller.signal;\n}\n\nfunction toBlob(\n file: Blob | Uint8Array | ArrayBuffer | BufferSource,\n mimeType?: string,\n): Blob {\n if (file instanceof Blob) return file;\n const opts = mimeType ? { type: mimeType } : undefined;\n if (file instanceof ArrayBuffer) return new Blob([new Uint8Array(file)], opts);\n return new Blob([file as unknown as BlobPart], opts);\n}\n\nconst MIME_TYPES: Record<string, string> = {\n txt: \"text/plain\", html: \"text/html\", htm: \"text/html\", md: \"text/markdown\",\n csv: \"text/csv\", xml: \"text/xml\", json: \"application/json\",\n pdf: \"application/pdf\", doc: \"application/msword\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n ppt: \"application/vnd.ms-powerpoint\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n xls: \"application/vnd.ms-excel\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n msg: \"application/vnd.ms-outlook\", zip: \"application/zip\",\n epub: \"application/epub+zip\",\n png: \"image/png\", jpg: \"image/jpeg\", jpeg: \"image/jpeg\", gif: \"image/gif\",\n bmp: \"image/bmp\", tiff: \"image/tiff\", webp: \"image/webp\",\n mp3: \"audio/mpeg\", wav: \"audio/wav\", m4a: \"audio/mp4\", flac: \"audio/flac\",\n ogg: \"audio/ogg\", mp4: \"video/mp4\", mov: \"video/quicktime\", avi: \"video/x-msvideo\",\n};\n\nfunction inferMimeType(fileName: string | undefined): string | undefined {\n if (!fileName) return undefined;\n const ext = fileName.split(\".\").pop()?.toLowerCase();\n return ext ? MIME_TYPES[ext] : undefined;\n}\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\n/**\n * Seclai JavaScript/TypeScript client.\n *\n * Provides typed methods for every Seclai API endpoint, plus higher-level\n * abstractions for streaming, polling, and pagination.\n *\n * @example\n * ```ts\n * import { Seclai } from \"@seclai/sdk\";\n *\n * const client = new Seclai({ apiKey: \"sk-...\" });\n *\n * // List agents\n * const { items } = await client.listAgents();\n *\n * // Run an agent\n * const run = await client.runAgent(\"agent-id\", { input: \"Hello!\" });\n *\n * // Stream an agent run\n * for await (const event of client.runStreamingAgent(\"agent-id\", { input: \"Hello!\" })) {\n * console.log(event.event, event.data);\n * }\n * ```\n */\nexport class Seclai {\n private readonly baseUrl: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly fetcher: FetchLike;\n private _authState: AuthState | null = null;\n private _authInitPromise: Promise<void> | null = null;\n private _authInitError: SeclaiConfigurationError | null = null;\n\n /**\n * Create a new Seclai client.\n *\n * Credentials are resolved via a chain (first match wins):\n * 1. Explicit `apiKey` option\n * 2. Explicit `accessToken` option (static string or provider function)\n * 3. `SECLAI_API_KEY` environment variable\n * 4. SSO profile from `~/.seclai/config` + cached tokens in `~/.seclai/sso/cache/`\n *\n * @param opts - Client configuration.\n * @throws {@link SeclaiConfigurationError} If no `fetch` implementation is available.\n * @throws {@link SeclaiConfigurationError} If both `apiKey` and `accessToken` are provided.\n */\n constructor(opts: SeclaiOptions = {}) {\n // Validate mutual exclusion\n if (opts.apiKey && opts.accessToken) {\n throw new SeclaiConfigurationError(\n \"Provide either apiKey or accessToken, not both.\"\n );\n }\n\n const fetcher = opts.fetch ?? (globalThis.fetch as FetchLike | undefined);\n if (!fetcher) {\n throw new SeclaiConfigurationError(\n \"No fetch implementation available. Provide opts.fetch or run in an environment with global fetch.\"\n );\n }\n\n this.baseUrl = opts.baseUrl ?? getEnv(\"SECLAI_API_URL\") ?? SECLAI_API_URL;\n this.defaultHeaders = { ...(opts.defaultHeaders ?? {}) };\n this.fetcher = fetcher;\n\n // Resolve credential chain (may be async for SSO profile loading)\n const accessTokenProvider =\n typeof opts.accessToken === \"function\" ? opts.accessToken : undefined;\n const accessTokenStatic =\n typeof opts.accessToken === \"string\" ? opts.accessToken : undefined;\n\n this._authInitPromise = resolveCredentialChain({\n apiKey: opts.apiKey,\n accessToken: accessTokenStatic,\n accessTokenProvider,\n profile: opts.profile,\n configDir: opts.configDir,\n autoRefresh: opts.autoRefresh,\n accountId: opts.accountId,\n apiKeyHeader: opts.apiKeyHeader,\n fetch: fetcher,\n }).then((state) => {\n this._authState = state;\n }).catch((err) => {\n this._authInitError = new SeclaiConfigurationError(\n err instanceof Error ? err.message : String(err)\n );\n });\n }\n\n /** Ensure the credential chain has been resolved. */\n private async ensureAuth(): Promise<AuthState> {\n if (this._authInitPromise) {\n await this._authInitPromise;\n this._authInitPromise = null;\n }\n if (this._authInitError) {\n throw this._authInitError;\n }\n if (!this._authState) {\n throw new SeclaiConfigurationError(\n \"Missing credentials. Provide apiKey, accessToken, set SECLAI_API_KEY, or run `seclai auth login`.\"\n );\n }\n return this._authState;\n }\n\n /** Resolve auth headers for the current request. */\n private async authHeaders(): Promise<Record<string, string>> {\n const state = await this.ensureAuth();\n return resolveAuthHeaders(state);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Low-level request\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Make a raw HTTP request to the Seclai API.\n *\n * This is a low-level escape hatch. For most operations, prefer the typed convenience methods.\n *\n * @param method - HTTP method (e.g. `\"GET\"`, `\"POST\"`).\n * @param path - Request path relative to `baseUrl` (e.g. `\"/sources/\"`).\n * @param opts - Query params, JSON body, per-request headers, and optional AbortSignal.\n * @returns Parsed JSON for JSON responses, raw text for non-JSON responses, or `null` for empty bodies.\n * @throws {@link SeclaiAPIValidationError} For validation errors (typically HTTP 422).\n * @throws {@link SeclaiAPIStatusError} For other non-success HTTP status codes.\n */\n async request(\n method: string,\n path: string,\n opts?: {\n query?: Record<string, unknown>;\n json?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n }\n ): Promise<unknown | string | null> {\n const url = buildURL(this.baseUrl, path, opts?.query);\n\n const authHeaders = await this.authHeaders();\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n ...(opts?.headers ?? {}),\n ...authHeaders,\n };\n\n let body: BodyInit | undefined;\n if (opts?.json !== undefined) {\n headers[\"content-type\"] = headers[\"content-type\"] ?? \"application/json\";\n body = JSON.stringify(opts.json);\n }\n\n const init: RequestInit = { method, headers };\n if (body !== undefined) {\n init.body = body;\n }\n if (opts?.signal) {\n init.signal = opts.signal;\n }\n const response = await this.fetcher(url, init);\n\n if (response.status === 204) return null;\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const isJson = contentType.includes(\"application/json\");\n\n if (!response.ok) {\n const responseText = await safeText(response);\n if (response.status === 422) {\n const validation = (await safeJson(response)) as HTTPValidationError | undefined;\n throw new SeclaiAPIValidationError({\n message: \"Validation error\",\n statusCode: response.status,\n method,\n url: url.toString(),\n responseText,\n validationError: validation,\n });\n }\n throw new SeclaiAPIStatusError({\n message: `Request failed with status ${response.status}`,\n statusCode: response.status,\n method,\n url: url.toString(),\n responseText,\n });\n }\n\n if (!response.body) return null;\n\n if (isJson) {\n return (await response.json()) as unknown;\n }\n return await response.text();\n }\n\n /**\n * Make a raw HTTP request and return the raw `Response` object (for binary downloads, etc.).\n *\n * @param method - HTTP method.\n * @param path - Request path relative to `baseUrl`.\n * @param opts - Query params, JSON body, per-request headers, and optional AbortSignal.\n * @returns The raw `Response` object.\n * @throws {SeclaiAPIValidationError} On HTTP 422 responses.\n * @throws {SeclaiAPIStatusError} On other non-2xx responses.\n */\n async requestRaw(\n method: string,\n path: string,\n opts?: {\n query?: Record<string, unknown>;\n json?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n }\n ): Promise<Response> {\n const url = buildURL(this.baseUrl, path, opts?.query);\n\n const authHeaders = await this.authHeaders();\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n ...(opts?.headers ?? {}),\n ...authHeaders,\n };\n\n let body: BodyInit | undefined;\n if (opts?.json !== undefined) {\n headers[\"content-type\"] = headers[\"content-type\"] ?? \"application/json\";\n body = JSON.stringify(opts.json);\n }\n\n const init: RequestInit = { method, headers };\n if (body !== undefined) init.body = body;\n if (opts?.signal) init.signal = opts.signal;\n\n const response = await this.fetcher(url, init);\n\n if (!response.ok) {\n const responseText = await safeText(response);\n if (response.status === 422) {\n const validation = (await safeJson(response)) as HTTPValidationError | undefined;\n throw new SeclaiAPIValidationError({\n message: \"Validation error\",\n statusCode: response.status,\n method,\n url: url.toString(),\n responseText,\n validationError: validation,\n });\n }\n throw new SeclaiAPIStatusError({\n message: `Request failed with status ${response.status}`,\n statusCode: response.status,\n method,\n url: url.toString(),\n responseText,\n });\n }\n\n return response;\n }\n\n /** Shared multipart upload helper. */\n private async uploadFile(\n path: string,\n opts: {\n file: Blob | Uint8Array | ArrayBuffer | BufferSource;\n title?: string;\n metadata?: Record<string, unknown>;\n fileName?: string;\n mimeType?: string;\n signal?: AbortSignal;\n },\n ): Promise<unknown> {\n const url = buildURL(this.baseUrl, path);\n\n const authHeaders = await this.authHeaders();\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n ...authHeaders,\n };\n // Let fetch set the correct multipart Content-Type with boundary\n delete headers[\"content-type\"];\n delete headers[\"Content-Type\"];\n\n const form = new FormData();\n const mimeType = opts.mimeType ?? inferMimeType(opts.fileName);\n const blob = toBlob(opts.file, mimeType);\n form.set(\"file\", blob, opts.fileName ?? \"upload\");\n\n if (opts.title !== undefined) form.set(\"title\", opts.title);\n if (opts.metadata !== undefined) form.set(\"metadata\", JSON.stringify(opts.metadata));\n\n const init: RequestInit = { method: \"POST\", headers, body: form };\n if (opts.signal) init.signal = opts.signal;\n\n const response = await this.fetcher(url, init);\n\n if (!response.ok) {\n const responseText = await safeText(response);\n if (response.status === 422) {\n const validation = (await safeJson(response)) as HTTPValidationError | undefined;\n throw new SeclaiAPIValidationError({\n message: \"Validation error\",\n statusCode: response.status,\n method: \"POST\",\n url: url.toString(),\n responseText,\n validationError: validation,\n });\n }\n throw new SeclaiAPIStatusError({\n message: `Request failed with status ${response.status}`,\n statusCode: response.status,\n method: \"POST\",\n url: url.toString(),\n responseText,\n });\n }\n\n return await response.json();\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agents — CRUD\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List agents.\n *\n * @param opts - Pagination options.\n * @returns Paginated list of agents.\n */\n async listAgents(opts: ListOptions = {}): Promise<AgentListResponse> {\n return (await this.request(\"GET\", \"/agents\", {\n query: { page: opts.page, limit: opts.limit },\n })) as AgentListResponse;\n }\n\n /**\n * Create a new agent.\n *\n * @param body - Agent creation payload (name, trigger type, template, etc.).\n * @returns Summary of the created agent.\n */\n async createAgent(body: CreateAgentRequest): Promise<AgentSummaryResponse> {\n return (await this.request(\"POST\", \"/agents\", { json: body })) as AgentSummaryResponse;\n }\n\n /**\n * Get agent details including its definition.\n *\n * @param agentId - Agent identifier.\n * @returns Full agent metadata.\n */\n async getAgent(agentId: string): Promise<AgentSummaryResponse> {\n return (await this.request(\"GET\", `/agents/${agentId}`)) as AgentSummaryResponse;\n }\n\n /**\n * Update an agent.\n *\n * @param agentId - Agent identifier.\n * @param body - Fields to update.\n * @returns Updated agent summary.\n */\n async updateAgent(agentId: string, body: UpdateAgentRequest): Promise<AgentSummaryResponse> {\n return (await this.request(\"PUT\", `/agents/${agentId}`, { json: body })) as AgentSummaryResponse;\n }\n\n /**\n * Delete an agent.\n *\n * @param agentId - Agent identifier.\n */\n async deleteAgent(agentId: string): Promise<void> {\n await this.request(\"DELETE\", `/agents/${agentId}`);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agent Definitions\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Get an agent's full definition (steps, model config, etc.).\n *\n * @param agentId - Agent identifier.\n * @returns The agent definition.\n */\n async getAgentDefinition(agentId: string): Promise<AgentDefinitionResponse> {\n return (await this.request(\"GET\", `/agents/${agentId}/definition`)) as AgentDefinitionResponse;\n }\n\n /**\n * Update an agent's definition.\n *\n * @param agentId - Agent identifier.\n * @param body - Updated definition payload.\n * @returns Updated agent definition.\n */\n async updateAgentDefinition(agentId: string, body: UpdateAgentDefinitionRequest): Promise<AgentDefinitionResponse> {\n return (await this.request(\"PUT\", `/agents/${agentId}/definition`, { json: body })) as AgentDefinitionResponse;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agent Runs\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Start an agent run.\n *\n * @param agentId - Agent identifier.\n * @param body - Run request payload (`input`, `metadata`, `priority`, etc.).\n * @returns The created agent run.\n */\n async runAgent(agentId: string, body: AgentRunRequest): Promise<AgentRunResponse> {\n return (await this.request(\"POST\", `/agents/${agentId}/runs`, { json: body })) as AgentRunResponse;\n }\n\n /**\n * List runs for a specific agent.\n *\n * @param agentId - Agent identifier.\n * @param opts - Pagination and filter options.\n * @returns Paginated list of runs.\n */\n async listAgentRuns(\n agentId: string,\n opts: ListOptions & { status?: string } = {},\n ): Promise<AgentRunListResponse> {\n return (await this.request(\"GET\", `/agents/${agentId}/runs`, {\n query: { page: opts.page, limit: opts.limit, status: opts.status },\n })) as AgentRunListResponse;\n }\n\n /**\n * Search agent runs (traces) across all agents.\n *\n * @param body - Search query and filters.\n * @returns Search results with matching runs.\n */\n async searchAgentRuns(body: AgentTraceSearchRequest): Promise<AgentTraceSearchResponse> {\n return (await this.request(\"POST\", \"/agents/runs/search\", { json: body })) as AgentTraceSearchResponse;\n }\n\n /**\n * Get details of a specific agent run.\n *\n * @param runId - Run identifier.\n * @param opts - Optional flags.\n * @returns Agent run details.\n */\n async getAgentRun(\n runId: string,\n opts?: { includeStepOutputs?: boolean },\n ): Promise<AgentRunResponse> {\n return (await this.request(\"GET\", `/agents/runs/${runId}`, opts?.includeStepOutputs ? {\n query: { include_step_outputs: true },\n } : undefined)) as AgentRunResponse;\n }\n\n /**\n * Delete an agent run.\n *\n * @param runId - Run identifier.\n */\n async deleteAgentRun(runId: string): Promise<void> {\n await this.request(\"DELETE\", `/agents/runs/${runId}`);\n }\n\n /**\n * Cancel a running agent run.\n *\n * @param runId - Run identifier.\n * @returns Updated run (with cancelled status).\n */\n async cancelAgentRun(runId: string): Promise<AgentRunResponse> {\n return (await this.request(\"POST\", `/agents/runs/${runId}/cancel`)) as AgentRunResponse;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agent Runs — Streaming\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Run an agent in streaming mode (SSE) and wait for the final result.\n *\n * Consumes the entire SSE stream and returns only the terminal `done` payload.\n * For real-time event access, use {@link runStreamingAgent} instead.\n *\n * @param agentId - Agent identifier.\n * @param body - Streaming run request payload.\n * @param opts - Timeout and abort signal options.\n * @returns Final agent run payload from the `done` event.\n * @throws {@link SeclaiStreamingError} If the stream ends before a `done` event.\n */\n async runStreamingAgentAndWait(\n agentId: string,\n body: AgentRunStreamRequest,\n opts?: { timeoutMs?: number; signal?: AbortSignal },\n ): Promise<AgentRunResponse> {\n const url = buildURL(this.baseUrl, `/agents/${agentId}/runs/stream`);\n\n const authHdrs = await this.authHeaders();\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n ...authHdrs,\n accept: \"text/event-stream\",\n \"content-type\": \"application/json\",\n };\n\n const timeoutMs = opts?.timeoutMs ?? 60_000;\n const timeoutController = new AbortController();\n let timedOut = false;\n const timeoutId = setTimeout(() => {\n timedOut = true;\n timeoutController.abort();\n }, timeoutMs);\n\n const signal = anySignal([opts?.signal, timeoutController.signal]);\n\n let lastSeen: AgentRunResponse | undefined;\n\n try {\n const init: RequestInit = { method: \"POST\", headers, body: JSON.stringify(body) };\n if (signal) init.signal = signal;\n\n const response = await this.fetcher(url, init);\n\n // Handle error responses\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const isJson = contentType.includes(\"application/json\");\n\n if (!response.ok) {\n const responseText = await safeText(response);\n if (response.status === 422) {\n const validation = (await safeJson(response)) as HTTPValidationError | undefined;\n throw new SeclaiAPIValidationError({\n message: \"Validation error\",\n statusCode: response.status,\n method: \"POST\",\n url: url.toString(),\n responseText,\n validationError: validation,\n });\n }\n throw new SeclaiAPIStatusError({\n message: `Request failed with status ${response.status}`,\n statusCode: response.status,\n method: \"POST\",\n url: url.toString(),\n responseText,\n });\n }\n\n // If server returned JSON instead of SSE\n if (isJson) {\n return (await response.json()) as AgentRunResponse;\n }\n\n if (!response.body) {\n throw new SeclaiConfigurationError(\n \"Streaming response body is not available in this environment. Provide a fetch implementation that supports ReadableStream bodies.\"\n );\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n let final: AgentRunResponse | undefined;\n\n const parser = createSseParser((msg) => {\n if (!msg.data) return;\n if (msg.event === \"init\" || msg.event === \"done\") {\n try {\n const parsed = JSON.parse(msg.data) as AgentRunResponse;\n lastSeen = parsed;\n if (msg.event === \"done\") final = parsed;\n } catch { /* ignore malformed JSON */ }\n }\n });\n\n while (!final) {\n const { value, done } = await reader.read();\n if (done) break;\n if (value) parser.feed(decoder.decode(value, { stream: true }));\n }\n\n parser.end();\n\n if (final) return final;\n if (lastSeen && (lastSeen as any).status && (lastSeen as any).status !== \"pending\") {\n return lastSeen;\n }\n\n throw new SeclaiStreamingError(\"Stream ended before receiving a 'done' event.\", lastSeen?.run_id);\n } catch (err) {\n if (timedOut) {\n throw new SeclaiStreamingError(\n `Timed out after ${timeoutMs}ms waiting for streaming agent run to complete.`,\n lastSeen?.run_id,\n );\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Run an agent in streaming mode and yield each SSE event as it arrives.\n *\n * This is an `AsyncGenerator` suitable for real-time UIs that want to render\n * step progress as it happens.\n *\n * @param agentId - Agent identifier.\n * @param body - Streaming run request payload.\n * @param opts - Timeout and abort signal options.\n * @yields {@link AgentRunEvent} for each SSE message.\n *\n * @example\n * ```ts\n * for await (const event of client.runStreamingAgent(\"agent-id\", { input: \"Hello!\" })) {\n * if (event.event === \"done\") {\n * console.log(\"Final:\", event.data);\n * }\n * }\n * ```\n */\n async *runStreamingAgent(\n agentId: string,\n body: AgentRunStreamRequest,\n opts?: { timeoutMs?: number; signal?: AbortSignal },\n ): AsyncGenerator<AgentRunEvent, void, undefined> {\n const url = buildURL(this.baseUrl, `/agents/${agentId}/runs/stream`);\n\n const authHdrs = await this.authHeaders();\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n ...authHdrs,\n accept: \"text/event-stream\",\n \"content-type\": \"application/json\",\n };\n\n const timeoutMs = opts?.timeoutMs ?? 60_000;\n const timeoutController = new AbortController();\n let timedOut = false;\n const timeoutId = setTimeout(() => {\n timedOut = true;\n timeoutController.abort();\n }, timeoutMs);\n\n const signal = anySignal([opts?.signal, timeoutController.signal]);\n\n try {\n const init: RequestInit = { method: \"POST\", headers, body: JSON.stringify(body) };\n if (signal) init.signal = signal;\n\n const response = await this.fetcher(url, init);\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const isJson = contentType.includes(\"application/json\");\n\n if (!response.ok) {\n const responseText = await safeText(response);\n if (response.status === 422) {\n const validation = (await safeJson(response)) as HTTPValidationError | undefined;\n throw new SeclaiAPIValidationError({\n message: \"Validation error\",\n statusCode: response.status,\n method: \"POST\",\n url: url.toString(),\n responseText,\n validationError: validation,\n });\n }\n throw new SeclaiAPIStatusError({\n message: `Request failed with status ${response.status}`,\n statusCode: response.status,\n method: \"POST\",\n url: url.toString(),\n responseText,\n });\n }\n\n // If server returned JSON instead of SSE, yield it as a single \"done\" event\n if (isJson) {\n const data = (await response.json()) as AgentRunResponse;\n yield { event: \"done\", data };\n return;\n }\n\n if (!response.body) {\n throw new SeclaiConfigurationError(\n \"Streaming response body is not available in this environment.\"\n );\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const events: AgentRunEvent[] = [];\n\n const parser = createSseParser((msg) => {\n if (!msg.data) return;\n let data: unknown;\n try {\n data = JSON.parse(msg.data);\n } catch {\n data = msg.data;\n }\n events.push({ event: msg.event ?? \"message\", data });\n });\n\n while (true) {\n const { value, done } = await reader.read();\n if (value) parser.feed(decoder.decode(value, { stream: true }));\n\n // Yield all events that were parsed from this chunk\n while (events.length > 0) {\n yield events.shift()!;\n }\n\n if (done) break;\n }\n parser.end();\n\n // Yield any remaining events from end()\n while (events.length > 0) {\n yield events.shift()!;\n }\n } catch (err) {\n if (timedOut) {\n throw new SeclaiStreamingError(\n `Timed out after ${timeoutMs}ms waiting for streaming agent run to complete.`\n );\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agent Runs — Polling\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Run an agent and poll until it reaches a terminal status.\n *\n * This is useful in environments where SSE streaming is unavailable.\n *\n * @param agentId - Agent identifier.\n * @param body - Run request payload.\n * @param opts - Polling configuration and abort signal.\n * @returns The terminal agent run.\n * @throws {@link SeclaiStreamingError} On timeout.\n */\n async runAgentAndPoll(\n agentId: string,\n body: AgentRunRequest,\n opts?: {\n /** Polling interval in ms (default: 2000). */\n pollIntervalMs?: number;\n /** Maximum time to wait in ms (default: 300000 = 5 min). */\n timeoutMs?: number;\n /** Include per-step outputs in the final result. */\n includeStepOutputs?: boolean;\n signal?: AbortSignal;\n },\n ): Promise<AgentRunResponse> {\n const pollInterval = opts?.pollIntervalMs ?? 2_000;\n const timeout = opts?.timeoutMs ?? 300_000;\n const startTime = Date.now();\n\n const run = await this.runAgent(agentId, body);\n const runId = (run as any).id ?? (run as any).run_id;\n if (!runId) throw new SeclaiError(\"Agent run response did not contain an id.\");\n\n while (true) {\n if (opts?.signal?.aborted) throw new SeclaiError(\"Polling aborted.\");\n if (Date.now() - startTime > timeout) {\n throw new SeclaiStreamingError(`Polling timed out after ${timeout}ms.`, runId);\n }\n\n await new Promise((r) => setTimeout(r, pollInterval));\n\n const current = await this.getAgentRun(runId,\n opts?.includeStepOutputs ? { includeStepOutputs: true } : undefined,\n );\n const status = (current as any).status;\n if (status === \"completed\" || status === \"failed\" || status === \"cancelled\") {\n return current;\n }\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agent Run Evaluation Results\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List evaluation results for a specific agent run.\n *\n * @param agentId - Agent identifier.\n * @param runId - Run identifier.\n * @param opts - Pagination options.\n * @returns Paginated list of evaluation results.\n */\n async listRunEvaluationResults(\n agentId: string,\n runId: string,\n opts: ListOptions = {},\n ): Promise<EvaluationResultWithCriteriaListResponse> {\n return (await this.request(\"GET\", `/agents/${agentId}/runs/${runId}/evaluation-results`, {\n query: { page: opts.page, limit: opts.limit },\n })) as EvaluationResultWithCriteriaListResponse;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agent Input Uploads\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Upload a file to use as input for a `dynamic_input` agent run.\n *\n * After uploading, poll {@link getAgentInputUploadStatus} until `status` is `ready`,\n * then pass `input_upload_id` to {@link runAgent}.\n *\n * @param agentId - Agent identifier.\n * @param opts - File payload and optional metadata.\n * @returns Upload response with the upload ID and status.\n */\n async uploadAgentInput(\n agentId: string,\n opts: {\n file: Blob | Uint8Array | ArrayBuffer | BufferSource;\n fileName?: string;\n mimeType?: string;\n },\n ): Promise<UploadAgentInputApiResponse> {\n return (await this.uploadFile(`/agents/${agentId}/upload-input`, opts)) as UploadAgentInputApiResponse;\n }\n\n /**\n * Get the status of an agent input upload.\n *\n * @param agentId - Agent identifier.\n * @param uploadId - Upload identifier.\n * @returns Upload status and metadata.\n */\n async getAgentInputUploadStatus(agentId: string, uploadId: string): Promise<UploadAgentInputApiResponse> {\n return (await this.request(\"GET\", `/agents/${agentId}/input-uploads/${uploadId}`)) as UploadAgentInputApiResponse;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agent AI Assistant (Steps Generation)\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Generate agent workflow steps from natural language using AI.\n *\n * @param agentId - Agent identifier.\n * @param body - Generation request with user instructions.\n * @returns AI-generated step configuration.\n */\n async generateAgentSteps(agentId: string, body: GenerateAgentStepsRequest): Promise<GenerateAgentStepsResponse> {\n return (await this.request(\"POST\", `/agents/${agentId}/ai-assistant/generate-steps`, { json: body })) as GenerateAgentStepsResponse;\n }\n\n /**\n * Generate a single step configuration using AI.\n *\n * @param agentId - Agent identifier.\n * @param body - Step config generation request.\n * @returns AI-generated step config.\n */\n async generateStepConfig(agentId: string, body: GenerateStepConfigRequest): Promise<GenerateStepConfigResponse> {\n return (await this.request(\"POST\", `/agents/${agentId}/ai-assistant/step-config`, { json: body })) as GenerateStepConfigResponse;\n }\n\n /**\n * Get AI conversation history for an agent.\n *\n * @param agentId - Agent identifier.\n * @returns Conversation history.\n */\n async getAgentAiConversationHistory(agentId: string): Promise<AiConversationHistoryResponse> {\n return (await this.request(\"GET\", `/agents/${agentId}/ai-assistant/conversations`)) as AiConversationHistoryResponse;\n }\n\n /**\n * Mark an AI suggestion as accepted or rejected.\n *\n * @param agentId - Agent identifier.\n * @param conversationId - Conversation turn identifier.\n * @param body - Mark request payload.\n */\n async markAgentAiSuggestion(agentId: string, conversationId: string, body: MarkAiSuggestionRequest): Promise<void> {\n await this.request(\"PATCH\", `/agents/${agentId}/ai-assistant/${conversationId}`, { json: body });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Agent Evaluation Criteria\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List evaluation criteria for an agent.\n *\n * @param agentId - Agent identifier.\n * @param opts - Pagination options.\n */\n async listEvaluationCriteria(agentId: string, opts: ListOptions = {}): Promise<EvaluationCriteriaResponse[]> {\n return (await this.request(\"GET\", `/agents/${agentId}/evaluation-criteria`, {\n query: { page: opts.page, limit: opts.limit },\n })) as EvaluationCriteriaResponse[];\n }\n\n /**\n * Create evaluation criteria for an agent.\n *\n * @param agentId - Agent identifier.\n * @param body - Criteria definition.\n * @returns Created evaluation criteria.\n */\n async createEvaluationCriteria(agentId: string, body: CreateEvaluationCriteriaRequest): Promise<EvaluationCriteriaResponse> {\n return (await this.request(\"POST\", `/agents/${agentId}/evaluation-criteria`, { json: body })) as EvaluationCriteriaResponse;\n }\n\n /**\n * Get a single evaluation criteria by ID.\n *\n * @param criteriaId - Criteria identifier.\n * @returns Evaluation criteria details.\n */\n async getEvaluationCriteria(criteriaId: string): Promise<EvaluationCriteriaResponse> {\n return (await this.request(\"GET\", `/agents/evaluation-criteria/${criteriaId}`)) as EvaluationCriteriaResponse;\n }\n\n /**\n * Update an evaluation criteria.\n *\n * @param criteriaId - Criteria identifier.\n * @param body - Fields to update.\n * @returns Updated evaluation criteria.\n */\n async updateEvaluationCriteria(criteriaId: string, body: UpdateEvaluationCriteriaRequest): Promise<EvaluationCriteriaResponse> {\n return (await this.request(\"PATCH\", `/agents/evaluation-criteria/${criteriaId}`, { json: body })) as EvaluationCriteriaResponse;\n }\n\n /**\n * Delete an evaluation criteria and all associated results.\n *\n * @param criteriaId - Criteria identifier.\n */\n async deleteEvaluationCriteria(criteriaId: string): Promise<void> {\n await this.request(\"DELETE\", `/agents/evaluation-criteria/${criteriaId}`);\n }\n\n /**\n * Get the evaluation summary for a specific criteria.\n *\n * @param criteriaId - Criteria identifier.\n * @returns Evaluation result summary.\n */\n async getEvaluationCriteriaSummary(criteriaId: string): Promise<EvaluationResultSummaryResponse> {\n return (await this.request(\"GET\", `/agents/evaluation-criteria/${criteriaId}/summary`)) as EvaluationResultSummaryResponse;\n }\n\n /**\n * List evaluation results for a specific criteria.\n *\n * @param criteriaId - Criteria identifier.\n * @param opts - Pagination options.\n */\n async listEvaluationResults(criteriaId: string, opts: ListOptions = {}): Promise<EvaluationResultListResponse> {\n return (await this.request(\"GET\", `/agents/evaluation-criteria/${criteriaId}/results`, {\n query: { page: opts.page, limit: opts.limit },\n })) as EvaluationResultListResponse;\n }\n\n /**\n * Create a manual evaluation result for a criteria.\n *\n * @param criteriaId - Criteria identifier.\n * @param body - Evaluation result payload.\n * @returns Created evaluation result.\n */\n async createEvaluationResult(criteriaId: string, body: CreateEvaluationResultRequest): Promise<EvaluationResultResponse> {\n return (await this.request(\"POST\", `/agents/evaluation-criteria/${criteriaId}/results`, { json: body })) as EvaluationResultResponse;\n }\n\n /**\n * List runs compatible with a specific evaluation criteria.\n *\n * @param criteriaId - Criteria identifier.\n * @param opts - Pagination options.\n */\n async listCompatibleRuns(criteriaId: string, opts: ListOptions = {}): Promise<CompatibleRunListResponse> {\n return (await this.request(\"GET\", `/agents/evaluation-criteria/${criteriaId}/compatible-runs`, {\n query: { page: opts.page, limit: opts.limit },\n })) as CompatibleRunListResponse;\n }\n\n /**\n * Test a draft evaluation criteria without persisting it.\n *\n * @param agentId - Agent identifier.\n * @param body - Draft evaluation to test.\n * @returns Test evaluation response.\n */\n async testDraftEvaluation(agentId: string, body: TestDraftEvaluationRequest): Promise<TestDraftEvaluationResponse> {\n return (await this.request(\"POST\", `/agents/${agentId}/evaluation-criteria/test-draft`, { json: body })) as TestDraftEvaluationResponse;\n }\n\n /**\n * List all evaluation results for an agent.\n *\n * @param agentId - Agent identifier.\n * @param opts - Pagination options.\n */\n async listAgentEvaluationResults(agentId: string, opts: ListOptions = {}): Promise<EvaluationResultWithCriteriaListResponse> {\n return (await this.request(\"GET\", `/agents/${agentId}/evaluation-results`, {\n query: { page: opts.page, limit: opts.limit },\n })) as EvaluationResultWithCriteriaListResponse;\n }\n\n /**\n * List evaluation run summaries for an agent.\n *\n * @param agentId - Agent identifier.\n * @param opts - Pagination options.\n */\n async listEvaluationRuns(agentId: string, opts: ListOptions = {}): Promise<EvaluationRunSummaryListResponse> {\n return (await this.request(\"GET\", `/agents/${agentId}/evaluation-runs`, {\n query: { page: opts.page, limit: opts.limit },\n })) as EvaluationRunSummaryListResponse;\n }\n\n /**\n * Get a summary of non-manual evaluations across an agent's runs.\n *\n * @param agentId - Agent identifier.\n */\n async getNonManualEvaluationSummary(agentId: string): Promise<NonManualEvaluationSummaryResponse> {\n return (await this.request(\"GET\", \"/agents/evaluation-results/non-manual-summary\", {\n query: { agent_id: agentId },\n })) as NonManualEvaluationSummaryResponse;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Knowledge Bases\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List knowledge bases.\n *\n * @param opts - Pagination and sorting options.\n * @returns Paginated list of knowledge bases.\n */\n async listKnowledgeBases(opts: SortableListOptions = {}): Promise<KnowledgeBaseListResponse> {\n return (await this.request(\"GET\", \"/knowledge_bases\", {\n query: { page: opts.page, limit: opts.limit, sort: opts.sort, order: opts.order },\n })) as KnowledgeBaseListResponse;\n }\n\n /**\n * Create a new knowledge base.\n *\n * @param body - Knowledge base configuration.\n * @returns The created knowledge base.\n */\n async createKnowledgeBase(body: CreateKnowledgeBaseBody): Promise<KnowledgeBaseResponse> {\n return (await this.request(\"POST\", \"/knowledge_bases\", { json: body })) as KnowledgeBaseResponse;\n }\n\n /**\n * Get a knowledge base by ID.\n *\n * @param knowledgeBaseId - Knowledge base identifier.\n * @returns Knowledge base details.\n */\n async getKnowledgeBase(knowledgeBaseId: string): Promise<KnowledgeBaseResponse> {\n return (await this.request(\"GET\", `/knowledge_bases/${knowledgeBaseId}`)) as KnowledgeBaseResponse;\n }\n\n /**\n * Update a knowledge base.\n *\n * @param knowledgeBaseId - Knowledge base identifier.\n * @param body - Fields to update.\n * @returns Updated knowledge base.\n */\n async updateKnowledgeBase(knowledgeBaseId: string, body: UpdateKnowledgeBaseBody): Promise<KnowledgeBaseResponse> {\n return (await this.request(\"PUT\", `/knowledge_bases/${knowledgeBaseId}`, { json: body })) as KnowledgeBaseResponse;\n }\n\n /**\n * Delete a knowledge base.\n *\n * @param knowledgeBaseId - Knowledge base identifier.\n */\n async deleteKnowledgeBase(knowledgeBaseId: string): Promise<void> {\n await this.request(\"DELETE\", `/knowledge_bases/${knowledgeBaseId}`);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Memory Banks\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List memory banks.\n *\n * @param opts - Pagination and sorting options.\n * @returns Paginated list of memory banks.\n */\n async listMemoryBanks(opts: SortableListOptions = {}): Promise<MemoryBankListResponse> {\n return (await this.request(\"GET\", \"/memory_banks\", {\n query: { page: opts.page, limit: opts.limit, sort: opts.sort, order: opts.order },\n })) as MemoryBankListResponse;\n }\n\n /**\n * Create a new memory bank.\n *\n * Memory banks give agents persistent memory across conversations.\n * Types: `conversation` (chat-style history) or `general` (flat factual entries).\n *\n * @param body - Memory bank configuration.\n * @returns The created memory bank.\n */\n async createMemoryBank(body: CreateMemoryBankBody): Promise<MemoryBankResponse> {\n return (await this.request(\"POST\", \"/memory_banks\", { json: body })) as MemoryBankResponse;\n }\n\n /**\n * Get a memory bank by ID.\n *\n * @param memoryBankId - Memory bank identifier.\n * @returns Memory bank details.\n */\n async getMemoryBank(memoryBankId: string): Promise<MemoryBankResponse> {\n return (await this.request(\"GET\", `/memory_banks/${memoryBankId}`)) as MemoryBankResponse;\n }\n\n /**\n * Update a memory bank.\n *\n * @param memoryBankId - Memory bank identifier.\n * @param body - Fields to update.\n * @returns Updated memory bank.\n */\n async updateMemoryBank(memoryBankId: string, body: UpdateMemoryBankBody): Promise<MemoryBankResponse> {\n return (await this.request(\"PUT\", `/memory_banks/${memoryBankId}`, { json: body })) as MemoryBankResponse;\n }\n\n /**\n * Delete a memory bank.\n *\n * @param memoryBankId - Memory bank identifier.\n */\n async deleteMemoryBank(memoryBankId: string): Promise<void> {\n await this.request(\"DELETE\", `/memory_banks/${memoryBankId}`);\n }\n\n /**\n * Get agents that are using a specific memory bank.\n *\n * @param memoryBankId - Memory bank identifier.\n */\n async getAgentsUsingMemoryBank(memoryBankId: string): Promise<unknown> {\n return await this.request(\"GET\", `/memory_banks/${memoryBankId}/agents`);\n }\n\n /**\n * Get stats for a memory bank.\n *\n * @param memoryBankId - Memory bank identifier.\n */\n async getMemoryBankStats(memoryBankId: string): Promise<unknown> {\n return await this.request(\"GET\", `/memory_banks/${memoryBankId}/stats`);\n }\n\n /**\n * Compact a memory bank (trigger compaction).\n *\n * @param memoryBankId - Memory bank identifier.\n */\n async compactMemoryBank(memoryBankId: string): Promise<void> {\n await this.request(\"POST\", `/memory_banks/${memoryBankId}/compact`);\n }\n\n /**\n * Delete a memory bank source.\n *\n * @param memoryBankId - Memory bank identifier.\n */\n async deleteMemoryBankSource(memoryBankId: string): Promise<void> {\n await this.request(\"DELETE\", `/memory_banks/${memoryBankId}/source`);\n }\n\n /**\n * Test compaction for a specific memory bank.\n *\n * @param memoryBankId - Memory bank identifier.\n * @param body - Test compaction request.\n */\n async testMemoryBankCompaction(memoryBankId: string, body: TestCompactionRequest): Promise<CompactionTestResponse> {\n return (await this.request(\"POST\", `/memory_banks/${memoryBankId}/test-compaction`, { json: body })) as CompactionTestResponse;\n }\n\n /**\n * Test compaction prompt standalone (not tied to a specific memory bank).\n *\n * @param body - Standalone compaction test request.\n */\n async testCompactionPromptStandalone(body: StandaloneTestCompactionRequest): Promise<CompactionTestResponse> {\n return (await this.request(\"POST\", \"/memory_banks/test-compaction\", { json: body })) as CompactionTestResponse;\n }\n\n /**\n * List available memory bank templates.\n */\n async listMemoryBankTemplates(): Promise<unknown> {\n return await this.request(\"GET\", \"/memory_banks/templates\");\n }\n\n // ─── Memory Bank AI Assistant ──────────────────────────────────────────────\n\n /**\n * Generate memory bank configuration using AI.\n *\n * @param body - AI assistant request with user instructions.\n * @returns AI-generated memory bank config.\n */\n async generateMemoryBankConfig(body: MemoryBankAiAssistantRequest): Promise<MemoryBankAiAssistantResponse> {\n return (await this.request(\"POST\", \"/memory_banks/ai-assistant\", { json: body })) as MemoryBankAiAssistantResponse;\n }\n\n /**\n * Get the last AI conversation for memory banks.\n */\n async getMemoryBankAiLastConversation(): Promise<MemoryBankLastConversationResponse> {\n return (await this.request(\"GET\", \"/memory_banks/ai-assistant/last-conversation\")) as MemoryBankLastConversationResponse;\n }\n\n /**\n * Accept a memory bank AI suggestion.\n *\n * @param conversationId - Conversation identifier.\n * @param body - Accept request payload.\n */\n async acceptMemoryBankAiSuggestion(conversationId: string, body: MemoryBankAcceptRequest): Promise<unknown> {\n return await this.request(\"PATCH\", `/memory_banks/ai-assistant/${conversationId}`, { json: body });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Sources\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List sources.\n *\n * @param opts - Pagination, sorting, and filter options.\n * @returns Paginated list of sources.\n */\n async listSources(\n opts: SortableListOptions & { accountId?: string } = {},\n ): Promise<SourceListResponse> {\n return (await this.request(\"GET\", \"/sources/\", {\n query: {\n page: opts.page,\n limit: opts.limit,\n sort: opts.sort,\n order: opts.order,\n account_id: opts.accountId,\n },\n })) as SourceListResponse;\n }\n\n /**\n * Create a new content source.\n *\n * @param body - Source configuration (type, name, knowledge base link, etc.).\n * @returns The created source.\n */\n async createSource(body: CreateSourceBody): Promise<SourceResponse> {\n return (await this.request(\"POST\", \"/sources\", { json: body })) as SourceResponse;\n }\n\n /**\n * Get a source by ID.\n *\n * @param sourceId - Source connection identifier.\n * @returns Source details.\n */\n async getSource(sourceId: string): Promise<SourceResponse> {\n return (await this.request(\"GET\", `/sources/${sourceId}`)) as SourceResponse;\n }\n\n /**\n * Update a source.\n *\n * @param sourceId - Source connection identifier.\n * @param body - Fields to update.\n * @returns Updated source.\n */\n async updateSource(sourceId: string, body: UpdateSourceBody): Promise<SourceResponse> {\n return (await this.request(\"PUT\", `/sources/${sourceId}`, { json: body })) as SourceResponse;\n }\n\n /**\n * Delete a source.\n *\n * @param sourceId - Source connection identifier.\n */\n async deleteSource(sourceId: string): Promise<void> {\n await this.request(\"DELETE\", `/sources/${sourceId}`);\n }\n\n /**\n * Upload a file to a source.\n *\n * Maximum file size: 200 MiB. Supports text, PDF, DOCX, audio, video, images, and more.\n * If `mimeType` is omitted, it will be inferred from the `fileName` extension when possible.\n *\n * @param sourceId - Source connection identifier.\n * @param opts - File payload and optional metadata.\n * @returns Upload response details.\n */\n async uploadFileToSource(\n sourceId: string,\n opts: {\n file: Blob | Uint8Array | ArrayBuffer | BufferSource;\n title?: string;\n metadata?: Record<string, unknown>;\n fileName?: string;\n mimeType?: string;\n },\n ): Promise<FileUploadResponse> {\n return (await this.uploadFile(`/sources/${sourceId}/upload`, opts)) as FileUploadResponse;\n }\n\n /**\n * Upload inline text to a source.\n *\n * @param sourceId - Source connection identifier.\n * @param body - Inline text upload payload.\n * @returns Upload response.\n */\n async uploadInlineTextToSource(sourceId: string, body: InlineTextUploadRequest): Promise<FileUploadResponse> {\n return (await this.request(\"POST\", `/sources/${sourceId}`, { json: body })) as FileUploadResponse;\n }\n\n // ─── Source Exports ────────────────────────────────────────────────────────\n\n /**\n * List exports for a source.\n *\n * @param sourceId - Source connection identifier.\n * @param opts - Pagination options.\n * @returns Paginated list of exports.\n */\n async listSourceExports(sourceId: string, opts: ListOptions = {}): Promise<ExportListResponse> {\n return (await this.request(\"GET\", `/sources/${sourceId}/exports`, {\n query: { page: opts.page, limit: opts.limit },\n })) as ExportListResponse;\n }\n\n /**\n * Create a source data export.\n *\n * @param sourceId - Source connection identifier.\n * @param body - Export configuration (format, etc.).\n * @returns Export response with job status.\n */\n async createSourceExport(sourceId: string, body: CreateExportRequest): Promise<ExportResponse> {\n return (await this.request(\"POST\", `/sources/${sourceId}/exports`, { json: body })) as ExportResponse;\n }\n\n /**\n * Get a specific source export.\n *\n * @param sourceId - Source connection identifier.\n * @param exportId - Export identifier.\n * @returns Export details.\n */\n async getSourceExport(sourceId: string, exportId: string): Promise<ExportResponse> {\n return (await this.request(\"GET\", `/sources/${sourceId}/exports/${exportId}`)) as ExportResponse;\n }\n\n /**\n * Cancel a source export.\n *\n * @param sourceId - Source connection identifier.\n * @param exportId - Export identifier.\n */\n async cancelSourceExport(sourceId: string, exportId: string): Promise<ExportResponse> {\n return (await this.request(\"POST\", `/sources/${sourceId}/exports/${exportId}/cancel`)) as ExportResponse;\n }\n\n /**\n * Download a source export file.\n *\n * Returns the raw `Response` so you can stream or save the binary data.\n *\n * @param sourceId - Source connection identifier.\n * @param exportId - Export identifier.\n * @returns Raw response with the export file.\n */\n async downloadSourceExport(sourceId: string, exportId: string): Promise<Response> {\n return await this.requestRaw(\"GET\", `/sources/${sourceId}/exports/${exportId}/download`);\n }\n\n /**\n * Estimate a source export.\n *\n * @param sourceId - Source connection identifier.\n * @param body - Estimate request.\n * @returns Export estimate.\n */\n async estimateSourceExport(sourceId: string, body: EstimateExportRequest): Promise<EstimateExportResponse> {\n return (await this.request(\"POST\", `/sources/${sourceId}/exports/estimate`, { json: body })) as EstimateExportResponse;\n }\n\n /**\n * Delete a source export.\n *\n * @param sourceId - Source connection identifier.\n * @param exportId - Export identifier.\n */\n async deleteSourceExport(sourceId: string, exportId: string): Promise<void> {\n await this.request(\"DELETE\", `/sources/${sourceId}/exports/${exportId}`);\n }\n\n // ─── Source Embedding Migrations ───────────────────────────────────────────\n\n /**\n * Get the status of a source embedding migration.\n *\n * @param sourceId - Source connection identifier.\n * @returns Migration status.\n */\n async getSourceEmbeddingMigration(sourceId: string): Promise<SourceEmbeddingMigrationResponse> {\n return (await this.request(\"GET\", `/sources/${sourceId}/embedding-migration`)) as SourceEmbeddingMigrationResponse;\n }\n\n /**\n * Start a source embedding migration.\n *\n * @param sourceId - Source connection identifier.\n * @param body - Migration configuration (target embedding model, etc.).\n * @returns Migration status.\n */\n async startSourceEmbeddingMigration(sourceId: string, body: StartSourceEmbeddingMigrationRequest): Promise<SourceEmbeddingMigrationResponse> {\n return (await this.request(\"POST\", `/sources/${sourceId}/embedding-migration`, { json: body })) as SourceEmbeddingMigrationResponse;\n }\n\n /**\n * Cancel a source embedding migration.\n *\n * @param sourceId - Source connection identifier.\n * @returns Updated migration status.\n */\n async cancelSourceEmbeddingMigration(sourceId: string): Promise<SourceEmbeddingMigrationResponse> {\n return (await this.request(\"POST\", `/sources/${sourceId}/embedding-migration/cancel`)) as SourceEmbeddingMigrationResponse;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Content\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Get content detail for a specific content version.\n *\n * @param contentVersionId - Content version identifier.\n * @param opts - Range options for slicing large content.\n * @returns Content details for the requested range.\n */\n async getContentDetail(\n contentVersionId: string,\n opts: { start?: number; end?: number } = {},\n ): Promise<ContentDetailResponse> {\n return (await this.request(\"GET\", `/contents/${contentVersionId}`, {\n query: { start: opts.start ?? 0, end: opts.end ?? 5000 },\n })) as ContentDetailResponse;\n }\n\n /**\n * Replace content with inline text.\n *\n * @param contentVersionId - Content version identifier.\n * @param body - Inline text replacement payload.\n */\n async replaceContentWithInlineText(contentVersionId: string, body: InlineTextReplaceRequest): Promise<ContentFileUploadResponse> {\n return (await this.request(\"PUT\", `/contents/${contentVersionId}`, { json: body })) as ContentFileUploadResponse;\n }\n\n /**\n * Delete a specific content version.\n *\n * @param contentVersionId - Content version identifier.\n */\n async deleteContent(contentVersionId: string): Promise<void> {\n await this.request(\"DELETE\", `/contents/${contentVersionId}`);\n }\n\n /**\n * List embeddings for a content version.\n *\n * @param contentVersionId - Content version identifier.\n * @param opts - Pagination options.\n * @returns Paginated list of embeddings.\n */\n async listContentEmbeddings(\n contentVersionId: string,\n opts: ListOptions = {},\n ): Promise<ContentEmbeddingsListResponse> {\n return (await this.request(\"GET\", `/contents/${contentVersionId}/embeddings`, {\n query: { page: opts.page ?? 1, limit: opts.limit ?? 20 },\n })) as ContentEmbeddingsListResponse;\n }\n\n /**\n * Upload a file to replace content for an existing content version.\n *\n * @param contentVersionId - Content version identifier.\n * @param opts - File payload and optional metadata.\n * @returns Upload response.\n */\n async uploadFileToContent(\n contentVersionId: string,\n opts: {\n file: Blob | Uint8Array | ArrayBuffer | BufferSource;\n title?: string;\n metadata?: Record<string, unknown>;\n fileName?: string;\n mimeType?: string;\n },\n ): Promise<ContentFileUploadResponse> {\n return (await this.uploadFile(`/contents/${contentVersionId}/upload`, opts)) as ContentFileUploadResponse;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Solutions\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List solutions.\n *\n * @param opts - Pagination and sorting options.\n * @returns Paginated list of solutions.\n */\n async listSolutions(opts: SortableListOptions = {}): Promise<SolutionListResponse> {\n return (await this.request(\"GET\", \"/solutions\", {\n query: { page: opts.page, limit: opts.limit, sort: opts.sort, order: opts.order },\n })) as SolutionListResponse;\n }\n\n /**\n * Create a new solution.\n *\n * @param body - Solution configuration.\n * @returns The created solution.\n */\n async createSolution(body: CreateSolutionRequest): Promise<SolutionResponse> {\n return (await this.request(\"POST\", \"/solutions\", { json: body })) as SolutionResponse;\n }\n\n /**\n * Get a solution by ID.\n *\n * @param solutionId - Solution identifier.\n * @returns Solution details.\n */\n async getSolution(solutionId: string): Promise<SolutionResponse> {\n return (await this.request(\"GET\", `/solutions/${solutionId}`)) as SolutionResponse;\n }\n\n /**\n * Update a solution.\n *\n * @param solutionId - Solution identifier.\n * @param body - Fields to update.\n * @returns Updated solution.\n */\n async updateSolution(solutionId: string, body: UpdateSolutionRequest): Promise<SolutionResponse> {\n return (await this.request(\"PATCH\", `/solutions/${solutionId}`, { json: body })) as SolutionResponse;\n }\n\n /**\n * Delete a solution.\n *\n * @param solutionId - Solution identifier.\n */\n async deleteSolution(solutionId: string): Promise<void> {\n await this.request(\"DELETE\", `/solutions/${solutionId}`);\n }\n\n // ─── Solution Resource Linking ─────────────────────────────────────────────\n\n /**\n * Link agents to a solution.\n *\n * @param solutionId - Solution identifier.\n * @param body - Resource IDs to link.\n * @returns Updated solution.\n */\n async linkAgentsToSolution(solutionId: string, body: LinkResourcesRequest): Promise<SolutionResponse> {\n return (await this.request(\"POST\", `/solutions/${solutionId}/agents`, { json: body })) as SolutionResponse;\n }\n\n /**\n * Unlink agents from a solution.\n *\n * @param solutionId - Solution identifier.\n * @param body - Resource IDs to unlink.\n * @returns Updated solution.\n */\n async unlinkAgentsFromSolution(solutionId: string, body: UnlinkResourcesRequest): Promise<SolutionResponse> {\n return (await this.request(\"DELETE\", `/solutions/${solutionId}/agents`, { json: body })) as SolutionResponse;\n }\n\n /**\n * Link knowledge bases to a solution.\n *\n * @param solutionId - Solution identifier.\n * @param body - Resource IDs to link.\n * @returns Updated solution.\n */\n async linkKnowledgeBasesToSolution(solutionId: string, body: LinkResourcesRequest): Promise<SolutionResponse> {\n return (await this.request(\"POST\", `/solutions/${solutionId}/knowledge-bases`, { json: body })) as SolutionResponse;\n }\n\n /**\n * Unlink knowledge bases from a solution.\n *\n * @param solutionId - Solution identifier.\n * @param body - Resource IDs to unlink.\n * @returns Updated solution.\n */\n async unlinkKnowledgeBasesFromSolution(solutionId: string, body: UnlinkResourcesRequest): Promise<SolutionResponse> {\n return (await this.request(\"DELETE\", `/solutions/${solutionId}/knowledge-bases`, { json: body })) as SolutionResponse;\n }\n\n /**\n * Link source connections to a solution.\n *\n * @param solutionId - Solution identifier.\n * @param body - Resource IDs to link.\n * @returns Updated solution.\n */\n async linkSourceConnectionsToSolution(solutionId: string, body: LinkResourcesRequest): Promise<SolutionResponse> {\n return (await this.request(\"POST\", `/solutions/${solutionId}/source-connections`, { json: body })) as SolutionResponse;\n }\n\n /**\n * Unlink source connections from a solution.\n *\n * @param solutionId - Solution identifier.\n * @param body - Resource IDs to unlink.\n * @returns Updated solution.\n */\n async unlinkSourceConnectionsFromSolution(solutionId: string, body: UnlinkResourcesRequest): Promise<SolutionResponse> {\n return (await this.request(\"DELETE\", `/solutions/${solutionId}/source-connections`, { json: body })) as SolutionResponse;\n }\n\n // ─── Solution Conversations ────────────────────────────────────────────────\n\n /**\n * List conversations for a solution.\n *\n * @param solutionId - Solution identifier.\n * @returns List of conversations.\n */\n async listSolutionConversations(solutionId: string): Promise<SolutionConversationResponse[]> {\n return (await this.request(\"GET\", `/solutions/${solutionId}/conversations`)) as SolutionConversationResponse[];\n }\n\n /**\n * Add a conversation turn to a solution.\n *\n * @param solutionId - Solution identifier.\n * @param body - Conversation turn payload.\n * @returns Updated conversation.\n */\n async addSolutionConversationTurn(solutionId: string, body: AddConversationTurnRequest): Promise<SolutionConversationResponse> {\n return (await this.request(\"POST\", `/solutions/${solutionId}/conversations`, { json: body })) as SolutionConversationResponse;\n }\n\n /**\n * Mark a conversation turn (e.g. accepted/rejected).\n *\n * @param solutionId - Solution identifier.\n * @param conversationId - Conversation identifier.\n * @param body - Mark payload.\n */\n async markSolutionConversationTurn(solutionId: string, conversationId: string, body: MarkConversationTurnRequest): Promise<void> {\n await this.request(\"PATCH\", `/solutions/${solutionId}/conversations/${conversationId}`, { json: body });\n }\n\n // ─── Solution AI Assistant ─────────────────────────────────────────────────\n\n /**\n * Generate a solution AI plan.\n *\n * @param solutionId - Solution identifier.\n * @param body - Generation request.\n * @returns AI-generated plan.\n */\n async generateSolutionAiPlan(solutionId: string, body: AiAssistantGenerateRequest): Promise<AiAssistantGenerateResponse> {\n return (await this.request(\"POST\", `/solutions/${solutionId}/ai-assistant/generate`, { json: body })) as AiAssistantGenerateResponse;\n }\n\n /**\n * Generate a knowledge base configuration via solution AI.\n *\n * @param solutionId - Solution identifier.\n * @param body - Generation request.\n * @returns AI-generated knowledge base config.\n */\n async generateSolutionAiKnowledgeBase(solutionId: string, body: AiAssistantGenerateRequest): Promise<AiAssistantGenerateResponse> {\n return (await this.request(\"POST\", `/solutions/${solutionId}/ai-assistant/knowledge-base`, { json: body })) as AiAssistantGenerateResponse;\n }\n\n /**\n * Generate a source configuration via solution AI.\n *\n * @param solutionId - Solution identifier.\n * @param body - Generation request.\n * @returns AI-generated source config.\n */\n async generateSolutionAiSource(solutionId: string, body: AiAssistantGenerateRequest): Promise<AiAssistantGenerateResponse> {\n return (await this.request(\"POST\", `/solutions/${solutionId}/ai-assistant/source`, { json: body })) as AiAssistantGenerateResponse;\n }\n\n /**\n * Accept a solution AI plan.\n *\n * @param solutionId - Solution identifier.\n * @param conversationId - Conversation identifier.\n * @param body - Accept request.\n * @returns Acceptance result with executed actions.\n */\n async acceptSolutionAiPlan(solutionId: string, conversationId: string, body: AiAssistantAcceptRequest): Promise<AiAssistantAcceptResponse> {\n return (await this.request(\"POST\", `/solutions/${solutionId}/ai-assistant/${conversationId}/accept`, { json: body })) as AiAssistantAcceptResponse;\n }\n\n /**\n * Decline a solution AI plan.\n *\n * @param solutionId - Solution identifier.\n * @param conversationId - Conversation identifier.\n */\n async declineSolutionAiPlan(solutionId: string, conversationId: string): Promise<void> {\n await this.request(\"POST\", `/solutions/${solutionId}/ai-assistant/${conversationId}/decline`);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Governance — AI Assistant\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Generate governance policy suggestions using AI.\n *\n * @param body - AI governance request.\n * @returns AI-generated governance suggestions.\n */\n async generateGovernanceAiPlan(body: GovernanceAiAssistantRequest): Promise<GovernanceAiAssistantResponse> {\n return (await this.request(\"POST\", \"/governance/ai-assistant\", { json: body })) as GovernanceAiAssistantResponse;\n }\n\n /**\n * List governance AI conversations.\n */\n async listGovernanceAiConversations(): Promise<GovernanceConversationResponse[]> {\n return (await this.request(\"GET\", \"/governance/ai-assistant/conversations\")) as GovernanceConversationResponse[];\n }\n\n /**\n * Accept a governance AI plan.\n *\n * @param conversationId - Conversation identifier.\n * @returns Acceptance result.\n */\n async acceptGovernanceAiPlan(conversationId: string): Promise<GovernanceAiAcceptResponse> {\n return (await this.request(\"POST\", `/governance/ai-assistant/${conversationId}/accept`)) as GovernanceAiAcceptResponse;\n }\n\n /**\n * Decline a governance AI plan.\n *\n * @param conversationId - Conversation identifier.\n */\n async declineGovernanceAiPlan(conversationId: string): Promise<void> {\n await this.request(\"POST\", `/governance/ai-assistant/${conversationId}/decline`);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Alerts\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List alerts.\n *\n * @param opts - Pagination and filter options.\n * @returns Paginated list of alerts.\n */\n async listAlerts(opts: ListOptions & { status?: string; severity?: string } = {}): Promise<unknown> {\n return await this.request(\"GET\", \"/alerts\", {\n query: { page: opts.page, limit: opts.limit, status: opts.status, severity: opts.severity },\n });\n }\n\n /**\n * Get alert details by ID.\n *\n * @param alertId - Alert identifier.\n * @returns Alert details.\n */\n async getAlert(alertId: string): Promise<unknown> {\n return await this.request(\"GET\", `/alerts/${alertId}`);\n }\n\n /**\n * Change the status of an alert.\n *\n * @param alertId - Alert identifier.\n * @param body - Status change request.\n */\n async changeAlertStatus(alertId: string, body: ChangeStatusRequest): Promise<unknown> {\n return await this.request(\"POST\", `/alerts/${alertId}/status`, { json: body });\n }\n\n /**\n * Add a comment to an alert.\n *\n * @param alertId - Alert identifier.\n * @param body - Comment payload.\n */\n async addAlertComment(alertId: string, body: AddCommentRequest): Promise<unknown> {\n return await this.request(\"POST\", `/alerts/${alertId}/comments`, { json: body });\n }\n\n /**\n * Subscribe to an alert.\n *\n * @param alertId - Alert identifier.\n */\n async subscribeToAlert(alertId: string): Promise<unknown> {\n return await this.request(\"POST\", `/alerts/${alertId}/subscribe`);\n }\n\n /**\n * Unsubscribe from an alert.\n *\n * @param alertId - Alert identifier.\n */\n async unsubscribeFromAlert(alertId: string): Promise<unknown> {\n return await this.request(\"POST\", `/alerts/${alertId}/unsubscribe`);\n }\n\n // ─── Alert Configs ─────────────────────────────────────────────────────────\n\n /**\n * List alert configurations.\n *\n * @param opts - Pagination options.\n * @returns Paginated list of alert configs.\n */\n async listAlertConfigs(opts: ListOptions = {}): Promise<unknown> {\n return await this.request(\"GET\", \"/alerts/configs\", {\n query: { page: opts.page, limit: opts.limit },\n });\n }\n\n /**\n * Create an alert configuration.\n *\n * @param body - Alert config definition.\n * @returns Created alert config.\n */\n async createAlertConfig(body: CreateAlertConfigRequest): Promise<unknown> {\n return await this.request(\"POST\", \"/alerts/configs\", { json: body });\n }\n\n /**\n * Get an alert configuration by ID.\n *\n * @param configId - Alert config identifier.\n * @returns Alert config details.\n */\n async getAlertConfig(configId: string): Promise<unknown> {\n return await this.request(\"GET\", `/alerts/configs/${configId}`);\n }\n\n /**\n * Update an alert configuration.\n *\n * @param configId - Alert config identifier.\n * @param body - Fields to update.\n * @returns Updated alert config.\n */\n async updateAlertConfig(configId: string, body: UpdateAlertConfigRequest): Promise<unknown> {\n return await this.request(\"PATCH\", `/alerts/configs/${configId}`, { json: body });\n }\n\n /**\n * Delete an alert configuration.\n *\n * @param configId - Alert config identifier.\n */\n async deleteAlertConfig(configId: string): Promise<void> {\n await this.request(\"DELETE\", `/alerts/configs/${configId}`);\n }\n\n // ─── Organization Alert Preferences ────────────────────────────────────────\n\n /**\n * List organization alert preferences.\n */\n async listOrganizationAlertPreferences(): Promise<OrganizationAlertPreferenceListResponse> {\n return (await this.request(\"GET\", \"/alerts/organization-preferences/list\")) as OrganizationAlertPreferenceListResponse;\n }\n\n /**\n * Update an organization alert preference.\n *\n * @param organizationId - Organization identifier.\n * @param alertType - Alert type.\n * @param body - Preference update.\n */\n async updateOrganizationAlertPreference(\n organizationId: string,\n alertType: string,\n body: UpdateOrganizationAlertPreferenceRequest,\n ): Promise<unknown> {\n return await this.request(\"PATCH\", `/alerts/organization-preferences/${organizationId}/${alertType}`, { json: body });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Models & Model Alerts\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * List model alerts.\n *\n * @param opts - Pagination options.\n */\n async listModelAlerts(opts: ListOptions = {}): Promise<unknown> {\n return await this.request(\"GET\", \"/models/alerts\", {\n query: { page: opts.page, limit: opts.limit },\n });\n }\n\n /**\n * Mark all model alerts as read.\n */\n async markAllModelAlertsRead(): Promise<void> {\n await this.request(\"POST\", \"/models/alerts/mark-all-read\");\n }\n\n /**\n * Get unread model alert count.\n */\n async getUnreadModelAlertCount(): Promise<unknown> {\n return await this.request(\"GET\", \"/models/alerts/unread-count\");\n }\n\n /**\n * Mark a specific model alert as read.\n *\n * @param alertId - Model alert identifier.\n */\n async markModelAlertRead(alertId: string): Promise<void> {\n await this.request(\"PATCH\", `/models/alerts/${alertId}/read`);\n }\n\n /**\n * Get model recommendations.\n *\n * @param modelId - Model identifier.\n */\n async getModelRecommendations(modelId: string): Promise<unknown> {\n return await this.request(\"GET\", `/models/${modelId}/recommendations`);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Search\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Search across all resource types in your account.\n *\n * Accepts a free-text keyword query or a UUID. Results are ranked:\n * name-prefix > name-substring > description-substring.\n *\n * @param opts - Search options.\n * @param opts.query - Search query string (required, 1-200 chars).\n * @param opts.limit - Maximum results (1-50, default 10).\n * @param opts.entityType - Optional entity type filter (e.g. \"agent\", \"knowledge_base\").\n * @returns Search results.\n */\n async search(opts: { query: string; limit?: number; entityType?: string }): Promise<unknown> {\n return await this.request(\"GET\", \"/search\", {\n query: { q: opts.query, limit: opts.limit, entity_type: opts.entityType },\n });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Top-Level AI Assistant\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Submit feedback on an AI assistant interaction.\n *\n * @param body - Feedback payload (thumbs up/down, optional comment).\n * @returns Feedback response.\n */\n async submitAiFeedback(body: AiAssistantFeedbackRequest): Promise<AiAssistantFeedbackResponse> {\n return (await this.request(\"POST\", \"/ai-assistant/feedback\", { json: body })) as AiAssistantFeedbackResponse;\n }\n\n /**\n * Generate a knowledge base configuration via AI assistant.\n *\n * @param body - Generation request.\n */\n async aiAssistantKnowledgeBase(body: AiAssistantGenerateRequest): Promise<AiAssistantGenerateResponse> {\n return (await this.request(\"POST\", \"/ai-assistant/knowledge-base\", { json: body })) as AiAssistantGenerateResponse;\n }\n\n /**\n * Generate a source configuration via AI assistant.\n *\n * @param body - Generation request.\n */\n async aiAssistantSource(body: AiAssistantGenerateRequest): Promise<AiAssistantGenerateResponse> {\n return (await this.request(\"POST\", \"/ai-assistant/source\", { json: body })) as AiAssistantGenerateResponse;\n }\n\n /**\n * Generate a solution via AI assistant.\n *\n * @param body - Generation request.\n */\n async aiAssistantSolution(body: AiAssistantGenerateRequest): Promise<AiAssistantGenerateResponse> {\n return (await this.request(\"POST\", \"/ai-assistant/solution\", { json: body })) as AiAssistantGenerateResponse;\n }\n\n /**\n * Generate a memory bank configuration via AI assistant.\n *\n * @param body - Generation request.\n */\n async aiAssistantMemoryBank(body: AiAssistantGenerateRequest): Promise<MemoryBankAiAssistantResponse> {\n return (await this.request(\"POST\", \"/ai-assistant/memory-bank\", { json: body })) as MemoryBankAiAssistantResponse;\n }\n\n /**\n * Get AI assistant memory bank conversation history.\n */\n async getAiAssistantMemoryBankHistory(): Promise<MemoryBankLastConversationResponse> {\n return (await this.request(\"GET\", \"/ai-assistant/memory-bank/last-conversation\")) as MemoryBankLastConversationResponse;\n }\n\n /**\n * Accept an AI assistant suggestion.\n *\n * @param conversationId - Conversation identifier.\n * @param body - Acceptance request payload.\n */\n async acceptAiAssistantPlan(conversationId: string, body: AiAssistantAcceptRequest): Promise<AiAssistantAcceptResponse> {\n return (await this.request(\"POST\", `/ai-assistant/${conversationId}/accept`, { json: body })) as AiAssistantAcceptResponse;\n }\n\n /**\n * Decline an AI assistant suggestion.\n *\n * @param conversationId - Conversation identifier.\n */\n async declineAiAssistantPlan(conversationId: string): Promise<void> {\n await this.request(\"POST\", `/ai-assistant/${conversationId}/decline`);\n }\n\n /**\n * Accept/mark an AI memory bank suggestion.\n *\n * @param conversationId - Conversation identifier.\n * @param body - Acceptance payload for the memory bank suggestion.\n */\n async acceptAiMemoryBankSuggestion(conversationId: string, body: MemoryBankAcceptRequest): Promise<unknown> {\n return await this.request(\"PATCH\", `/ai-assistant/memory-bank/${conversationId}`, { json: body });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Pagination Helpers\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Auto-paginate through a list endpoint.\n *\n * Yields individual items from each page, automatically fetching the next page\n * until all items have been returned.\n *\n * @param fetchPage - A function that fetches a single page given `{ page, limit }`.\n * @param opts - Page size (default: 50).\n *\n * @example\n * ```ts\n * for await (const agent of client.paginate(\n * (opts) => client.listAgents(opts),\n * )) {\n * console.log(agent);\n * }\n * ```\n */\n async *paginate<T>(\n fetchPage: (opts: { page: number; limit: number }) => Promise<{ items: T[]; pagination?: { page: number; total_pages: number } }>,\n opts?: { limit?: number },\n ): AsyncGenerator<T, void, undefined> {\n const limit = opts?.limit ?? 50;\n let page = 1;\n\n while (true) {\n const result = await fetchPage({ page, limit });\n for (const item of result.items) {\n yield item;\n }\n\n if (\n !result.pagination ||\n result.items.length < limit ||\n page >= result.pagination.total_pages\n ) {\n break;\n }\n page++;\n }\n }\n}\n"],"mappings":"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","names":["getEnv"]}
|