@wootsup/yt-builder-mcp 1.3.0 → 1.4.0

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 (133) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/doctor-command.d.ts +21 -0
  3. package/dist/cli/doctor-command.d.ts.map +1 -0
  4. package/dist/cli/doctor-command.js +111 -0
  5. package/dist/cli/doctor-command.js.map +1 -0
  6. package/dist/cli/invocation-decision.d.ts.map +1 -1
  7. package/dist/cli/invocation-decision.js +2 -0
  8. package/dist/cli/invocation-decision.js.map +1 -1
  9. package/dist/client.d.ts +14 -0
  10. package/dist/client.d.ts.map +1 -1
  11. package/dist/client.js +9 -0
  12. package/dist/client.js.map +1 -1
  13. package/dist/diagnostics/ca-trust.d.ts +16 -0
  14. package/dist/diagnostics/ca-trust.d.ts.map +1 -0
  15. package/dist/diagnostics/ca-trust.js +54 -0
  16. package/dist/diagnostics/ca-trust.js.map +1 -0
  17. package/dist/diagnostics/diagnose-network-error.d.ts +37 -0
  18. package/dist/diagnostics/diagnose-network-error.d.ts.map +1 -0
  19. package/dist/diagnostics/diagnose-network-error.js +158 -0
  20. package/dist/diagnostics/diagnose-network-error.js.map +1 -0
  21. package/dist/diagnostics/doctor.d.ts +62 -0
  22. package/dist/diagnostics/doctor.d.ts.map +1 -0
  23. package/dist/diagnostics/doctor.js +165 -0
  24. package/dist/diagnostics/doctor.js.map +1 -0
  25. package/dist/gateway/essentials.d.ts +1 -1
  26. package/dist/gateway/essentials.d.ts.map +1 -1
  27. package/dist/gateway/essentials.js +5 -0
  28. package/dist/gateway/essentials.js.map +1 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +35 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/install-skill.d.ts +1 -1
  33. package/dist/install-skill.js +1 -1
  34. package/dist/net/extra-headers.d.ts +66 -0
  35. package/dist/net/extra-headers.d.ts.map +1 -0
  36. package/dist/net/extra-headers.js +164 -0
  37. package/dist/net/extra-headers.js.map +1 -0
  38. package/dist/net/internal-host.d.ts +45 -0
  39. package/dist/net/internal-host.d.ts.map +1 -0
  40. package/dist/net/internal-host.js +164 -0
  41. package/dist/net/internal-host.js.map +1 -0
  42. package/dist/net/proxy-dispatcher.d.ts +40 -0
  43. package/dist/net/proxy-dispatcher.d.ts.map +1 -0
  44. package/dist/net/proxy-dispatcher.js +65 -0
  45. package/dist/net/proxy-dispatcher.js.map +1 -0
  46. package/dist/proxy/bridge.d.ts +18 -11
  47. package/dist/proxy/bridge.d.ts.map +1 -1
  48. package/dist/proxy/bridge.js +30 -4
  49. package/dist/proxy/bridge.js.map +1 -1
  50. package/dist/setup-ca-env.d.ts +40 -0
  51. package/dist/setup-ca-env.d.ts.map +1 -0
  52. package/dist/setup-ca-env.js +58 -0
  53. package/dist/setup-ca-env.js.map +1 -0
  54. package/dist/setup-ca-reprobe.d.ts +38 -0
  55. package/dist/setup-ca-reprobe.d.ts.map +1 -0
  56. package/dist/setup-ca-reprobe.js +68 -0
  57. package/dist/setup-ca-reprobe.js.map +1 -0
  58. package/dist/setup-cli.d.ts +37 -2
  59. package/dist/setup-cli.d.ts.map +1 -1
  60. package/dist/setup-cli.js +178 -4
  61. package/dist/setup-cli.js.map +1 -1
  62. package/dist/setup-npx-spec.d.ts +44 -0
  63. package/dist/setup-npx-spec.d.ts.map +1 -0
  64. package/dist/setup-npx-spec.js +66 -0
  65. package/dist/setup-npx-spec.js.map +1 -0
  66. package/dist/setup-prompts.d.ts +14 -1
  67. package/dist/setup-prompts.d.ts.map +1 -1
  68. package/dist/setup-prompts.js +53 -1
  69. package/dist/setup-prompts.js.map +1 -1
  70. package/dist/setup-wizard-defaults.d.ts.map +1 -1
  71. package/dist/setup-wizard-defaults.js +29 -5
  72. package/dist/setup-wizard-defaults.js.map +1 -1
  73. package/dist/setup-wizard-handshake.d.ts +4 -4
  74. package/dist/setup-wizard-handshake.d.ts.map +1 -1
  75. package/dist/setup-wizard-handshake.js +46 -12
  76. package/dist/setup-wizard-handshake.js.map +1 -1
  77. package/dist/setup-wizard-types.d.ts +81 -0
  78. package/dist/setup-wizard-types.d.ts.map +1 -1
  79. package/dist/setup-wizard.d.ts +2 -2
  80. package/dist/setup-wizard.d.ts.map +1 -1
  81. package/dist/setup-wizard.js +133 -18
  82. package/dist/setup-wizard.js.map +1 -1
  83. package/dist/sites/client-pool.d.ts +8 -1
  84. package/dist/sites/client-pool.d.ts.map +1 -1
  85. package/dist/sites/client-pool.js +13 -1
  86. package/dist/sites/client-pool.js.map +1 -1
  87. package/dist/tools/elements/builders.d.ts.map +1 -1
  88. package/dist/tools/elements/builders.js +4 -2
  89. package/dist/tools/elements/builders.js.map +1 -1
  90. package/dist/tools/elements/handlers.d.ts +2 -1
  91. package/dist/tools/elements/handlers.d.ts.map +1 -1
  92. package/dist/tools/elements/handlers.js +3 -22
  93. package/dist/tools/elements/handlers.js.map +1 -1
  94. package/dist/tools/format/health-format.d.ts +3 -0
  95. package/dist/tools/format/health-format.d.ts.map +1 -1
  96. package/dist/tools/format/health-format.js +21 -4
  97. package/dist/tools/format/health-format.js.map +1 -1
  98. package/dist/tools/health.d.ts.map +1 -1
  99. package/dist/tools/health.js +32 -0
  100. package/dist/tools/health.js.map +1 -1
  101. package/dist/tools/pages/builders.d.ts.map +1 -1
  102. package/dist/tools/pages/builders.js +78 -27
  103. package/dist/tools/pages/builders.js.map +1 -1
  104. package/dist/tools/pages/handlers-read.d.ts +36 -5
  105. package/dist/tools/pages/handlers-read.d.ts.map +1 -1
  106. package/dist/tools/pages/handlers-read.js +217 -34
  107. package/dist/tools/pages/handlers-read.js.map +1 -1
  108. package/dist/tools/pages/schemas.d.ts +20 -5
  109. package/dist/tools/pages/schemas.d.ts.map +1 -1
  110. package/dist/tools/pages/schemas.js +44 -6
  111. package/dist/tools/pages/schemas.js.map +1 -1
  112. package/dist/tools/shared-schemas.d.ts +3 -0
  113. package/dist/tools/shared-schemas.d.ts.map +1 -1
  114. package/dist/tools/shared-schemas.js +28 -0
  115. package/dist/tools/shared-schemas.js.map +1 -1
  116. package/dist/tools/sources/builders.d.ts.map +1 -1
  117. package/dist/tools/sources/builders.js +30 -5
  118. package/dist/tools/sources/builders.js.map +1 -1
  119. package/dist/tools/sources/handlers.d.ts +9 -1
  120. package/dist/tools/sources/handlers.d.ts.map +1 -1
  121. package/dist/tools/sources/handlers.js +62 -12
  122. package/dist/tools/sources/handlers.js.map +1 -1
  123. package/dist/tools/sparse-fields.d.ts +50 -0
  124. package/dist/tools/sparse-fields.d.ts.map +1 -1
  125. package/dist/tools/sparse-fields.js +107 -0
  126. package/dist/tools/sparse-fields.js.map +1 -1
  127. package/dist/update/update-check.d.ts +56 -0
  128. package/dist/update/update-check.d.ts.map +1 -0
  129. package/dist/update/update-check.js +155 -0
  130. package/dist/update/update-check.js.map +1 -0
  131. package/manifest.json +1 -1
  132. package/package.json +2 -1
  133. package/skills/yt-builder-mcp/SKILL.md +13 -12
package/README.md CHANGED
@@ -117,7 +117,7 @@ Copies the bundled `skills/yootheme-builder/` folder into
117
117
  other AI clients pick it up automatically.
118
118
 
119
119
  `~/.claude/skills/` is the **universal marker path** recognised by
120
- Claude Desktop and (per the same convention as `@wootsup/mcp`) other
120
+ Claude Desktop and (per the same convention as `@wootsup/apimapper-mcp`) other
121
121
  AI clients that follow the `~/AGENTS.md` discovery protocol. The
122
122
  single location keeps the skill discoverable across every supported
123
123
  client without per-client write logic.
@@ -0,0 +1,21 @@
1
+ import { type DoctorDeps } from '../diagnostics/doctor.js';
2
+ interface ParsedDoctorArgs {
3
+ url?: string;
4
+ token?: string;
5
+ }
6
+ /** Parse `--url <x> --token <y>` from the doctor argv tail. */
7
+ export declare function parseDoctorArgs(argv: readonly string[]): ParsedDoctorArgs;
8
+ export interface DoctorCommandDeps {
9
+ deps?: DoctorDeps;
10
+ log?: (line: string) => void;
11
+ env?: NodeJS.ProcessEnv;
12
+ }
13
+ /**
14
+ * `yt-builder-mcp doctor [--url <site> --token <key>]` — run the self-diagnostic
15
+ * and print an actionable report. Falls back to YTB_MCP_SITE_URL /
16
+ * YTB_MCP_BEARER_TOKEN when the flags are omitted (so it works against an
17
+ * already-configured server entry). Returns 0 when all critical checks pass.
18
+ */
19
+ export declare function doctorCommand(argv: readonly string[], overrides?: DoctorCommandDeps): Promise<number>;
20
+ export {};
21
+ //# sourceMappingURL=doctor-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-command.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-command.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiC,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAa1F,UAAU,gBAAgB;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,gBAAgB,CAczE;AA4DD,MAAM,WAAW,iBAAiB;IAC9B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,GAAE,iBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB/G"}
@@ -0,0 +1,111 @@
1
+ // packages/mcp/src/cli/doctor-command.ts
2
+ import { installGlobalProxyDispatcher } from '../net/proxy-dispatcher.js';
3
+ import { SERVER_VERSION } from '../server.js';
4
+ import { fetchLatestFromNpm } from '../update/update-check.js';
5
+ import { runDoctor, formatDoctorReport } from '../diagnostics/doctor.js';
6
+ const MCP_PACKAGE_NAME = '@wootsup/yt-builder-mcp';
7
+ const PROBE_TIMEOUT_MS = 8_000;
8
+ /** WP + Joomla health endpoints — doctor is platform-agnostic. */
9
+ const HEALTH_PATHS = ['/wp-json/yt-builder-mcp/v1/health', '/api/index.php/v1/yt-builder-mcp/health'];
10
+ const BEARER_PATHS = ['/wp-json/yt-builder-mcp/v1/etag', '/api/index.php/v1/yt-builder-mcp/etag'];
11
+ function joinUrl(base, path) {
12
+ return base.replace(/\/+$/, '') + path;
13
+ }
14
+ /** Parse `--url <x> --token <y>` from the doctor argv tail. */
15
+ export function parseDoctorArgs(argv) {
16
+ const parsed = {};
17
+ for (let i = 0; i < argv.length; i++) {
18
+ const flag = argv[i];
19
+ const next = argv[i + 1];
20
+ if (flag === '--url' && next !== undefined) {
21
+ parsed.url = next;
22
+ i++;
23
+ }
24
+ else if (flag === '--token' && next !== undefined) {
25
+ parsed.token = next;
26
+ i++;
27
+ }
28
+ }
29
+ return parsed;
30
+ }
31
+ /** Real network probes — try the WP path, then the Joomla path. */
32
+ function defaultDoctorDeps() {
33
+ return {
34
+ async probeHealth(url) {
35
+ let lastError = null;
36
+ for (const path of HEALTH_PATHS) {
37
+ try {
38
+ const res = await fetch(joinUrl(url, path), { signal: AbortSignal.timeout(PROBE_TIMEOUT_MS) });
39
+ if (res.ok) {
40
+ const body = await res.json().catch(() => ({}));
41
+ const pluginVersion = body !== null && typeof body === 'object' && typeof body.plugin_version === 'string'
42
+ ? body.plugin_version
43
+ : undefined;
44
+ return { ok: true, pluginVersion };
45
+ }
46
+ lastError = { status: res.status };
47
+ }
48
+ catch (err) {
49
+ lastError = err;
50
+ }
51
+ }
52
+ return { ok: false, error: lastError };
53
+ },
54
+ async probeBearer(url, token) {
55
+ let lastError = null;
56
+ let lastStatus;
57
+ for (const path of BEARER_PATHS) {
58
+ try {
59
+ const res = await fetch(joinUrl(url, path), {
60
+ headers: { Authorization: `Bearer ${token}` },
61
+ signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
62
+ });
63
+ if (res.ok)
64
+ return { ok: true };
65
+ lastStatus = res.status;
66
+ // A 404 just means "wrong platform path" — keep trying.
67
+ if (res.status !== 404)
68
+ return { ok: false, status: res.status };
69
+ }
70
+ catch (err) {
71
+ lastError = err;
72
+ }
73
+ }
74
+ return { ok: false, status: lastStatus, error: lastError };
75
+ },
76
+ // G-D #10 — surface the RAW registry error (not swallowed) so doctor can
77
+ // run the CA classifier on a TLS-inspection failure of the npm registry.
78
+ async probeRegistry() {
79
+ try {
80
+ const res = await fetch('https://registry.npmjs.org/-/ping', {
81
+ signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
82
+ });
83
+ return res.ok ? { ok: true } : { ok: false, error: { status: res.status } };
84
+ }
85
+ catch (err) {
86
+ return { ok: false, error: err };
87
+ }
88
+ },
89
+ fetchLatest: (pkg) => fetchLatestFromNpm(pkg),
90
+ };
91
+ }
92
+ /**
93
+ * `yt-builder-mcp doctor [--url <site> --token <key>]` — run the self-diagnostic
94
+ * and print an actionable report. Falls back to YTB_MCP_SITE_URL /
95
+ * YTB_MCP_BEARER_TOKEN when the flags are omitted (so it works against an
96
+ * already-configured server entry). Returns 0 when all critical checks pass.
97
+ */
98
+ export async function doctorCommand(argv, overrides = {}) {
99
+ const env = overrides.env ?? process.env;
100
+ const log = overrides.log ?? ((line) => process.stdout.write(`${line}\n`));
101
+ const deps = overrides.deps ?? defaultDoctorDeps();
102
+ // Honor a corporate proxy for doctor's own probes (CA via NODE_EXTRA_CA_CERTS).
103
+ installGlobalProxyDispatcher({ env });
104
+ const parsed = parseDoctorArgs(argv);
105
+ const url = parsed.url ?? env.YTB_MCP_SITE_URL ?? env.YTB_MCP_WP_URL;
106
+ const token = parsed.token ?? env.YTB_MCP_BEARER_TOKEN;
107
+ const report = await runDoctor({ url, token, env, currentVersion: SERVER_VERSION, packageName: MCP_PACKAGE_NAME }, deps);
108
+ log(formatDoctorReport(report));
109
+ return report.ok ? 0 : 1;
110
+ }
111
+ //# sourceMappingURL=doctor-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-command.js","sourceRoot":"","sources":["../../src/cli/doctor-command.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"invocation-decision.d.ts","sourceRoot":"","sources":["../../src/cli/invocation-decision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAoBjD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAKxB,CAAC;AAEZ,qDAAqD;AACrD,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEzD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAElE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,UAAU,EAAE,OAAO,GAAG,SAAS,GAChC,gBAAgB,CAMlB"}
1
+ {"version":3,"file":"invocation-decision.d.ts","sourceRoot":"","sources":["../../src/cli/invocation-decision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAsBjD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAKxB,CAAC;AAEZ,qDAAqD;AACrD,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEzD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAElE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,UAAU,EAAE,OAAO,GAAG,SAAS,GAChC,gBAAgB,CAMlB"}
@@ -31,6 +31,8 @@ export const KNOWN_SUBCOMMANDS = Object.freeze(new Set([
31
31
  'setup',
32
32
  'install-skill',
33
33
  'install',
34
+ // Self-diagnostic: Node version, TLS chain, proxy, reachability, bearer.
35
+ 'doctor',
34
36
  // Reverse-of-setup: remove our server entry + optional skill.
35
37
  'uninstall',
36
38
  'remove',
@@ -1 +1 @@
1
- {"version":3,"file":"invocation-decision.js","sourceRoot":"","sources":["../../src/cli/invocation-decision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAwB,MAAM,CAAC,MAAM,CAC/D,IAAI,GAAG,CAAS;IACZ,OAAO;IACP,eAAe;IACf,SAAS;IACT,8DAA8D;IAC9D,WAAW;IACX,QAAQ;IACR,iCAAiC;IACjC,UAAU;IACV,YAAY;IACZ,aAAa;IACb,aAAa;IACb,WAAW;IACX,MAAM;IACN,QAAQ;IACR,IAAI;IACJ,WAAW;IACX,IAAI;CACP,CAAC,CACL,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAW;IACxC,sEAAsE;IACtE,oDAAoD;IACpD,sDAAsD;IACtD,4BAA4B;CAC/B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAKZ;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAuB;IACrD,OAAO,GAAG,KAAK,SAAS,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAC5B,UAA8B,EAC9B,UAA+B;IAE/B,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,oEAAoE;IACpE,OAAO,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnD,CAAC"}
1
+ {"version":3,"file":"invocation-decision.js","sourceRoot":"","sources":["../../src/cli/invocation-decision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAwB,MAAM,CAAC,MAAM,CAC/D,IAAI,GAAG,CAAS;IACZ,OAAO;IACP,eAAe;IACf,SAAS;IACT,yEAAyE;IACzE,QAAQ;IACR,8DAA8D;IAC9D,WAAW;IACX,QAAQ;IACR,iCAAiC;IACjC,UAAU;IACV,YAAY;IACZ,aAAa;IACb,aAAa;IACb,WAAW;IACX,MAAM;IACN,QAAQ;IACR,IAAI;IACJ,WAAW;IACX,IAAI;CACP,CAAC,CACL,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAW;IACxC,sEAAsE;IACtE,oDAAoD;IACpD,sDAAsD;IACtD,4BAA4B;CAC/B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAKZ;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAuB;IACrD,OAAO,GAAG,KAAK,SAAS,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAC5B,UAA8B,EAC9B,UAA+B;IAE/B,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,oEAAoE;IACpE,OAAO,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnD,CAAC"}
package/dist/client.d.ts CHANGED
@@ -31,6 +31,13 @@ export interface LegacyRestClientOptions {
31
31
  readonly timeoutMs?: number;
32
32
  /** Injected for tests. Defaults to `globalThis.fetch`. */
33
33
  readonly fetch?: typeof fetch;
34
+ /**
35
+ * Extra headers merged into EVERY outbound request (Glöckle gap #14 —
36
+ * HTTP Basic-Auth / WAF cookie / corporate gateway secret). The Bearer
37
+ * (and any per-request header) always wins on collision; these only fill
38
+ * gaps. Source: `YTB_MCP_EXTRA_HEADERS` (see `net/extra-headers.ts`).
39
+ */
40
+ readonly extraHeaders?: Record<string, string>;
34
41
  }
35
42
  /**
36
43
  * Platform-aware options shape (Wave G.0+).
@@ -43,6 +50,12 @@ export interface PlatformRestClientOptions {
43
50
  readonly timeoutMs?: number;
44
51
  /** Injected for tests. Defaults to `globalThis.fetch`. */
45
52
  readonly fetch?: typeof fetch;
53
+ /**
54
+ * Extra headers merged into EVERY outbound request (Glöckle gap #14).
55
+ * Bearer + per-request headers always win on collision. Source:
56
+ * `YTB_MCP_EXTRA_HEADERS` (see `net/extra-headers.ts`).
57
+ */
58
+ readonly extraHeaders?: Record<string, string>;
46
59
  }
47
60
  /** Discriminated union: callers pick whichever shape suits them. */
48
61
  export type RestClientOptions = LegacyRestClientOptions | PlatformRestClientOptions;
@@ -62,6 +75,7 @@ export declare class RestClient {
62
75
  private readonly bearerToken;
63
76
  private readonly timeoutMs;
64
77
  private readonly fetchImpl;
78
+ private readonly extraHeaders;
65
79
  constructor(options: RestClientOptions);
66
80
  /** Expose the underlying platform (used by tools that need restNamespacePath/kind). */
67
81
  getPlatform(): Platform;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,+BAAgC,CAAC;AAEjE;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACjC;AAED;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACtC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACjC;AAED,oEAAoE;AACpE,MAAM,MAAM,iBAAiB,GAAG,uBAAuB,GAAG,yBAAyB,CAAC;AAEpF,MAAM,WAAW,cAAc;IAC3B,6DAA6D;IAC7D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB;IACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,qBAAqB;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,4BAA4B;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CACjC;AAED,qBAAa,UAAU;IACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,OAAO,EAAE,iBAAiB;IAYtC,uFAAuF;IACvF,WAAW,IAAI,QAAQ;IAIvB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;IAIxE,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;IAIzE,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;IAIxE,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;IAIrE,OAAO,CAAC,CAAC,GAAG,OAAO,EACrB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,cAAmB,GAC7B,OAAO,CAAC,CAAC,CAAC;IAgDb,OAAO,CAAC,QAAQ;CAInB;AAgCD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAczD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -16,6 +16,7 @@
16
16
  * @license MIT
17
17
  */
18
18
  import { NetworkError, RestError } from './errors.js';
19
+ import { mergeExtraHeaders } from './net/extra-headers.js';
19
20
  import { WordPressPlatform, WORDPRESS_REST_NAMESPACE_PATH } from './platform/index.js';
20
21
  /**
21
22
  * Canonical WordPress REST-namespace path. Re-exported for backward
@@ -28,6 +29,7 @@ export class RestClient {
28
29
  bearerToken;
29
30
  timeoutMs;
30
31
  fetchImpl;
32
+ extraHeaders;
31
33
  constructor(options) {
32
34
  // Dual-form: accept either a `Platform` or a legacy `baseUrl`.
33
35
  const platform = isPlatformOptions(options)
@@ -38,6 +40,7 @@ export class RestClient {
38
40
  this.bearerToken = options.bearerToken;
39
41
  this.timeoutMs = options.timeoutMs ?? 15_000;
40
42
  this.fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);
43
+ this.extraHeaders = options.extraHeaders ?? {};
41
44
  }
42
45
  /** Expose the underlying platform (used by tools that need restNamespacePath/kind). */
43
46
  getPlatform() {
@@ -70,6 +73,12 @@ export class RestClient {
70
73
  headers['Content-Type'] = 'application/json';
71
74
  init.body = JSON.stringify(options.body);
72
75
  }
76
+ // Glöckle gap #14 — merge corporate extra headers UNDER the
77
+ // authoritative set so the Bearer (and every header above) always wins
78
+ // on collision; extras only fill gaps (Basic-Auth / WAF cookie / etc.).
79
+ if (Object.keys(this.extraHeaders).length > 0) {
80
+ init.headers = mergeExtraHeaders(headers, this.extraHeaders);
81
+ }
73
82
  const controller = new AbortController();
74
83
  const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
75
84
  if (options.signal !== undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * True when `err` (or anything in its `.cause` / `AggregateError.errors`
3
+ * chain) carries a TLS chain-of-trust failure code — the signature of a
4
+ * corporate TLS-inspection proxy injecting its own root CA. Pure; reuses the
5
+ * same walker + code set as {@link diagnoseNetworkError}.
6
+ */
7
+ export declare function isCaTrustError(err: unknown): boolean;
8
+ /** Node version that first reads the OS trust store via `--use-system-ca`. */
9
+ export declare const SYSTEM_CA_NODE_FLOOR: readonly [number, number, number];
10
+ /**
11
+ * Does `nodeVersion` (default `process.version`) support `--use-system-ca`?
12
+ * A real numeric triple compare against {@link SYSTEM_CA_NODE_FLOOR} —
13
+ * fail-closed (`false`) on unparseable input.
14
+ */
15
+ export declare function supportsSystemCa(nodeVersion?: string): boolean;
16
+ //# sourceMappingURL=ca-trust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ca-trust.d.ts","sourceRoot":"","sources":["../../src/diagnostics/ca-trust.ts"],"names":[],"mappings":"AAqBA;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEpD;AAED,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAe,CAAC;AAQnF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,GAAE,MAAwB,GAAG,OAAO,CAS/E"}
@@ -0,0 +1,54 @@
1
+ // packages/mcp/src/diagnostics/ca-trust.ts
2
+ /**
3
+ * Shared helpers for the corporate TLS-inspection (CA-trust) install path.
4
+ *
5
+ * G-D #6/#7 — two questions the wizard + CLI both need answered:
6
+ * 1. "Did this connection fail because of a TLS-inspection root CA?"
7
+ * → {@link isCaTrustError}, classifying against the canonical
8
+ * {@link CA_TRUST_CODES} (no duplicate set).
9
+ * 2. "Can this Node read the OS trust store natively (`--use-system-ca`)?"
10
+ * → {@link supportsSystemCa}, a real numeric semver compare against the
11
+ * backport floor — never a string comparison.
12
+ *
13
+ * Node's `--use-system-ca` (reads Windows CryptoAPI + macOS Keychain) was
14
+ * stabilised on the 24.x line and backported to 22.15.0, so the floor is
15
+ * 22.15.0. Below that floor, a corporate CA must be supplied as a `.pem`
16
+ * via NODE_EXTRA_CA_CERTS. Neither path ever disables TLS verification.
17
+ */
18
+ import { CA_TRUST_CODES, collectCodes } from './diagnose-network-error.js';
19
+ /**
20
+ * True when `err` (or anything in its `.cause` / `AggregateError.errors`
21
+ * chain) carries a TLS chain-of-trust failure code — the signature of a
22
+ * corporate TLS-inspection proxy injecting its own root CA. Pure; reuses the
23
+ * same walker + code set as {@link diagnoseNetworkError}.
24
+ */
25
+ export function isCaTrustError(err) {
26
+ return collectCodes(err).some((c) => CA_TRUST_CODES.has(c));
27
+ }
28
+ /** Node version that first reads the OS trust store via `--use-system-ca`. */
29
+ export const SYSTEM_CA_NODE_FLOOR = [22, 15, 0];
30
+ function parseNodeVersion(v) {
31
+ const m = /^v?(\d+)\.(\d+)\.(\d+)/.exec(v);
32
+ if (m === null)
33
+ return null;
34
+ return [Number(m[1]), Number(m[2]), Number(m[3])];
35
+ }
36
+ /**
37
+ * Does `nodeVersion` (default `process.version`) support `--use-system-ca`?
38
+ * A real numeric triple compare against {@link SYSTEM_CA_NODE_FLOOR} —
39
+ * fail-closed (`false`) on unparseable input.
40
+ */
41
+ export function supportsSystemCa(nodeVersion = process.version) {
42
+ const v = parseNodeVersion(nodeVersion);
43
+ if (v === null)
44
+ return false;
45
+ const floor = SYSTEM_CA_NODE_FLOOR;
46
+ for (let i = 0; i < 3; i++) {
47
+ if (v[i] > floor[i])
48
+ return true;
49
+ if (v[i] < floor[i])
50
+ return false;
51
+ }
52
+ return true; // exactly equal to the floor
53
+ }
54
+ //# sourceMappingURL=ca-trust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ca-trust.js","sourceRoot":"","sources":["../../src/diagnostics/ca-trust.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAE3C;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACvC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,oBAAoB,GAAsC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAEnF,SAAS,gBAAgB,CAAC,CAAS;IAC/B,MAAM,CAAC,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,cAAsB,OAAO,CAAC,OAAO;IAClE,MAAM,CAAC,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC7B,MAAM,KAAK,GAAG,oBAAoB,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,CAAE;YAAE,OAAO,IAAI,CAAC;QACnC,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,CAAE;YAAE,OAAO,KAAK,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,6BAA6B;AAC9C,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * A human-actionable diagnosis of an outbound-connection failure.
3
+ *
4
+ * The Glöckle corporate stress-test failed with an opaque 30-second timeout
5
+ * that "looked like an auth or server problem" when the real cause was a
6
+ * TLS-inspection root CA. Mapping the low-level `.code` to a copy-pasteable fix
7
+ * is the difference between a 5-minute self-serve and a support ticket.
8
+ */
9
+ export interface NetworkDiagnosis {
10
+ /** The matched low-level code, e.g. `SELF_SIGNED_CERT_IN_CHAIN`, `ENOTFOUND`, `HTTP_401`. */
11
+ readonly code: string;
12
+ /** One-line summary of what went wrong. */
13
+ readonly summary: string;
14
+ /** Actionable, copy-pasteable fix. NEVER suggests disabling TLS verification. */
15
+ readonly fix: string;
16
+ }
17
+ /**
18
+ * TLS chain-of-trust failures — the corporate-CA / TLS-inspection signature.
19
+ *
20
+ * Exported so the wizard's CA-detection path (`isCaTrustError`) classifies an
21
+ * outbound failure against the SAME canonical set — there is exactly one
22
+ * definition of "this is a TLS-inspection CA problem" in the package.
23
+ */
24
+ export declare const CA_TRUST_CODES: ReadonlySet<string>;
25
+ /**
26
+ * Walk `err`, its `.cause` chain, and any `AggregateError.errors`, collecting
27
+ * every `.code` string. A Node global-fetch failure (`TypeError: fetch failed`)
28
+ * hides the real TLS/socket code one or more `.cause` levels down.
29
+ */
30
+ export declare function collectCodes(err: unknown, depth?: number): string[];
31
+ /**
32
+ * Classify an outbound-connection failure into an actionable diagnosis, or
33
+ * `null` when nothing specific matches (the caller should fall back to the raw
34
+ * error message). Pure — `env` is injectable for tests.
35
+ */
36
+ export declare function diagnoseNetworkError(err: unknown, env?: NodeJS.ProcessEnv): NetworkDiagnosis | null;
37
+ //# sourceMappingURL=diagnose-network-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose-network-error.d.ts","sourceRoot":"","sources":["../../src/diagnostics/diagnose-network-error.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC7B,6FAA6F;IAC7F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,CAO7C,CAAC;AAmCH;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,MAAM,EAAE,CAa9D;AAOD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAChC,GAAG,EAAE,OAAO,EACZ,GAAG,GAAE,MAAM,CAAC,UAAwB,GACrC,gBAAgB,GAAG,IAAI,CAqFzB"}
@@ -0,0 +1,158 @@
1
+ // packages/mcp/src/diagnostics/diagnose-network-error.ts
2
+ /**
3
+ * TLS chain-of-trust failures — the corporate-CA / TLS-inspection signature.
4
+ *
5
+ * Exported so the wizard's CA-detection path (`isCaTrustError`) classifies an
6
+ * outbound failure against the SAME canonical set — there is exactly one
7
+ * definition of "this is a TLS-inspection CA problem" in the package.
8
+ */
9
+ export const CA_TRUST_CODES = new Set([
10
+ 'SELF_SIGNED_CERT_IN_CHAIN',
11
+ 'DEPTH_ZERO_SELF_SIGNED_CERT',
12
+ 'UNABLE_TO_VERIFY_LEAF_SIGNATURE',
13
+ 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY',
14
+ 'SELF_SIGNED_CERT',
15
+ 'CERT_UNTRUSTED',
16
+ ]);
17
+ const TIMEOUT_CODES = new Set([
18
+ 'UND_ERR_CONNECT_TIMEOUT',
19
+ 'ETIMEDOUT',
20
+ 'UND_ERR_HEADERS_TIMEOUT',
21
+ 'UND_ERR_BODY_TIMEOUT',
22
+ ]);
23
+ const DNS_CODES = new Set(['ENOTFOUND', 'EAI_AGAIN']);
24
+ const CA_FIX = 'On Node ≥ 22.15, the zero-export fix is `npx -y @wootsup/yt-builder-mcp setup --use-system-ca` (Node reads your OS ' +
25
+ 'trust store / Windows cert store / macOS Keychain). Otherwise export your corporate/proxy root CA to a .pem file and ' +
26
+ 'set NODE_EXTRA_CA_CERTS=/path/to/corp-root-ca.pem in the server entry\'s env block (re-run setup with `--ca <path>`, ' +
27
+ 'or `… doctor` to detect it), then restart your AI client. Never disable TLS verification.';
28
+ /** Read a string `.code` off an unknown value, or null. */
29
+ function codeOf(value) {
30
+ if (value !== null && typeof value === 'object' && 'code' in value) {
31
+ const c = value.code;
32
+ if (typeof c === 'string' && c !== '')
33
+ return c;
34
+ }
35
+ return null;
36
+ }
37
+ /** Read a numeric `.status` off an unknown value (RestError-like), or null. */
38
+ function statusOf(value) {
39
+ if (value !== null && typeof value === 'object' && 'status' in value) {
40
+ const s = value.status;
41
+ if (typeof s === 'number' && Number.isFinite(s))
42
+ return s;
43
+ }
44
+ return null;
45
+ }
46
+ /**
47
+ * Walk `err`, its `.cause` chain, and any `AggregateError.errors`, collecting
48
+ * every `.code` string. A Node global-fetch failure (`TypeError: fetch failed`)
49
+ * hides the real TLS/socket code one or more `.cause` levels down.
50
+ */
51
+ export function collectCodes(err, depth = 0) {
52
+ if (err === null || typeof err !== 'object' || depth > 6)
53
+ return [];
54
+ const codes = [];
55
+ const c = codeOf(err);
56
+ if (c !== null)
57
+ codes.push(c);
58
+ if ('cause' in err)
59
+ codes.push(...collectCodes(err.cause, depth + 1));
60
+ if ('errors' in err) {
61
+ const list = err.errors;
62
+ if (Array.isArray(list)) {
63
+ for (const inner of list)
64
+ codes.push(...collectCodes(inner, depth + 1));
65
+ }
66
+ }
67
+ return codes;
68
+ }
69
+ /** Does the environment have any forward-proxy configured? */
70
+ function configuredProxy(env) {
71
+ return env.HTTPS_PROXY ?? env.https_proxy ?? env.HTTP_PROXY ?? env.http_proxy ?? null;
72
+ }
73
+ /**
74
+ * Classify an outbound-connection failure into an actionable diagnosis, or
75
+ * `null` when nothing specific matches (the caller should fall back to the raw
76
+ * error message). Pure — `env` is injectable for tests.
77
+ */
78
+ export function diagnoseNetworkError(err, env = process.env) {
79
+ // HTTP-status failures (RestError-like) take precedence — the request DID
80
+ // reach the server, so it is not a transport problem.
81
+ const status = statusOf(err);
82
+ if (status === 401 || status === 403) {
83
+ return {
84
+ code: `HTTP_${status}`,
85
+ summary: `The site rejected the bearer token (HTTP ${status}).`,
86
+ fix: 'Re-issue an MCP key in the plugin admin (YT Builder MCP → Keys) and update YTB_MCP_BEARER_TOKEN, then restart.',
87
+ };
88
+ }
89
+ if (status === 404) {
90
+ return {
91
+ code: 'HTTP_404',
92
+ summary: 'The MCP endpoint was not found (HTTP 404).',
93
+ fix: 'Confirm the plugin is installed + active and YTB_MCP_SITE_URL points at the site root (not wp-admin). Run `… doctor`.',
94
+ };
95
+ }
96
+ if (status !== null && status >= 500) {
97
+ return {
98
+ code: `HTTP_${status}`,
99
+ summary: `The site returned a server error (HTTP ${status}).`,
100
+ fix: 'Check the site\'s PHP error log; retry once it recovers. If it persists, the plugin may have crashed on this request.',
101
+ };
102
+ }
103
+ const codes = collectCodes(err);
104
+ const has = (set) => codes.find((c) => set.has(c)) ?? null;
105
+ const caCode = has(CA_TRUST_CODES);
106
+ if (caCode !== null) {
107
+ return {
108
+ code: caCode,
109
+ summary: 'The TLS certificate could not be verified — the signature of a corporate TLS-inspection proxy that injects its own root CA.',
110
+ fix: CA_FIX,
111
+ };
112
+ }
113
+ if (codes.includes('CERT_HAS_EXPIRED')) {
114
+ return {
115
+ code: 'CERT_HAS_EXPIRED',
116
+ summary: 'The TLS certificate presented for the site has expired.',
117
+ fix: 'Renew the site certificate. If a corporate proxy presents it, update the CA in NODE_EXTRA_CA_CERTS.',
118
+ };
119
+ }
120
+ const proxy = configuredProxy(env);
121
+ if (codes.includes('ECONNREFUSED')) {
122
+ return proxy !== null
123
+ ? {
124
+ code: 'ECONNREFUSED',
125
+ summary: `The configured proxy (${proxy}) refused the connection.`,
126
+ fix: `Verify HTTPS_PROXY=${proxy} is correct and reachable, and set NO_PROXY for internal hosts that must bypass it.`,
127
+ }
128
+ : {
129
+ code: 'ECONNREFUSED',
130
+ summary: 'The target host refused the connection.',
131
+ fix: 'Check YTB_MCP_SITE_URL is correct and the site is up and reachable from this machine.',
132
+ };
133
+ }
134
+ const timeoutCode = has(TIMEOUT_CODES);
135
+ if (timeoutCode !== null) {
136
+ return proxy !== null
137
+ ? {
138
+ code: timeoutCode,
139
+ summary: `The connection through the proxy (${proxy}) timed out.`,
140
+ fix: `Confirm HTTPS_PROXY=${proxy} can reach the site, and set NO_PROXY for internal hosts. Run \`… doctor\`.`,
141
+ }
142
+ : {
143
+ code: timeoutCode,
144
+ summary: 'The connection timed out.',
145
+ fix: 'The site may be internal (VPN needed) or require a proxy (set HTTPS_PROXY). Run `npx -y @wootsup/yt-builder-mcp doctor` to diagnose.',
146
+ };
147
+ }
148
+ const dnsCode = has(DNS_CODES);
149
+ if (dnsCode !== null) {
150
+ return {
151
+ code: dnsCode,
152
+ summary: 'DNS lookup failed for the site host.',
153
+ fix: 'Check the host in YTB_MCP_SITE_URL is spelled correctly and resolvable from this machine (VPN/DNS).',
154
+ };
155
+ }
156
+ return null;
157
+ }
158
+ //# sourceMappingURL=diagnose-network-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose-network-error.js","sourceRoot":"","sources":["../../src/diagnostics/diagnose-network-error.ts"],"names":[],"mappings":"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"}