PageSourceSearch

https://kanverseitsolutions.netlify.app/script.js

js kanverseitsolutions.netlify.app collected 2026-10-03 10:57:37 UTC 16,323 bytes, 283 lines download raw bytes

1const b=document.getElementById('menu'),n=document.getElementById('nav');
2
3// Keep the main navigation compact while exposing Kanverse's community initiative.
4if(n&&!n.querySelector('a[href="/for-good.html"]')){
5  const good=document.createElement('a');
6  good.href='/for-good.html';
7  good.textContent='For Good';
8  const contact=n.querySelector('a[href="#contact"]');
9  n.insertBefore(good,contact||null);
10}
11
12// Blink Bridge: direct navigation from the Kanverse homepage.
13if(n&&!n.querySelector('a[href="/blink-bridge/"]')){
14  const bridge=document.createElement('a');
15  bridge.href='/blink-bridge/';
16  bridge.textContent='Blink Bridge';
17  const contact=n.querySelector('a[href="#contact"]');
18  n.insertBefore(bridge,contact||null);
19}
20
21b.onclick=()=>{const o=n.classList.toggle('open');b.textContent=o?'✕':'☰';b.setAttribute('aria-expanded',o)};
22n.querySelectorAll('a').forEach(a=>a.onclick=()=>{n.classList.remove('open');b.textContent='☰'});
23document.getElementById('year').textContent=new Date().getFullYear();
24if('serviceWorker'in navigator)addEventListener('load',()=>navigator.serviceWorker.register('/sw.js'));
25
26// Add Blink Bridge to the existing Blink Universe without changing the homepage markup.
27const blinkUniverse=document.querySelector('#blink-universe .kv-project-tiles, #blink-universe .cards, #blink-universe .grid, #blink-universe');
28if(blinkUniverse&&!blinkUniverse.querySelector('.blink-bridge-home-card')){
29  const card=document.createElement('article');
30  card.className='blink-bridge-home-card';
31  card.innerHTML='<span class="tag">BLINK ENGINE</span><h3>Blink Bridge</h3><p>Connect two browser endpoints and move explicitly approved page context between them — ready for remote inspection and AI reasoning.</p><div class="actions" style="margin-top:16px"><a class="btn primary" href="/blink-bridge/">Explore Blink Bridge →</a></div>';
32  blinkUniverse.appendChild(card);
33}
34
35// Never Forget is now publicly available on Microsoft Store and as an installable Android PWA.
36const neverForgetTile=[...document.querySelectorAll('#more-projects .kv-project-tiles article')]
37  .find(card=>card.querySelector('h3')?.textContent.trim()==='Never Forget');
38
39if(neverForgetTile){
40  const status=neverForgetTile.querySelector('b');
41  if(status) status.textContent='Available on Microsoft Store · Android PWA';
42
43  if(!neverForgetTile.querySelector('.nf-store-actions')){
44    const actions=document.createElement('div');
45    actions.className='actions nf-store-actions';
46    actions.style.marginTop='16px';
47
48    const windowsLink=document.createElement('a');
49    windowsLink.className='btn primary';
50    windowsLink.href='https://apps.microsoft.com/detail/9pd36d0pkc9n?ocid=webpdpshare';
51    windowsLink.target='_blank';
52    windowsLink.rel='noopener noreferrer';
53    windowsLink.textContent='Get on Microsoft Store';
54
55    const androidLink=document.createElement('a');
56    androidLink.className='btn';
57    androidLink.href='https://neverforgetms.netlify.app/';
58    androidLink.target='_blank';
59    androidLink.rel='noopener noreferrer';
60    androidLink.textContent='Install on Android';
61
62    actions.append(windowsLink,androidLink);
63    neverForgetTile.appendChild(actions);
64  }
65}
66
67// Public Devpost / competitions section.
68const moreProjects=document.getElementById('more-projects');
69if(moreProjects&&!document.getElementById('devpost-submissions')){
70  const videoFrame=(id,title)=>`<div style="position:relative;width:100%;aspect-ratio:16/9;margin:16px 0 18px;border-radius:14px;overflow:hidden;background:#02060d"><iframe loading="lazy" src="https://www.youtube-nocookie.com/embed/${id}" title="${title}" style="position:absolute;inset:0;width:100%;height:100%;border:0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>`;
71  const localVideo=(src,title)=>`<div style="position:relative;width:100%;aspect-ratio:16/9;margin:16px 0 18px;border-radius:14px;overflow:hidden;background:#02060d"><video controls playsinline preload="metadata" title="${title}" style="position:absolute;inset:0;width:100%;height:100%;object-fit:contain;background:#02060d"><source src="${src}" type="video/mp4">Your browser does not support embedded video.</video></div>`;
72  const minecraftVideoFrame=(id,title)=>`<div style="position:relative;width:100%;aspect-ratio:16/9;margin:16px 0 18px;border-radius:14px;overflow:hidden;background:#02060d"><iframe id="minecraftDemoPlayer" loading="lazy" src="https://www.youtube-nocookie.com/embed/${id}?enablejsapi=1&playsinline=1&rel=0&origin=${encodeURIComponent(location.origin)}" title="${title}" style="position:absolute;inset:0;width:100%;height:100%;border:0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture;
72 web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe><div id="minecraftDemoTextFix" aria-hidden="true" style="display:none;position:absolute;left:62.5%;top:74.2%;width:29.5%;height:8.5%;z-index:4;pointer-events:none;background:#000;color:#fff;align-items:center;justify-content:center;flex-direction:column;text-align:center;font-family:Arial,sans-serif;line-height:1.15"><div style="font-size:clamp(7px,1.05vw,16px);font-weight:400;white-space:nowrap">LIGHT SENT TO MINECRAFT</div><div style="font-size:clamp(7px,1vw,15px);font-weight:400;white-space:nowrap">Cross-world capability transfer complete.</div></div></div>`;
73
74  const section=document.createElement('section');
75  section.className='section kv-more-projects';
76  section.id='devpost-submissions';
77  section.innerHTML=`
78    <div class="heading">
79      <div>
80        <p class="eyebrow">DEVPOST · COMPETITIONS</p>
81        <h2>Kanverse challenge submissions</h2>
82      </div>
83      <p>Working Kanverse experiments presented publicly through Devpost challenges.</p>
84    </div>
85    <div class="kv-project-tiles">
86      <article>
87        <span>CALL-E SUBMISSION</span>
88        <h3>Kanverse Human API</h3>
89        <p>A human-controlled capability layer that explores how AI can request access to real-world human abilities without turning permission into permanent ownership.</p>
90        ${videoFrame('SNHIu6Fl5YA','Kanverse Human API demo')}
91        <div class="actions"><a class="btn primary" href="https://devpost.com/software/kanverse-human-api" target="_blank" rel="noopener noreferrer">View on Devpost →</a></div>
92      </article>
93      <article>
94        <span>WEBMCP CHALLENGE</span>
95        <h3>Blink Borrow</h3>
96        <p>Temporary, human-approved powers for AI agents: discover, request, approve, borrow and revoke capabilities across connected browsers.</p>
97        ${videoFrame('uWJmF9fTS7s','Blink Borrow WebMCP demo')}
98        <div class="actions"><a class="btn primary" href="https://devpost.com/software/blink-agent-relay" target="_blank" rel="noopener noreferrer">View Blink Borrow on Devpost →</a></div>
99      </article>
100    </div>`;
101  moreProjects.insertAdjacentElement('afterend',section);
102
103  const achievement=document.createElement('section');
104  achievement.className='section kv-more-projects';
105  achievement.id='achievements';
106  achievement.innerHTML=`
107    <div class="heading">
108      <div>
109        <p class="eyebrow">KANVERSE ACHIEVEMENTS</p>
110        <h2>Cross-world capability experiment</h2>
111      </div>
112      <p>Milestones that show Kanverse concepts working beyond a conventional webpage.</p>
113    </div>
114    <div class="kv-project-tiles">
115      <article>
116        <span>ROBLOX · WEBMCP EXPERIMENT</span>
117        <h3>AI capability reaches a Roblox world</h3>
118        <p>Kanverse demonstrated a cross-world experiment in which an external WebMCP-facing capability could be exposed to an AI workflow and connected to a Roblox experience, including a temporary lighting capability under explicit control.</p>
119        ${videoFrame('G9xX-s4zbRg','Blink Borrow WebMCP Roblox cross-world demo')}
120        <b>Browser → AI tool → Roblox world</b>
121      </article>
122      <article>
123        <span>CHATGPT · WEBMCP · MINECRAFT</span>
124        <h3>ChatGPT controls Minecraft through WebMCP</h3>
125        <p>A live Kanverse interoperability prototype where ChatGPT discovers and invokes a WebMCP site tool that triggers a real action inside a running Minecraft world through the Kanverse bridge.</p>
126        ${minecraftVideoFrame('7knV3dhsJW4','ChatGPT WebMCP Minecraft live demo')}
127        <b>ChatGPT → WebMCP → Kanverse Bridge → Minecraft</b>
128      </article>
129      <article>
130        <span>BLINK BRIDGE · NVIDIA GPU CAPABILITY</span>
131        <h3>A phone borrows an RTX GPU capability</h3>
132        <p>A real Kanverse Blink Bridge demonstration: an Android phone requests a bounded <code>gpu.compute</code> capability, the workload executes on the connected PC's NVIDIA GeForce RTX 3050 Laptop GPU, and the result returns to the phone.</p>
133        ${localVideo('/assets/borrow-rtx-demo.mp4','Kanverse Blink Bridge NVIDIA GPU Borrow demo')}
134        <b>Phone → Blink Bridge → PC GPU → result returned</b>
135        <div class="kv-producthunt-launch" style="display:grid;grid-template-columns:auto minmax(0,1fr);gap:14px;align-items:center;margin-top:18px;padding:16px;border:1px solid rgba(255,97,84,.35);border-radius:18px;background:linear-gradient(145deg,rgba(255,97,84,.09),rgba(255,255,255,.025))">
136          <img alt="Kanverse GPU Borrow" src="https://ph-files.imgix.net/06550802-6295-4e42-ae1f-788c40354745.jpeg?auto=compress,format&codec=mozjpeg&cs=strip&fit=crop&h=80&w=80" loading="lazy" width="64" height="64" style="width:64px;
136height:64px;border-radius:12px;object-fit:cover">
137          <div style="min-width:0">
138            <span style="display:block;margin-bottom:4px;font-size:.76rem;letter-spacing:.09em;color:#ff7569">NOW ON PRODUCT HUNT</span>
139            <strong style="display:block;font-size:1.05rem;color:#fff">Kanverse GPU Borrow</strong>
140            <small style="display:block;margin-top:4px;color:var(--muted,#9daec1);line-height:1.45">Borrow GPU compute from another device, with permission.</small>
141          </div>
142          <a href="https://www.producthunt.com/products/kanverse-gpu-borrow?embed=true&utm_source=kanverse&utm_medium=website" target="_blank" rel="noopener noreferrer" style="grid-column:1/-1;display:inline-flex;width:max-content;max-width:100%;align-items:center;justify-content:center;padding:9px 16px;border-radius:999px;background:#ff6154;color:#fff;text-decoration:none;font-weight:700">Check it out on Product Hunt →</a>
143        </div>
144      </article>
145      <article id="blink-ollama-borrow" style="scroll-margin-top:90px">
146        <span>ANDROID · BLINK BRIDGE · OLLAMA · NVIDIA</span>
147        <h3>Android borrows local AI from an RTX GPU</h3>
148        <p>An Android phone sends a prompt through Cloudflare Tunnel and Blink Bridge to Ollama running on a Windows PC. The NVIDIA GeForce RTX 3050 performs the local inference, and the generated answer returns to Android.</p>
149        ${localVideo('/assets/blink-ollama-borrow-demo.mp4','Kanverse Blink Ollama Borrow Android to NVIDIA GPU demo')}
150        <b>Android → Cloudflare Tunnel → Blink Bridge → Ollama → NVIDIA GPU → Android</b>
151      </article>
152    </div>`;
153  section.insertAdjacentElement('afterend',achievement);
154
155  // The published YouTube demo contains a literal "\\n" in its final status line.
156  // Keep the original proof video and correct only that on-screen text from the
157  // moment it appears, preserving the demo timing and every other frame.
158  const initMinecraftVideoTextFix=()=>{
159    const iframe=document.getElementById('minecraftDemoPlayer');
160    const overlay=document.getElementById('minecraftDemoTextFix');
161    if(!iframe||!overlay)return;
162
163    let attached=false;
164    const attach=()=>{
165      if(attached||!window.YT?.Player)return false;
166      attached=true;
167      const player=new YT.Player(iframe,{
168        events:{
169          onReady:()=>{
170            const sync=()=>{
171              let time=0;
172              try{time=Number(player.getCurrentTime())||0}catch{}
173              overlay.style.display=time>=13.25?'flex':'none';
174            };
175            sync();
176            setInterval(sync,150);
177          }
178        }
179      });
180      return true;
181    };
182
183    if(attach())return;
184    if(!document.querySelector('script[data-kanverse-youtube-api]')){
185      const api=document.createElement('script');
186      api.src='https://www.youtube.com/iframe_api';
187      api.async=true;
188      api.dataset.kanverseYoutubeApi='1';
189      document.head.appendChild(api);
190    }
191    const wait=setInterval(()=>{if(attach())clearInterval(wait)},100);
192    setTimeout(()=>clearInterval(wait),10000);
193  };
194  initMinecraftVideoTextFix();
195
196  if(location.hash==='#blink-ollama-borrow'){
197    requestAnimationFrame(()=>document.getElementById('blink-ollama-borrow')?.scrollIntoView({block:'start'}));
198  }
199
200  if(n&&!n.querySelector('a[href="#devpost-submissions"]')){
201    const devpostNav=document.createElement('a');
202    devpostNav.href='#devpost-submissions';
203    devpostNav.textContent='Devpost';
204    const contact=n.querySelector('a[href="#contact"]');
205    n.insertBefore(devpostNav,contact||null);
206    devpostNav.onclick=()=>{n.classList.remove('open');b.textContent='☰'};
207  }
208}
209
210function loadKevinNaturalIntent(){
211  if(window.KevinNaturalIntent||document.querySelector('script[data-kevin-natural-intent]'))return;
212  const natural=document.createElement('script');
213  natural.src='/kevin-natural-intent.js?v=20260823-natural2';
214  natural.dataset.kevinNaturalIntent='1';
215  document.body.appendChild(natural);
216}
217
218function loadKevinAgentV2(){
219  if(!document.getElementById('kevinCompanion'))return;
220  if(window.KevinAgentV2){loadKevinNaturalIntent();return;}
221  const existing=document.querySelector('script[data-kevin-agent-v2]');
222  if(existing){
223    const wait=()=>window.KevinAgentV2?loadKevinNaturalIntent():setTimeout(wait,50);
224    wait();
225    return;
226  }
227  const agent=document.createElement('script');
228  agent.src='/kevin-agent-v2.js?v=20260823-homefix4';
229  agent.dataset.kevinAgentV2='1';
230  agent.onload=loadKevinNaturalIntent;
231  document.body.appendChild(agent);
232}
233
234function waitForKevinAgentV2(timeout=3500){
235  loadKevinAgentV2();
236  return new Promise(resolve=>{
237    const started=Date.now();
238    const check=()=>{
239      if(window.KevinAgentV2){resolve(window.KevinAgentV2);return;}
240      if(Date.now()-started>=timeout){resolve(null);return;}
241      setTimeout(check,40);
242    };
243    check();
244  });
245}
246
247// Priority disambiguation: the legacy Kevin layer has a local homepage section
248// named "Blink". A request for the full product name "Blink Bridge" must never
249// be shortened to that section. Capture the explicit product request before the
250// legacy form handler and hand execution to Agent v2's permissioned action loop.
251document.addEventListener('submit',async event=>{
252  const form=event.target;
253  if(form?.id!=='kcForm')return;
254  const field=document.getElementById('kcInput');
255  const raw=field?.value||'';
256  const q=raw.toLowerCase().replace(/[’']/g,'').replace(/[^a-z0-9\s]/g,' ').replace(/\s+/g,' ').trim();
257  const mentionsBridge=/\bblink bridge\b/.test(q);
258  const requestsOpen=/\b(open|launch|visit|bring up|pull up|take me to|bring me to|get me to|go to|head to|let me see|show me|have a look at|check out)\b/.test(q)
259    || /\b(can|could|would|will) you .*\b(open|launch|bring|pull|take|show|get)\b/.test(q)
260    || /\bi (want|would like|d like) to (open|visit|see|check|look at)\b/.test(q);
261  if(!mentionsBridge||!requestsOpen)return;
262
263  event.preventDefault();
264  event.stopImmediatePropagation();
265  if(field){field.value='';field.focus();}
266
267  const agent=await waitForKevinAgentV2();
268  if(agent){
269    agent.decide('open blink bridge');
270    return;
271  }
272  const output=document.getElementById('kcAnswer');
273  if(output)output.textContent='Kevin Agent v2 is still loading, so I stopped instead of routing you to the wrong Blink section. Please try again in a moment.';
274},true);
275
276// Run immediately when this script is loaded late in the page, or wait only
277// when the DOM is genuinely still being constructed. This avoids missing the
278// DOMContentLoaded event on the homepage.
279if(document.readyState==='loading'){
280  document.addEventListener('DOMContentLoaded',loadKevinAgentV2,{once:true});
281}else{
282  loadKevinAgentV2();
283}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.