app
Chip Fetcher (cf)
Public Made by Adomby adom
Crawls the web on your behalf to gather everything about the chips you care about: datasheets, symbols, footprints, 3D models, stock and pricing, straight from the manufacturer first, into your EDA tool. Say "cf" to your AI.
← Commit history
ship-night: park Try it (copy-only Say it strip); the /ai-threads/run-prompt path stays in code behind TRY_IT_PARKED; 1.3.6
4 files changed
+20−3
Cargo.lock+1−1@@ -4,7 +4,7 @@ version = 4 [[package]] name = "adom-chip-fetcher"-version = "1.3.5"+version = "1.3.6" dependencies = [ "anyhow", "clap",
Cargo.toml+1−1@@ -1,6 +1,6 @@ [package] name = "adom-chip-fetcher"-version = "1.3.5"+version = "1.3.6" edition = "2021" description = "Crawls the web on your behalf to gather everything about the chips you care about (datasheet, symbol, footprint, 3D, stock) into one library, by driving Chrome via pup."
src/dock.rs+10@@ -239,6 +239,16 @@ pub fn say_phrases() -> Vec<String> { /// networking; in a cloud container it is not, and copying is the right /// answer there. pub fn try_phrase(phrase: &str) -> Value {+ // TRY_IT_PARKED (ship night 2026-08-23, dock-bar thread ruling, matching+ // adom-parts-search): every /ai-threads call from an app server can wake+ // ah's parked AI Threads backend, and run-prompt's typing path has an+ // unverified crash fix that has killed the whole ah process. Copy-only+ // until the all-clear; flip this to false to bring Try it back.+ const TRY_IT_PARKED: bool = true;+ if TRY_IT_PARKED {+ let _ = phrase;+ return json!({"staged": false, "reason": "Try it is parked tonight (ship-night posture); copy the phrase and paste it to your AI"});+ } let t = Duration::from_millis(1500); let get = |path: &str| -> Option<Value> { http_get(HYDROGEN_CONTROL_PORT, path, t).and_then(|b| serde_json::from_str(&b).ok())
src/ui/index.html+8−1@@ -561,7 +561,7 @@ dialog.settings{width:min(680px,92vw);overflow:hidden} <section class="say" id="say" aria-labelledby="sayTitle"> <div class="say-head"> <h2 id="sayTitle">Say it to your AI</h2>- <span class="say-sub">You do not drive this dashboard by hand. You ask your AI, using the words <b>chip fetcher</b>. Click a phrase to copy it; Try it stages it in this app's AI thread.</span>+ <span class="say-sub">You do not drive this dashboard by hand. You ask your AI, using the words <b>chip fetcher</b>. Click a phrase to copy it, then paste it to your AI.</span> </div> <div class="say-list" id="sayList"></div> </section>@@ -695,6 +695,7 @@ const $id = id => document.getElementById(id); function escapeHtml(s) { return String(s == null ? '' : s).replace(/[&<>"']/g, m => ({'&':'&','<':'<','>':'>','"':'"',"'":'''})[m]); } // Relative paths so the page works behind /proxy/<port>/ and inside a webview. const API_BASE = location.pathname.replace(/index\.html$/, '').replace(/\/$/, '');+const TRY_IT_PARKED = true; // ship-night posture: Say it is copy-only until the ah typing-path fix is certified const DASH = '\u2014'; // the data sentinel inventory.rs emits for "unknown"; never shown to a person const isPhone = () => matchMedia('(hover: none)').matches || window.innerWidth < 720; @@ -1032,6 +1033,12 @@ async function buildSay() { b.setAttribute('data-tooltip', 'Copy this phrase to your clipboard, then paste it to your AI.'); b.innerHTML = '“' + escapeHtml(p).replace(/chip ?fetcher/gi, m => '<em>' + m + '</em>') + '”'; b.onclick = async () => { try { await navigator.clipboard.writeText(p); cfToast('Copied: ' + p, { type: 'ok' }); } catch (e) { cfToast('Could not copy: ' + e.message, { type: 'err' }); } };+ // TRY_IT_PARKED (ship night 2026-08-23, dock-bar thread): the Try it path+ // POSTs /ai-threads/run-prompt, and tonight ah parks its AI Threads backend+ // until intent AND the typing path has an unverified crash fix, so one+ // click could crash the app the user is standing in. Copy-only until the+ // all-clear; flip the flag to bring Try it back.+ if (TRY_IT_PARKED) { item.appendChild(b); list.appendChild(item); continue; } const t = document.createElement('button'); t.className = 'say-try'; t.type = 'button'; t.textContent = 'Try it'; t.setAttribute('data-tooltip', "Stage this phrase in this app's AI thread. It is not sent; you press Enter there."); t.onclick = async () => {