@blinkdotnew/dev-sdk 2.1.1 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +9 -163
- package/dist/index.d.ts +9 -163
- package/dist/index.js +140 -307
- package/dist/index.mjs +141 -305
- package/package.json +3 -5
package/dist/index.mjs
CHANGED
|
@@ -5,33 +5,6 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
5
5
|
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
6
|
});
|
|
7
7
|
|
|
8
|
-
// ../core/src/platform.ts
|
|
9
|
-
function detectPlatform() {
|
|
10
|
-
if (typeof Deno !== "undefined") {
|
|
11
|
-
return "deno";
|
|
12
|
-
}
|
|
13
|
-
if (typeof process !== "undefined" && process.versions?.node) {
|
|
14
|
-
if (typeof navigator !== "undefined" && navigator.product === "ReactNative") {
|
|
15
|
-
return "react-native";
|
|
16
|
-
}
|
|
17
|
-
return "node";
|
|
18
|
-
}
|
|
19
|
-
if (typeof navigator !== "undefined" && navigator.product === "ReactNative") {
|
|
20
|
-
return "react-native";
|
|
21
|
-
}
|
|
22
|
-
if (typeof window !== "undefined" && typeof document !== "undefined") {
|
|
23
|
-
return "web";
|
|
24
|
-
}
|
|
25
|
-
return "node";
|
|
26
|
-
}
|
|
27
|
-
var platform = detectPlatform();
|
|
28
|
-
var isWeb = platform === "web";
|
|
29
|
-
var isReactNative = platform === "react-native";
|
|
30
|
-
var isNode = platform === "node";
|
|
31
|
-
var isDeno = platform === "deno";
|
|
32
|
-
var isBrowser = isWeb || isReactNative;
|
|
33
|
-
var isServer = isNode || isDeno;
|
|
34
|
-
|
|
35
8
|
// ../core/src/storage-adapter.ts
|
|
36
9
|
var WebStorageAdapter = class {
|
|
37
10
|
getItem(key) {
|
|
@@ -117,9 +90,6 @@ var NoOpStorageAdapter = class {
|
|
|
117
90
|
}
|
|
118
91
|
};
|
|
119
92
|
function getDefaultStorageAdapter() {
|
|
120
|
-
if (isDeno) {
|
|
121
|
-
return new NoOpStorageAdapter();
|
|
122
|
-
}
|
|
123
93
|
if (typeof window !== "undefined" && typeof localStorage !== "undefined") {
|
|
124
94
|
try {
|
|
125
95
|
localStorage.setItem("__test__", "test");
|
|
@@ -131,6 +101,28 @@ function getDefaultStorageAdapter() {
|
|
|
131
101
|
return new NoOpStorageAdapter();
|
|
132
102
|
}
|
|
133
103
|
|
|
104
|
+
// ../core/src/platform.ts
|
|
105
|
+
function detectPlatform() {
|
|
106
|
+
if (typeof process !== "undefined" && process.versions?.node) {
|
|
107
|
+
if (typeof navigator !== "undefined" && navigator.product === "ReactNative") {
|
|
108
|
+
return "react-native";
|
|
109
|
+
}
|
|
110
|
+
return "node";
|
|
111
|
+
}
|
|
112
|
+
if (typeof navigator !== "undefined" && navigator.product === "ReactNative") {
|
|
113
|
+
return "react-native";
|
|
114
|
+
}
|
|
115
|
+
if (typeof window !== "undefined" && typeof document !== "undefined") {
|
|
116
|
+
return "web";
|
|
117
|
+
}
|
|
118
|
+
return "node";
|
|
119
|
+
}
|
|
120
|
+
var platform = detectPlatform();
|
|
121
|
+
var isWeb = platform === "web";
|
|
122
|
+
var isReactNative = platform === "react-native";
|
|
123
|
+
var isNode = platform === "node";
|
|
124
|
+
var isBrowser = isWeb || isReactNative;
|
|
125
|
+
|
|
134
126
|
// ../core/src/types.ts
|
|
135
127
|
var BlinkError = class extends Error {
|
|
136
128
|
constructor(message, code, status, details) {
|
|
@@ -394,44 +386,17 @@ function convertKeysToCamelCase(obj) {
|
|
|
394
386
|
return converted;
|
|
395
387
|
}
|
|
396
388
|
var HttpClient = class {
|
|
397
|
-
authUrl
|
|
398
|
-
coreUrl
|
|
389
|
+
authUrl;
|
|
390
|
+
coreUrl;
|
|
399
391
|
projectId;
|
|
400
|
-
publishableKey;
|
|
401
|
-
secretKey;
|
|
402
|
-
// Permanent, non-expiring key (like Stripe's sk_live_...)
|
|
403
392
|
getToken;
|
|
404
393
|
getValidToken;
|
|
405
394
|
constructor(config, getToken, getValidToken) {
|
|
406
395
|
this.projectId = config.projectId;
|
|
407
|
-
this.publishableKey = config.publishableKey;
|
|
408
|
-
this.secretKey = config.secretKey || config.serviceToken;
|
|
409
396
|
this.getToken = getToken;
|
|
410
397
|
this.getValidToken = getValidToken;
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
if (method !== "GET" && method !== "POST") return false;
|
|
414
|
-
if (path.includes("/api/analytics/")) return true;
|
|
415
|
-
if (path.includes("/api/storage/")) return true;
|
|
416
|
-
if (path.includes("/api/db/") && path.includes("/rest/v1/")) return method === "GET";
|
|
417
|
-
return false;
|
|
418
|
-
}
|
|
419
|
-
shouldSkipSecretKey(url) {
|
|
420
|
-
try {
|
|
421
|
-
const parsed = new URL(url);
|
|
422
|
-
return parsed.hostname.endsWith(".functions.blink.new");
|
|
423
|
-
} catch {
|
|
424
|
-
return false;
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
getAuthorizationHeader(url, token) {
|
|
428
|
-
if (this.secretKey && !this.shouldSkipSecretKey(url)) {
|
|
429
|
-
return `Bearer ${this.secretKey}`;
|
|
430
|
-
}
|
|
431
|
-
if (token) {
|
|
432
|
-
return `Bearer ${token}`;
|
|
433
|
-
}
|
|
434
|
-
return null;
|
|
398
|
+
this.authUrl = config.auth?.authUrl ?? "https://blink.new";
|
|
399
|
+
this.coreUrl = config.auth?.coreUrl ?? "https://dev.core.blink.new";
|
|
435
400
|
}
|
|
436
401
|
/**
|
|
437
402
|
* Make an authenticated request to the Blink API
|
|
@@ -439,23 +404,19 @@ var HttpClient = class {
|
|
|
439
404
|
async request(path, options = {}) {
|
|
440
405
|
const url = this.buildUrl(path, options.searchParams);
|
|
441
406
|
const token = this.getValidToken ? await this.getValidToken() : this.getToken();
|
|
442
|
-
const method = options.method || "GET";
|
|
443
407
|
const headers = {
|
|
444
408
|
"Content-Type": "application/json",
|
|
445
409
|
...options.headers
|
|
446
410
|
};
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
headers.Authorization = auth;
|
|
450
|
-
} else if (this.publishableKey && !headers["x-blink-publishable-key"] && this.shouldAttachPublishableKey(path, method)) {
|
|
451
|
-
headers["x-blink-publishable-key"] = this.publishableKey;
|
|
411
|
+
if (token) {
|
|
412
|
+
headers.Authorization = `Bearer ${token}`;
|
|
452
413
|
}
|
|
453
414
|
const requestInit = {
|
|
454
|
-
method,
|
|
415
|
+
method: options.method || "GET",
|
|
455
416
|
headers,
|
|
456
417
|
signal: options.signal
|
|
457
418
|
};
|
|
458
|
-
if (options.body && method !== "GET") {
|
|
419
|
+
if (options.body && options.method !== "GET") {
|
|
459
420
|
requestInit.body = typeof options.body === "string" ? options.body : JSON.stringify(options.body);
|
|
460
421
|
}
|
|
461
422
|
try {
|
|
@@ -609,12 +570,12 @@ var HttpClient = class {
|
|
|
609
570
|
throw new BlinkValidationError("Unsupported file type");
|
|
610
571
|
}
|
|
611
572
|
formData.append("path", filePath);
|
|
573
|
+
if (options.upsert !== void 0) {
|
|
574
|
+
formData.append("options", JSON.stringify({ upsert: options.upsert }));
|
|
575
|
+
}
|
|
612
576
|
const headers = {};
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
headers.Authorization = auth;
|
|
616
|
-
} else if (this.publishableKey && path.includes("/api/storage/") && !headers["x-blink-publishable-key"]) {
|
|
617
|
-
headers["x-blink-publishable-key"] = this.publishableKey;
|
|
577
|
+
if (token) {
|
|
578
|
+
headers.Authorization = `Bearer ${token}`;
|
|
618
579
|
}
|
|
619
580
|
try {
|
|
620
581
|
if (typeof XMLHttpRequest !== "undefined" && options.onProgress) {
|
|
@@ -715,7 +676,7 @@ var HttpClient = class {
|
|
|
715
676
|
});
|
|
716
677
|
}
|
|
717
678
|
/**
|
|
718
|
-
* Stream AI text generation
|
|
679
|
+
* Stream AI text generation with Vercel AI SDK data stream format
|
|
719
680
|
*/
|
|
720
681
|
async streamAiText(prompt, options = {}, onChunk) {
|
|
721
682
|
const url = this.buildUrl(`/api/ai/${this.projectId}/text`);
|
|
@@ -723,8 +684,9 @@ var HttpClient = class {
|
|
|
723
684
|
const headers = {
|
|
724
685
|
"Content-Type": "application/json"
|
|
725
686
|
};
|
|
726
|
-
|
|
727
|
-
|
|
687
|
+
if (token) {
|
|
688
|
+
headers.Authorization = `Bearer ${token}`;
|
|
689
|
+
}
|
|
728
690
|
const body = {
|
|
729
691
|
prompt,
|
|
730
692
|
stream: true,
|
|
@@ -744,7 +706,7 @@ var HttpClient = class {
|
|
|
744
706
|
if (!response.body) {
|
|
745
707
|
throw new BlinkNetworkError("No response body for streaming");
|
|
746
708
|
}
|
|
747
|
-
return this.
|
|
709
|
+
return this.parseDataStream(response.body, onChunk);
|
|
748
710
|
} catch (error) {
|
|
749
711
|
if (error instanceof BlinkError) {
|
|
750
712
|
throw error;
|
|
@@ -769,7 +731,7 @@ var HttpClient = class {
|
|
|
769
731
|
});
|
|
770
732
|
}
|
|
771
733
|
/**
|
|
772
|
-
* Stream AI object generation
|
|
734
|
+
* Stream AI object generation with Vercel AI SDK data stream format
|
|
773
735
|
*/
|
|
774
736
|
async streamAiObject(prompt, options = {}, onPartial) {
|
|
775
737
|
const url = this.buildUrl(`/api/ai/${this.projectId}/object`);
|
|
@@ -777,8 +739,9 @@ var HttpClient = class {
|
|
|
777
739
|
const headers = {
|
|
778
740
|
"Content-Type": "application/json"
|
|
779
741
|
};
|
|
780
|
-
|
|
781
|
-
|
|
742
|
+
if (token) {
|
|
743
|
+
headers.Authorization = `Bearer ${token}`;
|
|
744
|
+
}
|
|
782
745
|
const body = {
|
|
783
746
|
prompt,
|
|
784
747
|
stream: true,
|
|
@@ -798,35 +761,7 @@ var HttpClient = class {
|
|
|
798
761
|
if (!response.body) {
|
|
799
762
|
throw new BlinkNetworkError("No response body for streaming");
|
|
800
763
|
}
|
|
801
|
-
|
|
802
|
-
const decoder = new TextDecoder();
|
|
803
|
-
let buffer = "";
|
|
804
|
-
let latestObject = {};
|
|
805
|
-
try {
|
|
806
|
-
while (true) {
|
|
807
|
-
const { done, value } = await reader.read();
|
|
808
|
-
if (done) break;
|
|
809
|
-
const chunk = decoder.decode(value, { stream: true });
|
|
810
|
-
buffer += chunk;
|
|
811
|
-
try {
|
|
812
|
-
const parsed = JSON.parse(buffer);
|
|
813
|
-
latestObject = parsed;
|
|
814
|
-
if (onPartial) {
|
|
815
|
-
onPartial(parsed);
|
|
816
|
-
}
|
|
817
|
-
} catch {
|
|
818
|
-
}
|
|
819
|
-
}
|
|
820
|
-
if (buffer) {
|
|
821
|
-
try {
|
|
822
|
-
latestObject = JSON.parse(buffer);
|
|
823
|
-
} catch {
|
|
824
|
-
}
|
|
825
|
-
}
|
|
826
|
-
return { object: latestObject };
|
|
827
|
-
} finally {
|
|
828
|
-
reader.releaseLock();
|
|
829
|
-
}
|
|
764
|
+
return this.parseDataStream(response.body, void 0, onPartial);
|
|
830
765
|
} catch (error) {
|
|
831
766
|
if (error instanceof BlinkError) {
|
|
832
767
|
throw error;
|
|
@@ -924,38 +859,6 @@ var HttpClient = class {
|
|
|
924
859
|
async dataSearch(projectId, request) {
|
|
925
860
|
return this.post(`/api/data/${projectId}/search`, request);
|
|
926
861
|
}
|
|
927
|
-
/**
|
|
928
|
-
* Connector requests
|
|
929
|
-
*/
|
|
930
|
-
formatProviderForPath(provider) {
|
|
931
|
-
return provider.replace("_", "-");
|
|
932
|
-
}
|
|
933
|
-
async connectorStatus(provider) {
|
|
934
|
-
return this.request(`/api/connectors/${this.formatProviderForPath(provider)}/${this.projectId}/status`, {
|
|
935
|
-
method: "GET"
|
|
936
|
-
});
|
|
937
|
-
}
|
|
938
|
-
async connectorExecute(provider, request) {
|
|
939
|
-
const path = request.method.startsWith("/") ? request.method : `/${request.method}`;
|
|
940
|
-
const url = `/api/connectors/${this.formatProviderForPath(provider)}/${this.projectId}${path}`;
|
|
941
|
-
const method = (request.http_method || "GET").toUpperCase();
|
|
942
|
-
if (method === "GET") {
|
|
943
|
-
return this.request(url, {
|
|
944
|
-
method: "GET",
|
|
945
|
-
searchParams: request.params
|
|
946
|
-
});
|
|
947
|
-
}
|
|
948
|
-
return this.request(url, {
|
|
949
|
-
method,
|
|
950
|
-
body: request.params || {}
|
|
951
|
-
});
|
|
952
|
-
}
|
|
953
|
-
async connectorSaveApiKey(provider, request) {
|
|
954
|
-
return this.request(`/api/connectors/${this.formatProviderForPath(provider)}/${this.projectId}/api-key`, {
|
|
955
|
-
method: "POST",
|
|
956
|
-
body: request
|
|
957
|
-
});
|
|
958
|
-
}
|
|
959
862
|
/**
|
|
960
863
|
* Realtime-specific requests
|
|
961
864
|
*/
|
|
@@ -1021,94 +924,93 @@ var HttpClient = class {
|
|
|
1021
924
|
}
|
|
1022
925
|
}
|
|
1023
926
|
/**
|
|
1024
|
-
* Parse Vercel AI SDK
|
|
1025
|
-
*
|
|
927
|
+
* Parse Vercel AI SDK data stream format
|
|
928
|
+
* Handles text chunks (0:"text"), partial objects (2:[...]), and metadata (d:, e:)
|
|
1026
929
|
*/
|
|
1027
|
-
async
|
|
930
|
+
async parseDataStream(body, onChunk, onPartial) {
|
|
1028
931
|
const reader = body.getReader();
|
|
1029
932
|
const decoder = new TextDecoder();
|
|
1030
|
-
const finalResult = {
|
|
1031
|
-
text: "",
|
|
1032
|
-
toolCalls: [],
|
|
1033
|
-
toolResults: [],
|
|
1034
|
-
sources: [],
|
|
1035
|
-
files: [],
|
|
1036
|
-
reasoning: []
|
|
1037
|
-
};
|
|
1038
933
|
let buffer = "";
|
|
934
|
+
let finalResult = {};
|
|
1039
935
|
try {
|
|
1040
936
|
while (true) {
|
|
1041
937
|
const { done, value } = await reader.read();
|
|
1042
938
|
if (done) break;
|
|
1043
939
|
buffer += decoder.decode(value, { stream: true });
|
|
1044
|
-
const lines = buffer.split(
|
|
940
|
+
const lines = buffer.split(/\r?\n/);
|
|
1045
941
|
buffer = lines.pop() || "";
|
|
1046
942
|
for (const line of lines) {
|
|
1047
943
|
if (!line.trim()) continue;
|
|
1048
|
-
if (line === "[DONE]") {
|
|
1049
|
-
continue;
|
|
1050
|
-
}
|
|
1051
|
-
if (!line.startsWith("data: ")) continue;
|
|
1052
944
|
try {
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
945
|
+
if (line.startsWith("f:")) {
|
|
946
|
+
const metadata = JSON.parse(line.slice(2));
|
|
947
|
+
finalResult.messageId = metadata.messageId;
|
|
948
|
+
} else if (line.startsWith("0:")) {
|
|
949
|
+
const textChunk = JSON.parse(line.slice(2));
|
|
950
|
+
if (onChunk) {
|
|
951
|
+
onChunk(textChunk);
|
|
952
|
+
}
|
|
953
|
+
finalResult.text = (finalResult.text || "") + textChunk;
|
|
954
|
+
} else if (line.startsWith("2:")) {
|
|
955
|
+
const data = JSON.parse(line.slice(2));
|
|
956
|
+
if (Array.isArray(data) && data.length > 0) {
|
|
957
|
+
const item = data[0];
|
|
958
|
+
if (typeof item === "string") {
|
|
959
|
+
finalResult.status = item;
|
|
960
|
+
} else if (typeof item === "object") {
|
|
961
|
+
if (onPartial) {
|
|
962
|
+
onPartial(item);
|
|
963
|
+
}
|
|
964
|
+
finalResult.object = item;
|
|
1062
965
|
}
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
966
|
+
}
|
|
967
|
+
} else if (line.startsWith("d:")) {
|
|
968
|
+
const metadata = JSON.parse(line.slice(2));
|
|
969
|
+
if (metadata.usage) {
|
|
970
|
+
finalResult.usage = metadata.usage;
|
|
971
|
+
}
|
|
972
|
+
if (metadata.finishReason) {
|
|
973
|
+
finalResult.finishReason = metadata.finishReason;
|
|
974
|
+
}
|
|
975
|
+
} else if (line.startsWith("e:")) {
|
|
976
|
+
const errorData = JSON.parse(line.slice(2));
|
|
977
|
+
finalResult.error = errorData;
|
|
978
|
+
}
|
|
979
|
+
} catch (error) {
|
|
980
|
+
console.warn("Failed to parse stream line:", line, error);
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
if (buffer.trim()) {
|
|
985
|
+
try {
|
|
986
|
+
if (buffer.startsWith("0:")) {
|
|
987
|
+
const textChunk = JSON.parse(buffer.slice(2));
|
|
988
|
+
if (onChunk) {
|
|
989
|
+
onChunk(textChunk);
|
|
990
|
+
}
|
|
991
|
+
finalResult.text = (finalResult.text || "") + textChunk;
|
|
992
|
+
} else if (buffer.startsWith("2:")) {
|
|
993
|
+
const data = JSON.parse(buffer.slice(2));
|
|
994
|
+
if (Array.isArray(data) && data.length > 0) {
|
|
995
|
+
const item = data[0];
|
|
996
|
+
if (typeof item === "object") {
|
|
997
|
+
if (onPartial) {
|
|
998
|
+
onPartial(item);
|
|
1066
999
|
}
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
case "tool-result":
|
|
1078
|
-
finalResult.toolResults.push({
|
|
1079
|
-
toolCallId: part.toolCallId,
|
|
1080
|
-
toolName: part.toolName,
|
|
1081
|
-
result: part.result
|
|
1082
|
-
});
|
|
1083
|
-
break;
|
|
1084
|
-
case "source-url":
|
|
1085
|
-
finalResult.sources.push({
|
|
1086
|
-
id: part.id,
|
|
1087
|
-
url: part.url,
|
|
1088
|
-
title: part.title
|
|
1089
|
-
});
|
|
1090
|
-
break;
|
|
1091
|
-
case "file":
|
|
1092
|
-
finalResult.files.push(part.file);
|
|
1093
|
-
break;
|
|
1094
|
-
case "reasoning":
|
|
1095
|
-
finalResult.reasoning.push(part.content);
|
|
1096
|
-
break;
|
|
1097
|
-
case "finish":
|
|
1098
|
-
finalResult.finishReason = part.finishReason;
|
|
1099
|
-
finalResult.usage = part.usage;
|
|
1100
|
-
if (part.response) finalResult.response = part.response;
|
|
1101
|
-
break;
|
|
1102
|
-
case "error":
|
|
1103
|
-
finalResult.error = part.error;
|
|
1104
|
-
throw new Error(part.error);
|
|
1105
|
-
case "data":
|
|
1106
|
-
if (!finalResult.customData) finalResult.customData = [];
|
|
1107
|
-
finalResult.customData.push(part.value);
|
|
1108
|
-
break;
|
|
1000
|
+
finalResult.object = item;
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
} else if (buffer.startsWith("d:")) {
|
|
1004
|
+
const metadata = JSON.parse(buffer.slice(2));
|
|
1005
|
+
if (metadata.usage) {
|
|
1006
|
+
finalResult.usage = metadata.usage;
|
|
1007
|
+
}
|
|
1008
|
+
if (metadata.finishReason) {
|
|
1009
|
+
finalResult.finishReason = metadata.finishReason;
|
|
1109
1010
|
}
|
|
1110
|
-
} catch (e) {
|
|
1111
1011
|
}
|
|
1012
|
+
} catch (error) {
|
|
1013
|
+
console.warn("Failed to parse final buffer:", buffer, error);
|
|
1112
1014
|
}
|
|
1113
1015
|
}
|
|
1114
1016
|
return finalResult;
|
|
@@ -1276,13 +1178,13 @@ var BlinkAuth = class {
|
|
|
1276
1178
|
mode: "managed",
|
|
1277
1179
|
// Default mode
|
|
1278
1180
|
authUrl: "https://blink.new",
|
|
1279
|
-
coreUrl: "https://core.blink.new",
|
|
1181
|
+
coreUrl: "https://dev.core.blink.new",
|
|
1280
1182
|
detectSessionInUrl: true,
|
|
1281
1183
|
// Default to true for web compatibility
|
|
1282
1184
|
...config.auth
|
|
1283
1185
|
};
|
|
1284
1186
|
this.authUrl = this.authConfig.authUrl || "https://blink.new";
|
|
1285
|
-
this.coreUrl = this.authConfig.coreUrl || "https://core.blink.new";
|
|
1187
|
+
this.coreUrl = this.authConfig.coreUrl || "https://dev.core.blink.new";
|
|
1286
1188
|
const hostname = getLocationHostname();
|
|
1287
1189
|
if (hostname && this.authUrl === "https://blink.new" && (hostname === "localhost" || hostname === "127.0.0.1")) {
|
|
1288
1190
|
console.warn("\u26A0\uFE0F Using default authUrl in development. Set auth.authUrl to your app origin for headless auth endpoints to work.");
|
|
@@ -3035,11 +2937,6 @@ var BlinkAuth = class {
|
|
|
3035
2937
|
};
|
|
3036
2938
|
|
|
3037
2939
|
// src/database.ts
|
|
3038
|
-
function assertServerOnly(methodName) {
|
|
3039
|
-
if (typeof window !== "undefined") {
|
|
3040
|
-
throw new Error(`${methodName} is server-only. Use Blink CRUD methods (blink.db.<table>.*) instead.`);
|
|
3041
|
-
}
|
|
3042
|
-
}
|
|
3043
2940
|
function camelToSnake3(str) {
|
|
3044
2941
|
return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
|
|
3045
2942
|
}
|
|
@@ -3258,7 +3155,6 @@ var BlinkTable = class {
|
|
|
3258
3155
|
* Raw SQL query on this table (for advanced use cases)
|
|
3259
3156
|
*/
|
|
3260
3157
|
async sql(query, params) {
|
|
3261
|
-
assertServerOnly("blink.db.<table>.sql");
|
|
3262
3158
|
const response = await this.httpClient.dbSql(query, params);
|
|
3263
3159
|
return response.data;
|
|
3264
3160
|
}
|
|
@@ -3307,7 +3203,6 @@ var BlinkDatabase = class {
|
|
|
3307
3203
|
* Execute raw SQL query
|
|
3308
3204
|
*/
|
|
3309
3205
|
async sql(query, params) {
|
|
3310
|
-
assertServerOnly("blink.db.sql");
|
|
3311
3206
|
const response = await this.httpClient.dbSql(query, params);
|
|
3312
3207
|
return response.data;
|
|
3313
3208
|
}
|
|
@@ -3315,7 +3210,6 @@ var BlinkDatabase = class {
|
|
|
3315
3210
|
* Execute batch SQL operations
|
|
3316
3211
|
*/
|
|
3317
3212
|
async batch(statements, mode = "write") {
|
|
3318
|
-
assertServerOnly("blink.db.batch");
|
|
3319
3213
|
const response = await this.httpClient.dbBatch(statements, mode);
|
|
3320
3214
|
return response.data;
|
|
3321
3215
|
}
|
|
@@ -3378,6 +3272,7 @@ var BlinkStorageImpl = class {
|
|
|
3378
3272
|
correctedPath,
|
|
3379
3273
|
// Use corrected path with proper extension
|
|
3380
3274
|
{
|
|
3275
|
+
upsert: options.upsert,
|
|
3381
3276
|
onProgress: options.onProgress,
|
|
3382
3277
|
contentType: detectedContentType
|
|
3383
3278
|
// Pass detected content type
|
|
@@ -3397,7 +3292,7 @@ var BlinkStorageImpl = class {
|
|
|
3397
3292
|
if (error instanceof Error && "status" in error) {
|
|
3398
3293
|
const status = error.status;
|
|
3399
3294
|
if (status === 409) {
|
|
3400
|
-
throw new BlinkStorageError("File already exists.", 409);
|
|
3295
|
+
throw new BlinkStorageError("File already exists. Set upsert: true to overwrite.", 409);
|
|
3401
3296
|
}
|
|
3402
3297
|
if (status === 400) {
|
|
3403
3298
|
throw new BlinkStorageError("Invalid request parameters", 400);
|
|
@@ -3442,6 +3337,7 @@ var BlinkStorageImpl = class {
|
|
|
3442
3337
|
detectedContentType
|
|
3443
3338
|
};
|
|
3444
3339
|
} catch (error) {
|
|
3340
|
+
console.warn("File type detection failed, using original path:", error);
|
|
3445
3341
|
return {
|
|
3446
3342
|
correctedPath: originalPath,
|
|
3447
3343
|
detectedContentType: "application/octet-stream"
|
|
@@ -3831,7 +3727,13 @@ var BlinkAIImpl = class {
|
|
|
3831
3727
|
options.prompt || "",
|
|
3832
3728
|
requestBody
|
|
3833
3729
|
);
|
|
3834
|
-
|
|
3730
|
+
if (response.data?.result) {
|
|
3731
|
+
return response.data.result;
|
|
3732
|
+
} else if (response.data?.text) {
|
|
3733
|
+
return response.data;
|
|
3734
|
+
} else {
|
|
3735
|
+
throw new BlinkAIError("Invalid response format: missing text");
|
|
3736
|
+
}
|
|
3835
3737
|
} catch (error) {
|
|
3836
3738
|
if (error instanceof BlinkAIError) {
|
|
3837
3739
|
throw error;
|
|
@@ -3900,14 +3802,9 @@ var BlinkAIImpl = class {
|
|
|
3900
3802
|
);
|
|
3901
3803
|
return {
|
|
3902
3804
|
text: result.text || "",
|
|
3903
|
-
finishReason:
|
|
3805
|
+
finishReason: "stop",
|
|
3904
3806
|
usage: result.usage,
|
|
3905
|
-
|
|
3906
|
-
toolResults: result.toolResults,
|
|
3907
|
-
sources: result.sources,
|
|
3908
|
-
files: result.files,
|
|
3909
|
-
reasoningDetails: result.reasoning,
|
|
3910
|
-
response: result.response
|
|
3807
|
+
...result
|
|
3911
3808
|
};
|
|
3912
3809
|
} catch (error) {
|
|
3913
3810
|
if (error instanceof BlinkAIError) {
|
|
@@ -3986,7 +3883,13 @@ var BlinkAIImpl = class {
|
|
|
3986
3883
|
signal: options.signal
|
|
3987
3884
|
}
|
|
3988
3885
|
);
|
|
3989
|
-
|
|
3886
|
+
if (response.data?.result) {
|
|
3887
|
+
return response.data.result;
|
|
3888
|
+
} else if (response.data?.object) {
|
|
3889
|
+
return response.data;
|
|
3890
|
+
} else {
|
|
3891
|
+
throw new BlinkAIError("Invalid response format: missing object");
|
|
3892
|
+
}
|
|
3990
3893
|
} catch (error) {
|
|
3991
3894
|
if (error instanceof BlinkAIError) {
|
|
3992
3895
|
throw error;
|
|
@@ -4048,7 +3951,8 @@ var BlinkAIImpl = class {
|
|
|
4048
3951
|
return {
|
|
4049
3952
|
object: result.object || {},
|
|
4050
3953
|
finishReason: "stop",
|
|
4051
|
-
usage: result.usage
|
|
3954
|
+
usage: result.usage,
|
|
3955
|
+
...result
|
|
4052
3956
|
};
|
|
4053
3957
|
} catch (error) {
|
|
4054
3958
|
if (error instanceof BlinkAIError) {
|
|
@@ -4898,7 +4802,7 @@ var BlinkRealtimeChannel = class {
|
|
|
4898
4802
|
return new Promise((resolve, reject) => {
|
|
4899
4803
|
try {
|
|
4900
4804
|
const httpClient = this.httpClient;
|
|
4901
|
-
const coreUrl = httpClient.coreUrl || "https://core.blink.new";
|
|
4805
|
+
const coreUrl = httpClient.coreUrl || "https://dev.core.blink.new";
|
|
4902
4806
|
const baseUrl = coreUrl.replace("https://", "wss://").replace("http://", "ws://");
|
|
4903
4807
|
const wsUrl = `${baseUrl}?project_id=${this.projectId}`;
|
|
4904
4808
|
console.log(`\u{1F517} Attempting WebSocket connection to: ${wsUrl}`);
|
|
@@ -5367,6 +5271,7 @@ var BlinkAnalyticsImpl = class {
|
|
|
5367
5271
|
} catch (error) {
|
|
5368
5272
|
this.queue = [...events, ...this.queue];
|
|
5369
5273
|
this.persistQueue();
|
|
5274
|
+
console.error("Failed to send analytics events:", error);
|
|
5370
5275
|
}
|
|
5371
5276
|
if (this.queue.length > 0) {
|
|
5372
5277
|
this.timer = setTimeout(() => this.flush(), BATCH_TIMEOUT);
|
|
@@ -5557,64 +5462,6 @@ var BlinkAnalyticsImpl = class {
|
|
|
5557
5462
|
}
|
|
5558
5463
|
};
|
|
5559
5464
|
|
|
5560
|
-
// src/connectors.ts
|
|
5561
|
-
var BlinkConnectorsImpl = class {
|
|
5562
|
-
constructor(httpClient) {
|
|
5563
|
-
this.httpClient = httpClient;
|
|
5564
|
-
}
|
|
5565
|
-
async status(provider, options) {
|
|
5566
|
-
const response = await this.httpClient.connectorStatus(provider);
|
|
5567
|
-
return response.data;
|
|
5568
|
-
}
|
|
5569
|
-
async execute(provider, request) {
|
|
5570
|
-
const response = await this.httpClient.connectorExecute(provider, request);
|
|
5571
|
-
return response.data;
|
|
5572
|
-
}
|
|
5573
|
-
async saveApiKey(provider, request) {
|
|
5574
|
-
const response = await this.httpClient.connectorSaveApiKey(provider, request);
|
|
5575
|
-
return response.data;
|
|
5576
|
-
}
|
|
5577
|
-
};
|
|
5578
|
-
|
|
5579
|
-
// src/functions.ts
|
|
5580
|
-
var BlinkFunctionsImpl = class {
|
|
5581
|
-
httpClient;
|
|
5582
|
-
projectId;
|
|
5583
|
-
constructor(httpClient, projectId, _getToken) {
|
|
5584
|
-
this.httpClient = httpClient;
|
|
5585
|
-
this.projectId = projectId;
|
|
5586
|
-
}
|
|
5587
|
-
/**
|
|
5588
|
-
* Get the project suffix from the full project ID.
|
|
5589
|
-
* Project IDs are formatted as: prj_xxxxx
|
|
5590
|
-
* The suffix is the last 8 characters used in function URLs.
|
|
5591
|
-
*/
|
|
5592
|
-
getProjectSuffix() {
|
|
5593
|
-
return this.projectId.slice(-8);
|
|
5594
|
-
}
|
|
5595
|
-
/**
|
|
5596
|
-
* Build the full function URL
|
|
5597
|
-
*/
|
|
5598
|
-
buildFunctionUrl(functionSlug, searchParams) {
|
|
5599
|
-
const suffix = this.getProjectSuffix();
|
|
5600
|
-
const baseUrl = `https://${suffix}--${functionSlug}.functions.blink.new`;
|
|
5601
|
-
if (!searchParams || Object.keys(searchParams).length === 0) {
|
|
5602
|
-
return baseUrl;
|
|
5603
|
-
}
|
|
5604
|
-
const url = new URL(baseUrl);
|
|
5605
|
-
Object.entries(searchParams).forEach(([key, value]) => {
|
|
5606
|
-
url.searchParams.set(key, value);
|
|
5607
|
-
});
|
|
5608
|
-
return url.toString();
|
|
5609
|
-
}
|
|
5610
|
-
async invoke(functionSlug, options = {}) {
|
|
5611
|
-
const { method = "POST", body, headers = {}, searchParams } = options;
|
|
5612
|
-
const url = this.buildFunctionUrl(functionSlug, searchParams);
|
|
5613
|
-
const res = await this.httpClient.request(url, { method, body, headers });
|
|
5614
|
-
return { data: res.data, status: res.status, headers: res.headers };
|
|
5615
|
-
}
|
|
5616
|
-
};
|
|
5617
|
-
|
|
5618
5465
|
// src/client.ts
|
|
5619
5466
|
var BlinkClientImpl = class {
|
|
5620
5467
|
auth;
|
|
@@ -5625,13 +5472,8 @@ var BlinkClientImpl = class {
|
|
|
5625
5472
|
realtime;
|
|
5626
5473
|
notifications;
|
|
5627
5474
|
analytics;
|
|
5628
|
-
connectors;
|
|
5629
|
-
functions;
|
|
5630
5475
|
httpClient;
|
|
5631
5476
|
constructor(config) {
|
|
5632
|
-
if ((config.secretKey || config.serviceToken) && isBrowser) {
|
|
5633
|
-
throw new Error("secretKey/serviceToken is server-only. Do not provide it in browser/React Native clients.");
|
|
5634
|
-
}
|
|
5635
5477
|
this.auth = new BlinkAuth(config);
|
|
5636
5478
|
this.httpClient = new HttpClient(
|
|
5637
5479
|
config,
|
|
@@ -5645,12 +5487,6 @@ var BlinkClientImpl = class {
|
|
|
5645
5487
|
this.realtime = new BlinkRealtimeImpl(this.httpClient, config.projectId);
|
|
5646
5488
|
this.notifications = new BlinkNotificationsImpl(this.httpClient);
|
|
5647
5489
|
this.analytics = new BlinkAnalyticsImpl(this.httpClient, config.projectId);
|
|
5648
|
-
this.connectors = new BlinkConnectorsImpl(this.httpClient);
|
|
5649
|
-
this.functions = new BlinkFunctionsImpl(
|
|
5650
|
-
this.httpClient,
|
|
5651
|
-
config.projectId,
|
|
5652
|
-
() => this.auth.getValidToken()
|
|
5653
|
-
);
|
|
5654
5490
|
this.auth.onAuthStateChanged((state) => {
|
|
5655
5491
|
if (state.isAuthenticated && state.user) {
|
|
5656
5492
|
this.analytics.setUserId(state.user.id);
|
|
@@ -5669,6 +5505,6 @@ function createClient(config) {
|
|
|
5669
5505
|
return new BlinkClientImpl(config);
|
|
5670
5506
|
}
|
|
5671
5507
|
|
|
5672
|
-
export { AsyncStorageAdapter, BlinkAIImpl, BlinkAnalyticsImpl,
|
|
5508
|
+
export { AsyncStorageAdapter, BlinkAIImpl, BlinkAnalyticsImpl, BlinkDataImpl, BlinkDatabase, BlinkRealtimeChannel, BlinkRealtimeImpl, BlinkStorageImpl, BlinkTable, NoOpStorageAdapter, WebStorageAdapter, createClient, getDefaultStorageAdapter, isBrowser, isNode, isReactNative, isWeb, platform };
|
|
5673
5509
|
//# sourceMappingURL=index.mjs.map
|
|
5674
5510
|
//# sourceMappingURL=index.mjs.map
|