@oracle-agent/oracle 0.6.0 → 0.8.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.
Files changed (43) hide show
  1. package/bin/desk-server.mjs +2 -2
  2. package/bin/oracle-data-mcp.mjs +32 -0
  3. package/package.json +1 -1
  4. package/profiles/oracle/SOUL.md +2 -2
  5. package/public/oracle-splash/assets/llms/claude.svg +1 -1
  6. package/public/oracle-splash/assets/llms/codex-icon.svg +1 -0
  7. package/public/oracle-splash/assets/llms/codex.svg +1 -1
  8. package/public/oracle-splash/assets/llms/cursor-icon.svg +12 -0
  9. package/public/oracle-splash/assets/llms/cursor.svg +1 -1
  10. package/public/oracle-splash/assets/llms/deepseek.svg +1 -1
  11. package/public/oracle-splash/assets/llms/gemini.svg +1 -1
  12. package/public/oracle-splash/assets/llms/kimi-icon.svg +1 -0
  13. package/public/oracle-splash/assets/llms/kimi.svg +1 -1
  14. package/public/oracle-splash/assets/llms/openclaw.svg +1 -1
  15. package/public/oracle-splash/assets/llms/perplexity.svg +1 -1
  16. package/public/oracle-splash/assets/llms/qwen.svg +1 -1
  17. package/public/oracle-splash/assets/wordmarks/across-icon.webp +0 -0
  18. package/public/oracle-splash/assets/wordmarks/cowswap.svg +1 -1
  19. package/public/oracle-splash/assets/wordmarks/curve.png +0 -0
  20. package/public/oracle-splash/assets/wordmarks/gmx.svg +1 -1
  21. package/public/oracle-splash/assets/wordmarks/kinetiq.svg +1 -0
  22. package/public/oracle-splash/assets/wordmarks/lfj.webp +0 -0
  23. package/public/oracle-splash/assets/wordmarks/magic-eden.svg +1 -1
  24. package/public/oracle-splash/assets/wordmarks/markets.svg +1 -0
  25. package/public/oracle-splash/assets/wordmarks/morpho.svg +1 -1
  26. package/public/oracle-splash/assets/wordmarks/odos.svg +1 -1
  27. package/public/oracle-splash/assets/wordmarks/oneinch-icon.webp +0 -0
  28. package/public/oracle-splash/assets/wordmarks/opensea-icon.svg +17 -0
  29. package/public/oracle-splash/assets/wordmarks/opensea.svg +1 -1
  30. package/public/oracle-splash/assets/wordmarks/paragon.svg +9 -0
  31. package/public/oracle-splash/assets/wordmarks/paraswap.svg +1 -1
  32. package/public/oracle-splash/assets/wordmarks/stargate-icon.webp +0 -0
  33. package/public/oracle-splash/index.html +129 -118
  34. package/scripts/check-doc-drift.mjs +1 -0
  35. package/src/data/catalog.mjs +28 -2
  36. package/src/data/desk-data.mjs +6 -0
  37. package/src/data/providers/rfq.mjs +15 -0
  38. package/src/index.mjs +7 -0
  39. package/src/public-api/http.mjs +16 -1
  40. package/src/public-control/runtime-config.mjs +11 -1
  41. package/src/rfq/intent.mjs +180 -0
  42. package/src/rfq/sources.mjs +181 -0
  43. package/protocols/templates/safe-erc20/README.md +0 -9
@@ -18,9 +18,9 @@
18
18
  --blue:#7CC4FF;
19
19
  --blue2:#A7D8FF;
20
20
  --blue-dim:#3a6f99;
21
- --ink:#E8F1FA;
22
- --cool:#B7CCE0;
23
- --mute:#89A3BE;
21
+ --ink:#F4F9FE;
22
+ --cool:#C9DAEC;
23
+ --mute:#9FB8D2;
24
24
  --line:rgba(124,196,255,.14);
25
25
  --line-2:rgba(124,196,255,.24);
26
26
  --evm:#7CC4FF;
@@ -37,10 +37,10 @@
37
37
  --max:1100px;
38
38
  }
39
39
  *{box-sizing:border-box;margin:0;padding:0}
40
- html{scroll-behavior:smooth;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
40
+ html{scroll-behavior:smooth;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}
41
41
  body{
42
42
  min-height:100dvh;background:var(--bg);color:var(--ink);position:relative;isolation:isolate;
43
- font-family:var(--sans);font-weight:350;overflow-x:hidden;
43
+ font-family:var(--sans);font-weight:400;overflow-x:hidden;
44
44
  }
45
45
  ::selection{background:var(--blue);color:#061018}
46
46
  a{color:inherit;text-decoration:none}
@@ -64,7 +64,9 @@ img{display:inline-block}
64
64
  .orbital .core{fill:var(--blue);animation:core-pulse 3.2s var(--ease) infinite}
65
65
  .orbital .halo{fill:none;stroke:rgba(124,196,255,.22);stroke-width:5;filter:blur(3px)}
66
66
  @keyframes orb-spin{to{transform:rotate(360deg)}}
67
- @keyframes core-pulse{0%,100%{opacity:1}50%{opacity:.55}}
67
+ @keyframes core-pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(1.06)}}
68
+ @keyframes core-billboard{from{transform:rotateY(0deg) rotateX(-18deg) rotateZ(8deg)}to{transform:rotateY(-360deg) rotateX(-18deg) rotateZ(8deg)}}
69
+ @keyframes orbit-travel{from{transform:rotateX(76deg) rotateZ(0deg) translateX(clamp(170px,23vw,280px))}to{transform:rotateX(76deg) rotateZ(360deg) translateX(clamp(170px,23vw,280px))}}
68
70
 
69
71
  .loader{
70
72
  position:fixed;inset:0;z-index:50;background:var(--bg);
@@ -117,7 +119,7 @@ img{display:inline-block}
117
119
  .nav-cta:hover{border-color:var(--blue);color:var(--blue2);box-shadow:0 0 0 1px rgba(124,196,255,.12)}
118
120
 
119
121
  /* fixed soft field behind content */
120
- #gl{position:fixed;inset:0;width:100%;height:100%;z-index:-1;display:block;opacity:.75;pointer-events:none}
122
+ #gl{position:fixed;inset:0;width:100%;height:100%;z-index:-1;display:block;opacity:.4;pointer-events:none}
121
123
  .veil{
122
124
  position:fixed;inset:0;z-index:1;pointer-events:none;
123
125
  background:
@@ -147,29 +149,45 @@ main{position:relative;z-index:2;padding-top:84px}
147
149
  .hero-stage{position:relative;width:100%;display:grid;place-items:center;min-height:clamp(360px,52vh,560px)}
148
150
  .hero-art{position:absolute;inset:0;display:grid;place-items:center;z-index:0;pointer-events:none}
149
151
  #orb-vid{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:min(74vw,620px);aspect-ratio:1;object-fit:contain;opacity:0;transition:opacity 1.4s var(--ease);mix-blend-mode:screen}
150
- #orb-vid.ready{opacity:.5}
152
+ #orb-vid.ready{opacity:.62}
151
153
  .blender-orb .hero-orb{display:none}
152
154
  .hero-orb{
153
155
  width:clamp(380px,50vw,640px);aspect-ratio:1;position:relative;transform-style:preserve-3d;
154
156
  animation:orb-slew 22s linear infinite;
155
157
  }
156
- .hero-orb .lat{position:absolute;inset:0;border-radius:50%;border:1.4px solid rgba(124,196,255,.5);transform-style:preserve-3d;box-shadow:0 0 26px rgba(124,196,255,.12)}
157
- .hero-orb .lat.l1{transform:rotateY(0deg)}
158
+ .hero-orb .lat{position:absolute;inset:0;border-radius:50%;border:1.2px solid rgba(124,196,255,.42);transform-style:preserve-3d;box-shadow:0 0 26px rgba(124,196,255,.1), inset 0 0 34px rgba(124,196,255,.07)}
159
+ .hero-orb .lat.l1{transform:rotateY(0deg);border-color:rgba(167,216,255,.62)}
158
160
  .hero-orb .lat.l2{transform:rotateY(45deg)}
159
- .hero-orb .lat.l3{transform:rotateY(90deg)}
161
+ .hero-orb .lat.l3{transform:rotateY(90deg);border-color:rgba(167,216,255,.58)}
160
162
  .hero-orb .lat.l4{transform:rotateY(135deg)}
161
- .hero-orb .par{position:absolute;left:50%;top:50%;border-radius:50%;border:1.2px solid rgba(124,196,255,.38);transform-style:preserve-3d}
163
+ .hero-orb .par{position:absolute;left:50%;top:50%;border-radius:50%;border:1px solid rgba(124,196,255,.3);transform-style:preserve-3d;box-shadow:inset 0 0 24px rgba(124,196,255,.06)}
162
164
  .hero-orb .par.p1{width:96%;height:96%;transform:translate(-50%,-50%) rotateX(90deg)}
163
165
  .hero-orb .par.p2{width:78%;height:78%;transform:translate(-50%,-50%) rotateX(90deg) translateZ(calc(clamp(380px,50vw,640px) * .31))}
164
166
  .hero-orb .par.p3{width:78%;height:78%;transform:translate(-50%,-50%) rotateX(90deg) translateZ(calc(clamp(380px,50vw,640px) * -.31))}
165
- .hero-orb .eq{position:absolute;inset:-4%;border-radius:50%;border:2px solid rgba(167,216,255,.75);transform:rotateX(76deg);box-shadow:0 0 40px rgba(124,196,255,.35)}
167
+ .hero-orb .eq{position:absolute;inset:-4%;border-radius:50%;border:1.8px solid rgba(190,228,255,.82);transform:rotateX(76deg);box-shadow:0 0 44px rgba(124,196,255,.4), inset 0 0 30px rgba(167,216,255,.14)}
166
168
  .hero-orb .core-glow{
167
- position:absolute;inset:33%;border-radius:50%;
168
- background:radial-gradient(circle at 40% 36%, rgba(232,241,250,.9), rgba(124,196,255,.65) 34%, rgba(124,196,255,.12) 68%, transparent);
169
- box-shadow:0 0 46px rgba(124,196,255,.45), 0 0 110px rgba(124,196,255,.18);
169
+ position:absolute;inset:38%;border-radius:50%;
170
+ transform:rotateZ(8deg) rotateX(-18deg);
171
+ animation:core-billboard 22s linear infinite;
172
+ background:
173
+ radial-gradient(circle at 36% 30%, rgba(255,255,255,.95) 0%, rgba(214,238,255,.8) 12%, rgba(140,204,255,.55) 32%, rgba(74,150,214,.34) 56%, rgba(28,74,124,.22) 78%, rgba(14,34,62,.12) 100%);
174
+ box-shadow:
175
+ inset -12px -15px 34px rgba(6,16,32,.5),
176
+ inset 8px 10px 26px rgba(210,238,255,.2),
177
+ 0 0 60px rgba(124,196,255,.5),
178
+ 0 0 140px rgba(124,196,255,.2);
179
+ }
180
+ .hero-orb .core-glow::before{
181
+ content:"";position:absolute;left:22%;top:16%;width:26%;height:20%;border-radius:50%;
182
+ background:radial-gradient(ellipse at 50% 50%, rgba(255,255,255,.9), rgba(255,255,255,.28) 44%, transparent 74%);
183
+ transform:rotate(-24deg);
184
+ }
185
+ .hero-orb .core-glow::after{
186
+ content:"";position:absolute;inset:-6%;border-radius:50%;pointer-events:none;
187
+ background:radial-gradient(circle at 50% 50%, rgba(124,196,255,.3) 0%, rgba(124,196,255,.09) 46%, transparent 68%);
170
188
  animation:core-pulse 3.4s var(--ease) infinite;
171
189
  }
172
- .hero-orb .orbit-dot{position:absolute;width:10px;height:10px;border-radius:50%;background:var(--blue2);box-shadow:0 0 20px rgba(167,216,255,.9);left:calc(50% - 5px);top:calc(50% - 5px);transform:rotateX(76deg) translateX(clamp(170px,23vw,280px));animation:none}
190
+ .hero-orb .orbit-dot{position:absolute;width:9px;height:9px;border-radius:50%;background:radial-gradient(circle at 38% 34%, #fff, var(--blue2) 55%, rgba(124,196,255,.5));box-shadow:0 0 22px rgba(167,216,255,.95), 0 0 44px rgba(124,196,255,.4);left:calc(50% - 4.5px);top:calc(50% - 4.5px);transform-style:preserve-3d;animation:orbit-travel 14s linear infinite}
173
191
  .home-title{
174
192
  position:relative;z-index:2;
175
193
  font-family:var(--display);font-weight:300;font-size:clamp(96px,17vw,230px);line-height:.9;letter-spacing:-.045em;
@@ -195,12 +213,12 @@ main{position:relative;z-index:2;padding-top:84px}
195
213
  .hero-note{font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute)}
196
214
  @keyframes orb-slew{0%{transform:rotateX(18deg) rotateZ(-8deg) rotateY(0deg)}100%{transform:rotateX(18deg) rotateZ(-8deg) rotateY(360deg)}}
197
215
  @keyframes home-breathe{0%,100%{opacity:.65;transform:scale(1)}50%{opacity:1;transform:scale(1.07)}}
198
- @keyframes drop-line{0%,100%{opacity:.25;transform:translateX(-50%) scaleY(.45)}50%{opacity:1;transform:translateX(-50%) scaleY(1)}}}
216
+ @keyframes drop-line{0%,100%{opacity:.25;transform:translateX(-50%) scaleY(.45)}50%{opacity:1;transform:translateX(-50%) scaleY(1)}}
199
217
 
200
218
 
201
219
  .section{
202
220
  position:relative;z-index:2;max-width:var(--max);margin:0 auto;
203
- padding:clamp(28px,5vh,48px) var(--pad) 0;
221
+ padding:clamp(56px,10vh,110px) var(--pad) 0;
204
222
  }
205
223
  .section:first-of-type{padding-top:clamp(18px,3vh,28px)}
206
224
  .section-label{
@@ -213,7 +231,7 @@ main{position:relative;z-index:2;padding-top:84px}
213
231
  max-width:18ch;margin-bottom:12px;
214
232
  }
215
233
  .section-title em{font-style:italic;color:var(--blue2)}
216
- .section-lede{max-width:52ch;color:#B7CCE0;font-size:16px;line-height:1.7;margin-bottom:clamp(28px,4vw,44px)}
234
+ .section-lede{max-width:52ch;color:#C9DAEC;font-size:16px;line-height:1.7;margin-bottom:clamp(28px,4vw,44px)}
217
235
 
218
236
  /* orchestration graph */
219
237
  .graph-shell{
@@ -223,7 +241,7 @@ main{position:relative;z-index:2;padding-top:84px}
223
241
  .graph-top{
224
242
  display:flex;flex-wrap:wrap;justify-content:center;gap:10px;
225
243
  padding:14px 18px;border-bottom:1px solid var(--line);
226
- font-family:var(--mono);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:#88A6C2;
244
+ font-family:var(--mono);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:#9FB8D2;
227
245
  }
228
246
  .graph-top b{color:var(--blue);font-weight:500}
229
247
  .graph-canvas{padding:clamp(28px,4vw,40px) clamp(14px,2.5vw,24px) clamp(22px,3vw,30px);overflow:auto}
@@ -250,9 +268,9 @@ main{position:relative;z-index:2;padding-top:84px}
250
268
  .node{
251
269
  border:1px solid rgba(124,196,255,.42);border-radius:14px;background:rgba(21,32,49,.92);
252
270
  padding:14px 12px;text-align:center;
253
- transition:border-color .3s,transform .3s var(--ease),box-shadow .3s;
271
+ transition:border-color .4s var(--ease),transform .4s var(--ease),box-shadow .4s var(--ease);
254
272
  }
255
- .node:hover{transform:translateY(-2px);box-shadow:0 12px 30px rgba(0,0,0,.28)}
273
+ .node:hover{transform:translate3d(0,-3px,0);box-shadow:0 14px 34px rgba(0,0,0,.32)}
256
274
  .node.hub{
257
275
  width:min(300px,100%);
258
276
  border-color:rgba(124,196,255,.5);
@@ -262,11 +280,11 @@ main{position:relative;z-index:2;padding-top:84px}
262
280
  display:flex;flex-direction:column;align-items:center;
263
281
  }
264
282
  .node.hub .orbital{width:74px;height:74px;margin:2px 0 10px;filter:drop-shadow(0 0 20px rgba(124,196,255,.35))}
265
- .node .tag{font-family:var(--mono);font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:#88A6C2;margin-bottom:8px}
283
+ .node .tag{font-family:var(--mono);font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:#9FB8D2;margin-bottom:8px}
266
284
  .node.hub .tag{color:var(--blue)}
267
285
  .node .name{font-family:var(--display);font-size:22px;font-weight:500;color:#DCEAF6;line-height:1;letter-spacing:.01em;margin-bottom:6px}
268
286
  .node.hub .name{font-size:34px;font-weight:400;font-style:italic}
269
- .node .sub{font-family:var(--mono);font-size:11px;letter-spacing:.05em;color:#AAC4DC;line-height:1.5}
287
+ .node .sub{font-family:var(--mono);font-size:11px;letter-spacing:.05em;color:#C9DAEC;line-height:1.5}
270
288
  .node.route{min-height:138px;display:flex;flex-direction:column;justify-content:flex-start;text-align:left;padding:14px}
271
289
  .node.route .name{font-size:18px;margin-bottom:8px}
272
290
  .node.route .chains{
@@ -362,14 +380,14 @@ main{position:relative;z-index:2;padding-top:84px}
362
380
  margin-top:22px;
363
381
  }
364
382
  .moat-card{
365
- background:var(--bg);padding:clamp(20px,3vw,28px);min-height:140px;
383
+ background:rgba(17,25,37,.94);padding:clamp(20px,3vw,28px);min-height:140px;
366
384
  display:flex;flex-direction:column;gap:10px;
367
385
  transition:background .35s;
368
386
  }
369
387
  .moat-card:hover{background:var(--panel-2)}
370
388
  .moat-card .n{font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--blue)}
371
389
  .moat-card h3{font-family:var(--display);font-weight:400;font-size:clamp(20px,2.2vw,26px)}
372
- .moat-card p{color:#B7CCE0;font-size:15px;line-height:1.55;max-width:44ch}
390
+ .moat-card p{color:#C9DAEC;font-size:15px;line-height:1.55;max-width:44ch}
373
391
  @media (max-width:860px){.moat-grid{grid-template-columns:1fr}}
374
392
  .evolve-rail{
375
393
  display:flex;flex-wrap:wrap;gap:8px;justify-content:center;
@@ -405,7 +423,7 @@ main{position:relative;z-index:2;padding-top:84px}
405
423
  .wires.multi circle.c-sol{fill:var(--sol)}
406
424
 
407
425
  /* route detail cards */
408
- .route-card{
426
+ .route-card{background:rgba(17,25,37,.94);
409
427
  background:var(--bg);padding:22px 20px;min-height:150px;
410
428
  display:flex;flex-direction:column;gap:10px;transition:background .35s;
411
429
  }
@@ -413,7 +431,7 @@ main{position:relative;z-index:2;padding-top:84px}
413
431
  .route-card h3{font-family:var(--display);font-weight:400;font-size:26px;display:flex;align-items:center;gap:10px}
414
432
  .route-card h3 img{width:20px;height:20px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
415
433
  .route-card .where{font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--blue)}
416
- .route-card p{color:#B7CCE0;font-size:15px;line-height:1.55}
434
+ .route-card p{color:#C9DAEC;font-size:15px;line-height:1.55}
417
435
  .route-card .chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:auto}
418
436
  .route-card.p-add{grid-column:1/-1;align-items:center;text-align:center;justify-content:center;gap:14px;padding:30px 22px}
419
437
  .route-card.p-add .chips{justify-content:center;margin-top:4px}
@@ -441,9 +459,9 @@ main{position:relative;z-index:2;padding-top:84px}
441
459
  .chain-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
442
460
  .hl-surface{margin-top:34px;border:1px solid var(--line);border-radius:14px;padding:20px;background:rgba(124,196,255,.02)}
443
461
  .hl-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:16px}
444
- .hl-grid article{border:1px solid var(--line);border-radius:10px;padding:14px 15px;background:rgba(255,255,255,.012)}
462
+ .hl-grid article{border:1px solid rgba(124,196,255,.22);border-radius:10px;padding:16px 17px;background:rgba(17,25,37,.92)}
445
463
  .hl-grid h3{font-family:var(--display);font-size:15px;font-weight:500;color:var(--ink);margin:0 0 6px}
446
- .hl-grid p{font-size:14px;line-height:1.6;color:#B7CCE0;margin:0}
464
+ .hl-grid p{font-size:14px;line-height:1.6;color:#C9DAEC;margin:0}
447
465
  .hl-note{margin:16px 0 0;font-family:var(--mono);font-size:10.5px;letter-spacing:.04em;color:var(--cool);opacity:.62}
448
466
  .hip3{margin-top:20px;padding-top:18px;border-top:1px solid var(--line)}
449
467
  .hl-note code{font-family:var(--mono);color:var(--blue2);opacity:.9}
@@ -451,11 +469,11 @@ main{position:relative;z-index:2;padding-top:84px}
451
469
  @media(max-width:620px){.hl-grid{grid-template-columns:1fr}}
452
470
  .chain{
453
471
  border:1px solid var(--line);border-radius:14px;padding:16px;
454
- background:linear-gradient(180deg, rgba(124,196,255,.035), transparent 55%), var(--panel);
472
+ background:linear-gradient(180deg, rgba(124,196,255,.06), transparent 55%), rgba(17,25,37,.94);
455
473
  min-height:100px;display:flex;flex-direction:column;justify-content:space-between;gap:12px;
456
- transition:border-color .3s,transform .3s var(--ease);
474
+ transition:border-color .4s var(--ease),transform .4s var(--ease),box-shadow .4s var(--ease);
457
475
  }
458
- .chain:hover{border-color:rgba(124,196,255,.35);transform:translateY(-2px)}
476
+ .chain:hover{border-color:rgba(124,196,255,.45);transform:translate3d(0,-3px,0)}
459
477
  .chain-top{display:flex;justify-content:space-between;gap:8px;align-items:flex-start}
460
478
  .chain .nm{font-family:var(--display);font-size:20px;display:flex;align-items:center;gap:8px}
461
479
  .chain .nm img{width:18px;height:18px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
@@ -468,26 +486,31 @@ main{position:relative;z-index:2;padding-top:84px}
468
486
  .badge.live{border-color:rgba(124,196,255,.35);color:var(--blue)}
469
487
 
470
488
  .venues{margin-top:14px;border:1px solid var(--line);border-radius:14px;overflow:hidden;background:rgba(17,25,37,.85)}
489
+ .venues{background:rgba(17,25,37,.86);border:1px solid rgba(124,196,255,.16);border-radius:16px;overflow:hidden;margin-bottom:14px}
471
490
  .venues-head{
472
491
  padding:11px 14px;border-bottom:1px solid var(--line);
473
492
  font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--mute);
474
493
  display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;
475
494
  }
476
495
  .venues-head b{color:var(--blue);font-weight:500}
477
- .marquee{overflow:hidden;white-space:nowrap;mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent)}
496
+ .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)}
497
+ .marquee:hover .track{animation-play-state:paused}
478
498
  .marquee + .marquee{border-top:1px solid rgba(124,196,255,.08)}
479
- .track{display:inline-flex;gap:26px;padding:12px 0;animation:scroll 48s linear infinite;will-change:transform}
480
- .marquee.rev .track{animation-direction:reverse;animation-duration:56s}
499
+ .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}
500
+ .marquee.rev .track{animation-direction:reverse;animation-duration:88s}
501
+ a.chip{text-decoration:none;color:inherit}
481
502
  .chip{
482
503
  display:inline-flex;align-items:center;gap:10px;
483
504
  font-size:15px;letter-spacing:-.015em;text-transform:none;color:var(--proto-color,var(--cool));
484
505
  padding:8px 13px;border:1px solid rgba(124,196,255,.1);border-radius:999px;background:rgba(11,16,24,.38);
485
506
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.025);
507
+ transition:border-color .35s var(--ease),background .35s var(--ease),transform .35s var(--ease);
486
508
  }
509
+ a.chip:hover{border-color:rgba(124,196,255,.3);background:rgba(21,32,49,.6);transform:translate3d(0,-2px,0)}
487
510
  .chip img{width:18px;height:18px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
488
- .chip.wm-chip{padding:10px 16px}
489
- .chip img.wm{width:auto;height:20px;max-width:150px;border-radius:0;object-fit:contain;background:none;opacity:.92}
490
- .chip img.wm.tall{height:22px;max-width:26px}
511
+ .chip.wm-chip{padding:11px 18px}
512
+ .chip img.wm{width:auto;height:27px;max-width:190px;border-radius:0;object-fit:contain;background:none;opacity:1}
513
+ .chip img.wm.tall{height:28px;max-width:32px}
491
514
 
492
515
  .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}
493
516
  .proto-uniswap{--proto-font:"Inter",var(--sans);--proto-color:#ff4dcb;--proto-weight:850}
@@ -513,7 +536,7 @@ main{position:relative;z-index:2;padding-top:84px}
513
536
  .proto-across{--proto-font:"Manrope",var(--sans);--proto-color:#ff6b9b;--proto-weight:800}
514
537
  .proto-stargate{--proto-font:"Sora",var(--sans);--proto-color:#9ddcff;--proto-weight:700}
515
538
  .proto-magic-eden{--proto-font:"Archivo Black",var(--sans);--proto-color:#dfc7ff;--proto-weight:800;--proto-track:.01em}
516
- @keyframes scroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}
539
+ @keyframes scroll{from{transform:translate3d(0,0,0)}to{transform:translate3d(-50%,0,0)}}
517
540
 
518
541
  .wallet-grid{
519
542
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
@@ -521,7 +544,7 @@ main{position:relative;z-index:2;padding-top:84px}
521
544
  margin-top:8px;
522
545
  }
523
546
  .wallet-card{
524
- background:var(--bg);padding:clamp(22px,3vw,30px);
547
+ background:rgba(17,25,37,.94);padding:clamp(22px,3vw,30px);
525
548
  display:flex;flex-direction:column;gap:12px;min-height:170px;
526
549
  transition:background .35s;
527
550
  }
@@ -559,8 +582,8 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
559
582
  font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);
560
583
  }
561
584
 
562
- .js .rv{opacity:0;transform:translateY(18px)}
563
- .js .rv.in{opacity:1;transform:none;transition:opacity .9s var(--ease),transform .9s var(--ease)}
585
+ .js .rv{opacity:0;transform:translate3d(0,22px,0);will-change:opacity,transform}
586
+ .js .rv.in{opacity:1;transform:translate3d(0,0,0);transition:opacity 1.05s var(--ease),transform 1.05s var(--ease)}
564
587
  .js .rv.done{transform:none;will-change:auto}
565
588
 
566
589
  @media (max-width:960px){
@@ -634,7 +657,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
634
657
  <div class="home-inner">
635
658
  <div class="hero-stage">
636
659
  <div class="hero-art" aria-hidden="true">
637
- <video id="orb-vid" autoplay muted loop playsinline preload="metadata" poster="assets/hero/orb.avif">
660
+ <video id="orb-vid" muted loop playsinline preload="none" hidden>
638
661
  <source src="assets/hero/orb.webm" type="video/webm">
639
662
  </video>
640
663
  <div class="hero-orb" id="hero-orb">
@@ -742,7 +765,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
742
765
  <div class="tag">profile</div>
743
766
  <div class="name">robinhood agent</div>
744
767
  <div class="sub">markets · nfts · names</div>
745
- <div class="chains"><span class="ch">Robinhood Chain 4663 <img src="https://icons.llamao.fi/icons/chains/rsz_robinhood?w=24&h=24" alt="" loading="lazy"></span></div>
768
+ <div class="chains"><span class="ch">Robinhood Chain <img src="https://icons.llamao.fi/icons/chains/rsz_robinhood?w=24&h=24" alt="" loading="lazy"></span></div>
746
769
  </div>
747
770
  <div class="node route p-sol">
748
771
  <div class="tag">profile</div>
@@ -825,11 +848,11 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
825
848
  <article class="route-card p-rh">
826
849
  <div class="where">robinhood agent →</div>
827
850
  <h3>Robinhood <img src="https://icons.llamao.fi/icons/chains/rsz_robinhood?w=40&h=40" alt="Robinhood Chain" loading="lazy"></h3>
828
- <p>RH Chain markets, NFTs, names, token scans, and chain-local routing on 4663.</p>
851
+ <p>RH Chain markets, NFTs, names, token scans, and chain-local routing.</p>
829
852
  <div class="chips">
830
853
  <span class="chip-s">markets</span>
831
854
  <span class="chip-s">NFTs</span>
832
- <span class="chip-s">4663</span>
855
+ <span class="chip-s">rh chain</span>
833
856
  </div>
834
857
  </article>
835
858
  <article class="route-card p-sol">
@@ -875,10 +898,10 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
875
898
  <article class="route-card p-stable">
876
899
  <div class="where">stable agent →</div>
877
900
  <h3>Stable <img src="https://icons.llamao.fi/icons/chains/rsz_stable?w=40&h=40" alt="Stable" loading="lazy"></h3>
878
- <p>Stable mainnet launch radar and venue ops on chain 988, scanned straight from the chain's own logs.</p>
901
+ <p>Stable mainnet launch radar and venue ops, scanned straight from the chain's own logs.</p>
879
902
  <div class="chips">
880
903
  <span class="chip-s">launches</span>
881
- <span class="chip-s">Stable 988</span>
904
+ <span class="chip-s">Stable</span>
882
905
  </div>
883
906
  </article>
884
907
  <article class="route-card p-build">
@@ -980,17 +1003,17 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
980
1003
  <article><h3>Staking</h3><p>Validator summaries, delegations, rewards and history. Stake deposit, withdraw and delegate prepare with a 7-day unstaking queue.</p></article>
981
1004
  <article><h3>Outcome markets</h3><p>HIP-4 outcome listing plus order and cancel prepare.</p></article>
982
1005
  <article><h3>Account state</h3><p>Clearinghouse state, open orders, user fills, positions.</p></article>
983
- <article><h3>HyperEVM 999</h3><p>Token search and metadata on chain 999, routed with the EVM lane.</p></article>
1006
+ <article><h3>HyperEVM</h3><p>Token search and metadata on Hyperliquid, routed with the EVM lane.</p></article>
984
1007
  </div>
985
1008
  </div>
986
1009
  <div class="venues rv">
987
1010
  <div class="venues-head"><span>protocols // venues</span><span><b>routed by name</b> · quotes ranked · prepare-only</span></div>
988
- <div class="marquee" aria-hidden="true"><div class="track" id="proto-track-a"></div></div>
989
- <div class="marquee rev" aria-hidden="true"><div class="track" id="proto-track-b"></div></div>
1011
+ <div class="marquee"><div class="track" id="proto-track-a"></div></div>
1012
+ <div class="marquee rev"><div class="track" id="proto-track-b"></div></div>
990
1013
  </div>
991
1014
  <div class="venues rv">
992
1015
  <div class="venues-head"><span>models // harnesses</span><span><b>bring your own model</b> · oracle is the control plane</span></div>
993
- <div class="marquee" aria-hidden="true"><div class="track" id="llm-track"></div></div>
1016
+ <div class="marquee"><div class="track" id="llm-track"></div></div>
994
1017
  </div>
995
1018
  </section>
996
1019
 
@@ -1022,7 +1045,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1022
1045
  </div>
1023
1046
  <div class="foot-meta">
1024
1047
  <span>oracle · <a class="labs-link" href="https://demi.la">locals only labs</a></span>
1025
- <span>you sign // no house custody</span>
1048
+ <span>self custodial // the future is agentic</span>
1026
1049
  </div>
1027
1050
  </footer>
1028
1051
 
@@ -1051,53 +1074,53 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1051
1074
  var cls = c.badge === "live" ? "badge live" : "badge";
1052
1075
  var label = c.badge === "live" ? "live" : "read";
1053
1076
  return '<article class="chain rv"><div class="chain-top"><div class="nm">' + c.name +
1054
- ' <img src="' + ICON + c.logo + '?w=36&h=36" alt="' + c.name + ' logo" loading="lazy"></div><div class="id">' + c.id +
1055
- '</div></div><div class="meta"><span>' + c.note + '</span><span class="' + cls + '">' + label + '</span></div></article>';
1077
+ ' <img src="' + ICON + c.logo + '?w=36&h=36" alt="' + c.name + ' logo" loading="lazy"></div></div><div class="meta"><span>' + c.note + '</span><span class="' + cls + '">' + label + '</span></div></article>';
1056
1078
  }).join("");
1057
1079
 
1058
1080
  var WM = "assets/wordmarks/";
1059
1081
  var PROTOS_A = [
1060
- { n: "Hyperliquid", wm: "hyperliquid.svg" },
1061
- { n: "Outcome", wm: "outcome.svg" },
1062
- { n: "XYZ", wm: "xyz.svg" },
1063
- { n: "Markets By Kinetiq", txt: 1 },
1064
- { n: "HyENA", wm: "hyena.svg" },
1065
- { n: "Paragon", txt: 1 },
1066
- { n: "HyperSwap", wm: "hyperswap.svg" },
1067
- { n: "Uniswap", wm: "uniswap.svg" },
1068
- { n: "Polymarket", wm: "polymarket.png" },
1069
- { n: "Aerodrome", wm: "aerodrome.svg" },
1070
- { n: "Velodrome", wm: "velodrome.svg" },
1071
- { n: "PancakeSwap", wm: "pancakeswap.svg" },
1072
- { n: "QuickSwap", wm: "quickswap.png" },
1073
- { n: "LFJ", txt: 1 },
1074
- { n: "Curve", txt: 1 },
1075
- { n: "Balancer", wm: "balancer.svg" },
1076
- { n: "Pendle", wm: "pendle.png" }
1082
+ { n: "Hyperliquid", wm: "hyperliquid.svg", u: "https://hyperliquid.xyz" },
1083
+ { n: "Outcome", wm: "outcome.svg", u: "https://outcome.xyz" },
1084
+ { n: "XYZ", wm: "xyz.svg", u: "https://trade.xyz" },
1085
+ { n: "Markets", wm: "markets.svg", tall: 1, u: "https://markets.xyz" },
1086
+ { n: "HyENA", wm: "hyena.svg", u: "https://hyena.trade" },
1087
+ { n: "Paragon", wm: "paragon.svg", tall: 1, u: "https://paragon.trade" },
1088
+ { n: "HyperSwap", wm: "hyperswap.svg", u: "https://hyperswap.exchange" },
1089
+ { n: "Uniswap", wm: "uniswap.svg", u: "https://uniswap.org" },
1090
+ { n: "Polymarket", wm: "polymarket.png", u: "https://polymarket.com" },
1091
+ { n: "Aerodrome", wm: "aerodrome.svg", u: "https://aerodrome.finance" },
1092
+ { n: "Velodrome", wm: "velodrome.svg", u: "https://velodrome.finance" },
1093
+ { n: "PancakeSwap", wm: "pancakeswap.svg", u: "https://pancakeswap.finance" },
1094
+ { n: "QuickSwap", wm: "quickswap.png", u: "https://quickswap.exchange" },
1095
+ { n: "LFJ", wm: "lfj.webp", tall: 1, u: "https://lfj.gg" },
1096
+ { n: "Curve", wm: "curve.png", tall: 1, u: "https://curve.finance" },
1097
+ { n: "Balancer", wm: "balancer.svg", u: "https://balancer.fi" },
1098
+ { n: "Pendle", wm: "pendle.png", u: "https://pendle.finance" }
1077
1099
  ];
1078
1100
  var PROTOS_B = [
1079
- { n: "Morpho", wm: "morpho.svg" },
1080
- { n: "GMX", wm: "gmx.svg" },
1081
- { n: "LI.FI", wm: "lifi.png" },
1082
- { n: "Relay", wm: "relay.svg" },
1083
- { n: "Velora", wm: "paraswap.svg" },
1084
- { n: "Odos", wm: "odos.svg" },
1085
- { n: "CoW Swap", wm: "cowswap.svg" },
1086
- { n: "1inch", wm: "oneinch.svg" },
1087
- { n: "Jupiter", wm: "jupiter.svg" },
1088
- { n: "OpenSea", wm: "opensea.svg" },
1089
- { n: "Across", wm: "across.svg" },
1090
- { n: "Stargate", wm: "stargate.svg" },
1091
- { n: "Magic Eden", wm: "magic-eden.svg" }
1101
+ { n: "Morpho", wm: "morpho.svg", u: "https://morpho.org" },
1102
+ { n: "GMX", wm: "gmx.svg", u: "https://gmx.io" },
1103
+ { n: "LI.FI", wm: "lifi.png", u: "https://li.fi" },
1104
+ { n: "Relay", wm: "relay.svg", u: "https://relay.link" },
1105
+ { n: "Velora", wm: "paraswap.svg", u: "https://velora.xyz" },
1106
+ { n: "Odos", wm: "odos.svg", u: "https://odos.xyz" },
1107
+ { n: "CoW Swap", wm: "cowswap.svg", u: "https://cow.fi" },
1108
+ { n: "1inch", wm: "oneinch-icon.webp", tall: 1, u: "https://1inch.io" },
1109
+ { n: "Jupiter", wm: "jupiter.svg", u: "https://jup.ag" },
1110
+ { n: "OpenSea", wm: "opensea-icon.svg", tall: 1, u: "https://opensea.io" },
1111
+ { n: "Across", wm: "across-icon.webp", tall: 1, u: "https://across.to" },
1112
+ { n: "Stargate", wm: "stargate-icon.webp", tall: 1, u: "https://stargate.finance" },
1113
+ { n: "Magic Eden", wm: "magic-eden.svg", u: "https://magiceden.io" }
1092
1114
  ];
1093
1115
 
1094
1116
  function chipRow(list) {
1095
1117
  var seq = list.concat(list);
1096
1118
  return seq.map(function (x) {
1097
- if (x.wm) {
1098
- return '<span class="chip wm-chip"><img class="wm" src="' + WM + x.wm + '" alt="' + x.n + '" decoding="async"></span>';
1099
- }
1100
- return '<span class="chip wm-chip"><span class="wordmark">' + x.n + '</span></span>';
1119
+ var body = x.wm
1120
+ ? '<img class="' + (x.tall ? 'wm tall' : 'wm') + '" src="' + WM + x.wm + '" alt="' + x.n + '" decoding="async">' +
1121
+ (x.tall ? '<span class="wordmark">' + x.n + '</span>' : '')
1122
+ : '<span class="wordmark">' + x.n + '</span>';
1123
+ return '<a class="chip wm-chip" href="' + x.u + '" target="_blank" rel="noopener noreferrer" aria-label="' + x.n + '">' + body + '</a>';
1101
1124
  }).join("");
1102
1125
  }
1103
1126
  document.getElementById("proto-track-a").innerHTML = chipRow(PROTOS_A);
@@ -1105,23 +1128,23 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1105
1128
 
1106
1129
  var LM = "assets/llms/";
1107
1130
  var LLMS = [
1108
- { n: "Hermes Agent", wm: "hermes.png", tall: 1 },
1109
- { n: "Claude", wm: "claude.svg" },
1110
- { n: "Grok", wm: "grok.svg" },
1111
- { n: "Codex", wm: "codex.svg" },
1112
- { n: "Gemini", wm: "gemini.svg" },
1113
- { n: "OpenClaw", wm: "openclaw.svg", tall: 1 },
1114
- { n: "Perplexity", wm: "perplexity.svg" },
1115
- { n: "Manus", wm: "manus.svg" },
1116
- { n: "Cursor", wm: "cursor.svg" },
1117
- { n: "Windsurf", wm: "windsurf.svg" },
1118
- { n: "DeepSeek", wm: "deepseek.svg" },
1119
- { n: "Qwen", wm: "qwen.svg", tall: 1 },
1120
- { n: "Kimi", wm: "kimi.svg" }
1131
+ { n: "Hermes Agent", wm: "hermes.png", tall: 1, u: "https://hermes.nousresearch.com" },
1132
+ { n: "Claude", wm: "claude.svg", u: "https://claude.ai" },
1133
+ { n: "Grok", wm: "grok.svg", u: "https://grok.com" },
1134
+ { n: "Codex", wm: "codex-icon.svg", tall: 1, u: "https://openai.com/codex" },
1135
+ { n: "Gemini", wm: "gemini.svg", u: "https://gemini.google.com" },
1136
+ { n: "OpenClaw", wm: "openclaw.svg", tall: 1, u: "https://openclaw.ai" },
1137
+ { n: "Perplexity", wm: "perplexity.svg", u: "https://perplexity.ai" },
1138
+ { n: "Manus", wm: "manus.svg", u: "https://manus.im" },
1139
+ { n: "Cursor", wm: "cursor-icon.svg", tall: 1, u: "https://cursor.com" },
1140
+ { n: "Windsurf", wm: "windsurf.svg", u: "https://windsurf.com" },
1141
+ { n: "DeepSeek", wm: "deepseek.svg", u: "https://deepseek.com" },
1142
+ { n: "Qwen", wm: "qwen.svg", tall: 1, u: "https://chat.qwen.ai" },
1143
+ { n: "Kimi", wm: "kimi-icon.svg", tall: 1, u: "https://kimi.com" }
1121
1144
  ];
1122
1145
  document.getElementById("llm-track").innerHTML = LLMS.concat(LLMS).map(function (x) {
1123
1146
  var cls = x.tall ? "wm tall" : "wm";
1124
- return '<span class="chip wm-chip"><img class="' + cls + '" src="' + LM + x.wm + '" alt="' + x.n + '" decoding="async">' + (x.tall ? '<span class="wordmark">' + x.n + '</span>' : '') + '</span>';
1147
+ 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>';
1125
1148
  }).join("");
1126
1149
 
1127
1150
  var loader = document.getElementById("loader");
@@ -1171,19 +1194,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1171
1194
  }, { passive: true });
1172
1195
  }
1173
1196
 
1174
- (function () {
1175
- var v = document.getElementById("orb-vid");
1176
- if (!v) return;
1177
- var art = document.querySelector(".hero-art");
1178
- function ready() { art.classList.add("blender-orb"); v.classList.add("ready"); }
1179
- if (v.readyState >= 2) ready();
1180
- v.addEventListener("loadeddata", ready, { once: true });
1181
- if (reduced) { v.removeAttribute("autoplay"); v.pause(); ready(); return; }
1182
- document.addEventListener("visibilitychange", function () {
1183
- if (document.visibilityState === "visible") { var q = v.play(); if (q && q.catch) q.catch(function () {}); }
1184
- else v.pause();
1185
- });
1186
- })();
1197
+ // Hero is the original CSS orb.
1187
1198
 
1188
1199
  var nodes = Array.prototype.slice.call(document.querySelectorAll(".rv, .wires"));
1189
1200
  if (reduced || !("IntersectionObserver" in window)) {
@@ -39,6 +39,7 @@ const STALE_CLAIMS = [
39
39
  { re: /ORACLE_SIGNER_SURFACES=hl,poly\s*$/i, why: "quickstart freezes ORACLE_SIGNER_SURFACES at hl,poly" },
40
40
  { re: /ORACLE_AUTONOMOUS_TRADING=1.*(?:or\s+run\s+the\s+signer\s+daemon|same(?:-tier)?).*oracle-signer/i, why: "frames direct exec and oracle-signer as equivalent agent paths" },
41
41
  { re: /(?:or\s+run\s+the\s+signer\s+daemon|same(?:-tier)?).*oracle-signer.*ORACLE_AUTONOMOUS_TRADING=1/i, why: "frames direct exec and oracle-signer as equivalent agent paths" },
42
+ { re: /ORACLE_AUTONOMOUS=1/i, why: "names the dead autonomous env var instead of ORACLE_AUTONOMOUS_TRADING" },
42
43
  ];
43
44
 
44
45
  // Version pins that go stale the moment a release ships. The audit found the
@@ -3,19 +3,26 @@
3
3
  /** @typedef {{ id: string, venue: string, chainIds: number[], auth: 'none'|'apiKey'|'agentKey', ops: string[], baseEnv?: string[], description?: string }} ProviderMeta */
4
4
 
5
5
  const REGISTRY = new Map();
6
+ const BUILTIN_PROVIDER_IDS = new Set();
7
+ let BUILTINS_LOCKED = false;
6
8
 
7
9
  export function registerProvider(meta) {
8
10
  if (!meta?.id) throw new Error("registerProvider requires id");
9
11
  if (!meta.venue) throw new Error("registerProvider requires venue");
10
12
  if (!Array.isArray(meta.ops)) throw new Error("registerProvider requires ops[]");
11
- REGISTRY.set(meta.id, {
13
+ const id = String(meta.id);
14
+ if (BUILTINS_LOCKED && BUILTIN_PROVIDER_IDS.has(id)) {
15
+ throw new Error(`registerProvider refuses to overwrite built-in provider: ${id}`);
16
+ }
17
+ REGISTRY.set(id, {
12
18
  chainIds: meta.chainIds || [],
13
19
  auth: meta.auth || "none",
14
20
  description: meta.description || "",
15
21
  baseEnv: meta.baseEnv || [],
16
22
  ...meta,
23
+ id,
17
24
  });
18
- return REGISTRY.get(meta.id);
25
+ return REGISTRY.get(id);
19
26
  }
20
27
 
21
28
  export function getProvider(id) {
@@ -33,6 +40,12 @@ export function clearProvidersForTest() {
33
40
  REGISTRY.clear();
34
41
  }
35
42
 
43
+ function lockBuiltinProviders() {
44
+ BUILTIN_PROVIDER_IDS.clear();
45
+ for (const id of REGISTRY.keys()) BUILTIN_PROVIDER_IDS.add(id);
46
+ BUILTINS_LOCKED = true;
47
+ }
48
+
36
49
  // ── Built-in providers ──────────────────────────────────────────────────────
37
50
 
38
51
  registerProvider({
@@ -526,3 +539,16 @@ registerProvider({
526
539
  baseEnv: ["PARASWAP_API_URL"],
527
540
  description: "ParaSwap/Velora public price routes + validated transaction builder",
528
541
  });
542
+
543
+ registerProvider({
544
+ id: "rfq",
545
+ venue: "intent-rfq",
546
+ chainIds: [1, 10, 56, 137, 8453, 42161, 43114],
547
+ auth: "none",
548
+ ops: ["health", "intent", "quote"],
549
+ execution: "prepare",
550
+ baseEnv: ["ZEROX_API_KEY", "ONEINCH_API_KEY"],
551
+ description: "Cross-chain RFQ intent normalizer and firm-quote fanout over reviewed venues. Prepares artifacts only, never signs or broadcasts.",
552
+ });
553
+
554
+ lockBuiltinProviders();
@@ -44,6 +44,7 @@ import * as portfolio from "./providers/portfolio.mjs";
44
44
  import * as portfolioHistory from "./providers/portfolio-history.mjs";
45
45
  import * as nftPortfolio from "./providers/nft-portfolio.mjs";
46
46
  import * as paraswap from "./providers/paraswap.mjs";
47
+ import * as rfq from "./providers/rfq.mjs";
47
48
 
48
49
  const OPS = {
49
50
  "hl-info": {
@@ -356,6 +357,11 @@ const OPS = {
356
357
  quote: (o, a = {}) => paraswap.paraswapPrice(a, o),
357
358
  prepare: (o, a = {}) => paraswap.paraswapPrepare(a, o),
358
359
  },
360
+ rfq: {
361
+ health: (o) => rfq.rfqHealth(o),
362
+ intent: (o, a = {}) => rfq.rfqIntent(a, o),
363
+ quote: (o, a = {}) => rfq.rfqQuote(a, o),
364
+ },
359
365
  };
360
366
 
361
367
  /**
@@ -0,0 +1,15 @@
1
+ import { normalizeRfqIntent } from "../../rfq/intent.mjs";
2
+ import { requestRfqQuotes } from "../../rfq/sources.mjs";
3
+
4
+ export function rfqIntent(args = {}, opts = {}) {
5
+ return normalizeRfqIntent(args, opts);
6
+ }
7
+
8
+ export async function rfqQuote(args = {}, opts = {}) {
9
+ const intent = args.intent?.kind === "rfq-intent" ? args.intent : normalizeRfqIntent(args, opts);
10
+ return requestRfqQuotes(intent, opts);
11
+ }
12
+
13
+ export async function rfqHealth() {
14
+ return { ok: true, provider: "rfq", mode: "intent-rfq", execution: "prepare" };
15
+ }
package/src/index.mjs CHANGED
@@ -38,6 +38,13 @@ export {
38
38
  } from "./scanner/index.mjs";
39
39
 
40
40
  export { bestSwapRoute, bestBridgeRoute, QUALITY } from "./router/index.mjs";
41
+ export {
42
+ normalizeRfqIntent,
43
+ normalizeFirmQuote,
44
+ hashRfqIntent,
45
+ hashFirmQuote,
46
+ } from "./rfq/intent.mjs";
47
+ export { sourceCandidates, executeRfqCandidates, rankRfqQuotes, requestRfqQuotes } from "./rfq/sources.mjs";
41
48
  export { validateNftMintGasWar, assertNftMintGasWar, NftGasWarLimitError } from "./nft-gas-war-guard.mjs";
42
49
  export { simulateSell, assertSellable, SELL_SIM } from "./sell-simulation.mjs";
43
50
  export { capabilityStatus, assertCapability, autonomousTradingEnabled, posture } from "./capability-posture.mjs";