icoa-cli 2.19.499 → 2.19.500

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{getDeviceFingerprint as e}from"./access.js";import{LEARN_SERVER as t}from"./learn-curricula.js";import{httpFetch as a}from"./http.js";import{getConfig as n}from"./config.js";function o(e,t){const a=(n().language||"en").toLowerCase().startsWith("zh");return 502===e||503===e||504===e?a?"服务这次没能在窗口内答复 — 你的内容已安全存在服务器上。稍等一会再试即可。":"The server did not answer in time — your work is safe on the server. Wait a moment and try again.":t||`HTTP ${e}`}export async function submitPqs(a){const n=t.replace(/\/$/,"")+"/api/icoa/learn/submit";try{const t=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:a.token.toUpperCase(),card_number:a.cardNumber,device_fingerprint:e()}),signal:AbortSignal.timeout(18e4)}),r=await t.json().catch(()=>({}));if(!t.ok||!r.success||!r.data)return{ok:!1,message:o(t.status,r.message),code:r.code};const s=r.data;return{ok:!0,score:s.score,tier:s.tier,manipulation:s.manipulation,feedback:s.feedback,improve:s.improve,submissionIndex:s.submission_index,submissionsLeft:s.submissions_left,rank:s.rank,entrants:s.entrants,inTop3:s.in_top3,turns:s.turns,spent:s.spent,cap:s.cap}}catch(e){return{ok:!1,message:e instanceof Error&&"TimeoutError"===e.name?"PQS grading timed out — your conversation is safe on the server; try /submit again in a minute.":`Network error: ${e instanceof Error?e.message:String(e)}`}}}export async function viewPqsTop(a){const n=t.replace(/\/$/,"")+"/api/icoa/learn/view";try{const t=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:a.token.toUpperCase(),card_number:a.cardNumber,device_fingerprint:e()}),signal:AbortSignal.timeout(3e4)}),r=await t.json().catch(()=>({}));return t.ok&&r.success&&r.data?{ok:!0,top3:r.data.top3,myRank:r.data.my_rank,entrants:r.data.entrants}:{ok:!1,message:o(t.status,r.message),code:r.code,myRank:r.rank,entrants:r.entrants}}catch(e){return{ok:!1,message:`Network error: ${e instanceof Error?e.message:String(e)}`}}}export async function fetchMyScores(a){const n=t.replace(/\/$/,"")+"/api/icoa/learn/myscores";try{const t=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:a.token.toUpperCase(),card_lo:a.cardLo,card_hi:a.cardHi,device_fingerprint:e()}),signal:AbortSignal.timeout(8e3)}),r=await t.json().catch(()=>({}));return t.ok&&r.success&&r.data?{ok:!0,scores:r.data.scores??[]}:{ok:!1,message:o(t.status,r.message),code:r.code}}catch(e){return{ok:!1,message:`Network error: ${e instanceof Error?e.message:String(e)}`}}}export async function viewHonors(a){const n=t.replace(/\/$/,"")+"/api/icoa/learn/honors";try{const t=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:a.token.toUpperCase(),curriculum_id:a.curriculumId,card_number:a.cardNumber,device_fingerprint:e()}),signal:AbortSignal.timeout(3e4)}),r=await t.json().catch(()=>({}));return t.ok&&r.success&&r.data?{ok:!0,board:r.data.board,mine:r.data.mine??null,nickname:r.data.nickname??null,totals:r.data.totals,chapters:r.data.chapters,floor:r.data.floor,phaseBoard:r.data.phaseBoard??null}:{ok:!1,message:o(t.status,r.message),code:r.code}}catch(e){return{ok:!1,message:`Network error: ${e instanceof Error?e.message:String(e)}`}}}export async function setNickname(a){const n=t.replace(/\/$/,"")+"/api/icoa/learn/nickname";try{const t=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:a.token.toUpperCase(),nickname:a.nickname,device_fingerprint:e()}),signal:AbortSignal.timeout(3e4)}),r=await t.json().catch(()=>({}));return t.ok&&r.success&&r.data?{ok:!0,nickname:r.data.nickname}:{ok:!1,message:o(t.status,r.message),code:r.code}}catch(e){return{ok:!1,message:`Network error: ${e instanceof Error?e.message:String(e)}`}}}export async function recallCoach(n){const r=t.replace(/\/$/,"")+"/api/icoa/learn/recall";try{const t=await a(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:n.token.toUpperCase(),device_fingerprint:e(),phase:n.phase,slot:n.slot,problem_title:n.problemTitle,statement:n.statement,code:n.code,level:n.level,lang:n.lang}),signal:AbortSignal.timeout(55e3)}),s=await t.json().catch(()=>({}));return t.ok&&s.success&&s.data?.hint?{ok:!0,hint:s.data.hint,level:s.data.level,spent:s.data.spent,cap:s.data.cap}:{ok:!1,message:o(t.status,s.message),code:s.code}}catch(e){return{ok:!1,message:e instanceof Error&&"TimeoutError"===e.name?"Coach timed out — try again in a minute.":`Network error: ${e instanceof Error?e.message:String(e)}`}}}export async function streamLearnTutor(n,r){const s=t.replace(/\/$/,"")+"/api/icoa/learn/ai",i=new AbortController;let c=setTimeout(()=>i.abort(),6e4);const d=()=>{clearTimeout(c),c=setTimeout(()=>i.abort(),6e4)};try{const t=await a(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:n.token.toUpperCase(),card_number:n.cardNumber,question:n.question,mode:n.mode,history:n.history?.slice(-6),device_fingerprint:e()}),signal:i.signal});if(!t.ok||!t.body){const e=await t.json().catch(()=>({}));return{ok:!1,answer:"",message:e.message||o(t.status),code:e.code,spent:e.spent,cap:e.cap}}const c=t.body.getReader(),m=new TextDecoder;let p="",u="",l=null,g=null;for(;;){const e=await c.read();if(e.done)break;d(),p+=m.decode(e.value,{stream:!0});const t=p.split("\n");p=t.pop()??"";for(const e of t){const t=e.trim();if(!t.startsWith("data:"))continue;let a;try{a=JSON.parse(t.slice(5).trim())}catch{continue}a.r&&r({kind:"reasoning",text:a.r}),a.c&&(u+=a.c,r({kind:"content",text:a.c})),a.error&&(g=a.error),a.done&&(l=a)}}return g&&!u?{ok:!1,answer:"",message:g}:u?{ok:!0,answer:u,offtopic:!0===l?.offtopic,spent:l?.spent,cap:l?.cap}:{ok:!1,answer:"",message:"No answer received — try again."}}catch(e){return{ok:!1,answer:"",message:e instanceof Error&&"AbortError"===e.name?"AI Panda Tutor timed out (no data for 60s) — try again.":`Network error: ${e instanceof Error?e.message:String(e)}`}}finally{clearTimeout(c)}}
1
+ import{getDeviceFingerprint as e}from"./access.js";import{LEARN_SERVER as t}from"./learn-curricula.js";import{httpFetch as a}from"./http.js";import{getConfig as r}from"./config.js";function o(e,t){const a=(r().language||"en").toLowerCase().startsWith("zh");return 502===e||503===e||504===e?a?"服务这次没能在窗口内答复 — 你的内容已安全存在服务器上。稍等一会再试即可。":"The server did not answer in time — your work is safe on the server. Wait a moment and try again.":t||`HTTP ${e}`}export async function submitPqs(a){const r=t.replace(/\/$/,"")+"/api/icoa/learn/submit";try{const t=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:a.token.toUpperCase(),card_number:a.cardNumber,device_fingerprint:e()}),signal:AbortSignal.timeout(18e4)}),n=await t.json().catch(()=>({}));if(!t.ok||!n.success||!n.data)return{ok:!1,message:o(t.status,n.message),code:n.code};const s=n.data;return{ok:!0,score:s.score,tier:s.tier,manipulation:s.manipulation,feedback:s.feedback,improve:s.improve,submissionIndex:s.submission_index,submissionsLeft:s.submissions_left,rank:s.rank,entrants:s.entrants,inTop3:s.in_top3,turns:s.turns,spent:s.spent,cap:s.cap}}catch(e){return{ok:!1,message:e instanceof Error&&"TimeoutError"===e.name?"PQS grading timed out — your conversation is safe on the server; try /submit again in a minute.":`Network error: ${e instanceof Error?e.message:String(e)}`}}}export async function viewPqsTop(a){const r=t.replace(/\/$/,"")+"/api/icoa/learn/view";try{const t=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:a.token.toUpperCase(),card_number:a.cardNumber,device_fingerprint:e()}),signal:AbortSignal.timeout(3e4)}),n=await t.json().catch(()=>({}));return t.ok&&n.success&&n.data?{ok:!0,top3:n.data.top3,myRank:n.data.my_rank,entrants:n.data.entrants}:{ok:!1,message:o(t.status,n.message),code:n.code,myRank:n.rank,entrants:n.entrants}}catch(e){return{ok:!1,message:`Network error: ${e instanceof Error?e.message:String(e)}`}}}export async function fetchMyScores(a){const r=t.replace(/\/$/,"")+"/api/icoa/learn/myscores";try{const t=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:a.token.toUpperCase(),card_lo:a.cardLo,card_hi:a.cardHi,device_fingerprint:e()}),signal:AbortSignal.timeout(8e3)}),n=await t.json().catch(()=>({}));return t.ok&&n.success&&n.data?{ok:!0,scores:n.data.scores??[]}:{ok:!1,message:o(t.status,n.message),code:n.code}}catch(e){return{ok:!1,message:`Network error: ${e instanceof Error?e.message:String(e)}`}}}export async function viewHonors(a){const r=t.replace(/\/$/,"")+"/api/icoa/learn/honors";try{const t=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:a.token.toUpperCase(),curriculum_id:a.curriculumId,card_number:a.cardNumber,device_fingerprint:e()}),signal:AbortSignal.timeout(3e4)}),n=await t.json().catch(()=>({}));return t.ok&&n.success&&n.data?{ok:!0,board:n.data.board,mine:n.data.mine??null,nickname:n.data.nickname??null,totals:n.data.totals,chapters:n.data.chapters,floor:n.data.floor,phaseBoard:n.data.phaseBoard??null,practiceBoard:n.data.practiceBoard??null}:{ok:!1,message:o(t.status,n.message),code:n.code}}catch(e){return{ok:!1,message:`Network error: ${e instanceof Error?e.message:String(e)}`}}}export async function setNickname(a){const r=t.replace(/\/$/,"")+"/api/icoa/learn/nickname";try{const t=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:a.token.toUpperCase(),nickname:a.nickname,device_fingerprint:e()}),signal:AbortSignal.timeout(3e4)}),n=await t.json().catch(()=>({}));return t.ok&&n.success&&n.data?{ok:!0,nickname:n.data.nickname}:{ok:!1,message:o(t.status,n.message),code:n.code}}catch(e){return{ok:!1,message:`Network error: ${e instanceof Error?e.message:String(e)}`}}}export async function recallCoach(r){const n=t.replace(/\/$/,"")+"/api/icoa/learn/recall";try{const t=await a(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:r.token.toUpperCase(),device_fingerprint:e(),phase:r.phase,slot:r.slot,problem_title:r.problemTitle,statement:r.statement,code:r.code,level:r.level,lang:r.lang}),signal:AbortSignal.timeout(55e3)}),s=await t.json().catch(()=>({}));return t.ok&&s.success&&s.data?.hint?{ok:!0,hint:s.data.hint,level:s.data.level,spent:s.data.spent,cap:s.data.cap}:{ok:!1,message:o(t.status,s.message),code:s.code}}catch(e){return{ok:!1,message:e instanceof Error&&"TimeoutError"===e.name?"Coach timed out — try again in a minute.":`Network error: ${e instanceof Error?e.message:String(e)}`}}}export async function streamLearnTutor(r,n){const s=t.replace(/\/$/,"")+"/api/icoa/learn/ai",i=new AbortController;let c=setTimeout(()=>i.abort(),6e4);const d=()=>{clearTimeout(c),c=setTimeout(()=>i.abort(),6e4)};try{const t=await a(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:r.token.toUpperCase(),card_number:r.cardNumber,question:r.question,mode:r.mode,history:r.history?.slice(-6),device_fingerprint:e()}),signal:i.signal});if(!t.ok||!t.body){const e=await t.json().catch(()=>({}));return{ok:!1,answer:"",message:e.message||o(t.status),code:e.code,spent:e.spent,cap:e.cap}}const c=t.body.getReader(),m=new TextDecoder;let p="",u="",l=null,g=null;for(;;){const e=await c.read();if(e.done)break;d(),p+=m.decode(e.value,{stream:!0});const t=p.split("\n");p=t.pop()??"";for(const e of t){const t=e.trim();if(!t.startsWith("data:"))continue;let a;try{a=JSON.parse(t.slice(5).trim())}catch{continue}a.r&&n({kind:"reasoning",text:a.r}),a.c&&(u+=a.c,n({kind:"content",text:a.c})),a.error&&(g=a.error),a.done&&(l=a)}}return g&&!u?{ok:!1,answer:"",message:g}:u?{ok:!0,answer:u,offtopic:!0===l?.offtopic,spent:l?.spent,cap:l?.cap}:{ok:!1,answer:"",message:"No answer received — try again."}}catch(e){return{ok:!1,answer:"",message:e instanceof Error&&"AbortError"===e.name?"AI Panda Tutor timed out (no data for 60s) — try again.":`Network error: ${e instanceof Error?e.message:String(e)}`}}finally{clearTimeout(c)}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "icoa-cli",
3
- "version": "2.19.499",
3
+ "version": "2.19.500",
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": {