@lumi.new/sdk 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -46
- package/dist/index.d.mts +15 -3
- package/dist/index.d.ts +15 -3
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -394,16 +394,20 @@ async function aiGenerateText() {
|
|
|
394
394
|
|
|
395
395
|
#### AI: Generate Text (Streaming)
|
|
396
396
|
|
|
397
|
-
The streaming process involves two steps: first, calling `generateTextStream`
|
|
397
|
+
The streaming process involves two steps: first, calling `generateTextStream` in a server-side function (Deno) to get a raw stream, and then parsing it on the client with `parseStream`.
|
|
398
398
|
|
|
399
|
-
**1. Server-Side Example (
|
|
399
|
+
**1. Server-Side Example (Deno)**
|
|
400
400
|
|
|
401
|
-
|
|
401
|
+
Create a Lumi Function (e.g., named `ai-stream`) that calls `generateTextStream` and streams the raw response back to the client as Server-Sent Events (SSE).
|
|
402
|
+
|
|
403
|
+
> **Note:** Ensure `LUMI_API_KEY` is set in your environment variables.
|
|
402
404
|
|
|
403
405
|
```typescript
|
|
404
|
-
// Example: Deno
|
|
406
|
+
// Example: A Deno-based Lumi Function
|
|
405
407
|
Deno.serve(async (request: Request) => {
|
|
406
|
-
//
|
|
408
|
+
// Initialize Lumi client with authorization token if needed
|
|
409
|
+
// const lumi = createClient({ ... });
|
|
410
|
+
|
|
407
411
|
const rawStream = await lumi.tools.ai.generateTextStream({
|
|
408
412
|
model: 'gemini-2.5-flash',
|
|
409
413
|
messages: [
|
|
@@ -423,19 +427,24 @@ Deno.serve(async (request: Request) => {
|
|
|
423
427
|
});
|
|
424
428
|
```
|
|
425
429
|
|
|
426
|
-
**2. Client-Side Example
|
|
430
|
+
**2. Client-Side Example**
|
|
427
431
|
|
|
428
|
-
In your frontend code,
|
|
432
|
+
In your frontend code, use `lumi.functions.invoke` to call the function and `lumi.tools.ai.parseStream` to process the streaming data. `invoke` automatically handles authentication headers.
|
|
429
433
|
|
|
430
434
|
```typescript
|
|
431
435
|
async function consumeAiStream() {
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
436
|
+
// Invoke the 'ai-stream' function.
|
|
437
|
+
// Setting responseType: 'stream' ensures we get the raw stream.
|
|
438
|
+
const rawStream = await lumi.functions.invoke('ai-stream', {
|
|
439
|
+
responseType: 'stream',
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
if (!rawStream) {
|
|
443
|
+
console.error("The response stream is empty.");
|
|
435
444
|
return;
|
|
436
445
|
}
|
|
437
|
-
|
|
438
|
-
const parsedStream = await lumi.tools.ai.parseStream(
|
|
446
|
+
|
|
447
|
+
const parsedStream = await lumi.tools.ai.parseStream(rawStream);
|
|
439
448
|
const reader = parsedStream.getReader();
|
|
440
449
|
|
|
441
450
|
try {
|
|
@@ -445,7 +454,6 @@ async function consumeAiStream() {
|
|
|
445
454
|
// value: { event?: string, data: { chatId, content } }
|
|
446
455
|
const content = value?.data?.content ?? '';
|
|
447
456
|
console.log(content); // Update your UI with the content
|
|
448
|
-
// e.g., setMyComponentState(prevState => prevState + content);
|
|
449
457
|
}
|
|
450
458
|
} finally {
|
|
451
459
|
reader.releaseLock();
|
|
@@ -808,41 +816,12 @@ Parses a raw stream from `ai.generateTextStream` into a stream of structured dat
|
|
|
808
816
|
|
|
809
817
|
- `Promise<ReadableStream<{ event?: string, data: GenerateTextResult }>>`: A readable stream producing event/data chunks.
|
|
810
818
|
|
|
811
|
-
**Recommended
|
|
819
|
+
**Recommended Usage:**
|
|
812
820
|
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
const stream = await lumi.tools.ai.generateTextStream({
|
|
816
|
-
model: 'gemini-2.5-flash',
|
|
817
|
-
messages: [
|
|
818
|
-
{ role: 'system', content: 'You are a helpful assistant.' },
|
|
819
|
-
{ role: 'user', content: 'Stream a short poem line by line.' },
|
|
820
|
-
],
|
|
821
|
-
});
|
|
821
|
+
1. **Server-Side:** Call `ai.generateTextStream` in a Lumi Function to get a raw stream and return it as an SSE response.
|
|
822
|
+
2. **Client-Side:** Use `lumi.functions.invoke` (with `responseType: 'stream'`) to fetch the stream, then pass it to `ai.parseStream` for processing.
|
|
822
823
|
|
|
823
|
-
|
|
824
|
-
return new Response(stream, {
|
|
825
|
-
headers: {
|
|
826
|
-
'Content-Type': 'text/event-stream',
|
|
827
|
-
'Cache-Control': 'no-cache',
|
|
828
|
-
'X-Accel-Buffering': 'no',
|
|
829
|
-
},
|
|
830
|
-
});
|
|
831
|
-
|
|
832
|
-
// On the client (browser)
|
|
833
|
-
const response = await fetch('/api/ai-stream');
|
|
834
|
-
if (!response.body)
|
|
835
|
-
throw new Error('Empty response body');
|
|
836
|
-
|
|
837
|
-
const parsedStream = await lumi.tools.ai.parseStream(response.body);
|
|
838
|
-
const reader = parsedStream.getReader();
|
|
839
|
-
|
|
840
|
-
while (true) {
|
|
841
|
-
const { value, done } = await reader.read();
|
|
842
|
-
if (done) break;
|
|
843
|
-
console.log(value?.data?.content ?? '');
|
|
844
|
-
}
|
|
845
|
-
```
|
|
824
|
+
For a complete code example, see the **AI: Generate Text (Streaming)** section in the **Tools** chapter.
|
|
846
825
|
|
|
847
826
|
#### `ai.generateImage(options)`
|
|
848
827
|
|
|
@@ -900,6 +879,7 @@ Invokes a serverless function by its name.
|
|
|
900
879
|
- `query` (`object`, optional): An object of query parameters to be appended to the URI.
|
|
901
880
|
- `body` (`object` | `FormData`, optional): The request body.
|
|
902
881
|
- `headers` (`object`, optional): Custom request headers.
|
|
882
|
+
- `responseType` (`string`, optional): The type of data expected (e.g., `'json'`, `'stream'`). Defaults to `'json'`.
|
|
903
883
|
|
|
904
884
|
**Returns:**
|
|
905
885
|
|
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import { FetchOptions } from 'ofetch';
|
|
2
2
|
|
|
3
|
+
interface StorageAdapter {
|
|
4
|
+
storage: {
|
|
5
|
+
getItem: (key: string) => string | null;
|
|
6
|
+
setItem: (key: string, value: string) => void;
|
|
7
|
+
removeItem: (key: string) => void;
|
|
8
|
+
};
|
|
9
|
+
listen: (callback: (key: string | null | undefined, value: string | null) => void) => () => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
|
|
13
|
+
|
|
3
14
|
interface PaginationData<T> {
|
|
4
15
|
total: number;
|
|
5
16
|
list: T[];
|
|
@@ -44,7 +55,7 @@ declare class EntitiesClient {
|
|
|
44
55
|
declare class FunctionsClient {
|
|
45
56
|
#private;
|
|
46
57
|
constructor(lumi: LumiClient);
|
|
47
|
-
invoke(functionName: string, options?: FetchOptions
|
|
58
|
+
invoke(functionName: string, options?: FetchOptions): Promise<any>;
|
|
48
59
|
}
|
|
49
60
|
|
|
50
61
|
interface MessageMedia {
|
|
@@ -135,6 +146,7 @@ interface LumiClientConfig {
|
|
|
135
146
|
projectId: string;
|
|
136
147
|
apiBaseUrl: string;
|
|
137
148
|
authOrigin: string;
|
|
149
|
+
storageAdapter: StorageAdapter;
|
|
138
150
|
authorization?: string;
|
|
139
151
|
}
|
|
140
152
|
declare class LumiClient {
|
|
@@ -143,9 +155,9 @@ declare class LumiClient {
|
|
|
143
155
|
entities: EntitiesClient;
|
|
144
156
|
tools: ToolsClient;
|
|
145
157
|
functions: FunctionsClient;
|
|
146
|
-
constructor(config: LumiClientConfig);
|
|
158
|
+
constructor(config: Optional<LumiClientConfig, 'storageAdapter'>);
|
|
147
159
|
}
|
|
148
|
-
declare function createClient(config: LumiClientConfig): LumiClient;
|
|
160
|
+
declare function createClient(config: Optional<LumiClientConfig, 'storageAdapter'>): LumiClient;
|
|
149
161
|
|
|
150
162
|
declare enum MessageType {
|
|
151
163
|
READY = "lumi-ready",
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import { FetchOptions } from 'ofetch';
|
|
2
2
|
|
|
3
|
+
interface StorageAdapter {
|
|
4
|
+
storage: {
|
|
5
|
+
getItem: (key: string) => string | null;
|
|
6
|
+
setItem: (key: string, value: string) => void;
|
|
7
|
+
removeItem: (key: string) => void;
|
|
8
|
+
};
|
|
9
|
+
listen: (callback: (key: string | null | undefined, value: string | null) => void) => () => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
|
|
13
|
+
|
|
3
14
|
interface PaginationData<T> {
|
|
4
15
|
total: number;
|
|
5
16
|
list: T[];
|
|
@@ -44,7 +55,7 @@ declare class EntitiesClient {
|
|
|
44
55
|
declare class FunctionsClient {
|
|
45
56
|
#private;
|
|
46
57
|
constructor(lumi: LumiClient);
|
|
47
|
-
invoke(functionName: string, options?: FetchOptions
|
|
58
|
+
invoke(functionName: string, options?: FetchOptions): Promise<any>;
|
|
48
59
|
}
|
|
49
60
|
|
|
50
61
|
interface MessageMedia {
|
|
@@ -135,6 +146,7 @@ interface LumiClientConfig {
|
|
|
135
146
|
projectId: string;
|
|
136
147
|
apiBaseUrl: string;
|
|
137
148
|
authOrigin: string;
|
|
149
|
+
storageAdapter: StorageAdapter;
|
|
138
150
|
authorization?: string;
|
|
139
151
|
}
|
|
140
152
|
declare class LumiClient {
|
|
@@ -143,9 +155,9 @@ declare class LumiClient {
|
|
|
143
155
|
entities: EntitiesClient;
|
|
144
156
|
tools: ToolsClient;
|
|
145
157
|
functions: FunctionsClient;
|
|
146
|
-
constructor(config: LumiClientConfig);
|
|
158
|
+
constructor(config: Optional<LumiClientConfig, 'storageAdapter'>);
|
|
147
159
|
}
|
|
148
|
-
declare function createClient(config: LumiClientConfig): LumiClient;
|
|
160
|
+
declare function createClient(config: Optional<LumiClientConfig, 'storageAdapter'>): LumiClient;
|
|
149
161
|
|
|
150
162
|
declare enum MessageType {
|
|
151
163
|
READY = "lumi-ready",
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`),
|
|
3
|
-
`),
|
|
4
|
-
${t.data}`)}}}))})}checkLumiApiKey(){if(!
|
|
1
|
+
"use strict";var we=Object.create;var v=Object.defineProperty,Se=Object.defineProperties,be=Object.getOwnPropertyDescriptor,Ee=Object.getOwnPropertyDescriptors,Ae=Object.getOwnPropertyNames,J=Object.getOwnPropertySymbols,Te=Object.getPrototypeOf,Y=Object.prototype.hasOwnProperty,Ce=Object.prototype.propertyIsEnumerable;var V=r=>{throw TypeError(r)};var Q=(r,e,t)=>e in r?v(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,A=(r,e)=>{for(var t in e||(e={}))Y.call(e,t)&&Q(r,t,e[t]);if(J)for(var t of J(e))Ce.call(e,t)&&Q(r,t,e[t]);return r},B=(r,e)=>Se(r,Ee(e));var Ie=(r,e)=>{for(var t in e)v(r,t,{get:e[t],enumerable:!0})},X=(r,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Ae(e))!Y.call(r,o)&&o!==t&&v(r,o,{get:()=>e[o],enumerable:!(i=be(e,o))||i.enumerable});return r};var L=(r,e,t)=>(t=r!=null?we(Te(r)):{},X(e||!r||!r.__esModule?v(t,"default",{value:r,enumerable:!0}):t,r)),Re=r=>X(v({},"__esModule",{value:!0}),r);var Z=(r,e,t)=>e.has(r)||V("Cannot "+t);var s=(r,e,t)=>(Z(r,e,"read from private field"),t?t.call(r):e.get(r)),u=(r,e,t)=>e.has(r)?V("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),d=(r,e,t,i)=>(Z(r,e,"write to private field"),i?i.call(r,t):e.set(r,t),t);var a=(r,e,t)=>new Promise((i,o)=>{var n=p=>{try{y(t.next(p))}catch(h){o(h)}},m=p=>{try{y(t.throw(p))}catch(h){o(h)}},y=p=>p.done?i(p.value):Promise.resolve(p.value).then(n,m);y((t=t.apply(r,e)).next())});var Oe={};Ie(Oe,{AITool:()=>D,EmailTool:()=>N,EntitiesClient:()=>M,EntityClient:()=>O,FileTool:()=>$,FunctionsClient:()=>k,LumiAuthClient:()=>x,LumiClient:()=>K,ToolsClient:()=>q,createClient:()=>Pe});module.exports=Re(Oe);var de=require("uuid");var oe=L(require("crypto-js/enc-base64")),ae=L(require("crypto-js/enc-hex")),ce=L(require("crypto-js/hmac-sha256")),le=L(require("crypto-js/sha256")),me=L(require("object-hash")),_=require("ofetch");var f=class extends Error{constructor(t,i){super(i);this.name="LumiError";this.code=t}};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 W,w=typeof window=="undefined"&&((W=globalThis.navigator)==null?void 0:W.product)!=="ReactNative";function re(r){return new Promise(e=>setTimeout(e,r))}function ie(r){var e;return typeof process!="undefined"&&(e=process==null?void 0:process.env[r])!=null?e:null}var ve="6QrJZ7pFCmBZAeIJF7IArvkCz+EtzA0RVcpHkiQIsQyhs7QtCS9P+CueZdHfB2OtJcgX3BbqY9pfpWeAVTqCwQ==";function se(r){return encodeURIComponent(r).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function Le(r){let e=Math.floor(Date.now()/1e3).toString(),t=Math.random().toString(36).substring(2,15),i=A({},r.query),o=Object.keys(i).sort().map(c=>`${se(c)}=${se(String(i[c]))}`).join("&"),n={"x-timestamp":e,"x-nonce":t},m=Object.keys(n).sort().map(c=>`${c}:${n[c]}`).join(`
|
|
2
|
+
`),y=r.body&&!(r.body instanceof FormData)?JSON.stringify(r.body):"",p=(0,le.default)(y).toString(ae.default),h=[o,m,p].join(`
|
|
3
|
+
`),I=oe.default.stringify((0,ce.default)(h,ve)),E=new Headers(r.headers);Object.entries(n).forEach(([c,G])=>{E.set(c,G)}),E.set("X-Sign",I),r.headers=E}var ne=new Map;function xe(r,e){var m;let t=A({},e);e.body instanceof FormData&&(t.body=Array.from(e.body.entries())),t.headers=void 0;let i=(0,me.default)([r,t]),o=Date.now(),n=((m=ne.get(i))==null?void 0:m.filter(y=>o-y<1e3))||[];if(n.length>=4)throw new f(429,"Too many requests");n.push(o),ne.set(i,n)}function ue(r,e,t,i=!1){t.headers=new Headers(t.headers),r.auth.accessToken&&t.headers.set("Authorization",`Bearer ${r.auth.accessToken}`),i&&(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")),xe(e,t),Le(t)}function l(r,e,t={}){ue(r,e,t);let i=r.auth.isAuthenticated;return(0,_.ofetch)(e,B(A({baseURL:r.config.apiBaseUrl},t),{onResponse:({response:o})=>{var n;!w&&i&&((n=o._data)==null?void 0:n.code)===2100&&r.auth.signOut()}}))}function pe(i,o){return a(this,arguments,function*(r,e,t={}){return ue(r,e,t,!0),yield(0,_.ofetch)(e,B(A({baseURL:r.config.apiBaseUrl},t),{responseType:"stream"}))})}function H(r,e,t){let i=r.config.storageAdapter.storage;t!==null?i.setItem(e,JSON.stringify(t)):i.removeItem(e)}function z(r,e){let i=r.config.storageAdapter.storage.getItem(e);try{return i?JSON.parse(i):null}catch(o){return null}}var g,j,P,x=class{constructor(e){u(this,g);u(this,j,`lumi-auth-${(0,de.v4)()}`);u(this,P,null);d(this,g,e),Promise.resolve().then(()=>{!w&&this.isAuthenticated&&this.refreshUser()})}get accessToken(){if(w){let e=s(this,g).config.authorization;return e?e.replace("Bearer ",""):null}return z(s(this,g),"lumi-access-token")}set accessToken(e){if(w){s(this,g).config.authorization=e?`Bearer ${e}`:void 0;return}H(s(this,g),"lumi-access-token",e)}get user(){return w?s(this,P):z(s(this,g),"lumi-user")}set user(e){if(w){d(this,P,e);return}H(s(this,g),"lumi-user",e)}get isAuthenticated(){return!!this.accessToken}signIn(){if(w)throw new Error("auth.signIn() can only be called on the client side");let e=800,t=600,i=(window.screen.width-e)/2,o=(window.screen.height-t)/2,n=window.open(s(this,g).config.authOrigin,s(this,j),`width=${e},height=${t},left=${i},top=${o}`),m;return new Promise((y,p)=>{if(!n)return p(new Error("Open auth window failed"));let h=setInterval(()=>{n.closed&&p(new Error("Auth window closed"))},1e3),I=c=>{n.closed||(n.focus(),c.stopPropagation(),c.preventDefault())},E=({data:c,origin:G,source:ye})=>{if(!(G!==s(this,g).config.authOrigin||ye!==n))switch(c==null?void 0:c.type){case"lumi-ready":{n.postMessage({type:"lumi-init",data:{projectId:s(this,g).config.projectId,icon:ee(),title:te()}},s(this,g).config.authOrigin);break}case"lumi-sign-in":{if(c.data.projectId!==s(this,g).config.projectId)break;n.close(),window.focus(),this.accessToken=c.data.accessToken,this.user=c.data.user,y(c.data);break}}};window.addEventListener("message",E),document.addEventListener("click",I,!0),m=()=>{clearInterval(h),window.removeEventListener("message",E),document.removeEventListener("click",I,!0)}}).finally(()=>m==null?void 0:m())}signOut(){if(w)throw new Error("auth.signOut() can only be called on the client side");this.accessToken=null,this.user=null}refreshUser(){return a(this,null,function*(){let e=yield l(s(this,g),"/lm/user/info",{method:"POST"});if(e.code!==200)throw new Error(e.message);return this.user=e.data,e.data})}onAuthChange(e){if(w)throw new Error("auth.onAuthChange() can only be called on the client side");let t=s(this,g).config.storageAdapter.listen(i=>{(i==="lumi-access-token"||i==="lumi-user"||!i)&&e({isAuthenticated:this.isAuthenticated,user:this.user})});return()=>t()}};g=new WeakMap,j=new WeakMap,P=new WeakMap;var S,O=class{constructor(e,t){u(this,S);d(this,S,e),this.entityName=t}list(){return a(this,arguments,function*({filter:e,sort:t,limit:i,skip:o}={}){if(i){let n=yield l(s(this,S),this.uri("/find"),{method:"POST",body:{filter:e,sort:t,limit:i,skip:o}});if(n.code!==200)throw new Error(n.message);return n.data}else{let n=yield l(s(this,S),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 a(this,null,function*(){let t=yield l(s(this,S),this.uri(`/${e}`),{method:"GET"});if(t.code!==200)throw new Error(t.message);return t.data})}create(e){return a(this,null,function*(){let t=yield l(s(this,S),this.uri(),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}createMany(e){return a(this,null,function*(){let t=yield l(s(this,S),this.uri("/batch"),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}update(e,t){return a(this,null,function*(){let i=yield l(s(this,S),this.uri(),{method:"PUT",body:{filter:{_id:e},update:t}});if(i.code!==200)throw new Error(i.message);return i.data})}delete(e){return a(this,null,function*(){let t=yield l(s(this,S),this.uri(`/${e}`),{method:"DELETE"});if(t.code!==200)throw new Error(t.message)})}deleteMany(e){return a(this,null,function*(){let t=yield l(s(this,S),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,S).config.projectId}/${this.entityName}/documents${e}`}};S=new WeakMap;var U,M=class{constructor(e){u(this,U);return d(this,U,e),new Proxy(this,{get(t,i){return i in t||(t[i]=new O(s(t,U),i)),t[i]}})}};U=new WeakMap;var ge=require("ofetch");var T,k=class{constructor(e){u(this,T);d(this,T,e)}invoke(e,t={}){return s(this,T).auth.accessToken&&(t.headers=A({Authorization:`Bearer ${s(this,T).auth.accessToken}`},t.headers)),(0,ge.ofetch)(`/v1/functions/${s(this,T).config.projectId}/${e}`,A({baseURL:s(this,T).config.apiBaseUrl},t))}};T=new WeakMap;function he(){return{storage:{getItem:localStorage.getItem,setItem:(r,e)=>{localStorage.setItem(r,e),window.dispatchEvent(new StorageEvent("storage",{key:r,oldValue:null,newValue:e,storageArea:localStorage}))},removeItem:localStorage.removeItem},listen:r=>{let e=t=>{r(t.key,t.newValue)};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}}}var fe=require("eventsource-parser/stream");var b,D=class{constructor(e){u(this,b);d(this,b,e)}generateText(i){return a(this,arguments,function*({model:e="gemini-2.5-flash",messages:t}){let o=this.checkLumiApiKey(),n=yield l(s(this,b),`/lm/${s(this,b).config.projectId}/ai/chat/completions`,{method:"POST",body:{lumiApiKey:o,modelName:e,chatMessages:t}});if(n.code!==200)throw new f(n.code,n.message);return n.data})}generateTextStream(i){return a(this,arguments,function*({model:e="gemini-2.5-flash",messages:t}){let o=this.checkLumiApiKey();return pe(s(this,b),`/lm/${s(this,b).config.projectId}/ai/chat/stream`,{method:"POST",body:{lumiApiKey:o,modelName:e,chatMessages:t}})})}generateImage(i){return a(this,arguments,function*({model:e="gemini-2.5-flash-image",messages:t}){let o=this.checkLumiApiKey(),{code:n,message:m,data:y}=yield l(s(this,b),`/lm/${s(this,b).config.projectId}/ai/image/task`,{method:"POST",body:{lumiApiKey:o,modelName:e,chatMessages:t}});if(n!==200)throw new f(n,m);let p=y,h=1e3;for(;p.generationStatus==="PROCESSING";){yield re(h),h<5e3&&(h+=500);let{code:I,message:E,data:c}=yield l(s(this,b),`/lm/${s(this,b).config.projectId}/ai/image/get`,{method:"POST",body:{lumiApiKey:o,messageId:p.messageId}});if(I!==200)throw new f(I,E);p=c}return p})}parseStream(e){return a(this,null,function*(){return e.pipeThrough(new TextDecoderStream).pipeThrough(new fe.EventSourceParserStream).pipeThrough(new TransformStream({transform:(t,i)=>{try{let o=JSON.parse(t.data);i.enqueue({event:t.event,data:o})}catch(o){console.error(`Parse stream chunk failed: Invalid JSON.
|
|
4
|
+
${t.data}`)}}}))})}checkLumiApiKey(){if(!w)throw new f(400,"lumi.tools.ai is only available on the server-side");let e=ie("LUMI_API_KEY");if(!e)throw new f(400,"LUMI_API_KEY is required");return e}};b=new WeakMap;var R,N=class{constructor(e){u(this,R);d(this,R,e)}send(p){return a(this,arguments,function*({to:e,subject:t,fromName:i,html:o,text:n="",replyTo:m,scheduledAt:y}){if(!e||!t||!o&&!n)throw new Error("Failed to send email: Missing required parameters.");typeof e=="string"&&(e=[e]),typeof m=="string"&&(m=[m]);let h=yield l(s(this,R),`/lm/${s(this,R).config.projectId}/email/send`,{method:"POST",body:{to:e,subject:t,fromName:i,html:o,text:n,replyTo:m,scheduledAt:y}});if(h.code!==200)throw new f(h.code,h.message)})}};R=new WeakMap;var C,$=class{constructor(e){u(this,C);d(this,C,e)}upload(e){return a(this,null,function*(){let t=new FormData;e.forEach(o=>{t.append("files",o)});let i=yield l(s(this,C),`/lm/${s(this,C).config.projectId}/file/batch`,{method:"POST",body:t});if(i.code!==200)throw new f(i.code,i.message);return i.data})}delete(e){return a(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 f(t.code,t.message)})}};C=new WeakMap;var F,q=class{constructor(e){u(this,F);d(this,F,e),this.email=new N(e),this.file=new $(e),this.ai=new D(e)}};F=new WeakMap;var K=class{constructor(e){var t;(t=e.storageAdapter)!=null||(e.storageAdapter=he()),this.config=e,this.auth=new x(this),this.entities=new M(this),this.tools=new q(this),this.functions=new k(this)}};function Pe(r){return new K(r)}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/request.ts","../src/lib/error.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/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 { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/lib/request'\nimport { v4 } from 'uuid'\nimport { MessageType, StorageKey } from '@/constants'\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 MessageSignInData {\n projectId: string\n accessToken: string\n user: User\n}\n\nexport type MessageDataReceive = {\n type: MessageType.READY\n} | {\n type: MessageType.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: MessageType.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>(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(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>(StorageKey.USER)\n }\n\n public set user(user: User | null) {\n if (isServer) {\n this.#user = user\n return\n }\n setStorage(StorageKey.USER, user)\n }\n\n public get isAuthenticated(): boolean {\n return !!this.accessToken\n }\n\n /** 登录 */\n public signIn(): Promise<MessageSignInData> {\n if (isServer)\n throw new Error('auth.signIn() 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(this.#lumi.config.authOrigin, 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 Error('Open auth window failed'))\n\n const timer = setInterval(() => {\n if (popup.closed)\n reject(new Error('Auth window closed'))\n }, 1000)\n\n // 全局点击事件处理函数 - 重新聚焦popup并阻止事件传播\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 MessageType.READY: {\n popup.postMessage({\n type: MessageType.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 MessageType.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 // 添加全局点击事件监听器,使用捕获阶段确保优先处理\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 /** 退出登录 */\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 handleStorageChange = (event: StorageEvent): void => {\n if (event.key === StorageKey.ACCESS_TOKEN || event.key === StorageKey.USER || event.key === null) {\n callback({\n isAuthenticated: this.isAuthenticated,\n user: this.user,\n })\n }\n }\n\n window.addEventListener('storage', handleStorageChange)\n\n return () => {\n window.removeEventListener('storage', handleStorageChange)\n }\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 { 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 }\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(429, '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 // 添加流式请求头\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 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","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'\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'\n\nexport function setStorage<T>(key: StorageKey, value: T, storage: Storage = localStorage): void {\n const oldValue = storage.getItem(key)\n const newValue = value ? JSON.stringify(value) : null\n if (newValue)\n storage.setItem(key, newValue)\n else\n storage.removeItem(key)\n\n window.dispatchEvent(new StorageEvent('storage', {\n key,\n oldValue,\n newValue,\n storageArea: storage,\n }))\n}\n\nexport function getStorage<T>(key: StorageKey, storage: Storage = localStorage): T | null {\n const value = storage.getItem(key)\n try {\n return value ? JSON.parse(value) : null\n }\n catch (_e) {\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('/find'), {\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<'json'> = {}): 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 { 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(400, '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(400, '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 { 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 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: LumiClientConfig) {\n this.config = config\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: LumiClientConfig): 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_uuid","import_enc_base64","import_enc_hex","import_hmac_sha256","import_sha256","import_object_hash","import_ofetch","LumiError","code","message","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","request","isAuthenticated","__spreadProps","response","isServer","requestStream","_0","_1","__async","setStorage","key","value","storage","oldValue","newValue","getStorage","_e","_lumi","_popupName","_user","LumiAuthClient","lumi","__privateAdd","__privateSet","isServer","authorization","__privateGet","getStorage","accessToken","setStorage","user","width","height","left","top","popup","cleanup","resolve","reject","timer","handleGlobalClick","event","handleMessage","data","origin","source","getIcon","getTitle","__async","res","request","callback","handleStorageChange","_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","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","LumiAuthClient","EntitiesClient","ToolsClient","FunctionsClient","createClient"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/auth-client.ts","../src/lib/request.ts","../src/lib/error.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 { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/lib/request'\nimport { v4 } from 'uuid'\nimport { MessageType, StorageKey } from '@/constants'\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 MessageSignInData {\n projectId: string\n accessToken: string\n user: User\n}\n\nexport type MessageDataReceive = {\n type: MessageType.READY\n} | {\n type: MessageType.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: MessageType.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 if (isServer)\n throw new Error('auth.signIn() 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(this.#lumi.config.authOrigin, 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 Error('Open auth window failed'))\n\n const timer = setInterval(() => {\n if (popup.closed)\n reject(new Error('Auth window closed'))\n }, 1000)\n\n // 全局点击事件处理函数 - 重新聚焦popup并阻止事件传播\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 MessageType.READY: {\n popup.postMessage({\n type: MessageType.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 MessageType.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 // 添加全局点击事件监听器,使用捕获阶段确保优先处理\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 /** 退出登录 */\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","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 { 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 }\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(429, '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 // 添加流式请求头\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 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","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('/find'), {\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 | undefined, value: string | null) => void) => () => void\n}\n\nexport function createDefaultStorageAdapter(): StorageAdapter {\n return {\n storage: {\n getItem: localStorage.getItem,\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: localStorage.removeItem,\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(400, '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(400, '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_uuid","import_enc_base64","import_enc_hex","import_hmac_sha256","import_sha256","import_object_hash","import_ofetch","LumiError","code","message","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","request","isAuthenticated","__spreadProps","response","isServer","requestStream","_0","_1","__async","setStorage","lumi","key","value","storage","getStorage","e","_lumi","_popupName","_user","LumiAuthClient","lumi","__privateAdd","__privateSet","isServer","authorization","__privateGet","getStorage","accessToken","setStorage","user","width","height","left","top","popup","cleanup","resolve","reject","timer","handleGlobalClick","event","handleMessage","data","origin","source","getIcon","getTitle","__async","res","request","callback","unlisten","key","_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
|
|
2
|
-
`),
|
|
3
|
-
`),
|
|
4
|
-
${t.data}`)}}}))})}checkLumiApiKey(){if(!
|
|
1
|
+
var oe=Object.defineProperty,ae=Object.defineProperties;var ce=Object.getOwnPropertyDescriptors;var _=Object.getOwnPropertySymbols;var le=Object.prototype.hasOwnProperty,me=Object.prototype.propertyIsEnumerable;var z=r=>{throw TypeError(r)};var H=(r,e,t)=>e in r?oe(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,A=(r,e)=>{for(var t in e||(e={}))le.call(e,t)&&H(r,t,e[t]);if(_)for(var t of _(e))me.call(e,t)&&H(r,t,e[t]);return r},F=(r,e)=>ae(r,ce(e));var J=(r,e,t)=>e.has(r)||z("Cannot "+t);var i=(r,e,t)=>(J(r,e,"read from private field"),t?t.call(r):e.get(r)),u=(r,e,t)=>e.has(r)?z("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);var a=(r,e,t)=>new Promise((s,o)=>{var n=p=>{try{y(t.next(p))}catch(h){o(h)}},m=p=>{try{y(t.throw(p))}catch(h){o(h)}},y=p=>p.done?s(p.value):Promise.resolve(p.value).then(n,m);y((t=t.apply(r,e)).next())});import{v4 as Se}from"uuid";import ue from"crypto-js/enc-base64";import pe from"crypto-js/enc-hex";import de from"crypto-js/hmac-sha256";import ge from"crypto-js/sha256";import he from"object-hash";import{ofetch as te}from"ofetch";var f=class extends Error{constructor(t,s){super(s);this.name="LumiError";this.code=t}};function Y(){var r,e;return(e=(r=document.querySelector('link[rel="icon"]'))==null?void 0:r.href)!=null?e:null}function V(){var r;return(r=document.title)!=null?r:null}var Q,w=typeof window=="undefined"&&((Q=globalThis.navigator)==null?void 0:Q.product)!=="ReactNative";function X(r){return new Promise(e=>setTimeout(e,r))}function Z(r){var e;return typeof process!="undefined"&&(e=process==null?void 0:process.env[r])!=null?e:null}var fe="6QrJZ7pFCmBZAeIJF7IArvkCz+EtzA0RVcpHkiQIsQyhs7QtCS9P+CueZdHfB2OtJcgX3BbqY9pfpWeAVTqCwQ==";function W(r){return encodeURIComponent(r).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function ye(r){let e=Math.floor(Date.now()/1e3).toString(),t=Math.random().toString(36).substring(2,15),s=A({},r.query),o=Object.keys(s).sort().map(c=>`${W(c)}=${W(String(s[c]))}`).join("&"),n={"x-timestamp":e,"x-nonce":t},m=Object.keys(n).sort().map(c=>`${c}:${n[c]}`).join(`
|
|
2
|
+
`),y=r.body&&!(r.body instanceof FormData)?JSON.stringify(r.body):"",p=ge(y).toString(pe),h=[o,m,p].join(`
|
|
3
|
+
`),I=ue.stringify(de(h,fe)),E=new Headers(r.headers);Object.entries(n).forEach(([c,j])=>{E.set(c,j)}),E.set("X-Sign",I),r.headers=E}var ee=new Map;function we(r,e){var m;let t=A({},e);e.body instanceof FormData&&(t.body=Array.from(e.body.entries())),t.headers=void 0;let s=he([r,t]),o=Date.now(),n=((m=ee.get(s))==null?void 0:m.filter(y=>o-y<1e3))||[];if(n.length>=4)throw new f(429,"Too many requests");n.push(o),ee.set(s,n)}function re(r,e,t,s=!1){t.headers=new Headers(t.headers),r.auth.accessToken&&t.headers.set("Authorization",`Bearer ${r.auth.accessToken}`),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")),we(e,t),ye(t)}function l(r,e,t={}){re(r,e,t);let s=r.auth.isAuthenticated;return te(e,F(A({baseURL:r.config.apiBaseUrl},t),{onResponse:({response:o})=>{var n;!w&&s&&((n=o._data)==null?void 0:n.code)===2100&&r.auth.signOut()}}))}function ie(s,o){return a(this,arguments,function*(r,e,t={}){return re(r,e,t,!0),yield te(e,F(A({baseURL:r.config.apiBaseUrl},t),{responseType:"stream"}))})}function K(r,e,t){let s=r.config.storageAdapter.storage;t!==null?s.setItem(e,JSON.stringify(t)):s.removeItem(e)}function G(r,e){let s=r.config.storageAdapter.storage.getItem(e);try{return s?JSON.parse(s):null}catch(o){return null}}var g,P,v,x=class{constructor(e){u(this,g);u(this,P,`lumi-auth-${Se()}`);u(this,v,null);d(this,g,e),Promise.resolve().then(()=>{!w&&this.isAuthenticated&&this.refreshUser()})}get accessToken(){if(w){let e=i(this,g).config.authorization;return e?e.replace("Bearer ",""):null}return G(i(this,g),"lumi-access-token")}set accessToken(e){if(w){i(this,g).config.authorization=e?`Bearer ${e}`:void 0;return}K(i(this,g),"lumi-access-token",e)}get user(){return w?i(this,v):G(i(this,g),"lumi-user")}set user(e){if(w){d(this,v,e);return}K(i(this,g),"lumi-user",e)}get isAuthenticated(){return!!this.accessToken}signIn(){if(w)throw new Error("auth.signIn() can only be called on the client side");let e=800,t=600,s=(window.screen.width-e)/2,o=(window.screen.height-t)/2,n=window.open(i(this,g).config.authOrigin,i(this,P),`width=${e},height=${t},left=${s},top=${o}`),m;return new Promise((y,p)=>{if(!n)return p(new Error("Open auth window failed"));let h=setInterval(()=>{n.closed&&p(new Error("Auth window closed"))},1e3),I=c=>{n.closed||(n.focus(),c.stopPropagation(),c.preventDefault())},E=({data:c,origin:j,source:ne})=>{if(!(j!==i(this,g).config.authOrigin||ne!==n))switch(c==null?void 0:c.type){case"lumi-ready":{n.postMessage({type:"lumi-init",data:{projectId:i(this,g).config.projectId,icon:Y(),title:V()}},i(this,g).config.authOrigin);break}case"lumi-sign-in":{if(c.data.projectId!==i(this,g).config.projectId)break;n.close(),window.focus(),this.accessToken=c.data.accessToken,this.user=c.data.user,y(c.data);break}}};window.addEventListener("message",E),document.addEventListener("click",I,!0),m=()=>{clearInterval(h),window.removeEventListener("message",E),document.removeEventListener("click",I,!0)}}).finally(()=>m==null?void 0:m())}signOut(){if(w)throw new Error("auth.signOut() can only be called on the client side");this.accessToken=null,this.user=null}refreshUser(){return a(this,null,function*(){let e=yield l(i(this,g),"/lm/user/info",{method:"POST"});if(e.code!==200)throw new Error(e.message);return this.user=e.data,e.data})}onAuthChange(e){if(w)throw new Error("auth.onAuthChange() can only be called on the client side");let t=i(this,g).config.storageAdapter.listen(s=>{(s==="lumi-access-token"||s==="lumi-user"||!s)&&e({isAuthenticated:this.isAuthenticated,user:this.user})});return()=>t()}};g=new WeakMap,P=new WeakMap,v=new WeakMap;var S,O=class{constructor(e,t){u(this,S);d(this,S,e),this.entityName=t}list(){return a(this,arguments,function*({filter:e,sort:t,limit:s,skip:o}={}){if(s){let n=yield l(i(this,S),this.uri("/find"),{method:"POST",body:{filter:e,sort:t,limit:s,skip:o}});if(n.code!==200)throw new Error(n.message);return n.data}else{let n=yield l(i(this,S),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 a(this,null,function*(){let t=yield l(i(this,S),this.uri(`/${e}`),{method:"GET"});if(t.code!==200)throw new Error(t.message);return t.data})}create(e){return a(this,null,function*(){let t=yield l(i(this,S),this.uri(),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}createMany(e){return a(this,null,function*(){let t=yield l(i(this,S),this.uri("/batch"),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}update(e,t){return a(this,null,function*(){let s=yield l(i(this,S),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 a(this,null,function*(){let t=yield l(i(this,S),this.uri(`/${e}`),{method:"DELETE"});if(t.code!==200)throw new Error(t.message)})}deleteMany(e){return a(this,null,function*(){let t=yield l(i(this,S),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,S).config.projectId}/${this.entityName}/documents${e}`}};S=new WeakMap;var L,M=class{constructor(e){u(this,L);return d(this,L,e),new Proxy(this,{get(t,s){return s in t||(t[s]=new O(i(t,L),s)),t[s]}})}};L=new WeakMap;import{ofetch as be}from"ofetch";var T,U=class{constructor(e){u(this,T);d(this,T,e)}invoke(e,t={}){return i(this,T).auth.accessToken&&(t.headers=A({Authorization:`Bearer ${i(this,T).auth.accessToken}`},t.headers)),be(`/v1/functions/${i(this,T).config.projectId}/${e}`,A({baseURL:i(this,T).config.apiBaseUrl},t))}};T=new WeakMap;function se(){return{storage:{getItem:localStorage.getItem,setItem:(r,e)=>{localStorage.setItem(r,e),window.dispatchEvent(new StorageEvent("storage",{key:r,oldValue:null,newValue:e,storageArea:localStorage}))},removeItem:localStorage.removeItem},listen:r=>{let e=t=>{r(t.key,t.newValue)};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}}}import{EventSourceParserStream as Ee}from"eventsource-parser/stream";var b,k=class{constructor(e){u(this,b);d(this,b,e)}generateText(s){return a(this,arguments,function*({model:e="gemini-2.5-flash",messages:t}){let o=this.checkLumiApiKey(),n=yield l(i(this,b),`/lm/${i(this,b).config.projectId}/ai/chat/completions`,{method:"POST",body:{lumiApiKey:o,modelName:e,chatMessages:t}});if(n.code!==200)throw new f(n.code,n.message);return n.data})}generateTextStream(s){return a(this,arguments,function*({model:e="gemini-2.5-flash",messages:t}){let o=this.checkLumiApiKey();return ie(i(this,b),`/lm/${i(this,b).config.projectId}/ai/chat/stream`,{method:"POST",body:{lumiApiKey:o,modelName:e,chatMessages:t}})})}generateImage(s){return a(this,arguments,function*({model:e="gemini-2.5-flash-image",messages:t}){let o=this.checkLumiApiKey(),{code:n,message:m,data:y}=yield l(i(this,b),`/lm/${i(this,b).config.projectId}/ai/image/task`,{method:"POST",body:{lumiApiKey:o,modelName:e,chatMessages:t}});if(n!==200)throw new f(n,m);let p=y,h=1e3;for(;p.generationStatus==="PROCESSING";){yield X(h),h<5e3&&(h+=500);let{code:I,message:E,data:c}=yield l(i(this,b),`/lm/${i(this,b).config.projectId}/ai/image/get`,{method:"POST",body:{lumiApiKey:o,messageId:p.messageId}});if(I!==200)throw new f(I,E);p=c}return p})}parseStream(e){return a(this,null,function*(){return e.pipeThrough(new TextDecoderStream).pipeThrough(new Ee).pipeThrough(new TransformStream({transform:(t,s)=>{try{let o=JSON.parse(t.data);s.enqueue({event:t.event,data:o})}catch(o){console.error(`Parse stream chunk failed: Invalid JSON.
|
|
4
|
+
${t.data}`)}}}))})}checkLumiApiKey(){if(!w)throw new f(400,"lumi.tools.ai is only available on the server-side");let e=Z("LUMI_API_KEY");if(!e)throw new f(400,"LUMI_API_KEY is required");return e}};b=new WeakMap;var R,D=class{constructor(e){u(this,R);d(this,R,e)}send(p){return a(this,arguments,function*({to:e,subject:t,fromName:s,html:o,text:n="",replyTo:m,scheduledAt:y}){if(!e||!t||!o&&!n)throw new Error("Failed to send email: Missing required parameters.");typeof e=="string"&&(e=[e]),typeof m=="string"&&(m=[m]);let h=yield l(i(this,R),`/lm/${i(this,R).config.projectId}/email/send`,{method:"POST",body:{to:e,subject:t,fromName:s,html:o,text:n,replyTo:m,scheduledAt:y}});if(h.code!==200)throw new f(h.code,h.message)})}};R=new WeakMap;var C,N=class{constructor(e){u(this,C);d(this,C,e)}upload(e){return a(this,null,function*(){let t=new FormData;e.forEach(o=>{t.append("files",o)});let s=yield l(i(this,C),`/lm/${i(this,C).config.projectId}/file/batch`,{method:"POST",body:t});if(s.code!==200)throw new f(s.code,s.message);return s.data})}delete(e){return a(this,null,function*(){let t=yield l(i(this,C),`/lm/${i(this,C).config.projectId}/file/batch`,{method:"DELETE",body:{fileUrls:e}});if(t.code!==200)throw new f(t.code,t.message)})}};C=new WeakMap;var q,$=class{constructor(e){u(this,q);d(this,q,e),this.email=new D(e),this.file=new N(e),this.ai=new k(e)}};q=new WeakMap;var B=class{constructor(e){var t;(t=e.storageAdapter)!=null||(e.storageAdapter=se()),this.config=e,this.auth=new x(this),this.entities=new M(this),this.tools=new $(this),this.functions=new U(this)}};function Et(r){return new B(r)}export{k as AITool,D as EmailTool,M as EntitiesClient,O as EntityClient,N as FileTool,U as FunctionsClient,x as LumiAuthClient,B as LumiClient,$ as ToolsClient,Et as createClient};
|
|
5
5
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/auth-client.ts","../src/lib/request.ts","../src/lib/error.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/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 } from '@/lib/request'\nimport { v4 } from 'uuid'\nimport { MessageType, StorageKey } from '@/constants'\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 MessageSignInData {\n projectId: string\n accessToken: string\n user: User\n}\n\nexport type MessageDataReceive = {\n type: MessageType.READY\n} | {\n type: MessageType.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: MessageType.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>(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(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>(StorageKey.USER)\n }\n\n public set user(user: User | null) {\n if (isServer) {\n this.#user = user\n return\n }\n setStorage(StorageKey.USER, user)\n }\n\n public get isAuthenticated(): boolean {\n return !!this.accessToken\n }\n\n /** 登录 */\n public signIn(): Promise<MessageSignInData> {\n if (isServer)\n throw new Error('auth.signIn() 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(this.#lumi.config.authOrigin, 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 Error('Open auth window failed'))\n\n const timer = setInterval(() => {\n if (popup.closed)\n reject(new Error('Auth window closed'))\n }, 1000)\n\n // 全局点击事件处理函数 - 重新聚焦popup并阻止事件传播\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 MessageType.READY: {\n popup.postMessage({\n type: MessageType.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 MessageType.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 // 添加全局点击事件监听器,使用捕获阶段确保优先处理\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 /** 退出登录 */\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 handleStorageChange = (event: StorageEvent): void => {\n if (event.key === StorageKey.ACCESS_TOKEN || event.key === StorageKey.USER || event.key === null) {\n callback({\n isAuthenticated: this.isAuthenticated,\n user: this.user,\n })\n }\n }\n\n window.addEventListener('storage', handleStorageChange)\n\n return () => {\n window.removeEventListener('storage', handleStorageChange)\n }\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 { 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 }\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(429, '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 // 添加流式请求头\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 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","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'\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'\n\nexport function setStorage<T>(key: StorageKey, value: T, storage: Storage = localStorage): void {\n const oldValue = storage.getItem(key)\n const newValue = value ? JSON.stringify(value) : null\n if (newValue)\n storage.setItem(key, newValue)\n else\n storage.removeItem(key)\n\n window.dispatchEvent(new StorageEvent('storage', {\n key,\n oldValue,\n newValue,\n storageArea: storage,\n }))\n}\n\nexport function getStorage<T>(key: StorageKey, storage: Storage = localStorage): T | null {\n const value = storage.getItem(key)\n try {\n return value ? JSON.parse(value) : null\n }\n catch (_e) {\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('/find'), {\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<'json'> = {}): 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 { 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(400, '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(400, '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 { 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 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: LumiClientConfig) {\n this.config = config\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: LumiClientConfig): LumiClient {\n return new LumiClient(config)\n}\n"],"mappings":"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","names":["v4","Base64","Hex","HmacSHA256","SHA256","hash","ofetch","LumiError","code","message","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","request","isAuthenticated","ofetch","__spreadProps","response","isServer","requestStream","_0","_1","__async","setStorage","key","value","storage","oldValue","newValue","getStorage","_e","_lumi","_popupName","_user","LumiAuthClient","lumi","__privateAdd","v4","__privateSet","isServer","authorization","__privateGet","getStorage","accessToken","setStorage","user","width","height","left","top","popup","cleanup","resolve","reject","timer","handleGlobalClick","event","handleMessage","data","origin","source","getIcon","getTitle","__async","res","request","callback","handleStorageChange","_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","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","LumiAuthClient","EntitiesClient","ToolsClient","FunctionsClient","createClient"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/auth-client.ts","../src/lib/request.ts","../src/lib/error.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 } from '@/lib/request'\nimport { v4 } from 'uuid'\nimport { MessageType, StorageKey } from '@/constants'\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 MessageSignInData {\n projectId: string\n accessToken: string\n user: User\n}\n\nexport type MessageDataReceive = {\n type: MessageType.READY\n} | {\n type: MessageType.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: MessageType.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 if (isServer)\n throw new Error('auth.signIn() 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(this.#lumi.config.authOrigin, 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 Error('Open auth window failed'))\n\n const timer = setInterval(() => {\n if (popup.closed)\n reject(new Error('Auth window closed'))\n }, 1000)\n\n // 全局点击事件处理函数 - 重新聚焦popup并阻止事件传播\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 MessageType.READY: {\n popup.postMessage({\n type: MessageType.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 MessageType.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 // 添加全局点击事件监听器,使用捕获阶段确保优先处理\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 /** 退出登录 */\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","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 { 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 }\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(429, '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 // 添加流式请求头\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 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","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('/find'), {\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 | undefined, value: string | null) => void) => () => void\n}\n\nexport function createDefaultStorageAdapter(): StorageAdapter {\n return {\n storage: {\n getItem: localStorage.getItem,\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: localStorage.removeItem,\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(400, '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(400, '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":["v4","Base64","Hex","HmacSHA256","SHA256","hash","ofetch","LumiError","code","message","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","request","isAuthenticated","ofetch","__spreadProps","response","isServer","requestStream","_0","_1","__async","setStorage","lumi","key","value","storage","getStorage","e","_lumi","_popupName","_user","LumiAuthClient","lumi","__privateAdd","v4","__privateSet","isServer","authorization","__privateGet","getStorage","accessToken","setStorage","user","width","height","left","top","popup","cleanup","resolve","reject","timer","handleGlobalClick","event","handleMessage","data","origin","source","getIcon","getTitle","__async","res","request","callback","unlisten","key","_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.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "SDK for Lumi.new",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -12,6 +12,11 @@
|
|
|
12
12
|
"engines": {
|
|
13
13
|
"node": ">=18"
|
|
14
14
|
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsup",
|
|
17
|
+
"lint": "eslint --fix",
|
|
18
|
+
"test": "jest"
|
|
19
|
+
},
|
|
15
20
|
"dependencies": {
|
|
16
21
|
"crypto-js": "^4.2.0",
|
|
17
22
|
"eventsource-parser": "^3.0.6",
|
|
@@ -31,10 +36,5 @@
|
|
|
31
36
|
"ts-node": "^10.9.2",
|
|
32
37
|
"tsup": "^8.5.0",
|
|
33
38
|
"typescript": "^5.8.3"
|
|
34
|
-
},
|
|
35
|
-
"scripts": {
|
|
36
|
-
"build": "tsup",
|
|
37
|
-
"lint": "eslint --fix",
|
|
38
|
-
"test": "jest"
|
|
39
39
|
}
|
|
40
|
-
}
|
|
40
|
+
}
|