@ozzylabs/feedradar 0.1.3 → 0.1.4
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.
- package/README.ja.md +19 -0
- package/README.md +21 -1
- package/dist/cli/doctor.d.ts +20 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +291 -2
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/respawn.d.ts +53 -0
- package/dist/cli/respawn.d.ts.map +1 -0
- package/dist/cli/respawn.js +120 -0
- package/dist/cli/respawn.js.map +1 -0
- package/dist/core/feeds/_fetch.d.ts +93 -0
- package/dist/core/feeds/_fetch.d.ts.map +1 -0
- package/dist/core/feeds/_fetch.js +182 -0
- package/dist/core/feeds/_fetch.js.map +1 -0
- package/dist/core/feeds/github-api.d.ts.map +1 -1
- package/dist/core/feeds/github-api.js +2 -1
- package/dist/core/feeds/github-api.js.map +1 -1
- package/dist/core/feeds/html-js.d.ts +21 -0
- package/dist/core/feeds/html-js.d.ts.map +1 -1
- package/dist/core/feeds/html-js.js +39 -1
- package/dist/core/feeds/html-js.js.map +1 -1
- package/dist/core/feeds/html.d.ts.map +1 -1
- package/dist/core/feeds/html.js +2 -1
- package/dist/core/feeds/html.js.map +1 -1
- package/dist/core/feeds/npm-registry.d.ts.map +1 -1
- package/dist/core/feeds/npm-registry.js +2 -1
- package/dist/core/feeds/npm-registry.js.map +1 -1
- package/dist/core/feeds/rss.d.ts.map +1 -1
- package/dist/core/feeds/rss.js +2 -1
- package/dist/core/feeds/rss.js.map +1 -1
- package/dist/core/proxy.d.ts +87 -0
- package/dist/core/proxy.d.ts.map +1 -0
- package/dist/core/proxy.js +146 -0
- package/dist/core/proxy.js.map +1 -0
- package/dist/index.js +17 -4
- package/dist/index.js.map +1 -1
- package/dist/templates/workflows/watch.yaml +5 -1
- package/package.json +2 -2
package/README.ja.md
CHANGED
|
@@ -33,6 +33,24 @@ npx playwright install chromium
|
|
|
33
33
|
|
|
34
34
|
開発中は本リポを clone し、`pnpm install && pnpm run build` で `dist/index.js` を生成して `node dist/index.js <command>` で起動する。
|
|
35
35
|
|
|
36
|
+
## 企業プロキシ環境
|
|
37
|
+
|
|
38
|
+
社内 HTTP / HTTPS プロキシ越しでも、標準の env var を export して `radar` を
|
|
39
|
+
起動するだけで自動検出されて動く(CLI フラグ / 設定ファイルの編集は不要)。
|
|
40
|
+
TLS 中継プロキシ (Zscaler / Netskope 等) では証明書検証を切るのではなく
|
|
41
|
+
`NODE_EXTRA_CA_CERTS` を設定する:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
export HTTPS_PROXY=http://proxy.corp.example.com:8080
|
|
45
|
+
export NODE_EXTRA_CA_CERTS=/path/to/corp-ca.pem # TLS 中継時のみ
|
|
46
|
+
radar doctor # 動作確認
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
NTLM / Kerberos プロキシは直接対応しない(`cntlm` / `Px` / `Authoxy` で
|
|
50
|
+
ローカル変換)。WSL2 から Windows ホストのプロキシを参照する場合、
|
|
51
|
+
`npm install` 自体のプロキシ設定、`radar doctor` の live healthcheck の
|
|
52
|
+
詳細は [docs/user-guide/proxy-setup.ja.md](./docs/user-guide/proxy-setup.ja.md) を参照。
|
|
53
|
+
|
|
36
54
|
## 使い方
|
|
37
55
|
|
|
38
56
|
```bash
|
|
@@ -100,6 +118,7 @@ src/
|
|
|
100
118
|
|
|
101
119
|
- [docs/architecture.md](./docs/architecture.md) — システム全体図 / モジュール責務 / データフロー / Phase 別スコープ
|
|
102
120
|
- [docs/user-guide.md](./docs/user-guide.md) — インストール / クイックスタート / コマンド仕様
|
|
121
|
+
- [docs/user-guide/proxy-setup.ja.md](./docs/user-guide/proxy-setup.ja.md) — 企業プロキシ / TLS 中継 / NTLM ブリッジ / WSL2 環境のセットアップ
|
|
103
122
|
- [docs/release.md](./docs/release.md) — リリース手順(初回手動 publish + Trusted Publisher 登録 + 以降の OIDC 自動化)
|
|
104
123
|
- [docs/adr/](./docs/adr/README.md) — FeedRadar 内部の設計判断記録(Agent / Source / Output / Schedule / User Data / Filter / Skill Bundling / Status State Machine / Untrusted External Content Handling)
|
|
105
124
|
|
package/README.md
CHANGED
|
@@ -33,6 +33,24 @@ Run `radar doctor` to verify Playwright / Chromium are detected before adding an
|
|
|
33
33
|
|
|
34
34
|
While developing locally, clone this repo and run `pnpm install && pnpm run build` to produce `dist/index.js`, then invoke `node dist/index.js <command>`.
|
|
35
35
|
|
|
36
|
+
## Corporate proxy
|
|
37
|
+
|
|
38
|
+
Behind a corporate HTTP / HTTPS proxy, just export the standard env vars and
|
|
39
|
+
run `radar` — it auto-detects them and self-configures (no flags / config
|
|
40
|
+
edits). For TLS-intercepting proxies (Zscaler / Netskope / etc.) set
|
|
41
|
+
`NODE_EXTRA_CA_CERTS` instead of disabling certificate verification:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
export HTTPS_PROXY=http://proxy.corp.example.com:8080
|
|
45
|
+
export NODE_EXTRA_CA_CERTS=/path/to/corp-ca.pem # only if TLS is intercepted
|
|
46
|
+
radar doctor # verify
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
NTLM / Kerberos proxies are not supported directly — bridge with `cntlm` / `Px`
|
|
50
|
+
/ `Authoxy`. WSL2 → Windows host, `npm install` proxy config, and the live
|
|
51
|
+
`radar doctor` healthcheck are documented in
|
|
52
|
+
[docs/user-guide/proxy-setup.md](./docs/user-guide/proxy-setup.md).
|
|
53
|
+
|
|
36
54
|
## Usage
|
|
37
55
|
|
|
38
56
|
```bash
|
|
@@ -52,7 +70,8 @@ radar research --digest <id1> <id2> ... # bundle multiple items into one digest
|
|
|
52
70
|
radar dismiss <item-id> # move an item to dismissed (no LLM)
|
|
53
71
|
radar review <research-id> # cross-review a report with a different agent
|
|
54
72
|
radar update <research-id> # refresh an existing report against the latest item (v+1)
|
|
55
|
-
radar doctor # check workspace / agent CLI / Playwright health
|
|
73
|
+
radar doctor # check workspace / agent CLI / Playwright / proxy / TLS health
|
|
74
|
+
# --no-proxy-check skips the live proxy round-trip (offline-friendly)
|
|
56
75
|
radar --help # help
|
|
57
76
|
```
|
|
58
77
|
|
|
@@ -100,6 +119,7 @@ src/
|
|
|
100
119
|
|
|
101
120
|
- [docs/architecture.md](./docs/architecture.md) — system diagrams / module responsibilities / data flow / per-phase scope
|
|
102
121
|
- [docs/user-guide.md](./docs/user-guide.md) — install / quickstart / command reference
|
|
122
|
+
- [docs/user-guide/proxy-setup.md](./docs/user-guide/proxy-setup.md) — corporate proxy / TLS interception / NTLM bridge / WSL2 setup
|
|
103
123
|
- [docs/release.md](./docs/release.md) — release procedure (manual initial publish + Trusted Publisher registration + subsequent OIDC automation)
|
|
104
124
|
- [docs/adr/](./docs/adr/README.md) — FeedRadar design-decision records (Agent / Source / Output / Schedule / User Data / Filter / Skill Bundling / Status State Machine / Untrusted External Content Handling)
|
|
105
125
|
|
package/dist/cli/doctor.d.ts
CHANGED
|
@@ -30,6 +30,26 @@ export interface DoctorCommandOptions {
|
|
|
30
30
|
* what is actually installed on the host machine).
|
|
31
31
|
*/
|
|
32
32
|
whichImpl?: (binary: string, env: NodeJS.ProcessEnv) => Promise<string | undefined>;
|
|
33
|
+
/**
|
|
34
|
+
* Skip the live proxy healthcheck (default: run the check when a proxy is
|
|
35
|
+
* detected). Off-line developer machines and CI jobs that intentionally
|
|
36
|
+
* isolate the network want a deterministic doctor run without paying for
|
|
37
|
+
* a network round-trip that is guaranteed to fail.
|
|
38
|
+
*/
|
|
39
|
+
noProxyCheck?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Test seam: override `fetch` used by the proxy healthcheck so the test can
|
|
42
|
+
* drive the 200 / 407 / TLS / ECONNREFUSED branches deterministically
|
|
43
|
+
* without hitting api.github.com.
|
|
44
|
+
*/
|
|
45
|
+
fetchImpl?: typeof fetch;
|
|
46
|
+
/**
|
|
47
|
+
* Test seam: override the wall-clock used to measure the healthcheck
|
|
48
|
+
* latency. Returns an elapsed-milliseconds reading; we don't accept a raw
|
|
49
|
+
* clock function because vitest's `vi.useFakeTimers()` interferes with
|
|
50
|
+
* `performance.now()` in surprising ways.
|
|
51
|
+
*/
|
|
52
|
+
nowImpl?: () => number;
|
|
33
53
|
}
|
|
34
54
|
/**
|
|
35
55
|
* Possible statuses for a single doctor check.
|
package/dist/cli/doctor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,YAAY,EAElB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,YAAY,EAElB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACpF;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,EAAE,EAAE,MAAM,CAAC;IACX,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,oCAAoC;IACpC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD;AA+FD;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,YAAY,CAAC,CAkO/F;AAkMD;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAiCjB;AAED,eAAO,MAAM,aAAa,EAAE,OAI3B,CAAC"}
|
package/dist/cli/doctor.js
CHANGED
|
@@ -2,6 +2,7 @@ import { access, constants } from "node:fs/promises";
|
|
|
2
2
|
import { delimiter, join } from "node:path";
|
|
3
3
|
import { loadRadarConfig, RadarConfigError } from "../core/config.js";
|
|
4
4
|
import { CHROMIUM_MISSING_HINT, PLAYWRIGHT_MODULE_MISSING_HINT, probePlaywright, } from "../core/playwright-check.js";
|
|
5
|
+
import { detectProxyUrl, maskProxyUrl } from "../core/proxy.js";
|
|
5
6
|
import { loadSources } from "../core/watcher.js";
|
|
6
7
|
/**
|
|
7
8
|
* Agent CLIs the `doctor` command probes for. Order matches the AgentId enum
|
|
@@ -24,6 +25,38 @@ const AGENT_BINARIES = [
|
|
|
24
25
|
* back to `radar init` rather than a cryptic ENOENT later.
|
|
25
26
|
*/
|
|
26
27
|
const WORKSPACE_DIRS = ["sources", "items", "state", "research", "templates"];
|
|
28
|
+
/**
|
|
29
|
+
* Public probe URL for the proxy healthcheck. api.github.com is reachable
|
|
30
|
+
* from virtually every corporate proxy allowlist (since `gh` / `git` / npm
|
|
31
|
+
* all depend on it), so a failure here is a strong signal that the proxy
|
|
32
|
+
* config itself is broken rather than just missing this particular host.
|
|
33
|
+
*
|
|
34
|
+
* The check is informational only; doctor never escalates a failed
|
|
35
|
+
* healthcheck to `error` because (a) the user might be running doctor
|
|
36
|
+
* specifically because the network is down, and (b) a 407 from the proxy is
|
|
37
|
+
* still a meaningful "proxy reachable, auth missing" state we want to
|
|
38
|
+
* surface as a hint rather than block on.
|
|
39
|
+
*/
|
|
40
|
+
const PROXY_HEALTHCHECK_URL = "https://api.github.com/zen";
|
|
41
|
+
/**
|
|
42
|
+
* Total upper bound on the healthcheck round-trip. Short enough that
|
|
43
|
+
* `radar doctor` stays responsive on a broken proxy, long enough that a
|
|
44
|
+
* slow corporate proxy still gets a chance to respond.
|
|
45
|
+
*/
|
|
46
|
+
const PROXY_HEALTHCHECK_TIMEOUT_MS = 5000;
|
|
47
|
+
/**
|
|
48
|
+
* Node error codes that signal a TLS-intercepting proxy (e.g. Zscaler,
|
|
49
|
+
* Netskope) replaced the leaf cert with its own CA. The fix is always
|
|
50
|
+
* `NODE_EXTRA_CA_CERTS=/path/to/corp-ca.pem`, so we hint at that variable
|
|
51
|
+
* in the doctor output.
|
|
52
|
+
*/
|
|
53
|
+
const TLS_INTERCEPT_CODES = new Set([
|
|
54
|
+
"UNABLE_TO_VERIFY_LEAF_SIGNATURE",
|
|
55
|
+
"SELF_SIGNED_CERT_IN_CHAIN",
|
|
56
|
+
"DEPTH_ZERO_SELF_SIGNED_CERT",
|
|
57
|
+
"CERT_HAS_EXPIRED",
|
|
58
|
+
"ERR_TLS_CERT_ALTNAME_INVALID",
|
|
59
|
+
]);
|
|
27
60
|
async function pathExists(p) {
|
|
28
61
|
try {
|
|
29
62
|
await access(p);
|
|
@@ -186,12 +219,251 @@ export async function runDoctorChecks(options = {}) {
|
|
|
186
219
|
});
|
|
187
220
|
}
|
|
188
221
|
}
|
|
222
|
+
// 5. Proxy + TLS environment. Surfaces three signals so users can debug
|
|
223
|
+
// "fetch works on my laptop but not behind the corp proxy" style issues:
|
|
224
|
+
//
|
|
225
|
+
// - `proxy:env` — which env var is providing the proxy URL (and
|
|
226
|
+
// confirms credentials are masked in our output).
|
|
227
|
+
// - `proxy:active` — whether `NODE_USE_ENV_PROXY` is engaged (the
|
|
228
|
+
// self-respawn path sets it; an external invoker
|
|
229
|
+
// that bypassed our entry-point won't).
|
|
230
|
+
// - `tls:ca` — `NODE_EXTRA_CA_CERTS` status. TLS-intercepting
|
|
231
|
+
// proxies require a custom CA bundle, and the
|
|
232
|
+
// symptom (UNABLE_TO_VERIFY_LEAF_SIGNATURE) is
|
|
233
|
+
// opaque enough to justify a dedicated check.
|
|
234
|
+
// - `proxy:healthcheck` — a real HTTPS round-trip via the configured
|
|
235
|
+
// proxy. Skipped when no proxy is detected (no
|
|
236
|
+
// point) or when `--no-proxy-check` is set.
|
|
237
|
+
const proxyDetection = detectProxyUrl(env);
|
|
238
|
+
if (proxyDetection) {
|
|
239
|
+
const masked = maskProxyUrl(proxyDetection.url);
|
|
240
|
+
if (proxyDetection.allProxyOnly) {
|
|
241
|
+
// ALL_PROXY alone won't engage `--use-env-proxy`; downgrade to warn so
|
|
242
|
+
// the user notices and sets HTTPS_PROXY / HTTP_PROXY explicitly.
|
|
243
|
+
checks.push({
|
|
244
|
+
id: "proxy:env",
|
|
245
|
+
status: "warn",
|
|
246
|
+
message: `proxy: detected via $${proxyDetection.source}=${masked} (Node --use-env-proxy ignores ALL_PROXY; set HTTPS_PROXY or HTTP_PROXY instead)`,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
checks.push({
|
|
251
|
+
id: "proxy:env",
|
|
252
|
+
status: "ok",
|
|
253
|
+
message: `proxy: detected via $${proxyDetection.source}=${masked}`,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
checks.push({
|
|
259
|
+
id: "proxy:env",
|
|
260
|
+
status: "ok",
|
|
261
|
+
message: "proxy: no proxy env var set (HTTPS_PROXY / HTTP_PROXY / ALL_PROXY)",
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
if (env.NODE_USE_ENV_PROXY === "1") {
|
|
265
|
+
checks.push({
|
|
266
|
+
id: "proxy:active",
|
|
267
|
+
status: "ok",
|
|
268
|
+
message: "proxy: NODE_USE_ENV_PROXY active (auto-applied by radar)",
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
else if (proxyDetection && !proxyDetection.allProxyOnly) {
|
|
272
|
+
// Proxy is set but the respawn sentinel is missing — usually means the
|
|
273
|
+
// user invoked radar via a path that bypasses bin/index.js (e.g. a script
|
|
274
|
+
// that imports the modules directly). Warn rather than error because
|
|
275
|
+
// fetch may still work via other paths (e.g. user set `--use-env-proxy`
|
|
276
|
+
// in NODE_OPTIONS themselves).
|
|
277
|
+
checks.push({
|
|
278
|
+
id: "proxy:active",
|
|
279
|
+
status: "warn",
|
|
280
|
+
message: "proxy: NODE_USE_ENV_PROXY not set; if fetch ignores HTTPS_PROXY, re-run radar via the bin (not direct import)",
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
checks.push({
|
|
285
|
+
id: "proxy:active",
|
|
286
|
+
status: "ok",
|
|
287
|
+
message: "proxy: NODE_USE_ENV_PROXY not required (no proxy detected)",
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
const caBundle = env.NODE_EXTRA_CA_CERTS;
|
|
291
|
+
if (caBundle && caBundle.length > 0) {
|
|
292
|
+
checks.push({
|
|
293
|
+
id: "tls:ca",
|
|
294
|
+
status: "ok",
|
|
295
|
+
message: `tls: NODE_EXTRA_CA_CERTS=${caBundle}`,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
checks.push({
|
|
300
|
+
id: "tls:ca",
|
|
301
|
+
status: "ok",
|
|
302
|
+
message: "tls: NODE_EXTRA_CA_CERTS not set (TLS-intercepting proxies may fail)",
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
if (options.noProxyCheck) {
|
|
306
|
+
checks.push({
|
|
307
|
+
id: "proxy:healthcheck",
|
|
308
|
+
status: "ok",
|
|
309
|
+
message: "proxy healthcheck: skipped (--no-proxy-check)",
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
else if (!proxyDetection) {
|
|
313
|
+
checks.push({
|
|
314
|
+
id: "proxy:healthcheck",
|
|
315
|
+
status: "ok",
|
|
316
|
+
message: "proxy healthcheck: skipped (no proxy detected)",
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
const result = await runProxyHealthcheck({
|
|
321
|
+
fetchImpl: options.fetchImpl,
|
|
322
|
+
nowImpl: options.nowImpl,
|
|
323
|
+
});
|
|
324
|
+
checks.push(result);
|
|
325
|
+
}
|
|
189
326
|
const summary = checks.reduce((acc, c) => {
|
|
190
327
|
acc[c.status]++;
|
|
191
328
|
return acc;
|
|
192
329
|
}, { ok: 0, warn: 0, error: 0 });
|
|
193
330
|
return { checks, summary };
|
|
194
331
|
}
|
|
332
|
+
/**
|
|
333
|
+
* Single live HTTPS request through whatever proxy `fetch` picks up. We
|
|
334
|
+
* deliberately do **not** thread a custom `dispatcher` through fetch here —
|
|
335
|
+
* the goal is to mirror exactly what the rest of radar (and any of the
|
|
336
|
+
* spawned agent CLIs) will experience. If the user's proxy is broken,
|
|
337
|
+
* doctor's report should match.
|
|
338
|
+
*
|
|
339
|
+
* Branches:
|
|
340
|
+
* - 2xx response → ok (records status code + latency)
|
|
341
|
+
* - 407 Proxy Auth Req → warn (credentials missing/wrong; not radar's fault)
|
|
342
|
+
* - other 4xx/5xx → warn (proxy reachable but endpoint rejected)
|
|
343
|
+
* - TLS-intercept errors → error (hint NODE_EXTRA_CA_CERTS)
|
|
344
|
+
* - ECONNREFUSED / ENOTFOUND / abort timeout → error (proxy unreachable)
|
|
345
|
+
*/
|
|
346
|
+
async function runProxyHealthcheck(opts) {
|
|
347
|
+
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
348
|
+
const nowImpl = opts.nowImpl ?? (() => performance.now());
|
|
349
|
+
const controller = new AbortController();
|
|
350
|
+
const timeout = setTimeout(() => controller.abort(), PROXY_HEALTHCHECK_TIMEOUT_MS);
|
|
351
|
+
const start = nowImpl();
|
|
352
|
+
try {
|
|
353
|
+
const res = await fetchImpl(PROXY_HEALTHCHECK_URL, {
|
|
354
|
+
method: "GET",
|
|
355
|
+
signal: controller.signal,
|
|
356
|
+
});
|
|
357
|
+
const elapsed = Math.round(nowImpl() - start);
|
|
358
|
+
if (res.status === 407) {
|
|
359
|
+
// 407 from the proxy itself; auth missing or wrong. We don't escalate to
|
|
360
|
+
// error because radar can't tell the user's intended credential strategy.
|
|
361
|
+
return {
|
|
362
|
+
id: "proxy:healthcheck",
|
|
363
|
+
status: "warn",
|
|
364
|
+
message: `proxy healthcheck: 407 Proxy Authentication Required from ${PROXY_HEALTHCHECK_URL} (check userinfo in $HTTPS_PROXY)`,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
if (res.status >= 200 && res.status < 300) {
|
|
368
|
+
return {
|
|
369
|
+
id: "proxy:healthcheck",
|
|
370
|
+
status: "ok",
|
|
371
|
+
message: `proxy healthcheck: ok (${res.status} ${res.statusText || "OK"} from api.github.com in ${elapsed}ms)`,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
return {
|
|
375
|
+
id: "proxy:healthcheck",
|
|
376
|
+
status: "warn",
|
|
377
|
+
message: `proxy healthcheck: ${res.status} ${res.statusText || ""} from api.github.com in ${elapsed}ms`.trimEnd(),
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
catch (err) {
|
|
381
|
+
const elapsed = Math.round(nowImpl() - start);
|
|
382
|
+
return classifyProxyError(err, elapsed);
|
|
383
|
+
}
|
|
384
|
+
finally {
|
|
385
|
+
clearTimeout(timeout);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Map a thrown fetch error onto a DoctorCheck with an actionable hint. We
|
|
390
|
+
* inspect (a) the abort flag (timeout we control), (b) `error.code` /
|
|
391
|
+
* `error.cause.code` (Node's network error pathway), and (c) the message
|
|
392
|
+
* text as a last-resort heuristic. Unknown errors fall through to a generic
|
|
393
|
+
* "healthcheck failed" line.
|
|
394
|
+
*/
|
|
395
|
+
function classifyProxyError(err, elapsedMs) {
|
|
396
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
397
|
+
return {
|
|
398
|
+
id: "proxy:healthcheck",
|
|
399
|
+
status: "error",
|
|
400
|
+
message: `proxy healthcheck: timeout after ${elapsedMs}ms (proxy may be unreachable; verify $HTTPS_PROXY host:port)`,
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
// Node's fetch wraps the underlying network error inside `cause`. We unwrap
|
|
404
|
+
// up to two levels so undici-style nested errors (TLS errors typically sit
|
|
405
|
+
// at `cause.cause`) are still classified.
|
|
406
|
+
const codes = collectErrorCodes(err);
|
|
407
|
+
for (const code of codes) {
|
|
408
|
+
if (TLS_INTERCEPT_CODES.has(code)) {
|
|
409
|
+
return {
|
|
410
|
+
id: "proxy:healthcheck",
|
|
411
|
+
status: "error",
|
|
412
|
+
message: `proxy healthcheck: TLS error (${code}). Set NODE_EXTRA_CA_CERTS=/path/to/corp-ca.pem to trust your proxy's intercepting CA.`,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
if (code === "ECONNREFUSED") {
|
|
416
|
+
return {
|
|
417
|
+
id: "proxy:healthcheck",
|
|
418
|
+
status: "error",
|
|
419
|
+
message: `proxy healthcheck: connection refused. Verify the proxy host:port in $HTTPS_PROXY is reachable.`,
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
if (code === "ENOTFOUND" || code === "EAI_AGAIN") {
|
|
423
|
+
return {
|
|
424
|
+
id: "proxy:healthcheck",
|
|
425
|
+
status: "error",
|
|
426
|
+
message: `proxy healthcheck: DNS lookup failed (${code}). The proxy host in $HTTPS_PROXY can't be resolved.`,
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
if (code === "ECONNRESET" || code === "ETIMEDOUT") {
|
|
430
|
+
return {
|
|
431
|
+
id: "proxy:healthcheck",
|
|
432
|
+
status: "error",
|
|
433
|
+
message: `proxy healthcheck: connection ${code === "ETIMEDOUT" ? "timed out" : "reset"} (${code}).`,
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
438
|
+
return {
|
|
439
|
+
id: "proxy:healthcheck",
|
|
440
|
+
status: "error",
|
|
441
|
+
message: `proxy healthcheck: failed — ${message}`,
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Walk an Error chain (`err.cause` → `err.cause.cause`) and collect any
|
|
446
|
+
* `code` properties along the way. Node's fetch error structure varies by
|
|
447
|
+
* release; treating it as an opaque chain avoids brittle version-pinning.
|
|
448
|
+
*/
|
|
449
|
+
function collectErrorCodes(err) {
|
|
450
|
+
const codes = [];
|
|
451
|
+
let current = err;
|
|
452
|
+
for (let depth = 0; depth < 5 && current; depth++) {
|
|
453
|
+
if (current && typeof current === "object" && "code" in current) {
|
|
454
|
+
const code = current.code;
|
|
455
|
+
if (typeof code === "string")
|
|
456
|
+
codes.push(code);
|
|
457
|
+
}
|
|
458
|
+
if (current && typeof current === "object" && "cause" in current) {
|
|
459
|
+
current = current.cause;
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
break;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
return codes;
|
|
466
|
+
}
|
|
195
467
|
function parseDoctorArgs(args) {
|
|
196
468
|
const out = {};
|
|
197
469
|
for (const arg of args) {
|
|
@@ -199,6 +471,10 @@ function parseDoctorArgs(args) {
|
|
|
199
471
|
out.help = true;
|
|
200
472
|
continue;
|
|
201
473
|
}
|
|
474
|
+
if (arg === "--no-proxy-check") {
|
|
475
|
+
out.noProxyCheck = true;
|
|
476
|
+
continue;
|
|
477
|
+
}
|
|
202
478
|
if (arg.startsWith("--")) {
|
|
203
479
|
throw new Error(`unknown option: ${arg}`);
|
|
204
480
|
}
|
|
@@ -207,7 +483,7 @@ function parseDoctorArgs(args) {
|
|
|
207
483
|
return out;
|
|
208
484
|
}
|
|
209
485
|
function printDoctorHelp(log) {
|
|
210
|
-
log("Usage: radar doctor");
|
|
486
|
+
log("Usage: radar doctor [--no-proxy-check]");
|
|
211
487
|
log("");
|
|
212
488
|
log("Diagnose the workspace and report dependency / configuration health.");
|
|
213
489
|
log("");
|
|
@@ -216,6 +492,13 @@ function printDoctorHelp(log) {
|
|
|
216
492
|
log(" - radar.config.yaml schema validity");
|
|
217
493
|
log(" - Agent CLI availability (claude / codex / gemini / copilot)");
|
|
218
494
|
log(" - Playwright + Chromium install (only if html-js sources configured)");
|
|
495
|
+
log(" - Proxy env vars (HTTPS_PROXY / HTTP_PROXY / ALL_PROXY) with credential masking");
|
|
496
|
+
log(" - NODE_USE_ENV_PROXY status (engaged when radar self-respawned for proxy)");
|
|
497
|
+
log(" - NODE_EXTRA_CA_CERTS status (required for TLS-intercepting proxies)");
|
|
498
|
+
log(" - Live proxy healthcheck (HTTPS request to api.github.com)");
|
|
499
|
+
log("");
|
|
500
|
+
log("Options:");
|
|
501
|
+
log(" --no-proxy-check Skip the live proxy healthcheck (offline-friendly)");
|
|
219
502
|
log("");
|
|
220
503
|
log("Exit codes:");
|
|
221
504
|
log(" 0 all ok (warnings may appear, but no errors)");
|
|
@@ -243,7 +526,13 @@ export async function runDoctor(args, options = {}) {
|
|
|
243
526
|
printDoctorHelp(log);
|
|
244
527
|
return 0;
|
|
245
528
|
}
|
|
246
|
-
|
|
529
|
+
// CLI flag wins over the option seam. Tests typically pass `noProxyCheck`
|
|
530
|
+
// through `options`; users pass `--no-proxy-check`. OR semantics mean either
|
|
531
|
+
// path can opt out without the other interfering.
|
|
532
|
+
const report = await runDoctorChecks({
|
|
533
|
+
...options,
|
|
534
|
+
noProxyCheck: options.noProxyCheck ?? parsed.noProxyCheck,
|
|
535
|
+
});
|
|
247
536
|
for (const check of report.checks) {
|
|
248
537
|
const tag = check.status === "ok" ? "[ok] " : check.status === "warn" ? "[warn] " : "[error]";
|
|
249
538
|
log(`${tag} ${check.message}`);
|
package/dist/cli/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* Sentinel env var. Set on the **child** to signal that the current process is
|
|
4
|
+
* already the respawned instance — without this, the bin would respawn itself
|
|
5
|
+
* indefinitely.
|
|
6
|
+
*/
|
|
7
|
+
export declare const RESPAWN_SENTINEL = "RADAR_PROXY_RESPAWNED";
|
|
8
|
+
/**
|
|
9
|
+
* User opt-out. Setting `RADAR_AUTO_PROXY=0` disables the self-respawn entirely
|
|
10
|
+
* (useful when the user wants to manage `NODE_OPTIONS` themselves, or when the
|
|
11
|
+
* proxy env vars are present but `radar` should bypass them for some reason).
|
|
12
|
+
*/
|
|
13
|
+
export declare const OPT_OUT_ENV = "RADAR_AUTO_PROXY";
|
|
14
|
+
/**
|
|
15
|
+
* Flag injected into `NODE_OPTIONS`. Tells Node to honor `HTTPS_PROXY` /
|
|
16
|
+
* `HTTP_PROXY` for the built-in `fetch()` / `undici` global agent. Available
|
|
17
|
+
* in Node 22.21+ and 24.5+ (see `engines.node` in package.json).
|
|
18
|
+
*/
|
|
19
|
+
export declare const PROXY_FLAG = "--use-env-proxy";
|
|
20
|
+
/**
|
|
21
|
+
* Env hint propagated to spawned subprocesses (agent CLI helpers). Mirrors
|
|
22
|
+
* Node's own convention so any tooling that reads the var sees a consistent
|
|
23
|
+
* signal that the user wants proxy-aware HTTP.
|
|
24
|
+
*/
|
|
25
|
+
export declare const NODE_USE_ENV_PROXY = "NODE_USE_ENV_PROXY";
|
|
26
|
+
export interface RespawnDeps {
|
|
27
|
+
env: NodeJS.ProcessEnv;
|
|
28
|
+
argv: string[];
|
|
29
|
+
execPath: string;
|
|
30
|
+
/** Injected so tests can substitute a mock spawn. */
|
|
31
|
+
spawn?: typeof spawn;
|
|
32
|
+
/** Process-level signal handler registration; injected for tests. */
|
|
33
|
+
onSignal?: (signal: NodeJS.Signals, handler: () => void) => void;
|
|
34
|
+
/** Final exit invoked once the child completes; injected for tests. */
|
|
35
|
+
exit?: (code: number) => void;
|
|
36
|
+
/** Hook to emit warnings; defaults to `console.warn`. */
|
|
37
|
+
warn?: (message: string) => void;
|
|
38
|
+
}
|
|
39
|
+
export interface RespawnDecision {
|
|
40
|
+
respawned: boolean;
|
|
41
|
+
reason?: "no-proxy" | "opt-out" | "already-respawned" | "all-proxy-only-warned" | "spawned";
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Decide whether to respawn, and if so, do it.
|
|
45
|
+
*
|
|
46
|
+
* Returns synchronously with `{ respawned: true }` after spawning the child
|
|
47
|
+
* and wiring up signal / exit propagation. Callers MUST treat that as a
|
|
48
|
+
* terminal state and not continue executing the normal CLI path; otherwise
|
|
49
|
+
* both the parent and child would race to write to stdout. The opposite
|
|
50
|
+
* (`respawned: false`) is the green-light to run the CLI inline.
|
|
51
|
+
*/
|
|
52
|
+
export declare function maybeRespawnForProxy(deps: RespawnDeps): RespawnDecision;
|
|
53
|
+
//# sourceMappingURL=respawn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"respawn.d.ts","sourceRoot":"","sources":["../../src/cli/respawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG9D;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,0BAA0B,CAAC;AAExD;;;;GAIG;AACH,eAAO,MAAM,WAAW,qBAAqB,CAAC;AAE9C;;;;GAIG;AACH,eAAO,MAAM,UAAU,oBAAoB,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACjE,uEAAuE;IACvE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,yDAAyD;IACzD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,mBAAmB,GAAG,uBAAuB,GAAG,SAAS,CAAC;CAC7F;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,CAiFvE"}
|