barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

четверг, 29 октября 2026 г.

VSCode GitHub Copilot не может искать файлы, ругаясь на "bundled rg executable is missing"

После определенного обновления VSCode в моей конфигурации Windows + WSL перестала работать нормально песочница: агент не может выполнять поиск по проекту, инструмент Search завершается ошибкой, а агент ругается, что "bundled rg executable is missing".

Нашел соотв. баг на GitHub https://github.com/microsoft/vscode/issues/344476, причина ошибки в том, что директория, где находится этот самый rg, не включена в список разрешенных на чтение из песочницы. 

В качестве временного решения можно добавить путь "/home/<username>/.vscode-server/bin/<uuid>/node_modules/@github/copilot-sdk-linux-x64/ripgrep/bin/linux-x64" (замените заглушки в треугольных скобках на фактические имена папок в вашей системе) в settings.json в массив readonlyPaths в chat.agent.sandbox.fileSystem.userConfiguredPaths.


среда, 28 октября 2026 г.

Terraform и песочница GitHub Copilot в VSCode

Проблема

Cтолкнулся с тем, что GitHub Copilot в VSCode, работая в песочнице, ругается на то, что terraform не установлен, хотя сам я его могу вызвать без проблем из терминала. 

Причина

Проблема в том, что в песочнице доступны все директории из PATH и выполнение любых исполняемых файлов в них. Однако, если исполняемый файл является символической ссылкой, смотрящей в директорию вне PATH - тут уже песочница блокирует выполнение. В моем случае это было именно так: в PATH была папка `/home/linuxbrew/.linuxbrew/bin`, а в ней файл `terraform`, являющийся ссылкой на `../Cellar/terraform/1.17.0/bin/terraform`. 

Решение

Я решил проблему добавлением директории `/home/linuxbrew/.linuxbrew/` в массив `readonlyPaths` внутри настройки `chat.agent.sandbox.fileSystem.userConfiguredPaths` в `settings.json`. Решение, конечно, не самое безопасное (агенты в песочнице теперь могут читать и выполнять что угодно из `/home/linuxbrew/.linuxbrew/`), но рабочее.

среда, 9 сентября 2026 г.

Claude Code network sandboxing и доступ на localhost

Проблема

У меня на localhost:2746 поднят http сервер. Есть Claude Code, запускаемый со включенной песочницей, включая network-песочницу. В настройках указан localhost и 127.0.0.1 как разрешенные хосты:

            "network": {
                "allowedDomains": ["127.0.0.1", "localhost"],
                "allowManagedDomainsOnly": True,
                "strictAllowlist": True,
            },

Однако, клод не может сделать curl на http://localhost:2746, падает "Could not connect to server".

Причина

См. баг https://github.com/anthropics/claude-code/issues/28018. Сетевая изоляция песочницы заключается в том, что весь HTTP(S) траффик должен идти через проксю, поднимаемую на порту 3128. Это прокся автоматически подставляется в переменные HTTP_PROXY/HTTPS_PROXY внутри песочницы. Однако, localhost и 127.0.0.1 также автоматически подставляются в NO_PROXY, что предписывает на localhost ходить напрямую, в обход прокси. И такое прямое подключение не работает.

Решение

Проинструктировать Claude Code сбрасывать NO_PROXY перед выполнением сетевого вызова на localhost, т.к. вот такой вызов из песочницы проходит:

NO_PROXY="" no_proxy="" curl -s http://127.0.0.1:2746/health

Либо для локальных сервисов, которые должны быть видны из песочницы, использовать альтернативный loopback адрес, скажем, 127.0.0.2.

пятница, 9 января 2026 г.

Настройка mitmweb для учета HTTPS_PROXY и NO_PROXY

Задача

Нужно настроить mitmweb так, чтобы он перенаправлял исходящие запросы на другой прокси (корпоративный), учитывая HTTPS_PROXY и NO_PROXY переменные окружения.

Решение

Создаем py-скрипт для обработки NO_PROXY, называем его exclude_proxy.py:

import os

from mitmproxy import http


# Read the exclusions from the NO_PROXY environment variable

# Split the environment variable by commas to handle multiple hostnames

NO_PROXY = os.getenv("NO_PROXY", "").split(",")


def request(flow: http.HTTPFlow):

    # Check if the hostname matches any entry in NO_PROXY

    for hostname in NO_PROXY:

        # Ensure no leading/trailing whitespace in the hostname

        hostname = hostname.strip()

        # If the flow's request host matches an entry in NO_PROXY, bypass the proxy

        if hostname and hostname in flow.request.host:

            flow.server_conn.via = None

Запускаем mitmweb:

mitmweb --mode upstream:$HTTPS_PROXY -s exclude_proxy.py