nemar-cli 0.10.18-dev.3451 → 0.10.18

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.
Files changed (2) hide show
  1. package/dist/index.js +4 -4
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -99,18 +99,18 @@ ${t}`,eIe,tIe,rIe=(e,t,r)=>{let n=r===""?"":`with ${r.trim()}() `,i=Q6e.bind(nul
99
99
  `)}var R2=!1;var{spawn:jJe}=globalThis.Bun;function Vl(e,t=[]){let r=e.replace(MJe,'("$1","<redacted>")');for(let n of t)if(n.length>=qJe)r=r.split(n).join("<redacted>");return r}function rw(e){let t=["AWS_SESSION_TOKEN","AWS_SECRET_ACCESS_KEY","AWS_ACCESS_KEY_ID"],r=new Set;for(let n of[process.env,e??{}])for(let i of t){let o=n[i];if(typeof o==="string"&&o.length>0)r.add(o)}return[...r]}async function Xte(e,t){let r=e.getReader(),n=new TextDecoder,i="";while(!0){let{done:o,value:s}=await r.read();if(o)break;if(s.byteLength===0)continue;t(),i+=n.decode(s,{stream:!0})}return i+n.decode()}async function k(e,t={}){let r={...process.env,GIT_TERMINAL_PROMPT:"0",...t.env};for(let b of t.unsetEnv??[])delete r[b];let n=jJe({cmd:e,cwd:t.cwd,...t.stdin===void 0?{}:{stdin:new TextEncoder().encode(t.stdin)},stdout:"pipe",stderr:"pipe",env:r}),i=!1,o,s,a=performance.now(),c=()=>{if(s!==void 0)clearTimeout(s),s=void 0},u=()=>{if(!t.onInactivityWarning)return;c(),s=setTimeout(()=>{s=void 0;try{t.onInactivityWarning?.(performance.now()-a)}catch{console.error("Could not display subprocess inactivity warning; the child result is unaffected.")}},t.inactivityWarningAfterMs??LJe)};if(u(),t.timeout)o=setTimeout(()=>{i=!0,c(),n.kill()},t.timeout);let d=tw()?[...rw(r),...t.redact??[]]:[];if(tw()){let b=t.cwd?` (cwd=${t.cwd})`:"";Ic(l.dim(Vl(`$ ${e.join(" ")}${b}`,d)))}let f=()=>{a=performance.now(),u()},m,p,g,h=n.exited.then((b)=>(c(),b));try{[m,p,g]=await Promise.all([Xte(n.stdout,f),Xte(n.stderr,f),h])}finally{if(c(),o)clearTimeout(o)}if(tw()){if(t.sensitiveOutput)Ic(l.dim("[sensitive subprocess output suppressed]"));else{if(m.trim())Ic(l.dim(Vl(m.trimEnd(),d)));if(p.trim())Ic(l.yellow(Vl(p.trimEnd(),d)))}Ic(l.dim(`(exit ${g})`))}if(i)return{stdout:m,stderr:p||`Command timed out after ${Math.round(t.timeout/1000)}s`,exitCode:g??1,timedOut:!0};return{stdout:m,stderr:p,exitCode:g,timedOut:!1}}var MJe,qJe=8,LJe=120000;var It=I(()=>{Ze();MJe=/\(\s*"((?:x-amz-)[^"]*|authorization|proxy-authorization)"\s*,\s*"[^"]*"\s*\)/gi});function UJe(){if(process.platform==="darwin")return"macos";if(process.platform==="win32")return"windows";return"linux"}function Qte(e,t=UJe()){return e.installInstructions[t]}function zJe(e){let t=e.match(/(\d+\.\d+(?:\.\d+)?)/);return t?t[1]:void 0}function HJe(){let e=Number(process.env.TEST_PROBE_TIMEOUT_MS);return Number.isFinite(e)&&e>0?e:VJe}async function ere(e){try{let{exitCode:t,stdout:r,timedOut:n}=await k(e.cmd,{timeout:HJe()});if(n)return{available:!1,timedOut:!0};if(t!==0)return{available:!1};return{available:!0,version:zJe(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 ph(){let e=Object.entries(Zte);return Promise.all(e.map(async([t,r])=>{let{available:n,version:i,timedOut:o}=await ere(r);return{key:t,name:r.name,purpose:r.purpose,required:r.required,available:n,version:i,timedOut:o,installInstruction:Qte(r)}}))}async function tre(){let t=(await ph()).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 Hl(e){let r=BJe[e].map((s)=>Zte[s]).filter(Boolean),n=await Promise.all(r.map(async(s)=>{let a=await ere(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:Qte(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 Zte,BJe,VJe=4000;var mh=I(()=>{It();Zte={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)"}}},BJe={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 nre;var rre=I(()=>{nre={name:"nemar-cli",packageManager:"bun@1.4.3",version:"0.10.18-dev.3451",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:{"@anthropic-ai/sdk":"^0.132.1","@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",husky:"^9.1.7","lint-staged":"^16.3.2",typescript:"^5.5.4",wrangler:"^4.70.0",yaml:"^2.8.4"}}});var eo;var kf=I(()=>{rre();eo=nre.version});import{mkdirSync as WJe,readdirSync as KJe,unlinkSync as JJe,writeFileSync as YJe}from"fs";import{join as A2}from"path";function lre(){Cf=!0}function Gl(){return Cf}function ure(e,t=process.env){return e.includes("--debug")||t.NEMAR_DEBUG==="1"}function gh(e){cre=e,Zt(`Step: ${e}`)}function yh(){sre=!0}function dre(){return sre}function Qt(){are=!0}function fre(){return are}function Zt(e){if(Cf)process.stderr.write(`[debug] ${e}
102
+ `))}var Zte,BJe,VJe=4000;var mh=I(()=>{It();Zte={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)"}}},BJe={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 nre;var rre=I(()=>{nre={name:"nemar-cli",packageManager:"bun@1.4.3",version:"0.10.18",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:{"@anthropic-ai/sdk":"^0.132.1","@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",husky:"^9.1.7","lint-staged":"^16.3.2",typescript:"^5.5.4",wrangler:"^4.70.0",yaml:"^2.8.4"}}});var eo;var kf=I(()=>{rre();eo=nre.version});import{mkdirSync as WJe,readdirSync as KJe,unlinkSync as JJe,writeFileSync as YJe}from"fs";import{join as A2}from"path";function lre(){Cf=!0}function Gl(){return Cf}function ure(e,t=process.env){return e.includes("--debug")||t.NEMAR_DEBUG==="1"}function gh(e){cre=e,Zt(`Step: ${e}`)}function yh(){sre=!0}function dre(){return sre}function Qt(){are=!0}function fre(){return are}function Zt(e){if(Cf)process.stderr.write(`[debug] ${e}
103
103
  `)}function eYe(e){let t={};for(let[r,n]of Object.entries(e))t[r]=QJe.has(r.toLowerCase())?"[REDACTED]":n;return t}function mre(e){let t=e.indexOf("@");if(t<=0)return"***";return`${e[0]}***${e.slice(t)}`}function O2(e,t,r=0){if(r>rYe)return"[REDACTED: depth]";if(Array.isArray(t))return t.map((n)=>O2(e,n,r+1));if(t&&typeof t==="object"){let n={};for(let[i,o]of Object.entries(t))n[i]=O2(i,o,r+1);return n}if(typeof t==="string"){if(tYe.test(e))return"[REDACTED]";return t.replace(pre,mre)}return t}function T2(e){return e.replace(nYe,"Bearer [REDACTED]").replace(iYe,"[REDACTED_AWS_KEY]").replace(oYe,"$1[REDACTED]").replace(sYe,"$1$2=[REDACTED]").replace(pre,mre)}function aYe(e){return T2(e)}function ire(e,t=ZJe){if(e===void 0)return;let r=e;try{let n=JSON.parse(e);r=JSON.stringify(O2("",n))}catch{}if(r=T2(r),Buffer.byteLength(r,"utf8")>t)r=`${Buffer.from(r,"utf8").subarray(0,t).toString("utf8")}... [truncated]`;return r}function ow(e){if(!Cf)return;let t=aYe(e.url);try{let r={...e,url:t,requestHeaders:e.requestHeaders?eYe(e.requestHeaders):void 0,requestBody:ire(e.requestBody),responseBody:ire(e.responseBody)};iw.push(r),Zt(`${e.method} ${t} -> ${e.status??"ERROR"} (${e.durationMs}ms)`)}catch(r){let n=q(r);iw.push({method:e.method,url:t,status:e.status,durationMs:e.durationMs,note:`redaction failed: ${n}`}),Zt(`redaction failed for ${e.method} ${t}: ${n}`)}}async function cYe(){let e=[];try{let t=process.versions.bun?`Bun ${process.versions.bun}`:`Node ${process.version}`;e.push(`CLI version: ${eo}`),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=Ft();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 ph();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 F2(){return(await cYe()).join(`
104
104
  `)}async function hre(){if(!Cf||nw!==void 0)return;try{nw=await F2()}catch(e){let t=q(e);nw=`(could not build environment report: ${t})`,Zt(`environment snapshot failed: ${t}`)}}function gre(e){if(ore.has(e))return{flag:e};for(let t of ore){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 lYe(e){let t=[];for(let r=0;r<e.length;r++){let n=e[r],i=gre(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 uYe(e){let t=[];for(let r=0;r<e.length;r++){let n=e[r],i=gre(n);if(!i){t.push(n);continue}if(!i.kind&&r+1<e.length)r++}return t}function dYe(e){let t=[];for(let n of uYe(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 fYe(e,t){let r=[];if(r.push("NEMAR CLI Debug Log"),r.push(`Generated: ${new Date().toISOString()}`),r.push(`Command: nemar ${T2(lYe(e).join(" "))}`),r.push(""),r.push(nw??"(environment snapshot unavailable)"),r.push(""),r.push("HTTP requests:"),iw.length===0)r.push(" (none)");else iw.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: ${cre??"(none recorded)"}`),r.push(`Exit code: ${t}`),`${r.join(`
105
105
  `)}
106
106
  `}function pYe(e,t){let r;try{r=KJe(e).filter((i)=>i.startsWith("nemar-")&&i.endsWith(".log"))}catch(i){if(i.code!=="ENOENT")Zt(`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{JJe(A2(e,r[i]))}catch(o){if(o.code!=="ENOENT")Zt(`could not remove old log ${r[i]}: ${q(o)}`)}}function yre(){return hh}function bre(e,t){if(!Cf)return null;let r=A2(P2(),"logs");try{WJe(r,{recursive:!0})}catch(s){return hh=q(s),Zt(`could not create log directory ${r}: ${hh}`),null}let i=`nemar-${new Date().toISOString().replace(/[:.]/g,"-")}-${dYe(e)}.log`,o=A2(r,i);try{YJe(o,fYe(e,t),"utf8")}catch(s){return hh=q(s),Zt(`could not write log file ${o}: ${hh}`),null}return pYe(r,XJe),o}var XJe=10,ZJe=2048,Cf=!1,sre=!1,are=!1,cre,nw,iw,QJe,tYe,pre,rYe=32,nYe,iYe,oYe,sYe,ore,hh;var Qn=I(()=>{Jt();to();mh();kf();iw=[];QJe=new Set(["authorization","cookie","set-cookie","x-api-key"]);tYe=/^(api[_-]?key|apikey|password|token|secret|access[_-]?key(_id)?|secret[_-]?access[_-]?key|session|session[_-]?token|authorization|ssh[_-]?key|private[_-]?key|device[_-]?code)$/i,pre=/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;nYe=/Bearer\s+[A-Za-z0-9\-._~+/=]+/gi,iYe=/\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/g,oYe=/((?:aws_)?secret_access_key["']?\s*[:=]\s*["']?)[A-Za-z0-9/+=]{20,}/gi,sYe=/([?&])(X-Amz-Signature|X-Amz-Security-Token|X-Amz-Credential|Signature|AWSAccessKeyId)=[^&\s"']+/gi;ore=new Set(["-k","--key","--password","--api-key"])});import{chmodSync as mYe,copyFileSync as hYe,existsSync as I2,mkdirSync as gYe,statSync as yYe}from"fs";import{homedir as sw}from"os";import{join as Rf}from"path";function xYe(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 P2(){return process.env.NEMAR_CONFIG_DIR||Rf(sw(),".config","nemar")}function vYe(e){if(process.env.NEMAR_CONFIG_DIR)return;let t=Rf(e,"config.json");if(I2(t))return;let r=[];if(process.platform==="darwin")r.push(Rf(sw(),"Library","Preferences","nemar-nodejs","config.json"));if(process.platform==="win32"){let n=process.env.APPDATA||Rf(sw(),"AppData","Roaming");r.push(Rf(n,"nemar-nodejs","config.json"))}r.push(Rf(sw(),".config","nemar-nodejs","config.json"));for(let n of r)if(I2(n))try{gYe(e,{recursive:!0}),hYe(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 Ci(){let e=P2();if(bh&&xre===e)return bh;if(vYe(e),bh=new ew({projectName:"nemar",configFileMode:N2,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}),xre=e,!wre.has(e))wre.add(e),_Ye(bh.path),EYe(),SYe();return bh}function _Ye(e){if(process.platform==="win32")return;if(!I2(e))return;try{if((yYe(e).mode&511)!==N2)mYe(e,N2)}catch(t){console.error(`[nemar] could not secure config file permissions for ${e}:`,t)}}function EYe(){let e=Ci(),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 DYe){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 SYe(){let e=Ci(),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(bYe.has(xYe(a)))r[o]={...s,apiUrl:Af},console.error(`[nemar] migrated stored apiUrl for account "${o}": ${a} -> ${Af}`),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 xh(){return Ci().get("activeAccount")}function Nc(){return Ci().get("accounts")||{}}function Ft(){let e={apiUrl:Af},t=xh();if(!t)return e;return Nc()[t]||e}function er(e,t){let r=Ci(),n=r.get("activeAccount")||"default",i=r.get("accounts")||{};if(!i[n])i[n]={apiUrl:Af};i[n][e]=t,r.store={...r.store,accounts:i,activeAccount:n}}function wh(e){let t=xh();if(!t)return;let r=Nc();if(r[t])delete r[t][e],Ci().set("accounts",r)}function vre(){let e=Ci(),t=xh();if(!t){e.clear();return}let r=Nc();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 _re(){Ci().clear()}function tt(){return!!Ft().apiKey}function j2(){return Ci().path}function vh(){let e=Nc(),t=xh();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 Dre(e){return e.username?.trim()||e.email}function $Ye(e){let t=e.trim().toLowerCase();if(!t)return;let r=Object.entries(Nc()).filter(([,n])=>n.email&&n.email.toLowerCase()===t).map(([n])=>n);if(r.length>1){Zt(`findAccountKeyByEmail: ${r.length} accounts share email ${t}: ${r.join(", ")}`);return}return r[0]}function Ere(e,t){let r=Ci(),n=Nc(),i;if(n[e])i=e;else if(t.email)i=$Ye(t.email);let o=i?n[i]:void 0,s={...o??{apiUrl:Af},...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 Sre(e){let t=e.trim();if(!t)return"unchanged";let r=Ci(),n=xh();if(!n||n===t)return"unchanged";let i=Nc(),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 M2(e){let t=Ci(),r=Nc();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 Af="https://nemar-api-dev.sccn-org.workers.dev",N2=384,bYe,wYe,Fkt,bh=null,xre=null,wre,DYe;var to=I(()=>{Jte();On();kd();Qn();bYe=new Set(["https://api.osc.earth/nemar","https://nemar-api.neuromechanist.workers.dev","https://nemar-api-dev.shirazi-10f.workers.dev"]);wYe=K({field:_(),blocks:le(_()).optional(),set_on:le(_()).optional()}).passthrough(),Fkt=K({apiKey:_().optional(),apiUrl:_().url().default(Af),username:_().optional(),email:_().email().optional(),githubUsername:_().optional(),sandboxCompleted:je().optional(),sandboxDatasetId:_().optional(),dismissedNoticeIds:le(R()).optional(),serviceAccess:je().optional(),profileGaps:le(wYe).optional(),orcidVerified:je().optional(),role:_().optional(),accountKind:Cl.optional(),pendingEmailChange:_().email().optional()});wre=new Set;DYe=["apiKey","apiUrl","username","email","githubUsername","sandboxCompleted","sandboxDatasetId","dismissedNoticeIds"]});function aw(e){if($re)return;$re=!0;let t=l.yellow("\u2500".repeat(60)),r=l.yellow.bold("[MAINTENANCE]"),n=l.dim(`mode: ${e.mode}`),i=e.eta?`
108
+ [nemar] You can manually copy ${n} to ${t}`)}}function Ci(){let e=P2();if(bh&&xre===e)return bh;if(vYe(e),bh=new ew({projectName:"nemar",configFileMode:N2,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}),xre=e,!wre.has(e))wre.add(e),_Ye(bh.path),EYe(),SYe();return bh}function _Ye(e){if(process.platform==="win32")return;if(!I2(e))return;try{if((yYe(e).mode&511)!==N2)mYe(e,N2)}catch(t){console.error(`[nemar] could not secure config file permissions for ${e}:`,t)}}function EYe(){let e=Ci(),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 DYe){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 SYe(){let e=Ci(),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(bYe.has(xYe(a)))r[o]={...s,apiUrl:Af},console.error(`[nemar] migrated stored apiUrl for account "${o}": ${a} -> ${Af}`),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 xh(){return Ci().get("activeAccount")}function Nc(){return Ci().get("accounts")||{}}function Ft(){let e={apiUrl:Af},t=xh();if(!t)return e;return Nc()[t]||e}function er(e,t){let r=Ci(),n=r.get("activeAccount")||"default",i=r.get("accounts")||{};if(!i[n])i[n]={apiUrl:Af};i[n][e]=t,r.store={...r.store,accounts:i,activeAccount:n}}function wh(e){let t=xh();if(!t)return;let r=Nc();if(r[t])delete r[t][e],Ci().set("accounts",r)}function vre(){let e=Ci(),t=xh();if(!t){e.clear();return}let r=Nc();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 _re(){Ci().clear()}function tt(){return!!Ft().apiKey}function j2(){return Ci().path}function vh(){let e=Nc(),t=xh();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 Dre(e){return e.username?.trim()||e.email}function $Ye(e){let t=e.trim().toLowerCase();if(!t)return;let r=Object.entries(Nc()).filter(([,n])=>n.email&&n.email.toLowerCase()===t).map(([n])=>n);if(r.length>1){Zt(`findAccountKeyByEmail: ${r.length} accounts share email ${t}: ${r.join(", ")}`);return}return r[0]}function Ere(e,t){let r=Ci(),n=Nc(),i;if(n[e])i=e;else if(t.email)i=$Ye(t.email);let o=i?n[i]:void 0,s={...o??{apiUrl:Af},...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 Sre(e){let t=e.trim();if(!t)return"unchanged";let r=Ci(),n=xh();if(!n||n===t)return"unchanged";let i=Nc(),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 M2(e){let t=Ci(),r=Nc();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 Af="https://api.nemar.org",N2=384,bYe,wYe,Fkt,bh=null,xre=null,wre,DYe;var to=I(()=>{Jte();On();kd();Qn();bYe=new Set(["https://api.osc.earth/nemar","https://nemar-api.neuromechanist.workers.dev","https://nemar-api-dev.shirazi-10f.workers.dev"]);wYe=K({field:_(),blocks:le(_()).optional(),set_on:le(_()).optional()}).passthrough(),Fkt=K({apiKey:_().optional(),apiUrl:_().url().default(Af),username:_().optional(),email:_().email().optional(),githubUsername:_().optional(),sandboxCompleted:je().optional(),sandboxDatasetId:_().optional(),dismissedNoticeIds:le(R()).optional(),serviceAccess:je().optional(),profileGaps:le(wYe).optional(),orcidVerified:je().optional(),role:_().optional(),accountKind:Cl.optional(),pendingEmailChange:_().email().optional()});wre=new Set;DYe=["apiKey","apiUrl","username","email","githubUsername","sandboxCompleted","sandboxDatasetId","dismissedNoticeIds"]});function aw(e){if($re)return;$re=!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 $re=!1;var q2=I(()=>{Ze()});function cw(){if(process.env.TEST_API_URL)return process.env.TEST_API_URL;if(B2)return L2;return Ft().apiUrl||L2}async function j(e,t={},r=!1,n){let i=`${cw()}${e}`,o={"Content-Type":"application/json","X-CLI-Version":eo,...t.headers};if(r){let m=Ft();if(!m.apiKey&&r===!0)throw new V(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(Gl())ow({method:s,url:i,status:null,durationMs:Date.now()-c,requestHeaders:o,requestBody:a,error:m instanceof Error?m.message:String(m)});throw new V(0,`Network error: Could not connect to ${cw()}`,{originalError:m instanceof Error?m.message:String(m)})}let d;try{d=await u.text()}catch(m){if(Gl())ow({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 V(0,"Failed to read response body",{httpStatus:u.status,originalError:m instanceof Error?m.message:String(m)})}if(Gl())ow({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 V(u.status,`Invalid response from server (status ${u.status})`)}if(!u.ok){if(u.status===503&&(f.mode==="read-only"||f.mode==="full")){let T=typeof f.message==="string"?f.message:"NEMAR is in maintenance mode. Please retry shortly.",L=typeof f.eta==="string"?f.eta:null,O=new Pc(f.mode,T,L,f.details);throw aw(O),O}let m=typeof f.block_reason==="string",p=Array.isArray(f.missing)?f.missing.filter((T)=>typeof T==="string"):void 0,g=typeof f.error==="string"&&(_U.includes(f.error)||jU.includes(f.error)),h=typeof f.error==="string"&&(Ly.options.includes(f.error)||UU.includes(f.error)),b=typeof f.error==="string"&&gU.includes(f.error),x=typeof f.error==="string"&&DU.includes(f.error),w=typeof f.error==="string"&&NU.includes(f.error),D=typeof f.error==="string"&&IU.includes(f.error),E=m||D||g||h||b||x||w||p!==void 0&&typeof f.error==="string"&&vU.includes(f.error)?f.message||f.error:f.error||f.message;if(u.status===404&&f.error==="Not Found"&&typeof f.message==="string")E=`${f.message}. This NEMAR backend does not support this command yet.`;let A=new V(u.status,E||"Request failed",f.details,typeof f.step==="string"?f.step:void 0,m?f.block_reason:void 0,p);if(typeof f.error==="string")A.code=f.error;if(typeof f.reason==="string")A.reason=f.reason;throw A.rawBody=f,A}if(n){let m=n.safeParse(f);if(!m.success)throw new V(u.status,`Response for ${e} did not match the expected NEMAR contract`,{issues:m.error.issues});return m.data}return f}var L2="https://nemar-api-dev.sccn-org.workers.dev",B2;var Ks=I(()=>{km();zy();a$();qy();kd();to();Qn();q2();kf();Jt();B2=L2.includes("workers.dev")});function lw(e){if(e.service_access===void 0||e.service_access===null)return"unknown";return e.service_access?"upload":"browse"}async function U2(e,t,r,n,i={}){let o=new URLSearchParams;if(e)o.set("status",e);if(t)o.set("role",t);if(r)o.set("awaiting_approval","1");if(n)o.set("kind",n);if(i.search!==void 0)o.set("q",i.search);if(i.includeDeleted)o.set("include_deleted","true");let s=o.toString()?`?${o.toString()}`:"";return j(`/admin/users${s}`,{},!0,xU)}async function uw(e,t=!1){return j(`/admin/users/by-id/${e}${t?"?include_deleted=true":""}`,{},!0,$U)}async function kre(e,t){return j(`/admin/users/by-id/${e}`,{method:"PATCH",body:JSON.stringify(t)},!0,kU)}async function Cre(e){return j(`/admin/approve/${e}`,{method:"POST"},!0)}async function Rre(e){return j(`/admin/approve/by-id/${e}`,{method:"POST"},!0)}async function Are(e){return j(`/admin/revoke/${e}`,{method:"POST"},!0)}async function Ore(e){return j(`/admin/revoke/by-id/${e}`,{method:"POST"},!0)}async function Tre(e,t){return j(`/admin/users/${e}/role`,{method:"POST",body:JSON.stringify({role:t})},!0)}async function Fre(e,t){return j(`/admin/users/${e}/kind`,{method:"POST",body:JSON.stringify({kind:t})},!0)}async function Pre(e){return j(`/admin/users/${e}`,{},!0)}async function Ire(e,t){return j(`/admin/users/${e}/keys`,{method:"POST",body:JSON.stringify({name:t})},!0,Uy)}async function Nre(e){return j(`/admin/users/${e}/keys`,{},!0,By)}async function jre(e,t){return j(`/admin/users/${e}/keys/${t}`,{method:"DELETE"},!0)}async function z2(e,t){return j(`/admin/datasets/${e}/visibility`,{method:"PATCH",body:JSON.stringify({visibility:t})},!0)}async function Mre(e){return j(`/datasets/${e}/publish`,{method:"POST"},!0)}async function qre(e){return j(`/admin/datasets/${e}/ci`,{},!0)}async function Js(e){return j(`/admin/datasets/${e}/ci`,{method:"POST"},!0)}async function V2(e){return j(`/admin/datasets/${e}/ci/validate`,{method:"POST"},!0)}async function H2(e){return j(`/admin/datasets/${e}/ci/sync`,{method:"POST"},!0)}async function Lre(e,t){return j(`/admin/datasets/${e}/doi/concept`,{method:"POST",body:JSON.stringify(t)},!0)}async function _h(e){return j(`/admin/datasets/${e}/doi`,{},!0)}async function G2(e,t){return j(`/admin/datasets/${e}/doi/update`,{method:"POST",body:JSON.stringify(t)},!0)}async function Bre(e,t){return j(`/admin/datasets/${e}/withdraw`,{method:"POST",body:JSON.stringify({reason:t.reason,dry_run:t.dryRun})},!0)}async function Ure(e,t){return j(`/admin/datasets/${e}/restore`,{method:"POST",body:JSON.stringify({dry_run:t.dryRun})},!0)}async function zre(e){return j(`/admin/datasets/${e}/reset`,{method:"POST"},!0)}async function Vre(e,t=!1){return j(`/admin/datasets/${e}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:t})},!0)}async function Hre(e){return j("/admin/datasets/bulk-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataset_ids:e})},!0)}async function Gre(e){return j("/admin/datasets/import",{method:"POST",body:JSON.stringify(e)},!0)}async function Wre(e){return j("/admin/datasets/exemplar",{method:"POST",body:JSON.stringify(e)},!0)}async function Kre(e){return j(`/admin/datasets/${e}/exemplar/remint-dois`,{method:"POST"},!0)}async function W2(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 j(`/admin/imports${n?`?${n}`:""}`,{},!0)}async function Jre(e){return j(`/admin/imports/${e}/rollback`,{method:"POST"},!0)}async function Yre(e){return j(`/admin/imports/${e}/retry`,{method:"POST"},!0)}async function K2(e){return j(`/admin/imports/${e}/verify`,{method:"POST"},!0)}async function Xre(e){return j("/admin/imports/dispatch-cooldown",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataset_ids:e})},!0)}async function Of(e,t){return j(`/admin/datasets/${e}/reindex`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t??{})},!0)}async function Zre(e,t){return j("/admin/datasets/reindex/bulk",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filter:e,...t??{}})},!0)}async function Qre(e){let t=e?.limit??15;return j(`/admin/datasets/hed-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function ene(){return j("/admin/datasets/hed-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function tne(e){let t=e?.limit??50;return j(`/admin/datasets/recording-stats-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function rne(){return j("/admin/datasets/recording-stats-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function nne(e){let t=e?.limit??15;return j(`/admin/datasets/signal-defaults-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function ine(){return j("/admin/datasets/signal-defaults-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function one(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 j(`/admin/datasets/data-integrity-sweep?${r.toString()}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function sne(){return j("/admin/datasets/data-integrity-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function ane(e,t){let r=t?.write?"":"?dry_run=1";return j(`/admin/datasets/${e}/availability-report${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function cne(e){let t=e?.limit??30,r=new URLSearchParams({limit:String(t)});if(e?.missingOnly)r.set("missing-only","1");return j(`/admin/datasets/availability-report-sweep?${r.toString()}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function lne(){return j("/admin/datasets/availability-report-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function une(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 j(`/admin/fleet/drift${r}`,{},!0)}async function Tf(e,t){return j(`/admin/datasets/${e}/enforce`,{method:"POST",body:JSON.stringify({dry_run:t})},!0)}async function dne(e){return j("/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 fne(e,t=!1){return j(`/admin/datasets/${e}/revalidate${t?"?force=true":""}`,{method:"POST"},!0)}async function pne(e){let t=e?`?user=${encodeURIComponent(e)}`:"";return j(`/admin/email-preferences${t}`,{},!0)}async function mne(e,t){let r=t?`?user=${encodeURIComponent(t)}`:"";return j(`/admin/email-preferences${r}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)},!0)}async function J2(e){return j("/admin/notify",{method:"POST",body:JSON.stringify(e)},!0)}async function hne(){return j("/admin/summary/coverage",{},!0)}async function gne(e,t,r){return j("/admin/manifest/dispatch",{method:"POST",body:JSON.stringify({dataset_id:e,version:t,skip_canary:r?.skipCanary??!1})},!0)}async function Y2(e){return j("/admin/doctor/scan",{method:"POST",body:JSON.stringify({...e?.check&&{check:e.check},...e?.datasetId&&{dataset_id:e.datasetId}})},!0)}async function X2(e){return j("/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 yne(){return j("/admin/zarr-catalog/publish",{method:"POST"},!0)}async function bne(e){return j("/admin/neurobagel/regenerate",{method:"POST",body:JSON.stringify(e)},!0)}async function xne(){return j("/admin/neurobagel/status",{method:"GET"},!0)}async function wne(){return j("/admin/neurobagel/verify",{method:"POST",body:"{}"},!0)}async function vne(e){let t=new URLSearchParams;if(e?.limit!=null)t.set("limit",String(e.limit));let r=t.toString()?`?${t.toString()}`:"";return j(`/admin/datasets/zarr-fidelity-sweep${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function _ne(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 j(`/admin/imports/issue-triage${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function Dne(e){let t=e?.apply?"?apply=1":"";return j(`/admin/imports/coverage-sweep${t}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function Ene(e){let t=e?.apply?"?apply=1":"";return j(`/admin/imports/weekly-summary${t}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function Sne(e){return j("/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 $ne(e){return j("/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 kne(){return j("/admin/users/duplicates",{},!0,MU)}async function Cne(e){return j(`/admin/users/${e}/clear-identity-conflict`,{method:"POST"},!0,qU)}async function Rne(e){let t=new URLSearchParams;if(e?.limit!=null)t.set("limit",String(e.limit));let r=t.toString()?`?${t.toString()}`:"";return j(`/admin/datasets/anonymity-sweep${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function Ane(){return j("/admin/datasets/anonymity-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function dw(e){let t=new URLSearchParams;if(e.verdicts&&e.verdicts.length>0)t.set("verdict",e.verdicts.join(","));if(e.dataset)t.set("dataset",e.dataset);if(e.author)t.set("author",e.author);if(e.needsMe)t.set("needs_me","1");let r=t.toString()?`?${t.toString()}`:"";return j(`/admin/pr-reviews${r}`,{method:"GET"},!0)}async function Z2(e,t,r){let n=r?`?head=${encodeURIComponent(r)}`:"";return j(`/admin/pr-reviews/${encodeURIComponent(e)}/${t}${n}`,{method:"GET"},!0)}async function Q2(e,t){return j(`/admin/pr-reviews/${encodeURIComponent(e)}/${t}/start`,{method:"POST"},!0)}async function One(e){return j(`/admin/pr-review-authors/${encodeURIComponent(e)}`,{method:"GET"},!0)}async function Tne(e,t,r){return j(`/admin/pr-review-authors/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify(r?{mode:t,reason:r}:{mode:t})},!0)}async function Fne(e){return j(`/admin/pr-review-authors/${encodeURIComponent(e)}`,{method:"DELETE"},!0)}var Wl=I(()=>{km();Fd();Ks()});async function Wr(e,t){return j(`/datasets/${e}/upload-credentials`,{method:"POST",body:JSON.stringify({duration_seconds:t})},!0)}async function eC(e,t){return j(`/datasets/${e}/download-credentials`,{method:"POST",body:JSON.stringify({duration_seconds:t})},!0)}async function Pne(e){return j(`/admin/datasets/${e}/files`,{},!0)}async function Ine(e){let t,r=0,n=[],i=!0;while(i){let o=await j(`/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 V(500,"S3 lock paginated response missing continuation_token; aborting to avoid infinite loop")}return{locked:r,failed:n}}var Ys=I(()=>{Ks();Jt()});async function pw(e){return j(`/datasets/${e}/ci/status`,{},!0)}async function Nne(e){return j(`/datasets/${e}/manifest`,{},!0)}async function mw(e,t){return j(`/datasets/${e}/manifest/${t}`,{},!0)}function jne(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 jc(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 j(`/datasets${r}`,{},e.mine?!0:"optional");return n.datasets=n.datasets.map(jne),n}async function Mne(e){return j(`/datasets/resolve/${e}`,{},"optional")}async function qne(){return j("/datasets/facets",{signal:AbortSignal.timeout(5000)},"optional",jy)}async function Lne(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 j(`/datasets/search?${r.toString()}`,{},"optional",FU)}async function _r(e){let t=await j(`/datasets/${e}`,{},"optional");return jne(t.dataset)}async function Bne(e){return j(`/datasets/${e}/versions`,{},!0)}async function hw(e){return j("/datasets",{method:"POST",body:JSON.stringify(e)},!0)}async function Une(e,t){return j(`/datasets/${e}/attestation`,{method:"PUT",body:JSON.stringify(t)},!0)}async function gw(e){return j(`/datasets/${e}/finalize`,{method:"POST"},!0)}async function tC(e){return j(`/datasets/${e}/request-access`,{method:"POST"},!0)}async function zne(e,t){let r=t?`?status=${t}`:"";return j(`/datasets/${e}/access-requests${r}`,{},!0)}async function Vne(e,t){return j(`/datasets/${e}/access-requests/${t}/approve`,{method:"POST"},!0)}async function Hne(e,t){return j(`/datasets/${e}/access-requests/${t}/deny`,{method:"POST"},!0)}async function Gne(e,t){return j(`/datasets/${e}/invite`,{method:"POST",body:JSON.stringify({username:t})},!0)}async function Wne(e){return j(`/datasets/${e}/collaborators`,{},!0)}async function Kne(e,t){return j(`/admin/datasets/${e}/enrichment`,{method:"POST",body:JSON.stringify(t)},!0)}var fw;var Mc=I(()=>{Fd();Ks();fw=/^\d{4}-\d{4}-\d{4}-\d{3}[\dX]$/});var Qne=1e4;async function Ff(e,t={}){return j(`/datasets/${e}/publish/request`,t.anonymous?{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({anonymous:!0})}:{method:"POST"},!0)}async function Pf(e){return j(`/datasets/${e}/publish/status`,{},!0)}async function tie(e){return j(`/datasets/${e}/publish/resend`,{method:"POST"},!0)}async function rie(e){let t=e?`?status=${e}`:"";return j(`/admin/publish/requests${t}`,{},!0)}async function yw(e,t){return j(`/admin/publish/${e}/deny`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({reason:t})},!0)}async function bw(e){return j(`/admin/publish/${e}/identifier-screen`,{method:"POST"},!0)}function kYe(e,t=[]){if(e){let r=Wa.indexOf(e);if(r>=0)return r+1}return Math.min(t.length+1,Wa.length)}function CYe(e){if(!(e instanceof V))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 If(e,t=!1,r=!1,n=!1,i,o,s){let c=Qne,u,d,f=0,m=!1,p,g=t,h=[],b;function x(w,D,C,E){if(!o)return;o({step:w,stepIndex:kYe(w,D),stepTotal:Wa.length,s3LockLocked:C,s3LockTotal:E,s3LockResumed:w==="s3_lock"&&m?!0:void 0})}for(let w=1;w<=5;w++)try{let D,C=!0;do{if(D=await j(`/admin/publish/${e}/approve`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({resume:C?g:!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)h.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(h.length>0)D.step_results=eie(h);return D}catch(D){if(b=D,w===5||!CYe(D)){if(D instanceof V&&h.length>0)D.stepResults=eie(h);throw D}let E=D;if(i?.({attempt:w,maxAttempts:5,delayMs:c,step:E.step,error:E.message}),await new Promise((A)=>setTimeout(A,c)),g=!0,u!==void 0)m=!0}throw b}function eie(e){let t=new Map;for(let r of e)t.set(r.step,r);return Array.from(t.values())}var Nf=I(()=>{eb();Ks();Jt()});function Die(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"&&!Xs.has(r)).filter((r)=>t.prefix?r.startsWith(t.prefix):!0).sort()}var Xs;var _w=I(()=>{Xs=new Set(["nm000103","nm000104","nm000105","nm000106","nm000107"])});function Kr(e){return e.replace(PYe,(t)=>{if(t===`
113
+ `)}var $re=!1;var q2=I(()=>{Ze()});function cw(){if(process.env.TEST_API_URL)return process.env.TEST_API_URL;if(B2)return L2;return Ft().apiUrl||L2}async function j(e,t={},r=!1,n){let i=`${cw()}${e}`,o={"Content-Type":"application/json","X-CLI-Version":eo,...t.headers};if(r){let m=Ft();if(!m.apiKey&&r===!0)throw new V(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(Gl())ow({method:s,url:i,status:null,durationMs:Date.now()-c,requestHeaders:o,requestBody:a,error:m instanceof Error?m.message:String(m)});throw new V(0,`Network error: Could not connect to ${cw()}`,{originalError:m instanceof Error?m.message:String(m)})}let d;try{d=await u.text()}catch(m){if(Gl())ow({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 V(0,"Failed to read response body",{httpStatus:u.status,originalError:m instanceof Error?m.message:String(m)})}if(Gl())ow({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 V(u.status,`Invalid response from server (status ${u.status})`)}if(!u.ok){if(u.status===503&&(f.mode==="read-only"||f.mode==="full")){let T=typeof f.message==="string"?f.message:"NEMAR is in maintenance mode. Please retry shortly.",L=typeof f.eta==="string"?f.eta:null,O=new Pc(f.mode,T,L,f.details);throw aw(O),O}let m=typeof f.block_reason==="string",p=Array.isArray(f.missing)?f.missing.filter((T)=>typeof T==="string"):void 0,g=typeof f.error==="string"&&(_U.includes(f.error)||jU.includes(f.error)),h=typeof f.error==="string"&&(Ly.options.includes(f.error)||UU.includes(f.error)),b=typeof f.error==="string"&&gU.includes(f.error),x=typeof f.error==="string"&&DU.includes(f.error),w=typeof f.error==="string"&&NU.includes(f.error),D=typeof f.error==="string"&&IU.includes(f.error),E=m||D||g||h||b||x||w||p!==void 0&&typeof f.error==="string"&&vU.includes(f.error)?f.message||f.error:f.error||f.message;if(u.status===404&&f.error==="Not Found"&&typeof f.message==="string")E=`${f.message}. This NEMAR backend does not support this command yet.`;let A=new V(u.status,E||"Request failed",f.details,typeof f.step==="string"?f.step:void 0,m?f.block_reason:void 0,p);if(typeof f.error==="string")A.code=f.error;if(typeof f.reason==="string")A.reason=f.reason;throw A.rawBody=f,A}if(n){let m=n.safeParse(f);if(!m.success)throw new V(u.status,`Response for ${e} did not match the expected NEMAR contract`,{issues:m.error.issues});return m.data}return f}var L2="https://api.nemar.org",B2;var Ks=I(()=>{km();zy();a$();qy();kd();to();Qn();q2();kf();Jt();B2=L2.includes("workers.dev")});function lw(e){if(e.service_access===void 0||e.service_access===null)return"unknown";return e.service_access?"upload":"browse"}async function U2(e,t,r,n,i={}){let o=new URLSearchParams;if(e)o.set("status",e);if(t)o.set("role",t);if(r)o.set("awaiting_approval","1");if(n)o.set("kind",n);if(i.search!==void 0)o.set("q",i.search);if(i.includeDeleted)o.set("include_deleted","true");let s=o.toString()?`?${o.toString()}`:"";return j(`/admin/users${s}`,{},!0,xU)}async function uw(e,t=!1){return j(`/admin/users/by-id/${e}${t?"?include_deleted=true":""}`,{},!0,$U)}async function kre(e,t){return j(`/admin/users/by-id/${e}`,{method:"PATCH",body:JSON.stringify(t)},!0,kU)}async function Cre(e){return j(`/admin/approve/${e}`,{method:"POST"},!0)}async function Rre(e){return j(`/admin/approve/by-id/${e}`,{method:"POST"},!0)}async function Are(e){return j(`/admin/revoke/${e}`,{method:"POST"},!0)}async function Ore(e){return j(`/admin/revoke/by-id/${e}`,{method:"POST"},!0)}async function Tre(e,t){return j(`/admin/users/${e}/role`,{method:"POST",body:JSON.stringify({role:t})},!0)}async function Fre(e,t){return j(`/admin/users/${e}/kind`,{method:"POST",body:JSON.stringify({kind:t})},!0)}async function Pre(e){return j(`/admin/users/${e}`,{},!0)}async function Ire(e,t){return j(`/admin/users/${e}/keys`,{method:"POST",body:JSON.stringify({name:t})},!0,Uy)}async function Nre(e){return j(`/admin/users/${e}/keys`,{},!0,By)}async function jre(e,t){return j(`/admin/users/${e}/keys/${t}`,{method:"DELETE"},!0)}async function z2(e,t){return j(`/admin/datasets/${e}/visibility`,{method:"PATCH",body:JSON.stringify({visibility:t})},!0)}async function Mre(e){return j(`/datasets/${e}/publish`,{method:"POST"},!0)}async function qre(e){return j(`/admin/datasets/${e}/ci`,{},!0)}async function Js(e){return j(`/admin/datasets/${e}/ci`,{method:"POST"},!0)}async function V2(e){return j(`/admin/datasets/${e}/ci/validate`,{method:"POST"},!0)}async function H2(e){return j(`/admin/datasets/${e}/ci/sync`,{method:"POST"},!0)}async function Lre(e,t){return j(`/admin/datasets/${e}/doi/concept`,{method:"POST",body:JSON.stringify(t)},!0)}async function _h(e){return j(`/admin/datasets/${e}/doi`,{},!0)}async function G2(e,t){return j(`/admin/datasets/${e}/doi/update`,{method:"POST",body:JSON.stringify(t)},!0)}async function Bre(e,t){return j(`/admin/datasets/${e}/withdraw`,{method:"POST",body:JSON.stringify({reason:t.reason,dry_run:t.dryRun})},!0)}async function Ure(e,t){return j(`/admin/datasets/${e}/restore`,{method:"POST",body:JSON.stringify({dry_run:t.dryRun})},!0)}async function zre(e){return j(`/admin/datasets/${e}/reset`,{method:"POST"},!0)}async function Vre(e,t=!1){return j(`/admin/datasets/${e}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:t})},!0)}async function Hre(e){return j("/admin/datasets/bulk-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataset_ids:e})},!0)}async function Gre(e){return j("/admin/datasets/import",{method:"POST",body:JSON.stringify(e)},!0)}async function Wre(e){return j("/admin/datasets/exemplar",{method:"POST",body:JSON.stringify(e)},!0)}async function Kre(e){return j(`/admin/datasets/${e}/exemplar/remint-dois`,{method:"POST"},!0)}async function W2(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 j(`/admin/imports${n?`?${n}`:""}`,{},!0)}async function Jre(e){return j(`/admin/imports/${e}/rollback`,{method:"POST"},!0)}async function Yre(e){return j(`/admin/imports/${e}/retry`,{method:"POST"},!0)}async function K2(e){return j(`/admin/imports/${e}/verify`,{method:"POST"},!0)}async function Xre(e){return j("/admin/imports/dispatch-cooldown",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataset_ids:e})},!0)}async function Of(e,t){return j(`/admin/datasets/${e}/reindex`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t??{})},!0)}async function Zre(e,t){return j("/admin/datasets/reindex/bulk",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filter:e,...t??{}})},!0)}async function Qre(e){let t=e?.limit??15;return j(`/admin/datasets/hed-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function ene(){return j("/admin/datasets/hed-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function tne(e){let t=e?.limit??50;return j(`/admin/datasets/recording-stats-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function rne(){return j("/admin/datasets/recording-stats-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function nne(e){let t=e?.limit??15;return j(`/admin/datasets/signal-defaults-sweep?limit=${encodeURIComponent(String(t))}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function ine(){return j("/admin/datasets/signal-defaults-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function one(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 j(`/admin/datasets/data-integrity-sweep?${r.toString()}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function sne(){return j("/admin/datasets/data-integrity-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function ane(e,t){let r=t?.write?"":"?dry_run=1";return j(`/admin/datasets/${e}/availability-report${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function cne(e){let t=e?.limit??30,r=new URLSearchParams({limit:String(t)});if(e?.missingOnly)r.set("missing-only","1");return j(`/admin/datasets/availability-report-sweep?${r.toString()}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function lne(){return j("/admin/datasets/availability-report-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function une(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 j(`/admin/fleet/drift${r}`,{},!0)}async function Tf(e,t){return j(`/admin/datasets/${e}/enforce`,{method:"POST",body:JSON.stringify({dry_run:t})},!0)}async function dne(e){return j("/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 fne(e,t=!1){return j(`/admin/datasets/${e}/revalidate${t?"?force=true":""}`,{method:"POST"},!0)}async function pne(e){let t=e?`?user=${encodeURIComponent(e)}`:"";return j(`/admin/email-preferences${t}`,{},!0)}async function mne(e,t){let r=t?`?user=${encodeURIComponent(t)}`:"";return j(`/admin/email-preferences${r}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)},!0)}async function J2(e){return j("/admin/notify",{method:"POST",body:JSON.stringify(e)},!0)}async function hne(){return j("/admin/summary/coverage",{},!0)}async function gne(e,t,r){return j("/admin/manifest/dispatch",{method:"POST",body:JSON.stringify({dataset_id:e,version:t,skip_canary:r?.skipCanary??!1})},!0)}async function Y2(e){return j("/admin/doctor/scan",{method:"POST",body:JSON.stringify({...e?.check&&{check:e.check},...e?.datasetId&&{dataset_id:e.datasetId}})},!0)}async function X2(e){return j("/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 yne(){return j("/admin/zarr-catalog/publish",{method:"POST"},!0)}async function bne(e){return j("/admin/neurobagel/regenerate",{method:"POST",body:JSON.stringify(e)},!0)}async function xne(){return j("/admin/neurobagel/status",{method:"GET"},!0)}async function wne(){return j("/admin/neurobagel/verify",{method:"POST",body:"{}"},!0)}async function vne(e){let t=new URLSearchParams;if(e?.limit!=null)t.set("limit",String(e.limit));let r=t.toString()?`?${t.toString()}`:"";return j(`/admin/datasets/zarr-fidelity-sweep${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function _ne(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 j(`/admin/imports/issue-triage${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function Dne(e){let t=e?.apply?"?apply=1":"";return j(`/admin/imports/coverage-sweep${t}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function Ene(e){let t=e?.apply?"?apply=1":"";return j(`/admin/imports/weekly-summary${t}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function Sne(e){return j("/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 $ne(e){return j("/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 kne(){return j("/admin/users/duplicates",{},!0,MU)}async function Cne(e){return j(`/admin/users/${e}/clear-identity-conflict`,{method:"POST"},!0,qU)}async function Rne(e){let t=new URLSearchParams;if(e?.limit!=null)t.set("limit",String(e.limit));let r=t.toString()?`?${t.toString()}`:"";return j(`/admin/datasets/anonymity-sweep${r}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function Ane(){return j("/admin/datasets/anonymity-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function dw(e){let t=new URLSearchParams;if(e.verdicts&&e.verdicts.length>0)t.set("verdict",e.verdicts.join(","));if(e.dataset)t.set("dataset",e.dataset);if(e.author)t.set("author",e.author);if(e.needsMe)t.set("needs_me","1");let r=t.toString()?`?${t.toString()}`:"";return j(`/admin/pr-reviews${r}`,{method:"GET"},!0)}async function Z2(e,t,r){let n=r?`?head=${encodeURIComponent(r)}`:"";return j(`/admin/pr-reviews/${encodeURIComponent(e)}/${t}${n}`,{method:"GET"},!0)}async function Q2(e,t){return j(`/admin/pr-reviews/${encodeURIComponent(e)}/${t}/start`,{method:"POST"},!0)}async function One(e){return j(`/admin/pr-review-authors/${encodeURIComponent(e)}`,{method:"GET"},!0)}async function Tne(e,t,r){return j(`/admin/pr-review-authors/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify(r?{mode:t,reason:r}:{mode:t})},!0)}async function Fne(e){return j(`/admin/pr-review-authors/${encodeURIComponent(e)}`,{method:"DELETE"},!0)}var Wl=I(()=>{km();Fd();Ks()});async function Wr(e,t){return j(`/datasets/${e}/upload-credentials`,{method:"POST",body:JSON.stringify({duration_seconds:t})},!0)}async function eC(e,t){return j(`/datasets/${e}/download-credentials`,{method:"POST",body:JSON.stringify({duration_seconds:t})},!0)}async function Pne(e){return j(`/admin/datasets/${e}/files`,{},!0)}async function Ine(e){let t,r=0,n=[],i=!0;while(i){let o=await j(`/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 V(500,"S3 lock paginated response missing continuation_token; aborting to avoid infinite loop")}return{locked:r,failed:n}}var Ys=I(()=>{Ks();Jt()});async function pw(e){return j(`/datasets/${e}/ci/status`,{},!0)}async function Nne(e){return j(`/datasets/${e}/manifest`,{},!0)}async function mw(e,t){return j(`/datasets/${e}/manifest/${t}`,{},!0)}function jne(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 jc(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 j(`/datasets${r}`,{},e.mine?!0:"optional");return n.datasets=n.datasets.map(jne),n}async function Mne(e){return j(`/datasets/resolve/${e}`,{},"optional")}async function qne(){return j("/datasets/facets",{signal:AbortSignal.timeout(5000)},"optional",jy)}async function Lne(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 j(`/datasets/search?${r.toString()}`,{},"optional",FU)}async function _r(e){let t=await j(`/datasets/${e}`,{},"optional");return jne(t.dataset)}async function Bne(e){return j(`/datasets/${e}/versions`,{},!0)}async function hw(e){return j("/datasets",{method:"POST",body:JSON.stringify(e)},!0)}async function Une(e,t){return j(`/datasets/${e}/attestation`,{method:"PUT",body:JSON.stringify(t)},!0)}async function gw(e){return j(`/datasets/${e}/finalize`,{method:"POST"},!0)}async function tC(e){return j(`/datasets/${e}/request-access`,{method:"POST"},!0)}async function zne(e,t){let r=t?`?status=${t}`:"";return j(`/datasets/${e}/access-requests${r}`,{},!0)}async function Vne(e,t){return j(`/datasets/${e}/access-requests/${t}/approve`,{method:"POST"},!0)}async function Hne(e,t){return j(`/datasets/${e}/access-requests/${t}/deny`,{method:"POST"},!0)}async function Gne(e,t){return j(`/datasets/${e}/invite`,{method:"POST",body:JSON.stringify({username:t})},!0)}async function Wne(e){return j(`/datasets/${e}/collaborators`,{},!0)}async function Kne(e,t){return j(`/admin/datasets/${e}/enrichment`,{method:"POST",body:JSON.stringify(t)},!0)}var fw;var Mc=I(()=>{Fd();Ks();fw=/^\d{4}-\d{4}-\d{4}-\d{3}[\dX]$/});var Qne=1e4;async function Ff(e,t={}){return j(`/datasets/${e}/publish/request`,t.anonymous?{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({anonymous:!0})}:{method:"POST"},!0)}async function Pf(e){return j(`/datasets/${e}/publish/status`,{},!0)}async function tie(e){return j(`/datasets/${e}/publish/resend`,{method:"POST"},!0)}async function rie(e){let t=e?`?status=${e}`:"";return j(`/admin/publish/requests${t}`,{},!0)}async function yw(e,t){return j(`/admin/publish/${e}/deny`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({reason:t})},!0)}async function bw(e){return j(`/admin/publish/${e}/identifier-screen`,{method:"POST"},!0)}function kYe(e,t=[]){if(e){let r=Wa.indexOf(e);if(r>=0)return r+1}return Math.min(t.length+1,Wa.length)}function CYe(e){if(!(e instanceof V))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 If(e,t=!1,r=!1,n=!1,i,o,s){let c=Qne,u,d,f=0,m=!1,p,g=t,h=[],b;function x(w,D,C,E){if(!o)return;o({step:w,stepIndex:kYe(w,D),stepTotal:Wa.length,s3LockLocked:C,s3LockTotal:E,s3LockResumed:w==="s3_lock"&&m?!0:void 0})}for(let w=1;w<=5;w++)try{let D,C=!0;do{if(D=await j(`/admin/publish/${e}/approve`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({resume:C?g:!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)h.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(h.length>0)D.step_results=eie(h);return D}catch(D){if(b=D,w===5||!CYe(D)){if(D instanceof V&&h.length>0)D.stepResults=eie(h);throw D}let E=D;if(i?.({attempt:w,maxAttempts:5,delayMs:c,step:E.step,error:E.message}),await new Promise((A)=>setTimeout(A,c)),g=!0,u!==void 0)m=!0}throw b}function eie(e){let t=new Map;for(let r of e)t.set(r.step,r);return Array.from(t.values())}var Nf=I(()=>{eb();Ks();Jt()});function Die(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"&&!Xs.has(r)).filter((r)=>t.prefix?r.startsWith(t.prefix):!0).sort()}var Xs;var _w=I(()=>{Xs=new Set(["nm000103","nm000104","nm000105","nm000106","nm000107"])});function Kr(e){return e.replace(PYe,(t)=>{if(t===`
114
114
  `)return"\\n";if(t==="\r")return"\\r";if(t==="\t")return"\\t";let r=t.codePointAt(0)??0;return r<=255?`\\x${r.toString(16).padStart(2,"0")}`:`\\u${r.toString(16).padStart(4,"0")}`})}function Dw(e,t=", "){return e.map(Kr).join(t)}var PYe,is=(e)=>Kr(e)===e;var jf=I(()=>{PYe=/[\p{Cc}\u2028\u2029\u202a-\u202e\u2066-\u2069]/gu});async function IYe(){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 Kl(){try{let{stdout:e,exitCode:t,stderr:r}=await k(["gh","auth","token"],{sensitiveOutput:!0});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 Ew(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 Sw(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 os(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,redact:[i]})}else if(t.startsWith("git@github.com:")){let i=t.replace("git@github.com:",""),o=await Kl();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,redact:[o.token]});else{let s=await IYe();if(s.works)n=t;else return{success:!1,error:`GitHub authentication not configured.
115
115
 
116
116
  gh CLI failed: ${o.error||"could not get token"}
@@ -1249,7 +1249,7 @@ ${u.slice(0,10).join(`
1249
1249
  `)}}}qy();Jt();function fpe(e){return e instanceof V&&e.statusCode===422&&e.rawBody?.status==="blocked"&&My(e.blockReason)}function ppe(e){let t=e.rawBody?.ci_url;return typeof t==="string"&&/^https:\/\/\S+$/.test(t)?t:void 0}function eO(e){return e==="bids_validation_in_progress"?"Request recorded: BIDS validation is still running.":"Request recorded: BIDS validation has not started yet."}function tO(e,t=!1){let r=`nemar dataset publish request ${e}${t?" --anonymous":""}`;return[" Your request is recorded. NEMAR re-checks it automatically and continues once validation passes.",` If you would rather not wait for that, check validation with: nemar dataset ci ${e}`,` Once it has passed, request again: ${r}`," If it says a request already exists, nothing more is needed."," If validation fails or a submission minimum fails, the request stays blocked and nothing is emailed:",` check nemar dataset ci ${e} or nemar dataset publish status ${e}.`]}Jt();to();async function T_(){let e=Ft().sandboxCompleted;if(e!==void 0)return{status:e?"completed":"not_completed"};try{let t=await xw();if(er("sandboxCompleted",t.sandbox_completed),t.sandbox_dataset_id)er("sandboxDatasetId",t.sandbox_dataset_id);return t.sandbox_completed?{status:"completed"}:{status:"not_completed"}}catch(t){return{status:"unknown",reason:q(t)}}}var rO=Me(Zw(),1);function F_(e){if(e!==e.trim())return null;let t=rO.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 pu(e,t){let r=F_(e);if(!r)throw Error(`Invalid version: ${e}`);let n=rO.default.inc(`${r.major}.${r.minor}.${r.patch}`,t);if(!n)throw Error(`Invalid version: ${e}`);return n}function nO(e){return F_(e)!==null}Ze();Ri();RR();Ze();Jn();Wl();Jt();tp();Ov();jf();Ri();Lc();Iv();TR();tl();ru();import{existsSync as iO,mkdirSync as rlt,readFileSync as nlt,statSync as ilt,writeFileSync as mpe}from"fs";import{join as olt,resolve as oO}from"path";function hpe(e,t,r){if(!oo(r,"metadata_write")){if(t)try{let n=oO(e,".nemar"),i=oO(n,"metadata.json");if(!iO(i)){if(!iO(n))rlt(n,{recursive:!0});mpe(i,JSON.stringify(t,null,2))}let o=oO(e,".bidsignore"),s="";if(iO(o))s=nlt(o,"utf-8");if(!s.includes(".nemar/")){let a=s?`${s.trimEnd()}
1250
1250
  .nemar/
1251
1251
  `:`.nemar/
1252
- `;mpe(o,a)}console.log(l.dim(" Updated .bidsignore for NEMAR metadata"))}catch(n){console.log(l.yellow(` Warning: Could not update .bidsignore: ${q(n)}`)),console.log(l.dim(" Upload will continue without author enrichment."))}ia(r,"metadata_write"),Mr(e,r)}else console.log(l.dim(" Metadata write already completed (skipping)"))}var gpe=1073741824;function slt(e,t,r=gpe){let n=[],i=0;for(let o of t){let s=e.files[o];if(!s||s.mtimeMs===void 0)continue;n.push({path:o,size:s.size,mtimeMs:s.mtimeMs}),i+=s.size}return i>=r?n:null}function alt(e,t){return t.filter((r)=>{try{return qc(r.path,ilt(olt(e,r.path)).size)}catch{return!0}})}function clt(e){let t=0;for(let r of Object.values(e.files))t+=r.size;return t}function llt(e){return["Warning: saving dataset changes has produced no stdout or stderr for",`${Nv(e)}. git add -A is still running.`,"Wait, or interrupt and rerun the upload; the save step will run again."].join(" ")}async function ype(e,t,r,n={}){if(!oo(r,"dataset_save")){let i=S({text:"Saving dataset changes...",...n.spinnerStream?{stream:n.spinnerStream}:{}}).start(),o=n.skipMinBytes??gpe,s=[];if(clt(r)>=o){let c=n.annexedPaths??null;if(c===null)try{c=await el(e)}catch(u){console.log(l.dim(` Could not list annexed files (${q(u)}); staging will re-read them`))}if(c!==null)s=alt(e,slt(r,c,o)??[])}let a=await Zs(e,"Initial NEMAR dataset upload",t,{skipContentCheck:s,onInactivityWarning:(c)=>{i=Xh(i,llt(c))},...n.inactivityWarningAfterMs===void 0?{}:{inactivityWarningAfterMs:n.inactivityWarningAfterMs}});if(!a.success)return Mr(e,r),dn(i,"Failed to save dataset",a.error),console.log(),console.log(l.yellow("Re-run the same command to resume from this step.")),$e;if(n.verifyRemote){let c;try{c=await qR(e,n.verifyRemote)}catch(u){return Mr(e,r),dn(i,"Could not confirm the saved files are at the S3 remote",u),console.log(),console.log(l.yellow("Re-run the same command to resume from this step.")),$e}if(c.length>0){oa(r,"s3_upload"),Mr(e,r);let u=Dw(c.slice(0,5)),d=c.length>5?` (and ${c.length-5} more)`:"";return dn(i,"Saved files are not at the S3 remote",`${c.length} annexed file(s) in the commit are not recorded at the remote: ${u}${d}. The save itself annexed them, after the upload step had run.`),console.log(),console.log(l.yellow("Re-run the same command: it uploads them and saves again.")),$e}}i.succeed("Dataset changes saved"),ia(r,"dataset_save"),Mr(e,r)}else console.log(l.dim(" Dataset save already completed (skipping)"));return jt()}async function bpe(e,t){if(!oo(t,"github_push")){let r=S("Pushing metadata to GitHub...").start(),n=await Dr(e);if(!n.success)return Mr(e,t),dn(r,"Failed to push to GitHub",n.error),console.log(),console.log(l.yellow("Re-run the same command to resume from this step.")),$e;if(n.warning)r.warn("Metadata pushed to GitHub (with warning)"),console.log(l.yellow(` ${n.warning}`));else r.succeed("Metadata pushed to GitHub");ia(t,"github_push"),Mr(e,t)}else console.log(l.dim(" GitHub push already completed (skipping)"));return jt()}async function xpe(e,t,r){if(!oo(r,"ci_deploy")){let n=S("Setting up BIDS validation CI...").start(),i="configured";try{await Js(t),n.succeed("BIDS validation CI configured")}catch(o){if(i="not-configured",o instanceof V&&o.statusCode===403)n.info("CI workflow will be configured by an admin");else{let s=o instanceof Error?o.message:String(o);n.warn(`Could not configure CI: ${s}`),console.log(l.dim(` An admin can add it later with: nemar admin ci add ${t}`))}}return ia(r,"ci_deploy"),Mr(e,r),i}return console.log(l.dim(" CI deploy already completed (skipping)")),"unknown"}function ult(e,t){let r=e.startsWith("xx");if(t==="not-configured"){if(r)return;console.log("BIDS validation is not set up yet."),console.log(` CI is set up when you request publication: ${l.cyan(`nemar dataset publish request ${e}`)}`),console.log();return}if(console.log("BIDS validation runs on GitHub after the upload."),console.log(` Check it with: ${l.cyan(`nemar dataset ci ${e}`)}`),!r)console.log(` Once it has passed, request publication: ${l.cyan(`nemar dataset publish request ${e}`)}`);console.log()}function wpe(e,t,r="unknown"){Yh(e),Bce(e),console.log(),console.log(l.green.bold("Upload complete!")),console.log(),console.log(` Dataset ID: ${l.cyan(t.dataset_id)}`),console.log(` GitHub: ${l.cyan(t.github_url)}`),console.log(),console.log(l.dim("To download this dataset:")),console.log(l.dim(` nemar dataset download ${t.dataset_id}`)),console.log(),ult(t.dataset_id,r),console.log(l.yellow("Note: This dataset is private. Only the owner and designated collaborators can")),console.log(l.yellow("download it, and only through the NEMAR CLI (not direct git-annex commands).")),console.log(l.yellow("After publishing, the data will be publicly available for everyone."))}tl();ru();async function vpe(e,t={}){let r=await Yie(e.absolutePath);if(!r.success)return console.log(l.red(r.error)),console.log(l.yellow("Re-run the same command to retry.")),$e;if(r.cleared>0)console.log(l.yellow(` Cleared ${r.cleared} assume-unchanged flag(s) an earlier, interrupted save left on annexed files`));let n=await Wce(e.absolutePath);if(n.status==="error")return console.log(l.red(n.error)),$e;if(n.status==="warning")console.log(l.yellow(` ${n.warning}`));if(n.status==="restored")console.log(l.yellow(" Put back git-annex's filter process, which an earlier, interrupted upload had left out of this repository's configuration"));let i=await $le(e.absolutePath,e.options,e.dataFiles,e.filesToUpload,e.uploadProgress,e.datasetInfo,{openRemote:t.openRemote,...t.primeMinBytes===void 0?{}:{primeMinBytes:t.primeMinBytes},...t.primeOnSuspended?{primeOnSuspended:t.primeOnSuspended}:{}});if(i.status==="fail")return $e;let{progress:o,annexedPaths:s}=i.value;if(hpe(e.absolutePath,e.coAuthorEnrichment,o),(await(t.saveStep??ype)(e.absolutePath,e.author,o,{annexedPaths:s,verifyRemote:hs,...t.skipMinBytes===void 0?{}:{skipMinBytes:t.skipMinBytes},...t.saveInactivityWarningAfterMs===void 0?{}:{inactivityWarningAfterMs:t.saveInactivityWarningAfterMs},...t.saveSpinnerStream===void 0?{}:{spinnerStream:t.saveSpinnerStream}})).status==="fail")return $e;return jt(o)}Ze();Ql();Hf();JR();Qn();It();import{randomBytes as Glt}from"crypto";import{constants as dO,accessSync as Wlt,chmodSync as Klt,chownSync as Jlt,closeSync as hO,copyFileSync as Ylt,existsSync as Gpe,fsyncSync as Wpe,lstatSync as xs,mkdirSync as Xlt,mkdtempSync as Zlt,openSync as gO,readSync as Qlt,readdirSync as eut,renameSync as tut,rmSync as yO,rmdirSync as rut,statSync as Kpe,writeSync as nut}from"fs";import{tmpdir as iut}from"os";import{dirname as L_,join as lo}from"path";Ze();import{lstatSync as Mlt,readdirSync as qlt,statSync as Ppe}from"fs";import{open as Llt}from"fs/promises";import{join as Fpe}from"path";Wi();Jn();Ql();var $pe="nemar-identifier-scan/1.0 (+https://docs.nemar.org/policies/takedown/)",dlt="https://nemar-api-dev.sccn-org.workers.dev",flt="https://data.nemar.org",plt="https://nemar.s3.us-east-2.amazonaws.com",mlt="https://api.github.com";function j_(e,t){if(!Number.isSafeInteger(t)||t<1)throw RangeError(`${e} must be a positive integer, got ${t}`)}async function P_(e,t,r){j_("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 hlt(e){j_("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 mr 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 glt(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 ylt(e,t){let r=e>=500||e===429;return new mr(`http-${e}`,{status:e,retryable:r,retryAfterMs:r?glt(t):void 0})}class sO extends Error{constructor(e){super(e);this.name="RunAborted"}}function blt(e){j_("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 sO(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 _pe(e){let t=e instanceof Error?e.name:"";return new mr(t==="TimeoutError"||t==="AbortError"?"timeout":"network",{retryable:!0})}function xlt(e){if(e instanceof mr)return e.cls;return`error-${e instanceof Error?e.name:"unknown"}`}async function wlt(e,t={}){let r=t.tries??3,n=t.baseMs??400,i=t.sleep??((o)=>new Promise((s)=>setTimeout(s,o)));j_("tries",r);for(let o=1;;o++)try{return await e()}catch(s){if(!(s instanceof mr&&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 vlt(e){await e.body?.cancel().catch(()=>{return})}async function _lt(e,t,r={}){let n;try{n=await fetch(e,{headers:{Range:`bytes=0-${t-1}`,"Accept-Encoding":"identity","User-Agent":r.userAgent??$pe},signal:AbortSignal.timeout(r.timeoutMs??30000)})}catch(a){throw _pe(a)}if(n.status!==200&&n.status!==206)throw await vlt(n),ylt(n.status,n.headers.get("retry-after"));let i=n.body?.getReader();if(!i)throw new mr("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 _pe(a)}finally{await i.cancel().catch(()=>{return})}if(s<(r.minBytes??0))throw new mr("short-body");return o.subarray(0,s)}var kpe={sideFileBytes:2097152,participantsBytes:16777216};function Dlt(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 Elt(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 mr("aws/timeout");if(c!==0)throw new mr(Dlt(a,c));return s}catch(i){if(i instanceof mr)throw i;throw new mr("aws/unavailable")}finally{clearTimeout(n)}}function Slt(){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 I_=(e)=>e.replace(/\/+$/,"");function Cpe(e={}){let t=e.retryAfterCapMs??30000,r=e.awsTimeoutMs??600000;return{api:I_(e.api??process.env.NEMAR_API_BASE??dlt),data:I_(e.data??process.env.NEMAR_DATA_BASE??flt),s3Base:I_(e.s3Base??plt),githubApi:I_(e.githubApi??mlt),userAgent:e.userAgent??$pe,fileConcurrency:e.fileConcurrency??24,workerLimit:hlt(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:blt({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)=>Elt(n,i,{timeoutMs:r,env:e.awsEnv})),githubToken:e.githubToken??Slt(),...e.readEntryHead?{readEntryHead:e.readEntryHead}:{}}}var Rpe=(e,t)=>t.startsWith(`${e.data}/`),$lt=(e,t)=>Rpe(e,t)||t.startsWith(`${e.api}/`)?e.breakers.worker:e.breakers.direct;async function klt(e,t,r){let n=$lt(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 mr)n.observe(o);throw o}}var Clt=(e,t)=>({...t===void 0?{}:{tries:t},baseMs:e.retryBaseMs,sleep:e.sleep,retryAfterCapMs:e.retryAfterCapMs});var Dpe=(e)=>/sub-([^/_]+)/.exec(e)?.[1]??"?";function Epe(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 Rlt=(e)=>e.severity==="identifier"&&Jse.has(e.kind),Alt=(e)=>Zl.has(e.kind);function Ape(e){return e.headerRead===e.edfCount&&e.incompleteReasons.length===0}function Olt(e){if(e.findings.some(Rlt))return"direct-identifiers";if(e.findings.some((t)=>!Alt(t)))return"review";if(!Ape(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 Tlt=/\.(edf|bdf)$/i,Flt=(e)=>e.edf===!0||Tlt.test(e.path);function Plt(e){return{edf:e.filter(Flt),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/")||!Ilt.test(t.path)).filter((t)=>!Nlt.test(t.path)),text:e.filter((t)=>jlt.test(t.path)).filter((t)=>t.path.startsWith("sourcedata/")||t.path.startsWith("code/"))}}var Ilt=/_(eeg|ieeg|meg|emg|nirs|beh|events|channels|electrodes|coordsystem|scans|physio|stim|photo|T1w|bold)\.(json|tsv)$/,Nlt=/(^|\/)(dataset_description|participants|genetic_info)\.json$/,jlt=/\.(py|m|r|txt|md|ya?ml|xml|iml|cfg|ini)$/i;function Ope(e,t,r,n=0){let i=()=>klt(e,t.url,()=>{let o={minBytes:n,userAgent:e.userAgent,timeoutMs:e.timeoutMs};return e.readEntryHead?e.readEntryHead(t,r,o):_lt(t.url,r,o)});return wlt(()=>Rpe(e,t.url)?e.workerLimit(i):i(),Clt(e))}async function N_(e,t,r){let n=await Ope(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 ap(e,t){for(let r of t)e.push(r)}var Spe="edf/superseded-absent";async function Tpe(e,t,r,n,i,o={}){let s=n.map((Se)=>Se.path),a=i==="clone",c=(Se,Xe,Qr)=>a?[...Se]:Epe(Se,Xe,Qr),u=[...ov([...s,...o.extraPaths??[]])],d=sae(s),f=Object.values(d.unscreened).reduce((Se,Xe)=>Se+Xe,0),m={},p=(Se,Xe)=>{if(Xe instanceof sO)throw Xe;let Qr=`${Se}/${xlt(Xe)}`;m[Qr]=(m[Qr]??0)+1},g=(Se)=>Dpe(Se.path),h=Plt(n),b=new Set(o.supersededEdf??[]),x=[...h.edf,...b],{participants:w,scans:D,json:C,text:E}=h,A=i==="git-tree"?Epe(x,e.limits.treeHeaderSample,g):[...x],T=0,L=0,O=0,N=0,W={},F=new Set,H=new Set,te=new Set,P=new Set,M=new Set,ge=new Set;await P_(A,e.fileConcurrency,async(Se)=>{try{let Xe=await Ope(e,Se,wt,wt),Qr=ea(Xe),{patient:Y_}=nv(Xe);if(!Qr.some((qi)=>qi.kind==="edf-unreadable")){F.add(Y_);let qi=Y_.split(/\s+/);if(qi.length>=4)te.add(qi[0]),M.add(qi[2]),P.add(qi[3])}if(ge.add(Dpe(Se.path)),Qr.some((qi)=>qi.severity==="identifier"))N++,H.add(Y_);ap(u,Qr);for(let qi of new Set(Qr.map((ghe)=>ghe.kind)))W[qi]=(W[qi]??0)+1;T++}catch(Xe){if(b.has(Se)&&Xe instanceof mr&&Xe.status===404){O++,m[Spe]=(m[Spe]??0)+1;return}L++,p("edf",Xe)}});let ce=x.length-O,br=!1,Et=!1;if(w&&w.size!==0)try{let{text:Se,truncated:Xe}=await N_(e,w,e.limits.participantsBytes),Qr=Se.indexOf(`
1252
+ `;mpe(o,a)}console.log(l.dim(" Updated .bidsignore for NEMAR metadata"))}catch(n){console.log(l.yellow(` Warning: Could not update .bidsignore: ${q(n)}`)),console.log(l.dim(" Upload will continue without author enrichment."))}ia(r,"metadata_write"),Mr(e,r)}else console.log(l.dim(" Metadata write already completed (skipping)"))}var gpe=1073741824;function slt(e,t,r=gpe){let n=[],i=0;for(let o of t){let s=e.files[o];if(!s||s.mtimeMs===void 0)continue;n.push({path:o,size:s.size,mtimeMs:s.mtimeMs}),i+=s.size}return i>=r?n:null}function alt(e,t){return t.filter((r)=>{try{return qc(r.path,ilt(olt(e,r.path)).size)}catch{return!0}})}function clt(e){let t=0;for(let r of Object.values(e.files))t+=r.size;return t}function llt(e){return["Warning: saving dataset changes has produced no stdout or stderr for",`${Nv(e)}. git add -A is still running.`,"Wait, or interrupt and rerun the upload; the save step will run again."].join(" ")}async function ype(e,t,r,n={}){if(!oo(r,"dataset_save")){let i=S({text:"Saving dataset changes...",...n.spinnerStream?{stream:n.spinnerStream}:{}}).start(),o=n.skipMinBytes??gpe,s=[];if(clt(r)>=o){let c=n.annexedPaths??null;if(c===null)try{c=await el(e)}catch(u){console.log(l.dim(` Could not list annexed files (${q(u)}); staging will re-read them`))}if(c!==null)s=alt(e,slt(r,c,o)??[])}let a=await Zs(e,"Initial NEMAR dataset upload",t,{skipContentCheck:s,onInactivityWarning:(c)=>{i=Xh(i,llt(c))},...n.inactivityWarningAfterMs===void 0?{}:{inactivityWarningAfterMs:n.inactivityWarningAfterMs}});if(!a.success)return Mr(e,r),dn(i,"Failed to save dataset",a.error),console.log(),console.log(l.yellow("Re-run the same command to resume from this step.")),$e;if(n.verifyRemote){let c;try{c=await qR(e,n.verifyRemote)}catch(u){return Mr(e,r),dn(i,"Could not confirm the saved files are at the S3 remote",u),console.log(),console.log(l.yellow("Re-run the same command to resume from this step.")),$e}if(c.length>0){oa(r,"s3_upload"),Mr(e,r);let u=Dw(c.slice(0,5)),d=c.length>5?` (and ${c.length-5} more)`:"";return dn(i,"Saved files are not at the S3 remote",`${c.length} annexed file(s) in the commit are not recorded at the remote: ${u}${d}. The save itself annexed them, after the upload step had run.`),console.log(),console.log(l.yellow("Re-run the same command: it uploads them and saves again.")),$e}}i.succeed("Dataset changes saved"),ia(r,"dataset_save"),Mr(e,r)}else console.log(l.dim(" Dataset save already completed (skipping)"));return jt()}async function bpe(e,t){if(!oo(t,"github_push")){let r=S("Pushing metadata to GitHub...").start(),n=await Dr(e);if(!n.success)return Mr(e,t),dn(r,"Failed to push to GitHub",n.error),console.log(),console.log(l.yellow("Re-run the same command to resume from this step.")),$e;if(n.warning)r.warn("Metadata pushed to GitHub (with warning)"),console.log(l.yellow(` ${n.warning}`));else r.succeed("Metadata pushed to GitHub");ia(t,"github_push"),Mr(e,t)}else console.log(l.dim(" GitHub push already completed (skipping)"));return jt()}async function xpe(e,t,r){if(!oo(r,"ci_deploy")){let n=S("Setting up BIDS validation CI...").start(),i="configured";try{await Js(t),n.succeed("BIDS validation CI configured")}catch(o){if(i="not-configured",o instanceof V&&o.statusCode===403)n.info("CI workflow will be configured by an admin");else{let s=o instanceof Error?o.message:String(o);n.warn(`Could not configure CI: ${s}`),console.log(l.dim(` An admin can add it later with: nemar admin ci add ${t}`))}}return ia(r,"ci_deploy"),Mr(e,r),i}return console.log(l.dim(" CI deploy already completed (skipping)")),"unknown"}function ult(e,t){let r=e.startsWith("xx");if(t==="not-configured"){if(r)return;console.log("BIDS validation is not set up yet."),console.log(` CI is set up when you request publication: ${l.cyan(`nemar dataset publish request ${e}`)}`),console.log();return}if(console.log("BIDS validation runs on GitHub after the upload."),console.log(` Check it with: ${l.cyan(`nemar dataset ci ${e}`)}`),!r)console.log(` Once it has passed, request publication: ${l.cyan(`nemar dataset publish request ${e}`)}`);console.log()}function wpe(e,t,r="unknown"){Yh(e),Bce(e),console.log(),console.log(l.green.bold("Upload complete!")),console.log(),console.log(` Dataset ID: ${l.cyan(t.dataset_id)}`),console.log(` GitHub: ${l.cyan(t.github_url)}`),console.log(),console.log(l.dim("To download this dataset:")),console.log(l.dim(` nemar dataset download ${t.dataset_id}`)),console.log(),ult(t.dataset_id,r),console.log(l.yellow("Note: This dataset is private. Only the owner and designated collaborators can")),console.log(l.yellow("download it, and only through the NEMAR CLI (not direct git-annex commands).")),console.log(l.yellow("After publishing, the data will be publicly available for everyone."))}tl();ru();async function vpe(e,t={}){let r=await Yie(e.absolutePath);if(!r.success)return console.log(l.red(r.error)),console.log(l.yellow("Re-run the same command to retry.")),$e;if(r.cleared>0)console.log(l.yellow(` Cleared ${r.cleared} assume-unchanged flag(s) an earlier, interrupted save left on annexed files`));let n=await Wce(e.absolutePath);if(n.status==="error")return console.log(l.red(n.error)),$e;if(n.status==="warning")console.log(l.yellow(` ${n.warning}`));if(n.status==="restored")console.log(l.yellow(" Put back git-annex's filter process, which an earlier, interrupted upload had left out of this repository's configuration"));let i=await $le(e.absolutePath,e.options,e.dataFiles,e.filesToUpload,e.uploadProgress,e.datasetInfo,{openRemote:t.openRemote,...t.primeMinBytes===void 0?{}:{primeMinBytes:t.primeMinBytes},...t.primeOnSuspended?{primeOnSuspended:t.primeOnSuspended}:{}});if(i.status==="fail")return $e;let{progress:o,annexedPaths:s}=i.value;if(hpe(e.absolutePath,e.coAuthorEnrichment,o),(await(t.saveStep??ype)(e.absolutePath,e.author,o,{annexedPaths:s,verifyRemote:hs,...t.skipMinBytes===void 0?{}:{skipMinBytes:t.skipMinBytes},...t.saveInactivityWarningAfterMs===void 0?{}:{inactivityWarningAfterMs:t.saveInactivityWarningAfterMs},...t.saveSpinnerStream===void 0?{}:{spinnerStream:t.saveSpinnerStream}})).status==="fail")return $e;return jt(o)}Ze();Ql();Hf();JR();Qn();It();import{randomBytes as Glt}from"crypto";import{constants as dO,accessSync as Wlt,chmodSync as Klt,chownSync as Jlt,closeSync as hO,copyFileSync as Ylt,existsSync as Gpe,fsyncSync as Wpe,lstatSync as xs,mkdirSync as Xlt,mkdtempSync as Zlt,openSync as gO,readSync as Qlt,readdirSync as eut,renameSync as tut,rmSync as yO,rmdirSync as rut,statSync as Kpe,writeSync as nut}from"fs";import{tmpdir as iut}from"os";import{dirname as L_,join as lo}from"path";Ze();import{lstatSync as Mlt,readdirSync as qlt,statSync as Ppe}from"fs";import{open as Llt}from"fs/promises";import{join as Fpe}from"path";Wi();Jn();Ql();var $pe="nemar-identifier-scan/1.0 (+https://docs.nemar.org/policies/takedown/)",dlt="https://api.nemar.org",flt="https://data.nemar.org",plt="https://nemar.s3.us-east-2.amazonaws.com",mlt="https://api.github.com";function j_(e,t){if(!Number.isSafeInteger(t)||t<1)throw RangeError(`${e} must be a positive integer, got ${t}`)}async function P_(e,t,r){j_("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 hlt(e){j_("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 mr 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 glt(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 ylt(e,t){let r=e>=500||e===429;return new mr(`http-${e}`,{status:e,retryable:r,retryAfterMs:r?glt(t):void 0})}class sO extends Error{constructor(e){super(e);this.name="RunAborted"}}function blt(e){j_("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 sO(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 _pe(e){let t=e instanceof Error?e.name:"";return new mr(t==="TimeoutError"||t==="AbortError"?"timeout":"network",{retryable:!0})}function xlt(e){if(e instanceof mr)return e.cls;return`error-${e instanceof Error?e.name:"unknown"}`}async function wlt(e,t={}){let r=t.tries??3,n=t.baseMs??400,i=t.sleep??((o)=>new Promise((s)=>setTimeout(s,o)));j_("tries",r);for(let o=1;;o++)try{return await e()}catch(s){if(!(s instanceof mr&&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 vlt(e){await e.body?.cancel().catch(()=>{return})}async function _lt(e,t,r={}){let n;try{n=await fetch(e,{headers:{Range:`bytes=0-${t-1}`,"Accept-Encoding":"identity","User-Agent":r.userAgent??$pe},signal:AbortSignal.timeout(r.timeoutMs??30000)})}catch(a){throw _pe(a)}if(n.status!==200&&n.status!==206)throw await vlt(n),ylt(n.status,n.headers.get("retry-after"));let i=n.body?.getReader();if(!i)throw new mr("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 _pe(a)}finally{await i.cancel().catch(()=>{return})}if(s<(r.minBytes??0))throw new mr("short-body");return o.subarray(0,s)}var kpe={sideFileBytes:2097152,participantsBytes:16777216};function Dlt(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 Elt(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 mr("aws/timeout");if(c!==0)throw new mr(Dlt(a,c));return s}catch(i){if(i instanceof mr)throw i;throw new mr("aws/unavailable")}finally{clearTimeout(n)}}function Slt(){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 I_=(e)=>e.replace(/\/+$/,"");function Cpe(e={}){let t=e.retryAfterCapMs??30000,r=e.awsTimeoutMs??600000;return{api:I_(e.api??process.env.NEMAR_API_BASE??dlt),data:I_(e.data??process.env.NEMAR_DATA_BASE??flt),s3Base:I_(e.s3Base??plt),githubApi:I_(e.githubApi??mlt),userAgent:e.userAgent??$pe,fileConcurrency:e.fileConcurrency??24,workerLimit:hlt(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:blt({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)=>Elt(n,i,{timeoutMs:r,env:e.awsEnv})),githubToken:e.githubToken??Slt(),...e.readEntryHead?{readEntryHead:e.readEntryHead}:{}}}var Rpe=(e,t)=>t.startsWith(`${e.data}/`),$lt=(e,t)=>Rpe(e,t)||t.startsWith(`${e.api}/`)?e.breakers.worker:e.breakers.direct;async function klt(e,t,r){let n=$lt(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 mr)n.observe(o);throw o}}var Clt=(e,t)=>({...t===void 0?{}:{tries:t},baseMs:e.retryBaseMs,sleep:e.sleep,retryAfterCapMs:e.retryAfterCapMs});var Dpe=(e)=>/sub-([^/_]+)/.exec(e)?.[1]??"?";function Epe(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 Rlt=(e)=>e.severity==="identifier"&&Jse.has(e.kind),Alt=(e)=>Zl.has(e.kind);function Ape(e){return e.headerRead===e.edfCount&&e.incompleteReasons.length===0}function Olt(e){if(e.findings.some(Rlt))return"direct-identifiers";if(e.findings.some((t)=>!Alt(t)))return"review";if(!Ape(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 Tlt=/\.(edf|bdf)$/i,Flt=(e)=>e.edf===!0||Tlt.test(e.path);function Plt(e){return{edf:e.filter(Flt),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/")||!Ilt.test(t.path)).filter((t)=>!Nlt.test(t.path)),text:e.filter((t)=>jlt.test(t.path)).filter((t)=>t.path.startsWith("sourcedata/")||t.path.startsWith("code/"))}}var Ilt=/_(eeg|ieeg|meg|emg|nirs|beh|events|channels|electrodes|coordsystem|scans|physio|stim|photo|T1w|bold)\.(json|tsv)$/,Nlt=/(^|\/)(dataset_description|participants|genetic_info)\.json$/,jlt=/\.(py|m|r|txt|md|ya?ml|xml|iml|cfg|ini)$/i;function Ope(e,t,r,n=0){let i=()=>klt(e,t.url,()=>{let o={minBytes:n,userAgent:e.userAgent,timeoutMs:e.timeoutMs};return e.readEntryHead?e.readEntryHead(t,r,o):_lt(t.url,r,o)});return wlt(()=>Rpe(e,t.url)?e.workerLimit(i):i(),Clt(e))}async function N_(e,t,r){let n=await Ope(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 ap(e,t){for(let r of t)e.push(r)}var Spe="edf/superseded-absent";async function Tpe(e,t,r,n,i,o={}){let s=n.map((Se)=>Se.path),a=i==="clone",c=(Se,Xe,Qr)=>a?[...Se]:Epe(Se,Xe,Qr),u=[...ov([...s,...o.extraPaths??[]])],d=sae(s),f=Object.values(d.unscreened).reduce((Se,Xe)=>Se+Xe,0),m={},p=(Se,Xe)=>{if(Xe instanceof sO)throw Xe;let Qr=`${Se}/${xlt(Xe)}`;m[Qr]=(m[Qr]??0)+1},g=(Se)=>Dpe(Se.path),h=Plt(n),b=new Set(o.supersededEdf??[]),x=[...h.edf,...b],{participants:w,scans:D,json:C,text:E}=h,A=i==="git-tree"?Epe(x,e.limits.treeHeaderSample,g):[...x],T=0,L=0,O=0,N=0,W={},F=new Set,H=new Set,te=new Set,P=new Set,M=new Set,ge=new Set;await P_(A,e.fileConcurrency,async(Se)=>{try{let Xe=await Ope(e,Se,wt,wt),Qr=ea(Xe),{patient:Y_}=nv(Xe);if(!Qr.some((qi)=>qi.kind==="edf-unreadable")){F.add(Y_);let qi=Y_.split(/\s+/);if(qi.length>=4)te.add(qi[0]),M.add(qi[2]),P.add(qi[3])}if(ge.add(Dpe(Se.path)),Qr.some((qi)=>qi.severity==="identifier"))N++,H.add(Y_);ap(u,Qr);for(let qi of new Set(Qr.map((ghe)=>ghe.kind)))W[qi]=(W[qi]??0)+1;T++}catch(Xe){if(b.has(Se)&&Xe instanceof mr&&Xe.status===404){O++,m[Spe]=(m[Spe]??0)+1;return}L++,p("edf",Xe)}});let ce=x.length-O,br=!1,Et=!1;if(w&&w.size!==0)try{let{text:Se,truncated:Xe}=await N_(e,w,e.limits.participantsBytes),Qr=Se.indexOf(`
1253
1253
  `);if(Qr<0&&Xe)throw new mr("header-truncated");ap(u,rae(Qr<0?Se:Se.slice(0,Qr))),ap(u,iae(Se)),Et=Xe}catch(Se){br=!0,p("participants",Se)}let gr=c(D,e.limits.scansTables,g),Zr=0;await P_(gr,e.fileConcurrency,async(Se)=>{if(Se.size===0){Zr++;return}try{let{text:Xe}=await N_(e,Se,e.limits.sideFileBytes);ap(u,iv(Xe)),Zr++}catch(Xe){p("scans",Xe)}});let Rr=e.limits.sideFileBytes,qr=(Se)=>Se.size!==null&&Se.size>Rr,Q=c(C.filter((Se)=>!qr(Se)),e.limits.jsonFiles,g),B=c(E.filter((Se)=>!qr(Se)),e.limits.textFiles,g),re=0,Z=0;await P_(Q,e.fileConcurrency,async(Se)=>{if(Se.size===0){re++;return}try{let{text:Xe}=await N_(e,Se,Rr),Qr;try{Qr=JSON.parse(Xe)}catch{throw new mr("json-parse")}ap(u,Xl(Qr)),re++}catch(Xe){p("json",Xe)}}),await P_(B,e.fileConcurrency,async(Se)=>{if(Se.size===0){Z++;return}try{let{text:Xe}=await N_(e,Se,Rr);ap(u,oae(Xe)),Z++}catch(Xe){p("text",Xe)}});let J={edf_headers:{candidates:ce,oversize:0,selected:A.length-O,scanned:T},scans_tables:{candidates:D.length,oversize:0,selected:gr.length,scanned:Zr},json_files:{candidates:C.length,oversize:C.filter(qr).length,selected:Q.length,scanned:re},text_files:{candidates:E.length,oversize:E.filter(qr).length,selected:B.length,scanned:Z}},rt=new Set,si=(Se,Xe)=>{if(Xe.oversize>0)rt.add(`${Se}-oversize`);if(Xe.candidates-Xe.oversize>Xe.selected)rt.add(`${Se}-sampled`);if(Xe.scanned<Xe.selected)rt.add(`${Se}-unread`)};if(si("edf-headers",J.edf_headers),si("json",J.json_files),si("text",J.text_files),J.scans_tables.scanned<J.scans_tables.selected)rt.add("scans-unread");if(br)rt.add("participants-unread");if(Et)rt.add("participants-truncated");for(let Se of o.extraIncompleteReasons??[])rt.add(Se);let vs=[...rt].sort(),OO={findings:u,edfCount:ce,headerRead:T,unscreenedCount:f,incompleteReasons:vs},mhe=u.filter((Se)=>Se.severity==="identifier"),hhe=Object.entries(m).filter(([Se])=>!Se.startsWith("edf/")).reduce((Se,[,Xe])=>Se+Xe,0);return{id:t,version:r,scanned_at:new Date().toISOString(),manifest_source:i,status:Olt(OO),incomplete:!Ape(OO),incomplete_reasons:vs,files:{total:n.length,edf_bdf:ce,header_read:T,header_read_failed:L},sampling:J,read_failures:m,edf_bdf_files_flagged:N,distinct_patient_field_values:F.size,distinct_subjects_with_edf_bdf:ge.size,distinct_patient_code_subfield:te.size,distinct_patient_name_subfield:P.size,distinct_patient_birth_subfield:M.size,distinct_patient_field_values_in_flagged_files:H.size,findings_by_kind:aae(u),edf_bdf_files_by_kind:W,unscreened_formats:d.unscreened,side_reads_failed:hhe,finding_fields:[...new Set(mhe.map((Se)=>`${Se.kind}:${Se.field}`))].sort()}}Hf();Qn();kf();ru();var mu="--acknowledge-identifier-preflight",Blt=16,Ult="local:";function lO(e){let t=[],r=new Map,n=0,i=[""];while(i.length>0){let o=i.pop(),s;try{s=qlt(o===""?e:Fpe(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=`${Ult}${t.length}`,m=Fpe(e,d),p=null;try{let g=Ppe(m);if(g.isFile())p=g.size,r.set(f,m);else if(g.isDirectory()&&!Mlt(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 zlt(e,t=new Map){return async(r,n,i)=>{let o=e.get(r.url);if(o===void 0)throw new mr("unreadable-entry");let s=t.get(o),a;try{a=await Llt(o,"r")}catch{throw new mr("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 mr("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 mr)throw c;throw new mr("unreadable-entry")}finally{await a.close().catch(()=>{return})}}}async function Ipe(e,t){let r=lO(e),n=Cpe({fileConcurrency:Blt,workerConcurrency:1,limits:{...kpe},readEntryHead:zlt(r.readable,t),githubToken:async()=>null,readVersionManifest:async()=>{throw new mr("unreadable-entry")},sleep:async()=>{return}}),i=await Tpe(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 HC(gae(bae(o)))}function q_(e){if(Hc(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 Npe=(e,t)=>e.length===t.length&&e.every((r,n)=>r===t[n]);function jpe(e,t){let r=e.split(",").map((i)=>i.trim()).filter((i)=>i!==""),n=lv;if(r.length===0||!r.every((i)=>n.includes(i)))throw new pp(`Allowed verdicts are ${n.join(", ")}. Direct identifiers cannot be acknowledged.`);return[...t??[],...r]}function Vlt(e,t){let r=Hc(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 Npe(n,q_(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 Hlt={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"},aO=(e)=>`${mu} ${e.join(",")}`;function cO(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}: ${Hlt[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 Mpe(){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 ${mu} does not apply. If this is a false positive, please report it, so the scanner is fixed for every dataset. Terms: ${$_}`))}function qpe(e){if(e instanceof av)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 Lpe(e,t){e.fail("Identifier preflight: DID NOT FINISH"),console.log(l.red(` The preflight could not produce a verdict, so nothing was uploaded (${qpe(t)}).`)),console.log(l.dim(" Please report this: https://github.com/nemarOrg/nemar-cli/issues"))}function M_(e,t,r=""){let n=GC(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 Gc({state:t.status,...n},2).slice(1))console.log(o)}function Bpe(e,t){try{return jt(xae({version:sv,scanner:`nemar-cli@${eo}`,scan:e,acknowledged_via:t}))}catch(r){return console.log(l.red(` The preflight's record did not fit the report contract (${qpe(r)}), so nothing was uploaded.`)),$e}}async function Upe(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=Ppe(e).isDirectory()}catch{o=!1}if(!o)return i.fail("Identifier preflight: the dataset path is not a directory"),$e;let s=new Map((n?.items??[]).map((m)=>[m.path,m.after])),a;try{a=await Ipe(e,s)}catch(m){return Lpe(i,m),$e}M_(i,a);let c=q_(a),u=Vlt(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 ${aO(c)}.`));else if(t.acknowledgeIdentifierPreflight!==void 0)console.log(l.dim(` Nothing to acknowledge; ${mu} was not needed.`));d=u.acknowledgedVia;break;case"preview":return cO(c),console.log(l.yellow(` A real upload stops here until you acknowledge it: answer the prompt, or pass ${aO(c)}.`)),console.log(),jt(null);case"prompt":{cO(c);let m=!1,p=()=>{console.log(l.red(`
1254
1254
  Upload cancelled. Nothing was sent.`)),Qt(),process.exit(130)};process.once("SIGINT",p);let g=setInterval(()=>{return},1000);try{({acknowledged:m}=await De.prompt([{type:"confirm",name:"acknowledged",message:"Upload anyway?",default:!1}]))}catch{m=!1}finally{clearInterval(g),process.off("SIGINT",p)}if(m!==!0)return console.log(l.red(" Upload cancelled. Nothing was sent.")),Qt(),$e;console.log(l.dim(" Acknowledged at the prompt.")),d="prompt";break}case"refuse":return Mpe(),Qt(),$e;case"stop":if(u.why==="acknowledgment-mismatch")console.log(l.red(` ${mu} must name exactly what was found, which is: ${c.join(",")}. It does not acknowledge this scan. Nothing was sent.`));else cO(c),console.log(l.red(u.why==="declined"?" Declined (--no). Nothing was sent.":` No terminal to ask at: run interactively, or pass ${aO(c)}. --yes does not acknowledge a finding. Nothing was sent.`));return Qt(),$e}let f=Bpe(a,d);if(f.status==="ok")console.log();return f}async function zpe(e,t){let r=S("Screening again, right before anything is sent...").start(),n;try{n=await Ipe(e)}catch(a){return Lpe(r,a),$e}let i=Hc(n.status);if(i!=="clear"&&i!=="acknowledge")return M_(r,n),Mpe(),Qt(),$e;let o=q_(t.scan),s=q_(n);if(!Npe(o,s))return M_(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.`)),Qt(),$e;if(cv(n.findings_by_kind)!==cv(t.scan.findings_by_kind))M_(r,n," (screened again)");else r.succeed(`${GC(n,null).headline} (screened again)`);return Bpe(n,t.acknowledged_via)}var out=/\.(edf|bdf)$/i,Jpe=lo(".nemar","date-normalization"),sut=()=>({tracked:0,"nested-repository":0,ignored:0,"tracking-unknown":0,link:0,"not-writable":0,"other-filesystem":0,unverified:0});function aut(){return{items:[],left:sut()}}function cut(e){if(process.env.GIT_DIR||process.env.GIT_WORK_TREE)return!0;for(let t=e;;t=L_(t)){if(Gpe(lo(t,".git")))return!0;if(L_(t)===t)return!1}}var fO=(e)=>e.normalize("NFC").toLowerCase();async function uO(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(fO))}catch{return null}}async function lut(e,t){let r=`${t.join("\x00")}\x00`;if(cut(e)){let i=await uO(["git","ls-files","-z"],e),o=await uO(["git","check-ignore","-z","--stdin"],e,r);return i&&o?{tracked:i,ignored:o}:null}let n=null;try{if(n=Zlt(lo(iut(),"nemar-ignore-")),(await k(["git","init","-q","--bare",n],{cwd:e})).exitCode!==0)return null;let o=await uO(["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{yO(n,{recursive:!0,force:!0})}catch{}}}function pO(e){let t;try{t=gO(e,"r")}catch{return null}try{let r=new Uint8Array(wt),n=0;while(n<wt){let i=Qlt(t,r,n,wt-n,n);if(i===0)break;n+=i}return n===wt?r:null}catch{return null}finally{try{hO(t)}catch{}}}var Vpe=(e,t)=>e!==null&&e.length===t.length&&e.every((r,n)=>r===t[n]);function Hpe(e){try{return Wlt(e,dO.W_OK),!0}catch{return!1}}function uut(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=Gpe(lo(e,o,".git"));try{s||=xs(lo(e,o,".git")).isSymbolicLink()}catch{}r.set(o,s)}if(s)return!0}return!1}async function Ype(e){let t=aut();try{await dut(e,t)}catch(r){Zt(`date normalization: planning stopped (${r instanceof Error?r.name:"unknown"})`)}return t}async function dut(e,t){let r=Kpe(e).dev,n=lO(e),i=[];for(let c of n.entries){if(!out.test(c.path))continue;let u=n.readable.get(c.url);if(u===void 0)continue;let d=pO(u);if(d===null)continue;try{let f=Yv(d);if(f.changed)i.push({path:u,rel:c.path,before:d,after:f.header})}catch(f){if(f instanceof sa)continue;t.left.unverified++,Zt(`date normalization: a header was not planned (${f instanceof Error?f.name:"unknown"})`)}}if(i.length===0)return;let o=await lut(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(fO(c.rel))){t.left.tracked++;continue}if(uut(e,c.rel,s)){t.left["nested-repository"]++;continue}if(o.ignored.has(fO(c.rel))){t.left.ignored++;continue}let u;try{u=xs(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||!Hpe(c.path)||!Hpe(L_(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 fut=/^\d+-[0-9a-f]{16}$/;function put(e){try{let t=lo(e,Jpe);for(let r of[lo(e,".nemar"),t])if(!xs(r).isDirectory())return;for(let r of eut(t))if(fut.test(r))yO(lo(t,r),{force:!0})}catch{}}function mO(e){for(let t of e)try{rut(t)}catch{}}function mut(e,t){let r=[],n=lo(e,Jpe);try{for(let i of[lo(e,".nemar"),n]){let o;try{o=xs(i)}catch{Xlt(i),r.push(i),o=xs(i)}if(!o.isDirectory()||o.dev!==t)return mO([...r].reverse()),null}return{dir:n,made:r}}catch{return mO([...r].reverse()),null}}function hut(e){try{let t=gO(e,"r");try{Wpe(t)}finally{hO(t)}}catch{}}function gut(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(xs(e.path))||!Vpe(pO(e.path),e.before))return null;if(r=lo(t,`${process.pid}-${Glt(8).toString("hex")}`),Ylt(e.path,r,dO.COPYFILE_EXCL|dO.COPYFILE_FICLONE),xs(r).gid!==e.gid)Jlt(r,-1,e.gid);Klt(r,e.mode&4095);let i=gO(r,"r+");try{if(nut(i,e.after,0,wt,0)!==wt)return null;Wpe(i)}finally{hO(i)}if(xs(r).size!==e.size||!Vpe(pO(r),e.after))return null;if(!n(xs(e.path)))return null;return tut(r,e.path),r=null,hut(L_(e.path)),xs(e.path).mtimeMs}catch(n){return Zt(`date normalization: a header was not set (${n instanceof Error?n.name:"unknown"})`),null}finally{if(r!==null)try{yO(r,{force:!0})}catch{}}}function Xpe(e,t){let r={set:0,left:0,mtimes:new Map};if(put(e),t.items.length===0)return r;let n=null;try{n=mut(e,Kpe(e).dev)}catch{}if(n===null)return r.left=t.items.length,Zt("date normalization: no work directory, nothing set"),r;try{for(let i of t.items){let o=gut(i,n.dir);if(o===null){r.left++;continue}r.set++,r.mtimes.set(i.rel,o)}}finally{mO([n.dir,...[...n.made].reverse().filter((i)=>i!==n.dir)])}if(r.set>0)console.log(l.dim(` ${pae(r.set)}`));return r}Ze();Wi();Jn();import{existsSync as Rg,mkdirSync as Iut,readFileSync as Ag,writeFileSync as gme}from"fs";import{basename as Nut,resolve as hu}from"path";Mc();Jt();ri();Wi();import{existsSync as B_,readFileSync as bO,writeFileSync as Qpe}from"fs";import{resolve as U_}from"path";var xO=[{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}],Zpe=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 eme(e){let t=U_(e,"dataset_description.json");if(B_(t))try{let n=JSON.parse(bO(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=U_(e,n);if(B_(i)){try{let o=bO(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 wO(e){let t=xO.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?xO.find((i)=>i.spdxId===e)?.spdxId:void 0,{selected:n}=await De.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 De.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 tme(e){let t=e.toUpperCase().replace(/\s+/g,"-");if(Zpe.has(e))return!0;for(let r of Zpe)if(r.toUpperCase()===t)return!0;return!1}function yut(e){let t=xO.find((r)=>r.spdxId===e);if(t)return`${t.name}
1255
1255
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nemar-cli",
3
3
  "packageManager": "bun@1.4.3",
4
- "version": "0.10.18-dev.3451",
4
+ "version": "0.10.18",
5
5
  "description": "CLI for NEMAR (Neuroelectromagnetic Data Archive and Tools Resource) dataset management",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",