icoa-cli 2.19.184 → 2.19.185

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
- import{createHash as e}from"node:crypto";import{execSync as c}from"node:child_process";import{hostname as a,platform as f,arch as d,networkInterfaces as b}from"node:os";import{getConfig as t,saveConfig as n,getIcoaDir as r}from"./config.js";import{readFileSync as o,writeFileSync as i,existsSync as s}from"node:fs";import{join as u}from"node:path";const p=new Set(["93490bf664679467b4ab5af12e240175364b7af988b72cb7d000e309b7c68c15","cba7a6f075a4bd8c2fc973336cc0b1966669fc481381a065ce670730bbe0b7d3","f6773f614341acb8d2c35e8f466f2876095a2c8026a207e77de621050fa64559","d060ab36056fdac449a561fd3340c4b79ad4cde10c9a21c3397aa74574583a2b","523c11774e103298c15eb9d138872295194078f2d29486d0a6bd210436a592c3","1e16864067470f0a97088f067d8df4b655753ff498a91353b5f9b75989b6be39","f1031aac52879c776d4db5ba43eb25bb40f1a841b91304f8adf65a838fb8c666","bcd9e25014633ec6556345ab43d0cd213c454bb10d4ea0bd5be5ba02e1a6622c","9239ba9c3db74eadbb6dd05949c2a3cbe1b22e14e375ab3ca93d050e2e2ce38b","80fc0a899ed4d37138ae3172dafd466de2d3b1ce9630d67e6b00bec9315964d7","33ed35ce028824519d3a013ca326d6a58b1ca3723ec182527a7367e1ffc2712b","7e90933e760ce5e8df48bdb6bab0e95962bdc1098fceedecf617c0dac37b2a11","33fa6e3639a691b217ed0f927a8e2e2aef5eaa15eab7bd90c57874c2df2a28ac","67013663fb4536a47f6ea46b434fb7a00574bd4fc4f579e9439ba07f748db31b","10c83ad26fc965fcb1d228018f6b54d331e4a2e6087603920b75b500e191c5e4","3079268d847dc7eb196ce8cdc0af8a8506b9636539a1b7cce53dc5cb3f4cbe15","985eb5309c546d2f9d5018976973d6da06a374b897c73c830fc9d1305e78efa0","3a7326d4a7f40cc356b17769f4c5fc0d832d926aff9f067efd60f34c053bf9ef","129f408a98ad6c1b13924cf2c831c752b0c726bf1975d6b46f212a178ced52e1","ec44bc0b4eb6a929b969caaa561492527c369cc07efa50e40c2c6c16162f0c2c","07610942d9da62dd5b91c0ba48602bc44973a9d374ed10ab6c708151677ec626","8ce3165bb8e23f3b67ac53b39191aca3e2f0a620b7f932fe6a43e2c42315efcc","69938b605e652afc1cf8bc7c0dcf6a99820878367dfb3b2ec954ba90b36014f5","660377ce87d378285ab7263fdad86208c8563367d2cc36b4c1402520e45dd5f0","bef8a3727dffc94861a1dfa7d6a336ceac30aab9f0679dcab662cb9f682079dd","02318a3597b64a2c7de56b01fc25f33cc4142c76315136186df680f490681294","b7179114b42b90e9557399ae505050111b6afc55f9295d3ee84d5db6873470c5","e227ec0a6b22773500b35bee46f21bc6bc6a00fb001d54e71479f15b8fdfd72b","1c9802ae1e932d55e73994ce173a996d170e4d274aeccb1b784c9d9b69913f3d","5ed51694773bd1b46a085d10e9a369786a997c50b72ec2bdb6e68921ffca5c51","478e457279a41e9b76a3dc5894418e38246d2af31e0f4776dda8aa89c74c88c8","a7ec7e047c0e62862e9be64b0a65d3d7894d41efe6eb16ca6cfca45d8007f16f","88cf2b75604486ac5f1a0db9afbab28e8e866f9ea00f3e4b4353a7ecc81f6b55","dc4daa9ef4149f122979ffd5a8b23bca3cbb83b24a87ba99a1d00dc09e39936e","cffd9a3637b5ae30c27cae4ae42dc21374caa27dd818b5d361f112406bf3c0e7","33b3e85a964f606e857280ba379de46508f9343cbe1d2722abebbed21b82a106","a3754074df08f9c9407c73e680eac1868175cee3beac3f0e7d2bd211bdf51f58","f9eb5fd82f3360e22ad45d4797f3a95b907a766ef5a61d856bf959b60a4930dc","1c53d3145cb38501a2422bf70f55a0c206b68c14e46da31e0e3dc63c7bee78d6","20bc5f2dedbf6423a543ba25183fab3c7268cdd2762e080f6d0b3387c4b3cad8","654faf29e2a177dba2409db4942007630674b86d3ff87d2b11d428e8b4d0db7f","c27979d019266887a1b86225d3c85b2d4553e85814ab2d791547ffc3f9dc664a","74f982351453468e39aff8373cb2649d57344b8002b85fc9c0df118d051817fc","891e59d7896f29a9af2bd1a9aec98ae2ebcc57d9685027e3f07067734e603923","4a8a234bbad11dc98aa27871ed69d351385f9476af0c15b8b426cfa5630cc3db","e42c967f02a434a061152d86d68fa0a3da70235f6f8262a792abeeace14fc419","c1560c78197abd62252f8932abf73d5f7506fcd157e98390230aec81fdf5e5ac","afa2cc8fe8b9b8785921f2e649d90d239f729223b2ce7460c0f22d79427c7b5e","d574f129616c989797b3a4a7988e9d4ca3afb59ed1de67136d459307b9a1807a","94b1c1e2fab8c51bb76d9d7bc07d23f8b509919009feb141f12562cab696d49a","79bf74936c7274d1ee529fb888f30fbf2a33a15308bedb8c77c1c50793790b42","2ee8962250f82c51fdbbf170c6c7fa9b69dca336434714ba607c6f816034cb08","6e8e665df73c6934d5b432f5aa898ba33cc9a40d630b049404a23fa5d2776298","3561d1bd9ae8c916eace5bdd1eb788cd743ad461cff58acf58ed5b2064b30b7b","46a48aa8aef9f09dabb9cf340dacc1889cf3eeebc49c6d2f26ff017cd087857c","561e0536b3cf214a4bf41b2bfb2209c8d659990a871e44bef9bc0136613a4ab9","7c1f3e331c8f59cc6dab7e310d9ad151628f72e5ca3db5a6ff592c8c976c1974","fb9d9d484edfa2c0a531a3e08074f52b6988f1082606f1eecaf0c58f117dbf3d","2810e928a4ce6e2ae016751a7e8b73496de47fe1926abe6ff486bc0eed23e3d7","723c3ede92f08e9ac12b7dc0b9e6a857ab0426d3418524f4eb50ad69f0228ccd","66a07cdf0c9d56558ad4f853203071b56adfa990a4fb065b49c10108f4996fe7","dc826253950962dbc2e5699dc5c138490c4233a23b39a5cf471a931cbbc689b8","ec29a6c60c70a25a5a238ba1d03407dadafee78c01bc9f921549da428c4fbc03","0564c17382a344aa22b5452989d2950f514bbd366e7b8289a458a4604c987641","157ca17a0c1fc9faed3c2557cdf83323210a40020e72497e8e48e1d0055e54c7","e643beaf8a92e574da88b9efa424852d34261be06496ca78d08acd84c38861b7","df982789a1598f53bbcf44f1b2991c86bfd7713b36b04a06cf52640cfc9c579d","e135e4dd1aebe24484909d56fb47619eb975f9790ef4541fdc87f63a3478ecf4","823235bafe4f9e523cc4ffeb16789a2e2d6b246ab5c248335eba364d54474241","a314bda9257484bbbabc1159b957d3aae1de0bca777bcd1462fdc52abf5a62fe","65f6699712af969820645bbe271f66fe92f5da41fd834e329dadeae7801bc112","17e812f25ef6d73de97b3464ca3fd2109433d9b5bc567e4e74feda35bf660492","37ff30e4c4384b810bd86e4472e9ada4b447cd6057daf8df3f923fac3b8b3d77","c55f13e79ce2bb698606f787551591e050e33e576cb845a2f40b03edac56f819","2124d3353d3f105c3780c937f1eaf377f756e59c6ab6a97ef780a718f3a47c7b","e581535019c839a7c383d0eca3de97a6a5701025d4a24ea56f01932f910cb99c","eb089f8a27da4b94b79e5d125ed6205849b1909d0a6c1d0f51c351be2d5b8466","36ee22c148c0282e112950f8e9939fed4b95d2f8a52c9cd2fd3744070df54333","c81b6509d23e889c5b5ec79fdfaf64fed1bf00ced8f4b224aa37b5a37821ccfe","b529c4de4a2fff86266d9b0318f15246ed30f4641b4156778ff9f3fca3099e32","647c2aa42b094baf52537a8f7ffb015b7aa212c67ca779853d263d420760d8b6","8043ea259b8bbb2bf488643376c2a2b9a3864e5617ea9ac5dc72966e289c07c2","bba0397ebaf1a6093a8adb117e84198bb5d2dcf9e8e7792221af9215cda8c10b","978ec66df04567ef8e4f02aa67b903535859f7bf24a5b63298cae1c938a72ab7","124befb26711b599a311b0b0d7352b6e980a594cd56c8447e32c1aba26818fd1","990ddff1fd05882796d2081ebc0d966a39c04af7120a9440562d71db2f48d65d","f396be48a42c9cca6b6fec0a8ee7f5d15f93a57fba3baf04ab5a7d86af68bea5","4f2487f0af254ea067e853bb6874d80d05c46f6322ca6e3a8815b37931533aea","dbacdcc317d0cc436dd93c8be4d1471c712bcc567bda8e9a47dc0c1543d33e19","6658cb8824afdf853e9cf3e667ac9d6bf566d54cc0f3b81ad62f7d7eeadff530","b2c4ea7f091911a1c3733e42a52c75d3ee1666ceb62faa4e8ddb15c8a4b12b14","0f29f04bebfe26d9b0ef7b802e3b2c725e85cdc03407915a3d5753436977f24e","7eadf05c33f72431c7414e60e4068051143154d647452e3888de4c61316950ea","45237d7cbb04c768d25f2dd13708f448f3c50af5262015d468ccbdb51fe0c090","21f14816d480bc5c2e5f0a3387a0897d928e926a4341df3d32d65416b6e387f1","a39bd710b9489e8bef21362c8df87ed76008939e89dbf8e6708a2c574f0727e0","cf365a79503e1457c23cd1ea8c9fa8c398d168288f90b5c1920af798508c2b56","d123f90b3a932edf596fd561e74fc8cc0adc481c3be118a7fa6a5834cd7b787c","cde02309ad295648d86fa4acefdf7224809abb2ab9b025f14ae41e021512c5ed","39835a1337c2afd9a9690cb9946752899a110df312d9d3aa68e10f85fad49dea"]);export function isFirstRunOrUpgrade(e){return t().lastVersion!==e}export function markVersionSeen(e){n({lastVersion:e})}const l=new Set(["ref","help","exit","quit","q","clear","cls","activate"]);function m(c){return e("sha256").update(c.trim().toUpperCase()).digest("hex")}export function isActivated(){const e=t();return!(!e.accessToken||!p.has(m(e.accessToken)))}export function getDeviceFingerprint(){const t=[a(),f(),d()];try{if("darwin"===f()){const e=c("ioreg -rd1 -c IOPlatformExpertDevice | grep IOPlatformUUID",{encoding:"utf-8"}).match(/"([A-F0-9-]+)"/);e&&t.push(e[1])}else if("linux"===f())s("/etc/machine-id")&&t.push(o("/etc/machine-id","utf-8").trim());else if("win32"===f()){const e=c('powershell -Command "(Get-CimInstance Win32_ComputerSystemProduct).UUID"',{encoding:"utf-8"});t.push(e.trim())}}catch{const e=b();for(const c of Object.values(e))if(c){for(const e of c)if(!e.internal&&"00:00:00:00:00:00"!==e.mac){t.push(e.mac);break}if(t.length>3)break}}return e("sha256").update(t.join("|")).digest("hex")}export function activateToken(e){if(!function(e){return p.has(m(e))}(e))return"invalid";const c=getDeviceFingerprint(),a=u(r(),"token-bindings.json");let f={};if(s(a))try{f=JSON.parse(o(a,"utf-8"))}catch{}const d=m(e),b=f[d];return b&&b!==c?"already_bound":(f[d]=c,i(a,JSON.stringify(f,null,2)),n({accessToken:e.trim().toUpperCase(),deviceFingerprint:c}),"ok")}export function isDeviceMatch(){const e=t();return!e.deviceFingerprint||e.deviceFingerprint===getDeviceFingerprint()}export function isFreeCommand(e){return l.has(e.toLowerCase())}const g=()=>u(r(),"session-state.json");function h(){return{startedAt:(new Date).toISOString(),lastExitAt:null,lastResumeAt:null,exitCount:0,totalAwaySeconds:0}}function x(){const e=g();if(!s(e))return h();try{return{...h(),...JSON.parse(o(e,"utf-8"))}}catch{return h()}}function S(e){const c={...x(),...e};i(g(),JSON.stringify(c,null,2))}export function recordExit(){const e=x();e.lastExitAt=(new Date).toISOString(),e.exitCount++,S(e)}export function recordResume(){const e=x();if(!e.lastExitAt)return null;const c=new Date(e.lastExitAt).getTime(),a=Date.now(),f=Math.round((a-c)/1e3);return e.lastResumeAt=(new Date).toISOString(),e.totalAwaySeconds+=f,S(e),{awaySeconds:f,exitCount:e.exitCount}}
1
+ import{createHash as e,randomUUID as c}from"node:crypto";import{execSync as a}from"node:child_process";import{hostname as f,platform as d,arch as b,networkInterfaces as t}from"node:os";import{getConfig as n,saveConfig as r,getIcoaDir as i}from"./config.js";import{readFileSync as o,writeFileSync as s,existsSync as u}from"node:fs";import{join as l}from"node:path";const p=new Set(["93490bf664679467b4ab5af12e240175364b7af988b72cb7d000e309b7c68c15","cba7a6f075a4bd8c2fc973336cc0b1966669fc481381a065ce670730bbe0b7d3","f6773f614341acb8d2c35e8f466f2876095a2c8026a207e77de621050fa64559","d060ab36056fdac449a561fd3340c4b79ad4cde10c9a21c3397aa74574583a2b","523c11774e103298c15eb9d138872295194078f2d29486d0a6bd210436a592c3","1e16864067470f0a97088f067d8df4b655753ff498a91353b5f9b75989b6be39","f1031aac52879c776d4db5ba43eb25bb40f1a841b91304f8adf65a838fb8c666","bcd9e25014633ec6556345ab43d0cd213c454bb10d4ea0bd5be5ba02e1a6622c","9239ba9c3db74eadbb6dd05949c2a3cbe1b22e14e375ab3ca93d050e2e2ce38b","80fc0a899ed4d37138ae3172dafd466de2d3b1ce9630d67e6b00bec9315964d7","33ed35ce028824519d3a013ca326d6a58b1ca3723ec182527a7367e1ffc2712b","7e90933e760ce5e8df48bdb6bab0e95962bdc1098fceedecf617c0dac37b2a11","33fa6e3639a691b217ed0f927a8e2e2aef5eaa15eab7bd90c57874c2df2a28ac","67013663fb4536a47f6ea46b434fb7a00574bd4fc4f579e9439ba07f748db31b","10c83ad26fc965fcb1d228018f6b54d331e4a2e6087603920b75b500e191c5e4","3079268d847dc7eb196ce8cdc0af8a8506b9636539a1b7cce53dc5cb3f4cbe15","985eb5309c546d2f9d5018976973d6da06a374b897c73c830fc9d1305e78efa0","3a7326d4a7f40cc356b17769f4c5fc0d832d926aff9f067efd60f34c053bf9ef","129f408a98ad6c1b13924cf2c831c752b0c726bf1975d6b46f212a178ced52e1","ec44bc0b4eb6a929b969caaa561492527c369cc07efa50e40c2c6c16162f0c2c","07610942d9da62dd5b91c0ba48602bc44973a9d374ed10ab6c708151677ec626","8ce3165bb8e23f3b67ac53b39191aca3e2f0a620b7f932fe6a43e2c42315efcc","69938b605e652afc1cf8bc7c0dcf6a99820878367dfb3b2ec954ba90b36014f5","660377ce87d378285ab7263fdad86208c8563367d2cc36b4c1402520e45dd5f0","bef8a3727dffc94861a1dfa7d6a336ceac30aab9f0679dcab662cb9f682079dd","02318a3597b64a2c7de56b01fc25f33cc4142c76315136186df680f490681294","b7179114b42b90e9557399ae505050111b6afc55f9295d3ee84d5db6873470c5","e227ec0a6b22773500b35bee46f21bc6bc6a00fb001d54e71479f15b8fdfd72b","1c9802ae1e932d55e73994ce173a996d170e4d274aeccb1b784c9d9b69913f3d","5ed51694773bd1b46a085d10e9a369786a997c50b72ec2bdb6e68921ffca5c51","478e457279a41e9b76a3dc5894418e38246d2af31e0f4776dda8aa89c74c88c8","a7ec7e047c0e62862e9be64b0a65d3d7894d41efe6eb16ca6cfca45d8007f16f","88cf2b75604486ac5f1a0db9afbab28e8e866f9ea00f3e4b4353a7ecc81f6b55","dc4daa9ef4149f122979ffd5a8b23bca3cbb83b24a87ba99a1d00dc09e39936e","cffd9a3637b5ae30c27cae4ae42dc21374caa27dd818b5d361f112406bf3c0e7","33b3e85a964f606e857280ba379de46508f9343cbe1d2722abebbed21b82a106","a3754074df08f9c9407c73e680eac1868175cee3beac3f0e7d2bd211bdf51f58","f9eb5fd82f3360e22ad45d4797f3a95b907a766ef5a61d856bf959b60a4930dc","1c53d3145cb38501a2422bf70f55a0c206b68c14e46da31e0e3dc63c7bee78d6","20bc5f2dedbf6423a543ba25183fab3c7268cdd2762e080f6d0b3387c4b3cad8","654faf29e2a177dba2409db4942007630674b86d3ff87d2b11d428e8b4d0db7f","c27979d019266887a1b86225d3c85b2d4553e85814ab2d791547ffc3f9dc664a","74f982351453468e39aff8373cb2649d57344b8002b85fc9c0df118d051817fc","891e59d7896f29a9af2bd1a9aec98ae2ebcc57d9685027e3f07067734e603923","4a8a234bbad11dc98aa27871ed69d351385f9476af0c15b8b426cfa5630cc3db","e42c967f02a434a061152d86d68fa0a3da70235f6f8262a792abeeace14fc419","c1560c78197abd62252f8932abf73d5f7506fcd157e98390230aec81fdf5e5ac","afa2cc8fe8b9b8785921f2e649d90d239f729223b2ce7460c0f22d79427c7b5e","d574f129616c989797b3a4a7988e9d4ca3afb59ed1de67136d459307b9a1807a","94b1c1e2fab8c51bb76d9d7bc07d23f8b509919009feb141f12562cab696d49a","79bf74936c7274d1ee529fb888f30fbf2a33a15308bedb8c77c1c50793790b42","2ee8962250f82c51fdbbf170c6c7fa9b69dca336434714ba607c6f816034cb08","6e8e665df73c6934d5b432f5aa898ba33cc9a40d630b049404a23fa5d2776298","3561d1bd9ae8c916eace5bdd1eb788cd743ad461cff58acf58ed5b2064b30b7b","46a48aa8aef9f09dabb9cf340dacc1889cf3eeebc49c6d2f26ff017cd087857c","561e0536b3cf214a4bf41b2bfb2209c8d659990a871e44bef9bc0136613a4ab9","7c1f3e331c8f59cc6dab7e310d9ad151628f72e5ca3db5a6ff592c8c976c1974","fb9d9d484edfa2c0a531a3e08074f52b6988f1082606f1eecaf0c58f117dbf3d","2810e928a4ce6e2ae016751a7e8b73496de47fe1926abe6ff486bc0eed23e3d7","723c3ede92f08e9ac12b7dc0b9e6a857ab0426d3418524f4eb50ad69f0228ccd","66a07cdf0c9d56558ad4f853203071b56adfa990a4fb065b49c10108f4996fe7","dc826253950962dbc2e5699dc5c138490c4233a23b39a5cf471a931cbbc689b8","ec29a6c60c70a25a5a238ba1d03407dadafee78c01bc9f921549da428c4fbc03","0564c17382a344aa22b5452989d2950f514bbd366e7b8289a458a4604c987641","157ca17a0c1fc9faed3c2557cdf83323210a40020e72497e8e48e1d0055e54c7","e643beaf8a92e574da88b9efa424852d34261be06496ca78d08acd84c38861b7","df982789a1598f53bbcf44f1b2991c86bfd7713b36b04a06cf52640cfc9c579d","e135e4dd1aebe24484909d56fb47619eb975f9790ef4541fdc87f63a3478ecf4","823235bafe4f9e523cc4ffeb16789a2e2d6b246ab5c248335eba364d54474241","a314bda9257484bbbabc1159b957d3aae1de0bca777bcd1462fdc52abf5a62fe","65f6699712af969820645bbe271f66fe92f5da41fd834e329dadeae7801bc112","17e812f25ef6d73de97b3464ca3fd2109433d9b5bc567e4e74feda35bf660492","37ff30e4c4384b810bd86e4472e9ada4b447cd6057daf8df3f923fac3b8b3d77","c55f13e79ce2bb698606f787551591e050e33e576cb845a2f40b03edac56f819","2124d3353d3f105c3780c937f1eaf377f756e59c6ab6a97ef780a718f3a47c7b","e581535019c839a7c383d0eca3de97a6a5701025d4a24ea56f01932f910cb99c","eb089f8a27da4b94b79e5d125ed6205849b1909d0a6c1d0f51c351be2d5b8466","36ee22c148c0282e112950f8e9939fed4b95d2f8a52c9cd2fd3744070df54333","c81b6509d23e889c5b5ec79fdfaf64fed1bf00ced8f4b224aa37b5a37821ccfe","b529c4de4a2fff86266d9b0318f15246ed30f4641b4156778ff9f3fca3099e32","647c2aa42b094baf52537a8f7ffb015b7aa212c67ca779853d263d420760d8b6","8043ea259b8bbb2bf488643376c2a2b9a3864e5617ea9ac5dc72966e289c07c2","bba0397ebaf1a6093a8adb117e84198bb5d2dcf9e8e7792221af9215cda8c10b","978ec66df04567ef8e4f02aa67b903535859f7bf24a5b63298cae1c938a72ab7","124befb26711b599a311b0b0d7352b6e980a594cd56c8447e32c1aba26818fd1","990ddff1fd05882796d2081ebc0d966a39c04af7120a9440562d71db2f48d65d","f396be48a42c9cca6b6fec0a8ee7f5d15f93a57fba3baf04ab5a7d86af68bea5","4f2487f0af254ea067e853bb6874d80d05c46f6322ca6e3a8815b37931533aea","dbacdcc317d0cc436dd93c8be4d1471c712bcc567bda8e9a47dc0c1543d33e19","6658cb8824afdf853e9cf3e667ac9d6bf566d54cc0f3b81ad62f7d7eeadff530","b2c4ea7f091911a1c3733e42a52c75d3ee1666ceb62faa4e8ddb15c8a4b12b14","0f29f04bebfe26d9b0ef7b802e3b2c725e85cdc03407915a3d5753436977f24e","7eadf05c33f72431c7414e60e4068051143154d647452e3888de4c61316950ea","45237d7cbb04c768d25f2dd13708f448f3c50af5262015d468ccbdb51fe0c090","21f14816d480bc5c2e5f0a3387a0897d928e926a4341df3d32d65416b6e387f1","a39bd710b9489e8bef21362c8df87ed76008939e89dbf8e6708a2c574f0727e0","cf365a79503e1457c23cd1ea8c9fa8c398d168288f90b5c1920af798508c2b56","d123f90b3a932edf596fd561e74fc8cc0adc481c3be118a7fa6a5834cd7b787c","cde02309ad295648d86fa4acefdf7224809abb2ab9b025f14ae41e021512c5ed","39835a1337c2afd9a9690cb9946752899a110df312d9d3aa68e10f85fad49dea"]);export function isFirstRunOrUpgrade(e){return n().lastVersion!==e}export function markVersionSeen(e){r({lastVersion:e})}const m=new Set(["ref","help","exit","quit","q","clear","cls","activate"]);function g(c){return e("sha256").update(c.trim().toUpperCase()).digest("hex")}export function isActivated(){const e=n();return!(!e.accessToken||!p.has(g(e.accessToken)))}function h(){const c=[f(),d(),b()];try{if("darwin"===d()){const e=a("ioreg -rd1 -c IOPlatformExpertDevice | grep IOPlatformUUID",{encoding:"utf-8"}).match(/"([A-F0-9-]+)"/);e&&c.push(e[1])}else if("linux"===d())u("/etc/machine-id")&&c.push(o("/etc/machine-id","utf-8").trim());else if("win32"===d()){const e=a('powershell -Command "(Get-CimInstance Win32_ComputerSystemProduct).UUID"',{encoding:"utf-8"});c.push(e.trim())}}catch{const e=t();for(const a of Object.values(e))if(a){for(const e of a)if(!e.internal&&"00:00:00:00:00:00"!==e.mac){c.push(e.mac);break}if(c.length>3)break}}return e("sha256").update(c.join("|")).digest("hex")}export function getDeviceFingerprint(){const a=n();if(a.deviceFingerprint&&!a.installSalt)return h();let f=a.installSalt;f||(f=c(),r({installSalt:f}));const d=h();return e("sha256").update(`${d}|${f}`).digest("hex")}export function activateToken(e){if(!function(e){return p.has(g(e))}(e))return"invalid";const c=getDeviceFingerprint(),a=l(i(),"token-bindings.json");let f={};if(u(a))try{f=JSON.parse(o(a,"utf-8"))}catch{}const d=g(e),b=f[d];return b&&b!==c?"already_bound":(f[d]=c,s(a,JSON.stringify(f,null,2)),r({accessToken:e.trim().toUpperCase(),deviceFingerprint:c}),"ok")}export function isDeviceMatch(){const e=n();return!e.deviceFingerprint||e.deviceFingerprint===getDeviceFingerprint()}export function isFreeCommand(e){return m.has(e.toLowerCase())}const x=()=>l(i(),"session-state.json");function S(){return{startedAt:(new Date).toISOString(),lastExitAt:null,lastResumeAt:null,exitCount:0,totalAwaySeconds:0}}function v(){const e=x();if(!u(e))return S();try{return{...S(),...JSON.parse(o(e,"utf-8"))}}catch{return S()}}function w(e){const c={...v(),...e};s(x(),JSON.stringify(c,null,2))}export function recordExit(){const e=v();e.lastExitAt=(new Date).toISOString(),e.exitCount++,w(e)}export function recordResume(){const e=v();if(!e.lastExitAt)return null;const c=new Date(e.lastExitAt).getTime(),a=Date.now(),f=Math.round((a-c)/1e3);return e.lastResumeAt=(new Date).toISOString(),e.totalAwaySeconds+=f,w(e),{awaySeconds:f,exitCount:e.exitCount}}
@@ -1 +1 @@
1
- import{GoogleGenAI as e}from"@google/genai";import chalk from"chalk";import{readFileSync as t}from"node:fs";import{dirname as o,join as n}from"node:path";import{fileURLToPath as r}from"node:url";import{getConfig as s,saveConfig as a}from"./config.js";import{getRealExamState as i}from"./exam-state.js";const c=o(r(import.meta.url));let l=null;function p(){if(l)return l;try{const e=JSON.parse(t(n(c,"..","..","package.json"),"utf-8"));l=e.version||"unknown"}catch{l="unknown"}return l}export async function translateText(e,t){throw new Error("Local AI model path has been disabled (2026-04-24). ICOA provides all AI server-side — no API key setup needed. Use `ai4ctf` (chat) or `exam` (with integrated help/hint) instead.")}export function setApiKey(e){a({geminiApiKey:e})}export async function createChatSession(e,t){const o=s();let n=t||"You are an AI teammate in the ICOA cybersecurity CTF competition (International Cyber Olympiad in AI 2026, Sydney).\n\nYou're a friendly, knowledgeable cybersecurity partner — like a fellow competitor sitting next to the user. Be conversational, encouraging, and collaborative.\n\nRULES:\n- Help the competitor think through challenges, brainstorm approaches, explain concepts\n- You MAY discuss vulnerability types, tools, techniques, and methodologies\n- You MAY suggest approaches and help debug code\n- Do NOT provide complete working exploits or full solution scripts\n- Do NOT provide flags or flag fragments\n- Never output anything matching flag format: icoa{...}\n- If you don't know something, say so honestly\n- Keep responses concise unless the user asks for detail\n- When the user opens a challenge, use the context to give relevant advice";e&&(n+=`\n\nThe competitor is currently working on:\nChallenge: ${e.name}\nCategory: ${e.category}`);const r=o.ctfdUrl||"https://practice.icoa2026.au",a=o.deviceFingerprint||"",c=o.geminiModel||"gemini-2.5-flash",l=[];return{async sendMessage(e){l.push({role:"user",text:e});const t=i(),o={systemPrompt:n,messages:l,model:c,maxTokens:2048,deviceFingerprint:a};t?.session?.token&&(o.examToken=t.session.token);const s=await fetch(`${r}/api/icoa/ai/chat`,{method:"POST",headers:{"Content-Type":"application/json","User-Agent":`icoa-cli/${p()}`,"X-Device-Fingerprint":a},body:JSON.stringify(o),signal:AbortSignal.timeout(6e4)});if(!s.ok){const e=(await s.json().catch(()=>({message:"AI proxy error"}))).message||`AI proxy returned ${s.status}`;if(401===s.status)throw new Error(`${chalk.yellow("⚠ ")}Exam token expired. Re-enter via \`exam <token>\`.`);if(403===s.status)throw new Error(chalk.yellow("⚠ ")+e);if(429===s.status)throw new Error(chalk.yellow("⏳ ")+e);throw new Error(e)}const u=await s.json(),m=function(e){return e.replace(/icoa\{[^}]*\}/gi,"[FLAG REDACTED]")}(u.data?.text||""),h=u.data?.tokensUsed||0;return l.push({role:"model",text:m}),{text:m,tokensUsed:h}}}}
1
+ import{GoogleGenAI as e}from"@google/genai";import chalk from"chalk";import{readFileSync as t}from"node:fs";import{dirname as o,join as n}from"node:path";import{fileURLToPath as r}from"node:url";import{getConfig as s,saveConfig as a}from"./config.js";import{getRealExamState as i}from"./exam-state.js";const l=o(r(import.meta.url));let c=null;function p(){if(c)return c;try{const e=JSON.parse(t(n(l,"..","..","package.json"),"utf-8"));c=e.version||"unknown"}catch{c="unknown"}return c}export async function translateText(e,t){throw new Error("Local AI model path has been disabled (2026-04-24). ICOA provides all AI server-side — no API key setup needed. Use `ai4ctf` (chat) or `exam` (with integrated help/hint) instead.")}export function setApiKey(e){a({geminiApiKey:e})}export async function createChatSession(e,t){const o=s();let n=t||"You are an AI teammate in the ICOA cybersecurity CTF competition (International Cyber Olympiad in AI 2026, Sydney).\n\nYou're a friendly, knowledgeable cybersecurity partner — like a fellow competitor sitting next to the user. Be conversational, encouraging, and collaborative.\n\nRULES:\n- Help the competitor think through challenges, brainstorm approaches, explain concepts\n- You MAY discuss vulnerability types, tools, techniques, and methodologies\n- You MAY suggest approaches and help debug code\n- Do NOT provide complete working exploits or full solution scripts\n- Do NOT provide flags or flag fragments\n- Never output anything matching flag format: icoa{...}\n- If you don't know something, say so honestly\n- Keep responses concise unless the user asks for detail\n- When the user opens a challenge, use the context to give relevant advice";e&&(n+=`\n\nThe competitor is currently working on:\nChallenge: ${e.name}\nCategory: ${e.category}`);const r=o.ctfdUrl||"https://practice.icoa2026.au",a=o.deviceFingerprint||"",l=o.geminiModel||"gemini-2.5-flash",c=[];return{async sendMessage(e){c.push({role:"user",text:e});const t=i(),o={systemPrompt:n,messages:c,model:l,maxTokens:2048,deviceFingerprint:a};t?.session?.token&&(o.examToken=t.session.token);const s=e=>new Promise(t=>setTimeout(t,e)),u=[2e3,5e3];let m=null,h=null;for(let e=0;e<=u.length&&(m=await fetch(`${r}/api/icoa/ai/chat`,{method:"POST",headers:{"Content-Type":"application/json","User-Agent":`icoa-cli/${p()}`,"X-Device-Fingerprint":a},body:JSON.stringify(o),signal:AbortSignal.timeout(6e4)}),!m.ok&&429===m.status);e++)e<u.length?await s(u[e]):h=m;if(!m)throw new Error("AI proxy: no response");if(!m.ok){const e=(await m.json().catch(()=>({message:"AI proxy error"}))).message||`AI proxy returned ${m.status}`;if(401===m.status)throw new Error(`${chalk.yellow("⚠ ")}Exam token expired. Re-enter via \`exam <token>\`.`);if(403===m.status)throw new Error(chalk.yellow("⚠ ")+e);if(429===m.status)throw new Error(chalk.yellow("⏳ ")+e+chalk.gray(" (retried twice — quota burst, try again in ~30s)"));throw new Error(e)}const g=await m.json(),d=function(e){return e.replace(/icoa\{[^}]*\}/gi,"[FLAG REDACTED]")}(g.data?.text||""),f=g.data?.tokensUsed||0;return c.push({role:"model",text:d}),{text:d,tokensUsed:f}}}}
@@ -1 +1 @@
1
- function a0b(a,b){a=a-(0x2*0xc3d+0x1e7c+0x1*-0x35d3);const c=a0a();let d=c[a];if(a0b['jwSxKo']===undefined){var e=function(i){const j='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let l='',m='';for(let n=0x809+-0x9cf+0xe3*0x2,o,p,q=0x2084+-0x1*-0x14ce+-0xaf*0x4e;p=i['charAt'](q++);~p&&(o=n%(-0x4e3*-0x1+0x6c0+-0x253*0x5)?o*(-0x11e9+-0x2*-0x49a+-0x8f5*-0x1)+p:p,n++%(0xd4f+-0x677+0x1*-0x6d4))?l+=String['fromCharCode'](-0x37c+-0xb*-0x8f+-0x1aa&o>>(-(0xbab+-0x2014+0x146b)*n&-0x3a6+-0x102d+0x13d9)):0x858+0x42*-0x22+0x6*0x12){p=j['indexOf'](p);}for(let r=0x1662+0x1ad+0x180f*-0x1,s=l['length'];r<s;r++){m+='%'+('00'+l['charCodeAt'](r)['toString'](0x1*0x1789+0xe4*-0x5+-0x1*0x1305))['slice'](-(-0x9d5*-0x1+0x5e5+0x7dc*-0x2));}return decodeURIComponent(m);};a0b['sONILd']=e,a0b['aFxKKJ']={},a0b['jwSxKo']=!![];}const f=c[-0x3c7+0x2423+0x205c*-0x1],g=a+f,h=a0b['aFxKKJ'][g];return!h?(d=a0b['sONILd'](d),a0b['aFxKKJ'][g]=d):d=h,d;}(function(a,b){const v=a0b,c=a();while(!![]){try{const d=-parseInt(v(0x133))/(-0x1bef+-0x2459+0x4049)*(parseInt(v(0x124))/(-0x24eb*-0x1+-0x885+-0x1c64))+parseInt(v(0x12c))/(-0x2*-0xb41+-0x827*0x1+-0xe58)+-parseInt(v(0x137))/(0x1*-0x412+0xa10+-0x2fd*0x2)*(-parseInt(v(0x130))/(-0xa42+0x2*-0x1060+0x1*0x2b07))+-parseInt(v(0x123))/(0x571+0x3*0x1ff+-0xb68)+parseInt(v(0x128))/(-0x329*-0x1+-0x1703+0x7*0x2d7)+-parseInt(v(0x12a))/(-0x38c+-0x1*-0x1169+-0xdd5)+parseInt(v(0x12f))/(-0x975+-0x13*0x4a+0xefc);if(d===b)break;else c['push'](c['shift']());}catch(e){c['push'](c['shift']());}}}(a0a,-0x191e*-0xd+0x237*0x21a+-0x19dae*0x1));function a0a(){const x=['BgfUzW','l2fWAs9Py29Hl2v4yw1ZlW','y2f0y2G','AgLUDcbYzxf1zxn0igzHAwXLzcaO','DgLTzw91Da','mZaYndKWv1z4wxnW','mJu3mdC4CfjpsKLp','ANnVBG','y3rMzfvYBa','B2jQzwn0','nJiYnZi3wfPnDMvy','l2HPBNq','mJy1nZC3nMz6B1PutW','Ahr0Chm6lY9WCMfJDgLJzs5Py29HmJaYnI5HDq','mJqWntuYqMrUuLPq','BMv0D29YAYbLCNjVCG','AwnVys1JBgK','nJq1mda4nfj5Ae50wa','mtb3r0rxy3a','Bgv2zwW','oJKWotaVyxbPl2LJB2eVzxHHBxmV','mNbJC2ngDq','CxvLC3rPB24','C3rHDhvZ','BgfUz3vHz2u','nZmYntz4s0nzvuO','Dg9Rzw4','zxHHBuLK','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(0x126)]||w(0x12b),h=d[w(0x13b)]||f[w(0x136)]||'en',j=d['timeoutMs']??-0xfb2+0x167*-0x1a+0x9d*0x88,k=[g+w(0x13c)+d[w(0x139)]+'/hint',g+w(0x132)+d['examId']+w(0x129)];let l=null;for(const p of k)try{const q=await fetch(p,{'method':'POST','headers':{'Content-Type':'application/json','User-Agent':w(0x12e)},'body':JSON['stringify']({'token':d[w(0x138)],'question':d[w(0x134)],'level':d[w(0x131)],'lang':h}),'signal':AbortSignal[w(0x13f)](j)}),r=await q[w(0x125)]()[w(0x13d)](()=>({}));if(!q['ok']||!(-0xf00+-0x33d*-0xa+0x1*-0x1161)===r['success']){if(l={'status':q['status'],'message':r?.[w(0x13a)]||w(0x13e)+q[w(0x135)]+')'},q[w(0x135)]>=0x132f+-0x2285*0x1+0x10e6&&q['status']<-0x2*-0x49a+-0x9d*0x17+-0x5*-0x15f)throw l;continue;}return r['data'];}catch(u){if(u&&w(0x127)==typeof u&&'status'in u)throw u;l={'status':0x0,'message':u?.[w(0x13a)]||w(0x12d)};}const m={};m[w(0x135)]=0x0,m[w(0x13a)]='hint\x20API\x20unreachable';throw l||m;}
1
+ (function(a,b){const v=a0b,c=a();while(!![]){try{const d=-parseInt(v(0x173))/(0x20a6+0x4b0+0x1f7*-0x13)+parseInt(v(0x167))/(0x5*-0x527+-0x183b+0x14*0x280)*(parseInt(v(0x16f))/(-0x166*0x14+-0x23b6+0xf*0x43f))+-parseInt(v(0x171))/(-0x5bc*0x5+-0x23b6+0x4066)+parseInt(v(0x169))/(-0x2e5+-0x7*-0x45b+0x931*-0x3)+parseInt(v(0x16d))/(-0x4b6+-0x3*-0x139+0x111)+parseInt(v(0x16c))/(0xaf3+0xd*0x4c+0x158*-0xb)+-parseInt(v(0x166))/(-0x1658+0x949+0xd17)*(parseInt(v(0x172))/(-0x1a05+0x313*0x3+0x10d5));if(d===b)break;else c['push'](c['shift']());}catch(e){c['push'](c['shift']());}}}(a0a,-0x323e6+-0x1*-0x8ea45+0x2f9*0x2aa));import{getConfig as a0c}from'./config.js';function a0b(a,b){a=a-(-0x1*0x1994+-0x1*-0x269+0x1*0x188b);const c=a0a();let d=c[a];if(a0b['ccswIs']===undefined){var e=function(i){const j='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let l='',m='';for(let n=0x1*-0xeaf+-0x13d4+0x2283,o,p,q=-0x9*-0x33b+-0xa1c+-0x1*0x12f7;p=i['charAt'](q++);~p&&(o=n%(-0x31d*-0x8+-0x1bb*0x7+-0xcc7*0x1)?o*(-0x4e1*-0x6+-0x1f38+0x232)+p:p,n++%(-0xf15*-0x2+0x17*-0x107+-0x685*0x1))?l+=String['fromCharCode'](0x107b+0xa5d+-0x19d9&o>>(-(-0x20a3+0x3bd*0x8+0x1*0x2bd)*n&-0x1f1b+-0x931+0x2852)):-0xb*-0x92+-0x1649*-0x1+0x985*-0x3){p=j['indexOf'](p);}for(let r=0xea6+-0x83*0x1f+-0x137*-0x1,s=l['length'];r<s;r++){m+='%'+('00'+l['charCodeAt'](r)['toString'](-0x1*0x330+-0xa4+0x3e4))['slice'](-(-0x354+0x4c*0x79+-0x2096));}return decodeURIComponent(m);};a0b['fVcDqm']=e,a0b['RYxPLW']={},a0b['ccswIs']=!![];}const f=c[0x4c7*0x6+-0x15f7*-0x1+-0x32a1*0x1],g=a+f,h=a0b['RYxPLW'][g];return!h?(d=a0b['fVcDqm'](d),a0b['RYxPLW'][g]=d):d=h,d;}export async function requestHint(d){const w=a0b,f=a0c(),g=f[w(0x164)]||w(0x177),h=d['lang']||f[w(0x163)]||'en',j=d[w(0x176)]??0x1*-0x177e+-0x1fba+0x5678,k=[g+w(0x17a)+d[w(0x16a)]+w(0x168),g+':9090/api/icoa/exams/'+d[w(0x16a)]+w(0x168)];let l=null;for(const p of k)try{const q=await fetch(p,{'method':'POST','headers':{'Content-Type':w(0x16b),'User-Agent':w(0x161)},'body':JSON['stringify']({'token':d['token'],'question':d['question'],'level':d[w(0x162)],'lang':h}),'signal':AbortSignal[w(0x16e)](j)}),r=await q[w(0x165)]()[w(0x179)](()=>({}));if(!q['ok']||!(-0x9*-0x33b+-0xa1c+-0x1*0x12f6)===r['success']){if(l={'status':q['status'],'message':r?.[w(0x175)]||w(0x170)+q[w(0x160)]+')'},q['status']>=-0x31d*-0x8+-0x1bb*0x7+-0x7d*0x17&&q[w(0x160)]<-0x4e1*-0x6+-0x1f38+0x3e6)throw l;continue;}return r['data'];}catch(u){if(u&&'object'==typeof u&&'status'in u)throw u;l={'status':0x0,'message':u?.['message']||w(0x174)};}const m={};m[w(0x160)]=0x0,m[w(0x175)]=w(0x178);throw l||m;}function a0a(){const x=['y2f0y2G','l2fWAs9Py29Hl2v4yw1ZlW','C3rHDhvZ','AwnVys1JBgK','Bgv2zwW','BgfUz3vHz2u','y3rMzfvYBa','ANnVBG','mJiZntq0vMfVz3Dz','mZbQBw9ft1e','l2HPBNq','nJu1nJyYnxH6thPHDW','zxHHBuLK','yxbWBgLJyxrPB24VANnVBG','mteZnZeXntDut0LqtMO','mZqZmZK5ohHyyvbnzW','DgLTzw91Da','ndq2ndzYuwjuveO','AgLUDcbYzxf1zxn0igzHAwXLzcaO','nJG4mdGXnNbWsgDzyG','ou1yAhDkqW','mta4ntCYn1HwsuDMDa','BMv0D29YAYbLCNjVCG','BwvZC2fNzq','DgLTzw91De1Z','Ahr0Chm6lY9WCMfJDgLJzs5Py29HmJaYnI5HDq','AgLUDcbbueKGDw5YzwfJAgfIBgu'];a0a=function(){return x;};return a0a();}
@@ -1 +1 @@
1
- import{readFileSync as t,existsSync as n,writeFileSync as e,chmodSync as s}from"node:fs";import{join as i}from"node:path";import{getIcoaDir as o,getConfig as c}from"./config.js";import{getDeviceFingerprint as a}from"./access.js";const r=()=>i(o(),"sync-state.json");let l=null;function u(t){const n=r();e(n,JSON.stringify(t,null,2));try{s(n,384)}catch{}}async function y(){const e=c(),s=e.ctfdUrl||"https://practice.icoa2026.au",l=i(o(),"session.log");if(!n(l))return;const y=function(){const e=r();if(!n(e))return{lastSyncedLine:0,lastSyncAt:null,syncCount:0,failCount:0,seq:0};try{const n=JSON.parse(t(e,"utf-8"));return{lastSyncedLine:n.lastSyncedLine??0,lastSyncAt:n.lastSyncAt??null,syncCount:n.syncCount??0,failCount:n.failCount??0,seq:n.seq??0}}catch{return{lastSyncedLine:0,lastSyncAt:null,syncCount:0,failCount:0,seq:0}}}(),f=t(l,"utf-8").trim().split("\n").filter(Boolean);f.length<y.lastSyncedLine&&(y.lastSyncedLine=0);const d=f.slice(y.lastSyncedLine);if(0===d.length)return;const S={"Content-Type":"application/json"};let g;if(e.token)S.Authorization=`Token ${e.token}`,g=`user:${e.userId??"unknown"}`;else{const t=e.deviceFingerprint||a();S["X-Device-Fingerprint"]=t,g=`demo:${t.slice(0,12)}`}const p=y.seq??0,m=d.map((t,n)=>{let e;try{e=JSON.parse(t)}catch{e={raw:t}}return{...e,_seq:p+n+1}}),h={identity:g,userId:e.userId,userName:e.userName,teamId:e.teamId,sessionId:e.sessionId,deviceFingerprint:e.deviceFingerprint||a(),lang:e.language||"en",timestamp:(new Date).toISOString(),seqRange:{from:p+1,to:p+m.length},entries:m};try{const t=new URL("/api/icoa/audit",s).href;(await fetch(t,{method:"POST",headers:S,body:JSON.stringify(h),signal:AbortSignal.timeout(1e4)})).ok?(y.lastSyncedLine=f.length,y.lastSyncAt=(new Date).toISOString(),y.syncCount++,y.seq=p+m.length,u(y)):(y.failCount++,u(y))}catch{y.failCount++,u(y)}}export function startLogSync(){setTimeout(()=>y(),5e3),l=setInterval(()=>y(),3e4)}export function stopLogSync(){l&&(clearInterval(l),l=null),y()}
1
+ import{readFileSync as t,existsSync as n,writeFileSync as e,chmodSync as s}from"node:fs";import{join as i}from"node:path";import{getIcoaDir as o,getConfig as c}from"./config.js";import{getDeviceFingerprint as r}from"./access.js";import{getCliVersion as a}from"./version.js";const l=()=>i(o(),"sync-state.json");let u=null;function f(t){const n=l();e(n,JSON.stringify(t,null,2));try{s(n,384)}catch{}}async function y(){const e=c(),s=e.ctfdUrl||"https://practice.icoa2026.au",u=i(o(),"session.log");if(!n(u))return;const y=function(){const e=l();if(!n(e))return{lastSyncedLine:0,lastSyncAt:null,syncCount:0,failCount:0,seq:0};try{const n=JSON.parse(t(e,"utf-8"));return{lastSyncedLine:n.lastSyncedLine??0,lastSyncAt:n.lastSyncAt??null,syncCount:n.syncCount??0,failCount:n.failCount??0,seq:n.seq??0}}catch{return{lastSyncedLine:0,lastSyncAt:null,syncCount:0,failCount:0,seq:0}}}(),d=t(u,"utf-8").trim().split("\n").filter(Boolean);d.length<y.lastSyncedLine&&(y.lastSyncedLine=0);const p=d.slice(y.lastSyncedLine);if(0===p.length)return;const S={"Content-Type":"application/json"};let m;if(e.token)S.Authorization=`Token ${e.token}`,m=`user:${e.userId??"unknown"}`;else{const t=e.deviceFingerprint||r();S["X-Device-Fingerprint"]=t,m=`demo:${t.slice(0,12)}`}const g=y.seq??0,h=p.map((t,n)=>{let e;try{e=JSON.parse(t)}catch{e={raw:t}}return{...e,_seq:g+n+1}}),C=a(),I=h.map(t=>({...t,_cli:C})),L={identity:m,userId:e.userId,userName:e.userName,teamId:e.teamId,sessionId:e.sessionId,deviceFingerprint:e.deviceFingerprint||r(),lang:e.language||"en",clientVersion:C,timestamp:(new Date).toISOString(),seqRange:{from:g+1,to:g+h.length},entries:I};try{const t=new URL("/api/icoa/audit",s).href;(await fetch(t,{method:"POST",headers:S,body:JSON.stringify(L),signal:AbortSignal.timeout(1e4)})).ok?(y.lastSyncedLine=d.length,y.lastSyncAt=(new Date).toISOString(),y.syncCount++,y.seq=g+h.length,f(y)):(y.failCount++,f(y))}catch{y.failCount++,f(y)}}export function startLogSync(){setTimeout(()=>y(),5e3),u=setInterval(()=>y(),3e4)}export function stopLogSync(){u&&(clearInterval(u),u=null),y()}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Returns the running CLI's package.json version, cached after first call.
3
+ * Used by interaction events + log-sync payload so future forensic audits
4
+ * can pinpoint which CLI version produced any given event. Added in
5
+ * v2.19.185 in response to the Paper E dispatcher bug, where we couldn't
6
+ * tell from the data which contestants ran pre-fix vs post-fix code.
7
+ */
8
+ export declare function getCliVersion(): string;
@@ -0,0 +1 @@
1
+ import{readFileSync as n}from"node:fs";import{dirname as o,join as r}from"node:path";import{fileURLToPath as t}from"node:url";const e=o(t(import.meta.url));let i=null;export function getCliVersion(){if(i)return i;try{const o=JSON.parse(n(r(e,"..","..","package.json"),"utf-8"));i=o.version||"unknown"}catch{i="unknown"}return i}
@@ -90,6 +90,7 @@ export interface IcoaConfig {
90
90
  geminiModel: string;
91
91
  accessToken: string;
92
92
  deviceFingerprint: string;
93
+ installSalt?: string;
93
94
  lastVersion: string;
94
95
  demoCleanedForVersion?: string;
95
96
  sessionCookie: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "icoa-cli",
3
- "version": "2.19.184",
3
+ "version": "2.19.185",
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": {