@fabric-platform/sdk 0.2.2 → 0.2.3
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/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/auth.ts","../src/errors.ts","../src/http.ts","../src/resources/auth.resource.ts","../src/resources/me.resource.ts","../src/resources/organizations.resource.ts","../src/resources/teams.resource.ts","../src/types/events.ts","../src/streaming.ts","../src/resources/workflows.resource.ts","../src/resources/events.resource.ts","../src/resources/assets.resource.ts","../src/resources/galleries.resource.ts","../src/resources/api-keys.resource.ts","../src/resources/invitations.resource.ts","../src/resources/permissions.resource.ts","../src/resources/webhooks.resource.ts","../src/resources/service-accounts.resource.ts","../src/resources/oauth.resource.ts","../src/resources/admin.resource.ts","../src/resources/schedules.resource.ts","../src/resources/providers.resource.ts","../src/resources/packages.resource.ts","../src/client.ts","../src/pagination.ts","../src/verify-webhook.ts","../src/_compat.ts"],"sourcesContent":["// ── Client ───────────────────────────────────────────────────────────────\nexport { FabricClient } from \"./client.js\";\nexport type { FabricConfig } from \"./client.js\";\n\n// ── Errors ───────────────────────────────────────────────────────────────\nexport {\n FabricError,\n FabricValidationError,\n FabricAuthError,\n FabricForbiddenError,\n FabricNotFoundError,\n FabricConflictError,\n FabricRateLimitError,\n FabricServerError,\n} from \"./errors.js\";\nexport type { FabricErrorParams } from \"./errors.js\";\n\n// ── Auth strategy ────────────────────────────────────────────────────────\nexport type { AuthStrategy, AuthConfig } from \"./auth.js\";\n\n// ── HTTP transport types ────────────────────────────────────────────────\nexport type { RequestInterceptor, ResponseInterceptor } from \"./http.js\";\n\n// ── Pagination ───────────────────────────────────────────────────────────\nexport { paginate, paginateAll, paginateItems } from \"./pagination.js\";\nexport type { Pagination, PaginatedResponse, PaginationParams } from \"./pagination.js\";\n\n// ── Streaming ────────────────────────────────────────────────────────────\nexport { matchesFilter, connectReconnectingSSE } from \"./streaming.js\";\nexport type { EventStream, SSEEvent, ReconnectingSSEOptions } from \"./streaming.js\";\n\n// ── Webhook verification ────────────────────────────────────────────────\nexport { verifyWebhookSignature, constructWebhookEvent } from \"./verify-webhook.js\";\nexport type { WebhookHeaders } from \"./verify-webhook.js\";\n\n// ── Types ────────────────────────────────────────────────────────────────\nexport type {\n // Envelope\n Meta,\n RequestContext,\n ErrorBody,\n Envelope,\n PaginatedData,\n // Auth\n AuthUser,\n AuthResponse,\n MfaEnrollResponse,\n MfaChallengeResponse,\n MfaVerifyResponse,\n // Common\n Role,\n // Organizations\n Organization,\n CreateOrganizationRequest,\n UpdateOrganizationRequest,\n Membership,\n OrgUsageSummary,\n OrgBudget,\n OrgSecret,\n CreateSecretRequest,\n OrgSettings,\n UpdateOrgSettingsRequest,\n RotateWebhookSecretResponse,\n UsageDailyEntry,\n UsageRecord,\n SystemInfo,\n SystemStatus,\n // Teams\n Team,\n CreateTeamRequest,\n // Workflows\n WorkflowLanguage,\n WorkflowSource,\n RunStatus,\n RegistryEntry,\n CreateRegistryRequest,\n ComposeWorkflowRequest,\n RunProgress,\n WorkflowRun,\n SubmitRunRequest,\n NodeAttempt,\n NodeCostHint,\n HistoricalCostSummary,\n WorkflowCostEstimate,\n EstimateWorkflowRequest,\n WatchRunOptions,\n RunWatcher,\n RunArtifact,\n RecordArtifactRequest,\n // Events\n EventKind,\n DomainEvent,\n EventHandler,\n EventStreamFilter,\n WebSocketCommand,\n WebSocketAck,\n // Assets\n AssetKind,\n Asset,\n SignedUrlResponse,\n // Galleries\n Gallery,\n GalleryItem,\n CreateGalleryRequest,\n AddGalleryItemRequest,\n // API Keys\n ApiKey,\n CreateApiKeyResponse,\n CreateApiKeyRequest,\n // Service Accounts\n ServiceAccount,\n CreateServiceAccountRequest,\n // Permissions\n PermissionEffect,\n Permission,\n GrantPermissionRequest,\n AuthzCheckRequest,\n AuthzCheckResponse,\n // Webhooks\n Webhook,\n WebhookDelivery,\n WebhookResourceFilter,\n CreateWebhookRequest,\n UpdateWebhookRequest,\n // Providers\n Modality,\n Tier,\n CapabilityTag,\n ProviderCapability,\n ProviderCredentials,\n ProviderExecuteRequest,\n ProviderExecuteResponse,\n // Packages\n Package,\n // Schedules\n WorkflowSchedule,\n ScheduleRun,\n CreateScheduleRequest,\n UpdateScheduleRequest,\n // Research / Problem Intelligence\n Platform,\n SourceDocument,\n ProblemMention,\n ProblemCluster,\n ProblemClusterMember,\n ReviewItem,\n SolutionMention,\n ScoringWeights,\n ProblemIntelligenceOutput,\n // Me\n MeResponse,\n MyOrgSummary,\n MyTeamSummary,\n // Invitations\n InvitationStatus,\n Invitation,\n CreateInvitationRequest,\n // OAuth\n OAuthClient,\n CreateOAuthClientRequest,\n OAuthTokenResponse,\n} from \"./types/index.js\";\n\nexport { TERMINAL_RUN_EVENTS, NODE_EVENT_KINDS } from \"./types/events.js\";\n\n// ── Resources (for advanced tree-shaking) ────────────────────────────────\nexport {\n AuthResource,\n MeResource,\n OrganizationsResource,\n TeamsResource,\n WorkflowsResource,\n WorkflowRegistryResource,\n WorkflowRunsResource,\n EventsResource,\n AssetsResource,\n GalleriesResource,\n ApiKeysResource,\n InvitationsResource,\n PermissionsResource,\n WebhooksResource,\n ServiceAccountsResource,\n OAuthResource,\n AdminResource,\n SchedulesResource,\n ProvidersResource,\n PackagesResource,\n} from \"./resources/index.js\";\nexport type { StreamEventsOptions, SubmitAndWaitOptions } from \"./resources/index.js\";\nexport type { WebSocketConnection, WebSocketOptions, StreamOptions } from \"./resources/index.js\";\nexport type { ConcurrencyLimit } from \"./resources/index.js\";\n\n// ── Compat ───────────────────────────────────────────────────────────────\nexport { logEvents } from \"./_compat.js\";\n","/**\n * Auth strategy types and header resolution.\n *\n * The SDK is stateless — it does NOT manage auth state.\n * Socialite (or any consumer) owns the session.\n */\n\n/** Static auth strategies. */\nexport type AuthStrategy =\n | { type: \"api-key\"; key: string }\n | { type: \"bearer\"; token: string }\n | { type: \"oauth\"; clientId: string; clientSecret: string };\n\n/**\n * Auth configuration for FabricClient.\n *\n * - Static `AuthStrategy` for fixed credentials\n * - `() => Promise<string>` for dynamic per-request tokens (e.g., from Next.js cookies)\n */\nexport type AuthConfig = AuthStrategy | (() => Promise<string>);\n\n/**\n * Resolve an AuthConfig into an Authorization header value.\n * Called per-request by HttpTransport.\n */\nexport async function resolveAuthHeader(\n auth: AuthConfig | undefined,\n _opts?: { baseUrl?: string },\n): Promise<string | undefined> {\n if (!auth) return undefined;\n\n // Dynamic token provider\n if (typeof auth === \"function\") {\n const token = await auth();\n return `Bearer ${token}`;\n }\n\n switch (auth.type) {\n case \"api-key\":\n return `Bearer ${auth.key}`;\n case \"bearer\":\n return `Bearer ${auth.token}`;\n case \"oauth\":\n // OAuth client_credentials flow is handled by OAuthTokenManager\n // (resolved externally before calling this function)\n return undefined;\n }\n}\n\n/**\n * Manages OAuth client_credentials token lifecycle.\n * Auto-exchanges credentials for access tokens and caches until expiry.\n */\nexport class OAuthTokenManager {\n private cachedToken?: string;\n private expiresAt = 0;\n\n constructor(\n private clientId: string,\n private clientSecret: string,\n private tokenUrl: string,\n private fetchFn: typeof globalThis.fetch = globalThis.fetch,\n ) {}\n\n async getToken(): Promise<string> {\n // Return cached token if still valid (with 30s buffer)\n if (this.cachedToken && Date.now() < this.expiresAt - 30_000) {\n return this.cachedToken;\n }\n\n const res = await this.fetchFn(this.tokenUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n grant_type: \"client_credentials\",\n client_id: this.clientId,\n client_secret: this.clientSecret,\n }),\n });\n\n if (!res.ok) {\n throw new Error(`OAuth token exchange failed: ${res.status} ${res.statusText}`);\n }\n\n const body = (await res.json()) as {\n data?: { access_token: string; expires_in: number };\n access_token?: string;\n expires_in?: number;\n };\n\n // Handle both envelope and direct response formats\n const accessToken = body.data?.access_token ?? body.access_token;\n const expiresIn = body.data?.expires_in ?? body.expires_in ?? 900;\n\n if (!accessToken) {\n throw new Error(\"OAuth token exchange returned no access_token\");\n }\n\n this.cachedToken = accessToken;\n this.expiresAt = Date.now() + expiresIn * 1000;\n return accessToken;\n }\n}\n","/**\n * Typed error classes mapping to Fabric API error responses.\n *\n * The HTTP transport parses the envelope's `error.code` and `error.message`\n * and throws the appropriate subclass, allowing consumers to catch specific\n * error types:\n *\n * ```typescript\n * try {\n * await fabric.organizations.create({ name: 'Acme' });\n * } catch (e) {\n * if (e instanceof FabricConflictError) { // slug taken }\n * if (e instanceof FabricAuthError) { // re-authenticate }\n * }\n * ```\n */\n\nexport interface FabricErrorParams {\n code: string;\n status: number;\n message: string;\n requestId?: string;\n traceId?: string;\n}\n\nexport class FabricError extends Error {\n readonly code: string;\n readonly status: number;\n readonly requestId?: string;\n readonly traceId?: string;\n\n constructor(params: FabricErrorParams) {\n super(params.message);\n this.name = \"FabricError\";\n this.code = params.code;\n this.status = params.status;\n this.requestId = params.requestId;\n this.traceId = params.traceId;\n }\n}\n\n/** 400 Bad Request / 422 Unprocessable Entity */\nexport class FabricValidationError extends FabricError {\n constructor(params: FabricErrorParams) {\n super(params);\n this.name = \"FabricValidationError\";\n }\n}\n\n/** 401 Unauthorized */\nexport class FabricAuthError extends FabricError {\n constructor(params: FabricErrorParams) {\n super(params);\n this.name = \"FabricAuthError\";\n }\n}\n\n/** 403 Forbidden */\nexport class FabricForbiddenError extends FabricError {\n constructor(params: FabricErrorParams) {\n super(params);\n this.name = \"FabricForbiddenError\";\n }\n}\n\n/** 404 Not Found */\nexport class FabricNotFoundError extends FabricError {\n constructor(params: FabricErrorParams) {\n super(params);\n this.name = \"FabricNotFoundError\";\n }\n}\n\n/** 409 Conflict */\nexport class FabricConflictError extends FabricError {\n constructor(params: FabricErrorParams) {\n super(params);\n this.name = \"FabricConflictError\";\n }\n}\n\n/** 429 Too Many Requests */\nexport class FabricRateLimitError extends FabricError {\n readonly retryAfterMs?: number;\n\n constructor(params: FabricErrorParams & { retryAfterMs?: number }) {\n super(params);\n this.name = \"FabricRateLimitError\";\n this.retryAfterMs = params.retryAfterMs;\n }\n}\n\n/** 5xx Server Error */\nexport class FabricServerError extends FabricError {\n constructor(params: FabricErrorParams) {\n super(params);\n this.name = \"FabricServerError\";\n }\n}\n\n/** Map an HTTP status code to the appropriate FabricError subclass. */\nexport function createFabricError(params: FabricErrorParams & { retryAfterMs?: number }): FabricError {\n switch (true) {\n case params.status === 401:\n return new FabricAuthError(params);\n case params.status === 403:\n return new FabricForbiddenError(params);\n case params.status === 404:\n return new FabricNotFoundError(params);\n case params.status === 409:\n return new FabricConflictError(params);\n case params.status === 429:\n return new FabricRateLimitError(params);\n case params.status >= 400 && params.status < 500:\n return new FabricValidationError(params);\n case params.status >= 500:\n return new FabricServerError(params);\n default:\n return new FabricError(params);\n }\n}\n","/**\n * Low-level HTTP transport for the Fabric API.\n *\n * Wraps `fetch` with:\n * - Base URL prefixing\n * - Auth header injection (resolved per-request)\n * - Envelope unwrapping (`data` on success, throws on `error`)\n * - Typed error mapping\n * - Retry on 429 with Retry-After\n * - Timeout via AbortSignal\n * - Idempotency key support\n */\n\nimport type { AuthConfig } from \"./auth.js\";\nimport { resolveAuthHeader, OAuthTokenManager } from \"./auth.js\";\nimport { createFabricError, FabricError } from \"./errors.js\";\nimport type { PaginatedResponse, Pagination } from \"./pagination.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Interceptor called before each request. Can modify headers or log. */\nexport type RequestInterceptor = (\n method: string,\n url: string,\n headers: Record<string, string>,\n) => void | Promise<void>;\n\n/** Interceptor called after each response. Can log or inspect. */\nexport type ResponseInterceptor = (\n method: string,\n url: string,\n status: number,\n durationMs: number,\n) => void | Promise<void>;\n\nexport interface HttpTransportConfig {\n baseUrl: string;\n auth?: AuthConfig;\n organizationId?: string;\n teamId?: string;\n timeout?: number;\n fetch?: typeof globalThis.fetch;\n retry?: { maxRetries: number; baseDelayMs: number };\n /** Log all requests and responses to console. */\n debug?: boolean;\n /** Called before each request. */\n onRequest?: RequestInterceptor;\n /** Called after each response. */\n onResponse?: ResponseInterceptor;\n}\n\nexport interface RequestOptions {\n body?: unknown;\n query?: Record<string, string | number | boolean | undefined>;\n headers?: Record<string, string>;\n idempotencyKey?: string;\n signal?: AbortSignal;\n /** Pass-through for Next.js extended fetch options (e.g. `next: { revalidate }`) */\n requestInit?: RequestInit;\n}\n\n/** Envelope shape returned by the Fabric API. */\ninterface Envelope<T = unknown> {\n meta: {\n request_id: string;\n trace_id?: string;\n status: number;\n api_version: string;\n };\n context?: {\n principal_id?: string;\n organization_id?: string;\n team_id?: string;\n };\n data?: T;\n error?: {\n code: string;\n message: string;\n };\n}\n\n/** Envelope with paginated data. */\ninterface PaginatedEnvelope<T = unknown> {\n meta: Envelope[\"meta\"];\n data?: {\n items: T[];\n pagination: Pagination;\n };\n error?: Envelope[\"error\"];\n}\n\n// ---------------------------------------------------------------------------\n// HttpTransport\n// ---------------------------------------------------------------------------\n\nexport class HttpTransport {\n private readonly baseUrl: string;\n private readonly auth?: AuthConfig;\n private readonly organizationId?: string;\n private readonly teamId?: string;\n private readonly timeoutMs: number;\n private readonly fetchFn: typeof globalThis.fetch;\n private readonly retryConfig: { maxRetries: number; baseDelayMs: number };\n private readonly debug: boolean;\n private readonly onRequest?: RequestInterceptor;\n private readonly onResponse?: ResponseInterceptor;\n private oauthManager?: OAuthTokenManager;\n\n constructor(config: HttpTransportConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n this.auth = config.auth;\n this.organizationId = config.organizationId;\n this.teamId = config.teamId;\n this.timeoutMs = config.timeout ?? 30_000;\n this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);\n this.retryConfig = config.retry ?? { maxRetries: 2, baseDelayMs: 1000 };\n this.debug = config.debug ?? false;\n this.onRequest = config.onRequest;\n this.onResponse = config.onResponse;\n\n // Set up OAuth token manager if needed\n if (config.auth && typeof config.auth !== \"function\" && config.auth.type === \"oauth\") {\n this.oauthManager = new OAuthTokenManager(\n config.auth.clientId,\n config.auth.clientSecret,\n `${this.baseUrl}/v1/oauth/token`,\n this.fetchFn,\n );\n }\n }\n\n /** Getters for context values (used by resources). */\n getOrganizationId(): string | undefined {\n return this.organizationId;\n }\n\n getTeamId(): string | undefined {\n return this.teamId;\n }\n\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n /** Make a request and unwrap the envelope, returning `data`. */\n async request<T>(method: string, path: string, opts?: RequestOptions): Promise<T> {\n const res = await this.doFetch(method, path, opts);\n const envelope = (await res.json()) as Envelope<T>;\n this.throwIfError(envelope, res);\n return envelope.data as T;\n }\n\n /** Make a request and unwrap a paginated envelope. */\n async requestPaginated<T>(method: string, path: string, opts?: RequestOptions): Promise<PaginatedResponse<T>> {\n const res = await this.doFetch(method, path, opts);\n const envelope = (await res.json()) as PaginatedEnvelope<T>;\n\n if (envelope.error) {\n throw createFabricError({\n code: envelope.error.code,\n status: envelope.meta.status,\n message: envelope.error.message,\n requestId: envelope.meta.request_id,\n traceId: envelope.meta.trace_id,\n });\n }\n\n return {\n items: envelope.data?.items ?? [],\n pagination: envelope.data?.pagination ?? { count: 0, has_more: false },\n };\n }\n\n /** Make a request and return the raw Response (for SSE, file uploads, etc). */\n async requestRaw(method: string, path: string, opts?: RequestOptions): Promise<Response> {\n return this.doFetch(method, path, opts);\n }\n\n /** Build full headers for a request (used by streaming). */\n async buildHeaders(extra?: Record<string, string>): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...extra,\n };\n const authHeader = await this.resolveAuth();\n if (authHeader) headers[\"Authorization\"] = authHeader;\n return headers;\n }\n\n // ── Internal ──────────────────────────────────────────────────────\n\n private async doFetch(method: string, path: string, opts?: RequestOptions): Promise<Response> {\n const url = this.buildUrl(path, opts?.query);\n const headers = await this.buildHeaders(opts?.headers);\n\n if (opts?.idempotencyKey) {\n headers[\"idempotency-key\"] = opts.idempotencyKey;\n }\n\n // Auto-generate X-Request-ID if not provided\n if (!headers[\"x-request-id\"] && !headers[\"X-Request-ID\"]) {\n headers[\"X-Request-ID\"] = generateRequestId();\n }\n\n // Remove Content-Type for non-body methods\n if (method === \"GET\" || method === \"DELETE\") {\n delete headers[\"Content-Type\"];\n }\n\n // Interceptor: before request\n await this.onRequest?.(method, url, headers);\n\n if (this.debug) {\n console.debug(`[fabric] ${method} ${url}`);\n }\n\n const init: RequestInit = {\n method,\n headers,\n body: opts?.body !== undefined ? JSON.stringify(opts.body) : undefined,\n signal: opts?.signal ?? AbortSignal.timeout(this.timeoutMs),\n ...opts?.requestInit,\n };\n\n const start = Date.now();\n const res = await this.fetchWithRetry(url, init);\n const durationMs = Date.now() - start;\n\n // Interceptor: after response\n await this.onResponse?.(method, url, res.status, durationMs);\n\n if (this.debug) {\n console.debug(`[fabric] ${method} ${url} → ${res.status} (${durationMs}ms)`);\n }\n\n return res;\n }\n\n private async fetchWithRetry(url: string, init: RequestInit): Promise<Response> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.retryConfig.maxRetries; attempt++) {\n try {\n const res = await this.fetchFn(url, init);\n\n if (res.status !== 429 || attempt >= this.retryConfig.maxRetries) {\n return res;\n }\n\n // 429 — wait for Retry-After\n const retryAfter = res.headers.get(\"retry-after\");\n const delayMs = retryAfter\n ? parseInt(retryAfter, 10) * 1000\n : this.retryConfig.baseDelayMs * Math.pow(2, attempt);\n await sleep(delayMs);\n } catch (err) {\n if (err instanceof DOMException && err.name === \"AbortError\") throw err;\n lastError = err instanceof Error ? err : new Error(String(err));\n if (attempt >= this.retryConfig.maxRetries) break;\n await sleep(this.retryConfig.baseDelayMs * Math.pow(2, attempt));\n }\n }\n\n throw lastError ?? new Error(\"Request failed after retries\");\n }\n\n private async resolveAuth(): Promise<string | undefined> {\n if (this.oauthManager) {\n const token = await this.oauthManager.getToken();\n return `Bearer ${token}`;\n }\n return resolveAuthHeader(this.auth);\n }\n\n private buildUrl(path: string, query?: Record<string, string | number | boolean | undefined>): string {\n let url = `${this.baseUrl}${path}`;\n const params = new URLSearchParams();\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) params.set(key, String(value));\n }\n }\n\n const qs = params.toString();\n if (qs) url += (url.includes(\"?\") ? \"&\" : \"?\") + qs;\n return url;\n }\n\n private throwIfError(envelope: Envelope, res: Response): void {\n if (envelope.error) {\n const retryAfterHeader = res.headers.get(\"retry-after\");\n const retryAfterMs = retryAfterHeader ? parseInt(retryAfterHeader, 10) * 1000 : undefined;\n\n throw createFabricError({\n code: envelope.error.code,\n status: envelope.meta.status,\n message: envelope.error.message,\n requestId: envelope.meta.request_id,\n traceId: envelope.meta.trace_id,\n retryAfterMs,\n });\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Generate a random request ID (hex). */\nfunction generateRequestId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n let hex = \"\";\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i].toString(16).padStart(2, \"0\");\n }\n return hex;\n}\n","/**\n * Auth resource — stateless.\n *\n * All methods RETURN tokens. They do NOT store them on the client.\n * Socialite is responsible for persisting tokens in cookies/session.\n */\n\nimport type { HttpTransport } from \"../http.js\";\nimport type { AuthResponse, MfaEnrollResponse, MfaChallengeResponse, MfaVerifyResponse } from \"../types/index.js\";\n\nexport class MfaResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Enroll a new MFA factor (e.g., \"totp\"). */\n async enroll(factorType: string, friendlyName?: string): Promise<MfaEnrollResponse> {\n return this.http.request(\"POST\", \"/v1/auth/mfa/enroll\", {\n body: { factor_type: factorType, friendly_name: friendlyName },\n });\n }\n\n /** Request an MFA challenge for a factor. */\n async challenge(factorId: string): Promise<MfaChallengeResponse> {\n return this.http.request(\"POST\", \"/v1/auth/mfa/challenge\", {\n body: { factor_id: factorId },\n });\n }\n\n /** Verify an MFA code. Returns new tokens on success. */\n async verify(factorId: string, challengeId: string, code: string): Promise<MfaVerifyResponse> {\n return this.http.request(\"POST\", \"/v1/auth/mfa/verify\", {\n body: { factor_id: factorId, challenge_id: challengeId, code },\n });\n }\n\n /** Remove an MFA factor. */\n async unenroll(factorId: string): Promise<void> {\n await this.http.request(\"DELETE\", \"/v1/auth/mfa/unenroll\", {\n body: { factor_id: factorId },\n });\n }\n}\n\nexport class AuthResource {\n readonly mfa: MfaResource;\n\n constructor(private readonly http: HttpTransport) {\n this.mfa = new MfaResource(http);\n }\n\n /** Sign up with email and password. Returns tokens + user. */\n async signup(email: string, password: string): Promise<AuthResponse> {\n return this.http.request(\"POST\", \"/v1/auth/signup\", {\n body: { email, password },\n });\n }\n\n /** Log in with email and password. Returns tokens + user. */\n async login(email: string, password: string): Promise<AuthResponse> {\n return this.http.request(\"POST\", \"/v1/auth/login\", {\n body: { email, password },\n });\n }\n\n /** Log out (revoke tokens). */\n async logout(): Promise<void> {\n await this.http.request(\"POST\", \"/v1/auth/logout\", { body: {} });\n }\n\n /** Refresh an access token using a refresh token. */\n async refresh(refreshToken: string): Promise<AuthResponse> {\n return this.http.request(\"POST\", \"/v1/auth/token/refresh\", {\n body: { refresh_token: refreshToken },\n });\n }\n\n /** Request a magic link email. */\n async magicLink(email: string): Promise<void> {\n await this.http.request(\"POST\", \"/v1/auth/magic-link\", {\n body: { email },\n });\n }\n\n /** Request a password reset email. */\n async forgotPassword(email: string): Promise<void> {\n await this.http.request(\"POST\", \"/v1/auth/forgot-password\", {\n body: { email },\n });\n }\n\n /** Reset password with a recovery token. */\n async resetPassword(accessToken: string, newPassword: string): Promise<void> {\n await this.http.request(\"POST\", \"/v1/auth/reset-password\", {\n body: { access_token: accessToken, new_password: newPassword },\n });\n }\n\n /** Get the URL for social login redirect (e.g., \"google\", \"github\"). */\n socialLoginUrl(provider: string): string {\n return `${this.http.getBaseUrl()}/v1/auth/social/${encodeURIComponent(provider)}`;\n }\n\n /** Verify an email address using a verification token. */\n async verify(token: string): Promise<void> {\n await this.http.request(\"GET\", \"/v1/auth/verify\", {\n query: { token },\n });\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { MeResponse, MyOrgSummary, MyTeamSummary, Permission } from \"../types/index.js\";\n\nexport class MeResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Get current principal info. */\n async get(): Promise<MeResponse> {\n return this.http.request(\"GET\", \"/v1/me\");\n }\n\n /** List organizations the current user belongs to. */\n async organizations(): Promise<MyOrgSummary[]> {\n return this.http.request(\"GET\", \"/v1/me/organizations\");\n }\n\n /** List teams the current user belongs to. */\n async teams(): Promise<MyTeamSummary[]> {\n return this.http.request(\"GET\", \"/v1/me/teams\");\n }\n\n /** List effective permissions for the current user. */\n async permissions(): Promise<Permission[]> {\n return this.http.request(\"GET\", \"/v1/me/permissions\");\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type {\n Organization,\n CreateOrganizationRequest,\n UpdateOrganizationRequest,\n Membership,\n OrgUsageSummary,\n OrgBudget,\n OrgSecret,\n CreateSecretRequest,\n OrgSettings,\n UpdateOrgSettingsRequest,\n RotateWebhookSecretResponse,\n UsageDailyEntry,\n UsageRecord,\n Team,\n Permission,\n} from \"../types/index.js\";\n\nexport class OrganizationsResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create an organization. */\n async create(opts: CreateOrganizationRequest): Promise<Organization> {\n return this.http.request(\"POST\", \"/v1/organizations\", { body: opts });\n }\n\n /** List organizations (paginated). */\n async list(params?: PaginationParams): Promise<PaginatedResponse<Organization>> {\n return this.http.requestPaginated(\"GET\", \"/v1/organizations\", {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** Get an organization by ID. */\n async get(orgId: string): Promise<Organization> {\n return this.http.request(\"GET\", `/v1/organizations/${orgId}`);\n }\n\n /** Update an organization (e.g., rename). */\n async update(orgId: string, opts: UpdateOrganizationRequest): Promise<Organization> {\n return this.http.request(\"PUT\", `/v1/organizations/${orgId}`, { body: opts });\n }\n\n /** Archive an organization (soft-delete). */\n async archive(orgId: string): Promise<Organization> {\n return this.http.request(\"POST\", `/v1/organizations/${orgId}/archive`, { body: {} });\n }\n\n /** List teams in an organization. */\n async teams(orgId: string, params?: PaginationParams): Promise<PaginatedResponse<Team>> {\n return this.http.requestPaginated(\"GET\", `/v1/organizations/${orgId}/teams`, {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** List members in an organization. */\n async members(orgId: string, params?: PaginationParams): Promise<PaginatedResponse<Membership>> {\n return this.http.requestPaginated(\"GET\", `/v1/organizations/${orgId}/members`, {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** List permissions for an organization. */\n async permissions(orgId: string): Promise<Permission[]> {\n return this.http.request(\"GET\", `/v1/organizations/${orgId}/permissions`);\n }\n\n /** Get usage summary for an organization. */\n async usage(orgId: string): Promise<OrgUsageSummary> {\n return this.http.request(\"GET\", `/v1/organizations/${orgId}/usage`);\n }\n\n /** Get audit logs for an organization. */\n async auditLogs(orgId: string, params?: PaginationParams): Promise<PaginatedResponse<Record<string, unknown>>> {\n return this.http.requestPaginated(\"GET\", `/v1/organizations/${orgId}/audit-logs`, {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** Export organization data. */\n async export(orgId: string): Promise<Record<string, unknown>> {\n return this.http.request(\"POST\", `/v1/organizations/${orgId}/export`, { body: {} });\n }\n\n /** Request organization deletion. */\n async requestDeletion(orgId: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/organizations/${orgId}/delete`, { body: {} });\n }\n\n // ── Budget ────────────────────────────────────────────────────────\n\n /** Get budget configuration. */\n async getBudget(orgId: string): Promise<OrgBudget> {\n return this.http.request(\"GET\", `/v1/organizations/${orgId}/budget`);\n }\n\n /** Set budget limit. */\n async setBudget(orgId: string, monthlyLimitUsd: number): Promise<OrgBudget> {\n return this.http.request(\"PUT\", `/v1/organizations/${orgId}/budget`, {\n body: { monthly_limit_usd: monthlyLimitUsd },\n });\n }\n\n // ── Settings ─────────────────────────────────────────────────────\n\n /** Get organization settings. */\n async getSettings(orgId: string): Promise<OrgSettings> {\n return this.http.request(\"GET\", `/v1/organizations/${orgId}/settings`);\n }\n\n /** Update organization settings. */\n async updateSettings(orgId: string, settings: UpdateOrgSettingsRequest): Promise<OrgSettings> {\n return this.http.request(\"PUT\", `/v1/organizations/${orgId}/settings`, {\n body: settings,\n });\n }\n\n /** Rotate the webhook signing secret (one-time reveal of new secret). */\n async rotateWebhookSecret(orgId: string): Promise<RotateWebhookSecretResponse> {\n return this.http.request(\"POST\", `/v1/organizations/${orgId}/settings/webhook/rotate-secret`, {\n body: {},\n });\n }\n\n // ── Usage details ───────────────────────────────────────────────\n\n /** Get daily usage rollup with optional grouping (provider, model, workflow). */\n async usageDaily(\n orgId: string,\n params?: { from?: string; to?: string; group_by?: string; limit?: number; cursor?: string },\n ): Promise<PaginatedResponse<UsageDailyEntry>> {\n return this.http.requestPaginated(\"GET\", `/v1/organizations/${orgId}/usage/daily`, {\n query: {\n from: params?.from,\n to: params?.to,\n group_by: params?.group_by,\n limit: params?.limit,\n cursor: params?.cursor,\n },\n });\n }\n\n /** Get detailed usage records (individual provider executions). */\n async usageRecords(orgId: string): Promise<UsageRecord[]> {\n return this.http.request(\"GET\", `/v1/organizations/${orgId}/usage/records`);\n }\n\n // ── Secrets ───────────────────────────────────────────────────────\n\n /** List secrets for an organization. */\n async listSecrets(orgId: string): Promise<OrgSecret[]> {\n return this.http.request(\"GET\", `/v1/organizations/${orgId}/secrets`);\n }\n\n /** Create a secret. */\n async createSecret(orgId: string, opts: CreateSecretRequest): Promise<OrgSecret> {\n return this.http.request(\"POST\", `/v1/organizations/${orgId}/secrets`, { body: opts });\n }\n\n /** Delete a secret. */\n async deleteSecret(orgId: string, name: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/organizations/${orgId}/secrets/${encodeURIComponent(name)}`);\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { Team, CreateTeamRequest } from \"../types/index.js\";\n\nexport class TeamsResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create a team within an organization. */\n async create(opts: CreateTeamRequest): Promise<Team> {\n return this.http.request(\"POST\", \"/v1/teams\", { body: opts });\n }\n\n /** Get a team by ID. */\n async get(teamId: string): Promise<Team> {\n return this.http.request(\"GET\", `/v1/teams/${teamId}`);\n }\n}\n","/** All event kinds emitted by the Fabric event bus. */\nexport type EventKind =\n // Run lifecycle\n | \"workflow.run.created\"\n | \"workflow.run.queued\"\n | \"workflow.run.promoted\"\n | \"workflow.run.started\"\n | \"workflow.run.completed\"\n | \"workflow.run.failed\"\n | \"workflow.run.cancelled\"\n | \"workflow.run.waiting\"\n | \"workflow.run.paused\"\n // Node lifecycle (emitted by workflow workers)\n | \"workflow.node.ready\"\n | \"workflow.node.claimed\"\n | \"workflow.node.started\"\n | \"workflow.node.progress\"\n | \"workflow.node.completed\"\n | \"workflow.node.failed\"\n | \"workflow.node.retried\"\n | \"workflow.node.skipped\"\n | \"workflow.node.cancelled\"\n | \"workflow.node.waiting_for_event\"\n | \"workflow.node.resumed\"\n // Job lifecycle\n | \"job.created\"\n | \"job.started\"\n | \"job.completed\"\n | \"job.failed\"\n // Schedule lifecycle\n | \"workflow.schedule.triggered\"\n | \"workflow.schedule.skipped\"\n | \"workflow.schedule.failed\"\n // Webhook delivery\n | \"webhook.delivery.exhausted\"\n // Tenancy\n | \"organization.created\"\n | \"team.created\"\n | \"membership.created\"\n | \"invitation.created\"\n | \"invitation.accepted\"\n | \"invitation.revoked\";\n\n/** Terminal event kinds that signal a workflow run is done. */\nexport const TERMINAL_RUN_EVENTS: EventKind[] = [\n \"workflow.run.completed\",\n \"workflow.run.failed\",\n \"workflow.run.cancelled\",\n];\n\n/** Node-level event kinds for filtering in watch/stream. */\nexport const NODE_EVENT_KINDS: EventKind[] = [\n \"workflow.node.ready\",\n \"workflow.node.claimed\",\n \"workflow.node.started\",\n \"workflow.node.progress\",\n \"workflow.node.completed\",\n \"workflow.node.failed\",\n \"workflow.node.retried\",\n \"workflow.node.skipped\",\n \"workflow.node.cancelled\",\n \"workflow.node.waiting_for_event\",\n \"workflow.node.resumed\",\n];\n\n/** A domain event from the Fabric event bus. */\nexport interface DomainEvent {\n id: string;\n kind: EventKind;\n organization_id?: string;\n job_id?: string;\n workflow_id?: string;\n run_id?: string;\n node_key?: string;\n payload: Record<string, unknown>;\n timestamp: string;\n}\n\n/** Event handler callback. */\nexport type EventHandler = (event: DomainEvent) => void;\n\n/** Client-side filter for SSE event streams. */\nexport interface EventStreamFilter {\n /** Only deliver events matching these kinds. */\n kinds?: EventKind[];\n /** Only deliver node events for these node keys. */\n nodeKeys?: string[];\n}\n\n// ---------------------------------------------------------------------------\n// WebSocket protocol types\n// ---------------------------------------------------------------------------\n\n/** Commands the client can send over the WebSocket. */\nexport type WebSocketCommand =\n | { subscribe_run: string }\n | { unsubscribe: true };\n\n/** Acknowledgements the server sends in response to commands. */\nexport type WebSocketAck =\n | { subscribed_to_run: string }\n | { unsubscribed: true };\n","/**\n * SSE (Server-Sent Events) parser for real-time event streaming.\n *\n * Uses `fetch` + `ReadableStream` instead of `EventSource` to support\n * custom headers (auth) and work in both Node.js 18+ and browsers/Edge Runtime.\n */\n\nimport type { EventStreamFilter, DomainEvent } from \"./types/events.js\";\n\nexport interface SSEOptions {\n /** Full URL to the SSE endpoint. */\n url: string;\n /** Headers to send (including auth). */\n headers: Record<string, string>;\n /** Resume from a specific event ID (Last-Event-ID header). */\n lastEventId?: string;\n /** AbortSignal for cancellation. */\n signal?: AbortSignal;\n /** Custom fetch implementation. */\n fetch?: typeof globalThis.fetch;\n /** Retry delay in ms from the server's `retry:` directive. */\n onRetry?: (retryMs: number) => void;\n}\n\nexport interface ReconnectingSSEOptions extends SSEOptions {\n /** Enable auto-reconnection on connection drop (default: false). */\n reconnect?: boolean;\n /** Maximum reconnection attempts before giving up (default: 10). */\n maxReconnectAttempts?: number;\n /** Base delay in ms for exponential backoff (default: 1000). */\n reconnectBaseDelayMs?: number;\n /** Client-side event filter. */\n filter?: EventStreamFilter;\n}\n\nexport interface SSEEvent {\n /** Event type from the `event:` field. */\n event?: string;\n /** Parsed JSON data from the `data:` field. */\n data: unknown;\n /** Event ID from the `id:` field. */\n id?: string;\n}\n\n/** Handle for a running SSE stream. */\nexport interface EventStream {\n /** Abort the stream. */\n abort(): void;\n /** Resolves when the stream ends (terminal event, server close, or abort). */\n readonly done: Promise<void>;\n}\n\n/**\n * Connect to an SSE endpoint and parse events.\n *\n * Returns an `EventStream` handle for cancellation and completion tracking.\n */\nexport function connectSSE<T = unknown>(\n options: SSEOptions,\n onEvent: (event: T, raw: SSEEvent) => void,\n onError?: (error: Error) => void,\n): EventStream {\n const controller = new AbortController();\n const fetchFn = options.fetch ?? globalThis.fetch;\n\n // Combine external signal with our internal controller\n const signal = options.signal\n ? combineSignals(options.signal, controller.signal)\n : controller.signal;\n\n const done = (async () => {\n const headers: Record<string, string> = {\n ...options.headers,\n Accept: \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n };\n if (options.lastEventId) {\n headers[\"Last-Event-ID\"] = options.lastEventId;\n }\n\n let res: Response;\n try {\n res = await fetchFn(options.url, { headers, signal });\n } catch (err) {\n if (!isAbortError(err)) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n return;\n }\n\n if (!res.ok) {\n onError?.(new Error(`SSE connection failed: ${res.status} ${res.statusText}`));\n return;\n }\n\n const reader = res.body?.getReader();\n if (!reader) {\n onError?.(new Error(\"SSE response has no body\"));\n return;\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let currentEvent: Partial<SSEEvent> = {};\n let dataLines: string[] = [];\n\n try {\n while (true) {\n const { done: streamDone, value } = await reader.read();\n if (streamDone) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line === \"\") {\n // Empty line = end of event\n if (dataLines.length > 0) {\n const dataStr = dataLines.join(\"\\n\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(dataStr);\n } catch {\n parsed = dataStr;\n }\n const sseEvent: SSEEvent = {\n event: currentEvent.event,\n data: parsed,\n id: currentEvent.id as string | undefined,\n };\n onEvent(parsed as T, sseEvent);\n }\n currentEvent = {};\n dataLines = [];\n } else if (line.startsWith(\"data:\")) {\n dataLines.push(line.slice(line[5] === \" \" ? 6 : 5));\n } else if (line.startsWith(\"event:\")) {\n currentEvent.event = line.slice(line[6] === \" \" ? 7 : 6);\n } else if (line.startsWith(\"id:\")) {\n currentEvent.id = line.slice(line[3] === \" \" ? 4 : 3);\n } else if (line.startsWith(\"retry:\")) {\n const ms = parseInt(line.slice(line[6] === \" \" ? 7 : 6), 10);\n if (!isNaN(ms)) options.onRetry?.(ms);\n }\n // Lines starting with \":\" are comments — ignore\n }\n }\n } catch (err) {\n if (!isAbortError(err)) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // ignore — reader may already be released\n }\n }\n })();\n\n return {\n abort() {\n controller.abort();\n },\n done,\n };\n}\n\nfunction isAbortError(err: unknown): boolean {\n return err instanceof DOMException && err.name === \"AbortError\";\n}\n\nfunction combineSignals(a: AbortSignal, b: AbortSignal): AbortSignal {\n const controller = new AbortController();\n const onAbort = () => controller.abort();\n a.addEventListener(\"abort\", onAbort, { once: true });\n b.addEventListener(\"abort\", onAbort, { once: true });\n // If either is already aborted\n if (a.aborted || b.aborted) controller.abort();\n return controller.signal;\n}\n\n// ---------------------------------------------------------------------------\n// Client-side event filtering\n// ---------------------------------------------------------------------------\n\n/** Returns true if the event passes the filter (or if no filter is set). */\nexport function matchesFilter(event: DomainEvent, filter?: EventStreamFilter): boolean {\n if (!filter) return true;\n\n if (filter.kinds && filter.kinds.length > 0) {\n if (!filter.kinds.includes(event.kind)) return false;\n }\n\n if (filter.nodeKeys && filter.nodeKeys.length > 0) {\n // Only apply nodeKeys filter to events that have a node_key\n if (event.node_key && !filter.nodeKeys.includes(event.node_key)) return false;\n }\n\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// Auto-reconnecting SSE\n// ---------------------------------------------------------------------------\n\n/**\n * Connect to an SSE endpoint with automatic reconnection and client-side filtering.\n *\n * On connection drop, reconnects with exponential backoff using the last\n * received event ID (Last-Event-ID) so the server replays missed events.\n */\nexport function connectReconnectingSSE<T extends DomainEvent = DomainEvent>(\n options: ReconnectingSSEOptions,\n onEvent: (event: T, raw: SSEEvent) => void,\n onError?: (error: Error) => void,\n): EventStream {\n const controller = new AbortController();\n const maxAttempts = options.maxReconnectAttempts ?? 10;\n const baseDelay = options.reconnectBaseDelayMs ?? 1000;\n let lastEventId = options.lastEventId;\n let serverRetryMs: number | undefined;\n\n const done = (async () => {\n let attempts = 0;\n\n while (!controller.signal.aborted) {\n let streamEndedCleanly = false;\n\n const innerStream = connectSSE<T>(\n {\n ...options,\n lastEventId,\n signal: controller.signal,\n },\n (event, raw) => {\n // Track last event ID for reconnection\n if (raw.id) lastEventId = raw.id;\n // Reset attempts on successful event receipt\n attempts = 0;\n\n // Apply client-side filter\n if (!matchesFilter(event as DomainEvent, options.filter)) return;\n\n onEvent(event, raw);\n },\n (error) => {\n // Don't report abort errors during reconnection\n if (!controller.signal.aborted) {\n onError?.(error);\n }\n },\n );\n\n // Store retry directive from server\n const origOnRetry = options.onRetry;\n options.onRetry = (ms) => {\n serverRetryMs = ms;\n origOnRetry?.(ms);\n };\n\n await innerStream.done;\n streamEndedCleanly = true;\n\n // If aborted or reconnection disabled, stop\n if (controller.signal.aborted || !options.reconnect) break;\n\n attempts++;\n if (attempts > maxAttempts) {\n onError?.(new Error(`SSE reconnection failed after ${maxAttempts} attempts`));\n break;\n }\n\n // Exponential backoff (use server retry directive if available)\n const delay = serverRetryMs ?? baseDelay * Math.pow(2, Math.min(attempts - 1, 6));\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n })();\n\n return {\n abort() {\n controller.abort();\n },\n done,\n };\n}\n","/**\n * Workflows resource — the core resource for Socialite.\n *\n * Nested sub-resources:\n * - `registry` — CRUD for workflow definitions\n * - `runs` — execution, streaming, cancellation\n * - `compose()` — chain multiple workflows\n */\n\nimport type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type {\n RegistryEntry,\n CreateRegistryRequest,\n ComposeWorkflowRequest,\n WorkflowRun,\n SubmitRunRequest,\n NodeAttempt,\n DomainEvent,\n EventHandler,\n EventStreamFilter,\n WorkflowCostEstimate,\n EstimateWorkflowRequest,\n WatchRunOptions,\n RunWatcher,\n RunArtifact,\n RecordArtifactRequest,\n SignedUrlResponse,\n} from \"../types/index.js\";\nimport { TERMINAL_RUN_EVENTS } from \"../types/events.js\";\nimport { connectSSE, connectReconnectingSSE, matchesFilter, type EventStream } from \"../streaming.js\";\n\n// ---------------------------------------------------------------------------\n// Sub-resources\n// ---------------------------------------------------------------------------\n\nexport class WorkflowRegistryResource {\n constructor(\n private readonly http: HttpTransport,\n ) {}\n\n /** Create a workflow definition in the registry. */\n async create(opts: CreateRegistryRequest): Promise<RegistryEntry> {\n return this.http.request(\"POST\", \"/v1/workflow-registry\", {\n body: {\n name: opts.name,\n language: opts.language,\n source: opts.source,\n entry_point: opts.entry_point,\n compose_from: opts.compose_from,\n config: opts.config,\n version: opts.version,\n worker_tags: opts.worker_tags,\n input_schema: opts.input_schema,\n output_schema: opts.output_schema,\n description: opts.description,\n },\n });\n }\n\n /** List workflows visible to the current org (global + org + team). */\n async list(params?: PaginationParams & { organization_id?: string; team_id?: string }): Promise<PaginatedResponse<RegistryEntry>> {\n return this.http.requestPaginated(\"GET\", \"/v1/workflow-registry\", {\n query: {\n limit: params?.limit,\n cursor: params?.cursor,\n organization_id: params?.organization_id ?? this.http.getOrganizationId(),\n team_id: params?.team_id ?? this.http.getTeamId(),\n },\n });\n }\n\n /** Get a workflow by name (resolves hierarchically: team > org > global). */\n async get(name: string, opts?: { organization_id?: string }): Promise<RegistryEntry> {\n const orgId = opts?.organization_id ?? this.http.getOrganizationId();\n return this.http.request(\"GET\", `/v1/workflow-registry/${encodeURIComponent(name)}`, {\n query: { organization_id: orgId },\n });\n }\n\n /** Delete an org/team-scoped workflow (not global). */\n async delete(name: string, opts?: { organization_id?: string }): Promise<void> {\n const orgId = opts?.organization_id ?? this.http.getOrganizationId();\n await this.http.request(\"DELETE\", `/v1/workflow-registry/${encodeURIComponent(name)}`, {\n query: { organization_id: orgId },\n });\n }\n}\n\nexport interface StreamEventsOptions {\n onEvent: EventHandler;\n onError?: (error: Error) => void;\n signal?: AbortSignal;\n lastEventId?: string;\n /** Client-side event filter. */\n filter?: EventStreamFilter;\n /** Enable auto-reconnection on connection drop. */\n reconnect?: boolean;\n /** Maximum reconnection attempts (default: 10). */\n maxReconnectAttempts?: number;\n}\n\nexport interface SubmitAndWaitOptions extends SubmitRunRequest {\n onEvent?: EventHandler;\n timeoutMs?: number;\n organization_id?: string;\n team_id?: string;\n}\n\nexport class WorkflowRunsResource {\n constructor(\n private readonly http: HttpTransport,\n ) {}\n\n /** Submit a workflow run. Returns immediately with a run ID. */\n async submit(\n workflowName: string,\n opts?: SubmitRunRequest & { organization_id?: string; team_id?: string; idempotencyKey?: string },\n ): Promise<WorkflowRun> {\n return this.http.request(\"POST\", \"/v1/workflows/run\", {\n query: {\n name: workflowName,\n organization_id: opts?.organization_id ?? this.http.getOrganizationId(),\n team_id: opts?.team_id ?? this.http.getTeamId(),\n },\n body: {\n input: opts?.input ?? {},\n metadata: opts?.metadata,\n priority: opts?.priority,\n },\n idempotencyKey: opts?.idempotencyKey,\n });\n }\n\n /** List workflow runs. */\n async list(params?: PaginationParams & { organization_id?: string; team_id?: string }): Promise<PaginatedResponse<WorkflowRun>> {\n return this.http.requestPaginated(\"GET\", \"/v1/workflows/runs\", {\n query: {\n limit: params?.limit,\n offset: params?.cursor,\n organization_id: params?.organization_id ?? this.http.getOrganizationId(),\n team_id: params?.team_id ?? this.http.getTeamId(),\n },\n });\n }\n\n /** Get a run's status and progress. */\n async get(runId: string): Promise<WorkflowRun> {\n return this.http.request(\"GET\", `/v1/workflows/runs/${runId}`);\n }\n\n /** Cancel a running workflow. */\n async cancel(runId: string, reason?: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/workflows/runs/${runId}/cancel`, {\n body: { reason },\n });\n }\n\n /** Pause a running workflow. */\n async pause(runId: string, reason?: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/workflows/runs/${runId}/pause`, {\n body: { reason },\n });\n }\n\n /** Resume a paused workflow. */\n async resume(runId: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/workflows/runs/${runId}/resume`, { body: {} });\n }\n\n /** Recover a stalled workflow from its last Sayiir checkpoint. */\n async recover(runId: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/workflows/runs/${runId}/recover`, { body: {} });\n }\n\n /** Send an external signal to a waiting workflow (e.g. HITL approval). */\n async signal(runId: string, signalName: string, payload: Record<string, unknown> = {}): Promise<void> {\n await this.http.request(\"POST\", `/v1/workflows/runs/${runId}/signal`, {\n body: { signal_name: signalName, payload },\n });\n }\n\n /** Approve or reject a waiting workflow (convenience wrapper over signal). */\n async approve(runId: string, opts: { approved: boolean; reason?: string; data?: Record<string, unknown> }): Promise<void> {\n await this.http.request(\"POST\", `/v1/workflows/runs/${runId}/approve`, {\n body: opts,\n });\n }\n\n /** List workflow runs currently waiting for a signal (pending approvals). */\n async listWaiting(params?: { organization_id?: string; team_id?: string }): Promise<WorkflowRun[]> {\n return this.http.request(\"GET\", \"/v1/workflows/runs/waiting\", {\n query: {\n organization_id: params?.organization_id ?? this.http.getOrganizationId(),\n team_id: params?.team_id ?? this.http.getTeamId(),\n },\n });\n }\n\n /**\n * Stream SSE events for a workflow run.\n *\n * - Replays existing events, then streams live\n * - Auto-reconnects via Last-Event-ID (when `reconnect: true`)\n * - Client-side filtering by event kind and node key\n * - Auto-closes on terminal events (completed/failed/cancelled)\n *\n * Returns an EventStream handle for cancellation.\n */\n streamEvents(runId: string, opts: StreamEventsOptions): EventStream {\n const url = `${this.http.getBaseUrl()}/v1/workflow-runs/${runId}/events`;\n const sseOpts = {\n url,\n headers: {},\n lastEventId: opts.lastEventId,\n signal: opts.signal,\n filter: opts.filter,\n reconnect: opts.reconnect,\n maxReconnectAttempts: opts.maxReconnectAttempts,\n fetch: async (input: RequestInfo | URL, init?: RequestInit) => {\n const headers = await this.http.buildHeaders({\n ...(init?.headers as Record<string, string>),\n });\n return globalThis.fetch(input, { ...init, headers });\n },\n };\n\n if (opts.reconnect) {\n return connectReconnectingSSE<DomainEvent>(\n sseOpts,\n (event) => opts.onEvent(event),\n opts.onError,\n );\n }\n\n return connectSSE<DomainEvent>(\n sseOpts,\n (event) => {\n if (matchesFilter(event, opts.filter)) opts.onEvent(event);\n },\n opts.onError,\n );\n }\n\n /**\n * Submit a workflow and wait for it to complete.\n *\n * Streams events via SSE while waiting. Returns the final WorkflowRun\n * with status and output.\n */\n async submitAndWait(workflowName: string, opts: SubmitAndWaitOptions): Promise<WorkflowRun> {\n const run = await this.submit(workflowName, {\n input: opts.input,\n metadata: opts.metadata,\n priority: opts.priority,\n organization_id: opts.organization_id,\n team_id: opts.team_id,\n });\n\n const timeoutMs = opts.timeoutMs ?? 900_000; // 15 min default\n\n return new Promise<WorkflowRun>((resolve, reject) => {\n const timeout = setTimeout(() => {\n stream.abort();\n reject(new Error(`Workflow run ${run.id} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n const stream = this.streamEvents(run.id, {\n onEvent: (event) => {\n opts.onEvent?.(event);\n if (TERMINAL_RUN_EVENTS.includes(event.kind)) {\n clearTimeout(timeout);\n // Fetch the final run state\n this.get(run.id).then(resolve).catch(reject);\n }\n },\n onError: (error) => {\n clearTimeout(timeout);\n reject(error);\n },\n });\n\n // Also handle stream ending without terminal event (e.g., server disconnect)\n stream.done.then(() => {\n clearTimeout(timeout);\n // Fetch final state in case we missed the terminal event\n this.get(run.id).then(resolve).catch(reject);\n });\n });\n }\n\n /** Get node execution attempts (logs) for a specific node. */\n async getNodeAttempts(runId: string, nodeKey: string): Promise<NodeAttempt[]> {\n return this.http.request(\n \"GET\",\n `/v1/workflows/runs/${runId}/nodes/${encodeURIComponent(nodeKey)}/attempts`,\n );\n }\n\n /** List artifacts produced by a workflow run. */\n async artifacts(runId: string): Promise<RunArtifact[]> {\n return this.http.request(\"GET\", `/v1/workflows/runs/${runId}/artifacts`);\n }\n\n /**\n * List artifacts with signed download URLs for each asset.\n *\n * Fetches artifacts, then generates a signed URL for each one that has\n * an `asset_id`. This is the recommended way for consumers to access\n * output files (videos, images, audio, text) from completed workflows.\n *\n * @example\n * ```ts\n * const artifacts = await fabric.workflows.runs.artifactsWithUrls(runId);\n * for (const a of artifacts) {\n * console.log(a.filename, a.download_url); // signed URL ready for download\n * }\n * ```\n */\n async artifactsWithUrls(runId: string, expirySeconds?: number): Promise<RunArtifact[]> {\n const artifacts = await this.artifacts(runId);\n\n // Generate signed URLs for artifacts that have an asset_id\n const withUrls = await Promise.all(\n artifacts.map(async (artifact) => {\n if (!artifact.asset_id) return artifact;\n try {\n const signed: SignedUrlResponse = await this.http.request(\n \"POST\",\n `/v1/asset-signed-urls/${artifact.asset_id}`,\n { body: { expiry_seconds: expirySeconds } },\n );\n return { ...artifact, download_url: signed.url };\n } catch {\n // If signing fails (e.g., asset deleted), return artifact without URL\n return artifact;\n }\n }),\n );\n return withUrls;\n }\n\n /** Record an artifact produced by a workflow run (called by workers). */\n async recordArtifact(runId: string, artifact: RecordArtifactRequest): Promise<RunArtifact> {\n return this.http.request(\"POST\", `/v1/workflows/runs/${runId}/artifacts`, {\n body: artifact,\n });\n }\n\n /**\n * Watch a workflow run step-by-step with typed callbacks.\n *\n * High-level convenience that composes SSE streaming, client-side\n * filtering, auto-reconnection, and typed event dispatch.\n *\n * @example\n * ```ts\n * const watcher = fabric.workflows.runs.watch(runId, {\n * nodeKeys: [\"transcribe\", \"render\"],\n * onNodeStarted: (key) => console.log(`${key} started`),\n * onNodeProgress: (key, p) => console.log(`${key}: ${p.percentage}%`),\n * onNodeCompleted: (key) => console.log(`${key} done`),\n * onNodeFailed: (key, p) => console.error(`${key} failed:`, p),\n * onRunCompleted: () => console.log(\"Workflow finished!\"),\n * onRunFailed: (p) => console.error(\"Workflow failed:\", p),\n * });\n *\n * // Stop watching early\n * watcher.abort();\n *\n * // Or wait until completion\n * await watcher.done;\n * ```\n */\n watch(runId: string, opts: WatchRunOptions = {}): RunWatcher {\n const filter: EventStreamFilter = {};\n\n // Build filter: run-level events + node events (optionally scoped)\n filter.kinds = [\n // Always include run lifecycle\n \"workflow.run.completed\",\n \"workflow.run.failed\",\n \"workflow.run.cancelled\",\n // Node events\n \"workflow.node.started\",\n \"workflow.node.progress\",\n \"workflow.node.completed\",\n \"workflow.node.failed\",\n \"workflow.node.retried\",\n \"workflow.node.skipped\",\n \"workflow.node.waiting_for_event\",\n \"workflow.node.resumed\",\n ];\n\n if (opts.nodeKeys && opts.nodeKeys.length > 0) {\n filter.nodeKeys = opts.nodeKeys;\n }\n\n const stream = this.streamEvents(runId, {\n lastEventId: opts.lastEventId,\n signal: opts.signal,\n reconnect: opts.reconnect ?? true,\n filter,\n onEvent: (event) => {\n // Forward raw event if requested\n opts.onEvent?.(event);\n\n const nodeKey = event.node_key ?? \"unknown\";\n const payload = event.payload;\n\n // Dispatch to typed callbacks\n switch (event.kind) {\n case \"workflow.node.started\":\n opts.onNodeStarted?.(nodeKey, payload);\n break;\n case \"workflow.node.progress\":\n opts.onNodeProgress?.(nodeKey, payload);\n break;\n case \"workflow.node.completed\":\n opts.onNodeCompleted?.(nodeKey, payload);\n break;\n case \"workflow.node.failed\":\n opts.onNodeFailed?.(nodeKey, payload);\n break;\n case \"workflow.run.completed\":\n opts.onRunCompleted?.(payload);\n stream.abort();\n break;\n case \"workflow.run.failed\":\n opts.onRunFailed?.(payload);\n stream.abort();\n break;\n case \"workflow.run.cancelled\":\n opts.onRunCancelled?.(payload);\n stream.abort();\n break;\n }\n },\n onError: opts.onError,\n });\n\n return stream;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main resource\n// ---------------------------------------------------------------------------\n\nexport class WorkflowsResource {\n readonly registry: WorkflowRegistryResource;\n readonly runs: WorkflowRunsResource;\n\n constructor(private readonly http: HttpTransport) {\n this.registry = new WorkflowRegistryResource(http);\n this.runs = new WorkflowRunsResource(http);\n }\n\n /** Compose multiple workflows into a pipeline. */\n async compose(opts: ComposeWorkflowRequest): Promise<RegistryEntry> {\n return this.http.request(\"POST\", \"/v1/workflows/compose\", {\n body: {\n name: opts.name,\n steps: opts.steps,\n description: opts.description,\n },\n });\n }\n\n /** Estimate cost of a workflow before running it. */\n async estimate(\n workflowName: string,\n opts?: EstimateWorkflowRequest & { organization_id?: string; team_id?: string },\n ): Promise<WorkflowCostEstimate> {\n return this.http.request(\"POST\", \"/v1/workflows/estimate\", {\n query: {\n name: workflowName,\n organization_id: opts?.organization_id ?? this.http.getOrganizationId(),\n team_id: opts?.team_id ?? this.http.getTeamId(),\n },\n body: {\n input: opts?.input,\n cost_profile: opts?.cost_profile,\n },\n });\n }\n}\n","/**\n * Events resource — real-time event streaming.\n */\n\nimport type { HttpTransport } from \"../http.js\";\nimport type {\n DomainEvent,\n EventHandler,\n EventStreamFilter,\n WebSocketCommand,\n WebSocketAck,\n} from \"../types/index.js\";\nimport { connectSSE, connectReconnectingSSE, matchesFilter, type EventStream } from \"../streaming.js\";\n\nexport interface WebSocketConnection {\n /** Subscribe to events for a specific run. */\n subscribeToRun(runId: string): void;\n /** Unsubscribe from run-specific filtering. */\n unsubscribe(): void;\n /** Close the WebSocket connection. */\n close(): void;\n}\n\nexport interface WebSocketOptions {\n onEvent: EventHandler;\n onError?: (error: Event) => void;\n onClose?: () => void;\n /** Client-side event filter. */\n filter?: EventStreamFilter;\n /** Callback for server acknowledgements. */\n onAck?: (ack: WebSocketAck) => void;\n}\n\nexport interface StreamOptions {\n onEvent: EventHandler;\n onError?: (error: Error) => void;\n signal?: AbortSignal;\n lastEventId?: string;\n /** Client-side event filter. */\n filter?: EventStreamFilter;\n /** Enable auto-reconnection on connection drop (default: false). */\n reconnect?: boolean;\n /** Maximum reconnection attempts (default: 10). */\n maxReconnectAttempts?: number;\n}\n\nexport class EventsResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Build fetch wrapper that injects auth headers. */\n private authFetch(): (input: RequestInfo | URL, init?: RequestInit) => Promise<Response> {\n return async (input, init) => {\n const headers = await this.http.buildHeaders({\n ...(init?.headers as Record<string, string>),\n });\n return globalThis.fetch(input, { ...init, headers });\n };\n }\n\n /**\n * Stream all domain events via SSE.\n *\n * This is a long-lived connection — call `stream.abort()` to disconnect.\n */\n stream(opts: StreamOptions): EventStream {\n const url = `${this.http.getBaseUrl()}/v1/events/stream`;\n const sseOpts = {\n url,\n headers: {},\n signal: opts.signal,\n lastEventId: opts.lastEventId,\n fetch: this.authFetch(),\n filter: opts.filter,\n reconnect: opts.reconnect,\n maxReconnectAttempts: opts.maxReconnectAttempts,\n };\n\n if (opts.reconnect) {\n return connectReconnectingSSE<DomainEvent>(\n sseOpts,\n (event) => opts.onEvent(event),\n opts.onError,\n );\n }\n\n // Without reconnection, apply filter manually\n return connectSSE<DomainEvent>(\n sseOpts,\n (event) => {\n if (matchesFilter(event, opts.filter)) opts.onEvent(event);\n },\n opts.onError,\n );\n }\n\n /**\n * Stream events for a specific workflow run via SSE.\n *\n * Supports client-side filtering by event kind and node key, plus\n * auto-reconnection with Last-Event-ID replay.\n */\n streamRun(runId: string, opts: StreamOptions): EventStream {\n const url = `${this.http.getBaseUrl()}/v1/workflow-runs/${runId}/events`;\n const sseOpts = {\n url,\n headers: {},\n lastEventId: opts.lastEventId,\n signal: opts.signal,\n fetch: this.authFetch(),\n filter: opts.filter,\n reconnect: opts.reconnect,\n maxReconnectAttempts: opts.maxReconnectAttempts,\n };\n\n if (opts.reconnect) {\n return connectReconnectingSSE<DomainEvent>(\n sseOpts,\n (event) => opts.onEvent(event),\n opts.onError,\n );\n }\n\n return connectSSE<DomainEvent>(\n sseOpts,\n (event) => {\n if (matchesFilter(event, opts.filter)) opts.onEvent(event);\n },\n opts.onError,\n );\n }\n\n /**\n * Stream events for a specific job via SSE.\n *\n * A job is a single-node execution. Use this to watch one node\n * without receiving events from the rest of the workflow.\n */\n streamJob(jobId: string, opts: StreamOptions): EventStream {\n const url = `${this.http.getBaseUrl()}/v1/jobs/${jobId}/events`;\n const sseOpts = {\n url,\n headers: {},\n lastEventId: opts.lastEventId,\n signal: opts.signal,\n fetch: this.authFetch(),\n filter: opts.filter,\n reconnect: opts.reconnect,\n maxReconnectAttempts: opts.maxReconnectAttempts,\n };\n\n if (opts.reconnect) {\n return connectReconnectingSSE<DomainEvent>(\n sseOpts,\n (event) => opts.onEvent(event),\n opts.onError,\n );\n }\n\n return connectSSE<DomainEvent>(\n sseOpts,\n (event) => {\n if (matchesFilter(event, opts.filter)) opts.onEvent(event);\n },\n opts.onError,\n );\n }\n\n /**\n * Connect via WebSocket for bidirectional event streaming.\n *\n * Supports dynamic run subscription via `subscribeToRun()` / `unsubscribe()`.\n * Server acknowledgements are typed and delivered via `onAck`.\n * Only available in environments with WebSocket support (browser, Node.js 21+).\n */\n connectWebSocket(opts: WebSocketOptions): WebSocketConnection {\n const baseUrl = this.http.getBaseUrl().replace(/^http/, \"ws\");\n const url = `${baseUrl}/v1/events/ws`;\n\n const ws = new WebSocket(url);\n\n ws.onmessage = (msg) => {\n try {\n const data = JSON.parse(msg.data as string);\n\n // Check if this is an ack message\n if (\"subscribed_to_run\" in data || \"unsubscribed\" in data) {\n opts.onAck?.(data as WebSocketAck);\n return;\n }\n\n // Otherwise it's a domain event\n const event = data as DomainEvent;\n if (matchesFilter(event, opts.filter)) {\n opts.onEvent(event);\n }\n } catch {\n // Ignore non-JSON messages\n }\n };\n\n ws.onerror = (err) => opts.onError?.(err);\n ws.onclose = () => opts.onClose?.();\n\n return {\n subscribeToRun(runId: string) {\n const cmd: WebSocketCommand = { subscribe_run: runId };\n ws.send(JSON.stringify(cmd));\n },\n unsubscribe() {\n const cmd: WebSocketCommand = { unsubscribe: true };\n ws.send(JSON.stringify(cmd));\n },\n close() {\n ws.close();\n },\n };\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type { Asset, SignedUrlResponse } from \"../types/index.js\";\n\nexport class AssetsResource {\n constructor(private readonly http: HttpTransport) {}\n\n /**\n * Upload an asset (max 100 MB).\n *\n * @param data - File data as Blob, ArrayBuffer, or ReadableStream\n * @param opts - Content type and optional filename\n */\n async upload(\n data: Blob | ArrayBuffer | ReadableStream<Uint8Array>,\n opts?: { contentType?: string; filename?: string; organization_id?: string },\n ): Promise<Asset> {\n const headers = await this.http.buildHeaders({\n \"Content-Type\": opts?.contentType ?? \"application/octet-stream\",\n });\n\n if (opts?.filename) {\n headers[\"X-Filename\"] = opts.filename;\n }\n\n const orgId = opts?.organization_id ?? this.http.getOrganizationId();\n const query = orgId ? `?organization_id=${orgId}` : \"\";\n\n const res = await globalThis.fetch(`${this.http.getBaseUrl()}/v1/assets${query}`, {\n method: \"POST\",\n headers,\n body: data,\n });\n\n const json = await res.json();\n if (json.error) {\n throw new Error(`${json.error.code}: ${json.error.message}`);\n }\n return json.data as Asset;\n }\n\n /** List assets for the current organization. */\n async list(params?: PaginationParams & { organization_id?: string }): Promise<PaginatedResponse<Asset>> {\n return this.http.requestPaginated(\"GET\", \"/v1/assets\", {\n query: {\n limit: params?.limit,\n cursor: params?.cursor,\n organization_id: params?.organization_id ?? this.http.getOrganizationId(),\n },\n });\n }\n\n /** Generate a signed download URL for an asset. */\n async signedUrl(assetId: string, expirySeconds?: number): Promise<SignedUrlResponse> {\n return this.http.request(\"POST\", `/v1/asset-signed-urls/${assetId}`, {\n body: { expiry_seconds: expirySeconds },\n });\n }\n\n /** Download an asset by path. Returns the raw Response for streaming. */\n async download(path: string): Promise<Response> {\n return this.http.requestRaw(\"GET\", `/v1/assets/${path}`);\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type { Gallery, GalleryItem, CreateGalleryRequest, AddGalleryItemRequest } from \"../types/index.js\";\n\nexport class GalleriesResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create a gallery. */\n async create(opts: CreateGalleryRequest): Promise<Gallery> {\n return this.http.request(\"POST\", \"/v1/galleries\", { body: opts });\n }\n\n /** List galleries. */\n async list(params?: PaginationParams): Promise<PaginatedResponse<Gallery>> {\n return this.http.requestPaginated(\"GET\", \"/v1/galleries\", {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** Get a gallery by ID. */\n async get(galleryId: string): Promise<Gallery> {\n return this.http.request(\"GET\", `/v1/galleries/${galleryId}`);\n }\n\n /** Delete a gallery. */\n async delete(galleryId: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/galleries/${galleryId}`);\n }\n\n /** Add an item to a gallery. */\n async addItem(galleryId: string, opts: AddGalleryItemRequest): Promise<GalleryItem> {\n return this.http.request(\"POST\", `/v1/galleries/${galleryId}/items`, { body: opts });\n }\n\n /** List items in a gallery. */\n async listItems(galleryId: string, params?: PaginationParams): Promise<PaginatedResponse<GalleryItem>> {\n return this.http.requestPaginated(\"GET\", `/v1/galleries/${galleryId}/items`, {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** Remove an item from a gallery. */\n async removeItem(itemId: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/gallery-items/${itemId}`);\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type { ApiKey, CreateApiKeyResponse, CreateApiKeyRequest } from \"../types/index.js\";\n\nexport class ApiKeysResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create an API key. Returns the raw secret (only shown once). */\n async create(opts: CreateApiKeyRequest): Promise<CreateApiKeyResponse> {\n return this.http.request(\"POST\", \"/v1/api-keys\", { body: opts });\n }\n\n /** List API keys. */\n async list(params?: PaginationParams): Promise<PaginatedResponse<ApiKey>> {\n return this.http.requestPaginated(\"GET\", \"/v1/api-keys\", {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** Get an API key by ID. */\n async get(keyId: string): Promise<ApiKey> {\n return this.http.request(\"GET\", `/v1/api-keys/${keyId}`);\n }\n\n /** Delete an API key. */\n async delete(keyId: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/api-keys/${keyId}`);\n }\n\n /** Disable an API key. */\n async disable(keyId: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/api-keys/${keyId}/disable`, { body: {} });\n }\n\n /** Rotate an API key (new secret issued). */\n async rotate(keyId: string): Promise<CreateApiKeyResponse> {\n return this.http.request(\"POST\", `/v1/api-keys/${keyId}/rotate`, { body: {} });\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { Invitation, CreateInvitationRequest } from \"../types/index.js\";\n\nexport class InvitationsResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create an invitation. */\n async create(opts: CreateInvitationRequest): Promise<Invitation> {\n return this.http.request(\"POST\", \"/v1/invitations\", { body: opts });\n }\n\n /** Accept an invitation. */\n async accept(invitationId: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/invitations/${invitationId}/accept`, { body: {} });\n }\n\n /** Revoke/cancel an invitation. */\n async revoke(invitationId: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/invitations/${invitationId}/revoke`, { body: {} });\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type { Permission, GrantPermissionRequest, AuthzCheckRequest, AuthzCheckResponse } from \"../types/index.js\";\n\nexport class PermissionsResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Check a single permission. */\n async check(opts: AuthzCheckRequest): Promise<AuthzCheckResponse> {\n return this.http.request(\"POST\", \"/v1/authz/check\", { body: opts });\n }\n\n /** Check multiple permissions in batch. */\n async checkBatch(checks: AuthzCheckRequest[]): Promise<AuthzCheckResponse[]> {\n return this.http.request(\"POST\", \"/v1/authz/check-batch\", {\n body: { checks },\n });\n }\n\n /** Grant a permission (ACL entry). */\n async grant(opts: GrantPermissionRequest): Promise<Permission> {\n return this.http.request(\"POST\", \"/v1/permissions\", { body: opts });\n }\n\n /** List permissions. */\n async list(params?: PaginationParams & { resource_type?: string; resource_id?: string }): Promise<PaginatedResponse<Permission>> {\n return this.http.requestPaginated(\"GET\", \"/v1/permissions\", {\n query: {\n limit: params?.limit,\n cursor: params?.cursor,\n resource_type: params?.resource_type,\n resource_id: params?.resource_id,\n },\n });\n }\n\n /** Revoke a permission. */\n async revoke(permissionId: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/permissions/${permissionId}`);\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type { Webhook, WebhookDelivery, CreateWebhookRequest, UpdateWebhookRequest } from \"../types/index.js\";\n\nexport class WebhooksResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create a webhook for an organization. */\n async create(orgId: string, opts: CreateWebhookRequest): Promise<Webhook> {\n return this.http.request(\"POST\", `/v1/organizations/${orgId}/webhooks`, { body: opts });\n }\n\n /** List webhooks for an organization. */\n async list(orgId: string, params?: PaginationParams): Promise<PaginatedResponse<Webhook>> {\n return this.http.requestPaginated(\"GET\", `/v1/organizations/${orgId}/webhooks`, {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** Get a webhook by ID. */\n async get(webhookId: string): Promise<Webhook> {\n return this.http.request(\"GET\", `/v1/webhooks/${webhookId}`);\n }\n\n /** Update a webhook. */\n async update(webhookId: string, opts: UpdateWebhookRequest): Promise<Webhook> {\n return this.http.request(\"PATCH\", `/v1/webhooks/${webhookId}`, { body: opts });\n }\n\n /** Delete a webhook. */\n async delete(webhookId: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/webhooks/${webhookId}`);\n }\n\n /** List delivery attempts for a webhook. */\n async deliveries(webhookId: string, params?: PaginationParams): Promise<PaginatedResponse<WebhookDelivery>> {\n return this.http.requestPaginated(\"GET\", `/v1/webhooks/${webhookId}/deliveries`, {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type { ServiceAccount, CreateServiceAccountRequest, ApiKey, CreateApiKeyResponse } from \"../types/index.js\";\n\nexport class ServiceAccountsResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create a service account. */\n async create(opts: CreateServiceAccountRequest): Promise<ServiceAccount> {\n return this.http.request(\"POST\", \"/v1/service-accounts\", { body: opts });\n }\n\n /** List service accounts. */\n async list(params?: PaginationParams): Promise<PaginatedResponse<ServiceAccount>> {\n return this.http.requestPaginated(\"GET\", \"/v1/service-accounts\", {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** Get a service account by ID. */\n async get(id: string): Promise<ServiceAccount> {\n return this.http.request(\"GET\", `/v1/service-accounts/${id}`);\n }\n\n /** Disable a service account. */\n async disable(id: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/service-accounts/${id}/disable`, { body: {} });\n }\n\n /** Enable a service account. */\n async enable(id: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/service-accounts/${id}/enable`, { body: {} });\n }\n\n /** Create an API key for a service account. */\n async createApiKey(id: string): Promise<CreateApiKeyResponse> {\n return this.http.request(\"POST\", `/v1/service-accounts/${id}/api-keys`, { body: {} });\n }\n\n /** List API keys for a service account. */\n async listApiKeys(id: string): Promise<ApiKey[]> {\n return this.http.request(\"GET\", `/v1/service-accounts/${id}/api-keys`);\n }\n\n /** Revoke an API key for a service account. */\n async revokeApiKey(id: string, keyId: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/service-accounts/${id}/api-keys/${keyId}`);\n }\n\n /** Rotate an API key for a service account. */\n async rotateApiKey(id: string, keyId: string): Promise<CreateApiKeyResponse> {\n return this.http.request(\"POST\", `/v1/service-accounts/${id}/api-keys/${keyId}/rotate`, { body: {} });\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { OAuthClient, CreateOAuthClientRequest, OAuthTokenResponse } from \"../types/index.js\";\n\nexport class OAuthResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create an OAuth client for an organization. */\n async createClient(opts: CreateOAuthClientRequest): Promise<OAuthClient> {\n return this.http.request(\"POST\", \"/v1/oauth/clients\", { body: opts });\n }\n\n /** List OAuth clients. */\n async listClients(): Promise<OAuthClient[]> {\n return this.http.request(\"GET\", \"/v1/oauth/clients\");\n }\n\n /** Delete an OAuth client. */\n async deleteClient(clientId: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/oauth/clients/${clientId}`);\n }\n\n /** Exchange client credentials for an access token. */\n async token(clientId: string, clientSecret: string): Promise<OAuthTokenResponse> {\n return this.http.request(\"POST\", \"/v1/oauth/token\", {\n body: {\n grant_type: \"client_credentials\",\n client_id: clientId,\n client_secret: clientSecret,\n },\n });\n }\n\n /** Refresh an access token. */\n async refresh(refreshToken: string): Promise<OAuthTokenResponse> {\n return this.http.request(\"POST\", \"/v1/oauth/token\", {\n body: {\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n },\n });\n }\n\n /** Revoke an OAuth token. */\n async revoke(token: string): Promise<void> {\n await this.http.request(\"POST\", \"/v1/oauth/revoke\", {\n body: { token },\n });\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type { SystemInfo, SystemStatus } from \"../types/index.js\";\n\nexport interface ConcurrencyLimit {\n id: string;\n scope: string;\n max_concurrent_runs: number;\n created_at: string;\n updated_at: string;\n}\n\nexport class AdminResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Bootstrap the system (dev mode: creates org + admin). */\n async bootstrap(): Promise<Record<string, unknown>> {\n return this.http.request(\"POST\", \"/v1/admin/bootstrap\", { body: {} });\n }\n\n /** List concurrency limits. */\n async listConcurrencyLimits(): Promise<ConcurrencyLimit[]> {\n return this.http.request(\"GET\", \"/v1/admin/concurrency-limits\");\n }\n\n /** Set a concurrency limit for a scope (e.g., \"org:<uuid>\"). */\n async setConcurrencyLimit(scope: string, maxConcurrentRuns: number): Promise<ConcurrencyLimit> {\n return this.http.request(\"PUT\", \"/v1/admin/concurrency-limits\", {\n body: { scope, max_concurrent_runs: maxConcurrentRuns },\n });\n }\n\n /** Get system information (version, features, uptime). */\n async systemInfo(): Promise<SystemInfo> {\n return this.http.request(\"GET\", \"/v1/system/info\");\n }\n\n /** Get detailed system status (database, event bus health). */\n async systemStatus(): Promise<SystemStatus> {\n return this.http.request(\"GET\", \"/v1/system/status\");\n }\n\n /** List audit logs (standalone, not org-scoped). */\n async auditLogs(params?: PaginationParams): Promise<PaginatedResponse<Record<string, unknown>>> {\n return this.http.requestPaginated(\"GET\", \"/v1/audit-logs\", {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { WorkflowSchedule, ScheduleRun, CreateScheduleRequest, UpdateScheduleRequest } from \"../types/schedules.js\";\n\nexport class SchedulesResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create a schedule for a workflow definition. */\n async create(workflowDefId: string, opts: CreateScheduleRequest): Promise<WorkflowSchedule> {\n return this.http.request(\"POST\", `/v1/workflow-definitions/${workflowDefId}/schedules`, { body: opts });\n }\n\n /** List schedules for a workflow definition. */\n async list(workflowDefId: string): Promise<WorkflowSchedule[]> {\n return this.http.request(\"GET\", `/v1/workflow-definitions/${workflowDefId}/schedules`);\n }\n\n /** Get a schedule by ID. */\n async get(scheduleId: string): Promise<WorkflowSchedule> {\n return this.http.request(\"GET\", `/v1/schedules/${scheduleId}`);\n }\n\n /** Update a schedule. */\n async update(scheduleId: string, opts: UpdateScheduleRequest): Promise<WorkflowSchedule> {\n return this.http.request(\"PATCH\", `/v1/schedules/${scheduleId}`, { body: opts });\n }\n\n /** Delete a schedule. */\n async delete(scheduleId: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/schedules/${scheduleId}`);\n }\n\n /** Manually trigger a scheduled workflow run. */\n async trigger(scheduleId: string): Promise<{ workflow_run_id: string; schedule_id: string; trigger_type: string }> {\n return this.http.request(\"POST\", `/v1/schedules/${scheduleId}/trigger`);\n }\n\n /** List run history for a schedule. */\n async history(scheduleId: string): Promise<ScheduleRun[]> {\n return this.http.request(\"GET\", `/v1/schedules/${scheduleId}/history`);\n }\n}\n","/**\n * Providers resource — AI provider execution (feature-gated).\n *\n * Exposes modality-based routing to AI providers (text, image, audio, video, etc.)\n * with BYOK support via per-request credentials.\n */\n\nimport type { HttpTransport } from \"../http.js\";\nimport type {\n ProviderCapability,\n ProviderExecuteRequest,\n ProviderExecuteResponse,\n} from \"../types/index.js\";\nimport type { DomainEvent } from \"../types/index.js\";\nimport { connectSSE, type EventStream } from \"../streaming.js\";\n\nexport class ProvidersResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** List all available provider capabilities. */\n async list(): Promise<ProviderCapability[]> {\n return this.http.request(\"GET\", \"/v1/providers\");\n }\n\n /** Execute a provider (request/response). */\n async execute(request: ProviderExecuteRequest): Promise<ProviderExecuteResponse> {\n return this.http.request(\"POST\", \"/v1/providers/execute\", {\n body: request,\n });\n }\n\n /**\n * Execute a provider with streaming (SSE).\n *\n * Streams token-level chunks during LLM inference.\n * Events: `chunk` (delta), `complete` (final response + usage), `error`.\n */\n executeStream(\n request: ProviderExecuteRequest,\n opts: {\n onChunk: (data: Record<string, unknown>) => void;\n onComplete?: (data: ProviderExecuteResponse) => void;\n onError?: (error: Error) => void;\n signal?: AbortSignal;\n },\n ): EventStream {\n const url = `${this.http.getBaseUrl()}/v1/providers/execute/stream`;\n\n return connectSSE(\n {\n url,\n headers: {},\n signal: opts.signal,\n fetch: async (input, init) => {\n const headers = await this.http.buildHeaders({\n ...(init?.headers as Record<string, string>),\n });\n // POST with body\n return globalThis.fetch(input, {\n ...init,\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n });\n },\n },\n (event: Record<string, unknown>, raw) => {\n if (raw.event === \"chunk\") {\n opts.onChunk(event);\n } else if (raw.event === \"complete\") {\n opts.onComplete?.(event as unknown as ProviderExecuteResponse);\n }\n },\n opts.onError,\n );\n }\n\n /** Estimate the cost of a provider execution before running it. */\n async estimate(request: ProviderExecuteRequest): Promise<number> {\n return this.http.request(\"POST\", \"/v1/providers/estimate\", {\n body: request,\n });\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { Package } from \"../types/index.js\";\n\nexport class PackagesResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** List all installed domain packages. */\n async list(): Promise<Package[]> {\n return this.http.request(\"GET\", \"/v1/packages\");\n }\n}\n","/**\n * FabricClient — the main entry point for the SDK.\n *\n * Instantiate with a config, then access resources via namespaced properties:\n *\n * ```typescript\n * const fabric = new FabricClient({\n * baseUrl: 'https://api.fabric.ai',\n * auth: { type: 'api-key', key: 'fab_...' },\n * organizationId: 'org-uuid',\n * });\n *\n * const run = await fabric.workflows.runs.submit('research/deep_research', {\n * input: { query: 'AI trends' },\n * });\n *\n * const stream = fabric.workflows.runs.streamEvents(run.id, {\n * onEvent(event) { console.log(event.kind, event.node_key); },\n * });\n * ```\n */\n\nimport type { AuthConfig } from \"./auth.js\";\nimport { HttpTransport, type RequestInterceptor, type ResponseInterceptor } from \"./http.js\";\n\nimport { AuthResource } from \"./resources/auth.resource.js\";\nimport { MeResource } from \"./resources/me.resource.js\";\nimport { OrganizationsResource } from \"./resources/organizations.resource.js\";\nimport { TeamsResource } from \"./resources/teams.resource.js\";\nimport { WorkflowsResource } from \"./resources/workflows.resource.js\";\nimport { EventsResource } from \"./resources/events.resource.js\";\nimport { AssetsResource } from \"./resources/assets.resource.js\";\nimport { GalleriesResource } from \"./resources/galleries.resource.js\";\nimport { ApiKeysResource } from \"./resources/api-keys.resource.js\";\nimport { InvitationsResource } from \"./resources/invitations.resource.js\";\nimport { PermissionsResource } from \"./resources/permissions.resource.js\";\nimport { WebhooksResource } from \"./resources/webhooks.resource.js\";\nimport { ServiceAccountsResource } from \"./resources/service-accounts.resource.js\";\nimport { OAuthResource } from \"./resources/oauth.resource.js\";\nimport { AdminResource } from \"./resources/admin.resource.js\";\nimport { SchedulesResource } from \"./resources/schedules.resource.js\";\nimport { ProvidersResource } from \"./resources/providers.resource.js\";\nimport { PackagesResource } from \"./resources/packages.resource.js\";\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface FabricConfig {\n /** Base URL of the Fabric API. Default: http://localhost:3001 */\n baseUrl?: string;\n /**\n * Authentication strategy.\n *\n * - `{ type: 'api-key', key: 'fab_...' }` — API key auth\n * - `{ type: 'bearer', token: '...' }` — JWT bearer token\n * - `{ type: 'oauth', clientId, clientSecret }` — OAuth client credentials\n * - `() => Promise<string>` — dynamic per-request token (e.g., from Next.js cookies)\n */\n auth?: AuthConfig;\n /** Default organization ID for scoped requests. */\n organizationId?: string;\n /** Default team ID for scoped requests. */\n teamId?: string;\n /** Request timeout in milliseconds. Default: 30000 */\n timeout?: number;\n /** Custom fetch implementation (e.g., Next.js enhanced fetch for caching). */\n fetch?: typeof globalThis.fetch;\n /** Log all requests and responses to console. */\n debug?: boolean;\n /** Called before each request. Use for logging, metrics, tracing. */\n onRequest?: RequestInterceptor;\n /** Called after each response. Use for logging, metrics, tracing. */\n onResponse?: ResponseInterceptor;\n}\n\n// ---------------------------------------------------------------------------\n// Client\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_BASE_URL = \"http://localhost:3001\";\n\nexport class FabricClient {\n readonly auth: AuthResource;\n readonly me: MeResource;\n readonly organizations: OrganizationsResource;\n readonly teams: TeamsResource;\n readonly workflows: WorkflowsResource;\n readonly events: EventsResource;\n readonly assets: AssetsResource;\n readonly galleries: GalleriesResource;\n readonly apiKeys: ApiKeysResource;\n readonly invitations: InvitationsResource;\n readonly permissions: PermissionsResource;\n readonly webhooks: WebhooksResource;\n readonly serviceAccounts: ServiceAccountsResource;\n readonly oauth: OAuthResource;\n readonly admin: AdminResource;\n readonly schedules: SchedulesResource;\n readonly providers: ProvidersResource;\n readonly packages: PackagesResource;\n\n constructor(config: FabricConfig = {}) {\n const transport = new HttpTransport({\n baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\n auth: config.auth,\n organizationId: config.organizationId,\n teamId: config.teamId,\n timeout: config.timeout,\n fetch: config.fetch,\n debug: config.debug,\n onRequest: config.onRequest,\n onResponse: config.onResponse,\n });\n\n this.auth = new AuthResource(transport);\n this.me = new MeResource(transport);\n this.organizations = new OrganizationsResource(transport);\n this.teams = new TeamsResource(transport);\n this.workflows = new WorkflowsResource(transport);\n this.events = new EventsResource(transport);\n this.assets = new AssetsResource(transport);\n this.galleries = new GalleriesResource(transport);\n this.apiKeys = new ApiKeysResource(transport);\n this.invitations = new InvitationsResource(transport);\n this.permissions = new PermissionsResource(transport);\n this.webhooks = new WebhooksResource(transport);\n this.serviceAccounts = new ServiceAccountsResource(transport);\n this.oauth = new OAuthResource(transport);\n this.admin = new AdminResource(transport);\n this.schedules = new SchedulesResource(transport);\n this.providers = new ProvidersResource(transport);\n this.packages = new PackagesResource(transport);\n }\n}\n","/**\n * Pagination types and async iterator helper.\n */\n\n/** Pagination metadata from Fabric API responses. */\nexport interface Pagination {\n count: number;\n has_more: boolean;\n next_cursor?: string;\n}\n\n/** A paginated list response. */\nexport interface PaginatedResponse<T> {\n items: T[];\n pagination: Pagination;\n}\n\n/** Query parameters for paginated endpoints. */\nexport interface PaginationParams {\n limit?: number;\n cursor?: string;\n}\n\n/**\n * Async generator for auto-pagination.\n *\n * Yields pages of items until no more pages are available.\n *\n * ```typescript\n * for await (const page of paginate((params) => fabric.organizations.list(params))) {\n * for (const org of page) { ... }\n * }\n * ```\n */\nexport async function* paginate<T>(\n fetcher: (params: PaginationParams) => Promise<PaginatedResponse<T>>,\n options?: { limit?: number },\n): AsyncGenerator<T[], void, unknown> {\n let cursor: string | undefined;\n do {\n const page = await fetcher({ limit: options?.limit, cursor });\n yield page.items;\n cursor = page.pagination.has_more ? page.pagination.next_cursor : undefined;\n } while (cursor);\n}\n\n/**\n * Async generator for item-level iteration (single items, not pages).\n *\n * ```typescript\n * for await (const org of paginateItems((params) => fabric.organizations.list(params))) {\n * console.log(org.name);\n * }\n * ```\n */\nexport async function* paginateItems<T>(\n fetcher: (params: PaginationParams) => Promise<PaginatedResponse<T>>,\n options?: { limit?: number },\n): AsyncGenerator<T, void, unknown> {\n for await (const page of paginate(fetcher, options)) {\n for (const item of page) {\n yield item;\n }\n }\n}\n\n/**\n * Collect all pages into a single array.\n *\n * ```typescript\n * const allOrgs = await paginateAll((params) => fabric.organizations.list(params));\n * ```\n */\nexport async function paginateAll<T>(\n fetcher: (params: PaginationParams) => Promise<PaginatedResponse<T>>,\n options?: { limit?: number },\n): Promise<T[]> {\n const all: T[] = [];\n for await (const page of paginate(fetcher, options)) {\n all.push(...page);\n }\n return all;\n}\n","/**\n * Webhook signature verification utility.\n *\n * The Fabric backend signs every webhook delivery with HMAC-SHA256.\n * Headers sent with each delivery:\n * - `X-Fabric-Signature`: `sha256=<hex>` — HMAC of the raw body\n * - `X-Fabric-Event`: event kind (e.g. `workflow.run.completed`)\n * - `X-Fabric-Delivery`: unique delivery/event ID\n *\n * Works in both Node.js 18+ and browsers via Web Crypto API.\n */\n\nimport type { DomainEvent } from \"./types/index.js\";\n\n/** Headers sent with each webhook delivery. */\nexport interface WebhookHeaders {\n \"x-fabric-signature\": string;\n \"x-fabric-event\": string;\n \"x-fabric-delivery\": string;\n}\n\n/**\n * Verify a webhook signature.\n *\n * @param rawBody - The raw request body string (do NOT parse before verifying)\n * @param signature - The `X-Fabric-Signature` header value (format: `sha256=<hex>`)\n * @param secret - Your webhook signing secret\n * @returns `true` if the signature is valid\n *\n * @example\n * ```ts\n * import { verifyWebhookSignature } from \"@fabric-platform/sdk\";\n *\n * app.post(\"/webhook\", async (req, res) => {\n * const rawBody = req.body; // must be the raw string\n * const sig = req.headers[\"x-fabric-signature\"];\n * if (!await verifyWebhookSignature(rawBody, sig, process.env.WEBHOOK_SECRET!)) {\n * return res.status(401).send(\"Invalid signature\");\n * }\n * // safe to process\n * });\n * ```\n */\nexport async function verifyWebhookSignature(\n rawBody: string,\n signature: string,\n secret: string,\n): Promise<boolean> {\n const expected = await computeSignature(rawBody, secret);\n return constantTimeEqual(expected, signature);\n}\n\n/**\n * Verify the signature and parse the webhook payload in one call (Stripe pattern).\n *\n * Throws if the signature is invalid.\n *\n * @param rawBody - The raw request body string\n * @param signature - The `X-Fabric-Signature` header value\n * @param secret - Your webhook signing secret\n * @returns The parsed and typed `DomainEvent`\n *\n * @example\n * ```ts\n * import { constructWebhookEvent } from \"@fabric-platform/sdk\";\n *\n * app.post(\"/webhook\", async (req, res) => {\n * let event;\n * try {\n * event = await constructWebhookEvent(\n * req.body,\n * req.headers[\"x-fabric-signature\"]!,\n * process.env.WEBHOOK_SECRET!,\n * );\n * } catch {\n * return res.status(401).send(\"Invalid signature\");\n * }\n *\n * switch (event.kind) {\n * case \"workflow.run.completed\":\n * console.log(\"Run completed:\", event.run_id);\n * break;\n * case \"workflow.run.failed\":\n * console.error(\"Run failed:\", event.payload);\n * break;\n * }\n * res.sendStatus(200);\n * });\n * ```\n */\nexport async function constructWebhookEvent(\n rawBody: string,\n signature: string,\n secret: string,\n): Promise<DomainEvent> {\n const valid = await verifyWebhookSignature(rawBody, signature, secret);\n if (!valid) {\n throw new Error(\"Invalid webhook signature\");\n }\n return JSON.parse(rawBody) as DomainEvent;\n}\n\n// ---------------------------------------------------------------------------\n// Internal — Web Crypto API (works in Node.js 18+ and browsers)\n// ---------------------------------------------------------------------------\n\nconst encoder = new TextEncoder();\n\nasync function computeSignature(payload: string, secret: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const sig = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(payload));\n return `sha256=${hexEncode(new Uint8Array(sig))}`;\n}\n\nfunction hexEncode(bytes: Uint8Array): string {\n let hex = \"\";\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i].toString(16).padStart(2, \"0\");\n }\n return hex;\n}\n\n/** Constant-time string comparison to prevent timing attacks. */\nfunction constantTimeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return result === 0;\n}\n","/**\n * Backwards-compatible event logger from the original SDK.\n *\n * Usage:\n * ```typescript\n * import { logEvents } from '@fabric-platform/sdk';\n * fabric.workflows.runs.streamEvents(runId, { onEvent: logEvents });\n * ```\n */\n\nimport type { DomainEvent } from \"./types/index.js\";\n\nconst ansi = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n cyan: \"\\x1b[36m\",\n};\n\nconst nodeTimers: Record<string, number> = {};\nconst ts = () => new Date().toISOString().split(\"T\")[1]!.slice(0, 12);\n\n/** Built-in event logger — prints workflow progress to the console. */\nexport const logEvents = (event: DomainEvent): void => {\n const t = `${ansi.dim}${ts()}${ansi.reset}`;\n const key = event.node_key;\n\n switch (event.kind) {\n case \"workflow.run.started\":\n console.log(`${t} ${ansi.green}▶ Workflow started${ansi.reset}`);\n break;\n case \"workflow.node.started\":\n if (key) nodeTimers[key] = Date.now();\n console.log(`${t} ${ansi.cyan}⟳ ${key}${ansi.reset} running`);\n break;\n case \"workflow.node.completed\": {\n const ms = key && nodeTimers[key] ? Date.now() - nodeTimers[key]! : 0;\n console.log(`${t} ${ansi.green}✓ ${key}${ansi.reset} ${ms ? `${(ms / 1000).toFixed(1)}s` : \"\"}`);\n break;\n }\n case \"workflow.node.failed\":\n console.log(`${t} ${ansi.red}✗ ${key} FAILED${ansi.reset} ${(event.payload as Record<string, unknown>)?.error ?? \"\"}`);\n break;\n case \"workflow.run.completed\":\n console.log(`${t} ${ansi.green}${ansi.bold}✓ Workflow completed!${ansi.reset}`);\n break;\n case \"workflow.run.failed\":\n console.log(`${t} ${ansi.red}${ansi.bold}✗ Workflow failed${ansi.reset} ${(event.payload as Record<string, unknown>)?.error ?? \"\"}`);\n break;\n }\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/auth.ts","../src/errors.ts","../src/http.ts","../src/resources/auth.resource.ts","../src/resources/me.resource.ts","../src/resources/organizations.resource.ts","../src/resources/teams.resource.ts","../src/types/events.ts","../src/streaming.ts","../src/resources/workflows.resource.ts","../src/resources/events.resource.ts","../src/resources/assets.resource.ts","../src/resources/galleries.resource.ts","../src/resources/api-keys.resource.ts","../src/resources/invitations.resource.ts","../src/resources/permissions.resource.ts","../src/resources/webhooks.resource.ts","../src/resources/service-accounts.resource.ts","../src/resources/oauth.resource.ts","../src/resources/admin.resource.ts","../src/resources/schedules.resource.ts","../src/resources/providers.resource.ts","../src/resources/packages.resource.ts","../src/client.ts","../src/pagination.ts","../src/verify-webhook.ts","../src/_compat.ts"],"sourcesContent":["// ── Client ───────────────────────────────────────────────────────────────\nexport { FabricClient } from \"./client.js\";\nexport type { FabricConfig } from \"./client.js\";\n\n// ── Errors ───────────────────────────────────────────────────────────────\nexport {\n FabricError,\n FabricValidationError,\n FabricAuthError,\n FabricForbiddenError,\n FabricNotFoundError,\n FabricConflictError,\n FabricRateLimitError,\n FabricServerError,\n} from \"./errors.js\";\nexport type { FabricErrorParams } from \"./errors.js\";\n\n// ── Auth strategy ────────────────────────────────────────────────────────\nexport type { AuthStrategy, AuthConfig } from \"./auth.js\";\n\n// ── HTTP transport types ────────────────────────────────────────────────\nexport type { RequestInterceptor, ResponseInterceptor } from \"./http.js\";\n\n// ── Pagination ───────────────────────────────────────────────────────────\nexport { paginate, paginateAll, paginateItems } from \"./pagination.js\";\nexport type { Pagination, PaginatedResponse, PaginationParams } from \"./pagination.js\";\n\n// ── Streaming ────────────────────────────────────────────────────────────\nexport { matchesFilter, connectReconnectingSSE } from \"./streaming.js\";\nexport type { EventStream, SSEEvent, ReconnectingSSEOptions } from \"./streaming.js\";\n\n// ── Webhook verification ────────────────────────────────────────────────\nexport { verifyWebhookSignature, constructWebhookEvent } from \"./verify-webhook.js\";\nexport type { WebhookHeaders } from \"./verify-webhook.js\";\n\n// ── Types ────────────────────────────────────────────────────────────────\nexport type {\n // Envelope\n Meta,\n RequestContext,\n ErrorBody,\n Envelope,\n PaginatedData,\n // Auth\n AuthUser,\n AuthResponse,\n MfaEnrollResponse,\n MfaChallengeResponse,\n MfaVerifyResponse,\n // Common\n Role,\n // Organizations\n Organization,\n CreateOrganizationRequest,\n UpdateOrganizationRequest,\n Membership,\n OrgUsageSummary,\n OrgBudget,\n OrgSecret,\n CreateSecretRequest,\n OrgSettings,\n UpdateOrgSettingsRequest,\n RotateWebhookSecretResponse,\n UsageDailyEntry,\n UsageRecord,\n SystemInfo,\n SystemStatus,\n // Teams\n Team,\n CreateTeamRequest,\n // Workflows\n WorkflowLanguage,\n WorkflowSource,\n RunStatus,\n RegistryEntry,\n CreateRegistryRequest,\n ComposeWorkflowRequest,\n RunProgress,\n WorkflowRun,\n SubmitRunRequest,\n NodeAttempt,\n NodeCostHint,\n HistoricalCostSummary,\n WorkflowCostEstimate,\n EstimateWorkflowRequest,\n WatchRunOptions,\n RunWatcher,\n RunArtifact,\n RecordArtifactRequest,\n // Events\n EventKind,\n DomainEvent,\n EventHandler,\n EventStreamFilter,\n WebSocketCommand,\n WebSocketAck,\n // Assets\n AssetKind,\n Asset,\n SignedUrlResponse,\n // Galleries\n Gallery,\n GalleryItem,\n CreateGalleryRequest,\n AddGalleryItemRequest,\n // API Keys\n ApiKey,\n CreateApiKeyResponse,\n CreateApiKeyRequest,\n // Service Accounts\n ServiceAccount,\n CreateServiceAccountRequest,\n // Permissions\n PermissionEffect,\n Permission,\n GrantPermissionRequest,\n AuthzCheckRequest,\n AuthzCheckResponse,\n // Webhooks\n Webhook,\n WebhookDelivery,\n WebhookResourceFilter,\n CreateWebhookRequest,\n UpdateWebhookRequest,\n // Providers\n Modality,\n Tier,\n CapabilityTag,\n ProviderCapability,\n ProviderCredentials,\n ProviderExecuteRequest,\n ProviderExecuteResponse,\n // Packages\n Package,\n // Schedules\n WorkflowSchedule,\n ScheduleRun,\n CreateScheduleRequest,\n UpdateScheduleRequest,\n // Research / Problem Intelligence\n Platform,\n SourceDocument,\n ProblemMention,\n ProblemCluster,\n SolutionMention,\n ScoringWeights,\n ProblemIntelligenceOutput,\n // Me\n MeResponse,\n MyOrgSummary,\n MyTeamSummary,\n // Invitations\n InvitationStatus,\n Invitation,\n CreateInvitationRequest,\n // OAuth\n OAuthClient,\n CreateOAuthClientRequest,\n OAuthTokenResponse,\n} from \"./types/index.js\";\n\nexport { TERMINAL_RUN_EVENTS, NODE_EVENT_KINDS } from \"./types/events.js\";\n\n// ── Resources (for advanced tree-shaking) ────────────────────────────────\nexport {\n AuthResource,\n MeResource,\n OrganizationsResource,\n TeamsResource,\n WorkflowsResource,\n WorkflowRegistryResource,\n WorkflowRunsResource,\n EventsResource,\n AssetsResource,\n GalleriesResource,\n ApiKeysResource,\n InvitationsResource,\n PermissionsResource,\n WebhooksResource,\n ServiceAccountsResource,\n OAuthResource,\n AdminResource,\n SchedulesResource,\n ProvidersResource,\n PackagesResource,\n} from \"./resources/index.js\";\nexport type { StreamEventsOptions, SubmitAndWaitOptions } from \"./resources/index.js\";\nexport type { WebSocketConnection, WebSocketOptions, StreamOptions } from \"./resources/index.js\";\nexport type { ConcurrencyLimit } from \"./resources/index.js\";\n\n// ── Compat ───────────────────────────────────────────────────────────────\nexport { logEvents } from \"./_compat.js\";\n","/**\n * Auth strategy types and header resolution.\n *\n * The SDK is stateless — it does NOT manage auth state.\n * Socialite (or any consumer) owns the session.\n */\n\n/** Static auth strategies. */\nexport type AuthStrategy =\n | { type: \"api-key\"; key: string }\n | { type: \"bearer\"; token: string }\n | { type: \"oauth\"; clientId: string; clientSecret: string };\n\n/**\n * Auth configuration for FabricClient.\n *\n * - Static `AuthStrategy` for fixed credentials\n * - `() => Promise<string>` for dynamic per-request tokens (e.g., from Next.js cookies)\n */\nexport type AuthConfig = AuthStrategy | (() => Promise<string>);\n\n/**\n * Resolve an AuthConfig into an Authorization header value.\n * Called per-request by HttpTransport.\n */\nexport async function resolveAuthHeader(\n auth: AuthConfig | undefined,\n _opts?: { baseUrl?: string },\n): Promise<string | undefined> {\n if (!auth) return undefined;\n\n // Dynamic token provider\n if (typeof auth === \"function\") {\n const token = await auth();\n return `Bearer ${token}`;\n }\n\n switch (auth.type) {\n case \"api-key\":\n return `Bearer ${auth.key}`;\n case \"bearer\":\n return `Bearer ${auth.token}`;\n case \"oauth\":\n // OAuth client_credentials flow is handled by OAuthTokenManager\n // (resolved externally before calling this function)\n return undefined;\n }\n}\n\n/**\n * Manages OAuth client_credentials token lifecycle.\n * Auto-exchanges credentials for access tokens and caches until expiry.\n */\nexport class OAuthTokenManager {\n private cachedToken?: string;\n private expiresAt = 0;\n\n constructor(\n private clientId: string,\n private clientSecret: string,\n private tokenUrl: string,\n private fetchFn: typeof globalThis.fetch = globalThis.fetch,\n ) {}\n\n async getToken(): Promise<string> {\n // Return cached token if still valid (with 30s buffer)\n if (this.cachedToken && Date.now() < this.expiresAt - 30_000) {\n return this.cachedToken;\n }\n\n const res = await this.fetchFn(this.tokenUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n grant_type: \"client_credentials\",\n client_id: this.clientId,\n client_secret: this.clientSecret,\n }),\n });\n\n if (!res.ok) {\n throw new Error(`OAuth token exchange failed: ${res.status} ${res.statusText}`);\n }\n\n const body = (await res.json()) as {\n data?: { access_token: string; expires_in: number };\n access_token?: string;\n expires_in?: number;\n };\n\n // Handle both envelope and direct response formats\n const accessToken = body.data?.access_token ?? body.access_token;\n const expiresIn = body.data?.expires_in ?? body.expires_in ?? 900;\n\n if (!accessToken) {\n throw new Error(\"OAuth token exchange returned no access_token\");\n }\n\n this.cachedToken = accessToken;\n this.expiresAt = Date.now() + expiresIn * 1000;\n return accessToken;\n }\n}\n","/**\n * Typed error classes mapping to Fabric API error responses.\n *\n * The HTTP transport parses the envelope's `error.code` and `error.message`\n * and throws the appropriate subclass, allowing consumers to catch specific\n * error types:\n *\n * ```typescript\n * try {\n * await fabric.organizations.create({ name: 'Acme' });\n * } catch (e) {\n * if (e instanceof FabricConflictError) { // slug taken }\n * if (e instanceof FabricAuthError) { // re-authenticate }\n * }\n * ```\n */\n\nexport interface FabricErrorParams {\n code: string;\n status: number;\n message: string;\n requestId?: string;\n traceId?: string;\n}\n\nexport class FabricError extends Error {\n readonly code: string;\n readonly status: number;\n readonly requestId?: string;\n readonly traceId?: string;\n\n constructor(params: FabricErrorParams) {\n super(params.message);\n this.name = \"FabricError\";\n this.code = params.code;\n this.status = params.status;\n this.requestId = params.requestId;\n this.traceId = params.traceId;\n }\n}\n\n/** 400 Bad Request / 422 Unprocessable Entity */\nexport class FabricValidationError extends FabricError {\n constructor(params: FabricErrorParams) {\n super(params);\n this.name = \"FabricValidationError\";\n }\n}\n\n/** 401 Unauthorized */\nexport class FabricAuthError extends FabricError {\n constructor(params: FabricErrorParams) {\n super(params);\n this.name = \"FabricAuthError\";\n }\n}\n\n/** 403 Forbidden */\nexport class FabricForbiddenError extends FabricError {\n constructor(params: FabricErrorParams) {\n super(params);\n this.name = \"FabricForbiddenError\";\n }\n}\n\n/** 404 Not Found */\nexport class FabricNotFoundError extends FabricError {\n constructor(params: FabricErrorParams) {\n super(params);\n this.name = \"FabricNotFoundError\";\n }\n}\n\n/** 409 Conflict */\nexport class FabricConflictError extends FabricError {\n constructor(params: FabricErrorParams) {\n super(params);\n this.name = \"FabricConflictError\";\n }\n}\n\n/** 429 Too Many Requests */\nexport class FabricRateLimitError extends FabricError {\n readonly retryAfterMs?: number;\n\n constructor(params: FabricErrorParams & { retryAfterMs?: number }) {\n super(params);\n this.name = \"FabricRateLimitError\";\n this.retryAfterMs = params.retryAfterMs;\n }\n}\n\n/** 5xx Server Error */\nexport class FabricServerError extends FabricError {\n constructor(params: FabricErrorParams) {\n super(params);\n this.name = \"FabricServerError\";\n }\n}\n\n/** Map an HTTP status code to the appropriate FabricError subclass. */\nexport function createFabricError(params: FabricErrorParams & { retryAfterMs?: number }): FabricError {\n switch (true) {\n case params.status === 401:\n return new FabricAuthError(params);\n case params.status === 403:\n return new FabricForbiddenError(params);\n case params.status === 404:\n return new FabricNotFoundError(params);\n case params.status === 409:\n return new FabricConflictError(params);\n case params.status === 429:\n return new FabricRateLimitError(params);\n case params.status >= 400 && params.status < 500:\n return new FabricValidationError(params);\n case params.status >= 500:\n return new FabricServerError(params);\n default:\n return new FabricError(params);\n }\n}\n","/**\n * Low-level HTTP transport for the Fabric API.\n *\n * Wraps `fetch` with:\n * - Base URL prefixing\n * - Auth header injection (resolved per-request)\n * - Envelope unwrapping (`data` on success, throws on `error`)\n * - Typed error mapping\n * - Retry on 429 with Retry-After\n * - Timeout via AbortSignal\n * - Idempotency key support\n */\n\nimport type { AuthConfig } from \"./auth.js\";\nimport { resolveAuthHeader, OAuthTokenManager } from \"./auth.js\";\nimport { createFabricError, FabricError } from \"./errors.js\";\nimport type { PaginatedResponse, Pagination } from \"./pagination.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Interceptor called before each request. Can modify headers or log. */\nexport type RequestInterceptor = (\n method: string,\n url: string,\n headers: Record<string, string>,\n) => void | Promise<void>;\n\n/** Interceptor called after each response. Can log or inspect. */\nexport type ResponseInterceptor = (\n method: string,\n url: string,\n status: number,\n durationMs: number,\n) => void | Promise<void>;\n\nexport interface HttpTransportConfig {\n baseUrl: string;\n auth?: AuthConfig;\n organizationId?: string;\n teamId?: string;\n timeout?: number;\n fetch?: typeof globalThis.fetch;\n retry?: { maxRetries: number; baseDelayMs: number };\n /** Log all requests and responses to console. */\n debug?: boolean;\n /** Called before each request. */\n onRequest?: RequestInterceptor;\n /** Called after each response. */\n onResponse?: ResponseInterceptor;\n}\n\nexport interface RequestOptions {\n body?: unknown;\n query?: Record<string, string | number | boolean | undefined>;\n headers?: Record<string, string>;\n idempotencyKey?: string;\n signal?: AbortSignal;\n /** Pass-through for Next.js extended fetch options (e.g. `next: { revalidate }`) */\n requestInit?: RequestInit;\n}\n\n/** Envelope shape returned by the Fabric API. */\ninterface Envelope<T = unknown> {\n meta: {\n request_id: string;\n trace_id?: string;\n status: number;\n api_version: string;\n };\n context?: {\n principal_id?: string;\n organization_id?: string;\n team_id?: string;\n };\n data?: T;\n error?: {\n code: string;\n message: string;\n };\n}\n\n/** Envelope with paginated data. */\ninterface PaginatedEnvelope<T = unknown> {\n meta: Envelope[\"meta\"];\n data?: {\n items: T[];\n pagination: Pagination;\n };\n error?: Envelope[\"error\"];\n}\n\n// ---------------------------------------------------------------------------\n// HttpTransport\n// ---------------------------------------------------------------------------\n\nexport class HttpTransport {\n private readonly baseUrl: string;\n private readonly auth?: AuthConfig;\n private readonly organizationId?: string;\n private readonly teamId?: string;\n private readonly timeoutMs: number;\n private readonly fetchFn: typeof globalThis.fetch;\n private readonly retryConfig: { maxRetries: number; baseDelayMs: number };\n private readonly debug: boolean;\n private readonly onRequest?: RequestInterceptor;\n private readonly onResponse?: ResponseInterceptor;\n private oauthManager?: OAuthTokenManager;\n\n constructor(config: HttpTransportConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n this.auth = config.auth;\n this.organizationId = config.organizationId;\n this.teamId = config.teamId;\n this.timeoutMs = config.timeout ?? 30_000;\n this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);\n this.retryConfig = config.retry ?? { maxRetries: 2, baseDelayMs: 1000 };\n this.debug = config.debug ?? false;\n this.onRequest = config.onRequest;\n this.onResponse = config.onResponse;\n\n // Set up OAuth token manager if needed\n if (config.auth && typeof config.auth !== \"function\" && config.auth.type === \"oauth\") {\n this.oauthManager = new OAuthTokenManager(\n config.auth.clientId,\n config.auth.clientSecret,\n `${this.baseUrl}/v1/oauth/token`,\n this.fetchFn,\n );\n }\n }\n\n /** Getters for context values (used by resources). */\n getOrganizationId(): string | undefined {\n return this.organizationId;\n }\n\n getTeamId(): string | undefined {\n return this.teamId;\n }\n\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n /** Make a request and unwrap the envelope, returning `data`. */\n async request<T>(method: string, path: string, opts?: RequestOptions): Promise<T> {\n const res = await this.doFetch(method, path, opts);\n const envelope = (await res.json()) as Envelope<T>;\n this.throwIfError(envelope, res);\n return envelope.data as T;\n }\n\n /** Make a request and unwrap a paginated envelope. */\n async requestPaginated<T>(method: string, path: string, opts?: RequestOptions): Promise<PaginatedResponse<T>> {\n const res = await this.doFetch(method, path, opts);\n const envelope = (await res.json()) as PaginatedEnvelope<T>;\n\n if (envelope.error) {\n throw createFabricError({\n code: envelope.error.code,\n status: envelope.meta.status,\n message: envelope.error.message,\n requestId: envelope.meta.request_id,\n traceId: envelope.meta.trace_id,\n });\n }\n\n return {\n items: envelope.data?.items ?? [],\n pagination: envelope.data?.pagination ?? { count: 0, has_more: false },\n };\n }\n\n /** Make a request and return the raw Response (for SSE, file uploads, etc). */\n async requestRaw(method: string, path: string, opts?: RequestOptions): Promise<Response> {\n return this.doFetch(method, path, opts);\n }\n\n /** Build full headers for a request (used by streaming). */\n async buildHeaders(extra?: Record<string, string>): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...extra,\n };\n const authHeader = await this.resolveAuth();\n if (authHeader) headers[\"Authorization\"] = authHeader;\n return headers;\n }\n\n // ── Internal ──────────────────────────────────────────────────────\n\n private async doFetch(method: string, path: string, opts?: RequestOptions): Promise<Response> {\n const url = this.buildUrl(path, opts?.query);\n const headers = await this.buildHeaders(opts?.headers);\n\n if (opts?.idempotencyKey) {\n headers[\"idempotency-key\"] = opts.idempotencyKey;\n }\n\n // Auto-generate X-Request-ID if not provided\n if (!headers[\"x-request-id\"] && !headers[\"X-Request-ID\"]) {\n headers[\"X-Request-ID\"] = generateRequestId();\n }\n\n // Remove Content-Type for non-body methods\n if (method === \"GET\" || method === \"DELETE\") {\n delete headers[\"Content-Type\"];\n }\n\n // Interceptor: before request\n await this.onRequest?.(method, url, headers);\n\n if (this.debug) {\n console.debug(`[fabric] ${method} ${url}`);\n }\n\n const init: RequestInit = {\n method,\n headers,\n body: opts?.body !== undefined ? JSON.stringify(opts.body) : undefined,\n signal: opts?.signal ?? AbortSignal.timeout(this.timeoutMs),\n ...opts?.requestInit,\n };\n\n const start = Date.now();\n const res = await this.fetchWithRetry(url, init);\n const durationMs = Date.now() - start;\n\n // Interceptor: after response\n await this.onResponse?.(method, url, res.status, durationMs);\n\n if (this.debug) {\n console.debug(`[fabric] ${method} ${url} → ${res.status} (${durationMs}ms)`);\n }\n\n return res;\n }\n\n private async fetchWithRetry(url: string, init: RequestInit): Promise<Response> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.retryConfig.maxRetries; attempt++) {\n try {\n const res = await this.fetchFn(url, init);\n\n if (res.status !== 429 || attempt >= this.retryConfig.maxRetries) {\n return res;\n }\n\n // 429 — wait for Retry-After\n const retryAfter = res.headers.get(\"retry-after\");\n const delayMs = retryAfter\n ? parseInt(retryAfter, 10) * 1000\n : this.retryConfig.baseDelayMs * Math.pow(2, attempt);\n await sleep(delayMs);\n } catch (err) {\n if (err instanceof DOMException && err.name === \"AbortError\") throw err;\n lastError = err instanceof Error ? err : new Error(String(err));\n if (attempt >= this.retryConfig.maxRetries) break;\n await sleep(this.retryConfig.baseDelayMs * Math.pow(2, attempt));\n }\n }\n\n throw lastError ?? new Error(\"Request failed after retries\");\n }\n\n private async resolveAuth(): Promise<string | undefined> {\n if (this.oauthManager) {\n const token = await this.oauthManager.getToken();\n return `Bearer ${token}`;\n }\n return resolveAuthHeader(this.auth);\n }\n\n private buildUrl(path: string, query?: Record<string, string | number | boolean | undefined>): string {\n let url = `${this.baseUrl}${path}`;\n const params = new URLSearchParams();\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) params.set(key, String(value));\n }\n }\n\n const qs = params.toString();\n if (qs) url += (url.includes(\"?\") ? \"&\" : \"?\") + qs;\n return url;\n }\n\n private throwIfError(envelope: Envelope, res: Response): void {\n if (envelope.error) {\n const retryAfterHeader = res.headers.get(\"retry-after\");\n const retryAfterMs = retryAfterHeader ? parseInt(retryAfterHeader, 10) * 1000 : undefined;\n\n throw createFabricError({\n code: envelope.error.code,\n status: envelope.meta.status,\n message: envelope.error.message,\n requestId: envelope.meta.request_id,\n traceId: envelope.meta.trace_id,\n retryAfterMs,\n });\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Generate a random request ID (hex). */\nfunction generateRequestId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n let hex = \"\";\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i].toString(16).padStart(2, \"0\");\n }\n return hex;\n}\n","/**\n * Auth resource — stateless.\n *\n * All methods RETURN tokens. They do NOT store them on the client.\n * Socialite is responsible for persisting tokens in cookies/session.\n */\n\nimport type { HttpTransport } from \"../http.js\";\nimport type { AuthResponse, MfaEnrollResponse, MfaChallengeResponse, MfaVerifyResponse } from \"../types/index.js\";\n\nexport class MfaResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Enroll a new MFA factor (e.g., \"totp\"). */\n async enroll(factorType: string, friendlyName?: string): Promise<MfaEnrollResponse> {\n return this.http.request(\"POST\", \"/v1/auth/mfa/enroll\", {\n body: { factor_type: factorType, friendly_name: friendlyName },\n });\n }\n\n /** Request an MFA challenge for a factor. */\n async challenge(factorId: string): Promise<MfaChallengeResponse> {\n return this.http.request(\"POST\", \"/v1/auth/mfa/challenge\", {\n body: { factor_id: factorId },\n });\n }\n\n /** Verify an MFA code. Returns new tokens on success. */\n async verify(factorId: string, challengeId: string, code: string): Promise<MfaVerifyResponse> {\n return this.http.request(\"POST\", \"/v1/auth/mfa/verify\", {\n body: { factor_id: factorId, challenge_id: challengeId, code },\n });\n }\n\n /** Remove an MFA factor. */\n async unenroll(factorId: string): Promise<void> {\n await this.http.request(\"DELETE\", \"/v1/auth/mfa/unenroll\", {\n body: { factor_id: factorId },\n });\n }\n}\n\nexport class AuthResource {\n readonly mfa: MfaResource;\n\n constructor(private readonly http: HttpTransport) {\n this.mfa = new MfaResource(http);\n }\n\n /** Sign up with email and password. Returns tokens + user. */\n async signup(email: string, password: string): Promise<AuthResponse> {\n return this.http.request(\"POST\", \"/v1/auth/signup\", {\n body: { email, password },\n });\n }\n\n /** Log in with email and password. Returns tokens + user. */\n async login(email: string, password: string): Promise<AuthResponse> {\n return this.http.request(\"POST\", \"/v1/auth/login\", {\n body: { email, password },\n });\n }\n\n /** Log out (revoke tokens). */\n async logout(): Promise<void> {\n await this.http.request(\"POST\", \"/v1/auth/logout\", { body: {} });\n }\n\n /** Refresh an access token using a refresh token. */\n async refresh(refreshToken: string): Promise<AuthResponse> {\n return this.http.request(\"POST\", \"/v1/auth/token/refresh\", {\n body: { refresh_token: refreshToken },\n });\n }\n\n /** Request a magic link email. */\n async magicLink(email: string): Promise<void> {\n await this.http.request(\"POST\", \"/v1/auth/magic-link\", {\n body: { email },\n });\n }\n\n /** Request a password reset email. */\n async forgotPassword(email: string): Promise<void> {\n await this.http.request(\"POST\", \"/v1/auth/forgot-password\", {\n body: { email },\n });\n }\n\n /** Reset password with a recovery token. */\n async resetPassword(accessToken: string, newPassword: string): Promise<void> {\n await this.http.request(\"POST\", \"/v1/auth/reset-password\", {\n body: { access_token: accessToken, new_password: newPassword },\n });\n }\n\n /** Get the URL for social login redirect (e.g., \"google\", \"github\"). */\n socialLoginUrl(provider: string): string {\n return `${this.http.getBaseUrl()}/v1/auth/social/${encodeURIComponent(provider)}`;\n }\n\n /** Verify an email address using a verification token. */\n async verify(token: string): Promise<void> {\n await this.http.request(\"GET\", \"/v1/auth/verify\", {\n query: { token },\n });\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { MeResponse, MyOrgSummary, MyTeamSummary, Permission } from \"../types/index.js\";\n\nexport class MeResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Get current principal info. */\n async get(): Promise<MeResponse> {\n return this.http.request(\"GET\", \"/v1/me\");\n }\n\n /** List organizations the current user belongs to. */\n async organizations(): Promise<MyOrgSummary[]> {\n return this.http.request(\"GET\", \"/v1/me/organizations\");\n }\n\n /** List teams the current user belongs to. */\n async teams(): Promise<MyTeamSummary[]> {\n return this.http.request(\"GET\", \"/v1/me/teams\");\n }\n\n /** List effective permissions for the current user. */\n async permissions(): Promise<Permission[]> {\n return this.http.request(\"GET\", \"/v1/me/permissions\");\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type {\n Organization,\n CreateOrganizationRequest,\n UpdateOrganizationRequest,\n Membership,\n OrgUsageSummary,\n OrgBudget,\n OrgSecret,\n CreateSecretRequest,\n OrgSettings,\n UpdateOrgSettingsRequest,\n RotateWebhookSecretResponse,\n UsageDailyEntry,\n UsageRecord,\n Team,\n Permission,\n} from \"../types/index.js\";\n\nexport class OrganizationsResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create an organization. */\n async create(opts: CreateOrganizationRequest): Promise<Organization> {\n return this.http.request(\"POST\", \"/v1/organizations\", { body: opts });\n }\n\n /** List organizations (paginated). */\n async list(params?: PaginationParams): Promise<PaginatedResponse<Organization>> {\n return this.http.requestPaginated(\"GET\", \"/v1/organizations\", {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** Get an organization by ID. */\n async get(orgId: string): Promise<Organization> {\n return this.http.request(\"GET\", `/v1/organizations/${orgId}`);\n }\n\n /** Update an organization (e.g., rename). */\n async update(orgId: string, opts: UpdateOrganizationRequest): Promise<Organization> {\n return this.http.request(\"PUT\", `/v1/organizations/${orgId}`, { body: opts });\n }\n\n /** Archive an organization (soft-delete). */\n async archive(orgId: string): Promise<Organization> {\n return this.http.request(\"POST\", `/v1/organizations/${orgId}/archive`, { body: {} });\n }\n\n /** List teams in an organization. */\n async teams(orgId: string, params?: PaginationParams): Promise<PaginatedResponse<Team>> {\n return this.http.requestPaginated(\"GET\", `/v1/organizations/${orgId}/teams`, {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** List members in an organization. */\n async members(orgId: string, params?: PaginationParams): Promise<PaginatedResponse<Membership>> {\n return this.http.requestPaginated(\"GET\", `/v1/organizations/${orgId}/members`, {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** List permissions for an organization. */\n async permissions(orgId: string): Promise<Permission[]> {\n return this.http.request(\"GET\", `/v1/organizations/${orgId}/permissions`);\n }\n\n /** Get usage summary for an organization. */\n async usage(orgId: string): Promise<OrgUsageSummary> {\n return this.http.request(\"GET\", `/v1/organizations/${orgId}/usage`);\n }\n\n /** Get audit logs for an organization. */\n async auditLogs(orgId: string, params?: PaginationParams): Promise<PaginatedResponse<Record<string, unknown>>> {\n return this.http.requestPaginated(\"GET\", `/v1/organizations/${orgId}/audit-logs`, {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** Export organization data. */\n async export(orgId: string): Promise<Record<string, unknown>> {\n return this.http.request(\"POST\", `/v1/organizations/${orgId}/export`, { body: {} });\n }\n\n /** Request organization deletion. */\n async requestDeletion(orgId: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/organizations/${orgId}/delete`, { body: {} });\n }\n\n // ── Budget ────────────────────────────────────────────────────────\n\n /** Get budget configuration. */\n async getBudget(orgId: string): Promise<OrgBudget> {\n return this.http.request(\"GET\", `/v1/organizations/${orgId}/budget`);\n }\n\n /** Set budget limit. */\n async setBudget(orgId: string, monthlyLimitUsd: number): Promise<OrgBudget> {\n return this.http.request(\"PUT\", `/v1/organizations/${orgId}/budget`, {\n body: { monthly_limit_usd: monthlyLimitUsd },\n });\n }\n\n // ── Settings ─────────────────────────────────────────────────────\n\n /** Get organization settings. */\n async getSettings(orgId: string): Promise<OrgSettings> {\n return this.http.request(\"GET\", `/v1/organizations/${orgId}/settings`);\n }\n\n /** Update organization settings. */\n async updateSettings(orgId: string, settings: UpdateOrgSettingsRequest): Promise<OrgSettings> {\n return this.http.request(\"PUT\", `/v1/organizations/${orgId}/settings`, {\n body: settings,\n });\n }\n\n /** Rotate the webhook signing secret (one-time reveal of new secret). */\n async rotateWebhookSecret(orgId: string): Promise<RotateWebhookSecretResponse> {\n return this.http.request(\"POST\", `/v1/organizations/${orgId}/settings/webhook/rotate-secret`, {\n body: {},\n });\n }\n\n // ── Usage details ───────────────────────────────────────────────\n\n /** Get daily usage rollup with optional grouping (provider, model, workflow). */\n async usageDaily(\n orgId: string,\n params?: { from?: string; to?: string; group_by?: string; limit?: number; cursor?: string },\n ): Promise<PaginatedResponse<UsageDailyEntry>> {\n return this.http.requestPaginated(\"GET\", `/v1/organizations/${orgId}/usage/daily`, {\n query: {\n from: params?.from,\n to: params?.to,\n group_by: params?.group_by,\n limit: params?.limit,\n cursor: params?.cursor,\n },\n });\n }\n\n /** Get detailed usage records (individual provider executions). */\n async usageRecords(orgId: string): Promise<UsageRecord[]> {\n return this.http.request(\"GET\", `/v1/organizations/${orgId}/usage/records`);\n }\n\n // ── Secrets ───────────────────────────────────────────────────────\n\n /** List secrets for an organization. */\n async listSecrets(orgId: string): Promise<OrgSecret[]> {\n return this.http.request(\"GET\", `/v1/organizations/${orgId}/secrets`);\n }\n\n /** Create a secret. */\n async createSecret(orgId: string, opts: CreateSecretRequest): Promise<OrgSecret> {\n return this.http.request(\"POST\", `/v1/organizations/${orgId}/secrets`, { body: opts });\n }\n\n /** Delete a secret. */\n async deleteSecret(orgId: string, name: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/organizations/${orgId}/secrets/${encodeURIComponent(name)}`);\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { Team, CreateTeamRequest } from \"../types/index.js\";\n\nexport class TeamsResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create a team within an organization. */\n async create(opts: CreateTeamRequest): Promise<Team> {\n return this.http.request(\"POST\", \"/v1/teams\", { body: opts });\n }\n\n /** Get a team by ID. */\n async get(teamId: string): Promise<Team> {\n return this.http.request(\"GET\", `/v1/teams/${teamId}`);\n }\n}\n","/** All event kinds emitted by the Fabric event bus. */\nexport type EventKind =\n // Run lifecycle\n | \"workflow.run.created\"\n | \"workflow.run.queued\"\n | \"workflow.run.promoted\"\n | \"workflow.run.started\"\n | \"workflow.run.completed\"\n | \"workflow.run.failed\"\n | \"workflow.run.cancelled\"\n | \"workflow.run.waiting\"\n | \"workflow.run.paused\"\n // Node lifecycle (emitted by workflow workers)\n | \"workflow.node.ready\"\n | \"workflow.node.claimed\"\n | \"workflow.node.started\"\n | \"workflow.node.progress\"\n | \"workflow.node.completed\"\n | \"workflow.node.failed\"\n | \"workflow.node.retried\"\n | \"workflow.node.skipped\"\n | \"workflow.node.cancelled\"\n | \"workflow.node.waiting_for_event\"\n | \"workflow.node.resumed\"\n // Job lifecycle\n | \"job.created\"\n | \"job.started\"\n | \"job.completed\"\n | \"job.failed\"\n // Schedule lifecycle\n | \"workflow.schedule.triggered\"\n | \"workflow.schedule.skipped\"\n | \"workflow.schedule.failed\"\n // Webhook delivery\n | \"webhook.delivery.exhausted\"\n // Tenancy\n | \"organization.created\"\n | \"team.created\"\n | \"membership.created\"\n | \"invitation.created\"\n | \"invitation.accepted\"\n | \"invitation.revoked\";\n\n/** Terminal event kinds that signal a workflow run is done. */\nexport const TERMINAL_RUN_EVENTS: EventKind[] = [\n \"workflow.run.completed\",\n \"workflow.run.failed\",\n \"workflow.run.cancelled\",\n];\n\n/** Node-level event kinds for filtering in watch/stream. */\nexport const NODE_EVENT_KINDS: EventKind[] = [\n \"workflow.node.ready\",\n \"workflow.node.claimed\",\n \"workflow.node.started\",\n \"workflow.node.progress\",\n \"workflow.node.completed\",\n \"workflow.node.failed\",\n \"workflow.node.retried\",\n \"workflow.node.skipped\",\n \"workflow.node.cancelled\",\n \"workflow.node.waiting_for_event\",\n \"workflow.node.resumed\",\n];\n\n/** A domain event from the Fabric event bus. */\nexport interface DomainEvent {\n id: string;\n kind: EventKind;\n organization_id?: string;\n job_id?: string;\n workflow_id?: string;\n run_id?: string;\n node_key?: string;\n payload: Record<string, unknown>;\n timestamp: string;\n}\n\n/** Event handler callback. */\nexport type EventHandler = (event: DomainEvent) => void;\n\n/** Client-side filter for SSE event streams. */\nexport interface EventStreamFilter {\n /** Only deliver events matching these kinds. */\n kinds?: EventKind[];\n /** Only deliver node events for these node keys. */\n nodeKeys?: string[];\n}\n\n// ---------------------------------------------------------------------------\n// WebSocket protocol types\n// ---------------------------------------------------------------------------\n\n/** Commands the client can send over the WebSocket. */\nexport type WebSocketCommand =\n | { subscribe_run: string }\n | { unsubscribe: true };\n\n/** Acknowledgements the server sends in response to commands. */\nexport type WebSocketAck =\n | { subscribed_to_run: string }\n | { unsubscribed: true };\n","/**\n * SSE (Server-Sent Events) parser for real-time event streaming.\n *\n * Uses `fetch` + `ReadableStream` instead of `EventSource` to support\n * custom headers (auth) and work in both Node.js 18+ and browsers/Edge Runtime.\n */\n\nimport type { EventStreamFilter, DomainEvent } from \"./types/events.js\";\n\nexport interface SSEOptions {\n /** Full URL to the SSE endpoint. */\n url: string;\n /** Headers to send (including auth). */\n headers: Record<string, string>;\n /** Resume from a specific event ID (Last-Event-ID header). */\n lastEventId?: string;\n /** AbortSignal for cancellation. */\n signal?: AbortSignal;\n /** Custom fetch implementation. */\n fetch?: typeof globalThis.fetch;\n /** Retry delay in ms from the server's `retry:` directive. */\n onRetry?: (retryMs: number) => void;\n}\n\nexport interface ReconnectingSSEOptions extends SSEOptions {\n /** Enable auto-reconnection on connection drop (default: false). */\n reconnect?: boolean;\n /** Maximum reconnection attempts before giving up (default: 10). */\n maxReconnectAttempts?: number;\n /** Base delay in ms for exponential backoff (default: 1000). */\n reconnectBaseDelayMs?: number;\n /** Client-side event filter. */\n filter?: EventStreamFilter;\n}\n\nexport interface SSEEvent {\n /** Event type from the `event:` field. */\n event?: string;\n /** Parsed JSON data from the `data:` field. */\n data: unknown;\n /** Event ID from the `id:` field. */\n id?: string;\n}\n\n/** Handle for a running SSE stream. */\nexport interface EventStream {\n /** Abort the stream. */\n abort(): void;\n /** Resolves when the stream ends (terminal event, server close, or abort). */\n readonly done: Promise<void>;\n}\n\n/**\n * Connect to an SSE endpoint and parse events.\n *\n * Returns an `EventStream` handle for cancellation and completion tracking.\n */\nexport function connectSSE<T = unknown>(\n options: SSEOptions,\n onEvent: (event: T, raw: SSEEvent) => void,\n onError?: (error: Error) => void,\n): EventStream {\n const controller = new AbortController();\n const fetchFn = options.fetch ?? globalThis.fetch;\n\n // Combine external signal with our internal controller\n const signal = options.signal\n ? combineSignals(options.signal, controller.signal)\n : controller.signal;\n\n const done = (async () => {\n const headers: Record<string, string> = {\n ...options.headers,\n Accept: \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n };\n if (options.lastEventId) {\n headers[\"Last-Event-ID\"] = options.lastEventId;\n }\n\n let res: Response;\n try {\n res = await fetchFn(options.url, { headers, signal });\n } catch (err) {\n if (!isAbortError(err)) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n return;\n }\n\n if (!res.ok) {\n onError?.(new Error(`SSE connection failed: ${res.status} ${res.statusText}`));\n return;\n }\n\n const reader = res.body?.getReader();\n if (!reader) {\n onError?.(new Error(\"SSE response has no body\"));\n return;\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let currentEvent: Partial<SSEEvent> = {};\n let dataLines: string[] = [];\n\n try {\n while (true) {\n const { done: streamDone, value } = await reader.read();\n if (streamDone) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line === \"\") {\n // Empty line = end of event\n if (dataLines.length > 0) {\n const dataStr = dataLines.join(\"\\n\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(dataStr);\n } catch {\n parsed = dataStr;\n }\n const sseEvent: SSEEvent = {\n event: currentEvent.event,\n data: parsed,\n id: currentEvent.id as string | undefined,\n };\n onEvent(parsed as T, sseEvent);\n }\n currentEvent = {};\n dataLines = [];\n } else if (line.startsWith(\"data:\")) {\n dataLines.push(line.slice(line[5] === \" \" ? 6 : 5));\n } else if (line.startsWith(\"event:\")) {\n currentEvent.event = line.slice(line[6] === \" \" ? 7 : 6);\n } else if (line.startsWith(\"id:\")) {\n currentEvent.id = line.slice(line[3] === \" \" ? 4 : 3);\n } else if (line.startsWith(\"retry:\")) {\n const ms = parseInt(line.slice(line[6] === \" \" ? 7 : 6), 10);\n if (!isNaN(ms)) options.onRetry?.(ms);\n }\n // Lines starting with \":\" are comments — ignore\n }\n }\n } catch (err) {\n if (!isAbortError(err)) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // ignore — reader may already be released\n }\n }\n })();\n\n return {\n abort() {\n controller.abort();\n },\n done,\n };\n}\n\nfunction isAbortError(err: unknown): boolean {\n return err instanceof DOMException && err.name === \"AbortError\";\n}\n\nfunction combineSignals(a: AbortSignal, b: AbortSignal): AbortSignal {\n const controller = new AbortController();\n const onAbort = () => controller.abort();\n a.addEventListener(\"abort\", onAbort, { once: true });\n b.addEventListener(\"abort\", onAbort, { once: true });\n // If either is already aborted\n if (a.aborted || b.aborted) controller.abort();\n return controller.signal;\n}\n\n// ---------------------------------------------------------------------------\n// Client-side event filtering\n// ---------------------------------------------------------------------------\n\n/** Returns true if the event passes the filter (or if no filter is set). */\nexport function matchesFilter(event: DomainEvent, filter?: EventStreamFilter): boolean {\n if (!filter) return true;\n\n if (filter.kinds && filter.kinds.length > 0) {\n if (!filter.kinds.includes(event.kind)) return false;\n }\n\n if (filter.nodeKeys && filter.nodeKeys.length > 0) {\n // Only apply nodeKeys filter to events that have a node_key\n if (event.node_key && !filter.nodeKeys.includes(event.node_key)) return false;\n }\n\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// Auto-reconnecting SSE\n// ---------------------------------------------------------------------------\n\n/**\n * Connect to an SSE endpoint with automatic reconnection and client-side filtering.\n *\n * On connection drop, reconnects with exponential backoff using the last\n * received event ID (Last-Event-ID) so the server replays missed events.\n */\nexport function connectReconnectingSSE<T extends DomainEvent = DomainEvent>(\n options: ReconnectingSSEOptions,\n onEvent: (event: T, raw: SSEEvent) => void,\n onError?: (error: Error) => void,\n): EventStream {\n const controller = new AbortController();\n const maxAttempts = options.maxReconnectAttempts ?? 10;\n const baseDelay = options.reconnectBaseDelayMs ?? 1000;\n let lastEventId = options.lastEventId;\n let serverRetryMs: number | undefined;\n\n const done = (async () => {\n let attempts = 0;\n\n while (!controller.signal.aborted) {\n let streamEndedCleanly = false;\n\n const innerStream = connectSSE<T>(\n {\n ...options,\n lastEventId,\n signal: controller.signal,\n },\n (event, raw) => {\n // Track last event ID for reconnection\n if (raw.id) lastEventId = raw.id;\n // Reset attempts on successful event receipt\n attempts = 0;\n\n // Apply client-side filter\n if (!matchesFilter(event as DomainEvent, options.filter)) return;\n\n onEvent(event, raw);\n },\n (error) => {\n // Don't report abort errors during reconnection\n if (!controller.signal.aborted) {\n onError?.(error);\n }\n },\n );\n\n // Store retry directive from server\n const origOnRetry = options.onRetry;\n options.onRetry = (ms) => {\n serverRetryMs = ms;\n origOnRetry?.(ms);\n };\n\n await innerStream.done;\n streamEndedCleanly = true;\n\n // If aborted or reconnection disabled, stop\n if (controller.signal.aborted || !options.reconnect) break;\n\n attempts++;\n if (attempts > maxAttempts) {\n onError?.(new Error(`SSE reconnection failed after ${maxAttempts} attempts`));\n break;\n }\n\n // Exponential backoff (use server retry directive if available)\n const delay = serverRetryMs ?? baseDelay * Math.pow(2, Math.min(attempts - 1, 6));\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n })();\n\n return {\n abort() {\n controller.abort();\n },\n done,\n };\n}\n","/**\n * Workflows resource — the core resource for Socialite.\n *\n * Nested sub-resources:\n * - `registry` — CRUD for workflow definitions\n * - `runs` — execution, streaming, cancellation\n * - `compose()` — chain multiple workflows\n */\n\nimport type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type {\n RegistryEntry,\n CreateRegistryRequest,\n ComposeWorkflowRequest,\n WorkflowRun,\n SubmitRunRequest,\n NodeAttempt,\n DomainEvent,\n EventHandler,\n EventStreamFilter,\n WorkflowCostEstimate,\n EstimateWorkflowRequest,\n WatchRunOptions,\n RunWatcher,\n RunArtifact,\n RecordArtifactRequest,\n SignedUrlResponse,\n} from \"../types/index.js\";\nimport { TERMINAL_RUN_EVENTS } from \"../types/events.js\";\nimport { connectSSE, connectReconnectingSSE, matchesFilter, type EventStream } from \"../streaming.js\";\n\n// ---------------------------------------------------------------------------\n// Sub-resources\n// ---------------------------------------------------------------------------\n\nexport class WorkflowRegistryResource {\n constructor(\n private readonly http: HttpTransport,\n ) {}\n\n /** Create a workflow definition in the registry. */\n async create(opts: CreateRegistryRequest): Promise<RegistryEntry> {\n return this.http.request(\"POST\", \"/v1/workflow-registry\", {\n body: {\n name: opts.name,\n language: opts.language,\n source: opts.source,\n entry_point: opts.entry_point,\n compose_from: opts.compose_from,\n config: opts.config,\n version: opts.version,\n worker_tags: opts.worker_tags,\n input_schema: opts.input_schema,\n output_schema: opts.output_schema,\n description: opts.description,\n },\n });\n }\n\n /** List workflows visible to the current org (global + org + team). */\n async list(params?: PaginationParams & { organization_id?: string; team_id?: string }): Promise<PaginatedResponse<RegistryEntry>> {\n return this.http.requestPaginated(\"GET\", \"/v1/workflow-registry\", {\n query: {\n limit: params?.limit,\n cursor: params?.cursor,\n organization_id: params?.organization_id ?? this.http.getOrganizationId(),\n team_id: params?.team_id ?? this.http.getTeamId(),\n },\n });\n }\n\n /** Get a workflow by name (resolves hierarchically: team > org > global). */\n async get(name: string, opts?: { organization_id?: string }): Promise<RegistryEntry> {\n const orgId = opts?.organization_id ?? this.http.getOrganizationId();\n return this.http.request(\"GET\", `/v1/workflow-registry/${encodeURIComponent(name)}`, {\n query: { organization_id: orgId },\n });\n }\n\n /** Delete an org/team-scoped workflow (not global). */\n async delete(name: string, opts?: { organization_id?: string }): Promise<void> {\n const orgId = opts?.organization_id ?? this.http.getOrganizationId();\n await this.http.request(\"DELETE\", `/v1/workflow-registry/${encodeURIComponent(name)}`, {\n query: { organization_id: orgId },\n });\n }\n}\n\nexport interface StreamEventsOptions {\n onEvent: EventHandler;\n onError?: (error: Error) => void;\n signal?: AbortSignal;\n lastEventId?: string;\n /** Client-side event filter. */\n filter?: EventStreamFilter;\n /** Enable auto-reconnection on connection drop. */\n reconnect?: boolean;\n /** Maximum reconnection attempts (default: 10). */\n maxReconnectAttempts?: number;\n}\n\nexport interface SubmitAndWaitOptions extends SubmitRunRequest {\n onEvent?: EventHandler;\n timeoutMs?: number;\n organization_id?: string;\n team_id?: string;\n}\n\nexport class WorkflowRunsResource {\n constructor(\n private readonly http: HttpTransport,\n ) {}\n\n /** Submit a workflow run. Returns immediately with a run ID. */\n async submit(\n workflowName: string,\n opts?: SubmitRunRequest & { organization_id?: string; team_id?: string; idempotencyKey?: string },\n ): Promise<WorkflowRun> {\n return this.http.request(\"POST\", \"/v1/workflows/run\", {\n query: {\n name: workflowName,\n organization_id: opts?.organization_id ?? this.http.getOrganizationId(),\n team_id: opts?.team_id ?? this.http.getTeamId(),\n },\n body: {\n input: opts?.input ?? {},\n metadata: opts?.metadata,\n priority: opts?.priority,\n },\n idempotencyKey: opts?.idempotencyKey,\n });\n }\n\n /** List workflow runs. */\n async list(params?: PaginationParams & { organization_id?: string; team_id?: string }): Promise<PaginatedResponse<WorkflowRun>> {\n return this.http.requestPaginated(\"GET\", \"/v1/workflows/runs\", {\n query: {\n limit: params?.limit,\n offset: params?.cursor,\n organization_id: params?.organization_id ?? this.http.getOrganizationId(),\n team_id: params?.team_id ?? this.http.getTeamId(),\n },\n });\n }\n\n /** Get a run's status and progress. */\n async get(runId: string): Promise<WorkflowRun> {\n return this.http.request(\"GET\", `/v1/workflows/runs/${runId}`);\n }\n\n /** Cancel a running workflow. */\n async cancel(runId: string, reason?: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/workflows/runs/${runId}/cancel`, {\n body: { reason },\n });\n }\n\n /** Pause a running workflow. */\n async pause(runId: string, reason?: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/workflows/runs/${runId}/pause`, {\n body: { reason },\n });\n }\n\n /** Resume a paused workflow. */\n async resume(runId: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/workflows/runs/${runId}/resume`, { body: {} });\n }\n\n /** Recover a stalled workflow from its last Sayiir checkpoint. */\n async recover(runId: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/workflows/runs/${runId}/recover`, { body: {} });\n }\n\n /** Send an external signal to a waiting workflow (e.g. HITL approval). */\n async signal(runId: string, signalName: string, payload: Record<string, unknown> = {}): Promise<void> {\n await this.http.request(\"POST\", `/v1/workflows/runs/${runId}/signal`, {\n body: { signal_name: signalName, payload },\n });\n }\n\n /** Approve or reject a waiting workflow (convenience wrapper over signal). */\n async approve(runId: string, opts: { approved: boolean; reason?: string; data?: Record<string, unknown> }): Promise<void> {\n await this.http.request(\"POST\", `/v1/workflows/runs/${runId}/approve`, {\n body: opts,\n });\n }\n\n /** List workflow runs currently waiting for a signal (pending approvals). */\n async listWaiting(params?: { organization_id?: string; team_id?: string }): Promise<WorkflowRun[]> {\n return this.http.request(\"GET\", \"/v1/workflows/runs/waiting\", {\n query: {\n organization_id: params?.organization_id ?? this.http.getOrganizationId(),\n team_id: params?.team_id ?? this.http.getTeamId(),\n },\n });\n }\n\n /**\n * Stream SSE events for a workflow run.\n *\n * - Replays existing events, then streams live\n * - Auto-reconnects via Last-Event-ID (when `reconnect: true`)\n * - Client-side filtering by event kind and node key\n * - Auto-closes on terminal events (completed/failed/cancelled)\n *\n * Returns an EventStream handle for cancellation.\n */\n streamEvents(runId: string, opts: StreamEventsOptions): EventStream {\n const url = `${this.http.getBaseUrl()}/v1/workflow-runs/${runId}/events`;\n const sseOpts = {\n url,\n headers: {},\n lastEventId: opts.lastEventId,\n signal: opts.signal,\n filter: opts.filter,\n reconnect: opts.reconnect,\n maxReconnectAttempts: opts.maxReconnectAttempts,\n fetch: async (input: RequestInfo | URL, init?: RequestInit) => {\n const headers = await this.http.buildHeaders({\n ...(init?.headers as Record<string, string>),\n });\n return globalThis.fetch(input, { ...init, headers });\n },\n };\n\n if (opts.reconnect) {\n return connectReconnectingSSE<DomainEvent>(\n sseOpts,\n (event) => opts.onEvent(event),\n opts.onError,\n );\n }\n\n return connectSSE<DomainEvent>(\n sseOpts,\n (event) => {\n if (matchesFilter(event, opts.filter)) opts.onEvent(event);\n },\n opts.onError,\n );\n }\n\n /**\n * Submit a workflow and wait for it to complete.\n *\n * Streams events via SSE while waiting. Returns the final WorkflowRun\n * with status and output.\n */\n async submitAndWait(workflowName: string, opts: SubmitAndWaitOptions): Promise<WorkflowRun> {\n const run = await this.submit(workflowName, {\n input: opts.input,\n metadata: opts.metadata,\n priority: opts.priority,\n organization_id: opts.organization_id,\n team_id: opts.team_id,\n });\n\n const timeoutMs = opts.timeoutMs ?? 900_000; // 15 min default\n\n return new Promise<WorkflowRun>((resolve, reject) => {\n const timeout = setTimeout(() => {\n stream.abort();\n reject(new Error(`Workflow run ${run.id} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n const stream = this.streamEvents(run.id, {\n onEvent: (event) => {\n opts.onEvent?.(event);\n if (TERMINAL_RUN_EVENTS.includes(event.kind)) {\n clearTimeout(timeout);\n // Fetch the final run state\n this.get(run.id).then(resolve).catch(reject);\n }\n },\n onError: (error) => {\n clearTimeout(timeout);\n reject(error);\n },\n });\n\n // Also handle stream ending without terminal event (e.g., server disconnect)\n stream.done.then(() => {\n clearTimeout(timeout);\n // Fetch final state in case we missed the terminal event\n this.get(run.id).then(resolve).catch(reject);\n });\n });\n }\n\n /** Get node execution attempts (logs) for a specific node. */\n async getNodeAttempts(runId: string, nodeKey: string): Promise<NodeAttempt[]> {\n return this.http.request(\n \"GET\",\n `/v1/workflows/runs/${runId}/nodes/${encodeURIComponent(nodeKey)}/attempts`,\n );\n }\n\n /** List artifacts produced by a workflow run. */\n async artifacts(runId: string): Promise<RunArtifact[]> {\n return this.http.request(\"GET\", `/v1/workflows/runs/${runId}/artifacts`);\n }\n\n /**\n * List artifacts with signed download URLs for each asset.\n *\n * Fetches artifacts, then generates a signed URL for each one that has\n * an `asset_id`. This is the recommended way for consumers to access\n * output files (videos, images, audio, text) from completed workflows.\n *\n * @example\n * ```ts\n * const artifacts = await fabric.workflows.runs.artifactsWithUrls(runId);\n * for (const a of artifacts) {\n * console.log(a.filename, a.download_url); // signed URL ready for download\n * }\n * ```\n */\n async artifactsWithUrls(runId: string, expirySeconds?: number): Promise<RunArtifact[]> {\n const artifacts = await this.artifacts(runId);\n\n // Generate signed URLs for artifacts that have an asset_id\n const withUrls = await Promise.all(\n artifacts.map(async (artifact) => {\n if (!artifact.asset_id) return artifact;\n try {\n const signed: SignedUrlResponse = await this.http.request(\n \"POST\",\n `/v1/asset-signed-urls/${artifact.asset_id}`,\n { body: { expiry_seconds: expirySeconds } },\n );\n return { ...artifact, download_url: signed.url };\n } catch {\n // If signing fails (e.g., asset deleted), return artifact without URL\n return artifact;\n }\n }),\n );\n return withUrls;\n }\n\n /** Record an artifact produced by a workflow run (called by workers). */\n async recordArtifact(runId: string, artifact: RecordArtifactRequest): Promise<RunArtifact> {\n return this.http.request(\"POST\", `/v1/workflows/runs/${runId}/artifacts`, {\n body: artifact,\n });\n }\n\n /**\n * Watch a workflow run step-by-step with typed callbacks.\n *\n * High-level convenience that composes SSE streaming, client-side\n * filtering, auto-reconnection, and typed event dispatch.\n *\n * @example\n * ```ts\n * const watcher = fabric.workflows.runs.watch(runId, {\n * nodeKeys: [\"transcribe\", \"render\"],\n * onNodeStarted: (key) => console.log(`${key} started`),\n * onNodeProgress: (key, p) => console.log(`${key}: ${p.percentage}%`),\n * onNodeCompleted: (key) => console.log(`${key} done`),\n * onNodeFailed: (key, p) => console.error(`${key} failed:`, p),\n * onRunCompleted: () => console.log(\"Workflow finished!\"),\n * onRunFailed: (p) => console.error(\"Workflow failed:\", p),\n * });\n *\n * // Stop watching early\n * watcher.abort();\n *\n * // Or wait until completion\n * await watcher.done;\n * ```\n */\n watch(runId: string, opts: WatchRunOptions = {}): RunWatcher {\n const filter: EventStreamFilter = {};\n\n // Build filter: run-level events + node events (optionally scoped)\n filter.kinds = [\n // Always include run lifecycle\n \"workflow.run.completed\",\n \"workflow.run.failed\",\n \"workflow.run.cancelled\",\n // Node events\n \"workflow.node.started\",\n \"workflow.node.progress\",\n \"workflow.node.completed\",\n \"workflow.node.failed\",\n \"workflow.node.retried\",\n \"workflow.node.skipped\",\n \"workflow.node.waiting_for_event\",\n \"workflow.node.resumed\",\n ];\n\n if (opts.nodeKeys && opts.nodeKeys.length > 0) {\n filter.nodeKeys = opts.nodeKeys;\n }\n\n const stream = this.streamEvents(runId, {\n lastEventId: opts.lastEventId,\n signal: opts.signal,\n reconnect: opts.reconnect ?? true,\n filter,\n onEvent: (event) => {\n // Forward raw event if requested\n opts.onEvent?.(event);\n\n const nodeKey = event.node_key ?? \"unknown\";\n const payload = event.payload;\n\n // Dispatch to typed callbacks\n switch (event.kind) {\n case \"workflow.node.started\":\n opts.onNodeStarted?.(nodeKey, payload);\n break;\n case \"workflow.node.progress\":\n opts.onNodeProgress?.(nodeKey, payload);\n break;\n case \"workflow.node.completed\":\n opts.onNodeCompleted?.(nodeKey, payload);\n break;\n case \"workflow.node.failed\":\n opts.onNodeFailed?.(nodeKey, payload);\n break;\n case \"workflow.run.completed\":\n opts.onRunCompleted?.(payload);\n stream.abort();\n break;\n case \"workflow.run.failed\":\n opts.onRunFailed?.(payload);\n stream.abort();\n break;\n case \"workflow.run.cancelled\":\n opts.onRunCancelled?.(payload);\n stream.abort();\n break;\n }\n },\n onError: opts.onError,\n });\n\n return stream;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main resource\n// ---------------------------------------------------------------------------\n\nexport class WorkflowsResource {\n readonly registry: WorkflowRegistryResource;\n readonly runs: WorkflowRunsResource;\n\n constructor(private readonly http: HttpTransport) {\n this.registry = new WorkflowRegistryResource(http);\n this.runs = new WorkflowRunsResource(http);\n }\n\n /** Compose multiple workflows into a pipeline. */\n async compose(opts: ComposeWorkflowRequest): Promise<RegistryEntry> {\n return this.http.request(\"POST\", \"/v1/workflows/compose\", {\n body: {\n name: opts.name,\n steps: opts.steps,\n description: opts.description,\n },\n });\n }\n\n /** Estimate cost of a workflow before running it. */\n async estimate(\n workflowName: string,\n opts?: EstimateWorkflowRequest & { organization_id?: string; team_id?: string },\n ): Promise<WorkflowCostEstimate> {\n return this.http.request(\"POST\", \"/v1/workflows/estimate\", {\n query: {\n name: workflowName,\n organization_id: opts?.organization_id ?? this.http.getOrganizationId(),\n team_id: opts?.team_id ?? this.http.getTeamId(),\n },\n body: {\n input: opts?.input,\n cost_profile: opts?.cost_profile,\n },\n });\n }\n}\n","/**\n * Events resource — real-time event streaming.\n */\n\nimport type { HttpTransport } from \"../http.js\";\nimport type {\n DomainEvent,\n EventHandler,\n EventStreamFilter,\n WebSocketCommand,\n WebSocketAck,\n} from \"../types/index.js\";\nimport { connectSSE, connectReconnectingSSE, matchesFilter, type EventStream } from \"../streaming.js\";\n\nexport interface WebSocketConnection {\n /** Subscribe to events for a specific run. */\n subscribeToRun(runId: string): void;\n /** Unsubscribe from run-specific filtering. */\n unsubscribe(): void;\n /** Close the WebSocket connection. */\n close(): void;\n}\n\nexport interface WebSocketOptions {\n onEvent: EventHandler;\n onError?: (error: Event) => void;\n onClose?: () => void;\n /** Client-side event filter. */\n filter?: EventStreamFilter;\n /** Callback for server acknowledgements. */\n onAck?: (ack: WebSocketAck) => void;\n}\n\nexport interface StreamOptions {\n onEvent: EventHandler;\n onError?: (error: Error) => void;\n signal?: AbortSignal;\n lastEventId?: string;\n /** Client-side event filter. */\n filter?: EventStreamFilter;\n /** Enable auto-reconnection on connection drop (default: false). */\n reconnect?: boolean;\n /** Maximum reconnection attempts (default: 10). */\n maxReconnectAttempts?: number;\n}\n\nexport class EventsResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Build fetch wrapper that injects auth headers. */\n private authFetch(): (input: RequestInfo | URL, init?: RequestInit) => Promise<Response> {\n return async (input, init) => {\n const headers = await this.http.buildHeaders({\n ...(init?.headers as Record<string, string>),\n });\n return globalThis.fetch(input, { ...init, headers });\n };\n }\n\n /**\n * Stream all domain events via SSE.\n *\n * This is a long-lived connection — call `stream.abort()` to disconnect.\n */\n stream(opts: StreamOptions): EventStream {\n const url = `${this.http.getBaseUrl()}/v1/events/stream`;\n const sseOpts = {\n url,\n headers: {},\n signal: opts.signal,\n lastEventId: opts.lastEventId,\n fetch: this.authFetch(),\n filter: opts.filter,\n reconnect: opts.reconnect,\n maxReconnectAttempts: opts.maxReconnectAttempts,\n };\n\n if (opts.reconnect) {\n return connectReconnectingSSE<DomainEvent>(\n sseOpts,\n (event) => opts.onEvent(event),\n opts.onError,\n );\n }\n\n // Without reconnection, apply filter manually\n return connectSSE<DomainEvent>(\n sseOpts,\n (event) => {\n if (matchesFilter(event, opts.filter)) opts.onEvent(event);\n },\n opts.onError,\n );\n }\n\n /**\n * Stream events for a specific workflow run via SSE.\n *\n * Supports client-side filtering by event kind and node key, plus\n * auto-reconnection with Last-Event-ID replay.\n */\n streamRun(runId: string, opts: StreamOptions): EventStream {\n const url = `${this.http.getBaseUrl()}/v1/workflow-runs/${runId}/events`;\n const sseOpts = {\n url,\n headers: {},\n lastEventId: opts.lastEventId,\n signal: opts.signal,\n fetch: this.authFetch(),\n filter: opts.filter,\n reconnect: opts.reconnect,\n maxReconnectAttempts: opts.maxReconnectAttempts,\n };\n\n if (opts.reconnect) {\n return connectReconnectingSSE<DomainEvent>(\n sseOpts,\n (event) => opts.onEvent(event),\n opts.onError,\n );\n }\n\n return connectSSE<DomainEvent>(\n sseOpts,\n (event) => {\n if (matchesFilter(event, opts.filter)) opts.onEvent(event);\n },\n opts.onError,\n );\n }\n\n /**\n * Stream events for a specific job via SSE.\n *\n * A job is a single-node execution. Use this to watch one node\n * without receiving events from the rest of the workflow.\n */\n streamJob(jobId: string, opts: StreamOptions): EventStream {\n const url = `${this.http.getBaseUrl()}/v1/jobs/${jobId}/events`;\n const sseOpts = {\n url,\n headers: {},\n lastEventId: opts.lastEventId,\n signal: opts.signal,\n fetch: this.authFetch(),\n filter: opts.filter,\n reconnect: opts.reconnect,\n maxReconnectAttempts: opts.maxReconnectAttempts,\n };\n\n if (opts.reconnect) {\n return connectReconnectingSSE<DomainEvent>(\n sseOpts,\n (event) => opts.onEvent(event),\n opts.onError,\n );\n }\n\n return connectSSE<DomainEvent>(\n sseOpts,\n (event) => {\n if (matchesFilter(event, opts.filter)) opts.onEvent(event);\n },\n opts.onError,\n );\n }\n\n /**\n * Connect via WebSocket for bidirectional event streaming.\n *\n * Supports dynamic run subscription via `subscribeToRun()` / `unsubscribe()`.\n * Server acknowledgements are typed and delivered via `onAck`.\n * Only available in environments with WebSocket support (browser, Node.js 21+).\n */\n connectWebSocket(opts: WebSocketOptions): WebSocketConnection {\n const baseUrl = this.http.getBaseUrl().replace(/^http/, \"ws\");\n const url = `${baseUrl}/v1/events/ws`;\n\n const ws = new WebSocket(url);\n\n ws.onmessage = (msg) => {\n try {\n const data = JSON.parse(msg.data as string);\n\n // Check if this is an ack message\n if (\"subscribed_to_run\" in data || \"unsubscribed\" in data) {\n opts.onAck?.(data as WebSocketAck);\n return;\n }\n\n // Otherwise it's a domain event\n const event = data as DomainEvent;\n if (matchesFilter(event, opts.filter)) {\n opts.onEvent(event);\n }\n } catch {\n // Ignore non-JSON messages\n }\n };\n\n ws.onerror = (err) => opts.onError?.(err);\n ws.onclose = () => opts.onClose?.();\n\n return {\n subscribeToRun(runId: string) {\n const cmd: WebSocketCommand = { subscribe_run: runId };\n ws.send(JSON.stringify(cmd));\n },\n unsubscribe() {\n const cmd: WebSocketCommand = { unsubscribe: true };\n ws.send(JSON.stringify(cmd));\n },\n close() {\n ws.close();\n },\n };\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type { Asset, SignedUrlResponse } from \"../types/index.js\";\n\nexport class AssetsResource {\n constructor(private readonly http: HttpTransport) {}\n\n /**\n * Upload an asset (max 100 MB).\n *\n * @param data - File data as Blob, ArrayBuffer, or ReadableStream\n * @param opts - Content type and optional filename\n */\n async upload(\n data: Blob | ArrayBuffer | ReadableStream<Uint8Array>,\n opts?: { contentType?: string; filename?: string; organization_id?: string },\n ): Promise<Asset> {\n const headers = await this.http.buildHeaders({\n \"Content-Type\": opts?.contentType ?? \"application/octet-stream\",\n });\n\n if (opts?.filename) {\n headers[\"X-Filename\"] = opts.filename;\n }\n\n const orgId = opts?.organization_id ?? this.http.getOrganizationId();\n const query = orgId ? `?organization_id=${orgId}` : \"\";\n\n const res = await globalThis.fetch(`${this.http.getBaseUrl()}/v1/assets${query}`, {\n method: \"POST\",\n headers,\n body: data,\n });\n\n const json = await res.json();\n if (json.error) {\n throw new Error(`${json.error.code}: ${json.error.message}`);\n }\n return json.data as Asset;\n }\n\n /** List assets for the current organization. */\n async list(params?: PaginationParams & { organization_id?: string }): Promise<PaginatedResponse<Asset>> {\n return this.http.requestPaginated(\"GET\", \"/v1/assets\", {\n query: {\n limit: params?.limit,\n cursor: params?.cursor,\n organization_id: params?.organization_id ?? this.http.getOrganizationId(),\n },\n });\n }\n\n /** Generate a signed download URL for an asset. */\n async signedUrl(assetId: string, expirySeconds?: number): Promise<SignedUrlResponse> {\n return this.http.request(\"POST\", `/v1/asset-signed-urls/${assetId}`, {\n body: { expiry_seconds: expirySeconds },\n });\n }\n\n /** Download an asset by path. Returns the raw Response for streaming. */\n async download(path: string): Promise<Response> {\n return this.http.requestRaw(\"GET\", `/v1/assets/${path}`);\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type { Gallery, GalleryItem, CreateGalleryRequest, AddGalleryItemRequest } from \"../types/index.js\";\n\nexport class GalleriesResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create a gallery. */\n async create(opts: CreateGalleryRequest): Promise<Gallery> {\n return this.http.request(\"POST\", \"/v1/galleries\", { body: opts });\n }\n\n /** List galleries. */\n async list(params?: PaginationParams): Promise<PaginatedResponse<Gallery>> {\n return this.http.requestPaginated(\"GET\", \"/v1/galleries\", {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** Get a gallery by ID. */\n async get(galleryId: string): Promise<Gallery> {\n return this.http.request(\"GET\", `/v1/galleries/${galleryId}`);\n }\n\n /** Delete a gallery. */\n async delete(galleryId: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/galleries/${galleryId}`);\n }\n\n /** Add an item to a gallery. */\n async addItem(galleryId: string, opts: AddGalleryItemRequest): Promise<GalleryItem> {\n return this.http.request(\"POST\", `/v1/galleries/${galleryId}/items`, { body: opts });\n }\n\n /** List items in a gallery. */\n async listItems(galleryId: string, params?: PaginationParams): Promise<PaginatedResponse<GalleryItem>> {\n return this.http.requestPaginated(\"GET\", `/v1/galleries/${galleryId}/items`, {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** Remove an item from a gallery. */\n async removeItem(itemId: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/gallery-items/${itemId}`);\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type { ApiKey, CreateApiKeyResponse, CreateApiKeyRequest } from \"../types/index.js\";\n\nexport class ApiKeysResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create an API key. Returns the raw secret (only shown once). */\n async create(opts: CreateApiKeyRequest): Promise<CreateApiKeyResponse> {\n return this.http.request(\"POST\", \"/v1/api-keys\", { body: opts });\n }\n\n /** List API keys. */\n async list(params?: PaginationParams): Promise<PaginatedResponse<ApiKey>> {\n return this.http.requestPaginated(\"GET\", \"/v1/api-keys\", {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** Get an API key by ID. */\n async get(keyId: string): Promise<ApiKey> {\n return this.http.request(\"GET\", `/v1/api-keys/${keyId}`);\n }\n\n /** Delete an API key. */\n async delete(keyId: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/api-keys/${keyId}`);\n }\n\n /** Disable an API key. */\n async disable(keyId: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/api-keys/${keyId}/disable`, { body: {} });\n }\n\n /** Rotate an API key (new secret issued). */\n async rotate(keyId: string): Promise<CreateApiKeyResponse> {\n return this.http.request(\"POST\", `/v1/api-keys/${keyId}/rotate`, { body: {} });\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { Invitation, CreateInvitationRequest } from \"../types/index.js\";\n\nexport class InvitationsResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create an invitation. */\n async create(opts: CreateInvitationRequest): Promise<Invitation> {\n return this.http.request(\"POST\", \"/v1/invitations\", { body: opts });\n }\n\n /** Accept an invitation. */\n async accept(invitationId: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/invitations/${invitationId}/accept`, { body: {} });\n }\n\n /** Revoke/cancel an invitation. */\n async revoke(invitationId: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/invitations/${invitationId}/revoke`, { body: {} });\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type { Permission, GrantPermissionRequest, AuthzCheckRequest, AuthzCheckResponse } from \"../types/index.js\";\n\nexport class PermissionsResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Check a single permission. */\n async check(opts: AuthzCheckRequest): Promise<AuthzCheckResponse> {\n return this.http.request(\"POST\", \"/v1/authz/check\", { body: opts });\n }\n\n /** Check multiple permissions in batch. */\n async checkBatch(checks: AuthzCheckRequest[]): Promise<AuthzCheckResponse[]> {\n return this.http.request(\"POST\", \"/v1/authz/check-batch\", {\n body: { checks },\n });\n }\n\n /** Grant a permission (ACL entry). */\n async grant(opts: GrantPermissionRequest): Promise<Permission> {\n return this.http.request(\"POST\", \"/v1/permissions\", { body: opts });\n }\n\n /** List permissions. */\n async list(params?: PaginationParams & { resource_type?: string; resource_id?: string }): Promise<PaginatedResponse<Permission>> {\n return this.http.requestPaginated(\"GET\", \"/v1/permissions\", {\n query: {\n limit: params?.limit,\n cursor: params?.cursor,\n resource_type: params?.resource_type,\n resource_id: params?.resource_id,\n },\n });\n }\n\n /** Revoke a permission. */\n async revoke(permissionId: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/permissions/${permissionId}`);\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type { Webhook, WebhookDelivery, CreateWebhookRequest, UpdateWebhookRequest } from \"../types/index.js\";\n\nexport class WebhooksResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create a webhook for an organization. */\n async create(orgId: string, opts: CreateWebhookRequest): Promise<Webhook> {\n return this.http.request(\"POST\", `/v1/organizations/${orgId}/webhooks`, { body: opts });\n }\n\n /** List webhooks for an organization. */\n async list(orgId: string, params?: PaginationParams): Promise<PaginatedResponse<Webhook>> {\n return this.http.requestPaginated(\"GET\", `/v1/organizations/${orgId}/webhooks`, {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** Get a webhook by ID. */\n async get(webhookId: string): Promise<Webhook> {\n return this.http.request(\"GET\", `/v1/webhooks/${webhookId}`);\n }\n\n /** Update a webhook. */\n async update(webhookId: string, opts: UpdateWebhookRequest): Promise<Webhook> {\n return this.http.request(\"PATCH\", `/v1/webhooks/${webhookId}`, { body: opts });\n }\n\n /** Delete a webhook. */\n async delete(webhookId: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/webhooks/${webhookId}`);\n }\n\n /** List delivery attempts for a webhook. */\n async deliveries(webhookId: string, params?: PaginationParams): Promise<PaginatedResponse<WebhookDelivery>> {\n return this.http.requestPaginated(\"GET\", `/v1/webhooks/${webhookId}/deliveries`, {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type { ServiceAccount, CreateServiceAccountRequest, ApiKey, CreateApiKeyResponse } from \"../types/index.js\";\n\nexport class ServiceAccountsResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create a service account. */\n async create(opts: CreateServiceAccountRequest): Promise<ServiceAccount> {\n return this.http.request(\"POST\", \"/v1/service-accounts\", { body: opts });\n }\n\n /** List service accounts. */\n async list(params?: PaginationParams): Promise<PaginatedResponse<ServiceAccount>> {\n return this.http.requestPaginated(\"GET\", \"/v1/service-accounts\", {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n\n /** Get a service account by ID. */\n async get(id: string): Promise<ServiceAccount> {\n return this.http.request(\"GET\", `/v1/service-accounts/${id}`);\n }\n\n /** Disable a service account. */\n async disable(id: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/service-accounts/${id}/disable`, { body: {} });\n }\n\n /** Enable a service account. */\n async enable(id: string): Promise<void> {\n await this.http.request(\"POST\", `/v1/service-accounts/${id}/enable`, { body: {} });\n }\n\n /** Create an API key for a service account. */\n async createApiKey(id: string): Promise<CreateApiKeyResponse> {\n return this.http.request(\"POST\", `/v1/service-accounts/${id}/api-keys`, { body: {} });\n }\n\n /** List API keys for a service account. */\n async listApiKeys(id: string): Promise<ApiKey[]> {\n return this.http.request(\"GET\", `/v1/service-accounts/${id}/api-keys`);\n }\n\n /** Revoke an API key for a service account. */\n async revokeApiKey(id: string, keyId: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/service-accounts/${id}/api-keys/${keyId}`);\n }\n\n /** Rotate an API key for a service account. */\n async rotateApiKey(id: string, keyId: string): Promise<CreateApiKeyResponse> {\n return this.http.request(\"POST\", `/v1/service-accounts/${id}/api-keys/${keyId}/rotate`, { body: {} });\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { OAuthClient, CreateOAuthClientRequest, OAuthTokenResponse } from \"../types/index.js\";\n\nexport class OAuthResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create an OAuth client for an organization. */\n async createClient(opts: CreateOAuthClientRequest): Promise<OAuthClient> {\n return this.http.request(\"POST\", \"/v1/oauth/clients\", { body: opts });\n }\n\n /** List OAuth clients. */\n async listClients(): Promise<OAuthClient[]> {\n return this.http.request(\"GET\", \"/v1/oauth/clients\");\n }\n\n /** Delete an OAuth client. */\n async deleteClient(clientId: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/oauth/clients/${clientId}`);\n }\n\n /** Exchange client credentials for an access token. */\n async token(clientId: string, clientSecret: string): Promise<OAuthTokenResponse> {\n return this.http.request(\"POST\", \"/v1/oauth/token\", {\n body: {\n grant_type: \"client_credentials\",\n client_id: clientId,\n client_secret: clientSecret,\n },\n });\n }\n\n /** Refresh an access token. */\n async refresh(refreshToken: string): Promise<OAuthTokenResponse> {\n return this.http.request(\"POST\", \"/v1/oauth/token\", {\n body: {\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n },\n });\n }\n\n /** Revoke an OAuth token. */\n async revoke(token: string): Promise<void> {\n await this.http.request(\"POST\", \"/v1/oauth/revoke\", {\n body: { token },\n });\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { PaginationParams, PaginatedResponse } from \"../pagination.js\";\nimport type { SystemInfo, SystemStatus } from \"../types/index.js\";\n\nexport interface ConcurrencyLimit {\n id: string;\n scope: string;\n max_concurrent_runs: number;\n created_at: string;\n updated_at: string;\n}\n\nexport class AdminResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Bootstrap the system (dev mode: creates org + admin). */\n async bootstrap(): Promise<Record<string, unknown>> {\n return this.http.request(\"POST\", \"/v1/admin/bootstrap\", { body: {} });\n }\n\n /** List concurrency limits. */\n async listConcurrencyLimits(): Promise<ConcurrencyLimit[]> {\n return this.http.request(\"GET\", \"/v1/admin/concurrency-limits\");\n }\n\n /** Set a concurrency limit for a scope (e.g., \"org:<uuid>\"). */\n async setConcurrencyLimit(scope: string, maxConcurrentRuns: number): Promise<ConcurrencyLimit> {\n return this.http.request(\"PUT\", \"/v1/admin/concurrency-limits\", {\n body: { scope, max_concurrent_runs: maxConcurrentRuns },\n });\n }\n\n /** Get system information (version, features, uptime). */\n async systemInfo(): Promise<SystemInfo> {\n return this.http.request(\"GET\", \"/v1/system/info\");\n }\n\n /** Get detailed system status (database, event bus health). */\n async systemStatus(): Promise<SystemStatus> {\n return this.http.request(\"GET\", \"/v1/system/status\");\n }\n\n /** List audit logs (standalone, not org-scoped). */\n async auditLogs(params?: PaginationParams): Promise<PaginatedResponse<Record<string, unknown>>> {\n return this.http.requestPaginated(\"GET\", \"/v1/audit-logs\", {\n query: { limit: params?.limit, cursor: params?.cursor },\n });\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { WorkflowSchedule, ScheduleRun, CreateScheduleRequest, UpdateScheduleRequest } from \"../types/schedules.js\";\n\nexport class SchedulesResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** Create a schedule for a workflow definition. */\n async create(workflowDefId: string, opts: CreateScheduleRequest): Promise<WorkflowSchedule> {\n return this.http.request(\"POST\", `/v1/workflow-definitions/${workflowDefId}/schedules`, { body: opts });\n }\n\n /** List schedules for a workflow definition. */\n async list(workflowDefId: string): Promise<WorkflowSchedule[]> {\n return this.http.request(\"GET\", `/v1/workflow-definitions/${workflowDefId}/schedules`);\n }\n\n /** Get a schedule by ID. */\n async get(scheduleId: string): Promise<WorkflowSchedule> {\n return this.http.request(\"GET\", `/v1/schedules/${scheduleId}`);\n }\n\n /** Update a schedule. */\n async update(scheduleId: string, opts: UpdateScheduleRequest): Promise<WorkflowSchedule> {\n return this.http.request(\"PATCH\", `/v1/schedules/${scheduleId}`, { body: opts });\n }\n\n /** Delete a schedule. */\n async delete(scheduleId: string): Promise<void> {\n await this.http.request(\"DELETE\", `/v1/schedules/${scheduleId}`);\n }\n\n /** Manually trigger a scheduled workflow run. */\n async trigger(scheduleId: string): Promise<{ workflow_run_id: string; schedule_id: string; trigger_type: string }> {\n return this.http.request(\"POST\", `/v1/schedules/${scheduleId}/trigger`);\n }\n\n /** List run history for a schedule. */\n async history(scheduleId: string): Promise<ScheduleRun[]> {\n return this.http.request(\"GET\", `/v1/schedules/${scheduleId}/history`);\n }\n}\n","/**\n * Providers resource — AI provider execution (feature-gated).\n *\n * Exposes modality-based routing to AI providers (text, image, audio, video, etc.)\n * with BYOK support via per-request credentials.\n */\n\nimport type { HttpTransport } from \"../http.js\";\nimport type {\n ProviderCapability,\n ProviderExecuteRequest,\n ProviderExecuteResponse,\n} from \"../types/index.js\";\nimport type { DomainEvent } from \"../types/index.js\";\nimport { connectSSE, type EventStream } from \"../streaming.js\";\n\nexport class ProvidersResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** List all available provider capabilities. */\n async list(): Promise<ProviderCapability[]> {\n return this.http.request(\"GET\", \"/v1/providers\");\n }\n\n /** Execute a provider (request/response). */\n async execute(request: ProviderExecuteRequest): Promise<ProviderExecuteResponse> {\n return this.http.request(\"POST\", \"/v1/providers/execute\", {\n body: request,\n });\n }\n\n /**\n * Execute a provider with streaming (SSE).\n *\n * Streams token-level chunks during LLM inference.\n * Events: `chunk` (delta), `complete` (final response + usage), `error`.\n */\n executeStream(\n request: ProviderExecuteRequest,\n opts: {\n onChunk: (data: Record<string, unknown>) => void;\n onComplete?: (data: ProviderExecuteResponse) => void;\n onError?: (error: Error) => void;\n signal?: AbortSignal;\n },\n ): EventStream {\n const url = `${this.http.getBaseUrl()}/v1/providers/execute/stream`;\n\n return connectSSE(\n {\n url,\n headers: {},\n signal: opts.signal,\n fetch: async (input, init) => {\n const headers = await this.http.buildHeaders({\n ...(init?.headers as Record<string, string>),\n });\n // POST with body\n return globalThis.fetch(input, {\n ...init,\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n });\n },\n },\n (event: Record<string, unknown>, raw) => {\n if (raw.event === \"chunk\") {\n opts.onChunk(event);\n } else if (raw.event === \"complete\") {\n opts.onComplete?.(event as unknown as ProviderExecuteResponse);\n }\n },\n opts.onError,\n );\n }\n\n /** Estimate the cost of a provider execution before running it. */\n async estimate(request: ProviderExecuteRequest): Promise<number> {\n return this.http.request(\"POST\", \"/v1/providers/estimate\", {\n body: request,\n });\n }\n}\n","import type { HttpTransport } from \"../http.js\";\nimport type { Package } from \"../types/index.js\";\n\nexport class PackagesResource {\n constructor(private readonly http: HttpTransport) {}\n\n /** List all installed domain packages. */\n async list(): Promise<Package[]> {\n return this.http.request(\"GET\", \"/v1/packages\");\n }\n}\n","/**\n * FabricClient — the main entry point for the SDK.\n *\n * Instantiate with a config, then access resources via namespaced properties:\n *\n * ```typescript\n * const fabric = new FabricClient({\n * baseUrl: 'https://api.fabric.ai',\n * auth: { type: 'api-key', key: 'fab_...' },\n * organizationId: 'org-uuid',\n * });\n *\n * const run = await fabric.workflows.runs.submit('research/deep_research', {\n * input: { query: 'AI trends' },\n * });\n *\n * const stream = fabric.workflows.runs.streamEvents(run.id, {\n * onEvent(event) { console.log(event.kind, event.node_key); },\n * });\n * ```\n */\n\nimport type { AuthConfig } from \"./auth.js\";\nimport { HttpTransport, type RequestInterceptor, type ResponseInterceptor } from \"./http.js\";\n\nimport { AuthResource } from \"./resources/auth.resource.js\";\nimport { MeResource } from \"./resources/me.resource.js\";\nimport { OrganizationsResource } from \"./resources/organizations.resource.js\";\nimport { TeamsResource } from \"./resources/teams.resource.js\";\nimport { WorkflowsResource } from \"./resources/workflows.resource.js\";\nimport { EventsResource } from \"./resources/events.resource.js\";\nimport { AssetsResource } from \"./resources/assets.resource.js\";\nimport { GalleriesResource } from \"./resources/galleries.resource.js\";\nimport { ApiKeysResource } from \"./resources/api-keys.resource.js\";\nimport { InvitationsResource } from \"./resources/invitations.resource.js\";\nimport { PermissionsResource } from \"./resources/permissions.resource.js\";\nimport { WebhooksResource } from \"./resources/webhooks.resource.js\";\nimport { ServiceAccountsResource } from \"./resources/service-accounts.resource.js\";\nimport { OAuthResource } from \"./resources/oauth.resource.js\";\nimport { AdminResource } from \"./resources/admin.resource.js\";\nimport { SchedulesResource } from \"./resources/schedules.resource.js\";\nimport { ProvidersResource } from \"./resources/providers.resource.js\";\nimport { PackagesResource } from \"./resources/packages.resource.js\";\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface FabricConfig {\n /** Base URL of the Fabric API. Default: http://localhost:3001 */\n baseUrl?: string;\n /**\n * Authentication strategy.\n *\n * - `{ type: 'api-key', key: 'fab_...' }` — API key auth\n * - `{ type: 'bearer', token: '...' }` — JWT bearer token\n * - `{ type: 'oauth', clientId, clientSecret }` — OAuth client credentials\n * - `() => Promise<string>` — dynamic per-request token (e.g., from Next.js cookies)\n */\n auth?: AuthConfig;\n /** Default organization ID for scoped requests. */\n organizationId?: string;\n /** Default team ID for scoped requests. */\n teamId?: string;\n /** Request timeout in milliseconds. Default: 30000 */\n timeout?: number;\n /** Custom fetch implementation (e.g., Next.js enhanced fetch for caching). */\n fetch?: typeof globalThis.fetch;\n /** Log all requests and responses to console. */\n debug?: boolean;\n /** Called before each request. Use for logging, metrics, tracing. */\n onRequest?: RequestInterceptor;\n /** Called after each response. Use for logging, metrics, tracing. */\n onResponse?: ResponseInterceptor;\n}\n\n// ---------------------------------------------------------------------------\n// Client\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_BASE_URL = \"http://localhost:3001\";\n\nexport class FabricClient {\n readonly auth: AuthResource;\n readonly me: MeResource;\n readonly organizations: OrganizationsResource;\n readonly teams: TeamsResource;\n readonly workflows: WorkflowsResource;\n readonly events: EventsResource;\n readonly assets: AssetsResource;\n readonly galleries: GalleriesResource;\n readonly apiKeys: ApiKeysResource;\n readonly invitations: InvitationsResource;\n readonly permissions: PermissionsResource;\n readonly webhooks: WebhooksResource;\n readonly serviceAccounts: ServiceAccountsResource;\n readonly oauth: OAuthResource;\n readonly admin: AdminResource;\n readonly schedules: SchedulesResource;\n readonly providers: ProvidersResource;\n readonly packages: PackagesResource;\n\n constructor(config: FabricConfig = {}) {\n const transport = new HttpTransport({\n baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\n auth: config.auth,\n organizationId: config.organizationId,\n teamId: config.teamId,\n timeout: config.timeout,\n fetch: config.fetch,\n debug: config.debug,\n onRequest: config.onRequest,\n onResponse: config.onResponse,\n });\n\n this.auth = new AuthResource(transport);\n this.me = new MeResource(transport);\n this.organizations = new OrganizationsResource(transport);\n this.teams = new TeamsResource(transport);\n this.workflows = new WorkflowsResource(transport);\n this.events = new EventsResource(transport);\n this.assets = new AssetsResource(transport);\n this.galleries = new GalleriesResource(transport);\n this.apiKeys = new ApiKeysResource(transport);\n this.invitations = new InvitationsResource(transport);\n this.permissions = new PermissionsResource(transport);\n this.webhooks = new WebhooksResource(transport);\n this.serviceAccounts = new ServiceAccountsResource(transport);\n this.oauth = new OAuthResource(transport);\n this.admin = new AdminResource(transport);\n this.schedules = new SchedulesResource(transport);\n this.providers = new ProvidersResource(transport);\n this.packages = new PackagesResource(transport);\n }\n}\n","/**\n * Pagination types and async iterator helper.\n */\n\n/** Pagination metadata from Fabric API responses. */\nexport interface Pagination {\n count: number;\n has_more: boolean;\n next_cursor?: string;\n}\n\n/** A paginated list response. */\nexport interface PaginatedResponse<T> {\n items: T[];\n pagination: Pagination;\n}\n\n/** Query parameters for paginated endpoints. */\nexport interface PaginationParams {\n limit?: number;\n cursor?: string;\n}\n\n/**\n * Async generator for auto-pagination.\n *\n * Yields pages of items until no more pages are available.\n *\n * ```typescript\n * for await (const page of paginate((params) => fabric.organizations.list(params))) {\n * for (const org of page) { ... }\n * }\n * ```\n */\nexport async function* paginate<T>(\n fetcher: (params: PaginationParams) => Promise<PaginatedResponse<T>>,\n options?: { limit?: number },\n): AsyncGenerator<T[], void, unknown> {\n let cursor: string | undefined;\n do {\n const page = await fetcher({ limit: options?.limit, cursor });\n yield page.items;\n cursor = page.pagination.has_more ? page.pagination.next_cursor : undefined;\n } while (cursor);\n}\n\n/**\n * Async generator for item-level iteration (single items, not pages).\n *\n * ```typescript\n * for await (const org of paginateItems((params) => fabric.organizations.list(params))) {\n * console.log(org.name);\n * }\n * ```\n */\nexport async function* paginateItems<T>(\n fetcher: (params: PaginationParams) => Promise<PaginatedResponse<T>>,\n options?: { limit?: number },\n): AsyncGenerator<T, void, unknown> {\n for await (const page of paginate(fetcher, options)) {\n for (const item of page) {\n yield item;\n }\n }\n}\n\n/**\n * Collect all pages into a single array.\n *\n * ```typescript\n * const allOrgs = await paginateAll((params) => fabric.organizations.list(params));\n * ```\n */\nexport async function paginateAll<T>(\n fetcher: (params: PaginationParams) => Promise<PaginatedResponse<T>>,\n options?: { limit?: number },\n): Promise<T[]> {\n const all: T[] = [];\n for await (const page of paginate(fetcher, options)) {\n all.push(...page);\n }\n return all;\n}\n","/**\n * Webhook signature verification utility.\n *\n * The Fabric backend signs every webhook delivery with HMAC-SHA256.\n * Headers sent with each delivery:\n * - `X-Fabric-Signature`: `sha256=<hex>` — HMAC of the raw body\n * - `X-Fabric-Event`: event kind (e.g. `workflow.run.completed`)\n * - `X-Fabric-Delivery`: unique delivery/event ID\n *\n * Works in both Node.js 18+ and browsers via Web Crypto API.\n */\n\nimport type { DomainEvent } from \"./types/index.js\";\n\n/** Headers sent with each webhook delivery. */\nexport interface WebhookHeaders {\n \"x-fabric-signature\": string;\n \"x-fabric-event\": string;\n \"x-fabric-delivery\": string;\n}\n\n/**\n * Verify a webhook signature.\n *\n * @param rawBody - The raw request body string (do NOT parse before verifying)\n * @param signature - The `X-Fabric-Signature` header value (format: `sha256=<hex>`)\n * @param secret - Your webhook signing secret\n * @returns `true` if the signature is valid\n *\n * @example\n * ```ts\n * import { verifyWebhookSignature } from \"@fabric-platform/sdk\";\n *\n * app.post(\"/webhook\", async (req, res) => {\n * const rawBody = req.body; // must be the raw string\n * const sig = req.headers[\"x-fabric-signature\"];\n * if (!await verifyWebhookSignature(rawBody, sig, process.env.WEBHOOK_SECRET!)) {\n * return res.status(401).send(\"Invalid signature\");\n * }\n * // safe to process\n * });\n * ```\n */\nexport async function verifyWebhookSignature(\n rawBody: string,\n signature: string,\n secret: string,\n): Promise<boolean> {\n const expected = await computeSignature(rawBody, secret);\n return constantTimeEqual(expected, signature);\n}\n\n/**\n * Verify the signature and parse the webhook payload in one call (Stripe pattern).\n *\n * Throws if the signature is invalid.\n *\n * @param rawBody - The raw request body string\n * @param signature - The `X-Fabric-Signature` header value\n * @param secret - Your webhook signing secret\n * @returns The parsed and typed `DomainEvent`\n *\n * @example\n * ```ts\n * import { constructWebhookEvent } from \"@fabric-platform/sdk\";\n *\n * app.post(\"/webhook\", async (req, res) => {\n * let event;\n * try {\n * event = await constructWebhookEvent(\n * req.body,\n * req.headers[\"x-fabric-signature\"]!,\n * process.env.WEBHOOK_SECRET!,\n * );\n * } catch {\n * return res.status(401).send(\"Invalid signature\");\n * }\n *\n * switch (event.kind) {\n * case \"workflow.run.completed\":\n * console.log(\"Run completed:\", event.run_id);\n * break;\n * case \"workflow.run.failed\":\n * console.error(\"Run failed:\", event.payload);\n * break;\n * }\n * res.sendStatus(200);\n * });\n * ```\n */\nexport async function constructWebhookEvent(\n rawBody: string,\n signature: string,\n secret: string,\n): Promise<DomainEvent> {\n const valid = await verifyWebhookSignature(rawBody, signature, secret);\n if (!valid) {\n throw new Error(\"Invalid webhook signature\");\n }\n return JSON.parse(rawBody) as DomainEvent;\n}\n\n// ---------------------------------------------------------------------------\n// Internal — Web Crypto API (works in Node.js 18+ and browsers)\n// ---------------------------------------------------------------------------\n\nconst encoder = new TextEncoder();\n\nasync function computeSignature(payload: string, secret: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const sig = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(payload));\n return `sha256=${hexEncode(new Uint8Array(sig))}`;\n}\n\nfunction hexEncode(bytes: Uint8Array): string {\n let hex = \"\";\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i].toString(16).padStart(2, \"0\");\n }\n return hex;\n}\n\n/** Constant-time string comparison to prevent timing attacks. */\nfunction constantTimeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return result === 0;\n}\n","/**\n * Backwards-compatible event logger from the original SDK.\n *\n * Usage:\n * ```typescript\n * import { logEvents } from '@fabric-platform/sdk';\n * fabric.workflows.runs.streamEvents(runId, { onEvent: logEvents });\n * ```\n */\n\nimport type { DomainEvent } from \"./types/index.js\";\n\nconst ansi = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n cyan: \"\\x1b[36m\",\n};\n\nconst nodeTimers: Record<string, number> = {};\nconst ts = () => new Date().toISOString().split(\"T\")[1]!.slice(0, 12);\n\n/** Built-in event logger — prints workflow progress to the console. */\nexport const logEvents = (event: DomainEvent): void => {\n const t = `${ansi.dim}${ts()}${ansi.reset}`;\n const key = event.node_key;\n\n switch (event.kind) {\n case \"workflow.run.started\":\n console.log(`${t} ${ansi.green}▶ Workflow started${ansi.reset}`);\n break;\n case \"workflow.node.started\":\n if (key) nodeTimers[key] = Date.now();\n console.log(`${t} ${ansi.cyan}⟳ ${key}${ansi.reset} running`);\n break;\n case \"workflow.node.completed\": {\n const ms = key && nodeTimers[key] ? Date.now() - nodeTimers[key]! : 0;\n console.log(`${t} ${ansi.green}✓ ${key}${ansi.reset} ${ms ? `${(ms / 1000).toFixed(1)}s` : \"\"}`);\n break;\n }\n case \"workflow.node.failed\":\n console.log(`${t} ${ansi.red}✗ ${key} FAILED${ansi.reset} ${(event.payload as Record<string, unknown>)?.error ?? \"\"}`);\n break;\n case \"workflow.run.completed\":\n console.log(`${t} ${ansi.green}${ansi.bold}✓ Workflow completed!${ansi.reset}`);\n break;\n case \"workflow.run.failed\":\n console.log(`${t} ${ansi.red}${ansi.bold}✗ Workflow failed${ansi.reset} ${(event.payload as Record<string, unknown>)?.error ?? \"\"}`);\n break;\n }\n};\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1881,4 +1881,4 @@ declare function constructWebhookEvent(rawBody: string, signature: string, secre
|
|
|
1881
1881
|
/** Built-in event logger — prints workflow progress to the console. */
|
|
1882
1882
|
declare const logEvents: (event: DomainEvent) => void;
|
|
1883
1883
|
|
|
1884
|
-
export { type AddGalleryItemRequest, AdminResource, type ApiKey, ApiKeysResource, type Asset, type AssetKind, AssetsResource, type AuthConfig, AuthResource, type AuthResponse, type AuthStrategy, type AuthUser, type AuthzCheckRequest, type AuthzCheckResponse, type CapabilityTag, type ComposeWorkflowRequest, type ConcurrencyLimit, type CreateApiKeyRequest, type CreateApiKeyResponse, type CreateGalleryRequest, type CreateInvitationRequest, type CreateOAuthClientRequest, type CreateOrganizationRequest, type CreateRegistryRequest, type CreateScheduleRequest, type CreateSecretRequest, type CreateServiceAccountRequest, type CreateTeamRequest, type CreateWebhookRequest, type DomainEvent, type Envelope, type ErrorBody, type EstimateWorkflowRequest, type EventHandler, type EventKind, type EventStream, type EventStreamFilter, EventsResource, FabricAuthError, FabricClient, type FabricConfig, FabricConflictError, FabricError, type FabricErrorParams, FabricForbiddenError, FabricNotFoundError, FabricRateLimitError, FabricServerError, FabricValidationError, GalleriesResource, type Gallery, type GalleryItem, type GrantPermissionRequest, type HistoricalCostSummary, type Invitation, type InvitationStatus, InvitationsResource, MeResource, type MeResponse, type Membership, type Meta, type MfaChallengeResponse, type MfaEnrollResponse, type MfaVerifyResponse, type Modality, type MyOrgSummary, type MyTeamSummary, NODE_EVENT_KINDS, type NodeAttempt, type NodeCostHint, type OAuthClient, OAuthResource, type OAuthTokenResponse, type OrgBudget, type OrgSecret, type OrgSettings, type OrgUsageSummary, type Organization, OrganizationsResource, type Package, PackagesResource, type PaginatedData, type PaginatedResponse, type Pagination, type PaginationParams, type Permission, type PermissionEffect, PermissionsResource, type Platform, type ProblemCluster, type
|
|
1884
|
+
export { type AddGalleryItemRequest, AdminResource, type ApiKey, ApiKeysResource, type Asset, type AssetKind, AssetsResource, type AuthConfig, AuthResource, type AuthResponse, type AuthStrategy, type AuthUser, type AuthzCheckRequest, type AuthzCheckResponse, type CapabilityTag, type ComposeWorkflowRequest, type ConcurrencyLimit, type CreateApiKeyRequest, type CreateApiKeyResponse, type CreateGalleryRequest, type CreateInvitationRequest, type CreateOAuthClientRequest, type CreateOrganizationRequest, type CreateRegistryRequest, type CreateScheduleRequest, type CreateSecretRequest, type CreateServiceAccountRequest, type CreateTeamRequest, type CreateWebhookRequest, type DomainEvent, type Envelope, type ErrorBody, type EstimateWorkflowRequest, type EventHandler, type EventKind, type EventStream, type EventStreamFilter, EventsResource, FabricAuthError, FabricClient, type FabricConfig, FabricConflictError, FabricError, type FabricErrorParams, FabricForbiddenError, FabricNotFoundError, FabricRateLimitError, FabricServerError, FabricValidationError, GalleriesResource, type Gallery, type GalleryItem, type GrantPermissionRequest, type HistoricalCostSummary, type Invitation, type InvitationStatus, InvitationsResource, MeResource, type MeResponse, type Membership, type Meta, type MfaChallengeResponse, type MfaEnrollResponse, type MfaVerifyResponse, type Modality, type MyOrgSummary, type MyTeamSummary, NODE_EVENT_KINDS, type NodeAttempt, type NodeCostHint, type OAuthClient, OAuthResource, type OAuthTokenResponse, type OrgBudget, type OrgSecret, type OrgSettings, type OrgUsageSummary, type Organization, OrganizationsResource, type Package, PackagesResource, type PaginatedData, type PaginatedResponse, type Pagination, type PaginationParams, type Permission, type PermissionEffect, PermissionsResource, type Platform, type ProblemCluster, type ProblemIntelligenceOutput, type ProblemMention, type ProviderCapability, type ProviderCredentials, type ProviderExecuteRequest, type ProviderExecuteResponse, ProvidersResource, type ReconnectingSSEOptions, type RecordArtifactRequest, type RegistryEntry, type RequestContext, type RequestInterceptor, type ResponseInterceptor, type Role, type RotateWebhookSecretResponse, type RunArtifact, type RunProgress, type RunStatus, type RunWatcher, type SSEEvent, type ScheduleRun, SchedulesResource, type ScoringWeights, type ServiceAccount, ServiceAccountsResource, type SignedUrlResponse, type SolutionMention, type SourceDocument, type StreamEventsOptions, type StreamOptions, type SubmitAndWaitOptions, type SubmitRunRequest, type SystemInfo, type SystemStatus, TERMINAL_RUN_EVENTS, type Team, TeamsResource, type Tier, type UpdateOrgSettingsRequest, type UpdateOrganizationRequest, type UpdateScheduleRequest, type UpdateWebhookRequest, type UsageDailyEntry, type UsageRecord, type WatchRunOptions, type WebSocketAck, type WebSocketCommand, type WebSocketConnection, type WebSocketOptions, type Webhook, type WebhookDelivery, type WebhookHeaders, type WebhookResourceFilter, WebhooksResource, type WorkflowCostEstimate, type WorkflowLanguage, WorkflowRegistryResource, type WorkflowRun, WorkflowRunsResource, type WorkflowSchedule, type WorkflowSource, WorkflowsResource, connectReconnectingSSE, constructWebhookEvent, logEvents, matchesFilter, paginate, paginateAll, paginateItems, verifyWebhookSignature };
|
package/dist/index.d.ts
CHANGED
|
@@ -1881,4 +1881,4 @@ declare function constructWebhookEvent(rawBody: string, signature: string, secre
|
|
|
1881
1881
|
/** Built-in event logger — prints workflow progress to the console. */
|
|
1882
1882
|
declare const logEvents: (event: DomainEvent) => void;
|
|
1883
1883
|
|
|
1884
|
-
export { type AddGalleryItemRequest, AdminResource, type ApiKey, ApiKeysResource, type Asset, type AssetKind, AssetsResource, type AuthConfig, AuthResource, type AuthResponse, type AuthStrategy, type AuthUser, type AuthzCheckRequest, type AuthzCheckResponse, type CapabilityTag, type ComposeWorkflowRequest, type ConcurrencyLimit, type CreateApiKeyRequest, type CreateApiKeyResponse, type CreateGalleryRequest, type CreateInvitationRequest, type CreateOAuthClientRequest, type CreateOrganizationRequest, type CreateRegistryRequest, type CreateScheduleRequest, type CreateSecretRequest, type CreateServiceAccountRequest, type CreateTeamRequest, type CreateWebhookRequest, type DomainEvent, type Envelope, type ErrorBody, type EstimateWorkflowRequest, type EventHandler, type EventKind, type EventStream, type EventStreamFilter, EventsResource, FabricAuthError, FabricClient, type FabricConfig, FabricConflictError, FabricError, type FabricErrorParams, FabricForbiddenError, FabricNotFoundError, FabricRateLimitError, FabricServerError, FabricValidationError, GalleriesResource, type Gallery, type GalleryItem, type GrantPermissionRequest, type HistoricalCostSummary, type Invitation, type InvitationStatus, InvitationsResource, MeResource, type MeResponse, type Membership, type Meta, type MfaChallengeResponse, type MfaEnrollResponse, type MfaVerifyResponse, type Modality, type MyOrgSummary, type MyTeamSummary, NODE_EVENT_KINDS, type NodeAttempt, type NodeCostHint, type OAuthClient, OAuthResource, type OAuthTokenResponse, type OrgBudget, type OrgSecret, type OrgSettings, type OrgUsageSummary, type Organization, OrganizationsResource, type Package, PackagesResource, type PaginatedData, type PaginatedResponse, type Pagination, type PaginationParams, type Permission, type PermissionEffect, PermissionsResource, type Platform, type ProblemCluster, type
|
|
1884
|
+
export { type AddGalleryItemRequest, AdminResource, type ApiKey, ApiKeysResource, type Asset, type AssetKind, AssetsResource, type AuthConfig, AuthResource, type AuthResponse, type AuthStrategy, type AuthUser, type AuthzCheckRequest, type AuthzCheckResponse, type CapabilityTag, type ComposeWorkflowRequest, type ConcurrencyLimit, type CreateApiKeyRequest, type CreateApiKeyResponse, type CreateGalleryRequest, type CreateInvitationRequest, type CreateOAuthClientRequest, type CreateOrganizationRequest, type CreateRegistryRequest, type CreateScheduleRequest, type CreateSecretRequest, type CreateServiceAccountRequest, type CreateTeamRequest, type CreateWebhookRequest, type DomainEvent, type Envelope, type ErrorBody, type EstimateWorkflowRequest, type EventHandler, type EventKind, type EventStream, type EventStreamFilter, EventsResource, FabricAuthError, FabricClient, type FabricConfig, FabricConflictError, FabricError, type FabricErrorParams, FabricForbiddenError, FabricNotFoundError, FabricRateLimitError, FabricServerError, FabricValidationError, GalleriesResource, type Gallery, type GalleryItem, type GrantPermissionRequest, type HistoricalCostSummary, type Invitation, type InvitationStatus, InvitationsResource, MeResource, type MeResponse, type Membership, type Meta, type MfaChallengeResponse, type MfaEnrollResponse, type MfaVerifyResponse, type Modality, type MyOrgSummary, type MyTeamSummary, NODE_EVENT_KINDS, type NodeAttempt, type NodeCostHint, type OAuthClient, OAuthResource, type OAuthTokenResponse, type OrgBudget, type OrgSecret, type OrgSettings, type OrgUsageSummary, type Organization, OrganizationsResource, type Package, PackagesResource, type PaginatedData, type PaginatedResponse, type Pagination, type PaginationParams, type Permission, type PermissionEffect, PermissionsResource, type Platform, type ProblemCluster, type ProblemIntelligenceOutput, type ProblemMention, type ProviderCapability, type ProviderCredentials, type ProviderExecuteRequest, type ProviderExecuteResponse, ProvidersResource, type ReconnectingSSEOptions, type RecordArtifactRequest, type RegistryEntry, type RequestContext, type RequestInterceptor, type ResponseInterceptor, type Role, type RotateWebhookSecretResponse, type RunArtifact, type RunProgress, type RunStatus, type RunWatcher, type SSEEvent, type ScheduleRun, SchedulesResource, type ScoringWeights, type ServiceAccount, ServiceAccountsResource, type SignedUrlResponse, type SolutionMention, type SourceDocument, type StreamEventsOptions, type StreamOptions, type SubmitAndWaitOptions, type SubmitRunRequest, type SystemInfo, type SystemStatus, TERMINAL_RUN_EVENTS, type Team, TeamsResource, type Tier, type UpdateOrgSettingsRequest, type UpdateOrganizationRequest, type UpdateScheduleRequest, type UpdateWebhookRequest, type UsageDailyEntry, type UsageRecord, type WatchRunOptions, type WebSocketAck, type WebSocketCommand, type WebSocketConnection, type WebSocketOptions, type Webhook, type WebhookDelivery, type WebhookHeaders, type WebhookResourceFilter, WebhooksResource, type WorkflowCostEstimate, type WorkflowLanguage, WorkflowRegistryResource, type WorkflowRun, WorkflowRunsResource, type WorkflowSchedule, type WorkflowSource, WorkflowsResource, connectReconnectingSSE, constructWebhookEvent, logEvents, matchesFilter, paginate, paginateAll, paginateItems, verifyWebhookSignature };
|