@undefineds.co/xpod 0.1.7 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/README.md +164 -3
  2. package/config/cli.json +9 -71
  3. package/config/cloud.json +34 -7
  4. package/config/local.json +6 -2
  5. package/config/resolver.json +11 -49
  6. package/config/runtime-open.json +22 -0
  7. package/config/xpod.base.json +32 -0
  8. package/config/xpod.cluster.json +2 -44
  9. package/config/xpod.json +5 -2
  10. package/dist/agents/AgentExecutorFactory.js +1 -1
  11. package/dist/agents/AgentExecutorFactory.js.map +1 -1
  12. package/dist/agents/AgentManager.js +1 -1
  13. package/dist/agents/AgentManager.js.map +1 -1
  14. package/dist/agents/config/agent-meta-schema.d.ts +7 -7
  15. package/dist/agents/config/agent-meta-schema.js +1 -1
  16. package/dist/agents/config/agent-meta-schema.js.map +1 -1
  17. package/dist/agents/config/resolve.js +1 -1
  18. package/dist/agents/config/resolve.js.map +1 -1
  19. package/dist/agents/schema/agent-config.d.ts +18 -18
  20. package/dist/agents/schema/agent-config.js +1 -1
  21. package/dist/agents/schema/agent-config.js.map +1 -1
  22. package/dist/agents/schema/tables.d.ts +8 -8
  23. package/dist/agents/schema/tables.js +1 -1
  24. package/dist/agents/schema/tables.js.map +1 -1
  25. package/dist/ai/schema/config.d.ts +7 -7
  26. package/dist/ai/schema/config.js +1 -1
  27. package/dist/ai/schema/config.js.map +1 -1
  28. package/dist/ai/schema/model.d.ts +13 -13
  29. package/dist/ai/schema/model.js +1 -1
  30. package/dist/ai/schema/model.js.map +1 -1
  31. package/dist/ai/schema/provider.d.ts +7 -7
  32. package/dist/ai/schema/provider.js +1 -1
  33. package/dist/ai/schema/provider.js.map +1 -1
  34. package/dist/ai/schema/vector-store.d.ts +17 -17
  35. package/dist/ai/schema/vector-store.js +1 -1
  36. package/dist/ai/schema/vector-store.js.map +1 -1
  37. package/dist/ai/service/CredentialReaderImpl.js +1 -1
  38. package/dist/ai/service/CredentialReaderImpl.js.map +1 -1
  39. package/dist/ai/service/DefaultAiConfigService.js.map +1 -1
  40. package/dist/api/ApiServer.d.ts +3 -1
  41. package/dist/api/ApiServer.js +14 -1
  42. package/dist/api/ApiServer.js.map +1 -1
  43. package/dist/api/auth/AuthContext.d.ts +12 -1
  44. package/dist/api/auth/AuthContext.js +18 -1
  45. package/dist/api/auth/AuthContext.js.map +1 -1
  46. package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +0 -1
  47. package/dist/api/auth/ClientCredentialsAuthenticator.js.map +1 -1
  48. package/dist/api/auth/ServiceTokenAuthenticator.d.ts +18 -0
  49. package/dist/api/auth/ServiceTokenAuthenticator.js +50 -0
  50. package/dist/api/auth/ServiceTokenAuthenticator.js.map +1 -0
  51. package/dist/api/auth/index.d.ts +1 -0
  52. package/dist/api/auth/index.js +1 -0
  53. package/dist/api/auth/index.js.map +1 -1
  54. package/dist/api/chatkit/ai-provider.d.ts +0 -10
  55. package/dist/api/chatkit/ai-provider.js +11 -120
  56. package/dist/api/chatkit/ai-provider.js.map +1 -1
  57. package/dist/api/chatkit/default-agent.js +11 -8
  58. package/dist/api/chatkit/default-agent.js.map +1 -1
  59. package/dist/api/chatkit/pod-store.d.ts +6 -0
  60. package/dist/api/chatkit/pod-store.js +103 -36
  61. package/dist/api/chatkit/pod-store.js.map +1 -1
  62. package/dist/api/chatkit/schema.d.ts +32 -26
  63. package/dist/api/chatkit/schema.js +16 -8
  64. package/dist/api/chatkit/schema.js.map +1 -1
  65. package/dist/api/container/business-token.d.ts +9 -0
  66. package/dist/api/container/business-token.js +32 -0
  67. package/dist/api/container/business-token.js.map +1 -0
  68. package/dist/api/container/cloud.js +36 -12
  69. package/dist/api/container/cloud.js.map +1 -1
  70. package/dist/api/container/common.js +13 -5
  71. package/dist/api/container/common.js.map +1 -1
  72. package/dist/api/container/index.js +94 -14
  73. package/dist/api/container/index.js.map +1 -1
  74. package/dist/api/container/local.js +2 -1
  75. package/dist/api/container/local.js.map +1 -1
  76. package/dist/api/container/routes.js +81 -9
  77. package/dist/api/container/routes.js.map +1 -1
  78. package/dist/api/container/types.d.ts +8 -6
  79. package/dist/api/container/types.js.map +1 -1
  80. package/dist/api/handlers/AdminHandler.js +9 -9
  81. package/dist/api/handlers/AdminHandler.js.map +1 -1
  82. package/dist/api/handlers/ApiKeyHandler.js +0 -6
  83. package/dist/api/handlers/ApiKeyHandler.js.map +1 -1
  84. package/dist/api/handlers/EdgeNodeSignalHandler.d.ts +17 -0
  85. package/dist/api/handlers/EdgeNodeSignalHandler.js +171 -0
  86. package/dist/api/handlers/EdgeNodeSignalHandler.js.map +1 -0
  87. package/dist/api/handlers/PodManagementHandler.d.ts +5 -4
  88. package/dist/api/handlers/PodManagementHandler.js +11 -10
  89. package/dist/api/handlers/PodManagementHandler.js.map +1 -1
  90. package/dist/api/handlers/ProvisionHandler.d.ts +42 -0
  91. package/dist/api/handlers/ProvisionHandler.js +161 -0
  92. package/dist/api/handlers/ProvisionHandler.js.map +1 -0
  93. package/dist/api/handlers/QuotaHandler.d.ts +7 -7
  94. package/dist/api/handlers/QuotaHandler.js +143 -73
  95. package/dist/api/handlers/QuotaHandler.js.map +1 -1
  96. package/dist/api/handlers/SubdomainClientHandler.js +2 -2
  97. package/dist/api/handlers/SubdomainClientHandler.js.map +1 -1
  98. package/dist/api/handlers/SubdomainHandler.js +13 -8
  99. package/dist/api/handlers/SubdomainHandler.js.map +1 -1
  100. package/dist/api/handlers/UsageHandler.d.ts +14 -0
  101. package/dist/api/handlers/UsageHandler.js +123 -0
  102. package/dist/api/handlers/UsageHandler.js.map +1 -0
  103. package/dist/api/handlers/index.d.ts +3 -1
  104. package/dist/api/handlers/index.js +3 -1
  105. package/dist/api/handlers/index.js.map +1 -1
  106. package/dist/api/main.js +18 -0
  107. package/dist/api/main.js.map +1 -1
  108. package/dist/api/middleware/OpenAuthMiddleware.d.ts +12 -0
  109. package/dist/api/middleware/OpenAuthMiddleware.js +27 -0
  110. package/dist/api/middleware/OpenAuthMiddleware.js.map +1 -0
  111. package/dist/api/runtime.d.ts +15 -0
  112. package/dist/api/runtime.js +125 -0
  113. package/dist/api/runtime.js.map +1 -0
  114. package/dist/api/service/VectorStoreService.js +1 -1
  115. package/dist/api/service/VectorStoreService.js.map +1 -1
  116. package/dist/api/service/VercelChatService.d.ts +16 -7
  117. package/dist/api/service/VercelChatService.js +98 -178
  118. package/dist/api/service/VercelChatService.js.map +1 -1
  119. package/dist/api/store/DrizzleClientCredentialsStore.d.ts +6 -11
  120. package/dist/api/store/DrizzleClientCredentialsStore.js +9 -39
  121. package/dist/api/store/DrizzleClientCredentialsStore.js.map +1 -1
  122. package/dist/authorization/AuthModeSelector.d.ts +10 -0
  123. package/dist/authorization/AuthModeSelector.js +27 -0
  124. package/dist/authorization/AuthModeSelector.js.map +1 -0
  125. package/dist/authorization/AuthModeSelector.jsonld +81 -0
  126. package/dist/cli/commands/account.d.ts +6 -0
  127. package/dist/cli/commands/account.js +119 -0
  128. package/dist/cli/commands/account.js.map +1 -0
  129. package/dist/cli/commands/auth.js +20 -29
  130. package/dist/cli/commands/auth.js.map +1 -1
  131. package/dist/cli/commands/backup.d.ts +15 -0
  132. package/dist/cli/commands/backup.js +286 -0
  133. package/dist/cli/commands/backup.js.map +1 -0
  134. package/dist/cli/commands/config.d.ts +34 -3
  135. package/dist/cli/commands/config.js +195 -258
  136. package/dist/cli/commands/config.js.map +1 -1
  137. package/dist/cli/commands/doctor.d.ts +6 -0
  138. package/dist/cli/commands/doctor.js +94 -0
  139. package/dist/cli/commands/doctor.js.map +1 -0
  140. package/dist/cli/commands/pod.d.ts +6 -0
  141. package/dist/cli/commands/pod.js +124 -0
  142. package/dist/cli/commands/pod.js.map +1 -0
  143. package/dist/cli/commands/start.js +28 -5
  144. package/dist/cli/commands/start.js.map +1 -1
  145. package/dist/cli/index.js +9 -0
  146. package/dist/cli/index.js.map +1 -1
  147. package/dist/cli/lib/credentials-store.d.ts +17 -0
  148. package/dist/cli/lib/credentials-store.js +73 -0
  149. package/dist/cli/lib/credentials-store.js.map +1 -0
  150. package/dist/cli/lib/css-account.d.ts +17 -0
  151. package/dist/cli/lib/css-account.js +56 -0
  152. package/dist/cli/lib/css-account.js.map +1 -1
  153. package/dist/cli/lib/pod-thread-store.d.ts +57 -0
  154. package/dist/cli/lib/pod-thread-store.js +310 -0
  155. package/dist/cli/lib/pod-thread-store.js.map +1 -0
  156. package/dist/cli/lib/solid-auth.d.ts +20 -0
  157. package/dist/cli/lib/solid-auth.js +70 -0
  158. package/dist/cli/lib/solid-auth.js.map +1 -0
  159. package/dist/components/components.jsonld +5 -8
  160. package/dist/components/context.jsonld +114 -244
  161. package/dist/credential/schema/tables.d.ts +14 -14
  162. package/dist/credential/schema/tables.js +1 -1
  163. package/dist/credential/schema/tables.js.map +1 -1
  164. package/dist/edge/EdgeNodeAgent.js +2 -2
  165. package/dist/edge/EdgeNodeAgent.js.map +1 -1
  166. package/dist/edge/EdgeNodeDnsCoordinator.d.ts +1 -7
  167. package/dist/edge/EdgeNodeDnsCoordinator.js +31 -41
  168. package/dist/edge/EdgeNodeDnsCoordinator.js.map +1 -1
  169. package/dist/edge/EdgeNodeDnsCoordinator.jsonld +1 -27
  170. package/dist/edge/EdgeNodeModeDetector.d.ts +1 -1
  171. package/dist/edge/EdgeNodeModeDetector.js +9 -11
  172. package/dist/edge/EdgeNodeModeDetector.js.map +1 -1
  173. package/dist/http/ClusterIngressRouter.js +3 -3
  174. package/dist/http/ClusterIngressRouter.js.map +1 -1
  175. package/dist/http/ClusterWebSocketConfigurator.js +2 -2
  176. package/dist/http/ClusterWebSocketConfigurator.js.map +1 -1
  177. package/dist/http/PodRoutingHttpHandler.js +2 -2
  178. package/dist/http/PodRoutingHttpHandler.js.map +1 -1
  179. package/dist/http/cluster/PodMigrationHttpHandler.d.ts +1 -1
  180. package/dist/http/cluster/PodMigrationHttpHandler.js +1 -1
  181. package/dist/http/cluster/PodMigrationHttpHandler.js.map +1 -1
  182. package/dist/identity/drizzle/EdgeNodeRepository.d.ts +37 -4
  183. package/dist/identity/drizzle/EdgeNodeRepository.js +120 -128
  184. package/dist/identity/drizzle/EdgeNodeRepository.js.map +1 -1
  185. package/dist/identity/drizzle/ServiceTokenRepository.d.ts +52 -0
  186. package/dist/identity/drizzle/ServiceTokenRepository.js +142 -0
  187. package/dist/identity/drizzle/ServiceTokenRepository.js.map +1 -0
  188. package/dist/identity/drizzle/db.d.ts +9 -0
  189. package/dist/identity/drizzle/db.js +235 -3
  190. package/dist/identity/drizzle/db.js.map +1 -1
  191. package/dist/identity/drizzle/schema.pg.d.ts +5 -0
  192. package/dist/identity/drizzle/schema.pg.js +49 -20
  193. package/dist/identity/drizzle/schema.pg.js.map +1 -1
  194. package/dist/identity/drizzle/schema.sqlite.d.ts +332 -57
  195. package/dist/identity/drizzle/schema.sqlite.js +48 -18
  196. package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
  197. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +6 -4
  198. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
  199. package/dist/index.d.ts +6 -9
  200. package/dist/index.js +12 -14
  201. package/dist/index.js.map +1 -1
  202. package/dist/main.js +25 -8
  203. package/dist/main.js.map +1 -1
  204. package/dist/provision/ProvisionCodeCodec.d.ts +39 -0
  205. package/dist/provision/ProvisionCodeCodec.js +65 -0
  206. package/dist/provision/ProvisionCodeCodec.js.map +1 -0
  207. package/dist/provision/ProvisionCodeCodec.jsonld +47 -0
  208. package/dist/provision/ProvisionPodCreator.d.ts +20 -0
  209. package/dist/provision/ProvisionPodCreator.js +84 -0
  210. package/dist/provision/ProvisionPodCreator.js.map +1 -0
  211. package/dist/provision/ProvisionPodCreator.jsonld +118 -0
  212. package/dist/quota/DrizzleQuotaService.d.ts +17 -3
  213. package/dist/quota/DrizzleQuotaService.js +108 -8
  214. package/dist/quota/DrizzleQuotaService.js.map +1 -1
  215. package/dist/quota/DrizzleQuotaService.jsonld +33 -22
  216. package/dist/quota/NoopQuotaService.d.ts +7 -1
  217. package/dist/quota/NoopQuotaService.js +12 -0
  218. package/dist/quota/NoopQuotaService.js.map +1 -1
  219. package/dist/quota/NoopQuotaService.jsonld +24 -0
  220. package/dist/quota/QuotaService.d.ts +17 -0
  221. package/dist/quota/QuotaService.js +5 -0
  222. package/dist/quota/QuotaService.js.map +1 -1
  223. package/dist/quota/QuotaService.jsonld +50 -0
  224. package/dist/runtime/Proxy.d.ts +22 -4
  225. package/dist/runtime/Proxy.js +154 -35
  226. package/dist/runtime/Proxy.js.map +1 -1
  227. package/dist/runtime/XpodRuntime.d.ts +49 -0
  228. package/dist/runtime/XpodRuntime.js +374 -0
  229. package/dist/runtime/XpodRuntime.js.map +1 -0
  230. package/dist/runtime/env-utils.d.ts +2 -0
  231. package/dist/runtime/env-utils.js +55 -0
  232. package/dist/runtime/env-utils.js.map +1 -0
  233. package/dist/runtime/index.d.ts +4 -0
  234. package/dist/runtime/index.js +8 -1
  235. package/dist/runtime/index.js.map +1 -1
  236. package/dist/runtime/socket-fetch.d.ts +1 -0
  237. package/dist/runtime/socket-fetch.js +72 -0
  238. package/dist/runtime/socket-fetch.js.map +1 -0
  239. package/dist/runtime/socket-http.d.ts +1 -0
  240. package/dist/runtime/socket-http.js +142 -0
  241. package/dist/runtime/socket-http.js.map +1 -0
  242. package/dist/runtime/socket-utils.d.ts +2 -0
  243. package/dist/runtime/socket-utils.js +34 -0
  244. package/dist/runtime/socket-utils.js.map +1 -0
  245. package/dist/service/{EdgeNodeHeartbeatService.d.ts → EdgeNodeSignalClient.d.ts} +3 -3
  246. package/dist/service/{EdgeNodeHeartbeatService.js → EdgeNodeSignalClient.js} +4 -4
  247. package/dist/service/EdgeNodeSignalClient.js.map +1 -0
  248. package/dist/service/PodMigrationService.d.ts +1 -2
  249. package/dist/service/PodMigrationService.js +1 -2
  250. package/dist/service/PodMigrationService.js.map +1 -1
  251. package/dist/storage/SparqlUpdateResourceStore.js +1 -1
  252. package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
  253. package/dist/storage/accessors/MinioDataAccessor.d.ts +6 -0
  254. package/dist/storage/accessors/MinioDataAccessor.js +10 -0
  255. package/dist/storage/accessors/MinioDataAccessor.js.map +1 -1
  256. package/dist/storage/accessors/MinioDataAccessor.jsonld +4 -0
  257. package/dist/storage/accessors/MixDataAccessor.d.ts +2 -1
  258. package/dist/storage/accessors/MixDataAccessor.js +12 -1
  259. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  260. package/dist/storage/accessors/MixDataAccessor.jsonld +19 -0
  261. package/dist/storage/locking/UrlAwareRedisLocker.d.ts +18 -0
  262. package/dist/storage/locking/UrlAwareRedisLocker.js +60 -0
  263. package/dist/storage/locking/UrlAwareRedisLocker.js.map +1 -0
  264. package/dist/storage/locking/UrlAwareRedisLocker.jsonld +123 -0
  265. package/dist/storage/quota/UsageRepository.d.ts +41 -8
  266. package/dist/storage/quota/UsageRepository.js +252 -50
  267. package/dist/storage/quota/UsageRepository.js.map +1 -1
  268. package/dist/storage/sparql/ComunicaQuintEngine.d.ts +9 -0
  269. package/dist/storage/sparql/ComunicaQuintEngine.js +50 -9
  270. package/dist/storage/sparql/ComunicaQuintEngine.js.map +1 -1
  271. package/dist/storage/sparql/QueryOptimizer.js +13 -1
  272. package/dist/storage/sparql/QueryOptimizer.js.map +1 -1
  273. package/dist/storage/sparql/QuintQuerySource.d.ts +14 -0
  274. package/dist/storage/sparql/QuintQuerySource.js +152 -1
  275. package/dist/storage/sparql/QuintQuerySource.js.map +1 -1
  276. package/dist/storage/sparql/SubgraphQueryEngine.d.ts +1 -0
  277. package/dist/storage/sparql/SubgraphQueryEngine.js +6 -2
  278. package/dist/storage/sparql/SubgraphQueryEngine.js.map +1 -1
  279. package/dist/storage/sparql/SubgraphQueryEngine.jsonld +4 -0
  280. package/dist/subdomain/SubdomainClient.d.ts +3 -3
  281. package/dist/subdomain/SubdomainClient.js +1 -1
  282. package/dist/subdomain/SubdomainClient.js.map +1 -1
  283. package/dist/subdomain/SubdomainService.d.ts +15 -16
  284. package/dist/subdomain/SubdomainService.js +80 -54
  285. package/dist/subdomain/SubdomainService.js.map +1 -1
  286. package/dist/subdomain/SubdomainService.jsonld +22 -26
  287. package/dist/supervisor/Supervisor.d.ts +7 -2
  288. package/dist/supervisor/Supervisor.js +33 -1
  289. package/dist/supervisor/Supervisor.js.map +1 -1
  290. package/dist/task/DrizzleTaskQueue.d.ts +1 -1
  291. package/dist/task/DrizzleTaskQueue.js +1 -1
  292. package/dist/task/DrizzleTaskQueue.js.map +1 -1
  293. package/dist/task/schema.d.ts +10 -10
  294. package/dist/task/schema.js +1 -1
  295. package/dist/task/schema.js.map +1 -1
  296. package/dist/test-utils/index.d.ts +4 -0
  297. package/dist/test-utils/index.js +8 -0
  298. package/dist/test-utils/index.js.map +1 -0
  299. package/dist/test-utils/no-auth-xpod.d.ts +11 -0
  300. package/dist/test-utils/no-auth-xpod.js +25 -0
  301. package/dist/test-utils/no-auth-xpod.js.map +1 -0
  302. package/dist/test-utils/seed-pod.d.ts +5 -0
  303. package/dist/test-utils/seed-pod.js +61 -0
  304. package/dist/test-utils/seed-pod.js.map +1 -0
  305. package/package.json +38 -10
  306. package/templates/identity/account/create-pod.html.ejs +110 -0
  307. package/templates/main.html.ejs +10 -0
  308. package/dist/api/handlers/DevHandler.d.ts +0 -18
  309. package/dist/api/handlers/DevHandler.js +0 -276
  310. package/dist/api/handlers/DevHandler.js.map +0 -1
  311. package/dist/api/handlers/SignalHandler.d.ts +0 -13
  312. package/dist/api/handlers/SignalHandler.js +0 -122
  313. package/dist/api/handlers/SignalHandler.js.map +0 -1
  314. package/dist/gateway/Proxy.d.ts +0 -24
  315. package/dist/gateway/Proxy.js +0 -209
  316. package/dist/gateway/Proxy.js.map +0 -1
  317. package/dist/gateway/Supervisor.d.ts +0 -2
  318. package/dist/gateway/Supervisor.js +0 -7
  319. package/dist/gateway/Supervisor.js.map +0 -1
  320. package/dist/gateway/port-finder.d.ts +0 -4
  321. package/dist/gateway/port-finder.js +0 -15
  322. package/dist/gateway/port-finder.js.map +0 -1
  323. package/dist/gateway/types.d.ts +0 -1
  324. package/dist/gateway/types.js +0 -3
  325. package/dist/gateway/types.js.map +0 -1
  326. package/dist/http/SignalInterceptHttpHandler.d.ts +0 -24
  327. package/dist/http/SignalInterceptHttpHandler.js +0 -47
  328. package/dist/http/SignalInterceptHttpHandler.js.map +0 -1
  329. package/dist/http/SignalInterceptHttpHandler.jsonld +0 -103
  330. package/dist/http/admin/EdgeNodeSignalHttpHandler.d.ts +0 -71
  331. package/dist/http/admin/EdgeNodeSignalHttpHandler.js +0 -674
  332. package/dist/http/admin/EdgeNodeSignalHttpHandler.js.map +0 -1
  333. package/dist/http/admin/EdgeNodeSignalHttpHandler.jsonld +0 -406
  334. package/dist/http/cluster/PodMigrationHttpHandler.jsonld +0 -169
  335. package/dist/quota/DefaultQuotaService.d.ts +0 -16
  336. package/dist/quota/DefaultQuotaService.js +0 -37
  337. package/dist/quota/DefaultQuotaService.js.map +0 -1
  338. package/dist/quota/DefaultQuotaService.jsonld +0 -85
  339. package/dist/service/EdgeNodeHeartbeatService.js.map +0 -1
  340. package/dist/service/PodMigrationService.jsonld +0 -76
  341. package/dist/storage/MigratableDataAccessor.d.ts +0 -63
  342. package/dist/storage/MigratableDataAccessor.js +0 -11
  343. package/dist/storage/MigratableDataAccessor.js.map +0 -1
  344. package/dist/storage/MigratableDataAccessor.jsonld +0 -60
  345. package/dist/storage/accessors/TieredMinioDataAccessor.d.ts +0 -150
  346. package/dist/storage/accessors/TieredMinioDataAccessor.js +0 -582
  347. package/dist/storage/accessors/TieredMinioDataAccessor.js.map +0 -1
  348. package/dist/storage/accessors/TieredMinioDataAccessor.jsonld +0 -333
  349. package/static/app/assets/index.css +0 -1
  350. package/static/app/assets/main.js +0 -11
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.doctorCommand = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const fs_1 = require("fs");
6
+ const path_1 = require("path");
7
+ function check(ok, label) {
8
+ const icon = ok ? '✓' : '✗';
9
+ console.log(`${icon} ${label}`);
10
+ return { ok, label };
11
+ }
12
+ async function checkNodeVersion() {
13
+ const major = parseInt(process.versions.node.split('.')[0], 10);
14
+ return check(major >= 18, `Node.js v${process.versions.node} (≥ 18)`);
15
+ }
16
+ async function checkServerReachable(url) {
17
+ if (!url)
18
+ return check(true, 'Server check skipped (no --url)');
19
+ const base = url.endsWith('/') ? url : `${url}/`;
20
+ try {
21
+ const res = await fetch(`${base}.account/`, {
22
+ headers: { Accept: 'application/json' },
23
+ signal: AbortSignal.timeout(5000),
24
+ });
25
+ return check(res.ok, `Server reachable at ${base}`);
26
+ }
27
+ catch {
28
+ return check(false, `Server unreachable at ${base}`);
29
+ }
30
+ }
31
+ function checkFileExists(filePath, label) {
32
+ return check((0, fs_1.existsSync)((0, path_1.resolve)(filePath)), label);
33
+ }
34
+ function checkBuildFreshness() {
35
+ const distPath = (0, path_1.resolve)('dist');
36
+ const srcPath = (0, path_1.resolve)('src');
37
+ if (!(0, fs_1.existsSync)(distPath)) {
38
+ return check(false, 'dist/ exists');
39
+ }
40
+ try {
41
+ const distStat = (0, fs_1.statSync)(distPath);
42
+ const srcStat = (0, fs_1.statSync)(srcPath);
43
+ const fresh = distStat.mtimeMs >= srcStat.mtimeMs;
44
+ return check(fresh, fresh ? 'dist/ up to date' : 'dist/ outdated (run yarn build)');
45
+ }
46
+ catch {
47
+ return check(true, 'dist/ exists');
48
+ }
49
+ }
50
+ function checkPortAvailable(port) {
51
+ try {
52
+ const output = (0, child_process_1.execSync)(`lsof -i :${port} -t 2>/dev/null`, { encoding: 'utf-8' }).trim();
53
+ if (output) {
54
+ return check(false, `Port ${port} in use (PID: ${output.split('\n')[0]})`);
55
+ }
56
+ return check(true, `Port ${port} available`);
57
+ }
58
+ catch {
59
+ // lsof returns non-zero when no process found — port is free
60
+ return check(true, `Port ${port} available`);
61
+ }
62
+ }
63
+ exports.doctorCommand = {
64
+ command: 'doctor',
65
+ describe: 'Check environment and diagnose issues',
66
+ builder: (yargs) => yargs
67
+ .option('url', {
68
+ alias: 'u',
69
+ type: 'string',
70
+ description: 'Server URL to check connectivity',
71
+ }),
72
+ handler: async (argv) => {
73
+ console.log('Running diagnostics...\n');
74
+ const results = [];
75
+ results.push(await checkNodeVersion());
76
+ results.push(checkPortAvailable(3000));
77
+ results.push(await checkServerReachable(argv.url));
78
+ results.push(checkFileExists('.env.local', '.env.local found'));
79
+ results.push(checkFileExists('.env.server', '.env.server found'));
80
+ results.push(checkFileExists('config/local.json', 'config/local.json found'));
81
+ results.push(checkFileExists('config/cloud.json', 'config/cloud.json found'));
82
+ results.push(checkFileExists('node_modules', 'node_modules/ exists'));
83
+ results.push(checkBuildFreshness());
84
+ const failed = results.filter((r) => !r.ok);
85
+ console.log('');
86
+ if (failed.length === 0) {
87
+ console.log('All checks passed.');
88
+ }
89
+ else {
90
+ console.log(`${failed.length} issue(s) found.`);
91
+ }
92
+ },
93
+ };
94
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport { execSync } from 'child_process';\nimport { existsSync, statSync } from 'fs';\nimport { resolve } from 'path';\n\ninterface DoctorArgs {\n url?: string;\n}\n\ninterface CheckResult {\n ok: boolean;\n label: string;\n}\n\nfunction check(ok: boolean, label: string): CheckResult {\n const icon = ok ? '✓' : '✗';\n console.log(`${icon} ${label}`);\n return { ok, label };\n}\n\nasync function checkNodeVersion(): Promise<CheckResult> {\n const major = parseInt(process.versions.node.split('.')[0], 10);\n return check(major >= 18, `Node.js v${process.versions.node} (≥ 18)`);\n}\n\nasync function checkServerReachable(url?: string): Promise<CheckResult> {\n if (!url) return check(true, 'Server check skipped (no --url)');\n const base = url.endsWith('/') ? url : `${url}/`;\n try {\n const res = await fetch(`${base}.account/`, {\n headers: { Accept: 'application/json' },\n signal: AbortSignal.timeout(5000),\n });\n return check(res.ok, `Server reachable at ${base}`);\n } catch {\n return check(false, `Server unreachable at ${base}`);\n }\n}\n\nfunction checkFileExists(filePath: string, label: string): CheckResult {\n return check(existsSync(resolve(filePath)), label);\n}\n\nfunction checkBuildFreshness(): CheckResult {\n const distPath = resolve('dist');\n const srcPath = resolve('src');\n if (!existsSync(distPath)) {\n return check(false, 'dist/ exists');\n }\n try {\n const distStat = statSync(distPath);\n const srcStat = statSync(srcPath);\n const fresh = distStat.mtimeMs >= srcStat.mtimeMs;\n return check(fresh, fresh ? 'dist/ up to date' : 'dist/ outdated (run yarn build)');\n } catch {\n return check(true, 'dist/ exists');\n }\n}\n\nfunction checkPortAvailable(port: number): CheckResult {\n try {\n const output = execSync(`lsof -i :${port} -t 2>/dev/null`, { encoding: 'utf-8' }).trim();\n if (output) {\n return check(false, `Port ${port} in use (PID: ${output.split('\\n')[0]})`);\n }\n return check(true, `Port ${port} available`);\n } catch {\n // lsof returns non-zero when no process found — port is free\n return check(true, `Port ${port} available`);\n }\n}\n\nexport const doctorCommand: CommandModule<object, DoctorArgs> = {\n command: 'doctor',\n describe: 'Check environment and diagnose issues',\n builder: (yargs) =>\n yargs\n .option('url', {\n alias: 'u',\n type: 'string',\n description: 'Server URL to check connectivity',\n }),\n handler: async (argv) => {\n console.log('Running diagnostics...\\n');\n\n const results: CheckResult[] = [];\n\n results.push(await checkNodeVersion());\n results.push(checkPortAvailable(3000));\n results.push(await checkServerReachable(argv.url));\n results.push(checkFileExists('.env.local', '.env.local found'));\n results.push(checkFileExists('.env.server', '.env.server found'));\n results.push(checkFileExists('config/local.json', 'config/local.json found'));\n results.push(checkFileExists('config/cloud.json', 'config/cloud.json found'));\n results.push(checkFileExists('node_modules', 'node_modules/ exists'));\n results.push(checkBuildFreshness());\n\n const failed = results.filter((r) => !r.ok);\n console.log('');\n if (failed.length === 0) {\n console.log('All checks passed.');\n } else {\n console.log(`${failed.length} issue(s) found.`);\n }\n },\n};\n"]}
@@ -0,0 +1,6 @@
1
+ import type { CommandModule } from 'yargs';
2
+ interface PodArgs {
3
+ url?: string;
4
+ }
5
+ export declare const podCommand: CommandModule<object, PodArgs>;
6
+ export {};
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.podCommand = void 0;
4
+ const css_account_1 = require("../lib/css-account");
5
+ const credentials_store_1 = require("../lib/credentials-store");
6
+ function resolveUrl(url, credUrl) {
7
+ const raw = url || credUrl || process.env.CSS_BASE_URL || 'http://localhost:3000';
8
+ return raw.endsWith('/') ? raw : `${raw}/`;
9
+ }
10
+ /**
11
+ * Try to login via email/password (CSS Account Token) or fall back to
12
+ * client credentials from ~/.xpod/credentials.json.
13
+ *
14
+ * Returns { token, mode } where mode indicates which auth was used.
15
+ */
16
+ async function resolveLogin(email, password, baseUrl) {
17
+ if (email && password) {
18
+ if (!(await (0, css_account_1.checkServer)(baseUrl))) {
19
+ console.error(`Cannot reach server at ${baseUrl}`);
20
+ process.exit(1);
21
+ }
22
+ const token = await (0, css_account_1.login)(email, password, baseUrl);
23
+ if (!token) {
24
+ console.error('Login failed. Check email/password.');
25
+ process.exit(1);
26
+ }
27
+ return { token, mode: 'account' };
28
+ }
29
+ // Fall back to credentials store — get CSS Account Token via OIDC isn't possible,
30
+ // but pod/account commands need CSS Account Token. For now, require email/password
31
+ // for commands that use .account/ API.
32
+ console.error('This command requires --email and --password (or run `xpod auth create-credentials` for other commands).');
33
+ console.error('Pod management commands use the CSS Account API which requires email/password authentication.');
34
+ process.exit(1);
35
+ }
36
+ const podCreateCommand = {
37
+ command: 'create <name>',
38
+ describe: 'Create a new pod',
39
+ builder: (yargs) => yargs
40
+ .positional('name', { type: 'string', demandOption: true, description: 'Pod name' })
41
+ .option('email', { type: 'string', description: 'Account email' })
42
+ .option('password', { type: 'string', description: 'Account password' }),
43
+ handler: async (argv) => {
44
+ const creds = (0, credentials_store_1.loadCredentials)();
45
+ const baseUrl = resolveUrl(argv.url, creds?.url);
46
+ const { token } = await resolveLogin(argv.email, argv.password, baseUrl);
47
+ const data = await (0, css_account_1.getAccountData)(token, baseUrl);
48
+ if (!data?.controls.pod) {
49
+ console.error('Cannot find pod creation endpoint.');
50
+ process.exit(1);
51
+ }
52
+ const result = await (0, css_account_1.createPod)(token, data.controls.pod, argv.name);
53
+ if (!result) {
54
+ console.error(`Failed to create pod "${argv.name}".`);
55
+ process.exit(1);
56
+ }
57
+ console.log(`Pod created:`);
58
+ console.log(` URL: ${result.podUrl}`);
59
+ console.log(` WebID: ${result.webId}`);
60
+ },
61
+ };
62
+ const podListCommand = {
63
+ command: 'list',
64
+ describe: 'List all pods for the account',
65
+ builder: (yargs) => yargs
66
+ .option('email', { type: 'string', description: 'Account email' })
67
+ .option('password', { type: 'string', description: 'Account password' }),
68
+ handler: async (argv) => {
69
+ const creds = (0, credentials_store_1.loadCredentials)();
70
+ const baseUrl = resolveUrl(argv.url, creds?.url);
71
+ const { token } = await resolveLogin(argv.email, argv.password, baseUrl);
72
+ const data = await (0, css_account_1.getAccountData)(token, baseUrl);
73
+ if (!data) {
74
+ console.error('Failed to get account info.');
75
+ process.exit(1);
76
+ }
77
+ const podEntries = Object.entries(data.pods);
78
+ if (podEntries.length === 0) {
79
+ console.log('No pods found.');
80
+ return;
81
+ }
82
+ console.log(`Found ${podEntries.length} pod(s):\n`);
83
+ for (const [url, name] of podEntries) {
84
+ console.log(` ${name}`);
85
+ console.log(` URL: ${url}`);
86
+ }
87
+ const webIdEntries = Object.entries(data.webIds);
88
+ if (webIdEntries.length > 0) {
89
+ console.log(`\nWebIDs:`);
90
+ for (const [url] of webIdEntries) {
91
+ console.log(` ${url}`);
92
+ }
93
+ }
94
+ },
95
+ };
96
+ const podDeleteCommand = {
97
+ command: 'delete <name>',
98
+ describe: 'Delete a pod (not yet supported)',
99
+ builder: (yargs) => yargs
100
+ .positional('name', { type: 'string', demandOption: true, description: 'Pod name' })
101
+ .option('email', { type: 'string', description: 'Account email' })
102
+ .option('password', { type: 'string', description: 'Account password' }),
103
+ handler: async () => {
104
+ console.error('Pod deletion is not yet supported by CSS.');
105
+ console.error('Please delete the pod manually through the server admin interface.');
106
+ process.exit(1);
107
+ },
108
+ };
109
+ exports.podCommand = {
110
+ command: 'pod',
111
+ describe: 'Pod management',
112
+ builder: (yargs) => yargs
113
+ .option('url', {
114
+ alias: 'u',
115
+ type: 'string',
116
+ description: 'Server base URL',
117
+ })
118
+ .command(podCreateCommand)
119
+ .command(podListCommand)
120
+ .command(podDeleteCommand)
121
+ .demandCommand(1, 'Please specify a pod subcommand'),
122
+ handler: () => { },
123
+ };
124
+ //# sourceMappingURL=pod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pod.js","sourceRoot":"","sources":["../../../src/cli/commands/pod.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport {\n checkServer,\n login,\n getAccountData,\n createPod,\n} from '../lib/css-account';\nimport { loadCredentials } from '../lib/credentials-store';\n\ninterface PodArgs {\n url?: string;\n}\n\ninterface PodAuthArgs extends PodArgs {\n email?: string;\n password?: string;\n}\n\ninterface PodCreateArgs extends PodAuthArgs {\n name: string;\n}\n\nfunction resolveUrl(url?: string, credUrl?: string): string {\n const raw = url || credUrl || process.env.CSS_BASE_URL || 'http://localhost:3000';\n return raw.endsWith('/') ? raw : `${raw}/`;\n}\n\n/**\n * Try to login via email/password (CSS Account Token) or fall back to\n * client credentials from ~/.xpod/credentials.json.\n *\n * Returns { token, mode } where mode indicates which auth was used.\n */\nasync function resolveLogin(\n email: string | undefined,\n password: string | undefined,\n baseUrl: string,\n): Promise<{ token: string; mode: 'account' }> {\n if (email && password) {\n if (!(await checkServer(baseUrl))) {\n console.error(`Cannot reach server at ${baseUrl}`);\n process.exit(1);\n }\n const token = await login(email, password, baseUrl);\n if (!token) {\n console.error('Login failed. Check email/password.');\n process.exit(1);\n }\n return { token, mode: 'account' };\n }\n\n // Fall back to credentials store — get CSS Account Token via OIDC isn't possible,\n // but pod/account commands need CSS Account Token. For now, require email/password\n // for commands that use .account/ API.\n console.error('This command requires --email and --password (or run `xpod auth create-credentials` for other commands).');\n console.error('Pod management commands use the CSS Account API which requires email/password authentication.');\n process.exit(1);\n}\n\nconst podCreateCommand: CommandModule<PodArgs, PodCreateArgs> = {\n command: 'create <name>',\n describe: 'Create a new pod',\n builder: (yargs) =>\n yargs\n .positional('name', { type: 'string', demandOption: true, description: 'Pod name' })\n .option('email', { type: 'string', description: 'Account email' })\n .option('password', { type: 'string', description: 'Account password' }),\n handler: async (argv) => {\n const creds = loadCredentials();\n const baseUrl = resolveUrl(argv.url, creds?.url);\n const { token } = await resolveLogin(argv.email, argv.password, baseUrl);\n\n const data = await getAccountData(token, baseUrl);\n if (!data?.controls.pod) {\n console.error('Cannot find pod creation endpoint.');\n process.exit(1);\n }\n\n const result = await createPod(token, data.controls.pod, argv.name);\n if (!result) {\n console.error(`Failed to create pod \"${argv.name}\".`);\n process.exit(1);\n }\n\n console.log(`Pod created:`);\n console.log(` URL: ${result.podUrl}`);\n console.log(` WebID: ${result.webId}`);\n },\n};\n\nconst podListCommand: CommandModule<PodArgs, PodAuthArgs> = {\n command: 'list',\n describe: 'List all pods for the account',\n builder: (yargs) =>\n yargs\n .option('email', { type: 'string', description: 'Account email' })\n .option('password', { type: 'string', description: 'Account password' }),\n handler: async (argv) => {\n const creds = loadCredentials();\n const baseUrl = resolveUrl(argv.url, creds?.url);\n const { token } = await resolveLogin(argv.email, argv.password, baseUrl);\n\n const data = await getAccountData(token, baseUrl);\n if (!data) {\n console.error('Failed to get account info.');\n process.exit(1);\n }\n\n const podEntries = Object.entries(data.pods);\n if (podEntries.length === 0) {\n console.log('No pods found.');\n return;\n }\n\n console.log(`Found ${podEntries.length} pod(s):\\n`);\n for (const [url, name] of podEntries) {\n console.log(` ${name}`);\n console.log(` URL: ${url}`);\n }\n\n const webIdEntries = Object.entries(data.webIds);\n if (webIdEntries.length > 0) {\n console.log(`\\nWebIDs:`);\n for (const [url] of webIdEntries) {\n console.log(` ${url}`);\n }\n }\n },\n};\n\nconst podDeleteCommand: CommandModule<PodArgs, PodAuthArgs & { name: string }> = {\n command: 'delete <name>',\n describe: 'Delete a pod (not yet supported)',\n builder: (yargs) =>\n yargs\n .positional('name', { type: 'string', demandOption: true, description: 'Pod name' })\n .option('email', { type: 'string', description: 'Account email' })\n .option('password', { type: 'string', description: 'Account password' }),\n handler: async () => {\n console.error('Pod deletion is not yet supported by CSS.');\n console.error('Please delete the pod manually through the server admin interface.');\n process.exit(1);\n },\n};\n\nexport const podCommand: CommandModule<object, PodArgs> = {\n command: 'pod',\n describe: 'Pod management',\n builder: (yargs) =>\n yargs\n .option('url', {\n alias: 'u',\n type: 'string',\n description: 'Server base URL',\n })\n .command(podCreateCommand)\n .command(podListCommand)\n .command(podDeleteCommand)\n .demandCommand(1, 'Please specify a pod subcommand'),\n handler: () => {},\n};\n"]}
@@ -83,43 +83,66 @@ exports.startCommand = {
83
83
  const cssPort = await (0, runtime_1.getFreePort)(mainPort + 1);
84
84
  const apiPort = await (0, runtime_1.getFreePort)(cssPort + 1);
85
85
  const baseUrl = process.env.CSS_BASE_URL || `http://${argv.host}:${mainPort}/`;
86
+ // SP 模式:全部通过环境变量配置(.env.local 或 --env 参数)
87
+ // XPOD_SERVICE_TOKEN, XPOD_NODE_ID, XPOD_NODE_TOKEN, XPOD_CLOUD_API_ENDPOINT, CSS_IDP_URL
88
+ const idpUrl = process.env.CSS_IDP_URL || process.env.XPOD_CLOUD_API_ENDPOINT;
86
89
  console.log('Starting xpod...');
87
90
  console.log(` Gateway: ${baseUrl} (${argv.host}:${mainPort})`);
88
91
  console.log(` CSS (internal): http://localhost:${cssPort}`);
89
92
  console.log(` API (internal): http://localhost:${apiPort}`);
93
+ if (idpUrl) {
94
+ console.log(` SP mode: Cloud IdP = ${idpUrl}`);
95
+ }
90
96
  const supervisor = new supervisor_1.Supervisor();
91
97
  const cssBinary = require.resolve('@solid/community-server/bin/server.js');
92
98
  const cssModuleRoot = path_1.default.dirname(require.resolve('@solid/community-server/package.json'));
99
+ const cssArgs = [cssBinary, '-c', configPath, '-m', cssModuleRoot, '-p', cssPort.toString(), '-b', baseUrl];
100
+ if (idpUrl) {
101
+ cssArgs.push('--idpUrl', idpUrl);
102
+ }
93
103
  supervisor.register({
94
104
  name: 'css',
95
105
  command: process.execPath,
96
- args: [cssBinary, '-c', configPath, '-m', cssModuleRoot, '-p', cssPort.toString(), '-b', baseUrl],
106
+ args: cssArgs,
97
107
  env: {
98
108
  ...process.env,
99
109
  CSS_PORT: cssPort.toString(),
100
110
  CSS_BASE_URL: baseUrl,
101
111
  },
102
112
  });
113
+ const isDevMode = __filename.endsWith('.ts');
114
+ const apiArgs = isDevMode
115
+ ? [
116
+ '-r',
117
+ require.resolve('ts-node/register/transpile-only'),
118
+ path_1.default.resolve(__dirname, '..', '..', 'api', 'main.ts'),
119
+ ]
120
+ : [path_1.default.resolve(__dirname, '..', '..', 'api', 'main.js')];
103
121
  supervisor.register({
104
122
  name: 'api',
105
123
  command: process.execPath,
106
- args: [path_1.default.resolve(__dirname, '..', '..', 'api', 'main.js')],
124
+ args: apiArgs,
107
125
  env: {
108
126
  ...process.env,
109
127
  API_PORT: apiPort.toString(),
110
128
  XPOD_MAIN_PORT: mainPort.toString(),
111
129
  CSS_INTERNAL_URL: `http://localhost:${cssPort}`,
112
130
  CSS_BASE_URL: baseUrl,
113
- CSS_TOKEN_ENDPOINT: `${baseUrl}.oidc/token`,
131
+ CSS_TOKEN_ENDPOINT: idpUrl
132
+ ? `${idpUrl.replace(/\/$/, '')}/.oidc/token`
133
+ : `${baseUrl}.oidc/token`,
114
134
  },
115
135
  });
116
- const proxy = new runtime_1.GatewayProxy(mainPort, supervisor);
136
+ const proxy = new runtime_1.GatewayProxy(mainPort, supervisor, '0.0.0.0', {
137
+ exitOnStop: true,
138
+ baseUrl,
139
+ });
117
140
  proxy.setTargets({
118
141
  css: `http://localhost:${cssPort}`,
119
142
  api: `http://localhost:${apiPort}`,
120
143
  });
121
144
  await supervisor.startAll();
122
- proxy.start();
145
+ await proxy.start();
123
146
  const shutdown = async (signal) => {
124
147
  console.log(`\nReceived ${signal}, shutting down...`);
125
148
  await supervisor.stopAll();
@@ -1 +1 @@
1
- {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport path from 'path';\nimport fs from 'fs';\nimport { Supervisor } from '../../supervisor';\nimport { GatewayProxy, getFreePort, PACKAGE_ROOT } from '../../runtime';\n\ninterface StartArgs {\n mode?: string;\n config?: string;\n env?: string;\n port: number;\n host: string;\n}\n\nfunction loadEnvFile(envPath: string): void {\n if (!fs.existsSync(envPath)) {\n console.warn(`Env file not found: ${envPath}`);\n return;\n }\n const content = fs.readFileSync(envPath, 'utf-8');\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (!process.env[key]) {\n process.env[key] = value;\n }\n }\n}\n\nexport const startCommand: CommandModule<object, StartArgs> = {\n command: 'start',\n describe: 'Start xpod services',\n builder: (yargs) =>\n yargs\n .option('mode', {\n alias: 'm',\n type: 'string',\n choices: ['local', 'cloud'],\n description: 'Run mode',\n })\n .option('config', {\n alias: 'c',\n type: 'string',\n description: 'Path to config file (overrides --mode)',\n })\n .option('env', {\n alias: 'e',\n type: 'string',\n description: 'Path to .env file',\n })\n .option('port', {\n alias: 'p',\n type: 'number',\n description: 'Gateway port',\n default: 3000,\n })\n .option('host', {\n type: 'string',\n description: 'Gateway host',\n default: 'localhost',\n }),\n handler: async (argv) => {\n if (argv.env) {\n loadEnvFile(argv.env);\n }\n\n const mainPort =\n argv.port !== 3000\n ? argv.port\n : parseInt(process.env.XPOD_PORT ?? process.env.PORT ?? '3000', 10);\n\n let configPath: string;\n if (argv.config) {\n configPath = argv.config;\n } else if (argv.mode) {\n configPath = path.join(PACKAGE_ROOT, `config/${argv.mode}.json`);\n } else {\n configPath = path.join(PACKAGE_ROOT, 'config/local.json');\n }\n\n const cssPort = await getFreePort(mainPort + 1);\n const apiPort = await getFreePort(cssPort + 1);\n\n const baseUrl = process.env.CSS_BASE_URL || `http://${argv.host}:${mainPort}/`;\n\n console.log('Starting xpod...');\n console.log(` Gateway: ${baseUrl} (${argv.host}:${mainPort})`);\n console.log(` CSS (internal): http://localhost:${cssPort}`);\n console.log(` API (internal): http://localhost:${apiPort}`);\n\n const supervisor = new Supervisor();\n const cssBinary = require.resolve('@solid/community-server/bin/server.js');\n const cssModuleRoot = path.dirname(require.resolve('@solid/community-server/package.json'));\n\n supervisor.register({\n name: 'css',\n command: process.execPath,\n args: [cssBinary, '-c', configPath, '-m', cssModuleRoot, '-p', cssPort.toString(), '-b', baseUrl],\n env: {\n ...process.env as Record<string, string>,\n CSS_PORT: cssPort.toString(),\n CSS_BASE_URL: baseUrl,\n },\n });\n\n supervisor.register({\n name: 'api',\n command: process.execPath,\n args: [path.resolve(__dirname, '..', '..', 'api', 'main.js')],\n env: {\n ...process.env as Record<string, string>,\n API_PORT: apiPort.toString(),\n XPOD_MAIN_PORT: mainPort.toString(),\n CSS_INTERNAL_URL: `http://localhost:${cssPort}`,\n CSS_BASE_URL: baseUrl,\n CSS_TOKEN_ENDPOINT: `${baseUrl}.oidc/token`,\n },\n });\n\n const proxy = new GatewayProxy(mainPort, supervisor);\n proxy.setTargets({\n css: `http://localhost:${cssPort}`,\n api: `http://localhost:${apiPort}`,\n });\n\n await supervisor.startAll();\n proxy.start();\n\n const shutdown = async (signal: string): Promise<void> => {\n console.log(`\\nReceived ${signal}, shutting down...`);\n await supervisor.stopAll();\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n },\n};\n"]}
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport path from 'path';\nimport fs from 'fs';\nimport { Supervisor } from '../../supervisor';\nimport { GatewayProxy, getFreePort, PACKAGE_ROOT } from '../../runtime';\n\ninterface StartArgs {\n mode?: string;\n config?: string;\n env?: string;\n port: number;\n host: string;\n}\n\nfunction loadEnvFile(envPath: string): void {\n if (!fs.existsSync(envPath)) {\n console.warn(`Env file not found: ${envPath}`);\n return;\n }\n const content = fs.readFileSync(envPath, 'utf-8');\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (!process.env[key]) {\n process.env[key] = value;\n }\n }\n}\n\nexport const startCommand: CommandModule<object, StartArgs> = {\n command: 'start',\n describe: 'Start xpod services',\n builder: (yargs) =>\n yargs\n .option('mode', {\n alias: 'm',\n type: 'string',\n choices: ['local', 'cloud'],\n description: 'Run mode',\n })\n .option('config', {\n alias: 'c',\n type: 'string',\n description: 'Path to config file (overrides --mode)',\n })\n .option('env', {\n alias: 'e',\n type: 'string',\n description: 'Path to .env file',\n })\n .option('port', {\n alias: 'p',\n type: 'number',\n description: 'Gateway port',\n default: 3000,\n })\n .option('host', {\n type: 'string',\n description: 'Gateway host',\n default: 'localhost',\n }),\n handler: async (argv) => {\n if (argv.env) {\n loadEnvFile(argv.env);\n }\n\n const mainPort =\n argv.port !== 3000\n ? argv.port\n : parseInt(process.env.XPOD_PORT ?? process.env.PORT ?? '3000', 10);\n\n let configPath: string;\n if (argv.config) {\n configPath = argv.config;\n } else if (argv.mode) {\n configPath = path.join(PACKAGE_ROOT, `config/${argv.mode}.json`);\n } else {\n configPath = path.join(PACKAGE_ROOT, 'config/local.json');\n }\n\n const cssPort = await getFreePort(mainPort + 1);\n const apiPort = await getFreePort(cssPort + 1);\n\n const baseUrl = process.env.CSS_BASE_URL || `http://${argv.host}:${mainPort}/`;\n\n // SP 模式:全部通过环境变量配置(.env.local 或 --env 参数)\n // XPOD_SERVICE_TOKEN, XPOD_NODE_ID, XPOD_NODE_TOKEN, XPOD_CLOUD_API_ENDPOINT, CSS_IDP_URL\n const idpUrl = process.env.CSS_IDP_URL || process.env.XPOD_CLOUD_API_ENDPOINT;\n\n console.log('Starting xpod...');\n console.log(` Gateway: ${baseUrl} (${argv.host}:${mainPort})`);\n console.log(` CSS (internal): http://localhost:${cssPort}`);\n console.log(` API (internal): http://localhost:${apiPort}`);\n if (idpUrl) {\n console.log(` SP mode: Cloud IdP = ${idpUrl}`);\n }\n\n const supervisor = new Supervisor();\n const cssBinary = require.resolve('@solid/community-server/bin/server.js');\n const cssModuleRoot = path.dirname(require.resolve('@solid/community-server/package.json'));\n\n const cssArgs = [cssBinary, '-c', configPath, '-m', cssModuleRoot, '-p', cssPort.toString(), '-b', baseUrl];\n if (idpUrl) {\n cssArgs.push('--idpUrl', idpUrl);\n }\n\n supervisor.register({\n name: 'css',\n command: process.execPath,\n args: cssArgs,\n env: {\n ...process.env as Record<string, string>,\n CSS_PORT: cssPort.toString(),\n CSS_BASE_URL: baseUrl,\n },\n });\n\n const isDevMode = __filename.endsWith('.ts');\n const apiArgs = isDevMode\n ? [\n '-r',\n require.resolve('ts-node/register/transpile-only'),\n path.resolve(__dirname, '..', '..', 'api', 'main.ts'),\n ]\n : [path.resolve(__dirname, '..', '..', 'api', 'main.js')];\n\n supervisor.register({\n name: 'api',\n command: process.execPath,\n args: apiArgs,\n env: {\n ...process.env as Record<string, string>,\n API_PORT: apiPort.toString(),\n XPOD_MAIN_PORT: mainPort.toString(),\n CSS_INTERNAL_URL: `http://localhost:${cssPort}`,\n CSS_BASE_URL: baseUrl,\n CSS_TOKEN_ENDPOINT: idpUrl\n ? `${idpUrl.replace(/\\/$/, '')}/.oidc/token`\n : `${baseUrl}.oidc/token`,\n },\n });\n\n const proxy = new GatewayProxy(mainPort, supervisor, '0.0.0.0', {\n exitOnStop: true,\n baseUrl,\n });\n proxy.setTargets({\n css: `http://localhost:${cssPort}`,\n api: `http://localhost:${apiPort}`,\n });\n\n await supervisor.startAll();\n await proxy.start();\n\n const shutdown = async (signal: string): Promise<void> => {\n console.log(`\\nReceived ${signal}, shutting down...`);\n await supervisor.stopAll();\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n },\n};\n"]}
package/dist/cli/index.js CHANGED
@@ -13,6 +13,10 @@ const logs_1 = require("./commands/logs");
13
13
  const auth_1 = require("./commands/auth");
14
14
  const config_1 = require("./commands/config");
15
15
  const import_1 = require("./commands/import");
16
+ const pod_1 = require("./commands/pod");
17
+ const account_1 = require("./commands/account");
18
+ const backup_1 = require("./commands/backup");
19
+ const doctor_1 = require("./commands/doctor");
16
20
  (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
17
21
  .scriptName('xpod')
18
22
  .usage('$0 <command> [options]')
@@ -23,6 +27,11 @@ const import_1 = require("./commands/import");
23
27
  .command(auth_1.authCommand)
24
28
  .command(config_1.configCommand)
25
29
  .command(import_1.importCommand)
30
+ .command(pod_1.podCommand)
31
+ .command(account_1.accountCommand)
32
+ .command(backup_1.backupCommand)
33
+ .command(backup_1.restoreCommand)
34
+ .command(doctor_1.doctorCommand)
26
35
  .demandCommand(1, 'Please specify a command')
27
36
  .strict()
28
37
  .help()
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;AACA,kDAA0B;AAC1B,2CAAwC;AACxC,4CAAgD;AAChD,0CAA8C;AAC9C,8CAAkD;AAClD,0CAA8C;AAC9C,0CAA8C;AAC9C,8CAAkD;AAClD,8CAAkD;AAElD,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KACzB,UAAU,CAAC,MAAM,CAAC;KAClB,KAAK,CAAC,wBAAwB,CAAC;KAC/B,OAAO,CAAC,oBAAY,CAAC;KACrB,OAAO,CAAC,kBAAW,CAAC;KACpB,OAAO,CAAC,sBAAa,CAAC;KACtB,OAAO,CAAC,kBAAW,CAAC;KACpB,OAAO,CAAC,kBAAW,CAAC;KACpB,OAAO,CAAC,sBAAa,CAAC;KACtB,OAAO,CAAC,sBAAa,CAAC;KACtB,aAAa,CAAC,CAAC,EAAE,0BAA0B,CAAC;KAC5C,MAAM,EAAE;KACR,IAAI,EAAE;KACN,KAAK,EAAE,CAAC","sourcesContent":["#!/usr/bin/env node\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { startCommand } from './commands/start';\nimport { stopCommand } from './commands/stop';\nimport { statusCommand } from './commands/status';\nimport { logsCommand } from './commands/logs';\nimport { authCommand } from './commands/auth';\nimport { configCommand } from './commands/config';\nimport { importCommand } from './commands/import';\n\nyargs(hideBin(process.argv))\n .scriptName('xpod')\n .usage('$0 <command> [options]')\n .command(startCommand)\n .command(stopCommand)\n .command(statusCommand)\n .command(logsCommand)\n .command(authCommand)\n .command(configCommand)\n .command(importCommand)\n .demandCommand(1, 'Please specify a command')\n .strict()\n .help()\n .parse();\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;AACA,kDAA0B;AAC1B,2CAAwC;AACxC,4CAAgD;AAChD,0CAA8C;AAC9C,8CAAkD;AAClD,0CAA8C;AAC9C,0CAA8C;AAC9C,8CAAkD;AAClD,8CAAkD;AAClD,wCAA4C;AAC5C,gDAAoD;AACpD,8CAAkE;AAClE,8CAAkD;AAElD,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KACzB,UAAU,CAAC,MAAM,CAAC;KAClB,KAAK,CAAC,wBAAwB,CAAC;KAC/B,OAAO,CAAC,oBAAY,CAAC;KACrB,OAAO,CAAC,kBAAW,CAAC;KACpB,OAAO,CAAC,sBAAa,CAAC;KACtB,OAAO,CAAC,kBAAW,CAAC;KACpB,OAAO,CAAC,kBAAW,CAAC;KACpB,OAAO,CAAC,sBAAa,CAAC;KACtB,OAAO,CAAC,sBAAa,CAAC;KACtB,OAAO,CAAC,gBAAU,CAAC;KACnB,OAAO,CAAC,wBAAc,CAAC;KACvB,OAAO,CAAC,sBAAa,CAAC;KACtB,OAAO,CAAC,uBAAc,CAAC;KACvB,OAAO,CAAC,sBAAa,CAAC;KACtB,aAAa,CAAC,CAAC,EAAE,0BAA0B,CAAC;KAC5C,MAAM,EAAE;KACR,IAAI,EAAE;KACN,KAAK,EAAE,CAAC","sourcesContent":["#!/usr/bin/env node\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { startCommand } from './commands/start';\nimport { stopCommand } from './commands/stop';\nimport { statusCommand } from './commands/status';\nimport { logsCommand } from './commands/logs';\nimport { authCommand } from './commands/auth';\nimport { configCommand } from './commands/config';\nimport { importCommand } from './commands/import';\nimport { podCommand } from './commands/pod';\nimport { accountCommand } from './commands/account';\nimport { backupCommand, restoreCommand } from './commands/backup';\nimport { doctorCommand } from './commands/doctor';\n\nyargs(hideBin(process.argv))\n .scriptName('xpod')\n .usage('$0 <command> [options]')\n .command(startCommand)\n .command(stopCommand)\n .command(statusCommand)\n .command(logsCommand)\n .command(authCommand)\n .command(configCommand)\n .command(importCommand)\n .command(podCommand)\n .command(accountCommand)\n .command(backupCommand)\n .command(restoreCommand)\n .command(doctorCommand)\n .demandCommand(1, 'Please specify a command')\n .strict()\n .help()\n .parse();\n"]}
@@ -0,0 +1,17 @@
1
+ export interface StoredConfig {
2
+ url: string;
3
+ webId: string;
4
+ }
5
+ export interface StoredSecrets {
6
+ clientId: string;
7
+ clientSecret: string;
8
+ }
9
+ export interface StoredCredentials extends StoredConfig, StoredSecrets {
10
+ }
11
+ export declare function getConfigPath(): string;
12
+ export declare function getSecretsPath(): string;
13
+ export declare function saveCredentials(creds: StoredCredentials): void;
14
+ export declare function loadConfig(): StoredConfig | null;
15
+ export declare function loadSecrets(): StoredSecrets | null;
16
+ export declare function loadCredentials(): StoredCredentials | null;
17
+ export declare function clearCredentials(): void;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getConfigPath = getConfigPath;
4
+ exports.getSecretsPath = getSecretsPath;
5
+ exports.saveCredentials = saveCredentials;
6
+ exports.loadConfig = loadConfig;
7
+ exports.loadSecrets = loadSecrets;
8
+ exports.loadCredentials = loadCredentials;
9
+ exports.clearCredentials = clearCredentials;
10
+ /**
11
+ * CLI credential storage split into two files:
12
+ *
13
+ * ~/.xpod/config.json — base config (url, webId), chmod 644
14
+ * ~/.xpod/secrets.json — secrets (clientId, clientSecret), chmod 600
15
+ */
16
+ const fs_1 = require("fs");
17
+ const path_1 = require("path");
18
+ const os_1 = require("os");
19
+ function xpodDir() {
20
+ return (0, path_1.join)((0, os_1.homedir)(), '.xpod');
21
+ }
22
+ function getConfigPath() {
23
+ return (0, path_1.join)(xpodDir(), 'config.json');
24
+ }
25
+ function getSecretsPath() {
26
+ return (0, path_1.join)(xpodDir(), 'secrets.json');
27
+ }
28
+ function saveCredentials(creds) {
29
+ const dir = xpodDir();
30
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
31
+ const configPath = getConfigPath();
32
+ (0, fs_1.writeFileSync)(configPath, JSON.stringify({ url: creds.url, webId: creds.webId }, null, 2) + '\n', 'utf-8');
33
+ (0, fs_1.chmodSync)(configPath, 0o644);
34
+ const secretsPath = getSecretsPath();
35
+ (0, fs_1.writeFileSync)(secretsPath, JSON.stringify({ clientId: creds.clientId, clientSecret: creds.clientSecret }, null, 2) + '\n', 'utf-8');
36
+ (0, fs_1.chmodSync)(secretsPath, 0o600);
37
+ }
38
+ function readJson(filePath) {
39
+ try {
40
+ return JSON.parse((0, fs_1.readFileSync)(filePath, 'utf-8'));
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ function loadConfig() {
47
+ const data = readJson(getConfigPath());
48
+ if (data && typeof data.url === 'string' && typeof data.webId === 'string') {
49
+ return { url: data.url, webId: data.webId };
50
+ }
51
+ return null;
52
+ }
53
+ function loadSecrets() {
54
+ const data = readJson(getSecretsPath());
55
+ if (data && typeof data.clientId === 'string' && typeof data.clientSecret === 'string') {
56
+ return { clientId: data.clientId, clientSecret: data.clientSecret };
57
+ }
58
+ return null;
59
+ }
60
+ function loadCredentials() {
61
+ const config = loadConfig();
62
+ const secrets = loadSecrets();
63
+ if (!config || !secrets)
64
+ return null;
65
+ return { ...config, ...secrets };
66
+ }
67
+ function clearCredentials() {
68
+ for (const p of [getConfigPath(), getSecretsPath()]) {
69
+ if ((0, fs_1.existsSync)(p))
70
+ (0, fs_1.unlinkSync)(p);
71
+ }
72
+ }
73
+ //# sourceMappingURL=credentials-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials-store.js","sourceRoot":"","sources":["../../../src/cli/lib/credentials-store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CLI credential storage split into two files:\n *\n * ~/.xpod/config.json — base config (url, webId), chmod 644\n * ~/.xpod/secrets.json — secrets (clientId, clientSecret), chmod 600\n */\nimport { mkdirSync, writeFileSync, readFileSync, unlinkSync, chmodSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nexport interface StoredConfig {\n url: string;\n webId: string;\n}\n\nexport interface StoredSecrets {\n clientId: string;\n clientSecret: string;\n}\n\nexport interface StoredCredentials extends StoredConfig, StoredSecrets {}\n\nfunction xpodDir(): string {\n return join(homedir(), '.xpod');\n}\n\nexport function getConfigPath(): string {\n return join(xpodDir(), 'config.json');\n}\n\nexport function getSecretsPath(): string {\n return join(xpodDir(), 'secrets.json');\n}\n\nexport function saveCredentials(creds: StoredCredentials): void {\n const dir = xpodDir();\n mkdirSync(dir, { recursive: true });\n\n const configPath = getConfigPath();\n writeFileSync(configPath, JSON.stringify({ url: creds.url, webId: creds.webId }, null, 2) + '\\n', 'utf-8');\n chmodSync(configPath, 0o644);\n\n const secretsPath = getSecretsPath();\n writeFileSync(secretsPath, JSON.stringify({ clientId: creds.clientId, clientSecret: creds.clientSecret }, null, 2) + '\\n', 'utf-8');\n chmodSync(secretsPath, 0o600);\n}\n\nfunction readJson<T>(filePath: string): T | null {\n try {\n return JSON.parse(readFileSync(filePath, 'utf-8')) as T;\n } catch {\n return null;\n }\n}\n\nexport function loadConfig(): StoredConfig | null {\n const data = readJson<Record<string, unknown>>(getConfigPath());\n if (data && typeof data.url === 'string' && typeof data.webId === 'string') {\n return { url: data.url, webId: data.webId };\n }\n return null;\n}\n\nexport function loadSecrets(): StoredSecrets | null {\n const data = readJson<Record<string, unknown>>(getSecretsPath());\n if (data && typeof data.clientId === 'string' && typeof data.clientSecret === 'string') {\n return { clientId: data.clientId, clientSecret: data.clientSecret };\n }\n return null;\n}\n\nexport function loadCredentials(): StoredCredentials | null {\n const config = loadConfig();\n const secrets = loadSecrets();\n if (!config || !secrets) return null;\n return { ...config, ...secrets };\n}\n\nexport function clearCredentials(): void {\n for (const p of [getConfigPath(), getSecretsPath()]) {\n if (existsSync(p)) unlinkSync(p);\n }\n}\n"]}
@@ -8,6 +8,12 @@ export interface AccountControls {
8
8
  clientCredentials?: string;
9
9
  webId?: string[];
10
10
  }
11
+ export interface AccountData {
12
+ controls: AccountControls;
13
+ pods: Record<string, string>;
14
+ webIds: Record<string, string>;
15
+ clientCredentials: Record<string, string>;
16
+ }
11
17
  export interface ClientCredential {
12
18
  id: string;
13
19
  secret?: string;
@@ -26,6 +32,17 @@ export declare function login(email: string, password: string, baseUrl?: string)
26
32
  * Fetch account controls (endpoints for pod/credential management).
27
33
  */
28
34
  export declare function getAccountControls(token: string, baseUrl?: string): Promise<AccountControls | null>;
35
+ /**
36
+ * Fetch full account data including pods, webIds, and credentials.
37
+ */
38
+ export declare function getAccountData(token: string, baseUrl?: string): Promise<AccountData | null>;
39
+ /**
40
+ * Create a new pod for the account.
41
+ */
42
+ export declare function createPod(token: string, podEndpoint: string, podName: string): Promise<{
43
+ podUrl: string;
44
+ webId: string;
45
+ } | null>;
29
46
  /**
30
47
  * Create a new client credential bound to a WebID.
31
48
  */
@@ -8,6 +8,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.checkServer = checkServer;
9
9
  exports.login = login;
10
10
  exports.getAccountControls = getAccountControls;
11
+ exports.getAccountData = getAccountData;
12
+ exports.createPod = createPod;
11
13
  exports.createClientCredentials = createClientCredentials;
12
14
  exports.listClientCredentials = listClientCredentials;
13
15
  exports.revokeClientCredential = revokeClientCredential;
@@ -76,6 +78,60 @@ async function getAccountControls(token, baseUrl) {
76
78
  return null;
77
79
  }
78
80
  }
81
+ /**
82
+ * Fetch full account data including pods, webIds, and credentials.
83
+ */
84
+ async function getAccountData(token, baseUrl) {
85
+ const base = resolveBaseUrl(baseUrl);
86
+ try {
87
+ const res = await fetch(`${base}.account/`, {
88
+ headers: {
89
+ Accept: 'application/json',
90
+ Authorization: `CSS-Account-Token ${token}`,
91
+ },
92
+ });
93
+ if (!res.ok)
94
+ return null;
95
+ const data = (await res.json());
96
+ return {
97
+ controls: {
98
+ pod: data.controls?.account?.pod,
99
+ clientCredentials: data.controls?.account?.clientCredentials,
100
+ },
101
+ pods: data.pods ?? {},
102
+ webIds: data.webIds ?? {},
103
+ clientCredentials: data.clientCredentials ?? {},
104
+ };
105
+ }
106
+ catch {
107
+ return null;
108
+ }
109
+ }
110
+ /**
111
+ * Create a new pod for the account.
112
+ */
113
+ async function createPod(token, podEndpoint, podName) {
114
+ try {
115
+ const res = await fetch(podEndpoint, {
116
+ method: 'POST',
117
+ headers: {
118
+ 'Content-Type': 'application/json',
119
+ Accept: 'application/json',
120
+ Authorization: `CSS-Account-Token ${token}`,
121
+ },
122
+ body: JSON.stringify({ name: podName }),
123
+ });
124
+ if (!res.ok)
125
+ return null;
126
+ const data = (await res.json());
127
+ if (!data.pod || !data.webId)
128
+ return null;
129
+ return { podUrl: data.pod, webId: data.webId };
130
+ }
131
+ catch {
132
+ return null;
133
+ }
134
+ }
79
135
  /**
80
136
  * Create a new client credential bound to a WebID.
81
137
  */