@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.
Files changed (38) hide show
  1. package/README.ja.md +19 -0
  2. package/README.md +21 -1
  3. package/dist/cli/doctor.d.ts +20 -0
  4. package/dist/cli/doctor.d.ts.map +1 -1
  5. package/dist/cli/doctor.js +291 -2
  6. package/dist/cli/doctor.js.map +1 -1
  7. package/dist/cli/respawn.d.ts +53 -0
  8. package/dist/cli/respawn.d.ts.map +1 -0
  9. package/dist/cli/respawn.js +120 -0
  10. package/dist/cli/respawn.js.map +1 -0
  11. package/dist/core/feeds/_fetch.d.ts +93 -0
  12. package/dist/core/feeds/_fetch.d.ts.map +1 -0
  13. package/dist/core/feeds/_fetch.js +182 -0
  14. package/dist/core/feeds/_fetch.js.map +1 -0
  15. package/dist/core/feeds/github-api.d.ts.map +1 -1
  16. package/dist/core/feeds/github-api.js +2 -1
  17. package/dist/core/feeds/github-api.js.map +1 -1
  18. package/dist/core/feeds/html-js.d.ts +21 -0
  19. package/dist/core/feeds/html-js.d.ts.map +1 -1
  20. package/dist/core/feeds/html-js.js +39 -1
  21. package/dist/core/feeds/html-js.js.map +1 -1
  22. package/dist/core/feeds/html.d.ts.map +1 -1
  23. package/dist/core/feeds/html.js +2 -1
  24. package/dist/core/feeds/html.js.map +1 -1
  25. package/dist/core/feeds/npm-registry.d.ts.map +1 -1
  26. package/dist/core/feeds/npm-registry.js +2 -1
  27. package/dist/core/feeds/npm-registry.js.map +1 -1
  28. package/dist/core/feeds/rss.d.ts.map +1 -1
  29. package/dist/core/feeds/rss.js +2 -1
  30. package/dist/core/feeds/rss.js.map +1 -1
  31. package/dist/core/proxy.d.ts +87 -0
  32. package/dist/core/proxy.d.ts.map +1 -0
  33. package/dist/core/proxy.js +146 -0
  34. package/dist/core/proxy.js.map +1 -0
  35. package/dist/index.js +17 -4
  36. package/dist/index.js.map +1 -1
  37. package/dist/templates/workflows/watch.yaml +5 -1
  38. 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
 
@@ -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.
@@ -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;AAErC,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;CACrF;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;AA4DD;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,YAAY,CAAC,CA4H/F;AAqCD;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED,eAAO,MAAM,aAAa,EAAE,OAI3B,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"}
@@ -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
- const report = await runDoctorChecks(options);
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}`);
@@ -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"}