@storvia/sdk 0.10.5 → 0.10.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.js CHANGED
@@ -117,6 +117,6 @@
117
117
  `,pt={success:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>',error:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>',warning:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>',info:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg>'},$e=!0;function Ge(o){$e=o}function gt(){if(typeof document>"u")return null;let o=document.getElementById(de);if(!o){if(!document.getElementById(Me)){let e=document.createElement("style");e.id=Me,e.textContent=ut,document.head.appendChild(e)}o=document.createElement("div"),o.id=de,document.body.appendChild(o)}return o}function ee(o,e="info",t=3500,n){if(!$e)return;let r=gt();if(!r)return;let i=t<=0,s=document.createElement("div");s.className=`storvia-toast ${e}`,s.innerHTML=`
118
118
  <span class="storvia-toast-icon">${pt[e]}</span>
119
119
  <span class="storvia-toast-msg"></span>
120
- `;let d=s.querySelector(".storvia-toast-msg");d&&(d.textContent=o);let c=()=>{s.isConnected&&(s.classList.add("leaving"),s.classList.remove("show"),setTimeout(()=>s.remove(),320))};if(n){let a=document.createElement("button");a.type="button",a.className="storvia-toast-action",a.textContent=n.label,a.addEventListener("click",()=>{try{n.onClick()}catch(l){console.error("[Storvia toast] action error:",l)}c()}),s.appendChild(a)}if(i){let a=document.createElement("button");a.type="button",a.className="storvia-toast-close",a.setAttribute("aria-label",ae("close")),a.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',a.addEventListener("click",c),s.appendChild(a)}r.appendChild(s),requestAnimationFrame(()=>s.classList.add("show")),i||setTimeout(c,t)}function mt(o){let e=o.filter(t=>t).map(t=>`\u300C${t}\u300D`).join("");return ae("violationWords").replace("{words}",e)}var ft=3e3,xe={};function Ue(o){let e=Date.now();if(!(e-(xe[o]??0)<ft)){if(xe[o]=e,!pe){console.warn(`[Storvia] navigate \u2192 wallet(${o})\uFF1A\u5F53\u524D\u672A\u68C0\u6D4B\u5230\u5BBF\u4E3B\uFF08dev \u6A21\u5F0F\uFF09\uFF0C\u751F\u4EA7\u73AF\u5883\u7531\u5BBF\u4E3B\u5F39\u5145\u503C\u5F15\u5BFC / \u8DF3\u94B1\u5305\u9875\u3002`);return}try{pe(T("navigate",{target:"wallet",reason:o}))}catch(t){console.error("[Storvia] navigate \u2192 wallet \u901A\u8FC7 bus \u53D1\u9001\u5931\u8D25:",t)}}}function S(o,e,t){if(o==="GENERATION_ABORTED")return;if(o==="INSUFFICIENT_CREDITS")return Ue("insufficient_credits");if(o==="DAISY_CARD_REQUIRED")return Ue("daisy_card_required");let n=o==="VIOLATION_WORD_DETECTED"&&t?.length?mt(t):De(o)||e||ae("unknownError");ee(n,o==="RATE_LIMITED"?"warning":"error")}function vt(o,e){let t=e?.tickMs??100,n=e?.baseLagMs??1e3,r=e?.maxLagMs??2500,i=e?.minCharsPerTick??2,s="",d=null,c=0,a=0,l=()=>Math.min(r,Math.max(n,c*1.35)),u=()=>{let y=Math.max(i,Math.ceil(s.length*t/l()));if(y>=s.length)y=s.length;else{let R=s.charCodeAt(y-1);R>=55296&&R<=56319&&y++}let I=s.slice(0,y);s=s.slice(y),I&&o(I)},f=()=>{d=null,u(),s&&(d=setTimeout(f,t))};return{push:y=>{let I=Date.now();if(a>0){let R=Math.min(I-a,r);c=c>0?c*.7+R*.3:R}a=I,s+=y,d===null&&f()},flush:()=>{d!==null&&(clearTimeout(d),d=null),s&&(o(s),s="")},cancel:()=>{d!==null&&(clearTimeout(d),d=null),s=""}}}function ge(o){let e=vt(o.onChunk);return{cbs:{onChunk:n=>e.push(n),onDone:(n,r)=>{e.flush(),o.onDone(n,r)},onAborted:o.onAborted?n=>{e.flush(),o.onAborted(n)}:void 0,onState:o.onState?(n,r)=>{e.flush(),o.onState(n,r)}:void 0,onThinking:o.onThinking?n=>{e.flush(),o.onThinking(n)}:void 0,onCreatedCharacters:o.onCreatedCharacters?n=>{e.flush(),o.onCreatedCharacters(n)}:void 0,onReconnect:o.onReconnect},flush:()=>e.flush()}}var Fe="0.10.5";function G(o,e){if(e.aborted){if(o.onAborted){o.onAborted(e.aborted);return}o.onDone(e.aborted.id,{truncated:!1});return}o.onDone(e.messageId,e.truncated===void 0?void 0:{truncated:e.truncated})}var w=class w{constructor(e,t,n=!1,r=""){this.baseUrl=e,this.token=t,this.debug=n,this.devApiKey=r}setToken(e){this.token=e}setDebug(e){this.debug=e}maybeShowNetworkToast(e){e instanceof g||S("NETWORK_ERROR")}wrapAbortError(e){if(e instanceof DOMException&&e.name==="AbortError"){let t=new g("REQUEST_TIMEOUT","Request timed out");return S("REQUEST_TIMEOUT"),t}return e}createTimeoutController(){let e=new AbortController,t=setTimeout(()=>e.abort(),w.REQUEST_TIMEOUT);return{controller:e,clear:()=>clearTimeout(t)}}buildHeaders(){let e={"Content-Type":"application/json"};return this.token&&(e.Authorization=`Bearer ${this.token}`),this.devApiKey&&(e["x-api-key"]=this.devApiKey),e["x-client-info"]=`storvia-sdk/${Fe}`,e}log(e){if(!this.debug)return;let{method:t,path:n,body:r,status:i,rawResponse:s,parsedData:d,error:c,durationMs:a,modelName:l}=e,u="%c[Storvia SDK]",f="color: #6366f1; font-weight: bold",m=a!==void 0?` (${a}ms)`:"",h=i!==void 0?` [${i}]`:"",C=l?` [model: ${l}]`:"";c?(console.groupCollapsed(`${u} %c${t} ${n}${h}${C}${m} %c\u2717`,f,"color: #e0e0e0","color: #ef4444"),r!==void 0&&console.log("Request:",r),s!==void 0&&console.log("Response (raw):",s),console.error("Error:",c),console.groupEnd()):(console.groupCollapsed(`${u} %c${t} ${n}${h}${C}${m} %c\u2713`,f,"color: #e0e0e0","color: #22c55e"),r!==void 0&&console.log("Request:",r),s!==void 0&&console.log("Response (raw):",s),d!==void 0&&d!==s&&console.log("Response (data):",d),console.groupEnd())}async get(e,t){let n=new URL(`${this.baseUrl}${e}`);t&&Object.entries(t).forEach(([a,l])=>n.searchParams.set(a,l));let r=Date.now(),i,s,{controller:d,clear:c}=this.createTimeoutController();try{let a=await fetch(n.toString(),{method:"GET",headers:this.buildHeaders(),signal:d.signal});c(),i=a.status;let{raw:l,data:u}=await this.handleResponseWithRaw(a);return s=l,this.log({method:"GET",path:e,body:t,status:i,rawResponse:s,parsedData:u,durationMs:Date.now()-r}),u}catch(a){c();let l=this.wrapAbortError(a);throw this.log({method:"GET",path:e,body:t,status:i,rawResponse:s,error:l,durationMs:Date.now()-r}),l===a&&this.maybeShowNetworkToast(a),l}}async post(e,t,n){let r=Date.now(),i,s,{controller:d,clear:c}=this.createTimeoutController();try{let a=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:d.signal});c(),i=a.status;let{raw:l,data:u}=await this.handleResponseWithRaw(a);return s=l,this.log({method:"POST",path:e,body:t,status:i,rawResponse:s,parsedData:u,durationMs:Date.now()-r,modelName:n?.modelName}),u}catch(a){c();let l=this.wrapAbortError(a);throw this.log({method:"POST",path:e,body:t,status:i,rawResponse:s,error:l,durationMs:Date.now()-r,modelName:n?.modelName}),l===a&&this.maybeShowNetworkToast(a),l}}async patch(e,t){let n=Date.now(),r,i,{controller:s,clear:d}=this.createTimeoutController();try{let c=await fetch(`${this.baseUrl}${e}`,{method:"PATCH",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:s.signal});d(),r=c.status;let{raw:a,data:l}=await this.handleResponseWithRaw(c);return i=a,this.log({method:"PATCH",path:e,body:t,status:r,rawResponse:i,parsedData:l,durationMs:Date.now()-n}),l}catch(c){d();let a=this.wrapAbortError(c);throw this.log({method:"PATCH",path:e,body:t,status:r,rawResponse:i,error:a,durationMs:Date.now()-n}),a===c&&this.maybeShowNetworkToast(c),a}}async put(e,t){let n=Date.now(),r,i,{controller:s,clear:d}=this.createTimeoutController();try{let c=await fetch(`${this.baseUrl}${e}`,{method:"PUT",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:s.signal});d(),r=c.status;let{raw:a,data:l}=await this.handleResponseWithRaw(c);return i=a,this.log({method:"PUT",path:e,body:t,status:r,rawResponse:i,parsedData:l,durationMs:Date.now()-n}),l}catch(c){d();let a=this.wrapAbortError(c);throw this.log({method:"PUT",path:e,body:t,status:r,rawResponse:i,error:a,durationMs:Date.now()-n}),a===c&&this.maybeShowNetworkToast(c),a}}async delete(e){let t=Date.now(),n,r,{controller:i,clear:s}=this.createTimeoutController();try{let d=await fetch(`${this.baseUrl}${e}`,{method:"DELETE",headers:this.buildHeaders(),signal:i.signal});s(),n=d.status;let{raw:c,data:a}=await this.handleResponseWithRaw(d);return r=c,this.log({method:"DELETE",path:e,status:n,rawResponse:r,parsedData:a,durationMs:Date.now()-t}),a}catch(d){s();let c=this.wrapAbortError(d);throw this.log({method:"DELETE",path:e,status:n,rawResponse:r,error:c,durationMs:Date.now()-t}),c===d&&this.maybeShowNetworkToast(d),c}}async stream(e,t,n,r,i,s,d,c,a,l,u,f){let m=Date.now(),h=i?.modelName?` [model: ${i.modelName}]`:"",C=[],y=E=>{this.debug&&C.push({t:Date.now()-m,event:E})},{cbs:I,flush:R}=ge({onChunk:n,onDone:r,onState:s,onThinking:d,onCreatedCharacters:c,onReconnect:l,onAborted:u,onBase:f}),Te=new AbortController,k=null,_=null,N=null,D=()=>{k!==null&&(clearTimeout(k),k=null),_!==null&&(clearTimeout(_),_=null)},we=E=>{N=E,D(),Te.abort()};k=setTimeout(()=>we("REQUEST_TIMEOUT"),w.REQUEST_TIMEOUT);let O;try{O=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t),signal:Te.signal})}catch(E){if(D(),N){let v=new g(N,"Request timed out");throw S(N),this.log({method:"STREAM",path:e,body:t,error:v,durationMs:Date.now()-m,modelName:i?.modelName}),v}throw this.maybeShowNetworkToast(E),E}if(k!==null&&(clearTimeout(k),k=null),!O.ok){D();let E=await O.text().catch(()=>""),v={};try{v=JSON.parse(E)}catch{}let b=v.code||"INTERNAL_ERROR",p=v.message||v.error||v.details,Oe=Array.isArray(v.matched_words)?v.matched_words:void 0,Pe=new g(b,p||`HTTP ${O.status}`,Oe);throw S(b,p,Oe),this.log({method:"STREAM",path:e,body:t,status:O.status,rawResponse:E,error:Pe,durationMs:Date.now()-m,modelName:i?.modelName}),Pe}let Ce=O.body?.getReader();if(!Ce)throw D(),new g("INTERNAL_ERROR","No response body for stream");_=setTimeout(()=>we("MODEL_LOADING_TIMEOUT"),w.INITIAL_TIMEOUT);let Re=new TextDecoder,X="",le,re,M="",oe,ie,U="",L=!1,P=null,_e=E=>{if(L)return;let v=E.endsWith("\r")?E.slice(0,-1):E;if(v.startsWith("id: ")){ie=v.slice(4);return}if(!v.startsWith("data: "))return;let b=v.slice(6);if(b==="[DONE]"){y("[DONE]"),L=!0;return}try{let p=JSON.parse(b);y(p),p.type==="done"&&p.id?(X=p.id,le=p.truncated===!0):p.type==="aborted"?(re={id:typeof p.id=="string"?p.id:"",persisted:p.persisted===!0},L=!0):p.type==="error"?(P=new g(p.code||"INTERNAL_ERROR",p.message||"Generation failed",Array.isArray(p.matched_words)?p.matched_words:void 0),L=!0):p.type==="state"?(I.onState?.(p.delta,p.full??null),Array.isArray(p.createdNames)&&p.createdNames.length&&I.onCreatedCharacters?.(p.createdNames)):p.type==="start"?(_!==null&&(clearTimeout(_),_=null),typeof p.base_content=="string"&&f?.(p.base_content)):p.type==="thinking"?(p.status==="start"||p.status==="end")&&I.onThinking?.(p.status):p.content&&(_!==null&&(clearTimeout(_),_=null),M+=p.content,I.onChunk(p.content))}catch{y({raw:b})}ie!==void 0&&(oe=ie,ie=void 0)},Se=()=>{if(D(),P)throw R(),S(P.code,P.message,P.matchedWords),this.log({method:"STREAM",path:e,body:t,error:P,durationMs:Date.now()-m,modelName:i?.modelName}),P;this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${O.status}]${h} (${Date.now()-m}ms) %c\u2713`,"color: #6366f1; font-weight: bold","color: #e0e0e0","color: #22c55e"),console.log("Request:",t),console.log(`Accumulated content (${M.length} chars):`,M),console.log("Message ID:",X),re&&console.log("Aborted:",re),console.log(`SSE events (${C.length}):`,C),console.groupEnd()),G(I,{messageId:X,truncated:le,aborted:re})};try{for(;;){let{done:E,value:v}=await Ce.read();if(E)break;U+=Re.decode(v,{stream:!0});let b=U.split(`
120
+ `;let d=s.querySelector(".storvia-toast-msg");d&&(d.textContent=o);let c=()=>{s.isConnected&&(s.classList.add("leaving"),s.classList.remove("show"),setTimeout(()=>s.remove(),320))};if(n){let a=document.createElement("button");a.type="button",a.className="storvia-toast-action",a.textContent=n.label,a.addEventListener("click",()=>{try{n.onClick()}catch(l){console.error("[Storvia toast] action error:",l)}c()}),s.appendChild(a)}if(i){let a=document.createElement("button");a.type="button",a.className="storvia-toast-close",a.setAttribute("aria-label",ae("close")),a.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',a.addEventListener("click",c),s.appendChild(a)}r.appendChild(s),requestAnimationFrame(()=>s.classList.add("show")),i||setTimeout(c,t)}function mt(o){let e=o.filter(t=>t).map(t=>`\u300C${t}\u300D`).join("");return ae("violationWords").replace("{words}",e)}var ft=3e3,xe={};function Ue(o){let e=Date.now();if(!(e-(xe[o]??0)<ft)){if(xe[o]=e,!pe){console.warn(`[Storvia] navigate \u2192 wallet(${o})\uFF1A\u5F53\u524D\u672A\u68C0\u6D4B\u5230\u5BBF\u4E3B\uFF08dev \u6A21\u5F0F\uFF09\uFF0C\u751F\u4EA7\u73AF\u5883\u7531\u5BBF\u4E3B\u5F39\u5145\u503C\u5F15\u5BFC / \u8DF3\u94B1\u5305\u9875\u3002`);return}try{pe(T("navigate",{target:"wallet",reason:o}))}catch(t){console.error("[Storvia] navigate \u2192 wallet \u901A\u8FC7 bus \u53D1\u9001\u5931\u8D25:",t)}}}function S(o,e,t){if(o==="GENERATION_ABORTED")return;if(o==="INSUFFICIENT_CREDITS")return Ue("insufficient_credits");if(o==="DAISY_CARD_REQUIRED")return Ue("daisy_card_required");let n=o==="VIOLATION_WORD_DETECTED"&&t?.length?mt(t):De(o)||e||ae("unknownError");ee(n,o==="RATE_LIMITED"?"warning":"error")}function vt(o,e){let t=e?.tickMs??100,n=e?.baseLagMs??1e3,r=e?.maxLagMs??2500,i=e?.minCharsPerTick??2,s="",d=null,c=0,a=0,l=()=>Math.min(r,Math.max(n,c*1.35)),u=()=>{let y=Math.max(i,Math.ceil(s.length*t/l()));if(y>=s.length)y=s.length;else{let R=s.charCodeAt(y-1);R>=55296&&R<=56319&&y++}let I=s.slice(0,y);s=s.slice(y),I&&o(I)},f=()=>{d=null,u(),s&&(d=setTimeout(f,t))};return{push:y=>{let I=Date.now();if(a>0){let R=Math.min(I-a,r);c=c>0?c*.7+R*.3:R}a=I,s+=y,d===null&&f()},flush:()=>{d!==null&&(clearTimeout(d),d=null),s&&(o(s),s="")},cancel:()=>{d!==null&&(clearTimeout(d),d=null),s=""}}}function ge(o){let e=vt(o.onChunk);return{cbs:{onChunk:n=>e.push(n),onDone:(n,r)=>{e.flush(),o.onDone(n,r)},onAborted:o.onAborted?n=>{e.flush(),o.onAborted(n)}:void 0,onState:o.onState?(n,r)=>{e.flush(),o.onState(n,r)}:void 0,onThinking:o.onThinking?n=>{e.flush(),o.onThinking(n)}:void 0,onCreatedCharacters:o.onCreatedCharacters?n=>{e.flush(),o.onCreatedCharacters(n)}:void 0,onReconnect:o.onReconnect},flush:()=>e.flush()}}var Fe="0.10.6";function G(o,e){if(e.aborted){if(o.onAborted){o.onAborted(e.aborted);return}o.onDone(e.aborted.id,{truncated:!1});return}o.onDone(e.messageId,e.truncated===void 0?void 0:{truncated:e.truncated})}var w=class w{constructor(e,t,n=!1,r=""){this.baseUrl=e,this.token=t,this.debug=n,this.devApiKey=r}setToken(e){this.token=e}setDebug(e){this.debug=e}maybeShowNetworkToast(e){e instanceof g||S("NETWORK_ERROR")}wrapAbortError(e){if(e instanceof DOMException&&e.name==="AbortError"){let t=new g("REQUEST_TIMEOUT","Request timed out");return S("REQUEST_TIMEOUT"),t}return e}createTimeoutController(){let e=new AbortController,t=setTimeout(()=>e.abort(),w.REQUEST_TIMEOUT);return{controller:e,clear:()=>clearTimeout(t)}}buildHeaders(){let e={"Content-Type":"application/json"};return this.token&&(e.Authorization=`Bearer ${this.token}`),this.devApiKey&&(e["x-api-key"]=this.devApiKey),e["x-client-info"]=`storvia-sdk/${Fe}`,e}log(e){if(!this.debug)return;let{method:t,path:n,body:r,status:i,rawResponse:s,parsedData:d,error:c,durationMs:a,modelName:l}=e,u="%c[Storvia SDK]",f="color: #6366f1; font-weight: bold",m=a!==void 0?` (${a}ms)`:"",h=i!==void 0?` [${i}]`:"",C=l?` [model: ${l}]`:"";c?(console.groupCollapsed(`${u} %c${t} ${n}${h}${C}${m} %c\u2717`,f,"color: #e0e0e0","color: #ef4444"),r!==void 0&&console.log("Request:",r),s!==void 0&&console.log("Response (raw):",s),console.error("Error:",c),console.groupEnd()):(console.groupCollapsed(`${u} %c${t} ${n}${h}${C}${m} %c\u2713`,f,"color: #e0e0e0","color: #22c55e"),r!==void 0&&console.log("Request:",r),s!==void 0&&console.log("Response (raw):",s),d!==void 0&&d!==s&&console.log("Response (data):",d),console.groupEnd())}async get(e,t){let n=new URL(`${this.baseUrl}${e}`);t&&Object.entries(t).forEach(([a,l])=>n.searchParams.set(a,l));let r=Date.now(),i,s,{controller:d,clear:c}=this.createTimeoutController();try{let a=await fetch(n.toString(),{method:"GET",headers:this.buildHeaders(),signal:d.signal});c(),i=a.status;let{raw:l,data:u}=await this.handleResponseWithRaw(a);return s=l,this.log({method:"GET",path:e,body:t,status:i,rawResponse:s,parsedData:u,durationMs:Date.now()-r}),u}catch(a){c();let l=this.wrapAbortError(a);throw this.log({method:"GET",path:e,body:t,status:i,rawResponse:s,error:l,durationMs:Date.now()-r}),l===a&&this.maybeShowNetworkToast(a),l}}async post(e,t,n){let r=Date.now(),i,s,{controller:d,clear:c}=this.createTimeoutController();try{let a=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:d.signal});c(),i=a.status;let{raw:l,data:u}=await this.handleResponseWithRaw(a);return s=l,this.log({method:"POST",path:e,body:t,status:i,rawResponse:s,parsedData:u,durationMs:Date.now()-r,modelName:n?.modelName}),u}catch(a){c();let l=this.wrapAbortError(a);throw this.log({method:"POST",path:e,body:t,status:i,rawResponse:s,error:l,durationMs:Date.now()-r,modelName:n?.modelName}),l===a&&this.maybeShowNetworkToast(a),l}}async patch(e,t){let n=Date.now(),r,i,{controller:s,clear:d}=this.createTimeoutController();try{let c=await fetch(`${this.baseUrl}${e}`,{method:"PATCH",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:s.signal});d(),r=c.status;let{raw:a,data:l}=await this.handleResponseWithRaw(c);return i=a,this.log({method:"PATCH",path:e,body:t,status:r,rawResponse:i,parsedData:l,durationMs:Date.now()-n}),l}catch(c){d();let a=this.wrapAbortError(c);throw this.log({method:"PATCH",path:e,body:t,status:r,rawResponse:i,error:a,durationMs:Date.now()-n}),a===c&&this.maybeShowNetworkToast(c),a}}async put(e,t){let n=Date.now(),r,i,{controller:s,clear:d}=this.createTimeoutController();try{let c=await fetch(`${this.baseUrl}${e}`,{method:"PUT",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:s.signal});d(),r=c.status;let{raw:a,data:l}=await this.handleResponseWithRaw(c);return i=a,this.log({method:"PUT",path:e,body:t,status:r,rawResponse:i,parsedData:l,durationMs:Date.now()-n}),l}catch(c){d();let a=this.wrapAbortError(c);throw this.log({method:"PUT",path:e,body:t,status:r,rawResponse:i,error:a,durationMs:Date.now()-n}),a===c&&this.maybeShowNetworkToast(c),a}}async delete(e){let t=Date.now(),n,r,{controller:i,clear:s}=this.createTimeoutController();try{let d=await fetch(`${this.baseUrl}${e}`,{method:"DELETE",headers:this.buildHeaders(),signal:i.signal});s(),n=d.status;let{raw:c,data:a}=await this.handleResponseWithRaw(d);return r=c,this.log({method:"DELETE",path:e,status:n,rawResponse:r,parsedData:a,durationMs:Date.now()-t}),a}catch(d){s();let c=this.wrapAbortError(d);throw this.log({method:"DELETE",path:e,status:n,rawResponse:r,error:c,durationMs:Date.now()-t}),c===d&&this.maybeShowNetworkToast(d),c}}async stream(e,t,n,r,i,s,d,c,a,l,u,f){let m=Date.now(),h=i?.modelName?` [model: ${i.modelName}]`:"",C=[],y=E=>{this.debug&&C.push({t:Date.now()-m,event:E})},{cbs:I,flush:R}=ge({onChunk:n,onDone:r,onState:s,onThinking:d,onCreatedCharacters:c,onReconnect:l,onAborted:u,onBase:f}),Te=new AbortController,k=null,_=null,N=null,D=()=>{k!==null&&(clearTimeout(k),k=null),_!==null&&(clearTimeout(_),_=null)},we=E=>{N=E,D(),Te.abort()};k=setTimeout(()=>we("REQUEST_TIMEOUT"),w.REQUEST_TIMEOUT);let O;try{O=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t),signal:Te.signal})}catch(E){if(D(),N){let v=new g(N,"Request timed out");throw S(N),this.log({method:"STREAM",path:e,body:t,error:v,durationMs:Date.now()-m,modelName:i?.modelName}),v}throw this.maybeShowNetworkToast(E),E}if(k!==null&&(clearTimeout(k),k=null),!O.ok){D();let E=await O.text().catch(()=>""),v={};try{v=JSON.parse(E)}catch{}let b=v.code||"INTERNAL_ERROR",p=v.message||v.error||v.details,Oe=Array.isArray(v.matched_words)?v.matched_words:void 0,Pe=new g(b,p||`HTTP ${O.status}`,Oe);throw S(b,p,Oe),this.log({method:"STREAM",path:e,body:t,status:O.status,rawResponse:E,error:Pe,durationMs:Date.now()-m,modelName:i?.modelName}),Pe}let Ce=O.body?.getReader();if(!Ce)throw D(),new g("INTERNAL_ERROR","No response body for stream");_=setTimeout(()=>we("MODEL_LOADING_TIMEOUT"),w.INITIAL_TIMEOUT);let Re=new TextDecoder,X="",le,re,M="",oe,ie,U="",L=!1,P=null,_e=E=>{if(L)return;let v=E.endsWith("\r")?E.slice(0,-1):E;if(v.startsWith("id: ")){ie=v.slice(4);return}if(!v.startsWith("data: "))return;let b=v.slice(6);if(b==="[DONE]"){y("[DONE]"),L=!0;return}try{let p=JSON.parse(b);y(p),p.type==="done"&&p.id?(X=p.id,le=p.truncated===!0):p.type==="aborted"?(re={id:typeof p.id=="string"?p.id:"",persisted:p.persisted===!0},L=!0):p.type==="error"?(P=new g(p.code||"INTERNAL_ERROR",p.message||"Generation failed",Array.isArray(p.matched_words)?p.matched_words:void 0),L=!0):p.type==="state"?(I.onState?.(p.delta,p.full??null),Array.isArray(p.createdNames)&&p.createdNames.length&&I.onCreatedCharacters?.(p.createdNames)):p.type==="start"?(_!==null&&(clearTimeout(_),_=null),typeof p.base_content=="string"&&f?.(p.base_content)):p.type==="thinking"?(p.status==="start"||p.status==="end")&&I.onThinking?.(p.status):p.content&&(_!==null&&(clearTimeout(_),_=null),M+=p.content,I.onChunk(p.content))}catch{y({raw:b})}ie!==void 0&&(oe=ie,ie=void 0)},Se=()=>{if(D(),P)throw R(),S(P.code,P.message,P.matchedWords),this.log({method:"STREAM",path:e,body:t,error:P,durationMs:Date.now()-m,modelName:i?.modelName}),P;this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${O.status}]${h} (${Date.now()-m}ms) %c\u2713`,"color: #6366f1; font-weight: bold","color: #e0e0e0","color: #22c55e"),console.log("Request:",t),console.log(`Accumulated content (${M.length} chars):`,M),console.log("Message ID:",X),re&&console.log("Aborted:",re),console.log(`SSE events (${C.length}):`,C),console.groupEnd()),G(I,{messageId:X,truncated:le,aborted:re})};try{for(;;){let{done:E,value:v}=await Ce.read();if(E)break;U+=Re.decode(v,{stream:!0});let b=U.split(`
121
121
  `);U=b.pop()??"";for(let p of b)_e(p);if(L){Se();return}}if(U+=Re.decode(),U&&_e(U),L){Se();return}}catch(E){if(D(),P)throw P;if(N){let v=new g(N,"Stream did not start in time");if(this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${O.status}]${h} (${Date.now()-m}ms) %c\u2717 ${N}`,"color: #6366f1; font-weight: bold","color: #e0e0e0","color: #ef4444"),console.log("Request:",t),console.log(`Accumulated content (${M.length} chars):`,M),console.log(`SSE events (${C.length}):`,C),console.error("Timeout:",v),console.groupEnd()),a){await this.resumeLoop(a,oe,I,{finalize:!0});return}throw S(N),R(),v}if(this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${O.status}]${h} (${Date.now()-m}ms) %c\u2717`,"color: #6366f1; font-weight: bold","color: #e0e0e0","color: #ef4444"),console.log("Request:",t),console.log(`Accumulated content (${M.length} chars):`,M),console.log(`SSE events (${C.length}):`,C),console.error("Stream error:",E),console.groupEnd()),a){await this.resumeLoop(a,oe,I,{finalize:!0});return}throw R(),E}if(D(),X){G(I,{messageId:X,truncated:le});return}if(a){await this.resumeLoop(a,oe,I,{finalize:!0});return}R()}async resumeLoop(e,t,n,r){let i=t;for(let d=1;d<=w.RECONNECT_MAX_ATTEMPTS;d++){let c=Math.min(w.RECONNECT_BACKOFF_CAP,1e3*2**(d-1));await new Promise(u=>setTimeout(u,c)),n.onReconnect?.({attempt:d});let a={messageId:"",lastId:i},l;try{l=await this.pumpGetStream(e.conversationId,e.topic,i,a,n)}catch{continue}if(i=a.lastId??i,l==="done"){if(a.errorCode)throw this.terminalError(a);G(n,a);return}if(l==="inactive"){(a.messageId||r?.finalize)&&G(n,a);return}}let s=new g("STREAM_INTERRUPTED","Stream reconnection failed after maximum attempts");throw S("STREAM_INTERRUPTED"),s}async resumeStream(e,t,n){let{cbs:r}=ge(n),i={messageId:""},s;try{s=await this.pumpGetStream(e,t,void 0,i,r)}catch{await this.resumeLoop({conversationId:e,topic:t},i.lastId,r);return}if(s==="done"){if(i.errorCode)throw this.terminalError(i);G(r,i);return}if(s==="inactive"){i.messageId&&G(r,i);return}await this.resumeLoop({conversationId:e,topic:t},i.lastId,r)}terminalError(e){let t=new g(e.errorCode??"INTERNAL_ERROR",e.errorMessage||"Generation failed",e.errorMatchedWords);return S(t.code,t.message,t.matchedWords),t}async pumpGetStream(e,t,n,r,i){let s=new URL(`${this.baseUrl}/conversations/${encodeURIComponent(e)}/stream`);n&&s.searchParams.set("from",n),t&&s.searchParams.set("topic",t);let d=new AbortController,c=setTimeout(()=>d.abort(),w.REQUEST_TIMEOUT),a;try{a=await fetch(s.toString(),{method:"GET",headers:this.buildHeaders(),signal:d.signal})}finally{clearTimeout(c)}if(!a.ok)throw new g("STREAM_INTERRUPTED",`Resume HTTP ${a.status}`);if(!(a.headers.get("content-type")||"").includes("text/event-stream"))return"inactive";let u=a.body?.getReader();return u?await this.pumpReader(u,r,i):"inactive"}async pumpReader(e,t,n){let r=new TextDecoder,i,s=null,d=()=>{s&&clearTimeout(s),s=setTimeout(()=>{e.cancel().catch(()=>{})},w.RESUME_STALL_TIMEOUT)};d();let c="",a=!1,l=u=>{if(a)return;let f=u.endsWith("\r")?u.slice(0,-1):u;if(f.startsWith("id: ")){i=f.slice(4);return}if(!f.startsWith("data: "))return;let m=f.slice(6);if(m==="[DONE]"){a=!0;return}try{let h=JSON.parse(m);h.type==="done"&&h.id?(t.messageId=h.id,t.truncated=h.truncated===!0):h.type==="aborted"?(t.aborted={id:typeof h.id=="string"?h.id:"",persisted:h.persisted===!0},a=!0):h.type==="error"?(t.errorCode=h.code||"INTERNAL_ERROR",t.errorMessage=h.message||"Generation failed",Array.isArray(h.matched_words)&&(t.errorMatchedWords=h.matched_words),a=!0):h.type==="state"?(n.onState?.(h.delta,h.full??null),Array.isArray(h.createdNames)&&h.createdNames.length&&n.onCreatedCharacters?.(h.createdNames)):h.type==="start"?typeof h.base_content=="string"&&n.onBase?.(h.base_content):h.type==="thinking"?(h.status==="start"||h.status==="end")&&n.onThinking?.(h.status):h.content&&n.onChunk(h.content)}catch{}i!==void 0&&(t.lastId=i,i=void 0)};try{for(;;){let{done:u,value:f}=await e.read();if(u)break;d(),c+=r.decode(f,{stream:!0});let m=c.split(`
122
122
  `);c=m.pop()??"";for(let h of m)l(h);if(a)return s&&clearTimeout(s),"done"}if(c+=r.decode(),c&&l(c),a)return s&&clearTimeout(s),"done"}catch{}finally{s&&clearTimeout(s)}return"eof"}async handleResponseWithRaw(e){let t=await e.text(),n;try{n=t?JSON.parse(t):null}catch{n=t}if(!e.ok){let r=n&&typeof n=="object"?n:{},i={401:"UNAUTHORIZED",402:"INSUFFICIENT_CREDITS",429:"RATE_LIMITED"},s=r.code||i[e.status]||"INTERNAL_ERROR",d=Array.isArray(r.matched_words)?r.matched_words:void 0,c=new g(s,r.message||`HTTP ${e.status}`,d);throw S(s,r.message,d),c}return n&&typeof n=="object"&&"data"in n?{raw:n,data:n.data}:{raw:n,data:n}}};w.REQUEST_TIMEOUT=6e4,w.INITIAL_TIMEOUT=3e4,w.RESUME_STALL_TIMEOUT=6e4,w.RECONNECT_MAX_ATTEMPTS=10,w.RECONNECT_BACKOFF_CAP=15e3;var te=w;var We="storvia_chat_main";function It(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let o=new Uint8Array(16);crypto.getRandomValues(o),o[6]=o[6]&15|64,o[8]=o[8]&63|128;let e=Array.from(o,t=>t.toString(16).padStart(2,"0")).join("");return`${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20)}`}var Ve=20,He=40,V=class{constructor(e,t,n,r,i=!1,s,d,c){this.http=e;this.getGameId=t;this.getConversationId=n;this.getModelId=r;this.isPreview=i;this.previewHistory=[];this.previewConfig=s,this.getModelName=d,this.getPreset=c}reqMeta(){let e=this.getModelName?.();return e?{modelName:e}:void 0}updatePreviewConfig(e){this.previewConfig=e}async send(e){if(this.isPreview)return this.sendPreview(e);let t={game_id:this.getGameId(),conversation_id:this.getConversationId(),model_id:this.getModelId(),message:e.message,topic:e.topic,scene_key:e.sceneKey,extract:e.extract,stream:e.stream??!1,preset:this.getPreset?.(),client_message_uuid:It()};if(e.stream){await this.http.stream("/chat",t,e.onChunk??(()=>{}),e.onDone??(()=>{}),this.reqMeta(),F(e.onState),e.onThinking,e.onCreatedCharacters,{conversationId:this.getConversationId(),topic:e.topic},e.onReconnecting,e.onAborted);return}return this.http.post("/chat",t,this.reqMeta())}async save(e){return this.isPreview?{id:`preview-${Date.now()}`}:this.http.post("/messages/save",{game_id:this.getGameId(),conversation_id:this.getConversationId(),role:e.role,content:e.content,topic:e.topic})}async generate(e){if(this.isPreview)return this.sendPreview({message:"",topic:e.topic,sceneKey:e.sceneKey,stream:e.stream,onChunk:e.onChunk,onDone:e.onDone,onState:e.onState,onThinking:e.onThinking,onCreatedCharacters:e.onCreatedCharacters});let t={game_id:this.getGameId(),conversation_id:this.getConversationId(),model_id:this.getModelId(),topic:e.topic,scene_key:e.sceneKey,extract:e.extract,stream:e.stream??!1,preset:this.getPreset?.()};if(e.stream){await this.http.stream("/generate",t,e.onChunk??(()=>{}),e.onDone??(()=>{}),this.reqMeta(),F(e.onState),e.onThinking,e.onCreatedCharacters,{conversationId:this.getConversationId(),topic:e.topic},e.onReconnecting,e.onAborted);return}return this.http.post("/generate",t,this.reqMeta())}async once(e){if(this.isPreview)return this.oncePreview(e);let t={game_id:this.getGameId(),conversation_id:this.getConversationId(),model_id:this.getModelId(),message:e.message,scene_key:e.sceneKey,stream:e.stream===!0,preset:this.getPreset?.()};if(!e.stream)return this.http.post("/once",t,this.reqMeta());let n="";return await this.http.stream("/once",t,r=>{n+=r,e.onChunk?.(r)},()=>{},this.reqMeta(),void 0,e.onThinking),{content:n}}async oncePreview(e){let t={model_id:this.getModelId(),message:e.message,scene_key:e.sceneKey,history_messages:[],preset:this.getPreset?.()};this.previewConfig?t.prompt_config=this.previewConfig:t.game_id=this.getGameId();let n=this.previewConfig;n?.reply_length&&(t.reply_length=n.reply_length),n?.reply_language&&(t.reply_language=n.reply_language);let r="";return await this.http.stream("/preview",t,i=>{r+=i,e.onChunk?.(i)},()=>{},this.reqMeta(),void 0,e.onThinking),{content:r}}async retry(e={}){if(this.isPreview)throw new g("NOT_SUPPORTED_IN_PREVIEW","storvia.chat.retry() is not available in preview mode. Publish the game and test on the Storvia platform.");let t={game_id:this.getGameId(),conversation_id:this.getConversationId(),model_id:this.getModelId(),topic:e.topic,scene_key:e.sceneKey,extract:e.extract,stream:e.stream??!1,preset:this.getPreset?.()};if(e.stream){await this.http.stream("/retry",t,e.onChunk??(()=>{}),e.onDone??(()=>{}),this.reqMeta(),F(e.onState),e.onThinking,e.onCreatedCharacters,{conversationId:this.getConversationId(),topic:e.topic},e.onReconnecting,e.onAborted);return}return this.http.post("/retry",t,this.reqMeta())}async continue(e={}){if(this.isPreview)return;let t={conversation_id:this.getConversationId(),topic:e.topic??null,game_id:this.getGameId(),preset:this.getPreset?.(),scene_key:e.sceneKey,extract:e.extract};await this.http.stream("/continue",t,e.onChunk??(()=>{}),e.onDone??(()=>{}),this.reqMeta(),F(e.onState),e.onThinking,e.onCreatedCharacters,{conversationId:this.getConversationId(),topic:e.topic},e.onReconnecting,e.onAborted,e.onBase)}async cancel(e={}){if(this.isPreview)return{active:!1};let t=await this.http.post(`/conversations/${encodeURIComponent(this.getConversationId())}/cancel`,{topic:e.topic});return{active:t.active===!0,generationId:t.generation_id}}async messages(e){if(this.isPreview)return{data:[],hasMore:!1,nextCursor:null};let t={conversation_id:this.getConversationId(),order:e.order,limit:String(e.limit??20)};e.topic&&(t.topic=e.topic),e.cursor&&(t.cursor_uuid=e.cursor.uuid,t.cursor_created_at=e.cursor.createdAt);let n=await this.http.get("/messages",t);return{data:n.messages.map(r=>({uuid:r.uuid,role:r.role,content:r.content,topic:r.topic,status:r.status,model:r.model,createdAt:r.created_at,truncated:r.truncated===!0})),hasMore:n.has_more,nextCursor:n.next_cursor?{uuid:n.next_cursor.cursor_uuid,createdAt:n.next_cursor.cursor_created_at}:null}}async edit(e){if(this.isPreview)throw new g("NOT_SUPPORTED_IN_PREVIEW","storvia.chat.edit() is not available in preview mode. Publish the game and test on the Storvia platform.");let t=await this.http.patch(`/messages/${encodeURIComponent(e.uuid)}`,{content:e.content});return{uuid:t.uuid,role:t.role,content:t.content,updatedAt:t.updated_at}}async delete(e){if(this.isPreview)throw new g("NOT_SUPPORTED_IN_PREVIEW","storvia.chat.delete() is not available in preview mode. Publish the game and test on the Storvia platform.");return{uuid:(await this.http.delete(`/messages/${encodeURIComponent(e.uuid)}`)).uuid}}async rollback(e){if(this.isPreview)throw new g("NOT_SUPPORTED_IN_PREVIEW","storvia.chat.rollback() is not available in preview mode. Publish the game and test on the Storvia platform.");let t=await this.http.post(`/messages/${encodeURIComponent(e.uuid)}/rollback`,{});return{deletedCount:t.deleted_count,deletedUuids:t.deleted_uuids,restoredGameState:t.restored_game_state}}async resume(e={}){this.isPreview||await this.http.resumeStream(this.getConversationId(),e.topic,{onChunk:e.onChunk??(()=>{}),onDone:e.onDone??(()=>{}),onState:F(e.onState),onThinking:e.onThinking,onCreatedCharacters:e.onCreatedCharacters,onReconnect:e.onReconnecting,onAborted:e.onAborted})}async sendPreview(e){let t=e.message.trim().length>0,n=this.previewHistory.slice(t?-(Ve-1):-Ve);t&&this.pushPreviewHistory({role:"user",content:e.message});let r={model_id:this.getModelId(),message:e.message,topic:e.topic,scene_key:e.sceneKey,history_messages:n,preset:this.getPreset?.()};this.previewConfig?r.prompt_config=this.previewConfig:r.game_id=this.getGameId();let i=this.previewConfig;if(i?.reply_length&&(r.reply_length=i.reply_length),i?.reply_language&&(r.reply_language=i.reply_language),e.stream){let u="";await this.http.stream("/preview",r,f=>{u+=f,e.onChunk?.(f)},(f,m)=>{u&&this.pushPreviewHistory({role:"assistant",content:u}),e.onDone?.(f,m)},this.reqMeta(),F(e.onState),e.onThinking,e.onCreatedCharacters);return}let s="",d=null,c=null,a=[];await this.http.stream("/preview",r,u=>{s+=u},()=>{},this.reqMeta(),(u,f)=>{d=u,c=f,e.onState&&e.onState(d,c)},void 0,u=>{a=u,e.onCreatedCharacters&&e.onCreatedCharacters(u)}),s&&this.pushPreviewHistory({role:"assistant",content:s});let l={id:"",content:s,truncated:!1};return d&&(l.delta=d,c&&(l.full=c)),a.length&&(l.createdNames=a),l}pushPreviewHistory(e){this.previewHistory.push(e),this.previewHistory.length>He&&this.previewHistory.splice(0,this.previewHistory.length-He)}};function F(o){if(o)return(e,t)=>o(e,t)}var me=class{constructor(e,t,n=!1,r){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem={};r&&(this.mem={...r})}setInitial(e){this.mem=e?{...e}:{}}async get(e,t){if(this.isPreview){let r=this.mem[e]||{};return t?{...r[t]||{}}:{...r}}let n=t?{group:t}:void 0;return this.http.get(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/state`,n)}async update(e,t,n){if(this.isPreview){let r=this.mem[e]||(this.mem[e]={});r[t]={...r[t]||{},...n};return}await this.http.patch(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/state`,{group:t,values:n})}async remove(e,t,n){if(n.length){if(this.isPreview){let r=this.mem[e]?.[t];if(r)for(let i of n)delete r[i];return}await this.http.patch(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/state`,{group:t,removeKeys:n})}}async removeGroup(e,t){if(this.isPreview){let n=this.mem[e];n&&delete n[t];return}await this.http.patch(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/state`,{group:t,removeGroup:!0})}},H=class{constructor(e,t,n=!1,r,i){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem=[];r&&(this.mem=r.map(Be)),this.state=new me(e,t,n,i)}setInitial(e,t){this.mem=e?e.map(Be):[],this.state.setInitial(t)}async list(){return this.isPreview?this.mem.map(je):this.http.get(`/conversations/${this.getConversationId()}/characters`)}async get(e){if(this.isPreview){let t=this.mem.find(n=>n.name===e);return t?je(t):{name:e}}return this.http.get(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}`)}async add(e){if(this.isPreview){this.mem.push({...e,isPreset:!1});return}await this.http.post(`/conversations/${this.getConversationId()}/characters`,e)}async update(e,t){if(this.isPreview){let n=this.mem.find(r=>r.name===e);n&&Object.assign(n,t);return}await this.http.patch(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}`,t)}async remove(e){if(this.isPreview){this.mem=this.mem.filter(t=>t.name!==e);return}await this.http.delete(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}`)}async merge(e,t){if(this.isPreview){if(this.mem.find(r=>r.name===e)?.isPreset)throw new g("INVALID_REQUEST","\u9884\u8BBE\u89D2\u8272\u4E0D\u53EF\u88AB\u5408\u5E76");if(e===t||!this.mem.some(r=>r.name===t))throw new g("INVALID_REQUEST","\u76EE\u6807\u89D2\u8272\u4E0D\u5B58\u5728\u6216\u4E0E\u6765\u6E90\u76F8\u540C");this.mem=this.mem.filter(r=>r.name!==e);return}await this.http.post(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/merge`,{target:t})}async detail(e){if(this.isPreview){let t=this.mem.find(n=>n.name===e);return{name:e,avatar:t?.avatar,description:t?.description,...t?.introduction!==void 0?{introduction:t.introduction}:{},...t?.visibleAtStart!==void 0?{visibleAtStart:t.visibleAtStart}:{},userDescription:t?.userDescription,...t?.gender?{gender:t.gender}:{},...t?.isPreset!==void 0?{isPreset:t.isPreset}:{},state:await this.state.get(e)}}return this.http.get(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/detail`)}async setPriority(e,t){let n=Math.max(0,Math.min(100,Math.round(t)));this.isPreview||await this.http.patch(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/state`,{priority:n})}};function Be(o){return{name:o.name,description:o.description,avatar:o.avatar,...o.introduction!==void 0?{introduction:o.introduction}:{},...o.visibleAtStart!==void 0?{visibleAtStart:o.visibleAtStart}:{},...o.gender?{gender:o.gender}:{},...o.userDescription!==void 0?{userDescription:o.userDescription}:{},...o.isPreset!==void 0?{isPreset:o.isPreset}:{}}}function je(o){return{name:o.name,avatar:o.avatar,description:o.description,...o.introduction!==void 0?{introduction:o.introduction}:{},...o.visibleAtStart!==void 0?{visibleAtStart:o.visibleAtStart}:{},...o.userDescription!==void 0?{userDescription:o.userDescription}:{},...o.gender?{gender:o.gender}:{},...o.isPreset!==void 0?{isPreset:o.isPreset}:{}}}var W=class{constructor(e,t,n=!1,r){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem=[];r&&(this.mem=r.map(i=>({...i})))}setInitial(e){this.mem=e?e.map(t=>({...t})):[]}async list(){return this.isPreview?[...this.mem]:this.http.get(`/conversations/${this.getConversationId()}/relationships`)}async get(e,t){if(this.isPreview){let n=this.mem.find(r=>r.from===e&&r.to===t);if(n)return{...n};throw new Error("Relationship not found")}return this.http.get(`/conversations/${this.getConversationId()}/relationships/${encodeURIComponent(e)}/${encodeURIComponent(t)}`)}async add(e){if(this.isPreview){this.mem.push({...e});return}await this.http.post(`/conversations/${this.getConversationId()}/relationships`,e)}async update(e,t,n){if(this.isPreview){let r=this.mem.find(i=>i.from===e&&i.to===t);r?Object.assign(r,n):this.mem.push({from:e,to:t,...n});return}await this.http.patch(`/conversations/${this.getConversationId()}/relationships/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,n)}async remove(e,t){if(this.isPreview){this.mem=this.mem.filter(n=>!(n.from===e&&n.to===t));return}await this.http.delete(`/conversations/${this.getConversationId()}/relationships/${encodeURIComponent(e)}/${encodeURIComponent(t)}`)}};function Ke(o){let e={count:o.count};return o.desc!==void 0&&(e.desc=o.desc),o.icon_url!==void 0&&(e.iconUrl=o.icon_url),e}function fe(o){let e={};if(!o)return e;for(let[t,n]of Object.entries(o)){let r={};for(let[i,s]of Object.entries(n))r[i]=Ke(s);e[t]=r}return e}function Et(o){let e={};if(!o)return e;for(let[t,n]of Object.entries(o))e[t]=Ke(n);return e}var B=class{constructor(e,t,n=!1,r){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem={};r&&(this.mem=fe(r))}setInitial(e){this.mem=e?fe(e):{}}async list(e){if(this.isPreview){if(e!==void 0)return{...this.mem[e]||{}};let n={};for(let[r,i]of Object.entries(this.mem))n[r]={...i};return n}if(e!==void 0){let n=await this.http.get(`/conversations/${this.getConversationId()}/inventory/${encodeURIComponent(e)}`);return Et(n)}let t=await this.http.get(`/conversations/${this.getConversationId()}/inventory`);return fe(t)}async add(e){let{group:t,name:n,count:r=1,desc:i,iconUrl:s}=e;if(this.isPreview){if(!this.mem[t])throw new Error(`Group "${t}" does not exist`);if(n in this.mem[t])throw new Error(`Item "${n}" already exists in group "${t}"`);let c={count:r};i!==void 0&&(c.desc=i),s!==void 0&&(c.iconUrl=s),this.mem[t][n]=c;return}let d={group:t,name:n,count:r};i!==void 0&&(d.desc=i),s!==void 0&&(d.icon_url=s),await this.http.post(`/conversations/${this.getConversationId()}/inventory`,d)}async update(e){let{group:t,name:n,count:r,desc:i,iconUrl:s}=e;if(this.isPreview){let c=this.mem[t];if(!c||!(n in c))throw new Error(`Item "${t}/${n}" not found`);let a=c[n];r!==void 0&&(a.count=r),i!==void 0&&(a.desc=i),s!==void 0&&(a.iconUrl=s);return}let d={};r!==void 0&&(d.count=r),i!==void 0&&(d.desc=i),s!==void 0&&(d.icon_url=s),await this.http.patch(`/conversations/${this.getConversationId()}/inventory/${encodeURIComponent(t)}/${encodeURIComponent(n)}`,d)}async remove(e){let{group:t,name:n}=e;if(this.isPreview){this.mem[t]&&delete this.mem[t][n];return}await this.http.delete(`/conversations/${this.getConversationId()}/inventory/${encodeURIComponent(t)}/${encodeURIComponent(n)}`)}async removeBatch(e){if(this.isPreview){for(let{group:t,name:n}of e)this.mem[t]&&delete this.mem[t][n];return}e.length!==0&&await this.http.post(`/conversations/${this.getConversationId()}/inventory/batch-delete`,{items:e})}async move(e){let{fromGroup:t,toGroup:n,name:r,newName:i}=e;if(this.isPreview){let s=this.mem[t];if(!s||!(r in s))throw new Error(`Source item "${t}/${r}" not found`);if(!this.mem[n])throw new Error(`Target group "${n}" does not exist`);let d=i||r;if(t===n&&d===r)return;if(d in this.mem[n])throw new Error(`Item "${d}" already exists in target group`);this.mem[n][d]=s[r],delete s[r];return}await this.http.post(`/conversations/${this.getConversationId()}/inventory/move`,{fromGroup:t,toGroup:n,name:r,newName:i})}async ensureGroup(e){if(this.isPreview){this.mem[e]||(this.mem[e]={});return}await this.http.post(`/conversations/${this.getConversationId()}/inventory/groups/${encodeURIComponent(e)}`,{})}async removeGroup(e,t){let n=t?.cascade??!1;if(this.isPreview){let i=this.mem[e];if(i&&Object.keys(i).length>0&&!n)throw new Error(`Group "${e}" is not empty, pass cascade: true to force delete`);delete this.mem[e];return}let r=n?"?cascade=true":"";await this.http.delete(`/conversations/${this.getConversationId()}/inventory/groups/${encodeURIComponent(e)}${r}`)}};var j=class{constructor(e,t,n=!1,r){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem={};r&&(this.mem={...r})}setInitial(e){this.mem=e?{...e}:{}}async get(){return this.isPreview?{...this.mem}:this.http.get(`/conversations/${this.getConversationId()}/world`)}async update(e){if(this.isPreview){Object.assign(this.mem,e);return}await this.http.patch(`/conversations/${this.getConversationId()}/world`,e)}};var ve=class{constructor(e,t,n=!1,r){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem={};r&&(this.mem={...r})}setInitial(e){this.mem=e?{...e}:{}}async get(e){if(this.isPreview)return e?{...this.mem[e]||{}}:{...this.mem};let t=e?{group:e}:void 0;return this.http.get(`/conversations/${this.getConversationId()}/player/state`,t)}async update(e,t){if(this.isPreview){this.mem[e]={...this.mem[e]||{},...t};return}await this.http.patch(`/conversations/${this.getConversationId()}/player/state`,{group:e,values:t})}async remove(e,t){if(t.length){if(this.isPreview){let n=this.mem[e];if(n)for(let r of t)delete n[r];return}await this.http.patch(`/conversations/${this.getConversationId()}/player/state`,{group:e,removeKeys:t})}}async removeGroup(e){if(this.isPreview){delete this.mem[e];return}await this.http.patch(`/conversations/${this.getConversationId()}/player/state`,{group:e,removeGroup:!0})}},K=class{constructor(e,t,n=!1,r,i){this.http=e;this.getConversationId=t;this.isPreview=n;this.memPersona={name:""};r&&(this.memPersona={...r}),this.state=new ve(e,t,n,i)}setInitial(e,t){this.memPersona=e?{...e}:{name:""},this.state.setInitial(t)}async get(){return this.isPreview?{...this.memPersona}:this.http.get(`/conversations/${this.getConversationId()}/player`)}async update(e){if(this.isPreview){Object.assign(this.memPersona,e);return}await this.http.patch(`/conversations/${this.getConversationId()}/player`,e)}};function q(o,e){if(!e)return o;let t=o.includes("?")?"&":"?";return`${o}${t}game_id=${encodeURIComponent(e)}`}var z=class{constructor(e,t,n,r=!1,i,s){this.http=e;this.getConversationId=t;this.getGameId=n;this.isPreview=r;this.mem={};this.memInject={};i&&(this.mem=qe(i)),s&&(this.memInject={...s})}setInitial(e,t){this.mem=e?qe(e):{},this.memInject=t?{...t}:{}}async get(e){if(this.isPreview)return e!==void 0?this.mem[e]:{...this.mem};let t=await this.http.get(q(`/conversations/${this.getConversationId()}/custom`,this.getGameId()));return e!==void 0?t[e]:t}async set(e,t){if(this.isPreview){for(let[r,i]of Object.entries(e))typeof i=="object"&&i!==null&&typeof this.mem[r]=="object"&&this.mem[r]!==null?this.mem[r]={...this.mem[r],...i}:this.mem[r]=i,t?.inject!==void 0&&(this.memInject[r]=t.inject);return}let n=t?.inject!==void 0?{data:e,inject:t.inject}:e;await this.http.patch(q(`/conversations/${this.getConversationId()}/custom`,this.getGameId()),n)}async setInject(e,t){if(this.isPreview){this.memInject[e]=t;return}await this.http.patch(q(`/conversations/${this.getConversationId()}/custom/inject/${encodeURIComponent(e)}`,this.getGameId()),{inject:t})}getInject(){return{...this.memInject}}async delete(e){if(this.isPreview){delete this.mem[e],delete this.memInject[e];return}await this.http.delete(q(`/conversations/${this.getConversationId()}/custom/${encodeURIComponent(e)}`,this.getGameId()))}async setGroupField(e,t,n){if(this.isPreview){(!this.mem[e]||typeof this.mem[e]!="object")&&(this.mem[e]={}),this.mem[e][t]=n;return}await this.http.patch(q(`/conversations/${this.getConversationId()}/custom/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,this.getGameId()),{value:n})}async deleteGroupField(e,t){if(this.isPreview){if(typeof this.mem[e]=="object"&&this.mem[e]!==null){let n=this.mem[e];delete n[t]}return}await this.http.delete(q(`/conversations/${this.getConversationId()}/custom/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,this.getGameId()))}};function qe(o){let e={};for(let[t,n]of Object.entries(o))typeof n=="object"&&n!==null&&!Array.isArray(n)?e[t]={...n}:e[t]=n;return e}function ze(o,e){if(!e)return o;let t=o.includes("?")?"&":"?";return`${o}${t}game_id=${encodeURIComponent(e)}`}var Y=class{constructor(e,t,n,r=!1,i){this.http=e;this.getConversationId=t;this.getGameId=n;this.isPreview=r;this.mem={};i&&(this.mem={...i})}setInitial(e){this.mem=e?{...e}:{}}async get(){return this.isPreview?{...this.mem}:await this.http.get(ze(`/conversations/${this.getConversationId()}/save`,this.getGameId()))}async set(e){if(this.isPreview){this.mem={...e};return}await this.http.put(ze(`/conversations/${this.getConversationId()}/save`,this.getGameId()),e)}};var Q=class{constructor(e,t,n=!1){this.http=e;this.getConversationId=t;this.isPreview=n}async get(){if(this.isPreview)throw new g("NOT_SUPPORTED_IN_PREVIEW","storvia.state.get() is not available in preview mode. Publish the game and test on the Storvia platform. (Use per-module get() like storvia.world.get() if you need to inspect state during preview.)");return this.http.get(`/conversations/${this.getConversationId()}/state`)}};var Z=class{constructor(e,t,n=!1){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem=null;this.wb=null;this.worldbook={get:async()=>this.isPreview?this.wb?Ye(this.wb):null:(await this.http.get(`/conversations/${this.getConversationId()}/worldbook`)).worldbook,update:async e=>{let t=typeof e=="string"?{content:e}:{...e};if(t.content!==void 0&&(t.content=(t.content??"").trim()),t.entries!==void 0&&(t.entries=yt(t.entries)),this.isPreview){let r=this.wb?.presets??[],i=t.enabledPresets?r.map(d=>({...d,enabled:t.enabledPresets.includes(d.id)})):r,s={content:t.content??this.wb?.content??"",entries:t.entries??this.wb?.entries??[],presets:i,updated_at:new Date().toISOString()};return this.wb=s,Ye(s)}return(await this.http.patch(`/conversations/${this.getConversationId()}/worldbook`,t)).worldbook}}}async get(){return this.isPreview?this.mem?{...this.mem}:null:(await this.http.get(`/conversations/${this.getConversationId()}/summary`)).ai_summary}async update(e){let t=(e??"").trim();if(this.isPreview){let r={content:t,updated_at:new Date().toISOString()};return this.mem=r,{...r}}return(await this.http.patch(`/conversations/${this.getConversationId()}/summary`,{content:t})).ai_summary}};function Ye(o){return{...o,entries:o.entries.map(e=>({...e,keys:[...e.keys]})),presets:(o.presets??[]).map(e=>({...e}))}}function yt(o){return(o??[]).flatMap(e=>{let t=(e?.content??"").trim(),n=[...new Set((e?.keys??[]).map(r=>(r??"").trim()).filter(r=>r!==""))];return!t||n.length===0?[]:[{id:e.id||Tt(),keys:n,content:t}]})}function Tt(){let o=globalThis.crypto;return o?.randomUUID?o.randomUUID():`ewr-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var Ie=60,Ee=1e3,ce=1e4,A=class{constructor(e,t=!1,n=()=>Date.now()){this.send=e;this.isPreview=t;this.now=n;this.lastNotifyAt=0;this.lastRefreshAt=0;this.lastRefreshMessagesAt=0}notify(e){let t=wt(e);if(!t)return!1;let n=this.now();return n-this.lastNotifyAt<Ee?!1:(this.lastNotifyAt=n,this.isPreview?(ee(t,"info"),!0):(this.send(T("host-notify",{text:t})),!0))}refreshPanel(e){if(this.isPreview)return!1;let t=this.now();return t-this.lastRefreshAt<ce?!1:(this.lastRefreshAt=t,this.send(T("host-state-changed",e?.length?{scope:e}:{})),!0)}refreshMessages(){if(this.isPreview)return!1;let e=this.now();return e-this.lastRefreshMessagesAt<ce?!1:(this.lastRefreshMessagesAt=e,this.send(T("host-messages-changed",{})),!0)}};function wt(o){return typeof o!="string"?"":o.replace(/\s+/g," ").trim().slice(0,Ie)}var Qe="/functions/v1/world-engine/v1",Ct="https://api.storvia.ai";function Rt(){return window.__STORVIA__||{}}function _t(o,e=3e4){let t=Rt();return t.apiBase?Promise.resolve(t):new Promise((n,r)=>{let i=setTimeout(()=>{s(),d(),r(new g("NOT_INITIALIZED","Timed out waiting for __STORVIA__ config from parent frame."))},e),s=o.on("init",a=>{a.payload?.apiBase&&c({apiBase:a.payload.apiBase,gameId:a.payload.gameId,conversationId:a.payload.conversationId,accessToken:a.payload.accessToken,selectedModelId:a.payload.selectedModelId,lang:a.payload.lang,debug:a.payload.debug})}),d=o.on("preview-init",a=>{a.payload?.apiBase&&c(a.payload)});function c(a){clearTimeout(i),s(),d();let l=window;l.__STORVIA__=a,n(a)}o.send(T("ready",{}))})}var ne=class{constructor(){this.baseUrl="";this.gameId="";this.conversationId="";this.modelId="";this.models=[];this.presetId="";this.accessToken="";this.initialized=!1;this.isPreview=!1;this.previewConfig=void 0}async init(){if(this.initialized)return;let e=window.flutter_inappwebview,t=typeof e?.callHandler=="function";this.bus=new x({incoming:window,outgoing:()=>t?null:window.parent,verifySource:t?l=>l.source===null||l.source===window:l=>l.source===window.parent,customSend:t?l=>e.callHandler("storviaBus",l):void 0}),Le(l=>this.bus.send(l));let n=await _t(this.bus),r=n.apiBase;if(!r)throw new g("NOT_INITIALIZED","window.__STORVIA__.apiBase is not set. The platform must inject it before SDK init.");if(this.baseUrl=`${r}${Qe}`,this.isPreview=!!n.preview,this.previewConfig=n.previewConfig,!n.gameId)throw new g("GAME_NOT_FOUND","window.__STORVIA__.gameId is not set. The platform must inject it before SDK init.");if(this.gameId=n.gameId,!n.accessToken)throw new g("UNAUTHORIZED","window.__STORVIA__.accessToken is not set. The platform must inject the user token before SDK init.");if(this.accessToken=n.accessToken,Ae(n.lang),this.http=new te(this.baseUrl,this.accessToken,!!n.debug),this.isPreview){this.conversationId="00000000-0000-0000-0000-000000000000",this.models=n.models??[],this.modelId=n.selectedModelId||this.models[0]?.id||"";let[l,u]=await Promise.all([this.fetchPreviewSnapshot(),this.modelId?Promise.resolve(null):this.fetchModels()]);u&&(this.models=u,this.modelId=u[0]?.id||""),this.presetId=n.presetId||"";let f=()=>this.gameId,m=()=>this.conversationId,h=()=>this.modelId,C=()=>this.models.find(I=>I.id===this.modelId)?.name,y=()=>this.presetId||void 0;this.chat=new V(this.http,f,m,h,!0,this.previewConfig,C,y),this.characters=new H(this.http,m,!0,l?.characters,l?.characterStates),this.relationships=new W(this.http,m,!0,l?.relationships),this.inventory=new B(this.http,m,!0,l?.inventory),this.world=new j(this.http,m,!0,l?.world),this.player=new K(this.http,m,!0,l?.player,l?.playerState),this.custom=new z(this.http,m,f,!0,l?.custom,l?.custom_inject),this.save=new Y(this.http,m,f,!0,l?.save_data),this.state=new Q(this.http,m,!0),this.memory=new Z(this.http,m,!0),this.host=new A(I=>this.bus.send(I),!0),this.initialized=!0,this.listenForPreviewMessages(),this.listenForTokenUpdate();return}if(!n.conversationId)throw new g("NOT_INITIALIZED","window.__STORVIA__.conversationId is not set. The platform must inject it before SDK init.");this.conversationId=n.conversationId,this.modelId=n.selectedModelId||"",this.modelId||(this.models=await this.fetchModels(),this.modelId=this.models[0]?.id||""),this.presetId=n.presetId||"";let i=()=>this.gameId,s=()=>this.conversationId,d=()=>this.modelId,c=()=>this.models.find(l=>l.id===this.modelId)?.name,a=()=>this.presetId||void 0;this.chat=new V(this.http,i,s,d,!1,void 0,c,a),this.characters=new H(this.http,s),this.relationships=new W(this.http,s),this.inventory=new B(this.http,s),this.world=new j(this.http,s),this.player=new K(this.http,s),this.custom=new z(this.http,s,i),this.save=new Y(this.http,s,i),this.state=new Q(this.http,s),this.memory=new Z(this.http,s),this.host=new A(l=>this.bus.send(l),!1),this.listenForTokenUpdate(),this.listenForModelChange(),this.initialized=!0}listenForModelChange(){this.bus.on("set-model",e=>{let t=e.payload?.modelId||"";t&&(this.modelId=t)}),this.bus.on("set-preset",e=>{this.presetId=e.payload?.presetId||""})}listenForTokenUpdate(){this.bus.on("token-update",e=>{let t=e.payload?.accessToken;typeof t!="string"||!t||(this.accessToken=t,this.http?.setToken(t))})}listenForPreviewMessages(){this.bus.on("set-model",e=>{this.modelId=e.payload.modelId||""}),this.bus.on("set-preset",e=>{this.presetId=e.payload?.presetId||""}),this.bus.on("config-update",e=>{this.previewConfig=e.payload.previewConfig,this.chat&&this.chat.updatePreviewConfig(this.previewConfig),this.refreshPreviewSnapshot().catch(t=>{console.warn("[Storvia SDK] refreshPreviewSnapshot failed:",t)})})}async fetchPreviewSnapshot(){try{let e={game_id:this.gameId};return this.previewConfig&&("game_config"in this.previewConfig&&(e.game_config=this.previewConfig.game_config),"game_state"in this.previewConfig&&(e.game_state_override=this.previewConfig.game_state)),await this.http.post("/preview/initial-snapshot",e)}catch(e){return console.warn("[Storvia SDK] fetchPreviewSnapshot failed:",e),null}}async refreshPreviewSnapshot(){let e=await this.fetchPreviewSnapshot();e&&(this.characters?.setInitial(e.characters,e.characterStates),this.player?.setInitial(e.player,e.playerState),this.inventory?.setInitial(e.inventory),this.relationships?.setInitial(e.relationships),this.world?.setInitial(e.world),this.custom?.setInitial(e.custom,e.custom_inject),this.save?.setInitial(e.save_data))}async fetchModels(){try{return await this.http.get("/models")}catch{}return[]}async initDev(e){if(this.initialized)return;this.baseUrl=`${Ct}${Qe}`,this.gameId=e.gameId,this.isPreview=!0,this.http=new te(this.baseUrl,"",!1,e.apiKey);let[t,n]=await Promise.all([this.fetchModels(),this.fetchPreviewSnapshot()]);this.models=t;let r=e.model?t.find(l=>l.name===e.model)?.id??"":"";this.modelId=r||t[0]?.id||"",this.conversationId="00000000-0000-0000-0000-000000000000";let i=()=>this.gameId,s=()=>this.conversationId,d=()=>this.modelId,c=()=>this.models.find(l=>l.id===this.modelId)?.name;this.presetId=e.preset||"";let a=()=>this.presetId||void 0;this.chat=new V(this.http,i,s,d,!0,void 0,c,a),this.characters=new H(this.http,s,!0,n?.characters,n?.characterStates),this.relationships=new W(this.http,s,!0,n?.relationships),this.inventory=new B(this.http,s,!0,n?.inventory),this.world=new j(this.http,s,!0,n?.world),this.player=new K(this.http,s,!0,n?.player,n?.playerState),this.custom=new z(this.http,s,i,!0,n?.custom,n?.custom_inject),this.save=new Y(this.http,s,i,!0,n?.save_data),this.state=new Q(this.http,s,!0),this.memory=new Z(this.http,s,!0),this.host=new A(()=>{},!0),this.initialized=!0}async getAssets(e,t){let n={asset_type:e};return t&&(n.category=t),(await this.http.get("/assets",n)).map(i=>({id:i.id,name:i.name,url:i.url,assetType:i.asset_type,category:i.category}))}};async function Ze(o){ke();let e=new ne;return o?.dev?await e.initDev(o.dev):await e.init(),e}function ye(o){return typeof o=="object"&&o!==null&&"value"in o&&"type"in o&&(o.type==="number"||o.type==="text")}function Xe(o){return ye(o)?o.value:o}0&&(module.exports={HOST_NOTIFY_MAX_LENGTH,HOST_NOTIFY_MIN_INTERVAL_MS,HOST_PANEL_SCOPES,HOST_REFRESH_MIN_INTERVAL_MS,HostModule,MAIN_CHAT_TOPIC,PROTOCOL_VERSION,StorviaBus,StorviaError,StorviaSDK,createStorviaSDK,envelope,extractFieldValue,isProtocolEnvelope,isRichFieldValue,setToastEnabled,showToast});
package/dist/index.d.mts CHANGED
@@ -11,8 +11,8 @@ interface ExtendWorldRuleEntry {
11
11
  keys: string[];
12
12
  content: string;
13
13
  }
14
- /** 作者预设(创作台「世界书」)在玩家侧的形状:只有标题 / 简介 / 开关,正文永不下发 */
15
- interface AuthorPresetView {
14
+ /** 预设世界书(创作台「世界书」)在玩家侧的形状:只有标题 / 简介 / 开关,正文永不下发 */
15
+ interface PresetWorldbookView {
16
16
  id: string;
17
17
  title: string;
18
18
  description: string;
@@ -20,12 +20,12 @@ interface AuthorPresetView {
20
20
  }
21
21
  /**
22
22
  * 世界书:content 常驻(每轮注入 <CustomRules>)+ entries 关键词触发(命中才注入 <ExtendWorldRules>)
23
- * + presets 作者预设清单(开启的无条件注入 <ExtendWorldRules>)
23
+ * + presets 预设世界书清单(开启的无条件注入 <ExtendWorldRules>)
24
24
  */
25
25
  interface Worldbook {
26
26
  content: string;
27
27
  entries: ExtendWorldRuleEntry[];
28
- presets: AuthorPresetView[];
28
+ presets: PresetWorldbookView[];
29
29
  /** ISO 时间戳;从未设置过为 null */
30
30
  updated_at: string | null;
31
31
  }
@@ -33,7 +33,7 @@ interface Worldbook {
33
33
  interface WorldbookPatch {
34
34
  content?: string;
35
35
  entries?: ExtendWorldRuleEntry[];
36
- /** 玩家开启的作者预设 id 列表(整体替换;不在作品清单里的 id 会被服务端丢弃) */
36
+ /** 玩家开启的预设世界书 id 列表(整体替换;不在作品清单里的 id 会被服务端丢弃) */
37
37
  enabledPresets?: string[];
38
38
  }
39
39
  interface AssetItem {
@@ -984,7 +984,7 @@ declare class StateModule {
984
984
  * - worldbook.get / worldbook.update:世界书,分两档——
985
985
  * content:常驻,每轮注入 <CustomRules>,当「必须遵循的规则 / 设定」用
986
986
  * entries:关键词触发,任一关键词命中「本轮输入 + 上一轮 AI 回复」才注入 <ExtendWorldRules>
987
- * presets:作者预设清单(作品作者写的可选设定,玩家只看到标题 / 简介),用 enabledPresets 按条开启
987
+ * presets:预设世界书清单(作品作者写的可选设定,玩家只看到标题 / 简介),用 enabledPresets 按条开启
988
988
  * update 是部分更新:传字符串 = 只改 content;传对象只改传了的键,没传的保留原值
989
989
  *
990
990
  * 预览模式下保存在 SDK 内存中,不打后端。
@@ -1396,4 +1396,4 @@ interface ToastAction {
1396
1396
  */
1397
1397
  declare function showToast(message: string, type?: ToastType, duration?: number, action?: ToastAction): void;
1398
1398
 
1399
- export { type AISummary, type AckPayload, type AssetItem, type AuthorPresetView, type CharacterAddOptions, type CharacterDetail, type CharacterPersona, type CharacterUpdateOptions, type ChatAbortInfo, type ChatAbortedCallback, type ChatCancelOptions, type ChatCancelResult, type ChatContinueOptions, type ChatDoneCallback, type ChatDoneInfo, type ChatGenerateOptions, type ChatMessage, type ChatMessageCursor, type ChatMessagesOptions, type ChatMessagesResponse, type ChatReconnectingCallback, type ChatResponse, type ChatResumeOptions, type ChatRetryOptions, type ChatSaveOptions, type ChatSendOptions, type ChatStateCallback, type ConfigUpdatePayload, type CurrentState, type DormantState, type DownstreamMsg, type ExtendWorldRuleEntry, type FieldValue, type Gender, HOST_NOTIFY_MAX_LENGTH, HOST_NOTIFY_MIN_INTERVAL_MS, HOST_PANEL_SCOPES, HOST_REFRESH_MIN_INTERVAL_MS, type HostMessagesChangedPayload, HostModule, type HostNotifyPayload, type HostPanelScope, type HostStateChangedPayload, type InitPayload, type InventoryAddOptions, type InventoryMoveOptions, type InventoryRemoveGroupOptions, type InventoryRemoveOptions, type InventoryState, type InventoryUpdateOptions, type ItemData, MAIN_CHAT_TOPIC, type OrientationPayload, PROTOCOL_VERSION, type PlayerPersona, type PreviewConfig, type PreviewInitPayload, type ProtocolEnvelope, type ReadyPayload, type Relationship, type RichFieldValue, type SdkErrorPayload, type SetModelPayload, type State, type StateChanges, StorviaBus, type StorviaBusOptions, StorviaError, type StorviaErrorCode, StorviaSDK, type TokenUpdatePayload, type UpstreamMsg, type Worldbook, type WorldbookPatch, createStorviaSDK, envelope, extractFieldValue, isProtocolEnvelope, isRichFieldValue, setToastEnabled, showToast };
1399
+ export { type AISummary, type AckPayload, type AssetItem, type CharacterAddOptions, type CharacterDetail, type CharacterPersona, type CharacterUpdateOptions, type ChatAbortInfo, type ChatAbortedCallback, type ChatCancelOptions, type ChatCancelResult, type ChatContinueOptions, type ChatDoneCallback, type ChatDoneInfo, type ChatGenerateOptions, type ChatMessage, type ChatMessageCursor, type ChatMessagesOptions, type ChatMessagesResponse, type ChatReconnectingCallback, type ChatResponse, type ChatResumeOptions, type ChatRetryOptions, type ChatSaveOptions, type ChatSendOptions, type ChatStateCallback, type ConfigUpdatePayload, type CurrentState, type DormantState, type DownstreamMsg, type ExtendWorldRuleEntry, type FieldValue, type Gender, HOST_NOTIFY_MAX_LENGTH, HOST_NOTIFY_MIN_INTERVAL_MS, HOST_PANEL_SCOPES, HOST_REFRESH_MIN_INTERVAL_MS, type HostMessagesChangedPayload, HostModule, type HostNotifyPayload, type HostPanelScope, type HostStateChangedPayload, type InitPayload, type InventoryAddOptions, type InventoryMoveOptions, type InventoryRemoveGroupOptions, type InventoryRemoveOptions, type InventoryState, type InventoryUpdateOptions, type ItemData, MAIN_CHAT_TOPIC, type OrientationPayload, PROTOCOL_VERSION, type PlayerPersona, type PresetWorldbookView, type PreviewConfig, type PreviewInitPayload, type ProtocolEnvelope, type ReadyPayload, type Relationship, type RichFieldValue, type SdkErrorPayload, type SetModelPayload, type State, type StateChanges, StorviaBus, type StorviaBusOptions, StorviaError, type StorviaErrorCode, StorviaSDK, type TokenUpdatePayload, type UpstreamMsg, type Worldbook, type WorldbookPatch, createStorviaSDK, envelope, extractFieldValue, isProtocolEnvelope, isRichFieldValue, setToastEnabled, showToast };
package/dist/index.esm.js CHANGED
@@ -117,6 +117,6 @@ var g=class extends Error{constructor(e,t,n){super(t),this.name="StorviaError",t
117
117
  `,nt={success:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>',error:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>',warning:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>',info:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg>'},Me=!0;function rt(o){Me=o}function ot(){if(typeof document>"u")return null;let o=document.getElementById(se);if(!o){if(!document.getElementById(Ne)){let e=document.createElement("style");e.id=Ne,e.textContent=tt,document.head.appendChild(e)}o=document.createElement("div"),o.id=se,document.body.appendChild(o)}return o}function ae(o,e="info",t=3500,n){if(!Me)return;let r=ot();if(!r)return;let i=t<=0,s=document.createElement("div");s.className=`storvia-toast ${e}`,s.innerHTML=`
118
118
  <span class="storvia-toast-icon">${nt[e]}</span>
119
119
  <span class="storvia-toast-msg"></span>
120
- `;let d=s.querySelector(".storvia-toast-msg");d&&(d.textContent=o);let c=()=>{s.isConnected&&(s.classList.add("leaving"),s.classList.remove("show"),setTimeout(()=>s.remove(),320))};if(n){let a=document.createElement("button");a.type="button",a.className="storvia-toast-action",a.textContent=n.label,a.addEventListener("click",()=>{try{n.onClick()}catch(l){console.error("[Storvia toast] action error:",l)}c()}),s.appendChild(a)}if(i){let a=document.createElement("button");a.type="button",a.className="storvia-toast-close",a.setAttribute("aria-label",ie("close")),a.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',a.addEventListener("click",c),s.appendChild(a)}r.appendChild(s),requestAnimationFrame(()=>s.classList.add("show")),i||setTimeout(c,t)}function it(o){let e=o.filter(t=>t).map(t=>`\u300C${t}\u300D`).join("");return ie("violationWords").replace("{words}",e)}var st=3e3,Ae={};function ke(o){let e=Date.now();if(!(e-(Ae[o]??0)<st)){if(Ae[o]=e,!le){console.warn(`[Storvia] navigate \u2192 wallet(${o})\uFF1A\u5F53\u524D\u672A\u68C0\u6D4B\u5230\u5BBF\u4E3B\uFF08dev \u6A21\u5F0F\uFF09\uFF0C\u751F\u4EA7\u73AF\u5883\u7531\u5BBF\u4E3B\u5F39\u5145\u503C\u5F15\u5BFC / \u8DF3\u94B1\u5305\u9875\u3002`);return}try{le(C("navigate",{target:"wallet",reason:o}))}catch(t){console.error("[Storvia] navigate \u2192 wallet \u901A\u8FC7 bus \u53D1\u9001\u5931\u8D25:",t)}}}function S(o,e,t){if(o==="GENERATION_ABORTED")return;if(o==="INSUFFICIENT_CREDITS")return ke("insufficient_credits");if(o==="DAISY_CARD_REQUIRED")return ke("daisy_card_required");let n=o==="VIOLATION_WORD_DETECTED"&&t?.length?it(t):be(o)||e||ie("unknownError");ae(n,o==="RATE_LIMITED"?"warning":"error")}function at(o,e){let t=e?.tickMs??100,n=e?.baseLagMs??1e3,r=e?.maxLagMs??2500,i=e?.minCharsPerTick??2,s="",d=null,c=0,a=0,l=()=>Math.min(r,Math.max(n,c*1.35)),u=()=>{let y=Math.max(i,Math.ceil(s.length*t/l()));if(y>=s.length)y=s.length;else{let R=s.charCodeAt(y-1);R>=55296&&R<=56319&&y++}let I=s.slice(0,y);s=s.slice(y),I&&o(I)},f=()=>{d=null,u(),s&&(d=setTimeout(f,t))};return{push:y=>{let I=Date.now();if(a>0){let R=Math.min(I-a,r);c=c>0?c*.7+R*.3:R}a=I,s+=y,d===null&&f()},flush:()=>{d!==null&&(clearTimeout(d),d=null),s&&(o(s),s="")},cancel:()=>{d!==null&&(clearTimeout(d),d=null),s=""}}}function he(o){let e=at(o.onChunk);return{cbs:{onChunk:n=>e.push(n),onDone:(n,r)=>{e.flush(),o.onDone(n,r)},onAborted:o.onAborted?n=>{e.flush(),o.onAborted(n)}:void 0,onState:o.onState?(n,r)=>{e.flush(),o.onState(n,r)}:void 0,onThinking:o.onThinking?n=>{e.flush(),o.onThinking(n)}:void 0,onCreatedCharacters:o.onCreatedCharacters?n=>{e.flush(),o.onCreatedCharacters(n)}:void 0,onReconnect:o.onReconnect},flush:()=>e.flush()}}var xe="0.10.5";function $(o,e){if(e.aborted){if(o.onAborted){o.onAborted(e.aborted);return}o.onDone(e.aborted.id,{truncated:!1});return}o.onDone(e.messageId,e.truncated===void 0?void 0:{truncated:e.truncated})}var T=class T{constructor(e,t,n=!1,r=""){this.baseUrl=e,this.token=t,this.debug=n,this.devApiKey=r}setToken(e){this.token=e}setDebug(e){this.debug=e}maybeShowNetworkToast(e){e instanceof g||S("NETWORK_ERROR")}wrapAbortError(e){if(e instanceof DOMException&&e.name==="AbortError"){let t=new g("REQUEST_TIMEOUT","Request timed out");return S("REQUEST_TIMEOUT"),t}return e}createTimeoutController(){let e=new AbortController,t=setTimeout(()=>e.abort(),T.REQUEST_TIMEOUT);return{controller:e,clear:()=>clearTimeout(t)}}buildHeaders(){let e={"Content-Type":"application/json"};return this.token&&(e.Authorization=`Bearer ${this.token}`),this.devApiKey&&(e["x-api-key"]=this.devApiKey),e["x-client-info"]=`storvia-sdk/${xe}`,e}log(e){if(!this.debug)return;let{method:t,path:n,body:r,status:i,rawResponse:s,parsedData:d,error:c,durationMs:a,modelName:l}=e,u="%c[Storvia SDK]",f="color: #6366f1; font-weight: bold",m=a!==void 0?` (${a}ms)`:"",h=i!==void 0?` [${i}]`:"",w=l?` [model: ${l}]`:"";c?(console.groupCollapsed(`${u} %c${t} ${n}${h}${w}${m} %c\u2717`,f,"color: #e0e0e0","color: #ef4444"),r!==void 0&&console.log("Request:",r),s!==void 0&&console.log("Response (raw):",s),console.error("Error:",c),console.groupEnd()):(console.groupCollapsed(`${u} %c${t} ${n}${h}${w}${m} %c\u2713`,f,"color: #e0e0e0","color: #22c55e"),r!==void 0&&console.log("Request:",r),s!==void 0&&console.log("Response (raw):",s),d!==void 0&&d!==s&&console.log("Response (data):",d),console.groupEnd())}async get(e,t){let n=new URL(`${this.baseUrl}${e}`);t&&Object.entries(t).forEach(([a,l])=>n.searchParams.set(a,l));let r=Date.now(),i,s,{controller:d,clear:c}=this.createTimeoutController();try{let a=await fetch(n.toString(),{method:"GET",headers:this.buildHeaders(),signal:d.signal});c(),i=a.status;let{raw:l,data:u}=await this.handleResponseWithRaw(a);return s=l,this.log({method:"GET",path:e,body:t,status:i,rawResponse:s,parsedData:u,durationMs:Date.now()-r}),u}catch(a){c();let l=this.wrapAbortError(a);throw this.log({method:"GET",path:e,body:t,status:i,rawResponse:s,error:l,durationMs:Date.now()-r}),l===a&&this.maybeShowNetworkToast(a),l}}async post(e,t,n){let r=Date.now(),i,s,{controller:d,clear:c}=this.createTimeoutController();try{let a=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:d.signal});c(),i=a.status;let{raw:l,data:u}=await this.handleResponseWithRaw(a);return s=l,this.log({method:"POST",path:e,body:t,status:i,rawResponse:s,parsedData:u,durationMs:Date.now()-r,modelName:n?.modelName}),u}catch(a){c();let l=this.wrapAbortError(a);throw this.log({method:"POST",path:e,body:t,status:i,rawResponse:s,error:l,durationMs:Date.now()-r,modelName:n?.modelName}),l===a&&this.maybeShowNetworkToast(a),l}}async patch(e,t){let n=Date.now(),r,i,{controller:s,clear:d}=this.createTimeoutController();try{let c=await fetch(`${this.baseUrl}${e}`,{method:"PATCH",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:s.signal});d(),r=c.status;let{raw:a,data:l}=await this.handleResponseWithRaw(c);return i=a,this.log({method:"PATCH",path:e,body:t,status:r,rawResponse:i,parsedData:l,durationMs:Date.now()-n}),l}catch(c){d();let a=this.wrapAbortError(c);throw this.log({method:"PATCH",path:e,body:t,status:r,rawResponse:i,error:a,durationMs:Date.now()-n}),a===c&&this.maybeShowNetworkToast(c),a}}async put(e,t){let n=Date.now(),r,i,{controller:s,clear:d}=this.createTimeoutController();try{let c=await fetch(`${this.baseUrl}${e}`,{method:"PUT",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:s.signal});d(),r=c.status;let{raw:a,data:l}=await this.handleResponseWithRaw(c);return i=a,this.log({method:"PUT",path:e,body:t,status:r,rawResponse:i,parsedData:l,durationMs:Date.now()-n}),l}catch(c){d();let a=this.wrapAbortError(c);throw this.log({method:"PUT",path:e,body:t,status:r,rawResponse:i,error:a,durationMs:Date.now()-n}),a===c&&this.maybeShowNetworkToast(c),a}}async delete(e){let t=Date.now(),n,r,{controller:i,clear:s}=this.createTimeoutController();try{let d=await fetch(`${this.baseUrl}${e}`,{method:"DELETE",headers:this.buildHeaders(),signal:i.signal});s(),n=d.status;let{raw:c,data:a}=await this.handleResponseWithRaw(d);return r=c,this.log({method:"DELETE",path:e,status:n,rawResponse:r,parsedData:a,durationMs:Date.now()-t}),a}catch(d){s();let c=this.wrapAbortError(d);throw this.log({method:"DELETE",path:e,status:n,rawResponse:r,error:c,durationMs:Date.now()-t}),c===d&&this.maybeShowNetworkToast(d),c}}async stream(e,t,n,r,i,s,d,c,a,l,u,f){let m=Date.now(),h=i?.modelName?` [model: ${i.modelName}]`:"",w=[],y=E=>{this.debug&&w.push({t:Date.now()-m,event:E})},{cbs:I,flush:R}=he({onChunk:n,onDone:r,onState:s,onThinking:d,onCreatedCharacters:c,onReconnect:l,onAborted:u,onBase:f}),fe=new AbortController,A=null,_=null,N=null,k=()=>{A!==null&&(clearTimeout(A),A=null),_!==null&&(clearTimeout(_),_=null)},ve=E=>{N=E,k(),fe.abort()};A=setTimeout(()=>ve("REQUEST_TIMEOUT"),T.REQUEST_TIMEOUT);let O;try{O=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t),signal:fe.signal})}catch(E){if(k(),N){let v=new g(N,"Request timed out");throw S(N),this.log({method:"STREAM",path:e,body:t,error:v,durationMs:Date.now()-m,modelName:i?.modelName}),v}throw this.maybeShowNetworkToast(E),E}if(A!==null&&(clearTimeout(A),A=null),!O.ok){k();let E=await O.text().catch(()=>""),v={};try{v=JSON.parse(E)}catch{}let b=v.code||"INTERNAL_ERROR",p=v.message||v.error||v.details,we=Array.isArray(v.matched_words)?v.matched_words:void 0,Ce=new g(b,p||`HTTP ${O.status}`,we);throw S(b,p,we),this.log({method:"STREAM",path:e,body:t,status:O.status,rawResponse:E,error:Ce,durationMs:Date.now()-m,modelName:i?.modelName}),Ce}let Ie=O.body?.getReader();if(!Ie)throw k(),new g("INTERNAL_ERROR","No response body for stream");_=setTimeout(()=>ve("MODEL_LOADING_TIMEOUT"),T.INITIAL_TIMEOUT);let Ee=new TextDecoder,Z="",ce,ee,D="",te,ne,x="",U=!1,P=null,ye=E=>{if(U)return;let v=E.endsWith("\r")?E.slice(0,-1):E;if(v.startsWith("id: ")){ne=v.slice(4);return}if(!v.startsWith("data: "))return;let b=v.slice(6);if(b==="[DONE]"){y("[DONE]"),U=!0;return}try{let p=JSON.parse(b);y(p),p.type==="done"&&p.id?(Z=p.id,ce=p.truncated===!0):p.type==="aborted"?(ee={id:typeof p.id=="string"?p.id:"",persisted:p.persisted===!0},U=!0):p.type==="error"?(P=new g(p.code||"INTERNAL_ERROR",p.message||"Generation failed",Array.isArray(p.matched_words)?p.matched_words:void 0),U=!0):p.type==="state"?(I.onState?.(p.delta,p.full??null),Array.isArray(p.createdNames)&&p.createdNames.length&&I.onCreatedCharacters?.(p.createdNames)):p.type==="start"?(_!==null&&(clearTimeout(_),_=null),typeof p.base_content=="string"&&f?.(p.base_content)):p.type==="thinking"?(p.status==="start"||p.status==="end")&&I.onThinking?.(p.status):p.content&&(_!==null&&(clearTimeout(_),_=null),D+=p.content,I.onChunk(p.content))}catch{y({raw:b})}ne!==void 0&&(te=ne,ne=void 0)},Te=()=>{if(k(),P)throw R(),S(P.code,P.message,P.matchedWords),this.log({method:"STREAM",path:e,body:t,error:P,durationMs:Date.now()-m,modelName:i?.modelName}),P;this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${O.status}]${h} (${Date.now()-m}ms) %c\u2713`,"color: #6366f1; font-weight: bold","color: #e0e0e0","color: #22c55e"),console.log("Request:",t),console.log(`Accumulated content (${D.length} chars):`,D),console.log("Message ID:",Z),ee&&console.log("Aborted:",ee),console.log(`SSE events (${w.length}):`,w),console.groupEnd()),$(I,{messageId:Z,truncated:ce,aborted:ee})};try{for(;;){let{done:E,value:v}=await Ie.read();if(E)break;x+=Ee.decode(v,{stream:!0});let b=x.split(`
120
+ `;let d=s.querySelector(".storvia-toast-msg");d&&(d.textContent=o);let c=()=>{s.isConnected&&(s.classList.add("leaving"),s.classList.remove("show"),setTimeout(()=>s.remove(),320))};if(n){let a=document.createElement("button");a.type="button",a.className="storvia-toast-action",a.textContent=n.label,a.addEventListener("click",()=>{try{n.onClick()}catch(l){console.error("[Storvia toast] action error:",l)}c()}),s.appendChild(a)}if(i){let a=document.createElement("button");a.type="button",a.className="storvia-toast-close",a.setAttribute("aria-label",ie("close")),a.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',a.addEventListener("click",c),s.appendChild(a)}r.appendChild(s),requestAnimationFrame(()=>s.classList.add("show")),i||setTimeout(c,t)}function it(o){let e=o.filter(t=>t).map(t=>`\u300C${t}\u300D`).join("");return ie("violationWords").replace("{words}",e)}var st=3e3,Ae={};function ke(o){let e=Date.now();if(!(e-(Ae[o]??0)<st)){if(Ae[o]=e,!le){console.warn(`[Storvia] navigate \u2192 wallet(${o})\uFF1A\u5F53\u524D\u672A\u68C0\u6D4B\u5230\u5BBF\u4E3B\uFF08dev \u6A21\u5F0F\uFF09\uFF0C\u751F\u4EA7\u73AF\u5883\u7531\u5BBF\u4E3B\u5F39\u5145\u503C\u5F15\u5BFC / \u8DF3\u94B1\u5305\u9875\u3002`);return}try{le(C("navigate",{target:"wallet",reason:o}))}catch(t){console.error("[Storvia] navigate \u2192 wallet \u901A\u8FC7 bus \u53D1\u9001\u5931\u8D25:",t)}}}function S(o,e,t){if(o==="GENERATION_ABORTED")return;if(o==="INSUFFICIENT_CREDITS")return ke("insufficient_credits");if(o==="DAISY_CARD_REQUIRED")return ke("daisy_card_required");let n=o==="VIOLATION_WORD_DETECTED"&&t?.length?it(t):be(o)||e||ie("unknownError");ae(n,o==="RATE_LIMITED"?"warning":"error")}function at(o,e){let t=e?.tickMs??100,n=e?.baseLagMs??1e3,r=e?.maxLagMs??2500,i=e?.minCharsPerTick??2,s="",d=null,c=0,a=0,l=()=>Math.min(r,Math.max(n,c*1.35)),u=()=>{let y=Math.max(i,Math.ceil(s.length*t/l()));if(y>=s.length)y=s.length;else{let R=s.charCodeAt(y-1);R>=55296&&R<=56319&&y++}let I=s.slice(0,y);s=s.slice(y),I&&o(I)},f=()=>{d=null,u(),s&&(d=setTimeout(f,t))};return{push:y=>{let I=Date.now();if(a>0){let R=Math.min(I-a,r);c=c>0?c*.7+R*.3:R}a=I,s+=y,d===null&&f()},flush:()=>{d!==null&&(clearTimeout(d),d=null),s&&(o(s),s="")},cancel:()=>{d!==null&&(clearTimeout(d),d=null),s=""}}}function he(o){let e=at(o.onChunk);return{cbs:{onChunk:n=>e.push(n),onDone:(n,r)=>{e.flush(),o.onDone(n,r)},onAborted:o.onAborted?n=>{e.flush(),o.onAborted(n)}:void 0,onState:o.onState?(n,r)=>{e.flush(),o.onState(n,r)}:void 0,onThinking:o.onThinking?n=>{e.flush(),o.onThinking(n)}:void 0,onCreatedCharacters:o.onCreatedCharacters?n=>{e.flush(),o.onCreatedCharacters(n)}:void 0,onReconnect:o.onReconnect},flush:()=>e.flush()}}var xe="0.10.6";function $(o,e){if(e.aborted){if(o.onAborted){o.onAborted(e.aborted);return}o.onDone(e.aborted.id,{truncated:!1});return}o.onDone(e.messageId,e.truncated===void 0?void 0:{truncated:e.truncated})}var T=class T{constructor(e,t,n=!1,r=""){this.baseUrl=e,this.token=t,this.debug=n,this.devApiKey=r}setToken(e){this.token=e}setDebug(e){this.debug=e}maybeShowNetworkToast(e){e instanceof g||S("NETWORK_ERROR")}wrapAbortError(e){if(e instanceof DOMException&&e.name==="AbortError"){let t=new g("REQUEST_TIMEOUT","Request timed out");return S("REQUEST_TIMEOUT"),t}return e}createTimeoutController(){let e=new AbortController,t=setTimeout(()=>e.abort(),T.REQUEST_TIMEOUT);return{controller:e,clear:()=>clearTimeout(t)}}buildHeaders(){let e={"Content-Type":"application/json"};return this.token&&(e.Authorization=`Bearer ${this.token}`),this.devApiKey&&(e["x-api-key"]=this.devApiKey),e["x-client-info"]=`storvia-sdk/${xe}`,e}log(e){if(!this.debug)return;let{method:t,path:n,body:r,status:i,rawResponse:s,parsedData:d,error:c,durationMs:a,modelName:l}=e,u="%c[Storvia SDK]",f="color: #6366f1; font-weight: bold",m=a!==void 0?` (${a}ms)`:"",h=i!==void 0?` [${i}]`:"",w=l?` [model: ${l}]`:"";c?(console.groupCollapsed(`${u} %c${t} ${n}${h}${w}${m} %c\u2717`,f,"color: #e0e0e0","color: #ef4444"),r!==void 0&&console.log("Request:",r),s!==void 0&&console.log("Response (raw):",s),console.error("Error:",c),console.groupEnd()):(console.groupCollapsed(`${u} %c${t} ${n}${h}${w}${m} %c\u2713`,f,"color: #e0e0e0","color: #22c55e"),r!==void 0&&console.log("Request:",r),s!==void 0&&console.log("Response (raw):",s),d!==void 0&&d!==s&&console.log("Response (data):",d),console.groupEnd())}async get(e,t){let n=new URL(`${this.baseUrl}${e}`);t&&Object.entries(t).forEach(([a,l])=>n.searchParams.set(a,l));let r=Date.now(),i,s,{controller:d,clear:c}=this.createTimeoutController();try{let a=await fetch(n.toString(),{method:"GET",headers:this.buildHeaders(),signal:d.signal});c(),i=a.status;let{raw:l,data:u}=await this.handleResponseWithRaw(a);return s=l,this.log({method:"GET",path:e,body:t,status:i,rawResponse:s,parsedData:u,durationMs:Date.now()-r}),u}catch(a){c();let l=this.wrapAbortError(a);throw this.log({method:"GET",path:e,body:t,status:i,rawResponse:s,error:l,durationMs:Date.now()-r}),l===a&&this.maybeShowNetworkToast(a),l}}async post(e,t,n){let r=Date.now(),i,s,{controller:d,clear:c}=this.createTimeoutController();try{let a=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:d.signal});c(),i=a.status;let{raw:l,data:u}=await this.handleResponseWithRaw(a);return s=l,this.log({method:"POST",path:e,body:t,status:i,rawResponse:s,parsedData:u,durationMs:Date.now()-r,modelName:n?.modelName}),u}catch(a){c();let l=this.wrapAbortError(a);throw this.log({method:"POST",path:e,body:t,status:i,rawResponse:s,error:l,durationMs:Date.now()-r,modelName:n?.modelName}),l===a&&this.maybeShowNetworkToast(a),l}}async patch(e,t){let n=Date.now(),r,i,{controller:s,clear:d}=this.createTimeoutController();try{let c=await fetch(`${this.baseUrl}${e}`,{method:"PATCH",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:s.signal});d(),r=c.status;let{raw:a,data:l}=await this.handleResponseWithRaw(c);return i=a,this.log({method:"PATCH",path:e,body:t,status:r,rawResponse:i,parsedData:l,durationMs:Date.now()-n}),l}catch(c){d();let a=this.wrapAbortError(c);throw this.log({method:"PATCH",path:e,body:t,status:r,rawResponse:i,error:a,durationMs:Date.now()-n}),a===c&&this.maybeShowNetworkToast(c),a}}async put(e,t){let n=Date.now(),r,i,{controller:s,clear:d}=this.createTimeoutController();try{let c=await fetch(`${this.baseUrl}${e}`,{method:"PUT",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:s.signal});d(),r=c.status;let{raw:a,data:l}=await this.handleResponseWithRaw(c);return i=a,this.log({method:"PUT",path:e,body:t,status:r,rawResponse:i,parsedData:l,durationMs:Date.now()-n}),l}catch(c){d();let a=this.wrapAbortError(c);throw this.log({method:"PUT",path:e,body:t,status:r,rawResponse:i,error:a,durationMs:Date.now()-n}),a===c&&this.maybeShowNetworkToast(c),a}}async delete(e){let t=Date.now(),n,r,{controller:i,clear:s}=this.createTimeoutController();try{let d=await fetch(`${this.baseUrl}${e}`,{method:"DELETE",headers:this.buildHeaders(),signal:i.signal});s(),n=d.status;let{raw:c,data:a}=await this.handleResponseWithRaw(d);return r=c,this.log({method:"DELETE",path:e,status:n,rawResponse:r,parsedData:a,durationMs:Date.now()-t}),a}catch(d){s();let c=this.wrapAbortError(d);throw this.log({method:"DELETE",path:e,status:n,rawResponse:r,error:c,durationMs:Date.now()-t}),c===d&&this.maybeShowNetworkToast(d),c}}async stream(e,t,n,r,i,s,d,c,a,l,u,f){let m=Date.now(),h=i?.modelName?` [model: ${i.modelName}]`:"",w=[],y=E=>{this.debug&&w.push({t:Date.now()-m,event:E})},{cbs:I,flush:R}=he({onChunk:n,onDone:r,onState:s,onThinking:d,onCreatedCharacters:c,onReconnect:l,onAborted:u,onBase:f}),fe=new AbortController,A=null,_=null,N=null,k=()=>{A!==null&&(clearTimeout(A),A=null),_!==null&&(clearTimeout(_),_=null)},ve=E=>{N=E,k(),fe.abort()};A=setTimeout(()=>ve("REQUEST_TIMEOUT"),T.REQUEST_TIMEOUT);let O;try{O=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t),signal:fe.signal})}catch(E){if(k(),N){let v=new g(N,"Request timed out");throw S(N),this.log({method:"STREAM",path:e,body:t,error:v,durationMs:Date.now()-m,modelName:i?.modelName}),v}throw this.maybeShowNetworkToast(E),E}if(A!==null&&(clearTimeout(A),A=null),!O.ok){k();let E=await O.text().catch(()=>""),v={};try{v=JSON.parse(E)}catch{}let b=v.code||"INTERNAL_ERROR",p=v.message||v.error||v.details,we=Array.isArray(v.matched_words)?v.matched_words:void 0,Ce=new g(b,p||`HTTP ${O.status}`,we);throw S(b,p,we),this.log({method:"STREAM",path:e,body:t,status:O.status,rawResponse:E,error:Ce,durationMs:Date.now()-m,modelName:i?.modelName}),Ce}let Ie=O.body?.getReader();if(!Ie)throw k(),new g("INTERNAL_ERROR","No response body for stream");_=setTimeout(()=>ve("MODEL_LOADING_TIMEOUT"),T.INITIAL_TIMEOUT);let Ee=new TextDecoder,Z="",ce,ee,D="",te,ne,x="",U=!1,P=null,ye=E=>{if(U)return;let v=E.endsWith("\r")?E.slice(0,-1):E;if(v.startsWith("id: ")){ne=v.slice(4);return}if(!v.startsWith("data: "))return;let b=v.slice(6);if(b==="[DONE]"){y("[DONE]"),U=!0;return}try{let p=JSON.parse(b);y(p),p.type==="done"&&p.id?(Z=p.id,ce=p.truncated===!0):p.type==="aborted"?(ee={id:typeof p.id=="string"?p.id:"",persisted:p.persisted===!0},U=!0):p.type==="error"?(P=new g(p.code||"INTERNAL_ERROR",p.message||"Generation failed",Array.isArray(p.matched_words)?p.matched_words:void 0),U=!0):p.type==="state"?(I.onState?.(p.delta,p.full??null),Array.isArray(p.createdNames)&&p.createdNames.length&&I.onCreatedCharacters?.(p.createdNames)):p.type==="start"?(_!==null&&(clearTimeout(_),_=null),typeof p.base_content=="string"&&f?.(p.base_content)):p.type==="thinking"?(p.status==="start"||p.status==="end")&&I.onThinking?.(p.status):p.content&&(_!==null&&(clearTimeout(_),_=null),D+=p.content,I.onChunk(p.content))}catch{y({raw:b})}ne!==void 0&&(te=ne,ne=void 0)},Te=()=>{if(k(),P)throw R(),S(P.code,P.message,P.matchedWords),this.log({method:"STREAM",path:e,body:t,error:P,durationMs:Date.now()-m,modelName:i?.modelName}),P;this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${O.status}]${h} (${Date.now()-m}ms) %c\u2713`,"color: #6366f1; font-weight: bold","color: #e0e0e0","color: #22c55e"),console.log("Request:",t),console.log(`Accumulated content (${D.length} chars):`,D),console.log("Message ID:",Z),ee&&console.log("Aborted:",ee),console.log(`SSE events (${w.length}):`,w),console.groupEnd()),$(I,{messageId:Z,truncated:ce,aborted:ee})};try{for(;;){let{done:E,value:v}=await Ie.read();if(E)break;x+=Ee.decode(v,{stream:!0});let b=x.split(`
121
121
  `);x=b.pop()??"";for(let p of b)ye(p);if(U){Te();return}}if(x+=Ee.decode(),x&&ye(x),U){Te();return}}catch(E){if(k(),P)throw P;if(N){let v=new g(N,"Stream did not start in time");if(this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${O.status}]${h} (${Date.now()-m}ms) %c\u2717 ${N}`,"color: #6366f1; font-weight: bold","color: #e0e0e0","color: #ef4444"),console.log("Request:",t),console.log(`Accumulated content (${D.length} chars):`,D),console.log(`SSE events (${w.length}):`,w),console.error("Timeout:",v),console.groupEnd()),a){await this.resumeLoop(a,te,I,{finalize:!0});return}throw S(N),R(),v}if(this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${O.status}]${h} (${Date.now()-m}ms) %c\u2717`,"color: #6366f1; font-weight: bold","color: #e0e0e0","color: #ef4444"),console.log("Request:",t),console.log(`Accumulated content (${D.length} chars):`,D),console.log(`SSE events (${w.length}):`,w),console.error("Stream error:",E),console.groupEnd()),a){await this.resumeLoop(a,te,I,{finalize:!0});return}throw R(),E}if(k(),Z){$(I,{messageId:Z,truncated:ce});return}if(a){await this.resumeLoop(a,te,I,{finalize:!0});return}R()}async resumeLoop(e,t,n,r){let i=t;for(let d=1;d<=T.RECONNECT_MAX_ATTEMPTS;d++){let c=Math.min(T.RECONNECT_BACKOFF_CAP,1e3*2**(d-1));await new Promise(u=>setTimeout(u,c)),n.onReconnect?.({attempt:d});let a={messageId:"",lastId:i},l;try{l=await this.pumpGetStream(e.conversationId,e.topic,i,a,n)}catch{continue}if(i=a.lastId??i,l==="done"){if(a.errorCode)throw this.terminalError(a);$(n,a);return}if(l==="inactive"){(a.messageId||r?.finalize)&&$(n,a);return}}let s=new g("STREAM_INTERRUPTED","Stream reconnection failed after maximum attempts");throw S("STREAM_INTERRUPTED"),s}async resumeStream(e,t,n){let{cbs:r}=he(n),i={messageId:""},s;try{s=await this.pumpGetStream(e,t,void 0,i,r)}catch{await this.resumeLoop({conversationId:e,topic:t},i.lastId,r);return}if(s==="done"){if(i.errorCode)throw this.terminalError(i);$(r,i);return}if(s==="inactive"){i.messageId&&$(r,i);return}await this.resumeLoop({conversationId:e,topic:t},i.lastId,r)}terminalError(e){let t=new g(e.errorCode??"INTERNAL_ERROR",e.errorMessage||"Generation failed",e.errorMatchedWords);return S(t.code,t.message,t.matchedWords),t}async pumpGetStream(e,t,n,r,i){let s=new URL(`${this.baseUrl}/conversations/${encodeURIComponent(e)}/stream`);n&&s.searchParams.set("from",n),t&&s.searchParams.set("topic",t);let d=new AbortController,c=setTimeout(()=>d.abort(),T.REQUEST_TIMEOUT),a;try{a=await fetch(s.toString(),{method:"GET",headers:this.buildHeaders(),signal:d.signal})}finally{clearTimeout(c)}if(!a.ok)throw new g("STREAM_INTERRUPTED",`Resume HTTP ${a.status}`);if(!(a.headers.get("content-type")||"").includes("text/event-stream"))return"inactive";let u=a.body?.getReader();return u?await this.pumpReader(u,r,i):"inactive"}async pumpReader(e,t,n){let r=new TextDecoder,i,s=null,d=()=>{s&&clearTimeout(s),s=setTimeout(()=>{e.cancel().catch(()=>{})},T.RESUME_STALL_TIMEOUT)};d();let c="",a=!1,l=u=>{if(a)return;let f=u.endsWith("\r")?u.slice(0,-1):u;if(f.startsWith("id: ")){i=f.slice(4);return}if(!f.startsWith("data: "))return;let m=f.slice(6);if(m==="[DONE]"){a=!0;return}try{let h=JSON.parse(m);h.type==="done"&&h.id?(t.messageId=h.id,t.truncated=h.truncated===!0):h.type==="aborted"?(t.aborted={id:typeof h.id=="string"?h.id:"",persisted:h.persisted===!0},a=!0):h.type==="error"?(t.errorCode=h.code||"INTERNAL_ERROR",t.errorMessage=h.message||"Generation failed",Array.isArray(h.matched_words)&&(t.errorMatchedWords=h.matched_words),a=!0):h.type==="state"?(n.onState?.(h.delta,h.full??null),Array.isArray(h.createdNames)&&h.createdNames.length&&n.onCreatedCharacters?.(h.createdNames)):h.type==="start"?typeof h.base_content=="string"&&n.onBase?.(h.base_content):h.type==="thinking"?(h.status==="start"||h.status==="end")&&n.onThinking?.(h.status):h.content&&n.onChunk(h.content)}catch{}i!==void 0&&(t.lastId=i,i=void 0)};try{for(;;){let{done:u,value:f}=await e.read();if(u)break;d(),c+=r.decode(f,{stream:!0});let m=c.split(`
122
122
  `);c=m.pop()??"";for(let h of m)l(h);if(a)return s&&clearTimeout(s),"done"}if(c+=r.decode(),c&&l(c),a)return s&&clearTimeout(s),"done"}catch{}finally{s&&clearTimeout(s)}return"eof"}async handleResponseWithRaw(e){let t=await e.text(),n;try{n=t?JSON.parse(t):null}catch{n=t}if(!e.ok){let r=n&&typeof n=="object"?n:{},i={401:"UNAUTHORIZED",402:"INSUFFICIENT_CREDITS",429:"RATE_LIMITED"},s=r.code||i[e.status]||"INTERNAL_ERROR",d=Array.isArray(r.matched_words)?r.matched_words:void 0,c=new g(s,r.message||`HTTP ${e.status}`,d);throw S(s,r.message,d),c}return n&&typeof n=="object"&&"data"in n?{raw:n,data:n.data}:{raw:n,data:n}}};T.REQUEST_TIMEOUT=6e4,T.INITIAL_TIMEOUT=3e4,T.RESUME_STALL_TIMEOUT=6e4,T.RECONNECT_MAX_ATTEMPTS=10,T.RECONNECT_BACKOFF_CAP=15e3;var J=T;var dt="storvia_chat_main";function ct(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let o=new Uint8Array(16);crypto.getRandomValues(o),o[6]=o[6]&15|64,o[8]=o[8]&63|128;let e=Array.from(o,t=>t.toString(16).padStart(2,"0")).join("");return`${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20)}`}var Ue=20,Le=40,F=class{constructor(e,t,n,r,i=!1,s,d,c){this.http=e;this.getGameId=t;this.getConversationId=n;this.getModelId=r;this.isPreview=i;this.previewHistory=[];this.previewConfig=s,this.getModelName=d,this.getPreset=c}reqMeta(){let e=this.getModelName?.();return e?{modelName:e}:void 0}updatePreviewConfig(e){this.previewConfig=e}async send(e){if(this.isPreview)return this.sendPreview(e);let t={game_id:this.getGameId(),conversation_id:this.getConversationId(),model_id:this.getModelId(),message:e.message,topic:e.topic,scene_key:e.sceneKey,extract:e.extract,stream:e.stream??!1,preset:this.getPreset?.(),client_message_uuid:ct()};if(e.stream){await this.http.stream("/chat",t,e.onChunk??(()=>{}),e.onDone??(()=>{}),this.reqMeta(),G(e.onState),e.onThinking,e.onCreatedCharacters,{conversationId:this.getConversationId(),topic:e.topic},e.onReconnecting,e.onAborted);return}return this.http.post("/chat",t,this.reqMeta())}async save(e){return this.isPreview?{id:`preview-${Date.now()}`}:this.http.post("/messages/save",{game_id:this.getGameId(),conversation_id:this.getConversationId(),role:e.role,content:e.content,topic:e.topic})}async generate(e){if(this.isPreview)return this.sendPreview({message:"",topic:e.topic,sceneKey:e.sceneKey,stream:e.stream,onChunk:e.onChunk,onDone:e.onDone,onState:e.onState,onThinking:e.onThinking,onCreatedCharacters:e.onCreatedCharacters});let t={game_id:this.getGameId(),conversation_id:this.getConversationId(),model_id:this.getModelId(),topic:e.topic,scene_key:e.sceneKey,extract:e.extract,stream:e.stream??!1,preset:this.getPreset?.()};if(e.stream){await this.http.stream("/generate",t,e.onChunk??(()=>{}),e.onDone??(()=>{}),this.reqMeta(),G(e.onState),e.onThinking,e.onCreatedCharacters,{conversationId:this.getConversationId(),topic:e.topic},e.onReconnecting,e.onAborted);return}return this.http.post("/generate",t,this.reqMeta())}async once(e){if(this.isPreview)return this.oncePreview(e);let t={game_id:this.getGameId(),conversation_id:this.getConversationId(),model_id:this.getModelId(),message:e.message,scene_key:e.sceneKey,stream:e.stream===!0,preset:this.getPreset?.()};if(!e.stream)return this.http.post("/once",t,this.reqMeta());let n="";return await this.http.stream("/once",t,r=>{n+=r,e.onChunk?.(r)},()=>{},this.reqMeta(),void 0,e.onThinking),{content:n}}async oncePreview(e){let t={model_id:this.getModelId(),message:e.message,scene_key:e.sceneKey,history_messages:[],preset:this.getPreset?.()};this.previewConfig?t.prompt_config=this.previewConfig:t.game_id=this.getGameId();let n=this.previewConfig;n?.reply_length&&(t.reply_length=n.reply_length),n?.reply_language&&(t.reply_language=n.reply_language);let r="";return await this.http.stream("/preview",t,i=>{r+=i,e.onChunk?.(i)},()=>{},this.reqMeta(),void 0,e.onThinking),{content:r}}async retry(e={}){if(this.isPreview)throw new g("NOT_SUPPORTED_IN_PREVIEW","storvia.chat.retry() is not available in preview mode. Publish the game and test on the Storvia platform.");let t={game_id:this.getGameId(),conversation_id:this.getConversationId(),model_id:this.getModelId(),topic:e.topic,scene_key:e.sceneKey,extract:e.extract,stream:e.stream??!1,preset:this.getPreset?.()};if(e.stream){await this.http.stream("/retry",t,e.onChunk??(()=>{}),e.onDone??(()=>{}),this.reqMeta(),G(e.onState),e.onThinking,e.onCreatedCharacters,{conversationId:this.getConversationId(),topic:e.topic},e.onReconnecting,e.onAborted);return}return this.http.post("/retry",t,this.reqMeta())}async continue(e={}){if(this.isPreview)return;let t={conversation_id:this.getConversationId(),topic:e.topic??null,game_id:this.getGameId(),preset:this.getPreset?.(),scene_key:e.sceneKey,extract:e.extract};await this.http.stream("/continue",t,e.onChunk??(()=>{}),e.onDone??(()=>{}),this.reqMeta(),G(e.onState),e.onThinking,e.onCreatedCharacters,{conversationId:this.getConversationId(),topic:e.topic},e.onReconnecting,e.onAborted,e.onBase)}async cancel(e={}){if(this.isPreview)return{active:!1};let t=await this.http.post(`/conversations/${encodeURIComponent(this.getConversationId())}/cancel`,{topic:e.topic});return{active:t.active===!0,generationId:t.generation_id}}async messages(e){if(this.isPreview)return{data:[],hasMore:!1,nextCursor:null};let t={conversation_id:this.getConversationId(),order:e.order,limit:String(e.limit??20)};e.topic&&(t.topic=e.topic),e.cursor&&(t.cursor_uuid=e.cursor.uuid,t.cursor_created_at=e.cursor.createdAt);let n=await this.http.get("/messages",t);return{data:n.messages.map(r=>({uuid:r.uuid,role:r.role,content:r.content,topic:r.topic,status:r.status,model:r.model,createdAt:r.created_at,truncated:r.truncated===!0})),hasMore:n.has_more,nextCursor:n.next_cursor?{uuid:n.next_cursor.cursor_uuid,createdAt:n.next_cursor.cursor_created_at}:null}}async edit(e){if(this.isPreview)throw new g("NOT_SUPPORTED_IN_PREVIEW","storvia.chat.edit() is not available in preview mode. Publish the game and test on the Storvia platform.");let t=await this.http.patch(`/messages/${encodeURIComponent(e.uuid)}`,{content:e.content});return{uuid:t.uuid,role:t.role,content:t.content,updatedAt:t.updated_at}}async delete(e){if(this.isPreview)throw new g("NOT_SUPPORTED_IN_PREVIEW","storvia.chat.delete() is not available in preview mode. Publish the game and test on the Storvia platform.");return{uuid:(await this.http.delete(`/messages/${encodeURIComponent(e.uuid)}`)).uuid}}async rollback(e){if(this.isPreview)throw new g("NOT_SUPPORTED_IN_PREVIEW","storvia.chat.rollback() is not available in preview mode. Publish the game and test on the Storvia platform.");let t=await this.http.post(`/messages/${encodeURIComponent(e.uuid)}/rollback`,{});return{deletedCount:t.deleted_count,deletedUuids:t.deleted_uuids,restoredGameState:t.restored_game_state}}async resume(e={}){this.isPreview||await this.http.resumeStream(this.getConversationId(),e.topic,{onChunk:e.onChunk??(()=>{}),onDone:e.onDone??(()=>{}),onState:G(e.onState),onThinking:e.onThinking,onCreatedCharacters:e.onCreatedCharacters,onReconnect:e.onReconnecting,onAborted:e.onAborted})}async sendPreview(e){let t=e.message.trim().length>0,n=this.previewHistory.slice(t?-(Ue-1):-Ue);t&&this.pushPreviewHistory({role:"user",content:e.message});let r={model_id:this.getModelId(),message:e.message,topic:e.topic,scene_key:e.sceneKey,history_messages:n,preset:this.getPreset?.()};this.previewConfig?r.prompt_config=this.previewConfig:r.game_id=this.getGameId();let i=this.previewConfig;if(i?.reply_length&&(r.reply_length=i.reply_length),i?.reply_language&&(r.reply_language=i.reply_language),e.stream){let u="";await this.http.stream("/preview",r,f=>{u+=f,e.onChunk?.(f)},(f,m)=>{u&&this.pushPreviewHistory({role:"assistant",content:u}),e.onDone?.(f,m)},this.reqMeta(),G(e.onState),e.onThinking,e.onCreatedCharacters);return}let s="",d=null,c=null,a=[];await this.http.stream("/preview",r,u=>{s+=u},()=>{},this.reqMeta(),(u,f)=>{d=u,c=f,e.onState&&e.onState(d,c)},void 0,u=>{a=u,e.onCreatedCharacters&&e.onCreatedCharacters(u)}),s&&this.pushPreviewHistory({role:"assistant",content:s});let l={id:"",content:s,truncated:!1};return d&&(l.delta=d,c&&(l.full=c)),a.length&&(l.createdNames=a),l}pushPreviewHistory(e){this.previewHistory.push(e),this.previewHistory.length>Le&&this.previewHistory.splice(0,this.previewHistory.length-Le)}};function G(o){if(o)return(e,t)=>o(e,t)}var ue=class{constructor(e,t,n=!1,r){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem={};r&&(this.mem={...r})}setInitial(e){this.mem=e?{...e}:{}}async get(e,t){if(this.isPreview){let r=this.mem[e]||{};return t?{...r[t]||{}}:{...r}}let n=t?{group:t}:void 0;return this.http.get(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/state`,n)}async update(e,t,n){if(this.isPreview){let r=this.mem[e]||(this.mem[e]={});r[t]={...r[t]||{},...n};return}await this.http.patch(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/state`,{group:t,values:n})}async remove(e,t,n){if(n.length){if(this.isPreview){let r=this.mem[e]?.[t];if(r)for(let i of n)delete r[i];return}await this.http.patch(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/state`,{group:t,removeKeys:n})}}async removeGroup(e,t){if(this.isPreview){let n=this.mem[e];n&&delete n[t];return}await this.http.patch(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/state`,{group:t,removeGroup:!0})}},V=class{constructor(e,t,n=!1,r,i){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem=[];r&&(this.mem=r.map($e)),this.state=new ue(e,t,n,i)}setInitial(e,t){this.mem=e?e.map($e):[],this.state.setInitial(t)}async list(){return this.isPreview?this.mem.map(Ge):this.http.get(`/conversations/${this.getConversationId()}/characters`)}async get(e){if(this.isPreview){let t=this.mem.find(n=>n.name===e);return t?Ge(t):{name:e}}return this.http.get(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}`)}async add(e){if(this.isPreview){this.mem.push({...e,isPreset:!1});return}await this.http.post(`/conversations/${this.getConversationId()}/characters`,e)}async update(e,t){if(this.isPreview){let n=this.mem.find(r=>r.name===e);n&&Object.assign(n,t);return}await this.http.patch(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}`,t)}async remove(e){if(this.isPreview){this.mem=this.mem.filter(t=>t.name!==e);return}await this.http.delete(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}`)}async merge(e,t){if(this.isPreview){if(this.mem.find(r=>r.name===e)?.isPreset)throw new g("INVALID_REQUEST","\u9884\u8BBE\u89D2\u8272\u4E0D\u53EF\u88AB\u5408\u5E76");if(e===t||!this.mem.some(r=>r.name===t))throw new g("INVALID_REQUEST","\u76EE\u6807\u89D2\u8272\u4E0D\u5B58\u5728\u6216\u4E0E\u6765\u6E90\u76F8\u540C");this.mem=this.mem.filter(r=>r.name!==e);return}await this.http.post(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/merge`,{target:t})}async detail(e){if(this.isPreview){let t=this.mem.find(n=>n.name===e);return{name:e,avatar:t?.avatar,description:t?.description,...t?.introduction!==void 0?{introduction:t.introduction}:{},...t?.visibleAtStart!==void 0?{visibleAtStart:t.visibleAtStart}:{},userDescription:t?.userDescription,...t?.gender?{gender:t.gender}:{},...t?.isPreset!==void 0?{isPreset:t.isPreset}:{},state:await this.state.get(e)}}return this.http.get(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/detail`)}async setPriority(e,t){let n=Math.max(0,Math.min(100,Math.round(t)));this.isPreview||await this.http.patch(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/state`,{priority:n})}};function $e(o){return{name:o.name,description:o.description,avatar:o.avatar,...o.introduction!==void 0?{introduction:o.introduction}:{},...o.visibleAtStart!==void 0?{visibleAtStart:o.visibleAtStart}:{},...o.gender?{gender:o.gender}:{},...o.userDescription!==void 0?{userDescription:o.userDescription}:{},...o.isPreset!==void 0?{isPreset:o.isPreset}:{}}}function Ge(o){return{name:o.name,avatar:o.avatar,description:o.description,...o.introduction!==void 0?{introduction:o.introduction}:{},...o.visibleAtStart!==void 0?{visibleAtStart:o.visibleAtStart}:{},...o.userDescription!==void 0?{userDescription:o.userDescription}:{},...o.gender?{gender:o.gender}:{},...o.isPreset!==void 0?{isPreset:o.isPreset}:{}}}var H=class{constructor(e,t,n=!1,r){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem=[];r&&(this.mem=r.map(i=>({...i})))}setInitial(e){this.mem=e?e.map(t=>({...t})):[]}async list(){return this.isPreview?[...this.mem]:this.http.get(`/conversations/${this.getConversationId()}/relationships`)}async get(e,t){if(this.isPreview){let n=this.mem.find(r=>r.from===e&&r.to===t);if(n)return{...n};throw new Error("Relationship not found")}return this.http.get(`/conversations/${this.getConversationId()}/relationships/${encodeURIComponent(e)}/${encodeURIComponent(t)}`)}async add(e){if(this.isPreview){this.mem.push({...e});return}await this.http.post(`/conversations/${this.getConversationId()}/relationships`,e)}async update(e,t,n){if(this.isPreview){let r=this.mem.find(i=>i.from===e&&i.to===t);r?Object.assign(r,n):this.mem.push({from:e,to:t,...n});return}await this.http.patch(`/conversations/${this.getConversationId()}/relationships/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,n)}async remove(e,t){if(this.isPreview){this.mem=this.mem.filter(n=>!(n.from===e&&n.to===t));return}await this.http.delete(`/conversations/${this.getConversationId()}/relationships/${encodeURIComponent(e)}/${encodeURIComponent(t)}`)}};function Fe(o){let e={count:o.count};return o.desc!==void 0&&(e.desc=o.desc),o.icon_url!==void 0&&(e.iconUrl=o.icon_url),e}function pe(o){let e={};if(!o)return e;for(let[t,n]of Object.entries(o)){let r={};for(let[i,s]of Object.entries(n))r[i]=Fe(s);e[t]=r}return e}function lt(o){let e={};if(!o)return e;for(let[t,n]of Object.entries(o))e[t]=Fe(n);return e}var W=class{constructor(e,t,n=!1,r){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem={};r&&(this.mem=pe(r))}setInitial(e){this.mem=e?pe(e):{}}async list(e){if(this.isPreview){if(e!==void 0)return{...this.mem[e]||{}};let n={};for(let[r,i]of Object.entries(this.mem))n[r]={...i};return n}if(e!==void 0){let n=await this.http.get(`/conversations/${this.getConversationId()}/inventory/${encodeURIComponent(e)}`);return lt(n)}let t=await this.http.get(`/conversations/${this.getConversationId()}/inventory`);return pe(t)}async add(e){let{group:t,name:n,count:r=1,desc:i,iconUrl:s}=e;if(this.isPreview){if(!this.mem[t])throw new Error(`Group "${t}" does not exist`);if(n in this.mem[t])throw new Error(`Item "${n}" already exists in group "${t}"`);let c={count:r};i!==void 0&&(c.desc=i),s!==void 0&&(c.iconUrl=s),this.mem[t][n]=c;return}let d={group:t,name:n,count:r};i!==void 0&&(d.desc=i),s!==void 0&&(d.icon_url=s),await this.http.post(`/conversations/${this.getConversationId()}/inventory`,d)}async update(e){let{group:t,name:n,count:r,desc:i,iconUrl:s}=e;if(this.isPreview){let c=this.mem[t];if(!c||!(n in c))throw new Error(`Item "${t}/${n}" not found`);let a=c[n];r!==void 0&&(a.count=r),i!==void 0&&(a.desc=i),s!==void 0&&(a.iconUrl=s);return}let d={};r!==void 0&&(d.count=r),i!==void 0&&(d.desc=i),s!==void 0&&(d.icon_url=s),await this.http.patch(`/conversations/${this.getConversationId()}/inventory/${encodeURIComponent(t)}/${encodeURIComponent(n)}`,d)}async remove(e){let{group:t,name:n}=e;if(this.isPreview){this.mem[t]&&delete this.mem[t][n];return}await this.http.delete(`/conversations/${this.getConversationId()}/inventory/${encodeURIComponent(t)}/${encodeURIComponent(n)}`)}async removeBatch(e){if(this.isPreview){for(let{group:t,name:n}of e)this.mem[t]&&delete this.mem[t][n];return}e.length!==0&&await this.http.post(`/conversations/${this.getConversationId()}/inventory/batch-delete`,{items:e})}async move(e){let{fromGroup:t,toGroup:n,name:r,newName:i}=e;if(this.isPreview){let s=this.mem[t];if(!s||!(r in s))throw new Error(`Source item "${t}/${r}" not found`);if(!this.mem[n])throw new Error(`Target group "${n}" does not exist`);let d=i||r;if(t===n&&d===r)return;if(d in this.mem[n])throw new Error(`Item "${d}" already exists in target group`);this.mem[n][d]=s[r],delete s[r];return}await this.http.post(`/conversations/${this.getConversationId()}/inventory/move`,{fromGroup:t,toGroup:n,name:r,newName:i})}async ensureGroup(e){if(this.isPreview){this.mem[e]||(this.mem[e]={});return}await this.http.post(`/conversations/${this.getConversationId()}/inventory/groups/${encodeURIComponent(e)}`,{})}async removeGroup(e,t){let n=t?.cascade??!1;if(this.isPreview){let i=this.mem[e];if(i&&Object.keys(i).length>0&&!n)throw new Error(`Group "${e}" is not empty, pass cascade: true to force delete`);delete this.mem[e];return}let r=n?"?cascade=true":"";await this.http.delete(`/conversations/${this.getConversationId()}/inventory/groups/${encodeURIComponent(e)}${r}`)}};var B=class{constructor(e,t,n=!1,r){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem={};r&&(this.mem={...r})}setInitial(e){this.mem=e?{...e}:{}}async get(){return this.isPreview?{...this.mem}:this.http.get(`/conversations/${this.getConversationId()}/world`)}async update(e){if(this.isPreview){Object.assign(this.mem,e);return}await this.http.patch(`/conversations/${this.getConversationId()}/world`,e)}};var ge=class{constructor(e,t,n=!1,r){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem={};r&&(this.mem={...r})}setInitial(e){this.mem=e?{...e}:{}}async get(e){if(this.isPreview)return e?{...this.mem[e]||{}}:{...this.mem};let t=e?{group:e}:void 0;return this.http.get(`/conversations/${this.getConversationId()}/player/state`,t)}async update(e,t){if(this.isPreview){this.mem[e]={...this.mem[e]||{},...t};return}await this.http.patch(`/conversations/${this.getConversationId()}/player/state`,{group:e,values:t})}async remove(e,t){if(t.length){if(this.isPreview){let n=this.mem[e];if(n)for(let r of t)delete n[r];return}await this.http.patch(`/conversations/${this.getConversationId()}/player/state`,{group:e,removeKeys:t})}}async removeGroup(e){if(this.isPreview){delete this.mem[e];return}await this.http.patch(`/conversations/${this.getConversationId()}/player/state`,{group:e,removeGroup:!0})}},j=class{constructor(e,t,n=!1,r,i){this.http=e;this.getConversationId=t;this.isPreview=n;this.memPersona={name:""};r&&(this.memPersona={...r}),this.state=new ge(e,t,n,i)}setInitial(e,t){this.memPersona=e?{...e}:{name:""},this.state.setInitial(t)}async get(){return this.isPreview?{...this.memPersona}:this.http.get(`/conversations/${this.getConversationId()}/player`)}async update(e){if(this.isPreview){Object.assign(this.memPersona,e);return}await this.http.patch(`/conversations/${this.getConversationId()}/player`,e)}};function K(o,e){if(!e)return o;let t=o.includes("?")?"&":"?";return`${o}${t}game_id=${encodeURIComponent(e)}`}var q=class{constructor(e,t,n,r=!1,i,s){this.http=e;this.getConversationId=t;this.getGameId=n;this.isPreview=r;this.mem={};this.memInject={};i&&(this.mem=Ve(i)),s&&(this.memInject={...s})}setInitial(e,t){this.mem=e?Ve(e):{},this.memInject=t?{...t}:{}}async get(e){if(this.isPreview)return e!==void 0?this.mem[e]:{...this.mem};let t=await this.http.get(K(`/conversations/${this.getConversationId()}/custom`,this.getGameId()));return e!==void 0?t[e]:t}async set(e,t){if(this.isPreview){for(let[r,i]of Object.entries(e))typeof i=="object"&&i!==null&&typeof this.mem[r]=="object"&&this.mem[r]!==null?this.mem[r]={...this.mem[r],...i}:this.mem[r]=i,t?.inject!==void 0&&(this.memInject[r]=t.inject);return}let n=t?.inject!==void 0?{data:e,inject:t.inject}:e;await this.http.patch(K(`/conversations/${this.getConversationId()}/custom`,this.getGameId()),n)}async setInject(e,t){if(this.isPreview){this.memInject[e]=t;return}await this.http.patch(K(`/conversations/${this.getConversationId()}/custom/inject/${encodeURIComponent(e)}`,this.getGameId()),{inject:t})}getInject(){return{...this.memInject}}async delete(e){if(this.isPreview){delete this.mem[e],delete this.memInject[e];return}await this.http.delete(K(`/conversations/${this.getConversationId()}/custom/${encodeURIComponent(e)}`,this.getGameId()))}async setGroupField(e,t,n){if(this.isPreview){(!this.mem[e]||typeof this.mem[e]!="object")&&(this.mem[e]={}),this.mem[e][t]=n;return}await this.http.patch(K(`/conversations/${this.getConversationId()}/custom/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,this.getGameId()),{value:n})}async deleteGroupField(e,t){if(this.isPreview){if(typeof this.mem[e]=="object"&&this.mem[e]!==null){let n=this.mem[e];delete n[t]}return}await this.http.delete(K(`/conversations/${this.getConversationId()}/custom/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,this.getGameId()))}};function Ve(o){let e={};for(let[t,n]of Object.entries(o))typeof n=="object"&&n!==null&&!Array.isArray(n)?e[t]={...n}:e[t]=n;return e}function He(o,e){if(!e)return o;let t=o.includes("?")?"&":"?";return`${o}${t}game_id=${encodeURIComponent(e)}`}var z=class{constructor(e,t,n,r=!1,i){this.http=e;this.getConversationId=t;this.getGameId=n;this.isPreview=r;this.mem={};i&&(this.mem={...i})}setInitial(e){this.mem=e?{...e}:{}}async get(){return this.isPreview?{...this.mem}:await this.http.get(He(`/conversations/${this.getConversationId()}/save`,this.getGameId()))}async set(e){if(this.isPreview){this.mem={...e};return}await this.http.put(He(`/conversations/${this.getConversationId()}/save`,this.getGameId()),e)}};var Y=class{constructor(e,t,n=!1){this.http=e;this.getConversationId=t;this.isPreview=n}async get(){if(this.isPreview)throw new g("NOT_SUPPORTED_IN_PREVIEW","storvia.state.get() is not available in preview mode. Publish the game and test on the Storvia platform. (Use per-module get() like storvia.world.get() if you need to inspect state during preview.)");return this.http.get(`/conversations/${this.getConversationId()}/state`)}};var Q=class{constructor(e,t,n=!1){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem=null;this.wb=null;this.worldbook={get:async()=>this.isPreview?this.wb?We(this.wb):null:(await this.http.get(`/conversations/${this.getConversationId()}/worldbook`)).worldbook,update:async e=>{let t=typeof e=="string"?{content:e}:{...e};if(t.content!==void 0&&(t.content=(t.content??"").trim()),t.entries!==void 0&&(t.entries=ht(t.entries)),this.isPreview){let r=this.wb?.presets??[],i=t.enabledPresets?r.map(d=>({...d,enabled:t.enabledPresets.includes(d.id)})):r,s={content:t.content??this.wb?.content??"",entries:t.entries??this.wb?.entries??[],presets:i,updated_at:new Date().toISOString()};return this.wb=s,We(s)}return(await this.http.patch(`/conversations/${this.getConversationId()}/worldbook`,t)).worldbook}}}async get(){return this.isPreview?this.mem?{...this.mem}:null:(await this.http.get(`/conversations/${this.getConversationId()}/summary`)).ai_summary}async update(e){let t=(e??"").trim();if(this.isPreview){let r={content:t,updated_at:new Date().toISOString()};return this.mem=r,{...r}}return(await this.http.patch(`/conversations/${this.getConversationId()}/summary`,{content:t})).ai_summary}};function We(o){return{...o,entries:o.entries.map(e=>({...e,keys:[...e.keys]})),presets:(o.presets??[]).map(e=>({...e}))}}function ht(o){return(o??[]).flatMap(e=>{let t=(e?.content??"").trim(),n=[...new Set((e?.keys??[]).map(r=>(r??"").trim()).filter(r=>r!==""))];return!t||n.length===0?[]:[{id:e.id||ut(),keys:n,content:t}]})}function ut(){let o=globalThis.crypto;return o?.randomUUID?o.randomUUID():`ewr-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var Be=60,je=1e3,me=1e4,M=class{constructor(e,t=!1,n=()=>Date.now()){this.send=e;this.isPreview=t;this.now=n;this.lastNotifyAt=0;this.lastRefreshAt=0;this.lastRefreshMessagesAt=0}notify(e){let t=pt(e);if(!t)return!1;let n=this.now();return n-this.lastNotifyAt<je?!1:(this.lastNotifyAt=n,this.isPreview?(ae(t,"info"),!0):(this.send(C("host-notify",{text:t})),!0))}refreshPanel(e){if(this.isPreview)return!1;let t=this.now();return t-this.lastRefreshAt<me?!1:(this.lastRefreshAt=t,this.send(C("host-state-changed",e?.length?{scope:e}:{})),!0)}refreshMessages(){if(this.isPreview)return!1;let e=this.now();return e-this.lastRefreshMessagesAt<me?!1:(this.lastRefreshMessagesAt=e,this.send(C("host-messages-changed",{})),!0)}};function pt(o){return typeof o!="string"?"":o.replace(/\s+/g," ").trim().slice(0,Be)}var Ke="/functions/v1/world-engine/v1",gt="https://api.storvia.ai";function mt(){return window.__STORVIA__||{}}function ft(o,e=3e4){let t=mt();return t.apiBase?Promise.resolve(t):new Promise((n,r)=>{let i=setTimeout(()=>{s(),d(),r(new g("NOT_INITIALIZED","Timed out waiting for __STORVIA__ config from parent frame."))},e),s=o.on("init",a=>{a.payload?.apiBase&&c({apiBase:a.payload.apiBase,gameId:a.payload.gameId,conversationId:a.payload.conversationId,accessToken:a.payload.accessToken,selectedModelId:a.payload.selectedModelId,lang:a.payload.lang,debug:a.payload.debug})}),d=o.on("preview-init",a=>{a.payload?.apiBase&&c(a.payload)});function c(a){clearTimeout(i),s(),d();let l=window;l.__STORVIA__=a,n(a)}o.send(C("ready",{}))})}var de=class{constructor(){this.baseUrl="";this.gameId="";this.conversationId="";this.modelId="";this.models=[];this.presetId="";this.accessToken="";this.initialized=!1;this.isPreview=!1;this.previewConfig=void 0}async init(){if(this.initialized)return;let e=window.flutter_inappwebview,t=typeof e?.callHandler=="function";this.bus=new L({incoming:window,outgoing:()=>t?null:window.parent,verifySource:t?l=>l.source===null||l.source===window:l=>l.source===window.parent,customSend:t?l=>e.callHandler("storviaBus",l):void 0}),De(l=>this.bus.send(l));let n=await ft(this.bus),r=n.apiBase;if(!r)throw new g("NOT_INITIALIZED","window.__STORVIA__.apiBase is not set. The platform must inject it before SDK init.");if(this.baseUrl=`${r}${Ke}`,this.isPreview=!!n.preview,this.previewConfig=n.previewConfig,!n.gameId)throw new g("GAME_NOT_FOUND","window.__STORVIA__.gameId is not set. The platform must inject it before SDK init.");if(this.gameId=n.gameId,!n.accessToken)throw new g("UNAUTHORIZED","window.__STORVIA__.accessToken is not set. The platform must inject the user token before SDK init.");if(this.accessToken=n.accessToken,Oe(n.lang),this.http=new J(this.baseUrl,this.accessToken,!!n.debug),this.isPreview){this.conversationId="00000000-0000-0000-0000-000000000000",this.models=n.models??[],this.modelId=n.selectedModelId||this.models[0]?.id||"";let[l,u]=await Promise.all([this.fetchPreviewSnapshot(),this.modelId?Promise.resolve(null):this.fetchModels()]);u&&(this.models=u,this.modelId=u[0]?.id||""),this.presetId=n.presetId||"";let f=()=>this.gameId,m=()=>this.conversationId,h=()=>this.modelId,w=()=>this.models.find(I=>I.id===this.modelId)?.name,y=()=>this.presetId||void 0;this.chat=new F(this.http,f,m,h,!0,this.previewConfig,w,y),this.characters=new V(this.http,m,!0,l?.characters,l?.characterStates),this.relationships=new H(this.http,m,!0,l?.relationships),this.inventory=new W(this.http,m,!0,l?.inventory),this.world=new B(this.http,m,!0,l?.world),this.player=new j(this.http,m,!0,l?.player,l?.playerState),this.custom=new q(this.http,m,f,!0,l?.custom,l?.custom_inject),this.save=new z(this.http,m,f,!0,l?.save_data),this.state=new Y(this.http,m,!0),this.memory=new Q(this.http,m,!0),this.host=new M(I=>this.bus.send(I),!0),this.initialized=!0,this.listenForPreviewMessages(),this.listenForTokenUpdate();return}if(!n.conversationId)throw new g("NOT_INITIALIZED","window.__STORVIA__.conversationId is not set. The platform must inject it before SDK init.");this.conversationId=n.conversationId,this.modelId=n.selectedModelId||"",this.modelId||(this.models=await this.fetchModels(),this.modelId=this.models[0]?.id||""),this.presetId=n.presetId||"";let i=()=>this.gameId,s=()=>this.conversationId,d=()=>this.modelId,c=()=>this.models.find(l=>l.id===this.modelId)?.name,a=()=>this.presetId||void 0;this.chat=new F(this.http,i,s,d,!1,void 0,c,a),this.characters=new V(this.http,s),this.relationships=new H(this.http,s),this.inventory=new W(this.http,s),this.world=new B(this.http,s),this.player=new j(this.http,s),this.custom=new q(this.http,s,i),this.save=new z(this.http,s,i),this.state=new Y(this.http,s),this.memory=new Q(this.http,s),this.host=new M(l=>this.bus.send(l),!1),this.listenForTokenUpdate(),this.listenForModelChange(),this.initialized=!0}listenForModelChange(){this.bus.on("set-model",e=>{let t=e.payload?.modelId||"";t&&(this.modelId=t)}),this.bus.on("set-preset",e=>{this.presetId=e.payload?.presetId||""})}listenForTokenUpdate(){this.bus.on("token-update",e=>{let t=e.payload?.accessToken;typeof t!="string"||!t||(this.accessToken=t,this.http?.setToken(t))})}listenForPreviewMessages(){this.bus.on("set-model",e=>{this.modelId=e.payload.modelId||""}),this.bus.on("set-preset",e=>{this.presetId=e.payload?.presetId||""}),this.bus.on("config-update",e=>{this.previewConfig=e.payload.previewConfig,this.chat&&this.chat.updatePreviewConfig(this.previewConfig),this.refreshPreviewSnapshot().catch(t=>{console.warn("[Storvia SDK] refreshPreviewSnapshot failed:",t)})})}async fetchPreviewSnapshot(){try{let e={game_id:this.gameId};return this.previewConfig&&("game_config"in this.previewConfig&&(e.game_config=this.previewConfig.game_config),"game_state"in this.previewConfig&&(e.game_state_override=this.previewConfig.game_state)),await this.http.post("/preview/initial-snapshot",e)}catch(e){return console.warn("[Storvia SDK] fetchPreviewSnapshot failed:",e),null}}async refreshPreviewSnapshot(){let e=await this.fetchPreviewSnapshot();e&&(this.characters?.setInitial(e.characters,e.characterStates),this.player?.setInitial(e.player,e.playerState),this.inventory?.setInitial(e.inventory),this.relationships?.setInitial(e.relationships),this.world?.setInitial(e.world),this.custom?.setInitial(e.custom,e.custom_inject),this.save?.setInitial(e.save_data))}async fetchModels(){try{return await this.http.get("/models")}catch{}return[]}async initDev(e){if(this.initialized)return;this.baseUrl=`${gt}${Ke}`,this.gameId=e.gameId,this.isPreview=!0,this.http=new J(this.baseUrl,"",!1,e.apiKey);let[t,n]=await Promise.all([this.fetchModels(),this.fetchPreviewSnapshot()]);this.models=t;let r=e.model?t.find(l=>l.name===e.model)?.id??"":"";this.modelId=r||t[0]?.id||"",this.conversationId="00000000-0000-0000-0000-000000000000";let i=()=>this.gameId,s=()=>this.conversationId,d=()=>this.modelId,c=()=>this.models.find(l=>l.id===this.modelId)?.name;this.presetId=e.preset||"";let a=()=>this.presetId||void 0;this.chat=new F(this.http,i,s,d,!0,void 0,c,a),this.characters=new V(this.http,s,!0,n?.characters,n?.characterStates),this.relationships=new H(this.http,s,!0,n?.relationships),this.inventory=new W(this.http,s,!0,n?.inventory),this.world=new B(this.http,s,!0,n?.world),this.player=new j(this.http,s,!0,n?.player,n?.playerState),this.custom=new q(this.http,s,i,!0,n?.custom,n?.custom_inject),this.save=new z(this.http,s,i,!0,n?.save_data),this.state=new Y(this.http,s,!0),this.memory=new Q(this.http,s,!0),this.host=new M(()=>{},!0),this.initialized=!0}async getAssets(e,t){let n={asset_type:e};return t&&(n.category=t),(await this.http.get("/assets",n)).map(i=>({id:i.id,name:i.name,url:i.url,assetType:i.asset_type,category:i.category}))}};async function vt(o){Pe();let e=new de;return o?.dev?await e.initDev(o.dev):await e.init(),e}function qe(o){return typeof o=="object"&&o!==null&&"value"in o&&"type"in o&&(o.type==="number"||o.type==="text")}function It(o){return qe(o)?o.value:o}export{Be as HOST_NOTIFY_MAX_LENGTH,je as HOST_NOTIFY_MIN_INTERVAL_MS,Re as HOST_PANEL_SCOPES,me as HOST_REFRESH_MIN_INTERVAL_MS,M as HostModule,dt as MAIN_CHAT_TOPIC,X as PROTOCOL_VERSION,L as StorviaBus,g as StorviaError,de as StorviaSDK,vt as createStorviaSDK,C as envelope,It as extractFieldValue,re as isProtocolEnvelope,qe as isRichFieldValue,rt as setToastEnabled,ae as showToast};
package/dist/index.umd.js CHANGED
@@ -117,7 +117,7 @@
117
117
  `,pt={success:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>',error:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>',warning:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>',info:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg>'},$e=!0;function Ge(o){$e=o}function gt(){if(typeof document>"u")return null;let o=document.getElementById(de);if(!o){if(!document.getElementById(Me)){let e=document.createElement("style");e.id=Me,e.textContent=ut,document.head.appendChild(e)}o=document.createElement("div"),o.id=de,document.body.appendChild(o)}return o}function ee(o,e="info",t=3500,n){if(!$e)return;let r=gt();if(!r)return;let i=t<=0,s=document.createElement("div");s.className=`storvia-toast ${e}`,s.innerHTML=`
118
118
  <span class="storvia-toast-icon">${pt[e]}</span>
119
119
  <span class="storvia-toast-msg"></span>
120
- `;let d=s.querySelector(".storvia-toast-msg");d&&(d.textContent=o);let c=()=>{s.isConnected&&(s.classList.add("leaving"),s.classList.remove("show"),setTimeout(()=>s.remove(),320))};if(n){let a=document.createElement("button");a.type="button",a.className="storvia-toast-action",a.textContent=n.label,a.addEventListener("click",()=>{try{n.onClick()}catch(l){console.error("[Storvia toast] action error:",l)}c()}),s.appendChild(a)}if(i){let a=document.createElement("button");a.type="button",a.className="storvia-toast-close",a.setAttribute("aria-label",ae("close")),a.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',a.addEventListener("click",c),s.appendChild(a)}r.appendChild(s),requestAnimationFrame(()=>s.classList.add("show")),i||setTimeout(c,t)}function mt(o){let e=o.filter(t=>t).map(t=>`\u300C${t}\u300D`).join("");return ae("violationWords").replace("{words}",e)}var ft=3e3,xe={};function Ue(o){let e=Date.now();if(!(e-(xe[o]??0)<ft)){if(xe[o]=e,!pe){console.warn(`[Storvia] navigate \u2192 wallet(${o})\uFF1A\u5F53\u524D\u672A\u68C0\u6D4B\u5230\u5BBF\u4E3B\uFF08dev \u6A21\u5F0F\uFF09\uFF0C\u751F\u4EA7\u73AF\u5883\u7531\u5BBF\u4E3B\u5F39\u5145\u503C\u5F15\u5BFC / \u8DF3\u94B1\u5305\u9875\u3002`);return}try{pe(T("navigate",{target:"wallet",reason:o}))}catch(t){console.error("[Storvia] navigate \u2192 wallet \u901A\u8FC7 bus \u53D1\u9001\u5931\u8D25:",t)}}}function S(o,e,t){if(o==="GENERATION_ABORTED")return;if(o==="INSUFFICIENT_CREDITS")return Ue("insufficient_credits");if(o==="DAISY_CARD_REQUIRED")return Ue("daisy_card_required");let n=o==="VIOLATION_WORD_DETECTED"&&t?.length?mt(t):De(o)||e||ae("unknownError");ee(n,o==="RATE_LIMITED"?"warning":"error")}function vt(o,e){let t=e?.tickMs??100,n=e?.baseLagMs??1e3,r=e?.maxLagMs??2500,i=e?.minCharsPerTick??2,s="",d=null,c=0,a=0,l=()=>Math.min(r,Math.max(n,c*1.35)),u=()=>{let y=Math.max(i,Math.ceil(s.length*t/l()));if(y>=s.length)y=s.length;else{let R=s.charCodeAt(y-1);R>=55296&&R<=56319&&y++}let I=s.slice(0,y);s=s.slice(y),I&&o(I)},f=()=>{d=null,u(),s&&(d=setTimeout(f,t))};return{push:y=>{let I=Date.now();if(a>0){let R=Math.min(I-a,r);c=c>0?c*.7+R*.3:R}a=I,s+=y,d===null&&f()},flush:()=>{d!==null&&(clearTimeout(d),d=null),s&&(o(s),s="")},cancel:()=>{d!==null&&(clearTimeout(d),d=null),s=""}}}function ge(o){let e=vt(o.onChunk);return{cbs:{onChunk:n=>e.push(n),onDone:(n,r)=>{e.flush(),o.onDone(n,r)},onAborted:o.onAborted?n=>{e.flush(),o.onAborted(n)}:void 0,onState:o.onState?(n,r)=>{e.flush(),o.onState(n,r)}:void 0,onThinking:o.onThinking?n=>{e.flush(),o.onThinking(n)}:void 0,onCreatedCharacters:o.onCreatedCharacters?n=>{e.flush(),o.onCreatedCharacters(n)}:void 0,onReconnect:o.onReconnect},flush:()=>e.flush()}}var Fe="0.10.5";function G(o,e){if(e.aborted){if(o.onAborted){o.onAborted(e.aborted);return}o.onDone(e.aborted.id,{truncated:!1});return}o.onDone(e.messageId,e.truncated===void 0?void 0:{truncated:e.truncated})}var w=class w{constructor(e,t,n=!1,r=""){this.baseUrl=e,this.token=t,this.debug=n,this.devApiKey=r}setToken(e){this.token=e}setDebug(e){this.debug=e}maybeShowNetworkToast(e){e instanceof g||S("NETWORK_ERROR")}wrapAbortError(e){if(e instanceof DOMException&&e.name==="AbortError"){let t=new g("REQUEST_TIMEOUT","Request timed out");return S("REQUEST_TIMEOUT"),t}return e}createTimeoutController(){let e=new AbortController,t=setTimeout(()=>e.abort(),w.REQUEST_TIMEOUT);return{controller:e,clear:()=>clearTimeout(t)}}buildHeaders(){let e={"Content-Type":"application/json"};return this.token&&(e.Authorization=`Bearer ${this.token}`),this.devApiKey&&(e["x-api-key"]=this.devApiKey),e["x-client-info"]=`storvia-sdk/${Fe}`,e}log(e){if(!this.debug)return;let{method:t,path:n,body:r,status:i,rawResponse:s,parsedData:d,error:c,durationMs:a,modelName:l}=e,u="%c[Storvia SDK]",f="color: #6366f1; font-weight: bold",m=a!==void 0?` (${a}ms)`:"",h=i!==void 0?` [${i}]`:"",C=l?` [model: ${l}]`:"";c?(console.groupCollapsed(`${u} %c${t} ${n}${h}${C}${m} %c\u2717`,f,"color: #e0e0e0","color: #ef4444"),r!==void 0&&console.log("Request:",r),s!==void 0&&console.log("Response (raw):",s),console.error("Error:",c),console.groupEnd()):(console.groupCollapsed(`${u} %c${t} ${n}${h}${C}${m} %c\u2713`,f,"color: #e0e0e0","color: #22c55e"),r!==void 0&&console.log("Request:",r),s!==void 0&&console.log("Response (raw):",s),d!==void 0&&d!==s&&console.log("Response (data):",d),console.groupEnd())}async get(e,t){let n=new URL(`${this.baseUrl}${e}`);t&&Object.entries(t).forEach(([a,l])=>n.searchParams.set(a,l));let r=Date.now(),i,s,{controller:d,clear:c}=this.createTimeoutController();try{let a=await fetch(n.toString(),{method:"GET",headers:this.buildHeaders(),signal:d.signal});c(),i=a.status;let{raw:l,data:u}=await this.handleResponseWithRaw(a);return s=l,this.log({method:"GET",path:e,body:t,status:i,rawResponse:s,parsedData:u,durationMs:Date.now()-r}),u}catch(a){c();let l=this.wrapAbortError(a);throw this.log({method:"GET",path:e,body:t,status:i,rawResponse:s,error:l,durationMs:Date.now()-r}),l===a&&this.maybeShowNetworkToast(a),l}}async post(e,t,n){let r=Date.now(),i,s,{controller:d,clear:c}=this.createTimeoutController();try{let a=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:d.signal});c(),i=a.status;let{raw:l,data:u}=await this.handleResponseWithRaw(a);return s=l,this.log({method:"POST",path:e,body:t,status:i,rawResponse:s,parsedData:u,durationMs:Date.now()-r,modelName:n?.modelName}),u}catch(a){c();let l=this.wrapAbortError(a);throw this.log({method:"POST",path:e,body:t,status:i,rawResponse:s,error:l,durationMs:Date.now()-r,modelName:n?.modelName}),l===a&&this.maybeShowNetworkToast(a),l}}async patch(e,t){let n=Date.now(),r,i,{controller:s,clear:d}=this.createTimeoutController();try{let c=await fetch(`${this.baseUrl}${e}`,{method:"PATCH",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:s.signal});d(),r=c.status;let{raw:a,data:l}=await this.handleResponseWithRaw(c);return i=a,this.log({method:"PATCH",path:e,body:t,status:r,rawResponse:i,parsedData:l,durationMs:Date.now()-n}),l}catch(c){d();let a=this.wrapAbortError(c);throw this.log({method:"PATCH",path:e,body:t,status:r,rawResponse:i,error:a,durationMs:Date.now()-n}),a===c&&this.maybeShowNetworkToast(c),a}}async put(e,t){let n=Date.now(),r,i,{controller:s,clear:d}=this.createTimeoutController();try{let c=await fetch(`${this.baseUrl}${e}`,{method:"PUT",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:s.signal});d(),r=c.status;let{raw:a,data:l}=await this.handleResponseWithRaw(c);return i=a,this.log({method:"PUT",path:e,body:t,status:r,rawResponse:i,parsedData:l,durationMs:Date.now()-n}),l}catch(c){d();let a=this.wrapAbortError(c);throw this.log({method:"PUT",path:e,body:t,status:r,rawResponse:i,error:a,durationMs:Date.now()-n}),a===c&&this.maybeShowNetworkToast(c),a}}async delete(e){let t=Date.now(),n,r,{controller:i,clear:s}=this.createTimeoutController();try{let d=await fetch(`${this.baseUrl}${e}`,{method:"DELETE",headers:this.buildHeaders(),signal:i.signal});s(),n=d.status;let{raw:c,data:a}=await this.handleResponseWithRaw(d);return r=c,this.log({method:"DELETE",path:e,status:n,rawResponse:r,parsedData:a,durationMs:Date.now()-t}),a}catch(d){s();let c=this.wrapAbortError(d);throw this.log({method:"DELETE",path:e,status:n,rawResponse:r,error:c,durationMs:Date.now()-t}),c===d&&this.maybeShowNetworkToast(d),c}}async stream(e,t,n,r,i,s,d,c,a,l,u,f){let m=Date.now(),h=i?.modelName?` [model: ${i.modelName}]`:"",C=[],y=E=>{this.debug&&C.push({t:Date.now()-m,event:E})},{cbs:I,flush:R}=ge({onChunk:n,onDone:r,onState:s,onThinking:d,onCreatedCharacters:c,onReconnect:l,onAborted:u,onBase:f}),Te=new AbortController,k=null,_=null,N=null,D=()=>{k!==null&&(clearTimeout(k),k=null),_!==null&&(clearTimeout(_),_=null)},we=E=>{N=E,D(),Te.abort()};k=setTimeout(()=>we("REQUEST_TIMEOUT"),w.REQUEST_TIMEOUT);let O;try{O=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t),signal:Te.signal})}catch(E){if(D(),N){let v=new g(N,"Request timed out");throw S(N),this.log({method:"STREAM",path:e,body:t,error:v,durationMs:Date.now()-m,modelName:i?.modelName}),v}throw this.maybeShowNetworkToast(E),E}if(k!==null&&(clearTimeout(k),k=null),!O.ok){D();let E=await O.text().catch(()=>""),v={};try{v=JSON.parse(E)}catch{}let b=v.code||"INTERNAL_ERROR",p=v.message||v.error||v.details,Oe=Array.isArray(v.matched_words)?v.matched_words:void 0,Pe=new g(b,p||`HTTP ${O.status}`,Oe);throw S(b,p,Oe),this.log({method:"STREAM",path:e,body:t,status:O.status,rawResponse:E,error:Pe,durationMs:Date.now()-m,modelName:i?.modelName}),Pe}let Ce=O.body?.getReader();if(!Ce)throw D(),new g("INTERNAL_ERROR","No response body for stream");_=setTimeout(()=>we("MODEL_LOADING_TIMEOUT"),w.INITIAL_TIMEOUT);let Re=new TextDecoder,X="",le,re,M="",oe,ie,U="",L=!1,P=null,_e=E=>{if(L)return;let v=E.endsWith("\r")?E.slice(0,-1):E;if(v.startsWith("id: ")){ie=v.slice(4);return}if(!v.startsWith("data: "))return;let b=v.slice(6);if(b==="[DONE]"){y("[DONE]"),L=!0;return}try{let p=JSON.parse(b);y(p),p.type==="done"&&p.id?(X=p.id,le=p.truncated===!0):p.type==="aborted"?(re={id:typeof p.id=="string"?p.id:"",persisted:p.persisted===!0},L=!0):p.type==="error"?(P=new g(p.code||"INTERNAL_ERROR",p.message||"Generation failed",Array.isArray(p.matched_words)?p.matched_words:void 0),L=!0):p.type==="state"?(I.onState?.(p.delta,p.full??null),Array.isArray(p.createdNames)&&p.createdNames.length&&I.onCreatedCharacters?.(p.createdNames)):p.type==="start"?(_!==null&&(clearTimeout(_),_=null),typeof p.base_content=="string"&&f?.(p.base_content)):p.type==="thinking"?(p.status==="start"||p.status==="end")&&I.onThinking?.(p.status):p.content&&(_!==null&&(clearTimeout(_),_=null),M+=p.content,I.onChunk(p.content))}catch{y({raw:b})}ie!==void 0&&(oe=ie,ie=void 0)},Se=()=>{if(D(),P)throw R(),S(P.code,P.message,P.matchedWords),this.log({method:"STREAM",path:e,body:t,error:P,durationMs:Date.now()-m,modelName:i?.modelName}),P;this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${O.status}]${h} (${Date.now()-m}ms) %c\u2713`,"color: #6366f1; font-weight: bold","color: #e0e0e0","color: #22c55e"),console.log("Request:",t),console.log(`Accumulated content (${M.length} chars):`,M),console.log("Message ID:",X),re&&console.log("Aborted:",re),console.log(`SSE events (${C.length}):`,C),console.groupEnd()),G(I,{messageId:X,truncated:le,aborted:re})};try{for(;;){let{done:E,value:v}=await Ce.read();if(E)break;U+=Re.decode(v,{stream:!0});let b=U.split(`
120
+ `;let d=s.querySelector(".storvia-toast-msg");d&&(d.textContent=o);let c=()=>{s.isConnected&&(s.classList.add("leaving"),s.classList.remove("show"),setTimeout(()=>s.remove(),320))};if(n){let a=document.createElement("button");a.type="button",a.className="storvia-toast-action",a.textContent=n.label,a.addEventListener("click",()=>{try{n.onClick()}catch(l){console.error("[Storvia toast] action error:",l)}c()}),s.appendChild(a)}if(i){let a=document.createElement("button");a.type="button",a.className="storvia-toast-close",a.setAttribute("aria-label",ae("close")),a.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',a.addEventListener("click",c),s.appendChild(a)}r.appendChild(s),requestAnimationFrame(()=>s.classList.add("show")),i||setTimeout(c,t)}function mt(o){let e=o.filter(t=>t).map(t=>`\u300C${t}\u300D`).join("");return ae("violationWords").replace("{words}",e)}var ft=3e3,xe={};function Ue(o){let e=Date.now();if(!(e-(xe[o]??0)<ft)){if(xe[o]=e,!pe){console.warn(`[Storvia] navigate \u2192 wallet(${o})\uFF1A\u5F53\u524D\u672A\u68C0\u6D4B\u5230\u5BBF\u4E3B\uFF08dev \u6A21\u5F0F\uFF09\uFF0C\u751F\u4EA7\u73AF\u5883\u7531\u5BBF\u4E3B\u5F39\u5145\u503C\u5F15\u5BFC / \u8DF3\u94B1\u5305\u9875\u3002`);return}try{pe(T("navigate",{target:"wallet",reason:o}))}catch(t){console.error("[Storvia] navigate \u2192 wallet \u901A\u8FC7 bus \u53D1\u9001\u5931\u8D25:",t)}}}function S(o,e,t){if(o==="GENERATION_ABORTED")return;if(o==="INSUFFICIENT_CREDITS")return Ue("insufficient_credits");if(o==="DAISY_CARD_REQUIRED")return Ue("daisy_card_required");let n=o==="VIOLATION_WORD_DETECTED"&&t?.length?mt(t):De(o)||e||ae("unknownError");ee(n,o==="RATE_LIMITED"?"warning":"error")}function vt(o,e){let t=e?.tickMs??100,n=e?.baseLagMs??1e3,r=e?.maxLagMs??2500,i=e?.minCharsPerTick??2,s="",d=null,c=0,a=0,l=()=>Math.min(r,Math.max(n,c*1.35)),u=()=>{let y=Math.max(i,Math.ceil(s.length*t/l()));if(y>=s.length)y=s.length;else{let R=s.charCodeAt(y-1);R>=55296&&R<=56319&&y++}let I=s.slice(0,y);s=s.slice(y),I&&o(I)},f=()=>{d=null,u(),s&&(d=setTimeout(f,t))};return{push:y=>{let I=Date.now();if(a>0){let R=Math.min(I-a,r);c=c>0?c*.7+R*.3:R}a=I,s+=y,d===null&&f()},flush:()=>{d!==null&&(clearTimeout(d),d=null),s&&(o(s),s="")},cancel:()=>{d!==null&&(clearTimeout(d),d=null),s=""}}}function ge(o){let e=vt(o.onChunk);return{cbs:{onChunk:n=>e.push(n),onDone:(n,r)=>{e.flush(),o.onDone(n,r)},onAborted:o.onAborted?n=>{e.flush(),o.onAborted(n)}:void 0,onState:o.onState?(n,r)=>{e.flush(),o.onState(n,r)}:void 0,onThinking:o.onThinking?n=>{e.flush(),o.onThinking(n)}:void 0,onCreatedCharacters:o.onCreatedCharacters?n=>{e.flush(),o.onCreatedCharacters(n)}:void 0,onReconnect:o.onReconnect},flush:()=>e.flush()}}var Fe="0.10.6";function G(o,e){if(e.aborted){if(o.onAborted){o.onAborted(e.aborted);return}o.onDone(e.aborted.id,{truncated:!1});return}o.onDone(e.messageId,e.truncated===void 0?void 0:{truncated:e.truncated})}var w=class w{constructor(e,t,n=!1,r=""){this.baseUrl=e,this.token=t,this.debug=n,this.devApiKey=r}setToken(e){this.token=e}setDebug(e){this.debug=e}maybeShowNetworkToast(e){e instanceof g||S("NETWORK_ERROR")}wrapAbortError(e){if(e instanceof DOMException&&e.name==="AbortError"){let t=new g("REQUEST_TIMEOUT","Request timed out");return S("REQUEST_TIMEOUT"),t}return e}createTimeoutController(){let e=new AbortController,t=setTimeout(()=>e.abort(),w.REQUEST_TIMEOUT);return{controller:e,clear:()=>clearTimeout(t)}}buildHeaders(){let e={"Content-Type":"application/json"};return this.token&&(e.Authorization=`Bearer ${this.token}`),this.devApiKey&&(e["x-api-key"]=this.devApiKey),e["x-client-info"]=`storvia-sdk/${Fe}`,e}log(e){if(!this.debug)return;let{method:t,path:n,body:r,status:i,rawResponse:s,parsedData:d,error:c,durationMs:a,modelName:l}=e,u="%c[Storvia SDK]",f="color: #6366f1; font-weight: bold",m=a!==void 0?` (${a}ms)`:"",h=i!==void 0?` [${i}]`:"",C=l?` [model: ${l}]`:"";c?(console.groupCollapsed(`${u} %c${t} ${n}${h}${C}${m} %c\u2717`,f,"color: #e0e0e0","color: #ef4444"),r!==void 0&&console.log("Request:",r),s!==void 0&&console.log("Response (raw):",s),console.error("Error:",c),console.groupEnd()):(console.groupCollapsed(`${u} %c${t} ${n}${h}${C}${m} %c\u2713`,f,"color: #e0e0e0","color: #22c55e"),r!==void 0&&console.log("Request:",r),s!==void 0&&console.log("Response (raw):",s),d!==void 0&&d!==s&&console.log("Response (data):",d),console.groupEnd())}async get(e,t){let n=new URL(`${this.baseUrl}${e}`);t&&Object.entries(t).forEach(([a,l])=>n.searchParams.set(a,l));let r=Date.now(),i,s,{controller:d,clear:c}=this.createTimeoutController();try{let a=await fetch(n.toString(),{method:"GET",headers:this.buildHeaders(),signal:d.signal});c(),i=a.status;let{raw:l,data:u}=await this.handleResponseWithRaw(a);return s=l,this.log({method:"GET",path:e,body:t,status:i,rawResponse:s,parsedData:u,durationMs:Date.now()-r}),u}catch(a){c();let l=this.wrapAbortError(a);throw this.log({method:"GET",path:e,body:t,status:i,rawResponse:s,error:l,durationMs:Date.now()-r}),l===a&&this.maybeShowNetworkToast(a),l}}async post(e,t,n){let r=Date.now(),i,s,{controller:d,clear:c}=this.createTimeoutController();try{let a=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:d.signal});c(),i=a.status;let{raw:l,data:u}=await this.handleResponseWithRaw(a);return s=l,this.log({method:"POST",path:e,body:t,status:i,rawResponse:s,parsedData:u,durationMs:Date.now()-r,modelName:n?.modelName}),u}catch(a){c();let l=this.wrapAbortError(a);throw this.log({method:"POST",path:e,body:t,status:i,rawResponse:s,error:l,durationMs:Date.now()-r,modelName:n?.modelName}),l===a&&this.maybeShowNetworkToast(a),l}}async patch(e,t){let n=Date.now(),r,i,{controller:s,clear:d}=this.createTimeoutController();try{let c=await fetch(`${this.baseUrl}${e}`,{method:"PATCH",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:s.signal});d(),r=c.status;let{raw:a,data:l}=await this.handleResponseWithRaw(c);return i=a,this.log({method:"PATCH",path:e,body:t,status:r,rawResponse:i,parsedData:l,durationMs:Date.now()-n}),l}catch(c){d();let a=this.wrapAbortError(c);throw this.log({method:"PATCH",path:e,body:t,status:r,rawResponse:i,error:a,durationMs:Date.now()-n}),a===c&&this.maybeShowNetworkToast(c),a}}async put(e,t){let n=Date.now(),r,i,{controller:s,clear:d}=this.createTimeoutController();try{let c=await fetch(`${this.baseUrl}${e}`,{method:"PUT",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:s.signal});d(),r=c.status;let{raw:a,data:l}=await this.handleResponseWithRaw(c);return i=a,this.log({method:"PUT",path:e,body:t,status:r,rawResponse:i,parsedData:l,durationMs:Date.now()-n}),l}catch(c){d();let a=this.wrapAbortError(c);throw this.log({method:"PUT",path:e,body:t,status:r,rawResponse:i,error:a,durationMs:Date.now()-n}),a===c&&this.maybeShowNetworkToast(c),a}}async delete(e){let t=Date.now(),n,r,{controller:i,clear:s}=this.createTimeoutController();try{let d=await fetch(`${this.baseUrl}${e}`,{method:"DELETE",headers:this.buildHeaders(),signal:i.signal});s(),n=d.status;let{raw:c,data:a}=await this.handleResponseWithRaw(d);return r=c,this.log({method:"DELETE",path:e,status:n,rawResponse:r,parsedData:a,durationMs:Date.now()-t}),a}catch(d){s();let c=this.wrapAbortError(d);throw this.log({method:"DELETE",path:e,status:n,rawResponse:r,error:c,durationMs:Date.now()-t}),c===d&&this.maybeShowNetworkToast(d),c}}async stream(e,t,n,r,i,s,d,c,a,l,u,f){let m=Date.now(),h=i?.modelName?` [model: ${i.modelName}]`:"",C=[],y=E=>{this.debug&&C.push({t:Date.now()-m,event:E})},{cbs:I,flush:R}=ge({onChunk:n,onDone:r,onState:s,onThinking:d,onCreatedCharacters:c,onReconnect:l,onAborted:u,onBase:f}),Te=new AbortController,k=null,_=null,N=null,D=()=>{k!==null&&(clearTimeout(k),k=null),_!==null&&(clearTimeout(_),_=null)},we=E=>{N=E,D(),Te.abort()};k=setTimeout(()=>we("REQUEST_TIMEOUT"),w.REQUEST_TIMEOUT);let O;try{O=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t),signal:Te.signal})}catch(E){if(D(),N){let v=new g(N,"Request timed out");throw S(N),this.log({method:"STREAM",path:e,body:t,error:v,durationMs:Date.now()-m,modelName:i?.modelName}),v}throw this.maybeShowNetworkToast(E),E}if(k!==null&&(clearTimeout(k),k=null),!O.ok){D();let E=await O.text().catch(()=>""),v={};try{v=JSON.parse(E)}catch{}let b=v.code||"INTERNAL_ERROR",p=v.message||v.error||v.details,Oe=Array.isArray(v.matched_words)?v.matched_words:void 0,Pe=new g(b,p||`HTTP ${O.status}`,Oe);throw S(b,p,Oe),this.log({method:"STREAM",path:e,body:t,status:O.status,rawResponse:E,error:Pe,durationMs:Date.now()-m,modelName:i?.modelName}),Pe}let Ce=O.body?.getReader();if(!Ce)throw D(),new g("INTERNAL_ERROR","No response body for stream");_=setTimeout(()=>we("MODEL_LOADING_TIMEOUT"),w.INITIAL_TIMEOUT);let Re=new TextDecoder,X="",le,re,M="",oe,ie,U="",L=!1,P=null,_e=E=>{if(L)return;let v=E.endsWith("\r")?E.slice(0,-1):E;if(v.startsWith("id: ")){ie=v.slice(4);return}if(!v.startsWith("data: "))return;let b=v.slice(6);if(b==="[DONE]"){y("[DONE]"),L=!0;return}try{let p=JSON.parse(b);y(p),p.type==="done"&&p.id?(X=p.id,le=p.truncated===!0):p.type==="aborted"?(re={id:typeof p.id=="string"?p.id:"",persisted:p.persisted===!0},L=!0):p.type==="error"?(P=new g(p.code||"INTERNAL_ERROR",p.message||"Generation failed",Array.isArray(p.matched_words)?p.matched_words:void 0),L=!0):p.type==="state"?(I.onState?.(p.delta,p.full??null),Array.isArray(p.createdNames)&&p.createdNames.length&&I.onCreatedCharacters?.(p.createdNames)):p.type==="start"?(_!==null&&(clearTimeout(_),_=null),typeof p.base_content=="string"&&f?.(p.base_content)):p.type==="thinking"?(p.status==="start"||p.status==="end")&&I.onThinking?.(p.status):p.content&&(_!==null&&(clearTimeout(_),_=null),M+=p.content,I.onChunk(p.content))}catch{y({raw:b})}ie!==void 0&&(oe=ie,ie=void 0)},Se=()=>{if(D(),P)throw R(),S(P.code,P.message,P.matchedWords),this.log({method:"STREAM",path:e,body:t,error:P,durationMs:Date.now()-m,modelName:i?.modelName}),P;this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${O.status}]${h} (${Date.now()-m}ms) %c\u2713`,"color: #6366f1; font-weight: bold","color: #e0e0e0","color: #22c55e"),console.log("Request:",t),console.log(`Accumulated content (${M.length} chars):`,M),console.log("Message ID:",X),re&&console.log("Aborted:",re),console.log(`SSE events (${C.length}):`,C),console.groupEnd()),G(I,{messageId:X,truncated:le,aborted:re})};try{for(;;){let{done:E,value:v}=await Ce.read();if(E)break;U+=Re.decode(v,{stream:!0});let b=U.split(`
121
121
  `);U=b.pop()??"";for(let p of b)_e(p);if(L){Se();return}}if(U+=Re.decode(),U&&_e(U),L){Se();return}}catch(E){if(D(),P)throw P;if(N){let v=new g(N,"Stream did not start in time");if(this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${O.status}]${h} (${Date.now()-m}ms) %c\u2717 ${N}`,"color: #6366f1; font-weight: bold","color: #e0e0e0","color: #ef4444"),console.log("Request:",t),console.log(`Accumulated content (${M.length} chars):`,M),console.log(`SSE events (${C.length}):`,C),console.error("Timeout:",v),console.groupEnd()),a){await this.resumeLoop(a,oe,I,{finalize:!0});return}throw S(N),R(),v}if(this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${O.status}]${h} (${Date.now()-m}ms) %c\u2717`,"color: #6366f1; font-weight: bold","color: #e0e0e0","color: #ef4444"),console.log("Request:",t),console.log(`Accumulated content (${M.length} chars):`,M),console.log(`SSE events (${C.length}):`,C),console.error("Stream error:",E),console.groupEnd()),a){await this.resumeLoop(a,oe,I,{finalize:!0});return}throw R(),E}if(D(),X){G(I,{messageId:X,truncated:le});return}if(a){await this.resumeLoop(a,oe,I,{finalize:!0});return}R()}async resumeLoop(e,t,n,r){let i=t;for(let d=1;d<=w.RECONNECT_MAX_ATTEMPTS;d++){let c=Math.min(w.RECONNECT_BACKOFF_CAP,1e3*2**(d-1));await new Promise(u=>setTimeout(u,c)),n.onReconnect?.({attempt:d});let a={messageId:"",lastId:i},l;try{l=await this.pumpGetStream(e.conversationId,e.topic,i,a,n)}catch{continue}if(i=a.lastId??i,l==="done"){if(a.errorCode)throw this.terminalError(a);G(n,a);return}if(l==="inactive"){(a.messageId||r?.finalize)&&G(n,a);return}}let s=new g("STREAM_INTERRUPTED","Stream reconnection failed after maximum attempts");throw S("STREAM_INTERRUPTED"),s}async resumeStream(e,t,n){let{cbs:r}=ge(n),i={messageId:""},s;try{s=await this.pumpGetStream(e,t,void 0,i,r)}catch{await this.resumeLoop({conversationId:e,topic:t},i.lastId,r);return}if(s==="done"){if(i.errorCode)throw this.terminalError(i);G(r,i);return}if(s==="inactive"){i.messageId&&G(r,i);return}await this.resumeLoop({conversationId:e,topic:t},i.lastId,r)}terminalError(e){let t=new g(e.errorCode??"INTERNAL_ERROR",e.errorMessage||"Generation failed",e.errorMatchedWords);return S(t.code,t.message,t.matchedWords),t}async pumpGetStream(e,t,n,r,i){let s=new URL(`${this.baseUrl}/conversations/${encodeURIComponent(e)}/stream`);n&&s.searchParams.set("from",n),t&&s.searchParams.set("topic",t);let d=new AbortController,c=setTimeout(()=>d.abort(),w.REQUEST_TIMEOUT),a;try{a=await fetch(s.toString(),{method:"GET",headers:this.buildHeaders(),signal:d.signal})}finally{clearTimeout(c)}if(!a.ok)throw new g("STREAM_INTERRUPTED",`Resume HTTP ${a.status}`);if(!(a.headers.get("content-type")||"").includes("text/event-stream"))return"inactive";let u=a.body?.getReader();return u?await this.pumpReader(u,r,i):"inactive"}async pumpReader(e,t,n){let r=new TextDecoder,i,s=null,d=()=>{s&&clearTimeout(s),s=setTimeout(()=>{e.cancel().catch(()=>{})},w.RESUME_STALL_TIMEOUT)};d();let c="",a=!1,l=u=>{if(a)return;let f=u.endsWith("\r")?u.slice(0,-1):u;if(f.startsWith("id: ")){i=f.slice(4);return}if(!f.startsWith("data: "))return;let m=f.slice(6);if(m==="[DONE]"){a=!0;return}try{let h=JSON.parse(m);h.type==="done"&&h.id?(t.messageId=h.id,t.truncated=h.truncated===!0):h.type==="aborted"?(t.aborted={id:typeof h.id=="string"?h.id:"",persisted:h.persisted===!0},a=!0):h.type==="error"?(t.errorCode=h.code||"INTERNAL_ERROR",t.errorMessage=h.message||"Generation failed",Array.isArray(h.matched_words)&&(t.errorMatchedWords=h.matched_words),a=!0):h.type==="state"?(n.onState?.(h.delta,h.full??null),Array.isArray(h.createdNames)&&h.createdNames.length&&n.onCreatedCharacters?.(h.createdNames)):h.type==="start"?typeof h.base_content=="string"&&n.onBase?.(h.base_content):h.type==="thinking"?(h.status==="start"||h.status==="end")&&n.onThinking?.(h.status):h.content&&n.onChunk(h.content)}catch{}i!==void 0&&(t.lastId=i,i=void 0)};try{for(;;){let{done:u,value:f}=await e.read();if(u)break;d(),c+=r.decode(f,{stream:!0});let m=c.split(`
122
122
  `);c=m.pop()??"";for(let h of m)l(h);if(a)return s&&clearTimeout(s),"done"}if(c+=r.decode(),c&&l(c),a)return s&&clearTimeout(s),"done"}catch{}finally{s&&clearTimeout(s)}return"eof"}async handleResponseWithRaw(e){let t=await e.text(),n;try{n=t?JSON.parse(t):null}catch{n=t}if(!e.ok){let r=n&&typeof n=="object"?n:{},i={401:"UNAUTHORIZED",402:"INSUFFICIENT_CREDITS",429:"RATE_LIMITED"},s=r.code||i[e.status]||"INTERNAL_ERROR",d=Array.isArray(r.matched_words)?r.matched_words:void 0,c=new g(s,r.message||`HTTP ${e.status}`,d);throw S(s,r.message,d),c}return n&&typeof n=="object"&&"data"in n?{raw:n,data:n.data}:{raw:n,data:n}}};w.REQUEST_TIMEOUT=6e4,w.INITIAL_TIMEOUT=3e4,w.RESUME_STALL_TIMEOUT=6e4,w.RECONNECT_MAX_ATTEMPTS=10,w.RECONNECT_BACKOFF_CAP=15e3;var te=w;var We="storvia_chat_main";function It(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let o=new Uint8Array(16);crypto.getRandomValues(o),o[6]=o[6]&15|64,o[8]=o[8]&63|128;let e=Array.from(o,t=>t.toString(16).padStart(2,"0")).join("");return`${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20)}`}var Ve=20,He=40,V=class{constructor(e,t,n,r,i=!1,s,d,c){this.http=e;this.getGameId=t;this.getConversationId=n;this.getModelId=r;this.isPreview=i;this.previewHistory=[];this.previewConfig=s,this.getModelName=d,this.getPreset=c}reqMeta(){let e=this.getModelName?.();return e?{modelName:e}:void 0}updatePreviewConfig(e){this.previewConfig=e}async send(e){if(this.isPreview)return this.sendPreview(e);let t={game_id:this.getGameId(),conversation_id:this.getConversationId(),model_id:this.getModelId(),message:e.message,topic:e.topic,scene_key:e.sceneKey,extract:e.extract,stream:e.stream??!1,preset:this.getPreset?.(),client_message_uuid:It()};if(e.stream){await this.http.stream("/chat",t,e.onChunk??(()=>{}),e.onDone??(()=>{}),this.reqMeta(),F(e.onState),e.onThinking,e.onCreatedCharacters,{conversationId:this.getConversationId(),topic:e.topic},e.onReconnecting,e.onAborted);return}return this.http.post("/chat",t,this.reqMeta())}async save(e){return this.isPreview?{id:`preview-${Date.now()}`}:this.http.post("/messages/save",{game_id:this.getGameId(),conversation_id:this.getConversationId(),role:e.role,content:e.content,topic:e.topic})}async generate(e){if(this.isPreview)return this.sendPreview({message:"",topic:e.topic,sceneKey:e.sceneKey,stream:e.stream,onChunk:e.onChunk,onDone:e.onDone,onState:e.onState,onThinking:e.onThinking,onCreatedCharacters:e.onCreatedCharacters});let t={game_id:this.getGameId(),conversation_id:this.getConversationId(),model_id:this.getModelId(),topic:e.topic,scene_key:e.sceneKey,extract:e.extract,stream:e.stream??!1,preset:this.getPreset?.()};if(e.stream){await this.http.stream("/generate",t,e.onChunk??(()=>{}),e.onDone??(()=>{}),this.reqMeta(),F(e.onState),e.onThinking,e.onCreatedCharacters,{conversationId:this.getConversationId(),topic:e.topic},e.onReconnecting,e.onAborted);return}return this.http.post("/generate",t,this.reqMeta())}async once(e){if(this.isPreview)return this.oncePreview(e);let t={game_id:this.getGameId(),conversation_id:this.getConversationId(),model_id:this.getModelId(),message:e.message,scene_key:e.sceneKey,stream:e.stream===!0,preset:this.getPreset?.()};if(!e.stream)return this.http.post("/once",t,this.reqMeta());let n="";return await this.http.stream("/once",t,r=>{n+=r,e.onChunk?.(r)},()=>{},this.reqMeta(),void 0,e.onThinking),{content:n}}async oncePreview(e){let t={model_id:this.getModelId(),message:e.message,scene_key:e.sceneKey,history_messages:[],preset:this.getPreset?.()};this.previewConfig?t.prompt_config=this.previewConfig:t.game_id=this.getGameId();let n=this.previewConfig;n?.reply_length&&(t.reply_length=n.reply_length),n?.reply_language&&(t.reply_language=n.reply_language);let r="";return await this.http.stream("/preview",t,i=>{r+=i,e.onChunk?.(i)},()=>{},this.reqMeta(),void 0,e.onThinking),{content:r}}async retry(e={}){if(this.isPreview)throw new g("NOT_SUPPORTED_IN_PREVIEW","storvia.chat.retry() is not available in preview mode. Publish the game and test on the Storvia platform.");let t={game_id:this.getGameId(),conversation_id:this.getConversationId(),model_id:this.getModelId(),topic:e.topic,scene_key:e.sceneKey,extract:e.extract,stream:e.stream??!1,preset:this.getPreset?.()};if(e.stream){await this.http.stream("/retry",t,e.onChunk??(()=>{}),e.onDone??(()=>{}),this.reqMeta(),F(e.onState),e.onThinking,e.onCreatedCharacters,{conversationId:this.getConversationId(),topic:e.topic},e.onReconnecting,e.onAborted);return}return this.http.post("/retry",t,this.reqMeta())}async continue(e={}){if(this.isPreview)return;let t={conversation_id:this.getConversationId(),topic:e.topic??null,game_id:this.getGameId(),preset:this.getPreset?.(),scene_key:e.sceneKey,extract:e.extract};await this.http.stream("/continue",t,e.onChunk??(()=>{}),e.onDone??(()=>{}),this.reqMeta(),F(e.onState),e.onThinking,e.onCreatedCharacters,{conversationId:this.getConversationId(),topic:e.topic},e.onReconnecting,e.onAborted,e.onBase)}async cancel(e={}){if(this.isPreview)return{active:!1};let t=await this.http.post(`/conversations/${encodeURIComponent(this.getConversationId())}/cancel`,{topic:e.topic});return{active:t.active===!0,generationId:t.generation_id}}async messages(e){if(this.isPreview)return{data:[],hasMore:!1,nextCursor:null};let t={conversation_id:this.getConversationId(),order:e.order,limit:String(e.limit??20)};e.topic&&(t.topic=e.topic),e.cursor&&(t.cursor_uuid=e.cursor.uuid,t.cursor_created_at=e.cursor.createdAt);let n=await this.http.get("/messages",t);return{data:n.messages.map(r=>({uuid:r.uuid,role:r.role,content:r.content,topic:r.topic,status:r.status,model:r.model,createdAt:r.created_at,truncated:r.truncated===!0})),hasMore:n.has_more,nextCursor:n.next_cursor?{uuid:n.next_cursor.cursor_uuid,createdAt:n.next_cursor.cursor_created_at}:null}}async edit(e){if(this.isPreview)throw new g("NOT_SUPPORTED_IN_PREVIEW","storvia.chat.edit() is not available in preview mode. Publish the game and test on the Storvia platform.");let t=await this.http.patch(`/messages/${encodeURIComponent(e.uuid)}`,{content:e.content});return{uuid:t.uuid,role:t.role,content:t.content,updatedAt:t.updated_at}}async delete(e){if(this.isPreview)throw new g("NOT_SUPPORTED_IN_PREVIEW","storvia.chat.delete() is not available in preview mode. Publish the game and test on the Storvia platform.");return{uuid:(await this.http.delete(`/messages/${encodeURIComponent(e.uuid)}`)).uuid}}async rollback(e){if(this.isPreview)throw new g("NOT_SUPPORTED_IN_PREVIEW","storvia.chat.rollback() is not available in preview mode. Publish the game and test on the Storvia platform.");let t=await this.http.post(`/messages/${encodeURIComponent(e.uuid)}/rollback`,{});return{deletedCount:t.deleted_count,deletedUuids:t.deleted_uuids,restoredGameState:t.restored_game_state}}async resume(e={}){this.isPreview||await this.http.resumeStream(this.getConversationId(),e.topic,{onChunk:e.onChunk??(()=>{}),onDone:e.onDone??(()=>{}),onState:F(e.onState),onThinking:e.onThinking,onCreatedCharacters:e.onCreatedCharacters,onReconnect:e.onReconnecting,onAborted:e.onAborted})}async sendPreview(e){let t=e.message.trim().length>0,n=this.previewHistory.slice(t?-(Ve-1):-Ve);t&&this.pushPreviewHistory({role:"user",content:e.message});let r={model_id:this.getModelId(),message:e.message,topic:e.topic,scene_key:e.sceneKey,history_messages:n,preset:this.getPreset?.()};this.previewConfig?r.prompt_config=this.previewConfig:r.game_id=this.getGameId();let i=this.previewConfig;if(i?.reply_length&&(r.reply_length=i.reply_length),i?.reply_language&&(r.reply_language=i.reply_language),e.stream){let u="";await this.http.stream("/preview",r,f=>{u+=f,e.onChunk?.(f)},(f,m)=>{u&&this.pushPreviewHistory({role:"assistant",content:u}),e.onDone?.(f,m)},this.reqMeta(),F(e.onState),e.onThinking,e.onCreatedCharacters);return}let s="",d=null,c=null,a=[];await this.http.stream("/preview",r,u=>{s+=u},()=>{},this.reqMeta(),(u,f)=>{d=u,c=f,e.onState&&e.onState(d,c)},void 0,u=>{a=u,e.onCreatedCharacters&&e.onCreatedCharacters(u)}),s&&this.pushPreviewHistory({role:"assistant",content:s});let l={id:"",content:s,truncated:!1};return d&&(l.delta=d,c&&(l.full=c)),a.length&&(l.createdNames=a),l}pushPreviewHistory(e){this.previewHistory.push(e),this.previewHistory.length>He&&this.previewHistory.splice(0,this.previewHistory.length-He)}};function F(o){if(o)return(e,t)=>o(e,t)}var me=class{constructor(e,t,n=!1,r){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem={};r&&(this.mem={...r})}setInitial(e){this.mem=e?{...e}:{}}async get(e,t){if(this.isPreview){let r=this.mem[e]||{};return t?{...r[t]||{}}:{...r}}let n=t?{group:t}:void 0;return this.http.get(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/state`,n)}async update(e,t,n){if(this.isPreview){let r=this.mem[e]||(this.mem[e]={});r[t]={...r[t]||{},...n};return}await this.http.patch(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/state`,{group:t,values:n})}async remove(e,t,n){if(n.length){if(this.isPreview){let r=this.mem[e]?.[t];if(r)for(let i of n)delete r[i];return}await this.http.patch(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/state`,{group:t,removeKeys:n})}}async removeGroup(e,t){if(this.isPreview){let n=this.mem[e];n&&delete n[t];return}await this.http.patch(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/state`,{group:t,removeGroup:!0})}},H=class{constructor(e,t,n=!1,r,i){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem=[];r&&(this.mem=r.map(Be)),this.state=new me(e,t,n,i)}setInitial(e,t){this.mem=e?e.map(Be):[],this.state.setInitial(t)}async list(){return this.isPreview?this.mem.map(je):this.http.get(`/conversations/${this.getConversationId()}/characters`)}async get(e){if(this.isPreview){let t=this.mem.find(n=>n.name===e);return t?je(t):{name:e}}return this.http.get(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}`)}async add(e){if(this.isPreview){this.mem.push({...e,isPreset:!1});return}await this.http.post(`/conversations/${this.getConversationId()}/characters`,e)}async update(e,t){if(this.isPreview){let n=this.mem.find(r=>r.name===e);n&&Object.assign(n,t);return}await this.http.patch(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}`,t)}async remove(e){if(this.isPreview){this.mem=this.mem.filter(t=>t.name!==e);return}await this.http.delete(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}`)}async merge(e,t){if(this.isPreview){if(this.mem.find(r=>r.name===e)?.isPreset)throw new g("INVALID_REQUEST","\u9884\u8BBE\u89D2\u8272\u4E0D\u53EF\u88AB\u5408\u5E76");if(e===t||!this.mem.some(r=>r.name===t))throw new g("INVALID_REQUEST","\u76EE\u6807\u89D2\u8272\u4E0D\u5B58\u5728\u6216\u4E0E\u6765\u6E90\u76F8\u540C");this.mem=this.mem.filter(r=>r.name!==e);return}await this.http.post(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/merge`,{target:t})}async detail(e){if(this.isPreview){let t=this.mem.find(n=>n.name===e);return{name:e,avatar:t?.avatar,description:t?.description,...t?.introduction!==void 0?{introduction:t.introduction}:{},...t?.visibleAtStart!==void 0?{visibleAtStart:t.visibleAtStart}:{},userDescription:t?.userDescription,...t?.gender?{gender:t.gender}:{},...t?.isPreset!==void 0?{isPreset:t.isPreset}:{},state:await this.state.get(e)}}return this.http.get(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/detail`)}async setPriority(e,t){let n=Math.max(0,Math.min(100,Math.round(t)));this.isPreview||await this.http.patch(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/state`,{priority:n})}};function Be(o){return{name:o.name,description:o.description,avatar:o.avatar,...o.introduction!==void 0?{introduction:o.introduction}:{},...o.visibleAtStart!==void 0?{visibleAtStart:o.visibleAtStart}:{},...o.gender?{gender:o.gender}:{},...o.userDescription!==void 0?{userDescription:o.userDescription}:{},...o.isPreset!==void 0?{isPreset:o.isPreset}:{}}}function je(o){return{name:o.name,avatar:o.avatar,description:o.description,...o.introduction!==void 0?{introduction:o.introduction}:{},...o.visibleAtStart!==void 0?{visibleAtStart:o.visibleAtStart}:{},...o.userDescription!==void 0?{userDescription:o.userDescription}:{},...o.gender?{gender:o.gender}:{},...o.isPreset!==void 0?{isPreset:o.isPreset}:{}}}var W=class{constructor(e,t,n=!1,r){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem=[];r&&(this.mem=r.map(i=>({...i})))}setInitial(e){this.mem=e?e.map(t=>({...t})):[]}async list(){return this.isPreview?[...this.mem]:this.http.get(`/conversations/${this.getConversationId()}/relationships`)}async get(e,t){if(this.isPreview){let n=this.mem.find(r=>r.from===e&&r.to===t);if(n)return{...n};throw new Error("Relationship not found")}return this.http.get(`/conversations/${this.getConversationId()}/relationships/${encodeURIComponent(e)}/${encodeURIComponent(t)}`)}async add(e){if(this.isPreview){this.mem.push({...e});return}await this.http.post(`/conversations/${this.getConversationId()}/relationships`,e)}async update(e,t,n){if(this.isPreview){let r=this.mem.find(i=>i.from===e&&i.to===t);r?Object.assign(r,n):this.mem.push({from:e,to:t,...n});return}await this.http.patch(`/conversations/${this.getConversationId()}/relationships/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,n)}async remove(e,t){if(this.isPreview){this.mem=this.mem.filter(n=>!(n.from===e&&n.to===t));return}await this.http.delete(`/conversations/${this.getConversationId()}/relationships/${encodeURIComponent(e)}/${encodeURIComponent(t)}`)}};function Ke(o){let e={count:o.count};return o.desc!==void 0&&(e.desc=o.desc),o.icon_url!==void 0&&(e.iconUrl=o.icon_url),e}function fe(o){let e={};if(!o)return e;for(let[t,n]of Object.entries(o)){let r={};for(let[i,s]of Object.entries(n))r[i]=Ke(s);e[t]=r}return e}function Et(o){let e={};if(!o)return e;for(let[t,n]of Object.entries(o))e[t]=Ke(n);return e}var B=class{constructor(e,t,n=!1,r){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem={};r&&(this.mem=fe(r))}setInitial(e){this.mem=e?fe(e):{}}async list(e){if(this.isPreview){if(e!==void 0)return{...this.mem[e]||{}};let n={};for(let[r,i]of Object.entries(this.mem))n[r]={...i};return n}if(e!==void 0){let n=await this.http.get(`/conversations/${this.getConversationId()}/inventory/${encodeURIComponent(e)}`);return Et(n)}let t=await this.http.get(`/conversations/${this.getConversationId()}/inventory`);return fe(t)}async add(e){let{group:t,name:n,count:r=1,desc:i,iconUrl:s}=e;if(this.isPreview){if(!this.mem[t])throw new Error(`Group "${t}" does not exist`);if(n in this.mem[t])throw new Error(`Item "${n}" already exists in group "${t}"`);let c={count:r};i!==void 0&&(c.desc=i),s!==void 0&&(c.iconUrl=s),this.mem[t][n]=c;return}let d={group:t,name:n,count:r};i!==void 0&&(d.desc=i),s!==void 0&&(d.icon_url=s),await this.http.post(`/conversations/${this.getConversationId()}/inventory`,d)}async update(e){let{group:t,name:n,count:r,desc:i,iconUrl:s}=e;if(this.isPreview){let c=this.mem[t];if(!c||!(n in c))throw new Error(`Item "${t}/${n}" not found`);let a=c[n];r!==void 0&&(a.count=r),i!==void 0&&(a.desc=i),s!==void 0&&(a.iconUrl=s);return}let d={};r!==void 0&&(d.count=r),i!==void 0&&(d.desc=i),s!==void 0&&(d.icon_url=s),await this.http.patch(`/conversations/${this.getConversationId()}/inventory/${encodeURIComponent(t)}/${encodeURIComponent(n)}`,d)}async remove(e){let{group:t,name:n}=e;if(this.isPreview){this.mem[t]&&delete this.mem[t][n];return}await this.http.delete(`/conversations/${this.getConversationId()}/inventory/${encodeURIComponent(t)}/${encodeURIComponent(n)}`)}async removeBatch(e){if(this.isPreview){for(let{group:t,name:n}of e)this.mem[t]&&delete this.mem[t][n];return}e.length!==0&&await this.http.post(`/conversations/${this.getConversationId()}/inventory/batch-delete`,{items:e})}async move(e){let{fromGroup:t,toGroup:n,name:r,newName:i}=e;if(this.isPreview){let s=this.mem[t];if(!s||!(r in s))throw new Error(`Source item "${t}/${r}" not found`);if(!this.mem[n])throw new Error(`Target group "${n}" does not exist`);let d=i||r;if(t===n&&d===r)return;if(d in this.mem[n])throw new Error(`Item "${d}" already exists in target group`);this.mem[n][d]=s[r],delete s[r];return}await this.http.post(`/conversations/${this.getConversationId()}/inventory/move`,{fromGroup:t,toGroup:n,name:r,newName:i})}async ensureGroup(e){if(this.isPreview){this.mem[e]||(this.mem[e]={});return}await this.http.post(`/conversations/${this.getConversationId()}/inventory/groups/${encodeURIComponent(e)}`,{})}async removeGroup(e,t){let n=t?.cascade??!1;if(this.isPreview){let i=this.mem[e];if(i&&Object.keys(i).length>0&&!n)throw new Error(`Group "${e}" is not empty, pass cascade: true to force delete`);delete this.mem[e];return}let r=n?"?cascade=true":"";await this.http.delete(`/conversations/${this.getConversationId()}/inventory/groups/${encodeURIComponent(e)}${r}`)}};var j=class{constructor(e,t,n=!1,r){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem={};r&&(this.mem={...r})}setInitial(e){this.mem=e?{...e}:{}}async get(){return this.isPreview?{...this.mem}:this.http.get(`/conversations/${this.getConversationId()}/world`)}async update(e){if(this.isPreview){Object.assign(this.mem,e);return}await this.http.patch(`/conversations/${this.getConversationId()}/world`,e)}};var ve=class{constructor(e,t,n=!1,r){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem={};r&&(this.mem={...r})}setInitial(e){this.mem=e?{...e}:{}}async get(e){if(this.isPreview)return e?{...this.mem[e]||{}}:{...this.mem};let t=e?{group:e}:void 0;return this.http.get(`/conversations/${this.getConversationId()}/player/state`,t)}async update(e,t){if(this.isPreview){this.mem[e]={...this.mem[e]||{},...t};return}await this.http.patch(`/conversations/${this.getConversationId()}/player/state`,{group:e,values:t})}async remove(e,t){if(t.length){if(this.isPreview){let n=this.mem[e];if(n)for(let r of t)delete n[r];return}await this.http.patch(`/conversations/${this.getConversationId()}/player/state`,{group:e,removeKeys:t})}}async removeGroup(e){if(this.isPreview){delete this.mem[e];return}await this.http.patch(`/conversations/${this.getConversationId()}/player/state`,{group:e,removeGroup:!0})}},K=class{constructor(e,t,n=!1,r,i){this.http=e;this.getConversationId=t;this.isPreview=n;this.memPersona={name:""};r&&(this.memPersona={...r}),this.state=new ve(e,t,n,i)}setInitial(e,t){this.memPersona=e?{...e}:{name:""},this.state.setInitial(t)}async get(){return this.isPreview?{...this.memPersona}:this.http.get(`/conversations/${this.getConversationId()}/player`)}async update(e){if(this.isPreview){Object.assign(this.memPersona,e);return}await this.http.patch(`/conversations/${this.getConversationId()}/player`,e)}};function q(o,e){if(!e)return o;let t=o.includes("?")?"&":"?";return`${o}${t}game_id=${encodeURIComponent(e)}`}var z=class{constructor(e,t,n,r=!1,i,s){this.http=e;this.getConversationId=t;this.getGameId=n;this.isPreview=r;this.mem={};this.memInject={};i&&(this.mem=qe(i)),s&&(this.memInject={...s})}setInitial(e,t){this.mem=e?qe(e):{},this.memInject=t?{...t}:{}}async get(e){if(this.isPreview)return e!==void 0?this.mem[e]:{...this.mem};let t=await this.http.get(q(`/conversations/${this.getConversationId()}/custom`,this.getGameId()));return e!==void 0?t[e]:t}async set(e,t){if(this.isPreview){for(let[r,i]of Object.entries(e))typeof i=="object"&&i!==null&&typeof this.mem[r]=="object"&&this.mem[r]!==null?this.mem[r]={...this.mem[r],...i}:this.mem[r]=i,t?.inject!==void 0&&(this.memInject[r]=t.inject);return}let n=t?.inject!==void 0?{data:e,inject:t.inject}:e;await this.http.patch(q(`/conversations/${this.getConversationId()}/custom`,this.getGameId()),n)}async setInject(e,t){if(this.isPreview){this.memInject[e]=t;return}await this.http.patch(q(`/conversations/${this.getConversationId()}/custom/inject/${encodeURIComponent(e)}`,this.getGameId()),{inject:t})}getInject(){return{...this.memInject}}async delete(e){if(this.isPreview){delete this.mem[e],delete this.memInject[e];return}await this.http.delete(q(`/conversations/${this.getConversationId()}/custom/${encodeURIComponent(e)}`,this.getGameId()))}async setGroupField(e,t,n){if(this.isPreview){(!this.mem[e]||typeof this.mem[e]!="object")&&(this.mem[e]={}),this.mem[e][t]=n;return}await this.http.patch(q(`/conversations/${this.getConversationId()}/custom/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,this.getGameId()),{value:n})}async deleteGroupField(e,t){if(this.isPreview){if(typeof this.mem[e]=="object"&&this.mem[e]!==null){let n=this.mem[e];delete n[t]}return}await this.http.delete(q(`/conversations/${this.getConversationId()}/custom/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,this.getGameId()))}};function qe(o){let e={};for(let[t,n]of Object.entries(o))typeof n=="object"&&n!==null&&!Array.isArray(n)?e[t]={...n}:e[t]=n;return e}function ze(o,e){if(!e)return o;let t=o.includes("?")?"&":"?";return`${o}${t}game_id=${encodeURIComponent(e)}`}var Y=class{constructor(e,t,n,r=!1,i){this.http=e;this.getConversationId=t;this.getGameId=n;this.isPreview=r;this.mem={};i&&(this.mem={...i})}setInitial(e){this.mem=e?{...e}:{}}async get(){return this.isPreview?{...this.mem}:await this.http.get(ze(`/conversations/${this.getConversationId()}/save`,this.getGameId()))}async set(e){if(this.isPreview){this.mem={...e};return}await this.http.put(ze(`/conversations/${this.getConversationId()}/save`,this.getGameId()),e)}};var Q=class{constructor(e,t,n=!1){this.http=e;this.getConversationId=t;this.isPreview=n}async get(){if(this.isPreview)throw new g("NOT_SUPPORTED_IN_PREVIEW","storvia.state.get() is not available in preview mode. Publish the game and test on the Storvia platform. (Use per-module get() like storvia.world.get() if you need to inspect state during preview.)");return this.http.get(`/conversations/${this.getConversationId()}/state`)}};var Z=class{constructor(e,t,n=!1){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem=null;this.wb=null;this.worldbook={get:async()=>this.isPreview?this.wb?Ye(this.wb):null:(await this.http.get(`/conversations/${this.getConversationId()}/worldbook`)).worldbook,update:async e=>{let t=typeof e=="string"?{content:e}:{...e};if(t.content!==void 0&&(t.content=(t.content??"").trim()),t.entries!==void 0&&(t.entries=yt(t.entries)),this.isPreview){let r=this.wb?.presets??[],i=t.enabledPresets?r.map(d=>({...d,enabled:t.enabledPresets.includes(d.id)})):r,s={content:t.content??this.wb?.content??"",entries:t.entries??this.wb?.entries??[],presets:i,updated_at:new Date().toISOString()};return this.wb=s,Ye(s)}return(await this.http.patch(`/conversations/${this.getConversationId()}/worldbook`,t)).worldbook}}}async get(){return this.isPreview?this.mem?{...this.mem}:null:(await this.http.get(`/conversations/${this.getConversationId()}/summary`)).ai_summary}async update(e){let t=(e??"").trim();if(this.isPreview){let r={content:t,updated_at:new Date().toISOString()};return this.mem=r,{...r}}return(await this.http.patch(`/conversations/${this.getConversationId()}/summary`,{content:t})).ai_summary}};function Ye(o){return{...o,entries:o.entries.map(e=>({...e,keys:[...e.keys]})),presets:(o.presets??[]).map(e=>({...e}))}}function yt(o){return(o??[]).flatMap(e=>{let t=(e?.content??"").trim(),n=[...new Set((e?.keys??[]).map(r=>(r??"").trim()).filter(r=>r!==""))];return!t||n.length===0?[]:[{id:e.id||Tt(),keys:n,content:t}]})}function Tt(){let o=globalThis.crypto;return o?.randomUUID?o.randomUUID():`ewr-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var Ie=60,Ee=1e3,ce=1e4,A=class{constructor(e,t=!1,n=()=>Date.now()){this.send=e;this.isPreview=t;this.now=n;this.lastNotifyAt=0;this.lastRefreshAt=0;this.lastRefreshMessagesAt=0}notify(e){let t=wt(e);if(!t)return!1;let n=this.now();return n-this.lastNotifyAt<Ee?!1:(this.lastNotifyAt=n,this.isPreview?(ee(t,"info"),!0):(this.send(T("host-notify",{text:t})),!0))}refreshPanel(e){if(this.isPreview)return!1;let t=this.now();return t-this.lastRefreshAt<ce?!1:(this.lastRefreshAt=t,this.send(T("host-state-changed",e?.length?{scope:e}:{})),!0)}refreshMessages(){if(this.isPreview)return!1;let e=this.now();return e-this.lastRefreshMessagesAt<ce?!1:(this.lastRefreshMessagesAt=e,this.send(T("host-messages-changed",{})),!0)}};function wt(o){return typeof o!="string"?"":o.replace(/\s+/g," ").trim().slice(0,Ie)}var Qe="/functions/v1/world-engine/v1",Ct="https://api.storvia.ai";function Rt(){return window.__STORVIA__||{}}function _t(o,e=3e4){let t=Rt();return t.apiBase?Promise.resolve(t):new Promise((n,r)=>{let i=setTimeout(()=>{s(),d(),r(new g("NOT_INITIALIZED","Timed out waiting for __STORVIA__ config from parent frame."))},e),s=o.on("init",a=>{a.payload?.apiBase&&c({apiBase:a.payload.apiBase,gameId:a.payload.gameId,conversationId:a.payload.conversationId,accessToken:a.payload.accessToken,selectedModelId:a.payload.selectedModelId,lang:a.payload.lang,debug:a.payload.debug})}),d=o.on("preview-init",a=>{a.payload?.apiBase&&c(a.payload)});function c(a){clearTimeout(i),s(),d();let l=window;l.__STORVIA__=a,n(a)}o.send(T("ready",{}))})}var ne=class{constructor(){this.baseUrl="";this.gameId="";this.conversationId="";this.modelId="";this.models=[];this.presetId="";this.accessToken="";this.initialized=!1;this.isPreview=!1;this.previewConfig=void 0}async init(){if(this.initialized)return;let e=window.flutter_inappwebview,t=typeof e?.callHandler=="function";this.bus=new x({incoming:window,outgoing:()=>t?null:window.parent,verifySource:t?l=>l.source===null||l.source===window:l=>l.source===window.parent,customSend:t?l=>e.callHandler("storviaBus",l):void 0}),Le(l=>this.bus.send(l));let n=await _t(this.bus),r=n.apiBase;if(!r)throw new g("NOT_INITIALIZED","window.__STORVIA__.apiBase is not set. The platform must inject it before SDK init.");if(this.baseUrl=`${r}${Qe}`,this.isPreview=!!n.preview,this.previewConfig=n.previewConfig,!n.gameId)throw new g("GAME_NOT_FOUND","window.__STORVIA__.gameId is not set. The platform must inject it before SDK init.");if(this.gameId=n.gameId,!n.accessToken)throw new g("UNAUTHORIZED","window.__STORVIA__.accessToken is not set. The platform must inject the user token before SDK init.");if(this.accessToken=n.accessToken,Ae(n.lang),this.http=new te(this.baseUrl,this.accessToken,!!n.debug),this.isPreview){this.conversationId="00000000-0000-0000-0000-000000000000",this.models=n.models??[],this.modelId=n.selectedModelId||this.models[0]?.id||"";let[l,u]=await Promise.all([this.fetchPreviewSnapshot(),this.modelId?Promise.resolve(null):this.fetchModels()]);u&&(this.models=u,this.modelId=u[0]?.id||""),this.presetId=n.presetId||"";let f=()=>this.gameId,m=()=>this.conversationId,h=()=>this.modelId,C=()=>this.models.find(I=>I.id===this.modelId)?.name,y=()=>this.presetId||void 0;this.chat=new V(this.http,f,m,h,!0,this.previewConfig,C,y),this.characters=new H(this.http,m,!0,l?.characters,l?.characterStates),this.relationships=new W(this.http,m,!0,l?.relationships),this.inventory=new B(this.http,m,!0,l?.inventory),this.world=new j(this.http,m,!0,l?.world),this.player=new K(this.http,m,!0,l?.player,l?.playerState),this.custom=new z(this.http,m,f,!0,l?.custom,l?.custom_inject),this.save=new Y(this.http,m,f,!0,l?.save_data),this.state=new Q(this.http,m,!0),this.memory=new Z(this.http,m,!0),this.host=new A(I=>this.bus.send(I),!0),this.initialized=!0,this.listenForPreviewMessages(),this.listenForTokenUpdate();return}if(!n.conversationId)throw new g("NOT_INITIALIZED","window.__STORVIA__.conversationId is not set. The platform must inject it before SDK init.");this.conversationId=n.conversationId,this.modelId=n.selectedModelId||"",this.modelId||(this.models=await this.fetchModels(),this.modelId=this.models[0]?.id||""),this.presetId=n.presetId||"";let i=()=>this.gameId,s=()=>this.conversationId,d=()=>this.modelId,c=()=>this.models.find(l=>l.id===this.modelId)?.name,a=()=>this.presetId||void 0;this.chat=new V(this.http,i,s,d,!1,void 0,c,a),this.characters=new H(this.http,s),this.relationships=new W(this.http,s),this.inventory=new B(this.http,s),this.world=new j(this.http,s),this.player=new K(this.http,s),this.custom=new z(this.http,s,i),this.save=new Y(this.http,s,i),this.state=new Q(this.http,s),this.memory=new Z(this.http,s),this.host=new A(l=>this.bus.send(l),!1),this.listenForTokenUpdate(),this.listenForModelChange(),this.initialized=!0}listenForModelChange(){this.bus.on("set-model",e=>{let t=e.payload?.modelId||"";t&&(this.modelId=t)}),this.bus.on("set-preset",e=>{this.presetId=e.payload?.presetId||""})}listenForTokenUpdate(){this.bus.on("token-update",e=>{let t=e.payload?.accessToken;typeof t!="string"||!t||(this.accessToken=t,this.http?.setToken(t))})}listenForPreviewMessages(){this.bus.on("set-model",e=>{this.modelId=e.payload.modelId||""}),this.bus.on("set-preset",e=>{this.presetId=e.payload?.presetId||""}),this.bus.on("config-update",e=>{this.previewConfig=e.payload.previewConfig,this.chat&&this.chat.updatePreviewConfig(this.previewConfig),this.refreshPreviewSnapshot().catch(t=>{console.warn("[Storvia SDK] refreshPreviewSnapshot failed:",t)})})}async fetchPreviewSnapshot(){try{let e={game_id:this.gameId};return this.previewConfig&&("game_config"in this.previewConfig&&(e.game_config=this.previewConfig.game_config),"game_state"in this.previewConfig&&(e.game_state_override=this.previewConfig.game_state)),await this.http.post("/preview/initial-snapshot",e)}catch(e){return console.warn("[Storvia SDK] fetchPreviewSnapshot failed:",e),null}}async refreshPreviewSnapshot(){let e=await this.fetchPreviewSnapshot();e&&(this.characters?.setInitial(e.characters,e.characterStates),this.player?.setInitial(e.player,e.playerState),this.inventory?.setInitial(e.inventory),this.relationships?.setInitial(e.relationships),this.world?.setInitial(e.world),this.custom?.setInitial(e.custom,e.custom_inject),this.save?.setInitial(e.save_data))}async fetchModels(){try{return await this.http.get("/models")}catch{}return[]}async initDev(e){if(this.initialized)return;this.baseUrl=`${Ct}${Qe}`,this.gameId=e.gameId,this.isPreview=!0,this.http=new te(this.baseUrl,"",!1,e.apiKey);let[t,n]=await Promise.all([this.fetchModels(),this.fetchPreviewSnapshot()]);this.models=t;let r=e.model?t.find(l=>l.name===e.model)?.id??"":"";this.modelId=r||t[0]?.id||"",this.conversationId="00000000-0000-0000-0000-000000000000";let i=()=>this.gameId,s=()=>this.conversationId,d=()=>this.modelId,c=()=>this.models.find(l=>l.id===this.modelId)?.name;this.presetId=e.preset||"";let a=()=>this.presetId||void 0;this.chat=new V(this.http,i,s,d,!0,void 0,c,a),this.characters=new H(this.http,s,!0,n?.characters,n?.characterStates),this.relationships=new W(this.http,s,!0,n?.relationships),this.inventory=new B(this.http,s,!0,n?.inventory),this.world=new j(this.http,s,!0,n?.world),this.player=new K(this.http,s,!0,n?.player,n?.playerState),this.custom=new z(this.http,s,i,!0,n?.custom,n?.custom_inject),this.save=new Y(this.http,s,i,!0,n?.save_data),this.state=new Q(this.http,s,!0),this.memory=new Z(this.http,s,!0),this.host=new A(()=>{},!0),this.initialized=!0}async getAssets(e,t){let n={asset_type:e};return t&&(n.category=t),(await this.http.get("/assets",n)).map(i=>({id:i.id,name:i.name,url:i.url,assetType:i.asset_type,category:i.category}))}};async function Ze(o){ke();let e=new ne;return o?.dev?await e.initDev(o.dev):await e.init(),e}function ye(o){return typeof o=="object"&&o!==null&&"value"in o&&"type"in o&&(o.type==="number"||o.type==="text")}function Xe(o){return ye(o)?o.value:o}return ot(St);})();
123
123
  if(typeof window!=="undefined"){window.createStorviaSDK=StorviaSDK.createStorviaSDK;}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@storvia/sdk",
3
- "version": "0.10.5",
3
+ "version": "0.10.6",
4
4
  "description": "Storvia World SDK - Build interactive text games on the Storvia platform",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.esm.js",