mcp-xray-pilot 0.10.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 (153) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +502 -0
  3. package/data/docs/_index.json +533 -0
  4. package/data/docs/basic__api.md +148 -0
  5. package/data/docs/basic__dns.md +366 -0
  6. package/data/docs/basic__fakedns.md +202 -0
  7. package/data/docs/basic__geodata.md +64 -0
  8. package/data/docs/basic__inbound.md +159 -0
  9. package/data/docs/basic__index.md +136 -0
  10. package/data/docs/basic__log.md +67 -0
  11. package/data/docs/basic__metrics.md +262 -0
  12. package/data/docs/basic__observatory.md +115 -0
  13. package/data/docs/basic__outbound.md +164 -0
  14. package/data/docs/basic__policy.md +140 -0
  15. package/data/docs/basic__reverse.md +268 -0
  16. package/data/docs/basic__routing.md +474 -0
  17. package/data/docs/basic__stats.md +61 -0
  18. package/data/docs/basic__transport.md +1283 -0
  19. package/data/docs/features__features_browser_dialer.md +61 -0
  20. package/data/docs/features__features_env.md +66 -0
  21. package/data/docs/features__features_fallback.md +110 -0
  22. package/data/docs/features__features_index.md +17 -0
  23. package/data/docs/features__features_multiple.md +144 -0
  24. package/data/docs/features__features_xtls.md +13 -0
  25. package/data/docs/inbounds__inbounds_dokodemo.md +11 -0
  26. package/data/docs/inbounds__inbounds_http.md +80 -0
  27. package/data/docs/inbounds__inbounds_hysteria.md +60 -0
  28. package/data/docs/inbounds__inbounds_index.md +22 -0
  29. package/data/docs/inbounds__inbounds_shadowsocks.md +118 -0
  30. package/data/docs/inbounds__inbounds_socks.md +87 -0
  31. package/data/docs/inbounds__inbounds_trojan.md +78 -0
  32. package/data/docs/inbounds__inbounds_tun.md +47 -0
  33. package/data/docs/inbounds__inbounds_tunnel.md +86 -0
  34. package/data/docs/inbounds__inbounds_vless.md +135 -0
  35. package/data/docs/inbounds__inbounds_vmess.md +95 -0
  36. package/data/docs/inbounds__inbounds_wireguard.md +78 -0
  37. package/data/docs/outbounds__outbounds_blackhole.md +42 -0
  38. package/data/docs/outbounds__outbounds_dns.md +97 -0
  39. package/data/docs/outbounds__outbounds_freedom.md +170 -0
  40. package/data/docs/outbounds__outbounds_http.md +70 -0
  41. package/data/docs/outbounds__outbounds_hysteria.md +39 -0
  42. package/data/docs/outbounds__outbounds_index.md +24 -0
  43. package/data/docs/outbounds__outbounds_loopback.md +65 -0
  44. package/data/docs/outbounds__outbounds_shadowsocks.md +105 -0
  45. package/data/docs/outbounds__outbounds_socks.md +58 -0
  46. package/data/docs/outbounds__outbounds_trojan.md +49 -0
  47. package/data/docs/outbounds__outbounds_vless.md +122 -0
  48. package/data/docs/outbounds__outbounds_vmess.md +76 -0
  49. package/data/docs/outbounds__outbounds_wireguard.md +141 -0
  50. package/data/docs/transports__transports_grpc.md +137 -0
  51. package/data/docs/transports__transports_h2.md +11 -0
  52. package/data/docs/transports__transports_http.md +11 -0
  53. package/data/docs/transports__transports_httpupgrade.md +61 -0
  54. package/data/docs/transports__transports_hysteria.md +110 -0
  55. package/data/docs/transports__transports_index.md +19 -0
  56. package/data/docs/transports__transports_mkcp.md +125 -0
  57. package/data/docs/transports__transports_quic.md +11 -0
  58. package/data/docs/transports__transports_raw.md +156 -0
  59. package/data/docs/transports__transports_splithttp.md +11 -0
  60. package/data/docs/transports__transports_tcp.md +11 -0
  61. package/data/docs/transports__transports_websocket.md +75 -0
  62. package/data/docs/transports__transports_xhttp.md +11 -0
  63. package/dist/data/compatibility.js +170 -0
  64. package/dist/data/compatibility.js.map +1 -0
  65. package/dist/data/geocatalogue.js +191 -0
  66. package/dist/data/geocatalogue.js.map +1 -0
  67. package/dist/docs.js +339 -0
  68. package/dist/docs.js.map +1 -0
  69. package/dist/handlers.js +217 -0
  70. package/dist/handlers.js.map +1 -0
  71. package/dist/index.js +66 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/lint.js +737 -0
  74. package/dist/lint.js.map +1 -0
  75. package/dist/schemas/protocols/blackhole.js +16 -0
  76. package/dist/schemas/protocols/blackhole.js.map +1 -0
  77. package/dist/schemas/protocols/common.js +32 -0
  78. package/dist/schemas/protocols/common.js.map +1 -0
  79. package/dist/schemas/protocols/dns.js +14 -0
  80. package/dist/schemas/protocols/dns.js.map +1 -0
  81. package/dist/schemas/protocols/dokodemo.js +17 -0
  82. package/dist/schemas/protocols/dokodemo.js.map +1 -0
  83. package/dist/schemas/protocols/freedom.js +45 -0
  84. package/dist/schemas/protocols/freedom.js.map +1 -0
  85. package/dist/schemas/protocols/http.js +38 -0
  86. package/dist/schemas/protocols/http.js.map +1 -0
  87. package/dist/schemas/protocols/hysteria.js +51 -0
  88. package/dist/schemas/protocols/hysteria.js.map +1 -0
  89. package/dist/schemas/protocols/index.js +50 -0
  90. package/dist/schemas/protocols/index.js.map +1 -0
  91. package/dist/schemas/protocols/loopback.js +11 -0
  92. package/dist/schemas/protocols/loopback.js.map +1 -0
  93. package/dist/schemas/protocols/shadowsocks.js +60 -0
  94. package/dist/schemas/protocols/shadowsocks.js.map +1 -0
  95. package/dist/schemas/protocols/socks.js +42 -0
  96. package/dist/schemas/protocols/socks.js.map +1 -0
  97. package/dist/schemas/protocols/trojan.js +34 -0
  98. package/dist/schemas/protocols/trojan.js.map +1 -0
  99. package/dist/schemas/protocols/tun.js +19 -0
  100. package/dist/schemas/protocols/tun.js.map +1 -0
  101. package/dist/schemas/protocols/vless.js +44 -0
  102. package/dist/schemas/protocols/vless.js.map +1 -0
  103. package/dist/schemas/protocols/vmess.js +48 -0
  104. package/dist/schemas/protocols/vmess.js.map +1 -0
  105. package/dist/schemas/protocols/wireguard.js +34 -0
  106. package/dist/schemas/protocols/wireguard.js.map +1 -0
  107. package/dist/schemas/security/index.js +16 -0
  108. package/dist/schemas/security/index.js.map +1 -0
  109. package/dist/schemas/security/reality.js +35 -0
  110. package/dist/schemas/security/reality.js.map +1 -0
  111. package/dist/schemas/security/tls.js +46 -0
  112. package/dist/schemas/security/tls.js.map +1 -0
  113. package/dist/schemas/security/xtls.js +17 -0
  114. package/dist/schemas/security/xtls.js.map +1 -0
  115. package/dist/schemas/transports/grpc.js +18 -0
  116. package/dist/schemas/transports/grpc.js.map +1 -0
  117. package/dist/schemas/transports/httpupgrade.js +14 -0
  118. package/dist/schemas/transports/httpupgrade.js.map +1 -0
  119. package/dist/schemas/transports/hysteria.js +25 -0
  120. package/dist/schemas/transports/hysteria.js.map +1 -0
  121. package/dist/schemas/transports/index.js +32 -0
  122. package/dist/schemas/transports/index.js.map +1 -0
  123. package/dist/schemas/transports/mkcp.js +34 -0
  124. package/dist/schemas/transports/mkcp.js.map +1 -0
  125. package/dist/schemas/transports/raw.js +19 -0
  126. package/dist/schemas/transports/raw.js.map +1 -0
  127. package/dist/schemas/transports/websocket.js +15 -0
  128. package/dist/schemas/transports/websocket.js.map +1 -0
  129. package/dist/schemas/transports/xhttp.js +34 -0
  130. package/dist/schemas/transports/xhttp.js.map +1 -0
  131. package/dist/search.js +78 -0
  132. package/dist/search.js.map +1 -0
  133. package/dist/state.js +87 -0
  134. package/dist/state.js.map +1 -0
  135. package/dist/tools.js +274 -0
  136. package/dist/tools.js.map +1 -0
  137. package/dist/tools_impl/diff.js +55 -0
  138. package/dist/tools_impl/diff.js.map +1 -0
  139. package/dist/tools_impl/github.js +416 -0
  140. package/dist/tools_impl/github.js.map +1 -0
  141. package/dist/tools_impl/merge.js +181 -0
  142. package/dist/tools_impl/merge.js.map +1 -0
  143. package/dist/tools_impl/refresh.js +46 -0
  144. package/dist/tools_impl/refresh.js.map +1 -0
  145. package/dist/tools_impl/suggest.js +169 -0
  146. package/dist/tools_impl/suggest.js.map +1 -0
  147. package/dist/types.js +10 -0
  148. package/dist/types.js.map +1 -0
  149. package/dist/utils.js +81 -0
  150. package/dist/utils.js.map +1 -0
  151. package/dist/validate.js +408 -0
  152. package/dist/validate.js.map +1 -0
  153. package/package.json +62 -0
@@ -0,0 +1,48 @@
1
+ /*
2
+ * VMess settings schemas.
3
+ * Source: docs/en/config/inbounds/vmess.md, outbounds/vmess.md
4
+ */
5
+ import { z } from "zod";
6
+ import { email, userLevel, uuid } from "./common.js";
7
+ const vmessClient = z
8
+ .object({
9
+ id: uuid,
10
+ level: userLevel.optional(),
11
+ email: email.optional(),
12
+ })
13
+ .passthrough();
14
+ export const vmessInbound = z
15
+ .object({
16
+ clients: z.array(vmessClient).min(1),
17
+ default: z
18
+ .object({
19
+ level: userLevel.optional(),
20
+ })
21
+ .passthrough()
22
+ .optional(),
23
+ detour: z.object({ to: z.string() }).passthrough().optional(),
24
+ })
25
+ .passthrough();
26
+ const vmessUser = z
27
+ .object({
28
+ id: uuid,
29
+ security: z
30
+ .enum(["aes-128-gcm", "chacha20-poly1305", "auto", "none", "zero"])
31
+ .optional(),
32
+ level: userLevel.optional(),
33
+ email: email.optional(),
34
+ })
35
+ .passthrough();
36
+ const vmessServer = z
37
+ .object({
38
+ address: z.string().min(1),
39
+ port: z.number().int().min(1).max(65535),
40
+ users: z.array(vmessUser).min(1),
41
+ })
42
+ .passthrough();
43
+ export const vmessOutbound = z
44
+ .object({
45
+ vnext: z.array(vmessServer).min(1),
46
+ })
47
+ .passthrough();
48
+ //# sourceMappingURL=vmess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vmess.js","sourceRoot":"","sources":["../../../src/schemas/protocols/vmess.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC;IACN,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE;IAC3B,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;CACxB,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC;KAC1B,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,OAAO,EAAE,CAAC;SACP,MAAM,CAAC;QACN,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE;KAC5B,CAAC;SACD,WAAW,EAAE;SACb,QAAQ,EAAE;IACb,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;CAC9D,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,SAAS,GAAG,CAAC;KAChB,MAAM,CAAC;IACN,EAAE,EAAE,IAAI;IACR,QAAQ,EAAE,CAAC;SACR,IAAI,CAAC,CAAC,aAAa,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;SAClE,QAAQ,EAAE;IACb,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE;IAC3B,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;CACxB,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CACjC,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,CAAC;IACN,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CACnC,CAAC;KACD,WAAW,EAAE,CAAC"}
@@ -0,0 +1,34 @@
1
+ /*
2
+ * WireGuard settings schemas (inbound and outbound).
3
+ * Source: docs/en/config/inbounds/wireguard.md, outbounds/wireguard.md
4
+ */
5
+ import { z } from "zod";
6
+ const peer = z
7
+ .object({
8
+ publicKey: z.string().min(1).optional(),
9
+ endpoint: z.string().optional(),
10
+ allowedIPs: z.array(z.string()).optional(),
11
+ preSharedKey: z.string().optional(),
12
+ keepAlive: z.number().int().nonnegative().optional(),
13
+ })
14
+ .passthrough();
15
+ export const wireguardInbound = z
16
+ .object({
17
+ secretKey: z.string().min(1),
18
+ peers: z.array(peer).min(1),
19
+ mtu: z.number().int().positive().optional(),
20
+ kernelMode: z.boolean().optional(),
21
+ })
22
+ .passthrough();
23
+ export const wireguardOutbound = z
24
+ .object({
25
+ secretKey: z.string().min(1),
26
+ address: z.array(z.string()).optional(),
27
+ peers: z.array(peer).min(1),
28
+ mtu: z.number().int().positive().optional(),
29
+ workers: z.number().int().nonnegative().optional(),
30
+ domainStrategy: z.string().optional(),
31
+ reserved: z.array(z.number().int()).optional(),
32
+ })
33
+ .passthrough();
34
+ //# sourceMappingURL=wireguard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wireguard.js","sourceRoot":"","sources":["../../../src/schemas/protocols/wireguard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,IAAI,GAAG,CAAC;KACX,MAAM,CAAC;IACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC1C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;CACrD,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC;KAC9B,MAAM,CAAC;IACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAC/B,MAAM,CAAC;IACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACvC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAClD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC/C,CAAC;KACD,WAAW,EAAE,CAAC"}
@@ -0,0 +1,16 @@
1
+ /*
2
+ * Security registry.
3
+ *
4
+ * Maps streamSettings.security → schema for the matching settings block.
5
+ */
6
+ import { tlsSettings } from "./tls.js";
7
+ import { realitySettings } from "./reality.js";
8
+ export const securitySpecs = [
9
+ { security: "tls", settingsKey: "tlsSettings", schema: tlsSettings },
10
+ { security: "reality", settingsKey: "realitySettings", schema: realitySettings },
11
+ ];
12
+ export const securityByName = Object.fromEntries(securitySpecs.map((s) => [s.security, s]));
13
+ export const allSecuritySettingsKeys = new Set(securitySpecs.map((s) => s.settingsKey));
14
+ export { tlsFingerprints, alpnValues } from "./tls.js";
15
+ export { xtlsFlowValues } from "./xtls.js";
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schemas/security/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAQ/C,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE;IACpE,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,eAAe,EAAE;CACjF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAiC,MAAM,CAAC,WAAW,CAC5E,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAC1C,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAExF,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,35 @@
1
+ /*
2
+ * REALITY streamSettings.realitySettings.
3
+ * Source: docs/en/config/transport.md
4
+ *
5
+ * Validates field shape; semantic checks (key length, hex shortIds, target
6
+ * grammar) are also enforced as separate lint rules so they show up as
7
+ * structured issues with explicit rule ids.
8
+ */
9
+ import { z } from "zod";
10
+ import { tlsFingerprints } from "./tls.js";
11
+ const base64url43 = z
12
+ .string()
13
+ .regex(/^[A-Za-z0-9_-]{43}$/, "REALITY key must be 43 base64url chars (no padding)");
14
+ const shortIdHex = z
15
+ .string()
16
+ .regex(/^([0-9a-fA-F]{2}){0,8}$/, "REALITY shortId must be hex, even length 0..16");
17
+ export const realitySettings = z
18
+ .object({
19
+ show: z.boolean().optional(),
20
+ target: z.string().optional(),
21
+ dest: z.string().optional(),
22
+ xver: z.number().int().nonnegative().optional(),
23
+ serverNames: z.array(z.string().min(1)).min(1).optional(),
24
+ privateKey: base64url43.optional(),
25
+ publicKey: base64url43.optional(),
26
+ minClientVer: z.string().optional(),
27
+ maxClientVer: z.string().optional(),
28
+ maxTimeDiff: z.number().int().nonnegative().optional(),
29
+ shortIds: z.array(shortIdHex).optional(),
30
+ spiderX: z.string().optional(),
31
+ fingerprint: z.enum(tlsFingerprints).optional(),
32
+ serverName: z.string().optional(),
33
+ })
34
+ .passthrough();
35
+ //# sourceMappingURL=reality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reality.js","sourceRoot":"","sources":["../../../src/schemas/security/reality.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,EAAE;KACR,KAAK,CAAC,qBAAqB,EAAE,qDAAqD,CAAC,CAAC;AAEvF,MAAM,UAAU,GAAG,CAAC;KACjB,MAAM,EAAE;KACR,KAAK,CACJ,yBAAyB,EACzB,gDAAgD,CACjD,CAAC;AAEJ,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC7B,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC/C,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzD,UAAU,EAAE,WAAW,CAAC,QAAQ,EAAE;IAClC,SAAS,EAAE,WAAW,CAAC,QAAQ,EAAE;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACtD,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;IACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE;IAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC;KACD,WAAW,EAAE,CAAC"}
@@ -0,0 +1,46 @@
1
+ /*
2
+ * TLS streamSettings.tlsSettings.
3
+ * Source: docs/en/config/transport.md (security section)
4
+ */
5
+ import { z } from "zod";
6
+ export const tlsFingerprints = [
7
+ "chrome",
8
+ "firefox",
9
+ "safari",
10
+ "ios",
11
+ "android",
12
+ "edge",
13
+ "360",
14
+ "qq",
15
+ "random",
16
+ "randomized",
17
+ "unsafe",
18
+ ];
19
+ export const alpnValues = ["h2", "http/1.1", "h3"];
20
+ const certificate = z
21
+ .object({
22
+ usage: z.enum(["encipherment", "verify", "issue"]).optional(),
23
+ certificateFile: z.string().optional(),
24
+ keyFile: z.string().optional(),
25
+ certificate: z.array(z.string()).optional(),
26
+ key: z.array(z.string()).optional(),
27
+ })
28
+ .passthrough();
29
+ export const tlsSettings = z
30
+ .object({
31
+ serverName: z.string().optional(),
32
+ rejectUnknownSni: z.boolean().optional(),
33
+ allowInsecure: z.boolean().optional(),
34
+ alpn: z.array(z.enum(alpnValues)).optional(),
35
+ minVersion: z.string().optional(),
36
+ maxVersion: z.string().optional(),
37
+ cipherSuites: z.string().optional(),
38
+ fingerprint: z.enum(tlsFingerprints).optional(),
39
+ certificates: z.array(certificate).optional(),
40
+ disableSystemRoot: z.boolean().optional(),
41
+ enableSessionResumption: z.boolean().optional(),
42
+ pinnedPeerCertificateChainSha256: z.array(z.string()).optional(),
43
+ masterKeyLog: z.string().optional(),
44
+ })
45
+ .passthrough();
46
+ //# sourceMappingURL=tls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tls.js","sourceRoot":"","sources":["../../../src/schemas/security/tls.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,KAAK;IACL,SAAS;IACT,MAAM;IACN,KAAK;IACL,IAAI;IACJ,QAAQ;IACR,YAAY;IACZ,QAAQ;CACA,CAAC;AAEX,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAU,CAAC;AAE5D,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC;IACN,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC7D,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC3C,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACpC,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC;KACzB,MAAM,CAAC;IACN,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACxC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACrC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC5C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE;IAC/C,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;IAC7C,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACzC,uBAAuB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/C,gCAAgC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAChE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC;KACD,WAAW,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ /*
2
+ * XTLS flow values + helper guards.
3
+ * Source: docs/en/config/features/xtls.md
4
+ *
5
+ * The flow lives on the per-client/user object inside settings, not
6
+ * inside streamSettings. Schema is just the enum; semantic compatibility
7
+ * (vision requires raw + tls/reality) lives in lint rules.
8
+ */
9
+ import { z } from "zod";
10
+ export const xtlsFlowValues = [
11
+ "",
12
+ "none",
13
+ "xtls-rprx-vision",
14
+ "xtls-rprx-vision-udp443",
15
+ ];
16
+ export const xtlsFlow = z.enum(xtlsFlowValues);
17
+ //# sourceMappingURL=xtls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xtls.js","sourceRoot":"","sources":["../../../src/schemas/security/xtls.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,EAAE;IACF,MAAM;IACN,kBAAkB;IAClB,yBAAyB;CACjB,CAAC;AAEX,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /*
2
+ * gRPC transport.
3
+ * Source: docs/en/config/transports/grpc.md
4
+ */
5
+ import { z } from "zod";
6
+ export const grpcSettings = z
7
+ .object({
8
+ serviceName: z.string().min(1),
9
+ multiMode: z.boolean().optional(),
10
+ idle_timeout: z.number().int().nonnegative().optional(),
11
+ health_check_timeout: z.number().int().nonnegative().optional(),
12
+ permit_without_stream: z.boolean().optional(),
13
+ initial_windows_size: z.number().int().nonnegative().optional(),
14
+ user_agent: z.string().optional(),
15
+ authority: z.string().optional(),
16
+ })
17
+ .passthrough();
18
+ //# sourceMappingURL=grpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grpc.js","sourceRoot":"","sources":["../../../src/schemas/transports/grpc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC;KAC1B,MAAM,CAAC;IACN,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACvD,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC/D,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC7C,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC/D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC;KACD,WAAW,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ /*
2
+ * HTTPUpgrade transport.
3
+ * Source: docs/en/config/transports/httpupgrade.md
4
+ */
5
+ import { z } from "zod";
6
+ export const httpUpgradeSettings = z
7
+ .object({
8
+ path: z.string().optional(),
9
+ host: z.string().optional(),
10
+ headers: z.record(z.string()).optional(),
11
+ acceptProxyProtocol: z.boolean().optional(),
12
+ })
13
+ .passthrough();
14
+ //# sourceMappingURL=httpupgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpupgrade.js","sourceRoot":"","sources":["../../../src/schemas/transports/httpupgrade.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC;KACjC,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAC5C,CAAC;KACD,WAAW,EAAE,CAAC"}
@@ -0,0 +1,25 @@
1
+ /*
2
+ * Hysteria transport (rare — usually used as a protocol).
3
+ * Source: docs/en/config/transports/hysteria.md
4
+ */
5
+ import { z } from "zod";
6
+ export const hysteriaTransportSettings = z
7
+ .object({
8
+ password: z.string().optional(),
9
+ security: z
10
+ .object({
11
+ type: z.string().optional(),
12
+ })
13
+ .passthrough()
14
+ .optional(),
15
+ congestion: z
16
+ .object({
17
+ type: z.string().optional(),
18
+ up_mbps: z.number().int().nonnegative().optional(),
19
+ down_mbps: z.number().int().nonnegative().optional(),
20
+ })
21
+ .passthrough()
22
+ .optional(),
23
+ })
24
+ .passthrough();
25
+ //# sourceMappingURL=hysteria.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hysteria.js","sourceRoot":"","sources":["../../../src/schemas/transports/hysteria.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACvC,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC;QACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC5B,CAAC;SACD,WAAW,EAAE;SACb,QAAQ,EAAE;IACb,UAAU,EAAE,CAAC;SACV,MAAM,CAAC;QACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;QAClD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;KACrD,CAAC;SACD,WAAW,EAAE;SACb,QAAQ,EAAE;CACd,CAAC;KACD,WAAW,EAAE,CAAC"}
@@ -0,0 +1,32 @@
1
+ /*
2
+ * Transport registry.
3
+ *
4
+ * Maps streamSettings.network → schema for the corresponding *Settings block.
5
+ * Tabular form so the validator can both:
6
+ * 1. validate the *Settings shape, and
7
+ * 2. detect a mismatch (network=ws but xhttpSettings present, etc).
8
+ */
9
+ import { rawSettings } from "./raw.js";
10
+ import { xhttpSettings } from "./xhttp.js";
11
+ import { grpcSettings } from "./grpc.js";
12
+ import { wsSettings } from "./websocket.js";
13
+ import { mkcpSettings } from "./mkcp.js";
14
+ import { httpUpgradeSettings } from "./httpupgrade.js";
15
+ import { hysteriaTransportSettings } from "./hysteria.js";
16
+ export const transportSpecs = [
17
+ { network: "raw", settingsKey: "rawSettings", schema: rawSettings },
18
+ { network: "tcp", settingsKey: "tcpSettings", schema: rawSettings },
19
+ { network: "xhttp", settingsKey: "xhttpSettings", schema: xhttpSettings },
20
+ { network: "splithttp", settingsKey: "splithttpSettings", schema: xhttpSettings },
21
+ { network: "grpc", settingsKey: "grpcSettings", schema: grpcSettings },
22
+ { network: "ws", settingsKey: "wsSettings", schema: wsSettings },
23
+ { network: "websocket", settingsKey: "wsSettings", schema: wsSettings },
24
+ { network: "kcp", settingsKey: "kcpSettings", schema: mkcpSettings },
25
+ { network: "mkcp", settingsKey: "kcpSettings", schema: mkcpSettings },
26
+ { network: "httpupgrade", settingsKey: "httpupgradeSettings", schema: httpUpgradeSettings },
27
+ { network: "hysteria", settingsKey: "hysteriaSettings", schema: hysteriaTransportSettings },
28
+ ];
29
+ export const transportByNetwork = Object.fromEntries(transportSpecs.map((t) => [t.network, t]));
30
+ /* All known *Settings keys, used to flag cross-network leftovers. */
31
+ export const allSettingsKeys = new Set(transportSpecs.map((t) => t.settingsKey));
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schemas/transports/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAS1D,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE;IACnE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE;IACnE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,aAAa,EAAE;IACzE,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,EAAE,aAAa,EAAE;IACjF,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE;IACtE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE;IAChE,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE;IACvE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE;IACpE,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE;IACrE,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,EAAE,mBAAmB,EAAE;IAC3F,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,yBAAyB,EAAE;CAC5F,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAkC,MAAM,CAAC,WAAW,CACjF,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAC1C,CAAC;AAEF,qEAAqE;AACrE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC"}
@@ -0,0 +1,34 @@
1
+ /*
2
+ * mKCP transport.
3
+ * Source: docs/en/config/transports/mkcp.md
4
+ */
5
+ import { z } from "zod";
6
+ const headerObj = z
7
+ .object({
8
+ type: z
9
+ .enum([
10
+ "none",
11
+ "srtp",
12
+ "utp",
13
+ "wechat-video",
14
+ "dtls",
15
+ "wireguard",
16
+ "dns",
17
+ ])
18
+ .optional(),
19
+ })
20
+ .passthrough();
21
+ export const mkcpSettings = z
22
+ .object({
23
+ mtu: z.number().int().min(576).max(1460).optional(),
24
+ tti: z.number().int().min(10).max(100).optional(),
25
+ uplinkCapacity: z.number().int().nonnegative().optional(),
26
+ downlinkCapacity: z.number().int().nonnegative().optional(),
27
+ congestion: z.boolean().optional(),
28
+ readBufferSize: z.number().int().nonnegative().optional(),
29
+ writeBufferSize: z.number().int().nonnegative().optional(),
30
+ header: headerObj.optional(),
31
+ seed: z.string().optional(),
32
+ })
33
+ .passthrough();
34
+ //# sourceMappingURL=mkcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mkcp.js","sourceRoot":"","sources":["../../../src/schemas/transports/mkcp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,SAAS,GAAG,CAAC;KAChB,MAAM,CAAC;IACN,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC;QACJ,MAAM;QACN,MAAM;QACN,KAAK;QACL,cAAc;QACd,MAAM;QACN,WAAW;QACX,KAAK;KACN,CAAC;SACD,QAAQ,EAAE;CACd,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC;KAC1B,MAAM,CAAC;IACN,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IACnD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACjD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACzD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC3D,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAClC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACzD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC1D,MAAM,EAAE,SAAS,CAAC,QAAQ,EAAE;IAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC;KACD,WAAW,EAAE,CAAC"}
@@ -0,0 +1,19 @@
1
+ /*
2
+ * Raw / TCP transport (streamSettings.network = "raw" or "tcp").
3
+ * Source: docs/en/config/transports/raw.md, transports/tcp.md
4
+ */
5
+ import { z } from "zod";
6
+ const headerObj = z
7
+ .object({
8
+ type: z.enum(["none", "http"]).optional(),
9
+ request: z.unknown().optional(),
10
+ response: z.unknown().optional(),
11
+ })
12
+ .passthrough();
13
+ export const rawSettings = z
14
+ .object({
15
+ acceptProxyProtocol: z.boolean().optional(),
16
+ header: headerObj.optional(),
17
+ })
18
+ .passthrough();
19
+ //# sourceMappingURL=raw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw.js","sourceRoot":"","sources":["../../../src/schemas/transports/raw.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,SAAS,GAAG,CAAC;KAChB,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC;KACzB,MAAM,CAAC;IACN,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC3C,MAAM,EAAE,SAAS,CAAC,QAAQ,EAAE;CAC7B,CAAC;KACD,WAAW,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ /*
2
+ * WebSocket transport.
3
+ * Source: docs/en/config/transports/websocket.md
4
+ */
5
+ import { z } from "zod";
6
+ export const wsSettings = z
7
+ .object({
8
+ path: z.string().optional(),
9
+ host: z.string().optional(),
10
+ headers: z.record(z.string()).optional(),
11
+ acceptProxyProtocol: z.boolean().optional(),
12
+ heartbeatPeriod: z.number().int().nonnegative().optional(),
13
+ })
14
+ .passthrough();
15
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/schemas/transports/websocket.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC;KACxB,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC3C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;CAC3D,CAAC;KACD,WAAW,EAAE,CAAC"}
@@ -0,0 +1,34 @@
1
+ /*
2
+ * XHTTP transport.
3
+ * Source: docs/en/config/transports/xhttp.md (stub) + Xray-core/discussions/4113
4
+ *
5
+ * The official .md is a stub linking to the discussion. Field set is encoded
6
+ * here from the discussion + observed configs in the wild.
7
+ */
8
+ import { z } from "zod";
9
+ const xmux = z
10
+ .object({
11
+ maxConcurrency: z.union([z.number().int(), z.string()]).optional(),
12
+ maxConnections: z.union([z.number().int(), z.string()]).optional(),
13
+ cMaxReuseTimes: z.union([z.number().int(), z.string()]).optional(),
14
+ hMaxRequestTimes: z.union([z.number().int(), z.string()]).optional(),
15
+ hMaxReusableSecs: z.union([z.number().int(), z.string()]).optional(),
16
+ hKeepAlivePeriod: z.union([z.number().int(), z.string()]).optional(),
17
+ })
18
+ .passthrough();
19
+ export const xhttpSettings = z
20
+ .object({
21
+ path: z.string().optional(),
22
+ host: z.string().optional(),
23
+ mode: z.enum(["auto", "packet-up", "stream-up", "stream-one"]).optional(),
24
+ extra: z.unknown().optional(),
25
+ headers: z.record(z.string()).optional(),
26
+ xmux: xmux.optional(),
27
+ noGRPCHeader: z.boolean().optional(),
28
+ xPaddingBytes: z.union([z.number().int(), z.string()]).optional(),
29
+ scMaxEachPostBytes: z.union([z.number().int(), z.string()]).optional(),
30
+ scMinPostsIntervalMs: z.union([z.number().int(), z.string()]).optional(),
31
+ scStreamUpServerSecs: z.union([z.number().int(), z.string()]).optional(),
32
+ })
33
+ .passthrough();
34
+ //# sourceMappingURL=xhttp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xhttp.js","sourceRoot":"","sources":["../../../src/schemas/transports/xhttp.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,IAAI,GAAG,CAAC;KACX,MAAM,CAAC;IACN,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClE,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClE,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClE,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpE,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpE,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;CACrE,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;IACrB,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACpC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjE,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtE,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxE,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;CACzE,CAAC;KACD,WAAW,EAAE,CAAC"}
package/dist/search.js ADDED
@@ -0,0 +1,78 @@
1
+ /*
2
+ * Tiny full-text search over cached docs.
3
+ *
4
+ * Approach: tokenise both query and docs, score by:
5
+ * - exact phrase hits in body ×10
6
+ * - exact phrase hit in title ×25
7
+ * - per-token frequency in body ×1
8
+ * - per-token hit in title ×5
9
+ * No stemming, no IDF — the corpus is small (~50 docs) and the query is
10
+ * usually 1-3 keywords. Returns top N hits with snippets.
11
+ */
12
+ import { readAllTopics } from "./state.js";
13
+ import { snippet } from "./utils.js";
14
+ function tokenise(s) {
15
+ return s
16
+ .toLowerCase()
17
+ .split(/[^a-z0-9_]+/)
18
+ .filter((t) => t.length >= 2);
19
+ }
20
+ function scoreTopic(topic, query, tokens) {
21
+ const titleLower = topic.title.toLowerCase();
22
+ const bodyLower = topic.markdown.toLowerCase();
23
+ const phrase = query.trim().toLowerCase();
24
+ let score = 0;
25
+ if (phrase.length >= 2) {
26
+ if (titleLower.includes(phrase))
27
+ score += 25;
28
+ /* count phrase occurrences in body, capped at 5 to avoid runaway. */
29
+ let from = 0;
30
+ let phraseHits = 0;
31
+ while (phraseHits < 5) {
32
+ const i = bodyLower.indexOf(phrase, from);
33
+ if (i < 0)
34
+ break;
35
+ phraseHits++;
36
+ from = i + phrase.length;
37
+ }
38
+ score += phraseHits * 10;
39
+ }
40
+ for (const t of tokens) {
41
+ if (titleLower.includes(t))
42
+ score += 5;
43
+ /* token frequency in body. */
44
+ let from = 0;
45
+ let hits = 0;
46
+ while (hits < 50) {
47
+ const i = bodyLower.indexOf(t, from);
48
+ if (i < 0)
49
+ break;
50
+ hits++;
51
+ from = i + t.length;
52
+ }
53
+ score += hits;
54
+ }
55
+ return score;
56
+ }
57
+ export async function search(query, maxResults = 10) {
58
+ const tokens = tokenise(query);
59
+ if (tokens.length === 0 && query.trim().length < 2)
60
+ return [];
61
+ const topics = await readAllTopics();
62
+ const scored = [];
63
+ for (const t of topics) {
64
+ const s = scoreTopic(t, query, tokens);
65
+ if (s <= 0)
66
+ continue;
67
+ scored.push({
68
+ slug: t.slug,
69
+ title: t.title,
70
+ category: t.category,
71
+ score: s,
72
+ snippet: snippet(t.markdown, query, 240),
73
+ });
74
+ }
75
+ scored.sort((a, b) => b.score - a.score);
76
+ return scored.slice(0, Math.max(1, maxResults));
77
+ }
78
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
package/dist/state.js ADDED
@@ -0,0 +1,87 @@
1
+ /*
2
+ * Global server state — process-wide, in-memory.
3
+ *
4
+ * Resolves the on-disk docs directory next to the package, lazily loads
5
+ * the bundled `_index.json`, and caches Topic bodies after first read.
6
+ *
7
+ * This is the only module that knows the actual filesystem layout.
8
+ */
9
+ import path from "node:path";
10
+ import { fileURLToPath } from "node:url";
11
+ import { promises as fs } from "node:fs";
12
+ import { parseFrontmatter } from "./utils.js";
13
+ const here = path.dirname(fileURLToPath(import.meta.url));
14
+ /* dist/state.js → ../data/docs/ (same layout when running from src via tsx). */
15
+ export const DOCS_DIR = path.resolve(here, "..", "data", "docs");
16
+ export const INDEX_FILE = path.join(DOCS_DIR, "_index.json");
17
+ const state = {
18
+ index: null,
19
+ bodyCache: new Map(),
20
+ };
21
+ export async function loadIndex(forceReload = false) {
22
+ if (state.index && !forceReload)
23
+ return state.index;
24
+ try {
25
+ const raw = await fs.readFile(INDEX_FILE, "utf8");
26
+ const parsed = JSON.parse(raw);
27
+ state.index = Array.isArray(parsed) ? parsed : [];
28
+ }
29
+ catch {
30
+ /* Bundle may be absent during first-time dev before fetch-docs ran. */
31
+ state.index = [];
32
+ }
33
+ return state.index;
34
+ }
35
+ export async function saveIndex(index) {
36
+ await fs.mkdir(DOCS_DIR, { recursive: true });
37
+ await fs.writeFile(INDEX_FILE, JSON.stringify(index, null, 2), "utf8");
38
+ state.index = index;
39
+ }
40
+ export async function readTopic(slug) {
41
+ const cached = state.bodyCache.get(slug);
42
+ if (cached)
43
+ return cached;
44
+ const index = await loadIndex();
45
+ const meta = index.find((m) => m.slug === slug);
46
+ if (!meta)
47
+ return null;
48
+ const filePath = path.join(DOCS_DIR, meta.file);
49
+ let raw;
50
+ try {
51
+ raw = await fs.readFile(filePath, "utf8");
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ const { meta: fm, body } = parseFrontmatter(raw);
57
+ const topic = {
58
+ ...meta,
59
+ title: fm.title || meta.title,
60
+ markdown: body,
61
+ };
62
+ state.bodyCache.set(slug, topic);
63
+ return topic;
64
+ }
65
+ export async function writeTopic(topic, frontmatter) {
66
+ await fs.mkdir(DOCS_DIR, { recursive: true });
67
+ const filePath = path.join(DOCS_DIR, topic.file);
68
+ await fs.writeFile(filePath, frontmatter + topic.markdown + "\n", "utf8");
69
+ state.bodyCache.set(topic.slug, topic);
70
+ }
71
+ export function dropCache(slug) {
72
+ if (slug)
73
+ state.bodyCache.delete(slug);
74
+ else
75
+ state.bodyCache.clear();
76
+ }
77
+ export async function readAllTopics() {
78
+ const index = await loadIndex();
79
+ const topics = [];
80
+ for (const m of index) {
81
+ const t = await readTopic(m.slug);
82
+ if (t)
83
+ topics.push(t);
84
+ }
85
+ return topics;
86
+ }
87
+ //# sourceMappingURL=state.js.map