feat(sidecars): add proxied sidecar tabs (#279)

## Summary
- add SideCar support across the server and UI, including proxied tabs,
picker/settings flows, and websocket-aware proxying
- unify top-level tab handling so workspace instances and SideCars share
the same tab model and navigation flows
- limit SideCars to port-based services only, removing server-managed
process control from the final API and UI

---------

Co-authored-by: Shantur <shantur@Mac.home>
Co-authored-by: Shantur <shantur@Shanturs-MacBook-Pro-M5.local>
This commit is contained in:
Shantur Rathore
2026-04-02 23:00:17 +01:00
committed by GitHub
parent 19a4c3df16
commit d0a0325d7e
47 changed files with 2139 additions and 218 deletions

View File

@@ -15,17 +15,17 @@ export const commandMessages = {
"commands.newInstance.description": "フォルダ選択を開いて新しいインスタンスを作成",
"commands.newInstance.keywords": "フォルダ, プロジェクト, ワークスペース, folder, project, workspace",
"commands.closeInstance.label": "インスタンスを閉じる",
"commands.closeInstance.description": "現在のインスタンスのサーバーを停止",
"commands.closeInstance.keywords": "停止, 終了, 閉じる, stop, quit, close",
"commands.closeInstance.label": "タブを閉じる",
"commands.closeInstance.description": "現在のトップレベルタブを閉じる",
"commands.closeInstance.keywords": "閉じる, タブ, stop, quit, close",
"commands.nextInstance.label": "次のインスタンス",
"commands.nextInstance.description": "次のインスタンスタブへ切り替え",
"commands.nextInstance.keywords": "切り替え, 移動, switch, navigate",
"commands.nextInstance.label": "次のタブ",
"commands.nextInstance.description": "次のトップレベルタブへ切り替え",
"commands.nextInstance.keywords": "切り替え, 移動, タブ, switch, navigate",
"commands.previousInstance.label": "前のインスタンス",
"commands.previousInstance.description": "前のインスタンスタブへ切り替え",
"commands.previousInstance.keywords": "切り替え, 移動, switch, navigate",
"commands.previousInstance.label": "前のタブ",
"commands.previousInstance.description": "前のトップレベルタブへ切り替え",
"commands.previousInstance.keywords": "切り替え, 移動, タブ, switch, navigate",
"commands.newSession.label": "新しいセッション",
"commands.newSession.description": "新しい親セッションを作成",

View File

@@ -69,4 +69,5 @@ export const folderSelectionMessages = {
"folderSelection.servers.dialog.connecting": "接続中...",
"folderSelection.servers.dialog.errorRequired": "サーバー名と URL は必須です。",
"folderSelection.servers.dialog.errorConnect": "リモートサーバーに接続できませんでした。",
"folderSelection.sidecars.button": "Open SideCar",
} as const

View File

@@ -194,4 +194,40 @@ export const settingsMessages = {
"settings.speech.save.saved": "保存済み",
"settings.speech.save.unsaved": "未保存の変更",
"settings.speech.save.error": "保存に失敗しました",
"settings.nav.sidecars": "SideCars",
"settings.section.sidecars.eyebrow": "Server services",
"settings.section.sidecars.title": "SideCars",
"settings.section.sidecars.subtitle": "Configure local services listening on fixed ports that the server can proxy into tabs.",
"sidecars.form.name": "Name",
"sidecars.form.validation": "Enter a valid SideCar name and port.",
"sidecars.form.port": "Port",
"sidecars.form.insecure": "Use HTTP",
"sidecars.form.protocol": "Protocol",
"sidecars.form.protocol.help": "Choose how the proxy should connect to the local service.",
"sidecars.form.protocol.https": "HTTPS",
"sidecars.form.protocol.http": "HTTP",
"sidecars.form.prefixMode": "Prefix mode",
"sidecars.form.prefixMode.help": "Choose whether the SideCar receives the public /sidecars path prefix.",
"sidecars.form.prefixMode.strip": "Strip prefix",
"sidecars.form.prefixMode.preserve": "Preserve prefix",
"sidecars.form.add": "Add SideCar",
"sidecars.kind.port": "Port",
"sidecars.status.running": "Running",
"sidecars.status.stopped": "Stopped",
"sidecars.basePath": "Base path",
"sidecars.settings.listTitle": "Configured SideCars",
"sidecars.settings.listSubtitle": "Review the port-based SideCars available in the picker.",
"sidecars.settings.empty": "No SideCars configured yet.",
"sidecars.picker.title": "Open SideCar",
"sidecars.picker.loading": "Loading SideCars...",
"sidecars.picker.subtitle": "Choose an available SideCar to open in a new tab.",
"sidecars.picker.empty": "No port-based SideCars are available yet.",
"sidecars.picker.close": "Close",
"sidecars.open.errorTitle": "Unable to open SideCar",
"sidecars.open.notFound": "SideCar not found.",
"sidecars.open.notRunning": "SideCar is not reachable on its configured port.",
"sidecars.back": "Back",
"sidecars.refresh": "Refresh",
"sidecars.path": "Path",
"sidecars.go": "Go",
} as const