VS Code 1.109 更新解读(五):API 与工程改进

212 阅读3分钟

💡 更多技术分享,欢迎访问我的博客:叁木の小屋

系列索引总览 | (一)| (二) | (三) | (四) | (五)


本篇概要

最后一篇涵盖扩展 API 的更新和工程改进,为扩展作者和平台稳定性带来增强:

  • Quick Input 按钮 API 正式确定
  • Chat Model Provider 配置架构
  • macOS DMG 镜像
  • Windows 安装重设计

一、扩展与 API

1.1 GitHub Pull Requests 扩展

GitHub Pull Requests 扩展更新至 0.128.0 版本。

详见:市场页面更新日志

1.2 Quick Input 按钮位置 API(正式确定)

可在 QuickPickInputBox 上指定按钮位置:

const quickPick = vscode.window.createQuickPick();
quickPick.buttons = [
  {
    iconPath: vscode.Uri.file('path/to/icon.svg'),
    tooltip: 'Click me',
    location: vscode.QuickInputButtonLocation.Title  // 或 Inline, Input
  }
];
位置说明
Title顶部标题区域(默认)
Inline输入框右侧
Input输入框内右侧

1.3 Quick Input 按钮切换 API(正式确定)

创建具有开/关状态的切换按钮:

const toggleButton: vscode.QuickInputButton = {
  iconPath: vscode.Uri.file('path/to/toggle-icon.svg'),
  tooltip: 'Toggle feature',
  toggle: { checked: false }
};

// 读取状态
console.log(toggleButton.checked); // false

// 更新状态
toggleButton.toggle = { checked: true };

1.4 Chat Model Provider 配置(提议)

扩展可通过 languageModelChatProviders 贡献点声明配置要求:

简单配置(仅需 API Key)

{
  "contributes": {
    "languageModelChatProviders": [
      {
        "vendor": "my-provider",
        "displayName": "My Provider",
        "configuration": {
          "properties": {
            "apiKey": {
              "type": "string",
              "secret": true,
              "description": "API key for My Provider",
              "title": "API Key"
            }
          },
          "required": ["apiKey"]
        }
      }
    ]
  }
}

高级配置(自定义模型)

{
  "contributes": {
    "languageModelChatProviders": [
      {
        "vendor": "my-provider",
        "displayName": "My Provider",
        "configuration": {
          "properties": {
            "apiKey": { "type": "string", "secret": true },
            "models": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "id": { "type": "string" },
                  "name": { "type": "string" },
                  "url": { "type": "string" },
                  "maxInputTokens": { "type": "number" },
                  "maxOutputTokens": { "type": "number" },
                  "toolCalling": { "type": "boolean" },
                  "vision": { "type": "boolean" }
                },
                "required": ["id", "name", "url", "maxInputTokens", "maxOutputTokens"]
              }
            }
          },
          "required": ["apiKey"]
        }
      }
    ]
  }
}

使用配置

vscode.lm.registerLanguageModelChatProvider('my-provider', {
  provideLanguageModelResponse: (
    messages,
    options,
    extensionToken,
    configuration,  // 用户配置
    token
  ) => {
    const apiKey = configuration.apiKey;
    const models = configuration.models;
    // 使用配置进行 API 调用...
  }
});

1.5 Chat Prompt Files API(提议)

扩展可以动态贡献聊天资源:

// 注册技能提供程序
vscode.chat.registerSkillProvider({
  onDidChangeSkills: onDidChangeEvent,
  provideSkills(context, token): vscode.ChatResource[] {
    return [{
      uri: vscode.Uri.parse('my-extension:/skills/debugging/SKILL.md')
    }];
  }
});

// 其他资源类型
// registerCustomAgentProvider()   // .agent.md
// registerInstructionsProvider()  // .instructions.md
// registerPromptFileProvider()    // .prompt.md

1.6 Chat Item Controller API(提议)

新的基于控制器的 API:

const controller = vscode.chat.createChatSessionItemController(
  'myExtension.chatSessions',
  async (token: vscode.CancellationToken) => {
    const sessions = await fetchSessionsFromBackend();
    const items = sessions.map(session =>
      controller.createChatSessionItem(
        vscode.Uri.parse(`my-scheme://session/${session.id}`),
        session.title
      )
    );
    controller.items.replace(items);

    // 实时更新
    setTimeout(() => {
      for (const item of controller.items) {
        item.label = `${item.label} - ${new Date().toLocaleTimeString()}`;
      }
    }, 10000);
  }
);

controller.onDidChangeChatSessionItemState(item => {
  console.log(`Session ${item.label} archived: ${item.archived}`);
});

1.7 Chat Output Renderer API 更新

渲染器现在作为 ChatOutputWebview 传递:

class MyRenderer implements vscode.ChatOutputWebview {
  onDidDispose: Event<void>;
  dispose(): void {
    // 清理资源
  }
}

1.8 Portable Mode 检测(提议)

检测 VS Code 是否在便携模式下运行:

if (vscode.env.isAppPortable) {
  // 在便携模式下运行 - 调整行为
}

二、工程改进

2.1 macOS DMG 镜像

VS Code 现在为 macOS 提供 DMG 镜像:

  • 原生拖放安装体验
  • 支持所有架构
  • 从 VS Code 官网下载

2.2 Windows 安装重设计

重新设计安装布局,解决更新可靠性问题:

之前现在
原子文件替换版本化包路径
更新可能中断更新更可靠
受系统关闭影响受影响更小

灵感来自 Chromium 更新客户端。

2.3 macOS 避免连续更新

更新 A 准备中 → 更新 B 可用
     ↓
使更新 A 无效,直接应用更新 B

用户无需重启两次应用。

2.4 Copilot 扩展已弃用

GitHub Copilot 扩展已被弃用:

  • 所有 AI 功能由 GitHub Copilot Chat 扩展提供
  • 更新 VS Code 时自动卸载旧扩展
  • Copilot Chat 扩展保持安装

2.5 从 npm 包使用 codicons

Codicons 现在通过 @vscode/codicons npm 包消费:

之前:直接捆绑在 VS Code 仓库
现在:通过 @vscode/codicons npm 包,作为构建过程的一部分

三、值得注意的修复

问题修复
editor.hover.enabledonModifierKeyPressed 时悬停未立即触发已修复
文件描述符泄漏到终端进程已修复

API 快速参考

Quick Input 按钮

// 位置 API
location: vscode.QuickInputButtonLocation.Title | Inline | Input

// 切换 API
toggle: { checked: boolean }

Chat Provider

// 注册
vscode.lm.registerLanguageModelChatProvider(vendor, provider)

// 配置
languageModelChatProviders: [{ vendor, displayName, configuration }]

Chat Resources

// 技能
vscode.chat.registerSkillProvider({ onDidChangeSkills, provideSkills })

// 自定义智能体
vscode.chat.registerCustomAgentProvider({ onDidChangeAgents, provideAgents })

// 说明
vscode.chat.registerInstructionsProvider({ onDidChangeInstructions, provideInstructions })

// 提示文件
vscode.chat.registerPromptFileProvider({ onDidChangePromptFiles, providePromptFiles })

环境检测

// 便携模式
vscode.env.isAppPortable: boolean

系列总结

VS Code 1.109 是一个里程碑版本,标志着 VS Code 向统一多智能体开发平台的演进。

五大核心方向

  1. 聊天体验——更快、更清晰、更流畅
  2. 会话管理——本地/后台/云端统一
  3. 智能体定制——可定制的 AI 行为
  4. 扩展性——Claude Agent、MCP Apps
  5. 平台改进——终端、编辑器、工作台、API

感谢阅读本系列!

相关链接