@orchyn/mcp 1.17.6 → 1.17.8

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.
@@ -11,7 +11,7 @@ import { OrchynError } from "./orchyn.js";
11
11
  import { formatPaywallError, runVideoAnalysis, validatePostUrl } from "./video.js";
12
12
  import { ORCHYN_UI_TEMPLATE } from "./ui-template.js";
13
13
  /** Current MCP server version — bumped on every deploy for traceability. */
14
- export const MCP_SERVER_VERSION = "1.17.6";
14
+ export const MCP_SERVER_VERSION = "1.17.7";
15
15
  /** MCP Apps extension identifier */
16
16
  const UI_EXTENSION = "io.modelcontextprotocol/ui";
17
17
  /** MIME type for MCP Apps HTML resources */
@@ -49,15 +49,29 @@ body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--
49
49
  .stagger>*:nth-child(8){animation-delay:.4s}
50
50
 
51
51
  /* ─── Cards ─── */
52
- .gallery{display:flex;flex-wrap:wrap;gap:10px;}
53
- .card{border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;width:300px;background:var(--card);display:inline-block;vertical-align:top;box-shadow:var(--shadow-sm);transition:var(--transition);cursor:default;}
52
+ .gallery-wrap{position:relative;margin:0 -4px}
53
+ .gallery{display:flex;gap:12px;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;padding:4px 4px 8px;scrollbar-width:none}
54
+ .gallery::-webkit-scrollbar{display:none}
55
+ .gallery-dots{display:flex;justify-content:center;gap:6px;margin-top:10px;flex-wrap:wrap}
56
+ .gallery-dots .dot{width:8px;height:8px;border-radius:50%;background:var(--border);border:none;cursor:pointer;transition:var(--transition);padding:0}
57
+ .gallery-dots .dot.active{background:var(--accent);transform:scale(1.3)}
58
+ .gallery-nav{position:absolute;top:50%;transform:translateY(-50%);width:32px;height:32px;border-radius:50%;background:var(--card);border:1px solid var(--border);box-shadow:var(--shadow-md);cursor:pointer;z-index:2;display:flex;align-items:center;justify-content:center;font-size:14px;color:var(--fg);transition:var(--transition);opacity:0}
59
+ .gallery-wrap:hover .gallery-nav{opacity:1}
60
+ .gallery-nav:hover{background:var(--accent);color:#fff}
61
+ .gallery-nav.prev{left:-16px}
62
+ .gallery-nav.next{right:-16px}
63
+ .card{border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;width:380px;min-width:380px;background:var(--card);display:block;box-shadow:var(--shadow-sm);transition:var(--transition);cursor:default;scroll-snap-align:start;flex-shrink:0}
54
64
  .card:hover{box-shadow:var(--shadow-md);transform:translateY(-2px);border-color:var(--muted);}
55
65
  .card-wide{width:100%;}
56
- .card img{width:100%;height:200px;object-fit:cover;display:block;transition:transform .3s ease;}
66
+ .card img{width:100%;height:260px;object-fit:cover;display:block;transition:transform .3s ease;}
57
67
  .card:hover img{transform:scale(1.02);}
58
68
  .card-wide img{max-height:340px;}
59
- .card video{width:100%;display:block;background:#000;border:none;outline:none;}
60
- .card-wide video{max-height:500px;}
69
+ .card video{width:100%;min-height:220px;max-height:520px;display:block;background:#000;border:none;outline:none;object-fit:contain;}
70
+ .card-wide video{max-height:520px;}
71
+ .video-wrap{width:100%;background:#000;position:relative;overflow:hidden;}
72
+ .video-wrap.v{aspect-ratio:9/16;max-height:520px;}
73
+ .video-wrap.h{aspect-ratio:16/9;max-height:360px;}
74
+ .video-wrap.sq{aspect-ratio:1/1;max-height:440px;}
61
75
  .card-body{padding:14px 16px;}
62
76
 
63
77
  /* ─── Badges & Tags ─── */
@@ -347,13 +361,12 @@ body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--
347
361
  else if(platform==="tiktok"||platform==="douyin")isVertical=true;
348
362
  else if(platform==="youtube"&&dur>0&&dur<=60)isVertical=true;
349
363
  else if(platform==="instagram")isVertical=true;
350
- var videoAR=isVertical?"56.25%":"";
351
- var videoMaxH=isVertical?(wide?"500px":"380px"):(wide?"340px":"250px");
352
- mediaHtml='<div class="video-wrap" style="width:100%;aspect-ratio:16/9;background:#000;position:relative;overflow:hidden">'
364
+ var arCls=isVertical?"v":"h";
365
+ var _vc="video-wrap "+arCls;
366
+ mediaHtml='<div class=""+_vc+"">'
353
367
  +'<video src="'+esc(video)+'" controls preload="metadata" playsinline '
354
368
  +'poster="'+esc(thumb)+'" '
355
- +'style="width:100%;height:100%;object-fit:contain;display:block;background:#000" '
356
- +'onloadedmetadata="onVideoLoaded(this)"'
369
+ +'style="width:100%;height:100%;object-fit:contain;display:block;background:#000">'
357
370
  +'Your browser does not support video playback.</video></div>';
358
371
  }else if(images.length>1){
359
372
  // Carousel / multi-image gallery — horizontally scrollable strip.
@@ -434,7 +447,7 @@ body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--
434
447
  var vt=a.viralTriggers.slice(0,8).map(function(t){return'<span class="tag clickable" onclick="copyText(this.dataset.v)" data-v="'+esc(t)+'">🔥 '+esc(t)+"</span>";}).join("");
435
448
  sections+=section("Viral Triggers",vt);
436
449
  }
437
- if(a.suggestedHook)sections+=section("Suggested Hook",'<div class="quote-box">'+esc(a.suggestedHook)+'<button class="copy-btn" onclick="copyText(\\''+esc(a.suggestedHook).replace(/'/g,"\\\\'")+'\\')">Copy</button></div>',true);
450
+ if(a.suggestedHook)sections+=section("Suggested Hook",'<div class="quote-box">'+esc(a.suggestedHook)+'<button class="copy-btn" data-copy="'+esc(a.suggestedHook).replace(/"/g,'&quot;')+'">Copy</button></div>',true);
438
451
  if(a.suggestedHashtags&&a.suggestedHashtags.length){
439
452
  var sh=a.suggestedHashtags.slice(0,10).map(function(t){var clean=t.replace(/^#/,"");return'<span class="tag clickable" onclick="copyText(this.dataset.v)" data-v="#'+esc(clean)+'" style="background:#ede9fe;color:#6d28d9">#'+esc(clean)+"</span>";}).join("");
440
453
  sections+=section("Hashtags",sh);
@@ -484,6 +497,58 @@ body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--
484
497
  return result;
485
498
  }
486
499
 
500
+ var galleryId=0;
501
+ function galleryWrap(cardsHtml,count){
502
+ var id="gal"+(galleryId++);
503
+ if(count<=1)return cardsHtml;
504
+ var dots="";
505
+ for(var i=0;i<count;i++)dots+='<button class="dot'+(i===0?" active":"")+'" data-g="'+id+'" data-i="'+i+'"></button>';
506
+ return '<div class="gallery-wrap fade-in">'
507
+ +'<button class="gallery-nav prev" data-gnav="'+id+'" data-dir="-1">\u2039</button>'
508
+ +'<div class="gallery" id="'+id+'">'+cardsHtml+'</div>'
509
+ +'<button class="gallery-nav next" data-gnav="'+id+'" data-dir="1">\u203a</button>'
510
+ +'<div class="gallery-dots" id="'+id+'-dots">'+dots+'</div>'
511
+ +'</div>';
512
+ }
513
+ function initGalleryNav(){
514
+ document.addEventListener('click',function(e){
515
+ var navBtn=e.target.closest('.gallery-nav[data-gnav]');
516
+ if(navBtn){
517
+ var g=document.getElementById(navBtn.getAttribute('data-gnav'));
518
+ if(!g)return;
519
+ var dir=Number(navBtn.getAttribute('data-dir'));
520
+ var cardW=g.querySelector('.card')?.offsetWidth||380;
521
+ g.scrollBy({left:dir*(cardW+12),behavior:'smooth'});
522
+ return;
523
+ }
524
+ var dotBtn=e.target.closest('.dot[data-g]');
525
+ if(dotBtn){
526
+ var gId=dotBtn.getAttribute('data-g');
527
+ var g=document.getElementById(gId);
528
+ var dots=document.getElementById(gId+'-dots');
529
+ if(!g||!dots)return;
530
+ var idx=Number(dotBtn.getAttribute('data-i'));
531
+ var cards=g.querySelectorAll('.card');
532
+ if(cards[idx])cards[idx].scrollIntoView({behavior:'smooth',block:'nearest',inline:'start'});
533
+ dots.querySelectorAll('.dot').forEach(function(d){d.classList.remove('active')});
534
+ dotBtn.classList.add('active');
535
+ }
536
+ });
537
+ document.addEventListener('scroll',function(e){
538
+ if(!e.target.classList||!e.target.classList.contains('gallery'))return;
539
+ var g=e.target;var gId=g.id;
540
+ var dots=document.getElementById(gId+'-dots');
541
+ if(!dots)return;
542
+ var cards=g.querySelectorAll('.card');
543
+ if(!cards.length)return;
544
+ var scrollLeft=g.scrollLeft;var cardW=cards[0].offsetWidth+12;
545
+ var active=Math.round(scrollLeft/cardW);
546
+ active=Math.max(0,Math.min(active,cards.length-1));
547
+ dots.querySelectorAll('.dot').forEach(function(d,i){d.classList.toggle('active',i===active)});
548
+ },true);
549
+ }
550
+ initGalleryNav();
551
+
487
552
  function render(result){
488
553
  var app=document.getElementById("app");if(!app)return;
489
554
  var d=extractResult(result);
@@ -496,11 +561,11 @@ body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--
496
561
  // Posts gallery
497
562
  if(d.posts&&Array.isArray(d.posts)){
498
563
  if(!d.posts.length){app.innerHTML='<div class="empty-state fade-in"><div class="icon">🔍</div><div class="text">No posts found</div></div>';return;}
499
- app.innerHTML='<div class="gallery stagger">'+d.posts.map(function(p){return postCard(p,false);}).join("")+"</div>";return;}
564
+ app.innerHTML=galleryWrap(d.posts.map(function(p){return postCard(p,false);}).join(""),d.posts.length);return;}
500
565
  // Creators
501
566
  if(d.creators&&Array.isArray(d.creators)){
502
567
  if(!d.creators.length){app.innerHTML='<div class="empty-state fade-in"><div class="icon">👤</div><div class="text">No creators found</div></div>';return;}
503
- app.innerHTML='<div class="gallery stagger">'+d.creators.map(function(c){return creatorCard(c);}).join("")+"</div>";return;}
568
+ app.innerHTML=galleryWrap(d.creators.map(function(c){return creatorCard(c);}).join(""),d.creators.length);return;}
504
569
  // Comments
505
570
  if(d.comments&&Array.isArray(d.comments)){
506
571
  var ch=d.comments.slice(0,15).map(function(c){
@@ -513,7 +578,7 @@ body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--
513
578
  +'<div style="font-size:16px;font-weight:700;margin-bottom:12px">💬 Comments ('+d.comments.length+')</div>'+ch+"</div></div>";return;}
514
579
  // Sounds
515
580
  if(d.sounds&&Array.isArray(d.sounds)){
516
- app.innerHTML='<div class="gallery stagger">'+d.sounds.map(function(s){
581
+ app.innerHTML=galleryWrap(d.sounds.map(function(s){
517
582
  var color=pColor(s.platform||"tiktok");
518
583
  var cover=s.coverUrl?'<img class="sound-cover" src="'+esc(s.coverUrl)+'" alt="cover" loading="lazy"/>'
519
584
  :'<div class="sound-cover" style="background:'+color+'15;display:flex;align-items:center;justify-content:center;font-size:26px">🎵</div>';
@@ -524,7 +589,7 @@ body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--
524
589
  +'<div style="font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">'+esc(s.title||"")+"</div>"
525
590
  +'<div style="font-size:12px;color:var(--muted)">'+esc(s.artist||s.author||"")+(s.duration?" • "+esc(s.duration):"")+"</div>"
526
591
  +playBtn+"</div></div></div>";
527
- }).join("")+"</div>";return;}
592
+ }).join(""),d.sounds.length);return;}
528
593
  // Credits
529
594
  if(d.balance!=null||d.tier){
530
595
  var bal=Number(d.balance)||0,tier=d.tier||"",ff=d.firstFreeTools||[];
@@ -562,6 +627,10 @@ body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--
562
627
 
563
628
  // Global helpers
564
629
  window.copyText=copyText;
630
+ document.addEventListener('click',function(e){
631
+ var btn=e.target.closest('.copy-btn[data-copy]');
632
+ if(btn)copyText(btn.getAttribute('data-copy'));
633
+ });
565
634
  window.toggleSection=function(header){
566
635
  header.classList.toggle("open");
567
636
  var content=header.nextElementSibling;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orchyn/mcp",
3
- "version": "1.17.6",
3
+ "version": "1.17.8",
4
4
  "description": "MCP server for orchyn - fetch, discover and understand TikTok/Instagram/YouTube/X/LinkedIn posts with AI (media metadata, niche discovery, hook & viral analysis)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",