chofex-cli 0.1.190 → 0.1.192
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/README.md +6 -3
- package/dist/index.js +120 -55
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -51,9 +51,12 @@ Acceptance creates a default badge from the Clerk profile visible to reviewers.
|
|
|
51
51
|
while separately collecting the legal full name and venue details required for attendance. After confirmation,
|
|
52
52
|
`chofex badge regenerate` can also update those public fields and the QR
|
|
53
53
|
destination without changing the submitted application.
|
|
54
|
-
The technical challenges do not block submission, but
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
The technical challenges do not block application submission, but they are
|
|
55
|
+
mandatory for admission. An application does not reserve a seat; organizers
|
|
56
|
+
select the strongest engineers from challenge rankings. Broken Agent requires a
|
|
57
|
+
participant-only browser handoff with passkey user verification before each
|
|
58
|
+
official evaluation. Every challenge slug resolves to the current server
|
|
59
|
+
version; legacy attempts do not count toward admission.
|
|
57
60
|
|
|
58
61
|
The public ranking is read-only at `https://hacktheandes.com/challenges`.
|
|
59
62
|
|
package/dist/index.js
CHANGED
|
@@ -58554,6 +58554,7 @@ var runWith2 = (command, config) => {
|
|
|
58554
58554
|
// ../../packages/challenges-contract/src/index.ts
|
|
58555
58555
|
var blackBoxChallengeSlug = "black-box";
|
|
58556
58556
|
var brokenAgentChallengeSlug = "broken-agent";
|
|
58557
|
+
var challengeAdmissionNotice = "Los challenges técnicos son obligatorios para competir por un cupo. Enviar la postulación solo crea tu candidatura: no reserva una plaza. Siempre compites en la versión vigente; los intentos legacy no cuentan. Los mejores resultados de los rankings serán seleccionados para el evento.";
|
|
58557
58558
|
var challengeCatalog = [
|
|
58558
58559
|
{
|
|
58559
58560
|
slug: blackBoxChallengeSlug,
|
|
@@ -58836,6 +58837,7 @@ var ChallengeCatalogItemSchema = exports_Schema.Struct({
|
|
|
58836
58837
|
playable: exports_Schema.Boolean,
|
|
58837
58838
|
open: exports_Schema.Boolean,
|
|
58838
58839
|
closed: exports_Schema.optional(exports_Schema.Boolean),
|
|
58840
|
+
challengeVersion: exports_Schema.optional(exports_Schema.String),
|
|
58839
58841
|
rankingPath: exports_Schema.String
|
|
58840
58842
|
});
|
|
58841
58843
|
var ChallengeEvaluationSummarySchema = exports_Schema.Struct({
|
|
@@ -58853,6 +58855,11 @@ var ChallengeEvaluationSummarySchema = exports_Schema.Struct({
|
|
|
58853
58855
|
breakdown: exports_Schema.optional(ChallengeScoreSchema.fields.breakdown)
|
|
58854
58856
|
});
|
|
58855
58857
|
var ChallengeAttemptViewSchema = exports_Schema.Struct({
|
|
58858
|
+
admission: exports_Schema.optional(exports_Schema.Struct({
|
|
58859
|
+
challengesMandatory: exports_Schema.Literal(true),
|
|
58860
|
+
selectionBasis: exports_Schema.Literal("challenge_rankings"),
|
|
58861
|
+
notice: exports_Schema.String
|
|
58862
|
+
})),
|
|
58856
58863
|
challenge: ChallengeCatalogItemSchema,
|
|
58857
58864
|
progress: ParticipantChallengeProgressSchema,
|
|
58858
58865
|
observations: exports_Schema.Array(ChallengeObservationSchema),
|
|
@@ -58918,6 +58925,11 @@ var ChallengeRankingSchema = exports_Schema.Struct({
|
|
|
58918
58925
|
competitorCount: exports_Schema.Number
|
|
58919
58926
|
});
|
|
58920
58927
|
var ChallengeCatalogSchema = exports_Schema.Struct({
|
|
58928
|
+
admission: exports_Schema.optional(exports_Schema.Struct({
|
|
58929
|
+
challengesMandatory: exports_Schema.Literal(true),
|
|
58930
|
+
selectionBasis: exports_Schema.Literal("challenge_rankings"),
|
|
58931
|
+
notice: exports_Schema.String
|
|
58932
|
+
})),
|
|
58921
58933
|
challenges: exports_Schema.Array(ChallengeCatalogItemSchema)
|
|
58922
58934
|
});
|
|
58923
58935
|
|
|
@@ -59267,7 +59279,12 @@ var PictureUploadCompletionSchema = exports_Schema.Struct({
|
|
|
59267
59279
|
});
|
|
59268
59280
|
var RegistrationResultSchema = exports_Schema.Struct({
|
|
59269
59281
|
registration: RegistrationViewSchema,
|
|
59270
|
-
requirements: RegistrationRequirementsSchema
|
|
59282
|
+
requirements: RegistrationRequirementsSchema,
|
|
59283
|
+
admission: exports_Schema.optional(exports_Schema.Struct({
|
|
59284
|
+
challengesMandatory: exports_Schema.Literal(true),
|
|
59285
|
+
selectionBasis: exports_Schema.Literal("challenge_rankings"),
|
|
59286
|
+
notice: exports_Schema.String
|
|
59287
|
+
}))
|
|
59271
59288
|
});
|
|
59272
59289
|
var CreatedRegistrationSchema = RegistrationResultSchema;
|
|
59273
59290
|
var ApiSuccessSchema = (data) => exports_Schema.Struct({
|
|
@@ -59942,7 +59959,12 @@ var challengeParticipationNotice = (title, opensAt, closesAt, now3 = new Date) =
|
|
|
59942
59959
|
return challengeLaunchNotice(title, opensAt, now3);
|
|
59943
59960
|
};
|
|
59944
59961
|
var challengeListText = (catalog) => {
|
|
59945
|
-
const lines2 = [
|
|
59962
|
+
const lines2 = [
|
|
59963
|
+
`${eventName} challenges`,
|
|
59964
|
+
"",
|
|
59965
|
+
catalog.admission?.notice ?? challengeAdmissionNotice,
|
|
59966
|
+
""
|
|
59967
|
+
];
|
|
59946
59968
|
for (const challenge of catalog.challenges) {
|
|
59947
59969
|
let state = `abre ${formatChallengeOpeningInPeru(challenge.opensAt)}`;
|
|
59948
59970
|
if (challenge.closed) {
|
|
@@ -59955,6 +59977,9 @@ var challengeListText = (catalog) => {
|
|
|
59955
59977
|
const playable = challenge.playable ? "" : " (próximamente)";
|
|
59956
59978
|
lines2.push(`${challenge.code} ${challenge.theme} — ${challenge.title}${playable}`);
|
|
59957
59979
|
lines2.push(` ${challenge.coreSkill} · ${challenge.formatLabel} · ${state}`);
|
|
59980
|
+
if (challenge.challengeVersion) {
|
|
59981
|
+
lines2.push(` Versión vigente: ${challenge.challengeVersion}`);
|
|
59982
|
+
}
|
|
59958
59983
|
lines2.push(` Ranking: ${challenge.rankingPath}`);
|
|
59959
59984
|
lines2.push("");
|
|
59960
59985
|
}
|
|
@@ -59979,6 +60004,10 @@ var challengeShowText = (attempt) => {
|
|
|
59979
60004
|
`${challenge.title.toUpperCase()} — CASO #${challenge.code}`,
|
|
59980
60005
|
challenge.summary,
|
|
59981
60006
|
"",
|
|
60007
|
+
attempt.admission?.notice ?? challengeAdmissionNotice,
|
|
60008
|
+
"",
|
|
60009
|
+
`VERSIÓN VIGENTE: ${challenge.challengeVersion ?? "administrada por el servidor"}`,
|
|
60010
|
+
"",
|
|
59982
60011
|
`ESTADO DEL CASO: ${caseStatus2}`,
|
|
59983
60012
|
"",
|
|
59984
60013
|
"Los tests públicos están verdes. Tu trabajo es hacer que el scheduler sea confiable bajo condiciones de producción.",
|
|
@@ -60011,6 +60040,10 @@ var challengeShowText = (attempt) => {
|
|
|
60011
60040
|
`${challenge.title.toUpperCase()} — CASE #${challenge.code}`,
|
|
60012
60041
|
challenge.summary,
|
|
60013
60042
|
"",
|
|
60043
|
+
attempt.admission?.notice ?? challengeAdmissionNotice,
|
|
60044
|
+
"",
|
|
60045
|
+
`CURRENT VERSION: ${challenge.challengeVersion ?? "server-managed"}`,
|
|
60046
|
+
"",
|
|
60014
60047
|
`CASE STATUS: ${caseStatus}`,
|
|
60015
60048
|
"",
|
|
60016
60049
|
"Your job is to replace the machine, not merely guess its next answer.",
|
|
@@ -60205,31 +60238,17 @@ var challengeTestText = (result3) => {
|
|
|
60205
60238
|
`);
|
|
60206
60239
|
};
|
|
60207
60240
|
var challengeEvaluateText = (result3) => {
|
|
60208
|
-
if (result3.
|
|
60209
|
-
const executionCost = result3.executionCost ?? result3.runtimeMs;
|
|
60210
|
-
const capabilityLines = [
|
|
60211
|
-
["Comportamiento base", result3.breakdown.coreBehavior],
|
|
60212
|
-
["Persistencia", result3.breakdown.persistence],
|
|
60213
|
-
["Concurrencia", result3.breakdown.concurrency],
|
|
60214
|
-
["Recuperación", result3.breakdown.failureRecovery],
|
|
60215
|
-
["Idempotencia", result3.breakdown.idempotency],
|
|
60216
|
-
["Sin regresiones", result3.breakdown.regressionSafety],
|
|
60217
|
-
["Rendimiento", result3.breakdown.performance]
|
|
60218
|
-
];
|
|
60241
|
+
if (result3.rankingPath === "/challenges/broken-agent") {
|
|
60219
60242
|
const lines3 = [
|
|
60220
60243
|
"VEREDICTO OFICIAL — BROKEN AGENT — PREPARACIÓN PARA PRODUCCIÓN",
|
|
60221
|
-
`Puntaje ${(result3.accuracy * 100).toFixed(2)} / ${result3.sampleSize}
|
|
60222
|
-
`Costo determinístico ${executionCost} ops`,
|
|
60223
|
-
"",
|
|
60224
|
-
"Puntajes por capacidad",
|
|
60225
|
-
...capabilityLines.map(([label, score]) => `${label.padEnd(20)}${score.earned.toFixed(2)} / ${score.available}`)
|
|
60244
|
+
`Puntaje ${(result3.accuracy * 100).toFixed(2)} / ${result3.sampleSize}`
|
|
60226
60245
|
];
|
|
60227
60246
|
if (result3.rank !== undefined) {
|
|
60228
60247
|
lines3.push(`Puesto #${result3.rank}`);
|
|
60229
60248
|
}
|
|
60230
60249
|
lines3.push(`Evaluaciones oficiales restantes ${result3.evaluationsRemaining} / ${result3.evaluationsLimit}`, "", result3.shareText, "", "Siguiente: consulta el ranking", " chofex challenge ranking --challenge broken-agent");
|
|
60231
60250
|
if (result3.evaluationsRemaining > 0) {
|
|
60232
|
-
lines3.push("", "El
|
|
60251
|
+
lines3.push("", "El veredicto es un solo puntaje. No dice qué caso falló. Razona antes de volver a enviar.", " chofex challenge test --challenge broken-agent --source ./scheduler.js");
|
|
60233
60252
|
}
|
|
60234
60253
|
return lines3.join(`
|
|
60235
60254
|
`);
|
|
@@ -60265,16 +60284,14 @@ var challengeRankingText = (ranking, now3 = new Date) => {
|
|
|
60265
60284
|
`);
|
|
60266
60285
|
}
|
|
60267
60286
|
if (ranking.challenge.slug === "broken-agent") {
|
|
60268
|
-
lines2.push("Psto Puntaje Puntos
|
|
60287
|
+
lines2.push("Psto Puntaje Puntos Nombre");
|
|
60269
60288
|
for (const entry of ranking.entries.slice(0, 20)) {
|
|
60270
60289
|
const rank = String(entry.rank).padStart(4, " ");
|
|
60271
60290
|
const accuracy = percent(entry.accuracy).padStart(8, " ");
|
|
60272
60291
|
const points = `${entry.exactCount}/${entry.sampleSize}`.padStart(11, " ");
|
|
60273
|
-
const executionCost = entry.executionCost ?? entry.runtimeMs;
|
|
60274
|
-
const runtime = `${executionCost}ops`.padStart(8, " ");
|
|
60275
60292
|
const profileLinks = [entry.githubUrl, entry.linkedInUrl].filter(Boolean);
|
|
60276
60293
|
const participant = [entry.displayName, ...profileLinks].join(" ");
|
|
60277
|
-
lines2.push(`${rank} ${accuracy} ${points} ${
|
|
60294
|
+
lines2.push(`${rank} ${accuracy} ${points} ${participant}`);
|
|
60278
60295
|
}
|
|
60279
60296
|
return lines2.join(`
|
|
60280
60297
|
`);
|
|
@@ -60500,6 +60517,10 @@ contra escenarios ocultos. Las herramientas de AI están permitidas, pero este e
|
|
|
60500
60517
|
un challenge de colaboración: el agente implementa y el participante toma las
|
|
60501
60518
|
decisiones de ingeniería.
|
|
60502
60519
|
|
|
60520
|
+
Los challenges técnicos son obligatorios para competir por un cupo. Enviar la
|
|
60521
|
+
postulación solo crea tu candidatura: no reserva una plaza. Los mejores
|
|
60522
|
+
resultados de los rankings serán seleccionados para el evento.
|
|
60523
|
+
|
|
60503
60524
|
## Protocolo humano–agente
|
|
60504
60525
|
|
|
60505
60526
|
No le pidas al agente que resuelva todo en silencio. Antes de modificar el
|
|
@@ -60541,6 +60562,13 @@ explicar, debatir y guardar tus respuestas, pero no puede elegir el foco, invent
|
|
|
60541
60562
|
tu razonamiento ni tomar la decisión de release por ti. Si cambias
|
|
60542
60563
|
\`scheduler.js\`, vuelve a revisar la evidencia antes de reemplazar el review.
|
|
60543
60564
|
|
|
60565
|
+
La primera ejecución de \`challenge evaluate\` crea un enlace corto de
|
|
60566
|
+
aprobación y **no consume** una evaluación. Abre ese enlace personalmente,
|
|
60567
|
+
revisa el review vinculado al SHA-256 exacto y confirma con Face ID, Touch ID,
|
|
60568
|
+
Windows Hello, PIN del dispositivo o una llave de seguridad. Después repite el
|
|
60569
|
+
mismo comando para ejecutar la evaluación oficial. Cada evaluación requiere una
|
|
60570
|
+
aprobación nueva; la sesión OAuth del CLI no puede aprobarla.
|
|
60571
|
+
|
|
60544
60572
|
## Contrato normativo
|
|
60545
60573
|
|
|
60546
60574
|
\`createScheduler({ store, clock, execute, workerId })\` devuelve:
|
|
@@ -60575,13 +60603,13 @@ tu razonamiento ni tomar la decisión de release por ti. Si cambias
|
|
|
60575
60603
|
- El store sobrevive nuevas instancias del scheduler y reinicios del proceso.
|
|
60576
60604
|
- Varios workers, incluso instancias que reutilizan un \`workerId\` después de
|
|
60577
60605
|
reiniciar, pueden llamar \`runDue()\` contra el mismo store.
|
|
60578
|
-
- \`runDue()\`
|
|
60579
|
-
|
|
60580
|
-
- Cada ejecución debe reclamarse atómicamente
|
|
60581
|
-
|
|
60582
|
-
|
|
60583
|
-
|
|
60584
|
-
|
|
60606
|
+
- \`runDue()\` reclama un job antes de llamar al executor. Un job que falla
|
|
60607
|
+
queda pendiente para una llamada posterior y no bloquea otros jobs.
|
|
60608
|
+
- Cada ejecución debe reclamarse atómicamente. El claim dura 30 segundos.
|
|
60609
|
+
Cuando \`clock.now()\` alcanza ese deadline, otro worker puede reclamar el
|
|
60610
|
+
job. Un worker que ya no es dueño del claim, incluido un proceso que vuelve
|
|
60611
|
+
con el mismo \`workerId\`, no puede completarlo, marcarlo como fallido ni
|
|
60612
|
+
reabrirlo.
|
|
60585
60613
|
- Un intento se cuenta al reclamar el job. Después de 3 ejecuciones fallidas el
|
|
60586
60614
|
job queda failed.
|
|
60587
60615
|
- \`execute(job)\` puede fallar antes o después de aplicar el efecto. El adapter
|
|
@@ -60598,24 +60626,13 @@ ofrece operaciones síncronas \`get(id)\`, \`put(job)\`, \`delete(id)\` y
|
|
|
60598
60626
|
|
|
60599
60627
|
## Evaluación
|
|
60600
60628
|
|
|
60601
|
-
El evaluador usa variantes determinísticas por participante
|
|
60602
|
-
|
|
60603
|
-
|
|
60604
|
-
|
|
60605
|
-
- Comportamiento base: 10 puntos
|
|
60606
|
-
- Persistencia: 15 puntos
|
|
60607
|
-
- Concurrencia: 20 puntos
|
|
60608
|
-
- Recuperación ante fallas: 20 puntos
|
|
60609
|
-
- Idempotencia: 15 puntos
|
|
60610
|
-
- Seguridad contra regresiones: 15 puntos
|
|
60611
|
-
- Rendimiento: 5 puntos, solo si la carga termina correctamente y sin perder
|
|
60612
|
-
seguridad de concurrencia
|
|
60629
|
+
El evaluador usa variantes determinísticas por participante. El veredicto
|
|
60630
|
+
oficial es un solo puntaje sobre 100. No incluye casos ocultos, un desglose por
|
|
60631
|
+
capacidad ni un costo de ejecución.
|
|
60613
60632
|
|
|
60614
60633
|
El ranking exige una postulación enviada o revisada. Ordena por puntaje total,
|
|
60615
|
-
menos evaluaciones oficiales,
|
|
60616
|
-
envío.
|
|
60617
|
-
una carga equivalente para todos; no usa tiempo de servidor. Todos los puntajes
|
|
60618
|
-
válidos aparecen en el ranking.
|
|
60634
|
+
luego por menos evaluaciones oficiales y, al final, por la hora del mejor
|
|
60635
|
+
envío. Todos los puntajes válidos aparecen en el ranking.
|
|
60619
60636
|
`;
|
|
60620
60637
|
var brokenAgentPublicTestSource = `const test = require("node:test");
|
|
60621
60638
|
const assert = require("node:assert/strict");
|
|
@@ -60821,7 +60838,7 @@ var root = exports_Command.make("chofex").pipe(exports_Command.withSharedFlags({
|
|
|
60821
60838
|
apiUrl: exports_Flag.string(rootValueFlagNames.apiUrl).pipe(exports_Flag.withDefault(config.apiUrl), exports_Flag.withDescription("Chofex API base URL")),
|
|
60822
60839
|
output: exports_Flag.choice(rootValueFlagNames.output, ["human", "json"]).pipe(exports_Flag.withDefault("human"), exports_Flag.withDescription("Output format")),
|
|
60823
60840
|
token: exports_Flag.string(rootValueFlagNames.token).pipe(exports_Flag.optional, exports_Flag.withDescription("Clerk OAuth token (prefer CHOFEX_TOKEN to avoid shell history)"))
|
|
60824
|
-
}), exports_Command.withDescription(`
|
|
60841
|
+
}), exports_Command.withDescription(`Apply to ${eventName} and compete for a seat through the mandatory technical challenges`));
|
|
60825
60842
|
|
|
60826
60843
|
// src/output.ts
|
|
60827
60844
|
var printJson = (value3) => exports_Effect.sync(() => {
|
|
@@ -60900,8 +60917,14 @@ var requirementsText = (result3) => {
|
|
|
60900
60917
|
if (requirements.stage === "draft") {
|
|
60901
60918
|
return `Application draft in progress.${registrationPartsText(result3)}`;
|
|
60902
60919
|
}
|
|
60903
|
-
if (requirements.stage === "review")
|
|
60904
|
-
return
|
|
60920
|
+
if (requirements.stage === "review") {
|
|
60921
|
+
return [
|
|
60922
|
+
"Application received. A seat has not been assigned.",
|
|
60923
|
+
result3.admission?.notice ?? challengeAdmissionNotice,
|
|
60924
|
+
"Next command: chofex challenge"
|
|
60925
|
+
].join(`
|
|
60926
|
+
`);
|
|
60927
|
+
}
|
|
60905
60928
|
let feedback = "";
|
|
60906
60929
|
const rejectionReason = requirements.rejectionReason ?? registration.rejectionReason;
|
|
60907
60930
|
if (rejectionReason) {
|
|
@@ -60960,9 +60983,11 @@ var challengeQuickstart = {
|
|
|
60960
60983
|
],
|
|
60961
60984
|
mission: "Audita scheduler.js, conserva createScheduler(dependencies) y haz que el sistema cumpla el contrato de producción.",
|
|
60962
60985
|
rules: [
|
|
60986
|
+
"Los challenges son obligatorios: enviar la postulación no reserva un cupo.",
|
|
60987
|
+
"Los mejores resultados de los rankings serán seleccionados para el evento.",
|
|
60963
60988
|
"Tienes 5 evaluaciones oficiales contra variantes ocultas y determinísticas por participante.",
|
|
60964
60989
|
"Los tests locales y públicos son ilimitados.",
|
|
60965
|
-
"Gana el puntaje total; los empates usan menos evaluaciones
|
|
60990
|
+
"Gana el puntaje total; los empates usan menos evaluaciones y la hora del mejor envío.",
|
|
60966
60991
|
"Las herramientas de AI están permitidas, pero el participante toma las decisiones de ingeniería."
|
|
60967
60992
|
],
|
|
60968
60993
|
workflow: [
|
|
@@ -61016,12 +61041,24 @@ var challengeQuickstart = {
|
|
|
61016
61041
|
},
|
|
61017
61042
|
{
|
|
61018
61043
|
step: 9,
|
|
61019
|
-
action: "
|
|
61044
|
+
action: "Crea el handoff de evaluación",
|
|
61020
61045
|
command: "chofex challenge evaluate --challenge broken-agent --source ./scheduler.js --review ./review.json",
|
|
61021
|
-
note: "
|
|
61046
|
+
note: "Devuelve un enlace de aprobación sin consumir una evaluación oficial."
|
|
61022
61047
|
},
|
|
61023
61048
|
{
|
|
61024
61049
|
step: 10,
|
|
61050
|
+
action: "El participante aprueba en el navegador",
|
|
61051
|
+
command: "Abre approvalUrl personalmente",
|
|
61052
|
+
note: "Revisa el razonamiento y confirma con Face ID, Touch ID, Windows Hello, PIN o llave de seguridad. El agente no puede completar este paso."
|
|
61053
|
+
},
|
|
61054
|
+
{
|
|
61055
|
+
step: 11,
|
|
61056
|
+
action: "Solicita el veredicto oculto",
|
|
61057
|
+
command: "chofex challenge evaluate --challenge broken-agent --source ./scheduler.js --review ./review.json",
|
|
61058
|
+
note: "Repite el mismo comando antes de que venza la aprobación; recién entonces consume una evaluación."
|
|
61059
|
+
},
|
|
61060
|
+
{
|
|
61061
|
+
step: 12,
|
|
61025
61062
|
action: "Consulta el ranking",
|
|
61026
61063
|
command: "chofex challenge ranking --challenge broken-agent",
|
|
61027
61064
|
note: "Se revela el 1 de octubre a las 15:00, hora de Perú."
|
|
@@ -61074,6 +61111,34 @@ var optionalString = (name, description) => exports_Flag.string(name).pipe(expor
|
|
|
61074
61111
|
var challengeFlag = exports_Flag.string("challenge").pipe(exports_Flag.withDefault(defaultChallengeSlug), exports_Flag.withDescription("Challenge slug (default: broken-agent)"));
|
|
61075
61112
|
var sourceFlag = optionalString("source", "JavaScript challenge solution file");
|
|
61076
61113
|
var reviewFlag = optionalString("review", "Participant-authored Broken Agent engineering review JSON");
|
|
61114
|
+
var evaluationErrorText = (error2) => {
|
|
61115
|
+
if (error2.code !== "HUMAN_APPROVAL_REQUIRED")
|
|
61116
|
+
return;
|
|
61117
|
+
if (!error2.details || typeof error2.details !== "object")
|
|
61118
|
+
return;
|
|
61119
|
+
const details = error2.details;
|
|
61120
|
+
if (typeof details.approvalUrl !== "string")
|
|
61121
|
+
return;
|
|
61122
|
+
let retryCommand = "chofex challenge evaluate --challenge broken-agent --source ./scheduler.js --review ./review.json";
|
|
61123
|
+
if (typeof details.retryCommand === "string") {
|
|
61124
|
+
retryCommand = details.retryCommand;
|
|
61125
|
+
}
|
|
61126
|
+
const lines2 = [
|
|
61127
|
+
"INTERVENCIÓN DEL PARTICIPANTE REQUERIDA",
|
|
61128
|
+
"La evaluación todavía no consumió un intento.",
|
|
61129
|
+
"",
|
|
61130
|
+
"El participante debe abrir personalmente este enlace, revisar sus respuestas y aprobar con Face ID, Touch ID, Windows Hello, PIN o llave de seguridad:",
|
|
61131
|
+
` ${details.approvalUrl}`,
|
|
61132
|
+
"",
|
|
61133
|
+
"Después de aprobar, repite:",
|
|
61134
|
+
` ${retryCommand}`
|
|
61135
|
+
];
|
|
61136
|
+
if (typeof details.expiresAt === "string") {
|
|
61137
|
+
lines2.push("", `La aprobación vence: ${details.expiresAt}`);
|
|
61138
|
+
}
|
|
61139
|
+
return lines2.join(`
|
|
61140
|
+
`);
|
|
61141
|
+
};
|
|
61077
61142
|
var inputFlag = optionalString("input", "JSON file, or - for stdin");
|
|
61078
61143
|
var formatFlag = exports_Flag.choice("format", ["table", "json", "csv"]).pipe(exports_Flag.withDefault("table"), exports_Flag.withDescription("Notebook format"));
|
|
61079
61144
|
var numberFromOption = (value3) => {
|
|
@@ -61270,8 +61335,8 @@ var evaluateCommand = exports_Command.make("evaluate", { challenge: challengeFla
|
|
|
61270
61335
|
const solution = yield* challengeEvaluationInput(exports_Option.getOrUndefined(source), exports_Option.getOrUndefined(review), challenge);
|
|
61271
61336
|
return yield* evaluateChallenge({ apiUrl: options.apiUrl, token }, challenge, solution);
|
|
61272
61337
|
});
|
|
61273
|
-
yield* execute(options.output, operation, challengeEvaluateText);
|
|
61274
|
-
})).pipe(exports_Command.withDescription("Score a solution on hidden cases.
|
|
61338
|
+
yield* execute(options.output, operation, challengeEvaluateText, evaluationErrorText);
|
|
61339
|
+
})).pipe(exports_Command.withDescription("Score a solution on hidden cases. Broken Agent requires participant browser approval before a limited evaluation is consumed."), exports_Command.withExamples([
|
|
61275
61340
|
{
|
|
61276
61341
|
command: "chofex challenge evaluate --challenge broken-agent --source ./scheduler.js --review ./review.json",
|
|
61277
61342
|
description: "Consume una evaluación oficial cuando tu solución esté lista"
|
|
@@ -61332,7 +61397,7 @@ var challengeCommand = exports_Command.make("challenge", {}, exports_Effect.fn("
|
|
|
61332
61397
|
return;
|
|
61333
61398
|
}
|
|
61334
61399
|
yield* exports_Console.log(challengeQuickstartText(participationState, launchNotice));
|
|
61335
|
-
})).pipe(exports_Command.withDescription("Compite en challenges técnicos. Ejecuta el comando sin subcomandos para abrir la guía del challenge actual."), exports_Command.withExamples([
|
|
61400
|
+
})).pipe(exports_Command.withDescription("Compite en challenges técnicos obligatorios por un cupo. Ejecuta el comando sin subcomandos para abrir la guía del challenge actual."), exports_Command.withExamples([
|
|
61336
61401
|
{
|
|
61337
61402
|
command: "chofex challenge",
|
|
61338
61403
|
description: "Abre la guía de Broken Agent"
|