fix:修复启用/禁用个人规则失效的bug
This commit is contained in:
@ -27,11 +27,15 @@ import {
|
|||||||
savePersonalRule,
|
savePersonalRule,
|
||||||
updatePersonalRule,
|
updatePersonalRule,
|
||||||
deletePersonalRule,
|
deletePersonalRule,
|
||||||
|
updatePersonalRulesEnabled,
|
||||||
} from "../../utils/personalRulesManager";
|
} from "../../utils/personalRulesManager";
|
||||||
import { compactDialog } from "../../services/apiClient";
|
import { compactDialog } from "../../services/apiClient";
|
||||||
import { ChatHistoryManager } from "../../utils/chatHistoryManager";
|
import { ChatHistoryManager } from "../../utils/chatHistoryManager";
|
||||||
import { getCachedUserInfo } from "../../services/userService";
|
import { getCachedUserInfo } from "../../services/userService";
|
||||||
import { loadConversationHistory, selectConversation } from "./conversationHelper";
|
import {
|
||||||
|
loadConversationHistory,
|
||||||
|
selectConversation,
|
||||||
|
} from "./conversationHelper";
|
||||||
import { getVCDFileInfo } from "./vcdHelper";
|
import { getVCDFileInfo } from "./vcdHelper";
|
||||||
import {
|
import {
|
||||||
handleAddContextFile,
|
handleAddContextFile,
|
||||||
@ -138,16 +142,16 @@ export async function handleWebviewMessage(
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case "loadConversationHistory":
|
case "loadConversationHistory":
|
||||||
loadConversationHistory(
|
loadConversationHistory(panel, message.offset || 0, message.limit || 10);
|
||||||
panel,
|
|
||||||
message.offset || 0,
|
|
||||||
message.limit || 10,
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "selectConversation":
|
case "selectConversation":
|
||||||
if (message.conversationId) {
|
if (message.conversationId) {
|
||||||
selectConversation(panel, message.conversationId, context.extensionPath);
|
selectConversation(
|
||||||
|
panel,
|
||||||
|
message.conversationId,
|
||||||
|
context.extensionPath,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -261,7 +265,9 @@ export async function handleWebviewMessage(
|
|||||||
verified: true,
|
verified: true,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
const { InvitationService } = require("../../services/invitationService");
|
const {
|
||||||
|
InvitationService,
|
||||||
|
} = require("../../services/invitationService");
|
||||||
const isVerified = await InvitationService.isVerified(context);
|
const isVerified = await InvitationService.isVerified(context);
|
||||||
panel.webview.postMessage({
|
panel.webview.postMessage({
|
||||||
command: "invitationCodeStatus",
|
command: "invitationCodeStatus",
|
||||||
@ -292,7 +298,9 @@ export async function handleWebviewMessage(
|
|||||||
|
|
||||||
case "checkTrialExpiration":
|
case "checkTrialExpiration":
|
||||||
{
|
{
|
||||||
const { TrialExpirationService } = require("../../services/trialExpirationService");
|
const {
|
||||||
|
TrialExpirationService,
|
||||||
|
} = require("../../services/trialExpirationService");
|
||||||
const trialService = new TrialExpirationService(context, panel);
|
const trialService = new TrialExpirationService(context, panel);
|
||||||
await trialService.checkExpiration();
|
await trialService.checkExpiration();
|
||||||
}
|
}
|
||||||
@ -300,7 +308,9 @@ export async function handleWebviewMessage(
|
|||||||
|
|
||||||
case "verifyInvitationCode":
|
case "verifyInvitationCode":
|
||||||
{
|
{
|
||||||
const { InvitationService } = require("../../services/invitationService");
|
const {
|
||||||
|
InvitationService,
|
||||||
|
} = require("../../services/invitationService");
|
||||||
const result = await InvitationService.verifyCode(message.code);
|
const result = await InvitationService.verifyCode(message.code);
|
||||||
|
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
@ -390,7 +400,7 @@ export async function handleWebviewMessage(
|
|||||||
case "openContextSettings":
|
case "openContextSettings":
|
||||||
panel.webview.postMessage({
|
panel.webview.postMessage({
|
||||||
command: "openSettingsTab",
|
command: "openSettingsTab",
|
||||||
tab: "context"
|
tab: "context",
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -401,7 +411,7 @@ export async function handleWebviewMessage(
|
|||||||
canSelectFolders: false,
|
canSelectFolders: false,
|
||||||
openLabel: "选择文件",
|
openLabel: "选择文件",
|
||||||
filters: {
|
filters: {
|
||||||
"支持的文件": ["md", "txt", "v", "sv", "pdf"],
|
支持的文件: ["md", "txt", "v", "sv", "pdf"],
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -557,6 +567,19 @@ export async function handleWebviewMessage(
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "updatePersonalRulesEnabled":
|
||||||
|
{
|
||||||
|
const success = await updatePersonalRulesEnabled(message.enabled);
|
||||||
|
if (success) {
|
||||||
|
const data = loadPersonalRules();
|
||||||
|
panel.webview.postMessage({
|
||||||
|
command: "personalRulesLoaded",
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case "loadDocumentSets":
|
case "loadDocumentSets":
|
||||||
const { getDocumentSets } = await import("./contextHelper");
|
const { getDocumentSets } = await import("./contextHelper");
|
||||||
panel.webview.postMessage({
|
panel.webview.postMessage({
|
||||||
|
|||||||
@ -5,16 +5,16 @@
|
|||||||
* 使用场景:保存和加载用户的个人规则
|
* 使用场景:保存和加载用户的个人规则
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import * as vscode from 'vscode';
|
import * as vscode from "vscode";
|
||||||
import * as fs from 'fs';
|
import * as fs from "fs";
|
||||||
import * as path from 'path';
|
import * as path from "path";
|
||||||
import * as os from 'os';
|
import * as os from "os";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取规则目录路径
|
* 获取规则目录路径
|
||||||
*/
|
*/
|
||||||
function getRulesDir(): string {
|
function getRulesDir(): string {
|
||||||
return path.join(os.homedir(), '.iccoder', 'rules');
|
return path.join(os.homedir(), ".iccoder", "rules");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -31,18 +31,22 @@ function ensureRulesDir(): void {
|
|||||||
* 从文件内容中提取规则名称
|
* 从文件内容中提取规则名称
|
||||||
*/
|
*/
|
||||||
function extractRuleName(content: string): string {
|
function extractRuleName(content: string): string {
|
||||||
const lines = content.split('\n');
|
const lines = content.split("\n");
|
||||||
const firstLine = lines[0]?.trim();
|
const firstLine = lines[0]?.trim();
|
||||||
if (firstLine && firstLine.startsWith('# ')) {
|
if (firstLine && firstLine.startsWith("# ")) {
|
||||||
return firstLine.substring(2).trim();
|
return firstLine.substring(2).trim();
|
||||||
}
|
}
|
||||||
return content.substring(0, 30) + (content.length > 30 ? '...' : '');
|
return content.substring(0, 30) + (content.length > 30 ? "..." : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 保存新规则
|
* 保存新规则
|
||||||
*/
|
*/
|
||||||
export async function savePersonalRule(name: string, content: string, enabled: boolean): Promise<boolean> {
|
export async function savePersonalRule(
|
||||||
|
name: string,
|
||||||
|
content: string,
|
||||||
|
enabled: boolean,
|
||||||
|
): Promise<boolean> {
|
||||||
try {
|
try {
|
||||||
ensureRulesDir();
|
ensureRulesDir();
|
||||||
|
|
||||||
@ -51,11 +55,17 @@ export async function savePersonalRule(name: string, content: string, enabled: b
|
|||||||
const filePath = path.join(getRulesDir(), filename);
|
const filePath = path.join(getRulesDir(), filename);
|
||||||
|
|
||||||
const fileContent = `# ${name}\n\n${content}`;
|
const fileContent = `# ${name}\n\n${content}`;
|
||||||
fs.writeFileSync(filePath, fileContent, 'utf-8');
|
fs.writeFileSync(filePath, fileContent, "utf-8");
|
||||||
|
|
||||||
await vscode.workspace.getConfiguration('ic-coder').update('personalRulesEnabled', enabled, vscode.ConfigurationTarget.Global);
|
await vscode.workspace
|
||||||
|
.getConfiguration("ic-coder")
|
||||||
|
.update(
|
||||||
|
"personalRulesEnabled",
|
||||||
|
enabled,
|
||||||
|
vscode.ConfigurationTarget.Global,
|
||||||
|
);
|
||||||
|
|
||||||
vscode.window.showInformationMessage('规则已保存');
|
vscode.window.showInformationMessage("规则已保存");
|
||||||
return true;
|
return true;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
vscode.window.showErrorMessage(`保存规则失败: ${error}`);
|
vscode.window.showErrorMessage(`保存规则失败: ${error}`);
|
||||||
@ -66,15 +76,26 @@ export async function savePersonalRule(name: string, content: string, enabled: b
|
|||||||
/**
|
/**
|
||||||
* 更新规则
|
* 更新规则
|
||||||
*/
|
*/
|
||||||
export async function updatePersonalRule(filename: string, name: string, content: string, enabled: boolean): Promise<boolean> {
|
export async function updatePersonalRule(
|
||||||
|
filename: string,
|
||||||
|
name: string,
|
||||||
|
content: string,
|
||||||
|
enabled: boolean,
|
||||||
|
): Promise<boolean> {
|
||||||
try {
|
try {
|
||||||
const filePath = path.join(getRulesDir(), filename);
|
const filePath = path.join(getRulesDir(), filename);
|
||||||
const fileContent = `# ${name}\n\n${content}`;
|
const fileContent = `# ${name}\n\n${content}`;
|
||||||
fs.writeFileSync(filePath, fileContent, 'utf-8');
|
fs.writeFileSync(filePath, fileContent, "utf-8");
|
||||||
|
|
||||||
await vscode.workspace.getConfiguration('ic-coder').update('personalRulesEnabled', enabled, vscode.ConfigurationTarget.Global);
|
await vscode.workspace
|
||||||
|
.getConfiguration("ic-coder")
|
||||||
|
.update(
|
||||||
|
"personalRulesEnabled",
|
||||||
|
enabled,
|
||||||
|
vscode.ConfigurationTarget.Global,
|
||||||
|
);
|
||||||
|
|
||||||
vscode.window.showInformationMessage('规则已更新');
|
vscode.window.showInformationMessage("规则已更新");
|
||||||
return true;
|
return true;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
vscode.window.showErrorMessage(`更新规则失败: ${error}`);
|
vscode.window.showErrorMessage(`更新规则失败: ${error}`);
|
||||||
@ -90,7 +111,7 @@ export async function deletePersonalRule(filename: string): Promise<boolean> {
|
|||||||
const filePath = path.join(getRulesDir(), filename);
|
const filePath = path.join(getRulesDir(), filename);
|
||||||
if (fs.existsSync(filePath)) {
|
if (fs.existsSync(filePath)) {
|
||||||
fs.unlinkSync(filePath);
|
fs.unlinkSync(filePath);
|
||||||
vscode.window.showInformationMessage('规则已删除');
|
vscode.window.showInformationMessage("规则已删除");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -103,8 +124,13 @@ export async function deletePersonalRule(filename: string): Promise<boolean> {
|
|||||||
/**
|
/**
|
||||||
* 加载所有规则
|
* 加载所有规则
|
||||||
*/
|
*/
|
||||||
export function loadPersonalRules(): { rules: Array<{ filename: string; name: string; content: string }>; enabled: boolean } {
|
export function loadPersonalRules(): {
|
||||||
const enabled = vscode.workspace.getConfiguration('ic-coder').get<boolean>('personalRulesEnabled', true);
|
rules: Array<{ filename: string; name: string; content: string }>;
|
||||||
|
enabled: boolean;
|
||||||
|
} {
|
||||||
|
const enabled = vscode.workspace
|
||||||
|
.getConfiguration("ic-coder")
|
||||||
|
.get<boolean>("personalRulesEnabled", true);
|
||||||
const dir = getRulesDir();
|
const dir = getRulesDir();
|
||||||
|
|
||||||
if (!fs.existsSync(dir)) {
|
if (!fs.existsSync(dir)) {
|
||||||
@ -112,16 +138,16 @@ export function loadPersonalRules(): { rules: Array<{ filename: string; name: st
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const files = fs.readdirSync(dir).filter(f => f.endsWith('.md'));
|
const files = fs.readdirSync(dir).filter((f) => f.endsWith(".md"));
|
||||||
const rules = files.map(filename => {
|
const rules = files.map((filename) => {
|
||||||
const content = fs.readFileSync(path.join(dir, filename), 'utf-8');
|
const content = fs.readFileSync(path.join(dir, filename), "utf-8");
|
||||||
const lines = content.split('\n');
|
const lines = content.split("\n");
|
||||||
let name = '';
|
let name = "";
|
||||||
let actualContent = content;
|
let actualContent = content;
|
||||||
|
|
||||||
if (lines[0]?.trim().startsWith('# ')) {
|
if (lines[0]?.trim().startsWith("# ")) {
|
||||||
name = lines[0].substring(2).trim();
|
name = lines[0].substring(2).trim();
|
||||||
actualContent = lines.slice(2).join('\n').trim();
|
actualContent = lines.slice(2).join("\n").trim();
|
||||||
} else {
|
} else {
|
||||||
name = extractRuleName(content);
|
name = extractRuleName(content);
|
||||||
}
|
}
|
||||||
@ -130,11 +156,32 @@ export function loadPersonalRules(): { rules: Array<{ filename: string; name: st
|
|||||||
});
|
});
|
||||||
return { rules, enabled };
|
return { rules, enabled };
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('读取规则失败:', error);
|
console.error("读取规则失败:", error);
|
||||||
return { rules: [], enabled };
|
return { rules: [], enabled };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新个人规则启用状态
|
||||||
|
*/
|
||||||
|
export async function updatePersonalRulesEnabled(
|
||||||
|
enabled: boolean,
|
||||||
|
): Promise<boolean> {
|
||||||
|
try {
|
||||||
|
await vscode.workspace
|
||||||
|
.getConfiguration("ic-coder")
|
||||||
|
.update(
|
||||||
|
"personalRulesEnabled",
|
||||||
|
enabled,
|
||||||
|
vscode.ConfigurationTarget.Global,
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
} catch (error) {
|
||||||
|
console.error("更新规则启用状态失败:", error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前生效的所有规则内容
|
* 获取当前生效的所有规则内容
|
||||||
*/
|
*/
|
||||||
@ -143,5 +190,5 @@ export function getActiveRules(): string | null {
|
|||||||
if (!enabled || rules.length === 0) {
|
if (!enabled || rules.length === 0) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return rules.map(r => r.content).join('\n\n');
|
return rules.map((r) => r.content).join("\n\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -400,6 +400,12 @@ export function getRulesSettingsComponentScript(): string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//监听启用个人规则开关变化
|
||||||
|
document.getElementById('enablePersonalRulesCheckbox').addEventListener('change', function() {
|
||||||
|
const enabled = this.checked;
|
||||||
|
vscode.postMessage({ command: 'updatePersonalRulesEnabled', enabled: enabled });
|
||||||
|
});
|
||||||
|
|
||||||
// 页面加载时请求规则数据
|
// 页面加载时请求规则数据
|
||||||
vscode.postMessage({ command: 'loadPersonalRules' });
|
vscode.postMessage({ command: 'loadPersonalRules' });
|
||||||
`;
|
`;
|
||||||
|
|||||||
Reference in New Issue
Block a user