lowlander 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +76 -22
  2. package/build/client/client.js +5 -0
  3. package/build/client/client.js.map +1 -1
  4. package/build/dashboard/client/main.d.ts +1 -0
  5. package/build/dashboard/client/main.js +623 -0
  6. package/build/dashboard/client/main.js.map +1 -0
  7. package/build/dashboard/client/shim-server.d.ts +3 -0
  8. package/build/dashboard/client/shim-server.js +2 -0
  9. package/build/dashboard/client/shim-server.js.map +1 -0
  10. package/build/dashboard/dashboard.html +20 -0
  11. package/build/dashboard/index.d.ts +18 -0
  12. package/build/dashboard/index.d.ts.map +1 -0
  13. package/build/dashboard/index.js +50 -0
  14. package/build/dashboard/index.js.map +1 -0
  15. package/build/dashboard/serve.d.ts +18 -0
  16. package/build/dashboard/serve.d.ts.map +1 -0
  17. package/build/dashboard/serve.js +53 -0
  18. package/build/dashboard/serve.js.map +1 -0
  19. package/build/dashboard/server.d.ts +82 -0
  20. package/build/dashboard/server.d.ts.map +1 -0
  21. package/build/dashboard/server.js +248 -0
  22. package/build/dashboard/server.js.map +1 -0
  23. package/build/examples/helloworld/.edinburgh/commit_worker.log +3162 -0
  24. package/build/examples/helloworld/.edinburgh/data.mdb +0 -0
  25. package/build/examples/helloworld/.edinburgh/lock.mdb +0 -0
  26. package/build/examples/helloworld/client/index.html +1 -1
  27. package/build/examples/helloworld/client/js/base.css +1 -0
  28. package/build/examples/helloworld/client/js/base.js +217 -71
  29. package/build/examples/helloworld/client/js/base.js.map +1 -1
  30. package/build/examples/helloworld/server/api.d.ts +4 -2
  31. package/build/examples/helloworld/server/api.d.ts.map +1 -1
  32. package/build/examples/helloworld/server/api.js +19 -8
  33. package/build/examples/helloworld/server/api.js.map +1 -1
  34. package/build/examples/helloworld/server/main.d.ts +1 -1
  35. package/build/examples/helloworld/server/main.d.ts.map +1 -1
  36. package/build/examples/helloworld/server/main.js +6 -17
  37. package/build/examples/helloworld/server/main.js.map +1 -1
  38. package/build/server/password.d.ts +10 -0
  39. package/build/server/password.d.ts.map +1 -0
  40. package/build/server/password.js +38 -0
  41. package/build/server/password.js.map +1 -0
  42. package/build/server/server.d.ts +2 -0
  43. package/build/server/server.d.ts.map +1 -1
  44. package/build/server/server.js +21 -2
  45. package/build/server/server.js.map +1 -1
  46. package/build/server/wshandler.d.ts +7 -1
  47. package/build/server/wshandler.d.ts.map +1 -1
  48. package/build/server/wshandler.js +54 -14
  49. package/build/server/wshandler.js.map +1 -1
  50. package/build/tsconfig.client.tsbuildinfo +1 -1
  51. package/build/tsconfig.server.tsbuildinfo +1 -1
  52. package/client/client.ts +6 -1
  53. package/dashboard/build-bundle.ts +38 -0
  54. package/dashboard/client/index.html +12 -0
  55. package/dashboard/client/main.ts +566 -0
  56. package/dashboard/client/shim-server.ts +5 -0
  57. package/dashboard/index.ts +49 -0
  58. package/dashboard/server.ts +255 -0
  59. package/package.json +22 -11
  60. package/server/server.ts +18 -2
  61. package/server/wshandler.ts +57 -13
  62. package/skill/SKILL.md +52 -4
  63. package/skill/getStreamTypesForModel.md +7 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=shim-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shim-server.js","sourceRoot":"","sources":["../../../dashboard/client/shim-server.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <meta name="lowlander-preauth" content="__LOWLANDER_PREAUTH__" />
7
+ <title>Lowlander Dashboard</title>
8
+ </head>
9
+ <body>
10
+ <script type="module">var de=class{keyProp;tail;symbols;constructor(e){this.keyProp=e,this.tail={},this.symbols=[Symbol(0)]}add(e){if(this.symbols[0]in e)return!1;let r=1+(Math.clz32(Math.random()*4294967295)>>2);for(let f=this.symbols.length;f<r;f++)this.symbols.push(Symbol(f));let n=this.keyProp,i=e[n],s,a=this.tail;for(let f=this.symbols.length-1;f>=0;f--){let c=this.symbols[f];for(;(s=a[c])&&s[n]>i;)a=s;f<r&&(e[c]=a[c],a[c]=e)}return!0}has(e){return this.symbols[0]in e}fetchLast(){let e=this.tail[this.symbols[0]];if(e)return this.remove(e),e}isEmpty(){return this.tail[this.symbols[0]]===void 0}get(e){let r=this.keyProp,n,i=this.tail;for(let s=this.symbols.length-1;s>=0;s--){let a=this.symbols[s];for(;(n=i[a])&&n[r]>e;)i=n}return i[this.symbols[0]]?.[r]===e?i[this.symbols[0]]:void 0}*[Symbol.iterator](){let e=this.symbols[0],r=this.tail[e];for(;r;)yield r,r=r[e]}prev(e){return e[this.symbols[0]]}remove(e){if(!(this.symbols[0]in e))return!1;let r=this.keyProp,n=e[r],i,s=this.tail;for(let a=this.symbols.length-1;a>=0;a--){let f=this.symbols[a];for(;(i=s[f])&&i[r]>=n&&i!==e;)s=i;i===e&&(s[f]=i[f],delete i[f])}return i===e}clear(){let e=this.symbols[0],r=this.tail;for(;r;){let n=r[e];for(let i of this.symbols){if(!(i in r))break;delete r[i]}r=n}this.tail={}}},U,W=0,q;function Ve(t){if(!U)U=new de("prio"),queueMicrotask(gt);else if(!(W&1)&&(W++,W>98))throw new Error("Too many recursive updates from observes");U.add(t)}function gt(){let t=Date.now();for(;U;){let e=U.fetchLast();if(!e)break;W&1&&W++,e.queueRun()}U=void 0,W=0,t=Date.now()-t,t>9&&console.debug(`Aberdeen queue took ${t}ms`)}function ft(t){let e="";for(let r of t){if(typeof r=="string"){e+=`${r}`;continue}if(typeof r!="number")throw new Error("onEach() sort key must be a string, number or an array of such");let n="",i=Math.abs(Math.round(r)),s=r<0;for(;i>0;)n=String.fromCharCode(s?65534-i%65533:2+i%65533)+n,i=Math.floor(i/65533);e+=String.fromCharCode(128+(s?-n.length:n.length))+n}return e}function Bt(t){let e="";for(let r=0;r<t.length;r++)e+=String.fromCodePoint(65535-t.charCodeAt(r));return e}var pt=0,he=class{prio=--pt;remove(){let e=this.getLastNode();e&&pe(e,this.getPrecedingNode()),this.delete()}},Ne=class{queueRun;prio=--pt;constructor(e){this.queueRun=e,Ve(this)}},F=class extends he{cleaners;changes;constructor(e=[]){super(),this.cleaners=e}lastChild;redraw(){}getLastNode(){return ie(this.lastChild)}delete(){for(let e of this.cleaners)typeof e=="function"?e():e.delete(this);this.cleaners.length=0,U?.remove(this),this.lastChild=void 0}onChange(e,r,n,i){this.changes||(this.changes=new Map,Ve(this));let s=this.changes.get(e);s||(s=new Map,this.changes.set(e,s)),s.has(r)?s.get(r)===n&&s.delete(r):s.set(r,i)}fetchHasChanges(){if(!this.changes)return!1;for(let e of this.changes.values())if(e.size>0)return delete this.changes,!0;return delete this.changes,!1}queueRun(){this.fetchHasChanges()&&(this.remove(),q=this,this.redraw(),q=void 0)}getInsertAfterNode(){return this.getLastNode()||this.getPrecedingNode()}getChildPrevSibling(){return this.lastChild}},se=class extends F{el;svg;prevSibling;constructor(e,r,n=!1){super(n?u.cleaners:[]),this.el=e,this.svg=r,e===u.el?(this.prevSibling=u.getChildPrevSibling(),u.lastChild=this):this.prevSibling=e.lastChild||void 0,n||u.cleaners.push(this)}getPrecedingNode(){return ie(this.prevSibling)}getChildPrevSibling(){return this.lastChild||this.prevSibling}},ye=class extends se{renderer;constructor(e,r,n){super(e,r),this.renderer=n,this.redraw()}redraw(){let e=u;u=this;try{this.renderer()}catch(r){Je(r,!0)}u=e}},ge=class extends F{el=document.body;svg=!1;getPrecedingNode(){}},Te=class extends F{el;renderer;svg;constructor(e,r){super(),this.el=e,this.renderer=r,this.svg=e.namespaceURI==="http://www.w3.org/2000/svg",this.redraw(),u.cleaners.push(this)}redraw(){ye.prototype.redraw.call(this)}getPrecedingNode(){}delete(){pe(this.getLastNode(),this.getPrecedingNode()),super.delete()}remove(){this.delete()}};function pe(t,e){for(;t&&t!==e;){let r=t.previousSibling,n=qe.get(t);n&&t instanceof Element?n!==!0&&(typeof n=="function"?n(t):Gt(t,n),qe.set(t,!0)):t.remove(),t=r}}function ie(t){return!t||t instanceof Node?t:t.getLastNode()||t.getPrecedingNode()}var je=class extends se{renderer;result=S({value:void 0});constructor(e){super(u.el,u.svg),this.renderer=e,this.redraw()}redraw(){let e=u;u=this;try{this.result.value=this.renderer()}catch(r){Je(r,!0)}u=e}},Le=class extends se{key;target;svg=!1;constructor(e,r,n){super(e,e.namespaceURI==="http://www.w3.org/2000/svg"),this.key=r,this.target=n,this.redraw()}redraw(){let e=u;u=this,$(this.el,this.key,this.target.value),u=e}},Ue=class extends he{renderer;makeSortKey;parentElement=u.el;prevSibling;target;byIndex=new Map;sortedSet=new de("sortKey");changedIndexes=new Map;constructor(e,r,n){super(),this.renderer=r,this.makeSortKey=n;let i=this.target=e[y]||e;if(w(i,A,this),this.prevSibling=u.getChildPrevSibling(),u.lastChild=this,u.cleaners.push(this),i instanceof Array)for(let s=0;s<i.length;s++)new ee(this,s,!1);else for(let s of i instanceof Map?i.keys():i instanceof Set?i.values():Object.keys(i))new ee(this,s,!1)}getPrecedingNode(){return ie(this.prevSibling)}onChange(e,r,n,i){(!(e instanceof Array)||typeof r=="number")&&(this.changedIndexes.has(r)?this.changedIndexes.get(r)===n&&this.changedIndexes.delete(r):(this.changedIndexes.set(r,i),Ve(this)))}queueRun(){let e=this.changedIndexes;this.changedIndexes=new Map;for(let r of e.keys()){let n=this.byIndex.get(r);n&&n.remove(),(this.target instanceof Set||this.target instanceof Map?this.target.has(r):r in this.target)?new ee(this,r,!0):this.byIndex.delete(r)}q=void 0}delete(){for(let e of this.byIndex.values())e.delete();U?.remove(this),this.byIndex.clear(),setTimeout(()=>{this.sortedSet.clear()},1)}getLastNode(){for(let e of this.sortedSet){let r=e.getActualLastNode();if(r)return r}}},ee=class extends F{parent;itemIndex;sortKey;el;svg;constructor(e,r,n){super(),this.parent=e,this.itemIndex=r,this.el=e.parentElement,this.svg=u.svg,this.parent.byIndex.set(this.itemIndex,this),this.lastChild=this,n&&(q=this),this.redraw()}getPrecedingNode(){this.parent.sortedSet.add(this);let e=this.parent.sortedSet.prev(this);return e?ie(e.lastChild):this.parent.getPrecedingNode()}getLastNode(){return this.getPrecedingNode()}getActualLastNode(){let e=this.lastChild;for(;e&&e!==this;){if(e instanceof Node)return e;let r=e.getLastNode();if(r)return r;e=e.getPrecedingNode()}}queueRun(){if(u!==G&&yt(4),!!this.fetchHasChanges()){if(this.sortKey!==void 0){let e=this.getActualLastNode();e&&pe(e,this.getPrecedingNode())}this.delete(),this.lastChild=this,q=this,this.redraw(),q=void 0}}redraw(){let e,r=this.parent.target,n=this.itemIndex;r instanceof Set?e=n=S(n):r instanceof Map?(e=S(r.get(n)),n=S(n)):e=S(r[n]);let i=u;u=this;let s;try{this.parent.makeSortKey?s=this.parent.makeSortKey(e,n):s=n,s instanceof Array?s=ft(s):typeof s!="string"&&s!=null&&(s=ft([s])),this.sortKey!==s&&(this.parent.sortedSet.remove(this),this.sortKey=s),s!=null&&this.parent.renderer(e,n)}catch(a){Je(a,s!=null)}u=i}getInsertAfterNode(){return this.sortKey==null&&yt(1),ie(this.lastChild)}remove(){if(this.sortKey!==void 0){let e=this.getActualLastNode();e&&pe(e,this.getPrecedingNode()),this.parent.sortedSet.remove(this),this.sortKey=void 0}this.delete()}};function K(t,e){if(t!==u.el){t.appendChild(e);return}let r=u.el,n=u.getInsertAfterNode();r.insertBefore(e,n?n.nextSibling:r.firstChild),u.lastChild=e}var G=new ge,u=G;function We(t){let e=u;u=new ge;try{return t()}finally{u=e}}var A=Symbol("any"),y=Symbol("target"),I=Symbol("mapSize"),_e=new WeakMap,oe=0;function w(t,e,r=u){if(r===G||oe)return;let n=_e.get(t);if(n||_e.set(t,n=new Map),e!==A&&n.get(A)?.has(r))return;let i=n.get(e);i||n.set(e,i=new Set),!i.has(r)&&(i.add(r),r===u?u.cleaners.push(i):u.cleaners.push(()=>{i.delete(r)}))}function J(t,e,r){if(!t||typeof t!="object")throw new Error("A.onEach requires an object");t=t[y]||t,new Ue(t,e,r)}function Ke(t){for(let e of Object.keys(t))return!1;return!0}var b=Symbol("empty");function le(t){let e=t[y]||t,r=u;if(e instanceof Array)return w(e,"length",(i,s,a)=>{!s!=!a&&r.onChange(e,b,!s,!a)}),!e.length;if(e instanceof Map||e instanceof Set)return w(e,I,(i,s,a)=>{!s!=!a&&r.onChange(e,b,!s,!a)}),!e.size;let n=Ke(e);return w(e,A,(i,s,a)=>{if(s===b!=(a===b)){let f=Ke(e);r.onChange(e,b,f,n),n=f}}),n}function qt(t){if(t instanceof Array)return me(t,"length");if(t instanceof Map||t instanceof Set)return me(t,"size");let e=t[y]||t,r=0;for(let i of Object.keys(e))e[i]!==void 0&&r++;let n=Pe(r);return w(e,A,(i,s,a)=>{a===s||(a===b?n.value=++r:s===b&&(n.value=--r))}),n}function Dt(t,e,r,n){if(r===n&&r!==void 0)return;let i=_e.get(t);if(i!==void 0)for(let s of[e,A]){let a=i.get(s);if(a)for(let f of a)typeof f=="function"?f(e,r,n):f.onChange(t,e,r,n)}}var x=Dt,zt={get(t,e){return e===y?t:(w(t,e),S(t[e]))},set(t,e,r){typeof r=="object"&&r&&(r=r[y]||r);let n=t.hasOwnProperty(e)?t[e]:b;return r!==n&&(t[e]=r,x(t,e,r,n)),!0},deleteProperty(t,e){let r=t.hasOwnProperty(e)?t[e]:b;return delete t[e],x(t,e,b,r),!0},has(t,e){return w(t,e),t.hasOwnProperty(e)},ownKeys(t){return w(t,A),Reflect.ownKeys(t)}};function Vt(t,e,r){typeof r=="object"&&r&&(r=r[y]||r);let n=t[e];if(n===void 0&&!t.hasOwnProperty(e)&&(n=b),r!==n){let i=t.length;if(e==="length"){t.length=r;for(let s=r;s<i;s++)x(t,s,b,t[s])}else{if(typeof e=="string"){let s=0|e;String(s)===e&&s>=0&&(e=s)}t[e]=r,x(t,e,r,n)}t.length!==i&&x(t,"length",t.length,i)}return!0}var Wt={get(t,e){if(e===y)return t;if(typeof e=="string"){let r=0|e;String(r)===e&&r>=0&&(e=r)}return w(t,e),S(t[e])},set:Vt,deleteProperty(t,e){if(typeof e=="string"){let n=0|e;String(n)===e&&n>=0&&(e=n)}let r=t[e];return r===void 0&&!t.hasOwnProperty(e)&&(r=b),delete t[e],x(t,e,b,r),!0}};function te(t){return{[Symbol.iterator](){return this},next(){let e=t.next();return e.done?e:{done:!1,value:S(e.value)}}}}function Be(t){return{[Symbol.iterator](){return this},next(){let e=t.next();return e.done?e:{done:!1,value:[S(e.value[0]),S(e.value[1])]}}}}function L(t){return typeof t=="object"&&t&&t[y]||t}var ct={get(t){let e=this[y];return t=L(t),w(e,t),S(e.get(t))},set(t,e){let r=this[y];t=L(t),e=L(e);let n=r.get(t);if(n===void 0&&!r.has(t)&&(n=b),e!==n){let i=r.size;r.set(t,e),x(r,t,e,n),x(r,I,r.size,i)}return this},delete(t){let e=this[y];t=L(t);let r=e.get(t);r===void 0&&!e.has(t)&&(r=b);let n=e.delete(t);return n&&(x(e,t,b,r),x(e,I,e.size,e.size+1)),n},clear(){let t=this[y],e=t.size;for(let r of t.keys())x(t,r,void 0,t.get(r));t.clear(),x(t,I,0,e)},has(t){let e=this[y];return t=L(t),w(e,t),e.has(t)},keys(){let t=this[y];return w(t,A),te(t.keys())},values(){let t=this[y];return w(t,A),te(t.values())},entries(){let t=this[y];return w(t,A),Be(t.entries())},[Symbol.iterator](){let t=this[y];return w(t,A),Be(t[Symbol.iterator]())}},lt={add(t){let e=this[y];if(t=L(t),!e.has(t)){let r=e.size;e.add(t),x(e,t,t,b),x(e,I,e.size,r)}return this},delete(t){let e=this[y];if(t=L(t),!e.has(t))return!1;let r=e.size;return e.delete(t),x(e,t,b,t),x(e,I,e.size,r),!0},clear(){let t=this[y],e=t.size;if(e){for(let r of t.values())x(t,r,b,r);t.clear(),x(t,I,0,e)}},has(t){let e=this[y];return t=L(t),w(e,t),e.has(t)},keys(){let t=this[y];return w(t,A),te(t.keys())},values(){let t=this[y];return w(t,A),te(t.values())},entries(){let t=this[y];return w(t,A),Be(t.entries())},[Symbol.iterator](){let t=this[y];return w(t,A),te(t[Symbol.iterator]())}},Ft={get(t,e){return e===y?t:ct.hasOwnProperty(e)?ct[e]:e==="size"?(w(t,I),t.size):t[e]}},Ht={get(t,e){return e===y?t:lt.hasOwnProperty(e)?lt[e]:e==="size"?(w(t,I),t.size):t[e]}},ut=new WeakMap;function S(t){if(typeof t!="object"||!t||t[y]!==void 0||t[_]||t instanceof Date)return t;let e=ut.get(t);if(e)return e;let r;return t instanceof Array?r=Wt:t instanceof Map?r=Ft:t instanceof Set?r=Ht:r=zt,e=new Proxy(t,r),ut.set(t,e),e}function Pe(t){if(t instanceof Promise){let e=S({busy:!0});return t.then(r=>{e.value=r,e.busy=!1}).catch(r=>{e.error=r,e.busy=!1}),e}return S(typeof t=="object"&&t!==null?t:{value:t})}function Fe(t){return t&&(t[y]||t)}var qe=new WeakMap;function Gt(t,e){let r=e.split(".").filter(n=>n);t.classList.add(...r),setTimeout(()=>t.remove(),2e3)}function Jt(t,e,r){return arguments.length>2?bt(t,e,r,0):He(t,e,0)}function bt(t,e,r,n){let i=$t(t,e);return r===i?!1:typeof i=="object"&&i!==null&&typeof r=="object"&&r!==null&&i.constructor===r.constructor?He(i,r,n):(r=De(r),t instanceof Map?t.set(e,r):t[e]=De(r),!0)}function Yt(t,e,r){return arguments.length>2?bt(t,e,r,be):He(t,e,be)}function He(t,e,r){let n=t[y];return n&&(t=n,r|=j),n=e[y],n&&(e=n,u!==G&&!oe&&(r|=B)),ue(t,e,r)}function ue(t,e,r){r&B&&w(e,A);let n=!1;if(e instanceof Array&&t instanceof Array){let i=t.length,s=e.length;for(let a=0;a<s;a++){let f=t[a];f===void 0&&!t.hasOwnProperty(a)&&(f=b);let c=e[a];if(c===void 0&&!e.hasOwnProperty(a))delete t[a],r&j&&x(t,a,b,f),n=!0;else if(f!==c){if(typeof c=="object"&&c!==null){if(typeof f=="object"&&f!==null&&c.constructor===f.constructor&&!(_ in c)){n=ue(f,c,r)||n;continue}c=ne(c,r&B)}t[a]=c,r&j&&x(t,a,c,f),n=!0}}if(s!==i){if(r&j){for(let a=s;a<i;a++){let f=t[a];delete t[a],x(t,a,b,f)}t.length=s,x(t,"length",s,i)}else t.length=s;n=!0}}else if(e instanceof Map&&t instanceof Map){for(let i of e.keys()){let s=e.get(i),a=t.get(i);if(a===void 0&&!t.has(i)&&(a=b),a!==s){if(typeof s=="object"&&s!==null){if(typeof a=="object"&&a!==null&&s.constructor===a.constructor&&!(_ in s)){n=ue(a,s,r)||n;continue}s=ne(s,r&B)}t.set(i,s),r&j&&x(t,i,s,a),n=!0}}if(!(r&be)){for(let i of t.keys())if(!e.has(i)){let s=t.get(i);t.delete(i),r&j&&x(t,i,b,s),n=!0}}}else if(e.constructor===t.constructor){for(let i of Object.keys(e)){let s=e[i],a=t.hasOwnProperty(i)?t[i]:b;if(a!==s){if(typeof s=="object"&&s!==null){if(typeof a=="object"&&a!==null&&s.constructor===a.constructor&&!(_ in s)){n=ue(a,s,r)||n;continue}s=ne(s,r&B)}t[i]=s,r&j&&x(t,i,s,a),n=!0}}if(!(r&be)){for(let i of Object.keys(t))if(!e.hasOwnProperty(i)){let s=t[i];delete t[i],r&j&&s!==void 0&&x(t,i,b,s),n=!0}}}else throw new Error(`Incompatible or non-object types: ${e?.constructor?.name||typeof e} vs ${t?.constructor?.name||typeof t}`);return n}var be=1,B=32,j=64,_=Symbol("OPAQUE"),Qt=_;Promise.prototype[_]=!0;var re=S({});function Xt(t=1,e="rem"){for(let r=0;r<=12;r++)re[r]=2**(r-3)*t+e}var Zt=/(\burl\([^)]*\))|("[^"]*")|(^| )\$([\w-]+)/g,mt=/^\d/;function xt(t){return t.indexOf("$")<0?t:t.replace(Zt,(e,r,n,i,s)=>{if(r||n)return e;let a=mt.test(s)?`m${s}`:s;return`${i}var(--${a})`})}var fe;function er(){if(!fe){if(typeof window>"u"||!window.matchMedia)return!1;let t=window.matchMedia("(prefers-color-scheme: dark)");fe=Pe({value:t.matches}),t.addEventListener("change",()=>fe.value=t.matches)}return fe.value}function ne(t,e){if(_ in t)return t;if(e&B&&w(t,A),t instanceof Array)return t.map(n=>Oe(n,e));if(t instanceof Map){let n=new Map;for(let[i,s]of t)n.set(i,Oe(s,e));return n}let r=Object.create(Object.getPrototypeOf(t));for(let n of Object.keys(t))r[n]=Oe(t[n],e);return r}function Oe(t,e){return typeof t=="object"&&t!==null?ne(t,e):t}function De(t){if(typeof t!="object"||t===null)return t;let e=0,r=t[y];return r&&(t=r,u!==G&&!oe&&(e=B)),ne(t,e)}var tr={get(t,e){if(e===y)return me(Fe(t.proxy),t.index);if(e==="value")return t.proxy[t.index]},set(t,e,r){return e==="value"?(t.proxy[t.index]=r,!0):!1}};function me(t,e){return new Proxy({proxy:t,index:e},tr)}function rr(t,e){let r,n,i=t.getAttribute("type"),s=Fe(e).value;i==="checkbox"?(s===void 0&&(e.value=t.checked),r=()=>{t.checked=e.value},n=()=>{e.value=t.checked}):i==="radio"?(s===void 0&&t.checked&&(e.value=t.value),r=()=>{t.checked=e.value===t.value},n=()=>{t.checked&&(e.value=t.value)}):(n=()=>{e.value=i==="number"||i==="range"?t.value===""?null:+t.value:t.value},s===void 0&&n(),r=()=>{t.value=e.value,t.tagName==="SELECT"&&t.value!=e.value&&new Ne(()=>t.value=e.value)}),Ct(r),t.addEventListener("input",n),k(()=>{t.removeEventListener("input",n)})}var Me=/\*\*(.+?)\*\*|\*(.+?)\*|`(.+?)`|\[(.+?)\]\((.+?)\)/g,xe={create:(t,e)=>{if(u===q)if(typeof e=="function")e(t);else{let r=e.split(".").filter(n=>n);t.classList.add(...r),(async()=>(t.offsetHeight,t.classList.remove(...r)))()}},destroy:(t,e)=>{qe.set(t,e)},html:(t,e)=>{if(t===u.el&&!t.firstChild)t.innerHTML=`${e}`;else{let r=document.createElement(u.el.tagName);for(r.innerHTML=`${e}`;r.firstChild;)K(t,r.firstChild)}},text:(t,e)=>{K(t,document.createTextNode(e))},rich:(t,e)=>{let r=0,n,i=String(e);for(Me.lastIndex=0;(n=Me.exec(i))!==null;){n.index>r&&K(t,document.createTextNode(i.slice(r,n.index)));let s;if(n[1]!==void 0)s=document.createElement("strong"),s.textContent=n[1];else if(n[2]!==void 0)s=document.createElement("em"),s.textContent=n[2];else if(n[3]!==void 0)s=document.createElement("code"),s.textContent=n[3];else{let a=document.createElement("a");a.textContent=n[4],a.href=n[5],s=a}K(t,s),r=Me.lastIndex}r<i.length&&K(t,document.createTextNode(i.slice(r)))}};function nr(){xe.create=xe.destroy=()=>{}}function C(...t){let e=u.el,r=u.svg,n=t.length;for(let i=0;i<n;i++){let s=t[i];if(!(s==null||s===!1))if(typeof s=="string"){let a=s.length,f=0;for(let c=0;c<a;c=f+1){f=V(s," .=:#",c);let d=s[f];if(d===":"){let l="$"+s.substring(c,f);if(f+1>=a){$(e,l,t[++i]);break}if(s[f+1]===" "){let g=V(s,";",f+2),h=s.substring(f+2,g).trim();$(e,l,h),f=g}else{let g=V(s," ",f+1),h=s.substring(f+1,g);$(e,l,h),f=g}}else if(d==="="){let l=s.substring(c,f);if(f+1>=a){$(e,l,t[++i]);break}let g=s[f+1];if(g==='"'||g==="'"||g==="`"){let h=V(s,g,f+2),v=s.substring(f+2,h);$(e,l,v),f=h}else{let h=V(s," ",f+1),v=s.substring(f+1,h);$(e,l,v),f=h}}else{if(f>c){let l=s.substring(c,f);r||=l==="svg";let g=r?document.createElementNS("http://www.w3.org/2000/svg",l):document.createElement(l);K(e,g),e=g}if(d==="#"){let l=f+1<a?s.substring(f+1):t[++i];$(e,"text",l);break}if(d==="."){let l=V(s," #=.",f+1);if(s[l]==="="&&l+1>=a)$(e,s.substring(f,l),t[++i]),f=l;else{let g=s.substring(f+1,l);e.classList.add(g||t[++i]),f=l-1}}}}}else if(typeof s=="object")if(s.constructor!==Object)if(s instanceof Node)K(e,s),s instanceof Element&&(e=s,r=s.namespaceURI==="http://www.w3.org/2000/svg");else throw new Error(`Unexpected argument: ${s}`);else for(let a of Object.keys(s))$(e,a,s[a]);else if(typeof s=="function")new ye(e,r,s);else throw new Error(`Unexpected argument: ${s}`)}return e}function V(t,e,r){if(e.length===1){let i=t.indexOf(e,r);return i>=0?i:t.length}let n=t.length;for(let i=r;i<n;i++)if(e.indexOf(t[i])>=0)return i;return n}var wt=0;function sr(t){let e=`.AbdStl${++wt}`,r=typeof t=="string"?ze(t,e):we(t,e);if(r){let n=Pt++;H[n]=r,k(()=>delete H[n])}return e}var H=Pe({}),Pt=0;function dt(t,e){let r=[];for(let n of t.split(","))for(let i of e.split(","))r.push(i.includes("&")?i.trim().replace(/&/g,n):`${n} ${i.trim()}`.trim());return r.join(",")}function we(t,e){let r="";for(let[n,i]of Object.entries(t))i&&typeof i=="object"?n.startsWith("@")?r+=`${n}{
11
+ ${we(i,e)}}
12
+ `:r+=we(i,dt(e,n)):typeof i=="string"&&(n.startsWith("@")?r+=`${n}{
13
+ ${ze(i,e)}}
14
+ `:r+=ze(i,dt(e,n)));return r}var ir=/-([a-z])/g;function ht(t){return t.replace(ir,(e,r)=>r.toUpperCase())}var or=/^[a-zA-Z-]+$/;function ze(t,e){let r="";for(let n=0,i=t.length;n<i;){for(;t[n]===" ";)n++;if(n>=i)break;let s=t.indexOf(":",n);if(s===-1)throw new Error(`Trailing data in style string: "${t.substring(n)}"`);let a=t.substring(n,s);if(!or.test(a))throw new Error(`Invalid CSS key: "${a}" in style string: "${t}"`);n=s+1;let f;if(t[n]===" "){n++;let l=t.indexOf(";",n);f=t.substring(n,l===-1?i:l).trim(),n=l===-1?i:l+1}else{let l=t.indexOf(" ",n);f=t.substring(n,l===-1?i:l),n=l===-1?i:l}let c=xt(f),d=vt[a]||a;r+=typeof d=="string"?`${d}:${c};`:d.map(l=>`${l}:${c};`).join("")}return r?`${e}{${r}}
15
+ `:""}function ar(t){let e=we(t,"");if(e){let r=Pt++;H[r]=e,k(()=>delete H[r])}}var vt={m:"margin",mt:"margin-top",mb:"margin-bottom",ml:"margin-left",mr:"margin-right",mh:["margin-left","margin-right"],mv:["margin-top","margin-bottom"],p:"padding",pt:"padding-top",pb:"padding-bottom",pl:"padding-left",pr:"padding-right",ph:["padding-left","padding-right"],pv:["padding-top","padding-bottom"],w:"width",h:"height",bg:"background",fg:"color",r:"border-radius"};function $(t,e,r){if(typeof r=="object"&&r!==null&&r[y])e==="bind"?rr(t,r):new Le(t,e,r);else if(e[0]==="."){let n=e.substring(1).split(".");r?t.classList.add(...n):t.classList.remove(...n)}else if(e[0]==="$"){e=e.substring(1);let n=r==null||r===!1?"":typeof r=="string"?xt(r):String(r),i=vt[e]||e;if(typeof i=="string")t.style[ht(i)]=n;else for(let s of i)t.style[ht(s)]=n}else r==null||(e in xe?xe[e](t,r):typeof r=="function"?(t.addEventListener(e,r),t===u.el&&k(()=>t.removeEventListener(e,r))):r===!0||r===!1||e==="value"||e==="selectedIndex"?t[e]=r:t.setAttribute(e,r))}function St(t){return console.error("Error while in Aberdeen render:",t),!0}var At=St;function fr(t){At=t||St}function k(t){u.cleaners.push(t)}function Ct(t){return new je(t).result}function Rt(t,e){new Te(t,e)}function cr(){G.remove(),wt=0}function $t(t,e){oe++;try{return arguments.length===1?t():t instanceof Map?t.get(e):t[e]}finally{oe--}}function lr(t,e){let r;return t instanceof Array?r=S([]):t instanceof Map?r=S(new Map):r=S({}),J(t,(n,i)=>{let s=e(n,i);s!==void 0&&(r instanceof Map?(r.set(i,s),k(()=>{r.delete(i)})):(r[i]=s,k(()=>{delete r[i]})))}),r}function ur(t,e){let r=S({});return J(t,(n,i)=>{let s=e(n,i);if(s){for(let a of Object.keys(s))r[a]=s[a];k(()=>{for(let a of Object.keys(s))delete r[a]})}}),r}function dr(t,e){let r={},n=S(r);return J(t,(i,s)=>{let a=e(i,s);if(a!=null){let f=a instanceof Array?a:[a];if(f.length){for(let c of f)r[c]?n[c][s]=i:n[c]={[s]:i};k(()=>{for(let c of f)delete n[c][s],Ke(r[c])&&delete n[c]})}}}),n}function hr(t){let e=ce;ce||=new Set;try{kt(t,ce)}finally{ce=e}return t}var ce;function kt(t,e){if(t&&typeof t=="object"){let r=t.constructor.name||"unknown object";if(e.has(t)){C(`#<${r}: circular reference>`);return}e.add(t),k(()=>e.delete(t));let n=t[Ge];n!==void 0?typeof n=="function"?n.call(t):C(`#${n}`):C(`#<${r}>`,"ul",()=>{J(t,(i,s)=>{C("li",()=>{t instanceof Array||C(`#${JSON.stringify(s)}: `),kt(i,e)})})})}else C(t===void 0?"#undefined":"#"+JSON.stringify(t))}var Ge=Symbol("CUSTOM_DUMP");Date.prototype[Ge]=function(){C("#<Date> "+this.toISOString())};function yt(t){throw new Error(`Aberdeen internal error ${t}`)}function Je(t,e){try{At(t)===!1&&(e=!1)}catch(r){console.error(r)}try{e&&C("div.aberdeen-error#Error")}catch{}}typeof document<"u"&&We(()=>{C(()=>{le(H)&&le(re)||Rt(document.head,()=>{C("style.abd",()=>{J(H,t=>{C("#",t)}),C(()=>{if(le(re))return;let t=":root{";for(let[e,r]of Object.entries(re)){let n=mt.test(String(e))?`m${e}`:e;t+=`--${n}:${r};`}t+=`}
16
+ `,C("#",t)})})})})});var o=Object.assign(C,{clean:k,clone:De,copy:Jt,count:qt,cssVars:re,CUSTOM_DUMP:Ge,darkMode:er,derive:Ct,disableCreateDestroy:nr,dump:hr,insertCss:sr,insertGlobalCss:ar,invertString:Bt,isEmpty:le,map:lr,merge:Yt,mount:Rt,multiMap:ur,OPAQUE:_,NO_COPY:Qt,onEach:J,partition:dr,peek:$t,proxy:Pe,ref:me,runQueue:gt,setErrorHandler:fr,setSpacingCssVars:Xt,unmountAll:cr,unproxy:Fe});var ve=()=>{};var Qe=typeof ABERDEEN_FAKE_WINDOW<"u"?ABERDEEN_FAKE_WINDOW:window,Y=Qe.location,M=Qe.history;function Et(){return Xe({path:Y.pathname,hash:Y.hash,search:Object.fromEntries(new URLSearchParams(Y.search)),state:M.state?.state||{}},"load",(M.state?.stack?.length||0)+1)}function Ye(t,e,r){if(t===e)return!0;if(typeof t!="object"||!t||typeof e!="object"||!e||t.constructor!==e.constructor)return!1;if(e instanceof Array){if(t.length!==e.length)return!1;for(let n=0;n<e.length;n++)if(!Ye(t[n],e[n],r))return!1}else{for(let n of Object.keys(e))if(!Ye(t[n],e[n],r))return!1;if(!r){for(let n of Object.keys(t))if(!e.hasOwnProperty(n))return!1}}return!0}function It(t){let e=new URLSearchParams(t.search).toString();return(e?`${t.path}?${e}`:t.path)+t.hash}function Xe(t,e,r){let n=t.path||(t.p||[]).join("/")||"/";return n=(""+n).replace(/\/+$/,""),n.startsWith("/")||(n=`/${n}`),{path:n,hash:t.hash&&t.hash!=="#"?t.hash.startsWith("#")?t.hash:"#"+t.hash:"",p:n.length>1?n.slice(1).replace(/\/+$/,"").split("/"):[],nav:e,search:typeof t.search=="object"&&t.search?o.clone(t.search):{},state:typeof t.state=="object"&&t.state?o.clone(t.state):{},depth:r}}function yr(t){if(typeof t=="string"?t={path:t}:t instanceof Array&&(t={p:t}),t.p&&(t.p=t.p.map(String)),t.search)for(let e of Object.keys(t.search))t.search[e]=String(t.search[e]);return t}function Se(t,e="go"){Ot=0,O=(M.state?.stack||[]).concat(JSON.stringify(o.unproxy(P)));let n=Xe(yr(t),e,O.length+1);o.copy(P,n),ve(e,n),M.pushState({state:n.state,stack:O},"",It(n)),o.runQueue()}var O,Ot=0;var P=o.proxy({});function gr(){O=M.state?.stack||[];let t=Et();ve("initial",t),o.copy(o.unproxy(P),t)}gr();Qe.addEventListener("popstate",function(t){Ot=0;let e=Et(),r=M.state?.stack||[];if(r.length!==O.length){let n=Math.min(O.length,r.length)-1;(n<0||r[n]===O[n])&&(e.nav=r.length<O.length?"back":"forward")}O=r,ve("popstate",e),o.copy(P,e),o.runQueue()});We(()=>{o(()=>{P.path="/"+Array.from(P.p).join("/")}),o(()=>{let t=M.state?.stack||[],e=Xe(P,o.unproxy(P).nav,t.length+1);o.copy(P,e);let r={state:e.state,stack:t},n=It(e);(n!==Y.pathname+Y.search+Y.hash||!Ye(M.state,r,!1))&&(ve("replaceState",e,r,n),M.replaceState(r,"",n))})});var pr=new TextEncoder,Ze=new TextDecoder("utf-8",{fatal:!0}),Q=Symbol("EOD"),Re="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$",Tt=new Uint8Array(128).fill(255);for(let t=0;t<Re.length;++t)Tt[Re.charCodeAt(t)]=t;var et=typeof process<"u"&&process?.stdout?.isTTY,Ae=et?["\x1B[32m","\x1B[33m","\x1B[34m","\x1B[35m"]:[""],br=et?"\x1B[0m":"",Mt=et?"\x1B[31m":"",Nt={array:5,object:6,map:7,set:8,end:9},Ce=0,mr=typeof process<"u"?!!process.env?.DATAPACK_EXTENDED_LOGGING:!1,N=class t{buffer;dataView;readPos=0;writePos=0;static EOD=Q;get _buffer(){return this.buffer}constructor(e=1900){e instanceof Uint8Array?(this.buffer=e,this.writePos=e.length):this.buffer=new Uint8Array(e)}writeMultiByteNumber(e,r,n=!1,i=!1){let s=0,a=e;for(;a>0;)s++,a=Math.floor(a/256);let f=i?~s&31:s;this.buffer[this.writePos++]=r<<5|f;let c=1;for(let d=0;d<s;d++)c*=256;for(let d=0;d<s;d++){c=Math.floor(c/256);let l=Math.floor(e/c)%256;n&&(l^=255),this.buffer[this.writePos++]=l}}readMultiByteNumber(e,r=!1){this.readPos+e>this.writePos&&this.notEnoughData("number");let n=0,i=1;for(let s=e-1;s>=0;s--){let a=this.buffer[this.readPos+s];r&&(a^=255),n+=a*i,i*=256}return this.readPos+=e,n}notEnoughData(e){throw new Error(`Not enough data to read a ${e} at position ${this.readPos} in
17
+ ${this.toString(!0)}`)}write(e){if(this.ensureCapacity(33),typeof e=="number")Number.isInteger(e)&&e<=Number.MAX_SAFE_INTEGER&&e>=Number.MIN_SAFE_INTEGER?e>=0?e<32?this.buffer[this.writePos++]=32|e:e<64?this.buffer[this.writePos++]=64|e-32:this.writeMultiByteNumber(e-64,3):this.writeMultiByteNumber(-e,0,!0,!0):(this.buffer[this.writePos++]=128,this.dataView||=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength),this.dataView.setFloat64(this.writePos,e),this.writePos+=8);else if(e===void 0)this.buffer[this.writePos++]=129;else if(e===null)this.buffer[this.writePos++]=130;else if(e===!0)this.buffer[this.writePos++]=131;else if(e===!1)this.buffer[this.writePos++]=132;else if(typeof e=="string"){let r=pr.encode(e);r.length<32?this.buffer[this.writePos++]=160|r.length:this.writeMultiByteNumber(r.length,6),this.ensureCapacity(r.length),this.buffer.set(r,this.writePos),this.writePos+=r.length}else if(e instanceof Uint8Array)this.writeMultiByteNumber(e.length,7),this.ensureCapacity(e.length),this.buffer.set(e,this.writePos),this.writePos+=e.length;else if(Array.isArray(e)||typeof e.length=="number"&&typeof e[Symbol.iterator]=="function"){this.buffer[this.writePos++]=133;for(let r of e)this.write(r);this.buffer[this.writePos++]=137}else if(e instanceof Map){this.buffer[this.writePos++]=135;for(let[r,n]of e)this.write(r),this.write(n);this.buffer[this.writePos++]=137}else if(e instanceof Set){this.buffer[this.writePos++]=136;for(let r of e)this.write(r);this.buffer[this.writePos++]=137}else if(e instanceof Date)this.buffer[this.writePos++]=140,this.write(Math.floor(e.getTime()/1e3));else if(typeof e=="object")e instanceof ae?this.writeCustom(e.name,e.data):typeof e.toDataPack=="function"?e.toDataPack(this):this.writeAsObject(e);else throw new Error(`Unsupported data type: ${typeof e}`);return this}read(e){if(this.readPos>this.writePos)throw new Error("Not enough data");let r=this.buffer[this.readPos++],n=r>>5&7,i=r&31;switch(n){case 0:{let s=~i&31;return-this.readMultiByteNumber(s,!0)}case 1:return i;case 2:return i+32;case 3:return this.readMultiByteNumber(i)+64;case 4:switch(i){case 0:{this.readPos+8>this.writePos&&this.notEnoughData("float64"),this.dataView||=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength);let s=this.dataView.getFloat64(this.readPos);return this.readPos+=8,s}case 1:return;case 2:return null;case 3:return!0;case 4:return!1;case 5:{let s=[];for(;;){let a=this.read(e);if(a===Q)break;s.push(a)}return s}case 6:{let s={};for(;;){let a=this.read(e);if(a===Q)break;let f=this.read(e);s[a]=f}return s}case 7:{let s=new Map;for(;;){let a=this.read(e);if(a===Q)break;let f=this.read(e);s.set(a,f)}return s}case 8:{let s=new Set;for(;;){let a=this.read(e);if(a===Q)break;s.add(a)}return s}case 9:return Q;case 10:return--this.readPos,this.readIdentifier();case 11:{let s=this.readPos,a=s;for(;a>=this.writePos&&this.notEnoughData("null-terminated string"),this.buffer[a]!==0;)a++;return this.readPos=a+1,Ze.decode(this.buffer.subarray(s,a))}case 12:{let s=this.readPositiveInt();return new Date(s*1e3)}case 13:{let s=this.readString(),a=this.read();return e&&s in e?e[s](a):new ae(s,a)}default:throw new Error(`Unknown type 4 subtype: ${i}`)}case 5:{let s=i;this.readPos+s>this.writePos&&this.notEnoughData("short string");let a=this.buffer.subarray(this.readPos,this.readPos+s);return this.readPos+=s,Ze.decode(a)}case 6:{let s=this.readMultiByteNumber(i);this.readPos+s>this.writePos&&this.notEnoughData("string");let a=this.buffer.subarray(this.readPos,this.readPos+s);return this.readPos+=s,Ze.decode(a)}case 7:{let s=this.readMultiByteNumber(i);this.readPos+s>this.writePos&&this.notEnoughData("blob");let a=this.buffer.slice(this.readPos,this.readPos+s);return this.readPos+=s,new Uint8Array(a)}default:throw new Error(`Unknown type: ${n}`)}}ensureCapacity(e){let r=this.writePos+e;if(r<=this.buffer.length)return;let n=Math.max(r,Math.floor(this.buffer.length*1.5)),i=new Uint8Array(n);i.set(this.buffer.subarray(0,this.writePos)),this.buffer=i,delete this.dataView}readNumber(){let e=this.read();if(typeof e!="number")throw new Error("Expected number but got "+typeof e);return e}readDate(){let e=this.read();if(!(e instanceof Date))throw new Error("Expected Date but got "+typeof e);return e}readPositiveInt(e){let r=this.read();if(typeof r!="number"||!Number.isInteger(r)||r<0||e!==void 0&&r>=e)throw new Error(`Expected positive integer < ${e} but got ${r}`);return r}readBoolean(){let e=this.read();if(typeof e!="boolean")throw new Error("Expected boolean but got "+typeof e);return e}readUint8Array(){let e=this.read();if(!(e instanceof Uint8Array))throw new Error("Expected Uint8Array but got "+typeof e);return e}readString(){let e=this.read();if(typeof e!="string")throw new Error("Expected string but got "+typeof e);return e}writeIdentifier(e){let r=0;if(typeof e=="number")r=e;else{if(e.length!==8)throw new Error(`Identifier must be exactly 8 characters, got ${e.length}`);let n;for(let i=0;i<8;i++){let s=e.charCodeAt(i);if(s>127||(n=Tt[s])===255)throw new Error(`Invalid base64 character: ${e[i]}`);r=r*64+n}}this.ensureCapacity(7),this.buffer[this.writePos++]=138;for(let n=5;n>=0;n--)this.buffer[this.writePos+n]=r%256,r=Math.floor(r/256);return this.writePos+=6,this}readIdentifier(){let e=this.readIdentifierNumber(),r="";for(let n=0;n<8;n++)r=Re[e%64]+r,e=Math.floor(e/64);return r}readIdentifierNumber(){if(this.readPos+7>this.writePos&&this.notEnoughData("identifier"),this.buffer[this.readPos++]!==138)throw new Error("Invalid identifier header");let r=0;for(let n=0;n<6;n++)r=r*256+this.buffer[this.readPos++];return r}writeOrderedString(e){let r=new TextEncoder().encode(e);if(r.includes(0))throw new Error("String contains null character");return this.ensureCapacity(r.length+2),this.buffer[this.writePos++]=139,this.buffer.set(r,this.writePos),this.writePos+=r.length,this.buffer[this.writePos++]=0,this}toUint8Array(e=!0,r=0,n=this.writePos){return e?this.buffer.slice(r,n):this.buffer.subarray(r,n)}toBuffer(){return this.buffer.buffer.slice(0,this.writePos)}clone(e,r=0,n=this.writePos){if(e)return new t(this.buffer.slice(r,n));{let i=new t(this.buffer);return i.readPos=r,i.writePos=n,i}}writeCustom(e,r){this.buffer[this.writePos++]=141,this.write(e),this.write(r)}writeAsObject(e){this.buffer[this.writePos++]=134;for(let r of Object.keys(e))this.write(r),this.write(e[r]);return this.buffer[this.writePos++]=137,this}writeCollection(e,r){return this.writeCollectionBoundary(e),r(e==="array"||e==="set"?n=>{this.write(n)}:e==="object"?(n,i)=>{this.writeObjectKey(n),this.write(i)}:(n,i)=>{this.write(n),this.write(i)}),this.writeCollectionBoundary("end")}writeCollectionBoundary(e){let r=Nt[e];if(!r)throw new Error(`Invalid collection type: ${e}`);return this.buffer[this.writePos++]=128|r,this}writeObjectKey(e){if(typeof e=="string"){let r=parseInt(e,10);r.toString()==e&&(e=r)}else typeof e!="number"&&(e=""+e);this.write(e)}readCollectionBoundary(e){this.readPos>=this.writePos&&this.notEnoughData("collection boundary");let r=this.buffer[this.readPos++],n=128|Nt[e];if(r!==n)throw new Error(`Expected ${e} boundary but got byte ${r}`)}increment(){for(let e=this.writePos-1;e>=0;e--)if(this.buffer[e]===255)this.buffer[e]=0;else return this.buffer[e]++,this}toString(e=void 0,r=0,n=this.writePos){e===void 0&&(e=mr);let i=this.readPos;this.readPos=r;let s=0,a="",f="",c=Ce,d=c>0?Ae[(c-1)%Ae.length]:br;try{for(;this.readPos<n;){let l=Ae[Ce++%Ae.length];if(a+=l+X(this.read())+" ",e)for(f+=l;s<this.readPos;)f+=this.buffer[s].toString(16).padStart(2,"0")+" ",s++}}catch{if(!e)return this.readPos=i,Ce=c,this.toString(!0,r,n);for(a+=Mt+"ERROR ",f+=Mt;s<this.writePos;)f+=this.buffer[s].toString(16).padStart(2,"0")+" ",s++}return this.readPos=i,c||(Ce=0),e?"DataPack{"+f+d+"\u2192 "+a.trimEnd()+d+"}":"DataPack{"+a.trimEnd()+d+"}"}[Symbol.for("nodejs.util.inspect.custom")](){return this.toString()}readAvailable(){return this.readPos<this.writePos}static generateIdentifier(){let e=Math.floor(+new Date*256+Math.random()*16384),r="";for(let n=0;n<8;n++)r=Re[e&63]+r,e=Math.floor(e/64);return r}static createBuffer(...e){let r=new t;for(let n of e)r.write(n);return r.toBuffer()}static createUint8Array(...e){let r=new t;for(let n of e)r.write(n);return r.toUint8Array(!1)}};function X(t){if(t===void 0)return"undefined";if(typeof t=="object"&&t!==null){if(t instanceof Uint8Array)return new N(t).toString();if(t instanceof Array)return"["+t.map(e=>X(e)).join(", ")+"]";if(t instanceof Map)return"Map{"+Array.from(t.entries()).map(([e,r])=>`${X(e)}=>${X(r)}`).join(", ")+"}";if(t instanceof Set)return"Set{"+Array.from(t.values()).map(e=>X(e)).join(", ")+"}";if(typeof t=="object"&&t!==null)return"{"+Object.entries(t).map(([e,r])=>`${e}:${X(r)}`).join(", ")+"}"}return JSON.stringify(t)}var ae=class{name;data;constructor(e,r){this.name=e,this.data=r}};N.prototype.CustomData=ae;var T={error:"e",response:"r",response_proxy:"p",response_model:"m",response_proxy_model:"q",model_data:"d"},tt={call:1,cancel:2};var R=0;var $e=Symbol(),ke=class{constructor(e){this.url=e;this.api=new Proxy({connection:this,requestId:void 0},jt),this.connect()}url;ws;activeRequests=new Map;requestCounter=0;reconnectAttempts=0;_proxyCounter=0;onlineProxy=o.proxy(!1);streamCache=new Map;api;isOnline(){return this.onlineProxy.value}connect(){let e=this.ws=typeof this.url=="string"?new WebSocket(this.url):this.url();e.binaryType="arraybuffer",R>=1&&console.log(`[lowlander] Connecting to WebSocket at ${typeof this.url=="string"?this.url:"[custom WebSocket]"}`),e.onopen=()=>{if(e===this.ws){R>=1&&console.log("[lowlander] WebSocket connected"),this.onlineProxy.value=!0,this.reconnectAttempts=0;for(let r of this.activeRequests.values())r.resultProxy.busy=!0,this.ws.send(r.requestBuffer)}},e.onclose=()=>{e===this.ws&&(R>=1&&console.log("[lowlander] WebSocket disconnected"),this.reconnect())},e.onerror=r=>{e===this.ws&&(console.error("WebSocket error:",r),this.reconnect())},e.onmessage=r=>{if(e!==this.ws)return;let n=new N(new Uint8Array(r.data)),i=n.readPositiveInt(),s=this.activeRequests.get(i);if(!s)return;let a=o.unproxy(s.resultProxy),f=n.read();if(typeof f=="number"){let c=s.callbacks?.[f],d=[];for(;n.readAvailable();)d.push(n.read());c(...d);return}if(f===T.model_data){s.database||=new Map,s.commitIds||=new Map;let c=n.readNumber(),d=n.readNumber(),l=n.read({model:function(v){let at=s.database.get(v);return at||console.error("Unknown linked model hash "+v),at}});R>=3&&console.log("[lowlander] incoming model_data",i,c,d,l),setTimeout(()=>this.pruneCommitIds(s,d),15e3);let g=s.commitIds.get(c);if(!l){if(g&&d<Math.max(...g.values()))return;s.database.delete(c),s.commitIds.set(c,new Map([[$e,d]]));return}let h=s.database.get(c);if(h){g||(g=new Map,s.commitIds.set(c,g));for(let v of Object.keys(l))d<(g.get(v)??g.get($e)??-1)||(l[v]&&typeof l[v]=="object"?o.copy(h,v,l[v]):h[v]=l[v],g.set(v,d))}else{if(g&&d<(g.get($e)??-1))return;let v=o.proxy(l);o.unproxy(v)[o.OPAQUE]=!1,s.database.set(c,v),s.commitIds.set(c,new Map([[$e,d]]))}return}if(f===T.error){let c=n.readString();s.resultProxy.error=new Error(c),R>=2&&console.log(`[lowlander] incoming error requestId=${i} message=${c}`)}else if(f===T.response||f===T.response_proxy)s.resultProxy.value=n.read(),s.virtualSocketIds=n.read(),s.hasServerProxy=f===T.response_proxy,R>=2&&console.log(`[lowlander] incoming response requestId=${i} value=${a.value} virtualSocketIds=${s.virtualSocketIds} hasServerProxy=${s.hasServerProxy}`);else if(f===T.response_model||f===T.response_proxy_model){s.virtualSocketIds=n.read();let c=n.readNumber(),d=n.read(),l=s.database?.get(c);s.hasServerProxy=f===T.response_proxy_model,R>=2&&console.log(`[lowlander] incoming ${s.hasServerProxy?"response_proxy_model":"response_model"} requestId=${i} dbKey=${c} cacheMs=${d} obj=${l}`),l?s.resultProxy.value=o.proxy(l):s.resultProxy.error=new Error("Unknown database key "+c),d!==void 0&&s.cacheKey&&!this.streamCache.has(s.cacheKey)&&this.streamCache.set(s.cacheKey,{request:s,cacheKey:s.cacheKey,cacheMs:d,refCount:1})}else throw new Error("Unknown message type "+f);!s.hasServerProxy&&!s.virtualSocketIds?.length&&this.activeRequests.delete(i),s.hasServerProxy||delete s.resultProxy.serverProxy,s.resultProxy.busy=!1,s.resolve&&(a.error!=null?(console.error(a.error),s.reject(a.error)):s.resolve(a.value),delete s.resolve,delete s.reject)}}reconnect(){if(this.ws=void 0,this.onlineProxy.value=!1,typeof this.url!="string")return;let e=Math.min(500*Math.pow(2,this.reconnectAttempts),2e4);this.reconnectAttempts++,R>=1&&console.log(`[lowlander] Reconnecting in ${e}ms (attempt ${this.reconnectAttempts})`),setTimeout(this.connect.bind(this),e)}pruneCommitIds(e,r){if(e.commitIds)for(let[n,i]of e.commitIds){for(let[s,a]of i)a<=r&&i.delete(s);i.size||e.commitIds.delete(n)}}_createMethodStub(e,r){return(...n)=>{let s=n.some(h=>typeof h=="function")?void 0:(r??"")+":"+e+":"+JSON.stringify(n);if(s){let h=this.streamCache.get(s);if(h)return h.lingerTimeout&&(clearTimeout(h.lingerTimeout),h.lingerTimeout=void 0),h.refCount++,R>=2&&console.log(`[lowlander] reusing cached stream cacheKey=${s} refCount=${h.refCount}`),o.clean(()=>{h.refCount--,R>=2&&console.log(`[lowlander] clean cached consumer cacheKey=${s} refCount=${h.refCount}`),h.refCount<=0&&this.startLinger(h)}),h.request.resultProxy}let a={busy:!0},f=o.proxy(a),c=++this.requestCounter,d=new N;d.write(c).write(tt.call).write(r).write(e);let l;d.writeCollection("array",()=>{for(let h of n)typeof h=="function"?(l||=[],d.writeCustom("cb",l.length),l.push(h)):d.write(h)});let g={resultProxy:f,requestBuffer:d.toUint8Array(!0),requestId:c,connection:this,callbacks:l,cacheKey:s};return a.serverProxy=new Proxy(g,jt),a.promise=new Promise((h,v)=>{g.resolve=h,g.reject=v}),this.activeRequests.set(c,g),R>=2&&console.log(`[lowlander] outgoing call requestId=${c} method=${e} params=`,n),this.ws&&this.ws.readyState===WebSocket.OPEN&&this.ws.send(g.requestBuffer),o.clean(()=>{let h=s?this.streamCache.get(s):void 0;if(h&&h.request===g){h.refCount--,R>=2&&console.log(`[lowlander] clean stream owner cacheKey=${s} refCount=${h.refCount}`),h.refCount<=0&&this.startLinger(h);return}this.cancelRequest(g)}),f}}cancelRequest(e){if(this.activeRequests.delete(e.requestId),e.virtualSocketIds?.length||e.hasServerProxy){R>=2&&console.log(`[lowlander] outgoing cancel requestId=${e.requestId} virtualSocketIds=${e.virtualSocketIds} hasServerProxy=${e.hasServerProxy}`);let r=N.createUint8Array(++this.requestCounter,tt.cancel,e.requestId,e.virtualSocketIds);this.ws?.send(r)}}startLinger(e){e.lingerTimeout&&clearTimeout(e.lingerTimeout),R>=2&&console.log(`[lowlander] start linger cacheKey=${e.cacheKey} cacheMs=${e.cacheMs}`),e.lingerTimeout=setTimeout(()=>{e.refCount>0||(R>=2&&console.log(`[lowlander] linger expired cacheKey=${e.cacheKey}`),this.streamCache.delete(e.cacheKey),this.cancelRequest(e.request))},e.cacheMs)}},jt={get(t,e){if(typeof e=="symbol")return e===o.OPAQUE?!0:e===o.CUSTOM_DUMP?`<ServerProxy for #${t.requestId}>`:void 0;if(t.serverProxyCache?.has(e))return t.serverProxyCache.get(e);if(e==="then"||e==="catch"||e==="finally")return;if(e==="constructor")return{name:"ServerProxy-"+t.requestId};let r=t.connection._createMethodStub(e,t.requestId);return t.serverProxyCache||(t.serverProxyCache=new Map),t.serverProxyCache.set(e,r),r},has(t,e){return typeof e=="string"||e===o.NO_COPY}};var Ut="lowlander-dashboard";function xr(){try{return JSON.parse(localStorage.getItem(Ut)||"{}")}catch{return{}}}function _t(t){localStorage.setItem(Ut,JSON.stringify(t))}var wr=()=>`${location.protocol==="https:"?"wss:":"ws:"}//${location.host}/`,Lt=xr(),p=o.proxy({wsUrl:Lt.wsUrl||wr(),password:Lt.password||"",loginError:"",connected:!1,authed:!1,indexRefreshKey:0,connecting:!1}),z,Ee,E,m={get debug(){return P.search.debug==="1"},set debug(t){D("debug",t?"1":"")},get model(){return P.search.model||""},set model(t){D("model",t)},get index(){return P.search.index||""},set index(t){D("index",t)},get search(){return P.search.search||""},set search(t){D("search",t)},get reverse(){return P.search.reverse==="1"},set reverse(t){D("reverse",t?"1":"")},get limit(){return parseInt(P.search.limit||"10",10)||10},set limit(t){D("limit",t===10?"":String(t))},get pk(){return P.search.pk||""},set pk(t){D("pk",t)}};function D(t,e){let r=P.search;e===""||e===void 0?delete r[t]:r[t]=e}function nt(){return m.index||"(primary)"}function st(){return m.pk==="-"?"":m.pk}var Z="";function Pr(){o.setSpacingCssVars(),o.cssVars.bg="#0f1117",o.cssVars.panel="#181b24",o.cssVars.panel2="#1f2330",o.cssVars.fg="#e5e7eb",o.cssVars.muted="#94a3b8",o.cssVars.accent="#60a5fa",o.cssVars.accent2="#34d399",o.cssVars.danger="#f87171",o.cssVars.border="#2a2f3d",o.insertGlobalCss({"html,body":"m:0 p:0 bg:$bg fg:$fg font-family: -apple-system, system-ui, sans-serif; font-size:14px; h:100vh",body:"display:flex flex-direction:column",a:"color:$accent text-decoration:none cursor:pointer","a:hover":"text-decoration:underline","input,select,textarea,button":"font-family:inherit font-size:inherit","input[type=text],input[type=password],input:not([type]),select,textarea":"bg:$panel2 fg:$fg border: 1px solid $border; r:4px p: 6px 8px; outline:none box-sizing:border-box w:100%","input:focus,textarea:focus,select:focus":"border-color:$accent",button:"bg:$accent fg:#0b1220 border:0 r:4px p: 6px 12px; cursor:pointer font-weight:600","button:hover":"opacity:0.9","button.ghost":"bg:transparent fg:$accent border: 1px solid $border;","code,pre":"font-family: ui-monospace, Menlo, Consolas, monospace; font-size:12.5px",pre:"bg:#0b0d14 p:$3 r:6px overflow:auto m:0",".tag":"display:inline-block bg:$panel2 fg:$muted p: 1px 6px; r:3px font-size:11px ml:$1",".sidebarSel":"bg:#1e3251 box-shadow: inset 3px 0 0 $accent;",".row":"display:flex gap:$2 align-items:center",".col":"display:flex flex-direction:column gap:$2",ul:"margin-block-start:0 margin-block-end:0"}),Z=o.insertCss({"&":"w:100% border-collapse:collapse font-size:12.5px","& th,& td":"text-align:left p: 4px 8px; border-bottom: 1px solid $border; vertical-align:top","& th":"bg:$panel2 fg:$muted font-weight:600","& tbody tr":"cursor:default","& tbody tr:hover":"bg:#ffffff08","& tbody tr.selectable":"cursor:pointer","& tbody tr.selected":"bg:#1e3251","& tbody tr.selected td:first-child":"border-left: 3px solid $accent; padding-left: 5px;"})}function vr(){o(()=>{if(p.connecting){o("div","display:flex align-items:center justify-content:center h:100vh fg:$muted","#Connecting\u2026");return}o("div","display:flex align-items:center justify-content:center h:100vh",()=>{o("form","bg:$panel p:$4 r:8px w:360px border: 1px solid $border; display:flex flex-direction:column gap:$3","submit=",t=>{t.preventDefault(),Kt()},()=>{o("h2#Lowlander Dashboard","m:0"),o("label",()=>{o("span#WebSocket URL","fg:$muted display:block mb:$1"),o("input type=text bind=",o.ref(p,"wsUrl"))}),o("label",()=>{o("span#Password","fg:$muted display:block mb:$1"),o("input type=password bind=",o.ref(p,"password"),"autofocus=")}),o(()=>{p.loginError&&o("div","fg:$danger",()=>o("text=",p.loginError))}),o("button type=submit",()=>{o(()=>o(p.connected&&!p.authed?"text=Checking\u2026":'text="Log in"'))})})})})}async function Kt(){p.connecting=!0,p.loginError="",_t({wsUrl:p.wsUrl,password:p.password});try{z&&z.ws?.close?.()}catch{}z=new ke(p.wsUrl),Ee=z.api,p.connected=!1,p.authed=!1;let t=Ee._dashboard(p.password);E=t;try{await t.promise,p.connected=!0,p.authed=!0,p.connecting=!1}catch(e){p.connecting=!1,p.loginError=e?.message||"Login failed",p.connected=!1,p.authed=!1,z=void 0,Ee=void 0,E=void 0}}function Sr(){p.authed=!1,p.connected=!1,p.password="",_t({wsUrl:p.wsUrl,password:""});try{z?.ws?.close?.()}catch{}z=void 0,Ee=void 0,E=void 0}function Ar(){o("aside","w:280px bg:$panel border-right: 1px solid $border; display:flex flex-direction:column overflow:hidden",()=>{o("div","p:$3 border-bottom: 1px solid $border; display:flex justify-content:space-between align-items:center",()=>{o("strong#Lowlander"),o("button.ghost#Logout","click=",()=>Sr())}),o("div","overflow:auto flex:1 p:$2",()=>{E&&(Cr(),o("div","border-top: 1px solid $border; mt:$2 pt:$2",()=>{o("div","p: 6px 8px; r:4px cursor:pointer","click=",()=>{Se({path:P.path,search:{debug:"1"}})},()=>{o(()=>o(".sidebarSel=",m.debug)),o("div","display:flex justify-content:space-between align-items:baseline",()=>{o("span#\u2B21 WarpSocket debug")})})}))})})}function Cr(){let t=E.serverProxy.listModels();o(()=>{if(t.busy){o("div","fg:$muted","#Loading\u2026");return}if(t.error){o("div","fg:$danger","text=",t.error.message);return}let e=t.value||[];for(let r of e)o("div","p: 6px 8px; r:4px cursor:pointer","click=",()=>{Se({path:P.path,search:{model:r.tableName}})},()=>{o(()=>o(".sidebarSel=",!m.debug&&m.model===r.tableName)),o("div","display:flex justify-content:space-between align-items:baseline",()=>{o("span","text=",r.tableName),o("span.tag","text=",`${r.fieldCount}f ${r.indexCount}i ${r.streamTypeCount}s`)})})})}function Rr(){o("main","flex:1 overflow:auto p:$4",()=>{E&&(m.debug?Tr():m.model?$r():o("div","fg:$muted p:$4 text-align:center","#Select a model from the sidebar"))})}function $r(){let t=m.model,e=E.serverProxy.getModel(t);o(()=>{if(e.busy){o("div","fg:$muted","#Loading\u2026");return}if(e.error){o("div","fg:$danger","text=",e.error.message);return}let r=e.value;r&&(o("h2","m:0 mb:$2","text=",r.tableName),o("section","mb:$4",()=>{o("h3#Fields","m:0 mb:$2 fg:$muted font-weight:600"),o("table",Z,()=>{o("thead tr",()=>{o("th#Name"),o("th#Type"),o("th#Linked"),o("th#Default"),o("th#Description")}),o("tbody",()=>{for(let n of r.fields)o("tr",()=>{o("td",()=>o("code","text=",n.name)),o("td","fg:$accent2","text=",n.type.display),o("td",()=>{let i=n.type.linkedModel;i&&ot(i)}),o("td","text=",n.hasDefault?"\u2713":""),o("td","fg:$muted","text=",n.description||"")})})})}),o("section","mb:$4",()=>{o("h3#Indexes","m:0 mb:$2 fg:$muted font-weight:600"),kr(r)}),o(()=>{let n=nt(),i=r.indexes.find(s=>s.name===n);i&&o("section","mb:$4",()=>{o("h3","m:0 mb:$2 fg:$muted font-weight:600","text=",`Data for ${n}`),Mr(r,i)})}),r.streamTypes.length&&o("section","mb:$4",()=>{o("h3#Stream types","m:0 mb:$2 fg:$muted font-weight:600"),Er(r)}))})}function ot(t,e,r){o("a","click=",n=>{n.preventDefault(),n.stopPropagation();let i={model:t};e!==void 0&&(i.search=Ie(e),i.limit=1),Se({path:P.path,search:i})},"text=",r??t)}function Ie(t){if(typeof t=="string")return t;try{return JSON.stringify(t)}catch{return String(t)}}function kr(t){o("table",Z,()=>{o("thead tr",()=>{o("th#Name"),o("th#Kind"),o("th#Fields")}),o("tbody",()=>{for(let e of t.indexes)o("tr.selectable","click=",()=>{nt()!==e.name&&(m.index=e.name==="(primary)"?"":e.name,m.pk="",m.search="")},()=>{o(()=>o(".selected=",nt()===e.name)),o("td",()=>o("code","text=",e.name)),o("td","fg:$accent2","text=",e.info.kind),o("td","text=",e.info.fields.join(", ")||"(computed)")})})})}function Er(t){let e={};for(let i of t.fields)e[i.name]=i;let r=new Set,n=t.streamTypes.filter(i=>r.has(i.id)?!1:(r.add(i.id),!0));o("table",Z,()=>{o("thead tr",()=>{o("th#id"),o("th#cache"),o("th#fields"),o("th","w:100%","#live view for selected row")}),o("tbody",()=>{for(let i of n)o("tr",()=>{o("td",()=>o("code","text=",String(i.id))),o("td","text=",i.cache?`${i.cache}s`:""),o("td",()=>Ir(i.fields,e)),o("td",()=>Or(t.tableName,i.id))})})})}function Ir(t,e){if(t===!0){o("span","fg:$muted","#(scalar)");return}if(!t||typeof t!="object"){o("span","text=",String(t));return}for(let[r,n]of Object.entries(t))if(n===!0)o("div","text=",r);else if(typeof n=="number"){let i=e[r]?.type?.linkedModel;o(`div #${r}\u2192`,()=>{i?ot(i,void 0,n.toString()):o("#?")})}else o(`div #${r}={...}`)}function Or(t,e){o(()=>{let r=st();if(!r){o("span","fg:$muted","#(select a row)");return}let n;try{n=JSON.parse(r)}catch{n=r}let i=E.serverProxy.streamRecord(t,e,n);o(()=>{if(i.busy){o("span","fg:$muted","#\u2026");return}if(i.error){o("span","fg:$danger","text=",i.error.message);return}o.dump(i.value)})})}function Mr(t,e){let r=t.tableName,n=e.name;o("div","display:flex flex-direction:column",()=>{o("div","display:flex flex-wrap:wrap gap:$2 align-items:center mb:$2",()=>{o("input type=text flex:1 min-w:200px placeholder=search","value=",o.peek(()=>m.search),"input=",i=>{m.search=i.target.value,m.limit=10}),o("label","display:flex align-items:center gap:$1 white-space:nowrap",()=>{o("input type=checkbox","checked=",m.reverse,"change=",i=>m.reverse=i.target.checked),o("span","fg:$muted","#reverse")}),o("button.ghost","p: 2px 8px; font-size:11px","#\u21BA refresh","click=",()=>p.indexRefreshKey++)}),o(()=>{p.indexRefreshKey;let i={search:Nr(m.search),reverse:m.reverse,limit:m.limit},s=E.serverProxy.findRecords(r,n,i);o(()=>{if(s.busy){o("div","fg:$muted","#Loading\u2026");return}if(s.error){o("div","fg:$danger","text=",s.error.message);return}let a=s.value;if(a){if(!m.pk&&a.rows.length>0){m.pk=Ie(a.rows[0].pk);return}if(o("div","fg:$muted mb:$2 font-size:12px","text=",`${a.rows.length} rows (scanned ${a.scanned})`),!a.rows.length){o("div","fg:$muted","#(empty)");return}o("div","overflow:auto",()=>{o("table",Z,()=>{let f=Object.keys(a.rows[0].values);o("thead tr",()=>{for(let c of f)o("th","text=",c)}),o("tbody",()=>{for(let c of a.rows){let d=Ie(c.pk);o("tr.selectable","click=",()=>{m.pk=st()===d?"-":d},()=>{o(()=>o(".selected=",st()===d));for(let l of f)o("td",()=>o.dump(it(c.values[l])))})}})})}),a.rows.length>=m.limit&&o("div","mt:$2",()=>{o("button.ghost","p: 2px 8px; font-size:11px","click=",()=>{let f=m.limit;m.limit=Math.min(f*5,f+250)},()=>o("span","text=",`+ more (currently limit ${m.limit})`))})}})})})}function it(t){if(t==null||typeof t!="object"||t instanceof Date)return t;if(t.__ref){let r=t.__ref,n=t.pk;return{[o.CUSTOM_DUMP](){ot(r,n,`<${r} ${Ie(n)}>`)}}}if(Array.isArray(t))return t.map(it);let e={};for(let[r,n]of Object.entries(t))e[r]=it(n);return e}function Nr(t){if(t!==""){if(t==="true")return!0;if(t==="false")return!1;if(/^-?\d+(\.\d+)?$/.test(t))return Number(t);try{return JSON.parse(t)}catch{}return t}}function Tr(){let t=o.proxy({v:"channels"});o("h2#WarpSocket debug","m:0 mb:$3"),o("div",".row mb:$3",()=>{for(let e of["channels","sockets","workers","kv"])o("button click=",()=>t.v=e,()=>{o(()=>o(t.v===e?"bg:$accent fg:#0b1220":"bg:$panel2 fg:$fg border: 1px solid $border;")),o("text=",e)})}),o(()=>{let e=E.serverProxy.getDebugState(t.v);o(()=>{if(e.busy){o("div","fg:$muted","#Loading\u2026");return}if(e.error){o("div","fg:$danger","text=",e.error.message);return}let r=o.unproxy(e.value);if(!r)return;let n=new Set;for(let s of Object.values(r))if(s&&typeof s=="object"&&!(s instanceof Uint8Array))for(let a of Object.keys(s))n.add(a);let i=[...n];o("div","overflow:auto",()=>{o("table",Z,()=>{o("thead tr",()=>{o("th##");for(let s of i)o("th","text=",s)}),o("tbody",()=>{for(let[s,a]of Object.entries(r))o("tr",()=>{o("td",()=>o("code","text=",s));for(let f of i)o("td","font-size:12px font-family:monospace","text=",jr(a?.[f]))})})})})})})}function jr(t){if(t==null)return"";if(t instanceof Uint8Array)return rt([...t]);if(typeof t=="object"){if(t.type==="Buffer"&&Array.isArray(t.data))return rt(t.data);let e=Object.keys(t);if(!Array.isArray(t)&&e.length>0&&e.length<=4096&&e.every((r,n)=>r===String(n))){let r=[];for(let n of e){let i=t[n];if(typeof i!="number"||i<0||i>255)return JSON.stringify(t);r.push(i)}return rt(r)}return JSON.stringify(t)}return String(t)}function rt(t){let e="";for(let r of t)r>=32&&r<127&&r!==34&&r!==92?e+=String.fromCharCode(r):r===9?e+="\\t":r===10?e+="\\n":r===13?e+="\\r":r===34?e+='\\"':r===92?e+="\\\\":e+="\\x"+r.toString(16).padStart(2,"0");return e}Pr();o.mount(document.body,()=>{if(!p.authed){vr();return}o("div","display:flex flex-direction:row h:100vh w:100vw overflow:hidden",()=>{Ar(),Rr()})});p.password&&Kt();
18
+ </script>
19
+ </body>
20
+ </html>
@@ -0,0 +1,18 @@
1
+ export { _dashboard } from './server.js';
2
+ export type { DashboardAPI } from './server.js';
3
+ import type { ServerResponse } from 'http';
4
+ import type { HttpResponse } from 'warpsocket';
5
+ /**
6
+ * Serve the bundled dashboard HTML on an HTTP response. Compatible with
7
+ * Node.js `http.ServerResponse`, Bun's node-compat response, and
8
+ * warpsocket's `HttpResponse`. Wire into e.g.:
9
+ *
10
+ * ```ts
11
+ * import { serveDashboard } from 'lowlander/dashboard';
12
+ * export function handleHttpRequest(req, res) {
13
+ * if (req.url === '/_dashboard') return serveDashboard(res);
14
+ * }
15
+ * ```
16
+ */
17
+ export declare function serveDashboard(res: ServerResponse | HttpResponse): void;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../dashboard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAwB/C;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,YAAY,GAAG,IAAI,CAMvE"}
@@ -0,0 +1,50 @@
1
+ export { _dashboard } from './server.js';
2
+ import { readFileSync } from 'fs';
3
+ import { fileURLToPath } from 'url';
4
+ import { dirname, resolve } from 'path';
5
+ const HERE = dirname(fileURLToPath(import.meta.url));
6
+ // Bundle lives next to the compiled serve.js (build/dashboard/dashboard.html);
7
+ // when running from TS source under Bun, fall back to ../build/dashboard/.
8
+ const CANDIDATES = [
9
+ resolve(HERE, 'dashboard.html'),
10
+ resolve(HERE, '../build/dashboard/dashboard.html'),
11
+ ];
12
+ let cachedHtml;
13
+ function getHtml() {
14
+ if (cachedHtml === undefined) {
15
+ let lastErr;
16
+ for (const p of CANDIDATES) {
17
+ try {
18
+ cachedHtml = readFileSync(p, 'utf8');
19
+ break;
20
+ }
21
+ catch (e) {
22
+ lastErr = e;
23
+ }
24
+ }
25
+ if (cachedHtml === undefined) {
26
+ cachedHtml = `<!doctype html><html><body><pre>Dashboard bundle missing: ${lastErr?.message || lastErr}\n\nDid you run \`npm run build\` in the lowlander package?</pre></body></html>`;
27
+ }
28
+ }
29
+ return cachedHtml;
30
+ }
31
+ /**
32
+ * Serve the bundled dashboard HTML on an HTTP response. Compatible with
33
+ * Node.js `http.ServerResponse`, Bun's node-compat response, and
34
+ * warpsocket's `HttpResponse`. Wire into e.g.:
35
+ *
36
+ * ```ts
37
+ * import { serveDashboard } from 'lowlander/dashboard';
38
+ * export function handleHttpRequest(req, res) {
39
+ * if (req.url === '/_dashboard') return serveDashboard(res);
40
+ * }
41
+ * ```
42
+ */
43
+ export function serveDashboard(res) {
44
+ const html = getHtml();
45
+ res.statusCode = 200;
46
+ res.setHeader('content-type', 'text/html; charset=utf-8');
47
+ res.setHeader('cache-control', 'no-store');
48
+ res.end(html);
49
+ }
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../dashboard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAIxC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,UAAU,GAAG;IACf,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAC/B,OAAO,CAAC,IAAI,EAAE,mCAAmC,CAAC;CACrD,CAAC;AAEF,IAAI,UAA8B,CAAC;AACnC,SAAS,OAAO;IACZ,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,OAAY,CAAC;QACjB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC;gBAAC,UAAU,GAAG,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBAAC,MAAM;YAAC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,OAAO,GAAG,CAAC,CAAC;YAAC,CAAC;QACnF,CAAC;QACD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3B,UAAU,GAAG,6DAA6D,OAAO,EAAE,OAAO,IAAI,OAAO,iFAAiF,CAAC;QAC3L,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,GAAkC;IAC7D,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;IACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;IAC1D,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAC3C,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ServerResponse } from 'http';
2
+ import type { HttpResponse } from 'warpsocket';
3
+ /**
4
+ * Serve the bundled dashboard HTML on an HTTP response. Compatible with
5
+ * Node.js `http.ServerResponse`, Bun's node-compat response, and
6
+ * warpsocket's `HttpResponse`. Wire into e.g.:
7
+ *
8
+ * ```ts
9
+ * import { serveDashboard } from 'lowlander/dashboard';
10
+ * export function handleHttpRequest(req, res) {
11
+ * if (req.url === '/_dashboard') return serveDashboard(res);
12
+ * }
13
+ * ```
14
+ */
15
+ export declare function serveDashboard(res: ServerResponse | HttpResponse): void;
16
+ /** Return the bundled dashboard HTML as a string (for non-warpsocket servers). */
17
+ export declare function getDashboardHtml(): string;
18
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../dashboard/serve.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAwB/C;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,YAAY,GAAG,IAAI,CAMvE;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
@@ -0,0 +1,53 @@
1
+ import { readFileSync } from 'fs';
2
+ import { fileURLToPath } from 'url';
3
+ import { dirname, resolve } from 'path';
4
+ const HERE = dirname(fileURLToPath(import.meta.url));
5
+ // Bundle lives next to the compiled serve.js (build/dashboard/dashboard.html);
6
+ // when running from TS source under Bun, fall back to ../build/dashboard/.
7
+ const CANDIDATES = [
8
+ resolve(HERE, 'dashboard.html'),
9
+ resolve(HERE, '../build/dashboard/dashboard.html'),
10
+ ];
11
+ let cachedHtml;
12
+ function getHtml() {
13
+ if (cachedHtml === undefined) {
14
+ let lastErr;
15
+ for (const p of CANDIDATES) {
16
+ try {
17
+ cachedHtml = readFileSync(p, 'utf8');
18
+ break;
19
+ }
20
+ catch (e) {
21
+ lastErr = e;
22
+ }
23
+ }
24
+ if (cachedHtml === undefined) {
25
+ cachedHtml = `<!doctype html><html><body><pre>Dashboard bundle missing: ${lastErr?.message || lastErr}\n\nDid you run \`npm run build\` in the lowlander package?</pre></body></html>`;
26
+ }
27
+ }
28
+ return cachedHtml;
29
+ }
30
+ /**
31
+ * Serve the bundled dashboard HTML on an HTTP response. Compatible with
32
+ * Node.js `http.ServerResponse`, Bun's node-compat response, and
33
+ * warpsocket's `HttpResponse`. Wire into e.g.:
34
+ *
35
+ * ```ts
36
+ * import { serveDashboard } from 'lowlander/dashboard';
37
+ * export function handleHttpRequest(req, res) {
38
+ * if (req.url === '/_dashboard') return serveDashboard(res);
39
+ * }
40
+ * ```
41
+ */
42
+ export function serveDashboard(res) {
43
+ const html = getHtml();
44
+ res.statusCode = 200;
45
+ res.setHeader('content-type', 'text/html; charset=utf-8');
46
+ res.setHeader('cache-control', 'no-store');
47
+ res.end(html);
48
+ }
49
+ /** Return the bundled dashboard HTML as a string (for non-warpsocket servers). */
50
+ export function getDashboardHtml() {
51
+ return getHtml();
52
+ }
53
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../dashboard/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAIxC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,UAAU,GAAG;IACf,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAC/B,OAAO,CAAC,IAAI,EAAE,mCAAmC,CAAC;CACrD,CAAC;AAEF,IAAI,UAA8B,CAAC;AACnC,SAAS,OAAO;IACZ,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,OAAY,CAAC;QACjB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC;gBAAC,UAAU,GAAG,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBAAC,MAAM;YAAC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,OAAO,GAAG,CAAC,CAAC;YAAC,CAAC;QACnF,CAAC;QACD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3B,UAAU,GAAG,6DAA6D,OAAO,EAAE,OAAO,IAAI,OAAO,iFAAiF,CAAC;QAC3L,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,GAAkC;IAC7D,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;IACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;IAC1D,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAC3C,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,gBAAgB;IAC5B,OAAO,OAAO,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,82 @@
1
+ import * as E from 'edinburgh';
2
+ import { ServerProxy } from '../server/server.js';
3
+ declare function describeType(type: E.TypeWrapper<unknown>): {
4
+ kind: string;
5
+ display: string;
6
+ linkedModel?: string;
7
+ };
8
+ declare function describeIndex(index: any): {
9
+ fields: string[];
10
+ fieldTypes: {
11
+ kind: string;
12
+ display: string;
13
+ linkedModel?: string;
14
+ }[];
15
+ computed: boolean;
16
+ kind: "primary" | "unique" | "secondary";
17
+ };
18
+ declare class DashboardAPI {
19
+ listModels(): {
20
+ tableName: string;
21
+ indexCount: number;
22
+ fieldCount: number;
23
+ streamTypeCount: number;
24
+ }[];
25
+ getModel(name: string): {
26
+ tableName: string;
27
+ fields: {
28
+ name: string;
29
+ type: ReturnType<typeof describeType>;
30
+ description?: string;
31
+ hasDefault: boolean;
32
+ }[];
33
+ indexes: {
34
+ name: string;
35
+ info: ReturnType<typeof describeIndex>;
36
+ }[];
37
+ streamTypes: {
38
+ id: any;
39
+ fields: any;
40
+ cache: any;
41
+ }[];
42
+ };
43
+ listApiMethods(): {
44
+ name: string;
45
+ kind: "function" | "value";
46
+ }[];
47
+ getApiMethodSource(name: string): string | undefined;
48
+ findRecords(modelName: string, indexName: string, opts?: {
49
+ search?: any;
50
+ reverse?: boolean;
51
+ limit?: number;
52
+ }): {
53
+ rows: {
54
+ pk: any;
55
+ values: Record<string, any>;
56
+ }[];
57
+ indexFields: string[];
58
+ scanned: number;
59
+ };
60
+ getRecord(modelName: string, pk: any): Record<string, any> | undefined;
61
+ streamRecord(modelName: string, streamTypeId: number, pk: any): any;
62
+ getDebugState(mode: 'channels' | 'sockets' | 'workers' | 'kv'): {
63
+ channel: Uint8Array;
64
+ subscribers: {
65
+ [socketId: number]: number;
66
+ };
67
+ }[];
68
+ }
69
+ /**
70
+ * RPC entry point. Re-export this from your top-level api file:
71
+ *
72
+ * ```ts
73
+ * export { _dashboard } from 'lowlander/dashboard';
74
+ * ```
75
+ *
76
+ * On first call, a password is generated (or reused from the
77
+ * `LOWLANDER_DASHBOARD_PASSWORD` env var) and printed to the server console.
78
+ */
79
+ export declare function _dashboard(password: string): ServerProxy<DashboardAPI, string>;
80
+ export type { DashboardAPI };
81
+ export declare function _dashboardAllFieldsStream(modelName: string): void;
82
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../dashboard/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,WAAW,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAwD,MAAM,qBAAqB,CAAC;AAkBxG,iBAAS,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAO3G;AAED,iBAAS,aAAa,CAAC,KAAK,EAAE,GAAG;;;cAT4B,MAAM;iBAAW,MAAM;sBAAgB,MAAM;;;UAepE,SAAS,GAAG,QAAQ,GAAG,WAAW;EAEvE;AAmFD,cAAM,YAAY;IACd,UAAU;;;;;;IASV,QAAQ,CAAC,IAAI,EAAE,MAAM;;;kBA1FC,MAAM;kBAAQ,UAAU,CAAC,OAAO,YAAY,CAAC;0BAAgB,MAAM;wBAAc,OAAO;;;kBASvF,MAAM;kBAAQ,UAAU,CAAC,OAAO,aAAa,CAAC;;;;;;;;IAqFrE,cAAc;cAGS,MAAM;cAAQ,UAAU,GAAG,OAAO;;IASzD,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAapD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE;QACpD,MAAM,CAAC,EAAE,GAAG,CAAC;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;KACb;;gBAemB,GAAG;oBAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;;;IAsBzD,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG;IAQpC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG;IAU7D,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI;;;;;;CAGhE;AAID;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,qCAK1C;AAGD,YAAY,EAAE,YAAY,EAAE,CAAC;AAO7B,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,QAI1D"}