nemar-cli 0.10.13-dev.3100 → 0.10.13
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/dist/index.js +3 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -99,18 +99,18 @@ ${t}`,J2e,X2e,Z2e=(e,t,r)=>{let n=r===""?"":`with ${r.trim()}() `,o=Y2e.bind(nul
|
|
|
99
99
|
`)}var xE=!1;var{spawn:YLe}=globalThis.Bun;async function C(e,t={}){let r={...process.env,GIT_TERMINAL_PROMPT:"0",...t.env};for(let u of t.unsetEnv??[])delete r[u];let n=YLe({cmd:e,cwd:t.cwd,...t.stdin===void 0?{}:{stdin:new TextEncoder().encode(t.stdin)},stdout:"pipe",stderr:"pipe",env:r}),o=!1,i;if(t.timeout)i=setTimeout(()=>{o=!0,n.kill()},t.timeout);if(_E()){let u=t.cwd?` (cwd=${t.cwd})`:"";Nf(l.dim(`$ ${e.join(" ")}${u}`))}let s=await new Response(n.stdout).text(),a=await new Response(n.stderr).text(),c=await n.exited;if(i)clearTimeout(i);if(_E()){if(s.trim())Nf(l.dim(s.trimEnd()));if(a.trim())Nf(l.yellow(a.trimEnd()));Nf(l.dim(`(exit ${c})`))}if(o)return{stdout:s,stderr:a||`Command timed out after ${Math.round(t.timeout/1000)}s`,exitCode:c??1,timedOut:!0};return{stdout:s,stderr:a,exitCode:c,timedOut:!1}}var vt=O(()=>{Ze()});function XLe(){if(process.platform==="darwin")return"macos";if(process.platform==="win32")return"windows";return"linux"}function xY(e,t=XLe()){return e.installInstructions[t]}function ZLe(e){let t=e.match(/(\d+\.\d+(?:\.\d+)?)/);return t?t[1]:void 0}function eBe(){let e=Number(process.env.TEST_PROBE_TIMEOUT_MS);return Number.isFinite(e)&&e>0?e:QLe}async function _Y(e){try{let{exitCode:t,stdout:r,timedOut:n}=await C(e.cmd,{timeout:eBe()});if(n)return{available:!1,timedOut:!0};if(t!==0)return{available:!1};return{available:!0,version:ZLe(r)}}catch(t){let r=t instanceof Error?t.message:String(t);if(!r.includes("ENOENT")&&!r.includes("not found"))console.error(` Warning: ${e.name} check failed unexpectedly: ${r}`);return{available:!1}}}async function jf(){let e=Object.entries(bY);return Promise.all(e.map(async([t,r])=>{let{available:n,version:o,timedOut:i}=await _Y(r);return{key:t,name:r.name,purpose:r.purpose,required:r.required,available:n,version:o,timedOut:i,installInstruction:xY(r)}}))}async function vY(){let t=(await jf()).filter((r)=>r.required&&!r.available);if(t.length===0)return[];console.warn(`
|
|
100
100
|
Heads up: some tools NEMAR needs for uploading/validating aren't installed yet:`);for(let r of t)console.warn(` - ${r.name} (${r.purpose})`),console.warn(` Install: ${r.installInstruction}`);return console.warn("Run `nemar doctor` anytime to re-check. You can finish signup without them.\n"),t}async function Ia(e){let r=JLe[e].map((s)=>bY[s]).filter(Boolean),n=await Promise.all(r.map(async(s)=>{let a=await _Y(s);return{check:s,available:a.available,timedOut:a.timedOut}}));for(let s of n)if(s.timedOut&&s.check.required)console.warn(`Warning: ${s.check.name} did not respond to a version check in time; continuing anyway.`);let o=n.filter((s)=>!s.available&&!s.timedOut&&s.check.required).map((s)=>({tool:s.check.name,installInstruction:xY(s.check)}));if(o.length===0)return;let i=[`
|
|
101
101
|
Missing required tools:`];for(let s of o)i.push(` ${s.tool} not installed`),i.push(` Install: ${s.installInstruction}`);throw Error(i.join(`
|
|
102
|
-
`))}var bY,JLe,QLe=4000;var qf=O(()=>{vt();bY={git:{name:"git",purpose:"version control for dataset metadata",cmd:["git","--version"],required:!0,installInstructions:{macos:"brew install git (or install Xcode Command Line Tools)",linux:"sudo apt-get install git OR sudo dnf install git",windows:"winget install Git.Git (or https://git-scm.com/download/win)"}},"git-annex":{name:"git-annex",purpose:"large-file data transfer (upload/download)",cmd:["git-annex","version"],required:!0,installInstructions:{macos:"brew install git-annex",linux:"sudo apt-get install git-annex OR sudo dnf install git-annex",windows:"Download the installer from https://git-annex.branchable.com/install/Windows/"}},gh:{name:"GitHub CLI (gh)",purpose:"GitHub authentication + repository operations",cmd:["gh","--version"],required:!0,installInstructions:{macos:"brew install gh",linux:"See https://cli.github.com/manual/installation",windows:"winget install GitHub.cli (or: scoop install gh)"}},aws:{name:"AWS CLI",purpose:"S3 data upload/download",cmd:["aws","--version"],required:!0,installInstructions:{macos:"brew install awscli",linux:"pip install awscli OR sudo snap install aws-cli --classic",windows:"winget install Amazon.AWSCLI (or the MSI from https://aws.amazon.com/cli/)"}},deno:{name:"Deno",purpose:"BIDS validation",cmd:["deno","--version"],required:!0,installInstructions:{macos:"brew install deno (or: curl -fsSL https://deno.land/install.sh | sh)",linux:"curl -fsSL https://deno.land/install.sh | sh",windows:"winget install DenoLand.Deno (or: irm https://deno.land/install.ps1 | iex)"}}},JLe={upload:["git-annex","gh","aws","deno"],download:["gh"],clone:["git","gh"],push:["git-annex","gh"],publish:["gh","aws"],update:["git","gh"],release:["git","gh"]}});var DY;var wY=O(()=>{DY={name:"nemar-cli",version:"0.10.13
|
|
102
|
+
`))}var bY,JLe,QLe=4000;var qf=O(()=>{vt();bY={git:{name:"git",purpose:"version control for dataset metadata",cmd:["git","--version"],required:!0,installInstructions:{macos:"brew install git (or install Xcode Command Line Tools)",linux:"sudo apt-get install git OR sudo dnf install git",windows:"winget install Git.Git (or https://git-scm.com/download/win)"}},"git-annex":{name:"git-annex",purpose:"large-file data transfer (upload/download)",cmd:["git-annex","version"],required:!0,installInstructions:{macos:"brew install git-annex",linux:"sudo apt-get install git-annex OR sudo dnf install git-annex",windows:"Download the installer from https://git-annex.branchable.com/install/Windows/"}},gh:{name:"GitHub CLI (gh)",purpose:"GitHub authentication + repository operations",cmd:["gh","--version"],required:!0,installInstructions:{macos:"brew install gh",linux:"See https://cli.github.com/manual/installation",windows:"winget install GitHub.cli (or: scoop install gh)"}},aws:{name:"AWS CLI",purpose:"S3 data upload/download",cmd:["aws","--version"],required:!0,installInstructions:{macos:"brew install awscli",linux:"pip install awscli OR sudo snap install aws-cli --classic",windows:"winget install Amazon.AWSCLI (or the MSI from https://aws.amazon.com/cli/)"}},deno:{name:"Deno",purpose:"BIDS validation",cmd:["deno","--version"],required:!0,installInstructions:{macos:"brew install deno (or: curl -fsSL https://deno.land/install.sh | sh)",linux:"curl -fsSL https://deno.land/install.sh | sh",windows:"winget install DenoLand.Deno (or: irm https://deno.land/install.ps1 | iex)"}}},JLe={upload:["git-annex","gh","aws","deno"],download:["gh"],clone:["git","gh"],push:["git-annex","gh"],publish:["gh","aws"],update:["git","gh"],release:["git","gh"]}});var DY;var wY=O(()=>{DY={name:"nemar-cli",version:"0.10.13",description:"CLI for NEMAR (Neuroelectromagnetic Data Archive and Tools Resource) dataset management",type:"module",main:"dist/index.js",bin:{nemar:"dist/index.js"},scripts:{dev:"bun run src/index.ts",build:"bun build src/index.ts --outdir dist --target bun --minify && sed '1s|#!/usr/bin/env node|#!/usr/bin/env bun|' dist/index.js > dist/index.js.tmp && mv dist/index.js.tmp dist/index.js",test:"bun test",lint:"biome check src/","migrations:d1-check":"bun run scripts/d1-migration-check.ts","zarr:geometry-check":"bun run backend/scripts/zarr-geometry-conformance.ts","lint:fix":"biome check --fix src/",format:"biome format --write src/",typecheck:"tsc --noEmit && tsc --noEmit -p backend","generate-openapi":"bun run scripts/generate-openapi.ts",prepublishOnly:"bun run build",prepare:"husky",postinstall:"bun scripts/postinstall-check.mjs",deploy:"wrangler deploy",preview:"wrangler dev"},keywords:["nemar","bids","neuroimaging","eeg","emg","datalad","cli"],author:"NEMAR Team",license:"CC-BY-NC-ND-4.0",repository:{type:"git",url:"git+https://github.com/nemarOrg/nemar-cli.git"},bugs:{url:"https://github.com/nemarOrg/nemar-cli/issues"},homepage:"https://docs.nemar.org",engines:{bun:">=1.0.0"},files:["dist","scripts/postinstall-check.mjs","scripts/recover-datasets.json","scripts/withdrawn-datasets.json","README.md","LICENSE"],dependencies:{chalk:"^5.3.0",commander:"^12.1.0",conf:"^13.0.1",inquirer:"^9.2.15",ora:"^8.0.1",semver:"^7.8.5",zod:"^3.23.8"},"lint-staged":{"src/**/*.{ts,tsx}":["biome check --fix"],"backend/src/**/*.{ts,tsx}":["biome check --fix"]},devDependencies:{"@asteasolutions/zod-to-openapi":"^7.3.4","@biomejs/biome":"1.9.4","@types/bun":"latest","@types/inquirer":"^9.0.7","@types/semver":"^7.8.0",ajv:"^8.20.0","ajv-formats":"^3.0.1",bcryptjs:"^3.0.3",husky:"^9.1.7","lint-staged":"^16.3.2",typescript:"^5.5.4",wrangler:"^4.70.0",yaml:"^2.8.4"}}});var Ci;var Mf=O(()=>{wY();Ci=DY.version});import{mkdirSync as rBe,readdirSync as nBe,unlinkSync as oBe,writeFileSync as iBe}from"fs";import{join as vE}from"path";function RY(){Pl=!0}function Ta(){return Pl}function AY(e,t=process.env){return e.includes("--debug")||t.NEMAR_DEBUG==="1"}function Bf(e){kY=e,Cr(`Step: ${e}`)}function Uf(){$Y=!0}function OY(){return $Y}function DE(){CY=!0}function FY(){return CY}function Cr(e){if(Pl)process.stderr.write(`[debug] ${e}
|
|
103
103
|
`)}function lBe(e){let t={};for(let[r,n]of Object.entries(e))t[r]=cBe.has(r.toLowerCase())?"[REDACTED]":n;return t}function IY(e){let t=e.indexOf("@");if(t<=0)return"***";return`${e[0]}***${e.slice(t)}`}function wE(e,t,r=0){if(r>dBe)return"[REDACTED: depth]";if(Array.isArray(t))return t.map((n)=>wE(e,n,r+1));if(t&&typeof t==="object"){let n={};for(let[o,i]of Object.entries(t))n[o]=wE(o,i,r+1);return n}if(typeof t==="string"){if(uBe.test(e))return"[REDACTED]";return t.replace(PY,IY)}return t}function EE(e){return e.replace(fBe,"Bearer [REDACTED]").replace(pBe,"[REDACTED_AWS_KEY]").replace(mBe,"$1[REDACTED]").replace(hBe,"$1$2=[REDACTED]").replace(PY,IY)}function gBe(e){return EE(e)}function EY(e,t=aBe){if(e===void 0)return;let r=e;try{let n=JSON.parse(e);r=JSON.stringify(wE("",n))}catch{}if(r=EE(r),Buffer.byteLength(r,"utf8")>t)r=`${Buffer.from(r,"utf8").subarray(0,t).toString("utf8")}... [truncated]`;return r}function N0(e){if(!Pl)return;let t=gBe(e.url);try{let r={...e,url:t,requestHeaders:e.requestHeaders?lBe(e.requestHeaders):void 0,requestBody:EY(e.requestBody),responseBody:EY(e.responseBody)};T0.push(r),Cr(`${e.method} ${t} -> ${e.status??"ERROR"} (${e.durationMs}ms)`)}catch(r){let n=N(r);T0.push({method:e.method,url:t,status:e.status,durationMs:e.durationMs,note:`redaction failed: ${n}`}),Cr(`redaction failed for ${e.method} ${t}: ${n}`)}}async function yBe(){let e=[];try{let t=process.versions.bun?`Bun ${process.versions.bun}`:`Node ${process.version}`;e.push(`CLI version: ${Ci}`),e.push(`OS/Arch: ${process.platform}/${process.arch}`),e.push(`Runtime: ${t}`)}catch(t){e.push(`(could not read CLI/OS/runtime info: ${N(t)})`)}e.push(""),e.push("Active account:");try{let t=ot();if(t.apiKey){if(t.username)e.push(` Username: ${t.username}`);if(e.push(` API URL: ${t.apiUrl}`),t.role)e.push(` Role: ${t.role}`);e.push(` Sandbox completed: ${!!t.sandboxCompleted}`)}else e.push(" (not authenticated)")}catch(t){e.push(` (could not read account config: ${N(t)})`)}e.push(""),e.push("External tools:");try{let t=await jf();for(let r of t){let n=r.available?r.version??"installed":r.timedOut?"(timed out)":"not installed";e.push(` ${r.name}: ${n}`)}}catch(t){e.push(` (could not probe external tools: ${N(t)})`)}return e}async function SE(){return(await yBe()).join(`
|
|
104
104
|
`)}async function TY(){if(!Pl||I0!==void 0)return;try{I0=await SE()}catch(e){let t=N(e);I0=`(could not build environment report: ${t})`,Cr(`environment snapshot failed: ${t}`)}}function NY(e){if(SY.has(e))return{flag:e};for(let t of SY){if(!e.startsWith(t)||e.length<=t.length)continue;if(t.length===2)return{flag:t,kind:"short-attached"};if(e[t.length]==="=")return{flag:t,kind:"long-eq"}}return null}function bBe(e){let t=[];for(let r=0;r<e.length;r++){let n=e[r],o=NY(n);if(!o){t.push(n);continue}if(o.kind==="long-eq")t.push(`${o.flag}=[REDACTED]`);else if(o.kind==="short-attached")t.push(`${o.flag}[REDACTED]`);else if(t.push(n),r+1<e.length)t.push("[REDACTED]"),r++}return t}function xBe(e){let t=[];for(let r=0;r<e.length;r++){let n=e[r],o=NY(n);if(!o){t.push(n);continue}if(!o.kind&&r+1<e.length)r++}return t}function _Be(e){let t=[];for(let n of xBe(e)){if(n.startsWith("-"))continue;if(t.push(n),t.length===2)break}return(t.length>0?t.join("-"):"nemar").replace(/[^a-zA-Z0-9_-]/g,"_")}function vBe(e,t){let r=[];if(r.push("NEMAR CLI Debug Log"),r.push(`Generated: ${new Date().toISOString()}`),r.push(`Command: nemar ${EE(bBe(e).join(" "))}`),r.push(""),r.push(I0??"(environment snapshot unavailable)"),r.push(""),r.push("HTTP requests:"),T0.length===0)r.push(" (none)");else T0.forEach((n,o)=>{if(r.push(` [${o+1}] ${n.method} ${n.url} -> ${n.status??"ERROR"} (${n.durationMs}ms)`),n.error)r.push(` Error: ${n.error}`);if(n.note)r.push(` Note: ${n.note}`);if(n.requestHeaders)r.push(` Request headers: ${JSON.stringify(n.requestHeaders)}`);if(n.requestBody)r.push(` Request body: ${n.requestBody}`);if(n.responseBody)r.push(` Response body: ${n.responseBody}`)});return r.push(""),r.push(`Failing step: ${kY??"(none recorded)"}`),r.push(`Exit code: ${t}`),`${r.join(`
|
|
105
105
|
`)}
|
|
106
106
|
`}function wBe(e,t){let r;try{r=nBe(e).filter((o)=>o.startsWith("nemar-")&&o.endsWith(".log"))}catch(o){if(o.code!=="ENOENT")Cr(`could not list ${e} for log rotation: ${N(o)}`);return}r.sort();let n=r.length-t;for(let o=0;o<n;o++)try{oBe(vE(e,r[o]))}catch(i){if(i.code!=="ENOENT")Cr(`could not remove old log ${r[o]}: ${N(i)}`)}}function jY(){return Lf}function qY(e,t){if(!Pl)return null;let r=vE($E(),"logs");try{rBe(r,{recursive:!0})}catch(s){return Lf=N(s),Cr(`could not create log directory ${r}: ${Lf}`),null}let o=`nemar-${new Date().toISOString().replace(/[:.]/g,"-")}-${_Be(e)}.log`,i=vE(r,o);try{iBe(i,vBe(e,t),"utf8")}catch(s){return Lf=N(s),Cr(`could not write log file ${i}: ${Lf}`),null}return wBe(r,sBe),i}var sBe=10,aBe=2048,Pl=!1,$Y=!1,CY=!1,kY,I0,T0,cBe,uBe,PY,dBe=32,fBe,pBe,mBe,hBe,SY,Lf;var Mo=O(()=>{It();Lo();qf();Mf();T0=[];cBe=new Set(["authorization","cookie","set-cookie","x-api-key"]);uBe=/^(api[_-]?key|apikey|password|token|secret|access[_-]?key(_id)?|secret[_-]?access[_-]?key|session|session[_-]?token|authorization|ssh[_-]?key|private[_-]?key|device[_-]?code)$/i,PY=/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;fBe=/Bearer\s+[A-Za-z0-9\-._~+/=]+/gi,pBe=/\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/g,mBe=/((?:aws_)?secret_access_key["']?\s*[:=]\s*["']?)[A-Za-z0-9/+=]{20,}/gi,hBe=/([?&])(X-Amz-Signature|X-Amz-Security-Token|X-Amz-Credential|Signature|AWSAccessKeyId)=[^&\s"']+/gi;SY=new Set(["-k","--key","--password","--api-key"])});import{chmodSync as DBe,copyFileSync as EBe,existsSync as CE,mkdirSync as SBe,statSync as $Be}from"fs";import{homedir as j0}from"os";import{join as Il}from"path";function kBe(e){let t=e.trim().replace(/\/+$/,"");try{let r=new URL(t);return r.protocol=r.protocol.toLowerCase(),r.host=r.host.toLowerCase(),r.toString().replace(/\/+$/,"")}catch{return console.error(`[nemar] could not parse stored apiUrl ${JSON.stringify(e)}; leaving as-is`),t}}function $E(){return process.env.NEMAR_CONFIG_DIR||Il(j0(),".config","nemar")}function ABe(e){if(process.env.NEMAR_CONFIG_DIR)return;let t=Il(e,"config.json");if(CE(t))return;let r=[];if(process.platform==="darwin")r.push(Il(j0(),"Library","Preferences","nemar-nodejs","config.json"));if(process.platform==="win32"){let n=process.env.APPDATA||Il(j0(),"AppData","Roaming");r.push(Il(n,"nemar-nodejs","config.json"))}r.push(Il(j0(),".config","nemar-nodejs","config.json"));for(let n of r)if(CE(n))try{SBe(e,{recursive:!0}),EBe(n,t),console.error(`[nemar] Config migrated from ${n} to ${t}
|
|
107
107
|
[nemar] You can safely remove the old file.`);return}catch(o){console.error(`[nemar] Failed to migrate config from ${n}:`,o,`
|
|
108
|
-
[nemar] You can manually copy ${n} to ${t}`)}}function Sn(){let e=$E();if(zf&&MY===e)return zf;if(ABe(e),zf=new P0({projectName:"nemar",configFileMode:kE,schema:{activeAccount:{type:"string"},accounts:{type:"object"},apiKey:{type:"string"},apiUrl:{type:"string"},username:{type:"string"},email:{type:"string"},githubUsername:{type:"string"},sandboxCompleted:{type:"boolean"},sandboxDatasetId:{type:"string"}},cwd:e}),MY=e,!LY.has(e))LY.add(e),OBe(zf.path),PBe(),IBe();return zf}function OBe(e){if(process.platform==="win32")return;if(!CE(e))return;try{if(($Be(e).mode&511)!==kE)DBe(e,kE)}catch(t){console.error(`[nemar] could not secure config file permissions for ${e}:`,t)}}function PBe(){let e=Sn(),t=e.get("accounts");if(t&&Object.keys(t).length>0)return;let r=e.get("apiKey"),n=e.get("username");if(!r&&!n)return;try{let o=n||"default",i={};for(let s of FBe){let a=e.get(s);if(a!==void 0)i[s]=a}e.store={activeAccount:o,accounts:{[o]:i}}}catch(o){console.error("Config migration failed (legacy config preserved):",o)}}function IBe(){let e=Sn(),t=e.store,r=t.accounts,n=!1;if(r)for(let[i,s]of Object.entries(r)){let a=s?.apiUrl;if(!a)continue;if(CBe.has(kBe(a)))r[i]={...s,apiUrl:Tl},console.error(`[nemar] migrated stored apiUrl for account "${i}": ${a} -> ${Tl}`),n=!0}let o=t.apiUrl;if(r&&Object.keys(r).length>0&&o!==void 0){let{apiUrl:i,...s}=t;try{e.store=s,console.error(`[nemar] removed stale top-level apiUrl from config (was: ${o})`),n=!1}catch(a){console.error("API URL cleanup failed (config file unchanged):",a)}}if(n)try{e.store={...e.store,accounts:r}}catch(i){console.error("API URL migration failed (config file unchanged):",i)}}function Vf(){return Sn().get("activeAccount")}function js(){return Sn().get("accounts")||{}}function ot(){let e={apiUrl:Tl},t=Vf();if(!t)return e;return js()[t]||e}function wt(e,t){let r=Sn(),n=r.get("activeAccount")||"default",o=r.get("accounts")||{};if(!o[n])o[n]={apiUrl:Tl};o[n][e]=t,r.store={...r.store,accounts:o,activeAccount:n}}function Gf(e){let t=Vf();if(!t)return;let r=js();if(r[t])delete r[t][e],Sn().set("accounts",r)}function BY(){let e=Sn(),t=Vf();if(!t){e.clear();return}let r=js();delete r[t];let n=Object.keys(r);if(n.length>0)e.store={...e.store,accounts:r,activeAccount:n[0]};else e.clear()}function UY(){Sn().clear()}function je(){return!!ot().apiKey}function RE(){return Sn().path}function Hf(){let e=js(),t=Vf();return Object.entries(e).map(([r,n])=>({key:r,username:n.username,email:n.email,githubUsername:n.githubUsername,active:r===t,keySource:n.keySource}))}function zY(e){return e.username?.trim()||e.email}function TBe(e){let t=e.trim().toLowerCase();if(!t)return;let r=Object.entries(js()).filter(([,n])=>n.email&&n.email.toLowerCase()===t).map(([n])=>n);if(r.length>1){Cr(`findAccountKeyByEmail: ${r.length} accounts share email ${t}: ${r.join(", ")}`);return}return r[0]}function VY(e,t){let r=Sn(),n=js(),o;if(n[e])o=e;else if(t.email)o=TBe(t.email);let i=o?n[o]:void 0,s={...i??{apiUrl:Tl},...t};if(o&&o!==e)delete n[o];return n[e]=s,r.store={...r.store,accounts:n,activeAccount:e},{key:e,previous:i}}function GY(e){let t=e.trim();if(!t)return"unchanged";let r=Sn(),n=Vf();if(!n||n===t)return"unchanged";let o=js(),i=o[n];if(!i)return"unchanged";if(o[t])return"key_taken";return delete o[n],o[t]={...i,username:t},r.store={...r.store,accounts:o,activeAccount:t},"renamed"}function AE(e){let t=Sn(),r=js();if(r[e])return t.store={...t.store,activeAccount:e},r[e];for(let[n,o]of Object.entries(r))if(o.githubUsername===e)return t.store={...t.store,activeAccount:n},o;return null}var Tl="https://
|
|
108
|
+
[nemar] You can manually copy ${n} to ${t}`)}}function Sn(){let e=$E();if(zf&&MY===e)return zf;if(ABe(e),zf=new P0({projectName:"nemar",configFileMode:kE,schema:{activeAccount:{type:"string"},accounts:{type:"object"},apiKey:{type:"string"},apiUrl:{type:"string"},username:{type:"string"},email:{type:"string"},githubUsername:{type:"string"},sandboxCompleted:{type:"boolean"},sandboxDatasetId:{type:"string"}},cwd:e}),MY=e,!LY.has(e))LY.add(e),OBe(zf.path),PBe(),IBe();return zf}function OBe(e){if(process.platform==="win32")return;if(!CE(e))return;try{if(($Be(e).mode&511)!==kE)DBe(e,kE)}catch(t){console.error(`[nemar] could not secure config file permissions for ${e}:`,t)}}function PBe(){let e=Sn(),t=e.get("accounts");if(t&&Object.keys(t).length>0)return;let r=e.get("apiKey"),n=e.get("username");if(!r&&!n)return;try{let o=n||"default",i={};for(let s of FBe){let a=e.get(s);if(a!==void 0)i[s]=a}e.store={activeAccount:o,accounts:{[o]:i}}}catch(o){console.error("Config migration failed (legacy config preserved):",o)}}function IBe(){let e=Sn(),t=e.store,r=t.accounts,n=!1;if(r)for(let[i,s]of Object.entries(r)){let a=s?.apiUrl;if(!a)continue;if(CBe.has(kBe(a)))r[i]={...s,apiUrl:Tl},console.error(`[nemar] migrated stored apiUrl for account "${i}": ${a} -> ${Tl}`),n=!0}let o=t.apiUrl;if(r&&Object.keys(r).length>0&&o!==void 0){let{apiUrl:i,...s}=t;try{e.store=s,console.error(`[nemar] removed stale top-level apiUrl from config (was: ${o})`),n=!1}catch(a){console.error("API URL cleanup failed (config file unchanged):",a)}}if(n)try{e.store={...e.store,accounts:r}}catch(i){console.error("API URL migration failed (config file unchanged):",i)}}function Vf(){return Sn().get("activeAccount")}function js(){return Sn().get("accounts")||{}}function ot(){let e={apiUrl:Tl},t=Vf();if(!t)return e;return js()[t]||e}function wt(e,t){let r=Sn(),n=r.get("activeAccount")||"default",o=r.get("accounts")||{};if(!o[n])o[n]={apiUrl:Tl};o[n][e]=t,r.store={...r.store,accounts:o,activeAccount:n}}function Gf(e){let t=Vf();if(!t)return;let r=js();if(r[t])delete r[t][e],Sn().set("accounts",r)}function BY(){let e=Sn(),t=Vf();if(!t){e.clear();return}let r=js();delete r[t];let n=Object.keys(r);if(n.length>0)e.store={...e.store,accounts:r,activeAccount:n[0]};else e.clear()}function UY(){Sn().clear()}function je(){return!!ot().apiKey}function RE(){return Sn().path}function Hf(){let e=js(),t=Vf();return Object.entries(e).map(([r,n])=>({key:r,username:n.username,email:n.email,githubUsername:n.githubUsername,active:r===t,keySource:n.keySource}))}function zY(e){return e.username?.trim()||e.email}function TBe(e){let t=e.trim().toLowerCase();if(!t)return;let r=Object.entries(js()).filter(([,n])=>n.email&&n.email.toLowerCase()===t).map(([n])=>n);if(r.length>1){Cr(`findAccountKeyByEmail: ${r.length} accounts share email ${t}: ${r.join(", ")}`);return}return r[0]}function VY(e,t){let r=Sn(),n=js(),o;if(n[e])o=e;else if(t.email)o=TBe(t.email);let i=o?n[o]:void 0,s={...i??{apiUrl:Tl},...t};if(o&&o!==e)delete n[o];return n[e]=s,r.store={...r.store,accounts:n,activeAccount:e},{key:e,previous:i}}function GY(e){let t=e.trim();if(!t)return"unchanged";let r=Sn(),n=Vf();if(!n||n===t)return"unchanged";let o=js(),i=o[n];if(!i)return"unchanged";if(o[t])return"key_taken";return delete o[n],o[t]={...i,username:t},r.store={...r.store,accounts:o,activeAccount:t},"renamed"}function AE(e){let t=Sn(),r=js();if(r[e])return t.store={...t.store,activeAccount:e},r[e];for(let[n,o]of Object.entries(r))if(o.githubUsername===e)return t.store={...t.store,activeAccount:n},o;return null}var Tl="https://api.nemar.org",kE=384,CBe,RBe,Mht,zf=null,MY=null,LY,FBe;var Lo=O(()=>{gY();en();kd();Mo();CBe=new Set(["https://api.osc.earth/nemar","https://nemar-api.neuromechanist.workers.dev","https://nemar-api-dev.shirazi-10f.workers.dev"]);RBe=U({field:w(),blocks:Q(w()).optional(),set_on:Q(w()).optional()}).passthrough(),Mht=U({apiKey:w().optional(),apiUrl:w().url().default(Tl),username:w().optional(),email:w().email().optional(),githubUsername:w().optional(),sandboxCompleted:be().optional(),sandboxDatasetId:w().optional(),dismissedNoticeIds:Q(k()).optional(),serviceAccess:be().optional(),profileGaps:Q(RBe).optional(),orcidVerified:be().optional(),role:w().optional(),accountKind:Cd.optional(),pendingEmailChange:w().email().optional()});LY=new Set;FBe=["apiKey","apiUrl","username","email","githubUsername","sandboxCompleted","sandboxDatasetId","dismissedNoticeIds"]});function q0(e){if(HY)return;HY=!0;let t=l.yellow("\u2500".repeat(60)),r=l.yellow.bold("[MAINTENANCE]"),n=l.dim(`mode: ${e.mode}`),o=e.eta?`
|
|
109
109
|
${l.dim(`eta: ${e.eta}`)}`:"";process.stderr.write(`${t}
|
|
110
110
|
${r} ${e.message}
|
|
111
111
|
${n}${o}
|
|
112
112
|
${t}
|
|
113
|
-
`)}var HY=!1;var OE=O(()=>{Ze()});function M0(){if(process.env.TEST_API_URL)return process.env.TEST_API_URL;if(PE)return FE;return ot().apiUrl||FE}async function F(e,t={},r=!1,n){let o=`${M0()}${e}`,i={"Content-Type":"application/json","X-CLI-Version":Ci,...t.headers};if(r){let m=ot();if(!m.apiKey&&r===!0)throw new L(401,"Not authenticated. Run 'nemar auth login' first.");if(m.apiKey)i.Authorization=`Bearer ${m.apiKey}`}let s=t.method||"GET",a=typeof t.body==="string"?t.body:void 0,c=Date.now(),u;try{u=await fetch(o,{...t,headers:i})}catch(m){if(Ta())N0({method:s,url:o,status:null,durationMs:Date.now()-c,requestHeaders:i,requestBody:a,error:m instanceof Error?m.message:String(m)});throw new L(0,`Network error: Could not connect to ${M0()}`,{originalError:m instanceof Error?m.message:String(m)})}let d;try{d=await u.text()}catch(m){if(Ta())N0({method:s,url:o,status:u.status,durationMs:Date.now()-c,requestHeaders:i,requestBody:a,error:m instanceof Error?m.message:String(m)});throw new L(0,"Failed to read response body",{httpStatus:u.status,originalError:m instanceof Error?m.message:String(m)})}if(Ta())N0({method:s,url:o,status:u.status,durationMs:Date.now()-c,requestHeaders:i,requestBody:a,responseBody:d});let f;try{f=JSON.parse(d)}catch{throw new L(u.status,`Invalid response from server (status ${u.status})`)}if(!u.ok){if(u.status===503&&(f.mode==="read-only"||f.mode==="full")){let R=typeof f.message==="string"?f.message:"NEMAR is in maintenance mode. Please retry shortly.",E=typeof f.eta==="string"?f.eta:null,P=new Ns(f.mode,R,E,f.details);throw q0(P),P}let m=typeof f.block_reason==="string",p=Array.isArray(f.missing)?f.missing.filter((R)=>typeof R==="string"):void 0,h=typeof f.error==="string"&&(Lq.includes(f.error)||Wq.includes(f.error)),g=typeof f.error==="string"&&(qh.options.includes(f.error)||Zq.includes(f.error)),b=typeof f.error==="string"&&Iq.includes(f.error),v=m||h||g||b||p!==void 0&&typeof f.error==="string"&&Mq.includes(f.error)?f.message||f.error:f.error||f.message;if(u.status===404&&f.error==="Not Found"&&typeof f.message==="string")v=`${f.message}. This NEMAR backend does not support this command yet.`;let S=new L(u.status,v||"Request failed",f.details,typeof f.step==="string"?f.step:void 0,m?f.block_reason:void 0,p);if(typeof f.error==="string")S.code=f.error;if(typeof f.reason==="string")S.reason=f.reason;throw S.rawBody=f,S}if(n){let m=n.safeParse(f);if(!m.success)throw new L(u.status,`Response for ${e} did not match the expected NEMAR contract`,{issues:m.error.issues});return m.data}return f}var FE="https://nemar-api-dev.sccn-org.workers.dev",PE;var ki=O(()=>{Bh();Ow();kd();Lo();Mo();OE();Mf();It();PE=FE.includes("workers.dev")});function L0(e){if(e.service_access===void 0||e.service_access===null)return"unknown";return e.service_access?"upload":"browse"}async function WY(e,t,r,n){let o=new URLSearchParams;if(e)o.set("status",e);if(t)o.set("role",t);if(r)o.set("awaiting_approval","1");if(n)o.set("kind",n);let i=o.toString()?`?${o.toString()}`:"";return F(`/admin/users${i}`,{},!0,jq)}async function KY(e){return F(`/admin/approve/${e}`,{method:"POST"},!0)}async function YY(e){return F(`/admin/approve/by-id/${e}`,{method:"POST"},!0)}async function JY(e){return F(`/admin/revoke/${e}`,{method:"POST"},!0)}async function XY(e){return F(`/admin/revoke/by-id/${e}`,{method:"POST"},!0)}async function ZY(e,t){return F(`/admin/users/${e}/role`,{method:"POST",body:JSON.stringify({role:t})},!0)}async function QY(e,t){return F(`/admin/users/${e}/kind`,{method:"POST",body:JSON.stringify({kind:t})},!0)}async function eJ(e){return F(`/admin/users/${e}`,{},!0)}async function tJ(e,t){return F(`/admin/users/${e}/keys`,{method:"POST",body:JSON.stringify({name:t})},!0,Lh)}async function rJ(e){return F(`/admin/users/${e}/keys`,{},!0,Mh)}async function nJ(e,t){return F(`/admin/users/${e}/keys/${t}`,{method:"DELETE"},!0)}async function IE(e,t){return F(`/admin/datasets/${e}/visibility`,{method:"PATCH",body:JSON.stringify({visibility:t})},!0)}async function oJ(e){return F(`/datasets/${e}/publish`,{method:"POST"},!0)}async function iJ(e){return F(`/admin/datasets/${e}/ci`,{},!0)}async function Ri(e){return F(`/admin/datasets/${e}/ci`,{method:"POST"},!0)}async function TE(e){return F(`/admin/datasets/${e}/ci/validate`,{method:"POST"},!0)}async function NE(e){return F(`/admin/datasets/${e}/ci/sync`,{method:"POST"},!0)}async function sJ(e,t){return F(`/admin/datasets/${e}/doi/concept`,{method:"POST",body:JSON.stringify(t)},!0)}async function Wf(e){return F(`/admin/datasets/${e}/doi`,{},!0)}async function jE(e,t){return F(`/admin/datasets/${e}/doi/update`,{method:"POST",body:JSON.stringify(t)},!0)}async function aJ(e,t){return F(`/admin/datasets/${e}/withdraw`,{method:"POST",body:JSON.stringify({reason:t.reason,dry_run:t.dryRun})},!0)}async function cJ(e,t){return F(`/admin/datasets/${e}/restore`,{method:"POST",body:JSON.stringify({dry_run:t.dryRun})},!0)}async function lJ(e){return F(`/admin/datasets/${e}/reset`,{method:"POST"},!0)}async function uJ(e,t=!1){return F(`/admin/datasets/${e}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:t})},!0)}async function dJ(e){return F("/admin/datasets/bulk-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataset_ids:e})},!0)}async function fJ(e){return F("/admin/datasets/import",{method:"POST",body:JSON.stringify(e)},!0)}async function pJ(e){return F("/admin/datasets/exemplar",{method:"POST",body:JSON.stringify(e)},!0)}async function mJ(e){return F(`/admin/datasets/${e}/exemplar/remint-dois`,{method:"POST"},!0)}async function qE(e,t){let r=new URLSearchParams;if(e)r.set("status",e);if(t!==void 0)r.set("blocklisted",t?"1":"0");let n=r.toString();return F(`/admin/imports${n?`?${n}`:""}`,{},!0)}async function hJ(e){return F(`/admin/imports/${e}/rollback`,{method:"POST"},!0)}async function gJ(e){return F(`/admin/imports/${e}/retry`,{method:"POST"},!0)}async function ME(e){return F(`/admin/imports/${e}/verify`,{method:"POST"},!0)}async function yJ(e){return F("/admin/imports/dispatch-cooldown",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataset_ids:e})},!0)}async function Nl(e,t){return F(`/admin/datasets/${e}/reindex`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t??{})},!0)}async function bJ(e,t){return F("/admin/datasets/reindex/bulk",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filter:e,...t??{}})},!0)}async function xJ(e){let t=e?.limit??15;return F(`/admin/datasets/hed-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function _J(){return F("/admin/datasets/hed-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function vJ(e){let t=e?.limit??50;return F(`/admin/datasets/recording-stats-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function wJ(){return F("/admin/datasets/recording-stats-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function DJ(e){let t=e?.limit??15;return F(`/admin/datasets/signal-defaults-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function EJ(){return F("/admin/datasets/signal-defaults-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function SJ(e){let t=e?.limit??15,r=new URLSearchParams({limit:String(t)});if(e?.olderThan!=null)r.set("older-than",String(e.olderThan));if(e?.before!=null)r.set("before",e.before);return F(`/admin/datasets/data-integrity-sweep?${r.toString()}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function $J(){return F("/admin/datasets/data-integrity-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function CJ(e,t){let r=t?.write?"":"?dry_run=1";return F(`/admin/datasets/${e}/availability-report${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function kJ(e){let t=e?.limit??30,r=new URLSearchParams({limit:String(t)});if(e?.missingOnly)r.set("missing-only","1");return F(`/admin/datasets/availability-report-sweep?${r.toString()}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function RJ(){return F("/admin/datasets/availability-report-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function AJ(e){let t=new URLSearchParams;if(e?.prefix)t.set("prefix",e.prefix);if(e?.visibility)t.set("visibility",e.visibility);if(e?.limit)t.set("limit",String(e.limit));let r=t.toString()?`?${t.toString()}`:"";return F(`/admin/fleet/drift${r}`,{},!0)}async function jl(e,t){return F(`/admin/datasets/${e}/enforce`,{method:"POST",body:JSON.stringify({dry_run:t})},!0)}async function OJ(e){return F("/admin/datasets/enforce/bulk",{method:"POST",body:JSON.stringify({prefix:e.prefix,visibility:e.visibility,limit:e.limit,dry_run:e.dryRun})},!0)}async function FJ(e,t=!1){return F(`/admin/datasets/${e}/revalidate${t?"?force=true":""}`,{method:"POST"},!0)}async function PJ(e){let t=e?`?user=${encodeURIComponent(e)}`:"";return F(`/admin/email-preferences${t}`,{},!0)}async function IJ(e,t){let r=t?`?user=${encodeURIComponent(t)}`:"";return F(`/admin/email-preferences${r}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)},!0)}async function LE(e){return F("/admin/notify",{method:"POST",body:JSON.stringify(e)},!0)}async function TJ(){return F("/admin/summary/coverage",{},!0)}async function NJ(e,t,r){return F("/admin/manifest/dispatch",{method:"POST",body:JSON.stringify({dataset_id:e,version:t,skip_canary:r?.skipCanary??!1})},!0)}async function BE(e){return F("/admin/doctor/scan",{method:"POST",body:JSON.stringify({...e?.check&&{check:e.check},...e?.datasetId&&{dataset_id:e.datasetId}})},!0)}async function UE(e){return F("/admin/doctor/fix",{method:"POST",body:JSON.stringify({check:e.check,...e.datasetId&&{dataset_id:e.datasetId},...e.dryRun&&{dry_run:!0}})},!0)}async function jJ(){return F("/admin/zarr-catalog/publish",{method:"POST"},!0)}async function qJ(e){return F("/admin/neurobagel/regenerate",{method:"POST",body:JSON.stringify(e)},!0)}async function MJ(){return F("/admin/neurobagel/status",{method:"GET"},!0)}async function LJ(){return F("/admin/neurobagel/verify",{method:"POST",body:"{}"},!0)}async function BJ(e){let t=new URLSearchParams;if(e?.limit!=null)t.set("limit",String(e.limit));let r=t.toString()?`?${t.toString()}`:"";return F(`/admin/datasets/zarr-fidelity-sweep${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function UJ(e){let t=new URLSearchParams;if(e?.limit!=null)t.set("limit",String(e.limit));if(e?.apply)t.set("apply","1");let r=t.toString()?`?${t.toString()}`:"";return F(`/admin/imports/issue-triage${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function zJ(e){let t=e?.apply?"?apply=1":"";return F(`/admin/imports/coverage-sweep${t}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function VJ(e){let t=e?.apply?"?apply=1":"";return F(`/admin/imports/weekly-summary${t}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function GJ(e){return F("/admin/users/backfill-names",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apply:e?.apply??!1,...e?.limit!=null?{limit:e.limit}:{}})},!0)}async function HJ(e){return F("/admin/users/backfill-usernames",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apply:e?.apply??!1,...e?.limit!=null?{limit:e.limit}:{}})},!0)}async function WJ(){return F("/admin/users/duplicates",{},!0,Kq)}async function KJ(e){return F(`/admin/users/${e}/clear-identity-conflict`,{method:"POST"},!0,Yq)}async function YJ(e){let t=new URLSearchParams;if(e?.limit!=null)t.set("limit",String(e.limit));let r=t.toString()?`?${t.toString()}`:"";return F(`/admin/datasets/anonymity-sweep${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function JJ(){return F("/admin/datasets/anonymity-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}var ql=O(()=>{al();ki()});async function fr(e,t){return F(`/datasets/${e}/upload-credentials`,{method:"POST",body:JSON.stringify({duration_seconds:t})},!0)}async function zE(e,t){return F(`/datasets/${e}/download-credentials`,{method:"POST",body:JSON.stringify({duration_seconds:t})},!0)}async function XJ(e){return F(`/admin/datasets/${e}/files`,{},!0)}async function ZJ(e){let t,r=0,n=[],o=!0;while(o){let i=await F(`/admin/datasets/${e}/s3-lock`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({continuation_token:t})},!0);if(r+=i.locked,i.failed?.length)n.push(...i.failed);if(o=i.hasMore,t=i.continuation_token,o&&!t)throw new L(500,"S3 lock paginated response missing continuation_token; aborting to avoid infinite loop")}return{locked:r,failed:n}}var Ai=O(()=>{ki();It()});async function U0(e){return F(`/datasets/${e}/ci/status`,{},!0)}async function QJ(e){return F(`/datasets/${e}/manifest`,{},!0)}async function z0(e,t){return F(`/datasets/${e}/manifest/${t}`,{},!0)}function eX(e){let t=e;if(!t.status)t.status="active";else if(!["active","archived","deleted"].includes(t.status))throw Error(`Invalid dataset status: ${t.status}`);if(!t.visibility)t.visibility="private";else if(!["public","private"].includes(t.visibility))throw Error(`Invalid dataset visibility: ${t.visibility}`);return t}async function qs(e={}){let t=new URLSearchParams;if(e.mine)t.set("mine","true");if(e.search)t.set("search",e.search);if(e.modality)t.set("modality",e.modality);if(e.author)t.set("author",e.author);if(e.task)t.set("task",e.task);if(e.license)t.set("license",e.license);if(e.hasDoi)t.set("has_doi","true");if(e.hasHed)t.set("has_hed","1");if(e.hasZarr)t.set("has_zarr","1");if(e.hasZarrVerified)t.set("has_zarr_verified","1");if(e.dataComplete)t.set("data_complete","1");if(e.recent)t.set("recent",String(e.recent));if(e.sort)t.set("sort",e.sort);if(e.limit!=null)t.set("limit",String(e.limit));if(e.offset!=null)t.set("offset",String(e.offset));if(e.owner)t.set("owner",e.owner);if(e.facets)for(let[o,i]of Object.entries(e.facets))t.set(o,i);if(e.includeUnknown)t.set("include_unknown","1");let r=t.toString()?`?${t.toString()}`:"",n=await F(`/datasets${r}`,{},e.mine?!0:"optional");return n.datasets=n.datasets.map(eX),n}async function tX(e){return F(`/datasets/resolve/${e}`,{},"optional")}async function rX(){return F("/datasets/facets",{signal:AbortSignal.timeout(5000)},"optional",jh)}async function nX(e,t={}){let r=new URLSearchParams({q:e});if(t.modality)r.set("modality",t.modality);if(t.limit)r.set("limit",String(t.limit));if(t.hasHed)r.set("has_hed","1");if(t.hasZarr)r.set("has_zarr","1");if(t.hasZarrVerified)r.set("has_zarr_verified","1");if(t.author)r.set("author",t.author);if(t.task)r.set("task",t.task);if(t.license)r.set("license",t.license);if(t.hasDoi)r.set("has_doi","true");if(t.dataComplete)r.set("data_complete","1");if(t.recent)r.set("recent",String(t.recent));if(t.facets)for(let[o,i]of Object.entries(t.facets))r.set(o,i);if(t.includeUnknown)r.set("include_unknown","1");return await F(`/datasets/search?${r.toString()}`,{},"optional",Gq)}async function Tt(e){let t=await F(`/datasets/${e}`,{},"optional");return eX(t.dataset)}async function oX(e){return F(`/datasets/${e}/versions`,{},!0)}async function V0(e){return F("/datasets",{method:"POST",body:JSON.stringify(e)},!0)}async function G0(e){return F(`/datasets/${e}/finalize`,{method:"POST"},!0)}async function VE(e){return F(`/datasets/${e}/request-access`,{method:"POST"},!0)}async function iX(e,t){let r=t?`?status=${t}`:"";return F(`/datasets/${e}/access-requests${r}`,{},!0)}async function sX(e,t){return F(`/datasets/${e}/access-requests/${t}/approve`,{method:"POST"},!0)}async function aX(e,t){return F(`/datasets/${e}/access-requests/${t}/deny`,{method:"POST"},!0)}async function cX(e,t){return F(`/datasets/${e}/invite`,{method:"POST",body:JSON.stringify({username:t})},!0)}async function lX(e){return F(`/datasets/${e}/collaborators`,{},!0)}async function uX(e,t){return F(`/admin/datasets/${e}/enrichment`,{method:"POST",body:JSON.stringify(t)},!0)}var B0;var Ms=O(()=>{al();ki();B0=/^\d{4}-\d{4}-\d{4}-\d{3}[\dX]$/});var hX=1e4;async function Ml(e,t={}){return F(`/datasets/${e}/publish/request`,t.anonymous?{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({anonymous:!0})}:{method:"POST"},!0)}async function H0(e){return F(`/datasets/${e}/publish/status`,{},!0)}async function yX(e){return F(`/datasets/${e}/publish/resend`,{method:"POST"},!0)}async function bX(e){let t=e?`?status=${e}`:"";return F(`/admin/publish/requests${t}`,{},!0)}async function xX(e,t){return F(`/admin/publish/${e}/deny`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({reason:t})},!0)}function NBe(e,t=[]){if(e){let r=vs.indexOf(e);if(r>=0)return r+1}return Math.min(t.length+1,vs.length)}function jBe(e){if(!(e instanceof L))return!1;if(e.statusCode===0)return!0;if(e.statusCode===429)return!0;if(e.statusCode>=500&&e.statusCode<600)return!0;if(e.statusCode===403&&/repository has been locked/i.test(e.message))return!0;return!1}async function Ll(e,t=!1,r=!1,n=!1,o,i){let a=hX,c,u,d=0,f=!1,m,p=t,h=[],g;function b(x,v,S,R){if(!i)return;i({step:x,stepIndex:NBe(x,v),stepTotal:vs.length,s3LockLocked:S,s3LockTotal:R,s3LockResumed:x==="s3_lock"&&f?!0:void 0})}for(let x=1;x<=5;x++)try{let v,S=!0;do{if(v=await F(`/admin/publish/${e}/approve`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({resume:S?p:!0,sandbox:r,s3_lock_continuation_token:c,s3_lock_total:u,skip_ci_check:n})},!0),S=!1,v.step_results)h.push(...v.step_results);if(v.s3_lock_total!==void 0)u=v.s3_lock_total;if(v.s3_lock_batch_count!==void 0)d+=v.s3_lock_batch_count;let R=v.step??v.step_results?.[v.step_results.length-1]?.step;if(R&&(R!==m||R==="s3_lock"))b(R,v.steps_completed??[],R==="s3_lock"?d:void 0,R==="s3_lock"?u:void 0),m=R;if(v.hasMore&&v.s3_lock_continuation_token!==void 0)c=v.s3_lock_continuation_token;else break}while(v.hasMore);if(h.length>0)v.step_results=gX(h);return v}catch(v){if(g=v,x===5||!jBe(v)){if(v instanceof L&&h.length>0)v.stepResults=gX(h);throw v}let R=v;if(o?.({attempt:x,maxAttempts:5,delayMs:a,step:R.step,error:R.message}),await new Promise((E)=>setTimeout(E,a)),p=!0,c!==void 0)f=!0}throw g}function gX(e){let t=new Map;for(let r of e)t.set(r.step,r);return Array.from(t.values())}var Kf=O(()=>{Zh();ki();It()});function BX(e,t){return e.filter((r)=>r.visibility==="public").map((r)=>r.dataset_id).filter((r)=>r.startsWith("nm")||r.startsWith("on")).filter((r)=>r!=="nm099999"&&!Oi.has(r)).filter((r)=>t.prefix?r.startsWith(t.prefix):!0).sort()}var Oi;var J0=O(()=>{Oi=new Set(["nm000103","nm000104","nm000105","nm000106","nm000107"])});async function zBe(){try{let{exitCode:e,stderr:t}=await C(["ssh","-T","-o","BatchMode=yes","-o","ConnectTimeout=5","git@github.com"]),r=t.includes("successfully authenticated");if(!r)console.warn("SSH test to github.com failed:",{exitCode:e,stderr:t.trim().slice(0,500)});return{works:r,error:r?void 0:t.trim().slice(0,500)}}catch(e){let t=e instanceof Error?e.message:String(e);return console.warn("SSH test exception:",t),{works:!1,error:t}}}async function Na(){try{let{stdout:e,exitCode:t,stderr:r}=await C(["gh","auth","token"]);if(t!==0)return console.warn("gh CLI returned non-zero exit code:",t),console.warn("stderr:",r),{token:null,error:`gh auth token failed: ${r.trim()||"unknown error"}`};if(!e.trim())return console.warn("gh auth token returned empty output"),{token:null,error:"gh CLI returned empty token"};return{token:e.trim()}}catch(e){let t=e instanceof Error?e.message:String(e);if(console.error("Failed to get GitHub token from gh CLI:",t),t.includes("ENOENT")||t.includes("not found"))return{token:null,error:"gh CLI not installed (command not found)"};return{token:null,error:`gh CLI error: ${t}`}}}async function X0(e){try{let{stdout:t,exitCode:r,stderr:n}=await C(["gh","api","user","--jq",".login"]);if(r!==0){if(n.includes("not logged in")||n.includes("auth login"))return{authenticated:!1,error:"gh CLI not authenticated. Run 'gh auth login' to authenticate."};return{authenticated:!1,error:`gh CLI error: ${n.trim()||"unknown error"}`}}let o=t.trim();if(!o)return{authenticated:!1,error:"gh CLI returned empty username"};if(e){let i=o.toLowerCase()===e.toLowerCase();return{authenticated:!0,username:o,matches:i,error:i?void 0:`gh CLI authenticated as '${o}', expected '${e}'`}}return{authenticated:!0,username:o}}catch(t){let r=t instanceof Error?t.message:String(t);if(r.includes("ENOENT")||r.includes("not found"))return{authenticated:!1,error:"gh CLI not installed. Install from https://cli.github.com/"};return{authenticated:!1,error:`Failed to verify gh CLI: ${r}`}}}async function Z0(e){if(!/^[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+$/.test(e))return{accepted:!1,error:`Invalid repository format: ${e}`};let{stdout:t,exitCode:r,stderr:n}=await C(["gh","api","/user/repository_invitations"]);if(r!==0){if(n.includes("not logged in")||n.includes("auth login"))return{accepted:!1,error:"gh CLI not authenticated. Run 'gh auth login' to authenticate."};if(n.includes("API rate limit")||n.includes("403"))return{accepted:!1,error:"GitHub API rate limit exceeded. Please try again in a few minutes."};if(n.includes("ENOENT")||n.includes("not found"))return{accepted:!1,error:"gh CLI not installed. Install from https://cli.github.com/"};return{accepted:!1,error:`Failed to list invitations: ${n.trim()||"unknown error"}`}}let o=null;try{o=JSON.parse(t||"[]").find((u)=>u.repository.full_name===e)?.id??null}catch(a){let c=a instanceof Error?a.message:String(a);return console.error("Failed to parse GitHub invitations response:",c),console.error(" Raw response (first 500 chars):",(t||"").slice(0,500)),{accepted:!1,error:`Failed to parse GitHub API response: ${c}`}}if(!o){let{exitCode:a}=await C(["gh","api",`/repos/${e}`,"--silent"]);if(a===0)return{accepted:!0,alreadyCollaborator:!0};return{accepted:!1,error:`No pending invitation found for ${e}. You may need to accept it manually via GitHub.`}}let{exitCode:i,stderr:s}=await C(["gh","api","--method","PATCH",`/user/repository_invitations/${o}`]);if(i!==0)return{accepted:!1,error:`Failed to accept invitation: ${s.trim()||"unknown error"}`};return{accepted:!0}}async function Bo(e,t,r="origin"){let n=t;if(process.env.GH_TOKEN&&t.startsWith("git@github.com:")){let o=process.env.GH_TOKEN.trim();if(!o||/\s/.test(o))return{success:!1,error:"GH_TOKEN environment variable is set but appears malformed (empty or contains whitespace)"};n=`https://github.com/${t.replace("git@github.com:","")}`,await C(["git","config","credential.https://github.com.helper",`!printf 'username=x-access-token\\npassword=${o}'`],{cwd:e})}else if(t.startsWith("git@github.com:")){let o=t.replace("git@github.com:",""),i=await Na();if(i.token)n=`https://github.com/${o}`,await C(["git","config","credential.https://github.com.helper",`!printf 'username=x-access-token\\npassword=${i.token}'`],{cwd:e});else{let s=await zBe();if(s.works)n=t;else return{success:!1,error:`GitHub authentication not configured.
|
|
113
|
+
`)}var HY=!1;var OE=O(()=>{Ze()});function M0(){if(process.env.TEST_API_URL)return process.env.TEST_API_URL;if(PE)return FE;return ot().apiUrl||FE}async function F(e,t={},r=!1,n){let o=`${M0()}${e}`,i={"Content-Type":"application/json","X-CLI-Version":Ci,...t.headers};if(r){let m=ot();if(!m.apiKey&&r===!0)throw new L(401,"Not authenticated. Run 'nemar auth login' first.");if(m.apiKey)i.Authorization=`Bearer ${m.apiKey}`}let s=t.method||"GET",a=typeof t.body==="string"?t.body:void 0,c=Date.now(),u;try{u=await fetch(o,{...t,headers:i})}catch(m){if(Ta())N0({method:s,url:o,status:null,durationMs:Date.now()-c,requestHeaders:i,requestBody:a,error:m instanceof Error?m.message:String(m)});throw new L(0,`Network error: Could not connect to ${M0()}`,{originalError:m instanceof Error?m.message:String(m)})}let d;try{d=await u.text()}catch(m){if(Ta())N0({method:s,url:o,status:u.status,durationMs:Date.now()-c,requestHeaders:i,requestBody:a,error:m instanceof Error?m.message:String(m)});throw new L(0,"Failed to read response body",{httpStatus:u.status,originalError:m instanceof Error?m.message:String(m)})}if(Ta())N0({method:s,url:o,status:u.status,durationMs:Date.now()-c,requestHeaders:i,requestBody:a,responseBody:d});let f;try{f=JSON.parse(d)}catch{throw new L(u.status,`Invalid response from server (status ${u.status})`)}if(!u.ok){if(u.status===503&&(f.mode==="read-only"||f.mode==="full")){let R=typeof f.message==="string"?f.message:"NEMAR is in maintenance mode. Please retry shortly.",E=typeof f.eta==="string"?f.eta:null,P=new Ns(f.mode,R,E,f.details);throw q0(P),P}let m=typeof f.block_reason==="string",p=Array.isArray(f.missing)?f.missing.filter((R)=>typeof R==="string"):void 0,h=typeof f.error==="string"&&(Lq.includes(f.error)||Wq.includes(f.error)),g=typeof f.error==="string"&&(qh.options.includes(f.error)||Zq.includes(f.error)),b=typeof f.error==="string"&&Iq.includes(f.error),v=m||h||g||b||p!==void 0&&typeof f.error==="string"&&Mq.includes(f.error)?f.message||f.error:f.error||f.message;if(u.status===404&&f.error==="Not Found"&&typeof f.message==="string")v=`${f.message}. This NEMAR backend does not support this command yet.`;let S=new L(u.status,v||"Request failed",f.details,typeof f.step==="string"?f.step:void 0,m?f.block_reason:void 0,p);if(typeof f.error==="string")S.code=f.error;if(typeof f.reason==="string")S.reason=f.reason;throw S.rawBody=f,S}if(n){let m=n.safeParse(f);if(!m.success)throw new L(u.status,`Response for ${e} did not match the expected NEMAR contract`,{issues:m.error.issues});return m.data}return f}var FE="https://api.nemar.org",PE;var ki=O(()=>{Bh();Ow();kd();Lo();Mo();OE();Mf();It();PE=FE.includes("workers.dev")});function L0(e){if(e.service_access===void 0||e.service_access===null)return"unknown";return e.service_access?"upload":"browse"}async function WY(e,t,r,n){let o=new URLSearchParams;if(e)o.set("status",e);if(t)o.set("role",t);if(r)o.set("awaiting_approval","1");if(n)o.set("kind",n);let i=o.toString()?`?${o.toString()}`:"";return F(`/admin/users${i}`,{},!0,jq)}async function KY(e){return F(`/admin/approve/${e}`,{method:"POST"},!0)}async function YY(e){return F(`/admin/approve/by-id/${e}`,{method:"POST"},!0)}async function JY(e){return F(`/admin/revoke/${e}`,{method:"POST"},!0)}async function XY(e){return F(`/admin/revoke/by-id/${e}`,{method:"POST"},!0)}async function ZY(e,t){return F(`/admin/users/${e}/role`,{method:"POST",body:JSON.stringify({role:t})},!0)}async function QY(e,t){return F(`/admin/users/${e}/kind`,{method:"POST",body:JSON.stringify({kind:t})},!0)}async function eJ(e){return F(`/admin/users/${e}`,{},!0)}async function tJ(e,t){return F(`/admin/users/${e}/keys`,{method:"POST",body:JSON.stringify({name:t})},!0,Lh)}async function rJ(e){return F(`/admin/users/${e}/keys`,{},!0,Mh)}async function nJ(e,t){return F(`/admin/users/${e}/keys/${t}`,{method:"DELETE"},!0)}async function IE(e,t){return F(`/admin/datasets/${e}/visibility`,{method:"PATCH",body:JSON.stringify({visibility:t})},!0)}async function oJ(e){return F(`/datasets/${e}/publish`,{method:"POST"},!0)}async function iJ(e){return F(`/admin/datasets/${e}/ci`,{},!0)}async function Ri(e){return F(`/admin/datasets/${e}/ci`,{method:"POST"},!0)}async function TE(e){return F(`/admin/datasets/${e}/ci/validate`,{method:"POST"},!0)}async function NE(e){return F(`/admin/datasets/${e}/ci/sync`,{method:"POST"},!0)}async function sJ(e,t){return F(`/admin/datasets/${e}/doi/concept`,{method:"POST",body:JSON.stringify(t)},!0)}async function Wf(e){return F(`/admin/datasets/${e}/doi`,{},!0)}async function jE(e,t){return F(`/admin/datasets/${e}/doi/update`,{method:"POST",body:JSON.stringify(t)},!0)}async function aJ(e,t){return F(`/admin/datasets/${e}/withdraw`,{method:"POST",body:JSON.stringify({reason:t.reason,dry_run:t.dryRun})},!0)}async function cJ(e,t){return F(`/admin/datasets/${e}/restore`,{method:"POST",body:JSON.stringify({dry_run:t.dryRun})},!0)}async function lJ(e){return F(`/admin/datasets/${e}/reset`,{method:"POST"},!0)}async function uJ(e,t=!1){return F(`/admin/datasets/${e}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:t})},!0)}async function dJ(e){return F("/admin/datasets/bulk-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataset_ids:e})},!0)}async function fJ(e){return F("/admin/datasets/import",{method:"POST",body:JSON.stringify(e)},!0)}async function pJ(e){return F("/admin/datasets/exemplar",{method:"POST",body:JSON.stringify(e)},!0)}async function mJ(e){return F(`/admin/datasets/${e}/exemplar/remint-dois`,{method:"POST"},!0)}async function qE(e,t){let r=new URLSearchParams;if(e)r.set("status",e);if(t!==void 0)r.set("blocklisted",t?"1":"0");let n=r.toString();return F(`/admin/imports${n?`?${n}`:""}`,{},!0)}async function hJ(e){return F(`/admin/imports/${e}/rollback`,{method:"POST"},!0)}async function gJ(e){return F(`/admin/imports/${e}/retry`,{method:"POST"},!0)}async function ME(e){return F(`/admin/imports/${e}/verify`,{method:"POST"},!0)}async function yJ(e){return F("/admin/imports/dispatch-cooldown",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataset_ids:e})},!0)}async function Nl(e,t){return F(`/admin/datasets/${e}/reindex`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t??{})},!0)}async function bJ(e,t){return F("/admin/datasets/reindex/bulk",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filter:e,...t??{}})},!0)}async function xJ(e){let t=e?.limit??15;return F(`/admin/datasets/hed-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function _J(){return F("/admin/datasets/hed-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function vJ(e){let t=e?.limit??50;return F(`/admin/datasets/recording-stats-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function wJ(){return F("/admin/datasets/recording-stats-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function DJ(e){let t=e?.limit??15;return F(`/admin/datasets/signal-defaults-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function EJ(){return F("/admin/datasets/signal-defaults-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function SJ(e){let t=e?.limit??15,r=new URLSearchParams({limit:String(t)});if(e?.olderThan!=null)r.set("older-than",String(e.olderThan));if(e?.before!=null)r.set("before",e.before);return F(`/admin/datasets/data-integrity-sweep?${r.toString()}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function $J(){return F("/admin/datasets/data-integrity-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function CJ(e,t){let r=t?.write?"":"?dry_run=1";return F(`/admin/datasets/${e}/availability-report${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function kJ(e){let t=e?.limit??30,r=new URLSearchParams({limit:String(t)});if(e?.missingOnly)r.set("missing-only","1");return F(`/admin/datasets/availability-report-sweep?${r.toString()}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function RJ(){return F("/admin/datasets/availability-report-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function AJ(e){let t=new URLSearchParams;if(e?.prefix)t.set("prefix",e.prefix);if(e?.visibility)t.set("visibility",e.visibility);if(e?.limit)t.set("limit",String(e.limit));let r=t.toString()?`?${t.toString()}`:"";return F(`/admin/fleet/drift${r}`,{},!0)}async function jl(e,t){return F(`/admin/datasets/${e}/enforce`,{method:"POST",body:JSON.stringify({dry_run:t})},!0)}async function OJ(e){return F("/admin/datasets/enforce/bulk",{method:"POST",body:JSON.stringify({prefix:e.prefix,visibility:e.visibility,limit:e.limit,dry_run:e.dryRun})},!0)}async function FJ(e,t=!1){return F(`/admin/datasets/${e}/revalidate${t?"?force=true":""}`,{method:"POST"},!0)}async function PJ(e){let t=e?`?user=${encodeURIComponent(e)}`:"";return F(`/admin/email-preferences${t}`,{},!0)}async function IJ(e,t){let r=t?`?user=${encodeURIComponent(t)}`:"";return F(`/admin/email-preferences${r}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)},!0)}async function LE(e){return F("/admin/notify",{method:"POST",body:JSON.stringify(e)},!0)}async function TJ(){return F("/admin/summary/coverage",{},!0)}async function NJ(e,t,r){return F("/admin/manifest/dispatch",{method:"POST",body:JSON.stringify({dataset_id:e,version:t,skip_canary:r?.skipCanary??!1})},!0)}async function BE(e){return F("/admin/doctor/scan",{method:"POST",body:JSON.stringify({...e?.check&&{check:e.check},...e?.datasetId&&{dataset_id:e.datasetId}})},!0)}async function UE(e){return F("/admin/doctor/fix",{method:"POST",body:JSON.stringify({check:e.check,...e.datasetId&&{dataset_id:e.datasetId},...e.dryRun&&{dry_run:!0}})},!0)}async function jJ(){return F("/admin/zarr-catalog/publish",{method:"POST"},!0)}async function qJ(e){return F("/admin/neurobagel/regenerate",{method:"POST",body:JSON.stringify(e)},!0)}async function MJ(){return F("/admin/neurobagel/status",{method:"GET"},!0)}async function LJ(){return F("/admin/neurobagel/verify",{method:"POST",body:"{}"},!0)}async function BJ(e){let t=new URLSearchParams;if(e?.limit!=null)t.set("limit",String(e.limit));let r=t.toString()?`?${t.toString()}`:"";return F(`/admin/datasets/zarr-fidelity-sweep${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function UJ(e){let t=new URLSearchParams;if(e?.limit!=null)t.set("limit",String(e.limit));if(e?.apply)t.set("apply","1");let r=t.toString()?`?${t.toString()}`:"";return F(`/admin/imports/issue-triage${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function zJ(e){let t=e?.apply?"?apply=1":"";return F(`/admin/imports/coverage-sweep${t}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function VJ(e){let t=e?.apply?"?apply=1":"";return F(`/admin/imports/weekly-summary${t}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function GJ(e){return F("/admin/users/backfill-names",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apply:e?.apply??!1,...e?.limit!=null?{limit:e.limit}:{}})},!0)}async function HJ(e){return F("/admin/users/backfill-usernames",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apply:e?.apply??!1,...e?.limit!=null?{limit:e.limit}:{}})},!0)}async function WJ(){return F("/admin/users/duplicates",{},!0,Kq)}async function KJ(e){return F(`/admin/users/${e}/clear-identity-conflict`,{method:"POST"},!0,Yq)}async function YJ(e){let t=new URLSearchParams;if(e?.limit!=null)t.set("limit",String(e.limit));let r=t.toString()?`?${t.toString()}`:"";return F(`/admin/datasets/anonymity-sweep${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function JJ(){return F("/admin/datasets/anonymity-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}var ql=O(()=>{al();ki()});async function fr(e,t){return F(`/datasets/${e}/upload-credentials`,{method:"POST",body:JSON.stringify({duration_seconds:t})},!0)}async function zE(e,t){return F(`/datasets/${e}/download-credentials`,{method:"POST",body:JSON.stringify({duration_seconds:t})},!0)}async function XJ(e){return F(`/admin/datasets/${e}/files`,{},!0)}async function ZJ(e){let t,r=0,n=[],o=!0;while(o){let i=await F(`/admin/datasets/${e}/s3-lock`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({continuation_token:t})},!0);if(r+=i.locked,i.failed?.length)n.push(...i.failed);if(o=i.hasMore,t=i.continuation_token,o&&!t)throw new L(500,"S3 lock paginated response missing continuation_token; aborting to avoid infinite loop")}return{locked:r,failed:n}}var Ai=O(()=>{ki();It()});async function U0(e){return F(`/datasets/${e}/ci/status`,{},!0)}async function QJ(e){return F(`/datasets/${e}/manifest`,{},!0)}async function z0(e,t){return F(`/datasets/${e}/manifest/${t}`,{},!0)}function eX(e){let t=e;if(!t.status)t.status="active";else if(!["active","archived","deleted"].includes(t.status))throw Error(`Invalid dataset status: ${t.status}`);if(!t.visibility)t.visibility="private";else if(!["public","private"].includes(t.visibility))throw Error(`Invalid dataset visibility: ${t.visibility}`);return t}async function qs(e={}){let t=new URLSearchParams;if(e.mine)t.set("mine","true");if(e.search)t.set("search",e.search);if(e.modality)t.set("modality",e.modality);if(e.author)t.set("author",e.author);if(e.task)t.set("task",e.task);if(e.license)t.set("license",e.license);if(e.hasDoi)t.set("has_doi","true");if(e.hasHed)t.set("has_hed","1");if(e.hasZarr)t.set("has_zarr","1");if(e.hasZarrVerified)t.set("has_zarr_verified","1");if(e.dataComplete)t.set("data_complete","1");if(e.recent)t.set("recent",String(e.recent));if(e.sort)t.set("sort",e.sort);if(e.limit!=null)t.set("limit",String(e.limit));if(e.offset!=null)t.set("offset",String(e.offset));if(e.owner)t.set("owner",e.owner);if(e.facets)for(let[o,i]of Object.entries(e.facets))t.set(o,i);if(e.includeUnknown)t.set("include_unknown","1");let r=t.toString()?`?${t.toString()}`:"",n=await F(`/datasets${r}`,{},e.mine?!0:"optional");return n.datasets=n.datasets.map(eX),n}async function tX(e){return F(`/datasets/resolve/${e}`,{},"optional")}async function rX(){return F("/datasets/facets",{signal:AbortSignal.timeout(5000)},"optional",jh)}async function nX(e,t={}){let r=new URLSearchParams({q:e});if(t.modality)r.set("modality",t.modality);if(t.limit)r.set("limit",String(t.limit));if(t.hasHed)r.set("has_hed","1");if(t.hasZarr)r.set("has_zarr","1");if(t.hasZarrVerified)r.set("has_zarr_verified","1");if(t.author)r.set("author",t.author);if(t.task)r.set("task",t.task);if(t.license)r.set("license",t.license);if(t.hasDoi)r.set("has_doi","true");if(t.dataComplete)r.set("data_complete","1");if(t.recent)r.set("recent",String(t.recent));if(t.facets)for(let[o,i]of Object.entries(t.facets))r.set(o,i);if(t.includeUnknown)r.set("include_unknown","1");return await F(`/datasets/search?${r.toString()}`,{},"optional",Gq)}async function Tt(e){let t=await F(`/datasets/${e}`,{},"optional");return eX(t.dataset)}async function oX(e){return F(`/datasets/${e}/versions`,{},!0)}async function V0(e){return F("/datasets",{method:"POST",body:JSON.stringify(e)},!0)}async function G0(e){return F(`/datasets/${e}/finalize`,{method:"POST"},!0)}async function VE(e){return F(`/datasets/${e}/request-access`,{method:"POST"},!0)}async function iX(e,t){let r=t?`?status=${t}`:"";return F(`/datasets/${e}/access-requests${r}`,{},!0)}async function sX(e,t){return F(`/datasets/${e}/access-requests/${t}/approve`,{method:"POST"},!0)}async function aX(e,t){return F(`/datasets/${e}/access-requests/${t}/deny`,{method:"POST"},!0)}async function cX(e,t){return F(`/datasets/${e}/invite`,{method:"POST",body:JSON.stringify({username:t})},!0)}async function lX(e){return F(`/datasets/${e}/collaborators`,{},!0)}async function uX(e,t){return F(`/admin/datasets/${e}/enrichment`,{method:"POST",body:JSON.stringify(t)},!0)}var B0;var Ms=O(()=>{al();ki();B0=/^\d{4}-\d{4}-\d{4}-\d{3}[\dX]$/});var hX=1e4;async function Ml(e,t={}){return F(`/datasets/${e}/publish/request`,t.anonymous?{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({anonymous:!0})}:{method:"POST"},!0)}async function H0(e){return F(`/datasets/${e}/publish/status`,{},!0)}async function yX(e){return F(`/datasets/${e}/publish/resend`,{method:"POST"},!0)}async function bX(e){let t=e?`?status=${e}`:"";return F(`/admin/publish/requests${t}`,{},!0)}async function xX(e,t){return F(`/admin/publish/${e}/deny`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({reason:t})},!0)}function NBe(e,t=[]){if(e){let r=vs.indexOf(e);if(r>=0)return r+1}return Math.min(t.length+1,vs.length)}function jBe(e){if(!(e instanceof L))return!1;if(e.statusCode===0)return!0;if(e.statusCode===429)return!0;if(e.statusCode>=500&&e.statusCode<600)return!0;if(e.statusCode===403&&/repository has been locked/i.test(e.message))return!0;return!1}async function Ll(e,t=!1,r=!1,n=!1,o,i){let a=hX,c,u,d=0,f=!1,m,p=t,h=[],g;function b(x,v,S,R){if(!i)return;i({step:x,stepIndex:NBe(x,v),stepTotal:vs.length,s3LockLocked:S,s3LockTotal:R,s3LockResumed:x==="s3_lock"&&f?!0:void 0})}for(let x=1;x<=5;x++)try{let v,S=!0;do{if(v=await F(`/admin/publish/${e}/approve`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({resume:S?p:!0,sandbox:r,s3_lock_continuation_token:c,s3_lock_total:u,skip_ci_check:n})},!0),S=!1,v.step_results)h.push(...v.step_results);if(v.s3_lock_total!==void 0)u=v.s3_lock_total;if(v.s3_lock_batch_count!==void 0)d+=v.s3_lock_batch_count;let R=v.step??v.step_results?.[v.step_results.length-1]?.step;if(R&&(R!==m||R==="s3_lock"))b(R,v.steps_completed??[],R==="s3_lock"?d:void 0,R==="s3_lock"?u:void 0),m=R;if(v.hasMore&&v.s3_lock_continuation_token!==void 0)c=v.s3_lock_continuation_token;else break}while(v.hasMore);if(h.length>0)v.step_results=gX(h);return v}catch(v){if(g=v,x===5||!jBe(v)){if(v instanceof L&&h.length>0)v.stepResults=gX(h);throw v}let R=v;if(o?.({attempt:x,maxAttempts:5,delayMs:a,step:R.step,error:R.message}),await new Promise((E)=>setTimeout(E,a)),p=!0,c!==void 0)f=!0}throw g}function gX(e){let t=new Map;for(let r of e)t.set(r.step,r);return Array.from(t.values())}var Kf=O(()=>{Zh();ki();It()});function BX(e,t){return e.filter((r)=>r.visibility==="public").map((r)=>r.dataset_id).filter((r)=>r.startsWith("nm")||r.startsWith("on")).filter((r)=>r!=="nm099999"&&!Oi.has(r)).filter((r)=>t.prefix?r.startsWith(t.prefix):!0).sort()}var Oi;var J0=O(()=>{Oi=new Set(["nm000103","nm000104","nm000105","nm000106","nm000107"])});async function zBe(){try{let{exitCode:e,stderr:t}=await C(["ssh","-T","-o","BatchMode=yes","-o","ConnectTimeout=5","git@github.com"]),r=t.includes("successfully authenticated");if(!r)console.warn("SSH test to github.com failed:",{exitCode:e,stderr:t.trim().slice(0,500)});return{works:r,error:r?void 0:t.trim().slice(0,500)}}catch(e){let t=e instanceof Error?e.message:String(e);return console.warn("SSH test exception:",t),{works:!1,error:t}}}async function Na(){try{let{stdout:e,exitCode:t,stderr:r}=await C(["gh","auth","token"]);if(t!==0)return console.warn("gh CLI returned non-zero exit code:",t),console.warn("stderr:",r),{token:null,error:`gh auth token failed: ${r.trim()||"unknown error"}`};if(!e.trim())return console.warn("gh auth token returned empty output"),{token:null,error:"gh CLI returned empty token"};return{token:e.trim()}}catch(e){let t=e instanceof Error?e.message:String(e);if(console.error("Failed to get GitHub token from gh CLI:",t),t.includes("ENOENT")||t.includes("not found"))return{token:null,error:"gh CLI not installed (command not found)"};return{token:null,error:`gh CLI error: ${t}`}}}async function X0(e){try{let{stdout:t,exitCode:r,stderr:n}=await C(["gh","api","user","--jq",".login"]);if(r!==0){if(n.includes("not logged in")||n.includes("auth login"))return{authenticated:!1,error:"gh CLI not authenticated. Run 'gh auth login' to authenticate."};return{authenticated:!1,error:`gh CLI error: ${n.trim()||"unknown error"}`}}let o=t.trim();if(!o)return{authenticated:!1,error:"gh CLI returned empty username"};if(e){let i=o.toLowerCase()===e.toLowerCase();return{authenticated:!0,username:o,matches:i,error:i?void 0:`gh CLI authenticated as '${o}', expected '${e}'`}}return{authenticated:!0,username:o}}catch(t){let r=t instanceof Error?t.message:String(t);if(r.includes("ENOENT")||r.includes("not found"))return{authenticated:!1,error:"gh CLI not installed. Install from https://cli.github.com/"};return{authenticated:!1,error:`Failed to verify gh CLI: ${r}`}}}async function Z0(e){if(!/^[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+$/.test(e))return{accepted:!1,error:`Invalid repository format: ${e}`};let{stdout:t,exitCode:r,stderr:n}=await C(["gh","api","/user/repository_invitations"]);if(r!==0){if(n.includes("not logged in")||n.includes("auth login"))return{accepted:!1,error:"gh CLI not authenticated. Run 'gh auth login' to authenticate."};if(n.includes("API rate limit")||n.includes("403"))return{accepted:!1,error:"GitHub API rate limit exceeded. Please try again in a few minutes."};if(n.includes("ENOENT")||n.includes("not found"))return{accepted:!1,error:"gh CLI not installed. Install from https://cli.github.com/"};return{accepted:!1,error:`Failed to list invitations: ${n.trim()||"unknown error"}`}}let o=null;try{o=JSON.parse(t||"[]").find((u)=>u.repository.full_name===e)?.id??null}catch(a){let c=a instanceof Error?a.message:String(a);return console.error("Failed to parse GitHub invitations response:",c),console.error(" Raw response (first 500 chars):",(t||"").slice(0,500)),{accepted:!1,error:`Failed to parse GitHub API response: ${c}`}}if(!o){let{exitCode:a}=await C(["gh","api",`/repos/${e}`,"--silent"]);if(a===0)return{accepted:!0,alreadyCollaborator:!0};return{accepted:!1,error:`No pending invitation found for ${e}. You may need to accept it manually via GitHub.`}}let{exitCode:i,stderr:s}=await C(["gh","api","--method","PATCH",`/user/repository_invitations/${o}`]);if(i!==0)return{accepted:!1,error:`Failed to accept invitation: ${s.trim()||"unknown error"}`};return{accepted:!0}}async function Bo(e,t,r="origin"){let n=t;if(process.env.GH_TOKEN&&t.startsWith("git@github.com:")){let o=process.env.GH_TOKEN.trim();if(!o||/\s/.test(o))return{success:!1,error:"GH_TOKEN environment variable is set but appears malformed (empty or contains whitespace)"};n=`https://github.com/${t.replace("git@github.com:","")}`,await C(["git","config","credential.https://github.com.helper",`!printf 'username=x-access-token\\npassword=${o}'`],{cwd:e})}else if(t.startsWith("git@github.com:")){let o=t.replace("git@github.com:",""),i=await Na();if(i.token)n=`https://github.com/${o}`,await C(["git","config","credential.https://github.com.helper",`!printf 'username=x-access-token\\npassword=${i.token}'`],{cwd:e});else{let s=await zBe();if(s.works)n=t;else return{success:!1,error:`GitHub authentication not configured.
|
|
114
114
|
|
|
115
115
|
gh CLI failed: ${i.error||"could not get token"}
|
|
116
116
|
SSH failed: ${s.error||"could not connect"}
|