@fugood/buttress-server 2.25.11 → 2.25.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -12
- package/config/sample.toml +15 -0
- package/lib/agent/decisions.check.d.ts +1 -0
- package/lib/agent/decisions.d.ts +113 -0
- package/lib/agent/models.d.ts +4 -2
- package/lib/agent/types.d.ts +14 -0
- package/lib/{cli-DMI3uIfZ.mjs → cli-CIa2rDj7.mjs} +2 -2
- package/lib/{client-DEUSDK5d.mjs → client-BVyIuSyr.mjs} +1 -1
- package/lib/codemode-CRowB9aL.mjs +112 -0
- package/lib/codemode-worker.mjs +2 -2
- package/lib/config-cxApm_PZ.mjs +2 -0
- package/lib/functions/templates.d.ts +1 -1
- package/lib/index.d.ts +4 -2
- package/lib/index.mjs +96 -80
- package/lib/mcp-DzknURyz.mjs +5 -0
- package/lib/mlx-bridge.py +47 -11
- package/lib/{protocol-RJSV46H1.mjs → protocol-WkPByalT.mjs} +129 -12
- package/lib/routes/decision-shared.d.ts +13 -1
- package/lib/routes/generator-cache.d.ts +3 -1
- package/lib/routes/index.d.ts +1 -0
- package/lib/routes/llm-shared.d.ts +8 -0
- package/lib/routes/openai-compat.d.ts +13 -2
- package/lib/routes/openai-decisions.check.d.ts +1 -0
- package/lib/routes/openai-decisions.d.ts +97 -0
- package/lib/routes/tts-shared.d.ts +5 -0
- package/lib/routes/typesafe-compat.check.d.ts +1 -0
- package/lib/routes/typesafe-compat.d.ts +30 -0
- package/lib/services/ggml-decision.d.ts +52 -5
- package/lib/services/ggml-llm.d.ts +34 -1
- package/lib/services/register-tts-result.d.ts +4 -0
- package/lib/{tui-Bl2ADqOw.mjs → tui-Bxeb1d7E.mjs} +1 -1
- package/lib/types.d.ts +14 -2
- package/lib/utils/SessionFileManager.d.ts +12 -4
- package/lib/utils/cors.d.ts +1 -0
- package/lib/utils/decision-sharing.d.ts +37 -0
- package/package.json +7 -7
- package/lib/codemode-BxD8KKWZ.mjs +0 -112
- package/lib/config-DtcwsKrn.mjs +0 -2
- package/lib/mcp-Cy5Jhrn5.mjs +0 -5
package/lib/codemode-worker.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{r as e,t}from"./protocol-
|
|
3
|
-
`)){let t=e.indexOf(`=`);t>0&&(o[e.slice(0,t)]=e.slice(t+1))}return o}function s(e,t){let n=`qjs_ext_${e.name.replace(/-/g,`_`)}_versions`,r=e.instance.exports[n];if(typeof r!=`function`)return;let i=r();if(i!==0)return o(t,i)}function c(e,t){let n=0,r=0;for(;t.value<e.length;){let i=e[t.value++];if(n|=(i&127)<<r,!(i&128))break;r+=7}return n}function l(e){let t=WebAssembly.Module.customSections(e,`dylink.0`);if(t.length===0)return null;let n=new Uint8Array(t[0]),r={value:0},i={memorySize:0,memoryAlignment:0,tableSize:0,tableAlignment:0,needed:[]};for(;r.value<n.length;){let e=c(n,r),t=c(n,r),a=r.value+t;if(e===1)i.memorySize=c(n,r),i.memoryAlignment=c(n,r),i.tableSize=c(n,r),i.tableAlignment=c(n,r);else if(e===2){let e=c(n,r);for(let t=0;t<e;t++){let e=c(n,r),t=new TextDecoder().decode(n.slice(r.value,r.value+e));r.value+=e,i.needed.push(t)}}r.value=a}return i}async function u(e,t,n,r,i,a){let o;o=e.wasm instanceof WebAssembly.Module?e.wasm:await WebAssembly.compile(e.wasm);let c=l(o);if(!c)throw Error(`Extension "${e.name}" is not a WASM shared library (missing dylink.0 section)`);let u=t.memory,d=t.__indirect_function_table,f=t.__stack_pointer,p=t.malloc;if(!u)throw Error(`Main module does not export memory`);if(!d)throw Error(`Main module does not export __indirect_function_table`);if(!p)throw Error(`Main module does not export malloc`);let m,h;if(a)m=a.memoryBase,h=a.tableBase;else if(c.memorySize>0){if(m=p(c.memorySize),m===0)throw Error(`Failed to allocate ${c.memorySize} bytes for extension "${e.name}"`);new Uint8Array(u.buffer,m,c.memorySize).fill(0)}else m=0;a?(h=a.tableBase,h+c.tableSize>d.length&&d.grow(h+c.tableSize-d.length)):(h=d.length,c.tableSize>0&&d.grow(c.tableSize));let g=WebAssembly.Module.imports(o),_={env:{},"GOT.mem":{},"GOT.func":{}};if(g.some(e=>e.module===`wasi_snapshot_preview1`)){let t=e.wasi&&i?e.wasi(i):void 0;_.wasi_snapshot_preview1={...n,...t,...r}}let v=new Set(WebAssembly.Module.exports(o).filter(e=>e.kind===`function`).map(e=>e.name)),y=new Set;for(let n of g)if(n.module===`env`){if(n.name===`memory`&&n.kind===`memory`)_.env.memory=u;else if(n.name===`__indirect_function_table`&&n.kind===`table`)_.env.__indirect_function_table=d;else if(n.name===`__memory_base`&&n.kind===`global`)_.env.__memory_base=new WebAssembly.Global({value:`i32`,mutable:!1},m);else if(n.name===`__table_base`&&n.kind===`global`)_.env.__table_base=new WebAssembly.Global({value:`i32`,mutable:!1},h);else if(n.name===`__stack_pointer`&&n.kind===`global`)_.env.__stack_pointer=f;else if(n.kind===`function`){let r=t[n.name];r&&typeof r==`function`?_.env[n.name]=r:(y.add(n.name),_.env[n.name]=()=>{throw Error(`Extension "${e.name}" called unresolved symbol: env.${n.name}`)})}else if(n.kind===`global`){let e=t[n.name];e instanceof WebAssembly.Global?_.env[n.name]=e:_.env[n.name]=new WebAssembly.Global({value:`i32`,mutable:!0},0)}}else if(n.module===`GOT.mem`&&n.kind===`global`)_[`GOT.mem`][n.name]=new WebAssembly.Global({value:`i32`,mutable:!0},0);else if(n.module===`GOT.func`&&n.kind===`global`){let e=t[n.name];if(e&&typeof e==`function`){let t=d.length;d.grow(1),d.set(t,e),_[`GOT.func`][n.name]=new WebAssembly.Global({value:`i32`,mutable:!0},t)}else _[`GOT.func`][n.name]=new WebAssembly.Global({value:`i32`,mutable:!0},0)}let b=[...y].filter(e=>v.has(e)),x={};for(let t of b){let n={target:null};x[t]=n,_.env[t]=(...r)=>{if(!n.target)throw Error(`Extension "${e.name}" called unresolved symbol during init: env.${t}`);return n.target(...r)}}let S=await WebAssembly.instantiate(o,_),C=S.exports;for(let e of b){let t=C[e];typeof t==`function`&&(x[e].target=t)}typeof C.__wasm_apply_data_relocs==`function`&&C.__wasm_apply_data_relocs(),typeof C.__wasm_call_ctors==`function`&&C.__wasm_call_ctors();let w=e.initFn??`qjs_ext_${e.name.replace(/-/g,`_`)}_init`,T={name:e.name,module:o,instance:S,dylink:c,memoryBase:m,tableBase:h,initFn:w};return T.versions=s(T,u),T}function d(e,t){let n=e.instance.exports[e.initFn];if(typeof n!=`function`)throw Error(`Extension "${e.name}" does not export init function "${e.initFn}"`);let r=n(t.qjs_get_context_ptr(),t.qjs_get_runtime_ptr());if(r!==0)throw Error(`Extension "${e.name}" init function returned error code ${r}`)}async function f(e,t,n,r,i,a){let o=[];for(let s of t){let t=e.find(e=>e.name===s.name);if(!t)throw Error(`Extension "${s.name}" required by snapshot but not provided`);let c=await u(t,n,r,i,a,{memoryBase:s.memoryBase,tableBase:s.tableBase});c.initFn=s.initFn,o.push(c)}return o}var p=function(e,t,n){if(t!=null){if(typeof t!=`object`&&typeof t!=`function`)throw TypeError(`Object expected.`);var r,i;if(n){if(!Symbol.asyncDispose)throw TypeError(`Symbol.asyncDispose is not defined.`);r=t[Symbol.asyncDispose]}if(r===void 0){if(!Symbol.dispose)throw TypeError(`Symbol.dispose is not defined.`);r=t[Symbol.dispose],n&&(i=r)}if(typeof r!=`function`)throw TypeError(`Object not disposable.`);i&&(r=function(){try{i.call(this)}catch(e){return Promise.reject(e)}}),e.stack.push({value:t,dispose:r,async:n})}else n&&e.stack.push({async:!0});return t},m=(function(e){return function(t){function n(n){t.error=t.hasError?new e(n,t.error,`An error was suppressed during disposal.`):n,t.hasError=!0}var r,i=0;function a(){for(;r=t.stack.pop();)try{if(!r.async&&i===1)return i=0,t.stack.push(r),Promise.resolve().then(a);if(r.dispose){var e=r.dispose.call(r.value);if(r.async)return i|=2,Promise.resolve(e).then(a,function(e){return n(e),a()})}else i|=1}catch(e){n(e)}if(i===1)return t.hasError?Promise.reject(t.error):Promise.resolve();if(t.hasError)throw t.error}return a()}})(typeof SuppressedError==`function`?SuppressedError:function(e,t,n){var r=Error(n);return r.name=`SuppressedError`,r.error=e,r.suppressed=t,r});const h=512*1024,g=1363825491;var _=class e{exports;module;instance;encoder=new TextEncoder;decoder=new TextDecoder;disposed=!1;hostCallbacks=new Map;nextInternalId=1;interruptHandler=null;unhandledRejectionHandler=null;moduleNormalizeHandler=null;moduleLoadHandler=null;timezoneOffsetHandler=null;_global=null;_versions=null;_undefined=null;_null=null;_true=null;_false=null;_ownedHandles=new Set;_activeScope=null;loadedExtensions=[];constructor(e){this.module=e,this.instance=null,this.exports=null}setInstance(e){this.instance=e,this.exports=e.exports}get versions(){if(this.assertNotDisposed(),!this._versions){let e={"quickjs-wasi":`3.6.2`,quickjs:this.readCString(this.exports.qjs_get_quickjs_version())};for(let t of this.loadedExtensions)t.versions&&Object.assign(e,t.versions);this._versions=e}return this._versions}get global(){return this._global||=new T(this,this.exports.qjs_get_global(),!0),this._global}get undefined(){return this._undefined||=new T(this,this.exports.qjs_get_undefined(),!0),this._undefined}get null(){return this._null||=new T(this,this.exports.qjs_get_null(),!0),this._null}get true(){return this._true||=new T(this,this.exports.qjs_get_true(),!0),this._true}get false(){return this._false||=new T(this,this.exports.qjs_get_false(),!0),this._false}static async create(t){let n=e.normalizeOptions(t),r=await e.resolveModule(n.wasm),i=new e(r),{instance:a,wasiBuiltins:o,wasiUserOverrides:s,memoryProxy:c}=await e.instantiate(r,i,n.wasi);if(i.setInstance(a),i.exports._initialize(),(n.intrinsics===void 0?i.exports.qjs_init():i.exports.qjs_init2(n.intrinsics))!==0)throw Error(`Failed to initialize QuickJS runtime`);if(n.extensions){let e=a.exports;for(let t of n.extensions){let n=await u(t,e,o,s,c);i.loadedExtensions.push(n),d(n,e)}}return e.applyLimits(i,n),i}static async restore(t,n){let r=e.normalizeOptions(n),i=await e.resolveModule(r.wasm),a=new e(i),{instance:o,wasiBuiltins:s,wasiUserOverrides:c,memoryProxy:l}=await e.instantiate(i,a,r.wasi);a.setInstance(o);let u=o.exports,d=a.exports.memory,p=d.buffer.byteLength/65536,m=Math.ceil(t.memory.byteLength/65536);return m>p&&d.grow(m-p),t.extensions.length>0&&(a.loadedExtensions=await f(r.extensions??[],t.extensions,u,s,c,l)),new Uint8Array(d.buffer).set(t.memory),a.exports.qjs_set_runtime_and_context(t.runtimePtr,t.contextPtr),a.exports.__stack_pointer.value=t.stackPointer,e.applyLimits(a,r),a}static serializeSnapshot(e){let t=new TextEncoder,n=4,r=[],i=[];for(let a of e.extensions){let e=t.encode(a.name),o=t.encode(a.initFn);r.push(e),i.push(o),n+=4+e.length+4+4+4+o.length}let a=24+n+e.memory.byteLength,o=new ArrayBuffer(a),s=new DataView(o),c=new Uint8Array(o);s.setUint32(0,g,!1),s.setUint8(4,2),s.setUint32(8,e.memory.byteLength,!0),s.setUint32(12,e.stackPointer,!0),s.setUint32(16,e.runtimePtr,!0),s.setUint32(20,e.contextPtr,!0);let l=24;s.setUint32(l,e.extensions.length,!0),l+=4;for(let t=0;t<e.extensions.length;t++){let n=e.extensions[t],a=r[t],o=i[t];s.setUint32(l,a.length,!0),l+=4,c.set(a,l),l+=a.length,s.setUint32(l,n.memoryBase,!0),l+=4,s.setUint32(l,n.tableBase,!0),l+=4,s.setUint32(l,o.length,!0),l+=4,c.set(o,l),l+=o.length}return c.set(e.memory,l),c}static deserializeSnapshot(e){if(e.length<24)throw Error(`Invalid snapshot: too small`);let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=t.getUint32(0,!1);if(n!==g)throw Error(`Invalid snapshot: bad magic (expected 0x${g.toString(16)}, got 0x${n.toString(16)})`);let r=t.getUint8(4);if(r!==2&&r!==1)throw Error(`Unsupported snapshot version: ${r} (expected 2)`);let i=t.getUint32(8,!0),a=t.getUint32(12,!0),o=t.getUint32(16,!0),s=t.getUint32(20,!0),c=[],l=24;if(r>=2){let n=t.getUint32(24,!0),r=28,i=new TextDecoder;for(let a=0;a<n;a++){let n=t.getUint32(r,!0);r+=4;let a=i.decode(e.slice(r,r+n));r+=n;let o=t.getUint32(r,!0);r+=4;let s=t.getUint32(r,!0);r+=4;let l=t.getUint32(r,!0);r+=4;let u=i.decode(e.slice(r,r+l));r+=l,c.push({name:a,memoryBase:o,tableBase:s,initFn:u})}l=r}let u=l+i;if(e.length<u)throw Error(`Invalid snapshot: expected ${u} bytes, got ${e.length}`);return{memory:e.slice(l,l+i),stackPointer:a,runtimePtr:o,contextPtr:s,extensions:c}}static normalizeOptions(e){if(!e)return{wasm:void 0};if(e instanceof WebAssembly.Module)return{wasm:e};if(typeof e==`object`&&(`wasm`in e||`wasi`in e||`memoryLimit`in e||`maxStackSize`in e||`interruptHandler`in e||`onUnhandledRejection`in e||`moduleLoader`in e||`intrinsics`in e||`extensions`in e||`timezoneOffset`in e)){let t=e;if(t.maxStackSize!==void 0&&(!Number.isInteger(t.maxStackSize)||t.maxStackSize<0||t.maxStackSize>524288))throw RangeError(`maxStackSize must be an integer between 0 and ${h}`);return t}return{wasm:e}}static applyLimits(e,t){t.memoryLimit!==void 0&&e.exports.qjs_set_memory_limit(t.memoryLimit),t.maxStackSize!==void 0&&e.exports.qjs_set_max_stack_size(t.maxStackSize),t.interruptHandler&&(e.interruptHandler=t.interruptHandler,e.exports.qjs_set_interrupt_handler(1)),t.onUnhandledRejection&&(e.unhandledRejectionHandler=t.onUnhandledRejection,e.exports.qjs_set_promise_rejection_handler(1)),t.moduleLoader&&(e.moduleLoadHandler=t.moduleLoader.load,e.moduleNormalizeHandler=t.moduleLoader.normalize??null,e.exports.qjs_set_module_loader(1));let n=t.timezoneOffset;if(typeof n==`function`)e.timezoneOffsetHandler=e=>-n(e)*60;else if(typeof n==`number`){let t=-n*60;e.timezoneOffsetHandler=()=>t}else e.timezoneOffsetHandler=e=>-new Date(e*1e3).getTimezoneOffset()*60}static async resolveModule(e){if(e instanceof WebAssembly.Module)return e;if(e)return WebAssembly.compile(e);throw TypeError("QuickJS: `wasm` option is required. Provide WASM bytes or a compiled `WebAssembly.Module`. The binary is shipped at `quickjs-wasi/quickjs.wasm` and can be loaded via your environment's preferred mechanism (e.g. `fetch()`, `node:fs/promises`, or a bundler import like Vite's `?url`).")}static async instantiate(e,t,n){let r=null,a=new Proxy({},{get(e,t){return r[t]}}),o=i(()=>r),s=n?n(a):void 0,c={...o,...s},l=(e,n,r,i,a)=>t.handleHostCall(e,n,r,i,a),u=()=>t.interruptHandler?+!!t.interruptHandler():0,d=(e,n,r)=>{if(!t.unhandledRejectionHandler){t.exports.qjs_free_value(e),t.exports.qjs_free_value(n);return}let i=new T(t,e),a=new T(t,n);try{t.unhandledRejectionHandler(i,a,r!==0)}finally{i.dispose(),a.dispose()}},f=e=>{let n=t.newError(e instanceof Error?e:String(e));t.exports.qjs_throw(n.ptr),n.dispose()},p=(e,t)=>{if(typeof e==`string`)return e;let n=typeof e==`object`&&e&&typeof e.then==`function`?`a Promise`:`type ${typeof e}`;throw TypeError(`moduleLoader.${t} must synchronously return a string (got ${n}). Async module loading is not supported. Pre-fetch module sources instead (see the "ES Modules" section of the quickjs-wasi README).`)},m=await WebAssembly.instantiate(e,{env:{host_call:l,host_interrupt:u,host_promise_rejection:d,host_module_normalize:(e,n)=>{if(!t.moduleNormalizeHandler){let e=t.readCString(n);return t.writeString(e).ptr}let r=t.readCString(e),i=t.readCString(n);try{let e=p(t.moduleNormalizeHandler(r,i),`normalize`);return t.writeString(e).ptr}catch(e){return f(e),0}},host_module_load:(e,n)=>{if(!t.moduleLoadHandler)return 0;let r=t.readCString(e);try{let e=p(t.moduleLoadHandler(r),`load`),{ptr:i,len:a}=t.writeString(e);return new Uint32Array(t.exports.memory.buffer,n,1)[0]=a,i}catch(e){return f(e),0}},host_get_timezone_offset:(e,n)=>{let r=Number(BigInt(e)<<32n|BigInt(n>>>0));return t.timezoneOffsetHandler?t.timezoneOffsetHandler(r):0}},wasi_snapshot_preview1:c});return r=m.exports.memory,{instance:m,wasiBuiltins:o,wasiUserOverrides:s,memoryProxy:a}}handleHostCall(e,t,n,r,i){let a=this.decoder.decode(new Uint8Array(this.exports.memory.buffer,e,t)),o=this.hostCallbacks.get(a);if(!o){let e=this.newError(`Host callback "${a}" is not registered: it was unregistered, its ephemeral function handle was disposed, or it was never re-registered after a snapshot restore.`);return this.exports.qjs_throw(e.ptr),e.dispose(),0}let s=new T(this,n,!1,!0),c=[];if(r>0&&i!==0){let e=new DataView(this.exports.memory.buffer);for(let t=0;t<r;t++){let n=e.getUint32(i+t*4,!0);c.push(new T(this,n,!1,!0))}}try{let e=o.call(s,...c);return this.exports.qjs_dup_value(e.ptr)}catch(e){let t=this.newError(e instanceof Error?e:String(e));return this.exports.qjs_throw(t.ptr),t.dispose(),0}}writeString(e){let t=S(e),n=this.exports.wasm_malloc(t.length+1);if(n===0)throw Error(`wasm_malloc failed`);let r=new Uint8Array(this.exports.memory.buffer);return r.set(t,n),r[n+t.length]=0,{ptr:n,len:t.length}}readCString(e){let t=new Uint8Array(this.exports.memory.buffer),n=e;for(;t[n]!==0;)n++;return this.decoder.decode(t.slice(e,n))}throwIfException(e){if(this.exports.qjs_is_exception(e.ptr)!==0){let t=this.getException();throw e.dispose(),this._ownedHandles.add(t),new w(t)}return e}evalCode(e,t=`<eval>`,n=0){this.assertNotDisposed();let r=this.writeString(e),i=this.writeString(t),a=this.exports.qjs_eval(r.ptr,r.len,i.ptr,n);return this.exports.wasm_free(r.ptr),this.exports.wasm_free(i.ptr),this.throwIfException(new T(this,a))}compile(e,t=`<compile>`,n=0,r=0){this.assertNotDisposed();let i=this.writeString(e),a=this.writeString(t),o=this.exports.wasm_malloc(4),s=this.exports.qjs_compile(i.ptr,i.len,a.ptr,n,r,o);if(this.exports.wasm_free(i.ptr),this.exports.wasm_free(a.ptr),s===0){this.exports.wasm_free(o);let e=this.getException();throw Error(`Compilation error: ${e.toString()}`)}let c=new Uint32Array(this.exports.memory.buffer,o,1)[0];this.exports.wasm_free(o);let l=new Uint8Array(this.exports.memory.buffer,s,c).slice();return this.exports.wasm_free(s),l}evalBytecode(e){this.assertNotDisposed();let t=this.exports.wasm_malloc(e.byteLength);new Uint8Array(this.exports.memory.buffer,t,e.byteLength).set(e);let n=this.exports.qjs_eval_bytecode(t,e.byteLength);return this.exports.wasm_free(t),this.throwIfException(new T(this,n))}executePendingJobs(){this.assertNotDisposed();let e=0;for(;this.exports.qjs_is_job_pending();){if(this.exports.qjs_execute_pending_job()<0){let e=this.getException();throw Error(`Job execution error: ${e.toString()}`)}e++}return e}runGC(){this.assertNotDisposed(),this.exports.qjs_run_gc()}get gcThreshold(){return this.assertNotDisposed(),this.exports.qjs_get_gc_threshold()}set gcThreshold(e){this.assertNotDisposed(),this.exports.qjs_set_gc_threshold(e)}getMemoryUsage(){this.assertNotDisposed();let e=this.exports.wasm_malloc(208);this.exports.qjs_compute_memory_usage(e);let t=new BigInt64Array(this.exports.memory.buffer,e,26),n={mallocSize:Number(t[0]),mallocLimit:Number(t[1]),memoryUsedSize:Number(t[2]),mallocCount:Number(t[3]),memoryUsedCount:Number(t[4]),atomCount:Number(t[5]),atomSize:Number(t[6]),strCount:Number(t[7]),strSize:Number(t[8]),objCount:Number(t[9]),objSize:Number(t[10]),propCount:Number(t[11]),propSize:Number(t[12]),shapeCount:Number(t[13]),shapeSize:Number(t[14]),jsFuncCount:Number(t[15]),jsFuncSize:Number(t[16]),jsFuncCodeSize:Number(t[17]),jsFuncPc2lineCount:Number(t[18]),jsFuncPc2lineSize:Number(t[19]),cFuncCount:Number(t[20]),arrayCount:Number(t[21]),fastArrayCount:Number(t[22]),fastArrayElements:Number(t[23]),binaryObjectCount:Number(t[24]),binaryObjectSize:Number(t[25])};return this.exports.wasm_free(e),n}getGlobal(){return this.assertNotDisposed(),new T(this,this.exports.qjs_get_global())}newString(e){this.assertNotDisposed();let{ptr:t,len:n}=this.writeString(e),r=this.exports.qjs_new_string(t,n);return this.exports.wasm_free(t),new T(this,r)}newNumber(e){return this.assertNotDisposed(),new T(this,this.exports.qjs_new_number(e))}newBigInt(e){this.assertNotDisposed();let t=Number(e&4294967295n),n=Number(e>>32n&4294967295n);return new T(this,this.exports.qjs_new_big_int64(t,n))}newObject(){return this.assertNotDisposed(),new T(this,this.exports.qjs_new_object())}newArray(){return this.assertNotDisposed(),new T(this,this.exports.qjs_new_array())}newSymbolFor(e){this.assertNotDisposed();let{ptr:t,len:n}=this.writeString(e),r=new T(this,this.exports.qjs_new_symbol(t,n,1));return this.exports.wasm_free(t),r}newArrayBuffer(e){this.assertNotDisposed();let t=e instanceof ArrayBuffer?new Uint8Array(e):e,n=this.exports.wasm_malloc(t.length);if(n===0)throw Error(`wasm_malloc failed`);new Uint8Array(this.exports.memory.buffer).set(t,n);let r=new T(this,this.exports.qjs_new_array_buffer(n,t.length));return this.exports.wasm_free(n),r}newUint8Array(e){this.assertNotDisposed();let t=this.exports.wasm_malloc(e.length);if(t===0)throw Error(`wasm_malloc failed`);new Uint8Array(this.exports.memory.buffer).set(e,t);let n=new T(this,this.exports.qjs_new_uint8_array(t,e.length));return this.exports.wasm_free(t),n}getUndefined(){return this.assertNotDisposed(),new T(this,this.exports.qjs_get_undefined())}getNull(){return this.assertNotDisposed(),new T(this,this.exports.qjs_get_null())}getTrue(){return this.assertNotDisposed(),new T(this,this.exports.qjs_get_true())}getFalse(){return this.assertNotDisposed(),new T(this,this.exports.qjs_get_false())}newFunction(e,t){if(this.assertNotDisposed(),this.hostCallbacks.has(e))throw Error(`Host callback with name "${e}" is already registered`);this.hostCallbacks.set(e,t);let{ptr:n,len:r}=this.writeString(e),i=this.exports.qjs_new_host_function(n,r,0);return this.exports.wasm_free(n),new T(this,i)}withScope(e){this.assertNotDisposed();let t=this._activeScope,n=new Set;this._activeScope=n;let r={escape:e=>(n.delete(e),t?.add(e),e)};try{return e(r)}finally{this._activeScope=t;for(let e of n)e.dispose()}}exportHandle(e){if(this.assertNotDisposed(),e.vm!==this)throw Error(`exportHandle: handle belongs to a different VM`);if(e.disposed)throw Error(`exportHandle: handle is disposed`);if(e._isBorrowed)throw Error(`exportHandle: cannot export a borrowed handle (host-callback this/argument); its box is freed when the callback returns. dup() it and export the duplicate.`);return e.ptr}importHandle(e){if(this.assertNotDisposed(),!Number.isInteger(e)||e<=0||e>=this.exports.memory.buffer.byteLength)throw Error(`importHandle: invalid token ${e}`);return new T(this,this.exports.qjs_dup_value(e))}newEphemeralFunction(e){this.assertNotDisposed();let t=`__ephemeral:${this.nextInternalId++}`;this.hostCallbacks.set(t,e);let{ptr:n,len:r}=this.writeString(t),i=this.exports.qjs_new_host_function(n,r,0);this.exports.wasm_free(n);let a=new T(this,i);return a._onDispose=()=>{this.hostCallbacks.delete(t)},a}unregisterHostCallback(e){return this.hostCallbacks.delete(e)}newInternalFunction(e,t){this.hostCallbacks.set(e,t);let{ptr:n,len:r}=this.writeString(e),i=this.exports.qjs_new_host_function(n,r,0);return this.exports.wasm_free(n),new T(this,i)}newPromise(){this.assertNotDisposed();let e=this.exports.wasm_malloc(4),t=this.exports.wasm_malloc(4),n=this.exports.qjs_new_promise(e,t),r=new DataView(this.exports.memory.buffer),i=r.getUint32(e,!0),a=r.getUint32(t,!0);this.exports.wasm_free(e),this.exports.wasm_free(t);let o=new T(this,n),s=new T(this,i),c=new T(this,a),l=this;l._ownedHandles.add(s),l._ownedHandles.add(c);let u=null;return{handle:o,get settled(){if(!u){let e;u=new Promise(t=>{e=t});let t=`__settle:${l.nextInternalId++}`,n=l.newInternalFunction(t,()=>(e(),l.hostCallbacks.delete(t),l.undefined));l.promiseThenRaw(o,n,n).dispose(),n.dispose()}return u},resolve(e){l.callFunctionRaw(s,l.undefined,e).dispose(),l._ownedHandles.delete(s),s.dispose()},reject(e){l.callFunctionRaw(c,l.undefined,e).dispose(),l._ownedHandles.delete(c),c.dispose()}}}resolvePromise(e){if(this.assertNotDisposed(),!this.exports.qjs_is_promise(e.ptr))return Promise.resolve({value:e.dup()});let t=this.exports.qjs_promise_state(e.ptr);return t===1?Promise.resolve({value:new T(this,this.exports.qjs_promise_result(e.ptr))}):t===2?Promise.resolve({error:new T(this,this.exports.qjs_promise_result(e.ptr))}):new Promise(t=>{let n=this.nextInternalId++,r=`__onFulfilled:${n}`,i=`__onRejected:${n}`,a=this.newInternalFunction(r,(...e)=>{let n=e[0]?.dup()??this.undefined;return this.hostCallbacks.delete(r),this.hostCallbacks.delete(i),t({value:n}),this.undefined}),o=this.newInternalFunction(i,(...e)=>{let n=e[0]?.dup()??this.undefined;return this.hostCallbacks.delete(r),this.hostCallbacks.delete(i),t({error:n}),this.undefined});this.promiseThenRaw(e,a,o).dispose(),a.dispose(),o.dispose()})}promiseThenRaw(e,t,n){return new T(this,this.exports.qjs_promise_then(e.ptr,t.ptr,n.ptr))}markPromiseHandled(e){this.assertNotDisposed(),this.exports.qjs_promise_mark_as_handled(e.ptr)}callFunction(e,t,...n){return this.throwIfException(this.callFunctionRaw(e,t,...n))}construct(e,...t){this.assertNotDisposed();let n=t.length,r=0;if(n>0){r=this.exports.wasm_malloc(n*4);let e=new DataView(this.exports.memory.buffer);for(let i=0;i<n;i++)e.setUint32(r+i*4,t[i].ptr,!0)}let i=this.exports.qjs_call_constructor(e.ptr,n,r);return r&&this.exports.wasm_free(r),this.throwIfException(new T(this,i))}callFunctionRaw(e,t,...n){this.assertNotDisposed();let r=n.length,i=0;if(r>0){i=this.exports.wasm_malloc(r*4);let e=new DataView(this.exports.memory.buffer);for(let t=0;t<r;t++)e.setUint32(i+t*4,n[t].ptr,!0)}let a=this.exports.qjs_call(e.ptr,t.ptr,r,i);return i&&this.exports.wasm_free(i),new T(this,a)}setProp(e,t,n){if(this.assertNotDisposed(),typeof t==`string`){let{ptr:r}=this.writeString(t);this.exports.qjs_set_prop_string(e.ptr,r,n.ptr),this.exports.wasm_free(r)}else this.exports.qjs_set_prop_value(e.ptr,t.ptr,n.ptr)}defineProp(e,t,n,r){this.assertNotDisposed();let i=0;if(r?.configurable&&(i|=1),r?.writable&&(i|=2),r?.enumerable&&(i|=4),typeof t==`string`){let{ptr:r}=this.writeString(t);this.exports.qjs_define_prop_string(e.ptr,r,n.ptr,i),this.exports.wasm_free(r)}else this.exports.qjs_define_prop_value(e.ptr,t.ptr,n.ptr,i)}getProp(e,t){return this.assertNotDisposed(),new T(this,this.exports.qjs_get_prop_value(e.ptr,t.ptr))}getException(){return this.assertNotDisposed(),new T(this,this.exports.qjs_get_exception())}newError(e){this.assertNotDisposed();let t=this.exports.qjs_new_error(),n=new T(this,t);if(typeof e==`string`){let t=this.newString(e);n.setProp(`message`,t),t.dispose()}else{let t=this.newString(e.message);if(n.setProp(`message`,t),t.dispose(),e.name){let t=this.newString(e.name);n.setProp(`name`,t),t.dispose()}if(e.stack){let t=this.newString(e.stack);n.setProp(`stack`,t),t.dispose()}}return n}typeof(e){this.assertNotDisposed();let t=this.exports;return t.qjs_is_undefined(e.ptr)?`undefined`:t.qjs_is_null(e.ptr)?`object`:t.qjs_is_bool(e.ptr)?`boolean`:t.qjs_is_number(e.ptr)?`number`:t.qjs_is_big_int(e.ptr)?`bigint`:t.qjs_is_string(e.ptr)?`string`:t.qjs_is_symbol(e.ptr)?`symbol`:t.qjs_is_function(e.ptr)?`function`:t.qjs_is_object(e.ptr)?`object`:`unknown`}dump(e){return this.assertNotDisposed(),this._dump(e,new Map)}_dump(e,t){let n=this.exports;if(!n.qjs_is_undefined(e.ptr)){if(n.qjs_is_null(e.ptr))return null;if(n.qjs_is_bool(e.ptr))return n.qjs_get_bool(e.ptr)!==0;if(n.qjs_is_number(e.ptr))return n.qjs_get_float64(e.ptr);if(n.qjs_is_string(e.ptr))return e.toString();if(n.qjs_is_big_int(e.ptr))return e.toBigInt();if(n.qjs_is_symbol(e.ptr)){let t=n.wasm_malloc(4),r=n.qjs_get_symbol_description(e.ptr,t),i=new DataView(n.memory.buffer).getUint32(t,!0);if(n.wasm_free(t),r===1){let e=new T(this,i),t=e.toString();return e.dispose(),Symbol.for(t)}else if(r===2){new T(this,i).dispose();return}return}if(n.qjs_is_array_buffer(e.ptr))return e.toArrayBuffer();if(n.qjs_is_exception(e.ptr)){let e=this.getException(),t=e.toString();return e.dispose(),Error(t)}if(!n.qjs_is_function(e.ptr)){if(n.qjs_is_object(e.ptr)){let r=n.qjs_get_value_ptr(e.ptr);if(r){let e=t.get(r);if(e!==void 0)return e}}if(n.qjs_is_object(e.ptr)){let t=n.wasm_malloc(4),r=n.wasm_malloc(4),i=n.wasm_malloc(4),a=n.qjs_get_typed_array_buffer(e.ptr,t,r,i),o=new T(this,a);if(n.qjs_is_exception(o.ptr)===0){let e=new DataView(n.memory.buffer),a=e.getUint32(t,!0),s=e.getUint32(r,!0),c=e.getUint32(i,!0);n.wasm_free(t),n.wasm_free(r),n.wasm_free(i);let l=n.wasm_malloc(4),u=n.qjs_get_array_buffer(o.ptr,l);if(n.wasm_free(l),o.dispose(),u!==0){let e=new Uint8Array(n.memory.buffer,u+a,s).slice();switch(c){case 1:return e;case 2:return new Uint16Array(e.buffer);case 4:return new Uint32Array(e.buffer);case 8:return new Float64Array(e.buffer);default:return e}}}else o.dispose(),n.wasm_free(t),n.wasm_free(r),n.wasm_free(i)}if(n.qjs_is_array(e.ptr)){let r=e.getProp(`length`),i=n.qjs_get_float64(r.ptr);r.dispose();let a=[],o=n.qjs_get_value_ptr(e.ptr);o&&t.set(o,a);for(let r=0;r<i;r++){let i=n.qjs_get_prop_uint32(e.ptr,r),o=new T(this,i);a.push(this._dump(o,t)),o.dispose()}return a}if(n.qjs_is_error(e.ptr)){let t=e.getProp(`name`),n=e.getProp(`message`),r=e.getProp(`stack`),i=t.isUndefined?`Error`:t.toString(),a=n.isUndefined?``:n.toString(),o=r.isUndefined?void 0:r.toString();t.dispose(),n.dispose(),r.dispose();let s=Error(a);return s.name=i,o!==void 0&&(s.stack=o),s}if(n.qjs_is_object(e.ptr)){let r=n.qjs_get_own_property_names(e.ptr),i=new T(this,r);if(n.qjs_is_exception(i.ptr)!==0)return i.dispose(),{};let a=i.getProp(`length`),o=n.qjs_get_float64(a.ptr);a.dispose();let s={},c=n.qjs_get_value_ptr(e.ptr);c&&t.set(c,s);for(let r=0;r<o;r++){let a=n.qjs_get_prop_uint32(i.ptr,r),o=new T(this,a),c=o.toString();o.dispose();let l=e.getProp(c);s[c]=this._dump(l,t),l.dispose()}return i.dispose(),s}}}}hostToHandle(e){if(this.assertNotDisposed(),e===void 0)return this.undefined;if(e===null)return this.null;if(e===!0)return this.true;if(e===!1)return this.false;if(typeof e==`number`)return this.newNumber(e);if(typeof e==`string`)return this.newString(e);if(typeof e==`bigint`)return this.newBigInt(e);if(typeof e==`symbol`){let t=Symbol.keyFor(e);if(t!==void 0)return this.newSymbolFor(t);throw Error(`Cannot convert local symbol to QuickJS handle. Use Symbol.for() for cross-boundary symbols.`)}if(e instanceof Promise){let t=this.newPromise();return e.then(e=>{t.resolve(this.hostToHandle(e)),this.executePendingJobs()},e=>{t.reject(this.hostToHandle(e)),this.executePendingJobs()}),t.handle}if(e instanceof Error)return this.newError(e);if(e instanceof ArrayBuffer)return this.newArrayBuffer(e);if(e instanceof Uint8Array)return this.newUint8Array(e);if(ArrayBuffer.isView(e))return this.newArrayBuffer(new Uint8Array(e.buffer,e.byteOffset,e.byteLength));if(Array.isArray(e)){let t=this.newArray();for(let n=0;n<e.length;n++){let r=this.hostToHandle(e[n]);this.exports.qjs_set_prop_uint32(t.ptr,n,r.ptr),r.dispose()}return t}if(typeof e==`object`&&e){let t=this.newObject();for(let[n,r]of Object.entries(e)){let e=this.hostToHandle(r);t.setProp(n,e),e.dispose()}return t}return this.undefined}snapshot(){return this.assertNotDisposed(),{memory:new Uint8Array(this.exports.memory.buffer).slice(),stackPointer:this.exports.__stack_pointer.value,runtimePtr:this.exports.qjs_get_runtime_ptr(),contextPtr:this.exports.qjs_get_context_ptr(),extensions:this.loadedExtensions.map(e=>({name:e.name,memoryBase:e.memoryBase,tableBase:e.tableBase,initFn:e.initFn}))}}registerHostCallback(e,t){this.hostCallbacks.set(e,t)}dispose(){this.disposed||(this.disposed=!0,this._global=null,this._undefined=null,this._null=null,this._true=null,this._false=null,this._ownedHandles.clear(),this.hostCallbacks.clear(),this._activeScope=null,this.exports=null,this.instance=null,this.module=null)}[Symbol.dispose](){this.dispose()}assertNotDisposed(){if(this.disposed)throw Error(`QuickJS instance has been disposed`)}_getExports(){return this.exports}_getMemory(){return this.exports.memory}_writeString(e){return this.writeString(e)}_readCString(e){return this.readCString(e)}};function v(e){return e.includes(`\0`)||x.test(e)}const y=new TextDecoder,b=new TextEncoder,x=/(?:[\uD800-\uDBFF](?![\uDC00-\uDFFF]))|(?:(?<![\uD800-\uDBFF])[\uDC00-\uDFFF])/;function S(e){if(!x.test(e))return b.encode(e);let t=[];for(let n=0;n<e.length;n++){let r=e.charCodeAt(n);if(r<128)t.push(r);else if(r<2048)t.push(192|r>>6,128|r&63);else if(r>=55296&&r<=56319&&n+1<e.length){let i=e.charCodeAt(n+1);if(i>=56320&&i<=57343){let e=65536+(r-55296<<10)+(i-56320);t.push(240|e>>18,128|e>>12&63,128|e>>6&63,128|e&63),n++;continue}t.push(224|r>>12,128|r>>6&63,128|r&63)}else t.push(224|r>>12,128|r>>6&63,128|r&63)}return new Uint8Array(t)}function C(e){let t=!1;for(let n=0;n<e.length-1;n++)if(e[n]===237&&e[n+1]>=160&&e[n+1]<=191){t=!0;break}if(!t)return y.decode(e);let n=``,r=0;for(;r<e.length;){let t=e[r];if(t<128)n+=String.fromCharCode(t),r+=1;else if(t<224)n+=String.fromCharCode((t&31)<<6|e[r+1]&63),r+=2;else if(t<240)n+=String.fromCharCode((t&15)<<12|(e[r+1]&63)<<6|e[r+2]&63),r+=3;else{let i=(t&7)<<18|(e[r+1]&63)<<12|(e[r+2]&63)<<6|e[r+3]&63;n+=String.fromCodePoint(i),r+=4}}return n}var w=class extends Error{handle;#e;#t;#n;constructor(e){let t={stack:[],error:void 0,hasError:!1};try{super(),this.handle=e,delete this.stack;let n=p(t,e.getProp(`message`),!1);this.#e=e.getProp(`name`).consume(e=>e.isUndefined?`Error`:e.toString()),this.#t=n.isUndefined?e.toString():n.toString(),this.#n=e.getProp(`stack`).consume(e=>e.isUndefined?void 0:e.toString())}catch(e){t.error=e,t.hasError=!0}finally{m(t)}}get name(){return this.#e}set name(e){this.#e=e}get message(){return this.#t}set message(e){this.#t=e}get stack(){return this.#n}set stack(e){this.#n=e}dispose(){this.handle.dispose()}[Symbol.dispose](){this.handle.dispose()}},T=class e{vm;ptr;disposed_=!1;singleton;borrowed;_onDispose;constructor(e,t,n=!1,r=!1){this.vm=e,this.ptr=t,this.singleton=n,this.borrowed=r,!n&&!r&&e._activeScope?.add(this)}get _isBorrowed(){return this.borrowed}get disposed(){return this.disposed_}get isUndefined(){return this.vm._getExports().qjs_is_undefined(this.ptr)!==0}get isNull(){return this.vm._getExports().qjs_is_null(this.ptr)!==0}get isBool(){return this.vm._getExports().qjs_is_bool(this.ptr)!==0}get isNumber(){return this.vm._getExports().qjs_is_number(this.ptr)!==0}get isString(){return this.vm._getExports().qjs_is_string(this.ptr)!==0}get isSymbol(){return this.vm._getExports().qjs_is_symbol(this.ptr)!==0}get isBigInt(){return this.vm._getExports().qjs_is_big_int(this.ptr)!==0}get isObject(){return this.vm._getExports().qjs_is_object(this.ptr)!==0}get isArray(){return this.vm._getExports().qjs_is_array(this.ptr)!==0}get isFunction(){return this.vm._getExports().qjs_is_function(this.ptr)!==0}get isError(){return this.vm._getExports().qjs_is_error(this.ptr)!==0}get isPromise(){return this.vm._getExports().qjs_is_promise(this.ptr)!==0}get isArrayBuffer(){return this.vm._getExports().qjs_is_array_buffer(this.ptr)!==0}get isProxy(){return this.vm._getExports().qjs_is_proxy(this.ptr)!==0}get isMap(){return this.vm._getExports().qjs_is_map(this.ptr)!==0}get isSet(){return this.vm._getExports().qjs_is_set(this.ptr)!==0}get isDate(){return this.vm._getExports().qjs_is_date(this.ptr)!==0}get isRegExp(){return this.vm._getExports().qjs_is_regexp(this.ptr)!==0}get isWeakRef(){return this.vm._getExports().qjs_is_weak_ref(this.ptr)!==0}get isWeakMap(){return this.vm._getExports().qjs_is_weak_map(this.ptr)!==0}get isWeakSet(){return this.vm._getExports().qjs_is_weak_set(this.ptr)!==0}get isDataView(){return this.vm._getExports().qjs_is_data_view(this.ptr)!==0}get identity(){return this.vm._getExports().qjs_get_value_ptr(this.ptr)}toBoolean(){return this.vm._getExports().qjs_get_bool(this.ptr)!==0}get classId(){return this.vm._getExports().qjs_get_class_id(this.ptr)}get className(){let t=new e(this.vm,this.vm._getExports().qjs_get_class_name(this.ptr));if(this.vm._getExports().qjs_is_exception(t.ptr)!==0)throw t.dispose(),new w(this.vm.getException());try{return t.isUndefined?void 0:t.toString()}finally{t.dispose()}}get promiseState(){return this.vm._getExports().qjs_promise_state(this.ptr)}get typeof(){return this.vm.typeof(this)}get length(){let e=this.getProp(`length`),t=e.toNumber();return e.dispose(),t}get constructorName(){let e=this.getProp(`constructor`);if(e.isUndefined||e.isNull){e.dispose();return}let t=e.getProp(`name`);if(e.dispose(),t.isUndefined||t.isNull){t.dispose();return}let n=t.toString();return t.dispose(),n}keys(){let t=this.vm._getExports(),n=t.qjs_get_own_property_names(this.ptr),r=new e(this.vm,n);if(t.qjs_is_exception(r.ptr)!==0)return r.dispose(),[];let i=r.getProp(`length`),a=t.qjs_get_float64(i.ptr);i.dispose();let o=[];for(let n=0;n<a;n++){let i=t.qjs_get_prop_uint32(r.ptr,n),a=new e(this.vm,i);o.push(a.toString()),a.dispose()}return r.dispose(),o}getOwnPropertyNames(){let t=this.vm._getExports(),n=t.qjs_get_own_property_names_all(this.ptr),r=new e(this.vm,n);if(t.qjs_is_exception(r.ptr)!==0)return r.dispose(),[];let i=r.getProp(`length`),a=t.qjs_get_float64(i.ptr);i.dispose();let o=[];for(let n=0;n<a;n++){let i=t.qjs_get_prop_uint32(r.ptr,n),a=new e(this.vm,i);o.push(a.toString()),a.dispose()}return r.dispose(),o}getOwnPropertyKeys(){let t=this.vm._getExports(),n=t.qjs_get_own_property_keys(this.ptr),r=new e(this.vm,n);if(t.qjs_is_exception(r.ptr)!==0)return r.dispose(),[];let i=r.getProp(`length`),a=t.qjs_get_float64(i.ptr);i.dispose();let o=[];for(let n=0;n<a;n++){let i=t.qjs_get_prop_uint32(r.ptr,n),a=new e(this.vm,i);a.isSymbol?o.push(a):(o.push(a.toString()),a.dispose())}return r.dispose(),o}getOwnPropertyDescriptor(t){let n={stack:[],error:void 0,hasError:!1};try{let r=this.vm._getExports(),i,a;typeof t==`string`?(i=this.vm.newString(t),a=i.ptr):a=t.ptr;let o=r.qjs_get_own_property_descriptor(this.ptr,a);if(i?.dispose(),o===0)return;let s=p(n,new e(this.vm,o),!1);if(r.qjs_is_exception(s.ptr)!==0)throw new w(this.vm.getException());let c=s.getProp(`enumerable`).consume(e=>r.qjs_get_bool(e.ptr)!==0),l=s.getProp(`configurable`).consume(e=>r.qjs_get_bool(e.ptr)!==0);return s.hasOwnProperty(`value`)?{value:s.getProp(`value`),writable:s.getProp(`writable`).consume(e=>r.qjs_get_bool(e.ptr)!==0),enumerable:c,configurable:l}:{get:s.getProp(`get`),set:s.getProp(`set`),enumerable:c,configurable:l}}catch(e){n.error=e,n.hasError=!0}finally{m(n)}}hasOwnProperty(e){if(v(e)){let t={stack:[],error:void 0,hasError:!1};try{let n=p(t,this.vm.newString(e),!1);return this.vm._getExports().qjs_has_own_property_value(this.ptr,n.ptr)===1}catch(e){t.error=e,t.hasError=!0}finally{m(t)}}let{ptr:t}=this.vm._writeString(e),n=this.vm._getExports().qjs_has_own_property(this.ptr,t);return this.vm._getExports().wasm_free(t),n===1}propertyIsEnumerable(e){if(v(e)){let t={stack:[],error:void 0,hasError:!1};try{let n=p(t,this.vm.newString(e),!1);return this.vm._getExports().qjs_property_is_enumerable_value(this.ptr,n.ptr)===1}catch(e){t.error=e,t.hasError=!0}finally{m(t)}}let{ptr:t}=this.vm._writeString(e),n=this.vm._getExports().qjs_property_is_enumerable(this.ptr,t);return this.vm._getExports().wasm_free(t),n===1}getPrototypeOf(){let t=this.vm._getExports().qjs_get_prototype_of(this.ptr);return new e(this.vm,t)}getProxyTarget(){let t=this.vm._getExports().qjs_get_proxy_target(this.ptr),n=new e(this.vm,t);if(this.vm._getExports().qjs_is_exception(n.ptr)!==0)throw n.dispose(),new w(this.vm.getException());return n}getProxyHandler(){let t=this.vm._getExports().qjs_get_proxy_handler(this.ptr),n=new e(this.vm,t);if(this.vm._getExports().qjs_is_exception(n.ptr)!==0)throw n.dispose(),new w(this.vm.getException());return n}getProp(t){if(v(t)){let e={stack:[],error:void 0,hasError:!1};try{let n=p(e,this.vm.newString(t),!1);return this.vm.getProp(this,n)}catch(t){e.error=t,e.hasError=!0}finally{m(e)}}let{ptr:n}=this.vm._writeString(t),r=this.vm._getExports().qjs_get_prop_string(this.ptr,n);return this.vm._getExports().wasm_free(n),new e(this.vm,r)}setProp(e,t){if(v(e)){let n={stack:[],error:void 0,hasError:!1};try{let r=p(n,this.vm.newString(e),!1);this.vm.setProp(this,r,t);return}catch(e){n.error=e,n.hasError=!0}finally{m(n)}}let{ptr:n}=this.vm._writeString(e);this.vm._getExports().qjs_set_prop_string(this.ptr,n,t.ptr),this.vm._getExports().wasm_free(n)}defineProp(e,t,n){let r=0;if(n?.configurable&&(r|=1),n?.writable&&(r|=2),n?.enumerable&&(r|=4),typeof e==`string`){if(v(e)){let n={stack:[],error:void 0,hasError:!1};try{let i=p(n,this.vm.newString(e),!1);this.vm._getExports().qjs_define_prop_value(this.ptr,i.ptr,t.ptr,r);return}catch(e){n.error=e,n.hasError=!0}finally{m(n)}}let{ptr:n}=this.vm._writeString(e);this.vm._getExports().qjs_define_prop_string(this.ptr,n,t.ptr,r),this.vm._getExports().wasm_free(n)}else this.vm._getExports().qjs_define_prop_value(this.ptr,e.ptr,t.ptr,r)}toNumber(){return this.vm._getExports().qjs_get_float64(this.ptr)}toBigInt(){let e=this.vm._getExports(),t=e.wasm_malloc(4),n=e.wasm_malloc(4);if(e.qjs_get_big_int64(this.ptr,t,n)!==0)throw e.wasm_free(t),e.wasm_free(n),Error(`Failed to convert value to BigInt`);let r=new DataView(e.memory.buffer),i=r.getUint32(t,!0),a=r.getInt32(n,!0);return e.wasm_free(t),e.wasm_free(n),BigInt(a)<<32n|BigInt(i)}toArrayBuffer(){let t=this.vm._getExports(),n=t.wasm_malloc(4);if(t.qjs_is_array_buffer(this.ptr)){let e=t.qjs_get_array_buffer(this.ptr,n);if(e===0)throw t.wasm_free(n),Error(`Failed to get ArrayBuffer data`);let r=new DataView(t.memory.buffer).getUint32(n,!0);return t.wasm_free(n),new Uint8Array(t.memory.buffer,e,r).slice().buffer}t.wasm_free(n);let r=t.wasm_malloc(4),i=t.wasm_malloc(4),a=t.wasm_malloc(4),o=t.qjs_get_typed_array_buffer(this.ptr,r,i,a),s=new e(this.vm,o);if(this.vm._getExports().qjs_is_exception(s.ptr)!==0)throw s.dispose(),t.wasm_free(r),t.wasm_free(i),t.wasm_free(a),Error(`Value is not an ArrayBuffer or typed array`);let c=new DataView(t.memory.buffer),l=c.getUint32(r,!0),u=c.getUint32(i,!0);t.wasm_free(r),t.wasm_free(i),t.wasm_free(a);let d=t.wasm_malloc(4),f=t.qjs_get_array_buffer(s.ptr,d);if(t.wasm_free(d),s.dispose(),f===0)throw Error(`Failed to get ArrayBuffer data from typed array`);return new Uint8Array(t.memory.buffer,f+l,u).slice().buffer}toUint8Array(){return new Uint8Array(this.toArrayBuffer())}toString(){let e=this.vm._getExports(),t=e.wasm_malloc(4);if(t===0)throw Error(`wasm_malloc failed`);try{let n=e.qjs_get_string_len(this.ptr,t);if(n===0)return`<null>`;let r=new DataView(e.memory.buffer).getUint32(t,!0),i=C(new Uint8Array(e.memory.buffer,n,r));return e.qjs_free_cstring(n),i}finally{e.wasm_free(t)}}consume(e){try{return e(this)}finally{this.dispose()}}dup(){return new e(this.vm,this.vm._getExports().qjs_dup_value(this.ptr))}dispose(){if(!(this.singleton||this.borrowed)&&!this.disposed_){this.disposed_=!0,this._onDispose?.(),this._onDispose=void 0;let e=this.vm._getExports();e&&e.qjs_free_value(this.ptr)}}[Symbol.dispose](){this.dispose()}};function E(e){n?.postMessage(e)}function D(e){E({type:`crash`,message:e instanceof Error?`${e.name}: ${e.message}`:String(e)})}function O(e){return{fd_write(t,n,r,i){let a=new DataView(e.buffer),o=0;for(let e=0;e<r;e++)o+=a.getUint32(n+e*8+4,!0);return a.setUint32(i,o,!0),0}}}function k(e){let t=e.message?`${e.name}: ${e.message}`:e.name,n=e.stack?.trimEnd();return JSON.stringify({name:e.name,message:e.message,stack:n?`${t}\n${n}`:t})}async function A(r){let i=new Int32Array(r.interrupt),a=await _.create({wasm:r.wasm,memoryLimit:r.memoryLimitBytes,maxStackSize:h,interruptHandler:()=>Atomics.load(i,0)!==0,wasi:O}),o=a.newFunction(`bridge`,(e,t,n,r)=>{switch(e.toString()){case`call`:case`global`:E({type:`call`,id:t.toNumber(),target:e.toString()===`call`?`tool`:`global`,name:n.toString(),args:r===void 0||r.isUndefined?void 0:r.toString()});break;case`output`:E({type:`output`,item:t.toString()===`image`?{type:`image`,data:n.toString(),mimeType:r.toString()}:{type:`text`,text:n.toString()}});break;case`done`:t.toBoolean()?E({type:`done`,ok:!0,value:n===void 0||n.isUndefined?void 0:n.toString(),writes:r.toString()}):E({type:`done`,ok:!1,error:n.toString()});break}return a.undefined}),s=a.withScope(t=>t.escape(a.callFunction(a.evalCode(e,`codemode-prelude.js`),a.undefined,o,a.newString(JSON.stringify(r.tools)),a.newString(JSON.stringify(r.globals)),a.newString(JSON.stringify(r.store))))),c=s.getProp(`settle`),l=s.getProp(`run`),u=s.getProp(`stalled`),d=()=>{a.executePendingJobs(),a.callFunction(u,s).dispose()};n?.on(`message`,e=>{if(t(e))try{a.withScope(()=>{a.callFunction(c,s,a.newNumber(e.id),e.ok?a.true:a.false,e.payload===void 0?a.undefined:a.newString(e.payload))}),d()}catch(e){D(e)}});let f;try{f=a.evalCode(`(async (tools, console) => {${r.code}\n})`,`codemode.js`)}catch(e){if(!(e instanceof w))throw e;E({type:`done`,ok:!1,error:k(e)});return}a.callFunction(l,s,f).dispose(),f.dispose(),d()}n&&A(r).catch(D);export{};
|
|
2
|
+
import{r as e,t}from"./protocol-WkPByalT.mjs";import{parentPort as n,workerData as r}from"node:worker_threads";function i(e){return{clock_time_get(t,n,r){let i=e(),a=new DataView(i.buffer);if(t===0||t===1){let e=BigInt(Date.now())*1000000n;return a.setBigUint64(r,e,!0),0}return 52},fd_write(t,n,r,i){let a=e(),o=new DataView(a.buffer),s=new Uint8Array(a.buffer),c=0;if(t!==1&&t!==2)return 8;for(let e=0;e<r;e++){let r=o.getUint32(n+e*8,!0),i=o.getUint32(n+e*8+4,!0),a=s.slice(r,r+i),l=new TextDecoder().decode(a);t===1?typeof process<`u`&&process.stdout?process.stdout.write(l):console.log(l):typeof process<`u`&&process.stderr?process.stderr.write(l):console.error(l),c+=i}return o.setUint32(i,c,!0),0},fd_close(e){return 52},fd_fdstat_get(t,n){let r=e(),i=new DataView(r.buffer);return t===1||t===2?(i.setUint8(n,2),i.setUint16(n+2,0,!0),i.setBigUint64(n+8,0n,!0),i.setBigUint64(n+16,0n,!0),0):8},fd_seek(e,t,n,r){return 52},random_get(t,n){let r=e(),i=new Uint8Array(r.buffer,t,n);if(typeof crypto<`u`&&crypto.getRandomValues)crypto.getRandomValues(i);else for(let e=0;e<n;e++)i[e]=Math.floor(Math.random()*256);return 0}}}const a=new TextDecoder;function o(e,t){let n=new Uint8Array(e.buffer),r=t;for(;n[r]!==0;)r++;if(r===t)return{};let i=a.decode(n.slice(t,r)),o={};for(let e of i.split(`
|
|
3
|
+
`)){let t=e.indexOf(`=`);t>0&&(o[e.slice(0,t)]=e.slice(t+1))}return o}function s(e,t){let n=`qjs_ext_${e.name.replace(/-/g,`_`)}_versions`,r=e.instance.exports[n];if(typeof r!=`function`)return;let i=r();if(i!==0)return o(t,i)}function c(e,t){let n=0,r=0;for(;t.value<e.length;){let i=e[t.value++];if(n|=(i&127)<<r,!(i&128))break;r+=7}return n}function l(e){let t=WebAssembly.Module.customSections(e,`dylink.0`);if(t.length===0)return null;let n=new Uint8Array(t[0]),r={value:0},i={memorySize:0,memoryAlignment:0,tableSize:0,tableAlignment:0,needed:[]};for(;r.value<n.length;){let e=c(n,r),t=c(n,r),a=r.value+t;if(e===1)i.memorySize=c(n,r),i.memoryAlignment=c(n,r),i.tableSize=c(n,r),i.tableAlignment=c(n,r);else if(e===2){let e=c(n,r);for(let t=0;t<e;t++){let e=c(n,r),t=new TextDecoder().decode(n.slice(r.value,r.value+e));r.value+=e,i.needed.push(t)}}r.value=a}return i}async function u(e,t,n,r,i,a){let o;o=e.wasm instanceof WebAssembly.Module?e.wasm:await WebAssembly.compile(e.wasm);let c=l(o);if(!c)throw Error(`Extension "${e.name}" is not a WASM shared library (missing dylink.0 section)`);let u=t.memory,d=t.__indirect_function_table,f=t.__stack_pointer,p=t.malloc;if(!u)throw Error(`Main module does not export memory`);if(!d)throw Error(`Main module does not export __indirect_function_table`);if(!p)throw Error(`Main module does not export malloc`);let m,h;if(a)m=a.memoryBase,h=a.tableBase;else if(c.memorySize>0){if(m=p(c.memorySize),m===0)throw Error(`Failed to allocate ${c.memorySize} bytes for extension "${e.name}"`);new Uint8Array(u.buffer,m,c.memorySize).fill(0)}else m=0;a?(h=a.tableBase,h+c.tableSize>d.length&&d.grow(h+c.tableSize-d.length)):(h=d.length,c.tableSize>0&&d.grow(c.tableSize));let g=WebAssembly.Module.imports(o),_={env:{},"GOT.mem":{},"GOT.func":{}};if(g.some(e=>e.module===`wasi_snapshot_preview1`)){let t=e.wasi&&i?e.wasi(i):void 0;_.wasi_snapshot_preview1={...n,...t,...r}}let v=new Set(WebAssembly.Module.exports(o).filter(e=>e.kind===`function`).map(e=>e.name)),y=new Set;for(let n of g)if(n.module===`env`){if(n.name===`memory`&&n.kind===`memory`)_.env.memory=u;else if(n.name===`__indirect_function_table`&&n.kind===`table`)_.env.__indirect_function_table=d;else if(n.name===`__memory_base`&&n.kind===`global`)_.env.__memory_base=new WebAssembly.Global({value:`i32`,mutable:!1},m);else if(n.name===`__table_base`&&n.kind===`global`)_.env.__table_base=new WebAssembly.Global({value:`i32`,mutable:!1},h);else if(n.name===`__stack_pointer`&&n.kind===`global`)_.env.__stack_pointer=f;else if(n.kind===`function`){let r=t[n.name];r&&typeof r==`function`?_.env[n.name]=r:(y.add(n.name),_.env[n.name]=()=>{throw Error(`Extension "${e.name}" called unresolved symbol: env.${n.name}`)})}else if(n.kind===`global`){let e=t[n.name];e instanceof WebAssembly.Global?_.env[n.name]=e:_.env[n.name]=new WebAssembly.Global({value:`i32`,mutable:!0},0)}}else if(n.module===`GOT.mem`&&n.kind===`global`)_[`GOT.mem`][n.name]=new WebAssembly.Global({value:`i32`,mutable:!0},0);else if(n.module===`GOT.func`&&n.kind===`global`){let e=t[n.name];if(e&&typeof e==`function`){let t=d.length;d.grow(1),d.set(t,e),_[`GOT.func`][n.name]=new WebAssembly.Global({value:`i32`,mutable:!0},t)}else _[`GOT.func`][n.name]=new WebAssembly.Global({value:`i32`,mutable:!0},0)}let b=[...y].filter(e=>v.has(e)),x={};for(let t of b){let n={target:null};x[t]=n,_.env[t]=(...r)=>{if(!n.target)throw Error(`Extension "${e.name}" called unresolved symbol during init: env.${t}`);return n.target(...r)}}let S=await WebAssembly.instantiate(o,_),C=S.exports;for(let e of b){let t=C[e];typeof t==`function`&&(x[e].target=t)}typeof C.__wasm_apply_data_relocs==`function`&&C.__wasm_apply_data_relocs(),typeof C.__wasm_call_ctors==`function`&&C.__wasm_call_ctors();let w=e.initFn??`qjs_ext_${e.name.replace(/-/g,`_`)}_init`,T={name:e.name,module:o,instance:S,dylink:c,memoryBase:m,tableBase:h,initFn:w};return T.versions=s(T,u),T}function d(e,t){let n=e.instance.exports[e.initFn];if(typeof n!=`function`)throw Error(`Extension "${e.name}" does not export init function "${e.initFn}"`);let r=n(t.qjs_get_context_ptr(),t.qjs_get_runtime_ptr());if(r!==0)throw Error(`Extension "${e.name}" init function returned error code ${r}`)}async function f(e,t,n,r,i,a){let o=[];for(let s of t){let t=e.find(e=>e.name===s.name);if(!t)throw Error(`Extension "${s.name}" required by snapshot but not provided`);let c=await u(t,n,r,i,a,{memoryBase:s.memoryBase,tableBase:s.tableBase});c.initFn=s.initFn,o.push(c)}return o}var p=function(e,t,n){if(t!=null){if(typeof t!=`object`&&typeof t!=`function`)throw TypeError(`Object expected.`);var r,i;if(n){if(!Symbol.asyncDispose)throw TypeError(`Symbol.asyncDispose is not defined.`);r=t[Symbol.asyncDispose]}if(r===void 0){if(!Symbol.dispose)throw TypeError(`Symbol.dispose is not defined.`);r=t[Symbol.dispose],n&&(i=r)}if(typeof r!=`function`)throw TypeError(`Object not disposable.`);i&&(r=function(){try{i.call(this)}catch(e){return Promise.reject(e)}}),e.stack.push({value:t,dispose:r,async:n})}else n&&e.stack.push({async:!0});return t},m=(function(e){return function(t){function n(n){t.error=t.hasError?new e(n,t.error,`An error was suppressed during disposal.`):n,t.hasError=!0}var r,i=0;function a(){for(;r=t.stack.pop();)try{if(!r.async&&i===1)return i=0,t.stack.push(r),Promise.resolve().then(a);if(r.dispose){var e=r.dispose.call(r.value);if(r.async)return i|=2,Promise.resolve(e).then(a,function(e){return n(e),a()})}else i|=1}catch(e){n(e)}if(i===1)return t.hasError?Promise.reject(t.error):Promise.resolve();if(t.hasError)throw t.error}return a()}})(typeof SuppressedError==`function`?SuppressedError:function(e,t,n){var r=Error(n);return r.name=`SuppressedError`,r.error=e,r.suppressed=t,r});const h=512*1024,g=1363825491;var _=class e{exports;module;instance;encoder=new TextEncoder;decoder=new TextDecoder;disposed=!1;hostCallbacks=new Map;nextInternalId=1;interruptHandler=null;unhandledRejectionHandler=null;moduleNormalizeHandler=null;moduleLoadHandler=null;timezoneOffsetHandler=null;_global=null;_versions=null;_undefined=null;_null=null;_true=null;_false=null;_ownedHandles=new Set;_activeScope=null;loadedExtensions=[];constructor(e){this.module=e,this.instance=null,this.exports=null}setInstance(e){this.instance=e,this.exports=e.exports}get versions(){if(this.assertNotDisposed(),!this._versions){let e={"quickjs-wasi":`3.6.2`,quickjs:this.readCString(this.exports.qjs_get_quickjs_version())};for(let t of this.loadedExtensions)t.versions&&Object.assign(e,t.versions);this._versions=e}return this._versions}get global(){return this._global||=new T(this,this.exports.qjs_get_global(),!0),this._global}get undefined(){return this._undefined||=new T(this,this.exports.qjs_get_undefined(),!0),this._undefined}get null(){return this._null||=new T(this,this.exports.qjs_get_null(),!0),this._null}get true(){return this._true||=new T(this,this.exports.qjs_get_true(),!0),this._true}get false(){return this._false||=new T(this,this.exports.qjs_get_false(),!0),this._false}static async create(t){let n=e.normalizeOptions(t),r=await e.resolveModule(n.wasm),i=new e(r),{instance:a,wasiBuiltins:o,wasiUserOverrides:s,memoryProxy:c}=await e.instantiate(r,i,n.wasi);if(i.setInstance(a),i.exports._initialize(),(n.intrinsics===void 0?i.exports.qjs_init():i.exports.qjs_init2(n.intrinsics))!==0)throw Error(`Failed to initialize QuickJS runtime`);if(n.extensions){let e=a.exports;for(let t of n.extensions){let n=await u(t,e,o,s,c);i.loadedExtensions.push(n),d(n,e)}}return e.applyLimits(i,n),i}static async restore(t,n){let r=e.normalizeOptions(n),i=await e.resolveModule(r.wasm),a=new e(i),{instance:o,wasiBuiltins:s,wasiUserOverrides:c,memoryProxy:l}=await e.instantiate(i,a,r.wasi);a.setInstance(o);let u=o.exports,d=a.exports.memory,p=d.buffer.byteLength/65536,m=Math.ceil(t.memory.byteLength/65536);return m>p&&d.grow(m-p),t.extensions.length>0&&(a.loadedExtensions=await f(r.extensions??[],t.extensions,u,s,c,l)),new Uint8Array(d.buffer).set(t.memory),a.exports.qjs_set_runtime_and_context(t.runtimePtr,t.contextPtr),a.exports.__stack_pointer.value=t.stackPointer,e.applyLimits(a,r),a}static serializeSnapshot(e){let t=new TextEncoder,n=4,r=[],i=[];for(let a of e.extensions){let e=t.encode(a.name),o=t.encode(a.initFn);r.push(e),i.push(o),n+=4+e.length+4+4+4+o.length}let a=24+n+e.memory.byteLength,o=new ArrayBuffer(a),s=new DataView(o),c=new Uint8Array(o);s.setUint32(0,g,!1),s.setUint8(4,2),s.setUint32(8,e.memory.byteLength,!0),s.setUint32(12,e.stackPointer,!0),s.setUint32(16,e.runtimePtr,!0),s.setUint32(20,e.contextPtr,!0);let l=24;s.setUint32(l,e.extensions.length,!0),l+=4;for(let t=0;t<e.extensions.length;t++){let n=e.extensions[t],a=r[t],o=i[t];s.setUint32(l,a.length,!0),l+=4,c.set(a,l),l+=a.length,s.setUint32(l,n.memoryBase,!0),l+=4,s.setUint32(l,n.tableBase,!0),l+=4,s.setUint32(l,o.length,!0),l+=4,c.set(o,l),l+=o.length}return c.set(e.memory,l),c}static deserializeSnapshot(e){if(e.length<24)throw Error(`Invalid snapshot: too small`);let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=t.getUint32(0,!1);if(n!==g)throw Error(`Invalid snapshot: bad magic (expected 0x${g.toString(16)}, got 0x${n.toString(16)})`);let r=t.getUint8(4);if(r!==2&&r!==1)throw Error(`Unsupported snapshot version: ${r} (expected 2)`);let i=t.getUint32(8,!0),a=t.getUint32(12,!0),o=t.getUint32(16,!0),s=t.getUint32(20,!0),c=[],l=24;if(r>=2){let n=t.getUint32(24,!0),r=28,i=new TextDecoder;for(let a=0;a<n;a++){let n=t.getUint32(r,!0);r+=4;let a=i.decode(e.slice(r,r+n));r+=n;let o=t.getUint32(r,!0);r+=4;let s=t.getUint32(r,!0);r+=4;let l=t.getUint32(r,!0);r+=4;let u=i.decode(e.slice(r,r+l));r+=l,c.push({name:a,memoryBase:o,tableBase:s,initFn:u})}l=r}let u=l+i;if(e.length<u)throw Error(`Invalid snapshot: expected ${u} bytes, got ${e.length}`);return{memory:e.slice(l,l+i),stackPointer:a,runtimePtr:o,contextPtr:s,extensions:c}}static normalizeOptions(e){if(!e)return{wasm:void 0};if(e instanceof WebAssembly.Module)return{wasm:e};if(typeof e==`object`&&(`wasm`in e||`wasi`in e||`memoryLimit`in e||`maxStackSize`in e||`interruptHandler`in e||`onUnhandledRejection`in e||`moduleLoader`in e||`intrinsics`in e||`extensions`in e||`timezoneOffset`in e)){let t=e;if(t.maxStackSize!==void 0&&(!Number.isInteger(t.maxStackSize)||t.maxStackSize<0||t.maxStackSize>524288))throw RangeError(`maxStackSize must be an integer between 0 and ${h}`);return t}return{wasm:e}}static applyLimits(e,t){t.memoryLimit!==void 0&&e.exports.qjs_set_memory_limit(t.memoryLimit),t.maxStackSize!==void 0&&e.exports.qjs_set_max_stack_size(t.maxStackSize),t.interruptHandler&&(e.interruptHandler=t.interruptHandler,e.exports.qjs_set_interrupt_handler(1)),t.onUnhandledRejection&&(e.unhandledRejectionHandler=t.onUnhandledRejection,e.exports.qjs_set_promise_rejection_handler(1)),t.moduleLoader&&(e.moduleLoadHandler=t.moduleLoader.load,e.moduleNormalizeHandler=t.moduleLoader.normalize??null,e.exports.qjs_set_module_loader(1));let n=t.timezoneOffset;if(typeof n==`function`)e.timezoneOffsetHandler=e=>-n(e)*60;else if(typeof n==`number`){let t=-n*60;e.timezoneOffsetHandler=()=>t}else e.timezoneOffsetHandler=e=>-new Date(e*1e3).getTimezoneOffset()*60}static async resolveModule(e){if(e instanceof WebAssembly.Module)return e;if(e)return WebAssembly.compile(e);throw TypeError("QuickJS: `wasm` option is required. Provide WASM bytes or a compiled `WebAssembly.Module`. The binary is shipped at `quickjs-wasi/quickjs.wasm` and can be loaded via your environment's preferred mechanism (e.g. `fetch()`, `node:fs/promises`, or a bundler import like Vite's `?url`).")}static async instantiate(e,t,n){let r=null,a=new Proxy({},{get(e,t){return r[t]}}),o=i(()=>r),s=n?n(a):void 0,c={...o,...s},l=(e,n,r,i,a)=>t.handleHostCall(e,n,r,i,a),u=()=>t.interruptHandler?+!!t.interruptHandler():0,d=(e,n,r)=>{if(!t.unhandledRejectionHandler){t.exports.qjs_free_value(e),t.exports.qjs_free_value(n);return}let i=new T(t,e),a=new T(t,n);try{t.unhandledRejectionHandler(i,a,r!==0)}finally{i.dispose(),a.dispose()}},f=e=>{let n=t.newError(e instanceof Error?e:String(e));t.exports.qjs_throw(n.ptr),n.dispose()},p=(e,t)=>{if(typeof e==`string`)return e;let n=typeof e==`object`&&e&&typeof e.then==`function`?`a Promise`:`type ${typeof e}`;throw TypeError(`moduleLoader.${t} must synchronously return a string (got ${n}). Async module loading is not supported. Pre-fetch module sources instead (see the "ES Modules" section of the quickjs-wasi README).`)},m=await WebAssembly.instantiate(e,{env:{host_call:l,host_interrupt:u,host_promise_rejection:d,host_module_normalize:(e,n)=>{if(!t.moduleNormalizeHandler){let e=t.readCString(n);return t.writeString(e).ptr}let r=t.readCString(e),i=t.readCString(n);try{let e=p(t.moduleNormalizeHandler(r,i),`normalize`);return t.writeString(e).ptr}catch(e){return f(e),0}},host_module_load:(e,n)=>{if(!t.moduleLoadHandler)return 0;let r=t.readCString(e);try{let e=p(t.moduleLoadHandler(r),`load`),{ptr:i,len:a}=t.writeString(e);return new Uint32Array(t.exports.memory.buffer,n,1)[0]=a,i}catch(e){return f(e),0}},host_get_timezone_offset:(e,n)=>{let r=Number(BigInt(e)<<32n|BigInt(n>>>0));return t.timezoneOffsetHandler?t.timezoneOffsetHandler(r):0}},wasi_snapshot_preview1:c});return r=m.exports.memory,{instance:m,wasiBuiltins:o,wasiUserOverrides:s,memoryProxy:a}}handleHostCall(e,t,n,r,i){let a=this.decoder.decode(new Uint8Array(this.exports.memory.buffer,e,t)),o=this.hostCallbacks.get(a);if(!o){let e=this.newError(`Host callback "${a}" is not registered: it was unregistered, its ephemeral function handle was disposed, or it was never re-registered after a snapshot restore.`);return this.exports.qjs_throw(e.ptr),e.dispose(),0}let s=new T(this,n,!1,!0),c=[];if(r>0&&i!==0){let e=new DataView(this.exports.memory.buffer);for(let t=0;t<r;t++){let n=e.getUint32(i+t*4,!0);c.push(new T(this,n,!1,!0))}}try{let e=o.call(s,...c);return this.exports.qjs_dup_value(e.ptr)}catch(e){let t=this.newError(e instanceof Error?e:String(e));return this.exports.qjs_throw(t.ptr),t.dispose(),0}}writeString(e){let t=S(e),n=this.exports.wasm_malloc(t.length+1);if(n===0)throw Error(`wasm_malloc failed`);let r=new Uint8Array(this.exports.memory.buffer);return r.set(t,n),r[n+t.length]=0,{ptr:n,len:t.length}}readCString(e){let t=new Uint8Array(this.exports.memory.buffer),n=e;for(;t[n]!==0;)n++;return this.decoder.decode(t.slice(e,n))}throwIfException(e){if(this.exports.qjs_is_exception(e.ptr)!==0){let t=this.getException();throw e.dispose(),this._ownedHandles.add(t),new w(t)}return e}evalCode(e,t=`<eval>`,n=0){this.assertNotDisposed();let r=this.writeString(e),i=this.writeString(t),a=this.exports.qjs_eval(r.ptr,r.len,i.ptr,n);return this.exports.wasm_free(r.ptr),this.exports.wasm_free(i.ptr),this.throwIfException(new T(this,a))}compile(e,t=`<compile>`,n=0,r=0){this.assertNotDisposed();let i=this.writeString(e),a=this.writeString(t),o=this.exports.wasm_malloc(4),s=this.exports.qjs_compile(i.ptr,i.len,a.ptr,n,r,o);if(this.exports.wasm_free(i.ptr),this.exports.wasm_free(a.ptr),s===0){this.exports.wasm_free(o);let e=this.getException();throw Error(`Compilation error: ${e.toString()}`)}let c=new Uint32Array(this.exports.memory.buffer,o,1)[0];this.exports.wasm_free(o);let l=new Uint8Array(this.exports.memory.buffer,s,c).slice();return this.exports.wasm_free(s),l}evalBytecode(e){this.assertNotDisposed();let t=this.exports.wasm_malloc(e.byteLength);new Uint8Array(this.exports.memory.buffer,t,e.byteLength).set(e);let n=this.exports.qjs_eval_bytecode(t,e.byteLength);return this.exports.wasm_free(t),this.throwIfException(new T(this,n))}executePendingJobs(){this.assertNotDisposed();let e=0;for(;this.exports.qjs_is_job_pending();){if(this.exports.qjs_execute_pending_job()<0){let e=this.getException();throw Error(`Job execution error: ${e.toString()}`)}e++}return e}runGC(){this.assertNotDisposed(),this.exports.qjs_run_gc()}get gcThreshold(){return this.assertNotDisposed(),this.exports.qjs_get_gc_threshold()}set gcThreshold(e){this.assertNotDisposed(),this.exports.qjs_set_gc_threshold(e)}getMemoryUsage(){this.assertNotDisposed();let e=this.exports.wasm_malloc(208);this.exports.qjs_compute_memory_usage(e);let t=new BigInt64Array(this.exports.memory.buffer,e,26),n={mallocSize:Number(t[0]),mallocLimit:Number(t[1]),memoryUsedSize:Number(t[2]),mallocCount:Number(t[3]),memoryUsedCount:Number(t[4]),atomCount:Number(t[5]),atomSize:Number(t[6]),strCount:Number(t[7]),strSize:Number(t[8]),objCount:Number(t[9]),objSize:Number(t[10]),propCount:Number(t[11]),propSize:Number(t[12]),shapeCount:Number(t[13]),shapeSize:Number(t[14]),jsFuncCount:Number(t[15]),jsFuncSize:Number(t[16]),jsFuncCodeSize:Number(t[17]),jsFuncPc2lineCount:Number(t[18]),jsFuncPc2lineSize:Number(t[19]),cFuncCount:Number(t[20]),arrayCount:Number(t[21]),fastArrayCount:Number(t[22]),fastArrayElements:Number(t[23]),binaryObjectCount:Number(t[24]),binaryObjectSize:Number(t[25])};return this.exports.wasm_free(e),n}getGlobal(){return this.assertNotDisposed(),new T(this,this.exports.qjs_get_global())}newString(e){this.assertNotDisposed();let{ptr:t,len:n}=this.writeString(e),r=this.exports.qjs_new_string(t,n);return this.exports.wasm_free(t),new T(this,r)}newNumber(e){return this.assertNotDisposed(),new T(this,this.exports.qjs_new_number(e))}newBigInt(e){this.assertNotDisposed();let t=Number(e&4294967295n),n=Number(e>>32n&4294967295n);return new T(this,this.exports.qjs_new_big_int64(t,n))}newObject(){return this.assertNotDisposed(),new T(this,this.exports.qjs_new_object())}newArray(){return this.assertNotDisposed(),new T(this,this.exports.qjs_new_array())}newSymbolFor(e){this.assertNotDisposed();let{ptr:t,len:n}=this.writeString(e),r=new T(this,this.exports.qjs_new_symbol(t,n,1));return this.exports.wasm_free(t),r}newArrayBuffer(e){this.assertNotDisposed();let t=e instanceof ArrayBuffer?new Uint8Array(e):e,n=this.exports.wasm_malloc(t.length);if(n===0)throw Error(`wasm_malloc failed`);new Uint8Array(this.exports.memory.buffer).set(t,n);let r=new T(this,this.exports.qjs_new_array_buffer(n,t.length));return this.exports.wasm_free(n),r}newUint8Array(e){this.assertNotDisposed();let t=this.exports.wasm_malloc(e.length);if(t===0)throw Error(`wasm_malloc failed`);new Uint8Array(this.exports.memory.buffer).set(e,t);let n=new T(this,this.exports.qjs_new_uint8_array(t,e.length));return this.exports.wasm_free(t),n}getUndefined(){return this.assertNotDisposed(),new T(this,this.exports.qjs_get_undefined())}getNull(){return this.assertNotDisposed(),new T(this,this.exports.qjs_get_null())}getTrue(){return this.assertNotDisposed(),new T(this,this.exports.qjs_get_true())}getFalse(){return this.assertNotDisposed(),new T(this,this.exports.qjs_get_false())}newFunction(e,t){if(this.assertNotDisposed(),this.hostCallbacks.has(e))throw Error(`Host callback with name "${e}" is already registered`);this.hostCallbacks.set(e,t);let{ptr:n,len:r}=this.writeString(e),i=this.exports.qjs_new_host_function(n,r,0);return this.exports.wasm_free(n),new T(this,i)}withScope(e){this.assertNotDisposed();let t=this._activeScope,n=new Set;this._activeScope=n;let r={escape:e=>(n.delete(e),t?.add(e),e)};try{return e(r)}finally{this._activeScope=t;for(let e of n)e.dispose()}}exportHandle(e){if(this.assertNotDisposed(),e.vm!==this)throw Error(`exportHandle: handle belongs to a different VM`);if(e.disposed)throw Error(`exportHandle: handle is disposed`);if(e._isBorrowed)throw Error(`exportHandle: cannot export a borrowed handle (host-callback this/argument); its box is freed when the callback returns. dup() it and export the duplicate.`);return e.ptr}importHandle(e){if(this.assertNotDisposed(),!Number.isInteger(e)||e<=0||e>=this.exports.memory.buffer.byteLength)throw Error(`importHandle: invalid token ${e}`);return new T(this,this.exports.qjs_dup_value(e))}newEphemeralFunction(e){this.assertNotDisposed();let t=`__ephemeral:${this.nextInternalId++}`;this.hostCallbacks.set(t,e);let{ptr:n,len:r}=this.writeString(t),i=this.exports.qjs_new_host_function(n,r,0);this.exports.wasm_free(n);let a=new T(this,i);return a._onDispose=()=>{this.hostCallbacks.delete(t)},a}unregisterHostCallback(e){return this.hostCallbacks.delete(e)}newInternalFunction(e,t){this.hostCallbacks.set(e,t);let{ptr:n,len:r}=this.writeString(e),i=this.exports.qjs_new_host_function(n,r,0);return this.exports.wasm_free(n),new T(this,i)}newPromise(){this.assertNotDisposed();let e=this.exports.wasm_malloc(4),t=this.exports.wasm_malloc(4),n=this.exports.qjs_new_promise(e,t),r=new DataView(this.exports.memory.buffer),i=r.getUint32(e,!0),a=r.getUint32(t,!0);this.exports.wasm_free(e),this.exports.wasm_free(t);let o=new T(this,n),s=new T(this,i),c=new T(this,a),l=this;l._ownedHandles.add(s),l._ownedHandles.add(c);let u=null;return{handle:o,get settled(){if(!u){let e;u=new Promise(t=>{e=t});let t=`__settle:${l.nextInternalId++}`,n=l.newInternalFunction(t,()=>(e(),l.hostCallbacks.delete(t),l.undefined));l.promiseThenRaw(o,n,n).dispose(),n.dispose()}return u},resolve(e){l.callFunctionRaw(s,l.undefined,e).dispose(),l._ownedHandles.delete(s),s.dispose()},reject(e){l.callFunctionRaw(c,l.undefined,e).dispose(),l._ownedHandles.delete(c),c.dispose()}}}resolvePromise(e){if(this.assertNotDisposed(),!this.exports.qjs_is_promise(e.ptr))return Promise.resolve({value:e.dup()});let t=this.exports.qjs_promise_state(e.ptr);return t===1?Promise.resolve({value:new T(this,this.exports.qjs_promise_result(e.ptr))}):t===2?Promise.resolve({error:new T(this,this.exports.qjs_promise_result(e.ptr))}):new Promise(t=>{let n=this.nextInternalId++,r=`__onFulfilled:${n}`,i=`__onRejected:${n}`,a=this.newInternalFunction(r,(...e)=>{let n=e[0]?.dup()??this.undefined;return this.hostCallbacks.delete(r),this.hostCallbacks.delete(i),t({value:n}),this.undefined}),o=this.newInternalFunction(i,(...e)=>{let n=e[0]?.dup()??this.undefined;return this.hostCallbacks.delete(r),this.hostCallbacks.delete(i),t({error:n}),this.undefined});this.promiseThenRaw(e,a,o).dispose(),a.dispose(),o.dispose()})}promiseThenRaw(e,t,n){return new T(this,this.exports.qjs_promise_then(e.ptr,t.ptr,n.ptr))}markPromiseHandled(e){this.assertNotDisposed(),this.exports.qjs_promise_mark_as_handled(e.ptr)}callFunction(e,t,...n){return this.throwIfException(this.callFunctionRaw(e,t,...n))}construct(e,...t){this.assertNotDisposed();let n=t.length,r=0;if(n>0){r=this.exports.wasm_malloc(n*4);let e=new DataView(this.exports.memory.buffer);for(let i=0;i<n;i++)e.setUint32(r+i*4,t[i].ptr,!0)}let i=this.exports.qjs_call_constructor(e.ptr,n,r);return r&&this.exports.wasm_free(r),this.throwIfException(new T(this,i))}callFunctionRaw(e,t,...n){this.assertNotDisposed();let r=n.length,i=0;if(r>0){i=this.exports.wasm_malloc(r*4);let e=new DataView(this.exports.memory.buffer);for(let t=0;t<r;t++)e.setUint32(i+t*4,n[t].ptr,!0)}let a=this.exports.qjs_call(e.ptr,t.ptr,r,i);return i&&this.exports.wasm_free(i),new T(this,a)}setProp(e,t,n){if(this.assertNotDisposed(),typeof t==`string`){let{ptr:r}=this.writeString(t);this.exports.qjs_set_prop_string(e.ptr,r,n.ptr),this.exports.wasm_free(r)}else this.exports.qjs_set_prop_value(e.ptr,t.ptr,n.ptr)}defineProp(e,t,n,r){this.assertNotDisposed();let i=0;if(r?.configurable&&(i|=1),r?.writable&&(i|=2),r?.enumerable&&(i|=4),typeof t==`string`){let{ptr:r}=this.writeString(t);this.exports.qjs_define_prop_string(e.ptr,r,n.ptr,i),this.exports.wasm_free(r)}else this.exports.qjs_define_prop_value(e.ptr,t.ptr,n.ptr,i)}getProp(e,t){return this.assertNotDisposed(),new T(this,this.exports.qjs_get_prop_value(e.ptr,t.ptr))}getException(){return this.assertNotDisposed(),new T(this,this.exports.qjs_get_exception())}newError(e){this.assertNotDisposed();let t=this.exports.qjs_new_error(),n=new T(this,t);if(typeof e==`string`){let t=this.newString(e);n.setProp(`message`,t),t.dispose()}else{let t=this.newString(e.message);if(n.setProp(`message`,t),t.dispose(),e.name){let t=this.newString(e.name);n.setProp(`name`,t),t.dispose()}if(e.stack){let t=this.newString(e.stack);n.setProp(`stack`,t),t.dispose()}}return n}typeof(e){this.assertNotDisposed();let t=this.exports;return t.qjs_is_undefined(e.ptr)?`undefined`:t.qjs_is_null(e.ptr)?`object`:t.qjs_is_bool(e.ptr)?`boolean`:t.qjs_is_number(e.ptr)?`number`:t.qjs_is_big_int(e.ptr)?`bigint`:t.qjs_is_string(e.ptr)?`string`:t.qjs_is_symbol(e.ptr)?`symbol`:t.qjs_is_function(e.ptr)?`function`:t.qjs_is_object(e.ptr)?`object`:`unknown`}dump(e){return this.assertNotDisposed(),this._dump(e,new Map)}_dump(e,t){let n=this.exports;if(!n.qjs_is_undefined(e.ptr)){if(n.qjs_is_null(e.ptr))return null;if(n.qjs_is_bool(e.ptr))return n.qjs_get_bool(e.ptr)!==0;if(n.qjs_is_number(e.ptr))return n.qjs_get_float64(e.ptr);if(n.qjs_is_string(e.ptr))return e.toString();if(n.qjs_is_big_int(e.ptr))return e.toBigInt();if(n.qjs_is_symbol(e.ptr)){let t=n.wasm_malloc(4),r=n.qjs_get_symbol_description(e.ptr,t),i=new DataView(n.memory.buffer).getUint32(t,!0);if(n.wasm_free(t),r===1){let e=new T(this,i),t=e.toString();return e.dispose(),Symbol.for(t)}else if(r===2){new T(this,i).dispose();return}return}if(n.qjs_is_array_buffer(e.ptr))return e.toArrayBuffer();if(n.qjs_is_exception(e.ptr)){let e=this.getException(),t=e.toString();return e.dispose(),Error(t)}if(!n.qjs_is_function(e.ptr)){if(n.qjs_is_object(e.ptr)){let r=n.qjs_get_value_ptr(e.ptr);if(r){let e=t.get(r);if(e!==void 0)return e}}if(n.qjs_is_object(e.ptr)){let t=n.wasm_malloc(4),r=n.wasm_malloc(4),i=n.wasm_malloc(4),a=n.qjs_get_typed_array_buffer(e.ptr,t,r,i),o=new T(this,a);if(n.qjs_is_exception(o.ptr)===0){let e=new DataView(n.memory.buffer),a=e.getUint32(t,!0),s=e.getUint32(r,!0),c=e.getUint32(i,!0);n.wasm_free(t),n.wasm_free(r),n.wasm_free(i);let l=n.wasm_malloc(4),u=n.qjs_get_array_buffer(o.ptr,l);if(n.wasm_free(l),o.dispose(),u!==0){let e=new Uint8Array(n.memory.buffer,u+a,s).slice();switch(c){case 1:return e;case 2:return new Uint16Array(e.buffer);case 4:return new Uint32Array(e.buffer);case 8:return new Float64Array(e.buffer);default:return e}}}else o.dispose(),n.wasm_free(t),n.wasm_free(r),n.wasm_free(i)}if(n.qjs_is_array(e.ptr)){let r=e.getProp(`length`),i=n.qjs_get_float64(r.ptr);r.dispose();let a=[],o=n.qjs_get_value_ptr(e.ptr);o&&t.set(o,a);for(let r=0;r<i;r++){let i=n.qjs_get_prop_uint32(e.ptr,r),o=new T(this,i);a.push(this._dump(o,t)),o.dispose()}return a}if(n.qjs_is_error(e.ptr)){let t=e.getProp(`name`),n=e.getProp(`message`),r=e.getProp(`stack`),i=t.isUndefined?`Error`:t.toString(),a=n.isUndefined?``:n.toString(),o=r.isUndefined?void 0:r.toString();t.dispose(),n.dispose(),r.dispose();let s=Error(a);return s.name=i,o!==void 0&&(s.stack=o),s}if(n.qjs_is_object(e.ptr)){let r=n.qjs_get_own_property_names(e.ptr),i=new T(this,r);if(n.qjs_is_exception(i.ptr)!==0)return i.dispose(),{};let a=i.getProp(`length`),o=n.qjs_get_float64(a.ptr);a.dispose();let s={},c=n.qjs_get_value_ptr(e.ptr);c&&t.set(c,s);for(let r=0;r<o;r++){let a=n.qjs_get_prop_uint32(i.ptr,r),o=new T(this,a),c=o.toString();o.dispose();let l=e.getProp(c);s[c]=this._dump(l,t),l.dispose()}return i.dispose(),s}}}}hostToHandle(e){if(this.assertNotDisposed(),e===void 0)return this.undefined;if(e===null)return this.null;if(e===!0)return this.true;if(e===!1)return this.false;if(typeof e==`number`)return this.newNumber(e);if(typeof e==`string`)return this.newString(e);if(typeof e==`bigint`)return this.newBigInt(e);if(typeof e==`symbol`){let t=Symbol.keyFor(e);if(t!==void 0)return this.newSymbolFor(t);throw Error(`Cannot convert local symbol to QuickJS handle. Use Symbol.for() for cross-boundary symbols.`)}if(e instanceof Promise){let t=this.newPromise();return e.then(e=>{t.resolve(this.hostToHandle(e)),this.executePendingJobs()},e=>{t.reject(this.hostToHandle(e)),this.executePendingJobs()}),t.handle}if(e instanceof Error)return this.newError(e);if(e instanceof ArrayBuffer)return this.newArrayBuffer(e);if(e instanceof Uint8Array)return this.newUint8Array(e);if(ArrayBuffer.isView(e))return this.newArrayBuffer(new Uint8Array(e.buffer,e.byteOffset,e.byteLength));if(Array.isArray(e)){let t=this.newArray();for(let n=0;n<e.length;n++){let r=this.hostToHandle(e[n]);this.exports.qjs_set_prop_uint32(t.ptr,n,r.ptr),r.dispose()}return t}if(typeof e==`object`&&e){let t=this.newObject();for(let[n,r]of Object.entries(e)){let e=this.hostToHandle(r);t.setProp(n,e),e.dispose()}return t}return this.undefined}snapshot(){return this.assertNotDisposed(),{memory:new Uint8Array(this.exports.memory.buffer).slice(),stackPointer:this.exports.__stack_pointer.value,runtimePtr:this.exports.qjs_get_runtime_ptr(),contextPtr:this.exports.qjs_get_context_ptr(),extensions:this.loadedExtensions.map(e=>({name:e.name,memoryBase:e.memoryBase,tableBase:e.tableBase,initFn:e.initFn}))}}registerHostCallback(e,t){this.hostCallbacks.set(e,t)}dispose(){this.disposed||(this.disposed=!0,this._global=null,this._undefined=null,this._null=null,this._true=null,this._false=null,this._ownedHandles.clear(),this.hostCallbacks.clear(),this._activeScope=null,this.exports=null,this.instance=null,this.module=null)}[Symbol.dispose](){this.dispose()}assertNotDisposed(){if(this.disposed)throw Error(`QuickJS instance has been disposed`)}_getExports(){return this.exports}_getMemory(){return this.exports.memory}_writeString(e){return this.writeString(e)}_readCString(e){return this.readCString(e)}};function v(e){return e.includes(`\0`)||x.test(e)}const y=new TextDecoder,b=new TextEncoder,x=/(?:[\uD800-\uDBFF](?![\uDC00-\uDFFF]))|(?:(?<![\uD800-\uDBFF])[\uDC00-\uDFFF])/;function S(e){if(!x.test(e))return b.encode(e);let t=[];for(let n=0;n<e.length;n++){let r=e.charCodeAt(n);if(r<128)t.push(r);else if(r<2048)t.push(192|r>>6,128|r&63);else if(r>=55296&&r<=56319&&n+1<e.length){let i=e.charCodeAt(n+1);if(i>=56320&&i<=57343){let e=65536+(r-55296<<10)+(i-56320);t.push(240|e>>18,128|e>>12&63,128|e>>6&63,128|e&63),n++;continue}t.push(224|r>>12,128|r>>6&63,128|r&63)}else t.push(224|r>>12,128|r>>6&63,128|r&63)}return new Uint8Array(t)}function C(e){let t=!1;for(let n=0;n<e.length-1;n++)if(e[n]===237&&e[n+1]>=160&&e[n+1]<=191){t=!0;break}if(!t)return y.decode(e);let n=``,r=0;for(;r<e.length;){let t=e[r];if(t<128)n+=String.fromCharCode(t),r+=1;else if(t<224)n+=String.fromCharCode((t&31)<<6|e[r+1]&63),r+=2;else if(t<240)n+=String.fromCharCode((t&15)<<12|(e[r+1]&63)<<6|e[r+2]&63),r+=3;else{let i=(t&7)<<18|(e[r+1]&63)<<12|(e[r+2]&63)<<6|e[r+3]&63;n+=String.fromCodePoint(i),r+=4}}return n}var w=class extends Error{handle;#e;#t;#n;constructor(e){let t={stack:[],error:void 0,hasError:!1};try{super(),this.handle=e,delete this.stack;let n=p(t,e.getProp(`message`),!1);this.#e=e.getProp(`name`).consume(e=>e.isUndefined?`Error`:e.toString()),this.#t=n.isUndefined?e.toString():n.toString(),this.#n=e.getProp(`stack`).consume(e=>e.isUndefined?void 0:e.toString())}catch(e){t.error=e,t.hasError=!0}finally{m(t)}}get name(){return this.#e}set name(e){this.#e=e}get message(){return this.#t}set message(e){this.#t=e}get stack(){return this.#n}set stack(e){this.#n=e}dispose(){this.handle.dispose()}[Symbol.dispose](){this.handle.dispose()}},T=class e{vm;ptr;disposed_=!1;singleton;borrowed;_onDispose;constructor(e,t,n=!1,r=!1){this.vm=e,this.ptr=t,this.singleton=n,this.borrowed=r,!n&&!r&&e._activeScope?.add(this)}get _isBorrowed(){return this.borrowed}get disposed(){return this.disposed_}get isUndefined(){return this.vm._getExports().qjs_is_undefined(this.ptr)!==0}get isNull(){return this.vm._getExports().qjs_is_null(this.ptr)!==0}get isBool(){return this.vm._getExports().qjs_is_bool(this.ptr)!==0}get isNumber(){return this.vm._getExports().qjs_is_number(this.ptr)!==0}get isString(){return this.vm._getExports().qjs_is_string(this.ptr)!==0}get isSymbol(){return this.vm._getExports().qjs_is_symbol(this.ptr)!==0}get isBigInt(){return this.vm._getExports().qjs_is_big_int(this.ptr)!==0}get isObject(){return this.vm._getExports().qjs_is_object(this.ptr)!==0}get isArray(){return this.vm._getExports().qjs_is_array(this.ptr)!==0}get isFunction(){return this.vm._getExports().qjs_is_function(this.ptr)!==0}get isError(){return this.vm._getExports().qjs_is_error(this.ptr)!==0}get isPromise(){return this.vm._getExports().qjs_is_promise(this.ptr)!==0}get isArrayBuffer(){return this.vm._getExports().qjs_is_array_buffer(this.ptr)!==0}get isProxy(){return this.vm._getExports().qjs_is_proxy(this.ptr)!==0}get isMap(){return this.vm._getExports().qjs_is_map(this.ptr)!==0}get isSet(){return this.vm._getExports().qjs_is_set(this.ptr)!==0}get isDate(){return this.vm._getExports().qjs_is_date(this.ptr)!==0}get isRegExp(){return this.vm._getExports().qjs_is_regexp(this.ptr)!==0}get isWeakRef(){return this.vm._getExports().qjs_is_weak_ref(this.ptr)!==0}get isWeakMap(){return this.vm._getExports().qjs_is_weak_map(this.ptr)!==0}get isWeakSet(){return this.vm._getExports().qjs_is_weak_set(this.ptr)!==0}get isDataView(){return this.vm._getExports().qjs_is_data_view(this.ptr)!==0}get identity(){return this.vm._getExports().qjs_get_value_ptr(this.ptr)}toBoolean(){return this.vm._getExports().qjs_get_bool(this.ptr)!==0}get classId(){return this.vm._getExports().qjs_get_class_id(this.ptr)}get className(){let t=new e(this.vm,this.vm._getExports().qjs_get_class_name(this.ptr));if(this.vm._getExports().qjs_is_exception(t.ptr)!==0)throw t.dispose(),new w(this.vm.getException());try{return t.isUndefined?void 0:t.toString()}finally{t.dispose()}}get promiseState(){return this.vm._getExports().qjs_promise_state(this.ptr)}get typeof(){return this.vm.typeof(this)}get length(){let e=this.getProp(`length`),t=e.toNumber();return e.dispose(),t}get constructorName(){let e=this.getProp(`constructor`);if(e.isUndefined||e.isNull){e.dispose();return}let t=e.getProp(`name`);if(e.dispose(),t.isUndefined||t.isNull){t.dispose();return}let n=t.toString();return t.dispose(),n}keys(){let t=this.vm._getExports(),n=t.qjs_get_own_property_names(this.ptr),r=new e(this.vm,n);if(t.qjs_is_exception(r.ptr)!==0)return r.dispose(),[];let i=r.getProp(`length`),a=t.qjs_get_float64(i.ptr);i.dispose();let o=[];for(let n=0;n<a;n++){let i=t.qjs_get_prop_uint32(r.ptr,n),a=new e(this.vm,i);o.push(a.toString()),a.dispose()}return r.dispose(),o}getOwnPropertyNames(){let t=this.vm._getExports(),n=t.qjs_get_own_property_names_all(this.ptr),r=new e(this.vm,n);if(t.qjs_is_exception(r.ptr)!==0)return r.dispose(),[];let i=r.getProp(`length`),a=t.qjs_get_float64(i.ptr);i.dispose();let o=[];for(let n=0;n<a;n++){let i=t.qjs_get_prop_uint32(r.ptr,n),a=new e(this.vm,i);o.push(a.toString()),a.dispose()}return r.dispose(),o}getOwnPropertyKeys(){let t=this.vm._getExports(),n=t.qjs_get_own_property_keys(this.ptr),r=new e(this.vm,n);if(t.qjs_is_exception(r.ptr)!==0)return r.dispose(),[];let i=r.getProp(`length`),a=t.qjs_get_float64(i.ptr);i.dispose();let o=[];for(let n=0;n<a;n++){let i=t.qjs_get_prop_uint32(r.ptr,n),a=new e(this.vm,i);a.isSymbol?o.push(a):(o.push(a.toString()),a.dispose())}return r.dispose(),o}getOwnPropertyDescriptor(t){let n={stack:[],error:void 0,hasError:!1};try{let r=this.vm._getExports(),i,a;typeof t==`string`?(i=this.vm.newString(t),a=i.ptr):a=t.ptr;let o=r.qjs_get_own_property_descriptor(this.ptr,a);if(i?.dispose(),o===0)return;let s=p(n,new e(this.vm,o),!1);if(r.qjs_is_exception(s.ptr)!==0)throw new w(this.vm.getException());let c=s.getProp(`enumerable`).consume(e=>r.qjs_get_bool(e.ptr)!==0),l=s.getProp(`configurable`).consume(e=>r.qjs_get_bool(e.ptr)!==0);return s.hasOwnProperty(`value`)?{value:s.getProp(`value`),writable:s.getProp(`writable`).consume(e=>r.qjs_get_bool(e.ptr)!==0),enumerable:c,configurable:l}:{get:s.getProp(`get`),set:s.getProp(`set`),enumerable:c,configurable:l}}catch(e){n.error=e,n.hasError=!0}finally{m(n)}}hasOwnProperty(e){if(v(e)){let t={stack:[],error:void 0,hasError:!1};try{let n=p(t,this.vm.newString(e),!1);return this.vm._getExports().qjs_has_own_property_value(this.ptr,n.ptr)===1}catch(e){t.error=e,t.hasError=!0}finally{m(t)}}let{ptr:t}=this.vm._writeString(e),n=this.vm._getExports().qjs_has_own_property(this.ptr,t);return this.vm._getExports().wasm_free(t),n===1}propertyIsEnumerable(e){if(v(e)){let t={stack:[],error:void 0,hasError:!1};try{let n=p(t,this.vm.newString(e),!1);return this.vm._getExports().qjs_property_is_enumerable_value(this.ptr,n.ptr)===1}catch(e){t.error=e,t.hasError=!0}finally{m(t)}}let{ptr:t}=this.vm._writeString(e),n=this.vm._getExports().qjs_property_is_enumerable(this.ptr,t);return this.vm._getExports().wasm_free(t),n===1}getPrototypeOf(){let t=this.vm._getExports().qjs_get_prototype_of(this.ptr);return new e(this.vm,t)}getProxyTarget(){let t=this.vm._getExports().qjs_get_proxy_target(this.ptr),n=new e(this.vm,t);if(this.vm._getExports().qjs_is_exception(n.ptr)!==0)throw n.dispose(),new w(this.vm.getException());return n}getProxyHandler(){let t=this.vm._getExports().qjs_get_proxy_handler(this.ptr),n=new e(this.vm,t);if(this.vm._getExports().qjs_is_exception(n.ptr)!==0)throw n.dispose(),new w(this.vm.getException());return n}getProp(t){if(v(t)){let e={stack:[],error:void 0,hasError:!1};try{let n=p(e,this.vm.newString(t),!1);return this.vm.getProp(this,n)}catch(t){e.error=t,e.hasError=!0}finally{m(e)}}let{ptr:n}=this.vm._writeString(t),r=this.vm._getExports().qjs_get_prop_string(this.ptr,n);return this.vm._getExports().wasm_free(n),new e(this.vm,r)}setProp(e,t){if(v(e)){let n={stack:[],error:void 0,hasError:!1};try{let r=p(n,this.vm.newString(e),!1);this.vm.setProp(this,r,t);return}catch(e){n.error=e,n.hasError=!0}finally{m(n)}}let{ptr:n}=this.vm._writeString(e);this.vm._getExports().qjs_set_prop_string(this.ptr,n,t.ptr),this.vm._getExports().wasm_free(n)}defineProp(e,t,n){let r=0;if(n?.configurable&&(r|=1),n?.writable&&(r|=2),n?.enumerable&&(r|=4),typeof e==`string`){if(v(e)){let n={stack:[],error:void 0,hasError:!1};try{let i=p(n,this.vm.newString(e),!1);this.vm._getExports().qjs_define_prop_value(this.ptr,i.ptr,t.ptr,r);return}catch(e){n.error=e,n.hasError=!0}finally{m(n)}}let{ptr:n}=this.vm._writeString(e);this.vm._getExports().qjs_define_prop_string(this.ptr,n,t.ptr,r),this.vm._getExports().wasm_free(n)}else this.vm._getExports().qjs_define_prop_value(this.ptr,e.ptr,t.ptr,r)}toNumber(){return this.vm._getExports().qjs_get_float64(this.ptr)}toBigInt(){let e=this.vm._getExports(),t=e.wasm_malloc(4),n=e.wasm_malloc(4);if(e.qjs_get_big_int64(this.ptr,t,n)!==0)throw e.wasm_free(t),e.wasm_free(n),Error(`Failed to convert value to BigInt`);let r=new DataView(e.memory.buffer),i=r.getUint32(t,!0),a=r.getInt32(n,!0);return e.wasm_free(t),e.wasm_free(n),BigInt(a)<<32n|BigInt(i)}toArrayBuffer(){let t=this.vm._getExports(),n=t.wasm_malloc(4);if(t.qjs_is_array_buffer(this.ptr)){let e=t.qjs_get_array_buffer(this.ptr,n);if(e===0)throw t.wasm_free(n),Error(`Failed to get ArrayBuffer data`);let r=new DataView(t.memory.buffer).getUint32(n,!0);return t.wasm_free(n),new Uint8Array(t.memory.buffer,e,r).slice().buffer}t.wasm_free(n);let r=t.wasm_malloc(4),i=t.wasm_malloc(4),a=t.wasm_malloc(4),o=t.qjs_get_typed_array_buffer(this.ptr,r,i,a),s=new e(this.vm,o);if(this.vm._getExports().qjs_is_exception(s.ptr)!==0)throw s.dispose(),t.wasm_free(r),t.wasm_free(i),t.wasm_free(a),Error(`Value is not an ArrayBuffer or typed array`);let c=new DataView(t.memory.buffer),l=c.getUint32(r,!0),u=c.getUint32(i,!0);t.wasm_free(r),t.wasm_free(i),t.wasm_free(a);let d=t.wasm_malloc(4),f=t.qjs_get_array_buffer(s.ptr,d);if(t.wasm_free(d),s.dispose(),f===0)throw Error(`Failed to get ArrayBuffer data from typed array`);return new Uint8Array(t.memory.buffer,f+l,u).slice().buffer}toUint8Array(){return new Uint8Array(this.toArrayBuffer())}toString(){let e=this.vm._getExports(),t=e.wasm_malloc(4);if(t===0)throw Error(`wasm_malloc failed`);try{let n=e.qjs_get_string_len(this.ptr,t);if(n===0)return`<null>`;let r=new DataView(e.memory.buffer).getUint32(t,!0),i=C(new Uint8Array(e.memory.buffer,n,r));return e.qjs_free_cstring(n),i}finally{e.wasm_free(t)}}consume(e){try{return e(this)}finally{this.dispose()}}dup(){return new e(this.vm,this.vm._getExports().qjs_dup_value(this.ptr))}dispose(){if(!(this.singleton||this.borrowed)&&!this.disposed_){this.disposed_=!0,this._onDispose?.(),this._onDispose=void 0;let e=this.vm._getExports();e&&e.qjs_free_value(this.ptr)}}[Symbol.dispose](){this.dispose()}};function E(e){n?.postMessage(e)}function D(e){E({type:`crash`,message:e instanceof Error?`${e.name}: ${e.message}`:String(e)})}function O(e){return{fd_write(t,n,r,i){let a=new DataView(e.buffer),o=0;for(let e=0;e<r;e++)o+=a.getUint32(n+e*8+4,!0);return a.setUint32(i,o,!0),0}}}function k(e){let t=e.message?`${e.name}: ${e.message}`:e.name,n=e.stack?.trimEnd();return JSON.stringify({name:e.name,message:e.message,stack:n?`${t}\n${n}`:t})}async function A(r){let i=new Int32Array(r.interrupt),a=await _.create({wasm:r.wasm,memoryLimit:r.memoryLimitBytes,maxStackSize:h,interruptHandler:()=>Atomics.load(i,0)!==0,wasi:O}),o=a.newFunction(`bridge`,(e,t,n,r)=>{switch(e.toString()){case`call`:case`global`:E({type:`call`,id:t.toNumber(),target:e.toString()===`call`?`tool`:`global`,name:n.toString(),args:r===void 0||r.isUndefined?void 0:r.toString()});break;case`output`:E({type:`output`,item:t.toString()===`image`?{type:`image`,data:n.toString(),mimeType:r.toString()}:t.toString()===`console`?{type:`text`,text:n.toString(),console:!0}:{type:`text`,text:n.toString()}});break;case`done`:t.toBoolean()?E({type:`done`,ok:!0,value:n===void 0||n.isUndefined?void 0:n.toString(),writes:r.toString()}):E({type:`done`,ok:!1,error:n.toString()});break}return a.undefined}),s=a.withScope(t=>t.escape(a.callFunction(a.evalCode(e,`codemode-prelude.js`),a.undefined,o,a.newString(JSON.stringify(r.tools)),a.newString(JSON.stringify(r.globals)),a.newString(JSON.stringify(r.store))))),c=s.getProp(`settle`),l=s.getProp(`run`),u=s.getProp(`stalled`),d=()=>{a.executePendingJobs(),a.callFunction(u,s).dispose()};n?.on(`message`,e=>{if(t(e))try{a.withScope(()=>{a.callFunction(c,s,a.newNumber(e.id),e.ok?a.true:a.false,e.payload===void 0?a.undefined:a.newString(e.payload))}),d()}catch(e){D(e)}});let f;try{f=a.evalCode(`(async (tools, console) => {${r.code}\n})`,`codemode.js`)}catch(e){if(!(e instanceof w))throw e;E({type:`done`,ok:!1,error:k(e)});return}a.callFunction(l,s,f).dispose(),f.dispose(),d()}n&&A(r).catch(D);export{};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import e from"node:path";import t from"node:os";import n from"bytes";import r from"ms";import i from"node-machine-id";const a=e=>{let t=e?.model?.repo_id||e?.type||``,n=e?.model?.filename;return n?`${t}:${n}`:t},o=({family:e,types:t})=>(n,r)=>{let i=(n.generators||[]).filter(e=>t.includes(e.type));if(i.length===0){let n=t.map(e=>`"${e}"`).join(` or `);throw Error(`No ${e} generator configured. Add a [[generators]] with type = ${n} to your config.`)}let o=i[0];if(r){let t=i.find(e=>a(e)===r)||i.find(e=>{let{repo_id:t,filename:n}=e?.model||{};return t===r||n===r});if(!t){let t=i.map(a).join(`, `);throw Error(`Unknown ${e} model "${r}". Configured models: ${t||`(none)`}`)}o=t}let{generators:s,server:c,...l}=n.global||{};return{type:o.type||t[0],repoId:a(o),mergedConfig:{...l,...o,model:{...o.model}}}},s=({max:e,resolve:t,prepare:n,dispose:r})=>{let i=new Map,a=new Map,o=(e,t)=>{i.delete(e),i.set(e,t)},s=(e,t)=>(t.activeRequests+=1,o(e,t),t),c=async(t,n)=>{for(;i.size>e;){let e=Array.from(i.entries()).find(([,e])=>e.activeRequests===0);if(!e)return;let[a,o]=e;i.delete(a);try{await r?.(t,o),await t.finalizeGenerator?.(o.id),console.log(`${n} Evicted idle generator: ${a}`)}catch(e){console.warn(`${n} Failed to evict idle generator ${a}:`,e?.message)}}};return{getOrCreate:async(e,r,o,l)=>{let{type:u,repoId:d,mergedConfig:f}=t(r,o),p=d,m=i.get(p);if(m?.initialized)return s(p,m);let h=a.get(p);if(h)return s(p,await h);console.log(`${l} Creating ${u} generator for ${p}`);let g=(async()=>{let{id:t}=await e.startGenerator(u,f),r={id:t,type:u,config:f,repoId:d,initialized:!1,activeRequests:0};return await n(e,r),r.initialized=!0,i.set(p,r),console.log(`${l} Generator ready: ${p}`),r})().finally(()=>{a.delete(p)});a.set(p,g);let _=s(p,await g);return await c(e,l),_},release:async(e,t,n)=>{t&&(t.activeRequests=Math.max(0,t.activeRequests-1),await c(e,n))}}};function c(e){e.cancel().catch(()=>{})}const l=(e={},t={})=>{let n=Array.isArray(e)?[...e]:{...e};return Object.entries(t||{}).forEach(([e,t])=>{t&&typeof t==`object`&&!Array.isArray(t)?n[e]=l(n[e]||{},t):n[e]=t}),n},u=e=>e&&typeof e==`object`?structuredClone(e):null,d=(e,t)=>{let n=u(e)||{},r=u(t)||{};return l(n,r)},f=(e,t)=>l(structuredClone(e.global),t||{}),p=(e,t,n,r)=>{if(e.generators.length>0){let i=e.generators.filter(e=>e?.type===n);if(i.length>0&&r){let a=i.find(e=>t.getModelIdentifier(n,e)===r);if(a)return f(e,a)}}return Object.keys(e.global).length>0?f(e,{}):null},m={udp:{port:8089,announcements:{enabled:!0,interval:5e3},requests:{enabled:!0,responseDelay:100}},http:{enabled:!0,path:`/buttress/info`,cors:!0}},h=e=>e?e===!0?{...m}:l(m,e):null,g=(e,t)=>{if(!e.generators||e.generators.length===0)return t.map(e=>({type:e}));let n=new Set;return e.generators.forEach(e=>{e.type&&n.add(e.type)}),n.size===0?t.map(e=>({type:e})):Array.from(n).map(e=>({type:e}))},_=(e,t,n)=>e===void 0?n:typeof e==`number`?e:t(e)??n,v=6e4,y=1024*1024*50,b=a=>{let o=i.machineIdSync(),s={server:{id:`buttress-${o}`,name:`Buttress Server (${o.slice(-8)})`,port:2080,temp_file_dir:e.join(t.tmpdir(),`.buttress`),session_timeout:v,max_body_size:y},autodiscover:!1},c=l(s,u(a)||{}),d=Array.isArray(c.generators)?c.generators:[],{server:f,generators:p,autodiscover:m,...g}=c;return{autodiscover:h(m),server:{id:f.id,name:f.name,port:f.port,log_level:f.log_level,temp_file_dir:f.temp_file_dir,max_body_size:_(f.max_body_size,n.parse,y),session_timeout:_(f.session_timeout,e=>r(e),v)},global:g,generators:d}},x=/^[A-Za-z0-9_-]{1,64}$/,S=n=>n===`~`||n.startsWith(`~/`)?e.join(t.homedir(),n.slice(1)):n;var C=class extends Error{constructor(e){super(`[Agents] ${e}`),this.name=`AgentsConfigError`}};const w=(e,t,n)=>{if(t==null)return n;if(t===0||t===!1)return null;if(typeof t==`number`){if(Number.isFinite(t)&&t>0)return t}else if(typeof t==`string`){let e;try{e=r(t)}catch{e=void 0}if(typeof e==`number`&&e>0)return e}throw new C(`agents_options.${e} must be a duration string (e.g. "30d") or a positive number of milliseconds; use 0 to disable it`)},T=[`direct`,`codemode`,`deferred`,`hidden`],E=new Set([`codemode`,`deferred`]),D=(e,t,n)=>{if(t==null)return{};if(typeof t!=`object`||Array.isArray(t))throw new C(`agent "${e}": mcp_servers must be a table`);let r={};for(let[i,a]of Object.entries(t)){if(!x.test(i))throw new C(`agent "${e}": MCP server name "${i}" must match ${x}`);let t=!!(typeof a?.url==`string`&&a.url),o=!!(typeof a?.command==`string`&&a.command);if(t===o)throw new C(`agent "${e}": MCP server "${i}" needs exactly one of url / command`);let s=`agent "${e}": MCP server "${i}"`;if(a?.timeout!=null&&!(typeof a.timeout==`number`&&a.timeout>0))throw new C(`${s}: timeout must be a positive number of seconds`);let c=a?.tool_exposure;if(c!=null&&(typeof c!=`object`||Array.isArray(c)))throw new C(`${s}: tool_exposure must map tool names to exposures`);for(let e of[a?.exposure,...Object.values(c??{})]){if(e!=null&&!T.includes(e))throw new C(`${s}: exposure must be one of ${T.map(e=>`"${e}"`).join(`, `)}`);if(!n&&E.has(e))throw new C(`${s}: exposure "${e}" needs codemode = true on the agent`)}r[i]={url:t?a.url:void 0,headers:a?.headers&&typeof a.headers==`object`?a.headers:void 0,command:o?a.command:void 0,args:Array.isArray(a?.args)?a.args.map(String):void 0,env:a?.env&&typeof a.env==`object`?a.env:void 0,optional:a?.optional===!0,timeout:a?.timeout??void 0,exposure:a?.exposure??void 0,toolExposure:c??void 0}}return r},O=(e,t,n)=>{let r=e?.name;if(typeof r!=`string`||!x.test(r))throw new C(`[[agents]] #${t+1}: name is required and must match ${x}`);let i=e?.model;if(typeof i!=`string`||!i.includes(`/`))throw new C(`agent "${r}": model must be "provider/model-id" (e.g. "buttress/ggml-org/gpt-oss-20b-GGUF")`);let o=i.indexOf(`/`),s=i.slice(0,o),c=i.slice(o+1);if(!s||!c)throw new C(`agent "${r}": invalid model reference "${i}"`);if(s===`buttress`&&!n.generators.filter(e=>e.type===`ggml-llm`||e.type===`mlx-llm`).some(e=>(e.model?.repo_id||e.model?.repository)===c))throw new C(`agent "${r}": model "${c}" does not match any configured [[generators]] ggml-llm/mlx-llm repo_id`);if(e?.system_prompt!=null&&e?.system_prompt_file!=null)throw new C(`agent "${r}": set system_prompt or system_prompt_file, not both`);let l=[];if(e?.tools!=null){if(!Array.isArray(e.tools))throw new C(`agent "${r}": tools must be an array of function names`);for(let t of e.tools){if(typeof t!=`string`||!x.test(t))throw new C(`agent "${r}": tool name "${t}" must match ${x} (local function names only)`);if(l.includes(t))throw new C(`agent "${r}": duplicate tool "${t}"`);l.push(t)}}if(e?.local_devices!==void 0&&typeof e.local_devices!=`boolean`)throw new C(`agent "${r}": local_devices must be a boolean`);if(e?.codemode!==void 0&&typeof e.codemode!=`boolean`)throw new C(`agent "${r}": codemode must be a boolean`);let u=Number(e?.max_turns??30);if(!Number.isInteger(u)||u<1)throw new C(`agent "${r}": max_turns must be a positive integer`);let d=null;if(e?.max_tokens_per_run!=null&&(d=Number(e.max_tokens_per_run),!Number.isInteger(d)||d<1))throw new C(`agent "${r}": max_tokens_per_run must be a positive integer`);let f=null;if(e?.decision_model!=null&&e.decision_model!==``){let t=e.decision_model,i=typeof t==`string`?t.indexOf(`/`):-1;if(i<=0||i===t.length-1)throw new C(`agent "${r}": decision_model must be "provider/model-id" (e.g. "buttress/<ggml-decision id>" or "typesafe/jev-latest")`);if(f={provider:t.slice(0,i),modelId:t.slice(i+1),modelRef:t},f.provider===`buttress`){let e=n.generators.filter(e=>e.type===`ggml-decision`).map(a);if(!e.includes(f.modelId))throw new C(`agent "${r}": decision_model "${f.modelId}" does not match any configured ggml-decision generator (${e.join(`, `)||`none`})`)}}if(e?.decision_assistance!==void 0&&typeof e.decision_assistance!=`boolean`)throw new C(`agent "${r}": decision_assistance must be a boolean`);if(e?.decision_assistance===!0&&!f)throw new C(`agent "${r}": decision_assistance needs a decision_model`);let p=e?.decision_timeout_ms??500;if(!Number.isInteger(p)||p<1)throw new C(`agent "${r}": decision_timeout_ms must be a positive integer`);let{name:m,model:h,system_prompt:g,system_prompt_file:_,tools:v,local_devices:y=!1,codemode:b=!1,mcp_servers:S,max_turns:w,max_tokens_per_run:T,thinking:E,decision_model:O,decision_assistance:k=!1,decision_timeout_ms:A,...j}=e;return{name:r,provider:s,modelId:c,modelRef:i,systemPrompt:typeof g==`string`?g:null,systemPromptFile:typeof _==`string`?_:null,tools:l,localDevices:y,codemode:b,mcpServers:D(r,S,b),maxTurns:u,maxTokensPerRun:d,thinking:typeof E==`string`?E:void 0,decisionModel:f,decisionAssistance:k,decisionTimeoutMs:p,generation:j}},k=(t,{configDir:n=process.cwd()}={})=>{let r=t.global||{},i=r.agents;if(i==null)return null;if(!Array.isArray(i))throw new C(`agents must be an array of tables ([[agents]])`);if(i.length===0)return null;let a=i.map((e,n)=>O(e,n,t)),o=new Set;for(let e of a){if(o.has(e.name))throw new C(`duplicate agent name "${e.name}"`);o.add(e.name)}let s=r.agents_options||{},c=typeof s.sessions_dir==`string`&&s.sessions_dir?s.sessions_dir:`./.buttress-agent/sessions`,l=S(c),u=e.isAbsolute(l)?l:e.resolve(n,l);for(let t of a)if(t.systemPromptFile){let r=S(t.systemPromptFile);t.systemPromptFile=e.isAbsolute(r)?r:e.resolve(n,r)}let d=Number(s.max_depth??2);if(!Number.isInteger(d)||d<1)throw new C(`agents_options.max_depth must be a positive integer`);let f=s.session_max_count,p=500;if(f===0||f===!1)p=null;else if(f!=null&&(p=Number(f),!Number.isInteger(p)||p<1))throw new C(`agents_options.session_max_count must be a positive integer`);return{agents:a,configDir:n,sessionsDir:u,runtimeTokenFile:e.join(e.dirname(u),`runtime-token`),sessionMaxAgeMs:w(`session_max_age`,s.session_max_age,2592e6),sessionMaxCount:p,maxDepth:d,allowUnauthenticated:s.allow_unauthenticated===!0}};export{b as a,c,s as d,u as i,a as l,k as n,p as o,d as r,g as s,C as t,o as u};
|
|
@@ -10,7 +10,7 @@ export declare const TYPES_FILE_NAME = "buttress-functions.d.ts";
|
|
|
10
10
|
export declare const TSCONFIG_FILE_NAME = "tsconfig.json";
|
|
11
11
|
export declare const EXAMPLE_FILE_NAME = "_example.ts";
|
|
12
12
|
export declare const EXAMPLE_DAEMON_FILE_NAME = "_example-daemon.ts";
|
|
13
|
-
export declare const TYPES_TEMPLATE = "// Generated by @fugood/buttress-server \u2014 do not edit.\n// Rewritten on every server start to match the running version.\n//\n// Local functions are EXPERIMENTAL: this contract may change between\n// releases \u2014 after a server upgrade, re-read this file for the current shape.\n\n/** Result of `context.spawn(...)`. */\ntype ButtressSpawnResult = {\n /** Exit code, or null when the process was killed by a signal. */\n code: number | null\n signal: NodeJS.Signals | null\n stdout: string | Buffer\n stderr: string | Buffer\n /** True when output hit `maxBuffer` and capture stopped early. */\n truncated: boolean\n}\n\ntype ButtressSpawnOptions = {\n cwd?: string\n /** Merged over the server's own environment. */\n env?: Record<string, string | undefined>\n /** Written to stdin, which is then closed. */\n input?: string | Uint8Array\n /** 'utf8' (default) yields strings; 'buffer' yields Buffers. */\n encoding?: 'utf8' | 'buffer'\n /** Per-stream capture cap in bytes (default 8MB). */\n maxBuffer?: number\n onStdout?: (chunk: Buffer) => void\n onStderr?: (chunk: Buffer) => void\n}\n\ntype ButtressCompletionResult = {\n content: string\n reasoning_content?: string\n tool_calls?: any[]\n interrupted?: boolean\n usage: { prompt_tokens: number; completion_tokens: number; total_tokens: number }\n}\n\ntype ButtressEmbeddingResult = {\n /** Plain numbers, ready for JSON or conversion into a sqlite-vec float32 BLOB. */\n embedding: number[]\n}\n\n/** A string, or any JSON object/array (given to the model as JSON text). */\ntype ButtressDecisionContent = string | readonly any[] | { [key: string]: any }\n\ntype ButtressDecisionQuestion =\n | {\n type: 'choice'\n instructions: ButtressDecisionContent\n /**\n * Option key \u2192 description (or null), shown in key order. Whole-number\n * keys ('1', '10') sort first in JavaScript, so prefix them ('n1').\n */\n criteria: { [key: string]: string | null }\n }\n | {\n type: 'score'\n instructions: ButtressDecisionContent\n /** 2 to 10 level descriptions, lowest first. */\n criteria: readonly string[]\n }\n | {\n type: 'noul'\n instructions: ButtressDecisionContent\n criteria?: { true?: string | null; false?: string | null }\n }\n\n/** The answer for one question, narrowed by its type (choice keys included). */\ntype ButtressDecisionAnswer<Q> = Q extends { type: 'choice'; criteria: infer C }\n ? {\n type: 'choice'\n /** The option with the highest probability. */\n choice: keyof C & string\n /** Option \u2192 probability, summing to 1. */\n probabilities: { [K in keyof C & string]: number }\n /** 0 when all options are equally likely, 1 when one has all the mass. */\n confidence: number\n }\n : Q extends { type: 'score' }\n ? {\n type: 'score'\n /** Expected level index, weighted by probability (may fall between levels). */\n score: number\n /** Level index \u2192 description. */\n legend: Record<string, string>\n /** Level index \u2192 probability, summing to 1. */\n probabilities: Record<string, number>\n confidence: number\n }\n : {\n type: 'noul'\n /** Probability that the statement is true. */\n noul: number\n }\n\ntype ButtressDecisionResult<Q extends Record<string, ButtressDecisionQuestion>> = {\n /** `general.name` of the model, or its file name. */\n model: string\n answers: { [id in keyof Q]: ButtressDecisionAnswer<Q[id]> }\n /** `output_tokens` is always 0: no token is generated. */\n usage: { input_tokens: number; output_tokens: number }\n}\n\n/** 'InSubspace' scopes a property to the space; 'Global' is cross-application. */\ntype ButtressBankPropertyMeta = 'InSubspace' | 'Global'\n\ntype ButtressBankProperty = {\n propertyId: string\n meta: ButtressBankPropertyMeta\n definition: Record<string, any> | null\n value: any\n tags: string[] | null\n lastUpdateHash: string | null\n lastUpdateNote: string | null\n lastUpdateKey: string | null\n createAt: string | null\n updateAt: string | null\n}\n\n/**\n * The Bank replaces `value` unconditionally on update \u2014 an omitted `value`\n * clears the stored one. Read-merge first when a partial update is intended.\n */\ntype ButtressBankPropertyInput = {\n propertyId: string\n /** Defaults to 'InSubspace'. */\n meta?: ButtressBankPropertyMeta\n definition?: Record<string, any>\n newDefinitionFallback?: Record<string, any>\n value?: any\n updateNote?: string\n /** Bank defaults upsert to true; pass false to require an existing property. */\n upsert?: boolean\n tags?: string[]\n}\n\ntype ButtressFunctionContext = {\n /**\n * Run a child process. Resolves once it exits \u2014 a non-zero `code` is a\n * normal resolution, so check it yourself. Rejects only when the process\n * cannot be started. Every process a call spawns is killed when the call\n * ends or times out.\n */\n spawn: (\n command: string,\n args?: string[],\n options?: ButtressSpawnOptions,\n ) => Promise<ButtressSpawnResult>\n\n buttress: {\n /**\n * Run a chat completion on this server's LLM generator. `messages` are\n * rendered with the model's own chat template, and thinking is off unless\n * you pass `enable_thinking: true` (which fills `reasoning_content`).\n */\n completion: (options: {\n /** Configured `[[generators]]` model; defaults to the first one. */\n model?: string\n messages?: { role: string; content: any }[]\n /**\n * Raw prompt sent without the chat template \u2014 the fallback for models\n * whose template the server cannot apply. Use instead of `messages`.\n */\n prompt?: string\n /** Cap on generated tokens. Unbounded when omitted. */\n max_tokens?: number\n temperature?: number\n /** Emit the model's reasoning into `reasoning_content` (default false). */\n enable_thinking?: boolean\n /** Called for every streamed token event. */\n onToken?: (event: { token?: string; content?: string; [key: string]: any }) => void\n /** Any other backend sampling option (`top_p`, `stop`, `tools`, \u2026). */\n [param: string]: any\n }) => Promise<ButtressCompletionResult>\n\n /**\n * Embed text with a GGML generator whose `[generators.model]` table sets\n * `embedding = true`. The vector is returned as plain numbers.\n */\n embedding: (options: {\n model?: string\n text: string\n /** llama.cpp normalization mode; 2 (L2) is the native default. */\n embd_normalize?: number\n }) => Promise<ButtressEmbeddingResult>\n\n /** Tokenize text with a configured GGML or MLX generator. */\n tokenize: (options: {\n model?: string\n text: string\n params?: Record<string, any>\n }) => Promise<Record<string, any> & { tokens: number[] }>\n\n /** Turn model token ids back into text. */\n detokenize: (options: { model?: string; tokens: number[] }) => Promise<string>\n\n /** Transcribe audio with this server's STT generator. */\n transcribe: (options: {\n /** Must match a configured STT model (`repo_id` or `repo_id:filename`). */\n model?: string\n filePath?: string\n audioData?: Uint8Array | Buffer\n options?: Record<string, any>\n }) => Promise<any>\n\n /**\n * Synthesize speech with this server's TTS generator (onnx-tts or\n * ggml-tts). The WAV is written into `tempDir`; return\n * `fileUrl(path)` to let callers download it.\n */\n synthesize: (options: {\n /** Must match a configured TTS model when given. */\n model?: string\n text: string\n /** Backend options; `options.speaker` picks a registered voice. */\n options?: Record<string, any>\n }) => Promise<{ path: string; sampling_rate: number; channels: number }>\n\n /**\n * Answer typed questions about a state with this server's `ggml-decision`\n * generator (TypeSafe `/v1/systemone` shape): calibrated probabilities from\n * one forward pass per answer, no generated tokens. `answers[id]` is typed\n * from the question's `type` and choice keys.\n */\n decide: <const Q extends Record<string, ButtressDecisionQuestion>>(options: {\n /** Must match a configured decision model (`repo_id` or `repo_id:filename`). */\n model?: string\n /** The content to evaluate: text, or a JSON object/array. */\n state: ButtressDecisionContent\n questions: Q\n /** Local file paths or data URLs; the generator needs an mmproj configured. */\n images?: string[]\n }) => Promise<ButtressDecisionResult<Q>>\n }\n\n /**\n * Daemon functions running on this server (files with `meta.daemon`).\n */\n daemons: {\n /**\n * Deliver an event to the named daemon's `context.onEvent` handlers;\n * it arrives as `{ event, data, source }`. Throws when no daemon of\n * that name is running, or when it registered no handler.\n */\n emit: (name: string, event: string, data?: unknown) => void\n /** Names of the daemons currently running. */\n list: () => string[]\n }\n\n /**\n * The bound workspace's remote Data Bank (read/write; daemon functions can\n * also subscribe to changes via `bank.subscribe`). Every method throws\n * until credentials are stored via `bricks buttress bank-key` (run on\n * this host, then restart the server).\n */\n bank: {\n /** List properties, optionally filtered. */\n list: (options?: {\n /** Match against definition title/description or tags. */\n keyword?: string\n meta?: ButtressBankPropertyMeta\n /** Restrict to these property ids. */\n ids?: string[]\n }) => Promise<ButtressBankProperty[]>\n\n /** One property, or null when it does not exist. */\n get: (propertyId: string) => Promise<ButtressBankProperty | null>\n\n /**\n * Create or update properties (upsert by default). Updates notify\n * subscribed devices unless `dontNotify` is set.\n */\n update: (\n properties: ButtressBankPropertyInput[],\n options?: { dontNotify?: boolean },\n ) => Promise<ButtressBankProperty[]>\n\n /** Delete a property. Resolves false when it did not exist. */\n remove: (propertyId: string) => Promise<boolean>\n\n /**\n * Watch property ids for remote changes. Only available inside daemon\n * functions (throws elsewhere); closed automatically when the daemon\n * stops. The connection is shared and reconnects on its own \u2014 a network\n * drop never stops the daemon.\n */\n subscribe: (\n propertyIds: string[],\n onChange: (properties: ButtressBankProperty[]) => unknown,\n ) => { close: () => void }\n }\n\n fetch: typeof fetch\n /** Server-side log, prefixed with the function name. */\n log: (...args: unknown[]) => void\n /** Emit a progress event. Delivered only to SSE callers; a no-op otherwise. */\n emit: (event: string, data?: unknown) => void\n /** Aborted when the call times out or the caller disconnects. */\n signal: AbortSignal\n env: Record<string, string | undefined>\n /**\n * The `[functions.config]` table from the server config. Read once at\n * server start \u2014 unlike function files, config edits need a restart.\n */\n config: Record<string, any>\n /** Per-call scratch directory, created on first access. */\n tempDir: string\n /**\n * Download URL path (`/functions/files/...`) for a file inside `tempDir`;\n * relative input resolves against it. Callers fetch the URL with the same\n * auth as any function call. Scratch dirs are swept after ~24h.\n */\n fileUrl: (target: string) => string\n /** Absolute path of this functions directory. */\n dir: string\n /** Helper libraries: _, lodash, moment, math, mathjs, voca, chroma, json5, qs, bytes, ms, nanoid, md5. */\n libs: Record<string, any>\n}\n\ntype ButtressFunctionMeta = {\n /** Shown to MCP clients in `tools/list`. */\n description?: string\n /** JSON Schema for the input object, passed to MCP verbatim. */\n parameters?: Record<string, any>\n /**\n * Deadline for this function: ms, or a duration string like \"10m\".\n * Ignored for daemons \u2014 a daemon has no deadline.\n */\n timeout?: number | string\n /**\n * `true` declares this file as a daemon: a long-lived background\n * function. Its default export runs once, with a ButtressDaemonContext as\n * its only argument, and stays alive \u2014 everything registered there\n * (`setInterval` timers, `bank.subscribe` subscriptions, `onEvent`\n * handlers) keeps firing until the file changes or the server stops.\n * A daemon is not an MCP tool and cannot be called over HTTP.\n */\n daemon?: boolean\n}\n\n/** An event another local function sent via `context.daemons.emit`. */\ntype ButtressDaemonEmittedEvent = {\n event: string\n data?: unknown\n /** Name of the local function (or daemon) that emitted it. */\n source: string\n}\n\n/**\n * What a daemon's default export receives: the full function context plus\n * lifetime APIs. `context.signal` aborts when the daemon stops (file\n * changed/removed, or server shutdown); an optional cleanup function\n * *returned* by the handler also runs at that point.\n */\ntype ButtressDaemonContext = ButtressFunctionContext & {\n /**\n * A managed `setInterval`: the callback keeps firing until cleared or\n * the daemon stops. A callback that throws is logged (and shown on\n * /status) \u2014 it never stops the timer or the daemon.\n */\n setInterval: (callback: () => unknown, ms: number) => unknown\n clearInterval: (handle: unknown) => void\n /** Receive events other local functions send via `context.daemons.emit`. */\n onEvent: (handler: (event: ButtressDaemonEmittedEvent) => unknown) => void\n}\n\n// --- Custom auth ------------------------------------------------------------\n// Drop an `_auth.ts` into this directory to gate the /functions endpoints\n// with your own logic. It exports the same shape as a function file:\n//\n// export const meta: ButtressAuthMeta = { mode: 'both' }\n// export default async function (\n// request: ButtressAuthRequest,\n// context: ButtressAuthContext,\n// ): Promise<ButtressAuthResult> { ... }\n//\n// While an `_auth` file exists but fails to load, every call is rejected.\n\ntype ButtressAuthMeta = {\n /**\n * 'both' (default): runs after the built-in workspace auth passes, as an\n * extra gate. 'override': replaces workspace auth \u2014 this function is the\n * only authority (a presented workspace token is still verified into\n * `request.workspaceAuth` so you can choose to honor it).\n */\n mode?: 'override' | 'both'\n}\n\ntype ButtressAuthRequest = {\n method: string\n path: string\n /** Function name for `GET`/`POST /functions/<name>`; undefined for list and MCP. */\n name?: string\n headers: Record<string, string | undefined>\n query: Record<string, string | undefined>\n /** Raw bearer token (Authorization header or `?token=`), if any. */\n token: string | null\n workspaceAuth: {\n /** Whether this server is bound to a workspace. */\n bound: boolean\n /** Whether the caller presented a valid workspace access token. */\n authenticated: boolean\n identity: {\n workspaceId: string\n subjectType: 'ws' | 'dev'\n subjectId: string\n jti?: string\n exp: number\n } | null\n }\n}\n\ntype ButtressAuthContext = {\n /** Server-side log, prefixed with \"_auth\". */\n log: (...args: unknown[]) => void\n fetch: typeof fetch\n env: Record<string, string | undefined>\n /** The `[functions.config]` table, same as `context.config` in functions. */\n config: Record<string, any>\n /** Absolute path of this functions directory. */\n dir: string\n /** Same helper libraries functions get. */\n libs: Record<string, any>\n}\n\n/** Only `true` (or `{ ok: true }`) allows the request; anything else denies. */\ntype ButtressAuthResult =\n | boolean\n | {\n ok: boolean\n /** Response status for a denial, 400-499 (default 403). */\n status?: number\n /** Message returned to the caller on denial. */\n error?: string\n }\n\n// The only non-builtin packages the local-function loader accepts. These\n// declarations keep editor support working when this directory is outside the\n// server package's own node_modules resolution tree.\ndeclare module 'sqlite3' {\n type SqliteCallback = (error: Error | null) => void\n\n class Database {\n constructor(filename: string, callback?: SqliteCallback)\n run(sql: string, ...params: any[]): this\n all<T = Record<string, any>>(\n sql: string,\n ...params: [...any[], (error: Error | null, rows: T[]) => void]\n ): this\n exec(sql: string, callback?: SqliteCallback): this\n loadExtension(filename: string, callback?: SqliteCallback): this\n close(callback?: SqliteCallback): void\n }\n\n const sqlite3: { Database: typeof Database }\n export { Database }\n export default sqlite3\n}\n\ndeclare module 'sqlite-vec' {\n export function getLoadablePath(): string\n export function load(database: { loadExtension(path: string): unknown }): void\n}\n";
|
|
13
|
+
export declare const TYPES_TEMPLATE = "// Generated by @fugood/buttress-server \u2014 do not edit.\n// Rewritten on every server start to match the running version.\n//\n// Local functions are EXPERIMENTAL: this contract may change between\n// releases \u2014 after a server upgrade, re-read this file for the current shape.\n\n/** Result of `context.spawn(...)`. */\ntype ButtressSpawnResult = {\n /** Exit code, or null when the process was killed by a signal. */\n code: number | null\n signal: NodeJS.Signals | null\n stdout: string | Buffer\n stderr: string | Buffer\n /** True when output hit `maxBuffer` and capture stopped early. */\n truncated: boolean\n}\n\ntype ButtressSpawnOptions = {\n cwd?: string\n /** Merged over the server's own environment. */\n env?: Record<string, string | undefined>\n /** Written to stdin, which is then closed. */\n input?: string | Uint8Array\n /** 'utf8' (default) yields strings; 'buffer' yields Buffers. */\n encoding?: 'utf8' | 'buffer'\n /** Per-stream capture cap in bytes (default 8MB). */\n maxBuffer?: number\n onStdout?: (chunk: Buffer) => void\n onStderr?: (chunk: Buffer) => void\n}\n\ntype ButtressCompletionResult = {\n content: string\n reasoning_content?: string\n tool_calls?: any[]\n interrupted?: boolean\n usage: { prompt_tokens: number; completion_tokens: number; total_tokens: number }\n}\n\ntype ButtressEmbeddingResult = {\n /** Plain numbers, ready for JSON or conversion into a sqlite-vec float32 BLOB. */\n embedding: number[]\n}\n\n/** A string, or any JSON object/array (given to the model as JSON text). */\ntype ButtressDecisionContent = string | readonly any[] | { [key: string]: any }\n\ntype ButtressDecisionQuestion =\n | {\n type: 'choice'\n instructions: ButtressDecisionContent\n /**\n * Option key \u2192 description (or null), shown in key order. Whole-number\n * keys ('1', '10') sort first in JavaScript, so prefix them ('n1').\n */\n criteria: { [key: string]: string | null }\n }\n | {\n type: 'score'\n instructions: ButtressDecisionContent\n /** 2 to 10 level descriptions, lowest first. */\n criteria: readonly string[]\n }\n | {\n type: 'noul'\n instructions: ButtressDecisionContent\n /** `lfm2-d1-omni`, `h2o-lightning` also take `yes` / `no`. */\n criteria?: {\n true?: string | null\n false?: string | null\n yes?: string | null\n no?: string | null\n }\n }\n\n/** The answer for one question, narrowed by its type (choice keys included). */\ntype ButtressDecisionAnswer<Q> = Q extends { type: 'choice'; criteria: infer C }\n ? {\n type: 'choice'\n /** The option with the highest probability. */\n choice: keyof C & string\n /** Option \u2192 probability, summing to 1. */\n probabilities: { [K in keyof C & string]: number }\n /** 0 when all options are equally likely, 1 when one has all the mass. */\n confidence: number\n }\n : Q extends { type: 'score' }\n ? {\n type: 'score'\n /** Expected level index, weighted by probability (may fall between levels). */\n score: number\n /** Level index \u2192 description. */\n legend: Record<string, string>\n /** Level index \u2192 probability, summing to 1. */\n probabilities: Record<string, number>\n confidence: number\n }\n : {\n type: 'noul'\n /** Probability that the statement is true. */\n noul: number\n }\n\ntype ButtressDecisionResult<Q extends Record<string, ButtressDecisionQuestion>> = {\n /** `general.name` of the model, or its file name. */\n model: string\n answers: { [id in keyof Q]: ButtressDecisionAnswer<Q[id]> }\n /** `output_tokens` is always 0: no token is generated. */\n usage: { input_tokens: number; output_tokens: number }\n}\n\n/** 'InSubspace' scopes a property to the space; 'Global' is cross-application. */\ntype ButtressBankPropertyMeta = 'InSubspace' | 'Global'\n\ntype ButtressBankProperty = {\n propertyId: string\n meta: ButtressBankPropertyMeta\n definition: Record<string, any> | null\n value: any\n tags: string[] | null\n lastUpdateHash: string | null\n lastUpdateNote: string | null\n lastUpdateKey: string | null\n createAt: string | null\n updateAt: string | null\n}\n\n/**\n * The Bank replaces `value` unconditionally on update \u2014 an omitted `value`\n * clears the stored one. Read-merge first when a partial update is intended.\n */\ntype ButtressBankPropertyInput = {\n propertyId: string\n /** Defaults to 'InSubspace'. */\n meta?: ButtressBankPropertyMeta\n definition?: Record<string, any>\n newDefinitionFallback?: Record<string, any>\n value?: any\n updateNote?: string\n /** Bank defaults upsert to true; pass false to require an existing property. */\n upsert?: boolean\n tags?: string[]\n}\n\ntype ButtressFunctionContext = {\n /**\n * Run a child process. Resolves once it exits \u2014 a non-zero `code` is a\n * normal resolution, so check it yourself. Rejects only when the process\n * cannot be started. Every process a call spawns is killed when the call\n * ends or times out.\n */\n spawn: (\n command: string,\n args?: string[],\n options?: ButtressSpawnOptions,\n ) => Promise<ButtressSpawnResult>\n\n buttress: {\n /**\n * Run a chat completion on this server's LLM generator. `messages` are\n * rendered with the model's own chat template, and thinking is off unless\n * you pass `enable_thinking: true` (which fills `reasoning_content`).\n */\n completion: (options: {\n /** Configured `[[generators]]` model; defaults to the first one. */\n model?: string\n messages?: { role: string; content: any }[]\n /**\n * Raw prompt sent without the chat template \u2014 the fallback for models\n * whose template the server cannot apply. Use instead of `messages`.\n */\n prompt?: string\n /** Cap on generated tokens. Unbounded when omitted. */\n max_tokens?: number\n temperature?: number\n /** Emit the model's reasoning into `reasoning_content` (default false). */\n enable_thinking?: boolean\n /** Called for every streamed token event. */\n onToken?: (event: { token?: string; content?: string; [key: string]: any }) => void\n /** Any other backend sampling option (`top_p`, `stop`, `tools`, \u2026). */\n [param: string]: any\n }) => Promise<ButtressCompletionResult>\n\n /**\n * Embed text with a GGML generator whose `[generators.model]` table sets\n * `embedding = true`. The vector is returned as plain numbers.\n */\n embedding: (options: {\n model?: string\n text: string\n /** llama.cpp normalization mode; 2 (L2) is the native default. */\n embd_normalize?: number\n }) => Promise<ButtressEmbeddingResult>\n\n /** Tokenize text with a configured GGML or MLX generator. */\n tokenize: (options: {\n model?: string\n text: string\n params?: Record<string, any>\n }) => Promise<Record<string, any> & { tokens: number[] }>\n\n /** Turn model token ids back into text. */\n detokenize: (options: { model?: string; tokens: number[] }) => Promise<string>\n\n /** Transcribe audio with this server's STT generator. */\n transcribe: (options: {\n /** Must match a configured STT model (`repo_id` or `repo_id:filename`). */\n model?: string\n filePath?: string\n audioData?: Uint8Array | Buffer\n options?: Record<string, any>\n }) => Promise<any>\n\n /**\n * Synthesize speech with this server's TTS generator (onnx-tts or\n * ggml-tts). The WAV is written into `tempDir`; return\n * `fileUrl(path)` to let callers download it.\n */\n synthesize: (options: {\n /** Must match a configured TTS model when given. */\n model?: string\n text: string\n /** Backend options; `options.speaker` picks a registered voice. */\n options?: Record<string, any>\n }) => Promise<{ path: string; sampling_rate: number; channels: number }>\n\n /**\n * Answer typed questions about a state with this server's `ggml-decision`\n * generator (TypeSafe `/v1/systemone` shape): calibrated probabilities from\n * one forward pass per answer, no generated tokens. `answers[id]` is typed\n * from the question's `type` and choice keys.\n */\n decide: <const Q extends Record<string, ButtressDecisionQuestion>>(options: {\n /** Must match a configured decision model (`repo_id` or `repo_id:filename`). */\n model?: string\n /**\n * The content to evaluate: text, or a JSON object/array. `null` asks\n * about the media only (`lfm2-d1`, `lfm2-d1-omni`, `lfm3-d1`, `lfm3-d1-omni`, `vllm-d3` models).\n */\n state: ButtressDecisionContent | null\n questions: Q\n /**\n * Images, or audio clips for a model that takes audio, as local file\n * paths or data URLs; the generator needs an mmproj configured.\n */\n images?: string[]\n /** Alias of `images`; both lists are used. */\n files?: string[]\n }) => Promise<ButtressDecisionResult<Q>>\n }\n\n /**\n * Daemon functions running on this server (files with `meta.daemon`).\n */\n daemons: {\n /**\n * Deliver an event to the named daemon's `context.onEvent` handlers;\n * it arrives as `{ event, data, source }`. Throws when no daemon of\n * that name is running, or when it registered no handler.\n */\n emit: (name: string, event: string, data?: unknown) => void\n /** Names of the daemons currently running. */\n list: () => string[]\n }\n\n /**\n * The bound workspace's remote Data Bank (read/write; daemon functions can\n * also subscribe to changes via `bank.subscribe`). Every method throws\n * until credentials are stored via `bricks buttress bank-key` (run on\n * this host, then restart the server).\n */\n bank: {\n /** List properties, optionally filtered. */\n list: (options?: {\n /** Match against definition title/description or tags. */\n keyword?: string\n meta?: ButtressBankPropertyMeta\n /** Restrict to these property ids. */\n ids?: string[]\n }) => Promise<ButtressBankProperty[]>\n\n /** One property, or null when it does not exist. */\n get: (propertyId: string) => Promise<ButtressBankProperty | null>\n\n /**\n * Create or update properties (upsert by default). Updates notify\n * subscribed devices unless `dontNotify` is set.\n */\n update: (\n properties: ButtressBankPropertyInput[],\n options?: { dontNotify?: boolean },\n ) => Promise<ButtressBankProperty[]>\n\n /** Delete a property. Resolves false when it did not exist. */\n remove: (propertyId: string) => Promise<boolean>\n\n /**\n * Watch property ids for remote changes. Only available inside daemon\n * functions (throws elsewhere); closed automatically when the daemon\n * stops. The connection is shared and reconnects on its own \u2014 a network\n * drop never stops the daemon.\n */\n subscribe: (\n propertyIds: string[],\n onChange: (properties: ButtressBankProperty[]) => unknown,\n ) => { close: () => void }\n }\n\n fetch: typeof fetch\n /** Server-side log, prefixed with the function name. */\n log: (...args: unknown[]) => void\n /** Emit a progress event. Delivered only to SSE callers; a no-op otherwise. */\n emit: (event: string, data?: unknown) => void\n /** Aborted when the call times out or the caller disconnects. */\n signal: AbortSignal\n env: Record<string, string | undefined>\n /**\n * The `[functions.config]` table from the server config. Read once at\n * server start \u2014 unlike function files, config edits need a restart.\n */\n config: Record<string, any>\n /** Per-call scratch directory, created on first access. */\n tempDir: string\n /**\n * Download URL path (`/functions/files/...`) for a file inside `tempDir`;\n * relative input resolves against it. Callers fetch the URL with the same\n * auth as any function call. Scratch dirs are swept after ~24h.\n */\n fileUrl: (target: string) => string\n /** Absolute path of this functions directory. */\n dir: string\n /** Helper libraries: _, lodash, moment, math, mathjs, voca, chroma, json5, qs, bytes, ms, nanoid, md5. */\n libs: Record<string, any>\n}\n\ntype ButtressFunctionMeta = {\n /** Shown to MCP clients in `tools/list`. */\n description?: string\n /** JSON Schema for the input object, passed to MCP verbatim. */\n parameters?: Record<string, any>\n /**\n * Deadline for this function: ms, or a duration string like \"10m\".\n * Ignored for daemons \u2014 a daemon has no deadline.\n */\n timeout?: number | string\n /**\n * `true` declares this file as a daemon: a long-lived background\n * function. Its default export runs once, with a ButtressDaemonContext as\n * its only argument, and stays alive \u2014 everything registered there\n * (`setInterval` timers, `bank.subscribe` subscriptions, `onEvent`\n * handlers) keeps firing until the file changes or the server stops.\n * A daemon is not an MCP tool and cannot be called over HTTP.\n */\n daemon?: boolean\n}\n\n/** An event another local function sent via `context.daemons.emit`. */\ntype ButtressDaemonEmittedEvent = {\n event: string\n data?: unknown\n /** Name of the local function (or daemon) that emitted it. */\n source: string\n}\n\n/**\n * What a daemon's default export receives: the full function context plus\n * lifetime APIs. `context.signal` aborts when the daemon stops (file\n * changed/removed, or server shutdown); an optional cleanup function\n * *returned* by the handler also runs at that point.\n */\ntype ButtressDaemonContext = ButtressFunctionContext & {\n /**\n * A managed `setInterval`: the callback keeps firing until cleared or\n * the daemon stops. A callback that throws is logged (and shown on\n * /status) \u2014 it never stops the timer or the daemon.\n */\n setInterval: (callback: () => unknown, ms: number) => unknown\n clearInterval: (handle: unknown) => void\n /** Receive events other local functions send via `context.daemons.emit`. */\n onEvent: (handler: (event: ButtressDaemonEmittedEvent) => unknown) => void\n}\n\n// --- Custom auth ------------------------------------------------------------\n// Drop an `_auth.ts` into this directory to gate the /functions endpoints\n// with your own logic. It exports the same shape as a function file:\n//\n// export const meta: ButtressAuthMeta = { mode: 'both' }\n// export default async function (\n// request: ButtressAuthRequest,\n// context: ButtressAuthContext,\n// ): Promise<ButtressAuthResult> { ... }\n//\n// While an `_auth` file exists but fails to load, every call is rejected.\n\ntype ButtressAuthMeta = {\n /**\n * 'both' (default): runs after the built-in workspace auth passes, as an\n * extra gate. 'override': replaces workspace auth \u2014 this function is the\n * only authority (a presented workspace token is still verified into\n * `request.workspaceAuth` so you can choose to honor it).\n */\n mode?: 'override' | 'both'\n}\n\ntype ButtressAuthRequest = {\n method: string\n path: string\n /** Function name for `GET`/`POST /functions/<name>`; undefined for list and MCP. */\n name?: string\n headers: Record<string, string | undefined>\n query: Record<string, string | undefined>\n /** Raw bearer token (Authorization header or `?token=`), if any. */\n token: string | null\n workspaceAuth: {\n /** Whether this server is bound to a workspace. */\n bound: boolean\n /** Whether the caller presented a valid workspace access token. */\n authenticated: boolean\n identity: {\n workspaceId: string\n subjectType: 'ws' | 'dev'\n subjectId: string\n jti?: string\n exp: number\n } | null\n }\n}\n\ntype ButtressAuthContext = {\n /** Server-side log, prefixed with \"_auth\". */\n log: (...args: unknown[]) => void\n fetch: typeof fetch\n env: Record<string, string | undefined>\n /** The `[functions.config]` table, same as `context.config` in functions. */\n config: Record<string, any>\n /** Absolute path of this functions directory. */\n dir: string\n /** Same helper libraries functions get. */\n libs: Record<string, any>\n}\n\n/** Only `true` (or `{ ok: true }`) allows the request; anything else denies. */\ntype ButtressAuthResult =\n | boolean\n | {\n ok: boolean\n /** Response status for a denial, 400-499 (default 403). */\n status?: number\n /** Message returned to the caller on denial. */\n error?: string\n }\n\n// The only non-builtin packages the local-function loader accepts. These\n// declarations keep editor support working when this directory is outside the\n// server package's own node_modules resolution tree.\ndeclare module 'sqlite3' {\n type SqliteCallback = (error: Error | null) => void\n\n class Database {\n constructor(filename: string, callback?: SqliteCallback)\n run(sql: string, ...params: any[]): this\n all<T = Record<string, any>>(\n sql: string,\n ...params: [...any[], (error: Error | null, rows: T[]) => void]\n ): this\n exec(sql: string, callback?: SqliteCallback): this\n loadExtension(filename: string, callback?: SqliteCallback): this\n close(callback?: SqliteCallback): void\n }\n\n const sqlite3: { Database: typeof Database }\n export { Database }\n export default sqlite3\n}\n\ndeclare module 'sqlite-vec' {\n export function getLoadablePath(): string\n export function load(database: { loadExtension(path: string): unknown }): void\n}\n";
|
|
14
14
|
export declare const TSCONFIG_TEMPLATE = "{\n // Editor support for Buttress local functions.\n // Install @types/node here for typings on \"node:*\" imports.\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Bundler\",\n \"lib\": [\"ES2023\"],\n \"strict\": true,\n \"noEmit\": true,\n \"allowJs\": true,\n \"skipLibCheck\": true\n },\n \"include\": [\"**/*.ts\", \"**/*.js\"]\n}\n";
|
|
15
15
|
export declare const EXAMPLE_TEMPLATE = "// Example Buttress local function.\n//\n// Rename (or copy) this file to expose it: files starting with \"_\" are\n// ignored. The tool name is the file name \u2014 \"video-duration.ts\" becomes the\n// tool \"video-duration\", callable over MCP, at POST /functions/video-duration\n// with a JSON body, and at GET /functions/video-duration?path=... with the\n// input in the query string.\n\nexport const meta: ButtressFunctionMeta = {\n description: 'Report the duration of a video file using ffprobe',\n parameters: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Absolute path to a video file' },\n },\n required: ['path'],\n },\n timeout: '2m',\n}\n\nexport default async function (\n { path }: { path: string },\n context: ButtressFunctionContext,\n): Promise<{ seconds: number }> {\n const { code, stdout, stderr } = await context.spawn('ffprobe', [\n '-v',\n 'error',\n '-show_entries',\n 'format=duration',\n '-of',\n 'default=noprint_wrappers=1:nokey=1',\n path,\n ])\n\n if (code !== 0) throw new Error(`ffprobe failed (${code}): ${stderr}`)\n\n return { seconds: Number(String(stdout).trim()) }\n}\n";
|
|
16
16
|
export declare const EXAMPLE_DAEMON_TEMPLATE = "// Example Buttress daemon function.\n//\n// Rename (or copy) this file to activate it: files starting with \"_\" are\n// ignored. A file with `meta.daemon = true` runs as a daemon \u2014 a\n// long-lived background function. It is not exposed as an MCP tool or\n// endpoint; its live status shows on /status.\n//\n// The default export runs ONCE when the daemon starts, and everything it\n// registers on the context keeps running after it returns:\n//\n// context.setInterval(cb, ms) periodic work (cleared on stop;\n// a throwing callback never stops it)\n// context.bank.subscribe(ids, cb) Data Bank change notifications\n// (needs `bricks buttress bank-key`)\n// context.onEvent(cb) events from other local functions:\n// context.daemons.emit(name, event, data)\n//\n// The daemon stops when this file changes or the server shuts down:\n// context.signal aborts, timers and subscriptions are cleaned up, and a\n// cleanup function returned here gets a final (bounded) run.\n\nexport const meta: ButtressFunctionMeta = {\n description: 'Log a heartbeat and react to Data Bank changes',\n daemon: true,\n}\n\nexport default async function (context: ButtressDaemonContext) {\n let ticks = 0\n\n context.setInterval(() => {\n ticks += 1\n context.log(`heartbeat #${ticks}`)\n }, 60_000)\n\n // Requires stored Bank credentials \u2014 uncomment after `bricks buttress bank-key`:\n // context.bank.subscribe(['some-property-id'], (properties) => {\n // for (const property of properties) {\n // context.log(`bank property changed: ${property.propertyId}`)\n // }\n // })\n\n context.onEvent(({ event, data, source }) => {\n context.log(`event \"${event}\" from ${source}`, data)\n })\n\n context.log('daemon started')\n return () => context.log(`stopping after ${ticks} tick(s)`)\n}\n";
|
package/lib/index.d.ts
CHANGED
|
@@ -20,22 +20,24 @@ export interface StartServerOptions {
|
|
|
20
20
|
config: Config;
|
|
21
21
|
enableOpenAICompat?: boolean;
|
|
22
22
|
enableAnthropicMessages?: boolean;
|
|
23
|
+
enableTypeSafeCompat?: boolean;
|
|
23
24
|
/** Resolved `[functions]` config; null/omitted leaves the feature off. */
|
|
24
25
|
functions?: FunctionsConfig | null;
|
|
25
26
|
/** Resolved `[[agents]]` config; null/omitted leaves the feature off. */
|
|
26
27
|
agents?: AgentsConfig | null;
|
|
27
28
|
}
|
|
28
|
-
export declare const createServer: ({ backend, router, config, enableOpenAICompat, enableAnthropicMessages, functions: functionsConfig, agents: agentsConfig, }: StartServerOptions) => Promise<{
|
|
29
|
+
export declare const createServer: ({ backend, router, config, enableOpenAICompat, enableAnthropicMessages, enableTypeSafeCompat, functions: functionsConfig, agents: agentsConfig, }: StartServerOptions) => Promise<{
|
|
29
30
|
app: AnyElysia;
|
|
30
31
|
config: Config;
|
|
31
32
|
functions: FunctionsService | null;
|
|
32
33
|
agents: AgentsService | null;
|
|
33
34
|
}>;
|
|
34
|
-
export declare const startServer: ({ backend, router, config, enableOpenAICompat, enableAnthropicMessages, functions: functionsConfig, agents: agentsConfig, }: StartServerOptions) => Promise<{
|
|
35
|
+
export declare const startServer: ({ backend, router, config, enableOpenAICompat, enableAnthropicMessages, enableTypeSafeCompat, functions: functionsConfig, agents: agentsConfig, }: StartServerOptions) => Promise<{
|
|
35
36
|
app: AnyElysia;
|
|
36
37
|
port: number;
|
|
37
38
|
openaiEnabled: boolean;
|
|
38
39
|
anthropicMessagesEnabled: boolean;
|
|
40
|
+
typesafeCompatEnabled: boolean;
|
|
39
41
|
functions: FunctionsService | null;
|
|
40
42
|
agents: AgentsService | null;
|
|
41
43
|
autoDiscover: AutodiscoverService | null;
|