Copilot LSP
vscode-copilot-lsp は、GitHub公式の @github/copilot-language-server と VS Code 公開 Extension API を接続する薄いアダプターです。VS Code の Chat / Agent UI を使わず、通常の Inline Suggestion(ghost text)と Next Edit Suggestions(NES)を提供します。
この拡張は GitHub の公式製品ではありません。利用には GitHub Copilot の利用権が必要で、GitHub Copilot の利用規約が適用されます。
対応範囲
textDocument/inlineCompletion による通常のインライン補完
- 自動トリガーと明示的トリガー
- 複数候補、multiline、replacement range、CRLF/LF
textDocument/copilotInlineEdit によるNES
- NESの挿入、置換、削除、複数候補、version検証、cancellation
- Stable VS Code APIによるNESのdecoration表示、移動、accept、dismiss
- LSP の incremental document synchronization
- GitHub Device Flow(Language Server が管理する
signIn / signOut)
- ローカル workspace と workspace Extension Host 上での Remote / Dev Container / SSH / WSL
- Language Server の status、ログ、異常終了後の最大3回までの再起動
安定版 VS Code API には inline completion の「表示された」および部分 accept の通知イベントがないため、推測による didShowCompletion / didPartiallyAcceptCompletion は送信しません。accept 時に Language Server が返した command を実行する処理だけを行います。
Chat、Agent Mode、Agent Sessions、Copilot Edits、Copilot CLI、独自のサイドバーやモデル選択 UI は提供しません。NESの表示はStable APIのdecorationと標準WorkspaceEditを使用します。VS CodeのProposed Inline Edit APIには依存せず、ネイティブNESと同一の表示体験は提供しません。
設定
{
"chat.disableAIFeatures": true,
"copilotLsp.enable": true,
"copilotLsp.enableAutoCompletions": true,
"copilotLsp.debug.logging": false,
"copilotLsp.nextEditSuggestions.enabled": true,
"copilotLsp.nextEditSuggestions.autoTrigger": true,
"copilotLsp.nextEditSuggestions.debounce": 300,
"copilotLsp.nextEditSuggestions.renameSymbolSuggestions": true,
"copilotLsp.nextEditSuggestions.extendedRange": true,
"copilotLsp.nextEditSuggestions.renderMode": "decorations"
}
copilotLsp.debug.logging を有効にすると、JSON-RPC のメソッド名と redacted payload が Output に記録されます。トークン、認証情報、デバイスコードなどの secret-like な値は記録しません。通常のサーバーログも Copilot LSP Output Channel に集約されます。
ステータスバーのCopilotボタンをクリックすると、本拡張の有効・無効を切り替えられます。常にCopilotアイコンと状態アイコンを同じ幅で表示し、Readyはcheck、未認証・設定不備・エラーはwarning、無効はcircle-slashで表します。hoverにはCopilot: ON、Copilot: OFF、または問題の状態を含む短い表示を出します。
サインイン
コマンドパレットから Copilot LSP: Sign In を実行します。新規サインインが必要な場合は、Language Server の signIn 応答に含まれる user code をクリップボードへコピーし、サーバーが提供した workspace/executeCommand を実行してブラウザを開きます。Language Server がすでに認証済みの場合は device-flow challenge が返らないことがあるため、その状態をエラーとして扱いません。アクセストークンを本拡張が保存・管理することはありません。
VS Code の GitHub アカウントセッションは、公開されている vscode.authentication API から取得できますが、Copilot Language Server の公開 LSP 契約にはそのトークンを注入する方法がありません。本拡張ではセッションを横取りせず、Language Server 自身の signIn / signOut と認証状態を使用します。
Copilot LSP: Sign Out は Language Server の signOut を呼び出します。
Next Edit Suggestions
NESは編集後にdebounceしてLanguage Serverへ候補を問い合わせます。Language Serverへworkspaceのファイル変更監視も提供し、参照箇所を含むworkspace文脈を利用できるようにします。候補は対象範囲のdecorationとhoverで示されます。候補がカーソル位置にある場合はTabで適用し、カーソル外にある場合は最初のTabで候補rangeの開始位置へカーソルを移動して、次のTabで適用します。候補位置へ自動スクロールはせず、次のコマンドでも操作できます。
Copilot LSP: Trigger Next Edit Suggestion
Copilot LSP: Go to Next Edit Suggestion
Copilot LSP: Accept Next Edit Suggestion
Copilot LSP: Dismiss Next Edit Suggestion
Copilot LSP: Show Next/Previous NES Candidate
accept時は候補のrangeとdocument versionを再検証してからWorkspaceEditを適用し、成功した場合だけLanguage Serverが返したaccept commandを実行します。入力、document切り替え、Language Server再起動、古いversionの応答では候補を破棄します。
Stable APIの制約により、NES候補はCopilot純正のcode shifting、side-by-side diff、ネイティブInline Edit UIでは表示されません。renderModeで現在選択できるのはdecorationsだけです。Proposed APIをMarketplace版の必須経路にはしません。
TabのNES割り当ては、通常のInline Suggestionまたは候補ウィジェットが表示されている間は無効です。その場合はVS Code標準のTab操作が優先されます。Escapeは通常のsuggest/inline hintが表示されていない場合だけNESのdismissに使います。VS Codeの安定版APIでは純正NESの表示状態を完全には取得できないため、通常のsuggest/inline hintが表示されている場合はEscapeを拡張側で横取りしません。
実装モデル
VS Code Adapter
↓
Copilot LSP Client
↓ JSON-RPC over stdio
@github/copilot-language-server
VS Code 非公開 API、公式 Copilot 拡張の内部コード、Workbench のパッチは使用しません。Language Server は workspace 側の Extension Host で実行し、Remote URI は Uri の標準変換結果をそのまま LSP URI として使用します。
デスクトップの Extension Host では、可能な場合は公式パッケージに含まれるプラットフォーム固有バイナリを優先します。Remote Extension Host などでバイナリが利用できない場合は、Node.js 20.8 以上の JavaScript 配布物を実行します。macOS の Electron Extension Host では ELECTRON_RUN_AS_NODE=1 を使って Node モードに切り替えます。現在の依存パッケージには macOS arm64/x64、Linux arm64/x64、Windows arm64/x64 のオプション依存が含まれます。
開発
npm install
npm run check
npm run package
VS Code で .vscode/launch.json の Run Extension を選ぶと、コンパイル後に Extension Development Host が起動します。編集しながら実行する場合は Run Extension (watch) を使用します。
npm run package は VSIX を生成し、npm run publish は vsce publish を実行します。公開前に publisher、GitHub repository、Marketplace の認証状態を確認してください。
npm run check は TypeScript のコンパイルと JSON-RPC / 変換ロジックの単体テストを実行します。VS Code Extension Host を使う手動確認では、次を確認してください。
chat.disableAIFeatures: true でも ghost text が表示される
- 公式 GitHub Copilot / GitHub Copilot Chat 拡張を無効にしても動作する
- multiline completion を Tab で受け入れられる
- document編集後にNESが表示され、挿入・置換・削除をacceptできる
- NESの候補位置へカーソル移動でき、EscapeまたはDismissコマンドでdismissできる
- NES表示中も通常Inline Completionが要求され、候補が競合しない
- ステータスバーのCopilotアイコンで有効・無効を切り替えられる
- 高速入力で古い候補が表示されない
- workspace を閉じた後に Language Server プロセスが残らない
- Dev Container、SSH Remote、WSL の各 Extension Host で起動できる
このプロジェクトは GitHub Copilot の認証・ネットワーク・契約状態を再実装しません。サブスクリプション、quota、proxy、GitHub Enterprise、ネットワークエラーは Language Server の状態通知と Output を確認してください。