← Commit history

Request Codex explicitly from starter prompts and retain transparent generic proxy

John Lauer ·b3422ae992 ·29d ago ·parent ff8c426
5 files changed +15−11
adom_codex.py+8−4
@@ -17,7 +17,11 @@ class Handler(SimpleHTTPRequestHandler):   if not path.exists():return self.json({'ok':False,'error':'Hydrogen control API unavailable','hint':'Open Adom Hydrogen in this workspace; its dynamic control URL is missing.'},503)   base=path.read_text().strip()   data=self.rfile.read(int(self.headers.get('Content-Length','0'))) if self.command=='POST' else None-  req=urllib.request.Request(base.rstrip('/')+self.path,data=data,method=self.command,headers={'Content-Type':'application/json'})+  upstream=self.path.removeprefix('/codex') if self.path.startswith('/codex/') else self.path+  if self.command=='POST' and self.path=='/codex/ai-threads/run-prompt':+   try:payload=json.loads(data);payload['type']='codex';payload['background']=True;data=json.dumps(payload).encode()+   except (ValueError,TypeError):return self.json({'error':'Valid JSON object required'},400)+  req=urllib.request.Request(base.rstrip('/')+upstream,data=data,method=self.command,headers={'Content-Type':'application/json'})   try:r=urllib.request.urlopen(req,timeout=120)   except urllib.error.HTTPError as e:r=e   except Exception as e:return self.json({'ok':False,'error':'Hydrogen control API unavailable','detail':str(e)},503)@@ -26,19 +30,19 @@ class Handler(SimpleHTTPRequestHandler):   if self.path in ['/api/status','/state']:return self.json(context())   if self.path=='/events':    b=('data: '+json.dumps(context())+'\n\n').encode();self.send_response(200);self.send_header('Content-Type','text/event-stream');self.send_header('Content-Length',str(len(b)));self.end_headers();self.wfile.write(b);return-  if self.path=='/updater/status' or self.path.startswith('/ai-threads/run-prompt/status?'):return self.proxy()+  if self.path in ['/updater/status','/codex/updater/status'] or self.path.startswith(('/ai-threads/run-prompt/status?','/codex/ai-threads/run-prompt/status?')):return self.proxy()   if self.path=='/':self.path='/dashboard/index.html'   # Serve only package-owned public assets, never arbitrary host files.   if not self.path.startswith(('/dashboard/','/videos/','/docs/')):return self.send_error(404)   return super().do_GET()  def do_OPTIONS(self):-  if self.path!='/ai-threads/run-prompt':return self.send_error(404)+  if self.path not in ['/ai-threads/run-prompt','/codex/ai-threads/run-prompt']:return self.send_error(404)   self.send_response(204);self.send_header('Allow','POST, OPTIONS');self.send_header('Content-Length','0');self.end_headers()  def do_POST(self):   origin=self.headers.get('Origin')   if origin and urllib.parse.urlsplit(origin).netloc!=self.headers.get('Host'):return self.json({'error':'Origin refused'},403)   if self.headers.get('Content-Type','').split(';')[0]!='application/json':return self.json({'error':'JSON required'},415)-  if self.path=='/ai-threads/run-prompt':return self.proxy()+  if self.path in ['/ai-threads/run-prompt','/codex/ai-threads/run-prompt']:return self.proxy()   return self.send_error(404) def main():  p=argparse.ArgumentParser();p.add_argument('command',choices=['context','serve','_serve']);p.add_argument('--print-url',action='store_true');p.add_argument('--port',type=int,default=47863);a=p.parse_args()
dashboard/index.html+2−2
@@ -1,9 +1,9 @@ <!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Codex in Hydrogen</title><link rel="icon" href="/dashboard/icon.svg"><style> :root{color-scheme:dark;--bg:#0d1117;--card:#161b22;--text:#e6edf3;--muted:#8b949e;--line:#30363d;--teal:#00b8b1}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:15px 'Familjen Grotesk',system-ui,sans-serif}header{height:44px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:8px;padding:0 16px}header img{width:18px;height:18px}header strong{font-size:15px}header span{color:var(--muted);font-size:13px}.spacer{flex:1}button,a{touch-action:manipulation}button{background:var(--card);color:var(--text);border:1px solid var(--line);border-radius:6px;padding:8px 12px;cursor:pointer}button:hover,button:focus-visible{border-color:var(--teal)}main{margin:auto;padding:16px}h1{font-size:30px;margin:0 0 8px}h2{font-size:19px}p{line-height:1.6;color:var(--muted)}a{color:var(--teal)}.pills{display:flex;gap:8px;flex-wrap:wrap;margin:16px 0}.pill{border:1px solid var(--line);border-radius:20px;padding:6px 12px;font-size:12px}.grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}.card{padding:22px;background:var(--card);border:1px solid var(--line);border-radius:12px}.card button{margin-right:8px}video{width:100%;max-height:70vh;background:#000}dialog{width:min(1100px,95vw);background:var(--card);color:var(--text);border:1px solid var(--line);border-radius:12px}dialog::backdrop{background:#0008}pre{white-space:pre-wrap;word-break:break-word}.close{float:right}#toast{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);background:var(--card);padding:12px;border:1px solid var(--teal);border-radius:8px;display:none}@media(max-width:720px){.grid{grid-template-columns:1fr}header span{display:none}main{padding:16px}}-</style><header><img src="/dashboard/icon.svg" alt=""><strong title="Codex integration">Codex</strong><span>Engineering in Hydrogen</span><div class="spacer"></div><span id="machine">Container</span><button id="help" title="Show or hide starter prompts" aria-label="Starter prompts">?</button><button id="settings" title="Integration details" aria-label="Integration details"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="m10 2 4 0 1 3 3 2 3 0 1 4-2 2-1 3 1 3-4 2-2-2-3-1-3 1-2-4 2-2 1-3-1-3 4-2z"/><circle cx="12" cy="12" r="3"/></svg></button></header><main><div id="newbie"></div><div class="pills" id="status"><span class="pill">Checking local integration</span></div><h1>Turn a prompt into working engineering.</h1><p>Orient Codex in your Adom workspace, then drive real tools through Adom Bridge.</p><div class="grid"><section class="card"><h2>Astra routes and checks a real Fusion board</h2><p>Watch Astra-calculated 45-degree routes, native vias and connected thermal pours appear in Fusion. Then reproduce the workflow on your desktop with the packaged skills.</p><button data-demo="https://wiki.adom.inc/api/pages/adom/codex/files/videos/fusion/10-bq25792-thermal-45-narrated.mp4">Watch the latest video · 3:43</button><a href="https://wiki.adom.inc/adom/codex/files/docs/REPRODUCE-FUSION.md" target="_blank">Reproduce this with Astra</a><p>Use Codex with Astra in your AI picker. Send to AI opens your configured AI; prompt wording alone does not select a model.</p></section><section class="card"><h2>Workspace setup</h2><p>The package installs an ecosystem entry point, a focused skill and a context command. Your existing instructions and credentials stay yours.</p><button id="inspect">Inspect this workspace</button><a href="https://wiki.adom.inc/adom/codex/files/docs/BOOTSTRAP.md" target="_blank">Setup guide</a></section><section class="card"><h2>Astra routes live in KiCad</h2><p>Watch traces, layer-changing vias and branched nets appear in the real editor. The captions explain the calculation and the measured results.</p><button data-demo="01-astra-live-routing-3x.mp4">6-net demo · 23 sec</button><button data-demo="02-astra-crossbar-24-3x.mp4">24-net demo · 31 sec</button></section><section class="card"><h2>Real-board comparisons</h2><p>Watch a public Adom board go from the human reference to zero traces and independently calculated routing, with narrated explanations and measured KiCad results.</p><button data-demo="04-public-adom-solenoid-full-routing-narrated.mp4">Public board · narrated · 82 sec</button><a href="https://wiki.adom.inc/adom/codex/files/docs/ASTRA-KICAD.md" target="_blank">Read the engineering log</a></section><section class="card"><h2>Codex Desktop</h2><p>Planned: verified desktop installation and a Bridge connection between Hydrogen and Codex Desktop. Desktop controls are not installed by this version.</p><a href="https://wiki.adom.inc/adom/codex/files/docs/DESKTOP-BRIDGE.md" target="_blank">Integration roadmap</a></section></div></main><dialog id="player"><button class="close" id="close-video" title="Close video">Close</button><h2>Astra engineering demonstrations</h2><video id="video" controls playsinline></video></dialog><dialog id="details"><button class="close" id="close-details">Close</button><h2>Local integration</h2><pre id="context"></pre></dialog><div id="toast" role="status"></div><script src="/dashboard/vendor/newbie-panel.js"></script><script>+</style><header><img src="/dashboard/icon.svg" alt=""><strong title="Codex integration">Codex</strong><span>Engineering in Hydrogen</span><div class="spacer"></div><span id="machine">Container</span><button id="help" title="Show or hide starter prompts" aria-label="Starter prompts">?</button><button id="settings" title="Integration details" aria-label="Integration details"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="m10 2 4 0 1 3 3 2 3 0 1 4-2 2-1 3 1 3-4 2-2-2-3-1-3 1-2-4 2-2 1-3-1-3 4-2z"/><circle cx="12" cy="12" r="3"/></svg></button></header><main><div id="newbie"></div><div class="pills" id="status"><span class="pill">Checking local integration</span></div><h1>Turn a prompt into working engineering.</h1><p>Orient Codex in your Adom workspace, then drive real tools through Adom Bridge.</p><div class="grid"><section class="card"><h2>Astra routes and checks a real Fusion board</h2><p>Watch Astra-calculated 45-degree routes, native vias and connected thermal pours appear in Fusion. Then reproduce the workflow on your desktop with the packaged skills.</p><button data-demo="https://wiki.adom.inc/api/pages/adom/codex/files/videos/fusion/10-bq25792-thermal-45-narrated.mp4">Watch the latest video · 3:43</button><a href="https://wiki.adom.inc/adom/codex/files/docs/REPRODUCE-FUSION.md" target="_blank">Reproduce this with Astra</a><p>Send to AI opens Codex directly. Select Astra in Codex’s model selector before starting a fresh calculation.</p></section><section class="card"><h2>Workspace setup</h2><p>The package installs an ecosystem entry point, a focused skill and a context command. Your existing instructions and credentials stay yours.</p><button id="inspect">Inspect this workspace</button><a href="https://wiki.adom.inc/adom/codex/files/docs/BOOTSTRAP.md" target="_blank">Setup guide</a></section><section class="card"><h2>Astra routes live in KiCad</h2><p>Watch traces, layer-changing vias and branched nets appear in the real editor. The captions explain the calculation and the measured results.</p><button data-demo="01-astra-live-routing-3x.mp4">6-net demo · 23 sec</button><button data-demo="02-astra-crossbar-24-3x.mp4">24-net demo · 31 sec</button></section><section class="card"><h2>Real-board comparisons</h2><p>Watch a public Adom board go from the human reference to zero traces and independently calculated routing, with narrated explanations and measured KiCad results.</p><button data-demo="04-public-adom-solenoid-full-routing-narrated.mp4">Public board · narrated · 82 sec</button><a href="https://wiki.adom.inc/adom/codex/files/docs/ASTRA-KICAD.md" target="_blank">Read the engineering log</a></section><section class="card"><h2>Codex Desktop</h2><p>Planned: verified desktop installation and a Bridge connection between Hydrogen and Codex Desktop. Desktop controls are not installed by this version.</p><a href="https://wiki.adom.inc/adom/codex/files/docs/DESKTOP-BRIDGE.md" target="_blank">Integration roadmap</a></section></div></main><dialog id="player"><button class="close" id="close-video" title="Close video">Close</button><h2>Astra engineering demonstrations</h2><video id="video" controls playsinline></video></dialog><dialog id="details"><button class="close" id="close-details">Close</button><h2>Local integration</h2><pre id="context"></pre></dialog><div id="toast" role="status"></div><script src="/dashboard/vendor/newbie-panel.js"></script><script> const $=s=>document.querySelector(s);function toast(s){$('#toast').textContent=s;$('#toast').style.display='block';setTimeout(()=>$('#toast').style.display='none',4000)} function play(file){$('#video').src=file.startsWith('https://')?file:'/videos/'+file;$('#player').showModal();$('#video').play().catch(()=>toast('Press Play to start the video.'))}-const panel=AdomNewbiePanel.mount({mount:'#newbie',app:'codex',appName:'Codex',slug:'codex',toggleButton:'#help',demo:{label:'Watch the routing demo',meta:'Fusion thermal routing, 3 min 43 sec',onPlay:()=>play('https://wiki.adom.inc/api/pages/adom/codex/files/videos/fusion/10-bq25792-thermal-45-narrated.mp4')},phrases:["Codex Astra, reproduce the Fusion thermal-routing demo",'Codex, inspect this workspace','Codex, review my PCB thermal paths']});+const panel=AdomNewbiePanel.mount({mount:'#newbie',apiBase:'/codex',app:'codex',appName:'Codex',slug:'codex',toggleButton:'#help',demo:{label:'Watch the routing demo',meta:'Fusion thermal routing, 3 min 43 sec',onPlay:()=>play('https://wiki.adom.inc/api/pages/adom/codex/files/videos/fusion/10-bq25792-thermal-45-narrated.mp4')},phrases:["Codex Astra, reproduce the Fusion thermal-routing demo",'Codex, inspect this workspace','Codex, review my PCB thermal paths']}); async function inspect(){try{const r=await fetch('/api/status');if(!r.ok)throw Error('Context unavailable');const s=await r.json();$('#context').textContent=JSON.stringify(s,null,2);$('#details').showModal()}catch(e){toast(e.message)}} $('#inspect').onclick=inspect;$('#settings').onclick=inspect;$('#close-details').onclick=()=>$('#details').close();$('#close-video').onclick=()=>$('#player').close();$('#player').addEventListener('close',()=>$('#video').pause());document.querySelectorAll('[data-demo]').forEach(b=>b.onclick=()=>play(b.dataset.demo)); function status(s){$('#machine').textContent=s.container.hostname;$('#status').replaceChildren(...['Entry point: '+(s.instructionsInstalled?'installed':'not installed'),'Bridge CLI: '+(s.tools['adom-bridge']?'available':'missing'),'Host target: select in Bridge'].map(t=>{let e=document.createElement('span');e.className='pill';e.textContent=t;return e}))}
docs/REPRODUCE-FUSION.md+2−2
@@ -1,6 +1,6 @@ # Reproduce the Fusion + Astra demonstration -Start with the latest Adom Hydrogen build for your release channel. Check Settings → updates and compare the running and latest versions; apply an available update before testing prompt delivery. Install or update `adom/codex` (`adom-wiki pkg install adom/codex`) and open **Codex** from the dock. The first starter prompt is **Codex Astra, reproduce the Fusion thermal-routing demo**. Use **Send to AI** to open a new conversation, then confirm the conversation is using Codex with Astra. A model subscription/login, Fusion installation and a connected Adom Bridge are required; the package does not supply those accounts.+Start with the latest Adom Hydrogen build for your release channel. Check Settings → updates and compare the running and latest versions; apply an available update before testing prompt delivery. Install or update `adom/codex` (`adom-wiki pkg install adom/codex`) and open **Codex** from the dock. The first starter prompt is **Codex Astra, reproduce the Fusion thermal-routing demo**. Use **Send to AI** to open a new Codex conversation. The dashboard explicitly requests Codex rather than relying on Hydrogen’s default picker. Confirm Astra in Codex’s model selector before asking for fresh routing. A model subscription/login, Fusion installation and a connected Adom Bridge are required; the package does not supply those accounts.  The assistant should read this guide and the installed electrical-routing, ablation-routing and routing-video skills. Discover your desktop and bridge capabilities; never reuse CRR, another user's relay, HWND or document IDs. Preserve any pinned development bridge. Find the public `adom/bq25792-charger` reference and work on a new copy. The source/replay evidence lives on `adom/fusion-bridge`, branch `feature/per-net-trace-routing`, under `demo/routing/bq25792/thermal/`. @@ -17,4 +17,4 @@ Expected historical result for comparison: 576 segments, 89 vias, eight pours, n  ## Prompt delivery checks -The dashboard vendors the shared Adom newbie panel. Its version check and asynchronous send/status calls pass through the dashboard to the current host control API. A queued job is not delivery: wait for the reported delivery state and verify the prompt in the new thread. If a call times out, inspect the thread/job before retrying. Never overwrite another draft. Choose Astra in the AI picker if your default provider/model is different; changing a prompt's wording cannot change the underlying model.+The dashboard vendors the shared Adom newbie panel. Its version check and asynchronous send/status calls pass through the dashboard to the current host control API. A queued job is not delivery: wait for the reported delivery state and verify the prompt in the new thread. If a call times out, inspect the thread/job before retrying. Never overwrite another draft. The Codex dashboard uses a dedicated adapter that adds `type:codex` and `background:true`, leaving the shared newbie panel unchanged. The generic proxy passes bodies and responses unchanged; the dedicated adapter changes only the outgoing provider request and preserves the upstream response. Astra still needs to be selected in Codex’s model selector; changing prompt wording does not change the model.
package.json+1−1
@@ -4,7 +4,7 @@   "type": "app",   "title": "Codex",   "brief": "Codex in Adom Hydrogen: ecosystem setup, dock dashboard and live engineering demos.",-  "version": "0.1.10",+  "version": "0.1.11",   "description": "Codex in Adom Hydrogen with reusable CAD routing, electrical review, copper-ablation and narrated video skills, plus verified KiCad and Fusion demo progressions.",   "org": "adom",   "needs_sudo": false,
page.json+2−2
@@ -4,7 +4,7 @@   "type": "app",   "title": "Codex",   "brief": "Codex in Adom Hydrogen: ecosystem setup, dock dashboard and live engineering demos.",-  "version": "0.1.10",+  "version": "0.1.11",   "hero": {     "type": "image",     "path": "screenshots/hero.png"@@ -95,4 +95,4 @@     "videos/04-public-adom-solenoid-full-routing-narrated.mp4",     "videos/04-public-adom-solenoid-full-routing.mp4"   ]-}\ No newline at end of file+}