@dahawa/hawa-cli-analysis 1.0.7 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.tools.json +6 -6
- package/.vscode/launch.json +26 -26
- package/_uclaude.js +0 -0
- package/anthropic-transformer.js +986 -986
- package/api-anthropic.js +279 -279
- package/api-openai.js +538 -538
- package/clogger-openai.js +190 -190
- package/clogger.js +318 -318
- package/codex/mcp-client.js +556 -556
- package/codex/mcpclient.js +117 -117
- package/codex/mcpserver.js +374 -374
- package/codex/mcpserverproxy.js +143 -143
- package/codex/test.js +30 -30
- package/mcp/claude-mcpproxy-launcher.js +4 -4
- package/package.json +2 -1
- package/simple-transform-example.js +212 -212
- package/tests/test-lazy-load.js +35 -35
- package/tests/test_mcp_proxy.js +50 -50
- package/tests/test_supabase_mcp.js +41 -41
- package/uclaude.js +3 -3
- package/ucodex-proxy.js +172 -172
- package/ucodex.js +127 -127
package/ucodex.js
CHANGED
|
@@ -1,129 +1,129 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import TOML from '@iarna/toml';
|
|
4
|
-
import path from "path";
|
|
5
|
-
import { fileURLToPath, pathToFileURL } from "url";
|
|
6
|
-
import os from 'os';
|
|
7
|
-
import fs from "fs";
|
|
8
|
-
import { spawn } from 'child_process';
|
|
9
|
-
import {getCodexPath} from './untils.js';
|
|
10
|
-
import {startMCPServerProxy} from "./codex/mcpserver.js"
|
|
11
|
-
import LogManager from "./logger-manager.js";
|
|
12
|
-
const logger = LogManager.getSystemLogger();
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* codex 是 rust 开发,只能使用代理模式进行日志获取
|
|
17
|
-
*/
|
|
18
|
-
const startServer = async () => {
|
|
19
|
-
let tomlPath = path.join(os.homedir(), ".codex", "config.toml");
|
|
20
|
-
const tomlString = fs.readFileSync(tomlPath, 'utf-8');
|
|
21
|
-
const config = TOML.parse(tomlString);
|
|
22
|
-
let env = {};
|
|
23
|
-
//是否配置了三方模型
|
|
24
|
-
if(config.model_provider){
|
|
25
|
-
let base_url = config["model_providers"][config.model_provider]["base_url"];
|
|
26
|
-
let wire_api = config["model_providers"][config.model_provider]["wire_api"]? config["model_providers"][config.model_provider]["wire_api"]:"chat"
|
|
27
|
-
env = {
|
|
28
|
-
base_url,
|
|
29
|
-
wire_api
|
|
30
|
-
}
|
|
31
|
-
}else{
|
|
32
|
-
env = {
|
|
33
|
-
//默认访问只能是 这个地址
|
|
34
|
-
base_url:"https://chatgpt.com/backend-api/codex",
|
|
35
|
-
wire_api:"responses"
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
let dir = path.dirname(fileURLToPath(import.meta.url));
|
|
40
|
-
const child = spawn('node ' + path.join(dir, 'ucodex-proxy.js'), [],{
|
|
41
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
42
|
-
shell: true,
|
|
43
|
-
env:{
|
|
44
|
-
...process.env,
|
|
45
|
-
...env
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
// 监听标准输出
|
|
50
|
-
child.stdout.on('data', (data) => {
|
|
51
|
-
//console.log(`子进程 stdout: ${data}`);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
// 监听错误输出
|
|
55
|
-
child.stderr.on('data', (data) => {
|
|
56
|
-
logger.error(`子进程 stderr: ${data}`);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
child.on('close', (code) => {
|
|
60
|
-
logger.debug(`codex 退出,退出码: ${code}`);
|
|
61
|
-
});
|
|
62
|
-
};
|
|
63
|
-
/**
|
|
64
|
-
* 启动 codex cli
|
|
65
|
-
**/
|
|
66
|
-
function startCodexcli(){
|
|
67
|
-
// 设置 base url 的方式
|
|
68
|
-
let env = {};
|
|
69
|
-
let configCmd = [];
|
|
70
|
-
|
|
71
|
-
let tomlPath = path.join(os.homedir(), ".codex", "config.toml");
|
|
72
|
-
const tomlString = fs.readFileSync(tomlPath, 'utf-8');
|
|
73
|
-
const config = TOML.parse(tomlString);
|
|
74
|
-
//是否配置了三方模型
|
|
75
|
-
if(config.model_provider){
|
|
76
|
-
let base_url = config["model_providers"][config.model_provider]["base_url"];
|
|
77
|
-
let wire_api = config["model_providers"][config.model_provider]["wire_api"]? config["model_providers"][config.model_provider]["wire_api"]:"chat"
|
|
78
|
-
configCmd = ["--config", "model_providers." + config.model_provider+".base_url="+"http://127.0.0.1:3000"];
|
|
79
|
-
|
|
80
|
-
}else{
|
|
81
|
-
env = {
|
|
82
|
-
"OPENAI_BASE_URL":"http://127.0.0.1:3000",
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const child = spawn("node "+getCodexPath(), configCmd,{
|
|
87
|
-
stdio: 'inherit', // 继承父进程 stdio,方便交互
|
|
88
|
-
shell: true,
|
|
89
|
-
env:{
|
|
90
|
-
...process.env,
|
|
91
|
-
...env
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
child.on('close', (code) => {
|
|
97
|
-
logger.debug(`codex 退出,退出码: ${code}`);
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
function startMCPServerProxy(){
|
|
103
|
-
let dir = path.dirname(fileURLToPath(import.meta.url));
|
|
104
|
-
// 启动 MCP 代理服务
|
|
105
|
-
const child = spawn("node " + (path.join(dir, "mcp" ,'claude-mcpproxy-launcher.js')), [], {
|
|
106
|
-
stdio: 'inherit',
|
|
107
|
-
shell: true,
|
|
108
|
-
env: {
|
|
109
|
-
// PIPE_PATH_PRE: process.pid
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
child.on("error", (error) => {
|
|
114
|
-
console.error("Failed to start MCP server proxy:", error.message);
|
|
115
|
-
process.exit(1);
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
child.on("close", (code) => {
|
|
119
|
-
process.exit(code || 0);
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
*/
|
|
123
|
-
|
|
124
|
-
function main(){
|
|
125
|
-
startServer();
|
|
126
|
-
startMCPServerProxy()
|
|
127
|
-
startCodexcli();
|
|
128
|
-
}
|
|
2
|
+
|
|
3
|
+
import TOML from '@iarna/toml';
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { fileURLToPath, pathToFileURL } from "url";
|
|
6
|
+
import os from 'os';
|
|
7
|
+
import fs from "fs";
|
|
8
|
+
import { spawn } from 'child_process';
|
|
9
|
+
import {getCodexPath} from './untils.js';
|
|
10
|
+
import {startMCPServerProxy} from "./codex/mcpserver.js"
|
|
11
|
+
import LogManager from "./logger-manager.js";
|
|
12
|
+
const logger = LogManager.getSystemLogger();
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* codex 是 rust 开发,只能使用代理模式进行日志获取
|
|
17
|
+
*/
|
|
18
|
+
const startServer = async () => {
|
|
19
|
+
let tomlPath = path.join(os.homedir(), ".codex", "config.toml");
|
|
20
|
+
const tomlString = fs.readFileSync(tomlPath, 'utf-8');
|
|
21
|
+
const config = TOML.parse(tomlString);
|
|
22
|
+
let env = {};
|
|
23
|
+
//是否配置了三方模型
|
|
24
|
+
if(config.model_provider){
|
|
25
|
+
let base_url = config["model_providers"][config.model_provider]["base_url"];
|
|
26
|
+
let wire_api = config["model_providers"][config.model_provider]["wire_api"]? config["model_providers"][config.model_provider]["wire_api"]:"chat"
|
|
27
|
+
env = {
|
|
28
|
+
base_url,
|
|
29
|
+
wire_api
|
|
30
|
+
}
|
|
31
|
+
}else{
|
|
32
|
+
env = {
|
|
33
|
+
//默认访问只能是 这个地址
|
|
34
|
+
base_url:"https://chatgpt.com/backend-api/codex",
|
|
35
|
+
wire_api:"responses"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
let dir = path.dirname(fileURLToPath(import.meta.url));
|
|
40
|
+
const child = spawn('node ' + path.join(dir, 'ucodex-proxy.js'), [],{
|
|
41
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
42
|
+
shell: true,
|
|
43
|
+
env:{
|
|
44
|
+
...process.env,
|
|
45
|
+
...env
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// 监听标准输出
|
|
50
|
+
child.stdout.on('data', (data) => {
|
|
51
|
+
//console.log(`子进程 stdout: ${data}`);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// 监听错误输出
|
|
55
|
+
child.stderr.on('data', (data) => {
|
|
56
|
+
logger.error(`子进程 stderr: ${data}`);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
child.on('close', (code) => {
|
|
60
|
+
logger.debug(`codex 退出,退出码: ${code}`);
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* 启动 codex cli
|
|
65
|
+
**/
|
|
66
|
+
function startCodexcli(){
|
|
67
|
+
// 设置 base url 的方式
|
|
68
|
+
let env = {};
|
|
69
|
+
let configCmd = [];
|
|
70
|
+
|
|
71
|
+
let tomlPath = path.join(os.homedir(), ".codex", "config.toml");
|
|
72
|
+
const tomlString = fs.readFileSync(tomlPath, 'utf-8');
|
|
73
|
+
const config = TOML.parse(tomlString);
|
|
74
|
+
//是否配置了三方模型
|
|
75
|
+
if(config.model_provider){
|
|
76
|
+
let base_url = config["model_providers"][config.model_provider]["base_url"];
|
|
77
|
+
let wire_api = config["model_providers"][config.model_provider]["wire_api"]? config["model_providers"][config.model_provider]["wire_api"]:"chat"
|
|
78
|
+
configCmd = ["--config", "model_providers." + config.model_provider+".base_url="+"http://127.0.0.1:3000"];
|
|
79
|
+
|
|
80
|
+
}else{
|
|
81
|
+
env = {
|
|
82
|
+
"OPENAI_BASE_URL":"http://127.0.0.1:3000",
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const child = spawn("node "+getCodexPath(), configCmd,{
|
|
87
|
+
stdio: 'inherit', // 继承父进程 stdio,方便交互
|
|
88
|
+
shell: true,
|
|
89
|
+
env:{
|
|
90
|
+
...process.env,
|
|
91
|
+
...env
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
child.on('close', (code) => {
|
|
97
|
+
logger.debug(`codex 退出,退出码: ${code}`);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
function startMCPServerProxy(){
|
|
103
|
+
let dir = path.dirname(fileURLToPath(import.meta.url));
|
|
104
|
+
// 启动 MCP 代理服务
|
|
105
|
+
const child = spawn("node " + (path.join(dir, "mcp" ,'claude-mcpproxy-launcher.js')), [], {
|
|
106
|
+
stdio: 'inherit',
|
|
107
|
+
shell: true,
|
|
108
|
+
env: {
|
|
109
|
+
// PIPE_PATH_PRE: process.pid
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
child.on("error", (error) => {
|
|
114
|
+
console.error("Failed to start MCP server proxy:", error.message);
|
|
115
|
+
process.exit(1);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
child.on("close", (code) => {
|
|
119
|
+
process.exit(code || 0);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
*/
|
|
123
|
+
|
|
124
|
+
function main(){
|
|
125
|
+
startServer();
|
|
126
|
+
startMCPServerProxy()
|
|
127
|
+
startCodexcli();
|
|
128
|
+
}
|
|
129
129
|
main();
|