@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/api/ai-gateway/types.ts"],"names":[],"mappings":"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","sourcesContent":["import { GatewayProtocolError } from './errors';\n\nexport type GatewayProtocol = 'responses' | 'anthropic' | 'chatCompletions';\n\nexport type GatewayMessageRole = 'system' | 'developer' | 'user' | 'assistant' | 'tool';\n\nexport type GatewayContentPart =\n | { type: 'text'; text: string }\n | { type: 'image'; imageUrl?: string; mediaType?: string; data?: string; detail?: string };\n\nexport interface GatewayMessage {\n role: GatewayMessageRole;\n content: GatewayContentPart[];\n name?: string;\n toolCallId?: string;\n protocolExtensions?: Record<string, unknown>;\n}\n\nexport interface GatewayTool {\n type: 'function';\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n protocolExtensions?: Record<string, unknown>;\n}\n\nexport interface GatewayReasoningOptions {\n effort?: string;\n exposeSummary?: boolean;\n}\n\nexport interface GatewayUsage {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n}\n\nexport interface GatewayRequest {\n model: string;\n instructions?: string;\n messages: GatewayMessage[];\n tools: GatewayTool[];\n reasoning?: GatewayReasoningOptions;\n maxOutputTokens?: number;\n previousResponseId?: string;\n stream: boolean;\n protocolExtensions: Partial<Record<GatewayProtocol, Record<string, unknown>>>;\n}\n\nexport type GatewayEvent =\n | { type: 'response.started'; id: string }\n | { type: 'text.delta'; text: string }\n | { type: 'reasoning.delta'; text: string }\n | { type: 'reasoning.signature'; provider: string; signature: string }\n | { type: 'tool.started'; callId: string; name: string }\n | { type: 'tool.arguments.delta'; callId: string; delta: string }\n | { type: 'tool.completed'; callId: string }\n | { type: 'usage'; usage: GatewayUsage }\n | { type: 'response.completed'; finishReason: string };\n\nexport interface GatewayEventSerializer {\n serializeEvent(event: GatewayEvent): Record<string, unknown> | Record<string, unknown>[];\n}\n\nexport interface GatewayProtocolFrontend {\n readonly protocol: GatewayProtocol;\n parseRequest(body: unknown): GatewayRequest;\n createEventSerializer(): GatewayEventSerializer;\n}\n\nexport function requireObject(value: unknown, context: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new GatewayProtocolError(`${context} must be an object`);\n }\n return value as Record<string, unknown>;\n}\n\nexport function stringOrUndefined(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nexport function booleanValue(value: unknown): boolean {\n return value === true;\n}\n\nexport function extractExtension(\n body: Record<string, unknown>,\n protocol: GatewayProtocol,\n normalizedKeys: readonly string[],\n): Partial<Record<GatewayProtocol, Record<string, unknown>>> {\n const normalized = new Set(normalizedKeys);\n const extension: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(body)) {\n if (!normalized.has(key)) {\n extension[key] = value;\n }\n }\n return Object.keys(extension).length > 0 ? { [protocol]: extension } : {};\n}\n\nexport function extractText(value: unknown): string | undefined {\n if (typeof value === 'string') {\n return value;\n }\n if (Array.isArray(value)) {\n const parts = value\n .map((item) => {\n if (typeof item === 'string') {\n return item;\n }\n if (item && typeof item === 'object' && typeof (item as { text?: unknown }).text === 'string') {\n return (item as { text: string }).text;\n }\n return undefined;\n })\n .filter((item): item is string => item !== undefined);\n return parts.length > 0 ? parts.join('\\n') : undefined;\n }\n if (value == null) {\n return undefined;\n }\n return String(value);\n}\n\nexport function normalizeContentParts(content: unknown, protocol: GatewayProtocol): GatewayContentPart[] {\n if (typeof content === 'string') {\n return [{ type: 'text', text: content }];\n }\n\n if (!Array.isArray(content)) {\n if (content && typeof content === 'object') {\n return normalizeContentParts([content], protocol);\n }\n const text = extractText(content);\n return text ? [{ type: 'text', text }] : [];\n }\n\n return content.flatMap((part): GatewayContentPart[] => {\n if (typeof part === 'string') {\n return [{ type: 'text', text: part }];\n }\n if (!part || typeof part !== 'object') {\n return [];\n }\n const record = part as Record<string, unknown>;\n const type = record.type;\n if (\n type === 'text'\n || type === 'input_text'\n || type === 'output_text'\n ) {\n const text = stringOrUndefined(record.text);\n return text ? [{ type: 'text', text }] : [];\n }\n\n if (type === 'image_url') {\n const imageUrl = record.image_url;\n if (typeof imageUrl === 'string') {\n return [{ type: 'image', imageUrl }];\n }\n if (imageUrl && typeof imageUrl === 'object') {\n const image = imageUrl as Record<string, unknown>;\n return [{\n type: 'image',\n imageUrl: stringOrUndefined(image.url),\n detail: stringOrUndefined(image.detail),\n }];\n }\n }\n\n if (type === 'input_image') {\n return [{\n type: 'image',\n imageUrl: stringOrUndefined(record.image_url) ?? stringOrUndefined(record.file_id),\n detail: stringOrUndefined(record.detail),\n }];\n }\n\n if (type === 'image' && protocol === 'anthropic') {\n const source = record.source;\n if (source && typeof source === 'object') {\n const image = source as Record<string, unknown>;\n return [{\n type: 'image',\n mediaType: stringOrUndefined(image.media_type),\n data: stringOrUndefined(image.data),\n }];\n }\n }\n\n return [];\n });\n}\n\nexport function normalizeToolFromResponses(tool: unknown): GatewayTool | undefined {\n if (!tool || typeof tool !== 'object') {\n return undefined;\n }\n const record = tool as Record<string, unknown>;\n const name = stringOrUndefined(record.name);\n if (!name) {\n return undefined;\n }\n return {\n type: 'function',\n name,\n description: stringOrUndefined(record.description),\n inputSchema: record.parameters && typeof record.parameters === 'object'\n ? record.parameters as Record<string, unknown>\n : undefined,\n };\n}\n\nexport function normalizeToolFromAnthropic(tool: unknown): GatewayTool | undefined {\n if (!tool || typeof tool !== 'object') {\n return undefined;\n }\n const record = tool as Record<string, unknown>;\n const name = stringOrUndefined(record.name);\n if (!name) {\n return undefined;\n }\n return {\n type: 'function',\n name,\n description: stringOrUndefined(record.description),\n inputSchema: record.input_schema && typeof record.input_schema === 'object'\n ? record.input_schema as Record<string, unknown>\n : undefined,\n };\n}\n\nexport function normalizeToolFromChat(tool: unknown): GatewayTool | undefined {\n if (!tool || typeof tool !== 'object') {\n return undefined;\n }\n const record = tool as Record<string, unknown>;\n const fn = record.function;\n if (!fn || typeof fn !== 'object') {\n return undefined;\n }\n const functionRecord = fn as Record<string, unknown>;\n const name = stringOrUndefined(functionRecord.name);\n if (!name) {\n return undefined;\n }\n return {\n type: 'function',\n name,\n description: stringOrUndefined(functionRecord.description),\n inputSchema: functionRecord.parameters && typeof functionRecord.parameters === 'object'\n ? functionRecord.parameters as Record<string, unknown>\n : undefined,\n };\n}\n\nexport function normalizeMessage(message: unknown, protocol: GatewayProtocol): GatewayMessage | undefined {\n if (!message || typeof message !== 'object') {\n return undefined;\n }\n const record = message as Record<string, unknown>;\n const role = stringOrUndefined(record.role);\n if (!role) {\n return undefined;\n }\n return {\n role: role as GatewayMessage['role'],\n content: normalizeContentParts(record.content, protocol),\n name: stringOrUndefined(record.name),\n toolCallId: stringOrUndefined(record.tool_call_id) ?? stringOrUndefined(record.tool_use_id),\n };\n}\n\nexport function mapGatewayUsageToOpenAi(usage: GatewayUsage): Record<string, unknown> {\n return {\n ...(usage.inputTokens !== undefined ? { input_tokens: usage.inputTokens } : {}),\n ...(usage.outputTokens !== undefined ? { output_tokens: usage.outputTokens } : {}),\n ...(usage.totalTokens !== undefined ? { total_tokens: usage.totalTokens } : {}),\n ...(\n usage.cacheReadTokens !== undefined || usage.cacheWriteTokens !== undefined\n ? {\n input_tokens_details: {\n ...(usage.cacheReadTokens !== undefined ? { cached_tokens: usage.cacheReadTokens } : {}),\n ...(usage.cacheWriteTokens !== undefined ? { cache_write_tokens: usage.cacheWriteTokens } : {}),\n },\n }\n : {}\n ),\n };\n}\n\nexport function mapGatewayUsageToChatCompletions(usage: GatewayUsage): Record<string, unknown> {\n return {\n ...(usage.inputTokens !== undefined ? { prompt_tokens: usage.inputTokens } : {}),\n ...(usage.outputTokens !== undefined ? { completion_tokens: usage.outputTokens } : {}),\n ...(usage.totalTokens !== undefined ? { total_tokens: usage.totalTokens } : {}),\n ...(\n usage.cacheReadTokens !== undefined || usage.cacheWriteTokens !== undefined\n ? {\n prompt_tokens_details: {\n ...(usage.cacheReadTokens !== undefined ? { cached_tokens: usage.cacheReadTokens } : {}),\n ...(usage.cacheWriteTokens !== undefined ? { cache_write_tokens: usage.cacheWriteTokens } : {}),\n },\n }\n : {}\n ),\n };\n}\n\nexport function mapGatewayUsageToAnthropic(usage: GatewayUsage): Record<string, unknown> {\n return {\n ...(usage.inputTokens !== undefined ? { input_tokens: usage.inputTokens } : {}),\n ...(usage.outputTokens !== undefined ? { output_tokens: usage.outputTokens } : {}),\n ...(usage.cacheReadTokens !== undefined ? { cache_read_input_tokens: usage.cacheReadTokens } : {}),\n ...(usage.cacheWriteTokens !== undefined ? { cache_creation_input_tokens: usage.cacheWriteTokens } : {}),\n };\n}\n\nexport class ToolArgumentTracker {\n private readonly chunks = new Map<string, string>();\n private readonly toolIndexes = new Map<string, number>();\n private nextIndex = 0;\n\n public reset(): void {\n this.chunks.clear();\n this.toolIndexes.clear();\n this.nextIndex = 0;\n }\n\n public start(callId: string): number {\n if (!this.toolIndexes.has(callId)) {\n this.toolIndexes.set(callId, this.nextIndex);\n this.nextIndex += 1;\n }\n if (!this.chunks.has(callId)) {\n this.chunks.set(callId, '');\n }\n return this.toolIndexes.get(callId) ?? 0;\n }\n\n public append(callId: string, delta: string): number {\n const index = this.requireStarted(callId);\n this.chunks.set(callId, `${this.chunks.get(callId) ?? ''}${delta}`);\n return index;\n }\n\n public argumentsFor(callId: string): string {\n this.requireStarted(callId);\n return this.chunks.get(callId) ?? '';\n }\n\n public complete(callId: string): number {\n const index = this.requireStarted(callId);\n const value = this.chunks.get(callId) ?? '';\n try {\n JSON.parse(value || '{}');\n } catch (error) {\n throw new GatewayProtocolError('Completed tool arguments must be valid JSON', {\n code: 'invalid_tool_arguments',\n status: 400,\n details: { callId },\n cause: error,\n });\n }\n this.chunks.delete(callId);\n this.toolIndexes.delete(callId);\n return index;\n }\n\n private requireStarted(callId: string): number {\n const index = this.toolIndexes.get(callId);\n if (index === undefined || !this.chunks.has(callId)) {\n throw new GatewayProtocolError('Tool arguments event received before tool start', {\n code: 'invalid_tool_arguments',\n status: 400,\n details: { callId },\n });\n }\n return index;\n }\n}\n\nexport function unsupportedEvent(event: GatewayEvent): never {\n throw new GatewayProtocolError(`Unsupported gateway event: ${event.type}`, {\n code: 'unsupported_protocol_event',\n status: 500,\n });\n}\n"]}
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Authenticated caller context.
5
5
  * - Solid Token: user provides Bearer or DPoP token
6
- * - CSS client credentials: third-party provides client_id/client_secret,
6
+ * - CSS client credentials wrapper: third-party provides client_id/client_secret,
7
7
  * API Server exchanges them for a Solid token
8
8
  * - Node Token: edge node provides node API key
9
9
  */
@@ -17,8 +17,18 @@ export interface SolidAuthContext {
17
17
  accessToken?: string;
18
18
  tokenType?: 'Bearer' | 'DPoP';
19
19
  dpopProof?: string;
20
- /** Whether this was authenticated via the sk-* client credentials wrapper */
20
+ /** Whether this was authenticated via the sk-* CSS client credentials wrapper */
21
21
  viaApiKey?: boolean;
22
+ /** Whether this was authenticated via an Xpod Gateway API key. */
23
+ viaGatewayApiKey?: boolean;
24
+ /** Whether this principal came from a stateless internal runtime invocation token. */
25
+ internalInvocation?: boolean;
26
+ /** Opaque Gateway API key id, present only for gateway-key principals. */
27
+ gatewayKeyId?: string;
28
+ /** SHA-256 fingerprint of the authenticated Gateway bearer key, never the raw key. */
29
+ gatewayKeyFingerprint?: string;
30
+ /** Gateway/API scopes bound to the authenticated principal. */
31
+ scopes?: string[];
22
32
  }
23
33
  export interface NodeAuthContext {
24
34
  type: 'node';
@@ -49,6 +59,11 @@ export declare function getAccountId(ctx: AuthContext): string | undefined;
49
59
  export declare function getNodeId(ctx: AuthContext): string | undefined;
50
60
  export declare function isServiceAuth(ctx: AuthContext): ctx is ServiceAuthContext;
51
61
  /**
52
- * Check if a service auth context has the required scope
62
+ * Check if a service auth context has the required scope.
53
63
  */
54
64
  export declare function hasScope(ctx: AuthContext, scope: string): boolean;
65
+ /**
66
+ * Gateway API keys carry explicit API scopes. Normal Solid callers remain
67
+ * authorized by the Solid layer and are not narrowed here.
68
+ */
69
+ export declare function hasGatewayScope(ctx: AuthContext, scope: string): boolean;
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * Authenticated caller context.
6
6
  * - Solid Token: user provides Bearer or DPoP token
7
- * - CSS client credentials: third-party provides client_id/client_secret,
7
+ * - CSS client credentials wrapper: third-party provides client_id/client_secret,
8
8
  * API Server exchanges them for a Solid token
9
9
  * - Node Token: edge node provides node API key
10
10
  */
@@ -17,6 +17,7 @@ exports.getAccountId = getAccountId;
17
17
  exports.getNodeId = getNodeId;
18
18
  exports.isServiceAuth = isServiceAuth;
19
19
  exports.hasScope = hasScope;
20
+ exports.hasGatewayScope = hasGatewayScope;
20
21
  function isSolidAuth(ctx) {
21
22
  return ctx.type === 'solid';
22
23
  }
@@ -54,9 +55,19 @@ function isServiceAuth(ctx) {
54
55
  return ctx.type === 'service';
55
56
  }
56
57
  /**
57
- * Check if a service auth context has the required scope
58
+ * Check if a service auth context has the required scope.
58
59
  */
59
60
  function hasScope(ctx, scope) {
60
61
  return ctx.type === 'service' && ctx.scopes.includes(scope);
61
62
  }
63
+ /**
64
+ * Gateway API keys carry explicit API scopes. Normal Solid callers remain
65
+ * authorized by the Solid layer and are not narrowed here.
66
+ */
67
+ function hasGatewayScope(ctx, scope) {
68
+ if (ctx.type !== 'solid' || ctx.viaGatewayApiKey !== true) {
69
+ return true;
70
+ }
71
+ return ctx.scopes?.includes(scope) === true;
72
+ }
62
73
  //# sourceMappingURL=AuthContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthContext.js","sourceRoot":"","sources":["../../../src/api/auth/AuthContext.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AA+BH,kCAEC;AAED,gCAEC;AAKD,4BAEC;AAKD,wCAEC;AAKD,oCAQC;AAED,8BAEC;AAED,sCAEC;AAKD,4BAEC;AAhDD,SAAgB,WAAW,CAAC,GAAgB;IAC1C,OAAO,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC;AAC9B,CAAC;AAED,SAAgB,UAAU,CAAC,GAAgB;IACzC,OAAO,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAgB,QAAQ,CAAC,GAAgB;IACvC,OAAO,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,GAAgB;IAC7C,OAAO,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,GAAgB;IAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC,SAAS,CAAC;IACvB,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO,GAAG,CAAC,SAAS,CAAC;IACvB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,SAAS,CAAC,GAAgB;IACxC,OAAO,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED,SAAgB,aAAa,CAAC,GAAgB;IAC5C,OAAO,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAgB,QAAQ,CAAC,GAAgB,EAAE,KAAa;IACtD,OAAO,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC","sourcesContent":["/**\n * Authentication context representing the authenticated caller\n * \n * Authenticated caller context.\n * - Solid Token: user provides Bearer or DPoP token\n * - CSS client credentials: third-party provides client_id/client_secret,\n * API Server exchanges them for a Solid token\n * - Node Token: edge node provides node API key\n */\n\nexport interface SolidAuthContext {\n type: 'solid';\n webId: string;\n accountId?: string;\n clientId?: string;\n clientSecret?: string; // For client credentials auth\n displayName?: string;\n accessToken?: string;\n tokenType?: 'Bearer' | 'DPoP';\n dpopProof?: string;\n /** Whether this was authenticated via the sk-* client credentials wrapper */\n viaApiKey?: boolean;\n}\n\nexport interface NodeAuthContext {\n type: 'node';\n nodeId: string;\n accountId?: string;\n}\n\nexport interface ServiceAuthContext {\n type: 'service';\n serviceType: 'local' | 'business' | 'cloud' | 'compute';\n serviceId: string;\n scopes: string[];\n}\n\nexport type AuthContext = SolidAuthContext | NodeAuthContext | ServiceAuthContext;\n\nexport function isSolidAuth(ctx: AuthContext): ctx is SolidAuthContext {\n return ctx.type === 'solid';\n}\n\nexport function isNodeAuth(ctx: AuthContext): ctx is NodeAuthContext {\n return ctx.type === 'node';\n}\n\n/**\n * Get webId from auth context\n */\nexport function getWebId(ctx: AuthContext): string | undefined {\n return ctx.type === 'solid' ? ctx.webId : undefined;\n}\n\n/**\n * Get display name from auth context\n */\nexport function getDisplayName(ctx: AuthContext): string | undefined {\n return ctx.type === 'solid' ? ctx.displayName : undefined;\n}\n\n/**\n * Get accountId from auth context (if available)\n */\nexport function getAccountId(ctx: AuthContext): string | undefined {\n if (ctx.type === 'solid') {\n return ctx.accountId;\n }\n if (ctx.type === 'node') {\n return ctx.accountId;\n }\n return undefined;\n}\n\nexport function getNodeId(ctx: AuthContext): string | undefined {\n return ctx.type === 'node' ? ctx.nodeId : undefined;\n}\n\nexport function isServiceAuth(ctx: AuthContext): ctx is ServiceAuthContext {\n return ctx.type === 'service';\n}\n\n/**\n * Check if a service auth context has the required scope\n */\nexport function hasScope(ctx: AuthContext, scope: string): boolean {\n return ctx.type === 'service' && ctx.scopes.includes(scope);\n}\n"]}
1
+ {"version":3,"file":"AuthContext.js","sourceRoot":"","sources":["../../../src/api/auth/AuthContext.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAyCH,kCAEC;AAED,gCAEC;AAKD,4BAEC;AAKD,wCAEC;AAKD,oCAQC;AAED,8BAEC;AAED,sCAEC;AAKD,4BAEC;AAMD,0CAKC;AA3DD,SAAgB,WAAW,CAAC,GAAgB;IAC1C,OAAO,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC;AAC9B,CAAC;AAED,SAAgB,UAAU,CAAC,GAAgB;IACzC,OAAO,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAgB,QAAQ,CAAC,GAAgB;IACvC,OAAO,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,GAAgB;IAC7C,OAAO,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,GAAgB;IAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC,SAAS,CAAC;IACvB,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO,GAAG,CAAC,SAAS,CAAC;IACvB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,SAAS,CAAC,GAAgB;IACxC,OAAO,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED,SAAgB,aAAa,CAAC,GAAgB;IAC5C,OAAO,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAgB,QAAQ,CAAC,GAAgB,EAAE,KAAa;IACtD,OAAO,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,GAAgB,EAAE,KAAa;IAC7D,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AAC9C,CAAC","sourcesContent":["/**\n * Authentication context representing the authenticated caller\n * \n * Authenticated caller context.\n * - Solid Token: user provides Bearer or DPoP token\n * - CSS client credentials wrapper: third-party provides client_id/client_secret,\n * API Server exchanges them for a Solid token\n * - Node Token: edge node provides node API key\n */\n\nexport interface SolidAuthContext {\n type: 'solid';\n webId: string;\n accountId?: string;\n clientId?: string;\n clientSecret?: string; // For client credentials auth\n displayName?: string;\n accessToken?: string;\n tokenType?: 'Bearer' | 'DPoP';\n dpopProof?: string;\n /** Whether this was authenticated via the sk-* CSS client credentials wrapper */\n viaApiKey?: boolean;\n /** Whether this was authenticated via an Xpod Gateway API key. */\n viaGatewayApiKey?: boolean;\n /** Whether this principal came from a stateless internal runtime invocation token. */\n internalInvocation?: boolean;\n /** Opaque Gateway API key id, present only for gateway-key principals. */\n gatewayKeyId?: string;\n /** SHA-256 fingerprint of the authenticated Gateway bearer key, never the raw key. */\n gatewayKeyFingerprint?: string;\n /** Gateway/API scopes bound to the authenticated principal. */\n scopes?: string[];\n}\n\nexport interface NodeAuthContext {\n type: 'node';\n nodeId: string;\n accountId?: string;\n}\n\nexport interface ServiceAuthContext {\n type: 'service';\n serviceType: 'local' | 'business' | 'cloud' | 'compute';\n serviceId: string;\n scopes: string[];\n}\n\nexport type AuthContext = SolidAuthContext | NodeAuthContext | ServiceAuthContext;\n\nexport function isSolidAuth(ctx: AuthContext): ctx is SolidAuthContext {\n return ctx.type === 'solid';\n}\n\nexport function isNodeAuth(ctx: AuthContext): ctx is NodeAuthContext {\n return ctx.type === 'node';\n}\n\n/**\n * Get webId from auth context\n */\nexport function getWebId(ctx: AuthContext): string | undefined {\n return ctx.type === 'solid' ? ctx.webId : undefined;\n}\n\n/**\n * Get display name from auth context\n */\nexport function getDisplayName(ctx: AuthContext): string | undefined {\n return ctx.type === 'solid' ? ctx.displayName : undefined;\n}\n\n/**\n * Get accountId from auth context (if available)\n */\nexport function getAccountId(ctx: AuthContext): string | undefined {\n if (ctx.type === 'solid') {\n return ctx.accountId;\n }\n if (ctx.type === 'node') {\n return ctx.accountId;\n }\n return undefined;\n}\n\nexport function getNodeId(ctx: AuthContext): string | undefined {\n return ctx.type === 'node' ? ctx.nodeId : undefined;\n}\n\nexport function isServiceAuth(ctx: AuthContext): ctx is ServiceAuthContext {\n return ctx.type === 'service';\n}\n\n/**\n * Check if a service auth context has the required scope.\n */\nexport function hasScope(ctx: AuthContext, scope: string): boolean {\n return ctx.type === 'service' && ctx.scopes.includes(scope);\n}\n\n/**\n * Gateway API keys carry explicit API scopes. Normal Solid callers remain\n * authorized by the Solid layer and are not narrowed here.\n */\nexport function hasGatewayScope(ctx: AuthContext, scope: string): boolean {\n if (ctx.type !== 'solid' || ctx.viaGatewayApiKey !== true) {\n return true;\n }\n return ctx.scopes?.includes(scope) === true;\n}\n"]}
@@ -7,6 +7,9 @@ export interface AuthResult {
7
7
  success: boolean;
8
8
  context?: AuthContext;
9
9
  error?: string;
10
+ category?: 'invalid_credentials' | 'forbidden' | 'service_unavailable';
11
+ statusCode?: 401 | 403 | 503;
12
+ cause?: unknown;
10
13
  }
11
14
  /**
12
15
  * Base interface for authenticators
@@ -1 +1 @@
1
- {"version":3,"file":"Authenticator.js","sourceRoot":"","sources":["../../../src/api/auth/Authenticator.ts"],"names":[],"mappings":"","sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport type { AuthContext } from './AuthContext';\n\n/**\n * Result of authentication attempt\n */\nexport interface AuthResult {\n success: boolean;\n context?: AuthContext;\n error?: string;\n}\n\n/**\n * Base interface for authenticators\n */\nexport interface Authenticator {\n /**\n * Check if this authenticator can handle the request\n */\n canAuthenticate(request: IncomingMessage): boolean;\n\n /**\n * Attempt to authenticate the request\n */\n authenticate(request: IncomingMessage): Promise<AuthResult>;\n}\n"]}
1
+ {"version":3,"file":"Authenticator.js","sourceRoot":"","sources":["../../../src/api/auth/Authenticator.ts"],"names":[],"mappings":"","sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport type { AuthContext } from './AuthContext';\n\n/**\n * Result of authentication attempt\n */\nexport interface AuthResult {\n success: boolean;\n context?: AuthContext;\n error?: string;\n category?: 'invalid_credentials' | 'forbidden' | 'service_unavailable';\n statusCode?: 401 | 403 | 503;\n cause?: unknown;\n}\n\n/**\n * Base interface for authenticators\n */\nexport interface Authenticator {\n /**\n * Check if this authenticator can handle the request\n */\n canAuthenticate(request: IncomingMessage): boolean;\n\n /**\n * Attempt to authenticate the request\n */\n authenticate(request: IncomingMessage): Promise<AuthResult>;\n}\n"]}
@@ -20,12 +20,12 @@ export interface ClientCredentialsAuthenticatorOptions {
20
20
  tokenEndpoint: string;
21
21
  }
22
22
  /**
23
- * Authenticator for CSS client credentials in sk-xxx transport format.
23
+ * Authenticator for CSS client credentials wrapped in sk-xxx transport format.
24
24
  *
25
25
  * Format: sk-base64(client_id:client_secret)
26
26
  *
27
27
  * This authenticator:
28
- * 1. Decodes the transport token to get client_id and client_secret
28
+ * 1. Decodes the wrapper to get client_id and client_secret
29
29
  * 2. Exchanges them for a Solid Token via CSS token endpoint
30
30
  * 3. Extracts webId from the token response
31
31
  * 4. Returns a SolidAuthContext
@@ -38,9 +38,5 @@ export declare class ClientCredentialsAuthenticator implements Authenticator {
38
38
  canAuthenticate(request: IncomingMessage): boolean;
39
39
  authenticate(request: IncomingMessage): Promise<AuthResult>;
40
40
  private exchangeForToken;
41
- /**
42
- * Extract webId from JWT access token
43
- */
44
- private extractWebIdFromJwt;
45
41
  private isJwt;
46
42
  }
@@ -2,13 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ClientCredentialsAuthenticator = void 0;
4
4
  const global_logger_factory_1 = require("global-logger-factory");
5
+ const TokenIdentity_1 = require("./TokenIdentity");
5
6
  /**
6
- * Authenticator for CSS client credentials in sk-xxx transport format.
7
+ * Authenticator for CSS client credentials wrapped in sk-xxx transport format.
7
8
  *
8
9
  * Format: sk-base64(client_id:client_secret)
9
10
  *
10
11
  * This authenticator:
11
- * 1. Decodes the transport token to get client_id and client_secret
12
+ * 1. Decodes the wrapper to get client_id and client_secret
12
13
  * 2. Exchanges them for a Solid Token via CSS token endpoint
13
14
  * 3. Extracts webId from the token response
14
15
  * 4. Returns a SolidAuthContext
@@ -24,7 +25,7 @@ class ClientCredentialsAuthenticator {
24
25
  if (!auth?.startsWith('Bearer ')) {
25
26
  return false;
26
27
  }
27
- // If there's a DPoP header, it's a Solid Token, not a client credentials wrapper
28
+ // If there's a DPoP header, it's a Solid Token, not a client credentials wrapper.
28
29
  if (request.headers.dpop) {
29
30
  return false;
30
31
  }
@@ -42,7 +43,7 @@ class ClientCredentialsAuthenticator {
42
43
  }
43
44
  const token = authorization.slice(7).trim();
44
45
  if (!token) {
45
- return { success: false, error: 'Empty API Key' };
46
+ return { success: false, error: 'Empty client credentials wrapper' };
46
47
  }
47
48
  try {
48
49
  let clientId;
@@ -54,21 +55,21 @@ class ClientCredentialsAuthenticator {
54
55
  const decoded = Buffer.from(base64, 'base64').toString('utf-8');
55
56
  const colonIndex = decoded.indexOf(':');
56
57
  if (colonIndex === -1) {
57
- return { success: false, error: 'Invalid API Key format: missing colon separator' };
58
+ return { success: false, error: 'Invalid client credentials wrapper: missing colon separator' };
58
59
  }
59
60
  clientId = decoded.slice(0, colonIndex);
60
61
  clientSecret = decoded.slice(colonIndex + 1);
61
62
  if (!clientId || !clientSecret) {
62
- return { success: false, error: 'Invalid API Key format: empty client_id or client_secret' };
63
+ return { success: false, error: 'Invalid client credentials wrapper: empty client_id or client_secret' };
63
64
  }
64
65
  }
65
66
  catch {
66
- return { success: false, error: 'Invalid API Key encoding' };
67
+ return { success: false, error: 'Invalid client credentials wrapper encoding' };
67
68
  }
68
69
  }
69
70
  else {
70
71
  // Non sk- format is intentionally unsupported; Xpod does not keep an API key mirror table.
71
- return { success: false, error: 'Invalid API Key format: must start with sk-' };
72
+ return { success: false, error: 'Invalid client credentials wrapper: must start with sk-' };
72
73
  }
73
74
  // Check cache first
74
75
  if (this.tokenCache) {
@@ -111,11 +112,11 @@ class ClientCredentialsAuthenticator {
111
112
  tokenType: tokenResult.tokenType ?? 'Bearer',
112
113
  viaApiKey: true,
113
114
  };
114
- this.logger.debug(`Authenticated API Key for webId: ${tokenResult.webId}`);
115
+ this.logger.debug(`Authenticated client credentials for webId: ${tokenResult.webId}`);
115
116
  return { success: true, context };
116
117
  }
117
118
  catch (error) {
118
- this.logger.error(`API Key authentication error: ${error}`);
119
+ this.logger.error(`Client credentials authentication error: ${error}`);
119
120
  return { success: false, error: 'Authentication failed' };
120
121
  }
121
122
  }
@@ -148,10 +149,7 @@ class ClientCredentialsAuthenticator {
148
149
  }
149
150
  const data = await response.json();
150
151
  // Extract webId from token response or decode from JWT
151
- let webId = data.webid;
152
- if (!webId && data.access_token) {
153
- webId = this.extractWebIdFromJwt(data.access_token);
154
- }
152
+ const webId = (0, TokenIdentity_1.extractAuthoritativeWebIdFromTokenResponse)(data);
155
153
  if (!webId) {
156
154
  return { success: false, error: 'Could not determine webId from token response' };
157
155
  }
@@ -171,22 +169,6 @@ class ClientCredentialsAuthenticator {
171
169
  return { success: false, error: 'Token exchange failed' };
172
170
  }
173
171
  }
174
- /**
175
- * Extract webId from JWT access token
176
- */
177
- extractWebIdFromJwt(jwt) {
178
- try {
179
- const parts = jwt.split('.');
180
- if (parts.length !== 3) {
181
- return undefined;
182
- }
183
- const payload = JSON.parse(Buffer.from(parts[1], 'base64').toString('utf-8'));
184
- return payload.webid || payload.webId || payload.sub;
185
- }
186
- catch {
187
- return undefined;
188
- }
189
- }
190
172
  isJwt(token) {
191
173
  return /^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(token);
192
174
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ClientCredentialsAuthenticator.js","sourceRoot":"","sources":["../../../src/api/auth/ClientCredentialsAuthenticator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { Authenticator, AuthResult } from './Authenticator';\nimport type { SolidAuthContext } from './AuthContext';\n\n/**\n * Interface for token cache\n */\nexport interface TokenCache {\n get(clientId: string): Promise<{\n token: string;\n tokenType?: 'Bearer' | 'DPoP';\n webId: string;\n expiresAt: Date;\n } | undefined>;\n set(\n clientId: string,\n token: string,\n webId: string,\n expiresAt: Date,\n tokenType?: 'Bearer' | 'DPoP',\n ): Promise<void>;\n}\n\nexport interface ClientCredentialsAuthenticatorOptions {\n tokenCache?: TokenCache;\n /**\n * CSS token endpoint URL\n */\n tokenEndpoint: string;\n}\n\n/**\n * Authenticator for CSS client credentials in sk-xxx transport format.\n * \n * Format: sk-base64(client_id:client_secret)\n * \n * This authenticator:\n * 1. Decodes the transport token to get client_id and client_secret\n * 2. Exchanges them for a Solid Token via CSS token endpoint\n * 3. Extracts webId from the token response\n * 4. Returns a SolidAuthContext\n */\nexport class ClientCredentialsAuthenticator implements Authenticator {\n private readonly logger = getLoggerFor(this);\n private readonly tokenCache?: TokenCache;\n private readonly tokenEndpoint: string;\n\n public constructor(options: ClientCredentialsAuthenticatorOptions) {\n this.tokenCache = options.tokenCache;\n this.tokenEndpoint = options.tokenEndpoint;\n }\n\n public canAuthenticate(request: IncomingMessage): boolean {\n const auth = request.headers.authorization;\n if (!auth?.startsWith('Bearer ')) {\n return false;\n }\n // If there's a DPoP header, it's a Solid Token, not a client credentials wrapper\n if (request.headers.dpop) {\n return false;\n }\n const token = auth.slice(7).trim();\n if (!token) {\n return false;\n }\n // Only handle sk-xxx format or non-JWT tokens\n return token.startsWith('sk-') || !this.isJwt(token);\n }\n\n public async authenticate(request: IncomingMessage): Promise<AuthResult> {\n const authorization = request.headers.authorization;\n if (!authorization?.startsWith('Bearer ')) {\n return { success: false, error: 'Missing Bearer token' };\n }\n\n const token = authorization.slice(7).trim();\n if (!token) {\n return { success: false, error: 'Empty API Key' };\n }\n\n try {\n let clientId: string;\n let clientSecret: string;\n\n // Parse sk-xxx format (base64 encoded client_id:client_secret)\n if (token.startsWith('sk-')) {\n const base64 = token.slice(3);\n try {\n const decoded = Buffer.from(base64, 'base64').toString('utf-8');\n const colonIndex = decoded.indexOf(':');\n if (colonIndex === -1) {\n return { success: false, error: 'Invalid API Key format: missing colon separator' };\n }\n clientId = decoded.slice(0, colonIndex);\n clientSecret = decoded.slice(colonIndex + 1);\n \n if (!clientId || !clientSecret) {\n return { success: false, error: 'Invalid API Key format: empty client_id or client_secret' };\n }\n } catch {\n return { success: false, error: 'Invalid API Key encoding' };\n }\n } else {\n // Non sk- format is intentionally unsupported; Xpod does not keep an API key mirror table.\n return { success: false, error: 'Invalid API Key format: must start with sk-' };\n }\n\n // Check cache first\n if (this.tokenCache) {\n const cached = await this.tokenCache.get(clientId);\n if (cached && cached.expiresAt > new Date()) {\n this.logger.debug(`Using cached token for ${clientId.slice(0, 8)}...`);\n return {\n success: true,\n context: {\n type: 'solid',\n webId: cached.webId,\n accountId: cached.webId,\n clientId,\n clientSecret,\n accessToken: cached.token,\n tokenType: cached.tokenType ?? 'Bearer',\n viaApiKey: true,\n },\n };\n }\n }\n\n // Exchange for token at CSS endpoint\n this.logger.debug(`Exchanging client credentials at ${this.tokenEndpoint}`);\n const tokenResult = await this.exchangeForToken(clientId, clientSecret);\n this.logger.debug(`Token exchange result: success=${tokenResult.success}, webId=${tokenResult.webId}, error=${tokenResult.error}`);\n \n if (!tokenResult.success || !tokenResult.webId || !tokenResult.token) {\n return { success: false, error: tokenResult.error || 'Token exchange failed' };\n }\n\n // Cache the token\n if (this.tokenCache && tokenResult.expiresAt) {\n await this.tokenCache.set(\n clientId,\n tokenResult.token!,\n tokenResult.webId,\n tokenResult.expiresAt,\n tokenResult.tokenType,\n );\n }\n\n const context: SolidAuthContext = {\n type: 'solid',\n webId: tokenResult.webId,\n accountId: tokenResult.webId,\n clientId,\n clientSecret,\n accessToken: tokenResult.token,\n tokenType: tokenResult.tokenType ?? 'Bearer',\n viaApiKey: true,\n };\n\n this.logger.debug(`Authenticated API Key for webId: ${tokenResult.webId}`);\n return { success: true, context };\n } catch (error) {\n this.logger.error(`API Key authentication error: ${error}`);\n return { success: false, error: 'Authentication failed' };\n }\n }\n\n private async exchangeForToken(clientId: string, clientSecret: string): Promise<{\n success: boolean;\n token?: string;\n tokenType?: 'Bearer' | 'DPoP';\n webId?: string;\n expiresAt?: Date;\n error?: string;\n }> {\n // 开发模式:跳过 CSS token exchange\n if (process.env.NODE_ENV === 'development') {\n this.logger.warn(`[DEV] Skipping token exchange for ${clientId.slice(0, 8)}...`);\n return {\n success: true,\n token: `dev-token-${clientId}`,\n expiresAt: new Date(Date.now() + 3600000),\n };\n }\n\n try {\n const response = await fetch(this.tokenEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: clientId,\n client_secret: clientSecret,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n this.logger.warn(`Token exchange failed: ${response.status} ${error}`);\n return { success: false, error: `Token exchange failed: ${response.status}` };\n }\n\n const data = await response.json() as {\n access_token: string;\n expires_in?: number;\n token_type: string;\n webid?: string; // CSS returns webid in response\n };\n\n // Extract webId from token response or decode from JWT\n let webId = data.webid;\n if (!webId && data.access_token) {\n webId = this.extractWebIdFromJwt(data.access_token);\n }\n\n if (!webId) {\n return { success: false, error: 'Could not determine webId from token response' };\n }\n\n const expiresAt = data.expires_in\n ? new Date(Date.now() + data.expires_in * 1000 - 60000) // 1 min buffer\n : new Date(Date.now() + 3600000); // Default 1 hour\n\n return {\n success: true,\n token: data.access_token,\n tokenType: data.token_type?.toUpperCase() === 'DPOP' ? 'DPoP' : 'Bearer',\n webId,\n expiresAt,\n };\n } catch (error) {\n this.logger.error(`Token exchange error: ${error}`);\n return { success: false, error: 'Token exchange failed' };\n }\n }\n\n /**\n * Extract webId from JWT access token\n */\n private extractWebIdFromJwt(jwt: string): string | undefined {\n try {\n const parts = jwt.split('.');\n if (parts.length !== 3) {\n return undefined;\n }\n const payload = JSON.parse(Buffer.from(parts[1], 'base64').toString('utf-8'));\n return payload.webid || payload.webId || payload.sub;\n } catch {\n return undefined;\n }\n }\n\n private isJwt(token: string): boolean {\n return /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/.test(token);\n }\n}\n"]}
1
+ {"version":3,"file":"ClientCredentialsAuthenticator.js","sourceRoot":"","sources":["../../../src/api/auth/ClientCredentialsAuthenticator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { Authenticator, AuthResult } from './Authenticator';\nimport type { SolidAuthContext } from './AuthContext';\nimport { extractAuthoritativeWebIdFromTokenResponse } from './TokenIdentity';\n\n/**\n * Interface for token cache\n */\nexport interface TokenCache {\n get(clientId: string): Promise<{\n token: string;\n tokenType?: 'Bearer' | 'DPoP';\n webId: string;\n expiresAt: Date;\n } | undefined>;\n set(\n clientId: string,\n token: string,\n webId: string,\n expiresAt: Date,\n tokenType?: 'Bearer' | 'DPoP',\n ): Promise<void>;\n}\n\nexport interface ClientCredentialsAuthenticatorOptions {\n tokenCache?: TokenCache;\n /**\n * CSS token endpoint URL\n */\n tokenEndpoint: string;\n}\n\n/**\n * Authenticator for CSS client credentials wrapped in sk-xxx transport format.\n * \n * Format: sk-base64(client_id:client_secret)\n * \n * This authenticator:\n * 1. Decodes the wrapper to get client_id and client_secret\n * 2. Exchanges them for a Solid Token via CSS token endpoint\n * 3. Extracts webId from the token response\n * 4. Returns a SolidAuthContext\n */\nexport class ClientCredentialsAuthenticator implements Authenticator {\n private readonly logger = getLoggerFor(this);\n private readonly tokenCache?: TokenCache;\n private readonly tokenEndpoint: string;\n\n public constructor(options: ClientCredentialsAuthenticatorOptions) {\n this.tokenCache = options.tokenCache;\n this.tokenEndpoint = options.tokenEndpoint;\n }\n\n public canAuthenticate(request: IncomingMessage): boolean {\n const auth = request.headers.authorization;\n if (!auth?.startsWith('Bearer ')) {\n return false;\n }\n // If there's a DPoP header, it's a Solid Token, not a client credentials wrapper.\n if (request.headers.dpop) {\n return false;\n }\n const token = auth.slice(7).trim();\n if (!token) {\n return false;\n }\n // Only handle sk-xxx format or non-JWT tokens\n return token.startsWith('sk-') || !this.isJwt(token);\n }\n\n public async authenticate(request: IncomingMessage): Promise<AuthResult> {\n const authorization = request.headers.authorization;\n if (!authorization?.startsWith('Bearer ')) {\n return { success: false, error: 'Missing Bearer token' };\n }\n\n const token = authorization.slice(7).trim();\n if (!token) {\n return { success: false, error: 'Empty client credentials wrapper' };\n }\n\n try {\n let clientId: string;\n let clientSecret: string;\n\n // Parse sk-xxx format (base64 encoded client_id:client_secret)\n if (token.startsWith('sk-')) {\n const base64 = token.slice(3);\n try {\n const decoded = Buffer.from(base64, 'base64').toString('utf-8');\n const colonIndex = decoded.indexOf(':');\n if (colonIndex === -1) {\n return { success: false, error: 'Invalid client credentials wrapper: missing colon separator' };\n }\n clientId = decoded.slice(0, colonIndex);\n clientSecret = decoded.slice(colonIndex + 1);\n \n if (!clientId || !clientSecret) {\n return { success: false, error: 'Invalid client credentials wrapper: empty client_id or client_secret' };\n }\n } catch {\n return { success: false, error: 'Invalid client credentials wrapper encoding' };\n }\n } else {\n // Non sk- format is intentionally unsupported; Xpod does not keep an API key mirror table.\n return { success: false, error: 'Invalid client credentials wrapper: must start with sk-' };\n }\n\n // Check cache first\n if (this.tokenCache) {\n const cached = await this.tokenCache.get(clientId);\n if (cached && cached.expiresAt > new Date()) {\n this.logger.debug(`Using cached token for ${clientId.slice(0, 8)}...`);\n return {\n success: true,\n context: {\n type: 'solid',\n webId: cached.webId,\n accountId: cached.webId,\n clientId,\n clientSecret,\n accessToken: cached.token,\n tokenType: cached.tokenType ?? 'Bearer',\n viaApiKey: true,\n },\n };\n }\n }\n\n // Exchange for token at CSS endpoint\n this.logger.debug(`Exchanging client credentials at ${this.tokenEndpoint}`);\n const tokenResult = await this.exchangeForToken(clientId, clientSecret);\n this.logger.debug(`Token exchange result: success=${tokenResult.success}, webId=${tokenResult.webId}, error=${tokenResult.error}`);\n \n if (!tokenResult.success || !tokenResult.webId || !tokenResult.token) {\n return { success: false, error: tokenResult.error || 'Token exchange failed' };\n }\n\n // Cache the token\n if (this.tokenCache && tokenResult.expiresAt) {\n await this.tokenCache.set(\n clientId,\n tokenResult.token!,\n tokenResult.webId,\n tokenResult.expiresAt,\n tokenResult.tokenType,\n );\n }\n\n const context: SolidAuthContext = {\n type: 'solid',\n webId: tokenResult.webId,\n accountId: tokenResult.webId,\n clientId,\n clientSecret,\n accessToken: tokenResult.token,\n tokenType: tokenResult.tokenType ?? 'Bearer',\n viaApiKey: true,\n };\n\n this.logger.debug(`Authenticated client credentials for webId: ${tokenResult.webId}`);\n return { success: true, context };\n } catch (error) {\n this.logger.error(`Client credentials authentication error: ${error}`);\n return { success: false, error: 'Authentication failed' };\n }\n }\n\n private async exchangeForToken(clientId: string, clientSecret: string): Promise<{\n success: boolean;\n token?: string;\n tokenType?: 'Bearer' | 'DPoP';\n webId?: string;\n expiresAt?: Date;\n error?: string;\n }> {\n // 开发模式:跳过 CSS token exchange\n if (process.env.NODE_ENV === 'development') {\n this.logger.warn(`[DEV] Skipping token exchange for ${clientId.slice(0, 8)}...`);\n return {\n success: true,\n token: `dev-token-${clientId}`,\n expiresAt: new Date(Date.now() + 3600000),\n };\n }\n\n try {\n const response = await fetch(this.tokenEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: clientId,\n client_secret: clientSecret,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n this.logger.warn(`Token exchange failed: ${response.status} ${error}`);\n return { success: false, error: `Token exchange failed: ${response.status}` };\n }\n\n const data = await response.json() as {\n access_token: string;\n expires_in?: number;\n token_type: string;\n webid?: string; // CSS returns webid in response\n };\n\n // Extract webId from token response or decode from JWT\n const webId = extractAuthoritativeWebIdFromTokenResponse(data);\n\n if (!webId) {\n return { success: false, error: 'Could not determine webId from token response' };\n }\n\n const expiresAt = data.expires_in\n ? new Date(Date.now() + data.expires_in * 1000 - 60000) // 1 min buffer\n : new Date(Date.now() + 3600000); // Default 1 hour\n\n return {\n success: true,\n token: data.access_token,\n tokenType: data.token_type?.toUpperCase() === 'DPOP' ? 'DPoP' : 'Bearer',\n webId,\n expiresAt,\n };\n } catch (error) {\n this.logger.error(`Token exchange error: ${error}`);\n return { success: false, error: 'Token exchange failed' };\n }\n }\n\n private isJwt(token: string): boolean {\n return /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/.test(token);\n }\n}\n"]}
@@ -5,6 +5,8 @@ export interface SolidTokenAuthenticatorOptions {
5
5
  * Function to resolve accountId from webId (optional)
6
6
  */
7
7
  resolveAccountId?: (webId: string) => Promise<string | undefined>;
8
+ publicBaseUrl?: string;
9
+ internalBaseUrl?: string;
8
10
  }
9
11
  /**
10
12
  * Authenticator for Solid access tokens (Bearer or DPoP).
@@ -2,15 +2,102 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SolidTokenAuthenticator = void 0;
4
4
  const access_token_verifier_1 = require("@solid/access-token-verifier");
5
+ const IssuerKeySetCache_1 = require("@solid/access-token-verifier/dist/class/IssuerKeySetCache");
6
+ const WebIDIssuersCache_1 = require("@solid/access-token-verifier/dist/class/WebIDIssuersCache");
5
7
  const global_logger_factory_1 = require("global-logger-factory");
8
+ const jose_1 = require("jose");
9
+ const n3_1 = require("n3");
10
+ const SOLID_OIDC_ISSUER = n3_1.DataFactory.namedNode('http://www.w3.org/ns/solid/terms#oidcIssuer');
11
+ class FetchWebIdIssuersCache extends WebIDIssuersCache_1.WebIDIssuersCache {
12
+ constructor(publicOrigin, internalOrigin) {
13
+ super();
14
+ this.publicOrigin = publicOrigin;
15
+ this.internalOrigin = internalOrigin;
16
+ this.resolved = new Map();
17
+ }
18
+ async getIssuers(webId) {
19
+ const cached = this.resolved.get(webId);
20
+ if (cached) {
21
+ return cached;
22
+ }
23
+ const target = this.internalUrl(webId);
24
+ const response = await fetch(target, {
25
+ headers: { Accept: 'text/turtle' },
26
+ signal: AbortSignal.timeout(10_000),
27
+ });
28
+ if (!response.ok) {
29
+ throw new Error(`WebID dereference failed: HTTP ${response.status}`);
30
+ }
31
+ const baseIRI = response.url || webId;
32
+ const store = new n3_1.Store(new n3_1.Parser({ baseIRI }).parse(await response.text()));
33
+ const issuers = store
34
+ .getObjects(n3_1.DataFactory.namedNode(webId), SOLID_OIDC_ISSUER, null)
35
+ .map((term) => term.value);
36
+ this.resolved.set(webId, issuers);
37
+ return issuers;
38
+ }
39
+ internalUrl(value) {
40
+ const url = new URL(value);
41
+ if (this.publicOrigin && this.internalOrigin && url.origin === this.publicOrigin) {
42
+ return new URL(`${url.pathname}${url.search}`, this.internalOrigin).href;
43
+ }
44
+ return url.href;
45
+ }
46
+ }
47
+ class FetchIssuerKeySetCache extends IssuerKeySetCache_1.IssuerKeySetCache {
48
+ constructor(publicOrigin, internalOrigin) {
49
+ super();
50
+ this.publicOrigin = publicOrigin;
51
+ this.internalOrigin = internalOrigin;
52
+ this.resolved = new Map();
53
+ }
54
+ async getKeySet(issuer) {
55
+ const cached = this.resolved.get(issuer);
56
+ if (cached) {
57
+ return cached;
58
+ }
59
+ const logicalConfigurationUrl = new URL('.well-known/openid-configuration', issuer.endsWith('/') ? issuer : `${issuer}/`);
60
+ const configurationTarget = this.internalUrl(logicalConfigurationUrl);
61
+ const configurationResponse = await fetch(configurationTarget, {
62
+ headers: { Accept: 'application/json' },
63
+ signal: AbortSignal.timeout(10_000),
64
+ });
65
+ if (!configurationResponse.ok) {
66
+ throw new Error(`OIDC issuer configuration failed: HTTP ${configurationResponse.status}`);
67
+ }
68
+ const configuration = await configurationResponse.json();
69
+ if (typeof configuration.jwks_uri !== 'string') {
70
+ throw new Error('OIDC issuer configuration is missing jwks_uri');
71
+ }
72
+ const keySetTarget = this.internalUrl(new URL(configuration.jwks_uri));
73
+ const keySetResponse = await fetch(keySetTarget, {
74
+ headers: { Accept: 'application/json' },
75
+ signal: AbortSignal.timeout(10_000),
76
+ });
77
+ if (!keySetResponse.ok) {
78
+ throw new Error(`OIDC issuer JWKS failed: HTTP ${keySetResponse.status}`);
79
+ }
80
+ const keySet = (0, jose_1.createLocalJWKSet)(await keySetResponse.json());
81
+ this.resolved.set(issuer, keySet);
82
+ return keySet;
83
+ }
84
+ internalUrl(url) {
85
+ if (this.publicOrigin && this.internalOrigin && url.origin === this.publicOrigin) {
86
+ return new URL(`${url.pathname}${url.search}`, this.internalOrigin);
87
+ }
88
+ return url;
89
+ }
90
+ }
6
91
  /**
7
92
  * Authenticator for Solid access tokens (Bearer or DPoP).
8
93
  */
9
94
  class SolidTokenAuthenticator {
10
95
  constructor(options = {}) {
11
96
  this.logger = (0, global_logger_factory_1.getLoggerFor)(this);
12
- this.verify = (0, access_token_verifier_1.createSolidTokenVerifier)();
13
97
  this.resolveAccountId = options.resolveAccountId;
98
+ const publicOrigin = options.publicBaseUrl ? new URL(options.publicBaseUrl).origin : undefined;
99
+ const internalOrigin = options.internalBaseUrl ? new URL(options.internalBaseUrl).origin : undefined;
100
+ this.verify = (0, access_token_verifier_1.createSolidTokenVerifier)(undefined, new FetchIssuerKeySetCache(publicOrigin, internalOrigin), new FetchWebIdIssuersCache(publicOrigin, internalOrigin));
14
101
  }
15
102
  canAuthenticate(request) {
16
103
  const auth = request.headers.authorization;
@@ -41,7 +128,6 @@ class SolidTokenAuthenticator {
41
128
  // Build the request URL for verification
42
129
  const method = (request.method ?? 'GET');
43
130
  const url = this.buildRequestUrl(request);
44
- console.log(`[SolidTokenAuthenticator] Verifying DPoP for URL: ${url}, method: ${method}, host header: ${request.headers.host}, x-forwarded-host: ${request.headers['x-forwarded-host']}`);
45
131
  const dpopOptions = dpopHeader ? {
46
132
  header: dpopHeader,
47
133
  method,
@@ -1 +1 @@
1
- {"version":3,"file":"SolidTokenAuthenticator.js","sourceRoot":"","sources":["../../../src/api/auth/SolidTokenAuthenticator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport { createSolidTokenVerifier } from '@solid/access-token-verifier';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { Authenticator, AuthResult } from './Authenticator';\nimport type { SolidAuthContext } from './AuthContext';\n\nexport interface SolidTokenAuthenticatorOptions {\n /**\n * Function to resolve accountId from webId (optional)\n */\n resolveAccountId?: (webId: string) => Promise<string | undefined>;\n}\n\n/**\n * Authenticator for Solid access tokens (Bearer or DPoP).\n */\nexport class SolidTokenAuthenticator implements Authenticator {\n private readonly logger = getLoggerFor(this);\n private readonly verify = createSolidTokenVerifier();\n private readonly resolveAccountId?: (webId: string) => Promise<string | undefined>;\n\n public constructor(options: SolidTokenAuthenticatorOptions = {}) {\n this.resolveAccountId = options.resolveAccountId;\n }\n\n public canAuthenticate(request: IncomingMessage): boolean {\n const auth = request.headers.authorization;\n if (!auth) {\n return false;\n }\n const [scheme, token] = auth.split(' ');\n if (!scheme || !token) {\n return false;\n }\n if (scheme !== 'Bearer' && scheme !== 'DPoP') {\n return false;\n }\n return this.isJwt(token.trim());\n }\n\n public async authenticate(request: IncomingMessage): Promise<AuthResult> {\n const authorization = request.headers.authorization;\n if (!authorization) {\n return { success: false, error: 'Missing Authorization header' };\n }\n\n const [scheme, rawToken] = authorization.split(' ');\n const dpopRaw = request.headers.dpop;\n const dpopHeader = Array.isArray(dpopRaw) ? dpopRaw[0] : dpopRaw;\n if (scheme === 'DPoP' && !dpopHeader) {\n return { success: false, error: 'Missing DPoP header' };\n }\n\n try {\n // Build the request URL for verification\n const method = (request.method ?? 'GET') as 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';\n const url = this.buildRequestUrl(request);\n\n console.log(`[SolidTokenAuthenticator] Verifying DPoP for URL: ${url}, method: ${method}, host header: ${request.headers.host}, x-forwarded-host: ${request.headers['x-forwarded-host']}`);\n\n const dpopOptions = dpopHeader ? {\n header: dpopHeader,\n method,\n url,\n } : undefined;\n\n const payload = await this.verify(authorization, dpopOptions) as unknown as Record<string, unknown>;\n\n const webId = this.extractWebId(payload);\n if (!webId) {\n return { success: false, error: 'Token missing webId claim' };\n }\n\n const clientId = this.extractString(payload, 'client_id') ?? \n this.extractString(payload, 'azp');\n\n let accountId: string | undefined;\n if (this.resolveAccountId) {\n try {\n accountId = await this.resolveAccountId(webId);\n } catch (error) {\n this.logger.warn(`Failed to resolve accountId for webId ${webId}: ${error}`);\n }\n }\n\n const context: SolidAuthContext = {\n type: 'solid',\n webId,\n accountId,\n clientId,\n accessToken: rawToken?.trim(),\n tokenType: scheme === 'DPoP' ? 'DPoP' : 'Bearer',\n dpopProof: dpopHeader?.trim(),\n };\n\n this.logger.debug(`Authenticated Solid token for webId: ${webId}`);\n return { success: true, context };\n } catch (error) {\n this.logger.warn(`Solid token verification failed: ${error}`);\n return { success: false, error: 'Invalid Solid token' };\n }\n }\n\n private buildRequestUrl(request: IncomingMessage): string {\n const host = this.getHost(request);\n const proto = this.getProtocol(request);\n const prefix = this.getForwardedPrefix(request);\n const path = request.url ?? '/';\n const fullPath = prefix ? this.joinPaths(prefix, path) : path;\n return `${proto}://${host}${fullPath}`;\n }\n\n private getProtocol(request: IncomingMessage): string {\n const forwarded = request.headers['x-forwarded-proto'];\n if (forwarded) {\n const proto = Array.isArray(forwarded) ? forwarded[0] : forwarded;\n return proto?.split(',')[0]?.trim() ?? 'http';\n }\n // Default to http for local development\n return 'http';\n }\n\n private getHost(request: IncomingMessage): string {\n const forwarded = request.headers['x-forwarded-host'];\n if (forwarded) {\n const raw = Array.isArray(forwarded) ? forwarded[0] : forwarded;\n const host = raw?.split(',')[0]?.trim();\n if (host) {\n return host;\n }\n }\n return request.headers.host ?? 'localhost';\n }\n\n private getForwardedPrefix(request: IncomingMessage): string | undefined {\n const forwarded = request.headers['x-forwarded-prefix'];\n if (!forwarded) {\n return undefined;\n }\n const raw = Array.isArray(forwarded) ? forwarded[0] : forwarded;\n const prefix = raw?.split(',')[0]?.trim();\n return prefix && prefix !== '/' ? prefix : undefined;\n }\n\n private joinPaths(prefix: string, path: string): string {\n const normalizedPrefix = prefix.endsWith('/') ? prefix.slice(0, -1) : prefix;\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n if (!normalizedPrefix) {\n return normalizedPath;\n }\n return `${normalizedPrefix}${normalizedPath}`;\n }\n\n private isJwt(token: string): boolean {\n return /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/.test(token);\n }\n\n private extractWebId(payload: Record<string, unknown>): string | undefined {\n return this.extractString(payload, 'webid') ??\n this.extractString(payload, 'webId') ??\n this.extractString(payload, 'sub');\n }\n\n private extractString(obj: Record<string, unknown>, key: string): string | undefined {\n const value = obj[key];\n if (typeof value === 'string' && value.trim().length > 0) {\n return value.trim();\n }\n return undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"SolidTokenAuthenticator.js","sourceRoot":"","sources":["../../../src/api/auth/SolidTokenAuthenticator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport { createSolidTokenVerifier } from '@solid/access-token-verifier';\nimport { IssuerKeySetCache } from '@solid/access-token-verifier/dist/class/IssuerKeySetCache';\nimport { WebIDIssuersCache } from '@solid/access-token-verifier/dist/class/WebIDIssuersCache';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { createLocalJWKSet, createRemoteJWKSet, type JSONWebKeySet } from 'jose';\nimport { DataFactory, Parser, Store } from 'n3';\nimport type { Authenticator, AuthResult } from './Authenticator';\nimport type { SolidAuthContext } from './AuthContext';\n\nconst SOLID_OIDC_ISSUER = DataFactory.namedNode('http://www.w3.org/ns/solid/terms#oidcIssuer');\n\nclass FetchWebIdIssuersCache extends WebIDIssuersCache {\n private readonly resolved = new Map<string, string[]>();\n\n public constructor(\n private readonly publicOrigin?: string,\n private readonly internalOrigin?: string,\n ) {\n super();\n }\n\n public override async getIssuers(webId: string): Promise<string[]> {\n const cached = this.resolved.get(webId);\n if (cached) {\n return cached;\n }\n\n const target = this.internalUrl(webId);\n const response = await fetch(target, {\n headers: { Accept: 'text/turtle' },\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) {\n throw new Error(`WebID dereference failed: HTTP ${response.status}`);\n }\n const baseIRI = response.url || webId;\n const store = new Store(new Parser({ baseIRI }).parse(await response.text()));\n const issuers = store\n .getObjects(DataFactory.namedNode(webId), SOLID_OIDC_ISSUER, null)\n .map((term) => term.value);\n this.resolved.set(webId, issuers);\n return issuers;\n }\n\n private internalUrl(value: string): string {\n const url = new URL(value);\n if (this.publicOrigin && this.internalOrigin && url.origin === this.publicOrigin) {\n return new URL(`${url.pathname}${url.search}`, this.internalOrigin).href;\n }\n return url.href;\n }\n}\n\nclass FetchIssuerKeySetCache extends IssuerKeySetCache {\n private readonly resolved = new Map<string, ReturnType<typeof createRemoteJWKSet>>();\n\n public constructor(\n private readonly publicOrigin?: string,\n private readonly internalOrigin?: string,\n ) {\n super();\n }\n\n public override async getKeySet(issuer: string): Promise<ReturnType<typeof createRemoteJWKSet>> {\n const cached = this.resolved.get(issuer);\n if (cached) {\n return cached;\n }\n\n const logicalConfigurationUrl = new URL(\n '.well-known/openid-configuration',\n issuer.endsWith('/') ? issuer : `${issuer}/`,\n );\n const configurationTarget = this.internalUrl(logicalConfigurationUrl);\n const configurationResponse = await fetch(configurationTarget, {\n headers: { Accept: 'application/json' },\n signal: AbortSignal.timeout(10_000),\n });\n if (!configurationResponse.ok) {\n throw new Error(`OIDC issuer configuration failed: HTTP ${configurationResponse.status}`);\n }\n const configuration = await configurationResponse.json() as { jwks_uri?: unknown };\n if (typeof configuration.jwks_uri !== 'string') {\n throw new Error('OIDC issuer configuration is missing jwks_uri');\n }\n const keySetTarget = this.internalUrl(new URL(configuration.jwks_uri));\n const keySetResponse = await fetch(keySetTarget, {\n headers: { Accept: 'application/json' },\n signal: AbortSignal.timeout(10_000),\n });\n if (!keySetResponse.ok) {\n throw new Error(`OIDC issuer JWKS failed: HTTP ${keySetResponse.status}`);\n }\n const keySet = createLocalJWKSet(\n await keySetResponse.json() as JSONWebKeySet,\n ) as unknown as ReturnType<typeof createRemoteJWKSet>;\n this.resolved.set(issuer, keySet);\n return keySet;\n }\n\n private internalUrl(url: URL): URL {\n if (this.publicOrigin && this.internalOrigin && url.origin === this.publicOrigin) {\n return new URL(`${url.pathname}${url.search}`, this.internalOrigin);\n }\n return url;\n }\n}\n\nexport interface SolidTokenAuthenticatorOptions {\n /**\n * Function to resolve accountId from webId (optional)\n */\n resolveAccountId?: (webId: string) => Promise<string | undefined>;\n publicBaseUrl?: string;\n internalBaseUrl?: string;\n}\n\n/**\n * Authenticator for Solid access tokens (Bearer or DPoP).\n */\nexport class SolidTokenAuthenticator implements Authenticator {\n private readonly logger = getLoggerFor(this);\n private readonly verify: ReturnType<typeof createSolidTokenVerifier>;\n private readonly resolveAccountId?: (webId: string) => Promise<string | undefined>;\n\n public constructor(options: SolidTokenAuthenticatorOptions = {}) {\n this.resolveAccountId = options.resolveAccountId;\n const publicOrigin = options.publicBaseUrl ? new URL(options.publicBaseUrl).origin : undefined;\n const internalOrigin = options.internalBaseUrl ? new URL(options.internalBaseUrl).origin : undefined;\n this.verify = createSolidTokenVerifier(\n undefined,\n new FetchIssuerKeySetCache(publicOrigin, internalOrigin),\n new FetchWebIdIssuersCache(publicOrigin, internalOrigin),\n );\n }\n\n public canAuthenticate(request: IncomingMessage): boolean {\n const auth = request.headers.authorization;\n if (!auth) {\n return false;\n }\n const [scheme, token] = auth.split(' ');\n if (!scheme || !token) {\n return false;\n }\n if (scheme !== 'Bearer' && scheme !== 'DPoP') {\n return false;\n }\n return this.isJwt(token.trim());\n }\n\n public async authenticate(request: IncomingMessage): Promise<AuthResult> {\n const authorization = request.headers.authorization;\n if (!authorization) {\n return { success: false, error: 'Missing Authorization header' };\n }\n\n const [scheme, rawToken] = authorization.split(' ');\n const dpopRaw = request.headers.dpop;\n const dpopHeader = Array.isArray(dpopRaw) ? dpopRaw[0] : dpopRaw;\n if (scheme === 'DPoP' && !dpopHeader) {\n return { success: false, error: 'Missing DPoP header' };\n }\n\n try {\n // Build the request URL for verification\n const method = (request.method ?? 'GET') as 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';\n const url = this.buildRequestUrl(request);\n\n const dpopOptions = dpopHeader ? {\n header: dpopHeader,\n method,\n url,\n } : undefined;\n\n const payload = await this.verify(authorization, dpopOptions) as unknown as Record<string, unknown>;\n\n const webId = this.extractWebId(payload);\n if (!webId) {\n return { success: false, error: 'Token missing webId claim' };\n }\n\n const clientId = this.extractString(payload, 'client_id') ?? \n this.extractString(payload, 'azp');\n\n let accountId: string | undefined;\n if (this.resolveAccountId) {\n try {\n accountId = await this.resolveAccountId(webId);\n } catch (error) {\n this.logger.warn(`Failed to resolve accountId for webId ${webId}: ${error}`);\n }\n }\n\n const context: SolidAuthContext = {\n type: 'solid',\n webId,\n accountId,\n clientId,\n accessToken: rawToken?.trim(),\n tokenType: scheme === 'DPoP' ? 'DPoP' : 'Bearer',\n dpopProof: dpopHeader?.trim(),\n };\n\n this.logger.debug(`Authenticated Solid token for webId: ${webId}`);\n return { success: true, context };\n } catch (error) {\n this.logger.warn(`Solid token verification failed: ${error}`);\n return { success: false, error: 'Invalid Solid token' };\n }\n }\n\n private buildRequestUrl(request: IncomingMessage): string {\n const host = this.getHost(request);\n const proto = this.getProtocol(request);\n const prefix = this.getForwardedPrefix(request);\n const path = request.url ?? '/';\n const fullPath = prefix ? this.joinPaths(prefix, path) : path;\n return `${proto}://${host}${fullPath}`;\n }\n\n private getProtocol(request: IncomingMessage): string {\n const forwarded = request.headers['x-forwarded-proto'];\n if (forwarded) {\n const proto = Array.isArray(forwarded) ? forwarded[0] : forwarded;\n return proto?.split(',')[0]?.trim() ?? 'http';\n }\n // Default to http for local development\n return 'http';\n }\n\n private getHost(request: IncomingMessage): string {\n const forwarded = request.headers['x-forwarded-host'];\n if (forwarded) {\n const raw = Array.isArray(forwarded) ? forwarded[0] : forwarded;\n const host = raw?.split(',')[0]?.trim();\n if (host) {\n return host;\n }\n }\n return request.headers.host ?? 'localhost';\n }\n\n private getForwardedPrefix(request: IncomingMessage): string | undefined {\n const forwarded = request.headers['x-forwarded-prefix'];\n if (!forwarded) {\n return undefined;\n }\n const raw = Array.isArray(forwarded) ? forwarded[0] : forwarded;\n const prefix = raw?.split(',')[0]?.trim();\n return prefix && prefix !== '/' ? prefix : undefined;\n }\n\n private joinPaths(prefix: string, path: string): string {\n const normalizedPrefix = prefix.endsWith('/') ? prefix.slice(0, -1) : prefix;\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n if (!normalizedPrefix) {\n return normalizedPath;\n }\n return `${normalizedPrefix}${normalizedPath}`;\n }\n\n private isJwt(token: string): boolean {\n return /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/.test(token);\n }\n\n private extractWebId(payload: Record<string, unknown>): string | undefined {\n return this.extractString(payload, 'webid') ??\n this.extractString(payload, 'webId') ??\n this.extractString(payload, 'sub');\n }\n\n private extractString(obj: Record<string, unknown>, key: string): string | undefined {\n const value = obj[key];\n if (typeof value === 'string' && value.trim().length > 0) {\n return value.trim();\n }\n return undefined;\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ export type TokenIdentityResponse = {
2
+ access_token?: unknown;
3
+ webid?: unknown;
4
+ webId?: unknown;
5
+ };
6
+ export declare function extractAuthoritativeWebIdFromTokenResponse(response: TokenIdentityResponse): string | undefined;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractAuthoritativeWebIdFromTokenResponse = extractAuthoritativeWebIdFromTokenResponse;
4
+ function extractAuthoritativeWebIdFromTokenResponse(response) {
5
+ const bodyWebId = extractString(response.webid) ?? extractString(response.webId);
6
+ if (bodyWebId) {
7
+ return bodyWebId;
8
+ }
9
+ const accessToken = extractString(response.access_token);
10
+ if (!accessToken) {
11
+ return undefined;
12
+ }
13
+ return extractWebIdFromJwtPayload(accessToken);
14
+ }
15
+ function extractWebIdFromJwtPayload(jwt) {
16
+ try {
17
+ const parts = jwt.split('.');
18
+ if (parts.length !== 3 || !parts[1]) {
19
+ return undefined;
20
+ }
21
+ const payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf-8'));
22
+ return extractString(payload.webid) ?? extractString(payload.webId) ?? extractString(payload.sub);
23
+ }
24
+ catch {
25
+ return undefined;
26
+ }
27
+ }
28
+ function extractString(value) {
29
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
30
+ }
31
+ //# sourceMappingURL=TokenIdentity.js.map