@weapp-sqlite/devtools 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 ice breaker
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,43 @@
1
- # Temporary Holding Version
1
+ # @weapp-sqlite/devtools
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ 连接 Web 与小程序运行时 SQLite 数据库的开发工具。它通过 Devframe 提供实时数据库列表、SQL 查询、表数据编辑、导入导出、迁移诊断和外键完整性检查,适合在开发期检查实际宿主中的数据。
4
+
5
+ ```bash
6
+ pnpm add -D @weapp-sqlite/devtools
7
+ ```
8
+
9
+ 运行时桥接由应用侧注册,独立宿主可使用 `startSqliteDevtoolsServer()`;数据库操作仍由 `@weapp-sqlite/debug` 控制器执行,并遵循只读会话和显式写入权限。
10
+
11
+ 在 `weapp-vite` 项目中开启独立面板:
12
+
13
+ ```ts
14
+ // vite.config.ts
15
+ import { weappSqlite } from '@weapp-sqlite/weapp-vite'
16
+
17
+ export default {
18
+ plugins: [weappSqlite({
19
+ debug: {
20
+ enabled: true,
21
+ devtools: true,
22
+ },
23
+ })],
24
+ }
25
+ ```
26
+
27
+ 插件在开发服务中复用同一个 Devframe 宿主。`watch` 重建不会重复监听端口;开发服务关闭时会释放面板连接。多个面板各自持有调试租约,关闭一个面板不会释放其他面板仍在使用的控制器。生产构建关闭 `debug` 或 `devtools` 后不会注入面板桥接代码。
28
+
29
+ 需要独立启动面板时,使用返回的认证 URL,并把 `close()` 绑定到开发服务退出:
30
+
31
+ ```ts
32
+ import { startSqliteDevtoolsServer } from '@weapp-sqlite/devtools'
33
+
34
+ const server = await startSqliteDevtoolsServer({ allowWrite: true })
35
+ console.log(`Open SQLite Workbench: ${server.url}`)
36
+
37
+ // watcher.close / process "exit" 时调用
38
+ await server.close()
39
+ ```
40
+
41
+ 面板先选择运行实例,再选择数据库。查询、编辑、执行计划、查询性能诊断、迁移/外键诊断、历史、结构操作和导入导出都通过当前运行时的真实连接完成;性能诊断只运行绑定参数的 `EXPLAIN QUERY PLAN`,不会执行原 SQL,并会标出临时 B-tree 用于排序、分组或去重;数据表优先使用稳定主键/rowid 游标翻页,深页不会重复扫描前置行,视图仍兼容 offset 翻页;外键 schema mismatch 会在诊断页按表显示结构错误;断线中的写操作不会自动重放。`connectDevtoolsClient()` 适合已有 Devframe 宿主嵌入自定义面板。
42
+
43
+ 详细接入方式见 [调试工作台](https://sqlite.weapp.dev/docs/debug-workbench) 和 [weapp-vite API](https://sqlite.weapp.dev/docs/api/weapp-vite)。
@@ -0,0 +1 @@
1
+ import{t as e}from"./index-qEaVRY93.js";var t=Symbol.for(`devframe:browser-agent-registry`),{tools:n,listeners:r}=globalThis[t]??={tools:new Map,listeners:new Set};function i(){return[...n.values()]}function a(e){return r.add(e),()=>r.delete(e)}var o=`devframe:client-id`,s;function c(t=globalThis.window){try{let n=t?.sessionStorage;if(n){let t=n.getItem(o);return t||(t=e(),n.setItem(o,t)),t}}catch{}return s??=e(),s}function l(e){e.client.register({name:`devframe:agent:invoke-client-tool`,type:`action`,jsonSerializable:!0,handler:async(e,t)=>{let n=i().find(t=>t.id===e);if(!n)throw Error(`[devframe/agent] browser tool "${e}" not found`);return await n.invoke(t)}});let t=!1,n=!1,r=0,o=()=>{t||n||(t=!0,queueMicrotask(async()=>{if(t=!1,n)return;let a=i().map(({invoke:e,...t})=>t);(a.length!==0||r!==0)&&(r=a.length,await e.callOptional(`devframe:agent:sync-client-tools`,c(),a).catch(()=>{}))}))},s=a(o),l=e.events.on(`connection:status`,e=>{e===`connected`&&o()});return o(),()=>{n=!0,s(),l()}}export{l as setupBrowserAgentRpcBridge};
@@ -0,0 +1 @@
1
+ :root{font-synthesis:none;color:#17252b;background:#eef1f2;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:14px}*{box-sizing:border-box}body{background:#eef1f2;min-width:900px;margin:0}button,input,select,textarea{font:inherit}button{color:#32444c;cursor:pointer;background:#fff;border:1px solid #c5d0d4;border-radius:6px;padding:7px 11px;transition:border-color .16s,background .16s,color .16s}button:hover:not(:disabled){background:#f7fafb;border-color:#557681}button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline-offset:1px;outline:3px solid #9cd9cf}button:disabled{color:#99a7ac;cursor:not-allowed;background:#edf1f2}.solid,.primary{color:#fff;background:#197e71;border-color:#197e71}.danger{color:#a52b28;border-color:#e3b2ac}.danger.solid{color:#fff;background:#b33c35;border-color:#b33c35}.text-button{color:#277166;background:0 0;border:0;padding:2px 4px}.text-button.danger{color:#ad3731}.shell{min-height:100vh}.topbar{color:#e8f1f2;background:#192c32;border-bottom:3px solid #42b6a4;align-items:center;gap:28px;min-height:64px;padding:12px 22px;display:flex}.brand{letter-spacing:.01em;align-items:center;gap:9px;min-width:230px;font-weight:650;display:flex}.brand-mark{color:#18332f;background:#76d7c8;border-radius:5px;place-items:center;width:26px;height:26px;font-size:21px;display:grid}.eyebrow{color:#8ed3c8;letter-spacing:.1em;border:1px solid #356d68;border-radius:3px;align-self:flex-start;padding:2px 5px;font:10px ui-monospace,monospace}.connection-status{color:#93c8bf;margin-right:auto;font:12px ui-monospace,monospace}.connection-status.connecting{color:#e4c37a}.connection-status.disconnected{color:#ef9d93}.runtime-controls{align-items:center;gap:8px;display:flex}.runtime-controls select,.runtime-controls button,.file-menu summary{height:34px}.runtime-controls select{color:#e8f1f2;background:#233a41;border:1px solid #3d5e63;max-width:250px;padding:0 28px 0 10px}.runtime-controls select option{color:#17252b;background:#fff}.file-menu{position:relative}.file-menu summary{color:#dceceb;cursor:pointer;background:#233a41;border:1px solid #3d5e63;border-radius:6px;align-items:center;padding:0 10px;list-style:none;display:flex}.file-menu summary::-webkit-details-marker{display:none}.file-menu-content{z-index:10;background:#fff;border:1px solid #c5d0d4;border-radius:7px;grid-template-columns:1fr 1fr;gap:5px;width:250px;margin-top:5px;padding:8px;display:grid;position:absolute;right:0;box-shadow:0 12px 30px #10242c2d}.file-menu-content button{font-size:12px}.workspace-layout{grid-template-columns:224px minmax(0,1fr);min-height:calc(100vh - 64px);display:grid}.sidebar{background:#e4e9ea;border-right:1px solid #ccd6d8;flex-direction:column;min-width:0;display:flex}.sidebar-heading{color:#65777d;text-transform:uppercase;letter-spacing:.12em;justify-content:space-between;padding:18px 16px 10px;font-size:12px;font-weight:700;display:flex}.table-list{flex:1;padding:4px 8px;overflow:auto}.table-item{text-align:left;background:0 0;border:0;border-left:3px solid #0000;border-radius:3px;align-items:center;gap:9px;width:100%;margin:2px 0;padding:9px 10px;display:flex;overflow:hidden}.table-item.active{color:#126c60;background:#cfe9e3;border-left-color:#198676}.table-item code{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.object-icon{color:#fff;background:#6e858b;border-radius:3px;flex:0 0 20px;place-items:center;width:20px;height:20px;font:11px ui-monospace,monospace;display:grid}.sidebar-create{border-style:dashed;margin:12px}.main-content{background:#f8fafa;min-width:0}.tabs{background:#fff;border-bottom:1px solid #d8e0e2;align-items:end;height:52px;padding:0 22px;display:flex}.tab{color:#6c7d82;background:0 0;border:0;border-bottom:3px solid #0000;border-radius:0;height:52px;padding:0 18px}.tab.active{color:#146f63;border-bottom-color:#26a18f;font-weight:650}.data-view,.schema-view,.sql-view,.history-view,.diagnostics-view{padding:20px 24px 36px}.data-toolbar,.filter-toolbar,.sql-actions,.pagination{align-items:center;gap:9px;display:flex}.data-toolbar{min-height:42px}.filter-toolbar{border-top:1px solid #dbe3e4;border-bottom:1px solid #dbe3e4;flex-wrap:wrap;margin:12px 0;padding:10px 0}.filter-toolbar select{min-width:125px}.filter-toolbar input{min-width:180px}.small-label,.muted,.shortcut,.section-note,.capability-note{color:#718186;font-size:12px}.small-label{letter-spacing:.08em;font:11px ui-monospace,monospace}.spacer{flex:1}input,select,textarea{color:#20343a;background:#fff;border:1px solid #c4d0d2;border-radius:5px;width:100%;padding:7px 9px}input,select{height:34px}.table-scroll{background:#fff;border:1px solid #d2dcde;border-radius:7px;position:relative;overflow:auto}.data-grid{table-layout:fixed;border-collapse:collapse;width:100%;min-width:740px}.data-grid th,.data-grid td{text-overflow:ellipsis;text-align:left;white-space:nowrap;border-bottom:1px solid #e1e7e8;max-width:330px;padding:9px 11px;overflow:hidden}.data-grid th{z-index:1;color:#597078;text-transform:uppercase;letter-spacing:.05em;background:#edf2f3;font:11px ui-monospace,monospace;position:sticky;top:0}.data-grid td{color:#344b53;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.data-grid tr:hover td{background:#f2f8f7}.data-grid .selection-column{text-align:center;width:42px}.data-grid .selection-column input{width:15px;height:15px}.column-sort{width:100%;color:inherit;text-align:left;background:0 0;border:0;padding:0}.cell-null{color:#9d751d!important}.cell-number{color:#245e96!important}.cell-blob{color:#7950a1!important}.filter-chips{flex-wrap:wrap;gap:6px;margin:5px 0 11px;display:flex}.filter-chip{color:#286a60;background:#e1f1ed;border-radius:3px;padding:3px 7px;font-size:11px}.pagination{color:#556a71;padding:12px 1px 0;font:12px ui-monospace,monospace}.pagination select{width:115px}.empty{color:#65777d;text-align:center;place-items:center;min-height:260px;padding:30px;display:grid}.empty-symbol{color:#458b80;background:#dceeea;border-radius:8px;place-items:center;width:48px;height:48px;margin-bottom:12px;font-size:25px;display:grid}.empty h2{color:#354c54;margin:0 0 6px;font-size:17px}.empty p{max-width:410px;margin:0;line-height:1.55}.error-banner,.notice-banner{padding:10px 24px;font-family:ui-monospace,monospace;font-size:12px}.error-banner{color:#a8342e;background:#fff0ee;border-bottom:1px solid #e7b8b3}.notice-banner{color:#236e62;background:#e8f6f2;border-bottom:1px solid #bfded7}.schema-view{max-width:980px}.schema-row{border-bottom:1px solid #e1e7e8;grid-template-columns:minmax(150px,1fr) 110px minmax(150px,2fr) auto auto;align-items:center;gap:12px;padding:10px 0;display:grid}.schema-name{color:#294c57}.type-badge{color:#31776d;background:#e1f1ed;border-radius:3px;width:max-content;padding:3px 6px;font:10px ui-monospace,monospace}.section-title{color:#50666e;text-transform:uppercase;letter-spacing:.08em;margin:22px 0 8px;font-size:13px}.schema-sql{color:#38555e;white-space:pre-wrap;background:#edf2f3;border:1px solid #d8e0e2;border-radius:5px;padding:14px;font:12px/1.55 ui-monospace,monospace;overflow:auto}.sql-view{max-width:1120px}.editor-block{background:#172a30;border:1px solid #c7d4d6;border-radius:7px;grid-template-columns:50px minmax(0,1fr);min-height:270px;display:grid;overflow:hidden}.editor-gutter{color:#6eaca2;letter-spacing:.08em;writing-mode:vertical-rl;border-right:1px solid #345057;padding:13px 11px;font:11px ui-monospace,monospace}.code-editor{resize:vertical;border:0;border-radius:0;outline:0}.sql-editor{color:#d8eeee;background:#172a30;min-height:270px;padding:14px;font:13px/1.55 ui-monospace,SFMono-Regular,Menlo,monospace}.parameters-field{grid-template-columns:210px minmax(0,1fr);align-items:center;gap:12px;margin-top:12px;display:grid}.parameters-editor{min-height:76px;font:12px/1.4 ui-monospace,monospace}.sql-actions{margin-top:12px}.shortcut{margin-left:auto}.result-summary{color:#3a6268;padding:10px 0;font:12px ui-monospace,monospace}.plan-tree{border-top:1px solid #d7e0e1;margin-top:22px;padding:13px 0}.plan-node{border-bottom:1px solid #ebeff0;gap:12px;padding-block:7px;display:flex}.plan-id{color:#8b9ba0;flex:0 0 22px;font:11px ui-monospace,monospace}.plan-scan{color:#9e6818}.diagnostics-panel{border-top:1px solid #d7e0e1;margin-top:14px;padding:13px 0}.diagnostic-warnings{color:#9b4f1c;background:#fff4e7;border:1px solid #f0d2af;border-radius:4px;padding:9px 11px;font-size:12px}.diagnostics-ok{color:#1e6b55;background:#ecf8f1;border:1px solid #bde3cf;border-radius:4px;padding:9px 11px;font-size:12px}.history-entry{border-bottom:1px solid #dce4e5;padding:13px 0}.history-entry.error{border-left:3px solid #bc443d;padding-left:12px}.history-meta{align-items:center;gap:8px;display:flex}.status-label{color:#248270;font-size:11px;font-weight:700}.history-entry.error .status-label{color:#b64039}.history-sql{color:#31515a;white-space:pre-wrap;background:#eef3f4;border-radius:4px;max-height:100px;margin:9px 0 6px;padding:10px;font:12px/1.45 ui-monospace,monospace;overflow:auto}.history-summary{color:#718186;margin:0;font:12px ui-monospace,monospace}.dialog{color:#21363c;border:1px solid #bccacc;border-radius:8px;width:min(680px,100vw - 80px);max-height:85vh;padding:0;box-shadow:0 18px 70px #10242c35}.dialog::backdrop{background:#10242c71}.dialog-heading{border-bottom:1px solid #dbe2e3;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.dialog-heading h2{margin:0;font-size:16px}.dialog-content{gap:12px;padding:18px 20px;display:grid;overflow:auto}.dialog-content p{margin:0;line-height:1.5}.field{gap:5px;display:grid}.field-label{color:#64777d;font-size:12px}.row-editor{min-height:180px}.dialog-actions{border-top:1px solid #dbe2e3;justify-content:flex-end;gap:8px;padding:14px 20px;display:flex}.dialog-error{color:#ad3731;min-height:0;padding:0 20px;font-size:12px}@media (width<=1080px){body{min-width:720px}.topbar{flex-wrap:wrap;gap:10px}.connection-status{margin-right:0}.runtime-controls{width:100%}.runtime-controls select{flex:1;max-width:none}}
@@ -0,0 +1,6 @@
1
+ (function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();function e(e,t){let n=`\x1B[${e}m`,r=`\x1B[${t}m`;return((e,...t)=>{if(Array.isArray(e)&&`raw`in e){let i=e,a=``;for(let e=0;e<i.length;e++)a+=i[e],e<t.length&&(a+=String(t[e]));return`${n}${a}${r}`}return`${n}${String(e)}${r}`})}var t={blue:e(34,39),cyan:e(36,39),gray:e(90,39),green:e(32,39),red:e(31,39),yellow:e(33,39),bold:e(1,22),dim:e(2,22),reset:e(0,0),underline:e(4,24)};function n(e,...t){return typeof e==`function`?e(...t):e}var r=Error.captureStackTrace,i=class e extends Error{name;code;docs;fix;sources;data;get why(){return this.message}constructor(t,n=e){super(t.why,{cause:t.cause}),this.code=this.name=t.code,this.fix=t.fix,this.docs=t.docs,this.sources=t.sources,this.data=t.data,r?.(this,n)}toJSON(){return{name:this.name,why:this.why,fix:this.fix,docs:this.docs,sources:this.sources,cause:this.cause,data:this.data,stack:this.stack}}};function a(e,t){return typeof e==`string`?`${e}/${t.toLowerCase()}`:e?.(t)}function o(e){let t=e.reporters??[],r={},{docsBase:o}=e;for(let s of Object.keys(e.codes)){let c=e.codes[s],l=c.docs===!1?void 0:c.docs||a(o,s),u=(e={},r={})=>{let a=new i({code:s,why:n(c.why,e),fix:n(c.fix,e),docs:l,cause:e.cause,sources:e.sources,data:n(c.data,e)},u);for(let e of t)e(a,r);return a};r[s]=u}return r}function s(e){return t=>{let n=`${e.bold(e.red(`[${t.name}]`))} ${t.message}`,r=[];return t.fix&&r.push(`${e.dim(`fix:`)} ${t.fix}`),t.sources?.length&&r.push(`${e.dim(`sources:`)} ${t.sources.join(`, `)}`),t.docs&&r.push(`${e.dim(`see:`)} ${e.cyan(t.docs)}`),r.length===0?n:[n,...r.map((t,n)=>`${e.dim(n<r.length-1?`├▶`:`╰▶`)} ${t}`)].join(`
2
+ `)}}var c={bus:{agentManifestChanged:`agent:manifest:changed`,agentToolRegistered:`agent:tool:registered`,agentToolUnregistered:`agent:tool:unregistered`,agentResourceRegistered:`agent:resource:registered`,agentResourceUnregistered:`agent:resource:unregistered`},client:{isTrustedUpdated:`rpc:is-trusted:updated`,error:`rpc:error`,connectionStatus:`connection:status`,connectionError:`connection:error`},broadcast:{authRevoked:`devframe:auth:revoked`,clientStateUpdated:`devframe:rpc:client-state:updated`,clientStatePatch:`devframe:rpc:client-state:patch`,streamingChunk:`devframe:streaming:chunk`,streamingEnd:`devframe:streaming:end`,streamingUploadCancel:`devframe:streaming:upload-cancel`},inPageChannel:{panelStateUpdated:`devframe:in-page:panel-state:updated`,panelStatePatch:`devframe:in-page:panel-state:patch`},postMessage:{remoteAssetsError:`devframe:remote-assets-error`,inPageChannel:`devframe:in-page-channel`}},l=s(t);function u(e,{method:t=`warn`}={}){console[t](l(e))}function d(e){return o({...e,reporters:[u,...e.reporters??[]]})}function f(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}}var p=Math.random.bind(Math),m=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function h(e=21){let t=``,n=e;for(;n--;)t+=m[p()*64|0];return t}var g=6e4,_=e=>e,v=_,{clearTimeout:y,setTimeout:b}=globalThis;function x(e,t){let{post:n,on:r,off:i=()=>{},eventNames:a=[],serialize:o=_,deserialize:s=v,resolver:c,bind:l=`rpc`,timeout:u=g,proxify:d=!0}=t,p=!1,m=new Map,x,S;async function C(e,r,i,a){if(p)throw Error(`[birpc] rpc is closed, cannot call "${e}"`);let s={m:e,a:r,t:`q`};a&&(s.o=!0);let c=async e=>n(o(e));if(i){await c(s);return}if(x)try{await x}finally{x=void 0}let{promise:l,resolve:d,reject:g}=f(),_=h();s.i=_;let v;async function C(n=s){return u>=0&&(v=b(()=>{try{if(t.onTimeoutError?.call(S,e,r)!==!0)throw Error(`[birpc] timeout on calling "${e}"`)}catch(e){g(e)}m.delete(_)},u),typeof v==`object`&&(v=v.unref?.())),m.set(_,{resolve:d,reject:g,timeoutId:v,method:e}),await c(n),l}try{t.onRequest?await t.onRequest.call(S,s,C,d):await C()}catch(e){if(t.onGeneralError?.call(S,e)!==!0)throw e;return}finally{y(v),m.delete(_)}return l}let w={$call:(e,...t)=>C(e,t,!1),$callOptional:(e,...t)=>C(e,t,!1,!0),$callEvent:(e,...t)=>C(e,t,!0),$callRaw:e=>C(e.method,e.args,e.event,e.optional),$rejectPendingCalls:T,get $closed(){return p},get $meta(){return t.meta},$close:ee,$functions:e};S=d?new Proxy({},{get(t,n){if(Object.hasOwn(w,n))return w[n];if(n===`then`&&!a.includes(`then`)&&!(`then`in e))return;let r=(...e)=>C(n,e,!0);if(a.includes(n))return r.asEvent=r,r;let i=(...e)=>C(n,e,!1);return i.asEvent=r,i}}):w;function ee(e){p=!0,m.forEach(({reject:t,method:n})=>{let r=Error(`[birpc] rpc is closed, cannot call "${n}"`);if(e)return e.cause??=r,t(e);t(r)}),m.clear(),i(te)}function T(e){let t=Array.from(m.values()).map(({method:t,reject:n})=>e?e({method:t,reject:n}):n(Error(`[birpc]: rejected pending call "${t}".`)));return m.clear(),t}async function te(r,...i){let a;try{a=s(r)}catch(e){if(t.onGeneralError?.call(S,e)!==!0)throw e;return}if(a.t===`q`){let{m:r,a:s,o:u}=a,d,f,p=await(c?c.call(S,r,e[r]):e[r]);if(u&&(p||=()=>void 0),!p)f=Error(`[birpc] function "${r}" not found`);else try{d=await p.apply(l===`rpc`?S:e,s)}catch(e){f=e}if(a.i){if(f&&t.onFunctionError&&t.onFunctionError.call(S,f,r,s)===!0)return;if(!f)try{await n(o({t:`s`,i:a.i,r:d}),...i);return}catch(e){if(f=e,t.onGeneralError?.call(S,e,r,s)!==!0)throw e}try{await n(o({t:`s`,i:a.i,e:f}),...i)}catch(e){if(t.onGeneralError?.call(S,e,r,s)!==!0)throw e}}}else{let{i:e,r:t,e:n}=a,r=m.get(e);r&&(y(r.timeoutId),n?r.reject(n):r.resolve(t)),m.delete(e)}}return x=r(te),S}function S(e,t){return t.safety?t.safety:e===`static`||e===`query`||e==null?`read`:`action`}var C=Object.freeze({type:`object`,additionalProperties:!0});function w(e){let t=e[`~standard`];if(t.jsonSchema)try{return t.jsonSchema.input({target:`draft-2020-12`})}catch{return C}return C}function ee(e){if(!e||e.length===0)return{type:`object`,properties:{}};let t={},n=[];for(let r=0;r<e.length;r++){let i=`arg${r}`;t[i]=w(e[r]),n.push(i)}return{type:`object`,properties:t,required:n,additionalProperties:!1}}function T(e,t){if(Array.isArray(e))return e;if(e==null)return[];if(typeof e!=`object`)return;let n=e;if(t!=null)return Array.from({length:t},(e,t)=>n[`arg${t}`]);if(`arg0`in n){let e=[];for(;`arg${e.length}`in n;)e.push(n[`arg${e.length}`]);return e}return Object.keys(n).length===0?[]:void 0}function te(e,t){return T(e,t)??[e]}function ne(e){return typeof e==`string`?`'${e}'`:new oe().serialize(e)}var re=` _-,;:!?.'"()[]{}@*/\\&#%\`^+<=>|~$0123456789abcdefghijklmnopqrstuvwxyz`,ie=(function(){let e=new Uint8Array(128);for(let t=0;t<69;t++)e[re.charCodeAt(t)]=t+1;for(let t=65;t<=90;t++)e[t]=e[t+32];return e})();function ae(e,t){if(e===t)return 0;let n=Math.min(e.length,t.length),r=0;for(let i=0;i<n;i++){let n=e.charCodeAt(i),a=t.charCodeAt(i);if(n===a)continue;let o=n<128&&ie[n]?ie[n]:n+128,s=a<128&&ie[a]?ie[a]:a+128;if(o!==s)return o<s?-1:1;r===0&&(r=n>a?-1:1)}return e.length===t.length?r:e.length<t.length?-1:1}var oe=(function(){class e{#e=new Map;compare(e,t){let n=typeof e,r=typeof t;return n===`string`&&r===`string`?ae(e,t):n===`number`&&r===`number`?e-t:ae(this.serialize(e,!0),this.serialize(t,!0))}serialize(e,t){if(e===null)return`null`;switch(typeof e){case`string`:return t?e:`'${e}'`;case`bigint`:return`${e}n`;case`object`:return this.$object(e);case`function`:return this.$function(e)}return String(e)}serializeObject(e){let t=Object.prototype.toString.call(e);if(t!==`[object Object]`)return this.serializeBuiltInType(t.length<10?`unknown:${t}`:t.slice(8,-1),e);let n=e.constructor,r=n===Object||n===void 0?``:n.name;if(r!==``&&globalThis[r]===n)return this.serializeBuiltInType(r,e);if(`toJSON`in e&&typeof e.toJSON==`function`){let t=e.toJSON();return r+(typeof t==`object`&&t?this.$object(t):`(${this.serialize(t)})`)}let i=Object.keys(e).sort(ae),a=`${r}{`;for(let t=0;t<i.length;t++){let n=i[t];a+=`${n}:${this.serialize(e[n])}`,t<i.length-1&&(a+=`,`)}return a+`}`}serializeBuiltInType(e,t){let n=this[`$`+e];if(n)return n.call(this,t);if(typeof t.entries==`function`)return this.serializeObjectEntries(e,t.entries());throw Error(`Cannot serialize ${e}`)}serializeObjectEntries(e,t){let n=Array.from(t).sort((e,t)=>this.compare(e[0],t[0])),r=`${e}{`;for(let e=0;e<n.length;e++){let[t,i]=n[e];r+=`${this.serialize(t,!0)}:${this.serialize(i)}`,e<n.length-1&&(r+=`,`)}return r+`}`}$object(e){let t=this.#e.get(e);return t===void 0&&(this.#e.set(e,`#${this.#e.size}`),t=this.serializeObject(e),this.#e.set(e,t)),t}$function(e){let t=Function.prototype.toString.call(e);return t.slice(-15)===`[native code] }`?`${e.name||``}()[native]`:`${e.name}(${e.length})${t.replace(/\s*\n\s*/g,``)}`}$Array(e){let t=`[`;for(let n=0;n<e.length;n++)t+=this.serialize(e[n]),n<e.length-1&&(t+=`,`);return t+`]`}$Date(e){try{return`Date(${e.toISOString()})`}catch{return`Date(null)`}}$ArrayBuffer(e){return`ArrayBuffer[${new Uint8Array(e).join(`,`)}]`}$Set(e){return`Set${this.$Array(Array.from(e).sort((e,t)=>this.compare(e,t)))}`}$Map(e){return this.serializeObjectEntries(`Map`,e.entries())}}for(let t of[`Error`,`RegExp`,`URL`])e.prototype[`$`+t]=function(e){return`${t}(${e})`};for(let t of[`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float32Array`,`Float64Array`])e.prototype[`$`+t]=function(e){return`${t}[${e.join(`,`)}]`};for(let t of[`BigInt64Array`,`BigUint64Array`])e.prototype[`$`+t]=function(e){return`${t}[${e.join(`n,`)}${e.length>0?`n`:``}]`};return e})(),se=[1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225],ce=[1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,264347078,604807628,770255983,1249150122,1555081692,1996064986,-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,-1866530822,-1538233109,-1090935817,-965641998],le=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`,E=[],ue=class{_data=new de;_hash=new de([...se]);_nDataBytes=0;_minBufferSize=0;finalize(e){e&&this._append(e);let t=this._nDataBytes*8,n=this._data.sigBytes*8;return this._data.words[n>>>5]|=128<<24-n%32,this._data.words[(n+64>>>9<<4)+14]=Math.floor(t/4294967296),this._data.words[(n+64>>>9<<4)+15]=t,this._data.sigBytes=this._data.words.length*4,this._process(),this._hash}_doProcessBlock(e,t){let n=this._hash.words,r=n[0],i=n[1],a=n[2],o=n[3],s=n[4],c=n[5],l=n[6],u=n[7];for(let n=0;n<64;n++){if(n<16)E[n]=e[t+n]|0;else{let e=E[n-15],t=(e<<25|e>>>7)^(e<<14|e>>>18)^e>>>3,r=E[n-2],i=(r<<15|r>>>17)^(r<<13|r>>>19)^r>>>10;E[n]=t+E[n-7]+i+E[n-16]}let d=s&c^~s&l,f=r&i^r&a^i&a,p=(r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22),m=(s<<26|s>>>6)^(s<<21|s>>>11)^(s<<7|s>>>25),h=u+m+d+ce[n]+E[n],g=p+f;u=l,l=c,c=s,s=o+h|0,o=a,a=i,i=r,r=h+g|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+a|0,n[3]=n[3]+o|0,n[4]=n[4]+s|0,n[5]=n[5]+c|0,n[6]=n[6]+l|0,n[7]=n[7]+u|0}_append(e){typeof e==`string`&&(e=de.fromUtf8(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes}_process(e){let t,n=this._data.sigBytes/64;n=e?Math.ceil(n):Math.max((n|0)-this._minBufferSize,0);let r=n*16,i=Math.min(r*4,this._data.sigBytes);if(r){for(let e=0;e<r;e+=16)this._doProcessBlock(this._data.words,e);t=this._data.words.splice(0,r),this._data.sigBytes-=i}return new de(t,i)}},de=class e{words;sigBytes;constructor(e,t){e=this.words=e||[],this.sigBytes=t===void 0?e.length*4:t}static fromUtf8(t){let n=unescape(encodeURIComponent(t)),r=n.length,i=[];for(let e=0;e<r;e++)i[e>>>2]|=(n.charCodeAt(e)&255)<<24-e%4*8;return new e(i,r)}toBase64(){let e=[];for(let t=0;t<this.sigBytes;t+=3){let n=this.words[t>>>2]>>>24-t%4*8&255,r=this.words[t+1>>>2]>>>24-(t+1)%4*8&255,i=this.words[t+2>>>2]>>>24-(t+2)%4*8&255,a=n<<16|r<<8|i;for(let n=0;n<4&&t*8+n*6<this.sigBytes*8;n++)e.push(le.charAt(a>>>6*(3-n)&63))}return e.join(``)}concat(e){if(this.words[this.sigBytes>>>2]&=4294967295<<32-this.sigBytes%4*8,this.words.length=Math.ceil(this.sigBytes/4),this.sigBytes%4)for(let t=0;t<e.sigBytes;t++){let n=e.words[t>>>2]>>>24-t%4*8&255;this.words[this.sigBytes+t>>>2]|=n<<24-(this.sigBytes+t)%4*8}else for(let t=0;t<e.sigBytes;t+=4)this.words[this.sigBytes+t>>>2]=e.words[t>>>2];this.sigBytes+=e.sigBytes}};function fe(e){return new ue().finalize(e).toBase64()}function pe(e){return fe(ne(e))}function me(e){return pe(e)}function he(){let e={};function t(t,...n){let r=e[t]||[];for(let e=0,t=r.length;e<t;e++){let t=r[e];t&&t(...n)}}function n(n,...r){t(n,...r),delete e[n]}function r(t,n){return(e[t]||=[]).push(n),()=>{e[t]=e[t]?.filter(e=>n!==e)}}function i(e,t){let n=r(e,((...e)=>(n(),t(...e))));return n}return{_listeners:e,emit:t,emitOnce:n,on:r,once:i}}var ge=/^[\w+.-]{2,}:\/\//;function _e(e){return e.endsWith(`/`)?e:`${e}/`}function ve(e){return(e.endsWith(`/`)?e.slice(0,-1):e)||`/`}function ye(e,...t){let n=e;for(let e of t)e&&e!==`/`&&(n=n?_e(n)+e.replace(/^\.?\//,``):e);return n}function be(e,t){if(!t||t===`/`||ge.test(e))return e;let n=ve(t);return e.startsWith(n)?e:ye(n,e)}function xe(e,t){let n=e.match(ge);return t+(n?e.slice(n[0].length):e)}var Se=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function Ce(e=21){let t=``,n=e;for(;n--;)t+=Se[Math.random()*64|0];return t}var we=Symbol.for(`immer-nothing`),Te=Symbol.for(`immer-draftable`),D=Symbol.for(`immer-state`),Ee=[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},`This object has been frozen and should not be mutated`,function(e){return`Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? `+e},`An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.`,`Immer forbids circular references`,"The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},`Object.defineProperty() cannot be used on an Immer draft`,`Object.setPrototypeOf() cannot be used on an Immer draft`,`Immer only supports deleting array indices`,`Immer only supports setting array indices and the 'length' property`,function(e){return`'original' expects a draft, got: ${e}`}];function O(e,...t){{let n=Ee[e],r=F(n)?n.apply(null,t):n;throw Error(`[Immer] ${r}`)}}var k=Object,A=k.getPrototypeOf,De=`constructor`,Oe=`prototype`,ke=`configurable`,Ae=`enumerable`,je=`writable`,Me=`value`,j=e=>!!e&&!!e[D];function M(e){return e?Fe(e)||Be(e)||!!e[Te]||!!e[De]?.[Te]||Ve(e)||He(e):!1}var Ne=k[Oe][De].toString(),Pe=new WeakMap;function Fe(e){if(!e||!Ue(e))return!1;let t=A(e);if(t===null||t===k[Oe])return!0;let n=k.hasOwnProperty.call(t,De)&&t[De];if(n===Object)return!0;if(!F(n))return!1;let r=Pe.get(n);return r===void 0&&(r=Function.toString.call(n),Pe.set(n,r)),r===Ne}function Ie(e,t,n=!0){N(e)===0?(n?Reflect.ownKeys(e):k.keys(e)).forEach(n=>{t(n,e[n],e)}):e.forEach((n,r)=>t(r,n,e))}function N(e){let t=e[D];return t?t.type_:Be(e)?1:Ve(e)?2:He(e)?3:0}var Le=(e,t,n=N(e))=>n===2?e.has(t):k[Oe].hasOwnProperty.call(e,t),P=(e,t,n=N(e))=>n===2?e.get(t):e[t],Re=(e,t,n,r=N(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function ze(e,t){return e===t?e!==0||1/e==1/t:e!==e&&t!==t}var Be=Array.isArray,Ve=e=>e instanceof Map,He=e=>e instanceof Set,Ue=e=>typeof e==`object`,F=e=>typeof e==`function`,We=e=>typeof e==`boolean`;function Ge(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var Ke=e=>Ue(e)?e?.[D]:null,I=e=>e.copy_||e.base_,qe=e=>e.modified_?e.copy_:e.base_;function Je(e,t){if(Ve(e))return new Map(e);if(He(e))return new Set(e);if(Be(e))return Array[Oe].slice.call(e);let n=Fe(e);if(t===!0||t===`class_only`&&!n){let t=k.getOwnPropertyDescriptors(e);delete t[D];let n=Reflect.ownKeys(t);for(let r=0;r<n.length;r++){let i=n[r],a=t[i];a[je]===!1&&(a[je]=!0,a[ke]=!0),(a.get||a.set)&&(t[i]={[ke]:!0,[je]:!0,[Ae]:a[Ae],[Me]:e[i]})}return k.create(A(e),t)}{let t=A(e);if(t!==null&&n)return{...e};let r=k.create(t);return k.assign(r,e)}}function Ye(e,t=!1){return Qe(e)||j(e)||!M(e)?e:(N(e)>1&&k.defineProperties(e,{set:Ze,add:Ze,clear:Ze,delete:Ze}),k.freeze(e),t&&Ie(e,(e,t)=>{Ye(t,!0)},!1),e)}function Xe(){O(2)}var Ze={[Me]:Xe};function Qe(e){return e===null||!Ue(e)||k.isFrozen(e)}var $e=`MapSet`,et=`Patches`,tt=`ArrayMethods`,nt={};function L(e){let t=nt[e];return t||O(0,e),t}var rt=e=>!!nt[e];function it(e,t){nt[e]||(nt[e]=t)}var at,ot=()=>at,st=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:rt($e)?L($e):void 0,arrayMethodsPlugin_:rt(tt)?L(tt):void 0});function ct(e,t){t&&(e.patchPlugin_=L(et),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function lt(e){ut(e),e.drafts_.forEach(ft),e.drafts_=null}function ut(e){e===at&&(at=e.parent_)}var dt=e=>at=st(at,e);function ft(e){let t=e[D];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function pt(e,t){t.unfinalizedDrafts_=t.drafts_.length;let n=t.drafts_[0];if(e!==void 0&&e!==n){n[D].modified_&&(lt(t),O(4)),M(e)&&(e=mt(t,e));let{patchPlugin_:r}=t;r&&r.generateReplacementPatches_(n[D].base_,e,t)}else e=mt(t,n);return ht(t,e,!0),lt(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e===we?void 0:e}function mt(e,t){if(Qe(t))return t;let n=t[D];if(!n)return Ct(t,e.handledSet_,e);if(!_t(n,e))return t;if(!n.modified_)return n.base_;if(!n.finalized_){let{callbacks_:t}=n;if(t)for(;t.length>0;)t.pop()(e);xt(n,e)}return n.copy_}function ht(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Ye(t,n)}function gt(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var _t=(e,t)=>e.scope_===t,vt=[];function yt(e,t,n,r){let i=I(e),a=e.type_;if(r!==void 0&&P(i,r,a)===t){Re(i,r,n,a);return}if(!e.draftLocations_){let t=e.draftLocations_=new Map;Ie(i,(e,n)=>{if(j(n)){let r=t.get(n)||[];r.push(e),t.set(n,r)}})}let o=e.draftLocations_.get(t)??vt;for(let e of o)Re(i,e,n,a)}function bt(e,t,n){e.callbacks_.push(function(r){let i=t;if(!i||!_t(i,r))return;r.mapSetPlugin_?.fixSetContents(i);let a=qe(i);yt(e,i.draft_??i,a,n),xt(i,r)})}function xt(e,t){if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){let{patchPlugin_:n}=t;if(n){let r=n.getPath(e);r&&n.generatePatches_(e,r,t)}gt(e)}}function St(e,t,n){let{scope_:r}=e;if(j(n)){let i=n[D];_t(i,r)&&i.callbacks_.push(function(){Mt(e),yt(e,n,qe(i),t)})}else M(n)&&e.callbacks_.push(function(){let i=I(e);e.type_===3?i.has(n)&&Ct(n,r.handledSet_,r):P(i,t,e.type_)===n&&r.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&Ct(P(e.copy_,t,e.type_),r.handledSet_,r)})}function Ct(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||j(e)||t.has(e)||!M(e)||Qe(e)?e:(t.add(e),Ie(e,(r,i)=>{if(j(i)){let t=i[D];_t(t,n)&&(Re(e,r,qe(t),e.type_),gt(t))}else M(i)&&Ct(i,t,n)}),e)}function wt(e,t){let n=Be(e),r={type_:+!!n,scope_:t?t.scope_:ot(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0},i=r,a=Tt;n&&(i=[r],a=Et);let{revoke:o,proxy:s}=Proxy.revocable(i,a);return r.draft_=s,r.revoke_=o,[s,r]}var Tt={get(e,t){if(t===D)return e;let n=e.scope_.arrayMethodsPlugin_,r=e.type_===1&&typeof t==`string`;if(r&&n?.isArrayOperationMethod(t))return n.createMethodInterceptor(e,t);let i=I(e);if(!Le(i,t,e.type_))return kt(e,i,t);let a=i[t];if(e.finalized_||!M(a)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&Ge(t))return a;if(a===Dt(e.base_,t)||Ot(e,t,a)){Mt(e);let n=e.type_===1?+t:t,r=Pt(e.scope_,a,e,n);return e.copy_[n]=r}return a},has(e,t){return t in I(e)},ownKeys(e){return Reflect.ownKeys(I(e))},set(e,t,n){let r=At(I(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){let r=Dt(I(e),t),i=r?.[D];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_.set(t,!1),!0;if(ze(n,r)&&(n!==void 0||Le(e.base_,t,e.type_)))return!0;Mt(e),jt(e)}return e.copy_[t]===n&&(n!==void 0||Le(e.copy_,t,e.type_))||Number.isNaN(n)&&Number.isNaN(e.copy_[t])?!0:(e.copy_[t]=n,e.assigned_.set(t,!0),St(e,t,n),!0)},deleteProperty(e,t){return Mt(e),Dt(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),jt(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let n=I(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[je]:!0,[ke]:e.type_!==1||t!==`length`,[Ae]:r[Ae],[Me]:n[t]}},defineProperty(){O(11)},getPrototypeOf(e){return A(e.base_)},setPrototypeOf(){O(12)}},Et={};for(let e in Tt){let t=Tt[e];Et[e]=function(){let e=arguments;return e[0]=e[0][0],t.apply(this,e)}}Et.deleteProperty=function(e,t){return isNaN(parseInt(t))&&O(13),Et.set.call(this,e,t,void 0)},Et.set=function(e,t,n){return t!==`length`&&isNaN(parseInt(t))&&O(14),Tt.set.call(this,e[0],t,n,e[0])};function Dt(e,t){let n=e[D];return(n?I(n):e)[t]}function Ot(e,t,n){return e.type_!==1||!e.allIndicesReassigned_||e.assigned_?.get(t)||!M(n)||n[D]?!1:e.baseRefs_.has(n)}function kt(e,t,n){let r=At(t,n);return r?Me in r?r[Me]:r.get?.call(e.draft_):void 0}function At(e,t){if(!(t in e))return;let n=A(e);for(;n;){let e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=A(n)}}function jt(e){e.modified_||(e.modified_=!0,e.parent_&&jt(e.parent_))}function Mt(e){e.copy_||=(e.assigned_=new Map,Je(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var Nt=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(e,t,n)=>{if(F(e)&&!F(t)){let n=t;t=e;let r=this;return function(e=n,...i){return r.produce(e,e=>t.call(this,e,...i))}}F(t)||O(6),n!==void 0&&!F(n)&&O(7);let r;if(M(e)){let i=dt(this),a=Pt(i,e,void 0),o=!0;try{r=t(a),o=!1}finally{o?lt(i):ut(i)}return ct(i,n),pt(r,i)}if(!e||!Ue(e)){if(r=t(e),r===void 0&&(r=e),r===we&&(r=void 0),this.autoFreeze_&&Ye(r,!0),n){let t=[],i=[];L(et).generateReplacementPatches_(e,r,{patches_:t,inversePatches_:i}),n(t,i)}return r}O(1,e)},this.produceWithPatches=(e,t)=>{if(F(e))return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},We(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),We(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),We(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){M(e)||O(8),j(e)&&(e=Ft(e));let t=dt(this),n=Pt(t,e,void 0);return n[D].isManual_=!0,ut(t),n}finishDraft(e,t){let n=e&&e[D];(!n||!n.isManual_)&&O(9);let{scope_:r}=n;return ct(r,t),pt(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){let r=t[n];if(r.path.length===0&&r.op===`replace`){e=r.value;break}}n>-1&&(t=t.slice(n+1));let r=L(et).applyPatches_;return j(e)?r(e,t):this.produce(e,e=>r(e,t))}};function Pt(e,t,n,r){let[i,a]=Ve(t)?L($e).proxyMap_(t,n):He(t)?L($e).proxySet_(t,n):wt(t,n);return(n?.scope_??ot()).drafts_.push(i),a.callbacks_=n?.callbacks_??[],a.key_=r,n&&r!==void 0?bt(n,a,r):a.callbacks_.push(function(e){e.mapSetPlugin_?.fixSetContents(a);let{patchPlugin_:t}=e;a.modified_&&t&&t.generatePatches_(a,[],e)}),i}function Ft(e){return j(e)||O(10,e),It(e)}function It(e){if(!M(e)||Qe(e))return e;let t=e[D],n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=Je(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=Je(e,!0);return Ie(n,(e,t)=>{Re(n,e,It(t))},r),t&&(t.finalized_=!1),n}function Lt(){Ee.push(`Sets cannot have "replace" patches.`,function(e){return`Unsupported patch operation: `+e},function(e){return`Cannot apply patch, path doesn't resolve: `+e},`Patching reserved attributes like __proto__, prototype and constructor is not allowed`);function e(n,r=[]){if(n.key_!==void 0){let e=n.parent_.copy_??n.parent_.base_,t=Ke(P(e,n.key_)),i=P(e,n.key_);if(i===void 0||i!==n.draft_&&i!==n.base_&&i!==n.copy_||t!=null&&t.base_!==n.base_)return null;let a=n.parent_.type_===3,o;if(a){let e=n.parent_;o=Array.from(e.drafts_.keys()).indexOf(n.key_)}else o=n.key_;if(!(a&&e.size>o||Le(e,o)))return null;r.push(o)}if(n.parent_)return e(n.parent_,r);r.reverse();try{t(n.copy_,r)}catch{return null}return r}function t(e,t){let n=e;for(let e=0;e<t.length-1;e++){let r=t[e];if(n=P(n,r),!Ue(n)||n===null)throw Error(`Cannot resolve path at '${t.join(`/`)}'`)}return n}let n=`replace`,r=`remove`;function i(e,t,n){if(e.scope_.processedForPatches_.has(e))return;e.scope_.processedForPatches_.add(e);let{patches_:r,inversePatches_:i}=n;switch(e.type_){case 0:case 2:return o(e,t,r,i);case 1:return a(e,t,r,i);case 3:return s(e,t,r,i)}}function a(e,t,i,a){let{base_:o,assigned_:s}=e,c=e.copy_;c.length<o.length&&([o,c]=[c,o],[i,a]=[a,i]);let l=e.allIndicesReassigned_===!0;for(let e=0;e<o.length;e++){let r=c[e],u=o[e];if((l||s?.get(e.toString()))&&r!==u){let o=r?.[D];if(o&&o.modified_)continue;let s=t.concat([e]);i.push({op:n,path:s,value:d(r)}),a.push({op:n,path:s,value:d(u)})}}for(let e=o.length;e<c.length;e++){let n=t.concat([e]);i.push({op:`add`,path:n,value:d(c[e])})}for(let e=c.length-1;o.length<=e;--e){let n=t.concat([e]);a.push({op:r,path:n})}}function o(e,t,i,a){let{base_:o,copy_:s,type_:c}=e;Ie(e.assigned_,(e,l)=>{let u=P(o,e,c),f=P(s,e,c),p=l?Le(o,e)?n:`add`:r;if(u===f&&p===n)return;let m=t.concat(e);i.push(p===r?{op:p,path:m}:{op:p,path:m,value:d(f)}),a.push(p===`add`?{op:r,path:m}:p===r?{op:`add`,path:m,value:d(u)}:{op:n,path:m,value:d(u)})})}function s(e,t,n,i){let{base_:a,copy_:o}=e,s=0;a.forEach(e=>{if(!o.has(e)){let a=t.concat([s]);n.push({op:r,path:a,value:e}),i.unshift({op:`add`,path:a,value:e})}s++}),s=0,o.forEach(e=>{if(!a.has(e)){let a=t.concat([s]);n.push({op:`add`,path:a,value:e}),i.unshift({op:r,path:a,value:e})}s++})}function c(e,t,r){let{patches_:i,inversePatches_:a}=r;i.push({op:n,path:[],value:t===we?void 0:t}),a.push({op:n,path:[],value:e})}function l(e,t){return t.forEach(t=>{let{path:i,op:a}=t,o=e;for(let e=0;e<i.length-1;e++){let t=N(o),n=i[e];typeof n!=`string`&&typeof n!=`number`&&(n=``+n),(t===0||t===1)&&(n===`__proto__`||n===De)&&O(19),F(o)&&n===Oe&&O(19),o=P(o,n),(o===null||!Ue(o))&&O(18,i.join(`/`))}let s=N(o),c=u(t.value),l=i[i.length-1];switch(a){case n:switch(s){case 2:return o.set(l,c);case 3:O(16);default:return o[l]=c}case`add`:switch(s){case 1:return l===`-`?o.push(c):o.splice(l,0,c);case 2:return o.set(l,c);case 3:return o.add(c);default:return o[l]=c}case r:switch(s){case 1:return o.splice(l,1);case 2:return o.delete(l);case 3:return o.delete(t.value);default:return delete o[l]}default:O(17,a)}}),e}function u(e){if(!M(e))return e;if(Be(e))return e.map(u);if(Ve(e))return new Map(Array.from(e.entries()).map(([e,t])=>[e,u(t)]));if(He(e))return new Set(Array.from(e).map(u));let t=Object.create(A(e));for(let n in e)t[n]=u(e[n]);return Le(e,Te)&&(t[Te]=e[Te]),t}function d(e){return j(e)?u(e):e}it(et,{applyPatches_:l,generatePatches_:i,generateReplacementPatches_:c,getPath:e})}globalThis.Iterator?.from;var Rt=new Nt,zt=Rt.produce,Bt=Rt.produceWithPatches.bind(Rt),Vt=Rt.applyPatches.bind(Rt),Ht=1e3;function Ut(e,t){if(e.add(t),e.size>Ht){let t=e.values().next().value;t!==void 0&&e.delete(t)}}function Wt(e){let{enablePatches:t=!1}=e;t&&Lt();let n=he(),r=e.initialValue,i=new Set;return{on:n.on,value:()=>r,patch:(e,t=Ce())=>{i.has(t)||(Lt(),r=Vt(r,e),Ut(i,t),n.emit(`updated`,r,void 0,t))},mutate:(e,a=Ce())=>{if(!i.has(a)){if(Ut(i,a),t){let[t,i]=Bt(r,e);if(t===r)return;r=t,n.emit(`updated`,r,i,a)}else{let t=zt(r,e);if(t===r)return;r=t,n.emit(`updated`,r,void 0,a)}}},syncIds:i}}var Gt=typeof self==`object`?self:globalThis,Kt=new Set([`Error`,`EvalError`,`RangeError`,`ReferenceError`,`SyntaxError`,`TypeError`,`URIError`,`AggregateError`]),qt=new Set([`Boolean`,`Number`,`String`,`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float16Array`,`Float32Array`,`Float64Array`,`BigInt64Array`,`BigUint64Array`]);function Jt(e,t){let n=(t,n)=>(e.set(n,t),t),r=i=>{if(e.has(i))return e.get(i);let[a,o]=t[i];switch(a){case 0:case-1:return n(o,i);case 1:{let e=n([],i);for(let t of o)e.push(r(t));return e}case 2:{let e=n({},i);for(let[t,n]of o)e[r(t)]=r(n);return e}case 3:return n(new Date(o),i);case 4:{let{source:e,flags:t}=o;return n(new RegExp(e,t),i)}case 5:{let e=n(new Map,i);for(let[t,n]of o)e.set(r(t),r(n));return e}case 6:{let e=n(new Set,i);for(let t of o)e.add(r(t));return e}case 7:{let{name:e,message:t}=o,r=Kt.has(e)?Gt[e]:void 0;return n(new(r??Gt.Error)(t),i)}case 8:return n(BigInt(o),i);case`BigInt`:return n(Object(BigInt(o)),i);case`ArrayBuffer`:return n(new Uint8Array(o).buffer,o);case`DataView`:{let{buffer:e}=new Uint8Array(o);return n(new DataView(e),o)}}if(typeof a==`string`&&qt.has(a))return n(new Gt[a](o),i);throw TypeError(`unable to deserialize unsafe or unknown type: ${String(a)}`)};return r}function Yt(e){return Jt(new Map,e)(0)}var Xt=``,{toString:Zt}={},{keys:Qt}=Object;function $t(e){let t=typeof e;if(t!==`object`||!e)return[0,t];let n=Zt.call(e).slice(8,-1);switch(n){case`Array`:return[1,Xt];case`Object`:return[2,Xt];case`Date`:return[3,Xt];case`RegExp`:return[4,Xt];case`Map`:return[5,Xt];case`Set`:return[6,Xt];case`DataView`:return[1,n]}return n.includes(`Array`)?[1,n]:n.includes(`Error`)?[7,n]:[2,n]}function en([e,t]){return e===0&&(t===`function`||t===`symbol`)}function tn(e,t,n,r){let i=(e,t)=>{let i=r.push(e)-1;return n.set(t,i),i},a=r=>{if(n.has(r))return n.get(r);let[o,s]=$t(r);switch(o){case 0:{let t=r;switch(s){case`bigint`:o=8,t=r.toString();break;case`function`:case`symbol`:if(e)throw TypeError(`unable to serialize ${s}`);t=null;break;case`undefined`:return i([-1],r)}return i([o,t],r)}case 1:{if(s){let e=r;return s===`DataView`?e=new Uint8Array(r.buffer):s===`ArrayBuffer`&&(e=new Uint8Array(r)),i([s,[...e]],r)}let e=[],t=i([o,e],r);for(let t of r)e.push(a(t));return t}case 2:{if(s)switch(s){case`BigInt`:return i([s,r.toString()],r);case`Boolean`:case`Number`:case`String`:return i([s,r.valueOf()],r)}if(t&&`toJSON`in r)return a(r.toJSON());let n=[],c=i([o,n],r);for(let t of Qt(r))(e||!en($t(r[t])))&&n.push([a(t),a(r[t])]);return c}case 3:return i([o,r.toISOString()],r);case 4:{let{source:e,flags:t}=r;return i([o,{source:e,flags:t}],r)}case 5:{let t=[],n=i([o,t],r);for(let[n,i]of r)(e||!(en($t(n))||en($t(i))))&&t.push([a(n),a(i)]);return n}case 6:{let t=[],n=i([o,t],r);for(let n of r)(e||!en($t(n)))&&t.push(a(n));return n}}let{message:c}=r;return i([o,{name:s,message:c}],r)};return a}function nn(e,t={}){let n=[];return tn(!(t.json||t.lossy),!!t.json,new Map,n)(e),n}var{parse:rn,stringify:an}=JSON,on={json:!0,lossy:!0};function sn(e){return Yt(rn(e))}function cn(e){return an(nn(e,on))}function ln(e){return Yt(e)}function un(e){return cn(e)}function dn(e){return sn(e)}var fn=256,pn=class extends Error{name=`StreamClosedError`};function mn(e={}){let t=e.id??Ce(),n=Math.max(0,e.replayWindow??0),r=he(),i=new AbortController,a=[],o=!1,s=0;function c(e){if(o)throw new pn(`Cannot write to a closed stream "${t}"`);s+=1,n>0&&(a.push({seq:s,chunk:e}),a.length>n&&(a.length-n===1?a.shift():a.splice(0,a.length-n))),r.emit(`chunk`,s,e)}function l(e){if(o)return;o=!0;let t=gn(e);i.abort(e),r.emit(`end`,t)}function u(){o||(o=!0,i.signal.aborted||i.abort(`stream closed`),r.emit(`end`,void 0))}function d(e){o||i.signal.aborted||i.abort(e??`aborted`)}let f=new WritableStream({write(e){c(e)},close(){u()},abort(e){l(e)}});return{id:t,signal:i.signal,get closed(){return o},get lastSeq(){return s},write:c,error:l,close:u,abort:d,writable:f,events:r,buffer:a}}function hn(e={}){let t=e.id??Ce(),n=Math.max(1,e.highWaterMark??fn),r=[],i=0,a=!1,o=!1,s,c,l,u;function d(){if(c){if(r.length>0){let e=r.shift(),t=c;c=void 0,t.resolve({value:e,done:!1});return}if(a){let e=c;if(c=void 0,s){let t=Error(s.message);t.name=s.name,e.reject(t)}else e.resolve({value:void 0,done:!0})}}}function f(){if(l){for(;r.length>0;){let e=r.shift();try{l.enqueue(e)}catch{break}}if(a&&l){try{if(s){let e=Error(s.message);e.name=s.name,l.error(e)}else l.close()}catch{}l=void 0}}}function p(t,s){if(!(a||o)&&!(t<=i)){if(i=t,r.push(s),r.length>n){let t=r.length-n;r.splice(0,t),e.onOverflow?.(t)}d(),u&&f()}}function m(e){a||(a=!0,s=e,d(),u&&f())}function h(){o||a||(o=!0,e.onCancel?.(),m(void 0))}function g(){return u||(u=new ReadableStream({start(e){l=e,f()},cancel(){h()}}),u)}return{id:t,get cancelled(){return o},get done(){return a},get lastSeenSeq(){return i},get readable(){return g()},cancel:h,_push:p,_end:m,[Symbol.asyncIterator](){return{next(){if(r.length>0)return Promise.resolve({value:r.shift(),done:!1});if(a){if(s){let e=Error(s.message);return e.name=s.name,Promise.reject(e)}return Promise.resolve({value:void 0,done:!0})}return new Promise((e,t)=>{c={resolve:e,reject:t}})},return(){return h(),Promise.resolve({value:void 0,done:!0})}}}}}function gn(e){if(e instanceof Error)return{name:e.name||`Error`,message:e.message};if(typeof e==`string`)return{name:`Error`,message:e};try{return{name:`Error`,message:JSON.stringify(e)}}catch{return{name:`Error`,message:String(e)}}}var _n=128;function vn(e){return e.replace(/[^\w-]+/g,`_`).slice(0,_n)}var yn=`modulepreload`,bn=function(e,t){return new URL(e,t).href},xn={},Sn=function(e){return e.pathname.endsWith(`.css`)},Cn=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=o(t.map(t=>{t=bn(t,n);let r=s(t);if(r.href in xn)return;xn[r.href]=!0;let i=Sn(r);if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let o=document.createElement(`link`);if(o.rel=i?`stylesheet`:yn,i||(o.as=`script`),o.crossOrigin=``,o.href=r.href,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),i)return new Promise((e,t)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>t(Error(`Unable to preload CSS for ${r}`)))})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},wn=`__connection.json`,Tn=`__DEVFRAME_CONNECTION__`,En=`x-birpc-session`,Dn=`__rpc-dump/index.json`,On=`devframe:services`,kn=`devframe_otp`,An=`devframe_auth_token`;c.postMessage.remoteAssetsError;var jn=class{cacheMap=new Map;options;keySerializer;constructor(e){this.options=e,this.keySerializer=e.keySerializer||(e=>me(e))}updateOptions(e){this.options={...this.options,...e}}cached(e,t){let n=this.cacheMap.get(e);if(n)return n.get(this.keySerializer(t))}has(e,t){return this.cacheMap.get(e)?.has(this.keySerializer(t))??!1}apply(e,t){let n=this.cacheMap.get(e.m)||new Map;n.set(this.keySerializer(e.a),t),this.cacheMap.set(e.m,n)}validate(e){return this.options.functions.includes(e)}clear(e){e?this.cacheMap.delete(e):this.cacheMap.clear()}},R=d({docsBase:`https://devfra.me/errors`,codes:{DF0019:{why:e=>`RPC function "${e.name}" has \`agent\` set but \`jsonSerializable\` is \`false\`; MCP requires JSON-serializable data.`,fix:"Remove `jsonSerializable: false`, or remove `agent` to keep it RPC-only."},DF0020:{why:e=>`RPC function "${e.name}" declares \`jsonSerializable: true\` but the value at "${e.path}" is a ${e.type}.`,fix:"Either drop `jsonSerializable: true` (falls back to structured-clone) or change the value to a JSON-safe shape."},DF0021:{why:e=>`RPC function "${e.name}" is already registered`,fix:"Use the `force` parameter to overwrite an existing registration."},DF0022:{why:e=>`RPC function "${e.name}" is not registered. Use register() to add new functions.`},DF0023:{why:e=>`RPC function "${e.name}" is not registered`},DF0024:{why:e=>`Either handler or setup function must be provided for RPC function "${e.name}"`},DF0025:{why:e=>`Function "${e.name}" not found in dump store`},DF0026:{why:e=>`No dump match for "${e.name}" with args: ${e.args}`},DF0027:{why:e=>`Function "${e.name}" with type "${e.type}" cannot have dump configuration. Only "static" and "query" types support dumps.`},DF0028:{why:e=>`Function "${e.name}" with type "${e.type}" cannot use \`snapshot: true\`. Only "query" functions support this sugar; "static" functions have equivalent default behavior already.`,fix:"Remove `snapshot: true`, or change the function type to `query`."},DF0043:{why:e=>`RPC function "${e.name}" received an invalid argument at position ${e.index}: ${e.issues}`,fix:"Pass a value that satisfies the `args` schema declared for this function."},DF0044:{why:e=>`RPC function "${e.name}" returned a value that failed its \`returns\` schema: ${e.issues}`,fix:"Make the handler return a value that satisfies the `returns` schema, or relax the schema."}}});function Mn(e){if(e.agent&&e.jsonSerializable===!1)throw R.DF0019({name:e.name});e.agent&&!e.jsonSerializable&&(e.jsonSerializable=!0)}async function Nn(e,t){let n=e[`~standard`].validate(t);return n instanceof Promise?await n:n}function Pn(e){return e.map(e=>{let t=e.path?.map(e=>typeof e==`object`?e.key:e).join(`.`);return t?`${t}: ${e.message}`:e.message}).join(`; `)}async function Fn(e,t,n){let r=n.slice();if(!t||t.length===0)return r;for(let r=0;r<t.length;r++){let i=t[r];if(!i)continue;let a=await Nn(i,n[r]);if(a.issues)throw R.DF0043({name:e,index:r,issues:Pn(a.issues)})}return r}async function In(e,t,n){if(!t)return n;let r=await Nn(t,n);if(r.issues)throw R.DF0044({name:e,issues:Pn(r.issues)});return n}async function Ln(e,t){if(!e.setup)return{};if(typeof t==`object`&&t){e.__cache??=new WeakMap;let n=e.__cache,r=n.get(t);return r||(r=Promise.resolve(e.setup(t)),r.catch(()=>{n.get(t)===r&&n.delete(t)}),n.set(t,r)),await r}if(!e.__promise){let n=Promise.resolve(e.setup(t));n.catch(()=>{e.__promise===n&&(e.__promise=void 0)}),e.__promise=n}return await e.__promise}async function Rn(e,t){let n=e.handler;if(!n){let r=await Ln(e,t);if(!r.handler)throw R.DF0024({name:e.name});n=r.handler}let r=e.args,i=e.returns;if(!r&&!i)return n;let a=n;return async(...t)=>{let n=await Fn(e.name,r,t),o=await a(...n);return await In(e.name,i,o)}}var zn=class{context;definitions=new Map;functions;_onChanged=[];constructor(e){this.context=e;let t=this.definitions,n=this;this.functions=new Proxy({},{get(e,r){let i=t.get(r);if(i)return Rn(i,n.context)},has(e,n){return t.has(n)},getOwnPropertyDescriptor(e,n){return{value:t.get(n)?.handler,configurable:!0,enumerable:!0}},ownKeys(){return Array.from(t.keys())}})}register(e,t=!1){if(this.definitions.has(e.name)&&!t)throw R.DF0021({name:e.name});Mn(e),this.definitions.set(e.name,e),this._onChanged.forEach(t=>t(e.name))}update(e,t=!1){if(!this.definitions.has(e.name)&&!t)throw R.DF0022({name:e.name});Mn(e),this.definitions.set(e.name,e),this._onChanged.forEach(t=>t(e.name))}onChanged(e){return this._onChanged.push(e),()=>{let t=this._onChanged.indexOf(e);t!==-1&&this._onChanged.splice(t,1)}}async getHandler(e){return await Rn(this.definitions.get(e),this.context)}getSchema(e){let t=this.definitions.get(e);if(!t)throw R.DF0023({name:String(e)});return{args:t.args,returns:t.returns}}has(e){return this.definitions.has(e)}get(e){return this.definitions.get(e)}list(){return Array.from(this.definitions.keys())}};function Bn(e,t=``){return JSON.stringify(e,function(e,n){let r=this,i=r==null?n:r[e];if(i===void 0){if(Array.isArray(r))throw Hn(t,`undefined`,r,e);return n}return i!==null&&Vn(i,r,e,t),n})}function Vn(e,t,n,r){if(typeof e==`bigint`)throw Hn(r,`BigInt`,t,n);if(typeof e!=`object`)return;if(e instanceof Map)throw Hn(r,`Map`,t,n);if(e instanceof Set)throw Hn(r,`Set`,t,n);if(e instanceof Date)throw Hn(r,`Date`,t,n);if(Array.isArray(e))return;let i=Object.getPrototypeOf(e);if(i!==null&&i!==Object.prototype)throw Hn(r,e.constructor?.name??`class instance`,t,n)}function Hn(e,t,n,r){let i=Un(n,r);return R.DF0020({name:e||`<anonymous>`,type:t,path:i})}function Un(e,t){return Array.isArray(e)?`[${t}]`:t===``?`<root>`:t}var Wn=`__DEVFRAME_CONNECTION_META__`,Gn=`__DEVFRAME_CONNECTION_AUTH_TOKEN__`;function Kn(e){let t=[()=>window?.[e],()=>globalThis?.[e],()=>parent.window?.[e]];for(let e of t)try{let t=e();if(t)return t}catch{}}function qn(){return Kn(Tn)}function Jn(){return Kn(Wn)}function Yn(e){if(e)return e;try{let e=localStorage.getItem(Gn);if(e)return e}catch{}return Kn(Gn)}function Xn(e){globalThis[Tn]=e,globalThis[Wn]={...e.connectionMeta,baseUrl:e.metaBaseUrl},e.authToken&&Zn(e.authToken)}function Zn(e){try{localStorage.setItem(Gn,e)}catch{}globalThis[Gn]=e;let t=qn();t&&(globalThis[Tn]={...t,authToken:e})}function Qn(e){let t=be(wn,e);try{return new URL(t,globalThis.location?.href).href}catch{return t}}function $n(e,t){return t&&t!==e.authToken?{...e,authToken:t}:e}function er(){let e=qn();if(e)return $n(e,Yn()??e.authToken??e.connectionMeta.authToken);let t=Jn();if(t)return{connectionMeta:t,metaBaseUrl:t.baseUrl??Qn(`./`),authToken:Yn(t.authToken)}}async function tr(e={}){if(e.connection){let t=$n(e.connection,Yn(e.authToken??e.connection.authToken??e.connection.connectionMeta.authToken));return Xn(t),t}let t=Array.isArray(e.baseURL)?e.baseURL:[e.baseURL??`./`];if(e.connectionMeta){let n={connectionMeta:e.connectionMeta,metaBaseUrl:Qn(t[0]??`./`),authToken:Yn(e.authToken??e.connectionMeta.authToken)};return Xn(n),n}let n=er();if(n){let t=$n(n,Yn(e.authToken??n.authToken??n.connectionMeta.authToken));return Xn(t),t}let r=[];for(let n of t){let t=be(wn,n),i=Qn(n);try{let n=await fetch(t);if(!n.ok)throw Error(`Failed to fetch connection meta from ${i}: ${n.status}`);let r=await n.json(),a=n.url||i,o={connectionMeta:r,metaBaseUrl:r.baseUrl?new URL(r.baseUrl,a).href:a,authToken:Yn(e.authToken??r.authToken)};return Xn(o),o}catch(e){r.push(e)}}throw Error(`Failed to get connection meta from ${t.join(`, `)}`,{cause:r})}var z=class extends Error{name=`DevframeConnectionError`;kind;constructor(e,t,n){super(t,n),this.kind=e}};function nr(e=kn){try{let t=globalThis.location?.hash?.replace(/^#/,``)??``;return new URLSearchParams(t).get(e)||void 0}catch{return}}function rr(e){try{let t=new URL(globalThis.location.href),n=new URLSearchParams(t.hash.replace(/^#/,``));if(!n.has(e))return;n.delete(e),t.hash=n.toString(),globalThis.history?.replaceState(globalThis.history.state,``,t.href)}catch{}}function ir(e=kn){let t=nr(e);return t&&rr(e),t}async function ar(e,t={}){let n=ir(t.param??`devframe_otp`);return n?e.isTrusted?!0:e.requestTrustWithCode(n):!1}function or(e){let t={},n=new WeakMap,r,i=()=>(r??=e.sharedState.get(On,{initialValue:{}}).then(e=>(t=e.value(),e.on(`updated`,e=>{t=e}),e)),r);return i(),{state:i,has:e=>e in t,keys:()=>Object.keys(t),get:r=>{let i=t[r];if(!i)return;let a=n.get(i);return a||(a={...i,rpc:e.scope(i.scope).rpc},n.set(i,a)),a}}}function sr(e){let t=new Map,n=new Map,r=new Map,i=new Set,a=e.connectionMeta.backend===`static`;function o(e,t){let n=r.get(e);return n&&typeof n==`object`&&!Array.isArray(n)&&typeof t==`object`&&!Array.isArray(t)?{...n,...t}:t}e.client.register({name:c.broadcast.clientStateUpdated,type:`event`,handler:(e,n,r)=>{let i=t.get(e);i&&!i.syncIds.has(r)&&i.mutate(()=>o(e,n),r)}}),e.client.register({name:c.broadcast.clientStatePatch,type:`event`,handler:(e,n,r)=>{let i=t.get(e);i&&!i.syncIds.has(r)&&i.patch(n,r)}});function s(t,n){let r=[];return r.push(n.on(`updated`,(n,r,i)=>{a||(r?e.callEvent(`devframe:rpc:server-state:patch`,t,r,i):e.callEvent(`devframe:rpc:server-state:set`,t,n,i))})),()=>{for(let e of r)e()}}return{keys:()=>Array.from(t.keys()),onKeyAdded(e){return i.add(e),()=>{i.delete(e)}},delete(e){let i=n.get(e);n.delete(e);let a=t.delete(e);return r.delete(e),i?.(),a},get:async(l,u)=>{if(u?.initialValue!==void 0&&r.set(l,u.initialValue),t.has(l))return t.get(l);let d=Wt({initialValue:u?.initialValue,enablePatches:!1});async function f(){if(a||e.callEvent(`devframe:rpc:server-state:subscribe`,l),u?.initialValue!==void 0){t.set(l,d);for(let e of i)e(l);return e.call(`devframe:rpc:server-state:get`,l).then(e=>{e!==void 0&&d.mutate(()=>o(l,e))}).catch(e=>{console.error(`Error getting server state`,e)}),n.set(l,s(l,d)),d}{let r=await e.call(`devframe:rpc:server-state:get`,l);d.mutate(()=>o(l,r)),t.set(l,d);for(let e of i)e(l);return n.set(l,s(l,d)),d}}return new Promise(t=>{if(e.isTrusted)f().then(t);else{t(d);let n=!1;e.events.on(c.client.isTrustedUpdated,e=>{e&&!n&&(n=!0,f())})}})}}}var cr=new Map;function lr(e=cr){let t=new Map;return{serialize:n=>{let r;return n.t===`q`?r=n.m:(r=t.get(n.i),t.delete(n.i)),!(n.t===`s`&&`e`in n)&&r&&e.get(r)?.jsonSerializable===!0?Bn(n,r??``):`s:${un(n)}`},deserialize:e=>{let n=e.startsWith(`s:`)?dn(e.slice(2)):JSON.parse(e);return n.t===`q`&&n.i&&n.m&&t.set(n.i,n.m),n}}}function ur(){}function dr(e){let t=e.search(/\n\n|\r\n\r\n/);if(!(t<0))return{frame:e.slice(0,t),rest:e.slice(t+(e[t]===`\r`?4:2))}}function fr(e){let t=`message`,n=[];for(let r of e.split(/\r?\n/))r.startsWith(`:`)||(r.startsWith(`event:`)?t=r.slice(6).trimStart():r.startsWith(`data:`)&&n.push(r.slice(5).replace(/^ /,``)));return{event:t,data:n}}function pr(e){let{onConnected:t=ur,onError:n=ur,onDisconnected:r=ur,definitions:i,fetch:a=globalThis.fetch.bind(globalThis)}=e,o=e.url;e.authToken&&(o=`${o}${o.includes(`?`)?`&`:`?`}${An}=${encodeURIComponent(e.authToken)}`);let s=lr(i),c=new AbortController,l=!1,u,d,f,p,m=new Promise((e,t)=>{f=e,p=t});m.catch(()=>{});function h(e){l||(l=!0,p(e),n(e),r())}function g(){l||(l=!0,p(Error(`Devframe SSE stream closed`)),r())}function _(e,n){if(e===`session`){f(n),t();return}u?.(n)}async function v(e){let t=e.getReader();d=t;let n=new TextDecoder,r=``;for(;;){let{done:e,value:i}=await t.read();if(e)break;for(r+=n.decode(i,{stream:!0});;){let e=dr(r);if(!e)break;r=e.rest;let{event:t,data:n}=fr(e.frame);n.length>0&&_(t,n.join(`
3
+ `))}}g()}return(async()=>{try{let e=await a(o,{headers:{accept:`text/event-stream`},signal:c.signal});if(!e.ok||!e.body)throw Error(`Devframe SSE stream request failed: ${e.status}`);await v(e.body)}catch(e){if(c.signal.aborted){g();return}h(e instanceof Error?e:Error(String(e)))}})(),{close:()=>{l=!0,c.abort(),d?.cancel().catch(()=>{})},on:e=>{u=e},post:async e=>{let t;try{t=await m}catch{return}if(l){n(Error(`Devframe SSE channel is closed; message dropped`));return}try{let n=await a(o,{method:`POST`,headers:{"content-type":`text/plain; charset=utf-8`,[En]:t},body:e});if(n.status===200){let e=await n.text();e&&u?.(e);return}if(!n.ok)throw Error(`Devframe SSE POST failed: ${n.status}`)}catch(e){n(e instanceof Error?e:Error(String(e)))}},serialize:s.serialize,deserialize:s.deserialize}}function mr(e,t){let{channel:n,rpcOptions:r={}}=t;return x(e,{...n,timeout:-1,...r,proxify:!1})}function hr(e){let{transport:t,authToken:n,connectionMeta:r,events:i,clientRpc:a,rpcOptions:o={},callTimeout:s=0}=e,l=!1,u=`connecting`,d=null,f=Promise.withResolvers();function p(e,t=null){if(t?d=t:e===`connected`&&(d=null),e===u)return;let n=u;u=e,i.emit(c.client.connectionStatus,e,n)}let m=new Set;function h(e){for(let t of[...m])t.reject(e)}function g(){return u===`disconnected`||u===`error`?new z(`connection`,`[devframe] Not connected to the devframe server`,{cause:d??void 0}):u===`unauthorized`?new z(`auth`,`[devframe] Not authorized by the devframe server`,{cause:d??void 0}):null}function _(e,t){return new Promise((n,r)=>{let a=!1,o,l={reject(e){a||(u(),i.emit(c.client.error,e,t),r(e))}};function u(){a=!0,m.delete(l),o&&clearTimeout(o)}m.add(l),s>0&&(o=setTimeout(()=>{l.reject(new z(`timeout`,`[devframe] RPC call "${t}" timed out after ${s}ms`))},s)),e.then(e=>{a||(u(),n(e))},e=>{if(a)return;u();let n=e instanceof Error?e:Error(String(e));i.emit(c.client.error,n,t),r(n)})})}let v=new Map;for(let e of r.jsonSerializableMethods??[])v.set(e,{jsonSerializable:!0});let y=e.createChannel({definitions:v,onError(e){p(`error`,e),i.emit(c.client.connectionError,e),h(new z(`connection`,`[devframe] Connection to the devframe server failed`,{cause:e}))},onDisconnected(){u!==`error`&&p(`disconnected`),h(new z(`connection`,`[devframe] Disconnected from the devframe server`,{cause:d??void 0}))}}),b=mr(a.functions,{channel:y,rpcOptions:o});a.register({name:c.broadcast.authRevoked,type:`event`,handler:()=>{l=!1;let e=new z(`auth`,`[devframe] The devframe server revoked this client's trust`);p(`unauthorized`,e),i.emit(c.client.connectionError,e),h(e),i.emit(c.client.isTrustedUpdated,!1)}});let x=n;async function S(e){x=e;let t=await b.$call(`anonymous:devframe:auth`,{authToken:e,ua:navigator.userAgent,origin:location.origin});if(l=t.isTrusted,l)f.resolve(!0),p(`connected`);else{let e=new z(`auth`,`[devframe] The devframe server refused this client's credentials`);p(`unauthorized`,e),i.emit(c.client.connectionError,e)}return i.emit(c.client.isTrustedUpdated,l),t.isTrusted}async function C(e){let t=(await b.$call(`anonymous:devframe:auth:exchange`,{code:e,ua:navigator.userAgent,origin:location.origin}))?.authToken??null;return t&&(x=t,l=!0,f.resolve(!0),p(`connected`),i.emit(c.client.isTrustedUpdated,!0)),t}async function w(e={}){await b.$call(`anonymous:devframe:auth:request-code`,{ua:navigator.userAgent,origin:location.origin,...e.reissue?{reissue:!0}:{}})}async function ee(){return l?!0:S(x??``)}async function T(e=6e4){if(l&&f.resolve(!0),e<=0)return f.promise;let t;try{return await Promise.race([f.promise,new Promise((n,r)=>{t=setTimeout(()=>{r(Error(`[devframe] Timeout waiting for rpc to be trusted`))},e)})]),l}finally{clearTimeout(t)}}return{transport:t,get isTrusted(){return l},get status(){return u},get connectionError(){return d},requestTrust:ee,requestTrustWithToken:S,requestTrustWithCode:C,requestAuthCode:w,ensureTrusted:T,call:(...e)=>{let t=String(e[0]),n=g();return n?(i.emit(c.client.error,n,t),Promise.reject(n)):_(b.$call(...e),t)},callEvent:(...e)=>{let t=g();if(t){i.emit(c.client.error,t,String(e[0]));return}return b.$callEvent(...e)},callOptional:(...e)=>{let t=String(e[0]),n=g();return n?(i.emit(c.client.error,n,t),Promise.reject(n)):_(b.$callOptional(...e),t)},close:()=>{y.close()}}}function gr(e,t,n){let r=(()=>{try{return new URL(t,n.href)}catch{return new URL(n.href)}})();if(e&&typeof e==`object`){if(e.host!=null||e.port!=null){let t=e.host??`${r.hostname}:${e.port}`;return new URL(e.path??`/`,`${r.protocol}//${t}`).href}return new URL(e.path??``,r).href}let i=e??``;return/^https?:\/\//i.test(i)?i:new URL(i,r).href}function _r(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},sseOptions:s={},callTimeout:c=0}=e,l=gr(n.sse,r??`./`,location);return hr({transport:`sse`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>pr({url:l,authToken:t,definitions:e.definitions,...s,onConnected(){s.onConnected?.()},onError(t){e.onError(t),s.onError?.(t)},onDisconnected(){e.onDisconnected(),s.onDisconnected?.()}})})}function vr(e){let{name:t,message:n,cause:r,...i}=e,a=r instanceof Error?r:yr(r)?vr(r):r,o=a===void 0?Error(n):Error(n,{cause:a});return o.name=t,Object.assign(o,i),o}function yr(e){return typeof e==`object`&&!!e&&typeof e.message==`string`&&typeof e.name==`string`}function br(e){return typeof e==`object`&&!!e&&e.type===`static`&&typeof e.path==`string`}function xr(e){return typeof e==`object`&&!!e&&e.type===`query`&&typeof e.records==`object`&&e.records!==null}function Sr(e){return typeof e==`object`&&!!e&&(`output`in e||`error`in e)}function Cr(e){if(e.error)throw vr(e.error);return e.output}function wr(e){return e.some(e=>e!=null)}function Tr(e){return typeof e==`object`&&e&&`serialization`in e&&`data`in e?e.data:e}function Er(e,t){let n=new Map,r=new Map;function i(e,t){return t===`structured-clone`&&Array.isArray(e)?ln(e):e}function a(e,t){return i(Tr(e),t)}async function o(e){n.has(e.path)||n.set(e.path,t(e.path).then(t=>a(t,e.serialization)));let r=await n.get(e.path);return Sr(r)?Cr(r):r}async function s(e,n){return r.has(e)||r.set(e,t(e).then(e=>a(e,n))),await r.get(e)}async function c(t,n){if(!(t in e))throw Error(`[devframe-rpc] Function "${t}" not found in dump store`);let r=e[t];if(br(r)){if(wr(n))throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`);return await o(r)}if(xr(r)){let e=me(n),i=r.records[e];if(i)return Cr(await s(i,r.serialization));if(r.fallback)return Cr(await s(r.fallback,r.serialization));throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}if(!wr(n))return r;throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}return{call:async(e,t)=>await c(e,t),callOptional:async(t,n)=>{if(t in e)return await c(t,n)},callEvent:async(e,t)=>{}}}async function Dr(e){let t=Er(await e.fetchJsonFromBases(Dn),e.fetchJsonFromBases);return{transport:`static`,isTrusted:!0,status:`connected`,connectionError:null,requestTrust:async()=>!0,requestTrustWithToken:async()=>!0,requestTrustWithCode:async()=>null,requestAuthCode:async()=>{},ensureTrusted:async()=>!0,call:(...e)=>t.call(e[0],e.slice(1)),callEvent:(...e)=>t.callEvent(e[0],e.slice(1)),callOptional:(...e)=>t.callOptional(e[0],e.slice(1)),close:()=>{}}}var Or=``;function kr(e,t){return`${e}${Or}${t}`}function Ar(e){let t=new Map,n=new Map;e.client.register({name:c.broadcast.streamingChunk,type:`event`,handler(e,n,r,i){t.get(kr(e,n))?._push(r,i)}}),e.client.register({name:c.broadcast.streamingEnd,type:`event`,handler(e,n,r){let i=kr(e,n),a=t.get(i);a&&(a._end(r),t.delete(i))}}),e.client.register({name:c.broadcast.streamingUploadCancel,type:`event`,handler(e,t){let r=kr(e,t),i=n.get(r);i&&(i.abort(`server cancelled upload`),n.delete(r))}}),e.events.on(c.client.isTrustedUpdated,n=>{if(n)for(let[n,r]of t){if(r.cancelled||r.done)continue;let t=n.indexOf(Or);if(t<0)continue;let i=n.slice(0,t),a=n.slice(t+1);e.callEvent(`devframe:streaming:subscribe`,i,a,{afterSeq:r.lastSeenSeq})}});function r(n,r,i={}){let a=kr(n,r),o=t.get(a);if(o)return o;let s=hn({id:r,highWaterMark:i.highWaterMark,onOverflow(e){console.warn(`[devframe] DF0029: Stream "${n}#${r}" dropped ${e} chunk(s) after exceeding the client high-water mark.`)},onCancel(){e.callEvent(`devframe:streaming:cancel`,n,r),t.delete(a)}});if(t.set(a,s),e.isTrusted)e.callEvent(`devframe:streaming:subscribe`,n,r,{afterSeq:0});else{let i=e.events.on(c.client.isTrustedUpdated,o=>{o&&(i(),t.has(a)&&!s.cancelled&&!s.done&&e.callEvent(`devframe:streaming:subscribe`,n,r,{afterSeq:s.lastSeenSeq}))})}return s}function i(t,r){let i=kr(t,r),a=n.get(i);if(a)return a;let o=mn({id:r});return o.events.on(`chunk`,(n,i)=>{e.callEvent(`devframe:streaming:upload-chunk`,t,r,n,i)}),o.events.on(`end`,a=>{e.callEvent(`devframe:streaming:upload-end`,t,r,a),n.delete(i)}),n.set(i,o),o}return{subscribe:r,upload:i}}function jr(){}var Mr=new Map;function Nr(e){let t=e.url;e.authToken&&(t=`${t}?${An}=${encodeURIComponent(e.authToken)}`);let n=new WebSocket(t),{onConnected:r=jr,onError:i=jr,onDisconnected:a=jr,definitions:o=Mr}=e;n.addEventListener(`open`,e=>{r(e)}),n.addEventListener(`error`,e=>{let t=e instanceof Error?e:Error(e.type);i(t)}),n.addEventListener(`close`,e=>{a(e)});let s=lr(o);return{close:()=>{n.close()},on:e=>{n.addEventListener(`message`,t=>{e(t.data)})},post:e=>{if(n.readyState===WebSocket.OPEN){n.send(e);return}if(n.readyState===WebSocket.CONNECTING){let t=()=>{i(),n.readyState===WebSocket.OPEN&&n.send(e)},r=()=>i();function i(){n.removeEventListener(`open`,t),n.removeEventListener(`close`,r)}n.addEventListener(`open`,t),n.addEventListener(`close`,r);return}i(Error(`Devframe WebSocket is not open; message dropped`))},serialize:s.serialize,deserialize:s.deserialize}}function Pr(e,t,n){let r=(()=>{try{return new URL(t,n.href)}catch{return new URL(n.href)}})(),i=r.protocol===`https:`?`wss:`:`ws:`;if(e&&typeof e==`object`){if(e.host!=null||e.port!=null){let t=e.host??`${r.hostname}:${e.port}`,n=new URL(e.path??`/`,`${i}//${t}`);return n.protocol=i,n.href}let t=new URL(e.path??``,r);return t.protocol=i,t.href}if(typeof e==`number`)return`${i}//${r.hostname}:${e}`;let a=e??``;if(/^wss?:\/\//i.test(a))return a;if(/^https?:\/\//i.test(a))return xe(a,/^https/i.test(a)?`wss://`:`ws://`);let o=new URL(a,r);return o.protocol=i,o.href}function Fr(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},wsOptions:s={},callTimeout:c=0}=e,l=Pr(n.websocket,r??`./`,location);return hr({transport:`websocket`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>Nr({url:l,authToken:t,definitions:e.definitions,...s,onConnected(e){s.onConnected?.(e)},onError(t){e.onError(t),s.onError?.(t)},onDisconnected(t){e.onDisconnected(),s.onDisconnected?.(t)}})})}function Ir(e){return e.includes(`:`)}function Lr(e,t){return Ir(t)?t:`${e}:${t}`}function Rr(e){return{async get(t){return(await e()).value()[t]},async set(t,n){(await e()).mutate(e=>{e[t]=n})},async delete(t){(await e()).mutate(e=>{delete e[t]})},async all(){return(await e()).value()},async onChange(t){return(await e()).on(`updated`,e=>t(e))}}}function zr(e,t,n){let r=`devframe:settings:${n}:${t}`,i;function a(){return i||=e.sharedState.get(r,{initialValue:{}}),i}return Rr(a)}function Br(e,t){return{global:zr(e,t,`global`),project:zr(e,t,`project`)}}function Vr(e,t){return{namespace:t,base:e,rpc:{namespace:t,register(n){if(Ir(n.name))throw Error(`[devframe] Scoped client RPC registration for namespace "${t}" received an already-namespaced function name "${n.name}". Pass a bare name without a ":" separator.`);e.client.register({...n,name:`${t}:${n.name}`})},call:((n,...r)=>e.call(Lr(t,n),...r)),callEvent:((n,...r)=>e.callEvent(Lr(t,n),...r)),callOptional:((n,...r)=>e.callOptional(Lr(t,n),...r)),sharedState:((n,r)=>e.sharedState.get(Lr(t,n),r)),streaming:{subscribe:(n,r,i)=>e.streaming.subscribe(Lr(t,n),r,i),upload:(n,r)=>e.streaming.upload(Lr(t,n),r)}},settings:Br(e,t),scope:e.scope}}function Hr(){if(typeof document<`u`){let e=document.modelContext;if(e)return e}if(typeof navigator<`u`){let e=navigator.modelContext;if(e)return e}}function Ur(e,t={}){let n=t.modelContext??Hr();if(!n)return()=>{};let r=n,i=new Map,a=new Map;function o(t,n){let o=vn(t.name),s=a.get(o);if(s&&s!==t.name){console.warn(`[devframe] WebMCP tool name "${o}" (from "${t.name}") collides with "${s}"; keeping the first registration.`);return}let c=new AbortController,l=S(t.type,n),u=r.registerTool({name:o,description:n.description,inputSchema:ee(t.args),annotations:{title:n.title??t.name,readOnlyHint:l===`read`,destructiveHint:l===`destructive`},execute:n=>Wr(t,e.context,n)},{signal:c.signal});u&&`then`in u&&u.then(()=>{},()=>{}),a.set(o,t.name),i.set(t.name,()=>{c.abort(),u&&`unregister`in u&&typeof u.unregister==`function`&&u.unregister(),a.delete(o)})}function s(t){let n=t?[t]:[...e.definitions.keys()];for(let t of n){i.get(t)?.(),i.delete(t);let n=e.definitions.get(t),r=n?.agent;n&&r&&o(n,r)}}s();let c=e.onChanged(e=>s(e));return()=>{c();for(let e of i.values())e();i.clear()}}async function Wr(e,t,n){try{let r=te(n,e.args?.length);return{content:[{type:`text`,text:Gr(await(await Rn(e,t))(...r))}]}}catch(e){return{isError:!0,content:[{type:`text`,text:Kr(e)}]}}}function Gr(e){return e===void 0?`undefined`:typeof e==`string`?e:JSON.stringify(e,null,2)}function Kr(e){if(!(e instanceof Error))return String(e);let t=e.cause instanceof Error?` (cause: ${e.cause.message})`:``;return`${e.name}: ${e.message}${t}`}function qr(e,t){if(t.backend===`static`)return`static`;let n=t.websocket!==void 0,r=t.sse!==void 0;if(e===`websocket`){if(!n)throw Error(`[devframe] transport: 'websocket' was requested, but this server does not advertise a WebSocket endpoint`);return`websocket`}if(e===`sse`){if(!r)throw Error(`[devframe] transport: 'sse' was requested, but this server does not advertise an SSE endpoint`);return`sse`}if(t.backend===`sse`&&r)return`sse`;if(n)return`websocket`;if(r)return`sse`;throw Error(`[devframe] This server advertises no RPC transport (backend "none"), so there is nothing to connect to. Enable the WebSocket or SSE endpoint on the server, or use its static/MCP surfaces instead.`)}async function Jr(e={}){let{baseURL:t=`./`,rpcOptions:n={},cacheOptions:r=!1}=e,i=he(),a=Array.isArray(t)?t:[t],o=await tr(e),{connectionMeta:s,metaBaseUrl:c,authToken:l}=o,u=a[0]??`./`;try{u=new URL(`.`,c).href}catch{}let d=new jn({functions:[],...typeof e.cacheOptions==`object`?e.cacheOptions:{}}),f={rpc:void 0},p=new zn(f),m=e.webmcp===!1?void 0:Ur(p),h,g=!1;async function _(e){let t=[u,...a.filter(e=>e!==u)].filter(e=>e!=null),n=[];for(let r of t)try{return await fetch(be(e,r)).then(t=>{if(!t.ok)throw Error(`Failed to fetch ${e} from ${r}: ${t.status}`);return t.json()})}catch(e){n.push(e)}throw Error(`Failed to load ${e} from ${t.join(`, `)}`,{cause:n})}let v={authToken:l,connectionMeta:s,metaBaseUrl:c,events:i,clientRpc:p,callTimeout:e.callTimeout,rpcOptions:{...n,async onRequest(e,t,i){if(await n.onRequest?.call(this,e,t,i),r&&d?.validate(e.m)){if(d.has(e.m,e.a))return i(d.cached(e.m,e.a));let n=await t(e);d.apply(e,n)}else await t(e)}}},y=qr(e.transport??`auto`,s),b=y===`static`?await Dr({fetchJsonFromBases:_}):y===`sse`?_r({...v,sseOptions:e.sseOptions}):Fr({...v,wsOptions:e.wsOptions}),x;try{x=new BroadcastChannel(`devframe-auth`)}catch{}let S,C=!1;function w(e){return((...t)=>C||!S?e(...t):S.then(()=>e(...t)))}function ee(){g=!0;try{h?.(),m?.()}finally{try{x?.close()}finally{b.close?.()}}}let T={events:i,get isTrusted(){return b.isTrusted},get status(){return b.status},get connectionError(){return b.connectionError},get transport(){return b.transport??y},get connection(){return o},connectionMeta:s,ensureTrusted:b.ensureTrusted,requestTrust:b.requestTrust,requestTrustWithToken:async e=>(Zn(e),o={...o,authToken:e},b.requestTrustWithToken(e)),requestTrustWithCode:async e=>{let t=await b.requestTrustWithCode(e);if(!t)return!1;Zn(t),o={...o,authToken:t};try{x?.postMessage({type:`auth-update`,authToken:t})}catch{}return!0},requestAuthCode:e=>b.requestAuthCode(e),call:w(b.call),callEvent:w(b.callEvent),callOptional:w(b.callOptional),client:p,sharedState:void 0,services:void 0,streaming:void 0,cacheManager:d,scope:void 0,close:ee};T.sharedState=sr(T),T.streaming=Ar(T),T.services=or(T);let te=new Map;T.scope=(e=>{if(!e)return T;let t=te.get(e);return t||(t=Vr(T,e),te.set(e,t)),t}),f.rpc=T;function ne(){try{return typeof window<`u`&&window.self===window.top}catch{return!1}}async function re(){if(e.simpleAuth!==!1&&ne()&&typeof globalThis.prompt==`function`)for(await T.requestAuthCode().catch(()=>{});!T.isTrusted;){let e=globalThis.prompt(`devframe: enter the authentication code shown in your terminal`);if(e==null)return;let t=e.trim();if(t&&await T.requestTrustWithCode(t))return}}async function ie(){let t=await b.requestTrust(),n=e.otpParam??`devframe_otp`,r=n?await ar(T,{param:n}):!1;t||r||T.isTrusted||await re()}return S=ie().then(()=>{C=!0},()=>{C=!0}),s.mcp&&Cn(async()=>{let{setupBrowserAgentRpcBridge:e}=await import(`./browser-agent-rpc-BXhoSh1z-B8VY0LVK.js`);return{setupBrowserAgentRpcBridge:e}},[],import.meta.url).then(({setupBrowserAgentRpcBridge:e})=>{g||(h=e(T))}).catch(()=>{}),x&&(x.onmessage=e=>{e.data?.type===`auth-update`&&e.data.authToken&&T.requestTrustWithToken(e.data.authToken)}),T}var B=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`;function V(){throw new ni(`SQLITE_DEVTOOLS_INVALID_PAYLOAD`,`Invalid or oversized SQLite DevTools payload.`)}function Yr(e){(!Number.isSafeInteger(e)||e<1||e>16777216)&&V();let t=0,n=0;return(r,i=1)=>{t+=1,n+=i,(r>32||t>1e5||n>e)&&V()}}function Xr(e){let t=[];for(let n=0;n<e.length;n+=3){let r=e[n]??0,i=e[n+1]??0,a=e[n+2]??0;t.push(`${B[r>>2]}${B[(r&3)<<4|i>>4]}${n+1<e.length?B[(i&15)<<2|a>>6]:`=`}${n+2<e.length?B[a&63]:`=`}`)}return t.join(``)}function Zr(e){/^(?:[A-Z\d+/]{4})*(?:[A-Z\d+/]{2}==|[A-Z\d+/]{3}=)?$/i.test(e)||V();let t=e.length/4*3-(e.endsWith(`==`)?2:+!!e.endsWith(`=`)),n=new Uint8Array(t),r=0;for(let i=0;i<e.length;i+=4){let a=B.indexOf(e[i])<<18|B.indexOf(e[i+1])<<12|Math.max(0,B.indexOf(e[i+2]))<<6|Math.max(0,B.indexOf(e[i+3]));r<t&&(n[r++]=a>>16&255),r<t&&(n[r++]=a>>8&255),r<t&&(n[r++]=a&255)}return Xr(n)!==e&&V(),n}function Qr(e,t=ti){let n=Yr(t),r=new Set;function i(e,t){if(n(t),e===void 0)return{type:`undefined`};if(e===null||typeof e==`boolean`)return e;if(typeof e==`number`)return Number.isFinite(e)||V(),e;if(typeof e==`string`)return n(t,e.length*3),e;if(typeof e==`bigint`){let r=e.toString();return n(t,r.length),{type:`bigint`,value:r}}if(e instanceof Uint8Array||e instanceof ArrayBuffer){let r=e instanceof Uint8Array?e:new Uint8Array(e);return n(t,Math.ceil(r.byteLength/3)*4),{type:`bytes`,kind:e instanceof Uint8Array?`uint8array`:`arraybuffer`,value:Xr(r)}}(typeof e!=`object`||r.has(e))&&V(),r.add(e);try{return Array.isArray(e)?{type:`array`,value:e.map(e=>i(e,t+1))}:(Object.getPrototypeOf(e)!==Object.prototype&&Object.getPrototypeOf(e)!==null&&V(),{type:`object`,value:Object.entries(e).map(([e,r])=>(n(t,e.length*3),[e,i(r,t+1)]))})}finally{r.delete(e)}}let a=i(e,0);return JSON.stringify(a).length>t&&V(),a}function $r(e,t=ti){let n=Yr(t);function r(e,t){if(n(t),e===null||typeof e==`boolean`)return e;if(typeof e==`number`)return Number.isFinite(e)||V(),e;if(typeof e==`string`)return n(t,e.length*3),e;if(ri(e)||V(),e.type!==`undefined`){if(e.type===`bigint`&&typeof e.value==`string`&&/^-?(?:0|[1-9]\d*)$/.test(e.value))return n(t,e.value.length),BigInt(e.value);if(e.type===`bytes`&&typeof e.value==`string`&&(e.kind===`uint8array`||e.kind===`arraybuffer`)){n(t,e.value.length);let r=Zr(e.value);return e.kind===`arraybuffer`?r.buffer:r}if(e.type===`array`&&Array.isArray(e.value))return e.value.map(e=>r(e,t+1));if(e.type===`object`&&Array.isArray(e.value)){let i=new Set;return Object.fromEntries(e.value.map(e=>((!Array.isArray(e)||e.length!==2||typeof e[0]!=`string`||i.has(e[0]))&&V(),n(t,e[0].length*3),i.add(e[0]),[e[0],r(e[1],t+1)])))}return V()}}return r(e,0)}var ei=`weapp-sqlite`,ti=16777216,ni=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`SqliteDevtoolsError`}};function ri(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function ii(){let e=await Jr({otpParam:!1});if(!(e.isTrusted||await ar(e).catch(()=>!1))||!e.isTrusted)throw e.close?.(),new ni(`SQLITE_DEVTOOLS_UNAUTHORIZED`,`Devframe did not authorize the SQLite panel.`);let t=e.scope(ei).rpc,n=new Set,r=new Set,i=[],a,o=`panel-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`,s=()=>{let t=e.status===`connected`?`connected`:e.status===`connecting`?`connecting`:`disconnected`;for(let e of r)e(t)};return t.register({name:`state-updated`,type:`event`,jsonSerializable:!0,handler:e=>{i=e,t.call(`list-runtimes`,o).catch(()=>void 0);for(let t of n)t(e)}}),e.events.on(`connection:status`,s),s(),{async listRuntimes(){return i=await t.call(`list-runtimes`,o),i},request:(async(e,n,r,a)=>{let o=i.find(t=>t.id===e);if(!o||!o.databases.includes(n))throw new ni(`SQLITE_DEVTOOLS_DATABASE_CLOSED`,`The selected SQLite runtime or database is unavailable.`);let s={runtimeId:e,sessionId:o.sessionId,databaseName:n,method:r,args:Qr(a)},c=await t.call(`invoke`,s);if(!c.ok)throw new ni(c.error.code,c.error.message);return $r(c.value)}),subscribe(e){return n.add(e),()=>n.delete(e)},subscribeStatus(e){return r.add(e),s(),()=>r.delete(e)},dispose(){return a??=(async()=>{await Promise.allSettled(i.map(e=>Promise.resolve().then(()=>t.call(`release-session`,{runtimeId:e.id,sessionId:e.sessionId,ownerId:o})))),t.unregister?.(),e.close?.()})()}}}function ai(e){return{sql:e.sql.trim(),parameters:e.parameters}}function oi(e,t){let n=new Map(t.map(e=>[e.id,e.sessionId]));return e.some(e=>{let t=n.get(e.id);return t!==void 0&&t!==e.sessionId})}var si=class{runtimeId=``;databaseName=``;generation=0;databases=new Map;sequences=new Map;historyId=0;get key(){return JSON.stringify([this.runtimeId,this.databaseName])}get current(){let e=this.databases.get(this.key);return e||(e={tab:`data`,tables:[],table:``,columns:[],indexes:[],search:``,filters:[],orderColumn:``,orderDirection:`asc`,offset:0,cursorStack:[],limit:50,selectedRows:new Set,sql:`SELECT name, type FROM sqlite_schema ORDER BY name`,parameters:`[]`,sqlSummary:``,plan:void 0,analysis:void 0,history:[],undo:{available:!1},error:``,notice:``},this.databases.set(this.key,e)),e}select(e,t){return this.invalidate(),this.runtimeId=e,this.databaseName=t,this.current}selectTable(e){this.invalidate(),Object.assign(this.current,{table:e,page:void 0,columns:[],indexes:[],capabilities:void 0,filters:[],search:``,orderColumn:``,offset:0,cursorStack:[],selectedRows:new Set})}invalidate(){this.generation++,this.sequences.clear()}begin(e){let t=(this.sequences.get(e)??0)+1;return this.sequences.set(e,t),{generation:this.generation,sequence:t,key:this.key,lane:e}}accepts(e){return e.generation===this.generation&&e.key===this.key&&this.sequences.get(e.lane)===e.sequence}record(e,t){e.history.unshift({...t,id:++this.historyId,at:Date.now()}),e.history.length=Math.min(e.history.length,50)}restoreHistory(e){let t=this.current.history.find(t=>t.id===e);t&&(this.current.sql=t.sql,this.current.parameters=t.parameters,this.current.tab=`sql`)}};function ci(e){let t=e.map(e=>({id:Number(e.id),parent:Number(e.parent),detail:String(e.detail??``)})),n=new Map(t.map(e=>[e.id,e]));return t.map(e=>{let t=n.get(e.parent),r=0,i=new Set([e.id]);for(;t&&!i.has(t.id);)i.add(t.id),r++,t=n.get(t.parent);return{...e,depth:r}})}function li(e){return e==null?`NULL`:e instanceof Uint8Array||e instanceof ArrayBuffer?`BLOB · ${e.byteLength} bytes`:String(e)}function ui(e){return JSON.stringify(e,(e,t)=>typeof t==`bigint`?{$bigint:t.toString()}:t instanceof Uint8Array?{$blob:Array.from(t)}:t,2)}function di(e){return JSON.parse(e,(e,t)=>{if(t&&typeof t==`object`&&!Array.isArray(t)){let e=t;if(Object.keys(e).length===1&&typeof e.$bigint==`string`)return BigInt(e.$bigint);if(Object.keys(e).length===1&&Array.isArray(e.$blob)){let t=e.$blob;if(!t.every(e=>typeof e==`number`&&Number.isInteger(e)&&e>=0&&e<=255))throw TypeError(`$blob 必须是 0–255 的整数数组。`);return Uint8Array.from(t)}}return t})}function fi(e){let t=di(e.trim()||`[]`);if(!t||typeof t!=`object`||t instanceof Uint8Array)throw TypeError(`绑定参数必须是 JSON 数组或命名参数对象。`);for(let e of Object.values(t))if(e!==null&&typeof e!=`string`&&typeof e!=`number`&&typeof e!=`bigint`&&!(e instanceof Uint8Array))throw TypeError(`参数只支持字符串、数字、NULL、{$bigint: "…"} 或 {$blob: [0, 255]}。`);return t}function H(e,t=``,n){let r=document.createElement(e);return r.className=t,n!==void 0&&(r.textContent=n),r}function U(e,t,n=``,r=!1){let i=H(`button`,n,e);return i.type=`button`,i.disabled=r,i.addEventListener(`click`,()=>{t()}),i}function W(e,t=``,n,r=!1){let i=H(r?`textarea`:`input`);return i.value=t,i.setAttribute(`aria-label`,e),i.addEventListener(`input`,()=>n?.(i.value)),i}function G(e,t){let n=H(`label`,`field`);return n.append(H(`span`,`field-label`,e),t),n}function K(e,t,n,r){let i=H(`select`);i.setAttribute(`aria-label`,e);for(let e of t){let t=H(`option`,``,e.label);t.value=e.value,t.selected=e.value===n,i.append(t)}return i.addEventListener(`change`,()=>r?.(i.value)),i}function q(e,t){let n=H(`div`,`empty`);return n.append(H(`div`,`empty-symbol`,`▤`),H(`h2`,``,e),H(`p`,``,t)),n}function pi(e,t,n={}){let r=H(`div`,`table-scroll`),i=H(`table`,`data-grid`),a=H(`thead`),o=H(`tr`);n.onSelect&&o.append(H(`th`,`selection-column`,``));for(let t of e){let e=H(`th`);e.append(n.sort?U(t,()=>n.sort?.(t),`column-sort`):document.createTextNode(t)),o.append(e)}n.onEdit&&o.append(H(`th`,``,`操作`)),a.append(o);let s=H(`tbody`);return t.forEach((t,r)=>{let i=H(`tr`);if(n.onSelect){let e=H(`td`,`selection-column`),t=H(`input`);t.type=`checkbox`,t.checked=n.selectedRows?.has(r)??!1,t.setAttribute(`aria-label`,`选择第 ${r+1} 行`),t.addEventListener(`change`,()=>n.onSelect?.(r,t.checked)),e.append(t),i.append(e)}for(let n of e){let e=t[n],r=H(`td`,e==null?`cell-null`:typeof e==`number`||typeof e==`bigint`?`cell-number`:e instanceof Uint8Array?`cell-blob`:``,li(e));r.title=li(e),i.append(r)}if(n.onEdit){let e=H(`td`);e.append(U(`编辑`,()=>n.onEdit?.(r),`text-button`)),i.append(e)}s.append(i)}),i.append(a,s),r.append(i),t.length||r.append(q(`没有匹配的数据`,`调整筛选条件,或向当前表添加数据。`)),r}function mi(e,t,n){let r=URL.createObjectURL(new Blob([new Uint8Array(e)],{type:n})),i=H(`a`);i.href=r,i.download=t,i.click(),setTimeout(()=>URL.revokeObjectURL(r),1e3)}function hi(e,t,n,r=`保存更改`,i=!1){let a=H(`dialog`,`dialog`),o=H(`div`,`dialog-heading`);o.append(H(`h2`,``,e),U(`关闭`,()=>a.close(),`text-button`));let s=H(`div`,`dialog-error`);s.setAttribute(`role`,`alert`);let c=H(`div`,`dialog-actions`),l=U(r,async()=>{l.disabled=!0,s.textContent=``;try{await n(),a.close()}catch(e){s.textContent=e instanceof Error?e.message:String(e)}finally{l.disabled=!1}},i?`danger solid`:`primary`);return c.append(U(`取消`,()=>a.close()),l),a.append(o,t,s,c),a.addEventListener(`close`,()=>a.remove()),document.body.append(a),a.showModal(),a}var gi=[`INTEGER`,`REAL`,`TEXT`,`BLOB`,`NUMERIC`];function _i(e){let t=e.state.begin(`dialog`);return()=>{if(!e.state.accepts(t))throw Error(`连接或所选数据库已改变,请关闭此窗口并重新操作。`);if(e.readOnly)throw Error(`当前运行实例为只读模式。`)}}function vi(e,t,n,r){let i=_i(e),a=H(`div`,`dialog-content`);a.append(H(`p`,``,n?`输入「${n}」以确认${t}。`:`确认${t}?此操作会修改当前数据库。`));let o=W(`输入名称以确认`);n&&a.append(o),hi(t,a,async()=>{if(i(),n&&o.value!==n)throw Error(`输入的名称与目标不一致。`);await r(),await e.refresh()},`确认执行`,!0)}function yi(e,t){let n=e.state.current,r=n.table,i=t===void 0?void 0:n.page?.rowLocators[t],a=_i(e),o=H(`div`,`dialog-content`);o.append(H(`p`,``,`使用 JSON 对象编辑列值。省略的列保留默认值;NULL 使用 null。`)),o.append(H(`p`,`muted`,`大整数:{"$bigint":"9007199254740993"} · BLOB:{"$blob":[0,255]}`));let s=W(`行数据 JSON`,ui(t===void 0?{}:n.page?.rows[t]??{}),void 0,!0);s.className=`code-editor row-editor`,o.append(s),hi(t===void 0?`新增行 · ${r}`:`编辑行 · ${r}`,o,async()=>{a();let n=di(s.value);if(!n||Array.isArray(n)||typeof n!=`object`||n instanceof Uint8Array)throw Error(`行数据必须是 JSON 对象。`);if(fi(s.value),t===void 0)await e.request(`insertRow`,r,n,{allowWrite:!0});else if(i)await e.request(`updateRow`,r,i,n,{allowWrite:!0});else throw Error(`当前行缺少可写定位信息,请刷新后重试。`);await e.refresh()})}function bi(e){let t=_i(e),n=H(`div`,`dialog-content`),r=W(`表名`),i=W(`列定义 JSON`,`[
4
+ {"name": "id", "type": "INTEGER", "primaryKey": true},
5
+ {"name": "name", "type": "TEXT"}
6
+ ]`,void 0,!0);i.className=`code-editor row-editor`,n.append(G(`表名`,r),G(`列定义`,i),H(`p`,`muted`,`支持 primaryKey、notNull、unique 与 defaultExpression。`)),hi(`新建数据表`,n,async()=>{t();let n=JSON.parse(i.value);if(!Array.isArray(n)||!n.length)throw Error(`至少需要一列。`);await e.request(`createTable`,r.value,n,{allowWrite:!0}),e.state.selectTable(r.value),await e.refresh()},`创建表`)}function xi(e){let t=_i(e),n=e.state.current.table,r=H(`div`,`dialog-content`),i=W(`列名`),a=K(`列类型`,gi.map(e=>({value:e,label:e})),`TEXT`);r.append(G(`列名`,i),G(`类型`,a)),hi(`新增列 · ${n}`,r,async()=>{t(),await e.request(`addColumn`,n,{name:i.value,type:a.value},{allowWrite:!0}),await e.refresh()})}function Si(e,t){let n=_i(e),r=e.state.current.table,i=H(`div`,`dialog-content`),a=W(`新名称`,t??r);i.append(G(`新名称`,a)),hi(t?`重命名列 · ${t}`:`重命名表 · ${r}`,i,async()=>{n();let i={allowWrite:!0,confirmTable:r};t?await e.request(`renameColumn`,r,t,a.value,i):(await e.request(`renameTable`,r,a.value,i),e.state.selectTable(a.value)),await e.refresh()})}function Ci(e){let t=_i(e),n=e.state.current.table,r=H(`div`,`dialog-content`),i=W(`索引名`,`${n}_idx`),a=W(`索引列 JSON`,ui([{name:e.state.current.columns[0]?.name??``,direction:`asc`}]),void 0,!0);a.className=`code-editor`;let o=K(`唯一索引`,[{value:`no`,label:`普通索引`},{value:`yes`,label:`唯一索引`}],`no`);r.append(G(`索引名`,i),G(`列与排序方向`,a),G(`类型`,o)),hi(`创建索引 · ${n}`,r,async()=>{t(),await e.request(`createIndex`,n,i.value,JSON.parse(a.value),{allowWrite:!0,unique:o.value===`yes`}),await e.refresh()},`创建索引`)}async function wi(e,t){let n=e.state.databaseName,r=e.state.current.table;await e.perform(`导出完成`,async()=>{if(t===`sqlite`){let t=await e.request(`exportDatabase`);mi(t.bytes,`${n}.sqlite`,`application/vnd.sqlite3`),mi(new TextEncoder().encode(JSON.stringify(t.metadata,null,2)),`${n}.metadata.json`,`application/json`)}else{let n=await e.request(`exportTable`,r,{format:t});mi(n.bytes,n.fileName,n.mimeType)}})}function Ti(e,t){let n=_i(e),r=H(`input`);r.type=`file`,r.accept=t===`sqlite`?`.sqlite,.sqlite3,.db`:`.${t}`,r.addEventListener(`change`,()=>{let i=r.files?.[0];i&&e.perform(`已读取导入文件`,async()=>{n();let r=new Uint8Array(await i.arrayBuffer());if(n(),t===`sqlite`){vi(e,`替换数据库`,e.state.databaseName,()=>e.request(`importDatabase`,r,{replace:!0}));return}let a={format:t,bytes:r,fileName:i.name},o=await e.request(`previewTableImport`,a,{sampleRows:5});n();let s=H(`div`,`dialog-content`);s.append(H(`p`,``,`${i.name} · ${o.totalRows} 行 · 预览前 ${o.sampleRows.length} 行`),pi(o.sourceColumns,o.sampleRows));let c=W(`目标表名`,e.state.current.table||i.name.replace(/\.[^.]+$/,``)),l=K(`导入方式`,[{value:`append`,label:`追加到现有表`},{value:`create`,label:`创建新表`},{value:`replace`,label:`替换表中数据`}],e.state.current.table?`append`:`create`),u=W(`列映射 JSON`,ui(o.suggestedColumns.map(e=>({source:e.source,target:e.target,type:e.inferredType}))),void 0,!0);u.className=`code-editor`;let d=W(`替换时输入目标表名`);s.append(G(`目标表`,c),G(`方式`,l),G(`列映射`,u),G(`替换时输入目标表名`,d)),hi(`导入数据`,s,async()=>{if(n(),l.value===`replace`&&d.value!==c.value)throw Error(`请完整输入目标表名后再替换。`);await e.request(`importTable`,a,{tableName:c.value,mode:l.value,mappings:JSON.parse(u.value),allowWrite:!0,confirmTable:d.value}),e.state.selectTable(c.value),await e.refresh()},`执行导入`)})}),r.click()}function Ei(e){e.offset=0,e.cursorStack=[]}function Di(e){let t=e.state.current,n=H(`section`,`data-view`);if(!t.table)return n.append(q(`数据库中还没有表`,`从左侧创建一张表,或使用 SQL 编辑器定义结构。`)),n;let r=!e.readOnly&&t.capabilities?.writable&&!e.busy,i=H(`div`,`data-toolbar`),a=W(`搜索当前表`,t.search,e=>t.search=e);a.placeholder=`搜索当前表…`,a.addEventListener(`keydown`,n=>{n.key===`Enter`&&(Ei(t),e.refreshTable())}),i.append(a,U(`搜索`,()=>(Ei(t),e.refreshTable()),``,e.busy),H(`div`,`spacer`),U(`新增行`,()=>yi(e),`primary`,!r)),i.append(U(`删除选中${t.selectedRows.size?` (${t.selectedRows.size})`:``}`,()=>{let n=[...t.selectedRows].map(e=>t.page?.rowLocators[e]).filter(e=>e!==void 0);vi(e,`删除 ${n.length} 行`,t.table,()=>e.request(`deleteRows`,t.table,n,{allowWrite:!0,confirmTable:t.table}))},`danger`,!r||!t.selectedRows.size)),n.append(i);let o=H(`div`,`filter-toolbar`),s=K(`筛选列`,t.columns.map(e=>({value:e.name,label:e.name})),t.columns[0]?.name??``),c=K(`筛选运算符`,[[`contains`,`包含`],[`eq`,`等于`],[`ne`,`不等于`],[`lt`,`小于`],[`lte`,`小于等于`],[`gt`,`大于`],[`gte`,`大于等于`],[`startsWith`,`前缀`],[`isNull`,`IS NULL`],[`isNotNull`,`IS NOT NULL`]].map(([e,t])=>({value:e,label:t})),`contains`),l=W(`筛选值`);if(l.placeholder=`筛选值`,o.append(H(`span`,`small-label`,`FILTER`),s,c,l,U(`添加筛选`,()=>(t.filters.push({column:s.value,operator:c.value,.../^(?:isNull|isNotNull)$/.test(c.value)?{}:{value:l.value}}),Ei(t),e.refreshTable()),``,e.busy||!t.columns.length)),t.filters.length&&o.append(U(`清除 ${t.filters.length} 个筛选`,()=>(t.filters=[],Ei(t),e.refreshTable()),`text-button`)),n.append(o),t.filters.length){let e=H(`div`,`filter-chips`);t.filters.forEach(t=>e.append(H(`code`,`filter-chip`,`${t.column} ${t.operator}${t.value===void 0?``:` ${String(t.value)}`}`))),n.append(e)}if(!t.page)return n.append(q(e.busy?`正在读取数据…`:`尚未读取数据`,`使用刷新按钮重新读取当前表。`)),n;let u=t.page,d=u.hasMore??u.offset+u.rows.length<u.total;n.append(pi(t.page.columns,t.page.rows,{sort:n=>{t.orderDirection=t.orderColumn===n&&t.orderDirection===`asc`?`desc`:`asc`,t.orderColumn=n,Ei(t),e.refreshTable()},selectedRows:t.selectedRows,...r?{onSelect:(n,r)=>{r?t.selectedRows.add(n):t.selectedRows.delete(n),e.render()},onEdit:t=>yi(e,t)}:{}}));let f=H(`div`,`pagination`),p=t.cursorStack.length?t.cursorStack.length*u.limit:u.offset;f.append(H(`span`,``,`${t.page.rows.length?p+1:0}–${p+t.page.rows.length} / ${t.page.total} 行`)),t.orderColumn&&f.append(H(`span`,`muted`,`${t.orderColumn} ${t.orderDirection.toUpperCase()}`));let m=[...new Set([25,50,100,t.limit])].sort((e,t)=>e-t);return f.append(H(`div`,`spacer`),K(`每页行数`,m.map(e=>({value:String(e),label:`${e} 行 / 页`})),String(t.limit),n=>{t.limit=Number(n),Ei(t),e.refreshTable()}),U(`上一页`,()=>(t.cursorStack.length?t.cursorStack.pop():t.offset=Math.max(0,t.offset-u.limit),e.refreshTable()),``,e.busy||t.cursorStack.length===0&&u.offset===0),U(`下一页`,()=>(u.nextCursor?(t.cursorStack.push(u.nextCursor),t.offset=0):t.offset+=u.limit,e.refreshTable()),``,e.busy||u.limit===0||!d)),n.append(f),t.capabilities?.reason&&n.append(H(`p`,`capability-note`,t.capabilities.reason)),n}function Oi(e){let t=e.state.current,n=H(`section`,`schema-view`);if(!t.table)return n.append(q(`选择一张数据表`,`在左侧选择表以查看列、索引和建表语句。`)),n;let r=e.readOnly||e.busy||!t.capabilities?.writable,i=t.table,a={allowWrite:!0,confirmTable:i},o=H(`div`,`data-toolbar`);o.append(U(`重命名表`,()=>Si(e),``,r),U(`新增列`,()=>xi(e),``,r),U(`创建索引`,()=>Ci(e),``,r),H(`div`,`spacer`),U(t.undo.available?`撤销${t.undo.operation?` · ${t.undo.operation}`:``}`:`暂无撤销`,()=>e.perform(`已撤销上次操作`,async()=>{await e.request(`undoLastDestructiveChange`),await e.refresh()}),``,r||!t.undo.available),U(`清空表`,()=>vi(e,`清空表`,i,()=>e.request(`truncateTable`,i,a)),`danger`,r),U(`删除表`,()=>vi(e,`删除表`,i,()=>e.request(`dropTable`,i,a)),`danger`,r)),n.append(o,H(`h3`,`section-title`,`列 · ${t.columns.length}`));let s=H(`div`,`schema-list`);for(let n of t.columns){let o=H(`div`,`schema-row`);o.append(H(`code`,`schema-name`,n.name),H(`span`,`type-badge`,n.type||`ANY`),H(`span`,`muted`,[n.primaryKey?`PRIMARY KEY`:``,n.notNull?`NOT NULL`:``,n.defaultValue==null?``:`DEFAULT ${String(n.defaultValue)}`].filter(Boolean).join(` · `)),U(`重命名`,()=>Si(e,n.name),`text-button`,r||!t.capabilities?.supportsRenameColumn),U(`删除`,()=>vi(e,`删除列 ${n.name}`,i,()=>e.request(`dropColumn`,i,n.name,a)),`text-button danger`,r||!t.capabilities?.supportsDropColumn)),s.append(o)}n.append(s,H(`h3`,`section-title`,`索引 · ${t.indexes.length}`)),t.indexes.length||n.append(H(`p`,`section-note`,`当前表没有索引。`));for(let o of t.indexes){let t=H(`div`,`schema-row index-row`);t.append(H(`code`,`schema-name`,o.name),H(`span`,`type-badge`,o.unique?`UNIQUE`:`INDEX`),H(`span`,`muted`,o.columns.map(e=>`${e.name} ${e.direction}`).join(`, `)),U(`删除`,()=>vi(e,`删除索引 ${o.name}`,i,()=>e.request(`dropIndex`,i,o.name,a)),`text-button danger`,r||!o.editable)),n.append(t)}return n.append(H(`h3`,`section-title`,`建表语句`),H(`pre`,`schema-sql`,t.tables.find(e=>e.name===i)?.sql??`此对象没有建表语句。`)),n}function ki(e){let t=e.state.current,n=H(`section`,`sql-view`),r=H(`div`,`editor-block`),i=H(`div`,`editor-gutter`,`SQL`),a=W(`SQL 编辑器`,t.sql,e=>t.sql=e,!0);a.className=`code-editor sql-editor`,a.spellcheck=!1,a.addEventListener(`keydown`,t=>{let n=t;(n.ctrlKey||n.metaKey)&&n.key===`Enter`&&(t.preventDefault(),e.busy||e.runSql(`query`))}),r.append(i,a);let o=W(`绑定参数 JSON`,t.parameters,e=>t.parameters=e,!0);o.className=`code-editor parameters-editor`;let s=G(`绑定参数 · JSON 数组或命名对象`,o);s.classList.add(`parameters-field`),n.append(r,s);let c=H(`div`,`sql-actions`);if(c.append(U(`运行查询`,()=>e.runSql(`query`),`primary`,e.busy),U(`执行计划`,()=>e.runSql(`explain`),``,e.busy),U(`性能诊断`,()=>e.runSql(`analyze`),``,e.busy),U(`执行写入`,()=>vi(e,`执行写入 SQL`,``,()=>e.runSql(`execute`)),`danger`,e.busy||e.readOnly),H(`span`,`shortcut`,`⌘ / Ctrl + Enter 查询`)),n.append(c),t.sqlSummary&&n.append(H(`div`,`result-summary`,t.sqlSummary)),t.plan){let e=H(`div`,`plan-tree`);e.append(H(`h3`,`section-title`,`执行计划`));for(let n of t.plan){let t=H(`div`,`plan-node`);t.style.paddingInlineStart=`${20+n.depth*24}px`,t.append(H(`span`,`plan-id`,String(n.id)),H(`code`,/\bSCAN\b/.test(n.detail)?`plan-scan`:``,n.detail)),e.append(t)}n.append(e)}if(t.analysis){let e=H(`div`,`diagnostics-panel`);e.append(H(`h3`,`section-title`,`查询性能诊断`));let r=t.analysis.diagnostics,i=r.temporaryBTreeOperations??[],a=new Map([[`order-by`,`排序`],[`group-by`,`分组`],[`distinct`,`去重`],[`other`,`其他`]]),o=[...new Set(i.map(e=>a.get(e)??e))].join(`、`);e.append(H(`p`,`section-note`,`全表扫描 ${r.fullTableScans} 次 · 临时 B-tree ${r.temporaryBtrees} 次${o?`(${o})`:``} · 自动索引 ${r.automaticIndexes} 次`)),r.warnings.length?e.append(H(`div`,`diagnostic-warnings`,r.warnings.map(e=>e===`full-table-scan`?`存在全表扫描`:e===`temporary-b-tree`?`使用临时 B-tree${o?`(${o})`:``}`:`使用自动索引`).join(` · `))):e.append(H(`p`,`section-note`,r.indexes.length?`使用索引:${r.indexes.join(`, `)}`:`未发现计划警告。`)),n.append(e)}return t.sqlResult?n.append(pi(t.sqlResult.columns,t.sqlResult.rows)):t.sqlSummary||n.append(q(`准备运行 SQL`,`查询结果和执行计划显示在这里。绑定参数会随 SQL 单独传递。`)),n}function Ai(e){let t=e.state.current,n=H(`section`,`history-view`),r=H(`div`,`data-toolbar`);r.append(H(`span`,`muted`,`当前数据库最近 ${t.history.length} 次 SQL 操作 · 仅保留本次会话`),H(`div`,`spacer`),U(`清空历史`,()=>{t.history=[],e.render()},``,!t.history.length)),n.append(r),t.history.length||n.append(q(`还没有 SQL 历史`,`运行查询、写入或执行计划后,记录会保留在当前数据库下。`));for(let r of t.history){let t=H(`article`,`history-entry ${r.status}`),i=H(`div`,`history-meta`);i.append(H(`span`,`status-label`,r.status===`success`?`成功`:`失败`),H(`span`,`type-badge`,r.kind.toUpperCase()),H(`span`,`muted`,`${new Date(r.at).toLocaleTimeString()} · ${r.elapsedMs.toFixed(1)} ms`),H(`div`,`spacer`),U(`回填编辑器`,()=>{e.state.restoreHistory(r.id),e.render()},`text-button`)),t.append(i,H(`pre`,`history-sql`,r.sql),H(`p`,`history-summary`,r.summary)),n.append(t)}return n}function ji(e){let t=e.state.current,n=H(`section`,`diagnostics-view`),r=H(`div`,`data-toolbar`);r.append(H(`span`,`muted`,`迁移和外键检查只读访问当前运行实例`),H(`div`,`spacer`),U(`重新检查`,()=>e.refresh(),``,e.busy)),n.append(r);let i=t.migrationDiagnostics;if(n.append(H(`h3`,`section-title`,`迁移诊断`)),!i)n.append(q(`尚未检查迁移`,`点击“重新检查”读取当前数据库的迁移历史。`));else{let e=i.healthy?`健康`:`需要关注 · ${i.warnings.join(`、`)}`;n.append(H(`p`,i.healthy?`diagnostics-ok`:`diagnostic-warnings`,`${e} · 已应用 ${i.applied.length} · 待执行 ${i.pending.length} · 未知 ${i.unknown.length} · 冲突 ${i.conflicts.length}`)),i.pending.length&&n.append(H(`p`,`section-note`,`待执行:${i.pending.map(e=>`${e.version} ${e.name}`).join(`、`)}`)),i.unknown.length&&n.append(H(`p`,`section-note`,`未知历史:${i.unknown.map(e=>`${e.version} ${e.name}`).join(`、`)}`)),i.conflicts.length&&n.append(H(`p`,`section-note`,`名称冲突:${i.conflicts.map(e=>`${e.version} ${e.appliedName} → ${e.expectedName}`).join(`、`)}`))}let a=t.foreignKeyDiagnostics;if(n.append(H(`h3`,`section-title`,`外键诊断`)),!a)n.append(q(`尚未检查外键`,`点击“重新检查”读取约束开关和完整性检查结果。`));else{let e=a.schemaErrors??[],t=a.healthy?`健康`:`需要关注 · ${a.warnings.join(`、`)}`;if(n.append(H(`p`,a.healthy?`diagnostics-ok`:`diagnostic-warnings`,`${t} · ${a.enabled?`foreign_keys 已开启`:`foreign_keys 已关闭`} · 约束 ${a.constraints.length} · 违规 ${a.violations.length} · 结构错误 ${e.length}`)),a.constraints.length){let e=a.constraints.map(e=>({table:e.table,from:e.from??`—`,referencedTable:e.referencedTable,to:e.to??`—`,onUpdate:e.onUpdate,onDelete:e.onDelete}));n.append(pi([`table`,`from`,`referencedTable`,`to`,`onUpdate`,`onDelete`],e))}a.violations.length&&n.append(H(`p`,`section-note`,`违规行:${a.violations.map(e=>`${e.table}#${String(e.rowid??`—`)} → ${e.parent}`).join(`、`)}`)),e.length&&n.append(H(`p`,`section-note`,`外键结构错误:${e.map(e=>`${e.table}:${e.message}`).join(`;`)}`))}return n}function Mi(e){let t=H(`details`,`file-menu`);t.append(H(`summary`,``,`导入 / 导出`));let n=H(`div`,`file-menu-content`);for(let r of[`sqlite`,`csv`,`json`])n.append(U(`导出 ${r.toUpperCase()}`,()=>(t.open=!1,wi(e,r)),``,e.busy||r!==`sqlite`&&!e.state.current.table)),n.append(U(`导入 ${r.toUpperCase()}`,()=>{t.open=!1,Ti(e,r)},``,e.busy||e.readOnly));return t.append(n),t}var Ni=document.querySelector(`#app`),Pi,J=[],Y=`connecting`,Fi=!1,X=new si,Ii;function Li(){return J.find(e=>e.id===X.runtimeId)}function Ri(e){return e?.databases??[]}function zi(e){return e?`${e.label} · ${e.platform}${e.readOnly?` · 只读`:``}`:`未连接运行实例`}function Bi(e){return e instanceof Error?e.message:String(e)}async function Z(e,...t){if(!Pi||!X.runtimeId||!X.databaseName)throw Error(`尚未选择运行实例和数据库。`);return await Pi.request(X.runtimeId,X.databaseName,e,t)}var Q={get state(){return X},get readOnly(){return Li()?.readOnly??!0},get busy(){return Fi},render:$,refresh:Ui,refreshTable:Wi,request:Z,perform:Hi,runSql:Gi};function Vi(e,t=!1){X.current.notice=e,X.current.error=t?e:``,$(),Ii&&clearTimeout(Ii),Ii=setTimeout(()=>{X.current.notice=``,t||(X.current.error=``),$()},4e3)}async function Hi(e,t){Fi=!0,X.current.error=``,$();try{await t(),Vi(e)}catch(e){Vi(Bi(e),!0)}finally{Fi=!1,$()}}async function Ui(){let e=X.begin(`refresh`);await Hi(`数据库已刷新`,async()=>{let[t,n,r]=await Promise.all([Z(`listTables`),Z(`getMigrationDiagnostics`),Z(`getForeignKeyDiagnostics`)]);if(!X.accepts(e))return;X.current.tables=t,X.current.migrationDiagnostics=n,X.current.foreignKeyDiagnostics=r;let i=t.some(e=>e.name===X.current.table)?X.current.table:t[0]?.name??``;X.selectTable(i),await Wi()})}async function Wi(){if(!X.current.table)return;let e=X.begin(`table`),t=X.current.table;await Hi(`已读取 ${t}`,async()=>{let[n,r,i,a]=await Promise.all([Z(`describeTable`,t),Z(`getTableCapabilities`,t),Z(`listIndexes`,t),Z(`readTable`,t,{limit:X.current.limit,...X.current.cursorStack.length?{cursor:X.current.cursorStack.at(-1)}:{offset:X.current.offset},...X.current.search?{search:X.current.search}:{},...X.current.filters.length?{filters:X.current.filters}:{},...X.current.orderColumn?{orderBy:[{column:X.current.orderColumn,direction:X.current.orderDirection}]}:{}})]);X.accepts(e)&&Object.assign(X.current,{columns:n,capabilities:r,indexes:i,page:a,limit:a.limit,undo:await Z(`getUndoState`)})})}async function Gi(e){let t=X.current,n=ai(t),r=n.sql,i=n.parameters;if(!r){Vi(`请输入 SQL。`,!0);return}let a=performance.now(),o;try{o=fi(i)}catch(e){Vi(Bi(e),!0);return}let s=X.begin(`sql`);await Hi(e===`query`?`查询完成`:e===`explain`?`执行计划完成`:e===`analyze`?`性能诊断完成`:`写入完成`,async()=>{if(e===`execute`&&Q.readOnly)throw Error(`当前运行实例为只读模式。`);let n=``;if(e===`query`){let e=await Z(`query`,r,o);if(!X.accepts(s))return;Object.assign(t,{sqlResult:{columns:e.columns,rows:e.rows},plan:void 0,analysis:void 0,sqlSummary:`${e.rows.length} 行 · ${e.elapsedMs.toFixed(1)} ms`}),n=t.sqlSummary}else if(e===`explain`){let e=await Z(`query`,`EXPLAIN QUERY PLAN ${r}`,o);if(!X.accepts(s))return;Object.assign(t,{plan:ci(e.rows),analysis:void 0,sqlResult:void 0,sqlSummary:`${e.rows.length} 个计划节点 · ${e.elapsedMs.toFixed(1)} ms`}),n=t.sqlSummary}else if(e===`analyze`){let e=await Z(`analyzeQuery`,r,o);if(!X.accepts(s))return;Object.assign(t,{analysis:e,plan:e.nodes.map(e=>({id:e.id,parent:e.parent,detail:e.detail,depth:e.depth})),sqlResult:void 0,sqlSummary:`${e.nodes.length} 个节点 · ${e.elapsedMs.toFixed(1)} ms`}),n=`${t.sqlSummary} · 全表扫描 ${e.diagnostics.fullTableScans} 次`}else{let e=await Z(`execute`,r,o,{allowWrite:!0});if(!X.accepts(s))return;Object.assign(t,{plan:void 0,analysis:void 0,sqlResult:void 0,sqlSummary:`${e.changes} 行受影响 · ${e.elapsedMs.toFixed(1)} ms`}),n=t.sqlSummary,t.offset=0,t.cursorStack=[],await Wi()}X.record(t,{sql:r,parameters:i,kind:e,status:`success`,elapsedMs:performance.now()-a,summary:n})}),t.error&&X.record(t,{sql:r,parameters:i,kind:e,status:`error`,elapsedMs:performance.now()-a,summary:t.error})}function $(){let e=X.current;Ni.replaceChildren();let t=H(`div`,`shell`),n=H(`header`,`topbar`),r=H(`div`,`brand`);r.append(H(`span`,`brand-mark`,`⌁`),H(`div`,``,`SQLite Workbench`),H(`span`,`eyebrow`,`DEVFRAME`));let i=H(`span`,`connection-status ${Y}`,Y===`connected`?`● 在线`:Y===`connecting`?`◌ 连接中`:`○ 已断开`);n.append(r,i);let a=H(`div`,`runtime-controls`),o=K(`运行实例`,J.map(e=>({value:e.id,label:zi(e)})),X.runtimeId,e=>{let t=J.find(t=>t.id===e);X.select(e,t?.databases[0]??``),Ui()}),s=K(`数据库`,Ri(Li()).map(e=>({value:e,label:e})),X.databaseName,e=>{X.select(X.runtimeId,e),Ui()});if(o.disabled=!J.length||Fi,s.disabled=!X.runtimeId||Fi,a.append(o,s,Mi(Q),U(`刷新`,()=>Ui(),``,Fi||Y!==`connected`)),n.append(a),t.append(n),Y===`disconnected`){t.append(q(`等待运行实例连接`,`Devframe runtime 断开后不会重放请求。连接恢复后可安全继续操作。`)),Ni.append(t);return}if(!J.length){t.append(q(`没有发现 SQLite 运行实例`,`在应用中打开调试开关并重新加载页面。`)),Ni.append(t);return}let c=H(`div`,`workspace-layout`),l=H(`aside`,`sidebar`),u=H(`div`,`sidebar-heading`);u.append(H(`span`,``,`对象`),H(`span`,`muted`,`${e.tables.length} 个`)),l.append(u);let d=H(`div`,`table-list`);for(let t of e.tables){let n=U(``,()=>{X.selectTable(t.name),Wi()},`table-item ${t.name===e.table?`active`:``}`);n.append(H(`span`,`object-icon`,t.type===`view`?`V`:`T`),H(`code`,``,t.name)),d.append(n)}l.append(d,U(`+ 新建表`,()=>bi(Q),`sidebar-create`,Q.readOnly||Fi)),c.append(l);let f=H(`main`,`main-content`),p=H(`nav`,`tabs`);for(let[t,n]of[[`data`,`数据`],[`schema`,`结构`],[`sql`,`SQL`],[`history`,`历史`],[`diagnostics`,`诊断`]])p.append(U(n,()=>{e.tab=t,$()},`tab ${e.tab===t?`active`:``}`));f.append(p),e.error&&f.append(H(`div`,`error-banner`,e.error)),e.notice&&!e.error&&f.append(H(`div`,`notice-banner`,e.notice)),f.append(e.tab===`data`?Di(Q):e.tab===`schema`?Oi(Q):e.tab===`sql`?ki(Q):e.tab===`history`?Ai(Q):ji(Q)),c.append(f),t.append(c),Ni.append(t)}async function Ki(){try{Pi=await ii(),Y=`connected`,Pi.subscribeStatus(e=>{Y=e===`connected`||e===`connecting`?e:`disconnected`,Y===`disconnected`&&X.invalidate(),$()}),Pi.subscribe(e=>{let t=oi(J,e);J=e,t&&X.invalidate();let n=J.find(e=>e.id===X.runtimeId);!n||!n.databases.includes(X.databaseName)?(X.select(n?.id??J[0]?.id??``,n?.databases[0]??J[0]?.databases[0]??``),X.runtimeId&&Ui()):t&&Ui(),$()}),J=await Pi.listRuntimes(),J.length&&X.select(J[0].id,J[0].databases[0]??``),$(),X.runtimeId&&await Ui()}catch(e){Y=`disconnected`,Vi(Bi(e),!0)}}window.addEventListener(`beforeunload`,()=>Pi?.dispose()),$(),Ki();export{Ce as t};
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>SQLite Workbench</title>
7
+ <script type="module" crossorigin src="./assets/index-qEaVRY93.js"></script>
8
+ <link rel="stylesheet" crossorigin href="./assets/index-C4MpIW3V.css">
9
+ </head>
10
+ <body>
11
+ <div id="app"></div>
12
+ </body>
13
+ </html>
@@ -0,0 +1,76 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_protocol = require("./protocol-Cl3y675u.cjs");
3
+ let devframe_client = require("devframe/client");
4
+ //#region src/client.ts
5
+ /** Connects the panel to the host Devframe RPC namespace. */
6
+ async function connectDevtoolsClient() {
7
+ const rpc = await (0, devframe_client.getDevframeRpcClient)({ otpParam: false });
8
+ if (!(rpc.isTrusted || await (0, devframe_client.authenticateWithUrlOtp)(rpc).catch(() => false)) || !rpc.isTrusted) {
9
+ rpc.close?.();
10
+ throw new require_protocol.SqliteDevtoolsError("SQLITE_DEVTOOLS_UNAUTHORIZED", "Devframe did not authorize the SQLite panel.");
11
+ }
12
+ const scoped = rpc.scope(require_protocol.SQLITE_DEVTOOLS_SCOPE).rpc;
13
+ const runtimeListeners = /* @__PURE__ */ new Set();
14
+ const statusListeners = /* @__PURE__ */ new Set();
15
+ let runtimes = [];
16
+ let disposing;
17
+ const ownerId = `panel-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
18
+ const status = () => {
19
+ const next = rpc.status === "connected" ? "connected" : rpc.status === "connecting" ? "connecting" : "disconnected";
20
+ for (const listener of statusListeners) listener(next);
21
+ };
22
+ scoped.register({
23
+ name: "state-updated",
24
+ type: "event",
25
+ jsonSerializable: true,
26
+ handler: (nextRuntimes) => {
27
+ runtimes = nextRuntimes;
28
+ scoped.call("list-runtimes", ownerId).catch(() => void 0);
29
+ for (const listener of runtimeListeners) listener(nextRuntimes);
30
+ }
31
+ });
32
+ rpc.events.on("connection:status", status);
33
+ status();
34
+ return {
35
+ async listRuntimes() {
36
+ runtimes = await scoped.call("list-runtimes", ownerId);
37
+ return runtimes;
38
+ },
39
+ request: (async (runtimeId, databaseName, method, args) => {
40
+ const runtime = runtimes.find((item) => item.id === runtimeId);
41
+ if (!runtime || !runtime.databases.includes(databaseName)) throw new require_protocol.SqliteDevtoolsError("SQLITE_DEVTOOLS_DATABASE_CLOSED", "The selected SQLite runtime or database is unavailable.");
42
+ const invocation = {
43
+ runtimeId,
44
+ sessionId: runtime.sessionId,
45
+ databaseName,
46
+ method,
47
+ args: require_protocol.encodeSqliteDevtoolsValue(args)
48
+ };
49
+ const result = await scoped.call("invoke", invocation);
50
+ if (!result.ok) throw new require_protocol.SqliteDevtoolsError(result.error.code, result.error.message);
51
+ return require_protocol.decodeSqliteDevtoolsValue(result.value);
52
+ }),
53
+ subscribe(listener) {
54
+ runtimeListeners.add(listener);
55
+ return () => runtimeListeners.delete(listener);
56
+ },
57
+ subscribeStatus(listener) {
58
+ statusListeners.add(listener);
59
+ status();
60
+ return () => statusListeners.delete(listener);
61
+ },
62
+ dispose() {
63
+ return disposing ??= (async () => {
64
+ await Promise.allSettled(runtimes.map((runtime) => Promise.resolve().then(() => scoped.call("release-session", {
65
+ runtimeId: runtime.id,
66
+ sessionId: runtime.sessionId,
67
+ ownerId
68
+ }))));
69
+ scoped.unregister?.();
70
+ rpc.close?.();
71
+ })();
72
+ }
73
+ };
74
+ }
75
+ //#endregion
76
+ exports.connectDevtoolsClient = connectDevtoolsClient;
@@ -0,0 +1,14 @@
1
+ import { p as SqliteDevtoolsRuntimeDescriptor } from "./protocol-BhfjLrSe.cjs";
2
+ import { SqliteDebugController } from "@weapp-sqlite/debug";
3
+ //#region src/client.d.ts
4
+ type SqliteDevtoolsRequestMethod = Exclude<keyof SqliteDebugController, 'close'>;
5
+ export interface SqliteDevtoolsClient {
6
+ listRuntimes: () => Promise<readonly SqliteDevtoolsRuntimeDescriptor[]>;
7
+ request: <K extends SqliteDevtoolsRequestMethod>(runtimeId: string, databaseName: string, method: K, args: Parameters<SqliteDebugController[K]>) => Promise<Awaited<ReturnType<SqliteDebugController[K]>>>;
8
+ subscribe: (listener: (runtimes: readonly SqliteDevtoolsRuntimeDescriptor[]) => void) => () => void;
9
+ subscribeStatus: (listener: (status: 'connecting' | 'connected' | 'disconnected') => void) => () => void;
10
+ dispose: () => Promise<void>;
11
+ }
12
+ /** Connects the panel to the host Devframe RPC namespace. */
13
+ export declare function connectDevtoolsClient(): Promise<SqliteDevtoolsClient>;
14
+ //#endregion
@@ -0,0 +1,14 @@
1
+ import { p as SqliteDevtoolsRuntimeDescriptor } from "./protocol-BhfjLrSe.mjs";
2
+ import { SqliteDebugController } from "@weapp-sqlite/debug";
3
+ //#region src/client.d.ts
4
+ type SqliteDevtoolsRequestMethod = Exclude<keyof SqliteDebugController, 'close'>;
5
+ export interface SqliteDevtoolsClient {
6
+ listRuntimes: () => Promise<readonly SqliteDevtoolsRuntimeDescriptor[]>;
7
+ request: <K extends SqliteDevtoolsRequestMethod>(runtimeId: string, databaseName: string, method: K, args: Parameters<SqliteDebugController[K]>) => Promise<Awaited<ReturnType<SqliteDebugController[K]>>>;
8
+ subscribe: (listener: (runtimes: readonly SqliteDevtoolsRuntimeDescriptor[]) => void) => () => void;
9
+ subscribeStatus: (listener: (status: 'connecting' | 'connected' | 'disconnected') => void) => () => void;
10
+ dispose: () => Promise<void>;
11
+ }
12
+ /** Connects the panel to the host Devframe RPC namespace. */
13
+ export declare function connectDevtoolsClient(): Promise<SqliteDevtoolsClient>;
14
+ //#endregion
@@ -0,0 +1,75 @@
1
+ import { i as SQLITE_DEVTOOLS_SCOPE, m as encodeSqliteDevtoolsValue, o as SqliteDevtoolsError, p as decodeSqliteDevtoolsValue } from "./protocol-nkWp0_XO.mjs";
2
+ import { authenticateWithUrlOtp, getDevframeRpcClient } from "devframe/client";
3
+ //#region src/client.ts
4
+ /** Connects the panel to the host Devframe RPC namespace. */
5
+ async function connectDevtoolsClient() {
6
+ const rpc = await getDevframeRpcClient({ otpParam: false });
7
+ if (!(rpc.isTrusted || await authenticateWithUrlOtp(rpc).catch(() => false)) || !rpc.isTrusted) {
8
+ rpc.close?.();
9
+ throw new SqliteDevtoolsError("SQLITE_DEVTOOLS_UNAUTHORIZED", "Devframe did not authorize the SQLite panel.");
10
+ }
11
+ const scoped = rpc.scope(SQLITE_DEVTOOLS_SCOPE).rpc;
12
+ const runtimeListeners = /* @__PURE__ */ new Set();
13
+ const statusListeners = /* @__PURE__ */ new Set();
14
+ let runtimes = [];
15
+ let disposing;
16
+ const ownerId = `panel-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
17
+ const status = () => {
18
+ const next = rpc.status === "connected" ? "connected" : rpc.status === "connecting" ? "connecting" : "disconnected";
19
+ for (const listener of statusListeners) listener(next);
20
+ };
21
+ scoped.register({
22
+ name: "state-updated",
23
+ type: "event",
24
+ jsonSerializable: true,
25
+ handler: (nextRuntimes) => {
26
+ runtimes = nextRuntimes;
27
+ scoped.call("list-runtimes", ownerId).catch(() => void 0);
28
+ for (const listener of runtimeListeners) listener(nextRuntimes);
29
+ }
30
+ });
31
+ rpc.events.on("connection:status", status);
32
+ status();
33
+ return {
34
+ async listRuntimes() {
35
+ runtimes = await scoped.call("list-runtimes", ownerId);
36
+ return runtimes;
37
+ },
38
+ request: (async (runtimeId, databaseName, method, args) => {
39
+ const runtime = runtimes.find((item) => item.id === runtimeId);
40
+ if (!runtime || !runtime.databases.includes(databaseName)) throw new SqliteDevtoolsError("SQLITE_DEVTOOLS_DATABASE_CLOSED", "The selected SQLite runtime or database is unavailable.");
41
+ const invocation = {
42
+ runtimeId,
43
+ sessionId: runtime.sessionId,
44
+ databaseName,
45
+ method,
46
+ args: encodeSqliteDevtoolsValue(args)
47
+ };
48
+ const result = await scoped.call("invoke", invocation);
49
+ if (!result.ok) throw new SqliteDevtoolsError(result.error.code, result.error.message);
50
+ return decodeSqliteDevtoolsValue(result.value);
51
+ }),
52
+ subscribe(listener) {
53
+ runtimeListeners.add(listener);
54
+ return () => runtimeListeners.delete(listener);
55
+ },
56
+ subscribeStatus(listener) {
57
+ statusListeners.add(listener);
58
+ status();
59
+ return () => statusListeners.delete(listener);
60
+ },
61
+ dispose() {
62
+ return disposing ??= (async () => {
63
+ await Promise.allSettled(runtimes.map((runtime) => Promise.resolve().then(() => scoped.call("release-session", {
64
+ runtimeId: runtime.id,
65
+ sessionId: runtime.sessionId,
66
+ ownerId
67
+ }))));
68
+ scoped.unregister?.();
69
+ rpc.close?.();
70
+ })();
71
+ }
72
+ };
73
+ }
74
+ //#endregion
75
+ export { connectDevtoolsClient };