nemar-cli 0.10.15 → 0.10.16-dev.3238
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 +4 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -99,18 +99,18 @@ ${t}`,oAe,sAe,aAe=(e,t,r)=>{let n=r===""?"":`with ${r.trim()}() `,i=iAe.bind(nul
|
|
|
99
99
|
`)}var JS=!1;var{spawn:iHe}=globalThis.Bun;async function k(e,t={}){let r={...process.env,GIT_TERMINAL_PROMPT:"0",...t.env};for(let u of t.unsetEnv??[])delete r[u];let n=iHe({cmd:e,cwd:t.cwd,...t.stdin===void 0?{}:{stdin:new TextEncoder().encode(t.stdin)},stdout:"pipe",stderr:"pipe",env:r}),i=!1,o;if(t.timeout)o=setTimeout(()=>{i=!0,n.kill()},t.timeout);if(XS()){let u=t.cwd?` (cwd=${t.cwd})`:"";$p(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(o)clearTimeout(o);if(XS()){if(s.trim())$p(l.dim(s.trimEnd()));if(a.trim())$p(l.yellow(a.trimEnd()));$p(l.dim(`(exit ${c})`))}if(i)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 Dt=P(()=>{Xe()});function sHe(){if(process.platform==="darwin")return"macos";if(process.platform==="win32")return"windows";return"linux"}function PX(e,t=sHe()){return e.installInstructions[t]}function aHe(e){let t=e.match(/(\d+\.\d+(?:\.\d+)?)/);return t?t[1]:void 0}function lHe(){let e=Number(process.env.TEST_PROBE_TIMEOUT_MS);return Number.isFinite(e)&&e>0?e:cHe}async function TX(e){try{let{exitCode:t,stdout:r,timedOut:n}=await k(e.cmd,{timeout:lHe()});if(n)return{available:!1,timedOut:!0};if(t!==0)return{available:!1};return{available:!0,version:aHe(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 kp(){let e=Object.entries(FX);return Promise.all(e.map(async([t,r])=>{let{available:n,version:i,timedOut:o}=await TX(r);return{key:t,name:r.name,purpose:r.purpose,required:r.required,available:n,version:i,timedOut:o,installInstruction:PX(r)}}))}async function IX(){let t=(await kp()).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 fc(e){let r=oHe[e].map((s)=>FX[s]).filter(Boolean),n=await Promise.all(r.map(async(s)=>{let a=await TX(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 i=n.filter((s)=>!s.available&&!s.timedOut&&s.check.required).map((s)=>({tool:s.check.name,installInstruction:PX(s.check)}));if(i.length===0)return;let o=[`
|
|
101
101
|
Missing required tools:`];for(let s of i)o.push(` ${s.tool} not installed`),o.push(` Install: ${s.installInstruction}`);throw Error(o.join(`
|
|
102
|
-
`))}var FX,oHe,cHe=4000;var Cp=P(()=>{Dt();FX={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)"}}},oHe={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 jX;var NX=P(()=>{jX={name:"nemar-cli",version:"0.10.
|
|
102
|
+
`))}var FX,oHe,cHe=4000;var Cp=P(()=>{Dt();FX={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)"}}},oHe={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 jX;var NX=P(()=>{jX={name:"nemar-cli",version:"0.10.16-dev.3238",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/","lint:scrub":"biome check scripts/scrub shared/identifier-scrub.ts test/scrub","test:scrub":"bun test --preload ./test/scrub/helpers/temp-dirs-preload.ts --path-ignore-patterns='__run_every_scrub_suite__' test/scrub test/identifier-scan.test.ts test/identifier-scrub.test.ts test/identifier-dates.test.ts test/identifier-fleet.test.ts","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 Di;var hu=P(()=>{NX();Di=jX.version});import{mkdirSync as dHe,readdirSync as fHe,unlinkSync as pHe,writeFileSync as mHe}from"fs";import{join as ZS}from"path";function zX(){gu=!0}function pc(){return gu}function VX(e,t=process.env){return e.includes("--debug")||t.NEMAR_DEBUG==="1"}function Ap(e){UX=e,Kt(`Step: ${e}`)}function Op(){LX=!0}function HX(){return LX}function so(){BX=!0}function GX(){return BX}function Kt(e){if(gu)process.stderr.write(`[debug] ${e}
|
|
103
103
|
`)}function bHe(e){let t={};for(let[r,n]of Object.entries(e))t[r]=yHe.has(r.toLowerCase())?"[REDACTED]":n;return t}function KX(e){let t=e.indexOf("@");if(t<=0)return"***";return`${e[0]}***${e.slice(t)}`}function QS(e,t,r=0){if(r>_He)return"[REDACTED: depth]";if(Array.isArray(t))return t.map((n)=>QS(e,n,r+1));if(t&&typeof t==="object"){let n={};for(let[i,o]of Object.entries(t))n[i]=QS(i,o,r+1);return n}if(typeof t==="string"){if(xHe.test(e))return"[REDACTED]";return t.replace(WX,KX)}return t}function e$(e){return e.replace(vHe,"Bearer [REDACTED]").replace(wHe,"[REDACTED_AWS_KEY]").replace(DHe,"$1[REDACTED]").replace(EHe,"$1$2=[REDACTED]").replace(WX,KX)}function SHe(e){return e$(e)}function MX(e,t=gHe){if(e===void 0)return;let r=e;try{let n=JSON.parse(e);r=JSON.stringify(QS("",n))}catch{}if(r=e$(r),Buffer.byteLength(r,"utf8")>t)r=`${Buffer.from(r,"utf8").subarray(0,t).toString("utf8")}... [truncated]`;return r}function By(e){if(!gu)return;let t=SHe(e.url);try{let r={...e,url:t,requestHeaders:e.requestHeaders?bHe(e.requestHeaders):void 0,requestBody:MX(e.requestBody),responseBody:MX(e.responseBody)};Ly.push(r),Kt(`${e.method} ${t} -> ${e.status??"ERROR"} (${e.durationMs}ms)`)}catch(r){let n=q(r);Ly.push({method:e.method,url:t,status:e.status,durationMs:e.durationMs,note:`redaction failed: ${n}`}),Kt(`redaction failed for ${e.method} ${t}: ${n}`)}}async function $He(){let e=[];try{let t=process.versions.bun?`Bun ${process.versions.bun}`:`Node ${process.version}`;e.push(`CLI version: ${Di}`),e.push(`OS/Arch: ${process.platform}/${process.arch}`),e.push(`Runtime: ${t}`)}catch(t){e.push(`(could not read CLI/OS/runtime info: ${q(t)})`)}e.push(""),e.push("Active account:");try{let t=mt();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: ${q(t)})`)}e.push(""),e.push("External tools:");try{let t=await kp();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: ${q(t)})`)}return e}async function t$(){return(await $He()).join(`
|
|
104
104
|
`)}async function YX(){if(!gu||qy!==void 0)return;try{qy=await t$()}catch(e){let t=q(e);qy=`(could not build environment report: ${t})`,Kt(`environment snapshot failed: ${t}`)}}function JX(e){if(qX.has(e))return{flag:e};for(let t of qX){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 kHe(e){let t=[];for(let r=0;r<e.length;r++){let n=e[r],i=JX(n);if(!i){t.push(n);continue}if(i.kind==="long-eq")t.push(`${i.flag}=[REDACTED]`);else if(i.kind==="short-attached")t.push(`${i.flag}[REDACTED]`);else if(t.push(n),r+1<e.length)t.push("[REDACTED]"),r++}return t}function CHe(e){let t=[];for(let r=0;r<e.length;r++){let n=e[r],i=JX(n);if(!i){t.push(n);continue}if(!i.kind&&r+1<e.length)r++}return t}function RHe(e){let t=[];for(let n of CHe(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 AHe(e,t){let r=[];if(r.push("NEMAR CLI Debug Log"),r.push(`Generated: ${new Date().toISOString()}`),r.push(`Command: nemar ${e$(kHe(e).join(" "))}`),r.push(""),r.push(qy??"(environment snapshot unavailable)"),r.push(""),r.push("HTTP requests:"),Ly.length===0)r.push(" (none)");else Ly.forEach((n,i)=>{if(r.push(` [${i+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: ${UX??"(none recorded)"}`),r.push(`Exit code: ${t}`),`${r.join(`
|
|
105
105
|
`)}
|
|
106
106
|
`}function OHe(e,t){let r;try{r=fHe(e).filter((i)=>i.startsWith("nemar-")&&i.endsWith(".log"))}catch(i){if(i.code!=="ENOENT")Kt(`could not list ${e} for log rotation: ${q(i)}`);return}r.sort();let n=r.length-t;for(let i=0;i<n;i++)try{pHe(ZS(e,r[i]))}catch(o){if(o.code!=="ENOENT")Kt(`could not remove old log ${r[i]}: ${q(o)}`)}}function XX(){return Rp}function ZX(e,t){if(!gu)return null;let r=ZS(r$(),"logs");try{dHe(r,{recursive:!0})}catch(s){return Rp=q(s),Kt(`could not create log directory ${r}: ${Rp}`),null}let i=`nemar-${new Date().toISOString().replace(/[:.]/g,"-")}-${RHe(e)}.log`,o=ZS(r,i);try{mHe(o,AHe(e,t),"utf8")}catch(s){return Rp=q(s),Kt(`could not write log file ${o}: ${Rp}`),null}return OHe(r,hHe),o}var hHe=10,gHe=2048,gu=!1,LX=!1,BX=!1,UX,qy,Ly,yHe,xHe,WX,_He=32,vHe,wHe,DHe,EHe,qX,Rp;var zn=P(()=>{Lt();ao();Cp();hu();Ly=[];yHe=new Set(["authorization","cookie","set-cookie","x-api-key"]);xHe=/^(api[_-]?key|apikey|password|token|secret|access[_-]?key(_id)?|secret[_-]?access[_-]?key|session|session[_-]?token|authorization|ssh[_-]?key|private[_-]?key|device[_-]?code)$/i,WX=/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;vHe=/Bearer\s+[A-Za-z0-9\-._~+/=]+/gi,wHe=/\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/g,DHe=/((?:aws_)?secret_access_key["']?\s*[:=]\s*["']?)[A-Za-z0-9/+=]{20,}/gi,EHe=/([?&])(X-Amz-Signature|X-Amz-Security-Token|X-Amz-Credential|Signature|AWSAccessKeyId)=[^&\s"']+/gi;qX=new Set(["-k","--key","--password","--api-key"])});import{chmodSync as FHe,copyFileSync as PHe,existsSync as n$,mkdirSync as THe,statSync as IHe}from"fs";import{homedir as Uy}from"os";import{join as yu}from"path";function jHe(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 r$(){return process.env.NEMAR_CONFIG_DIR||yu(Uy(),".config","nemar")}function qHe(e){if(process.env.NEMAR_CONFIG_DIR)return;let t=yu(e,"config.json");if(n$(t))return;let r=[];if(process.platform==="darwin")r.push(yu(Uy(),"Library","Preferences","nemar-nodejs","config.json"));if(process.platform==="win32"){let n=process.env.APPDATA||yu(Uy(),"AppData","Roaming");r.push(yu(n,"nemar-nodejs","config.json"))}r.push(yu(Uy(),".config","nemar-nodejs","config.json"));for(let n of r)if(n$(n))try{THe(e,{recursive:!0}),PHe(n,t),console.error(`[nemar] Config migrated from ${n} to ${t}
|
|
107
107
|
[nemar] You can safely remove the old file.`);return}catch(i){console.error(`[nemar] Failed to migrate config from ${n}:`,i,`
|
|
108
|
-
[nemar] You can manually copy ${n} to ${t}`)}}function Vn(){let e=r$();if(Fp&&QX===e)return Fp;if(qHe(e),Fp=new My({projectName:"nemar",configFileMode:i$,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}),QX=e,!eZ.has(e))eZ.add(e),LHe(Fp.path),UHe(),zHe();return Fp}function LHe(e){if(process.platform==="win32")return;if(!n$(e))return;try{if((IHe(e).mode&511)!==i$)FHe(e,i$)}catch(t){console.error(`[nemar] could not secure config file permissions for ${e}:`,t)}}function UHe(){let e=Vn(),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 i=n||"default",o={};for(let s of BHe){let a=e.get(s);if(a!==void 0)o[s]=a}e.store={activeAccount:i,accounts:{[i]:o}}}catch(i){console.error("Config migration failed (legacy config preserved):",i)}}function zHe(){let e=Vn(),t=e.store,r=t.accounts,n=!1;if(r)for(let[o,s]of Object.entries(r)){let a=s?.apiUrl;if(!a)continue;if(NHe.has(jHe(a)))r[o]={...s,apiUrl:bu},console.error(`[nemar] migrated stored apiUrl for account "${o}": ${a} -> ${bu}`),n=!0}let i=t.apiUrl;if(r&&Object.keys(r).length>0&&i!==void 0){let{apiUrl:o,...s}=t;try{e.store=s,console.error(`[nemar] removed stale top-level apiUrl from config (was: ${i})`),n=!1}catch(a){console.error("API URL cleanup failed (config file unchanged):",a)}}if(n)try{e.store={...e.store,accounts:r}}catch(o){console.error("API URL migration failed (config file unchanged):",o)}}function Pp(){return Vn().get("activeAccount")}function ca(){return Vn().get("accounts")||{}}function mt(){let e={apiUrl:bu},t=Pp();if(!t)return e;return ca()[t]||e}function Tt(e,t){let r=Vn(),n=r.get("activeAccount")||"default",i=r.get("accounts")||{};if(!i[n])i[n]={apiUrl:bu};i[n][e]=t,r.store={...r.store,accounts:i,activeAccount:n}}function Tp(e){let t=Pp();if(!t)return;let r=ca();if(r[t])delete r[t][e],Vn().set("accounts",r)}function tZ(){let e=Vn(),t=Pp();if(!t){e.clear();return}let r=ca();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 rZ(){Vn().clear()}function Ve(){return!!mt().apiKey}function o$(){return Vn().path}function Ip(){let e=ca(),t=Pp();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 nZ(e){return e.username?.trim()||e.email}function VHe(e){let t=e.trim().toLowerCase();if(!t)return;let r=Object.entries(ca()).filter(([,n])=>n.email&&n.email.toLowerCase()===t).map(([n])=>n);if(r.length>1){Kt(`findAccountKeyByEmail: ${r.length} accounts share email ${t}: ${r.join(", ")}`);return}return r[0]}function iZ(e,t){let r=Vn(),n=ca(),i;if(n[e])i=e;else if(t.email)i=VHe(t.email);let o=i?n[i]:void 0,s={...o??{apiUrl:bu},...t};if(i&&i!==e)delete n[i];return n[e]=s,r.store={...r.store,accounts:n,activeAccount:e},{key:e,previous:o}}function oZ(e){let t=e.trim();if(!t)return"unchanged";let r=Vn(),n=Pp();if(!n||n===t)return"unchanged";let i=ca(),o=i[n];if(!o)return"unchanged";if(i[t])return"key_taken";return delete i[n],i[t]={...o,username:t},r.store={...r.store,accounts:i,activeAccount:t},"renamed"}function s$(e){let t=Vn(),r=ca();if(r[e])return t.store={...t.store,activeAccount:e},r[e];for(let[n,i]of Object.entries(r))if(i.githubUsername===e)return t.store={...t.store,activeAccount:n},i;return null}var bu="https://api.
|
|
108
|
+
[nemar] You can manually copy ${n} to ${t}`)}}function Vn(){let e=r$();if(Fp&&QX===e)return Fp;if(qHe(e),Fp=new My({projectName:"nemar",configFileMode:i$,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}),QX=e,!eZ.has(e))eZ.add(e),LHe(Fp.path),UHe(),zHe();return Fp}function LHe(e){if(process.platform==="win32")return;if(!n$(e))return;try{if((IHe(e).mode&511)!==i$)FHe(e,i$)}catch(t){console.error(`[nemar] could not secure config file permissions for ${e}:`,t)}}function UHe(){let e=Vn(),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 i=n||"default",o={};for(let s of BHe){let a=e.get(s);if(a!==void 0)o[s]=a}e.store={activeAccount:i,accounts:{[i]:o}}}catch(i){console.error("Config migration failed (legacy config preserved):",i)}}function zHe(){let e=Vn(),t=e.store,r=t.accounts,n=!1;if(r)for(let[o,s]of Object.entries(r)){let a=s?.apiUrl;if(!a)continue;if(NHe.has(jHe(a)))r[o]={...s,apiUrl:bu},console.error(`[nemar] migrated stored apiUrl for account "${o}": ${a} -> ${bu}`),n=!0}let i=t.apiUrl;if(r&&Object.keys(r).length>0&&i!==void 0){let{apiUrl:o,...s}=t;try{e.store=s,console.error(`[nemar] removed stale top-level apiUrl from config (was: ${i})`),n=!1}catch(a){console.error("API URL cleanup failed (config file unchanged):",a)}}if(n)try{e.store={...e.store,accounts:r}}catch(o){console.error("API URL migration failed (config file unchanged):",o)}}function Pp(){return Vn().get("activeAccount")}function ca(){return Vn().get("accounts")||{}}function mt(){let e={apiUrl:bu},t=Pp();if(!t)return e;return ca()[t]||e}function Tt(e,t){let r=Vn(),n=r.get("activeAccount")||"default",i=r.get("accounts")||{};if(!i[n])i[n]={apiUrl:bu};i[n][e]=t,r.store={...r.store,accounts:i,activeAccount:n}}function Tp(e){let t=Pp();if(!t)return;let r=ca();if(r[t])delete r[t][e],Vn().set("accounts",r)}function tZ(){let e=Vn(),t=Pp();if(!t){e.clear();return}let r=ca();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 rZ(){Vn().clear()}function Ve(){return!!mt().apiKey}function o$(){return Vn().path}function Ip(){let e=ca(),t=Pp();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 nZ(e){return e.username?.trim()||e.email}function VHe(e){let t=e.trim().toLowerCase();if(!t)return;let r=Object.entries(ca()).filter(([,n])=>n.email&&n.email.toLowerCase()===t).map(([n])=>n);if(r.length>1){Kt(`findAccountKeyByEmail: ${r.length} accounts share email ${t}: ${r.join(", ")}`);return}return r[0]}function iZ(e,t){let r=Vn(),n=ca(),i;if(n[e])i=e;else if(t.email)i=VHe(t.email);let o=i?n[i]:void 0,s={...o??{apiUrl:bu},...t};if(i&&i!==e)delete n[i];return n[e]=s,r.store={...r.store,accounts:n,activeAccount:e},{key:e,previous:o}}function oZ(e){let t=e.trim();if(!t)return"unchanged";let r=Vn(),n=Pp();if(!n||n===t)return"unchanged";let i=ca(),o=i[n];if(!o)return"unchanged";if(i[t])return"key_taken";return delete i[n],i[t]={...o,username:t},r.store={...r.store,accounts:i,activeAccount:t},"renamed"}function s$(e){let t=Vn(),r=ca();if(r[e])return t.store={...t.store,activeAccount:e},r[e];for(let[n,i]of Object.entries(r))if(i.githubUsername===e)return t.store={...t.store,activeAccount:n},i;return null}var bu="https://nemar-api-dev.sccn-org.workers.dev",i$=384,NHe,MHe,Qvt,Fp=null,QX=null,eZ,BHe;var ao=P(()=>{AX();yn();xf();zn();NHe=new Set(["https://api.osc.earth/nemar","https://nemar-api.neuromechanist.workers.dev","https://nemar-api-dev.shirazi-10f.workers.dev"]);MHe=H({field:w(),blocks:oe(w()).optional(),set_on:oe(w()).optional()}).passthrough(),Qvt=H({apiKey:w().optional(),apiUrl:w().url().default(bu),username:w().optional(),email:w().email().optional(),githubUsername:w().optional(),sandboxCompleted:Ee().optional(),sandboxDatasetId:w().optional(),dismissedNoticeIds:oe(R()).optional(),serviceAccess:Ee().optional(),profileGaps:oe(MHe).optional(),orcidVerified:Ee().optional(),role:w().optional(),accountKind:bf.optional(),pendingEmailChange:w().email().optional()});eZ=new Set;BHe=["apiKey","apiUrl","username","email","githubUsername","sandboxCompleted","sandboxDatasetId","dismissedNoticeIds"]});function zy(e){if(sZ)return;sZ=!0;let t=l.yellow("\u2500".repeat(60)),r=l.yellow.bold("[MAINTENANCE]"),n=l.dim(`mode: ${e.mode}`),i=e.eta?`
|
|
109
109
|
${l.dim(`eta: ${e.eta}`)}`:"";process.stderr.write(`${t}
|
|
110
110
|
${r} ${e.message}
|
|
111
111
|
${n}${i}
|
|
112
112
|
${t}
|
|
113
|
-
`)}var sZ=!1;var a$=P(()=>{Xe()});function Vy(){if(process.env.TEST_API_URL)return process.env.TEST_API_URL;if(l$)return c$;return mt().apiUrl||c$}async function I(e,t={},r=!1,n){let i=`${Vy()}${e}`,o={"Content-Type":"application/json","X-CLI-Version":Di,...t.headers};if(r){let m=mt();if(!m.apiKey&&r===!0)throw new L(401,"Not authenticated. Run 'nemar auth login' first.");if(m.apiKey)o.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(i,{...t,headers:o})}catch(m){if(pc())By({method:s,url:i,status:null,durationMs:Date.now()-c,requestHeaders:o,requestBody:a,error:m instanceof Error?m.message:String(m)});throw new L(0,`Network error: Could not connect to ${Vy()}`,{originalError:m instanceof Error?m.message:String(m)})}let d;try{d=await u.text()}catch(m){if(pc())By({method:s,url:i,status:u.status,durationMs:Date.now()-c,requestHeaders:o,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(pc())By({method:s,url:i,status:u.status,durationMs:Date.now()-c,requestHeaders:o,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 E=typeof f.message==="string"?f.message:"NEMAR is in maintenance mode. Please retry shortly.",F=typeof f.eta==="string"?f.eta:null,A=new aa(f.mode,E,F,f.details);throw zy(A),A}let m=typeof f.block_reason==="string",p=Array.isArray(f.missing)?f.missing.filter((E)=>typeof E==="string"):void 0,h=typeof f.error==="string"&&(eL.includes(f.error)||aL.includes(f.error)),g=typeof f.error==="string"&&(zg.options.includes(f.error)||fL.includes(f.error)),b=typeof f.error==="string"&&K9.includes(f.error),x=typeof f.error==="string"&&sL.includes(f.error),D=m||h||g||b||x||p!==void 0&&typeof f.error==="string"&&Q9.includes(f.error)?f.message||f.error:f.error||f.message;if(u.status===404&&f.error==="Not Found"&&typeof f.message==="string")D=`${f.message}. This NEMAR backend does not support this command yet.`;let C=new L(u.status,D||"Request failed",f.details,typeof f.step==="string"?f.step:void 0,m?f.block_reason:void 0,p);if(typeof f.error==="string")C.code=f.error;if(typeof f.reason==="string")C.reason=f.reason;throw C.rawBody=f,C}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 c$="https://api.nemar.org",l$;var Xo=P(()=>{Gg();cD();aD();xf();ao();zn();a$();hu();Lt();l$=c$.includes("workers.dev")});function Hy(e){if(e.service_access===void 0||e.service_access===null)return"unknown";return e.service_access?"upload":"browse"}async function aZ(e,t,r,n){let i=new URLSearchParams;if(e)i.set("status",e);if(t)i.set("role",t);if(r)i.set("awaiting_approval","1");if(n)i.set("kind",n);let o=i.toString()?`?${i.toString()}`:"";return I(`/admin/users${o}`,{},!0,X9)}async function cZ(e){return I(`/admin/approve/${e}`,{method:"POST"},!0)}async function lZ(e){return I(`/admin/approve/by-id/${e}`,{method:"POST"},!0)}async function uZ(e){return I(`/admin/revoke/${e}`,{method:"POST"},!0)}async function dZ(e){return I(`/admin/revoke/by-id/${e}`,{method:"POST"},!0)}async function fZ(e,t){return I(`/admin/users/${e}/role`,{method:"POST",body:JSON.stringify({role:t})},!0)}async function pZ(e,t){return I(`/admin/users/${e}/kind`,{method:"POST",body:JSON.stringify({kind:t})},!0)}async function mZ(e){return I(`/admin/users/${e}`,{},!0)}async function hZ(e,t){return I(`/admin/users/${e}/keys`,{method:"POST",body:JSON.stringify({name:t})},!0,Hg)}async function gZ(e){return I(`/admin/users/${e}/keys`,{},!0,Vg)}async function yZ(e,t){return I(`/admin/users/${e}/keys/${t}`,{method:"DELETE"},!0)}async function u$(e,t){return I(`/admin/datasets/${e}/visibility`,{method:"PATCH",body:JSON.stringify({visibility:t})},!0)}async function bZ(e){return I(`/datasets/${e}/publish`,{method:"POST"},!0)}async function xZ(e){return I(`/admin/datasets/${e}/ci`,{},!0)}async function Zo(e){return I(`/admin/datasets/${e}/ci`,{method:"POST"},!0)}async function d$(e){return I(`/admin/datasets/${e}/ci/validate`,{method:"POST"},!0)}async function f$(e){return I(`/admin/datasets/${e}/ci/sync`,{method:"POST"},!0)}async function _Z(e,t){return I(`/admin/datasets/${e}/doi/concept`,{method:"POST",body:JSON.stringify(t)},!0)}async function Np(e){return I(`/admin/datasets/${e}/doi`,{},!0)}async function p$(e,t){return I(`/admin/datasets/${e}/doi/update`,{method:"POST",body:JSON.stringify(t)},!0)}async function vZ(e,t){return I(`/admin/datasets/${e}/withdraw`,{method:"POST",body:JSON.stringify({reason:t.reason,dry_run:t.dryRun})},!0)}async function wZ(e,t){return I(`/admin/datasets/${e}/restore`,{method:"POST",body:JSON.stringify({dry_run:t.dryRun})},!0)}async function DZ(e){return I(`/admin/datasets/${e}/reset`,{method:"POST"},!0)}async function EZ(e,t=!1){return I(`/admin/datasets/${e}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:t})},!0)}async function SZ(e){return I("/admin/datasets/bulk-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataset_ids:e})},!0)}async function $Z(e){return I("/admin/datasets/import",{method:"POST",body:JSON.stringify(e)},!0)}async function kZ(e){return I("/admin/datasets/exemplar",{method:"POST",body:JSON.stringify(e)},!0)}async function CZ(e){return I(`/admin/datasets/${e}/exemplar/remint-dois`,{method:"POST"},!0)}async function m$(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 I(`/admin/imports${n?`?${n}`:""}`,{},!0)}async function RZ(e){return I(`/admin/imports/${e}/rollback`,{method:"POST"},!0)}async function AZ(e){return I(`/admin/imports/${e}/retry`,{method:"POST"},!0)}async function h$(e){return I(`/admin/imports/${e}/verify`,{method:"POST"},!0)}async function OZ(e){return I("/admin/imports/dispatch-cooldown",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataset_ids:e})},!0)}async function xu(e,t){return I(`/admin/datasets/${e}/reindex`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t??{})},!0)}async function FZ(e,t){return I("/admin/datasets/reindex/bulk",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filter:e,...t??{}})},!0)}async function PZ(e){let t=e?.limit??15;return I(`/admin/datasets/hed-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function TZ(){return I("/admin/datasets/hed-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function IZ(e){let t=e?.limit??50;return I(`/admin/datasets/recording-stats-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function NZ(){return I("/admin/datasets/recording-stats-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function jZ(e){let t=e?.limit??15;return I(`/admin/datasets/signal-defaults-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function MZ(){return I("/admin/datasets/signal-defaults-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function qZ(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 I(`/admin/datasets/data-integrity-sweep?${r.toString()}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function LZ(){return I("/admin/datasets/data-integrity-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function BZ(e,t){let r=t?.write?"":"?dry_run=1";return I(`/admin/datasets/${e}/availability-report${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function UZ(e){let t=e?.limit??30,r=new URLSearchParams({limit:String(t)});if(e?.missingOnly)r.set("missing-only","1");return I(`/admin/datasets/availability-report-sweep?${r.toString()}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function zZ(){return I("/admin/datasets/availability-report-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function VZ(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 I(`/admin/fleet/drift${r}`,{},!0)}async function _u(e,t){return I(`/admin/datasets/${e}/enforce`,{method:"POST",body:JSON.stringify({dry_run:t})},!0)}async function HZ(e){return I("/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 GZ(e,t=!1){return I(`/admin/datasets/${e}/revalidate${t?"?force=true":""}`,{method:"POST"},!0)}async function WZ(e){let t=e?`?user=${encodeURIComponent(e)}`:"";return I(`/admin/email-preferences${t}`,{},!0)}async function KZ(e,t){let r=t?`?user=${encodeURIComponent(t)}`:"";return I(`/admin/email-preferences${r}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)},!0)}async function g$(e){return I("/admin/notify",{method:"POST",body:JSON.stringify(e)},!0)}async function YZ(){return I("/admin/summary/coverage",{},!0)}async function JZ(e,t,r){return I("/admin/manifest/dispatch",{method:"POST",body:JSON.stringify({dataset_id:e,version:t,skip_canary:r?.skipCanary??!1})},!0)}async function y$(e){return I("/admin/doctor/scan",{method:"POST",body:JSON.stringify({...e?.check&&{check:e.check},...e?.datasetId&&{dataset_id:e.datasetId}})},!0)}async function b$(e){return I("/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 XZ(){return I("/admin/zarr-catalog/publish",{method:"POST"},!0)}async function ZZ(e){return I("/admin/neurobagel/regenerate",{method:"POST",body:JSON.stringify(e)},!0)}async function QZ(){return I("/admin/neurobagel/status",{method:"GET"},!0)}async function eQ(){return I("/admin/neurobagel/verify",{method:"POST",body:"{}"},!0)}async function tQ(e){let t=new URLSearchParams;if(e?.limit!=null)t.set("limit",String(e.limit));let r=t.toString()?`?${t.toString()}`:"";return I(`/admin/datasets/zarr-fidelity-sweep${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function rQ(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 I(`/admin/imports/issue-triage${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function nQ(e){let t=e?.apply?"?apply=1":"";return I(`/admin/imports/coverage-sweep${t}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function iQ(e){let t=e?.apply?"?apply=1":"";return I(`/admin/imports/weekly-summary${t}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function oQ(e){return I("/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 sQ(e){return I("/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 aQ(){return I("/admin/users/duplicates",{},!0,cL)}async function cQ(e){return I(`/admin/users/${e}/clear-identity-conflict`,{method:"POST"},!0,lL)}async function lQ(e){let t=new URLSearchParams;if(e?.limit!=null)t.set("limit",String(e.limit));let r=t.toString()?`?${t.toString()}`:"";return I(`/admin/datasets/anonymity-sweep${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function uQ(){return I("/admin/datasets/anonymity-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}var vu=P(()=>{zl();Xo()});async function Sr(e,t){return I(`/datasets/${e}/upload-credentials`,{method:"POST",body:JSON.stringify({duration_seconds:t})},!0)}async function x$(e,t){return I(`/datasets/${e}/download-credentials`,{method:"POST",body:JSON.stringify({duration_seconds:t})},!0)}async function dQ(e){return I(`/admin/datasets/${e}/files`,{},!0)}async function fQ(e){let t,r=0,n=[],i=!0;while(i){let o=await I(`/admin/datasets/${e}/s3-lock`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({continuation_token:t})},!0);if(r+=o.locked,o.failed?.length)n.push(...o.failed);if(i=o.hasMore,t=o.continuation_token,i&&!t)throw new L(500,"S3 lock paginated response missing continuation_token; aborting to avoid infinite loop")}return{locked:r,failed:n}}var Qo=P(()=>{Xo();Lt()});async function Wy(e){return I(`/datasets/${e}/ci/status`,{},!0)}async function pQ(e){return I(`/datasets/${e}/manifest`,{},!0)}async function Ky(e,t){return I(`/datasets/${e}/manifest/${t}`,{},!0)}function mQ(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 la(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[i,o]of Object.entries(e.facets))t.set(i,o);if(e.includeUnknown)t.set("include_unknown","1");let r=t.toString()?`?${t.toString()}`:"",n=await I(`/datasets${r}`,{},e.mine?!0:"optional");return n.datasets=n.datasets.map(mQ),n}async function hQ(e){return I(`/datasets/resolve/${e}`,{},"optional")}async function gQ(){return I("/datasets/facets",{signal:AbortSignal.timeout(5000)},"optional",Ug)}async function yQ(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[i,o]of Object.entries(t.facets))r.set(i,o);if(t.includeUnknown)r.set("include_unknown","1");return await I(`/datasets/search?${r.toString()}`,{},"optional",oL)}async function Yt(e){let t=await I(`/datasets/${e}`,{},"optional");return mQ(t.dataset)}async function bQ(e){return I(`/datasets/${e}/versions`,{},!0)}async function Yy(e){return I("/datasets",{method:"POST",body:JSON.stringify(e)},!0)}async function xQ(e,t){return I(`/datasets/${e}/attestation`,{method:"PUT",body:JSON.stringify(t)},!0)}async function Jy(e){return I(`/datasets/${e}/finalize`,{method:"POST"},!0)}async function _$(e){return I(`/datasets/${e}/request-access`,{method:"POST"},!0)}async function _Q(e,t){let r=t?`?status=${t}`:"";return I(`/datasets/${e}/access-requests${r}`,{},!0)}async function vQ(e,t){return I(`/datasets/${e}/access-requests/${t}/approve`,{method:"POST"},!0)}async function wQ(e,t){return I(`/datasets/${e}/access-requests/${t}/deny`,{method:"POST"},!0)}async function DQ(e,t){return I(`/datasets/${e}/invite`,{method:"POST",body:JSON.stringify({username:t})},!0)}async function EQ(e){return I(`/datasets/${e}/collaborators`,{},!0)}async function SQ(e,t){return I(`/admin/datasets/${e}/enrichment`,{method:"POST",body:JSON.stringify(t)},!0)}var Gy;var ua=P(()=>{zl();Xo();Gy=/^\d{4}-\d{4}-\d{4}-\d{3}[\dX]$/});var AQ=1e4;async function wu(e,t={}){return I(`/datasets/${e}/publish/request`,t.anonymous?{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({anonymous:!0})}:{method:"POST"},!0)}async function Du(e){return I(`/datasets/${e}/publish/status`,{},!0)}async function FQ(e){return I(`/datasets/${e}/publish/resend`,{method:"POST"},!0)}async function PQ(e){let t=e?`?status=${e}`:"";return I(`/admin/publish/requests${t}`,{},!0)}async function Xy(e,t){return I(`/admin/publish/${e}/deny`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({reason:t})},!0)}async function Zy(e){return I(`/admin/publish/${e}/identifier-screen`,{method:"POST"},!0)}function HHe(e,t=[]){if(e){let r=Gs.indexOf(e);if(r>=0)return r+1}return Math.min(t.length+1,Gs.length)}function GHe(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 Eu(e,t=!1,r=!1,n=!1,i,o,s){let c=AQ,u,d,f=0,m=!1,p,h=t,g=[],b;function x(_,D,C,E){if(!o)return;o({step:_,stepIndex:HHe(_,D),stepTotal:Gs.length,s3LockLocked:C,s3LockTotal:E,s3LockResumed:_==="s3_lock"&&m?!0:void 0})}for(let _=1;_<=5;_++)try{let D,C=!0;do{if(D=await I(`/admin/publish/${e}/approve`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({resume:C?h:!0,sandbox:r,s3_lock_continuation_token:u,s3_lock_total:d,skip_ci_check:n,...s!==void 0?{acknowledge_identifier_screen:s}:{}})},!0),C=!1,D.step_results)g.push(...D.step_results);if(D.s3_lock_total!==void 0)d=D.s3_lock_total;if(D.s3_lock_batch_count!==void 0)f+=D.s3_lock_batch_count;let E=D.step??D.step_results?.[D.step_results.length-1]?.step;if(E&&(E!==p||E==="s3_lock"))x(E,D.steps_completed??[],E==="s3_lock"?f:void 0,E==="s3_lock"?d:void 0),p=E;if(D.hasMore&&D.s3_lock_continuation_token!==void 0)u=D.s3_lock_continuation_token;else break}while(D.hasMore);if(g.length>0)D.step_results=OQ(g);return D}catch(D){if(b=D,_===5||!GHe(D)){if(D instanceof L&&g.length>0)D.stepResults=OQ(g);throw D}let E=D;if(i?.({attempt:_,maxAttempts:5,delayMs:c,step:E.step,error:E.message}),await new Promise((F)=>setTimeout(F,c)),h=!0,u!==void 0)m=!0}throw b}function OQ(e){let t=new Map;for(let r of e)t.set(r.step,r);return Array.from(t.values())}var Su=P(()=>{n0();Xo();Lt()});function tee(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"&&!es.has(r)).filter((r)=>t.prefix?r.startsWith(t.prefix):!0).sort()}var es;var rb=P(()=>{es=new Set(["nm000103","nm000104","nm000105","nm000106","nm000107"])});async function ZHe(){try{let{exitCode:e,stderr:t}=await k(["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 mc(){try{let{stdout:e,exitCode:t,stderr:r}=await k(["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 nb(e){try{let{stdout:t,exitCode:r,stderr:n}=await k(["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 i=t.trim();if(!i)return{authenticated:!1,error:"gh CLI returned empty username"};if(e){let o=i.toLowerCase()===e.toLowerCase();return{authenticated:!0,username:i,matches:o,error:o?void 0:`gh CLI authenticated as '${i}', expected '${e}'`}}return{authenticated:!0,username:i}}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 ib(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 k(["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 i=null;try{i=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(!i){let{exitCode:a}=await k(["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:o,stderr:s}=await k(["gh","api","--method","PATCH",`/user/repository_invitations/${i}`]);if(o!==0)return{accepted:!1,error:`Failed to accept invitation: ${s.trim()||"unknown error"}`};return{accepted:!0}}async function co(e,t,r="origin"){let n=t;if(process.env.GH_TOKEN&&t.startsWith("git@github.com:")){let i=process.env.GH_TOKEN.trim();if(!i||/\s/.test(i))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 k(["git","config","credential.https://github.com.helper",`!printf 'username=x-access-token\\npassword=${i}'`],{cwd:e})}else if(t.startsWith("git@github.com:")){let i=t.replace("git@github.com:",""),o=await mc();if(o.token)n=`https://github.com/${i}`,await k(["git","config","credential.https://github.com.helper",`!printf 'username=x-access-token\\npassword=${o.token}'`],{cwd:e});else{let s=await ZHe();if(s.works)n=t;else return{success:!1,error:`GitHub authentication not configured.
|
|
113
|
+
`)}var sZ=!1;var a$=P(()=>{Xe()});function Vy(){if(process.env.TEST_API_URL)return process.env.TEST_API_URL;if(l$)return c$;return mt().apiUrl||c$}async function I(e,t={},r=!1,n){let i=`${Vy()}${e}`,o={"Content-Type":"application/json","X-CLI-Version":Di,...t.headers};if(r){let m=mt();if(!m.apiKey&&r===!0)throw new L(401,"Not authenticated. Run 'nemar auth login' first.");if(m.apiKey)o.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(i,{...t,headers:o})}catch(m){if(pc())By({method:s,url:i,status:null,durationMs:Date.now()-c,requestHeaders:o,requestBody:a,error:m instanceof Error?m.message:String(m)});throw new L(0,`Network error: Could not connect to ${Vy()}`,{originalError:m instanceof Error?m.message:String(m)})}let d;try{d=await u.text()}catch(m){if(pc())By({method:s,url:i,status:u.status,durationMs:Date.now()-c,requestHeaders:o,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(pc())By({method:s,url:i,status:u.status,durationMs:Date.now()-c,requestHeaders:o,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 E=typeof f.message==="string"?f.message:"NEMAR is in maintenance mode. Please retry shortly.",F=typeof f.eta==="string"?f.eta:null,A=new aa(f.mode,E,F,f.details);throw zy(A),A}let m=typeof f.block_reason==="string",p=Array.isArray(f.missing)?f.missing.filter((E)=>typeof E==="string"):void 0,h=typeof f.error==="string"&&(eL.includes(f.error)||aL.includes(f.error)),g=typeof f.error==="string"&&(zg.options.includes(f.error)||fL.includes(f.error)),b=typeof f.error==="string"&&K9.includes(f.error),x=typeof f.error==="string"&&sL.includes(f.error),D=m||h||g||b||x||p!==void 0&&typeof f.error==="string"&&Q9.includes(f.error)?f.message||f.error:f.error||f.message;if(u.status===404&&f.error==="Not Found"&&typeof f.message==="string")D=`${f.message}. This NEMAR backend does not support this command yet.`;let C=new L(u.status,D||"Request failed",f.details,typeof f.step==="string"?f.step:void 0,m?f.block_reason:void 0,p);if(typeof f.error==="string")C.code=f.error;if(typeof f.reason==="string")C.reason=f.reason;throw C.rawBody=f,C}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 c$="https://nemar-api-dev.sccn-org.workers.dev",l$;var Xo=P(()=>{Gg();cD();aD();xf();ao();zn();a$();hu();Lt();l$=c$.includes("workers.dev")});function Hy(e){if(e.service_access===void 0||e.service_access===null)return"unknown";return e.service_access?"upload":"browse"}async function aZ(e,t,r,n){let i=new URLSearchParams;if(e)i.set("status",e);if(t)i.set("role",t);if(r)i.set("awaiting_approval","1");if(n)i.set("kind",n);let o=i.toString()?`?${i.toString()}`:"";return I(`/admin/users${o}`,{},!0,X9)}async function cZ(e){return I(`/admin/approve/${e}`,{method:"POST"},!0)}async function lZ(e){return I(`/admin/approve/by-id/${e}`,{method:"POST"},!0)}async function uZ(e){return I(`/admin/revoke/${e}`,{method:"POST"},!0)}async function dZ(e){return I(`/admin/revoke/by-id/${e}`,{method:"POST"},!0)}async function fZ(e,t){return I(`/admin/users/${e}/role`,{method:"POST",body:JSON.stringify({role:t})},!0)}async function pZ(e,t){return I(`/admin/users/${e}/kind`,{method:"POST",body:JSON.stringify({kind:t})},!0)}async function mZ(e){return I(`/admin/users/${e}`,{},!0)}async function hZ(e,t){return I(`/admin/users/${e}/keys`,{method:"POST",body:JSON.stringify({name:t})},!0,Hg)}async function gZ(e){return I(`/admin/users/${e}/keys`,{},!0,Vg)}async function yZ(e,t){return I(`/admin/users/${e}/keys/${t}`,{method:"DELETE"},!0)}async function u$(e,t){return I(`/admin/datasets/${e}/visibility`,{method:"PATCH",body:JSON.stringify({visibility:t})},!0)}async function bZ(e){return I(`/datasets/${e}/publish`,{method:"POST"},!0)}async function xZ(e){return I(`/admin/datasets/${e}/ci`,{},!0)}async function Zo(e){return I(`/admin/datasets/${e}/ci`,{method:"POST"},!0)}async function d$(e){return I(`/admin/datasets/${e}/ci/validate`,{method:"POST"},!0)}async function f$(e){return I(`/admin/datasets/${e}/ci/sync`,{method:"POST"},!0)}async function _Z(e,t){return I(`/admin/datasets/${e}/doi/concept`,{method:"POST",body:JSON.stringify(t)},!0)}async function Np(e){return I(`/admin/datasets/${e}/doi`,{},!0)}async function p$(e,t){return I(`/admin/datasets/${e}/doi/update`,{method:"POST",body:JSON.stringify(t)},!0)}async function vZ(e,t){return I(`/admin/datasets/${e}/withdraw`,{method:"POST",body:JSON.stringify({reason:t.reason,dry_run:t.dryRun})},!0)}async function wZ(e,t){return I(`/admin/datasets/${e}/restore`,{method:"POST",body:JSON.stringify({dry_run:t.dryRun})},!0)}async function DZ(e){return I(`/admin/datasets/${e}/reset`,{method:"POST"},!0)}async function EZ(e,t=!1){return I(`/admin/datasets/${e}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:t})},!0)}async function SZ(e){return I("/admin/datasets/bulk-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataset_ids:e})},!0)}async function $Z(e){return I("/admin/datasets/import",{method:"POST",body:JSON.stringify(e)},!0)}async function kZ(e){return I("/admin/datasets/exemplar",{method:"POST",body:JSON.stringify(e)},!0)}async function CZ(e){return I(`/admin/datasets/${e}/exemplar/remint-dois`,{method:"POST"},!0)}async function m$(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 I(`/admin/imports${n?`?${n}`:""}`,{},!0)}async function RZ(e){return I(`/admin/imports/${e}/rollback`,{method:"POST"},!0)}async function AZ(e){return I(`/admin/imports/${e}/retry`,{method:"POST"},!0)}async function h$(e){return I(`/admin/imports/${e}/verify`,{method:"POST"},!0)}async function OZ(e){return I("/admin/imports/dispatch-cooldown",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataset_ids:e})},!0)}async function xu(e,t){return I(`/admin/datasets/${e}/reindex`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t??{})},!0)}async function FZ(e,t){return I("/admin/datasets/reindex/bulk",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filter:e,...t??{}})},!0)}async function PZ(e){let t=e?.limit??15;return I(`/admin/datasets/hed-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function TZ(){return I("/admin/datasets/hed-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function IZ(e){let t=e?.limit??50;return I(`/admin/datasets/recording-stats-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function NZ(){return I("/admin/datasets/recording-stats-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function jZ(e){let t=e?.limit??15;return I(`/admin/datasets/signal-defaults-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function MZ(){return I("/admin/datasets/signal-defaults-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function qZ(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 I(`/admin/datasets/data-integrity-sweep?${r.toString()}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function LZ(){return I("/admin/datasets/data-integrity-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function BZ(e,t){let r=t?.write?"":"?dry_run=1";return I(`/admin/datasets/${e}/availability-report${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function UZ(e){let t=e?.limit??30,r=new URLSearchParams({limit:String(t)});if(e?.missingOnly)r.set("missing-only","1");return I(`/admin/datasets/availability-report-sweep?${r.toString()}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function zZ(){return I("/admin/datasets/availability-report-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function VZ(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 I(`/admin/fleet/drift${r}`,{},!0)}async function _u(e,t){return I(`/admin/datasets/${e}/enforce`,{method:"POST",body:JSON.stringify({dry_run:t})},!0)}async function HZ(e){return I("/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 GZ(e,t=!1){return I(`/admin/datasets/${e}/revalidate${t?"?force=true":""}`,{method:"POST"},!0)}async function WZ(e){let t=e?`?user=${encodeURIComponent(e)}`:"";return I(`/admin/email-preferences${t}`,{},!0)}async function KZ(e,t){let r=t?`?user=${encodeURIComponent(t)}`:"";return I(`/admin/email-preferences${r}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)},!0)}async function g$(e){return I("/admin/notify",{method:"POST",body:JSON.stringify(e)},!0)}async function YZ(){return I("/admin/summary/coverage",{},!0)}async function JZ(e,t,r){return I("/admin/manifest/dispatch",{method:"POST",body:JSON.stringify({dataset_id:e,version:t,skip_canary:r?.skipCanary??!1})},!0)}async function y$(e){return I("/admin/doctor/scan",{method:"POST",body:JSON.stringify({...e?.check&&{check:e.check},...e?.datasetId&&{dataset_id:e.datasetId}})},!0)}async function b$(e){return I("/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 XZ(){return I("/admin/zarr-catalog/publish",{method:"POST"},!0)}async function ZZ(e){return I("/admin/neurobagel/regenerate",{method:"POST",body:JSON.stringify(e)},!0)}async function QZ(){return I("/admin/neurobagel/status",{method:"GET"},!0)}async function eQ(){return I("/admin/neurobagel/verify",{method:"POST",body:"{}"},!0)}async function tQ(e){let t=new URLSearchParams;if(e?.limit!=null)t.set("limit",String(e.limit));let r=t.toString()?`?${t.toString()}`:"";return I(`/admin/datasets/zarr-fidelity-sweep${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function rQ(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 I(`/admin/imports/issue-triage${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function nQ(e){let t=e?.apply?"?apply=1":"";return I(`/admin/imports/coverage-sweep${t}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function iQ(e){let t=e?.apply?"?apply=1":"";return I(`/admin/imports/weekly-summary${t}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function oQ(e){return I("/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 sQ(e){return I("/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 aQ(){return I("/admin/users/duplicates",{},!0,cL)}async function cQ(e){return I(`/admin/users/${e}/clear-identity-conflict`,{method:"POST"},!0,lL)}async function lQ(e){let t=new URLSearchParams;if(e?.limit!=null)t.set("limit",String(e.limit));let r=t.toString()?`?${t.toString()}`:"";return I(`/admin/datasets/anonymity-sweep${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function uQ(){return I("/admin/datasets/anonymity-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}var vu=P(()=>{zl();Xo()});async function Sr(e,t){return I(`/datasets/${e}/upload-credentials`,{method:"POST",body:JSON.stringify({duration_seconds:t})},!0)}async function x$(e,t){return I(`/datasets/${e}/download-credentials`,{method:"POST",body:JSON.stringify({duration_seconds:t})},!0)}async function dQ(e){return I(`/admin/datasets/${e}/files`,{},!0)}async function fQ(e){let t,r=0,n=[],i=!0;while(i){let o=await I(`/admin/datasets/${e}/s3-lock`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({continuation_token:t})},!0);if(r+=o.locked,o.failed?.length)n.push(...o.failed);if(i=o.hasMore,t=o.continuation_token,i&&!t)throw new L(500,"S3 lock paginated response missing continuation_token; aborting to avoid infinite loop")}return{locked:r,failed:n}}var Qo=P(()=>{Xo();Lt()});async function Wy(e){return I(`/datasets/${e}/ci/status`,{},!0)}async function pQ(e){return I(`/datasets/${e}/manifest`,{},!0)}async function Ky(e,t){return I(`/datasets/${e}/manifest/${t}`,{},!0)}function mQ(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 la(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[i,o]of Object.entries(e.facets))t.set(i,o);if(e.includeUnknown)t.set("include_unknown","1");let r=t.toString()?`?${t.toString()}`:"",n=await I(`/datasets${r}`,{},e.mine?!0:"optional");return n.datasets=n.datasets.map(mQ),n}async function hQ(e){return I(`/datasets/resolve/${e}`,{},"optional")}async function gQ(){return I("/datasets/facets",{signal:AbortSignal.timeout(5000)},"optional",Ug)}async function yQ(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[i,o]of Object.entries(t.facets))r.set(i,o);if(t.includeUnknown)r.set("include_unknown","1");return await I(`/datasets/search?${r.toString()}`,{},"optional",oL)}async function Yt(e){let t=await I(`/datasets/${e}`,{},"optional");return mQ(t.dataset)}async function bQ(e){return I(`/datasets/${e}/versions`,{},!0)}async function Yy(e){return I("/datasets",{method:"POST",body:JSON.stringify(e)},!0)}async function xQ(e,t){return I(`/datasets/${e}/attestation`,{method:"PUT",body:JSON.stringify(t)},!0)}async function Jy(e){return I(`/datasets/${e}/finalize`,{method:"POST"},!0)}async function _$(e){return I(`/datasets/${e}/request-access`,{method:"POST"},!0)}async function _Q(e,t){let r=t?`?status=${t}`:"";return I(`/datasets/${e}/access-requests${r}`,{},!0)}async function vQ(e,t){return I(`/datasets/${e}/access-requests/${t}/approve`,{method:"POST"},!0)}async function wQ(e,t){return I(`/datasets/${e}/access-requests/${t}/deny`,{method:"POST"},!0)}async function DQ(e,t){return I(`/datasets/${e}/invite`,{method:"POST",body:JSON.stringify({username:t})},!0)}async function EQ(e){return I(`/datasets/${e}/collaborators`,{},!0)}async function SQ(e,t){return I(`/admin/datasets/${e}/enrichment`,{method:"POST",body:JSON.stringify(t)},!0)}var Gy;var ua=P(()=>{zl();Xo();Gy=/^\d{4}-\d{4}-\d{4}-\d{3}[\dX]$/});var AQ=1e4;async function wu(e,t={}){return I(`/datasets/${e}/publish/request`,t.anonymous?{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({anonymous:!0})}:{method:"POST"},!0)}async function Du(e){return I(`/datasets/${e}/publish/status`,{},!0)}async function FQ(e){return I(`/datasets/${e}/publish/resend`,{method:"POST"},!0)}async function PQ(e){let t=e?`?status=${e}`:"";return I(`/admin/publish/requests${t}`,{},!0)}async function Xy(e,t){return I(`/admin/publish/${e}/deny`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({reason:t})},!0)}async function Zy(e){return I(`/admin/publish/${e}/identifier-screen`,{method:"POST"},!0)}function HHe(e,t=[]){if(e){let r=Gs.indexOf(e);if(r>=0)return r+1}return Math.min(t.length+1,Gs.length)}function GHe(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 Eu(e,t=!1,r=!1,n=!1,i,o,s){let c=AQ,u,d,f=0,m=!1,p,h=t,g=[],b;function x(_,D,C,E){if(!o)return;o({step:_,stepIndex:HHe(_,D),stepTotal:Gs.length,s3LockLocked:C,s3LockTotal:E,s3LockResumed:_==="s3_lock"&&m?!0:void 0})}for(let _=1;_<=5;_++)try{let D,C=!0;do{if(D=await I(`/admin/publish/${e}/approve`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({resume:C?h:!0,sandbox:r,s3_lock_continuation_token:u,s3_lock_total:d,skip_ci_check:n,...s!==void 0?{acknowledge_identifier_screen:s}:{}})},!0),C=!1,D.step_results)g.push(...D.step_results);if(D.s3_lock_total!==void 0)d=D.s3_lock_total;if(D.s3_lock_batch_count!==void 0)f+=D.s3_lock_batch_count;let E=D.step??D.step_results?.[D.step_results.length-1]?.step;if(E&&(E!==p||E==="s3_lock"))x(E,D.steps_completed??[],E==="s3_lock"?f:void 0,E==="s3_lock"?d:void 0),p=E;if(D.hasMore&&D.s3_lock_continuation_token!==void 0)u=D.s3_lock_continuation_token;else break}while(D.hasMore);if(g.length>0)D.step_results=OQ(g);return D}catch(D){if(b=D,_===5||!GHe(D)){if(D instanceof L&&g.length>0)D.stepResults=OQ(g);throw D}let E=D;if(i?.({attempt:_,maxAttempts:5,delayMs:c,step:E.step,error:E.message}),await new Promise((F)=>setTimeout(F,c)),h=!0,u!==void 0)m=!0}throw b}function OQ(e){let t=new Map;for(let r of e)t.set(r.step,r);return Array.from(t.values())}var Su=P(()=>{n0();Xo();Lt()});function tee(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"&&!es.has(r)).filter((r)=>t.prefix?r.startsWith(t.prefix):!0).sort()}var es;var rb=P(()=>{es=new Set(["nm000103","nm000104","nm000105","nm000106","nm000107"])});async function ZHe(){try{let{exitCode:e,stderr:t}=await k(["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 mc(){try{let{stdout:e,exitCode:t,stderr:r}=await k(["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 nb(e){try{let{stdout:t,exitCode:r,stderr:n}=await k(["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 i=t.trim();if(!i)return{authenticated:!1,error:"gh CLI returned empty username"};if(e){let o=i.toLowerCase()===e.toLowerCase();return{authenticated:!0,username:i,matches:o,error:o?void 0:`gh CLI authenticated as '${i}', expected '${e}'`}}return{authenticated:!0,username:i}}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 ib(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 k(["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 i=null;try{i=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(!i){let{exitCode:a}=await k(["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:o,stderr:s}=await k(["gh","api","--method","PATCH",`/user/repository_invitations/${i}`]);if(o!==0)return{accepted:!1,error:`Failed to accept invitation: ${s.trim()||"unknown error"}`};return{accepted:!0}}async function co(e,t,r="origin"){let n=t;if(process.env.GH_TOKEN&&t.startsWith("git@github.com:")){let i=process.env.GH_TOKEN.trim();if(!i||/\s/.test(i))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 k(["git","config","credential.https://github.com.helper",`!printf 'username=x-access-token\\npassword=${i}'`],{cwd:e})}else if(t.startsWith("git@github.com:")){let i=t.replace("git@github.com:",""),o=await mc();if(o.token)n=`https://github.com/${i}`,await k(["git","config","credential.https://github.com.helper",`!printf 'username=x-access-token\\npassword=${o.token}'`],{cwd:e});else{let s=await ZHe();if(s.works)n=t;else return{success:!1,error:`GitHub authentication not configured.
|
|
114
114
|
|
|
115
115
|
gh CLI failed: ${o.error||"could not get token"}
|
|
116
116
|
SSH failed: ${s.error||"could not connect"}
|
|
@@ -1072,7 +1072,7 @@ Examples:
|
|
|
1072
1072
|
${u.slice(0,10).join(`
|
|
1073
1073
|
`)}${u.length>10?`
|
|
1074
1074
|
... and ${u.length-10} more`:""}`:void 0}}Cp();Xe();function xae(e){return`${lt(e)}/s`}function Irt(e){if(e<60)return`${Math.round(e)}s`;if(e<3600)return`${Math.floor(e/60)}m ${Math.round(e%60)}s`;return`${Math.floor(e/3600)}h ${Math.floor(e%3600/60)}m`}function Nrt(e,t=20){let r=Math.round(e/100*t),n=t-r;return`[${"=".repeat(r)}${" ".repeat(n)}]`}class Ix{filesCompleted=0;filesTotal;bytesTotal=0;inFlight=new Map;currentFile="";startTime;lastUpdateTime;lastBytesTransferred=0;totalBytesTransferred=0;speedSamples=[];lastRenderedLine="";constructor(e=0,t=0){this.filesTotal=e,this.bytesTotal=t,this.startTime=Date.now(),this.lastUpdateTime=this.startTime}inFlightBytes(){let e=0;for(let t of this.inFlight.values())e+=t.transferred;return e}processLine(e){let t=e.file??e.action?.file;if(e.ok===!0||e.success===!0){this.filesCompleted++;let r=t??this.currentFile,n=r?this.inFlight.get(r):void 0,i=n?n.total||n.transferred:0;if(this.totalBytesTransferred+=i,r)this.inFlight.delete(r);this.render();return}if(e["byte-progress"]!==void 0){let r=t??this.currentFile;if(!r)return;this.currentFile=r;let n=this.inFlight.get(r)??{transferred:0,total:0};if(n.transferred=e["byte-progress"]??n.transferred,e["total-size"]!==void 0)n.total=e["total-size"];this.inFlight.set(r,n);let i=Date.now(),o=(i-this.lastUpdateTime)/1000;if(o>0.5){let s=this.totalBytesTransferred+this.inFlightBytes(),c=(s-this.lastBytesTransferred)/o;if(c>0){if(this.speedSamples.push(c),this.speedSamples.length>5)this.speedSamples.shift()}this.lastBytesTransferred=s,this.lastUpdateTime=i}this.render()}}incrementFilesCompleted(){this.filesCompleted++}setFilesTotal(e){this.filesTotal=e}setBytesTotal(e){this.bytesTotal=e}getPercent(){let e=this.totalBytesTransferred+this.inFlightBytes();if(this.bytesTotal>0)return Math.min(100,Math.round(e/this.bytesTotal*100));if(this.filesTotal>0)return Math.min(100,Math.round(this.filesCompleted/this.filesTotal*100));return null}getProgress(){return{filesCompleted:this.filesCompleted,filesTotal:this.filesTotal,bytesTransferred:this.totalBytesTransferred+this.inFlightBytes(),bytesTotal:this.bytesTotal,currentFile:this.currentFile||void 0}}render(){let e=this.speedSamples.length>0?this.speedSamples.reduce((s,a)=>s+a,0)/this.speedSamples.length:0,t=this.totalBytesTransferred+this.inFlightBytes(),r=0,n=!1;if(this.bytesTotal>0)r=Math.min(100,Math.round(t/this.bytesTotal*100)),n=!0;else if(this.filesTotal>0)r=Math.min(100,Math.round(this.filesCompleted/this.filesTotal*100)),n=!0;let i=this.filesTotal>0?`${this.filesCompleted}/${this.filesTotal} files`:`${this.filesCompleted} files`,o;if(n)o=`${Nrt(r)} ${r}% ${i}`;else o=i;if(t>0){let s=this.bytesTotal>0?`${lt(t)}/${lt(this.bytesTotal)}`:lt(t);o+=` | ${s}`}if(e>0)o+=` | ${xae(e)}`;if(e>0){let s=0;if(this.bytesTotal>0)s=Math.max(0,this.bytesTotal-t);else for(let a of this.inFlight.values())if(a.total>a.transferred)s+=a.total-a.transferred;if(s>0){let a=s/e;if(a>0)o+=` | ETA ${Irt(a)}`}}if(o!==this.lastRenderedLine)process.stderr.write(`\r${l.cyan(o)}${" ".repeat(10)}`),this.lastRenderedLine=o}finish(e){let t=(Date.now()-this.startTime)/1000;if(process.stderr.write(`\r${" ".repeat(this.lastRenderedLine.length+15)}\r`),e>0){let r=t>0?`${xae(this.totalBytesTransferred/t)}`:"",n=[`${e} file${e!==1?"s":""} downloaded`,this.totalBytesTransferred>0?lt(this.totalBytesTransferred):"",r].filter(Boolean).join(" | ");process.stderr.write(`${l.green(n)}
|
|
1075
|
-
`)}}}Xe();function Gu(e){return(t)=>{try{return e(t)}catch{return String(t)}}}var Ar={id:Gu(l.cyan),metric:Gu(l.magenta),label:Gu(l.bold),warn:Gu(l.yellow),muted:Gu(l.dim),match:Gu(l.green)};var jrt=/[\u001b\u009b][\[\]()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PR-TZcf-ntqry=><~]/g,Mrt=/[\n\r\t]+/g,qrt=/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/g;function Lrt(e){return e.replace(jrt,"").replace(Mrt," ").replace(qrt,"").trim()}var Brt=/(<mark>[\s\S]*?<\/mark>)/g,Urt=/^<mark>([\s\S]*)<\/mark>$/,_ae=400;function vae(e){if(!e||typeof e!=="string")return null;try{let t=e.length>_ae?e.slice(0,_ae):e,r=Lrt(t);if(!r)return null;return r.split(Brt).filter((n)=>n.length>0).map((n)=>{let i=n.match(Urt);return i?Ar.match(i[1]):Ar.muted(n)}).join("")}catch{return null}}function wae(e,t){if(!Number.isFinite(t)||t<=0)return e;if(e.length<=t)return e;let r=e.split(","),n=[],i=0;for(let s of r){let a=n.length===0?s.length:i+1+s.length;if(a>t)break;n.push(s),i=a}let o=r.length-n.length;if(n.length===0){let s=r[0],a=Math.max(0,t-1),c=a>0?`${s.slice(0,a)}\u2026`:"\u2026",u=r.length-1;return u>0?`${c} +${u}`:c}return o>0?`${n.join(",")} +${o}`:n.join(",")}Lt();ao();async function Nx(){let e=mt().sandboxCompleted;if(e!==void 0)return{status:e?"completed":"not_completed"};try{let t=await Qy();if(Tt("sandboxCompleted",t.sandbox_completed),t.sandbox_dataset_id)Tt("sandboxDatasetId",t.sandbox_dataset_id);return t.sandbox_completed?{status:"completed"}:{status:"not_completed"}}catch(t){return{status:"unknown",reason:q(t)}}}var Ik=De(_b(),1);function jx(e){if(e!==e.trim())return null;let t=Ik.default.parse(e);if(!t)return null;if(t.prerelease.length>0||t.build.length>0)return null;return{major:t.major,minor:t.minor,patch:t.patch}}function Cc(e,t){let r=jx(e);if(!r)throw Error(`Invalid version: ${e}`);let n=Ik.default.inc(`${r.major}.${r.minor}.${r.patch}`,t);if(!n)throw Error(`Invalid version: ${e}`);return n}function Nk(e){return jx(e)!==null}Xe();bc();Ou();F2();zn();Dt();import{randomBytes as Ent}from"crypto";import{constants as Uk,accessSync as Snt,chmodSync as $nt,chownSync as knt,closeSync as Gk,copyFileSync as Cnt,existsSync as Wae,fsyncSync as Kae,lstatSync as _o,mkdirSync as Rnt,mkdtempSync as Ant,openSync as Wk,readSync as Ont,readdirSync as Fnt,renameSync as Pnt,rmSync as Kk,rmdirSync as Tnt,statSync as Yae,writeSync as Int}from"fs";import{tmpdir as Nnt}from"os";import{dirname as Vx,join as Oi}from"path";Xe();import{lstatSync as gnt,readdirSync as ynt,statSync as Iae}from"fs";import{open as bnt}from"fs/promises";import{join as Tae}from"path";si();In();bc();var kae="nemar-identifier-scan/1.0 (+https://docs.nemar.org/policies/takedown/)",zrt="https://api.nemar.org",Vrt="https://data.nemar.org",Hrt="https://nemar.s3.us-east-2.amazonaws.com",Grt="https://api.github.com";function Bx(e,t){if(!Number.isSafeInteger(t)||t<1)throw RangeError(`${e} must be a positive integer, got ${t}`)}async function Mx(e,t,r){Bx("pool size",t);let n=0,i=Array.from({length:Math.min(t,e.length)},async()=>{while(n<e.length){let a=e[n++];await r(a)}}),s=(await Promise.allSettled(i)).find((a)=>a.status==="rejected");if(s)throw s.reason}function Wrt(e){Bx("limit",e);let t=0,r=[];return async(n)=>{if(t>=e)await new Promise((i)=>r.push(i));else t++;try{return await n()}finally{let i=r.shift();if(i)i();else t--}}}class Ut extends Error{cls;status;retryable;retryAfterMs;constructor(e,t={}){super(e);this.name="ReadFailure",this.cls=e,this.status=t.status,this.retryable=t.retryable??!1,this.retryAfterMs=t.retryAfterMs}}function Krt(e,t=Date.now()){let r=e?.trim();if(!r)return;if(/^\d+$/.test(r))return Number(r)*1000;let n=Date.parse(r);return Number.isNaN(n)?void 0:Math.max(0,n-t)}function Yrt(e,t){let r=e>=500||e===429;return new Ut(`http-${e}`,{status:e,retryable:r,retryAfterMs:r?Krt(t):void 0})}class jk extends Error{constructor(e){super(e);this.name="RunAborted"}}function Jrt(e){Bx("abort streak",e.streak);let t=e.now??Date.now,r={tripped:null},n=(i)=>{let o=0,s=0,a=(c)=>{throw r.tripped=new jk(c),r.tripped};return{check(){if(r.tripped)throw r.tripped},ok(){o=0},pausedUntilMs(){return s},observe(c){if(r.tripped)throw r.tripped;if(c.retryAfterMs!==void 0&&c.retryAfterMs>e.retryAfterCapMs)a(`${i} asked to wait ${Math.round(c.retryAfterMs/1000)} s (Retry-After), over the ${Math.round(e.retryAfterCapMs/1000)} s cap (${c.cls})`);if(c.retryAfterMs!==void 0)s=Math.max(s,t()+c.retryAfterMs);if(!c.retryable){o=0;return}if(o++,o>=e.streak)a(`${o} consecutive 429, 5xx, timeout or network failures from ${i} (last ${c.cls})`)}}};return{worker:n("the Worker"),direct:n("direct reads")}}function Dae(e){let t=e instanceof Error?e.name:"";return new Ut(t==="TimeoutError"||t==="AbortError"?"timeout":"network",{retryable:!0})}function Xrt(e){if(e instanceof Ut)return e.cls;return`error-${e instanceof Error?e.name:"unknown"}`}async function Zrt(e,t={}){let r=t.tries??3,n=t.baseMs??400,i=t.sleep??((o)=>new Promise((s)=>setTimeout(s,o)));Bx("tries",r);for(let o=1;;o++)try{return await e()}catch(s){if(!(s instanceof Ut&&s.retryable)||o>=r)throw s;let c=s.retryAfterMs??0;if(c>(t.retryAfterCapMs??30000))throw s;await i(Math.max(n*2**(o-1),c))}}async function Qrt(e){await e.body?.cancel().catch(()=>{return})}async function ent(e,t,r={}){let n;try{n=await fetch(e,{headers:{Range:`bytes=0-${t-1}`,"Accept-Encoding":"identity","User-Agent":r.userAgent??kae},signal:AbortSignal.timeout(r.timeoutMs??30000)})}catch(a){throw Dae(a)}if(n.status!==200&&n.status!==206)throw await Qrt(n),Yrt(n.status,n.headers.get("retry-after"));let i=n.body?.getReader();if(!i)throw new Ut("no-body");let o=new Uint8Array(t),s=0;try{while(s<t){let{done:a,value:c}=await i.read();if(a||!c)break;let u=Math.min(c.length,t-s);o.set(c.subarray(0,u),s),s+=u}}catch(a){throw Dae(a)}finally{await i.cancel().catch(()=>{return})}if(s<(r.minBytes??0))throw new Ut("short-body");return o.subarray(0,s)}var Cae={sideFileBytes:2097152,participantsBytes:16777216};function tnt(e,t){let r=/An error occurred \(([A-Za-z0-9]{1,40})\)/.exec(e)?.[1];if(r)return/^\d+$/.test(r)?`aws/http-${r}`:`aws/error-${r}`;return`aws/exit-${t}`}async function rnt(e,t,r={}){let n;try{let i=Bun.spawn(["aws","s3","cp",`s3://nemar/${e}/version/${t}.json`,"-"],{stdout:"pipe",stderr:"pipe",...r.env?{env:r.env}:{}}),o=!1;n=setTimeout(()=>{o=!0,i.kill("SIGKILL")},r.timeoutMs??600000);let[s,a,c]=await Promise.all([new Response(i.stdout).text(),new Response(i.stderr).text(),i.exited]);if(o)throw new Ut("aws/timeout");if(c!==0)throw new Ut(tnt(a,c));return s}catch(i){if(i instanceof Ut)throw i;throw new Ut("aws/unavailable")}finally{clearTimeout(n)}}function nnt(){let e;return async()=>{if(e!==void 0)return e;if(process.env.GITHUB_TOKEN)return e=process.env.GITHUB_TOKEN,e;try{let t=Bun.spawn(["gh","auth","token"],{stdout:"pipe",stderr:"ignore"}),r=(await new Response(t.stdout).text()).trim();e=r===""?null:r}catch{e=null}return e}}var qx=(e)=>e.replace(/\/+$/,"");function Rae(e={}){let t=e.retryAfterCapMs??30000,r=e.awsTimeoutMs??600000;return{api:qx(e.api??process.env.NEMAR_API_BASE??zrt),data:qx(e.data??process.env.NEMAR_DATA_BASE??Vrt),s3Base:qx(e.s3Base??Hrt),githubApi:qx(e.githubApi??Grt),userAgent:e.userAgent??kae,fileConcurrency:e.fileConcurrency??24,workerLimit:Wrt(e.workerConcurrency??6),timeoutMs:e.timeoutMs??30000,manifestTimeoutMs:e.manifestTimeoutMs??120000,retryBaseMs:e.retryBaseMs??400,sleep:e.sleep??((n)=>new Promise((i)=>setTimeout(i,n))),now:e.now??Date.now,retryAfterCapMs:t,breakers:Jrt({streak:e.abortStreak??25,retryAfterCapMs:t,now:e.now??Date.now}),limits:{treeHeaderSample:300,scansTables:1,jsonFiles:300,textFiles:300,sideFileBytes:65536,participantsBytes:1048576,...e.limits},readVersionManifest:e.readVersionManifest??((n,i)=>rnt(n,i,{timeoutMs:r,env:e.awsEnv})),githubToken:e.githubToken??nnt(),...e.readEntryHead?{readEntryHead:e.readEntryHead}:{}}}var Aae=(e,t)=>t.startsWith(`${e.data}/`),int=(e,t)=>Aae(e,t)||t.startsWith(`${e.api}/`)?e.breakers.worker:e.breakers.direct;async function ont(e,t,r){let n=int(e,t);n.check();let i=n.pausedUntilMs()-e.now();if(i>0)await e.sleep(i),n.check();try{let o=await r();return n.ok(),o}catch(o){if(o instanceof Ut)n.observe(o);throw o}}var snt=(e,t)=>({...t===void 0?{}:{tries:t},baseMs:e.retryBaseMs,sleep:e.sleep,retryAfterCapMs:e.retryAfterCapMs});var Eae=(e)=>/sub-([^/_]+)/.exec(e)?.[1]??"?";function Sae(e,t,r){if(t<1)return[];if(e.length<=t)return[...e];let n=new Map;for(let c of e){let u=r(c),d=n.get(u);if(d)d.push(c);else n.set(u,[c])}let i=[...n.entries()].sort(([c],[u])=>c<u?-1:c>u?1:0).map(([,c])=>c);if(i.length>t)return Array.from({length:t},(c,u)=>i[Math.floor((u+0.5)*i.length/t)][0]);let o=i.map((c,u)=>({list:c,index:u})).sort((c,u)=>c.list.length-u.list.length||c.index-u.index),s=t,a=[];return o.forEach(({list:c},u)=>{let d=Math.min(c.length,Math.ceil(s/(o.length-u)));for(let f=0;f<d;f++)a.push(c[Math.floor((f+0.5)*c.length/d)]);s-=d}),a}var ant=(e)=>e.severity==="identifier"&&ure.has(e.kind),cnt=(e)=>yc.has(e.kind);function Oae(e){return e.headerRead===e.edfCount&&e.incompleteReasons.length===0}function lnt(e){if(e.findings.some(ant))return"direct-identifiers";if(e.findings.some((t)=>!cnt(t)))return"review";if(!Oae(e))return"unchecked";if(e.edfCount>0&&e.unscreenedCount>0)return"clean-edf-only-others-unscreened";if(e.edfCount===0)return e.unscreenedCount>0?"not-screened":"no-recordings";return e.findings.length>0?"dates-only":"clean"}var unt=/\.(edf|bdf)$/i,dnt=(e)=>e.edf===!0||unt.test(e.path);function fnt(e){return{edf:e.filter(dnt),participants:e.find((t)=>t.path==="participants.tsv"),scans:e.filter((t)=>t.path.endsWith("_scans.tsv")),json:e.filter((t)=>t.path.endsWith(".json")).filter((t)=>t.path.startsWith("sourcedata/")||!pnt.test(t.path)).filter((t)=>!mnt.test(t.path)),text:e.filter((t)=>hnt.test(t.path)).filter((t)=>t.path.startsWith("sourcedata/")||t.path.startsWith("code/"))}}var pnt=/_(eeg|ieeg|meg|emg|nirs|beh|events|channels|electrodes|coordsystem|scans|physio|stim|photo|T1w|bold)\.(json|tsv)$/,mnt=/(^|\/)(dataset_description|participants|genetic_info)\.json$/,hnt=/\.(py|m|r|txt|md|ya?ml|xml|iml|cfg|ini)$/i;function Fae(e,t,r,n=0){let i=()=>ont(e,t.url,()=>{let o={minBytes:n,userAgent:e.userAgent,timeoutMs:e.timeoutMs};return e.readEntryHead?e.readEntryHead(t,r,o):ent(t.url,r,o)});return Zrt(()=>Aae(e,t.url)?e.workerLimit(i):i(),snt(e))}async function Lx(e,t,r){let n=await Fae(e,t,r),i=t.size===null?n.length>=r:t.size>r;return{text:new TextDecoder("utf-8",{fatal:!1}).decode(n),truncated:i}}function Wu(e,t){for(let r of t)e.push(r)}var $ae="edf/superseded-absent";async function Pae(e,t,r,n,i,o={}){let s=n.map((he)=>he.path),a=i==="clone",c=(he,Ne,yr)=>a?[...he]:Sae(he,Ne,yr),u=[...kb([...s,...o.extraPaths??[]])],d=vre(s),f=Object.values(d.unscreened).reduce((he,Ne)=>he+Ne,0),m={},p=(he,Ne)=>{if(Ne instanceof jk)throw Ne;let yr=`${he}/${Xrt(Ne)}`;m[yr]=(m[yr]??0)+1},h=(he)=>Eae(he.path),g=fnt(n),b=new Set(o.supersededEdf??[]),x=[...g.edf,...b],{participants:_,scans:D,json:C,text:E}=g,F=i==="git-tree"?Sae(x,e.limits.treeHeaderSample,h):[...x],A=0,U=0,O=0,T=0,z={},V=new Set,Y=new Set,ue=new Set,N=new Set,M=new Set,de=new Set;await Mx(F,e.fileConcurrency,async(he)=>{try{let Ne=await Fae(e,he,at,at),yr=ns(Ne),{patient:Zx}=Sb(Ne);if(!yr.some((Zn)=>Zn.kind==="edf-unreadable")){V.add(Zx);let Zn=Zx.split(/\s+/);if(Zn.length>=4)ue.add(Zn[0]),M.add(Zn[2]),N.add(Zn[3])}if(de.add(Eae(he.path)),yr.some((Zn)=>Zn.severity==="identifier"))T++,Y.add(Zx);Wu(u,yr);for(let Zn of new Set(yr.map((yle)=>yle.kind)))z[Zn]=(z[Zn]??0)+1;A++}catch(Ne){if(b.has(he)&&Ne instanceof Ut&&Ne.status===404){O++,m[$ae]=(m[$ae]??0)+1;return}U++,p("edf",Ne)}});let se=x.length-O,ir=!1,bt=!1;if(_&&_.size!==0)try{let{text:he,truncated:Ne}=await Lx(e,_,e.limits.participantsBytes),yr=he.indexOf(`
|
|
1075
|
+
`)}}}Xe();function Gu(e){return(t)=>{try{return e(t)}catch{return String(t)}}}var Ar={id:Gu(l.cyan),metric:Gu(l.magenta),label:Gu(l.bold),warn:Gu(l.yellow),muted:Gu(l.dim),match:Gu(l.green)};var jrt=/[\u001b\u009b][\[\]()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PR-TZcf-ntqry=><~]/g,Mrt=/[\n\r\t]+/g,qrt=/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/g;function Lrt(e){return e.replace(jrt,"").replace(Mrt," ").replace(qrt,"").trim()}var Brt=/(<mark>[\s\S]*?<\/mark>)/g,Urt=/^<mark>([\s\S]*)<\/mark>$/,_ae=400;function vae(e){if(!e||typeof e!=="string")return null;try{let t=e.length>_ae?e.slice(0,_ae):e,r=Lrt(t);if(!r)return null;return r.split(Brt).filter((n)=>n.length>0).map((n)=>{let i=n.match(Urt);return i?Ar.match(i[1]):Ar.muted(n)}).join("")}catch{return null}}function wae(e,t){if(!Number.isFinite(t)||t<=0)return e;if(e.length<=t)return e;let r=e.split(","),n=[],i=0;for(let s of r){let a=n.length===0?s.length:i+1+s.length;if(a>t)break;n.push(s),i=a}let o=r.length-n.length;if(n.length===0){let s=r[0],a=Math.max(0,t-1),c=a>0?`${s.slice(0,a)}\u2026`:"\u2026",u=r.length-1;return u>0?`${c} +${u}`:c}return o>0?`${n.join(",")} +${o}`:n.join(",")}Lt();ao();async function Nx(){let e=mt().sandboxCompleted;if(e!==void 0)return{status:e?"completed":"not_completed"};try{let t=await Qy();if(Tt("sandboxCompleted",t.sandbox_completed),t.sandbox_dataset_id)Tt("sandboxDatasetId",t.sandbox_dataset_id);return t.sandbox_completed?{status:"completed"}:{status:"not_completed"}}catch(t){return{status:"unknown",reason:q(t)}}}var Ik=De(_b(),1);function jx(e){if(e!==e.trim())return null;let t=Ik.default.parse(e);if(!t)return null;if(t.prerelease.length>0||t.build.length>0)return null;return{major:t.major,minor:t.minor,patch:t.patch}}function Cc(e,t){let r=jx(e);if(!r)throw Error(`Invalid version: ${e}`);let n=Ik.default.inc(`${r.major}.${r.minor}.${r.patch}`,t);if(!n)throw Error(`Invalid version: ${e}`);return n}function Nk(e){return jx(e)!==null}Xe();bc();Ou();F2();zn();Dt();import{randomBytes as Ent}from"crypto";import{constants as Uk,accessSync as Snt,chmodSync as $nt,chownSync as knt,closeSync as Gk,copyFileSync as Cnt,existsSync as Wae,fsyncSync as Kae,lstatSync as _o,mkdirSync as Rnt,mkdtempSync as Ant,openSync as Wk,readSync as Ont,readdirSync as Fnt,renameSync as Pnt,rmSync as Kk,rmdirSync as Tnt,statSync as Yae,writeSync as Int}from"fs";import{tmpdir as Nnt}from"os";import{dirname as Vx,join as Oi}from"path";Xe();import{lstatSync as gnt,readdirSync as ynt,statSync as Iae}from"fs";import{open as bnt}from"fs/promises";import{join as Tae}from"path";si();In();bc();var kae="nemar-identifier-scan/1.0 (+https://docs.nemar.org/policies/takedown/)",zrt="https://nemar-api-dev.sccn-org.workers.dev",Vrt="https://data.nemar.org",Hrt="https://nemar.s3.us-east-2.amazonaws.com",Grt="https://api.github.com";function Bx(e,t){if(!Number.isSafeInteger(t)||t<1)throw RangeError(`${e} must be a positive integer, got ${t}`)}async function Mx(e,t,r){Bx("pool size",t);let n=0,i=Array.from({length:Math.min(t,e.length)},async()=>{while(n<e.length){let a=e[n++];await r(a)}}),s=(await Promise.allSettled(i)).find((a)=>a.status==="rejected");if(s)throw s.reason}function Wrt(e){Bx("limit",e);let t=0,r=[];return async(n)=>{if(t>=e)await new Promise((i)=>r.push(i));else t++;try{return await n()}finally{let i=r.shift();if(i)i();else t--}}}class Ut extends Error{cls;status;retryable;retryAfterMs;constructor(e,t={}){super(e);this.name="ReadFailure",this.cls=e,this.status=t.status,this.retryable=t.retryable??!1,this.retryAfterMs=t.retryAfterMs}}function Krt(e,t=Date.now()){let r=e?.trim();if(!r)return;if(/^\d+$/.test(r))return Number(r)*1000;let n=Date.parse(r);return Number.isNaN(n)?void 0:Math.max(0,n-t)}function Yrt(e,t){let r=e>=500||e===429;return new Ut(`http-${e}`,{status:e,retryable:r,retryAfterMs:r?Krt(t):void 0})}class jk extends Error{constructor(e){super(e);this.name="RunAborted"}}function Jrt(e){Bx("abort streak",e.streak);let t=e.now??Date.now,r={tripped:null},n=(i)=>{let o=0,s=0,a=(c)=>{throw r.tripped=new jk(c),r.tripped};return{check(){if(r.tripped)throw r.tripped},ok(){o=0},pausedUntilMs(){return s},observe(c){if(r.tripped)throw r.tripped;if(c.retryAfterMs!==void 0&&c.retryAfterMs>e.retryAfterCapMs)a(`${i} asked to wait ${Math.round(c.retryAfterMs/1000)} s (Retry-After), over the ${Math.round(e.retryAfterCapMs/1000)} s cap (${c.cls})`);if(c.retryAfterMs!==void 0)s=Math.max(s,t()+c.retryAfterMs);if(!c.retryable){o=0;return}if(o++,o>=e.streak)a(`${o} consecutive 429, 5xx, timeout or network failures from ${i} (last ${c.cls})`)}}};return{worker:n("the Worker"),direct:n("direct reads")}}function Dae(e){let t=e instanceof Error?e.name:"";return new Ut(t==="TimeoutError"||t==="AbortError"?"timeout":"network",{retryable:!0})}function Xrt(e){if(e instanceof Ut)return e.cls;return`error-${e instanceof Error?e.name:"unknown"}`}async function Zrt(e,t={}){let r=t.tries??3,n=t.baseMs??400,i=t.sleep??((o)=>new Promise((s)=>setTimeout(s,o)));Bx("tries",r);for(let o=1;;o++)try{return await e()}catch(s){if(!(s instanceof Ut&&s.retryable)||o>=r)throw s;let c=s.retryAfterMs??0;if(c>(t.retryAfterCapMs??30000))throw s;await i(Math.max(n*2**(o-1),c))}}async function Qrt(e){await e.body?.cancel().catch(()=>{return})}async function ent(e,t,r={}){let n;try{n=await fetch(e,{headers:{Range:`bytes=0-${t-1}`,"Accept-Encoding":"identity","User-Agent":r.userAgent??kae},signal:AbortSignal.timeout(r.timeoutMs??30000)})}catch(a){throw Dae(a)}if(n.status!==200&&n.status!==206)throw await Qrt(n),Yrt(n.status,n.headers.get("retry-after"));let i=n.body?.getReader();if(!i)throw new Ut("no-body");let o=new Uint8Array(t),s=0;try{while(s<t){let{done:a,value:c}=await i.read();if(a||!c)break;let u=Math.min(c.length,t-s);o.set(c.subarray(0,u),s),s+=u}}catch(a){throw Dae(a)}finally{await i.cancel().catch(()=>{return})}if(s<(r.minBytes??0))throw new Ut("short-body");return o.subarray(0,s)}var Cae={sideFileBytes:2097152,participantsBytes:16777216};function tnt(e,t){let r=/An error occurred \(([A-Za-z0-9]{1,40})\)/.exec(e)?.[1];if(r)return/^\d+$/.test(r)?`aws/http-${r}`:`aws/error-${r}`;return`aws/exit-${t}`}async function rnt(e,t,r={}){let n;try{let i=Bun.spawn(["aws","s3","cp",`s3://nemar/${e}/version/${t}.json`,"-"],{stdout:"pipe",stderr:"pipe",...r.env?{env:r.env}:{}}),o=!1;n=setTimeout(()=>{o=!0,i.kill("SIGKILL")},r.timeoutMs??600000);let[s,a,c]=await Promise.all([new Response(i.stdout).text(),new Response(i.stderr).text(),i.exited]);if(o)throw new Ut("aws/timeout");if(c!==0)throw new Ut(tnt(a,c));return s}catch(i){if(i instanceof Ut)throw i;throw new Ut("aws/unavailable")}finally{clearTimeout(n)}}function nnt(){let e;return async()=>{if(e!==void 0)return e;if(process.env.GITHUB_TOKEN)return e=process.env.GITHUB_TOKEN,e;try{let t=Bun.spawn(["gh","auth","token"],{stdout:"pipe",stderr:"ignore"}),r=(await new Response(t.stdout).text()).trim();e=r===""?null:r}catch{e=null}return e}}var qx=(e)=>e.replace(/\/+$/,"");function Rae(e={}){let t=e.retryAfterCapMs??30000,r=e.awsTimeoutMs??600000;return{api:qx(e.api??process.env.NEMAR_API_BASE??zrt),data:qx(e.data??process.env.NEMAR_DATA_BASE??Vrt),s3Base:qx(e.s3Base??Hrt),githubApi:qx(e.githubApi??Grt),userAgent:e.userAgent??kae,fileConcurrency:e.fileConcurrency??24,workerLimit:Wrt(e.workerConcurrency??6),timeoutMs:e.timeoutMs??30000,manifestTimeoutMs:e.manifestTimeoutMs??120000,retryBaseMs:e.retryBaseMs??400,sleep:e.sleep??((n)=>new Promise((i)=>setTimeout(i,n))),now:e.now??Date.now,retryAfterCapMs:t,breakers:Jrt({streak:e.abortStreak??25,retryAfterCapMs:t,now:e.now??Date.now}),limits:{treeHeaderSample:300,scansTables:1,jsonFiles:300,textFiles:300,sideFileBytes:65536,participantsBytes:1048576,...e.limits},readVersionManifest:e.readVersionManifest??((n,i)=>rnt(n,i,{timeoutMs:r,env:e.awsEnv})),githubToken:e.githubToken??nnt(),...e.readEntryHead?{readEntryHead:e.readEntryHead}:{}}}var Aae=(e,t)=>t.startsWith(`${e.data}/`),int=(e,t)=>Aae(e,t)||t.startsWith(`${e.api}/`)?e.breakers.worker:e.breakers.direct;async function ont(e,t,r){let n=int(e,t);n.check();let i=n.pausedUntilMs()-e.now();if(i>0)await e.sleep(i),n.check();try{let o=await r();return n.ok(),o}catch(o){if(o instanceof Ut)n.observe(o);throw o}}var snt=(e,t)=>({...t===void 0?{}:{tries:t},baseMs:e.retryBaseMs,sleep:e.sleep,retryAfterCapMs:e.retryAfterCapMs});var Eae=(e)=>/sub-([^/_]+)/.exec(e)?.[1]??"?";function Sae(e,t,r){if(t<1)return[];if(e.length<=t)return[...e];let n=new Map;for(let c of e){let u=r(c),d=n.get(u);if(d)d.push(c);else n.set(u,[c])}let i=[...n.entries()].sort(([c],[u])=>c<u?-1:c>u?1:0).map(([,c])=>c);if(i.length>t)return Array.from({length:t},(c,u)=>i[Math.floor((u+0.5)*i.length/t)][0]);let o=i.map((c,u)=>({list:c,index:u})).sort((c,u)=>c.list.length-u.list.length||c.index-u.index),s=t,a=[];return o.forEach(({list:c},u)=>{let d=Math.min(c.length,Math.ceil(s/(o.length-u)));for(let f=0;f<d;f++)a.push(c[Math.floor((f+0.5)*c.length/d)]);s-=d}),a}var ant=(e)=>e.severity==="identifier"&&ure.has(e.kind),cnt=(e)=>yc.has(e.kind);function Oae(e){return e.headerRead===e.edfCount&&e.incompleteReasons.length===0}function lnt(e){if(e.findings.some(ant))return"direct-identifiers";if(e.findings.some((t)=>!cnt(t)))return"review";if(!Oae(e))return"unchecked";if(e.edfCount>0&&e.unscreenedCount>0)return"clean-edf-only-others-unscreened";if(e.edfCount===0)return e.unscreenedCount>0?"not-screened":"no-recordings";return e.findings.length>0?"dates-only":"clean"}var unt=/\.(edf|bdf)$/i,dnt=(e)=>e.edf===!0||unt.test(e.path);function fnt(e){return{edf:e.filter(dnt),participants:e.find((t)=>t.path==="participants.tsv"),scans:e.filter((t)=>t.path.endsWith("_scans.tsv")),json:e.filter((t)=>t.path.endsWith(".json")).filter((t)=>t.path.startsWith("sourcedata/")||!pnt.test(t.path)).filter((t)=>!mnt.test(t.path)),text:e.filter((t)=>hnt.test(t.path)).filter((t)=>t.path.startsWith("sourcedata/")||t.path.startsWith("code/"))}}var pnt=/_(eeg|ieeg|meg|emg|nirs|beh|events|channels|electrodes|coordsystem|scans|physio|stim|photo|T1w|bold)\.(json|tsv)$/,mnt=/(^|\/)(dataset_description|participants|genetic_info)\.json$/,hnt=/\.(py|m|r|txt|md|ya?ml|xml|iml|cfg|ini)$/i;function Fae(e,t,r,n=0){let i=()=>ont(e,t.url,()=>{let o={minBytes:n,userAgent:e.userAgent,timeoutMs:e.timeoutMs};return e.readEntryHead?e.readEntryHead(t,r,o):ent(t.url,r,o)});return Zrt(()=>Aae(e,t.url)?e.workerLimit(i):i(),snt(e))}async function Lx(e,t,r){let n=await Fae(e,t,r),i=t.size===null?n.length>=r:t.size>r;return{text:new TextDecoder("utf-8",{fatal:!1}).decode(n),truncated:i}}function Wu(e,t){for(let r of t)e.push(r)}var $ae="edf/superseded-absent";async function Pae(e,t,r,n,i,o={}){let s=n.map((he)=>he.path),a=i==="clone",c=(he,Ne,yr)=>a?[...he]:Sae(he,Ne,yr),u=[...kb([...s,...o.extraPaths??[]])],d=vre(s),f=Object.values(d.unscreened).reduce((he,Ne)=>he+Ne,0),m={},p=(he,Ne)=>{if(Ne instanceof jk)throw Ne;let yr=`${he}/${Xrt(Ne)}`;m[yr]=(m[yr]??0)+1},h=(he)=>Eae(he.path),g=fnt(n),b=new Set(o.supersededEdf??[]),x=[...g.edf,...b],{participants:_,scans:D,json:C,text:E}=g,F=i==="git-tree"?Sae(x,e.limits.treeHeaderSample,h):[...x],A=0,U=0,O=0,T=0,z={},V=new Set,Y=new Set,ue=new Set,N=new Set,M=new Set,de=new Set;await Mx(F,e.fileConcurrency,async(he)=>{try{let Ne=await Fae(e,he,at,at),yr=ns(Ne),{patient:Zx}=Sb(Ne);if(!yr.some((Zn)=>Zn.kind==="edf-unreadable")){V.add(Zx);let Zn=Zx.split(/\s+/);if(Zn.length>=4)ue.add(Zn[0]),M.add(Zn[2]),N.add(Zn[3])}if(de.add(Eae(he.path)),yr.some((Zn)=>Zn.severity==="identifier"))T++,Y.add(Zx);Wu(u,yr);for(let Zn of new Set(yr.map((yle)=>yle.kind)))z[Zn]=(z[Zn]??0)+1;A++}catch(Ne){if(b.has(he)&&Ne instanceof Ut&&Ne.status===404){O++,m[$ae]=(m[$ae]??0)+1;return}U++,p("edf",Ne)}});let se=x.length-O,ir=!1,bt=!1;if(_&&_.size!==0)try{let{text:he,truncated:Ne}=await Lx(e,_,e.limits.participantsBytes),yr=he.indexOf(`
|
|
1076
1076
|
`);if(yr<0&&Ne)throw new Ut("header-truncated");Wu(u,yre(yr<0?he:he.slice(0,yr))),Wu(u,xre(he)),bt=Ne}catch(he){ir=!0,p("participants",he)}let Or=c(D,e.limits.scansTables,h),Gr=0;await Mx(Or,e.fileConcurrency,async(he)=>{if(he.size===0){Gr++;return}try{let{text:Ne}=await Lx(e,he,e.limits.sideFileBytes);Wu(u,$b(Ne)),Gr++}catch(Ne){p("scans",Ne)}});let Fr=e.limits.sideFileBytes,Wr=(he)=>he.size!==null&&he.size>Fr,J=c(C.filter((he)=>!Wr(he)),e.limits.jsonFiles,h),j=c(E.filter((he)=>!Wr(he)),e.limits.textFiles,h),X=0,W=0;await Mx(J,e.fileConcurrency,async(he)=>{if(he.size===0){X++;return}try{let{text:Ne}=await Lx(e,he,Fr),yr;try{yr=JSON.parse(Ne)}catch{throw new Ut("json-parse")}Wu(u,gc(yr)),X++}catch(Ne){p("json",Ne)}}),await Mx(j,e.fileConcurrency,async(he)=>{if(he.size===0){W++;return}try{let{text:Ne}=await Lx(e,he,Fr);Wu(u,_re(Ne)),W++}catch(Ne){p("text",Ne)}});let G={edf_headers:{candidates:se,oversize:0,selected:F.length-O,scanned:A},scans_tables:{candidates:D.length,oversize:0,selected:Or.length,scanned:Gr},json_files:{candidates:C.length,oversize:C.filter(Wr).length,selected:J.length,scanned:X},text_files:{candidates:E.length,oversize:E.filter(Wr).length,selected:j.length,scanned:W}},Be=new Set,En=(he,Ne)=>{if(Ne.oversize>0)Be.add(`${he}-oversize`);if(Ne.candidates-Ne.oversize>Ne.selected)Be.add(`${he}-sampled`);if(Ne.scanned<Ne.selected)Be.add(`${he}-unread`)};if(En("edf-headers",G.edf_headers),En("json",G.json_files),En("text",G.text_files),G.scans_tables.scanned<G.scans_tables.selected)Be.add("scans-unread");if(ir)Be.add("participants-unread");if(bt)Be.add("participants-truncated");for(let he of o.extraIncompleteReasons??[])Be.add(he);let wo=[...Be].sort(),uC={findings:u,edfCount:se,headerRead:A,unscreenedCount:f,incompleteReasons:wo},hle=u.filter((he)=>he.severity==="identifier"),gle=Object.entries(m).filter(([he])=>!he.startsWith("edf/")).reduce((he,[,Ne])=>he+Ne,0);return{id:t,version:r,scanned_at:new Date().toISOString(),manifest_source:i,status:lnt(uC),incomplete:!Oae(uC),incomplete_reasons:wo,files:{total:n.length,edf_bdf:se,header_read:A,header_read_failed:U},sampling:G,read_failures:m,edf_bdf_files_flagged:T,distinct_patient_field_values:V.size,distinct_subjects_with_edf_bdf:de.size,distinct_patient_code_subfield:ue.size,distinct_patient_name_subfield:N.size,distinct_patient_birth_subfield:M.size,distinct_patient_field_values_in_flagged_files:Y.size,findings_by_kind:wre(u),edf_bdf_files_by_kind:z,unscreened_formats:d.unscreened,side_reads_failed:gle,finding_fields:[...new Set(hle.map((he)=>`${he.kind}:${he.field}`))].sort()}}Ou();zn();hu();Bu();var Rc="--acknowledge-identifier-preflight",xnt=16,_nt="local:";function Lk(e){let t=[],r=new Map,n=0,i=[""];while(i.length>0){let o=i.pop(),s;try{s=ynt(o===""?e:Tae(e,o),{withFileTypes:!0})}catch{n++;continue}s.sort((c,u)=>c.name<u.name?-1:c.name>u.name?1:0);let a=[];for(let c of s){let u=c.name;if(o===""&&(u===".git"||u===".nemar"))continue;let d=o===""?u:`${o}/${u}`;if(c.isDirectory()){a.push(d);continue}if(u===".gitattributes")continue;let f=`${_nt}${t.length}`,m=Tae(e,d),p=null;try{let h=Iae(m);if(h.isFile())p=h.size,r.set(f,m);else if(h.isDirectory()&&!gnt(m).isSymbolicLink()){a.push(d);continue}}catch{}t.push({path:d,size:p,url:f})}for(let c=a.length-1;c>=0;c--)i.push(a[c])}return{entries:t,readable:r,unlisted:n}}function vnt(e,t=new Map){return async(r,n,i)=>{let o=e.get(r.url);if(o===void 0)throw new Ut("unreadable-entry");let s=t.get(o),a;try{a=await bnt(o,"r")}catch{throw new Ut("unreadable-entry")}try{let c=r.size===null?n:Math.min(n,r.size),u=new Uint8Array(c),d=0;while(d<c){let{bytesRead:f}=await a.read(u,d,c-d,d);if(f===0)break;d+=f}if(d<i.minBytes)throw new Ut("short-body");if(s)u.set(s.subarray(0,Math.min(d,s.length)),0);return u.subarray(0,d)}catch(c){if(c instanceof Ut)throw c;throw new Ut("unreadable-entry")}finally{await a.close().catch(()=>{return})}}}async function Nae(e,t){let r=Lk(e),n=Rae({fileConcurrency:xnt,workerConcurrency:1,limits:{...Cae},readEntryHead:vnt(r.readable,t),githubToken:async()=>null,readVersionManifest:async()=>{throw new Ut("unreadable-entry")},sleep:async()=>{return}}),i=await Pae(n,"local",null,r.entries,"clone",{extraIncompleteReasons:r.unlisted>0?["tree-truncated"]:[]}),o={scanned_at:i.scanned_at,status:i.status,incomplete:i.incomplete,incomplete_reasons:i.incomplete_reasons,files:i.files,findings_by_kind:i.findings_by_kind,edf_bdf_files_flagged:i.edf_bdf_files_flagged,unscreened_formats:i.unscreened_formats,read_failures:i.read_failures};return Q$(Ore(Pre(o)))}function zx(e){if(ma(e.status)!=="acknowledge")return[];let t=new Set([e.status]);if(e.incomplete&&e.status!=="unchecked")t.add("unchecked");let r=Object.values(e.unscreened_formats).reduce((i,o)=>i+o,0),n=e.status==="not-screened"||e.status==="clean-edf-only-others-unscreened";if(r>0&&!n)t.add("not-screened");return[...t].sort()}var jae=(e,t)=>e.length===t.length&&e.every((r,n)=>r===t[n]);function Mae(e,t){let r=e.split(",").map((i)=>i.trim()).filter((i)=>i!==""),n=Ob;if(r.length===0||!r.every((i)=>n.includes(i)))throw new ed(`Allowed verdicts are ${n.join(", ")}. Direct identifiers cannot be acknowledged.`);return[...t??[],...r]}function wnt(e,t){let r=ma(e.status);if(r==="clear")return{action:"proceed",acknowledgedVia:null};if(r!=="acknowledge")return{action:"refuse"};if(t.acknowledge!==void 0){let n=[...new Set(t.acknowledge)].sort();return jae(n,zx(e))?{action:"proceed",acknowledgedVia:"flag"}:{action:"stop",why:"acknowledgment-mismatch"}}if(t.dryRun)return{action:"preview"};if(t.no)return{action:"stop",why:"declined"};if(t.isTty)return{action:"prompt"};return{action:"stop",why:"acknowledgment-required"}}var Dnt={review:"the scanner found something a person should look at (the kinds are listed above)",unchecked:"the scanner could not read everything it should have (see Incomplete above)","not-screened":"some recordings are in formats the scanner cannot read, so their headers were not checked","clean-edf-only-others-unscreened":"the EDF/BDF headers are clean, but other recordings are in formats the scanner cannot read"},Mk=(e)=>`${Rc} ${e.join(",")}`;function qk(e){console.log(l.yellow(" This does not stop an upload, but it needs your explicit acknowledgment of:"));for(let t of e)console.log(l.yellow(` ${t}: ${Dnt[t]??"not clean"}.`));console.log(l.dim(" Your acknowledgment is recorded with your deposit attestation. NEMAR screens the dataset again when you request publication, and an administrator decides then."))}function qae(){console.log(),console.log(l.red(" Upload refused: the preflight found direct identifiers (a name, a birth date finer than the year, a record number, an age over 89, or an identifying column or key). Nothing was sent.")),console.log(l.red(" Remove them from the files (for EDF/BDF, the patient and recording fields of the header) and run the upload again.")),console.log(l.dim(` There is no override, and ${Rc} does not apply. If this is a false positive, please report it, so the scanner is fixed for every dataset. Terms: ${Ax}`))}function Lae(e){if(e instanceof Rb)return`report-${e.message}`;let t=e instanceof Error&&/^[A-Za-z]{1,40}$/.test(e.name)?e.name:"unknown",r=e?.code;return typeof r==="string"&&/^E[A-Z0-9]{1,20}$/.test(r)?`${t} ${r}`:t}function Bae(e,t){e.fail("Identifier preflight: DID NOT FINISH"),console.log(l.red(` The preflight could not produce a verdict, so nothing was uploaded (${Lae(t)}).`)),console.log(l.dim(" Please report this: https://github.com/nemarOrg/nemar-cli/issues"))}function Ux(e,t,r=""){let n=e2(t,null),i=`${n.headline}${r}`;if(n.tone==="ok")e.succeed(i);else if(n.tone==="stop")e.fail(i);else e.warn(i);for(let o of ha({state:t.status,...n},2).slice(1))console.log(o)}function Uae(e,t){try{return Bt(Tre({version:Cb,scanner:`nemar-cli@${Di}`,scan:e,acknowledged_via:t}))}catch(r){return console.log(l.red(` The preflight's record did not fit the report contract (${Lae(r)}), so nothing was uploaded.`)),Ge}}async function zae(e,t,r=process.stdin.isTTY===!0,n){let i=S("Screening for identifiers on this machine (nothing is sent)...").start(),o=!1;try{o=Iae(e).isDirectory()}catch{o=!1}if(!o)return i.fail("Identifier preflight: the dataset path is not a directory"),Ge;let s=new Map((n?.items??[]).map((m)=>[m.path,m.after])),a;try{a=await Nae(e,s)}catch(m){return Bae(i,m),Ge}Ux(i,a);let c=zx(a),u=wnt(a,{acknowledge:t.acknowledgeIdentifierPreflight,dryRun:t.dryRun,no:t.no,isTty:r}),d;switch(u.action){case"proceed":if(u.acknowledgedVia==="flag")console.log(l.dim(` Acknowledged with ${Mk(c)}.`));else if(t.acknowledgeIdentifierPreflight!==void 0)console.log(l.dim(` Nothing to acknowledge; ${Rc} was not needed.`));d=u.acknowledgedVia;break;case"preview":return qk(c),console.log(l.yellow(` A real upload stops here until you acknowledge it: answer the prompt, or pass ${Mk(c)}.`)),console.log(),Bt(null);case"prompt":{qk(c);let m=!1,p=()=>{console.log(l.red(`
|
|
1077
1077
|
Upload cancelled. Nothing was sent.`)),so(),process.exit(130)};process.once("SIGINT",p);let h=setInterval(()=>{return},1000);try{({acknowledged:m}=await me.prompt([{type:"confirm",name:"acknowledged",message:"Upload anyway?",default:!1}]))}catch{m=!1}finally{clearInterval(h),process.off("SIGINT",p)}if(m!==!0)return console.log(l.red(" Upload cancelled. Nothing was sent.")),so(),Ge;console.log(l.dim(" Acknowledged at the prompt.")),d="prompt";break}case"refuse":return qae(),so(),Ge;case"stop":if(u.why==="acknowledgment-mismatch")console.log(l.red(` ${Rc} must name exactly what was found, which is: ${c.join(",")}. It does not acknowledge this scan. Nothing was sent.`));else qk(c),console.log(l.red(u.why==="declined"?" Declined (--no). Nothing was sent.":` No terminal to ask at: run interactively, or pass ${Mk(c)}. --yes does not acknowledge a finding. Nothing was sent.`));return so(),Ge}let f=Uae(a,d);if(f.status==="ok")console.log();return f}async function Vae(e,t){let r=S("Screening again, right before anything is sent...").start(),n;try{n=await Nae(e)}catch(a){return Bae(r,a),Ge}let i=ma(n.status);if(i!=="clear"&&i!=="acknowledge")return Ux(r,n),qae(),so(),Ge;let o=zx(t.scan),s=zx(n);if(!jae(o,s))return Ux(r,n),console.log(l.red(` The files changed since the preflight, and so did what it found (acknowledged: ${o.join(",")||"nothing"}; now: ${s.join(",")}). Nothing was sent. Run the upload again.`)),so(),Ge;if(Ab(n.findings_by_kind)!==Ab(t.scan.findings_by_kind))Ux(r,n," (screened again)");else r.succeed(`${e2(n,null).headline} (screened again)`);return Uae(n,t.acknowledged_via)}var jnt=/\.(edf|bdf)$/i,Jae=Oi(".nemar","date-normalization"),Mnt=()=>({tracked:0,"nested-repository":0,ignored:0,"tracking-unknown":0,link:0,"not-writable":0,"other-filesystem":0,unverified:0});function qnt(){return{items:[],left:Mnt()}}function Lnt(e){if(process.env.GIT_DIR||process.env.GIT_WORK_TREE)return!0;for(let t=e;;t=Vx(t)){if(Wae(Oi(t,".git")))return!0;if(Vx(t)===t)return!1}}var zk=(e)=>e.normalize("NFC").toLowerCase();async function Bk(e,t,r){try{let n=await k(e,{cwd:t,...r===void 0?{}:{stdin:r}});if(!(n.exitCode===0||e.includes("check-ignore")&&n.exitCode===1))return null;return new Set(n.stdout.split("\x00").filter(Boolean).map(zk))}catch{return null}}async function Bnt(e,t){let r=`${t.join("\x00")}\x00`;if(Lnt(e)){let i=await Bk(["git","ls-files","-z"],e),o=await Bk(["git","check-ignore","-z","--stdin"],e,r);return i&&o?{tracked:i,ignored:o}:null}let n=null;try{if(n=Ant(Oi(Nnt(),"nemar-ignore-")),(await k(["git","init","-q","--bare",n],{cwd:e})).exitCode!==0)return null;let o=await Bk(["git",`--git-dir=${n}`,`--work-tree=${e}`,"check-ignore","--no-index","-z","--stdin"],e,r);return o?{tracked:new Set,ignored:o}:null}catch{return null}finally{if(n!==null)try{Kk(n,{recursive:!0,force:!0})}catch{}}}function Vk(e){let t;try{t=Wk(e,"r")}catch{return null}try{let r=new Uint8Array(at),n=0;while(n<at){let i=Ont(t,r,n,at-n,n);if(i===0)break;n+=i}return n===at?r:null}catch{return null}finally{try{Gk(t)}catch{}}}var Hae=(e,t)=>e!==null&&e.length===t.length&&e.every((r,n)=>r===t[n]);function Gae(e){try{return Snt(e,Uk.W_OK),!0}catch{return!1}}function Unt(e,t,r){let n=t.split("/").slice(0,-1);for(let i=1;i<=n.length;i++){let o=n.slice(0,i).join("/"),s=r.get(o);if(s===void 0){s=Wae(Oi(e,o,".git"));try{s||=_o(Oi(e,o,".git")).isSymbolicLink()}catch{}r.set(o,s)}if(s)return!0}return!1}async function Xae(e){let t=qnt();try{await znt(e,t)}catch(r){Kt(`date normalization: planning stopped (${r instanceof Error?r.name:"unknown"})`)}return t}async function znt(e,t){let r=Yae(e).dev,n=Lk(e),i=[];for(let c of n.entries){if(!jnt.test(c.path))continue;let u=n.readable.get(c.url);if(u===void 0)continue;let d=Vk(u);if(d===null)continue;try{let f=Qb(d);if(f.changed)i.push({path:u,rel:c.path,before:d,after:f.header})}catch(f){if(f instanceof as)continue;t.left.unverified++,Kt(`date normalization: a header was not planned (${f instanceof Error?f.name:"unknown"})`)}}if(i.length===0)return;let o=await Bnt(e,i.map((c)=>c.rel)),s=new Map,a=typeof process.getuid==="function"?process.getuid():null;for(let c of i){if(o===null){t.left["tracking-unknown"]++;continue}if(o.tracked.has(zk(c.rel))){t.left.tracked++;continue}if(Unt(e,c.rel,s)){t.left["nested-repository"]++;continue}if(o.ignored.has(zk(c.rel))){t.left.ignored++;continue}let u;try{u=_o(c.path)}catch{continue}if(u.isSymbolicLink()){t.left.link++;continue}if(!u.isFile())continue;if(u.dev!==r){t.left["other-filesystem"]++;continue}if(a!==null&&u.uid!==a||(u.mode&128)===0||!Gae(c.path)||!Gae(Vx(c.path))){t.left["not-writable"]++;continue}t.items.push({path:c.path,rel:c.rel,dev:u.dev,ino:u.ino,size:u.size,mtimeMs:u.mtimeMs,mode:u.mode,gid:u.gid,before:c.before,after:c.after})}}var Vnt=/^\d+-[0-9a-f]{16}$/;function Hnt(e){try{let t=Oi(e,Jae);for(let r of[Oi(e,".nemar"),t])if(!_o(r).isDirectory())return;for(let r of Fnt(t))if(Vnt.test(r))Kk(Oi(t,r),{force:!0})}catch{}}function Hk(e){for(let t of e)try{Tnt(t)}catch{}}function Gnt(e,t){let r=[],n=Oi(e,Jae);try{for(let i of[Oi(e,".nemar"),n]){let o;try{o=_o(i)}catch{Rnt(i),r.push(i),o=_o(i)}if(!o.isDirectory()||o.dev!==t)return Hk([...r].reverse()),null}return{dir:n,made:r}}catch{return Hk([...r].reverse()),null}}function Wnt(e){try{let t=Wk(e,"r");try{Kae(t)}finally{Gk(t)}}catch{}}function Knt(e,t){let r=null;try{let n=(o)=>o.isFile()&&o.dev===e.dev&&o.ino===e.ino&&o.size===e.size&&o.mtimeMs===e.mtimeMs;if(!n(_o(e.path))||!Hae(Vk(e.path),e.before))return null;if(r=Oi(t,`${process.pid}-${Ent(8).toString("hex")}`),Cnt(e.path,r,Uk.COPYFILE_EXCL|Uk.COPYFILE_FICLONE),_o(r).gid!==e.gid)knt(r,-1,e.gid);$nt(r,e.mode&4095);let i=Wk(r,"r+");try{if(Int(i,e.after,0,at,0)!==at)return null;Kae(i)}finally{Gk(i)}if(_o(r).size!==e.size||!Hae(Vk(r),e.after))return null;if(!n(_o(e.path)))return null;return Pnt(r,e.path),r=null,Wnt(Vx(e.path)),_o(e.path).mtimeMs}catch(n){return Kt(`date normalization: a header was not set (${n instanceof Error?n.name:"unknown"})`),null}finally{if(r!==null)try{Kk(r,{force:!0})}catch{}}}function Zae(e,t){let r={set:0,left:0,mtimes:new Map};if(Hnt(e),t.items.length===0)return r;let n=null;try{n=Gnt(e,Yae(e).dev)}catch{}if(n===null)return r.left=t.items.length,Kt("date normalization: no work directory, nothing set"),r;try{for(let i of t.items){let o=Knt(i,n.dir);if(o===null){r.left++;continue}r.set++,r.mtimes.set(i.rel,o)}}finally{Hk([n.dir,...[...n.made].reverse().filter((i)=>i!==n.dir)])}if(r.set>0)console.log(l.dim(` ${Cre(r.set)}`));return r}Xe();si();In();import{existsSync as Tm,mkdirSync as pit,readFileSync as Im,writeFileSync as yce}from"fs";import{basename as mit,resolve as Ac}from"path";ua();Lt();_n();si();import{existsSync as Hx,readFileSync as Yk,writeFileSync as ece}from"fs";import{resolve as Gx}from"path";var Jk=[{spdxId:"CC0-1.0",name:"CC0 1.0 Universal (Public Domain)",description:"No rights reserved. Anyone can use the data for any purpose.",url:"https://creativecommons.org/publicdomain/zero/1.0/",allowsResearchUse:!0},{spdxId:"PDDL-1.0",name:"Open Data Commons Public Domain Dedication and License (PDDL)",description:"Database-specific public domain dedication.",url:"https://opendatacommons.org/licenses/pddl/1-0/",allowsResearchUse:!0},{spdxId:"CC-BY-4.0",name:"Creative Commons Attribution 4.0 International",description:"Attribution required. Free for any use including commercial.",url:"https://creativecommons.org/licenses/by/4.0/",allowsResearchUse:!0},{spdxId:"CC-BY-SA-4.0",name:"Creative Commons Attribution-ShareAlike 4.0 International",description:"Attribution + share-alike required. Derivatives must use same license.",url:"https://creativecommons.org/licenses/by-sa/4.0/",allowsResearchUse:!0},{spdxId:"CC-BY-NC-4.0",name:"Creative Commons Attribution-NonCommercial 4.0 International",description:"Attribution required. Non-commercial use only.",url:"https://creativecommons.org/licenses/by-nc/4.0/",allowsResearchUse:!0},{spdxId:"CC-BY-NC-SA-4.0",name:"Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International",description:"Attribution + non-commercial + share-alike required.",url:"https://creativecommons.org/licenses/by-nc-sa/4.0/",allowsResearchUse:!0},{spdxId:"ODC-By-1.0",name:"Open Data Commons Attribution License v1.0",description:"Database-specific attribution license.",url:"https://opendatacommons.org/licenses/by/1.0/",allowsResearchUse:!0},{spdxId:"ODbL-1.0",name:"Open Data Commons Open Database License v1.0",description:"Database attribution + share-alike. Produced works can be any license.",url:"https://opendatacommons.org/licenses/odbl/1.0/",allowsResearchUse:!0}],Qae=new Set(["CC0-1.0","CC-BY-4.0","CC-BY-SA-4.0","CC-BY-NC-4.0","CC-BY-NC-SA-4.0","CC-BY-ND-4.0","CC-BY-NC-ND-4.0","PDDL-1.0","ODC-By-1.0","ODbL-1.0","MIT","Apache-2.0","GPL-2.0-only","GPL-2.0-or-later","GPL-3.0-only","GPL-3.0-or-later","LGPL-2.1-only","LGPL-2.1-or-later","LGPL-3.0-only","LGPL-3.0-or-later","BSD-2-Clause","BSD-3-Clause","ISC","Unlicense"]);function tce(e){let t=Gx(e,"dataset_description.json");if(Hx(t))try{let n=JSON.parse(Yk(t,"utf-8"));if(typeof n.License==="string"&&n.License.trim())return{spdxId:n.License.trim(),source:"dataset_description"}}catch(n){if(n instanceof SyntaxError)console.warn(` Warning: dataset_description.json has invalid JSON: ${n.message}`);else console.warn(` Warning: Could not read dataset_description.json: ${n instanceof Error?n.message:String(n)}`)}let r=["LICENSE","LICENSE.txt","LICENSE.md","LICENCE","LICENCE.txt"];for(let n of r){let i=Gx(e,n);if(Hx(i)){try{let o=Yk(i,"utf-8").toLowerCase();if(o.includes("cc0")||o.includes("public domain dedication"))return{spdxId:"CC0-1.0",source:"license_file"};if(o.includes("attribution-noncommercial-sharealike"))return{spdxId:"CC-BY-NC-SA-4.0",source:"license_file"};if(o.includes("attribution-noncommercial"))return{spdxId:"CC-BY-NC-4.0",source:"license_file"};if(o.includes("attribution-sharealike"))return{spdxId:"CC-BY-SA-4.0",source:"license_file"};if(o.includes("creativecommons")&&o.includes("attribution"))return{spdxId:"CC-BY-4.0",source:"license_file"};if(o.includes("open database license")||o.includes("odbl"))return{spdxId:"ODbL-1.0",source:"license_file"};if(o.includes("open data commons")&&o.includes("attribution"))return{spdxId:"ODC-By-1.0",source:"license_file"};if(o.includes("public domain dedication and license")||o.includes("pddl"))return{spdxId:"PDDL-1.0",source:"license_file"};if(o.includes("permission is hereby granted, free of charge")||o.includes("mit license"))return{spdxId:"MIT",source:"license_file"}}catch(o){console.warn(` Warning: Could not read ${n}: ${o instanceof Error?o.message:String(o)}`)}return{spdxId:void 0,source:"license_file"}}}return{spdxId:void 0,source:"none"}}async function Xk(e){let t=Jk.map((i)=>({name:`${i.spdxId.padEnd(22)} ${i.description}`,value:i.spdxId,short:i.spdxId}));t.push({name:"Other (enter SPDX ID manually)",value:"__custom__",short:"Custom"});let r=e?Jk.find((i)=>i.spdxId===e)?.spdxId:void 0,{selected:n}=await me.prompt([{type:"list",name:"selected",message:"Select a license for this dataset:",choices:t,default:r,pageSize:t.length}]);if(n==="__custom__"){let{customId:i}=await me.prompt([{type:"input",name:"customId",message:"Enter SPDX license ID (e.g., MIT, Apache-2.0):",validate:(o)=>{if(!o.trim())return"License ID is required";return!0}}]);return i.trim()}return n}function rce(e){let t=e.toUpperCase().replace(/\s+/g,"-");if(Qae.has(e))return!0;for(let r of Qae)if(r.toUpperCase()===t)return!0;return!1}function Ynt(e){let t=Jk.find((r)=>r.spdxId===e);if(t)return`${t.name}
|
|
1078
1078
|
|