flowstack-sdk 0.2.2 → 0.2.4

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.
@@ -262,7 +262,25 @@ async function executeQueryWithConfig(credentials, query, workspaceId, options,
262
262
  })
263
263
  });
264
264
  if (!response.ok) {
265
- throw new Error(`Query failed: ${response.statusText}`);
265
+ let message = response.statusText || "request failed";
266
+ let code;
267
+ let body;
268
+ try {
269
+ body = await response.clone().json();
270
+ const payload = body && typeof body === "object" && "detail" in body && typeof body.detail === "object" ? body.detail : body;
271
+ if (payload && typeof payload === "object") {
272
+ code = payload.code;
273
+ message = payload.error || payload.message || payload.detail || message;
274
+ } else if (typeof payload === "string") {
275
+ message = payload;
276
+ }
277
+ } catch {
278
+ }
279
+ const err = new Error(`Query failed: ${message}`);
280
+ err.status = response.status;
281
+ err.code = code;
282
+ err.body = body;
283
+ throw err;
266
284
  }
267
285
  return response;
268
286
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api/client.ts","../../src/api/cache.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Flowstack API Client\n *\n * CRITICAL: This enforces user-level isolation for the shared tenant architecture.\n * ALL API requests MUST go through this client to prevent data leakage.\n *\n * Architecture:\n * - Flowstack: Multi-user, single-tenant system\n * - Backend: Multi-tenant system\n * - Isolation: By user_id within shared tenant\n */\n\nimport type {\n ApiResponse,\n FlowstackCredentials,\n WorkspaceInfo,\n DatasetInfo,\n VisualizationData,\n ReportInfo,\n ModelInfo,\n DataSource,\n DataSourceConfig,\n ConnectionTestResult,\n ManagedUser,\n UserStats,\n UserActivityLog,\n UserListParams,\n UserListResponse,\n UpdateUserRequest,\n DatasetPreview,\n GitHubRepo,\n PiiSettings,\n PiiRedactedEntity,\n PublishedSiteInfo,\n ScriptInfo,\n AgentInfo,\n SiteVersionManifest,\n PublishToGitHubParams,\n PublishToGitHubResult,\n CollectionLayer,\n UserDataOverview,\n UserCollectionInfo,\n CollectionSchemaInfo,\n} from '../types';\n\n// Default API URL\nconst DEFAULT_BASE_URL = 'https://sage-api.flowstack.fun';\n// No real default tenant: every function here is authenticated (takes `credentials`),\n// so the backend derives tenant_id from the JWT/API key and ignores the X-Tenant-ID\n// header. Falling back to '' avoids silently tagging requests with a platform tenant.\nconst DEFAULT_TENANT_ID = '';\n\n// Client configuration\nexport interface FlowstackClientConfig {\n baseUrl?: string;\n tenantId?: string;\n enforceUserScope?: boolean;\n /** App scope (site_id) — embedded in JWT for built-app users */\n appScope?: string;\n}\n\n/**\n * Request options for API calls\n */\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n body?: unknown;\n headers?: Record<string, string>;\n credentials: FlowstackCredentials;\n}\n\n/**\n * Make a request to the Flowstack API with user-level isolation\n */\nexport async function flowstackFetch<T = unknown>(\n endpoint: string,\n options: RequestOptions,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<T>> {\n const { method = 'GET', body, headers = {}, credentials } = options;\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const enforceUserScope = config?.enforceUserScope !== false;\n\n const { apiKey, tenantId, userId } = credentials;\n\n // CRITICAL: Enforce user ID requirement\n if (enforceUserScope && !userId) {\n console.error('[FlowstackClient] CRITICAL: No user ID provided!');\n throw new Error('SECURITY: User ID is required for all API requests.');\n }\n\n // Build full URL\n const url = new URL(`${baseUrl}${endpoint}`);\n\n // Add user_id as query parameter for GET requests\n if (method === 'GET' && userId) {\n url.searchParams.set('user_id', userId);\n }\n\n // Build request headers\n const requestHeaders: HeadersInit = {\n 'Authorization': `Bearer ${apiKey}`,\n 'X-Tenant-ID': tenantId || config?.tenantId || DEFAULT_TENANT_ID,\n 'X-User-ID': userId || '',\n ...headers,\n };\n\n // Add Content-Type for POST/PUT/PATCH\n if (body && !requestHeaders['Content-Type']) {\n requestHeaders['Content-Type'] = 'application/json';\n }\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers: requestHeaders,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(`[FlowstackClient] Error ${response.status}:`, errorText);\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data: data as T,\n };\n } catch (error) {\n console.error('[FlowstackClient] Request failed:', error);\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n// =============================================================================\n// Workspace Operations\n// =============================================================================\n\n/**\n * List workspaces for the current user\n */\nexport async function listWorkspaces(\n credentials: FlowstackCredentials,\n limit: number = 50,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ workspaces: WorkspaceInfo[]; total_count: number; has_more: boolean }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/workspaces?limit=${limit}`, {\n credentials,\n }, config);\n}\n\n/**\n * Create a new workspace\n */\nexport async function createWorkspace(\n credentials: FlowstackCredentials,\n name: string,\n description?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ workspace: WorkspaceInfo }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/workspaces`, {\n method: 'POST',\n credentials,\n body: {\n name,\n workspace_name: name,\n description,\n user_id: credentials.userId,\n },\n }, config);\n}\n\n/**\n * Get a single workspace\n */\nexport async function getWorkspace(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ workspace: WorkspaceInfo }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/workspaces/${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Dataset Operations\n// =============================================================================\n\n/**\n * List datasets for a tenant (optionally filtered by workspace)\n */\nexport async function listDatasets(\n credentials: FlowstackCredentials,\n workspaceId?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ datasets: DatasetInfo[] }>> {\n // Use workspace-scoped endpoint (non-tenant-prefixed) — demo users lack admin:read\n const query = workspaceId\n ? `?workspace_id=${workspaceId}&session_id=${workspaceId}`\n : '';\n return flowstackFetch(`/datasets${query}`, {\n credentials,\n }, config);\n}\n\n/**\n * Get dataset details\n */\nexport async function getDataset(\n credentials: FlowstackCredentials,\n datasetName: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ dataset: DatasetInfo }>> {\n // API provides dataset info through the download endpoint\n return flowstackFetch(`/datasets/${datasetName}/download`, {\n credentials,\n }, config);\n}\n\n/**\n * Get a preview of dataset rows and columns\n */\nexport async function getDatasetPreview(\n credentials: FlowstackCredentials,\n datasetName: string,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<DatasetPreview>> {\n return flowstackFetch(`/datasets/${datasetName}/preview?workspace_id=${workspaceId}&session_id=${workspaceId}&limit=50`, {\n credentials,\n }, config);\n}\n\n/**\n * Delete a dataset\n * Note: Dataset deletion must be done through the agent chat interface\n */\nexport async function deleteDataset(\n _credentials: FlowstackCredentials,\n _datasetName: string,\n _config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n // Dataset deletion is handled through agent interactions, not a direct API call\n return {\n ok: false,\n status: 501,\n error: 'Dataset deletion is handled through the agent chat interface. Use the /stream endpoint to request deletion.',\n };\n}\n\n// =============================================================================\n// Visualization Operations\n// =============================================================================\n\n/**\n * List visualizations in a workspace\n */\nexport async function listVisualizations(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ visualizations: VisualizationData[] }>> {\n return flowstackFetch(`/visualizations?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Report Operations\n// =============================================================================\n\n/**\n * List reports in a workspace\n */\nexport async function listReports(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ reports: ReportInfo[] }>> {\n return flowstackFetch(`/reports?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Model Operations\n// =============================================================================\n\n/**\n * List ML models in a workspace\n */\nexport async function listModels(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ models: ModelInfo[] }>> {\n return flowstackFetch(`/models?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n/**\n * Get model details\n */\nexport async function getModel(\n credentials: FlowstackCredentials,\n workspaceId: string,\n modelName: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ model: ModelInfo }>> {\n return flowstackFetch(`/models/${modelName}?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Script Operations\n// =============================================================================\n\n/**\n * List scripts in a workspace\n */\nexport async function listScripts(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ scripts: ScriptInfo[] }>> {\n return flowstackFetch(`/scripts/detailed?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Data Source Operations\n// =============================================================================\n\n/**\n * List data sources\n */\nexport async function listDataSources(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig,\n options?: {\n /**\n * P0-69: when true, appends `include_provenance=true` so the backend\n * returns the `_flowstack` workspace attribution envelope on every\n * data source. Required for built apps that need to know which\n * workspace a shared data source belongs to.\n */\n includeProvenance?: boolean;\n },\n): Promise<ApiResponse<{ datasources: DataSource[] }>> {\n const qs = options?.includeProvenance ? '?include_provenance=true' : '';\n return flowstackFetch(`/data-sources${qs}`, {\n credentials,\n }, config);\n}\n\n/**\n * Create a data source\n */\nexport async function createDataSource(\n credentials: FlowstackCredentials,\n sourceConfig: DataSourceConfig,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<DataSource>> {\n return flowstackFetch('/data-sources', {\n method: 'POST',\n credentials,\n body: {\n source_type: sourceConfig.type,\n name: sourceConfig.name,\n auth_method: sourceConfig.auth_method || 'connection_string',\n credentials: sourceConfig.credentials || {\n connection_string: sourceConfig.connectionString,\n },\n metadata: sourceConfig.metadata,\n is_tenant_wide: sourceConfig.is_tenant_wide || false,\n },\n }, config);\n}\n\n/**\n * Test a data source connection\n */\nexport async function testDataSource(\n credentials: FlowstackCredentials,\n sourceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<ConnectionTestResult>> {\n return flowstackFetch(`/data-sources/${sourceId}/test`, {\n method: 'POST',\n credentials,\n }, config);\n}\n\n/**\n * Delete a data source\n */\nexport async function deleteDataSource(\n credentials: FlowstackCredentials,\n sourceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/data-sources/${sourceId}`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Agent Discovery\n// =============================================================================\n\n/**\n * List available agents with descriptions and capabilities.\n * No credentials required — this is a public capability catalog.\n */\nexport async function listAgents(\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ agents: AgentInfo[]; count: number; workflows: any[] }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n\n try {\n const response = await fetch(`${baseUrl}/agents`, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return { ok: false, status: response.status, error: errorText };\n }\n\n const data = await response.json();\n return { ok: true, status: response.status, data };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Failed to fetch agents',\n };\n }\n}\n\n// =============================================================================\n// Query Execution\n// =============================================================================\n\n/**\n * Execute a streaming query\n * Returns the Response object for SSE streaming\n */\nexport async function executeQuery(\n credentials: FlowstackCredentials,\n query: string,\n workspaceId: string,\n options?: {\n networkMode?: 'SANDBOX' | 'PUBLIC';\n tools?: string[];\n /** @deprecated P0-73: Strands swarm removed. Use `capabilities` instead. */\n targetAgent?: string;\n /** @deprecated P0-73: Strands swarm removed. Use `capabilities` instead. */\n targetAgents?: string[];\n /** P0-80: meta-tool categories to pre-load on the server so the agent\n * has the right tools available from turn 1. Values: 'site_operations',\n * 'data_access', 'external_integration', 'code_execution',\n * 'domain_task', 'workspace_management'. */\n capabilities?: string[];\n /** Session ID for conversation continuity */\n sessionId?: string;\n /**\n * When true, backend generates a new session key (appends timestamp to\n * the deterministic hash) so end-users of built apps get a fresh\n * conversation on the backend, not just cleared frontend state.\n */\n forceNewSession?: boolean;\n },\n config?: FlowstackClientConfig\n): Promise<Response> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n const response = await fetch(`${baseUrl}/stream`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n 'Accept': 'text/event-stream',\n },\n body: JSON.stringify({\n query,\n workspace_id: workspaceId,\n session_id: options?.sessionId || undefined,\n force_new_session: options?.forceNewSession || undefined,\n tenant_id: tenantId,\n user_id: credentials.userId,\n code_interpreter_network_mode: options?.networkMode || 'SANDBOX',\n // P0-80: capabilities replaces target_agents on the wire. Deprecated\n // target_agents/target_agent are intentionally NOT forwarded — they\n // were no-ops post-P0-73 and forwarding them just added noise to logs.\n capabilities: options?.capabilities && options.capabilities.length > 0\n ? options.capabilities\n : undefined,\n }),\n });\n\n if (!response.ok) {\n // 402 Payment Required → out of credits. Throw a typed error that Casino's\n // useAgent hook can catch and surface via the CreditGate modal.\n if (response.status === 402) {\n let body: any = {};\n try { body = await response.json(); } catch {}\n const err = new Error(body?.message || 'Out of credits — top up to continue');\n (err as any).status = 402;\n (err as any).code = 'INSUFFICIENT_CREDITS';\n (err as any).body = body;\n throw err;\n }\n // Other failures — try to parse the body for a meaningful message\n let detail = response.statusText;\n try {\n const body = await response.json();\n detail = body?.detail || body?.error || body?.message || detail;\n } catch {}\n throw new Error(`Query failed: ${detail}`);\n }\n\n return response;\n}\n\n/**\n * Execute a streaming query with custom agent configuration\n *\n * Extends executeQuery to support system prompt overrides, tool whitelists,\n * and direct agent targeting.\n */\nexport async function executeQueryWithConfig(\n credentials: FlowstackCredentials,\n query: string,\n workspaceId: string,\n options?: {\n networkMode?: 'SANDBOX' | 'PUBLIC';\n systemPrompt?: string;\n tools?: string[];\n /** @deprecated P0-73: Strands swarm removed. Use `capabilities` instead. */\n targetAgent?: string;\n /** @deprecated P0-73: Strands swarm removed. Use `capabilities` instead. */\n targetAgents?: string[];\n /** P0-80: meta-tool categories to pre-load on the server. */\n capabilities?: string[];\n /** P0-132 (G4): target a specific registered persona/subagent by name. Sent\n * as `target_agents` on the wire so multi-persona apps can pick a persona\n * instead of always hitting the auto-selected first subagent. This is the\n * supported persona-selection path — distinct from the deprecated Strands\n * swarm `targetAgent(s)` fields above. */\n persona?: string;\n /** Session ID for conversation continuity */\n sessionId?: string;\n /** P0-57: Per-request PII allowlist — terms the user explicitly allowed */\n allowedTerms?: string[];\n /** Force backend to create a new conversation (appends timestamp to session hash) */\n forceNewSession?: boolean;\n },\n config?: FlowstackClientConfig\n): Promise<Response> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n const response = await fetch(`${baseUrl}/stream`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n 'Accept': 'text/event-stream',\n },\n body: JSON.stringify({\n query,\n workspace_id: workspaceId,\n session_id: options?.sessionId || undefined,\n force_new_session: options?.forceNewSession || undefined,\n tenant_id: tenantId,\n user_id: credentials.userId,\n code_interpreter_network_mode: options?.networkMode || 'SANDBOX',\n // P0-80: capabilities replaces target_agents on the wire.\n capabilities: options?.capabilities && options.capabilities.length > 0\n ? options.capabilities\n : undefined,\n system_prompt_override: options?.systemPrompt,\n tool_whitelist: options?.tools,\n allowed_terms: options?.allowedTerms || undefined,\n // P0-132 (G4): persona selection → target_agents. The backend persona\n // resolver honors request.target_agents and otherwise auto-selects the\n // first registered subagent. Only sent when a persona is requested.\n target_agents: options?.persona ? [options.persona] : undefined,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Query failed: ${response.statusText}`);\n }\n\n return response;\n}\n\n// =============================================================================\n// Collections — Direct MongoDB Read Access\n// =============================================================================\n\n/**\n * Query a MongoDB collection directly (for useCollection hook).\n *\n * Requires app_scope in JWT — only built-app users can use this.\n * Collection name is auto-prefixed with app_scope by the backend.\n */\nexport async function queryCollection<T = Record<string, any>>(\n credentials: FlowstackCredentials,\n collection: string,\n options?: {\n filter?: Record<string, any>;\n limit?: number;\n skip?: number;\n sort?: Record<string, 1 | -1>;\n projection?: Record<string, 0 | 1>;\n layer?: CollectionLayer;\n /**\n * P0-69: when true, appends `include_provenance=true` so the backend\n * returns the `_flowstack` workspace attribution envelope on every\n * document. Backend strips the envelope when this param is absent.\n */\n includeProvenance?: boolean;\n },\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ documents: T[]; count: number; total: number }>> {\n const params = new URLSearchParams();\n params.set('collection', collection);\n if (options?.filter) params.set('filter', JSON.stringify(options.filter));\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.skip) params.set('skip', String(options.skip));\n if (options?.sort) params.set('sort', JSON.stringify(options.sort));\n if (options?.projection) params.set('projection', JSON.stringify(options.projection));\n if (options?.layer) params.set('layer', options.layer);\n if (options?.includeProvenance) params.set('include_provenance', 'true');\n\n return flowstackFetch<{ documents: T[]; count: number; total: number }>(\n `/collections/query?${params.toString()}`,\n { credentials },\n config,\n );\n}\n\n/**\n * Insert one or more documents into a MongoDB collection.\n *\n * Requires app_scope in JWT — only built-app users can use this.\n * Collection name is auto-prefixed with app_scope by the backend.\n */\nexport async function insertDocuments(\n credentials: FlowstackCredentials,\n collection: string,\n documents: Record<string, any> | Record<string, any>[],\n config?: FlowstackClientConfig,\n layer?: CollectionLayer,\n): Promise<ApiResponse<{ inserted_count: number; inserted_ids: string[]; collection: string }>> {\n const isArray = Array.isArray(documents);\n return flowstackFetch<{ inserted_count: number; inserted_ids: string[]; collection: string }>(\n '/collections/insert',\n {\n method: 'POST',\n credentials,\n body: {\n collection,\n ...(isArray ? { documents } : { document: documents }),\n ...(layer ? { layer } : {}),\n },\n },\n config,\n );\n}\n\n/**\n * Update documents in a MongoDB collection matching the filter.\n *\n * Requires app_scope in JWT — only built-app users can use this.\n * Collection name is auto-prefixed with app_scope by the backend.\n */\nexport async function updateDocuments(\n credentials: FlowstackCredentials,\n collection: string,\n filter: Record<string, any>,\n update: Record<string, any>,\n options?: { upsert?: boolean },\n config?: FlowstackClientConfig,\n layer?: CollectionLayer,\n): Promise<ApiResponse<{ matched_count: number; modified_count: number; collection: string }>> {\n return flowstackFetch<{ matched_count: number; modified_count: number; collection: string }>(\n '/collections/update',\n {\n method: 'POST',\n credentials,\n body: {\n collection,\n filter,\n update,\n upsert: options?.upsert ?? false,\n ...(layer ? { layer } : {}),\n },\n },\n config,\n );\n}\n\n/**\n * Delete documents from a MongoDB collection matching the filter.\n *\n * Requires app_scope in JWT — only built-app users can use this.\n * Collection name is auto-prefixed with app_scope by the backend.\n */\nexport async function deleteDocuments(\n credentials: FlowstackCredentials,\n collection: string,\n filter: Record<string, any>,\n config?: FlowstackClientConfig,\n layer?: CollectionLayer,\n): Promise<ApiResponse<{ deleted_count: number; collection: string }>> {\n return flowstackFetch<{ deleted_count: number; collection: string }>(\n '/collections/delete',\n {\n method: 'POST',\n credentials,\n body: {\n collection,\n filter,\n ...(layer ? { layer } : {}),\n },\n },\n config,\n );\n}\n\n// =============================================================================\n// Private Messaging (P0-138)\n// =============================================================================\n//\n// Server-mediated, ACL'd, key-addressed direct messages between two app users.\n// The backend pins `from` to the caller's JWT identity, gates sends on a\n// mutually-consented thread, and ACLs reads to thread participants — neither\n// party ever learns the other's contact.\n//\n// Message bodies are UNTRUSTED user input. Render them as plain text / sanitized\n// markdown only — never as raw HTML (no dangerouslySetInnerHTML). If a body is\n// ever passed to an agent, treat it as data, not instructions.\n\nexport interface DmMessage {\n message_id: string;\n from: string;\n to: string;\n /** UNTRUSTED user input — render as text, never raw HTML. */\n body: string;\n created_at: string;\n read_at: string | null;\n}\n\nexport interface DmThread {\n pair_key: string;\n with_user_key: string;\n status: 'pending' | 'open';\n last_message: DmMessage | null;\n unread_count: number;\n updated_at: string | null;\n}\n\n/**\n * Deterministic, order-independent thread key for a pair of user keys.\n * Mirrors the backend's `pair_key` (sorted, '::'-joined).\n */\nexport function dmPairKey(a: string, b: string): string {\n return [a, b].sort().join('::');\n}\n\nfunction requireAppScope(config?: FlowstackClientConfig): string {\n const scope = config?.appScope;\n if (!scope) {\n throw new Error('Private messaging requires an app scope (built-app context).');\n }\n return scope;\n}\n\n/** List the caller's threads (counterpart key, last message, unread count). */\nexport async function listThreads(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ threads: DmThread[]; count: number }>> {\n const scope = requireAppScope(config);\n return flowstackFetch<{ threads: DmThread[]; count: number }>(\n `/apps/${encodeURIComponent(scope)}/threads`,\n { credentials },\n config,\n );\n}\n\n/** List messages in the caller's thread with `withUserKey`. ACL'd server-side. */\nexport async function listMessages(\n credentials: FlowstackCredentials,\n withUserKey: string,\n options?: { limit?: number; before?: string },\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ messages: DmMessage[]; count: number }>> {\n const scope = requireAppScope(config);\n const params = new URLSearchParams();\n params.set('with', withUserKey);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.before) params.set('before', options.before);\n return flowstackFetch<{ messages: DmMessage[]; count: number }>(\n `/apps/${encodeURIComponent(scope)}/messages?${params.toString()}`,\n { credentials },\n config,\n );\n}\n\n/** Send a message to `toUserKey`. 403 unless the thread is mutually open. */\nexport async function sendMessage(\n credentials: FlowstackCredentials,\n toUserKey: string,\n body: string,\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ message_id: string; created_at: string }>> {\n const scope = requireAppScope(config);\n return flowstackFetch<{ message_id: string; created_at: string }>(\n `/apps/${encodeURIComponent(scope)}/messages`,\n { method: 'POST', credentials, body: { to_user_key: toUserKey, body } },\n config,\n );\n}\n\n/**\n * Record the caller's consent to open a thread with `withUserKey`.\n * The thread becomes `open` (sendable) only once BOTH parties have consented.\n */\nexport async function openThread(\n credentials: FlowstackCredentials,\n withUserKey: string,\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ pair_key: string; status: string }>> {\n const scope = requireAppScope(config);\n const me = credentials.userId;\n if (!me) throw new Error('openThread requires an authenticated user.');\n const pk = dmPairKey(me, withUserKey);\n return flowstackFetch<{ pair_key: string; status: string }>(\n `/apps/${encodeURIComponent(scope)}/threads/${encodeURIComponent(pk)}/consent`,\n { method: 'POST', credentials },\n config,\n );\n}\n\n/** Mark a received message as read (recipient only). */\nexport async function markMessageRead(\n credentials: FlowstackCredentials,\n messageId: string,\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ message_id: string; read: boolean }>> {\n const scope = requireAppScope(config);\n return flowstackFetch<{ message_id: string; read: boolean }>(\n `/apps/${encodeURIComponent(scope)}/messages/${encodeURIComponent(messageId)}/read`,\n { method: 'POST', credentials },\n config,\n );\n}\n\n// =============================================================================\n// Direct Tool Invocation\n// =============================================================================\n\n/**\n * Invoke an agent tool directly (bypasses LLM orchestration).\n */\nexport async function invokeTool<T = any>(\n credentials: FlowstackCredentials,\n agentName: string,\n toolName: string,\n kwargs: Record<string, any> = {},\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ status: string; result: T }>> {\n return flowstackFetch<{ status: string; result: T }>(\n '/tool/invoke',\n {\n method: 'POST',\n credentials,\n body: {\n agent_name: agentName,\n tool_name: toolName,\n kwargs,\n },\n },\n config,\n );\n}\n\n// =============================================================================\n// File Upload\n// =============================================================================\n\n/**\n * Upload a file to a workspace\n */\nexport async function uploadFile(\n credentials: FlowstackCredentials,\n workspaceId: string,\n file: File,\n name?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ dataset?: DatasetInfo; report?: ReportInfo }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n const formData = new FormData();\n formData.append('file', file);\n formData.append('workspace_id', workspaceId);\n if (name) {\n formData.append('name', name);\n formData.append('dataset_name', name);\n }\n\n try {\n const response = await fetch(`${baseUrl}/upload`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n 'X-Session-ID': workspaceId,\n },\n body: formData,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data,\n };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Upload failed',\n };\n }\n}\n\n/**\n * Upload a document (PDF/DOCX/image/etc.) to a workspace's uploads/ prefix.\n *\n * The two upload routes split by intent: `/upload` parses tabular formats into\n * a queryable DataFrame (dataset); `/upload-document` stores raw bytes for the\n * agent's `ingest_document` / `search_documents` tools. The chat input\n * accepts both kinds of file, so useAgent.query() must pick the right route\n * by extension or the backend 400s with \"Unsupported file type\".\n */\nexport async function uploadDocument(\n credentials: FlowstackCredentials,\n workspaceId: string,\n file: File,\n documentName?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ document_name?: string; filename?: string; format?: string; size_bytes?: number; s3_key?: string }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n const formData = new FormData();\n formData.append('file', file);\n formData.append('workspace_id', workspaceId);\n if (documentName) formData.append('document_name', documentName);\n\n try {\n const response = await fetch(`${baseUrl}/upload-document`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n 'X-Session-ID': workspaceId,\n },\n body: formData,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return { ok: false, status: response.status, error: errorText };\n }\n\n const data = await response.json();\n return { ok: true, status: response.status, data };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Document upload failed',\n };\n }\n}\n\n// =============================================================================\n// Authentication\n// =============================================================================\n\n/**\n * Login to get session token\n */\nexport async function login(\n email: string,\n password: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{\n session_token: string;\n user_id: string;\n access_token?: string;\n}>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n\n try {\n const response = await fetch(`${baseUrl}/auth/user/login`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config?.tenantId ? { 'X-Tenant-ID': config.tenantId } : {}),\n },\n body: JSON.stringify({\n email,\n password,\n ...(config?.appScope ? { app_scope: config.appScope } : {}),\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data,\n };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Login failed',\n };\n }\n}\n\n/**\n * Register a new user\n */\nexport async function register(\n email: string,\n password: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user_id: string; message?: string; session_token?: string; tenant_id?: string }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n\n try {\n const response = await fetch(`${baseUrl}/auth/user/register`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config?.tenantId ? { 'X-Tenant-ID': config.tenantId } : {}),\n },\n body: JSON.stringify({\n email,\n password,\n skip_email_verification: true,\n ...(config?.appScope ? { app_scope: config.appScope } : {}),\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data,\n };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Registration failed',\n };\n }\n}\n\n/**\n * Authenticate via Google OAuth authorization code.\n * Call this from the /api/auth/google/callback route after receiving the code from Google.\n */\nexport async function googleLogin(\n code: string,\n redirectUri: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ session_token: string; user_id: string; tenant_id?: string; expires_at?: string }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n\n try {\n const response = await fetch(`${baseUrl}/auth/google/login`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config?.tenantId ? { 'X-Tenant-ID': config.tenantId } : {}),\n },\n body: JSON.stringify({ code, redirect_uri: redirectUri }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data,\n };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Google login failed',\n };\n }\n}\n\n// =============================================================================\n// User Management Operations\n// =============================================================================\n\n/**\n * List users in the tenant with pagination and filtering\n */\nexport async function listUsers(\n credentials: FlowstackCredentials,\n params?: UserListParams,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<UserListResponse>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n // Build query string\n const queryParams = new URLSearchParams();\n if (params?.page) queryParams.set('page', String(params.page));\n if (params?.limit) queryParams.set('limit', String(params.limit));\n if (params?.search) queryParams.set('search', params.search);\n if (params?.role) queryParams.set('role', params.role);\n if (params?.status) queryParams.set('status', params.status);\n if (params?.sortBy) queryParams.set('sort_by', params.sortBy);\n if (params?.sortOrder) queryParams.set('sort_order', params.sortOrder);\n\n const queryString = queryParams.toString();\n const endpoint = `/tenants/${tenantId}/users${queryString ? `?${queryString}` : ''}`;\n\n return flowstackFetch<UserListResponse>(endpoint, { credentials }, config);\n}\n\n/**\n * Get a single user by ID\n */\nexport async function getUser(\n credentials: FlowstackCredentials,\n userId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user: ManagedUser }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}`, { credentials }, config);\n}\n\n/**\n * Update a user's profile or role\n */\nexport async function updateUser(\n credentials: FlowstackCredentials,\n userId: string,\n updates: UpdateUserRequest,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user: ManagedUser }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}`, {\n method: 'PATCH',\n credentials,\n body: updates,\n }, config);\n}\n\n/**\n * Delete a user permanently\n */\nexport async function deleteUser(\n credentials: FlowstackCredentials,\n userId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n/**\n * Suspend a user account\n */\nexport async function suspendUser(\n credentials: FlowstackCredentials,\n userId: string,\n reason?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user: ManagedUser }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}/suspend`, {\n method: 'POST',\n credentials,\n body: reason ? { reason } : undefined,\n }, config);\n}\n\n/**\n * Reactivate a suspended user account\n */\nexport async function reactivateUser(\n credentials: FlowstackCredentials,\n userId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user: ManagedUser }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}/reactivate`, {\n method: 'POST',\n credentials,\n }, config);\n}\n\n/**\n * Get user activity logs\n */\nexport async function getUserActivity(\n credentials: FlowstackCredentials,\n userId: string,\n limit: number = 50,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ activities: UserActivityLog[] }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}/activity?limit=${limit}`, {\n credentials,\n }, config);\n}\n\n/**\n * Get user statistics for the tenant\n */\nexport async function getUserStats(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<UserStats>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/stats`, { credentials }, config);\n}\n\n/**\n * Check if the current user has admin permissions to manage users\n */\nexport async function checkAdminPermissions(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ canManageUsers: boolean; role: string }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/me/permissions`, { credentials }, config);\n}\n\n// =============================================================================\n// Conversation History\n// =============================================================================\n\n/**\n * Get conversation history for a workspace/session\n */\nexport async function getConversationHistory(\n credentials: FlowstackCredentials,\n workspaceId: string,\n options?: { limit?: number; offset?: number },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ messages: Array<{ role: string; content: string; timestamp: string }> }>> {\n const params = new URLSearchParams();\n params.set('session_id', workspaceId);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n\n return flowstackFetch(\n `/conversations?${params.toString()}`,\n { method: 'GET', credentials },\n config\n );\n}\n\n// =============================================================================\n// Sites — Published websites and CDN management\n// =============================================================================\n\nexport interface CreateSiteParams {\n name: string;\n siteType?: 'on_demand' | 'daily' | 'js_build';\n description?: string;\n files?: Record<string, string>;\n}\n\n/**\n * List all published sites for the current user\n */\nexport async function listSites(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ sites: PublishedSiteInfo[]; count: number }>> {\n return flowstackFetch('/api/v1/sites', { method: 'GET', credentials }, config);\n}\n\n/**\n * Get a single published site by ID\n */\nexport async function getSite(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ site: PublishedSiteInfo }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}`, { method: 'GET', credentials }, config);\n}\n\n/**\n * Create a new site. If files are provided, publishes immediately.\n * Otherwise creates a staging area for incremental file uploads.\n */\nexport async function createSite(\n credentials: FlowstackCredentials,\n params: CreateSiteParams,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ site?: PublishedSiteInfo; site_id?: string; mode?: string }>> {\n return flowstackFetch('/api/v1/sites', {\n method: 'POST',\n credentials,\n body: {\n site_name: params.name,\n site_type: params.siteType || 'on_demand',\n description: params.description,\n files: params.files,\n },\n }, config);\n}\n\n/**\n * Add or update a single file in a site's staging area.\n * Call this for each file, then publishStagedSite() to deploy.\n */\nexport async function addSiteFile(\n credentials: FlowstackCredentials,\n siteId: string,\n filePath: string,\n content: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/files/${filePath}`, {\n method: 'PUT',\n credentials,\n body: { content },\n }, config);\n}\n\n/**\n * Publish a staged site to CDN. Call after adding all files with addSiteFile().\n */\nexport async function publishStagedSite(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ site: PublishedSiteInfo }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/publish`, {\n method: 'POST',\n credentials,\n }, config);\n}\n\n/**\n * Delete a published site and all its files from CDN\n */\nexport async function deleteSite(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Site Versioning\n// =============================================================================\n\nexport async function getSiteVersions(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<SiteVersionManifest>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/versions`, {\n method: 'GET',\n credentials,\n }, config);\n}\n\nexport async function promoteSiteVersion(\n credentials: FlowstackCredentials,\n siteId: string,\n version: number,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<SiteVersionManifest>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/promote`, {\n method: 'POST',\n credentials,\n body: { version },\n }, config);\n}\n\nexport async function deleteSiteVersion(\n credentials: FlowstackCredentials,\n siteId: string,\n version: number,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<SiteVersionManifest>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/versions/${version}`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Site Aliases\n// =============================================================================\n\nexport async function setSiteAlias(\n credentials: FlowstackCredentials,\n siteId: string,\n alias: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ alias: string; url: string }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/alias`, {\n method: 'POST',\n credentials,\n body: { alias },\n }, config);\n}\n\nexport async function removeSiteAlias(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/alias`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Publish to GitHub\n// =============================================================================\n\nexport async function publishToGitHub(\n credentials: FlowstackCredentials,\n siteId: string,\n params: PublishToGitHubParams,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<PublishToGitHubResult>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/publish-github`, {\n method: 'POST',\n credentials,\n body: {\n repo_name: params.repoName,\n private: params.isPrivate ?? true,\n ...(params.version != null ? { version: params.version } : {}),\n },\n }, config);\n}\n\n// =============================================================================\n// GitHub Repository Import\n// =============================================================================\n\nexport async function listGitHubRepos(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ repos: GitHubRepo[] }>> {\n return flowstackFetch('/api/v1/github/repos', {\n credentials,\n }, config);\n}\n\nexport async function importFromGitHub(\n credentials: FlowstackCredentials,\n params: { repoFullName: string; branch?: string; workspaceId?: string },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ files_imported: number }>> {\n return flowstackFetch('/api/v1/github/import', {\n method: 'POST',\n credentials,\n body: params,\n }, config);\n}\n\n// =============================================================================\n// PII Settings\n// =============================================================================\n\nexport async function getPiiSettings(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ settings: PiiSettings }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-settings`, {\n credentials,\n }, config);\n}\n\nexport async function updatePiiSettings(\n credentials: FlowstackCredentials,\n workspaceId: string,\n settings: PiiSettings,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-settings`, {\n method: 'PUT',\n credentials,\n body: settings,\n }, config);\n}\n\n// P0-57: PII preview — detect entities without masking\nexport async function previewPiiMasking(\n credentials: FlowstackCredentials,\n query: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ entities: PiiRedactedEntity[] }>> {\n // Guard: skip if credentials not yet loaded (prevents \"Not enough segments\" 401 spam\n // when built apps call this on mount before Privy has issued a valid token)\n if (!credentials?.apiKey || credentials.apiKey.split('.').length !== 3) {\n return { ok: false, error: 'Not authenticated', status: 401 };\n }\n return flowstackFetch('/stream/pii-preview', {\n method: 'POST',\n credentials,\n body: { query },\n }, config);\n}\n\n// P0-57: PII allowlist CRUD\nexport async function getPiiAllowlist(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ allowlist: Array<{ term: string; entity_type: string }> }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-allowlist`, {\n credentials,\n }, config);\n}\n\nexport async function addPiiAllowlistTerm(\n credentials: FlowstackCredentials,\n workspaceId: string,\n term: string,\n entityType: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean; allowlist: Array<{ term: string; entity_type: string }> }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-allowlist`, {\n method: 'POST',\n credentials,\n body: { term, entity_type: entityType },\n }, config);\n}\n\nexport async function removePiiAllowlistTerm(\n credentials: FlowstackCredentials,\n workspaceId: string,\n term: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean; allowlist: Array<{ term: string; entity_type: string }> }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-allowlist`, {\n method: 'DELETE',\n credentials,\n body: { term },\n }, config);\n}\n\n// =============================================================================\n// User Data Explorer\n// =============================================================================\n\nexport async function getUserDataOverview(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<UserDataOverview>> {\n return flowstackFetch('/api/v1/user/data-overview', {\n credentials,\n }, config);\n}\n\nexport async function getUserCollections(\n credentials: FlowstackCredentials,\n params?: { siteId?: string; includeSchema?: boolean },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ collections: UserCollectionInfo[]; grouped_by_site: Record<string, UserCollectionInfo[]> }>> {\n const query = new URLSearchParams();\n if (params?.siteId) query.set('site_id', params.siteId);\n if (params?.includeSchema) query.set('include_schema', 'true');\n const qs = query.toString();\n return flowstackFetch(`/api/v1/user/collections${qs ? `?${qs}` : ''}`, {\n credentials,\n }, config);\n}\n\nexport async function getUserCollectionDocuments<T = Record<string, any>>(\n credentials: FlowstackCredentials,\n collection: string,\n params?: { filter?: Record<string, any>; limit?: number; skip?: number; sort?: Record<string, 1 | -1>; database?: string },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ documents: T[]; total: number }>> {\n const query = new URLSearchParams();\n if (params?.filter) query.set('filter', JSON.stringify(params.filter));\n if (params?.limit != null) query.set('limit', String(params.limit));\n if (params?.skip != null) query.set('skip', String(params.skip));\n if (params?.sort) query.set('sort', JSON.stringify(params.sort));\n if (params?.database) query.set('database', params.database);\n const qs = query.toString();\n return flowstackFetch(`/api/v1/user/collections/${encodeURIComponent(collection)}/documents${qs ? `?${qs}` : ''}`, {\n credentials,\n }, config);\n}\n\nexport async function getUserCollectionSchema(\n credentials: FlowstackCredentials,\n collection: string,\n params?: { database?: string; sampleSize?: number },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<CollectionSchemaInfo>> {\n const query = new URLSearchParams();\n if (params?.database) query.set('database', params.database);\n if (params?.sampleSize != null) query.set('sample_size', String(params.sampleSize));\n const qs = query.toString();\n return flowstackFetch(`/api/v1/user/collections/${encodeURIComponent(collection)}/schema${qs ? `?${qs}` : ''}`, {\n credentials,\n }, config);\n}\n\nexport async function deleteUserCollection(\n credentials: FlowstackCredentials,\n collection: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ deleted: boolean; collection: string }>> {\n return flowstackFetch(`/api/v1/user/collections/${encodeURIComponent(collection)}?confirm=true`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\nexport async function exportUserCollection(\n credentials: FlowstackCredentials,\n collection: string,\n params?: { format?: 'json' | 'csv'; filter?: Record<string, any>; database?: string },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<Blob>> {\n const query = new URLSearchParams();\n if (params?.database) query.set('database', params.database);\n const qs = query.toString();\n return flowstackFetch(`/api/v1/user/collections/${encodeURIComponent(collection)}/export${qs ? `?${qs}` : ''}`, {\n method: 'POST',\n credentials,\n body: {\n format: params?.format || 'json',\n filter: params?.filter || null,\n },\n }, config);\n}\n","/**\n * Redis Cache Layer for Flowstack SDK\n * Uses Upstash Redis for serverless caching\n */\n\nimport type { FlowstackCredentials, WorkspaceInfo, DatasetInfo, VisualizationData, ReportInfo, PublishedSiteInfo } from '../types';\n\n// Cache TTL constants (in seconds)\nexport const CACHE_TTL = {\n WORKSPACES: 300, // 5 minutes\n DATASETS: 60, // 1 minute\n VISUALIZATIONS: 60, // 1 minute\n REPORTS: 60, // 1 minute\n SITES: 120, // 2 minutes\n MESSAGES: 0, // No expiry\n SESSION: 86400, // 24 hours\n} as const;\n\n// Cache key prefix\nconst NAMESPACE = 'flowstack';\n\n/**\n * Redis client configuration\n */\nexport interface RedisConfig {\n url: string;\n token: string;\n}\n\n/**\n * Create a Redis client for Upstash\n */\nfunction createRedisClient(config: RedisConfig) {\n const { url, token } = config;\n\n return {\n async get<T>(key: string): Promise<T | null> {\n try {\n const response = await fetch(`${url}/get/${key}`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!response.ok) return null;\n const data = await response.json();\n return data.result ? JSON.parse(data.result) : null;\n } catch {\n return null;\n }\n },\n\n async set(key: string, value: unknown, ttl?: number): Promise<boolean> {\n try {\n const body = ttl\n ? ['SET', key, JSON.stringify(value), 'EX', ttl.toString()]\n : ['SET', key, JSON.stringify(value)];\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n return response.ok;\n } catch {\n return false;\n }\n },\n\n async del(key: string): Promise<boolean> {\n try {\n const response = await fetch(`${url}/del/${key}`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${token}` },\n });\n return response.ok;\n } catch {\n return false;\n }\n },\n\n async keys(pattern: string): Promise<string[]> {\n try {\n const response = await fetch(`${url}/keys/${pattern}`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!response.ok) return [];\n const data = await response.json();\n return data.result || [];\n } catch {\n return [];\n }\n },\n };\n}\n\n/**\n * Generate user-scoped cache key\n */\nfunction getCacheKey(\n type: string,\n credentials: FlowstackCredentials,\n ...parts: string[]\n): string {\n const userId = credentials.userId || 'anonymous';\n const tenantId = credentials.tenantId;\n const key = [NAMESPACE, type, tenantId, userId, ...parts].filter(Boolean).join(':');\n return key;\n}\n\n// =============================================================================\n// Workspace Cache\n// =============================================================================\n\nexport async function getCachedWorkspaces(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<WorkspaceInfo[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('workspaces', credentials);\n return client.get<WorkspaceInfo[]>(key);\n}\n\nexport async function setCachedWorkspaces(\n credentials: FlowstackCredentials,\n workspaces: WorkspaceInfo[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('workspaces', credentials);\n return client.set(key, workspaces, CACHE_TTL.WORKSPACES);\n}\n\nexport async function invalidateWorkspacesCache(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('workspaces', credentials);\n return client.del(key);\n}\n\n// =============================================================================\n// Dataset Cache\n// =============================================================================\n\nexport async function getCachedDatasets(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<DatasetInfo[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('datasets', credentials, workspaceId);\n return client.get<DatasetInfo[]>(key);\n}\n\nexport async function setCachedDatasets(\n credentials: FlowstackCredentials,\n workspaceId: string,\n datasets: DatasetInfo[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('datasets', credentials, workspaceId);\n return client.set(key, datasets, CACHE_TTL.DATASETS);\n}\n\nexport async function invalidateDatasetsCache(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('datasets', credentials, workspaceId);\n return client.del(key);\n}\n\n// =============================================================================\n// Visualization Cache\n// =============================================================================\n\nexport async function getCachedVisualizations(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<VisualizationData[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('visualizations', credentials, workspaceId);\n return client.get<VisualizationData[]>(key);\n}\n\nexport async function setCachedVisualizations(\n credentials: FlowstackCredentials,\n workspaceId: string,\n visualizations: VisualizationData[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('visualizations', credentials, workspaceId);\n return client.set(key, visualizations, CACHE_TTL.VISUALIZATIONS);\n}\n\nexport async function invalidateVisualizationsCache(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('visualizations', credentials, workspaceId);\n return client.del(key);\n}\n\n// =============================================================================\n// Report Cache\n// =============================================================================\n\nexport async function getCachedReports(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<ReportInfo[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('reports', credentials, workspaceId);\n return client.get<ReportInfo[]>(key);\n}\n\nexport async function setCachedReports(\n credentials: FlowstackCredentials,\n workspaceId: string,\n reports: ReportInfo[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('reports', credentials, workspaceId);\n return client.set(key, reports, CACHE_TTL.REPORTS);\n}\n\nexport async function invalidateReportsCache(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('reports', credentials, workspaceId);\n return client.del(key);\n}\n\n// =============================================================================\n// Bulk Invalidation\n// =============================================================================\n\n/**\n * Invalidate all workspace artifacts (datasets, visualizations, reports)\n */\nexport async function invalidateWorkspaceArtifacts(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<void> {\n await Promise.all([\n invalidateDatasetsCache(credentials, workspaceId, config),\n invalidateVisualizationsCache(credentials, workspaceId, config),\n invalidateReportsCache(credentials, workspaceId, config),\n ]);\n}\n\n/**\n * Invalidate all user cache\n */\nexport async function invalidateAllUserCache(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<void> {\n const client = createRedisClient(config);\n const userId = credentials.userId || 'anonymous';\n const tenantId = credentials.tenantId;\n const pattern = `${NAMESPACE}:*:${tenantId}:${userId}:*`;\n\n const keys = await client.keys(pattern);\n await Promise.all(keys.map(key => client.del(key)));\n}\n\n// =============================================================================\n// Generic Cache Operations\n// =============================================================================\n\n/**\n * Get a cached value\n */\nexport async function getCached<T>(\n key: string,\n config: RedisConfig\n): Promise<T | null> {\n const client = createRedisClient(config);\n return client.get<T>(`${NAMESPACE}:${key}`);\n}\n\n/**\n * Set a cached value\n */\nexport async function setCached<T>(\n key: string,\n value: T,\n ttl: number,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n return client.set(`${NAMESPACE}:${key}`, value, ttl);\n}\n\n/**\n * Delete a cached value\n */\nexport async function deleteCached(\n key: string,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n return client.del(`${NAMESPACE}:${key}`);\n}\n\n// =============================================================================\n// Sites Cache\n// =============================================================================\n\nexport async function getCachedSites(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<PublishedSiteInfo[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('sites', credentials);\n return client.get<PublishedSiteInfo[]>(key);\n}\n\nexport async function setCachedSites(\n credentials: FlowstackCredentials,\n sites: PublishedSiteInfo[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('sites', credentials);\n return client.set(key, sites, CACHE_TTL.SITES);\n}\n\nexport async function invalidateSitesCache(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('sites', credentials);\n return client.del(key);\n}\n"]}
1
+ {"version":3,"sources":["../../src/api/client.ts","../../src/api/cache.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Flowstack API Client\n *\n * CRITICAL: This enforces user-level isolation for the shared tenant architecture.\n * ALL API requests MUST go through this client to prevent data leakage.\n *\n * Architecture:\n * - Flowstack: Multi-user, single-tenant system\n * - Backend: Multi-tenant system\n * - Isolation: By user_id within shared tenant\n */\n\nimport type {\n ApiResponse,\n FlowstackCredentials,\n WorkspaceInfo,\n DatasetInfo,\n VisualizationData,\n ReportInfo,\n ModelInfo,\n DataSource,\n DataSourceConfig,\n ConnectionTestResult,\n ManagedUser,\n UserStats,\n UserActivityLog,\n UserListParams,\n UserListResponse,\n UpdateUserRequest,\n DatasetPreview,\n GitHubRepo,\n PiiSettings,\n PiiRedactedEntity,\n PublishedSiteInfo,\n ScriptInfo,\n AgentInfo,\n SiteVersionManifest,\n PublishToGitHubParams,\n PublishToGitHubResult,\n CollectionLayer,\n UserDataOverview,\n UserCollectionInfo,\n CollectionSchemaInfo,\n} from '../types';\n\n// Default API URL\nconst DEFAULT_BASE_URL = 'https://sage-api.flowstack.fun';\n// No real default tenant: every function here is authenticated (takes `credentials`),\n// so the backend derives tenant_id from the JWT/API key and ignores the X-Tenant-ID\n// header. Falling back to '' avoids silently tagging requests with a platform tenant.\nconst DEFAULT_TENANT_ID = '';\n\n// Client configuration\nexport interface FlowstackClientConfig {\n baseUrl?: string;\n tenantId?: string;\n enforceUserScope?: boolean;\n /** App scope (site_id) — embedded in JWT for built-app users */\n appScope?: string;\n}\n\n/**\n * Request options for API calls\n */\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n body?: unknown;\n headers?: Record<string, string>;\n credentials: FlowstackCredentials;\n}\n\n/**\n * Make a request to the Flowstack API with user-level isolation\n */\nexport async function flowstackFetch<T = unknown>(\n endpoint: string,\n options: RequestOptions,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<T>> {\n const { method = 'GET', body, headers = {}, credentials } = options;\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const enforceUserScope = config?.enforceUserScope !== false;\n\n const { apiKey, tenantId, userId } = credentials;\n\n // CRITICAL: Enforce user ID requirement\n if (enforceUserScope && !userId) {\n console.error('[FlowstackClient] CRITICAL: No user ID provided!');\n throw new Error('SECURITY: User ID is required for all API requests.');\n }\n\n // Build full URL\n const url = new URL(`${baseUrl}${endpoint}`);\n\n // Add user_id as query parameter for GET requests\n if (method === 'GET' && userId) {\n url.searchParams.set('user_id', userId);\n }\n\n // Build request headers\n const requestHeaders: HeadersInit = {\n 'Authorization': `Bearer ${apiKey}`,\n 'X-Tenant-ID': tenantId || config?.tenantId || DEFAULT_TENANT_ID,\n 'X-User-ID': userId || '',\n ...headers,\n };\n\n // Add Content-Type for POST/PUT/PATCH\n if (body && !requestHeaders['Content-Type']) {\n requestHeaders['Content-Type'] = 'application/json';\n }\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers: requestHeaders,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(`[FlowstackClient] Error ${response.status}:`, errorText);\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data: data as T,\n };\n } catch (error) {\n console.error('[FlowstackClient] Request failed:', error);\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n// =============================================================================\n// Workspace Operations\n// =============================================================================\n\n/**\n * List workspaces for the current user\n */\nexport async function listWorkspaces(\n credentials: FlowstackCredentials,\n limit: number = 50,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ workspaces: WorkspaceInfo[]; total_count: number; has_more: boolean }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/workspaces?limit=${limit}`, {\n credentials,\n }, config);\n}\n\n/**\n * Create a new workspace\n */\nexport async function createWorkspace(\n credentials: FlowstackCredentials,\n name: string,\n description?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ workspace: WorkspaceInfo }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/workspaces`, {\n method: 'POST',\n credentials,\n body: {\n name,\n workspace_name: name,\n description,\n user_id: credentials.userId,\n },\n }, config);\n}\n\n/**\n * Get a single workspace\n */\nexport async function getWorkspace(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ workspace: WorkspaceInfo }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/workspaces/${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Dataset Operations\n// =============================================================================\n\n/**\n * List datasets for a tenant (optionally filtered by workspace)\n */\nexport async function listDatasets(\n credentials: FlowstackCredentials,\n workspaceId?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ datasets: DatasetInfo[] }>> {\n // Use workspace-scoped endpoint (non-tenant-prefixed) — demo users lack admin:read\n const query = workspaceId\n ? `?workspace_id=${workspaceId}&session_id=${workspaceId}`\n : '';\n return flowstackFetch(`/datasets${query}`, {\n credentials,\n }, config);\n}\n\n/**\n * Get dataset details\n */\nexport async function getDataset(\n credentials: FlowstackCredentials,\n datasetName: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ dataset: DatasetInfo }>> {\n // API provides dataset info through the download endpoint\n return flowstackFetch(`/datasets/${datasetName}/download`, {\n credentials,\n }, config);\n}\n\n/**\n * Get a preview of dataset rows and columns\n */\nexport async function getDatasetPreview(\n credentials: FlowstackCredentials,\n datasetName: string,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<DatasetPreview>> {\n return flowstackFetch(`/datasets/${datasetName}/preview?workspace_id=${workspaceId}&session_id=${workspaceId}&limit=50`, {\n credentials,\n }, config);\n}\n\n/**\n * Delete a dataset\n * Note: Dataset deletion must be done through the agent chat interface\n */\nexport async function deleteDataset(\n _credentials: FlowstackCredentials,\n _datasetName: string,\n _config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n // Dataset deletion is handled through agent interactions, not a direct API call\n return {\n ok: false,\n status: 501,\n error: 'Dataset deletion is handled through the agent chat interface. Use the /stream endpoint to request deletion.',\n };\n}\n\n// =============================================================================\n// Visualization Operations\n// =============================================================================\n\n/**\n * List visualizations in a workspace\n */\nexport async function listVisualizations(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ visualizations: VisualizationData[] }>> {\n return flowstackFetch(`/visualizations?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Report Operations\n// =============================================================================\n\n/**\n * List reports in a workspace\n */\nexport async function listReports(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ reports: ReportInfo[] }>> {\n return flowstackFetch(`/reports?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Model Operations\n// =============================================================================\n\n/**\n * List ML models in a workspace\n */\nexport async function listModels(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ models: ModelInfo[] }>> {\n return flowstackFetch(`/models?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n/**\n * Get model details\n */\nexport async function getModel(\n credentials: FlowstackCredentials,\n workspaceId: string,\n modelName: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ model: ModelInfo }>> {\n return flowstackFetch(`/models/${modelName}?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Script Operations\n// =============================================================================\n\n/**\n * List scripts in a workspace\n */\nexport async function listScripts(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ scripts: ScriptInfo[] }>> {\n return flowstackFetch(`/scripts/detailed?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Data Source Operations\n// =============================================================================\n\n/**\n * List data sources\n */\nexport async function listDataSources(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig,\n options?: {\n /**\n * P0-69: when true, appends `include_provenance=true` so the backend\n * returns the `_flowstack` workspace attribution envelope on every\n * data source. Required for built apps that need to know which\n * workspace a shared data source belongs to.\n */\n includeProvenance?: boolean;\n },\n): Promise<ApiResponse<{ datasources: DataSource[] }>> {\n const qs = options?.includeProvenance ? '?include_provenance=true' : '';\n return flowstackFetch(`/data-sources${qs}`, {\n credentials,\n }, config);\n}\n\n/**\n * Create a data source\n */\nexport async function createDataSource(\n credentials: FlowstackCredentials,\n sourceConfig: DataSourceConfig,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<DataSource>> {\n return flowstackFetch('/data-sources', {\n method: 'POST',\n credentials,\n body: {\n source_type: sourceConfig.type,\n name: sourceConfig.name,\n auth_method: sourceConfig.auth_method || 'connection_string',\n credentials: sourceConfig.credentials || {\n connection_string: sourceConfig.connectionString,\n },\n metadata: sourceConfig.metadata,\n is_tenant_wide: sourceConfig.is_tenant_wide || false,\n },\n }, config);\n}\n\n/**\n * Test a data source connection\n */\nexport async function testDataSource(\n credentials: FlowstackCredentials,\n sourceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<ConnectionTestResult>> {\n return flowstackFetch(`/data-sources/${sourceId}/test`, {\n method: 'POST',\n credentials,\n }, config);\n}\n\n/**\n * Delete a data source\n */\nexport async function deleteDataSource(\n credentials: FlowstackCredentials,\n sourceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/data-sources/${sourceId}`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Agent Discovery\n// =============================================================================\n\n/**\n * List available agents with descriptions and capabilities.\n * No credentials required — this is a public capability catalog.\n */\nexport async function listAgents(\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ agents: AgentInfo[]; count: number; workflows: any[] }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n\n try {\n const response = await fetch(`${baseUrl}/agents`, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return { ok: false, status: response.status, error: errorText };\n }\n\n const data = await response.json();\n return { ok: true, status: response.status, data };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Failed to fetch agents',\n };\n }\n}\n\n// =============================================================================\n// Query Execution\n// =============================================================================\n\n/**\n * Execute a streaming query\n * Returns the Response object for SSE streaming\n */\nexport async function executeQuery(\n credentials: FlowstackCredentials,\n query: string,\n workspaceId: string,\n options?: {\n networkMode?: 'SANDBOX' | 'PUBLIC';\n tools?: string[];\n /** @deprecated P0-73: Strands swarm removed. Use `capabilities` instead. */\n targetAgent?: string;\n /** @deprecated P0-73: Strands swarm removed. Use `capabilities` instead. */\n targetAgents?: string[];\n /** P0-80: meta-tool categories to pre-load on the server so the agent\n * has the right tools available from turn 1. Values: 'site_operations',\n * 'data_access', 'external_integration', 'code_execution',\n * 'domain_task', 'workspace_management'. */\n capabilities?: string[];\n /** Session ID for conversation continuity */\n sessionId?: string;\n /**\n * When true, backend generates a new session key (appends timestamp to\n * the deterministic hash) so end-users of built apps get a fresh\n * conversation on the backend, not just cleared frontend state.\n */\n forceNewSession?: boolean;\n },\n config?: FlowstackClientConfig\n): Promise<Response> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n const response = await fetch(`${baseUrl}/stream`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n 'Accept': 'text/event-stream',\n },\n body: JSON.stringify({\n query,\n workspace_id: workspaceId,\n session_id: options?.sessionId || undefined,\n force_new_session: options?.forceNewSession || undefined,\n tenant_id: tenantId,\n user_id: credentials.userId,\n code_interpreter_network_mode: options?.networkMode || 'SANDBOX',\n // P0-80: capabilities replaces target_agents on the wire. Deprecated\n // target_agents/target_agent are intentionally NOT forwarded — they\n // were no-ops post-P0-73 and forwarding them just added noise to logs.\n capabilities: options?.capabilities && options.capabilities.length > 0\n ? options.capabilities\n : undefined,\n }),\n });\n\n if (!response.ok) {\n // 402 Payment Required → out of credits. Throw a typed error that Casino's\n // useAgent hook can catch and surface via the CreditGate modal.\n if (response.status === 402) {\n let body: any = {};\n try { body = await response.json(); } catch {}\n const err = new Error(body?.message || 'Out of credits — top up to continue');\n (err as any).status = 402;\n (err as any).code = 'INSUFFICIENT_CREDITS';\n (err as any).body = body;\n throw err;\n }\n // Other failures — try to parse the body for a meaningful message\n let detail = response.statusText;\n try {\n const body = await response.json();\n detail = body?.detail || body?.error || body?.message || detail;\n } catch {}\n throw new Error(`Query failed: ${detail}`);\n }\n\n return response;\n}\n\n/**\n * Execute a streaming query with custom agent configuration\n *\n * Extends executeQuery to support system prompt overrides, tool whitelists,\n * and direct agent targeting.\n */\nexport async function executeQueryWithConfig(\n credentials: FlowstackCredentials,\n query: string,\n workspaceId: string,\n options?: {\n networkMode?: 'SANDBOX' | 'PUBLIC';\n systemPrompt?: string;\n tools?: string[];\n /** @deprecated P0-73: Strands swarm removed. Use `capabilities` instead. */\n targetAgent?: string;\n /** @deprecated P0-73: Strands swarm removed. Use `capabilities` instead. */\n targetAgents?: string[];\n /** P0-80: meta-tool categories to pre-load on the server. */\n capabilities?: string[];\n /** P0-132 (G4): target a specific registered persona/subagent by name. Sent\n * as `target_agents` on the wire so multi-persona apps can pick a persona\n * instead of always hitting the auto-selected first subagent. This is the\n * supported persona-selection path — distinct from the deprecated Strands\n * swarm `targetAgent(s)` fields above. */\n persona?: string;\n /** Session ID for conversation continuity */\n sessionId?: string;\n /** P0-57: Per-request PII allowlist — terms the user explicitly allowed */\n allowedTerms?: string[];\n /** Force backend to create a new conversation (appends timestamp to session hash) */\n forceNewSession?: boolean;\n },\n config?: FlowstackClientConfig\n): Promise<Response> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n const response = await fetch(`${baseUrl}/stream`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n 'Accept': 'text/event-stream',\n },\n body: JSON.stringify({\n query,\n workspace_id: workspaceId,\n session_id: options?.sessionId || undefined,\n force_new_session: options?.forceNewSession || undefined,\n tenant_id: tenantId,\n user_id: credentials.userId,\n code_interpreter_network_mode: options?.networkMode || 'SANDBOX',\n // P0-80: capabilities replaces target_agents on the wire.\n capabilities: options?.capabilities && options.capabilities.length > 0\n ? options.capabilities\n : undefined,\n system_prompt_override: options?.systemPrompt,\n tool_whitelist: options?.tools,\n allowed_terms: options?.allowedTerms || undefined,\n // P0-132 (G4): persona selection → target_agents. The backend persona\n // resolver honors request.target_agents and otherwise auto-selects the\n // first registered subagent. Only sent when a persona is requested.\n target_agents: options?.persona ? [options.persona] : undefined,\n }),\n });\n\n if (!response.ok) {\n // Surface the structured error body instead of discarding it. The credit\n // gate (402) returns { code, error, deposited_wei, wallet_wei, needs_deposit,\n // required_wei, credit_cost, ... }; FastAPI validation/other errors return\n // { detail: ... }. Attach code/status/fields so callers can react (e.g. show\n // a deposit shortcut) rather than rendering a bare \"Query failed\".\n let message = response.statusText || 'request failed';\n let code: string | undefined;\n let body: any;\n try {\n body = await response.clone().json();\n const payload = (body && typeof body === 'object' && 'detail' in body && typeof body.detail === 'object')\n ? body.detail\n : body;\n if (payload && typeof payload === 'object') {\n code = payload.code;\n message = payload.error || payload.message || payload.detail || message;\n } else if (typeof payload === 'string') {\n message = payload;\n }\n } catch {\n /* non-JSON error body — keep statusText */\n }\n const err = new Error(`Query failed: ${message}`) as Error & {\n status?: number;\n code?: string;\n body?: unknown;\n };\n err.status = response.status;\n err.code = code;\n err.body = body;\n throw err;\n }\n\n return response;\n}\n\n// =============================================================================\n// Collections — Direct MongoDB Read Access\n// =============================================================================\n\n/**\n * Query a MongoDB collection directly (for useCollection hook).\n *\n * Requires app_scope in JWT — only built-app users can use this.\n * Collection name is auto-prefixed with app_scope by the backend.\n */\nexport async function queryCollection<T = Record<string, any>>(\n credentials: FlowstackCredentials,\n collection: string,\n options?: {\n filter?: Record<string, any>;\n limit?: number;\n skip?: number;\n sort?: Record<string, 1 | -1>;\n projection?: Record<string, 0 | 1>;\n layer?: CollectionLayer;\n /**\n * P0-69: when true, appends `include_provenance=true` so the backend\n * returns the `_flowstack` workspace attribution envelope on every\n * document. Backend strips the envelope when this param is absent.\n */\n includeProvenance?: boolean;\n },\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ documents: T[]; count: number; total: number }>> {\n const params = new URLSearchParams();\n params.set('collection', collection);\n if (options?.filter) params.set('filter', JSON.stringify(options.filter));\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.skip) params.set('skip', String(options.skip));\n if (options?.sort) params.set('sort', JSON.stringify(options.sort));\n if (options?.projection) params.set('projection', JSON.stringify(options.projection));\n if (options?.layer) params.set('layer', options.layer);\n if (options?.includeProvenance) params.set('include_provenance', 'true');\n\n return flowstackFetch<{ documents: T[]; count: number; total: number }>(\n `/collections/query?${params.toString()}`,\n { credentials },\n config,\n );\n}\n\n/**\n * Insert one or more documents into a MongoDB collection.\n *\n * Requires app_scope in JWT — only built-app users can use this.\n * Collection name is auto-prefixed with app_scope by the backend.\n */\nexport async function insertDocuments(\n credentials: FlowstackCredentials,\n collection: string,\n documents: Record<string, any> | Record<string, any>[],\n config?: FlowstackClientConfig,\n layer?: CollectionLayer,\n): Promise<ApiResponse<{ inserted_count: number; inserted_ids: string[]; collection: string }>> {\n const isArray = Array.isArray(documents);\n return flowstackFetch<{ inserted_count: number; inserted_ids: string[]; collection: string }>(\n '/collections/insert',\n {\n method: 'POST',\n credentials,\n body: {\n collection,\n ...(isArray ? { documents } : { document: documents }),\n ...(layer ? { layer } : {}),\n },\n },\n config,\n );\n}\n\n/**\n * Update documents in a MongoDB collection matching the filter.\n *\n * Requires app_scope in JWT — only built-app users can use this.\n * Collection name is auto-prefixed with app_scope by the backend.\n */\nexport async function updateDocuments(\n credentials: FlowstackCredentials,\n collection: string,\n filter: Record<string, any>,\n update: Record<string, any>,\n options?: { upsert?: boolean },\n config?: FlowstackClientConfig,\n layer?: CollectionLayer,\n): Promise<ApiResponse<{ matched_count: number; modified_count: number; collection: string }>> {\n return flowstackFetch<{ matched_count: number; modified_count: number; collection: string }>(\n '/collections/update',\n {\n method: 'POST',\n credentials,\n body: {\n collection,\n filter,\n update,\n upsert: options?.upsert ?? false,\n ...(layer ? { layer } : {}),\n },\n },\n config,\n );\n}\n\n/**\n * Delete documents from a MongoDB collection matching the filter.\n *\n * Requires app_scope in JWT — only built-app users can use this.\n * Collection name is auto-prefixed with app_scope by the backend.\n */\nexport async function deleteDocuments(\n credentials: FlowstackCredentials,\n collection: string,\n filter: Record<string, any>,\n config?: FlowstackClientConfig,\n layer?: CollectionLayer,\n): Promise<ApiResponse<{ deleted_count: number; collection: string }>> {\n return flowstackFetch<{ deleted_count: number; collection: string }>(\n '/collections/delete',\n {\n method: 'POST',\n credentials,\n body: {\n collection,\n filter,\n ...(layer ? { layer } : {}),\n },\n },\n config,\n );\n}\n\n// =============================================================================\n// Private Messaging (P0-138)\n// =============================================================================\n//\n// Server-mediated, ACL'd, key-addressed direct messages between two app users.\n// The backend pins `from` to the caller's JWT identity, gates sends on a\n// mutually-consented thread, and ACLs reads to thread participants — neither\n// party ever learns the other's contact.\n//\n// Message bodies are UNTRUSTED user input. Render them as plain text / sanitized\n// markdown only — never as raw HTML (no dangerouslySetInnerHTML). If a body is\n// ever passed to an agent, treat it as data, not instructions.\n\nexport interface DmMessage {\n message_id: string;\n from: string;\n to: string;\n /** UNTRUSTED user input — render as text, never raw HTML. */\n body: string;\n created_at: string;\n read_at: string | null;\n}\n\nexport interface DmThread {\n pair_key: string;\n with_user_key: string;\n status: 'pending' | 'open';\n last_message: DmMessage | null;\n unread_count: number;\n updated_at: string | null;\n}\n\n/**\n * Deterministic, order-independent thread key for a pair of user keys.\n * Mirrors the backend's `pair_key` (sorted, '::'-joined).\n */\nexport function dmPairKey(a: string, b: string): string {\n return [a, b].sort().join('::');\n}\n\nfunction requireAppScope(config?: FlowstackClientConfig): string {\n const scope = config?.appScope;\n if (!scope) {\n throw new Error('Private messaging requires an app scope (built-app context).');\n }\n return scope;\n}\n\n/** List the caller's threads (counterpart key, last message, unread count). */\nexport async function listThreads(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ threads: DmThread[]; count: number }>> {\n const scope = requireAppScope(config);\n return flowstackFetch<{ threads: DmThread[]; count: number }>(\n `/apps/${encodeURIComponent(scope)}/threads`,\n { credentials },\n config,\n );\n}\n\n/** List messages in the caller's thread with `withUserKey`. ACL'd server-side. */\nexport async function listMessages(\n credentials: FlowstackCredentials,\n withUserKey: string,\n options?: { limit?: number; before?: string },\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ messages: DmMessage[]; count: number }>> {\n const scope = requireAppScope(config);\n const params = new URLSearchParams();\n params.set('with', withUserKey);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.before) params.set('before', options.before);\n return flowstackFetch<{ messages: DmMessage[]; count: number }>(\n `/apps/${encodeURIComponent(scope)}/messages?${params.toString()}`,\n { credentials },\n config,\n );\n}\n\n/** Send a message to `toUserKey`. 403 unless the thread is mutually open. */\nexport async function sendMessage(\n credentials: FlowstackCredentials,\n toUserKey: string,\n body: string,\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ message_id: string; created_at: string }>> {\n const scope = requireAppScope(config);\n return flowstackFetch<{ message_id: string; created_at: string }>(\n `/apps/${encodeURIComponent(scope)}/messages`,\n { method: 'POST', credentials, body: { to_user_key: toUserKey, body } },\n config,\n );\n}\n\n/**\n * Record the caller's consent to open a thread with `withUserKey`.\n * The thread becomes `open` (sendable) only once BOTH parties have consented.\n */\nexport async function openThread(\n credentials: FlowstackCredentials,\n withUserKey: string,\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ pair_key: string; status: string }>> {\n const scope = requireAppScope(config);\n const me = credentials.userId;\n if (!me) throw new Error('openThread requires an authenticated user.');\n const pk = dmPairKey(me, withUserKey);\n return flowstackFetch<{ pair_key: string; status: string }>(\n `/apps/${encodeURIComponent(scope)}/threads/${encodeURIComponent(pk)}/consent`,\n { method: 'POST', credentials },\n config,\n );\n}\n\n/** Mark a received message as read (recipient only). */\nexport async function markMessageRead(\n credentials: FlowstackCredentials,\n messageId: string,\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ message_id: string; read: boolean }>> {\n const scope = requireAppScope(config);\n return flowstackFetch<{ message_id: string; read: boolean }>(\n `/apps/${encodeURIComponent(scope)}/messages/${encodeURIComponent(messageId)}/read`,\n { method: 'POST', credentials },\n config,\n );\n}\n\n// =============================================================================\n// Direct Tool Invocation\n// =============================================================================\n\n/**\n * Invoke an agent tool directly (bypasses LLM orchestration).\n */\nexport async function invokeTool<T = any>(\n credentials: FlowstackCredentials,\n agentName: string,\n toolName: string,\n kwargs: Record<string, any> = {},\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ status: string; result: T }>> {\n return flowstackFetch<{ status: string; result: T }>(\n '/tool/invoke',\n {\n method: 'POST',\n credentials,\n body: {\n agent_name: agentName,\n tool_name: toolName,\n kwargs,\n },\n },\n config,\n );\n}\n\n// =============================================================================\n// File Upload\n// =============================================================================\n\n/**\n * Upload a file to a workspace\n */\nexport async function uploadFile(\n credentials: FlowstackCredentials,\n workspaceId: string,\n file: File,\n name?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ dataset?: DatasetInfo; report?: ReportInfo }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n const formData = new FormData();\n formData.append('file', file);\n formData.append('workspace_id', workspaceId);\n if (name) {\n formData.append('name', name);\n formData.append('dataset_name', name);\n }\n\n try {\n const response = await fetch(`${baseUrl}/upload`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n 'X-Session-ID': workspaceId,\n },\n body: formData,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data,\n };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Upload failed',\n };\n }\n}\n\n/**\n * Upload a document (PDF/DOCX/image/etc.) to a workspace's uploads/ prefix.\n *\n * The two upload routes split by intent: `/upload` parses tabular formats into\n * a queryable DataFrame (dataset); `/upload-document` stores raw bytes for the\n * agent's `ingest_document` / `search_documents` tools. The chat input\n * accepts both kinds of file, so useAgent.query() must pick the right route\n * by extension or the backend 400s with \"Unsupported file type\".\n */\nexport async function uploadDocument(\n credentials: FlowstackCredentials,\n workspaceId: string,\n file: File,\n documentName?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ document_name?: string; filename?: string; format?: string; size_bytes?: number; s3_key?: string }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n const formData = new FormData();\n formData.append('file', file);\n formData.append('workspace_id', workspaceId);\n if (documentName) formData.append('document_name', documentName);\n\n try {\n const response = await fetch(`${baseUrl}/upload-document`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n 'X-Session-ID': workspaceId,\n },\n body: formData,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return { ok: false, status: response.status, error: errorText };\n }\n\n const data = await response.json();\n return { ok: true, status: response.status, data };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Document upload failed',\n };\n }\n}\n\n// =============================================================================\n// Authentication\n// =============================================================================\n\n/**\n * Login to get session token\n */\nexport async function login(\n email: string,\n password: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{\n session_token: string;\n user_id: string;\n access_token?: string;\n}>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n\n try {\n const response = await fetch(`${baseUrl}/auth/user/login`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config?.tenantId ? { 'X-Tenant-ID': config.tenantId } : {}),\n },\n body: JSON.stringify({\n email,\n password,\n ...(config?.appScope ? { app_scope: config.appScope } : {}),\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data,\n };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Login failed',\n };\n }\n}\n\n/**\n * Register a new user\n */\nexport async function register(\n email: string,\n password: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user_id: string; message?: string; session_token?: string; tenant_id?: string }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n\n try {\n const response = await fetch(`${baseUrl}/auth/user/register`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config?.tenantId ? { 'X-Tenant-ID': config.tenantId } : {}),\n },\n body: JSON.stringify({\n email,\n password,\n skip_email_verification: true,\n ...(config?.appScope ? { app_scope: config.appScope } : {}),\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data,\n };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Registration failed',\n };\n }\n}\n\n/**\n * Authenticate via Google OAuth authorization code.\n * Call this from the /api/auth/google/callback route after receiving the code from Google.\n */\nexport async function googleLogin(\n code: string,\n redirectUri: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ session_token: string; user_id: string; tenant_id?: string; expires_at?: string }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n\n try {\n const response = await fetch(`${baseUrl}/auth/google/login`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config?.tenantId ? { 'X-Tenant-ID': config.tenantId } : {}),\n },\n body: JSON.stringify({ code, redirect_uri: redirectUri }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data,\n };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Google login failed',\n };\n }\n}\n\n// =============================================================================\n// User Management Operations\n// =============================================================================\n\n/**\n * List users in the tenant with pagination and filtering\n */\nexport async function listUsers(\n credentials: FlowstackCredentials,\n params?: UserListParams,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<UserListResponse>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n // Build query string\n const queryParams = new URLSearchParams();\n if (params?.page) queryParams.set('page', String(params.page));\n if (params?.limit) queryParams.set('limit', String(params.limit));\n if (params?.search) queryParams.set('search', params.search);\n if (params?.role) queryParams.set('role', params.role);\n if (params?.status) queryParams.set('status', params.status);\n if (params?.sortBy) queryParams.set('sort_by', params.sortBy);\n if (params?.sortOrder) queryParams.set('sort_order', params.sortOrder);\n\n const queryString = queryParams.toString();\n const endpoint = `/tenants/${tenantId}/users${queryString ? `?${queryString}` : ''}`;\n\n return flowstackFetch<UserListResponse>(endpoint, { credentials }, config);\n}\n\n/**\n * Get a single user by ID\n */\nexport async function getUser(\n credentials: FlowstackCredentials,\n userId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user: ManagedUser }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}`, { credentials }, config);\n}\n\n/**\n * Update a user's profile or role\n */\nexport async function updateUser(\n credentials: FlowstackCredentials,\n userId: string,\n updates: UpdateUserRequest,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user: ManagedUser }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}`, {\n method: 'PATCH',\n credentials,\n body: updates,\n }, config);\n}\n\n/**\n * Delete a user permanently\n */\nexport async function deleteUser(\n credentials: FlowstackCredentials,\n userId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n/**\n * Suspend a user account\n */\nexport async function suspendUser(\n credentials: FlowstackCredentials,\n userId: string,\n reason?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user: ManagedUser }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}/suspend`, {\n method: 'POST',\n credentials,\n body: reason ? { reason } : undefined,\n }, config);\n}\n\n/**\n * Reactivate a suspended user account\n */\nexport async function reactivateUser(\n credentials: FlowstackCredentials,\n userId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user: ManagedUser }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}/reactivate`, {\n method: 'POST',\n credentials,\n }, config);\n}\n\n/**\n * Get user activity logs\n */\nexport async function getUserActivity(\n credentials: FlowstackCredentials,\n userId: string,\n limit: number = 50,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ activities: UserActivityLog[] }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}/activity?limit=${limit}`, {\n credentials,\n }, config);\n}\n\n/**\n * Get user statistics for the tenant\n */\nexport async function getUserStats(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<UserStats>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/stats`, { credentials }, config);\n}\n\n/**\n * Check if the current user has admin permissions to manage users\n */\nexport async function checkAdminPermissions(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ canManageUsers: boolean; role: string }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/me/permissions`, { credentials }, config);\n}\n\n// =============================================================================\n// Conversation History\n// =============================================================================\n\n/**\n * Get conversation history for a workspace/session\n */\nexport async function getConversationHistory(\n credentials: FlowstackCredentials,\n workspaceId: string,\n options?: { limit?: number; offset?: number },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ messages: Array<{ role: string; content: string; timestamp: string }> }>> {\n const params = new URLSearchParams();\n params.set('session_id', workspaceId);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n\n return flowstackFetch(\n `/conversations?${params.toString()}`,\n { method: 'GET', credentials },\n config\n );\n}\n\n// =============================================================================\n// Sites — Published websites and CDN management\n// =============================================================================\n\nexport interface CreateSiteParams {\n name: string;\n siteType?: 'on_demand' | 'daily' | 'js_build';\n description?: string;\n files?: Record<string, string>;\n}\n\n/**\n * List all published sites for the current user\n */\nexport async function listSites(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ sites: PublishedSiteInfo[]; count: number }>> {\n return flowstackFetch('/api/v1/sites', { method: 'GET', credentials }, config);\n}\n\n/**\n * Get a single published site by ID\n */\nexport async function getSite(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ site: PublishedSiteInfo }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}`, { method: 'GET', credentials }, config);\n}\n\n/**\n * Create a new site. If files are provided, publishes immediately.\n * Otherwise creates a staging area for incremental file uploads.\n */\nexport async function createSite(\n credentials: FlowstackCredentials,\n params: CreateSiteParams,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ site?: PublishedSiteInfo; site_id?: string; mode?: string }>> {\n return flowstackFetch('/api/v1/sites', {\n method: 'POST',\n credentials,\n body: {\n site_name: params.name,\n site_type: params.siteType || 'on_demand',\n description: params.description,\n files: params.files,\n },\n }, config);\n}\n\n/**\n * Add or update a single file in a site's staging area.\n * Call this for each file, then publishStagedSite() to deploy.\n */\nexport async function addSiteFile(\n credentials: FlowstackCredentials,\n siteId: string,\n filePath: string,\n content: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/files/${filePath}`, {\n method: 'PUT',\n credentials,\n body: { content },\n }, config);\n}\n\n/**\n * Publish a staged site to CDN. Call after adding all files with addSiteFile().\n */\nexport async function publishStagedSite(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ site: PublishedSiteInfo }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/publish`, {\n method: 'POST',\n credentials,\n }, config);\n}\n\n/**\n * Delete a published site and all its files from CDN\n */\nexport async function deleteSite(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Site Versioning\n// =============================================================================\n\nexport async function getSiteVersions(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<SiteVersionManifest>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/versions`, {\n method: 'GET',\n credentials,\n }, config);\n}\n\nexport async function promoteSiteVersion(\n credentials: FlowstackCredentials,\n siteId: string,\n version: number,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<SiteVersionManifest>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/promote`, {\n method: 'POST',\n credentials,\n body: { version },\n }, config);\n}\n\nexport async function deleteSiteVersion(\n credentials: FlowstackCredentials,\n siteId: string,\n version: number,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<SiteVersionManifest>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/versions/${version}`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Site Aliases\n// =============================================================================\n\nexport async function setSiteAlias(\n credentials: FlowstackCredentials,\n siteId: string,\n alias: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ alias: string; url: string }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/alias`, {\n method: 'POST',\n credentials,\n body: { alias },\n }, config);\n}\n\nexport async function removeSiteAlias(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/alias`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Publish to GitHub\n// =============================================================================\n\nexport async function publishToGitHub(\n credentials: FlowstackCredentials,\n siteId: string,\n params: PublishToGitHubParams,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<PublishToGitHubResult>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/publish-github`, {\n method: 'POST',\n credentials,\n body: {\n repo_name: params.repoName,\n private: params.isPrivate ?? true,\n ...(params.version != null ? { version: params.version } : {}),\n },\n }, config);\n}\n\n// =============================================================================\n// GitHub Repository Import\n// =============================================================================\n\nexport async function listGitHubRepos(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ repos: GitHubRepo[] }>> {\n return flowstackFetch('/api/v1/github/repos', {\n credentials,\n }, config);\n}\n\nexport async function importFromGitHub(\n credentials: FlowstackCredentials,\n params: { repoFullName: string; branch?: string; workspaceId?: string },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ files_imported: number }>> {\n return flowstackFetch('/api/v1/github/import', {\n method: 'POST',\n credentials,\n body: params,\n }, config);\n}\n\n// =============================================================================\n// PII Settings\n// =============================================================================\n\nexport async function getPiiSettings(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ settings: PiiSettings }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-settings`, {\n credentials,\n }, config);\n}\n\nexport async function updatePiiSettings(\n credentials: FlowstackCredentials,\n workspaceId: string,\n settings: PiiSettings,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-settings`, {\n method: 'PUT',\n credentials,\n body: settings,\n }, config);\n}\n\n// P0-57: PII preview — detect entities without masking\nexport async function previewPiiMasking(\n credentials: FlowstackCredentials,\n query: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ entities: PiiRedactedEntity[] }>> {\n // Guard: skip if credentials not yet loaded (prevents \"Not enough segments\" 401 spam\n // when built apps call this on mount before Privy has issued a valid token)\n if (!credentials?.apiKey || credentials.apiKey.split('.').length !== 3) {\n return { ok: false, error: 'Not authenticated', status: 401 };\n }\n return flowstackFetch('/stream/pii-preview', {\n method: 'POST',\n credentials,\n body: { query },\n }, config);\n}\n\n// P0-57: PII allowlist CRUD\nexport async function getPiiAllowlist(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ allowlist: Array<{ term: string; entity_type: string }> }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-allowlist`, {\n credentials,\n }, config);\n}\n\nexport async function addPiiAllowlistTerm(\n credentials: FlowstackCredentials,\n workspaceId: string,\n term: string,\n entityType: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean; allowlist: Array<{ term: string; entity_type: string }> }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-allowlist`, {\n method: 'POST',\n credentials,\n body: { term, entity_type: entityType },\n }, config);\n}\n\nexport async function removePiiAllowlistTerm(\n credentials: FlowstackCredentials,\n workspaceId: string,\n term: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean; allowlist: Array<{ term: string; entity_type: string }> }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-allowlist`, {\n method: 'DELETE',\n credentials,\n body: { term },\n }, config);\n}\n\n// =============================================================================\n// User Data Explorer\n// =============================================================================\n\nexport async function getUserDataOverview(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<UserDataOverview>> {\n return flowstackFetch('/api/v1/user/data-overview', {\n credentials,\n }, config);\n}\n\nexport async function getUserCollections(\n credentials: FlowstackCredentials,\n params?: { siteId?: string; includeSchema?: boolean },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ collections: UserCollectionInfo[]; grouped_by_site: Record<string, UserCollectionInfo[]> }>> {\n const query = new URLSearchParams();\n if (params?.siteId) query.set('site_id', params.siteId);\n if (params?.includeSchema) query.set('include_schema', 'true');\n const qs = query.toString();\n return flowstackFetch(`/api/v1/user/collections${qs ? `?${qs}` : ''}`, {\n credentials,\n }, config);\n}\n\nexport async function getUserCollectionDocuments<T = Record<string, any>>(\n credentials: FlowstackCredentials,\n collection: string,\n params?: { filter?: Record<string, any>; limit?: number; skip?: number; sort?: Record<string, 1 | -1>; database?: string },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ documents: T[]; total: number }>> {\n const query = new URLSearchParams();\n if (params?.filter) query.set('filter', JSON.stringify(params.filter));\n if (params?.limit != null) query.set('limit', String(params.limit));\n if (params?.skip != null) query.set('skip', String(params.skip));\n if (params?.sort) query.set('sort', JSON.stringify(params.sort));\n if (params?.database) query.set('database', params.database);\n const qs = query.toString();\n return flowstackFetch(`/api/v1/user/collections/${encodeURIComponent(collection)}/documents${qs ? `?${qs}` : ''}`, {\n credentials,\n }, config);\n}\n\nexport async function getUserCollectionSchema(\n credentials: FlowstackCredentials,\n collection: string,\n params?: { database?: string; sampleSize?: number },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<CollectionSchemaInfo>> {\n const query = new URLSearchParams();\n if (params?.database) query.set('database', params.database);\n if (params?.sampleSize != null) query.set('sample_size', String(params.sampleSize));\n const qs = query.toString();\n return flowstackFetch(`/api/v1/user/collections/${encodeURIComponent(collection)}/schema${qs ? `?${qs}` : ''}`, {\n credentials,\n }, config);\n}\n\nexport async function deleteUserCollection(\n credentials: FlowstackCredentials,\n collection: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ deleted: boolean; collection: string }>> {\n return flowstackFetch(`/api/v1/user/collections/${encodeURIComponent(collection)}?confirm=true`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\nexport async function exportUserCollection(\n credentials: FlowstackCredentials,\n collection: string,\n params?: { format?: 'json' | 'csv'; filter?: Record<string, any>; database?: string },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<Blob>> {\n const query = new URLSearchParams();\n if (params?.database) query.set('database', params.database);\n const qs = query.toString();\n return flowstackFetch(`/api/v1/user/collections/${encodeURIComponent(collection)}/export${qs ? `?${qs}` : ''}`, {\n method: 'POST',\n credentials,\n body: {\n format: params?.format || 'json',\n filter: params?.filter || null,\n },\n }, config);\n}\n","/**\n * Redis Cache Layer for Flowstack SDK\n * Uses Upstash Redis for serverless caching\n */\n\nimport type { FlowstackCredentials, WorkspaceInfo, DatasetInfo, VisualizationData, ReportInfo, PublishedSiteInfo } from '../types';\n\n// Cache TTL constants (in seconds)\nexport const CACHE_TTL = {\n WORKSPACES: 300, // 5 minutes\n DATASETS: 60, // 1 minute\n VISUALIZATIONS: 60, // 1 minute\n REPORTS: 60, // 1 minute\n SITES: 120, // 2 minutes\n MESSAGES: 0, // No expiry\n SESSION: 86400, // 24 hours\n} as const;\n\n// Cache key prefix\nconst NAMESPACE = 'flowstack';\n\n/**\n * Redis client configuration\n */\nexport interface RedisConfig {\n url: string;\n token: string;\n}\n\n/**\n * Create a Redis client for Upstash\n */\nfunction createRedisClient(config: RedisConfig) {\n const { url, token } = config;\n\n return {\n async get<T>(key: string): Promise<T | null> {\n try {\n const response = await fetch(`${url}/get/${key}`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!response.ok) return null;\n const data = await response.json();\n return data.result ? JSON.parse(data.result) : null;\n } catch {\n return null;\n }\n },\n\n async set(key: string, value: unknown, ttl?: number): Promise<boolean> {\n try {\n const body = ttl\n ? ['SET', key, JSON.stringify(value), 'EX', ttl.toString()]\n : ['SET', key, JSON.stringify(value)];\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n return response.ok;\n } catch {\n return false;\n }\n },\n\n async del(key: string): Promise<boolean> {\n try {\n const response = await fetch(`${url}/del/${key}`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${token}` },\n });\n return response.ok;\n } catch {\n return false;\n }\n },\n\n async keys(pattern: string): Promise<string[]> {\n try {\n const response = await fetch(`${url}/keys/${pattern}`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!response.ok) return [];\n const data = await response.json();\n return data.result || [];\n } catch {\n return [];\n }\n },\n };\n}\n\n/**\n * Generate user-scoped cache key\n */\nfunction getCacheKey(\n type: string,\n credentials: FlowstackCredentials,\n ...parts: string[]\n): string {\n const userId = credentials.userId || 'anonymous';\n const tenantId = credentials.tenantId;\n const key = [NAMESPACE, type, tenantId, userId, ...parts].filter(Boolean).join(':');\n return key;\n}\n\n// =============================================================================\n// Workspace Cache\n// =============================================================================\n\nexport async function getCachedWorkspaces(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<WorkspaceInfo[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('workspaces', credentials);\n return client.get<WorkspaceInfo[]>(key);\n}\n\nexport async function setCachedWorkspaces(\n credentials: FlowstackCredentials,\n workspaces: WorkspaceInfo[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('workspaces', credentials);\n return client.set(key, workspaces, CACHE_TTL.WORKSPACES);\n}\n\nexport async function invalidateWorkspacesCache(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('workspaces', credentials);\n return client.del(key);\n}\n\n// =============================================================================\n// Dataset Cache\n// =============================================================================\n\nexport async function getCachedDatasets(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<DatasetInfo[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('datasets', credentials, workspaceId);\n return client.get<DatasetInfo[]>(key);\n}\n\nexport async function setCachedDatasets(\n credentials: FlowstackCredentials,\n workspaceId: string,\n datasets: DatasetInfo[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('datasets', credentials, workspaceId);\n return client.set(key, datasets, CACHE_TTL.DATASETS);\n}\n\nexport async function invalidateDatasetsCache(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('datasets', credentials, workspaceId);\n return client.del(key);\n}\n\n// =============================================================================\n// Visualization Cache\n// =============================================================================\n\nexport async function getCachedVisualizations(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<VisualizationData[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('visualizations', credentials, workspaceId);\n return client.get<VisualizationData[]>(key);\n}\n\nexport async function setCachedVisualizations(\n credentials: FlowstackCredentials,\n workspaceId: string,\n visualizations: VisualizationData[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('visualizations', credentials, workspaceId);\n return client.set(key, visualizations, CACHE_TTL.VISUALIZATIONS);\n}\n\nexport async function invalidateVisualizationsCache(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('visualizations', credentials, workspaceId);\n return client.del(key);\n}\n\n// =============================================================================\n// Report Cache\n// =============================================================================\n\nexport async function getCachedReports(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<ReportInfo[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('reports', credentials, workspaceId);\n return client.get<ReportInfo[]>(key);\n}\n\nexport async function setCachedReports(\n credentials: FlowstackCredentials,\n workspaceId: string,\n reports: ReportInfo[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('reports', credentials, workspaceId);\n return client.set(key, reports, CACHE_TTL.REPORTS);\n}\n\nexport async function invalidateReportsCache(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('reports', credentials, workspaceId);\n return client.del(key);\n}\n\n// =============================================================================\n// Bulk Invalidation\n// =============================================================================\n\n/**\n * Invalidate all workspace artifacts (datasets, visualizations, reports)\n */\nexport async function invalidateWorkspaceArtifacts(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<void> {\n await Promise.all([\n invalidateDatasetsCache(credentials, workspaceId, config),\n invalidateVisualizationsCache(credentials, workspaceId, config),\n invalidateReportsCache(credentials, workspaceId, config),\n ]);\n}\n\n/**\n * Invalidate all user cache\n */\nexport async function invalidateAllUserCache(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<void> {\n const client = createRedisClient(config);\n const userId = credentials.userId || 'anonymous';\n const tenantId = credentials.tenantId;\n const pattern = `${NAMESPACE}:*:${tenantId}:${userId}:*`;\n\n const keys = await client.keys(pattern);\n await Promise.all(keys.map(key => client.del(key)));\n}\n\n// =============================================================================\n// Generic Cache Operations\n// =============================================================================\n\n/**\n * Get a cached value\n */\nexport async function getCached<T>(\n key: string,\n config: RedisConfig\n): Promise<T | null> {\n const client = createRedisClient(config);\n return client.get<T>(`${NAMESPACE}:${key}`);\n}\n\n/**\n * Set a cached value\n */\nexport async function setCached<T>(\n key: string,\n value: T,\n ttl: number,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n return client.set(`${NAMESPACE}:${key}`, value, ttl);\n}\n\n/**\n * Delete a cached value\n */\nexport async function deleteCached(\n key: string,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n return client.del(`${NAMESPACE}:${key}`);\n}\n\n// =============================================================================\n// Sites Cache\n// =============================================================================\n\nexport async function getCachedSites(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<PublishedSiteInfo[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('sites', credentials);\n return client.get<PublishedSiteInfo[]>(key);\n}\n\nexport async function setCachedSites(\n credentials: FlowstackCredentials,\n sites: PublishedSiteInfo[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('sites', credentials);\n return client.set(key, sites, CACHE_TTL.SITES);\n}\n\nexport async function invalidateSitesCache(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('sites', credentials);\n return client.del(key);\n}\n"]}
@@ -410,7 +410,7 @@ interface StreamEvent {
410
410
  message?: string;
411
411
  percentage?: number;
412
412
  }
413
- type StreamEventType = 'content' | 'text' | 'delta' | 'metadata' | 'tool_call' | 'tool_use' | 'tool_result' | 'visualization' | 'progress' | 'credit_status' | 'budget_update' | 'complete' | 'done' | 'error' | 'interrupt';
413
+ type StreamEventType = 'content' | 'text' | 'delta' | 'metadata' | 'tool_call' | 'tool_use' | 'tool_result' | 'visualization' | 'progress' | 'stage' | 'credit_status' | 'budget_update' | 'complete' | 'done' | 'error' | 'interrupt';
414
414
  interface InterruptInfo {
415
415
  reason: string;
416
416
  timestamp?: number;
@@ -410,7 +410,7 @@ interface StreamEvent {
410
410
  message?: string;
411
411
  percentage?: number;
412
412
  }
413
- type StreamEventType = 'content' | 'text' | 'delta' | 'metadata' | 'tool_call' | 'tool_use' | 'tool_result' | 'visualization' | 'progress' | 'credit_status' | 'budget_update' | 'complete' | 'done' | 'error' | 'interrupt';
413
+ type StreamEventType = 'content' | 'text' | 'delta' | 'metadata' | 'tool_call' | 'tool_use' | 'tool_result' | 'visualization' | 'progress' | 'stage' | 'credit_status' | 'budget_update' | 'complete' | 'done' | 'error' | 'interrupt';
414
414
  interface InterruptInfo {
415
415
  reason: string;
416
416
  timestamp?: number;
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React, { ReactNode } from 'react';
3
- import { F as FlowstackConfig, a as FlowstackContextValue, U as UseAuthReturn, b as UseWorkspaceReturn, c as UseDatasetsReturn, d as UseVisualizationsReturn, e as UseReportsReturn, f as UseModelsReturn, g as UseDataSourcesReturn, A as AgentTemplate, h as UseAgentOptions, i as UseAgentReturn, j as UseQueryReturn, C as ChatMessage, T as ToolCall, k as UseUserManagementReturn, l as UseSitesReturn, m as UseAgentsReturn, n as CollectionLayer, D as DmThread, o as DmMessage, p as UseSiteVersionsReturn, P as ProviderCredential, q as PurposeInfo, L as LLMProvider, r as ProviderModelSettings, O as OllamaLocalModel, s as OllamaStatus, t as UserDataOverview, u as UserCollectionInfo, v as CollectionSchemaInfo, w as FlowstackCredentials, x as User, W as WorkspaceInfo, y as DatasetInfo, V as VisualizationData, z as DataSource, M as ManagedUser, B as UserStats, E as UserActivityLog, G as DataSourceBadgeInfo, S as StreamEvent, H as AgentConfig, I as ModelPreferenceState, J as ModelOption, K as AdminProviderCredential, N as ExistingProviderCredential, Q as CreateAdminProviderCredentialInput, R as FlowstackClientConfig } from './index-CUyJ5c2d.mjs';
4
- export { as as AgentInfo, aF as ApiResponse, a0 as AuthConfig, bU as CACHE_TTL, $ as COLLECTION_LAYERS, Y as CREDENTIAL_PURPOSES, ab as ColumnSchema, aj as ConnectionTestResult, au as CreateSiteParams, a9 as CreateWorkspaceRequest, az as CredentialPurpose, ar as CreditStatus, Z as DEFAULT_PROVIDER_MODEL_SETTINGS, ai as DataSourceConfig, ah as DataSourceType, a2 as DatabaseConfig, aa as DatasetPreview, ac as DatasetRow, ad as DatasetStreamOptions, aB as GitHubRepo, a7 as GoogleAuthResponse, an as InterruptInfo, X as LLM_PROVIDERS, aG as ListResponse, a3 as LoginRequest, a4 as LoginResponse, af as ModelInfo, aD as PiiEntitySettings, aE as PiiRedactedEntity, aC as PiiSettings, ax as PublishToGitHubParams, ay as PublishToGitHubResult, at as PublishedSiteInfo, ao as QueryOptions, a1 as RedisConfig, a5 as RegisterRequest, a6 as RegisterResponse, ae as ReportInfo, bT as RequestOptions, ag as ScriptInfo, ak as SearchResult, al as SearchResultsData, a8 as SessionState, av as SiteVersion, aw as SiteVersionManifest, am as StreamEventType, aK as UpdateUserRequest, aq as UsagePeriod, ap as UsageStats, aJ as UserActivityType, aA as UserDataOverviewWorkspace, aL as UserListParams, aM as UserListResponse, aH as UserRole, aI as UserStatus, bL as addPiiAllowlistTerm, bm as addSiteFile, bg as checkAdminPermissions, a$ as createDataSource, bl as createSite, aP as createWorkspace, cc as deleteCached, b1 as deleteDataSource, aU as deleteDataset, bx as deleteDocuments, bo as deleteSite, br as deleteSiteVersion, bb as deleteUser, bR as deleteUserCollection, bD as dmPairKey, b2 as executeQuery, b3 as executeQueryWithConfig, bS as exportUserCollection, aN as flowstackFetch, ca as getCached, bY as getCachedDatasets, c2 as getCachedReports, c7 as getCachedSites, b$ as getCachedVisualizations, bV as getCachedWorkspaces, bh as getConversationHistory, aS as getDataset, aT as getDatasetPreview, aZ as getModel, bK as getPiiAllowlist, bH as getPiiSettings, bk as getSite, bp as getSiteVersions, b9 as getUser, be as getUserActivity, bP as getUserCollectionDocuments, bQ as getUserCollectionSchema, bO as getUserCollections, bN as getUserDataOverview, bf as getUserStats, aQ as getWorkspace, b7 as googleLogin, bG as importFromGitHub, bv as insertDocuments, c6 as invalidateAllUserCache, b_ as invalidateDatasetsCache, c4 as invalidateReportsCache, c9 as invalidateSitesCache, c1 as invalidateVisualizationsCache, c5 as invalidateWorkspaceArtifacts, bX as invalidateWorkspacesCache, bE as invokeTool, _ as isProviderCredential, bi as listAgents, a_ as listDataSources, aR as listDatasets, bF as listGitHubRepos, bz as listMessages, aX as listModels, aW as listReports, aY as listScripts, bj as listSites, by as listThreads, b8 as listUsers, aV as listVisualizations, aO as listWorkspaces, b5 as login, bC as markMessageRead, bB as openThread, bJ as previewPiiMasking, bq as promoteSiteVersion, bn as publishStagedSite, bu as publishToGitHub, bd as reactivateUser, b6 as register, bM as removePiiAllowlistTerm, bt as removeSiteAlias, bA as sendMessage, cb as setCached, bZ as setCachedDatasets, c3 as setCachedReports, c8 as setCachedSites, c0 as setCachedVisualizations, bW as setCachedWorkspaces, bs as setSiteAlias, bc as suspendUser, b0 as testDataSource, bw as updateDocuments, bI as updatePiiSettings, ba as updateUser, b4 as uploadFile } from './index-CUyJ5c2d.mjs';
3
+ import { F as FlowstackConfig, a as FlowstackContextValue, U as UseAuthReturn, b as UseWorkspaceReturn, c as UseDatasetsReturn, d as UseVisualizationsReturn, e as UseReportsReturn, f as UseModelsReturn, g as UseDataSourcesReturn, A as AgentTemplate, h as UseAgentOptions, i as UseAgentReturn, j as UseQueryReturn, C as ChatMessage, T as ToolCall, k as UseUserManagementReturn, l as UseSitesReturn, m as UseAgentsReturn, n as CollectionLayer, D as DmThread, o as DmMessage, p as UseSiteVersionsReturn, P as ProviderCredential, q as PurposeInfo, L as LLMProvider, r as ProviderModelSettings, O as OllamaLocalModel, s as OllamaStatus, t as UserDataOverview, u as UserCollectionInfo, v as CollectionSchemaInfo, w as FlowstackCredentials, x as User, W as WorkspaceInfo, y as DatasetInfo, V as VisualizationData, z as DataSource, M as ManagedUser, B as UserStats, E as UserActivityLog, G as DataSourceBadgeInfo, S as StreamEvent, H as AgentConfig, I as ModelPreferenceState, J as ModelOption, K as AdminProviderCredential, N as ExistingProviderCredential, Q as CreateAdminProviderCredentialInput, R as FlowstackClientConfig } from './index-B80bPIPw.mjs';
4
+ export { as as AgentInfo, aF as ApiResponse, a0 as AuthConfig, bU as CACHE_TTL, $ as COLLECTION_LAYERS, Y as CREDENTIAL_PURPOSES, ab as ColumnSchema, aj as ConnectionTestResult, au as CreateSiteParams, a9 as CreateWorkspaceRequest, az as CredentialPurpose, ar as CreditStatus, Z as DEFAULT_PROVIDER_MODEL_SETTINGS, ai as DataSourceConfig, ah as DataSourceType, a2 as DatabaseConfig, aa as DatasetPreview, ac as DatasetRow, ad as DatasetStreamOptions, aB as GitHubRepo, a7 as GoogleAuthResponse, an as InterruptInfo, X as LLM_PROVIDERS, aG as ListResponse, a3 as LoginRequest, a4 as LoginResponse, af as ModelInfo, aD as PiiEntitySettings, aE as PiiRedactedEntity, aC as PiiSettings, ax as PublishToGitHubParams, ay as PublishToGitHubResult, at as PublishedSiteInfo, ao as QueryOptions, a1 as RedisConfig, a5 as RegisterRequest, a6 as RegisterResponse, ae as ReportInfo, bT as RequestOptions, ag as ScriptInfo, ak as SearchResult, al as SearchResultsData, a8 as SessionState, av as SiteVersion, aw as SiteVersionManifest, am as StreamEventType, aK as UpdateUserRequest, aq as UsagePeriod, ap as UsageStats, aJ as UserActivityType, aA as UserDataOverviewWorkspace, aL as UserListParams, aM as UserListResponse, aH as UserRole, aI as UserStatus, bL as addPiiAllowlistTerm, bm as addSiteFile, bg as checkAdminPermissions, a$ as createDataSource, bl as createSite, aP as createWorkspace, cc as deleteCached, b1 as deleteDataSource, aU as deleteDataset, bx as deleteDocuments, bo as deleteSite, br as deleteSiteVersion, bb as deleteUser, bR as deleteUserCollection, bD as dmPairKey, b2 as executeQuery, b3 as executeQueryWithConfig, bS as exportUserCollection, aN as flowstackFetch, ca as getCached, bY as getCachedDatasets, c2 as getCachedReports, c7 as getCachedSites, b$ as getCachedVisualizations, bV as getCachedWorkspaces, bh as getConversationHistory, aS as getDataset, aT as getDatasetPreview, aZ as getModel, bK as getPiiAllowlist, bH as getPiiSettings, bk as getSite, bp as getSiteVersions, b9 as getUser, be as getUserActivity, bP as getUserCollectionDocuments, bQ as getUserCollectionSchema, bO as getUserCollections, bN as getUserDataOverview, bf as getUserStats, aQ as getWorkspace, b7 as googleLogin, bG as importFromGitHub, bv as insertDocuments, c6 as invalidateAllUserCache, b_ as invalidateDatasetsCache, c4 as invalidateReportsCache, c9 as invalidateSitesCache, c1 as invalidateVisualizationsCache, c5 as invalidateWorkspaceArtifacts, bX as invalidateWorkspacesCache, bE as invokeTool, _ as isProviderCredential, bi as listAgents, a_ as listDataSources, aR as listDatasets, bF as listGitHubRepos, bz as listMessages, aX as listModels, aW as listReports, aY as listScripts, bj as listSites, by as listThreads, b8 as listUsers, aV as listVisualizations, aO as listWorkspaces, b5 as login, bC as markMessageRead, bB as openThread, bJ as previewPiiMasking, bq as promoteSiteVersion, bn as publishStagedSite, bu as publishToGitHub, bd as reactivateUser, b6 as register, bM as removePiiAllowlistTerm, bt as removeSiteAlias, bA as sendMessage, cb as setCached, bZ as setCachedDatasets, c3 as setCachedReports, c8 as setCachedSites, c0 as setCachedVisualizations, bW as setCachedWorkspaces, bs as setSiteAlias, bc as suspendUser, b0 as testDataSource, bw as updateDocuments, bI as updatePiiSettings, ba as updateUser, b4 as uploadFile } from './index-B80bPIPw.mjs';
5
5
  export { h as AppAccessStatus, A as AppPaywallProps, e as UseAppAccessReturn } from './types-BmCPwbGH.mjs';
6
6
 
7
7
  /**