@blinkdotnew/sdk 0.4.2 β 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +114 -2
- package/dist/index.d.mts +15 -3
- package/dist/index.d.ts +15 -3
- package/dist/index.js +32 -4
- package/dist/index.mjs +32 -4
- package/package.json +5 -2
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -52,6 +52,10 @@ const text = await blink.data.extractFromUrl("https://example.com/document.pdf")
|
|
|
52
52
|
const { markdown, metadata, links } = await blink.data.scrape("https://competitor.com")
|
|
53
53
|
const screenshotUrl = await blink.data.screenshot("https://competitor.com")
|
|
54
54
|
|
|
55
|
+
// Web search (get real-time information)
|
|
56
|
+
const searchResults = await blink.data.search("chatgpt latest news", { type: 'news' })
|
|
57
|
+
const localResults = await blink.data.search("best restaurants", { location: "San Francisco,CA,United States" })
|
|
58
|
+
|
|
55
59
|
// Secure API proxy (call external APIs with secret substitution)
|
|
56
60
|
const response = await blink.data.fetch({
|
|
57
61
|
url: "https://api.sendgrid.com/v3/mail/send",
|
|
@@ -84,7 +88,7 @@ This SDK powers every Blink-generated app with:
|
|
|
84
88
|
- **π Authentication**: JWT-based auth with automatic token management
|
|
85
89
|
- **ποΈ Database**: PostgREST-compatible CRUD operations with advanced filtering
|
|
86
90
|
- **π€ AI**: Text generation with web search, object generation, image creation, speech synthesis, and transcription
|
|
87
|
-
- **π Data**: Extract text content from documents, secure API proxy with secret substitution, web scraping, and
|
|
91
|
+
- **π Data**: Extract text content from documents, secure API proxy with secret substitution, web scraping, screenshots, and web search
|
|
88
92
|
- **π Storage**: File upload, download, and management
|
|
89
93
|
- **π Universal**: Works on client-side and server-side
|
|
90
94
|
- **π± Framework Agnostic**: React, Vue, Svelte, vanilla JS, Node.js, Deno
|
|
@@ -329,8 +333,58 @@ const fullPageUrl = await blink.data.screenshot('https://example.com', {
|
|
|
329
333
|
height: 1080
|
|
330
334
|
});
|
|
331
335
|
|
|
336
|
+
// π₯ Web Search (NEW!) - Google search results with clean structure
|
|
337
|
+
// Perfect for getting real-time information and current data
|
|
338
|
+
|
|
339
|
+
// Basic web search - just provide a query
|
|
340
|
+
const searchResults = await blink.data.search('chatgpt');
|
|
341
|
+
console.log(searchResults.organic_results); // Main search results
|
|
342
|
+
console.log(searchResults.related_searches); // Related search suggestions
|
|
343
|
+
console.log(searchResults.people_also_ask); // People also ask questions
|
|
344
|
+
|
|
345
|
+
// Search with location for local results
|
|
346
|
+
const localResults = await blink.data.search('best restaurants', {
|
|
347
|
+
location: 'San Francisco,CA,United States'
|
|
348
|
+
});
|
|
349
|
+
console.log(localResults.local_results); // Local business results
|
|
350
|
+
console.log(localResults.organic_results); // Regular web results
|
|
351
|
+
|
|
352
|
+
// News search - get latest news articles
|
|
353
|
+
const newsResults = await blink.data.search('artificial intelligence', {
|
|
354
|
+
type: 'news'
|
|
355
|
+
});
|
|
356
|
+
console.log(newsResults.news_results); // News articles with dates and sources
|
|
357
|
+
|
|
358
|
+
// Image search - find images
|
|
359
|
+
const imageResults = await blink.data.search('elon musk', {
|
|
360
|
+
type: 'images',
|
|
361
|
+
limit: 20
|
|
362
|
+
});
|
|
363
|
+
console.log(imageResults.image_results); // Image results with thumbnails
|
|
364
|
+
|
|
365
|
+
// Search in different languages
|
|
366
|
+
const spanishResults = await blink.data.search('noticias tecnologΓa', {
|
|
367
|
+
language: 'es',
|
|
368
|
+
type: 'news'
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
// Shopping search - find products
|
|
372
|
+
const shoppingResults = await blink.data.search('macbook pro', {
|
|
373
|
+
type: 'shopping'
|
|
374
|
+
});
|
|
375
|
+
console.log(shoppingResults.shopping_results); // Product results with prices
|
|
376
|
+
|
|
377
|
+
// All search types return consistent, structured data:
|
|
378
|
+
// - organic_results: Main search results (always included)
|
|
379
|
+
// - related_searches: Related search suggestions
|
|
380
|
+
// - people_also_ask: FAQ-style questions and answers
|
|
381
|
+
// - local_results: Local businesses (when location provided)
|
|
382
|
+
// - news_results: News articles (when type='news')
|
|
383
|
+
// - image_results: Images (when type='images')
|
|
384
|
+
// - shopping_results: Products (when type='shopping')
|
|
385
|
+
// - ads: Sponsored results (when present)
|
|
386
|
+
|
|
332
387
|
// π₯ Secure API Proxy (NEW!) - Make API calls with secret substitution
|
|
333
|
-
// Perfect for calling external APIs from frontend while keeping API keys safe
|
|
334
388
|
|
|
335
389
|
// Basic API call with secret substitution
|
|
336
390
|
const response = await blink.data.fetch({
|
|
@@ -563,6 +617,64 @@ function App() {
|
|
|
563
617
|
return <div>Welcome, {user.email}!</div>
|
|
564
618
|
}
|
|
565
619
|
|
|
620
|
+
// React example with search functionality
|
|
621
|
+
function SearchResults() {
|
|
622
|
+
const [query, setQuery] = useState('')
|
|
623
|
+
const [results, setResults] = useState(null)
|
|
624
|
+
const [loading, setLoading] = useState(false)
|
|
625
|
+
|
|
626
|
+
const handleSearch = async () => {
|
|
627
|
+
if (!query.trim()) return
|
|
628
|
+
|
|
629
|
+
setLoading(true)
|
|
630
|
+
try {
|
|
631
|
+
const searchResults = await blink.data.search(query, {
|
|
632
|
+
type: 'news', // Get latest news
|
|
633
|
+
limit: 10
|
|
634
|
+
})
|
|
635
|
+
setResults(searchResults)
|
|
636
|
+
} catch (error) {
|
|
637
|
+
console.error('Search failed:', error)
|
|
638
|
+
} finally {
|
|
639
|
+
setLoading(false)
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
return (
|
|
644
|
+
<div>
|
|
645
|
+
<input
|
|
646
|
+
value={query}
|
|
647
|
+
onChange={(e) => setQuery(e.target.value)}
|
|
648
|
+
placeholder="Search for news..."
|
|
649
|
+
onKeyPress={(e) => e.key === 'Enter' && handleSearch()}
|
|
650
|
+
/>
|
|
651
|
+
<button onClick={handleSearch} disabled={loading}>
|
|
652
|
+
{loading ? 'Searching...' : 'Search'}
|
|
653
|
+
</button>
|
|
654
|
+
|
|
655
|
+
{results && (
|
|
656
|
+
<div>
|
|
657
|
+
<h3>News Results:</h3>
|
|
658
|
+
{results.news_results?.map((article, i) => (
|
|
659
|
+
<div key={i}>
|
|
660
|
+
<h4><a href={article.link}>{article.title}</a></h4>
|
|
661
|
+
<p>{article.snippet}</p>
|
|
662
|
+
<small>{article.source} - {article.date}</small>
|
|
663
|
+
</div>
|
|
664
|
+
))}
|
|
665
|
+
|
|
666
|
+
<h3>Related Searches:</h3>
|
|
667
|
+
{results.related_searches?.map((suggestion, i) => (
|
|
668
|
+
<button key={i} onClick={() => setQuery(suggestion)}>
|
|
669
|
+
{suggestion}
|
|
670
|
+
</button>
|
|
671
|
+
))}
|
|
672
|
+
</div>
|
|
673
|
+
)}
|
|
674
|
+
</div>
|
|
675
|
+
)
|
|
676
|
+
}
|
|
677
|
+
|
|
566
678
|
// React example with secure API calls
|
|
567
679
|
function EmailSender() {
|
|
568
680
|
const [status, setStatus] = useState('')
|
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { BlinkClientConfig, BlinkUser, AuthState, HttpClient, TableOperations, CreateOptions, UpsertOptions, QueryOptions, ListResponse, UpdateOptions, FilterCondition, ScrapeResult, FetchRequest, FetchResponse, AsyncFetchResponse, BlinkStorage, BlinkAI, StorageUploadOptions, StorageUploadResponse, TextGenerationRequest, TextGenerationResponse, ObjectGenerationRequest, ObjectGenerationResponse, ImageGenerationRequest, ImageGenerationResponse, SpeechGenerationRequest, SpeechGenerationResponse, TranscriptionRequest, TranscriptionResponse } from '@blink/core';
|
|
2
|
-
export { AuthState, AuthTokens, BlinkAI, BlinkClientConfig,
|
|
1
|
+
import { BlinkClientConfig, BlinkUser, AuthState, HttpClient, TableOperations, CreateOptions, UpsertOptions, QueryOptions, ListResponse, UpdateOptions, FilterCondition, ScrapeResult, FetchRequest, FetchResponse, AsyncFetchResponse, SearchResponse, BlinkStorage, BlinkAI, StorageUploadOptions, StorageUploadResponse, TextGenerationRequest, TextGenerationResponse, ObjectGenerationRequest, ObjectGenerationResponse, ImageGenerationRequest, ImageGenerationResponse, SpeechGenerationRequest, SpeechGenerationResponse, TranscriptionRequest, TranscriptionResponse } from '@blink/core';
|
|
2
|
+
export { AuthState, AuthTokens, BlinkAI, BlinkClientConfig, BlinkStorage, BlinkUser, CreateOptions, DataExtraction, FileObject, FilterCondition, ImageGenerationRequest, ImageGenerationResponse, ListResponse, Message, ObjectGenerationRequest, ObjectGenerationResponse, QueryOptions, SearchRequest, SearchResponse, SpeechGenerationRequest, SpeechGenerationResponse, StorageUploadOptions, StorageUploadResponse, TableOperations, TextGenerationRequest, TextGenerationResponse, TokenUsage, TranscriptionRequest, TranscriptionResponse, UpdateOptions, UpsertOptions } from '@blink/core';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Blink Auth Module - Client-side authentication management
|
|
@@ -213,6 +213,12 @@ interface BlinkData {
|
|
|
213
213
|
}): Promise<string>;
|
|
214
214
|
fetch(request: FetchRequest): Promise<FetchResponse>;
|
|
215
215
|
fetchAsync(request: Omit<FetchRequest, 'async'>): Promise<AsyncFetchResponse>;
|
|
216
|
+
search(query: string, options?: {
|
|
217
|
+
location?: string;
|
|
218
|
+
type?: 'news' | 'images' | 'image' | 'videos' | 'video' | 'shopping' | 'shop';
|
|
219
|
+
language?: string;
|
|
220
|
+
limit?: number;
|
|
221
|
+
}): Promise<SearchResponse>;
|
|
216
222
|
}
|
|
217
223
|
declare class BlinkDataImpl implements BlinkData {
|
|
218
224
|
private httpClient;
|
|
@@ -234,6 +240,12 @@ declare class BlinkDataImpl implements BlinkData {
|
|
|
234
240
|
}): Promise<string>;
|
|
235
241
|
fetch(request: FetchRequest): Promise<FetchResponse>;
|
|
236
242
|
fetchAsync(request: Omit<FetchRequest, 'async'>): Promise<AsyncFetchResponse>;
|
|
243
|
+
search(query: string, options?: {
|
|
244
|
+
location?: string;
|
|
245
|
+
type?: 'news' | 'images' | 'image' | 'videos' | 'video' | 'shopping' | 'shop';
|
|
246
|
+
language?: string;
|
|
247
|
+
limit?: number;
|
|
248
|
+
}): Promise<SearchResponse>;
|
|
237
249
|
}
|
|
238
250
|
|
|
239
251
|
/**
|
|
@@ -653,4 +665,4 @@ declare class BlinkAIImpl implements BlinkAI {
|
|
|
653
665
|
transcribeAudio(options: TranscriptionRequest): Promise<TranscriptionResponse>;
|
|
654
666
|
}
|
|
655
667
|
|
|
656
|
-
export { type AuthStateChangeCallback, BlinkAIImpl, type BlinkClient, BlinkDataImpl, BlinkDatabase, BlinkStorageImpl, BlinkTable, createClient };
|
|
668
|
+
export { type AuthStateChangeCallback, BlinkAIImpl, type BlinkClient, type BlinkData, BlinkDataImpl, BlinkDatabase, BlinkStorageImpl, BlinkTable, createClient };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { BlinkClientConfig, BlinkUser, AuthState, HttpClient, TableOperations, CreateOptions, UpsertOptions, QueryOptions, ListResponse, UpdateOptions, FilterCondition, ScrapeResult, FetchRequest, FetchResponse, AsyncFetchResponse, BlinkStorage, BlinkAI, StorageUploadOptions, StorageUploadResponse, TextGenerationRequest, TextGenerationResponse, ObjectGenerationRequest, ObjectGenerationResponse, ImageGenerationRequest, ImageGenerationResponse, SpeechGenerationRequest, SpeechGenerationResponse, TranscriptionRequest, TranscriptionResponse } from '@blink/core';
|
|
2
|
-
export { AuthState, AuthTokens, BlinkAI, BlinkClientConfig,
|
|
1
|
+
import { BlinkClientConfig, BlinkUser, AuthState, HttpClient, TableOperations, CreateOptions, UpsertOptions, QueryOptions, ListResponse, UpdateOptions, FilterCondition, ScrapeResult, FetchRequest, FetchResponse, AsyncFetchResponse, SearchResponse, BlinkStorage, BlinkAI, StorageUploadOptions, StorageUploadResponse, TextGenerationRequest, TextGenerationResponse, ObjectGenerationRequest, ObjectGenerationResponse, ImageGenerationRequest, ImageGenerationResponse, SpeechGenerationRequest, SpeechGenerationResponse, TranscriptionRequest, TranscriptionResponse } from '@blink/core';
|
|
2
|
+
export { AuthState, AuthTokens, BlinkAI, BlinkClientConfig, BlinkStorage, BlinkUser, CreateOptions, DataExtraction, FileObject, FilterCondition, ImageGenerationRequest, ImageGenerationResponse, ListResponse, Message, ObjectGenerationRequest, ObjectGenerationResponse, QueryOptions, SearchRequest, SearchResponse, SpeechGenerationRequest, SpeechGenerationResponse, StorageUploadOptions, StorageUploadResponse, TableOperations, TextGenerationRequest, TextGenerationResponse, TokenUsage, TranscriptionRequest, TranscriptionResponse, UpdateOptions, UpsertOptions } from '@blink/core';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Blink Auth Module - Client-side authentication management
|
|
@@ -213,6 +213,12 @@ interface BlinkData {
|
|
|
213
213
|
}): Promise<string>;
|
|
214
214
|
fetch(request: FetchRequest): Promise<FetchResponse>;
|
|
215
215
|
fetchAsync(request: Omit<FetchRequest, 'async'>): Promise<AsyncFetchResponse>;
|
|
216
|
+
search(query: string, options?: {
|
|
217
|
+
location?: string;
|
|
218
|
+
type?: 'news' | 'images' | 'image' | 'videos' | 'video' | 'shopping' | 'shop';
|
|
219
|
+
language?: string;
|
|
220
|
+
limit?: number;
|
|
221
|
+
}): Promise<SearchResponse>;
|
|
216
222
|
}
|
|
217
223
|
declare class BlinkDataImpl implements BlinkData {
|
|
218
224
|
private httpClient;
|
|
@@ -234,6 +240,12 @@ declare class BlinkDataImpl implements BlinkData {
|
|
|
234
240
|
}): Promise<string>;
|
|
235
241
|
fetch(request: FetchRequest): Promise<FetchResponse>;
|
|
236
242
|
fetchAsync(request: Omit<FetchRequest, 'async'>): Promise<AsyncFetchResponse>;
|
|
243
|
+
search(query: string, options?: {
|
|
244
|
+
location?: string;
|
|
245
|
+
type?: 'news' | 'images' | 'image' | 'videos' | 'video' | 'shopping' | 'shop';
|
|
246
|
+
language?: string;
|
|
247
|
+
limit?: number;
|
|
248
|
+
}): Promise<SearchResponse>;
|
|
237
249
|
}
|
|
238
250
|
|
|
239
251
|
/**
|
|
@@ -653,4 +665,4 @@ declare class BlinkAIImpl implements BlinkAI {
|
|
|
653
665
|
transcribeAudio(options: TranscriptionRequest): Promise<TranscriptionResponse>;
|
|
654
666
|
}
|
|
655
667
|
|
|
656
|
-
export { type AuthStateChangeCallback, BlinkAIImpl, type BlinkClient, BlinkDataImpl, BlinkDatabase, BlinkStorageImpl, BlinkTable, createClient };
|
|
668
|
+
export { type AuthStateChangeCallback, BlinkAIImpl, type BlinkClient, type BlinkData, BlinkDataImpl, BlinkDatabase, BlinkStorageImpl, BlinkTable, createClient };
|
package/dist/index.js
CHANGED
|
@@ -571,10 +571,10 @@ var HttpClient = class {
|
|
|
571
571
|
});
|
|
572
572
|
}
|
|
573
573
|
async dataFetch(projectId, request) {
|
|
574
|
-
return this.
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
});
|
|
574
|
+
return this.post(`/api/data/${projectId}/fetch`, request);
|
|
575
|
+
}
|
|
576
|
+
async dataSearch(projectId, request) {
|
|
577
|
+
return this.post(`/api/data/${projectId}/search`, request);
|
|
578
578
|
}
|
|
579
579
|
/**
|
|
580
580
|
* Private helper methods
|
|
@@ -2419,6 +2419,34 @@ var BlinkDataImpl = class {
|
|
|
2419
2419
|
}
|
|
2420
2420
|
throw new BlinkDataError("Unexpected response format from async fetch endpoint");
|
|
2421
2421
|
}
|
|
2422
|
+
async search(query, options) {
|
|
2423
|
+
const normalizeType = (type) => {
|
|
2424
|
+
switch (type) {
|
|
2425
|
+
case "news":
|
|
2426
|
+
return "nws";
|
|
2427
|
+
case "images":
|
|
2428
|
+
case "image":
|
|
2429
|
+
return "isch";
|
|
2430
|
+
case "videos":
|
|
2431
|
+
case "video":
|
|
2432
|
+
return "vid";
|
|
2433
|
+
case "shopping":
|
|
2434
|
+
case "shop":
|
|
2435
|
+
return "shop";
|
|
2436
|
+
default:
|
|
2437
|
+
return void 0;
|
|
2438
|
+
}
|
|
2439
|
+
};
|
|
2440
|
+
const request = {
|
|
2441
|
+
q: query,
|
|
2442
|
+
location: options?.location,
|
|
2443
|
+
hl: options?.language || "en",
|
|
2444
|
+
tbm: normalizeType(options?.type),
|
|
2445
|
+
num: options?.limit
|
|
2446
|
+
};
|
|
2447
|
+
const response = await this.httpClient.dataSearch(this.projectId, request);
|
|
2448
|
+
return response.data;
|
|
2449
|
+
}
|
|
2422
2450
|
};
|
|
2423
2451
|
|
|
2424
2452
|
// src/client.ts
|
package/dist/index.mjs
CHANGED
|
@@ -569,10 +569,10 @@ var HttpClient = class {
|
|
|
569
569
|
});
|
|
570
570
|
}
|
|
571
571
|
async dataFetch(projectId, request) {
|
|
572
|
-
return this.
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
});
|
|
572
|
+
return this.post(`/api/data/${projectId}/fetch`, request);
|
|
573
|
+
}
|
|
574
|
+
async dataSearch(projectId, request) {
|
|
575
|
+
return this.post(`/api/data/${projectId}/search`, request);
|
|
576
576
|
}
|
|
577
577
|
/**
|
|
578
578
|
* Private helper methods
|
|
@@ -2417,6 +2417,34 @@ var BlinkDataImpl = class {
|
|
|
2417
2417
|
}
|
|
2418
2418
|
throw new BlinkDataError("Unexpected response format from async fetch endpoint");
|
|
2419
2419
|
}
|
|
2420
|
+
async search(query, options) {
|
|
2421
|
+
const normalizeType = (type) => {
|
|
2422
|
+
switch (type) {
|
|
2423
|
+
case "news":
|
|
2424
|
+
return "nws";
|
|
2425
|
+
case "images":
|
|
2426
|
+
case "image":
|
|
2427
|
+
return "isch";
|
|
2428
|
+
case "videos":
|
|
2429
|
+
case "video":
|
|
2430
|
+
return "vid";
|
|
2431
|
+
case "shopping":
|
|
2432
|
+
case "shop":
|
|
2433
|
+
return "shop";
|
|
2434
|
+
default:
|
|
2435
|
+
return void 0;
|
|
2436
|
+
}
|
|
2437
|
+
};
|
|
2438
|
+
const request = {
|
|
2439
|
+
q: query,
|
|
2440
|
+
location: options?.location,
|
|
2441
|
+
hl: options?.language || "en",
|
|
2442
|
+
tbm: normalizeType(options?.type),
|
|
2443
|
+
num: options?.limit
|
|
2444
|
+
};
|
|
2445
|
+
const response = await this.httpClient.dataSearch(this.projectId, request);
|
|
2446
|
+
return response.data;
|
|
2447
|
+
}
|
|
2420
2448
|
};
|
|
2421
2449
|
|
|
2422
2450
|
// src/client.ts
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blinkdotnew/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "Blink TypeScript SDK for client-side applications - Zero-boilerplate CRUD + auth for modern SaaS/AI apps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"blink",
|
|
@@ -35,7 +35,10 @@
|
|
|
35
35
|
}
|
|
36
36
|
},
|
|
37
37
|
"files": [
|
|
38
|
-
"dist"
|
|
38
|
+
"dist/**/*.js",
|
|
39
|
+
"dist/**/*.mjs",
|
|
40
|
+
"dist/**/*.d.ts",
|
|
41
|
+
"dist/**/*.d.mts"
|
|
39
42
|
],
|
|
40
43
|
"scripts": {
|
|
41
44
|
"build": "tsup",
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/src/types.ts","../../core/src/query-builder.ts","../../core/src/http-client.ts","../src/auth.ts","../src/database.ts","../src/storage.ts","../src/ai.ts","../src/data.ts","../src/client.ts"],"names":["user"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Core type definitions for Blink SDK\n */\n\nexport interface BlinkClientConfig {\n projectId: string\n authRequired?: boolean\n}\n\nexport interface BlinkUser {\n id: string\n email: string\n displayName?: string\n photoURL?: string\n emailVerified?: boolean\n createdAt?: string\n lastSignInAt?: string\n}\n\nexport interface AuthTokens {\n access_token: string\n refresh_token?: string\n token_type: 'Bearer'\n expires_in: number\n refresh_expires_in?: number\n issued_at?: number // Timestamp when token was issued (for expiration calculation)\n}\n\nexport interface AuthState {\n user: BlinkUser | null\n tokens: AuthTokens | null\n isAuthenticated: boolean\n isLoading: boolean\n}\n\n// Filter DSL types\nexport interface FilterOperators {\n eq?: any\n neq?: any\n gt?: any\n gte?: any\n lt?: any\n lte?: any\n in?: any[]\n not_in?: any[]\n like?: string\n ilike?: string\n is?: null | boolean\n not?: any\n}\n\nexport interface LogicalOperators {\n AND?: FilterCondition[]\n OR?: FilterCondition[]\n}\n\nexport type FilterCondition = \n | Record<string, any>\n | FilterOperators\n | LogicalOperators\n\nexport interface QueryOptions {\n where?: FilterCondition\n orderBy?: Record<string, 'asc' | 'desc'> | string\n limit?: number\n offset?: number\n cursor?: string\n select?: string[]\n}\n\nexport interface ListResponse<T = any> {\n data: T[]\n count?: number\n nextCursor?: string\n hasMore?: boolean\n}\n\nexport interface CreateOptions {\n returning?: boolean\n}\n\nexport interface UpdateOptions {\n returning?: boolean\n}\n\nexport interface UpsertOptions {\n onConflict?: string\n returning?: boolean\n}\n\n// Database operation types\nexport interface TableOperations<T = any> {\n create(data: Partial<T>, options?: CreateOptions): Promise<T>\n createMany(data: Partial<T>[], options?: CreateOptions): Promise<T[]>\n upsert(data: Partial<T>, options?: UpsertOptions): Promise<T>\n upsertMany(data: Partial<T>[], options?: UpsertOptions): Promise<T[]>\n get(id: string): Promise<T | null>\n list(options?: QueryOptions): Promise<ListResponse<T>>\n update(id: string, data: Partial<T>, options?: UpdateOptions): Promise<T>\n updateMany(updates: Array<{ id: string } & Partial<T>>, options?: UpdateOptions): Promise<T[]>\n delete(id: string): Promise<void>\n deleteMany(options: { where: FilterCondition }): Promise<void>\n count(options?: { where?: FilterCondition }): Promise<number>\n exists(options: { where: FilterCondition }): Promise<boolean>\n}\n\n// Database interface with typed table access\nexport interface BlinkDatabase {\n // Typed table access method\n table<T = any>(name: string): TableOperations<T>\n}\n\n// Error types\nexport class BlinkError extends Error {\n constructor(\n message: string,\n public code?: string,\n public status?: number,\n public details?: any\n ) {\n super(message)\n this.name = 'BlinkError'\n }\n}\n\nexport class BlinkAuthError extends BlinkError {\n constructor(message: string, details?: any) {\n super(message, 'AUTH_ERROR', 401, details)\n this.name = 'BlinkAuthError'\n }\n}\n\nexport class BlinkNetworkError extends BlinkError {\n constructor(message: string, status?: number, details?: any) {\n super(message, 'NETWORK_ERROR', status, details)\n this.name = 'BlinkNetworkError'\n }\n}\n\nexport class BlinkValidationError extends BlinkError {\n constructor(message: string, details?: any) {\n super(message, 'VALIDATION_ERROR', 400, details)\n this.name = 'BlinkValidationError'\n }\n}\n\n// Storage types\nexport interface StorageUploadOptions {\n upsert?: boolean\n onProgress?: (percent: number) => void\n}\n\nexport interface StorageUploadResponse {\n publicUrl: string\n}\n\nexport interface FileObject {\n id: string\n name: string\n bucket_id: string\n owner?: string | null\n owner_id?: string | null\n version?: string | null\n created_at: string\n updated_at: string\n last_accessed_at: string\n metadata: {\n size: number\n mimetype: string\n cacheControl?: string\n }\n user_metadata?: Record<string, any>\n}\n\nexport interface StorageResponse<T = any> {\n data: T\n error?: {\n message: string\n statusCode?: string\n } | null\n}\n\n// Storage interface\nexport interface BlinkStorage {\n upload(file: File | Blob | Buffer, path: string, options?: StorageUploadOptions): Promise<StorageUploadResponse>\n remove(...paths: string[]): Promise<void>\n}\n\nexport class BlinkStorageError extends BlinkError {\n constructor(message: string, status?: number, details?: any) {\n super(message, 'STORAGE_ERROR', status, details)\n this.name = 'BlinkStorageError'\n }\n}\n\n// AI types\nexport interface TokenUsage {\n promptTokens: number\n completionTokens: number\n totalTokens: number\n}\n\n// Message content types for multimodal support\nexport interface TextContent {\n type: 'text'\n text: string\n}\n\nexport interface ImageContent {\n type: 'image'\n image: string // URL only - no base64 support for simplicity\n}\n\nexport type MessageContent = TextContent | ImageContent\n\n// Enhanced Message interface supporting both string and content array formats\nexport interface Message {\n role: 'system' | 'user' | 'assistant'\n content: string | MessageContent[] // Support both legacy string and new content array\n}\n\n// Supported image formats\nexport const SUPPORTED_IMAGE_FORMATS = ['jpg', 'jpeg', 'png', 'gif', 'webp'] as const\nexport type SupportedImageFormat = typeof SUPPORTED_IMAGE_FORMATS[number]\n\n// Text Generation\nexport interface TextGenerationRequest {\n model?: string\n prompt?: string\n messages?: Message[]\n stream?: boolean\n search?: boolean // Enable web search (OpenAI only)\n maxSteps?: number // Maximum number of sequential LLM calls\n experimental_continueSteps?: boolean // Enable continue steps\n maxTokens?: number\n temperature?: number\n signal?: AbortSignal\n}\n\nexport interface TextGenerationResponse {\n text: string\n finishReason?: 'stop' | 'length' | 'content_filter' | 'tool_calls'\n usage?: TokenUsage\n files?: any[]\n reasoningDetails?: any[]\n toolCalls?: any[]\n toolResults?: any[]\n warnings?: string[]\n request?: {\n body?: string\n }\n response?: any\n steps?: Array<{\n stepType?: string\n text?: string\n finishReason?: string\n usage?: TokenUsage\n }>\n sources?: any[]\n providerMetadata?: any\n experimental_providerMetadata?: any\n}\n\n// Object Generation \nexport interface ObjectGenerationRequest {\n model?: string\n prompt: string\n output?: 'object' | 'array' | 'enum'\n schema?: any\n enum?: string[]\n stream?: boolean\n signal?: AbortSignal\n}\n\nexport interface ObjectGenerationResponse {\n object: any\n finishReason?: 'stop' | 'length' | 'content_filter'\n usage?: TokenUsage\n warnings?: string[]\n providerMetadata?: {\n openai?: {\n reasoningTokens?: number\n acceptedPredictionTokens?: number\n rejectedPredictionTokens?: number\n cachedPromptTokens?: number\n }\n }\n experimental_providerMetadata?: any\n response?: {\n id?: string\n timestamp?: string\n modelId?: string\n headers?: any\n body?: any\n }\n request?: {\n body?: string\n }\n}\n\n// Image Generation\nexport interface ImageGenerationRequest {\n model?: string\n prompt: string\n size?: string // Flexible to support different models (e.g., '1024x1024', '512x512', '1792x1024', 'auto', etc.)\n quality?: 'standard' | 'hd'\n n?: number\n response_format?: 'url' | 'b64_json'\n signal?: AbortSignal\n}\n\nexport interface ImageGenerationResponse {\n data: Array<{\n url?: string\n b64_json?: string\n }>\n}\n\n// Speech Generation\nexport interface SpeechGenerationRequest {\n model?: string\n text: string\n voice?: 'alloy' | 'echo' | 'fable' | 'onyx' | 'nova' | 'shimmer'\n response_format?: 'mp3' | 'opus' | 'aac' | 'flac' | 'wav' | 'pcm'\n speed?: number\n signal?: AbortSignal\n}\n\nexport interface SpeechGenerationResponse {\n url: string\n voice: string\n format: string\n mimeType: string\n}\n\n// Transcription\nexport interface TranscriptionRequest {\n model?: string\n audio: string | number[] // Base64 string, URL, or audio buffer\n language?: string\n response_format?: 'json' | 'text' | 'srt' | 'verbose_json' | 'vtt'\n signal?: AbortSignal\n}\n\nexport interface TranscriptionResponse {\n text: string\n transcript?: string // Alias for text\n segments?: Array<{\n id: number\n seek: number\n start: number\n end: number\n text: string\n tokens: number[]\n temperature: number\n avg_logprob: number\n compression_ratio: number\n no_speech_prob: number\n }>\n language?: string\n duration?: number\n words?: Array<{\n word: string\n start: number\n end: number\n }>\n}\n\n// AI interface\nexport interface BlinkAI {\n generateText(options: TextGenerationRequest): Promise<TextGenerationResponse>\n streamText(options: TextGenerationRequest, onChunk: (chunk: string) => void): Promise<TextGenerationResponse>\n generateObject(options: ObjectGenerationRequest): Promise<ObjectGenerationResponse>\n streamObject(options: ObjectGenerationRequest, onPartial: (partial: any) => void): Promise<ObjectGenerationResponse>\n generateImage(options: ImageGenerationRequest): Promise<ImageGenerationResponse>\n generateSpeech(options: SpeechGenerationRequest): Promise<SpeechGenerationResponse>\n transcribeAudio(options: TranscriptionRequest): Promise<TranscriptionResponse>\n}\n\nexport class BlinkAIError extends BlinkError {\n constructor(message: string, status?: number, details?: any) {\n super(message, 'AI_ERROR', status, details)\n this.name = 'BlinkAIError'\n }\n}\n\n// Data types\nexport interface DataExtraction {\n chunks: string[]\n}\n\nexport interface ExtractFromUrlRequest {\n url: string;\n chunking?: boolean;\n chunkSize?: number;\n}\n\nexport interface ExtractFromBlobRequest {\n chunking?: boolean;\n chunkSize?: number;\n}\n\nexport interface ExtractFromUrlResponse {\n chunks?: string[];\n text?: string;\n}\n\nexport interface ExtractFromBlobResponse {\n chunks?: string[];\n text?: string;\n}\n\n// Scrape types\nexport interface ScrapeRequest {\n url: string;\n formats?: ('markdown' | 'html' | 'rawHtml' | 'links' | 'extract' | 'metadata')[];\n}\n\nexport interface ScrapeResponse {\n markdown?: string;\n html?: string;\n rawHtml?: string;\n links?: Array<{ text: string; url: string; type: string }>;\n extract?: {\n title?: string;\n description?: string;\n headings?: string[];\n text?: string;\n };\n metadata?: {\n title?: string;\n description?: string;\n url?: string;\n domain?: string;\n favicon?: string;\n image?: string;\n author?: string;\n publishedTime?: string;\n modifiedTime?: string;\n type?: string;\n siteName?: string;\n locale?: string;\n keywords?: string[];\n };\n}\n\n// Clear, destructurable scrape result for better DX\nexport interface ScrapeResult {\n markdown: string;\n html: string;\n metadata: {\n title: string;\n description: string;\n url: string;\n domain: string;\n favicon?: string;\n image?: string;\n author?: string;\n publishedTime?: string;\n modifiedTime?: string;\n type?: string;\n siteName?: string;\n locale?: string;\n keywords?: string[];\n };\n links: Array<{ text: string; url: string; type: string }>;\n extract: {\n title: string;\n description: string;\n headings: string[];\n text: string;\n };\n}\n\n// Screenshot types\nexport interface ScreenshotRequest {\n url: string;\n fullPage?: boolean;\n width?: number;\n height?: number;\n}\n\nexport interface ScreenshotResponse {\n url: string;\n}\n\n// Data interface\nexport interface BlinkData {\n extractFromUrl(url: string, filename?: string): Promise<DataExtraction>\n scrape(url: string): Promise<ScrapeResult>\n screenshot(url: string, options?: { fullPage?: boolean; width?: number; height?: number }): Promise<string>\n fetch(request: FetchRequest): Promise<FetchResponse | AsyncFetchResponse>\n}\n\n// Fetch types\nexport interface FetchRequest {\n url: string;\n method?: string;\n headers?: Record<string, string>;\n body?: any;\n query?: Record<string, string>;\n async?: boolean;\n}\n\nexport interface FetchResponse {\n status: number;\n headers: Record<string, string>;\n body: any;\n durationMs: number;\n}\n\nexport interface AsyncFetchResponse {\n status: 'triggered';\n message: string;\n}\n\nexport class BlinkDataError extends BlinkError {\n constructor(message: string, status?: number, details?: any) {\n super(message, 'DATA_ERROR', status, details)\n this.name = 'BlinkDataError'\n }\n} ","/**\n * Filter DSL to PostgREST query string converter\n * Converts JSON filter objects to PostgREST-compatible query parameters\n */\n\nimport type { FilterCondition, QueryOptions } from './types'\n\n/**\n * Convert a filter condition to PostgREST query parameters\n */\nexport function buildFilterQuery(condition: FilterCondition): string {\n if (!condition) return ''\n\n // Handle logical operators (AND, OR)\n if ('AND' in condition) {\n const andConditions = condition.AND?.map(buildFilterQuery).filter(Boolean) || []\n return andConditions.length > 0 ? `and=(${andConditions.join(',')})` : ''\n }\n\n if ('OR' in condition) {\n const orConditions = condition.OR?.map(buildFilterQuery).filter(Boolean) || []\n return orConditions.length > 0 ? `or=(${orConditions.join(',')})` : ''\n }\n\n // Handle field-level conditions\n const params: string[] = []\n \n for (const [field, value] of Object.entries(condition)) {\n if (value === undefined || value === null) continue\n\n // Handle operator objects\n if (typeof value === 'object' && !Array.isArray(value)) {\n for (const [operator, operatorValue] of Object.entries(value)) {\n const param = buildOperatorQuery(field, operator, operatorValue)\n if (param) params.push(param)\n }\n } else {\n // Handle direct equality\n params.push(`${field}=eq.${encodeQueryValue(value)}`)\n }\n }\n\n return params.join('&')\n}\n\n/**\n * Build operator-specific query parameters\n */\nfunction buildOperatorQuery(field: string, operator: string, value: any): string {\n switch (operator) {\n case 'eq':\n return `${field}=eq.${encodeQueryValue(value)}`\n case 'neq':\n return `${field}=neq.${encodeQueryValue(value)}`\n case 'gt':\n return `${field}=gt.${encodeQueryValue(value)}`\n case 'gte':\n return `${field}=gte.${encodeQueryValue(value)}`\n case 'lt':\n return `${field}=lt.${encodeQueryValue(value)}`\n case 'lte':\n return `${field}=lte.${encodeQueryValue(value)}`\n case 'like':\n return `${field}=like.${encodeQueryValue(value)}`\n case 'ilike':\n return `${field}=ilike.${encodeQueryValue(value)}`\n case 'is':\n return `${field}=is.${value === null ? 'null' : encodeQueryValue(value)}`\n case 'not':\n return `${field}=not.${encodeQueryValue(value)}`\n case 'in':\n if (Array.isArray(value)) {\n const values = value.map(encodeQueryValue).join(',')\n return `${field}=in.(${values})`\n }\n return ''\n case 'not_in':\n if (Array.isArray(value)) {\n const values = value.map(encodeQueryValue).join(',')\n return `${field}=not.in.(${values})`\n }\n return ''\n default:\n return ''\n }\n}\n\n/**\n * Encode query values for URL safety\n * Handle SQLite boolean conversion (true/false -> 1/0)\n */\nfunction encodeQueryValue(value: any): string {\n if (value === null) return 'null'\n if (typeof value === 'boolean') {\n // SQLite stores booleans as integers: true=1, false=0\n return value ? '1' : '0'\n }\n if (typeof value === 'number') return value.toString()\n return encodeURIComponent(String(value))\n}\n\n/**\n * Build complete query parameters from options\n */\nexport function buildQuery(options: QueryOptions = {}): Record<string, string> {\n const params: Record<string, string> = {}\n\n // Add select clause\n if (options.select && options.select.length > 0) {\n params.select = options.select.join(',')\n } else {\n params.select = '*'\n }\n\n // Add filter conditions\n if (options.where) {\n const filterQuery = buildFilterQuery(options.where)\n if (filterQuery) {\n // Split the filter query and add each parameter\n const filterParams = filterQuery.split('&')\n for (const param of filterParams) {\n const [key, value] = param.split('=', 2)\n if (key && value) {\n params[key] = value\n }\n }\n }\n }\n\n // Add ordering\n if (options.orderBy) {\n if (typeof options.orderBy === 'string') {\n params.order = options.orderBy\n } else {\n const orderClauses = Object.entries(options.orderBy)\n .map(([field, direction]) => `${field}.${direction}`)\n params.order = orderClauses.join(',')\n }\n }\n\n // Add pagination\n if (options.limit !== undefined) {\n params.limit = options.limit.toString()\n }\n\n if (options.offset !== undefined) {\n params.offset = options.offset.toString()\n }\n\n // Add cursor-based pagination\n if (options.cursor) {\n params.cursor = options.cursor\n }\n\n return params\n}\n\n/**\n * Convert query parameters to URL search string\n */\nexport function queryToSearchParams(params: Record<string, string>): string {\n const searchParams = new URLSearchParams()\n \n for (const [key, value] of Object.entries(params)) {\n searchParams.set(key, value)\n }\n \n return searchParams.toString()\n}\n\n/**\n * Build complete URL with query parameters\n */\nexport function buildUrl(baseUrl: string, path: string, options: QueryOptions = {}): string {\n const query = buildQuery(options)\n const searchParams = queryToSearchParams(query)\n \n const url = new URL(path, baseUrl)\n if (searchParams) {\n url.search = searchParams\n }\n \n return url.toString()\n} ","/**\n * HTTP client for Blink API requests\n * Handles authentication, error handling, and request/response processing\n */\n\nimport type { \n BlinkClientConfig, \n AuthTokens, \n ExtractFromUrlRequest, \n ExtractFromUrlResponse, \n ExtractFromBlobRequest, \n ExtractFromBlobResponse,\n ScrapeRequest,\n ScrapeResponse,\n ScreenshotRequest,\n ScreenshotResponse,\n FetchRequest,\n FetchResponse,\n AsyncFetchResponse\n} from './types'\nimport { BlinkError, BlinkAuthError, BlinkNetworkError, BlinkValidationError } from './types'\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PATCH' | 'DELETE'\n headers?: Record<string, string>\n body?: any\n searchParams?: Record<string, string>\n signal?: AbortSignal\n}\n\nexport interface BlinkResponse<T = any> {\n data: T\n status: number\n headers: Headers\n}\n\nexport class HttpClient {\n private readonly authUrl = 'https://blink.new'\n private readonly coreUrl = 'https://core.blink.new'\n public readonly projectId: string\n private getToken: () => string | null\n private getValidToken?: () => Promise<string | null>\n\n constructor(\n config: BlinkClientConfig,\n getToken: () => string | null,\n getValidToken?: () => Promise<string | null>\n ) {\n this.projectId = config.projectId\n this.getToken = getToken\n this.getValidToken = getValidToken\n }\n\n /**\n * Make an authenticated request to the Blink API\n */\n async request<T = any>(\n path: string,\n options: RequestOptions = {}\n ): Promise<BlinkResponse<T>> {\n const url = this.buildUrl(path, options.searchParams)\n \n // Use intelligent token management if available, otherwise fallback to basic getToken\n const token = this.getValidToken \n ? await this.getValidToken()\n : this.getToken()\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers,\n }\n\n // Add authentication header if token is available\n if (token) {\n headers.Authorization = `Bearer ${token}`\n }\n\n const requestInit: RequestInit = {\n method: options.method || 'GET',\n headers,\n signal: options.signal,\n }\n\n // Add body for non-GET requests\n if (options.body && options.method !== 'GET') {\n requestInit.body = typeof options.body === 'string' \n ? options.body \n : JSON.stringify(options.body)\n }\n\n try {\n const response = await fetch(url, requestInit)\n \n // Handle different response types\n if (!response.ok) {\n await this.handleErrorResponse(response)\n }\n\n const data = await this.parseResponse<T>(response)\n \n return {\n data,\n status: response.status,\n headers: response.headers,\n }\n } catch (error) {\n if (error instanceof BlinkError) {\n throw error\n }\n \n // Handle network errors\n throw new BlinkNetworkError(\n `Network request failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 0,\n { originalError: error }\n )\n }\n }\n\n /**\n * GET request\n */\n async get<T = any>(\n path: string,\n searchParams?: Record<string, string>\n ): Promise<BlinkResponse<T>> {\n return this.request<T>(path, { method: 'GET', searchParams })\n }\n\n /**\n * POST request\n */\n async post<T = any>(\n path: string,\n body?: any,\n headers?: Record<string, string>\n ): Promise<BlinkResponse<T>> {\n return this.request<T>(path, { method: 'POST', body, headers })\n }\n\n /**\n * PATCH request\n */\n async patch<T = any>(\n path: string,\n body?: any,\n headers?: Record<string, string>\n ): Promise<BlinkResponse<T>> {\n return this.request<T>(path, { method: 'PATCH', body, headers })\n }\n\n /**\n * DELETE request\n */\n async delete<T = any>(\n path: string,\n searchParams?: Record<string, string>\n ): Promise<BlinkResponse<T>> {\n return this.request<T>(path, { method: 'DELETE', searchParams })\n }\n\n /**\n * Database-specific requests\n */\n \n // Table operations (PostgREST-compatible)\n async dbGet<T = any>(\n table: string,\n searchParams?: Record<string, string>\n ): Promise<BlinkResponse<T[]>> {\n return this.get<T[]>(`/api/db/${this.projectId}/rest/v1/${table}`, searchParams)\n }\n\n async dbPost<T = any>(\n table: string,\n body: any,\n options: { returning?: boolean } = {}\n ): Promise<BlinkResponse<T | T[]>> {\n const headers: Record<string, string> = {}\n if (options.returning) {\n headers.Prefer = 'return=representation'\n }\n return this.post<T | T[]>(`/api/db/${this.projectId}/rest/v1/${table}`, body, headers)\n }\n\n async dbPatch<T = any>(\n table: string,\n body: any,\n searchParams?: Record<string, string>,\n options: { returning?: boolean } = {}\n ): Promise<BlinkResponse<T[]>> {\n const headers: Record<string, string> = {}\n if (options.returning) {\n headers.Prefer = 'return=representation'\n }\n return this.request<T[]>(`/api/db/${this.projectId}/rest/v1/${table}`, {\n method: 'PATCH',\n body,\n headers,\n searchParams,\n })\n }\n\n async dbDelete<T = any>(\n table: string,\n searchParams?: Record<string, string>,\n options: { returning?: boolean } = {}\n ): Promise<BlinkResponse<T[]>> {\n const headers: Record<string, string> = {}\n if (options.returning) {\n headers.Prefer = 'return=representation'\n }\n return this.request<T[]>(`/api/db/${this.projectId}/rest/v1/${table}`, {\n method: 'DELETE',\n headers,\n searchParams,\n })\n }\n\n // Raw SQL operations\n async dbSql<T = any>(\n query: string,\n params?: any[]\n ): Promise<BlinkResponse<{\n rows: T[]\n columns: string[]\n rowCount: number\n executionTime: number\n }>> {\n return this.post(`/api/db/${this.projectId}/sql`, { query, params })\n }\n\n // Batch SQL operations\n async dbBatch<T = any>(\n statements: Array<{ sql: string; args?: any[] }>,\n mode: 'read' | 'write' = 'write'\n ): Promise<BlinkResponse<{\n results: Array<{\n rows: T[]\n columns: string[]\n rowCount: number\n }>\n executionTime: number\n success: boolean\n }>> {\n return this.post(`/api/db/${this.projectId}/batch`, { statements, mode })\n }\n\n /**\n * Upload file with progress tracking\n */\n async uploadFile(\n path: string,\n file: File | Blob | Buffer,\n filePath: string,\n options: {\n upsert?: boolean\n onProgress?: (percent: number) => void\n } = {}\n ): Promise<BlinkResponse<any>> {\n const url = this.buildUrl(path)\n \n // Use intelligent token management if available, otherwise fallback to basic getToken\n const token = this.getValidToken \n ? await this.getValidToken()\n : this.getToken()\n\n const formData = new FormData()\n \n // Handle different file types\n if (file instanceof File) {\n formData.append('file', file)\n } else if (file instanceof Blob) {\n formData.append('file', file)\n } else if (typeof Buffer !== 'undefined' && file instanceof Buffer) {\n // For Node.js/Deno environments\n const blob = new Blob([file])\n formData.append('file', blob)\n } else {\n throw new BlinkValidationError('Unsupported file type')\n }\n \n formData.append('path', filePath)\n \n if (options.upsert !== undefined) {\n formData.append('options', JSON.stringify({ upsert: options.upsert }))\n }\n\n const headers: Record<string, string> = {}\n \n // Add authentication header if token is available\n if (token) {\n headers.Authorization = `Bearer ${token}`\n }\n \n // Don't set Content-Type header - let browser set it with boundary for multipart\n\n try {\n // Use XMLHttpRequest for progress tracking in browser\n if (typeof XMLHttpRequest !== 'undefined' && options.onProgress) {\n return this.uploadWithProgress(url, formData, headers, options.onProgress)\n }\n \n // Fallback to fetch for environments without XMLHttpRequest\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: formData,\n })\n \n if (!response.ok) {\n await this.handleErrorResponse(response)\n }\n\n const data = await this.parseResponse(response)\n \n return {\n data,\n status: response.status,\n headers: response.headers,\n }\n } catch (error) {\n if (error instanceof BlinkError) {\n throw error\n }\n \n throw new BlinkNetworkError(\n `File upload failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 0,\n { originalError: error }\n )\n }\n }\n\n /**\n * Upload with progress tracking using XMLHttpRequest\n */\n private uploadWithProgress(\n url: string,\n formData: FormData,\n headers: Record<string, string>,\n onProgress: (percent: number) => void\n ): Promise<BlinkResponse<any>> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n \n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable) {\n const percent = Math.round((event.loaded / event.total) * 100)\n onProgress(percent)\n }\n })\n \n xhr.addEventListener('load', async () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const data = JSON.parse(xhr.responseText)\n resolve({\n data,\n status: xhr.status,\n headers: new Headers(), // XMLHttpRequest doesn't provide easy access to response headers\n })\n } catch (error) {\n reject(new BlinkNetworkError('Failed to parse response', xhr.status))\n }\n } else {\n try {\n const errorData = JSON.parse(xhr.responseText)\n const message = errorData.error?.message || errorData.message || `HTTP ${xhr.status}`\n \n switch (xhr.status) {\n case 401:\n reject(new BlinkAuthError(message, errorData))\n break\n case 400:\n reject(new BlinkValidationError(message, errorData))\n break\n default:\n reject(new BlinkNetworkError(message, xhr.status, errorData))\n }\n } catch {\n reject(new BlinkNetworkError(`HTTP ${xhr.status}`, xhr.status))\n }\n }\n })\n \n xhr.addEventListener('error', () => {\n reject(new BlinkNetworkError('Network error during file upload'))\n })\n \n xhr.open('POST', url)\n \n // Set headers\n Object.entries(headers).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value)\n })\n \n xhr.send(formData)\n })\n }\n\n /**\n * AI-specific requests\n */\n \n async aiText(\n prompt: string,\n options: {\n model?: string\n messages?: Array<{ role: string; content: string | any[] }>\n stream?: boolean\n search?: boolean\n maxSteps?: number\n experimental_continueSteps?: boolean\n maxTokens?: number\n temperature?: number\n signal?: AbortSignal\n } = {}\n ): Promise<BlinkResponse<any>> {\n const { signal, ...body } = options\n const requestBody: any = { ...body }\n \n // Only include prompt if it's not empty\n if (prompt) {\n requestBody.prompt = prompt\n }\n \n return this.request(`/api/ai/${this.projectId}/text`, {\n method: 'POST',\n body: requestBody,\n signal,\n })\n }\n\n /**\n * Stream AI text generation with Vercel AI SDK data stream format\n */\n async streamAiText(\n prompt: string,\n options: {\n model?: string\n messages?: Array<{ role: string; content: string | any[] }>\n search?: boolean\n maxSteps?: number\n experimental_continueSteps?: boolean\n maxTokens?: number\n temperature?: number\n signal?: AbortSignal\n } = {},\n onChunk: (chunk: string) => void\n ): Promise<any> {\n const url = this.buildUrl(`/api/ai/${this.projectId}/text`)\n \n // Use intelligent token management if available, otherwise fallback to basic getToken\n const token = this.getValidToken \n ? await this.getValidToken()\n : this.getToken()\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n // Add authentication header if token is available\n if (token) {\n headers.Authorization = `Bearer ${token}`\n }\n\n const body = {\n prompt,\n stream: true,\n ...options,\n }\n\n // Ensure we don't serialize AbortSignal\n const { signal: _signal, ...jsonBody } = body\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(jsonBody),\n signal: options.signal,\n })\n\n if (!response.ok) {\n await this.handleErrorResponse(response)\n }\n\n if (!response.body) {\n throw new BlinkNetworkError('No response body for streaming')\n }\n\n return this.parseDataStream(response.body, onChunk)\n } catch (error) {\n if (error instanceof BlinkError) {\n throw error\n }\n \n throw new BlinkNetworkError(\n `Streaming request failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 0,\n { originalError: error }\n )\n }\n }\n\n async aiObject(\n prompt: string,\n options: {\n model?: string\n output?: 'object' | 'array' | 'enum'\n schema?: any\n enum?: string[]\n stream?: boolean\n signal?: AbortSignal\n } = {}\n ): Promise<BlinkResponse<any>> {\n const { signal, ...body } = options\n const requestBody: any = { ...body }\n \n // Only include prompt if it's not empty\n if (prompt) {\n requestBody.prompt = prompt\n }\n \n return this.request(`/api/ai/${this.projectId}/object`, {\n method: 'POST',\n body: requestBody,\n signal,\n })\n }\n\n /**\n * Stream AI object generation with Vercel AI SDK data stream format\n */\n async streamAiObject(\n prompt: string,\n options: {\n model?: string\n output?: 'object' | 'array' | 'enum'\n schema?: any\n enum?: string[]\n signal?: AbortSignal\n } = {},\n onPartial: (partial: any) => void\n ): Promise<any> {\n const url = this.buildUrl(`/api/ai/${this.projectId}/object`)\n \n // Use intelligent token management if available, otherwise fallback to basic getToken\n const token = this.getValidToken \n ? await this.getValidToken()\n : this.getToken()\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n // Add authentication header if token is available\n if (token) {\n headers.Authorization = `Bearer ${token}`\n }\n\n const body = {\n prompt,\n stream: true,\n ...options,\n }\n\n // Ensure we don't serialize AbortSignal\n const { signal: _signal2, ...jsonBody2 } = body\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(jsonBody2),\n signal: options.signal,\n })\n\n if (!response.ok) {\n await this.handleErrorResponse(response)\n }\n\n if (!response.body) {\n throw new BlinkNetworkError('No response body for streaming')\n }\n\n return this.parseDataStream(response.body, undefined, onPartial)\n } catch (error) {\n if (error instanceof BlinkError) {\n throw error\n }\n \n throw new BlinkNetworkError(\n `Streaming request failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 0,\n { originalError: error }\n )\n }\n }\n\n async aiImage(\n prompt: string,\n options: {\n model?: string\n size?: string // Flexible to support different models (e.g., '1024x1024', '512x512', '1792x1024', 'auto', etc.)\n quality?: 'standard' | 'hd'\n n?: number\n response_format?: 'url' | 'b64_json'\n signal?: AbortSignal\n } = {}\n ): Promise<BlinkResponse<any>> {\n const { signal, ...body } = options\n return this.request(`/api/ai/${this.projectId}/image`, {\n method: 'POST',\n body: {\n prompt,\n ...body,\n },\n signal,\n })\n }\n\n async aiSpeech(\n text: string,\n options: {\n model?: string\n voice?: string\n response_format?: string\n speed?: number\n signal?: AbortSignal\n } = {}\n ): Promise<BlinkResponse<any>> {\n const { signal, ...body } = options\n return this.request(`/api/ai/${this.projectId}/speech`, {\n method: 'POST',\n body: {\n text,\n ...body,\n },\n signal,\n })\n }\n\n async aiTranscribe(\n audio: string | number[],\n options: {\n model?: string\n language?: string\n response_format?: string\n signal?: AbortSignal\n } = {}\n ): Promise<BlinkResponse<any>> {\n const { signal, ...body } = options\n return this.request(`/api/ai/${this.projectId}/transcribe`, {\n method: 'POST',\n body: {\n audio,\n ...body,\n },\n signal,\n })\n }\n\n /**\n * Data-specific requests\n */\n \n async dataExtractFromUrl(projectId: string, request: ExtractFromUrlRequest): Promise<BlinkResponse<ExtractFromUrlResponse>> {\n return this.request<ExtractFromUrlResponse>(`/api/data/${projectId}/extract-from-url`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n async dataExtractFromBlob(\n projectId: string, \n file: File, \n chunking?: boolean, \n chunkSize?: number\n ): Promise<BlinkResponse<ExtractFromBlobResponse>> {\n const formData = new FormData();\n formData.append('file', file);\n if (chunking !== undefined) {\n formData.append('chunking', String(chunking));\n }\n if (chunkSize !== undefined) {\n formData.append('chunkSize', String(chunkSize));\n }\n\n return this.request<ExtractFromBlobResponse>(`/api/data/${projectId}/extract-from-blob`, {\n method: 'POST',\n body: formData,\n });\n }\n\n async dataScrape(projectId: string, request: ScrapeRequest): Promise<BlinkResponse<ScrapeResponse>> {\n return this.request<ScrapeResponse>(`/api/data/${projectId}/scrape`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n async dataScreenshot(projectId: string, request: ScreenshotRequest): Promise<BlinkResponse<ScreenshotResponse>> {\n return this.request<ScreenshotResponse>(`/api/data/${projectId}/screenshot`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n async dataFetch(projectId: string, request: FetchRequest): Promise<BlinkResponse<FetchResponse | AsyncFetchResponse>> {\n return this.request<FetchResponse | AsyncFetchResponse>(`/api/data/${projectId}/fetch`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Private helper methods\n */\n\n private buildUrl(path: string, searchParams?: Record<string, string>): string {\n // Only auth endpoints use authUrl, everything else uses coreUrl\n const baseUrl = path.includes('/api/auth/')\n ? this.authUrl \n : this.coreUrl\n \n const url = new URL(path, baseUrl)\n \n if (searchParams) {\n Object.entries(searchParams).forEach(([key, value]) => {\n url.searchParams.set(key, value)\n })\n }\n \n return url.toString()\n }\n\n private async parseResponse<T>(response: Response): Promise<T> {\n const contentType = response.headers.get('content-type')\n \n if (contentType?.includes('application/json')) {\n return response.json()\n }\n \n if (contentType?.includes('text/')) {\n return response.text() as T\n }\n \n // For binary data or unknown content types\n return response.blob() as T\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n let errorData: any\n \n try {\n const contentType = response.headers.get('content-type')\n if (contentType?.includes('application/json')) {\n errorData = await response.json()\n } else {\n errorData = { message: await response.text() }\n }\n } catch {\n errorData = { message: 'Unknown error occurred' }\n }\n\n const message = errorData.error?.message || errorData.message || `HTTP ${response.status}`\n const code = errorData.error?.code || errorData.code\n \n switch (response.status) {\n case 401:\n throw new BlinkAuthError(message, errorData)\n case 400:\n throw new BlinkValidationError(message, errorData)\n default:\n throw new BlinkNetworkError(message, response.status, errorData)\n }\n }\n\n /**\n * Parse Vercel AI SDK data stream format\n * Handles text chunks (0:\"text\"), partial objects (2:[...]), and metadata (d:, e:)\n */\n private async parseDataStream(\n body: ReadableStream<Uint8Array>,\n onChunk?: (chunk: string) => void,\n onPartial?: (partial: any) => void\n ): Promise<any> {\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n let finalResult: any = {}\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n \n if (done) break\n \n // Decode the chunk and add to buffer\n buffer += decoder.decode(value, { stream: true })\n \n // Process complete lines (handle both \\n and \\r\\n)\n const lines = buffer.split(/\\r?\\n/)\n buffer = lines.pop() || '' // Keep incomplete line in buffer\n \n for (const line of lines) {\n if (!line.trim()) continue\n \n try {\n // Parse Vercel AI SDK data stream format\n if (line.startsWith('f:')) {\n // Message metadata: f:{\"messageId\":\"msg-xxx\"}\n const metadata = JSON.parse(line.slice(2))\n finalResult.messageId = metadata.messageId\n } else if (line.startsWith('0:')) {\n // Text chunk: 0:\"text content\"\n const textChunk = JSON.parse(line.slice(2))\n if (onChunk) {\n onChunk(textChunk)\n }\n finalResult.text = (finalResult.text || '') + textChunk\n } else if (line.startsWith('2:')) {\n // Partial object or status: 2:[partial_object] or 2:[\"status\"]\n const data = JSON.parse(line.slice(2))\n if (Array.isArray(data) && data.length > 0) {\n const item = data[0]\n if (typeof item === 'string') {\n // Status message\n finalResult.status = item\n } else if (typeof item === 'object') {\n // Partial object\n if (onPartial) {\n onPartial(item)\n }\n finalResult.object = item\n }\n }\n } else if (line.startsWith('d:')) {\n // Data/metadata chunk: d:{\"usage\":{\"promptTokens\":10,\"completionTokens\":5},\"finishReason\":\"stop\"}\n const metadata = JSON.parse(line.slice(2))\n if (metadata.usage) {\n finalResult.usage = metadata.usage\n }\n if (metadata.finishReason) {\n finalResult.finishReason = metadata.finishReason\n }\n } else if (line.startsWith('e:')) {\n // Error chunk: e:{\"error\":\"message\"}\n const errorData = JSON.parse(line.slice(2))\n finalResult.error = errorData\n }\n } catch (error) {\n // Skip malformed lines but log for debugging\n console.warn('Failed to parse stream line:', line, error)\n }\n }\n }\n \n // Process any remaining buffer\n if (buffer.trim()) {\n try {\n if (buffer.startsWith('0:')) {\n const textChunk = JSON.parse(buffer.slice(2))\n if (onChunk) {\n onChunk(textChunk)\n }\n finalResult.text = (finalResult.text || '') + textChunk\n } else if (buffer.startsWith('2:')) {\n const data = JSON.parse(buffer.slice(2))\n if (Array.isArray(data) && data.length > 0) {\n const item = data[0]\n if (typeof item === 'object') {\n if (onPartial) {\n onPartial(item)\n }\n finalResult.object = item\n }\n }\n } else if (buffer.startsWith('d:')) {\n const metadata = JSON.parse(buffer.slice(2))\n if (metadata.usage) {\n finalResult.usage = metadata.usage\n }\n if (metadata.finishReason) {\n finalResult.finishReason = metadata.finishReason\n }\n }\n } catch (error) {\n console.warn('Failed to parse final buffer:', buffer, error)\n }\n }\n \n return finalResult\n } finally {\n reader.releaseLock()\n }\n }\n} ","/**\n * Blink Auth Module - Client-side authentication management\n * Handles token storage, user state, and authentication flows\n */\n\nimport type { \n BlinkUser, \n AuthTokens, \n AuthState, \n BlinkClientConfig \n} from '@blink/core'\nimport { BlinkAuthError } from '@blink/core'\n\nexport type AuthStateChangeCallback = (state: AuthState) => void\n\nexport class BlinkAuth {\n private config: BlinkClientConfig\n private authState: AuthState\n private listeners: Set<AuthStateChangeCallback> = new Set()\n private readonly authUrl = 'https://blink.new'\n\n constructor(config: BlinkClientConfig) {\n this.config = config\n \n // Initialize auth state\n this.authState = {\n user: null,\n tokens: null,\n isAuthenticated: false,\n isLoading: false,\n }\n\n // Auto-initialize if running in browser\n if (typeof window !== 'undefined') {\n this.initialize()\n }\n }\n\n /**\n * Initialize authentication from stored tokens or URL fragments\n */\n async initialize(): Promise<void> {\n console.log('π Initializing Blink Auth...')\n this.setLoading(true)\n\n try {\n // First, check for tokens in URL fragment (from auth redirect)\n const tokensFromUrl = this.extractTokensFromUrl()\n if (tokensFromUrl) {\n console.log('π₯ Found tokens in URL, setting them...')\n await this.setTokens(tokensFromUrl, true)\n this.clearUrlTokens()\n console.log('β
Auth initialization complete (from URL)')\n return\n }\n\n // Then check for stored tokens\n const storedTokens = this.getStoredTokens()\n if (storedTokens) {\n console.log('πΎ Found stored tokens, validating...', {\n hasAccessToken: !!storedTokens.access_token,\n hasRefreshToken: !!storedTokens.refresh_token,\n issuedAt: storedTokens.issued_at,\n expiresIn: storedTokens.expires_in,\n refreshExpiresIn: storedTokens.refresh_expires_in,\n currentTime: Math.floor(Date.now() / 1000)\n })\n \n // Set tokens to auth state first so refresh token is available\n this.authState.tokens = storedTokens\n console.log('π§ Tokens set in auth state, refresh token available:', !!this.authState.tokens?.refresh_token)\n \n // Try to validate the access token (this will auto-refresh if needed)\n const isValid = await this.validateStoredTokens(storedTokens)\n if (isValid) {\n console.log('β
Auth initialization complete (from storage)')\n return\n } else {\n console.log('π Stored tokens invalid, clearing...')\n this.clearTokens()\n }\n }\n\n // No tokens found\n console.log('β No tokens found')\n if (this.config.authRequired) {\n console.log('π Auth required, redirecting to auth page...')\n this.redirectToAuth()\n } else {\n console.log('β οΈ Auth not required, continuing without authentication')\n }\n } finally {\n this.setLoading(false)\n }\n }\n\n /**\n * Redirect to Blink auth page\n */\n login(nextUrl?: string): void {\n const redirectUrl = nextUrl || (typeof window !== 'undefined' ? window.location.href : '')\n const authUrl = new URL('/auth', this.authUrl)\n \n authUrl.searchParams.set('redirect_url', redirectUrl)\n if (this.config.projectId) {\n authUrl.searchParams.set('project_id', this.config.projectId)\n }\n\n if (typeof window !== 'undefined') {\n window.location.href = authUrl.toString()\n }\n }\n\n /**\n * Logout and clear stored tokens\n */\n logout(redirectUrl?: string): void {\n this.clearTokens()\n \n if (redirectUrl && typeof window !== 'undefined') {\n window.location.href = redirectUrl\n }\n }\n\n /**\n * Check if user is authenticated\n */\n isAuthenticated(): boolean {\n return this.authState.isAuthenticated\n }\n\n /**\n * Get current user (sync)\n */\n currentUser(): BlinkUser | null {\n return this.authState.user\n }\n\n /**\n * Get current access token\n */\n getToken(): string | null {\n return this.authState.tokens?.access_token || null\n }\n\n /**\n * Check if access token is expired based on timestamp\n */\n private isAccessTokenExpired(): boolean {\n const tokens = this.authState.tokens\n if (!tokens || !tokens.issued_at) {\n return true // Assume expired if no timestamp\n }\n\n const now = Math.floor(Date.now() / 1000) // Current time in seconds\n const expiresAt = tokens.issued_at + tokens.expires_in\n const bufferTime = 30 // Refresh 30 seconds before actual expiration\n \n return now >= (expiresAt - bufferTime)\n }\n\n /**\n * Check if refresh token is expired based on timestamp\n */\n private isRefreshTokenExpired(): boolean {\n const tokens = this.authState.tokens\n if (!tokens || !tokens.refresh_token || !tokens.issued_at || !tokens.refresh_expires_in) {\n return true // Assume expired if no refresh token or timestamp\n }\n\n const now = Math.floor(Date.now() / 1000) // Current time in seconds\n const expiresAt = tokens.issued_at + tokens.refresh_expires_in\n \n return now >= expiresAt\n }\n\n /**\n * Get a valid access token, refreshing if necessary\n */\n async getValidToken(): Promise<string | null> {\n const tokens = this.authState.tokens\n if (!tokens) {\n return null\n }\n\n // If access token is not expired, return it\n if (!this.isAccessTokenExpired()) {\n console.log('β
Access token is still valid')\n return tokens.access_token\n }\n\n // Access token is expired, try to refresh\n console.log('β° Access token expired, attempting refresh...')\n \n if (this.isRefreshTokenExpired()) {\n console.log('β Refresh token also expired, clearing tokens')\n this.clearTokens()\n if (this.config.authRequired) {\n this.redirectToAuth()\n }\n return null\n }\n\n // Try to refresh the token\n const refreshed = await this.refreshToken()\n if (refreshed) {\n console.log('β
Token refreshed successfully')\n return this.authState.tokens?.access_token || null\n } else {\n console.log('β Token refresh failed')\n this.clearTokens()\n if (this.config.authRequired) {\n this.redirectToAuth()\n }\n return null\n }\n }\n\n /**\n * Fetch current user profile from API\n */\n async me(): Promise<BlinkUser> {\n let token = this.getToken()\n if (!token) {\n throw new BlinkAuthError('No access token available')\n }\n\n try {\n const response = await fetch(`${this.authUrl}/api/auth/me`, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n },\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n // Try to refresh token first\n const refreshed = await this.refreshToken()\n if (refreshed) {\n // Retry with new token\n token = this.getToken()\n if (token) {\n const retryResponse = await fetch(`${this.authUrl}/api/auth/me`, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n },\n })\n if (retryResponse.ok) {\n const retryData = await retryResponse.json()\n const user = retryData.user\n this.updateAuthState({\n ...this.authState,\n user,\n })\n return user\n }\n }\n }\n \n // Refresh failed or retry failed\n this.clearTokens()\n if (this.config.authRequired) {\n this.redirectToAuth()\n }\n }\n throw new BlinkAuthError(`Failed to fetch user: ${response.statusText}`)\n }\n\n const data = await response.json()\n const user = data.user\n\n // Update auth state with fresh user data\n this.updateAuthState({\n ...this.authState,\n user,\n })\n\n return user\n } catch (error) {\n if (error instanceof BlinkAuthError) {\n throw error\n }\n throw new BlinkAuthError(`Network error: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n }\n\n /**\n * Update user profile\n */\n async updateMe(updates: Partial<BlinkUser>): Promise<BlinkUser> {\n const token = this.getToken()\n if (!token) {\n throw new BlinkAuthError('No access token available')\n }\n\n try {\n const response = await fetch(`${this.authUrl}/api/auth/me`, {\n method: 'PATCH',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(updates),\n })\n\n if (!response.ok) {\n throw new BlinkAuthError(`Failed to update user: ${response.statusText}`)\n }\n\n const data = await response.json()\n const user = data.user\n\n // Update auth state with updated user data\n this.updateAuthState({\n ...this.authState,\n user,\n })\n\n return user\n } catch (error) {\n if (error instanceof BlinkAuthError) {\n throw error\n }\n throw new BlinkAuthError(`Network error: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n }\n\n /**\n * Manually set tokens (for server-side usage)\n */\n async setToken(jwt: string, persist: boolean = false): Promise<void> {\n const tokens: AuthTokens = {\n access_token: jwt,\n token_type: 'Bearer',\n expires_in: 15 * 60, // Default 15 minutes\n }\n\n await this.setTokens(tokens, persist)\n }\n\n /**\n * Refresh access token using refresh token\n */\n async refreshToken(): Promise<boolean> {\n const refreshToken = this.authState.tokens?.refresh_token\n if (!refreshToken) {\n return false\n }\n\n try {\n const response = await fetch(`${this.authUrl}/api/auth/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n refresh_token: refreshToken,\n }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n // Refresh token is invalid/expired\n this.clearTokens()\n if (this.config.authRequired) {\n this.redirectToAuth()\n }\n }\n return false\n }\n\n const data = await response.json()\n await this.setTokens({\n access_token: data.access_token,\n refresh_token: data.refresh_token,\n token_type: data.token_type,\n expires_in: data.expires_in,\n refresh_expires_in: data.refresh_expires_in,\n }, true)\n\n return true\n } catch (error) {\n console.error('Token refresh failed:', error)\n return false\n }\n }\n\n /**\n * Add auth state change listener\n */\n onAuthStateChanged(callback: AuthStateChangeCallback): () => void {\n this.listeners.add(callback)\n \n // Call immediately with current state\n callback(this.authState)\n \n // Return unsubscribe function\n return () => {\n this.listeners.delete(callback)\n }\n }\n\n /**\n * Private helper methods\n */\n\n private async validateStoredTokens(tokens: AuthTokens): Promise<boolean> {\n try {\n console.log('π Validating stored tokens...')\n \n // Check if access token is expired based on timestamp first\n if (this.isAccessTokenExpired()) {\n console.log('β° Access token expired based on timestamp, attempting refresh...')\n \n if (!tokens.refresh_token) {\n console.log('β No refresh token available')\n return false\n }\n \n if (this.isRefreshTokenExpired()) {\n console.log('β Refresh token also expired')\n return false\n }\n \n // Try to refresh the token\n const refreshed = await this.refreshToken()\n if (refreshed) {\n console.log('β
Token refreshed successfully during validation')\n return true\n } else {\n console.log('β Token refresh failed during validation')\n return false\n }\n }\n \n // Access token should be valid, verify with API\n const response = await fetch(`${this.authUrl}/api/auth/me`, {\n headers: {\n 'Authorization': `Bearer ${tokens.access_token}`,\n },\n })\n\n if (response.ok) {\n // Token is valid, update auth state\n const data = await response.json()\n const user = data.user\n \n this.updateAuthState({\n user,\n tokens,\n isAuthenticated: true,\n isLoading: false,\n })\n \n console.log('β
Stored tokens are valid, user authenticated')\n return true\n } else if (response.status === 401 && tokens.refresh_token) {\n // Access token expired (server-side validation), try to refresh\n console.log('π Access token expired (server validation), attempting refresh...')\n \n if (this.isRefreshTokenExpired()) {\n console.log('β Refresh token expired')\n return false\n }\n \n const refreshed = await this.refreshToken()\n if (refreshed) {\n console.log('β
Token refreshed successfully after server validation')\n return true\n } else {\n console.log('β Token refresh failed after server validation')\n return false\n }\n } else {\n console.log('β Token validation failed:', response.status, response.statusText)\n return false\n }\n } catch (error) {\n console.log('π₯ Error validating tokens:', error)\n return false\n }\n }\n\n private async setTokens(tokens: AuthTokens, persist: boolean): Promise<void> {\n // Add issued_at timestamp if not present\n const tokensWithTimestamp: AuthTokens = {\n ...tokens,\n issued_at: tokens.issued_at || Math.floor(Date.now() / 1000)\n }\n\n console.log('π Setting tokens:', {\n persist,\n hasAccessToken: !!tokensWithTimestamp.access_token,\n hasRefreshToken: !!tokensWithTimestamp.refresh_token,\n expiresIn: tokensWithTimestamp.expires_in,\n issuedAt: tokensWithTimestamp.issued_at\n })\n\n if (persist && typeof window !== 'undefined') {\n localStorage.setItem('blink_tokens', JSON.stringify(tokensWithTimestamp))\n console.log('πΎ Tokens persisted to localStorage')\n }\n\n // Try to fetch user data with the new token\n let user: BlinkUser | null = null\n try {\n console.log('π€ Fetching user data...')\n const response = await fetch(`${this.authUrl}/api/auth/me`, {\n headers: {\n 'Authorization': `Bearer ${tokensWithTimestamp.access_token}`,\n },\n })\n\n console.log('π‘ User fetch response:', {\n status: response.status,\n statusText: response.statusText,\n ok: response.ok\n })\n\n if (response.ok) {\n const data = await response.json()\n user = data.user\n console.log('β
User data fetched successfully:', {\n id: user?.id,\n email: user?.email,\n displayName: user?.displayName\n })\n } else {\n console.log('β Failed to fetch user data:', await response.text())\n }\n } catch (error) {\n console.log('π₯ Error fetching user data:', error)\n }\n\n this.updateAuthState({\n user,\n tokens: tokensWithTimestamp,\n isAuthenticated: !!user,\n isLoading: false,\n })\n\n console.log('π― Auth state updated:', {\n hasUser: !!user,\n isAuthenticated: !!user,\n isLoading: false\n })\n }\n\n private clearTokens(): void {\n if (typeof window !== 'undefined') {\n localStorage.removeItem('blink_tokens')\n }\n\n this.updateAuthState({\n user: null,\n tokens: null,\n isAuthenticated: false,\n isLoading: false,\n })\n }\n\n private getStoredTokens(): AuthTokens | null {\n if (typeof window === 'undefined') return null\n\n try {\n const stored = localStorage.getItem('blink_tokens')\n console.log('π Checking localStorage for tokens:', {\n hasStoredData: !!stored,\n storedLength: stored?.length || 0\n })\n \n if (stored) {\n const tokens = JSON.parse(stored)\n console.log('π¦ Parsed stored tokens:', {\n hasAccessToken: !!tokens.access_token,\n hasRefreshToken: !!tokens.refresh_token,\n tokenType: tokens.token_type,\n expiresIn: tokens.expires_in\n })\n return tokens\n }\n \n return null\n } catch (error) {\n console.log('π₯ Error parsing stored tokens:', error)\n localStorage.removeItem('blink_tokens') // Clean up corrupted data\n return null\n }\n }\n\n private extractTokensFromUrl(): AuthTokens | null {\n if (typeof window === 'undefined') return null\n\n const params = new URLSearchParams(window.location.search)\n const accessToken = params.get('access_token')\n const refreshToken = params.get('refresh_token')\n\n console.log('π Extracting tokens from URL:', {\n url: window.location.href,\n accessToken: accessToken ? `${accessToken.substring(0, 20)}...` : null,\n refreshToken: refreshToken ? `${refreshToken.substring(0, 20)}...` : null,\n allParams: Object.fromEntries(params.entries())\n })\n\n if (accessToken) {\n const tokens: AuthTokens = {\n access_token: accessToken,\n refresh_token: refreshToken || undefined,\n token_type: 'Bearer' as const,\n expires_in: 15 * 60, // 15 minutes default\n refresh_expires_in: refreshToken ? 30 * 24 * 60 * 60 : undefined, // 30 days default\n issued_at: Math.floor(Date.now() / 1000), // Current timestamp\n }\n console.log('β
Tokens extracted successfully:', {\n hasAccessToken: !!tokens.access_token,\n hasRefreshToken: !!tokens.refresh_token\n })\n return tokens\n }\n\n console.log('β No access token found in URL')\n return null\n }\n\n private clearUrlTokens(): void {\n if (typeof window === 'undefined') return\n\n const url = new URL(window.location.href)\n \n // Remove all auth-related parameters\n url.searchParams.delete('access_token')\n url.searchParams.delete('refresh_token')\n url.searchParams.delete('token_type')\n url.searchParams.delete('project_id')\n url.searchParams.delete('expires_in')\n url.searchParams.delete('refresh_expires_in')\n url.searchParams.delete('state')\n url.searchParams.delete('code')\n url.searchParams.delete('error')\n url.searchParams.delete('error_description')\n \n // Clean the URL by replacing the current history entry\n window.history.replaceState({}, '', url.toString())\n console.log('π§Ή URL cleaned up, removed auth parameters')\n }\n\n private redirectToAuth(): void {\n if (typeof window !== 'undefined') {\n this.login()\n }\n }\n\n private setLoading(loading: boolean): void {\n this.updateAuthState({\n ...this.authState,\n isLoading: loading,\n })\n }\n\n private updateAuthState(newState: AuthState): void {\n this.authState = newState\n \n // Notify all listeners\n this.listeners.forEach(callback => {\n try {\n callback(newState)\n } catch (error) {\n console.error('Error in auth state change callback:', error)\n }\n })\n }\n} ","/**\n * Blink Database Module - Table operations and query interface\n * Provides CRUD operations with PostgREST-compatible API\n */\n\nimport type {\n TableOperations,\n QueryOptions,\n ListResponse,\n CreateOptions,\n UpdateOptions,\n UpsertOptions,\n FilterCondition,\n HttpClient,\n} from '@blink/core'\nimport { buildQuery, queryToSearchParams } from '@blink/core'\n\nexport class BlinkTable<T = any> implements TableOperations<T> {\n constructor(\n private tableName: string,\n private httpClient: HttpClient\n ) {}\n\n /**\n * Create a single record\n */\n async create(data: Partial<T>, options: CreateOptions = {}): Promise<T> {\n const response = await this.httpClient.dbPost<T>(\n this.tableName,\n data,\n { returning: options.returning !== false }\n )\n\n // Handle both single record and array responses\n const result = Array.isArray(response.data) ? response.data[0] : response.data\n if (!result) {\n throw new Error('Failed to create record')\n }\n\n return result\n }\n\n /**\n * Create multiple records\n */\n async createMany(data: Partial<T>[], options: CreateOptions = {}): Promise<T[]> {\n const response = await this.httpClient.dbPost<T[]>(\n this.tableName,\n data,\n { returning: options.returning !== false }\n )\n\n return Array.isArray(response.data) ? response.data as T[] : [response.data as T]\n }\n\n /**\n * Upsert a single record (insert or update on conflict)\n */\n async upsert(data: Partial<T>, options: UpsertOptions = {}): Promise<T> {\n // Add upsert-specific headers\n const headers: Record<string, string> = {}\n if (options.returning !== false) {\n headers.Prefer = 'return=representation'\n }\n if (options.onConflict) {\n headers['Prefer'] = `${headers['Prefer'] || ''} resolution=merge-duplicates`.trim()\n }\n\n const response = await this.httpClient.request<T | T[]>(\n `/api/db/${this.httpClient.projectId}/rest/v1/${this.tableName}?on_conflict=${options.onConflict || 'id'}`,\n {\n method: 'POST',\n body: data,\n headers,\n }\n )\n\n const result = Array.isArray(response.data) ? response.data[0] : response.data\n if (!result) {\n throw new Error('Failed to upsert record')\n }\n\n return result\n }\n\n /**\n * Upsert multiple records\n */\n async upsertMany(data: Partial<T>[], options: UpsertOptions = {}): Promise<T[]> {\n const headers: Record<string, string> = {}\n if (options.returning !== false) {\n headers.Prefer = 'return=representation'\n }\n if (options.onConflict) {\n headers['Prefer'] = `${headers['Prefer'] || ''} resolution=merge-duplicates`.trim()\n }\n\n const response = await this.httpClient.request<T[]>(\n `/api/db/${this.httpClient.projectId}/rest/v1/${this.tableName}?on_conflict=${options.onConflict || 'id'}`,\n {\n method: 'POST',\n body: data,\n headers,\n }\n )\n\n return Array.isArray(response.data) ? response.data : [response.data]\n }\n\n /**\n * Get a single record by ID\n */\n async get(id: string): Promise<T | null> {\n const searchParams = {\n id: `eq.${id}`,\n limit: '1',\n }\n\n const response = await this.httpClient.dbGet<T>(this.tableName, searchParams)\n const records = response.data\n\n return records.length > 0 ? records[0]! : null\n }\n\n /**\n * List records with filtering, sorting, and pagination\n */\n async list(options: QueryOptions = {}): Promise<ListResponse<T>> {\n const queryParams = buildQuery(options)\n const searchParams = queryParams\n\n const response = await this.httpClient.dbGet<T>(this.tableName, searchParams)\n const records = response.data\n\n // Calculate pagination info\n const hasMore = options.limit ? records.length === options.limit : false\n const nextCursor = hasMore && records.length > 0 \n ? this.extractCursor(records[records.length - 1]!)\n : undefined\n\n return {\n data: records,\n count: records.length,\n nextCursor,\n hasMore,\n }\n }\n\n /**\n * Update a single record by ID\n */\n async update(id: string, data: Partial<T>, options: UpdateOptions = {}): Promise<T> {\n const searchParams = {\n id: `eq.${id}`,\n }\n\n const response = await this.httpClient.dbPatch<T>(\n this.tableName,\n data,\n searchParams,\n { returning: options.returning !== false }\n )\n\n const records = response.data\n if (!records || records.length === 0) {\n throw new Error(`Record with id ${id} not found`)\n }\n\n return records[0]!\n }\n\n /**\n * Update multiple records\n */\n async updateMany(\n updates: Array<{ id: string } & Partial<T>>,\n options: UpdateOptions = {}\n ): Promise<T[]> {\n // For batch updates, we'll use individual update calls\n // In a real implementation, you might want to use a batch endpoint\n const results: T[] = []\n\n for (const update of updates) {\n const { id, ...data } = update\n const result = await this.update(id, data as Partial<T>, options)\n results.push(result)\n }\n\n return results\n }\n\n /**\n * Delete a single record by ID\n */\n async delete(id: string): Promise<void> {\n const searchParams = {\n id: `eq.${id}`,\n }\n\n await this.httpClient.dbDelete(this.tableName, searchParams)\n }\n\n /**\n * Delete multiple records based on filter\n */\n async deleteMany(options: { where: FilterCondition }): Promise<void> {\n const queryParams = buildQuery({ where: options.where })\n const searchParams = queryParams\n\n await this.httpClient.dbDelete(this.tableName, searchParams)\n }\n\n /**\n * Count records matching filter\n */\n async count(options: { where?: FilterCondition } = {}): Promise<number> {\n const queryParams = buildQuery({\n where: options.where,\n select: ['id'],\n })\n\n // Use the HTTP client's request method to add proper headers\n const response = await this.httpClient.request<any[]>(\n `/api/db/${this.httpClient.projectId}/rest/v1/${this.tableName}`,\n {\n method: 'GET',\n searchParams: queryParams,\n headers: {\n 'Prefer': 'count=exact'\n }\n }\n )\n \n // PostgREST returns count in Content-Range header\n const contentRange = response.headers.get('content-range')\n if (contentRange) {\n const match = contentRange.match(/\\/(\\d+)$/)\n if (match && match[1]) {\n return parseInt(match[1], 10)\n }\n }\n\n // Fallback to array length\n return Array.isArray(response.data) ? response.data.length : 0\n }\n\n /**\n * Check if any records exist matching filter\n */\n async exists(options: { where: FilterCondition }): Promise<boolean> {\n const count = await this.count(options)\n return count > 0\n }\n\n /**\n * Raw SQL query on this table (for advanced use cases)\n */\n async sql<R = any>(\n query: string,\n params?: any[]\n ): Promise<{\n rows: R[]\n columns: string[]\n rowCount: number\n executionTime: number\n }> {\n const response = await this.httpClient.dbSql<R>(query, params)\n return response.data\n }\n\n /**\n * Private helper methods\n */\n\n private extractCursor(record: any): string {\n // Use the record's ID as cursor by default\n // In a real implementation, you might want to use a timestamp or other field\n return record.id || record._id || String(Math.random())\n }\n}\n\nexport class BlinkDatabase {\n private tables: Map<string, BlinkTable> = new Map()\n\n constructor(private httpClient: HttpClient) {\n // Create the proxy instance\n const proxy = new Proxy(this, {\n get(target, prop: string | symbol) {\n // Always allow access to the table method\n if (prop === 'table') {\n return target.table.bind(target)\n }\n \n // For other methods and properties, return them directly\n if (prop in target) {\n const value = (target as any)[prop]\n return typeof value === 'function' ? value.bind(target) : value\n }\n \n // For unknown string properties, treat them as table names\n if (typeof prop === 'string') {\n return target.table(prop)\n }\n \n return undefined\n },\n })\n \n // Return the proxy\n return proxy as any\n }\n\n /**\n * Get a table instance for any table name\n */\n table<T = any>(tableName: string): BlinkTable<T> {\n if (!this.tables.has(tableName)) {\n this.tables.set(tableName, new BlinkTable<T>(tableName, this.httpClient))\n }\n const table = this.tables.get(tableName)\n if (!table) {\n throw new Error(`Table ${tableName} not found`)\n }\n return table as BlinkTable<T>\n }\n\n /**\n * Execute raw SQL query\n */\n async sql<T = any>(\n query: string,\n params?: any[]\n ): Promise<{\n rows: T[]\n columns: string[]\n rowCount: number\n executionTime: number\n }> {\n const response = await this.httpClient.dbSql<T>(query, params)\n return response.data\n }\n\n /**\n * Execute batch SQL operations\n */\n async batch<T = any>(\n statements: Array<{ sql: string; args?: any[] }>,\n mode: 'read' | 'write' = 'write'\n ): Promise<{\n results: Array<{\n rows: T[]\n columns: string[]\n rowCount: number\n }>\n executionTime: number\n success: boolean\n }> {\n const response = await this.httpClient.dbBatch<T>(statements, mode)\n return response.data\n }\n} ","/**\n * Blink Storage Module\n * Handles file upload and file removal\n */\n\nimport type { HttpClient } from '@blink/core'\nimport type { \n BlinkStorage,\n StorageUploadOptions,\n StorageUploadResponse,\n StorageResponse\n} from '@blink/core'\nimport { BlinkStorageError } from '@blink/core'\n\nexport class BlinkStorageImpl implements BlinkStorage {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Upload a file to project storage\n * \n * @param file - File, Blob, or Buffer to upload\n * @param path - Destination path within project storage\n * @param options - Upload options including upsert and progress callback\n * @returns Promise resolving to upload response with public URL\n * \n * @example\n * ```ts\n * const { publicUrl } = await blink.storage.upload(\n * fileInput.files[0],\n * `avatars/${user.id}.png`,\n * {\n * upsert: true,\n * onProgress: pct => console.log(`${pct}%`)\n * }\n * );\n * ```\n */\n async upload(\n file: File | Blob | Buffer,\n path: string,\n options: StorageUploadOptions = {}\n ): Promise<StorageUploadResponse> {\n try {\n // Validate inputs\n if (!file) {\n throw new BlinkStorageError('File is required')\n }\n \n if (!path || typeof path !== 'string' || !path.trim()) {\n throw new BlinkStorageError('Path must be a non-empty string')\n }\n\n // Check file size (50MB limit as per API)\n const maxSize = 50 * 1024 * 1024 // 50MB\n let fileSize = 0\n \n if (file instanceof File || file instanceof Blob) {\n fileSize = file.size\n } else if (typeof Buffer !== 'undefined' && file instanceof Buffer) {\n fileSize = file.length\n }\n \n if (fileSize > maxSize) {\n throw new BlinkStorageError(`File size (${Math.round(fileSize / 1024 / 1024)}MB) exceeds maximum allowed size (50MB)`)\n }\n\n const response = await this.httpClient.uploadFile(\n `/api/storage/${this.httpClient.projectId}/upload`,\n file,\n path,\n {\n upsert: options.upsert,\n onProgress: options.onProgress,\n }\n )\n\n // Handle the response based on API specification\n if (response.data?.data?.publicUrl) {\n return { publicUrl: response.data.data.publicUrl }\n } else if (response.data?.publicUrl) {\n return { publicUrl: response.data.publicUrl }\n } else {\n throw new BlinkStorageError('Invalid response format: missing publicUrl')\n }\n } catch (error) {\n if (error instanceof BlinkStorageError) {\n throw error\n }\n \n // Handle specific HTTP errors\n if (error instanceof Error && 'status' in error) {\n const status = (error as any).status\n if (status === 409) {\n throw new BlinkStorageError('File already exists. Set upsert: true to overwrite.', 409)\n }\n if (status === 400) {\n throw new BlinkStorageError('Invalid request parameters', 400)\n }\n }\n \n throw new BlinkStorageError(\n `Upload failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n\n\n\n /**\n * Remove one or more files from project storage\n * \n * @param paths - File paths to remove\n * @returns Promise that resolves when files are removed\n * \n * @example\n * ```ts\n * await blink.storage.remove('avatars/user1.png');\n * await blink.storage.remove('file1.pdf', 'file2.pdf', 'file3.pdf');\n * ```\n */\n async remove(...paths: string[]): Promise<void> {\n try {\n if (paths.length === 0) {\n throw new BlinkStorageError('At least one path must be provided')\n }\n\n // Validate all paths\n for (const path of paths) {\n if (!path || typeof path !== 'string') {\n throw new BlinkStorageError('All paths must be non-empty strings')\n }\n }\n\n await this.httpClient.request(\n `/api/storage/${this.httpClient.projectId}/remove`,\n {\n method: 'DELETE',\n body: { paths },\n headers: { 'Content-Type': 'application/json' },\n }\n )\n\n // API returns success response, no need to return anything for void method\n } catch (error) {\n if (error instanceof BlinkStorageError) {\n throw error\n }\n \n // Handle specific HTTP errors\n if (error instanceof Error && 'status' in error) {\n const status = (error as any).status\n if (status === 400) {\n throw new BlinkStorageError('Invalid request parameters', 400)\n }\n }\n \n throw new BlinkStorageError(\n `Failed to remove files: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n} ","/**\n * Blink AI Module\n * Provides AI generation capabilities with Vercel AI SDK compatibility\n */\n\nimport type { HttpClient } from '@blink/core'\nimport type { \n BlinkAI,\n TextGenerationRequest,\n TextGenerationResponse,\n ObjectGenerationRequest,\n ObjectGenerationResponse,\n ImageGenerationRequest,\n ImageGenerationResponse,\n SpeechGenerationRequest,\n SpeechGenerationResponse,\n TranscriptionRequest,\n TranscriptionResponse\n} from '@blink/core'\nimport { BlinkAIError } from '@blink/core'\n\nexport class BlinkAIImpl implements BlinkAI {\n constructor(private httpClient: HttpClient) {}\n\n // Supported image formats for validation\n private readonly SUPPORTED_IMAGE_FORMATS = ['jpg', 'jpeg', 'png', 'gif', 'webp'] as const\n\n /**\n * Validates if a URL is a valid HTTPS image URL\n */\n private validateImageUrl(url: string): { isValid: boolean; error?: string } {\n try {\n const parsedUrl = new URL(url)\n \n // Only allow HTTPS for security\n if (parsedUrl.protocol !== 'https:') {\n return { isValid: false, error: 'Image URLs must use HTTPS protocol' }\n }\n \n // Check if URL has a supported image format extension\n const pathname = parsedUrl.pathname.toLowerCase()\n const hasValidExtension = this.SUPPORTED_IMAGE_FORMATS.some(format => \n pathname.endsWith(`.${format}`)\n )\n \n if (!hasValidExtension) {\n return { \n isValid: false, \n error: `Image URL must end with a supported format: ${this.SUPPORTED_IMAGE_FORMATS.join(', ')}` \n }\n }\n \n return { isValid: true }\n } catch (error) {\n return { isValid: false, error: 'Invalid URL format' }\n }\n }\n\n /**\n * Validates messages for image content\n */\n private validateMessages(messages: any[]): { isValid: boolean; errors: string[] } {\n const errors: string[] = []\n \n messages.forEach((message, messageIndex) => {\n if (Array.isArray(message.content)) {\n message.content.forEach((item: any, contentIndex: number) => {\n if (item.type === 'image') {\n if (!item.image || typeof item.image !== 'string') {\n errors.push(`Message ${messageIndex}, content ${contentIndex}: Image content must have a valid image URL`)\n } else {\n const validation = this.validateImageUrl(item.image)\n if (!validation.isValid) {\n errors.push(`Message ${messageIndex}, content ${contentIndex}: ${validation.error}`)\n }\n }\n }\n })\n }\n })\n \n return { isValid: errors.length === 0, errors }\n }\n\n /**\n * Get MIME type for audio format\n */\n private getMimeTypeForFormat(format: string): string {\n const mimeTypes: Record<string, string> = {\n mp3: 'audio/mpeg',\n opus: 'audio/opus',\n aac: 'audio/aac',\n flac: 'audio/flac',\n wav: 'audio/wav',\n pcm: 'audio/pcm'\n }\n return mimeTypes[format] || 'audio/mpeg'\n }\n\n /**\n * Generates a text response using the Blink AI engine.\n * \n * @param options - An object containing either:\n * - `prompt`: a simple string prompt\n * - OR `messages`: an array of chat messages for conversation\n * - Plus optional model, search, maxSteps, experimental_continueSteps, maxTokens, temperature, signal parameters\n * \n * @example\n * ```ts\n * // Simple prompt\n * const { text } = await blink.ai.generateText({ \n * prompt: \"Write a poem about coding\" \n * });\n * \n * // Chat messages (text only)\n * const { text } = await blink.ai.generateText({\n * messages: [\n * { role: \"system\", content: \"You are a helpful assistant\" },\n * { role: \"user\", content: \"Explain quantum computing\" }\n * ]\n * });\n * \n * // With image content\n * const { text } = await blink.ai.generateText({\n * messages: [\n * { \n * role: \"user\", \n * content: [\n * { type: \"text\", text: \"What do you see in this image?\" },\n * { type: \"image\", image: \"https://example.com/photo.jpg\" }\n * ]\n * }\n * ]\n * });\n * \n * // Mixed content with multiple images\n * const { text } = await blink.ai.generateText({\n * messages: [\n * { \n * role: \"user\", \n * content: [\n * { type: \"text\", text: \"Compare these two images:\" },\n * { type: \"image\", image: \"https://example.com/image1.jpg\" },\n * { type: \"image\", image: \"https://example.com/image2.jpg\" }\n * ]\n * }\n * ]\n * });\n * \n * // With options\n * const { text, usage } = await blink.ai.generateText({\n * prompt: \"Summarize this article\",\n * model: \"gpt-4o-mini\",\n * maxTokens: 150,\n * temperature: 0.7\n * });\n * \n * // With web search (OpenAI models only)\n * const { text, sources } = await blink.ai.generateText({\n * prompt: \"What are the latest developments in AI?\",\n * model: \"gpt-4o-mini\",\n * search: true // Enables web search\n * });\n * \n * // With advanced multi-step configuration\n * const { text } = await blink.ai.generateText({\n * prompt: \"Research and analyze recent tech trends\",\n * model: \"gpt-4o\",\n * search: true,\n * maxSteps: 10, // Allow up to 10 reasoning steps\n * experimental_continueSteps: true // Enable continued reasoning\n * });\n * ```\n * \n * @returns Promise<TextGenerationResponse> - Object containing:\n * - `text`: Generated text string\n * - `usage`: Token usage information\n * - `finishReason`: Why generation stopped (\"stop\", \"length\", etc.)\n */\n async generateText(options: TextGenerationRequest): Promise<TextGenerationResponse> {\n try {\n if (!options.prompt && !options.messages) {\n throw new BlinkAIError('Either prompt or messages is required')\n }\n\n // Validate messages if they contain image content\n if (options.messages) {\n const validation = this.validateMessages(options.messages)\n if (!validation.isValid) {\n throw new BlinkAIError(`Message validation failed: ${validation.errors.join('; ')}`)\n }\n }\n\n // Build request body - include prompt only if provided\n const requestBody: any = {\n model: options.model,\n stream: false,\n search: options.search,\n maxSteps: options.maxSteps,\n experimental_continueSteps: options.experimental_continueSteps,\n maxTokens: options.maxTokens,\n temperature: options.temperature,\n signal: options.signal,\n }\n \n if (options.prompt) {\n requestBody.prompt = options.prompt\n }\n \n if (options.messages) {\n requestBody.messages = options.messages\n }\n\n const response = await this.httpClient.aiText(\n options.prompt || '',\n requestBody\n )\n\n // Handle API response format\n if (response.data?.result) {\n return response.data.result\n } else if (response.data?.text) {\n return response.data\n } else {\n throw new BlinkAIError('Invalid response format: missing text')\n }\n } catch (error) {\n if (error instanceof BlinkAIError) {\n throw error\n }\n throw new BlinkAIError(\n `Text generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n\n /**\n * Streams text generation with real-time updates as the AI generates content.\n * \n * @param options - Same as generateText: either `prompt` or `messages` with optional parameters including search, maxSteps, experimental_continueSteps\n * @param onChunk - Callback function that receives each text chunk as it's generated\n * \n * @example\n * ```ts\n * // Stream with prompt\n * await blink.ai.streamText(\n * { prompt: \"Write a short story about space exploration\" },\n * (chunk) => {\n * process.stdout.write(chunk); // Real-time output\n * }\n * );\n * \n * // Stream with messages\n * await blink.ai.streamText(\n * { \n * messages: [\n * { role: \"system\", content: \"You are a creative writer\" },\n * { role: \"user\", content: \"Write a haiku about programming\" }\n * ]\n * },\n * (chunk) => updateUI(chunk)\n * );\n * ```\n * \n * @returns Promise<TextGenerationResponse> - Final complete response with full text and metadata\n */\n async streamText(\n options: TextGenerationRequest,\n onChunk: (chunk: string) => void\n ): Promise<TextGenerationResponse> {\n try {\n if (!options.prompt && !options.messages) {\n throw new BlinkAIError('Either prompt or messages is required')\n }\n\n // Validate messages if they contain image content\n if (options.messages) {\n const validation = this.validateMessages(options.messages)\n if (!validation.isValid) {\n throw new BlinkAIError(`Message validation failed: ${validation.errors.join('; ')}`)\n }\n }\n\n const result = await this.httpClient.streamAiText(\n options.prompt || '',\n {\n model: options.model,\n messages: options.messages,\n search: options.search,\n maxSteps: options.maxSteps,\n experimental_continueSteps: options.experimental_continueSteps,\n maxTokens: options.maxTokens,\n temperature: options.temperature,\n signal: options.signal,\n },\n onChunk\n )\n\n return {\n text: result.text || '',\n finishReason: 'stop',\n usage: result.usage,\n ...result,\n }\n } catch (error) {\n if (error instanceof BlinkAIError) {\n throw error\n }\n throw new BlinkAIError(\n `Text streaming failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n\n /**\n * Generates structured JSON objects using AI with schema validation.\n * \n * @param options - Object containing:\n * - `prompt`: Description of what object to generate (required)\n * - `schema`: JSON Schema to validate the generated object\n * - `output`: Type of output (\"object\", \"array\", \"enum\")\n * - `enum`: Array of allowed values for enum output\n * - Plus optional model, signal parameters\n * \n * @example\n * ```ts\n * // Generate user profile\n * const { object } = await blink.ai.generateObject({\n * prompt: \"Generate a user profile for a software developer\",\n * schema: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\" },\n * age: { type: \"number\" },\n * skills: { type: \"array\", items: { type: \"string\" } },\n * experience: { type: \"number\" }\n * },\n * required: [\"name\", \"skills\"]\n * }\n * });\n * \n * // Generate array of items\n * const { object } = await blink.ai.generateObject({\n * prompt: \"List 5 programming languages\",\n * output: \"array\",\n * schema: {\n * type: \"array\",\n * items: { type: \"string\" }\n * }\n * });\n * \n * // Generate enum value\n * const { object } = await blink.ai.generateObject({\n * prompt: \"Choose the best programming language for web development\",\n * output: \"enum\",\n * enum: [\"JavaScript\", \"Python\", \"TypeScript\", \"Go\"]\n * });\n * ```\n * \n * @returns Promise<ObjectGenerationResponse> - Object containing:\n * - `object`: The generated and validated JSON object/array/enum\n * - `usage`: Token usage information\n * - `finishReason`: Why generation stopped\n */\n async generateObject(options: ObjectGenerationRequest): Promise<ObjectGenerationResponse> {\n try {\n if (!options.prompt) {\n throw new BlinkAIError('Prompt is required')\n }\n\n const response = await this.httpClient.aiObject(\n options.prompt,\n {\n model: options.model,\n output: options.output,\n schema: options.schema,\n enum: options.enum,\n stream: false,\n signal: options.signal,\n }\n )\n\n // Handle API response format\n if (response.data?.result) {\n return response.data.result\n } else if (response.data?.object) {\n return response.data\n } else {\n throw new BlinkAIError('Invalid response format: missing object')\n }\n } catch (error) {\n if (error instanceof BlinkAIError) {\n throw error\n }\n throw new BlinkAIError(\n `Object generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n\n /**\n * Streams structured object generation with real-time partial updates as the AI builds the object.\n * \n * @param options - Same as generateObject: prompt, schema, output type, etc.\n * @param onPartial - Callback function that receives partial object updates as they're generated\n * \n * @example\n * ```ts\n * // Stream object generation with schema\n * await blink.ai.streamObject(\n * {\n * prompt: \"Generate a detailed product catalog entry\",\n * schema: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\" },\n * price: { type: \"number\" },\n * description: { type: \"string\" },\n * features: { type: \"array\", items: { type: \"string\" } }\n * }\n * }\n * },\n * (partial) => {\n * console.log(\"Partial update:\", partial);\n * updateProductForm(partial); // Update UI in real-time\n * }\n * );\n * ```\n * \n * @returns Promise<ObjectGenerationResponse> - Final complete object with metadata\n */\n async streamObject(\n options: ObjectGenerationRequest,\n onPartial: (partial: any) => void\n ): Promise<ObjectGenerationResponse> {\n try {\n if (!options.prompt) {\n throw new BlinkAIError('Prompt is required')\n }\n\n const result = await this.httpClient.streamAiObject(\n options.prompt,\n {\n model: options.model,\n output: options.output,\n schema: options.schema,\n enum: options.enum,\n signal: options.signal,\n },\n onPartial\n )\n\n return {\n object: result.object || {},\n finishReason: 'stop',\n usage: result.usage,\n ...result,\n }\n } catch (error) {\n if (error instanceof BlinkAIError) {\n throw error\n }\n throw new BlinkAIError(\n `Object streaming failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n\n /**\n * Generates images from text descriptions using AI image models.\n * \n * @param options - Object containing:\n * - `prompt`: Text description of the image to generate (required)\n * - `size`: Image dimensions (e.g., \"1024x1024\", \"512x512\") - varies by model\n * - `quality`: Image quality (\"standard\" or \"hd\")\n * - `n`: Number of images to generate (default: 1)\n * - `response_format`: Output format (\"url\" or \"b64_json\")\n * - Plus optional model, signal parameters\n * \n * @example\n * ```ts\n * // Basic image generation\n * const { data } = await blink.ai.generateImage({\n * prompt: \"A serene landscape with mountains and a lake at sunset\"\n * });\n * console.log(\"Image URL:\", data[0].url);\n * \n * // High-quality image with specific size\n * const { data } = await blink.ai.generateImage({\n * prompt: \"A futuristic city skyline with flying cars\",\n * size: \"1792x1024\",\n * quality: \"hd\",\n * model: \"dall-e-3\"\n * });\n * \n * // Multiple images\n * const { data } = await blink.ai.generateImage({\n * prompt: \"A cute robot mascot for a tech company\",\n * n: 3,\n * size: \"1024x1024\"\n * });\n * data.forEach((img, i) => console.log(`Image ${i+1}:`, img.url));\n * \n * // Base64 format for direct embedding\n * const { data } = await blink.ai.generateImage({\n * prompt: \"A minimalist logo design\",\n * response_format: \"b64_json\"\n * });\n * console.log(\"Base64 data:\", data[0].b64_json);\n * ```\n * \n * @returns Promise<ImageGenerationResponse> - Object containing:\n * - `data`: Array of generated images with url or b64_json\n */\n async generateImage(options: ImageGenerationRequest): Promise<ImageGenerationResponse> {\n try {\n if (!options.prompt) {\n throw new BlinkAIError('Prompt is required')\n }\n\n const response = await this.httpClient.aiImage(\n options.prompt,\n {\n model: options.model,\n size: options.size,\n quality: options.quality,\n n: options.n,\n response_format: options.response_format,\n signal: options.signal,\n }\n )\n\n // Handle API response format\n let imageResponse: ImageGenerationResponse\n \n if (response.data?.result?.data) {\n imageResponse = response.data.result\n } else if (response.data?.data) {\n imageResponse = response.data\n } else {\n throw new BlinkAIError('Invalid response format: missing image data')\n }\n\n // Ensure data array format and handle both URL and b64_json responses\n if (!Array.isArray(imageResponse.data)) {\n throw new BlinkAIError('Invalid response format: data should be an array')\n }\n\n // Normalize response format for both url and b64_json\n imageResponse.data = imageResponse.data.map((item: any) => {\n if (typeof item === 'string') {\n // Handle direct URL string\n return { url: item }\n } else if (item.url) {\n // Already has URL format\n return item\n } else if (item.b64_json) {\n // Handle base64 format\n return { b64_json: item.b64_json }\n } else {\n // Fallback - assume it's a URL\n return { url: item }\n }\n })\n\n return imageResponse\n } catch (error) {\n if (error instanceof BlinkAIError) {\n throw error\n }\n throw new BlinkAIError(\n `Image generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n\n /**\n * Converts text to speech using AI voice synthesis models.\n * \n * @param options - Object containing:\n * - `text`: Text content to convert to speech (required)\n * - `voice`: Voice to use (\"alloy\", \"echo\", \"fable\", \"onyx\", \"nova\", \"shimmer\")\n * - `response_format`: Audio format (\"mp3\", \"opus\", \"aac\", \"flac\", \"wav\", \"pcm\")\n * - `speed`: Speech speed (0.25 to 4.0, default: 1.0)\n * - Plus optional model, signal parameters\n * \n * @example\n * ```ts\n * // Basic text-to-speech\n * const { url } = await blink.ai.generateSpeech({\n * text: \"Hello, welcome to our AI-powered application!\"\n * });\n * console.log(\"Audio URL:\", url);\n * \n * // Custom voice and format\n * const { url, voice, format } = await blink.ai.generateSpeech({\n * text: \"This is a demonstration of our speech synthesis capabilities.\",\n * voice: \"nova\",\n * response_format: \"wav\",\n * speed: 1.2\n * });\n * console.log(`Generated ${format} audio with ${voice} voice:`, url);\n * \n * // Slow, clear speech for accessibility\n * const { url } = await blink.ai.generateSpeech({\n * text: \"Please listen carefully to these important instructions.\",\n * voice: \"echo\",\n * speed: 0.8\n * });\n * ```\n * \n * @returns Promise<SpeechGenerationResponse> - Object containing:\n * - `url`: URL to the generated audio file\n * - `voice`: Voice used for generation\n * - `format`: Audio format\n * - `mimeType`: MIME type of the audio\n */\n async generateSpeech(options: SpeechGenerationRequest): Promise<SpeechGenerationResponse> {\n try {\n if (!options.text) {\n throw new BlinkAIError('Text is required')\n }\n\n const response = await this.httpClient.aiSpeech(\n options.text,\n {\n model: options.model,\n voice: options.voice,\n response_format: options.response_format,\n speed: options.speed,\n signal: options.signal,\n }\n )\n\n // Handle API response format\n let speechResponse: SpeechGenerationResponse\n \n if (response.data?.result) {\n speechResponse = response.data.result\n } else if (response.data?.url) {\n speechResponse = response.data\n } else {\n throw new BlinkAIError('Invalid response format: missing speech data')\n }\n\n // Normalize response format - ensure we have all required fields\n if (!speechResponse.url) {\n // Try to extract from different possible response formats\n if (typeof response.data === 'string') {\n // Direct URL string - build full response\n speechResponse = {\n url: response.data,\n voice: options.voice || 'alloy',\n format: options.response_format || 'mp3',\n mimeType: this.getMimeTypeForFormat(options.response_format || 'mp3')\n }\n } else if (response.data?.data) {\n // Nested data format\n speechResponse = {\n url: response.data.data,\n voice: options.voice || 'alloy',\n format: options.response_format || 'mp3',\n mimeType: this.getMimeTypeForFormat(options.response_format || 'mp3')\n }\n } else {\n throw new BlinkAIError('Invalid response format: no audio URL found')\n }\n }\n\n // Ensure all required fields are present\n if (!speechResponse.voice) {\n speechResponse.voice = options.voice || 'alloy'\n }\n if (!speechResponse.format) {\n speechResponse.format = options.response_format || 'mp3'\n }\n if (!speechResponse.mimeType) {\n speechResponse.mimeType = this.getMimeTypeForFormat(speechResponse.format)\n }\n\n return speechResponse\n } catch (error) {\n if (error instanceof BlinkAIError) {\n throw error\n }\n throw new BlinkAIError(\n `Speech generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n\n /**\n * Transcribes audio content to text using AI speech recognition models.\n * \n * @param options - Object containing:\n * - `audio`: Audio input as URL string, base64 string, or number array buffer (required)\n * - `language`: Language code for transcription (e.g., \"en\", \"es\", \"fr\")\n * - `response_format`: Output format (\"json\", \"text\", \"srt\", \"verbose_json\", \"vtt\")\n * - Plus optional model, signal parameters\n * \n * @example\n * ```ts\n * // Transcribe from URL\n * const { text } = await blink.ai.transcribeAudio({\n * audio: \"https://example.com/meeting-recording.mp3\"\n * });\n * console.log(\"Transcription:\", text);\n * \n * // Transcribe with language hint\n * const { text, language } = await blink.ai.transcribeAudio({\n * audio: \"https://example.com/spanish-audio.wav\",\n * language: \"es\"\n * });\n * console.log(`Transcribed ${language}:`, text);\n * \n * // Transcribe with timestamps (verbose format)\n * const result = await blink.ai.transcribeAudio({\n * audio: audioFileUrl,\n * response_format: \"verbose_json\"\n * });\n * result.segments?.forEach(segment => {\n * console.log(`${segment.start}s - ${segment.end}s: ${segment.text}`);\n * });\n * \n * // Transcribe from audio buffer\n * const audioBuffer = new Array(1024).fill(0); // Your audio data\n * const { text } = await blink.ai.transcribeAudio({\n * audio: audioBuffer,\n * language: \"en\"\n * });\n * ```\n * \n * @returns Promise<TranscriptionResponse> - Object containing:\n * - `text`: Transcribed text content\n * - `transcript`: Alias for text\n * - `segments`: Array of timestamped segments (if verbose format)\n * - `language`: Detected language\n * - `duration`: Audio duration in seconds\n */\n async transcribeAudio(options: TranscriptionRequest): Promise<TranscriptionResponse> {\n try {\n if (!options.audio) {\n throw new BlinkAIError('Audio is required')\n }\n\n const response = await this.httpClient.aiTranscribe(\n options.audio,\n {\n model: options.model,\n language: options.language,\n response_format: options.response_format,\n signal: options.signal,\n }\n )\n\n // Handle API response format\n if (response.data?.result) {\n return response.data.result\n } else if (response.data?.text || response.data?.transcript) {\n return {\n text: response.data.text || response.data.transcript,\n transcript: response.data.transcript || response.data.text,\n ...response.data,\n }\n } else {\n throw new BlinkAIError('Invalid response format: missing transcription text')\n }\n } catch (error) {\n if (error instanceof BlinkAIError) {\n throw error\n }\n throw new BlinkAIError(\n `Audio transcription failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n} ","import type { HttpClient } from '@blink/core'\nimport type { \n ExtractFromUrlRequest, \n ExtractFromUrlResponse, \n ExtractFromBlobResponse,\n ScrapeRequest,\n ScrapeResponse,\n ScrapeResult,\n ScreenshotRequest,\n ScreenshotResponse,\n FetchRequest,\n FetchResponse,\n AsyncFetchResponse\n} from '@blink/core'\nimport { BlinkDataError } from '@blink/core'\n\nexport interface BlinkData {\n extractFromUrl(url: string, options?: { chunking?: boolean; chunkSize?: number }): Promise<string | string[]>\n extractFromBlob(file: File, options?: { chunking?: boolean; chunkSize?: number }): Promise<string | string[]>\n scrape(url: string): Promise<ScrapeResult>\n screenshot(url: string, options?: { fullPage?: boolean; width?: number; height?: number }): Promise<string>\n fetch(request: FetchRequest): Promise<FetchResponse>\n fetchAsync(request: Omit<FetchRequest, 'async'>): Promise<AsyncFetchResponse>\n}\n\nexport class BlinkDataImpl implements BlinkData {\n constructor(\n private httpClient: HttpClient,\n private projectId: string\n ) {}\n\n async extractFromUrl(\n url: string, \n options: { chunking?: boolean; chunkSize?: number } = {}\n ): Promise<string | string[]> {\n const { chunking = false, chunkSize } = options;\n const request: ExtractFromUrlRequest = { url, chunking, chunkSize };\n const response = await this.httpClient.dataExtractFromUrl(this.projectId, request);\n \n // Return chunks array if chunking is enabled, otherwise return text string\n return chunking ? response.data.chunks! : response.data.text!;\n }\n\n async extractFromBlob(\n file: File, \n options: { chunking?: boolean; chunkSize?: number } = {}\n ): Promise<string | string[]> {\n const { chunking = false, chunkSize } = options;\n const response = await this.httpClient.dataExtractFromBlob(this.projectId, file, chunking, chunkSize);\n \n // Return chunks array if chunking is enabled, otherwise return text string\n return chunking ? response.data.chunks! : response.data.text!;\n }\n\n async scrape(url: string): Promise<ScrapeResult> {\n // Always request all formats for consistent, predictable results\n const request: ScrapeRequest = { \n url, \n formats: ['markdown', 'html', 'links', 'extract', 'metadata'] \n };\n const response = await this.httpClient.dataScrape(this.projectId, request);\n const data = response.data;\n \n // Transform to guaranteed structure for better DX\n return {\n markdown: data.markdown || '',\n html: data.html || '',\n metadata: {\n title: data.metadata?.title || '',\n description: data.metadata?.description || '',\n url: data.metadata?.url || url,\n domain: data.metadata?.domain || new URL(url).hostname,\n favicon: data.metadata?.favicon,\n image: data.metadata?.image,\n author: data.metadata?.author,\n publishedTime: data.metadata?.publishedTime,\n modifiedTime: data.metadata?.modifiedTime,\n type: data.metadata?.type,\n siteName: data.metadata?.siteName,\n locale: data.metadata?.locale,\n keywords: data.metadata?.keywords || []\n },\n links: data.links || [],\n extract: {\n title: data.extract?.title || data.metadata?.title || '',\n description: data.extract?.description || data.metadata?.description || '',\n headings: data.extract?.headings || [],\n text: data.extract?.text || data.markdown || ''\n }\n };\n }\n\n async screenshot(\n url: string, \n options: { fullPage?: boolean; width?: number; height?: number } = {}\n ): Promise<string> {\n const request: ScreenshotRequest = { url, ...options };\n const response = await this.httpClient.dataScreenshot(this.projectId, request);\n return response.data.url;\n }\n\n async fetch(request: FetchRequest): Promise<FetchResponse> {\n const response = await this.httpClient.dataFetch(this.projectId, request);\n \n // Type guard to ensure we're returning FetchResponse for sync requests\n if ('status' in response.data && 'headers' in response.data) {\n return response.data as FetchResponse;\n }\n \n throw new BlinkDataError('Unexpected response format from fetch endpoint');\n }\n\n async fetchAsync(request: Omit<FetchRequest, 'async'>): Promise<AsyncFetchResponse> {\n const asyncRequest: FetchRequest = { ...request, async: true };\n const response = await this.httpClient.dataFetch(this.projectId, asyncRequest);\n \n // Type guard to ensure we're returning AsyncFetchResponse for async requests\n if ('status' in response.data && response.data.status === 'triggered') {\n return response.data as AsyncFetchResponse;\n }\n \n throw new BlinkDataError('Unexpected response format from async fetch endpoint');\n }\n} ","/**\n * Blink Client - Main SDK entry point\n * Factory function and client class for the Blink SDK\n */\n\nimport type { BlinkClientConfig } from '@blink/core'\nimport { HttpClient } from '@blink/core'\nimport { BlinkAuth } from './auth'\nimport { BlinkDatabase } from './database'\nimport { BlinkStorageImpl } from './storage'\nimport { BlinkAIImpl } from './ai'\nimport { BlinkDataImpl, type BlinkData } from './data'\nimport type { BlinkStorage, BlinkAI } from '@blink/core'\n\nexport interface BlinkClient {\n auth: BlinkAuth\n db: BlinkDatabase\n storage: BlinkStorage\n ai: BlinkAI\n data: BlinkData\n}\n\nexport class BlinkClientImpl implements BlinkClient {\n public auth: BlinkAuth\n public db: BlinkDatabase\n public storage: BlinkStorage\n public ai: BlinkAI\n public data: BlinkData\n private httpClient: HttpClient\n\n constructor(config: BlinkClientConfig) {\n // Initialize auth module\n this.auth = new BlinkAuth(config)\n\n // Initialize HTTP client with intelligent token management\n this.httpClient = new HttpClient(\n config, \n () => this.auth.getToken(),\n () => this.auth.getValidToken()\n )\n\n // Initialize database module\n this.db = new BlinkDatabase(this.httpClient)\n\n // Initialize storage module\n this.storage = new BlinkStorageImpl(this.httpClient)\n\n // Initialize AI module\n this.ai = new BlinkAIImpl(this.httpClient)\n\n // Initialize data module\n this.data = new BlinkDataImpl(this.httpClient, config.projectId)\n }\n}\n\n/**\n * Create a new Blink client instance\n */\nexport function createClient(config: BlinkClientConfig): BlinkClient {\n // Validate required configuration\n if (!config.projectId) {\n throw new Error('projectId is required')\n }\n\n // Set default values\n const clientConfig: BlinkClientConfig = {\n authRequired: true,\n ...config,\n }\n\n return new BlinkClientImpl(clientConfig)\n} "]}
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/src/types.ts","../../core/src/query-builder.ts","../../core/src/http-client.ts","../src/auth.ts","../src/database.ts","../src/storage.ts","../src/ai.ts","../src/data.ts","../src/client.ts"],"names":["user"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Core type definitions for Blink SDK\n */\n\nexport interface BlinkClientConfig {\n projectId: string\n authRequired?: boolean\n}\n\nexport interface BlinkUser {\n id: string\n email: string\n displayName?: string\n photoURL?: string\n emailVerified?: boolean\n createdAt?: string\n lastSignInAt?: string\n}\n\nexport interface AuthTokens {\n access_token: string\n refresh_token?: string\n token_type: 'Bearer'\n expires_in: number\n refresh_expires_in?: number\n issued_at?: number // Timestamp when token was issued (for expiration calculation)\n}\n\nexport interface AuthState {\n user: BlinkUser | null\n tokens: AuthTokens | null\n isAuthenticated: boolean\n isLoading: boolean\n}\n\n// Filter DSL types\nexport interface FilterOperators {\n eq?: any\n neq?: any\n gt?: any\n gte?: any\n lt?: any\n lte?: any\n in?: any[]\n not_in?: any[]\n like?: string\n ilike?: string\n is?: null | boolean\n not?: any\n}\n\nexport interface LogicalOperators {\n AND?: FilterCondition[]\n OR?: FilterCondition[]\n}\n\nexport type FilterCondition = \n | Record<string, any>\n | FilterOperators\n | LogicalOperators\n\nexport interface QueryOptions {\n where?: FilterCondition\n orderBy?: Record<string, 'asc' | 'desc'> | string\n limit?: number\n offset?: number\n cursor?: string\n select?: string[]\n}\n\nexport interface ListResponse<T = any> {\n data: T[]\n count?: number\n nextCursor?: string\n hasMore?: boolean\n}\n\nexport interface CreateOptions {\n returning?: boolean\n}\n\nexport interface UpdateOptions {\n returning?: boolean\n}\n\nexport interface UpsertOptions {\n onConflict?: string\n returning?: boolean\n}\n\n// Database operation types\nexport interface TableOperations<T = any> {\n create(data: Partial<T>, options?: CreateOptions): Promise<T>\n createMany(data: Partial<T>[], options?: CreateOptions): Promise<T[]>\n upsert(data: Partial<T>, options?: UpsertOptions): Promise<T>\n upsertMany(data: Partial<T>[], options?: UpsertOptions): Promise<T[]>\n get(id: string): Promise<T | null>\n list(options?: QueryOptions): Promise<ListResponse<T>>\n update(id: string, data: Partial<T>, options?: UpdateOptions): Promise<T>\n updateMany(updates: Array<{ id: string } & Partial<T>>, options?: UpdateOptions): Promise<T[]>\n delete(id: string): Promise<void>\n deleteMany(options: { where: FilterCondition }): Promise<void>\n count(options?: { where?: FilterCondition }): Promise<number>\n exists(options: { where: FilterCondition }): Promise<boolean>\n}\n\n// Database interface with typed table access\nexport interface BlinkDatabase {\n // Typed table access method\n table<T = any>(name: string): TableOperations<T>\n}\n\n// Error types\nexport class BlinkError extends Error {\n constructor(\n message: string,\n public code?: string,\n public status?: number,\n public details?: any\n ) {\n super(message)\n this.name = 'BlinkError'\n }\n}\n\nexport class BlinkAuthError extends BlinkError {\n constructor(message: string, details?: any) {\n super(message, 'AUTH_ERROR', 401, details)\n this.name = 'BlinkAuthError'\n }\n}\n\nexport class BlinkNetworkError extends BlinkError {\n constructor(message: string, status?: number, details?: any) {\n super(message, 'NETWORK_ERROR', status, details)\n this.name = 'BlinkNetworkError'\n }\n}\n\nexport class BlinkValidationError extends BlinkError {\n constructor(message: string, details?: any) {\n super(message, 'VALIDATION_ERROR', 400, details)\n this.name = 'BlinkValidationError'\n }\n}\n\n// Storage types\nexport interface StorageUploadOptions {\n upsert?: boolean\n onProgress?: (percent: number) => void\n}\n\nexport interface StorageUploadResponse {\n publicUrl: string\n}\n\nexport interface FileObject {\n id: string\n name: string\n bucket_id: string\n owner?: string | null\n owner_id?: string | null\n version?: string | null\n created_at: string\n updated_at: string\n last_accessed_at: string\n metadata: {\n size: number\n mimetype: string\n cacheControl?: string\n }\n user_metadata?: Record<string, any>\n}\n\nexport interface StorageResponse<T = any> {\n data: T\n error?: {\n message: string\n statusCode?: string\n } | null\n}\n\n// Storage interface\nexport interface BlinkStorage {\n upload(file: File | Blob | Buffer, path: string, options?: StorageUploadOptions): Promise<StorageUploadResponse>\n remove(...paths: string[]): Promise<void>\n}\n\nexport class BlinkStorageError extends BlinkError {\n constructor(message: string, status?: number, details?: any) {\n super(message, 'STORAGE_ERROR', status, details)\n this.name = 'BlinkStorageError'\n }\n}\n\n// AI types\nexport interface TokenUsage {\n promptTokens: number\n completionTokens: number\n totalTokens: number\n}\n\n// Message content types for multimodal support\nexport interface TextContent {\n type: 'text'\n text: string\n}\n\nexport interface ImageContent {\n type: 'image'\n image: string // URL only - no base64 support for simplicity\n}\n\nexport type MessageContent = TextContent | ImageContent\n\n// Enhanced Message interface supporting both string and content array formats\nexport interface Message {\n role: 'system' | 'user' | 'assistant'\n content: string | MessageContent[] // Support both legacy string and new content array\n}\n\n// Supported image formats\nexport const SUPPORTED_IMAGE_FORMATS = ['jpg', 'jpeg', 'png', 'gif', 'webp'] as const\nexport type SupportedImageFormat = typeof SUPPORTED_IMAGE_FORMATS[number]\n\n// Text Generation\nexport interface TextGenerationRequest {\n model?: string\n prompt?: string\n messages?: Message[]\n stream?: boolean\n search?: boolean // Enable web search (OpenAI only)\n maxSteps?: number // Maximum number of sequential LLM calls\n experimental_continueSteps?: boolean // Enable continue steps\n maxTokens?: number\n temperature?: number\n signal?: AbortSignal\n}\n\nexport interface TextGenerationResponse {\n text: string\n finishReason?: 'stop' | 'length' | 'content_filter' | 'tool_calls'\n usage?: TokenUsage\n files?: any[]\n reasoningDetails?: any[]\n toolCalls?: any[]\n toolResults?: any[]\n warnings?: string[]\n request?: {\n body?: string\n }\n response?: any\n steps?: Array<{\n stepType?: string\n text?: string\n finishReason?: string\n usage?: TokenUsage\n }>\n sources?: any[]\n providerMetadata?: any\n experimental_providerMetadata?: any\n}\n\n// Object Generation \nexport interface ObjectGenerationRequest {\n model?: string\n prompt: string\n output?: 'object' | 'array' | 'enum'\n schema?: any\n enum?: string[]\n stream?: boolean\n signal?: AbortSignal\n}\n\nexport interface ObjectGenerationResponse {\n object: any\n finishReason?: 'stop' | 'length' | 'content_filter'\n usage?: TokenUsage\n warnings?: string[]\n providerMetadata?: {\n openai?: {\n reasoningTokens?: number\n acceptedPredictionTokens?: number\n rejectedPredictionTokens?: number\n cachedPromptTokens?: number\n }\n }\n experimental_providerMetadata?: any\n response?: {\n id?: string\n timestamp?: string\n modelId?: string\n headers?: any\n body?: any\n }\n request?: {\n body?: string\n }\n}\n\n// Image Generation\nexport interface ImageGenerationRequest {\n model?: string\n prompt: string\n size?: string // Flexible to support different models (e.g., '1024x1024', '512x512', '1792x1024', 'auto', etc.)\n quality?: 'standard' | 'hd'\n n?: number\n response_format?: 'url' | 'b64_json'\n signal?: AbortSignal\n}\n\nexport interface ImageGenerationResponse {\n data: Array<{\n url?: string\n b64_json?: string\n }>\n}\n\n// Speech Generation\nexport interface SpeechGenerationRequest {\n model?: string\n text: string\n voice?: 'alloy' | 'echo' | 'fable' | 'onyx' | 'nova' | 'shimmer'\n response_format?: 'mp3' | 'opus' | 'aac' | 'flac' | 'wav' | 'pcm'\n speed?: number\n signal?: AbortSignal\n}\n\nexport interface SpeechGenerationResponse {\n url: string\n voice: string\n format: string\n mimeType: string\n}\n\n// Transcription\nexport interface TranscriptionRequest {\n model?: string\n audio: string | number[] // Base64 string, URL, or audio buffer\n language?: string\n response_format?: 'json' | 'text' | 'srt' | 'verbose_json' | 'vtt'\n signal?: AbortSignal\n}\n\nexport interface TranscriptionResponse {\n text: string\n transcript?: string // Alias for text\n segments?: Array<{\n id: number\n seek: number\n start: number\n end: number\n text: string\n tokens: number[]\n temperature: number\n avg_logprob: number\n compression_ratio: number\n no_speech_prob: number\n }>\n language?: string\n duration?: number\n words?: Array<{\n word: string\n start: number\n end: number\n }>\n}\n\n// AI interface\nexport interface BlinkAI {\n generateText(options: TextGenerationRequest): Promise<TextGenerationResponse>\n streamText(options: TextGenerationRequest, onChunk: (chunk: string) => void): Promise<TextGenerationResponse>\n generateObject(options: ObjectGenerationRequest): Promise<ObjectGenerationResponse>\n streamObject(options: ObjectGenerationRequest, onPartial: (partial: any) => void): Promise<ObjectGenerationResponse>\n generateImage(options: ImageGenerationRequest): Promise<ImageGenerationResponse>\n generateSpeech(options: SpeechGenerationRequest): Promise<SpeechGenerationResponse>\n transcribeAudio(options: TranscriptionRequest): Promise<TranscriptionResponse>\n}\n\nexport class BlinkAIError extends BlinkError {\n constructor(message: string, status?: number, details?: any) {\n super(message, 'AI_ERROR', status, details)\n this.name = 'BlinkAIError'\n }\n}\n\n// Data types\nexport interface DataExtraction {\n chunks: string[]\n}\n\nexport interface ExtractFromUrlRequest {\n url: string;\n chunking?: boolean;\n chunkSize?: number;\n}\n\nexport interface ExtractFromBlobRequest {\n chunking?: boolean;\n chunkSize?: number;\n}\n\nexport interface ExtractFromUrlResponse {\n chunks?: string[];\n text?: string;\n}\n\nexport interface ExtractFromBlobResponse {\n chunks?: string[];\n text?: string;\n}\n\n// Scrape types\nexport interface ScrapeRequest {\n url: string;\n formats?: ('markdown' | 'html' | 'rawHtml' | 'links' | 'extract' | 'metadata')[];\n}\n\nexport interface ScrapeResponse {\n markdown?: string;\n html?: string;\n rawHtml?: string;\n links?: Array<{ text: string; url: string; type: string }>;\n extract?: {\n title?: string;\n description?: string;\n headings?: string[];\n text?: string;\n };\n metadata?: {\n title?: string;\n description?: string;\n url?: string;\n domain?: string;\n favicon?: string;\n image?: string;\n author?: string;\n publishedTime?: string;\n modifiedTime?: string;\n type?: string;\n siteName?: string;\n locale?: string;\n keywords?: string[];\n };\n}\n\n// Clear, destructurable scrape result for better DX\nexport interface ScrapeResult {\n markdown: string;\n html: string;\n metadata: {\n title: string;\n description: string;\n url: string;\n domain: string;\n favicon?: string;\n image?: string;\n author?: string;\n publishedTime?: string;\n modifiedTime?: string;\n type?: string;\n siteName?: string;\n locale?: string;\n keywords?: string[];\n };\n links: Array<{ text: string; url: string; type: string }>;\n extract: {\n title: string;\n description: string;\n headings: string[];\n text: string;\n };\n}\n\n// Screenshot types\nexport interface ScreenshotRequest {\n url: string;\n fullPage?: boolean;\n width?: number;\n height?: number;\n}\n\nexport interface ScreenshotResponse {\n url: string;\n}\n\n// Data interface\nexport interface BlinkData {\n extractFromUrl(url: string, filename?: string): Promise<DataExtraction>\n scrape(url: string): Promise<ScrapeResult>\n screenshot(url: string, options?: { fullPage?: boolean; width?: number; height?: number }): Promise<string>\n fetch(request: FetchRequest): Promise<FetchResponse | AsyncFetchResponse>\n}\n\n// Fetch types\nexport interface FetchRequest {\n url: string;\n method?: string;\n headers?: Record<string, string>;\n body?: any;\n query?: Record<string, string>;\n async?: boolean;\n}\n\nexport interface FetchResponse {\n status: number;\n headers: Record<string, string>;\n body: any;\n durationMs: number;\n}\n\nexport interface AsyncFetchResponse {\n status: 'triggered';\n message: string;\n}\n\nexport class BlinkDataError extends BlinkError {\n constructor(message: string, status?: number, details?: any) {\n super(message, 'DATA_ERROR', status, details)\n this.name = 'BlinkDataError'\n }\n} ","/**\n * Filter DSL to PostgREST query string converter\n * Converts JSON filter objects to PostgREST-compatible query parameters\n */\n\nimport type { FilterCondition, QueryOptions } from './types'\n\n/**\n * Convert a filter condition to PostgREST query parameters\n */\nexport function buildFilterQuery(condition: FilterCondition): string {\n if (!condition) return ''\n\n // Handle logical operators (AND, OR)\n if ('AND' in condition) {\n const andConditions = condition.AND?.map(buildFilterQuery).filter(Boolean) || []\n return andConditions.length > 0 ? `and=(${andConditions.join(',')})` : ''\n }\n\n if ('OR' in condition) {\n const orConditions = condition.OR?.map(buildFilterQuery).filter(Boolean) || []\n return orConditions.length > 0 ? `or=(${orConditions.join(',')})` : ''\n }\n\n // Handle field-level conditions\n const params: string[] = []\n \n for (const [field, value] of Object.entries(condition)) {\n if (value === undefined || value === null) continue\n\n // Handle operator objects\n if (typeof value === 'object' && !Array.isArray(value)) {\n for (const [operator, operatorValue] of Object.entries(value)) {\n const param = buildOperatorQuery(field, operator, operatorValue)\n if (param) params.push(param)\n }\n } else {\n // Handle direct equality\n params.push(`${field}=eq.${encodeQueryValue(value)}`)\n }\n }\n\n return params.join('&')\n}\n\n/**\n * Build operator-specific query parameters\n */\nfunction buildOperatorQuery(field: string, operator: string, value: any): string {\n switch (operator) {\n case 'eq':\n return `${field}=eq.${encodeQueryValue(value)}`\n case 'neq':\n return `${field}=neq.${encodeQueryValue(value)}`\n case 'gt':\n return `${field}=gt.${encodeQueryValue(value)}`\n case 'gte':\n return `${field}=gte.${encodeQueryValue(value)}`\n case 'lt':\n return `${field}=lt.${encodeQueryValue(value)}`\n case 'lte':\n return `${field}=lte.${encodeQueryValue(value)}`\n case 'like':\n return `${field}=like.${encodeQueryValue(value)}`\n case 'ilike':\n return `${field}=ilike.${encodeQueryValue(value)}`\n case 'is':\n return `${field}=is.${value === null ? 'null' : encodeQueryValue(value)}`\n case 'not':\n return `${field}=not.${encodeQueryValue(value)}`\n case 'in':\n if (Array.isArray(value)) {\n const values = value.map(encodeQueryValue).join(',')\n return `${field}=in.(${values})`\n }\n return ''\n case 'not_in':\n if (Array.isArray(value)) {\n const values = value.map(encodeQueryValue).join(',')\n return `${field}=not.in.(${values})`\n }\n return ''\n default:\n return ''\n }\n}\n\n/**\n * Encode query values for URL safety\n * Handle SQLite boolean conversion (true/false -> 1/0)\n */\nfunction encodeQueryValue(value: any): string {\n if (value === null) return 'null'\n if (typeof value === 'boolean') {\n // SQLite stores booleans as integers: true=1, false=0\n return value ? '1' : '0'\n }\n if (typeof value === 'number') return value.toString()\n return encodeURIComponent(String(value))\n}\n\n/**\n * Build complete query parameters from options\n */\nexport function buildQuery(options: QueryOptions = {}): Record<string, string> {\n const params: Record<string, string> = {}\n\n // Add select clause\n if (options.select && options.select.length > 0) {\n params.select = options.select.join(',')\n } else {\n params.select = '*'\n }\n\n // Add filter conditions\n if (options.where) {\n const filterQuery = buildFilterQuery(options.where)\n if (filterQuery) {\n // Split the filter query and add each parameter\n const filterParams = filterQuery.split('&')\n for (const param of filterParams) {\n const [key, value] = param.split('=', 2)\n if (key && value) {\n params[key] = value\n }\n }\n }\n }\n\n // Add ordering\n if (options.orderBy) {\n if (typeof options.orderBy === 'string') {\n params.order = options.orderBy\n } else {\n const orderClauses = Object.entries(options.orderBy)\n .map(([field, direction]) => `${field}.${direction}`)\n params.order = orderClauses.join(',')\n }\n }\n\n // Add pagination\n if (options.limit !== undefined) {\n params.limit = options.limit.toString()\n }\n\n if (options.offset !== undefined) {\n params.offset = options.offset.toString()\n }\n\n // Add cursor-based pagination\n if (options.cursor) {\n params.cursor = options.cursor\n }\n\n return params\n}\n\n/**\n * Convert query parameters to URL search string\n */\nexport function queryToSearchParams(params: Record<string, string>): string {\n const searchParams = new URLSearchParams()\n \n for (const [key, value] of Object.entries(params)) {\n searchParams.set(key, value)\n }\n \n return searchParams.toString()\n}\n\n/**\n * Build complete URL with query parameters\n */\nexport function buildUrl(baseUrl: string, path: string, options: QueryOptions = {}): string {\n const query = buildQuery(options)\n const searchParams = queryToSearchParams(query)\n \n const url = new URL(path, baseUrl)\n if (searchParams) {\n url.search = searchParams\n }\n \n return url.toString()\n} ","/**\n * HTTP client for Blink API requests\n * Handles authentication, error handling, and request/response processing\n */\n\nimport type { \n BlinkClientConfig, \n AuthTokens, \n ExtractFromUrlRequest, \n ExtractFromUrlResponse, \n ExtractFromBlobRequest, \n ExtractFromBlobResponse,\n ScrapeRequest,\n ScrapeResponse,\n ScreenshotRequest,\n ScreenshotResponse,\n FetchRequest,\n FetchResponse,\n AsyncFetchResponse\n} from './types'\nimport { BlinkError, BlinkAuthError, BlinkNetworkError, BlinkValidationError } from './types'\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PATCH' | 'DELETE'\n headers?: Record<string, string>\n body?: any\n searchParams?: Record<string, string>\n signal?: AbortSignal\n}\n\nexport interface BlinkResponse<T = any> {\n data: T\n status: number\n headers: Headers\n}\n\nexport class HttpClient {\n private readonly authUrl = 'https://blink.new'\n private readonly coreUrl = 'https://core.blink.new'\n public readonly projectId: string\n private getToken: () => string | null\n private getValidToken?: () => Promise<string | null>\n\n constructor(\n config: BlinkClientConfig,\n getToken: () => string | null,\n getValidToken?: () => Promise<string | null>\n ) {\n this.projectId = config.projectId\n this.getToken = getToken\n this.getValidToken = getValidToken\n }\n\n /**\n * Make an authenticated request to the Blink API\n */\n async request<T = any>(\n path: string,\n options: RequestOptions = {}\n ): Promise<BlinkResponse<T>> {\n const url = this.buildUrl(path, options.searchParams)\n \n // Use intelligent token management if available, otherwise fallback to basic getToken\n const token = this.getValidToken \n ? await this.getValidToken()\n : this.getToken()\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers,\n }\n\n // Add authentication header if token is available\n if (token) {\n headers.Authorization = `Bearer ${token}`\n }\n\n const requestInit: RequestInit = {\n method: options.method || 'GET',\n headers,\n signal: options.signal,\n }\n\n // Add body for non-GET requests\n if (options.body && options.method !== 'GET') {\n requestInit.body = typeof options.body === 'string' \n ? options.body \n : JSON.stringify(options.body)\n }\n\n try {\n const response = await fetch(url, requestInit)\n \n // Handle different response types\n if (!response.ok) {\n await this.handleErrorResponse(response)\n }\n\n const data = await this.parseResponse<T>(response)\n \n return {\n data,\n status: response.status,\n headers: response.headers,\n }\n } catch (error) {\n if (error instanceof BlinkError) {\n throw error\n }\n \n // Handle network errors\n throw new BlinkNetworkError(\n `Network request failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 0,\n { originalError: error }\n )\n }\n }\n\n /**\n * GET request\n */\n async get<T = any>(\n path: string,\n searchParams?: Record<string, string>\n ): Promise<BlinkResponse<T>> {\n return this.request<T>(path, { method: 'GET', searchParams })\n }\n\n /**\n * POST request\n */\n async post<T = any>(\n path: string,\n body?: any,\n headers?: Record<string, string>\n ): Promise<BlinkResponse<T>> {\n return this.request<T>(path, { method: 'POST', body, headers })\n }\n\n /**\n * PATCH request\n */\n async patch<T = any>(\n path: string,\n body?: any,\n headers?: Record<string, string>\n ): Promise<BlinkResponse<T>> {\n return this.request<T>(path, { method: 'PATCH', body, headers })\n }\n\n /**\n * DELETE request\n */\n async delete<T = any>(\n path: string,\n searchParams?: Record<string, string>\n ): Promise<BlinkResponse<T>> {\n return this.request<T>(path, { method: 'DELETE', searchParams })\n }\n\n /**\n * Database-specific requests\n */\n \n // Table operations (PostgREST-compatible)\n async dbGet<T = any>(\n table: string,\n searchParams?: Record<string, string>\n ): Promise<BlinkResponse<T[]>> {\n return this.get<T[]>(`/api/db/${this.projectId}/rest/v1/${table}`, searchParams)\n }\n\n async dbPost<T = any>(\n table: string,\n body: any,\n options: { returning?: boolean } = {}\n ): Promise<BlinkResponse<T | T[]>> {\n const headers: Record<string, string> = {}\n if (options.returning) {\n headers.Prefer = 'return=representation'\n }\n return this.post<T | T[]>(`/api/db/${this.projectId}/rest/v1/${table}`, body, headers)\n }\n\n async dbPatch<T = any>(\n table: string,\n body: any,\n searchParams?: Record<string, string>,\n options: { returning?: boolean } = {}\n ): Promise<BlinkResponse<T[]>> {\n const headers: Record<string, string> = {}\n if (options.returning) {\n headers.Prefer = 'return=representation'\n }\n return this.request<T[]>(`/api/db/${this.projectId}/rest/v1/${table}`, {\n method: 'PATCH',\n body,\n headers,\n searchParams,\n })\n }\n\n async dbDelete<T = any>(\n table: string,\n searchParams?: Record<string, string>,\n options: { returning?: boolean } = {}\n ): Promise<BlinkResponse<T[]>> {\n const headers: Record<string, string> = {}\n if (options.returning) {\n headers.Prefer = 'return=representation'\n }\n return this.request<T[]>(`/api/db/${this.projectId}/rest/v1/${table}`, {\n method: 'DELETE',\n headers,\n searchParams,\n })\n }\n\n // Raw SQL operations\n async dbSql<T = any>(\n query: string,\n params?: any[]\n ): Promise<BlinkResponse<{\n rows: T[]\n columns: string[]\n rowCount: number\n executionTime: number\n }>> {\n return this.post(`/api/db/${this.projectId}/sql`, { query, params })\n }\n\n // Batch SQL operations\n async dbBatch<T = any>(\n statements: Array<{ sql: string; args?: any[] }>,\n mode: 'read' | 'write' = 'write'\n ): Promise<BlinkResponse<{\n results: Array<{\n rows: T[]\n columns: string[]\n rowCount: number\n }>\n executionTime: number\n success: boolean\n }>> {\n return this.post(`/api/db/${this.projectId}/batch`, { statements, mode })\n }\n\n /**\n * Upload file with progress tracking\n */\n async uploadFile(\n path: string,\n file: File | Blob | Buffer,\n filePath: string,\n options: {\n upsert?: boolean\n onProgress?: (percent: number) => void\n } = {}\n ): Promise<BlinkResponse<any>> {\n const url = this.buildUrl(path)\n \n // Use intelligent token management if available, otherwise fallback to basic getToken\n const token = this.getValidToken \n ? await this.getValidToken()\n : this.getToken()\n\n const formData = new FormData()\n \n // Handle different file types\n if (file instanceof File) {\n formData.append('file', file)\n } else if (file instanceof Blob) {\n formData.append('file', file)\n } else if (typeof Buffer !== 'undefined' && file instanceof Buffer) {\n // For Node.js/Deno environments\n const blob = new Blob([file])\n formData.append('file', blob)\n } else {\n throw new BlinkValidationError('Unsupported file type')\n }\n \n formData.append('path', filePath)\n \n if (options.upsert !== undefined) {\n formData.append('options', JSON.stringify({ upsert: options.upsert }))\n }\n\n const headers: Record<string, string> = {}\n \n // Add authentication header if token is available\n if (token) {\n headers.Authorization = `Bearer ${token}`\n }\n \n // Don't set Content-Type header - let browser set it with boundary for multipart\n\n try {\n // Use XMLHttpRequest for progress tracking in browser\n if (typeof XMLHttpRequest !== 'undefined' && options.onProgress) {\n return this.uploadWithProgress(url, formData, headers, options.onProgress)\n }\n \n // Fallback to fetch for environments without XMLHttpRequest\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: formData,\n })\n \n if (!response.ok) {\n await this.handleErrorResponse(response)\n }\n\n const data = await this.parseResponse(response)\n \n return {\n data,\n status: response.status,\n headers: response.headers,\n }\n } catch (error) {\n if (error instanceof BlinkError) {\n throw error\n }\n \n throw new BlinkNetworkError(\n `File upload failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 0,\n { originalError: error }\n )\n }\n }\n\n /**\n * Upload with progress tracking using XMLHttpRequest\n */\n private uploadWithProgress(\n url: string,\n formData: FormData,\n headers: Record<string, string>,\n onProgress: (percent: number) => void\n ): Promise<BlinkResponse<any>> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n \n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable) {\n const percent = Math.round((event.loaded / event.total) * 100)\n onProgress(percent)\n }\n })\n \n xhr.addEventListener('load', async () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const data = JSON.parse(xhr.responseText)\n resolve({\n data,\n status: xhr.status,\n headers: new Headers(), // XMLHttpRequest doesn't provide easy access to response headers\n })\n } catch (error) {\n reject(new BlinkNetworkError('Failed to parse response', xhr.status))\n }\n } else {\n try {\n const errorData = JSON.parse(xhr.responseText)\n const message = errorData.error?.message || errorData.message || `HTTP ${xhr.status}`\n \n switch (xhr.status) {\n case 401:\n reject(new BlinkAuthError(message, errorData))\n break\n case 400:\n reject(new BlinkValidationError(message, errorData))\n break\n default:\n reject(new BlinkNetworkError(message, xhr.status, errorData))\n }\n } catch {\n reject(new BlinkNetworkError(`HTTP ${xhr.status}`, xhr.status))\n }\n }\n })\n \n xhr.addEventListener('error', () => {\n reject(new BlinkNetworkError('Network error during file upload'))\n })\n \n xhr.open('POST', url)\n \n // Set headers\n Object.entries(headers).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value)\n })\n \n xhr.send(formData)\n })\n }\n\n /**\n * AI-specific requests\n */\n \n async aiText(\n prompt: string,\n options: {\n model?: string\n messages?: Array<{ role: string; content: string | any[] }>\n stream?: boolean\n search?: boolean\n maxSteps?: number\n experimental_continueSteps?: boolean\n maxTokens?: number\n temperature?: number\n signal?: AbortSignal\n } = {}\n ): Promise<BlinkResponse<any>> {\n const { signal, ...body } = options\n const requestBody: any = { ...body }\n \n // Only include prompt if it's not empty\n if (prompt) {\n requestBody.prompt = prompt\n }\n \n return this.request(`/api/ai/${this.projectId}/text`, {\n method: 'POST',\n body: requestBody,\n signal,\n })\n }\n\n /**\n * Stream AI text generation with Vercel AI SDK data stream format\n */\n async streamAiText(\n prompt: string,\n options: {\n model?: string\n messages?: Array<{ role: string; content: string | any[] }>\n search?: boolean\n maxSteps?: number\n experimental_continueSteps?: boolean\n maxTokens?: number\n temperature?: number\n signal?: AbortSignal\n } = {},\n onChunk: (chunk: string) => void\n ): Promise<any> {\n const url = this.buildUrl(`/api/ai/${this.projectId}/text`)\n \n // Use intelligent token management if available, otherwise fallback to basic getToken\n const token = this.getValidToken \n ? await this.getValidToken()\n : this.getToken()\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n // Add authentication header if token is available\n if (token) {\n headers.Authorization = `Bearer ${token}`\n }\n\n const body = {\n prompt,\n stream: true,\n ...options,\n }\n\n // Ensure we don't serialize AbortSignal\n const { signal: _signal, ...jsonBody } = body\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(jsonBody),\n signal: options.signal,\n })\n\n if (!response.ok) {\n await this.handleErrorResponse(response)\n }\n\n if (!response.body) {\n throw new BlinkNetworkError('No response body for streaming')\n }\n\n return this.parseDataStream(response.body, onChunk)\n } catch (error) {\n if (error instanceof BlinkError) {\n throw error\n }\n \n throw new BlinkNetworkError(\n `Streaming request failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 0,\n { originalError: error }\n )\n }\n }\n\n async aiObject(\n prompt: string,\n options: {\n model?: string\n output?: 'object' | 'array' | 'enum'\n schema?: any\n enum?: string[]\n stream?: boolean\n signal?: AbortSignal\n } = {}\n ): Promise<BlinkResponse<any>> {\n const { signal, ...body } = options\n const requestBody: any = { ...body }\n \n // Only include prompt if it's not empty\n if (prompt) {\n requestBody.prompt = prompt\n }\n \n return this.request(`/api/ai/${this.projectId}/object`, {\n method: 'POST',\n body: requestBody,\n signal,\n })\n }\n\n /**\n * Stream AI object generation with Vercel AI SDK data stream format\n */\n async streamAiObject(\n prompt: string,\n options: {\n model?: string\n output?: 'object' | 'array' | 'enum'\n schema?: any\n enum?: string[]\n signal?: AbortSignal\n } = {},\n onPartial: (partial: any) => void\n ): Promise<any> {\n const url = this.buildUrl(`/api/ai/${this.projectId}/object`)\n \n // Use intelligent token management if available, otherwise fallback to basic getToken\n const token = this.getValidToken \n ? await this.getValidToken()\n : this.getToken()\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n // Add authentication header if token is available\n if (token) {\n headers.Authorization = `Bearer ${token}`\n }\n\n const body = {\n prompt,\n stream: true,\n ...options,\n }\n\n // Ensure we don't serialize AbortSignal\n const { signal: _signal2, ...jsonBody2 } = body\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(jsonBody2),\n signal: options.signal,\n })\n\n if (!response.ok) {\n await this.handleErrorResponse(response)\n }\n\n if (!response.body) {\n throw new BlinkNetworkError('No response body for streaming')\n }\n\n return this.parseDataStream(response.body, undefined, onPartial)\n } catch (error) {\n if (error instanceof BlinkError) {\n throw error\n }\n \n throw new BlinkNetworkError(\n `Streaming request failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 0,\n { originalError: error }\n )\n }\n }\n\n async aiImage(\n prompt: string,\n options: {\n model?: string\n size?: string // Flexible to support different models (e.g., '1024x1024', '512x512', '1792x1024', 'auto', etc.)\n quality?: 'standard' | 'hd'\n n?: number\n response_format?: 'url' | 'b64_json'\n signal?: AbortSignal\n } = {}\n ): Promise<BlinkResponse<any>> {\n const { signal, ...body } = options\n return this.request(`/api/ai/${this.projectId}/image`, {\n method: 'POST',\n body: {\n prompt,\n ...body,\n },\n signal,\n })\n }\n\n async aiSpeech(\n text: string,\n options: {\n model?: string\n voice?: string\n response_format?: string\n speed?: number\n signal?: AbortSignal\n } = {}\n ): Promise<BlinkResponse<any>> {\n const { signal, ...body } = options\n return this.request(`/api/ai/${this.projectId}/speech`, {\n method: 'POST',\n body: {\n text,\n ...body,\n },\n signal,\n })\n }\n\n async aiTranscribe(\n audio: string | number[],\n options: {\n model?: string\n language?: string\n response_format?: string\n signal?: AbortSignal\n } = {}\n ): Promise<BlinkResponse<any>> {\n const { signal, ...body } = options\n return this.request(`/api/ai/${this.projectId}/transcribe`, {\n method: 'POST',\n body: {\n audio,\n ...body,\n },\n signal,\n })\n }\n\n /**\n * Data-specific requests\n */\n \n async dataExtractFromUrl(projectId: string, request: ExtractFromUrlRequest): Promise<BlinkResponse<ExtractFromUrlResponse>> {\n return this.request<ExtractFromUrlResponse>(`/api/data/${projectId}/extract-from-url`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n async dataExtractFromBlob(\n projectId: string, \n file: File, \n chunking?: boolean, \n chunkSize?: number\n ): Promise<BlinkResponse<ExtractFromBlobResponse>> {\n const formData = new FormData();\n formData.append('file', file);\n if (chunking !== undefined) {\n formData.append('chunking', String(chunking));\n }\n if (chunkSize !== undefined) {\n formData.append('chunkSize', String(chunkSize));\n }\n\n return this.request<ExtractFromBlobResponse>(`/api/data/${projectId}/extract-from-blob`, {\n method: 'POST',\n body: formData,\n });\n }\n\n async dataScrape(projectId: string, request: ScrapeRequest): Promise<BlinkResponse<ScrapeResponse>> {\n return this.request<ScrapeResponse>(`/api/data/${projectId}/scrape`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n async dataScreenshot(projectId: string, request: ScreenshotRequest): Promise<BlinkResponse<ScreenshotResponse>> {\n return this.request<ScreenshotResponse>(`/api/data/${projectId}/screenshot`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n async dataFetch(projectId: string, request: FetchRequest): Promise<BlinkResponse<FetchResponse | AsyncFetchResponse>> {\n return this.request<FetchResponse | AsyncFetchResponse>(`/api/data/${projectId}/fetch`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Private helper methods\n */\n\n private buildUrl(path: string, searchParams?: Record<string, string>): string {\n // Only auth endpoints use authUrl, everything else uses coreUrl\n const baseUrl = path.includes('/api/auth/')\n ? this.authUrl \n : this.coreUrl\n \n const url = new URL(path, baseUrl)\n \n if (searchParams) {\n Object.entries(searchParams).forEach(([key, value]) => {\n url.searchParams.set(key, value)\n })\n }\n \n return url.toString()\n }\n\n private async parseResponse<T>(response: Response): Promise<T> {\n const contentType = response.headers.get('content-type')\n \n if (contentType?.includes('application/json')) {\n return response.json()\n }\n \n if (contentType?.includes('text/')) {\n return response.text() as T\n }\n \n // For binary data or unknown content types\n return response.blob() as T\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n let errorData: any\n \n try {\n const contentType = response.headers.get('content-type')\n if (contentType?.includes('application/json')) {\n errorData = await response.json()\n } else {\n errorData = { message: await response.text() }\n }\n } catch {\n errorData = { message: 'Unknown error occurred' }\n }\n\n const message = errorData.error?.message || errorData.message || `HTTP ${response.status}`\n const code = errorData.error?.code || errorData.code\n \n switch (response.status) {\n case 401:\n throw new BlinkAuthError(message, errorData)\n case 400:\n throw new BlinkValidationError(message, errorData)\n default:\n throw new BlinkNetworkError(message, response.status, errorData)\n }\n }\n\n /**\n * Parse Vercel AI SDK data stream format\n * Handles text chunks (0:\"text\"), partial objects (2:[...]), and metadata (d:, e:)\n */\n private async parseDataStream(\n body: ReadableStream<Uint8Array>,\n onChunk?: (chunk: string) => void,\n onPartial?: (partial: any) => void\n ): Promise<any> {\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n let finalResult: any = {}\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n \n if (done) break\n \n // Decode the chunk and add to buffer\n buffer += decoder.decode(value, { stream: true })\n \n // Process complete lines (handle both \\n and \\r\\n)\n const lines = buffer.split(/\\r?\\n/)\n buffer = lines.pop() || '' // Keep incomplete line in buffer\n \n for (const line of lines) {\n if (!line.trim()) continue\n \n try {\n // Parse Vercel AI SDK data stream format\n if (line.startsWith('f:')) {\n // Message metadata: f:{\"messageId\":\"msg-xxx\"}\n const metadata = JSON.parse(line.slice(2))\n finalResult.messageId = metadata.messageId\n } else if (line.startsWith('0:')) {\n // Text chunk: 0:\"text content\"\n const textChunk = JSON.parse(line.slice(2))\n if (onChunk) {\n onChunk(textChunk)\n }\n finalResult.text = (finalResult.text || '') + textChunk\n } else if (line.startsWith('2:')) {\n // Partial object or status: 2:[partial_object] or 2:[\"status\"]\n const data = JSON.parse(line.slice(2))\n if (Array.isArray(data) && data.length > 0) {\n const item = data[0]\n if (typeof item === 'string') {\n // Status message\n finalResult.status = item\n } else if (typeof item === 'object') {\n // Partial object\n if (onPartial) {\n onPartial(item)\n }\n finalResult.object = item\n }\n }\n } else if (line.startsWith('d:')) {\n // Data/metadata chunk: d:{\"usage\":{\"promptTokens\":10,\"completionTokens\":5},\"finishReason\":\"stop\"}\n const metadata = JSON.parse(line.slice(2))\n if (metadata.usage) {\n finalResult.usage = metadata.usage\n }\n if (metadata.finishReason) {\n finalResult.finishReason = metadata.finishReason\n }\n } else if (line.startsWith('e:')) {\n // Error chunk: e:{\"error\":\"message\"}\n const errorData = JSON.parse(line.slice(2))\n finalResult.error = errorData\n }\n } catch (error) {\n // Skip malformed lines but log for debugging\n console.warn('Failed to parse stream line:', line, error)\n }\n }\n }\n \n // Process any remaining buffer\n if (buffer.trim()) {\n try {\n if (buffer.startsWith('0:')) {\n const textChunk = JSON.parse(buffer.slice(2))\n if (onChunk) {\n onChunk(textChunk)\n }\n finalResult.text = (finalResult.text || '') + textChunk\n } else if (buffer.startsWith('2:')) {\n const data = JSON.parse(buffer.slice(2))\n if (Array.isArray(data) && data.length > 0) {\n const item = data[0]\n if (typeof item === 'object') {\n if (onPartial) {\n onPartial(item)\n }\n finalResult.object = item\n }\n }\n } else if (buffer.startsWith('d:')) {\n const metadata = JSON.parse(buffer.slice(2))\n if (metadata.usage) {\n finalResult.usage = metadata.usage\n }\n if (metadata.finishReason) {\n finalResult.finishReason = metadata.finishReason\n }\n }\n } catch (error) {\n console.warn('Failed to parse final buffer:', buffer, error)\n }\n }\n \n return finalResult\n } finally {\n reader.releaseLock()\n }\n }\n} ","/**\n * Blink Auth Module - Client-side authentication management\n * Handles token storage, user state, and authentication flows\n */\n\nimport type { \n BlinkUser, \n AuthTokens, \n AuthState, \n BlinkClientConfig \n} from '@blink/core'\nimport { BlinkAuthError } from '@blink/core'\n\nexport type AuthStateChangeCallback = (state: AuthState) => void\n\nexport class BlinkAuth {\n private config: BlinkClientConfig\n private authState: AuthState\n private listeners: Set<AuthStateChangeCallback> = new Set()\n private readonly authUrl = 'https://blink.new'\n\n constructor(config: BlinkClientConfig) {\n this.config = config\n \n // Initialize auth state\n this.authState = {\n user: null,\n tokens: null,\n isAuthenticated: false,\n isLoading: false,\n }\n\n // Auto-initialize if running in browser\n if (typeof window !== 'undefined') {\n this.initialize()\n }\n }\n\n /**\n * Initialize authentication from stored tokens or URL fragments\n */\n async initialize(): Promise<void> {\n console.log('π Initializing Blink Auth...')\n this.setLoading(true)\n\n try {\n // First, check for tokens in URL fragment (from auth redirect)\n const tokensFromUrl = this.extractTokensFromUrl()\n if (tokensFromUrl) {\n console.log('π₯ Found tokens in URL, setting them...')\n await this.setTokens(tokensFromUrl, true)\n this.clearUrlTokens()\n console.log('β
Auth initialization complete (from URL)')\n return\n }\n\n // Then check for stored tokens\n const storedTokens = this.getStoredTokens()\n if (storedTokens) {\n console.log('πΎ Found stored tokens, validating...', {\n hasAccessToken: !!storedTokens.access_token,\n hasRefreshToken: !!storedTokens.refresh_token,\n issuedAt: storedTokens.issued_at,\n expiresIn: storedTokens.expires_in,\n refreshExpiresIn: storedTokens.refresh_expires_in,\n currentTime: Math.floor(Date.now() / 1000)\n })\n \n // Set tokens to auth state first so refresh token is available\n this.authState.tokens = storedTokens\n console.log('π§ Tokens set in auth state, refresh token available:', !!this.authState.tokens?.refresh_token)\n \n // Try to validate the access token (this will auto-refresh if needed)\n const isValid = await this.validateStoredTokens(storedTokens)\n if (isValid) {\n console.log('β
Auth initialization complete (from storage)')\n return\n } else {\n console.log('π Stored tokens invalid, clearing...')\n this.clearTokens()\n }\n }\n\n // No tokens found\n console.log('β No tokens found')\n if (this.config.authRequired) {\n console.log('π Auth required, redirecting to auth page...')\n this.redirectToAuth()\n } else {\n console.log('β οΈ Auth not required, continuing without authentication')\n }\n } finally {\n this.setLoading(false)\n }\n }\n\n /**\n * Redirect to Blink auth page\n */\n login(nextUrl?: string): void {\n const redirectUrl = nextUrl || (typeof window !== 'undefined' ? window.location.href : '')\n const authUrl = new URL('/auth', this.authUrl)\n \n authUrl.searchParams.set('redirect_url', redirectUrl)\n if (this.config.projectId) {\n authUrl.searchParams.set('project_id', this.config.projectId)\n }\n\n if (typeof window !== 'undefined') {\n window.location.href = authUrl.toString()\n }\n }\n\n /**\n * Logout and clear stored tokens\n */\n logout(redirectUrl?: string): void {\n this.clearTokens()\n \n if (redirectUrl && typeof window !== 'undefined') {\n window.location.href = redirectUrl\n }\n }\n\n /**\n * Check if user is authenticated\n */\n isAuthenticated(): boolean {\n return this.authState.isAuthenticated\n }\n\n /**\n * Get current user (sync)\n */\n currentUser(): BlinkUser | null {\n return this.authState.user\n }\n\n /**\n * Get current access token\n */\n getToken(): string | null {\n return this.authState.tokens?.access_token || null\n }\n\n /**\n * Check if access token is expired based on timestamp\n */\n private isAccessTokenExpired(): boolean {\n const tokens = this.authState.tokens\n if (!tokens || !tokens.issued_at) {\n return true // Assume expired if no timestamp\n }\n\n const now = Math.floor(Date.now() / 1000) // Current time in seconds\n const expiresAt = tokens.issued_at + tokens.expires_in\n const bufferTime = 30 // Refresh 30 seconds before actual expiration\n \n return now >= (expiresAt - bufferTime)\n }\n\n /**\n * Check if refresh token is expired based on timestamp\n */\n private isRefreshTokenExpired(): boolean {\n const tokens = this.authState.tokens\n if (!tokens || !tokens.refresh_token || !tokens.issued_at || !tokens.refresh_expires_in) {\n return true // Assume expired if no refresh token or timestamp\n }\n\n const now = Math.floor(Date.now() / 1000) // Current time in seconds\n const expiresAt = tokens.issued_at + tokens.refresh_expires_in\n \n return now >= expiresAt\n }\n\n /**\n * Get a valid access token, refreshing if necessary\n */\n async getValidToken(): Promise<string | null> {\n const tokens = this.authState.tokens\n if (!tokens) {\n return null\n }\n\n // If access token is not expired, return it\n if (!this.isAccessTokenExpired()) {\n console.log('β
Access token is still valid')\n return tokens.access_token\n }\n\n // Access token is expired, try to refresh\n console.log('β° Access token expired, attempting refresh...')\n \n if (this.isRefreshTokenExpired()) {\n console.log('β Refresh token also expired, clearing tokens')\n this.clearTokens()\n if (this.config.authRequired) {\n this.redirectToAuth()\n }\n return null\n }\n\n // Try to refresh the token\n const refreshed = await this.refreshToken()\n if (refreshed) {\n console.log('β
Token refreshed successfully')\n return this.authState.tokens?.access_token || null\n } else {\n console.log('β Token refresh failed')\n this.clearTokens()\n if (this.config.authRequired) {\n this.redirectToAuth()\n }\n return null\n }\n }\n\n /**\n * Fetch current user profile from API\n */\n async me(): Promise<BlinkUser> {\n let token = this.getToken()\n if (!token) {\n throw new BlinkAuthError('No access token available')\n }\n\n try {\n const response = await fetch(`${this.authUrl}/api/auth/me`, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n },\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n // Try to refresh token first\n const refreshed = await this.refreshToken()\n if (refreshed) {\n // Retry with new token\n token = this.getToken()\n if (token) {\n const retryResponse = await fetch(`${this.authUrl}/api/auth/me`, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n },\n })\n if (retryResponse.ok) {\n const retryData = await retryResponse.json()\n const user = retryData.user\n this.updateAuthState({\n ...this.authState,\n user,\n })\n return user\n }\n }\n }\n \n // Refresh failed or retry failed\n this.clearTokens()\n if (this.config.authRequired) {\n this.redirectToAuth()\n }\n }\n throw new BlinkAuthError(`Failed to fetch user: ${response.statusText}`)\n }\n\n const data = await response.json()\n const user = data.user\n\n // Update auth state with fresh user data\n this.updateAuthState({\n ...this.authState,\n user,\n })\n\n return user\n } catch (error) {\n if (error instanceof BlinkAuthError) {\n throw error\n }\n throw new BlinkAuthError(`Network error: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n }\n\n /**\n * Update user profile\n */\n async updateMe(updates: Partial<BlinkUser>): Promise<BlinkUser> {\n const token = this.getToken()\n if (!token) {\n throw new BlinkAuthError('No access token available')\n }\n\n try {\n const response = await fetch(`${this.authUrl}/api/auth/me`, {\n method: 'PATCH',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(updates),\n })\n\n if (!response.ok) {\n throw new BlinkAuthError(`Failed to update user: ${response.statusText}`)\n }\n\n const data = await response.json()\n const user = data.user\n\n // Update auth state with updated user data\n this.updateAuthState({\n ...this.authState,\n user,\n })\n\n return user\n } catch (error) {\n if (error instanceof BlinkAuthError) {\n throw error\n }\n throw new BlinkAuthError(`Network error: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n }\n\n /**\n * Manually set tokens (for server-side usage)\n */\n async setToken(jwt: string, persist: boolean = false): Promise<void> {\n const tokens: AuthTokens = {\n access_token: jwt,\n token_type: 'Bearer',\n expires_in: 15 * 60, // Default 15 minutes\n }\n\n await this.setTokens(tokens, persist)\n }\n\n /**\n * Refresh access token using refresh token\n */\n async refreshToken(): Promise<boolean> {\n const refreshToken = this.authState.tokens?.refresh_token\n if (!refreshToken) {\n return false\n }\n\n try {\n const response = await fetch(`${this.authUrl}/api/auth/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n refresh_token: refreshToken,\n }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n // Refresh token is invalid/expired\n this.clearTokens()\n if (this.config.authRequired) {\n this.redirectToAuth()\n }\n }\n return false\n }\n\n const data = await response.json()\n await this.setTokens({\n access_token: data.access_token,\n refresh_token: data.refresh_token,\n token_type: data.token_type,\n expires_in: data.expires_in,\n refresh_expires_in: data.refresh_expires_in,\n }, true)\n\n return true\n } catch (error) {\n console.error('Token refresh failed:', error)\n return false\n }\n }\n\n /**\n * Add auth state change listener\n */\n onAuthStateChanged(callback: AuthStateChangeCallback): () => void {\n this.listeners.add(callback)\n \n // Call immediately with current state\n callback(this.authState)\n \n // Return unsubscribe function\n return () => {\n this.listeners.delete(callback)\n }\n }\n\n /**\n * Private helper methods\n */\n\n private async validateStoredTokens(tokens: AuthTokens): Promise<boolean> {\n try {\n console.log('π Validating stored tokens...')\n \n // Check if access token is expired based on timestamp first\n if (this.isAccessTokenExpired()) {\n console.log('β° Access token expired based on timestamp, attempting refresh...')\n \n if (!tokens.refresh_token) {\n console.log('β No refresh token available')\n return false\n }\n \n if (this.isRefreshTokenExpired()) {\n console.log('β Refresh token also expired')\n return false\n }\n \n // Try to refresh the token\n const refreshed = await this.refreshToken()\n if (refreshed) {\n console.log('β
Token refreshed successfully during validation')\n return true\n } else {\n console.log('β Token refresh failed during validation')\n return false\n }\n }\n \n // Access token should be valid, verify with API\n const response = await fetch(`${this.authUrl}/api/auth/me`, {\n headers: {\n 'Authorization': `Bearer ${tokens.access_token}`,\n },\n })\n\n if (response.ok) {\n // Token is valid, update auth state\n const data = await response.json()\n const user = data.user\n \n this.updateAuthState({\n user,\n tokens,\n isAuthenticated: true,\n isLoading: false,\n })\n \n console.log('β
Stored tokens are valid, user authenticated')\n return true\n } else if (response.status === 401 && tokens.refresh_token) {\n // Access token expired (server-side validation), try to refresh\n console.log('π Access token expired (server validation), attempting refresh...')\n \n if (this.isRefreshTokenExpired()) {\n console.log('β Refresh token expired')\n return false\n }\n \n const refreshed = await this.refreshToken()\n if (refreshed) {\n console.log('β
Token refreshed successfully after server validation')\n return true\n } else {\n console.log('β Token refresh failed after server validation')\n return false\n }\n } else {\n console.log('β Token validation failed:', response.status, response.statusText)\n return false\n }\n } catch (error) {\n console.log('π₯ Error validating tokens:', error)\n return false\n }\n }\n\n private async setTokens(tokens: AuthTokens, persist: boolean): Promise<void> {\n // Add issued_at timestamp if not present\n const tokensWithTimestamp: AuthTokens = {\n ...tokens,\n issued_at: tokens.issued_at || Math.floor(Date.now() / 1000)\n }\n\n console.log('π Setting tokens:', {\n persist,\n hasAccessToken: !!tokensWithTimestamp.access_token,\n hasRefreshToken: !!tokensWithTimestamp.refresh_token,\n expiresIn: tokensWithTimestamp.expires_in,\n issuedAt: tokensWithTimestamp.issued_at\n })\n\n if (persist && typeof window !== 'undefined') {\n localStorage.setItem('blink_tokens', JSON.stringify(tokensWithTimestamp))\n console.log('πΎ Tokens persisted to localStorage')\n }\n\n // Try to fetch user data with the new token\n let user: BlinkUser | null = null\n try {\n console.log('π€ Fetching user data...')\n const response = await fetch(`${this.authUrl}/api/auth/me`, {\n headers: {\n 'Authorization': `Bearer ${tokensWithTimestamp.access_token}`,\n },\n })\n\n console.log('π‘ User fetch response:', {\n status: response.status,\n statusText: response.statusText,\n ok: response.ok\n })\n\n if (response.ok) {\n const data = await response.json()\n user = data.user\n console.log('β
User data fetched successfully:', {\n id: user?.id,\n email: user?.email,\n displayName: user?.displayName\n })\n } else {\n console.log('β Failed to fetch user data:', await response.text())\n }\n } catch (error) {\n console.log('π₯ Error fetching user data:', error)\n }\n\n this.updateAuthState({\n user,\n tokens: tokensWithTimestamp,\n isAuthenticated: !!user,\n isLoading: false,\n })\n\n console.log('π― Auth state updated:', {\n hasUser: !!user,\n isAuthenticated: !!user,\n isLoading: false\n })\n }\n\n private clearTokens(): void {\n if (typeof window !== 'undefined') {\n localStorage.removeItem('blink_tokens')\n }\n\n this.updateAuthState({\n user: null,\n tokens: null,\n isAuthenticated: false,\n isLoading: false,\n })\n }\n\n private getStoredTokens(): AuthTokens | null {\n if (typeof window === 'undefined') return null\n\n try {\n const stored = localStorage.getItem('blink_tokens')\n console.log('π Checking localStorage for tokens:', {\n hasStoredData: !!stored,\n storedLength: stored?.length || 0\n })\n \n if (stored) {\n const tokens = JSON.parse(stored)\n console.log('π¦ Parsed stored tokens:', {\n hasAccessToken: !!tokens.access_token,\n hasRefreshToken: !!tokens.refresh_token,\n tokenType: tokens.token_type,\n expiresIn: tokens.expires_in\n })\n return tokens\n }\n \n return null\n } catch (error) {\n console.log('π₯ Error parsing stored tokens:', error)\n localStorage.removeItem('blink_tokens') // Clean up corrupted data\n return null\n }\n }\n\n private extractTokensFromUrl(): AuthTokens | null {\n if (typeof window === 'undefined') return null\n\n const params = new URLSearchParams(window.location.search)\n const accessToken = params.get('access_token')\n const refreshToken = params.get('refresh_token')\n\n console.log('π Extracting tokens from URL:', {\n url: window.location.href,\n accessToken: accessToken ? `${accessToken.substring(0, 20)}...` : null,\n refreshToken: refreshToken ? `${refreshToken.substring(0, 20)}...` : null,\n allParams: Object.fromEntries(params.entries())\n })\n\n if (accessToken) {\n const tokens: AuthTokens = {\n access_token: accessToken,\n refresh_token: refreshToken || undefined,\n token_type: 'Bearer' as const,\n expires_in: 15 * 60, // 15 minutes default\n refresh_expires_in: refreshToken ? 30 * 24 * 60 * 60 : undefined, // 30 days default\n issued_at: Math.floor(Date.now() / 1000), // Current timestamp\n }\n console.log('β
Tokens extracted successfully:', {\n hasAccessToken: !!tokens.access_token,\n hasRefreshToken: !!tokens.refresh_token\n })\n return tokens\n }\n\n console.log('β No access token found in URL')\n return null\n }\n\n private clearUrlTokens(): void {\n if (typeof window === 'undefined') return\n\n const url = new URL(window.location.href)\n \n // Remove all auth-related parameters\n url.searchParams.delete('access_token')\n url.searchParams.delete('refresh_token')\n url.searchParams.delete('token_type')\n url.searchParams.delete('project_id')\n url.searchParams.delete('expires_in')\n url.searchParams.delete('refresh_expires_in')\n url.searchParams.delete('state')\n url.searchParams.delete('code')\n url.searchParams.delete('error')\n url.searchParams.delete('error_description')\n \n // Clean the URL by replacing the current history entry\n window.history.replaceState({}, '', url.toString())\n console.log('π§Ή URL cleaned up, removed auth parameters')\n }\n\n private redirectToAuth(): void {\n if (typeof window !== 'undefined') {\n this.login()\n }\n }\n\n private setLoading(loading: boolean): void {\n this.updateAuthState({\n ...this.authState,\n isLoading: loading,\n })\n }\n\n private updateAuthState(newState: AuthState): void {\n this.authState = newState\n \n // Notify all listeners\n this.listeners.forEach(callback => {\n try {\n callback(newState)\n } catch (error) {\n console.error('Error in auth state change callback:', error)\n }\n })\n }\n} ","/**\n * Blink Database Module - Table operations and query interface\n * Provides CRUD operations with PostgREST-compatible API\n */\n\nimport type {\n TableOperations,\n QueryOptions,\n ListResponse,\n CreateOptions,\n UpdateOptions,\n UpsertOptions,\n FilterCondition,\n HttpClient,\n} from '@blink/core'\nimport { buildQuery, queryToSearchParams } from '@blink/core'\n\nexport class BlinkTable<T = any> implements TableOperations<T> {\n constructor(\n private tableName: string,\n private httpClient: HttpClient\n ) {}\n\n /**\n * Create a single record\n */\n async create(data: Partial<T>, options: CreateOptions = {}): Promise<T> {\n const response = await this.httpClient.dbPost<T>(\n this.tableName,\n data,\n { returning: options.returning !== false }\n )\n\n // Handle both single record and array responses\n const result = Array.isArray(response.data) ? response.data[0] : response.data\n if (!result) {\n throw new Error('Failed to create record')\n }\n\n return result\n }\n\n /**\n * Create multiple records\n */\n async createMany(data: Partial<T>[], options: CreateOptions = {}): Promise<T[]> {\n const response = await this.httpClient.dbPost<T[]>(\n this.tableName,\n data,\n { returning: options.returning !== false }\n )\n\n return Array.isArray(response.data) ? response.data as T[] : [response.data as T]\n }\n\n /**\n * Upsert a single record (insert or update on conflict)\n */\n async upsert(data: Partial<T>, options: UpsertOptions = {}): Promise<T> {\n // Add upsert-specific headers\n const headers: Record<string, string> = {}\n if (options.returning !== false) {\n headers.Prefer = 'return=representation'\n }\n if (options.onConflict) {\n headers['Prefer'] = `${headers['Prefer'] || ''} resolution=merge-duplicates`.trim()\n }\n\n const response = await this.httpClient.request<T | T[]>(\n `/api/db/${this.httpClient.projectId}/rest/v1/${this.tableName}?on_conflict=${options.onConflict || 'id'}`,\n {\n method: 'POST',\n body: data,\n headers,\n }\n )\n\n const result = Array.isArray(response.data) ? response.data[0] : response.data\n if (!result) {\n throw new Error('Failed to upsert record')\n }\n\n return result\n }\n\n /**\n * Upsert multiple records\n */\n async upsertMany(data: Partial<T>[], options: UpsertOptions = {}): Promise<T[]> {\n const headers: Record<string, string> = {}\n if (options.returning !== false) {\n headers.Prefer = 'return=representation'\n }\n if (options.onConflict) {\n headers['Prefer'] = `${headers['Prefer'] || ''} resolution=merge-duplicates`.trim()\n }\n\n const response = await this.httpClient.request<T[]>(\n `/api/db/${this.httpClient.projectId}/rest/v1/${this.tableName}?on_conflict=${options.onConflict || 'id'}`,\n {\n method: 'POST',\n body: data,\n headers,\n }\n )\n\n return Array.isArray(response.data) ? response.data : [response.data]\n }\n\n /**\n * Get a single record by ID\n */\n async get(id: string): Promise<T | null> {\n const searchParams = {\n id: `eq.${id}`,\n limit: '1',\n }\n\n const response = await this.httpClient.dbGet<T>(this.tableName, searchParams)\n const records = response.data\n\n return records.length > 0 ? records[0]! : null\n }\n\n /**\n * List records with filtering, sorting, and pagination\n */\n async list(options: QueryOptions = {}): Promise<ListResponse<T>> {\n const queryParams = buildQuery(options)\n const searchParams = queryParams\n\n const response = await this.httpClient.dbGet<T>(this.tableName, searchParams)\n const records = response.data\n\n // Calculate pagination info\n const hasMore = options.limit ? records.length === options.limit : false\n const nextCursor = hasMore && records.length > 0 \n ? this.extractCursor(records[records.length - 1]!)\n : undefined\n\n return {\n data: records,\n count: records.length,\n nextCursor,\n hasMore,\n }\n }\n\n /**\n * Update a single record by ID\n */\n async update(id: string, data: Partial<T>, options: UpdateOptions = {}): Promise<T> {\n const searchParams = {\n id: `eq.${id}`,\n }\n\n const response = await this.httpClient.dbPatch<T>(\n this.tableName,\n data,\n searchParams,\n { returning: options.returning !== false }\n )\n\n const records = response.data\n if (!records || records.length === 0) {\n throw new Error(`Record with id ${id} not found`)\n }\n\n return records[0]!\n }\n\n /**\n * Update multiple records\n */\n async updateMany(\n updates: Array<{ id: string } & Partial<T>>,\n options: UpdateOptions = {}\n ): Promise<T[]> {\n // For batch updates, we'll use individual update calls\n // In a real implementation, you might want to use a batch endpoint\n const results: T[] = []\n\n for (const update of updates) {\n const { id, ...data } = update\n const result = await this.update(id, data as Partial<T>, options)\n results.push(result)\n }\n\n return results\n }\n\n /**\n * Delete a single record by ID\n */\n async delete(id: string): Promise<void> {\n const searchParams = {\n id: `eq.${id}`,\n }\n\n await this.httpClient.dbDelete(this.tableName, searchParams)\n }\n\n /**\n * Delete multiple records based on filter\n */\n async deleteMany(options: { where: FilterCondition }): Promise<void> {\n const queryParams = buildQuery({ where: options.where })\n const searchParams = queryParams\n\n await this.httpClient.dbDelete(this.tableName, searchParams)\n }\n\n /**\n * Count records matching filter\n */\n async count(options: { where?: FilterCondition } = {}): Promise<number> {\n const queryParams = buildQuery({\n where: options.where,\n select: ['id'],\n })\n\n // Use the HTTP client's request method to add proper headers\n const response = await this.httpClient.request<any[]>(\n `/api/db/${this.httpClient.projectId}/rest/v1/${this.tableName}`,\n {\n method: 'GET',\n searchParams: queryParams,\n headers: {\n 'Prefer': 'count=exact'\n }\n }\n )\n \n // PostgREST returns count in Content-Range header\n const contentRange = response.headers.get('content-range')\n if (contentRange) {\n const match = contentRange.match(/\\/(\\d+)$/)\n if (match && match[1]) {\n return parseInt(match[1], 10)\n }\n }\n\n // Fallback to array length\n return Array.isArray(response.data) ? response.data.length : 0\n }\n\n /**\n * Check if any records exist matching filter\n */\n async exists(options: { where: FilterCondition }): Promise<boolean> {\n const count = await this.count(options)\n return count > 0\n }\n\n /**\n * Raw SQL query on this table (for advanced use cases)\n */\n async sql<R = any>(\n query: string,\n params?: any[]\n ): Promise<{\n rows: R[]\n columns: string[]\n rowCount: number\n executionTime: number\n }> {\n const response = await this.httpClient.dbSql<R>(query, params)\n return response.data\n }\n\n /**\n * Private helper methods\n */\n\n private extractCursor(record: any): string {\n // Use the record's ID as cursor by default\n // In a real implementation, you might want to use a timestamp or other field\n return record.id || record._id || String(Math.random())\n }\n}\n\nexport class BlinkDatabase {\n private tables: Map<string, BlinkTable> = new Map()\n\n constructor(private httpClient: HttpClient) {\n // Create the proxy instance\n const proxy = new Proxy(this, {\n get(target, prop: string | symbol) {\n // Always allow access to the table method\n if (prop === 'table') {\n return target.table.bind(target)\n }\n \n // For other methods and properties, return them directly\n if (prop in target) {\n const value = (target as any)[prop]\n return typeof value === 'function' ? value.bind(target) : value\n }\n \n // For unknown string properties, treat them as table names\n if (typeof prop === 'string') {\n return target.table(prop)\n }\n \n return undefined\n },\n })\n \n // Return the proxy\n return proxy as any\n }\n\n /**\n * Get a table instance for any table name\n */\n table<T = any>(tableName: string): BlinkTable<T> {\n if (!this.tables.has(tableName)) {\n this.tables.set(tableName, new BlinkTable<T>(tableName, this.httpClient))\n }\n const table = this.tables.get(tableName)\n if (!table) {\n throw new Error(`Table ${tableName} not found`)\n }\n return table as BlinkTable<T>\n }\n\n /**\n * Execute raw SQL query\n */\n async sql<T = any>(\n query: string,\n params?: any[]\n ): Promise<{\n rows: T[]\n columns: string[]\n rowCount: number\n executionTime: number\n }> {\n const response = await this.httpClient.dbSql<T>(query, params)\n return response.data\n }\n\n /**\n * Execute batch SQL operations\n */\n async batch<T = any>(\n statements: Array<{ sql: string; args?: any[] }>,\n mode: 'read' | 'write' = 'write'\n ): Promise<{\n results: Array<{\n rows: T[]\n columns: string[]\n rowCount: number\n }>\n executionTime: number\n success: boolean\n }> {\n const response = await this.httpClient.dbBatch<T>(statements, mode)\n return response.data\n }\n} ","/**\n * Blink Storage Module\n * Handles file upload and file removal\n */\n\nimport type { HttpClient } from '@blink/core'\nimport type { \n BlinkStorage,\n StorageUploadOptions,\n StorageUploadResponse,\n StorageResponse\n} from '@blink/core'\nimport { BlinkStorageError } from '@blink/core'\n\nexport class BlinkStorageImpl implements BlinkStorage {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Upload a file to project storage\n * \n * @param file - File, Blob, or Buffer to upload\n * @param path - Destination path within project storage\n * @param options - Upload options including upsert and progress callback\n * @returns Promise resolving to upload response with public URL\n * \n * @example\n * ```ts\n * const { publicUrl } = await blink.storage.upload(\n * fileInput.files[0],\n * `avatars/${user.id}.png`,\n * {\n * upsert: true,\n * onProgress: pct => console.log(`${pct}%`)\n * }\n * );\n * ```\n */\n async upload(\n file: File | Blob | Buffer,\n path: string,\n options: StorageUploadOptions = {}\n ): Promise<StorageUploadResponse> {\n try {\n // Validate inputs\n if (!file) {\n throw new BlinkStorageError('File is required')\n }\n \n if (!path || typeof path !== 'string' || !path.trim()) {\n throw new BlinkStorageError('Path must be a non-empty string')\n }\n\n // Check file size (50MB limit as per API)\n const maxSize = 50 * 1024 * 1024 // 50MB\n let fileSize = 0\n \n if (file instanceof File || file instanceof Blob) {\n fileSize = file.size\n } else if (typeof Buffer !== 'undefined' && file instanceof Buffer) {\n fileSize = file.length\n }\n \n if (fileSize > maxSize) {\n throw new BlinkStorageError(`File size (${Math.round(fileSize / 1024 / 1024)}MB) exceeds maximum allowed size (50MB)`)\n }\n\n const response = await this.httpClient.uploadFile(\n `/api/storage/${this.httpClient.projectId}/upload`,\n file,\n path,\n {\n upsert: options.upsert,\n onProgress: options.onProgress,\n }\n )\n\n // Handle the response based on API specification\n if (response.data?.data?.publicUrl) {\n return { publicUrl: response.data.data.publicUrl }\n } else if (response.data?.publicUrl) {\n return { publicUrl: response.data.publicUrl }\n } else {\n throw new BlinkStorageError('Invalid response format: missing publicUrl')\n }\n } catch (error) {\n if (error instanceof BlinkStorageError) {\n throw error\n }\n \n // Handle specific HTTP errors\n if (error instanceof Error && 'status' in error) {\n const status = (error as any).status\n if (status === 409) {\n throw new BlinkStorageError('File already exists. Set upsert: true to overwrite.', 409)\n }\n if (status === 400) {\n throw new BlinkStorageError('Invalid request parameters', 400)\n }\n }\n \n throw new BlinkStorageError(\n `Upload failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n\n\n\n /**\n * Remove one or more files from project storage\n * \n * @param paths - File paths to remove\n * @returns Promise that resolves when files are removed\n * \n * @example\n * ```ts\n * await blink.storage.remove('avatars/user1.png');\n * await blink.storage.remove('file1.pdf', 'file2.pdf', 'file3.pdf');\n * ```\n */\n async remove(...paths: string[]): Promise<void> {\n try {\n if (paths.length === 0) {\n throw new BlinkStorageError('At least one path must be provided')\n }\n\n // Validate all paths\n for (const path of paths) {\n if (!path || typeof path !== 'string') {\n throw new BlinkStorageError('All paths must be non-empty strings')\n }\n }\n\n await this.httpClient.request(\n `/api/storage/${this.httpClient.projectId}/remove`,\n {\n method: 'DELETE',\n body: { paths },\n headers: { 'Content-Type': 'application/json' },\n }\n )\n\n // API returns success response, no need to return anything for void method\n } catch (error) {\n if (error instanceof BlinkStorageError) {\n throw error\n }\n \n // Handle specific HTTP errors\n if (error instanceof Error && 'status' in error) {\n const status = (error as any).status\n if (status === 400) {\n throw new BlinkStorageError('Invalid request parameters', 400)\n }\n }\n \n throw new BlinkStorageError(\n `Failed to remove files: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n} ","/**\n * Blink AI Module\n * Provides AI generation capabilities with Vercel AI SDK compatibility\n */\n\nimport type { HttpClient } from '@blink/core'\nimport type { \n BlinkAI,\n TextGenerationRequest,\n TextGenerationResponse,\n ObjectGenerationRequest,\n ObjectGenerationResponse,\n ImageGenerationRequest,\n ImageGenerationResponse,\n SpeechGenerationRequest,\n SpeechGenerationResponse,\n TranscriptionRequest,\n TranscriptionResponse\n} from '@blink/core'\nimport { BlinkAIError } from '@blink/core'\n\nexport class BlinkAIImpl implements BlinkAI {\n constructor(private httpClient: HttpClient) {}\n\n // Supported image formats for validation\n private readonly SUPPORTED_IMAGE_FORMATS = ['jpg', 'jpeg', 'png', 'gif', 'webp'] as const\n\n /**\n * Validates if a URL is a valid HTTPS image URL\n */\n private validateImageUrl(url: string): { isValid: boolean; error?: string } {\n try {\n const parsedUrl = new URL(url)\n \n // Only allow HTTPS for security\n if (parsedUrl.protocol !== 'https:') {\n return { isValid: false, error: 'Image URLs must use HTTPS protocol' }\n }\n \n // Check if URL has a supported image format extension\n const pathname = parsedUrl.pathname.toLowerCase()\n const hasValidExtension = this.SUPPORTED_IMAGE_FORMATS.some(format => \n pathname.endsWith(`.${format}`)\n )\n \n if (!hasValidExtension) {\n return { \n isValid: false, \n error: `Image URL must end with a supported format: ${this.SUPPORTED_IMAGE_FORMATS.join(', ')}` \n }\n }\n \n return { isValid: true }\n } catch (error) {\n return { isValid: false, error: 'Invalid URL format' }\n }\n }\n\n /**\n * Validates messages for image content\n */\n private validateMessages(messages: any[]): { isValid: boolean; errors: string[] } {\n const errors: string[] = []\n \n messages.forEach((message, messageIndex) => {\n if (Array.isArray(message.content)) {\n message.content.forEach((item: any, contentIndex: number) => {\n if (item.type === 'image') {\n if (!item.image || typeof item.image !== 'string') {\n errors.push(`Message ${messageIndex}, content ${contentIndex}: Image content must have a valid image URL`)\n } else {\n const validation = this.validateImageUrl(item.image)\n if (!validation.isValid) {\n errors.push(`Message ${messageIndex}, content ${contentIndex}: ${validation.error}`)\n }\n }\n }\n })\n }\n })\n \n return { isValid: errors.length === 0, errors }\n }\n\n /**\n * Get MIME type for audio format\n */\n private getMimeTypeForFormat(format: string): string {\n const mimeTypes: Record<string, string> = {\n mp3: 'audio/mpeg',\n opus: 'audio/opus',\n aac: 'audio/aac',\n flac: 'audio/flac',\n wav: 'audio/wav',\n pcm: 'audio/pcm'\n }\n return mimeTypes[format] || 'audio/mpeg'\n }\n\n /**\n * Generates a text response using the Blink AI engine.\n * \n * @param options - An object containing either:\n * - `prompt`: a simple string prompt\n * - OR `messages`: an array of chat messages for conversation\n * - Plus optional model, search, maxSteps, experimental_continueSteps, maxTokens, temperature, signal parameters\n * \n * @example\n * ```ts\n * // Simple prompt\n * const { text } = await blink.ai.generateText({ \n * prompt: \"Write a poem about coding\" \n * });\n * \n * // Chat messages (text only)\n * const { text } = await blink.ai.generateText({\n * messages: [\n * { role: \"system\", content: \"You are a helpful assistant\" },\n * { role: \"user\", content: \"Explain quantum computing\" }\n * ]\n * });\n * \n * // With image content\n * const { text } = await blink.ai.generateText({\n * messages: [\n * { \n * role: \"user\", \n * content: [\n * { type: \"text\", text: \"What do you see in this image?\" },\n * { type: \"image\", image: \"https://example.com/photo.jpg\" }\n * ]\n * }\n * ]\n * });\n * \n * // Mixed content with multiple images\n * const { text } = await blink.ai.generateText({\n * messages: [\n * { \n * role: \"user\", \n * content: [\n * { type: \"text\", text: \"Compare these two images:\" },\n * { type: \"image\", image: \"https://example.com/image1.jpg\" },\n * { type: \"image\", image: \"https://example.com/image2.jpg\" }\n * ]\n * }\n * ]\n * });\n * \n * // With options\n * const { text, usage } = await blink.ai.generateText({\n * prompt: \"Summarize this article\",\n * model: \"gpt-4o-mini\",\n * maxTokens: 150,\n * temperature: 0.7\n * });\n * \n * // With web search (OpenAI models only)\n * const { text, sources } = await blink.ai.generateText({\n * prompt: \"What are the latest developments in AI?\",\n * model: \"gpt-4o-mini\",\n * search: true // Enables web search\n * });\n * \n * // With advanced multi-step configuration\n * const { text } = await blink.ai.generateText({\n * prompt: \"Research and analyze recent tech trends\",\n * model: \"gpt-4o\",\n * search: true,\n * maxSteps: 10, // Allow up to 10 reasoning steps\n * experimental_continueSteps: true // Enable continued reasoning\n * });\n * ```\n * \n * @returns Promise<TextGenerationResponse> - Object containing:\n * - `text`: Generated text string\n * - `usage`: Token usage information\n * - `finishReason`: Why generation stopped (\"stop\", \"length\", etc.)\n */\n async generateText(options: TextGenerationRequest): Promise<TextGenerationResponse> {\n try {\n if (!options.prompt && !options.messages) {\n throw new BlinkAIError('Either prompt or messages is required')\n }\n\n // Validate messages if they contain image content\n if (options.messages) {\n const validation = this.validateMessages(options.messages)\n if (!validation.isValid) {\n throw new BlinkAIError(`Message validation failed: ${validation.errors.join('; ')}`)\n }\n }\n\n // Build request body - include prompt only if provided\n const requestBody: any = {\n model: options.model,\n stream: false,\n search: options.search,\n maxSteps: options.maxSteps,\n experimental_continueSteps: options.experimental_continueSteps,\n maxTokens: options.maxTokens,\n temperature: options.temperature,\n signal: options.signal,\n }\n \n if (options.prompt) {\n requestBody.prompt = options.prompt\n }\n \n if (options.messages) {\n requestBody.messages = options.messages\n }\n\n const response = await this.httpClient.aiText(\n options.prompt || '',\n requestBody\n )\n\n // Handle API response format\n if (response.data?.result) {\n return response.data.result\n } else if (response.data?.text) {\n return response.data\n } else {\n throw new BlinkAIError('Invalid response format: missing text')\n }\n } catch (error) {\n if (error instanceof BlinkAIError) {\n throw error\n }\n throw new BlinkAIError(\n `Text generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n\n /**\n * Streams text generation with real-time updates as the AI generates content.\n * \n * @param options - Same as generateText: either `prompt` or `messages` with optional parameters including search, maxSteps, experimental_continueSteps\n * @param onChunk - Callback function that receives each text chunk as it's generated\n * \n * @example\n * ```ts\n * // Stream with prompt\n * await blink.ai.streamText(\n * { prompt: \"Write a short story about space exploration\" },\n * (chunk) => {\n * process.stdout.write(chunk); // Real-time output\n * }\n * );\n * \n * // Stream with messages\n * await blink.ai.streamText(\n * { \n * messages: [\n * { role: \"system\", content: \"You are a creative writer\" },\n * { role: \"user\", content: \"Write a haiku about programming\" }\n * ]\n * },\n * (chunk) => updateUI(chunk)\n * );\n * ```\n * \n * @returns Promise<TextGenerationResponse> - Final complete response with full text and metadata\n */\n async streamText(\n options: TextGenerationRequest,\n onChunk: (chunk: string) => void\n ): Promise<TextGenerationResponse> {\n try {\n if (!options.prompt && !options.messages) {\n throw new BlinkAIError('Either prompt or messages is required')\n }\n\n // Validate messages if they contain image content\n if (options.messages) {\n const validation = this.validateMessages(options.messages)\n if (!validation.isValid) {\n throw new BlinkAIError(`Message validation failed: ${validation.errors.join('; ')}`)\n }\n }\n\n const result = await this.httpClient.streamAiText(\n options.prompt || '',\n {\n model: options.model,\n messages: options.messages,\n search: options.search,\n maxSteps: options.maxSteps,\n experimental_continueSteps: options.experimental_continueSteps,\n maxTokens: options.maxTokens,\n temperature: options.temperature,\n signal: options.signal,\n },\n onChunk\n )\n\n return {\n text: result.text || '',\n finishReason: 'stop',\n usage: result.usage,\n ...result,\n }\n } catch (error) {\n if (error instanceof BlinkAIError) {\n throw error\n }\n throw new BlinkAIError(\n `Text streaming failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n\n /**\n * Generates structured JSON objects using AI with schema validation.\n * \n * @param options - Object containing:\n * - `prompt`: Description of what object to generate (required)\n * - `schema`: JSON Schema to validate the generated object\n * - `output`: Type of output (\"object\", \"array\", \"enum\")\n * - `enum`: Array of allowed values for enum output\n * - Plus optional model, signal parameters\n * \n * @example\n * ```ts\n * // Generate user profile\n * const { object } = await blink.ai.generateObject({\n * prompt: \"Generate a user profile for a software developer\",\n * schema: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\" },\n * age: { type: \"number\" },\n * skills: { type: \"array\", items: { type: \"string\" } },\n * experience: { type: \"number\" }\n * },\n * required: [\"name\", \"skills\"]\n * }\n * });\n * \n * // Generate array of items\n * const { object } = await blink.ai.generateObject({\n * prompt: \"List 5 programming languages\",\n * output: \"array\",\n * schema: {\n * type: \"array\",\n * items: { type: \"string\" }\n * }\n * });\n * \n * // Generate enum value\n * const { object } = await blink.ai.generateObject({\n * prompt: \"Choose the best programming language for web development\",\n * output: \"enum\",\n * enum: [\"JavaScript\", \"Python\", \"TypeScript\", \"Go\"]\n * });\n * ```\n * \n * @returns Promise<ObjectGenerationResponse> - Object containing:\n * - `object`: The generated and validated JSON object/array/enum\n * - `usage`: Token usage information\n * - `finishReason`: Why generation stopped\n */\n async generateObject(options: ObjectGenerationRequest): Promise<ObjectGenerationResponse> {\n try {\n if (!options.prompt) {\n throw new BlinkAIError('Prompt is required')\n }\n\n const response = await this.httpClient.aiObject(\n options.prompt,\n {\n model: options.model,\n output: options.output,\n schema: options.schema,\n enum: options.enum,\n stream: false,\n signal: options.signal,\n }\n )\n\n // Handle API response format\n if (response.data?.result) {\n return response.data.result\n } else if (response.data?.object) {\n return response.data\n } else {\n throw new BlinkAIError('Invalid response format: missing object')\n }\n } catch (error) {\n if (error instanceof BlinkAIError) {\n throw error\n }\n throw new BlinkAIError(\n `Object generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n\n /**\n * Streams structured object generation with real-time partial updates as the AI builds the object.\n * \n * @param options - Same as generateObject: prompt, schema, output type, etc.\n * @param onPartial - Callback function that receives partial object updates as they're generated\n * \n * @example\n * ```ts\n * // Stream object generation with schema\n * await blink.ai.streamObject(\n * {\n * prompt: \"Generate a detailed product catalog entry\",\n * schema: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\" },\n * price: { type: \"number\" },\n * description: { type: \"string\" },\n * features: { type: \"array\", items: { type: \"string\" } }\n * }\n * }\n * },\n * (partial) => {\n * console.log(\"Partial update:\", partial);\n * updateProductForm(partial); // Update UI in real-time\n * }\n * );\n * ```\n * \n * @returns Promise<ObjectGenerationResponse> - Final complete object with metadata\n */\n async streamObject(\n options: ObjectGenerationRequest,\n onPartial: (partial: any) => void\n ): Promise<ObjectGenerationResponse> {\n try {\n if (!options.prompt) {\n throw new BlinkAIError('Prompt is required')\n }\n\n const result = await this.httpClient.streamAiObject(\n options.prompt,\n {\n model: options.model,\n output: options.output,\n schema: options.schema,\n enum: options.enum,\n signal: options.signal,\n },\n onPartial\n )\n\n return {\n object: result.object || {},\n finishReason: 'stop',\n usage: result.usage,\n ...result,\n }\n } catch (error) {\n if (error instanceof BlinkAIError) {\n throw error\n }\n throw new BlinkAIError(\n `Object streaming failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n\n /**\n * Generates images from text descriptions using AI image models.\n * \n * @param options - Object containing:\n * - `prompt`: Text description of the image to generate (required)\n * - `size`: Image dimensions (e.g., \"1024x1024\", \"512x512\") - varies by model\n * - `quality`: Image quality (\"standard\" or \"hd\")\n * - `n`: Number of images to generate (default: 1)\n * - `response_format`: Output format (\"url\" or \"b64_json\")\n * - Plus optional model, signal parameters\n * \n * @example\n * ```ts\n * // Basic image generation\n * const { data } = await blink.ai.generateImage({\n * prompt: \"A serene landscape with mountains and a lake at sunset\"\n * });\n * console.log(\"Image URL:\", data[0].url);\n * \n * // High-quality image with specific size\n * const { data } = await blink.ai.generateImage({\n * prompt: \"A futuristic city skyline with flying cars\",\n * size: \"1792x1024\",\n * quality: \"hd\",\n * model: \"dall-e-3\"\n * });\n * \n * // Multiple images\n * const { data } = await blink.ai.generateImage({\n * prompt: \"A cute robot mascot for a tech company\",\n * n: 3,\n * size: \"1024x1024\"\n * });\n * data.forEach((img, i) => console.log(`Image ${i+1}:`, img.url));\n * \n * // Base64 format for direct embedding\n * const { data } = await blink.ai.generateImage({\n * prompt: \"A minimalist logo design\",\n * response_format: \"b64_json\"\n * });\n * console.log(\"Base64 data:\", data[0].b64_json);\n * ```\n * \n * @returns Promise<ImageGenerationResponse> - Object containing:\n * - `data`: Array of generated images with url or b64_json\n */\n async generateImage(options: ImageGenerationRequest): Promise<ImageGenerationResponse> {\n try {\n if (!options.prompt) {\n throw new BlinkAIError('Prompt is required')\n }\n\n const response = await this.httpClient.aiImage(\n options.prompt,\n {\n model: options.model,\n size: options.size,\n quality: options.quality,\n n: options.n,\n response_format: options.response_format,\n signal: options.signal,\n }\n )\n\n // Handle API response format\n let imageResponse: ImageGenerationResponse\n \n if (response.data?.result?.data) {\n imageResponse = response.data.result\n } else if (response.data?.data) {\n imageResponse = response.data\n } else {\n throw new BlinkAIError('Invalid response format: missing image data')\n }\n\n // Ensure data array format and handle both URL and b64_json responses\n if (!Array.isArray(imageResponse.data)) {\n throw new BlinkAIError('Invalid response format: data should be an array')\n }\n\n // Normalize response format for both url and b64_json\n imageResponse.data = imageResponse.data.map((item: any) => {\n if (typeof item === 'string') {\n // Handle direct URL string\n return { url: item }\n } else if (item.url) {\n // Already has URL format\n return item\n } else if (item.b64_json) {\n // Handle base64 format\n return { b64_json: item.b64_json }\n } else {\n // Fallback - assume it's a URL\n return { url: item }\n }\n })\n\n return imageResponse\n } catch (error) {\n if (error instanceof BlinkAIError) {\n throw error\n }\n throw new BlinkAIError(\n `Image generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n\n /**\n * Converts text to speech using AI voice synthesis models.\n * \n * @param options - Object containing:\n * - `text`: Text content to convert to speech (required)\n * - `voice`: Voice to use (\"alloy\", \"echo\", \"fable\", \"onyx\", \"nova\", \"shimmer\")\n * - `response_format`: Audio format (\"mp3\", \"opus\", \"aac\", \"flac\", \"wav\", \"pcm\")\n * - `speed`: Speech speed (0.25 to 4.0, default: 1.0)\n * - Plus optional model, signal parameters\n * \n * @example\n * ```ts\n * // Basic text-to-speech\n * const { url } = await blink.ai.generateSpeech({\n * text: \"Hello, welcome to our AI-powered application!\"\n * });\n * console.log(\"Audio URL:\", url);\n * \n * // Custom voice and format\n * const { url, voice, format } = await blink.ai.generateSpeech({\n * text: \"This is a demonstration of our speech synthesis capabilities.\",\n * voice: \"nova\",\n * response_format: \"wav\",\n * speed: 1.2\n * });\n * console.log(`Generated ${format} audio with ${voice} voice:`, url);\n * \n * // Slow, clear speech for accessibility\n * const { url } = await blink.ai.generateSpeech({\n * text: \"Please listen carefully to these important instructions.\",\n * voice: \"echo\",\n * speed: 0.8\n * });\n * ```\n * \n * @returns Promise<SpeechGenerationResponse> - Object containing:\n * - `url`: URL to the generated audio file\n * - `voice`: Voice used for generation\n * - `format`: Audio format\n * - `mimeType`: MIME type of the audio\n */\n async generateSpeech(options: SpeechGenerationRequest): Promise<SpeechGenerationResponse> {\n try {\n if (!options.text) {\n throw new BlinkAIError('Text is required')\n }\n\n const response = await this.httpClient.aiSpeech(\n options.text,\n {\n model: options.model,\n voice: options.voice,\n response_format: options.response_format,\n speed: options.speed,\n signal: options.signal,\n }\n )\n\n // Handle API response format\n let speechResponse: SpeechGenerationResponse\n \n if (response.data?.result) {\n speechResponse = response.data.result\n } else if (response.data?.url) {\n speechResponse = response.data\n } else {\n throw new BlinkAIError('Invalid response format: missing speech data')\n }\n\n // Normalize response format - ensure we have all required fields\n if (!speechResponse.url) {\n // Try to extract from different possible response formats\n if (typeof response.data === 'string') {\n // Direct URL string - build full response\n speechResponse = {\n url: response.data,\n voice: options.voice || 'alloy',\n format: options.response_format || 'mp3',\n mimeType: this.getMimeTypeForFormat(options.response_format || 'mp3')\n }\n } else if (response.data?.data) {\n // Nested data format\n speechResponse = {\n url: response.data.data,\n voice: options.voice || 'alloy',\n format: options.response_format || 'mp3',\n mimeType: this.getMimeTypeForFormat(options.response_format || 'mp3')\n }\n } else {\n throw new BlinkAIError('Invalid response format: no audio URL found')\n }\n }\n\n // Ensure all required fields are present\n if (!speechResponse.voice) {\n speechResponse.voice = options.voice || 'alloy'\n }\n if (!speechResponse.format) {\n speechResponse.format = options.response_format || 'mp3'\n }\n if (!speechResponse.mimeType) {\n speechResponse.mimeType = this.getMimeTypeForFormat(speechResponse.format)\n }\n\n return speechResponse\n } catch (error) {\n if (error instanceof BlinkAIError) {\n throw error\n }\n throw new BlinkAIError(\n `Speech generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n\n /**\n * Transcribes audio content to text using AI speech recognition models.\n * \n * @param options - Object containing:\n * - `audio`: Audio input as URL string, base64 string, or number array buffer (required)\n * - `language`: Language code for transcription (e.g., \"en\", \"es\", \"fr\")\n * - `response_format`: Output format (\"json\", \"text\", \"srt\", \"verbose_json\", \"vtt\")\n * - Plus optional model, signal parameters\n * \n * @example\n * ```ts\n * // Transcribe from URL\n * const { text } = await blink.ai.transcribeAudio({\n * audio: \"https://example.com/meeting-recording.mp3\"\n * });\n * console.log(\"Transcription:\", text);\n * \n * // Transcribe with language hint\n * const { text, language } = await blink.ai.transcribeAudio({\n * audio: \"https://example.com/spanish-audio.wav\",\n * language: \"es\"\n * });\n * console.log(`Transcribed ${language}:`, text);\n * \n * // Transcribe with timestamps (verbose format)\n * const result = await blink.ai.transcribeAudio({\n * audio: audioFileUrl,\n * response_format: \"verbose_json\"\n * });\n * result.segments?.forEach(segment => {\n * console.log(`${segment.start}s - ${segment.end}s: ${segment.text}`);\n * });\n * \n * // Transcribe from audio buffer\n * const audioBuffer = new Array(1024).fill(0); // Your audio data\n * const { text } = await blink.ai.transcribeAudio({\n * audio: audioBuffer,\n * language: \"en\"\n * });\n * ```\n * \n * @returns Promise<TranscriptionResponse> - Object containing:\n * - `text`: Transcribed text content\n * - `transcript`: Alias for text\n * - `segments`: Array of timestamped segments (if verbose format)\n * - `language`: Detected language\n * - `duration`: Audio duration in seconds\n */\n async transcribeAudio(options: TranscriptionRequest): Promise<TranscriptionResponse> {\n try {\n if (!options.audio) {\n throw new BlinkAIError('Audio is required')\n }\n\n const response = await this.httpClient.aiTranscribe(\n options.audio,\n {\n model: options.model,\n language: options.language,\n response_format: options.response_format,\n signal: options.signal,\n }\n )\n\n // Handle API response format\n if (response.data?.result) {\n return response.data.result\n } else if (response.data?.text || response.data?.transcript) {\n return {\n text: response.data.text || response.data.transcript,\n transcript: response.data.transcript || response.data.text,\n ...response.data,\n }\n } else {\n throw new BlinkAIError('Invalid response format: missing transcription text')\n }\n } catch (error) {\n if (error instanceof BlinkAIError) {\n throw error\n }\n throw new BlinkAIError(\n `Audio transcription failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n { originalError: error }\n )\n }\n }\n} ","import type { HttpClient } from '@blink/core'\nimport type { \n ExtractFromUrlRequest, \n ExtractFromUrlResponse, \n ExtractFromBlobResponse,\n ScrapeRequest,\n ScrapeResponse,\n ScrapeResult,\n ScreenshotRequest,\n ScreenshotResponse,\n FetchRequest,\n FetchResponse,\n AsyncFetchResponse\n} from '@blink/core'\nimport { BlinkDataError } from '@blink/core'\n\nexport interface BlinkData {\n extractFromUrl(url: string, options?: { chunking?: boolean; chunkSize?: number }): Promise<string | string[]>\n extractFromBlob(file: File, options?: { chunking?: boolean; chunkSize?: number }): Promise<string | string[]>\n scrape(url: string): Promise<ScrapeResult>\n screenshot(url: string, options?: { fullPage?: boolean; width?: number; height?: number }): Promise<string>\n fetch(request: FetchRequest): Promise<FetchResponse>\n fetchAsync(request: Omit<FetchRequest, 'async'>): Promise<AsyncFetchResponse>\n}\n\nexport class BlinkDataImpl implements BlinkData {\n constructor(\n private httpClient: HttpClient,\n private projectId: string\n ) {}\n\n async extractFromUrl(\n url: string, \n options: { chunking?: boolean; chunkSize?: number } = {}\n ): Promise<string | string[]> {\n const { chunking = false, chunkSize } = options;\n const request: ExtractFromUrlRequest = { url, chunking, chunkSize };\n const response = await this.httpClient.dataExtractFromUrl(this.projectId, request);\n \n // Return chunks array if chunking is enabled, otherwise return text string\n return chunking ? response.data.chunks! : response.data.text!;\n }\n\n async extractFromBlob(\n file: File, \n options: { chunking?: boolean; chunkSize?: number } = {}\n ): Promise<string | string[]> {\n const { chunking = false, chunkSize } = options;\n const response = await this.httpClient.dataExtractFromBlob(this.projectId, file, chunking, chunkSize);\n \n // Return chunks array if chunking is enabled, otherwise return text string\n return chunking ? response.data.chunks! : response.data.text!;\n }\n\n async scrape(url: string): Promise<ScrapeResult> {\n // Always request all formats for consistent, predictable results\n const request: ScrapeRequest = { \n url, \n formats: ['markdown', 'html', 'links', 'extract', 'metadata'] \n };\n const response = await this.httpClient.dataScrape(this.projectId, request);\n const data = response.data;\n \n // Transform to guaranteed structure for better DX\n return {\n markdown: data.markdown || '',\n html: data.html || '',\n metadata: {\n title: data.metadata?.title || '',\n description: data.metadata?.description || '',\n url: data.metadata?.url || url,\n domain: data.metadata?.domain || new URL(url).hostname,\n favicon: data.metadata?.favicon,\n image: data.metadata?.image,\n author: data.metadata?.author,\n publishedTime: data.metadata?.publishedTime,\n modifiedTime: data.metadata?.modifiedTime,\n type: data.metadata?.type,\n siteName: data.metadata?.siteName,\n locale: data.metadata?.locale,\n keywords: data.metadata?.keywords || []\n },\n links: data.links || [],\n extract: {\n title: data.extract?.title || data.metadata?.title || '',\n description: data.extract?.description || data.metadata?.description || '',\n headings: data.extract?.headings || [],\n text: data.extract?.text || data.markdown || ''\n }\n };\n }\n\n async screenshot(\n url: string, \n options: { fullPage?: boolean; width?: number; height?: number } = {}\n ): Promise<string> {\n const request: ScreenshotRequest = { url, ...options };\n const response = await this.httpClient.dataScreenshot(this.projectId, request);\n return response.data.url;\n }\n\n async fetch(request: FetchRequest): Promise<FetchResponse> {\n const response = await this.httpClient.dataFetch(this.projectId, request);\n \n // Type guard to ensure we're returning FetchResponse for sync requests\n if ('status' in response.data && 'headers' in response.data) {\n return response.data as FetchResponse;\n }\n \n throw new BlinkDataError('Unexpected response format from fetch endpoint');\n }\n\n async fetchAsync(request: Omit<FetchRequest, 'async'>): Promise<AsyncFetchResponse> {\n const asyncRequest: FetchRequest = { ...request, async: true };\n const response = await this.httpClient.dataFetch(this.projectId, asyncRequest);\n \n // Type guard to ensure we're returning AsyncFetchResponse for async requests\n if ('status' in response.data && response.data.status === 'triggered') {\n return response.data as AsyncFetchResponse;\n }\n \n throw new BlinkDataError('Unexpected response format from async fetch endpoint');\n }\n} ","/**\n * Blink Client - Main SDK entry point\n * Factory function and client class for the Blink SDK\n */\n\nimport type { BlinkClientConfig } from '@blink/core'\nimport { HttpClient } from '@blink/core'\nimport { BlinkAuth } from './auth'\nimport { BlinkDatabase } from './database'\nimport { BlinkStorageImpl } from './storage'\nimport { BlinkAIImpl } from './ai'\nimport { BlinkDataImpl, type BlinkData } from './data'\nimport type { BlinkStorage, BlinkAI } from '@blink/core'\n\nexport interface BlinkClient {\n auth: BlinkAuth\n db: BlinkDatabase\n storage: BlinkStorage\n ai: BlinkAI\n data: BlinkData\n}\n\nexport class BlinkClientImpl implements BlinkClient {\n public auth: BlinkAuth\n public db: BlinkDatabase\n public storage: BlinkStorage\n public ai: BlinkAI\n public data: BlinkData\n private httpClient: HttpClient\n\n constructor(config: BlinkClientConfig) {\n // Initialize auth module\n this.auth = new BlinkAuth(config)\n\n // Initialize HTTP client with intelligent token management\n this.httpClient = new HttpClient(\n config, \n () => this.auth.getToken(),\n () => this.auth.getValidToken()\n )\n\n // Initialize database module\n this.db = new BlinkDatabase(this.httpClient)\n\n // Initialize storage module\n this.storage = new BlinkStorageImpl(this.httpClient)\n\n // Initialize AI module\n this.ai = new BlinkAIImpl(this.httpClient)\n\n // Initialize data module\n this.data = new BlinkDataImpl(this.httpClient, config.projectId)\n }\n}\n\n/**\n * Create a new Blink client instance\n */\nexport function createClient(config: BlinkClientConfig): BlinkClient {\n // Validate required configuration\n if (!config.projectId) {\n throw new Error('projectId is required')\n }\n\n // Set default values\n const clientConfig: BlinkClientConfig = {\n authRequired: true,\n ...config,\n }\n\n return new BlinkClientImpl(clientConfig)\n} "]}
|