@undefineds.co/xpod 0.3.57 → 0.3.61

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 (779) hide show
  1. package/README.md +3 -0
  2. package/config/cli.json +88 -0
  3. package/config/cloud.json +32 -1
  4. package/config/components-ignore.json +3 -0
  5. package/config/extensions.local.initializer.json +44 -0
  6. package/config/resolver.json +86 -0
  7. package/config/xpod.base.json +4 -0
  8. package/dist/agents/AgentExecutorFactory.d.ts +3 -3
  9. package/dist/agents/AgentExecutorFactory.js +28 -15
  10. package/dist/agents/AgentExecutorFactory.js.map +1 -1
  11. package/dist/agents/BaseAgentExecutor.d.ts +2 -1
  12. package/dist/agents/BaseAgentExecutor.js +1 -0
  13. package/dist/agents/BaseAgentExecutor.js.map +1 -1
  14. package/dist/agents/ClaudeExecutor.d.ts +3 -1
  15. package/dist/agents/ClaudeExecutor.js +18 -12
  16. package/dist/agents/ClaudeExecutor.js.map +1 -1
  17. package/dist/agents/config/resolve.js +0 -21
  18. package/dist/agents/config/resolve.js.map +1 -1
  19. package/dist/agents/config/types.d.ts +2 -7
  20. package/dist/agents/config/types.js +2 -1
  21. package/dist/agents/config/types.js.map +1 -1
  22. package/dist/agents/types.d.ts +18 -0
  23. package/dist/agents/types.js.map +1 -1
  24. package/dist/ai/schema/types.d.ts +2 -1
  25. package/dist/ai/schema/types.js +1 -0
  26. package/dist/ai/schema/types.js.map +1 -1
  27. package/dist/ai/service/CredentialReader.d.ts +3 -1
  28. package/dist/ai/service/CredentialReader.js.map +1 -1
  29. package/dist/ai/service/CredentialReaderImpl.d.ts +3 -1
  30. package/dist/ai/service/CredentialReaderImpl.js +24 -2
  31. package/dist/ai/service/CredentialReaderImpl.js.map +1 -1
  32. package/dist/ai/service/EmbeddingServiceImpl.js +13 -2
  33. package/dist/ai/service/EmbeddingServiceImpl.js.map +1 -1
  34. package/dist/ai/service/ProviderRegistry.d.ts +4 -0
  35. package/dist/ai/service/ProviderRegistry.js.map +1 -1
  36. package/dist/ai/service/ProviderRegistry.jsonld +4 -0
  37. package/dist/ai/service/ProviderRegistryImpl.d.ts +4 -1
  38. package/dist/ai/service/ProviderRegistryImpl.js +26 -4
  39. package/dist/ai/service/ProviderRegistryImpl.js.map +1 -1
  40. package/dist/ai/service/ProviderRegistryImpl.jsonld +12 -0
  41. package/dist/ai/service/defaultEmbeddingProfile.d.ts +5 -0
  42. package/dist/ai/service/defaultEmbeddingProfile.js +31 -0
  43. package/dist/ai/service/defaultEmbeddingProfile.js.map +1 -0
  44. package/dist/ai/service/index.d.ts +1 -0
  45. package/dist/ai/service/index.js +1 -0
  46. package/dist/ai/service/index.js.map +1 -1
  47. package/dist/ai/service/types.d.ts +1 -0
  48. package/dist/ai/service/types.js.map +1 -1
  49. package/dist/api/ApiServer.js +17 -2
  50. package/dist/api/ApiServer.js.map +1 -1
  51. package/dist/api/ai-gateway/AiGatewayService.d.ts +106 -0
  52. package/dist/api/ai-gateway/AiGatewayService.js +527 -0
  53. package/dist/api/ai-gateway/AiGatewayService.js.map +1 -0
  54. package/dist/api/ai-gateway/auth/AiConnectionInvocationKeyIssuer.d.ts +38 -0
  55. package/dist/api/ai-gateway/auth/AiConnectionInvocationKeyIssuer.js +128 -0
  56. package/dist/api/ai-gateway/auth/AiConnectionInvocationKeyIssuer.js.map +1 -0
  57. package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.d.ts +25 -0
  58. package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.js +91 -0
  59. package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.js.map +1 -0
  60. package/dist/api/ai-gateway/auth/GatewayApiKey.d.ts +28 -0
  61. package/dist/api/ai-gateway/auth/GatewayApiKey.js +162 -0
  62. package/dist/api/ai-gateway/auth/GatewayApiKey.js.map +1 -0
  63. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.d.ts +56 -0
  64. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js +143 -0
  65. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js.map +1 -0
  66. package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.d.ts +26 -0
  67. package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.js +97 -0
  68. package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.js.map +1 -0
  69. package/dist/api/ai-gateway/auth/GatewayPrincipal.d.ts +20 -0
  70. package/dist/api/ai-gateway/auth/GatewayPrincipal.js +37 -0
  71. package/dist/api/ai-gateway/auth/GatewayPrincipal.js.map +1 -0
  72. package/dist/api/ai-gateway/auth/InvocationTokenCodec.d.ts +41 -0
  73. package/dist/api/ai-gateway/auth/InvocationTokenCodec.js +221 -0
  74. package/dist/api/ai-gateway/auth/InvocationTokenCodec.js.map +1 -0
  75. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.d.ts +54 -0
  76. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js +152 -0
  77. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js.map +1 -0
  78. package/dist/api/ai-gateway/connect/index.d.ts +367 -0
  79. package/dist/api/ai-gateway/connect/index.js +1061 -0
  80. package/dist/api/ai-gateway/connect/index.js.map +1 -0
  81. package/dist/api/ai-gateway/credentials/CloudKmsWrapper.d.ts +40 -0
  82. package/dist/api/ai-gateway/credentials/CloudKmsWrapper.js +59 -0
  83. package/dist/api/ai-gateway/credentials/CloudKmsWrapper.js.map +1 -0
  84. package/dist/api/ai-gateway/credentials/CredentialVault.d.ts +14 -0
  85. package/dist/api/ai-gateway/credentials/CredentialVault.js +11 -0
  86. package/dist/api/ai-gateway/credentials/CredentialVault.js.map +1 -0
  87. package/dist/api/ai-gateway/credentials/KeyWrapper.d.ts +27 -0
  88. package/dist/api/ai-gateway/credentials/KeyWrapper.js +3 -0
  89. package/dist/api/ai-gateway/credentials/KeyWrapper.js.map +1 -0
  90. package/dist/api/ai-gateway/credentials/LocalKeychainWrapper.d.ts +27 -0
  91. package/dist/api/ai-gateway/credentials/LocalKeychainWrapper.js +145 -0
  92. package/dist/api/ai-gateway/credentials/LocalKeychainWrapper.js.map +1 -0
  93. package/dist/api/ai-gateway/credentials/SecretCellCredentialVault.d.ts +13 -0
  94. package/dist/api/ai-gateway/credentials/SecretCellCredentialVault.js +133 -0
  95. package/dist/api/ai-gateway/credentials/SecretCellCredentialVault.js.map +1 -0
  96. package/dist/api/ai-gateway/credentials/SecretCellKeyWrapper.d.ts +23 -0
  97. package/dist/api/ai-gateway/credentials/SecretCellKeyWrapper.js +62 -0
  98. package/dist/api/ai-gateway/credentials/SecretCellKeyWrapper.js.map +1 -0
  99. package/dist/api/ai-gateway/credentials/WebCryptoCredentialVault.d.ts +23 -0
  100. package/dist/api/ai-gateway/credentials/WebCryptoCredentialVault.js +173 -0
  101. package/dist/api/ai-gateway/credentials/WebCryptoCredentialVault.js.map +1 -0
  102. package/dist/api/ai-gateway/errors.d.ts +21 -0
  103. package/dist/api/ai-gateway/errors.js +50 -0
  104. package/dist/api/ai-gateway/errors.js.map +1 -0
  105. package/dist/api/ai-gateway/protocol/ChatCompletionsFrontend.d.ts +6 -0
  106. package/dist/api/ai-gateway/protocol/ChatCompletionsFrontend.js +111 -0
  107. package/dist/api/ai-gateway/protocol/ChatCompletionsFrontend.js.map +1 -0
  108. package/dist/api/ai-gateway/protocol/MessagesFrontend.d.ts +6 -0
  109. package/dist/api/ai-gateway/protocol/MessagesFrontend.js +99 -0
  110. package/dist/api/ai-gateway/protocol/MessagesFrontend.js.map +1 -0
  111. package/dist/api/ai-gateway/protocol/ResponsesFrontend.d.ts +6 -0
  112. package/dist/api/ai-gateway/protocol/ResponsesFrontend.js +232 -0
  113. package/dist/api/ai-gateway/protocol/ResponsesFrontend.js.map +1 -0
  114. package/dist/api/ai-gateway/protocol/index.d.ts +3 -0
  115. package/dist/api/ai-gateway/protocol/index.js +10 -0
  116. package/dist/api/ai-gateway/protocol/index.js.map +1 -0
  117. package/dist/api/ai-gateway/providers/AnthropicRuntimeAdapter.d.ts +7 -0
  118. package/dist/api/ai-gateway/providers/AnthropicRuntimeAdapter.js +37 -0
  119. package/dist/api/ai-gateway/providers/AnthropicRuntimeAdapter.js.map +1 -0
  120. package/dist/api/ai-gateway/providers/BailianRuntimeAdapter.d.ts +9 -0
  121. package/dist/api/ai-gateway/providers/BailianRuntimeAdapter.js +127 -0
  122. package/dist/api/ai-gateway/providers/BailianRuntimeAdapter.js.map +1 -0
  123. package/dist/api/ai-gateway/providers/DeepSeekRuntimeAdapter.d.ts +8 -0
  124. package/dist/api/ai-gateway/providers/DeepSeekRuntimeAdapter.js +47 -0
  125. package/dist/api/ai-gateway/providers/DeepSeekRuntimeAdapter.js.map +1 -0
  126. package/dist/api/ai-gateway/providers/KimiRuntimeAdapter.d.ts +8 -0
  127. package/dist/api/ai-gateway/providers/KimiRuntimeAdapter.js +57 -0
  128. package/dist/api/ai-gateway/providers/KimiRuntimeAdapter.js.map +1 -0
  129. package/dist/api/ai-gateway/providers/OpenAiCompatibleRuntimeAdapter.d.ts +1 -0
  130. package/dist/api/ai-gateway/providers/OpenAiCompatibleRuntimeAdapter.js +6 -0
  131. package/dist/api/ai-gateway/providers/OpenAiCompatibleRuntimeAdapter.js.map +1 -0
  132. package/dist/api/ai-gateway/providers/OpenAiRuntimeAdapter.d.ts +13 -0
  133. package/dist/api/ai-gateway/providers/OpenAiRuntimeAdapter.js +34 -0
  134. package/dist/api/ai-gateway/providers/OpenAiRuntimeAdapter.js.map +1 -0
  135. package/dist/api/ai-gateway/providers/ProviderRegistry.d.ts +68 -0
  136. package/dist/api/ai-gateway/providers/ProviderRegistry.js +288 -0
  137. package/dist/api/ai-gateway/providers/ProviderRegistry.js.map +1 -0
  138. package/dist/api/ai-gateway/providers/ProviderRuntimeAdapter.d.ts +88 -0
  139. package/dist/api/ai-gateway/providers/ProviderRuntimeAdapter.js +645 -0
  140. package/dist/api/ai-gateway/providers/ProviderRuntimeAdapter.js.map +1 -0
  141. package/dist/api/ai-gateway/providers/ProviderRuntimeRegistry.d.ts +13 -0
  142. package/dist/api/ai-gateway/providers/ProviderRuntimeRegistry.js +48 -0
  143. package/dist/api/ai-gateway/providers/ProviderRuntimeRegistry.js.map +1 -0
  144. package/dist/api/ai-gateway/providers/index.d.ts +9 -0
  145. package/dist/api/ai-gateway/providers/index.js +26 -0
  146. package/dist/api/ai-gateway/providers/index.js.map +1 -0
  147. package/dist/api/ai-gateway/quota/AnthropicQuotaAdapter.d.ts +5 -0
  148. package/dist/api/ai-gateway/quota/AnthropicQuotaAdapter.js +21 -0
  149. package/dist/api/ai-gateway/quota/AnthropicQuotaAdapter.js.map +1 -0
  150. package/dist/api/ai-gateway/quota/BailianQuotaAdapter.d.ts +5 -0
  151. package/dist/api/ai-gateway/quota/BailianQuotaAdapter.js +21 -0
  152. package/dist/api/ai-gateway/quota/BailianQuotaAdapter.js.map +1 -0
  153. package/dist/api/ai-gateway/quota/DeepSeekQuotaAdapter.d.ts +10 -0
  154. package/dist/api/ai-gateway/quota/DeepSeekQuotaAdapter.js +83 -0
  155. package/dist/api/ai-gateway/quota/DeepSeekQuotaAdapter.js.map +1 -0
  156. package/dist/api/ai-gateway/quota/KimiQuotaAdapter.d.ts +10 -0
  157. package/dist/api/ai-gateway/quota/KimiQuotaAdapter.js +70 -0
  158. package/dist/api/ai-gateway/quota/KimiQuotaAdapter.js.map +1 -0
  159. package/dist/api/ai-gateway/quota/OpenAiQuotaAdapter.d.ts +5 -0
  160. package/dist/api/ai-gateway/quota/OpenAiQuotaAdapter.js +21 -0
  161. package/dist/api/ai-gateway/quota/OpenAiQuotaAdapter.js.map +1 -0
  162. package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.d.ts +214 -0
  163. package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.js +511 -0
  164. package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.js.map +1 -0
  165. package/dist/api/ai-gateway/quota/index.d.ts +6 -0
  166. package/dist/api/ai-gateway/quota/index.js +23 -0
  167. package/dist/api/ai-gateway/quota/index.js.map +1 -0
  168. package/dist/api/ai-gateway/routing/InMemorySessionAffinityStore.d.ts +26 -0
  169. package/dist/api/ai-gateway/routing/InMemorySessionAffinityStore.js +67 -0
  170. package/dist/api/ai-gateway/routing/InMemorySessionAffinityStore.js.map +1 -0
  171. package/dist/api/ai-gateway/routing/ModelRouter.d.ts +84 -0
  172. package/dist/api/ai-gateway/routing/ModelRouter.js +274 -0
  173. package/dist/api/ai-gateway/routing/ModelRouter.js.map +1 -0
  174. package/dist/api/ai-gateway/routing/RedisSessionAffinityStore.d.ts +39 -0
  175. package/dist/api/ai-gateway/routing/RedisSessionAffinityStore.js +122 -0
  176. package/dist/api/ai-gateway/routing/RedisSessionAffinityStore.js.map +1 -0
  177. package/dist/api/ai-gateway/routing/SessionAffinityStore.d.ts +49 -0
  178. package/dist/api/ai-gateway/routing/SessionAffinityStore.js +66 -0
  179. package/dist/api/ai-gateway/routing/SessionAffinityStore.js.map +1 -0
  180. package/dist/api/ai-gateway/service-access/AiConnectionServiceAccess.d.ts +25 -0
  181. package/dist/api/ai-gateway/service-access/AiConnectionServiceAccess.js +50 -0
  182. package/dist/api/ai-gateway/service-access/AiConnectionServiceAccess.js.map +1 -0
  183. package/dist/api/ai-gateway/types.d.ts +112 -0
  184. package/dist/api/ai-gateway/types.js +305 -0
  185. package/dist/api/ai-gateway/types.js.map +1 -0
  186. package/dist/api/auth/AuthContext.d.ts +18 -3
  187. package/dist/api/auth/AuthContext.js +13 -2
  188. package/dist/api/auth/AuthContext.js.map +1 -1
  189. package/dist/api/auth/Authenticator.d.ts +3 -0
  190. package/dist/api/auth/Authenticator.js.map +1 -1
  191. package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +2 -6
  192. package/dist/api/auth/ClientCredentialsAuthenticator.js +12 -30
  193. package/dist/api/auth/ClientCredentialsAuthenticator.js.map +1 -1
  194. package/dist/api/auth/SolidTokenAuthenticator.d.ts +2 -0
  195. package/dist/api/auth/SolidTokenAuthenticator.js +88 -2
  196. package/dist/api/auth/SolidTokenAuthenticator.js.map +1 -1
  197. package/dist/api/auth/TokenIdentity.d.ts +6 -0
  198. package/dist/api/auth/TokenIdentity.js +31 -0
  199. package/dist/api/auth/TokenIdentity.js.map +1 -0
  200. package/dist/api/chatkit/ai-provider.d.ts +9 -23
  201. package/dist/api/chatkit/ai-provider.js +30 -153
  202. package/dist/api/chatkit/ai-provider.js.map +1 -1
  203. package/dist/api/chatkit/default-agent.d.ts +24 -15
  204. package/dist/api/chatkit/default-agent.js +24 -83
  205. package/dist/api/chatkit/default-agent.js.map +1 -1
  206. package/dist/api/chatkit/index.d.ts +2 -1
  207. package/dist/api/chatkit/index.js +3 -1
  208. package/dist/api/chatkit/index.js.map +1 -1
  209. package/dist/api/chatkit/pod-store.d.ts +13 -1
  210. package/dist/api/chatkit/pod-store.js +127 -7
  211. package/dist/api/chatkit/pod-store.js.map +1 -1
  212. package/dist/api/chatkit/runtime/AcpAgentRuntime.d.ts +0 -1
  213. package/dist/api/chatkit/runtime/AcpAgentRuntime.js +14 -51
  214. package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -1
  215. package/dist/api/chatkit/runtime/AcpRunner.js +2 -1
  216. package/dist/api/chatkit/runtime/AcpRunner.js.map +1 -1
  217. package/dist/api/chatkit/runtime/CodexRuntimeProjector.d.ts +15 -1
  218. package/dist/api/chatkit/runtime/CodexRuntimeProjector.js +52 -34
  219. package/dist/api/chatkit/runtime/CodexRuntimeProjector.js.map +1 -1
  220. package/dist/api/chatkit/service.d.ts +8 -1
  221. package/dist/api/chatkit/service.js +46 -5
  222. package/dist/api/chatkit/service.js.map +1 -1
  223. package/dist/api/chatkit/store.d.ts +23 -1
  224. package/dist/api/chatkit/store.js +56 -0
  225. package/dist/api/chatkit/store.js.map +1 -1
  226. package/dist/api/chatkit/types.d.ts +1 -0
  227. package/dist/api/chatkit/types.js.map +1 -1
  228. package/dist/api/container/common.js +286 -13
  229. package/dist/api/container/common.js.map +1 -1
  230. package/dist/api/container/index.js +126 -6
  231. package/dist/api/container/index.js.map +1 -1
  232. package/dist/api/container/local.js +50 -6
  233. package/dist/api/container/local.js.map +1 -1
  234. package/dist/api/container/rdf.d.ts +15 -0
  235. package/dist/api/container/rdf.js +90 -0
  236. package/dist/api/container/rdf.js.map +1 -0
  237. package/dist/api/container/routes.js +151 -11
  238. package/dist/api/container/routes.js.map +1 -1
  239. package/dist/api/container/types.d.ts +96 -0
  240. package/dist/api/container/types.js.map +1 -1
  241. package/dist/api/handlers/AdminHandler.d.ts +25 -2
  242. package/dist/api/handlers/AdminHandler.js +60 -10
  243. package/dist/api/handlers/AdminHandler.js.map +1 -1
  244. package/dist/api/handlers/AiClientConfigurationHandler.d.ts +7 -0
  245. package/dist/api/handlers/AiClientConfigurationHandler.js +202 -0
  246. package/dist/api/handlers/AiClientConfigurationHandler.js.map +1 -0
  247. package/dist/api/handlers/AiGatewayHandler.d.ts +23 -0
  248. package/dist/api/handlers/AiGatewayHandler.js +231 -0
  249. package/dist/api/handlers/AiGatewayHandler.js.map +1 -0
  250. package/dist/api/handlers/AiGatewayManagementHandler.d.ts +24 -0
  251. package/dist/api/handlers/AiGatewayManagementHandler.js +503 -0
  252. package/dist/api/handlers/AiGatewayManagementHandler.js.map +1 -0
  253. package/dist/api/handlers/ChatHandler.d.ts +11 -12
  254. package/dist/api/handlers/ChatHandler.js +12 -219
  255. package/dist/api/handlers/ChatHandler.js.map +1 -1
  256. package/dist/api/handlers/DashboardHandler.js +22 -116
  257. package/dist/api/handlers/DashboardHandler.js.map +1 -1
  258. package/dist/api/handlers/NetworkSettingsHandler.d.ts +97 -0
  259. package/dist/api/handlers/NetworkSettingsHandler.js +511 -0
  260. package/dist/api/handlers/NetworkSettingsHandler.js.map +1 -0
  261. package/dist/api/handlers/PodSettingsHandler.d.ts +79 -0
  262. package/dist/api/handlers/PodSettingsHandler.js +162 -0
  263. package/dist/api/handlers/PodSettingsHandler.js.map +1 -0
  264. package/dist/api/handlers/ProvisionHandler.d.ts +3 -1
  265. package/dist/api/handlers/ProvisionHandler.js +22 -87
  266. package/dist/api/handlers/ProvisionHandler.js.map +1 -1
  267. package/dist/api/handlers/RdfStatsHandler.d.ts +6 -0
  268. package/dist/api/handlers/RdfStatsHandler.js +85 -0
  269. package/dist/api/handlers/RdfStatsHandler.js.map +1 -0
  270. package/dist/api/handlers/SettingsHandler.d.ts +5 -0
  271. package/dist/api/handlers/SettingsHandler.js +13 -0
  272. package/dist/api/handlers/SettingsHandler.js.map +1 -0
  273. package/dist/api/handlers/StaticSpaHandler.d.ts +8 -0
  274. package/dist/api/handlers/StaticSpaHandler.js +102 -0
  275. package/dist/api/handlers/StaticSpaHandler.js.map +1 -0
  276. package/dist/api/handlers/index.d.ts +1 -0
  277. package/dist/api/handlers/index.js +1 -0
  278. package/dist/api/handlers/index.js.map +1 -1
  279. package/dist/api/http/readBoundedJsonBody.d.ts +14 -0
  280. package/dist/api/http/readBoundedJsonBody.js +58 -0
  281. package/dist/api/http/readBoundedJsonBody.js.map +1 -0
  282. package/dist/api/middleware/AuthMiddleware.d.ts +1 -0
  283. package/dist/api/middleware/AuthMiddleware.js +33 -4
  284. package/dist/api/middleware/AuthMiddleware.js.map +1 -1
  285. package/dist/api/runs/AgentRuntimeTypes.d.ts +18 -3
  286. package/dist/api/runs/AgentRuntimeTypes.js +61 -0
  287. package/dist/api/runs/AgentRuntimeTypes.js.map +1 -1
  288. package/dist/api/runs/InngestRunExecutionBackend.d.ts +28 -3
  289. package/dist/api/runs/InngestRunExecutionBackend.js +26 -3
  290. package/dist/api/runs/InngestRunExecutionBackend.js.map +1 -1
  291. package/dist/api/runs/ManagedRunWorker.d.ts +4 -1
  292. package/dist/api/runs/ManagedRunWorker.js +39 -8
  293. package/dist/api/runs/ManagedRunWorker.js.map +1 -1
  294. package/dist/api/runs/PiAgentRuntimeDriver.d.ts +5 -1
  295. package/dist/api/runs/PiAgentRuntimeDriver.js +94 -57
  296. package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -1
  297. package/dist/api/runs/RdfRunContextRetriever.d.ts +46 -0
  298. package/dist/api/runs/RdfRunContextRetriever.js +277 -0
  299. package/dist/api/runs/RdfRunContextRetriever.js.map +1 -0
  300. package/dist/api/runs/RunExecutionBackend.d.ts +38 -0
  301. package/dist/api/runs/RunExecutionBackend.js.map +1 -1
  302. package/dist/api/runs/RunStateCenter.d.ts +18 -3
  303. package/dist/api/runs/RunStateCenter.js +85 -24
  304. package/dist/api/runs/RunStateCenter.js.map +1 -1
  305. package/dist/api/runtime.js +163 -3
  306. package/dist/api/runtime.js.map +1 -1
  307. package/dist/api/service/AiClientConfigurationService.d.ts +97 -0
  308. package/dist/api/service/AiClientConfigurationService.js +379 -0
  309. package/dist/api/service/AiClientConfigurationService.js.map +1 -0
  310. package/dist/api/service/RdfBenchmarkReportCatalog.d.ts +86 -0
  311. package/dist/api/service/RdfBenchmarkReportCatalog.js +349 -0
  312. package/dist/api/service/RdfBenchmarkReportCatalog.js.map +1 -0
  313. package/dist/api/service/RdfBenchmarkReportGate.d.ts +78 -0
  314. package/dist/api/service/RdfBenchmarkReportGate.js +197 -0
  315. package/dist/api/service/RdfBenchmarkReportGate.js.map +1 -0
  316. package/dist/api/service/RdfSearchIndexingService.d.ts +113 -0
  317. package/dist/api/service/RdfSearchIndexingService.js +272 -0
  318. package/dist/api/service/RdfSearchIndexingService.js.map +1 -0
  319. package/dist/api/service/RdfSearchIndexingSolidFsSyncer.d.ts +27 -0
  320. package/dist/api/service/RdfSearchIndexingSolidFsSyncer.js +90 -0
  321. package/dist/api/service/RdfSearchIndexingSolidFsSyncer.js.map +1 -0
  322. package/dist/api/service/RdfStorageStatsService.d.ts +31 -0
  323. package/dist/api/service/RdfStorageStatsService.js +97 -0
  324. package/dist/api/service/RdfStorageStatsService.js.map +1 -0
  325. package/dist/api/service/VectorStoreService.d.ts +2 -0
  326. package/dist/api/service/VectorStoreService.js +70 -2
  327. package/dist/api/service/VectorStoreService.js.map +1 -1
  328. package/dist/api/service/VercelChatService.d.ts +27 -38
  329. package/dist/api/service/VercelChatService.js +153 -505
  330. package/dist/api/service/VercelChatService.js.map +1 -1
  331. package/dist/api/service/provider-http-transport.d.ts +21 -0
  332. package/dist/api/service/provider-http-transport.js +108 -2
  333. package/dist/api/service/provider-http-transport.js.map +1 -1
  334. package/dist/api/service/provider-registry.d.ts +5 -7
  335. package/dist/api/service/provider-registry.js +81 -64
  336. package/dist/api/service/provider-registry.js.map +1 -1
  337. package/dist/api/tasks/InngestTaskScheduler.d.ts +44 -4
  338. package/dist/api/tasks/TaskMaterializer.d.ts +10 -1
  339. package/dist/api/tasks/TaskMaterializer.js +39 -4
  340. package/dist/api/tasks/TaskMaterializer.js.map +1 -1
  341. package/dist/api/tasks/TaskService.d.ts +5 -1
  342. package/dist/api/tasks/TaskService.js +3 -0
  343. package/dist/api/tasks/TaskService.js.map +1 -1
  344. package/dist/cli/commands/obj.d.ts +9 -0
  345. package/dist/cli/commands/obj.js +74 -3
  346. package/dist/cli/commands/obj.js.map +1 -1
  347. package/dist/cli/commands/rdf.d.ts +9 -0
  348. package/dist/cli/commands/rdf.js +66 -1
  349. package/dist/cli/commands/rdf.js.map +1 -1
  350. package/dist/cli/commands/start.js +3 -0
  351. package/dist/cli/commands/start.js.map +1 -1
  352. package/dist/cli/lib/solid-auth.d.ts +3 -3
  353. package/dist/cli/lib/solid-auth.js +4 -4
  354. package/dist/cli/lib/solid-auth.js.map +1 -1
  355. package/dist/components/components.jsonld +16 -0
  356. package/dist/components/context.jsonld +815 -28
  357. package/dist/document/Chunker.jsonld +110 -0
  358. package/dist/document/{DocumentParser.d.ts → DocumentReader.d.ts} +23 -11
  359. package/dist/document/{DocumentParser.js → DocumentReader.js} +2 -2
  360. package/dist/document/DocumentReader.js.map +1 -0
  361. package/dist/document/DocumentReader.jsonld +82 -0
  362. package/dist/document/HeadingChunker.jsonld +41 -0
  363. package/dist/document/{JinaDocumentParser.d.ts → JinaReader.d.ts} +7 -7
  364. package/dist/document/{JinaDocumentParser.js → JinaReader.js} +12 -12
  365. package/dist/document/JinaReader.js.map +1 -0
  366. package/dist/document/JinaReader.jsonld +133 -0
  367. package/dist/document/L0SourceSummary.d.ts +103 -0
  368. package/dist/document/L0SourceSummary.js +157 -0
  369. package/dist/document/L0SourceSummary.js.map +1 -0
  370. package/dist/document/L0SourceSummary.jsonld +326 -0
  371. package/dist/document/PaddleOcrReader.d.ts +40 -0
  372. package/dist/document/PaddleOcrReader.js +53 -0
  373. package/dist/document/PaddleOcrReader.js.map +1 -0
  374. package/dist/document/PaddleOcrReader.jsonld +234 -0
  375. package/dist/document/ReaderAiConfig.d.ts +50 -0
  376. package/dist/document/ReaderAiConfig.js +109 -0
  377. package/dist/document/ReaderAiConfig.js.map +1 -0
  378. package/dist/document/ReaderAiConfig.jsonld +185 -0
  379. package/dist/document/ReaderPolicy.d.ts +89 -0
  380. package/dist/document/ReaderPolicy.js +158 -0
  381. package/dist/document/ReaderPolicy.js.map +1 -0
  382. package/dist/document/ReaderPolicy.jsonld +218 -0
  383. package/dist/document/index.d.ts +6 -2
  384. package/dist/document/index.js +6 -2
  385. package/dist/document/index.js.map +1 -1
  386. package/dist/edge/DdnsManager.d.ts +1 -1
  387. package/dist/edge/DdnsManager.js.map +1 -1
  388. package/dist/edge/EdgeNodeAgent.d.ts +4 -0
  389. package/dist/edge/EdgeNodeAgent.js +6 -0
  390. package/dist/edge/EdgeNodeAgent.js.map +1 -1
  391. package/dist/edge/EdgeNodeAgent.jsonld +8 -0
  392. package/dist/edge/EdgeNodeAgentInitializer.d.ts +16 -0
  393. package/dist/edge/EdgeNodeAgentInitializer.js +51 -0
  394. package/dist/edge/EdgeNodeAgentInitializer.js.map +1 -1
  395. package/dist/edge/EdgeNodeAgentInitializer.jsonld +250 -0
  396. package/dist/edge/EdgeNodeCertificateCapabilityBridge.d.ts +34 -0
  397. package/dist/edge/EdgeNodeCertificateCapabilityBridge.js +111 -0
  398. package/dist/edge/EdgeNodeCertificateCapabilityBridge.js.map +1 -0
  399. package/dist/edge/acme/AcmeCertificateManager.d.ts +14 -1
  400. package/dist/edge/acme/AcmeCertificateManager.js +67 -7
  401. package/dist/edge/acme/AcmeCertificateManager.js.map +1 -1
  402. package/dist/edge/acme/AcmeCertificateManager.jsonld +22 -2
  403. package/dist/edge/acme/ClusterCertificateManager.d.ts +12 -0
  404. package/dist/edge/acme/ClusterCertificateManager.js +38 -0
  405. package/dist/edge/acme/ClusterCertificateManager.js.map +1 -1
  406. package/dist/extensions/ExtensionRuntime.d.ts +17 -0
  407. package/dist/extensions/ExtensionRuntime.js +171 -0
  408. package/dist/extensions/ExtensionRuntime.js.map +1 -0
  409. package/dist/extensions/PodCredentialResolver.d.ts +23 -0
  410. package/dist/extensions/PodCredentialResolver.js +139 -0
  411. package/dist/extensions/PodCredentialResolver.js.map +1 -0
  412. package/dist/extensions/index.d.ts +3 -0
  413. package/dist/extensions/index.js +20 -0
  414. package/dist/extensions/index.js.map +1 -0
  415. package/dist/extensions/types.d.ts +73 -0
  416. package/dist/extensions/types.js +3 -0
  417. package/dist/extensions/types.js.map +1 -0
  418. package/dist/http/SubgraphSparqlHttpHandler.d.ts +20 -1
  419. package/dist/http/SubgraphSparqlHttpHandler.js +324 -43
  420. package/dist/http/SubgraphSparqlHttpHandler.js.map +1 -1
  421. package/dist/http/SubgraphSparqlHttpHandler.jsonld +87 -0
  422. package/dist/identity/drizzle/EdgeNodeRepository.js +3 -2
  423. package/dist/identity/drizzle/EdgeNodeRepository.js.map +1 -1
  424. package/dist/identity/drizzle/schema.pg.js +1 -1
  425. package/dist/identity/drizzle/schema.pg.js.map +1 -1
  426. package/dist/identity/drizzle/schema.sqlite.js +1 -1
  427. package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
  428. package/dist/identity/oidc/ScopedPickWebIdHandler.js +5 -5
  429. package/dist/identity/oidc/ScopedPickWebIdHandler.js.map +1 -1
  430. package/dist/index.d.ts +12 -2
  431. package/dist/index.js +13 -1
  432. package/dist/index.js.map +1 -1
  433. package/dist/main.js +3 -0
  434. package/dist/main.js.map +1 -1
  435. package/dist/provision/LocalProvisionState.d.ts +28 -0
  436. package/dist/provision/LocalProvisionState.js +124 -0
  437. package/dist/provision/LocalProvisionState.js.map +1 -0
  438. package/dist/provision/ProvisionCodeCodec.d.ts +7 -3
  439. package/dist/provision/ProvisionCodeCodec.js +10 -3
  440. package/dist/provision/ProvisionCodeCodec.js.map +1 -1
  441. package/dist/provision/ProvisionPodCreator.d.ts +15 -1
  442. package/dist/provision/ProvisionPodCreator.js +68 -1
  443. package/dist/provision/ProvisionPodCreator.js.map +1 -1
  444. package/dist/provision/ProvisionPodCreator.jsonld +31 -0
  445. package/dist/provision/ServiceAccessTokenCodec.d.ts +45 -0
  446. package/dist/provision/ServiceAccessTokenCodec.js +86 -0
  447. package/dist/provision/ServiceAccessTokenCodec.js.map +1 -0
  448. package/dist/runtime/GatewayAdminProxyAuth.d.ts +29 -0
  449. package/dist/runtime/GatewayAdminProxyAuth.js +108 -0
  450. package/dist/runtime/GatewayAdminProxyAuth.js.map +1 -0
  451. package/dist/runtime/Proxy.d.ts +10 -0
  452. package/dist/runtime/Proxy.js +64 -6
  453. package/dist/runtime/Proxy.js.map +1 -1
  454. package/dist/runtime/XpodRuntime.js +1 -0
  455. package/dist/runtime/XpodRuntime.js.map +1 -1
  456. package/dist/runtime/bootstrap.d.ts +1 -0
  457. package/dist/runtime/bootstrap.js +29 -0
  458. package/dist/runtime/bootstrap.js.map +1 -1
  459. package/dist/runtime/css-process.d.ts +1 -0
  460. package/dist/runtime/css-process.js +1 -0
  461. package/dist/runtime/css-process.js.map +1 -1
  462. package/dist/runtime/index.d.ts +1 -0
  463. package/dist/runtime/index.js +3 -1
  464. package/dist/runtime/index.js.map +1 -1
  465. package/dist/runtime/lifecycle.d.ts +3 -1
  466. package/dist/runtime/lifecycle.js +3 -1
  467. package/dist/runtime/lifecycle.js.map +1 -1
  468. package/dist/runtime/runner/node/NodeGatewayRuntimeRunner.js +2 -0
  469. package/dist/runtime/runner/node/NodeGatewayRuntimeRunner.js.map +1 -1
  470. package/dist/runtime/runner/types.d.ts +3 -0
  471. package/dist/runtime/runner/types.js.map +1 -1
  472. package/dist/runtime/runtime-types.d.ts +2 -0
  473. package/dist/runtime/runtime-types.js.map +1 -1
  474. package/dist/runtime/safe-env.d.ts +15 -0
  475. package/dist/runtime/safe-env.js +109 -0
  476. package/dist/runtime/safe-env.js.map +1 -0
  477. package/dist/security/index.d.ts +1 -0
  478. package/dist/security/index.js +18 -0
  479. package/dist/security/index.js.map +1 -0
  480. package/dist/security/secret-cell/DeploymentRootKeyProvider.d.ts +17 -0
  481. package/dist/security/secret-cell/DeploymentRootKeyProvider.js +61 -0
  482. package/dist/security/secret-cell/DeploymentRootKeyProvider.js.map +1 -0
  483. package/dist/security/secret-cell/DeploymentRootKeyProvider.jsonld +124 -0
  484. package/dist/security/secret-cell/SecretCellVault.d.ts +55 -0
  485. package/dist/security/secret-cell/SecretCellVault.js +242 -0
  486. package/dist/security/secret-cell/SecretCellVault.js.map +1 -0
  487. package/dist/security/secret-cell/SecretCellVault.jsonld +207 -0
  488. package/dist/security/secret-cell/index.d.ts +2 -0
  489. package/dist/security/secret-cell/index.js +11 -0
  490. package/dist/security/secret-cell/index.js.map +1 -0
  491. package/dist/solidfs/CompositeSolidFsSyncer.d.ts +18 -0
  492. package/dist/solidfs/CompositeSolidFsSyncer.js +32 -0
  493. package/dist/solidfs/CompositeSolidFsSyncer.js.map +1 -0
  494. package/dist/solidfs/LocalSolidFS.js +25 -1
  495. package/dist/solidfs/LocalSolidFS.js.map +1 -1
  496. package/dist/solidfs/RdfIndexSolidFsSyncer.d.ts +41 -2
  497. package/dist/solidfs/RdfIndexSolidFsSyncer.js +331 -21
  498. package/dist/solidfs/RdfIndexSolidFsSyncer.js.map +1 -1
  499. package/dist/solidfs/SolidFsMetaNotes.d.ts +25 -0
  500. package/dist/solidfs/SolidFsMetaNotes.js +103 -0
  501. package/dist/solidfs/SolidFsMetaNotes.js.map +1 -0
  502. package/dist/solidfs/SolidFsSyncJournal.d.ts +2 -2
  503. package/dist/solidfs/SolidFsSyncJournal.js +9 -4
  504. package/dist/solidfs/SolidFsSyncJournal.js.map +1 -1
  505. package/dist/solidfs/SolidFsSyncJournal.jsonld +119 -0
  506. package/dist/solidfs/WorkspacePrompt.d.ts +13 -0
  507. package/dist/solidfs/WorkspacePrompt.js +42 -0
  508. package/dist/solidfs/WorkspacePrompt.js.map +1 -0
  509. package/dist/solidfs/index.d.ts +3 -0
  510. package/dist/solidfs/index.js +3 -0
  511. package/dist/solidfs/index.js.map +1 -1
  512. package/dist/solidfs/types.d.ts +12 -2
  513. package/dist/solidfs/types.js.map +1 -1
  514. package/dist/storage/accessors/MixDataAccessor.d.ts +36 -4
  515. package/dist/storage/accessors/MixDataAccessor.js +222 -23
  516. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  517. package/dist/storage/accessors/MixDataAccessor.jsonld +89 -0
  518. package/dist/storage/accessors/SolidRdfDataAccessor.d.ts +6 -1
  519. package/dist/storage/accessors/SolidRdfDataAccessor.js +35 -0
  520. package/dist/storage/accessors/SolidRdfDataAccessor.js.map +1 -1
  521. package/dist/storage/accessors/SolidRdfDataAccessor.jsonld +20 -0
  522. package/dist/storage/database/PostgresPoolManager.d.ts +1 -0
  523. package/dist/storage/database/PostgresPoolManager.js +2 -2
  524. package/dist/storage/database/PostgresPoolManager.js.map +1 -1
  525. package/dist/storage/locking/UrlAwareRedisLocker.d.ts +2 -0
  526. package/dist/storage/locking/UrlAwareRedisLocker.js +65 -0
  527. package/dist/storage/locking/UrlAwareRedisLocker.js.map +1 -1
  528. package/dist/storage/locking/UrlAwareRedisLocker.jsonld +19 -0
  529. package/dist/storage/rdf/PostgresRdfEngine.d.ts +286 -9
  530. package/dist/storage/rdf/PostgresRdfEngine.js +10773 -2084
  531. package/dist/storage/rdf/PostgresRdfEngine.js.map +1 -1
  532. package/dist/storage/rdf/PostgresRdfEngine.jsonld +1693 -89
  533. package/dist/storage/rdf/PostgresRdfSqlExecutor.d.ts +24 -0
  534. package/dist/storage/rdf/PostgresRdfSqlExecutor.js +131 -0
  535. package/dist/storage/rdf/PostgresRdfSqlExecutor.js.map +1 -0
  536. package/dist/storage/rdf/PostgresRdfTextIndex.d.ts +54 -0
  537. package/dist/storage/rdf/PostgresRdfTextIndex.js +1255 -0
  538. package/dist/storage/rdf/PostgresRdfTextIndex.js.map +1 -0
  539. package/dist/storage/rdf/PostgresRdfTextIndex.jsonld +487 -0
  540. package/dist/storage/rdf/PostgresRdfVectorIndex.d.ts +46 -0
  541. package/dist/storage/rdf/PostgresRdfVectorIndex.js +1165 -0
  542. package/dist/storage/rdf/PostgresRdfVectorIndex.js.map +1 -0
  543. package/dist/storage/rdf/PostgresRdfVectorIndex.jsonld +423 -0
  544. package/dist/storage/rdf/Rdf3xIndex.d.ts +14 -1
  545. package/dist/storage/rdf/Rdf3xIndex.js +286 -2
  546. package/dist/storage/rdf/Rdf3xIndex.js.map +1 -1
  547. package/dist/storage/rdf/Rdf3xIndex.jsonld +36 -0
  548. package/dist/storage/rdf/Rdf3xSchema.d.ts +5 -1
  549. package/dist/storage/rdf/Rdf3xSchema.js +17 -3
  550. package/dist/storage/rdf/Rdf3xSchema.js.map +1 -1
  551. package/dist/storage/rdf/RdfAccessScope.d.ts +22 -0
  552. package/dist/storage/rdf/RdfAccessScope.js +345 -0
  553. package/dist/storage/rdf/RdfAccessScope.js.map +1 -0
  554. package/dist/storage/rdf/RdfAccessScope.jsonld +45 -0
  555. package/dist/storage/rdf/RdfFusionRankPlan.d.ts +2 -0
  556. package/dist/storage/rdf/RdfFusionRankPlan.js +186 -0
  557. package/dist/storage/rdf/RdfFusionRankPlan.js.map +1 -0
  558. package/dist/storage/rdf/RdfJoinShape.d.ts +8 -0
  559. package/dist/storage/rdf/RdfJoinShape.js +31 -0
  560. package/dist/storage/rdf/RdfJoinShape.js.map +1 -0
  561. package/dist/storage/rdf/RdfQuadIndex.d.ts +5 -2
  562. package/dist/storage/rdf/RdfQuadIndex.js +94 -6
  563. package/dist/storage/rdf/RdfQuadIndex.js.map +1 -1
  564. package/dist/storage/rdf/RdfQuadIndex.jsonld +12 -0
  565. package/dist/storage/rdf/RdfQueryExecutor.d.ts +3 -4
  566. package/dist/storage/rdf/RdfQueryExecutor.js +235 -8
  567. package/dist/storage/rdf/RdfQueryExecutor.js.map +1 -1
  568. package/dist/storage/rdf/RdfSearchSourceFilter.d.ts +10 -0
  569. package/dist/storage/rdf/RdfSearchSourceFilter.js +83 -0
  570. package/dist/storage/rdf/RdfSearchSourceFilter.js.map +1 -0
  571. package/dist/storage/rdf/RdfSparqlAdapter.d.ts +27 -1
  572. package/dist/storage/rdf/RdfSparqlAdapter.js +265 -3
  573. package/dist/storage/rdf/RdfSparqlAdapter.js.map +1 -1
  574. package/dist/storage/rdf/RdfSparqlAdapter.jsonld +8 -0
  575. package/dist/storage/rdf/RdfTermDictionary.d.ts +7 -1
  576. package/dist/storage/rdf/RdfTermDictionary.js +139 -0
  577. package/dist/storage/rdf/RdfTermDictionary.js.map +1 -1
  578. package/dist/storage/rdf/RdfTermDictionary.jsonld +4 -0
  579. package/dist/storage/rdf/RdfTextIndex.d.ts +45 -2
  580. package/dist/storage/rdf/RdfTextIndex.js +810 -114
  581. package/dist/storage/rdf/RdfTextIndex.js.map +1 -1
  582. package/dist/storage/rdf/RdfTextIndex.jsonld +193 -0
  583. package/dist/storage/rdf/RdfTextProjection.d.ts +10 -0
  584. package/dist/storage/rdf/RdfTextProjection.js +258 -0
  585. package/dist/storage/rdf/RdfTextProjection.js.map +1 -0
  586. package/dist/storage/rdf/RdfVectorIndex.d.ts +30 -2
  587. package/dist/storage/rdf/RdfVectorIndex.js +461 -38
  588. package/dist/storage/rdf/RdfVectorIndex.js.map +1 -1
  589. package/dist/storage/rdf/RdfVectorIndex.jsonld +163 -0
  590. package/dist/storage/rdf/SolidRdfEngine.d.ts +12 -9
  591. package/dist/storage/rdf/SolidRdfEngine.js +48 -22
  592. package/dist/storage/rdf/SolidRdfEngine.js.map +1 -1
  593. package/dist/storage/rdf/SolidRdfEngine.jsonld +33 -43
  594. package/dist/storage/rdf/SolidRdfSparqlEngine.d.ts +19 -8
  595. package/dist/storage/rdf/SolidRdfSparqlEngine.js +674 -44
  596. package/dist/storage/rdf/SolidRdfSparqlEngine.js.map +1 -1
  597. package/dist/storage/rdf/SolidRdfSparqlEngine.jsonld +51 -0
  598. package/dist/storage/rdf/index.d.ts +9 -5
  599. package/dist/storage/rdf/index.js +42 -1
  600. package/dist/storage/rdf/index.js.map +1 -1
  601. package/dist/storage/rdf/models-benchmark.d.ts +264 -2
  602. package/dist/storage/rdf/models-benchmark.js +4207 -155
  603. package/dist/storage/rdf/models-benchmark.js.map +1 -1
  604. package/dist/storage/rdf/types.d.ts +833 -4
  605. package/dist/storage/rdf/types.js.map +1 -1
  606. package/dist/storage/rdf/types.jsonld +348 -0
  607. package/dist/storage/sparql/CompatibilitySparqlEngine.d.ts +14 -13
  608. package/dist/storage/sparql/CompatibilitySparqlEngine.js +24 -24
  609. package/dist/storage/sparql/CompatibilitySparqlEngine.js.map +1 -1
  610. package/dist/storage/sparql/CompatibilitySparqlEngineImpl.d.ts +14 -13
  611. package/dist/storage/sparql/CompatibilitySparqlEngineImpl.js +30 -18
  612. package/dist/storage/sparql/CompatibilitySparqlEngineImpl.js.map +1 -1
  613. package/dist/storage/sparql/SubgraphQueryEngine.d.ts +21 -12
  614. package/dist/storage/sparql/SubgraphQueryEngine.js +12 -12
  615. package/dist/storage/sparql/SubgraphQueryEngine.js.map +1 -1
  616. package/dist/terminal/sandbox/MacOSSandbox.js +2 -1
  617. package/dist/terminal/sandbox/MacOSSandbox.js.map +1 -1
  618. package/dist/terminal/sandbox/index.js +2 -1
  619. package/dist/terminal/sandbox/index.js.map +1 -1
  620. package/dist/test-utils/no-auth-xpod.js +3 -0
  621. package/dist/test-utils/no-auth-xpod.js.map +1 -1
  622. package/dist/tunnel/LocalTunnelProvider.d.ts +3 -0
  623. package/dist/tunnel/LocalTunnelProvider.js +17 -1
  624. package/dist/tunnel/LocalTunnelProvider.js.map +1 -1
  625. package/dist/tunnel/LocalTunnelProvider.jsonld +23 -0
  626. package/dist/tunnel/SakuraFrpTunnelProvider.d.ts +3 -0
  627. package/dist/tunnel/SakuraFrpTunnelProvider.js +18 -2
  628. package/dist/tunnel/SakuraFrpTunnelProvider.js.map +1 -1
  629. package/dist/tunnel/TunnelProfiles.d.ts +22 -0
  630. package/dist/tunnel/TunnelProfiles.js +208 -0
  631. package/dist/tunnel/TunnelProfiles.js.map +1 -0
  632. package/dist/tunnel/index.d.ts +2 -0
  633. package/dist/tunnel/index.js +4 -1
  634. package/dist/tunnel/index.js.map +1 -1
  635. package/dist/util/identifiers/ClusterIdentifierStrategy.d.ts +3 -0
  636. package/dist/util/identifiers/ClusterIdentifierStrategy.js +18 -2
  637. package/dist/util/identifiers/ClusterIdentifierStrategy.js.map +1 -1
  638. package/dist/util/identifiers/ClusterIdentifierStrategy.jsonld +5 -1
  639. package/node_modules/@undefineds.co/ai-connection/dist/AiClientConfigurationSection.d.ts +55 -0
  640. package/node_modules/@undefineds.co/ai-connection/dist/AiClientConfigurationSection.js +167 -0
  641. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionHeader.d.ts +3 -0
  642. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionHeader.js +8 -0
  643. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionList.d.ts +4 -0
  644. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionList.js +36 -0
  645. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionMain.d.ts +4 -0
  646. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionMain.js +37 -0
  647. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionMainHeader.d.ts +3 -0
  648. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionMainHeader.js +7 -0
  649. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionPanel.d.ts +14 -0
  650. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionPanel.js +333 -0
  651. package/node_modules/@undefineds.co/ai-connection/dist/AiProviderCard.d.ts +22 -0
  652. package/node_modules/@undefineds.co/ai-connection/dist/AiProviderCard.js +43 -0
  653. package/node_modules/@undefineds.co/ai-connection/dist/AiQuotaCard.d.ts +8 -0
  654. package/node_modules/@undefineds.co/ai-connection/dist/AiQuotaCard.js +6 -0
  655. package/node_modules/@undefineds.co/ai-connection/dist/ai-connection-client.d.ts +120 -0
  656. package/node_modules/@undefineds.co/ai-connection/dist/ai-connection-client.js +414 -0
  657. package/node_modules/@undefineds.co/ai-connection/dist/client-config/base-adapter.d.ts +32 -0
  658. package/node_modules/@undefineds.co/ai-connection/dist/client-config/base-adapter.js +212 -0
  659. package/node_modules/@undefineds.co/ai-connection/dist/client-config/codex.d.ts +14 -0
  660. package/node_modules/@undefineds.co/ai-connection/dist/client-config/codex.js +90 -0
  661. package/node_modules/@undefineds.co/ai-connection/dist/client-config/index.cjs +668 -0
  662. package/node_modules/@undefineds.co/ai-connection/dist/client-config/index.d.ts +6 -0
  663. package/node_modules/@undefineds.co/ai-connection/dist/client-config/index.js +6 -0
  664. package/node_modules/@undefineds.co/ai-connection/dist/client-config/json-env-adapter.d.ts +21 -0
  665. package/node_modules/@undefineds.co/ai-connection/dist/client-config/json-env-adapter.js +82 -0
  666. package/node_modules/@undefineds.co/ai-connection/dist/client-config/pi.d.ts +13 -0
  667. package/node_modules/@undefineds.co/ai-connection/dist/client-config/pi.js +83 -0
  668. package/node_modules/@undefineds.co/ai-connection/dist/client-config/transaction.d.ts +17 -0
  669. package/node_modules/@undefineds.co/ai-connection/dist/client-config/transaction.js +153 -0
  670. package/node_modules/@undefineds.co/ai-connection/dist/client-config/types.d.ts +40 -0
  671. package/node_modules/@undefineds.co/ai-connection/dist/client-config/types.js +1 -0
  672. package/node_modules/@undefineds.co/ai-connection/dist/controller.d.ts +42 -0
  673. package/node_modules/@undefineds.co/ai-connection/dist/controller.js +289 -0
  674. package/node_modules/@undefineds.co/ai-connection/dist/index.d.ts +16 -0
  675. package/node_modules/@undefineds.co/ai-connection/dist/index.js +41 -0
  676. package/node_modules/@undefineds.co/ai-connection/dist/manifest.d.ts +1 -0
  677. package/node_modules/@undefineds.co/ai-connection/dist/manifest.js +18 -0
  678. package/node_modules/@undefineds.co/ai-connection/dist/service-access.d.ts +3 -0
  679. package/node_modules/@undefineds.co/ai-connection/dist/service-access.js +133 -0
  680. package/node_modules/@undefineds.co/ai-connection/package.json +50 -0
  681. package/node_modules/@undefineds.co/extension-sdk/README.md +299 -0
  682. package/node_modules/@undefineds.co/extension-sdk/dist/index.d.ts +5 -0
  683. package/node_modules/@undefineds.co/extension-sdk/dist/index.js +5 -0
  684. package/node_modules/@undefineds.co/extension-sdk/dist/layout.d.ts +16 -0
  685. package/node_modules/@undefineds.co/extension-sdk/dist/layout.js +36 -0
  686. package/node_modules/@undefineds.co/extension-sdk/dist/manifest.d.ts +27 -0
  687. package/node_modules/@undefineds.co/extension-sdk/dist/manifest.js +79 -0
  688. package/node_modules/@undefineds.co/extension-sdk/dist/react/app-layout.d.ts +7 -0
  689. package/node_modules/@undefineds.co/extension-sdk/dist/react/app-layout.js +8 -0
  690. package/node_modules/@undefineds.co/extension-sdk/dist/react/auth-boundary.d.ts +27 -0
  691. package/node_modules/@undefineds.co/extension-sdk/dist/react/auth-boundary.js +49 -0
  692. package/node_modules/@undefineds.co/extension-sdk/dist/react/layout-context.d.ts +11 -0
  693. package/node_modules/@undefineds.co/extension-sdk/dist/react/layout-context.js +9 -0
  694. package/node_modules/@undefineds.co/extension-sdk/dist/react/workspace-layout.d.ts +38 -0
  695. package/node_modules/@undefineds.co/extension-sdk/dist/react/workspace-layout.js +132 -0
  696. package/node_modules/@undefineds.co/extension-sdk/dist/react.d.ts +12 -0
  697. package/node_modules/@undefineds.co/extension-sdk/dist/react.js +19 -0
  698. package/node_modules/@undefineds.co/extension-sdk/dist/testing.d.ts +7 -0
  699. package/node_modules/@undefineds.co/extension-sdk/dist/testing.js +27 -0
  700. package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +225 -0
  701. package/node_modules/@undefineds.co/extension-sdk/dist/web.js +142 -0
  702. package/node_modules/@undefineds.co/extension-sdk/package.json +49 -0
  703. package/node_modules/@undefineds.co/shared-ui/dist/badge.d.ts +8 -0
  704. package/node_modules/@undefineds.co/shared-ui/dist/badge.js +17 -0
  705. package/node_modules/@undefineds.co/shared-ui/dist/button.d.ts +10 -0
  706. package/node_modules/@undefineds.co/shared-ui/dist/button.js +30 -0
  707. package/node_modules/@undefineds.co/shared-ui/dist/card.d.ts +7 -0
  708. package/node_modules/@undefineds.co/shared-ui/dist/card.js +15 -0
  709. package/node_modules/@undefineds.co/shared-ui/dist/index.d.ts +6 -0
  710. package/node_modules/@undefineds.co/shared-ui/dist/index.js +6 -0
  711. package/node_modules/@undefineds.co/shared-ui/dist/input.d.ts +4 -0
  712. package/node_modules/@undefineds.co/shared-ui/dist/input.js +5 -0
  713. package/node_modules/@undefineds.co/shared-ui/dist/theme.css +121 -0
  714. package/node_modules/@undefineds.co/shared-ui/dist/utils.d.ts +2 -0
  715. package/node_modules/@undefineds.co/shared-ui/dist/utils.js +5 -0
  716. package/node_modules/@undefineds.co/shared-ui/dist/workspace.d.ts +23 -0
  717. package/node_modules/@undefineds.co/shared-ui/dist/workspace.js +38 -0
  718. package/node_modules/@undefineds.co/shared-ui/package.json +39 -0
  719. package/node_modules/@undefineds.co/solid-sdk/dist/index.d.ts +3 -0
  720. package/node_modules/@undefineds.co/solid-sdk/dist/index.js +3 -0
  721. package/node_modules/@undefineds.co/solid-sdk/dist/pod-runtime.d.ts +45 -0
  722. package/node_modules/@undefineds.co/solid-sdk/dist/pod-runtime.js +147 -0
  723. package/node_modules/@undefineds.co/solid-sdk/dist/react.d.ts +15 -0
  724. package/node_modules/@undefineds.co/solid-sdk/dist/react.js +15 -0
  725. package/node_modules/@undefineds.co/solid-sdk/dist/session.d.ts +42 -0
  726. package/node_modules/@undefineds.co/solid-sdk/dist/session.js +127 -0
  727. package/node_modules/@undefineds.co/solid-sdk/package.json +45 -0
  728. package/package.json +32 -12
  729. package/static/app/assets/index-BoYHJ6si.js +230 -0
  730. package/static/app/assets/inrupt-smoke.js +2 -2
  731. package/static/app/assets/main.css +1 -1
  732. package/static/app/assets/main.js +9 -9
  733. package/static/dashboard/assets/NetworkPage-Brt79fuQ.js +2 -0
  734. package/static/dashboard/assets/PaneListHeader-57nvMwH6.js +1 -0
  735. package/static/dashboard/assets/PodPage-CM6do1vB.js +2 -0
  736. package/static/dashboard/assets/ServicesPage-BUNxGJRz.js +1 -0
  737. package/static/dashboard/assets/card-B9Zjf_2p.js +1 -0
  738. package/static/dashboard/assets/dashboard-8C6o666W.js +305 -0
  739. package/static/dashboard/assets/dashboard-CSdewNeA.css +1 -0
  740. package/static/dashboard/assets/database-DPh9wDY9.js +1 -0
  741. package/static/dashboard/assets/external-link-VbMQvVMz.js +1 -0
  742. package/static/dashboard/assets/index-RfiFckzb.js +51 -0
  743. package/static/dashboard/assets/refresh-cw-BxVxNxNr.js +1 -0
  744. package/static/dashboard/assets/services-status-context-DKmJ7ISr.js +1 -0
  745. package/static/dashboard/dashboard.html +2 -2
  746. package/static/settings/assets/ModelsPage-D_IH7AH3.js +1 -0
  747. package/static/settings/assets/PaneListHeader-Bgaze006.js +1 -0
  748. package/static/settings/assets/PodPage-Cy1VNObw.js +2 -0
  749. package/static/settings/assets/ServicesPage-BsFaxVWC.js +1 -0
  750. package/static/settings/assets/SettingsPage-UafNWE_p.js +48 -0
  751. package/static/settings/assets/card-B_bXSIn-.js +1 -0
  752. package/static/settings/assets/services-status-context-DiX-AbrP.js +1 -0
  753. package/static/settings/assets/settings-B30oMfZq.js +305 -0
  754. package/static/settings/assets/settings-CSdewNeA.css +1 -0
  755. package/static/settings/assets/workspace-layout-Dv1Yn9Ci.js +1 -0
  756. package/static/settings/auth.html +21 -0
  757. package/static/settings/reachability.html +221 -0
  758. package/static/settings/reachability.svg +7 -0
  759. package/static/settings/reachability.webmanifest +18 -0
  760. package/static/settings/settings.html +13 -0
  761. package/static/settings/signal-pod.html +293 -0
  762. package/static/settings/vite.svg +1 -0
  763. package/dist/api/service/ai-gateway-transport.d.ts +0 -25
  764. package/dist/api/service/ai-gateway-transport.js +0 -136
  765. package/dist/api/service/ai-gateway-transport.js.map +0 -1
  766. package/dist/api/service/chat-protocol-adapters.d.ts +0 -5
  767. package/dist/api/service/chat-protocol-adapters.js +0 -146
  768. package/dist/api/service/chat-protocol-adapters.js.map +0 -1
  769. package/dist/api/service/chat-routing.d.ts +0 -8
  770. package/dist/api/service/chat-routing.js +0 -16
  771. package/dist/api/service/chat-routing.js.map +0 -1
  772. package/dist/api/service/platform-ai-config.d.ts +0 -10
  773. package/dist/api/service/platform-ai-config.js +0 -76
  774. package/dist/api/service/platform-ai-config.js.map +0 -1
  775. package/dist/document/DocumentParser.js.map +0 -1
  776. package/dist/document/JinaDocumentParser.js.map +0 -1
  777. package/static/app/assets/index-C1yksyT4.js +0 -171
  778. package/static/dashboard/assets/dashboard-BssaVKTn.css +0 -1
  779. package/static/dashboard/assets/dashboard-Ckuadl3C.js +0 -54
@@ -1 +1 @@
1
- {"version":3,"file":"LocalTunnelProvider.js","sourceRoot":"","sources":["../../src/tunnel/LocalTunnelProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, execSync, type ChildProcess } from 'node:child_process';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type {\n TunnelProvider,\n TunnelConfig,\n TunnelSetupOptions,\n TunnelStatus,\n} from './TunnelProvider';\n\n/** cloudflared metrics 端口 */\nconst CLOUDFLARED_METRICS_PORT = 33863;\n\n/**\n * Local Tunnel Provider 配置\n * 仅用于启动 cloudflared,不涉及 Cloudflare API 操作\n */\nexport interface LocalTunnelProviderOptions {\n /** Cloudflare Tunnel Token (从环境变量 CLOUDFLARE_TUNNEL_TOKEN 获取) */\n tunnelToken: string;\n\n /** cloudflared 可执行文件路径 (默认 'cloudflared') */\n cloudflaredPath?: string;\n}\n\n/**\n * Local Tunnel Provider\n * \n * 专为 Local 模式设计的简化版 Tunnel Provider\n * 只负责启动 cloudflared,不涉及 Cloudflare API 操作(创建 Tunnel、DNS 记录等)\n * \n * 使用场景:\n * - 用户已在 Cloudflare Dashboard 创建好 Tunnel\n * - 用户通过环境变量 CLOUDFLARE_TUNNEL_TOKEN 传入 Token\n * - 服务启动时自动启动 cloudflared\n */\nexport class LocalTunnelProvider implements TunnelProvider {\n public readonly name = 'cloudflare-local';\n private readonly logger = getLoggerFor(this);\n\n private readonly tunnelToken: string;\n private readonly cloudflaredPath: string;\n\n private process: ChildProcess | null = null;\n private status: TunnelStatus = {\n running: false,\n connected: false,\n };\n private currentConfig: TunnelConfig | null = null;\n /** 标记隧道进程是否由我们启动和管理 */\n private managedByUs = false;\n\n constructor(options: LocalTunnelProviderOptions) {\n this.tunnelToken = options.tunnelToken;\n this.cloudflaredPath = options.cloudflaredPath ?? 'cloudflared';\n }\n\n /**\n * Local 模式不需要 setup,直接返回基于 Token 的配置\n */\n async setup(options: TunnelSetupOptions): Promise<TunnelConfig> {\n const localProtocol = options.localProtocol ?? 'http';\n // Local 模式下,Tunnel 已在 Cloudflare Dashboard 创建\n // 只需要返回一个包含 Token 的配置\n const config: TunnelConfig = {\n subdomain: 'local', // 占位符,实际域名由 Cloudflare Tunnel 配置决定\n provider: 'cloudflare',\n endpoint: '', // 实际 endpoint 由 Cloudflare Tunnel 配置决定\n originUrl: `${localProtocol}://127.0.0.1:${options.localPort}`,\n tunnelToken: this.tunnelToken,\n };\n\n this.currentConfig = config;\n return config;\n }\n\n /**\n * 启动隧道客户端\n * 如果当前 provider 已经启动过进程,则跳过启动\n */\n async start(config?: TunnelConfig): Promise<void> {\n // 如果没有传入 config,使用默认配置\n const actualConfig = config ?? this.currentConfig ?? {\n subdomain: 'local',\n provider: 'cloudflare' as const,\n endpoint: '',\n originUrl: 'http://127.0.0.1:8080',\n tunnelToken: this.tunnelToken,\n };\n\n if (this.process) {\n this.logger.info('Already running (managed by us)');\n return;\n }\n\n const token = actualConfig.tunnelToken ?? this.tunnelToken;\n if (!token) {\n throw new Error('Tunnel token is required');\n }\n\n this.logger.info('Starting cloudflared tunnel...');\n this.status = { running: true, connected: false };\n this.managedByUs = true;\n\n const args = [\n 'tunnel',\n '--protocol', 'http2',\n '--no-autoupdate',\n 'run',\n '--token',\n token,\n ];\n if (actualConfig.originUrl) {\n args.push('--url', actualConfig.originUrl);\n }\n\n this.process = spawn(this.cloudflaredPath, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n const output = data.toString().trim();\n if (output) {\n this.logOutput(output);\n }\n\n // 检测连接成功\n if (output.includes('Connection registered') || output.includes('Registered tunnel connection')) {\n this.status.connected = true;\n this.status.lastHeartbeat = new Date();\n this.logger.info('Tunnel connected successfully');\n }\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n const output = data.toString().trim();\n if (output) {\n // cloudflared 的正常日志也输出到 stderr\n this.logOutput(output);\n\n // 检测连接成功\n if (output.includes('Registered tunnel connection') || output.includes('Connection registered')) {\n this.status.connected = true;\n this.status.lastHeartbeat = new Date();\n // logOutput 已经打印了信息,这里不需要重复打印\n }\n\n // 检测错误\n if (output.includes('ERR') || output.includes('failed')) {\n this.status.error = output;\n }\n }\n });\n\n this.process.on('exit', (code) => {\n this.logger.info(`Process exited with code ${code}`);\n this.status = { running: false, connected: false };\n this.process = null;\n this.managedByUs = false;\n });\n\n this.process.on('error', (error) => {\n this.logger.error(`Failed to start: ${error.message}`);\n this.status = { running: false, connected: false, error: error.message };\n this.process = null;\n this.managedByUs = false;\n });\n\n this.currentConfig = actualConfig;\n this.status.endpoint = actualConfig.endpoint;\n\n // 等待连接建立\n await this.waitForConnection();\n }\n\n /**\n * 解析并打印 cloudflared 日志\n */\n private logOutput(raw: string): void {\n const lines = raw.split('\\n');\n for (const line of lines) {\n if (!line.trim()) continue;\n \n // 尝试去除时间戳 (例如: 2023-01-01T00:00:00Z INF ...)\n // 正则匹配 ISO 时间戳开头\n const match = line.match(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z\\s+(INF|WRN|ERR)\\s+(.*)$/);\n \n if (match) {\n const level = match[1];\n const content = match[2];\n \n switch (level) {\n case 'INF':\n this.logger.info(content);\n break;\n case 'WRN':\n this.logger.warn(content);\n break;\n case 'ERR':\n this.logger.error(content);\n break;\n default:\n this.logger.info(content);\n }\n } else {\n // 无法解析格式,原样输出\n this.logger.info(line);\n }\n }\n }\n\n /**\n * 停止隧道\n * 只有当隧道是由我们启动时才会停止\n */\n async stop(): Promise<void> {\n if (!this.managedByUs) {\n this.logger.info('Not managed by us, skipping stop');\n this.status = { running: false, connected: false };\n return;\n }\n\n if (this.process) {\n this.logger.info('Stopping tunnel...');\n this.process.kill('SIGTERM');\n\n // 等待进程退出\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n this.logger.info('Force killing process...');\n this.process?.kill('SIGKILL');\n resolve();\n }, 5000);\n\n this.process?.on('exit', () => {\n clearTimeout(timeout);\n resolve();\n });\n });\n\n this.process = null;\n this.logger.info('Tunnel stopped');\n }\n\n this.status = { running: false, connected: false };\n this.managedByUs = false;\n }\n\n /**\n * 获取隧道状态\n */\n getStatus(): TunnelStatus {\n return { ...this.status };\n }\n\n /**\n * 获取公网端点\n */\n getEndpoint(): string | undefined {\n return this.currentConfig?.endpoint;\n }\n\n /**\n * Local 模式不需要 cleanup(不涉及 Cloudflare API 操作)\n */\n async cleanup(_config: TunnelConfig): Promise<void> {\n await this.stop();\n this.currentConfig = null;\n }\n\n // ============ 隧道检测方法 ============\n\n /**\n * 检测 cloudflared 是否已经在运行\n * 通过进程检测 + metrics 端口检测\n */\n async isCloudflaredRunning(): Promise<boolean> {\n // 方法1:检测进程\n if (this.isCloudflaredProcessRunning()) {\n return true;\n }\n\n // 方法2:检测 metrics 端口\n return await this.isMetricsPortOpen();\n }\n\n /**\n * 检测 cloudflared 进程是否存在\n */\n private isCloudflaredProcessRunning(): boolean {\n try {\n if (process.platform === 'win32') {\n execSync('tasklist /FI \"IMAGENAME eq cloudflared.exe\" | find \"cloudflared\"', { \n stdio: 'ignore' \n });\n } else {\n execSync('pgrep -x cloudflared', { stdio: 'ignore' });\n }\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * 检测 cloudflared metrics 端口是否开放\n */\n private async isMetricsPortOpen(): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n \n const res = await fetch(`http://localhost:${CLOUDFLARED_METRICS_PORT}/ready`, {\n signal: controller.signal,\n });\n \n clearTimeout(timeout);\n return res.ok;\n } catch {\n return false;\n }\n }\n\n /**\n * 等待连接建立\n */\n private async waitForConnection(timeout = 30000): Promise<void> {\n const start = Date.now();\n\n while (Date.now() - start < timeout) {\n if (this.status.connected) {\n return;\n }\n\n if (!this.status.running && this.status.error) {\n throw new Error(`Tunnel failed to start: ${this.status.error}`);\n }\n\n await new Promise((r) => setTimeout(r, 500));\n }\n\n // 超时不抛错,cloudflared 可能还在连接中\n this.logger.warn('Connection timeout, tunnel may still be connecting...');\n }\n\n /**\n * 获取是否由我们管理\n */\n isManagedByUs(): boolean {\n return this.managedByUs;\n }\n}\n"]}
1
+ {"version":3,"file":"LocalTunnelProvider.js","sourceRoot":"","sources":["../../src/tunnel/LocalTunnelProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, execSync, type ChildProcess } from 'node:child_process';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type {\n TunnelProvider,\n TunnelConfig,\n TunnelSetupOptions,\n TunnelStatus,\n} from './TunnelProvider';\n\n/** cloudflared metrics 端口 */\nconst CLOUDFLARED_METRICS_PORT = 33863;\n\n/**\n * Local Tunnel Provider 配置\n * 仅用于启动 cloudflared,不涉及 Cloudflare API 操作\n */\nexport interface LocalTunnelProviderOptions {\n /** Cloudflare Tunnel Token (从环境变量 CLOUDFLARE_TUNNEL_TOKEN 获取) */\n tunnelToken: string;\n\n /** Active profile public endpoint, shown in status and DDNS diagnostics. */\n publicUrl?: string;\n\n /** cloudflared 可执行文件路径 (默认 'cloudflared') */\n cloudflaredPath?: string;\n}\n\n/**\n * Local Tunnel Provider\n * \n * 专为 Local 模式设计的简化版 Tunnel Provider\n * 只负责启动 cloudflared,不涉及 Cloudflare API 操作(创建 Tunnel、DNS 记录等)\n * \n * 使用场景:\n * - 用户已在 Cloudflare Dashboard 创建好 Tunnel\n * - 用户通过环境变量 CLOUDFLARE_TUNNEL_TOKEN 传入 Token\n * - 服务启动时自动启动 cloudflared\n */\nexport class LocalTunnelProvider implements TunnelProvider {\n public readonly name = 'cloudflare-local';\n private readonly logger = getLoggerFor(this);\n\n private readonly tunnelToken: string;\n private readonly publicUrl?: string;\n private readonly cloudflaredPath: string;\n\n private process: ChildProcess | null = null;\n private status: TunnelStatus = {\n running: false,\n connected: false,\n };\n private currentConfig: TunnelConfig | null = null;\n /** 标记隧道进程是否由我们启动和管理 */\n private managedByUs = false;\n\n constructor(options: LocalTunnelProviderOptions) {\n this.tunnelToken = options.tunnelToken;\n this.publicUrl = normalizePublicEndpoint(options.publicUrl);\n this.cloudflaredPath = options.cloudflaredPath ?? 'cloudflared';\n }\n\n /**\n * Local 模式不需要 setup,直接返回基于 Token 的配置\n */\n async setup(options: TunnelSetupOptions): Promise<TunnelConfig> {\n const localProtocol = options.localProtocol ?? 'http';\n // Local 模式下,Tunnel 已在 Cloudflare Dashboard 创建\n // 只需要返回一个包含 Token 的配置\n const config: TunnelConfig = {\n subdomain: 'local', // 占位符,实际域名由 Cloudflare Tunnel 配置决定\n provider: 'cloudflare',\n endpoint: this.publicUrl ?? '', // 实际 endpoint 由 Cloudflare Tunnel 配置决定\n originUrl: `${localProtocol}://127.0.0.1:${options.localPort}`,\n tunnelToken: this.tunnelToken,\n };\n\n this.currentConfig = config;\n return config;\n }\n\n /**\n * 启动隧道客户端\n * 如果当前 provider 已经启动过进程,则跳过启动\n */\n async start(config?: TunnelConfig): Promise<void> {\n // 如果没有传入 config,使用默认配置\n const actualConfig = config ?? this.currentConfig ?? {\n subdomain: 'local',\n provider: 'cloudflare' as const,\n endpoint: '',\n originUrl: 'http://127.0.0.1:8080',\n tunnelToken: this.tunnelToken,\n };\n\n if (this.process) {\n this.logger.info('Already running (managed by us)');\n return;\n }\n\n const token = actualConfig.tunnelToken ?? this.tunnelToken;\n if (!token) {\n throw new Error('Tunnel token is required');\n }\n\n this.logger.info('Starting cloudflared tunnel...');\n this.status = { running: true, connected: false };\n this.managedByUs = true;\n\n const args = [\n 'tunnel',\n '--protocol', 'http2',\n '--no-autoupdate',\n 'run',\n '--token',\n token,\n ];\n if (actualConfig.originUrl) {\n args.push('--url', actualConfig.originUrl);\n }\n\n this.process = spawn(this.cloudflaredPath, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n const output = data.toString().trim();\n if (output) {\n this.logOutput(output);\n }\n\n // 检测连接成功\n if (output.includes('Connection registered') || output.includes('Registered tunnel connection')) {\n this.status.connected = true;\n this.status.lastHeartbeat = new Date();\n this.logger.info('Tunnel connected successfully');\n }\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n const output = data.toString().trim();\n if (output) {\n // cloudflared 的正常日志也输出到 stderr\n this.logOutput(output);\n\n // 检测连接成功\n if (output.includes('Registered tunnel connection') || output.includes('Connection registered')) {\n this.status.connected = true;\n this.status.lastHeartbeat = new Date();\n // logOutput 已经打印了信息,这里不需要重复打印\n }\n\n // 检测错误\n if (output.includes('ERR') || output.includes('failed')) {\n this.status.error = output;\n }\n }\n });\n\n this.process.on('exit', (code) => {\n this.logger.info(`Process exited with code ${code}`);\n this.status = { running: false, connected: false };\n this.process = null;\n this.managedByUs = false;\n });\n\n this.process.on('error', (error) => {\n this.logger.error(`Failed to start: ${error.message}`);\n this.status = { running: false, connected: false, error: error.message };\n this.process = null;\n this.managedByUs = false;\n });\n\n this.currentConfig = actualConfig;\n this.status.endpoint = actualConfig.endpoint;\n\n // 等待连接建立\n await this.waitForConnection();\n }\n\n /**\n * 解析并打印 cloudflared 日志\n */\n private logOutput(raw: string): void {\n const lines = raw.split('\\n');\n for (const line of lines) {\n if (!line.trim()) continue;\n \n // 尝试去除时间戳 (例如: 2023-01-01T00:00:00Z INF ...)\n // 正则匹配 ISO 时间戳开头\n const match = line.match(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z\\s+(INF|WRN|ERR)\\s+(.*)$/);\n \n if (match) {\n const level = match[1];\n const content = match[2];\n \n switch (level) {\n case 'INF':\n this.logger.info(content);\n break;\n case 'WRN':\n this.logger.warn(content);\n break;\n case 'ERR':\n this.logger.error(content);\n break;\n default:\n this.logger.info(content);\n }\n } else {\n // 无法解析格式,原样输出\n this.logger.info(line);\n }\n }\n }\n\n /**\n * 停止隧道\n * 只有当隧道是由我们启动时才会停止\n */\n async stop(): Promise<void> {\n if (!this.managedByUs) {\n this.logger.info('Not managed by us, skipping stop');\n this.status = { running: false, connected: false };\n return;\n }\n\n if (this.process) {\n this.logger.info('Stopping tunnel...');\n this.process.kill('SIGTERM');\n\n // 等待进程退出\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n this.logger.info('Force killing process...');\n this.process?.kill('SIGKILL');\n resolve();\n }, 5000);\n\n this.process?.on('exit', () => {\n clearTimeout(timeout);\n resolve();\n });\n });\n\n this.process = null;\n this.logger.info('Tunnel stopped');\n }\n\n this.status = { running: false, connected: false };\n this.managedByUs = false;\n }\n\n /**\n * 获取隧道状态\n */\n getStatus(): TunnelStatus {\n return { ...this.status };\n }\n\n /**\n * 获取公网端点\n */\n getEndpoint(): string | undefined {\n return this.currentConfig?.endpoint;\n }\n\n /**\n * Local 模式不需要 cleanup(不涉及 Cloudflare API 操作)\n */\n async cleanup(_config: TunnelConfig): Promise<void> {\n await this.stop();\n this.currentConfig = null;\n }\n\n // ============ 隧道检测方法 ============\n\n /**\n * 检测 cloudflared 是否已经在运行\n * 通过进程检测 + metrics 端口检测\n */\n async isCloudflaredRunning(): Promise<boolean> {\n // 方法1:检测进程\n if (this.isCloudflaredProcessRunning()) {\n return true;\n }\n\n // 方法2:检测 metrics 端口\n return await this.isMetricsPortOpen();\n }\n\n /**\n * 检测 cloudflared 进程是否存在\n */\n private isCloudflaredProcessRunning(): boolean {\n try {\n if (process.platform === 'win32') {\n execSync('tasklist /FI \"IMAGENAME eq cloudflared.exe\" | find \"cloudflared\"', { \n stdio: 'ignore' \n });\n } else {\n execSync('pgrep -x cloudflared', { stdio: 'ignore' });\n }\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * 检测 cloudflared metrics 端口是否开放\n */\n private async isMetricsPortOpen(): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n \n const res = await fetch(`http://localhost:${CLOUDFLARED_METRICS_PORT}/ready`, {\n signal: controller.signal,\n });\n \n clearTimeout(timeout);\n return res.ok;\n } catch {\n return false;\n }\n }\n\n /**\n * 等待连接建立\n */\n private async waitForConnection(timeout = 30000): Promise<void> {\n const start = Date.now();\n\n while (Date.now() - start < timeout) {\n if (this.status.connected) {\n return;\n }\n\n if (!this.status.running && this.status.error) {\n throw new Error(`Tunnel failed to start: ${this.status.error}`);\n }\n\n await new Promise((r) => setTimeout(r, 500));\n }\n\n // 超时不抛错,cloudflared 可能还在连接中\n this.logger.warn('Connection timeout, tunnel may still be connecting...');\n }\n\n /**\n * 获取是否由我们管理\n */\n isManagedByUs(): boolean {\n return this.managedByUs;\n }\n}\n\nfunction normalizePublicEndpoint(value: string | undefined): string | undefined {\n if (!value?.trim()) {\n return undefined;\n }\n try {\n const url = new URL(value.trim());\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n return undefined;\n }\n return url.toString().replace(/\\/+$/u, '') + '/';\n } catch {\n return value.trim();\n }\n}\n"]}
@@ -18,6 +18,19 @@
18
18
  "range": "xsd:string",
19
19
  "comment": "Cloudflare Tunnel Token (从环境变量 CLOUDFLARE_TUNNEL_TOKEN 获取)"
20
20
  },
21
+ {
22
+ "@id": "undefineds:dist/tunnel/LocalTunnelProvider.jsonld#LocalTunnelProvider_options_publicUrl",
23
+ "range": {
24
+ "@type": "ParameterRangeUnion",
25
+ "parameterRangeElements": [
26
+ "xsd:string",
27
+ {
28
+ "@type": "ParameterRangeUndefined"
29
+ }
30
+ ]
31
+ },
32
+ "comment": "Active profile public endpoint, shown in status and DDNS diagnostics."
33
+ },
21
34
  {
22
35
  "@id": "undefineds:dist/tunnel/LocalTunnelProvider.jsonld#LocalTunnelProvider_options_cloudflaredPath",
23
36
  "range": {
@@ -45,6 +58,10 @@
45
58
  "@id": "undefineds:dist/tunnel/LocalTunnelProvider.jsonld#LocalTunnelProvider__member_tunnelToken",
46
59
  "memberFieldName": "tunnelToken"
47
60
  },
61
+ {
62
+ "@id": "undefineds:dist/tunnel/LocalTunnelProvider.jsonld#LocalTunnelProvider__member_publicUrl",
63
+ "memberFieldName": "publicUrl"
64
+ },
48
65
  {
49
66
  "@id": "undefineds:dist/tunnel/LocalTunnelProvider.jsonld#LocalTunnelProvider__member_cloudflaredPath",
50
67
  "memberFieldName": "cloudflaredPath"
@@ -128,6 +145,12 @@
128
145
  "@id": "undefineds:dist/tunnel/LocalTunnelProvider.jsonld#LocalTunnelProvider_options_tunnelToken"
129
146
  }
130
147
  },
148
+ {
149
+ "keyRaw": "publicUrl",
150
+ "value": {
151
+ "@id": "undefineds:dist/tunnel/LocalTunnelProvider.jsonld#LocalTunnelProvider_options_publicUrl"
152
+ }
153
+ },
131
154
  {
132
155
  "keyRaw": "cloudflaredPath",
133
156
  "value": {
@@ -13,6 +13,8 @@ import type { TunnelProvider, TunnelConfig, TunnelSetupOptions, TunnelStatus } f
13
13
  export interface SakuraFrpTunnelProviderOptions {
14
14
  /** SakuraFRP Token (从环境变量 SAKURA_TUNNEL_TOKEN 获取) */
15
15
  token: string;
16
+ /** Active profile public endpoint, shown in status and DDNS diagnostics. */
17
+ publicUrl?: string;
16
18
  /** frpc 可执行文件路径 (默认 'frpc') */
17
19
  frpcPath?: string;
18
20
  /** SakuraFRP 服务端地址 (如果需要自定义) */
@@ -27,6 +29,7 @@ export declare class SakuraFrpTunnelProvider implements TunnelProvider {
27
29
  readonly name = "sakura-frp";
28
30
  private readonly logger;
29
31
  private readonly token;
32
+ private readonly publicUrl?;
30
33
  private readonly frpcPath;
31
34
  private readonly serverAddr?;
32
35
  private process;
@@ -28,6 +28,7 @@ class SakuraFrpTunnelProvider {
28
28
  this.currentConfig = null;
29
29
  this.managedByUs = false;
30
30
  this.token = options.token;
31
+ this.publicUrl = normalizePublicEndpoint(options.publicUrl);
31
32
  this.frpcPath = options.frpcPath ?? 'frpc';
32
33
  this.serverAddr = options.serverAddr;
33
34
  }
@@ -40,7 +41,7 @@ class SakuraFrpTunnelProvider {
40
41
  const config = {
41
42
  subdomain: 'sakura',
42
43
  provider: 'sakura-frp',
43
- endpoint: '',
44
+ endpoint: this.publicUrl ?? '',
44
45
  tunnelToken: this.token,
45
46
  };
46
47
  this.currentConfig = config;
@@ -53,7 +54,7 @@ class SakuraFrpTunnelProvider {
53
54
  const actualConfig = config ?? {
54
55
  subdomain: 'sakura',
55
56
  provider: 'sakura-frp',
56
- endpoint: '',
57
+ endpoint: this.publicUrl ?? '',
57
58
  tunnelToken: this.token,
58
59
  };
59
60
  // 检测是否已经在运行
@@ -204,4 +205,19 @@ class SakuraFrpTunnelProvider {
204
205
  }
205
206
  }
206
207
  exports.SakuraFrpTunnelProvider = SakuraFrpTunnelProvider;
208
+ function normalizePublicEndpoint(value) {
209
+ if (!value?.trim()) {
210
+ return undefined;
211
+ }
212
+ try {
213
+ const url = new URL(value.trim());
214
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
215
+ return undefined;
216
+ }
217
+ return url.toString().replace(/\/+$/u, '') + '/';
218
+ }
219
+ catch {
220
+ return value.trim();
221
+ }
222
+ }
207
223
  //# sourceMappingURL=SakuraFrpTunnelProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SakuraFrpTunnelProvider.js","sourceRoot":"","sources":["../../src/tunnel/SakuraFrpTunnelProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SakuraFRP Tunnel Provider\n *\n * 使用 SakuraFRP 提供隧道服务\n * 用于没有公网 IP 的 Local 节点\n *\n * 需要用户在 SakuraFRP 控制台创建隧道并获取 Token\n */\n\nimport { spawn, execSync, type ChildProcess } from 'node:child_process';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type {\n TunnelProvider,\n TunnelConfig,\n TunnelSetupOptions,\n TunnelStatus,\n} from './TunnelProvider';\n\n/**\n * SakuraFRP Tunnel Provider 配置\n */\nexport interface SakuraFrpTunnelProviderOptions {\n /** SakuraFRP Token (从环境变量 SAKURA_TUNNEL_TOKEN 获取) */\n token: string;\n\n /** frpc 可执行文件路径 (默认 'frpc') */\n frpcPath?: string;\n\n /** SakuraFRP 服务端地址 (如果需要自定义) */\n serverAddr?: string;\n}\n\n/**\n * SakuraFRP Tunnel Provider\n *\n * 通过 frpc 客户端连接 SakuraFRP 服务\n */\nexport class SakuraFrpTunnelProvider implements TunnelProvider {\n public readonly name = 'sakura-frp';\n private readonly logger = getLoggerFor(this);\n\n private readonly token: string;\n private readonly frpcPath: string;\n private readonly serverAddr?: string;\n\n private process: ChildProcess | null = null;\n private status: TunnelStatus = {\n running: false,\n connected: false,\n };\n private currentConfig: TunnelConfig | null = null;\n private managedByUs = false;\n\n constructor(options: SakuraFrpTunnelProviderOptions) {\n this.token = options.token;\n this.frpcPath = options.frpcPath ?? 'frpc';\n this.serverAddr = options.serverAddr;\n }\n\n /**\n * Setup: 解析 Token 获取配置\n */\n async setup(_options: TunnelSetupOptions): Promise<TunnelConfig> {\n // SakuraFRP Token 格式通常包含隧道信息\n // 这里返回基本配置,实际配置由 frpc 从 Token 获取\n const config: TunnelConfig = {\n subdomain: 'sakura',\n provider: 'sakura-frp',\n endpoint: '',\n tunnelToken: this.token,\n };\n\n this.currentConfig = config;\n return config;\n }\n\n /**\n * 启动 frpc 客户端\n */\n async start(config?: TunnelConfig): Promise<void> {\n const actualConfig = config ?? {\n subdomain: 'sakura',\n provider: 'sakura-frp' as const,\n endpoint: '',\n tunnelToken: this.token,\n };\n\n // 检测是否已经在运行\n if (this.isFrpcRunning()) {\n this.logger.info('frpc already running externally');\n this.status = { running: true, connected: true };\n this.currentConfig = actualConfig;\n this.managedByUs = false;\n return;\n }\n\n if (this.process) {\n this.logger.info('Already running (managed by us)');\n return;\n }\n\n const token = actualConfig.tunnelToken ?? this.token;\n if (!token) {\n throw new Error('SakuraFRP token is required');\n }\n\n this.logger.info('Starting SakuraFRP tunnel...');\n this.status = { running: true, connected: false };\n this.managedByUs = true;\n\n // SakuraFRP 使用 frpc 客户端\n // 命令格式: frpc -f <token>\n const args = ['-f', token];\n if (this.serverAddr) {\n args.push('-s', this.serverAddr);\n }\n\n this.process = spawn(this.frpcPath, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n const output = data.toString().trim();\n if (output) {\n this.logger.info(`[frpc] ${output}`);\n this.checkConnectionStatus(output);\n }\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n const output = data.toString().trim();\n if (output) {\n this.logger.warn(`[frpc] ${output}`);\n this.checkConnectionStatus(output);\n }\n });\n\n this.process.on('exit', (code) => {\n this.logger.info(`frpc exited with code ${code}`);\n this.status = { running: false, connected: false };\n this.process = null;\n this.managedByUs = false;\n });\n\n this.process.on('error', (error) => {\n this.logger.error(`Failed to start frpc: ${error.message}`);\n this.status = { running: false, connected: false, error: error.message };\n this.process = null;\n this.managedByUs = false;\n });\n\n this.currentConfig = actualConfig;\n\n // 等待连接\n await this.waitForConnection();\n }\n\n private checkConnectionStatus(output: string): void {\n // 检测连接成功的关键字\n if (\n output.includes('start proxy success') ||\n output.includes('login to server success') ||\n output.includes('tunnel running')\n ) {\n this.status.connected = true;\n this.status.lastHeartbeat = new Date();\n this.logger.info('SakuraFRP tunnel connected');\n }\n\n // 检测错误\n if (output.includes('error') || output.includes('failed')) {\n this.status.error = output;\n }\n }\n\n /**\n * 停止隧道\n */\n async stop(): Promise<void> {\n if (!this.managedByUs) {\n this.logger.info('Not managed by us, skipping stop');\n this.status = { running: false, connected: false };\n return;\n }\n\n if (this.process) {\n this.logger.info('Stopping SakuraFRP tunnel...');\n this.process.kill('SIGTERM');\n\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n this.logger.info('Force killing frpc...');\n this.process?.kill('SIGKILL');\n resolve();\n }, 5000);\n\n this.process?.on('exit', () => {\n clearTimeout(timeout);\n resolve();\n });\n });\n\n this.process = null;\n this.logger.info('SakuraFRP tunnel stopped');\n }\n\n this.status = { running: false, connected: false };\n this.managedByUs = false;\n }\n\n getStatus(): TunnelStatus {\n return { ...this.status };\n }\n\n getEndpoint(): string | undefined {\n return this.currentConfig?.endpoint;\n }\n\n async cleanup(_config: TunnelConfig): Promise<void> {\n await this.stop();\n this.currentConfig = null;\n }\n\n /**\n * 检测 frpc 是否已经在运行\n */\n private isFrpcRunning(): boolean {\n try {\n if (process.platform === 'win32') {\n execSync('tasklist /FI \"IMAGENAME eq frpc.exe\" | find \"frpc\"', {\n stdio: 'ignore',\n });\n } else {\n execSync('pgrep -x frpc', { stdio: 'ignore' });\n }\n return true;\n } catch {\n return false;\n }\n }\n\n private async waitForConnection(timeout = 30000): Promise<void> {\n const start = Date.now();\n\n while (Date.now() - start < timeout) {\n if (this.status.connected) {\n return;\n }\n\n if (!this.status.running && this.status.error) {\n throw new Error(`SakuraFRP failed to start: ${this.status.error}`);\n }\n\n await new Promise((r) => setTimeout(r, 500));\n }\n\n this.logger.warn('Connection timeout, tunnel may still be connecting...');\n }\n\n isManagedByUs(): boolean {\n return this.managedByUs;\n }\n}\n"]}
1
+ {"version":3,"file":"SakuraFrpTunnelProvider.js","sourceRoot":"","sources":["../../src/tunnel/SakuraFrpTunnelProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SakuraFRP Tunnel Provider\n *\n * 使用 SakuraFRP 提供隧道服务\n * 用于没有公网 IP 的 Local 节点\n *\n * 需要用户在 SakuraFRP 控制台创建隧道并获取 Token\n */\n\nimport { spawn, execSync, type ChildProcess } from 'node:child_process';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type {\n TunnelProvider,\n TunnelConfig,\n TunnelSetupOptions,\n TunnelStatus,\n} from './TunnelProvider';\n\n/**\n * SakuraFRP Tunnel Provider 配置\n */\nexport interface SakuraFrpTunnelProviderOptions {\n /** SakuraFRP Token (从环境变量 SAKURA_TUNNEL_TOKEN 获取) */\n token: string;\n\n /** Active profile public endpoint, shown in status and DDNS diagnostics. */\n publicUrl?: string;\n\n /** frpc 可执行文件路径 (默认 'frpc') */\n frpcPath?: string;\n\n /** SakuraFRP 服务端地址 (如果需要自定义) */\n serverAddr?: string;\n}\n\n/**\n * SakuraFRP Tunnel Provider\n *\n * 通过 frpc 客户端连接 SakuraFRP 服务\n */\nexport class SakuraFrpTunnelProvider implements TunnelProvider {\n public readonly name = 'sakura-frp';\n private readonly logger = getLoggerFor(this);\n\n private readonly token: string;\n private readonly publicUrl?: string;\n private readonly frpcPath: string;\n private readonly serverAddr?: string;\n\n private process: ChildProcess | null = null;\n private status: TunnelStatus = {\n running: false,\n connected: false,\n };\n private currentConfig: TunnelConfig | null = null;\n private managedByUs = false;\n\n constructor(options: SakuraFrpTunnelProviderOptions) {\n this.token = options.token;\n this.publicUrl = normalizePublicEndpoint(options.publicUrl);\n this.frpcPath = options.frpcPath ?? 'frpc';\n this.serverAddr = options.serverAddr;\n }\n\n /**\n * Setup: 解析 Token 获取配置\n */\n async setup(_options: TunnelSetupOptions): Promise<TunnelConfig> {\n // SakuraFRP Token 格式通常包含隧道信息\n // 这里返回基本配置,实际配置由 frpc 从 Token 获取\n const config: TunnelConfig = {\n subdomain: 'sakura',\n provider: 'sakura-frp',\n endpoint: this.publicUrl ?? '',\n tunnelToken: this.token,\n };\n\n this.currentConfig = config;\n return config;\n }\n\n /**\n * 启动 frpc 客户端\n */\n async start(config?: TunnelConfig): Promise<void> {\n const actualConfig = config ?? {\n subdomain: 'sakura',\n provider: 'sakura-frp' as const,\n endpoint: this.publicUrl ?? '',\n tunnelToken: this.token,\n };\n\n // 检测是否已经在运行\n if (this.isFrpcRunning()) {\n this.logger.info('frpc already running externally');\n this.status = { running: true, connected: true };\n this.currentConfig = actualConfig;\n this.managedByUs = false;\n return;\n }\n\n if (this.process) {\n this.logger.info('Already running (managed by us)');\n return;\n }\n\n const token = actualConfig.tunnelToken ?? this.token;\n if (!token) {\n throw new Error('SakuraFRP token is required');\n }\n\n this.logger.info('Starting SakuraFRP tunnel...');\n this.status = { running: true, connected: false };\n this.managedByUs = true;\n\n // SakuraFRP 使用 frpc 客户端\n // 命令格式: frpc -f <token>\n const args = ['-f', token];\n if (this.serverAddr) {\n args.push('-s', this.serverAddr);\n }\n\n this.process = spawn(this.frpcPath, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n const output = data.toString().trim();\n if (output) {\n this.logger.info(`[frpc] ${output}`);\n this.checkConnectionStatus(output);\n }\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n const output = data.toString().trim();\n if (output) {\n this.logger.warn(`[frpc] ${output}`);\n this.checkConnectionStatus(output);\n }\n });\n\n this.process.on('exit', (code) => {\n this.logger.info(`frpc exited with code ${code}`);\n this.status = { running: false, connected: false };\n this.process = null;\n this.managedByUs = false;\n });\n\n this.process.on('error', (error) => {\n this.logger.error(`Failed to start frpc: ${error.message}`);\n this.status = { running: false, connected: false, error: error.message };\n this.process = null;\n this.managedByUs = false;\n });\n\n this.currentConfig = actualConfig;\n\n // 等待连接\n await this.waitForConnection();\n }\n\n private checkConnectionStatus(output: string): void {\n // 检测连接成功的关键字\n if (\n output.includes('start proxy success') ||\n output.includes('login to server success') ||\n output.includes('tunnel running')\n ) {\n this.status.connected = true;\n this.status.lastHeartbeat = new Date();\n this.logger.info('SakuraFRP tunnel connected');\n }\n\n // 检测错误\n if (output.includes('error') || output.includes('failed')) {\n this.status.error = output;\n }\n }\n\n /**\n * 停止隧道\n */\n async stop(): Promise<void> {\n if (!this.managedByUs) {\n this.logger.info('Not managed by us, skipping stop');\n this.status = { running: false, connected: false };\n return;\n }\n\n if (this.process) {\n this.logger.info('Stopping SakuraFRP tunnel...');\n this.process.kill('SIGTERM');\n\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n this.logger.info('Force killing frpc...');\n this.process?.kill('SIGKILL');\n resolve();\n }, 5000);\n\n this.process?.on('exit', () => {\n clearTimeout(timeout);\n resolve();\n });\n });\n\n this.process = null;\n this.logger.info('SakuraFRP tunnel stopped');\n }\n\n this.status = { running: false, connected: false };\n this.managedByUs = false;\n }\n\n getStatus(): TunnelStatus {\n return { ...this.status };\n }\n\n getEndpoint(): string | undefined {\n return this.currentConfig?.endpoint;\n }\n\n async cleanup(_config: TunnelConfig): Promise<void> {\n await this.stop();\n this.currentConfig = null;\n }\n\n /**\n * 检测 frpc 是否已经在运行\n */\n private isFrpcRunning(): boolean {\n try {\n if (process.platform === 'win32') {\n execSync('tasklist /FI \"IMAGENAME eq frpc.exe\" | find \"frpc\"', {\n stdio: 'ignore',\n });\n } else {\n execSync('pgrep -x frpc', { stdio: 'ignore' });\n }\n return true;\n } catch {\n return false;\n }\n }\n\n private async waitForConnection(timeout = 30000): Promise<void> {\n const start = Date.now();\n\n while (Date.now() - start < timeout) {\n if (this.status.connected) {\n return;\n }\n\n if (!this.status.running && this.status.error) {\n throw new Error(`SakuraFRP failed to start: ${this.status.error}`);\n }\n\n await new Promise((r) => setTimeout(r, 500));\n }\n\n this.logger.warn('Connection timeout, tunnel may still be connecting...');\n }\n\n isManagedByUs(): boolean {\n return this.managedByUs;\n }\n}\n\nfunction normalizePublicEndpoint(value: string | undefined): string | undefined {\n if (!value?.trim()) {\n return undefined;\n }\n try {\n const url = new URL(value.trim());\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n return undefined;\n }\n return url.toString().replace(/\\/+$/u, '') + '/';\n } catch {\n return value.trim();\n }\n}\n"]}
@@ -0,0 +1,22 @@
1
+ export declare const TUNNEL_PROVIDER_VALUES: readonly ["ngrok", "cloudflare", "sakura_frp", "frp"];
2
+ export type TunnelProfileProvider = (typeof TUNNEL_PROVIDER_VALUES)[number];
3
+ export type ActiveTunnelProvider = TunnelProfileProvider | 'none';
4
+ export interface TunnelProfile {
5
+ id: string;
6
+ provider: TunnelProfileProvider;
7
+ label?: string;
8
+ publicUrl?: string;
9
+ credentialEnvKey?: string;
10
+ credentialConfigured?: boolean;
11
+ }
12
+ export interface TunnelProfileState {
13
+ profiles: TunnelProfile[];
14
+ activeProfileId?: string;
15
+ activeProfile?: TunnelProfile;
16
+ inactiveProfiles: TunnelProfile[];
17
+ activeProvider: ActiveTunnelProvider;
18
+ }
19
+ type EnvLike = Record<string, string | undefined>;
20
+ export declare function resolveTunnelProfileState(env: EnvLike): TunnelProfileState;
21
+ export declare function selectActiveTunnelProfile(inputProfiles: readonly TunnelProfile[], activeProfileId?: string): TunnelProfileState;
22
+ export {};
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TUNNEL_PROVIDER_VALUES = void 0;
4
+ exports.resolveTunnelProfileState = resolveTunnelProfileState;
5
+ exports.selectActiveTunnelProfile = selectActiveTunnelProfile;
6
+ exports.TUNNEL_PROVIDER_VALUES = ['ngrok', 'cloudflare', 'sakura_frp', 'frp'];
7
+ const LEGACY_PROVIDER_SPECS = [
8
+ {
9
+ provider: 'ngrok',
10
+ id: 'ngrok',
11
+ label: 'ngrok',
12
+ publicUrlKeys: ['NGROK_URL'],
13
+ credentialEnvKey: 'NGROK_AUTHTOKEN',
14
+ },
15
+ {
16
+ provider: 'cloudflare',
17
+ id: 'cloudflare',
18
+ label: 'Cloudflare Tunnel',
19
+ publicUrlKeys: ['CLOUDFLARE_TUNNEL_URL', 'XPOD_TUNNEL_PUBLIC_URL'],
20
+ credentialEnvKey: 'CLOUDFLARE_TUNNEL_TOKEN',
21
+ },
22
+ {
23
+ provider: 'sakura_frp',
24
+ id: 'sakura_frp',
25
+ label: 'Sakura FRP',
26
+ publicUrlKeys: ['SAKURA_TUNNEL_URL', 'XPOD_TUNNEL_PUBLIC_URL'],
27
+ credentialEnvKey: 'SAKURA_TUNNEL_TOKEN',
28
+ },
29
+ {
30
+ provider: 'frp',
31
+ id: 'frp',
32
+ label: 'FRP',
33
+ publicUrlKeys: ['FRP_TUNNEL_URL'],
34
+ credentialEnvKey: 'FRP_TUNNEL_TOKEN',
35
+ },
36
+ ];
37
+ const PROVIDER_ALIASES = {
38
+ none: 'none',
39
+ ngrok: 'ngrok',
40
+ cloudflare: 'cloudflare',
41
+ 'sakura-frp': 'sakura_frp',
42
+ sakura_frp: 'sakura_frp',
43
+ frp: 'frp',
44
+ };
45
+ function resolveTunnelProfileState(env) {
46
+ const explicitProfiles = parseTunnelProfiles(env.XPOD_TUNNEL_PROFILES, env);
47
+ const profiles = explicitProfiles.length > 0 ? explicitProfiles : buildLegacyTunnelProfiles(env);
48
+ const activeProfileId = resolveActiveProfileId(env, profiles);
49
+ return selectActiveTunnelProfile(profiles, activeProfileId);
50
+ }
51
+ function selectActiveTunnelProfile(inputProfiles, activeProfileId) {
52
+ const profiles = normalizeProfiles(inputProfiles);
53
+ const requestedId = readString(activeProfileId);
54
+ const activeProfile = profiles.find((profile) => profile.id === requestedId && canActivateProfile(profile));
55
+ const inactiveProfiles = profiles.filter((profile) => profile.id !== activeProfile?.id);
56
+ return {
57
+ profiles,
58
+ activeProfileId: requestedId,
59
+ activeProfile,
60
+ inactiveProfiles,
61
+ activeProvider: activeProfile?.provider ?? 'none',
62
+ };
63
+ }
64
+ function buildLegacyTunnelProfiles(env) {
65
+ const profiles = [];
66
+ for (const spec of LEGACY_PROVIDER_SPECS) {
67
+ const publicUrl = readFirstUrl(env, spec.publicUrlKeys);
68
+ const credentialConfigured = spec.credentialEnvKey ? Boolean(readString(env[spec.credentialEnvKey])) : undefined;
69
+ if (!publicUrl && !credentialConfigured && readLegacyProvider(env.XPOD_TUNNEL_PROVIDER) !== spec.provider) {
70
+ continue;
71
+ }
72
+ profiles.push({
73
+ id: spec.id,
74
+ provider: spec.provider,
75
+ label: spec.label,
76
+ publicUrl,
77
+ credentialEnvKey: spec.credentialEnvKey,
78
+ credentialConfigured,
79
+ });
80
+ }
81
+ return profiles;
82
+ }
83
+ function parseTunnelProfiles(value, env) {
84
+ const raw = readString(value);
85
+ if (!raw) {
86
+ return [];
87
+ }
88
+ try {
89
+ const parsed = JSON.parse(raw);
90
+ if (!Array.isArray(parsed)) {
91
+ return [];
92
+ }
93
+ return parsed.flatMap((item) => {
94
+ if (!item || typeof item !== 'object' || Array.isArray(item)) {
95
+ return [];
96
+ }
97
+ const record = item;
98
+ const id = readString(record.id);
99
+ const provider = readProvider(record.provider);
100
+ if (!id || !provider || provider === 'none') {
101
+ return [];
102
+ }
103
+ const credentialEnvKey = readString(record.credentialEnvKey) ?? defaultCredentialEnvKey(provider);
104
+ return [{
105
+ id,
106
+ provider,
107
+ label: readString(record.label),
108
+ publicUrl: normalizeUrl(readString(record.publicUrl)),
109
+ credentialEnvKey,
110
+ credentialConfigured: credentialEnvKey ? Boolean(readString(env[credentialEnvKey])) : undefined,
111
+ }];
112
+ });
113
+ }
114
+ catch {
115
+ return [];
116
+ }
117
+ }
118
+ function normalizeProfiles(inputProfiles) {
119
+ const seen = new Set();
120
+ const profiles = [];
121
+ for (const profile of inputProfiles) {
122
+ const id = readString(profile.id);
123
+ const provider = readProvider(profile.provider);
124
+ if (!id || !provider || provider === 'none' || seen.has(id)) {
125
+ continue;
126
+ }
127
+ seen.add(id);
128
+ profiles.push({
129
+ id,
130
+ provider,
131
+ label: readString(profile.label),
132
+ publicUrl: normalizeUrl(profile.publicUrl),
133
+ credentialEnvKey: readString(profile.credentialEnvKey) ?? defaultCredentialEnvKey(provider),
134
+ credentialConfigured: profile.credentialConfigured,
135
+ });
136
+ }
137
+ return profiles;
138
+ }
139
+ function resolveActiveProfileId(env, profiles) {
140
+ const explicitProfileId = readString(env.XPOD_TUNNEL_ACTIVE_PROFILE_ID);
141
+ if (explicitProfileId) {
142
+ return explicitProfileId;
143
+ }
144
+ const legacyProviderRaw = readString(env.XPOD_TUNNEL_PROVIDER);
145
+ const legacyProvider = readLegacyProvider(legacyProviderRaw);
146
+ if (legacyProvider === 'none') {
147
+ return 'none';
148
+ }
149
+ const legacyProfileId = legacyProviderToProfileId(legacyProviderRaw, profiles);
150
+ if (legacyProfileId) {
151
+ return legacyProfileId;
152
+ }
153
+ return profiles.find(canActivateProfile)?.id;
154
+ }
155
+ function legacyProviderToProfileId(value, profiles) {
156
+ const provider = readLegacyProvider(value);
157
+ if (!provider || provider === 'none') {
158
+ return undefined;
159
+ }
160
+ return profiles.find((profile) => profile.provider === provider)?.id ?? provider;
161
+ }
162
+ function readLegacyProvider(value) {
163
+ return readProvider(value);
164
+ }
165
+ function readProvider(value) {
166
+ if (typeof value !== 'string') {
167
+ return undefined;
168
+ }
169
+ return PROVIDER_ALIASES[value.trim().toLowerCase()];
170
+ }
171
+ function canActivateProfile(profile) {
172
+ if (profile.provider === 'ngrok') {
173
+ return true;
174
+ }
175
+ return profile.credentialConfigured !== false;
176
+ }
177
+ function readFirstUrl(env, keys) {
178
+ for (const key of keys) {
179
+ const normalized = normalizeUrl(readString(env[key]));
180
+ if (normalized) {
181
+ return normalized;
182
+ }
183
+ }
184
+ return undefined;
185
+ }
186
+ function defaultCredentialEnvKey(provider) {
187
+ return LEGACY_PROVIDER_SPECS.find((spec) => spec.provider === provider)?.credentialEnvKey;
188
+ }
189
+ function readString(value) {
190
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
191
+ }
192
+ function normalizeUrl(value) {
193
+ const raw = readString(value);
194
+ if (!raw) {
195
+ return undefined;
196
+ }
197
+ try {
198
+ const url = new URL(raw);
199
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
200
+ return undefined;
201
+ }
202
+ return url.toString().replace(/\/+$/u, '') + '/';
203
+ }
204
+ catch {
205
+ return raw;
206
+ }
207
+ }
208
+ //# sourceMappingURL=TunnelProfiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TunnelProfiles.js","sourceRoot":"","sources":["../../src/tunnel/TunnelProfiles.ts"],"names":[],"mappings":"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","sourcesContent":["export const TUNNEL_PROVIDER_VALUES = ['ngrok', 'cloudflare', 'sakura_frp', 'frp'] as const;\nexport type TunnelProfileProvider = (typeof TUNNEL_PROVIDER_VALUES)[number];\nexport type ActiveTunnelProvider = TunnelProfileProvider | 'none';\n\nexport interface TunnelProfile {\n id: string;\n provider: TunnelProfileProvider;\n label?: string;\n publicUrl?: string;\n credentialEnvKey?: string;\n credentialConfigured?: boolean;\n}\n\nexport interface TunnelProfileState {\n profiles: TunnelProfile[];\n activeProfileId?: string;\n activeProfile?: TunnelProfile;\n inactiveProfiles: TunnelProfile[];\n activeProvider: ActiveTunnelProvider;\n}\n\ntype EnvLike = Record<string, string | undefined>;\n\ntype LegacyProviderSpec = {\n provider: TunnelProfileProvider;\n id: string;\n label: string;\n publicUrlKeys: string[];\n credentialEnvKey?: string;\n};\n\nconst LEGACY_PROVIDER_SPECS: LegacyProviderSpec[] = [\n {\n provider: 'ngrok',\n id: 'ngrok',\n label: 'ngrok',\n publicUrlKeys: ['NGROK_URL'],\n credentialEnvKey: 'NGROK_AUTHTOKEN',\n },\n {\n provider: 'cloudflare',\n id: 'cloudflare',\n label: 'Cloudflare Tunnel',\n publicUrlKeys: ['CLOUDFLARE_TUNNEL_URL', 'XPOD_TUNNEL_PUBLIC_URL'],\n credentialEnvKey: 'CLOUDFLARE_TUNNEL_TOKEN',\n },\n {\n provider: 'sakura_frp',\n id: 'sakura_frp',\n label: 'Sakura FRP',\n publicUrlKeys: ['SAKURA_TUNNEL_URL', 'XPOD_TUNNEL_PUBLIC_URL'],\n credentialEnvKey: 'SAKURA_TUNNEL_TOKEN',\n },\n {\n provider: 'frp',\n id: 'frp',\n label: 'FRP',\n publicUrlKeys: ['FRP_TUNNEL_URL'],\n credentialEnvKey: 'FRP_TUNNEL_TOKEN',\n },\n];\n\nconst PROVIDER_ALIASES: Record<string, ActiveTunnelProvider> = {\n none: 'none',\n ngrok: 'ngrok',\n cloudflare: 'cloudflare',\n 'sakura-frp': 'sakura_frp',\n sakura_frp: 'sakura_frp',\n frp: 'frp',\n};\n\nexport function resolveTunnelProfileState(env: EnvLike): TunnelProfileState {\n const explicitProfiles = parseTunnelProfiles(env.XPOD_TUNNEL_PROFILES, env);\n const profiles = explicitProfiles.length > 0 ? explicitProfiles : buildLegacyTunnelProfiles(env);\n const activeProfileId = resolveActiveProfileId(env, profiles);\n return selectActiveTunnelProfile(profiles, activeProfileId);\n}\n\nexport function selectActiveTunnelProfile(\n inputProfiles: readonly TunnelProfile[],\n activeProfileId?: string,\n): TunnelProfileState {\n const profiles = normalizeProfiles(inputProfiles);\n const requestedId = readString(activeProfileId);\n const activeProfile = profiles.find((profile) => profile.id === requestedId && canActivateProfile(profile));\n const inactiveProfiles = profiles.filter((profile) => profile.id !== activeProfile?.id);\n\n return {\n profiles,\n activeProfileId: requestedId,\n activeProfile,\n inactiveProfiles,\n activeProvider: activeProfile?.provider ?? 'none',\n };\n}\n\nfunction buildLegacyTunnelProfiles(env: EnvLike): TunnelProfile[] {\n const profiles: TunnelProfile[] = [];\n for (const spec of LEGACY_PROVIDER_SPECS) {\n const publicUrl = readFirstUrl(env, spec.publicUrlKeys);\n const credentialConfigured = spec.credentialEnvKey ? Boolean(readString(env[spec.credentialEnvKey])) : undefined;\n if (!publicUrl && !credentialConfigured && readLegacyProvider(env.XPOD_TUNNEL_PROVIDER) !== spec.provider) {\n continue;\n }\n profiles.push({\n id: spec.id,\n provider: spec.provider,\n label: spec.label,\n publicUrl,\n credentialEnvKey: spec.credentialEnvKey,\n credentialConfigured,\n });\n }\n\n return profiles;\n}\n\nfunction parseTunnelProfiles(value: string | undefined, env: EnvLike): TunnelProfile[] {\n const raw = readString(value);\n if (!raw) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed.flatMap((item): TunnelProfile[] => {\n if (!item || typeof item !== 'object' || Array.isArray(item)) {\n return [];\n }\n const record = item as Record<string, unknown>;\n const id = readString(record.id);\n const provider = readProvider(record.provider);\n if (!id || !provider || provider === 'none') {\n return [];\n }\n const credentialEnvKey = readString(record.credentialEnvKey) ?? defaultCredentialEnvKey(provider);\n return [{\n id,\n provider,\n label: readString(record.label),\n publicUrl: normalizeUrl(readString(record.publicUrl)),\n credentialEnvKey,\n credentialConfigured: credentialEnvKey ? Boolean(readString(env[credentialEnvKey])) : undefined,\n }];\n });\n } catch {\n return [];\n }\n}\n\nfunction normalizeProfiles(inputProfiles: readonly TunnelProfile[]): TunnelProfile[] {\n const seen = new Set<string>();\n const profiles: TunnelProfile[] = [];\n for (const profile of inputProfiles) {\n const id = readString(profile.id);\n const provider = readProvider(profile.provider);\n if (!id || !provider || provider === 'none' || seen.has(id)) {\n continue;\n }\n seen.add(id);\n profiles.push({\n id,\n provider,\n label: readString(profile.label),\n publicUrl: normalizeUrl(profile.publicUrl),\n credentialEnvKey: readString(profile.credentialEnvKey) ?? defaultCredentialEnvKey(provider),\n credentialConfigured: profile.credentialConfigured,\n });\n }\n return profiles;\n}\n\nfunction resolveActiveProfileId(env: EnvLike, profiles: readonly TunnelProfile[]): string | undefined {\n const explicitProfileId = readString(env.XPOD_TUNNEL_ACTIVE_PROFILE_ID);\n if (explicitProfileId) {\n return explicitProfileId;\n }\n\n const legacyProviderRaw = readString(env.XPOD_TUNNEL_PROVIDER);\n const legacyProvider = readLegacyProvider(legacyProviderRaw);\n if (legacyProvider === 'none') {\n return 'none';\n }\n const legacyProfileId = legacyProviderToProfileId(legacyProviderRaw, profiles);\n if (legacyProfileId) {\n return legacyProfileId;\n }\n\n return profiles.find(canActivateProfile)?.id;\n}\n\nfunction legacyProviderToProfileId(value: string | undefined, profiles: readonly TunnelProfile[]): string | undefined {\n const provider = readLegacyProvider(value);\n if (!provider || provider === 'none') {\n return undefined;\n }\n return profiles.find((profile) => profile.provider === provider)?.id ?? provider;\n}\n\nfunction readLegacyProvider(value: string | undefined): ActiveTunnelProvider | undefined {\n return readProvider(value);\n}\n\nfunction readProvider(value: unknown): ActiveTunnelProvider | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n return PROVIDER_ALIASES[value.trim().toLowerCase()];\n}\n\nfunction canActivateProfile(profile: TunnelProfile): boolean {\n if (profile.provider === 'ngrok') {\n return true;\n }\n return profile.credentialConfigured !== false;\n}\n\nfunction readFirstUrl(env: EnvLike, keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const normalized = normalizeUrl(readString(env[key]));\n if (normalized) {\n return normalized;\n }\n }\n return undefined;\n}\n\nfunction defaultCredentialEnvKey(provider: TunnelProfileProvider): string | undefined {\n return LEGACY_PROVIDER_SPECS.find((spec) => spec.provider === provider)?.credentialEnvKey;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction normalizeUrl(value: string | undefined): string | undefined {\n const raw = readString(value);\n if (!raw) {\n return undefined;\n }\n try {\n const url = new URL(raw);\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n return undefined;\n }\n return url.toString().replace(/\\/+$/u, '') + '/';\n } catch {\n return raw;\n }\n}\n"]}
@@ -2,3 +2,5 @@ export type { TunnelProvider, TunnelConfig, TunnelSetupOptions, TunnelStatus, }
2
2
  export { CloudflareTunnelProvider, type CloudflareTunnelProviderOptions, } from './CloudflareTunnelProvider';
3
3
  export { LocalTunnelProvider, type LocalTunnelProviderOptions, } from './LocalTunnelProvider';
4
4
  export { NgrokTunnelProvider, type NgrokTunnelProviderOptions, } from './NgrokTunnelProvider';
5
+ export type { ActiveTunnelProvider, TunnelProfile, TunnelProfileProvider, TunnelProfileState, } from './TunnelProfiles';
6
+ export { resolveTunnelProfileState, selectActiveTunnelProfile, } from './TunnelProfiles';
@@ -1,10 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NgrokTunnelProvider = exports.LocalTunnelProvider = exports.CloudflareTunnelProvider = void 0;
3
+ exports.selectActiveTunnelProfile = exports.resolveTunnelProfileState = exports.NgrokTunnelProvider = exports.LocalTunnelProvider = exports.CloudflareTunnelProvider = void 0;
4
4
  var CloudflareTunnelProvider_1 = require("./CloudflareTunnelProvider");
5
5
  Object.defineProperty(exports, "CloudflareTunnelProvider", { enumerable: true, get: function () { return CloudflareTunnelProvider_1.CloudflareTunnelProvider; } });
6
6
  var LocalTunnelProvider_1 = require("./LocalTunnelProvider");
7
7
  Object.defineProperty(exports, "LocalTunnelProvider", { enumerable: true, get: function () { return LocalTunnelProvider_1.LocalTunnelProvider; } });
8
8
  var NgrokTunnelProvider_1 = require("./NgrokTunnelProvider");
9
9
  Object.defineProperty(exports, "NgrokTunnelProvider", { enumerable: true, get: function () { return NgrokTunnelProvider_1.NgrokTunnelProvider; } });
10
+ var TunnelProfiles_1 = require("./TunnelProfiles");
11
+ Object.defineProperty(exports, "resolveTunnelProfileState", { enumerable: true, get: function () { return TunnelProfiles_1.resolveTunnelProfileState; } });
12
+ Object.defineProperty(exports, "selectActiveTunnelProfile", { enumerable: true, get: function () { return TunnelProfiles_1.selectActiveTunnelProfile; } });
10
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tunnel/index.ts"],"names":[],"mappings":";;;AAOA,uEAGoC;AAFlC,oIAAA,wBAAwB,OAAA;AAI1B,6DAG+B;AAF7B,0HAAA,mBAAmB,OAAA;AAIrB,6DAG+B;AAF7B,0HAAA,mBAAmB,OAAA","sourcesContent":["export type {\n TunnelProvider,\n TunnelConfig,\n TunnelSetupOptions,\n TunnelStatus,\n} from './TunnelProvider';\n\nexport {\n CloudflareTunnelProvider,\n type CloudflareTunnelProviderOptions,\n} from './CloudflareTunnelProvider';\n\nexport {\n LocalTunnelProvider,\n type LocalTunnelProviderOptions,\n} from './LocalTunnelProvider';\n\nexport {\n NgrokTunnelProvider,\n type NgrokTunnelProviderOptions,\n} from './NgrokTunnelProvider';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tunnel/index.ts"],"names":[],"mappings":";;;AAOA,uEAGoC;AAFlC,oIAAA,wBAAwB,OAAA;AAI1B,6DAG+B;AAF7B,0HAAA,mBAAmB,OAAA;AAIrB,6DAG+B;AAF7B,0HAAA,mBAAmB,OAAA;AAWrB,mDAG0B;AAFxB,2HAAA,yBAAyB,OAAA;AACzB,2HAAA,yBAAyB,OAAA","sourcesContent":["export type {\n TunnelProvider,\n TunnelConfig,\n TunnelSetupOptions,\n TunnelStatus,\n} from './TunnelProvider';\n\nexport {\n CloudflareTunnelProvider,\n type CloudflareTunnelProviderOptions,\n} from './CloudflareTunnelProvider';\n\nexport {\n LocalTunnelProvider,\n type LocalTunnelProviderOptions,\n} from './LocalTunnelProvider';\n\nexport {\n NgrokTunnelProvider,\n type NgrokTunnelProviderOptions,\n} from './NgrokTunnelProvider';\n\nexport type {\n ActiveTunnelProvider,\n TunnelProfile,\n TunnelProfileProvider,\n TunnelProfileState,\n} from './TunnelProfiles';\n\nexport {\n resolveTunnelProfileState,\n selectActiveTunnelProfile,\n} from './TunnelProfiles';\n"]}
@@ -5,6 +5,8 @@ export interface ClusterIdentifierStrategyOptions {
5
5
  /**
6
6
  * 允许的额外 host 列表(用于 Docker/容器环境)
7
7
  * 可以是数组或逗号分隔的字符串,例如: ['cloud', 'idp'] 或 "cloud,idp,localhost"
8
+ * 支持一层通配符后缀,例如 "*.undefineds.co" 匹配 "node-0000.undefineds.co",
9
+ * 但不匹配 apex "undefineds.co" 或 "undefineds.co.evil.test"。
8
10
  */
9
11
  allowedHosts?: string[] | string;
10
12
  }
@@ -19,5 +21,6 @@ export declare class ClusterIdentifierStrategy extends BaseIdentifierStrategy {
19
21
  private readonly allowedHosts;
20
22
  constructor(options: ClusterIdentifierStrategyOptions);
21
23
  supportsIdentifier(identifier: ResourceIdentifier): boolean;
24
+ private isAllowedHost;
22
25
  isRootContainer(identifier: ResourceIdentifier): boolean;
23
26
  }
@@ -41,7 +41,7 @@ class ClusterIdentifierStrategy extends community_server_1.BaseIdentifierStrateg
41
41
  : typeof hostsInput === 'string' && hostsInput.length > 0
42
42
  ? hostsInput.split(',').map(h => h.trim())
43
43
  : [];
44
- this.allowedHosts = hostsArray.map(h => h.toLowerCase());
44
+ this.allowedHosts = hostsArray.map(h => h.toLowerCase()).filter(Boolean);
45
45
  this.logger.info(`ClusterIdentifierStrategy initialized: baseUrl=${this.baseUrl}, baseHost=${this.baseHost}, allowedHosts=[${this.allowedHosts.join(', ')}]`);
46
46
  }
47
47
  supportsIdentifier(identifier) {
@@ -49,7 +49,7 @@ class ClusterIdentifierStrategy extends community_server_1.BaseIdentifierStrateg
49
49
  const target = new node_url_1.URL(identifier.path);
50
50
  const host = target.hostname.toLowerCase();
51
51
  // 检查是否在允许的 hosts 列表中
52
- if (this.allowedHosts.includes(host)) {
52
+ if (this.isAllowedHost(host)) {
53
53
  this.logger.debug(`supportsIdentifier: ${identifier.path} -> true (allowedHosts match: ${host})`);
54
54
  return true;
55
55
  }
@@ -71,6 +71,22 @@ class ClusterIdentifierStrategy extends community_server_1.BaseIdentifierStrateg
71
71
  return false;
72
72
  }
73
73
  }
74
+ isAllowedHost(host) {
75
+ return this.allowedHosts.some((allowedHost) => {
76
+ if (allowedHost === host) {
77
+ return true;
78
+ }
79
+ if (!allowedHost.startsWith('*.')) {
80
+ return false;
81
+ }
82
+ const suffix = allowedHost.slice(1);
83
+ if (host.length <= suffix.length || !host.endsWith(suffix)) {
84
+ return false;
85
+ }
86
+ const wildcardLabel = host.slice(0, -suffix.length);
87
+ return wildcardLabel.length > 0 && !wildcardLabel.includes('.');
88
+ });
89
+ }
74
90
  isRootContainer(identifier) {
75
91
  try {
76
92
  const target = new node_url_1.URL(identifier.path);