icoa-cli 2.19.303 → 2.19.305
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/ai4ctf.js +1 -1
- package/dist/commands/ctf.js +1 -1
- package/dist/commands/ctf4ai-demo.js +1 -1
- package/dist/commands/ctf4vla.js +1 -1
- package/dist/commands/exam.js +1 -1
- package/dist/lib/access.js +1 -1
- package/dist/lib/ctfd-client.js +1 -1
- package/dist/lib/integrity-snapshot.d.ts +6 -0
- package/dist/lib/integrity-snapshot.js +1 -0
- package/dist/lib/sandbox.js +1 -1
- package/dist/lib/translations-fetcher.js +1 -1
- package/package.json +1 -1
package/dist/lib/access.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createHash as e,randomUUID as c}from"node:crypto";import{execSync as a}from"node:child_process";import{platform as d}from"node:os";import{getConfig as b,saveConfig as f,getIcoaDir as t}from"./config.js";import{readFileSync as n,writeFileSync as r,existsSync as i}from"node:fs";import{join as o}from"node:path";const s=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","c929759fcdb8ccb467db2cc3fda6d1ae0cf7b76e23d806acb9cfc8541763da6a","5dbd4b1f35e7f76c3e6c13e65b5d5033eb8ca509a61bdf1b9ffa0d35db65112d","da216377766075de7922a99a0de4b85cc9e8a80adda64df2650ec058e9e9fd84","03c84d8f2c4a30d3317126a986e1c0f3b930128772c90dafcf8018a94b840854","a90b7109528bf237411150ade521846c74d8a9d09d34162a83ad71a68ddb6ddc","7da814d8b667477b1809a4de5052412cf74946214e2b00c6d122987e3cf81189","40d55376ab048aa168d0b6b4afdd675ddc0d1569764b0148651f78c5fcf47209","9270bb262262095e68a9282f65d6c25f1180026d5114a058312520736a1a89d6","3101901b7db521da3ae2dbf9efc1a897028088c5d25457201835959c86eb1a5a","4e5c3cbfe1c5a83ffe82eb5c4cb592ae4931df1cebf4867f6c66f0ec2a7c2a7d","4cb1c6545bdbb1a3de217d1cf85037a55730c27d8e25633844677c2ab92f5e10","4b07ce8b2edc5f71de27892e74e87d3505403d51bfb410e47a00fa0516877cc7","6986b5f27b195326fe2da1ed342bdb9197395e82f6a65ae7439e220ab943996a","90f3aaffef73391015c4f980269f3c15ff6f49d973017bcd196a3bc4f3ef33ca","91970fb6dc804a6f774d269df6648de3aa82ec8ae1492d85781aedc953f3f795","8b609260526c742fd2c9ca92ff6317b2f2f7d339c5c75e587423845a4a827b6d","efe65b013d5e431a686d46474c57ab9ef9c2a098a19755d0d13fcf591c0d7b20","5e6e9e27129d0d7e48b6f3876ac7554160c87e18345f2072df4b0977a1fe3e4c","494c8da4c68a93bba5c176a380d78ac75c1c7ae66bd825f5f0f92528a5cc3d8c","516a6dc94b83af4c7f8845c312491142f757bf02b5f92c6bc1adc8c21ced595b","97f39c1b62ff577ed0f8b83e15bd66b0b3268559f652ae75032f431f4bed0ea8","8f1a9b63b6cb7772840d11583a93cedad709a3e654731f54b77abf4e667ee44d","f283c26199a4dc9cfe02147e0f55627475d9c4230a2c08f52b1631ec9839b18e","5da09cb77f7b19299ace4e8e2b9bcec42e74a8ab71283e2fd2570337e41340df","bf1bc00dea2b5b024bb768acd3ca8846b050461247c838f5ef2f5f3d81cb1142","7fdbd6b2b916c7b616b046684d0ea17a3dfd48518f18aa1d6ac232574d5b4106","0d7093dd24161a87b9c838b6e1f009dfcce7888fec0399adba4a1f19a8f340e4","14281dc9f7f556ec9e5bfad9da7e92b22f172093c2a81b05c3f86a6c583e4960","26d6a7cf3299cb6157a0a4320ff7983a6ab3668bb39b2753f7693db2a2400052","7a9db6d3035832bbb566bbfacdd19d2595cb02ab6591be3a3cd278f60e98f2bf","6d56cd034ee2171dd697d9ec4db1ed1246b17647e16f59c91a41e2df009c29db","f52d491637ca82f65fac62ce36007c572d53ebf4adeb4ea2a752d903330bdcac","d27f110d48469c27fa6ca3b2b0cd0396906b1206f129e3c4bf291e9f586ce184","172c448adaaf2aa94d7ebfa16699f18341ba4d7853f279cfa55a1a4544ddd2ac","203e7db3a68640e6560d7bbfbf1c16fa37f6037f4b2e9fbc900bde483e484379","c1a039729358ebcd3bdb61ee081a63d6c219c3fba297e6c449238fdf49543641","61eb95f28af3284e53dbf22b7417d10f9c6639ee4e38978b9d11fd6c6a90be18","99f08cfb58e3cb912f3846ef76bbdd68f2e552bc2722a61f1bead7fb5d962d74","96ae364d9d368da4ca3a486599fc87369c812dd928b439522d579995b640aea3","c1ca7749f3c0efc4e6e40eba1fa99dadeb0fe7169e5daffb1d00aac74ea913fd","3a3641cb2d5364ce1bedb8172da7c5e0f8b717b514c3b0fa989335b865bf8607","67571bb213b82dab5be102640b5f0b63dc09045b66b2cf02345d68d4c2c0581c","a747bd1608633d6be08653722c7596c0596df382d73116080c6e8ce2f3f7d286","d0270d0c6824d2242deca9dc214cf450daaa636185907ddf27ea98f9c30194f5","fcae3316fb08dcccfc8bd8a8d48bbba5867a59d894d0c16c732d4f7bf92659fa","027a6e0cded4ff2657a757d5dddf7826edb1ed7ec76e27424571ff9800fbf7a0","1bd1528d81def3dc708aa7ba6e587e913794eaf28ee309f3001041f08869e3f6","a09ff515e572b5c0e80c4bd24bce50ba5b09f72d366ffce50619c545fa65443f","2e65ac18579b416138efe46c4eac59d3b828b3e325e45a54fde6e823f46009a0","a100b1196c532b70772eccfba46c36796ba0dc9d11f4d60370b7bc31af8768f5","2997772363095781b2e6e60c4ca700701900dd1b2d48b79b3ed4b69929b1a533","35746ca26e0603acfd981899219c445f8169ba0a236309e2c9a6716636dd984c","34af0a8e00f7d9d17ad38f66d811a9b94d2c4224a8341ff57c5c1492f84f8f1f","6b9746e8d89523ba0b5defefb5b883f86c0aa201f56f682b8071cbaee19dcac3","d4f517190ee44e06709b4a41fa5f23f6aba6e7b0a8b3da11ebc1372b682cd084","1e1cbeb9d728bfe42bd0e0c3716661af5b05cc6872aaf7c13b2d0d770fd19aa0","4f71878968802d5b4ccc8e672859f135b1804dc251cce09225ed37077db02295","987341e1830fe6525bca0fdb6f610cb236f82f86f4d3ef0df7c51e92563dfbfa","ea291cfcde5c74959f97407e74a900a7cd773bc165d0727f4921ea975f3e820e","5909443ca42f60b88ab33f5f3399df4bbc45ad997c6e078827e0d3062143c06f","5f5721459a42306072b0da5741340ce9d3f2774558d7ad8d6f382f8ad05b85cd","a08faed46ce0e989318380000f29111c29aaa323f08bc4e371f97ee80304671a","294c09054ba642d6bd0a6665247c2cb985fc88d72c1b7ae1978f465d5f4ad151","424dfa711956969acf94eedb5875c944a834052bca451684c4577106c1a5b444","e69254d897aac4c111f6a2f67305ade0e4857cc20653999e906c6d2776f8d114","f1dfea3461b37c9aaf65ee64831cf024f32fe5a0508692dd753b7edae6251b9e","97f5807d343aca9040052c905387f702f17ca036d115110705fb420ae569b7f9","b555a61b6424921c31515414eb44b55ad8248999aee34a86f021a940bbcf149c","f75e565f4ca910fd0addf7e58fee10ad8d4a984e8b7779038790856423816f97","05ec4e244a13b8bc2a040de6d535bb14520187831c563528d366c808e91741f1","6eb85d3edbc879e032df2f6581fbd02b604031796f53e51158764ec8e1751ecb","4b28e77028a0fbaf28c022bcd1898c487523582adb42cf76b9dac4f7a42b33a1","1943457bf5ac5e5d8d21e0986a2f59227b6929835b18eb3ac9a13cae0b61fa0d","d498ee1e8a3c8a56a0782d85c2540bce3cda6f53571e3c21ca69fb85381b83ce","0ba6e450e88927140e64ac0d2c414765f5619b1a98e27737473bb3d4467c2069","c6d30aa7d5adf5f95ebe6f454a5b1896a72b2aa012ec506117d5b03c1476c954","6b9c0f59e2ec122ca7229d28b87da8e8b6dc8a4d220e5d9a4f3c2c3e9b29b1f1","37891119c2ef3ad5bb14792b3f3a7e3104fe14dba16c5c725beaa2f860bb96dd","6719d7c2a10be83852e348cf67f7453e7f9633db0b4ffec4c4d2df1bef0a23c4","a37603f07ded3bce61ee57d66e51863ea27c337095d99ebcc87eb74aff515699","46900e3a2517f90da43f9cdb44624d9fdbf2c0251900c18b33077f07f01b7941","74f6a8a1a9a3f92b56075b513a7b55a95c160df61fe84e97c37d3bfb630bcf7d","5152d83055954e52d155a3f00f20f4a73ed7805f51d9b31cbdb78891262757e7","9f0cb43edc4e6d66728ea99092029256a447ba48cc56af0e8a6809d2da1b54bf","7c341ef7b692d9a60a9c387d70d6a733feca3ac605688301487688f90a9e8b22","cde41ffd433d65346552ce5b48cc3ba9acdc2ed01ca8f82972f91c84a3c3dc96","4a612d23b410d055db2b398390566a212647d07a8ee1cc99a7fec80313fba0ce","aa08a02d4741417eb22bb688d277cc8066e9e2ba142682019d149461b68faf56","0c77c7f23dc22ab3a021992eb30a371f55a182b9e92a66707b3f44e3dddfea26","93a74ccb15cfbf30e31a31b6dfd8c1525ac2d1c2137bd3837b6ea303ed8cf34c","b4059543dd58ad2a0be623b75594cdc420eee86b569a45f3e4ef6adaa5be61de","340ee4b879d3a20460d9dde76e9f3ce950e343e4acf891f888fb05b72c580a33","0fa1022903ba20556ee3553c49152e5cba6704d5f8437b13721f954d18da0cc6","45e73e1496de364f2cbc6e4a91b1315d6d36bcd78c779e17cc565150149e7052","15f1eca1303cd103b0e01e32c9cb71990460ec1bc2046a4f1bbcfdd5688fe938","9382a2000adf88942f1be2e920cc5fdffdf742f1d1438d6901ba5cf7cf89fe8d","b8fba3582964e0c8df89b446f65f2d242114cfbbd37ed3996300cfa5aff4bc5a","6b39eb53e88c8200a0c6a7d6a149a787ea671e88f2f87ec131f467ecf1488772","c38ccf8b8e8a4ff0ca6b3ec7143315297e97c4286cf403be89c321a018fe526a","0e56248de81851158441e2c0ef81d15c8b75071256d4d2cd3bb2efe9a66154e4","13531d511eb71602e2678bb6bd277819e52586c7d9b6449826f0901f229a6bd5","6b179dd094058aa64448270cf62a87b01f0f596d98793437aaa6fd15a6515cb3","ce430d3ee87becda540f6986a21fbc70d0f0c25e1ab616b98c228db25c7f8688","af98e8647cc3558dde6c77ab2657770bb60f3ea87201fae11de92bbd099b7c57","72e376f7b2066cd031a2e0de626a22ae46e3d9a9a161fe90eca1a7405baa921d","33a0db0ad9d2a41477444bd22a7dd6a9d5e78d3f24ae804660d1fbd7ad5cd223","e9445a895b9d3e4c4e525c6f45c169471728168dbd2346115348d7281f9b70ea","504034727565ee93765c317a87f826eb6b1d888ebc7267ffd463ba84f2e218ea","9c419e97cc93665b82e181b34742ad0540c372057427ee145bfdfc181785f03d","9a46a0b2bb89b16d2407f34b13e6f07cce6f23c079c84230dc75e9fa24321dd8","08c720e58e74ac83ec3ed8582fd06a0221ed01942b21c35800564a7534ad3023","2b6a136f9b535ca5ddb44306b1fec6a93d1714f3a69a92e868dc8313473681ef","95e4f030c0d49e040750fa83e5456d01c557b08c9d282f23fd3ca1d449a711a1","d74d78a0d532f7874e7120451a09122364a872a73035b2aabdaa484ebac2314e","9166224e8993267330c95fa15bfe700e2ab5814ec9db4151bc25cbbe36d83995","febeca22988fa8116f986b1938d86437c9e0db607401b8c481305db8034ca203","d1d617c338a7eedd7dd7f9d3c5a50ba826f0c08f96c9a1ff653c4fcc6b3420cb","d710833a6256926376beefeb1f76ddc85ce8a17b4dc2b54b499901a7b0c27c02","439dbc1854c4d376d3d3fdd715bb5c9bf5fcbc5e9dac4d175dfaae84aac5b935","c12c80c52e4adffee228d97ab292a6cc2861b9b735077a6c1b425772a998cbd7","785fc1f8143b3d888a9000252d2409f496e8d8e50249b93ec3339b39854b137e","499e133a7a838551284857d7c1d6236594272818e089b57f142193072ea561c4","f1e3ceafd330f9b034a659728a1865403a69894743d1889f6689543d3c7f32da","df2773fac2fc5869b425ea015e8e4bd05d40067d42dc7b745a38e3f9e973a35a","28515fe84c59c02834606794559f6bb8e546cc191a74ed5cc542549b31cc73f3","1250e820509df988e3d7a723ed46021399c0e7c1d7f36224635325dae4f7c414","b80333d1b86eaf971e9e1c562892db543ca606881c83a0b57ae615c786162f54","81e4ea72311635c6773a7cc8efb81fa5dd0c79c570c6a282e28e19a5e1261e5e","2254701f53afe7f6e6933a9785464c2268d75ac7efe2bb0a1ee13262767006f6","89348929b1930f71142b436deeb021395c7ffa442356e6b8458d6e8b11f6ac9c","e0280e841a29eb76873c32d754975bb6558a0825c8402b4342465b721b9b163c","5cecb92051109b5e7443d756cefd76137ea7f8d1848b689ace5d759d9dad2bca","f9e12a0346ea49d798dfa8f0eb7d5a380b0aa1c8ca709a6d14c1dde999fa4fe2","eebd3a1c7a87327865194ae9a8221c4aafb8c2f370694d4f16ed65b6a6586685","c9de0be3c563212641c8abd9d1c05d25eab23ee219b6f0da9b715adc2d241b5e","8259b23715446b2a2be626ecd5e39204a440c1edc759f7a0515a65eb12964bc8","5e01cda2564b99495a562629eda70bc50ae3a0fc4621c36f56e11923cbe67cde","83c36cbe120e04dccbaa21694b8b4e9035831cb13cfee1924f86668dd926839b","cb9deac858b94272d2921cae2ec94c73316347649e744535f146675db3efe243","6b10c20134b500fe27250d5f5759334c5be6e812db0531dd02f3b6e11f46fc63","0b62e7641b2cbdfe30eb2a86f9736c71915ef3032275ad2eb3d24fbfd2489d8e","c856230148f4f4f21c5e493647157e9a7bddf3beff158003dc04103149fee372","f1c74228154390d48562c840799ac1a56db99db848063ff0c668dee229386682","3521a442697fac550c8f9e2459f1e8e33fc64833bc705e26ea1b6c82089b5ec6","df18b6efc265b4a901693e152900da62804c6c29d0d8f333d6dfbdbde1122bc2","f86c6feac68c3ceba6af3339385a310b2135146c38084927c791103d1af2aad0","3d34db389d03dec7deeb72156f7eb1f65952cc3e5758f5c8e1418f16789206b3","ed90ffb7bdc41351dc263229f33d4b7d3753a0541684f03fe3e33c5fdd9e5692","517f298509cddbd22512436c7dcd75b5525cb6ce3cb638d67d998930e8fda830","2730786f85fd3fcf3217de3bee518bb0ccc0244739ac46ff61aef14bec43d496","f506b4f696e6714b60ef61c7b174f01443ecf9bd72463b1770ca254962697b78","9e7697fef3e907dc72064e04edea57aae39104aa0f3b464173cd52d965da2700","665cc5a56f9423ff23075ca57d6b7bebde119d46772cb35182ca33279888b89a","f99316c0319849c939ee9729ee6f82dcdf5097b6ddfc796d5cf4d57f6c84b0ff","5b626304603ae381257a612b8a6b87b6037d31962c0e920ae5ddeedf8b66ef33","203c0366f2beb176be0fdc8df1d11a751171ca5891b6ac8ad4b3784c3307858a","a000d1deaeae53584f648601506306d0d6f965e772a73dcd513424ac7f667ef8","db60486b342a0243b302d931765073ba8880988f5d69e3c80deed1bb02945be0","61b5f40598774748f3a7279af3c2672c9fe2464e8e88c869742c618a2a35b2eb","a75ec9ef5739674a126035449f22a8aef8385bb661661d6442778042965da8d6","3235b1f0b322e0b71be8e1a816f339f83ee619fb42547a090b7f9a16dcf9765a","be8b409ab10f30e07c57c3da6ecc6981fea7243be52d734c6e89363a6e46d5cc","231dbe5d1b7558dde39b5f10730be40c6b321378eeab5b39b6875a6264aae64c","328c0341686fc044348f6403ee80bfe3e2a0ada4c5178fa681ea9e1611ac5e46","c392d1a18288926044ffe45fd6ad67dfedbc808368eb8d4fc85015e45e6ece2e","bdf1923569bcfd2b4ea12356d055c274abdfe502a70a0469a2a53d0615f56ad4","ef259cfb1894244db7193c95d459f3b606a9454fcb4416d214d5afed372632e1","18c9eed438af23a2749449816b6e2592b24c86f96925932ed5309f0e586d3c42","29c894892b1c6dce22a88d2345d63aaa216d21ef62d4e9121a8f50c9dd60677f","bf932c0315ee90d24c2449ae433a0366817233373d14b721a6bf0b14137cb180","f9cbb113897480f88babe967cf85b98030f94c42baa836afa82b30af73ca8cbf","4623170c87a7081aefc16b65b4a74bbeda82998648b40a1ee4a79dae0a08d65f","6063c0f5b068029d13c2abdd11d23fbe82a5517aad6dbab2f7c099762cde8ee4","a9ab013bb7478bc312d934dc6df549b113e04aea1e151140c41b2b01be873112","0724ebb91ec75f0f8a4d01fdf6c435763f156b01e3804251e31560ea6e6e9e4f","7da7abaa217c94897f30d6daa2392c3f6841ec442f0e56a2a9bd8ddad28559d4","ca729d51d9f9c6a7bcaf0bc67d9698dfb8ca150391014812edb9ee5c6c85d401","67f01ca6b2a5c4438141d691ca732b9a9aca977ded9a9f3031bec84d7a979453","2627ed6ce80bda4b2dd54faab24990af8c0a11ffe389b5e0953c9abe58a8c967","66be17faf4f7b8e4599b3061b31b41da6b5ffa658da8288b9538346085420168","c81e8937475c13d581804dc3de30e2d0cf6e2980c89e47698b5899e383b5b0b4","5b3b2d88d7048f851d580ed768fcae25c40eb43734ab01d5964e061239fed296","a56172806f9c15e745f3e08e22abd2a4db6be68fa8bc85d0de9f1533ac8970e7","fb6bcc31510399eb6d8fd45e7759bea6c1ff8a73c3d9488418c182c56c28ccb5","f203bdc6f46bcf66cffb43f08f4e853683dd55332bfb9d06b14771476e7da9be","6c6c3d095660aeff3ee1a723d8b3e2a1645b4336a9c396da065eaccc128e497b","4b31095237e4d5691bdde3b3ac520211f242572ca0233ef8ceb73e62cb3dff53","fa7178e2d47f965f74a7b896d5fa66d02dad489669e09284c8cb866b209b103f","c826bdf1679b4ee9cd379fb5a4361eb555e26c595c3258a67f18b53cdfbf6295","8c763791dccffb646bf32b52e208d45994284bd49589616c4e34b9d4bbdc4c50","f61e65e8d0be8366574b1dcacd9cba86e841c316b8705c2af8ed39c8d6d28199","29f7208e8fe569a28bb8a7d701604f67d591db982116f2788cbfefc65f85542a","37d57a1e56e99af8839499b0a4eb07abec14c83c30e6af48a68699a027ba0bb8","a9d0ec055d9d14d2e28e102a71ca3013eed98ee2887b489c4459461fea476ef8","0fe5ccb3ed25c120013b2d9d6ec0ad618e0b2ee699e6e12b702a11b46a406bf5","b51a3b26a1848c41a018820bb4944600f7859416d5742b906caf5fd64f75c964","0e55bd79841ae0c94d9483a763385cb273994cee202c53ee61241c80388263d6","82de7f98244f6b0c5faed6a47feafbf19cdc7852e4d22fe09ae64451ff2547a0","fc6865ab9273b3c182538d4e80df99fb61b1ab897a28768abc6fc95ba90cd3a0","ca9f8f4cbd00e83897fd9456ce24a324d7db2fa2bcc90ddc9a179d0005c9bf19"]);export function isFirstRunOrUpgrade(e){return b().lastVersion!==e}export function markVersionSeen(e){f({lastVersion:e})}const u=new Set(["ref","help","exit","quit","q","clear","cls","activate"]);function l(c){return e("sha256").update(c.trim().toUpperCase()).digest("hex")}export function isActivated(){const e=b();return!(!e.accessToken||!s.has(l(e.accessToken)))}export function getDeviceFingerprint(){const t=b();if(t.deviceFingerprint)return t.deviceFingerprint;let r=t.installSalt;r||(r=c(),f({installSalt:r}));const o=function(){try{if("darwin"===d()){const e=a("ioreg -rd1 -c IOPlatformExpertDevice | grep IOPlatformUUID",{encoding:"utf-8"}).match(/"([A-F0-9-]+)"/);if(e)return e[1]}else if("linux"===d()){if(i("/etc/machine-id"))return n("/etc/machine-id","utf-8").trim()}else if("win32"===d())return a('powershell -Command "(Get-CimInstance Win32_ComputerSystemProduct).UUID"',{encoding:"utf-8"}).trim()}catch{}return""}();return e("sha256").update(`${o}|${r}`).digest("hex")}export function activateToken(e){if(!function(e){return s.has(l(e))}(e))return"invalid";const c=getDeviceFingerprint(),a=o(t(),"token-bindings.json");let d={};if(i(a))try{d=JSON.parse(n(a,"utf-8"))}catch{}const b=l(e),u=d[b];return u&&u!==c?"already_bound":(d[b]=c,r(a,JSON.stringify(d,null,2)),f({accessToken:e.trim().toUpperCase(),deviceFingerprint:c}),"ok")}export function isDeviceMatch(){const e=b();return!e.deviceFingerprint||e.deviceFingerprint===getDeviceFingerprint()}export function isFreeCommand(e){return u.has(e.toLowerCase())}const p=()=>o(t(),"session-state.json");function m(){return{startedAt:(new Date).toISOString(),lastExitAt:null,lastResumeAt:null,exitCount:0,totalAwaySeconds:0}}function g(){const e=p();if(!i(e))return m();try{return{...m(),...JSON.parse(n(e,"utf-8"))}}catch{return m()}}function x(e){const c={...g(),...e};r(p(),JSON.stringify(c,null,2))}export function recordExit(){const e=g();e.lastExitAt=(new Date).toISOString(),e.exitCount++,x(e)}export function recordResume(){const e=g();if(!e.lastExitAt)return null;const c=new Date(e.lastExitAt).getTime(),a=Date.now(),d=Math.round((a-c)/1e3);return e.lastResumeAt=(new Date).toISOString(),e.totalAwaySeconds+=d,x(e),{awaySeconds:d,exitCount:e.exitCount}}
|
|
1
|
+
import{createHash as t,randomUUID as e}from"node:crypto";import{execSync as n}from"node:child_process";import{platform as r}from"node:os";import{getConfig as i,saveConfig as o,getIcoaDir as s}from"./config.js";import{readFileSync as c,writeFileSync as a,existsSync as u}from"node:fs";import{join as f}from"node:path";const p=/^ICOA-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$/;export function isFirstRunOrUpgrade(t){return i().lastVersion!==t}export function markVersionSeen(t){o({lastVersion:t})}const l=new Set(["ref","help","exit","quit","q","clear","cls","activate"]);export function isActivated(){return!!i().accessToken}export function getDeviceFingerprint(){const s=i();if(s.deviceFingerprint)return s.deviceFingerprint;let a=s.installSalt;a||(a=e(),o({installSalt:a}));const f=function(){try{if("darwin"===r()){const t=n("ioreg -rd1 -c IOPlatformExpertDevice | grep IOPlatformUUID",{encoding:"utf-8"}).match(/"([A-F0-9-]+)"/);if(t)return t[1]}else if("linux"===r()){if(u("/etc/machine-id"))return c("/etc/machine-id","utf-8").trim()}else if("win32"===r())return n('powershell -Command "(Get-CimInstance Win32_ComputerSystemProduct).UUID"',{encoding:"utf-8"}).trim()}catch{}return""}();return t("sha256").update(`${f}|${a}`).digest("hex")}export function activateToken(e){if(!function(t){return p.test(t.trim().toUpperCase())}(e))return"invalid";const n=getDeviceFingerprint(),r=f(s(),"token-bindings.json");let i={};if(u(r))try{i=JSON.parse(c(r,"utf-8"))}catch{}const l=function(e){return t("sha256").update(e.trim().toUpperCase()).digest("hex")}(e),d=i[l];return d&&d!==n?"already_bound":(i[l]=n,a(r,JSON.stringify(i,null,2)),o({accessToken:e.trim().toUpperCase(),deviceFingerprint:n}),"ok")}export function isDeviceMatch(){const t=i();return!t.deviceFingerprint||t.deviceFingerprint===getDeviceFingerprint()}export function isFreeCommand(t){return l.has(t.toLowerCase())}const d=()=>f(s(),"session-state.json");function m(){return{startedAt:(new Date).toISOString(),lastExitAt:null,lastResumeAt:null,exitCount:0,totalAwaySeconds:0}}function g(){const t=d();if(!u(t))return m();try{return{...m(),...JSON.parse(c(t,"utf-8"))}}catch{return m()}}function x(t){const e={...g(),...t};a(d(),JSON.stringify(e,null,2))}export function recordExit(){const t=g();t.lastExitAt=(new Date).toISOString(),t.exitCount++,x(t)}export function recordResume(){const t=g();if(!t.lastExitAt)return null;const e=new Date(t.lastExitAt).getTime(),n=Date.now(),r=Math.round((n-e)/1e3);return t.lastResumeAt=(new Date).toISOString(),t.totalAwaySeconds+=r,x(t),{awaySeconds:r,exitCount:t.exitCount}}
|
package/dist/lib/ctfd-client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createWriteStream as t,mkdirSync as e}from"node:fs";import{join as s}from"node:path";import{pipeline as
|
|
1
|
+
import{createWriteStream as t,mkdirSync as e}from"node:fs";import{join as s}from"node:path";import{pipeline as n}from"node:stream/promises";import{Readable as o}from"node:stream";export class CTFdClient{baseUrl;token;sessionCookie;csrfNonce;constructor(t,e,s,n){this.baseUrl=t.replace(/\/+$/,""),this.token=e,this.sessionCookie=s||"",this.csrfNonce=n||""}getAuthHeaders(){if(this.token)return{Authorization:`Token ${this.token}`};if(this.sessionCookie){const t={Cookie:this.sessionCookie};return this.csrfNonce&&(t["CSRF-Token"]=this.csrfNonce),t}return{}}async fetchCsrfNonce(){if(this.csrfNonce)return this.csrfNonce;try{const t=await fetch(this.baseUrl,{headers:this.sessionCookie?{Cookie:this.sessionCookie}:{}}),e=(await t.text()).match(/csrfNonce['":\s]+['"]([^'"]+)['"]/);if(e)return this.csrfNonce=e[1],this.csrfNonce}catch{}return""}async request(t,e,s){this.sessionCookie&&!this.csrfNonce&&await this.fetchCsrfNonce();const n=`${this.baseUrl}/api/v1${e}`,o={...this.getAuthHeaders()};void 0!==s&&(o["Content-Type"]="application/json");const r=await fetch(n,{method:t,headers:o,body:void 0!==s?JSON.stringify(s):void 0,redirect:"manual"});if(r.status>=300&&r.status<400)throw new Error("Authentication failed: token invalid or expired. Re-run `join <url>` to sign in again.");if(!r.ok){const t=await r.text().catch(()=>"Unknown error");if(t.trimStart().startsWith("<")){if(/banned/i.test(t))throw new Error("Account banned: this account has been banned from the competition. Contact the organizer if you believe this is an error.");throw new Error("Access denied (403). Either your session expired — re-run `join <url>` — or this account is banned / not enabled for the competition (try a different account, or contact the organizer).")}throw new Error(`CTFd API error (${r.status}): ${t}`)}if(!(r.headers.get("content-type")||"").includes("application/json")&&(await r.text().catch(()=>"")).trimStart().startsWith("<"))throw new Error("Authentication failed: server returned a login page instead of data. Re-run `join <url>`.");const i=await r.json();if(!1===i.success)throw new Error(`CTFd error: ${i.errors?.join(", ")||"Unknown error"}`);return i.data}async testConnection(){try{return await this.request("GET","/users/me")}catch(t){if(this.sessionCookie&&(t.message?.includes("403")||t.message?.includes("Authentication failed")))return this.testConnectionViaProfile();throw t}}async testConnectionViaProfile(){const t=await fetch(`${this.baseUrl}/settings`,{headers:{Cookie:this.sessionCookie}});if(!t.ok){if(403===t.status)throw new Error("ACCOUNT_BLOCKED: signed in, but this account is banned / disabled / not enabled for the competition. Use a different account, or contact the organizer.");throw new Error("Session expired or invalid.")}const e=await t.text(),s=e.match(/name="name"[^>]*value="([^"]+)"/)||e.match(/<input[^>]*id="name"[^>]*value="([^"]+)"/),n=e.match(/user_id['":\s]+(\d+)/)||e.match(/userId['":\s]+(\d+)/);if(!s&&!n)throw new Error("Authentication failed: session is not signed in. Re-run `join <url>` and check your username/password.");const o=s?.[1]||"User",r=n?parseInt(n[1],10):0,i=e.match(/csrfNonce['":\s]+['"]([^'"]+)['"]/);return i&&(this.csrfNonce=i[1]),{id:r,name:o,score:0,team_id:0,country:""}}async getChallenges(){return this.request("GET","/challenges")}async getChallenge(t){return this.request("GET",`/challenges/${t}`)}async submitFlag(t,e){this.sessionCookie&&!this.csrfNonce&&await this.fetchCsrfNonce();const s=await fetch(`${this.baseUrl}/api/v1/challenges/attempt`,{method:"POST",headers:{...this.getAuthHeaders(),"Content-Type":"application/json"},body:JSON.stringify({challenge_id:t,submission:e})});if(!s.ok){const t=await s.text().catch(()=>"Unknown error");if(t.trimStart().startsWith("<")){if(/banned/i.test(t))throw new Error("Account banned: this account has been banned from the competition. Your submission was not recorded. Contact the organizer if you believe this is an error.");throw new Error("Authentication failed: not signed in (server returned the login page). Re-run `join <url>` and check your username/password.")}throw new Error(`CTFd API error (${s.status}): ${t}`)}return(await s.json()).data}async getScoreboard(){return this.request("GET","/scoreboard")}async getTeam(){return this.request("GET","/teams/me")}async getCompetitionMeta(){const t=await fetch(this.baseUrl),e=await t.text(),s=e.match(/'start'\s*:\s*(\d+)/),n=e.match(/'end'\s*:\s*(\d+)/),o=e.match(/'userMode'\s*:\s*"([^"]+)"/),r=e.match(/'csrfNonce'\s*:\s*"([^"]+)"/);return{start:s?parseInt(s[1],10):null,end:n?parseInt(n[1],10):null,userMode:o?.[1]||"users",csrfNonce:r?.[1]||""}}async getChallengeFiles(t){return(await this.getChallenge(t)).files||[]}async downloadFile(r,i){e(i,{recursive:!0});const a=r.startsWith("http")?r:`${this.baseUrl}/${r.replace(/^\//,"")}`,c=await fetch(a,{headers:this.getAuthHeaders(),redirect:"follow"});if(!c.ok||!c.body)throw new Error(`Failed to download: ${a}`);const h=(r.split("/").pop()||"file").split("?")[0],d=s(i,h),u=t(d);return await n(o.fromWeb(c.body),u),d}async getTokenViaIcoaApi(t,e){const s=JSON.stringify({name:t,password:e}),n={"Content-Type":"application/json"};try{const t=await fetch(`${this.baseUrl}/api/icoa/token`,{method:"POST",headers:n,body:s,signal:AbortSignal.timeout(5e3)});if(t.ok){const e=await t.json();if(e.success&&e.data?.token)return e.data.token}}catch{}try{const t=await fetch(`${this.baseUrl}:9090/api/icoa/token`,{method:"POST",headers:n,body:s,signal:AbortSignal.timeout(5e3)});if(t.ok){const e=await t.json();if(e.success&&e.data?.token)return e.data.token}}catch{}return null}async tokenAuthenticates(t){try{const e=await fetch(`${this.baseUrl}/api/v1/users/me`,{headers:{Authorization:`Token ${t}`},redirect:"manual",signal:AbortSignal.timeout(5e3)});if(200!==e.status)return!1;if(!(e.headers.get("content-type")||"").includes("application/json"))return!1;const s=await e.json();return!0===s?.success}catch{return!1}}async loginWithCredentials(t,e){const s=await this.getTokenViaIcoaApi(t,e);if(s&&await this.tokenAuthenticates(s))return{token:s,session:"",csrf:""};const n=await fetch(`${this.baseUrl}/login`),o=await n.text(),r=o.match(/name="nonce"[^>]*value="([^"]+)"/)||o.match(/value="([^"]+)"[^>]*name="nonce"/)||o.match(/id="nonce"[^>]*value="([^"]+)"/)||o.match(/csrfNonce['":\s]+['"]([^'"]+)['"]/),i=r?.[1]||"";if(!i)throw new Error("Could not extract CSRF nonce from login page.");const a=n.headers.getSetCookie?.()||[],c=a.map(t=>t.split(";")[0]).join("; "),h=await fetch(`${this.baseUrl}/login`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Cookie:c},body:new URLSearchParams({name:t,password:e,nonce:i,_submit:"Submit"}),redirect:"manual"}),d=h.headers.getSetCookie?.()||[],u=new Map;for(const t of[...a,...d]){const e=t.split(";")[0],s=e.indexOf("=");s>0&&u.set(e.slice(0,s),e.slice(s+1))}const l=[...u.entries()].map(([t,e])=>`${t}=${e}`).join("; "),f=h.headers.get("location")||"";if(!(h.status>=300&&h.status<400)||f.includes("/login"))throw new Error("Invalid username or password.");try{const t=await fetch(`${this.baseUrl}/settings`,{headers:{Cookie:l}}),e=(await t.text()).match(/csrfNonce['":\s]+['"]([^'"]+)['"]/),s=e?.[1]||i,n=await fetch(`${this.baseUrl}/api/v1/tokens`,{method:"POST",headers:{"Content-Type":"application/json",Cookie:l,"CSRF-Token":s},body:JSON.stringify({expiration:"2026-12-31T23:59:59+00:00"})});if(n.ok){const t=await n.json();if(t.success&&t.data?.value)return{token:t.data.value,session:"",csrf:""}}}catch{}let w="";try{const t=await fetch(`${this.baseUrl}/challenges`,{headers:{Cookie:l}}),e=(await t.text()).match(/csrfNonce['":\s]+['"]([^'"]+)['"]/);e&&(w=e[1])}catch{}return{token:"",session:l,csrf:w}}}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fire a scrubbed integrity snapshot to the server. Best-effort, non-blocking,
|
|
3
|
+
* and self-swallowing — callers may `await` it inside an existing try/catch
|
|
4
|
+
* without risking the submit flow.
|
|
5
|
+
*/
|
|
6
|
+
export declare function postIntegritySnapshot(): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readFileSync as t}from"node:fs";import{join as n}from"node:path";import{homedir as o}from"node:os";import{getConfig as e,getBudget as i}from"./config.js";import{getCliVersion as r}from"./version.js";function s(n){try{return JSON.parse(t(n,"utf-8"))}catch{return null}}export async function postIntegritySnapshot(){try{const t=e();if("live"!==t.competitionState)return;const a=t.ctfdUrl;if(!a)return;const c=n(o(),".icoa"),p=i(),d={deviceFingerprint:t.deviceFingerprint||"",installSalt:t.installSalt||"",budget:{tokensUsed:p.tokensUsed,tokenCap:p.tokenCap},simCooldown:s(n(c,"sim-cooldown.json")),tokenBindings:s(n(c,"token-bindings.json"))},m={"Content-Type":"application/json","User-Agent":`icoa-cli/${r()}`,"X-Device-Fingerprint":t.deviceFingerprint||""};t.token&&t.userName&&(d.account=t.userName,m.Authorization=`Token ${t.token}`),await fetch(`${a}/api/icoa/snapshot`,{method:"POST",headers:m,body:JSON.stringify(d),signal:AbortSignal.timeout(8e3)})}catch{}}
|
package/dist/lib/sandbox.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{execSync as o,spawn as e}from"node:child_process";import chalk from"chalk";const r="icoa/sandbox:2026",t="icoa-sandbox";export function isDockerAvailable(){try{return o("docker info",{stdio:"ignore"}),!0}catch{return!1}}export async function ensureSandbox(){if(!isDockerAvailable())return console.log(chalk.yellow(" Docker not found. Install Docker Desktop to use sandbox tools.")),console.log(chalk.gray(" https://www.docker.com/products/docker-desktop")),!1;if(function(){try{return"true"===o(`docker inspect -f '{{.State.Running}}' ${t} 2>/dev/null`,{encoding:"utf-8"}).trim()}catch{return!1}}())return!0;try{return o(`docker start ${t}`,{stdio:"ignore"}),!0}catch{}try{o(`docker image inspect ${r}`,{stdio:"ignore"})}catch{console.log(chalk.gray(" Pulling sandbox image (first time only)..."));try{o(`docker pull ${r}`,{stdio:"inherit"})}catch{console.log(chalk.gray(" Building sandbox from local Dockerfile..."));try{const e=new URL("../../docker",import.meta.url).pathname;o(`docker build -t ${r} ${e}`,{stdio:"inherit"})}catch{return console.log(chalk.red(" Failed to set up sandbox.")),!1}}}try{return o(`docker run -d --name ${t} -v icoa-challenges:/home/competitor/challenges --network
|
|
1
|
+
import{execSync as o,spawn as e}from"node:child_process";import chalk from"chalk";const r="icoa/sandbox:2026",t="icoa-sandbox";export function isDockerAvailable(){try{return o("docker info",{stdio:"ignore"}),!0}catch{return!1}}export async function ensureSandbox(){if(!isDockerAvailable())return console.log(chalk.yellow(" Docker not found. Install Docker Desktop to use sandbox tools.")),console.log(chalk.gray(" https://www.docker.com/products/docker-desktop")),!1;if(function(){try{return"true"===o(`docker inspect -f '{{.State.Running}}' ${t} 2>/dev/null`,{encoding:"utf-8"}).trim()}catch{return!1}}())return!0;try{return o(`docker start ${t}`,{stdio:"ignore"}),!0}catch{}try{o(`docker image inspect ${r}`,{stdio:"ignore"})}catch{console.log(chalk.gray(" Pulling sandbox image (first time only)..."));try{o(`docker pull ${r}`,{stdio:"inherit"})}catch{console.log(chalk.gray(" Building sandbox from local Dockerfile..."));try{const e=new URL("../../docker",import.meta.url).pathname;o(`docker build -t ${r} ${e}`,{stdio:"inherit"})}catch{return console.log(chalk.red(" Failed to set up sandbox.")),!1}}}try{return o(`docker run -d --name ${t} -v icoa-challenges:/home/competitor/challenges --network bridge ${r} sleep infinity`,{stdio:"ignore"}),!0}catch{return console.log(chalk.red(" Failed to start sandbox container.")),!1}}export function runInSandbox(o,r){return new Promise(n=>{r.pause();const c=e("docker",["exec","-it",t,"bash","-c",o],{stdio:"inherit",shell:!0});c.on("close",()=>{r.resume(),n()}),c.on("error",()=>{r.resume(),n()})})}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import chalk from"chalk";import{spawn as t}from"node:child_process";import{existsSync as n,mkdirSync as o,writeFileSync as a}from"node:fs";import{join as r}from"node:path";import{getIcoaDir as e}from"./config.js";export function getLangCacheDir(t){return r(e(),"translations",t)}export function isLangCached(t){if("en"===t)return!0;const o=getLangCacheDir(t);return n(r(o,".cached"))
|
|
1
|
+
import chalk from"chalk";import{spawn as t}from"node:child_process";import{existsSync as n,mkdirSync as o,writeFileSync as a}from"node:fs";import{join as r}from"node:path";import{getIcoaDir as e}from"./config.js";export function getLangCacheDir(t){return r(e(),"translations",t)}export function isLangCached(t){if("en"===t)return!0;const o=getLangCacheDir(t);return n(r(o,".cached"))}export async function ensureLangCache(n,e={}){if("en"===n)return!0;if(isLangCached(n))return!0;const i=getLangCacheDir(n);o(i,{recursive:!0}),e.silent||console.log(chalk.gray(` Fetching ${n} translation pack from icoa2026.au ...`));try{const o=`https://icoa2026.au/assets/translations/${n}.tar.gz`,s=await fetch(o);if(!s.ok)return e.silent||console.log(chalk.yellow(` Translation pack not available (HTTP ${s.status}). The interface stays in English; per-question translations fall back to the on-the-fly translator.`)),!1;const c=r(i,`${n}.tar.gz`);return a(c,Buffer.from(await s.arrayBuffer())),await new Promise((n,o)=>{const a=t("tar",["-xzf",c,"-C",i],{stdio:"ignore"});a.on("close",t=>0===t?n():o(new Error(`tar exit ${t}`))),a.on("error",o)}),a(r(i,".cached"),(new Date).toISOString()),e.silent||console.log(chalk.green(` ✓ ${n} translations cached at ~/.icoa/translations/${n}/`)),!0}catch(t){return e.silent||(console.log(chalk.yellow(` Translation fetch failed: ${t instanceof Error?t.message:String(t)}`)),console.log(chalk.gray(" Falling back to on-the-fly translation for individual questions."))),!1}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "icoa-cli",
|
|
3
|
-
"version": "2.19.
|
|
3
|
+
"version": "2.19.305",
|
|
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": {
|