@lumi.new/sdk 0.4.3-beta.1 → 0.4.3-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,22 +1,38 @@
1
1
  import { FetchOptions } from 'ofetch';
2
2
 
3
- declare enum ReceiveMessageType {
4
- /** 网页加载完成 */
5
- READY = "lumi-ready",
6
- /** 登录成功 */
7
- SIGN_IN = "lumi-sign-in",
8
- /** 登录失败 */
9
- SIGN_IN_FAILED = "lumi-sign-in-failed"
3
+ /** API 响应 */
4
+ interface ApiResponse<T> {
5
+ code: number;
6
+ message: string;
7
+ data: T;
10
8
  }
11
- declare enum SendMessageType {
12
- /** 初始化信息 */
13
- INIT = "lumi-init"
9
+ /** 分页数据 */
10
+ interface PaginationData<T> {
11
+ total: number;
12
+ list: T[];
13
+ }
14
+ /** 流式响应 */
15
+ type ApiStreamResponse = ReadableStream<Uint8Array>;
16
+
17
+ /** 用户信息 */
18
+ interface User {
19
+ userId: string;
20
+ email: string;
21
+ userName: string;
22
+ userRole: 'ADMIN' | 'USER';
23
+ createdTime: string;
24
+ }
25
+ /** 带令牌的用户信息 */
26
+ interface UserWithToken extends User {
27
+ userToken: string;
28
+ }
29
+
30
+ /** 实体基类 */
31
+ interface Entity extends Record<string, any> {
32
+ id: string;
14
33
  }
15
- /** 第三方登录提供商 */
16
- type OAuthProvider = 'google';
17
- /** 验证码类型 */
18
- type OtpType = 'register' | 'resetPassword';
19
34
 
35
+ /** 存储适配器 */
20
36
  interface StorageAdapter {
21
37
  storage: {
22
38
  getItem: (key: string) => string | null;
@@ -25,18 +41,54 @@ interface StorageAdapter {
25
41
  };
26
42
  listen: (callback: (key: string | null, value: string | null) => void) => () => void;
27
43
  }
44
+ /** 客户端配置 */
45
+ interface LumiClientConfig {
46
+ projectId: string;
47
+ apiBaseUrl: string;
48
+ authOrigin: string;
49
+ storageAdapter: StorageAdapter;
50
+ authorization?: string;
51
+ }
28
52
 
29
- type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
30
-
31
- interface PaginationData<T> {
32
- total: number;
33
- list: T[];
53
+ /** 消息媒体 */
54
+ interface MessageMedia {
55
+ mimeType: string;
56
+ url: string;
57
+ }
58
+ /** AI 对话消息 */
59
+ interface Message {
60
+ role: 'system' | 'user' | 'assistant';
61
+ content: string;
62
+ medias?: MessageMedia[];
63
+ }
64
+ /** 文本生成结果 */
65
+ interface GenerateTextResult {
66
+ chatId: string;
67
+ content: string;
68
+ }
69
+ /** 图片生成结果 */
70
+ interface GenerateImageResult {
71
+ chatId: string;
72
+ messageId: string;
73
+ generationStatus: 'PROCESSING' | 'SUCCESS' | 'FAILED';
74
+ content?: string;
75
+ imageURL?: string;
76
+ }
77
+ /** 流式数据块 */
78
+ interface StreamChunk<T> {
79
+ event?: string;
80
+ data: T;
34
81
  }
35
- type ApiStreamResponse = ReadableStream<Uint8Array>;
36
82
 
37
- interface Entity extends Record<string, any> {
38
- id: string;
83
+ /** 文件上传结果 */
84
+ interface UploadItem {
85
+ fileName: string;
86
+ fileUrl?: string;
87
+ uploadError?: string;
39
88
  }
89
+
90
+ type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
91
+
40
92
  declare class EntityClient {
41
93
  #private;
42
94
  readonly entityName: string;
@@ -75,30 +127,6 @@ declare class FunctionsClient {
75
127
  invoke(functionName: string, options?: FetchOptions): Promise<any>;
76
128
  }
77
129
 
78
- interface MessageMedia {
79
- mimeType: string;
80
- url: string;
81
- }
82
- interface Message {
83
- role: 'system' | 'user' | 'assistant';
84
- content: string;
85
- medias?: MessageMedia[];
86
- }
87
- interface GenerateTextResult {
88
- chatId: string;
89
- content: string;
90
- }
91
- interface GenerateImageResult {
92
- chatId: string;
93
- messageId: string;
94
- generationStatus: 'PROCESSING' | 'SUCCESS' | 'FAILED';
95
- content?: string;
96
- imageURL?: string;
97
- }
98
- interface StreamChunk<T> {
99
- event?: string;
100
- data: T;
101
- }
102
130
  declare class AITool {
103
131
  #private;
104
132
  constructor(lumi: LumiClient);
@@ -137,11 +165,6 @@ declare class EmailTool {
137
165
  }): Promise<void>;
138
166
  }
139
167
 
140
- interface UploadItem {
141
- fileName: string;
142
- fileUrl?: string;
143
- uploadError?: string;
144
- }
145
168
  declare class FileTool {
146
169
  #private;
147
170
  constructor(lumi: LumiClient);
@@ -159,13 +182,6 @@ declare class ToolsClient {
159
182
  constructor(lumi: LumiClient);
160
183
  }
161
184
 
162
- interface LumiClientConfig {
163
- projectId: string;
164
- apiBaseUrl: string;
165
- authOrigin: string;
166
- storageAdapter: StorageAdapter;
167
- authorization?: string;
168
- }
169
185
  declare class LumiClient {
170
186
  config: LumiClientConfig;
171
187
  auth: LumiAuthClient;
@@ -176,36 +192,13 @@ declare class LumiClient {
176
192
  }
177
193
  declare function createClient(config: Optional<LumiClientConfig, 'storageAdapter'>): LumiClient;
178
194
 
179
- interface User {
180
- userId: string;
181
- email: string;
182
- userName: string;
183
- userRole: 'ADMIN' | 'USER';
184
- createdTime: string;
185
- }
186
- interface UserWithToken extends User {
187
- userToken: string;
188
- }
195
+ type OAuthProvider = 'google';
196
+ type OtpType = 'register' | 'resetPassword';
189
197
  interface MessageSignInData {
190
198
  projectId: string;
191
199
  accessToken: string;
192
200
  user: User;
193
201
  }
194
- type MessageDataReceive = {
195
- type: ReceiveMessageType.READY | ReceiveMessageType.SIGN_IN_FAILED;
196
- } | {
197
- type: ReceiveMessageType.SIGN_IN;
198
- data: MessageSignInData;
199
- };
200
- interface MessageInitData {
201
- projectId: string;
202
- icon: string | null;
203
- title: string | null;
204
- }
205
- interface MessageDataSend {
206
- type: SendMessageType.INIT;
207
- data: MessageInitData;
208
- }
209
202
  declare class LumiAuthClient {
210
203
  #private;
211
204
  constructor(lumi: LumiClient);
@@ -234,7 +227,7 @@ declare class LumiAuthClient {
234
227
  password: string;
235
228
  otp: string;
236
229
  userName?: string;
237
- }): Promise<void>;
230
+ }): Promise<MessageSignInData>;
238
231
  /** 重置密码 */
239
232
  resetPassword({ email, newPassword, otp, }: {
240
233
  email: string;
@@ -256,4 +249,4 @@ declare class LumiAuthClient {
256
249
  }) => void): () => void;
257
250
  }
258
251
 
259
- export { AITool, EmailTool, EntitiesClient, type Entity, EntityClient, FileTool, FunctionsClient, type GenerateImageResult, type GenerateTextResult, LumiAuthClient, LumiClient, type LumiClientConfig, type Message, type MessageDataReceive, type MessageDataSend, type MessageInitData, type MessageMedia, type MessageSignInData, type StreamChunk, ToolsClient, type UploadItem, type User, type UserWithToken, createClient };
252
+ export { AITool, type ApiResponse, type ApiStreamResponse, EmailTool, EntitiesClient, type Entity, EntityClient, FileTool, FunctionsClient, type GenerateImageResult, type GenerateTextResult, LumiAuthClient, LumiClient, type LumiClientConfig, type Message, type MessageMedia, type Optional, type PaginationData, type StorageAdapter, type StreamChunk, ToolsClient, type UploadItem, type User, type UserWithToken, createClient };
package/dist/index.d.ts CHANGED
@@ -1,22 +1,38 @@
1
1
  import { FetchOptions } from 'ofetch';
2
2
 
3
- declare enum ReceiveMessageType {
4
- /** 网页加载完成 */
5
- READY = "lumi-ready",
6
- /** 登录成功 */
7
- SIGN_IN = "lumi-sign-in",
8
- /** 登录失败 */
9
- SIGN_IN_FAILED = "lumi-sign-in-failed"
3
+ /** API 响应 */
4
+ interface ApiResponse<T> {
5
+ code: number;
6
+ message: string;
7
+ data: T;
10
8
  }
11
- declare enum SendMessageType {
12
- /** 初始化信息 */
13
- INIT = "lumi-init"
9
+ /** 分页数据 */
10
+ interface PaginationData<T> {
11
+ total: number;
12
+ list: T[];
13
+ }
14
+ /** 流式响应 */
15
+ type ApiStreamResponse = ReadableStream<Uint8Array>;
16
+
17
+ /** 用户信息 */
18
+ interface User {
19
+ userId: string;
20
+ email: string;
21
+ userName: string;
22
+ userRole: 'ADMIN' | 'USER';
23
+ createdTime: string;
24
+ }
25
+ /** 带令牌的用户信息 */
26
+ interface UserWithToken extends User {
27
+ userToken: string;
28
+ }
29
+
30
+ /** 实体基类 */
31
+ interface Entity extends Record<string, any> {
32
+ id: string;
14
33
  }
15
- /** 第三方登录提供商 */
16
- type OAuthProvider = 'google';
17
- /** 验证码类型 */
18
- type OtpType = 'register' | 'resetPassword';
19
34
 
35
+ /** 存储适配器 */
20
36
  interface StorageAdapter {
21
37
  storage: {
22
38
  getItem: (key: string) => string | null;
@@ -25,18 +41,54 @@ interface StorageAdapter {
25
41
  };
26
42
  listen: (callback: (key: string | null, value: string | null) => void) => () => void;
27
43
  }
44
+ /** 客户端配置 */
45
+ interface LumiClientConfig {
46
+ projectId: string;
47
+ apiBaseUrl: string;
48
+ authOrigin: string;
49
+ storageAdapter: StorageAdapter;
50
+ authorization?: string;
51
+ }
28
52
 
29
- type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
30
-
31
- interface PaginationData<T> {
32
- total: number;
33
- list: T[];
53
+ /** 消息媒体 */
54
+ interface MessageMedia {
55
+ mimeType: string;
56
+ url: string;
57
+ }
58
+ /** AI 对话消息 */
59
+ interface Message {
60
+ role: 'system' | 'user' | 'assistant';
61
+ content: string;
62
+ medias?: MessageMedia[];
63
+ }
64
+ /** 文本生成结果 */
65
+ interface GenerateTextResult {
66
+ chatId: string;
67
+ content: string;
68
+ }
69
+ /** 图片生成结果 */
70
+ interface GenerateImageResult {
71
+ chatId: string;
72
+ messageId: string;
73
+ generationStatus: 'PROCESSING' | 'SUCCESS' | 'FAILED';
74
+ content?: string;
75
+ imageURL?: string;
76
+ }
77
+ /** 流式数据块 */
78
+ interface StreamChunk<T> {
79
+ event?: string;
80
+ data: T;
34
81
  }
35
- type ApiStreamResponse = ReadableStream<Uint8Array>;
36
82
 
37
- interface Entity extends Record<string, any> {
38
- id: string;
83
+ /** 文件上传结果 */
84
+ interface UploadItem {
85
+ fileName: string;
86
+ fileUrl?: string;
87
+ uploadError?: string;
39
88
  }
89
+
90
+ type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
91
+
40
92
  declare class EntityClient {
41
93
  #private;
42
94
  readonly entityName: string;
@@ -75,30 +127,6 @@ declare class FunctionsClient {
75
127
  invoke(functionName: string, options?: FetchOptions): Promise<any>;
76
128
  }
77
129
 
78
- interface MessageMedia {
79
- mimeType: string;
80
- url: string;
81
- }
82
- interface Message {
83
- role: 'system' | 'user' | 'assistant';
84
- content: string;
85
- medias?: MessageMedia[];
86
- }
87
- interface GenerateTextResult {
88
- chatId: string;
89
- content: string;
90
- }
91
- interface GenerateImageResult {
92
- chatId: string;
93
- messageId: string;
94
- generationStatus: 'PROCESSING' | 'SUCCESS' | 'FAILED';
95
- content?: string;
96
- imageURL?: string;
97
- }
98
- interface StreamChunk<T> {
99
- event?: string;
100
- data: T;
101
- }
102
130
  declare class AITool {
103
131
  #private;
104
132
  constructor(lumi: LumiClient);
@@ -137,11 +165,6 @@ declare class EmailTool {
137
165
  }): Promise<void>;
138
166
  }
139
167
 
140
- interface UploadItem {
141
- fileName: string;
142
- fileUrl?: string;
143
- uploadError?: string;
144
- }
145
168
  declare class FileTool {
146
169
  #private;
147
170
  constructor(lumi: LumiClient);
@@ -159,13 +182,6 @@ declare class ToolsClient {
159
182
  constructor(lumi: LumiClient);
160
183
  }
161
184
 
162
- interface LumiClientConfig {
163
- projectId: string;
164
- apiBaseUrl: string;
165
- authOrigin: string;
166
- storageAdapter: StorageAdapter;
167
- authorization?: string;
168
- }
169
185
  declare class LumiClient {
170
186
  config: LumiClientConfig;
171
187
  auth: LumiAuthClient;
@@ -176,36 +192,13 @@ declare class LumiClient {
176
192
  }
177
193
  declare function createClient(config: Optional<LumiClientConfig, 'storageAdapter'>): LumiClient;
178
194
 
179
- interface User {
180
- userId: string;
181
- email: string;
182
- userName: string;
183
- userRole: 'ADMIN' | 'USER';
184
- createdTime: string;
185
- }
186
- interface UserWithToken extends User {
187
- userToken: string;
188
- }
195
+ type OAuthProvider = 'google';
196
+ type OtpType = 'register' | 'resetPassword';
189
197
  interface MessageSignInData {
190
198
  projectId: string;
191
199
  accessToken: string;
192
200
  user: User;
193
201
  }
194
- type MessageDataReceive = {
195
- type: ReceiveMessageType.READY | ReceiveMessageType.SIGN_IN_FAILED;
196
- } | {
197
- type: ReceiveMessageType.SIGN_IN;
198
- data: MessageSignInData;
199
- };
200
- interface MessageInitData {
201
- projectId: string;
202
- icon: string | null;
203
- title: string | null;
204
- }
205
- interface MessageDataSend {
206
- type: SendMessageType.INIT;
207
- data: MessageInitData;
208
- }
209
202
  declare class LumiAuthClient {
210
203
  #private;
211
204
  constructor(lumi: LumiClient);
@@ -234,7 +227,7 @@ declare class LumiAuthClient {
234
227
  password: string;
235
228
  otp: string;
236
229
  userName?: string;
237
- }): Promise<void>;
230
+ }): Promise<MessageSignInData>;
238
231
  /** 重置密码 */
239
232
  resetPassword({ email, newPassword, otp, }: {
240
233
  email: string;
@@ -256,4 +249,4 @@ declare class LumiAuthClient {
256
249
  }) => void): () => void;
257
250
  }
258
251
 
259
- export { AITool, EmailTool, EntitiesClient, type Entity, EntityClient, FileTool, FunctionsClient, type GenerateImageResult, type GenerateTextResult, LumiAuthClient, LumiClient, type LumiClientConfig, type Message, type MessageDataReceive, type MessageDataSend, type MessageInitData, type MessageMedia, type MessageSignInData, type StreamChunk, ToolsClient, type UploadItem, type User, type UserWithToken, createClient };
252
+ export { AITool, type ApiResponse, type ApiStreamResponse, EmailTool, EntitiesClient, type Entity, EntityClient, FileTool, FunctionsClient, type GenerateImageResult, type GenerateTextResult, LumiAuthClient, LumiClient, type LumiClientConfig, type Message, type MessageMedia, type Optional, type PaginationData, type StorageAdapter, type StreamChunk, ToolsClient, type UploadItem, type User, type UserWithToken, createClient };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- "use strict";var Ie=Object.create;var L=Object.defineProperty,Ee=Object.defineProperties,ve=Object.getOwnPropertyDescriptor,Re=Object.getOwnPropertyDescriptors,Ce=Object.getOwnPropertyNames,Z=Object.getOwnPropertySymbols,Pe=Object.getPrototypeOf,te=Object.prototype.hasOwnProperty,Le=Object.prototype.propertyIsEnumerable;var re=r=>{throw TypeError(r)};var ee=(r,e,t)=>e in r?L(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,T=(r,e)=>{for(var t in e||(e={}))te.call(e,t)&&ee(r,t,e[t]);if(Z)for(var t of Z(e))Le.call(e,t)&&ee(r,t,e[t]);return r},z=(r,e)=>Ee(r,Re(e));var xe=(r,e)=>{for(var t in e)L(r,t,{get:e[t],enumerable:!0})},ie=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ce(e))!te.call(r,n)&&n!==t&&L(r,n,{get:()=>e[n],enumerable:!(s=ve(e,n))||s.enumerable});return r};var C=(r,e,t)=>(t=r!=null?Ie(Pe(r)):{},ie(e||!r||!r.__esModule?L(t,"default",{value:r,enumerable:!0}):t,r)),Oe=r=>ie(L({},"__esModule",{value:!0}),r);var J=(r,e,t)=>e.has(r)||re("Cannot "+t);var i=(r,e,t)=>(J(r,e,"read from private field"),t?t.call(r):e.get(r)),p=(r,e,t)=>e.has(r)?re("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),d=(r,e,t,s)=>(J(r,e,"write to private field"),s?s.call(r,t):e.set(r,t),t),Q=(r,e,t)=>(J(r,e,"access private method"),t);var c=(r,e,t)=>new Promise((s,n)=>{var o=h=>{try{g(t.next(h))}catch(f){n(f)}},m=h=>{try{g(t.throw(h))}catch(f){n(f)}},g=h=>h.done?s(h.value):Promise.resolve(h.value).then(o,m);g((t=t.apply(r,e)).next())});var je={};xe(je,{AITool:()=>N,EmailTool:()=>$,EntitiesClient:()=>k,EntityClient:()=>U,FileTool:()=>q,FunctionsClient:()=>j,LumiAuthClient:()=>x,LumiClient:()=>H,ToolsClient:()=>K,createClient:()=>De});module.exports=Oe(je);var G=C(require("crypto-js/sha256")),ye=require("uuid");var u=class extends Error{constructor(t,s){super(s);this.name="LumiError";this.code=t}};var le=C(require("crypto-js/enc-base64")),ue=C(require("crypto-js/enc-hex")),pe=C(require("crypto-js/hmac-sha256")),de=C(require("crypto-js/sha256")),ge=C(require("object-hash")),V=require("ofetch");function ne(){var r,e;return(e=(r=document.querySelector('link[rel="icon"]'))==null?void 0:r.href)!=null?e:null}function oe(){var r;return(r=document.title)!=null?r:null}var se,y=typeof window=="undefined"&&((se=globalThis.navigator)==null?void 0:se.product)!=="ReactNative";function ae(r){return new Promise(e=>setTimeout(e,r))}function F(r){var e;return typeof process!="undefined"&&(e=process==null?void 0:process.env[r])!=null?e:null}var Me="6QrJZ7pFCmBZAeIJF7IArvkCz+EtzA0RVcpHkiQIsQyhs7QtCS9P+CueZdHfB2OtJcgX3BbqY9pfpWeAVTqCwQ==";function ce(r){return encodeURIComponent(r).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function Ue(r){let e=Math.floor(Date.now()/1e3).toString(),t=Math.random().toString(36).substring(2,15),s=T(T({},r.query),r.params),n=Object.keys(s).sort().map(S=>`${ce(S)}=${ce(String(s[S]))}`).join("&"),o={"x-timestamp":e,"x-nonce":t},m=Object.keys(o).sort().map(S=>`${S}:${o[S]}`).join(`
2
- `),g=r.body&&!(r.body instanceof FormData)?JSON.stringify(r.body):"",h=(0,de.default)(g).toString(ue.default),f=[n,m,h].join(`
3
- `),R=le.default.stringify((0,pe.default)(f,Me)),I=new Headers(r.headers);Object.entries(o).forEach(([S,b])=>{I.set(S,b)}),I.set("X-Sign",R),r.headers=I}var me=new Map;function ke(r,e){var m;let t=T({},e);e.body instanceof FormData&&(t.body=Array.from(e.body.entries())),t.headers=void 0;let s=(0,ge.default)([r,t]),n=Date.now(),o=((m=me.get(s))==null?void 0:m.filter(g=>n-g<1e3))||[];if(o.length>=4)throw new u(10429,"Too many requests");o.push(n),me.set(s,o)}function he(r,e,t,s=!1){t.headers=new Headers(t.headers),r.auth.accessToken&&t.headers.set("Authorization",`Bearer ${r.auth.accessToken}`);let n=F("TOP_ACCESS_KEY");n&&t.headers.set("X-Top-Access",n),s&&(t.headers.get("Accept")||t.headers.set("Accept","text/event-stream"),t.headers.get("Cache-Control")||t.headers.set("Cache-Control","no-cache"),t.headers.get("X-Accel-Buffering")||t.headers.set("X-Accel-Buffering","no")),ke(e,t),Ue(t)}function l(r,e,t={}){he(r,e,t);let s=r.auth.isAuthenticated;return(0,V.ofetch)(e,z(T({baseURL:r.config.apiBaseUrl},t),{onResponse:({response:n})=>{var o;!y&&s&&((o=n._data)==null?void 0:o.code)===2100&&r.auth.signOut()}}))}function fe(s,n){return c(this,arguments,function*(r,e,t={}){return he(r,e,t,!0),yield(0,V.ofetch)(e,z(T({baseURL:r.config.apiBaseUrl},t),{responseType:"stream"}))})}function Y(r,e,t){let s=r.config.storageAdapter.storage;t!==null?s.setItem(e,JSON.stringify(t)):s.removeItem(e)}function W(r,e){let s=r.config.storageAdapter.storage.getItem(e);try{return s?JSON.parse(s):null}catch(n){return null}}var a,_,O,M,X,x=class{constructor(e){p(this,M);p(this,a);p(this,_,`lumi-auth-${(0,ye.v4)()}`);p(this,O,null);d(this,a,e),Promise.resolve().then(()=>{!y&&this.isAuthenticated&&this.refreshUser()})}get accessToken(){if(y){let e=i(this,a).config.authorization;return e?e.replace("Bearer ",""):null}return W(i(this,a),"lumi-access-token")}set accessToken(e){if(y){i(this,a).config.authorization=e?`Bearer ${e}`:void 0;return}Y(i(this,a),"lumi-access-token",e)}get user(){return y?i(this,O):W(i(this,a),"lumi-user")}set user(e){if(y){d(this,O,e);return}Y(i(this,a),"lumi-user",e)}get isAuthenticated(){return!!this.accessToken}signIn(){return Q(this,M,X).call(this,i(this,a).config.authOrigin)}signInWithPassword(s){return c(this,arguments,function*({email:e,password:t}){let n=yield l(i(this,a),"/lm/user/password/login",{method:"POST",body:{projectId:i(this,a).config.projectId,email:e,password:(0,G.default)(t).toString()}});if(n.code!==200)throw new u(n.code,n.message);return{projectId:i(this,a).config.projectId,accessToken:n.data.userToken,user:n.data}})}sendOtp(s){return c(this,arguments,function*({email:e,type:t}){let n=yield l(i(this,a),"/lm/user/email/code/send",{method:"POST",body:{projectId:i(this,a).config.projectId,email:e,emailType:t}});if(n.code!==200)throw new u(n.code,n.message)})}signUpWithPassword(o){return c(this,arguments,function*({email:e,password:t,otp:s,userName:n}){let m=yield l(i(this,a),"/lm/user/password/register",{method:"POST",body:{projectId:i(this,a).config.projectId,email:e,password:(0,G.default)(t).toString(),code:s,userName:n}});if(m.code!==200)throw new u(m.code,m.message)})}resetPassword(n){return c(this,arguments,function*({email:e,newPassword:t,otp:s}){let o=yield l(i(this,a),"/lm/user/password/reset",{method:"POST",body:{projectId:i(this,a).config.projectId,email:e,newPassword:(0,G.default)(t).toString(),code:s}});if(o.code!==200)throw new u(o.code,o.message)})}signInWithOAuth({provider:e}){return Q(this,M,X).call(this,`${i(this,a).config.authOrigin}/oauth/${e}`)}signOut(){if(y)throw new Error("auth.signOut() can only be called on the client side");this.accessToken=null,this.user=null}refreshUser(){return c(this,null,function*(){let e=yield l(i(this,a),"/lm/user/info",{method:"POST"});if(e.code!==200)throw new Error(e.message);return this.user=e.data,e.data})}onAuthChange(e){if(y)throw new Error("auth.onAuthChange() can only be called on the client side");let t=i(this,a).config.storageAdapter.listen(s=>{(s==="lumi-access-token"||s==="lumi-user"||!s)&&e({isAuthenticated:this.isAuthenticated,user:this.user})});return()=>t()}};a=new WeakMap,_=new WeakMap,O=new WeakMap,M=new WeakSet,X=function(e){if(y)throw new u(10400,"This method can only be called on the client side");let t=800,s=600,n=(window.screen.width-t)/2,o=(window.screen.height-s)/2,m=window.open(e,i(this,_),`width=${t},height=${s},left=${n},top=${o}`),g;return new Promise((h,f)=>{if(!m)return f(new u(10500,"Open auth window failed"));let R=setInterval(()=>{m.closed&&f(new u(10499,"Auth window closed"))},1e3),I=b=>{m.closed||(m.focus(),b.stopPropagation(),b.preventDefault())},S=({data:b,origin:Ae,source:Te})=>{if(!(Ae!==i(this,a).config.authOrigin||Te!==m))switch(b==null?void 0:b.type){case"lumi-ready":{m.postMessage({type:"lumi-init",data:{projectId:i(this,a).config.projectId,icon:ne(),title:oe()}},i(this,a).config.authOrigin);break}case"lumi-sign-in":{if(b.data.projectId!==i(this,a).config.projectId)break;m.close(),window.focus(),this.accessToken=b.data.accessToken,this.user=b.data.user,h(b.data);break}}};window.addEventListener("message",S),document.addEventListener("click",I,!0),g=()=>{clearInterval(R),window.removeEventListener("message",S),document.removeEventListener("click",I,!0)}}).finally(()=>g==null?void 0:g())};var w,U=class{constructor(e,t){p(this,w);d(this,w,e),this.entityName=t}list(){return c(this,arguments,function*({filter:e,sort:t,limit:s,skip:n}={}){if(s){let o=yield l(i(this,w),this.uri("/listByPage"),{method:"POST",body:{filter:e,sort:t,limit:s,skip:n}});if(o.code!==200)throw new Error(o.message);return o.data}else{let o=yield l(i(this,w),this.uri("/list"),{method:"POST",body:{filter:e,sort:t}});if(o.code!==200)throw new Error(o.message);return{total:o.data.length,list:o.data}}})}get(e){return c(this,null,function*(){let t=yield l(i(this,w),this.uri(`/${e}`),{method:"GET"});if(t.code!==200)throw new Error(t.message);return t.data})}create(e){return c(this,null,function*(){let t=yield l(i(this,w),this.uri(),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}createMany(e){return c(this,null,function*(){let t=yield l(i(this,w),this.uri("/batch"),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}update(e,t){return c(this,null,function*(){let s=yield l(i(this,w),this.uri(),{method:"PUT",body:{filter:{_id:e},update:t}});if(s.code!==200)throw new Error(s.message);return s.data})}delete(e){return c(this,null,function*(){let t=yield l(i(this,w),this.uri(`/${e}`),{method:"DELETE"});if(t.code!==200)throw new Error(t.message)})}deleteMany(e){return c(this,null,function*(){let t=yield l(i(this,w),this.uri("/batch-by-ids"),{method:"DELETE",params:{ids:e}});if(t.code!==200)throw new Error(t.message)})}uri(e=""){return`/lm/${i(this,w).config.projectId}/${this.entityName}/documents${e}`}};w=new WeakMap;var D,k=class{constructor(e){p(this,D);return d(this,D,e),new Proxy(this,{get(t,s){return s in t||(t[s]=new U(i(t,D),s)),t[s]}})}};D=new WeakMap;var we=require("ofetch");var E,j=class{constructor(e){p(this,E);d(this,E,e)}invoke(e,t={}){return i(this,E).auth.accessToken&&(t.headers=T({Authorization:`Bearer ${i(this,E).auth.accessToken}`},t.headers)),(0,we.ofetch)(`/v1/functions/${i(this,E).config.projectId}/${e}`,T({baseURL:i(this,E).config.apiBaseUrl},t))}};E=new WeakMap;function Se(){return{storage:{getItem:r=>localStorage.getItem(r),setItem:(r,e)=>{localStorage.setItem(r,e),window.dispatchEvent(new StorageEvent("storage",{key:r,oldValue:null,newValue:e,storageArea:localStorage}))},removeItem:r=>{localStorage.removeItem(r),window.dispatchEvent(new StorageEvent("storage",{key:r,oldValue:null,newValue:null,storageArea:localStorage}))}},listen:r=>{let e=t=>{r(t.key,t.newValue)};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}}}var be=require("eventsource-parser/stream");var A,N=class{constructor(e){p(this,A);d(this,A,e)}generateText(s){return c(this,arguments,function*({model:e="gemini-2.5-flash",messages:t}){let n=this.checkLumiApiKey(),o=yield l(i(this,A),`/lm/${i(this,A).config.projectId}/ai/chat/completions`,{method:"POST",body:{lumiApiKey:n,modelName:e,chatMessages:t}});if(o.code!==200)throw new u(o.code,o.message);return o.data})}generateTextStream(s){return c(this,arguments,function*({model:e="gemini-2.5-flash",messages:t}){let n=this.checkLumiApiKey();return fe(i(this,A),`/lm/${i(this,A).config.projectId}/ai/chat/stream`,{method:"POST",body:{lumiApiKey:n,modelName:e,chatMessages:t}})})}generateImage(s){return c(this,arguments,function*({model:e="gemini-2.5-flash-image",messages:t}){let n=this.checkLumiApiKey(),{code:o,message:m,data:g}=yield l(i(this,A),`/lm/${i(this,A).config.projectId}/ai/image/task`,{method:"POST",body:{lumiApiKey:n,modelName:e,chatMessages:t}});if(o!==200)throw new u(o,m);let h=g,f=1e3;for(;h.generationStatus==="PROCESSING";){yield ae(f),f<5e3&&(f+=500);let{code:R,message:I,data:S}=yield l(i(this,A),`/lm/${i(this,A).config.projectId}/ai/image/get`,{method:"POST",body:{lumiApiKey:n,messageId:h.messageId}});if(R!==200)throw new u(R,I);h=S}return h})}parseStream(e){return c(this,null,function*(){return e.pipeThrough(new TextDecoderStream).pipeThrough(new be.EventSourceParserStream).pipeThrough(new TransformStream({transform:(t,s)=>{try{let n=JSON.parse(t.data);s.enqueue({event:t.event,data:n})}catch(n){console.error(`Parse stream chunk failed: Invalid JSON.
4
- ${t.data}`)}}}))})}checkLumiApiKey(){if(!y)throw new u(10400,"lumi.tools.ai is only available on the server-side");let e=F("LUMI_API_KEY");if(!e)throw new u(10400,"LUMI_API_KEY is required");return e}};A=new WeakMap;var P,$=class{constructor(e){p(this,P);d(this,P,e)}send(h){return c(this,arguments,function*({to:e,subject:t,fromName:s,html:n,text:o="",replyTo:m,scheduledAt:g}){if(!e||!t||!n&&!o)throw new Error("Failed to send email: Missing required parameters.");typeof e=="string"&&(e=[e]),typeof m=="string"&&(m=[m]);let f=yield l(i(this,P),`/lm/${i(this,P).config.projectId}/email/send`,{method:"POST",body:{to:e,subject:t,fromName:s,html:n,text:o,replyTo:m,scheduledAt:g}});if(f.code!==200)throw new u(f.code,f.message)})}};P=new WeakMap;var v,q=class{constructor(e){p(this,v);d(this,v,e)}upload(e){return c(this,null,function*(){let t=new FormData;e.forEach(n=>{t.append("files",n)});let s=yield l(i(this,v),`/lm/${i(this,v).config.projectId}/file/batch`,{method:"POST",body:t});if(s.code!==200)throw new u(s.code,s.message);return s.data})}delete(e){return c(this,null,function*(){let t=yield l(i(this,v),`/lm/${i(this,v).config.projectId}/file/batch`,{method:"DELETE",body:{fileUrls:e}});if(t.code!==200)throw new u(t.code,t.message)})}};v=new WeakMap;var B,K=class{constructor(e){p(this,B);d(this,B,e),this.email=new $(e),this.file=new q(e),this.ai=new N(e)}};B=new WeakMap;var H=class{constructor(e){var t;(t=e.storageAdapter)!=null||(e.storageAdapter=Se()),this.config=e,this.auth=new x(this),this.entities=new k(this),this.tools=new K(this),this.functions=new j(this)}};function De(r){return new H(r)}0&&(module.exports={AITool,EmailTool,EntitiesClient,EntityClient,FileTool,FunctionsClient,LumiAuthClient,LumiClient,ToolsClient,createClient});
1
+ "use strict";var Ie=Object.create;var L=Object.defineProperty,Ee=Object.defineProperties,Ce=Object.getOwnPropertyDescriptor,Re=Object.getOwnPropertyDescriptors,ve=Object.getOwnPropertyNames,Z=Object.getOwnPropertySymbols,Pe=Object.getPrototypeOf,te=Object.prototype.hasOwnProperty,Le=Object.prototype.propertyIsEnumerable;var ie=i=>{throw TypeError(i)};var ee=(i,e,t)=>e in i?L(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t,b=(i,e)=>{for(var t in e||(e={}))te.call(e,t)&&ee(i,t,e[t]);if(Z)for(var t of Z(e))Le.call(e,t)&&ee(i,t,e[t]);return i},J=(i,e)=>Ee(i,Re(e));var Oe=(i,e)=>{for(var t in e)L(i,t,{get:e[t],enumerable:!0})},se=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of ve(e))!te.call(i,o)&&o!==t&&L(i,o,{get:()=>e[o],enumerable:!(r=Ce(e,o))||r.enumerable});return i};var v=(i,e,t)=>(t=i!=null?Ie(Pe(i)):{},se(e||!i||!i.__esModule?L(t,"default",{value:i,enumerable:!0}):t,i)),xe=i=>se(L({},"__esModule",{value:!0}),i);var Y=(i,e,t)=>e.has(i)||ie("Cannot "+t);var s=(i,e,t)=>(Y(i,e,"read from private field"),t?t.call(i):e.get(i)),p=(i,e,t)=>e.has(i)?ie("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(i):e.set(i,t),d=(i,e,t,r)=>(Y(i,e,"write to private field"),r?r.call(i,t):e.set(i,t),t),z=(i,e,t)=>(Y(i,e,"access private method"),t);var m=(i,e,t)=>new Promise((r,o)=>{var n=g=>{try{h(t.next(g))}catch(f){o(f)}},a=g=>{try{h(t.throw(g))}catch(f){o(f)}},h=g=>g.done?r(g.value):Promise.resolve(g.value).then(n,a);h((t=t.apply(i,e)).next())});var Ne={};Oe(Ne,{AITool:()=>U,EmailTool:()=>$,EntitiesClient:()=>D,EntityClient:()=>k,FileTool:()=>q,FunctionsClient:()=>N,LumiAuthClient:()=>O,LumiClient:()=>H,ToolsClient:()=>_,createClient:()=>je});module.exports=xe(Ne);var K=v(require("crypto-js/sha256")),ye=require("uuid");var u=class extends Error{constructor(t,r){super(r);this.name="LumiError";this.code=t}};var le=v(require("crypto-js/enc-base64")),ue=v(require("crypto-js/enc-hex")),pe=v(require("crypto-js/hmac-sha256")),de=v(require("crypto-js/sha256")),he=v(require("object-hash")),Q=require("ofetch");function oe(){var i,e;return(e=(i=document.querySelector('link[rel="icon"]'))==null?void 0:i.href)!=null?e:null}function ne(){var i;return(i=document.title)!=null?i:null}var re,y=typeof window=="undefined"&&((re=globalThis.navigator)==null?void 0:re.product)!=="ReactNative";function ae(i){return new Promise(e=>setTimeout(e,i))}function F(i){var e;return typeof process!="undefined"&&(e=process==null?void 0:process.env[i])!=null?e:null}var Me="6QrJZ7pFCmBZAeIJF7IArvkCz+EtzA0RVcpHkiQIsQyhs7QtCS9P+CueZdHfB2OtJcgX3BbqY9pfpWeAVTqCwQ==";function ce(i){return encodeURIComponent(i).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function ke(i){let e=Math.floor(Date.now()/1e3).toString(),t=Math.random().toString(36).substring(2,15),r=b(b({},i.query),i.params),o=Object.keys(r).sort().map(S=>`${ce(S)}=${ce(String(r[S]))}`).join("&"),n={"x-timestamp":e,"x-nonce":t},a=Object.keys(n).sort().map(S=>`${S}:${n[S]}`).join(`
2
+ `),h=i.body&&!(i.body instanceof FormData)?JSON.stringify(i.body):"",g=(0,de.default)(h).toString(ue.default),f=[o,a,g].join(`
3
+ `),R=le.default.stringify((0,pe.default)(f,Me)),I=new Headers(i.headers);Object.entries(n).forEach(([S,A])=>{I.set(S,A)}),I.set("X-Sign",R),i.headers=I}var me=new Map;function De(i,e){var a;let t=b({},e);e.body instanceof FormData&&(t.body=Array.from(e.body.entries())),t.headers=void 0;let r=(0,he.default)([i,t]),o=Date.now(),n=((a=me.get(r))==null?void 0:a.filter(h=>o-h<1e3))||[];if(n.length>=4)throw new u(10429,"Too many requests");n.push(o),me.set(r,n)}function ge(i,e,t,r=!1){t.headers=new Headers(t.headers),i.auth.accessToken&&t.headers.set("Authorization",`Bearer ${i.auth.accessToken}`);let o=F("TOP_ACCESS_KEY");o&&t.headers.set("X-Top-Access",o),r&&(t.headers.get("Accept")||t.headers.set("Accept","text/event-stream"),t.headers.get("Cache-Control")||t.headers.set("Cache-Control","no-cache"),t.headers.get("X-Accel-Buffering")||t.headers.set("X-Accel-Buffering","no")),De(e,t),ke(t)}function l(i,e,t={}){ge(i,e,t);let r=i.auth.isAuthenticated;return(0,Q.ofetch)(e,J(b({baseURL:i.config.apiBaseUrl},t),{onResponse:({response:o})=>{var n;!y&&r&&((n=o._data)==null?void 0:n.code)===2100&&i.auth.signOut()}}))}function fe(r,o){return m(this,arguments,function*(i,e,t={}){return ge(i,e,t,!0),yield(0,Q.ofetch)(e,J(b({baseURL:i.config.apiBaseUrl},t),{responseType:"stream"}))})}function V(i,e,t){let r=i.config.storageAdapter.storage;t!==null?r.setItem(e,JSON.stringify(t)):r.removeItem(e)}function W(i,e){let r=i.config.storageAdapter.storage.getItem(e);try{return r?JSON.parse(r):null}catch(o){return null}}var c,G,x,M,X,O=class{constructor(e){p(this,M);p(this,c);p(this,G,`lumi-auth-${(0,ye.v4)()}`);p(this,x,null);d(this,c,e),Promise.resolve().then(()=>{!y&&this.isAuthenticated&&this.refreshUser()})}get accessToken(){if(y){let e=s(this,c).config.authorization;return e?e.replace("Bearer ",""):null}return W(s(this,c),"lumi-access-token")}set accessToken(e){if(y){s(this,c).config.authorization=e?`Bearer ${e}`:void 0;return}V(s(this,c),"lumi-access-token",e)}get user(){return y?s(this,x):W(s(this,c),"lumi-user")}set user(e){if(y){d(this,x,e);return}V(s(this,c),"lumi-user",e)}get isAuthenticated(){return!!this.accessToken}signIn(){return z(this,M,X).call(this,s(this,c).config.authOrigin)}signInWithPassword(r){return m(this,arguments,function*({email:e,password:t}){let o=yield l(s(this,c),"/lm/user/password/login",{method:"POST",body:{projectId:s(this,c).config.projectId,email:e,password:(0,K.default)(t).toString()}});if(o.code!==200)throw new u(o.code,o.message);return this.accessToken=o.data.userToken,this.user=o.data,{projectId:s(this,c).config.projectId,accessToken:o.data.userToken,user:o.data}})}sendOtp(r){return m(this,arguments,function*({email:e,type:t}){let o=yield l(s(this,c),"/lm/user/email/code/send",{method:"POST",body:{projectId:s(this,c).config.projectId,email:e,emailType:t}});if(o.code!==200)throw new u(o.code,o.message)})}signUpWithPassword(n){return m(this,arguments,function*({email:e,password:t,otp:r,userName:o}){let a=yield l(s(this,c),"/lm/user/password/register",{method:"POST",body:{projectId:s(this,c).config.projectId,email:e,password:(0,K.default)(t).toString(),code:r,userName:o}});if(a.code!==200)throw new u(a.code,a.message);return this.accessToken=a.data.userToken,this.user=a.data,{projectId:s(this,c).config.projectId,accessToken:a.data.userToken,user:a.data}})}resetPassword(o){return m(this,arguments,function*({email:e,newPassword:t,otp:r}){let n=yield l(s(this,c),"/lm/user/password/reset",{method:"POST",body:{projectId:s(this,c).config.projectId,email:e,newPassword:(0,K.default)(t).toString(),code:r}});if(n.code!==200)throw new u(n.code,n.message)})}signInWithOAuth({provider:e}){return z(this,M,X).call(this,`${s(this,c).config.authOrigin}/oauth/${e}`)}signOut(){if(y)throw new Error("auth.signOut() can only be called on the client side");this.accessToken=null,this.user=null}refreshUser(){return m(this,null,function*(){let e=yield l(s(this,c),"/lm/user/info",{method:"POST"});if(e.code!==200)throw new Error(e.message);return this.user=e.data,e.data})}onAuthChange(e){if(y)throw new Error("auth.onAuthChange() can only be called on the client side");let t=s(this,c).config.storageAdapter.listen(r=>{(r==="lumi-access-token"||r==="lumi-user"||!r)&&e({isAuthenticated:this.isAuthenticated,user:this.user})});return()=>t()}};c=new WeakMap,G=new WeakMap,x=new WeakMap,M=new WeakSet,X=function(e){if(y)throw new u(10400,"This method can only be called on the client side");let t=800,r=600,o=(window.screen.width-t)/2,n=(window.screen.height-r)/2,a=window.open(e,s(this,G),`width=${t},height=${r},left=${o},top=${n}`),h;return new Promise((g,f)=>{if(!a)return f(new u(10500,"Open auth window failed"));let R=setInterval(()=>{a.closed&&f(new u(10499,"Auth window closed"))},1e3),I=A=>{a.closed||(a.focus(),A.stopPropagation(),A.preventDefault())},S=({data:A,origin:Te,source:be})=>{if(!(Te!==s(this,c).config.authOrigin||be!==a))switch(A==null?void 0:A.type){case"lumi-ready":{a.postMessage({type:"lumi-init",data:{projectId:s(this,c).config.projectId,icon:oe(),title:ne()}},s(this,c).config.authOrigin);break}case"lumi-sign-in":{if(A.data.projectId!==s(this,c).config.projectId)break;a.close(),window.focus(),this.accessToken=A.data.accessToken,this.user=A.data.user,g(A.data);break}}};window.addEventListener("message",S),document.addEventListener("click",I,!0),h=()=>{clearInterval(R),window.removeEventListener("message",S),document.removeEventListener("click",I,!0)}}).finally(()=>h==null?void 0:h())};var w,k=class{constructor(e,t){p(this,w);d(this,w,e),this.entityName=t}list(){return m(this,arguments,function*({filter:e,sort:t,limit:r,skip:o}={}){if(r){let n=yield l(s(this,w),this.uri("/listByPage"),{method:"POST",body:{filter:e,sort:t,limit:r,skip:o}});if(n.code!==200)throw new Error(n.message);return n.data}else{let n=yield l(s(this,w),this.uri("/list"),{method:"POST",body:{filter:e,sort:t}});if(n.code!==200)throw new Error(n.message);return{total:n.data.length,list:n.data}}})}get(e){return m(this,null,function*(){let t=yield l(s(this,w),this.uri(`/${e}`),{method:"GET"});if(t.code!==200)throw new Error(t.message);return t.data})}create(e){return m(this,null,function*(){let t=yield l(s(this,w),this.uri(),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}createMany(e){return m(this,null,function*(){let t=yield l(s(this,w),this.uri("/batch"),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}update(e,t){return m(this,null,function*(){let r=yield l(s(this,w),this.uri(),{method:"PUT",body:{filter:{_id:e},update:t}});if(r.code!==200)throw new Error(r.message);return r.data})}delete(e){return m(this,null,function*(){let t=yield l(s(this,w),this.uri(`/${e}`),{method:"DELETE"});if(t.code!==200)throw new Error(t.message)})}deleteMany(e){return m(this,null,function*(){let t=yield l(s(this,w),this.uri("/batch-by-ids"),{method:"DELETE",params:{ids:e}});if(t.code!==200)throw new Error(t.message)})}uri(e=""){return`/lm/${s(this,w).config.projectId}/${this.entityName}/documents${e}`}};w=new WeakMap;var j,D=class{constructor(e){p(this,j);return d(this,j,e),new Proxy(this,{get(t,r){return r in t||(t[r]=new k(s(t,j),r)),t[r]}})}};j=new WeakMap;var we=require("ofetch");var E,N=class{constructor(e){p(this,E);d(this,E,e)}invoke(e,t={}){return s(this,E).auth.accessToken&&(t.headers=b({Authorization:`Bearer ${s(this,E).auth.accessToken}`},t.headers)),(0,we.ofetch)(`/v1/functions/${s(this,E).config.projectId}/${e}`,b({baseURL:s(this,E).config.apiBaseUrl},t))}};E=new WeakMap;function Se(){return{storage:{getItem:i=>localStorage.getItem(i),setItem:(i,e)=>{localStorage.setItem(i,e),window.dispatchEvent(new StorageEvent("storage",{key:i,oldValue:null,newValue:e,storageArea:localStorage}))},removeItem:i=>{localStorage.removeItem(i),window.dispatchEvent(new StorageEvent("storage",{key:i,oldValue:null,newValue:null,storageArea:localStorage}))}},listen:i=>{let e=t=>{i(t.key,t.newValue)};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}}}var Ae=require("eventsource-parser/stream");var T,U=class{constructor(e){p(this,T);d(this,T,e)}generateText(r){return m(this,arguments,function*({model:e="gemini-2.5-flash",messages:t}){let o=this.checkLumiApiKey(),n=yield l(s(this,T),`/lm/${s(this,T).config.projectId}/ai/chat/completions`,{method:"POST",body:{lumiApiKey:o,modelName:e,chatMessages:t}});if(n.code!==200)throw new u(n.code,n.message);return n.data})}generateTextStream(r){return m(this,arguments,function*({model:e="gemini-2.5-flash",messages:t}){let o=this.checkLumiApiKey();return fe(s(this,T),`/lm/${s(this,T).config.projectId}/ai/chat/stream`,{method:"POST",body:{lumiApiKey:o,modelName:e,chatMessages:t}})})}generateImage(r){return m(this,arguments,function*({model:e="gemini-2.5-flash-image",messages:t}){let o=this.checkLumiApiKey(),{code:n,message:a,data:h}=yield l(s(this,T),`/lm/${s(this,T).config.projectId}/ai/image/task`,{method:"POST",body:{lumiApiKey:o,modelName:e,chatMessages:t}});if(n!==200)throw new u(n,a);let g=h,f=1e3;for(;g.generationStatus==="PROCESSING";){yield ae(f),f<5e3&&(f+=500);let{code:R,message:I,data:S}=yield l(s(this,T),`/lm/${s(this,T).config.projectId}/ai/image/get`,{method:"POST",body:{lumiApiKey:o,messageId:g.messageId}});if(R!==200)throw new u(R,I);g=S}return g})}parseStream(e){return m(this,null,function*(){return e.pipeThrough(new TextDecoderStream).pipeThrough(new Ae.EventSourceParserStream).pipeThrough(new TransformStream({transform:(t,r)=>{try{let o=JSON.parse(t.data);r.enqueue({event:t.event,data:o})}catch(o){console.error(`Parse stream chunk failed: Invalid JSON.
4
+ ${t.data}`)}}}))})}checkLumiApiKey(){if(!y)throw new u(10400,"lumi.tools.ai is only available on the server-side");let e=F("LUMI_API_KEY");if(!e)throw new u(10400,"LUMI_API_KEY is required");return e}};T=new WeakMap;var P,$=class{constructor(e){p(this,P);d(this,P,e)}send(g){return m(this,arguments,function*({to:e,subject:t,fromName:r,html:o,text:n="",replyTo:a,scheduledAt:h}){if(!e||!t||!o&&!n)throw new Error("Failed to send email: Missing required parameters.");typeof e=="string"&&(e=[e]),typeof a=="string"&&(a=[a]);let f=yield l(s(this,P),`/lm/${s(this,P).config.projectId}/email/send`,{method:"POST",body:{to:e,subject:t,fromName:r,html:o,text:n,replyTo:a,scheduledAt:h}});if(f.code!==200)throw new u(f.code,f.message)})}};P=new WeakMap;var C,q=class{constructor(e){p(this,C);d(this,C,e)}upload(e){return m(this,null,function*(){let t=new FormData;e.forEach(o=>{t.append("files",o)});let r=yield l(s(this,C),`/lm/${s(this,C).config.projectId}/file/batch`,{method:"POST",body:t});if(r.code!==200)throw new u(r.code,r.message);return r.data})}delete(e){return m(this,null,function*(){let t=yield l(s(this,C),`/lm/${s(this,C).config.projectId}/file/batch`,{method:"DELETE",body:{fileUrls:e}});if(t.code!==200)throw new u(t.code,t.message)})}};C=new WeakMap;var B,_=class{constructor(e){p(this,B);d(this,B,e),this.email=new $(e),this.file=new q(e),this.ai=new U(e)}};B=new WeakMap;var H=class{constructor(e){var t;(t=e.storageAdapter)!=null||(e.storageAdapter=Se()),this.config=e,this.auth=new O(this),this.entities=new D(this),this.tools=new _(this),this.functions=new N(this)}};function je(i){return new H(i)}0&&(module.exports={AITool,EmailTool,EntitiesClient,EntityClient,FileTool,FunctionsClient,LumiAuthClient,LumiClient,ToolsClient,createClient});
5
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core/auth-client.ts","../src/lib/error.ts","../src/lib/request.ts","../src/utils/common.ts","../src/utils/storage.ts","../src/core/entity-client.ts","../src/core/entities-client.ts","../src/core/functions-client.ts","../src/adapters/storage.ts","../src/tools/ai-tool.ts","../src/tools/email-tool.ts","../src/tools/file-tool.ts","../src/core/tools-client.ts","../src/core/lumi-client.ts"],"sourcesContent":["export * from './core/auth-client'\nexport * from './core/entities-client'\nexport * from './core/entity-client'\nexport * from './core/functions-client'\nexport * from './core/lumi-client'\nexport * from './core/tools-client'\nexport * from './tools'\n","import type { OAuthProvider, OtpType } from '@/constants'\nimport type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/lib/request'\nimport SHA256 from 'crypto-js/sha256'\nimport { v4 } from 'uuid'\nimport { ReceiveMessageType } from '@/constants'\nimport { SendMessageType } from '@/constants'\nimport { StorageKey } from '@/constants'\nimport { LumiError } from '@/lib/error'\nimport { request } from '@/lib/request'\nimport { getIcon, getTitle, isServer } from '@/utils/common'\nimport { getStorage, setStorage } from '@/utils/storage'\n\nexport interface User {\n userId: string\n email: string\n userName: string\n userRole: 'ADMIN' | 'USER'\n createdTime: string\n}\n\nexport interface UserWithToken extends User {\n userToken: string\n}\n\nexport interface MessageSignInData {\n projectId: string\n accessToken: string\n user: User\n}\n\nexport type MessageDataReceive = {\n type: ReceiveMessageType.READY | ReceiveMessageType.SIGN_IN_FAILED\n} | {\n type: ReceiveMessageType.SIGN_IN\n data: MessageSignInData\n}\n\nexport interface MessageInitData {\n projectId: string\n icon: string | null\n title: string | null\n}\n\nexport interface MessageDataSend {\n type: SendMessageType.INIT\n data: MessageInitData\n}\n\nexport class LumiAuthClient {\n readonly #lumi: LumiClient\n readonly #popupName: string = `lumi-auth-${v4()}`\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n Promise.resolve().then(() => {\n if (!isServer && this.isAuthenticated)\n void this.refreshUser()\n })\n }\n\n /** 访问令牌 */\n public get accessToken(): string | null {\n if (isServer) {\n const authorization = this.#lumi.config.authorization\n return authorization ? authorization.replace('Bearer ', '') : null\n }\n return getStorage<string>(this.#lumi, StorageKey.ACCESS_TOKEN)\n }\n\n public set accessToken(accessToken: string | null) {\n if (isServer) {\n this.#lumi.config.authorization = accessToken ? `Bearer ${accessToken}` : undefined\n return\n }\n setStorage(this.#lumi, StorageKey.ACCESS_TOKEN, accessToken)\n }\n\n #user: User | null = null\n\n /** 用户 */\n public get user(): User | null {\n if (isServer)\n return this.#user\n return getStorage<User>(this.#lumi, StorageKey.USER)\n }\n\n public set user(user: User | null) {\n if (isServer) {\n this.#user = user\n return\n }\n setStorage(this.#lumi, StorageKey.USER, user)\n }\n\n public get isAuthenticated(): boolean {\n return !!this.accessToken\n }\n\n /** 登录 */\n public signIn(): Promise<MessageSignInData> {\n return this.#openAuthPopup(this.#lumi.config.authOrigin)\n }\n\n /** 使用密码登录 */\n public async signInWithPassword({\n email,\n password,\n }: {\n email: string\n password: string\n }): Promise<MessageSignInData> {\n const res = await request<ApiResponse<UserWithToken>>(this.#lumi, '/lm/user/password/login', {\n method: 'POST',\n body: {\n projectId: this.#lumi.config.projectId,\n email,\n password: SHA256(password).toString(),\n },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n\n return {\n projectId: this.#lumi.config.projectId,\n accessToken: res.data.userToken,\n user: res.data,\n }\n }\n\n /** 发送验证码 */\n public async sendOtp({\n email,\n type,\n }: {\n email: string\n type: OtpType\n }): Promise<void> {\n // TODO\n const res = await request<ApiResponse<null>>(this.#lumi, '/lm/user/email/code/send', {\n method: 'POST',\n body: {\n projectId: this.#lumi.config.projectId,\n email,\n emailType: type,\n },\n })\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n\n /** 使用密码注册 */\n public async signUpWithPassword({\n email,\n password,\n otp,\n userName,\n }: {\n email: string\n password: string\n otp: string\n userName?: string\n }): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, '/lm/user/password/register', {\n method: 'POST',\n body: {\n projectId: this.#lumi.config.projectId,\n email,\n password: SHA256(password).toString(),\n code: otp,\n userName,\n },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n\n /** 重置密码 */\n public async resetPassword({\n email,\n newPassword,\n otp,\n }: {\n email: string\n newPassword: string\n otp: string\n }): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, '/lm/user/password/reset', {\n method: 'POST',\n body: {\n projectId: this.#lumi.config.projectId,\n email,\n newPassword: SHA256(newPassword).toString(),\n code: otp,\n },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n\n /** 第三方登录 */\n public signInWithOAuth({\n provider,\n }: {\n provider: OAuthProvider\n }): Promise<MessageSignInData> {\n return this.#openAuthPopup(`${this.#lumi.config.authOrigin}/oauth/${provider}`)\n }\n\n /** 退出登录 */\n public signOut(): void {\n if (isServer)\n throw new Error('auth.signOut() can only be called on the client side')\n\n this.accessToken = null\n this.user = null\n }\n\n /** 获取当前用户 */\n public async refreshUser(): Promise<User> {\n const res = await request<ApiResponse<User>>(this.#lumi, '/lm/user/info', {\n method: 'POST',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n this.user = res.data\n return res.data\n }\n\n /** 监听登录状态变化 */\n public onAuthChange(callback: (args: {\n isAuthenticated: boolean\n user: User | null\n }) => void): () => void {\n if (isServer)\n throw new Error('auth.onAuthChange() can only be called on the client side')\n\n const unlisten = this.#lumi.config.storageAdapter.listen((key): void => {\n if (key === StorageKey.ACCESS_TOKEN || key === StorageKey.USER || !key) {\n callback({\n isAuthenticated: this.isAuthenticated,\n user: this.user,\n })\n }\n })\n\n return () => unlisten()\n }\n\n /** 打开认证弹窗并处理消息 */\n #openAuthPopup(url: string): Promise<MessageSignInData> {\n if (isServer)\n throw new LumiError(10400, 'This method can only be called on the client side')\n\n const width = 800\n const height = 600\n const left = (window.screen.width - width) / 2\n const top = (window.screen.height - height) / 2\n const popup = window.open(url, this.#popupName, `width=${width},height=${height},left=${left},top=${top}`)\n\n let cleanup: () => void\n return new Promise<MessageSignInData>((resolve, reject) => {\n if (!popup)\n return reject(new LumiError(10500, 'Open auth window failed'))\n\n const timer = setInterval(() => {\n if (popup.closed)\n reject(new LumiError(10499, 'Auth window closed'))\n }, 1000)\n\n const handleGlobalClick = (event: MouseEvent): void => {\n if (!popup.closed) {\n popup.focus()\n event.stopPropagation()\n event.preventDefault()\n }\n }\n\n const handleMessage = ({ data, origin, source }: MessageEvent<MessageDataReceive | null>): void => {\n if (origin !== this.#lumi.config.authOrigin || source !== popup)\n return\n\n switch (data?.type) {\n case ReceiveMessageType.READY: {\n popup.postMessage({\n type: SendMessageType.INIT,\n data: {\n projectId: this.#lumi.config.projectId,\n icon: getIcon(),\n title: getTitle(),\n },\n } satisfies MessageDataSend, this.#lumi.config.authOrigin)\n break\n }\n case ReceiveMessageType.SIGN_IN: {\n if (data.data.projectId !== this.#lumi.config.projectId)\n break\n popup.close()\n window.focus()\n this.accessToken = data.data.accessToken\n this.user = data.data.user\n resolve(data.data)\n break\n }\n }\n }\n\n window.addEventListener('message', handleMessage)\n document.addEventListener('click', handleGlobalClick, true)\n\n cleanup = () => {\n clearInterval(timer)\n window.removeEventListener('message', handleMessage)\n document.removeEventListener('click', handleGlobalClick, true)\n }\n }).finally(() => cleanup?.())\n }\n}\n","export class LumiError extends Error {\n name: string = 'LumiError'\n code: number\n\n constructor(code: number, message: string) {\n super(message)\n this.code = code\n }\n}\n","import type { FetchOptions, ResponseType } from 'ofetch'\nimport type { LumiClient } from '@/core/lumi-client'\nimport Base64 from 'crypto-js/enc-base64'\nimport Hex from 'crypto-js/enc-hex'\nimport HmacSHA256 from 'crypto-js/hmac-sha256'\nimport SHA256 from 'crypto-js/sha256'\nimport hash from 'object-hash'\nimport { ofetch } from 'ofetch'\nimport { LumiError } from '@/lib/error'\nimport { getEnv, isServer } from '@/utils/common'\n\nconst SECRET_KEY = '6QrJZ7pFCmBZAeIJF7IArvkCz+EtzA0RVcpHkiQIsQyhs7QtCS9P+CueZdHfB2OtJcgX3BbqY9pfpWeAVTqCwQ=='\n\n/** RFC 3986 compliant URI encoding */\nfunction rfc3986Encode(str: string): string {\n return encodeURIComponent(str).replace(/[!'()*]/g, c => `%${c.charCodeAt(0).toString(16).toUpperCase()}`)\n}\n\n/** 添加签名 */\nfunction addSignature<T extends ResponseType>(options: FetchOptions<T>): void {\n // 生成签名\n const timestamp = Math.floor(Date.now() / 1000).toString()\n const nonce = Math.random().toString(36).substring(2, 15)\n\n // 构建查询字符串\n const queryParams: Record<string, string> = { ...options.query, ...options.params }\n const canonicalQueryString = Object.keys(queryParams).sort().map(key => `${rfc3986Encode(key)}=${rfc3986Encode(String(queryParams[key]))}`).join('&')\n\n // 构建签名头\n const headersToSign: Record<string, string> = {\n 'x-timestamp': timestamp,\n 'x-nonce': nonce,\n }\n const canonicalHeaders = Object.keys(headersToSign).sort().map(key => `${key}:${headersToSign[key]}`).join('\\n')\n\n // 构建载荷哈希\n const payload = (options.body && !(options.body instanceof FormData)) ? JSON.stringify(options.body) : ''\n const hashedPayload = SHA256(payload).toString(Hex)\n\n // 构建规范请求\n const canonicalRequest = [canonicalQueryString, canonicalHeaders, hashedPayload].join('\\n')\n\n // 生成签名\n const signature = Base64.stringify(HmacSHA256(canonicalRequest, SECRET_KEY))\n\n // 添加签名头到请求\n const headers = new Headers(options.headers)\n Object.entries(headersToSign).forEach(([key, value]) => {\n headers.set(key, value)\n })\n headers.set('X-Sign', signature)\n options.headers = headers\n}\n\nexport interface ApiResponse<T> {\n code: number\n message: string\n data: T\n}\n\nexport interface PaginationData<T> {\n total: number\n list: T[]\n}\n\nconst requestMap = new Map<string, number[]>()\n\n/** 限制请求频率,相同参数的请求每秒只能发送4次 */\nfunction checkRateLimit<T extends ResponseType>(uri: string, options: FetchOptions<T>): void {\n const clonedOptions = { ...options }\n\n if (options.body instanceof FormData)\n clonedOptions.body = Array.from(options.body.entries())\n\n clonedOptions.headers = undefined\n\n const requestHash = hash([uri, clonedOptions])\n const now = Date.now()\n const requestQueue = requestMap.get(requestHash)?.filter(time => now - time < 1000) || []\n if (requestQueue.length >= 4)\n throw new LumiError(10429, 'Too many requests')\n requestQueue.push(now)\n requestMap.set(requestHash, requestQueue)\n}\n\nfunction beforeRequest<T extends ResponseType>(lumi: LumiClient, uri: string, options: FetchOptions<T>, stream: boolean = false): void {\n options.headers = new Headers(options.headers)\n\n // 添加认证头(如果存在)\n if (lumi.auth.accessToken)\n options.headers.set('Authorization', `Bearer ${lumi.auth.accessToken}`)\n\n // Function 内获取最高权限\n const topAccessKey = getEnv('TOP_ACCESS_KEY')\n if (topAccessKey)\n options.headers.set('X-Top-Access', topAccessKey)\n\n // 添加流式请求头\n if (stream) {\n if (!options.headers.get('Accept'))\n options.headers.set('Accept', 'text/event-stream')\n if (!options.headers.get('Cache-Control'))\n options.headers.set('Cache-Control', 'no-cache')\n if (!options.headers.get('X-Accel-Buffering'))\n options.headers.set('X-Accel-Buffering', 'no')\n }\n\n // 限制请求频率\n checkRateLimit(uri, options)\n\n // 添加签名\n addSignature(options)\n}\n\n/** 网络请求 */\nexport function request<T>(lumi: LumiClient, uri: string, options: FetchOptions<'json'> = {}): Promise<T> {\n beforeRequest(lumi, uri, options)\n\n const isAuthenticated = lumi.auth.isAuthenticated\n\n return ofetch<T>(uri, {\n baseURL: lumi.config.apiBaseUrl,\n ...options,\n onResponse: ({ response }) => {\n // 若 Token 失效则退出登录\n if (!isServer && isAuthenticated && (response._data as ApiResponse<any>)?.code === 2100)\n lumi.auth.signOut()\n },\n })\n}\n\nexport type ApiStreamResponse = ReadableStream<Uint8Array>\n\n/** 网络请求(流式) */\nexport async function requestStream(lumi: LumiClient, uri: string, options: FetchOptions<'stream'> = {}): Promise<ApiStreamResponse> {\n beforeRequest(lumi, uri, options, true)\n\n const stream = await ofetch(uri, {\n baseURL: lumi.config.apiBaseUrl,\n ...options,\n responseType: 'stream',\n })\n\n return stream\n}\n","export function getIcon(): string | null {\n return document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]')?.href ?? null\n}\n\nexport function getTitle(): string | null {\n return document.title ?? null\n}\n\nexport const isServer = typeof window === 'undefined' && globalThis.navigator?.product !== 'ReactNative'\n\nexport function delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nexport function getEnv(key: string): string | null {\n return typeof process !== 'undefined' ? process?.env[key] ?? null : null\n}\n","import type { StorageKey } from '@/constants'\nimport type { LumiClient } from '@/core/lumi-client'\n\nexport function setStorage<T>(lumi: LumiClient, key: StorageKey, value: T): void {\n const storage = lumi.config.storageAdapter.storage\n if (value !== null)\n storage.setItem(key, JSON.stringify(value))\n else\n storage.removeItem(key)\n}\n\nexport function getStorage<T>(lumi: LumiClient, key: StorageKey): T | null {\n const storage = lumi.config.storageAdapter.storage\n const value = storage.getItem(key)\n try {\n return value ? JSON.parse(value) : null\n }\n catch {\n return null\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, PaginationData } from '@/lib/request'\nimport { request } from '@/lib/request'\n\nexport interface Entity extends Record<string, any> {\n id: string\n}\n\nexport class EntityClient {\n readonly #lumi: LumiClient\n public readonly entityName: string\n\n constructor(lumi: LumiClient, entityName: string) {\n this.#lumi = lumi\n this.entityName = entityName\n }\n\n /** 查询文档列表 */\n public async list({ filter, sort, limit, skip }: {\n filter?: any\n sort?: Record<string, 1 | -1>\n limit?: number\n skip?: number\n } = {}): Promise<PaginationData<Entity>> {\n if (!limit) {\n const res = await request<ApiResponse<Entity[]>>(this.#lumi, this.uri('/list'), {\n method: 'POST',\n body: { filter, sort },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return {\n total: res.data.length,\n list: res.data,\n }\n }\n else {\n const res = await request<ApiResponse<PaginationData<Entity>>>(this.#lumi, this.uri('/listByPage'), {\n method: 'POST',\n body: { filter, sort, limit, skip },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n }\n\n /** 获取单个文档 */\n public async get(id: string): Promise<Entity | null> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(`/${id}`), {\n method: 'GET',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 创建文档 */\n public async create(data: Record<string, any>): Promise<Entity> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(), {\n method: 'POST',\n body: data,\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 批量创建文档 */\n public async createMany(data: Record<string, any>[]): Promise<Entity[]> {\n const res = await request<ApiResponse<Entity[]>>(this.#lumi, this.uri('/batch'), {\n method: 'POST',\n body: data,\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 更新文档 */\n public async update(id: string, data: Record<string, any>): Promise<Entity> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(), {\n method: 'PUT',\n body: { filter: { _id: id }, update: data },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 删除文档 */\n public async delete(id: string): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, this.uri(`/${id}`), {\n method: 'DELETE',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n }\n\n /** 批量删除文档 */\n public async deleteMany(ids: string[]): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, this.uri('/batch-by-ids'), {\n method: 'DELETE',\n params: { ids },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n }\n\n private uri(suffix = ''): string {\n return `/lm/${this.#lumi.config.projectId}/${this.entityName}/documents${suffix}`\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport { EntityClient } from '@/core/entity-client'\n\nexport class EntitiesClient {\n readonly #lumi: LumiClient\n [key: string]: EntityClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n return new Proxy(this, {\n get(target: EntitiesClient, p: string) {\n if (!(p in target))\n target[p] = new EntityClient(target.#lumi, p)\n return target[p]\n },\n }) as this\n }\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { LumiClient } from '@/core/lumi-client'\nimport { ofetch } from 'ofetch'\n\nexport class FunctionsClient {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n public invoke(functionName: string, options: FetchOptions = {}): Promise<any> {\n if (this.#lumi.auth.accessToken) {\n options.headers = {\n Authorization: `Bearer ${this.#lumi.auth.accessToken}`,\n ...options.headers,\n }\n }\n\n return ofetch(`/v1/functions/${this.#lumi.config.projectId}/${functionName}`, {\n baseURL: this.#lumi.config.apiBaseUrl,\n ...options,\n })\n }\n}\n","export interface StorageAdapter {\n storage: {\n getItem: (key: string) => string | null\n setItem: (key: string, value: string) => void\n removeItem: (key: string) => void\n }\n listen: (callback: (key: string | null, value: string | null) => void) => () => void\n}\n\nexport function createDefaultStorageAdapter(): StorageAdapter {\n return {\n storage: {\n getItem: key => localStorage.getItem(key),\n setItem: (key, value) => {\n localStorage.setItem(key, value)\n window.dispatchEvent(new StorageEvent('storage', {\n key,\n oldValue: null,\n newValue: value,\n storageArea: localStorage,\n }))\n },\n removeItem: (key) => {\n localStorage.removeItem(key)\n window.dispatchEvent(new StorageEvent('storage', {\n key,\n oldValue: null,\n newValue: null,\n storageArea: localStorage,\n }))\n },\n },\n listen: (callback) => {\n const handler = (e: StorageEvent): void => {\n callback(e.key, e.newValue)\n }\n window.addEventListener('storage', handler)\n return () => window.removeEventListener('storage', handler)\n },\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, ApiStreamResponse } from '@/lib/request'\nimport { EventSourceParserStream } from 'eventsource-parser/stream'\nimport { LumiError } from '@/lib/error'\nimport { requestStream } from '@/lib/request'\nimport { request } from '@/lib/request'\nimport { delay, getEnv, isServer } from '@/utils/common'\n\nexport interface MessageMedia {\n mimeType: string\n url: string\n}\n\nexport interface Message {\n role: 'system' | 'user' | 'assistant'\n content: string\n medias?: MessageMedia[]\n}\n\nexport interface GenerateTextResult {\n chatId: string\n content: string\n}\n\nexport interface GenerateImageResult {\n chatId: string\n messageId: string\n generationStatus: 'PROCESSING' | 'SUCCESS' | 'FAILED'\n content?: string\n imageURL?: string\n}\n\nexport interface StreamChunk<T> {\n event?: string\n data: T\n}\n\nexport class AITool {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** AI 生成文本 */\n public async generateText({\n model = 'gemini-2.5-flash',\n messages,\n }: {\n model?: string\n messages: Message[]\n }): Promise<GenerateTextResult> {\n const lumiApiKey = this.checkLumiApiKey()\n\n const res = await request<ApiResponse<GenerateTextResult>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/ai/chat/completions`, {\n method: 'POST',\n body: {\n lumiApiKey,\n modelName: model,\n chatMessages: messages,\n },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n\n return res.data\n }\n\n /** AI 生成文本(流式输出) */\n public async generateTextStream({\n model = 'gemini-2.5-flash',\n messages,\n }: {\n model?: string\n messages: Message[]\n }): Promise<ApiStreamResponse> {\n const lumiApiKey = this.checkLumiApiKey()\n\n return requestStream(this.#lumi, `/lm/${this.#lumi.config.projectId}/ai/chat/stream`, {\n method: 'POST',\n body: {\n lumiApiKey,\n modelName: model,\n chatMessages: messages,\n },\n })\n }\n\n /** AI 生成图片 */\n public async generateImage({\n model = 'gemini-2.5-flash-image',\n messages,\n }: {\n model?: string\n messages: Message[]\n }): Promise<GenerateImageResult> {\n const lumiApiKey = this.checkLumiApiKey()\n\n const { code, message, data } = await request<ApiResponse<GenerateImageResult>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/ai/image/task`, {\n method: 'POST',\n body: {\n lumiApiKey,\n modelName: model,\n chatMessages: messages,\n },\n })\n if (code !== 200)\n throw new LumiError(code, message)\n\n let result = data\n let delayMs = 1000\n\n // 轮询生成结果\n while (result.generationStatus === 'PROCESSING') {\n await delay(delayMs)\n if (delayMs < 5000)\n delayMs += 500\n\n const { code, message, data } = await request<ApiResponse<GenerateImageResult>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/ai/image/get`, {\n method: 'POST',\n body: {\n lumiApiKey,\n messageId: result.messageId,\n },\n })\n if (code !== 200)\n throw new LumiError(code, message)\n result = data\n }\n\n return result\n }\n\n /** 解析流式输出(将原始 SSE 流解析为 GenerateTextResult 块) */\n public async parseStream(stream: ApiStreamResponse): Promise<ReadableStream<StreamChunk<GenerateTextResult>>> {\n return stream\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream())\n .pipeThrough<StreamChunk<GenerateTextResult>>(new TransformStream({\n transform: (chunk, controller) => {\n try {\n const data = JSON.parse(chunk.data)\n controller.enqueue({\n event: chunk.event,\n data,\n })\n }\n catch {\n console.error(`Parse stream chunk failed: Invalid JSON.\\n${chunk.data}`)\n }\n },\n }))\n }\n\n private checkLumiApiKey(): string {\n if (!isServer)\n throw new LumiError(10400, 'lumi.tools.ai is only available on the server-side')\n\n const lumiApiKey = getEnv('LUMI_API_KEY')\n if (!lumiApiKey)\n throw new LumiError(10400, 'LUMI_API_KEY is required')\n\n return lumiApiKey\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/lib/request'\nimport { LumiError } from '@/lib/error'\nimport { request } from '@/lib/request'\n\nexport class EmailTool {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** 发送邮件 */\n public async send({ to, subject, fromName, html, text = '', replyTo, scheduledAt }: {\n to: string | string[]\n subject: string\n fromName?: string\n html?: string\n text?: string\n replyTo?: string | string[]\n scheduledAt?: string\n }): Promise<void> {\n if (!to || !subject || (!html && !text))\n throw new Error('Failed to send email: Missing required parameters.')\n\n if (typeof to === 'string')\n to = [to]\n if (typeof replyTo === 'string')\n replyTo = [replyTo]\n\n const res = await request<ApiResponse<null>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/email/send`, {\n method: 'POST',\n body: { to, subject, fromName, html, text, replyTo, scheduledAt },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/lib/request'\nimport { LumiError } from '@/lib/error'\nimport { request } from '@/lib/request'\n\nexport interface UploadItem {\n fileName: string\n fileUrl?: string\n uploadError?: string\n}\n\nexport class FileTool {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** 上传文件 */\n public async upload(files: File[]): Promise<UploadItem[]> {\n const formData = new FormData()\n files.forEach((file) => {\n formData.append('files', file)\n })\n\n const res = await request<ApiResponse<UploadItem[]>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/file/batch`, {\n method: 'POST',\n body: formData,\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n\n return res.data\n }\n\n /** 批量删除文件 */\n public async delete(fileUrls: string[]): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/file/batch`, {\n method: 'DELETE',\n body: { fileUrls },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport { AITool, EmailTool, FileTool } from '@/tools'\n\nexport class ToolsClient {\n readonly #lumi: LumiClient\n\n public email: EmailTool\n public file: FileTool\n public ai: AITool\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n this.email = new EmailTool(lumi)\n this.file = new FileTool(lumi)\n this.ai = new AITool(lumi)\n }\n}\n","import type { StorageAdapter } from '@/adapters/storage'\nimport type { Optional } from '@/types/utils'\nimport { createDefaultStorageAdapter } from '@/adapters/storage'\nimport { LumiAuthClient } from '@/core/auth-client'\nimport { EntitiesClient } from '@/core/entities-client'\nimport { FunctionsClient } from '@/core/functions-client'\nimport { ToolsClient } from '@/core/tools-client'\n\nexport interface LumiClientConfig {\n projectId: string\n apiBaseUrl: string\n authOrigin: string\n storageAdapter: StorageAdapter\n authorization?: string\n}\n\nexport class LumiClient {\n public config: LumiClientConfig\n\n public auth: LumiAuthClient\n public entities: EntitiesClient\n public tools: ToolsClient\n public functions: FunctionsClient\n\n constructor(config: Optional<LumiClientConfig, 'storageAdapter'>) {\n config.storageAdapter ??= createDefaultStorageAdapter()\n\n this.config = config as LumiClientConfig\n this.auth = new LumiAuthClient(this)\n this.entities = new EntitiesClient(this)\n this.tools = new ToolsClient(this)\n this.functions = new FunctionsClient(this)\n }\n}\n\nexport function createClient(config: Optional<LumiClientConfig, 'storageAdapter'>): LumiClient {\n return new LumiClient(config)\n}\n"],"mappings":"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","names":["index_exports","__export","AITool","EmailTool","EntitiesClient","EntityClient","FileTool","FunctionsClient","LumiAuthClient","LumiClient","ToolsClient","createClient","__toCommonJS","import_sha256","import_uuid","LumiError","code","message","import_enc_base64","import_enc_hex","import_hmac_sha256","import_sha256","import_object_hash","import_ofetch","getIcon","_a","_b","getTitle","isServer","delay","ms","resolve","getEnv","key","SECRET_KEY","rfc3986Encode","str","c","addSignature","options","timestamp","nonce","queryParams","__spreadValues","canonicalQueryString","key","headersToSign","canonicalHeaders","payload","hashedPayload","SHA256","Hex","canonicalRequest","signature","Base64","HmacSHA256","headers","value","requestMap","checkRateLimit","uri","_a","clonedOptions","requestHash","hash","now","requestQueue","time","LumiError","beforeRequest","lumi","stream","topAccessKey","getEnv","request","isAuthenticated","__spreadProps","response","isServer","requestStream","_0","_1","__async","setStorage","lumi","key","value","storage","getStorage","e","_lumi","_popupName","_user","_LumiAuthClient_instances","openAuthPopup_fn","LumiAuthClient","lumi","__privateAdd","__privateSet","isServer","authorization","__privateGet","getStorage","accessToken","setStorage","user","__privateMethod","_0","__async","email","password","res","request","SHA256","LumiError","type","otp","userName","newPassword","provider","callback","unlisten","key","url","width","height","left","top","popup","cleanup","resolve","reject","timer","handleGlobalClick","event","handleMessage","data","origin","source","getIcon","getTitle","_lumi","EntityClient","lumi","entityName","__privateAdd","__privateSet","__async","filter","sort","limit","skip","res","request","__privateGet","id","data","ids","suffix","_lumi","EntitiesClient","lumi","__privateAdd","__privateSet","target","p","EntityClient","__privateGet","import_ofetch","_lumi","FunctionsClient","lumi","__privateAdd","__privateSet","functionName","options","__privateGet","__spreadValues","createDefaultStorageAdapter","key","value","callback","handler","e","import_stream","_lumi","AITool","lumi","__privateAdd","__privateSet","_0","__async","model","messages","lumiApiKey","res","request","__privateGet","LumiError","requestStream","code","message","data","result","delayMs","delay","stream","chunk","controller","e","isServer","getEnv","_lumi","EmailTool","lumi","__privateAdd","__privateSet","_0","__async","to","subject","fromName","html","text","replyTo","scheduledAt","res","request","__privateGet","LumiError","_lumi","FileTool","lumi","__privateAdd","__privateSet","files","__async","formData","file","res","request","__privateGet","LumiError","fileUrls","_lumi","ToolsClient","lumi","__privateAdd","__privateSet","EmailTool","FileTool","AITool","LumiClient","config","_a","createDefaultStorageAdapter","LumiAuthClient","EntitiesClient","ToolsClient","FunctionsClient","createClient"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/auth-client.ts","../src/lib/error.ts","../src/lib/request.ts","../src/utils/common.ts","../src/utils/storage.ts","../src/core/entity-client.ts","../src/core/entities-client.ts","../src/core/functions-client.ts","../src/adapters/storage.ts","../src/tools/ai-tool.ts","../src/tools/email-tool.ts","../src/tools/file-tool.ts","../src/core/tools-client.ts","../src/core/lumi-client.ts"],"sourcesContent":["export * from './core/auth-client'\nexport * from './core/entities-client'\nexport * from './core/entity-client'\nexport * from './core/functions-client'\nexport * from './core/lumi-client'\nexport * from './core/tools-client'\nexport * from './tools'\nexport * from './types'\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, User, UserWithToken } from '@/types'\nimport SHA256 from 'crypto-js/sha256'\nimport { v4 } from 'uuid'\nimport { LumiError } from '@/lib/error'\nimport { request } from '@/lib/request'\nimport { getIcon, getTitle, isServer } from '@/utils/common'\nimport { getStorage, setStorage, StorageKey } from '@/utils/storage'\n\ntype OAuthProvider = 'google'\ntype OtpType = 'register' | 'resetPassword'\n\nenum ReceiveMessageType {\n READY = 'lumi-ready',\n SIGN_IN = 'lumi-sign-in',\n SIGN_IN_FAILED = 'lumi-sign-in-failed',\n}\n\nenum SendMessageType {\n INIT = 'lumi-init',\n}\n\ninterface MessageSignInData {\n projectId: string\n accessToken: string\n user: User\n}\n\ntype MessageDataReceive = {\n type: ReceiveMessageType.READY | ReceiveMessageType.SIGN_IN_FAILED\n} | {\n type: ReceiveMessageType.SIGN_IN\n data: MessageSignInData\n}\n\ninterface MessageInitData {\n projectId: string\n icon: string | null\n title: string | null\n}\n\ninterface MessageDataSend {\n type: SendMessageType.INIT\n data: MessageInitData\n}\n\nexport class LumiAuthClient {\n readonly #lumi: LumiClient\n readonly #popupName: string = `lumi-auth-${v4()}`\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n Promise.resolve().then(() => {\n if (!isServer && this.isAuthenticated)\n void this.refreshUser()\n })\n }\n\n /** 访问令牌 */\n public get accessToken(): string | null {\n if (isServer) {\n const authorization = this.#lumi.config.authorization\n return authorization ? authorization.replace('Bearer ', '') : null\n }\n return getStorage<string>(this.#lumi, StorageKey.ACCESS_TOKEN)\n }\n\n public set accessToken(accessToken: string | null) {\n if (isServer) {\n this.#lumi.config.authorization = accessToken ? `Bearer ${accessToken}` : undefined\n return\n }\n setStorage(this.#lumi, StorageKey.ACCESS_TOKEN, accessToken)\n }\n\n #user: User | null = null\n\n /** 用户 */\n public get user(): User | null {\n if (isServer)\n return this.#user\n return getStorage<User>(this.#lumi, StorageKey.USER)\n }\n\n public set user(user: User | null) {\n if (isServer) {\n this.#user = user\n return\n }\n setStorage(this.#lumi, StorageKey.USER, user)\n }\n\n public get isAuthenticated(): boolean {\n return !!this.accessToken\n }\n\n /** 登录 */\n public signIn(): Promise<MessageSignInData> {\n return this.#openAuthPopup(this.#lumi.config.authOrigin)\n }\n\n /** 使用密码登录 */\n public async signInWithPassword({\n email,\n password,\n }: {\n email: string\n password: string\n }): Promise<MessageSignInData> {\n const res = await request<ApiResponse<UserWithToken>>(this.#lumi, '/lm/user/password/login', {\n method: 'POST',\n body: {\n projectId: this.#lumi.config.projectId,\n email,\n password: SHA256(password).toString(),\n },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n\n this.accessToken = res.data.userToken\n this.user = res.data\n\n return {\n projectId: this.#lumi.config.projectId,\n accessToken: res.data.userToken,\n user: res.data,\n }\n }\n\n /** 发送验证码 */\n public async sendOtp({\n email,\n type,\n }: {\n email: string\n type: OtpType\n }): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, '/lm/user/email/code/send', {\n method: 'POST',\n body: {\n projectId: this.#lumi.config.projectId,\n email,\n emailType: type,\n },\n })\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n\n /** 使用密码注册 */\n public async signUpWithPassword({\n email,\n password,\n otp,\n userName,\n }: {\n email: string\n password: string\n otp: string\n userName?: string\n }): Promise<MessageSignInData> {\n const res = await request<ApiResponse<UserWithToken>>(this.#lumi, '/lm/user/password/register', {\n method: 'POST',\n body: {\n projectId: this.#lumi.config.projectId,\n email,\n password: SHA256(password).toString(),\n code: otp,\n userName,\n },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n\n this.accessToken = res.data.userToken\n this.user = res.data\n\n return {\n projectId: this.#lumi.config.projectId,\n accessToken: res.data.userToken,\n user: res.data,\n }\n }\n\n /** 重置密码 */\n public async resetPassword({\n email,\n newPassword,\n otp,\n }: {\n email: string\n newPassword: string\n otp: string\n }): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, '/lm/user/password/reset', {\n method: 'POST',\n body: {\n projectId: this.#lumi.config.projectId,\n email,\n newPassword: SHA256(newPassword).toString(),\n code: otp,\n },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n\n /** 第三方登录 */\n public signInWithOAuth({\n provider,\n }: {\n provider: OAuthProvider\n }): Promise<MessageSignInData> {\n return this.#openAuthPopup(`${this.#lumi.config.authOrigin}/oauth/${provider}`)\n }\n\n /** 退出登录 */\n public signOut(): void {\n if (isServer)\n throw new Error('auth.signOut() can only be called on the client side')\n\n this.accessToken = null\n this.user = null\n }\n\n /** 获取当前用户 */\n public async refreshUser(): Promise<User> {\n const res = await request<ApiResponse<User>>(this.#lumi, '/lm/user/info', {\n method: 'POST',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n this.user = res.data\n return res.data\n }\n\n /** 监听登录状态变化 */\n public onAuthChange(callback: (args: {\n isAuthenticated: boolean\n user: User | null\n }) => void): () => void {\n if (isServer)\n throw new Error('auth.onAuthChange() can only be called on the client side')\n\n const unlisten = this.#lumi.config.storageAdapter.listen((key): void => {\n if (key === StorageKey.ACCESS_TOKEN || key === StorageKey.USER || !key) {\n callback({\n isAuthenticated: this.isAuthenticated,\n user: this.user,\n })\n }\n })\n\n return () => unlisten()\n }\n\n /** 打开认证弹窗并处理消息 */\n #openAuthPopup(url: string): Promise<MessageSignInData> {\n if (isServer)\n throw new LumiError(10400, 'This method can only be called on the client side')\n\n const width = 800\n const height = 600\n const left = (window.screen.width - width) / 2\n const top = (window.screen.height - height) / 2\n const popup = window.open(url, this.#popupName, `width=${width},height=${height},left=${left},top=${top}`)\n\n let cleanup: () => void\n return new Promise<MessageSignInData>((resolve, reject) => {\n if (!popup)\n return reject(new LumiError(10500, 'Open auth window failed'))\n\n const timer = setInterval(() => {\n if (popup.closed)\n reject(new LumiError(10499, 'Auth window closed'))\n }, 1000)\n\n const handleGlobalClick = (event: MouseEvent): void => {\n if (!popup.closed) {\n popup.focus()\n event.stopPropagation()\n event.preventDefault()\n }\n }\n\n const handleMessage = ({ data, origin, source }: MessageEvent<MessageDataReceive | null>): void => {\n if (origin !== this.#lumi.config.authOrigin || source !== popup)\n return\n\n switch (data?.type) {\n case ReceiveMessageType.READY: {\n popup.postMessage({\n type: SendMessageType.INIT,\n data: {\n projectId: this.#lumi.config.projectId,\n icon: getIcon(),\n title: getTitle(),\n },\n } satisfies MessageDataSend, this.#lumi.config.authOrigin)\n break\n }\n case ReceiveMessageType.SIGN_IN: {\n if (data.data.projectId !== this.#lumi.config.projectId)\n break\n popup.close()\n window.focus()\n this.accessToken = data.data.accessToken\n this.user = data.data.user\n resolve(data.data)\n break\n }\n }\n }\n\n window.addEventListener('message', handleMessage)\n document.addEventListener('click', handleGlobalClick, true)\n\n cleanup = () => {\n clearInterval(timer)\n window.removeEventListener('message', handleMessage)\n document.removeEventListener('click', handleGlobalClick, true)\n }\n }).finally(() => cleanup?.())\n }\n}\n","export class LumiError extends Error {\n name: string = 'LumiError'\n code: number\n\n constructor(code: number, message: string) {\n super(message)\n this.code = code\n }\n}\n","import type { FetchOptions, ResponseType } from 'ofetch'\nimport type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, ApiStreamResponse } from '@/types'\nimport Base64 from 'crypto-js/enc-base64'\nimport Hex from 'crypto-js/enc-hex'\nimport HmacSHA256 from 'crypto-js/hmac-sha256'\nimport SHA256 from 'crypto-js/sha256'\nimport hash from 'object-hash'\nimport { ofetch } from 'ofetch'\nimport { LumiError } from '@/lib/error'\nimport { getEnv, isServer } from '@/utils/common'\n\nconst SECRET_KEY = '6QrJZ7pFCmBZAeIJF7IArvkCz+EtzA0RVcpHkiQIsQyhs7QtCS9P+CueZdHfB2OtJcgX3BbqY9pfpWeAVTqCwQ=='\n\n/** RFC 3986 compliant URI encoding */\nfunction rfc3986Encode(str: string): string {\n return encodeURIComponent(str).replace(/[!'()*]/g, c => `%${c.charCodeAt(0).toString(16).toUpperCase()}`)\n}\n\n/** 添加签名 */\nfunction addSignature<T extends ResponseType>(options: FetchOptions<T>): void {\n // 生成签名\n const timestamp = Math.floor(Date.now() / 1000).toString()\n const nonce = Math.random().toString(36).substring(2, 15)\n\n // 构建查询字符串\n const queryParams: Record<string, string> = { ...options.query, ...options.params }\n const canonicalQueryString = Object.keys(queryParams).sort().map(key => `${rfc3986Encode(key)}=${rfc3986Encode(String(queryParams[key]))}`).join('&')\n\n // 构建签名头\n const headersToSign: Record<string, string> = {\n 'x-timestamp': timestamp,\n 'x-nonce': nonce,\n }\n const canonicalHeaders = Object.keys(headersToSign).sort().map(key => `${key}:${headersToSign[key]}`).join('\\n')\n\n // 构建载荷哈希\n const payload = (options.body && !(options.body instanceof FormData)) ? JSON.stringify(options.body) : ''\n const hashedPayload = SHA256(payload).toString(Hex)\n\n // 构建规范请求\n const canonicalRequest = [canonicalQueryString, canonicalHeaders, hashedPayload].join('\\n')\n\n // 生成签名\n const signature = Base64.stringify(HmacSHA256(canonicalRequest, SECRET_KEY))\n\n // 添加签名头到请求\n const headers = new Headers(options.headers)\n Object.entries(headersToSign).forEach(([key, value]) => {\n headers.set(key, value)\n })\n headers.set('X-Sign', signature)\n options.headers = headers\n}\n\nconst requestMap = new Map<string, number[]>()\n\n/** 限制请求频率,相同参数的请求每秒只能发送4次 */\nfunction checkRateLimit<T extends ResponseType>(uri: string, options: FetchOptions<T>): void {\n const clonedOptions = { ...options }\n\n if (options.body instanceof FormData)\n clonedOptions.body = Array.from(options.body.entries())\n\n clonedOptions.headers = undefined\n\n const requestHash = hash([uri, clonedOptions])\n const now = Date.now()\n const requestQueue = requestMap.get(requestHash)?.filter(time => now - time < 1000) || []\n if (requestQueue.length >= 4)\n throw new LumiError(10429, 'Too many requests')\n requestQueue.push(now)\n requestMap.set(requestHash, requestQueue)\n}\n\nfunction beforeRequest<T extends ResponseType>(lumi: LumiClient, uri: string, options: FetchOptions<T>, stream: boolean = false): void {\n options.headers = new Headers(options.headers)\n\n // 添加认证头(如果存在)\n if (lumi.auth.accessToken)\n options.headers.set('Authorization', `Bearer ${lumi.auth.accessToken}`)\n\n // Function 内获取最高权限\n const topAccessKey = getEnv('TOP_ACCESS_KEY')\n if (topAccessKey)\n options.headers.set('X-Top-Access', topAccessKey)\n\n // 添加流式请求头\n if (stream) {\n if (!options.headers.get('Accept'))\n options.headers.set('Accept', 'text/event-stream')\n if (!options.headers.get('Cache-Control'))\n options.headers.set('Cache-Control', 'no-cache')\n if (!options.headers.get('X-Accel-Buffering'))\n options.headers.set('X-Accel-Buffering', 'no')\n }\n\n // 限制请求频率\n checkRateLimit(uri, options)\n\n // 添加签名\n addSignature(options)\n}\n\n/** 网络请求 */\nexport function request<T>(lumi: LumiClient, uri: string, options: FetchOptions<'json'> = {}): Promise<T> {\n beforeRequest(lumi, uri, options)\n\n const isAuthenticated = lumi.auth.isAuthenticated\n\n return ofetch<T>(uri, {\n baseURL: lumi.config.apiBaseUrl,\n ...options,\n onResponse: ({ response }) => {\n // 若 Token 失效则退出登录\n if (!isServer && isAuthenticated && (response._data as ApiResponse<any>)?.code === 2100)\n lumi.auth.signOut()\n },\n })\n}\n\n/** 网络请求(流式) */\nexport async function requestStream(lumi: LumiClient, uri: string, options: FetchOptions<'stream'> = {}): Promise<ApiStreamResponse> {\n beforeRequest(lumi, uri, options, true)\n\n const stream = await ofetch(uri, {\n baseURL: lumi.config.apiBaseUrl,\n ...options,\n responseType: 'stream',\n })\n\n return stream\n}\n","export function getIcon(): string | null {\n return document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]')?.href ?? null\n}\n\nexport function getTitle(): string | null {\n return document.title ?? null\n}\n\nexport const isServer = typeof window === 'undefined' && globalThis.navigator?.product !== 'ReactNative'\n\nexport function delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nexport function getEnv(key: string): string | null {\n return typeof process !== 'undefined' ? process?.env[key] ?? null : null\n}\n","import type { LumiClient } from '@/core/lumi-client'\n\nexport enum StorageKey {\n ACCESS_TOKEN = 'lumi-access-token',\n USER = 'lumi-user',\n}\n\nexport function setStorage<T>(lumi: LumiClient, key: StorageKey, value: T): void {\n const storage = lumi.config.storageAdapter.storage\n if (value !== null)\n storage.setItem(key, JSON.stringify(value))\n else\n storage.removeItem(key)\n}\n\nexport function getStorage<T>(lumi: LumiClient, key: StorageKey): T | null {\n const storage = lumi.config.storageAdapter.storage\n const value = storage.getItem(key)\n try {\n return value ? JSON.parse(value) : null\n }\n catch {\n return null\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, Entity, PaginationData } from '@/types'\nimport { request } from '@/lib/request'\n\nexport class EntityClient {\n readonly #lumi: LumiClient\n public readonly entityName: string\n\n constructor(lumi: LumiClient, entityName: string) {\n this.#lumi = lumi\n this.entityName = entityName\n }\n\n /** 查询文档列表 */\n public async list({ filter, sort, limit, skip }: {\n filter?: any\n sort?: Record<string, 1 | -1>\n limit?: number\n skip?: number\n } = {}): Promise<PaginationData<Entity>> {\n if (!limit) {\n const res = await request<ApiResponse<Entity[]>>(this.#lumi, this.uri('/list'), {\n method: 'POST',\n body: { filter, sort },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return {\n total: res.data.length,\n list: res.data,\n }\n }\n else {\n const res = await request<ApiResponse<PaginationData<Entity>>>(this.#lumi, this.uri('/listByPage'), {\n method: 'POST',\n body: { filter, sort, limit, skip },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n }\n\n /** 获取单个文档 */\n public async get(id: string): Promise<Entity | null> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(`/${id}`), {\n method: 'GET',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 创建文档 */\n public async create(data: Record<string, any>): Promise<Entity> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(), {\n method: 'POST',\n body: data,\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 批量创建文档 */\n public async createMany(data: Record<string, any>[]): Promise<Entity[]> {\n const res = await request<ApiResponse<Entity[]>>(this.#lumi, this.uri('/batch'), {\n method: 'POST',\n body: data,\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 更新文档 */\n public async update(id: string, data: Record<string, any>): Promise<Entity> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(), {\n method: 'PUT',\n body: { filter: { _id: id }, update: data },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 删除文档 */\n public async delete(id: string): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, this.uri(`/${id}`), {\n method: 'DELETE',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n }\n\n /** 批量删除文档 */\n public async deleteMany(ids: string[]): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, this.uri('/batch-by-ids'), {\n method: 'DELETE',\n params: { ids },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n }\n\n private uri(suffix = ''): string {\n return `/lm/${this.#lumi.config.projectId}/${this.entityName}/documents${suffix}`\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport { EntityClient } from '@/core/entity-client'\n\nexport class EntitiesClient {\n readonly #lumi: LumiClient\n [key: string]: EntityClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n return new Proxy(this, {\n get(target: EntitiesClient, p: string) {\n if (!(p in target))\n target[p] = new EntityClient(target.#lumi, p)\n return target[p]\n },\n }) as this\n }\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { LumiClient } from '@/core/lumi-client'\nimport { ofetch } from 'ofetch'\n\nexport class FunctionsClient {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n public invoke(functionName: string, options: FetchOptions = {}): Promise<any> {\n if (this.#lumi.auth.accessToken) {\n options.headers = {\n Authorization: `Bearer ${this.#lumi.auth.accessToken}`,\n ...options.headers,\n }\n }\n\n return ofetch(`/v1/functions/${this.#lumi.config.projectId}/${functionName}`, {\n baseURL: this.#lumi.config.apiBaseUrl,\n ...options,\n })\n }\n}\n","import type { StorageAdapter } from '@/types'\n\nexport function createDefaultStorageAdapter(): StorageAdapter {\n return {\n storage: {\n getItem: key => localStorage.getItem(key),\n setItem: (key, value) => {\n localStorage.setItem(key, value)\n window.dispatchEvent(new StorageEvent('storage', {\n key,\n oldValue: null,\n newValue: value,\n storageArea: localStorage,\n }))\n },\n removeItem: (key) => {\n localStorage.removeItem(key)\n window.dispatchEvent(new StorageEvent('storage', {\n key,\n oldValue: null,\n newValue: null,\n storageArea: localStorage,\n }))\n },\n },\n listen: (callback) => {\n const handler = (e: StorageEvent): void => {\n callback(e.key, e.newValue)\n }\n window.addEventListener('storage', handler)\n return () => window.removeEventListener('storage', handler)\n },\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, ApiStreamResponse, GenerateImageResult, GenerateTextResult, Message, StreamChunk } from '@/types'\nimport { EventSourceParserStream } from 'eventsource-parser/stream'\nimport { LumiError } from '@/lib/error'\nimport { requestStream } from '@/lib/request'\nimport { request } from '@/lib/request'\nimport { delay, getEnv, isServer } from '@/utils/common'\n\nexport class AITool {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** AI 生成文本 */\n public async generateText({\n model = 'gemini-2.5-flash',\n messages,\n }: {\n model?: string\n messages: Message[]\n }): Promise<GenerateTextResult> {\n const lumiApiKey = this.checkLumiApiKey()\n\n const res = await request<ApiResponse<GenerateTextResult>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/ai/chat/completions`, {\n method: 'POST',\n body: {\n lumiApiKey,\n modelName: model,\n chatMessages: messages,\n },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n\n return res.data\n }\n\n /** AI 生成文本(流式输出) */\n public async generateTextStream({\n model = 'gemini-2.5-flash',\n messages,\n }: {\n model?: string\n messages: Message[]\n }): Promise<ApiStreamResponse> {\n const lumiApiKey = this.checkLumiApiKey()\n\n return requestStream(this.#lumi, `/lm/${this.#lumi.config.projectId}/ai/chat/stream`, {\n method: 'POST',\n body: {\n lumiApiKey,\n modelName: model,\n chatMessages: messages,\n },\n })\n }\n\n /** AI 生成图片 */\n public async generateImage({\n model = 'gemini-2.5-flash-image',\n messages,\n }: {\n model?: string\n messages: Message[]\n }): Promise<GenerateImageResult> {\n const lumiApiKey = this.checkLumiApiKey()\n\n const { code, message, data } = await request<ApiResponse<GenerateImageResult>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/ai/image/task`, {\n method: 'POST',\n body: {\n lumiApiKey,\n modelName: model,\n chatMessages: messages,\n },\n })\n if (code !== 200)\n throw new LumiError(code, message)\n\n let result = data\n let delayMs = 1000\n\n // 轮询生成结果\n while (result.generationStatus === 'PROCESSING') {\n await delay(delayMs)\n if (delayMs < 5000)\n delayMs += 500\n\n const { code, message, data } = await request<ApiResponse<GenerateImageResult>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/ai/image/get`, {\n method: 'POST',\n body: {\n lumiApiKey,\n messageId: result.messageId,\n },\n })\n if (code !== 200)\n throw new LumiError(code, message)\n result = data\n }\n\n return result\n }\n\n /** 解析流式输出(将原始 SSE 流解析为 GenerateTextResult 块) */\n public async parseStream(stream: ApiStreamResponse): Promise<ReadableStream<StreamChunk<GenerateTextResult>>> {\n return stream\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream())\n .pipeThrough<StreamChunk<GenerateTextResult>>(new TransformStream({\n transform: (chunk, controller) => {\n try {\n const data = JSON.parse(chunk.data)\n controller.enqueue({\n event: chunk.event,\n data,\n })\n }\n catch {\n console.error(`Parse stream chunk failed: Invalid JSON.\\n${chunk.data}`)\n }\n },\n }))\n }\n\n private checkLumiApiKey(): string {\n if (!isServer)\n throw new LumiError(10400, 'lumi.tools.ai is only available on the server-side')\n\n const lumiApiKey = getEnv('LUMI_API_KEY')\n if (!lumiApiKey)\n throw new LumiError(10400, 'LUMI_API_KEY is required')\n\n return lumiApiKey\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/types'\nimport { LumiError } from '@/lib/error'\nimport { request } from '@/lib/request'\n\nexport class EmailTool {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** 发送邮件 */\n public async send({ to, subject, fromName, html, text = '', replyTo, scheduledAt }: {\n to: string | string[]\n subject: string\n fromName?: string\n html?: string\n text?: string\n replyTo?: string | string[]\n scheduledAt?: string\n }): Promise<void> {\n if (!to || !subject || (!html && !text))\n throw new Error('Failed to send email: Missing required parameters.')\n\n if (typeof to === 'string')\n to = [to]\n if (typeof replyTo === 'string')\n replyTo = [replyTo]\n\n const res = await request<ApiResponse<null>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/email/send`, {\n method: 'POST',\n body: { to, subject, fromName, html, text, replyTo, scheduledAt },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, UploadItem } from '@/types'\nimport { LumiError } from '@/lib/error'\nimport { request } from '@/lib/request'\n\nexport class FileTool {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** 上传文件 */\n public async upload(files: File[]): Promise<UploadItem[]> {\n const formData = new FormData()\n files.forEach((file) => {\n formData.append('files', file)\n })\n\n const res = await request<ApiResponse<UploadItem[]>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/file/batch`, {\n method: 'POST',\n body: formData,\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n\n return res.data\n }\n\n /** 批量删除文件 */\n public async delete(fileUrls: string[]): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/file/batch`, {\n method: 'DELETE',\n body: { fileUrls },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport { AITool, EmailTool, FileTool } from '@/tools'\n\nexport class ToolsClient {\n readonly #lumi: LumiClient\n\n public email: EmailTool\n public file: FileTool\n public ai: AITool\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n this.email = new EmailTool(lumi)\n this.file = new FileTool(lumi)\n this.ai = new AITool(lumi)\n }\n}\n","import type { LumiClientConfig } from '@/types'\nimport type { Optional } from '@/types/utils'\nimport { createDefaultStorageAdapter } from '@/adapters/storage'\nimport { LumiAuthClient } from '@/core/auth-client'\nimport { EntitiesClient } from '@/core/entities-client'\nimport { FunctionsClient } from '@/core/functions-client'\nimport { ToolsClient } from '@/core/tools-client'\n\nexport class LumiClient {\n public config: LumiClientConfig\n\n public auth: LumiAuthClient\n public entities: EntitiesClient\n public tools: ToolsClient\n public functions: FunctionsClient\n\n constructor(config: Optional<LumiClientConfig, 'storageAdapter'>) {\n config.storageAdapter ??= createDefaultStorageAdapter()\n\n this.config = config as LumiClientConfig\n this.auth = new LumiAuthClient(this)\n this.entities = new EntitiesClient(this)\n this.tools = new ToolsClient(this)\n this.functions = new FunctionsClient(this)\n }\n}\n\nexport function createClient(config: Optional<LumiClientConfig, 'storageAdapter'>): LumiClient {\n return new LumiClient(config)\n}\n"],"mappings":"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","names":["index_exports","__export","AITool","EmailTool","EntitiesClient","EntityClient","FileTool","FunctionsClient","LumiAuthClient","LumiClient","ToolsClient","createClient","__toCommonJS","import_sha256","import_uuid","LumiError","code","message","import_enc_base64","import_enc_hex","import_hmac_sha256","import_sha256","import_object_hash","import_ofetch","getIcon","_a","_b","getTitle","isServer","delay","ms","resolve","getEnv","key","SECRET_KEY","rfc3986Encode","str","c","addSignature","options","timestamp","nonce","queryParams","__spreadValues","canonicalQueryString","key","headersToSign","canonicalHeaders","payload","hashedPayload","SHA256","Hex","canonicalRequest","signature","Base64","HmacSHA256","headers","value","requestMap","checkRateLimit","uri","_a","clonedOptions","requestHash","hash","now","requestQueue","time","LumiError","beforeRequest","lumi","stream","topAccessKey","getEnv","request","isAuthenticated","__spreadProps","response","isServer","requestStream","_0","_1","__async","setStorage","lumi","key","value","storage","getStorage","e","_lumi","_popupName","_user","_LumiAuthClient_instances","openAuthPopup_fn","LumiAuthClient","lumi","__privateAdd","__privateSet","isServer","authorization","__privateGet","getStorage","accessToken","setStorage","user","__privateMethod","_0","__async","email","password","res","request","SHA256","LumiError","type","otp","userName","newPassword","provider","callback","unlisten","key","url","width","height","left","top","popup","cleanup","resolve","reject","timer","handleGlobalClick","event","handleMessage","data","origin","source","getIcon","getTitle","_lumi","EntityClient","lumi","entityName","__privateAdd","__privateSet","__async","filter","sort","limit","skip","res","request","__privateGet","id","data","ids","suffix","_lumi","EntitiesClient","lumi","__privateAdd","__privateSet","target","p","EntityClient","__privateGet","import_ofetch","_lumi","FunctionsClient","lumi","__privateAdd","__privateSet","functionName","options","__privateGet","__spreadValues","createDefaultStorageAdapter","key","value","callback","handler","e","import_stream","_lumi","AITool","lumi","__privateAdd","__privateSet","_0","__async","model","messages","lumiApiKey","res","request","__privateGet","LumiError","requestStream","code","message","data","result","delayMs","delay","stream","chunk","controller","e","isServer","getEnv","_lumi","EmailTool","lumi","__privateAdd","__privateSet","_0","__async","to","subject","fromName","html","text","replyTo","scheduledAt","res","request","__privateGet","LumiError","_lumi","FileTool","lumi","__privateAdd","__privateSet","files","__async","formData","file","res","request","__privateGet","LumiError","fileUrls","_lumi","ToolsClient","lumi","__privateAdd","__privateSet","EmailTool","FileTool","AITool","LumiClient","config","_a","createDefaultStorageAdapter","LumiAuthClient","EntitiesClient","ToolsClient","FunctionsClient","createClient"]}
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- var ue=Object.defineProperty,pe=Object.defineProperties;var de=Object.getOwnPropertyDescriptors;var Y=Object.getOwnPropertySymbols;var ge=Object.prototype.hasOwnProperty,he=Object.prototype.propertyIsEnumerable;var X=r=>{throw TypeError(r)};var W=(r,e,t)=>e in r?ue(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,T=(r,e)=>{for(var t in e||(e={}))ge.call(e,t)&&W(r,t,e[t]);if(Y)for(var t of Y(e))he.call(e,t)&&W(r,t,e[t]);return r},G=(r,e)=>pe(r,de(e));var _=(r,e,t)=>e.has(r)||X("Cannot "+t);var i=(r,e,t)=>(_(r,e,"read from private field"),t?t.call(r):e.get(r)),p=(r,e,t)=>e.has(r)?X("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),d=(r,e,t,s)=>(_(r,e,"write to private field"),s?s.call(r,t):e.set(r,t),t),B=(r,e,t)=>(_(r,e,"access private method"),t);var c=(r,e,t)=>new Promise((s,n)=>{var o=h=>{try{g(t.next(h))}catch(f){n(f)}},m=h=>{try{g(t.throw(h))}catch(f){n(f)}},g=h=>h.done?s(h.value):Promise.resolve(h.value).then(o,m);g((t=t.apply(r,e)).next())});import J from"crypto-js/sha256";import{v4 as Ee}from"uuid";var u=class extends Error{constructor(t,s){super(s);this.name="LumiError";this.code=t}};import fe from"crypto-js/enc-base64";import ye from"crypto-js/enc-hex";import we from"crypto-js/hmac-sha256";import Se from"crypto-js/sha256";import be from"object-hash";import{ofetch as ne}from"ofetch";function ee(){var r,e;return(e=(r=document.querySelector('link[rel="icon"]'))==null?void 0:r.href)!=null?e:null}function te(){var r;return(r=document.title)!=null?r:null}var Z,y=typeof window=="undefined"&&((Z=globalThis.navigator)==null?void 0:Z.product)!=="ReactNative";function re(r){return new Promise(e=>setTimeout(e,r))}function O(r){var e;return typeof process!="undefined"&&(e=process==null?void 0:process.env[r])!=null?e:null}var Ae="6QrJZ7pFCmBZAeIJF7IArvkCz+EtzA0RVcpHkiQIsQyhs7QtCS9P+CueZdHfB2OtJcgX3BbqY9pfpWeAVTqCwQ==";function ie(r){return encodeURIComponent(r).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function Te(r){let e=Math.floor(Date.now()/1e3).toString(),t=Math.random().toString(36).substring(2,15),s=T(T({},r.query),r.params),n=Object.keys(s).sort().map(S=>`${ie(S)}=${ie(String(s[S]))}`).join("&"),o={"x-timestamp":e,"x-nonce":t},m=Object.keys(o).sort().map(S=>`${S}:${o[S]}`).join(`
2
- `),g=r.body&&!(r.body instanceof FormData)?JSON.stringify(r.body):"",h=Se(g).toString(ye),f=[n,m,h].join(`
3
- `),R=fe.stringify(we(f,Ae)),I=new Headers(r.headers);Object.entries(o).forEach(([S,b])=>{I.set(S,b)}),I.set("X-Sign",R),r.headers=I}var se=new Map;function Ie(r,e){var m;let t=T({},e);e.body instanceof FormData&&(t.body=Array.from(e.body.entries())),t.headers=void 0;let s=be([r,t]),n=Date.now(),o=((m=se.get(s))==null?void 0:m.filter(g=>n-g<1e3))||[];if(o.length>=4)throw new u(10429,"Too many requests");o.push(n),se.set(s,o)}function oe(r,e,t,s=!1){t.headers=new Headers(t.headers),r.auth.accessToken&&t.headers.set("Authorization",`Bearer ${r.auth.accessToken}`);let n=O("TOP_ACCESS_KEY");n&&t.headers.set("X-Top-Access",n),s&&(t.headers.get("Accept")||t.headers.set("Accept","text/event-stream"),t.headers.get("Cache-Control")||t.headers.set("Cache-Control","no-cache"),t.headers.get("X-Accel-Buffering")||t.headers.set("X-Accel-Buffering","no")),Ie(e,t),Te(t)}function l(r,e,t={}){oe(r,e,t);let s=r.auth.isAuthenticated;return ne(e,G(T({baseURL:r.config.apiBaseUrl},t),{onResponse:({response:n})=>{var o;!y&&s&&((o=n._data)==null?void 0:o.code)===2100&&r.auth.signOut()}}))}function ae(s,n){return c(this,arguments,function*(r,e,t={}){return oe(r,e,t,!0),yield ne(e,G(T({baseURL:r.config.apiBaseUrl},t),{responseType:"stream"}))})}function H(r,e,t){let s=r.config.storageAdapter.storage;t!==null?s.setItem(e,JSON.stringify(t)):s.removeItem(e)}function z(r,e){let s=r.config.storageAdapter.storage.getItem(e);try{return s?JSON.parse(s):null}catch(n){return null}}var a,U,P,L,Q,M=class{constructor(e){p(this,L);p(this,a);p(this,U,`lumi-auth-${Ee()}`);p(this,P,null);d(this,a,e),Promise.resolve().then(()=>{!y&&this.isAuthenticated&&this.refreshUser()})}get accessToken(){if(y){let e=i(this,a).config.authorization;return e?e.replace("Bearer ",""):null}return z(i(this,a),"lumi-access-token")}set accessToken(e){if(y){i(this,a).config.authorization=e?`Bearer ${e}`:void 0;return}H(i(this,a),"lumi-access-token",e)}get user(){return y?i(this,P):z(i(this,a),"lumi-user")}set user(e){if(y){d(this,P,e);return}H(i(this,a),"lumi-user",e)}get isAuthenticated(){return!!this.accessToken}signIn(){return B(this,L,Q).call(this,i(this,a).config.authOrigin)}signInWithPassword(s){return c(this,arguments,function*({email:e,password:t}){let n=yield l(i(this,a),"/lm/user/password/login",{method:"POST",body:{projectId:i(this,a).config.projectId,email:e,password:J(t).toString()}});if(n.code!==200)throw new u(n.code,n.message);return{projectId:i(this,a).config.projectId,accessToken:n.data.userToken,user:n.data}})}sendOtp(s){return c(this,arguments,function*({email:e,type:t}){let n=yield l(i(this,a),"/lm/user/email/code/send",{method:"POST",body:{projectId:i(this,a).config.projectId,email:e,emailType:t}});if(n.code!==200)throw new u(n.code,n.message)})}signUpWithPassword(o){return c(this,arguments,function*({email:e,password:t,otp:s,userName:n}){let m=yield l(i(this,a),"/lm/user/password/register",{method:"POST",body:{projectId:i(this,a).config.projectId,email:e,password:J(t).toString(),code:s,userName:n}});if(m.code!==200)throw new u(m.code,m.message)})}resetPassword(n){return c(this,arguments,function*({email:e,newPassword:t,otp:s}){let o=yield l(i(this,a),"/lm/user/password/reset",{method:"POST",body:{projectId:i(this,a).config.projectId,email:e,newPassword:J(t).toString(),code:s}});if(o.code!==200)throw new u(o.code,o.message)})}signInWithOAuth({provider:e}){return B(this,L,Q).call(this,`${i(this,a).config.authOrigin}/oauth/${e}`)}signOut(){if(y)throw new Error("auth.signOut() can only be called on the client side");this.accessToken=null,this.user=null}refreshUser(){return c(this,null,function*(){let e=yield l(i(this,a),"/lm/user/info",{method:"POST"});if(e.code!==200)throw new Error(e.message);return this.user=e.data,e.data})}onAuthChange(e){if(y)throw new Error("auth.onAuthChange() can only be called on the client side");let t=i(this,a).config.storageAdapter.listen(s=>{(s==="lumi-access-token"||s==="lumi-user"||!s)&&e({isAuthenticated:this.isAuthenticated,user:this.user})});return()=>t()}};a=new WeakMap,U=new WeakMap,P=new WeakMap,L=new WeakSet,Q=function(e){if(y)throw new u(10400,"This method can only be called on the client side");let t=800,s=600,n=(window.screen.width-t)/2,o=(window.screen.height-s)/2,m=window.open(e,i(this,U),`width=${t},height=${s},left=${n},top=${o}`),g;return new Promise((h,f)=>{if(!m)return f(new u(10500,"Open auth window failed"));let R=setInterval(()=>{m.closed&&f(new u(10499,"Auth window closed"))},1e3),I=b=>{m.closed||(m.focus(),b.stopPropagation(),b.preventDefault())},S=({data:b,origin:me,source:le})=>{if(!(me!==i(this,a).config.authOrigin||le!==m))switch(b==null?void 0:b.type){case"lumi-ready":{m.postMessage({type:"lumi-init",data:{projectId:i(this,a).config.projectId,icon:ee(),title:te()}},i(this,a).config.authOrigin);break}case"lumi-sign-in":{if(b.data.projectId!==i(this,a).config.projectId)break;m.close(),window.focus(),this.accessToken=b.data.accessToken,this.user=b.data.user,h(b.data);break}}};window.addEventListener("message",S),document.addEventListener("click",I,!0),g=()=>{clearInterval(R),window.removeEventListener("message",S),document.removeEventListener("click",I,!0)}}).finally(()=>g==null?void 0:g())};var w,k=class{constructor(e,t){p(this,w);d(this,w,e),this.entityName=t}list(){return c(this,arguments,function*({filter:e,sort:t,limit:s,skip:n}={}){if(s){let o=yield l(i(this,w),this.uri("/listByPage"),{method:"POST",body:{filter:e,sort:t,limit:s,skip:n}});if(o.code!==200)throw new Error(o.message);return o.data}else{let o=yield l(i(this,w),this.uri("/list"),{method:"POST",body:{filter:e,sort:t}});if(o.code!==200)throw new Error(o.message);return{total:o.data.length,list:o.data}}})}get(e){return c(this,null,function*(){let t=yield l(i(this,w),this.uri(`/${e}`),{method:"GET"});if(t.code!==200)throw new Error(t.message);return t.data})}create(e){return c(this,null,function*(){let t=yield l(i(this,w),this.uri(),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}createMany(e){return c(this,null,function*(){let t=yield l(i(this,w),this.uri("/batch"),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}update(e,t){return c(this,null,function*(){let s=yield l(i(this,w),this.uri(),{method:"PUT",body:{filter:{_id:e},update:t}});if(s.code!==200)throw new Error(s.message);return s.data})}delete(e){return c(this,null,function*(){let t=yield l(i(this,w),this.uri(`/${e}`),{method:"DELETE"});if(t.code!==200)throw new Error(t.message)})}deleteMany(e){return c(this,null,function*(){let t=yield l(i(this,w),this.uri("/batch-by-ids"),{method:"DELETE",params:{ids:e}});if(t.code!==200)throw new Error(t.message)})}uri(e=""){return`/lm/${i(this,w).config.projectId}/${this.entityName}/documents${e}`}};w=new WeakMap;var x,D=class{constructor(e){p(this,x);return d(this,x,e),new Proxy(this,{get(t,s){return s in t||(t[s]=new k(i(t,x),s)),t[s]}})}};x=new WeakMap;import{ofetch as ve}from"ofetch";var E,j=class{constructor(e){p(this,E);d(this,E,e)}invoke(e,t={}){return i(this,E).auth.accessToken&&(t.headers=T({Authorization:`Bearer ${i(this,E).auth.accessToken}`},t.headers)),ve(`/v1/functions/${i(this,E).config.projectId}/${e}`,T({baseURL:i(this,E).config.apiBaseUrl},t))}};E=new WeakMap;function ce(){return{storage:{getItem:r=>localStorage.getItem(r),setItem:(r,e)=>{localStorage.setItem(r,e),window.dispatchEvent(new StorageEvent("storage",{key:r,oldValue:null,newValue:e,storageArea:localStorage}))},removeItem:r=>{localStorage.removeItem(r),window.dispatchEvent(new StorageEvent("storage",{key:r,oldValue:null,newValue:null,storageArea:localStorage}))}},listen:r=>{let e=t=>{r(t.key,t.newValue)};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}}}import{EventSourceParserStream as Re}from"eventsource-parser/stream";var A,N=class{constructor(e){p(this,A);d(this,A,e)}generateText(s){return c(this,arguments,function*({model:e="gemini-2.5-flash",messages:t}){let n=this.checkLumiApiKey(),o=yield l(i(this,A),`/lm/${i(this,A).config.projectId}/ai/chat/completions`,{method:"POST",body:{lumiApiKey:n,modelName:e,chatMessages:t}});if(o.code!==200)throw new u(o.code,o.message);return o.data})}generateTextStream(s){return c(this,arguments,function*({model:e="gemini-2.5-flash",messages:t}){let n=this.checkLumiApiKey();return ae(i(this,A),`/lm/${i(this,A).config.projectId}/ai/chat/stream`,{method:"POST",body:{lumiApiKey:n,modelName:e,chatMessages:t}})})}generateImage(s){return c(this,arguments,function*({model:e="gemini-2.5-flash-image",messages:t}){let n=this.checkLumiApiKey(),{code:o,message:m,data:g}=yield l(i(this,A),`/lm/${i(this,A).config.projectId}/ai/image/task`,{method:"POST",body:{lumiApiKey:n,modelName:e,chatMessages:t}});if(o!==200)throw new u(o,m);let h=g,f=1e3;for(;h.generationStatus==="PROCESSING";){yield re(f),f<5e3&&(f+=500);let{code:R,message:I,data:S}=yield l(i(this,A),`/lm/${i(this,A).config.projectId}/ai/image/get`,{method:"POST",body:{lumiApiKey:n,messageId:h.messageId}});if(R!==200)throw new u(R,I);h=S}return h})}parseStream(e){return c(this,null,function*(){return e.pipeThrough(new TextDecoderStream).pipeThrough(new Re).pipeThrough(new TransformStream({transform:(t,s)=>{try{let n=JSON.parse(t.data);s.enqueue({event:t.event,data:n})}catch(n){console.error(`Parse stream chunk failed: Invalid JSON.
4
- ${t.data}`)}}}))})}checkLumiApiKey(){if(!y)throw new u(10400,"lumi.tools.ai is only available on the server-side");let e=O("LUMI_API_KEY");if(!e)throw new u(10400,"LUMI_API_KEY is required");return e}};A=new WeakMap;var C,$=class{constructor(e){p(this,C);d(this,C,e)}send(h){return c(this,arguments,function*({to:e,subject:t,fromName:s,html:n,text:o="",replyTo:m,scheduledAt:g}){if(!e||!t||!n&&!o)throw new Error("Failed to send email: Missing required parameters.");typeof e=="string"&&(e=[e]),typeof m=="string"&&(m=[m]);let f=yield l(i(this,C),`/lm/${i(this,C).config.projectId}/email/send`,{method:"POST",body:{to:e,subject:t,fromName:s,html:n,text:o,replyTo:m,scheduledAt:g}});if(f.code!==200)throw new u(f.code,f.message)})}};C=new WeakMap;var v,q=class{constructor(e){p(this,v);d(this,v,e)}upload(e){return c(this,null,function*(){let t=new FormData;e.forEach(n=>{t.append("files",n)});let s=yield l(i(this,v),`/lm/${i(this,v).config.projectId}/file/batch`,{method:"POST",body:t});if(s.code!==200)throw new u(s.code,s.message);return s.data})}delete(e){return c(this,null,function*(){let t=yield l(i(this,v),`/lm/${i(this,v).config.projectId}/file/batch`,{method:"DELETE",body:{fileUrls:e}});if(t.code!==200)throw new u(t.code,t.message)})}};v=new WeakMap;var F,K=class{constructor(e){p(this,F);d(this,F,e),this.email=new $(e),this.file=new q(e),this.ai=new N(e)}};F=new WeakMap;var V=class{constructor(e){var t;(t=e.storageAdapter)!=null||(e.storageAdapter=ce()),this.config=e,this.auth=new M(this),this.entities=new D(this),this.tools=new K(this),this.functions=new j(this)}};function Pt(r){return new V(r)}export{N as AITool,$ as EmailTool,D as EntitiesClient,k as EntityClient,q as FileTool,j as FunctionsClient,M as LumiAuthClient,V as LumiClient,K as ToolsClient,Pt as createClient};
1
+ var ue=Object.defineProperty,pe=Object.defineProperties;var de=Object.getOwnPropertyDescriptors;var V=Object.getOwnPropertySymbols;var he=Object.prototype.hasOwnProperty,ge=Object.prototype.propertyIsEnumerable;var X=i=>{throw TypeError(i)};var W=(i,e,t)=>e in i?ue(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t,b=(i,e)=>{for(var t in e||(e={}))he.call(e,t)&&W(i,t,e[t]);if(V)for(var t of V(e))ge.call(e,t)&&W(i,t,e[t]);return i},K=(i,e)=>pe(i,de(e));var G=(i,e,t)=>e.has(i)||X("Cannot "+t);var s=(i,e,t)=>(G(i,e,"read from private field"),t?t.call(i):e.get(i)),p=(i,e,t)=>e.has(i)?X("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(i):e.set(i,t),d=(i,e,t,r)=>(G(i,e,"write to private field"),r?r.call(i,t):e.set(i,t),t),B=(i,e,t)=>(G(i,e,"access private method"),t);var m=(i,e,t)=>new Promise((r,o)=>{var n=g=>{try{h(t.next(g))}catch(f){o(f)}},a=g=>{try{h(t.throw(g))}catch(f){o(f)}},h=g=>g.done?r(g.value):Promise.resolve(g.value).then(n,a);h((t=t.apply(i,e)).next())});import Y from"crypto-js/sha256";import{v4 as Ee}from"uuid";var u=class extends Error{constructor(t,r){super(r);this.name="LumiError";this.code=t}};import fe from"crypto-js/enc-base64";import ye from"crypto-js/enc-hex";import we from"crypto-js/hmac-sha256";import Se from"crypto-js/sha256";import Ae from"object-hash";import{ofetch as oe}from"ofetch";function ee(){var i,e;return(e=(i=document.querySelector('link[rel="icon"]'))==null?void 0:i.href)!=null?e:null}function te(){var i;return(i=document.title)!=null?i:null}var Z,y=typeof window=="undefined"&&((Z=globalThis.navigator)==null?void 0:Z.product)!=="ReactNative";function ie(i){return new Promise(e=>setTimeout(e,i))}function x(i){var e;return typeof process!="undefined"&&(e=process==null?void 0:process.env[i])!=null?e:null}var Te="6QrJZ7pFCmBZAeIJF7IArvkCz+EtzA0RVcpHkiQIsQyhs7QtCS9P+CueZdHfB2OtJcgX3BbqY9pfpWeAVTqCwQ==";function se(i){return encodeURIComponent(i).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function be(i){let e=Math.floor(Date.now()/1e3).toString(),t=Math.random().toString(36).substring(2,15),r=b(b({},i.query),i.params),o=Object.keys(r).sort().map(S=>`${se(S)}=${se(String(r[S]))}`).join("&"),n={"x-timestamp":e,"x-nonce":t},a=Object.keys(n).sort().map(S=>`${S}:${n[S]}`).join(`
2
+ `),h=i.body&&!(i.body instanceof FormData)?JSON.stringify(i.body):"",g=Se(h).toString(ye),f=[o,a,g].join(`
3
+ `),R=fe.stringify(we(f,Te)),I=new Headers(i.headers);Object.entries(n).forEach(([S,A])=>{I.set(S,A)}),I.set("X-Sign",R),i.headers=I}var re=new Map;function Ie(i,e){var a;let t=b({},e);e.body instanceof FormData&&(t.body=Array.from(e.body.entries())),t.headers=void 0;let r=Ae([i,t]),o=Date.now(),n=((a=re.get(r))==null?void 0:a.filter(h=>o-h<1e3))||[];if(n.length>=4)throw new u(10429,"Too many requests");n.push(o),re.set(r,n)}function ne(i,e,t,r=!1){t.headers=new Headers(t.headers),i.auth.accessToken&&t.headers.set("Authorization",`Bearer ${i.auth.accessToken}`);let o=x("TOP_ACCESS_KEY");o&&t.headers.set("X-Top-Access",o),r&&(t.headers.get("Accept")||t.headers.set("Accept","text/event-stream"),t.headers.get("Cache-Control")||t.headers.set("Cache-Control","no-cache"),t.headers.get("X-Accel-Buffering")||t.headers.set("X-Accel-Buffering","no")),Ie(e,t),be(t)}function l(i,e,t={}){ne(i,e,t);let r=i.auth.isAuthenticated;return oe(e,K(b({baseURL:i.config.apiBaseUrl},t),{onResponse:({response:o})=>{var n;!y&&r&&((n=o._data)==null?void 0:n.code)===2100&&i.auth.signOut()}}))}function ae(r,o){return m(this,arguments,function*(i,e,t={}){return ne(i,e,t,!0),yield oe(e,K(b({baseURL:i.config.apiBaseUrl},t),{responseType:"stream"}))})}function H(i,e,t){let r=i.config.storageAdapter.storage;t!==null?r.setItem(e,JSON.stringify(t)):r.removeItem(e)}function J(i,e){let r=i.config.storageAdapter.storage.getItem(e);try{return r?JSON.parse(r):null}catch(o){return null}}var c,k,P,L,z,M=class{constructor(e){p(this,L);p(this,c);p(this,k,`lumi-auth-${Ee()}`);p(this,P,null);d(this,c,e),Promise.resolve().then(()=>{!y&&this.isAuthenticated&&this.refreshUser()})}get accessToken(){if(y){let e=s(this,c).config.authorization;return e?e.replace("Bearer ",""):null}return J(s(this,c),"lumi-access-token")}set accessToken(e){if(y){s(this,c).config.authorization=e?`Bearer ${e}`:void 0;return}H(s(this,c),"lumi-access-token",e)}get user(){return y?s(this,P):J(s(this,c),"lumi-user")}set user(e){if(y){d(this,P,e);return}H(s(this,c),"lumi-user",e)}get isAuthenticated(){return!!this.accessToken}signIn(){return B(this,L,z).call(this,s(this,c).config.authOrigin)}signInWithPassword(r){return m(this,arguments,function*({email:e,password:t}){let o=yield l(s(this,c),"/lm/user/password/login",{method:"POST",body:{projectId:s(this,c).config.projectId,email:e,password:Y(t).toString()}});if(o.code!==200)throw new u(o.code,o.message);return this.accessToken=o.data.userToken,this.user=o.data,{projectId:s(this,c).config.projectId,accessToken:o.data.userToken,user:o.data}})}sendOtp(r){return m(this,arguments,function*({email:e,type:t}){let o=yield l(s(this,c),"/lm/user/email/code/send",{method:"POST",body:{projectId:s(this,c).config.projectId,email:e,emailType:t}});if(o.code!==200)throw new u(o.code,o.message)})}signUpWithPassword(n){return m(this,arguments,function*({email:e,password:t,otp:r,userName:o}){let a=yield l(s(this,c),"/lm/user/password/register",{method:"POST",body:{projectId:s(this,c).config.projectId,email:e,password:Y(t).toString(),code:r,userName:o}});if(a.code!==200)throw new u(a.code,a.message);return this.accessToken=a.data.userToken,this.user=a.data,{projectId:s(this,c).config.projectId,accessToken:a.data.userToken,user:a.data}})}resetPassword(o){return m(this,arguments,function*({email:e,newPassword:t,otp:r}){let n=yield l(s(this,c),"/lm/user/password/reset",{method:"POST",body:{projectId:s(this,c).config.projectId,email:e,newPassword:Y(t).toString(),code:r}});if(n.code!==200)throw new u(n.code,n.message)})}signInWithOAuth({provider:e}){return B(this,L,z).call(this,`${s(this,c).config.authOrigin}/oauth/${e}`)}signOut(){if(y)throw new Error("auth.signOut() can only be called on the client side");this.accessToken=null,this.user=null}refreshUser(){return m(this,null,function*(){let e=yield l(s(this,c),"/lm/user/info",{method:"POST"});if(e.code!==200)throw new Error(e.message);return this.user=e.data,e.data})}onAuthChange(e){if(y)throw new Error("auth.onAuthChange() can only be called on the client side");let t=s(this,c).config.storageAdapter.listen(r=>{(r==="lumi-access-token"||r==="lumi-user"||!r)&&e({isAuthenticated:this.isAuthenticated,user:this.user})});return()=>t()}};c=new WeakMap,k=new WeakMap,P=new WeakMap,L=new WeakSet,z=function(e){if(y)throw new u(10400,"This method can only be called on the client side");let t=800,r=600,o=(window.screen.width-t)/2,n=(window.screen.height-r)/2,a=window.open(e,s(this,k),`width=${t},height=${r},left=${o},top=${n}`),h;return new Promise((g,f)=>{if(!a)return f(new u(10500,"Open auth window failed"));let R=setInterval(()=>{a.closed&&f(new u(10499,"Auth window closed"))},1e3),I=A=>{a.closed||(a.focus(),A.stopPropagation(),A.preventDefault())},S=({data:A,origin:me,source:le})=>{if(!(me!==s(this,c).config.authOrigin||le!==a))switch(A==null?void 0:A.type){case"lumi-ready":{a.postMessage({type:"lumi-init",data:{projectId:s(this,c).config.projectId,icon:ee(),title:te()}},s(this,c).config.authOrigin);break}case"lumi-sign-in":{if(A.data.projectId!==s(this,c).config.projectId)break;a.close(),window.focus(),this.accessToken=A.data.accessToken,this.user=A.data.user,g(A.data);break}}};window.addEventListener("message",S),document.addEventListener("click",I,!0),h=()=>{clearInterval(R),window.removeEventListener("message",S),document.removeEventListener("click",I,!0)}}).finally(()=>h==null?void 0:h())};var w,D=class{constructor(e,t){p(this,w);d(this,w,e),this.entityName=t}list(){return m(this,arguments,function*({filter:e,sort:t,limit:r,skip:o}={}){if(r){let n=yield l(s(this,w),this.uri("/listByPage"),{method:"POST",body:{filter:e,sort:t,limit:r,skip:o}});if(n.code!==200)throw new Error(n.message);return n.data}else{let n=yield l(s(this,w),this.uri("/list"),{method:"POST",body:{filter:e,sort:t}});if(n.code!==200)throw new Error(n.message);return{total:n.data.length,list:n.data}}})}get(e){return m(this,null,function*(){let t=yield l(s(this,w),this.uri(`/${e}`),{method:"GET"});if(t.code!==200)throw new Error(t.message);return t.data})}create(e){return m(this,null,function*(){let t=yield l(s(this,w),this.uri(),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}createMany(e){return m(this,null,function*(){let t=yield l(s(this,w),this.uri("/batch"),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}update(e,t){return m(this,null,function*(){let r=yield l(s(this,w),this.uri(),{method:"PUT",body:{filter:{_id:e},update:t}});if(r.code!==200)throw new Error(r.message);return r.data})}delete(e){return m(this,null,function*(){let t=yield l(s(this,w),this.uri(`/${e}`),{method:"DELETE"});if(t.code!==200)throw new Error(t.message)})}deleteMany(e){return m(this,null,function*(){let t=yield l(s(this,w),this.uri("/batch-by-ids"),{method:"DELETE",params:{ids:e}});if(t.code!==200)throw new Error(t.message)})}uri(e=""){return`/lm/${s(this,w).config.projectId}/${this.entityName}/documents${e}`}};w=new WeakMap;var O,j=class{constructor(e){p(this,O);return d(this,O,e),new Proxy(this,{get(t,r){return r in t||(t[r]=new D(s(t,O),r)),t[r]}})}};O=new WeakMap;import{ofetch as Ce}from"ofetch";var E,N=class{constructor(e){p(this,E);d(this,E,e)}invoke(e,t={}){return s(this,E).auth.accessToken&&(t.headers=b({Authorization:`Bearer ${s(this,E).auth.accessToken}`},t.headers)),Ce(`/v1/functions/${s(this,E).config.projectId}/${e}`,b({baseURL:s(this,E).config.apiBaseUrl},t))}};E=new WeakMap;function ce(){return{storage:{getItem:i=>localStorage.getItem(i),setItem:(i,e)=>{localStorage.setItem(i,e),window.dispatchEvent(new StorageEvent("storage",{key:i,oldValue:null,newValue:e,storageArea:localStorage}))},removeItem:i=>{localStorage.removeItem(i),window.dispatchEvent(new StorageEvent("storage",{key:i,oldValue:null,newValue:null,storageArea:localStorage}))}},listen:i=>{let e=t=>{i(t.key,t.newValue)};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}}}import{EventSourceParserStream as Re}from"eventsource-parser/stream";var T,U=class{constructor(e){p(this,T);d(this,T,e)}generateText(r){return m(this,arguments,function*({model:e="gemini-2.5-flash",messages:t}){let o=this.checkLumiApiKey(),n=yield l(s(this,T),`/lm/${s(this,T).config.projectId}/ai/chat/completions`,{method:"POST",body:{lumiApiKey:o,modelName:e,chatMessages:t}});if(n.code!==200)throw new u(n.code,n.message);return n.data})}generateTextStream(r){return m(this,arguments,function*({model:e="gemini-2.5-flash",messages:t}){let o=this.checkLumiApiKey();return ae(s(this,T),`/lm/${s(this,T).config.projectId}/ai/chat/stream`,{method:"POST",body:{lumiApiKey:o,modelName:e,chatMessages:t}})})}generateImage(r){return m(this,arguments,function*({model:e="gemini-2.5-flash-image",messages:t}){let o=this.checkLumiApiKey(),{code:n,message:a,data:h}=yield l(s(this,T),`/lm/${s(this,T).config.projectId}/ai/image/task`,{method:"POST",body:{lumiApiKey:o,modelName:e,chatMessages:t}});if(n!==200)throw new u(n,a);let g=h,f=1e3;for(;g.generationStatus==="PROCESSING";){yield ie(f),f<5e3&&(f+=500);let{code:R,message:I,data:S}=yield l(s(this,T),`/lm/${s(this,T).config.projectId}/ai/image/get`,{method:"POST",body:{lumiApiKey:o,messageId:g.messageId}});if(R!==200)throw new u(R,I);g=S}return g})}parseStream(e){return m(this,null,function*(){return e.pipeThrough(new TextDecoderStream).pipeThrough(new Re).pipeThrough(new TransformStream({transform:(t,r)=>{try{let o=JSON.parse(t.data);r.enqueue({event:t.event,data:o})}catch(o){console.error(`Parse stream chunk failed: Invalid JSON.
4
+ ${t.data}`)}}}))})}checkLumiApiKey(){if(!y)throw new u(10400,"lumi.tools.ai is only available on the server-side");let e=x("LUMI_API_KEY");if(!e)throw new u(10400,"LUMI_API_KEY is required");return e}};T=new WeakMap;var v,$=class{constructor(e){p(this,v);d(this,v,e)}send(g){return m(this,arguments,function*({to:e,subject:t,fromName:r,html:o,text:n="",replyTo:a,scheduledAt:h}){if(!e||!t||!o&&!n)throw new Error("Failed to send email: Missing required parameters.");typeof e=="string"&&(e=[e]),typeof a=="string"&&(a=[a]);let f=yield l(s(this,v),`/lm/${s(this,v).config.projectId}/email/send`,{method:"POST",body:{to:e,subject:t,fromName:r,html:o,text:n,replyTo:a,scheduledAt:h}});if(f.code!==200)throw new u(f.code,f.message)})}};v=new WeakMap;var C,q=class{constructor(e){p(this,C);d(this,C,e)}upload(e){return m(this,null,function*(){let t=new FormData;e.forEach(o=>{t.append("files",o)});let r=yield l(s(this,C),`/lm/${s(this,C).config.projectId}/file/batch`,{method:"POST",body:t});if(r.code!==200)throw new u(r.code,r.message);return r.data})}delete(e){return m(this,null,function*(){let t=yield l(s(this,C),`/lm/${s(this,C).config.projectId}/file/batch`,{method:"DELETE",body:{fileUrls:e}});if(t.code!==200)throw new u(t.code,t.message)})}};C=new WeakMap;var F,_=class{constructor(e){p(this,F);d(this,F,e),this.email=new $(e),this.file=new q(e),this.ai=new U(e)}};F=new WeakMap;var Q=class{constructor(e){var t;(t=e.storageAdapter)!=null||(e.storageAdapter=ce()),this.config=e,this.auth=new M(this),this.entities=new j(this),this.tools=new _(this),this.functions=new N(this)}};function Lt(i){return new Q(i)}export{U as AITool,$ as EmailTool,j as EntitiesClient,D as EntityClient,q as FileTool,N as FunctionsClient,M as LumiAuthClient,Q as LumiClient,_ as ToolsClient,Lt as createClient};
5
5
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/auth-client.ts","../src/lib/error.ts","../src/lib/request.ts","../src/utils/common.ts","../src/utils/storage.ts","../src/core/entity-client.ts","../src/core/entities-client.ts","../src/core/functions-client.ts","../src/adapters/storage.ts","../src/tools/ai-tool.ts","../src/tools/email-tool.ts","../src/tools/file-tool.ts","../src/core/tools-client.ts","../src/core/lumi-client.ts"],"sourcesContent":["import type { OAuthProvider, OtpType } from '@/constants'\nimport type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/lib/request'\nimport SHA256 from 'crypto-js/sha256'\nimport { v4 } from 'uuid'\nimport { ReceiveMessageType } from '@/constants'\nimport { SendMessageType } from '@/constants'\nimport { StorageKey } from '@/constants'\nimport { LumiError } from '@/lib/error'\nimport { request } from '@/lib/request'\nimport { getIcon, getTitle, isServer } from '@/utils/common'\nimport { getStorage, setStorage } from '@/utils/storage'\n\nexport interface User {\n userId: string\n email: string\n userName: string\n userRole: 'ADMIN' | 'USER'\n createdTime: string\n}\n\nexport interface UserWithToken extends User {\n userToken: string\n}\n\nexport interface MessageSignInData {\n projectId: string\n accessToken: string\n user: User\n}\n\nexport type MessageDataReceive = {\n type: ReceiveMessageType.READY | ReceiveMessageType.SIGN_IN_FAILED\n} | {\n type: ReceiveMessageType.SIGN_IN\n data: MessageSignInData\n}\n\nexport interface MessageInitData {\n projectId: string\n icon: string | null\n title: string | null\n}\n\nexport interface MessageDataSend {\n type: SendMessageType.INIT\n data: MessageInitData\n}\n\nexport class LumiAuthClient {\n readonly #lumi: LumiClient\n readonly #popupName: string = `lumi-auth-${v4()}`\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n Promise.resolve().then(() => {\n if (!isServer && this.isAuthenticated)\n void this.refreshUser()\n })\n }\n\n /** 访问令牌 */\n public get accessToken(): string | null {\n if (isServer) {\n const authorization = this.#lumi.config.authorization\n return authorization ? authorization.replace('Bearer ', '') : null\n }\n return getStorage<string>(this.#lumi, StorageKey.ACCESS_TOKEN)\n }\n\n public set accessToken(accessToken: string | null) {\n if (isServer) {\n this.#lumi.config.authorization = accessToken ? `Bearer ${accessToken}` : undefined\n return\n }\n setStorage(this.#lumi, StorageKey.ACCESS_TOKEN, accessToken)\n }\n\n #user: User | null = null\n\n /** 用户 */\n public get user(): User | null {\n if (isServer)\n return this.#user\n return getStorage<User>(this.#lumi, StorageKey.USER)\n }\n\n public set user(user: User | null) {\n if (isServer) {\n this.#user = user\n return\n }\n setStorage(this.#lumi, StorageKey.USER, user)\n }\n\n public get isAuthenticated(): boolean {\n return !!this.accessToken\n }\n\n /** 登录 */\n public signIn(): Promise<MessageSignInData> {\n return this.#openAuthPopup(this.#lumi.config.authOrigin)\n }\n\n /** 使用密码登录 */\n public async signInWithPassword({\n email,\n password,\n }: {\n email: string\n password: string\n }): Promise<MessageSignInData> {\n const res = await request<ApiResponse<UserWithToken>>(this.#lumi, '/lm/user/password/login', {\n method: 'POST',\n body: {\n projectId: this.#lumi.config.projectId,\n email,\n password: SHA256(password).toString(),\n },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n\n return {\n projectId: this.#lumi.config.projectId,\n accessToken: res.data.userToken,\n user: res.data,\n }\n }\n\n /** 发送验证码 */\n public async sendOtp({\n email,\n type,\n }: {\n email: string\n type: OtpType\n }): Promise<void> {\n // TODO\n const res = await request<ApiResponse<null>>(this.#lumi, '/lm/user/email/code/send', {\n method: 'POST',\n body: {\n projectId: this.#lumi.config.projectId,\n email,\n emailType: type,\n },\n })\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n\n /** 使用密码注册 */\n public async signUpWithPassword({\n email,\n password,\n otp,\n userName,\n }: {\n email: string\n password: string\n otp: string\n userName?: string\n }): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, '/lm/user/password/register', {\n method: 'POST',\n body: {\n projectId: this.#lumi.config.projectId,\n email,\n password: SHA256(password).toString(),\n code: otp,\n userName,\n },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n\n /** 重置密码 */\n public async resetPassword({\n email,\n newPassword,\n otp,\n }: {\n email: string\n newPassword: string\n otp: string\n }): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, '/lm/user/password/reset', {\n method: 'POST',\n body: {\n projectId: this.#lumi.config.projectId,\n email,\n newPassword: SHA256(newPassword).toString(),\n code: otp,\n },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n\n /** 第三方登录 */\n public signInWithOAuth({\n provider,\n }: {\n provider: OAuthProvider\n }): Promise<MessageSignInData> {\n return this.#openAuthPopup(`${this.#lumi.config.authOrigin}/oauth/${provider}`)\n }\n\n /** 退出登录 */\n public signOut(): void {\n if (isServer)\n throw new Error('auth.signOut() can only be called on the client side')\n\n this.accessToken = null\n this.user = null\n }\n\n /** 获取当前用户 */\n public async refreshUser(): Promise<User> {\n const res = await request<ApiResponse<User>>(this.#lumi, '/lm/user/info', {\n method: 'POST',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n this.user = res.data\n return res.data\n }\n\n /** 监听登录状态变化 */\n public onAuthChange(callback: (args: {\n isAuthenticated: boolean\n user: User | null\n }) => void): () => void {\n if (isServer)\n throw new Error('auth.onAuthChange() can only be called on the client side')\n\n const unlisten = this.#lumi.config.storageAdapter.listen((key): void => {\n if (key === StorageKey.ACCESS_TOKEN || key === StorageKey.USER || !key) {\n callback({\n isAuthenticated: this.isAuthenticated,\n user: this.user,\n })\n }\n })\n\n return () => unlisten()\n }\n\n /** 打开认证弹窗并处理消息 */\n #openAuthPopup(url: string): Promise<MessageSignInData> {\n if (isServer)\n throw new LumiError(10400, 'This method can only be called on the client side')\n\n const width = 800\n const height = 600\n const left = (window.screen.width - width) / 2\n const top = (window.screen.height - height) / 2\n const popup = window.open(url, this.#popupName, `width=${width},height=${height},left=${left},top=${top}`)\n\n let cleanup: () => void\n return new Promise<MessageSignInData>((resolve, reject) => {\n if (!popup)\n return reject(new LumiError(10500, 'Open auth window failed'))\n\n const timer = setInterval(() => {\n if (popup.closed)\n reject(new LumiError(10499, 'Auth window closed'))\n }, 1000)\n\n const handleGlobalClick = (event: MouseEvent): void => {\n if (!popup.closed) {\n popup.focus()\n event.stopPropagation()\n event.preventDefault()\n }\n }\n\n const handleMessage = ({ data, origin, source }: MessageEvent<MessageDataReceive | null>): void => {\n if (origin !== this.#lumi.config.authOrigin || source !== popup)\n return\n\n switch (data?.type) {\n case ReceiveMessageType.READY: {\n popup.postMessage({\n type: SendMessageType.INIT,\n data: {\n projectId: this.#lumi.config.projectId,\n icon: getIcon(),\n title: getTitle(),\n },\n } satisfies MessageDataSend, this.#lumi.config.authOrigin)\n break\n }\n case ReceiveMessageType.SIGN_IN: {\n if (data.data.projectId !== this.#lumi.config.projectId)\n break\n popup.close()\n window.focus()\n this.accessToken = data.data.accessToken\n this.user = data.data.user\n resolve(data.data)\n break\n }\n }\n }\n\n window.addEventListener('message', handleMessage)\n document.addEventListener('click', handleGlobalClick, true)\n\n cleanup = () => {\n clearInterval(timer)\n window.removeEventListener('message', handleMessage)\n document.removeEventListener('click', handleGlobalClick, true)\n }\n }).finally(() => cleanup?.())\n }\n}\n","export class LumiError extends Error {\n name: string = 'LumiError'\n code: number\n\n constructor(code: number, message: string) {\n super(message)\n this.code = code\n }\n}\n","import type { FetchOptions, ResponseType } from 'ofetch'\nimport type { LumiClient } from '@/core/lumi-client'\nimport Base64 from 'crypto-js/enc-base64'\nimport Hex from 'crypto-js/enc-hex'\nimport HmacSHA256 from 'crypto-js/hmac-sha256'\nimport SHA256 from 'crypto-js/sha256'\nimport hash from 'object-hash'\nimport { ofetch } from 'ofetch'\nimport { LumiError } from '@/lib/error'\nimport { getEnv, isServer } from '@/utils/common'\n\nconst SECRET_KEY = '6QrJZ7pFCmBZAeIJF7IArvkCz+EtzA0RVcpHkiQIsQyhs7QtCS9P+CueZdHfB2OtJcgX3BbqY9pfpWeAVTqCwQ=='\n\n/** RFC 3986 compliant URI encoding */\nfunction rfc3986Encode(str: string): string {\n return encodeURIComponent(str).replace(/[!'()*]/g, c => `%${c.charCodeAt(0).toString(16).toUpperCase()}`)\n}\n\n/** 添加签名 */\nfunction addSignature<T extends ResponseType>(options: FetchOptions<T>): void {\n // 生成签名\n const timestamp = Math.floor(Date.now() / 1000).toString()\n const nonce = Math.random().toString(36).substring(2, 15)\n\n // 构建查询字符串\n const queryParams: Record<string, string> = { ...options.query, ...options.params }\n const canonicalQueryString = Object.keys(queryParams).sort().map(key => `${rfc3986Encode(key)}=${rfc3986Encode(String(queryParams[key]))}`).join('&')\n\n // 构建签名头\n const headersToSign: Record<string, string> = {\n 'x-timestamp': timestamp,\n 'x-nonce': nonce,\n }\n const canonicalHeaders = Object.keys(headersToSign).sort().map(key => `${key}:${headersToSign[key]}`).join('\\n')\n\n // 构建载荷哈希\n const payload = (options.body && !(options.body instanceof FormData)) ? JSON.stringify(options.body) : ''\n const hashedPayload = SHA256(payload).toString(Hex)\n\n // 构建规范请求\n const canonicalRequest = [canonicalQueryString, canonicalHeaders, hashedPayload].join('\\n')\n\n // 生成签名\n const signature = Base64.stringify(HmacSHA256(canonicalRequest, SECRET_KEY))\n\n // 添加签名头到请求\n const headers = new Headers(options.headers)\n Object.entries(headersToSign).forEach(([key, value]) => {\n headers.set(key, value)\n })\n headers.set('X-Sign', signature)\n options.headers = headers\n}\n\nexport interface ApiResponse<T> {\n code: number\n message: string\n data: T\n}\n\nexport interface PaginationData<T> {\n total: number\n list: T[]\n}\n\nconst requestMap = new Map<string, number[]>()\n\n/** 限制请求频率,相同参数的请求每秒只能发送4次 */\nfunction checkRateLimit<T extends ResponseType>(uri: string, options: FetchOptions<T>): void {\n const clonedOptions = { ...options }\n\n if (options.body instanceof FormData)\n clonedOptions.body = Array.from(options.body.entries())\n\n clonedOptions.headers = undefined\n\n const requestHash = hash([uri, clonedOptions])\n const now = Date.now()\n const requestQueue = requestMap.get(requestHash)?.filter(time => now - time < 1000) || []\n if (requestQueue.length >= 4)\n throw new LumiError(10429, 'Too many requests')\n requestQueue.push(now)\n requestMap.set(requestHash, requestQueue)\n}\n\nfunction beforeRequest<T extends ResponseType>(lumi: LumiClient, uri: string, options: FetchOptions<T>, stream: boolean = false): void {\n options.headers = new Headers(options.headers)\n\n // 添加认证头(如果存在)\n if (lumi.auth.accessToken)\n options.headers.set('Authorization', `Bearer ${lumi.auth.accessToken}`)\n\n // Function 内获取最高权限\n const topAccessKey = getEnv('TOP_ACCESS_KEY')\n if (topAccessKey)\n options.headers.set('X-Top-Access', topAccessKey)\n\n // 添加流式请求头\n if (stream) {\n if (!options.headers.get('Accept'))\n options.headers.set('Accept', 'text/event-stream')\n if (!options.headers.get('Cache-Control'))\n options.headers.set('Cache-Control', 'no-cache')\n if (!options.headers.get('X-Accel-Buffering'))\n options.headers.set('X-Accel-Buffering', 'no')\n }\n\n // 限制请求频率\n checkRateLimit(uri, options)\n\n // 添加签名\n addSignature(options)\n}\n\n/** 网络请求 */\nexport function request<T>(lumi: LumiClient, uri: string, options: FetchOptions<'json'> = {}): Promise<T> {\n beforeRequest(lumi, uri, options)\n\n const isAuthenticated = lumi.auth.isAuthenticated\n\n return ofetch<T>(uri, {\n baseURL: lumi.config.apiBaseUrl,\n ...options,\n onResponse: ({ response }) => {\n // 若 Token 失效则退出登录\n if (!isServer && isAuthenticated && (response._data as ApiResponse<any>)?.code === 2100)\n lumi.auth.signOut()\n },\n })\n}\n\nexport type ApiStreamResponse = ReadableStream<Uint8Array>\n\n/** 网络请求(流式) */\nexport async function requestStream(lumi: LumiClient, uri: string, options: FetchOptions<'stream'> = {}): Promise<ApiStreamResponse> {\n beforeRequest(lumi, uri, options, true)\n\n const stream = await ofetch(uri, {\n baseURL: lumi.config.apiBaseUrl,\n ...options,\n responseType: 'stream',\n })\n\n return stream\n}\n","export function getIcon(): string | null {\n return document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]')?.href ?? null\n}\n\nexport function getTitle(): string | null {\n return document.title ?? null\n}\n\nexport const isServer = typeof window === 'undefined' && globalThis.navigator?.product !== 'ReactNative'\n\nexport function delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nexport function getEnv(key: string): string | null {\n return typeof process !== 'undefined' ? process?.env[key] ?? null : null\n}\n","import type { StorageKey } from '@/constants'\nimport type { LumiClient } from '@/core/lumi-client'\n\nexport function setStorage<T>(lumi: LumiClient, key: StorageKey, value: T): void {\n const storage = lumi.config.storageAdapter.storage\n if (value !== null)\n storage.setItem(key, JSON.stringify(value))\n else\n storage.removeItem(key)\n}\n\nexport function getStorage<T>(lumi: LumiClient, key: StorageKey): T | null {\n const storage = lumi.config.storageAdapter.storage\n const value = storage.getItem(key)\n try {\n return value ? JSON.parse(value) : null\n }\n catch {\n return null\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, PaginationData } from '@/lib/request'\nimport { request } from '@/lib/request'\n\nexport interface Entity extends Record<string, any> {\n id: string\n}\n\nexport class EntityClient {\n readonly #lumi: LumiClient\n public readonly entityName: string\n\n constructor(lumi: LumiClient, entityName: string) {\n this.#lumi = lumi\n this.entityName = entityName\n }\n\n /** 查询文档列表 */\n public async list({ filter, sort, limit, skip }: {\n filter?: any\n sort?: Record<string, 1 | -1>\n limit?: number\n skip?: number\n } = {}): Promise<PaginationData<Entity>> {\n if (!limit) {\n const res = await request<ApiResponse<Entity[]>>(this.#lumi, this.uri('/list'), {\n method: 'POST',\n body: { filter, sort },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return {\n total: res.data.length,\n list: res.data,\n }\n }\n else {\n const res = await request<ApiResponse<PaginationData<Entity>>>(this.#lumi, this.uri('/listByPage'), {\n method: 'POST',\n body: { filter, sort, limit, skip },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n }\n\n /** 获取单个文档 */\n public async get(id: string): Promise<Entity | null> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(`/${id}`), {\n method: 'GET',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 创建文档 */\n public async create(data: Record<string, any>): Promise<Entity> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(), {\n method: 'POST',\n body: data,\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 批量创建文档 */\n public async createMany(data: Record<string, any>[]): Promise<Entity[]> {\n const res = await request<ApiResponse<Entity[]>>(this.#lumi, this.uri('/batch'), {\n method: 'POST',\n body: data,\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 更新文档 */\n public async update(id: string, data: Record<string, any>): Promise<Entity> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(), {\n method: 'PUT',\n body: { filter: { _id: id }, update: data },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 删除文档 */\n public async delete(id: string): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, this.uri(`/${id}`), {\n method: 'DELETE',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n }\n\n /** 批量删除文档 */\n public async deleteMany(ids: string[]): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, this.uri('/batch-by-ids'), {\n method: 'DELETE',\n params: { ids },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n }\n\n private uri(suffix = ''): string {\n return `/lm/${this.#lumi.config.projectId}/${this.entityName}/documents${suffix}`\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport { EntityClient } from '@/core/entity-client'\n\nexport class EntitiesClient {\n readonly #lumi: LumiClient\n [key: string]: EntityClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n return new Proxy(this, {\n get(target: EntitiesClient, p: string) {\n if (!(p in target))\n target[p] = new EntityClient(target.#lumi, p)\n return target[p]\n },\n }) as this\n }\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { LumiClient } from '@/core/lumi-client'\nimport { ofetch } from 'ofetch'\n\nexport class FunctionsClient {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n public invoke(functionName: string, options: FetchOptions = {}): Promise<any> {\n if (this.#lumi.auth.accessToken) {\n options.headers = {\n Authorization: `Bearer ${this.#lumi.auth.accessToken}`,\n ...options.headers,\n }\n }\n\n return ofetch(`/v1/functions/${this.#lumi.config.projectId}/${functionName}`, {\n baseURL: this.#lumi.config.apiBaseUrl,\n ...options,\n })\n }\n}\n","export interface StorageAdapter {\n storage: {\n getItem: (key: string) => string | null\n setItem: (key: string, value: string) => void\n removeItem: (key: string) => void\n }\n listen: (callback: (key: string | null, value: string | null) => void) => () => void\n}\n\nexport function createDefaultStorageAdapter(): StorageAdapter {\n return {\n storage: {\n getItem: key => localStorage.getItem(key),\n setItem: (key, value) => {\n localStorage.setItem(key, value)\n window.dispatchEvent(new StorageEvent('storage', {\n key,\n oldValue: null,\n newValue: value,\n storageArea: localStorage,\n }))\n },\n removeItem: (key) => {\n localStorage.removeItem(key)\n window.dispatchEvent(new StorageEvent('storage', {\n key,\n oldValue: null,\n newValue: null,\n storageArea: localStorage,\n }))\n },\n },\n listen: (callback) => {\n const handler = (e: StorageEvent): void => {\n callback(e.key, e.newValue)\n }\n window.addEventListener('storage', handler)\n return () => window.removeEventListener('storage', handler)\n },\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, ApiStreamResponse } from '@/lib/request'\nimport { EventSourceParserStream } from 'eventsource-parser/stream'\nimport { LumiError } from '@/lib/error'\nimport { requestStream } from '@/lib/request'\nimport { request } from '@/lib/request'\nimport { delay, getEnv, isServer } from '@/utils/common'\n\nexport interface MessageMedia {\n mimeType: string\n url: string\n}\n\nexport interface Message {\n role: 'system' | 'user' | 'assistant'\n content: string\n medias?: MessageMedia[]\n}\n\nexport interface GenerateTextResult {\n chatId: string\n content: string\n}\n\nexport interface GenerateImageResult {\n chatId: string\n messageId: string\n generationStatus: 'PROCESSING' | 'SUCCESS' | 'FAILED'\n content?: string\n imageURL?: string\n}\n\nexport interface StreamChunk<T> {\n event?: string\n data: T\n}\n\nexport class AITool {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** AI 生成文本 */\n public async generateText({\n model = 'gemini-2.5-flash',\n messages,\n }: {\n model?: string\n messages: Message[]\n }): Promise<GenerateTextResult> {\n const lumiApiKey = this.checkLumiApiKey()\n\n const res = await request<ApiResponse<GenerateTextResult>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/ai/chat/completions`, {\n method: 'POST',\n body: {\n lumiApiKey,\n modelName: model,\n chatMessages: messages,\n },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n\n return res.data\n }\n\n /** AI 生成文本(流式输出) */\n public async generateTextStream({\n model = 'gemini-2.5-flash',\n messages,\n }: {\n model?: string\n messages: Message[]\n }): Promise<ApiStreamResponse> {\n const lumiApiKey = this.checkLumiApiKey()\n\n return requestStream(this.#lumi, `/lm/${this.#lumi.config.projectId}/ai/chat/stream`, {\n method: 'POST',\n body: {\n lumiApiKey,\n modelName: model,\n chatMessages: messages,\n },\n })\n }\n\n /** AI 生成图片 */\n public async generateImage({\n model = 'gemini-2.5-flash-image',\n messages,\n }: {\n model?: string\n messages: Message[]\n }): Promise<GenerateImageResult> {\n const lumiApiKey = this.checkLumiApiKey()\n\n const { code, message, data } = await request<ApiResponse<GenerateImageResult>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/ai/image/task`, {\n method: 'POST',\n body: {\n lumiApiKey,\n modelName: model,\n chatMessages: messages,\n },\n })\n if (code !== 200)\n throw new LumiError(code, message)\n\n let result = data\n let delayMs = 1000\n\n // 轮询生成结果\n while (result.generationStatus === 'PROCESSING') {\n await delay(delayMs)\n if (delayMs < 5000)\n delayMs += 500\n\n const { code, message, data } = await request<ApiResponse<GenerateImageResult>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/ai/image/get`, {\n method: 'POST',\n body: {\n lumiApiKey,\n messageId: result.messageId,\n },\n })\n if (code !== 200)\n throw new LumiError(code, message)\n result = data\n }\n\n return result\n }\n\n /** 解析流式输出(将原始 SSE 流解析为 GenerateTextResult 块) */\n public async parseStream(stream: ApiStreamResponse): Promise<ReadableStream<StreamChunk<GenerateTextResult>>> {\n return stream\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream())\n .pipeThrough<StreamChunk<GenerateTextResult>>(new TransformStream({\n transform: (chunk, controller) => {\n try {\n const data = JSON.parse(chunk.data)\n controller.enqueue({\n event: chunk.event,\n data,\n })\n }\n catch {\n console.error(`Parse stream chunk failed: Invalid JSON.\\n${chunk.data}`)\n }\n },\n }))\n }\n\n private checkLumiApiKey(): string {\n if (!isServer)\n throw new LumiError(10400, 'lumi.tools.ai is only available on the server-side')\n\n const lumiApiKey = getEnv('LUMI_API_KEY')\n if (!lumiApiKey)\n throw new LumiError(10400, 'LUMI_API_KEY is required')\n\n return lumiApiKey\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/lib/request'\nimport { LumiError } from '@/lib/error'\nimport { request } from '@/lib/request'\n\nexport class EmailTool {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** 发送邮件 */\n public async send({ to, subject, fromName, html, text = '', replyTo, scheduledAt }: {\n to: string | string[]\n subject: string\n fromName?: string\n html?: string\n text?: string\n replyTo?: string | string[]\n scheduledAt?: string\n }): Promise<void> {\n if (!to || !subject || (!html && !text))\n throw new Error('Failed to send email: Missing required parameters.')\n\n if (typeof to === 'string')\n to = [to]\n if (typeof replyTo === 'string')\n replyTo = [replyTo]\n\n const res = await request<ApiResponse<null>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/email/send`, {\n method: 'POST',\n body: { to, subject, fromName, html, text, replyTo, scheduledAt },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/lib/request'\nimport { LumiError } from '@/lib/error'\nimport { request } from '@/lib/request'\n\nexport interface UploadItem {\n fileName: string\n fileUrl?: string\n uploadError?: string\n}\n\nexport class FileTool {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** 上传文件 */\n public async upload(files: File[]): Promise<UploadItem[]> {\n const formData = new FormData()\n files.forEach((file) => {\n formData.append('files', file)\n })\n\n const res = await request<ApiResponse<UploadItem[]>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/file/batch`, {\n method: 'POST',\n body: formData,\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n\n return res.data\n }\n\n /** 批量删除文件 */\n public async delete(fileUrls: string[]): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/file/batch`, {\n method: 'DELETE',\n body: { fileUrls },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport { AITool, EmailTool, FileTool } from '@/tools'\n\nexport class ToolsClient {\n readonly #lumi: LumiClient\n\n public email: EmailTool\n public file: FileTool\n public ai: AITool\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n this.email = new EmailTool(lumi)\n this.file = new FileTool(lumi)\n this.ai = new AITool(lumi)\n }\n}\n","import type { StorageAdapter } from '@/adapters/storage'\nimport type { Optional } from '@/types/utils'\nimport { createDefaultStorageAdapter } from '@/adapters/storage'\nimport { LumiAuthClient } from '@/core/auth-client'\nimport { EntitiesClient } from '@/core/entities-client'\nimport { FunctionsClient } from '@/core/functions-client'\nimport { ToolsClient } from '@/core/tools-client'\n\nexport interface LumiClientConfig {\n projectId: string\n apiBaseUrl: string\n authOrigin: string\n storageAdapter: StorageAdapter\n authorization?: string\n}\n\nexport class LumiClient {\n public config: LumiClientConfig\n\n public auth: LumiAuthClient\n public entities: EntitiesClient\n public tools: ToolsClient\n public functions: FunctionsClient\n\n constructor(config: Optional<LumiClientConfig, 'storageAdapter'>) {\n config.storageAdapter ??= createDefaultStorageAdapter()\n\n this.config = config as LumiClientConfig\n this.auth = new LumiAuthClient(this)\n this.entities = new EntitiesClient(this)\n this.tools = new ToolsClient(this)\n this.functions = new FunctionsClient(this)\n }\n}\n\nexport function createClient(config: Optional<LumiClientConfig, 'storageAdapter'>): LumiClient {\n return new LumiClient(config)\n}\n"],"mappings":"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","names":["SHA256","v4","LumiError","code","message","Base64","Hex","HmacSHA256","SHA256","hash","ofetch","getIcon","_a","_b","getTitle","isServer","delay","ms","resolve","getEnv","key","SECRET_KEY","rfc3986Encode","str","c","addSignature","options","timestamp","nonce","queryParams","__spreadValues","canonicalQueryString","key","headersToSign","canonicalHeaders","payload","hashedPayload","SHA256","Hex","canonicalRequest","signature","Base64","HmacSHA256","headers","value","requestMap","checkRateLimit","uri","_a","clonedOptions","requestHash","hash","now","requestQueue","time","LumiError","beforeRequest","lumi","stream","topAccessKey","getEnv","request","isAuthenticated","ofetch","__spreadProps","response","isServer","requestStream","_0","_1","__async","setStorage","lumi","key","value","storage","getStorage","e","_lumi","_popupName","_user","_LumiAuthClient_instances","openAuthPopup_fn","LumiAuthClient","lumi","__privateAdd","v4","__privateSet","isServer","authorization","__privateGet","getStorage","accessToken","setStorage","user","__privateMethod","_0","__async","email","password","res","request","SHA256","LumiError","type","otp","userName","newPassword","provider","callback","unlisten","key","url","width","height","left","top","popup","cleanup","resolve","reject","timer","handleGlobalClick","event","handleMessage","data","origin","source","getIcon","getTitle","_lumi","EntityClient","lumi","entityName","__privateAdd","__privateSet","__async","filter","sort","limit","skip","res","request","__privateGet","id","data","ids","suffix","_lumi","EntitiesClient","lumi","__privateAdd","__privateSet","target","p","EntityClient","__privateGet","ofetch","_lumi","FunctionsClient","lumi","__privateAdd","__privateSet","functionName","options","__privateGet","__spreadValues","ofetch","createDefaultStorageAdapter","key","value","callback","handler","e","EventSourceParserStream","_lumi","AITool","lumi","__privateAdd","__privateSet","_0","__async","model","messages","lumiApiKey","res","request","__privateGet","LumiError","requestStream","code","message","data","result","delayMs","delay","stream","EventSourceParserStream","chunk","controller","e","isServer","getEnv","_lumi","EmailTool","lumi","__privateAdd","__privateSet","_0","__async","to","subject","fromName","html","text","replyTo","scheduledAt","res","request","__privateGet","LumiError","_lumi","FileTool","lumi","__privateAdd","__privateSet","files","__async","formData","file","res","request","__privateGet","LumiError","fileUrls","_lumi","ToolsClient","lumi","__privateAdd","__privateSet","EmailTool","FileTool","AITool","LumiClient","config","_a","createDefaultStorageAdapter","LumiAuthClient","EntitiesClient","ToolsClient","FunctionsClient","createClient"]}
1
+ {"version":3,"sources":["../src/core/auth-client.ts","../src/lib/error.ts","../src/lib/request.ts","../src/utils/common.ts","../src/utils/storage.ts","../src/core/entity-client.ts","../src/core/entities-client.ts","../src/core/functions-client.ts","../src/adapters/storage.ts","../src/tools/ai-tool.ts","../src/tools/email-tool.ts","../src/tools/file-tool.ts","../src/core/tools-client.ts","../src/core/lumi-client.ts"],"sourcesContent":["import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, User, UserWithToken } from '@/types'\nimport SHA256 from 'crypto-js/sha256'\nimport { v4 } from 'uuid'\nimport { LumiError } from '@/lib/error'\nimport { request } from '@/lib/request'\nimport { getIcon, getTitle, isServer } from '@/utils/common'\nimport { getStorage, setStorage, StorageKey } from '@/utils/storage'\n\ntype OAuthProvider = 'google'\ntype OtpType = 'register' | 'resetPassword'\n\nenum ReceiveMessageType {\n READY = 'lumi-ready',\n SIGN_IN = 'lumi-sign-in',\n SIGN_IN_FAILED = 'lumi-sign-in-failed',\n}\n\nenum SendMessageType {\n INIT = 'lumi-init',\n}\n\ninterface MessageSignInData {\n projectId: string\n accessToken: string\n user: User\n}\n\ntype MessageDataReceive = {\n type: ReceiveMessageType.READY | ReceiveMessageType.SIGN_IN_FAILED\n} | {\n type: ReceiveMessageType.SIGN_IN\n data: MessageSignInData\n}\n\ninterface MessageInitData {\n projectId: string\n icon: string | null\n title: string | null\n}\n\ninterface MessageDataSend {\n type: SendMessageType.INIT\n data: MessageInitData\n}\n\nexport class LumiAuthClient {\n readonly #lumi: LumiClient\n readonly #popupName: string = `lumi-auth-${v4()}`\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n Promise.resolve().then(() => {\n if (!isServer && this.isAuthenticated)\n void this.refreshUser()\n })\n }\n\n /** 访问令牌 */\n public get accessToken(): string | null {\n if (isServer) {\n const authorization = this.#lumi.config.authorization\n return authorization ? authorization.replace('Bearer ', '') : null\n }\n return getStorage<string>(this.#lumi, StorageKey.ACCESS_TOKEN)\n }\n\n public set accessToken(accessToken: string | null) {\n if (isServer) {\n this.#lumi.config.authorization = accessToken ? `Bearer ${accessToken}` : undefined\n return\n }\n setStorage(this.#lumi, StorageKey.ACCESS_TOKEN, accessToken)\n }\n\n #user: User | null = null\n\n /** 用户 */\n public get user(): User | null {\n if (isServer)\n return this.#user\n return getStorage<User>(this.#lumi, StorageKey.USER)\n }\n\n public set user(user: User | null) {\n if (isServer) {\n this.#user = user\n return\n }\n setStorage(this.#lumi, StorageKey.USER, user)\n }\n\n public get isAuthenticated(): boolean {\n return !!this.accessToken\n }\n\n /** 登录 */\n public signIn(): Promise<MessageSignInData> {\n return this.#openAuthPopup(this.#lumi.config.authOrigin)\n }\n\n /** 使用密码登录 */\n public async signInWithPassword({\n email,\n password,\n }: {\n email: string\n password: string\n }): Promise<MessageSignInData> {\n const res = await request<ApiResponse<UserWithToken>>(this.#lumi, '/lm/user/password/login', {\n method: 'POST',\n body: {\n projectId: this.#lumi.config.projectId,\n email,\n password: SHA256(password).toString(),\n },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n\n this.accessToken = res.data.userToken\n this.user = res.data\n\n return {\n projectId: this.#lumi.config.projectId,\n accessToken: res.data.userToken,\n user: res.data,\n }\n }\n\n /** 发送验证码 */\n public async sendOtp({\n email,\n type,\n }: {\n email: string\n type: OtpType\n }): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, '/lm/user/email/code/send', {\n method: 'POST',\n body: {\n projectId: this.#lumi.config.projectId,\n email,\n emailType: type,\n },\n })\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n\n /** 使用密码注册 */\n public async signUpWithPassword({\n email,\n password,\n otp,\n userName,\n }: {\n email: string\n password: string\n otp: string\n userName?: string\n }): Promise<MessageSignInData> {\n const res = await request<ApiResponse<UserWithToken>>(this.#lumi, '/lm/user/password/register', {\n method: 'POST',\n body: {\n projectId: this.#lumi.config.projectId,\n email,\n password: SHA256(password).toString(),\n code: otp,\n userName,\n },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n\n this.accessToken = res.data.userToken\n this.user = res.data\n\n return {\n projectId: this.#lumi.config.projectId,\n accessToken: res.data.userToken,\n user: res.data,\n }\n }\n\n /** 重置密码 */\n public async resetPassword({\n email,\n newPassword,\n otp,\n }: {\n email: string\n newPassword: string\n otp: string\n }): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, '/lm/user/password/reset', {\n method: 'POST',\n body: {\n projectId: this.#lumi.config.projectId,\n email,\n newPassword: SHA256(newPassword).toString(),\n code: otp,\n },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n\n /** 第三方登录 */\n public signInWithOAuth({\n provider,\n }: {\n provider: OAuthProvider\n }): Promise<MessageSignInData> {\n return this.#openAuthPopup(`${this.#lumi.config.authOrigin}/oauth/${provider}`)\n }\n\n /** 退出登录 */\n public signOut(): void {\n if (isServer)\n throw new Error('auth.signOut() can only be called on the client side')\n\n this.accessToken = null\n this.user = null\n }\n\n /** 获取当前用户 */\n public async refreshUser(): Promise<User> {\n const res = await request<ApiResponse<User>>(this.#lumi, '/lm/user/info', {\n method: 'POST',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n this.user = res.data\n return res.data\n }\n\n /** 监听登录状态变化 */\n public onAuthChange(callback: (args: {\n isAuthenticated: boolean\n user: User | null\n }) => void): () => void {\n if (isServer)\n throw new Error('auth.onAuthChange() can only be called on the client side')\n\n const unlisten = this.#lumi.config.storageAdapter.listen((key): void => {\n if (key === StorageKey.ACCESS_TOKEN || key === StorageKey.USER || !key) {\n callback({\n isAuthenticated: this.isAuthenticated,\n user: this.user,\n })\n }\n })\n\n return () => unlisten()\n }\n\n /** 打开认证弹窗并处理消息 */\n #openAuthPopup(url: string): Promise<MessageSignInData> {\n if (isServer)\n throw new LumiError(10400, 'This method can only be called on the client side')\n\n const width = 800\n const height = 600\n const left = (window.screen.width - width) / 2\n const top = (window.screen.height - height) / 2\n const popup = window.open(url, this.#popupName, `width=${width},height=${height},left=${left},top=${top}`)\n\n let cleanup: () => void\n return new Promise<MessageSignInData>((resolve, reject) => {\n if (!popup)\n return reject(new LumiError(10500, 'Open auth window failed'))\n\n const timer = setInterval(() => {\n if (popup.closed)\n reject(new LumiError(10499, 'Auth window closed'))\n }, 1000)\n\n const handleGlobalClick = (event: MouseEvent): void => {\n if (!popup.closed) {\n popup.focus()\n event.stopPropagation()\n event.preventDefault()\n }\n }\n\n const handleMessage = ({ data, origin, source }: MessageEvent<MessageDataReceive | null>): void => {\n if (origin !== this.#lumi.config.authOrigin || source !== popup)\n return\n\n switch (data?.type) {\n case ReceiveMessageType.READY: {\n popup.postMessage({\n type: SendMessageType.INIT,\n data: {\n projectId: this.#lumi.config.projectId,\n icon: getIcon(),\n title: getTitle(),\n },\n } satisfies MessageDataSend, this.#lumi.config.authOrigin)\n break\n }\n case ReceiveMessageType.SIGN_IN: {\n if (data.data.projectId !== this.#lumi.config.projectId)\n break\n popup.close()\n window.focus()\n this.accessToken = data.data.accessToken\n this.user = data.data.user\n resolve(data.data)\n break\n }\n }\n }\n\n window.addEventListener('message', handleMessage)\n document.addEventListener('click', handleGlobalClick, true)\n\n cleanup = () => {\n clearInterval(timer)\n window.removeEventListener('message', handleMessage)\n document.removeEventListener('click', handleGlobalClick, true)\n }\n }).finally(() => cleanup?.())\n }\n}\n","export class LumiError extends Error {\n name: string = 'LumiError'\n code: number\n\n constructor(code: number, message: string) {\n super(message)\n this.code = code\n }\n}\n","import type { FetchOptions, ResponseType } from 'ofetch'\nimport type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, ApiStreamResponse } from '@/types'\nimport Base64 from 'crypto-js/enc-base64'\nimport Hex from 'crypto-js/enc-hex'\nimport HmacSHA256 from 'crypto-js/hmac-sha256'\nimport SHA256 from 'crypto-js/sha256'\nimport hash from 'object-hash'\nimport { ofetch } from 'ofetch'\nimport { LumiError } from '@/lib/error'\nimport { getEnv, isServer } from '@/utils/common'\n\nconst SECRET_KEY = '6QrJZ7pFCmBZAeIJF7IArvkCz+EtzA0RVcpHkiQIsQyhs7QtCS9P+CueZdHfB2OtJcgX3BbqY9pfpWeAVTqCwQ=='\n\n/** RFC 3986 compliant URI encoding */\nfunction rfc3986Encode(str: string): string {\n return encodeURIComponent(str).replace(/[!'()*]/g, c => `%${c.charCodeAt(0).toString(16).toUpperCase()}`)\n}\n\n/** 添加签名 */\nfunction addSignature<T extends ResponseType>(options: FetchOptions<T>): void {\n // 生成签名\n const timestamp = Math.floor(Date.now() / 1000).toString()\n const nonce = Math.random().toString(36).substring(2, 15)\n\n // 构建查询字符串\n const queryParams: Record<string, string> = { ...options.query, ...options.params }\n const canonicalQueryString = Object.keys(queryParams).sort().map(key => `${rfc3986Encode(key)}=${rfc3986Encode(String(queryParams[key]))}`).join('&')\n\n // 构建签名头\n const headersToSign: Record<string, string> = {\n 'x-timestamp': timestamp,\n 'x-nonce': nonce,\n }\n const canonicalHeaders = Object.keys(headersToSign).sort().map(key => `${key}:${headersToSign[key]}`).join('\\n')\n\n // 构建载荷哈希\n const payload = (options.body && !(options.body instanceof FormData)) ? JSON.stringify(options.body) : ''\n const hashedPayload = SHA256(payload).toString(Hex)\n\n // 构建规范请求\n const canonicalRequest = [canonicalQueryString, canonicalHeaders, hashedPayload].join('\\n')\n\n // 生成签名\n const signature = Base64.stringify(HmacSHA256(canonicalRequest, SECRET_KEY))\n\n // 添加签名头到请求\n const headers = new Headers(options.headers)\n Object.entries(headersToSign).forEach(([key, value]) => {\n headers.set(key, value)\n })\n headers.set('X-Sign', signature)\n options.headers = headers\n}\n\nconst requestMap = new Map<string, number[]>()\n\n/** 限制请求频率,相同参数的请求每秒只能发送4次 */\nfunction checkRateLimit<T extends ResponseType>(uri: string, options: FetchOptions<T>): void {\n const clonedOptions = { ...options }\n\n if (options.body instanceof FormData)\n clonedOptions.body = Array.from(options.body.entries())\n\n clonedOptions.headers = undefined\n\n const requestHash = hash([uri, clonedOptions])\n const now = Date.now()\n const requestQueue = requestMap.get(requestHash)?.filter(time => now - time < 1000) || []\n if (requestQueue.length >= 4)\n throw new LumiError(10429, 'Too many requests')\n requestQueue.push(now)\n requestMap.set(requestHash, requestQueue)\n}\n\nfunction beforeRequest<T extends ResponseType>(lumi: LumiClient, uri: string, options: FetchOptions<T>, stream: boolean = false): void {\n options.headers = new Headers(options.headers)\n\n // 添加认证头(如果存在)\n if (lumi.auth.accessToken)\n options.headers.set('Authorization', `Bearer ${lumi.auth.accessToken}`)\n\n // Function 内获取最高权限\n const topAccessKey = getEnv('TOP_ACCESS_KEY')\n if (topAccessKey)\n options.headers.set('X-Top-Access', topAccessKey)\n\n // 添加流式请求头\n if (stream) {\n if (!options.headers.get('Accept'))\n options.headers.set('Accept', 'text/event-stream')\n if (!options.headers.get('Cache-Control'))\n options.headers.set('Cache-Control', 'no-cache')\n if (!options.headers.get('X-Accel-Buffering'))\n options.headers.set('X-Accel-Buffering', 'no')\n }\n\n // 限制请求频率\n checkRateLimit(uri, options)\n\n // 添加签名\n addSignature(options)\n}\n\n/** 网络请求 */\nexport function request<T>(lumi: LumiClient, uri: string, options: FetchOptions<'json'> = {}): Promise<T> {\n beforeRequest(lumi, uri, options)\n\n const isAuthenticated = lumi.auth.isAuthenticated\n\n return ofetch<T>(uri, {\n baseURL: lumi.config.apiBaseUrl,\n ...options,\n onResponse: ({ response }) => {\n // 若 Token 失效则退出登录\n if (!isServer && isAuthenticated && (response._data as ApiResponse<any>)?.code === 2100)\n lumi.auth.signOut()\n },\n })\n}\n\n/** 网络请求(流式) */\nexport async function requestStream(lumi: LumiClient, uri: string, options: FetchOptions<'stream'> = {}): Promise<ApiStreamResponse> {\n beforeRequest(lumi, uri, options, true)\n\n const stream = await ofetch(uri, {\n baseURL: lumi.config.apiBaseUrl,\n ...options,\n responseType: 'stream',\n })\n\n return stream\n}\n","export function getIcon(): string | null {\n return document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]')?.href ?? null\n}\n\nexport function getTitle(): string | null {\n return document.title ?? null\n}\n\nexport const isServer = typeof window === 'undefined' && globalThis.navigator?.product !== 'ReactNative'\n\nexport function delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nexport function getEnv(key: string): string | null {\n return typeof process !== 'undefined' ? process?.env[key] ?? null : null\n}\n","import type { LumiClient } from '@/core/lumi-client'\n\nexport enum StorageKey {\n ACCESS_TOKEN = 'lumi-access-token',\n USER = 'lumi-user',\n}\n\nexport function setStorage<T>(lumi: LumiClient, key: StorageKey, value: T): void {\n const storage = lumi.config.storageAdapter.storage\n if (value !== null)\n storage.setItem(key, JSON.stringify(value))\n else\n storage.removeItem(key)\n}\n\nexport function getStorage<T>(lumi: LumiClient, key: StorageKey): T | null {\n const storage = lumi.config.storageAdapter.storage\n const value = storage.getItem(key)\n try {\n return value ? JSON.parse(value) : null\n }\n catch {\n return null\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, Entity, PaginationData } from '@/types'\nimport { request } from '@/lib/request'\n\nexport class EntityClient {\n readonly #lumi: LumiClient\n public readonly entityName: string\n\n constructor(lumi: LumiClient, entityName: string) {\n this.#lumi = lumi\n this.entityName = entityName\n }\n\n /** 查询文档列表 */\n public async list({ filter, sort, limit, skip }: {\n filter?: any\n sort?: Record<string, 1 | -1>\n limit?: number\n skip?: number\n } = {}): Promise<PaginationData<Entity>> {\n if (!limit) {\n const res = await request<ApiResponse<Entity[]>>(this.#lumi, this.uri('/list'), {\n method: 'POST',\n body: { filter, sort },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return {\n total: res.data.length,\n list: res.data,\n }\n }\n else {\n const res = await request<ApiResponse<PaginationData<Entity>>>(this.#lumi, this.uri('/listByPage'), {\n method: 'POST',\n body: { filter, sort, limit, skip },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n }\n\n /** 获取单个文档 */\n public async get(id: string): Promise<Entity | null> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(`/${id}`), {\n method: 'GET',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 创建文档 */\n public async create(data: Record<string, any>): Promise<Entity> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(), {\n method: 'POST',\n body: data,\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 批量创建文档 */\n public async createMany(data: Record<string, any>[]): Promise<Entity[]> {\n const res = await request<ApiResponse<Entity[]>>(this.#lumi, this.uri('/batch'), {\n method: 'POST',\n body: data,\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 更新文档 */\n public async update(id: string, data: Record<string, any>): Promise<Entity> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(), {\n method: 'PUT',\n body: { filter: { _id: id }, update: data },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 删除文档 */\n public async delete(id: string): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, this.uri(`/${id}`), {\n method: 'DELETE',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n }\n\n /** 批量删除文档 */\n public async deleteMany(ids: string[]): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, this.uri('/batch-by-ids'), {\n method: 'DELETE',\n params: { ids },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n }\n\n private uri(suffix = ''): string {\n return `/lm/${this.#lumi.config.projectId}/${this.entityName}/documents${suffix}`\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport { EntityClient } from '@/core/entity-client'\n\nexport class EntitiesClient {\n readonly #lumi: LumiClient\n [key: string]: EntityClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n return new Proxy(this, {\n get(target: EntitiesClient, p: string) {\n if (!(p in target))\n target[p] = new EntityClient(target.#lumi, p)\n return target[p]\n },\n }) as this\n }\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { LumiClient } from '@/core/lumi-client'\nimport { ofetch } from 'ofetch'\n\nexport class FunctionsClient {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n public invoke(functionName: string, options: FetchOptions = {}): Promise<any> {\n if (this.#lumi.auth.accessToken) {\n options.headers = {\n Authorization: `Bearer ${this.#lumi.auth.accessToken}`,\n ...options.headers,\n }\n }\n\n return ofetch(`/v1/functions/${this.#lumi.config.projectId}/${functionName}`, {\n baseURL: this.#lumi.config.apiBaseUrl,\n ...options,\n })\n }\n}\n","import type { StorageAdapter } from '@/types'\n\nexport function createDefaultStorageAdapter(): StorageAdapter {\n return {\n storage: {\n getItem: key => localStorage.getItem(key),\n setItem: (key, value) => {\n localStorage.setItem(key, value)\n window.dispatchEvent(new StorageEvent('storage', {\n key,\n oldValue: null,\n newValue: value,\n storageArea: localStorage,\n }))\n },\n removeItem: (key) => {\n localStorage.removeItem(key)\n window.dispatchEvent(new StorageEvent('storage', {\n key,\n oldValue: null,\n newValue: null,\n storageArea: localStorage,\n }))\n },\n },\n listen: (callback) => {\n const handler = (e: StorageEvent): void => {\n callback(e.key, e.newValue)\n }\n window.addEventListener('storage', handler)\n return () => window.removeEventListener('storage', handler)\n },\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, ApiStreamResponse, GenerateImageResult, GenerateTextResult, Message, StreamChunk } from '@/types'\nimport { EventSourceParserStream } from 'eventsource-parser/stream'\nimport { LumiError } from '@/lib/error'\nimport { requestStream } from '@/lib/request'\nimport { request } from '@/lib/request'\nimport { delay, getEnv, isServer } from '@/utils/common'\n\nexport class AITool {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** AI 生成文本 */\n public async generateText({\n model = 'gemini-2.5-flash',\n messages,\n }: {\n model?: string\n messages: Message[]\n }): Promise<GenerateTextResult> {\n const lumiApiKey = this.checkLumiApiKey()\n\n const res = await request<ApiResponse<GenerateTextResult>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/ai/chat/completions`, {\n method: 'POST',\n body: {\n lumiApiKey,\n modelName: model,\n chatMessages: messages,\n },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n\n return res.data\n }\n\n /** AI 生成文本(流式输出) */\n public async generateTextStream({\n model = 'gemini-2.5-flash',\n messages,\n }: {\n model?: string\n messages: Message[]\n }): Promise<ApiStreamResponse> {\n const lumiApiKey = this.checkLumiApiKey()\n\n return requestStream(this.#lumi, `/lm/${this.#lumi.config.projectId}/ai/chat/stream`, {\n method: 'POST',\n body: {\n lumiApiKey,\n modelName: model,\n chatMessages: messages,\n },\n })\n }\n\n /** AI 生成图片 */\n public async generateImage({\n model = 'gemini-2.5-flash-image',\n messages,\n }: {\n model?: string\n messages: Message[]\n }): Promise<GenerateImageResult> {\n const lumiApiKey = this.checkLumiApiKey()\n\n const { code, message, data } = await request<ApiResponse<GenerateImageResult>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/ai/image/task`, {\n method: 'POST',\n body: {\n lumiApiKey,\n modelName: model,\n chatMessages: messages,\n },\n })\n if (code !== 200)\n throw new LumiError(code, message)\n\n let result = data\n let delayMs = 1000\n\n // 轮询生成结果\n while (result.generationStatus === 'PROCESSING') {\n await delay(delayMs)\n if (delayMs < 5000)\n delayMs += 500\n\n const { code, message, data } = await request<ApiResponse<GenerateImageResult>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/ai/image/get`, {\n method: 'POST',\n body: {\n lumiApiKey,\n messageId: result.messageId,\n },\n })\n if (code !== 200)\n throw new LumiError(code, message)\n result = data\n }\n\n return result\n }\n\n /** 解析流式输出(将原始 SSE 流解析为 GenerateTextResult 块) */\n public async parseStream(stream: ApiStreamResponse): Promise<ReadableStream<StreamChunk<GenerateTextResult>>> {\n return stream\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream())\n .pipeThrough<StreamChunk<GenerateTextResult>>(new TransformStream({\n transform: (chunk, controller) => {\n try {\n const data = JSON.parse(chunk.data)\n controller.enqueue({\n event: chunk.event,\n data,\n })\n }\n catch {\n console.error(`Parse stream chunk failed: Invalid JSON.\\n${chunk.data}`)\n }\n },\n }))\n }\n\n private checkLumiApiKey(): string {\n if (!isServer)\n throw new LumiError(10400, 'lumi.tools.ai is only available on the server-side')\n\n const lumiApiKey = getEnv('LUMI_API_KEY')\n if (!lumiApiKey)\n throw new LumiError(10400, 'LUMI_API_KEY is required')\n\n return lumiApiKey\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/types'\nimport { LumiError } from '@/lib/error'\nimport { request } from '@/lib/request'\n\nexport class EmailTool {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** 发送邮件 */\n public async send({ to, subject, fromName, html, text = '', replyTo, scheduledAt }: {\n to: string | string[]\n subject: string\n fromName?: string\n html?: string\n text?: string\n replyTo?: string | string[]\n scheduledAt?: string\n }): Promise<void> {\n if (!to || !subject || (!html && !text))\n throw new Error('Failed to send email: Missing required parameters.')\n\n if (typeof to === 'string')\n to = [to]\n if (typeof replyTo === 'string')\n replyTo = [replyTo]\n\n const res = await request<ApiResponse<null>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/email/send`, {\n method: 'POST',\n body: { to, subject, fromName, html, text, replyTo, scheduledAt },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, UploadItem } from '@/types'\nimport { LumiError } from '@/lib/error'\nimport { request } from '@/lib/request'\n\nexport class FileTool {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** 上传文件 */\n public async upload(files: File[]): Promise<UploadItem[]> {\n const formData = new FormData()\n files.forEach((file) => {\n formData.append('files', file)\n })\n\n const res = await request<ApiResponse<UploadItem[]>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/file/batch`, {\n method: 'POST',\n body: formData,\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n\n return res.data\n }\n\n /** 批量删除文件 */\n public async delete(fileUrls: string[]): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/file/batch`, {\n method: 'DELETE',\n body: { fileUrls },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport { AITool, EmailTool, FileTool } from '@/tools'\n\nexport class ToolsClient {\n readonly #lumi: LumiClient\n\n public email: EmailTool\n public file: FileTool\n public ai: AITool\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n this.email = new EmailTool(lumi)\n this.file = new FileTool(lumi)\n this.ai = new AITool(lumi)\n }\n}\n","import type { LumiClientConfig } from '@/types'\nimport type { Optional } from '@/types/utils'\nimport { createDefaultStorageAdapter } from '@/adapters/storage'\nimport { LumiAuthClient } from '@/core/auth-client'\nimport { EntitiesClient } from '@/core/entities-client'\nimport { FunctionsClient } from '@/core/functions-client'\nimport { ToolsClient } from '@/core/tools-client'\n\nexport class LumiClient {\n public config: LumiClientConfig\n\n public auth: LumiAuthClient\n public entities: EntitiesClient\n public tools: ToolsClient\n public functions: FunctionsClient\n\n constructor(config: Optional<LumiClientConfig, 'storageAdapter'>) {\n config.storageAdapter ??= createDefaultStorageAdapter()\n\n this.config = config as LumiClientConfig\n this.auth = new LumiAuthClient(this)\n this.entities = new EntitiesClient(this)\n this.tools = new ToolsClient(this)\n this.functions = new FunctionsClient(this)\n }\n}\n\nexport function createClient(config: Optional<LumiClientConfig, 'storageAdapter'>): LumiClient {\n return new LumiClient(config)\n}\n"],"mappings":"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","names":["SHA256","v4","LumiError","code","message","Base64","Hex","HmacSHA256","SHA256","hash","ofetch","getIcon","_a","_b","getTitle","isServer","delay","ms","resolve","getEnv","key","SECRET_KEY","rfc3986Encode","str","c","addSignature","options","timestamp","nonce","queryParams","__spreadValues","canonicalQueryString","key","headersToSign","canonicalHeaders","payload","hashedPayload","SHA256","Hex","canonicalRequest","signature","Base64","HmacSHA256","headers","value","requestMap","checkRateLimit","uri","_a","clonedOptions","requestHash","hash","now","requestQueue","time","LumiError","beforeRequest","lumi","stream","topAccessKey","getEnv","request","isAuthenticated","ofetch","__spreadProps","response","isServer","requestStream","_0","_1","__async","setStorage","lumi","key","value","storage","getStorage","e","_lumi","_popupName","_user","_LumiAuthClient_instances","openAuthPopup_fn","LumiAuthClient","lumi","__privateAdd","v4","__privateSet","isServer","authorization","__privateGet","getStorage","accessToken","setStorage","user","__privateMethod","_0","__async","email","password","res","request","SHA256","LumiError","type","otp","userName","newPassword","provider","callback","unlisten","key","url","width","height","left","top","popup","cleanup","resolve","reject","timer","handleGlobalClick","event","handleMessage","data","origin","source","getIcon","getTitle","_lumi","EntityClient","lumi","entityName","__privateAdd","__privateSet","__async","filter","sort","limit","skip","res","request","__privateGet","id","data","ids","suffix","_lumi","EntitiesClient","lumi","__privateAdd","__privateSet","target","p","EntityClient","__privateGet","ofetch","_lumi","FunctionsClient","lumi","__privateAdd","__privateSet","functionName","options","__privateGet","__spreadValues","ofetch","createDefaultStorageAdapter","key","value","callback","handler","e","EventSourceParserStream","_lumi","AITool","lumi","__privateAdd","__privateSet","_0","__async","model","messages","lumiApiKey","res","request","__privateGet","LumiError","requestStream","code","message","data","result","delayMs","delay","stream","EventSourceParserStream","chunk","controller","e","isServer","getEnv","_lumi","EmailTool","lumi","__privateAdd","__privateSet","_0","__async","to","subject","fromName","html","text","replyTo","scheduledAt","res","request","__privateGet","LumiError","_lumi","FileTool","lumi","__privateAdd","__privateSet","files","__async","formData","file","res","request","__privateGet","LumiError","fileUrls","_lumi","ToolsClient","lumi","__privateAdd","__privateSet","EmailTool","FileTool","AITool","LumiClient","config","_a","createDefaultStorageAdapter","LumiAuthClient","EntitiesClient","ToolsClient","FunctionsClient","createClient"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumi.new/sdk",
3
- "version": "0.4.3-beta.1",
3
+ "version": "0.4.3-beta.3",
4
4
  "description": "SDK for Lumi.new",
5
5
  "sideEffects": false,
6
6
  "main": "dist/index.js",