← Commit history

Publish 1.0.61

John Lauer ·7c78fef690 ·1mo ago ·parent c6ed834
4 files changed +13−5
dashboard/kicad_dashboard.py+1−1
@@ -49,7 +49,7 @@ from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer from pathlib import Path from urllib.parse import unquote, urlparse -VERSION = "2.2.3"+VERSION = "2.2.4" AI_THREAD = "kicad-dashboard" DEFAULT_PORT = 8931 UI_DIR = Path(__file__).resolve().parent / "ui"
dashboard/ui/index.html+10−2
@@ -209,7 +209,7 @@ main a:hover{border-bottom-color:var(--accent)}   <section class="say" id="say" aria-labelledby="sayTitle">     <div class="say-head">       <h2 id="sayTitle" style="margin:0">Say it to your AI</h2>-      <span class="say-sub">You do not drive this dashboard. You ask your AI, using the word <b>kicad</b>. Click a phrase to copy it; Try it stages it into this app's AI thread.</span>+      <span class="say-sub">You do not drive this dashboard. You ask your AI, using the word <b>kicad</b>. Click a phrase to copy it, then paste it to your AI.</span>     </div>     <div class="say-list" id="sayList"></div>   </section>@@ -460,6 +460,12 @@ $('#btnPartTour').onclick=async()=>{ // interstitial and this strip teach the same words. Copy on click; Try it // stages the phrase into the app's AI thread when the Hydrogen control API is // reachable, and copies with an honest toast when it is not.+// SHIP-NIGHT PARK (dock thread relaying John, 2026-08-23): "Try it" POSTs+// /ai-threads/run-prompt, whose typing path has an unverified crash fix and+// which wakes ah's parked AI backend - one press could crash the app the user+// is standing in. Copy-only until the dock thread lifts the park; the server+// action and this button code stay, flip the flag to restore.+const TRY_IT_PARKED=true; async function buildSay(){   let phrases=[];   try{const r=await act('say');phrases=((r.data||r).phrases)||[];}catch(e){}@@ -471,6 +477,8 @@ async function buildSay(){     b.setAttribute('data-tip','Copy this phrase');     b.innerHTML='&ldquo;'+p.replace(/kicad/gi,m=>'<em>'+m+'</em>')+'&rdquo;';     b.onclick=async()=>{try{await navigator.clipboard.writeText(p);toast('copied: '+p,'ok');}catch(e){toast('could not copy: '+e,'err');}};+    item.appendChild(b);+    if(TRY_IT_PARKED){list.appendChild(item);continue;}     const t=document.createElement('button');t.className='say-try';t.type='button';t.textContent='Try it';     t.setAttribute('data-tip','Stage this phrase in this app\'s AI thread (not submitted, you press Enter)');     t.onclick=async()=>{@@ -483,7 +491,7 @@ async function buildSay(){       }catch(e){toast('try failed: '+e,'err');}       finally{t.disabled=false;}     };-    item.appendChild(b);item.appendChild(t);list.appendChild(item);+    item.appendChild(t);list.appendChild(item);   } } // ---- Settings (settings-layout skill: modal, four dismissals, optimistic saves) ----
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "kicad-bridge",-  "version": "1.0.60",+  "version": "1.0.61",   "type": "app",   "description": "Skills for your container so your AI knows how to drive the KiCad bridge. The bridge runtime itself is the release zip; Adom Bridge loads that.",   "tags": [
page.json+1−1
@@ -4,7 +4,7 @@   "slug": "kicad-bridge",   "title": "KiCad - the KiCad Bridge",   "brief": "Reference implementation of the KiCad bridge — multi-instance Python server, forward path via kicad-cli, reverse path via in-process plugin. Most complex of the three bundled bridges.",-  "version": "1.0.60",+  "version": "1.0.61",   "tags": [     "kicad",     "pcb",