@storvia/sdk 0.10.8 → 0.10.9

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
@@ -1,5 +1,5 @@
1
- "use strict";var ue=Object.defineProperty;var st=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var dt=Object.prototype.hasOwnProperty;var ct=(o,e)=>{for(var t in e)ue(o,t,{get:e[t],enumerable:!0})},lt=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of at(e))!dt.call(o,r)&&r!==t&&ue(o,r,{get:()=>e[r],enumerable:!(n=st(e,r))||n.enumerable});return o};var ht=o=>lt(ue({},"__esModule",{value:!0}),o);var xt={};ct(xt,{HOST_NOTIFY_MAX_LENGTH:()=>we,HOST_NOTIFY_MIN_INTERVAL_MS:()=>Te,HOST_PANEL_SCOPES:()=>pe,HOST_REFRESH_MIN_INTERVAL_MS:()=>le,HostModule:()=>A,MAIN_CHAT_TOPIC:()=>qe,PLAYER_ID:()=>Ze,PROTOCOL_VERSION:()=>$,StorviaBus:()=>x,StorviaError:()=>g,StorviaSDK:()=>oe,createStorviaSDK:()=>ot,envelope:()=>w,extractFieldValue:()=>it,isProtocolEnvelope:()=>J,isRichFieldValue:()=>Ce,setToastEnabled:()=>He,showToast:()=>te});module.exports=ht(xt);var g=class extends Error{constructor(e,t,n){super(t),this.name="StorviaError",this.code=e,n?.length&&(this.matchedWords=n)}};var $=1,pe=["player","characters","inventory","relations","world"];function J(o){if(!o||typeof o!="object")return!1;let e=o;return typeof e.protocol=="number"&&typeof e.type=="string"&&"payload"in e}function w(o,e,t){return{protocol:1,type:o,payload:e,...t?.id?{id:t.id}:{},...t?.ackId?{ackId:t.ackId}:{}}}var x=class{constructor(e){this.handlers=new Map;this.pendingAcks=new Map;this.listener=null;this.incoming=e.incoming,this.getOutgoing=e.outgoing,this.verifySource=e.verifySource??(()=>!0),this.validate=e.validate,this.debug=!!e.debug,this.getTransferables=e.transfer??(()=>{}),this.customSend=e.customSend,this.attach()}attach(){this.listener=e=>{if((this.incoming instanceof Window||this.incoming===window)&&!this.verifySource(e))return;let t=e.data;if(!J(t))return;if(t.protocol!==1){this.debug&&console.warn("[StorviaBus] protocol mismatch",{expected:1,got:t.protocol,type:t.type});return}if(this.validate&&!this.validate(t)){this.debug&&console.warn("[StorviaBus] validation failed",t);return}if(t.ackId){let r=this.pendingAcks.get(t.ackId);if(r){this.pendingAcks.delete(t.ackId),r(t);return}}let n=this.handlers.get(t.type);if(!n||n.size===0){this.debug&&console.debug("[StorviaBus] no handler for",t.type);return}n.forEach(r=>{try{r(t)}catch(i){console.error(`[StorviaBus] handler '${t.type}' threw:`,i)}})},this.incoming.addEventListener("message",this.listener),this.incoming instanceof MessagePort&&this.incoming.start()}on(e,t){let n=this.handlers.get(e);n||(n=new Set,this.handlers.set(e,n));let r=t;return n.add(r),()=>n.delete(r)}send(e){let t=e.protocol?e:w(e.type,e.payload,{id:e.id,ackId:e.ackId});if(this.customSend){try{this.customSend(t)}catch(i){console.error("[StorviaBus] customSend failed:",i,{type:e.type})}return}let n=this.getOutgoing();if(!n){this.debug&&console.warn("[StorviaBus] outgoing target unavailable, drop:",e.type);return}let r=this.getTransferables(t);try{n instanceof MessagePort?n.postMessage(t,r??[]):n.postMessage(t,"*",r??[])}catch(i){console.error("[StorviaBus] postMessage failed:",i,{type:e.type})}}request(e,t=1e4){return new Promise((n,r)=>{let i=e.id??ut(),s=w(e.type,e.payload,{id:i}),d=setTimeout(()=>{this.pendingAcks.delete(i),r(new Error(`[StorviaBus] request '${e.type}' timed out after ${t}ms`))},t);this.pendingAcks.set(i,c=>{clearTimeout(d),n(c)}),this.send(s)})}destroy(){if(this.listener&&(this.incoming.removeEventListener("message",this.listener),this.listener=null),this.incoming instanceof MessagePort)try{this.incoming.close()}catch{}this.handlers.clear(),this.pendingAcks.clear()}};function ut(){return`bus-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var pt=["zh","zh-Hant","en","ja","ko"];var gt={common:{unknownError:"\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",violationWords:"\u5185\u5BB9\u5305\u542B\u4E0D\u7B26\u5408\u793E\u533A\u89C4\u8303\u7684\u7528\u8BCD{words}\uFF0C\u8BF7\u4FEE\u6539\u540E\u91CD\u8BD5",close:"\u5173\u95ED"},errors:{UNAUTHORIZED:"\u767B\u5F55\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55",INSUFFICIENT_CREDITS:"\u82B1\u56ED\u5E01\u4E0D\u8DB3\uFF0C\u8BF7\u5145\u503C\u540E\u518D\u7EE7\u7EED\u6E38\u620F",VIOLATION_WORD_DETECTED:"\u5185\u5BB9\u542B\u6709\u8FDD\u7981\u8BCD\uFF0C\u8BF7\u4FEE\u6539\u540E\u91CD\u8BD5",CONTENT_FILTERED:"\u5185\u5BB9\u88AB\u5B89\u5168\u7B56\u7565\u62E6\u622A\uFF0C\u8BF7\u8C03\u6574\u540E\u91CD\u8BD5",MODEL_REFUSAL:"\u6A21\u578B\u62D2\u7EDD\u54CD\u5E94\uFF0C\u6362\u4E2A\u8BF4\u6CD5\u8BD5\u8BD5",STREAM_INTERRUPTED:"\u56DE\u590D\u5DF2\u4E2D\u65AD\uFF0C\u8BF7\u91CD\u8BD5",RATE_LIMITED:"\u64CD\u4F5C\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",GENERATING_IN_PROGRESS:"\u5F53\u524D\u5267\u60C5\u6B63\u5728\u751F\u6210\u4E2D\uFF0C\u8BF7\u7A0D\u5019",CONCURRENT_GENERATION_LIMIT:"\u540C\u65F6\u8FDB\u884C\u7684\u5267\u60C5\u592A\u591A\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5",INVENTORY_LIMIT:"\u7269\u54C1\u680F\u5DF2\u6EE1\uFF0C\u8BF7\u5148\u6E05\u7406\u518D\u6DFB\u52A0",CUSTOM_FIELDS_LIMIT:"\u6269\u5C55\u5C5E\u6027\u5B57\u6BB5\u5DF2\u6EE1\uFF0C\u8BF7\u5148\u5220\u9664\u518D\u6DFB\u52A0",MODEL_NOT_FOUND:"\u6240\u9009\u6A21\u578B\u4E0D\u53EF\u7528\uFF0C\u8BF7\u5207\u6362\u5176\u4ED6\u6A21\u578B",GAME_NOT_FOUND:"\u672A\u627E\u5230\u5BF9\u5E94\u6E38\u620F",INVALID_REQUEST:"\u8BF7\u6C42\u65E0\u6548\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",INVALID_EXTRACT_RULE:"\u56DE\u590D\u63D0\u53D6\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",INTERNAL_ERROR:"\u670D\u52A1\u51FA\u4E86\u70B9\u5C0F\u95EE\u9898\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",NOT_INITIALIZED:"SDK \u5C1A\u672A\u521D\u59CB\u5316",NOT_SUPPORTED_IN_PREVIEW:"\u5F53\u524D\u63A5\u53E3\u5728\u9884\u89C8\u6A21\u5F0F\u4E0B\u4E0D\u53EF\u7528",NETWORK_ERROR:"\u7F51\u7EDC\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\u8FDE\u63A5",REQUEST_TIMEOUT:"\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",MODEL_LOADING_TIMEOUT:"\u6A21\u578B\u54CD\u5E94\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",DAISY_CARD_REQUIRED:"\u56DE\u6EAF\u6D88\u606F\u9700\u8981\u6709\u6548\u7684\u96CF\u83CA\u5361\u8BA2\u9605",MESSAGE_NOT_FOUND:"\u6D88\u606F\u4E0D\u5B58\u5728\u6216\u65E0\u6743\u64CD\u4F5C",MESSAGE_TOO_OLD:"\u4EC5\u53EF\u56DE\u6EAF 30 \u5929\u5185\u7684\u6D88\u606F",NO_MESSAGES_TO_DELETE:"\u8BE5\u6D88\u606F\u4E4B\u540E\u6CA1\u6709\u53EF\u56DE\u6EAF\u7684\u6D88\u606F",GENERATION_TIMEOUT:"\u751F\u6210\u8D85\u65F6\uFF0C\u8BF7\u91CD\u8BD5",GENERATION_LOST:"\u751F\u6210\u8FDE\u63A5\u4E2D\u65AD\uFF0C\u8BF7\u91CD\u8BD5\uFF1B\u82E5\u5185\u5BB9\u5DF2\u751F\u6210\uFF0C\u5237\u65B0\u540E\u53EF\u89C1",REPETITION_LOOP:"\u56DE\u590D\u51FA\u73B0\u91CD\u590D\uFF0C\u8BF7\u91CD\u8BD5\u6216\u6362\u4E2A\u8BF4\u6CD5",SAVE_FAILED:"\u6D88\u606F\u4FDD\u5B58\u5931\u8D25\uFF0C\u672C\u6B21\u4E0D\u6263\u8D39\uFF0C\u8BF7\u91CD\u8BD5",FINALIZE_FAILED:"\u56DE\u590D\u5904\u7406\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5",CONVERSATION_NOT_FOUND:"\u672A\u627E\u5230\u5BF9\u5E94\u4F1A\u8BDD",EMPTY_MESSAGE:"\u6D88\u606F\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A",CONTINUE_MODEL_NOT_AVAILABLE:"\u7EED\u5199\u6A21\u578B\u5F53\u524D\u4E0D\u53EF\u7528",CONTINUE_PROMPT_MISSING:"\u7EED\u5199\u914D\u7F6E\u7F3A\u5931",GENERATION_ABORTED:"\u751F\u6210\u5DF2\u505C\u6B62"}},mt={common:{unknownError:"\u64CD\u4F5C\u5931\u6557\uFF0C\u8ACB\u7A0D\u5F8C\u91CD\u8A66",violationWords:"\u5167\u5BB9\u5305\u542B\u4E0D\u7B26\u5408\u793E\u7FA4\u898F\u7BC4\u7684\u7528\u8A5E{words}\uFF0C\u8ACB\u4FEE\u6539\u5F8C\u91CD\u8A66",close:"\u95DC\u9589"},errors:{UNAUTHORIZED:"\u767B\u5165\u5DF2\u5931\u6548\uFF0C\u8ACB\u91CD\u65B0\u767B\u5165",INSUFFICIENT_CREDITS:"\u82B1\u5712\u5E63\u4E0D\u8DB3\uFF0C\u8ACB\u5132\u503C\u5F8C\u518D\u7E7C\u7E8C\u904A\u6232",VIOLATION_WORD_DETECTED:"\u5167\u5BB9\u542B\u6709\u9055\u7981\u8A5E\uFF0C\u8ACB\u4FEE\u6539\u5F8C\u91CD\u8A66",CONTENT_FILTERED:"\u5167\u5BB9\u88AB\u5B89\u5168\u7B56\u7565\u6514\u622A\uFF0C\u8ACB\u8ABF\u6574\u5F8C\u91CD\u8A66",MODEL_REFUSAL:"\u6A21\u578B\u62D2\u7D55\u56DE\u61C9\uFF0C\u63DB\u500B\u8AAA\u6CD5\u8A66\u8A66",STREAM_INTERRUPTED:"\u56DE\u8986\u5DF2\u4E2D\u65B7\uFF0C\u8ACB\u91CD\u8A66",RATE_LIMITED:"\u64CD\u4F5C\u904E\u65BC\u983B\u7E41\uFF0C\u8ACB\u7A0D\u5F8C\u518D\u8A66",GENERATING_IN_PROGRESS:"\u76EE\u524D\u5287\u60C5\u6B63\u5728\u751F\u6210\u4E2D\uFF0C\u8ACB\u7A0D\u5019",CONCURRENT_GENERATION_LIMIT:"\u540C\u6642\u9032\u884C\u7684\u5287\u60C5\u592A\u591A\uFF0C\u8ACB\u7A0D\u5019\u518D\u8A66",INVENTORY_LIMIT:"\u9053\u5177\u6B04\u5DF2\u6EFF\uFF0C\u8ACB\u5148\u6E05\u7406\u518D\u65B0\u589E",CUSTOM_FIELDS_LIMIT:"\u64F4\u5145\u5C6C\u6027\u6B04\u4F4D\u5DF2\u6EFF\uFF0C\u8ACB\u5148\u522A\u9664\u518D\u65B0\u589E",MODEL_NOT_FOUND:"\u6240\u9078\u6A21\u578B\u4E0D\u53EF\u7528\uFF0C\u8ACB\u5207\u63DB\u5176\u4ED6\u6A21\u578B",GAME_NOT_FOUND:"\u627E\u4E0D\u5230\u5C0D\u61C9\u904A\u6232",INVALID_REQUEST:"\u8ACB\u6C42\u7121\u6548\uFF0C\u8ACB\u7A0D\u5F8C\u91CD\u8A66",INVALID_EXTRACT_RULE:"\u56DE\u8986\u64F7\u53D6\u8A2D\u5B9A\u7121\u6548\uFF0C\u8ACB\u7A0D\u5F8C\u91CD\u8A66",INTERNAL_ERROR:"\u670D\u52D9\u51FA\u4E86\u9EDE\u5C0F\u554F\u984C\uFF0C\u8ACB\u7A0D\u5F8C\u91CD\u8A66",NOT_INITIALIZED:"SDK \u5C1A\u672A\u521D\u59CB\u5316",NOT_SUPPORTED_IN_PREVIEW:"\u76EE\u524D\u4ECB\u9762\u5728\u9810\u89BD\u6A21\u5F0F\u4E0B\u4E0D\u53EF\u7528",NETWORK_ERROR:"\u7DB2\u8DEF\u7570\u5E38\uFF0C\u8ACB\u6AA2\u67E5\u9023\u7DDA",REQUEST_TIMEOUT:"\u8ACB\u6C42\u903E\u6642\uFF0C\u8ACB\u7A0D\u5F8C\u91CD\u8A66",MODEL_LOADING_TIMEOUT:"\u6A21\u578B\u56DE\u61C9\u903E\u6642\uFF0C\u8ACB\u7A0D\u5F8C\u91CD\u8A66",DAISY_CARD_REQUIRED:"\u56DE\u6EAF\u8A0A\u606F\u9700\u8981\u6709\u6548\u7684\u96DB\u83CA\u5361\u8A02\u95B1",MESSAGE_NOT_FOUND:"\u8A0A\u606F\u4E0D\u5B58\u5728\u6216\u7121\u6B0A\u64CD\u4F5C",MESSAGE_TOO_OLD:"\u50C5\u53EF\u56DE\u6EAF 30 \u5929\u5167\u7684\u8A0A\u606F",NO_MESSAGES_TO_DELETE:"\u8A72\u8A0A\u606F\u4E4B\u5F8C\u6C92\u6709\u53EF\u56DE\u6EAF\u7684\u8A0A\u606F",GENERATION_TIMEOUT:"\u751F\u6210\u903E\u6642\uFF0C\u8ACB\u91CD\u8A66",GENERATION_LOST:"\u751F\u6210\u9023\u7DDA\u4E2D\u65B7\uFF0C\u8ACB\u91CD\u8A66\uFF1B\u82E5\u5167\u5BB9\u5DF2\u751F\u6210\uFF0C\u91CD\u65B0\u6574\u7406\u5F8C\u53EF\u898B",REPETITION_LOOP:"\u56DE\u8986\u51FA\u73FE\u91CD\u8907\uFF0C\u8ACB\u91CD\u8A66\u6216\u63DB\u500B\u8AAA\u6CD5",SAVE_FAILED:"\u8A0A\u606F\u5132\u5B58\u5931\u6557\uFF0C\u672C\u6B21\u4E0D\u6263\u8CBB\uFF0C\u8ACB\u91CD\u8A66",FINALIZE_FAILED:"\u56DE\u8986\u8655\u7406\u5931\u6557\uFF0C\u8ACB\u91CD\u8A66",CONVERSATION_NOT_FOUND:"\u627E\u4E0D\u5230\u5C0D\u61C9\u5C0D\u8A71",EMPTY_MESSAGE:"\u8A0A\u606F\u5167\u5BB9\u4E0D\u80FD\u70BA\u7A7A",CONTINUE_MODEL_NOT_AVAILABLE:"\u7E8C\u5BEB\u6A21\u578B\u76EE\u524D\u4E0D\u53EF\u7528",CONTINUE_PROMPT_MISSING:"\u7E8C\u5BEB\u8A2D\u5B9A\u7F3A\u5931",GENERATION_ABORTED:"\u751F\u6210\u5DF2\u505C\u6B62"}},ft={common:{unknownError:"Something went wrong. Please try again.",violationWords:"Your content contains words that violate our community guidelines{words}. Please revise and try again.",close:"Close"},errors:{UNAUTHORIZED:"Your session has expired. Please sign in again.",INSUFFICIENT_CREDITS:"Not enough Garden Coins. Please top up to continue.",VIOLATION_WORD_DETECTED:"Your content contains prohibited words. Please revise and try again.",CONTENT_FILTERED:"Content was blocked by the safety filter. Please adjust and try again.",MODEL_REFUSAL:"The model declined to respond. Try rephrasing.",STREAM_INTERRUPTED:"The reply was interrupted. Please try again.",RATE_LIMITED:"Too many requests. Please wait a moment.",GENERATING_IN_PROGRESS:"A reply is already being generated. Please wait.",CONCURRENT_GENERATION_LIMIT:"Too many replies generating at once. Please wait.",INVENTORY_LIMIT:"Inventory is full. Remove some items first.",CUSTOM_FIELDS_LIMIT:"Custom field limit reached. Delete some fields first.",MODEL_NOT_FOUND:"That model is unavailable. Please pick another one.",GAME_NOT_FOUND:"Game not found.",INVALID_REQUEST:"Invalid request. Please try again.",INVALID_EXTRACT_RULE:"Invalid reply-extraction rule. Please try again.",INTERNAL_ERROR:"Something went wrong on our end. Please try again.",NOT_INITIALIZED:"The SDK is not initialized yet.",NOT_SUPPORTED_IN_PREVIEW:"This action is unavailable in preview mode.",NETWORK_ERROR:"Network error. Please check your connection.",REQUEST_TIMEOUT:"Request timed out. Please try again.",MODEL_LOADING_TIMEOUT:"The model took too long to respond. Please try again.",DAISY_CARD_REQUIRED:"Rolling back messages requires an active Daisy Card subscription.",MESSAGE_NOT_FOUND:"Message not found, or you do not have access to it.",MESSAGE_TOO_OLD:"You can only roll back messages from the last 30 days.",NO_MESSAGES_TO_DELETE:"There are no messages after this one to roll back.",GENERATION_TIMEOUT:"Generation timed out. Please try again.",GENERATION_LOST:"Lost connection while generating. Try again \u2014 if it finished, refresh to see it.",REPETITION_LOOP:"The reply started repeating itself. Try again or rephrase.",SAVE_FAILED:"Failed to save the message. You were not charged. Please try again.",FINALIZE_FAILED:"Failed to finish processing the reply. Please try again.",CONVERSATION_NOT_FOUND:"Conversation not found.",EMPTY_MESSAGE:"Message cannot be empty.",CONTINUE_MODEL_NOT_AVAILABLE:"The continuation model is currently unavailable.",CONTINUE_PROMPT_MISSING:"Continuation settings are missing.",GENERATION_ABORTED:"Generation stopped."}},vt={common:{unknownError:"\u64CD\u4F5C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",violationWords:"\u30B3\u30DF\u30E5\u30CB\u30C6\u30A3\u30AC\u30A4\u30C9\u30E9\u30A4\u30F3\u306B\u53CD\u3059\u308B\u8A9E\u53E5{words}\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\u4FEE\u6B63\u3057\u3066\u304B\u3089\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",close:"\u9589\u3058\u308B"},errors:{UNAUTHORIZED:"\u30ED\u30B0\u30A4\u30F3\u306E\u6709\u52B9\u671F\u9650\u304C\u5207\u308C\u307E\u3057\u305F\u3002\u518D\u5EA6\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044\u3002",INSUFFICIENT_CREDITS:"\u30AC\u30FC\u30C7\u30F3\u30B3\u30A4\u30F3\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059\u3002\u30C1\u30E3\u30FC\u30B8\u3057\u3066\u304B\u3089\u7D9A\u3051\u3066\u304F\u3060\u3055\u3044\u3002",VIOLATION_WORD_DETECTED:"\u7981\u6B62\u8A9E\u53E5\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\u4FEE\u6B63\u3057\u3066\u304B\u3089\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",CONTENT_FILTERED:"\u5B89\u5168\u30DD\u30EA\u30B7\u30FC\u306B\u3088\u308A\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u307E\u3057\u305F\u3002\u5185\u5BB9\u3092\u8ABF\u6574\u3057\u3066\u304F\u3060\u3055\u3044\u3002",MODEL_REFUSAL:"\u30E2\u30C7\u30EB\u304C\u5FDC\u7B54\u3092\u62D2\u5426\u3057\u307E\u3057\u305F\u3002\u8868\u73FE\u3092\u5909\u3048\u3066\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",STREAM_INTERRUPTED:"\u8FD4\u4FE1\u304C\u4E2D\u65AD\u3055\u308C\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",RATE_LIMITED:"\u64CD\u4F5C\u304C\u983B\u7E41\u3059\u304E\u307E\u3059\u3002\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",GENERATING_IN_PROGRESS:"\u73FE\u5728\u30B9\u30C8\u30FC\u30EA\u30FC\u3092\u751F\u6210\u4E2D\u3067\u3059\u3002\u304A\u5F85\u3061\u304F\u3060\u3055\u3044\u3002",CONCURRENT_GENERATION_LIMIT:"\u540C\u6642\u306B\u751F\u6210\u4E2D\u306E\u30B9\u30C8\u30FC\u30EA\u30FC\u304C\u591A\u3059\u304E\u307E\u3059\u3002\u304A\u5F85\u3061\u304F\u3060\u3055\u3044\u3002",INVENTORY_LIMIT:"\u6301\u3061\u7269\u304C\u3044\u3063\u3071\u3044\u3067\u3059\u3002\u6574\u7406\u3057\u3066\u304B\u3089\u8FFD\u52A0\u3057\u3066\u304F\u3060\u3055\u3044\u3002",CUSTOM_FIELDS_LIMIT:"\u62E1\u5F35\u5C5E\u6027\u306E\u9805\u76EE\u304C\u4E0A\u9650\u306B\u9054\u3057\u307E\u3057\u305F\u3002\u524A\u9664\u3057\u3066\u304B\u3089\u8FFD\u52A0\u3057\u3066\u304F\u3060\u3055\u3044\u3002",MODEL_NOT_FOUND:"\u9078\u629E\u3057\u305F\u30E2\u30C7\u30EB\u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002\u5225\u306E\u30E2\u30C7\u30EB\u3092\u304A\u9078\u3073\u304F\u3060\u3055\u3044\u3002",GAME_NOT_FOUND:"\u5BFE\u8C61\u306E\u30B2\u30FC\u30E0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002",INVALID_REQUEST:"\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u7121\u52B9\u3067\u3059\u3002\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",INVALID_EXTRACT_RULE:"\u8FD4\u4FE1\u62BD\u51FA\u306E\u8A2D\u5B9A\u304C\u7121\u52B9\u3067\u3059\u3002\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",INTERNAL_ERROR:"\u30B5\u30FC\u30D0\u30FC\u5074\u3067\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",NOT_INITIALIZED:"SDK \u304C\u307E\u3060\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002",NOT_SUPPORTED_IN_PREVIEW:"\u3053\u306E\u6A5F\u80FD\u306F\u30D7\u30EC\u30D3\u30E5\u30FC\u30E2\u30FC\u30C9\u3067\u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002",NETWORK_ERROR:"\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30A8\u30E9\u30FC\u3067\u3059\u3002\u63A5\u7D9A\u3092\u3054\u78BA\u8A8D\u304F\u3060\u3055\u3044\u3002",REQUEST_TIMEOUT:"\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",MODEL_LOADING_TIMEOUT:"\u30E2\u30C7\u30EB\u306E\u5FDC\u7B54\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",DAISY_CARD_REQUIRED:"\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u30ED\u30FC\u30EB\u30D0\u30C3\u30AF\u306B\u306F\u30C7\u30A4\u30B8\u30FC\u30AB\u30FC\u30C9\u306E\u6709\u52B9\u306A\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u304C\u5FC5\u8981\u3067\u3059\u3002",MESSAGE_NOT_FOUND:"\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u5B58\u5728\u3057\u306A\u3044\u304B\u3001\u64CD\u4F5C\u3059\u308B\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",MESSAGE_TOO_OLD:"\u30ED\u30FC\u30EB\u30D0\u30C3\u30AF\u3067\u304D\u308B\u306E\u306F 30 \u65E5\u4EE5\u5185\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u307F\u3067\u3059\u3002",NO_MESSAGES_TO_DELETE:"\u3053\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u3088\u308A\u5F8C\u306B\u30ED\u30FC\u30EB\u30D0\u30C3\u30AF\u3067\u304D\u308B\u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u3042\u308A\u307E\u305B\u3093\u3002",GENERATION_TIMEOUT:"\u751F\u6210\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",GENERATION_LOST:"\u751F\u6210\u4E2D\u306B\u63A5\u7D9A\u304C\u5207\u308C\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002\u751F\u6210\u6E08\u307F\u306E\u5834\u5408\u306F\u518D\u8AAD\u307F\u8FBC\u307F\u3067\u8868\u793A\u3055\u308C\u307E\u3059\u3002",REPETITION_LOOP:"\u8FD4\u4FE1\u304C\u7E70\u308A\u8FD4\u3057\u306B\u306A\u308A\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u3044\u305F\u3060\u304F\u304B\u3001\u8868\u73FE\u3092\u5909\u3048\u3066\u304F\u3060\u3055\u3044\u3002",SAVE_FAILED:"\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u4ECA\u56DE\u306F\u8AB2\u91D1\u3055\u308C\u307E\u305B\u3093\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",FINALIZE_FAILED:"\u8FD4\u4FE1\u306E\u51E6\u7406\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",CONVERSATION_NOT_FOUND:"\u5BFE\u8C61\u306E\u4F1A\u8A71\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002",EMPTY_MESSAGE:"\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",CONTINUE_MODEL_NOT_AVAILABLE:"\u7D9A\u304D\u3092\u66F8\u304F\u30E2\u30C7\u30EB\u304C\u73FE\u5728\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002",CONTINUE_PROMPT_MISSING:"\u7D9A\u304D\u3092\u66F8\u304F\u8A2D\u5B9A\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002",GENERATION_ABORTED:"\u751F\u6210\u3092\u505C\u6B62\u3057\u307E\u3057\u305F\u3002"}},It={common:{unknownError:"\uC791\uC5C5\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",violationWords:"\uCEE4\uBBA4\uB2C8\uD2F0 \uADDC\uC815\uC5D0 \uC5B4\uAE0B\uB098\uB294 \uB2E8\uC5B4{words}\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uC218\uC815 \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",close:"\uB2EB\uAE30"},errors:{UNAUTHORIZED:"\uB85C\uADF8\uC778\uC774 \uB9CC\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uB85C\uADF8\uC778\uD574 \uC8FC\uC138\uC694.",INSUFFICIENT_CREDITS:"\uAC00\uB4E0 \uCF54\uC778\uC774 \uBD80\uC871\uD569\uB2C8\uB2E4. \uCDA9\uC804 \uD6C4 \uACC4\uC18D\uD574 \uC8FC\uC138\uC694.",VIOLATION_WORD_DETECTED:"\uAE08\uC9C0\uB41C \uB2E8\uC5B4\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uC218\uC815 \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",CONTENT_FILTERED:"\uC548\uC804 \uC815\uCC45\uC5D0 \uC758\uD574 \uCC28\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB0B4\uC6A9\uC744 \uC218\uC815\uD574 \uC8FC\uC138\uC694.",MODEL_REFUSAL:"\uBAA8\uB378\uC774 \uC751\uB2F5\uC744 \uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uB974\uAC8C \uD45C\uD604\uD574 \uBCF4\uC138\uC694.",STREAM_INTERRUPTED:"\uC751\uB2F5\uC774 \uC911\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",RATE_LIMITED:"\uC694\uCCAD\uC774 \uB108\uBB34 \uC7A6\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",GENERATING_IN_PROGRESS:"\uD604\uC7AC \uC2A4\uD1A0\uB9AC\uB97C \uC0DD\uC131 \uC911\uC785\uB2C8\uB2E4. \uC7A0\uC2DC\uB9CC \uAE30\uB2E4\uB824 \uC8FC\uC138\uC694.",CONCURRENT_GENERATION_LIMIT:"\uB3D9\uC2DC\uC5D0 \uC0DD\uC131 \uC911\uC778 \uC2A4\uD1A0\uB9AC\uAC00 \uB108\uBB34 \uB9CE\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",INVENTORY_LIMIT:"\uC18C\uC9C0\uD488\uC774 \uAC00\uB4DD \uCC3C\uC2B5\uB2C8\uB2E4. \uC815\uB9AC \uD6C4 \uCD94\uAC00\uD574 \uC8FC\uC138\uC694.",CUSTOM_FIELDS_LIMIT:"\uD655\uC7A5 \uC18D\uC131 \uD56D\uBAA9\uC774 \uAC00\uB4DD \uCC3C\uC2B5\uB2C8\uB2E4. \uC0AD\uC81C \uD6C4 \uCD94\uAC00\uD574 \uC8FC\uC138\uC694.",MODEL_NOT_FOUND:"\uC120\uD0DD\uD55C \uBAA8\uB378\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uB2E4\uB978 \uBAA8\uB378\uC744 \uC120\uD0DD\uD574 \uC8FC\uC138\uC694.",GAME_NOT_FOUND:"\uD574\uB2F9 \uAC8C\uC784\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",INVALID_REQUEST:"\uC798\uBABB\uB41C \uC694\uCCAD\uC785\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",INVALID_EXTRACT_RULE:"\uC751\uB2F5 \uCD94\uCD9C \uC124\uC815\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",INTERNAL_ERROR:"\uC11C\uBC84\uC5D0 \uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",NOT_INITIALIZED:"SDK\uAC00 \uC544\uC9C1 \uCD08\uAE30\uD654\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",NOT_SUPPORTED_IN_PREVIEW:"\uC774 \uAE30\uB2A5\uC740 \uBBF8\uB9AC\uBCF4\uAE30 \uBAA8\uB4DC\uC5D0\uC11C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",NETWORK_ERROR:"\uB124\uD2B8\uC6CC\uD06C \uC624\uB958\uC785\uB2C8\uB2E4. \uC5F0\uACB0\uC744 \uD655\uC778\uD574 \uC8FC\uC138\uC694.",REQUEST_TIMEOUT:"\uC694\uCCAD \uC2DC\uAC04\uC774 \uCD08\uACFC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",MODEL_LOADING_TIMEOUT:"\uBAA8\uB378 \uC751\uB2F5 \uC2DC\uAC04\uC774 \uCD08\uACFC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",DAISY_CARD_REQUIRED:"\uBA54\uC2DC\uC9C0 \uB418\uB3CC\uB9AC\uAE30\uB294 \uB370\uC774\uC9C0 \uCE74\uB4DC \uAD6C\uB3C5\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.",MESSAGE_NOT_FOUND:"\uBA54\uC2DC\uC9C0\uAC00 \uC5C6\uAC70\uB098 \uAD8C\uD55C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",MESSAGE_TOO_OLD:"30\uC77C \uC774\uB0B4\uC758 \uBA54\uC2DC\uC9C0\uB9CC \uB418\uB3CC\uB9B4 \uC218 \uC788\uC2B5\uB2C8\uB2E4.",NO_MESSAGES_TO_DELETE:"\uC774 \uBA54\uC2DC\uC9C0 \uC774\uD6C4\uC5D0 \uB418\uB3CC\uB9B4 \uBA54\uC2DC\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",GENERATION_TIMEOUT:"\uC0DD\uC131 \uC2DC\uAC04\uC774 \uCD08\uACFC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",GENERATION_LOST:"\uC0DD\uC131 \uC911 \uC5F0\uACB0\uC774 \uB04A\uACBC\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694. \uC774\uBBF8 \uC0DD\uC131\uB418\uC5C8\uB2E4\uBA74 \uC0C8\uB85C\uACE0\uCE68\uD558\uBA74 \uBCF4\uC785\uB2C8\uB2E4.",REPETITION_LOOP:"\uC751\uB2F5\uC774 \uBC18\uBCF5\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uAC70\uB098 \uB2E4\uB974\uAC8C \uD45C\uD604\uD574 \uC8FC\uC138\uC694.",SAVE_FAILED:"\uBA54\uC2DC\uC9C0 \uC800\uC7A5\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC774\uBC88\uC5D0\uB294 \uCC28\uAC10\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",FINALIZE_FAILED:"\uC751\uB2F5 \uCC98\uB9AC\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",CONVERSATION_NOT_FOUND:"\uD574\uB2F9 \uB300\uD654\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",EMPTY_MESSAGE:"\uBA54\uC2DC\uC9C0\uB97C \uC785\uB825\uD574 \uC8FC\uC138\uC694.",CONTINUE_MODEL_NOT_AVAILABLE:"\uC774\uC5B4\uC4F0\uAE30 \uBAA8\uB378\uC744 \uD604\uC7AC \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",CONTINUE_PROMPT_MISSING:"\uC774\uC5B4\uC4F0\uAE30 \uC124\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",GENERATION_ABORTED:"\uC0DD\uC131\uC744 \uC911\uC9C0\uD588\uC2B5\uB2C8\uB2E4."}},ke={zh:gt,"zh-Hant":mt,en:ft,ja:vt,ko:It},ee="zh";function De(o){if(!o)return null;let e=o.trim();if(!e)return null;if(pt.includes(e))return e;let t=e.toLowerCase();return t.startsWith("zh")?/hant|tw|hk|mo/.test(t)?"zh-Hant":"zh":t.startsWith("ja")?"ja":t.startsWith("ko")?"ko":t.startsWith("en")?"en":null}function Me(o){let e=De(o);e&&(ee=e)}function xe(){if(typeof navigator>"u")return;let o=De(navigator.language);o&&(ee=o)}function Ue(){return ee}function Le(o){return ke[ee].errors[o]}function de(o){return ke[ee].common[o]}var ge=null;function Ve(o){ge=o}var $e="storvia-sdk-toast-style",ce="storvia-sdk-toast-stack",Et=`
2
- #${ce} {
1
+ "use strict";var me=Object.defineProperty;var gt=Object.getOwnPropertyDescriptor;var mt=Object.getOwnPropertyNames;var ft=Object.prototype.hasOwnProperty;var vt=(o,e)=>{for(var t in e)me(o,t,{get:e[t],enumerable:!0})},It=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of mt(e))!ft.call(o,r)&&r!==t&&me(o,r,{get:()=>e[r],enumerable:!(n=gt(e,r))||n.enumerable});return o};var Et=o=>It(me({},"__esModule",{value:!0}),o);var Zt={};vt(Zt,{HOST_NOTIFY_MAX_LENGTH:()=>Re,HOST_NOTIFY_MIN_INTERVAL_MS:()=>Se,HOST_PANEL_SCOPES:()=>fe,HOST_REFRESH_MIN_INTERVAL_MS:()=>pe,HostModule:()=>N,MAIN_CHAT_TOPIC:()=>Xe,PLAYER_ID:()=>et,PROTOCOL_VERSION:()=>$,StorviaBus:()=>x,StorviaError:()=>u,StorviaSDK:()=>ae,createStorviaSDK:()=>ut,envelope:()=>y,extractFieldValue:()=>pt,isProtocolEnvelope:()=>te,isRichFieldValue:()=>Ae,setToastEnabled:()=>Ke,showToast:()=>oe});module.exports=Et(Zt);var u=class extends Error{constructor(e,t,n){super(t),this.name="StorviaError",this.code=e,n?.length&&(this.matchedWords=n)}};var $=1,fe=["player","characters","inventory","relations","world"];function te(o){if(!o||typeof o!="object")return!1;let e=o;return typeof e.protocol=="number"&&typeof e.type=="string"&&"payload"in e}function y(o,e,t){return{protocol:1,type:o,payload:e,...t?.id?{id:t.id}:{},...t?.ackId?{ackId:t.ackId}:{}}}var x=class{constructor(e){this.handlers=new Map;this.pendingAcks=new Map;this.listener=null;this.incoming=e.incoming,this.getOutgoing=e.outgoing,this.verifySource=e.verifySource??(()=>!0),this.validate=e.validate,this.debug=!!e.debug,this.getTransferables=e.transfer??(()=>{}),this.customSend=e.customSend,this.attach()}attach(){this.listener=e=>{if((this.incoming instanceof Window||this.incoming===window)&&!this.verifySource(e))return;let t=e.data;if(!te(t))return;if(t.protocol!==1){this.debug&&console.warn("[StorviaBus] protocol mismatch",{expected:1,got:t.protocol,type:t.type});return}if(this.validate&&!this.validate(t)){this.debug&&console.warn("[StorviaBus] validation failed",t);return}if(t.ackId){let r=this.pendingAcks.get(t.ackId);if(r){this.pendingAcks.delete(t.ackId),r(t);return}}let n=this.handlers.get(t.type);if(!n||n.size===0){this.debug&&console.debug("[StorviaBus] no handler for",t.type);return}n.forEach(r=>{try{r(t)}catch(i){console.error(`[StorviaBus] handler '${t.type}' threw:`,i)}})},this.incoming.addEventListener("message",this.listener),this.incoming instanceof MessagePort&&this.incoming.start()}on(e,t){let n=this.handlers.get(e);n||(n=new Set,this.handlers.set(e,n));let r=t;return n.add(r),()=>n.delete(r)}send(e){let t=e.protocol?e:y(e.type,e.payload,{id:e.id,ackId:e.ackId});if(this.customSend){try{this.customSend(t)}catch(i){console.error("[StorviaBus] customSend failed:",i,{type:e.type})}return}let n=this.getOutgoing();if(!n){this.debug&&console.warn("[StorviaBus] outgoing target unavailable, drop:",e.type);return}let r=this.getTransferables(t);try{n instanceof MessagePort?n.postMessage(t,r??[]):n.postMessage(t,"*",r??[])}catch(i){console.error("[StorviaBus] postMessage failed:",i,{type:e.type})}}request(e,t=1e4){return new Promise((n,r)=>{let i=e.id??Tt(),s=y(e.type,e.payload,{id:i}),c=setTimeout(()=>{this.pendingAcks.delete(i),r(new Error(`[StorviaBus] request '${e.type}' timed out after ${t}ms`))},t);this.pendingAcks.set(i,l=>{clearTimeout(c),n(l)}),this.send(s)})}destroy(){if(this.listener&&(this.incoming.removeEventListener("message",this.listener),this.listener=null),this.incoming instanceof MessagePort)try{this.incoming.close()}catch{}this.handlers.clear(),this.pendingAcks.clear()}};function Tt(){return`bus-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var wt=["zh","zh-Hant","en","ja","ko"];var yt={common:{unknownError:"\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",violationWords:"\u5185\u5BB9\u5305\u542B\u4E0D\u7B26\u5408\u793E\u533A\u89C4\u8303\u7684\u7528\u8BCD{words}\uFF0C\u8BF7\u4FEE\u6539\u540E\u91CD\u8BD5",close:"\u5173\u95ED"},errors:{ASR_BAD_AUDIO:"\u97F3\u9891\u4E3A\u7A7A\u3001\u8FC7\u5927\u6216\u683C\u5F0F\u4E0D\u652F\u6301",ASR_UPSTREAM_FAILED:"\u8BED\u97F3\u8BC6\u522B\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5",ASR_MODEL_UNAVAILABLE:"\u8BED\u97F3\u8BC6\u522B\u670D\u52A1\u6682\u4E0D\u53EF\u7528",TTS_UNKNOWN_VOICE:"\u89D2\u8272\u672A\u8BBE\u7F6E\u58F0\u97F3\u6216\u58F0\u97F3\u4E0D\u53EF\u7528",TTS_EMPTY_TEXT:"\u8BF7\u8F93\u5165\u9700\u8981\u6717\u8BFB\u7684\u53F0\u8BCD",TTS_UPSTREAM_FAILED:"\u8BED\u97F3\u751F\u6210\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5",UNAUTHORIZED:"\u767B\u5F55\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55",INSUFFICIENT_CREDITS:"\u82B1\u56ED\u5E01\u4E0D\u8DB3\uFF0C\u8BF7\u5145\u503C\u540E\u518D\u7EE7\u7EED\u6E38\u620F",VIOLATION_WORD_DETECTED:"\u5185\u5BB9\u542B\u6709\u8FDD\u7981\u8BCD\uFF0C\u8BF7\u4FEE\u6539\u540E\u91CD\u8BD5",CONTENT_FILTERED:"\u5185\u5BB9\u88AB\u5B89\u5168\u7B56\u7565\u62E6\u622A\uFF0C\u8BF7\u8C03\u6574\u540E\u91CD\u8BD5",MODEL_REFUSAL:"\u6A21\u578B\u62D2\u7EDD\u54CD\u5E94\uFF0C\u6362\u4E2A\u8BF4\u6CD5\u8BD5\u8BD5",STREAM_INTERRUPTED:"\u56DE\u590D\u5DF2\u4E2D\u65AD\uFF0C\u8BF7\u91CD\u8BD5",RATE_LIMITED:"\u64CD\u4F5C\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",GENERATING_IN_PROGRESS:"\u5F53\u524D\u5267\u60C5\u6B63\u5728\u751F\u6210\u4E2D\uFF0C\u8BF7\u7A0D\u5019",CONCURRENT_GENERATION_LIMIT:"\u540C\u65F6\u8FDB\u884C\u7684\u5267\u60C5\u592A\u591A\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5",INVENTORY_LIMIT:"\u7269\u54C1\u680F\u5DF2\u6EE1\uFF0C\u8BF7\u5148\u6E05\u7406\u518D\u6DFB\u52A0",CUSTOM_FIELDS_LIMIT:"\u6269\u5C55\u5C5E\u6027\u5B57\u6BB5\u5DF2\u6EE1\uFF0C\u8BF7\u5148\u5220\u9664\u518D\u6DFB\u52A0",MODEL_NOT_FOUND:"\u6240\u9009\u6A21\u578B\u4E0D\u53EF\u7528\uFF0C\u8BF7\u5207\u6362\u5176\u4ED6\u6A21\u578B",GAME_NOT_FOUND:"\u672A\u627E\u5230\u5BF9\u5E94\u6E38\u620F",INVALID_REQUEST:"\u8BF7\u6C42\u65E0\u6548\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",INVALID_EXTRACT_RULE:"\u56DE\u590D\u63D0\u53D6\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",INTERNAL_ERROR:"\u670D\u52A1\u51FA\u4E86\u70B9\u5C0F\u95EE\u9898\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",NOT_INITIALIZED:"SDK \u5C1A\u672A\u521D\u59CB\u5316",NOT_SUPPORTED_IN_PREVIEW:"\u5F53\u524D\u63A5\u53E3\u5728\u9884\u89C8\u6A21\u5F0F\u4E0B\u4E0D\u53EF\u7528",NETWORK_ERROR:"\u7F51\u7EDC\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\u8FDE\u63A5",REQUEST_TIMEOUT:"\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",MODEL_LOADING_TIMEOUT:"\u6A21\u578B\u54CD\u5E94\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",DAISY_CARD_REQUIRED:"\u56DE\u6EAF\u6D88\u606F\u9700\u8981\u6709\u6548\u7684\u96CF\u83CA\u5361\u8BA2\u9605",MESSAGE_NOT_FOUND:"\u6D88\u606F\u4E0D\u5B58\u5728\u6216\u65E0\u6743\u64CD\u4F5C",MESSAGE_TOO_OLD:"\u4EC5\u53EF\u56DE\u6EAF 30 \u5929\u5185\u7684\u6D88\u606F",NO_MESSAGES_TO_DELETE:"\u8BE5\u6D88\u606F\u4E4B\u540E\u6CA1\u6709\u53EF\u56DE\u6EAF\u7684\u6D88\u606F",GENERATION_TIMEOUT:"\u751F\u6210\u8D85\u65F6\uFF0C\u8BF7\u91CD\u8BD5",GENERATION_LOST:"\u751F\u6210\u8FDE\u63A5\u4E2D\u65AD\uFF0C\u8BF7\u91CD\u8BD5\uFF1B\u82E5\u5185\u5BB9\u5DF2\u751F\u6210\uFF0C\u5237\u65B0\u540E\u53EF\u89C1",REPETITION_LOOP:"\u56DE\u590D\u51FA\u73B0\u91CD\u590D\uFF0C\u8BF7\u91CD\u8BD5\u6216\u6362\u4E2A\u8BF4\u6CD5",SAVE_FAILED:"\u6D88\u606F\u4FDD\u5B58\u5931\u8D25\uFF0C\u672C\u6B21\u4E0D\u6263\u8D39\uFF0C\u8BF7\u91CD\u8BD5",FINALIZE_FAILED:"\u56DE\u590D\u5904\u7406\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5",CONVERSATION_NOT_FOUND:"\u672A\u627E\u5230\u5BF9\u5E94\u4F1A\u8BDD",EMPTY_MESSAGE:"\u6D88\u606F\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A",CONTINUE_MODEL_NOT_AVAILABLE:"\u7EED\u5199\u6A21\u578B\u5F53\u524D\u4E0D\u53EF\u7528",CONTINUE_PROMPT_MISSING:"\u7EED\u5199\u914D\u7F6E\u7F3A\u5931",GENERATION_ABORTED:"\u751F\u6210\u5DF2\u505C\u6B62"}},Ct={common:{unknownError:"\u64CD\u4F5C\u5931\u6557\uFF0C\u8ACB\u7A0D\u5F8C\u91CD\u8A66",violationWords:"\u5167\u5BB9\u5305\u542B\u4E0D\u7B26\u5408\u793E\u7FA4\u898F\u7BC4\u7684\u7528\u8A5E{words}\uFF0C\u8ACB\u4FEE\u6539\u5F8C\u91CD\u8A66",close:"\u95DC\u9589"},errors:{ASR_BAD_AUDIO:"\u97F3\u8A0A\u70BA\u7A7A\u3001\u904E\u5927\u6216\u683C\u5F0F\u4E0D\u652F\u63F4",ASR_UPSTREAM_FAILED:"\u8A9E\u97F3\u8FA8\u8B58\u5931\u6557\uFF0C\u8ACB\u91CD\u8A66",ASR_MODEL_UNAVAILABLE:"\u8A9E\u97F3\u8FA8\u8B58\u670D\u52D9\u66AB\u4E0D\u53EF\u7528",TTS_UNKNOWN_VOICE:"\u89D2\u8272\u672A\u8A2D\u5B9A\u8072\u97F3\u6216\u8072\u97F3\u4E0D\u53EF\u7528",TTS_EMPTY_TEXT:"\u8ACB\u8F38\u5165\u9700\u8981\u6717\u8B80\u7684\u53F0\u8A5E",TTS_UPSTREAM_FAILED:"\u8A9E\u97F3\u7522\u751F\u5931\u6557\uFF0C\u8ACB\u91CD\u8A66",UNAUTHORIZED:"\u767B\u5165\u5DF2\u5931\u6548\uFF0C\u8ACB\u91CD\u65B0\u767B\u5165",INSUFFICIENT_CREDITS:"\u82B1\u5712\u5E63\u4E0D\u8DB3\uFF0C\u8ACB\u5132\u503C\u5F8C\u518D\u7E7C\u7E8C\u904A\u6232",VIOLATION_WORD_DETECTED:"\u5167\u5BB9\u542B\u6709\u9055\u7981\u8A5E\uFF0C\u8ACB\u4FEE\u6539\u5F8C\u91CD\u8A66",CONTENT_FILTERED:"\u5167\u5BB9\u88AB\u5B89\u5168\u7B56\u7565\u6514\u622A\uFF0C\u8ACB\u8ABF\u6574\u5F8C\u91CD\u8A66",MODEL_REFUSAL:"\u6A21\u578B\u62D2\u7D55\u56DE\u61C9\uFF0C\u63DB\u500B\u8AAA\u6CD5\u8A66\u8A66",STREAM_INTERRUPTED:"\u56DE\u8986\u5DF2\u4E2D\u65B7\uFF0C\u8ACB\u91CD\u8A66",RATE_LIMITED:"\u64CD\u4F5C\u904E\u65BC\u983B\u7E41\uFF0C\u8ACB\u7A0D\u5F8C\u518D\u8A66",GENERATING_IN_PROGRESS:"\u76EE\u524D\u5287\u60C5\u6B63\u5728\u751F\u6210\u4E2D\uFF0C\u8ACB\u7A0D\u5019",CONCURRENT_GENERATION_LIMIT:"\u540C\u6642\u9032\u884C\u7684\u5287\u60C5\u592A\u591A\uFF0C\u8ACB\u7A0D\u5019\u518D\u8A66",INVENTORY_LIMIT:"\u9053\u5177\u6B04\u5DF2\u6EFF\uFF0C\u8ACB\u5148\u6E05\u7406\u518D\u65B0\u589E",CUSTOM_FIELDS_LIMIT:"\u64F4\u5145\u5C6C\u6027\u6B04\u4F4D\u5DF2\u6EFF\uFF0C\u8ACB\u5148\u522A\u9664\u518D\u65B0\u589E",MODEL_NOT_FOUND:"\u6240\u9078\u6A21\u578B\u4E0D\u53EF\u7528\uFF0C\u8ACB\u5207\u63DB\u5176\u4ED6\u6A21\u578B",GAME_NOT_FOUND:"\u627E\u4E0D\u5230\u5C0D\u61C9\u904A\u6232",INVALID_REQUEST:"\u8ACB\u6C42\u7121\u6548\uFF0C\u8ACB\u7A0D\u5F8C\u91CD\u8A66",INVALID_EXTRACT_RULE:"\u56DE\u8986\u64F7\u53D6\u8A2D\u5B9A\u7121\u6548\uFF0C\u8ACB\u7A0D\u5F8C\u91CD\u8A66",INTERNAL_ERROR:"\u670D\u52D9\u51FA\u4E86\u9EDE\u5C0F\u554F\u984C\uFF0C\u8ACB\u7A0D\u5F8C\u91CD\u8A66",NOT_INITIALIZED:"SDK \u5C1A\u672A\u521D\u59CB\u5316",NOT_SUPPORTED_IN_PREVIEW:"\u76EE\u524D\u4ECB\u9762\u5728\u9810\u89BD\u6A21\u5F0F\u4E0B\u4E0D\u53EF\u7528",NETWORK_ERROR:"\u7DB2\u8DEF\u7570\u5E38\uFF0C\u8ACB\u6AA2\u67E5\u9023\u7DDA",REQUEST_TIMEOUT:"\u8ACB\u6C42\u903E\u6642\uFF0C\u8ACB\u7A0D\u5F8C\u91CD\u8A66",MODEL_LOADING_TIMEOUT:"\u6A21\u578B\u56DE\u61C9\u903E\u6642\uFF0C\u8ACB\u7A0D\u5F8C\u91CD\u8A66",DAISY_CARD_REQUIRED:"\u56DE\u6EAF\u8A0A\u606F\u9700\u8981\u6709\u6548\u7684\u96DB\u83CA\u5361\u8A02\u95B1",MESSAGE_NOT_FOUND:"\u8A0A\u606F\u4E0D\u5B58\u5728\u6216\u7121\u6B0A\u64CD\u4F5C",MESSAGE_TOO_OLD:"\u50C5\u53EF\u56DE\u6EAF 30 \u5929\u5167\u7684\u8A0A\u606F",NO_MESSAGES_TO_DELETE:"\u8A72\u8A0A\u606F\u4E4B\u5F8C\u6C92\u6709\u53EF\u56DE\u6EAF\u7684\u8A0A\u606F",GENERATION_TIMEOUT:"\u751F\u6210\u903E\u6642\uFF0C\u8ACB\u91CD\u8A66",GENERATION_LOST:"\u751F\u6210\u9023\u7DDA\u4E2D\u65B7\uFF0C\u8ACB\u91CD\u8A66\uFF1B\u82E5\u5167\u5BB9\u5DF2\u751F\u6210\uFF0C\u91CD\u65B0\u6574\u7406\u5F8C\u53EF\u898B",REPETITION_LOOP:"\u56DE\u8986\u51FA\u73FE\u91CD\u8907\uFF0C\u8ACB\u91CD\u8A66\u6216\u63DB\u500B\u8AAA\u6CD5",SAVE_FAILED:"\u8A0A\u606F\u5132\u5B58\u5931\u6557\uFF0C\u672C\u6B21\u4E0D\u6263\u8CBB\uFF0C\u8ACB\u91CD\u8A66",FINALIZE_FAILED:"\u56DE\u8986\u8655\u7406\u5931\u6557\uFF0C\u8ACB\u91CD\u8A66",CONVERSATION_NOT_FOUND:"\u627E\u4E0D\u5230\u5C0D\u61C9\u5C0D\u8A71",EMPTY_MESSAGE:"\u8A0A\u606F\u5167\u5BB9\u4E0D\u80FD\u70BA\u7A7A",CONTINUE_MODEL_NOT_AVAILABLE:"\u7E8C\u5BEB\u6A21\u578B\u76EE\u524D\u4E0D\u53EF\u7528",CONTINUE_PROMPT_MISSING:"\u7E8C\u5BEB\u8A2D\u5B9A\u7F3A\u5931",GENERATION_ABORTED:"\u751F\u6210\u5DF2\u505C\u6B62"}},_t={common:{unknownError:"Something went wrong. Please try again.",violationWords:"Your content contains words that violate our community guidelines{words}. Please revise and try again.",close:"Close"},errors:{ASR_BAD_AUDIO:"Audio file is empty, too large, or unsupported",ASR_UPSTREAM_FAILED:"Speech recognition failed. Please try again.",ASR_MODEL_UNAVAILABLE:"Speech recognition is currently unavailable.",TTS_UNKNOWN_VOICE:"The character has no voice configured or the voice is unavailable",TTS_EMPTY_TEXT:"Enter text to speak",TTS_UPSTREAM_FAILED:"Speech generation failed. Please try again.",UNAUTHORIZED:"Your session has expired. Please sign in again.",INSUFFICIENT_CREDITS:"Not enough Garden Coins. Please top up to continue.",VIOLATION_WORD_DETECTED:"Your content contains prohibited words. Please revise and try again.",CONTENT_FILTERED:"Content was blocked by the safety filter. Please adjust and try again.",MODEL_REFUSAL:"The model declined to respond. Try rephrasing.",STREAM_INTERRUPTED:"The reply was interrupted. Please try again.",RATE_LIMITED:"Too many requests. Please wait a moment.",GENERATING_IN_PROGRESS:"A reply is already being generated. Please wait.",CONCURRENT_GENERATION_LIMIT:"Too many replies generating at once. Please wait.",INVENTORY_LIMIT:"Inventory is full. Remove some items first.",CUSTOM_FIELDS_LIMIT:"Custom field limit reached. Delete some fields first.",MODEL_NOT_FOUND:"That model is unavailable. Please pick another one.",GAME_NOT_FOUND:"Game not found.",INVALID_REQUEST:"Invalid request. Please try again.",INVALID_EXTRACT_RULE:"Invalid reply-extraction rule. Please try again.",INTERNAL_ERROR:"Something went wrong on our end. Please try again.",NOT_INITIALIZED:"The SDK is not initialized yet.",NOT_SUPPORTED_IN_PREVIEW:"This action is unavailable in preview mode.",NETWORK_ERROR:"Network error. Please check your connection.",REQUEST_TIMEOUT:"Request timed out. Please try again.",MODEL_LOADING_TIMEOUT:"The model took too long to respond. Please try again.",DAISY_CARD_REQUIRED:"Rolling back messages requires an active Daisy Card subscription.",MESSAGE_NOT_FOUND:"Message not found, or you do not have access to it.",MESSAGE_TOO_OLD:"You can only roll back messages from the last 30 days.",NO_MESSAGES_TO_DELETE:"There are no messages after this one to roll back.",GENERATION_TIMEOUT:"Generation timed out. Please try again.",GENERATION_LOST:"Lost connection while generating. Try again \u2014 if it finished, refresh to see it.",REPETITION_LOOP:"The reply started repeating itself. Try again or rephrase.",SAVE_FAILED:"Failed to save the message. You were not charged. Please try again.",FINALIZE_FAILED:"Failed to finish processing the reply. Please try again.",CONVERSATION_NOT_FOUND:"Conversation not found.",EMPTY_MESSAGE:"Message cannot be empty.",CONTINUE_MODEL_NOT_AVAILABLE:"The continuation model is currently unavailable.",CONTINUE_PROMPT_MISSING:"Continuation settings are missing.",GENERATION_ABORTED:"Generation stopped."}},Rt={common:{unknownError:"\u64CD\u4F5C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",violationWords:"\u30B3\u30DF\u30E5\u30CB\u30C6\u30A3\u30AC\u30A4\u30C9\u30E9\u30A4\u30F3\u306B\u53CD\u3059\u308B\u8A9E\u53E5{words}\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\u4FEE\u6B63\u3057\u3066\u304B\u3089\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",close:"\u9589\u3058\u308B"},errors:{ASR_BAD_AUDIO:"\u97F3\u58F0\u30D5\u30A1\u30A4\u30EB\u304C\u7A7A\u3001\u5BB9\u91CF\u8D85\u904E\u3001\u307E\u305F\u306F\u672A\u5BFE\u5FDC\u306E\u5F62\u5F0F\u3067\u3059",ASR_UPSTREAM_FAILED:"\u97F3\u58F0\u8A8D\u8B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044",ASR_MODEL_UNAVAILABLE:"\u97F3\u58F0\u8A8D\u8B58\u306F\u73FE\u5728\u5229\u7528\u3067\u304D\u307E\u305B\u3093",TTS_UNKNOWN_VOICE:"\u30AD\u30E3\u30E9\u30AF\u30BF\u30FC\u306E\u97F3\u58F0\u304C\u672A\u8A2D\u5B9A\u3001\u307E\u305F\u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093",TTS_EMPTY_TEXT:"\u8AAD\u307F\u4E0A\u3052\u308B\u30C6\u30AD\u30B9\u30C8\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044",TTS_UPSTREAM_FAILED:"\u97F3\u58F0\u3092\u751F\u6210\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044",UNAUTHORIZED:"\u30ED\u30B0\u30A4\u30F3\u306E\u6709\u52B9\u671F\u9650\u304C\u5207\u308C\u307E\u3057\u305F\u3002\u518D\u5EA6\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044\u3002",INSUFFICIENT_CREDITS:"\u30AC\u30FC\u30C7\u30F3\u30B3\u30A4\u30F3\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059\u3002\u30C1\u30E3\u30FC\u30B8\u3057\u3066\u304B\u3089\u7D9A\u3051\u3066\u304F\u3060\u3055\u3044\u3002",VIOLATION_WORD_DETECTED:"\u7981\u6B62\u8A9E\u53E5\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\u4FEE\u6B63\u3057\u3066\u304B\u3089\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",CONTENT_FILTERED:"\u5B89\u5168\u30DD\u30EA\u30B7\u30FC\u306B\u3088\u308A\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u307E\u3057\u305F\u3002\u5185\u5BB9\u3092\u8ABF\u6574\u3057\u3066\u304F\u3060\u3055\u3044\u3002",MODEL_REFUSAL:"\u30E2\u30C7\u30EB\u304C\u5FDC\u7B54\u3092\u62D2\u5426\u3057\u307E\u3057\u305F\u3002\u8868\u73FE\u3092\u5909\u3048\u3066\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",STREAM_INTERRUPTED:"\u8FD4\u4FE1\u304C\u4E2D\u65AD\u3055\u308C\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",RATE_LIMITED:"\u64CD\u4F5C\u304C\u983B\u7E41\u3059\u304E\u307E\u3059\u3002\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",GENERATING_IN_PROGRESS:"\u73FE\u5728\u30B9\u30C8\u30FC\u30EA\u30FC\u3092\u751F\u6210\u4E2D\u3067\u3059\u3002\u304A\u5F85\u3061\u304F\u3060\u3055\u3044\u3002",CONCURRENT_GENERATION_LIMIT:"\u540C\u6642\u306B\u751F\u6210\u4E2D\u306E\u30B9\u30C8\u30FC\u30EA\u30FC\u304C\u591A\u3059\u304E\u307E\u3059\u3002\u304A\u5F85\u3061\u304F\u3060\u3055\u3044\u3002",INVENTORY_LIMIT:"\u6301\u3061\u7269\u304C\u3044\u3063\u3071\u3044\u3067\u3059\u3002\u6574\u7406\u3057\u3066\u304B\u3089\u8FFD\u52A0\u3057\u3066\u304F\u3060\u3055\u3044\u3002",CUSTOM_FIELDS_LIMIT:"\u62E1\u5F35\u5C5E\u6027\u306E\u9805\u76EE\u304C\u4E0A\u9650\u306B\u9054\u3057\u307E\u3057\u305F\u3002\u524A\u9664\u3057\u3066\u304B\u3089\u8FFD\u52A0\u3057\u3066\u304F\u3060\u3055\u3044\u3002",MODEL_NOT_FOUND:"\u9078\u629E\u3057\u305F\u30E2\u30C7\u30EB\u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002\u5225\u306E\u30E2\u30C7\u30EB\u3092\u304A\u9078\u3073\u304F\u3060\u3055\u3044\u3002",GAME_NOT_FOUND:"\u5BFE\u8C61\u306E\u30B2\u30FC\u30E0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002",INVALID_REQUEST:"\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u7121\u52B9\u3067\u3059\u3002\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",INVALID_EXTRACT_RULE:"\u8FD4\u4FE1\u62BD\u51FA\u306E\u8A2D\u5B9A\u304C\u7121\u52B9\u3067\u3059\u3002\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",INTERNAL_ERROR:"\u30B5\u30FC\u30D0\u30FC\u5074\u3067\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",NOT_INITIALIZED:"SDK \u304C\u307E\u3060\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002",NOT_SUPPORTED_IN_PREVIEW:"\u3053\u306E\u6A5F\u80FD\u306F\u30D7\u30EC\u30D3\u30E5\u30FC\u30E2\u30FC\u30C9\u3067\u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002",NETWORK_ERROR:"\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30A8\u30E9\u30FC\u3067\u3059\u3002\u63A5\u7D9A\u3092\u3054\u78BA\u8A8D\u304F\u3060\u3055\u3044\u3002",REQUEST_TIMEOUT:"\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",MODEL_LOADING_TIMEOUT:"\u30E2\u30C7\u30EB\u306E\u5FDC\u7B54\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",DAISY_CARD_REQUIRED:"\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u30ED\u30FC\u30EB\u30D0\u30C3\u30AF\u306B\u306F\u30C7\u30A4\u30B8\u30FC\u30AB\u30FC\u30C9\u306E\u6709\u52B9\u306A\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u304C\u5FC5\u8981\u3067\u3059\u3002",MESSAGE_NOT_FOUND:"\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u5B58\u5728\u3057\u306A\u3044\u304B\u3001\u64CD\u4F5C\u3059\u308B\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",MESSAGE_TOO_OLD:"\u30ED\u30FC\u30EB\u30D0\u30C3\u30AF\u3067\u304D\u308B\u306E\u306F 30 \u65E5\u4EE5\u5185\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u307F\u3067\u3059\u3002",NO_MESSAGES_TO_DELETE:"\u3053\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u3088\u308A\u5F8C\u306B\u30ED\u30FC\u30EB\u30D0\u30C3\u30AF\u3067\u304D\u308B\u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u3042\u308A\u307E\u305B\u3093\u3002",GENERATION_TIMEOUT:"\u751F\u6210\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",GENERATION_LOST:"\u751F\u6210\u4E2D\u306B\u63A5\u7D9A\u304C\u5207\u308C\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002\u751F\u6210\u6E08\u307F\u306E\u5834\u5408\u306F\u518D\u8AAD\u307F\u8FBC\u307F\u3067\u8868\u793A\u3055\u308C\u307E\u3059\u3002",REPETITION_LOOP:"\u8FD4\u4FE1\u304C\u7E70\u308A\u8FD4\u3057\u306B\u306A\u308A\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u3044\u305F\u3060\u304F\u304B\u3001\u8868\u73FE\u3092\u5909\u3048\u3066\u304F\u3060\u3055\u3044\u3002",SAVE_FAILED:"\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u4ECA\u56DE\u306F\u8AB2\u91D1\u3055\u308C\u307E\u305B\u3093\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",FINALIZE_FAILED:"\u8FD4\u4FE1\u306E\u51E6\u7406\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",CONVERSATION_NOT_FOUND:"\u5BFE\u8C61\u306E\u4F1A\u8A71\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002",EMPTY_MESSAGE:"\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",CONTINUE_MODEL_NOT_AVAILABLE:"\u7D9A\u304D\u3092\u66F8\u304F\u30E2\u30C7\u30EB\u304C\u73FE\u5728\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002",CONTINUE_PROMPT_MISSING:"\u7D9A\u304D\u3092\u66F8\u304F\u8A2D\u5B9A\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002",GENERATION_ABORTED:"\u751F\u6210\u3092\u505C\u6B62\u3057\u307E\u3057\u305F\u3002"}},St={common:{unknownError:"\uC791\uC5C5\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",violationWords:"\uCEE4\uBBA4\uB2C8\uD2F0 \uADDC\uC815\uC5D0 \uC5B4\uAE0B\uB098\uB294 \uB2E8\uC5B4{words}\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uC218\uC815 \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",close:"\uB2EB\uAE30"},errors:{ASR_BAD_AUDIO:"\uC624\uB514\uC624 \uD30C\uC77C\uC774 \uBE44\uC5B4 \uC788\uAC70\uB098 \uB108\uBB34 \uD06C\uAC70\uB098 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uB294 \uD615\uC2DD\uC785\uB2C8\uB2E4",ASR_UPSTREAM_FAILED:"\uC74C\uC131 \uC778\uC2DD\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694",ASR_MODEL_UNAVAILABLE:"\uD604\uC7AC \uC74C\uC131 \uC778\uC2DD\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",TTS_UNKNOWN_VOICE:"\uCE90\uB9AD\uD130 \uC74C\uC131\uC774 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uAC70\uB098 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",TTS_EMPTY_TEXT:"\uC77D\uC744 \uB300\uC0AC\uB97C \uC785\uB825\uD574 \uC8FC\uC138\uC694",TTS_UPSTREAM_FAILED:"\uC74C\uC131 \uC0DD\uC131\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694",UNAUTHORIZED:"\uB85C\uADF8\uC778\uC774 \uB9CC\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uB85C\uADF8\uC778\uD574 \uC8FC\uC138\uC694.",INSUFFICIENT_CREDITS:"\uAC00\uB4E0 \uCF54\uC778\uC774 \uBD80\uC871\uD569\uB2C8\uB2E4. \uCDA9\uC804 \uD6C4 \uACC4\uC18D\uD574 \uC8FC\uC138\uC694.",VIOLATION_WORD_DETECTED:"\uAE08\uC9C0\uB41C \uB2E8\uC5B4\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uC218\uC815 \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",CONTENT_FILTERED:"\uC548\uC804 \uC815\uCC45\uC5D0 \uC758\uD574 \uCC28\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB0B4\uC6A9\uC744 \uC218\uC815\uD574 \uC8FC\uC138\uC694.",MODEL_REFUSAL:"\uBAA8\uB378\uC774 \uC751\uB2F5\uC744 \uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uB974\uAC8C \uD45C\uD604\uD574 \uBCF4\uC138\uC694.",STREAM_INTERRUPTED:"\uC751\uB2F5\uC774 \uC911\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",RATE_LIMITED:"\uC694\uCCAD\uC774 \uB108\uBB34 \uC7A6\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",GENERATING_IN_PROGRESS:"\uD604\uC7AC \uC2A4\uD1A0\uB9AC\uB97C \uC0DD\uC131 \uC911\uC785\uB2C8\uB2E4. \uC7A0\uC2DC\uB9CC \uAE30\uB2E4\uB824 \uC8FC\uC138\uC694.",CONCURRENT_GENERATION_LIMIT:"\uB3D9\uC2DC\uC5D0 \uC0DD\uC131 \uC911\uC778 \uC2A4\uD1A0\uB9AC\uAC00 \uB108\uBB34 \uB9CE\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",INVENTORY_LIMIT:"\uC18C\uC9C0\uD488\uC774 \uAC00\uB4DD \uCC3C\uC2B5\uB2C8\uB2E4. \uC815\uB9AC \uD6C4 \uCD94\uAC00\uD574 \uC8FC\uC138\uC694.",CUSTOM_FIELDS_LIMIT:"\uD655\uC7A5 \uC18D\uC131 \uD56D\uBAA9\uC774 \uAC00\uB4DD \uCC3C\uC2B5\uB2C8\uB2E4. \uC0AD\uC81C \uD6C4 \uCD94\uAC00\uD574 \uC8FC\uC138\uC694.",MODEL_NOT_FOUND:"\uC120\uD0DD\uD55C \uBAA8\uB378\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uB2E4\uB978 \uBAA8\uB378\uC744 \uC120\uD0DD\uD574 \uC8FC\uC138\uC694.",GAME_NOT_FOUND:"\uD574\uB2F9 \uAC8C\uC784\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",INVALID_REQUEST:"\uC798\uBABB\uB41C \uC694\uCCAD\uC785\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",INVALID_EXTRACT_RULE:"\uC751\uB2F5 \uCD94\uCD9C \uC124\uC815\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",INTERNAL_ERROR:"\uC11C\uBC84\uC5D0 \uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",NOT_INITIALIZED:"SDK\uAC00 \uC544\uC9C1 \uCD08\uAE30\uD654\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",NOT_SUPPORTED_IN_PREVIEW:"\uC774 \uAE30\uB2A5\uC740 \uBBF8\uB9AC\uBCF4\uAE30 \uBAA8\uB4DC\uC5D0\uC11C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",NETWORK_ERROR:"\uB124\uD2B8\uC6CC\uD06C \uC624\uB958\uC785\uB2C8\uB2E4. \uC5F0\uACB0\uC744 \uD655\uC778\uD574 \uC8FC\uC138\uC694.",REQUEST_TIMEOUT:"\uC694\uCCAD \uC2DC\uAC04\uC774 \uCD08\uACFC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",MODEL_LOADING_TIMEOUT:"\uBAA8\uB378 \uC751\uB2F5 \uC2DC\uAC04\uC774 \uCD08\uACFC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",DAISY_CARD_REQUIRED:"\uBA54\uC2DC\uC9C0 \uB418\uB3CC\uB9AC\uAE30\uB294 \uB370\uC774\uC9C0 \uCE74\uB4DC \uAD6C\uB3C5\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.",MESSAGE_NOT_FOUND:"\uBA54\uC2DC\uC9C0\uAC00 \uC5C6\uAC70\uB098 \uAD8C\uD55C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",MESSAGE_TOO_OLD:"30\uC77C \uC774\uB0B4\uC758 \uBA54\uC2DC\uC9C0\uB9CC \uB418\uB3CC\uB9B4 \uC218 \uC788\uC2B5\uB2C8\uB2E4.",NO_MESSAGES_TO_DELETE:"\uC774 \uBA54\uC2DC\uC9C0 \uC774\uD6C4\uC5D0 \uB418\uB3CC\uB9B4 \uBA54\uC2DC\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",GENERATION_TIMEOUT:"\uC0DD\uC131 \uC2DC\uAC04\uC774 \uCD08\uACFC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",GENERATION_LOST:"\uC0DD\uC131 \uC911 \uC5F0\uACB0\uC774 \uB04A\uACBC\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694. \uC774\uBBF8 \uC0DD\uC131\uB418\uC5C8\uB2E4\uBA74 \uC0C8\uB85C\uACE0\uCE68\uD558\uBA74 \uBCF4\uC785\uB2C8\uB2E4.",REPETITION_LOOP:"\uC751\uB2F5\uC774 \uBC18\uBCF5\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uAC70\uB098 \uB2E4\uB974\uAC8C \uD45C\uD604\uD574 \uC8FC\uC138\uC694.",SAVE_FAILED:"\uBA54\uC2DC\uC9C0 \uC800\uC7A5\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC774\uBC88\uC5D0\uB294 \uCC28\uAC10\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",FINALIZE_FAILED:"\uC751\uB2F5 \uCC98\uB9AC\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",CONVERSATION_NOT_FOUND:"\uD574\uB2F9 \uB300\uD654\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",EMPTY_MESSAGE:"\uBA54\uC2DC\uC9C0\uB97C \uC785\uB825\uD574 \uC8FC\uC138\uC694.",CONTINUE_MODEL_NOT_AVAILABLE:"\uC774\uC5B4\uC4F0\uAE30 \uBAA8\uB378\uC744 \uD604\uC7AC \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",CONTINUE_PROMPT_MISSING:"\uC774\uC5B4\uC4F0\uAE30 \uC124\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",GENERATION_ABORTED:"\uC0DD\uC131\uC744 \uC911\uC9C0\uD588\uC2B5\uB2C8\uB2E4."}},Ue={zh:yt,"zh-Hant":Ct,en:_t,ja:Rt,ko:St},ne="zh";function Le(o){if(!o)return null;let e=o.trim();if(!e)return null;if(wt.includes(e))return e;let t=e.toLowerCase();return t.startsWith("zh")?/hant|tw|hk|mo/.test(t)?"zh-Hant":"zh":t.startsWith("ja")?"ja":t.startsWith("ko")?"ko":t.startsWith("en")?"en":null}function $e(o){let e=Le(o);e&&(ne=e)}function Ge(){if(typeof navigator>"u")return;let o=Le(navigator.language);o&&(ne=o)}function re(){return ne}function Fe(o){return Ue[ne].errors[o]}function he(o){return Ue[ne].common[o]}var ve=null;function Be(o){ve=o}var Ve="storvia-sdk-toast-style",ue="storvia-sdk-toast-stack",At=`
2
+ #${ue} {
3
3
  position: fixed;
4
4
  top: max(20px, env(safe-area-inset-top, 0px) + 20px);
5
5
  right: max(20px, env(safe-area-inset-right, 0px) + 20px);
@@ -12,7 +12,7 @@
12
12
  }
13
13
 
14
14
  @media (max-width: 768px) {
15
- #${ce} {
15
+ #${ue} {
16
16
  top: max(10px, env(safe-area-inset-top, 0px) + 10px);
17
17
  left: 10px;
18
18
  right: 10px;
@@ -114,9 +114,9 @@
114
114
  @media (max-width: 768px) {
115
115
  .storvia-toast { max-width: none; }
116
116
  }
117
- `,yt={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>'},We=!0;function He(o){We=o}function wt(){if(typeof document>"u")return null;let o=document.getElementById(ce);if(!o){if(!document.getElementById($e)){let e=document.createElement("style");e.id=$e,e.textContent=Et,document.head.appendChild(e)}o=document.createElement("div"),o.id=ce,document.body.appendChild(o)}return o}function te(o,e="info",t=3500,n){if(!We)return;let r=wt();if(!r)return;let i=t<=0,s=document.createElement("div");s.className=`storvia-toast ${e}`,s.innerHTML=`
118
- <span class="storvia-toast-icon">${yt[e]}</span>
117
+ `,Ot={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>'},je=!0;function Ke(o){je=o}function Pt(){if(typeof document>"u")return null;let o=document.getElementById(ue);if(!o){if(!document.getElementById(Ve)){let e=document.createElement("style");e.id=Ve,e.textContent=At,document.head.appendChild(e)}o=document.createElement("div"),o.id=ue,document.body.appendChild(o)}return o}function oe(o,e="info",t=3500,n){if(!je)return;let r=Pt();if(!r)return;let i=t<=0,s=document.createElement("div");s.className=`storvia-toast ${e}`,s.innerHTML=`
118
+ <span class="storvia-toast-icon">${Ot[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",de("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 Tt(o){let e=o.filter(t=>t).map(t=>`\u300C${t}\u300D`).join("");return de("violationWords").replace("{words}",e)}var Ct=3e3,Ge={};function Fe(o){let e=Date.now();if(!(e-(Ge[o]??0)<Ct)){if(Ge[o]=e,!ge){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{ge(w("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 Fe("insufficient_credits");if(o==="DAISY_CARD_REQUIRED")return Fe("daisy_card_required");let n=o==="VIOLATION_WORD_DETECTED"&&t?.length?Tt(t):Le(o)||e||de("unknownError");te(n,o==="RATE_LIMITED"?"warning":"error")}function Rt(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)),h=()=>{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 v=s.slice(0,y);s=s.slice(y),v&&o(v)},f=()=>{d=null,h(),s&&(d=setTimeout(f,t))};return{push:y=>{let v=Date.now();if(a>0){let R=Math.min(v-a,r);c=c>0?c*.7+R*.3:R}a=v,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 me(o){let e=Rt(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 Be="0.10.8";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 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/${Be}`,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,h="%c[Storvia SDK]",f="color: #6366f1; font-weight: bold",m=a!==void 0?` (${a}ms)`:"",u=i!==void 0?` [${i}]`:"",C=l?` [model: ${l}]`:"";c?(console.groupCollapsed(`${h} %c${t} ${n}${u}${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(`${h} %c${t} ${n}${u}${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:h}=await this.handleResponseWithRaw(a);return s=l,this.log({method:"GET",path:e,body:t,status:i,rawResponse:s,parsedData:h,durationMs:Date.now()-r}),h}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:h}=await this.handleResponseWithRaw(a);return s=l,this.log({method:"POST",path:e,body:t,status:i,rawResponse:s,parsedData:h,durationMs:Date.now()-r,modelName:n?.modelName}),h}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,h,f){let m=Date.now(),u=i?.modelName?` [model: ${i.modelName}]`:"",C=[],y=E=>{this.debug&&C.push({t:Date.now()-m,event:E})},{cbs:v,flush:R}=me({onChunk:n,onDone:r,onState:s,onThinking:d,onCreatedCharacters:c,onReconnect:l,onAborted:h,onBase:f}),Re=new AbortController,k=null,_=null,N=null,D=()=>{k!==null&&(clearTimeout(k),k=null),_!==null&&(clearTimeout(_),_=null)},_e=E=>{N=E,D(),Re.abort()};k=setTimeout(()=>_e("REQUEST_TIMEOUT"),T.REQUEST_TIMEOUT);let P;try{P=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t),signal:Re.signal})}catch(E){if(D(),N){let I=new g(N,"Request timed out");throw S(N),this.log({method:"STREAM",path:e,body:t,error:I,durationMs:Date.now()-m,modelName:i?.modelName}),I}throw this.maybeShowNetworkToast(E),E}if(k!==null&&(clearTimeout(k),k=null),!P.ok){D();let E=await P.text().catch(()=>""),I={};try{I=JSON.parse(E)}catch{}let b=I.code||"INTERNAL_ERROR",p=I.message||I.error||I.details,Ne=Array.isArray(I.matched_words)?I.matched_words:void 0,Ae=new g(b,p||`HTTP ${P.status}`,Ne);throw S(b,p,Ne),this.log({method:"STREAM",path:e,body:t,status:P.status,rawResponse:E,error:Ae,durationMs:Date.now()-m,modelName:i?.modelName}),Ae}let Se=P.body?.getReader();if(!Se)throw D(),new g("INTERNAL_ERROR","No response body for stream");_=setTimeout(()=>_e("MODEL_LOADING_TIMEOUT"),T.INITIAL_TIMEOUT);let Pe=new TextDecoder,X="",he,ie,M="",se,ae,U="",L=!1,O=null,Oe=E=>{if(L)return;let I=E.endsWith("\r")?E.slice(0,-1):E;if(I.startsWith("id: ")){ae=I.slice(4);return}if(!I.startsWith("data: "))return;let b=I.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,he=p.truncated===!0):p.type==="aborted"?(ie={id:typeof p.id=="string"?p.id:"",persisted:p.persisted===!0},L=!0):p.type==="error"?(O=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"?(v.onState?.(p.delta,p.full??null),Array.isArray(p.createdNames)&&p.createdNames.length&&v.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")&&v.onThinking?.(p.status):p.content&&(_!==null&&(clearTimeout(_),_=null),M+=p.content,v.onChunk(p.content))}catch{y({raw:b})}ae!==void 0&&(se=ae,ae=void 0)},be=()=>{if(D(),O)throw R(),S(O.code,O.message,O.matchedWords),this.log({method:"STREAM",path:e,body:t,error:O,durationMs:Date.now()-m,modelName:i?.modelName}),O;this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${P.status}]${u} (${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),ie&&console.log("Aborted:",ie),console.log(`SSE events (${C.length}):`,C),console.groupEnd()),G(v,{messageId:X,truncated:he,aborted:ie})};try{for(;;){let{done:E,value:I}=await Se.read();if(E)break;U+=Pe.decode(I,{stream:!0});let b=U.split(`
121
- `);U=b.pop()??"";for(let p of b)Oe(p);if(L){be();return}}if(U+=Pe.decode(),U&&Oe(U),L){be();return}}catch(E){if(D(),O)throw O;if(N){let I=new g(N,"Stream did not start in time");if(this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${P.status}]${u} (${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:",I),console.groupEnd()),a){await this.resumeLoop(a,se,v,{finalize:!0});return}throw S(N),R(),I}if(this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${P.status}]${u} (${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,se,v,{finalize:!0});return}throw R(),E}if(D(),X){G(v,{messageId:X,truncated:he});return}if(a){await this.resumeLoop(a,se,v,{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(h=>setTimeout(h,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}=me(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(),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 h=a.body?.getReader();return h?await this.pumpReader(h,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=h=>{if(a)return;let f=h.endsWith("\r")?h.slice(0,-1):h;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 u=JSON.parse(m);u.type==="done"&&u.id?(t.messageId=u.id,t.truncated=u.truncated===!0):u.type==="aborted"?(t.aborted={id:typeof u.id=="string"?u.id:"",persisted:u.persisted===!0},a=!0):u.type==="error"?(t.errorCode=u.code||"INTERNAL_ERROR",t.errorMessage=u.message||"Generation failed",Array.isArray(u.matched_words)&&(t.errorMatchedWords=u.matched_words),a=!0):u.type==="state"?(n.onState?.(u.delta,u.full??null),Array.isArray(u.createdNames)&&u.createdNames.length&&n.onCreatedCharacters?.(u.createdNames)):u.type==="start"?typeof u.base_content=="string"&&n.onBase?.(u.base_content):u.type==="thinking"?(u.status==="start"||u.status==="end")&&n.onThinking?.(u.status):u.content&&n.onChunk(u.content)}catch{}i!==void 0&&(t.lastId=i,i=void 0)};try{for(;;){let{done:h,value:f}=await e.read();if(h)break;d(),c+=r.decode(f,{stream:!0});let m=c.split(`
122
- `);c=m.pop()??"";for(let u of m)l(u);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 ne=T;var fe=o=>o.trim().toLowerCase();function re(o){let e=Ue(),t=o.name_i18n??{};return t[e]||t[e.replace("-","_")]||o.name}function je(o,e){let t=fe(e);return o.find(n=>fe(n.name)===t)??o.find(n=>Object.values(n.name_i18n??{}).some(r=>typeof r=="string"&&fe(r)===t))}var qe="storvia_chat_main";function _t(){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 Ke=20,Ye=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:_t()};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?-(Ke-1):-Ke);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 h="";await this.http.stream("/preview",r,f=>{h+=f,e.onChunk?.(f)},(f,m)=>{h&&this.pushPreviewHistory({role:"assistant",content:h}),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,h=>{s+=h},()=>{},this.reqMeta(),(h,f)=>{d=h,c=f,e.onState&&e.onState(d,c)},void 0,h=>{a=h,e.onCreatedCharacters&&e.onCreatedCharacters(h)}),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>Ye&&this.previewHistory.splice(0,this.previewHistory.length-Ye)}};function F(o){if(o)return(e,t)=>o(e,t)}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,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})}},W=class{constructor(e,t,n=!1,r,i){this.http=e;this.getConversationId=t;this.isPreview=n;this.mem=[];r&&(this.mem=r.map(ze)),this.state=new ve(e,t,n,i)}previewNames(){return this.mem.map(e=>e.name)}setInitial(e,t){this.mem=e?e.map(ze):[],this.state.setInitial(t)}async list(){return this.isPreview?this.mem.map(Qe):this.http.get(`/conversations/${this.getConversationId()}/characters`)}async get(e){if(this.isPreview){let t=this.mem.find(n=>n.name===e);return t?Qe(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 ze(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 Qe(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 Ze="\u73A9\u5BB6",St=["Player","player","PLAYER","\u30D7\u30EC\u30A4\u30E4\u30FC","\uD50C\uB808\uC774\uC5B4","\u4E3B\u63A7","{{user}}","user"],Ie=o=>o.toLowerCase().replace(/[\s_\-]+/g,""),Pt=new Set(["\u73A9\u5BB6",...St].map(Ie));function Xe(o,e){if(o==="\u73A9\u5BB6")return o;let t=Ie(o);return Pt.has(t)?e.some(n=>Ie(n)===t)?o:"\u73A9\u5BB6":o}var H=class{constructor(e,t,n=!1,r,i=()=>[]){this.http=e;this.getConversationId=t;this.isPreview=n;this.getCharacterNames=i;this.mem=[];r&&(this.mem=r.map(s=>({...s})))}setInitial(e){this.mem=e?e.map(t=>({...t})):[]}entity(e){return this.isPreview?Xe(e,this.getCharacterNames()):e}async list(){return this.isPreview?[...this.mem]:this.http.get(`/conversations/${this.getConversationId()}/relationships`)}async get(e,t){if(this.isPreview){e=this.entity(e),t=this.entity(t);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,from:this.entity(e.from),to:this.entity(e.to)});return}await this.http.post(`/conversations/${this.getConversationId()}/relationships`,e)}async update(e,t,n){if(this.isPreview){e=this.entity(e),t=this.entity(t);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){e=this.entity(e),t=this.entity(t),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 Je(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 Ee(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]=Je(s);e[t]=r}return e}function Ot(o){let e={};if(!o)return e;for(let[t,n]of Object.entries(o))e[t]=Je(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=Ee(r))}setInitial(e){this.mem=e?Ee(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 Ot(n)}let t=await this.http.get(`/conversations/${this.getConversationId()}/inventory`);return Ee(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 ye=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 ye(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 Y(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=et(i)),s&&(this.memInject={...s})}setInitial(e,t){this.mem=e?et(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(Y(`/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(Y(`/conversations/${this.getConversationId()}/custom`,this.getGameId()),n)}async setInject(e,t){if(this.isPreview){this.memInject[e]=t;return}await this.http.patch(Y(`/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(Y(`/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(Y(`/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(Y(`/conversations/${this.getConversationId()}/custom/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,this.getGameId()))}};function et(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 tt(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(tt(`/conversations/${this.getConversationId()}/save`,this.getGameId()))}async set(e){if(this.isPreview){this.mem={...e};return}await this.http.put(tt(`/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?nt(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=bt(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??"",contentWidget:t.contentWidget??this.wb?.contentWidget??!1,entries:t.entries??this.wb?.entries??[],presets:i,updated_at:new Date().toISOString()};return this.wb=s,nt(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 nt(o){return{...o,entries:o.entries.map(e=>({...e,keys:[...e.keys]})),presets:(o.presets??[]).map(e=>({...e}))}}function bt(o){return(o??[]).flatMap(e=>{let t=(e?.content??"").trim(),n=[...new Set((e?.keys??[]).map(s=>(s??"").trim()).filter(s=>s!==""))],r=e?.constant===!0;if(!t||!r&&n.length===0)return[];let i=(e?.title??"").trim();return[{id:e.id||Nt(),keys:n,content:t,...i?{title:i}:{},constant:r,enabled:e?.enabled!==!1,widget:e?.widget===!0}]})}function Nt(){let o=globalThis.crypto;return o?.randomUUID?o.randomUUID():`ewr-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var we=60,Te=1e3,le=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=At(e);if(!t)return!1;let n=this.now();return n-this.lastNotifyAt<Te?!1:(this.lastNotifyAt=n,this.isPreview?(te(t,"info"),!0):(this.send(w("host-notify",{text:t})),!0))}refreshPanel(e){if(this.isPreview)return!1;let t=this.now();return t-this.lastRefreshAt<le?!1:(this.lastRefreshAt=t,this.send(w("host-state-changed",e?.length?{scope:e}:{})),!0)}refreshMessages(){if(this.isPreview)return!1;let e=this.now();return e-this.lastRefreshMessagesAt<le?!1:(this.lastRefreshMessagesAt=e,this.send(w("host-messages-changed",{})),!0)}};function At(o){return typeof o!="string"?"":o.replace(/\s+/g," ").trim().slice(0,we)}var rt="/functions/v1/world-engine/v1",kt="https://api.storvia.ai";function Dt(){return window.__STORVIA__||{}}function Mt(o,e=3e4){let t=Dt();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(w("ready",{}))})}var oe=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}),Ve(l=>this.bus.send(l));let n=await Mt(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}${rt}`,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,Me(n.lang),this.http=new ne(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,h]=await Promise.all([this.fetchPreviewSnapshot(),this.modelId?Promise.resolve(null):this.fetchModels()]);h&&(this.models=h,this.modelId=h[0]?.id||""),this.presetId=n.presetId||"";let f=()=>this.gameId,m=()=>this.conversationId,u=()=>this.modelId,C=()=>{let v=this.models.find(R=>R.id===this.modelId);return v?re(v):void 0},y=()=>this.presetId||void 0;this.chat=new V(this.http,f,m,u,!0,this.previewConfig,C,y),this.characters=new W(this.http,m,!0,l?.characters,l?.characterStates),this.relationships=new H(this.http,m,!0,l?.relationships,()=>this.characters.previewNames()),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 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 Q(this.http,m,!0),this.memory=new Z(this.http,m,!0),this.host=new A(v=>this.bus.send(v),!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=()=>{let l=this.models.find(h=>h.id===this.modelId);return l?re(l):void 0},a=()=>this.presetId||void 0;this.chat=new V(this.http,i,s,d,!1,void 0,c,a),this.characters=new W(this.http,s),this.relationships=new H(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 q(this.http,s,i),this.save=new z(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=`${kt}${rt}`,this.gameId=e.gameId,this.isPreview=!0,this.http=new ne(this.baseUrl,"",!1,e.apiKey);let[t,n]=await Promise.all([this.fetchModels(),this.fetchPreviewSnapshot()]);this.models=t;let r=e.model?je(t,e.model):void 0;e.model&&!r&&console.warn(`[Storvia SDK] dev.model "${e.model}" not found, falling back to the first model. Available:`,t.map(re)),this.modelId=r?.id||t[0]?.id||"",this.conversationId="00000000-0000-0000-0000-000000000000";let i=()=>this.gameId,s=()=>this.conversationId,d=()=>this.modelId,c=()=>{let l=this.models.find(h=>h.id===this.modelId);return l?re(l):void 0};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 W(this.http,s,!0,n?.characters,n?.characterStates),this.relationships=new H(this.http,s,!0,n?.relationships,()=>this.characters.previewNames()),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 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 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 ot(o){xe();let e=new oe;return o?.dev?await e.initDev(o.dev):await e.init(),e}function Ce(o){return typeof o=="object"&&o!==null&&"value"in o&&"type"in o&&(o.type==="number"||o.type==="text")}function it(o){return Ce(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,PLAYER_ID,PROTOCOL_VERSION,StorviaBus,StorviaError,StorviaSDK,createStorviaSDK,envelope,extractFieldValue,isProtocolEnvelope,isRichFieldValue,setToastEnabled,showToast});
120
+ `;let c=s.querySelector(".storvia-toast-msg");c&&(c.textContent=o);let l=()=>{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(d){console.error("[Storvia toast] action error:",d)}l()}),s.appendChild(a)}if(i){let a=document.createElement("button");a.type="button",a.className="storvia-toast-close",a.setAttribute("aria-label",he("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",l),s.appendChild(a)}r.appendChild(s),requestAnimationFrame(()=>s.classList.add("show")),i||setTimeout(l,t)}function bt(o){let e=o.filter(t=>t).map(t=>`\u300C${t}\u300D`).join("");return he("violationWords").replace("{words}",e)}var Nt=3e3,He={};function We(o){let e=Date.now();if(!(e-(He[o]??0)<Nt)){if(He[o]=e,!ve){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{ve(y("navigate",{target:"wallet",reason:o}))}catch(t){console.error("[Storvia] navigate \u2192 wallet \u901A\u8FC7 bus \u53D1\u9001\u5931\u8D25:",t)}}}function R(o,e,t){if(o==="GENERATION_ABORTED")return;if(o==="INSUFFICIENT_CREDITS")return We("insufficient_credits");if(o==="DAISY_CARD_REQUIRED")return We("daisy_card_required");let n=o==="VIOLATION_WORD_DETECTED"&&t?.length?bt(t):Fe(o)||e||he("unknownError");oe(n,o==="RATE_LIMITED"?"warning":"error")}function Dt(o,e){let t=e?.tickMs??100,n=e?.baseLagMs??1e3,r=e?.maxLagMs??2500,i=e?.minCharsPerTick??2,s="",c=null,l=0,a=0,d=()=>Math.min(r,Math.max(n,l*1.35)),h=()=>{let w=Math.max(i,Math.ceil(s.length*t/d()));if(w>=s.length)w=s.length;else{let _=s.charCodeAt(w-1);_>=55296&&_<=56319&&w++}let v=s.slice(0,w);s=s.slice(w),v&&o(v)},m=()=>{c=null,h(),s&&(c=setTimeout(m,t))};return{push:w=>{let v=Date.now();if(a>0){let _=Math.min(v-a,r);l=l>0?l*.7+_*.3:_}a=v,s+=w,c===null&&m()},flush:()=>{c!==null&&(clearTimeout(c),c=null),s&&(o(s),s="")},cancel:()=>{c!==null&&(clearTimeout(c),c=null),s=""}}}function Ie(o){let e=Dt(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 Ye="0.10.9";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 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}ttsClient(){return new T(this.baseUrl.replace(/\/world-engine\/v1$/,"/tts"),this.token,this.debug,this.devApiKey)}asrClient(){return new T(this.baseUrl.replace(/\/world-engine\/v1$/,"/asr"),this.token,this.debug,this.devApiKey)}async postForm(e,t,n=T.REQUEST_TIMEOUT){let r=this.buildHeaders();delete r["Content-Type"];let{controller:i,clear:s}=this.createTimeoutController(n);try{let c=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:r,body:t,signal:i.signal});return(await this.handleResponseWithRaw(c)).data}catch(c){let l=this.wrapAbortError(c);throw l===c&&this.maybeShowNetworkToast(c),l}finally{s()}}async postAudio(e,t){let{controller:n,clear:r}=this.createTimeoutController();try{let i=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t),signal:n.signal});i.ok||await this.handleResponseWithRaw(i);let{audio_url:s}=await i.json(),c=await fetch(s,{signal:n.signal});if(!c.ok)throw new u("TTS_UPSTREAM_FAILED",`Audio download failed: HTTP ${c.status}`);if(c.headers.get("Content-Type")?.includes("application/json"))throw new u("TTS_UPSTREAM_FAILED","Audio download returned JSON");return await c.blob()}catch(i){let s=this.wrapAbortError(i);throw s===i&&this.maybeShowNetworkToast(i),s}finally{r()}}setDebug(e){this.debug=e}maybeShowNetworkToast(e){e instanceof u||R("NETWORK_ERROR")}wrapAbortError(e){if(e instanceof DOMException&&e.name==="AbortError"){let t=new u("REQUEST_TIMEOUT","Request timed out");return R("REQUEST_TIMEOUT"),t}return e}createTimeoutController(e=T.REQUEST_TIMEOUT){let t=new AbortController,n=setTimeout(()=>t.abort(),e);return{controller:t,clear:()=>clearTimeout(n)}}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/${Ye}`,e}log(e){if(!this.debug)return;let{method:t,path:n,body:r,status:i,rawResponse:s,parsedData:c,error:l,durationMs:a,modelName:d}=e,h="%c[Storvia SDK]",m="color: #6366f1; font-weight: bold",f=a!==void 0?` (${a}ms)`:"",p=i!==void 0?` [${i}]`:"",C=d?` [model: ${d}]`:"";l?(console.groupCollapsed(`${h} %c${t} ${n}${p}${C}${f} %c\u2717`,m,"color: #e0e0e0","color: #ef4444"),r!==void 0&&console.log("Request:",r),s!==void 0&&console.log("Response (raw):",s),console.error("Error:",l),console.groupEnd()):(console.groupCollapsed(`${h} %c${t} ${n}${p}${C}${f} %c\u2713`,m,"color: #e0e0e0","color: #22c55e"),r!==void 0&&console.log("Request:",r),s!==void 0&&console.log("Response (raw):",s),c!==void 0&&c!==s&&console.log("Response (data):",c),console.groupEnd())}async get(e,t){let n=new URL(`${this.baseUrl}${e}`);t&&Object.entries(t).forEach(([a,d])=>n.searchParams.set(a,d));let r=Date.now(),i,s,{controller:c,clear:l}=this.createTimeoutController();try{let a=await fetch(n.toString(),{method:"GET",headers:this.buildHeaders(),signal:c.signal});l(),i=a.status;let{raw:d,data:h}=await this.handleResponseWithRaw(a);return s=d,this.log({method:"GET",path:e,body:t,status:i,rawResponse:s,parsedData:h,durationMs:Date.now()-r}),h}catch(a){l();let d=this.wrapAbortError(a);throw this.log({method:"GET",path:e,body:t,status:i,rawResponse:s,error:d,durationMs:Date.now()-r}),d===a&&this.maybeShowNetworkToast(a),d}}async post(e,t,n){let r=Date.now(),i,s,{controller:c,clear:l}=this.createTimeoutController();try{let a=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:c.signal});l(),i=a.status;let{raw:d,data:h}=await this.handleResponseWithRaw(a);return s=d,this.log({method:"POST",path:e,body:t,status:i,rawResponse:s,parsedData:h,durationMs:Date.now()-r,modelName:n?.modelName}),h}catch(a){l();let d=this.wrapAbortError(a);throw this.log({method:"POST",path:e,body:t,status:i,rawResponse:s,error:d,durationMs:Date.now()-r,modelName:n?.modelName}),d===a&&this.maybeShowNetworkToast(a),d}}async patch(e,t){let n=Date.now(),r,i,{controller:s,clear:c}=this.createTimeoutController();try{let l=await fetch(`${this.baseUrl}${e}`,{method:"PATCH",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:s.signal});c(),r=l.status;let{raw:a,data:d}=await this.handleResponseWithRaw(l);return i=a,this.log({method:"PATCH",path:e,body:t,status:r,rawResponse:i,parsedData:d,durationMs:Date.now()-n}),d}catch(l){c();let a=this.wrapAbortError(l);throw this.log({method:"PATCH",path:e,body:t,status:r,rawResponse:i,error:a,durationMs:Date.now()-n}),a===l&&this.maybeShowNetworkToast(l),a}}async put(e,t){let n=Date.now(),r,i,{controller:s,clear:c}=this.createTimeoutController();try{let l=await fetch(`${this.baseUrl}${e}`,{method:"PUT",headers:this.buildHeaders(),body:t?JSON.stringify(t):void 0,signal:s.signal});c(),r=l.status;let{raw:a,data:d}=await this.handleResponseWithRaw(l);return i=a,this.log({method:"PUT",path:e,body:t,status:r,rawResponse:i,parsedData:d,durationMs:Date.now()-n}),d}catch(l){c();let a=this.wrapAbortError(l);throw this.log({method:"PUT",path:e,body:t,status:r,rawResponse:i,error:a,durationMs:Date.now()-n}),a===l&&this.maybeShowNetworkToast(l),a}}async delete(e){let t=Date.now(),n,r,{controller:i,clear:s}=this.createTimeoutController();try{let c=await fetch(`${this.baseUrl}${e}`,{method:"DELETE",headers:this.buildHeaders(),signal:i.signal});s(),n=c.status;let{raw:l,data:a}=await this.handleResponseWithRaw(c);return r=l,this.log({method:"DELETE",path:e,status:n,rawResponse:r,parsedData:a,durationMs:Date.now()-t}),a}catch(c){s();let l=this.wrapAbortError(c);throw this.log({method:"DELETE",path:e,status:n,rawResponse:r,error:l,durationMs:Date.now()-t}),l===c&&this.maybeShowNetworkToast(c),l}}async stream(e,t,n,r,i,s,c,l,a,d,h,m){let f=Date.now(),p=i?.modelName?` [model: ${i.modelName}]`:"",C=[],w=E=>{this.debug&&C.push({t:Date.now()-f,event:E})},{cbs:v,flush:_}=Ie({onChunk:n,onDone:r,onState:s,onThinking:c,onCreatedCharacters:l,onReconnect:d,onAborted:h,onBase:m}),Oe=new AbortController,D=null,S=null,b=null,k=()=>{D!==null&&(clearTimeout(D),D=null),S!==null&&(clearTimeout(S),S=null)},Pe=E=>{b=E,k(),Oe.abort()};D=setTimeout(()=>Pe("REQUEST_TIMEOUT"),T.REQUEST_TIMEOUT);let A;try{A=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t),signal:Oe.signal})}catch(E){if(k(),b){let I=new u(b,"Request timed out");throw R(b),this.log({method:"STREAM",path:e,body:t,error:I,durationMs:Date.now()-f,modelName:i?.modelName}),I}throw this.maybeShowNetworkToast(E),E}if(D!==null&&(clearTimeout(D),D=null),!A.ok){k();let E=await A.text().catch(()=>""),I={};try{I=JSON.parse(E)}catch{}let P=I.code||"INTERNAL_ERROR",g=I.message||I.error||I.details,Me=Array.isArray(I.matched_words)?I.matched_words:void 0,xe=new u(P,g||`HTTP ${A.status}`,Me);throw R(P,g,Me),this.log({method:"STREAM",path:e,body:t,status:A.status,rawResponse:E,error:xe,durationMs:Date.now()-f,modelName:i?.modelName}),xe}let be=A.body?.getReader();if(!be)throw k(),new u("INTERNAL_ERROR","No response body for stream");S=setTimeout(()=>Pe("MODEL_LOADING_TIMEOUT"),T.INITIAL_TIMEOUT);let Ne=new TextDecoder,ee="",ge,ce,M="",de,le,U="",L=!1,O=null,De=E=>{if(L)return;let I=E.endsWith("\r")?E.slice(0,-1):E;if(I.startsWith("id: ")){le=I.slice(4);return}if(!I.startsWith("data: "))return;let P=I.slice(6);if(P==="[DONE]"){w("[DONE]"),L=!0;return}try{let g=JSON.parse(P);w(g),g.type==="done"&&g.id?(ee=g.id,ge=g.truncated===!0):g.type==="aborted"?(ce={id:typeof g.id=="string"?g.id:"",persisted:g.persisted===!0},L=!0):g.type==="error"?(O=new u(g.code||"INTERNAL_ERROR",g.message||"Generation failed",Array.isArray(g.matched_words)?g.matched_words:void 0),L=!0):g.type==="state"?(v.onState?.(g.delta,g.full??null),Array.isArray(g.createdNames)&&g.createdNames.length&&v.onCreatedCharacters?.(g.createdNames)):g.type==="start"?(S!==null&&(clearTimeout(S),S=null),typeof g.base_content=="string"&&m?.(g.base_content)):g.type==="thinking"?(g.status==="start"||g.status==="end")&&v.onThinking?.(g.status):g.content&&(S!==null&&(clearTimeout(S),S=null),M+=g.content,v.onChunk(g.content))}catch{w({raw:P})}le!==void 0&&(de=le,le=void 0)},ke=()=>{if(k(),O)throw _(),R(O.code,O.message,O.matchedWords),this.log({method:"STREAM",path:e,body:t,error:O,durationMs:Date.now()-f,modelName:i?.modelName}),O;this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${A.status}]${p} (${Date.now()-f}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:",ee),ce&&console.log("Aborted:",ce),console.log(`SSE events (${C.length}):`,C),console.groupEnd()),G(v,{messageId:ee,truncated:ge,aborted:ce})};try{for(;;){let{done:E,value:I}=await be.read();if(E)break;U+=Ne.decode(I,{stream:!0});let P=U.split(`
121
+ `);U=P.pop()??"";for(let g of P)De(g);if(L){ke();return}}if(U+=Ne.decode(),U&&De(U),L){ke();return}}catch(E){if(k(),O)throw O;if(b){let I=new u(b,"Stream did not start in time");if(this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${A.status}]${p} (${Date.now()-f}ms) %c\u2717 ${b}`,"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:",I),console.groupEnd()),a){await this.resumeLoop(a,de,v,{finalize:!0});return}throw R(b),_(),I}if(this.debug&&(console.groupCollapsed(`%c[Storvia SDK] %cSTREAM ${e} [${A.status}]${p} (${Date.now()-f}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,de,v,{finalize:!0});return}throw _(),E}if(k(),ee){G(v,{messageId:ee,truncated:ge});return}if(a){await this.resumeLoop(a,de,v,{finalize:!0});return}_()}async resumeLoop(e,t,n,r){let i=t;for(let c=1;c<=T.RECONNECT_MAX_ATTEMPTS;c++){let l=Math.min(T.RECONNECT_BACKOFF_CAP,1e3*2**(c-1));await new Promise(h=>setTimeout(h,l)),n.onReconnect?.({attempt:c});let a={messageId:"",lastId:i},d;try{d=await this.pumpGetStream(e.conversationId,e.topic,i,a,n)}catch{continue}if(i=a.lastId??i,d==="done"){if(a.errorCode)throw this.terminalError(a);G(n,a);return}if(d==="inactive"){(a.messageId||r?.finalize)&&G(n,a);return}}let s=new u("STREAM_INTERRUPTED","Stream reconnection failed after maximum attempts");throw R("STREAM_INTERRUPTED"),s}async resumeStream(e,t,n){let{cbs:r}=Ie(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 u(e.errorCode??"INTERNAL_ERROR",e.errorMessage||"Generation failed",e.errorMatchedWords);return R(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 c=new AbortController,l=setTimeout(()=>c.abort(),T.REQUEST_TIMEOUT),a;try{a=await fetch(s.toString(),{method:"GET",headers:this.buildHeaders(),signal:c.signal})}finally{clearTimeout(l)}if(!a.ok)throw new u("STREAM_INTERRUPTED",`Resume HTTP ${a.status}`);if(!(a.headers.get("content-type")||"").includes("text/event-stream"))return"inactive";let h=a.body?.getReader();return h?await this.pumpReader(h,r,i):"inactive"}async pumpReader(e,t,n){let r=new TextDecoder,i,s=null,c=()=>{s&&clearTimeout(s),s=setTimeout(()=>{e.cancel().catch(()=>{})},T.RESUME_STALL_TIMEOUT)};c();let l="",a=!1,d=h=>{if(a)return;let m=h.endsWith("\r")?h.slice(0,-1):h;if(m.startsWith("id: ")){i=m.slice(4);return}if(!m.startsWith("data: "))return;let f=m.slice(6);if(f==="[DONE]"){a=!0;return}try{let p=JSON.parse(f);p.type==="done"&&p.id?(t.messageId=p.id,t.truncated=p.truncated===!0):p.type==="aborted"?(t.aborted={id:typeof p.id=="string"?p.id:"",persisted:p.persisted===!0},a=!0):p.type==="error"?(t.errorCode=p.code||"INTERNAL_ERROR",t.errorMessage=p.message||"Generation failed",Array.isArray(p.matched_words)&&(t.errorMatchedWords=p.matched_words),a=!0):p.type==="state"?(n.onState?.(p.delta,p.full??null),Array.isArray(p.createdNames)&&p.createdNames.length&&n.onCreatedCharacters?.(p.createdNames)):p.type==="start"?typeof p.base_content=="string"&&n.onBase?.(p.base_content):p.type==="thinking"?(p.status==="start"||p.status==="end")&&n.onThinking?.(p.status):p.content&&n.onChunk(p.content)}catch{}i!==void 0&&(t.lastId=i,i=void 0)};try{for(;;){let{done:h,value:m}=await e.read();if(h)break;c(),l+=r.decode(m,{stream:!0});let f=l.split(`
122
+ `);l=f.pop()??"";for(let p of f)d(p);if(a)return s&&clearTimeout(s),"done"}if(l+=r.decode(),l&&d(l),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.error_code??r.code,c=s==="TTS_INSUFFICIENT_CREDITS"?"INSUFFICIENT_CREDITS":s==="TTS_RATE_LIMITED"?"RATE_LIMITED":s||i[e.status]||"INTERNAL_ERROR",l=Array.isArray(r.matched_words)?r.matched_words:void 0,a=new u(c,r.message||`HTTP ${e.status}`,l);throw R(c,r.message,l),a}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 ie=T;var Ee=o=>o.trim().toLowerCase();function se(o){let e=re(),t=o.name_i18n??{};return t[e]||t[e.replace("-","_")]||o.name}function qe(o,e){let t=Ee(e);return o.find(n=>Ee(n.name)===t)??o.find(n=>Object.values(n.name_i18n??{}).some(r=>typeof r=="string"&&Ee(r)===t))}var Xe="storvia_chat_main";function kt(){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 ze=20,Qe=40,V=class{constructor(e,t,n,r,i=!1,s,c,l){this.http=e;this.getGameId=t;this.getConversationId=n;this.getModelId=r;this.isPreview=i;this.previewHistory=[];this.previewConfig=s,this.getModelName=c,this.getPreset=l}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:kt()};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 u("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 u("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 u("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 u("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?-(ze-1):-ze);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 h="";await this.http.stream("/preview",r,m=>{h+=m,e.onChunk?.(m)},(m,f)=>{h&&this.pushPreviewHistory({role:"assistant",content:h}),e.onDone?.(m,f)},this.reqMeta(),F(e.onState),e.onThinking,e.onCreatedCharacters);return}let s="",c=null,l=null,a=[];await this.http.stream("/preview",r,h=>{s+=h},()=>{},this.reqMeta(),(h,m)=>{c=h,l=m,e.onState&&e.onState(c,l)},void 0,h=>{a=h,e.onCreatedCharacters&&e.onCreatedCharacters(h)}),s&&this.pushPreviewHistory({role:"assistant",content:s});let d={id:"",content:s,truncated:!1};return c&&(d.delta=c,l&&(d.full=l)),a.length&&(d.createdNames=a),d}pushPreviewHistory(e){this.previewHistory.push(e),this.previewHistory.length>Qe&&this.previewHistory.splice(0,this.previewHistory.length-Qe)}};function F(o){if(o)return(e,t)=>o(e,t)}var we=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(Ze)),this.state=new we(e,t,n,i)}previewNames(){return this.mem.map(e=>e.name)}setInitial(e,t){this.mem=e?e.map(Ze):[],this.state.setInitial(t)}async list(){return this.isPreview?this.mem.map(Je):(await this.http.get(`/conversations/${this.getConversationId()}/characters`)).map(Te)}async get(e){if(this.isPreview){let n=this.mem.find(r=>r.name===e);return n?Je(n):{name:e,hasVoice:!1}}let t=await this.http.get(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}`);return Te(t)}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 u("INVALID_REQUEST","\u9884\u8BBE\u89D2\u8272\u4E0D\u53EF\u88AB\u5408\u5E76");if(e===t||!this.mem.some(r=>r.name===t))throw new u("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 n=this.mem.find(r=>r.name===e);return{name:e,avatar:n?.avatar,description:n?.description,hasVoice:n?.hasVoice===!0,...n?.introduction!==void 0?{introduction:n.introduction}:{},...n?.visibleAtStart!==void 0?{visibleAtStart:n.visibleAtStart}:{},userDescription:n?.userDescription,...n?.gender?{gender:n.gender}:{},...n?.isPreset!==void 0?{isPreset:n.isPreset}:{},state:await this.state.get(e)}}let t=await this.http.get(`/conversations/${this.getConversationId()}/characters/${encodeURIComponent(e)}/detail`);return Te(t)}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 Ze(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}:{},hasVoice:o.hasVoice===!0,...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}:{},hasVoice:o.hasVoice===!0,...o.userDescription!==void 0?{userDescription:o.userDescription}:{},...o.gender?{gender:o.gender}:{},...o.isPreset!==void 0?{isPreset:o.isPreset}:{}}}function Te(o){let{voice:e,...t}=o;return{...t,hasVoice:!!e}}var et="\u73A9\u5BB6",Mt=["Player","player","PLAYER","\u30D7\u30EC\u30A4\u30E4\u30FC","\uD50C\uB808\uC774\uC5B4","\u4E3B\u63A7","{{user}}","user"],ye=o=>o.toLowerCase().replace(/[\s_\-]+/g,""),xt=new Set(["\u73A9\u5BB6",...Mt].map(ye));function tt(o,e){if(o==="\u73A9\u5BB6")return o;let t=ye(o);return xt.has(t)?e.some(n=>ye(n)===t)?o:"\u73A9\u5BB6":o}var W=class{constructor(e,t,n=!1,r,i=()=>[]){this.http=e;this.getConversationId=t;this.isPreview=n;this.getCharacterNames=i;this.mem=[];r&&(this.mem=r.map(s=>({...s})))}setInitial(e){this.mem=e?e.map(t=>({...t})):[]}entity(e){return this.isPreview?tt(e,this.getCharacterNames()):e}async list(){return this.isPreview?[...this.mem]:this.http.get(`/conversations/${this.getConversationId()}/relationships`)}async get(e,t){if(this.isPreview){e=this.entity(e),t=this.entity(t);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,from:this.entity(e.from),to:this.entity(e.to)});return}await this.http.post(`/conversations/${this.getConversationId()}/relationships`,e)}async update(e,t,n){if(this.isPreview){e=this.entity(e),t=this.entity(t);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){e=this.entity(e),t=this.entity(t),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 nt(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 Ce(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]=nt(s);e[t]=r}return e}function Ut(o){let e={};if(!o)return e;for(let[t,n]of Object.entries(o))e[t]=nt(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=Ce(r))}setInitial(e){this.mem=e?Ce(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 Ut(n)}let t=await this.http.get(`/conversations/${this.getConversationId()}/inventory`);return Ce(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 l={count:r};i!==void 0&&(l.desc=i),s!==void 0&&(l.iconUrl=s),this.mem[t][n]=l;return}let c={group:t,name:n,count:r};i!==void 0&&(c.desc=i),s!==void 0&&(c.icon_url=s),await this.http.post(`/conversations/${this.getConversationId()}/inventory`,c)}async update(e){let{group:t,name:n,count:r,desc:i,iconUrl:s}=e;if(this.isPreview){let l=this.mem[t];if(!l||!(n in l))throw new Error(`Item "${t}/${n}" not found`);let a=l[n];r!==void 0&&(a.count=r),i!==void 0&&(a.desc=i),s!==void 0&&(a.iconUrl=s);return}let c={};r!==void 0&&(c.count=r),i!==void 0&&(c.desc=i),s!==void 0&&(c.icon_url=s),await this.http.patch(`/conversations/${this.getConversationId()}/inventory/${encodeURIComponent(t)}/${encodeURIComponent(n)}`,c)}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 c=i||r;if(t===n&&c===r)return;if(c in this.mem[n])throw new Error(`Item "${c}" already exists in target group`);this.mem[n][c]=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 _e=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 _e(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 Y(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=rt(i)),s&&(this.memInject={...s})}setInitial(e,t){this.mem=e?rt(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(Y(`/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(Y(`/conversations/${this.getConversationId()}/custom`,this.getGameId()),n)}async setInject(e,t){if(this.isPreview){this.memInject[e]=t;return}await this.http.patch(Y(`/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(Y(`/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(Y(`/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(Y(`/conversations/${this.getConversationId()}/custom/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,this.getGameId()))}};function rt(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 ot(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(ot(`/conversations/${this.getConversationId()}/save`,this.getGameId()))}async set(e){if(this.isPreview){this.mem={...e};return}await this.http.put(ot(`/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 u("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 X=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?it(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=Lt(t.entries)),this.isPreview){let r=this.wb?.presets??[],i=t.enabledPresets?r.map(c=>({...c,enabled:t.enabledPresets.includes(c.id)})):r,s={content:t.content??this.wb?.content??"",contentWidget:t.contentWidget??this.wb?.contentWidget??!1,entries:t.entries??this.wb?.entries??[],presets:i,updated_at:new Date().toISOString()};return this.wb=s,it(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 it(o){return{...o,entries:o.entries.map(e=>({...e,keys:[...e.keys]})),presets:(o.presets??[]).map(e=>({...e}))}}function Lt(o){return(o??[]).flatMap(e=>{let t=(e?.content??"").trim(),n=[...new Set((e?.keys??[]).map(s=>(s??"").trim()).filter(s=>s!==""))],r=e?.constant===!0;if(!t||!r&&n.length===0)return[];let i=(e?.title??"").trim();return[{id:e.id||$t(),keys:n,content:t,...i?{title:i}:{},constant:r,enabled:e?.enabled!==!1,widget:e?.widget===!0}]})}function $t(){let o=globalThis.crypto;return o?.randomUUID?o.randomUUID():`ewr-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var Re=60,Se=1e3,pe=1e4,N=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=Gt(e);if(!t)return!1;let n=this.now();return n-this.lastNotifyAt<Se?!1:(this.lastNotifyAt=n,this.isPreview?(oe(t,"info"),!0):(this.send(y("host-notify",{text:t})),!0))}refreshPanel(e){if(this.isPreview)return!1;let t=this.now();return t-this.lastRefreshAt<pe?!1:(this.lastRefreshAt=t,this.send(y("host-state-changed",e?.length?{scope:e}:{})),!0)}refreshMessages(){if(this.isPreview)return!1;let e=this.now();return e-this.lastRefreshMessagesAt<pe?!1:(this.lastRefreshMessagesAt=e,this.send(y("host-messages-changed",{})),!0)}};function Gt(o){return typeof o!="string"?"":o.replace(/\s+/g," ").trim().slice(0,Re)}var Ft;function st(){return Ft??(Ft=new Promise((o,e)=>{let t=indexedDB.open("storvia-sdk-speech",1);t.onupgradeneeded=()=>t.result.createObjectStore("audio"),t.onsuccess=()=>o(t.result),t.onerror=()=>e(t.error)}))}async function at(o){let e=await st();return new Promise((t,n)=>{let r=e.transaction("audio").objectStore("audio").get(o);r.onsuccess=()=>t(r.result??null),r.onerror=()=>n(r.error)})}async function ct(o,e){let t=await st();return new Promise((n,r)=>{let i=t.transaction("audio","readwrite");i.objectStore("audio").put(e,o),i.oncomplete=()=>n(),i.onabort=()=>r(i.error)})}function dt(o){let e=o,t;do t=e,e=e.replace(/[((][^()()]*[))]/g,"");while(e!==t);return e.replace(/\s+/g," ").trim()}var Z=class{constructor(e,t,n,r,i=!1){this.getHttp=e;this.getConversationId=t;this.getGameId=n;this.getVoice=r;this.isPreview=i;this.pending=new Map}async speak(e){let t=dt(e.text),n=await this.getVoice(e.character);if(!n)throw new u("TTS_UNKNOWN_VOICE","Character has no voice configured");let r=this.isPreview?this.getGameId():this.getConversationId(),i=JSON.stringify([r,n,t]),s={text:t,...this.isPreview?{voice:n}:{conversation_id:this.getConversationId(),character_name:e.character}},c=globalThis;if(c.__storviaNativeTts&&c.flutter_inappwebview){let d=await c.flutter_inappwebview.callHandler("storviaTts",{body:s,key:i});if(d.error){let m=d.error==="TTS_INSUFFICIENT_CREDITS"?"INSUFFICIENT_CREDITS":d.error==="TTS_RATE_LIMITED"?"RATE_LIMITED":d.error;throw R(m),new u(m,d.error)}let h=Uint8Array.from(atob(d.audio),m=>m.charCodeAt(0));return{audio:new Blob([h],{type:"audio/mpeg"}),cached:d.cached}}let l=await at(i);if(l)return{audio:l,cached:!0};let a=this.pending.get(i);return a||(a=this.getHttp().postAudio("/speak",s).then(async d=>{try{await ct(i,d)}catch{console.warn("[Storvia TTS] \u97F3\u9891\u7F13\u5B58\u4FDD\u5B58\u5931\u8D25")}return{audio:d,cached:!1}}),this.pending.set(i,a),a.then(()=>this.pending.delete(i),()=>this.pending.delete(i))),a}};var J=class{constructor(e){this.getHttp=e}async transcribe(e){if(!e||typeof e!="object")throw new u("INVALID_REQUEST","Recognition options are required");if(!(e.audio instanceof Blob)||e.audio.size===0||e.audio.size>10485760)throw new u("ASR_BAD_AUDIO","Audio must be a non-empty file of at most 10 MB");let t=e.audio.type.split(";")[0].trim().toLowerCase(),n=e.format??qt[t];if(!n||!Kt.includes(n))throw new u("ASR_BAD_AUDIO","Specify a supported audio format");if(e.context!==void 0&&typeof e.context!="string"||!lt(e.languageHints,4)||!lt(e.hotwords,50)||(e.context?.length??0)>400||e.hotwords?.some(i=>i.length>64))throw new u("INVALID_REQUEST","Recognition context, language hints, or hotwords exceed the limits");let r=new FormData;return r.append("file",e.audio,`audio.${n}`),r.append("format",n),e.context!==void 0&&r.append("context",e.context),e.languageHints!==void 0&&r.append("language_hints",JSON.stringify(e.languageHints)),e.hotwords!==void 0&&r.append("hotwords",JSON.stringify(e.hotwords)),this.getHttp().postForm("/transcribe",r,Yt)}},Kt=["wav","mp3","m4a","webm","ogg","opus","flac","aac"],Yt=15e4;function lt(o,e){return o===void 0||Array.isArray(o)&&o.length<=e&&o.every(t=>typeof t=="string"&&t.trim().length>0)}var qt={"audio/wav":"wav","audio/x-wav":"wav","audio/wave":"wav","audio/mpeg":"mp3","audio/mp3":"mp3","audio/mp4":"m4a","audio/x-m4a":"m4a","audio/webm":"webm","video/webm":"webm","audio/ogg":"ogg","audio/opus":"opus","audio/flac":"flac","audio/x-flac":"flac","audio/aac":"aac"};var ht="/functions/v1/world-engine/v1",zt="https://api.storvia.ai";function Qt(){return window.__STORVIA__||{}}function Xt(o,e=3e4){let t=Qt();return t.apiBase?Promise.resolve(t):new Promise((n,r)=>{let i=setTimeout(()=>{s(),c(),r(new u("NOT_INITIALIZED","Timed out waiting for __STORVIA__ config from parent frame."))},e),s=o.on("init",a=>{a.payload?.apiBase&&l({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})}),c=o.on("preview-init",a=>{a.payload?.apiBase&&l(a.payload)});function l(a){clearTimeout(i),s(),c();let d=window;d.__STORVIA__=a,n(a)}o.send(y("ready",{}))})}var ae=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;this.previewVoices=new Map}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?d=>d.source===null||d.source===window:d=>d.source===window.parent,customSend:t?d=>e.callHandler("storviaBus",d):void 0}),Be(d=>this.bus.send(d));let n=await Xt(this.bus),r=n.apiBase;if(!r)throw new u("NOT_INITIALIZED","window.__STORVIA__.apiBase is not set. The platform must inject it before SDK init.");if(this.baseUrl=`${r}${ht}`,this.isPreview=!!n.preview,this.previewConfig=n.previewConfig,!n.gameId)throw new u("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 u("UNAUTHORIZED","window.__STORVIA__.accessToken is not set. The platform must inject the user token before SDK init.");if(this.accessToken=n.accessToken,$e(n.lang),this.http=new ie(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[d,h]=await Promise.all([this.fetchPreviewSnapshot(),this.modelId?Promise.resolve(null):this.fetchModels()]);h&&(this.models=h,this.modelId=h[0]?.id||""),this.presetId=n.presetId||"";let m=()=>this.gameId,f=()=>this.conversationId,p=()=>this.modelId,C=()=>{let v=this.models.find(_=>_.id===this.modelId);return v?se(v):void 0},w=()=>this.presetId||void 0;this.chat=new V(this.http,m,f,p,!0,this.previewConfig,C,w),this.characters=new H(this.http,f,!0,d.characters,d.characterStates),this.tts=new Z(()=>this.http.ttsClient(),f,m,v=>this.getCharacterVoice(v),this.isPreview),this.asr=new J(()=>this.http.asrClient()),this.relationships=new W(this.http,f,!0,d.relationships,()=>this.characters.previewNames()),this.inventory=new B(this.http,f,!0,d.inventory),this.world=new j(this.http,f,!0,d.world),this.player=new K(this.http,f,!0,d.player,d.playerState),this.custom=new q(this.http,f,m,!0,d.custom,d.custom_inject),this.save=new z(this.http,f,m,!0,d.save_data),this.state=new Q(this.http,f,!0),this.memory=new X(this.http,f,!0),this.host=new N(v=>this.bus.send(v),!0),this.initialized=!0,this.listenForPreviewMessages(),this.listenForTokenUpdate();return}if(!n.conversationId)throw new u("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,c=()=>this.modelId,l=()=>{let d=this.models.find(h=>h.id===this.modelId);return d?se(d):void 0},a=()=>this.presetId||void 0;this.chat=new V(this.http,i,s,c,!1,void 0,l,a),this.characters=new H(this.http,s),this.tts=new Z(()=>this.http.ttsClient(),s,i,d=>this.getCharacterVoice(d),this.isPreview),this.asr=new J(()=>this.http.asrClient()),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 q(this.http,s,i),this.save=new z(this.http,s,i),this.state=new Q(this.http,s),this.memory=new X(this.http,s),this.host=new N(d=>this.bus.send(d),!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 getCharacterVoice(e){return this.isPreview?this.previewVoices.get(e):(await this.http.get(`/conversations/${this.conversationId}/characters/${encodeURIComponent(e)}`)).voice}async fetchPreviewSnapshot(){let e={game_id:this.gameId};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));let t=await this.http.post("/preview/initial-snapshot",e);return this.previewVoices=new Map(t.characters.map(n=>[n.name,n.voice])),{...t,characters:t.characters.map(({voice:n,...r})=>({...r,hasVoice:!!n}))}}async refreshPreviewSnapshot(){let e=await this.fetchPreviewSnapshot();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(e=!1){try{return await this.http.get("/models",e?void 0:{locale:re()})}catch{}return[]}async initDev(e){if(this.initialized)return;this.baseUrl=`${zt}${ht}`,this.gameId=e.gameId,this.isPreview=!0,this.http=new ie(this.baseUrl,"",!1,e.apiKey);let[t,n]=await Promise.all([this.fetchModels(!!e.model),this.fetchPreviewSnapshot()]);this.models=t;let r=e.model?qe(t,e.model):void 0;e.model&&!r&&console.warn(`[Storvia SDK] dev.model "${e.model}" not found, falling back to the first model. Available:`,t.map(se)),this.modelId=r?.id||t[0]?.id||"",this.conversationId="00000000-0000-0000-0000-000000000000";let i=()=>this.gameId,s=()=>this.conversationId,c=()=>this.modelId,l=()=>{let d=this.models.find(h=>h.id===this.modelId);return d?se(d):void 0};this.presetId=e.preset||"";let a=()=>this.presetId||void 0;this.chat=new V(this.http,i,s,c,!0,void 0,l,a),this.characters=new H(this.http,s,!0,n.characters,n.characterStates),this.tts=new Z(()=>this.http.ttsClient(),s,i,d=>this.getCharacterVoice(d),this.isPreview),this.asr=new J(()=>this.http.asrClient()),this.relationships=new W(this.http,s,!0,n.relationships,()=>this.characters.previewNames()),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 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 Q(this.http,s,!0),this.memory=new X(this.http,s,!0),this.host=new N(()=>{},!0),this.initialized=!0}async getAssets(e,t){let n={asset_type:e,locale:re()};return t&&(n.category=t),(await this.http.get("/assets",n)).map(i=>({id:i.id,assetId:i.asset_id,name:i.name,nameI18n:i.meta.name_i18n,url:i.url,assetType:i.asset_type,category:i.category,categoryI18n:i.category_i18n,tags:i.tags.map(s=>({id:s.id,label:s.label,labelI18n:s.label_i18n}))}))}};async function ut(o){Ge();let e=new ae;return o?.dev?await e.initDev(o.dev):await e.init(),e}function Ae(o){return typeof o=="object"&&o!==null&&"value"in o&&"type"in o&&(o.type==="number"||o.type==="text")}function pt(o){return Ae(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,PLAYER_ID,PROTOCOL_VERSION,StorviaBus,StorviaError,StorviaSDK,createStorviaSDK,envelope,extractFieldValue,isProtocolEnvelope,isRichFieldValue,setToastEnabled,showToast});
package/dist/index.d.mts CHANGED
@@ -57,12 +57,23 @@ interface WorldbookPatch {
57
57
  }
58
58
  interface AssetItem {
59
59
  id: number;
60
+ /** 素材 UUID,原数字 id 与图片 url 继续可用。 */
61
+ assetId: string;
60
62
  name: string;
63
+ nameI18n?: Record<string, string>;
61
64
  url: string;
62
65
  assetType: 'avatar' | 'icon';
63
66
  category: string;
67
+ /** 分类展示译名;分类筛选仍使用 category 原文。 */
68
+ categoryI18n?: Record<string, string> | null;
69
+ tags: AssetTag[];
64
70
  }
65
- type StorviaErrorCode = 'UNAUTHORIZED' | 'INSUFFICIENT_CREDITS' | 'VIOLATION_WORD_DETECTED' | 'CONTENT_FILTERED' | 'MODEL_REFUSAL' | 'STREAM_INTERRUPTED' | 'RATE_LIMITED' | 'GENERATING_IN_PROGRESS' | 'CONCURRENT_GENERATION_LIMIT' | 'INVENTORY_LIMIT' | 'CUSTOM_FIELDS_LIMIT' | 'MODEL_NOT_FOUND' | 'GAME_NOT_FOUND' | 'INVALID_REQUEST' | 'INVALID_EXTRACT_RULE' | 'INTERNAL_ERROR' | 'NOT_INITIALIZED' | 'NOT_SUPPORTED_IN_PREVIEW' | 'NETWORK_ERROR' | 'REQUEST_TIMEOUT' | 'MODEL_LOADING_TIMEOUT' | 'DAISY_CARD_REQUIRED' | 'MESSAGE_NOT_FOUND' | 'MESSAGE_TOO_OLD' | 'NO_MESSAGES_TO_DELETE' | 'GENERATION_TIMEOUT' | 'GENERATION_LOST' | 'REPETITION_LOOP' | 'SAVE_FAILED' | 'FINALIZE_FAILED' | 'CONVERSATION_NOT_FOUND' | 'EMPTY_MESSAGE' | 'CONTINUE_MODEL_NOT_AVAILABLE' | 'CONTINUE_PROMPT_MISSING' | 'GENERATION_ABORTED';
71
+ interface AssetTag {
72
+ id: string;
73
+ label: string;
74
+ labelI18n?: Record<string, string> | null;
75
+ }
76
+ type StorviaErrorCode = 'UNAUTHORIZED' | 'INSUFFICIENT_CREDITS' | 'VIOLATION_WORD_DETECTED' | 'CONTENT_FILTERED' | 'MODEL_REFUSAL' | 'STREAM_INTERRUPTED' | 'RATE_LIMITED' | 'GENERATING_IN_PROGRESS' | 'CONCURRENT_GENERATION_LIMIT' | 'INVENTORY_LIMIT' | 'CUSTOM_FIELDS_LIMIT' | 'MODEL_NOT_FOUND' | 'GAME_NOT_FOUND' | 'INVALID_REQUEST' | 'INVALID_EXTRACT_RULE' | 'INTERNAL_ERROR' | 'ASR_BAD_AUDIO' | 'ASR_UPSTREAM_FAILED' | 'ASR_MODEL_UNAVAILABLE' | 'TTS_UNKNOWN_VOICE' | 'TTS_EMPTY_TEXT' | 'TTS_UPSTREAM_FAILED' | 'NOT_INITIALIZED' | 'NOT_SUPPORTED_IN_PREVIEW' | 'NETWORK_ERROR' | 'REQUEST_TIMEOUT' | 'MODEL_LOADING_TIMEOUT' | 'DAISY_CARD_REQUIRED' | 'MESSAGE_NOT_FOUND' | 'MESSAGE_TOO_OLD' | 'NO_MESSAGES_TO_DELETE' | 'GENERATION_TIMEOUT' | 'GENERATION_LOST' | 'REPETITION_LOOP' | 'SAVE_FAILED' | 'FINALIZE_FAILED' | 'CONVERSATION_NOT_FOUND' | 'EMPTY_MESSAGE' | 'CONTINUE_MODEL_NOT_AVAILABLE' | 'CONTINUE_PROMPT_MISSING' | 'GENERATION_ABORTED';
66
77
  /** AI 本轮的属性变更(仅包含发生改变的字段) */
67
78
  interface StateChanges {
68
79
  /** 世界状态变更(扁平 KV) */
@@ -420,12 +431,37 @@ declare function isRichFieldValue(v: unknown): v is RichFieldValue;
420
431
  /** 从 FieldValue 中提取原始值 */
421
432
  declare function extractFieldValue(v: FieldValue): string | number | boolean;
422
433
  type Gender = 'male' | 'female' | 'other';
434
+ interface TtsSpeakOptions {
435
+ text: string;
436
+ character: string;
437
+ }
438
+ interface TtsAudio {
439
+ audio: Blob;
440
+ cached: boolean;
441
+ }
442
+ type AsrAudioFormat = 'wav' | 'mp3' | 'm4a' | 'webm' | 'ogg' | 'opus' | 'flac' | 'aac';
443
+ interface AsrTranscribeOptions {
444
+ /** 文件或完整录音 Blob,最多 10MB;支持不超过 5 分钟的音频。 */
445
+ audio: Blob;
446
+ /** MIME 为空时显式指定文件格式。 */
447
+ format?: AsrAudioFormat;
448
+ /** 帮助识别专有名词的上下文,最多 400 字符。 */
449
+ context?: string;
450
+ /** 最多四个语言代码;留空自动识别。 */
451
+ languageHints?: string[];
452
+ /** 最多五十个专有名词,每项最多 64 字符。 */
453
+ hotwords?: string[];
454
+ }
455
+ interface AsrTranscription {
456
+ text: string;
457
+ }
423
458
  interface CharacterPersona {
424
459
  name: string;
425
460
  avatar?: string;
426
461
  description?: string;
427
462
  introduction?: string;
428
463
  visibleAtStart?: boolean;
464
+ hasVoice?: boolean;
429
465
  userDescription?: string;
430
466
  gender?: Gender;
431
467
  isPreset?: boolean;
@@ -436,6 +472,7 @@ interface CharacterDetail {
436
472
  description?: string;
437
473
  introduction?: string;
438
474
  visibleAtStart?: boolean;
475
+ hasVoice?: boolean;
439
476
  userDescription?: string;
440
477
  gender?: Gender;
441
478
  isPreset?: boolean;
@@ -573,6 +610,10 @@ declare class HttpClient {
573
610
  private devApiKey;
574
611
  constructor(baseUrl: string, token: string, debug?: boolean, devApiKey?: string);
575
612
  setToken(token: string): void;
613
+ ttsClient(): HttpClient;
614
+ asrClient(): HttpClient;
615
+ postForm<T>(path: string, form: FormData, timeoutMs?: number): Promise<T>;
616
+ postAudio(path: string, body: unknown): Promise<Blob>;
576
617
  setDebug(enabled: boolean): void;
577
618
  private static readonly REQUEST_TIMEOUT;
578
619
  private static readonly INITIAL_TIMEOUT;
@@ -1326,6 +1367,25 @@ declare class HostModule {
1326
1367
  refreshMessages(): boolean;
1327
1368
  }
1328
1369
 
1370
+ /** 语音按需生成;studio/dev 预览也使用真实合成,按实际用量收费。 */
1371
+ declare class TtsModule {
1372
+ private getHttp;
1373
+ private getConversationId;
1374
+ private getGameId;
1375
+ private getVoice;
1376
+ private isPreview;
1377
+ private pending;
1378
+ constructor(getHttp: () => HttpClient, getConversationId: () => string, getGameId: () => string, getVoice: (name: string) => Promise<string | undefined>, isPreview?: boolean);
1379
+ speak(options: TtsSpeakOptions): Promise<TtsAudio>;
1380
+ }
1381
+
1382
+ /** 上传录音识别为文本。与 TTS 一致,studio/dev 预览也使用真实识别并按用量收费。 */
1383
+ declare class AsrModule {
1384
+ private getHttp;
1385
+ constructor(getHttp: () => HttpClient);
1386
+ transcribe(options: AsrTranscribeOptions): Promise<AsrTranscription>;
1387
+ }
1388
+
1329
1389
  interface DevConfig {
1330
1390
  apiKey: string;
1331
1391
  gameId: string;
@@ -1347,6 +1407,7 @@ declare class StorviaSDK {
1347
1407
  private initialized;
1348
1408
  private isPreview;
1349
1409
  private previewConfig;
1410
+ private previewVoices;
1350
1411
  private bus;
1351
1412
  chat: ChatModule;
1352
1413
  characters: CharactersModule;
@@ -1359,6 +1420,8 @@ declare class StorviaSDK {
1359
1420
  state: StateModule;
1360
1421
  memory: MemoryModule;
1361
1422
  host: HostModule;
1423
+ tts: TtsModule;
1424
+ asr: AsrModule;
1362
1425
  init(): Promise<void>;
1363
1426
  /**
1364
1427
  * 监听宿主运行时下发的模型切换(envelope 'set-model')。
@@ -1374,11 +1437,12 @@ declare class StorviaSDK {
1374
1437
  private listenForTokenUpdate;
1375
1438
  /** 监听父页面发来的预览模式动态更新(envelope 'config-update' / 'set-model') */
1376
1439
  private listenForPreviewMessages;
1440
+ private getCharacterVoice;
1377
1441
  /**
1378
1442
  * 调用 POST /preview/initial-snapshot 拉取与正式发布等价的初始数据
1379
1443
  * - 预览模式:传 game_config + game_state_override(来自 previewConfig)
1380
1444
  * - dev 模式:HttpClient 自动带 x-api-key,后端按 game_id 反查
1381
- * 失败时返回 null(不阻塞 init,list/get 仍能用空 mem 工作)
1445
+ * 请求失败保留实际错误,初始化不会使用空数据冒充成功。
1382
1446
  */
1383
1447
  private fetchPreviewSnapshot;
1384
1448
  /** 重新拉 snapshot 并把结果灌进每个 module 的 mem(用于 update-config 后同步) */
@@ -1426,4 +1490,4 @@ declare function showToast(message: string, type?: ToastType, duration?: number,
1426
1490
  */
1427
1491
  declare const PLAYER_ID = "\u73A9\u5BB6";
1428
1492
 
1429
- 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, PLAYER_ID, 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 };
1493
+ export { type AISummary, type AckPayload, type AsrAudioFormat, type AsrTranscribeOptions, type AsrTranscription, type AssetItem, type AssetTag, 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, PLAYER_ID, 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 TtsAudio, type TtsSpeakOptions, type UpstreamMsg, type Worldbook, type WorldbookPatch, createStorviaSDK, envelope, extractFieldValue, isProtocolEnvelope, isRichFieldValue, setToastEnabled, showToast };