nemar-cli 0.10.16 → 0.10.17-dev.3351

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}`,_Pe,DPe,EPe=(e,t,r)=>{let n=r===""?"":`with ${r.trim()}() `,i=vPe.bind(nul
99
99
  `)}var y2=!1;var{spawn:oJe}=globalThis.Bun;function Ll(e,t=[]){let r=e.replace(sJe,'("$1","<redacted>")');for(let n of t)if(n.length>=aJe)r=r.split(n).join("<redacted>");return r}function Yx(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 Ote(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=oJe({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??cJe)};if(u(),t.timeout)o=setTimeout(()=>{i=!0,c(),n.kill()},t.timeout);let d=Jx()?[...Yx(r),...t.redact??[]]:[];if(Jx()){let b=t.cwd?` (cwd=${t.cwd})`:"";Ac(l.dim(Ll(`$ ${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([Ote(n.stdout,f),Ote(n.stderr,f),h])}finally{if(c(),o)clearTimeout(o)}if(Jx()){if(t.sensitiveOutput)Ac(l.dim("[sensitive subprocess output suppressed]"));else{if(m.trim())Ac(l.dim(Ll(m.trimEnd(),d)));if(p.trim())Ac(l.yellow(Ll(p.trimEnd(),d)))}Ac(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 sJe,aJe=8,cJe=120000;var Nt=P(()=>{Ze();sJe=/\(\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 Fte(e,t=uJe()){return e.installInstructions[t]}function dJe(e){let t=e.match(/(\d+\.\d+(?:\.\d+)?)/);return t?t[1]:void 0}function pJe(){let e=Number(process.env.TEST_PROBE_TIMEOUT_MS);return Number.isFinite(e)&&e>0?e:fJe}async function Pte(e){try{let{exitCode:t,stdout:r,timedOut:n}=await k(e.cmd,{timeout:pJe()});if(n)return{available:!1,timedOut:!0};if(t!==0)return{available:!1};return{available:!0,version:dJe(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 ch(){let e=Object.entries(Tte);return Promise.all(e.map(async([t,r])=>{let{available:n,version:i,timedOut:o}=await Pte(r);return{key:t,name:r.name,purpose:r.purpose,required:r.required,available:n,version:i,timedOut:o,installInstruction:Fte(r)}}))}async function Ite(){let t=(await ch()).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 Bl(e){let r=lJe[e].map((s)=>Tte[s]).filter(Boolean),n=await Promise.all(r.map(async(s)=>{let a=await Pte(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:Fte(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 Tte,lJe,fJe=4000;var lh=P(()=>{Nt();Tte={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)"}}},lJe={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 jte;var Nte=P(()=>{jte={name:"nemar-cli",packageManager:"bun@1.4.3",version:"0.10.16",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 Ji;var Df=P(()=>{Nte();Ji=jte.version});import{mkdirSync as hJe,readdirSync as gJe,unlinkSync as yJe,writeFileSync as bJe}from"fs";import{join as b2}from"path";function zte(){Ef=!0}function Ul(){return Ef}function Vte(e,t=process.env){return e.includes("--debug")||t.NEMAR_DEBUG==="1"}function dh(e){Ute=e,Zt(`Step: ${e}`)}function fh(){Lte=!0}function Hte(){return Lte}function Qt(){Bte=!0}function Gte(){return Bte}function Zt(e){if(Ef)process.stderr.write(`[debug] ${e}
102
+ `))}var Tte,lJe,fJe=4000;var lh=P(()=>{Nt();Tte={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)"}}},lJe={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 jte;var Nte=P(()=>{jte={name:"nemar-cli",packageManager:"bun@1.4.3",version:"0.10.17-dev.3351",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 Ji;var Df=P(()=>{Nte();Ji=jte.version});import{mkdirSync as hJe,readdirSync as gJe,unlinkSync as yJe,writeFileSync as bJe}from"fs";import{join as b2}from"path";function zte(){Ef=!0}function Ul(){return Ef}function Vte(e,t=process.env){return e.includes("--debug")||t.NEMAR_DEBUG==="1"}function dh(e){Ute=e,Zt(`Step: ${e}`)}function fh(){Lte=!0}function Hte(){return Lte}function Qt(){Bte=!0}function Gte(){return Bte}function Zt(e){if(Ef)process.stderr.write(`[debug] ${e}
103
103
  `)}function _Je(e){let t={};for(let[r,n]of Object.entries(e))t[r]=vJe.has(r.toLowerCase())?"[REDACTED]":n;return t}function Kte(e){let t=e.indexOf("@");if(t<=0)return"***";return`${e[0]}***${e.slice(t)}`}function x2(e,t,r=0){if(r>EJe)return"[REDACTED: depth]";if(Array.isArray(t))return t.map((n)=>x2(e,n,r+1));if(t&&typeof t==="object"){let n={};for(let[i,o]of Object.entries(t))n[i]=x2(i,o,r+1);return n}if(typeof t==="string"){if(DJe.test(e))return"[REDACTED]";return t.replace(Wte,Kte)}return t}function w2(e){return e.replace(SJe,"Bearer [REDACTED]").replace($Je,"[REDACTED_AWS_KEY]").replace(kJe,"$1[REDACTED]").replace(CJe,"$1$2=[REDACTED]").replace(Wte,Kte)}function RJe(e){return w2(e)}function Mte(e,t=wJe){if(e===void 0)return;let r=e;try{let n=JSON.parse(e);r=JSON.stringify(x2("",n))}catch{}if(r=w2(r),Buffer.byteLength(r,"utf8")>t)r=`${Buffer.from(r,"utf8").subarray(0,t).toString("utf8")}... [truncated]`;return r}function Qx(e){if(!Ef)return;let t=RJe(e.url);try{let r={...e,url:t,requestHeaders:e.requestHeaders?_Je(e.requestHeaders):void 0,requestBody:Mte(e.requestBody),responseBody:Mte(e.responseBody)};Zx.push(r),Zt(`${e.method} ${t} -> ${e.status??"ERROR"} (${e.durationMs}ms)`)}catch(r){let n=q(r);Zx.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 AJe(){let e=[];try{let t=process.versions.bun?`Bun ${process.versions.bun}`:`Node ${process.version}`;e.push(`CLI version: ${Ji}`),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 ch();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 v2(){return(await AJe()).join(`
104
104
  `)}async function Jte(){if(!Ef||Xx!==void 0)return;try{Xx=await v2()}catch(e){let t=q(e);Xx=`(could not build environment report: ${t})`,Zt(`environment snapshot failed: ${t}`)}}function Yte(e){if(qte.has(e))return{flag:e};for(let t of qte){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 OJe(e){let t=[];for(let r=0;r<e.length;r++){let n=e[r],i=Yte(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 TJe(e){let t=[];for(let r=0;r<e.length;r++){let n=e[r],i=Yte(n);if(!i){t.push(n);continue}if(!i.kind&&r+1<e.length)r++}return t}function FJe(e){let t=[];for(let n of TJe(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 PJe(e,t){let r=[];if(r.push("NEMAR CLI Debug Log"),r.push(`Generated: ${new Date().toISOString()}`),r.push(`Command: nemar ${w2(OJe(e).join(" "))}`),r.push(""),r.push(Xx??"(environment snapshot unavailable)"),r.push(""),r.push("HTTP requests:"),Zx.length===0)r.push(" (none)");else Zx.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: ${Ute??"(none recorded)"}`),r.push(`Exit code: ${t}`),`${r.join(`
105
105
  `)}
106
106
  `}function IJe(e,t){let r;try{r=gJe(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{yJe(b2(e,r[i]))}catch(o){if(o.code!=="ENOENT")Zt(`could not remove old log ${r[i]}: ${q(o)}`)}}function Xte(){return uh}function Zte(e,t){if(!Ef)return null;let r=b2(_2(),"logs");try{hJe(r,{recursive:!0})}catch(s){return uh=q(s),Zt(`could not create log directory ${r}: ${uh}`),null}let i=`nemar-${new Date().toISOString().replace(/[:.]/g,"-")}-${FJe(e)}.log`,o=b2(r,i);try{bJe(o,PJe(e,t),"utf8")}catch(s){return uh=q(s),Zt(`could not write log file ${o}: ${uh}`),null}return IJe(r,xJe),o}var xJe=10,wJe=2048,Ef=!1,Lte=!1,Bte=!1,Ute,Xx,Zx,vJe,DJe,Wte,EJe=32,SJe,$Je,kJe,CJe,qte,uh;var Yn=P(()=>{Jt();Yi();lh();Df();Zx=[];vJe=new Set(["authorization","cookie","set-cookie","x-api-key"]);DJe=/^(api[_-]?key|apikey|password|token|secret|access[_-]?key(_id)?|secret[_-]?access[_-]?key|session|session[_-]?token|authorization|ssh[_-]?key|private[_-]?key|device[_-]?code)$/i,Wte=/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;SJe=/Bearer\s+[A-Za-z0-9\-._~+/=]+/gi,$Je=/\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/g,kJe=/((?:aws_)?secret_access_key["']?\s*[:=]\s*["']?)[A-Za-z0-9/+=]{20,}/gi,CJe=/([?&])(X-Amz-Signature|X-Amz-Security-Token|X-Amz-Credential|Signature|AWSAccessKeyId)=[^&\s"']+/gi;qte=new Set(["-k","--key","--password","--api-key"])});import{chmodSync as NJe,copyFileSync as jJe,existsSync as D2,mkdirSync as MJe,statSync as qJe}from"fs";import{homedir as ew}from"os";import{join as Sf}from"path";function BJe(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 _2(){return process.env.NEMAR_CONFIG_DIR||Sf(ew(),".config","nemar")}function zJe(e){if(process.env.NEMAR_CONFIG_DIR)return;let t=Sf(e,"config.json");if(D2(t))return;let r=[];if(process.platform==="darwin")r.push(Sf(ew(),"Library","Preferences","nemar-nodejs","config.json"));if(process.platform==="win32"){let n=process.env.APPDATA||Sf(ew(),"AppData","Roaming");r.push(Sf(n,"nemar-nodejs","config.json"))}r.push(Sf(ew(),".config","nemar-nodejs","config.json"));for(let n of r)if(D2(n))try{MJe(e,{recursive:!0}),jJe(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 Si(){let e=_2();if(ph&&Qte===e)return ph;if(zJe(e),ph=new Kx({projectName:"nemar",configFileMode:E2,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}),Qte=e,!ere.has(e))ere.add(e),VJe(ph.path),GJe(),WJe();return ph}function VJe(e){if(process.platform==="win32")return;if(!D2(e))return;try{if((qJe(e).mode&511)!==E2)NJe(e,E2)}catch(t){console.error(`[nemar] could not secure config file permissions for ${e}:`,t)}}function GJe(){let e=Si(),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 HJe){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 WJe(){let e=Si(),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(LJe.has(BJe(a)))r[o]={...s,apiUrl:$f},console.error(`[nemar] migrated stored apiUrl for account "${o}": ${a} -> ${$f}`),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 mh(){return Si().get("activeAccount")}function Oc(){return Si().get("accounts")||{}}function Ft(){let e={apiUrl:$f},t=mh();if(!t)return e;return Oc()[t]||e}function er(e,t){let r=Si(),n=r.get("activeAccount")||"default",i=r.get("accounts")||{};if(!i[n])i[n]={apiUrl:$f};i[n][e]=t,r.store={...r.store,accounts:i,activeAccount:n}}function hh(e){let t=mh();if(!t)return;let r=Oc();if(r[t])delete r[t][e],Si().set("accounts",r)}function tre(){let e=Si(),t=mh();if(!t){e.clear();return}let r=Oc();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 rre(){Si().clear()}function tt(){return!!Ft().apiKey}function S2(){return Si().path}function gh(){let e=Oc(),t=mh();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 nre(e){return e.username?.trim()||e.email}function KJe(e){let t=e.trim().toLowerCase();if(!t)return;let r=Object.entries(Oc()).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 ire(e,t){let r=Si(),n=Oc(),i;if(n[e])i=e;else if(t.email)i=KJe(t.email);let o=i?n[i]:void 0,s={...o??{apiUrl:$f},...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 ore(e){let t=e.trim();if(!t)return"unchanged";let r=Si(),n=mh();if(!n||n===t)return"unchanged";let i=Oc(),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 $2(e){let t=Si(),r=Oc();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 $f="https://api.nemar.org",E2=384,LJe,UJe,G$t,ph=null,Qte=null,ere,HJe;var Yi=P(()=>{Rte();Cn();Dd();Yn();LJe=new Set(["https://api.osc.earth/nemar","https://nemar-api.neuromechanist.workers.dev","https://nemar-api-dev.shirazi-10f.workers.dev"]);UJe=K({field:_(),blocks:ce(_()).optional(),set_on:ce(_()).optional()}).passthrough(),G$t=K({apiKey:_().optional(),apiUrl:_().url().default($f),username:_().optional(),email:_().email().optional(),githubUsername:_().optional(),sandboxCompleted:je().optional(),sandboxDatasetId:_().optional(),dismissedNoticeIds:ce(R()).optional(),serviceAccess:je().optional(),profileGaps:ce(UJe).optional(),orcidVerified:je().optional(),role:_().optional(),accountKind:El.optional(),pendingEmailChange:_().email().optional()});ere=new Set;HJe=["apiKey","apiUrl","username","email","githubUsername","sandboxCompleted","sandboxDatasetId","dismissedNoticeIds"]});function tw(e){if(sre)return;sre=!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 Si(){let e=_2();if(ph&&Qte===e)return ph;if(zJe(e),ph=new Kx({projectName:"nemar",configFileMode:E2,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}),Qte=e,!ere.has(e))ere.add(e),VJe(ph.path),GJe(),WJe();return ph}function VJe(e){if(process.platform==="win32")return;if(!D2(e))return;try{if((qJe(e).mode&511)!==E2)NJe(e,E2)}catch(t){console.error(`[nemar] could not secure config file permissions for ${e}:`,t)}}function GJe(){let e=Si(),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 HJe){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 WJe(){let e=Si(),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(LJe.has(BJe(a)))r[o]={...s,apiUrl:$f},console.error(`[nemar] migrated stored apiUrl for account "${o}": ${a} -> ${$f}`),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 mh(){return Si().get("activeAccount")}function Oc(){return Si().get("accounts")||{}}function Ft(){let e={apiUrl:$f},t=mh();if(!t)return e;return Oc()[t]||e}function er(e,t){let r=Si(),n=r.get("activeAccount")||"default",i=r.get("accounts")||{};if(!i[n])i[n]={apiUrl:$f};i[n][e]=t,r.store={...r.store,accounts:i,activeAccount:n}}function hh(e){let t=mh();if(!t)return;let r=Oc();if(r[t])delete r[t][e],Si().set("accounts",r)}function tre(){let e=Si(),t=mh();if(!t){e.clear();return}let r=Oc();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 rre(){Si().clear()}function tt(){return!!Ft().apiKey}function S2(){return Si().path}function gh(){let e=Oc(),t=mh();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 nre(e){return e.username?.trim()||e.email}function KJe(e){let t=e.trim().toLowerCase();if(!t)return;let r=Object.entries(Oc()).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 ire(e,t){let r=Si(),n=Oc(),i;if(n[e])i=e;else if(t.email)i=KJe(t.email);let o=i?n[i]:void 0,s={...o??{apiUrl:$f},...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 ore(e){let t=e.trim();if(!t)return"unchanged";let r=Si(),n=mh();if(!n||n===t)return"unchanged";let i=Oc(),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 $2(e){let t=Si(),r=Oc();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 $f="https://nemar-api-dev.sccn-org.workers.dev",E2=384,LJe,UJe,G$t,ph=null,Qte=null,ere,HJe;var Yi=P(()=>{Rte();Cn();Dd();Yn();LJe=new Set(["https://api.osc.earth/nemar","https://nemar-api.neuromechanist.workers.dev","https://nemar-api-dev.shirazi-10f.workers.dev"]);UJe=K({field:_(),blocks:ce(_()).optional(),set_on:ce(_()).optional()}).passthrough(),G$t=K({apiKey:_().optional(),apiUrl:_().url().default($f),username:_().optional(),email:_().email().optional(),githubUsername:_().optional(),sandboxCompleted:je().optional(),sandboxDatasetId:_().optional(),dismissedNoticeIds:ce(R()).optional(),serviceAccess:je().optional(),profileGaps:ce(UJe).optional(),orcidVerified:je().optional(),role:_().optional(),accountKind:El.optional(),pendingEmailChange:_().email().optional()});ere=new Set;HJe=["apiKey","apiUrl","username","email","githubUsername","sandboxCompleted","sandboxDatasetId","dismissedNoticeIds"]});function tw(e){if(sre)return;sre=!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 sre=!1;var k2=P(()=>{Ze()});function rw(){if(process.env.TEST_API_URL)return process.env.TEST_API_URL;if(R2)return C2;return Ft().apiUrl||C2}async function j(e,t={},r=!1,n){let i=`${rw()}${e}`,o={"Content-Type":"application/json","X-CLI-Version":Ji,...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(Ul())Qx({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 ${rw()}`,{originalError:m instanceof Error?m.message:String(m)})}let d;try{d=await u.text()}catch(m){if(Ul())Qx({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(Ul())Qx({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.",H=typeof f.eta==="string"?f.eta:null,O=new Rc(f.mode,T,H,f.details);throw tw(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"&&(rU.includes(f.error)||yU.includes(f.error)),h=typeof f.error==="string"&&(Py.options.includes(f.error)||_U.includes(f.error)),b=typeof f.error==="string"&&Y7.includes(f.error),x=typeof f.error==="string"&&nU.includes(f.error),w=typeof f.error==="string"&&gU.includes(f.error),D=typeof f.error==="string"&&hU.includes(f.error),E=m||D||g||h||b||x||w||p!==void 0&&typeof f.error==="string"&&tU.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 C2="https://api.nemar.org",R2;var Bs=P(()=>{_m();jy();J1();Fy();Dd();Yi();Yn();k2();Df();Jt();R2=C2.includes("workers.dev")});function nw(e){if(e.service_access===void 0||e.service_access===null)return"unknown";return e.service_access?"upload":"browse"}async function A2(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,Q7)}async function iw(e,t=!1){return j(`/admin/users/by-id/${e}${t?"?include_deleted=true":""}`,{},!0,sU)}async function are(e,t){return j(`/admin/users/by-id/${e}`,{method:"PATCH",body:JSON.stringify(t)},!0,aU)}async function cre(e){return j(`/admin/approve/${e}`,{method:"POST"},!0)}async function lre(e){return j(`/admin/approve/by-id/${e}`,{method:"POST"},!0)}async function ure(e){return j(`/admin/revoke/${e}`,{method:"POST"},!0)}async function dre(e){return j(`/admin/revoke/by-id/${e}`,{method:"POST"},!0)}async function fre(e,t){return j(`/admin/users/${e}/role`,{method:"POST",body:JSON.stringify({role:t})},!0)}async function pre(e,t){return j(`/admin/users/${e}/kind`,{method:"POST",body:JSON.stringify({kind:t})},!0)}async function mre(e){return j(`/admin/users/${e}`,{},!0)}async function hre(e,t){return j(`/admin/users/${e}/keys`,{method:"POST",body:JSON.stringify({name:t})},!0,Ny)}async function gre(e){return j(`/admin/users/${e}/keys`,{},!0,Iy)}async function yre(e,t){return j(`/admin/users/${e}/keys/${t}`,{method:"DELETE"},!0)}async function O2(e,t){return j(`/admin/datasets/${e}/visibility`,{method:"PATCH",body:JSON.stringify({visibility:t})},!0)}async function bre(e){return j(`/datasets/${e}/publish`,{method:"POST"},!0)}async function xre(e){return j(`/admin/datasets/${e}/ci`,{},!0)}async function Us(e){return j(`/admin/datasets/${e}/ci`,{method:"POST"},!0)}async function T2(e){return j(`/admin/datasets/${e}/ci/validate`,{method:"POST"},!0)}async function F2(e){return j(`/admin/datasets/${e}/ci/sync`,{method:"POST"},!0)}async function wre(e,t){return j(`/admin/datasets/${e}/doi/concept`,{method:"POST",body:JSON.stringify(t)},!0)}async function yh(e){return j(`/admin/datasets/${e}/doi`,{},!0)}async function P2(e,t){return j(`/admin/datasets/${e}/doi/update`,{method:"POST",body:JSON.stringify(t)},!0)}async function vre(e,t){return j(`/admin/datasets/${e}/withdraw`,{method:"POST",body:JSON.stringify({reason:t.reason,dry_run:t.dryRun})},!0)}async function _re(e,t){return j(`/admin/datasets/${e}/restore`,{method:"POST",body:JSON.stringify({dry_run:t.dryRun})},!0)}async function Dre(e){return j(`/admin/datasets/${e}/reset`,{method:"POST"},!0)}async function Ere(e,t=!1){return j(`/admin/datasets/${e}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:t})},!0)}async function Sre(e){return j("/admin/datasets/bulk-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataset_ids:e})},!0)}async function $re(e){return j("/admin/datasets/import",{method:"POST",body:JSON.stringify(e)},!0)}async function kre(e){return j("/admin/datasets/exemplar",{method:"POST",body:JSON.stringify(e)},!0)}async function Cre(e){return j(`/admin/datasets/${e}/exemplar/remint-dois`,{method:"POST"},!0)}async function I2(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 Rre(e){return j(`/admin/imports/${e}/rollback`,{method:"POST"},!0)}async function Are(e){return j(`/admin/imports/${e}/retry`,{method:"POST"},!0)}async function N2(e){return j(`/admin/imports/${e}/verify`,{method:"POST"},!0)}async function Ore(e){return j("/admin/imports/dispatch-cooldown",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataset_ids:e})},!0)}async function kf(e,t){return j(`/admin/datasets/${e}/reindex`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t??{})},!0)}async function Tre(e,t){return j("/admin/datasets/reindex/bulk",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filter:e,...t??{}})},!0)}async function Fre(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 Pre(){return j("/admin/datasets/hed-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function Ire(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 Nre(){return j("/admin/datasets/recording-stats-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function jre(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 Mre(){return j("/admin/datasets/signal-defaults-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function qre(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 Lre(){return j("/admin/datasets/data-integrity-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function Bre(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 Ure(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 zre(){return j("/admin/datasets/availability-report-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function Vre(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 Cf(e,t){return j(`/admin/datasets/${e}/enforce`,{method:"POST",body:JSON.stringify({dry_run:t})},!0)}async function Hre(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 Gre(e,t=!1){return j(`/admin/datasets/${e}/revalidate${t?"?force=true":""}`,{method:"POST"},!0)}async function Wre(e){let t=e?`?user=${encodeURIComponent(e)}`:"";return j(`/admin/email-preferences${t}`,{},!0)}async function Kre(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 Jre(){return j("/admin/summary/coverage",{},!0)}async function Yre(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 M2(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 q2(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 Xre(){return j("/admin/zarr-catalog/publish",{method:"POST"},!0)}async function Zre(e){return j("/admin/neurobagel/regenerate",{method:"POST",body:JSON.stringify(e)},!0)}async function Qre(){return j("/admin/neurobagel/status",{method:"GET"},!0)}async function ene(){return j("/admin/neurobagel/verify",{method:"POST",body:"{}"},!0)}async function tne(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 rne(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 nne(e){let t=e?.apply?"?apply=1":"";return j(`/admin/imports/coverage-sweep${t}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function ine(e){let t=e?.apply?"?apply=1":"";return j(`/admin/imports/weekly-summary${t}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function one(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 sne(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 ane(){return j("/admin/users/duplicates",{},!0,bU)}async function cne(e){return j(`/admin/users/${e}/clear-identity-conflict`,{method:"POST"},!0,xU)}async function lne(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 une(){return j("/admin/datasets/anonymity-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function ow(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 L2(e,t,r){let n=r?`?head=${encodeURIComponent(r)}`:"";return j(`/admin/pr-reviews/${encodeURIComponent(e)}/${t}${n}`,{method:"GET"},!0)}async function B2(e,t){return j(`/admin/pr-reviews/${encodeURIComponent(e)}/${t}/start`,{method:"POST"},!0)}async function dne(e){return j(`/admin/pr-review-authors/${encodeURIComponent(e)}`,{method:"GET"},!0)}async function fne(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 pne(e){return j(`/admin/pr-review-authors/${encodeURIComponent(e)}`,{method:"DELETE"},!0)}var zl=P(()=>{_m();Rd();Bs()});async function Vr(e,t){return j(`/datasets/${e}/upload-credentials`,{method:"POST",body:JSON.stringify({duration_seconds:t})},!0)}async function U2(e,t){return j(`/datasets/${e}/download-credentials`,{method:"POST",body:JSON.stringify({duration_seconds:t})},!0)}async function mne(e){return j(`/admin/datasets/${e}/files`,{},!0)}async function hne(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 zs=P(()=>{Bs();Jt()});async function aw(e){return j(`/datasets/${e}/ci/status`,{},!0)}async function gne(e){return j(`/datasets/${e}/manifest`,{},!0)}async function cw(e,t){return j(`/datasets/${e}/manifest/${t}`,{},!0)}function yne(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 Tc(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(yne),n}async function bne(e){return j(`/datasets/resolve/${e}`,{},"optional")}async function xne(){return j("/datasets/facets",{signal:AbortSignal.timeout(5000)},"optional",Oy)}async function wne(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",pU)}async function vr(e){let t=await j(`/datasets/${e}`,{},"optional");return yne(t.dataset)}async function vne(e){return j(`/datasets/${e}/versions`,{},!0)}async function lw(e){return j("/datasets",{method:"POST",body:JSON.stringify(e)},!0)}async function _ne(e,t){return j(`/datasets/${e}/attestation`,{method:"PUT",body:JSON.stringify(t)},!0)}async function uw(e){return j(`/datasets/${e}/finalize`,{method:"POST"},!0)}async function z2(e){return j(`/datasets/${e}/request-access`,{method:"POST"},!0)}async function Dne(e,t){let r=t?`?status=${t}`:"";return j(`/datasets/${e}/access-requests${r}`,{},!0)}async function Ene(e,t){return j(`/datasets/${e}/access-requests/${t}/approve`,{method:"POST"},!0)}async function Sne(e,t){return j(`/datasets/${e}/access-requests/${t}/deny`,{method:"POST"},!0)}async function $ne(e,t){return j(`/datasets/${e}/invite`,{method:"POST",body:JSON.stringify({username:t})},!0)}async function kne(e){return j(`/datasets/${e}/collaborators`,{},!0)}async function Cne(e,t){return j(`/admin/datasets/${e}/enrichment`,{method:"POST",body:JSON.stringify(t)},!0)}var sw;var Fc=P(()=>{Rd();Bs();sw=/^\d{4}-\d{4}-\d{4}-\d{3}[\dX]$/});var Fne=1e4;async function Rf(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 Af(e){return j(`/datasets/${e}/publish/status`,{},!0)}async function Ine(e){return j(`/datasets/${e}/publish/resend`,{method:"POST"},!0)}async function Nne(e){let t=e?`?status=${e}`:"";return j(`/admin/publish/requests${t}`,{},!0)}async function dw(e,t){return j(`/admin/publish/${e}/deny`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({reason:t})},!0)}async function fw(e){return j(`/admin/publish/${e}/identifier-screen`,{method:"POST"},!0)}function JJe(e,t=[]){if(e){let r=Ua.indexOf(e);if(r>=0)return r+1}return Math.min(t.length+1,Ua.length)}function YJe(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 Of(e,t=!1,r=!1,n=!1,i,o,s){let c=Fne,u,d,f=0,m=!1,p,g=t,h=[],b;function x(w,D,C,E){if(!o)return;o({step:w,stepIndex:JJe(w,D),stepTotal:Ua.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=Pne(h);return D}catch(D){if(b=D,w===5||!YJe(D)){if(D instanceof V&&h.length>0)D.stepResults=Pne(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 Pne(e){let t=new Map;for(let r of e)t.set(r.step,r);return Array.from(t.values())}var Tf=P(()=>{Ky();Bs();Jt()});function nie(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"&&!Vs.has(r)).filter((r)=>t.prefix?r.startsWith(t.prefix):!0).sort()}var Vs;var gw=P(()=>{Vs=new Set(["nm000103","nm000104","nm000105","nm000106","nm000107"])});function Xi(e){return e.replace(rYe,(t)=>{if(t===`
113
+ `)}var sre=!1;var k2=P(()=>{Ze()});function rw(){if(process.env.TEST_API_URL)return process.env.TEST_API_URL;if(R2)return C2;return Ft().apiUrl||C2}async function j(e,t={},r=!1,n){let i=`${rw()}${e}`,o={"Content-Type":"application/json","X-CLI-Version":Ji,...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(Ul())Qx({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 ${rw()}`,{originalError:m instanceof Error?m.message:String(m)})}let d;try{d=await u.text()}catch(m){if(Ul())Qx({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(Ul())Qx({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.",H=typeof f.eta==="string"?f.eta:null,O=new Rc(f.mode,T,H,f.details);throw tw(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"&&(rU.includes(f.error)||yU.includes(f.error)),h=typeof f.error==="string"&&(Py.options.includes(f.error)||_U.includes(f.error)),b=typeof f.error==="string"&&Y7.includes(f.error),x=typeof f.error==="string"&&nU.includes(f.error),w=typeof f.error==="string"&&gU.includes(f.error),D=typeof f.error==="string"&&hU.includes(f.error),E=m||D||g||h||b||x||w||p!==void 0&&typeof f.error==="string"&&tU.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 C2="https://nemar-api-dev.sccn-org.workers.dev",R2;var Bs=P(()=>{_m();jy();J1();Fy();Dd();Yi();Yn();k2();Df();Jt();R2=C2.includes("workers.dev")});function nw(e){if(e.service_access===void 0||e.service_access===null)return"unknown";return e.service_access?"upload":"browse"}async function A2(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,Q7)}async function iw(e,t=!1){return j(`/admin/users/by-id/${e}${t?"?include_deleted=true":""}`,{},!0,sU)}async function are(e,t){return j(`/admin/users/by-id/${e}`,{method:"PATCH",body:JSON.stringify(t)},!0,aU)}async function cre(e){return j(`/admin/approve/${e}`,{method:"POST"},!0)}async function lre(e){return j(`/admin/approve/by-id/${e}`,{method:"POST"},!0)}async function ure(e){return j(`/admin/revoke/${e}`,{method:"POST"},!0)}async function dre(e){return j(`/admin/revoke/by-id/${e}`,{method:"POST"},!0)}async function fre(e,t){return j(`/admin/users/${e}/role`,{method:"POST",body:JSON.stringify({role:t})},!0)}async function pre(e,t){return j(`/admin/users/${e}/kind`,{method:"POST",body:JSON.stringify({kind:t})},!0)}async function mre(e){return j(`/admin/users/${e}`,{},!0)}async function hre(e,t){return j(`/admin/users/${e}/keys`,{method:"POST",body:JSON.stringify({name:t})},!0,Ny)}async function gre(e){return j(`/admin/users/${e}/keys`,{},!0,Iy)}async function yre(e,t){return j(`/admin/users/${e}/keys/${t}`,{method:"DELETE"},!0)}async function O2(e,t){return j(`/admin/datasets/${e}/visibility`,{method:"PATCH",body:JSON.stringify({visibility:t})},!0)}async function bre(e){return j(`/datasets/${e}/publish`,{method:"POST"},!0)}async function xre(e){return j(`/admin/datasets/${e}/ci`,{},!0)}async function Us(e){return j(`/admin/datasets/${e}/ci`,{method:"POST"},!0)}async function T2(e){return j(`/admin/datasets/${e}/ci/validate`,{method:"POST"},!0)}async function F2(e){return j(`/admin/datasets/${e}/ci/sync`,{method:"POST"},!0)}async function wre(e,t){return j(`/admin/datasets/${e}/doi/concept`,{method:"POST",body:JSON.stringify(t)},!0)}async function yh(e){return j(`/admin/datasets/${e}/doi`,{},!0)}async function P2(e,t){return j(`/admin/datasets/${e}/doi/update`,{method:"POST",body:JSON.stringify(t)},!0)}async function vre(e,t){return j(`/admin/datasets/${e}/withdraw`,{method:"POST",body:JSON.stringify({reason:t.reason,dry_run:t.dryRun})},!0)}async function _re(e,t){return j(`/admin/datasets/${e}/restore`,{method:"POST",body:JSON.stringify({dry_run:t.dryRun})},!0)}async function Dre(e){return j(`/admin/datasets/${e}/reset`,{method:"POST"},!0)}async function Ere(e,t=!1){return j(`/admin/datasets/${e}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:t})},!0)}async function Sre(e){return j("/admin/datasets/bulk-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataset_ids:e})},!0)}async function $re(e){return j("/admin/datasets/import",{method:"POST",body:JSON.stringify(e)},!0)}async function kre(e){return j("/admin/datasets/exemplar",{method:"POST",body:JSON.stringify(e)},!0)}async function Cre(e){return j(`/admin/datasets/${e}/exemplar/remint-dois`,{method:"POST"},!0)}async function I2(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 Rre(e){return j(`/admin/imports/${e}/rollback`,{method:"POST"},!0)}async function Are(e){return j(`/admin/imports/${e}/retry`,{method:"POST"},!0)}async function N2(e){return j(`/admin/imports/${e}/verify`,{method:"POST"},!0)}async function Ore(e){return j("/admin/imports/dispatch-cooldown",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataset_ids:e})},!0)}async function kf(e,t){return j(`/admin/datasets/${e}/reindex`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t??{})},!0)}async function Tre(e,t){return j("/admin/datasets/reindex/bulk",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filter:e,...t??{}})},!0)}async function Fre(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 Pre(){return j("/admin/datasets/hed-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function Ire(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 Nre(){return j("/admin/datasets/recording-stats-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function jre(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 Mre(){return j("/admin/datasets/signal-defaults-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function qre(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 Lre(){return j("/admin/datasets/data-integrity-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function Bre(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 Ure(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 zre(){return j("/admin/datasets/availability-report-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function Vre(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 Cf(e,t){return j(`/admin/datasets/${e}/enforce`,{method:"POST",body:JSON.stringify({dry_run:t})},!0)}async function Hre(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 Gre(e,t=!1){return j(`/admin/datasets/${e}/revalidate${t?"?force=true":""}`,{method:"POST"},!0)}async function Wre(e){let t=e?`?user=${encodeURIComponent(e)}`:"";return j(`/admin/email-preferences${t}`,{},!0)}async function Kre(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 Jre(){return j("/admin/summary/coverage",{},!0)}async function Yre(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 M2(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 q2(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 Xre(){return j("/admin/zarr-catalog/publish",{method:"POST"},!0)}async function Zre(e){return j("/admin/neurobagel/regenerate",{method:"POST",body:JSON.stringify(e)},!0)}async function Qre(){return j("/admin/neurobagel/status",{method:"GET"},!0)}async function ene(){return j("/admin/neurobagel/verify",{method:"POST",body:"{}"},!0)}async function tne(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 rne(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 nne(e){let t=e?.apply?"?apply=1":"";return j(`/admin/imports/coverage-sweep${t}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function ine(e){let t=e?.apply?"?apply=1":"";return j(`/admin/imports/weekly-summary${t}`,{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function one(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 sne(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 ane(){return j("/admin/users/duplicates",{},!0,bU)}async function cne(e){return j(`/admin/users/${e}/clear-identity-conflict`,{method:"POST"},!0,xU)}async function lne(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 une(){return j("/admin/datasets/anonymity-sweep?reset=1",{method:"POST",headers:{"Content-Type":"application/json"}},!0)}async function ow(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 L2(e,t,r){let n=r?`?head=${encodeURIComponent(r)}`:"";return j(`/admin/pr-reviews/${encodeURIComponent(e)}/${t}${n}`,{method:"GET"},!0)}async function B2(e,t){return j(`/admin/pr-reviews/${encodeURIComponent(e)}/${t}/start`,{method:"POST"},!0)}async function dne(e){return j(`/admin/pr-review-authors/${encodeURIComponent(e)}`,{method:"GET"},!0)}async function fne(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 pne(e){return j(`/admin/pr-review-authors/${encodeURIComponent(e)}`,{method:"DELETE"},!0)}var zl=P(()=>{_m();Rd();Bs()});async function Vr(e,t){return j(`/datasets/${e}/upload-credentials`,{method:"POST",body:JSON.stringify({duration_seconds:t})},!0)}async function U2(e,t){return j(`/datasets/${e}/download-credentials`,{method:"POST",body:JSON.stringify({duration_seconds:t})},!0)}async function mne(e){return j(`/admin/datasets/${e}/files`,{},!0)}async function hne(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 zs=P(()=>{Bs();Jt()});async function aw(e){return j(`/datasets/${e}/ci/status`,{},!0)}async function gne(e){return j(`/datasets/${e}/manifest`,{},!0)}async function cw(e,t){return j(`/datasets/${e}/manifest/${t}`,{},!0)}function yne(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 Tc(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(yne),n}async function bne(e){return j(`/datasets/resolve/${e}`,{},"optional")}async function xne(){return j("/datasets/facets",{signal:AbortSignal.timeout(5000)},"optional",Oy)}async function wne(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",pU)}async function vr(e){let t=await j(`/datasets/${e}`,{},"optional");return yne(t.dataset)}async function vne(e){return j(`/datasets/${e}/versions`,{},!0)}async function lw(e){return j("/datasets",{method:"POST",body:JSON.stringify(e)},!0)}async function _ne(e,t){return j(`/datasets/${e}/attestation`,{method:"PUT",body:JSON.stringify(t)},!0)}async function uw(e){return j(`/datasets/${e}/finalize`,{method:"POST"},!0)}async function z2(e){return j(`/datasets/${e}/request-access`,{method:"POST"},!0)}async function Dne(e,t){let r=t?`?status=${t}`:"";return j(`/datasets/${e}/access-requests${r}`,{},!0)}async function Ene(e,t){return j(`/datasets/${e}/access-requests/${t}/approve`,{method:"POST"},!0)}async function Sne(e,t){return j(`/datasets/${e}/access-requests/${t}/deny`,{method:"POST"},!0)}async function $ne(e,t){return j(`/datasets/${e}/invite`,{method:"POST",body:JSON.stringify({username:t})},!0)}async function kne(e){return j(`/datasets/${e}/collaborators`,{},!0)}async function Cne(e,t){return j(`/admin/datasets/${e}/enrichment`,{method:"POST",body:JSON.stringify(t)},!0)}var sw;var Fc=P(()=>{Rd();Bs();sw=/^\d{4}-\d{4}-\d{4}-\d{3}[\dX]$/});var Fne=1e4;async function Rf(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 Af(e){return j(`/datasets/${e}/publish/status`,{},!0)}async function Ine(e){return j(`/datasets/${e}/publish/resend`,{method:"POST"},!0)}async function Nne(e){let t=e?`?status=${e}`:"";return j(`/admin/publish/requests${t}`,{},!0)}async function dw(e,t){return j(`/admin/publish/${e}/deny`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({reason:t})},!0)}async function fw(e){return j(`/admin/publish/${e}/identifier-screen`,{method:"POST"},!0)}function JJe(e,t=[]){if(e){let r=Ua.indexOf(e);if(r>=0)return r+1}return Math.min(t.length+1,Ua.length)}function YJe(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 Of(e,t=!1,r=!1,n=!1,i,o,s){let c=Fne,u,d,f=0,m=!1,p,g=t,h=[],b;function x(w,D,C,E){if(!o)return;o({step:w,stepIndex:JJe(w,D),stepTotal:Ua.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=Pne(h);return D}catch(D){if(b=D,w===5||!YJe(D)){if(D instanceof V&&h.length>0)D.stepResults=Pne(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 Pne(e){let t=new Map;for(let r of e)t.set(r.step,r);return Array.from(t.values())}var Tf=P(()=>{Ky();Bs();Jt()});function nie(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"&&!Vs.has(r)).filter((r)=>t.prefix?r.startsWith(t.prefix):!0).sort()}var Vs;var gw=P(()=>{Vs=new Set(["nm000103","nm000104","nm000105","nm000106","nm000107"])});function Xi(e){return e.replace(rYe,(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 yw(e,t=", "){return e.map(Xi).join(t)}var rYe,Ff=(e)=>Xi(e)===e;var bh=P(()=>{rYe=/[\p{Cc}\u2028\u2029\u202a-\u202e\u2066-\u2069]/gu});async function nYe(){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 Vl(){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 bw(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 xw(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 es(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 Vl();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 nYe();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"}
@@ -1239,7 +1239,7 @@ ${u.slice(0,10).join(`
1239
1239
  `)}}}Fy();Jt();function Pfe(e){return e instanceof V&&e.statusCode===422&&e.rawBody?.status==="blocked"&&Ty(e.blockReason)}function Ife(e){let t=e.rawBody?.ci_url;return typeof t==="string"&&/^https:\/\/\S+$/.test(t)?t:void 0}function PA(e){return e==="bids_validation_in_progress"?"Request recorded: BIDS validation is still running.":"Request recorded: BIDS validation has not started yet."}function IA(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();Yi();async function w_(){let e=Ft().sandboxCompleted;if(e!==void 0)return{status:e?"completed":"not_completed"};try{let t=await pw();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 NA=Me(Hw(),1);function v_(e){if(e!==e.trim())return null;let t=NA.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 lu(e,t){let r=v_(e);if(!r)throw Error(`Invalid version: ${e}`);let n=NA.default.inc(`${r.major}.${r.minor}.${r.patch}`,t);if(!n)throw Error(`Invalid version: ${e}`);return n}function jA(e){return v_(e)!==null}Ze();Qi();Ze();Gn();zl();Jt();Xf();_v();bh();Qi();Ic();Dv();mR();Xc();Xl();import{existsSync as MA,mkdirSync as hct,readFileSync as gct,statSync as yct,writeFileSync as Nfe}from"fs";import{join as bct,resolve as qA}from"path";function jfe(e,t,r){if(!ro(r,"metadata_write")){if(t)try{let n=qA(e,".nemar"),i=qA(n,"metadata.json");if(!MA(i)){if(!MA(n))hct(n,{recursive:!0});Nfe(i,JSON.stringify(t,null,2))}let o=qA(e,".bidsignore"),s="";if(MA(o))s=gct(o,"utf-8");if(!s.includes(".nemar/")){let a=s?`${s.trimEnd()}
1240
1240
  .nemar/
1241
1241
  `:`.nemar/
1242
- `;Nfe(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."))}Qs(r,"metadata_write"),Ir(e,r)}else console.log(l.dim(" Metadata write already completed (skipping)"))}var Mfe=1073741824;function xct(e,t,r=Mfe){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 wct(e,t){return t.filter((r)=>{try{return Pc(r.path,yct(bct(e,r.path)).size)}catch{return!0}})}function vct(e){let t=0;for(let r of Object.values(e.files))t+=r.size;return t}function _ct(e){return["Warning: saving dataset changes has produced no stdout or stderr for",`${Ev(e)}. git add -A is still running.`,"Wait, or interrupt and rerun the upload; the save step will run again."].join(" ")}async function qfe(e,t,r,n={}){if(!ro(r,"dataset_save")){let i=S({text:"Saving dataset changes...",...n.spinnerStream?{stream:n.spinnerStream}:{}}).start(),o=n.skipMinBytes??Mfe,s=[];if(vct(r)>=o){let c=n.annexedPaths??null;if(c===null)try{c=await Yc(e)}catch(u){console.log(l.dim(` Could not list annexed files (${q(u)}); staging will re-read them`))}if(c!==null)s=wct(e,xct(r,c,o)??[])}let a=await Gs(e,"Initial NEMAR dataset upload",t,{skipContentCheck:s,onInactivityWarning:(c)=>{i=Hh(i,_ct(c))},...n.inactivityWarningAfterMs===void 0?{}:{inactivityWarningAfterMs:n.inactivityWarningAfterMs}});if(!a.success)return Ir(e,r),sn(i,"Failed to save dataset",a.error),console.log(),console.log(l.yellow("Re-run the same command to resume from this step.")),Ae;if(n.verifyRemote){let c;try{c=await wR(e,n.verifyRemote)}catch(u){return Ir(e,r),sn(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.")),Ae}if(c.length>0){ea(r,"s3_upload"),Ir(e,r);let u=yw(c.slice(0,5)),d=c.length>5?` (and ${c.length-5} more)`:"";return sn(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.")),Ae}}i.succeed("Dataset changes saved"),Qs(r,"dataset_save"),Ir(e,r)}else console.log(l.dim(" Dataset save already completed (skipping)"));return jt()}async function Lfe(e,t){if(!ro(t,"github_push")){let r=S("Pushing metadata to GitHub...").start(),n=await _r(e);if(!n.success)return Ir(e,t),sn(r,"Failed to push to GitHub",n.error),console.log(),console.log(l.yellow("Re-run the same command to resume from this step.")),Ae;if(n.warning)r.warn("Metadata pushed to GitHub (with warning)"),console.log(l.yellow(` ${n.warning}`));else r.succeed("Metadata pushed to GitHub");Qs(t,"github_push"),Ir(e,t)}else console.log(l.dim(" GitHub push already completed (skipping)"));return jt()}async function Bfe(e,t,r){if(!ro(r,"ci_deploy")){let n=S("Setting up BIDS validation CI...").start(),i="configured";try{await Us(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 Qs(r,"ci_deploy"),Ir(e,r),i}return console.log(l.dim(" CI deploy already completed (skipping)")),"unknown"}function Dct(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 Ufe(e,t,r="unknown"){Vh(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(),Dct(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."))}Xc();Xl();async function zfe(e,t={}){let r=await Oie(e.absolutePath);if(!r.success)return console.log(l.red(r.error)),console.log(l.yellow("Re-run the same command to retry.")),Ae;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 Kce(e.absolutePath,e.options,e.dataFiles,e.filesToUpload,e.uploadProgress,e.datasetInfo,{openRemote:t.openRemote});if(n.status==="fail")return Ae;let{progress:i,annexedPaths:o}=n.value;if(jfe(e.absolutePath,e.coAuthorEnrichment,i),(await(t.saveStep??qfe)(e.absolutePath,e.author,i,{annexedPaths:o,verifyRemote:cs,...t.skipMinBytes===void 0?{}:{skipMinBytes:t.skipMinBytes},...t.saveInactivityWarningAfterMs===void 0?{}:{inactivityWarningAfterMs:t.saveInactivityWarningAfterMs},...t.saveSpinnerStream===void 0?{}:{spinnerStream:t.saveSpinnerStream}})).status==="fail")return Ae;return jt(i)}Ze();Jl();Bf();AR();Yn();Nt();import{randomBytes as olt}from"crypto";import{constants as HA,accessSync as slt,chmodSync as alt,chownSync as clt,closeSync as JA,copyFileSync as llt,existsSync as mpe,fsyncSync as hpe,lstatSync as fs,mkdirSync as ult,mkdtempSync as dlt,openSync as YA,readSync as flt,readdirSync as plt,renameSync as mlt,rmSync as XA,rmdirSync as hlt,statSync as gpe,writeSync as glt}from"fs";import{tmpdir as ylt}from"os";import{dirname as C_,join as oo}from"path";Ze();import{lstatSync as Xct,readdirSync as Zct,statSync as rpe}from"fs";import{open as Qct}from"fs/promises";import{join as tpe}from"path";Ui();Gn();Jl();var Kfe="nemar-identifier-scan/1.0 (+https://docs.nemar.org/policies/takedown/)",Ect="https://api.nemar.org",Sct="https://data.nemar.org",$ct="https://nemar.s3.us-east-2.amazonaws.com",kct="https://api.github.com";function S_(e,t){if(!Number.isSafeInteger(t)||t<1)throw RangeError(`${e} must be a positive integer, got ${t}`)}async function __(e,t,r){S_("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 Cct(e){S_("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 Rct(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 Act(e,t){let r=e>=500||e===429;return new mr(`http-${e}`,{status:e,retryable:r,retryAfterMs:r?Rct(t):void 0})}class LA extends Error{constructor(e){super(e);this.name="RunAborted"}}function Oct(e){S_("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 LA(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 Vfe(e){let t=e instanceof Error?e.name:"";return new mr(t==="TimeoutError"||t==="AbortError"?"timeout":"network",{retryable:!0})}function Tct(e){if(e instanceof mr)return e.cls;return`error-${e instanceof Error?e.name:"unknown"}`}async function Fct(e,t={}){let r=t.tries??3,n=t.baseMs??400,i=t.sleep??((o)=>new Promise((s)=>setTimeout(s,o)));S_("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 Pct(e){await e.body?.cancel().catch(()=>{return})}async function Ict(e,t,r={}){let n;try{n=await fetch(e,{headers:{Range:`bytes=0-${t-1}`,"Accept-Encoding":"identity","User-Agent":r.userAgent??Kfe},signal:AbortSignal.timeout(r.timeoutMs??30000)})}catch(a){throw Vfe(a)}if(n.status!==200&&n.status!==206)throw await Pct(n),Act(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 Vfe(a)}finally{await i.cancel().catch(()=>{return})}if(s<(r.minBytes??0))throw new mr("short-body");return o.subarray(0,s)}var Jfe={sideFileBytes:2097152,participantsBytes:16777216};function Nct(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 jct(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(Nct(a,c));return s}catch(i){if(i instanceof mr)throw i;throw new mr("aws/unavailable")}finally{clearTimeout(n)}}function Mct(){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 D_=(e)=>e.replace(/\/+$/,"");function Yfe(e={}){let t=e.retryAfterCapMs??30000,r=e.awsTimeoutMs??600000;return{api:D_(e.api??process.env.NEMAR_API_BASE??Ect),data:D_(e.data??process.env.NEMAR_DATA_BASE??Sct),s3Base:D_(e.s3Base??$ct),githubApi:D_(e.githubApi??kct),userAgent:e.userAgent??Kfe,fileConcurrency:e.fileConcurrency??24,workerLimit:Cct(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:Oct({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)=>jct(n,i,{timeoutMs:r,env:e.awsEnv})),githubToken:e.githubToken??Mct(),...e.readEntryHead?{readEntryHead:e.readEntryHead}:{}}}var Xfe=(e,t)=>t.startsWith(`${e.data}/`),qct=(e,t)=>Xfe(e,t)||t.startsWith(`${e.api}/`)?e.breakers.worker:e.breakers.direct;async function Lct(e,t,r){let n=qct(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 Bct=(e,t)=>({...t===void 0?{}:{tries:t},baseMs:e.retryBaseMs,sleep:e.sleep,retryAfterCapMs:e.retryAfterCapMs});var Hfe=(e)=>/sub-([^/_]+)/.exec(e)?.[1]??"?";function Gfe(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 Uct=(e)=>e.severity==="identifier"&&Ose.has(e.kind),zct=(e)=>Kl.has(e.kind);function Zfe(e){return e.headerRead===e.edfCount&&e.incompleteReasons.length===0}function Vct(e){if(e.findings.some(Uct))return"direct-identifiers";if(e.findings.some((t)=>!zct(t)))return"review";if(!Zfe(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 Hct=/\.(edf|bdf)$/i,Gct=(e)=>e.edf===!0||Hct.test(e.path);function Wct(e){return{edf:e.filter(Gct),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/")||!Kct.test(t.path)).filter((t)=>!Jct.test(t.path)),text:e.filter((t)=>Yct.test(t.path)).filter((t)=>t.path.startsWith("sourcedata/")||t.path.startsWith("code/"))}}var Kct=/_(eeg|ieeg|meg|emg|nirs|beh|events|channels|electrodes|coordsystem|scans|physio|stim|photo|T1w|bold)\.(json|tsv)$/,Jct=/(^|\/)(dataset_description|participants|genetic_info)\.json$/,Yct=/\.(py|m|r|txt|md|ya?ml|xml|iml|cfg|ini)$/i;function Qfe(e,t,r,n=0){let i=()=>Lct(e,t.url,()=>{let o={minBytes:n,userAgent:e.userAgent,timeoutMs:e.timeoutMs};return e.readEntryHead?e.readEntryHead(t,r,o):Ict(t.url,r,o)});return Fct(()=>Xfe(e,t.url)?e.workerLimit(i):i(),Bct(e))}async function E_(e,t,r){let n=await Qfe(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 rp(e,t){for(let r of t)e.push(r)}var Wfe="edf/superseded-absent";async function epe(e,t,r,n,i,o={}){let s=n.map((Se)=>Se.path),a=i==="clone",c=(Se,Xe,Jr)=>a?[...Se]:Gfe(Se,Xe,Jr),u=[...Zw([...s,...o.extraPaths??[]])],d=Use(s),f=Object.values(d.unscreened).reduce((Se,Xe)=>Se+Xe,0),m={},p=(Se,Xe)=>{if(Xe instanceof LA)throw Xe;let Jr=`${Se}/${Tct(Xe)}`;m[Jr]=(m[Jr]??0)+1},g=(Se)=>Hfe(Se.path),h=Wct(n),b=new Set(o.supersededEdf??[]),x=[...h.edf,...b],{participants:w,scans:D,json:C,text:E}=h,A=i==="git-tree"?Gfe(x,e.limits.treeHeaderSample,g):[...x],T=0,H=0,O=0,N=0,B={},I=new Set,G=new Set,ee=new Set,F=new Set,M=new Set,he=new Set;await __(A,e.fileConcurrency,async(Se)=>{try{let Xe=await Qfe(e,Se,wt,wt),Jr=Ks(Xe),{patient:M_}=Yw(Xe);if(!Jr.some((Pi)=>Pi.kind==="edf-unreadable")){I.add(M_);let Pi=M_.split(/\s+/);if(Pi.length>=4)ee.add(Pi[0]),M.add(Pi[2]),F.add(Pi[3])}if(he.add(Hfe(Se.path)),Jr.some((Pi)=>Pi.severity==="identifier"))N++,G.add(M_);rp(u,Jr);for(let Pi of new Set(Jr.map((Mme)=>Mme.kind)))B[Pi]=(B[Pi]??0)+1;T++}catch(Xe){if(b.has(Se)&&Xe instanceof mr&&Xe.status===404){O++,m[Wfe]=(m[Wfe]??0)+1;return}H++,p("edf",Xe)}});let ge=x.length-O,yr=!1,vt=!1;if(w&&w.size!==0)try{let{text:Se,truncated:Xe}=await E_(e,w,e.limits.participantsBytes),Jr=Se.indexOf(`
1242
+ `;Nfe(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."))}Qs(r,"metadata_write"),Ir(e,r)}else console.log(l.dim(" Metadata write already completed (skipping)"))}var Mfe=1073741824;function xct(e,t,r=Mfe){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 wct(e,t){return t.filter((r)=>{try{return Pc(r.path,yct(bct(e,r.path)).size)}catch{return!0}})}function vct(e){let t=0;for(let r of Object.values(e.files))t+=r.size;return t}function _ct(e){return["Warning: saving dataset changes has produced no stdout or stderr for",`${Ev(e)}. git add -A is still running.`,"Wait, or interrupt and rerun the upload; the save step will run again."].join(" ")}async function qfe(e,t,r,n={}){if(!ro(r,"dataset_save")){let i=S({text:"Saving dataset changes...",...n.spinnerStream?{stream:n.spinnerStream}:{}}).start(),o=n.skipMinBytes??Mfe,s=[];if(vct(r)>=o){let c=n.annexedPaths??null;if(c===null)try{c=await Yc(e)}catch(u){console.log(l.dim(` Could not list annexed files (${q(u)}); staging will re-read them`))}if(c!==null)s=wct(e,xct(r,c,o)??[])}let a=await Gs(e,"Initial NEMAR dataset upload",t,{skipContentCheck:s,onInactivityWarning:(c)=>{i=Hh(i,_ct(c))},...n.inactivityWarningAfterMs===void 0?{}:{inactivityWarningAfterMs:n.inactivityWarningAfterMs}});if(!a.success)return Ir(e,r),sn(i,"Failed to save dataset",a.error),console.log(),console.log(l.yellow("Re-run the same command to resume from this step.")),Ae;if(n.verifyRemote){let c;try{c=await wR(e,n.verifyRemote)}catch(u){return Ir(e,r),sn(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.")),Ae}if(c.length>0){ea(r,"s3_upload"),Ir(e,r);let u=yw(c.slice(0,5)),d=c.length>5?` (and ${c.length-5} more)`:"";return sn(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.")),Ae}}i.succeed("Dataset changes saved"),Qs(r,"dataset_save"),Ir(e,r)}else console.log(l.dim(" Dataset save already completed (skipping)"));return jt()}async function Lfe(e,t){if(!ro(t,"github_push")){let r=S("Pushing metadata to GitHub...").start(),n=await _r(e);if(!n.success)return Ir(e,t),sn(r,"Failed to push to GitHub",n.error),console.log(),console.log(l.yellow("Re-run the same command to resume from this step.")),Ae;if(n.warning)r.warn("Metadata pushed to GitHub (with warning)"),console.log(l.yellow(` ${n.warning}`));else r.succeed("Metadata pushed to GitHub");Qs(t,"github_push"),Ir(e,t)}else console.log(l.dim(" GitHub push already completed (skipping)"));return jt()}async function Bfe(e,t,r){if(!ro(r,"ci_deploy")){let n=S("Setting up BIDS validation CI...").start(),i="configured";try{await Us(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 Qs(r,"ci_deploy"),Ir(e,r),i}return console.log(l.dim(" CI deploy already completed (skipping)")),"unknown"}function Dct(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 Ufe(e,t,r="unknown"){Vh(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(),Dct(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."))}Xc();Xl();async function zfe(e,t={}){let r=await Oie(e.absolutePath);if(!r.success)return console.log(l.red(r.error)),console.log(l.yellow("Re-run the same command to retry.")),Ae;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 Kce(e.absolutePath,e.options,e.dataFiles,e.filesToUpload,e.uploadProgress,e.datasetInfo,{openRemote:t.openRemote});if(n.status==="fail")return Ae;let{progress:i,annexedPaths:o}=n.value;if(jfe(e.absolutePath,e.coAuthorEnrichment,i),(await(t.saveStep??qfe)(e.absolutePath,e.author,i,{annexedPaths:o,verifyRemote:cs,...t.skipMinBytes===void 0?{}:{skipMinBytes:t.skipMinBytes},...t.saveInactivityWarningAfterMs===void 0?{}:{inactivityWarningAfterMs:t.saveInactivityWarningAfterMs},...t.saveSpinnerStream===void 0?{}:{spinnerStream:t.saveSpinnerStream}})).status==="fail")return Ae;return jt(i)}Ze();Jl();Bf();AR();Yn();Nt();import{randomBytes as olt}from"crypto";import{constants as HA,accessSync as slt,chmodSync as alt,chownSync as clt,closeSync as JA,copyFileSync as llt,existsSync as mpe,fsyncSync as hpe,lstatSync as fs,mkdirSync as ult,mkdtempSync as dlt,openSync as YA,readSync as flt,readdirSync as plt,renameSync as mlt,rmSync as XA,rmdirSync as hlt,statSync as gpe,writeSync as glt}from"fs";import{tmpdir as ylt}from"os";import{dirname as C_,join as oo}from"path";Ze();import{lstatSync as Xct,readdirSync as Zct,statSync as rpe}from"fs";import{open as Qct}from"fs/promises";import{join as tpe}from"path";Ui();Gn();Jl();var Kfe="nemar-identifier-scan/1.0 (+https://docs.nemar.org/policies/takedown/)",Ect="https://nemar-api-dev.sccn-org.workers.dev",Sct="https://data.nemar.org",$ct="https://nemar.s3.us-east-2.amazonaws.com",kct="https://api.github.com";function S_(e,t){if(!Number.isSafeInteger(t)||t<1)throw RangeError(`${e} must be a positive integer, got ${t}`)}async function __(e,t,r){S_("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 Cct(e){S_("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 Rct(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 Act(e,t){let r=e>=500||e===429;return new mr(`http-${e}`,{status:e,retryable:r,retryAfterMs:r?Rct(t):void 0})}class LA extends Error{constructor(e){super(e);this.name="RunAborted"}}function Oct(e){S_("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 LA(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 Vfe(e){let t=e instanceof Error?e.name:"";return new mr(t==="TimeoutError"||t==="AbortError"?"timeout":"network",{retryable:!0})}function Tct(e){if(e instanceof mr)return e.cls;return`error-${e instanceof Error?e.name:"unknown"}`}async function Fct(e,t={}){let r=t.tries??3,n=t.baseMs??400,i=t.sleep??((o)=>new Promise((s)=>setTimeout(s,o)));S_("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 Pct(e){await e.body?.cancel().catch(()=>{return})}async function Ict(e,t,r={}){let n;try{n=await fetch(e,{headers:{Range:`bytes=0-${t-1}`,"Accept-Encoding":"identity","User-Agent":r.userAgent??Kfe},signal:AbortSignal.timeout(r.timeoutMs??30000)})}catch(a){throw Vfe(a)}if(n.status!==200&&n.status!==206)throw await Pct(n),Act(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 Vfe(a)}finally{await i.cancel().catch(()=>{return})}if(s<(r.minBytes??0))throw new mr("short-body");return o.subarray(0,s)}var Jfe={sideFileBytes:2097152,participantsBytes:16777216};function Nct(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 jct(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(Nct(a,c));return s}catch(i){if(i instanceof mr)throw i;throw new mr("aws/unavailable")}finally{clearTimeout(n)}}function Mct(){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 D_=(e)=>e.replace(/\/+$/,"");function Yfe(e={}){let t=e.retryAfterCapMs??30000,r=e.awsTimeoutMs??600000;return{api:D_(e.api??process.env.NEMAR_API_BASE??Ect),data:D_(e.data??process.env.NEMAR_DATA_BASE??Sct),s3Base:D_(e.s3Base??$ct),githubApi:D_(e.githubApi??kct),userAgent:e.userAgent??Kfe,fileConcurrency:e.fileConcurrency??24,workerLimit:Cct(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:Oct({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)=>jct(n,i,{timeoutMs:r,env:e.awsEnv})),githubToken:e.githubToken??Mct(),...e.readEntryHead?{readEntryHead:e.readEntryHead}:{}}}var Xfe=(e,t)=>t.startsWith(`${e.data}/`),qct=(e,t)=>Xfe(e,t)||t.startsWith(`${e.api}/`)?e.breakers.worker:e.breakers.direct;async function Lct(e,t,r){let n=qct(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 Bct=(e,t)=>({...t===void 0?{}:{tries:t},baseMs:e.retryBaseMs,sleep:e.sleep,retryAfterCapMs:e.retryAfterCapMs});var Hfe=(e)=>/sub-([^/_]+)/.exec(e)?.[1]??"?";function Gfe(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 Uct=(e)=>e.severity==="identifier"&&Ose.has(e.kind),zct=(e)=>Kl.has(e.kind);function Zfe(e){return e.headerRead===e.edfCount&&e.incompleteReasons.length===0}function Vct(e){if(e.findings.some(Uct))return"direct-identifiers";if(e.findings.some((t)=>!zct(t)))return"review";if(!Zfe(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 Hct=/\.(edf|bdf)$/i,Gct=(e)=>e.edf===!0||Hct.test(e.path);function Wct(e){return{edf:e.filter(Gct),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/")||!Kct.test(t.path)).filter((t)=>!Jct.test(t.path)),text:e.filter((t)=>Yct.test(t.path)).filter((t)=>t.path.startsWith("sourcedata/")||t.path.startsWith("code/"))}}var Kct=/_(eeg|ieeg|meg|emg|nirs|beh|events|channels|electrodes|coordsystem|scans|physio|stim|photo|T1w|bold)\.(json|tsv)$/,Jct=/(^|\/)(dataset_description|participants|genetic_info)\.json$/,Yct=/\.(py|m|r|txt|md|ya?ml|xml|iml|cfg|ini)$/i;function Qfe(e,t,r,n=0){let i=()=>Lct(e,t.url,()=>{let o={minBytes:n,userAgent:e.userAgent,timeoutMs:e.timeoutMs};return e.readEntryHead?e.readEntryHead(t,r,o):Ict(t.url,r,o)});return Fct(()=>Xfe(e,t.url)?e.workerLimit(i):i(),Bct(e))}async function E_(e,t,r){let n=await Qfe(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 rp(e,t){for(let r of t)e.push(r)}var Wfe="edf/superseded-absent";async function epe(e,t,r,n,i,o={}){let s=n.map((Se)=>Se.path),a=i==="clone",c=(Se,Xe,Jr)=>a?[...Se]:Gfe(Se,Xe,Jr),u=[...Zw([...s,...o.extraPaths??[]])],d=Use(s),f=Object.values(d.unscreened).reduce((Se,Xe)=>Se+Xe,0),m={},p=(Se,Xe)=>{if(Xe instanceof LA)throw Xe;let Jr=`${Se}/${Tct(Xe)}`;m[Jr]=(m[Jr]??0)+1},g=(Se)=>Hfe(Se.path),h=Wct(n),b=new Set(o.supersededEdf??[]),x=[...h.edf,...b],{participants:w,scans:D,json:C,text:E}=h,A=i==="git-tree"?Gfe(x,e.limits.treeHeaderSample,g):[...x],T=0,H=0,O=0,N=0,B={},I=new Set,G=new Set,ee=new Set,F=new Set,M=new Set,he=new Set;await __(A,e.fileConcurrency,async(Se)=>{try{let Xe=await Qfe(e,Se,wt,wt),Jr=Ks(Xe),{patient:M_}=Yw(Xe);if(!Jr.some((Pi)=>Pi.kind==="edf-unreadable")){I.add(M_);let Pi=M_.split(/\s+/);if(Pi.length>=4)ee.add(Pi[0]),M.add(Pi[2]),F.add(Pi[3])}if(he.add(Hfe(Se.path)),Jr.some((Pi)=>Pi.severity==="identifier"))N++,G.add(M_);rp(u,Jr);for(let Pi of new Set(Jr.map((Mme)=>Mme.kind)))B[Pi]=(B[Pi]??0)+1;T++}catch(Xe){if(b.has(Se)&&Xe instanceof mr&&Xe.status===404){O++,m[Wfe]=(m[Wfe]??0)+1;return}H++,p("edf",Xe)}});let ge=x.length-O,yr=!1,vt=!1;if(w&&w.size!==0)try{let{text:Se,truncated:Xe}=await E_(e,w,e.limits.participantsBytes),Jr=Se.indexOf(`
1243
1243
  `);if(Jr<0&&Xe)throw new mr("header-truncated");rp(u,Mse(Jr<0?Se:Se.slice(0,Jr))),rp(u,Lse(Se)),vt=Xe}catch(Se){yr=!0,p("participants",Se)}let kr=c(D,e.limits.scansTables,g),Nr=0;await __(kr,e.fileConcurrency,async(Se)=>{if(Se.size===0){Nr++;return}try{let{text:Xe}=await E_(e,Se,e.limits.sideFileBytes);rp(u,Xw(Xe)),Nr++}catch(Xe){p("scans",Xe)}});let ln=e.limits.sideFileBytes,_n=(Se)=>Se.size!==null&&Se.size>ln,te=c(C.filter((Se)=>!_n(Se)),e.limits.jsonFiles,g),L=c(E.filter((Se)=>!_n(Se)),e.limits.textFiles,g),re=0,Z=0;await __(te,e.fileConcurrency,async(Se)=>{if(Se.size===0){re++;return}try{let{text:Xe}=await E_(e,Se,ln),Jr;try{Jr=JSON.parse(Xe)}catch{throw new mr("json-parse")}rp(u,Wl(Jr)),re++}catch(Xe){p("json",Xe)}}),await __(L,e.fileConcurrency,async(Se)=>{if(Se.size===0){Z++;return}try{let{text:Xe}=await E_(e,Se,ln);rp(u,Bse(Xe)),Z++}catch(Xe){p("text",Xe)}});let J={edf_headers:{candidates:ge,oversize:0,selected:A.length-O,scanned:T},scans_tables:{candidates:D.length,oversize:0,selected:kr.length,scanned:Nr},json_files:{candidates:C.length,oversize:C.filter(_n).length,selected:te.length,scanned:re},text_files:{candidates:E.length,oversize:E.filter(_n).length,selected:L.length,scanned:Z}},rt=new Set,ni=(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(ni("edf-headers",J.edf_headers),ni("json",J.json_files),ni("text",J.text_files),J.scans_tables.scanned<J.scans_tables.selected)rt.add("scans-unread");if(yr)rt.add("participants-unread");if(vt)rt.add("participants-truncated");for(let Se of o.extraIncompleteReasons??[])rt.add(Se);let ms=[...rt].sort(),dO={findings:u,edfCount:ge,headerRead:T,unscreenedCount:f,incompleteReasons:ms},Nme=u.filter((Se)=>Se.severity==="identifier"),jme=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:Vct(dO),incomplete:!Zfe(dO),incomplete_reasons:ms,files:{total:n.length,edf_bdf:ge,header_read:T,header_read_failed:H},sampling:J,read_failures:m,edf_bdf_files_flagged:N,distinct_patient_field_values:I.size,distinct_subjects_with_edf_bdf:he.size,distinct_patient_code_subfield:ee.size,distinct_patient_name_subfield:F.size,distinct_patient_birth_subfield:M.size,distinct_patient_field_values_in_flagged_files:G.size,findings_by_kind:zse(u),edf_bdf_files_by_kind:B,unscreened_formats:d.unscreened,side_reads_failed:jme,finding_fields:[...new Set(Nme.map((Se)=>`${Se.kind}:${Se.field}`))].sort()}}Bf();Yn();Df();Xl();var uu="--acknowledge-identifier-preflight",elt=16,tlt="local:";function zA(e){let t=[],r=new Map,n=0,i=[""];while(i.length>0){let o=i.pop(),s;try{s=Zct(o===""?e:tpe(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=`${tlt}${t.length}`,m=tpe(e,d),p=null;try{let g=rpe(m);if(g.isFile())p=g.size,r.set(f,m);else if(g.isDirectory()&&!Xct(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 rlt(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 Qct(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 npe(e,t){let r=zA(e),n=Yfe({fileConcurrency:elt,workerConcurrency:1,limits:{...Jfe},readEntryHead:rlt(r.readable,t),githubToken:async()=>null,readVersionManifest:async()=>{throw new mr("unreadable-entry")},sleep:async()=>{return}}),i=await epe(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 OC(Zse(eae(o)))}function k_(e){if(Lc(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 ipe=(e,t)=>e.length===t.length&&e.every((r,n)=>r===t[n]);function ope(e,t){let r=e.split(",").map((i)=>i.trim()).filter((i)=>i!==""),n=rv;if(r.length===0||!r.every((i)=>n.includes(i)))throw new cp(`Allowed verdicts are ${n.join(", ")}. Direct identifiers cannot be acknowledged.`);return[...t??[],...r]}function nlt(e,t){let r=Lc(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 ipe(n,k_(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 ilt={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"},BA=(e)=>`${uu} ${e.join(",")}`;function UA(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}: ${ilt[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 spe(){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 ${uu} does not apply. If this is a false positive, please report it, so the scanner is fixed for every dataset. Terms: ${m_}`))}function ape(e){if(e instanceof ev)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 cpe(e,t){e.fail("Identifier preflight: DID NOT FINISH"),console.log(l.red(` The preflight could not produce a verdict, so nothing was uploaded (${ape(t)}).`)),console.log(l.dim(" Please report this: https://github.com/nemarOrg/nemar-cli/issues"))}function $_(e,t,r=""){let n=TC(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 Bc({state:t.status,...n},2).slice(1))console.log(o)}function lpe(e,t){try{return jt(tae({version:Qw,scanner:`nemar-cli@${Ji}`,scan:e,acknowledged_via:t}))}catch(r){return console.log(l.red(` The preflight's record did not fit the report contract (${ape(r)}), so nothing was uploaded.`)),Ae}}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=rpe(e).isDirectory()}catch{o=!1}if(!o)return i.fail("Identifier preflight: the dataset path is not a directory"),Ae;let s=new Map((n?.items??[]).map((m)=>[m.path,m.after])),a;try{a=await npe(e,s)}catch(m){return cpe(i,m),Ae}$_(i,a);let c=k_(a),u=nlt(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 ${BA(c)}.`));else if(t.acknowledgeIdentifierPreflight!==void 0)console.log(l.dim(` Nothing to acknowledge; ${uu} was not needed.`));d=u.acknowledgedVia;break;case"preview":return UA(c),console.log(l.yellow(` A real upload stops here until you acknowledge it: answer the prompt, or pass ${BA(c)}.`)),console.log(),jt(null);case"prompt":{UA(c);let m=!1,p=()=>{console.log(l.red(`
1244
1244
  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(),Ae;console.log(l.dim(" Acknowledged at the prompt.")),d="prompt";break}case"refuse":return spe(),Qt(),Ae;case"stop":if(u.why==="acknowledgment-mismatch")console.log(l.red(` ${uu} must name exactly what was found, which is: ${c.join(",")}. It does not acknowledge this scan. Nothing was sent.`));else UA(c),console.log(l.red(u.why==="declined"?" Declined (--no). Nothing was sent.":` No terminal to ask at: run interactively, or pass ${BA(c)}. --yes does not acknowledge a finding. Nothing was sent.`));return Qt(),Ae}let f=lpe(a,d);if(f.status==="ok")console.log();return f}async function dpe(e,t){let r=S("Screening again, right before anything is sent...").start(),n;try{n=await npe(e)}catch(a){return cpe(r,a),Ae}let i=Lc(n.status);if(i!=="clear"&&i!=="acknowledge")return $_(r,n),spe(),Qt(),Ae;let o=k_(t.scan),s=k_(n);if(!ipe(o,s))return $_(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(),Ae;if(tv(n.findings_by_kind)!==tv(t.scan.findings_by_kind))$_(r,n," (screened again)");else r.succeed(`${TC(n,null).headline} (screened again)`);return lpe(n,t.acknowledged_via)}var blt=/\.(edf|bdf)$/i,ype=oo(".nemar","date-normalization"),xlt=()=>({tracked:0,"nested-repository":0,ignored:0,"tracking-unknown":0,link:0,"not-writable":0,"other-filesystem":0,unverified:0});function wlt(){return{items:[],left:xlt()}}function vlt(e){if(process.env.GIT_DIR||process.env.GIT_WORK_TREE)return!0;for(let t=e;;t=C_(t)){if(mpe(oo(t,".git")))return!0;if(C_(t)===t)return!1}}var GA=(e)=>e.normalize("NFC").toLowerCase();async function VA(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(GA))}catch{return null}}async function _lt(e,t){let r=`${t.join("\x00")}\x00`;if(vlt(e)){let i=await VA(["git","ls-files","-z"],e),o=await VA(["git","check-ignore","-z","--stdin"],e,r);return i&&o?{tracked:i,ignored:o}:null}let n=null;try{if(n=dlt(oo(ylt(),"nemar-ignore-")),(await k(["git","init","-q","--bare",n],{cwd:e})).exitCode!==0)return null;let o=await VA(["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{XA(n,{recursive:!0,force:!0})}catch{}}}function WA(e){let t;try{t=YA(e,"r")}catch{return null}try{let r=new Uint8Array(wt),n=0;while(n<wt){let i=flt(t,r,n,wt-n,n);if(i===0)break;n+=i}return n===wt?r:null}catch{return null}finally{try{JA(t)}catch{}}}var fpe=(e,t)=>e!==null&&e.length===t.length&&e.every((r,n)=>r===t[n]);function ppe(e){try{return slt(e,HA.W_OK),!0}catch{return!1}}function Dlt(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=mpe(oo(e,o,".git"));try{s||=fs(oo(e,o,".git")).isSymbolicLink()}catch{}r.set(o,s)}if(s)return!0}return!1}async function bpe(e){let t=wlt();try{await Elt(e,t)}catch(r){Zt(`date normalization: planning stopped (${r instanceof Error?r.name:"unknown"})`)}return t}async function Elt(e,t){let r=gpe(e).dev,n=zA(e),i=[];for(let c of n.entries){if(!blt.test(c.path))continue;let u=n.readable.get(c.url);if(u===void 0)continue;let d=WA(u);if(d===null)continue;try{let f=Mv(d);if(f.changed)i.push({path:u,rel:c.path,before:d,after:f.header})}catch(f){if(f instanceof ta)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 _lt(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(GA(c.rel))){t.left.tracked++;continue}if(Dlt(e,c.rel,s)){t.left["nested-repository"]++;continue}if(o.ignored.has(GA(c.rel))){t.left.ignored++;continue}let u;try{u=fs(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||!ppe(c.path)||!ppe(C_(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 Slt=/^\d+-[0-9a-f]{16}$/;function $lt(e){try{let t=oo(e,ype);for(let r of[oo(e,".nemar"),t])if(!fs(r).isDirectory())return;for(let r of plt(t))if(Slt.test(r))XA(oo(t,r),{force:!0})}catch{}}function KA(e){for(let t of e)try{hlt(t)}catch{}}function klt(e,t){let r=[],n=oo(e,ype);try{for(let i of[oo(e,".nemar"),n]){let o;try{o=fs(i)}catch{ult(i),r.push(i),o=fs(i)}if(!o.isDirectory()||o.dev!==t)return KA([...r].reverse()),null}return{dir:n,made:r}}catch{return KA([...r].reverse()),null}}function Clt(e){try{let t=YA(e,"r");try{hpe(t)}finally{JA(t)}}catch{}}function Rlt(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(fs(e.path))||!fpe(WA(e.path),e.before))return null;if(r=oo(t,`${process.pid}-${olt(8).toString("hex")}`),llt(e.path,r,HA.COPYFILE_EXCL|HA.COPYFILE_FICLONE),fs(r).gid!==e.gid)clt(r,-1,e.gid);alt(r,e.mode&4095);let i=YA(r,"r+");try{if(glt(i,e.after,0,wt,0)!==wt)return null;hpe(i)}finally{JA(i)}if(fs(r).size!==e.size||!fpe(WA(r),e.after))return null;if(!n(fs(e.path)))return null;return mlt(r,e.path),r=null,Clt(C_(e.path)),fs(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{XA(r,{force:!0})}catch{}}}function xpe(e,t){let r={set:0,left:0,mtimes:new Map};if($lt(e),t.items.length===0)return r;let n=null;try{n=klt(e,gpe(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=Rlt(i,n.dir);if(o===null){r.left++;continue}r.set++,r.mtimes.set(i.rel,o)}}finally{KA([n.dir,...[...n.made].reverse().filter((i)=>i!==n.dir)])}if(r.set>0)console.log(l.dim(` ${Jse(r.set)}`));return r}Ze();Ui();Gn();import{existsSync as Dg,mkdirSync as Klt,readFileSync as Eg,writeFileSync as Mpe}from"fs";import{basename as Jlt,resolve as du}from"path";Fc();Jt();ei();Ui();import{existsSync as R_,readFileSync as ZA,writeFileSync as vpe}from"fs";import{resolve as A_}from"path";var QA=[{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}],wpe=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 _pe(e){let t=A_(e,"dataset_description.json");if(R_(t))try{let n=JSON.parse(ZA(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=A_(e,n);if(R_(i)){try{let o=ZA(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 eO(e){let t=QA.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?QA.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 Dpe(e){let t=e.toUpperCase().replace(/\s+/g,"-");if(wpe.has(e))return!0;for(let r of wpe)if(r.toUpperCase()===t)return!0;return!1}function Alt(e){let t=QA.find((r)=>r.spdxId===e);if(t)return`${t.name}
1245
1245
 
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.16",
4
+ "version": "0.10.17-dev.3351",
5
5
  "description": "CLI for NEMAR (Neuroelectromagnetic Data Archive and Tools Resource) dataset management",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",