152 lines
4.3 KiB
TypeScript
152 lines
4.3 KiB
TypeScript
import { createApp } from 'vue';
|
||
import App from './App.vue';
|
||
import { createPinia } from 'pinia';
|
||
import router from './router';
|
||
import Antd from 'ant-design-vue';
|
||
import { Bubble, Sender, Conversations, ThoughtChain, Prompts } from 'ant-design-x-vue';
|
||
import 'ant-design-vue/dist/reset.css';
|
||
import './styles/global.scss';
|
||
import './styles/antdx-override.scss';
|
||
|
||
// 设置全局VSCode API
|
||
declare global {
|
||
interface Window {
|
||
vscodeApi: any;
|
||
__VSCODE_API_INITIALIZED__: boolean;
|
||
}
|
||
}
|
||
|
||
// VSCode API初始化 - 必须在全局范围获取一次
|
||
console.log('main.ts: 初始化VSCode API');
|
||
let vscodeGlobal = window.vscodeApi; // 直接使用window.vscodeApi,它已经由ChatViewProvider初始化
|
||
|
||
// 记录API状态
|
||
if (vscodeGlobal) {
|
||
console.log('main.ts: VSCode API已由扩展初始化,直接使用');
|
||
|
||
// 发送初始化成功消息到VSCode
|
||
vscodeGlobal.postMessage({
|
||
type: 'log',
|
||
message: '[主程序] VSCode API初始化成功,WebView已加载完成'
|
||
});
|
||
|
||
window.__VSCODE_API_INITIALIZED__ = true;
|
||
} else {
|
||
console.warn('main.ts: VSCode API未在window中找到');
|
||
window.__VSCODE_API_INITIALIZED__ = false;
|
||
|
||
// 尝试获取VSCode API
|
||
try {
|
||
if (typeof acquireVsCodeApi === 'function') {
|
||
window.vscodeApi = acquireVsCodeApi();
|
||
console.log('main.ts: 成功通过acquireVsCodeApi()获取VSCode API');
|
||
|
||
// 发送到VSCode
|
||
window.vscodeApi.postMessage({
|
||
type: 'log',
|
||
message: '[主程序] 通过acquireVsCodeApi()成功获取VSCode API'
|
||
});
|
||
|
||
window.__VSCODE_API_INITIALIZED__ = true;
|
||
} else {
|
||
console.error('main.ts: acquireVsCodeApi不是函数');
|
||
}
|
||
} catch (err) {
|
||
console.error('main.ts: 获取VSCode API失败', err);
|
||
}
|
||
|
||
// 处理情况:如果在dev环境中,提供一个虚拟的VSCode API
|
||
// 警告:这只用于开发,不应该在生产环境使用
|
||
if (process.env.NODE_ENV === 'development') {
|
||
console.log('main.ts: 创建开发环境下的模拟VSCode API');
|
||
window.vscodeApi = {
|
||
postMessage: (msg: any) => {
|
||
console.log('DEV模式: 模拟VSCode消息', msg);
|
||
|
||
// 模拟VSCode响应
|
||
if (msg.type === 'getSettings') {
|
||
setTimeout(() => {
|
||
window.dispatchEvent(new MessageEvent('message', {
|
||
data: {
|
||
type: 'settings',
|
||
settings: {
|
||
apiHost: 'ws://localhost:8080',
|
||
apiKey: 'dev_api_key'
|
||
}
|
||
}
|
||
}));
|
||
}, 100);
|
||
} else if (msg.type === 'saveSettings') {
|
||
setTimeout(() => {
|
||
window.dispatchEvent(new MessageEvent('message', {
|
||
data: {
|
||
type: 'settingsSaved',
|
||
success: true
|
||
}
|
||
}));
|
||
}, 100);
|
||
}
|
||
}
|
||
};
|
||
console.log('main.ts: 已创建模拟VSCode API');
|
||
}
|
||
}
|
||
|
||
// 每5秒检查一次VSCode API状态并通知VSCode(仅前3次)
|
||
let checkCount = 0;
|
||
const apiCheckInterval = setInterval(() => {
|
||
const isAvailable = !!window.vscodeApi;
|
||
console.log('VSCode API状态:', isAvailable ? '可用' : '不可用');
|
||
|
||
if (isAvailable && window.vscodeApi) {
|
||
window.vscodeApi.postMessage({
|
||
type: 'log',
|
||
message: `[主程序] VSCode API状态检查 #${checkCount+1}: 可用`
|
||
});
|
||
}
|
||
|
||
checkCount++;
|
||
if (checkCount >= 3) {
|
||
clearInterval(apiCheckInterval);
|
||
}
|
||
}, 5000);
|
||
|
||
// 创建Vue应用
|
||
const app = createApp(App);
|
||
|
||
// 添加favicon以防止404错误
|
||
const link = document.createElement('link');
|
||
link.rel = 'icon';
|
||
link.href = 'data:,'; // 空数据URL,不加载任何图标
|
||
document.head.appendChild(link);
|
||
|
||
// 注册Pinia状态管理
|
||
app.use(createPinia());
|
||
|
||
// 注册Ant Design Vue
|
||
app.use(Antd);
|
||
|
||
// 注册Ant Design X Vue组件
|
||
app.component('a-x-bubble', Bubble);
|
||
app.component('a-x-sender', Sender);
|
||
app.component('a-x-conversations', Conversations);
|
||
app.component('a-x-thought-chain', ThoughtChain);
|
||
app.component('a-x-prompts', Prompts);
|
||
|
||
// 注册路由
|
||
app.use(router);
|
||
|
||
// 错误处理
|
||
app.config.errorHandler = (err, instance, info) => {
|
||
console.error('Vue Error:', err, info);
|
||
if (window.vscodeApi) {
|
||
window.vscodeApi.postMessage({
|
||
type: 'error',
|
||
message: err instanceof Error ? err.message : String(err),
|
||
info: info
|
||
});
|
||
}
|
||
};
|
||
|
||
// 挂载应用
|
||
app.mount('#app');
|