diff --git a/eslint.config.mjs b/eslint.config.mjs index 0f7fb55..d8270b3 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -81,6 +81,7 @@ export default tseslint.config( menuMemoryCheck: "writable", menuProvider: "writable", menuReload: "writable", + menuReloadSkills: "writable", menuSessions: "writable", menuSettings: "writable", menuSkills: "writable", diff --git a/media/dom.js b/media/dom.js index b07ba02..7753e11 100644 --- a/media/dom.js +++ b/media/dom.js @@ -34,6 +34,7 @@ const menuDelegationCheck = document.getElementById("menu-delegation-check"); const menuMemory = document.getElementById("menu-memory"); const menuMemoryCheck = document.getElementById("menu-memory-check"); const menuMcp = document.getElementById("menu-mcp"); +const menuReloadSkills = document.getElementById("menu-reload-skills"); const menuReload = document.getElementById("menu-reload"); const menuSettings = document.getElementById("menu-settings"); const statusDot = document.getElementById("status-dot"); diff --git a/media/menu.js b/media/menu.js index dfd1fe0..9e8cdb8 100644 --- a/media/menu.js +++ b/media/menu.js @@ -25,6 +25,7 @@ onMenuClick(menuSkills, () => vscode.postMessage({ type: "toggleSkills", next: ! onMenuClick(menuDelegation, () => vscode.postMessage({ type: "toggleDelegation", next: !delegationEnabled })); onMenuClick(menuMemory, () => vscode.postMessage({ type: "toggleMemory", next: !memoryEnabled })); onMenuClick(menuMcp, () => vscode.postMessage({ type: "manageMcpServers" })); +onMenuClick(menuReloadSkills, () => vscode.postMessage({ type: "reloadSkills" })); onMenuClick(menuReload, () => vscode.postMessage({ type: "reload" })); onMenuClick(menuSettings, () => vscode.postMessage({ type: "openSettings" })); diff --git a/src/core-client/process-args.ts b/src/core-client/process-args.ts index e16debe..b760de3 100644 --- a/src/core-client/process-args.ts +++ b/src/core-client/process-args.ts @@ -8,6 +8,7 @@ export interface ServeArgsOptions { workspace: boolean; autoApprove: boolean; mcpServers: string[]; + skillsRefresh?: boolean; resolveSetting: (value: string) => string; } @@ -26,6 +27,9 @@ export function buildServeArgs(options: ServeArgsOptions): string[] { if (!options.skills) { args.push("--no-skills"); } + if (options.skillsRefresh) { + args.push("--skills-refresh"); + } if (options.delegation) { args.push("--delegate"); } diff --git a/src/features/chat/chat.controller.ts b/src/features/chat/chat.controller.ts index 4723aff..259b116 100644 --- a/src/features/chat/chat.controller.ts +++ b/src/features/chat/chat.controller.ts @@ -16,6 +16,7 @@ import { FORWARDED_NOTIFICATIONS, PostMessage, ResolveSetting } from "./chat.typ export class ChatController { private client: RpcClient | undefined; + private pendingSkillsRefresh = false; constructor( private readonly context: vscode.ExtensionContext, @@ -30,10 +31,12 @@ export class ChatController { async startConnection(): Promise { if (!readSettings().provider) { + this.pendingSkillsRefresh = false; this.post({ type: "needsSetup" }); return; } if (!(await this.hasCli())) { + this.pendingSkillsRefresh = false; this.post({ type: "cliMissing", command: this.resolveSetting(readSettings().command) }); return; } @@ -158,8 +161,10 @@ export class ChatController { workspace: settings.workspace, autoApprove: settings.autoApprove, mcpServers: settings.mcpServers, + skillsRefresh: this.pendingSkillsRefresh, resolveSetting: (value) => this.resolveSetting(value), }); + this.pendingSkillsRefresh = false; const apiKey = await this.context.secrets.get(API_KEY_SECRET); const auth = this.readAuthFor(settings.provider); const env = spawnEnvForApiKey(apiKey, providerApiKeyEnvNames(auth)); @@ -227,4 +232,9 @@ export class ChatController { this.dispose(); void this.startConnection(); } + + reloadSkills(): void { + this.pendingSkillsRefresh = true; + this.reload(); + } } diff --git a/src/vscode/sidebar/chatSidebarProvider.ts b/src/vscode/sidebar/chatSidebarProvider.ts index 124047a..206365c 100644 --- a/src/vscode/sidebar/chatSidebarProvider.ts +++ b/src/vscode/sidebar/chatSidebarProvider.ts @@ -141,6 +141,9 @@ export class ChatViewProvider implements vscode.WebviewViewProvider { case "reload": this.chat.reload(); break; + case "reloadSkills": + this.chat.reloadSkills(); + break; case "installCli": this.chat.installCli(); break; diff --git a/src/vscode/webview/html.ts b/src/vscode/webview/html.ts index 38f6983..835d071 100644 --- a/src/vscode/webview/html.ts +++ b/src/vscode/webview/html.ts @@ -51,6 +51,7 @@ export function renderChatHtml(options: ChatHtmlOptions): string { Project memory + diff --git a/src/vscode/webview/messages.ts b/src/vscode/webview/messages.ts index 498bed0..b72fe4c 100644 --- a/src/vscode/webview/messages.ts +++ b/src/vscode/webview/messages.ts @@ -20,6 +20,7 @@ export type WebviewMessage = | { type: "toggleMemory"; next: boolean } | { type: "manageMcpServers" } | { type: "reload" } + | { type: "reloadSkills" } | { type: "installCli" } | { type: "updateCli" } | { type: "openSettings" }