{"name":"Drop","tagline":"拖放即上线 — publish folders, HTML, images, PDF, video, Office, Markdown, or JSON to shareable HTTPS links","audience":["human-browser","agent-shell","ci"],"documentation":{"llmsTxt":"https://html.cyber101.cc/llms.txt","apiCatalog":"https://html.cyber101.cc/api","statusPage":"https://html.cyber101.cc/status","localPreview":"https://html.cyber101.cc/local-preview","skill":"https://raw.githubusercontent.com/yuezheng2006/html2url-cyber101/main/skills/drop-deploy/SKILL.md","repository":"https://github.com/yuezheng2006/html2url-cyber101"},"auth":{"header":"X-Deploy-Token","required":false,"note":"Publish is open by default; anonymous management requires the one-time managementKey returned by publish."},"environment":{"dropBaseUrl":"https://html.cyber101.cc","dropDeployToken":"optional; send as X-Deploy-Token when the instance sets DEPLOY_TOKEN"},"capabilities":{"atomicPublishing":false,"publishResultRecovery":false,"cloudLibrary":false,"retainedVersions":0},"endpoints":[{"method":"GET","path":"/api/publish-attempt","purpose":"Recover a successful response within 24 hours using its original Idempotency-Key header and identity. Unknown/unconfirmed is 404. Requires PUBLICATIONS."},{"method":"GET","path":"/api/library","purpose":"Cloud publishing library; Feishu owns its records, token sees all. Requires PUBLICATIONS. Query: q, type, status=active|expiring|expired, offset. Pages of 30."},{"method":"GET","path":"/api/deploy/:id/versions","purpose":"List up to three retained content versions. Requires deployment management auth and PUBLICATIONS."},{"method":"POST","path":"/api/deploy/:id/versions","contentType":"application/json","fields":["versionId"],"purpose":"Restore content while retaining current ownership, password, Feishu gate and expiry. Requires management auth and PUBLICATIONS."},{"method":"POST","path":"/api/deploy","contentType":"multipart/form-data","purpose":"Deploy ZIP sites, single images/PDF/video/Office/Markdown/JSON, or folder uploads","fields":["file","mode?","customPath?","password?","feishuRequired?"]},{"method":"POST","path":"/api/create","contentType":"application/json","purpose":"Publish a single HTML page from a string","fields":["html","filename?","mode?","customPath?","password?","feishuRequired?"]},{"method":"GET","path":"/api/paths","purpose":"List mounted slugs you own (Feishu) or the full inventory (X-Deploy-Token). Anonymous: 401."},{"method":"GET","path":"/api/deploys","purpose":"Recent deploy ledger for the caller (Feishu = own records; token = full). Anonymous: 401."},{"method":"GET","path":"/api/deploy/:id","purpose":"Deployment details (id == slug) including passwordProtected flag"},{"method":"GET","path":"/api/deploy/:id/llms.txt","purpose":"Per-deploy agent card (Markdown) for one published Drop"},{"method":"DELETE","path":"/api/deploy/:id","purpose":"Delete a deployment"},{"method":"POST","path":"/api/deploy/:id","contentType":"application/json","purpose":"Renew TTL; body {\"ttlDays\":90} (max 90). Anonymous cannot set ttlDays=0."},{"method":"GET","path":"/api/storage","purpose":"Instance storage usage"},{"method":"GET","path":"/api/rate-limit","purpose":"Per-IP deploy/management/access quota (optional ?ip= with X-Deploy-Token)"},{"method":"GET","path":"/api/status","purpose":"Public health, storage usage, and capacity standards"},{"method":"GET","path":"/api/health","purpose":"Minimal uptime probe for external monitors"},{"method":"GET","path":"/status","purpose":"Human-readable status dashboard"},{"method":"GET","path":"/local-preview","purpose":"Human guide for Cloudflare Quick Tunnels when the user only needs a live localhost preview. Drop does not tunnel."},{"method":"GET","path":"/admin","purpose":"Feishu author-only read-only operations and statistics dashboard","auth":"Feishu author identity"},{"method":"GET","path":"/api/admin/summary","purpose":"Feishu author-only deployment, storage, and service summary","auth":"Feishu author identity"},{"method":"POST","path":"/api/access","contentType":"application/x-www-form-urlencoded","purpose":"Unlock password-protected content; returns Set-Cookie for follow-up GETs","fields":["slug","password","next?"]}],"urlPatterns":{"site":"/{slug}/","html":"/{slug}","image":"/img/{slug}","pdf":"/pdf/{slug}","pdfRaw":"/pdf/{slug}/raw","epub":"/epub/{slug}","epubRaw":"/epub/{slug}/raw","office":"/office/{slug}","officeRaw":"/office/{slug}/raw","markdown":"/md/{slug}","markdownRaw":"/md/{slug}/raw","json":"/json/{slug}","jsonRaw":"/json/{slug}/raw","video":"/video/{slug}","videoRaw":"/video/{slug}/raw"},"limits":{"zipUpload":"80.0 MB","uncompressedTotal":"80.0 MB","zipFileCount":400,"zipSingleFile":"10.0 MB","pdfSingleFile":"30.0 MB","epubSingleFile":"30.0 MB","videoSingleFile":"30.0 MB","imageOfficeSingleFile":"10.0 MB","html":"20.0 MB","markdownOrJson":"2.0 MB","htmlOrMarkdown":"HTML 20.0 MB / Markdown、JSON 2.0 MB","storageTotal":"100.0 GB","deployRateLimit":"每 IP 每 10 分钟最多 10 次发布","managementRateLimit":"删除 / 续期等管理写操作：每 IP 每 10 分钟最多 20 次","accessRateLimit":"密码解锁（POST /api/access）：每 IP 每 10 分钟最多 20 次"},"slugRules":{"pattern":"[a-z0-9-]+","reserved":["api","status","admin","assets","acceptable-use","local-preview","img","md","pdf","office","epub","json","video","index.html","favicon.ico"],"customPath":"optional fixed first-level path; pair with mode=overwrite to keep URL stable"},"agentWorkflow":["Set DROP_BASE_URL to this instance origin (public default: https://html.cyber101.cc).","If DEPLOY_TOKEN is configured, send X-Deploy-Token on publish and management calls.","Deploy with curl -sS (never curl -f — 409 conflicts include JSON bodies).","On success, return both the live url and deploy id (id == slug) to the user.","Optional: fetch GET /api/deploy/:id/llms.txt for a per-deploy agent card.","On 409 without mode, retry with mode=overwrite or mode=new.","Inventory: GET /api/paths and GET /api/deploys require Feishu login (own records) or X-Deploy-Token (full). Anonymous callers get 401.","For password-protected links, POST /api/access then reuse the Set-Cookie on GET requests.","Drop is not a localhost tunnel. For live localhost preview, point humans to GET /local-preview (Cloudflare Quick Tunnels: cloudflared tunnel --url http://localhost:PORT). Publish a snapshot to Drop when the content should survive without the developer machine.","For text-only cloud agents that need a screenshot: POST /api/deploy the image file, then paste the returned /img/{id} URL (remote side installs nothing)."],"curlNotes":["Use multipart form for /api/deploy; do not POST raw application/zip if you need customPath or mode.","ZIP sites need an HTML entry, a pure Markdown folder, or pure images for a gallery.","Do not mix HTML and Markdown in one folder/ZIP."]}