@bty/feed_app-runtime-sdk 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -105,7 +105,7 @@ export function App() {
105
105
 
106
106
  return (
107
107
  <main>
108
- <p>{tokenLoading ? 'Loading...' : user?.nickName}</p>
108
+ <p>{tokenLoading ? 'Loading...' : (user?.username ?? user?.nickname)}</p>
109
109
  <button onClick={() => chat.send('Hello')}>Send</button>
110
110
  <button onClick={chat.stop} disabled={!chat.loading}>Stop</button>
111
111
  {chat.messages.map((message, index) => (
package/dist/ai/index.js CHANGED
@@ -1,3 +1,3 @@
1
- var X={version:"0.0.2"};var y="/api/feed-app/runtime/ai",Y=`${y}/models`,H=`${y}/chat/completions`,D=`${y}/messages`,W=`${y}/images/generations`,z=`${y}/audio/speech`,Z=`${y}/video/generations`,ee="Authorization",te="x-bty-app",re="x-bty-extend",ne=X.version;var Be=/\r\n|\r|\n/,Fe=(()=>{let e=new TextDecoder;return (t,r)=>e.decode(t,{stream:r})})();async function*se(e){let t=e.getReader(),r="",n="",s=[],o=()=>{if(s.length===0&&!n)return null;let c={event:n||"message",data:s.join(`
2
- `)};return n="",s=[],c};try{for(;;){let{done:c,value:p}=await t.read();if(c){let i=o();i&&(yield i);return}for(r+=Fe(p,!0);;){let i=Be.exec(r);if(!i)break;let l=r.slice(0,i.index);if(r=r.slice(i.index+i[0].length),l===""){let f=o();f&&(yield f);continue}if(l.startsWith(":"))continue;let h=l.indexOf(":"),I=h===-1?l:l.slice(0,h),d=h===-1?"":l.slice(h+1);d.startsWith(" ")&&(d=d.slice(1)),I==="event"?n=d:I==="data"&&s.push(d);}}}finally{t.releaseLock();}}async function*oe(e){for await(let t of se(e)){if(t.data==="[DONE]")return;t.data&&(yield JSON.parse(t.data));}}async function*ie(e){for await(let t of se(e))t.data&&(yield JSON.parse(t.data));}var qe="https://reactus-api.betteryeah.com",Ge=()=>{try{if(typeof __BTY_RUNTIME_API_BASE_URL__=="string"&&__BTY_RUNTIME_API_BASE_URL__.length>0)return __BTY_RUNTIME_API_BASE_URL__}catch{}},B={apiBaseUrl:(Ge()??qe).replace(/\/+$/,""),projectId:""},je=e=>{B={...B,...e,...e.apiBaseUrl?{apiBaseUrl:e.apiBaseUrl.replace(/\/+$/,"")}:{}};},P=()=>B;var m=class extends Error{status;code;body;constructor(t,r,n,s=null){super(t),this.name="AiError",this.code=r,this.status=n,this.body=s;}},g=class extends m{constructor(t="Auth required",r=null){super(t,"auth_required",401,r),this.name="AuthRequiredError";}},O=class extends m{constructor(t="Rate limit exceeded",r=null){super(t,"rate_limit",429,r),this.name="RateLimitError";}},M=class extends m{constructor(t="Quota exceeded",r=null){super(t,"quota_exceeded",402,r),this.name="QuotaExceededError";}},N=class extends m{constructor(t,r=400,n=null){super(t,"bad_input",r,n),this.name="BadInputError";}},k=class extends m{constructor(t,r=500,n=null){super(t,"server",r,n),this.name="ServerError";}},A=class extends m{constructor(t="Network error",r){super(t,"network",-1,r),this.name="NetworkError";}},S=class extends m{constructor(t="Request aborted"){super(t,"aborted",-1,null),this.name="AbortedError";}},ae=e=>typeof e=="object"&&e!==null,Ve=(e,t)=>{if(typeof e=="string")return e||t;if(!ae(e))return t;let r=e.message;if(typeof r=="string"&&r.length>0)return r;let n=e.error;if(typeof n=="string"&&n.length>0)return n;if(ae(n)&&typeof n.message=="string"&&n.message.length>0)return n.message;let s=e.detail;return typeof s=="string"&&s.length>0?s:t},ce=(e,t)=>{let r=Ve(t,`HTTP ${e}`);return e===401||e===403?new g(r,t):e===402?new M(r,t):e===429?new O(r,t):e>=400&&e<500?new N(r,e,t):e>=500?new k(r,e,t):new m(r,"unknown",e,t)};var u=()=>typeof window<"u"&&typeof document<"u";var Je="hostRuntime",F=class{listeners=new Map;on(t,r){let n=this.listeners.get(t),s=n??new Set;return n||this.listeners.set(t,s),s.add(r),()=>{s.delete(r),s.size===0&&this.listeners.delete(t);}}emit(t,r){let n=this.listeners.get(t);if(n)for(let s of n)s(r);}},a=new F,pe=0,q=e=>(pe+=1,`${e}.${pe}`),ue=false,le=()=>{if(!u()||ue)return;ue=true,Reflect.set(window,Je,{receiveMessage(t){if(!t)return;let r=t.endpoint;r&&a.emit(r,t.data??t);}});};var C=e=>typeof e=="object"&&e!==null,R=(e,t)=>{if(e)for(let r of t){let n=e[r];if(typeof n=="string"&&n.length>0)return n}},E=e=>{if(!C(e))return null;let t=C(e.credentials)?e.credentials:void 0,r=C(e.user)?e.user:void 0,n=R(e,["uid","userId","id"])??R(t,["uid","userId","id"])??R(r,["uid","userId","id"]),s=R(e,["token","authToken"])??R(t,["token","authToken"]);return !n||!s?null:{uid:n,token:s}},b=e=>{if(!C(e))return null;let t=C(e.data)?e.data:e,r=R(t,["uid","userId","id"]);return r?{...t,uid:r}:null};var de="HostApp",G="hostListener";var me="processUserCredentials",fe="processUserInfo",Ee="user.getCredentials";var _="user.credentials",j="user.info",ge="user-credentials-request",he="user-credentials-response";var ye="user-info-response",Ae={iOS:[1,6,7],Android:[1,1,8]},Re=3e3,_e=500,Te=50,Se=1500;var $e=e=>typeof e!="object"||e===null?false:typeof Reflect.get(e,"type")=="string",Ce=false,we=()=>{!u()||Ce||(Ce=true,le(),Reflect.set(window,me,e=>{E(e)&&a.emit(_,e);}),Reflect.set(window,fe,e=>{b(e)&&a.emit(j,e);}),window.addEventListener("message",e=>{let t=e.data;if($e(t))switch(t.type){case he:a.emit("iframe.credentials",t);break;case ye:a.emit("iframe.userinfo",t);break}}));};var Qe=new RegExp(`${de}\\/(\\d+\\.\\d+\\.\\d+)\\/(\\d+)\\/(iOS|Android)`),Ke=e=>{let t=e.split(".").map(r=>Number.parseInt(r,10));return [t[0]??0,t[1]??0,t[2]??0]},Xe=(e,t)=>{for(let r=0;r<3;r++){if(e[r]>t[r])return true;if(e[r]<t[r])return false}return true},Ye=e=>{let t=e.match(Qe);if(!t)return null;let[,r,n,s]=t;if(!r||!n||s!=="iOS"&&s!=="Android")return null;let o=Xe(Ke(r),Ae[s]);return {type:"native_app",platform:s,appVersion:r,buildNumber:n,meetsMinVersion:o}},xe=()=>{if(!u())return {type:"web",meetsMinVersion:false};let e=Ye(navigator.userAgent??"");return e||(window.parent!==window?{type:"iframe",meetsMinVersion:false}:{type:"web",meetsMinVersion:false})};var We=(e,t,r)=>new Promise(n=>{let s=false,o=i=>{s||(s=true,c(),clearTimeout(p),n(i));},c=a.on(t,i=>{let l=r(i);l&&o(l);}),p=setTimeout(()=>o(null),_e);try{window.parent.postMessage({type:e,timestamp:Date.now()},"*");}catch{o(null);}}),Ie=()=>We(ge,"iframe.credentials",E);var Pe=e=>typeof e!="object"||e===null?false:typeof Reflect.get(e,"postMessage")=="function",V=e=>{let t=Reflect.get(window,"webkit");if(typeof t=="object"&&t!==null){let n=Reflect.get(t,"messageHandlers");if(typeof n=="object"&&n!==null){let s=Reflect.get(n,e);if(Pe(s))return s}}let r=Reflect.get(window,e);return Pe(r)?r:null},Oe=(e,t={})=>{let{pollIntervalMs:r=50,timeoutMs:n=1500}=t;return new Promise(s=>{let o=Date.now(),c=()=>{let p=V(e);if(p){s(p);return}if(Date.now()-o>=n){s(null);return}setTimeout(c,r);};c();})};var ze=async(e,t,r,n)=>{let s=e.platform==="Android"?await Oe(G,{pollIntervalMs:Te,timeoutMs:Se}):V(G);if(!s)return null;let o=q(r);return new Promise(c=>{let p=false,i=d=>{p||(p=true,l(),h(),clearTimeout(I),c(d));},l=a.on(o,d=>{let f=n(d);f&&i(f);}),h=a.on(r,d=>{let f=n(d);f&&i(f);}),I=setTimeout(()=>i(null),Re);try{s.postMessage({command:t,parameters:JSON.stringify({timestamp:Date.now(),endpoint:o})});}catch{i(null);}})},Me=e=>ze(e,Ee,_,E);we();var J=null,w=null,Ze=e=>{switch(e.type){case "native_app":return e.meetsMinVersion?Me(e):Promise.resolve(null);case "iframe":return Ie();case "web":return Promise.resolve(null)}};var Ne=e=>{J=e;},ke=()=>w||(w=Ze(xe()).then(e=>(e&&Ne(e),e)).finally(()=>{w=null;}),w);u()&&a.on(_,e=>{let t=E(e);t&&Ne(t);});var $=async()=>u()?J?J.token:(await ke())?.token??"":"",be=async()=>u()?(await ke())?.token??"":"";var et=e=>JSON.stringify({"sdk-version":ne,...e}),ve=async(e={})=>{let{projectId:t}=P(),r=await $(),n=new Headers;if(r&&n.set(ee,`Bearer ${r}`),t&&n.set(te,t),n.set(re,et(e.extend)),e.contentType&&n.set("Content-Type",e.contentType),e.accept&&n.set("Accept",e.accept),e.extra)for(let[s,o]of Object.entries(e.extra))n.set(s,o);return n};var tt="feed-app-runtime-sdk:auth-required",Q=e=>{u()&&window.dispatchEvent(new CustomEvent(tt,{detail:e}));};var rt=e=>e instanceof DOMException&&e.name==="AbortError",nt=async e=>{let t=e.headers.get("content-type")??"";try{return t.includes("application/json")?await e.json():await e.text()}catch{return null}},Ue=async(e,t)=>{let{apiBaseUrl:r}=P(),n=`${r}${e}`,s=await ve(t),o;try{o=await fetch(n,{method:t.method??"POST",headers:s,body:t.body,signal:t.signal});}catch(p){throw rt(p)?new S:new A("Failed to reach AI backend",p)}if(o.ok)return o;let c=await nt(o);throw ce(o.status,c)},v=async(e,t={})=>{try{return await Ue(e,t)}catch(r){if(r instanceof g&&!t.skipAuthRetry&&!t.signal?.aborted){if(!await be())throw Q({reason:"refresh_failed",error:r}),r;try{return await Ue(e,{...t,skipAuthRetry:!0})}catch(s){throw s instanceof g&&Q({reason:"retry_rejected",error:s}),s}}throw r}},T=async(e,t,r={})=>await(await v(e,{...r,method:"POST",contentType:"application/json",body:JSON.stringify(t)})).json(),Le=async(e,t={})=>await(await v(e,{...t,method:"GET"})).json(),U=async(e,t,r={})=>{let n=await v(e,{...r,method:"POST",contentType:"application/json",accept:"text/event-stream",body:JSON.stringify(t)});if(!n.body)throw new A("Streaming response has no body");return n.body},He=async(e,t,r={})=>await(await v(e,{...r,method:"POST",contentType:"application/json",body:JSON.stringify(t)})).blob();var L=e=>{let{signal:t,headers:r,...n}=e;return {transport:{signal:t,extra:r},payload:n}},st=(async e=>{let{transport:t,payload:r}=L(e);if(e.stream){let n=await U(H,r,t);return oe(n)}return await T(H,r,t)}),ot={create:st},it={async generate(e){let{transport:t,payload:r}=L(e);return T(W,r,t)}},at={speech:{async create(e){let{transport:t,payload:r}=L(e);return He(z,r,t)}}},ct={generations:{async create(e){let{transport:t,payload:r}=L(e);return T(Z,r,t)}}},pt={chat:{completions:ot},images:it,audio:at,video:ct};var ut=e=>{let{signal:t,headers:r,...n}=e;return {transport:{signal:t,extra:r},payload:n}},lt=(async e=>{let{transport:t,payload:r}=ut(e);if(e.stream){let n=await U(D,r,t);return ie(n)}return await T(D,r,t)}),dt={messages:{create:lt}};var K=null,x=null,mt=async e=>(await Le(Y,{signal:e})).data??[],ft=async(e={})=>!e.force&&K?K:(!e.force&&x||(x=mt(e.signal).then(t=>(K=t,t)).finally(()=>{x=null;})),x),Et={list:ft};
3
- export{S as AbortedError,m as AiError,g as AuthRequiredError,N as BadInputError,A as NetworkError,M as QuotaExceededError,O as RateLimitError,k as ServerError,dt as anthropic,je as configureRuntime,Et as models,pt as openai};
1
+ var X={version:"0.0.3"};var A="/v1/feed-app/runtime/ai",Y=`${A}/models`,H=`${A}/chat/completions`,D=`${A}/messages`,W=`${A}/images/generations`,z=`${A}/audio/speech`,Z=`${A}/video/generations`,ee="Authorization",te="x-bty-app",ne="x-bty-extend",re=X.version;var Fe=/\r\n|\r|\n/,Be=(()=>{let e=new TextDecoder;return (t,n)=>e.decode(t,{stream:n})})();async function*se(e){let t=e.getReader(),n="",r="",s=[],o=()=>{if(s.length===0&&!r)return null;let c={event:r||"message",data:s.join(`
2
+ `)};return r="",s=[],c};try{for(;;){let{done:c,value:p}=await t.read();if(c){let i=o();i&&(yield i);return}for(n+=Be(p,!0);;){let i=Fe.exec(n);if(!i)break;let l=n.slice(0,i.index);if(n=n.slice(i.index+i[0].length),l===""){let f=o();f&&(yield f);continue}if(l.startsWith(":"))continue;let y=l.indexOf(":"),I=y===-1?l:l.slice(0,y),d=y===-1?"":l.slice(y+1);d.startsWith(" ")&&(d=d.slice(1)),I==="event"?r=d:I==="data"&&s.push(d);}}}finally{t.releaseLock();}}async function*oe(e){for await(let t of se(e)){if(t.data==="[DONE]")return;t.data&&(yield JSON.parse(t.data));}}async function*ie(e){for await(let t of se(e))t.data&&(yield JSON.parse(t.data));}var qe="https://reactus-api.betteryeah.com",Ge=()=>{try{if(typeof __BTY_RUNTIME_API_BASE_URL__=="string"&&__BTY_RUNTIME_API_BASE_URL__.length>0)return __BTY_RUNTIME_API_BASE_URL__}catch{}},F={apiBaseUrl:(Ge()??qe).replace(/\/+$/,""),projectId:""},je=e=>{F={...F,...e,...e.apiBaseUrl?{apiBaseUrl:e.apiBaseUrl.replace(/\/+$/,"")}:{}};},P=()=>F;var m=class extends Error{status;code;body;constructor(t,n,r,s=null){super(t),this.name="AiError",this.code=n,this.status=r,this.body=s;}},g=class extends m{constructor(t="Auth required",n=null){super(t,"auth_required",401,n),this.name="AuthRequiredError";}},k=class extends m{constructor(t="Rate limit exceeded",n=null){super(t,"rate_limit",429,n),this.name="RateLimitError";}},O=class extends m{constructor(t="Quota exceeded",n=null){super(t,"quota_exceeded",402,n),this.name="QuotaExceededError";}},N=class extends m{constructor(t,n=400,r=null){super(t,"bad_input",n,r),this.name="BadInputError";}},b=class extends m{constructor(t,n=500,r=null){super(t,"server",n,r),this.name="ServerError";}},R=class extends m{constructor(t="Network error",n){super(t,"network",-1,n),this.name="NetworkError";}},S=class extends m{constructor(t="Request aborted"){super(t,"aborted",-1,null),this.name="AbortedError";}},ae=e=>typeof e=="object"&&e!==null,Ve=(e,t)=>{if(typeof e=="string")return e||t;if(!ae(e))return t;let n=e.message;if(typeof n=="string"&&n.length>0)return n;let r=e.error;if(typeof r=="string"&&r.length>0)return r;if(ae(r)&&typeof r.message=="string"&&r.message.length>0)return r.message;let s=e.detail;return typeof s=="string"&&s.length>0?s:t},ce=(e,t)=>{let n=Ve(t,`HTTP ${e}`);return e===401||e===403?new g(n,t):e===402?new O(n,t):e===429?new k(n,t):e>=400&&e<500?new N(n,e,t):e>=500?new b(n,e,t):new m(n,"unknown",e,t)};var u=()=>typeof window<"u"&&typeof document<"u";var Je="hostRuntime",B=class{listeners=new Map;on(t,n){let r=this.listeners.get(t),s=r??new Set;return r||this.listeners.set(t,s),s.add(n),()=>{s.delete(n),s.size===0&&this.listeners.delete(t);}}emit(t,n){let r=this.listeners.get(t);if(r)for(let s of r)s(n);}},a=new B,pe=0,q=e=>(pe+=1,`${e}.${pe}`),ue=false,le=()=>{if(!u()||ue)return;ue=true,Reflect.set(window,Je,{receiveMessage(t){if(!t)return;let n=t.endpoint;n&&a.emit(n,t.data??t);}});};var C=e=>typeof e=="object"&&e!==null,h=(e,t)=>{if(e)for(let n of t){let r=e[n];if(typeof r=="string"&&r.length>0)return r}},$e=(e,t)=>{if(e)for(let n of t){let r=e[n];if(typeof r=="string"&&r.length>0||typeof r=="number"&&Number.isFinite(r))return r}},E=e=>{if(!C(e))return null;let t=C(e.credentials)?e.credentials:void 0,n=C(e.user)?e.user:void 0,r=h(e,["uid","userId","id"])??h(t,["uid","userId","id"])??h(n,["uid","userId","id"]),s=h(e,["token","authToken"])??h(t,["token","authToken"]);return !r||!s?null:{uid:r,token:s}},v=e=>{if(!C(e))return null;let t=C(e.data)?e.data:e,n=$e(t,["userId","id","uid"]);if(n===void 0)return null;let r=h(t,["username","nickname","nickName","name"]),s=h(t,["nickname","nickName","username"]);return {...t,userId:n,...r?{username:r}:{},...s?{nickname:s}:{}}};var de="HostApp",G="hostListener";var me="processUserCredentials",fe="processUserInfo",Ee="user.getCredentials";var _="user.credentials",j="user.info",ge="user-credentials-request",he="user-credentials-response";var ye="user-info-response",Ae={iOS:[1,6,7],Android:[1,1,8]},Re=3e3,_e=500,Te=50,Se=1500;var Qe=e=>typeof e!="object"||e===null?false:typeof Reflect.get(e,"type")=="string",Ce=false,we=()=>{!u()||Ce||(Ce=true,le(),Reflect.set(window,me,e=>{E(e)&&a.emit(_,e);}),Reflect.set(window,fe,e=>{v(e)&&a.emit(j,e);}),window.addEventListener("message",e=>{let t=e.data;if(Qe(t))switch(t.type){case he:a.emit("iframe.credentials",t);break;case ye:a.emit("iframe.userinfo",t);break}}));};var Ke=new RegExp(`${de}\\/(\\d+\\.\\d+\\.\\d+)\\/(\\d+)\\/(iOS|Android)`),Xe=e=>{let t=e.split(".").map(n=>Number.parseInt(n,10));return [t[0]??0,t[1]??0,t[2]??0]},Ye=(e,t)=>{for(let n=0;n<3;n++){if(e[n]>t[n])return true;if(e[n]<t[n])return false}return true},We=e=>{let t=e.match(Ke);if(!t)return null;let[,n,r,s]=t;if(!n||!r||s!=="iOS"&&s!=="Android")return null;let o=Ye(Xe(n),Ae[s]);return {type:"native_app",platform:s,appVersion:n,buildNumber:r,meetsMinVersion:o}},xe=()=>{if(!u())return {type:"web",meetsMinVersion:false};let e=We(navigator.userAgent??"");return e||(window.parent!==window?{type:"iframe",meetsMinVersion:false}:{type:"web",meetsMinVersion:false})};var ze=(e,t,n)=>new Promise(r=>{let s=false,o=i=>{s||(s=true,c(),clearTimeout(p),r(i));},c=a.on(t,i=>{let l=n(i);l&&o(l);}),p=setTimeout(()=>o(null),_e);try{window.parent.postMessage({type:e,timestamp:Date.now()},"*");}catch{o(null);}}),Ie=()=>ze(ge,"iframe.credentials",E);var Pe=e=>typeof e!="object"||e===null?false:typeof Reflect.get(e,"postMessage")=="function",V=e=>{let t=Reflect.get(window,"webkit");if(typeof t=="object"&&t!==null){let r=Reflect.get(t,"messageHandlers");if(typeof r=="object"&&r!==null){let s=Reflect.get(r,e);if(Pe(s))return s}}let n=Reflect.get(window,e);return Pe(n)?n:null},ke=(e,t={})=>{let{pollIntervalMs:n=50,timeoutMs:r=1500}=t;return new Promise(s=>{let o=Date.now(),c=()=>{let p=V(e);if(p){s(p);return}if(Date.now()-o>=r){s(null);return}setTimeout(c,n);};c();})};var Ze=async(e,t,n,r)=>{let s=e.platform==="Android"?await ke(G,{pollIntervalMs:Te,timeoutMs:Se}):V(G);if(!s)return null;let o=q(n);return new Promise(c=>{let p=false,i=d=>{p||(p=true,l(),y(),clearTimeout(I),c(d));},l=a.on(o,d=>{let f=r(d);f&&i(f);}),y=a.on(n,d=>{let f=r(d);f&&i(f);}),I=setTimeout(()=>i(null),Re);try{s.postMessage({command:t,parameters:JSON.stringify({timestamp:Date.now(),endpoint:o})});}catch{i(null);}})},Oe=e=>Ze(e,Ee,_,E);we();var J=null,w=null,et=e=>{switch(e.type){case "native_app":return e.meetsMinVersion?Oe(e):Promise.resolve(null);case "iframe":return Ie();case "web":return Promise.resolve(null)}};var Ne=e=>{J=e;},be=()=>w||(w=et(xe()).then(e=>(e&&Ne(e),e)).finally(()=>{w=null;}),w);u()&&a.on(_,e=>{let t=E(e);t&&Ne(t);});var $=async()=>u()?J?J.token:(await be())?.token??"":"",ve=async()=>u()?(await be())?.token??"":"";var tt=e=>JSON.stringify({"sdk-version":re,...e}),Me=async(e={})=>{let{projectId:t}=P(),n=await $(),r=new Headers;if(n&&r.set(ee,`Bearer ${n}`),t&&r.set(te,t),r.set(ne,tt(e.extend)),e.contentType&&r.set("Content-Type",e.contentType),e.accept&&r.set("Accept",e.accept),e.extra)for(let[s,o]of Object.entries(e.extra))r.set(s,o);return r};var nt="feed-app-runtime-sdk:auth-required",Q=e=>{u()&&window.dispatchEvent(new CustomEvent(nt,{detail:e}));};var rt=e=>e instanceof DOMException&&e.name==="AbortError",st=async e=>{let t=e.headers.get("content-type")??"";try{return t.includes("application/json")?await e.json():await e.text()}catch{return null}},Ue=async(e,t)=>{let{apiBaseUrl:n}=P(),r=`${n}${e}`,s=await Me(t),o;try{o=await fetch(r,{method:t.method??"POST",headers:s,body:t.body,signal:t.signal});}catch(p){throw rt(p)?new S:new R("Failed to reach AI backend",p)}if(o.ok)return o;let c=await st(o);throw ce(o.status,c)},M=async(e,t={})=>{try{return await Ue(e,t)}catch(n){if(n instanceof g&&!t.skipAuthRetry&&!t.signal?.aborted){if(!await ve())throw Q({reason:"refresh_failed",error:n}),n;try{return await Ue(e,{...t,skipAuthRetry:!0})}catch(s){throw s instanceof g&&Q({reason:"retry_rejected",error:s}),s}}throw n}},T=async(e,t,n={})=>await(await M(e,{...n,method:"POST",contentType:"application/json",body:JSON.stringify(t)})).json(),Le=async(e,t={})=>await(await M(e,{...t,method:"GET"})).json(),U=async(e,t,n={})=>{let r=await M(e,{...n,method:"POST",contentType:"application/json",accept:"text/event-stream",body:JSON.stringify(t)});if(!r.body)throw new R("Streaming response has no body");return r.body},He=async(e,t,n={})=>await(await M(e,{...n,method:"POST",contentType:"application/json",body:JSON.stringify(t)})).blob();var L=e=>{let{signal:t,headers:n,...r}=e;return {transport:{signal:t,extra:n},payload:r}},ot=(async e=>{let{transport:t,payload:n}=L(e);if(e.stream){let r=await U(H,n,t);return oe(r)}return await T(H,n,t)}),it={create:ot},at={async generate(e){let{transport:t,payload:n}=L(e);return T(W,n,t)}},ct={speech:{async create(e){let{transport:t,payload:n}=L(e);return He(z,n,t)}}},pt={generations:{async create(e){let{transport:t,payload:n}=L(e);return T(Z,n,t)}}},ut={chat:{completions:it},images:at,audio:ct,video:pt};var lt=e=>{let{signal:t,headers:n,...r}=e;return {transport:{signal:t,extra:n},payload:r}},dt=(async e=>{let{transport:t,payload:n}=lt(e);if(e.stream){let r=await U(D,n,t);return ie(r)}return await T(D,n,t)}),mt={messages:{create:dt}};var K=null,x=null,ft=async e=>(await Le(Y,{signal:e})).data??[],Et=async(e={})=>!e.force&&K?K:(!e.force&&x||(x=ft(e.signal).then(t=>(K=t,t)).finally(()=>{x=null;})),x),gt={list:Et};
3
+ export{S as AbortedError,m as AiError,g as AuthRequiredError,N as BadInputError,R as NetworkError,O as QuotaExceededError,k as RateLimitError,b as ServerError,mt as anthropic,je as configureRuntime,gt as models,ut as openai};
@@ -1,4 +1,4 @@
1
- import { U as UserInfo } from '../types-CLPiEZOp.js';
1
+ import { U as UserInfo } from '../types-CLujY9ck.js';
2
2
  import { p as ChatMessage, i as AiError } from '../errors-C0zJPCCU.js';
3
3
 
4
4
  interface UseAuthTokenResult {
@@ -11,8 +11,8 @@ interface UseAuthTokenResult {
11
11
  /**
12
12
  * 鉴权 token。挂载时拉一次,业务需要刷新时调用 refetch。
13
13
  *
14
- * 注意:token 是字符串,不是 Credentials。如果你需要 uid,配合
15
- * `useUserInfo()` 用——uid 在那里。
14
+ * 注意:token 是字符串,不是 Credentials。如果你需要 userId,配合
15
+ * `useUserInfo()` 用。
16
16
  */
17
17
  declare const useAuthToken: () => UseAuthTokenResult;
18
18
 
@@ -1,3 +1,3 @@
1
- import {useState,useCallback,useEffect,useRef}from'react';var g=()=>typeof window<"u"&&typeof document<"u";var it="hostRuntime",q=class{listeners=new Map;on(t,n){let r=this.listeners.get(t),s=r??new Set;return r||this.listeners.set(t,s),s.add(n),()=>{s.delete(n),s.size===0&&this.listeners.delete(t);}}emit(t,n){let r=this.listeners.get(t);if(r)for(let s of r)s(n);}},m=new q,oe=0,G=e=>(oe+=1,`${e}.${oe}`),ie=false,ae=()=>{if(!g()||ie)return;ie=true,Reflect.set(window,it,{receiveMessage(t){if(!t)return;let n=t.endpoint;n&&m.emit(n,t.data??t);}});};var k=e=>typeof e=="object"&&e!==null,R=(e,t)=>{if(e)for(let n of t){let r=e[n];if(typeof r=="string"&&r.length>0)return r}},y=e=>{if(!k(e))return null;let t=k(e.credentials)?e.credentials:void 0,n=k(e.user)?e.user:void 0,r=R(e,["uid","userId","id"])??R(t,["uid","userId","id"])??R(n,["uid","userId","id"]),s=R(e,["token","authToken"])??R(t,["token","authToken"]);return !r||!s?null:{uid:r,token:s}},_=e=>{if(!k(e))return null;let t=k(e.data)?e.data:e,n=R(t,["uid","userId","id"]);return n?{...t,uid:n}:null};var ce="HostApp",j="hostListener";var ue="processUserCredentials",pe="processUserInfo",le="user.getCredentials",de="user.getUserInfo",T="user.credentials",O="user.info",me="user-credentials-request",fe="user-credentials-response",ge="user-info-request",Ee="user-info-response",he={iOS:[1,6,7],Android:[1,1,8]},ye=3e3,Ae=500,Re=50,_e=1500;var at=e=>typeof e!="object"||e===null?false:typeof Reflect.get(e,"type")=="string",Te=false,Se=()=>{!g()||Te||(Te=true,ae(),Reflect.set(window,ue,e=>{y(e)&&m.emit(T,e);}),Reflect.set(window,pe,e=>{_(e)&&m.emit(O,e);}),window.addEventListener("message",e=>{let t=e.data;if(at(t))switch(t.type){case fe:m.emit("iframe.credentials",t);break;case Ee:m.emit("iframe.userinfo",t);break}}));};var ct=new RegExp(`${ce}\\/(\\d+\\.\\d+\\.\\d+)\\/(\\d+)\\/(iOS|Android)`),ut=e=>{let t=e.split(".").map(n=>Number.parseInt(n,10));return [t[0]??0,t[1]??0,t[2]??0]},pt=(e,t)=>{for(let n=0;n<3;n++){if(e[n]>t[n])return true;if(e[n]<t[n])return false}return true},lt=e=>{let t=e.match(ct);if(!t)return null;let[,n,r,s]=t;if(!n||!r||s!=="iOS"&&s!=="Android")return null;let o=pt(ut(n),he[s]);return {type:"native_app",platform:s,appVersion:n,buildNumber:r,meetsMinVersion:o}},V=()=>{if(!g())return {type:"web",meetsMinVersion:false};let e=lt(navigator.userAgent??"");return e||(window.parent!==window?{type:"iframe",meetsMinVersion:false}:{type:"web",meetsMinVersion:false})};var Ce=(e,t,n)=>new Promise(r=>{let s=false,o=i=>{s||(s=true,a(),clearTimeout(p),r(i));},a=m.on(t,i=>{let f=n(i);f&&o(f);}),p=setTimeout(()=>o(null),Ae);try{window.parent.postMessage({type:e,timestamp:Date.now()},"*");}catch{o(null);}}),xe=()=>Ce(me,"iframe.credentials",y),we=()=>Ce(ge,"iframe.userinfo",_);var Ie=e=>typeof e!="object"||e===null?false:typeof Reflect.get(e,"postMessage")=="function",J=e=>{let t=Reflect.get(window,"webkit");if(typeof t=="object"&&t!==null){let r=Reflect.get(t,"messageHandlers");if(typeof r=="object"&&r!==null){let s=Reflect.get(r,e);if(Ie(s))return s}}let n=Reflect.get(window,e);return Ie(n)?n:null},Pe=(e,t={})=>{let{pollIntervalMs:n=50,timeoutMs:r=1500}=t;return new Promise(s=>{let o=Date.now(),a=()=>{let p=J(e);if(p){s(p);return}if(Date.now()-o>=r){s(null);return}setTimeout(a,n);};a();})};var ke=async(e,t,n,r)=>{let s=e.platform==="Android"?await Pe(j,{pollIntervalMs:Re,timeoutMs:_e}):J(j);if(!s)return null;let o=G(n);return new Promise(a=>{let p=false,i=c=>{p||(p=true,f(),h(),clearTimeout(A),a(c));},f=m.on(o,c=>{let l=r(c);l&&i(l);}),h=m.on(n,c=>{let l=r(c);l&&i(l);}),A=setTimeout(()=>i(null),ye);try{s.postMessage({command:t,parameters:JSON.stringify({timestamp:Date.now(),endpoint:o})});}catch{i(null);}})},be=e=>ke(e,le,T,y),ve=e=>ke(e,de,O,_);Se();var $=null,b=null,dt=e=>{switch(e.type){case "native_app":return e.meetsMinVersion?be(e):Promise.resolve(null);case "iframe":return xe();case "web":return Promise.resolve(null)}},mt=e=>{switch(e.type){case "native_app":return e.meetsMinVersion?ve(e):Promise.resolve(null);case "iframe":return we();case "web":return Promise.resolve(null)}},Oe=e=>{$=e;},Ue=()=>b||(b=dt(V()).then(e=>(e&&Oe(e),e)).finally(()=>{b=null;}),b);g()&&m.on(T,e=>{let t=y(e);t&&Oe(t);});var S=async()=>g()?$?$.token:(await Ue())?.token??"":"",Ne=async()=>g()?(await Ue())?.token??"":"",U=async()=>g()?mt(V()):null;var Et=()=>{let[e,t]=useState(""),[n,r]=useState(true),s=useCallback(()=>{r(true),S().then(o=>{t(o),r(false);});},[]);return useEffect(()=>{let o=true;return S().then(a=>{o&&(t(a),r(false));}),()=>{o=false;}},[]),{token:e,loading:n,refetch:s}};var At=()=>{let[e,t]=useState(null),[n,r]=useState(true),s=useCallback(()=>{r(true),U().then(o=>{t(o),r(false);});},[]);return useEffect(()=>{let o=true;return U().then(a=>{o&&(t(a),r(false));}),()=>{o=false;}},[]),{user:e,loading:n,refetch:s}};var Le={version:"0.0.2"};var C="/api/feed-app/runtime/ai",Q=`${C}/chat/completions`,K=`${C}/messages`,De=`${C}/images/generations`,Fe=`${C}/audio/speech`,Be=`${C}/video/generations`,qe="Authorization",je="x-bty-extend",Ve=Le.version;var _t=/\r\n|\r|\n/,Tt=(()=>{let e=new TextDecoder;return (t,n)=>e.decode(t,{stream:n})})();async function*Je(e){let t=e.getReader(),n="",r="",s=[],o=()=>{if(s.length===0&&!r)return null;let a={event:r||"message",data:s.join(`
2
- `)};return r="",s=[],a};try{for(;;){let{done:a,value:p}=await t.read();if(a){let i=o();i&&(yield i);return}for(n+=Tt(p,!0);;){let i=_t.exec(n);if(!i)break;let f=n.slice(0,i.index);if(n=n.slice(i.index+i[0].length),f===""){let l=o();l&&(yield l);continue}if(f.startsWith(":"))continue;let h=f.indexOf(":"),A=h===-1?f:f.slice(0,h),c=h===-1?"":f.slice(h+1);c.startsWith(" ")&&(c=c.slice(1)),A==="event"?r=c:A==="data"&&s.push(c);}}}finally{t.releaseLock();}}async function*$e(e){for await(let t of Je(e)){if(t.data==="[DONE]")return;t.data&&(yield JSON.parse(t.data));}}async function*Qe(e){for await(let t of Je(e))t.data&&(yield JSON.parse(t.data));}var St="https://reactus-api.betteryeah.com",Ct=()=>{try{if(typeof __BTY_RUNTIME_API_BASE_URL__=="string"&&__BTY_RUNTIME_API_BASE_URL__.length>0)return __BTY_RUNTIME_API_BASE_URL__}catch{}},xt={apiBaseUrl:(Ct()??St).replace(/\/+$/,""),projectId:""};var N=()=>xt;var E=class extends Error{status;code;body;constructor(t,n,r,s=null){super(t),this.name="AiError",this.code=n,this.status=r,this.body=s;}},x=class extends E{constructor(t="Auth required",n=null){super(t,"auth_required",401,n),this.name="AuthRequiredError";}},X=class extends E{constructor(t="Rate limit exceeded",n=null){super(t,"rate_limit",429,n),this.name="RateLimitError";}},Y=class extends E{constructor(t="Quota exceeded",n=null){super(t,"quota_exceeded",402,n),this.name="QuotaExceededError";}},W=class extends E{constructor(t,n=400,r=null){super(t,"bad_input",n,r),this.name="BadInputError";}},z=class extends E{constructor(t,n=500,r=null){super(t,"server",n,r),this.name="ServerError";}},v=class extends E{constructor(t="Network error",n){super(t,"network",-1,n),this.name="NetworkError";}},w=class extends E{constructor(t="Request aborted"){super(t,"aborted",-1,null),this.name="AbortedError";}},Ke=e=>typeof e=="object"&&e!==null,wt=(e,t)=>{if(typeof e=="string")return e||t;if(!Ke(e))return t;let n=e.message;if(typeof n=="string"&&n.length>0)return n;let r=e.error;if(typeof r=="string"&&r.length>0)return r;if(Ke(r)&&typeof r.message=="string"&&r.message.length>0)return r.message;let s=e.detail;return typeof s=="string"&&s.length>0?s:t},Xe=(e,t)=>{let n=wt(t,`HTTP ${e}`);return e===401||e===403?new x(n,t):e===402?new Y(n,t):e===429?new X(n,t):e>=400&&e<500?new W(n,e,t):e>=500?new z(n,e,t):new E(n,"unknown",e,t)};var It=e=>JSON.stringify({"sdk-version":Ve,...e}),Ye=async(e={})=>{let n=await S(),r=new Headers;if(n&&r.set(qe,`Bearer ${n}`),r.set(je,It(e.extend)),e.contentType&&r.set("Content-Type",e.contentType),e.accept&&r.set("Accept",e.accept),e.extra)for(let[s,o]of Object.entries(e.extra))r.set(s,o);return r};var Pt="feed-app-runtime-sdk:auth-required",Z=e=>{g()&&window.dispatchEvent(new CustomEvent(Pt,{detail:e}));};var kt=e=>e instanceof DOMException&&e.name==="AbortError",bt=async e=>{let t=e.headers.get("content-type")??"";try{return t.includes("application/json")?await e.json():await e.text()}catch{return null}},We=async(e,t)=>{let{apiBaseUrl:n}=N(),r=`${n}${e}`,s=await Ye(t),o;try{o=await fetch(r,{method:t.method??"POST",headers:s,body:t.body,signal:t.signal});}catch(p){throw kt(p)?new w:new v("Failed to reach AI backend",p)}if(o.ok)return o;let a=await bt(o);throw Xe(o.status,a)},ee=async(e,t={})=>{try{return await We(e,t)}catch(n){if(n instanceof x&&!t.skipAuthRetry&&!t.signal?.aborted){if(!await Ne())throw Z({reason:"refresh_failed",error:n}),n;try{return await We(e,{...t,skipAuthRetry:!0})}catch(s){throw s instanceof x&&Z({reason:"retry_rejected",error:s}),s}}throw n}},I=async(e,t,n={})=>await(await ee(e,{...n,method:"POST",contentType:"application/json",body:JSON.stringify(t)})).json();var M=async(e,t,n={})=>{let r=await ee(e,{...n,method:"POST",contentType:"application/json",accept:"text/event-stream",body:JSON.stringify(t)});if(!r.body)throw new v("Streaming response has no body");return r.body},ze=async(e,t,n={})=>await(await ee(e,{...n,method:"POST",contentType:"application/json",body:JSON.stringify(t)})).blob();var vt=e=>{let{signal:t,headers:n,...r}=e;return {transport:{signal:t,extra:n},payload:r}},Ot=(async e=>{let{transport:t,payload:n}=vt(e);if(e.stream){let r=await M(K,n,t);return Qe(r)}return await I(K,n,t)}),Ze={messages:{create:Ot}};var H=e=>{let{signal:t,headers:n,...r}=e;return {transport:{signal:t,extra:n},payload:r}},Ut=(async e=>{let{transport:t,payload:n}=H(e);if(e.stream){let r=await M(Q,n,t);return $e(r)}return await I(Q,n,t)}),Nt={create:Ut},Mt={async generate(e){let{transport:t,payload:n}=H(e);return I(De,n,t)}},Ht={speech:{async create(e){let{transport:t,payload:n}=H(e);return ze(Fe,n,t)}}},Lt={generations:{async create(e){let{transport:t,payload:n}=H(e);return I(Be,n,t)}}},et={chat:{completions:Nt},images:Mt,audio:Ht,video:Lt};var Ft=e=>{let{model:t,protocol:n="openai",maxTokens:r=1024,onToken:s}=e,[o,a]=useState([]),[p,i]=useState(""),[f,h]=useState(false),[A,c]=useState(null),l=useRef(null),ne=useRef(s);ne.current=s,useEffect(()=>()=>l.current?.abort(),[]);let nt=useCallback(()=>l.current?.abort(),[]),rt=useCallback(()=>{l.current?.abort(),a([]),i(""),c(null),h(false);},[]),st=useCallback(async re=>{if(!re)return;c(null),i(""),h(true);let D={role:"user",content:re},ot={role:"assistant",content:""};a(u=>[...u,D,ot]);let F=new AbortController;l.current?.abort(),l.current=F;let B="",se=u=>{u&&(B+=u,i(B),a(P=>{let d=P.slice();return d[d.length-1]={role:"assistant",content:B},d}),ne.current?.(u));};try{if(n==="openai"){let u=await et.chat.completions.create({model:t,messages:[...o,D],stream:!0,signal:F.signal});for await(let P of u){let d=P.choices?.[0]?.delta?.content;typeof d=="string"&&se(d);}}else {let u=[...o,D].map(d=>({role:d.role==="assistant"?"assistant":"user",content:typeof d.content=="string"?d.content:""})),P=await Ze.messages.create({model:t,messages:u,max_tokens:r,stream:!0,signal:F.signal});for await(let d of P)d.type==="content_block_delta"&&d.delta.type==="text_delta"&&se(d.delta.text);}}catch(u){u instanceof w||u instanceof E||u instanceof Error?c(u):c(new Error(String(u)));}finally{h(false),i("");}},[r,o,t,n]);return {messages:o,pending:p,loading:f,error:A,send:st,stop:nt,reset:rt}};
3
- export{Ft as useAiChat,Et as useAuthToken,At as useUserInfo};
1
+ import {useState,useCallback,useEffect,useRef}from'react';var g=()=>typeof window<"u"&&typeof document<"u";var it="hostRuntime",q=class{listeners=new Map;on(t,n){let r=this.listeners.get(t),s=r??new Set;return r||this.listeners.set(t,s),s.add(n),()=>{s.delete(n),s.size===0&&this.listeners.delete(t);}}emit(t,n){let r=this.listeners.get(t);if(r)for(let s of r)s(n);}},m=new q,oe=0,G=e=>(oe+=1,`${e}.${oe}`),ie=false,ae=()=>{if(!g()||ie)return;ie=true,Reflect.set(window,it,{receiveMessage(t){if(!t)return;let n=t.endpoint;n&&m.emit(n,t.data??t);}});};var P=e=>typeof e=="object"&&e!==null,A=(e,t)=>{if(e)for(let n of t){let r=e[n];if(typeof r=="string"&&r.length>0)return r}},at=(e,t)=>{if(e)for(let n of t){let r=e[n];if(typeof r=="string"&&r.length>0||typeof r=="number"&&Number.isFinite(r))return r}},y=e=>{if(!P(e))return null;let t=P(e.credentials)?e.credentials:void 0,n=P(e.user)?e.user:void 0,r=A(e,["uid","userId","id"])??A(t,["uid","userId","id"])??A(n,["uid","userId","id"]),s=A(e,["token","authToken"])??A(t,["token","authToken"]);return !r||!s?null:{uid:r,token:s}},_=e=>{if(!P(e))return null;let t=P(e.data)?e.data:e,n=at(t,["userId","id","uid"]);if(n===void 0)return null;let r=A(t,["username","nickname","nickName","name"]),s=A(t,["nickname","nickName","username"]);return {...t,userId:n,...r?{username:r}:{},...s?{nickname:s}:{}}};var ce="HostApp",j="hostListener";var ue="processUserCredentials",pe="processUserInfo",le="user.getCredentials",de="user.getUserInfo",T="user.credentials",O="user.info",me="user-credentials-request",fe="user-credentials-response",ge="user-info-request",Ee="user-info-response",he={iOS:[1,6,7],Android:[1,1,8]},ye=3e3,Ae=500,Re=50,_e=1500;var ct=e=>typeof e!="object"||e===null?false:typeof Reflect.get(e,"type")=="string",Te=false,Se=()=>{!g()||Te||(Te=true,ae(),Reflect.set(window,ue,e=>{y(e)&&m.emit(T,e);}),Reflect.set(window,pe,e=>{_(e)&&m.emit(O,e);}),window.addEventListener("message",e=>{let t=e.data;if(ct(t))switch(t.type){case fe:m.emit("iframe.credentials",t);break;case Ee:m.emit("iframe.userinfo",t);break}}));};var ut=new RegExp(`${ce}\\/(\\d+\\.\\d+\\.\\d+)\\/(\\d+)\\/(iOS|Android)`),pt=e=>{let t=e.split(".").map(n=>Number.parseInt(n,10));return [t[0]??0,t[1]??0,t[2]??0]},lt=(e,t)=>{for(let n=0;n<3;n++){if(e[n]>t[n])return true;if(e[n]<t[n])return false}return true},dt=e=>{let t=e.match(ut);if(!t)return null;let[,n,r,s]=t;if(!n||!r||s!=="iOS"&&s!=="Android")return null;let o=lt(pt(n),he[s]);return {type:"native_app",platform:s,appVersion:n,buildNumber:r,meetsMinVersion:o}},V=()=>{if(!g())return {type:"web",meetsMinVersion:false};let e=dt(navigator.userAgent??"");return e||(window.parent!==window?{type:"iframe",meetsMinVersion:false}:{type:"web",meetsMinVersion:false})};var Ce=(e,t,n)=>new Promise(r=>{let s=false,o=i=>{s||(s=true,a(),clearTimeout(p),r(i));},a=m.on(t,i=>{let f=n(i);f&&o(f);}),p=setTimeout(()=>o(null),Ae);try{window.parent.postMessage({type:e,timestamp:Date.now()},"*");}catch{o(null);}}),xe=()=>Ce(me,"iframe.credentials",y),we=()=>Ce(ge,"iframe.userinfo",_);var Ie=e=>typeof e!="object"||e===null?false:typeof Reflect.get(e,"postMessage")=="function",J=e=>{let t=Reflect.get(window,"webkit");if(typeof t=="object"&&t!==null){let r=Reflect.get(t,"messageHandlers");if(typeof r=="object"&&r!==null){let s=Reflect.get(r,e);if(Ie(s))return s}}let n=Reflect.get(window,e);return Ie(n)?n:null},ke=(e,t={})=>{let{pollIntervalMs:n=50,timeoutMs:r=1500}=t;return new Promise(s=>{let o=Date.now(),a=()=>{let p=J(e);if(p){s(p);return}if(Date.now()-o>=r){s(null);return}setTimeout(a,n);};a();})};var Pe=async(e,t,n,r)=>{let s=e.platform==="Android"?await ke(j,{pollIntervalMs:Re,timeoutMs:_e}):J(j);if(!s)return null;let o=G(n);return new Promise(a=>{let p=false,i=c=>{p||(p=true,f(),h(),clearTimeout(R),a(c));},f=m.on(o,c=>{let l=r(c);l&&i(l);}),h=m.on(n,c=>{let l=r(c);l&&i(l);}),R=setTimeout(()=>i(null),ye);try{s.postMessage({command:t,parameters:JSON.stringify({timestamp:Date.now(),endpoint:o})});}catch{i(null);}})},be=e=>Pe(e,le,T,y),ve=e=>Pe(e,de,O,_);Se();var $=null,b=null,mt=e=>{switch(e.type){case "native_app":return e.meetsMinVersion?be(e):Promise.resolve(null);case "iframe":return xe();case "web":return Promise.resolve(null)}},ft=e=>{switch(e.type){case "native_app":return e.meetsMinVersion?ve(e):Promise.resolve(null);case "iframe":return we();case "web":return Promise.resolve(null)}},Oe=e=>{$=e;},Ne=()=>b||(b=mt(V()).then(e=>(e&&Oe(e),e)).finally(()=>{b=null;}),b);g()&&m.on(T,e=>{let t=y(e);t&&Oe(t);});var S=async()=>g()?$?$.token:(await Ne())?.token??"":"",Ue=async()=>g()?(await Ne())?.token??"":"",N=async()=>g()?ft(V()):null;var ht=()=>{let[e,t]=useState(""),[n,r]=useState(true),s=useCallback(()=>{r(true),S().then(o=>{t(o),r(false);});},[]);return useEffect(()=>{let o=true;return S().then(a=>{o&&(t(a),r(false));}),()=>{o=false;}},[]),{token:e,loading:n,refetch:s}};var Rt=()=>{let[e,t]=useState(null),[n,r]=useState(true),s=useCallback(()=>{r(true),N().then(o=>{t(o),r(false);});},[]);return useEffect(()=>{let o=true;return N().then(a=>{o&&(t(a),r(false));}),()=>{o=false;}},[]),{user:e,loading:n,refetch:s}};var Le={version:"0.0.3"};var C="/v1/feed-app/runtime/ai",Q=`${C}/chat/completions`,K=`${C}/messages`,De=`${C}/images/generations`,Fe=`${C}/audio/speech`,Be=`${C}/video/generations`,qe="Authorization",je="x-bty-extend",Ve=Le.version;var Tt=/\r\n|\r|\n/,St=(()=>{let e=new TextDecoder;return (t,n)=>e.decode(t,{stream:n})})();async function*Je(e){let t=e.getReader(),n="",r="",s=[],o=()=>{if(s.length===0&&!r)return null;let a={event:r||"message",data:s.join(`
2
+ `)};return r="",s=[],a};try{for(;;){let{done:a,value:p}=await t.read();if(a){let i=o();i&&(yield i);return}for(n+=St(p,!0);;){let i=Tt.exec(n);if(!i)break;let f=n.slice(0,i.index);if(n=n.slice(i.index+i[0].length),f===""){let l=o();l&&(yield l);continue}if(f.startsWith(":"))continue;let h=f.indexOf(":"),R=h===-1?f:f.slice(0,h),c=h===-1?"":f.slice(h+1);c.startsWith(" ")&&(c=c.slice(1)),R==="event"?r=c:R==="data"&&s.push(c);}}}finally{t.releaseLock();}}async function*$e(e){for await(let t of Je(e)){if(t.data==="[DONE]")return;t.data&&(yield JSON.parse(t.data));}}async function*Qe(e){for await(let t of Je(e))t.data&&(yield JSON.parse(t.data));}var Ct="https://reactus-api.betteryeah.com",xt=()=>{try{if(typeof __BTY_RUNTIME_API_BASE_URL__=="string"&&__BTY_RUNTIME_API_BASE_URL__.length>0)return __BTY_RUNTIME_API_BASE_URL__}catch{}},wt={apiBaseUrl:(xt()??Ct).replace(/\/+$/,""),projectId:""};var U=()=>wt;var E=class extends Error{status;code;body;constructor(t,n,r,s=null){super(t),this.name="AiError",this.code=n,this.status=r,this.body=s;}},x=class extends E{constructor(t="Auth required",n=null){super(t,"auth_required",401,n),this.name="AuthRequiredError";}},X=class extends E{constructor(t="Rate limit exceeded",n=null){super(t,"rate_limit",429,n),this.name="RateLimitError";}},Y=class extends E{constructor(t="Quota exceeded",n=null){super(t,"quota_exceeded",402,n),this.name="QuotaExceededError";}},W=class extends E{constructor(t,n=400,r=null){super(t,"bad_input",n,r),this.name="BadInputError";}},z=class extends E{constructor(t,n=500,r=null){super(t,"server",n,r),this.name="ServerError";}},v=class extends E{constructor(t="Network error",n){super(t,"network",-1,n),this.name="NetworkError";}},w=class extends E{constructor(t="Request aborted"){super(t,"aborted",-1,null),this.name="AbortedError";}},Ke=e=>typeof e=="object"&&e!==null,It=(e,t)=>{if(typeof e=="string")return e||t;if(!Ke(e))return t;let n=e.message;if(typeof n=="string"&&n.length>0)return n;let r=e.error;if(typeof r=="string"&&r.length>0)return r;if(Ke(r)&&typeof r.message=="string"&&r.message.length>0)return r.message;let s=e.detail;return typeof s=="string"&&s.length>0?s:t},Xe=(e,t)=>{let n=It(t,`HTTP ${e}`);return e===401||e===403?new x(n,t):e===402?new Y(n,t):e===429?new X(n,t):e>=400&&e<500?new W(n,e,t):e>=500?new z(n,e,t):new E(n,"unknown",e,t)};var kt=e=>JSON.stringify({"sdk-version":Ve,...e}),Ye=async(e={})=>{let n=await S(),r=new Headers;if(n&&r.set(qe,`Bearer ${n}`),r.set(je,kt(e.extend)),e.contentType&&r.set("Content-Type",e.contentType),e.accept&&r.set("Accept",e.accept),e.extra)for(let[s,o]of Object.entries(e.extra))r.set(s,o);return r};var Pt="feed-app-runtime-sdk:auth-required",Z=e=>{g()&&window.dispatchEvent(new CustomEvent(Pt,{detail:e}));};var bt=e=>e instanceof DOMException&&e.name==="AbortError",vt=async e=>{let t=e.headers.get("content-type")??"";try{return t.includes("application/json")?await e.json():await e.text()}catch{return null}},We=async(e,t)=>{let{apiBaseUrl:n}=U(),r=`${n}${e}`,s=await Ye(t),o;try{o=await fetch(r,{method:t.method??"POST",headers:s,body:t.body,signal:t.signal});}catch(p){throw bt(p)?new w:new v("Failed to reach AI backend",p)}if(o.ok)return o;let a=await vt(o);throw Xe(o.status,a)},ee=async(e,t={})=>{try{return await We(e,t)}catch(n){if(n instanceof x&&!t.skipAuthRetry&&!t.signal?.aborted){if(!await Ue())throw Z({reason:"refresh_failed",error:n}),n;try{return await We(e,{...t,skipAuthRetry:!0})}catch(s){throw s instanceof x&&Z({reason:"retry_rejected",error:s}),s}}throw n}},I=async(e,t,n={})=>await(await ee(e,{...n,method:"POST",contentType:"application/json",body:JSON.stringify(t)})).json();var M=async(e,t,n={})=>{let r=await ee(e,{...n,method:"POST",contentType:"application/json",accept:"text/event-stream",body:JSON.stringify(t)});if(!r.body)throw new v("Streaming response has no body");return r.body},ze=async(e,t,n={})=>await(await ee(e,{...n,method:"POST",contentType:"application/json",body:JSON.stringify(t)})).blob();var Ot=e=>{let{signal:t,headers:n,...r}=e;return {transport:{signal:t,extra:n},payload:r}},Nt=(async e=>{let{transport:t,payload:n}=Ot(e);if(e.stream){let r=await M(K,n,t);return Qe(r)}return await I(K,n,t)}),Ze={messages:{create:Nt}};var H=e=>{let{signal:t,headers:n,...r}=e;return {transport:{signal:t,extra:n},payload:r}},Ut=(async e=>{let{transport:t,payload:n}=H(e);if(e.stream){let r=await M(Q,n,t);return $e(r)}return await I(Q,n,t)}),Mt={create:Ut},Ht={async generate(e){let{transport:t,payload:n}=H(e);return I(De,n,t)}},Lt={speech:{async create(e){let{transport:t,payload:n}=H(e);return ze(Fe,n,t)}}},Dt={generations:{async create(e){let{transport:t,payload:n}=H(e);return I(Be,n,t)}}},et={chat:{completions:Mt},images:Ht,audio:Lt,video:Dt};var Bt=e=>{let{model:t,protocol:n="openai",maxTokens:r=1024,onToken:s}=e,[o,a]=useState([]),[p,i]=useState(""),[f,h]=useState(false),[R,c]=useState(null),l=useRef(null),ne=useRef(s);ne.current=s,useEffect(()=>()=>l.current?.abort(),[]);let nt=useCallback(()=>l.current?.abort(),[]),rt=useCallback(()=>{l.current?.abort(),a([]),i(""),c(null),h(false);},[]),st=useCallback(async re=>{if(!re)return;c(null),i(""),h(true);let D={role:"user",content:re},ot={role:"assistant",content:""};a(u=>[...u,D,ot]);let F=new AbortController;l.current?.abort(),l.current=F;let B="",se=u=>{u&&(B+=u,i(B),a(k=>{let d=k.slice();return d[d.length-1]={role:"assistant",content:B},d}),ne.current?.(u));};try{if(n==="openai"){let u=await et.chat.completions.create({model:t,messages:[...o,D],stream:!0,signal:F.signal});for await(let k of u){let d=k.choices?.[0]?.delta?.content;typeof d=="string"&&se(d);}}else {let u=[...o,D].map(d=>({role:d.role==="assistant"?"assistant":"user",content:typeof d.content=="string"?d.content:""})),k=await Ze.messages.create({model:t,messages:u,max_tokens:r,stream:!0,signal:F.signal});for await(let d of k)d.type==="content_block_delta"&&d.delta.type==="text_delta"&&se(d.delta.text);}}catch(u){u instanceof w||u instanceof E||u instanceof Error?c(u):c(new Error(String(u)));}finally{h(false),i("");}},[r,o,t,n]);return {messages:o,pending:p,loading:f,error:R,send:st,stop:nt,reset:rt}};
3
+ export{Bt as useAiChat,ht as useAuthToken,Rt as useUserInfo};
@@ -3,9 +3,12 @@ interface Credentials {
3
3
  token: string;
4
4
  }
5
5
  interface UserInfo {
6
- uid: string;
7
- nickName?: string;
8
- avatar?: string;
6
+ userId: string | number;
7
+ username?: string;
8
+ nickname?: string;
9
+ avatar?: string | null;
10
+ phone?: string | null;
11
+ email?: string;
9
12
  [key: string]: unknown;
10
13
  }
11
14
 
@@ -1,5 +1,5 @@
1
- import { U as UserInfo } from '../types-CLPiEZOp.js';
2
- export { C as Credentials } from '../types-CLPiEZOp.js';
1
+ import { U as UserInfo } from '../types-CLujY9ck.js';
2
+ export { C as Credentials } from '../types-CLujY9ck.js';
3
3
 
4
4
  declare const getAuthTokenAsync: () => Promise<string>;
5
5
  declare const getUserInfoAsync: () => Promise<UserInfo | null>;
@@ -1 +1 @@
1
- var u=()=>typeof window<"u"&&typeof document<"u";var re="hostRuntime",g=class{listeners=new Map;on(t,n){let r=this.listeners.get(t),s=r??new Set;return r||this.listeners.set(t,s),s.add(n),()=>{s.delete(n),s.size===0&&this.listeners.delete(t);}}emit(t,n){let r=this.listeners.get(t);if(r)for(let s of r)s(n);}},o=new g,U=0,N=e=>(U+=1,`${e}.${U}`),v=false,y=()=>{if(!u()||v)return;v=true,Reflect.set(window,re,{receiveMessage(t){if(!t)return;let n=t.endpoint;n&&o.emit(n,t.data??t);}});};var _=e=>typeof e=="object"&&e!==null,f=(e,t)=>{if(e)for(let n of t){let r=e[n];if(typeof r=="string"&&r.length>0)return r}},a=e=>{if(!_(e))return null;let t=_(e.credentials)?e.credentials:void 0,n=_(e.user)?e.user:void 0,r=f(e,["uid","userId","id"])??f(t,["uid","userId","id"])??f(n,["uid","userId","id"]),s=f(e,["token","authToken"])??f(t,["token","authToken"]);return !r||!s?null:{uid:r,token:s}},m=e=>{if(!_(e))return null;let t=_(e.data)?e.data:e,n=f(t,["uid","userId","id"]);return n?{...t,uid:n}:null};var O="HostApp",A="hostListener";var P="processUserCredentials",k="processUserInfo",x="user.getCredentials",L="user.getUserInfo",d="user.credentials",R="user.info",h="user-credentials-request",F="user-credentials-response",b="user-info-request",H="user-info-response",D={iOS:[1,6,7],Android:[1,1,8]},q=3e3,B=500,V=50,j=1500;var se=e=>typeof e!="object"||e===null?false:typeof Reflect.get(e,"type")=="string",G=false,Q=()=>{!u()||G||(G=true,y(),Reflect.set(window,P,e=>{a(e)&&o.emit(d,e);}),Reflect.set(window,k,e=>{m(e)&&o.emit(R,e);}),window.addEventListener("message",e=>{let t=e.data;if(se(t))switch(t.type){case F:o.emit("iframe.credentials",t);break;case H:o.emit("iframe.userinfo",t);break}}));};var oe=new RegExp(`${O}\\/(\\d+\\.\\d+\\.\\d+)\\/(\\d+)\\/(iOS|Android)`),ie=e=>{let t=e.split(".").map(n=>Number.parseInt(n,10));return [t[0]??0,t[1]??0,t[2]??0]},ue=(e,t)=>{for(let n=0;n<3;n++){if(e[n]>t[n])return true;if(e[n]<t[n])return false}return true},le=e=>{let t=e.match(oe);if(!t)return null;let[,n,r,s]=t;if(!n||!r||s!=="iOS"&&s!=="Android")return null;let i=ue(ie(n),D[s]);return {type:"native_app",platform:s,appVersion:n,buildNumber:r,meetsMinVersion:i}},w=()=>{if(!u())return {type:"web",meetsMinVersion:false};let e=le(navigator.userAgent??"");return e||(window.parent!==window?{type:"iframe",meetsMinVersion:false}:{type:"web",meetsMinVersion:false})};var $=(e,t,n)=>new Promise(r=>{let s=false,i=l=>{s||(s=true,p(),clearTimeout(c),r(l));},p=o.on(t,l=>{let T=n(l);T&&i(T);}),c=setTimeout(()=>i(null),B);try{window.parent.postMessage({type:e,timestamp:Date.now()},"*");}catch{i(null);}}),K=()=>$(h,"iframe.credentials",a),z=()=>$(b,"iframe.userinfo",m);var J=e=>typeof e!="object"||e===null?false:typeof Reflect.get(e,"postMessage")=="function",M=e=>{let t=Reflect.get(window,"webkit");if(typeof t=="object"&&t!==null){let r=Reflect.get(t,"messageHandlers");if(typeof r=="object"&&r!==null){let s=Reflect.get(r,e);if(J(s))return s}}let n=Reflect.get(window,e);return J(n)?n:null},X=(e,t={})=>{let{pollIntervalMs:n=50,timeoutMs:r=1500}=t;return new Promise(s=>{let i=Date.now(),p=()=>{let c=M(e);if(c){s(c);return}if(Date.now()-i>=r){s(null);return}setTimeout(p,n);};p();})};var W=async(e,t,n,r)=>{let s=e.platform==="Android"?await X(A,{pollIntervalMs:V,timeoutMs:j}):M(A);if(!s)return null;let i=N(n);return new Promise(p=>{let c=false,l=E=>{c||(c=true,T(),te(),clearTimeout(ne),p(E));},T=o.on(i,E=>{let I=r(E);I&&l(I);}),te=o.on(n,E=>{let I=r(E);I&&l(I);}),ne=setTimeout(()=>l(null),q);try{s.postMessage({command:t,parameters:JSON.stringify({timestamp:Date.now(),endpoint:i})});}catch{l(null);}})},Y=e=>W(e,x,d,a),Z=e=>W(e,L,R,m);Q();var C=null,S=null,ae=e=>{switch(e.type){case "native_app":return e.meetsMinVersion?Y(e):Promise.resolve(null);case "iframe":return K();case "web":return Promise.resolve(null)}},ce=e=>{switch(e.type){case "native_app":return e.meetsMinVersion?Z(e):Promise.resolve(null);case "iframe":return z();case "web":return Promise.resolve(null)}},ee=e=>{C=e;},pe=()=>S||(S=ae(w()).then(e=>(e&&ee(e),e)).finally(()=>{S=null;}),S);u()&&o.on(d,e=>{let t=a(e);t&&ee(t);});var fe=async()=>u()?C?C.token:(await pe())?.token??"":"";var me=async()=>u()?ce(w()):null;export{fe as getAuthTokenAsync,me as getUserInfoAsync};
1
+ var u=()=>typeof window<"u"&&typeof document<"u";var re="hostRuntime",g=class{listeners=new Map;on(n,t){let r=this.listeners.get(n),s=r??new Set;return r||this.listeners.set(n,s),s.add(t),()=>{s.delete(t),s.size===0&&this.listeners.delete(n);}}emit(n,t){let r=this.listeners.get(n);if(r)for(let s of r)s(t);}},o=new g,y=0,N=e=>(y+=1,`${e}.${y}`),k=false,v=()=>{if(!u()||k)return;k=true,Reflect.set(window,re,{receiveMessage(n){if(!n)return;let t=n.endpoint;t&&o.emit(t,n.data??n);}});};var _=e=>typeof e=="object"&&e!==null,f=(e,n)=>{if(e)for(let t of n){let r=e[t];if(typeof r=="string"&&r.length>0)return r}},se=(e,n)=>{if(e)for(let t of n){let r=e[t];if(typeof r=="string"&&r.length>0||typeof r=="number"&&Number.isFinite(r))return r}},a=e=>{if(!_(e))return null;let n=_(e.credentials)?e.credentials:void 0,t=_(e.user)?e.user:void 0,r=f(e,["uid","userId","id"])??f(n,["uid","userId","id"])??f(t,["uid","userId","id"]),s=f(e,["token","authToken"])??f(n,["token","authToken"]);return !r||!s?null:{uid:r,token:s}},m=e=>{if(!_(e))return null;let n=_(e.data)?e.data:e,t=se(n,["userId","id","uid"]);if(t===void 0)return null;let r=f(n,["username","nickname","nickName","name"]),s=f(n,["nickname","nickName","username"]);return {...n,userId:t,...r?{username:r}:{},...s?{nickname:s}:{}}};var O="HostApp",A="hostListener";var U="processUserCredentials",P="processUserInfo",x="user.getCredentials",L="user.getUserInfo",d="user.credentials",R="user.info",h="user-credentials-request",b="user-credentials-response",F="user-info-request",H="user-info-response",D={iOS:[1,6,7],Android:[1,1,8]},q=3e3,B=500,V=50,j=1500;var oe=e=>typeof e!="object"||e===null?false:typeof Reflect.get(e,"type")=="string",G=false,Q=()=>{!u()||G||(G=true,v(),Reflect.set(window,U,e=>{a(e)&&o.emit(d,e);}),Reflect.set(window,P,e=>{m(e)&&o.emit(R,e);}),window.addEventListener("message",e=>{let n=e.data;if(oe(n))switch(n.type){case b:o.emit("iframe.credentials",n);break;case H:o.emit("iframe.userinfo",n);break}}));};var ie=new RegExp(`${O}\\/(\\d+\\.\\d+\\.\\d+)\\/(\\d+)\\/(iOS|Android)`),ue=e=>{let n=e.split(".").map(t=>Number.parseInt(t,10));return [n[0]??0,n[1]??0,n[2]??0]},le=(e,n)=>{for(let t=0;t<3;t++){if(e[t]>n[t])return true;if(e[t]<n[t])return false}return true},ae=e=>{let n=e.match(ie);if(!n)return null;let[,t,r,s]=n;if(!t||!r||s!=="iOS"&&s!=="Android")return null;let i=le(ue(t),D[s]);return {type:"native_app",platform:s,appVersion:t,buildNumber:r,meetsMinVersion:i}},w=()=>{if(!u())return {type:"web",meetsMinVersion:false};let e=ae(navigator.userAgent??"");return e||(window.parent!==window?{type:"iframe",meetsMinVersion:false}:{type:"web",meetsMinVersion:false})};var $=(e,n,t)=>new Promise(r=>{let s=false,i=l=>{s||(s=true,p(),clearTimeout(c),r(l));},p=o.on(n,l=>{let T=t(l);T&&i(T);}),c=setTimeout(()=>i(null),B);try{window.parent.postMessage({type:e,timestamp:Date.now()},"*");}catch{i(null);}}),K=()=>$(h,"iframe.credentials",a),z=()=>$(F,"iframe.userinfo",m);var J=e=>typeof e!="object"||e===null?false:typeof Reflect.get(e,"postMessage")=="function",M=e=>{let n=Reflect.get(window,"webkit");if(typeof n=="object"&&n!==null){let r=Reflect.get(n,"messageHandlers");if(typeof r=="object"&&r!==null){let s=Reflect.get(r,e);if(J(s))return s}}let t=Reflect.get(window,e);return J(t)?t:null},X=(e,n={})=>{let{pollIntervalMs:t=50,timeoutMs:r=1500}=n;return new Promise(s=>{let i=Date.now(),p=()=>{let c=M(e);if(c){s(c);return}if(Date.now()-i>=r){s(null);return}setTimeout(p,t);};p();})};var W=async(e,n,t,r)=>{let s=e.platform==="Android"?await X(A,{pollIntervalMs:V,timeoutMs:j}):M(A);if(!s)return null;let i=N(t);return new Promise(p=>{let c=false,l=E=>{c||(c=true,T(),ne(),clearTimeout(te),p(E));},T=o.on(i,E=>{let I=r(E);I&&l(I);}),ne=o.on(t,E=>{let I=r(E);I&&l(I);}),te=setTimeout(()=>l(null),q);try{s.postMessage({command:n,parameters:JSON.stringify({timestamp:Date.now(),endpoint:i})});}catch{l(null);}})},Y=e=>W(e,x,d,a),Z=e=>W(e,L,R,m);Q();var C=null,S=null,ce=e=>{switch(e.type){case "native_app":return e.meetsMinVersion?Y(e):Promise.resolve(null);case "iframe":return K();case "web":return Promise.resolve(null)}},fe=e=>{switch(e.type){case "native_app":return e.meetsMinVersion?Z(e):Promise.resolve(null);case "iframe":return z();case "web":return Promise.resolve(null)}},ee=e=>{C=e;},pe=()=>S||(S=ce(w()).then(e=>(e&&ee(e),e)).finally(()=>{S=null;}),S);u()&&o.on(d,e=>{let n=a(e);n&&ee(n);});var me=async()=>u()?C?C.token:(await pe())?.token??"":"";var de=async()=>u()?fe(w()):null;export{me as getAuthTokenAsync,de as getUserInfoAsync};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bty/feed_app-runtime-sdk",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "type": "module",
5
5
  "browser": true,
6
6
  "description": "Runtime SDK for feed-app template: auth / AI capabilities, multi-environment bridge (native App / iframe / web).",