Spaces:
Running
Running
Download index.html from agentencode/ai-agent-navigator: direct link, hf CLI and curl.
- Browser
- Download file 23.2 kB
-
https://huggingface.co/spaces/agentencode/ai-agent-navigator/resolve/main/index.html
- Command line
-
hf download hf://spaces/agentencode/ai-agent-navigator/index.html
-
curl -L -o index.html https://huggingface.co/spaces/agentencode/ai-agent-navigator/resolve/main/index.html
23.2 kB
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| <meta name="color-scheme" content="dark"> | |
| <meta name="description" content="Find and compare 140 source-linked AI agents. Search providers, explore 13 categories, and verify original sources in AgentenCode profiles."> | |
| <title>AgentenCode AI Agent Navigator | Explore 140 AI Agents</title> | |
| <style> | |
| :root{color-scheme:dark;font-family:Inter,ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif;--bg:#061a2b;--panel:#102d43;--surface:#0b2539;--line:#2a5772;--ink:#f0fbff;--muted:#b3cddb;--cyan:#65e6ed;--sky:#9ed5ee} | |
| *{box-sizing:border-box}body{margin:0;min-width:280px;line-height:1.58;color:var(--ink);background:radial-gradient(ellipse 65% 32% at 100% 0%,#104d6b 0%,transparent 85%),var(--bg)} | |
| a{color:var(--cyan)}button,input,select{font:inherit}button{cursor:pointer}.shell{max-width:1190px;margin:0 auto;padding:24px 24px 70px}.skip{position:absolute;left:-9999px;top:5px;background:#fff;color:#092c40;padding:12px;z-index:20}.skip:focus{left:10px} | |
| header.site-header{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;padding:6px 0 12px}.brand{color:var(--ink);text-decoration:none;font-size:1.4rem;font-weight:850;letter-spacing:-.05em}.brand span{color:var(--cyan)}.header-right{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.header-link{text-decoration:none;color:var(--sky);font-size:.88rem;border:1px solid var(--line);padding:8px 12px;border-radius:11px}.lang-switch{display:inline-flex;gap:4px;border:1px solid var(--line);border-radius:11px;padding:3px}.lang-switch button{background:transparent;color:var(--muted);border:0;border-radius:8px;padding:6px 11px;font-weight:700}.lang-switch button[aria-pressed=true]{background:#146481;color:var(--ink)} | |
| .hero{padding:46px 0 36px;max-width:900px}.eyebrow{display:inline-flex;gap:7px;align-items:center;font-size:.79rem;color:var(--cyan);font-weight:800;text-transform:uppercase;letter-spacing:.13em}.hero h1{font-size:clamp(2.25rem,5.2vw,4.5rem);line-height:1.12;letter-spacing:-.052em;margin:13px 0 14px}.hero p{max-width:760px;color:var(--muted);font-size:clamp(1rem,1.4vw,1.12rem)}.hero-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:20px}.button-primary,.button-secondary{display:inline-flex;align-items:center;justify-content:center;text-decoration:none;font-weight:760;border-radius:11px;min-height:44px;padding:10px 16px;border:1px solid var(--cyan)}.button-primary{background:var(--cyan);color:#062337}.button-secondary{color:var(--ink);border-color:#47778e} | |
| .stats{display:flex;gap:14px;flex-wrap:wrap;margin-bottom:27px}.stat{min-width:120px;background:#0b2b40;border:1px solid #28506a;padding:11px 18px;border-radius:13px}.stat strong{display:block;font-size:1.6rem;line-height:1.3;color:var(--cyan)}.stat span{font-size:.83rem;color:var(--muted)} | |
| .panel{background:linear-gradient(160deg,#12364e 0%,#0b293e 90%);border:1px solid var(--line);border-radius:19px;padding:24px}.panel-head{display:flex;align-items:start;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-bottom:18px}.panel h2{margin:0;font-size:1.44rem;letter-spacing:-.02em}.panel-head p{margin:5px 0 0;color:var(--muted);font-size:.94rem}.dataset-mini{font-size:.85rem;color:var(--sky);display:inline-flex;align-items:center;text-decoration:underline;text-underline-offset:4px} | |
| .controls{display:grid;grid-template-columns:minmax(180px,2fr) minmax(180px,1fr);gap:13px;margin-bottom:13px}.field{display:flex;flex-direction:column;gap:6px}.field label{font-size:.82rem;color:var(--muted);font-weight:700}.field input,.field select{width:100%;border:1px solid #56839c;border-radius:11px;padding:12px 13px;background:#071d30;color:var(--ink);min-height:48px}.field input::placeholder{color:#a1b9c8}.field select{appearance:auto}.toolbar{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;padding-bottom:12px;border-bottom:1px solid var(--line)}.toolbar label{display:inline-flex;align-items:center;gap:9px;font-size:.88rem;color:var(--muted);cursor:pointer}.toolbar input{width:18px;height:18px;accent-color:#34b9cf}.counter{font-size:.87rem;color:var(--muted);margin:0} | |
| .status{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;padding:9px 0 3px;min-height:38px;color:var(--muted);font-size:.82rem}.status button{background:transparent;color:var(--cyan);border:0;text-decoration:underline;padding:4px}.card-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;margin-top:14px}.card{min-width:0;border:1px solid #2f5771;background:#071e31;border-radius:15px;padding:19px;display:flex;flex-direction:column;gap:10px;min-height:230px}.card-top{display:flex;justify-content:space-between;gap:9px;flex-wrap:wrap}.category{font-size:.76rem;font-weight:750;color:#84d4e7;background:#133b55;padding:3px 9px;border-radius:999px}.archive{font-size:.75rem;color:#fee2a5;background:#493922;border-radius:99px;padding:3px 9px;font-weight:700}.provider{font-size:.77rem;font-weight:760;letter-spacing:.06em;text-transform:uppercase;color:var(--cyan)}.card h3{font-size:1.18rem;line-height:1.35;letter-spacing:-.017em;margin:0}.summary{font-size:.88rem;color:var(--muted);margin:0;line-height:1.55;flex:1}.card-meta{font-size:.78rem;color:#b4cbd7}.card-links{display:flex;align-items:center;gap:13px;flex-wrap:wrap;margin-top:auto;padding-top:8px}.card-links a{font-size:.88rem;font-weight:740;text-underline-offset:3px}.card-links a.secondary{font-weight:550;color:var(--sky)}.load-wrap{text-align:center;margin:22px 0 4px}.load-more{background:#146481;border:1px solid var(--cyan);border-radius:12px;padding:12px 24px;color:#fff;font-weight:780;min-height:47px}.empty{padding:38px 14px;text-align:center;color:var(--muted);margin:0}.explain{padding:23px 4px 0;color:var(--muted);font-size:.88rem;max-width:900px}.explain a{color:var(--sky)}.footer{border-top:1px solid var(--line);margin-top:45px;padding-top:22px;display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;color:var(--muted);font-size:.86rem}.footer a{color:var(--sky)} | |
| :focus-visible{outline:3px solid var(--cyan);outline-offset:3px} | |
| [hidden]{display:none!important} | |
| @media(max-width:930px){.card-grid{grid-template-columns:repeat(2,minmax(0,1fr))}} | |
| @media(max-width:640px){.shell{padding:15px 14px 40px}.hero{padding:32px 0 25px}.controls{grid-template-columns:1fr}.card-grid{grid-template-columns:1fr}.panel{padding:15px}.card{min-height:180px}.stats{gap:8px}.stat{flex:1;min-width:84px;padding:10px}.stat strong{font-size:1.37rem}.header-right{gap:6px}.header-link{padding:8px}.footer{margin-top:28px}} | |
| @media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}} | |
| </style> | |
| </head> | |
| <body> | |
| <a href="#main" class="skip" id="skip">Skip to content</a> | |
| <div class="shell"> | |
| <header class="site-header"><a href="https://agentencode.de/en/" class="brand" id="brand" target="_blank" rel="noopener noreferrer" aria-label="AgentenCode">Agenten<span>Code</span></a><div class="header-right"><a class="header-link" id="headerDataset" href="https://huggingface.co/datasets/agentencode/ai-agents-directory" target="_blank" rel="noopener noreferrer">Dataset ↗</a><div class="lang-switch" role="group" aria-label="Language"><button id="btn-en" type="button" aria-pressed="true">EN</button><button id="btn-de" type="button" aria-pressed="false">DE</button></div></div></header> | |
| <main id="main"> | |
| <section class="hero"><div class="eyebrow" id="eyebrow">AgentenCode · Source-first discovery</div><h1 id="title">Find an AI agent.<br>Verify the source.</h1><p id="intro">Search the complete AgentenCode catalog, discover agent products by use case and open source-linked profiles. No paid rankings or fictional benchmarks.</p><div class="hero-actions"><a class="button-primary" id="allAgents" href="https://agentencode.de/en/agents/" target="_blank" rel="noopener noreferrer">Explore full profiles ↗</a><a class="button-secondary" id="knowledge" href="https://agentencode.de/en/knowledge/" target="_blank" rel="noopener noreferrer">Learn about AI agents ↗</a></div></section> | |
| <div class="stats" aria-label="Catalog overview"><div class="stat"><strong id="countAgents">140</strong><span id="labelAgents">Agent profiles</span></div><div class="stat"><strong id="countProviders">94</strong><span id="labelProviders">Providers</span></div><div class="stat"><strong id="countCategories">13</strong><span id="labelCategories">Categories</span></div></div> | |
| <section class="panel" aria-labelledby="directoryTitle"> | |
| <div class="panel-head"><div><h2 id="directoryTitle">Explore the directory</h2><p id="directoryDesc">Filter by category or search names, vendors and descriptions.</p></div><a class="dataset-mini" href="https://huggingface.co/datasets/agentencode/ai-agents-directory" target="_blank" rel="noopener noreferrer" id="datasetLink">View published dataset ↗</a></div> | |
| <div class="controls"><div class="field"><label for="search" id="searchLabel">Search agents</label><input type="search" id="search" autocomplete="off" placeholder="Search name, provider or topic…"></div><div class="field"><label for="categorySelect" id="categoryLabel">Use case</label><select id="categorySelect"><option value="">All categories</option></select></div></div> | |
| <div class="toolbar"><label for="includeArchived"><input id="includeArchived" type="checkbox" checked><span id="archivedLabel">Include archived / replaced profiles</span></label><p class="counter" id="counter" role="status" aria-live="polite">Loading catalog…</p></div> | |
| <div class="status"><span id="sourceStatus" role="status" aria-live="polite">Loading bundled catalog snapshot…</span><button id="reload" type="button" hidden>Retry dataset connection</button></div> | |
| <div id="cards" class="card-grid"></div> | |
| <p id="empty" class="empty" hidden>No matching profiles. Try another search.</p> | |
| <div class="load-wrap"><button type="button" id="loadMore" class="load-more" hidden>Show more</button></div> | |
| </section> | |
| <p class="explain" id="note">Catalog snapshot: 15 October 2026. Editorially source-linked, not independently benchmarked or certified. Some products are archived; pricing, availability and features may change. Check original sources and current product documentation before making decisions.</p> | |
| </main> | |
| <footer class="footer"><span id="footerInfo">AgentenCode · independent reference · source snapshot 2026-10-15</span><span><a id="methodology" href="https://agentencode.de/en/methodology/" target="_blank" rel="noopener noreferrer">Methodology</a> · <a id="news" href="https://agentencode.de/en/news/" target="_blank" rel="noopener noreferrer">News</a></span></footer> | |
| </div> | |
| <script> | |
| ; | |
| (function () { | |
| const SITE='https://agentencode.de', DATASET='agentencode/ai-agents-directory'; | |
| const RAW_URL='https://huggingface.co/datasets/'+DATASET+'/resolve/main/data/agents.jsonl'; | |
| const API_URL='https://datasets-server.huggingface.co/rows?dataset='+DATASET+'&config=default&split=train'; | |
| const BATCH=18; | |
| const labels={ | |
| en:{eyebrow:'AgentenCode · Source-first discovery',title:'Find an AI agent. Verify the source.',intro:'Search the complete AgentenCode catalog, discover agent products by use case and open source-linked profiles. No paid rankings or fictional benchmarks.',all:'Explore full profiles ↗',knowledge:'Learn about AI agents ↗',directory:'Explore the directory',directoryDesc:'Filter by category or search names, vendors and descriptions.',dataset:'View published dataset ↗',headerDataset:'Dataset ↗',searchLabel:'Search agents',searchPlaceholder:'Search name, provider or topic…',categoryLabel:'Use case',allCategories:'All categories',archived:'Include archived / replaced profiles',profiles:'Agent profiles',providers:'Providers',categories:'Categories',profile:'Full profile ↗',source:'Original source ↗',noSource:'See profile for sources',reviewed:'Editorial review',archive:'Archived',viewed:'Showing',of:'of',matches:'profiles',showMore:'Show more',empty:'No matching profiles. Try another search.',bundle:'Showing bundled dataset snapshot (15 Oct 2026)',remote:'Synced from Hugging Face dataset (snapshot 15 Oct 2026)',syncing:'Showing snapshot; checking Hugging Face dataset…',retry:'Retry dataset connection',note:'Snapshot from 15 October 2026; this is editorial research, not independent product testing, certification or a ranking. Archived entries are labeled. Vendor features, plans and availability can change. Verify current original documentation.',foot:'AgentenCode · independent reference · source snapshot 2026-10-15',method:'Methodology',news:'News',loadError:'Dataset temporarily unavailable: showing packaged snapshot. You can retry.',failed:'Unable to load catalog. Please try again later.'}, | |
| de:{eyebrow:'AgentenCode · Quellenbasierte Orientierung',title:'Finde KI-Agenten. Prüfe die Quellen.',intro:'Durchsuche alle dokumentierten KI-Agenten, filtere nach Einsatzbereich und öffne Profile mit Originalquellen. Keine bezahlten Rankings oder erfundenen Benchmarks.',all:'Alle Agentenprofile ↗',knowledge:'KI-Agenten verstehen ↗',directory:'Agenten entdecken',directoryDesc:'Suche nach Namen, Anbietern und Themen oder filtere nach Anwendungsbereich.',dataset:'Hugging-Face-Datensatz öffnen ↗',headerDataset:'Datensatz ↗',searchLabel:'KI-Agenten suchen',searchPlaceholder:'Name, Anbieter oder Thema eingeben …',categoryLabel:'Anwendungsbereich',allCategories:'Alle Kategorien',archived:'Archivierte / abgelöste Profile einbeziehen',profiles:'Agentenprofile',providers:'Anbieter',categories:'Kategorien',profile:'Ganzes Profil ↗',source:'Originalquelle ↗',noSource:'Quellen im Profil',reviewed:'Redaktionell geprüft',archive:'Archiviert',viewed:'Angezeigt',of:'von',matches:'Profilen',showMore:'Weitere anzeigen',empty:'Keine passenden Profile. Bitte suche nach anderen Begriffen.',bundle:'Lokaler Datensatz (Stand 15.10.2026)',remote:'Von Hugging Face geladen (Datenstand 15.10.2026)',syncing:'Gesicherte Daten werden angezeigt; Hugging Face wird abgefragt …',retry:'Datenverbindung erneut prüfen',note:'Datenstand vom 15. Oktober 2026. Quellenbasierte redaktionelle Einordnung, keine unabhängige Produktprüfung, Zertifizierung oder Rangliste. Archivierte Einträge sind gekennzeichnet. Funktionen, Preise und Zugang können sich ändern. Originalquellen prüfen.',foot:'AgentenCode · unabhängige Orientierung · Datenstand 15.10.2026',method:'Methodik',news:'News',loadError:'Datensatz derzeit nicht erreichbar: lokale Sicherung wird angezeigt. Erneut versuchen möglich.',failed:'Verzeichnis konnte nicht geladen werden. Bitte später erneut versuchen.'} | |
| }; | |
| const categoryDE={'Research':'Recherche','Coding':'Programmierung','Automation':'Automatisierung','Enterprise':'Unternehmen','Customer Service & Sales':'Kundenservice & Vertrieb','Legal':'Recht','Finance':'Finanzen','HR & Recruiting':'Personal & Recruiting','Procurement':'Einkauf','Testing & QA':'Testing & Qualität','Security':'Sicherheit','IT Security':'IT-Sicherheit','Enterprise Productivity':'Produktivität in Unternehmen'}; | |
| const $=id=>document.getElementById(id); | |
| let lang='en', all=[],visible=[],shown=BATCH,source='bundle',status='syncing',loading=false; | |
| function safeSlug(s){return /^[a-z0-9-]+$/.test(s)} | |
| function normalize(r){ | |
| const slug=String(r.slug||'');if(!safeSlug(slug)||!r.name||!r.provider||!r.category_en)return null; | |
| const values=Array.isArray(r.primary_source_urls)?r.primary_source_urls:[r.primary_source_url,r.secondary_source_url].filter(Boolean); | |
| const sources=values.filter(v=>{try{const u=new URL(v);return u.protocol==='https:'}catch{return false}}); | |
| return {slug,name:String(r.name),provider:String(r.provider),category:String(r.category_en),summary:String(r.summary_de||''),sources, | |
| review:String(r.last_editorial_review||r.editorial_review_date||''),archived:r.catalog_status==='archived'||['discontinued','superseded'].includes(r.lifecycle_status),lifecycle:r.lifecycle_status||'',snapshot:String(r.snapshot_date||r.catalog_snapshot_date||'')}; | |
| } | |
| function validate(payload){if(!Array.isArray(payload))throw Error('Non-array data');const parsed=payload.map(normalize);if(parsed.some(x=>!x))throw Error('Invalid records');const slugs=new Set(parsed.map(x=>x.slug));if(parsed.length<140||slugs.size!==parsed.length)throw Error('Incomplete or duplicate dataset');return parsed;} | |
| function jsonl(content){return validate(content.trim().split(/\r?\n/).filter(Boolean).map(s=>JSON.parse(s)))} | |
| async function get(url,ms=8500){const c=new AbortController(),timer=setTimeout(()=>c.abort(),ms);try{const resp=await fetch(url,{signal:c.signal,mode:'cors',cache:'no-store'});if(!resp.ok)throw Error('HTTP '+resp.status);return resp}finally{clearTimeout(timer)}} | |
| async function remoteData(){ | |
| try{return jsonl(await (await get(RAW_URL,6500)).text())}catch(_rawError){ | |
| const first=await (await get(API_URL+'&offset=0&length=100',6000)).json(); | |
| if(!Array.isArray(first.rows))throw Error('No row list'); | |
| const expected=first.num_rows_total;if(!Number.isInteger(expected)||expected<140||expected>2000)throw Error('Unexpected dataset size'); | |
| let collection=first.rows.map(item=>item.row); | |
| for(let offset=100;offset<expected;offset+=100){const next=await (await get(API_URL+'&offset='+offset+'&length=100',6000)).json();collection.push(...next.rows.map(item=>item.row))} | |
| if(collection.length!==expected)throw Error('Incomplete paginated data'); | |
| return validate(collection); | |
| } | |
| } | |
| function setStatus(s){status=s;const t=labels[lang];$('sourceStatus').textContent=s==='remote'?t.remote:s==='error'?t.loadError:s==='failed'?t.failed:s==='syncing'?t.syncing:t.bundle;$('reload').hidden=s!=='error'&&s!=='failed';$('reload').textContent=t.retry;} | |
| function categories(){const select=$('categorySelect'),choice=select.value,values=[...new Set(all.map(x=>x.category))].sort((a,b)=>a.localeCompare(b));select.replaceChildren();const first=document.createElement('option');first.value='';first.textContent=labels[lang].allCategories;select.append(first);for(const key of values){const op=document.createElement('option');op.value=key;op.textContent=lang==='de'?categoryDE[key]||key:key;select.append(op)}select.value=values.includes(choice)?choice:'';} | |
| function card(row){const t=labels[lang],box=document.createElement('article');box.className='card'; | |
| const top=document.createElement('div');top.className='card-top';const category=document.createElement('span');category.className='category';category.textContent=lang==='de'?categoryDE[row.category]||row.category:row.category;top.append(category); | |
| if(row.archived){const badge=document.createElement('span');badge.className='archive';badge.textContent=t.archive;top.append(badge)} | |
| const provider=document.createElement('div');provider.className='provider';provider.textContent=row.provider; | |
| const name=document.createElement('h3');name.textContent=row.name; | |
| const summary=document.createElement('p');summary.className='summary';summary.textContent=lang==='de'?row.summary:'AgentenCode editorial profile with vendor-source references and documented limitations.'; | |
| const reviewed=document.createElement('div');reviewed.className='card-meta';reviewed.textContent=t.reviewed+': '+(row.review||'—'); | |
| const links=document.createElement('div');links.className='card-links';const link=document.createElement('a');link.href=SITE+'/'+(lang==='de'?'agenten/':'en/agents/')+row.slug+'/';link.textContent=t.profile;link.target='_blank';link.rel='noopener noreferrer';links.append(link); | |
| if(row.sources[0]){const external=document.createElement('a');external.href=row.sources[0];external.className='secondary';external.textContent=t.source;external.target='_blank';external.rel='noopener noreferrer';links.append(external)} | |
| box.append(top,provider,name,summary,reviewed,links);return box;} | |
| function filter(){const term=$('search').value.toLocaleLowerCase().trim(),category=$('categorySelect').value,withArchived=$('includeArchived').checked; | |
| visible=all.filter(row=>(withArchived||!row.archived)&&(!category||row.category===category)&&(!term||[row.name,row.provider,row.category,row.summary,row.slug,lang==='de'?categoryDE[row.category]||'':''].some(s=>s.toLocaleLowerCase().includes(term))));shown=BATCH;paint();} | |
| function paint(){const t=labels[lang],cards=$('cards');cards.replaceChildren(...visible.slice(0,shown).map(card));const displayed=Math.min(shown,visible.length);$('counter').textContent=t.viewed+' '+displayed+' '+t.of+' '+visible.length+' '+t.matches; | |
| $('loadMore').hidden=shown>=visible.length;$('loadMore').textContent=t.showMore+' ('+(visible.length-displayed)+')';$('empty').hidden=visible.length!==0; $('empty').textContent=t.empty;} | |
| function render(){const t=labels[lang];document.documentElement.lang=lang;$('skip').textContent=lang==='de'?'Zum Inhalt springen':'Skip to content';$('btn-en').setAttribute('aria-pressed',String(lang==='en'));$('btn-de').setAttribute('aria-pressed',String(lang==='de')); | |
| const ids={eyebrow:'eyebrow',title:'title',intro:'intro',allAgents:'all',knowledge:'knowledge',directoryTitle:'directory',directoryDesc:'directoryDesc',datasetLink:'dataset',headerDataset:'headerDataset',searchLabel:'searchLabel',categoryLabel:'categoryLabel',archivedLabel:'archived',labelAgents:'profiles',labelProviders:'providers',labelCategories:'categories',note:'note',footerInfo:'foot',methodology:'method',news:'news'}; | |
| for(const [id,key] of Object.entries(ids))$(id).textContent=t[key];$('search').placeholder=t.searchPlaceholder; | |
| $('brand').href=SITE+'/'+(lang==='de'?'':'en/');$('allAgents').href=SITE+'/'+(lang==='de'?'agenten/':'en/agents/');$('knowledge').href=SITE+'/'+(lang==='de'?'wissen/':'en/knowledge/');$('methodology').href=SITE+'/'+(lang==='de'?'methodik/':'en/methodology/');$('news').href=SITE+'/'+(lang==='de'?'aktuelles/':'en/news/'); | |
| $('countAgents').textContent=all.length||140;$('countProviders').textContent=new Set(all.map(x=>x.provider)).size||94;$('countCategories').textContent=new Set(all.map(x=>x.category)).size||13; | |
| categories();setStatus(status);paint();} | |
| async function refreshRemote(){if(loading)return;loading=true;if(!all.length)setStatus('syncing');try{const remote=await remoteData();all=remote;source='remote';render();setStatus('remote');filter()}catch(error){setStatus(all.length?'error':'failed');console.warn('Dataset refresh failed; bundled snapshot is retained:',error.message)}finally{loading=false}} | |
| async function boot(){ | |
| try{all=jsonl(await (await get('data/agents.jsonl',5500)).text());render();setStatus('syncing');filter()} | |
| catch(error){setStatus('failed');console.warn('Cannot load bundled snapshot:',error.message)} | |
| await refreshRemote(); | |
| } | |
| $('btn-en').addEventListener('click',()=>{lang='en';render()});$('btn-de').addEventListener('click',()=>{lang='de';render()}); | |
| $('categorySelect').addEventListener('change',filter);$('search').addEventListener('input',filter);$('includeArchived').addEventListener('change',filter);$('reload').addEventListener('click',refreshRemote);$('loadMore').addEventListener('click',()=>{shown+=BATCH;paint()}); | |
| boot(); | |
| })(); | |
| </script> | |
| </body> | |
| </html> | |