@oracle-agent/oracle 0.9.8 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,11 +4,12 @@
4
4
 
5
5
  ```bash
6
6
  npm i -g @oracle-agent/oracle
7
- oracle # first run sets up its isolated runtime + model
8
- oracle init --apply # lanes + read plane only, no keys
7
+ oracle auth login claude # or codex / grok OAuth
8
+ oracle # native standalone chat
9
+ oracle init --apply # optional Hermes lanes + read plane, no keys
9
10
  oracle data serve # loopback read/prepare plane on 127.0.0.1:8787
10
11
  oracle doctor # verify
11
- # optional, explicit second step signing stays a separate local package:
12
+ # optional, explicit second step: signing stays a separate local package
12
13
  npm i -g @oracle-agent/operator
13
14
  oracle sign init
14
15
  ```
@@ -19,12 +20,11 @@ oracle sign init
19
20
  Specialist agent profiles, real protocol intents, self-custody by default,
20
21
  receipts or it didn't happen.
21
22
 
22
- Built for [Hermes](https://github.com/NousResearch/hermes-agent), the
23
- open-source agent runtime from [Nous Research](https://nousresearch.com).
24
-
25
- Oracle itself makes **no model calls and needs no API key**. On first chat it
26
- installs an isolated local agent runtime and opens its model/provider picker.
27
- An existing compatible runtime is reused when available.
23
+ Hermes is optional. Oracle can run its native chat directly with Claude, Codex,
24
+ or Grok OAuth, a securely stored provider API key, or a custom OpenAI-compatible
25
+ endpoint. Existing compatible Hermes installations are reused in automatic mode.
26
+ OAuth tokens and stored API keys stay in the OS credential store when available,
27
+ with a private `0600` local fallback.
28
28
 
29
29
  This package is **prepare-only**: it never takes a private key and never
30
30
  broadcasts. For agentic trading with **your** keys on **your** machine, install
@@ -35,10 +35,6 @@ alongside it — same split we run ourselves.
35
35
 
36
36
  ## Start in 5 steps
37
37
 
38
- Source tree: **oracle `0.5.0`** · **operator `0.14.0`**
39
-
40
- Published npm: **oracle `0.4.2`** · **operator `0.13.7`** until this source release is published.
41
-
42
38
  ```bash
43
39
  # 1) install Oracle's public prepare plane
44
40
  npm i @oracle-agent/oracle@latest
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oracle-agent/oracle",
3
- "version": "0.9.8",
4
- "description": "Oracle: prepare-only multichain agent control plane. Policy-bounded intents for a user-signed wallet. Self-custody by default — the public package never takes your key. Built for Hermes; no model key required.",
3
+ "version": "0.10.0",
4
+ "description": "Oracle: standalone prepare-only multichain agent control plane with optional Hermes integration. Policy-bounded intents for a user-signed wallet; the public package never takes your key.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "publishConfig": {
@@ -85,6 +85,7 @@
85
85
  "files": [
86
86
  "bin/",
87
87
  "src/",
88
+ "!src/**/__pycache__/**",
88
89
  "profiles/",
89
90
  "skills/",
90
91
  "skins/",
@@ -401,18 +401,6 @@ main{position:relative;z-index:2;padding-top:84px}
401
401
  }
402
402
  .evolve-pill.on{border-color:rgba(124,196,255,.35);color:var(--blue2)}
403
403
 
404
- .venue-rail-head{
405
- font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;
406
- color:var(--cool);text-align:center;padding:14px 16px 0;opacity:.75;
407
- }
408
- .venue-rail-head b{color:var(--blue2);font-weight:600}
409
- .venue-rail{padding:10px 16px 4px;max-height:96px;overflow:hidden;position:relative}
410
- .venue-rail .evolve-pill{font-size:9px;padding:6px 10px;opacity:.9}
411
- .venue-rail::after{
412
- content:"";position:absolute;left:0;right:0;bottom:0;height:34px;pointer-events:none;
413
- background:linear-gradient(to bottom,transparent,var(--bg));
414
- }
415
-
416
404
  .wires{height:40px;position:relative}
417
405
  .wires svg{width:100%;height:100%;display:block;overflow:visible}
418
406
  .wires path{
@@ -510,8 +498,8 @@ main{position:relative;z-index:2;padding-top:84px}
510
498
  .marquee{overflow:hidden;white-space:nowrap;mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent);-webkit-mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent)}
511
499
  .marquee:hover .track{animation-play-state:paused}
512
500
  .marquee + .marquee{border-top:1px solid rgba(124,196,255,.08)}
513
- .track{display:inline-flex;gap:26px;padding:12px 0;animation:scroll 75s linear infinite;will-change:transform;transform:translate3d(0,0,0);backface-visibility:hidden;perspective:1000px}
514
- .marquee.rev .track{animation-direction:reverse;animation-duration:88s}
501
+ .track{display:inline-flex;gap:26px;padding:12px 0;animation:scroll 240s linear infinite;will-change:transform;transform:translate3d(0,0,0);backface-visibility:hidden;perspective:1000px}
502
+ .marquee.rev .track{animation-direction:reverse;animation-duration:255s}
515
503
  a.chip{text-decoration:none;color:inherit}
516
504
  .chip{
517
505
  display:inline-flex;align-items:center;gap:10px;
@@ -528,6 +516,9 @@ a.chip:hover{border-color:rgba(124,196,255,.3);background:rgba(21,32,49,.6);tran
528
516
  .chip img.wm.mono{filter:brightness(0) invert(1)}
529
517
 
530
518
  .chip .wordmark{font-family:var(--proto-font,var(--sans));font-weight:var(--proto-weight,750);font-style:var(--proto-style,normal);text-transform:var(--proto-transform,none);letter-spacing:var(--proto-track,-.025em);line-height:1.2}
519
+ .chip .cap{font-family:var(--mono);font-size:9px;letter-spacing:.12em;text-transform:uppercase;color:var(--mute);padding-left:8px;border-left:1px solid rgba(124,196,255,.14)}
520
+ .chip .cap.t4{color:var(--blue)}
521
+ .chip .cap.t3{color:var(--cool)}
531
522
  .proto-uniswap{--proto-font:"Inter",var(--sans);--proto-color:#ff4dcb;--proto-weight:850}
532
523
  .proto-hyperliquid{--proto-font:var(--display);--proto-style:italic;--proto-color:#50d2c1;--proto-weight:500;--proto-track:.01em}
533
524
  .proto-polymarket{--proto-font:"Manrope",var(--sans);--proto-color:#7aa7ff;--proto-weight:800;--proto-track:-.035em}
@@ -718,7 +709,6 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
718
709
  </div>
719
710
  <div class="hero-lockup" id="hero-title">
720
711
  <h1 class="home-title">OR<em>ACLE</em></h1>
721
- <a class="hero-byline" href="https://x.com/demi_hl" target="_blank" rel="noopener noreferrer">BY DEMI</a>
722
712
  </div>
723
713
  </div>
724
714
  <div class="home-copy">
@@ -1125,7 +1115,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1125
1115
  </div>
1126
1116
  </div>
1127
1117
  <div class="venues rv">
1128
- <div class="venues-head"><span>protocols // venues</span><span><b>routed by name</b> · quotes ranked</span></div>
1118
+ <div class="venues-head"><span>protocols // venues</span><span><b>exact proven rungs</b> · read + quote does not mean live submit</span></div>
1129
1119
  <div class="marquee"><div class="track" id="proto-track-a"></div></div>
1130
1120
  <div class="marquee rev"><div class="track" id="proto-track-b"></div></div>
1131
1121
  </div>
@@ -1195,43 +1185,121 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1195
1185
  }).join("");
1196
1186
 
1197
1187
  var WM = "assets/wordmarks/";
1188
+ var BRAND = "brand/";
1198
1189
  var PROTOS_A = [
1199
- { n: "Hyperliquid", wm: "hyperliquid.svg", u: "https://hyperliquid.xyz" },
1200
- { n: "Outcome", wm: "outcome.svg", u: "https://outcome.xyz" },
1201
- { n: "XYZ", wm: "xyz.svg", u: "https://trade.xyz" },
1202
- { n: "Markets", wm: "markets.svg", tall: 1, u: "https://markets.xyz" },
1203
- { n: "HyENA", wm: "hyena.svg", u: "https://hyena.trade" },
1204
- { n: "Paragon", wm: "paragon.svg", tall: 1, mono: 1, u: "https://paragon.trade" },
1205
- { n: "HyperSwap", wm: "hyperswap.svg", u: "https://hyperswap.exchange" },
1206
- { n: "Uniswap", wm: "uniswap.svg", u: "https://uniswap.org" },
1207
- { n: "Polymarket", wm: "polymarket.png", u: "https://polymarket.com" },
1208
- { n: "Aerodrome", wm: "aerodrome.svg", u: "https://aerodrome.finance" },
1209
- { n: "Velodrome", wm: "velodrome.svg", u: "https://velodrome.finance" },
1210
- { n: "PancakeSwap", wm: "pancakeswap.svg", u: "https://pancakeswap.finance" },
1211
- { n: "QuickSwap", wm: "quickswap.png", u: "https://quickswap.exchange" },
1212
- { n: "LFJ", wm: "lfj.webp", tall: 1, u: "https://lfj.gg" },
1213
- { n: "Curve", wm: "curve.png", tall: 1, u: "https://curve.finance" },
1214
- { n: "Balancer", wm: "balancer.svg", u: "https://balancer.fi" },
1215
- { n: "Pendle", wm: "pendle.png", u: "https://pendle.finance" }
1216
- ];
1217
- var PROTOS_B = [
1218
- { n: "Morpho", wm: "morpho.svg", u: "https://morpho.org" },
1219
- { n: "GMX", wm: "gmx.svg", u: "https://gmx.io" },
1220
- { n: "LI.FI", wm: "lifi.png", u: "https://li.fi" },
1221
- { n: "Relay", wm: "relay.svg", u: "https://relay.link" },
1222
- { n: "Velora", wm: "paraswap.svg", u: "https://velora.xyz" },
1223
- { n: "Odos", wm: "odos.svg", u: "https://odos.xyz" },
1224
- { n: "0x", wm: "zerox-icon.webp", tall: 1, u: "https://0x.org" },
1225
- { n: "Hop", wm: "hop-icon.webp", tall: 1, u: "https://hop.exchange" },
1226
- { n: "Satflow", wm: "satflow-icon.png", tall: 1, u: "https://satflow.com" },
1227
- { n: "CoW Swap", wm: "cowswap.svg", u: "https://cow.fi" },
1228
- { n: "1inch", wm: "oneinch.svg", u: "https://1inch.io" },
1229
- { n: "Jupiter", wm: "jupiter.svg", u: "https://jup.ag" },
1230
- { n: "OpenSea", wm: "opensea-icon.svg", tall: 1, u: "https://opensea.io" },
1231
- { n: "Across", wm: "across-icon.webp", tall: 1, u: "https://across.to" },
1232
- { n: "Stargate", wm: "stargate-icon.webp", tall: 1, u: "https://stargate.finance" },
1233
- { n: "Magic Eden", wm: "magic-eden.svg", u: "https://magiceden.io" }
1234
- ];
1190
+ { n: "Uniswap V3", img: "uniswap", cap: "read + quote + prepare + policy", u: "https://app.uniswap.org/" },
1191
+ { n: "Aerodrome Slipstream", img: "aerodrome", cap: "read + quote + prepare", u: "https://aerodrome.finance/" },
1192
+ { n: "Pancake V3", img: "pancakeswap", cap: "read + quote", u: "https://pancakeswap.finance/swap" },
1193
+ { n: "LFJ Liquidity Book", img: "lfj", cap: "read + quote", u: "https://lfj.gg/avalanche/trade" },
1194
+ { n: "Curve RouterNG", img: "curve", cap: "read + quote + prepare + policy", u: "https://curve.finance" },
1195
+ { n: "Pendle Router", img: "pendle", cap: "read + quote + prepare + policy", u: "https://pendle.finance/" },
1196
+ { n: "Morpho vaults", img: "morpho", cap: "read + deposit prepare", u: "https://app.morpho.org/" },
1197
+ { n: "Lido stETH", img: "lido", cap: "read + stake prepare + policy", u: "https://lido.fi/" },
1198
+ { n: "Kinetiq kHYPE", img: "kinetiq", cap: "read + quote + stake prepare + policy", u: "https://kinetiq.xyz/stake" },
1199
+ { n: "Project X", img: "projectx", cap: "read", u: "https://www.prjx.com" },
1200
+ { n: "Uniswap V4", img: "uniswapv4", cap: "read + quote", u: "https://app.uniswap.org/" },
1201
+ { n: "Aborean CL", img: "aborean", cap: "read + quote", u: "https://aborean.finance/" },
1202
+ { n: "Aborean AMM", img: "aborean", cap: "read + quote", u: "https://aborean.finance/" },
1203
+ { n: "Stable Swap V3", img: "stableswap", cap: "read + quote", u: "https://swap.stable.xyz/" },
1204
+ { n: "Stable Swap V2", img: "stableswap", cap: "read + quote", u: "https://swap.stable.xyz/" },
1205
+ { n: "Compound V3", img: "compound", cap: "read + quote", u: "https://www.compound.xyz/" },
1206
+ { n: "Aerodrome V1", img: "aerodrome", cap: "read + quote", u: "https://aerodrome.finance/" },
1207
+ { n: "Ethena sUSDe", img: "ethena", cap: "read + quote", u: "https://app.ethena.fi/" },
1208
+ { n: "Lido wstETH", img: "lido", cap: "read + quote", u: "https://lido.fi/" },
1209
+ { n: "Benqi sAVAX", img: "benqi", cap: "read + quote", u: "https://app.benqi.fi/savax" },
1210
+ { n: "EigenLayer", img: "eigenlayer", cap: "read + quote", u: "https://www.eigencloud.xyz/eigenlayer" },
1211
+ { n: "SSV Network", img: "ssv", cap: "read", u: "https://ssv.network/" },
1212
+ { n: "Fluid Lending", img: "fluid", cap: "read + quote", u: "https://www.fluid.io/" },
1213
+ { n: "Rain", img: "rain", cap: "read + quote", u: "https://www.rain.one/" },
1214
+ { n: "Derive V2", img: "derive", cap: "read", u: "https://app.derive.xyz" },
1215
+ { n: "PancakeSwap AMM", img: "pancakeswap", cap: "read + quote", u: "https://pancakeswap.finance/" },
1216
+ { n: "Lista Lending", img: "lista", cap: "read + quote", u: "https://lista.org/lending" },
1217
+ { n: "Lista CDP", img: "lista", cap: "read", u: "https://lista.org/" },
1218
+ { n: "Benqi Lending", img: "benqi", cap: "read", u: "https://benqi.fi" },
1219
+ { n: "Pharaoh V3", img: "pharaoh", cap: "read + quote", u: "https://www.phar.gg/" },
1220
+ { n: "Polymarket", img: "polymarket", cap: "read", u: "https://polymarket.com/" },
1221
+ { n: "XSY", img: "xsy", cap: "read", u: "https://xsy.fi" },
1222
+ { n: "Balancer V2", img: "balancer", cap: "read + quote", u: "https://balancer.fi/" },
1223
+ { n: "Harmonix", img: "harmonix", cap: "read + quote", u: "https://app.harmonix.fi/" },
1224
+ { n: "Hyperliquid HLP", img: "hyperliquidhpl", cap: "read", u: "https://app.hyperliquid.xyz" },
1225
+ { n: "stHYPE + wstHYPE", img: "sthype", cap: "read + quote", u: "https://app.valantis.xyz" },
1226
+ { n: "Arcus Perps", img: "arcus", cap: "read", u: "https://arcus.xyz/" },
1227
+ { n: "NOXA Fun", img: "noxa", cap: "read + quote", u: "https://fun.noxa.eth.limo/" },
1228
+ { n: "Kona V2", img: "kona", cap: "read + quote", u: "https://kona.surf/" },
1229
+ { n: "Kona Stableswap", img: "kona", cap: "read + quote", u: "https://kona.surf/" },
1230
+ { n: "NOXA DEX V2", img: "noxa", cap: "read", u: "https://fun.noxa.eth.limo/" },
1231
+ { n: "AFI Protocol", img: "afi", cap: "read + quote", u: "https://afiprotocol.xyz/" },
1232
+ { n: "Kelp", img: "kelp", cap: "read + quote", u: "https://kelpdao.xyz/" },
1233
+ { n: "Dolomite", img: "dolomite", cap: "read", u: "https://dolomite.io" },
1234
+ { n: "Camelot V3", img: "camelot", cap: "read + quote", u: "https://camelot.exchange/" },
1235
+ { n: "Beefy", img: "beefy", cap: "read + quote", u: "https://beefy.com" },
1236
+ { n: "BounceBit", img: "bouncebit", cap: "read", u: "https://bouncebit.io/" },
1237
+ { n: "BitFi", img: "bitfi", cap: "read", u: "https://www.bitfi.one/" },
1238
+ { n: "Hypha", img: "hypha", cap: "read + quote", u: "https://www.hypha.sh/" },
1239
+ { n: "40 Acres", img: "fortyacres", cap: "read + quote", u: "https://www.40acres.finance/" },
1240
+ { n: "Hyperbeat", img: "hyperbeat", cap: "read + quote", u: "https://app.hyperbeat.org/" },
1241
+ { n: "GMX V2", img: "gmx", cap: "read + order attestation", u: "https://gmx.io/" },
1242
+ { n: "Relay", img: "relay", cap: "route source", u: "https://relay.link/" },
1243
+ { n: "Odos", img: "odos", cap: "read + route source", u: "https://app.odos.xyz" },
1244
+ { n: "Jupiter", img: "jupiter", cap: "solana route source", u: "https://jup.ag/" },
1245
+ { n: "Stargate", img: "stargate", cap: "read + bridge route", u: "https://stargate.finance/" }
1246
+ ];
1247
+ var PROTOS_B = [
1248
+ { n: "Uniswap V3 LP", img: "uniswap", cap: "preview + mint/collect prepare", u: "https://app.uniswap.org/" },
1249
+ { n: "Velodrome V2", img: "velodrome", cap: "read + quote", u: "https://velodrome.finance/" },
1250
+ { n: "QuickSwap", img: "quickswap", cap: "read + quote", u: "https://quickswap.exchange/" },
1251
+ { n: "HyperSwap V3", img: "hyperswap", cap: "read + quote", u: "https://app.hyperswap.exchange/" },
1252
+ { n: "Balancer V3", img: "balancer", cap: "read + quote + prepare + policy", u: "https://balancer.fi/" },
1253
+ { n: "Aave V3", img: "aave", cap: "read + supply/withdraw prepare + policy", u: "https://aave.com/" },
1254
+ { n: "Morpho Blue", img: "morpho", cap: "read", u: "https://app.morpho.org" },
1255
+ { n: "Concrete", img: "concrete", cap: "read + quote", u: "https://app.concrete.xyz" },
1256
+ { n: "HyperLend", img: "hyperlend", cap: "read + supply/withdraw prepare + policy", u: "https://app.hyperlend.finance/" },
1257
+ { n: "Kinetiq Earn", img: "kinetiq", cap: "read + quote", u: "https://kinetiq.xyz/stake-hype#kinetiq-earn" },
1258
+ { n: "Kona Lend", img: "konalend", cap: "read + supply/withdraw prepare + policy", u: "https://app.kona.surf/lending" },
1259
+ { n: "Uniswap V2", img: "uniswapv2", cap: "read + quote", u: "https://app.uniswap.org/" },
1260
+ { n: "SakuraSwap AMM", img: "sakuraswap", cap: "read + quote", u: "https://sakuraswap.com/" },
1261
+ { n: "SakuraSwap CLMM", img: "sakuraswap", cap: "read + quote", u: "https://sakuraswap.com/" },
1262
+ { n: "Curve DEX", img: "curve", cap: "read + quote", u: "https://curve.finance" },
1263
+ { n: "Aave V2", img: "aavev2", cap: "read + quote", u: "https://aave.com" },
1264
+ { n: "Velodrome Slipstream", img: "velodrome", cap: "read + quote", u: "https://velodrome.finance/" },
1265
+ { n: "Sky sUSDS", img: "sky", cap: "read + quote", u: "https://app.sky.money/" },
1266
+ { n: "ether.fi weETH", img: "etherfi", cap: "read + quote", u: "https://www.ether.fi/" },
1267
+ { n: "SparkLend", img: "spark", cap: "read + supply/withdraw prepare + policy", u: "https://spark.finance/" },
1268
+ { n: "Binance wBETH", img: "wbeth", cap: "read + quote", u: "https://www.binance.com/en/wbeth" },
1269
+ { n: "Spark Savings", img: "sparksavings", cap: "read + quote", u: "https://spark.finance/" },
1270
+ { n: "Fluid DEX", img: "fluid", cap: "read + quote", u: "https://www.fluid.io/" },
1271
+ { n: "ZEROBASE", img: "zerobase", cap: "read", u: "https://app.zerobase.pro/" },
1272
+ { n: "EtherFi Cash", img: "etherfiborrow", cap: "read", u: "https://www.ether.fi/cash" },
1273
+ { n: "Venus", img: "venus", cap: "read + quote", u: "https://app.venus.io/" },
1274
+ { n: "Lista slisBNB", img: "lista", cap: "read + quote", u: "https://lista.org/" },
1275
+ { n: "Solv", img: "solv", cap: "read + quote", u: "https://solv.finance/" },
1276
+ { n: "Avant avUSD", img: "avant", cap: "read + quote", u: "https://app.avantprotocol.com/" },
1277
+ { n: "Yield Yak", img: "yieldyak", cap: "read + quote", u: "https://yieldyak.com/" },
1278
+ { n: "SushiSwap", img: "sushiswap", cap: "read + quote", u: "https://sushi.com/" },
1279
+ { n: "Sphere", img: "sphere", cap: "read", u: "https://sphere.finance/" },
1280
+ { n: "Felix", img: "felix", cap: "read + quote", u: "https://www.usefelix.xyz/" },
1281
+ { n: "Unit", img: "unit", cap: "read", u: "https://hyperunit.xyz/" },
1282
+ { n: "Hyperliquid Spot", img: "hyperliquidspot", cap: "read + quote", u: "https://app.hyperliquid.xyz/" },
1283
+ { n: "Kinetiq kmHYPE", img: "kmhype", cap: "read + quote", u: "https://markets.xyz" },
1284
+ { n: "Lighter Robinhood", img: "lighter", cap: "read", u: "https://robinhoodchain.lighter.xyz/trade/LIT" },
1285
+ { n: "Ekubo", img: "ekubo", cap: "read", u: "https://ekubo.org/" },
1286
+ { n: "Myriad Markets", img: "myriad", cap: "read + quote", u: "https://myriad.markets/markets" },
1287
+ { n: "GASSSS", img: "gassss", cap: "read + quote", u: "https://gassss.xyz" },
1288
+ { n: "Rocket Pool", img: "rocketpool", cap: "read + quote", u: "https://rocketpool.net" },
1289
+ { n: "StakeWise V2", img: "stakewise", cap: "read + quote", u: "https://stakewise.io/" },
1290
+ { n: "Ostium", img: "ostium", cap: "read + quote", u: "https://www.ostium.io/" },
1291
+ { n: "Gains Network", img: "gainsnetwork", cap: "read + quote", u: "https://gains.trade/" },
1292
+ { n: "Aster asBNB", img: "aster", cap: "read + quote", u: "https://www.asterdex.com/en/earn" },
1293
+ { n: "Lorenzo", img: "lorenzo", cap: "read", u: "https://www.lorenzo-protocol.xyz/" },
1294
+ { n: "Trader Joe", img: "joedex", cap: "read + quote", u: "https://lfj.gg/avalanche" },
1295
+ { n: "Folks Finance", img: "folks", cap: "read", u: "https://folks.finance/" },
1296
+ { n: "Velodrome V1", img: "velodrome", cap: "read + quote", u: "https://velodrome.finance/" },
1297
+ { n: "Looped Hype", img: "loopedhype", cap: "read + quote", u: "https://www.loopingcollective.org/" },
1298
+ { n: "LI.FI", img: "lifi", cap: "read + route source", u: "https://li.fi/" },
1299
+ { n: "Velora", img: "velora", cap: "read + route source", u: "https://app.velora.xyz" },
1300
+ { n: "CoW Swap", img: "cow", cap: "read + route source", u: "https://cow.fi/" },
1301
+ { n: "Across", img: "across", cap: "read + bridge route", u: "https://across.to" }
1302
+ ];
1235
1303
 
1236
1304
  // Equalize optical weight: constant target area, clamped, then width-capped.
1237
1305
  function normalizeMark(img) {
@@ -1252,10 +1320,15 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1252
1320
  function chipRow(list) {
1253
1321
  var seq = list.concat(list);
1254
1322
  return seq.map(function (x) {
1255
- var body = x.wm
1256
- ? '<img class="' + (x.tall ? 'wm tall' : 'wm') + (x.mono ? ' mono' : '') + '" src="' + WM + x.wm + '" alt="' + x.n + '" loading="lazy" decoding="async" fetchpriority="low">' +
1257
- (x.tall ? '<span class="wordmark">' + x.n + '</span>' : '')
1258
- : '<span class="wordmark">' + x.n + '</span>';
1323
+ var tier = /policy/.test(x.cap || "") ? " t4" : /prepare/.test(x.cap || "") ? " t3" : "";
1324
+ var body = x.img
1325
+ ? '<img class="wm tall" src="' + BRAND + x.img + '.webp" alt="' + x.n + '" decoding="async">' +
1326
+ '<span class="wordmark">' + x.n + '</span>' +
1327
+ '<span class="cap' + tier + '">' + x.cap + '</span>'
1328
+ : x.wm
1329
+ ? '<img class="' + (x.tall ? 'wm tall' : 'wm') + (x.mono ? ' mono' : '') + '" src="' + WM + x.wm + '" alt="' + x.n + '" decoding="async">' +
1330
+ (x.tall ? '<span class="wordmark">' + x.n + '</span>' : '')
1331
+ : '<span class="wordmark">' + x.n + '</span>';
1259
1332
  return '<a class="chip wm-chip" href="' + x.u + '" target="_blank" rel="noopener noreferrer" aria-label="' + x.n + '">' + body + '</a>';
1260
1333
  }).join("");
1261
1334
  }
@@ -1280,7 +1353,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1280
1353
  ];
1281
1354
  document.getElementById("llm-track").innerHTML = LLMS.concat(LLMS).map(function (x) {
1282
1355
  var cls = x.tall ? "wm tall" : "wm";
1283
- return '<a class="chip wm-chip" href="' + x.u + '" target="_blank" rel="noopener noreferrer" aria-label="' + x.n + '"><img class="' + cls + '" src="' + LM + x.wm + '" alt="' + x.n + '" loading="lazy" decoding="async" fetchpriority="low">' + (x.tall ? '<span class="wordmark">' + x.n + '</span>' : '') + '</a>';
1356
+ return '<a class="chip wm-chip" href="' + x.u + '" target="_blank" rel="noopener noreferrer" aria-label="' + x.n + '"><img class="' + cls + '" src="' + LM + x.wm + '" alt="' + x.n + '" decoding="async">' + (x.tall ? '<span class="wordmark">' + x.n + '</span>' : '') + '</a>';
1284
1357
  }).join("");
1285
1358
 
1286
1359
  wireMarks(document.getElementById("proto-track-a"));