feat: enhance coding harness, model security and system features

This commit is contained in:
ageerle
2026-09-08 23:33:29 +08:00
parent d4ed2b8672
commit bcff4fd9e3
259 changed files with 15183 additions and 2713 deletions

View File

@@ -4,9 +4,6 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
/**
* 启动程序
*
@@ -16,66 +13,10 @@ import java.net.ServerSocket;
public class RuoYiAIApplication {
public static void main(String[] args) {
killPortProcess(6039);
SpringApplication application = new SpringApplication(RuoYiAIApplication.class);
application.setApplicationStartup(new BufferingApplicationStartup(2048));
application.run(args);
System.out.println("(♥◠‿◠)ノ゙ RuoYi-AI启动成功 ლ(´ڡ`ლ)");
}
/**
* 检查并终止占用指定端口的进程
*
* @param port 端口号
*/
private static void killPortProcess(int port) {
try {
if (!isPortInUse(port)) {
return;
}
System.out.println("端口 " + port + " 已被占用,正在查找并终止进程...");
ProcessBuilder pb = new ProcessBuilder("netstat", "-ano");
Process process = pb.start();
java.io.BufferedReader reader = new java.io.BufferedReader(
new java.io.InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
if (line.contains(":" + port + " ") && line.contains("LISTENING")) {
String[] parts = line.trim().split("\\s+");
String pid = parts[parts.length - 1];
System.out.println("找到占用端口 " + port + " 的进程 PID: " + pid + ",正在终止...");
ProcessBuilder killPb = new ProcessBuilder("taskkill", "/F", "/PID", pid);
Process killProcess = killPb.start();
int exitCode = killProcess.waitFor();
if (exitCode == 0) {
System.out.println("进程 " + pid + " 已成功终止");
} else {
System.out.println("终止进程 " + pid + " 失败,exitCode: " + exitCode);
}
break;
}
}
// 等待一小段时间确保端口释放
Thread.sleep(500);
} catch (Exception e) {
System.out.println("检查/终止端口进程时发生异常: " + e.getMessage());
}
}
/**
* 检查端口是否被占用
*/
private static boolean isPortInUse(int port) {
try (ServerSocket socket = new ServerSocket()) {
socket.bind(new InetSocketAddress(port));
return false;
} catch (Exception e) {
return true;
}
}
}

View File

@@ -17,6 +17,26 @@ mcp:
enabled: false
url: http://localhost:8085/sse
--- # Local Harness workspace boundary. Override the environment variable to narrow it further.
coding:
harness:
workspace:
shared-root: ${CODING_HARNESS_WORKSPACE_SHARED_ROOT:D:/Project}
journal:
# Keep local projection disabled unless an operator explicitly chooses a destination.
enabled: ${CODING_HARNESS_JOURNAL_ENABLED:false}
output-directory: ${CODING_HARNESS_JOURNAL_OUTPUT_DIRECTORY:./data/coding-harness-journal}
# 本地实战也必须显式提供 Docker CLI 绝对路径与不可变镜像;默认保持关闭。
tools:
execute-process:
enabled: ${CODING_HARNESS_EXECUTE_PROCESS_ENABLED:false}
sandbox:
docker-executable: ${CODING_HARNESS_DOCKER_EXECUTABLE:}
docker-executable-sha256: ${CODING_HARNESS_DOCKER_EXECUTABLE_SHA256:}
docker-config-directory: ${CODING_HARNESS_DOCKER_CONFIG_DIRECTORY:}
docker-host: ${CODING_HARNESS_DOCKER_HOST:}
image: ${CODING_HARNESS_SANDBOX_IMAGE:}
--- # 上传文件地址
sys:
upload:
@@ -46,7 +66,7 @@ spring:
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
dynamic:
# 性能分析插件(有性能损耗 不建议生产环境使用)
p6spy: true
p6spy: false
# 设置默认的数据源或者数据源组,默认值即为 master
primary: master
# 严格模式 匹配不到数据源则报错

View File

@@ -47,7 +47,7 @@ spring:
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
dynamic:
# 性能分析插件(有性能损耗 不建议生产环境使用)
p6spy: true
p6spy: false
# 设置默认的数据源或者数据源组,默认值即为 master
primary: master
# 严格模式 匹配不到数据源则报错

View File

@@ -20,16 +20,34 @@ server:
# 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
worker: 256
# Harness 命令仍受工作区租约、执行计划和工具审批约束;开启后才能验证并运行生成的网站。
# execute_process 只能经由固定镜像的 Docker OS sandbox;缺任一配置均 fail closed。
coding:
harness:
journal:
# Operator HTML projection is opt-in; production paths must be chosen by deployment config.
enabled: ${CODING_HARNESS_JOURNAL_ENABLED:false}
output-directory: ${CODING_HARNESS_JOURNAL_OUTPUT_DIRECTORY:./data/coding-harness-journal}
budget:
# 模型回合上限;工具额度按每回合最多 3 次保持同比例,避免工具预算先于回合耗尽。
max-iterations: 200
max-tool-calls: 600
# No task iteration or wall-time cutoff; context compaction supports continued work.
# Optional cumulative spending ceilings (0 = disabled).
max-tool-calls: 0
max-input-tokens: 0
max-output-tokens: 0
tools:
execute-process:
enabled: true
enabled: ${CODING_HARNESS_EXECUTE_PROCESS_ENABLED:false}
sandbox:
# 必须是宿主 Docker CLI 的绝对路径;不会搜索或继承宿主 PATH/HOME。
docker-executable: ${CODING_HARNESS_DOCKER_EXECUTABLE:}
# 对 CLI 文件内容做每次控制调用前复核,不能只信文件名或绝对路径。
docker-executable-sha256: ${CODING_HARNESS_DOCKER_EXECUTABLE_SHA256:}
# 必须是绝对、无链接且始终为空的专用目录,阻断宿主 config.json/proxy/credential helper。
docker-config-directory: ${CODING_HARNESS_DOCKER_CONFIG_DIRECTORY:}
# 只接受平台本地 Docker Engine(Windows named pipe / Unix socket),拒绝远端 context。
docker-host: ${CODING_HARNESS_DOCKER_HOST:}
# 仅接受 evaluator 批准的本地 sha256:<64 hex> image ID,永不 pull/build。
image: ${CODING_HARNESS_SANDBOX_IMAGE:}
--- # 小程序对话 WebSocket 兜底默认模型(前端未传 model 且无智能体绑定时使用)
chat:
@@ -54,6 +72,15 @@ logging:
org.springframework: warn
org.mybatis.spring.mapper: error
org.apache.fury: warn
# MCP traffic/stdout may contain tool arguments, results or credentials.
MCP: "OFF"
dev.langchain4j.mcp: "OFF"
dev.langchain4j.mcp.McpToolProvider: "OFF"
dev.langchain4j.mcp.client.logging.DefaultMcpLogMessageHandler: "OFF"
dev.langchain4j.mcp.client.transport.stdio.StdioMcpTransport: "OFF"
dev.langchain4j.mcp.client.transport.stdio.ProcessStderrHandler: "OFF"
dev.langchain4j.mcp.transport.stdio.JsonRpcIoHandler: "ERROR"
dev.langchain4j.mcp.client.transport.http.StreamableHttpMcpTransport: "OFF"
config: classpath:logback-plus.xml
# 用户配置
@@ -244,6 +271,9 @@ xss:
# 排除链接
excludeUrls:
- /system/notice
# Coding prompts contain source text (for example TypeScript <T>), rendered as escaped Markdown.
- /coding/harness/sessions/*/runs
- /coding/harness/sessions/*/runs/*/inputs
--- # 链路追踪配置
trace:
@@ -290,7 +320,7 @@ websocket:
--- # 演示模式配置
demo:
# 是否开启演示模式(开启后所有写操作将被拦截)
enabled: true
enabled: ${DEMO_ENABLED:false}
# 提示消息
message: "演示模式,不允许操作"
# 排除的路径(这些路径不受演示模式限制)