Marketplace
플러그인 카탈로그
StorefrontPage / CatalogPage 가 GET /api/v1/catalog (+ plugin_type=plugin 필터) 로 카드를 가져옵니다. 각 카드는 id / 최신 버전 / 권한 요약 / publisher / 다운로드를 표시하고, “설치” 는 lvis://install/<slug> deeplink 를 발사합니다.
관련 endpoint (verbatim)
# server/src/lvis_marketplace/api/catalog.py
GET /api/v1/catalog # 336
GET /api/v1/plugins/{slug} # 394
GET /api/v1/plugins/{slug}/versions/{version}/download # 432
GET /api/v1/plugins/{slug}/versions/{version}/download.sig # 476설치 deeplink 흐름
// web/src/pages/PluginDetailPage.tsx:174-178
const installHref = data.plugin_type && data.plugin_type !== "plugin"
? `lvis://install/${data.plugin_type}/${encodeURIComponent(data.slug)}`
: `lvis://install/${encodeURIComponent(data.slug)}`;
const mcpLoginHref = `lvis://mcp-login/${encodeURIComponent(data.slug)}`;형태는 lvis://install/<slug> 또는 lvis://install/<type>/<slug>. querystring 형식 (?plugin=…) 은 사용하지 않습니다. 호스트 측 파서: lvis-app/src/main/lvis-protocol.ts:72.
패키지 무결성 — Ed25519
모든 PluginVersion 은 signature_envelope (multi-signature) 를 가지고, signing.py:219 verify_artifact() 가 “알려진 public key 와 매칭되는 서명이 1개 이상이면 통과” 로 검증. 호스트는 다운로드 시 download.sig 를 함께 받아 동일 로직으로 재검증.
실패하면 install 거절
매니페스트 또는 서명이 검증되지 않으면 호스트는 즉시 거절하고 audit log 에 reject 이벤트를 기록합니다. fallback 으로 “unsigned” path 를 타는 코드는 없습니다 (LVIS no-fallback 룰).