chore(jcef): 更新缓存数据库日志文件

- 更新 shared_proto_db/metadata/000003.log 文件内容
- 更新 Site Characteristics Database/00003.log 文件内容
- 添加新的数据库条目和元数据记录
- 保持数据库文件格式的一致性
- 删除Vivid2D的内容
- 重写启动加载界面
This commit is contained in:
2026-01-02 17:12:54 +08:00
parent 75bdca05f2
commit 8de2b0f2fe
261 changed files with 4375 additions and 59810 deletions

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptLibraryMappings">
<file url="file://$PROJECT_DIR$" libraries="{codemirror, font-awesome, monaco-editor}" />
<file url="file://$PROJECT_DIR$/src/main" libraries="{highlight.js, katex, marked, mathjax}" />
</component>
</project>

BIN
CrashReport.dmp Normal file

Binary file not shown.

View File

@@ -1,36 +1,26 @@
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
import org.gradle.internal.os.OperatingSystem
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
plugins {
id 'java'
id 'application'
id 'edu.sc.seis.launch4j' version '2.5.4'
id 'org.openjfx.javafxplugin' version '0.1.0'
id 'org.springframework.boot' version '3.2.0'
id 'io.spring.dependency-management' version '1.1.4'
id 'com.github.johnrengelman.shadow' version '8.1.1' apply false // 关闭 shadow
}
configurations {
all*.exclude group: 'org.openjfx', module: 'javafx'
proguardLib
}
javafx {
version = "21"
modules = [ 'javafx.controls', 'javafx.graphics', 'javafx.web' ]
}
// JDK 版本检查
def requiredJavaVersion = 20
def currentJavaVersion = JavaVersion.current().majorVersion.toInteger()
if (currentJavaVersion != requiredJavaVersion) {
throw new GradleException("构建需要 JDK ${requiredJavaVersion},但当前是 JDK ${currentJavaVersion}。请更换 JDK 环境。")
id 'edu.sc.seis.launch4j' version '2.5.4'
}
group = 'com.axis.innovators.box'
version = '0.0.1'
// JDK 版本检查
java {
toolchain {
languageVersion = JavaLanguageVersion.of(20)
}
}
repositories {
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
@@ -38,10 +28,28 @@ repositories {
mavenCentral()
}
dependencies {
// === 构建工具 ===
proguardLib files('libs/proguard.jar')
// 操作系统 Native 标识符
def lwjglNatives = ""
if (OperatingSystem.current().isWindows()) {
lwjglNatives = "natives-windows"
} else if (OperatingSystem.current().isLinux()) {
lwjglNatives = "natives-linux"
} else if (OperatingSystem.current().isMacOsX()) {
lwjglNatives = System.getProperty("os.arch") == "aarch64" ? "natives-macos-arm64" : "natives-macos"
}
javafx {
version = "21"
modules = [ 'javafx.controls', 'javafx.graphics', 'javafx.web', 'javafx.swing' ]
}
// 排除冲突的日志和旧版 FX
configurations {
all*.exclude group: 'org.openjfx', module: 'javafx'
all*.exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
dependencies {
// === 测试框架 ===
testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter'
@@ -51,19 +59,15 @@ dependencies {
// === 开发工具 ===
developmentOnly 'org.springframework.boot:spring-boot-devtools'
// === JnaFileChooser ===
// === JnaFileChooser & Swing ===
implementation 'com.github.steos.jnafilechooser:jnafilechooser-api:1.1.2'
implementation 'com.github.steos.jnafilechooser:jnafilechooser-win32:1.1.2'
// === Swing 组件 ===
implementation 'org.swinglabs:swingx:1.6.1'
// === 本地库文件 ===
implementation files('libs/JNC-1.0-jnc.jar')
implementation files('libs/dog api 1.3.jar')
implementation files('libs/DesktopWallpaperSdk-1.0-SNAPSHOT.jar')
implementation fileTree(dir: 'libs', include: ['*.jar'])
// === DJL API ===
// === AI (DJL) ===
implementation platform('ai.djl:bom:0.35.0')
implementation 'ai.djl:api'
implementation 'ai.djl:model-zoo'
@@ -73,12 +77,13 @@ dependencies {
implementation 'ai.djl.onnxruntime:onnxruntime-engine'
runtimeOnly 'ai.djl.pytorch:pytorch-native-cpu:2.7.1'
runtimeOnly 'ai.djl.onnxruntime:onnxruntime-native-cpu:1.3.0'
// === 核心工具库 ===
implementation 'com.google.code.gson:gson:2.10.1' // 统一版本
implementation 'com.google.code.gson:gson:2.10.1'
implementation 'org.apache.logging.log4j:log4j-api:2.20.0'
implementation 'org.apache.logging.log4j:log4j-core:2.20.0'
implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.20.0'
implementation 'commons-io:commons-io:2.18.0' // 统一版本
implementation 'org.apache.logging.log4j:log4j-slf4j2-impl:2.20.0'
implementation 'commons-io:commons-io:2.18.0'
implementation 'com.google.guava:guava:31.1-jre'
implementation 'net.java.dev.jna:jna:5.13.0'
implementation 'net.java.dev.jna:jna-platform:5.13.0'
@@ -95,8 +100,8 @@ dependencies {
implementation 'net.bytebuddy:byte-buddy:1.17.6'
// === 反编译工具 ===
implementation 'org.bitbucket.mstrobel:procyon-core:0.6.0' // 统一版本
implementation 'org.bitbucket.mstrobel:procyon-compilertools:0.6.0' // 统一版本
implementation 'org.bitbucket.mstrobel:procyon-core:0.6.0'
implementation 'org.bitbucket.mstrobel:procyon-compilertools:0.6.0'
implementation 'org.benf:cfr:0.152'
// === Java 解析与分析 ===
@@ -110,18 +115,14 @@ dependencies {
// === Web 和网络 ===
implementation 'org.jsoup:jsoup:1.17.2'
implementation 'org.json:json:20231013' // 统一版本
implementation 'org.openjfx:javafx-web:17'
implementation 'org.json:json:20231013'
implementation 'org.openjfx:javafx-web:21'
// === UI 框架 ===
implementation 'com.formdev:flatlaf:3.2.1'
implementation 'com.formdev:flatlaf-extras:3.2.1'
implementation 'com.formdev:flatlaf-intellij-themes:3.2.1'
implementation 'io.github.vincenzopalazzo:material-ui-swing:1.1.2'
// JavaFX
implementation 'org.openjfx:javafx-controls:21'
implementation 'org.openjfx:javafx-graphics:21'
implementation 'org.fxmisc.richtext:richtextfx:0.11.0'
implementation 'org.controlsfx:controlsfx:11.1.2'
implementation 'com.dlsc.formsfx:formsfx-core:11.6.0'
@@ -133,32 +134,24 @@ dependencies {
implementation 'com.fifesoft:languagesupport:3.3.0'
implementation 'com.fifesoft:autocomplete:3.3.2'
// === 图形和游戏引擎 ===
// LWJGL
implementation 'org.lwjgl:lwjgl:3.3.6'
implementation 'org.lwjgl:lwjgl-stb:3.3.6'
implementation 'org.lwjgl:lwjgl-glfw:3.3.6'
implementation 'org.lwjgl:lwjgl-opengl:3.3.6'
implementation 'org.lwjgl:lwjgl-jawt:3.3.5'
// === LWJGL 图形引擎 ===
def lwjglVersion = "3.3.6"
implementation "org.lwjgl:lwjgl:$lwjglVersion"
implementation "org.lwjgl:lwjgl-stb:$lwjglVersion"
implementation "org.lwjgl:lwjgl-glfw:$lwjglVersion"
implementation "org.lwjgl:lwjgl-opengl:$lwjglVersion"
implementation "org.lwjgl:lwjgl-jawt:$lwjglVersion"
// Lwjgl natives
if (DefaultNativePlatform.currentOperatingSystem.isWindows()) {
runtimeOnly 'org.lwjgl:lwjgl:3.3.6:natives-windows'
runtimeOnly 'org.lwjgl:lwjgl-glfw:3.3.6:natives-windows'
runtimeOnly 'org.lwjgl:lwjgl-opengl:3.3.6:natives-windows'
runtimeOnly 'org.lwjgl:lwjgl-stb:3.3.6:natives-windows'
} else if (DefaultNativePlatform.currentOperatingSystem.isLinux()) {
runtimeOnly 'org.lwjgl:lwjgl:3.3.6:natives-linux'
runtimeOnly 'org.lwjgl:lwjgl-glfw:3.3.6:natives-linux'
runtimeOnly 'org.lwjgl:lwjgl-opengl:3.3.6:natives-linux'
runtimeOnly 'org.lwjgl:lwjgl-stb:3.3.6:natives-linux'
} else if (DefaultNativePlatform.currentOperatingSystem.isMacOsX()) {
runtimeOnly 'org.lwjgl:lwjgl:3.3.6:natives-macos'
runtimeOnly 'org.lwjgl:lwjgl-glfw:3.3.6:natives-macos'
runtimeOnly 'org.lwjgl:lwjgl-opengl:3.3.6:natives-macos'
runtimeOnly 'org.lwjgl:lwjgl-stb:3.3.6:natives-macos'
implementation("com.github.LWJGLX:lwjgl3-awt:bc8daf521a") {
exclude group: "org.lwjgl"
}
// LWJGL Natives
runtimeOnly "org.lwjgl:lwjgl:$lwjglVersion:$lwjglNatives"
runtimeOnly "org.lwjgl:lwjgl-glfw:$lwjglVersion:$lwjglNatives"
runtimeOnly "org.lwjgl:lwjgl-opengl:$lwjglVersion:$lwjglNatives"
runtimeOnly "org.lwjgl:lwjgl-stb:$lwjglVersion:$lwjglNatives"
// 其他图形库
implementation 'com.badlogicgames.gdx:gdx:1.12.1'
implementation 'org.joml:joml:1.10.7'
@@ -186,6 +179,10 @@ dependencies {
implementation 'org.xerial:sqlite-jdbc:3.41.2.1'
implementation 'org.postgresql:postgresql:42.6.0'
// === 伪终端与测试容器 ===
implementation 'org.jetbrains.pty4j:pty4j:0.12.13'
implementation 'org.testcontainers:testcontainers:1.19.0'
// === 音频处理 ===
implementation 'jflac:jflac:1.3'
implementation 'com.github.axet:TarsosDSP:2.4'
@@ -207,52 +204,39 @@ dependencies {
implementation 'org.casbin:casdoor-java-sdk:1.37.0'
}
configurations.configureEach {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
// 自动生成构建信息文件
tasks.register('generateBuildProperties') {
group = 'build'
doLast {
def resDir = file("src/main/resources/build")
resDir.mkdirs()
def propertiesFile = new File(resDir, 'build.properties')
propertiesFile.text = """# Auto-generated build information
version=${project.version}
buildTimestamp=${LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME)}
buildSystem=${OperatingSystem.current().isWindows() ? "WINDOWS" : "UNIX"}
"""
}
}
// 复制依赖到 libs 目录
task copyDependencies(type: Copy) {
compileJava.dependsOn generateBuildProperties
// 复制依赖包到构建目录
tasks.register('copyDependencies', Copy) {
group = "build"
from configurations.runtimeClasspath
into "$buildDir/libs/libs"
}
// 原始 jar 打包(不含依赖)
tasks.jar {
dependsOn copyDependencies
archiveBaseName.set("${rootProject.name}")
archiveVersion.set("${version}")
manifest {
attributes(
'Main-Class': 'com.axis.innovators.box.Main',
'Class-Path': configurations.runtimeClasspath.files.collect { "libs/${it.name}" }.join(' ')
)
}
// ProGuard 混淆任务
task obfuscateJar(type: JavaExec) {
dependsOn jar
group = "build"
description = "使用 ProGuard 混淆并生成映射表"
mainClass = 'proguard.ProGuard'
classpath = configurations.proguardLib
args = [
'-injars', "$buildDir/libs/${rootProject.name}-${version}.jar",
'-outjars', "$buildDir/libs/${rootProject.name}-${version}-obf.jar",
'-libraryjars', "${System.getProperty('java.home')}/jmods/java.base.jmod",
'-printmapping', "$buildDir/libs/output.srg",
'-keep class com.axis.innovators.box.plugins.**',
'-keep class com.axis.innovators.box.plugins.BoxClassLoader{*;}',
'-keeppackagenames', 'com.axis.innovators.box',
'-keeppackagenames', 'com.axis.innovators.box.plugins',
'-keepnames', 'class com.axis.innovators.box.**',
'-keepnames', 'class com.axis.innovators.box.plugins.**',
'-dontwarn',
'-dontoptimize',
'-dontshrink',
'-keepattributes', 'Signature,InnerClasses,EnclosingMethod,RuntimeVisibleAnnotations,RuntimeInvisibleAnnotations,RuntimeVisibleParameterAnnotations,RuntimeInvisibleParameterAnnotations,Deprecated,SourceFile,LineNumberTable,LocalVariableTable,LocalVariableTypeTable'
]
}
build {
dependsOn obfuscateJar
}
application {
@@ -260,8 +244,7 @@ application {
}
tasks.register('runBoxClient', JavaExec) {
group = "run-toolboxProgram"
description = "执行工具箱程序"
group = "run"
classpath = sourceSets.main.runtimeClasspath
mainClass = "com.axis.innovators.box.Main"
jvmArgs = [
@@ -269,75 +252,3 @@ tasks.register('runBoxClient', JavaExec) {
"-Djava.system.class.loader=com.axis.innovators.box.plugins.BoxClassLoader"
]
}
tasks.register('runVivid2DClient', JavaExec) {
group = "run-vivid2D"
description = "执行工具箱程序"
classpath = sourceSets.main.runtimeClasspath
mainClass = "com.chuangzhou.vivid2D.Main"
jvmArgs = [
"-Dfile.encoding=UTF-8"
]
}
tasks.register('test2DModelLayerPanel', JavaExec) {
group = "test-model"
description = "运行 2D Model Layer Panel 测试"
classpath = sourceSets.main.runtimeClasspath
mainClass = "com.chuangzhou.vivid2D.test.ModelLayerPanelTest"
jvmArgs = [
"-Dfile.encoding=UTF-8"
]
}
tasks.register('testModelRenderLightingTest', JavaExec) {
group = "test-model"
description = "运行 2D Model 高亮灯光测试"
classpath = sourceSets.main.runtimeClasspath
mainClass = "com.chuangzhou.vivid2D.test.ModelRenderLightingTest"
jvmArgs = [
"-Dfile.encoding=UTF-8"
]
}
tasks.register('testModelTest', JavaExec) {
group = "test-model"
description = "运行 2D Model 保存和完整性测试"
classpath = sourceSets.main.runtimeClasspath
mainClass = "com.chuangzhou.vivid2D.test.ModelTest"
jvmArgs = [
"-Dfile.encoding=UTF-8"
]
}
tasks.register('testModelTest2', JavaExec) {
group = "test-model"
description = "运行 2D Model 物理基准测试"
classpath = sourceSets.main.runtimeClasspath
mainClass = "com.chuangzhou.vivid2D.test.ModelTest2"
jvmArgs = [
"-Dfile.encoding=UTF-8"
]
}
task printFxPath {
doLast {
// 1. 获取所有运行时依赖文件
def runtimeClasspath = configurations.runtimeClasspath.files
// 2. 筛选出所有名字包含 "javafx" 的 jar 包
def javafxJars = runtimeClasspath.findAll { file ->
file.name.contains("javafx")
}
// 3. 获取这些 jar 包的绝对路径
def javafxPaths = javafxJars.collect { it.absolutePath }
// 4. 使用系统的路径分隔符 (Windows是';', Linux/macOS是':') 将它们连接起来
def modulePath = javafxPaths.join(System.getProperty("path.separator"))
println "========================================================================"
println "COPY THIS JavaFX Module Path: " + modulePath
println "========================================================================"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,117 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Real Linux Terminal</title>
<!-- 引入 Xterm.js 的样式 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/xterm@5.3.0/css/xterm.css" />
<style>
body, html {
margin: 0;
padding: 0;
background-color: #000;
overflow: hidden;
height: 100%; /* 确保 html 和 body 占满全屏 */
}
#terminal-container {
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div id="terminal-container"></div>
<!-- 引入 Xterm.js 核心库 -->
<script src="https://cdn.jsdelivr.net/npm/xterm@5.3.0/lib/xterm.js"></script>
<!-- 引入自适应插件,让终端随窗口缩放 -->
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.8.0/lib/xterm-addon-fit.js"></script>
<script>
// 1. 初始化终端
const term = new Terminal({
cursorBlink: true,
fontSize: 14,
fontFamily: 'Consolas, "Ubuntu Mono", monospace',
theme: {
background: '#1e1e1e',
foreground: '#ffffff'
},
// 增加右键菜单功能:粘贴
allowProposedApi: true
});
const fitAddon = new FitAddon.FitAddon();
term.loadAddon(fitAddon);
term.open(document.getElementById('terminal-container'));
// --- 修复点 1: 自动获取焦点 ---
// 确保用户打开窗口后可以直接输入
term.focus();
// --- 修复点 2: 延迟并可靠地适应窗口大小 ---
// 使用 setTimeout 将 fit() 推迟到下一个事件循环
// 这可以确保在DOM元素完全渲染并获得其最终尺寸后才进行计算
function fitTerminal() {
try {
fitAddon.fit();
// 你还可以在这里将新的尺寸发送给后端 PTY
// term.cols 和 term.rows 包含了新的行列数
} catch (e) {
console.error("Fit addon failed:", e);
}
}
setTimeout(fitTerminal, 1); // 1ms 延迟足以确保渲染完成
// 窗口大小改变时自动调整
window.addEventListener('resize', fitTerminal);
// 2. 监听用户输入 (键盘按键)
term.onData(data => {
if (window.cefQuery) {
window.cefQuery({
request: JSON.stringify({
type: 'terminalInput',
data: data
}),
onSuccess: function() {},
onFailure: function(errorCode, errorMessage) {
console.error("CEF query failed:", errorCode, errorMessage);
}
});
} else {
console.warn("cefQuery is not available. Input ignored.");
}
});
// --- 修复点 3: 使用 TextDecoder 优化解码逻辑 ---
// 这是更现代、更可靠的将字节流解码为UTF-8字符串的方法
const decoder = new TextDecoder('utf-8');
/**
* 供 Java 调用的接口:写入数据到终端
* @param {string} base64Data - Base64 编码的原始字节流字符串
*/
function writeToTerminal(base64Data) {
try {
// 将 Base64 字符串转换为 Uint8Array 字节数组
const binaryString = window.atob(base64Data);
const len = binaryString.length;
const bytes = new Uint8Array(len);
for (let i = 0; i < len; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
// 使用 TextDecoder 解码为字符串并写入终端
term.write(decoder.decode(bytes));
} catch (e) {
console.error("Failed to decode or write Base64 data:", e);
// 可以在终端显示错误信息
term.write("\r\n[Front-end Error: Failed to process data from back-end]\r\n");
}
}
// 初始化通知
term.write('\x1B[1;3;32mConnected to Local Shell via PTY4J...\x1B[0m\r\n');
</script>
</body>
</html>

481
javascript/SQLTerminal.html Normal file
View File

@@ -0,0 +1,481 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>SQL Command Line</title>
<style>
:root {
--bg-color: #0c0c0c;
--text-color: #cccccc;
--caret-color: #ffffff;
--selection-bg: #264f78;
--menu-bg: #2b2d30;
--highlight-active: #0d293e;
}
body {
background-color: var(--bg-color);
color: var(--text-color);
font-family: 'Consolas', 'Courier New', monospace;
font-size: 16px;
margin: 0;
padding: 10px;
height: 100vh;
box-sizing: border-box;
overflow-y: auto;
word-break: break-all;
}
::selection { background: var(--selection-bg); color: white; }
#terminal { width: 100%; min-height: 100%; display: flex; flex-direction: column; padding-bottom: 50px; }
#output-area { white-space: pre-wrap; cursor: text; }
.input-line { display: flex; margin-top: 5px; position: relative; }
.prompt { color: #cccccc; margin-right: 8px; font-weight: bold; user-select: none; white-space: pre; }
.continuation-prompt { color: #cccccc; margin-right: 8px; user-select: none; white-space: pre; }
input[type="text"] {
background: transparent; border: none; color: #ffffff;
font-family: inherit; font-size: inherit; flex: 1;
outline: none; padding: 0; margin: 0; caret-color: var(--caret-color);
}
.welcome-msg { margin-bottom: 20px; color: #888; }
.error-text { color: #ff5555; }
/* --- 自动补全样式 --- */
#suggestion-box {
position: absolute; display: none; background-color: #2b2d30;
border: 1px solid #5f6165; box-shadow: 0 5px 15px rgba(0,0,0,0.6);
z-index: 999; max-height: 200px; overflow-y: auto; min-width: 250px;
border-radius: 3px;
}
.suggestion-item {
padding: 5px 10px; cursor: pointer; font-size: 14px;
color: #a9b7c6; display: flex; align-items: center;
}
.suggestion-item.active { background-color: var(--highlight-active); color: #ffffff; }
.icon {
display: inline-block; width: 16px; height: 16px; margin-right: 8px;
font-size: 10px; text-align: center; line-height: 16px; border-radius: 2px;
font-weight: bold; color: #000;
}
.icon-k { background-color: #ffc66d; } /* Keyword */
.icon-t { background-color: #4a88c7; color: #fff; } /* Table */
.icon-c { background-color: #9876aa; color: #fff; } /* Column */
.detail-text { margin-left: auto; color: #666; font-size: 12px; }
</style>
</head>
<body>
<div id="terminal">
<div class="welcome-msg">
Axis SQL Client [Version 2.0.0]<br>
(c) 2024 Axis Innovators.<br>
Loaded local database mode.<br>
<br>
Commands end with ; <br>
Type 'help' for help. 'cls' to clear.<br>
</div>
<div id="output-area"></div>
<div class="input-line">
<span id="prompt-span" class="prompt">SQL&gt;</span>
<input type="text" id="cmd-input" autocomplete="off" spellcheck="false" autofocus>
<div id="suggestion-box"></div>
</div>
</div>
<script>
// --- 核心状态 ---
const outputArea = document.getElementById('output-area');
const input = document.getElementById('cmd-input');
const promptSpan = document.getElementById('prompt-span');
const suggestionBox = document.getElementById('suggestion-box');
let history = [];
let historyIndex = -1;
// 多行命令缓冲区
let commandBuffer = "";
let isMultiLineMode = false;
// 数据库元数据 (由 Java 填充)
let dbSchema = {
tables: [], // ["student", "logs"]
columns: {}, // {"student": ["id", "name"], "logs": ["id", "msg"]}
allColumns: [] // flat list of all columns for quick search
};
// 静态关键字库
const keywords = [
"SELECT", "FROM", "WHERE", "INSERT", "INTO", "VALUES", "UPDATE", "SET",
"DELETE", "CREATE", "TABLE", "DROP", "ALTER", "ORDER", "BY", "GROUP",
"LIMIT", "JOIN", "LEFT", "RIGHT", "INNER", "OUTER", "ON", "AND", "OR",
"NOT", "NULL", "AS", "DISTINCT", "COUNT", "MAX", "MIN", "AVG", "SUM"
];
// --- 1. 初始化: 加载表结构 ---
window.onload = function() {
if (window.cefQuery) {
window.cefQuery({
request: JSON.stringify({ type: "initSchema" }),
onSuccess: function(response) {
const res = JSON.parse(response);
if (res.status === "success") {
dbSchema.tables = res.tables || [];
dbSchema.columns = res.columns || {};
// 扁平化所有列名,方便通用提示
let colSet = new Set();
for (let t in dbSchema.columns) {
dbSchema.columns[t].forEach(c => colSet.add(c));
}
dbSchema.allColumns = Array.from(colSet);
console.log("Schema loaded:", dbSchema);
}
},
onFailure: function() {}
});
} else {
// 测试模式数据
dbSchema.tables = ["student", "course"];
dbSchema.columns = { "student": ["id", "name", "age"], "course": ["id", "title"] };
dbSchema.allColumns = ["id", "name", "age", "title"];
}
};
// --- 2. 输入与键盘事件 ---
input.addEventListener('keydown', function(e) {
// 如果补全框打开,接管按键
if (suggestionBox.style.display === 'block') {
if (handleSuggestionKeys(e)) return;
}
if (e.key === 'Enter') {
handleEnterKey();
}
else if (e.key === 'ArrowUp') {
handleHistory(true, e);
}
else if (e.key === 'ArrowDown') {
handleHistory(false, e);
}
});
// --- 3. 多行命令处理逻辑 (核心升级) ---
function handleEnterKey() {
const rawLine = input.value;
// 1. 如果输入为空,只是换行
if (!rawLine.trim() && !commandBuffer.trim()) {
input.value = '';
return;
}
// 2. 显示当前行
const promptText = isMultiLineMode ? " -> " : "SQL> ";
appendLine(promptText + rawLine);
// 3. 处理历史记录 (每次回车都存,方便找回片段)
if (rawLine.trim()) {
history.push(rawLine);
historyIndex = history.length;
}
// 4. 判断特殊前端命令
const upperLine = rawLine.trim().toUpperCase();
if (upperLine === 'CLS' || upperLine === 'CLEAR') {
outputArea.innerHTML = '';
resetInput();
return;
}
if (upperLine === 'EXIT') {
// 这里可以调用关闭窗口
appendLine("Bye.");
return;
}
// 5. 拼接到缓冲区
commandBuffer += rawLine + " "; // 加空格防止粘连
// 6. 检查是否以分号结尾 (真正的执行触发器)
if (rawLine.trim().endsWith(';')) {
// 移除分号并执行
const finalCmd = commandBuffer.trim().replace(/;$/, '');
processCommand(finalCmd);
resetInput(); // 重置为单行模式
} else {
// 进入多行模式
isMultiLineMode = true;
promptSpan.textContent = " -> ";
input.value = '';
// 滚动到底部
window.scrollTo(0, document.body.scrollHeight);
}
}
function resetInput() {
commandBuffer = "";
isMultiLineMode = false;
promptSpan.textContent = "SQL> ";
input.value = '';
window.scrollTo(0, document.body.scrollHeight);
}
function handleHistory(isUp, e) {
e.preventDefault();
if (isUp && historyIndex > 0) {
historyIndex--;
input.value = history[historyIndex];
} else if (!isUp && historyIndex < history.length - 1) {
historyIndex++;
input.value = history[historyIndex];
} else if (!isUp) {
historyIndex = history.length;
input.value = '';
}
}
// --- 4. 智能感知自动补全 (Context Aware) ---
let currentSuggestions = [];
let activeIndex = -1;
input.addEventListener('input', function() {
const val = this.value;
const cursorPos = this.selectionStart;
// 获取正在输入的单词
const wordInfo = getCurrentWord(val, cursorPos);
if (!wordInfo) {
hideSuggestions();
return;
}
// 分析上下文 (Context Analysis)
const contextType = analyzeContext(val, wordInfo.startPos);
// 获取建议列表
const list = getFilteredSuggestions(wordInfo.word, contextType);
if (list.length > 0) {
showSuggestions(list, wordInfo.startPos);
} else {
hideSuggestions();
}
});
/**
* 简单的上下文分析器
* 返回: 'TABLE' | 'COLUMN' | 'KEYWORD' (默认)
*/
function analyzeContext(text, cursorIndex) {
// 取光标前的文本,转大写,分割成 Token
const prefix = text.substring(0, cursorIndex).toUpperCase();
const tokens = prefix.split(/\s+/).filter(t => t.length > 0);
if (tokens.length === 0) return 'KEYWORD';
const lastToken = tokens[tokens.length - 1];
// 如果上一个词是这些,通常后面接表名
const tableTriggers = ["FROM", "JOIN", "UPDATE", "INTO", "TABLE"];
if (tableTriggers.includes(lastToken)) return 'TABLE';
// 如果上一个词是这些,通常后面接列名
const columnTriggers = ["SELECT", "WHERE", "ORDER", "BY", "GROUP", "HAVING", "SET", "ON", "AND", "OR"];
if (columnTriggers.includes(lastToken) || lastToken.endsWith(',')) return 'COLUMN';
return 'KEYWORD';
}
function getFilteredSuggestions(query, type) {
const q = query.toUpperCase();
let results = [];
// 1. 优先根据上下文添加
if (type === 'TABLE') {
dbSchema.tables.forEach(t => {
if (t.toUpperCase().startsWith(q)) results.push({ text: t, type: 't', detail: 'Table' });
});
} else if (type === 'COLUMN') {
dbSchema.allColumns.forEach(c => {
if (c.toUpperCase().startsWith(q)) results.push({ text: c, type: 'c', detail: 'Column' });
});
// 列名场景下也可能输入表名(例如 table.col
dbSchema.tables.forEach(t => {
if (t.toUpperCase().startsWith(q)) results.push({ text: t, type: 't', detail: 'Table' });
});
}
// 2. 总是添加匹配的关键字 (但在特定上下文排在后面)
keywords.forEach(k => {
if (k.startsWith(q)) results.push({ text: k, type: 'k', detail: 'Keyword' });
});
return results.slice(0, 15); // 限制显示数量
}
// --- 补全 UI 渲染逻辑 --- (复用之前的基础,增加了类型判断)
function showSuggestions(list, wordStartPos) {
currentSuggestions = list;
activeIndex = 0;
// 计算 UI 位置
const promptWidth = getTextWidth(promptSpan.textContent, "bold 16px Consolas");
const inputBefore = input.value.substring(0, wordStartPos);
const inputWidth = getTextWidth(inputBefore, "16px Consolas");
suggestionBox.style.left = (promptWidth + inputWidth) + "px";
suggestionBox.style.top = "26px";
suggestionBox.style.display = "block";
renderList();
}
function renderList() {
suggestionBox.innerHTML = '';
currentSuggestions.forEach((item, idx) => {
const div = document.createElement('div');
div.className = 'suggestion-item' + (idx === activeIndex ? ' active' : '');
let iconChar = 'K';
if (item.type === 't') iconChar = 'T';
if (item.type === 'c') iconChar = 'C';
div.innerHTML = `
<span class="icon icon-${item.type}">${iconChar}</span>
<span class="text">${item.text}</span>
<span class="detail-text">${item.detail}</span>
`;
div.onmousedown = (e) => { e.preventDefault(); applySuggestion(idx); }; // prevent blur
suggestionBox.appendChild(div);
});
// 自动滚动
const activeEl = suggestionBox.children[activeIndex];
if (activeEl) {
const boxTop = suggestionBox.scrollTop;
const boxBottom = boxTop + suggestionBox.clientHeight;
const elTop = activeEl.offsetTop;
const elBottom = elTop + activeEl.clientHeight;
if (elTop < boxTop) suggestionBox.scrollTop = elTop;
if (elBottom > boxBottom) suggestionBox.scrollTop = elBottom - suggestionBox.clientHeight;
}
}
function handleSuggestionKeys(e) {
if (e.key === 'ArrowDown') {
e.preventDefault();
activeIndex = (activeIndex + 1) % currentSuggestions.length;
renderList();
return true;
}
if (e.key === 'ArrowUp') {
e.preventDefault();
activeIndex = (activeIndex - 1 + currentSuggestions.length) % currentSuggestions.length;
renderList();
return true;
}
if (e.key === 'Tab' || e.key === 'Enter') {
e.preventDefault();
applySuggestion(activeIndex);
return true;
}
if (e.key === 'Escape') {
hideSuggestions();
return true;
}
return false;
}
function applySuggestion(index) {
const item = currentSuggestions[index];
const val = input.value;
const wordInfo = getCurrentWord(val, input.selectionStart);
if (wordInfo) {
const prefix = val.substring(0, wordInfo.startPos);
const suffix = val.substring(input.selectionStart);
const newText = prefix + item.text + " " + suffix; // 自动加个空格
input.value = newText;
const newPos = prefix.length + item.text.length + 1;
input.setSelectionRange(newPos, newPos);
}
hideSuggestions();
}
function hideSuggestions() {
suggestionBox.style.display = 'none';
activeIndex = -1;
}
// --- 工具函数 ---
function getCurrentWord(text, cursorIndex) {
const left = text.substring(0, cursorIndex);
const match = left.match(/([a-zA-Z0-9_]+)$/);
if (match) {
return { word: match[1], startPos: match.index };
}
return null;
}
function getTextWidth(text, font) {
const canvas = getTextWidth.canvas || (getTextWidth.canvas = document.createElement("canvas"));
const ctx = canvas.getContext("2d");
ctx.font = font;
return ctx.measureText(text).width;
}
// --- 后端通信与显示 (复用) ---
function processCommand(cmd) {
if (window.cefQuery) {
window.cefQuery({
request: JSON.stringify({ type: "executeCommand", command: cmd }),
onSuccess: (res) => renderResponse(JSON.parse(res)),
onFailure: (c, msg) => appendLine("Error: " + msg, true)
});
}
}
function renderResponse(res) {
if (res.status === 'error') {
appendLine(res.output, true);
} else if (res.type === 'table') {
appendLine(generateAsciiTable(res.headers, res.rows));
if (res.info) appendLine(res.info);
} else {
appendLine(res.output);
}
appendLine(""); // 空行分割
}
function appendLine(text, isError = false) {
const div = document.createElement('div');
div.textContent = text;
if (isError) div.className = 'error-text';
outputArea.appendChild(div);
}
function generateAsciiTable(headers, rows) {
if (!headers || !headers.length) return "";
const colWidths = headers.map(h => h.length);
rows.forEach(row => row.forEach((c, i) => colWidths[i] = Math.max(colWidths[i], String(c).length)));
const border = "+" + colWidths.map(w => "-".repeat(w + 2)).join("+") + "+";
const makeRow = (arr) => "|" + arr.map((c, i) => " " + String(c).padEnd(colWidths[i]) + " ").join("|") + "|";
return [border, makeRow(headers), border, ...rows.map(makeRow), border].join("\n");
}
// 点击聚焦 (不影响选中文本)
document.addEventListener('click', (e) => {
if (!window.getSelection().toString() && !suggestionBox.contains(e.target)) input.focus();
});
</script>
</body>
</html>

View File

@@ -1,3 +1,3 @@
#Current Loaded Language
#Sun Oct 05 18:45:33 CST 2025
#Fri Jan 02 17:08:53 CST 2026
loadedLanguage=system\:zh_CN

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@
[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJQcmVsb2FkIERhdGEiLCJyb290X2hhc2giOiIySkY0bjlJektLVmJCMExMQ2VRMXd0N09LN1Nlem1oaV9MenBEVjhnWEdnIn0seyJwYXRoIjoibWFuaWZlc3QuanNvbiIsInJvb3RfaGFzaCI6IjZ5RUlpWmVBWnNlM0g3bWNEYjg5N2hfcXFfWTUtOEo2WW1MNXpLdVJZLWcifV0sImZvcm1hdCI6InRyZWVoYXNoIiwiaGFzaF9ibG9ja19zaXplIjo0MDk2fV0sIml0ZW1faWQiOiJnZ2trZWhnYm5manBlZ2dmcGxlZWFrcGlkYmtpYmJtbiIsIml0ZW1fdmVyc2lvbiI6IjIwMjUuMTAuNi42MSIsInByb3RvY29sX3ZlcnNpb24iOjF9","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"MXBnWArmfHUkDQ_zR8fPtKClY4Z6Meb5w8vBR2s1tT8kDF9VXr45al_o5klckYyEBHEEHtyG5TTUQKi6zMHNvjKF8dhVsgqNDoVQUKeLMqsWcBW3gEw3gQiFLlwloO1_UCPWNmp7nZe1WjMSL1Wia60550kjAafsYveG1rqAJOmD6pl-WvW5JKWeqiUjN0jNG2gPkIzxv143Sk4pfchvZUBKxVW9YR61lW9CiKmlguEbiOnhY2BHj3PYUdQUMefbJCVJKI4TpOe67AjKpynoBTaKZLuW21PAUHMiWPaBR_tOTjDB9pbq3AesUh_U5OnRA8lF_9nwX9cfNg-zRoHR2NMtmhVlUXrIsDWwh-FNA32LnwOzbNH_4FmuWPWXzu6IjNSLGxpda5GUg65rhMWgCW2-YJVjIbO0p-Y27eU7JDVeIOmodZ358uTDCFz-0ChMUoffA1ej8flGyX_HXqUdYZRzuaJosqwUP9mPXErIgUJbgHNlgO1dRvNyGGTsCe0Xn7UPVfCeuPYoX3yZekKeqlOGcTcXu5mqsg8icr6YP-H_vZR0tBjPmcnmM-Dp08Ix0AY1Pm7wK-7F8sExn7sWTNf3XMQzF1QHIfYLHjnHTmg78fF2kjQxhHd8zqZ121J2o2dhslZdIsH3F44EuEIFQfYHFbKhr93ODq93p2L0cEM"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"i9XSMHRDp-syAOvlFsrJ4swarl0gHdQH5xdhimD2bsj0dxnyNXUZszt97BJfZKmHqPvzJENKAnakE0Q6b_AB2W50xjGfuRZbMJAMdjp8nB_rftgth_KwkO9mbhaBXC_jzP4QYUUFOrwqTTTmNU33wTF9XcjAZ8W8nd7D_-tocxjrT56FpvbKx34Prha1u8VtwGt1raCCI73B_mIXHy9O1PQN6l8umNo12KcTcGt1R2htB-BxWpHLVLHkir4o4ABzjpXfbK3ecEQNTFNZYJs3dvDvmqkEBWCOL17GWn37_GFV78abmUdM3lAcQp1lzavg5VZSBcIcmsoCO4-XUL63Jw"}]}}]

View File

@@ -1 +0,0 @@
1.0bd17169e41bf80771e71e625ed9469c4006d08a33caa457e184caa55174f67b

View File

@@ -1,6 +0,0 @@
{
"manifest_version": 2,
"name": "Crowd Deny",
"preload_data_format": 1,
"version": "2025.10.6.61"
}

View File

@@ -1,6 +1,20 @@
{
"epochs": [ {
"calculation_time": "13407745316672915",
"calculation_time": "13409970184368503",
"config_version": 0,
"model_version": "0",
"padded_top_topics_start_index": 0,
"taxonomy_version": 0,
"top_topics_and_observing_domains": [ ]
}, {
"calculation_time": "13410596642026995",
"config_version": 0,
"model_version": "0",
"padded_top_topics_start_index": 0,
"taxonomy_version": 0,
"top_topics_and_observing_domains": [ ]
}, {
"calculation_time": "13411376394291911",
"config_version": 0,
"model_version": "0",
"padded_top_topics_start_index": 0,
@@ -8,5 +22,5 @@
"top_topics_and_observing_domains": [ ]
} ],
"hex_encoded_hmac_key": "4E642EB949A7AB49761C11DC02ABA0FB1E46EECC80D17CFFE210EF757D5AF3DF",
"next_scheduled_calculation_time": "13408350116672979"
"next_scheduled_calculation_time": "13411981194292267"
}

Binary file not shown.

Binary file not shown.

View File

@@ -1,3 +1,3 @@
2025/11/16-15:36:13.162 1b78 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Extension State/MANIFEST-000001
2025/11/16-15:36:13.163 1b78 Recovering log #3
2025/11/16-15:36:13.163 1b78 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Extension State/000003.log
2025/12/28-14:50:54.309 d58 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Extension State/MANIFEST-000001
2025/12/28-14:50:54.309 d58 Recovering log #3
2025/12/28-14:50:54.312 d58 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Extension State/000003.log

View File

@@ -1,3 +1,3 @@
2025/11/16-14:14:54.664 ec0 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Extension State/MANIFEST-000001
2025/11/16-14:14:54.667 ec0 Recovering log #3
2025/11/16-14:14:54.668 ec0 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Extension State/000003.log
2025/12/28-14:19:49.868 bcc Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Extension State/MANIFEST-000001
2025/12/28-14:19:49.869 bcc Recovering log #3
2025/12/28-14:19:49.881 bcc Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Extension State/000003.log

Binary file not shown.

Binary file not shown.

View File

@@ -1,3 +1,3 @@
2025/11/16-14:12:44.573 94 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\GCM Store\Encryption/MANIFEST-000001
2025/11/16-14:12:44.574 94 Recovering log #3
2025/11/16-14:12:44.574 94 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\GCM Store\Encryption/000003.log
2025/12/28-14:50:57.787 24fc Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\GCM Store\Encryption/MANIFEST-000001
2025/12/28-14:50:57.787 24fc Recovering log #3
2025/12/28-14:50:57.788 24fc Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\GCM Store\Encryption/000003.log

View File

@@ -1,3 +1,3 @@
2025/11/16-14:11:32.786 6108 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\GCM Store\Encryption/MANIFEST-000001
2025/11/16-14:11:32.787 6108 Recovering log #3
2025/11/16-14:11:32.787 6108 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\GCM Store\Encryption/000003.log
2025/12/28-14:19:54.454 4760 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\GCM Store\Encryption/MANIFEST-000001
2025/12/28-14:19:54.457 4760 Recovering log #3
2025/12/28-14:19:54.458 4760 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\GCM Store\Encryption/000003.log

Binary file not shown.

Binary file not shown.

View File

@@ -1,3 +1,3 @@
2025/11/16-15:36:13.418 14a4 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Local Storage\leveldb/MANIFEST-000001
2025/11/16-15:36:13.433 14a4 Recovering log #44
2025/11/16-15:36:13.440 14a4 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Local Storage\leveldb/000044.log
2025/12/28-14:50:54.386 2b54 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Local Storage\leveldb/MANIFEST-000001
2025/12/28-14:50:54.399 2b54 Recovering log #44
2025/12/28-14:50:54.404 2b54 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Local Storage\leveldb/000044.log

View File

@@ -1,3 +1,3 @@
2025/11/16-14:14:54.674 3450 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Local Storage\leveldb/MANIFEST-000001
2025/11/16-14:14:54.685 3450 Recovering log #44
2025/11/16-14:14:54.689 3450 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Local Storage\leveldb/000044.log
2025/12/28-14:19:49.965 2d90 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Local Storage\leveldb/MANIFEST-000001
2025/12/28-14:19:49.981 2d90 Recovering log #44
2025/12/28-14:19:49.986 2d90 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Local Storage\leveldb/000044.log

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
{"sts":[{"expiry":1786970571.324373,"host":"CKgWF8Pt6+y0hclDrtEluIjL2FYgseRxvC7MGqrhWRI=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755434571.324375},{"expiry":1786970748.345876,"host":"Fkw+OD9Mt6EPvdYMfEpOeOh5YtJfdmo+tIpYmrw/aHw=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755434748.345878},{"expiry":1786952672.907422,"host":"F8CDsiT0h6lTN4Nqwoyb2wNyqqjWSTsRj/gzlYU3NfY=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755416672.907424},{"expiry":1787020707.436438,"host":"Ifty0kmGtBkqpzyRNEJ2iccvLpOffAEtEf72UjNCr0U=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755484707.43644},{"expiry":1787020704.592068,"host":"M4bfUnCmQAi4PNb3B8aI/2+SVJhHKsMfMMT7fzi6ij4=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755484704.592071},{"expiry":1771158958.946775,"host":"ODQpkumdnBklhBhFYjplmPIGUqnaPXWWo+CnFJ0/t6Q=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755434158.946777},{"expiry":1786952673.49577,"host":"PKqosHGXLFTwexcsjC+UXTkKV3GWWHwtzKz/ULb9ssM=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755416673.495773},{"expiry":1787020905.689562,"host":"RzJ4U8oc5hFtdWWgqHrmedzdy4/1lFbezoh2vuM2sag=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755484905.689566},{"expiry":1786970158.787767,"host":"TYKBX4bj7STJmdsAJf/AXVV5wkijZuQeyADuWpRjtV8=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755434158.787769},{"expiry":1770986558.135948,"host":"ZYjgsmqK1UttB4LVvFgUJHAviltZMIazfUdho0vgoHQ=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755434558.13595},{"expiry":1786970158.716881,"host":"cZAeyWA3fHA2TUtpNDfMvYMZuYmsyq5vod7XbsSSYrQ=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755434158.716883},{"expiry":1794814574.257027,"host":"e3SziuwfuO2UvuBno+qkR1ObHAzZmSUoJhrc7dbP1Uo=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1763278574.257038},{"expiry":1786952041.049301,"host":"glefLLBZdcPMe88hNYSyH7izPjRoDmxZt9QhbJ5f3Yw=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755416041.049304},{"expiry":1791358496.65612,"host":"nAuqgR4iEWti7SOdT3UHPl6rmZU/DeaIm38P2O2OkgA=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1759822496.656122},{"expiry":1771158958.82246,"host":"n/JnTog5u4dqIfqFFLydo6nGO69ZdnM1JYifZdoi7ss=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755434158.822462},{"expiry":1789382403.778989,"host":"qaDeFdT1UTirY0OQe+c5LKw+zjx6vF/+3vFh7CgrAOY=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1757846403.778991},{"expiry":1786952671.323698,"host":"ybtrRgz/Tr6DpPFcMRWkxm21VXSNujk8GGrWr9ew7/g=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755416671.3237},{"expiry":1786970158.131997,"host":"5saCdK9MYjX/Itn8+aAtA/tRPNpaGBN3I3fjBzZOecQ=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755434158.132},{"expiry":1789952777.339869,"host":"8/RrMmQlCD2Gsp14wUCE1P8r7B2C5+yE0+g79IPyRsc=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1758416777.339871}],"version":2}
{"sts":[{"expiry":1786970571.324373,"host":"CKgWF8Pt6+y0hclDrtEluIjL2FYgseRxvC7MGqrhWRI=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755434571.324375},{"expiry":1781472734.002118,"host":"E10e7Gwg5+phsYD4E8qNYFsQySXnIHPAfo4zloUPESc=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1765692734.002119},{"expiry":1786970748.345876,"host":"Fkw+OD9Mt6EPvdYMfEpOeOh5YtJfdmo+tIpYmrw/aHw=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755434748.345878},{"expiry":1786952672.907422,"host":"F8CDsiT0h6lTN4Nqwoyb2wNyqqjWSTsRj/gzlYU3NfY=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755416672.907424},{"expiry":1787020707.436438,"host":"Ifty0kmGtBkqpzyRNEJ2iccvLpOffAEtEf72UjNCr0U=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755484707.43644},{"expiry":1787020704.592068,"host":"M4bfUnCmQAi4PNb3B8aI/2+SVJhHKsMfMMT7fzi6ij4=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755484704.592071},{"expiry":1771158958.946775,"host":"ODQpkumdnBklhBhFYjplmPIGUqnaPXWWo+CnFJ0/t6Q=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755434158.946777},{"expiry":1786952673.49577,"host":"PKqosHGXLFTwexcsjC+UXTkKV3GWWHwtzKz/ULb9ssM=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755416673.495773},{"expiry":1787020905.689562,"host":"RzJ4U8oc5hFtdWWgqHrmedzdy4/1lFbezoh2vuM2sag=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755484905.689566},{"expiry":1786970158.787767,"host":"TYKBX4bj7STJmdsAJf/AXVV5wkijZuQeyADuWpRjtV8=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755434158.787769},{"expiry":1770986558.135948,"host":"ZYjgsmqK1UttB4LVvFgUJHAviltZMIazfUdho0vgoHQ=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755434558.13595},{"expiry":1786970158.716881,"host":"cZAeyWA3fHA2TUtpNDfMvYMZuYmsyq5vod7XbsSSYrQ=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755434158.716883},{"expiry":1795327998.306247,"host":"e3SziuwfuO2UvuBno+qkR1ObHAzZmSUoJhrc7dbP1Uo=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1763791998.306249},{"expiry":1786952041.049301,"host":"glefLLBZdcPMe88hNYSyH7izPjRoDmxZt9QhbJ5f3Yw=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755416041.049304},{"expiry":1798440655.010661,"host":"nAuqgR4iEWti7SOdT3UHPl6rmZU/DeaIm38P2O2OkgA=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1766904655.010663},{"expiry":1771158958.82246,"host":"n/JnTog5u4dqIfqFFLydo6nGO69ZdnM1JYifZdoi7ss=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755434158.822462},{"expiry":1797227932.989249,"host":"qaDeFdT1UTirY0OQe+c5LKw+zjx6vF/+3vFh7CgrAOY=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1765691932.989252},{"expiry":1786952671.323698,"host":"ybtrRgz/Tr6DpPFcMRWkxm21VXSNujk8GGrWr9ew7/g=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755416671.3237},{"expiry":1786970158.131997,"host":"5saCdK9MYjX/Itn8+aAtA/tRPNpaGBN3I3fjBzZOecQ=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755434158.132},{"expiry":1789952777.339869,"host":"8/RrMmQlCD2Gsp14wUCE1P8r7B2C5+yE0+g79IPyRsc=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1758416777.339871}],"version":2}

File diff suppressed because one or more lines are too long

View File

@@ -1,3 +1,3 @@
2025/11/16-15:36:31.538 14a4 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Session Storage/MANIFEST-000001
2025/11/16-15:36:31.539 14a4 Recovering log #12
2025/11/16-15:36:31.542 14a4 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Session Storage/000012.log
2025/12/28-14:51:01.393 2160 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Session Storage/MANIFEST-000001
2025/12/28-14:51:01.395 2160 Recovering log #12
2025/12/28-14:51:01.401 2160 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Session Storage/000012.log

View File

@@ -1,3 +1,3 @@
2025/11/16-14:15:05.342 200 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Session Storage/MANIFEST-000001
2025/11/16-14:15:05.344 200 Recovering log #12
2025/11/16-14:15:05.347 200 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Session Storage/000012.log
2025/12/20-18:28:04.218 294 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Session Storage/MANIFEST-000001
2025/12/20-18:28:04.219 294 Recovering log #12
2025/12/20-18:28:04.222 294 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Session Storage/000012.log

View File

@@ -1,3 +1,3 @@
2025/11/16-15:36:13.152 5138 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Site Characteristics Database/MANIFEST-000001
2025/11/16-15:36:13.154 5138 Recovering log #3
2025/11/16-15:36:13.168 5138 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Site Characteristics Database/000003.log
2025/12/28-14:50:54.257 186c Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Site Characteristics Database/MANIFEST-000001
2025/12/28-14:50:54.263 186c Recovering log #3
2025/12/28-14:50:54.264 186c Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Site Characteristics Database/000003.log

View File

@@ -1,3 +1,3 @@
2025/11/16-14:14:54.588 27c Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Site Characteristics Database/MANIFEST-000001
2025/11/16-14:14:54.588 27c Recovering log #3
2025/11/16-14:14:54.590 27c Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Site Characteristics Database/000003.log
2025/12/28-14:19:49.782 193c Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Site Characteristics Database/MANIFEST-000001
2025/12/28-14:19:49.813 193c Recovering log #3
2025/12/28-14:19:49.814 193c Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Site Characteristics Database/000003.log

View File

@@ -1,3 +1,3 @@
2025/11/16-15:36:13.093 4714 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Sync Data\LevelDB/MANIFEST-000001
2025/11/16-15:36:13.104 4714 Recovering log #3
2025/11/16-15:36:13.105 4714 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Sync Data\LevelDB/000003.log
2025/12/28-14:50:54.253 37d4 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Sync Data\LevelDB/MANIFEST-000001
2025/12/28-14:50:54.263 37d4 Recovering log #3
2025/12/28-14:50:54.264 37d4 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Sync Data\LevelDB/000003.log

View File

@@ -1,3 +1,3 @@
2025/11/16-14:14:54.568 ec0 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Sync Data\LevelDB/MANIFEST-000001
2025/11/16-14:14:54.578 ec0 Recovering log #3
2025/11/16-14:14:54.578 ec0 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Sync Data\LevelDB/000003.log
2025/12/28-14:19:49.766 bcc Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Sync Data\LevelDB/MANIFEST-000001
2025/12/28-14:19:49.813 bcc Recovering log #3
2025/12/28-14:19:49.814 bcc Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Sync Data\LevelDB/000003.log

Binary file not shown.

Binary file not shown.

View File

@@ -1,3 +1,3 @@
2025/11/16-15:36:13.167 9a8 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db/MANIFEST-000001
2025/11/16-15:36:13.168 9a8 Recovering log #13
2025/11/16-15:36:13.169 9a8 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db/000013.log
2025/12/28-14:50:54.299 22b4 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db/MANIFEST-000001
2025/12/28-14:50:54.299 22b4 Recovering log #19
2025/12/28-14:50:54.301 22b4 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db/000019.log

View File

@@ -1,3 +1,3 @@
2025/11/16-14:14:54.657 27c Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db/MANIFEST-000001
2025/11/16-14:14:54.658 27c Recovering log #13
2025/11/16-14:14:54.658 27c Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db/000013.log
2025/12/28-14:19:49.860 6ac Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db/MANIFEST-000001
2025/12/28-14:19:49.861 6ac Recovering log #19
2025/12/28-14:19:49.866 6ac Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db/000019.log

View File

@@ -1,3 +1,3 @@
2025/11/16-15:36:13.140 9a8 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db\metadata/MANIFEST-000001
2025/11/16-15:36:13.141 9a8 Recovering log #3
2025/11/16-15:36:13.143 9a8 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db\metadata/000003.log
2025/12/28-14:50:54.290 22b4 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db\metadata/MANIFEST-000001
2025/12/28-14:50:54.291 22b4 Recovering log #3
2025/12/28-14:50:54.291 22b4 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db\metadata/000003.log

View File

@@ -1,3 +1,3 @@
2025/11/16-14:14:54.614 27c Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db\metadata/MANIFEST-000001
2025/11/16-14:14:54.615 27c Recovering log #3
2025/11/16-14:14:54.619 27c Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db\metadata/000003.log
2025/12/28-14:19:49.851 6ac Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db\metadata/MANIFEST-000001
2025/12/28-14:19:49.852 6ac Recovering log #3
2025/12/28-14:19:49.854 6ac Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db\metadata/000003.log

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJtYW5pZmVzdC5qc29uIiwicm9vdF9oYXNoIjoieGs1RjVGekZ2WktUWWl5ek8xblpPYkdWLTkyMzNHelZrclNKLUZjOFRFbyJ9XSwiZm9ybWF0IjoidHJlZWhhc2giLCJoYXNoX2Jsb2NrX3NpemUiOjQwOTZ9XSwiaXRlbV9pZCI6Imxsa2dqZmZjZHBmZm1oaWFrbWZjZGNibG9oY2NwZm1vIiwiaXRlbV92ZXJzaW9uIjoiMS4wLjAuMTgiLCJwcm90b2NvbF92ZXJzaW9uIjoxfQ","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"QRaGELghjHv0t2GYRo6Eu7XbIzH-3hdNOy0iSCD1qEb1Pp4F0d3VbyP5bTgERZ2AzMb3TAvVZMK_sE_ts18EAdXwltdTXYeZHmroN2B_ixdQ-nFYH5KrsvCdmsjjTf19uocT3IlfAIcaf7dhqLX1tPV0pnJ2EXw3Iwb0FJl08MCtab9y1_WUwXKLqt_5aNppkB2X1ytWwgBWOfKFDvuiRi3ri5NwPPSJXeNal0Pr-d0e6mBg6PyM5C2_ZC8jtkDUam8IyxtTynjwy1oG52FD7zuV2091xxDzdRen12zMdxtuGakMsHRgBVYxXJBNJ3Z4DYqHVTCYSKS-3eo9jPUTcQ"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"YQLDrVMllSZ2igdaPuiES_SDUFw5DuzQ-q_f405BYJflKZOSHpisX0ngu1j0_MKJtw2o6kM-LiIgvDodJRARG6hbtnJavtpdo1bxXbKTZxWZ6wg4LsT-9fqYYwbeytHmJ0spSEzu4Mu2zW7fjDHdDh7IxRfj_1JLo2nizsFDz9pFwA-z7w_Rw_az7o2wWJ_m7JA5f4V7cd3nUWe3dbrGVSA0akUSR2J2AcEwBwDZhWESCuyKD1ZlefARS451M3dUOsMUsz0U88wONFMnMQ89jorHLJi3EWB8f_Z83NRSjZ6L3cjrFPl_0MT0Inr8wcEP0E4MEYeswR_jsWSVVou9-g"}]}}]

View File

@@ -1 +0,0 @@
1.ee4b855eb4e00f150fe268baead4f478bf3f5a6b9b8b89026d71e09c368876f8

View File

@@ -1,15 +0,0 @@
{
"description" : "Origin Trials public key updates and disabled features list",
"manifest_version" : 3,
"minimum_chrome_version" : "88",
"name" : "Origin Trials Updates",
"origin-trials" :
{
"disabled-features" :
[
"CanvasTextNg"
]
},
"update_url" : "https://clients2.google.com/service/update2/crx",
"version" : "1.0.0.18"
}

Binary file not shown.

View File

@@ -1 +0,0 @@
[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJtYW5pZmVzdC5qc29uIiwicm9vdF9oYXNoIjoiT29iUUNZTVdTSFVnN2IzdjAtSDBXNmVrTEVManlJeGpwOXQ5b1o5d0pNcyJ9LHsicGF0aCI6Im1ldGFkYXRhLnBiIiwicm9vdF9oYXNoIjoicjF3cHgtMy04Q1AzaFR1cTJrRXhDLXJwcDZJWk9iZXJDUXFMdjladVVxOCJ9XSwiZm9ybWF0IjoidHJlZWhhc2giLCJoYXNoX2Jsb2NrX3NpemUiOjQwOTZ9XSwiaXRlbV9pZCI6ImpmbGhjaGNjbXBwa2ZlYmtpYW1pbmFnZWVobWNoaWttIiwiaXRlbV92ZXJzaW9uIjoiMjAyNS4xMC41LjEiLCJwcm90b2NvbF92ZXJzaW9uIjoxfQ","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"E53SrBTj8Fh4ZE0lHaOqjNsKfWHegDLUCH2fDmNFg7wJqJo-XFqeq480MzuzAMkADwy4abj-ll06YUH0Vy2DJjqOm_0YBe8pLoCmpX_kgGCRNS-GynWOrnXOoDq-r7YdMEJiwqtpz-RhcLB0i3mMI-OdSvX3TFeRMCkHlovJF_FEUVnLZgus3ITP5X8thlzVR6phXshphjmMm3tyWX3yOuFYqvCJ1qaXbVPdIntQ1fe7ShBY8ZX0OZS4acpmNsPnCTVpd4_gEPKPldf5VwblxHu1hdI8c9TGs0l2tlmVDY7am4Bf0S3q4_M7tY5TIyVSdhqtk_H2QJEgcxz6Xe6WQkUhjHQOFSpRTCjGbjA42tf-uieLr2g8mnXqWxUcCoUVRe2Ni-1DYhuQt6fgXdVm4numTnnXhTm8bozjJLLBkfitHC_1tsVVb-Sj5X0KFYedFihlX1PAkZrf7HMmAfpeN_6DiWR1-o5dErTecv1fM5c1MTtYvYRWeUz4pQe6wNfD4KPsl8FWV5Qc60ddr86dbNPmHqWvucWCvQa7kXCyXKkq_lwNqXsSQxNy62ENmUmVWNtBGrox2QGSbx0lkrv7rExRdnhw_MXpEHUHNMAjB9D89RbhAsJCq8JMdNqFPyI-NwwcSSRlR3fhV62I6Ljg_lgtUIm1-6OLc3eOFFX0abU"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"MRD_RWRfn2WMAVlkUdOAympEslgx1sjomkqS_HwJkYjSCLfZFSEGyveDGkVKenylFuV8Sg4cyPwnk_z9XQoWmQsG2nASBLC85Pu1IkKdMOiGx8H3DFS68-bGIhxkjuEkvnXfDwWS_UiMmp-uERSlbKNaEFk5jm780gpoi_SmZqu9dWPzWqvX1Xle3xhpkLf6Es-6HlcVNNbBKaGKwqhHPn859MzJoDIWL7WGSiz5J8cxZoPN0SbzxU28wwTyzw6wZejdvC6FPvT7ESud8x8wsEKkI552fnMxDvs38s1iNWaGzHPVm2xC3EtToIAK75F27qt5Ijh1OK55C6dP4OY78Q"}]}}]

View File

@@ -1 +0,0 @@
1.b911063da66cd283f0cd92d5b40fa36d891e285ffd0b67e7af79219db69ee5c7

View File

@@ -1,5 +0,0 @@
{
"manifest_version": 2,
"name": "Third-Party Cookie Deprecation Metadata",
"version": "2025.10.5.1"
}

View File

@@ -1 +1 @@
{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":386}
{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":594}

View File

@@ -1,9 +0,0 @@
Google LLC and its affiliates ("Google") own all legal right, title and
interest in and to the content decryption module software ("Software") and
related documentation, including any intellectual property rights in the
Software. You may not use, modify, sell, or otherwise distribute the Software
without a separate license agreement with Google. The Software is not open
source software.
If you are interested in licensing the Software, please contact
www.widevine.com

View File

@@ -1 +0,0 @@
[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJMSUNFTlNFIiwicm9vdF9oYXNoIjoicjdVVTVDYVZsQ05MTXNoenVpelR6SWlTNkRhR0VUZTFNYVFLRWpLQ0RGayJ9LHsicGF0aCI6Il9wbGF0Zm9ybV9zcGVjaWZpYy93aW5feDY0L3dpZGV2aW5lY2RtLmRsbCIsInJvb3RfaGFzaCI6IjN2S2p0YmhOVEh1THVWZGdCQjZmbmxCcWZvUkQ3cjB1a3E0S0kzdEhSOE0ifSx7InBhdGgiOiJfcGxhdGZvcm1fc3BlY2lmaWMvd2luX3g2NC93aWRldmluZWNkbS5kbGwuc2lnIiwicm9vdF9oYXNoIjoidmE1N2JDM2pXSEtDZ0o4dTRiQjlzTEtYYWQ0czZhN0FiME9aYUZ4M0tiYyJ9LHsicGF0aCI6Im1hbmlmZXN0Lmpzb24iLCJyb290X2hhc2giOiJUdFBHT0o5dmZObE50YzBQaHd3MG9wYjhEZU94NXdmOHp3RmtXMFZYa000In1dLCJmb3JtYXQiOiJ0cmVlaGFzaCIsImhhc2hfYmxvY2tfc2l6ZSI6NDA5Nn1dLCJpdGVtX2lkIjoib2ltb21wZWNhZ25hamRlamdubmppam9iZWJhZWlnZWsiLCJpdGVtX3ZlcnNpb24iOiI0LjEwLjI4OTEuMCIsInByb3RvY29sX3ZlcnNpb24iOjF9","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"l6vfhExGU7tsRAr-IwvL55nkUuou1seQjI2-S7bAMkOIk9q4kBgJgjOWZHzIzt3HNaAvyrdz6LQiYBJl4wRtHLPfNUxbC5IC6CBD9S7teWVzZCFOjCHIhxFldn9lRKf0SXuYcc9aHkIEj6mbbouTzBBUZ-pNDri0TKQ1vGvM7OM"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"AqEnL9Iqt_GjxwZruiCa5pTUNX5SB1IachQtE86LWb7n2FpVzeP32wcmqro2DZT_oZvmVAR6PVndi4BAuH2a8IC3m0EQFNPzpUv5w7dXRpjVklia3KygW7cDZLZP0WdqGhsHWHqLV4AHIbjnvgvTwAUjrEfqQW1h2_fTu2dIyg2lr7MUrrmNWkoJT2ewbA7xMXsfvnH_eI89IJbDwVX1EOdKSKlbiHrN2CtI-ZsFQ9z59l56pSUyA6lrFKTlkgVzq0f9cRtDFOtQDc0ILWa-vuBj-OxmFON_ShB1B4Ye0PXJgfULfuYaO6EtJs-D4oImI8Ti4H5Ie-61mIg1AyFmVA"}]}}]

View File

@@ -1 +0,0 @@
1.a6af95a209b2e652ed6766804b9b8ad6b6a68f2c610b8f14713cd40df0d62bf9

View File

@@ -1,43 +0,0 @@
{
"manifest_version": 2,
"update_url": "https://clients2.google.com/service/update2/crx",
"name": "WidevineCdm",
"description": "Widevine Content Decryption Module",
"version": "4.10.2891.0",
"minimum_chrome_version": "68.0.3430.0",
"x-cdm-module-versions": "4",
"x-cdm-interface-versions": "10",
"x-cdm-host-versions": "10",
"x-cdm-codecs": "vp8,vp09,avc1,av01",
"x-cdm-persistent-license-support": true,
"x-cdm-supported-encryption-schemes": [
"cenc",
"cbcs"
],
"icons": {
"16": "imgs/icon-128x128.png",
"128": "imgs/icon-128x128.png"
},
"platforms": [
{
"os": "win",
"arch": "x64",
"sub_package_path": "_platform_specific/win_x64/"
},
{
"os": "win",
"arch": "x86",
"sub_package_path": "_platform_specific/win_x86/"
},
{
"os": "win",
"arch": "arm64",
"sub_package_path": "_platform_specific/win_arm64/"
}
],
"accept_arch": [
"x64",
"x86_64",
"x86_64h"
]
}

View File

@@ -1,72 +1,6 @@
[25176:20700:1116/134535.058:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[25176:20700:1116/134535.093:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[24656:20712:1116/134535.315:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[6424:3776:1116/134735.388:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[25116:23752:1116/134835.102:ERROR:gpu_blocklist.cc(71)] Unable to get gpu adapter
[25176:20700:1116/134835.103:ERROR:service_client.cc(36)] Unexpected on_device_model service disconnect: The device's GPU is not supported.
[25012:3556:1116/135030.390:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[25012:3556:1116/135030.422:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[25416:22984:1116/135030.626:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[22104:4432:1116/135101.126:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[22104:4432:1116/135101.158:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[4292:15180:1116/135101.362:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[8940:2448:1116/135102.484:WARNING:backend_impl.cc(1757)] Destroying invalid entry.
[24120:23064:1116/135131.279:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[24120:23064:1116/135131.313:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[3128:22532:1116/135131.526:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[24680:4656:1116/135334.771:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[24680:4656:1116/135334.802:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[18180:2464:1116/135335.025:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[22568:8176:1116/135603.988:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[22568:8176:1116/135604.019:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[1740:19120:1116/135604.262:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[24072:24800:1116/135804.268:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[24628:17756:1116/135904.034:ERROR:gpu_blocklist.cc(71)] Unable to get gpu adapter
[22568:8176:1116/135904.034:ERROR:service_client.cc(36)] Unexpected on_device_model service disconnect: The device's GPU is not supported.
[22968:14560:1116/140111.527:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[22968:14560:1116/140111.574:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[15972:3044:1116/140111.769:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[23484:25224:1116/140142.940:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[23484:25224:1116/140142.970:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[9076:18484:1116/140143.178:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[13380:24952:1116/140143.506:WARNING:backend_impl.cc(1757)] Destroying invalid entry.
[13380:24952:1116/140143.521:WARNING:backend_impl.cc(1757)] Destroying invalid entry.
[13380:24952:1116/140143.522:WARNING:backend_impl.cc(1757)] Destroying invalid entry.
[13380:24952:1116/140143.522:WARNING:backend_impl.cc(1757)] Destroying invalid entry.
[22408:24528:1116/140324.353:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[22408:24528:1116/140324.387:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[4316:23620:1116/140324.585:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[20956:24116:1116/140524.561:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[2332:23256:1116/140529.242:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[2332:23256:1116/140529.277:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[21212:22652:1116/140529.475:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[24336:23236:1116/140612.851:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[24336:23236:1116/140612.890:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[22856:13480:1116/140613.091:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[23048:12868:1116/140707.334:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[23048:12868:1116/140707.371:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[20416:10836:1116/140707.573:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[9900:24972:1116/140708.787:WARNING:backend_impl.cc(1757)] Destroying invalid entry.
[9900:24972:1116/140708.788:WARNING:backend_impl.cc(1757)] Destroying invalid entry.
[24012:8024:1116/140818.429:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[24012:8024:1116/140818.460:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[12504:7372:1116/140818.650:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[20088:24612:1116/140921.658:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[20088:24612:1116/140921.690:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[17892:22072:1116/140921.900:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[23516:10028:1116/141013.800:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[23516:10028:1116/141013.833:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[15276:23988:1116/141014.056:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[21372:25472:1116/141108.344:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[21372:25472:1116/141108.378:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[9164:25548:1116/141108.569:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[19976:8024:1116/141220.067:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[19976:8024:1116/141220.104:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[20268:19948:1116/141220.294:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[22624:21192:1116/141420.243:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[13532:6284:1116/141454.556:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[13532:6284:1116/141454.590:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[25364:4332:1116/141454.798:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[3564:24164:1116/153613.078:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[3564:24164:1116/153613.112:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[10268:6444:1116/153613.586:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[12284:16860:1228/145054.244:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
[12284:16860:1228/145054.280:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
[8880:16484:1228/145054.563:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[13676:18520:1228/145254.442:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
[14320:9004:1228/145354.607:ERROR:gpu_blocklist.cc(71)] Unable to get gpu adapter
[12284:16860:1228/145354.607:ERROR:service_client.cc(36)] Unexpected on_device_model service disconnect: The device's GPU is not supported.

Binary file not shown.

Binary file not shown.

BIN
sql_learning.db Normal file

Binary file not shown.

6
sql_learning.lock.db Normal file
View File

@@ -0,0 +1,6 @@
#FileLock
#Sun Dec 28 14:52:28 CST 2025
hostName=192.168.116.1
id=19b63bad12a8483d76995f9c5100715a8b474ee84cc
method=file
server=192.168.116.1\:64976

200
sql_learning.trace.db Normal file
View File

@@ -0,0 +1,200 @@
2025-12-12 17:22:54 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "[*]ues students"; expected "UPDATE, USE"; SQL statement:
ues students [42001-220]
2025-12-12 17:23:23 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "STUDENTS" not found; SQL statement:
SELECT students [42122-220]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:514)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
at org.h2.message.DbException.get(DbException.java:223)
at org.h2.message.DbException.get(DbException.java:199)
at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:244)
at org.h2.expression.ExpressionColumn.optimizeOther(ExpressionColumn.java:226)
at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:213)
at org.h2.command.query.Select.optimizeExpressionsAndPreserveAliases(Select.java:1285)
at org.h2.command.query.Select.prepareExpressions(Select.java:1167)
at org.h2.command.query.Query.prepare(Query.java:218)
at org.h2.command.Parser.prepareCommand(Parser.java:583)
at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:634)
at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:557)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:237)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
at com.axis.innovators.box.browser.MainApplication.executeRealSQL(MainApplication.java:136)
at com.axis.innovators.box.browser.MainApplication$1.onQuery(MainApplication.java:265)
2025-12-12 17:24:37 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Schema "STUDENTS" not found; SQL statement:
SET SCHEMA students [90079-220]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:644)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
at org.h2.message.DbException.get(DbException.java:223)
at org.h2.message.DbException.get(DbException.java:199)
at org.h2.engine.Database.getSchema(Database.java:1548)
at org.h2.command.dml.Set.update(Set.java:397)
at org.h2.command.CommandContainer.update(CommandContainer.java:169)
at org.h2.command.Command.executeUpdate(Command.java:252)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:252)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
at com.axis.innovators.box.browser.MainApplication.executeRealSQL(MainApplication.java:136)
at com.axis.innovators.box.browser.MainApplication$1.onQuery(MainApplication.java:265)
2025-12-12 21:13:44 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "[*]mysql"; expected "MERGE"; SQL statement:
mysql [42001-220]
2025-12-12 21:13:50 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "?[*]"; expected "="; SQL statement:
? [42001-220]
2025-12-12 21:14:03 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "[*]EXIT"; expected "EXPLAIN, EXECUTE"; SQL statement:
EXIT [42001-220]
2025-12-12 21:14:07 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "[*]exit"; expected "EXPLAIN, EXECUTE"; SQL statement:
exit [42001-220]
2025-12-12 21:14:21 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "[*]cls"; expected "COMMIT, CREATE, CALL, CHECKPOINT, COMMENT"; SQL statement:
cls [42001-220]
2025-12-12 21:14:31 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "[*]quit"; SQL statement:
quit [42000-220]
2025-12-12 21:15:15 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Function "DATABASE" not found; SQL statement:
SELECT * FROM database() [90022-220]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:644)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
at org.h2.message.DbException.get(DbException.java:223)
at org.h2.message.DbException.get(DbException.java:199)
at org.h2.command.Parser.getFunctionAliasWithinPath(Parser.java:2576)
at org.h2.command.Parser.readTableFunction(Parser.java:2060)
at org.h2.command.Parser.readTablePrimary(Parser.java:1908)
at org.h2.command.Parser.readTableReference(Parser.java:2391)
at org.h2.command.Parser.parseSelectFromPart(Parser.java:2844)
at org.h2.command.Parser.parseSelect(Parser.java:2950)
at org.h2.command.Parser.parseQueryPrimary(Parser.java:2834)
at org.h2.command.Parser.parseQueryTerm(Parser.java:2690)
at org.h2.command.Parser.parseQueryExpressionBody(Parser.java:2669)
at org.h2.command.Parser.parseQueryExpressionBodyAndEndOfQuery(Parser.java:2662)
at org.h2.command.Parser.parseQueryExpression(Parser.java:2655)
at org.h2.command.Parser.parseQuery(Parser.java:2624)
at org.h2.command.Parser.parsePrepared(Parser.java:732)
at org.h2.command.Parser.parse(Parser.java:697)
at org.h2.command.Parser.parse(Parser.java:669)
at org.h2.command.Parser.prepareCommand(Parser.java:577)
at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:634)
at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:557)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:237)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
at com.axis.innovators.box.browser.MainApplication.executeRealSQL(MainApplication.java:136)
at com.axis.innovators.box.browser.MainApplication$1.onQuery(MainApplication.java:265)
2025-12-12 21:15:26 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Function "DATABASES" not found; SQL statement:
SELECT * FROM databases() [90022-220]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:644)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
at org.h2.message.DbException.get(DbException.java:223)
at org.h2.message.DbException.get(DbException.java:199)
at org.h2.command.Parser.getFunctionAliasWithinPath(Parser.java:2576)
at org.h2.command.Parser.readTableFunction(Parser.java:2060)
at org.h2.command.Parser.readTablePrimary(Parser.java:1908)
at org.h2.command.Parser.readTableReference(Parser.java:2391)
at org.h2.command.Parser.parseSelectFromPart(Parser.java:2844)
at org.h2.command.Parser.parseSelect(Parser.java:2950)
at org.h2.command.Parser.parseQueryPrimary(Parser.java:2834)
at org.h2.command.Parser.parseQueryTerm(Parser.java:2690)
at org.h2.command.Parser.parseQueryExpressionBody(Parser.java:2669)
at org.h2.command.Parser.parseQueryExpressionBodyAndEndOfQuery(Parser.java:2662)
at org.h2.command.Parser.parseQueryExpression(Parser.java:2655)
at org.h2.command.Parser.parseQuery(Parser.java:2624)
at org.h2.command.Parser.parsePrepared(Parser.java:732)
at org.h2.command.Parser.parse(Parser.java:697)
at org.h2.command.Parser.parse(Parser.java:669)
at org.h2.command.Parser.prepareCommand(Parser.java:577)
at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:634)
at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:557)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:237)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
at com.axis.innovators.box.browser.MainApplication.executeRealSQL(MainApplication.java:136)
at com.axis.innovators.box.browser.MainApplication$1.onQuery(MainApplication.java:265)
2025-12-12 21:16:23 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Schema "ADS" not found; SQL statement:
SET SCHEMA ads [90079-220]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:644)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
at org.h2.message.DbException.get(DbException.java:223)
at org.h2.message.DbException.get(DbException.java:199)
at org.h2.engine.Database.getSchema(Database.java:1548)
at org.h2.command.dml.Set.update(Set.java:397)
at org.h2.command.CommandContainer.update(CommandContainer.java:169)
at org.h2.command.Command.executeUpdate(Command.java:252)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:252)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
at com.axis.innovators.box.browser.MainApplication.executeRealSQL(MainApplication.java:136)
at com.axis.innovators.box.browser.MainApplication$1.onQuery(MainApplication.java:265)
2025-12-12 21:16:37 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Schema "ADS" not found; SQL statement:
SET SCHEMA ads [90079-220]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:644)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
at org.h2.message.DbException.get(DbException.java:223)
at org.h2.message.DbException.get(DbException.java:199)
at org.h2.engine.Database.getSchema(Database.java:1548)
at org.h2.command.dml.Set.update(Set.java:397)
at org.h2.command.CommandContainer.update(CommandContainer.java:169)
at org.h2.command.Command.executeUpdate(Command.java:252)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:252)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
at com.axis.innovators.box.browser.MainApplication.executeRealSQL(MainApplication.java:136)
at com.axis.innovators.box.browser.MainApplication$1.onQuery(MainApplication.java:265)
2025-12-12 21:17:05 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "10ada" not found; SQL statement:
SELECT "10ada"*100 [42122-220]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:514)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
at org.h2.message.DbException.get(DbException.java:223)
at org.h2.message.DbException.get(DbException.java:199)
at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:244)
at org.h2.expression.ExpressionColumn.optimizeOther(ExpressionColumn.java:226)
at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:213)
at org.h2.expression.BinaryOperation.optimize(BinaryOperation.java:131)
at org.h2.command.query.Select.optimizeExpressionsAndPreserveAliases(Select.java:1285)
at org.h2.command.query.Select.prepareExpressions(Select.java:1167)
at org.h2.command.query.Query.prepare(Query.java:218)
at org.h2.command.Parser.prepareCommand(Parser.java:583)
at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:634)
at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:557)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:237)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
at com.axis.innovators.box.browser.MainApplication.executeRealSQL(MainApplication.java:136)
at com.axis.innovators.box.browser.MainApplication$1.onQuery(MainApplication.java:265)
2025-12-12 21:17:09 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "10ada" not found; SQL statement:
SELECT "10ada" * 100 [42122-220]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:514)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
at org.h2.message.DbException.get(DbException.java:223)
at org.h2.message.DbException.get(DbException.java:199)
at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:244)
at org.h2.expression.ExpressionColumn.optimizeOther(ExpressionColumn.java:226)
at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:213)
at org.h2.expression.BinaryOperation.optimize(BinaryOperation.java:131)
at org.h2.command.query.Select.optimizeExpressionsAndPreserveAliases(Select.java:1285)
at org.h2.command.query.Select.prepareExpressions(Select.java:1167)
at org.h2.command.query.Query.prepare(Query.java:218)
at org.h2.command.Parser.prepareCommand(Parser.java:583)
at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:634)
at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:557)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:237)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
at com.axis.innovators.box.browser.MainApplication.executeRealSQL(MainApplication.java:136)
at com.axis.innovators.box.browser.MainApplication$1.onQuery(MainApplication.java:265)
2025-12-15 10:39:15 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "DELETE add[*]"; expected "., FROM"; SQL statement:
DELETE add [42001-220]
2025-12-15 10:39:23 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "DELETE [*]TABLE add"; expected "identifier"; SQL statement:
DELETE TABLE add [42001-220]
2025-12-15 10:39:48 jdbc[3]: exception
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "DELETE [*]/?"; expected "identifier"; SQL statement:
DELETE /? [42001-220]

View File

@@ -96,8 +96,6 @@ public class AxisInnovatorsBox {
private final boolean isDebug;
private static DebugWindow debugWindow;
private static LoginData loginData;
public AxisInnovatorsBox(String[] args, boolean isDebug, boolean quickStart) {
this.args = args;
this.isDebug = isDebug;
@@ -145,6 +143,7 @@ public class AxisInnovatorsBox {
token = null;
}
}
LoginData loginData;
if (token == null || token.isEmpty()) {
LoginResult loginResult = CasdoorLoginWindow.showLoginDialogAndGetLoginResult();
if (loginResult == null) {
@@ -1073,20 +1072,12 @@ public class AxisInnovatorsBox {
// Set the exception handler for EDT(event dispatcher thread)
System.setProperty("sun.awt.exception.handler", EDTCrashHandler.class.getName());
// Check if AxisInnovatorsBox is started
// If it's started, and it's not a quick start, don't allow it
// because it's already started
// Stop loading if the current running context is the quickStart context
if (AxisInnovatorsBox.getMain() != null
&& !AxisInnovatorsBox.getMain().getQuickStart() || quickStart) {
// Manually created if it is a quickStart context and the AxisInnovatorsBox instance in the context is empty
if (AxisInnovatorsBox.getMain() == null && quickStart) {
new AxisInnovatorsBox(args,isDebug,true);
}
main = new AxisInnovatorsBox(args,isDebug,quickStart);
if (quickStart) {
return;
}
main = new AxisInnovatorsBox(args,isDebug,false);
try {
main.initLog4j2();
main.setTopic();

View File

@@ -74,11 +74,7 @@ public class Main {
String path = fileInfo.get("path");
if (".jar".equals(extension)) {
SwingUtilities.invokeLater(() -> {
try {
UIManager.setLookAndFeel(new com.formdev.flatlaf.FlatDarculaLaf());
} catch (Exception ignored) {}
ModernJarViewer viewer = new ModernJarViewer(null, path);
viewer.setVisible(true);
ModernJarViewer.popupSimulatingWindow(null,path);
});
releaseLock(); // 释放锁(窗口模式)
quickStart = true;
@@ -139,7 +135,6 @@ public class Main {
if (lockFile != null) {
lockFile.close();
}
// 可选:删除锁文件
new File(LOCK_FILE).delete();
} catch (IOException e) {
e.printStackTrace();

View File

@@ -10,10 +10,7 @@ import org.cef.CefSettings;
import org.cef.browser.CefBrowser;
import org.cef.browser.CefFrame;
import org.cef.browser.CefMessageRouter;
import org.cef.callback.CefContextMenuParams;
import org.cef.callback.CefJSDialogCallback;
import org.cef.callback.CefMenuModel;
import org.cef.callback.CefQueryCallback;
import org.cef.callback.*;
import org.cef.handler.*;
import org.cef.misc.BoolRef;
import org.cef.network.CefRequest;
@@ -307,44 +304,30 @@ public class BrowserWindow extends JFrame {
});
}
client.addLifeSpanHandler(new CefLifeSpanHandlerAdapter() {
@Override
public boolean onBeforePopup(CefBrowser browser, CefFrame frame,
String targetUrl, String targetFrameName) {
// 处理弹出窗口:根据配置决定打开方式
if (builder.openLinksInExternalBrowser) {
// 使用默认浏览器打开
try {
Desktop.getDesktop().browse(new URI(targetUrl));
} catch (Exception e) {
System.out.println("Failed to open external browser: " + e.getMessage());
}
return true; // 拦截弹窗
} else {
// 在当前浏览器中打开
browser.loadURL(targetUrl);
return true; // 拦截弹窗并在当前窗口打开
}
}
});
client.addRequestHandler(new CefRequestHandlerAdapter() {
@Override
public boolean onBeforeBrowse(CefBrowser browser, CefFrame frame,
CefRequest request, boolean userGesture, boolean isRedirect) {
// 处理主窗口导航
String url = request.getURL();
// 【关键判断】如果是 data: 协议,绝对禁止调用 Desktop.browse
// 返回 false 让 CEF 内核自己渲染这个 Base64 内容
if (url != null && url.toLowerCase().startsWith("data:")) {
return false;
}
// 处理其他普通链接 (http/https/file)
if (userGesture) {
if (builder.openLinksInExternalBrowser) {
// 使用默认浏览器打开
try {
Desktop.getDesktop().browse(new URI(request.getURL()));
return true; // 取消内置浏览器导航
Desktop.getDesktop().browse(new URI(url));
return true; // 拦截,交给系统
} catch (Exception e) {
System.out.println("Failed to open external browser: " + e.getMessage());
System.out.println("外部浏览器打开失败: " + e.getMessage());
}
} else {
// 允许在当前浏览器中打开
return false;
return false; // 允许内部跳转
}
}
return false;
@@ -426,10 +409,26 @@ public class BrowserWindow extends JFrame {
}
});
client.addDownloadHandler(new org.cef.handler.CefDownloadHandler() {
@Override
public void onBeforeDownload(org.cef.browser.CefBrowser browser,
org.cef.callback.CefDownloadItem downloadItem,
String suggestedName,
org.cef.callback.CefBeforeDownloadCallback callback) {
callback.Continue(suggestedName, false);
}
@Override
public void onDownloadUpdated(org.cef.browser.CefBrowser browser,
org.cef.callback.CefDownloadItem downloadItem,
org.cef.callback.CefDownloadItemCallback callback) {
}
});
client.addJSDialogHandler(new CefJSDialogHandlerAdapter() {
@Override
public boolean onJSDialog(CefBrowser browser, String origin_url, CefJSDialogHandler.JSDialogType dialog_type, String message_text, String default_prompt_text, CefJSDialogCallback callback, BoolRef suppress_message) {
if (dialog_type == CefJSDialogHandler.JSDialogType.JSDIALOGTYPE_ALERT) {
public boolean onJSDialog(CefBrowser browser, String origin_url, JSDialogType dialog_type, String message_text, String default_prompt_text, CefJSDialogCallback callback, BoolRef suppress_message) {
if (dialog_type == JSDialogType.JSDIALOGTYPE_ALERT) {
SwingUtilities.invokeLater(() -> {
JOptionPane.showMessageDialog(
BrowserWindow.this,
@@ -437,23 +436,81 @@ public class BrowserWindow extends JFrame {
"警告",
JOptionPane.INFORMATION_MESSAGE
);
});
callback.Continue(true, "");
});
return true;
} else if (dialog_type == JSDialogType.JSDIALOGTYPE_CONFIRM) { // 处理 confirm()
SwingUtilities.invokeLater(() -> {
int result = JOptionPane.showConfirmDialog(
BrowserWindow.this,
message_text,
"确认",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE
);
// 如果用户点击 YES (确定),则传回 true
boolean confirmed = (result == JOptionPane.YES_OPTION);
callback.Continue(confirmed, "");
});
return true;
} else if (dialog_type == JSDialogType.JSDIALOGTYPE_PROMPT) {
SwingUtilities.invokeLater(() -> {
Object result = JOptionPane.showInputDialog(
BrowserWindow.this,
message_text,
"输入",
JOptionPane.QUESTION_MESSAGE,
null,
null,
default_prompt_text
);
String input = (result != null) ? result.toString() : null;
if (input != null) {
callback.Continue(true, input);
} else {
callback.Continue(false, "");
}
});
return true;
}
// 默认行为:如果不是以上三种类型,交给 CEF 默认处理
return false;
}
});
// 3. 拦截所有新窗口(关键修复点!)
//client.addLifeSpanHandler(new CefLifeSpanHandlerAdapter() {
// @Override
// public boolean onBeforePopup(CefBrowser browser,
// CefFrame frame, String target_url, String target_frame_name) {
// return true; // 返回true表示拦截弹窗
// }
//});
client.addLifeSpanHandler(new CefLifeSpanHandlerAdapter() {
@Override
public boolean onBeforePopup(CefBrowser browser, CefFrame frame,
String targetUrl, String targetFrameName) {
boolean isDataProtocol = targetUrl != null && targetUrl.toLowerCase().startsWith("data:");
if (builder.openLinksInExternalBrowser && !isDataProtocol) {
try {
Desktop.getDesktop().browse(new URI(targetUrl));
} catch (Exception e) {
System.out.println("外部浏览器打开失败: " + e.getMessage());
}
return true; // 拦截默认行为
}
SwingUtilities.invokeLater(() -> {
String popupWindowId = windowId + "_popup_" + System.currentTimeMillis();
WindowRegistry.getInstance().createNewWindow(popupWindowId, popupBuilder -> {
popupBuilder.title(getTitle()) // 继承标题
.size(getWidth(), getHeight()) // 继承大小
.htmlUrl(targetUrl) // 传入 data: URL
.icon(builder.icon) // 继承图标
.openLinksInBrowser(true); // 新窗口内链接强制内部打开
if (builder.operationHandler != null) {
popupBuilder.operationHandler(builder.operationHandler);
}
});
});
return true; // 拦截 CEF 默认弹窗,由 Java Swing 窗口接管
}
});
Thread.currentThread().setName("BrowserRenderThread");
@@ -582,8 +639,10 @@ public class BrowserWindow extends JFrame {
public void updateTheme() {
// 1. 获取Java字体信息
String fontInfo = getSystemFontsInfo();
if (AxisInnovatorsBox.getMain() != null) {
boolean isDarkTheme = AxisInnovatorsBox.getMain().getRegistrationTopic().isDarkMode();
injectFontInfoToPage(browser, fontInfo, isDarkTheme);
}
// 2. 注入主题信息
//injectThemeInfoToPage(browser, isDarkTheme);

View File

@@ -3,6 +3,7 @@ package com.axis.innovators.box.browser;
import com.axis.innovators.box.AxisInnovatorsBox;
import com.axis.innovators.box.browser.util.CodeExecutor;
import com.axis.innovators.box.browser.util.DatabaseConnectionManager;
import com.axis.innovators.box.browser.util.TerminalManager;
import com.axis.innovators.box.tools.FolderCreator;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
@@ -36,19 +37,254 @@ import java.util.concurrent.atomic.AtomicReference;
public class MainApplication {
private static final ExecutorService executor = Executors.newCachedThreadPool();
private static Connection dbConnection = null;
private static long modelHandle;
private static long ctxHandle;
private static boolean isSystem = true;
public static void main(String[] args) {
AtomicReference<BrowserWindow> window = new AtomicReference<>();
WindowRegistry.getInstance().createNewWindow("main", builder ->
window.set(builder.title("Axis Innovators Box AI 工具箱")
.size(1280, 720)
.htmlUrl("https://www.bilibili.com/")
.openLinksInBrowser(true)
TerminalManager.popupRealLinuxWindow();
}
public static void popupSimulatingLinuxWindow(JFrame parent){
}
/**
* 初始化数据库连接
*/
private static void initDatabase() {
try {
if (dbConnection != null && !dbConnection.isClosed()) {
return;
}
// 加载 H2 驱动
Class.forName("org.h2.Driver");
// 核心配置:
// 1. MODE=MySQL : 开启 MySQL 语法兼容 (支持 AUTO_INCREMENT, ENUM 等)
// 2. IGNORE_UNKNOWN_SETTINGS=TRUE : 忽略 ENGINE=InnoDB, CHARSET=utf8 等 H2 不懂的配置,不报错
// 3. CASE_INSENSITIVE_IDENTIFIERS=TRUE : 忽略大小写
// 4. ~ : 代表用户主目录,数据库文件名为 sql_learning.mv.db
String url = "jdbc:h2:./sql_learning;" +
"MODE=MySQL;" +
"IGNORE_UNKNOWN_SETTINGS=TRUE;" +
"CASE_INSENSITIVE_IDENTIFIERS=TRUE;" +
"AUTO_SERVER=TRUE"; // 允许自动混合模式
dbConnection = DriverManager.getConnection(url, "sa", "");
System.out.println("Connected to H2 Database in MySQL Mode");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 真实的 SQL 执行逻辑
* 替换了之前的 executeMockSQL
*/
private static JSONObject executeRealSQL(String sql) {
JSONObject response = new JSONObject();
String originSql = sql.trim();
// 移除末尾分号,防止 JDBC 报错
if (originSql.endsWith(";")) {
originSql = originSql.substring(0, originSql.length() - 1);
}
String upperSql = originSql.toUpperCase();
// 1. 拦截 HELP (前端功能)
if (upperSql.equals("HELP")) {
response.put("status", "success");
response.put("type", "text");
response.put("output", "Available commands:\n" +
" Any valid MySQL SQL syntax\n" +
" CLS / CLEAR : Clear screen\n" +
" EXIT : Close connection");
return response;
}
// 2. 语义映射:将 MySQL 的【库】概念映射为 H2 的【模式(Schema)】
// H2 是单数据库文件模式,为了模拟多库,我们用 Schema 代替。
// CREATE DATABASE xxx -> CREATE SCHEMA xxx
if (upperSql.startsWith("CREATE DATABASE ")) {
originSql = "CREATE SCHEMA " + originSql.substring(16);
} else if (upperSql.startsWith("USE ")) {
// USE xxx -> SET SCHEMA xxx
originSql = "SET SCHEMA " + originSql.substring(4);
} else if (upperSql.startsWith("DROP DATABASE ")) {
originSql = "DROP SCHEMA " + originSql.substring(14);
} else if (upperSql.equals("SHOW DATABASES")) {
originSql = "SHOW SCHEMAS";
}
// 确保连接
if (dbConnection == null) {
initDatabase();
if (dbConnection == null) {
response.put("status", "error");
response.put("output", "Error: Could not connect to database.");
return response;
}
}
long startTime = System.currentTimeMillis();
Statement stmt = null;
ResultSet rs = null;
try {
stmt = dbConnection.createStatement();
// 3. 直接执行!
// 此时 H2 的 MySQL 模式会原生处理 AUTO_INCREMENT, ENUM, ENGINE=InnoDB (被忽略)
boolean isResultSet = stmt.execute(originSql);
long endTime = System.currentTimeMillis();
double duration = (endTime - startTime) / 1000.0;
if (isResultSet) {
// --- 结果集处理 ---
response.put("status", "success");
response.put("type", "table");
rs = stmt.getResultSet();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
JSONArray headers = new JSONArray();
for (int i = 1; i <= columnCount; i++) headers.put(metaData.getColumnLabel(i));
response.put("headers", headers);
JSONArray rows = new JSONArray();
int rowCount = 0;
while (rs.next()) {
JSONArray row = new JSONArray();
for (int i = 1; i <= columnCount; i++) {
Object val = rs.getObject(i);
row.put(val == null ? "NULL" : val.toString());
}
rows.put(row);
rowCount++;
}
response.put("rows", rows);
response.put("info", String.format("%d rows in set (%.2f sec)", rowCount, duration));
} else {
// --- 更新/DDL 处理 ---
int updateCount = stmt.getUpdateCount();
response.put("status", "success");
response.put("type", "text");
response.put("output", String.format("Query OK, %d row(s) affected (%.2f sec)", updateCount, duration));
}
} catch (SQLException e) {
response.put("status", "error");
// H2 的报错信息通常很清晰
response.put("output", "ERROR " + e.getErrorCode() + ": " + e.getMessage());
} finally {
try { if (rs != null) rs.close(); } catch (Exception e) {}
try { if (stmt != null) stmt.close(); } catch (Exception e) {}
}
return response;
}
/**
* 获取数据库的所有表和列信息,用于前端自动补全
*/
private static JSONObject getDatabaseSchema() {
JSONObject schema = new JSONObject();
JSONArray tables = new JSONArray();
JSONObject columnsMap = new JSONObject(); // Key: tableName, Value: ["col1", "col2"]
// 确保连接存在
if (dbConnection == null) initDatabase();
try {
DatabaseMetaData meta = dbConnection.getMetaData();
// 获取所有表
ResultSet rs = meta.getTables(null, null, "%", new String[]{"TABLE"});
while (rs.next()) {
String tableName = rs.getString("TABLE_NAME");
tables.put(tableName);
// 获取该表的所有列
JSONArray cols = new JSONArray();
ResultSet rsCols = meta.getColumns(null, null, tableName, "%");
while (rsCols.next()) {
cols.put(rsCols.getString("COLUMN_NAME"));
}
columnsMap.put(tableName, cols);
rsCols.close();
}
rs.close();
schema.put("status", "success");
schema.put("tables", tables);
schema.put("columns", columnsMap);
} catch (SQLException e) {
schema.put("status", "error");
schema.put("message", e.getMessage());
}
return schema;
}
/**
* 弹出模拟 SQL 命令行窗口
* @param parent 父窗口
*/
public static void popupSimulatingSQLWindow(JFrame parent) {
AtomicReference<BrowserWindowJDialog> window = new AtomicReference<>();
initDatabase();
SwingUtilities.invokeLater(() -> {
WindowRegistry.getInstance().createNewChildWindow("main", builder ->
window.set(builder.title("SQL Command Line Client")
.parentFrame(parent)
.icon(new ImageIcon(Objects.requireNonNull(MainApplication.class.getClassLoader().getResource("icons/logo.png"))).getImage())
.size(900, 600)
.htmlPath(FolderCreator.getJavaScriptFolder() + "\\" + "SQLTerminal.html")
.operationHandler(createOperationHandler())
.build())
);
CefMessageRouter msgRouter = window.get().getMsgRouter();
if (msgRouter != null) {
msgRouter.addHandler(new CefMessageRouterHandlerAdapter() {
// 在 popupSimulatingSQLWindow 方法的 msgRouter.addHandler 内部:
public boolean onQuery(CefBrowser browser, CefFrame frame, long queryId,
String request, boolean persistent, CefQueryCallback callback) {
try {
JSONObject requestJson = new JSONObject(request);
String type = requestJson.optString("type");
if ("initSchema".equals(type)) {
JSONObject schema = getDatabaseSchema();
callback.success(schema.toString());
return true;
}
if ("executeCommand".equals(type)) {
String cmd = requestJson.optString("command");
JSONObject response = executeRealSQL(cmd);
callback.success(response.toString());
return true;
}
} catch (Exception e) {
JSONObject error = new JSONObject();
error.put("status", "error");
error.put("output", "Error: " + e.getMessage());
callback.failure(500, error.toString());
}
return false;
}
@Override
public void onQueryCanceled(CefBrowser browser, CefFrame frame, long queryId) { }
}, true);
}
});
}
@@ -349,7 +585,7 @@ public class MainApplication {
}
}
private static WindowOperationHandler createOperationHandler() {
public static WindowOperationHandler createOperationHandler() {
return new WindowOperationHandler.Builder()
.withDefaultOperations()
.build();

View File

@@ -0,0 +1,226 @@
package com.axis.innovators.box.browser.util;
import com.axis.innovators.box.browser.BrowserWindow;
import com.axis.innovators.box.browser.BrowserWindowJDialog;
import com.axis.innovators.box.browser.WindowRegistry;
import com.axis.innovators.box.tools.FolderCreator;
import com.pty4j.PtyProcess;
import com.pty4j.PtyProcessBuilder;
import com.pty4j.WinSize;
import org.cef.browser.CefBrowser;
import org.cef.browser.CefFrame;
import org.cef.browser.CefMessageRouter;
import org.cef.callback.CefQueryCallback;
import org.cef.handler.CefMessageRouterHandlerAdapter;
import org.json.JSONObject;
import javax.swing.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import static com.axis.innovators.box.browser.MainApplication.createOperationHandler;
public class TerminalManager {
// 保存 PTY 进程引用
private static PtyProcess ptyProcess;
private static OutputStream ptyInput;
private static Thread outputReaderThread;
/**
* 启动真实的终端窗口
*/
public static void popupRealLinuxWindow() {
AtomicReference<BrowserWindow> window = new AtomicReference<>();
SwingUtilities.invokeLater(() -> {
// 1. 创建窗口
WindowRegistry.getInstance().createNewWindow("real_terminal", builder ->
window.set(builder.title("Terminal Linux")
.size(900, 600)
.htmlPath(FolderCreator.getJavaScriptFolder() + "\\" + "LinuxTerminal.html")
.operationHandler(createOperationHandler())
.build())
);
// 2. 初始化 PTY 进程
startPtyProcess(window.get().getBrowser());
// 3. 注册 JCEF 消息处理器
CefMessageRouter msgRouter = window.get().getMsgRouter();
if (msgRouter != null) {
msgRouter.addHandler(new CefMessageRouterHandlerAdapter() {
@Override
public boolean onQuery(CefBrowser browser, CefFrame frame, long queryId,
String request, boolean persistent, CefQueryCallback callback) {
try {
JSONObject json = new JSONObject(request);
if ("terminalInput".equals(json.optString("type"))) {
// 接收前端的按键数据
String data = json.getString("data");
if (ptyInput != null) {
// 写入到 Shell 进程的标准输入
ptyInput.write(data.getBytes(StandardCharsets.UTF_8));
ptyInput.flush();
}
callback.success("");
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
public void onQueryCanceled(CefBrowser browser, CefFrame frame, long queryId) {}
}, true);
}
// 窗口关闭时杀死进程
window.get().addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosed(java.awt.event.WindowEvent windowEvent) {
stopPtyProcess();
}
});
});
}
private static void startPtyProcess(CefBrowser browser) {
try {
// 1. 确定要运行的 Shell 命令
String[] cmd = determineShellCommand();
// 2. 设置环境变量
Map<String, String> envs = new HashMap<>(System.getenv());
envs.put("TERM", "xterm-256color"); // 告诉 Shell 我们支持颜色
// 3. 启动 PTY 进程
ptyProcess = new PtyProcessBuilder(cmd)
.setEnvironment(envs)
.setRedirectErrorStream(true)
.start();
// 设置初始窗口大小 (列, 行)
ptyProcess.setWinSize(new WinSize(80, 24));
ptyInput = ptyProcess.getOutputStream();
InputStream ptyOutput = ptyProcess.getInputStream();
// 4. 开启后台线程,不断读取 Shell 的输出,并发给前端
outputReaderThread = new Thread(() -> {
byte[] buffer = new byte[1024];
int read;
try {
while ((read = ptyOutput.read(buffer)) != -1) {
// 读取原生字节流
byte[] chunk = new byte[read];
System.arraycopy(buffer, 0, chunk, 0, read);
// 转为 Base64 避免特殊字符搞崩 JS
String base64Data = Base64.getEncoder().encodeToString(chunk);
// 调用前端 JS: writeToTerminal('Base64Str')
String js = "writeToTerminal('" + base64Data + "');";
SwingUtilities.invokeLater(() -> browser.executeJavaScript(js, "", 0));
}
} catch (Exception e) {
// 进程结束或流关闭
}
});
outputReaderThread.setDaemon(true);
outputReaderThread.start();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void stopPtyProcess() {
if (ptyProcess != null && ptyProcess.isAlive()) {
ptyProcess.destroy();
}
}
/**
* 检查WSL是否已安装
* @return 如果wsl.exe存在且能执行则返回true
*/
private static boolean isWslInstalled() {
try {
Process process = new ProcessBuilder("wsl", "--status").start();
int exitCode = process.waitFor();
return true;
} catch (IOException e) {
return false;
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return false;
}
}
/**
* 尝试以管理员权限启动一个进程来安装WSL
*/
private static void tryInstallWsl() {
String message = "您似乎没有安装WSL (Windows Subsystem for Linux)。\n" +
"WSL提供了更完整的Linux体验强烈建议您安装。\n\n" +
"是否现在尝试自动安装?\n" +
"(这将会弹出一个UAC窗口请求管理员权限)";
int choice = JOptionPane.showConfirmDialog(null, message, "安装WSL",
JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
if (choice == JOptionPane.YES_OPTION) {
try {
// 在Windows上使用 "runas" 谓词verb可以通过ShellExecute来请求提权。
// Java没有直接访问ShellExecute的方法但我们可以通过PowerShell的Start-Process命令来间接实现。
// Start-Process -Verb runAs 可以触发UAC弹窗。
String command = "powershell.exe -Command \"Start-Process wsl -ArgumentList '--install' -Verb runAs\"";
Runtime.getRuntime().exec(command);
} catch (IOException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null,
"启动安装程序失败,请尝试手动以管理员身份运行 'wsl --install'。",
"错误", JOptionPane.ERROR_MESSAGE);
}
}
}
/**
* 根据操作系统决定启动什么 Shell
*/
private static String[] determineShellCommand() {
String os = System.getProperty("os.name").toLowerCase();
if (os.contains("win")) {
// 1. 检查WSL是否安装
if (isWslInstalled()) {
System.out.println("检测到WSL将使用WSL。");
return new String[]{"wsl.exe"};
}
// 2. 如果没有安装,提示用户安装
System.out.println("未检测到WSL提示用户安装。");
// 在Swing线程中弹出对话框
SwingUtilities.invokeLater(TerminalManager::tryInstallWsl);
// 3. 无论用户是否选择安装本次都先回退到PowerShell避免阻塞程序
// 用户安装完毕并重启应用后下次启动就会自动使用WSL了。
System.out.println("本次将回退到PowerShell。");
return new String[]{"powershell.exe"};
} else {
// Mac / Linux
return new String[]{"/bin/bash", "-i"};
}
}
}

View File

@@ -3,6 +3,7 @@ package com.axis.innovators.box.register;
import com.axis.innovators.box.AxisInnovatorsBox;
import com.axis.innovators.box.tools.StateManager;
import com.axis.innovators.box.util.AdvancedJFileChooser;
import com.axis.innovators.box.window.LoadIcon;
import com.axis.innovators.box.window.MainWindow;
import com.axis.innovators.box.window.WindowsJDialog;
@@ -574,7 +575,7 @@ public class RegistrationSettingsItem extends WindowsJDialog {
JButton selectBgBtn = new JButton("选择图片");
selectBgBtn.setPreferredSize(new Dimension(100, 28));
selectBgBtn.addActionListener(e -> {
JFileChooser fileChooser = new JFileChooser();
AdvancedJFileChooser fileChooser = new AdvancedJFileChooser();
fileChooser.setFileFilter(new javax.swing.filechooser.FileNameExtensionFilter(
"图片文件 (*.jpg, *.jpeg, *.png, *.gif, *.bmp)", "jpg", "jpeg", "png", "gif", "bmp"));

View File

@@ -2,6 +2,9 @@ package com.axis.innovators.box.register;
import com.axis.innovators.box.AxisInnovatorsBox;
import com.axis.innovators.box.browser.MainApplication;
import com.axis.innovators.box.browser.util.TerminalManager;
import com.axis.innovators.box.util.build.BuildInformation;
import com.axis.innovators.box.util.build.BuildSystem;
import com.axis.innovators.box.window.FridaWindow;
import com.axis.innovators.box.window.JarApiProfilingWindow;
import com.axis.innovators.box.window.MainWindow;
@@ -33,6 +36,9 @@ public class RegistrationTool {
public RegistrationTool(AxisInnovatorsBox main) {
this.main = main;
int id = 0;
// 判断系统是否支持
if (BuildInformation.isMatchSystem(BuildSystem.WINDOWS)
|| BuildInformation.isMatchSystem(BuildSystem.UNKNOWN)) {
MainWindow.ToolCategory debugCategory = new MainWindow.ToolCategory("调试工具",
"debug/debug.png",
"用于调试指定Windows工具的一个分类");
@@ -92,6 +98,26 @@ public class RegistrationTool {
}
}));
programmingToolsCategory.addTool(new MainWindow.ToolItem("Linux终端工具", "programming/linux.png",
"用于启动一个Linux终端" +
"\n作者tzdwindows 7", ++id, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
TerminalManager.popupRealLinuxWindow();
}
}));
programmingToolsCategory.addTool(new MainWindow.ToolItem("MySql控制台", "programming/mysql.png",
"用于启动一个MySql控制台" +
"\n作者tzdwindows 7", ++id, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
MainApplication.popupSimulatingSQLWindow((JFrame) owner);
}
}));
MainWindow.ToolCategory aICategory = new MainWindow.ToolCategory("AI工具",
"ai/ai.png",
"人工智能/大语言模型");
@@ -136,7 +162,6 @@ public class RegistrationTool {
}));
MainWindow.ToolCategory systemCategory = new MainWindow.ToolCategory("系统工具",
"windows/windows.png",
"系统工具");
@@ -150,12 +175,33 @@ public class RegistrationTool {
}
}));
addToolCategory(debugCategory, "system:debugTools");
addToolCategory(aICategory,"system:fridaTools");
addToolCategory(programmingToolsCategory, "system:programmingTools");
addToolCategory(systemCategory, "system:systemTools");
addToolCategory(hahahah, "system:mc");
addSystemToolCategory(debugCategory, "debugTools");
addSystemToolCategory(aICategory, "fridaTools");
addSystemToolCategory(programmingToolsCategory, "programmingTools");
addSystemToolCategory(systemCategory, "systemTools");
addSystemToolCategory(hahahah, "mc");
}
}
/**
* 注册ToolCategory
* @param toolCategory ToolCategory
*/
private boolean addSystemToolCategory(MainWindow.ToolCategory toolCategory,
String registeredName) {
registeredName = "system:" + registeredName;
if (!main.isWindow()) {
if (registeredNameList.contains(registeredName)) {
throw new RegistrationError(registeredName + " duplicate registered names");
}
uuidList.add(toolCategory.getId());
registeredNameList.add(registeredName);
toolCategories.add(toolCategory);
return true;
} else {
logger.warn("Wrong time to add tools");
return false;
}
}
/**

View File

@@ -1,5 +1,8 @@
package com.axis.innovators.box.tools;
import com.axis.innovators.box.events.BrowserCreationCallback;
import com.axis.innovators.box.events.SubscribeEvent;
/**
* 在程序链接库文件中加载指定链接库
* @author tzdwindows 7

View File

@@ -1,67 +1,132 @@
package com.axis.innovators.box.util;
import com.axis.innovators.box.util.build.BuildInformation;
import com.axis.innovators.box.util.build.BuildSystem;
import com.axis.innovators.box.window.JarApiProfilingWindow;
import jnafilechooser.api.JnaFileChooser;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.InvalidPathException;
import java.util.prefs.Preferences;
/**
* 修改版:回归继承 JFileChooser以解决 boolean/int 类型不匹配问题。
* 通过内部代理的方式调用 Windows 原生组件。
*
* @author tzdwindows 7
*/
public class AdvancedJFileChooser extends JFileChooser {
private static final String PREF_KEY = "LAST_DIRECTORY";
private static final File FALLBACK_DIR = new File(System.getProperty("user.home"));
public AdvancedJFileChooser() {
super(loadValidDirectory());
setFileSelectionMode(FILES_AND_DIRECTORIES);
super();
// 初始化目录
File lastDir = loadValidDirectory();
if (lastDir != null) {
setCurrentDirectory(lastDir);
}
}
/**
* 重写核心方法 showDialog。
* 拦截调用,启动 Windows 原生选择器,并将结果转换回 int 返回。
*/
@Override
public int showDialog(Component parent, String approveButtonText) {
// 1. 仅在 Windows 下启用原生界面
if (BuildInformation.isMatchSystem(BuildSystem.WINDOWS)) {
JnaFileChooser fc = new JnaFileChooser();
// --- 关键:将 JFileChooser 的设置同步给 Native Chooser ---
// 2. 同步过滤器 (解决你遇到的过滤器不生效问题)
javax.swing.filechooser.FileFilter swingFilter = getFileFilter();
if (swingFilter instanceof FileNameExtensionFilter) {
FileNameExtensionFilter ext = (FileNameExtensionFilter) swingFilter;
fc.addFilter(ext.getDescription(), ext.getExtensions());
}
// 3. 同步标题
String title = getDialogTitle();
fc.setTitle((title != null && !title.isEmpty()) ? title : approveButtonText);
// 4. 同步当前目录
if (getCurrentDirectory() != null) {
fc.setCurrentDirectory(getCurrentDirectory().getAbsolutePath());
}
// 5. 设置模式 (文件/目录)
if (getFileSelectionMode() == DIRECTORIES_ONLY) fc.setMode(JnaFileChooser.Mode.Directories);
else fc.setMode(JnaFileChooser.Mode.Files); // 默认为文件
// 6. 显示原生窗口
Window window = getWindowForComponent(parent);
boolean result;
if (getDialogType() == SAVE_DIALOG) {
result = fc.showSaveDialog(window);
} else {
result = fc.showOpenDialog(window);
}
// 7. 处理结果并转换类型 (boolean -> int)
if (result) {
File selected = fc.getSelectedFile();
setSelectedFile(selected); // 回填文件,供 getSelectedFile() 调用
persistDirectory(selected);
return APPROVE_OPTION; // 返回 0
} else {
return CANCEL_OPTION; // 返回 1
}
}
return super.showDialog(parent, approveButtonText);
}
// --- 兼容性重写 ---
@Override
public int showOpenDialog(Component parent) {
setDialogType(OPEN_DIALOG);
return showDialog(parent, "Open");
}
@Override
public int showDialog(Component parent, String approveButtonText) {
int result = super.showDialog(parent, approveButtonText);
if (result == APPROVE_OPTION) {
persistDirectory(getSelectedPath());
}
return result;
public int showSaveDialog(Component parent) {
setDialogType(SAVE_DIALOG);
return showDialog(parent, "Save");
}
private String getSelectedPath() {
File selected = getSelectedFile();
return (selected != null && selected.isDirectory()) ?
selected.getAbsolutePath() :
getCurrentDirectory().getAbsolutePath();
// --- 辅助工具 ---
private Window getWindowForComponent(Component parent) {
if (parent == null) return null;
if (parent instanceof Window) return (Window) parent;
return SwingUtilities.getWindowAncestor(parent);
}
private static File loadValidDirectory() {
try {
Preferences prefs = Preferences.userNodeForPackage(JarApiProfilingWindow.class);
String path = prefs.get(PREF_KEY, FALLBACK_DIR.getAbsolutePath());
File dir = new File(path).getCanonicalFile();
return dir.isDirectory() && Files.isReadable(dir.toPath()) ?
dir :
FALLBACK_DIR;
} catch (IOException | InvalidPathException | SecurityException e) {
return FALLBACK_DIR;
String path = prefs.get(PREF_KEY, null);
if (path != null) {
File dir = new File(path);
if (dir.exists() && dir.isDirectory()) return dir;
}
} catch (Exception e) {}
return null;
}
private void persistDirectory(String path) {
private void persistDirectory(File file) {
if (file == null) return;
try {
File dir = new File(path).getCanonicalFile();
if (dir.isDirectory() && Files.isWritable(dir.toPath())) {
File dir = file.isDirectory() ? file : file.getParentFile();
if (dir != null && dir.exists()) {
Preferences prefs = Preferences.userNodeForPackage(JarApiProfilingWindow.class);
prefs.put(PREF_KEY, dir.getAbsolutePath());
}
} catch (IOException | InvalidPathException | SecurityException e) {
System.err.println("无法保存目录: " + e.getMessage());
}
} catch (Exception e) {}
}
}

View File

@@ -1,5 +1,7 @@
package com.axis.innovators.box.util;
import com.axis.innovators.box.util.build.BuildSystem;
import java.io.IOException;
/**

View File

@@ -4,6 +4,7 @@ import com.axis.innovators.box.AxisInnovatorsBox;
import com.axis.innovators.box.browser.MainApplication;
import com.axis.innovators.box.decompilation.gui.ModernJarViewer;
import com.axis.innovators.box.tools.RegisterTray;
import com.axis.innovators.box.util.build.BuildSystem;
import javax.swing.*;
import java.util.ArrayList;
@@ -35,8 +36,7 @@ public class Tray {
});
load(new TrayLabels("启动 Jar 查看器", () -> SwingUtilities.invokeLater(() -> {
ModernJarViewer viewer = new ModernJarViewer(null);
viewer.setVisible(true);
ModernJarViewer.popupSimulatingWindow(null,null);
})));
load(new TrayLabels("启动 HTML 查看器", new Runnable() {

Some files were not shown because too many files have changed in this diff Show More