Ten dokument opisuje, jak izolacja działa dzisiaj w praktyce, dlaczego nie jest absolutna oraz jak skonfigurować środowisko, żeby uniknąć przenikania sygnałów między różnymi IDE.
- Izolacja w Koru jest lane/socket-aware, ale nie jest pełnym sandboxem per IDE.
- Logika środowiskowa została wyodrębniona do pakietu
koruenv(CLI:koruenv). - Kod wydzielonej paczki znajduje się w
packages/koruenv(gotowy do niezależnego rozwijania/publikacji). - Canonical source i testy są utrzymywane wyłącznie w
packages/koruenv. - Główne granice izolacji: wybór lane (
KORU_AUTOPILOT_INSTANCE), socket (KORU_AUTOPILOT_SOCKET), dopasowanie pluginu poideiworkspaceFolders. - Główne miejsca bez pełnej izolacji:
- fallback do współdzielonego socketu
koru-autopilot.sock, - współdzielony strumień zdarzeń chat w jednym pliku NDJSON,
- dziedziczenie/env drift w shellach uruchamianych z różnych IDE.
- fallback do współdzielonego socketu
Daemon i plugin ustalają kanał komunikacji po unix socket:
- Python:
src/koruide/socket.py(default_socket_path) - Plugin VS Code-family:
plugins/koru-autopilot-shared/src/socketPath.ts
Jeżeli nie ustawisz jawnie lane/socket, system może użyć ścieżki domyślnej (singleton), którą łatwo współdzielić między procesami z różnych IDE.
Daemon wybiera klienta pluginu przez PluginRouter:
src/koruide/plugin_router.py- selekcja bierze pod uwagę
ide, a gdy dostępne, takżeworkspaceFolders.
To ogranicza pomyłki między oknami, ale nie tworzy twardej separacji procesowej.
Zdarzenia pluginowe (message.sent, message.received, session.*) trafiają do jednego pliku:
- zapis:
src/koruide/daemon/handlers_plugin_event.py(_event_path,_append_event) - odczyt:
src/koruide/chat_history.py(default_events_path,read_events)
Domyślnie to jest jeden plik na hosta/użytkownika ($XDG_RUNTIME_DIR/koru-autopilot-events.ndjson).
Autonomia używa tych eventów do decyzji cooldown i redrive:
src/koru/autonomous_cycle_chat_activity.pysrc/koru/autonomous_cycle_chat_activity_analyzer.py
Jeśli lane/ide nie są precyzyjnie ustawione, aktywność z innego IDE może wpłynąć na decyzje pętli.
Wtyczki VS Code-family mają candidate listę, która obejmuje:
- socket lane (
koru-autopilot-<ide>.sock), - oraz socket singleton (
koru-autopilot.sock).
To pomaga w kompatybilności i migracji, ale zwiększa ryzyko przypadkowego współdzielenia kanału.
Daemon jest brokerem, nie osobnym procesem per IDE. Routing jest logiczny (ide/workspace), nie twardo odizolowany przez namespace/proces.
Event store NDJSON jest współdzielony, więc izolacja opiera się na filtrach (np. ide=), a nie na fizycznie osobnym strumieniu per lane.
Uruchamianie Koru z terminali zintegrowanych różnych IDE bez jawnego resetu env może przenosić stare wartości KORU_AUTOPILOT_INSTANCE/KORU_AUTOPILOT_IDE.
Z podanych logów:
- drive był kierowany do
ide=windsurfi ack był poprawny (verification=strict), - później pojawiło się
plugin hello accepted: ide=vscode.
To oznacza, że ten sam broker widział połączenia pluginów z dwóch lane/IDE i normalnie je przyjął. To nie musi oznaczać błędu routingu dla konkretnego drive, ale pokazuje brak pełnej izolacji na poziomie procesu i event stream.
W KAŻDYM shellu, zanim uruchomisz koru on / koru autonomous up:
export KORU_AUTOPILOT_INSTANCE=windsurf-main
export KORU_AUTOPILOT_SOCKET="$XDG_RUNTIME_DIR/koru-autopilot-windsurf-main.sock"
export KORU_AUTOPILOT_IDE=windsurfAnalogicznie dla drugiego IDE, ale z inną nazwą instance/socket.
Możesz też użyć gotowego helpera, który zawsze ustawia spójny zestaw env:
pip install -e ./packages/koruenv
# wygeneruj exporty dla bieżącego shella
eval "$(koruenv env windsurf windsurf-main)"
# uruchom pojedynczą komendę już w przypiętym lane
koruenv run windsurf windsurf-main -- koru autopilot daemon --project .Albo załaduj skróty do shella (najwygodniejsze na co dzień):
source scripts/koru-autopilot-lanes.sh
lane:windsurf
lane:status
lane:run -- koru autopilot drive --ide windsurf --require-plugin "probe"scripts/koru-autopilot-lane.sh jest cienkim wrapperem, który wymaga
zainstalowanego koruenv i nie fallbackuje już do modułu repo.
Dedykowany CI dla paczki: /.github/workflows/koruenv-ci.yml.
Na Windows używaj tego samego CLI, ale generuj env w formacie PowerShell:
koruenv env vscode vscode-main --shell powershell | Invoke-Expression
koruenv status vscode vscode-main
koruenv run vscode vscode-main -- koru autopilot status --explainDomyślny socket lane na Windows jest rozwiązywany do katalogu tymczasowego
(LOCALAPPDATA/TEMP) zamiast /tmp.
koru autopilot status --explainZweryfikuj:
socketwskazuje lane, którego chcesz użyć,plugins[].ideiplugins[].workspaceFoldersodpowiadają bieżącemu repo,- brak nieoczekiwanych pluginów z innych lane.
Jeśli sesja ma działać wyłącznie przez stdio/API (bez wklejania do chat IDE), uruchamiaj bez autopilota albo w headless policy:
koru autonomous up --no-autopilotLub wymuś policy headless w tym shellu:
export KORU_HEADLESS=1Jeśli nie chcesz, by automatyka interpretowała eventy chat:
export KORU_LLM_REFLECT=0
export KORU_AUTOPILOT_CHAT_INTAKE_TICKET=0To zmniejsza automatyczne reakcje na message.sent/message.received.
Najbezpieczniej: aliasy/skrypty startowe per lane (np. koru-windsurf, koru-jetbrains) ustawiające komplet env, zamiast ręcznego przełączania.
Jeśli pracujesz wyłącznie w Cursorze, a logi / diagnostyka nadal wspominają Windsurf:
- Nie polegaj na domyślnym lane w
coru— komendy bez nazwy IDE (np.coru start refaktoryzacje) wcześniej domyślnie ustawiaływindsurf/windsurf-main. Używaj jawnego lane albo ustaw env w shellu Cursora. - Odśwież wygenerowany lane projektu —
.planfile/.koru/shell-env.shzkoru --initmoże nadal eksportowaćKORU_AUTOPILOT_IDE=windsurfmimo obecności.cursor/:
koru --init-agent-lane --agent-lane cursor
source .planfile/.koru/shell-env.sh # opcjonalnie w zewnętrznym terminalu- Ustaw env per sesję Cursor (zalecane przed
coru/koru autonomous up):
export KORU_AUTOPILOT_IDE=cursor
export KORU_AUTOPILOT_INSTANCE=cursor-main
export KORU_AUTOPILOT_SOCKET="$XDG_RUNTIME_DIR/koru-autopilot-cursor-main.sock"Albo jednorazowo:
eval "$(koruenv env cursor cursor-main)"
coru auto cursor cursor-main- Wyrównaj socket w workspace — Cursor czyta
.cursor/settings.json, nie.vscode/settings.json. Stary wpiskoruAutopilot.socketPathz Windsurf w.vscode/nie naprawia mostka Cursor:
koru ide doctor --ide cursor --fix- Sprawdź przed startem:
koru autopilot status --explain
koru ide doctor --ide cursorOczekiwane: ide=cursor, socket koru-autopilot-cursor-main.sock (lub koru-autopilot-cursor.sock gdy instance=cursor), brak błędów pluginu Windsurf.
- Ustaw
KORU_AUTOPILOT_INSTANCE,KORU_AUTOPILOT_SOCKET,KORU_AUTOPILOT_IDEjawnie. - Sprawdź
koru autopilot status --explainprzed każdymkoru on. - Nie używaj wspólnego singleton socketu dla wielu IDE lane.
- Dla shell-only używaj
--no-autopilotlubKORU_HEADLESS=1. - Gdy lane się pomieszał: restart daemona dla konkretnego socketu i reconnect pluginu tylko w docelowym IDE.
Pomocniczo:
scripts/koru-autopilot-lane.sh status windsurf windsurf-mainŻeby domknąć izolację architektonicznie, docelowo warto:
- Przenieść event store z jednego globalnego pliku na pliki per lane/socket.
- Dodać tryb
strict-lane, który wyłącza singleton fallback socketu. - Wymagać lane-id w plugin hello + twarde odrzucanie mismatch lane po stronie daemona.
- Domyślnie filtrować wszystkie decyzje chat activity po lane-id, nie tylko po
ide.