@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
@@ -1,320 +1,257 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.configCommand = void 0;
3
+ exports.configCommand = exports.PROVIDER_BASE_URLS = exports.UDFS_NS = void 0;
4
+ exports.maskSecret = maskSecret;
5
+ exports.credentialId = credentialId;
6
+ exports.buildProviderSparql = buildProviderSparql;
7
+ exports.buildCredentialSparql = buildCredentialSparql;
8
+ exports.buildResetSparql = buildResetSparql;
9
+ const credentials_store_1 = require("../lib/credentials-store");
10
+ const solid_auth_1 = require("../lib/solid-auth");
27
11
  /**
28
- * Config 子命令通过 Solid 协议读写 Pod 内的配置。
12
+ * Config 子命令:配置 SecretaryAI 使用的 AI 服务。
29
13
  *
30
- * 当前实现使用 CSS Account Token + 内部 API 代理来操作 Pod 数据。
31
- * 后续 PR 可切换为 DPoP token + 直接 Solid 协议访问。
14
+ * 写入 Pod 的两个资源,与服务端 PodChatKitStore.getAiConfig() 对齐:
15
+ * /settings/ai/providers.ttl#{provider} — Provider (baseUrl, displayName)
16
+ * /settings/credentials.ttl#cred-{provider} — Credential (apiKey, service=ai, status=active, provider link)
32
17
  *
33
- * 配置路径映射:
34
- * ai.openai.api-key → /settings/credentials.ttl service=ai, provider openai apiKey 字段
35
- * ai.openai.base-url 同上的 baseUrl 字段
18
+ * 用法:
19
+ * xpod config set --provider openai --model gpt-4o --api-key sk-xxx
20
+ * xpod config set --api-key sk-new-key # 更新已有 provider 的 key
21
+ * xpod config show
22
+ * xpod config reset
36
23
  */
37
- // Key path → credential field mapping
38
- const FIELD_MAP = {
39
- 'api-key': 'apiKey',
40
- 'base-url': 'baseUrl',
41
- 'proxy-url': 'proxyUrl',
42
- 'project-id': 'projectId',
43
- 'organization-id': 'organizationId',
44
- 'label': 'label',
24
+ exports.UDFS_NS = 'https://undefineds.co/ns#';
25
+ /** provider name → default baseUrl */
26
+ exports.PROVIDER_BASE_URLS = {
27
+ openai: 'https://api.openai.com/v1',
28
+ google: 'https://generativelanguage.googleapis.com/v1beta/openai',
29
+ anthropic: 'https://api.anthropic.com/v1',
30
+ deepseek: 'https://api.deepseek.com/v1',
31
+ openrouter: 'https://openrouter.ai/api/v1',
32
+ ollama: 'http://localhost:11434/v1',
33
+ mistral: 'https://api.mistral.ai/v1',
34
+ cohere: 'https://api.cohere.ai/v1',
35
+ zhipu: 'https://open.bigmodel.cn/api/paas/v4',
45
36
  };
46
- function parseConfigKey(key) {
47
- // e.g. ai.openai.api-key → service=ai, provider=openai, field=apiKey
48
- const parts = key.split('.');
49
- if (parts.length < 3)
50
- return null;
51
- const [service, provider, ...rest] = parts;
52
- const fieldKey = rest.join('.');
53
- const field = FIELD_MAP[fieldKey];
54
- if (!field)
55
- return null;
56
- return { service, provider, field };
57
- }
58
37
  function maskSecret(value) {
59
38
  if (value.length <= 8)
60
39
  return '****';
61
40
  return value.slice(0, 4) + '****' + value.slice(-4);
62
41
  }
63
- async function getAuthToken(email, password, baseUrl) {
64
- const { login } = await Promise.resolve().then(() => __importStar(require('../lib/css-account')));
65
- const { checkServer } = await Promise.resolve().then(() => __importStar(require('../lib/css-account')));
66
- if (!(await checkServer(baseUrl))) {
67
- console.error(`Cannot reach server at ${baseUrl}`);
42
+ function credentialId(provider) {
43
+ return `cred-${provider.toLowerCase()}`;
44
+ }
45
+ async function resolveAuth(argv) {
46
+ const creds = (0, credentials_store_1.loadCredentials)();
47
+ if (!creds) {
48
+ console.error('No credentials found. Run `xpod auth create-credentials` first.');
68
49
  process.exit(1);
69
50
  }
70
- const token = await login(email, password, baseUrl);
71
- if (!token) {
72
- console.error('Login failed. Check email/password.');
51
+ const baseUrl = (argv.url ?? creds.url).replace(/\/?$/, '/');
52
+ const tokenResult = await (0, solid_auth_1.getAccessToken)(creds.clientId, creds.clientSecret, baseUrl);
53
+ if (!tokenResult) {
54
+ console.error('Failed to obtain access token. Credentials may be expired — run `xpod auth create-credentials` again.');
73
55
  process.exit(1);
74
56
  }
75
- return token;
57
+ const webIdUrl = new URL(creds.webId);
58
+ const pathParts = webIdUrl.pathname.split('/').filter(Boolean);
59
+ const podUrl = `${webIdUrl.origin}/${pathParts[0]}/`;
60
+ return { accessToken: tokenResult.accessToken, podUrl };
76
61
  }
77
62
  /**
78
- * Read credentials from Pod via SPARQL through the API server.
79
- * Uses the /v1/pod/sparql endpoint which proxies SPARQL queries to the Pod.
63
+ * Build SPARQL UPDATE to upsert a Provider at /settings/ai/providers.ttl#{id}
80
64
  */
81
- async function readCredentials(baseUrl, token) {
82
- // Use the CSS account token to read the credentials resource directly
83
- const credUrl = `${baseUrl}.account/`;
84
- const accountRes = await fetch(credUrl, {
85
- headers: {
86
- Accept: 'application/json',
87
- Authorization: `CSS-Account-Token ${token}`,
88
- },
89
- });
90
- if (!accountRes.ok)
91
- return [];
92
- const accountData = (await accountRes.json());
93
- const pods = accountData.pods;
94
- if (!pods || typeof pods !== 'object')
95
- return [];
96
- // Get the first pod URL
97
- const podUrl = Object.values(pods)[0];
98
- if (!podUrl)
99
- return [];
100
- // Read the credentials.ttl resource from the pod
101
- const settingsUrl = `${podUrl}settings/credentials.ttl`;
102
- const res = await fetch(settingsUrl, {
103
- headers: {
104
- Accept: 'application/json',
105
- Authorization: `CSS-Account-Token ${token}`,
106
- },
107
- });
108
- if (!res.ok)
109
- return [];
110
- try {
111
- const data = await res.json();
112
- if (Array.isArray(data))
113
- return data;
114
- return [];
65
+ function buildProviderSparql(resourceUrl, providerId) {
66
+ const baseUrl = exports.PROVIDER_BASE_URLS[providerId.toLowerCase()];
67
+ const displayName = providerId.charAt(0).toUpperCase() + providerId.slice(1);
68
+ const subject = `<${resourceUrl}#${providerId}>`;
69
+ return `PREFIX udfs: <${exports.UDFS_NS}>
70
+ DELETE { ${subject} udfs:baseUrl ?oldBase . ${subject} udfs:displayName ?oldName }
71
+ INSERT { ${subject} a udfs:Provider ; udfs:displayName "${displayName}"${baseUrl ? ` ; udfs:baseUrl "${baseUrl}"` : ''} }
72
+ WHERE { OPTIONAL { ${subject} udfs:baseUrl ?oldBase } OPTIONAL { ${subject} udfs:displayName ?oldName } }`;
73
+ }
74
+ /**
75
+ * Build SPARQL UPDATE to upsert a Credential at /settings/credentials.ttl#cred-{provider}
76
+ */
77
+ function buildCredentialSparql(resourceUrl, podUrl, provider, fields) {
78
+ const credId = credentialId(provider);
79
+ const subject = `<${resourceUrl}#${credId}>`;
80
+ const providerUri = `<${podUrl}settings/ai/providers.ttl#${provider}>`;
81
+ const deletes = [];
82
+ const inserts = [
83
+ `${subject} a udfs:Credential`,
84
+ `udfs:service "ai"`,
85
+ `udfs:status "active"`,
86
+ `udfs:provider ${providerUri}`,
87
+ ];
88
+ const optionals = [];
89
+ // Always delete+reinsert provider link
90
+ deletes.push(`${subject} udfs:provider ?oldProv .`);
91
+ optionals.push(`OPTIONAL { ${subject} udfs:provider ?oldProv }`);
92
+ if (fields.apiKey) {
93
+ deletes.push(`${subject} udfs:apiKey ?oldKey .`);
94
+ optionals.push(`OPTIONAL { ${subject} udfs:apiKey ?oldKey }`);
95
+ inserts.push(`udfs:apiKey "${fields.apiKey}"`);
115
96
  }
116
- catch {
117
- return [];
97
+ if (fields.model) {
98
+ deletes.push(`${subject} udfs:defaultModel ?oldModel .`);
99
+ optionals.push(`OPTIONAL { ${subject} udfs:defaultModel ?oldModel }`);
100
+ inserts.push(`udfs:defaultModel "${fields.model}"`);
118
101
  }
102
+ return `PREFIX udfs: <${exports.UDFS_NS}>
103
+ DELETE { ${deletes.join(' ')} }
104
+ INSERT { ${inserts.join(' ;\n ')} }
105
+ WHERE { ${optionals.join(' ')} }`;
106
+ }
107
+ /**
108
+ * Build SPARQL UPDATE to delete a Credential
109
+ */
110
+ function buildResetSparql(resourceUrl, provider) {
111
+ const credId = credentialId(provider);
112
+ const subject = `<${resourceUrl}#${credId}>`;
113
+ return `PREFIX udfs: <${exports.UDFS_NS}>\nDELETE WHERE { ${subject} ?p ?o }`;
114
+ }
115
+ async function writeProvider(podUrl, accessToken, providerId) {
116
+ const resource = `${podUrl}settings/ai/providers.ttl`;
117
+ const sparql = buildProviderSparql(resource, providerId);
118
+ const res = await (0, solid_auth_1.authenticatedFetch)(resource, accessToken, {
119
+ method: 'PATCH',
120
+ headers: { 'Content-Type': 'application/sparql-update' },
121
+ body: sparql,
122
+ });
123
+ return res.ok;
124
+ }
125
+ async function writeCredential(podUrl, accessToken, provider, fields) {
126
+ const resource = `${podUrl}settings/credentials.ttl`;
127
+ const sparql = buildCredentialSparql(resource, podUrl, provider, fields);
128
+ const res = await (0, solid_auth_1.authenticatedFetch)(resource, accessToken, {
129
+ method: 'PATCH',
130
+ headers: { 'Content-Type': 'application/sparql-update' },
131
+ body: sparql,
132
+ });
133
+ return res.ok;
119
134
  }
120
135
  const setCommand = {
121
- command: 'set <key> <value>',
122
- describe: 'Set a Pod configuration value',
136
+ command: 'set',
137
+ describe: 'Configure SecretaryAI (provider, model, api-key — one or more)',
123
138
  builder: (yargs) => yargs
124
- .positional('key', { type: 'string', demandOption: true, description: 'Config key (e.g. ai.openai.api-key)' })
125
- .positional('value', { type: 'string', demandOption: true, description: 'Config value' }),
126
- handler: async (argv) => {
127
- const parsed = parseConfigKey(argv.key);
128
- if (!parsed) {
129
- console.error(`Invalid config key: ${argv.key}`);
130
- console.error('Format: <service>.<provider>.<field>');
131
- console.error('Fields: api-key, base-url, proxy-url, project-id, organization-id, label');
132
- process.exit(1);
139
+ .option('provider', { type: 'string', description: `AI provider (${Object.keys(exports.PROVIDER_BASE_URLS).join(', ')})` })
140
+ .option('model', { type: 'string', description: 'Default model name' })
141
+ .option('api-key', { type: 'string', description: 'API key' })
142
+ .check((argv) => {
143
+ if (!argv.provider && !argv.model && !argv['api-key']) {
144
+ throw new Error('Specify at least one of --provider, --model, or --api-key');
133
145
  }
134
- const baseUrl = argv.url.endsWith('/') ? argv.url : `${argv.url}/`;
135
- const token = await getAuthToken(argv.email, argv.password, baseUrl);
136
- // Get account info to find pod URL
137
- const accountRes = await fetch(`${baseUrl}.account/`, {
138
- headers: {
139
- Accept: 'application/json',
140
- Authorization: `CSS-Account-Token ${token}`,
141
- },
142
- });
143
- if (!accountRes.ok) {
144
- console.error('Failed to get account info.');
145
- process.exit(1);
146
+ if ((argv.model || argv['api-key']) && !argv.provider) {
147
+ throw new Error('--provider is required when setting --model or --api-key');
146
148
  }
147
- const accountData = (await accountRes.json());
148
- const pods = accountData.pods;
149
- const podUrl = pods ? Object.values(pods)[0] : undefined;
150
- if (!podUrl) {
151
- console.error('No pod found for this account.');
149
+ return true;
150
+ }),
151
+ handler: async (argv) => {
152
+ const { accessToken, podUrl } = await resolveAuth(argv);
153
+ const provider = argv.provider;
154
+ // Write provider
155
+ const provOk = await writeProvider(podUrl, accessToken, provider);
156
+ if (!provOk) {
157
+ console.error('Failed to write provider config.');
152
158
  process.exit(1);
153
159
  }
154
- // Build SPARQL UPDATE to insert/update the credential
155
- const credId = `cred-${parsed.provider}`;
156
- const ns = 'http://undefineds.co/ns/';
157
- const subject = `<${podUrl}settings/credentials.ttl#${credId}>`;
158
- const sparql = `
159
- PREFIX udfs: <${ns}>
160
- DELETE { ${subject} udfs:${parsed.field} ?old }
161
- INSERT { ${subject} a udfs:Credential ;
162
- udfs:service "${parsed.service}" ;
163
- udfs:${parsed.field} "${argv.value}" }
164
- WHERE { OPTIONAL { ${subject} udfs:${parsed.field} ?old } }
165
- `.trim();
166
- const patchUrl = `${podUrl}settings/credentials.ttl`;
167
- const patchRes = await fetch(patchUrl, {
168
- method: 'PATCH',
169
- headers: {
170
- 'Content-Type': 'application/sparql-update',
171
- Authorization: `CSS-Account-Token ${token}`,
172
- },
173
- body: sparql,
160
+ // Write credential
161
+ const credOk = await writeCredential(podUrl, accessToken, provider, {
162
+ apiKey: argv['api-key'],
163
+ model: argv.model,
174
164
  });
175
- if (patchRes.ok) {
176
- const isSensitive = parsed.field === 'apiKey';
177
- const display = isSensitive ? maskSecret(argv.value) : argv.value;
178
- console.log(`Set ${argv.key} = ${display}`);
179
- }
180
- else {
181
- const text = await patchRes.text();
182
- console.error(`Failed to set config: ${patchRes.status} ${text.slice(0, 200)}`);
165
+ if (!credOk) {
166
+ console.error('Failed to write credential config.');
183
167
  process.exit(1);
184
168
  }
169
+ console.log(` provider: ${provider}`);
170
+ if (argv.model)
171
+ console.log(` model: ${argv.model}`);
172
+ if (argv['api-key'])
173
+ console.log(` api-key: ${maskSecret(argv['api-key'])}`);
174
+ console.log('SecretaryAI config saved.');
185
175
  },
186
176
  };
187
- const getCommand = {
188
- command: 'get <key>',
189
- describe: 'Get Pod configuration (masked for secrets)',
190
- builder: (yargs) => yargs
191
- .positional('key', { type: 'string', demandOption: true, description: 'Config key prefix (e.g. ai)' }),
177
+ const showCommand = {
178
+ command: 'show',
179
+ describe: 'Show current SecretaryAI config',
180
+ builder: (yargs) => yargs,
192
181
  handler: async (argv) => {
193
- const baseUrl = argv.url.endsWith('/') ? argv.url : `${argv.url}/`;
194
- const token = await getAuthToken(argv.email, argv.password, baseUrl);
195
- const creds = await readCredentials(baseUrl, token);
196
- if (creds.length === 0) {
197
- console.log('No credentials configured.');
198
- return;
199
- }
200
- // Filter by key prefix
201
- const prefix = argv.key.toLowerCase();
202
- const filtered = creds.filter((c) => {
203
- const service = (c.service ?? '').toLowerCase();
204
- return service.startsWith(prefix) || prefix === 'all';
182
+ const { accessToken, podUrl } = await resolveAuth(argv);
183
+ const resource = `${podUrl}settings/credentials.ttl`;
184
+ const res = await (0, solid_auth_1.authenticatedFetch)(resource, accessToken, {
185
+ headers: { Accept: 'text/turtle' },
205
186
  });
206
- if (filtered.length === 0) {
207
- console.log(`No credentials matching "${argv.key}".`);
187
+ if (!res.ok) {
188
+ console.log('No SecretaryAI config found. Use `xpod config set --provider openai --api-key sk-xxx` to configure.');
208
189
  return;
209
190
  }
210
- for (const c of filtered) {
211
- console.log(`[${c.service ?? 'unknown'}] ${c.label ?? c.id ?? 'unnamed'}`);
212
- if (c.apiKey)
213
- console.log(` api-key: ${maskSecret(c.apiKey)}`);
214
- if (c.baseUrl)
215
- console.log(` base-url: ${c.baseUrl}`);
216
- if (c.proxyUrl)
217
- console.log(` proxy: ${c.proxyUrl}`);
218
- }
219
- },
220
- };
221
- const listConfigCommand = {
222
- command: 'list',
223
- describe: 'List all Pod configurations',
224
- builder: (yargs) => yargs,
225
- handler: async (argv) => {
226
- const baseUrl = argv.url.endsWith('/') ? argv.url : `${argv.url}/`;
227
- const token = await getAuthToken(argv.email, argv.password, baseUrl);
228
- const creds = await readCredentials(baseUrl, token);
229
- if (creds.length === 0) {
230
- console.log('No credentials configured.');
231
- return;
191
+ const turtle = await res.text();
192
+ // Parse simple triples from turtle to find AI credentials
193
+ const credBlocks = turtle.split(/(?=<[^>]*#cred-)/);
194
+ let found = false;
195
+ for (const block of credBlocks) {
196
+ if (!block.includes('service') || !block.includes('"ai"'))
197
+ continue;
198
+ found = true;
199
+ const providerMatch = block.match(/providers\.ttl#(\w+)/);
200
+ const apiKeyMatch = block.match(/apiKey\s+"([^"]+)"/);
201
+ const modelMatch = block.match(/defaultModel\s+"([^"]+)"/);
202
+ if (providerMatch)
203
+ console.log(` provider: ${providerMatch[1]}`);
204
+ if (modelMatch)
205
+ console.log(` model: ${modelMatch[1]}`);
206
+ if (apiKeyMatch)
207
+ console.log(` api-key: ${maskSecret(apiKeyMatch[1])}`);
232
208
  }
233
- for (const c of creds) {
234
- console.log(`[${c.service ?? 'unknown'}] ${c.label ?? c.id ?? 'unnamed'}`);
235
- if (c.apiKey)
236
- console.log(` api-key: ${maskSecret(c.apiKey)}`);
237
- if (c.baseUrl)
238
- console.log(` base-url: ${c.baseUrl}`);
239
- if (c.proxyUrl)
240
- console.log(` proxy: ${c.proxyUrl}`);
241
- console.log();
209
+ if (!found) {
210
+ console.log('No SecretaryAI config found. Use `xpod config set --provider openai --api-key sk-xxx` to configure.');
242
211
  }
243
212
  },
244
213
  };
245
- const unsetCommand = {
246
- command: 'unset <key>',
247
- describe: 'Remove a Pod configuration',
248
- builder: (yargs) => yargs
249
- .positional('key', { type: 'string', demandOption: true, description: 'Config key prefix to remove (e.g. ai.openai)' }),
214
+ const resetCommand = {
215
+ command: 'reset',
216
+ describe: 'Remove SecretaryAI config',
217
+ builder: (yargs) => yargs.option('provider', {
218
+ type: 'string',
219
+ description: 'Provider to remove',
220
+ demandOption: true,
221
+ }),
250
222
  handler: async (argv) => {
251
- const parts = argv.key.split('.');
252
- if (parts.length < 2) {
253
- console.error('Format: <service>.<provider>');
254
- process.exit(1);
255
- }
256
- const [, provider] = parts;
257
- const baseUrl = argv.url.endsWith('/') ? argv.url : `${argv.url}/`;
258
- const token = await getAuthToken(argv.email, argv.password, baseUrl);
259
- // Get pod URL
260
- const accountRes = await fetch(`${baseUrl}.account/`, {
261
- headers: {
262
- Accept: 'application/json',
263
- Authorization: `CSS-Account-Token ${token}`,
264
- },
265
- });
266
- if (!accountRes.ok) {
267
- console.error('Failed to get account info.');
268
- process.exit(1);
269
- }
270
- const accountData = (await accountRes.json());
271
- const pods = accountData.pods;
272
- const podUrl = pods ? Object.values(pods)[0] : undefined;
273
- if (!podUrl) {
274
- console.error('No pod found for this account.');
275
- process.exit(1);
276
- }
277
- const credId = `cred-${provider}`;
278
- const subject = `<${podUrl}settings/credentials.ttl#${credId}>`;
279
- const sparql = `DELETE WHERE { ${subject} ?p ?o }`;
280
- const patchUrl = `${podUrl}settings/credentials.ttl`;
281
- const patchRes = await fetch(patchUrl, {
223
+ const { accessToken, podUrl } = await resolveAuth(argv);
224
+ const provider = argv.provider;
225
+ const resource = `${podUrl}settings/credentials.ttl`;
226
+ const sparql = buildResetSparql(resource, provider);
227
+ const res = await (0, solid_auth_1.authenticatedFetch)(resource, accessToken, {
282
228
  method: 'PATCH',
283
- headers: {
284
- 'Content-Type': 'application/sparql-update',
285
- Authorization: `CSS-Account-Token ${token}`,
286
- },
229
+ headers: { 'Content-Type': 'application/sparql-update' },
287
230
  body: sparql,
288
231
  });
289
- if (patchRes.ok) {
290
- console.log(`Removed config for ${argv.key}`);
232
+ if (res.ok) {
233
+ console.log(`SecretaryAI config for ${provider} removed.`);
291
234
  }
292
235
  else {
293
- const text = await patchRes.text();
294
- console.error(`Failed to unset config: ${patchRes.status} ${text.slice(0, 200)}`);
236
+ const text = await res.text();
237
+ console.error(`Failed to reset config: ${res.status} ${text.slice(0, 200)}`);
295
238
  process.exit(1);
296
239
  }
297
240
  },
298
241
  };
299
242
  exports.configCommand = {
300
243
  command: 'config',
301
- describe: 'Pod configuration management',
244
+ describe: 'SecretaryAI configuration (provider, model, api-key)',
302
245
  builder: (yargs) => yargs
303
246
  .option('url', {
304
247
  alias: 'u',
305
248
  type: 'string',
306
- description: 'Server base URL',
307
- default: process.env.CSS_BASE_URL || 'http://localhost:3000',
249
+ description: 'Server base URL (default: from ~/.xpod/)',
308
250
  })
309
- .option('email', { type: 'string', demandOption: true, description: 'Account email' })
310
- .option('password', { type: 'string', demandOption: true, description: 'Account password' })
311
251
  .command(setCommand)
312
- .command(getCommand)
313
- .command(listConfigCommand)
314
- .command(unsetCommand)
252
+ .command(showCommand)
253
+ .command(resetCommand)
315
254
  .demandCommand(1, 'Please specify a config subcommand'),
316
- handler: () => {
317
- // parent command, no-op
318
- },
255
+ handler: () => { },
319
256
  };
320
257
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\n\ninterface ConfigArgs {\n url: string;\n email: string;\n password: string;\n}\n\ninterface SetArgs extends ConfigArgs {\n key: string;\n value: string;\n}\n\ninterface GetArgs extends ConfigArgs {\n key: string;\n}\n\ninterface UnsetArgs extends ConfigArgs {\n key: string;\n}\n\n/**\n * Config 子命令通过 Solid 协议读写 Pod 内的配置。\n *\n * 当前实现使用 CSS Account Token + 内部 API 代理来操作 Pod 数据。\n * 后续 PR 可切换为 DPoP token + 直接 Solid 协议访问。\n *\n * 配置路径映射:\n * ai.openai.api-key → /settings/credentials.ttl 中 service=ai, provider 含 openai 的 apiKey 字段\n * ai.openai.base-url → 同上的 baseUrl 字段\n */\n\n// Key path → credential field mapping\nconst FIELD_MAP: Record<string, string> = {\n 'api-key': 'apiKey',\n 'base-url': 'baseUrl',\n 'proxy-url': 'proxyUrl',\n 'project-id': 'projectId',\n 'organization-id': 'organizationId',\n 'label': 'label',\n};\n\nfunction parseConfigKey(key: string): { service: string; provider: string; field: string } | null {\n // e.g. ai.openai.api-key → service=ai, provider=openai, field=apiKey\n const parts = key.split('.');\n if (parts.length < 3) return null;\n const [service, provider, ...rest] = parts;\n const fieldKey = rest.join('.');\n const field = FIELD_MAP[fieldKey];\n if (!field) return null;\n return { service, provider, field };\n}\n\nfunction maskSecret(value: string): string {\n if (value.length <= 8) return '****';\n return value.slice(0, 4) + '****' + value.slice(-4);\n}\n\nasync function getAuthToken(email: string, password: string, baseUrl: string): Promise<string> {\n const { login } = await import('../lib/css-account');\n const { checkServer } = await import('../lib/css-account');\n\n if (!(await checkServer(baseUrl))) {\n console.error(`Cannot reach server at ${baseUrl}`);\n process.exit(1);\n }\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;\n}\n\n/**\n * Read credentials from Pod via SPARQL through the API server.\n * Uses the /v1/pod/sparql endpoint which proxies SPARQL queries to the Pod.\n */\nasync function readCredentials(\n baseUrl: string,\n token: string,\n): Promise<Array<Record<string, string>>> {\n // Use the CSS account token to read the credentials resource directly\n const credUrl = `${baseUrl}.account/`;\n const accountRes = await fetch(credUrl, {\n headers: {\n Accept: 'application/json',\n Authorization: `CSS-Account-Token ${token}`,\n },\n });\n\n if (!accountRes.ok) return [];\n\n const accountData = (await accountRes.json()) as { webIds?: Record<string, string>; pods?: Record<string, string> };\n const pods = accountData.pods;\n if (!pods || typeof pods !== 'object') return [];\n\n // Get the first pod URL\n const podUrl = Object.values(pods)[0];\n if (!podUrl) return [];\n\n // Read the credentials.ttl resource from the pod\n const settingsUrl = `${podUrl}settings/credentials.ttl`;\n const res = await fetch(settingsUrl, {\n headers: {\n Accept: 'application/json',\n Authorization: `CSS-Account-Token ${token}`,\n },\n });\n\n if (!res.ok) return [];\n\n try {\n const data = await res.json();\n if (Array.isArray(data)) return data as Array<Record<string, string>>;\n return [];\n } catch {\n return [];\n }\n}\n\nconst setCommand: CommandModule<ConfigArgs, SetArgs> = {\n command: 'set <key> <value>',\n describe: 'Set a Pod configuration value',\n builder: (yargs) =>\n yargs\n .positional('key', { type: 'string', demandOption: true, description: 'Config key (e.g. ai.openai.api-key)' })\n .positional('value', { type: 'string', demandOption: true, description: 'Config value' }),\n handler: async (argv) => {\n const parsed = parseConfigKey(argv.key);\n if (!parsed) {\n console.error(`Invalid config key: ${argv.key}`);\n console.error('Format: <service>.<provider>.<field>');\n console.error('Fields: api-key, base-url, proxy-url, project-id, organization-id, label');\n process.exit(1);\n }\n\n const baseUrl = argv.url.endsWith('/') ? argv.url : `${argv.url}/`;\n const token = await getAuthToken(argv.email, argv.password, baseUrl);\n\n // Get account info to find pod URL\n const accountRes = await fetch(`${baseUrl}.account/`, {\n headers: {\n Accept: 'application/json',\n Authorization: `CSS-Account-Token ${token}`,\n },\n });\n\n if (!accountRes.ok) {\n console.error('Failed to get account info.');\n process.exit(1);\n }\n\n const accountData = (await accountRes.json()) as { pods?: Record<string, string> };\n const pods = accountData.pods;\n const podUrl = pods ? Object.values(pods)[0] : undefined;\n\n if (!podUrl) {\n console.error('No pod found for this account.');\n process.exit(1);\n }\n\n // Build SPARQL UPDATE to insert/update the credential\n const credId = `cred-${parsed.provider}`;\n const ns = 'http://undefineds.co/ns/';\n const subject = `<${podUrl}settings/credentials.ttl#${credId}>`;\n\n const sparql = `\nPREFIX udfs: <${ns}>\nDELETE { ${subject} udfs:${parsed.field} ?old }\nINSERT { ${subject} a udfs:Credential ;\n udfs:service \"${parsed.service}\" ;\n udfs:${parsed.field} \"${argv.value}\" }\nWHERE { OPTIONAL { ${subject} udfs:${parsed.field} ?old } }\n `.trim();\n\n const patchUrl = `${podUrl}settings/credentials.ttl`;\n const patchRes = await fetch(patchUrl, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/sparql-update',\n Authorization: `CSS-Account-Token ${token}`,\n },\n body: sparql,\n });\n\n if (patchRes.ok) {\n const isSensitive = parsed.field === 'apiKey';\n const display = isSensitive ? maskSecret(argv.value) : argv.value;\n console.log(`Set ${argv.key} = ${display}`);\n } else {\n const text = await patchRes.text();\n console.error(`Failed to set config: ${patchRes.status} ${text.slice(0, 200)}`);\n process.exit(1);\n }\n },\n};\n\nconst getCommand: CommandModule<ConfigArgs, GetArgs> = {\n command: 'get <key>',\n describe: 'Get Pod configuration (masked for secrets)',\n builder: (yargs) =>\n yargs\n .positional('key', { type: 'string', demandOption: true, description: 'Config key prefix (e.g. ai)' }),\n handler: async (argv) => {\n const baseUrl = argv.url.endsWith('/') ? argv.url : `${argv.url}/`;\n const token = await getAuthToken(argv.email, argv.password, baseUrl);\n const creds = await readCredentials(baseUrl, token);\n\n if (creds.length === 0) {\n console.log('No credentials configured.');\n return;\n }\n\n // Filter by key prefix\n const prefix = argv.key.toLowerCase();\n const filtered = creds.filter((c) => {\n const service = (c.service ?? '').toLowerCase();\n return service.startsWith(prefix) || prefix === 'all';\n });\n\n if (filtered.length === 0) {\n console.log(`No credentials matching \"${argv.key}\".`);\n return;\n }\n\n for (const c of filtered) {\n console.log(`[${c.service ?? 'unknown'}] ${c.label ?? c.id ?? 'unnamed'}`);\n if (c.apiKey) console.log(` api-key: ${maskSecret(c.apiKey)}`);\n if (c.baseUrl) console.log(` base-url: ${c.baseUrl}`);\n if (c.proxyUrl) console.log(` proxy: ${c.proxyUrl}`);\n }\n },\n};\n\nconst listConfigCommand: CommandModule<ConfigArgs, ConfigArgs> = {\n command: 'list',\n describe: 'List all Pod configurations',\n builder: (yargs) => yargs,\n handler: async (argv) => {\n const baseUrl = argv.url.endsWith('/') ? argv.url : `${argv.url}/`;\n const token = await getAuthToken(argv.email, argv.password, baseUrl);\n const creds = await readCredentials(baseUrl, token);\n\n if (creds.length === 0) {\n console.log('No credentials configured.');\n return;\n }\n\n for (const c of creds) {\n console.log(`[${c.service ?? 'unknown'}] ${c.label ?? c.id ?? 'unnamed'}`);\n if (c.apiKey) console.log(` api-key: ${maskSecret(c.apiKey)}`);\n if (c.baseUrl) console.log(` base-url: ${c.baseUrl}`);\n if (c.proxyUrl) console.log(` proxy: ${c.proxyUrl}`);\n console.log();\n }\n },\n};\n\nconst unsetCommand: CommandModule<ConfigArgs, UnsetArgs> = {\n command: 'unset <key>',\n describe: 'Remove a Pod configuration',\n builder: (yargs) =>\n yargs\n .positional('key', { type: 'string', demandOption: true, description: 'Config key prefix to remove (e.g. ai.openai)' }),\n handler: async (argv) => {\n const parts = argv.key.split('.');\n if (parts.length < 2) {\n console.error('Format: <service>.<provider>');\n process.exit(1);\n }\n\n const [, provider] = parts;\n const baseUrl = argv.url.endsWith('/') ? argv.url : `${argv.url}/`;\n const token = await getAuthToken(argv.email, argv.password, baseUrl);\n\n // Get pod URL\n const accountRes = await fetch(`${baseUrl}.account/`, {\n headers: {\n Accept: 'application/json',\n Authorization: `CSS-Account-Token ${token}`,\n },\n });\n\n if (!accountRes.ok) {\n console.error('Failed to get account info.');\n process.exit(1);\n }\n\n const accountData = (await accountRes.json()) as { pods?: Record<string, string> };\n const pods = accountData.pods;\n const podUrl = pods ? Object.values(pods)[0] : undefined;\n\n if (!podUrl) {\n console.error('No pod found for this account.');\n process.exit(1);\n }\n\n const credId = `cred-${provider}`;\n const subject = `<${podUrl}settings/credentials.ttl#${credId}>`;\n\n const sparql = `DELETE WHERE { ${subject} ?p ?o }`;\n\n const patchUrl = `${podUrl}settings/credentials.ttl`;\n const patchRes = await fetch(patchUrl, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/sparql-update',\n Authorization: `CSS-Account-Token ${token}`,\n },\n body: sparql,\n });\n\n if (patchRes.ok) {\n console.log(`Removed config for ${argv.key}`);\n } else {\n const text = await patchRes.text();\n console.error(`Failed to unset config: ${patchRes.status} ${text.slice(0, 200)}`);\n process.exit(1);\n }\n },\n};\n\nexport const configCommand: CommandModule<object, ConfigArgs> = {\n command: 'config',\n describe: 'Pod configuration management',\n builder: (yargs) =>\n yargs\n .option('url', {\n alias: 'u',\n type: 'string',\n description: 'Server base URL',\n default: process.env.CSS_BASE_URL || 'http://localhost:3000',\n })\n .option('email', { type: 'string', demandOption: true, description: 'Account email' })\n .option('password', { type: 'string', demandOption: true, description: 'Account password' })\n .command(setCommand)\n .command(getCommand)\n .command(listConfigCommand)\n .command(unsetCommand)\n .demandCommand(1, 'Please specify a config subcommand'),\n handler: () => {\n // parent command, no-op\n },\n};\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport { loadCredentials } from '../lib/credentials-store';\nimport { getAccessToken, authenticatedFetch } from '../lib/solid-auth';\n\ninterface ConfigArgs {\n url?: string;\n}\n\ninterface SetArgs extends ConfigArgs {\n provider?: string;\n model?: string;\n 'api-key'?: string;\n}\n\n/**\n * Config 子命令:配置 SecretaryAI 使用的 AI 服务。\n *\n * 写入 Pod 的两个资源,与服务端 PodChatKitStore.getAiConfig() 对齐:\n * /settings/ai/providers.ttl#{provider} — Provider (baseUrl, displayName)\n * /settings/credentials.ttl#cred-{provider} — Credential (apiKey, service=ai, status=active, provider link)\n *\n * 用法:\n * xpod config set --provider openai --model gpt-4o --api-key sk-xxx\n * xpod config set --api-key sk-new-key # 更新已有 provider 的 key\n * xpod config show\n * xpod config reset\n */\n\nexport const UDFS_NS = 'https://undefineds.co/ns#';\n\n/** provider name → default baseUrl */\nexport const PROVIDER_BASE_URLS: Record<string, string> = {\n openai: 'https://api.openai.com/v1',\n google: 'https://generativelanguage.googleapis.com/v1beta/openai',\n anthropic: 'https://api.anthropic.com/v1',\n deepseek: 'https://api.deepseek.com/v1',\n openrouter: 'https://openrouter.ai/api/v1',\n ollama: 'http://localhost:11434/v1',\n mistral: 'https://api.mistral.ai/v1',\n cohere: 'https://api.cohere.ai/v1',\n zhipu: 'https://open.bigmodel.cn/api/paas/v4',\n};\n\nexport function maskSecret(value: string): string {\n if (value.length <= 8) return '****';\n return value.slice(0, 4) + '****' + value.slice(-4);\n}\n\nexport function credentialId(provider: string): string {\n return `cred-${provider.toLowerCase()}`;\n}\n\nasync function resolveAuth(argv: ConfigArgs): Promise<{ accessToken: string; podUrl: string }> {\n const creds = loadCredentials();\n if (!creds) {\n console.error('No credentials found. Run `xpod auth create-credentials` first.');\n process.exit(1);\n }\n\n const baseUrl = (argv.url ?? creds.url).replace(/\\/?$/, '/');\n\n const tokenResult = await getAccessToken(creds.clientId, creds.clientSecret, baseUrl);\n if (!tokenResult) {\n console.error('Failed to obtain access token. Credentials may be expired — run `xpod auth create-credentials` again.');\n process.exit(1);\n }\n\n const webIdUrl = new URL(creds.webId);\n const pathParts = webIdUrl.pathname.split('/').filter(Boolean);\n const podUrl = `${webIdUrl.origin}/${pathParts[0]}/`;\n\n return { accessToken: tokenResult.accessToken, podUrl };\n}\n\n/**\n * Build SPARQL UPDATE to upsert a Provider at /settings/ai/providers.ttl#{id}\n */\nexport function buildProviderSparql(resourceUrl: string, providerId: string): string {\n const baseUrl = PROVIDER_BASE_URLS[providerId.toLowerCase()];\n const displayName = providerId.charAt(0).toUpperCase() + providerId.slice(1);\n const subject = `<${resourceUrl}#${providerId}>`;\n\n return `PREFIX udfs: <${UDFS_NS}>\nDELETE { ${subject} udfs:baseUrl ?oldBase . ${subject} udfs:displayName ?oldName }\nINSERT { ${subject} a udfs:Provider ; udfs:displayName \"${displayName}\"${baseUrl ? ` ; udfs:baseUrl \"${baseUrl}\"` : ''} }\nWHERE { OPTIONAL { ${subject} udfs:baseUrl ?oldBase } OPTIONAL { ${subject} udfs:displayName ?oldName } }`;\n}\n\n/**\n * Build SPARQL UPDATE to upsert a Credential at /settings/credentials.ttl#cred-{provider}\n */\nexport function buildCredentialSparql(\n resourceUrl: string,\n podUrl: string,\n provider: string,\n fields: { apiKey?: string; model?: string },\n): string {\n const credId = credentialId(provider);\n const subject = `<${resourceUrl}#${credId}>`;\n const providerUri = `<${podUrl}settings/ai/providers.ttl#${provider}>`;\n\n const deletes: string[] = [];\n const inserts: string[] = [\n `${subject} a udfs:Credential`,\n `udfs:service \"ai\"`,\n `udfs:status \"active\"`,\n `udfs:provider ${providerUri}`,\n ];\n const optionals: string[] = [];\n\n // Always delete+reinsert provider link\n deletes.push(`${subject} udfs:provider ?oldProv .`);\n optionals.push(`OPTIONAL { ${subject} udfs:provider ?oldProv }`);\n\n if (fields.apiKey) {\n deletes.push(`${subject} udfs:apiKey ?oldKey .`);\n optionals.push(`OPTIONAL { ${subject} udfs:apiKey ?oldKey }`);\n inserts.push(`udfs:apiKey \"${fields.apiKey}\"`);\n }\n if (fields.model) {\n deletes.push(`${subject} udfs:defaultModel ?oldModel .`);\n optionals.push(`OPTIONAL { ${subject} udfs:defaultModel ?oldModel }`);\n inserts.push(`udfs:defaultModel \"${fields.model}\"`);\n }\n\n return `PREFIX udfs: <${UDFS_NS}>\nDELETE { ${deletes.join(' ')} }\nINSERT { ${inserts.join(' ;\\n ')} }\nWHERE { ${optionals.join(' ')} }`;\n}\n\n/**\n * Build SPARQL UPDATE to delete a Credential\n */\nexport function buildResetSparql(resourceUrl: string, provider: string): string {\n const credId = credentialId(provider);\n const subject = `<${resourceUrl}#${credId}>`;\n return `PREFIX udfs: <${UDFS_NS}>\\nDELETE WHERE { ${subject} ?p ?o }`;\n}\n\nasync function writeProvider(podUrl: string, accessToken: string, providerId: string): Promise<boolean> {\n const resource = `${podUrl}settings/ai/providers.ttl`;\n const sparql = buildProviderSparql(resource, providerId);\n const res = await authenticatedFetch(resource, accessToken, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body: sparql,\n });\n return res.ok;\n}\n\nasync function writeCredential(\n podUrl: string,\n accessToken: string,\n provider: string,\n fields: { apiKey?: string; model?: string },\n): Promise<boolean> {\n const resource = `${podUrl}settings/credentials.ttl`;\n const sparql = buildCredentialSparql(resource, podUrl, provider, fields);\n const res = await authenticatedFetch(resource, accessToken, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body: sparql,\n });\n return res.ok;\n}\n\nconst setCommand: CommandModule<ConfigArgs, SetArgs> = {\n command: 'set',\n describe: 'Configure SecretaryAI (provider, model, api-key — one or more)',\n builder: (yargs) =>\n yargs\n .option('provider', { type: 'string', description: `AI provider (${Object.keys(PROVIDER_BASE_URLS).join(', ')})` })\n .option('model', { type: 'string', description: 'Default model name' })\n .option('api-key', { type: 'string', description: 'API key' })\n .check((argv) => {\n if (!argv.provider && !argv.model && !argv['api-key']) {\n throw new Error('Specify at least one of --provider, --model, or --api-key');\n }\n if ((argv.model || argv['api-key']) && !argv.provider) {\n throw new Error('--provider is required when setting --model or --api-key');\n }\n return true;\n }),\n handler: async (argv) => {\n const { accessToken, podUrl } = await resolveAuth(argv);\n const provider = argv.provider!;\n\n // Write provider\n const provOk = await writeProvider(podUrl, accessToken, provider);\n if (!provOk) {\n console.error('Failed to write provider config.');\n process.exit(1);\n }\n\n // Write credential\n const credOk = await writeCredential(podUrl, accessToken, provider, {\n apiKey: argv['api-key'],\n model: argv.model,\n });\n if (!credOk) {\n console.error('Failed to write credential config.');\n process.exit(1);\n }\n\n console.log(` provider: ${provider}`);\n if (argv.model) console.log(` model: ${argv.model}`);\n if (argv['api-key']) console.log(` api-key: ${maskSecret(argv['api-key'])}`);\n console.log('SecretaryAI config saved.');\n },\n};\n\nconst showCommand: CommandModule<ConfigArgs, ConfigArgs> = {\n command: 'show',\n describe: 'Show current SecretaryAI config',\n builder: (yargs) => yargs,\n handler: async (argv) => {\n const { accessToken, podUrl } = await resolveAuth(argv);\n const resource = `${podUrl}settings/credentials.ttl`;\n const res = await authenticatedFetch(resource, accessToken, {\n headers: { Accept: 'text/turtle' },\n });\n\n if (!res.ok) {\n console.log('No SecretaryAI config found. Use `xpod config set --provider openai --api-key sk-xxx` to configure.');\n return;\n }\n\n const turtle = await res.text();\n // Parse simple triples from turtle to find AI credentials\n const credBlocks = turtle.split(/(?=<[^>]*#cred-)/);\n let found = false;\n for (const block of credBlocks) {\n if (!block.includes('service') || !block.includes('\"ai\"')) continue;\n found = true;\n\n const providerMatch = block.match(/providers\\.ttl#(\\w+)/);\n const apiKeyMatch = block.match(/apiKey\\s+\"([^\"]+)\"/);\n const modelMatch = block.match(/defaultModel\\s+\"([^\"]+)\"/);\n\n if (providerMatch) console.log(` provider: ${providerMatch[1]}`);\n if (modelMatch) console.log(` model: ${modelMatch[1]}`);\n if (apiKeyMatch) console.log(` api-key: ${maskSecret(apiKeyMatch[1])}`);\n }\n\n if (!found) {\n console.log('No SecretaryAI config found. Use `xpod config set --provider openai --api-key sk-xxx` to configure.');\n }\n },\n};\n\nconst resetCommand: CommandModule<ConfigArgs, SetArgs> = {\n command: 'reset',\n describe: 'Remove SecretaryAI config',\n builder: (yargs) =>\n yargs.option('provider', {\n type: 'string',\n description: 'Provider to remove',\n demandOption: true,\n }),\n handler: async (argv) => {\n const { accessToken, podUrl } = await resolveAuth(argv);\n const provider = argv.provider!;\n const resource = `${podUrl}settings/credentials.ttl`;\n const sparql = buildResetSparql(resource, provider);\n\n const res = await authenticatedFetch(resource, accessToken, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body: sparql,\n });\n\n if (res.ok) {\n console.log(`SecretaryAI config for ${provider} removed.`);\n } else {\n const text = await res.text();\n console.error(`Failed to reset config: ${res.status} ${text.slice(0, 200)}`);\n process.exit(1);\n }\n },\n};\n\nexport const configCommand: CommandModule<object, ConfigArgs> = {\n command: 'config',\n describe: 'SecretaryAI configuration (provider, model, api-key)',\n builder: (yargs) =>\n yargs\n .option('url', {\n alias: 'u',\n type: 'string',\n description: 'Server base URL (default: from ~/.xpod/)',\n })\n .command(setCommand)\n .command(showCommand)\n .command(resetCommand)\n .demandCommand(1, 'Please specify a config subcommand'),\n handler: () => {},\n};\n"]}
@@ -0,0 +1,6 @@
1
+ import type { CommandModule } from 'yargs';
2
+ interface DoctorArgs {
3
+ url?: string;
4
+ }
5
+ export declare const doctorCommand: CommandModule<object, DoctorArgs>;
6
+ export {};