deploy(nvsim): publish dashboard to /nvsim/ [ADR-092]

Vite + Lit dashboard for the nvsim NV-diamond magnetometer simulator.
WASM-backed deterministic pipeline (Proof::EXPECTED_WITNESS_HEX matches
across browsers and machines). PWA-enabled with service worker and
manifest scoped to /RuView/nvsim/.

Live: https://ruvnet.github.io/RuView/nvsim/

Preserves all sibling demos:
 - / (Observatory)
 - /pose-fusion/ (Pose Fusion)
 - /ui/ (legacy UI)

Source: feat/nvsim-pipeline-simulator @ 5846c3d6d

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
ruv
2026-04-26 20:10:23 -04:00
parent 05f2d2d7ca
commit 43f853d61a
18 changed files with 1474 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
:root{--bg-0: #07090d;--bg-1: #0d1117;--bg-2: #131a23;--bg-3: #1a232f;--line: #1f2a38;--line-2: #2a3848;--ink: #e6edf3;--ink-2: #b8c2cc;--ink-3: #7c8694;--ink-4: #4a5462;--accent: oklch(.78 .14 70);--accent-2: oklch(.78 .12 195);--accent-3: oklch(.72 .18 330);--accent-4: oklch(.78 .14 145);--warn: oklch(.7 .18 35);--ok: oklch(.78 .14 145);--bad: oklch(.65 .22 25);--grid: rgba(255, 255, 255, .04);--shadow: 0 20px 60px -20px rgba(0, 0, 0, .6), 0 4px 12px -4px rgba(0, 0, 0, .4);--radius: 12px;--radius-sm: 8px;--mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--sans: "Inter", system-ui, -apple-system, sans-serif}[data-theme=light]{--bg-0: #f4f5f7;--bg-1: #fbfbfc;--bg-2: #ffffff;--bg-3: #f0f2f5;--line: #e3e7ec;--line-2: #d1d7de;--ink: #11161d;--ink-2: #38424f;--ink-3: #6b7684;--ink-4: #9ba4b0;--grid: rgba(0, 0, 0, .05);--shadow: 0 12px 40px -16px rgba(15, 30, 55, .18), 0 2px 8px -2px rgba(15, 30, 55, .08)}*{box-sizing:border-box}html,body{margin:0;padding:0}body{font-family:var(--sans);background:var(--bg-0);color:var(--ink);font-size:14px;line-height:1.45;overflow:hidden;height:100vh;-webkit-font-smoothing:antialiased;letter-spacing:-.005em}button{font-family:inherit;color:inherit;cursor:pointer}input,select{font-family:inherit;color:inherit}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--line-2);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--ink-4)}@keyframes pulse{50%{opacity:.5}}@keyframes dash{to{stroke-dashoffset:-200}}@keyframes float-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes diamond-spin{0%{transform:rotateY(0) rotateX(8deg)}to{transform:rotateY(360deg) rotateX(8deg)}}@keyframes spin{to{transform:rotate(360deg)}}body.reduce-motion *,body.reduce-motion *:before,body.reduce-motion *:after{animation:none!important;transition:none!important}body.density-comfy{font-size:15px}body.density-default{font-size:14px}body.density-compact{font-size:13px}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
View File
@@ -0,0 +1,2 @@
var U=Symbol.for("preact-signals");function l(){if(e>1)e--;else{var t,i=!1;for(function(){var s=a;for(a=void 0;s!==void 0;)s.S.v===s.v&&(s.S.i=s.i),s=s.o}();u!==void 0;){var o=u;for(u=void 0,d++;o!==void 0;){var n=o.u;if(o.u=void 0,o.f&=-3,!(8&o.f)&&x(o))try{o.c()}catch(s){i||(t=s,i=!0)}o=n}}if(d=0,e--,i)throw t}}var r=void 0;function S(t){var i=r;r=void 0;try{return t()}finally{r=i}}var u=void 0,e=0,d=0,y=0,a=void 0,c=0;function w(t){if(r!==void 0){var i=t.n;if(i===void 0||i.t!==r)return i={i:0,S:t,p:r.s,n:void 0,t:r,e:void 0,x:void 0,r:i},r.s!==void 0&&(r.s.n=i),r.s=i,t.n=i,32&r.f&&t.S(i),i;if(i.i===-1)return i.i=0,i.n!==void 0&&(i.n.p=i.p,i.p!==void 0&&(i.p.n=i.n),i.p=r.s,i.n=void 0,r.s.n=i,r.s=i),i}}function f(t,i){this.v=t,this.i=0,this.n=void 0,this.t=void 0,this.l=0,this.W=i?.watched,this.Z=i?.unwatched,this.name=i?.name}f.prototype.brand=U;f.prototype.h=function(){return!0};f.prototype.S=function(t){var i=this,o=this.t;o!==t&&t.e===void 0&&(t.x=o,this.t=t,o!==void 0?o.e=t:S(function(){var n;(n=i.W)==null||n.call(i)}))};f.prototype.U=function(t){var i=this;if(this.t!==void 0){var o=t.e,n=t.x;o!==void 0&&(o.x=n,t.e=void 0),n!==void 0&&(n.e=o,t.x=void 0),t===this.t&&(this.t=n,n===void 0&&S(function(){var s;(s=i.Z)==null||s.call(i)}))}};f.prototype.subscribe=function(t){var i=this;return N(function(){var o=i.value,n=r;r=void 0;try{t(o)}finally{r=n}},{name:"sub"})};f.prototype.valueOf=function(){return this.value};f.prototype.toString=function(){return this.value+""};f.prototype.toJSON=function(){return this.value};f.prototype.peek=function(){var t=r;r=void 0;try{return this.value}finally{r=t}};Object.defineProperty(f.prototype,"value",{get:function(){var t=w(this);return t!==void 0&&(t.i=this.i),this.v},set:function(t){if(t!==this.v){if(d>100)throw new Error("Cycle detected");(function(o){e!==0&&d===0&&o.l!==y&&(o.l=y,a={S:o,v:o.v,i:o.i,o:a})})(this),this.v=t,this.i++,c++,e++;try{for(var i=this.t;i!==void 0;i=i.x)i.t.N()}finally{l()}}}});function O(t,i){return new f(t,i)}function x(t){for(var i=t.s;i!==void 0;i=i.n)if(i.S.i!==i.i||!i.S.h()||i.S.i!==i.i)return!0;return!1}function m(t){for(var i=t.s;i!==void 0;i=i.n){var o=i.S.n;if(o!==void 0&&(i.r=o),i.S.n=i,i.i=-1,i.n===void 0){t.s=i;break}}}function b(t){for(var i=t.s,o=void 0;i!==void 0;){var n=i.p;i.i===-1?(i.S.U(i),n!==void 0&&(n.n=i.n),i.n!==void 0&&(i.n.p=n)):o=i,i.S.n=i.r,i.r!==void 0&&(i.r=void 0),i=n}t.s=o}function h(t,i){f.call(this,void 0),this.x=t,this.s=void 0,this.g=c-1,this.f=4,this.W=i?.watched,this.Z=i?.unwatched,this.name=i?.name}h.prototype=new f;h.prototype.h=function(){if(this.f&=-3,1&this.f)return!1;if((36&this.f)==32||(this.f&=-5,this.g===c))return!0;if(this.g=c,this.f|=1,this.i>0&&!x(this))return this.f&=-2,!0;var t=r;try{m(this),r=this;var i=this.x();(16&this.f||this.v!==i||this.i===0)&&(this.v=i,this.f&=-17,this.i++)}catch(o){this.v=o,this.f|=16,this.i++}return r=t,b(this),this.f&=-2,!0};h.prototype.S=function(t){if(this.t===void 0){this.f|=36;for(var i=this.s;i!==void 0;i=i.n)i.S.S(i)}f.prototype.S.call(this,t)};h.prototype.U=function(t){if(this.t!==void 0&&(f.prototype.U.call(this,t),this.t===void 0)){this.f&=-33;for(var i=this.s;i!==void 0;i=i.n)i.S.U(i)}};h.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var t=this.t;t!==void 0;t=t.x)t.t.N()}};Object.defineProperty(h.prototype,"value",{get:function(){if(1&this.f)throw new Error("Cycle detected");var t=w(this);if(this.h(),t!==void 0&&(t.i=this.i),16&this.f)throw this.v;return this.v}});function j(t,i){return new h(t,i)}function g(t){var i=t.m;if(t.m=void 0,typeof i=="function"){e++;var o=r;r=void 0;try{i()}catch(n){throw t.f&=-2,t.f|=8,p(t),n}finally{r=o,l()}}}function p(t){for(var i=t.s;i!==void 0;i=i.n)i.S.U(i);t.x=void 0,t.s=void 0,g(t)}function E(t){if(r!==this)throw new Error("Out-of-order effect");b(this),r=t,this.f&=-2,8&this.f&&p(this),l()}function v(t,i){this.x=t,this.m=void 0,this.s=void 0,this.u=void 0,this.f=32,this.name=i?.name}v.prototype.c=function(){var t=this.S();try{if(8&this.f||this.x===void 0)return;var i=this.x();typeof i=="function"&&(this.m=i)}finally{t()}};v.prototype.S=function(){if(1&this.f)throw new Error("Cycle detected");this.f|=1,this.f&=-9,g(this),m(this),e++;var t=r;return r=this,E.bind(this,t)};v.prototype.N=function(){2&this.f||(this.f|=2,this.u=u,u=this)};v.prototype.d=function(){this.f|=8,1&this.f||p(this)};v.prototype.dispose=function(){this.d()};function N(t,i){var o=new v(t,i);try{o.c()}catch(s){throw o.d(),s}var n=o.d.bind(o);return n[Symbol.dispose]=n,n}export{j as g,N as j,O as y};
//# sourceMappingURL=signals-SG45zFCj.js.map
File diff suppressed because one or more lines are too long
+2
View File
@@ -0,0 +1,2 @@
const d=self;let o,_,x,g,W;async function S(){const r=`${d.location.origin}/`,t=await import(new URL("nvsim-pkg/nvsim.js",r).href);await t.default(),o=t.WasmPipeline,_=t.referenceSceneJson,x=t.expectedReferenceWitnessHex,g=t.hexWitness,W=t.referenceWitness}let a=null,p="",m="",F=BigInt(3405691582),b=!1,l=null,i=0,w=0;function f(){m||(m=_()),p||(p=JSON.stringify({digitiser:{f_s_hz:1e4,f_mod_hz:1e3},sensor:{gamma_fwhm_hz:1e6,t1_s:.005,t2_s:1e-6,t2_star_s:2e-7,contrast:.03,n_spins:1e12,shot_noise_disabled:!1},dt_s:null})),a?.free?.(),a=new o(m,p,Number(F&0xFFFFFFFFn))}function s(r,e=[]){d.postMessage(r,e)}function B(){if(l!==null)return;w=performance.now(),i=0;const r=()=>{if(!b||!a)return;const e=32,t=a.run(e);i+=e;const n=(performance.now()-w)/1e3,c=n>0?i/n:0;s({type:"frames",batch:t.buffer,count:e,fps:c,framesEmitted:i},[t.buffer]),l=d.setTimeout(r,16)};l=d.setTimeout(r,0)}function h(){l!==null&&(d.clearTimeout(l),l=null)}d.addEventListener("message",async r=>{const e=r.data;try{switch(e.type){case"boot":{await S(),f(),s({type:"booted",id:e.id,buildVersion:o.buildVersion(),frameMagic:o.frameMagic(),frameBytes:o.frameBytes(),expectedWitnessHex:x()});break}case"setScene":{m=e.json,f(),s({type:"ack",id:e.id});break}case"setConfig":{p=e.json,f(),s({type:"ack",id:e.id});break}case"setSeed":{F=BigInt(e.seed),f(),s({type:"ack",id:e.id});break}case"reset":{h(),b=!1,f(),i=0,s({type:"ack",id:e.id}),s({type:"state",running:!1,framesEmitted:i});break}case"run":{a||f(),b=!0,B(),s({type:"ack",id:e.id}),s({type:"state",running:!0,framesEmitted:i});break}case"pause":{b=!1,h(),s({type:"ack",id:e.id}),s({type:"state",running:!1,framesEmitted:i});break}case"step":{a||f();const t=a.run(1);i+=1,s({type:"frames",batch:t.buffer,count:1,fps:0,framesEmitted:i},[t.buffer]),s({type:"ack",id:e.id});break}case"witnessGenerate":{a||f();const t=e.samples??256,n=a.runWithWitness(t),c=g(n.witness);s({type:"witness",id:e.id,witness:n.witness.buffer,hex:c,frameCount:n.frameCount},[n.witness.buffer]);break}case"witnessVerify":{const t=e.expected,n=new Uint8Array(t),c=W();let y=c.length===n.length;if(y){for(let u=0;u<n.length;u++)if(c[u]!==n[u]){y=!1;break}}const k=c.slice().buffer;s({type:"verify",id:e.id,ok:y,actual:k,actualHex:g(c)},[k]);break}case"buildId":{s({type:"buildId",id:e.id,buildId:`nvsim@${o.buildVersion()}`});break}default:s({type:"err",id:e.id,msg:`unknown op ${e.type}`})}}catch(t){s({type:"err",id:e.id,msg:t.message??String(t)})}});s({type:"ready"});
//# sourceMappingURL=worker-DBavH9su.js.map
File diff suppressed because one or more lines are too long