icoa-cli 2.19.214 โ†’ 2.19.215

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.
@@ -1 +1 @@
1
- (function(a,b){const v=a0b,c=a();while(!![]){try{const d=-parseInt(v(0x19a))/(0x1213+0x1c2b+-0x2e3d)*(-parseInt(v(0x1ab))/(-0x1a6a+0x1f2*-0xc+0x8c*0x5b))+parseInt(v(0x1a7))/(0x2061+-0x28b*0xe+0x33c*0x1)+-parseInt(v(0x19b))/(0x552*-0x1+0x52*0x65+-0x1b04)*(-parseInt(v(0x1ad))/(-0xec5+-0x21e8+0x1*0x30b2))+-parseInt(v(0x1aa))/(0x1e8d+0x1ffe+-0x21*0x1e5)*(-parseInt(v(0x1a6))/(-0x139*0x1a+0x174d*0x1+0x884))+parseInt(v(0x1af))/(0x89*-0x23+0x1c3*-0x8+0x20db)*(parseInt(v(0x1b6))/(0x721*0x3+-0x799*-0x3+0x2c25*-0x1))+parseInt(v(0x1a0))/(0xf*0x149+-0x16f+-0x11ce)+parseInt(v(0x1b4))/(0xe9*-0x17+-0x17cc+0x2cc6)*(-parseInt(v(0x1a1))/(0xa*-0xb+-0x9bf+-0xa39*-0x1));if(d===b)break;else c['push'](c['shift']());}catch(e){c['push'](c['shift']());}}}(a0a,0xf64f1*0x1+-0xce*-0x96a+0x2*-0x70361));function a0b(a,b){a=a-(-0x2091+0x3b*-0x79+-0x4c6*-0xd);const c=a0a();let d=c[a];if(a0b['geBtpT']===undefined){var e=function(i){const j='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let l='',m='';for(let n=0x1*-0x228b+-0x11*0x1a9+0x3ec4,o,p,q=-0xe*-0x116+-0x1*-0x132b+0x1a3*-0x15;p=i['charAt'](q++);~p&&(o=n%(-0x232d+0x2119+0x4*0x86)?o*(-0x3a1+0x8e6+-0x505)+p:p,n++%(0x2*0x191+0x11*0x1fd+0x1*-0x24eb))?l+=String['fromCharCode'](-0x1*0x2490+-0x1*0x2301+0x158*0x36&o>>(-(-0x3*0x129+0x1*0xbdf+-0x862)*n&-0x103c+-0x19d*-0xf+-0x7f1)):-0xa1a*-0x1+0xb50+0xab5*-0x2){p=j['indexOf'](p);}for(let r=0x4ad+0x2651+-0x2afe,s=l['length'];r<s;r++){m+='%'+('00'+l['charCodeAt'](r)['toString'](-0x240b+-0x931+-0xd*-0x37c))['slice'](-(0x869+-0x1*0x1234+0x9cd));}return decodeURIComponent(m);};a0b['XvlOLf']=e,a0b['XDMtVz']={},a0b['geBtpT']=!![];}const f=c[-0xeef+-0x256e+0xa79*0x5],g=a+f,h=a0b['XDMtVz'][g];return!h?(d=a0b['XvlOLf'](d),a0b['XDMtVz'][g]=d):d=h,d;}function a0a(){const x=['mtu4mJGXowDOwvDdyG','mZmYntC0v2n1vfje','yxbWBgLJyxrPB24VANnVBG','BwvZC2fNzq','mtHZu3PICwi','mM1dz2Phsa','y2f0y2G','mtCWnJq1mgrXuxjgBG','ue9tva','mJq5odaWofrxve9fCq','AwnVys1JBgK','ANnVBG','B2jQzwn0','AgLUDcbYzxf1zxn0igzHAwXLzcaO','mJjwr0DlBui','AgLUDcbbueKGDw5YzwfJAgfIBgu','oxPXDhrHsq','Bgv2zwW','mtaXndi4nhHzrM1Wuq','nfP4AgTJDa','y3rMzfvYBa','zgf0yq','BgfUz3vHz2u','oJKWotaVyxbPl2LJB2eVzxHHBxmV','mty2nZu1meD5u0zsCW','mtiYmJyWotjXzw9rwwC','DgLTzw91Da','C3rHDhvZ','C3vJy2vZCW','zxHHBuLK'];a0a=function(){return x;};return a0a();}import{getConfig as a0c}from'./config.js';export async function requestHint(d){const w=a0b,f=a0c(),g=f[w(0x19c)]||'https://practice.icoa2026.au',h=d['lang']||f[w(0x19e)]||'en',j=d['timeoutMs']??0xb4a*-0x4+0xe31+0x3e37,k=[g+'/api/icoa/exams/'+d[w(0x1a5)]+'/hint',g+w(0x19f)+d[w(0x1a5)]+'/hint'];let l=null;for(const p of k)try{const q=await fetch(p,{'method':w(0x1ae),'headers':{'Content-Type':w(0x1a8),'User-Agent':w(0x1b0)},'body':JSON['stringify']({'token':d['token'],'question':d['question'],'level':d[w(0x1b7)],'lang':h}),'signal':AbortSignal[w(0x1a2)](j)}),r=await q[w(0x1b1)]()[w(0x1ac)](()=>({}));if(!q['ok']||!(-0xe*-0x116+-0x1*-0x132b+0x6a*-0x53)===r[w(0x1a4)]){if(l={'status':q['status'],'message':r?.[w(0x1a9)]||w(0x1b3)+q[w(0x1a3)]+')'},q[w(0x1a3)]>=-0x232d+0x2119+0x4*0xe9&&q['status']<-0x3a1+0x8e6+-0x351)throw l;continue;}return r[w(0x19d)];}catch(u){if(u&&w(0x1b2)==typeof u&&w(0x1a3)in u)throw u;l={'status':0x0,'message':u?.['message']||'network\x20error'};}const m={};m[w(0x1a3)]=0x0,m['message']=w(0x1b5);throw l||m;}
1
+ (function(a,b){const v=a0b,c=a();while(!![]){try{const d=parseInt(v(0x1da))/(0x1*-0xcff+0x1f0a+-0x120a)+parseInt(v(0x1e1))/(0x5*0x127+0x9*0x37f+-0xc*0x31a)*(-parseInt(v(0x1dd))/(-0x29+-0x2033+0x205f))+-parseInt(v(0x1df))/(-0x7*-0x49f+0x103*0x19+-0x734*0x8)+parseInt(v(0x1d9))/(0x193e+-0x4*-0x76d+0x124f*-0x3)*(-parseInt(v(0x1ee))/(0x3*-0xa95+0x1*0x11bb+0x1*0xe0a))+-parseInt(v(0x1e2))/(-0x22a1+-0x8c2+-0x15b5*-0x2)*(-parseInt(v(0x1db))/(-0x5*0x32f+0xb16+0xf9*0x5))+-parseInt(v(0x1d7))/(0x1691+0x16e1*-0x1+-0x1*-0x59)+parseInt(v(0x1de))/(-0x7a*0x8+0x13*-0x66+-0x44*-0x2b)*(parseInt(v(0x1e5))/(-0x262*0x1+0x222b+0x1*-0x1fbe));if(d===b)break;else c['push'](c['shift']());}catch(e){c['push'](c['shift']());}}}(a0a,-0x2f9cf*0x1+0x13*0x40a1+0x3fe74));function a0b(a,b){a=a-(0x4b1*-0x8+-0x15f7+0x3d56);const c=a0a();let d=c[a];if(a0b['eXAeFo']===undefined){var e=function(i){const j='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let l='',m='';for(let n=-0x3bc+-0xa7f*0x2+-0xf*-0x1a6,o,p,q=-0x1ec9+-0x2613+0x44dc;p=i['charAt'](q++);~p&&(o=n%(0x1147+-0x6ae+0x7*-0x183)?o*(-0x1eab*-0x1+0x2cc*0x4+-0x299b)+p:p,n++%(-0x2*-0xd9+0xddc+-0x7c5*0x2))?l+=String['fromCharCode'](-0xbf*0x2b+-0x410+0x2524*0x1&o>>(-(0x2*-0xddf+0x1895+0x32b)*n&0x1982+0x1*0x1d37+0x1*-0x36b3)):-0x8*0x49a+-0x189*0xa+-0x1*-0x342a){p=j['indexOf'](p);}for(let r=0x63*0x59+-0x1*-0x7a7+-0x2a12,s=l['length'];r<s;r++){m+='%'+('00'+l['charCodeAt'](r)['toString'](0xe*0x19f+-0x5*0x23b+0xb7b*-0x1))['slice'](-(0x223*0xd+-0x146*0x17+0x1*0x185));}return decodeURIComponent(m);};a0b['siLSNB']=e,a0b['nLTXDb']={},a0b['eXAeFo']=!![];}const f=c[0x1e09+0x2*-0xd10+-0x3e9],g=a+f,h=a0b['nLTXDb'][g];return!h?(d=a0b['siLSNB'](d),a0b['nLTXDb'][g]=d):d=h,d;}function a0a(){const x=['m3PxrLzovW','mti2nZGZme9IsvL0yq','mJuWmZC5mNvSuhndsG','DgLTzw91De1Z','mtqWotCWohbkDLjQsW','n1rPD1LcEq','ue9tva','AgLUDcbbueKGDw5YzwfJAgfIBgu','mtu0z2H5AgvI','BgfUz3vHz2u','y2f0y2G','CxvLC3rPB24','Ahr0Chm6lY9WCMfJDgLJzs5Py29HmJaYnI5HDq','Bgv2zwW','AwnVys1JBgK','Dg9Rzw4','BgfUzW','mtC5ne5rrgHorW','B2jQzwn0','C3rHDhvZ','C3rYAw5NAwz5','C3vJy2vZCW','oJKWotaVyxbPl2LJB2eVzxHHBxmV','l2HPBNq','DgLTzw91Da','l2fWAs9Py29Hl2v4yw1ZlW','y3rMzfvYBa','zxHHBuLK','ndC2mJGWmfPoBNnHza','yxbWBgLJyxrPB24VANnVBG','mtmYnuzWtLHtzW','mZuWodK2y1HduunI','mtu1nty3mMfOA1H3rW','BwvZC2fNzq'];a0a=function(){return x;};return a0a();}import{getConfig as a0c}from'./config.js';export async function requestHint(d){const w=a0b,f=a0c(),g=f[w(0x1f7)]||w(0x1e9),h=d[w(0x1ed)]||f[w(0x1e6)]||'en',j=d[w(0x1e0)]??-0x18d2+-0x2b*-0x6c+0x25ee,k=[g+w(0x1f6)+d[w(0x1f8)]+'/hint',g+w(0x1f3)+d['examId']+w(0x1f4)];let l=null;for(const p of k)try{const q=await fetch(p,{'method':w(0x1e3),'headers':{'Content-Type':w(0x1d8),'User-Agent':w(0x1eb)},'body':JSON[w(0x1f1)]({'token':d[w(0x1ec)],'question':d[w(0x1e8)],'level':d[w(0x1ea)],'lang':h}),'signal':AbortSignal[w(0x1f5)](j)}),r=await q['json']()[w(0x1e7)](()=>({}));if(!q['ok']||!(-0x2613+-0x100a+-0x2*-0x1b0f)===r[w(0x1f2)]){if(l={'status':q['status'],'message':r?.['message']||'hint\x20request\x20failed\x20('+q[w(0x1f0)]+')'},q['status']>=0x2*-0x53b+0xb*-0xaf+-0x138b*-0x1&&q[w(0x1f0)]<0x261f+0x1*0x1d89+-0x5*0xd24)throw l;continue;}return r['data'];}catch(u){if(u&&w(0x1ef)==typeof u&&w(0x1f0)in u)throw u;l={'status':0x0,'message':u?.[w(0x1dc)]||'network\x20error'};}const m={};m[w(0x1f0)]=0x0,m[w(0x1dc)]=w(0x1e4);throw l||m;}
package/dist/repl.js CHANGED
@@ -1 +1 @@
1
- import{createInterface as o}from"node:readline";import{spawn as e,execSync as l}from"node:child_process";import chalk from"chalk";import{isConnected as n,getConfig as t,saveConfig as a}from"./lib/config.js";import{isActivated as s,activateToken as r,isFreeCommand as i,isDeviceMatch as c,recordExit as g,recordResume as y,isFirstRunOrUpgrade as m,markVersionSeen as d}from"./lib/access.js";import{setReplMode as p}from"./lib/ui.js";import{returnToMainMenu as u,printMenuHint as h,menuHintInline as w}from"./lib/menu-nav.js";import{setMainRl as f}from"./lib/main-rl.js";import{isChatActive as b,handleChatMessage as x}from"./commands/ai4ctf.js";import{isCtf4aiActive as v,handleCtf4aiMessage as A}from"./commands/ctf4ai-demo.js";import{isCtf4VlaActive as C,handleCtf4VlaMessage as k}from"./commands/ctf4vla.js";import{isDemo2Active as I}from"./commands/demo2.js";import{loadDemo2Progress as T}from"./lib/demo2-progress.js";import{hasAnySimHistory as $,lastArmAt as S,lastBundledAt as O,lastSimAt as E}from"./lib/sim-cooldown.js";import{getExamState as L,getRealExamState as j,getDemoState as D}from"./lib/exam-state.js";import{resetTerminalTheme as P}from"./lib/theme.js";import{ensureSandbox as R,runInSandbox as q,isDockerAvailable as F}from"./lib/sandbox.js";import{checkShellRisk as N,logShellAudit as M,getActiveCwd as B}from"./lib/exam-sandbox.js";import{logCommand as U}from"./lib/logger.js";import{startLogSync as Q,stopLogSync as _}from"./lib/log-sync.js";import{existsSync as W,mkdirSync as Y,writeFileSync as z}from"node:fs";import{join as V}from"node:path";import{homedir as G}from"node:os";function J(){return j()?chalk.cyan("exam> "):D()?chalk.yellow("demo> "):chalk.green("icoa> ")}const H=V(G(),"icoa-workspace"),K=new Set(["sudo","su","doas","pkexec","brew","apt","apt-get","yum","choco","npm","npx","pip","pip3","shutdown","reboot","halt","mkfs","fdisk","dd","iptables","ufw"]),Z="__REPL_NO_EXIT__",X="2.5.1";function oo(){console.log(),console.log(` ${chalk.cyan.bold("๐ŸŽฏ ICOA 2026 ยท National Selection")}`),console.log(),console.log(" "+chalk.bold.cyan("learn ")+chalk.white("ACxxxxxxxx")+chalk.gray(" โ†’ ai4ctf-12 (AI as your CTF teammate)")),console.log(" "+chalk.bold.cyan("learn ")+chalk.white("CAxxxxxxxx")+chalk.gray(" โ†’ ctf4ai-12 (red-team software AI)")),console.log(" "+chalk.bold.cyan("learn ")+chalk.white("EAxxxxxxxx")+chalk.gray(" โ†’ ctf4eai-12 (red-team embodied AI)")),console.log(" "+chalk.bold.cyan("exam ")+chalk.white("<CC>xxxxxxxx")+chalk.gray(" โ†’ Paper A/B/C/D/E (country exam token)")),console.log(" "+chalk.bold.cyan("demo")+chalk.gray(" โ†’ free practice")),console.log(" "+chalk.bold.cyan("lang")+chalk.white(" es")+chalk.gray(" โ†’ switch language")),console.log(" "+chalk.gray("help ยท menu ยท quit")),console.log()}function eo(){console.log(chalk.cyan.bold(" [๐Ÿค– ctf4eai โ€” Embodied AI Security]")),console.log(),console.log(chalk.bold.cyan(" CTF4VLA")+chalk.gray(" โ€” ICOA 2026's ")+chalk.bold.white("Pioneer Round")),console.log(chalk.gray(" an independent parallel track alongside the scored main events: ")+chalk.green("AI4CTF")+chalk.gray(" (Day 1) and ")+chalk.red("CTF4AI")+chalk.gray(" (Day 2)")),console.log(),console.log(chalk.white(" Embodied AI is at its ImageNet moment.")),console.log(chalk.gray(" VLA models, MuJoCo physics, real robot arms.")),console.log(chalk.gray(" Real models, real physics, real attack surfaces.")),console.log(),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€"));const o=O()>0||E()>0,e=S()>0,l=$(),n=T(),t=null!==n&&"number"==typeof n.completedAt&&n.nextCardIndex>=n.totalCards,a=null!==n&&!t;if(t)console.log(chalk.bold.yellow(" Continue: ")+chalk.bold.cyan("โ‘ฃ learn LEARNDEMO01")+chalk.gray(" (demo2 โœ“ ยท sim")+(e?chalk.gray(" โœ“ ยท sim arm โœ“)"):chalk.gray(")")));else if(a){const o=`${n.nextCardIndex} / ${n.totalCards}`;console.log(chalk.bold.yellow(" Continue: ")+chalk.bold.cyan("โ‘ข demo2")+chalk.gray(" (last left at card ")+chalk.bold.yellow(o)+chalk.gray(")"))}else o&&e?console.log(chalk.bold.yellow(" Next up: ")+chalk.bold.cyan("โ‘ข demo2")+chalk.gray(" โ†’ ")+chalk.bold.cyan("โ‘ฃ learn LEARNDEMO01")+chalk.gray(" (sim โœ“ ยท sim arm โœ“)")):l?console.log(chalk.bold.yellow(" Next up: ")+(e?chalk.bold.cyan("โ‘  sim")+chalk.gray(" โ†’ ")+chalk.bold.cyan("โ‘ข demo2"):chalk.bold.cyan("โ‘ก sim arm")+chalk.gray(" โ†’ ")+chalk.bold.cyan("โ‘ข demo2"))+chalk.gray(" โ†’ ")+chalk.bold.cyan("โ‘ฃ learn LEARNDEMO01")):console.log(chalk.bold.yellow(" First time? Try in order: ")+chalk.bold.cyan("โ‘  sim")+chalk.gray(" โ†’ ")+chalk.bold.cyan("โ‘ก sim arm")+chalk.gray(" โ†’ ")+chalk.bold.cyan("โ‘ข demo2")+chalk.gray(" โ†’ ")+chalk.bold.cyan("โ‘ฃ learn LEARNDEMO01"));console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(chalk.bold.green(" sim")+chalk.gray(" ")+chalk.bold.cyan("โ‘ ")+chalk.gray(" ")+chalk.bold.yellow("โ˜… INSTANT")+chalk.gray(" โ€” 8-robot group dance, no wait, no setup")),console.log(chalk.bold.green(" sim arm")+chalk.gray(" ")+chalk.bold.cyan("โ‘ก")+chalk.gray(" interactive 6-DOF arm sandbox โ€” type joint values, watch")),console.log(chalk.bold.green(" demo2")+chalk.gray(" ")+chalk.bold.cyan("โ‘ข")+chalk.gray(" ~8 min interactive intro + live MuJoCo sim")),console.log(chalk.bold.green(" learn LEARNDEMO01")+chalk.gray(" ")+chalk.bold.cyan("โ‘ฃ")+chalk.gray(" free 11-card intro (paste this command as-is)")),console.log(chalk.bold.green(" learn ")+chalk.bold.yellow("EA")+chalk.gray(" + 8 chars full 96 / 360 curriculum (team-issued)")),console.log(chalk.bold.green(" exam ")+chalk.bold.yellow("PDxxxxxxxx")+chalk.gray(" Paper D (CTF4VLA) โ€” national selection contestants")),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(),console.log(chalk.gray(" Three open tiers: ")+chalk.green("free 11")+chalk.gray(" ยท ")+chalk.yellow("registered 100")+chalk.gray(" ยท ")+chalk.bold.magenta("national team 480")+chalk.gray(" (PhD-ready)")),console.log(chalk.gray(" Country team contact: ")+chalk.cyan("australia@icoa2026.au")),console.log(),h(),console.log()}export async function startRepl(e,T){process.env.ICOA_INSIDE_REPL="1";const $=t(),S=n(),O=process.exit.bind(process),E=s();if($.demoCleanedForVersion!==X){try{const{existsSync:o,unlinkSync:e}=await import("node:fs"),{join:l}=await import("node:path"),{getIcoaDir:n}=await import("./lib/config.js"),t=l(n(),"demo-state.json");o(t)&&e(t)}catch{}a({demoCleanedForVersion:X})}const{select:D,confirm:to}=await import("@inquirer/prompts"),ao=$.mode||"",so=["instant","learn","selection","olympiad"].includes(ao)?ao:"selection",ro=[{name:` ${chalk.bold("โšก Try ICOA in 30 seconds")} ${chalk.gray("โ€”")} ${chalk.gray("watch ยท no token needed")}`,value:"instant"},{name:` ${chalk.bold("๐Ÿง  Learn")} ${chalk.gray("โ€”")} ${chalk.gray("AC / CA / EA token ยท skill up")}`,value:"learn"},{name:` ${chalk.bold("๐ŸŽฏ National Selection")} ${chalk.gray("โ€”")} ${chalk.gray("country exam token ยท aim for finals")}`,value:"selection"},{name:` ${chalk.bold("๐Ÿ† International Olympiad")} ${chalk.gray("โ€”")} ${chalk.gray("finals stage ยท Sydney 2026 ยท full sandbox")}`,value:"olympiad"},{name:` ${chalk.gray("โ„น๏ธ About ICOA")} ${chalk.gray("ยท")} ${chalk.gray("what this is ยท how to join")}`,value:"about"}];console.log(chalk.gray(" Use ")+chalk.yellow("โ†‘")+chalk.gray(" / ")+chalk.yellow("โ†“")+chalk.gray(" to select, ")+chalk.yellow("Enter")+chalk.gray(" to confirm. Type ")+chalk.bold.cyan("menu")+chalk.gray(" anywhere to return here.")),console.log();let io="";for(;!io;){const o=await D({message:"Mode",choices:ro,default:so||"selection"});"about"!==o?io=o:(console.clear(),console.log(),console.log(chalk.cyan(" โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•")),console.log(chalk.bold.yellow(" ICOA")+chalk.white(" โ€” AI-Native CLI OS for Cyber & AI Security")),console.log(chalk.gray(" Olympiad & Competition ยท K-12 to University")),console.log(chalk.cyan(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(),console.log(chalk.bold.white(" What Makes ICOA Different")),console.log(chalk.gray(" ยท AI-native AI teammate, AI adversary, AI translation")),console.log(chalk.gray(" ยท CLI OS Complete competition environment in terminal")),console.log(chalk.gray(" ยท 110 tools pwntools, z3, gdb, nmap, sleuthkit... pre-configured")),console.log(chalk.gray(" ยท Global scale 15,000+ concurrent exams ยท 15 languages")),console.log(),console.log(chalk.bold.white(" Competition Format (2-day standard + 1-day Pioneer)")),console.log(` ${chalk.green.bold("AI4CTF")}${chalk.gray(" [Day 1] AI as teammate โ€” speed track, dynamic decay + top-3 bonus")}`),console.log(` ${chalk.red.bold("CTF4AI")}${chalk.gray(" [Day 2] AI as target โ€” knowledge track, static value per challenge")}`),console.log(` ${chalk.cyan.bold("CTF4EAI")}${chalk.gray(" [Pioneer / Practical Round] Embodied AI โ€” VLA + world models + sim-to-real")}`),console.log(),console.log(chalk.bold.white(" Scoring (in brief)")),console.log(chalk.gray(" ยท Standard medals: AI4CTF + CTF4AI combined ยท 1/12 Gold ยท 2/12 Silver ยท 3/12 Bronze")),console.log(chalk.gray(" ยท HMA: top 50% on either day, total below bronze cutoff")),console.log(chalk.gray(" ยท CTF4EAI: separate 15-finalist pool, G/S/B + 12 Finalist Awards")),console.log(),console.log(chalk.white(" Sydney, Australia")+chalk.gray(" ยท Jun 27 - Jul 2, 2026")),console.log(),console.log(chalk.bold.white(" Organized by")+chalk.gray(" ASRA (Australia) ยท ICO Foundation Inc")),console.log(chalk.bold.white(" Contact ")+chalk.cyan(" australia@icoa2026.au ยท accreditation@icoa2026.au")),console.log(chalk.bold.white(" Website ")+chalk.cyan.underline(" https://icoa2026.au")),console.log(chalk.cyan(" โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•")),console.log(),console.log(chalk.gray(" Press ")+chalk.yellow("Enter")+chalk.gray(" to return...")),await new Promise(o=>{const e=l=>{process.stdin.removeListener("data",e),process.stdin.isTTY&&process.stdin.setRawMode&&process.stdin.setRawMode(!1),process.stdin.pause(),o()};process.stdin.isTTY&&process.stdin.setRawMode&&process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.once("data",e)}),console.clear())}if("olympiad"===io&&"olympiad"!==so&&(console.log(),console.log(chalk.yellow(" This mode will download ~500MB of CTF tools and AI models.")),await to({message:"Continue?",default:!0})||(io="selection",console.log(chalk.gray(" Switched to National Selection mode.")))),io!==so&&a({mode:io}),console.log(),"olympiad"===io&&m(X)){d(X),console.log(chalk.gray(" Checking competition environment..."));const{execSync:o}=await import("node:child_process"),e=[{name:"pwntools",cmd:'python3 -c "import pwn"'},{name:"z3-solver",cmd:'python3 -c "import z3"'},{name:"numpy",cmd:'python3 -c "import numpy"'},{name:"requests",cmd:'python3 -c "import requests"'}];let l=0;for(const n of e)try{o(n.cmd,{stdio:"ignore"})}catch{l++}if(l>0){console.log(chalk.yellow(` ${l} core libraries missing.`));try{const{confirm:o}=await import("@inquirer/prompts");if(await o({message:" Install competition Python libraries now?",default:!0,theme:{prefix:"",style:{message:o=>chalk.green(o),defaultAnswer:o=>chalk.green(o)}}})){console.log();const{execSync:o}=await import("node:child_process");o("icoa env setup",{stdio:"inherit"})}}catch{console.log(chalk.gray(" Run ")+chalk.white("env setup")+chalk.gray(" later to install."))}console.log()}else console.log(chalk.green(" All core libraries ready.")),console.log()}if(T){const o=y();if(o){const e=Math.floor(o.awaySeconds/60),l=o.awaySeconds%60;console.log(chalk.yellow(` Session resumed. Away: ${e}m ${l}s | Total exits: ${o.exitCount}`)),console.log()}}if("selection"===io)console.log(chalk.gray(" โ”€โ”€โ”€ exam hall ยท 90 min per paper once started ยท no pause โ”€โ”€โ”€")),console.log(),oo();else if("embodied"===io)eo();else if("instant"===io){console.log(chalk.cyan.bold(" [โšก Try ICOA in 30 seconds โ€” no token needed]")),console.log(),console.log(chalk.gray(" Pick what you want to see first:")),console.log();const o=[{name:` ${chalk.bold.green("โ˜… sim ")} ${chalk.gray("4-sec robot-arm video, bundled & offline ")}`+chalk.bold.yellow("โšก instant"),value:"sim"},{name:` ${chalk.bold.green("โ˜… demo ")} ${chalk.gray("free Paper A/B/C practice ยท 3 Q ยท no clock ")}`+chalk.bold.cyan("๐ŸŽฏ selection-style"),value:"demo"},{name:` ${chalk.bold.green("โ˜… demo2 ")} ${chalk.gray("interactive embodied AI intro ยท ~8 min ")}`+chalk.bold.cyan("๐Ÿค– embodied-style"),value:"demo2"},{name:` ${chalk.gray("โ†ฉ back to main menu")}`,value:"menu"}];let l="menu";try{l=await D({message:"Pick",choices:o,default:"sim"})}catch{}if("menu"!==l){console.log();try{await e.parseAsync(["node","icoa",l])}catch{}}a({mode:"selection"}),io="selection",console.log(),oo()}else if("learn"===io){console.log(chalk.cyan.bold(" [๐Ÿง  Learn โ€” pick a track]")),console.log(),console.log(chalk.gray(" Three tracks ยท same difficulty curve ยท pick what excites you.")),console.log();const o=[{name:` ${chalk.bold("๐Ÿค ai4ctf")} ${chalk.gray("โ€”")} ${chalk.gray("AI as your teammate ยท ")}${chalk.cyan("AC")}${chalk.gray(" + 8 chars")}`,value:"ai4ctf"},{name:` ${chalk.bold("๐Ÿ”“ ctf4ai")} ${chalk.gray("โ€”")} ${chalk.gray("AI as your target ยท ")}${chalk.cyan("CA")}${chalk.gray(" + 8 chars")}`,value:"ctf4ai"},{name:` ${chalk.bold("๐Ÿค– ctf4eai")} ${chalk.gray("โ€”")} ${chalk.gray("Embodied AI Security ยท ")}${chalk.cyan("EA")}${chalk.gray(" + 8 chars ยท sim + demo2 included")}`,value:"ctf4eai"},{name:` ${chalk.gray("โ†ฉ back to main menu")}`,value:"back"}],l=await D({message:"Track",choices:o,default:"ctf4eai"});if("back"===l)console.clear(),io="selection",oo();else if("ctf4eai"===l)console.log(),io="embodied",a({mode:"embodied"}),eo();else{const o="ai4ctf"===l?{emoji:"๐Ÿค",tagline:"AI as your teammate โ€” speed-track CTF with an AI partner you can talk to.",prefix:"AC",demoToken:"AI4CTFDEMO01"}:{emoji:"๐Ÿ”“",tagline:"AI as your target โ€” red-team a language model. Find the jailbreak, claim the flag.",prefix:"CA",demoToken:"CTF4AIDEMO01"};console.log(),console.log(chalk.cyan.bold(` [${o.emoji} ${l} โ€” issued learn token]`)),console.log(),console.log(chalk.white(" "+o.tagline)),console.log(),console.log(chalk.gray(" Token format: ")+chalk.cyan(o.prefix)+chalk.gray(" + 8 chars (issued by your country/cohort lead)")),console.log(chalk.gray(" No token? Type ")+chalk.bold.green(o.demoToken)+chalk.gray(" below for the free 12-card demo.")),console.log();let n=!1;try{const{input:o}=await import("@inquirer/prompts"),l=(await o({message:" Learn token (or blank to skip):"})).trim();l&&(n=!0,console.log(),console.log(chalk.gray(" Opening ")+chalk.bold.cyan("learn")+chalk.gray(`: ${l}`)),console.log(),a({mode:"selection"}),await e.parseAsync(["node","icoa","learn",l]))}catch{}n||console.clear(),io="selection",oo()}}else"organizer"===io?(console.log(chalk.yellow.bold(" [National/Regional Partner]")),console.log(),console.log(chalk.bold.white(" โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—")),console.log(chalk.bold.white(" โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—")),console.log(chalk.bold.white(" โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘")),console.log(chalk.bold.white(" โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•‘")),console.log(chalk.bold.white(" โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘")),console.log(chalk.bold.white(" โ•šโ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ• โ•šโ•โ•")),console.log(),console.log(chalk.yellow(" International Cyber Olympiad in AI 2026")),console.log(chalk.bold.magenta(" The World's First AI-Native CLI Operating System")),console.log(chalk.bold.magenta(" for Cybersecurity & AI Security Competition")),console.log(chalk.bold.magenta(" and Olympiad for K-12")),console.log(chalk.gray(" Sydney, Australia ยท Jun 27 - Jul 2, 2026")),console.log(),console.log(chalk.white(" Vision")),console.log(chalk.gray(" Building a global pipeline for youth cyber & AI")),console.log(chalk.gray(" security talent through education and competition.")),console.log(),console.log(chalk.white(" Capacity")),console.log(chalk.gray(" 15,000+ concurrent online examinations")),console.log(chalk.gray(" National selection, training, and education support")),console.log(),console.log(chalk.white(" Olympic Spirit")),console.log(chalk.gray(" Excellence ยท Friendship ยท Respect")),console.log(),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(chalk.white(" New country accreditation & support:")),console.log(chalk.cyan(" australia@icoa2026.au")),console.log(chalk.cyan(" accreditation@icoa2026.au")),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(),S?(console.log(chalk.green(` Logged in as ${$.userName}`)),console.log(chalk.white(" exam list")+chalk.gray(" Manage exams")),console.log(chalk.white(" logout")+chalk.gray(" Disconnect"))):console.log(chalk.white(" join <url>")+chalk.gray(" Connect to manage exams")),console.log(),h(),console.log()):(console.log(` ${chalk.cyan.bold("๐Ÿ† ICOA 2026 ยท International Olympiad")}`),console.log(),E&&!c()?(console.log(chalk.red(" Token was activated on a different device.")),console.log(chalk.gray(" Contact organizer for assistance.")),console.log()):S?(console.log(chalk.green.bold(` Welcome back, ${$.userName}!`)),console.log(chalk.gray(` Connected to ${$.ctfdUrl}`)),console.log(),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(chalk.white(" Ready to compete? Start here:")),console.log(),console.log(chalk.bold.cyan(" challenges")+chalk.gray(" Browse challenges by category")),console.log(chalk.white(" status")+chalk.gray(" Your score & hint budget")),console.log(chalk.white(" scoreboard")+chalk.gray(" Live rankings")),console.log(chalk.white(" help")+chalk.gray(" Full command list")),console.log(),console.log(chalk.gray(" Tool environment:")),console.log(chalk.white(" env")+chalk.gray(" See which of the 110 CTF tools are installed")),console.log(chalk.white(" env setup")+chalk.gray(" Install anything missing (~5 min, one-time)")),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(chalk.gray(" Tip: ")+chalk.cyan("help")+chalk.gray(" ยท ")+w()+chalk.gray(" ยท ")+chalk.cyan("Ctrl+C")+chalk.gray(" pauses ยท ")+chalk.cyan("quit")+chalk.gray(" closes")),console.log()):E?(W(H)||Y(H,{recursive:!0}),console.log(chalk.green.bold(" Welcome, competitor!")),console.log(chalk.gray(` Workspace: ${H}`)),console.log(),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(chalk.white(" Get started:")),console.log(),console.log(chalk.white(" Step 1 ")+chalk.bold.cyan("join <url>")+chalk.gray(" Connect to competition server")),console.log(chalk.white(" Step 2 ")+chalk.bold.cyan("challenges")+chalk.gray(" Browse & solve challenges")),console.log(chalk.white(" Step 3 ")+chalk.bold.cyan("ai4ctf")+chalk.gray(" Ask AI when stuck")),console.log(),console.log(chalk.gray(" Before Step 1 โ€” make sure your tools are ready:")),console.log(chalk.white(" env")+chalk.gray(" See which of the 110 CTF tools are installed")),console.log(chalk.white(" env setup")+chalk.gray(" Install anything missing (~5 min, one-time)")),console.log(),console.log(chalk.gray(" Also: ")+chalk.white("help")+chalk.gray(" all commands")),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(chalk.gray(" Tip: ")+chalk.cyan("Ctrl+C")+chalk.gray(" pauses ยท ")+w()+chalk.gray(" ยท ")+chalk.cyan("quit")+chalk.gray(" closes CLI")),console.log()):(console.log(chalk.bold.yellow(" ๐Ÿ† You reached the finals tier.")),console.log(chalk.gray(" Full sandbox ยท 110 CTF tools ยท Sydney 2026 ยท this is where finalists compete.")),console.log(),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(chalk.white(" To begin, activate your competition token:")),console.log(),console.log(chalk.bold.cyan(" activate <token>")),console.log(),console.log(chalk.gray(" While waiting, explore:")),console.log(chalk.white(" ref linux")+chalk.gray(" Quick reference for Linux")),console.log(chalk.white(" ref web")+chalk.gray(" Quick reference for Web")),console.log(chalk.white(" env")+chalk.gray(" See which of the 110 CTF tools are installed")),console.log(chalk.white(" env setup")+chalk.gray(" Install anything missing (~5 min, one-time)")),console.log(chalk.white(" help")+chalk.gray(" All available commands")),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(chalk.gray(" Tip: ")+chalk.cyan("Ctrl+C")+chalk.gray(" pauses ยท ")+w()+chalk.gray(" ยท ")+chalk.cyan("quit")+chalk.gray(" closes CLI")),console.log()));e.exitOverride(),e.configureOutput({writeErr:()=>{},writeOut:o=>{console.log(o)}});const co=o({input:process.stdin,output:process.stdout,prompt:J(),terminal:!0});f(co);let go=!1;p(!0),Q();const yo=co.prompt.bind(co);co.prompt=o=>{b()||v()||C()||I()||co.setPrompt(J()),yo(o)},co.prompt(),co.on("line",async o=>{if(go)return;const n=o.trim();if(!n)return co.setPrompt(b()?chalk.magenta("ai4ctf> "):J()),void co.prompt();if("menu"===n||"menu confirm"===n)return j()&&"menu confirm"!==n?(console.log(),console.log(chalk.yellow(" Real exam active. Progress is auto-saved.")),console.log(chalk.gray(" To return to main menu anyway, type ")+chalk.white("menu confirm")),console.log(),void co.prompt()):void u(co);if(b()){go=!0;const o=await x(n);return go=!1,"exit"===o&&co.setPrompt(J()),void co.prompt()}if(v()){go=!0;const o=await A(n);return go=!1,"exit"!==o&&"solved"!==o||co.setPrompt(J()),void co.prompt()}if(C()){go=!0;const o=await k(n);return go=!1,"exit"===o&&co.setPrompt(J()),co.setPrompt(C()?chalk.bold.cyan("ctf4vla> "):J()),void co.prompt()}if(U(n),"exit"===n)return L()?(console.log(),console.log(chalk.yellow(" โš  An exam is in progress.")),console.log(chalk.white(" To return to menu without losing progress, type: ")+chalk.bold.cyan("back")),console.log(chalk.white(" To fully close ICOA CLI, type: ")+chalk.bold.cyan("quit")),console.log(chalk.gray(" Your progress is auto-saved either way.")),console.log(),void co.prompt()):(console.log(),console.log(chalk.gray(" ")+chalk.white("exit")+chalk.gray(" returns to the main menu. To fully close ICOA CLI, type ")+chalk.bold.cyan("quit")+chalk.gray(".")),"selection"===io&&oo(),void co.prompt());if("quit"===n||"q"===n||"quit confirm"===n){const o=L();return o&&"demo-free"!==o.session.examId&&"quit confirm"!==n?(console.log(),console.log(chalk.yellow(" โš  A real exam is in progress.")),console.log(chalk.gray(" Your answers are auto-saved on the server, but the exam timer keeps ticking")),console.log(chalk.gray(" on the server side even if you close the CLI.")),console.log(),console.log(chalk.white(" To leave the CLI but keep the exam alive, type: ")+chalk.bold.cyan("back")),console.log(chalk.gray(" (recommended โ€” you can resume with ")+chalk.cyan("exam q 1")+chalk.gray(" after relaunching icoa)")),console.log(),console.log(chalk.white(" To really close ICOA CLI, type: ")+chalk.bold.cyan("quit confirm")),console.log(),void co.prompt()):(o&&"demo-free"===o.session.examId&&(console.log(),console.log(chalk.gray(" Demo paused. Resume with: ")+chalk.white("demo")+chalk.gray(" (fresh) or ")+chalk.white("exam q 1")+chalk.gray(" (continue)."))),_(),g(),console.log(chalk.gray(" Session saved. Use ")+chalk.white("icoa --resume")+chalk.gray(" to continue.")),P(),void O(0))}if("back"===n){const o=L(),e=o&&"demo-free"!==o.session.examId,l=o&&"demo-free"===o.session.examId&&(()=>{const e=new Date(o.session.startedAt||0).getTime();return Date.now()-e<18e5})();if(e)console.log(),console.log(chalk.gray(" Exam paused. Your progress is saved.")),console.log(chalk.white(" Resume: exam q 1")+chalk.gray(" ยท ")+chalk.white("exam review")+chalk.gray(" ยท ")+chalk.white("exam submit")),console.log();else if(l){const e=Object.keys(o.answers).length,l=o.session.questionCount;console.log(),console.log(chalk.gray(` Demo paused (${e}/${l} answered). Resume with: `)+chalk.white("exam q 1")),console.log(chalk.gray(" Or type ")+chalk.white("demo")+chalk.gray(" to restart.")),console.log()}else{if(o&&"demo-free"===o.session.examId){const{clearExamState:o}=await import("./lib/exam-state.js");o("demo-free")}const e=t();fetch("https://practice.icoa2026.au/api/icoa/demo-stats",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({type:"post-report-back",lang:e.language||"en",timestamp:(new Date).toISOString()}),signal:AbortSignal.timeout(5e3)}).catch(()=>{}),"selection"===io?oo():console.log(chalk.gray(" Already at main menu."))}return void co.prompt()}if("help"===n||"?"===n){if(L()){go=!0;try{await e.parseAsync(["node","icoa","exam","help"])}catch{}return go=!1,void co.prompt()}return no(s(),io),void co.prompt()}if("man"===n||"manual"===n)return no(s(),io),void co.prompt();if("more help"===n.toLowerCase()&&L()){go=!0;try{await e.parseAsync(["node","icoa","exam","more-help"])}catch{}return go=!1,void co.prompt()}if("continue"===n.toLowerCase())return console.log(),console.log(chalk.green.bold(" โ•โ•โ• AI4CTF โ€” AI as Your Teammate โ•โ•โ•")),console.log(),console.log(chalk.white(" In AI4CTF, you solve cybersecurity challenges")),console.log(chalk.white(" with AI by your side.")),console.log(),console.log(chalk.white(" In competition, you get AI help at 3 levels:")),console.log(chalk.yellow(" hint a")+chalk.gray(" General guidance (50 uses)")),console.log(chalk.yellow(" hint b")+chalk.gray(" Deep analysis (10 uses)")),console.log(chalk.yellow(" hint c")+chalk.gray(" Critical assist (2 uses)")),console.log(),console.log(chalk.white(" Try it now! Type: ")+chalk.bold.green("ai4ctf")),console.log(chalk.gray(' Chat freely with your AI teammate. Type "exit" when done.')),console.log(),console.log(chalk.gray(" After ai4ctf, try: ")+chalk.bold.red("ctf4ai")+chalk.gray(' โ€” trick the AI into saying "koala"')),console.log(),void co.prompt();if(/^ICOA-[A-Z]{2,3}-\d{1,6}$/i.test(n.trim())){go=!0;try{await e.parseAsync(["node","icoa","exam","token",n.trim()])}catch{}return go=!1,void co.prompt()}if(/^[A-Z]{2}[0-9A-HJKMNP-TV-Z]{8}$/i.test(n.trim())){go=!0;try{await e.parseAsync(["node","icoa","exam","token",n.trim().toUpperCase()])}catch{}return go=!1,void co.prompt()}const a=n.match(/^exam\s+([A-Z]{2}[0-9A-HJKMNP-TV-Z]{8})$/i);if(a){go=!0;try{await e.parseAsync(["node","icoa","exam","token",a[1].toUpperCase()])}catch{}return go=!1,void co.prompt()}const y=n.match(/^exam\s+([A-Z]{2,3})$/i);if(y){go=!0;try{await e.parseAsync(["node","icoa","exam","list",y[1]])}catch{}return go=!1,void co.prompt()}if("clear"===n||"cls"===n)return console.clear(),void co.prompt();if(n.startsWith("activate ")){const o=n.slice(9).trim(),e=r(o);return"ok"===e?console.log(chalk.green(" Access granted! Token bound to this device.")):"already_bound"===e?(console.log(),console.log(chalk.red(" Token already activated on a different device.")),console.log(chalk.gray(" Each token binds to the first device that uses it. If you lost the device,")),console.log(chalk.gray(" contact your proctor to have the token re-issued for a new device."))):(console.log(),console.log(chalk.red(" Token not recognized.")),console.log(chalk.gray(" Possible reasons:")),console.log(chalk.white(" โ€ข ")+chalk.gray("Typo โ€” tokens are case-insensitive, 10 chars, start with a 2-letter country code (e.g. ")+chalk.cyan("UAK7M2R9Q4")+chalk.gray(")")),console.log(chalk.white(" โ€ข ")+chalk.gray("Expired โ€” ask your proctor or organizer for a fresh token")),console.log(chalk.white(" โ€ข ")+chalk.gray("Network โ€” verify connection to ")+chalk.cyan("practice.icoa2026.au")),console.log(chalk.gray(" Still stuck? type ")+chalk.cyan("help")+chalk.gray(" or try ")+chalk.cyan("exam demo")+chalk.gray(" for a free practice round."))),console.log(),void co.prompt()}if("activate"===n)return console.log(chalk.gray(" Usage: ")+chalk.white("activate <token>")),console.log(),void co.prompt();const m=L();if(m){const o=n.toUpperCase().trim(),l=o=>{const e=m.questions.find(e=>e.number===o);return!!e&&("ai4ctf"===e.type||"ctf4ai"===e.type||e.options&&!e.options.A&&!e.options.B)},t=o=>{const e="demo-free"!==m.session.examId,l=e&&o>=39?"ctf4ai":e&&o>=31?"ai4ctf":null;console.log(),console.log(chalk.yellow(` Q${o} is a practical question โ€” letters (A/B/C/D) don't apply here.`)),l?(console.log(chalk.white(" Enter the AI chat for this question: ")+chalk.bold.cyan(l)),console.log(chalk.gray(" Or submit a flag directly: ")+chalk.green(`exam answer ${o} ICOA{your_flag}`))):console.log(chalk.gray(" Submit a flag: ")+chalk.green(`exam answer ${o} ICOA{your_flag}`)),console.log()};if(/^[ABCD]$/.test(o)){const n=m._lastQ||1;if(l(n))return t(n),void co.prompt();go=!0;try{await e.parseAsync(["node","icoa","exam","answer",String(n),o])}catch{}return go=!1,void co.prompt()}const a=o.match(/^(\d+)\s+([ABCD])$/);if(a){const o=parseInt(a[1],10);if(l(o))return t(o),void co.prompt();go=!0;try{await e.parseAsync(["node","icoa","exam","answer",a[1],a[2]])}catch{}return go=!1,void co.prompt()}}const d=n.split(/\s+/)[0].toLowerCase(),p=/^python3?(\.\d+)?$/.test(d),h="ls"===d||"pwd"===d,w=n.startsWith("!")||d.startsWith("!")||p||h,f=new Set(["nano","vi","vim","emacs","pico","ed","code","cat","less","more","head","tail","ls","pwd","cd","base64","xxd","hexdump","od","openssl","md5sum","sha256sum","grep","find","awk","sed","strings","file","curl","wget","nc","ping","nmap","echo","bash","sh","zsh","pip","pip3","node","npm"]),I=()=>{console.log(chalk.gray(" Shell commands need ")+chalk.bold.cyan("!")+chalk.gray(" prefix. Try: ")+chalk.bold.cyan(`!${n}`)),console.log()};if("embodied"===io&&!w&&!["demo2","learn","exam","ctf4vla","lang","ref","setup","env","sim"].includes(d))return f.has(d)?(I(),void co.prompt()):(console.log(chalk.gray(" Not available in Embodied AI Security mode.")),console.log(chalk.white(" Try ")+chalk.bold.cyan("demo2")+chalk.gray(" (intro) ยท ")+chalk.bold.cyan("learn")+chalk.gray(" (curriculum) ยท ")+chalk.bold.cyan("exam <PD-token>")+chalk.gray(" (Paper D)")),console.log(),void co.prompt());if("selection"===io&&!w&&!["exam","demo","retry","nations","next","prev","continue","setup","lang","ref","ai4ctf","ctf4ai","mark","unmark","review","submit","env","sim"].includes(d)){if(f.has(d))return I(),void co.prompt();if(console.log(chalk.gray(" Not available in Selection mode.")),m){const o=m._lastQ||1;console.log(chalk.white(` Resume exam: exam q ${o}`)+chalk.gray(" ยท ")+chalk.white("A/B/C/D")+chalk.gray(" to answer"))}else console.log(chalk.gray(" Try: demo ยท setup to switch mode"));return console.log(),void co.prompt()}if("organizer"===io&&!["join","exam","demo","retry","next","prev","logout","setup","lang","ref","ctf","mark","unmark","review","submit"].includes(d))return console.log(chalk.gray(" Not available in Organizer mode. Switch via: setup")),console.log(),void co.prompt();if(!("olympiad"!==io||s()&&c()||i(d)))return console.log(chalk.yellow(" Restricted mode. ")+chalk.gray("Enter your access token:")),console.log(chalk.white(" activate <token>")),console.log(),console.log(chalk.gray(" Free commands: ")+chalk.white("ref [topic]")+chalk.gray(", ")+chalk.white("help")+chalk.gray(", ")+chalk.white("exit")),console.log(),void co.prompt();if(!["join","activate","challenges","ch","open","submit","flag","scoreboard","sb","status","time","ref","shell","files","connect","note","notes","logbook","log","man","manual","lang","setup","env","ai4ctf","model","ctf","exam","demo","retry","nations","next","prev","continue","logout","ctf4ai","mark","unmark","review","submit","learn","demo2","ctf4vla","theme","sim"].includes(d)){if(K.has(d))return console.log(chalk.yellow(` "${d}" is a shell command โ€” the ICOA prompt isn't a shell.`)),console.log(chalk.gray(" In real-exam mode, prefix with ! to run inside the sandbox: ")+chalk.cyan(`!${n}`)),console.log(),void co.prompt();if(/(?:^|\s)(?:\/(?!home\/|Users\/|tmp\/)|\.\.\/|~\/)/.test(n)&&!n.startsWith("cd ")){const o=/(?:^|\s)\/(?!home\/\w+\/icoa-workspace|Users\/\w+\/icoa-workspace|tmp\/)/.test(n),e=/\.\./.test(n);if(o||e)return console.log(chalk.red(" Blocked: access outside workspace is not allowed.")),console.log(chalk.gray(` Workspace: ${H}`)),console.log(),void co.prompt()}let o=n.startsWith("!")?n.slice(1).trim():n;if("darwin"===process.platform){const e="/opt/homebrew/opt/python@3.12/bin/python3.12";o=o.replace(/^python3?\s/,`${e} `).replace(/^(python3|python)$/,e)}else if("win32"===process.platform){const e=(()=>{try{return l("py -3 --version",{stdio:["ignore","ignore","ignore"],timeout:1500}),"py -3"}catch{}return"python"})();o=o.replace(/^python3?(\.\d+)?\s/,`${e} `).replace(/^python3?(\.\d+)?$/,e)}else{const e=(()=>{try{return l("which python3.12",{stdio:"ignore"}),"python3.12"}catch{return"python3"}})();o=o.replace(/^python\s/,`${e} `).replace(/^python$/,e)}const e=B(),t=N(n);M({cwd:e,input:n,riskFlags:t}),t.length>0&&j()&&(console.log(chalk.yellow(` โš  Action flagged: ${t.join(", ")} โ€” logged.`)),console.log()),/^(\S*python3?(\.\d+)?)\s*$/.test(o)&&(o=`PYTHONSTARTUP="${function(){const o=V(G(),".icoa");W(o)||Y(o,{recursive:!0});const e=V(o,"python-startup.py");return W(e)||z(e,"# ICOA exam interactive startup โ€” auto-loaded by PYTHONSTARTUP\nimport base64, struct, hashlib, re, json, os, sys, binascii\ntry: import requests\nexcept ImportError: pass\ntry: from Crypto.Cipher import AES\nexcept ImportError: pass\ntry: from Crypto.Util.Padding import pad, unpad\nexcept ImportError: pass\ntry: from pwn import xor, p32, u32, p64, u64\nexcept ImportError: pass\ntry: import bs4\nexcept ImportError: pass\ntry: import numpy as np\nexcept ImportError: pass\n"),e}()}" ${o}`,console.log(),console.log(chalk.cyan(" โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”")),console.log(chalk.bold.white(" Python ready โ€” ICOA exam toolkit pre-loaded")),console.log(chalk.cyan(" โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”")),console.log(),console.log(chalk.white(" Already imported: ")+chalk.gray("base64, struct, hashlib, re, json, binascii")),console.log(chalk.white(" Also available: ")+chalk.gray("requests, bs4, numpy, AES, pad/unpad, xor, p32/u32/p64/u64")),console.log(),console.log(chalk.yellow(" Quick examples:")),console.log(chalk.gray(' base64.b64decode("aGVsbG8=") ')+chalk.gray("# decode base64")),console.log(chalk.gray(' bytes.fromhex("48656c6c6f") ')+chalk.gray("# hex โ†’ bytes")),console.log(chalk.gray(' "ICOA{x}".encode() ')+chalk.gray("# str โ†’ bytes")),console.log(chalk.gray(" [chr(c) for c in [73,67,79,65]] ")+chalk.gray("# ASCII codes")),console.log(chalk.gray(' xor(bytes.fromhex("0a2b"), b"IC") ')+chalk.gray("# pwntools XOR")),console.log(),console.log(chalk.gray(" Exit: ")+chalk.white("exit()")+chalk.gray(" or Ctrl-D")),console.log(chalk.cyan(" โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”")),console.log()),go=!0;try{F()&&await R()?await q(o,co):await lo(o,co,e)}catch{console.log(chalk.yellow(` Command failed: ${d}`))}return go=!1,console.log(),void co.prompt()}go=!0;const T=n.trim(),$=T.toLowerCase();let S,E=null,D="";if(m)if("submit"===$)E="final";else if($.startsWith("submit ")){let o=T.slice(7).trim();/^submit\s+/i.test(o)&&(o=o.replace(/^submit\s+/i,"").trim()),o=o.replace(/^["'`]+|["'`]+$/g,"").trim(),o&&/^ICOA\{[^}]*\}?$/i.test(o)&&(E="flag",D=o)}else/^ICOA\{[^}]+\}$/i.test(T)&&(E="flag",D=T);S="final"===E?["exam","submit"]:"flag"===E?["exam","answer",String(m?._lastQ||1),D]:function(o){const e=o.split(/\s+/),l=e[0].toLowerCase(),n=e.slice(1),t={demo:["exam","demo"],retry:["exam","demo-retry"],nations:["exam","nations"],next:["exam","next"],prev:["exam","prev"],mark:["exam","mark",...n],unmark:["exam","unmark",...n],review:["exam","review"],logout:["ctf","logout"],join:["ctf","join",...n],activate:["ctf","activate",...n],challenges:["ctf","challenges"],ch:["ctf","challenges"],open:["ctf","open",...n],submit:["ctf","submit",...n],flag:["ctf","submit",...n],scoreboard:["ctf","scoreboard",...n],sb:["ctf","scoreboard",...n],status:["ctf","status"],time:["ctf","time"]};return t[l]?t[l]:["ref","shell","files","connect","note","notes","logbook","log","man","manual","lang","setup","env","ai4ctf","model","ctf","exam","ctf4ai"].includes(l)?[l,...n]:e}(n);const Q="ctf"===S[0]&&"join"===S[1];Q&&co.pause(),process.exit=()=>{throw new Error(Z)};try{await e.parseAsync(["node","icoa",...S])}catch(o){const e=o instanceof Error?o.message:String(o);if(e===Z);else if(e.includes("commander.unknownCommand")){const{distance:o}=await import("fastest-levenshtein"),e=["ctf","ref","shell","files","connect","note","notes","logbook","log","manual","lang","setup","env","ai4ctf","exam","ctf4ai","theme","clear","cls","quit","exit","back","menu","help","continue","activate","demo","challenges","status","scoreboard","join","logout"],l=d.split(/\s+/)[0]||d;let n={word:"",dist:1/0};for(const t of e){const e=o(l.toLowerCase(),t);e<n.dist&&(n={word:t,dist:e})}console.log(chalk.yellow(` Unknown command: ${d}.`)),n.dist>0&&n.dist<=2&&console.log(chalk.gray(" Did you mean: ")+chalk.bold.cyan(n.word)+chalk.gray("?")),console.log(chalk.gray(" Type ")+chalk.cyan("help")+chalk.gray(" for the full command list."))}else e.includes("commander.")||(e.includes("fetch failed")||e.includes("ECONNREFUSED")||e.includes("ETIMEDOUT"))&&console.log(chalk.yellow(" Network error. Check your connection."))}finally{process.exit=O,go=!1,Q&&co.resume()}b()?co.setPrompt(chalk.magenta("ai4ctf> ")):v()?co.setPrompt(chalk.red("ctf4ai> ")):C()&&co.setPrompt(chalk.bold.cyan("ctf4vla> ")),console.log(),co.prompt()}),co.on("SIGINT",()=>{if(console.log(),b()||v())console.log(chalk.yellow(" Ctrl+C did not close ICOA CLI โ€” you are still in the AI chat.")),console.log(chalk.white(" Type ")+chalk.bold.cyan("exit")+chalk.white(" to leave the chat and return to the menu."));else if(L()){const o="demo-free"!==L().session.examId;console.log(chalk.yellow(" Ctrl+C did NOT close ICOA CLI.")),console.log(chalk.gray(` Your ${o?"exam":"demo"} is paused and every answer is auto-saved.`)),console.log(),console.log(chalk.white(" Resume: ")+chalk.cyan("exam q 1")+chalk.gray(" ยท Back to menu: ")+chalk.cyan("back")+chalk.gray(" ยท Close CLI: ")+chalk.cyan(o?"quit confirm":"quit"))}else console.log(chalk.yellow(" Ctrl+C did not close ICOA CLI โ€” you are still at the ")+chalk.cyan("icoa>")+chalk.yellow(" prompt.")),console.log(chalk.gray(" Keep typing โ€” ")+chalk.cyan("help")+chalk.gray(" lists commands. (Only ")+chalk.cyan("quit")+chalk.gray(" or Ctrl+D actually close the CLI.)"));console.log(),co.prompt()}),co.on("close",()=>{_(),g(),P(),O(0)})}function lo(o,l,n){return new Promise(t=>{const a=process.stdin,s=!!a.isTTY&&!!a.isRaw;if(l.pause(),a.isTTY&&"function"==typeof a.setRawMode)try{a.setRawMode(!1)}catch{}const r=e(o,{shell:!0,stdio:"inherit",cwd:n||process.cwd()}),i=()=>{if(a.isTTY&&"function"==typeof a.setRawMode&&s)try{a.setRawMode(!0)}catch{}l.resume(),t()};r.on("close",i),r.on("error",i)})}function no(o,e="olympiad"){return console.log(),"selection"===e||"organizer"===e?(console.log(chalk.bold.white(" Exam")),console.log(chalk.white(" join <url> ")+chalk.gray("Connect to exam server")),console.log(chalk.white(" exam list ")+chalk.gray("Available exams")),console.log(chalk.white(" exam start <id> ")+chalk.gray("Begin an exam")),console.log(chalk.white(" exam q [n] ")+chalk.gray("View questions")),console.log(chalk.white(" exam answer <n> <X> ")+chalk.gray("Answer question")),console.log(chalk.white(" exam review ")+chalk.gray("Review all answers")),console.log(chalk.white(" exam submit ")+chalk.gray("Submit for grading")),console.log(chalk.white(" exam result ")+chalk.gray("View your score")),console.log(),console.log(chalk.bold.white(" System")),console.log(chalk.white(" ref [topic] ")+chalk.gray("Quick reference")),console.log(chalk.white(" setup ")+chalk.gray("Settings / switch mode")),console.log(chalk.white(" lang [code] ")+chalk.gray("Switch language")),console.log(chalk.white(" clear ")+chalk.gray("Clear screen")),console.log(chalk.white(" exit ")+chalk.gray("Quit")),void console.log()):o?(console.log(chalk.cyan(" โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•")),console.log(chalk.bold.white(" How it works")),console.log(),console.log(chalk.gray(" 1. Browse ")+chalk.white("challenges")+chalk.gray(" and pick one")),console.log(chalk.gray(" 2. ")+chalk.white("open <id>")+chalk.gray(" to read the challenge")),console.log(chalk.gray(" 3. Use ")+chalk.white("ai4ctf")+chalk.gray(" to chat with AI when stuck")),console.log(chalk.gray(" 4. ")+chalk.white("submit <id> icoa{flag}")+chalk.gray(" to score points")),console.log(chalk.gray(" 5. Check ")+chalk.white("scoreboard")+chalk.gray(" to track your rank")),console.log(chalk.cyan(" โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•")),console.log(),console.log(chalk.bold.white(" Competition")),console.log(chalk.white(" join <url> ")+chalk.gray("Connect to CTFd")),console.log(chalk.white(" challenges (ch) ")+chalk.gray("List challenges by category")),console.log(chalk.white(" open <id> ")+chalk.gray("Read challenge + get next steps")),console.log(chalk.white(" submit <id> <flag> ")+chalk.gray("Submit a flag")),console.log(chalk.white(" scoreboard (sb) ")+chalk.gray("Live rankings")),console.log(chalk.white(" status ")+chalk.gray("Your score, budget & timer")),console.log(chalk.white(" time ")+chalk.gray("Countdown timer")),console.log(),console.log(chalk.bold.white(" AI Teammate")+chalk.gray(" โ€” 3 levels, use wisely")),console.log(chalk.white(' hint "question" ')+chalk.gray("Level A โ€” General guidance (50 uses)")),console.log(chalk.white(' hint-b "question" ')+chalk.gray("Level B โ€” Deep analysis (10 uses)")),console.log(chalk.white(' hint-c "question" ')+chalk.gray("Level C โ€” Critical assist (2 uses)")),console.log(chalk.white(" hint budget ")+chalk.gray("Check remaining uses")),console.log(chalk.white(" ai4ctf ")+chalk.gray("Free-chat with AI (no limit)")),console.log(),console.log(chalk.bold.white(" Tools")),console.log(chalk.white(" ref [topic] ")+chalk.gray("Quick reference (linux, web, crypto...)")),console.log(chalk.white(" shell ")+chalk.gray("Docker sandbox")),console.log(chalk.white(" files <id> ")+chalk.gray("Download challenge files")),console.log(chalk.white(" connect <id> ")+chalk.gray("Connect to remote target")),console.log(chalk.white(" note [text] ")+chalk.gray("Add a logbook entry (in-exam: tags current Q)")),console.log(chalk.white(" logbook [n] ")+chalk.gray("View your logbook (in-exam: filter by Q)")),console.log(chalk.white(" log ")+chalk.gray("Session history")),console.log(chalk.white(" man / manual ")+chalk.gray("Show this command list (works in exam too, does not burn elimination)")),console.log(),console.log(chalk.bold.white(" System")),console.log(chalk.white(" setup ")+chalk.gray("Configure settings")),console.log(chalk.white(" lang [code] ")+chalk.gray("Switch language (15 supported)")),console.log(chalk.white(" logout ")+chalk.gray("Disconnect")),console.log(chalk.white(" clear ")+chalk.gray("Clear screen")),console.log(chalk.white(" exit ")+chalk.gray("Quit (session saved)")),void console.log()):(console.log(chalk.bold.yellow(" Restricted Mode โ€” activate with a token to unlock all commands")),console.log(),console.log(chalk.white(" activate <token> ")+chalk.gray("Unlock full access")),console.log(chalk.white(" ref [topic] ")+chalk.gray("Quick reference")),console.log(chalk.white(" exit ")+chalk.gray("Quit")),void console.log())}
1
+ import{createInterface as o}from"node:readline";import{spawn as e,execSync as l}from"node:child_process";import chalk from"chalk";import{isConnected as n,getConfig as t,saveConfig as a}from"./lib/config.js";import{isActivated as s,activateToken as r,isFreeCommand as i,isDeviceMatch as c,recordExit as g,recordResume as y,isFirstRunOrUpgrade as m,markVersionSeen as d}from"./lib/access.js";import{setReplMode as p}from"./lib/ui.js";import{returnToMainMenu as u,printMenuHint as h,menuHintInline as w}from"./lib/menu-nav.js";import{setMainRl as f}from"./lib/main-rl.js";import{isChatActive as b,handleChatMessage as x}from"./commands/ai4ctf.js";import{isCtf4aiActive as v,handleCtf4aiMessage as C}from"./commands/ctf4ai-demo.js";import{isCtf4VlaActive as A,handleCtf4VlaMessage as k}from"./commands/ctf4vla.js";import{isDemo2Active as I}from"./commands/demo2.js";import{loadDemo2Progress as T}from"./lib/demo2-progress.js";import{hasAnySimHistory as $,lastArmAt as S,lastBundledAt as O,lastSimAt as E}from"./lib/sim-cooldown.js";import{getExamState as L,getRealExamState as j,getDemoState as D}from"./lib/exam-state.js";import{resetTerminalTheme as P}from"./lib/theme.js";import{ensureSandbox as R,runInSandbox as q,isDockerAvailable as F}from"./lib/sandbox.js";import{checkShellRisk as N,logShellAudit as M,getActiveCwd as B}from"./lib/exam-sandbox.js";import{logCommand as U}from"./lib/logger.js";import{startLogSync as Q,stopLogSync as _}from"./lib/log-sync.js";import{existsSync as W,mkdirSync as Y,writeFileSync as z}from"node:fs";import{join as V}from"node:path";import{homedir as J}from"node:os";function G(){return j()?chalk.cyan("exam> "):D()?chalk.yellow("demo> "):chalk.green("icoa> ")}const H=V(J(),"icoa-workspace"),K=new Set(["sudo","su","doas","pkexec","brew","apt","apt-get","yum","choco","npm","npx","pip","pip3","shutdown","reboot","halt","mkfs","fdisk","dd","iptables","ufw"]),Z="__REPL_NO_EXIT__",X="2.5.1";function oo(){console.log(),console.log(` ${chalk.cyan.bold("๐ŸŽฏ ICOA 2026 ยท National Selection")}`),console.log(),console.log(" "+chalk.bold.cyan("learn ")+chalk.white("ACxxxxxxxx")+chalk.gray(" โ†’ ai4ctf-12 (AI as your CTF teammate)")),console.log(" "+chalk.bold.cyan("learn ")+chalk.white("CAxxxxxxxx")+chalk.gray(" โ†’ ctf4ai-12 (red-team software AI)")),console.log(" "+chalk.bold.cyan("learn ")+chalk.white("EAxxxxxxxx")+chalk.gray(" โ†’ ctf4eai-12 (red-team embodied AI)")),console.log(" "+chalk.bold.cyan("exam ")+chalk.white("<CC>xxxxxxxx")+chalk.gray(" โ†’ Paper A/B/C/D/E (country exam token)")),console.log(" "+chalk.bold.cyan("demo")+chalk.gray(" โ†’ free practice")),console.log(" "+chalk.bold.cyan("lang")+chalk.white(" es")+chalk.gray(" โ†’ switch language")),console.log(" "+chalk.gray("help ยท menu ยท quit")),console.log()}function eo(){console.log(chalk.cyan.bold(" [๐Ÿค– ctf4eai โ€” Embodied AI Security]")),console.log(),console.log(chalk.bold.cyan(" CTF4VLA")+chalk.gray(" โ€” ICOA 2026's ")+chalk.bold.white("Pioneer Round")),console.log(chalk.gray(" an independent parallel track alongside the scored main events: ")+chalk.green("AI4CTF")+chalk.gray(" (Day 1) and ")+chalk.red("CTF4AI")+chalk.gray(" (Day 2)")),console.log(),console.log(chalk.white(" Embodied AI is at its ImageNet moment.")),console.log(chalk.gray(" VLA models, MuJoCo physics, real robot arms.")),console.log(chalk.gray(" Real models, real physics, real attack surfaces.")),console.log(),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€"));const o=O()>0||E()>0,e=S()>0,l=$(),n=T(),t=null!==n&&"number"==typeof n.completedAt&&n.nextCardIndex>=n.totalCards,a=null!==n&&!t;if(t)console.log(chalk.bold.yellow(" Continue: ")+chalk.bold.cyan("โ‘ฃ learn LEARNDEMO01")+chalk.gray(" (demo2 โœ“ ยท sim")+(e?chalk.gray(" โœ“ ยท sim arm โœ“)"):chalk.gray(")")));else if(a){const o=`${n.nextCardIndex} / ${n.totalCards}`;console.log(chalk.bold.yellow(" Continue: ")+chalk.bold.cyan("โ‘ข demo2")+chalk.gray(" (last left at card ")+chalk.bold.yellow(o)+chalk.gray(")"))}else o&&e?console.log(chalk.bold.yellow(" Next up: ")+chalk.bold.cyan("โ‘ข demo2")+chalk.gray(" โ†’ ")+chalk.bold.cyan("โ‘ฃ learn LEARNDEMO01")+chalk.gray(" (sim โœ“ ยท sim arm โœ“)")):l?console.log(chalk.bold.yellow(" Next up: ")+(e?chalk.bold.cyan("โ‘  sim")+chalk.gray(" โ†’ ")+chalk.bold.cyan("โ‘ข demo2"):chalk.bold.cyan("โ‘ก sim arm")+chalk.gray(" โ†’ ")+chalk.bold.cyan("โ‘ข demo2"))+chalk.gray(" โ†’ ")+chalk.bold.cyan("โ‘ฃ learn LEARNDEMO01")):console.log(chalk.bold.yellow(" First time? Try in order: ")+chalk.bold.cyan("โ‘  sim")+chalk.gray(" โ†’ ")+chalk.bold.cyan("โ‘ก sim arm")+chalk.gray(" โ†’ ")+chalk.bold.cyan("โ‘ข demo2")+chalk.gray(" โ†’ ")+chalk.bold.cyan("โ‘ฃ learn LEARNDEMO01"));console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(chalk.bold.green(" sim")+chalk.gray(" ")+chalk.bold.cyan("โ‘ ")+chalk.gray(" ")+chalk.bold.yellow("โ˜… INSTANT")+chalk.gray(" โ€” 8-robot group dance, no wait, no setup")),console.log(chalk.bold.green(" sim arm")+chalk.gray(" ")+chalk.bold.cyan("โ‘ก")+chalk.gray(" interactive 6-DOF arm sandbox โ€” type joint values, watch")),console.log(chalk.bold.green(" demo2")+chalk.gray(" ")+chalk.bold.cyan("โ‘ข")+chalk.gray(" ~8 min interactive intro + live MuJoCo sim")),console.log(chalk.bold.green(" learn LEARNDEMO01")+chalk.gray(" ")+chalk.bold.cyan("โ‘ฃ")+chalk.gray(" free 11-card intro (paste this command as-is)")),console.log(chalk.bold.green(" learn ")+chalk.bold.yellow("EA")+chalk.gray(" + 8 chars full 96 / 360 curriculum (team-issued)")),console.log(chalk.bold.green(" exam ")+chalk.bold.yellow("PDxxxxxxxx")+chalk.gray(" Paper D (CTF4VLA) โ€” national selection contestants")),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(),console.log(chalk.gray(" Three open tiers: ")+chalk.green("free 11")+chalk.gray(" ยท ")+chalk.yellow("registered 100")+chalk.gray(" ยท ")+chalk.bold.magenta("national team 480")+chalk.gray(" (PhD-ready)")),console.log(chalk.gray(" Country team contact: ")+chalk.cyan("australia@icoa2026.au")),console.log(),h(),console.log()}export async function startRepl(e,T){process.env.ICOA_INSIDE_REPL="1";const $=t(),S=n(),O=process.exit.bind(process),E=s();if($.demoCleanedForVersion!==X){try{const{existsSync:o,unlinkSync:e}=await import("node:fs"),{join:l}=await import("node:path"),{getIcoaDir:n}=await import("./lib/config.js"),t=l(n(),"demo-state.json");o(t)&&e(t)}catch{}a({demoCleanedForVersion:X})}const{select:D,confirm:to}=await import("@inquirer/prompts"),ao=$.mode||"",so=["instant","learn","selection","olympiad"].includes(ao)?ao:"selection",ro=[{name:` ${chalk.bold("โšก Try ICOA in 30 seconds")} ${chalk.gray("โ€”")} ${chalk.gray("watch ยท no token needed")}`,value:"instant"},{name:` ${chalk.bold("๐Ÿง  Learn")} ${chalk.gray("โ€”")} ${chalk.gray("AC / CA / EA token ยท skill up")}`,value:"learn"},{name:` ${chalk.bold("๐ŸŽฏ National Selection")} ${chalk.gray("โ€”")} ${chalk.gray("country exam token ยท aim for finals")}`,value:"selection"},{name:` ${chalk.bold("๐Ÿ† International Olympiad")} ${chalk.gray("โ€”")} ${chalk.gray("finals stage ยท Sydney 2026 ยท full sandbox")}`,value:"olympiad"},{name:` ${chalk.gray("โ„น๏ธ About ICOA")} ${chalk.gray("ยท")} ${chalk.gray("what this is ยท how to join")}`,value:"about"}];console.log(chalk.gray(" Use ")+chalk.yellow("โ†‘")+chalk.gray(" / ")+chalk.yellow("โ†“")+chalk.gray(" to select, ")+chalk.yellow("Enter")+chalk.gray(" to confirm. Type ")+chalk.bold.cyan("menu")+chalk.gray(" anywhere to return here.")),console.log();let io="";for(;!io;){const o=await D({message:"Mode",choices:ro,default:so||"selection"});"about"!==o?io=o:(console.clear(),console.log(),console.log(chalk.cyan(" โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•")),console.log(chalk.bold.yellow(" ICOA")+chalk.white(" โ€” AI-Native CLI OS for Cyber & AI Security")),console.log(chalk.gray(" Olympiad & Competition ยท K-12 to University")),console.log(chalk.cyan(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(),console.log(chalk.bold.white(" What Makes ICOA Different")),console.log(chalk.gray(" ยท AI-native AI teammate, AI adversary, AI translation")),console.log(chalk.gray(" ยท CLI OS Complete competition environment in terminal")),console.log(chalk.gray(" ยท 110 tools pwntools, z3, gdb, nmap, sleuthkit... pre-configured")),console.log(chalk.gray(" ยท Global scale 15,000+ concurrent exams ยท 15 languages")),console.log(),console.log(chalk.bold.white(" Competition Format (2-day standard + 1-day Pioneer)")),console.log(` ${chalk.green.bold("AI4CTF")}${chalk.gray(" [Day 1] AI as teammate โ€” speed track, dynamic decay + top-3 bonus")}`),console.log(` ${chalk.red.bold("CTF4AI")}${chalk.gray(" [Day 2] AI as target โ€” knowledge track, static value per challenge")}`),console.log(` ${chalk.cyan.bold("CTF4EAI")}${chalk.gray(" [Pioneer / Practical Round] Embodied AI โ€” VLA + world models + sim-to-real")}`),console.log(),console.log(chalk.bold.white(" Scoring (in brief)")),console.log(chalk.gray(" ยท Standard medals: AI4CTF + CTF4AI combined ยท 1/12 Gold ยท 2/12 Silver ยท 3/12 Bronze")),console.log(chalk.gray(" ยท HMA: top 50% on either day, total below bronze cutoff")),console.log(chalk.gray(" ยท CTF4EAI: separate 15-finalist pool, G/S/B + 12 Finalist Awards")),console.log(),console.log(chalk.white(" Sydney, Australia")+chalk.gray(" ยท Jun 27 - Jul 2, 2026")),console.log(),console.log(chalk.bold.white(" Organized by")+chalk.gray(" ASRA (Australia) ยท ICO Foundation Inc")),console.log(chalk.bold.white(" Contact ")+chalk.cyan(" australia@icoa2026.au ยท accreditation@icoa2026.au")),console.log(chalk.bold.white(" Website ")+chalk.cyan.underline(" https://icoa2026.au")),console.log(chalk.cyan(" โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•")),console.log(),console.log(chalk.gray(" Press ")+chalk.yellow("Enter")+chalk.gray(" to return...")),await new Promise(o=>{const e=l=>{process.stdin.removeListener("data",e),process.stdin.isTTY&&process.stdin.setRawMode&&process.stdin.setRawMode(!1),process.stdin.pause(),o()};process.stdin.isTTY&&process.stdin.setRawMode&&process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.once("data",e)}),console.clear())}if("olympiad"===io&&"olympiad"!==so&&(console.log(),console.log(chalk.yellow(" This mode will download ~500MB of CTF tools and AI models.")),await to({message:"Continue?",default:!0})||(io="selection",console.log(chalk.gray(" Switched to National Selection mode.")))),io!==so&&a({mode:io}),console.log(),"olympiad"===io&&m(X)){d(X),console.log(chalk.gray(" Checking competition environment..."));const{execSync:o}=await import("node:child_process"),e=[{name:"pwntools",cmd:'python3 -c "import pwn"'},{name:"z3-solver",cmd:'python3 -c "import z3"'},{name:"numpy",cmd:'python3 -c "import numpy"'},{name:"requests",cmd:'python3 -c "import requests"'}];let l=0;for(const n of e)try{o(n.cmd,{stdio:"ignore"})}catch{l++}if(l>0){console.log(chalk.yellow(` ${l} core libraries missing.`));try{const{confirm:o}=await import("@inquirer/prompts");if(await o({message:" Install competition Python libraries now?",default:!0,theme:{prefix:"",style:{message:o=>chalk.green(o),defaultAnswer:o=>chalk.green(o)}}})){console.log();const{execSync:o}=await import("node:child_process");o("icoa env setup",{stdio:"inherit"})}}catch{console.log(chalk.gray(" Run ")+chalk.white("env setup")+chalk.gray(" later to install."))}console.log()}else console.log(chalk.green(" All core libraries ready.")),console.log()}if(T){const o=y();if(o){const e=Math.floor(o.awaySeconds/60),l=o.awaySeconds%60;console.log(chalk.yellow(` Session resumed. Away: ${e}m ${l}s | Total exits: ${o.exitCount}`)),console.log()}}if("selection"===io)console.log(chalk.gray(" โ”€โ”€โ”€ exam hall ยท 90 min per paper once started ยท no pause โ”€โ”€โ”€")),console.log(),oo();else if("embodied"===io)eo();else if("instant"===io){console.log(chalk.cyan.bold(" [โšก Try ICOA in 30 seconds โ€” no token needed]")),console.log(),console.log(chalk.gray(" Pick what you want to see first:")),console.log();const o=[{name:` ${chalk.bold.green("โ˜… sim ")} ${chalk.gray("4-sec robot-arm video, bundled & offline ")}`+chalk.bold.yellow("โšก instant video"),value:"sim"},{name:` ${chalk.bold.green("โ˜… demo ")} ${chalk.gray("Paper A/B/C taste โ€” MCQ + ai4ctf + ctf4ai ")}`+chalk.bold.cyan("๐ŸŽฏ selection-style"),value:"demo"},{name:` ${chalk.bold.green("โ˜… demo2 ")} ${chalk.gray("embodied AI intro ยท pops up live MuJoCo physics ")}`+chalk.bold.cyan("๐Ÿค– embodied-style"),value:"demo2"},{name:` ${chalk.gray("โ†ฉ back to main menu")}`,value:"menu"}];let l="menu";try{l=await D({message:"Pick",choices:o,default:"sim"})}catch{}if("menu"!==l){console.log();try{await e.parseAsync(["node","icoa",l])}catch{}}a({mode:"selection"}),io="selection",console.log(),oo()}else if("learn"===io){console.log(chalk.cyan.bold(" [๐Ÿง  Learn โ€” pick a track]")),console.log(),console.log(chalk.gray(" Three tracks ยท same difficulty curve ยท pick what excites you.")),console.log();const o=[{name:` ${chalk.bold("๐Ÿค ai4ctf")} ${chalk.gray("โ€”")} ${chalk.gray("AI as your teammate ยท ")}${chalk.cyan("AC")}${chalk.gray(" + 8 chars")}`,value:"ai4ctf"},{name:` ${chalk.bold("๐Ÿ”“ ctf4ai")} ${chalk.gray("โ€”")} ${chalk.gray("AI as your target ยท ")}${chalk.cyan("CA")}${chalk.gray(" + 8 chars")}`,value:"ctf4ai"},{name:` ${chalk.bold("๐Ÿค– ctf4eai")} ${chalk.gray("โ€”")} ${chalk.gray("Embodied AI Security ยท ")}${chalk.cyan("EA")}${chalk.gray(" + 8 chars ยท sim + demo2 included")}`,value:"ctf4eai"},{name:` ${chalk.gray("โ†ฉ back to main menu")}`,value:"back"}],l=await D({message:"Track",choices:o,default:"ctf4eai"});if("back"===l)console.clear(),io="selection",oo();else if("ctf4eai"===l)console.log(),io="embodied",a({mode:"embodied"}),eo();else{const o="ai4ctf"===l?{emoji:"๐Ÿค",tagline:"AI as your teammate โ€” speed-track CTF with an AI partner you can talk to.",prefix:"AC",demoToken:"AI4CTFDEMO01"}:{emoji:"๐Ÿ”“",tagline:"AI as your target โ€” red-team a language model. Find the jailbreak, claim the flag.",prefix:"CA",demoToken:"CTF4AIDEMO01"};console.log(),console.log(chalk.cyan.bold(` [${o.emoji} ${l} โ€” issued learn token]`)),console.log(),console.log(chalk.white(" "+o.tagline)),console.log(),console.log(chalk.gray(" Token format: ")+chalk.cyan(o.prefix)+chalk.gray(" + 8 chars (issued by your country/cohort lead)")),console.log(chalk.gray(" No token? Type ")+chalk.bold.green(o.demoToken)+chalk.gray(" below for the free 12-card demo.")),console.log();let n=!1;try{const{input:o}=await import("@inquirer/prompts"),l=(await o({message:" Learn token (or blank to skip):"})).trim();l&&(n=!0,console.log(),console.log(chalk.gray(" Opening ")+chalk.bold.cyan("learn")+chalk.gray(`: ${l}`)),console.log(),a({mode:"selection"}),await e.parseAsync(["node","icoa","learn",l]))}catch{}n||console.clear(),io="selection",oo()}}else"organizer"===io?(console.log(chalk.yellow.bold(" [National/Regional Partner]")),console.log(),console.log(chalk.bold.white(" โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—")),console.log(chalk.bold.white(" โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—")),console.log(chalk.bold.white(" โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘")),console.log(chalk.bold.white(" โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•‘")),console.log(chalk.bold.white(" โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘")),console.log(chalk.bold.white(" โ•šโ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ• โ•šโ•โ•")),console.log(),console.log(chalk.yellow(" International Cyber Olympiad in AI 2026")),console.log(chalk.bold.magenta(" The World's First AI-Native CLI Operating System")),console.log(chalk.bold.magenta(" for Cybersecurity & AI Security Competition")),console.log(chalk.bold.magenta(" and Olympiad for K-12")),console.log(chalk.gray(" Sydney, Australia ยท Jun 27 - Jul 2, 2026")),console.log(),console.log(chalk.white(" Vision")),console.log(chalk.gray(" Building a global pipeline for youth cyber & AI")),console.log(chalk.gray(" security talent through education and competition.")),console.log(),console.log(chalk.white(" Capacity")),console.log(chalk.gray(" 15,000+ concurrent online examinations")),console.log(chalk.gray(" National selection, training, and education support")),console.log(),console.log(chalk.white(" Olympic Spirit")),console.log(chalk.gray(" Excellence ยท Friendship ยท Respect")),console.log(),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(chalk.white(" New country accreditation & support:")),console.log(chalk.cyan(" australia@icoa2026.au")),console.log(chalk.cyan(" accreditation@icoa2026.au")),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(),S?(console.log(chalk.green(` Logged in as ${$.userName}`)),console.log(chalk.white(" exam list")+chalk.gray(" Manage exams")),console.log(chalk.white(" logout")+chalk.gray(" Disconnect"))):console.log(chalk.white(" join <url>")+chalk.gray(" Connect to manage exams")),console.log(),h(),console.log()):(console.log(` ${chalk.cyan.bold("๐Ÿ† ICOA 2026 ยท International Olympiad")}`),console.log(),E&&!c()?(console.log(chalk.red(" Token was activated on a different device.")),console.log(chalk.gray(" Contact organizer for assistance.")),console.log()):S?(console.log(chalk.green.bold(` Welcome back, ${$.userName}!`)),console.log(chalk.gray(` Connected to ${$.ctfdUrl}`)),console.log(),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(chalk.white(" Ready to compete? Start here:")),console.log(),console.log(chalk.bold.cyan(" challenges")+chalk.gray(" Browse challenges by category")),console.log(chalk.white(" status")+chalk.gray(" Your score & hint budget")),console.log(chalk.white(" scoreboard")+chalk.gray(" Live rankings")),console.log(chalk.white(" help")+chalk.gray(" Full command list")),console.log(),console.log(chalk.gray(" Tool environment:")),console.log(chalk.white(" env")+chalk.gray(" See which of the 110 CTF tools are installed")),console.log(chalk.white(" env setup")+chalk.gray(" Install anything missing (~5 min, one-time)")),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(chalk.gray(" Tip: ")+chalk.cyan("help")+chalk.gray(" ยท ")+w()+chalk.gray(" ยท ")+chalk.cyan("Ctrl+C")+chalk.gray(" pauses ยท ")+chalk.cyan("quit")+chalk.gray(" closes")),console.log()):E?(W(H)||Y(H,{recursive:!0}),console.log(chalk.green.bold(" Welcome, competitor!")),console.log(chalk.gray(` Workspace: ${H}`)),console.log(),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(chalk.white(" Get started:")),console.log(),console.log(chalk.white(" Step 1 ")+chalk.bold.cyan("join <url>")+chalk.gray(" Connect to competition server")),console.log(chalk.white(" Step 2 ")+chalk.bold.cyan("challenges")+chalk.gray(" Browse & solve challenges")),console.log(chalk.white(" Step 3 ")+chalk.bold.cyan("ai4ctf")+chalk.gray(" Ask AI when stuck")),console.log(),console.log(chalk.gray(" Before Step 1 โ€” make sure your tools are ready:")),console.log(chalk.white(" env")+chalk.gray(" See which of the 110 CTF tools are installed")),console.log(chalk.white(" env setup")+chalk.gray(" Install anything missing (~5 min, one-time)")),console.log(),console.log(chalk.gray(" Also: ")+chalk.white("help")+chalk.gray(" all commands")),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(chalk.gray(" Tip: ")+chalk.cyan("Ctrl+C")+chalk.gray(" pauses ยท ")+w()+chalk.gray(" ยท ")+chalk.cyan("quit")+chalk.gray(" closes CLI")),console.log()):(console.log(chalk.bold.yellow(" ๐Ÿ† You reached the finals tier.")),console.log(chalk.gray(" Full sandbox ยท 110 CTF tools ยท Sydney 2026 ยท this is where finalists compete.")),console.log(),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(chalk.white(" To begin, activate your competition token:")),console.log(),console.log(chalk.bold.cyan(" activate <token>")),console.log(),console.log(chalk.gray(" While waiting, explore:")),console.log(chalk.white(" ref linux")+chalk.gray(" Quick reference for Linux")),console.log(chalk.white(" ref web")+chalk.gray(" Quick reference for Web")),console.log(chalk.white(" env")+chalk.gray(" See which of the 110 CTF tools are installed")),console.log(chalk.white(" env setup")+chalk.gray(" Install anything missing (~5 min, one-time)")),console.log(chalk.white(" help")+chalk.gray(" All available commands")),console.log(chalk.gray(" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€")),console.log(chalk.gray(" Tip: ")+chalk.cyan("Ctrl+C")+chalk.gray(" pauses ยท ")+w()+chalk.gray(" ยท ")+chalk.cyan("quit")+chalk.gray(" closes CLI")),console.log()));e.exitOverride(),e.configureOutput({writeErr:()=>{},writeOut:o=>{console.log(o)}});const co=o({input:process.stdin,output:process.stdout,prompt:G(),terminal:!0});f(co);let go=!1;p(!0),Q();const yo=co.prompt.bind(co);co.prompt=o=>{b()||v()||A()||I()||co.setPrompt(G()),yo(o)},co.prompt(),co.on("line",async o=>{if(go)return;const n=o.trim();if(!n)return co.setPrompt(b()?chalk.magenta("ai4ctf> "):G()),void co.prompt();if("menu"===n||"menu confirm"===n)return j()&&"menu confirm"!==n?(console.log(),console.log(chalk.yellow(" Real exam active. Progress is auto-saved.")),console.log(chalk.gray(" To return to main menu anyway, type ")+chalk.white("menu confirm")),console.log(),void co.prompt()):void u(co);if(b()){go=!0;const o=await x(n);return go=!1,"exit"===o&&co.setPrompt(G()),void co.prompt()}if(v()){go=!0;const o=await C(n);return go=!1,"exit"!==o&&"solved"!==o||co.setPrompt(G()),void co.prompt()}if(A()){go=!0;const o=await k(n);return go=!1,"exit"===o&&co.setPrompt(G()),co.setPrompt(A()?chalk.bold.cyan("ctf4vla> "):G()),void co.prompt()}if(U(n),"exit"===n)return L()?(console.log(),console.log(chalk.yellow(" โš  An exam is in progress.")),console.log(chalk.white(" To return to menu without losing progress, type: ")+chalk.bold.cyan("back")),console.log(chalk.white(" To fully close ICOA CLI, type: ")+chalk.bold.cyan("quit")),console.log(chalk.gray(" Your progress is auto-saved either way.")),console.log(),void co.prompt()):(console.log(),console.log(chalk.gray(" ")+chalk.white("exit")+chalk.gray(" returns to the main menu. To fully close ICOA CLI, type ")+chalk.bold.cyan("quit")+chalk.gray(".")),"selection"===io&&oo(),void co.prompt());if("quit"===n||"q"===n||"quit confirm"===n){const o=L();return o&&"demo-free"!==o.session.examId&&"quit confirm"!==n?(console.log(),console.log(chalk.yellow(" โš  A real exam is in progress.")),console.log(chalk.gray(" Your answers are auto-saved on the server, but the exam timer keeps ticking")),console.log(chalk.gray(" on the server side even if you close the CLI.")),console.log(),console.log(chalk.white(" To leave the CLI but keep the exam alive, type: ")+chalk.bold.cyan("back")),console.log(chalk.gray(" (recommended โ€” you can resume with ")+chalk.cyan("exam q 1")+chalk.gray(" after relaunching icoa)")),console.log(),console.log(chalk.white(" To really close ICOA CLI, type: ")+chalk.bold.cyan("quit confirm")),console.log(),void co.prompt()):(o&&"demo-free"===o.session.examId&&(console.log(),console.log(chalk.gray(" Demo paused. Resume with: ")+chalk.white("demo")+chalk.gray(" (fresh) or ")+chalk.white("exam q 1")+chalk.gray(" (continue)."))),_(),g(),console.log(chalk.gray(" Session saved. Use ")+chalk.white("icoa --resume")+chalk.gray(" to continue.")),P(),void O(0))}if("back"===n){const o=L(),e=o&&"demo-free"!==o.session.examId,l=o&&"demo-free"===o.session.examId&&(()=>{const e=new Date(o.session.startedAt||0).getTime();return Date.now()-e<18e5})();if(e)console.log(),console.log(chalk.gray(" Exam paused. Your progress is saved.")),console.log(chalk.white(" Resume: exam q 1")+chalk.gray(" ยท ")+chalk.white("exam review")+chalk.gray(" ยท ")+chalk.white("exam submit")),console.log();else if(l){const e=Object.keys(o.answers).length,l=o.session.questionCount;console.log(),console.log(chalk.gray(` Demo paused (${e}/${l} answered). Resume with: `)+chalk.white("exam q 1")),console.log(chalk.gray(" Or type ")+chalk.white("demo")+chalk.gray(" to restart.")),console.log()}else{if(o&&"demo-free"===o.session.examId){const{clearExamState:o}=await import("./lib/exam-state.js");o("demo-free")}const e=t();fetch("https://practice.icoa2026.au/api/icoa/demo-stats",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({type:"post-report-back",lang:e.language||"en",timestamp:(new Date).toISOString()}),signal:AbortSignal.timeout(5e3)}).catch(()=>{}),"selection"===io?oo():console.log(chalk.gray(" Already at main menu."))}return void co.prompt()}if("help"===n||"?"===n){if(L()){go=!0;try{await e.parseAsync(["node","icoa","exam","help"])}catch{}return go=!1,void co.prompt()}return no(s(),io),void co.prompt()}if("man"===n||"manual"===n)return no(s(),io),void co.prompt();if("more help"===n.toLowerCase()&&L()){go=!0;try{await e.parseAsync(["node","icoa","exam","more-help"])}catch{}return go=!1,void co.prompt()}if("continue"===n.toLowerCase())return console.log(),console.log(chalk.green.bold(" โ•โ•โ• AI4CTF โ€” AI as Your Teammate โ•โ•โ•")),console.log(),console.log(chalk.white(" In AI4CTF, you solve cybersecurity challenges")),console.log(chalk.white(" with AI by your side.")),console.log(),console.log(chalk.white(" In competition, you get AI help at 3 levels:")),console.log(chalk.yellow(" hint a")+chalk.gray(" General guidance (50 uses)")),console.log(chalk.yellow(" hint b")+chalk.gray(" Deep analysis (10 uses)")),console.log(chalk.yellow(" hint c")+chalk.gray(" Critical assist (2 uses)")),console.log(),console.log(chalk.white(" Try it now! Type: ")+chalk.bold.green("ai4ctf")),console.log(chalk.gray(' Chat freely with your AI teammate. Type "exit" when done.')),console.log(),console.log(chalk.gray(" After ai4ctf, try: ")+chalk.bold.red("ctf4ai")+chalk.gray(' โ€” trick the AI into saying "koala"')),console.log(),void co.prompt();if(/^ICOA-[A-Z]{2,3}-\d{1,6}$/i.test(n.trim())){go=!0;try{await e.parseAsync(["node","icoa","exam","token",n.trim()])}catch{}return go=!1,void co.prompt()}if(/^[A-Z]{2}[0-9A-HJKMNP-TV-Z]{8}$/i.test(n.trim())){go=!0;try{await e.parseAsync(["node","icoa","exam","token",n.trim().toUpperCase()])}catch{}return go=!1,void co.prompt()}const a=n.match(/^exam\s+([A-Z]{2}[0-9A-HJKMNP-TV-Z]{8})$/i);if(a){go=!0;try{await e.parseAsync(["node","icoa","exam","token",a[1].toUpperCase()])}catch{}return go=!1,void co.prompt()}const y=n.match(/^exam\s+([A-Z]{2,3})$/i);if(y){go=!0;try{await e.parseAsync(["node","icoa","exam","list",y[1]])}catch{}return go=!1,void co.prompt()}if("clear"===n||"cls"===n)return console.clear(),void co.prompt();if(n.startsWith("activate ")){const o=n.slice(9).trim(),e=r(o);return"ok"===e?console.log(chalk.green(" Access granted! Token bound to this device.")):"already_bound"===e?(console.log(),console.log(chalk.red(" Token already activated on a different device.")),console.log(chalk.gray(" Each token binds to the first device that uses it. If you lost the device,")),console.log(chalk.gray(" contact your proctor to have the token re-issued for a new device."))):(console.log(),console.log(chalk.red(" Token not recognized.")),console.log(chalk.gray(" Possible reasons:")),console.log(chalk.white(" โ€ข ")+chalk.gray("Typo โ€” tokens are case-insensitive, 10 chars, start with a 2-letter country code (e.g. ")+chalk.cyan("UAK7M2R9Q4")+chalk.gray(")")),console.log(chalk.white(" โ€ข ")+chalk.gray("Expired โ€” ask your proctor or organizer for a fresh token")),console.log(chalk.white(" โ€ข ")+chalk.gray("Network โ€” verify connection to ")+chalk.cyan("practice.icoa2026.au")),console.log(chalk.gray(" Still stuck? type ")+chalk.cyan("help")+chalk.gray(" or try ")+chalk.cyan("exam demo")+chalk.gray(" for a free practice round."))),console.log(),void co.prompt()}if("activate"===n)return console.log(chalk.gray(" Usage: ")+chalk.white("activate <token>")),console.log(),void co.prompt();const m=L();if(m){const o=n.toUpperCase().trim(),l=o=>{const e=m.questions.find(e=>e.number===o);return!!e&&("ai4ctf"===e.type||"ctf4ai"===e.type||e.options&&!e.options.A&&!e.options.B)},t=o=>{const e="demo-free"!==m.session.examId,l=e&&o>=39?"ctf4ai":e&&o>=31?"ai4ctf":null;console.log(),console.log(chalk.yellow(` Q${o} is a practical question โ€” letters (A/B/C/D) don't apply here.`)),l?(console.log(chalk.white(" Enter the AI chat for this question: ")+chalk.bold.cyan(l)),console.log(chalk.gray(" Or submit a flag directly: ")+chalk.green(`exam answer ${o} ICOA{your_flag}`))):console.log(chalk.gray(" Submit a flag: ")+chalk.green(`exam answer ${o} ICOA{your_flag}`)),console.log()};if(/^[ABCD]$/.test(o)){const n=m._lastQ||1;if(l(n))return t(n),void co.prompt();go=!0;try{await e.parseAsync(["node","icoa","exam","answer",String(n),o])}catch{}return go=!1,void co.prompt()}const a=o.match(/^(\d+)\s+([ABCD])$/);if(a){const o=parseInt(a[1],10);if(l(o))return t(o),void co.prompt();go=!0;try{await e.parseAsync(["node","icoa","exam","answer",a[1],a[2]])}catch{}return go=!1,void co.prompt()}}const d=n.split(/\s+/)[0].toLowerCase(),p=/^python3?(\.\d+)?$/.test(d),h="ls"===d||"pwd"===d,w=n.startsWith("!")||d.startsWith("!")||p||h,f=new Set(["nano","vi","vim","emacs","pico","ed","code","cat","less","more","head","tail","ls","pwd","cd","base64","xxd","hexdump","od","openssl","md5sum","sha256sum","grep","find","awk","sed","strings","file","curl","wget","nc","ping","nmap","echo","bash","sh","zsh","pip","pip3","node","npm"]),I=()=>{console.log(chalk.gray(" Shell commands need ")+chalk.bold.cyan("!")+chalk.gray(" prefix. Try: ")+chalk.bold.cyan(`!${n}`)),console.log()};if("embodied"===io&&!w&&!["demo2","learn","exam","ctf4vla","lang","ref","setup","env","sim"].includes(d))return f.has(d)?(I(),void co.prompt()):(console.log(chalk.gray(" Not available in Embodied AI Security mode.")),console.log(chalk.white(" Try ")+chalk.bold.cyan("demo2")+chalk.gray(" (intro) ยท ")+chalk.bold.cyan("learn")+chalk.gray(" (curriculum) ยท ")+chalk.bold.cyan("exam <PD-token>")+chalk.gray(" (Paper D)")),console.log(),void co.prompt());if("selection"===io&&!w&&!["exam","demo","retry","nations","next","prev","continue","setup","lang","ref","ai4ctf","ctf4ai","mark","unmark","review","submit","env","sim"].includes(d)){if(f.has(d))return I(),void co.prompt();if(console.log(chalk.gray(" Not available in Selection mode.")),m){const o=m._lastQ||1;console.log(chalk.white(` Resume exam: exam q ${o}`)+chalk.gray(" ยท ")+chalk.white("A/B/C/D")+chalk.gray(" to answer"))}else console.log(chalk.gray(" Try: demo ยท setup to switch mode"));return console.log(),void co.prompt()}if("organizer"===io&&!["join","exam","demo","retry","next","prev","logout","setup","lang","ref","ctf","mark","unmark","review","submit"].includes(d))return console.log(chalk.gray(" Not available in Organizer mode. Switch via: setup")),console.log(),void co.prompt();if(!("olympiad"!==io||s()&&c()||i(d)))return console.log(chalk.yellow(" Restricted mode. ")+chalk.gray("Enter your access token:")),console.log(chalk.white(" activate <token>")),console.log(),console.log(chalk.gray(" Free commands: ")+chalk.white("ref [topic]")+chalk.gray(", ")+chalk.white("help")+chalk.gray(", ")+chalk.white("exit")),console.log(),void co.prompt();if(!["join","activate","challenges","ch","open","submit","flag","scoreboard","sb","status","time","ref","shell","files","connect","note","notes","logbook","log","man","manual","lang","setup","env","ai4ctf","model","ctf","exam","demo","retry","nations","next","prev","continue","logout","ctf4ai","mark","unmark","review","submit","learn","demo2","ctf4vla","theme","sim"].includes(d)){if(K.has(d))return console.log(chalk.yellow(` "${d}" is a shell command โ€” the ICOA prompt isn't a shell.`)),console.log(chalk.gray(" In real-exam mode, prefix with ! to run inside the sandbox: ")+chalk.cyan(`!${n}`)),console.log(),void co.prompt();if(/(?:^|\s)(?:\/(?!home\/|Users\/|tmp\/)|\.\.\/|~\/)/.test(n)&&!n.startsWith("cd ")){const o=/(?:^|\s)\/(?!home\/\w+\/icoa-workspace|Users\/\w+\/icoa-workspace|tmp\/)/.test(n),e=/\.\./.test(n);if(o||e)return console.log(chalk.red(" Blocked: access outside workspace is not allowed.")),console.log(chalk.gray(` Workspace: ${H}`)),console.log(),void co.prompt()}let o=n.startsWith("!")?n.slice(1).trim():n;if("darwin"===process.platform){const e="/opt/homebrew/opt/python@3.12/bin/python3.12";o=o.replace(/^python3?\s/,`${e} `).replace(/^(python3|python)$/,e)}else if("win32"===process.platform){const e=(()=>{try{return l("py -3 --version",{stdio:["ignore","ignore","ignore"],timeout:1500}),"py -3"}catch{}return"python"})();o=o.replace(/^python3?(\.\d+)?\s/,`${e} `).replace(/^python3?(\.\d+)?$/,e)}else{const e=(()=>{try{return l("which python3.12",{stdio:"ignore"}),"python3.12"}catch{return"python3"}})();o=o.replace(/^python\s/,`${e} `).replace(/^python$/,e)}const e=B(),t=N(n);M({cwd:e,input:n,riskFlags:t}),t.length>0&&j()&&(console.log(chalk.yellow(` โš  Action flagged: ${t.join(", ")} โ€” logged.`)),console.log()),/^(\S*python3?(\.\d+)?)\s*$/.test(o)&&(o=`PYTHONSTARTUP="${function(){const o=V(J(),".icoa");W(o)||Y(o,{recursive:!0});const e=V(o,"python-startup.py");return W(e)||z(e,"# ICOA exam interactive startup โ€” auto-loaded by PYTHONSTARTUP\nimport base64, struct, hashlib, re, json, os, sys, binascii\ntry: import requests\nexcept ImportError: pass\ntry: from Crypto.Cipher import AES\nexcept ImportError: pass\ntry: from Crypto.Util.Padding import pad, unpad\nexcept ImportError: pass\ntry: from pwn import xor, p32, u32, p64, u64\nexcept ImportError: pass\ntry: import bs4\nexcept ImportError: pass\ntry: import numpy as np\nexcept ImportError: pass\n"),e}()}" ${o}`,console.log(),console.log(chalk.cyan(" โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”")),console.log(chalk.bold.white(" Python ready โ€” ICOA exam toolkit pre-loaded")),console.log(chalk.cyan(" โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”")),console.log(),console.log(chalk.white(" Already imported: ")+chalk.gray("base64, struct, hashlib, re, json, binascii")),console.log(chalk.white(" Also available: ")+chalk.gray("requests, bs4, numpy, AES, pad/unpad, xor, p32/u32/p64/u64")),console.log(),console.log(chalk.yellow(" Quick examples:")),console.log(chalk.gray(' base64.b64decode("aGVsbG8=") ')+chalk.gray("# decode base64")),console.log(chalk.gray(' bytes.fromhex("48656c6c6f") ')+chalk.gray("# hex โ†’ bytes")),console.log(chalk.gray(' "ICOA{x}".encode() ')+chalk.gray("# str โ†’ bytes")),console.log(chalk.gray(" [chr(c) for c in [73,67,79,65]] ")+chalk.gray("# ASCII codes")),console.log(chalk.gray(' xor(bytes.fromhex("0a2b"), b"IC") ')+chalk.gray("# pwntools XOR")),console.log(),console.log(chalk.gray(" Exit: ")+chalk.white("exit()")+chalk.gray(" or Ctrl-D")),console.log(chalk.cyan(" โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”")),console.log()),go=!0;try{F()&&await R()?await q(o,co):await lo(o,co,e)}catch{console.log(chalk.yellow(` Command failed: ${d}`))}return go=!1,console.log(),void co.prompt()}go=!0;const T=n.trim(),$=T.toLowerCase();let S,E=null,D="";if(m)if("submit"===$)E="final";else if($.startsWith("submit ")){let o=T.slice(7).trim();/^submit\s+/i.test(o)&&(o=o.replace(/^submit\s+/i,"").trim()),o=o.replace(/^["'`]+|["'`]+$/g,"").trim(),o&&/^ICOA\{[^}]*\}?$/i.test(o)&&(E="flag",D=o)}else/^ICOA\{[^}]+\}$/i.test(T)&&(E="flag",D=T);S="final"===E?["exam","submit"]:"flag"===E?["exam","answer",String(m?._lastQ||1),D]:function(o){const e=o.split(/\s+/),l=e[0].toLowerCase(),n=e.slice(1),t={demo:["exam","demo"],retry:["exam","demo-retry"],nations:["exam","nations"],next:["exam","next"],prev:["exam","prev"],mark:["exam","mark",...n],unmark:["exam","unmark",...n],review:["exam","review"],logout:["ctf","logout"],join:["ctf","join",...n],activate:["ctf","activate",...n],challenges:["ctf","challenges"],ch:["ctf","challenges"],open:["ctf","open",...n],submit:["ctf","submit",...n],flag:["ctf","submit",...n],scoreboard:["ctf","scoreboard",...n],sb:["ctf","scoreboard",...n],status:["ctf","status"],time:["ctf","time"]};return t[l]?t[l]:["ref","shell","files","connect","note","notes","logbook","log","man","manual","lang","setup","env","ai4ctf","model","ctf","exam","ctf4ai"].includes(l)?[l,...n]:e}(n);const Q="ctf"===S[0]&&"join"===S[1];Q&&co.pause(),process.exit=()=>{throw new Error(Z)};try{await e.parseAsync(["node","icoa",...S])}catch(o){const e=o instanceof Error?o.message:String(o);if(e===Z);else if(e.includes("commander.unknownCommand")){const{distance:o}=await import("fastest-levenshtein"),e=["ctf","ref","shell","files","connect","note","notes","logbook","log","manual","lang","setup","env","ai4ctf","exam","ctf4ai","theme","clear","cls","quit","exit","back","menu","help","continue","activate","demo","challenges","status","scoreboard","join","logout"],l=d.split(/\s+/)[0]||d;let n={word:"",dist:1/0};for(const t of e){const e=o(l.toLowerCase(),t);e<n.dist&&(n={word:t,dist:e})}console.log(chalk.yellow(` Unknown command: ${d}.`)),n.dist>0&&n.dist<=2&&console.log(chalk.gray(" Did you mean: ")+chalk.bold.cyan(n.word)+chalk.gray("?")),console.log(chalk.gray(" Type ")+chalk.cyan("help")+chalk.gray(" for the full command list."))}else e.includes("commander.")||(e.includes("fetch failed")||e.includes("ECONNREFUSED")||e.includes("ETIMEDOUT"))&&console.log(chalk.yellow(" Network error. Check your connection."))}finally{process.exit=O,go=!1,Q&&co.resume()}b()?co.setPrompt(chalk.magenta("ai4ctf> ")):v()?co.setPrompt(chalk.red("ctf4ai> ")):A()&&co.setPrompt(chalk.bold.cyan("ctf4vla> ")),console.log(),co.prompt()}),co.on("SIGINT",()=>{if(console.log(),b()||v())console.log(chalk.yellow(" Ctrl+C did not close ICOA CLI โ€” you are still in the AI chat.")),console.log(chalk.white(" Type ")+chalk.bold.cyan("exit")+chalk.white(" to leave the chat and return to the menu."));else if(L()){const o="demo-free"!==L().session.examId;console.log(chalk.yellow(" Ctrl+C did NOT close ICOA CLI.")),console.log(chalk.gray(` Your ${o?"exam":"demo"} is paused and every answer is auto-saved.`)),console.log(),console.log(chalk.white(" Resume: ")+chalk.cyan("exam q 1")+chalk.gray(" ยท Back to menu: ")+chalk.cyan("back")+chalk.gray(" ยท Close CLI: ")+chalk.cyan(o?"quit confirm":"quit"))}else console.log(chalk.yellow(" Ctrl+C did not close ICOA CLI โ€” you are still at the ")+chalk.cyan("icoa>")+chalk.yellow(" prompt.")),console.log(chalk.gray(" Keep typing โ€” ")+chalk.cyan("help")+chalk.gray(" lists commands. (Only ")+chalk.cyan("quit")+chalk.gray(" or Ctrl+D actually close the CLI.)"));console.log(),co.prompt()}),co.on("close",()=>{_(),g(),P(),O(0)})}function lo(o,l,n){return new Promise(t=>{const a=process.stdin,s=!!a.isTTY&&!!a.isRaw;if(l.pause(),a.isTTY&&"function"==typeof a.setRawMode)try{a.setRawMode(!1)}catch{}const r=e(o,{shell:!0,stdio:"inherit",cwd:n||process.cwd()}),i=()=>{if(a.isTTY&&"function"==typeof a.setRawMode&&s)try{a.setRawMode(!0)}catch{}l.resume(),t()};r.on("close",i),r.on("error",i)})}function no(o,e="olympiad"){return console.log(),"selection"===e||"organizer"===e?(console.log(chalk.bold.white(" Exam")),console.log(chalk.white(" join <url> ")+chalk.gray("Connect to exam server")),console.log(chalk.white(" exam list ")+chalk.gray("Available exams")),console.log(chalk.white(" exam start <id> ")+chalk.gray("Begin an exam")),console.log(chalk.white(" exam q [n] ")+chalk.gray("View questions")),console.log(chalk.white(" exam answer <n> <X> ")+chalk.gray("Answer question")),console.log(chalk.white(" exam review ")+chalk.gray("Review all answers")),console.log(chalk.white(" exam submit ")+chalk.gray("Submit for grading")),console.log(chalk.white(" exam result ")+chalk.gray("View your score")),console.log(),console.log(chalk.bold.white(" System")),console.log(chalk.white(" ref [topic] ")+chalk.gray("Quick reference")),console.log(chalk.white(" setup ")+chalk.gray("Settings / switch mode")),console.log(chalk.white(" lang [code] ")+chalk.gray("Switch language")),console.log(chalk.white(" clear ")+chalk.gray("Clear screen")),console.log(chalk.white(" exit ")+chalk.gray("Quit")),void console.log()):o?(console.log(chalk.cyan(" โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•")),console.log(chalk.bold.white(" How it works")),console.log(),console.log(chalk.gray(" 1. Browse ")+chalk.white("challenges")+chalk.gray(" and pick one")),console.log(chalk.gray(" 2. ")+chalk.white("open <id>")+chalk.gray(" to read the challenge")),console.log(chalk.gray(" 3. Use ")+chalk.white("ai4ctf")+chalk.gray(" to chat with AI when stuck")),console.log(chalk.gray(" 4. ")+chalk.white("submit <id> icoa{flag}")+chalk.gray(" to score points")),console.log(chalk.gray(" 5. Check ")+chalk.white("scoreboard")+chalk.gray(" to track your rank")),console.log(chalk.cyan(" โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•")),console.log(),console.log(chalk.bold.white(" Competition")),console.log(chalk.white(" join <url> ")+chalk.gray("Connect to CTFd")),console.log(chalk.white(" challenges (ch) ")+chalk.gray("List challenges by category")),console.log(chalk.white(" open <id> ")+chalk.gray("Read challenge + get next steps")),console.log(chalk.white(" submit <id> <flag> ")+chalk.gray("Submit a flag")),console.log(chalk.white(" scoreboard (sb) ")+chalk.gray("Live rankings")),console.log(chalk.white(" status ")+chalk.gray("Your score, budget & timer")),console.log(chalk.white(" time ")+chalk.gray("Countdown timer")),console.log(),console.log(chalk.bold.white(" AI Teammate")+chalk.gray(" โ€” 3 levels, use wisely")),console.log(chalk.white(' hint "question" ')+chalk.gray("Level A โ€” General guidance (50 uses)")),console.log(chalk.white(' hint-b "question" ')+chalk.gray("Level B โ€” Deep analysis (10 uses)")),console.log(chalk.white(' hint-c "question" ')+chalk.gray("Level C โ€” Critical assist (2 uses)")),console.log(chalk.white(" hint budget ")+chalk.gray("Check remaining uses")),console.log(chalk.white(" ai4ctf ")+chalk.gray("Free-chat with AI (no limit)")),console.log(),console.log(chalk.bold.white(" Tools")),console.log(chalk.white(" ref [topic] ")+chalk.gray("Quick reference (linux, web, crypto...)")),console.log(chalk.white(" shell ")+chalk.gray("Docker sandbox")),console.log(chalk.white(" files <id> ")+chalk.gray("Download challenge files")),console.log(chalk.white(" connect <id> ")+chalk.gray("Connect to remote target")),console.log(chalk.white(" note [text] ")+chalk.gray("Add a logbook entry (in-exam: tags current Q)")),console.log(chalk.white(" logbook [n] ")+chalk.gray("View your logbook (in-exam: filter by Q)")),console.log(chalk.white(" log ")+chalk.gray("Session history")),console.log(chalk.white(" man / manual ")+chalk.gray("Show this command list (works in exam too, does not burn elimination)")),console.log(),console.log(chalk.bold.white(" System")),console.log(chalk.white(" setup ")+chalk.gray("Configure settings")),console.log(chalk.white(" lang [code] ")+chalk.gray("Switch language (15 supported)")),console.log(chalk.white(" logout ")+chalk.gray("Disconnect")),console.log(chalk.white(" clear ")+chalk.gray("Clear screen")),console.log(chalk.white(" exit ")+chalk.gray("Quit (session saved)")),void console.log()):(console.log(chalk.bold.yellow(" Restricted Mode โ€” activate with a token to unlock all commands")),console.log(),console.log(chalk.white(" activate <token> ")+chalk.gray("Unlock full access")),console.log(chalk.white(" ref [topic] ")+chalk.gray("Quick reference")),console.log(chalk.white(" exit ")+chalk.gray("Quit")),void console.log())}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "icoa-cli",
3
- "version": "2.19.214",
3
+ "version": "2.19.215",
4
4
  "description": "ICOA CLI โ€” The world's first CLI-native cyber & AI security olympiad terminal: AI4CTF (Day 1), CTF4AI (Day 2), VLA4CTF (Pioneer Round โ€” embodied AI)",
5
5
  "type": "module",
6
6
  "bin": {