retire-provenance: superseded Q b/ objects (sha256 CAS, HOLO-LEAN-RESOLVER P1.3)
Browse files- sha256/2a18cc07373595a4c89911410c2419e8519bc40f2d76670d43db286cdf166802 +552 -0
- sha256/6668e0b3a49e1e2d1a30ef1d3ac90169730fd291438c9180911d514720c2acec +1 -0
- sha256/75000614d279104e10936e4ccba11e3918ac045c5db9386bb9b319ffc177a1b3 +1 -0
- sha256/7aeadc80050e3d81ba684a7406de33448ee015493a22406db9ded49135428ad0 +1 -0
- sha256/e9ae0098c5ca92a0e6bedf15a794487ed36f54cd33f914d2eee8a0e97ad4c30c +0 -0
sha256/2a18cc07373595a4c89911410c2419e8519bc40f2d76670d43db286cdf166802
ADDED
|
@@ -0,0 +1,552 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<meta charset="utf-8">
|
| 3 |
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
| 4 |
+
<title>Bonsai</title>
|
| 5 |
+
<style>
|
| 6 |
+
/* Claude-desktop look: warm charcoal stage, 11% hairlines, 12-14px radii, serif display, coral accent.
|
| 7 |
+
Type floor is 15px everywhere. Everything fits ONE viewport at 1280×800 AND 375×812 (dvh + clamp). */
|
| 8 |
+
:root { --bg:#262624; --ink:#eceae4; --muted:#b8b5ad; --faint:rgba(232,230,224,.45);
|
| 9 |
+
--hair:rgba(255,255,255,.11); --coral:#d97757; --coral-hi:#e8987a; --lav:#c4b5fd; --r:13px;
|
| 10 |
+
--serif:"Tiempos Text","Charter","Iowan Old Style",Georgia,serif; }
|
| 11 |
+
* { box-sizing:border-box; margin:0; padding:0; }
|
| 12 |
+
html,body { height:100%; }
|
| 13 |
+
body { background:var(--bg); color:var(--ink); font:15px/1.55 system-ui,-apple-system,"Segoe UI",Inter,sans-serif;
|
| 14 |
+
-webkit-font-smoothing:antialiased; overflow:hidden; }
|
| 15 |
+
.num { font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; font-size:15px; }
|
| 16 |
+
.stage { position:fixed; inset:0; height:100dvh; display:flex; flex-direction:column; align-items:center;
|
| 17 |
+
justify-content:center; padding:24px; opacity:0; pointer-events:none; transition:opacity .6s ease; }
|
| 18 |
+
.stage.on { opacity:1; pointer-events:auto; }
|
| 19 |
+
|
| 20 |
+
/* ── arrival: full-bleed hologram canvas behind left-aligned copy ── */
|
| 21 |
+
#arrive { flex-direction:row; align-items:center; justify-content:flex-start; padding:0; }
|
| 22 |
+
#holo { position:absolute; inset:0; width:100%; height:100%; display:block; }
|
| 23 |
+
#arrive .copy { position:relative; z-index:1; max-width:620px; padding:0 clamp(24px,6vw,96px); }
|
| 24 |
+
#arrive h1 { font-family:var(--serif); font-weight:500; font-size:clamp(40px,7vw,84px); line-height:1.06;
|
| 25 |
+
letter-spacing:-.015em; text-wrap:balance; }
|
| 26 |
+
#arrive .sub { margin-top:22px; font-size:clamp(18px,1.6vw,20px); line-height:1.5; color:var(--muted); max-width:46ch; }
|
| 27 |
+
#arrive button { margin-top:34px; background:var(--coral); border:none; color:#faf9f5; border-radius:999px;
|
| 28 |
+
padding:16px 34px; font:500 17px/1 system-ui,sans-serif; cursor:pointer;
|
| 29 |
+
transition:transform .2s ease, filter .2s ease; }
|
| 30 |
+
#arrive button:hover { filter:brightness(1.08); transform:translateY(-1px); }
|
| 31 |
+
#arrive button:disabled { filter:saturate(.3) brightness(.8); cursor:default; transform:none; }
|
| 32 |
+
#arrive .fine { margin-top:16px; font-size:15px; color:var(--faint); }
|
| 33 |
+
@media (max-width:760px) { /* stacked: hologram floats in the upper half, copy anchors low */
|
| 34 |
+
#arrive { align-items:flex-end; }
|
| 35 |
+
#arrive .copy { padding-bottom:max(44px, env(safe-area-inset-bottom, 0px) + 36px); }
|
| 36 |
+
}
|
| 37 |
+
|
| 38 |
+
/* ── chat: the Claude-desktop room — serif greeting, ONE centered input card, quiet metrics ── */
|
| 39 |
+
#chat { justify-content:center; padding:0; }
|
| 40 |
+
#chat .col { display:flex; flex-direction:column; width:min(100%,760px); height:100%; padding:0 22px; justify-content:center; }
|
| 41 |
+
#chat .col.started { justify-content:flex-start; }
|
| 42 |
+
#hello { text-align:center; margin-bottom:26px; }
|
| 43 |
+
#hello .mark { display:inline-block; width:30px; height:30px; vertical-align:-4px; margin-right:12px; color:var(--coral); }
|
| 44 |
+
#hello h2 { display:inline; font-family:var(--serif); font-weight:500; font-size:clamp(30px,4.4vw,44px); letter-spacing:-.01em; }
|
| 45 |
+
.col.started #hello { display:none; }
|
| 46 |
+
#log { display:none; }
|
| 47 |
+
.col.started #log { display:block; flex:1; overflow-y:auto; padding:30px 4px 16px;
|
| 48 |
+
scrollbar-width:none; -ms-overflow-style:none; } /* the content scrolls; no chrome */
|
| 49 |
+
#log::-webkit-scrollbar { width:0; height:0; }
|
| 50 |
+
.msg { margin:0 0 22px; }
|
| 51 |
+
.msg .who { font-size:15px; color:var(--faint); margin-bottom:4px; }
|
| 52 |
+
.msg.user { display:flex; justify-content:flex-end; } /* Grok/Claude: user turn is a right bubble */
|
| 53 |
+
.msg.user .who { display:none; }
|
| 54 |
+
.msg.user .body { background:rgba(255,255,255,.05); border:1px solid var(--hair); border-radius:16px 16px 4px 16px;
|
| 55 |
+
padding:11px 16px; max-width:78%; }
|
| 56 |
+
.msg .body { white-space:pre-wrap; font-size:16px; line-height:1.65; }
|
| 57 |
+
/* "Thought for Ns" — a quiet collapsible reasoning header (Grok's signature, in Claude's palette) */
|
| 58 |
+
details.think { margin:0 0 10px; }
|
| 59 |
+
details.think summary { list-style:none; cursor:pointer; font-size:15px; color:var(--faint);
|
| 60 |
+
display:inline-flex; align-items:center; gap:7px; user-select:none; }
|
| 61 |
+
details.think summary::-webkit-details-marker { display:none; }
|
| 62 |
+
details.think summary .chev { transition:transform .2s ease; font-size:11px; }
|
| 63 |
+
details.think[open] summary .chev { transform:rotate(90deg); }
|
| 64 |
+
details.think .t { color:var(--faint); font-size:15px; line-height:1.6; white-space:pre-wrap; margin-top:8px;
|
| 65 |
+
border-left:2px solid var(--hair); padding-left:12px; }
|
| 66 |
+
/* assistant action row: copy · regenerate (appears when the answer settles) */
|
| 67 |
+
.acts { display:flex; gap:4px; margin-top:8px; opacity:0; transition:opacity .25s ease; }
|
| 68 |
+
.msg:hover .acts, .acts.shown { opacity:1; }
|
| 69 |
+
.acts button { background:none; border:none; color:var(--faint); cursor:pointer; border-radius:8px;
|
| 70 |
+
width:30px; height:30px; display:grid; place-items:center; transition:background .15s, color .15s; }
|
| 71 |
+
.acts button:hover { background:rgba(255,255,255,.06); color:var(--ink); }
|
| 72 |
+
.acts button svg { width:16px; height:16px; stroke:currentColor; fill:none; stroke-width:1.7; }
|
| 73 |
+
.acts .ok { color:var(--coral-hi); }
|
| 74 |
+
/* follow-up suggestions: Grok's placement — borderless rows stacked in the conversation flow */
|
| 75 |
+
.fu { display:flex; flex-direction:column; margin:14px 0 4px; }
|
| 76 |
+
.fu button { display:flex; align-items:center; gap:12px; background:none; border:none; border-top:1px solid transparent;
|
| 77 |
+
color:var(--muted); font-size:16px; text-align:left; padding:11px 6px; cursor:pointer;
|
| 78 |
+
border-radius:10px; transition:background .15s, color .15s; }
|
| 79 |
+
.fu button:hover { background:rgba(255,255,255,.045); color:var(--ink); }
|
| 80 |
+
.fu .arr { color:var(--faint); font-size:15px; flex:none; }
|
| 81 |
+
.note { text-align:center; font-size:15px; color:var(--faint); margin:6px 0 12px; }
|
| 82 |
+
#card { background:rgba(255,255,255,.03); border:1px solid var(--hair); border-radius:18px; padding:6px 8px 8px; }
|
| 83 |
+
#card:focus-within { border-color:rgba(217,119,87,.5); }
|
| 84 |
+
#inp { width:100%; background:none; border:none; color:var(--ink); padding:14px 12px 10px;
|
| 85 |
+
font:16px/1.45 system-ui,sans-serif; outline:none; }
|
| 86 |
+
#cardrow { display:flex; align-items:center; gap:12px; padding:0 8px 4px 12px; }
|
| 87 |
+
#modelname { font-size:15px; color:var(--muted); }
|
| 88 |
+
#cardrow .grow { flex:1; }
|
| 89 |
+
#send { background:var(--coral); border:none; color:#faf9f5; border-radius:999px; width:38px; height:38px;
|
| 90 |
+
font:500 17px/1 system-ui,sans-serif; cursor:pointer; transition:filter .2s ease; }
|
| 91 |
+
#send:hover { filter:brightness(1.08); }
|
| 92 |
+
#send:disabled { background:rgba(255,255,255,.06); color:var(--faint); cursor:default; }
|
| 93 |
+
#metrics { text-align:center; font-size:15px; color:var(--faint); padding:12px 0 16px; min-height:22px; }
|
| 94 |
+
#metrics b { color:var(--muted); font-weight:500; }
|
| 95 |
+
#err { color:#f87171; font-size:15px; padding:0 0 18px; text-align:center; white-space:pre-wrap; }
|
| 96 |
+
.spn { display:inline-block; width:1.1ch; font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
|
| 97 |
+
color:var(--coral-hi); margin-right:7px; }
|
| 98 |
+
/* CSS hologram (fallback when WebGL is unavailable/blocked): layered orb + scanlines + drift */
|
| 99 |
+
#holofb { position:absolute; width:min(46vw,520px); aspect-ratio:1; right:4vw; top:50%;
|
| 100 |
+
transform:translateY(-50%); border-radius:50%; pointer-events:none;
|
| 101 |
+
background:radial-gradient(circle at 38% 34%, rgba(232,152,122,.55), rgba(217,119,87,.28) 42%, rgba(196,181,253,.16) 72%, transparent 76%);
|
| 102 |
+
box-shadow:0 0 90px rgba(217,119,87,.25), inset 0 0 60px rgba(196,181,253,.18);
|
| 103 |
+
animation:holofloat 7s ease-in-out infinite; }
|
| 104 |
+
#holofb::before { content:""; position:absolute; inset:0; border-radius:50%;
|
| 105 |
+
background:repeating-linear-gradient(to bottom, rgba(255,255,255,.09) 0 2px, transparent 2px 7px);
|
| 106 |
+
mix-blend-mode:screen; animation:holoscan 2.6s linear infinite;
|
| 107 |
+
-webkit-mask:radial-gradient(circle, #000 70%, transparent 74%); mask:radial-gradient(circle, #000 70%, transparent 74%); }
|
| 108 |
+
#holofb::after { content:""; position:absolute; inset:-2%; border-radius:50%;
|
| 109 |
+
border:1px solid rgba(196,181,253,.30); filter:blur(.4px); }
|
| 110 |
+
@keyframes holofloat { 50% { transform:translateY(calc(-50% - 14px)); } }
|
| 111 |
+
@keyframes holoscan { to { background-position:0 7px; } }
|
| 112 |
+
@media (max-width:760px){ #holofb { right:50%; top:26%; transform:translate(50%,-50%); width:min(62vw,300px); }
|
| 113 |
+
@keyframes holofloat { 50% { transform:translate(50%,calc(-50% - 10px)); } } }
|
| 114 |
+
@media (prefers-reduced-motion: reduce){ #holofb, #holofb::before { animation:none; } }
|
| 115 |
+
</style>
|
| 116 |
+
<body>
|
| 117 |
+
|
| 118 |
+
<div class="stage on" id="arrive">
|
| 119 |
+
<canvas id="holo"></canvas>
|
| 120 |
+
<div id="holofb" hidden></div>
|
| 121 |
+
<div class="copy">
|
| 122 |
+
<h1>An AI<br>that’s yours.</h1>
|
| 123 |
+
<p class="sub">Bonsai streams into your browser like a film. Every piece is checked before it runs. After one visit it answers on your device, even offline.</p>
|
| 124 |
+
<button id="go">Stream the mind</button>
|
| 125 |
+
<div class="fine" id="fine">Free · open weights by Prism ML · nothing leaves your device</div>
|
| 126 |
+
</div>
|
| 127 |
+
</div>
|
| 128 |
+
|
| 129 |
+
<div class="stage" id="chat">
|
| 130 |
+
<div class="col" id="col">
|
| 131 |
+
<div id="hello">
|
| 132 |
+
<svg class="mark" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" aria-hidden="true"><path d="M12 3v18M3 12h18M5.6 5.6l12.8 12.8M18.4 5.6L5.6 18.4"/></svg><h2>Ready when you are.</h2>
|
| 133 |
+
</div>
|
| 134 |
+
<div id="log"></div>
|
| 135 |
+
<div id="card">
|
| 136 |
+
<input id="inp" placeholder="Ask Bonsai anything" autocomplete="off">
|
| 137 |
+
<div id="cardrow">
|
| 138 |
+
<span id="modelname">Bonsai</span>
|
| 139 |
+
<span class="grow"></span>
|
| 140 |
+
<button id="send" aria-label="Send">↑</button>
|
| 141 |
+
</div>
|
| 142 |
+
</div>
|
| 143 |
+
<div id="metrics">on your device</div>
|
| 144 |
+
<div id="err" hidden></div>
|
| 145 |
+
</div>
|
| 146 |
+
</div>
|
| 147 |
+
|
| 148 |
+
<script type="module">
|
| 149 |
+
// ── the OS boot animation, verbatim look ─────────────────────────────────────────────────────
|
| 150 |
+
// This is the SAME animation the OS greeter shows on its login screen (holo-plymouth.mjs): the
|
| 151 |
+
// abstract_ring Plymouth theme — a dense torus of dark spheres cycling progress-0..40.png at
|
| 152 |
+
// 25 fps — streamed progressively from the same public pack the OS streams from
|
| 153 |
+
// (adi1090x/plymouth-themes, GPL-3.0 artwork), cached in the Cache API so every return visit
|
| 154 |
+
// paints instantly and offline. Each frame's baked-black background is CHROMA-KEYED to
|
| 155 |
+
// transparent on decode (the greeter's keyBlack, verbatim), so the emblem floats over the stage
|
| 156 |
+
// with no black box — identical to the login screen.
|
| 157 |
+
const cv = document.getElementById("holo");
|
| 158 |
+
const reduced = matchMedia("(prefers-reduced-motion: reduce)").matches;
|
| 159 |
+
window.__holoOff = null;
|
| 160 |
+
try {
|
| 161 |
+
const N = 41, FPS = 25;
|
| 162 |
+
const url = (i) => "https://raw.githubusercontent.com/adi1090x/plymouth-themes/master/pack_1/abstract_ring/progress-" + i + ".png";
|
| 163 |
+
const ctx = cv.getContext("2d");
|
| 164 |
+
const frames = new Array(N).fill(null);
|
| 165 |
+
let have = 0, dead = false, raf = 0;
|
| 166 |
+
// Plymouth sprites bake their black screen into the PNG; over the stage that black must be AIR.
|
| 167 |
+
// keyBlack (holo-plymouth.mjs, verbatim ramp) fades near-black pixels to transparent → the ring
|
| 168 |
+
// floats on the charcoal exactly like the greeter's emblem floats on the login wall.
|
| 169 |
+
const keyBlack = (bmp) => {
|
| 170 |
+
try {
|
| 171 |
+
const w = bmp.width, h = bmp.height; if (!w || !h) return bmp;
|
| 172 |
+
const c = document.createElement("canvas"); c.width = w; c.height = h;
|
| 173 |
+
const x = c.getContext("2d", { willReadFrequently: true });
|
| 174 |
+
x.drawImage(bmp, 0, 0);
|
| 175 |
+
const d = x.getImageData(0, 0, w, h), p = d.data;
|
| 176 |
+
for (let i = 0; i < p.length; i += 4) {
|
| 177 |
+
const v = Math.max(p[i], p[i + 1], p[i + 2]);
|
| 178 |
+
if (v < 48) p[i + 3] = Math.min(p[i + 3], Math.max(0, ((v - 12) / 36) * 255) | 0);
|
| 179 |
+
}
|
| 180 |
+
x.putImageData(d, 0, 0);
|
| 181 |
+
return c;
|
| 182 |
+
} catch { return bmp; }
|
| 183 |
+
};
|
| 184 |
+
const cachePromise = caches.open("holo-plymouth-v1").catch(() => null);
|
| 185 |
+
const loadFrame = async (i) => {
|
| 186 |
+
try {
|
| 187 |
+
const cache = await cachePromise;
|
| 188 |
+
let resp = cache && await cache.match(url(i));
|
| 189 |
+
if (!resp) { resp = await fetch(url(i)); if (cache && resp.ok) { try { await cache.put(url(i), resp.clone()); } catch {} } }
|
| 190 |
+
if (!resp || !resp.ok) return;
|
| 191 |
+
frames[i] = keyBlack(await createImageBitmap(await resp.blob()));
|
| 192 |
+
have++;
|
| 193 |
+
} catch {}
|
| 194 |
+
};
|
| 195 |
+
// frame 0 first (first paint), then the rest with small concurrency — plays as it arrives
|
| 196 |
+
await loadFrame(0);
|
| 197 |
+
(async () => { let i = 1; const w = async () => { while (i < N && !dead) { const k = i++; await loadFrame(k); } };
|
| 198 |
+
await Promise.all([w(), w(), w(), w()]); })();
|
| 199 |
+
const size = () => { cv.width = innerWidth * Math.min(devicePixelRatio || 1, 2); cv.height = innerHeight * Math.min(devicePixelRatio || 1, 2); };
|
| 200 |
+
size(); addEventListener("resize", size);
|
| 201 |
+
let f = 0, last = 0;
|
| 202 |
+
const draw = (t) => {
|
| 203 |
+
if (dead) return;
|
| 204 |
+
raf = requestAnimationFrame(draw);
|
| 205 |
+
if (t - last < 1000 / FPS) return; last = t;
|
| 206 |
+
if (!reduced) { f = (f + 1) % N; }
|
| 207 |
+
let img = frames[f]; if (!img) { for (let k = 0; k < N; k++) if (frames[k]) { img = frames[k]; break; } }
|
| 208 |
+
if (!img) return;
|
| 209 |
+
ctx.clearRect(0, 0, cv.width, cv.height);
|
| 210 |
+
const desktop = cv.width / cv.height > 0.92;
|
| 211 |
+
const s = Math.min(cv.width, cv.height) * (desktop ? 0.72 : 0.6) / Math.max(img.width, img.height);
|
| 212 |
+
const w = img.width * s, h = img.height * s;
|
| 213 |
+
const x = desktop ? cv.width * 0.72 - w / 2 : cv.width / 2 - w / 2;
|
| 214 |
+
const y = desktop ? cv.height / 2 - h / 2 : cv.height * 0.28 - h / 2;
|
| 215 |
+
ctx.drawImage(img, x, y, w, h);
|
| 216 |
+
};
|
| 217 |
+
raf = requestAnimationFrame(draw);
|
| 218 |
+
document.addEventListener("visibilitychange", () => { if (dead) return; if (document.hidden) cancelAnimationFrame(raf); else raf = requestAnimationFrame(draw); });
|
| 219 |
+
window.__holoFrame = () => cv.toDataURL("image/png");
|
| 220 |
+
window.__holoOff = () => { dead = true; cancelAnimationFrame(raf); window.__holoFrame = null; cv.remove(); };
|
| 221 |
+
setTimeout(() => { if (!dead && have === 0) { const fb = document.getElementById("holofb"); if (fb) fb.hidden = false; } }, 4000); // no frames at all → CSS stand-in
|
| 222 |
+
} catch (e) {
|
| 223 |
+
const fb = document.getElementById("holofb"); if (fb) fb.hidden = false;
|
| 224 |
+
}
|
| 225 |
+
</script>
|
| 226 |
+
|
| 227 |
+
<script type="module">
|
| 228 |
+
import init, { qvac_load_gpu, qvac_gpu_free } from "../q/pkg/holospaces_web.js";
|
| 229 |
+
import { loadKappaObject } from "../q/holo-load2bit.mjs";
|
| 230 |
+
import { createQvacGPU } from "../q/qvac-gpu.js?v=68";
|
| 231 |
+
import { createEngine } from "../q/core/engine.js";
|
| 232 |
+
|
| 233 |
+
const $ = (id) => document.getElementById(id);
|
| 234 |
+
// braille pulse: one 80ms ticker animates every [data-spin] slot (loading, waking, thinking) —
|
| 235 |
+
// a single interval, zero layout work, stops mattering the instant the last spinner is removed.
|
| 236 |
+
const SPIN = ["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];
|
| 237 |
+
let _sf = 0;
|
| 238 |
+
setInterval(() => { const els = document.querySelectorAll("[data-spin]"); if (!els.length) return; const f = SPIN[_sf = (_sf + 1) % SPIN.length]; for (const el of els) el.textContent = f; }, 80);
|
| 239 |
+
const spn = () => `<span class="spn" data-spin>${SPIN[0]}</span>`;
|
| 240 |
+
const show = (id) => { for (const s of document.querySelectorAll(".stage")) s.classList.toggle("on", s.id === id); };
|
| 241 |
+
const short = (k) => String(k).replace(/^(did:holo:)?sha256:/, "").slice(0, 12) + "…";
|
| 242 |
+
|
| 243 |
+
// model source: ?src=<κ-object dir> for dev, HF mirror by default; ?m=27b flips to the 27B
|
| 244 |
+
// κ-object (engine support for its hybrid layers lands separately — the guard below is honest).
|
| 245 |
+
// Everything shown to the user (name, size) is READ FROM THE MANIFEST — swapping the κ URL is a
|
| 246 |
+
// zero-code model change. The manifest pin is the Law-L5 anchor.
|
| 247 |
+
const QS = new URLSearchParams(location.search);
|
| 248 |
+
const SRC = QS.get("src");
|
| 249 |
+
const DEFAULT_27B = false; // flips true the moment the hybrid engine passes parity (κ-object already published)
|
| 250 |
+
const M27 = QS.get("m") === "27b" || (DEFAULT_27B && QS.get("m") !== "8b");
|
| 251 |
+
const BASE = SRC || (M27 ? "https://huggingface.co/HOLOGRAMTECH/q-bonsai-27b/resolve/main" : "https://huggingface.co/HOLOGRAMTECH/q-bonsai-8b/resolve/main");
|
| 252 |
+
const PIN = M27 ? "did:holo:sha256:00beea03509a79f6567879f019c04bb15dda8721f6320f8295d9ea1dd9ba54af" : "did:holo:sha256:a0dc81f26ec5ce98b28ee9c1fab620e91c20720f777e1de6bc416317f54d27e2";
|
| 253 |
+
const CTX = 2048; // room for the reasoning trace + the answer on open-ended questions
|
| 254 |
+
|
| 255 |
+
let engine = null, gpu = null, rootK = "", warm = false, mind = [], thinkOpen = -1, thinkClose = -1;
|
| 256 |
+
let modelName = "Bonsai"; // set from the manifest once loaded
|
| 257 |
+
let story = [], memoryNote = ""; // the WHOLE conversation + the folded memory of its older part
|
| 258 |
+
const STORE = "bonsai.story.v1";
|
| 259 |
+
function persistStory() {
|
| 260 |
+
try { localStorage.setItem(STORE, JSON.stringify({ story: story.slice(-200), memoryNote })); } catch {}
|
| 261 |
+
}
|
| 262 |
+
// fold everything so far into a compact memory the model writes for itself (bounded, abortable-free:
|
| 263 |
+
// runs inside send() before the next turn, with the braille pulse narrating it)
|
| 264 |
+
async function foldMemory() {
|
| 265 |
+
const recent = story.slice(-8).map((t) => `Q: ${t.q}
|
| 266 |
+
A: ${t.a.slice(0, 300)}`).join("\n");
|
| 267 |
+
const prior = memoryNote ? "Earlier memory: " + memoryNote + "\n\n" : "";
|
| 268 |
+
const ask = prior + "Recent conversation:\n" + recent + "\n\nFold ALL of the above into one memory note under 130 words. Keep every name, number, decision and open question. Write only the note.";
|
| 269 |
+
const ids = engine.tokenize(engine.frameTurn(ask, false));
|
| 270 |
+
const res = await engine.generate(ids, { maxNew: 300 });
|
| 271 |
+
const seg = splitThink(res.outIds || []);
|
| 272 |
+
const text = (seg.ans.length ? engine.detokenize(seg.ans) : res.text || "").trim();
|
| 273 |
+
return text.slice(0, 1200);
|
| 274 |
+
}
|
| 275 |
+
|
| 276 |
+
let entered = false, streamStarted = false;
|
| 277 |
+
async function stream() {
|
| 278 |
+
try { if (window.__holoOff) { window.__holoOff(); window.__holoOff = null; } } catch {} // hand the GPU to the engine
|
| 279 |
+
if (entered) { show("chat"); $("inp").focus(); } // welcome stays until the visitor chooses to enter
|
| 280 |
+
const t0 = performance.now();
|
| 281 |
+
const phase = (s) => { $("metrics").innerHTML = s; };
|
| 282 |
+
try {
|
| 283 |
+
if (!navigator.gpu) throw new Error("This browser has no WebGPU. Chrome or Edge 113+ required.");
|
| 284 |
+
// warm-load detect (honest offline copy): the κ-cache already holds the manifest → this visit is disk-speed.
|
| 285 |
+
try { const c = await caches.open("holo-kappa-v1"); warm = !!(await c.match(BASE + "/manifest.json")); } catch {}
|
| 286 |
+
phase(spn() + (warm ? "waking up · from your disk" : "streaming the mind · every piece verified on arrival"));
|
| 287 |
+
await init();
|
| 288 |
+
// PARALLEL κ-BLOCKS FIRST (the measured Netflix path on CDN origins): 399 content-addressed
|
| 289 |
+
// blocks race over 12 connections (HF cdn-lfs caps a single stream ~2 MB/s; the parallel parts
|
| 290 |
+
// path measured 6.8 MB/s on the same line). The ONE-file .holo stays as the fallback for
|
| 291 |
+
// origins that only host the wafer (and its OPFS warm store makes revisits 0-network either way).
|
| 292 |
+
let r, pinned = true, holo = false;
|
| 293 |
+
try {
|
| 294 |
+
r = await loadKappaObject(BASE, { expectKappa: PIN, blake3: false });
|
| 295 |
+
} catch (e1) {
|
| 296 |
+
try {
|
| 297 |
+
const hs = await import("../q/core/holo-stream-load.mjs");
|
| 298 |
+
r = await hs.openHoloKappa(BASE + "/q-bonsai-8b.v1.holo", {});
|
| 299 |
+
holo = true; warm = !!r.warm;
|
| 300 |
+
} catch (e) { if (!SRC) throw e; pinned = false; r = await loadKappaObject(BASE, { allowUnpinned: true, blake3: false }); } // dev fallback only under ?src
|
| 301 |
+
}
|
| 302 |
+
rootK = (r.info && r.info.root) || PIN;
|
| 303 |
+
modelName = String((r.info && r.info.model) || "Bonsai").replace(/-/g, " ");
|
| 304 |
+
$("modelname").textContent = modelName;
|
| 305 |
+
// HONESTY GATE: the hybrid (27B) engine ships separately — never pretend to run what we can't.
|
| 306 |
+
if (r.manifest.hybrid) throw new Error(modelName + " uses a hybrid engine this build does not include yet. It is arriving; the 8B runs today.");
|
| 307 |
+
// progress = ONE quiet line under the input (per-tensor counters; no grid, no takeover)
|
| 308 |
+
const total = (r.manifest.tensors || []).length;
|
| 309 |
+
let done = 0, bytes = 0;
|
| 310 |
+
const tick = () => {
|
| 311 |
+
const dt = (performance.now() - t0) / 1000;
|
| 312 |
+
if (warm) phase(`${spn()}waking up · ${Math.round(done / Math.max(total, 1) * 100)}%`);
|
| 313 |
+
else phase(`${spn()}streaming the mind · <b>${(bytes / 1e6).toFixed(0)} MB</b> · ${(bytes / 1e6 / Math.max(dt, .1)).toFixed(1)} MB/s · every piece verified on arrival`);
|
| 314 |
+
};
|
| 315 |
+
const iv = setInterval(tick, 400);
|
| 316 |
+
const fetchT = async (name) => { // wrap fetchTensor: the progress driver
|
| 317 |
+
const b = await r.fetchTensor(name);
|
| 318 |
+
bytes += b.byteLength; done++;
|
| 319 |
+
return b;
|
| 320 |
+
};
|
| 321 |
+
// tokenizer header (arch + vocab) — embedded in the .holo (0 extra fetches), else same κ-object dir.
|
| 322 |
+
const hdr = r.tokenizerBytes || new Uint8Array(await (await fetch(BASE + "/tokenizer.gguf")).arrayBuffer());
|
| 323 |
+
const lr = JSON.parse(qvac_load_gpu(hdr));
|
| 324 |
+
if (lr.error) throw new Error("tokenizer: " + lr.error);
|
| 325 |
+
try { qvac_gpu_free(); } catch {}
|
| 326 |
+
r.manifest.kv4 = false; // exact f32 KV (the proven first-light config)
|
| 327 |
+
gpu = await createQvacGPU(r.manifest, fetchT, CTX, lr.eos ?? 2, false);
|
| 328 |
+
clearInterval(iv);
|
| 329 |
+
phase(spn() + "waking the mind");
|
| 330 |
+
const m = { fam: "Bonsai", name: modelName, size: "1.16 GB", fmt: "q1 1-bit κ", cap: 200, ctx: CTX, qwen: true, chat: true, rep: 1.05, gpu: true, gpuOnly: true };
|
| 331 |
+
engine = await createEngine(m, { gpu, info: lr, imageKappa: r.info.root });
|
| 332 |
+
// Qwen3 thinking markers are atomic tokens and clean() strips them from text — split by token id instead.
|
| 333 |
+
const o = engine.tokenize("<think>"), c2 = engine.tokenize("</think>");
|
| 334 |
+
thinkOpen = o.length === 1 ? o[0] : -1; thinkClose = c2.length === 1 ? c2[0] : -1;
|
| 335 |
+
enterChat();
|
| 336 |
+
} catch (e) {
|
| 337 |
+
$("metrics").textContent = ""; $("err").hidden = false;
|
| 338 |
+
$("err").textContent = String(e && e.message || e);
|
| 339 |
+
console.error(e);
|
| 340 |
+
}
|
| 341 |
+
}
|
| 342 |
+
|
| 343 |
+
// the ONLY chat metrics, one quiet line: model · time to first word · tok/s (operator spec)
|
| 344 |
+
let lastTTFT = null, lastTokps = null;
|
| 345 |
+
function metrics(state) {
|
| 346 |
+
const bits = [`<b>${modelName}</b>`];
|
| 347 |
+
if (lastTTFT != null) bits.push(`${lastTTFT.toFixed(1)}s to first word`);
|
| 348 |
+
if (lastTokps != null) bits.push(`<b>${lastTokps.toFixed(0)}</b> tokens a second`);
|
| 349 |
+
if (!lastTTFT && !lastTokps) bits.push(state || (warm ? "from your disk · works offline" : "on your device"));
|
| 350 |
+
$("metrics").innerHTML = bits.join(" · ");
|
| 351 |
+
}
|
| 352 |
+
let pendingQ = null, restored = false;
|
| 353 |
+
function restoreStory() {
|
| 354 |
+
if (restored) return; restored = true;
|
| 355 |
+
try {
|
| 356 |
+
const saved = JSON.parse(localStorage.getItem(STORE) || "null");
|
| 357 |
+
if (!saved || !saved.story || !saved.story.length) return;
|
| 358 |
+
story = saved.story; memoryNote = saved.memoryNote || "";
|
| 359 |
+
$("col").classList.add("started");
|
| 360 |
+
for (const t of story.slice(-12)) { // the room re-fills; the model remembers ALL of it via the fold
|
| 361 |
+
msg("You", "user").body.textContent = t.q;
|
| 362 |
+
msg(modelName, "bot").body.textContent = t.a;
|
| 363 |
+
}
|
| 364 |
+
if (!memoryNote && story.length) memoryNote = story.slice(-6).map((t) => `${t.q} → ${t.a.slice(0, 120)}`).join("; ").slice(0, 1200);
|
| 365 |
+
note("picked up where you left off");
|
| 366 |
+
log.scrollTop = log.scrollHeight;
|
| 367 |
+
} catch {}
|
| 368 |
+
}
|
| 369 |
+
function enterChat() {
|
| 370 |
+
ready = true; $("send").disabled = false; restoreStory(); metrics();
|
| 371 |
+
if (pendingQ) { $("inp").value = pendingQ; pendingQ = null; send(); }
|
| 372 |
+
else if (entered) $("inp").focus();
|
| 373 |
+
}
|
| 374 |
+
|
| 375 |
+
const log = $("log");
|
| 376 |
+
function msg(who, cls) {
|
| 377 |
+
const d = document.createElement("div"); d.className = "msg " + cls;
|
| 378 |
+
d.innerHTML = `<div class="who">${who}</div>`;
|
| 379 |
+
const think = document.createElement("details"); think.className = "think"; think.hidden = true;
|
| 380 |
+
think.innerHTML = `<summary><span class="chev">▸</span><span class="sum">thinking…</span></summary><div class="t"></div>`;
|
| 381 |
+
const body = document.createElement("div"); body.className = "body";
|
| 382 |
+
d.appendChild(think); d.appendChild(body);
|
| 383 |
+
let acts = null;
|
| 384 |
+
if (cls === "bot") { acts = document.createElement("div"); acts.className = "acts"; d.appendChild(acts); }
|
| 385 |
+
log.appendChild(d);
|
| 386 |
+
log.scrollTop = log.scrollHeight;
|
| 387 |
+
return { d, body, think, acts, t: think.querySelector(".t") };
|
| 388 |
+
}
|
| 389 |
+
const ICON = {
|
| 390 |
+
copy: '<svg viewBox="0 0 24 24"><rect x="9" y="9" width="11" height="11" rx="2"/><path d="M5 15V5a2 2 0 0 1 2-2h10"/></svg>',
|
| 391 |
+
ok: '<svg viewBox="0 0 24 24"><path d="M5 13l4 4L19 7"/></svg>',
|
| 392 |
+
regen:'<svg viewBox="0 0 24 24"><path d="M21 12a9 9 0 1 1-3-6.7"/><path d="M21 3v5h-5"/></svg>',
|
| 393 |
+
};
|
| 394 |
+
function iconBtn(html, title, fn) { const b = document.createElement("button"); b.type = "button"; b.title = title; b.innerHTML = html; b.onclick = fn; return b; }
|
| 395 |
+
// action row: copy the answer + regenerate the last turn (Grok's row, Claude's restraint)
|
| 396 |
+
function fitActions(ui, text, regen) {
|
| 397 |
+
if (!ui.acts) return; ui.acts.innerHTML = "";
|
| 398 |
+
const copy = iconBtn(ICON.copy, "Copy", async () => {
|
| 399 |
+
try { await navigator.clipboard.writeText(text); copy.classList.add("ok"); copy.innerHTML = ICON.ok;
|
| 400 |
+
setTimeout(() => { copy.classList.remove("ok"); copy.innerHTML = ICON.copy; }, 1200); } catch {}
|
| 401 |
+
});
|
| 402 |
+
ui.acts.appendChild(copy);
|
| 403 |
+
if (regen) ui.acts.appendChild(iconBtn(ICON.regen, "Regenerate", regen));
|
| 404 |
+
ui.acts.classList.add("shown");
|
| 405 |
+
}
|
| 406 |
+
// follow-ups AUTHORED BY THE MODEL about the actual exchange (Grok's behavior, done locally):
|
| 407 |
+
// one bounded extra generation right after the answer; killed instantly if the user starts typing.
|
| 408 |
+
let sugCtl = null;
|
| 409 |
+
async function offerFollowups(lastQ, lastA, host) {
|
| 410 |
+
try { if (sugCtl) sugCtl.abort(); } catch {}
|
| 411 |
+
sugCtl = new AbortController();
|
| 412 |
+
const ask = `Here is a conversation:
|
| 413 |
+
Question: ${lastQ}
|
| 414 |
+
Answer: ${lastA.slice(0, 600)}
|
| 415 |
+
|
| 416 |
+
Write exactly two short, sharp follow-up questions a curious person would ask next. One per line. No numbering, no preamble.`;
|
| 417 |
+
try {
|
| 418 |
+
const ids = engine.tokenize(engine.frameTurn(ask, false));
|
| 419 |
+
const res = await engine.generate(ids, { maxNew: 180, signal: sugCtl.signal });
|
| 420 |
+
const seg = splitThink(res.outIds || []);
|
| 421 |
+
const text = seg.ans.length ? engine.detokenize(seg.ans) : (res.text || "");
|
| 422 |
+
const qs = text.split(/\n+/).map((l) => l.replace(/^[-*\d.\s]+/, "").trim()).filter((l) => l.length > 8 && l.length < 140).slice(0, 2);
|
| 423 |
+
if (!qs.length || busy) return;
|
| 424 |
+
const box = document.createElement("div"); box.className = "fu";
|
| 425 |
+
for (const label of qs) {
|
| 426 |
+
const b = document.createElement("button"); b.type = "button";
|
| 427 |
+
b.innerHTML = `<span class="arr">↳</span>${label.replace(/[<>&]/g, "")}`;
|
| 428 |
+
b.onclick = () => { box.remove(); $("inp").value = label; send(); };
|
| 429 |
+
box.appendChild(b);
|
| 430 |
+
}
|
| 431 |
+
host.appendChild(box);
|
| 432 |
+
log.scrollTop = log.scrollHeight;
|
| 433 |
+
} catch {} // aborted / out of room → no suggestions, no noise
|
| 434 |
+
}
|
| 435 |
+
function note(s) { const d = document.createElement("div"); d.className = "note"; d.textContent = s; log.appendChild(d); }
|
| 436 |
+
|
| 437 |
+
// split streamed outIds into thinking + answer segments by the <think> token ids (robust: no
|
| 438 |
+
// tags at position 0 → everything is answer; unclosed → everything so far is thinking).
|
| 439 |
+
function splitThink(outIds) {
|
| 440 |
+
if (thinkOpen < 0 || outIds[0] !== thinkOpen) return { think: [], ans: outIds };
|
| 441 |
+
const c = outIds.indexOf(thinkClose);
|
| 442 |
+
if (c < 0) return { think: outIds.slice(1), ans: [] };
|
| 443 |
+
return { think: outIds.slice(1, c), ans: outIds.slice(c + 1) };
|
| 444 |
+
}
|
| 445 |
+
|
| 446 |
+
let busy = false, ready = false;
|
| 447 |
+
async function send() {
|
| 448 |
+
const q = $("inp").value.trim();
|
| 449 |
+
if (!q || busy) return;
|
| 450 |
+
if (!ready || !engine) { // the mind is still arriving: hold ONE question, it sends itself
|
| 451 |
+
pendingQ = q; $("inp").value = "";
|
| 452 |
+
$("col").classList.add("started");
|
| 453 |
+
msg("You", "user").body.textContent = q;
|
| 454 |
+
note("your question will send itself the moment the mind arrives");
|
| 455 |
+
return;
|
| 456 |
+
}
|
| 457 |
+
busy = true; $("inp").value = ""; $("send").disabled = true;
|
| 458 |
+
$("col").classList.add("started"); // the greeting yields to the conversation (Claude-room transition)
|
| 459 |
+
msg("You", "user").body.textContent = q;
|
| 460 |
+
let turn = engine.tokenize(engine.frameTurn(q, mind.length > 0));
|
| 461 |
+
if (mind.length + turn.length + 384 > CTX) { // the window fills: the mind FOLDS its history, never drops it
|
| 462 |
+
$("metrics").innerHTML = spn() + "folding memory · nothing is forgotten";
|
| 463 |
+
try { memoryNote = await foldMemory(); persistStory(); } catch {}
|
| 464 |
+
mind = [];
|
| 465 |
+
}
|
| 466 |
+
let qEff = q;
|
| 467 |
+
if (!mind.length && memoryNote) qEff = `(What you remember of our conversation so far: ${memoryNote})
|
| 468 |
+
|
| 469 |
+
${q}`;
|
| 470 |
+
if (!mind.length) turn = engine.tokenize(engine.frameTurn(qEff, false));
|
| 471 |
+
const ids = mind.concat(turn);
|
| 472 |
+
try { if (sugCtl) sugCtl.abort(); } catch {}
|
| 473 |
+
document.querySelectorAll(".fu").forEach((n) => n.remove());
|
| 474 |
+
const mindBefore = mind.slice();
|
| 475 |
+
const ui = msg(modelName, "bot"); ui.body.innerHTML = spn();
|
| 476 |
+
ui.think.querySelector("summary").innerHTML = spn() + `<span class="sum">thinking</span>`;
|
| 477 |
+
const tSend = performance.now(); let ttftSet = false, thoughtMs = 0;
|
| 478 |
+
lastTTFT = null; lastTokps = null;
|
| 479 |
+
$("metrics").innerHTML = spn() + `<b>${modelName}</b> is thinking`;
|
| 480 |
+
try {
|
| 481 |
+
const res = await engine.generate(ids, {
|
| 482 |
+
maxNew: CTX - ids.length - 8, // the whole remaining KV window (eos stops early)
|
| 483 |
+
onToken: (t) => {
|
| 484 |
+
if (!ttftSet) { ttftSet = true; lastTTFT = (performance.now() - tSend) / 1000; } // TTFT = send → first visible token
|
| 485 |
+
if (t.stats && t.stats.tokps) lastTokps = t.stats.tokps;
|
| 486 |
+
metrics();
|
| 487 |
+
const s = splitThink(t.outIds);
|
| 488 |
+
if (s.think.length) { ui.think.hidden = false; ui.t.textContent = engine.detokenize(s.think); }
|
| 489 |
+
if (s.ans.length && !thoughtMs) { thoughtMs = performance.now() - tSend; // answer flowing: freeze "Thought for Ns"
|
| 490 |
+
const secs = Math.max(1, Math.round(thoughtMs / 1000));
|
| 491 |
+
ui.think.querySelector("summary").innerHTML = `<span class="chev">▸</span><span class="sum">Thought for ${secs}s</span>`; }
|
| 492 |
+
ui.body.textContent = s.ans.length ? engine.detokenize(s.ans) : (s.think.length ? "" : t.text);
|
| 493 |
+
log.scrollTop = log.scrollHeight;
|
| 494 |
+
},
|
| 495 |
+
});
|
| 496 |
+
const s = splitThink(res.outIds || []);
|
| 497 |
+
const secs = Math.max(1, Math.round((thoughtMs || (performance.now() - tSend)) / 1000));
|
| 498 |
+
ui.think.querySelector("summary").innerHTML = `<span class="chev">▸</span><span class="sum">Thought for ${secs}s</span>`;
|
| 499 |
+
if (s.think.length) { ui.think.hidden = false; ui.t.textContent = engine.detokenize(s.think); }
|
| 500 |
+
if (s.ans.length) {
|
| 501 |
+
const answer = engine.detokenize(s.ans);
|
| 502 |
+
ui.body.textContent = answer;
|
| 503 |
+
mind = ids.concat(s.ans); // history carries the ANSWER only (Qwen3 convention: prior-turn thinking dropped)
|
| 504 |
+
story.push({ q, a: answer }); persistStory();
|
| 505 |
+
fitActions(ui, answer, () => { if (!busy) { mind = mindBefore; $("inp").value = q; send(); } }); // regenerate: rewind history, re-ask
|
| 506 |
+
offerFollowups(q, answer, ui.d); // the model writes its own follow-ups, in place
|
| 507 |
+
} else if (s.think.length) {
|
| 508 |
+
ui.body.textContent = "I ran out of room while thinking. Ask again, a bit shorter."; // unclosed <think> at the window edge; turn not kept
|
| 509 |
+
} else {
|
| 510 |
+
ui.body.textContent = res.text;
|
| 511 |
+
mind = ids.concat(res.outIds || []);
|
| 512 |
+
}
|
| 513 |
+
if (res.stats && res.stats.tokps) lastTokps = res.stats.tokps;
|
| 514 |
+
metrics();
|
| 515 |
+
} catch (e) { ui.body.textContent = "Something broke: " + (e && e.message || e); }
|
| 516 |
+
busy = false; $("send").disabled = false; $("inp").focus();
|
| 517 |
+
log.scrollTop = log.scrollHeight;
|
| 518 |
+
}
|
| 519 |
+
|
| 520 |
+
$("go").addEventListener("click", () => {
|
| 521 |
+
entered = true; show("chat"); $("inp").focus();
|
| 522 |
+
if (!streamStarted) { streamStarted = true; stream(); }
|
| 523 |
+
});
|
| 524 |
+
$("send").disabled = true; // until the mind is resident (early questions queue)
|
| 525 |
+
(async () => {
|
| 526 |
+
try {
|
| 527 |
+
if (navigator.connection && navigator.connection.saveData) return; // respect data saver
|
| 528 |
+
if (SRC) return; // dev override: no background pulls
|
| 529 |
+
const B27 = "https://huggingface.co/HOLOGRAMTECH/q-bonsai-27b/resolve/main";
|
| 530 |
+
const cache = await caches.open("holo-kappa-v1");
|
| 531 |
+
const man = await (await fetch(B27 + "/manifest.json")).json();
|
| 532 |
+
const urls = Object.values(man.tensors || {}).map((r) => B27 + "/b/" + String(r.kappa).replace(":", "_") + ".gz");
|
| 533 |
+
let i = 0;
|
| 534 |
+
const worker = async () => {
|
| 535 |
+
while (i < urls.length) {
|
| 536 |
+
const u = urls[i++];
|
| 537 |
+
if (await cache.match(u)) continue;
|
| 538 |
+
while (streamStarted && !ready) await new Promise((r) => setTimeout(r, 1500)); // the live stream owns the wire
|
| 539 |
+
try { const b = await (await fetch(u, { cache: "no-store" })).arrayBuffer(); await cache.put(u, new Response(b, { headers: { "Content-Type": "application/octet-stream" } })); } catch {}
|
| 540 |
+
}
|
| 541 |
+
};
|
| 542 |
+
Promise.all(Array.from({ length: 3 }, worker)).catch(() => {});
|
| 543 |
+
} catch {}
|
| 544 |
+
})();
|
| 545 |
+
(async () => { // returning visitor: the mind wakes BEHIND the welcome screen
|
| 546 |
+
try { const c = await caches.open("holo-kappa-v1"); if (await c.match(BASE + "/manifest.json")) { streamStarted = true; stream(); } } catch {}
|
| 547 |
+
})();
|
| 548 |
+
$("send").addEventListener("click", send);
|
| 549 |
+
$("inp").addEventListener("keydown", (e) => { if (e.key === "Enter") send(); });
|
| 550 |
+
if (!navigator.gpu) { $("go").disabled = true; $("fine").textContent = "This browser has no WebGPU. Chrome or Edge 113 or newer required."; }
|
| 551 |
+
</script>
|
| 552 |
+
</body>
|
sha256/6668e0b3a49e1e2d1a30ef1d3ac90169730fd291438c9180911d514720c2acec
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"@context":["https://www.w3.org/ns/did/v1","https://w3id.org/security/data-integrity/v2",{"dcterms":"http://purl.org/dc/terms/","links":{"@container":"@set","@id":"schema:hasPart"},"prov":"http://www.w3.org/ns/prov#","rel":"schema:additionalType","schema":"https://schema.org/"},{"holstr":"https://hologram.os/ns/strand#"}],"@type":["prov:Entity","holstr:Entry"],"holstr:kind":"release","holstr:op":"did:holo:sha256:87599792c7b13fad9d6c57d3b89d2cef35e4715869f5cde597ab60ca92699f0b","holstr:payload":{"apps":{"bonsai":"2a18cc07373595a4c89911410c2419e8519bc40f2d76670d43db286cdf166802","carry":"9f44164b17e6b7e37f39623bb445d49b6608da5f2b04cef8b1a8b183362a6b9a","hello":"66c1ada5ac08a2d4f73851bbe7458ad5fb6e2226c5a131c3829abfe715900fed","holo-messenger":"01e2db1e847e73881b7ce6f251677a4c0f9629203d0bc913053ffb4047b1df2d","jellyfin":"3fd2a00105ad0e8f01109dce52ff4c7a0cc6c9444532b0453ed9d770cce2d3a4","resolve":"23aec66382775f5773693615338f37c37a5f58257ec95aece33a664baa6fe0db","yourspace":"9ffc94e11c78fbe6b940bc04ac92f0f12238cf7ce82b5092c53d5761146a50df"},"boot":{"entry":"holo-portal.mjs","sha256":"caeb3e57b6eeab09bee6d67c022145a8e2dae610c929a7f51bc169898625e7e8"},"closure":"c844024f03d331785262bcb44d7e13b813184fcb4b618d5be763dd3ef58912ba","manifest":"792736ddc9a6fa4d6ad612ac0bf851834e7acc46ba3ea335c6f0e32fdf24bda6","runtime":{"apps/q/pkg/holospaces_web.js":"b9f8a887de588c5193dc65ca9ce206a70c6df53595b848e0ce0299c2d88a5753","apps/q/pkg/holospaces_web_bg.wasm":"9d90b4ea8bccee8c239073c7ec7dd5158c6d11f1f668487570d17475d79e661e","apps/workspace/pkg/holospaces_web.js":"8c30aa5582dffe4548d27fa7863163eba689ed65126be472c003f5884fc8e534","usr/lib/holo/holowhat/holospaces_web.js":"a5b5d9c559a1d2812c33e9d7a4b1c24bb03059482503a23356e4c9c32d4d8b88","usr/lib/holo/holowhat/holospaces_web_bg.wasm":"00cfa4960b319ba1ba7291cddb20dea130a407ce8b42426218854f4f68f4dcd7","usr/lib/pkg/holospaces_web.js":"8c30aa5582dffe4548d27fa7863163eba689ed65126be472c003f5884fc8e534","usr/lib/pkg/holospaces_web_bg.wasm":"3370b22070b56218a57df6406e2e4ba7cc171e942d4d1f2ae4297ea2c4c08d9c"},"shell":"0e8ac9d7dd55694dcc30ce1cdcb688a2b624ba54eb90619bdf7251d123ba17b5","world":"9540f2903ce9ebab249e0ddc39cff472dc4c6caf1eb0d0fc1b497fb2a3436d05"},"holstr:prev":"did:holo:sha256:391a3659d176f796ebc7956c10f937923ff18e87d8971f52990293895d81a636","holstr:seq":399,"prov:generatedAtTime":"2026-07-15T22:43:55.332Z"}
|
sha256/75000614d279104e10936e4ccba11e3918ac045c5db9386bb9b319ffc177a1b3
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"@type":"holo:world","apps":{"catalog":{"@context":{"dcat":"http://www.w3.org/ns/dcat#","dcterms":"http://purl.org/dc/terms/","holo":"https://hologram.os/ns#","schema":"https://schema.org/"},"@id":"https://hologram.os/apps","@type":["dcat:Catalog","schema:DataCatalog"],"dcterms:description":"Each app is a self-contained holospace addressed by the did:holo of its content (Law L1); the OS indexes addresses, not locations; any byte re-derives (Law L5). Pin an app anywhere and it boots in the Hologram OS holospace frame from a single κ.","dcterms:title":"Hologram Apps — the content-addressed app catalog"},"compositionsKappa":"d62b76681eb5137c4e55f71d19a93b6fe031e2d411ee75dfc63678bec70b14f9","entriesKappa":"0e377fb43a5217d988b1ad397124cc5ff94b86751628af109909200d6650b677"},"arrival":{"pack":{"bytes":2838415,"files":208,"kappa":"1c130330bafe9e5994c6bd499bea497755b18797c7a587d6ab09b5f6313efa5b","v":1}},"axis":{"identity":"sha256","name":"blake3"},"floor":[{"path":"index.html","reason":"seed"},{"path":"release.json","reason":"pin"},{"path":"root-sw.js","reason":"sw"},{"path":"root-sw-classic.js","reason":"sw"},{"path":"apps/holo-messenger/holo-sw.js","reason":"sw"},{"path":"apps/jellyfin/holo-jellyfin-sw.js","reason":"sw"},{"path":"apps/q/q-chat.html","reason":"boot"},{"path":"apps/q/core/voice-out.js","reason":"boot"},{"path":"apps/q/core/loader.js","reason":"boot"},{"path":"apps/q/core/engine.js","reason":"boot"},{"path":"apps/q/core/q-self.mjs","reason":"boot"},{"path":"apps/q/core/holo-q-guards.mjs","reason":"boot"},{"path":"apps/q/core/holo-orb.js","reason":"boot"},{"path":"apps/q/core/semantic.js","reason":"boot"},{"path":"apps/q/core/kappa.js","reason":"boot"},{"path":"apps/q/qvac-gpu.js","reason":"boot"},{"path":"apps/q/qvac-2bit.mjs","reason":"boot"},{"path":"apps/q/pkg/holospaces_web.js","reason":"boot"},{"path":"apps/jellyfin/index.html","reason":"boot"},{"path":"apps/jellyfin/holo-jellyfin-sw.js","reason":"boot"},{"path":"apps/jellyfin/icon.svg","reason":"boot"},{"path":"apps/jellyfin/LICENSE-NOTE.md","reason":"boot"},{"path":"apps/yourspace/elon.html","reason":"boot"},{"path":"apps/yourspace/holo-blake3.mjs","reason":"boot"},{"path":"apps/yourspace/holo-yourspace.mjs","reason":"boot"},{"path":"apps/yourspace/index.html","reason":"boot"},{"path":"apps/yourspace/jensen.html","reason":"boot"},{"path":"apps/yourspace/og-elon.jpg","reason":"boot"},{"path":"apps/yourspace/og-jensen.jpg","reason":"boot"},{"path":"apps/yourspace/og-sam.jpg","reason":"boot"},{"path":"apps/yourspace/sam.html","reason":"boot"},{"path":"apps/spaces/holo-spaces.mjs","reason":"boot"}],"manifests":{"4c31735a5d69d3796f7a8b8b75c1e53fc3f0214df2ae8f12dc8319b7e28e88d7":"f4199d67f0b5b37740df882b97a41f6a1628f0a7e4de18af0ff54b3d79ab9a95","4faa4eed56ecb1fb7ad22e1a35bc55fff12569124e59631dc0edb445c17ac72a":"0b71c2933d8826565b2d48f097215f76a8e5ed33bd3719302d564713931707b9","ffa452756fd9a7cf0331a4862d122ebbe374b04d3a8fdd744ded40d32a4bf780":"1df63382484b1c660596eafd3c07aa59f6b239b4ac081e3297f64bcb72aed896"},"names":{"bytes":1157073,"files":6080,"kappa":"e9ae0098c5ca92a0e6bedf15a794487ed36f54cd33f914d2eee8a0e97ad4c30c","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/"},"rescue":{"appIndex":{"axis":"blake3","extra":{"resolve":"bac4e2d430baa0480137d3b5d8ffc383fa61077c9487c5f4e19f0dcdccfb68a8"},"note":"blake3(entry-document) per app — derived from the SIGNED sha256 apps table; each re-derives from b/<blake3hex>. Transitional index until the strand re-seals under blake3."},"appMaps":{"animate":{"axis":"blake3","filesKappa":"142c767adf61c1ba2611cc8b3c10b79bd1887feb29f0b51ab4d270ef0ae8b956","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/animate/holo-evicted.json"},"arcade":{"axis":"blake3","filesKappa":"d021a48a576bf8f8cd4aa75fc4e295c9c346ae42eba58e9e63cc714fa8bb0a92","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/arcade/holo-evicted.json"},"browser":{"axis":"blake3","filesKappa":"a409143f20d94142409c8d962258f8e593241f994b9e3daced07347e234ffcb8","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/browser/holo-evicted.json"},"files":{"axis":"blake3","filesKappa":"27fbfc761e0f0c9af009fee6c2e0d59f3e1c78934843eed6ea7b020382ad9c54","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/files/holo-evicted.json"},"games":{"axis":"blake3","filesKappa":"45c5261dddb6e8e67c94b888b84a7b3f88b7eb8e6eb2fe5beee2e189a7cd5118","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/games/holo-evicted.json"},"holo-games":{"axis":"blake3","filesKappa":"70411e77ce1e0bb079f52f3eefe500d89018de37bb7f69099ff48bd4fb653d71","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/holo-games/holo-evicted.json"},"holo-linux":{"axis":"blake3","filesKappa":"c50fbd6c62bbf0c8a1497bf147711b426fcbdc6a46ab20d141599b9b1c2330dd","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/holo-linux/holo-evicted.json"},"holo-money":{"axis":"blake3","filesKappa":"f50887e7ea6e8a6cba41114908aedfd5b5703c435e583d1daed8c0124a7891c9","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/holo-money/holo-evicted.json"},"hub":{"axis":"blake3","filesKappa":"7d878d6594257a3ac9785e85e2460501b74bca6723f1015ac69379f694d0219e","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/hub/holo-evicted.json"},"jellyfin":{"axis":"blake3","bootFloor":["index.html","holo-jellyfin-sw.js","icon.svg","LICENSE-NOTE.md"],"filesKappa":"68dff18c7bd3d096a50f1c230edc66a3edb6cc9975727e54ca786c1ec2a480c6","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/jellyfin/holo-evicted.json"},"music":{"axis":"blake3","filesKappa":"68765b1b0e0fdf7dd49203d1b82469c6fe6db1ff5ab4e1a711696f019ee164bf","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/music/holo-evicted.json"},"player":{"axis":"blake3","filesKappa":"15fcce11b0e5b9d6835a0882b68a34734892eaa53e2a6b90f4b8adc77af99dd6","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/player/holo-evicted.json"},"q":{"axis":"blake3","bootFloor":["q-chat.html","core/voice-out.js","core/loader.js","core/engine.js","core/q-self.mjs","core/holo-q-guards.mjs","core/holo-orb.js","core/semantic.js","core/kappa.js","qvac-gpu.js","qvac-2bit.mjs","pkg/holospaces_web.js"],"filesKappa":"1a02ff94a3988b4af70353bef0c4d2e04aefaa741398b148edd5076ec5d0ae8e","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/q/holo-evicted.json"},"self":{"axis":"blake3","filesKappa":"d219c327ec83f3c5adfd72dff2855d32805d9dcbe436a7430133e27f5a2ef683","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"apps/self/holo-evicted.json"},"spaces":{"axis":"blake3","bootFloor":["holo-spaces.mjs"],"filesKappa":"9e48ef9c204ab7cdb7a17ca5b7bac439bfb9afc720a05b682a406b77a5566a87","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"apps/spaces/holo-evicted.json"},"ui":{"axis":"blake3","filesKappa":"65d603d1f0876ad6c0e402f2ec6e4a5d4d1d27436df7178988197df15f3ecb77","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/ui/holo-evicted.json"},"video":{"axis":"blake3","filesKappa":"b4e4470073a826c0307aff5e6fbb60db2234654e98b1c8b0338d96f33ac586b5","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/video/holo-evicted.json"},"yourspace":{"axis":"blake3","bootFloor":["elon.html","holo-blake3.mjs","holo-yourspace.mjs","index.html","jensen.html","og-elon.jpg","og-jensen.jpg","og-sam.jpg","sam.html"],"filesKappa":"6247cb9f207bdf574b85eafe0befce91a81f09ee33fb9d78e3cbaae822b1ff91","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"apps/yourspace/holo-evicted.json"}},"apps":["video","animate","holo-linux","player","music","browser","holo-games","hub","ui","q","games","holo-money","files","arcade","jellyfin","yourspace","spaces","self"],"trees":[{"axis":"blake3","filesKappa":"c563709701b6f890f3fdc5e75d73fa45bf6a5ae017955bf0fc207ff9baa738a8","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"_shared/voice/vendor/holo-evicted.json","prefix":"_shared/voice/vendor/"},{"axis":"blake3","filesKappa":"121de52fa8605a472a978385a1b00c05d1bd164eb3b2a610c43c19ccedfe677c","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"usr/share/wallpapers/holo-evicted.json","prefix":"usr/share/wallpapers/"},{"axis":"blake3","filesKappa":"3f0cf28ccaf5c279f736a36bed4739b4bc8375d732764df77c7a3a781f5681ab","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"apps/holo-messenger/_vendor/native-net/holo-evicted.json","prefix":"apps/holo-messenger/_vendor/native-net/"},{"axis":"blake3","filesKappa":"f4b87d17ddd84d7ec758c3c18bdb6265466995dd34a44d36acd56d240d3c93a3","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"apps/holo-messenger/_vendor/vodozemac/holo-evicted.json","prefix":"apps/holo-messenger/_vendor/vodozemac/"},{"axis":"blake3","filesKappa":"a48f7d3e44ecf5c27c832ccc400dd4049a61b3bd91cfb554942824dcf990f4e2","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"apps/holo-messenger/_vendor/discord/holo-evicted.json","prefix":"apps/holo-messenger/_vendor/discord/"},{"axis":"blake3","filesKappa":"697201a6416c6a93b6a8f8bed5b742d9c341148148c425cf8ff37249ad54a64c","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"usr/lib/holo/holowhat/holo-evicted.json","prefix":"usr/lib/holo/holowhat/"},{"axis":"blake3","filesKappa":"4a3417dd94d070831c9c4daa42ef54b32368d3a3a82e9e5118098d70ab659b10","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"_shared/holo-evicted.json","prefix":"_shared/"},{"axis":"blake3","filesKappa":"d48836c3584b723d4ff85c1c4ee01516a1a8718acb305ba1ce41a6eee83d9543","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"apps/holo-messenger/holo-evicted.json","prefix":"apps/holo-messenger/"},{"axis":"blake3","filesKappa":"4bd4f700a9b2bb3804d7c2b6757875acc881f2204af38f235961538107031b59","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"vendor/onnxruntime-web/holo-evicted.json","prefix":"vendor/onnxruntime-web/"}]},"rungs":{"blake3":["https://cdn.jsdelivr.net/gh/Hologram-Technologies/hologram-apps@main/b/","https://raw.githubusercontent.com/Hologram-Technologies/hologram-apps/main/b/","https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","https://hologram-technologies.github.io/hologram-apps/b/"],"sha256":["https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/sha256/"]},"runtime":{"alg":"Ed25519","payload":{"assets":{"glue":{"blake3":"8993d93001da373dd4acd2d75b93e4ecf80000cbac4a78d492db440e4c7f883f","bytes":118072,"hint":"usr/lib/holo/holowhat/holospaces_web.js","sha256":"a5b5d9c559a1d2812c33e9d7a4b1c24bb03059482503a23356e4c9c32d4d8b88"},"wasm":{"blake3":"4faa4eed56ecb1fb7ad22e1a35bc55fff12569124e59631dc0edb445c17ac72a","bytes":2926068,"hint":"usr/lib/holo/holowhat/holospaces_web_bg.wasm","sha256":"00cfa4960b319ba1ba7291cddb20dea130a407ce8b42426218854f4f68f4dcd7"}},"at":"2026-07-09T16:43:20.387Z","channel":"resolver","name":"holospaces-web","seq":2,"v":1},"pub":"snYY6y35gdZ1ngOE5E+G1BGFjlTo2MfpfP8h6yc7r+M=","sig":"o/IRuCep+lmC4lrqj36SnwTH7u2v3dHKZFWjSxOc8/51Sh94pY/fQdKlBqZ3aEBpgv2wRIJdb+os456N4XegDw=="},"sharded":true,"shell":{"aggregate":"0e8ac9d7dd55694dcc30ce1cdcb688a2b624ba54eb90619bdf7251d123ba17b5","assets":[{"bytes":71122,"kappa":"01e2db1e847e73881b7ce6f251677a4c0f9629203d0bc913053ffb4047b1df2d","path":"/apps/holo-messenger/app.html"},{"bytes":429353,"kappa":"41747f7be9e910e49eb7d040828e32068e42f783b90c8b8b08f30d0019fc4bab","path":"/apps/holo-messenger/_vendor/ui/chat-ui.bundle.js"},{"bytes":251109,"kappa":"e7dc8651380430ab7253e9c5f820f8a4a9263b70abf03e267a9b80668614d8bc","path":"/apps/holo-messenger/_vendor/ui/chat-ui.bundle.css"},{"bytes":1303,"kappa":"91c3c9c82d97746bb274d9131bc54992343f411f17e1c698d65db5981d41d1ad","path":"/apps/holo-messenger/holo-messenger-login.mjs"},{"bytes":354727,"kappa":"1a25fd1826968339089f25813df3c9e5fd61aad6e365a7db9d2f58578ff7abc3","path":"/apps/holo-messenger/holo-messenger-app.mjs"},{"bytes":35148,"kappa":"bf790f49c2c3366fae494488b1832dac05908e18a37f5b5dd4292c76a6d130f7","path":"/apps/holo-messenger/messenger-shadcn-ui.mjs"},{"bytes":8723,"kappa":"232d735a20f3a27c22126ea42cbfc7768b9c2db16c52b110980e82d37e710c0b","path":"/apps/holo-messenger/holo-messenger-weave.mjs"},{"bytes":6314,"kappa":"026c320b1e9de27af7ac42d21d1544035c409fb4c1912507bac0eb28811ca34e","path":"/apps/holo-messenger/messenger-skin.mjs"},{"bytes":54072,"kappa":"d76d596376d1203a8c170ddbe9dab02442158671646c630ee1902d5953e63fc5","path":"/apps/holo-messenger/messenger-skins.css"},{"bytes":3136,"kappa":"8bf24cf064277be17b4b4d2461bdc5f20184aac2887fe428e210d1dcc3c84a25","path":"/apps/holo-messenger/messenger-sw-register.mjs"},{"bytes":8262,"kappa":"331a35dfd2b4774673ed92da26b0c78fecd336a70ecc8ff890256e835f7ccfd9","path":"/apps/holo-messenger/holo-m1-boot.mjs"},{"bytes":5138,"kappa":"86a3f68c5070d7a543e52768811268d22f2051a5033c11d5281ecd2a36c2dd44","path":"/apps/holo-messenger/holo-release-boot.mjs"},{"bytes":2875,"kappa":"15c5bccd5549900f8bb67bbeee9f2a8e0020849a489abb3d167922c673f31df1","path":"/apps/holo-messenger/holo-release-verify.mjs"},{"bytes":11446,"kappa":"ab9519718341527bc28daba9fd6a0c372017b1d3f2bcdfc5488f435063192703","path":"/apps/holo-messenger/mail/holo-mail-attach.mjs"},{"bytes":546613,"kappa":"f6caa9eeead2c99deeb2cdb70b7e25bbaa2cf5c60555f5b4030ecf6b6d9efa51","path":"/apps/holo-messenger/_vendor/wallpaper-default.jpg"},{"bytes":2990,"kappa":"70bf5bace3fe694e3140893ee8fc3f9a6f28f4645f52bc517ec7299c7a8d3fe3","path":"/apps/holo-messenger/_vendor/ui/chunk-2EJSL5UF.js"},{"bytes":2228,"kappa":"a2ac22c3a8b541f08787faafe9aa19bd14a315d1af8516fe7d1f31dba998ef28","path":"/apps/holo-messenger/_vendor/ui/chunk-4MZXOCV2.js"},{"bytes":434064,"kappa":"d090908e06e8d0a2d3fcc01ce1f608eef8ef2e8ec2038c732a84cbe239d32ab1","path":"/apps/holo-messenger/_vendor/ui/chunk-BNASBBAK.js"},{"bytes":6357,"kappa":"dcefbefa520b792be78fd6c5553fae4cfa3db0a3749802005119d02ca1867537","path":"/apps/holo-messenger/_vendor/ui/chunk-DKCO25ZZ.js"},{"bytes":6541,"kappa":"42ac444800c708852b2004131d274632edaf9a45c578309451e04fd27d67cbc3","path":"/apps/holo-messenger/_vendor/ui/chunk-EJ2FITLI.js"},{"bytes":4818,"kappa":"007141010ac01ca81bb4bf74ad758709586b2899c25d7b8f8cf412abf1998c62","path":"/apps/holo-messenger/_vendor/ui/chunk-I6KLUZO2.js"},{"bytes":77281,"kappa":"fbc584dcd47de30a73780e59c463dc05a822590b8e0dd367311149edd46673a8","path":"/apps/holo-messenger/_vendor/ui/chunk-JUKDKHPD.js"},{"bytes":442967,"kappa":"56958e3b499497fa8a7281c8c1893637c89cbe3b7867aea276b07b34fca109ef","path":"/apps/holo-messenger/_vendor/ui/chunk-R7HPIGBM.js"},{"bytes":577,"kappa":"11247d28c5c2fb3d976002c2b55fecb6ba19fd88153e11d2c7af5832fd6ff331","path":"/apps/holo-messenger/_vendor/ui/chunk-SQE76S5B.js"},{"bytes":42059,"kappa":"601e33fbd2611b55a3bc492b26ee19608103750f3ecdccd6762f51d7aa5895b9","path":"/apps/holo-messenger/_vendor/ui/chunk-TYKGDUAW.js"},{"bytes":31691,"kappa":"ba0a74a49b10960552dd4778d210a152990ee94b69a2847699c630f94f87182d","path":"/apps/holo-messenger/_vendor/ui/chunk-E6U7U64M.js"},{"bytes":6505,"kappa":"28186f18edebe4a990c721dc98594d94f74ab02b8eea40d67b04a4b7b777be7f","path":"/apps/holo-messenger/_vendor/ui/chunk-LNIQGHQD.js"},{"bytes":11786,"kappa":"929cb2072b4084ca0195c2c0cb65190340c29e62c6b5c50dc1cebf8b788f6eca","path":"/apps/holo-messenger/_vendor/ui/chunk-OVQZEDS3.js"},{"bytes":3815,"kappa":"eb343aaebd5beec6186750769cdd48ddde4440b78f92d46c2cb851e893237944","path":"/apps/holo-messenger/_vendor/ui/chunk-RVGZ2KTZ.js"},{"bytes":133918,"kappa":"946dd4ca8e36408f3e5da27813cdafad3908e2a3466dc86e82eff442de4b813f","path":"/apps/holo-messenger/_vendor/ui/chunk-SXSU3V5W.js"},{"bytes":2440,"kappa":"304e4bf228c2aeade13b288617aab175a53d04f8ea3d305dc65a92c8973cc3df","path":"/apps/holo-messenger/_vendor/ui/chunk-VVOC7KGI.js"},{"bytes":3624,"kappa":"2a19268225fab8e102982de6e490c3e3468bedcfe368407aaa3525b78eb7cf34","path":"/apps/holo-messenger/_vendor/ui/chunk-AUML7DVR.js"},{"bytes":64039,"kappa":"65a4954f079070d79a8687acb55ef9927de74599bbdc0afbc8400cb4b0d75fac","path":"/apps/holo-messenger/_vendor/ui/chunk-GFDBGIBL.js"}],"created":1783953980938,"runtime":[{"bytes":127867,"kappa":"b9f8a887de588c5193dc65ca9ce206a70c6df53595b848e0ce0299c2d88a5753","path":"/apps/q/pkg/holospaces_web.js"},{"bytes":6469596,"kappa":"9d90b4ea8bccee8c239073c7ec7dd5158c6d11f1f668487570d17475d79e661e","path":"/apps/q/pkg/holospaces_web_bg.wasm"},{"bytes":76829,"kappa":"8c30aa5582dffe4548d27fa7863163eba689ed65126be472c003f5884fc8e534","path":"/apps/workspace/pkg/holospaces_web.js"},{"bytes":118072,"kappa":"a5b5d9c559a1d2812c33e9d7a4b1c24bb03059482503a23356e4c9c32d4d8b88","path":"/usr/lib/holo/holowhat/holospaces_web.js"},{"bytes":2926068,"kappa":"00cfa4960b319ba1ba7291cddb20dea130a407ce8b42426218854f4f68f4dcd7","path":"/usr/lib/holo/holowhat/holospaces_web_bg.wasm"},{"bytes":76829,"kappa":"8c30aa5582dffe4548d27fa7863163eba689ed65126be472c003f5884fc8e534","path":"/usr/lib/pkg/holospaces_web.js"},{"bytes":2999771,"kappa":"3370b22070b56218a57df6406e2e4ba7cc171e942d4d1f2ae4297ea2c4c08d9c","path":"/usr/lib/pkg/holospaces_web_bg.wasm"}],"v":1},"version":1}
|
sha256/7aeadc80050e3d81ba684a7406de33448ee015493a22406db9ded49135428ad0
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
[{"blake3Entry":"11ac8b747c90075b1c205bfd5551583dd01ecbb81b3f0db47b832fc69acbf246","dir":"browser","entry":{"@id":"did:holo:sha256:95a050d224058f6e9cba6463c002a9eae2e6a007bb1e5bdcfa89ce8d2c978d01","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/browser/index.html","holo:categories":["Network","WebBrowser"],"holo:entry":"sha256:e181aa25b70fdd99a76ed1155dec98bf0d4ff8833df782583990b64f76a011fa","holo:root":"did:holo:sha256:95a050d224058f6e9cba6463c002a9eae2e6a007bb1e5bdcfa89ce8d2c978d01","holo:words":"duty.drive.south","schema:alternateName":"duty.drive.south","schema:applicationCategory":"CommunicationApplication","schema:description":"A web browser that treats every page — web, local or holo:// — as verifiable content.","schema:identifier":"org.hologram.HoloBrowser","schema:image":"apps/browser/icon.svg","schema:keywords":["browser","hologram","web","holo","ipfs","ens","content-addressing","uor","dweb","agent","law-l5"],"schema:name":"Holo Browser","schema:softwareRequirements":["holo-dock-config.json","holo-dock.css","holo-dock.js","holo-manage.js","holo-mobile.css","holo-phi.css","holo-theme.js","holo-ux.js","teleport.js"]}},{"blake3Entry":"adb4ee61b7d0af6da0185929cd2e0ce0941c196d82e5d402ead3fb322fea10e4","dir":"holo-linux","entry":{"@id":"did:holo:sha256:e6963eac1912fe72dc5ae876038f38d86d6c1b6f2802211393a1a083e1a6109f","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/holo-linux/index.html","holo:categories":["System","Education","TerminalEmulator"],"holo:root":"did:holo:sha256:e6963eac1912fe72dc5ae876038f38d86d6c1b6f2802211393a1a083e1a6109f","holo:words":"lobster.wide.enrich","schema:alternateName":"lobster.wide.enrich","schema:applicationCategory":"UtilitiesApplication","schema:description":"A real riscv64 Linux, verified and booted in a browser tab.","schema:identifier":"org.hologram.HoloLinux","schema:image":"apps/holo-linux/icon.svg","schema:keywords":["linux","debian","riscv64","terminal","shell","bash","kappa","content-addressed"],"schema:name":"Holo Linux"}},{"blake3Entry":"8c12dc815f678081405826506c91ce41f349993b816b07ac723a0c8fa97e4730","dir":"holo-messenger","entry":{"@id":"did:holo:sha256:88494133a437bd46bfa0d591e46f6fb64c3fda35a897d7b86d2a915dcfedc3a2","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/holo-messenger/app.html","holo:categories":["Social","Communication"],"holo:entry":"sha256:e601c1ec39200c507cacb3ee6e2126c330383afcc7e0a66e85873f93c7011e47","holo:root":"did:holo:sha256:88494133a437bd46bfa0d591e46f6fb64c3fda35a897d7b86d2a915dcfedc3a2","holo:words":"innocent.age.caution","schema:alternateName":"innocent.age.caution","schema:applicationCategory":"SocialNetworkingApplication","schema:description":"Every messenger in one inbox. WhatsApp, Telegram, Discord, Slack and more stream into one familiar chat surface. Every message is verified and stays private on your device.","schema:identifier":"org.hologram.HoloMessenger","schema:image":"apps/holo-messenger/icon.svg","schema:keywords":["messenger","chat","unified inbox","whatsapp","telegram","discord","slack","beeper","content-addressed","holospace","uor"],"schema:name":"Holo Messenger"}},{"blake3Entry":"8c10406aed6dc2c5971bc5a95093ec8a91acb48a6dabbea1c07f1ab47a3d88ef","dir":"holo-money","entry":{"@id":"did:holo:sha256:9dfcc20bb7076c07ca21bc88c1e307ef07aafc9c8762f19d95eae72f05039cdf","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/holo-money/index.html","holo:entry":"sha256:f00cac91e066181842873164c824f90e3c61b8160051c2012414eb7f44d36394","holo:root":"did:holo:sha256:9dfcc20bb7076c07ca21bc88c1e307ef07aafc9c8762f19d95eae72f05039cdf","holo:words":"ivory.amused.wrist","schema:alternateName":"ivory.amused.wrist","schema:applicationCategory":"FinanceApplication","schema:description":"The neobank surface of Hologram — real balances over your sovereign wallet, money as κ-links, virtual cards as κ-objects with generative faces. One column: phone and the desktop right carriage are the same app. The wallet stays the vault; Holo Money is the bank UX over it.","schema:identifier":"org.hologram.HoloMoney","schema:image":"apps/holo-money/icon.svg","schema:keywords":["money","neobank","bank","balance","cards","payments","holo pay","wallet"],"schema:name":"Holo Money","schema:softwareRequirements":["holo-theme.js","holo-theme.css","holo-mobile.css","holo-wallet-bridge.js"]}},{"blake3Entry":"7537334be5a0fd1d6056e5052b145fba8d17b040a828591d65b6f4359acbf636","dir":"music","entry":{"@id":"did:holo:sha256:3fc79c195002faa226b2a66154a1528e7a873499f3cec3d4ac03c5d17d352544","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/music/index.html","holo:categories":["AudioVideo","Audio","Music","Player"],"holo:entry":"sha256:42a2436a5457992c0388af4c5ee062e9d5340ab0b15f12b2c78e8c93a4818ac7","holo:root":"did:holo:sha256:3fc79c195002faa226b2a66154a1528e7a873499f3cec3d4ac03c5d17d352544","holo:words":"claw.idea.toilet","schema:alternateName":"claw.idea.toilet","schema:applicationCategory":"MultimediaApplication","schema:description":"A verified music library and the whole internet as one.","schema:identifier":"org.hologram.HoloMusic","schema:image":"apps/music/icon.svg","schema:keywords":["music","library","subsonic","navidrome","radio","podcasts"],"schema:name":"Holo Music","schema:softwareRequirements":["favicon.png","holo-audio.js","holo-manage.js","holo-mobile.css","holo-object.js","holo-stations.js","holo-theme.js","teleport.js"]}},{"blake3Entry":"8883084a9a180a0c02e53f045e0faf11d264c083d0da21be945398216e4fd7a6","dir":"player","entry":{"@id":"did:holo:sha256:7d953e7dd69946145fa724cae5f37c72f3ed0cf554b50effe7dfc67a833a3016","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/player/index.html","holo:categories":["AudioVideo","Video","Player"],"holo:entry":"sha256:04e981669febda526ac70e0e6a68dfa782b5af1508b477b1067425c4e725c84b","holo:root":"did:holo:sha256:7d953e7dd69946145fa724cae5f37c72f3ed0cf554b50effe7dfc67a833a3016","holo:words":"river.wheat.skin","schema:alternateName":"river.wheat.skin","schema:applicationCategory":"MultimediaApplication","schema:description":"A verified media library for your movies and shows, with no server.","schema:identifier":"org.hologram.HoloPlayer","schema:image":"apps/player/icon.svg","schema:keywords":["media","library","jellyfin","movies","shows","player"],"schema:name":"Holo Player","schema:softwareRequirements":["holo-jellyfin.js","holo-manage.js","holo-mobile.css","holo-theme.js","teleport.js"]}},{"blake3Entry":"e43a32325775da882d3e187088da4cea4fac3b503adbe3d3b5bdbe3a9e13e998","dir":"q","entry":{"@id":"did:holo:sha256:c614f527b4b21e000ff2e1cde6d3d1324381881437e3ae4b4c80ee9a34ceca69","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/q/index.html","holo:categories":["AI","Productivity","Developer"],"holo:entry":"sha256:bb01430040bb991fb00979ddf88e90bb0e15b114a4c31f1ef6f215d4de17813d","holo:root":"did:holo:sha256:c614f527b4b21e000ff2e1cde6d3d1324381881437e3ae4b4c80ee9a34ceca69","holo:words":"walk.stand.apology","schema:alternateName":"walk.stand.apology","schema:applicationCategory":"AIApplication","schema:description":"A real AI that thinks entirely in your browser no server, no cloud, no API key.","schema:identifier":"org.hologram.HoloQ","schema:image":"apps/q/icon.svg","schema:keywords":["ai","llm","inference","verifiable inference","webgpu","browser-native","serverless","sovereign ai","qvac","kappa-disk","content-addressing","uor","did:holo","prov-o","law-l5","constitution","private ai","on-device"],"schema:name":"Holo Q","schema:softwareRequirements":["holo-theme.js","holo-mobile.css","holo-conscience.js","holo-store.js"]}},{"blake3Entry":"427325fe59f74d3838133641808b10ada7e05990d42a95977109aac6fa4bc476","dir":"self","entry":{"@id":"did:holo:sha256:963c75803506398b51d58e6e7ea8851c75cb72ebb6b72ae55978503a6639f368","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/self/index.html","holo:categories":["Security","Identity"],"holo:entry":"sha256:0511772584510f0888d97dd5a72bf986ad6791bd8e305063ddd8a82c39888a70","holo:root":"did:holo:sha256:963c75803506398b51d58e6e7ea8851c75cb72ebb6b72ae55978503a6639f368","holo:words":"allow.stock.bullet","schema:alternateName":"allow.stock.bullet","schema:applicationCategory":"SecurityApplication","schema:description":"A self-sovereign identity wallet: hold your credentials, prove only what's needed — like being over 18 — without revealing anything else, and sign in with no passwords. No accounts, no servers. Every proof is checked genuine on your own device and keeps working offline.","schema:identifier":"org.hologram.HoloSelf","schema:image":"apps/self/icon.svg","schema:keywords":["identity","self-sovereign","verifiable-credentials","did","selective-disclosure","passwordless","wallet","kyc","age-verification","agent-identity","content-addressed","uor"],"schema:name":"SELF"}},{"blake3Entry":"32850dd2b412bb5302fe7ce344011f63d16b0516c4d55c6b8dea797e407e8721","dir":"spaces","entry":{"@id":"did:holo:sha256:10e335d22cdf44081e7f974d29bac06be207b859f7d583b70e756927ccefe0e2","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/spaces/index.html","holo:categories":["Creativity","Social"],"holo:entry":"sha256:d8aebefb67e7fc7802e757b9a7d95bb881e6d75b4a9bc4bd4227634541757e51","holo:root":"did:holo:sha256:10e335d22cdf44081e7f974d29bac06be207b859f7d583b70e756927ccefe0e2","holo:words":"easily.struggle.immense","schema:alternateName":"easily.struggle.immense","schema:applicationCategory":"EntertainmentApplication","schema:description":"Walk into living, shareable, infinitely nestable rooms of holo apps — each rendered from its κ address. A Space is itself one content κ: compose by dragging things in, fork with a gesture, share by the κ alone. The OS is already a sandbox; this reveals it.","schema:identifier":"org.hologram.HoloSpaces","schema:image":"apps/spaces/icon.svg","schema:keywords":["spaces","rooms","compose","remix","nesting","content-addressed","holospace","uor"],"schema:name":"Holo Spaces","schema:softwareRequirements":["holo-theme.css","holo-mobile.css","holo-phi.css","holo-play-gpu.js"]}},{"blake3Entry":"629fdd5d4938b10a3002ef94264ce89c4312c32fdc2409c656a11bc6897362ab","dir":"ui","entry":{"@id":"did:holo:sha256:5f85dcea4d071f266c03781390cdc4bdecc02a0cb4616ba3bf534cba72176b2f","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/ui/index.html","holo:categories":["Developer","Design","System"],"holo:entry":"sha256:f2af676d9804685f773120551021b72848b06c9c510ee0238b95b8f0fac66925","holo:root":"did:holo:sha256:5f85dcea4d071f266c03781390cdc4bdecc02a0cb4616ba3bf534cba72176b2f","holo:words":"endless.inhale.seed","schema:alternateName":"endless.inhale.seed","schema:applicationCategory":"DeveloperApplication","schema:description":"Hologram OS's design control panel: an Appearance studio to theme the whole OS live (verified themes · accent · typography · accessibility) and a Components catalog of every shadcn + Magic UI element plus the daisyUI component layer, all driven by one Holo UI/UX token source across light, dark and immersive.","schema:identifier":"org.hologram.HoloUI","schema:image":"apps/ui/icon.svg","schema:keywords":["components","ui","ux","design-system","shadcn","magic-ui","daisyui","tokens","react","uor","content-addressed"],"schema:name":"Holo UI","schema:softwareRequirements":["holo-theme.css","holo-mobile.css","holo-phi.css","holo-theme.js","holo-ui-kernel.js"]}},{"blake3Entry":"83c35638004066699f24b346189947170127af5373175411deae4b65b485bb25","dir":"video","entry":{"@id":"did:holo:sha256:d0895d1cf629885c5037d7b894edf5e147ab697043530fee3b8c3cc8cb7c04fa","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/video/index.html","holo:categories":["AudioVideo","Video","Player"],"holo:root":"did:holo:sha256:d0895d1cf629885c5037d7b894edf5e147ab697043530fee3b8c3cc8cb7c04fa","holo:words":"paddle.inner.dwarf","schema:alternateName":"paddle.inner.dwarf","schema:applicationCategory":"MultimediaApplication","schema:description":"A verified video player with adaptive streaming, tamper-proof and serverless.","schema:identifier":"org.hologram.HoloVideo","schema:image":"apps/video/icon.svg","schema:keywords":["video","player","hls","streaming","media","videojs"],"schema:name":"Holo Video","schema:softwareRequirements":["holo-gpu.js","holo-manage.js","holo-mobile.css","holo-theme.js","teleport.js","videojs/video-js.min.css","videojs/video.min.js"]}},{"blake3Entry":null,"dir":"hub","entry":{"@id":"did:holo:sha256:620299e9ab8fdfb5396f254d8ef2636aa3c8940b15c76b5a84f72727077b002c","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/hub/index.html","holo:categories":["System","Utilities"],"holo:entry":"sha256:f3626a5a2eeef441d8439bb4b379592f4d682155c4e074249912bd2ade94dc20","holo:root":"did:holo:sha256:620299e9ab8fdfb5396f254d8ef2636aa3c8940b15c76b5a84f72727077b002c","holo:words":"cube.guilt.access","schema:alternateName":"cube.guilt.access","schema:applicationCategory":"UtilitiesApplication","schema:description":"Discover and stream thousands of apps — one clean place, nothing to install.","schema:identifier":"org.hologram.HoloHub","schema:image":"apps/hub/hologram.svg","schema:keywords":["apps","store","discover","stream"],"schema:name":"Holo Hub"}},{"blake3Entry":null,"dir":"files","entry":{"@id":"did:holo:sha256:ba6924d144a0267e1edb4f61cf4e3b1b9031d547f14c38adb75ef550026b87e1","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/files/index.html","holo:categories":["System","Utility"],"holo:entry":"sha256:963401ee68a2e9b050456cdcd3aa582d9cfc50eb7c8afef6349fbcef1fb57ee3","holo:root":"did:holo:sha256:ba6924d144a0267e1edb4f61cf4e3b1b9031d547f14c38adb75ef550026b87e1","holo:words":"chuckle.nation.cruel","schema:alternateName":"chuckle.nation.cruel","schema:applicationCategory":"UtilitiesApplication","schema:description":"The native file explorer for Hologram OS one window onto the whole verified object universe, plus your writable OPFS home. Feels native on every OS.","schema:identifier":"org.hologram.HoloFiles","schema:image":"apps/files/icon.svg","schema:keywords":["files","explorer","finder","file manager","opfs","content-addressing","uor","fhs","holospace","law-l5","native","serverless","privacy"],"schema:name":"Holo Files","schema:softwareRequirements":["holo-files.js","holo-platform.js","holo-ui-kernel.js","holo-theme.js","holo-ux.js","holo-capability.mjs","holo-object.js","holo-mobile.css","holo-webdav.js","holo-find.js","holo-resolve.js","holo-federate.js","holo-answer.js","holo-ask.js"]}},{"blake3Entry":null,"dir":"arcade","entry":{"@id":"did:holo:sha256:d4a4f2d6835c0efa0f7b50361dcbe8be84c60328a2f060c23ac8e016dbf7f5dd","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/arcade/index.html","holo:categories":["Game","Emulator","Player"],"holo:entry":"apps/arcade/index.html","holo:root":"did:holo:sha256:d4a4f2d6835c0efa0f7b50361dcbe8be84c60328a2f060c23ac8e016dbf7f5dd","schema:applicationCategory":"GameApplication","schema:description":"Play freely-shared Game Boy homebrew instantly — on-device, no server.","schema:identifier":"org.hologram.HoloArcade","schema:image":"apps/arcade/index.html","schema:keywords":["games","arcade","homebrew","game boy","retro","emulator"],"schema:name":"Holo Arcade"}},{"blake3Entry":null,"dir":"hello","entry":{"@id":"did:holo:sha256:66c1ada5ac08a2d4f73851bbe7458ad5fb6e2226c5a131c3829abfe715900fed","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/hello/index.html","holo:entry":"index.html","holo:root":"did:holo:sha256:66c1ada5ac08a2d4f73851bbe7458ad5fb6e2226c5a131c3829abfe715900fed","schema:applicationCategory":"UtilitiesApplication","schema:description":"An encoded experience — a folder became one verifiable address, streamed and re-derived before it paints.","schema:name":"Hello"}},{"blake3Entry":null,"dir":"games","entry":{"@id":"did:holo:sha256:d3c83e4dc5e0dc9373177e1b594e33b1ff796aa9cd734bce34d2bd0aaf8f8a87","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/games/index.html","holo:categories":["Game","Emulator","Player"],"holo:entry":"apps/games/index.html","holo:root":"did:holo:sha256:d3c83e4dc5e0dc9373177e1b594e33b1ff796aa9cd734bce34d2bd0aaf8f8a87","schema:applicationCategory":"GameApplication","schema:description":"The full retro library — homebrew plays instantly; every system streams and plays on-device.","schema:identifier":"org.hologram.Games","schema:image":"apps/games/index.html","schema:keywords":["games","arcade","homebrew","game boy","retro","emulator"],"schema:name":"Holo Games"}},{"blake3Entry":null,"dir":"carry","entry":{"@id":"did:holo:sha256:9f44164b17e6b7e37f39623bb445d49b6608da5f2b04cef8b1a8b183362a6b9a","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/carry/index.html","holo:entry":"index.html","holo:root":"did:holo:sha256:9f44164b17e6b7e37f39623bb445d49b6608da5f2b04cef8b1a8b183362a6b9a","schema:applicationCategory":"UtilitiesApplication","schema:description":"Seal your whole world into one file only you can open — back it up and restore it anywhere. No server.","schema:name":"Carry"}},{"blake3Entry":null,"dir":"jellyfin","entry":{"@id":"did:holo:sha256:3fd2a00105ad0e8f01109dce52ff4c7a0cc6c9444532b0453ed9d770cce2d3a4","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/jellyfin/index.html","holo:categories":["AudioVideo","Video","Player"],"holo:entry":"sha256:3fd2a00105ad0e8f01109dce52ff4c7a0cc6c9444532b0453ed9d770cce2d3a4","holo:root":"did:holo:sha256:3fd2a00105ad0e8f01109dce52ff4c7a0cc6c9444532b0453ed9d770cce2d3a4","schema:applicationCategory":"MultimediaApplication","schema:description":"A media server with no server — the Jellyfin experience over the κ substrate: movies, shows, music, games and books, every object content-addressed and verified on read.","schema:identifier":"org.hologram.HoloJellyfin","schema:image":"apps/jellyfin/icon.svg","schema:keywords":["jellyfin","media","server","movies","music","games","books","serverless"],"schema:name":"HOLOGRAM"}},{"blake3Entry":null,"dir":"bonsai","entry":{"@id":"did:holo:sha256:654c668faea49909268dcd047e80ba854bfda3a3c316ff5c043a803ea9630bad","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/bonsai/index.html","holo:categories":["AI","Productivity"],"holo:root":"did:holo:sha256:654c668faea49909268dcd047e80ba854bfda3a3c316ff5c043a803ea9630bad","holo:words":"volume.olive.plate","schema:alternateName":"volume.olive.plate","schema:applicationCategory":"ProductivityApplication","schema:description":"A 27B-class 1-bit mind that streams into your browser like a film — serverless, content-addressed, yours offline forever.","schema:identifier":"org.hologram.Bonsai","schema:image":"apps/bonsai/icon.svg","schema:keywords":["ai","llm","1-bit","bonsai","prismml","webgpu","browser-native","serverless","on-device","kappa-disk","content-addressing","did:holo","law-l5"],"schema:name":"Bonsai"}}]
|
sha256/e9ae0098c5ca92a0e6bedf15a794487ed36f54cd33f914d2eee8a0e97ad4c30c
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|