thatgfsj-code 3.0.17 → 3.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +6 -3
  2. package/dist/config/index.d.ts.map +1 -1
  3. package/dist/config/index.js +45 -4
  4. package/dist/config/index.js.map +1 -1
  5. package/dist/config/providers.d.ts.map +1 -1
  6. package/dist/config/providers.js +1 -0
  7. package/dist/config/providers.js.map +1 -1
  8. package/dist/llm/anthropic.d.ts +28 -2
  9. package/dist/llm/anthropic.d.ts.map +1 -1
  10. package/dist/llm/anthropic.js +77 -38
  11. package/dist/llm/anthropic.js.map +1 -1
  12. package/dist/llm/gemini.d.ts +16 -2
  13. package/dist/llm/gemini.d.ts.map +1 -1
  14. package/dist/llm/gemini.js +51 -12
  15. package/dist/llm/gemini.js.map +1 -1
  16. package/dist/llm/index.d.ts.map +1 -1
  17. package/dist/llm/index.js +11 -5
  18. package/dist/llm/index.js.map +1 -1
  19. package/dist/llm/openai.d.ts +7 -0
  20. package/dist/llm/openai.d.ts.map +1 -1
  21. package/dist/llm/openai.js +16 -18
  22. package/dist/llm/openai.js.map +1 -1
  23. package/dist/mcp/client.d.ts.map +1 -1
  24. package/dist/mcp/client.js +5 -0
  25. package/dist/mcp/client.js.map +1 -1
  26. package/dist/session/index.d.ts +3 -0
  27. package/dist/session/index.d.ts.map +1 -1
  28. package/dist/session/index.js +53 -22
  29. package/dist/session/index.js.map +1 -1
  30. package/dist/setup/browser-setup.d.ts.map +1 -1
  31. package/dist/setup/browser-setup.js +6 -2
  32. package/dist/setup/browser-setup.js.map +1 -1
  33. package/dist/tools/browser.d.ts +13 -1
  34. package/dist/tools/browser.d.ts.map +1 -1
  35. package/dist/tools/browser.js +69 -4
  36. package/dist/tools/browser.js.map +1 -1
  37. package/dist/tools/shell.d.ts +10 -1
  38. package/dist/tools/shell.d.ts.map +1 -1
  39. package/dist/tools/shell.js +12 -2
  40. package/dist/tools/shell.js.map +1 -1
  41. package/dist/tui/app.d.ts.map +1 -1
  42. package/dist/tui/app.js +25 -18
  43. package/dist/tui/app.js.map +1 -1
  44. package/dist/tui/components/ChatMessage.d.ts +7 -0
  45. package/dist/tui/components/ChatMessage.d.ts.map +1 -1
  46. package/dist/tui/components/ChatMessage.js +4 -0
  47. package/dist/tui/components/ChatMessage.js.map +1 -1
  48. package/dist/tui/hooks/useChat.d.ts +6 -9
  49. package/dist/tui/hooks/useChat.d.ts.map +1 -1
  50. package/dist/tui/hooks/useChat.js +110 -174
  51. package/dist/tui/hooks/useChat.js.map +1 -1
  52. package/dist/utils/net.d.ts +73 -0
  53. package/dist/utils/net.d.ts.map +1 -0
  54. package/dist/utils/net.js +230 -0
  55. package/dist/utils/net.js.map +1 -0
  56. package/package.json +3 -2
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Network utilities shared by LLM providers.
3
+ *
4
+ * v3.0.19 hardening after live reports of bare "Error: fetch failed" on
5
+ * SiliconFlow (intermittent resets of the local Clash/mihomo TUN tunnel —
6
+ * DNS hands out fake-IP 198.18.0.0/15 addresses, so when the tunnel core
7
+ * hiccups Node's fetch dies with an opaque TypeError whose real reason
8
+ * hides in `e.cause`):
9
+ *
10
+ * 1. Cause transparency — the wrapped TypeError("fetch failed") is re-thrown
11
+ * as `fetch failed (ECONNRESET)` etc. so users finally see WHY.
12
+ * 2. Automatic retry — network-layer failures only (see isRetryableError),
13
+ * exponential backoff 500ms / 1500ms. HTTP 4xx/5xx are NOT retried; they
14
+ * resolve normally and the caller decides what to do with them.
15
+ * 3. Proxy support — Node's global fetch ignores the system proxy. When
16
+ * HTTPS_PROXY / https_proxy / HTTP_PROXY / http_proxy is set we route
17
+ * requests through undici's EnvHttpProxyAgent (honors NO_PROXY as well;
18
+ * falls back to ProxyAgent on undici builds without it). Set
19
+ * THATGFSJ_NO_PROXY=1 to force direct connections even when proxy env
20
+ * vars are present.
21
+ */
22
+ /** Non-retryable transport failures: retrying a broken certificate chain cannot succeed. */
23
+ const NON_RETRYABLE_CODE_PATTERNS = [/^CERT_[A-Z_]+$/, /^ERR_TLS/, /^ERR_SSL/, /^UNABLE_TO_VERIFY_LEAF_SIGNATURE$/];
24
+ /** Transient socket/DNS level codes worth a second attempt. */
25
+ const RETRYABLE_NET_CODES = new Set([
26
+ 'ECONNRESET',
27
+ 'ETIMEDOUT',
28
+ 'ECONNREFUSED',
29
+ 'EPIPE',
30
+ 'EAI_AGAIN',
31
+ 'ENOTFOUND',
32
+ 'EHOSTUNREACH',
33
+ 'ENETUNREACH',
34
+ ]);
35
+ /**
36
+ * Decide whether an error thrown by fetch is a transient network-layer
37
+ * failure worth retrying. HTTP 4xx/5xx never reach this function (fetch
38
+ * resolves those), so "API error 401" style Errors from callers are
39
+ * naturally not retryable.
40
+ *
41
+ * Note: AbortError is treated as retryable here (it usually means our own
42
+ * per-attempt timeout fired); genuine external cancellation is filtered out
43
+ * by fetchWithRetry BEFORE this check runs.
44
+ */
45
+ export function isRetryableError(err) {
46
+ if (!(err instanceof Error))
47
+ return false;
48
+ if (err.name === 'AbortError' || err.name === 'TimeoutError')
49
+ return true;
50
+ if (err instanceof TypeError && /fetch failed/i.test(err.message)) {
51
+ const code = err.cause?.code;
52
+ if (typeof code === 'string') {
53
+ if (NON_RETRYABLE_CODE_PATTERNS.some(re => re.test(code)))
54
+ return false;
55
+ return true; // ECONNRESET / ETIMEDOUT / UND_ERR_* / unknown socket errors
56
+ }
57
+ return true; // bare "fetch failed" with no cause detail: assume transient
58
+ }
59
+ const code = err.code ?? err.cause?.code;
60
+ if (typeof code === 'string') {
61
+ if (NON_RETRYABLE_CODE_PATTERNS.some(re => re.test(code)))
62
+ return false;
63
+ if (code.startsWith('UND_ERR'))
64
+ return true; // undici connect/headers/body timeouts
65
+ return RETRYABLE_NET_CODES.has(code);
66
+ }
67
+ return false;
68
+ }
69
+ /**
70
+ * Human-readable reason for a failed fetch, taken from the underlying cause
71
+ * (Node puts the real error there — ECONNRESET, ETIMEDOUT, certificate
72
+ * failures, ...). Returns '' when nothing useful is attached.
73
+ */
74
+ export function describeFetchCause(err) {
75
+ if (!(err instanceof Error))
76
+ return '';
77
+ const cause = (err.cause ?? err.cause);
78
+ if (!cause)
79
+ return '';
80
+ if (typeof cause === 'string')
81
+ return cause;
82
+ return String(cause.code || cause.message || cause);
83
+ }
84
+ /**
85
+ * Wrap the infamous TypeError("fetch failed") into an Error that surfaces
86
+ * the underlying cause, e.g. `fetch failed (ECONNRESET) after 3 attempts`.
87
+ * The original error is preserved on `.cause`. Any other error is returned
88
+ * untouched.
89
+ */
90
+ export function enrichFetchError(err, attempts = 1) {
91
+ if (err instanceof TypeError && /fetch failed/i.test(err.message)) {
92
+ const detail = describeFetchCause(err);
93
+ const suffix = attempts > 1 ? ` after ${attempts} attempts` : '';
94
+ const wrapped = new Error(`fetch failed${detail ? ` (${detail})` : ''}${suffix}`);
95
+ wrapped.cause = err;
96
+ return wrapped;
97
+ }
98
+ return err;
99
+ }
100
+ function backoffDelayMs(attempt) {
101
+ // 500ms, 1500ms, 4500ms... (spec: 500/1500 for the default 2 retries)
102
+ return 500 * Math.pow(3, attempt);
103
+ }
104
+ function sleep(ms, signal) {
105
+ return new Promise((resolve, reject) => {
106
+ const timer = setTimeout(resolve, ms);
107
+ signal?.addEventListener('abort', () => {
108
+ clearTimeout(timer);
109
+ reject(new DOMException('Aborted', 'AbortError'));
110
+ }, { once: true });
111
+ });
112
+ }
113
+ function externalAbortError(signal) {
114
+ const reason = signal.reason;
115
+ if (reason instanceof Error)
116
+ return reason;
117
+ return new DOMException('This operation was aborted', 'AbortError');
118
+ }
119
+ // ---------------------------------------------------------------------------
120
+ // Proxy dispatcher (undici EnvHttpProxyAgent / ProxyAgent)
121
+ // ---------------------------------------------------------------------------
122
+ let dispatcherPromise;
123
+ /** Drop the cached dispatcher so the next request re-reads proxy env vars. Exported for tests. */
124
+ export function resetProxyDispatcherCache() {
125
+ dispatcherPromise = undefined;
126
+ }
127
+ function firstProxyEnvValue() {
128
+ for (const key of ['HTTPS_PROXY', 'https_proxy', 'HTTP_PROXY', 'http_proxy']) {
129
+ const v = process.env[key];
130
+ if (v && v.trim())
131
+ return v.trim();
132
+ }
133
+ return undefined;
134
+ }
135
+ /**
136
+ * Resolve the undici dispatcher for the current proxy env vars.
137
+ * Returns undefined when no proxy is configured, the user opted out via
138
+ * THATGFSJ_NO_PROXY, or undici is unavailable (fail-open to direct fetch).
139
+ */
140
+ async function resolveProxyDispatcher() {
141
+ if (process.env.THATGFSJ_NO_PROXY && process.env.THATGFSJ_NO_PROXY !== '0')
142
+ return undefined;
143
+ const proxyUrl = firstProxyEnvValue();
144
+ if (!proxyUrl)
145
+ return undefined;
146
+ if (!dispatcherPromise) {
147
+ dispatcherPromise = (async () => {
148
+ try {
149
+ const mod = await import('undici');
150
+ const self = mod.default ?? mod;
151
+ // EnvHttpProxyAgent reads HTTP_PROXY/HTTPS_PROXY/NO_PROXY itself and
152
+ // handles per-host NO_PROXY exceptions; ProxyAgent is the plain fallback.
153
+ const AgentCtor = self.EnvHttpProxyAgent ?? mod.EnvHttpProxyAgent;
154
+ if (typeof AgentCtor === 'function')
155
+ return new AgentCtor();
156
+ const ProxyAgentCtor = self.ProxyAgent ?? mod.ProxyAgent;
157
+ if (typeof ProxyAgentCtor === 'function')
158
+ return new ProxyAgentCtor(proxyUrl);
159
+ return undefined;
160
+ }
161
+ catch {
162
+ return undefined; // undici missing → direct connection, best effort
163
+ }
164
+ })();
165
+ }
166
+ return dispatcherPromise;
167
+ }
168
+ /**
169
+ * fetch() with automatic retry for network-layer failures and proxy support.
170
+ *
171
+ * - Retries: TypeError("fetch failed") / AbortError from our own timeout /
172
+ * undici UND_ERR_* / transient socket codes. Exponential backoff 500ms,
173
+ * 1500ms. HTTP 4xx/5xx resolve normally and are NEVER retried here.
174
+ * - External signal: passed through untouched; aborting it cancels the
175
+ * in-flight attempt and any pending backoff without retrying.
176
+ * - Timeout: per-attempt (each try gets a fresh timeoutMs window).
177
+ * - init.body must be a string/Buffer/URLSearchParams (reusable across
178
+ * attempts) — required for the POST JSON bodies LLM providers send.
179
+ *
180
+ * On final failure a TypeError("fetch failed") is re-thrown via
181
+ * enrichFetchError so the user sees `fetch failed (ECONNRESET)` instead of
182
+ * a bare "fetch failed".
183
+ */
184
+ export async function fetchWithRetry(url, init = {}, options = {}) {
185
+ const retries = options.retries ?? 2;
186
+ for (let attempt = 0;; attempt++) {
187
+ if (options.signal?.aborted)
188
+ throw externalAbortError(options.signal);
189
+ const attemptController = new AbortController();
190
+ let timedOut = false;
191
+ const timer = options.timeoutMs !== undefined
192
+ ? setTimeout(() => {
193
+ timedOut = true;
194
+ attemptController.abort();
195
+ }, options.timeoutMs)
196
+ : undefined;
197
+ try {
198
+ const signal = options.signal
199
+ ? AbortSignal.any([attemptController.signal, options.signal])
200
+ : attemptController.signal;
201
+ const requestInit = { ...init, signal };
202
+ const dispatcher = await resolveProxyDispatcher();
203
+ if (dispatcher !== undefined)
204
+ requestInit.dispatcher = dispatcher;
205
+ return await globalThis.fetch(url, requestInit);
206
+ }
207
+ catch (err) {
208
+ // 1. External cancellation: never retry, surface the signal's reason.
209
+ if (options.signal?.aborted)
210
+ throw externalAbortError(options.signal);
211
+ // 2. Our own per-attempt timeout fired: retryable, but reword the error
212
+ // on exhaustion (an AbortError named "The operation was aborted"
213
+ // tells the user nothing).
214
+ if (timedOut) {
215
+ if (attempt >= retries) {
216
+ throw new Error(`request timed out after ${options.timeoutMs}ms (${attempt + 1} attempt${attempt ? 's' : ''})`);
217
+ }
218
+ }
219
+ else if (!isRetryableError(err) || attempt >= retries) {
220
+ throw enrichFetchError(err, attempt + 1);
221
+ }
222
+ await sleep(backoffDelayMs(attempt), options.signal);
223
+ }
224
+ finally {
225
+ if (timer)
226
+ clearTimeout(timer);
227
+ }
228
+ }
229
+ }
230
+ //# sourceMappingURL=net.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"net.js","sourceRoot":"","sources":["../../src/utils/net.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thatgfsj-code",
3
- "version": "3.0.17",
3
+ "version": "3.0.19",
4
4
  "description": "Thatgfsj Code - AI Coding Assistant with Reasonix-style prompt caching",
5
5
  "main": "dist/cmd/index.js",
6
6
  "type": "module",
@@ -49,7 +49,8 @@
49
49
  "marked": "^15.0.12",
50
50
  "marked-terminal": "^7.3.0",
51
51
  "playwright-core": "^1.63.0",
52
- "react": "^19.2.7"
52
+ "react": "^19.2.7",
53
+ "undici": "^7.29.1"
53
54
  },
54
55
  "devDependencies": {
55
56
  "@types/marked-terminal": "^6.1.1",