fix: honor HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars - #50

Closed
XXPermanentXX wants to merge 6 commits into
mainfrom
fix/proxy-env-support
Closed

fix: honor HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars#50
XXPermanentXX wants to merge 6 commits into
mainfrom
fix/proxy-env-support

Conversation

@XXPermanentXX

Copy link
Copy Markdown
Collaborator

Summary

Fixes#35 — running bl behind a VPN / corporate proxy failed with ECONNRESET: Client network socket disconnected before secure TLS connection was established.

Root cause: Node's built-in fetch (undici) does not read proxy environment variables, so the CLI always connected directly, bypassing the local proxy and getting blocked.

Fix: at startup, install an EnvHttpProxyAgent as the global undici dispatcher — but only when HTTP_PROXY / HTTPS_PROXY is actually set. When no proxy variable is configured, the global dispatcher is untouched and behavior is exactly as before.

export HTTPS_PROXY=http://127.0.0.1:7890
bl app list # now routes through the proxy

Changes

  • packages/cli/src/proxy.ts (new): readProxyEnv() + setupProxyFromEnv(). Lowercase variables take precedence over uppercase (curl convention); NO_PROXY is supported.
    • Values are trimmed and passed explicitly to work around undici reading env vars with ??, where an empty lowercase variable (https_proxy="") masks a configured uppercase one.
    • An invalid proxy URL fails with a clear usage error (Invalid proxy configuration: … + hint) instead of a raw stack trace.
  • packages/cli/src/main.ts: call setupProxyFromEnv() at module top level, before any fetch is issued (including update-checker).
  • packages/cli/src/error-handler.ts: the ECONNRESET hint now suggests export HTTPS_PROXY=… for VPN / corporate-proxy users.
  • undici added as an explicit dependency (catalog ^8.4.1).

Tests (fully offline)

  • tests/proxy.test.ts: env parsing — unset/blank handling, lowercase precedence, empty-string-masking regression, NO_PROXY.
  • tests/e2e/proxy.e2e.test.ts: spins up a local CONNECT proxy and targets a .invalid host (guaranteed unresolvable, no real network traffic). Verifies:
    • with HTTPS_PROXY set, CLI traffic tunnels through the proxy (CONNECT to the target host);
    • empty lowercase https_proxy does not mask HTTPS_PROXY;
    • NO_PROXY match keeps the request direct;
    • with no proxy vars set, the proxy receives zero traffic (no behavior change);
    • an invalid proxy URL produces a clear error message.

All 10 tests pass.

🤖 Generated with Claude Code

XXPermanentXXand others added 4 commits June 12, 2026 14:24
Node's built-in fetch (undici) ignores proxy environment variables, so
bl bypassed VPN / corporate proxies and failed with ECONNRESET. Install
an EnvHttpProxyAgent as the global dispatcher at startup, but only when
a proxy variable is actually set — behavior is unchanged otherwise.
Values are trimmed and passed explicitly to work around undici reading
env vars with `??`, where an empty lowercase variable (https_proxy="")
masks a configured uppercase one. Invalid proxy URLs fail with a clear
usage error instead of a stack trace, and the ECONNRESET hint now
suggests exporting HTTPS_PROXY.
Tests are fully offline: unit tests cover env parsing, and e2e tests
drive a local CONNECT proxy against a .invalid host to verify traffic
routes through the proxy, NO_PROXY is honored, and no dispatcher is
installed when no proxy is configured.
Fixes#35
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
app list resolves a console credential before issuing any request, so in
CI (no ~/.bailian/config.json, no credentials) it exited with an AUTH
error before fetch ran — the proxy received zero CONNECTs and the
"routes through proxy" assertions failed. Locally these passed only
because a real config.json supplied a token.
Inject a fake DASHSCOPE_ACCESS_TOKEN (highest-priority credential
source) so the request is actually issued and intercepted by the local
CONNECT proxy. The target stays a .invalid host, so still no real
network traffic.
Switch the seed-image prompt from a cat sketch to a green leaf for a
simpler, more reliably-generated reference frame.
It's a machine-local runtime lock file that shouldn't be in the repo;
remove it and add it to .gitignore.
@XXPermanentXX

Copy link
Copy Markdown
CollaboratorAuthor

Superseded by #51, which rebuilds these changes cleanly on top of main (the history here got tangled). The proxy e2e test was also rewritten to test the proxy in isolation — it no longer drives app list and needs no credentials in CI.

@XXPermanentXX
XXPermanentXX deleted the fix/proxy-env-support branch June 12, 2026 08:07
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Confuse Report: 在本地开启VPN代理的情况下,会提示以上异常,请问如何处理

1 participant

@XXPermanentXX
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix: honor HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars - #50

Closed
XXPermanentXX wants to merge 6 commits into
mainfrom
fix/proxy-env-support
Closed

fix: honor HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars#50
XXPermanentXX wants to merge 6 commits into
mainfrom
fix/proxy-env-support

Conversation

@XXPermanentXX

Copy link
Copy Markdown
Collaborator

Summary

Fixes#35 — running bl behind a VPN / corporate proxy failed with ECONNRESET: Client network socket disconnected before secure TLS connection was established.

Root cause: Node's built-in fetch (undici) does not read proxy environment variables, so the CLI always connected directly, bypassing the local proxy and getting blocked.

Fix: at startup, install an EnvHttpProxyAgent as the global undici dispatcher — but only when HTTP_PROXY / HTTPS_PROXY is actually set. When no proxy variable is configured, the global dispatcher is untouched and behavior is exactly as before.

export HTTPS_PROXY=http://127.0.0.1:7890
bl app list # now routes through the proxy

Changes

  • packages/cli/src/proxy.ts (new): readProxyEnv() + setupProxyFromEnv(). Lowercase variables take precedence over uppercase (curl convention); NO_PROXY is supported.
    • Values are trimmed and passed explicitly to work around undici reading env vars with ??, where an empty lowercase variable (https_proxy="") masks a configured uppercase one.
    • An invalid proxy URL fails with a clear usage error (Invalid proxy configuration: … + hint) instead of a raw stack trace.
  • packages/cli/src/main.ts: call setupProxyFromEnv() at module top level, before any fetch is issued (including update-checker).
  • packages/cli/src/error-handler.ts: the ECONNRESET hint now suggests export HTTPS_PROXY=… for VPN / corporate-proxy users.
  • undici added as an explicit dependency (catalog ^8.4.1).

Tests (fully offline)

  • tests/proxy.test.ts: env parsing — unset/blank handling, lowercase precedence, empty-string-masking regression, NO_PROXY.
  • tests/e2e/proxy.e2e.test.ts: spins up a local CONNECT proxy and targets a .invalid host (guaranteed unresolvable, no real network traffic). Verifies:
    • with HTTPS_PROXY set, CLI traffic tunnels through the proxy (CONNECT to the target host);
    • empty lowercase https_proxy does not mask HTTPS_PROXY;
    • NO_PROXY match keeps the request direct;
    • with no proxy vars set, the proxy receives zero traffic (no behavior change);
    • an invalid proxy URL produces a clear error message.

All 10 tests pass.

🤖 Generated with Claude Code

XXPermanentXXand others added 4 commits June 12, 2026 14:24
Node's built-in fetch (undici) ignores proxy environment variables, so
bl bypassed VPN / corporate proxies and failed with ECONNRESET. Install
an EnvHttpProxyAgent as the global dispatcher at startup, but only when
a proxy variable is actually set — behavior is unchanged otherwise.
Values are trimmed and passed explicitly to work around undici reading
env vars with `??`, where an empty lowercase variable (https_proxy="")
masks a configured uppercase one. Invalid proxy URLs fail with a clear
usage error instead of a stack trace, and the ECONNRESET hint now
suggests exporting HTTPS_PROXY.
Tests are fully offline: unit tests cover env parsing, and e2e tests
drive a local CONNECT proxy against a .invalid host to verify traffic
routes through the proxy, NO_PROXY is honored, and no dispatcher is
installed when no proxy is configured.
Fixes#35
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
app list resolves a console credential before issuing any request, so in
CI (no ~/.bailian/config.json, no credentials) it exited with an AUTH
error before fetch ran — the proxy received zero CONNECTs and the
"routes through proxy" assertions failed. Locally these passed only
because a real config.json supplied a token.
Inject a fake DASHSCOPE_ACCESS_TOKEN (highest-priority credential
source) so the request is actually issued and intercepted by the local
CONNECT proxy. The target stays a .invalid host, so still no real
network traffic.
Switch the seed-image prompt from a cat sketch to a green leaf for a
simpler, more reliably-generated reference frame.
It's a machine-local runtime lock file that shouldn't be in the repo;
remove it and add it to .gitignore.
@XXPermanentXX

Copy link
Copy Markdown
CollaboratorAuthor

Superseded by #51, which rebuilds these changes cleanly on top of main (the history here got tangled). The proxy e2e test was also rewritten to test the proxy in isolation — it no longer drives app list and needs no credentials in CI.

@XXPermanentXX
XXPermanentXX deleted the fix/proxy-env-support branch June 12, 2026 08:07
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Confuse Report: 在本地开启VPN代理的情况下,会提示以上异常,请问如何处理

1 participant

@XXPermanentXX
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: honor HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars - #50

Closed
XXPermanentXX wants to merge 6 commits into
mainfrom
fix/proxy-env-support
Closed

fix: honor HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars#50
XXPermanentXX wants to merge 6 commits into
mainfrom
fix/proxy-env-support

Conversation

@XXPermanentXX

Copy link
Copy Markdown
Collaborator

Summary

Fixes#35 — running bl behind a VPN / corporate proxy failed with ECONNRESET: Client network socket disconnected before secure TLS connection was established.

Root cause: Node's built-in fetch (undici) does not read proxy environment variables, so the CLI always connected directly, bypassing the local proxy and getting blocked.

Fix: at startup, install an EnvHttpProxyAgent as the global undici dispatcher — but only when HTTP_PROXY / HTTPS_PROXY is actually set. When no proxy variable is configured, the global dispatcher is untouched and behavior is exactly as before.

export HTTPS_PROXY=http://127.0.0.1:7890
bl app list # now routes through the proxy

Changes

  • packages/cli/src/proxy.ts (new): readProxyEnv() + setupProxyFromEnv(). Lowercase variables take precedence over uppercase (curl convention); NO_PROXY is supported.
    • Values are trimmed and passed explicitly to work around undici reading env vars with ??, where an empty lowercase variable (https_proxy="") masks a configured uppercase one.
    • An invalid proxy URL fails with a clear usage error (Invalid proxy configuration: … + hint) instead of a raw stack trace.
  • packages/cli/src/main.ts: call setupProxyFromEnv() at module top level, before any fetch is issued (including update-checker).
  • packages/cli/src/error-handler.ts: the ECONNRESET hint now suggests export HTTPS_PROXY=… for VPN / corporate-proxy users.
  • undici added as an explicit dependency (catalog ^8.4.1).

Tests (fully offline)

  • tests/proxy.test.ts: env parsing — unset/blank handling, lowercase precedence, empty-string-masking regression, NO_PROXY.
  • tests/e2e/proxy.e2e.test.ts: spins up a local CONNECT proxy and targets a .invalid host (guaranteed unresolvable, no real network traffic). Verifies:
    • with HTTPS_PROXY set, CLI traffic tunnels through the proxy (CONNECT to the target host);
    • empty lowercase https_proxy does not mask HTTPS_PROXY;
    • NO_PROXY match keeps the request direct;
    • with no proxy vars set, the proxy receives zero traffic (no behavior change);
    • an invalid proxy URL produces a clear error message.

All 10 tests pass.

🤖 Generated with Claude Code

XXPermanentXXand others added 4 commits June 12, 2026 14:24
Node's built-in fetch (undici) ignores proxy environment variables, so
bl bypassed VPN / corporate proxies and failed with ECONNRESET. Install
an EnvHttpProxyAgent as the global dispatcher at startup, but only when
a proxy variable is actually set — behavior is unchanged otherwise.
Values are trimmed and passed explicitly to work around undici reading
env vars with `??`, where an empty lowercase variable (https_proxy="")
masks a configured uppercase one. Invalid proxy URLs fail with a clear
usage error instead of a stack trace, and the ECONNRESET hint now
suggests exporting HTTPS_PROXY.
Tests are fully offline: unit tests cover env parsing, and e2e tests
drive a local CONNECT proxy against a .invalid host to verify traffic
routes through the proxy, NO_PROXY is honored, and no dispatcher is
installed when no proxy is configured.
Fixes#35
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
app list resolves a console credential before issuing any request, so in
CI (no ~/.bailian/config.json, no credentials) it exited with an AUTH
error before fetch ran — the proxy received zero CONNECTs and the
"routes through proxy" assertions failed. Locally these passed only
because a real config.json supplied a token.
Inject a fake DASHSCOPE_ACCESS_TOKEN (highest-priority credential
source) so the request is actually issued and intercepted by the local
CONNECT proxy. The target stays a .invalid host, so still no real
network traffic.
Switch the seed-image prompt from a cat sketch to a green leaf for a
simpler, more reliably-generated reference frame.
It's a machine-local runtime lock file that shouldn't be in the repo;
remove it and add it to .gitignore.
@XXPermanentXX

Copy link
Copy Markdown
CollaboratorAuthor

Superseded by #51, which rebuilds these changes cleanly on top of main (the history here got tangled). The proxy e2e test was also rewritten to test the proxy in isolation — it no longer drives app list and needs no credentials in CI.

@XXPermanentXX
XXPermanentXX deleted the fix/proxy-env-support branch June 12, 2026 08:07
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Confuse Report: 在本地开启VPN代理的情况下,会提示以上异常,请问如何处理

1 participant

@XXPermanentXX
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: honor HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars - #50

Closed
XXPermanentXX wants to merge 6 commits into
mainfrom
fix/proxy-env-support
Closed

fix: honor HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars#50
XXPermanentXX wants to merge 6 commits into
mainfrom
fix/proxy-env-support

Conversation

@XXPermanentXX

Copy link
Copy Markdown
Collaborator

Summary

Fixes#35 — running bl behind a VPN / corporate proxy failed with ECONNRESET: Client network socket disconnected before secure TLS connection was established.

Root cause: Node's built-in fetch (undici) does not read proxy environment variables, so the CLI always connected directly, bypassing the local proxy and getting blocked.

Fix: at startup, install an EnvHttpProxyAgent as the global undici dispatcher — but only when HTTP_PROXY / HTTPS_PROXY is actually set. When no proxy variable is configured, the global dispatcher is untouched and behavior is exactly as before.

export HTTPS_PROXY=http://127.0.0.1:7890
bl app list # now routes through the proxy

Changes

  • packages/cli/src/proxy.ts (new): readProxyEnv() + setupProxyFromEnv(). Lowercase variables take precedence over uppercase (curl convention); NO_PROXY is supported.
    • Values are trimmed and passed explicitly to work around undici reading env vars with ??, where an empty lowercase variable (https_proxy="") masks a configured uppercase one.
    • An invalid proxy URL fails with a clear usage error (Invalid proxy configuration: … + hint) instead of a raw stack trace.
  • packages/cli/src/main.ts: call setupProxyFromEnv() at module top level, before any fetch is issued (including update-checker).
  • packages/cli/src/error-handler.ts: the ECONNRESET hint now suggests export HTTPS_PROXY=… for VPN / corporate-proxy users.
  • undici added as an explicit dependency (catalog ^8.4.1).

Tests (fully offline)

  • tests/proxy.test.ts: env parsing — unset/blank handling, lowercase precedence, empty-string-masking regression, NO_PROXY.
  • tests/e2e/proxy.e2e.test.ts: spins up a local CONNECT proxy and targets a .invalid host (guaranteed unresolvable, no real network traffic). Verifies:
    • with HTTPS_PROXY set, CLI traffic tunnels through the proxy (CONNECT to the target host);
    • empty lowercase https_proxy does not mask HTTPS_PROXY;
    • NO_PROXY match keeps the request direct;
    • with no proxy vars set, the proxy receives zero traffic (no behavior change);
    • an invalid proxy URL produces a clear error message.

All 10 tests pass.

🤖 Generated with Claude Code

XXPermanentXXand others added 4 commits June 12, 2026 14:24
Node's built-in fetch (undici) ignores proxy environment variables, so
bl bypassed VPN / corporate proxies and failed with ECONNRESET. Install
an EnvHttpProxyAgent as the global dispatcher at startup, but only when
a proxy variable is actually set — behavior is unchanged otherwise.
Values are trimmed and passed explicitly to work around undici reading
env vars with `??`, where an empty lowercase variable (https_proxy="")
masks a configured uppercase one. Invalid proxy URLs fail with a clear
usage error instead of a stack trace, and the ECONNRESET hint now
suggests exporting HTTPS_PROXY.
Tests are fully offline: unit tests cover env parsing, and e2e tests
drive a local CONNECT proxy against a .invalid host to verify traffic
routes through the proxy, NO_PROXY is honored, and no dispatcher is
installed when no proxy is configured.
Fixes#35
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
app list resolves a console credential before issuing any request, so in
CI (no ~/.bailian/config.json, no credentials) it exited with an AUTH
error before fetch ran — the proxy received zero CONNECTs and the
"routes through proxy" assertions failed. Locally these passed only
because a real config.json supplied a token.
Inject a fake DASHSCOPE_ACCESS_TOKEN (highest-priority credential
source) so the request is actually issued and intercepted by the local
CONNECT proxy. The target stays a .invalid host, so still no real
network traffic.
Switch the seed-image prompt from a cat sketch to a green leaf for a
simpler, more reliably-generated reference frame.
It's a machine-local runtime lock file that shouldn't be in the repo;
remove it and add it to .gitignore.
@XXPermanentXX

Copy link
Copy Markdown
CollaboratorAuthor

Superseded by #51, which rebuilds these changes cleanly on top of main (the history here got tangled). The proxy e2e test was also rewritten to test the proxy in isolation — it no longer drives app list and needs no credentials in CI.

@XXPermanentXX
XXPermanentXX deleted the fix/proxy-env-support branch June 12, 2026 08:07
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Confuse Report: 在本地开启VPN代理的情况下,会提示以上异常,请问如何处理

1 participant

@XXPermanentXX
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix: honor HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars - #50

Closed
XXPermanentXX wants to merge 6 commits into
mainfrom
fix/proxy-env-support
Closed

fix: honor HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars#50
XXPermanentXX wants to merge 6 commits into
mainfrom
fix/proxy-env-support

Conversation

@XXPermanentXX

Copy link
Copy Markdown
Collaborator

Summary

Fixes#35 — running bl behind a VPN / corporate proxy failed with ECONNRESET: Client network socket disconnected before secure TLS connection was established.

Root cause: Node's built-in fetch (undici) does not read proxy environment variables, so the CLI always connected directly, bypassing the local proxy and getting blocked.

Fix: at startup, install an EnvHttpProxyAgent as the global undici dispatcher — but only when HTTP_PROXY / HTTPS_PROXY is actually set. When no proxy variable is configured, the global dispatcher is untouched and behavior is exactly as before.

export HTTPS_PROXY=http://127.0.0.1:7890
bl app list # now routes through the proxy

Changes

  • packages/cli/src/proxy.ts (new): readProxyEnv() + setupProxyFromEnv(). Lowercase variables take precedence over uppercase (curl convention); NO_PROXY is supported.
    • Values are trimmed and passed explicitly to work around undici reading env vars with ??, where an empty lowercase variable (https_proxy="") masks a configured uppercase one.
    • An invalid proxy URL fails with a clear usage error (Invalid proxy configuration: … + hint) instead of a raw stack trace.
  • packages/cli/src/main.ts: call setupProxyFromEnv() at module top level, before any fetch is issued (including update-checker).
  • packages/cli/src/error-handler.ts: the ECONNRESET hint now suggests export HTTPS_PROXY=… for VPN / corporate-proxy users.
  • undici added as an explicit dependency (catalog ^8.4.1).

Tests (fully offline)

  • tests/proxy.test.ts: env parsing — unset/blank handling, lowercase precedence, empty-string-masking regression, NO_PROXY.
  • tests/e2e/proxy.e2e.test.ts: spins up a local CONNECT proxy and targets a .invalid host (guaranteed unresolvable, no real network traffic). Verifies:
    • with HTTPS_PROXY set, CLI traffic tunnels through the proxy (CONNECT to the target host);
    • empty lowercase https_proxy does not mask HTTPS_PROXY;
    • NO_PROXY match keeps the request direct;
    • with no proxy vars set, the proxy receives zero traffic (no behavior change);
    • an invalid proxy URL produces a clear error message.

All 10 tests pass.

🤖 Generated with Claude Code

XXPermanentXXand others added 4 commits June 12, 2026 14:24
Node's built-in fetch (undici) ignores proxy environment variables, so
bl bypassed VPN / corporate proxies and failed with ECONNRESET. Install
an EnvHttpProxyAgent as the global dispatcher at startup, but only when
a proxy variable is actually set — behavior is unchanged otherwise.
Values are trimmed and passed explicitly to work around undici reading
env vars with `??`, where an empty lowercase variable (https_proxy="")
masks a configured uppercase one. Invalid proxy URLs fail with a clear
usage error instead of a stack trace, and the ECONNRESET hint now
suggests exporting HTTPS_PROXY.
Tests are fully offline: unit tests cover env parsing, and e2e tests
drive a local CONNECT proxy against a .invalid host to verify traffic
routes through the proxy, NO_PROXY is honored, and no dispatcher is
installed when no proxy is configured.
Fixes#35
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
app list resolves a console credential before issuing any request, so in
CI (no ~/.bailian/config.json, no credentials) it exited with an AUTH
error before fetch ran — the proxy received zero CONNECTs and the
"routes through proxy" assertions failed. Locally these passed only
because a real config.json supplied a token.
Inject a fake DASHSCOPE_ACCESS_TOKEN (highest-priority credential
source) so the request is actually issued and intercepted by the local
CONNECT proxy. The target stays a .invalid host, so still no real
network traffic.
Switch the seed-image prompt from a cat sketch to a green leaf for a
simpler, more reliably-generated reference frame.
It's a machine-local runtime lock file that shouldn't be in the repo;
remove it and add it to .gitignore.
@XXPermanentXX

Copy link
Copy Markdown
CollaboratorAuthor

Superseded by #51, which rebuilds these changes cleanly on top of main (the history here got tangled). The proxy e2e test was also rewritten to test the proxy in isolation — it no longer drives app list and needs no credentials in CI.

@XXPermanentXX
XXPermanentXX deleted the fix/proxy-env-support branch June 12, 2026 08:07
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Confuse Report: 在本地开启VPN代理的情况下,会提示以上异常,请问如何处理

1 participant

@XXPermanentXX
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: honor HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars - #50

Closed
XXPermanentXX wants to merge 6 commits into
mainfrom
fix/proxy-env-support
Closed

fix: honor HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars#50
XXPermanentXX wants to merge 6 commits into
mainfrom
fix/proxy-env-support

Conversation

@XXPermanentXX

Copy link
Copy Markdown
Collaborator

Summary

Fixes#35 — running bl behind a VPN / corporate proxy failed with ECONNRESET: Client network socket disconnected before secure TLS connection was established.

Root cause: Node's built-in fetch (undici) does not read proxy environment variables, so the CLI always connected directly, bypassing the local proxy and getting blocked.

Fix: at startup, install an EnvHttpProxyAgent as the global undici dispatcher — but only when HTTP_PROXY / HTTPS_PROXY is actually set. When no proxy variable is configured, the global dispatcher is untouched and behavior is exactly as before.

export HTTPS_PROXY=http://127.0.0.1:7890
bl app list # now routes through the proxy

Changes

  • packages/cli/src/proxy.ts (new): readProxyEnv() + setupProxyFromEnv(). Lowercase variables take precedence over uppercase (curl convention); NO_PROXY is supported.
    • Values are trimmed and passed explicitly to work around undici reading env vars with ??, where an empty lowercase variable (https_proxy="") masks a configured uppercase one.
    • An invalid proxy URL fails with a clear usage error (Invalid proxy configuration: … + hint) instead of a raw stack trace.
  • packages/cli/src/main.ts: call setupProxyFromEnv() at module top level, before any fetch is issued (including update-checker).
  • packages/cli/src/error-handler.ts: the ECONNRESET hint now suggests export HTTPS_PROXY=… for VPN / corporate-proxy users.
  • undici added as an explicit dependency (catalog ^8.4.1).

Tests (fully offline)

  • tests/proxy.test.ts: env parsing — unset/blank handling, lowercase precedence, empty-string-masking regression, NO_PROXY.
  • tests/e2e/proxy.e2e.test.ts: spins up a local CONNECT proxy and targets a .invalid host (guaranteed unresolvable, no real network traffic). Verifies:
    • with HTTPS_PROXY set, CLI traffic tunnels through the proxy (CONNECT to the target host);
    • empty lowercase https_proxy does not mask HTTPS_PROXY;
    • NO_PROXY match keeps the request direct;
    • with no proxy vars set, the proxy receives zero traffic (no behavior change);
    • an invalid proxy URL produces a clear error message.

All 10 tests pass.

🤖 Generated with Claude Code

XXPermanentXXand others added 4 commits June 12, 2026 14:24
Node's built-in fetch (undici) ignores proxy environment variables, so
bl bypassed VPN / corporate proxies and failed with ECONNRESET. Install
an EnvHttpProxyAgent as the global dispatcher at startup, but only when
a proxy variable is actually set — behavior is unchanged otherwise.
Values are trimmed and passed explicitly to work around undici reading
env vars with `??`, where an empty lowercase variable (https_proxy="")
masks a configured uppercase one. Invalid proxy URLs fail with a clear
usage error instead of a stack trace, and the ECONNRESET hint now
suggests exporting HTTPS_PROXY.
Tests are fully offline: unit tests cover env parsing, and e2e tests
drive a local CONNECT proxy against a .invalid host to verify traffic
routes through the proxy, NO_PROXY is honored, and no dispatcher is
installed when no proxy is configured.
Fixes#35
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
app list resolves a console credential before issuing any request, so in
CI (no ~/.bailian/config.json, no credentials) it exited with an AUTH
error before fetch ran — the proxy received zero CONNECTs and the
"routes through proxy" assertions failed. Locally these passed only
because a real config.json supplied a token.
Inject a fake DASHSCOPE_ACCESS_TOKEN (highest-priority credential
source) so the request is actually issued and intercepted by the local
CONNECT proxy. The target stays a .invalid host, so still no real
network traffic.
Switch the seed-image prompt from a cat sketch to a green leaf for a
simpler, more reliably-generated reference frame.
It's a machine-local runtime lock file that shouldn't be in the repo;
remove it and add it to .gitignore.
@XXPermanentXX

Copy link
Copy Markdown
CollaboratorAuthor

Superseded by #51, which rebuilds these changes cleanly on top of main (the history here got tangled). The proxy e2e test was also rewritten to test the proxy in isolation — it no longer drives app list and needs no credentials in CI.

@XXPermanentXX
XXPermanentXX deleted the fix/proxy-env-support branch June 12, 2026 08:07
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Confuse Report: 在本地开启VPN代理的情况下,会提示以上异常,请问如何处理

1 participant

@XXPermanentXX
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: honor HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars - #50

Closed
XXPermanentXX wants to merge 6 commits into
mainfrom
fix/proxy-env-support
Closed

fix: honor HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars#50
XXPermanentXX wants to merge 6 commits into
mainfrom
fix/proxy-env-support

Conversation

@XXPermanentXX

Copy link
Copy Markdown
Collaborator

Summary

Fixes#35 — running bl behind a VPN / corporate proxy failed with ECONNRESET: Client network socket disconnected before secure TLS connection was established.

Root cause: Node's built-in fetch (undici) does not read proxy environment variables, so the CLI always connected directly, bypassing the local proxy and getting blocked.

Fix: at startup, install an EnvHttpProxyAgent as the global undici dispatcher — but only when HTTP_PROXY / HTTPS_PROXY is actually set. When no proxy variable is configured, the global dispatcher is untouched and behavior is exactly as before.

export HTTPS_PROXY=http://127.0.0.1:7890
bl app list # now routes through the proxy

Changes

  • packages/cli/src/proxy.ts (new): readProxyEnv() + setupProxyFromEnv(). Lowercase variables take precedence over uppercase (curl convention); NO_PROXY is supported.
    • Values are trimmed and passed explicitly to work around undici reading env vars with ??, where an empty lowercase variable (https_proxy="") masks a configured uppercase one.
    • An invalid proxy URL fails with a clear usage error (Invalid proxy configuration: … + hint) instead of a raw stack trace.
  • packages/cli/src/main.ts: call setupProxyFromEnv() at module top level, before any fetch is issued (including update-checker).
  • packages/cli/src/error-handler.ts: the ECONNRESET hint now suggests export HTTPS_PROXY=… for VPN / corporate-proxy users.
  • undici added as an explicit dependency (catalog ^8.4.1).

Tests (fully offline)

  • tests/proxy.test.ts: env parsing — unset/blank handling, lowercase precedence, empty-string-masking regression, NO_PROXY.
  • tests/e2e/proxy.e2e.test.ts: spins up a local CONNECT proxy and targets a .invalid host (guaranteed unresolvable, no real network traffic). Verifies:
    • with HTTPS_PROXY set, CLI traffic tunnels through the proxy (CONNECT to the target host);
    • empty lowercase https_proxy does not mask HTTPS_PROXY;
    • NO_PROXY match keeps the request direct;
    • with no proxy vars set, the proxy receives zero traffic (no behavior change);
    • an invalid proxy URL produces a clear error message.

All 10 tests pass.

🤖 Generated with Claude Code

XXPermanentXXand others added 4 commits June 12, 2026 14:24
Node's built-in fetch (undici) ignores proxy environment variables, so
bl bypassed VPN / corporate proxies and failed with ECONNRESET. Install
an EnvHttpProxyAgent as the global dispatcher at startup, but only when
a proxy variable is actually set — behavior is unchanged otherwise.
Values are trimmed and passed explicitly to work around undici reading
env vars with `??`, where an empty lowercase variable (https_proxy="")
masks a configured uppercase one. Invalid proxy URLs fail with a clear
usage error instead of a stack trace, and the ECONNRESET hint now
suggests exporting HTTPS_PROXY.
Tests are fully offline: unit tests cover env parsing, and e2e tests
drive a local CONNECT proxy against a .invalid host to verify traffic
routes through the proxy, NO_PROXY is honored, and no dispatcher is
installed when no proxy is configured.
Fixes#35
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
app list resolves a console credential before issuing any request, so in
CI (no ~/.bailian/config.json, no credentials) it exited with an AUTH
error before fetch ran — the proxy received zero CONNECTs and the
"routes through proxy" assertions failed. Locally these passed only
because a real config.json supplied a token.
Inject a fake DASHSCOPE_ACCESS_TOKEN (highest-priority credential
source) so the request is actually issued and intercepted by the local
CONNECT proxy. The target stays a .invalid host, so still no real
network traffic.
Switch the seed-image prompt from a cat sketch to a green leaf for a
simpler, more reliably-generated reference frame.
It's a machine-local runtime lock file that shouldn't be in the repo;
remove it and add it to .gitignore.
@XXPermanentXX

Copy link
Copy Markdown
CollaboratorAuthor

Superseded by #51, which rebuilds these changes cleanly on top of main (the history here got tangled). The proxy e2e test was also rewritten to test the proxy in isolation — it no longer drives app list and needs no credentials in CI.

@XXPermanentXX
XXPermanentXX deleted the fix/proxy-env-support branch June 12, 2026 08:07
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Confuse Report: 在本地开启VPN代理的情况下,会提示以上异常,请问如何处理

1 participant

@XXPermanentXX
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: honor HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars - #50

Closed
XXPermanentXX wants to merge 6 commits into
mainfrom
fix/proxy-env-support
Closed

fix: honor HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars#50
XXPermanentXX wants to merge 6 commits into
mainfrom
fix/proxy-env-support

Conversation

@XXPermanentXX

Copy link
Copy Markdown
Collaborator

Summary

Fixes#35 — running bl behind a VPN / corporate proxy failed with ECONNRESET: Client network socket disconnected before secure TLS connection was established.

Root cause: Node's built-in fetch (undici) does not read proxy environment variables, so the CLI always connected directly, bypassing the local proxy and getting blocked.

Fix: at startup, install an EnvHttpProxyAgent as the global undici dispatcher — but only when HTTP_PROXY / HTTPS_PROXY is actually set. When no proxy variable is configured, the global dispatcher is untouched and behavior is exactly as before.

export HTTPS_PROXY=http://127.0.0.1:7890
bl app list # now routes through the proxy

Changes

  • packages/cli/src/proxy.ts (new): readProxyEnv() + setupProxyFromEnv(). Lowercase variables take precedence over uppercase (curl convention); NO_PROXY is supported.
    • Values are trimmed and passed explicitly to work around undici reading env vars with ??, where an empty lowercase variable (https_proxy="") masks a configured uppercase one.
    • An invalid proxy URL fails with a clear usage error (Invalid proxy configuration: … + hint) instead of a raw stack trace.
  • packages/cli/src/main.ts: call setupProxyFromEnv() at module top level, before any fetch is issued (including update-checker).
  • packages/cli/src/error-handler.ts: the ECONNRESET hint now suggests export HTTPS_PROXY=… for VPN / corporate-proxy users.
  • undici added as an explicit dependency (catalog ^8.4.1).

Tests (fully offline)

  • tests/proxy.test.ts: env parsing — unset/blank handling, lowercase precedence, empty-string-masking regression, NO_PROXY.
  • tests/e2e/proxy.e2e.test.ts: spins up a local CONNECT proxy and targets a .invalid host (guaranteed unresolvable, no real network traffic). Verifies:
    • with HTTPS_PROXY set, CLI traffic tunnels through the proxy (CONNECT to the target host);
    • empty lowercase https_proxy does not mask HTTPS_PROXY;
    • NO_PROXY match keeps the request direct;
    • with no proxy vars set, the proxy receives zero traffic (no behavior change);
    • an invalid proxy URL produces a clear error message.

All 10 tests pass.

🤖 Generated with Claude Code

XXPermanentXXand others added 4 commits June 12, 2026 14:24
Node's built-in fetch (undici) ignores proxy environment variables, so
bl bypassed VPN / corporate proxies and failed with ECONNRESET. Install
an EnvHttpProxyAgent as the global dispatcher at startup, but only when
a proxy variable is actually set — behavior is unchanged otherwise.
Values are trimmed and passed explicitly to work around undici reading
env vars with `??`, where an empty lowercase variable (https_proxy="")
masks a configured uppercase one. Invalid proxy URLs fail with a clear
usage error instead of a stack trace, and the ECONNRESET hint now
suggests exporting HTTPS_PROXY.
Tests are fully offline: unit tests cover env parsing, and e2e tests
drive a local CONNECT proxy against a .invalid host to verify traffic
routes through the proxy, NO_PROXY is honored, and no dispatcher is
installed when no proxy is configured.
Fixes#35
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
app list resolves a console credential before issuing any request, so in
CI (no ~/.bailian/config.json, no credentials) it exited with an AUTH
error before fetch ran — the proxy received zero CONNECTs and the
"routes through proxy" assertions failed. Locally these passed only
because a real config.json supplied a token.
Inject a fake DASHSCOPE_ACCESS_TOKEN (highest-priority credential
source) so the request is actually issued and intercepted by the local
CONNECT proxy. The target stays a .invalid host, so still no real
network traffic.
Switch the seed-image prompt from a cat sketch to a green leaf for a
simpler, more reliably-generated reference frame.
It's a machine-local runtime lock file that shouldn't be in the repo;
remove it and add it to .gitignore.
@XXPermanentXX

Copy link
Copy Markdown
CollaboratorAuthor

Superseded by #51, which rebuilds these changes cleanly on top of main (the history here got tangled). The proxy e2e test was also rewritten to test the proxy in isolation — it no longer drives app list and needs no credentials in CI.

@XXPermanentXX
XXPermanentXX deleted the fix/proxy-env-support branch June 12, 2026 08:07
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Confuse Report: 在本地开启VPN代理的情况下,会提示以上异常,请问如何处理

1 participant

@XXPermanentXX