* feat: add code tools * feat(CodeToolsService): add CLI executable management and installation check - Introduced methods to determine the CLI executable name based on the tool. - Added functionality to check if a package is installed and create the necessary bin directory if it doesn't exist. - Enhanced the run method to handle installation and execution of CLI tools based on their installation status. - Updated terminal command handling for different operating systems with improved comments and error messages. * feat(ipService): implement IP address country detection and npm registry URL selection - Added a new module for IP address country detection using the ipinfo.io API. - Implemented functions to check if the user is in China and to return the appropriate npm registry URL based on the user's location. - Updated AppUpdater and CodeToolsService to utilize the new ipService functions for improved user experience based on geographical location. - Enhanced error handling and logging for better debugging and user feedback. * feat: remember cli model * feat(CodeToolsService): update options for auto-update functionality - Refactored the options parameter in CodeToolsService to replace checkUpdate and forceUpdate with autoUpdateToLatest. - Updated logic to handle automatic updates when the CLI tool is already installed. - Modified related UI components to reflect the new auto-update option. - Added corresponding translations for the new feature in multiple languages. * feat(CodeToolsService): enhance CLI tool launch with debugging support - Added detailed logging for CLI tool launch process, including environment variables and options. - Implemented a temporary batch file for Windows to facilitate debugging and command execution. - Improved error handling and cleanup for the temporary batch file after execution. - Updated terminal command handling to use the new batch file for safer execution. * refactor(CodeToolsService): simplify command execution output - Removed display of environment variable settings during command execution in the CLI tool. - Updated comments for clarity on the command execution process. * feat(CodePage): add model filtering logic for provider selection - Introduced a modelPredicate function to filter out embedding, rerank, and text-to-image models from the available providers. - Updated the ModelSelector component to utilize the new predicate for improved model selection experience. * refactor(CodeToolsService): improve logging and cleanup for CLI tool execution - Updated logging to display only the keys of environment variables during CLI tool launch for better clarity. - Introduced a variable to store the path of the temporary batch file for Windows. - Enhanced cleanup logic to remove the temporary batch file after execution, improving resource management. * feat(Router): replace CodePage with CodeToolsPage and add new page for code tools - Updated Router to import and route to the new CodeToolsPage instead of the old CodePage. - Introduced CodeToolsPage component, which provides a user interface for selecting CLI tools and models, managing directories, and launching code tools with enhanced functionality. * refactor(CodeToolsService): improve temporary file management and cleanup - Removed unused variable for Windows batch file path. - Added a cleanup task to delete the temporary batch file after 10 seconds to enhance resource management. - Updated logging to ensure clarity during the execution of CLI tools. * refactor(CodeToolsService): streamline environment variable handling for CLI tool execution - Introduced a utility function to remove proxy-related environment variables before launching terminal processes. - Updated logging to display only the relevant environment variable keys, enhancing clarity during execution. * refactor(MCPService, CodeToolsService): unify proxy environment variable handling - Replaced custom proxy removal logic with a shared utility function `removeEnvProxy` to streamline environment variable management across services. - Updated logging to reflect changes in environment variable handling during CLI tool execution.
89 lines
2.2 KiB
JavaScript
89 lines
2.2 KiB
JavaScript
const https = require('https')
|
||
const { loggerService } = require('@logger')
|
||
|
||
const logger = loggerService.withContext('IpService')
|
||
|
||
/**
|
||
* 获取用户的IP地址所在国家
|
||
* @returns {Promise<string>} 返回国家代码,默认为'CN'
|
||
*/
|
||
async function getIpCountry() {
|
||
return new Promise((resolve) => {
|
||
// 添加超时控制
|
||
const timeout = setTimeout(() => {
|
||
logger.info('IP Address Check Timeout, default to China Mirror')
|
||
resolve('CN')
|
||
}, 5000)
|
||
|
||
const options = {
|
||
hostname: 'ipinfo.io',
|
||
path: '/json',
|
||
method: 'GET',
|
||
headers: {
|
||
'User-Agent':
|
||
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
|
||
'Accept-Language': 'en-US,en;q=0.9'
|
||
}
|
||
}
|
||
|
||
const req = https.request(options, (res) => {
|
||
clearTimeout(timeout)
|
||
let data = ''
|
||
|
||
res.on('data', (chunk) => {
|
||
data += chunk
|
||
})
|
||
|
||
res.on('end', () => {
|
||
try {
|
||
const parsed = JSON.parse(data)
|
||
const country = parsed.country || 'CN'
|
||
logger.info(`Detected user IP address country: ${country}`)
|
||
resolve(country)
|
||
} catch (error) {
|
||
logger.error('Failed to parse IP address information:', error.message)
|
||
resolve('CN')
|
||
}
|
||
})
|
||
})
|
||
|
||
req.on('error', (error) => {
|
||
clearTimeout(timeout)
|
||
logger.error('Failed to get IP address information:', error.message)
|
||
resolve('CN')
|
||
})
|
||
|
||
req.end()
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 检查用户是否在中国
|
||
* @returns {Promise<boolean>} 如果用户在中国返回true,否则返回false
|
||
*/
|
||
async function isUserInChina() {
|
||
const country = await getIpCountry()
|
||
return country.toLowerCase() === 'cn'
|
||
}
|
||
|
||
/**
|
||
* 根据用户位置获取适合的npm镜像URL
|
||
* @returns {Promise<string>} 返回npm镜像URL
|
||
*/
|
||
async function getNpmRegistryUrl() {
|
||
const inChina = await isUserInChina()
|
||
if (inChina) {
|
||
logger.info('User in China, using Taobao npm mirror')
|
||
return 'https://registry.npmmirror.com'
|
||
} else {
|
||
logger.info('User not in China, using default npm mirror')
|
||
return 'https://registry.npmjs.org'
|
||
}
|
||
}
|
||
|
||
module.exports = {
|
||
getIpCountry,
|
||
isUserInChina,
|
||
getNpmRegistryUrl
|
||
}
|