{"version":3,"file":"stdio.cjs","names":["z","parseArgs","readProblemMarkdownFrontMatter","readTestCases","path","judgeByStaticAnalysis","findEntryPointFile","DecisionCode","findLanguageDefinitionByPath","spawnSyncWithTimeout","snapshotWorkingDirectory","copyTestCaseFileInput","readOutputFiles","compareStdoutAsSpaceSeparatedTokens","fs","isSafeSubmissionOutputPath","cleanWorkingDirectory"],"sources":["../../src/presets/stdio.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { compareStdoutAsSpaceSeparatedTokens } from '../helpers/compareStdoutAsSpaceSeparatedTokens.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { isSafeSubmissionOutputPath, readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { makeAccessibleToSandboxUser } from '../helpers/sandboxUser.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst DEBUG_DEFAULT_TIMEOUT_SECONDS = 10;\n\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n  language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\nconst debugParamsSchema = judgeParamsSchema.extend({\n  stdin: z.string().optional(),\n});\n\n/**\n * A preset judge function using stdin and stdout as test cases.\n *\n * A standard stdio problem must NOT commit a `judge.ts` that only calls this preset: the Exercode\n * server applies this preset automatically when `judge.ts` is absent, and committed copies would\n * drift from the server's defaults.\n *\n * @example\n * Run in a problem directory without `judge.ts`:\n * ```bash\n * bun x exercode-problem judge model_answers/java\n * ```\n *\n * Run with the optional parameters:\n * ```bash\n * bun x exercode-problem judge model_answers/java '{ \"language\": \"javascript\" }'\n * ```\n */\nexport async function stdioJudgePreset(problemDir: string): Promise<void> {\n  const args = parseArgs(process.argv);\n  if (!args.cwd) throw new Error('cwd argument required');\n  const params = judgeParamsSchema.parse(args.params);\n\n  // The sandboxed submission must read its sources and write build/run outputs in its directory.\n  makeAccessibleToSandboxUser(args.cwd);\n\n  const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n  const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n  const staticAnalysisTestCaseResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n  if (staticAnalysisTestCaseResult) {\n    printTestCaseResult({ testCaseId: testCases[0]?.id ?? 'prebuild', ...staticAnalysisTestCaseResult });\n    return;\n  }\n\n  const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n  if (!originalMainFilePath) {\n    printTestCaseResult({\n      testCaseId: testCases[0]?.id ?? 'prebuild',\n      decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n      stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n    });\n    return;\n  }\n\n  const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n  if (!languageDefinition) {\n    printTestCaseResult({\n      testCaseId: testCases[0]?.id ?? 'prebuild',\n      decisionCode: DecisionCode.WRONG_ANSWER,\n      stderr: 'unsupported language',\n    });\n    return;\n  }\n\n  // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n  const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n  let prebuiltMainFilePath: string | undefined;\n\n  if (languageDefinition.prebuild) {\n    try {\n      await languageDefinition.prebuild(args.cwd);\n      prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n    } catch (error) {\n      console.error('prebuild error', error);\n\n      printTestCaseResult({\n        testCaseId: testCases[0]?.id ?? 'prebuild',\n        decisionCode: DecisionCode.BUILD_ERROR,\n        stderr: error instanceof Error ? error.message : String(error),\n      });\n      return;\n    }\n  }\n\n  const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n  if (languageDefinition.buildCommand) {\n    try {\n      const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n      const buildSpawnResult = spawnSyncWithTimeout(\n        buildCommand[0],\n        buildCommand.slice(1),\n        { cwd: args.cwd, encoding: 'utf8', env },\n        BUILD_TIMEOUT_SECONDS\n      );\n\n      let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n      if (buildSpawnResult.status !== 0) {\n        decisionCode = DecisionCode.BUILD_ERROR;\n      } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n        decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n      } else if (\n        buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n        buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n      ) {\n        decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n      }\n\n      if (decisionCode !== DecisionCode.ACCEPTED) {\n        printTestCaseResult({\n          testCaseId: testCases[0]?.id ?? 'build',\n          decisionCode,\n          exitStatus: buildSpawnResult.status ?? undefined,\n          stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n          stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n          timeSeconds: buildSpawnResult.timeSeconds,\n          memoryBytes: buildSpawnResult.memoryBytes,\n        });\n        return;\n      }\n    } catch (error) {\n      console.error('build error', error);\n\n      printTestCaseResult({\n        testCaseId: testCases[0]?.id ?? 'build',\n        decisionCode: DecisionCode.BUILD_ERROR,\n        stderr: error instanceof Error ? error.message : String(error),\n      });\n      return;\n    }\n  }\n\n  const cwdSnapshot = await snapshotWorkingDirectory(args.cwd);\n\n  if (testCases.length === 0) {\n    printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n  }\n\n  for (const testCase of testCases) {\n    // prepare test case\n    if (testCases.shared?.fileInputPath) await copyTestCaseFileInput(testCases.shared.fileInputPath, args.cwd);\n    if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n    // run\n    const timeoutSeconds =\n      typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n        ? problemMarkdownFrontMatter.timeLimitMs / 1000\n        : JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n    const command = languageDefinition.command(mainFilePath);\n\n    const spawnResult = spawnSyncWithTimeout(\n      command[0],\n      command.slice(1),\n      { cwd: args.cwd, encoding: 'utf8', input: testCase.input, env },\n      timeoutSeconds\n    );\n\n    const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n    // calculate decision\n    let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n    if (spawnResult.status !== 0) {\n      decisionCode = DecisionCode.RUNTIME_ERROR;\n    } else if (spawnResult.timeSeconds > timeoutSeconds) {\n      decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n    } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n      decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n    } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n      decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n    } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n      decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n    } else if (!compareStdoutAsSpaceSeparatedTokens(spawnResult.stdout, testCase.output ?? '')) {\n      decisionCode = DecisionCode.WRONG_ANSWER;\n    } else if (testCase.fileOutputPath) {\n      const dirents = await fs.promises.readdir(testCase.fileOutputPath, { withFileTypes: true, recursive: true });\n      for (const dirent of dirents) {\n        if (!dirent.isFile()) continue;\n        const direntRelativePath = path.relative(testCase.fileOutputPath, dirent.parentPath);\n        const expected = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name));\n        try {\n          const receivedPath = path.join(args.cwd, direntRelativePath, dirent.name);\n          // A submission-planted symlink to the expected file itself would otherwise compare equal.\n          if (!(await isSafeSubmissionOutputPath(args.cwd, receivedPath))) throw new Error('unsafe output path');\n          const received = await fs.promises.readFile(receivedPath);\n          if (received.compare(expected) !== 0) decisionCode = DecisionCode.WRONG_ANSWER;\n        } catch (error) {\n          console.error(error);\n          decisionCode = DecisionCode.WRONG_ANSWER;\n        }\n      }\n    }\n\n    printTestCaseResult({\n      testCaseId: testCase.id,\n      decisionCode,\n      exitStatus: spawnResult.status ?? undefined,\n      stdin: testCase.input,\n      stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n      stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n      timeSeconds: spawnResult.timeSeconds,\n      memoryBytes: spawnResult.memoryBytes,\n      outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n    });\n\n    // clean up\n    await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n\n    if (decisionCode !== DecisionCode.ACCEPTED) break;\n  }\n}\n\n/**\n * A preset debug function using stdin and stdout as test cases.\n *\n * A standard stdio problem must NOT commit a `debug.ts` that only calls this preset: the Exercode\n * server applies this preset automatically when `debug.ts` is absent, and committed copies would\n * drift from the server's defaults.\n *\n * @example\n * Run in a problem directory without `debug.ts`:\n * ```bash\n * bun x exercode-problem debug model_answers/java '{ \"stdin\": \"1 2\" }'\n * ```\n */\nexport async function stdioDebugPreset(problemDir: string): Promise<void> {\n  const args = parseArgs(process.argv);\n  if (!args.cwd) throw new Error('cwd argument required');\n  const params = debugParamsSchema.parse(args.params);\n\n  // The sandboxed submission must read its sources and write build/run outputs in its directory.\n  makeAccessibleToSandboxUser(args.cwd);\n\n  const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n\n  const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n  if (!originalMainFilePath) {\n    printTestCaseResult({\n      testCaseId: 'prebuild',\n      decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n      stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n    });\n    return;\n  }\n\n  const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n  if (!languageDefinition) {\n    printTestCaseResult({\n      testCaseId: 'prebuild',\n      decisionCode: DecisionCode.WRONG_ANSWER,\n      stderr: 'unsupported language',\n    });\n    return;\n  }\n\n  // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n  const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n  let prebuiltMainFilePath: string | undefined;\n\n  if (languageDefinition.prebuild) {\n    try {\n      await languageDefinition.prebuild(args.cwd);\n      prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n    } catch (error) {\n      console.error('prebuild error', error);\n\n      printTestCaseResult({\n        testCaseId: 'prebuild',\n        decisionCode: DecisionCode.BUILD_ERROR,\n        stderr: error instanceof Error ? error.message : String(error),\n      });\n      return;\n    }\n  }\n\n  const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n  if (languageDefinition.buildCommand) {\n    try {\n      const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n      const buildSpawnResult = spawnSyncWithTimeout(\n        buildCommand[0],\n        buildCommand.slice(1),\n        { cwd: args.cwd, encoding: 'utf8', env },\n        BUILD_TIMEOUT_SECONDS\n      );\n\n      let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n      if (buildSpawnResult.status !== 0) {\n        decisionCode = DecisionCode.BUILD_ERROR;\n      } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n        decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n      } else if (\n        buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n        buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n      ) {\n        decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n      }\n\n      if (decisionCode !== DecisionCode.ACCEPTED) {\n        printTestCaseResult({\n          testCaseId: 'build',\n          decisionCode,\n          exitStatus: buildSpawnResult.status ?? undefined,\n          stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n          stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n          timeSeconds: buildSpawnResult.timeSeconds,\n          memoryBytes: buildSpawnResult.memoryBytes,\n        });\n        return;\n      }\n    } catch (error) {\n      console.error('build error', error);\n\n      printTestCaseResult({\n        testCaseId: 'build',\n        decisionCode: DecisionCode.BUILD_ERROR,\n        stderr: error instanceof Error ? error.message : String(error),\n      });\n      return;\n    }\n  }\n\n  {\n    const timeoutSeconds = Math.max(\n      DEBUG_DEFAULT_TIMEOUT_SECONDS,\n      (problemMarkdownFrontMatter.timeLimitMs ?? 0) / 1000\n    );\n\n    const command = languageDefinition.command(mainFilePath);\n\n    const spawnResult = spawnSyncWithTimeout(\n      command[0],\n      command.slice(1),\n      { cwd: args.cwd, encoding: 'utf8', input: params.stdin, env },\n      timeoutSeconds\n    );\n\n    const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n    let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n    if (spawnResult.status !== 0) {\n      decisionCode = DecisionCode.RUNTIME_ERROR;\n    } else if (spawnResult.timeSeconds > timeoutSeconds) {\n      decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n    } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n      decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n    } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n      decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n    } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n      decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n    }\n\n    printTestCaseResult({\n      testCaseId: 'debug',\n      decisionCode,\n      exitStatus: spawnResult.status ?? undefined,\n      stdin: params.stdin,\n      stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n      stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n      timeSeconds: spawnResult.timeSeconds,\n      memoryBytes: spawnResult.memoryBytes,\n      outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n    });\n  }\n}\n"],"mappings":"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"}