@undefineds.co/xpod 0.3.6 → 0.3.15

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 (249) hide show
  1. package/config/cli.json +1 -1
  2. package/config/cloud.json +54 -22
  3. package/config/local.json +56 -12
  4. package/config/resolver.json +10 -2
  5. package/config/xpod.base.json +50 -0
  6. package/config/xpod.json +8 -8
  7. package/dist/agents/config/resolve.js +10 -10
  8. package/dist/agents/config/resolve.js.map +1 -1
  9. package/dist/api/chatkit/index.d.ts +1 -1
  10. package/dist/api/chatkit/index.js.map +1 -1
  11. package/dist/api/chatkit/pod-store.d.ts +14 -11
  12. package/dist/api/chatkit/pod-store.js +114 -78
  13. package/dist/api/chatkit/pod-store.js.map +1 -1
  14. package/dist/api/chatkit/runtime/AcpAgentRuntime.js +1 -1
  15. package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -1
  16. package/dist/api/chatkit/service.js +1 -1
  17. package/dist/api/chatkit/service.js.map +1 -1
  18. package/dist/api/chatkit/types.d.ts +11 -11
  19. package/dist/api/chatkit/types.js +3 -3
  20. package/dist/api/chatkit/types.js.map +1 -1
  21. package/dist/api/container/cloud.js +0 -8
  22. package/dist/api/container/cloud.js.map +1 -1
  23. package/dist/api/container/index.js +2 -1
  24. package/dist/api/container/index.js.map +1 -1
  25. package/dist/api/container/local.js +0 -7
  26. package/dist/api/container/local.js.map +1 -1
  27. package/dist/api/container/routes.js +3 -17
  28. package/dist/api/container/routes.js.map +1 -1
  29. package/dist/api/container/types.d.ts +0 -2
  30. package/dist/api/container/types.js.map +1 -1
  31. package/dist/api/handlers/PodManagementHandler.d.ts +3 -0
  32. package/dist/api/handlers/PodManagementHandler.js +71 -1
  33. package/dist/api/handlers/PodManagementHandler.js.map +1 -1
  34. package/dist/api/handlers/RunHandler.js +5 -5
  35. package/dist/api/handlers/RunHandler.js.map +1 -1
  36. package/dist/api/runs/AgentRuntimeTypes.d.ts +7 -8
  37. package/dist/api/runs/AgentRuntimeTypes.js.map +1 -1
  38. package/dist/api/runs/InngestRunExecutionBackend.d.ts +2 -2
  39. package/dist/api/runs/ManagedRunWorker.d.ts +1 -1
  40. package/dist/api/runs/ManagedRunWorker.js +6 -6
  41. package/dist/api/runs/ManagedRunWorker.js.map +1 -1
  42. package/dist/api/runs/PiAgentRuntimeDriver.d.ts +16 -1
  43. package/dist/api/runs/PiAgentRuntimeDriver.js +182 -23
  44. package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -1
  45. package/dist/api/runs/RunStateCenter.d.ts +3 -3
  46. package/dist/api/runs/RunStateCenter.js +13 -13
  47. package/dist/api/runs/RunStateCenter.js.map +1 -1
  48. package/dist/api/runs/store.d.ts +4 -4
  49. package/dist/api/runs/store.js +2 -2
  50. package/dist/api/runs/store.js.map +1 -1
  51. package/dist/api/service/VectorStoreService.d.ts +1 -1
  52. package/dist/api/service/VectorStoreService.js +16 -16
  53. package/dist/api/service/VectorStoreService.js.map +1 -1
  54. package/dist/api/tasks/InngestTaskScheduler.d.ts +4 -4
  55. package/dist/api/tasks/TaskMaterializer.d.ts +3 -3
  56. package/dist/api/tasks/TaskMaterializer.js +11 -11
  57. package/dist/api/tasks/TaskMaterializer.js.map +1 -1
  58. package/dist/api/tasks/TaskService.d.ts +3 -3
  59. package/dist/api/tasks/TaskService.js +11 -7
  60. package/dist/api/tasks/TaskService.js.map +1 -1
  61. package/dist/api/tasks/store.d.ts +10 -4
  62. package/dist/api/tasks/store.js +14 -4
  63. package/dist/api/tasks/store.js.map +1 -1
  64. package/dist/api/workspace/types.d.ts +3 -3
  65. package/dist/api/workspace/types.js +6 -6
  66. package/dist/api/workspace/types.js.map +1 -1
  67. package/dist/cli/commands/config.js +2 -2
  68. package/dist/cli/commands/config.js.map +1 -1
  69. package/dist/cli/commands/start.js +9 -3
  70. package/dist/cli/commands/start.js.map +1 -1
  71. package/dist/components/components.jsonld +8 -2
  72. package/dist/components/context.jsonld +308 -51
  73. package/dist/http/search/SearchHttpHandler.js +8 -8
  74. package/dist/http/search/SearchHttpHandler.js.map +1 -1
  75. package/dist/identity/drizzle/PodLookupRepository.d.ts +11 -1
  76. package/dist/identity/drizzle/PodLookupRepository.js +95 -4
  77. package/dist/identity/drizzle/PodLookupRepository.js.map +1 -1
  78. package/dist/identity/drizzle/db.js +4 -43
  79. package/dist/identity/drizzle/db.js.map +1 -1
  80. package/dist/identity/drizzle/schema.pg.d.ts +0 -5
  81. package/dist/identity/drizzle/schema.pg.js +2 -16
  82. package/dist/identity/drizzle/schema.pg.js.map +1 -1
  83. package/dist/identity/drizzle/schema.sqlite.d.ts +19 -176
  84. package/dist/identity/drizzle/schema.sqlite.js +2 -16
  85. package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
  86. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.d.ts +4 -4
  87. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +7 -7
  88. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
  89. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld +6 -6
  90. package/dist/identity/oidc/AutoDetectOidcHandler.d.ts +4 -4
  91. package/dist/identity/oidc/AutoDetectOidcHandler.js +6 -6
  92. package/dist/identity/oidc/AutoDetectOidcHandler.js.map +1 -1
  93. package/dist/identity/oidc/AutoDetectOidcHandler.jsonld +6 -6
  94. package/dist/identity/oidc/ScopedPickWebIdHandler.d.ts +37 -0
  95. package/dist/identity/oidc/ScopedPickWebIdHandler.js +211 -0
  96. package/dist/identity/oidc/ScopedPickWebIdHandler.js.map +1 -0
  97. package/dist/identity/oidc/ScopedPickWebIdHandler.jsonld +158 -0
  98. package/dist/index.d.ts +12 -2
  99. package/dist/index.js +16 -4
  100. package/dist/index.js.map +1 -1
  101. package/dist/main.js +8 -2
  102. package/dist/main.js.map +1 -1
  103. package/dist/provision/ProvisionPodCreator.d.ts +3 -4
  104. package/dist/provision/ProvisionPodCreator.js +8 -13
  105. package/dist/provision/ProvisionPodCreator.js.map +1 -1
  106. package/dist/provision/ProvisionPodCreator.jsonld +7 -7
  107. package/dist/runtime/Proxy.d.ts +0 -1
  108. package/dist/runtime/Proxy.js +0 -9
  109. package/dist/runtime/Proxy.js.map +1 -1
  110. package/dist/runtime/bootstrap.d.ts +1 -0
  111. package/dist/runtime/bootstrap.js +5 -2
  112. package/dist/runtime/bootstrap.js.map +1 -1
  113. package/dist/runtime/css-process.d.ts +12 -4
  114. package/dist/runtime/css-process.js +61 -14
  115. package/dist/runtime/css-process.js.map +1 -1
  116. package/dist/runtime/oidc-issuer.d.ts +3 -2
  117. package/dist/runtime/oidc-issuer.js +3 -2
  118. package/dist/runtime/oidc-issuer.js.map +1 -1
  119. package/dist/runtime/runtime-types.d.ts +1 -0
  120. package/dist/runtime/runtime-types.js.map +1 -1
  121. package/dist/solidfs/LocalFirstRdfRepresentationResolver.d.ts +21 -0
  122. package/dist/solidfs/LocalFirstRdfRepresentationResolver.js +38 -0
  123. package/dist/solidfs/LocalFirstRdfRepresentationResolver.js.map +1 -0
  124. package/dist/solidfs/LocalSolidFS.d.ts +18 -0
  125. package/dist/solidfs/LocalSolidFS.js +539 -0
  126. package/dist/solidfs/LocalSolidFS.js.map +1 -0
  127. package/dist/solidfs/PodSolidFsHttpClient.d.ts +16 -0
  128. package/dist/solidfs/PodSolidFsHttpClient.js +93 -0
  129. package/dist/solidfs/PodSolidFsHttpClient.js.map +1 -0
  130. package/dist/solidfs/PodSolidFsHydrator.d.ts +27 -0
  131. package/dist/solidfs/PodSolidFsHydrator.js +127 -0
  132. package/dist/solidfs/PodSolidFsHydrator.js.map +1 -0
  133. package/dist/solidfs/PodSolidFsSyncer.d.ts +21 -0
  134. package/dist/solidfs/PodSolidFsSyncer.js +78 -0
  135. package/dist/solidfs/PodSolidFsSyncer.js.map +1 -0
  136. package/dist/solidfs/RdfIndexSolidFsSyncer.d.ts +22 -0
  137. package/dist/solidfs/RdfIndexSolidFsSyncer.js +131 -0
  138. package/dist/solidfs/RdfIndexSolidFsSyncer.js.map +1 -0
  139. package/dist/solidfs/index.d.ts +7 -0
  140. package/dist/solidfs/index.js +24 -0
  141. package/dist/solidfs/index.js.map +1 -0
  142. package/dist/solidfs/types.d.ts +131 -0
  143. package/dist/solidfs/types.js +19 -0
  144. package/dist/solidfs/types.js.map +1 -0
  145. package/dist/storage/RepresentationPartialConvertingStore.js +6 -13
  146. package/dist/storage/RepresentationPartialConvertingStore.js.map +1 -1
  147. package/dist/storage/SparqlUpdateResourceStore.d.ts +4 -0
  148. package/dist/storage/SparqlUpdateResourceStore.js +13 -0
  149. package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
  150. package/dist/storage/SparqlUpdateResourceStore.jsonld +26 -0
  151. package/dist/storage/accessors/MixDataAccessor.d.ts +85 -4
  152. package/dist/storage/accessors/MixDataAccessor.js +511 -16
  153. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  154. package/dist/storage/accessors/MixDataAccessor.jsonld +176 -1
  155. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.d.ts +7 -0
  156. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js +72 -4
  157. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js.map +1 -1
  158. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.jsonld +24 -0
  159. package/dist/storage/quint/BaseQuintStore.d.ts +3 -0
  160. package/dist/storage/quint/BaseQuintStore.js +51 -27
  161. package/dist/storage/quint/BaseQuintStore.js.map +1 -1
  162. package/dist/storage/quint/PgQuintStore.d.ts +1 -0
  163. package/dist/storage/quint/PgQuintStore.js +50 -32
  164. package/dist/storage/quint/PgQuintStore.js.map +1 -1
  165. package/dist/storage/quint/PgQuintStore.jsonld +4 -3
  166. package/dist/storage/quint/SqliteQuintStore.d.ts +5 -0
  167. package/dist/storage/quint/SqliteQuintStore.js +100 -0
  168. package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
  169. package/dist/storage/quint/SqliteQuintStore.jsonld +20 -0
  170. package/dist/storage/quint/types.d.ts +16 -0
  171. package/dist/storage/quint/types.js.map +1 -1
  172. package/dist/storage/rdf/Rdf3xTripleIndex.d.ts +55 -0
  173. package/dist/storage/rdf/Rdf3xTripleIndex.js +1235 -0
  174. package/dist/storage/rdf/Rdf3xTripleIndex.js.map +1 -0
  175. package/dist/storage/rdf/RdfContentTypes.d.ts +9 -0
  176. package/dist/storage/rdf/RdfContentTypes.js +79 -0
  177. package/dist/storage/rdf/RdfContentTypes.js.map +1 -0
  178. package/dist/storage/rdf/RdfLocalQueryEngine.d.ts +79 -0
  179. package/dist/storage/rdf/RdfLocalQueryEngine.js +2705 -0
  180. package/dist/storage/rdf/RdfLocalQueryEngine.js.map +1 -0
  181. package/dist/storage/rdf/RdfQuadIndex.d.ts +98 -0
  182. package/dist/storage/rdf/RdfQuadIndex.js +1840 -0
  183. package/dist/storage/rdf/RdfQuadIndex.js.map +1 -0
  184. package/dist/storage/rdf/RdfQuadIndex.jsonld +416 -0
  185. package/dist/storage/rdf/RdfShadowComparator.d.ts +12 -0
  186. package/dist/storage/rdf/RdfShadowComparator.js +47 -0
  187. package/dist/storage/rdf/RdfShadowComparator.js.map +1 -0
  188. package/dist/storage/rdf/RdfSparqlAdapter.d.ts +147 -0
  189. package/dist/storage/rdf/RdfSparqlAdapter.js +2420 -0
  190. package/dist/storage/rdf/RdfSparqlAdapter.js.map +1 -0
  191. package/dist/storage/rdf/RdfSparqlAdapter.jsonld +414 -0
  192. package/dist/storage/rdf/RdfTermDictionary.d.ts +27 -0
  193. package/dist/storage/rdf/RdfTermDictionary.js +352 -0
  194. package/dist/storage/rdf/RdfTermDictionary.js.map +1 -0
  195. package/dist/storage/rdf/RdfTermDictionary.jsonld +114 -0
  196. package/dist/storage/rdf/RdfTermSemantics.d.ts +6 -0
  197. package/dist/storage/rdf/RdfTermSemantics.js +40 -0
  198. package/dist/storage/rdf/RdfTermSemantics.js.map +1 -0
  199. package/dist/storage/rdf/RdfTextIndex.d.ts +23 -0
  200. package/dist/storage/rdf/RdfTextIndex.js +569 -0
  201. package/dist/storage/rdf/RdfTextIndex.js.map +1 -0
  202. package/dist/storage/rdf/RdfVectorIndex.d.ts +22 -0
  203. package/dist/storage/rdf/RdfVectorIndex.js +631 -0
  204. package/dist/storage/rdf/RdfVectorIndex.js.map +1 -0
  205. package/dist/storage/rdf/RdfXmlSerializer.d.ts +2 -0
  206. package/dist/storage/rdf/RdfXmlSerializer.js +123 -0
  207. package/dist/storage/rdf/RdfXmlSerializer.js.map +1 -0
  208. package/dist/storage/rdf/ShadowRdfQuintStore.d.ts +58 -0
  209. package/dist/storage/rdf/ShadowRdfQuintStore.js +202 -0
  210. package/dist/storage/rdf/ShadowRdfQuintStore.js.map +1 -0
  211. package/dist/storage/rdf/ShadowRdfQuintStore.jsonld +308 -0
  212. package/dist/storage/rdf/SolidRdfEngine.d.ts +56 -0
  213. package/dist/storage/rdf/SolidRdfEngine.js +292 -0
  214. package/dist/storage/rdf/SolidRdfEngine.js.map +1 -0
  215. package/dist/storage/rdf/SolidRdfEngine.jsonld +372 -0
  216. package/dist/storage/rdf/SolidRdfSparqlEngine.d.ts +92 -0
  217. package/dist/storage/rdf/SolidRdfSparqlEngine.js +477 -0
  218. package/dist/storage/rdf/SolidRdfSparqlEngine.js.map +1 -0
  219. package/dist/storage/rdf/SolidRdfSparqlEngine.jsonld +257 -0
  220. package/dist/storage/rdf/index.d.ts +15 -0
  221. package/dist/storage/rdf/index.js +61 -0
  222. package/dist/storage/rdf/index.js.map +1 -0
  223. package/dist/storage/rdf/models-benchmark.d.ts +260 -0
  224. package/dist/storage/rdf/models-benchmark.js +1405 -0
  225. package/dist/storage/rdf/models-benchmark.js.map +1 -0
  226. package/dist/storage/rdf/types.d.ts +726 -0
  227. package/dist/storage/rdf/types.js +3 -0
  228. package/dist/storage/rdf/types.js.map +1 -0
  229. package/dist/storage/rdf/types.jsonld +316 -0
  230. package/dist/storage/vector/VectorIndexingListener.d.ts +5 -5
  231. package/dist/storage/vector/VectorIndexingListener.js +19 -19
  232. package/dist/storage/vector/VectorIndexingListener.js.map +1 -1
  233. package/package.json +3 -2
  234. package/templates/pod/acp/.acr.hbs +39 -0
  235. package/templates/pod/acp/README.acr +18 -0
  236. package/templates/pod/acp/profile/card.acr +22 -0
  237. package/templates/pod/base/README$.md.hbs +27 -0
  238. package/templates/pod/base/profile/card$.ttl.hbs +13 -0
  239. package/templates/pod/wac/.acl.hbs +26 -0
  240. package/templates/pod/wac/README.acl.hbs +14 -0
  241. package/templates/pod/wac/profile/card.acl.hbs +19 -0
  242. package/dist/api/handlers/WebIdProfileHandler.d.ts +0 -16
  243. package/dist/api/handlers/WebIdProfileHandler.js +0 -423
  244. package/dist/api/handlers/WebIdProfileHandler.js.map +0 -1
  245. package/dist/identity/drizzle/WebIdProfileRepository.d.ts +0 -63
  246. package/dist/identity/drizzle/WebIdProfileRepository.js +0 -168
  247. package/dist/identity/drizzle/WebIdProfileRepository.js.map +0 -1
  248. package/dist/identity/drizzle/WebIdProfileRepository.jsonld +0 -112
  249. package/dist/storage/quint/BaseQuintStore.jsonld +0 -257
@@ -36,6 +36,163 @@
36
36
  }
37
37
  }
38
38
  },
39
+ "RdfIndexStats": {
40
+ "@id": "undefineds:dist/storage/rdf/types.jsonld#RdfIndexStats",
41
+ "@prefix": true,
42
+ "@context": {}
43
+ },
44
+ "RdfIndexSpaceObject": {
45
+ "@id": "undefineds:dist/storage/rdf/types.jsonld#RdfIndexSpaceObject",
46
+ "@prefix": true,
47
+ "@context": {}
48
+ },
49
+ "RdfIndexMetrics": {
50
+ "@id": "undefineds:dist/storage/rdf/types.jsonld#RdfIndexMetrics",
51
+ "@prefix": true,
52
+ "@context": {}
53
+ },
54
+ "RdfIndexPutOptions": {
55
+ "@id": "undefineds:dist/storage/rdf/types.jsonld#RdfIndexPutOptions",
56
+ "@prefix": true,
57
+ "@context": {}
58
+ },
59
+ "RdfPatternQuery": {
60
+ "@id": "undefineds:dist/storage/rdf/types.jsonld#RdfPatternQuery",
61
+ "@prefix": true,
62
+ "@context": {}
63
+ },
64
+ "RdfQuadIndexOptions": {
65
+ "@id": "undefineds:dist/storage/rdf/types.jsonld#RdfQuadIndexOptions",
66
+ "@prefix": true,
67
+ "@context": {}
68
+ },
69
+ "RdfQuadIndexScanResult": {
70
+ "@id": "undefineds:dist/storage/rdf/types.jsonld#RdfQuadIndexScanResult",
71
+ "@prefix": true,
72
+ "@context": {}
73
+ },
74
+ "RdfShadowBackfillOptions": {
75
+ "@id": "undefineds:dist/storage/rdf/types.jsonld#RdfShadowBackfillOptions",
76
+ "@prefix": true,
77
+ "@context": {}
78
+ },
79
+ "RdfShadowBackfillResult": {
80
+ "@id": "undefineds:dist/storage/rdf/types.jsonld#RdfShadowBackfillResult",
81
+ "@prefix": true,
82
+ "@context": {}
83
+ },
84
+ "RdfShadowDiff": {
85
+ "@id": "undefineds:dist/storage/rdf/types.jsonld#RdfShadowDiff",
86
+ "@prefix": true,
87
+ "@context": {}
88
+ },
89
+ "RdfShadowScanResult": {
90
+ "@id": "undefineds:dist/storage/rdf/types.jsonld#RdfShadowScanResult",
91
+ "@prefix": true,
92
+ "@context": {}
93
+ },
94
+ "RdfSourceInput": {
95
+ "@id": "undefineds:dist/storage/rdf/types.jsonld#RdfSourceInput",
96
+ "@prefix": true,
97
+ "@context": {}
98
+ },
99
+ "RdfSparqlCompileResult": {
100
+ "@id": "undefineds:dist/storage/rdf/RdfSparqlAdapter.jsonld#RdfSparqlCompileResult",
101
+ "@prefix": true,
102
+ "@context": {}
103
+ },
104
+ "RdfSparqlAdapter": {
105
+ "@id": "undefineds:dist/storage/rdf/RdfSparqlAdapter.jsonld#RdfSparqlAdapter",
106
+ "@prefix": true,
107
+ "@context": {}
108
+ },
109
+ "ShadowRdfQuintStoreOptions": {
110
+ "@id": "undefineds:dist/storage/rdf/ShadowRdfQuintStore.jsonld#ShadowRdfQuintStoreOptions",
111
+ "@prefix": true,
112
+ "@context": {}
113
+ },
114
+ "ShadowRdfQuintStore": {
115
+ "@id": "undefineds:dist/storage/rdf/ShadowRdfQuintStore.jsonld#ShadowRdfQuintStore",
116
+ "@prefix": true,
117
+ "@context": {
118
+ "options_compatibilityStore": {
119
+ "@id": "undefineds:dist/storage/rdf/ShadowRdfQuintStore.jsonld#ShadowRdfQuintStore_options_compatibilityStore"
120
+ },
121
+ "options_index_path": {
122
+ "@id": "undefineds:dist/storage/rdf/ShadowRdfQuintStore.jsonld#ShadowRdfQuintStore_options_index_path"
123
+ },
124
+ "options_index_debug": {
125
+ "@id": "undefineds:dist/storage/rdf/ShadowRdfQuintStore.jsonld#ShadowRdfQuintStore_options_index_debug"
126
+ },
127
+ "options_autoOpen": {
128
+ "@id": "undefineds:dist/storage/rdf/ShadowRdfQuintStore.jsonld#ShadowRdfQuintStore_options_autoOpen"
129
+ },
130
+ "options_autoBackfill_enabled": {
131
+ "@id": "undefineds:dist/storage/rdf/ShadowRdfQuintStore.jsonld#ShadowRdfQuintStore_options_autoBackfill_enabled"
132
+ },
133
+ "options_autoBackfill_clear": {
134
+ "@id": "undefineds:dist/storage/rdf/ShadowRdfQuintStore.jsonld#ShadowRdfQuintStore_options_autoBackfill_clear"
135
+ },
136
+ "options_autoBackfill_batchSize": {
137
+ "@id": "undefineds:dist/storage/rdf/ShadowRdfQuintStore.jsonld#ShadowRdfQuintStore_options_autoBackfill_batchSize"
138
+ },
139
+ "compatibilityStore": {
140
+ "@id": "undefineds:dist/storage/rdf/ShadowRdfQuintStore.jsonld#ShadowRdfQuintStore_options_compatibilityStore"
141
+ },
142
+ "index_path": {
143
+ "@id": "undefineds:dist/storage/rdf/ShadowRdfQuintStore.jsonld#ShadowRdfQuintStore_options_index_path"
144
+ },
145
+ "index_debug": {
146
+ "@id": "undefineds:dist/storage/rdf/ShadowRdfQuintStore.jsonld#ShadowRdfQuintStore_options_index_debug"
147
+ },
148
+ "autoOpen": {
149
+ "@id": "undefineds:dist/storage/rdf/ShadowRdfQuintStore.jsonld#ShadowRdfQuintStore_options_autoOpen"
150
+ },
151
+ "autoBackfill_enabled": {
152
+ "@id": "undefineds:dist/storage/rdf/ShadowRdfQuintStore.jsonld#ShadowRdfQuintStore_options_autoBackfill_enabled"
153
+ },
154
+ "autoBackfill_clear": {
155
+ "@id": "undefineds:dist/storage/rdf/ShadowRdfQuintStore.jsonld#ShadowRdfQuintStore_options_autoBackfill_clear"
156
+ },
157
+ "autoBackfill_batchSize": {
158
+ "@id": "undefineds:dist/storage/rdf/ShadowRdfQuintStore.jsonld#ShadowRdfQuintStore_options_autoBackfill_batchSize"
159
+ }
160
+ }
161
+ },
162
+ "SolidRdfSparqlEngineOptions": {
163
+ "@id": "undefineds:dist/storage/rdf/SolidRdfSparqlEngine.jsonld#SolidRdfSparqlEngineOptions",
164
+ "@prefix": true,
165
+ "@context": {}
166
+ },
167
+ "SolidRdfSparqlFallback": {
168
+ "@id": "undefineds:dist/storage/rdf/SolidRdfSparqlEngine.jsonld#SolidRdfSparqlFallback",
169
+ "@prefix": true,
170
+ "@context": {}
171
+ },
172
+ "SolidRdfSparqlEngine": {
173
+ "@id": "undefineds:dist/storage/rdf/SolidRdfSparqlEngine.jsonld#SolidRdfSparqlEngine",
174
+ "@prefix": true,
175
+ "@context": {
176
+ "enablePrimary": {
177
+ "@id": "undefineds:dist/storage/rdf/SolidRdfSparqlEngine.jsonld#SolidRdfSparqlEngine_enablePrimary"
178
+ },
179
+ "onFallback": {
180
+ "@id": "undefineds:dist/storage/rdf/SolidRdfSparqlEngine.jsonld#SolidRdfSparqlEngine_onFallback"
181
+ },
182
+ "rdfEngine": {
183
+ "@id": "undefineds:dist/storage/rdf/SolidRdfSparqlEngine.jsonld#SolidRdfSparqlEngine_rdfEngine"
184
+ },
185
+ "fallback": {
186
+ "@id": "undefineds:dist/storage/rdf/SolidRdfSparqlEngine.jsonld#SolidRdfSparqlEngine_fallback"
187
+ },
188
+ "shadowStore": {
189
+ "@id": "undefineds:dist/storage/rdf/SolidRdfSparqlEngine.jsonld#SolidRdfSparqlEngine_shadowStore"
190
+ },
191
+ "y": {
192
+ "@id": "undefineds:dist/storage/rdf/SolidRdfSparqlEngine.jsonld#SolidRdfSparqlEngine_enablePrimary"
193
+ }
194
+ }
195
+ },
39
196
  "DnsProvider": {
40
197
  "@id": "undefineds:dist/dns/DnsProvider.jsonld#DnsProvider",
41
198
  "@prefix": true,
@@ -350,6 +507,21 @@
350
507
  },
351
508
  "unstructuredDataAccessor": {
352
509
  "@id": "undefineds:dist/storage/accessors/MixDataAccessor.jsonld#MixDataAccessor_unstructuredDataAccessor"
510
+ },
511
+ "rdfFileDataAccessor": {
512
+ "@id": "undefineds:dist/storage/accessors/MixDataAccessor.jsonld#MixDataAccessor_rdfFileDataAccessor"
513
+ },
514
+ "bled": {
515
+ "@id": "undefineds:dist/storage/accessors/MixDataAccessor.jsonld#MixDataAccessor_presignedRedirectEnabled"
516
+ },
517
+ "structured": {
518
+ "@id": "undefineds:dist/storage/accessors/MixDataAccessor.jsonld#MixDataAccessor_mirrorContainersToUnstructured"
519
+ },
520
+ "or": {
521
+ "@id": "undefineds:dist/storage/accessors/MixDataAccessor.jsonld#MixDataAccessor_structuredDataAccessor"
522
+ },
523
+ "ssor": {
524
+ "@id": "undefineds:dist/storage/accessors/MixDataAccessor.jsonld#MixDataAccessor_unstructuredDataAccessor"
353
525
  }
354
526
  }
355
527
  },
@@ -408,6 +580,9 @@
408
580
  "options_metadataStrategy": {
409
581
  "@id": "undefineds:dist/storage/SparqlUpdateResourceStore.jsonld#SparqlUpdateResourceStore_options_metadataStrategy"
410
582
  },
583
+ "options_localFirstRdfRepresentationResolver": {
584
+ "@id": "undefineds:dist/storage/SparqlUpdateResourceStore.jsonld#SparqlUpdateResourceStore_options_localFirstRdfRepresentationResolver"
585
+ },
411
586
  "accessor": {
412
587
  "@id": "undefineds:dist/storage/SparqlUpdateResourceStore.jsonld#SparqlUpdateResourceStore_options_accessor"
413
588
  },
@@ -419,6 +594,9 @@
419
594
  },
420
595
  "metadataStrategy": {
421
596
  "@id": "undefineds:dist/storage/SparqlUpdateResourceStore.jsonld#SparqlUpdateResourceStore_options_metadataStrategy"
597
+ },
598
+ "localFirstRdfRepresentationResolver": {
599
+ "@id": "undefineds:dist/storage/SparqlUpdateResourceStore.jsonld#SparqlUpdateResourceStore_options_localFirstRdfRepresentationResolver"
422
600
  }
423
601
  }
424
602
  },
@@ -775,30 +953,6 @@
775
953
  }
776
954
  }
777
955
  },
778
- "WebIdProfileRepository": {
779
- "@id": "undefineds:dist/identity/drizzle/WebIdProfileRepository.jsonld#WebIdProfileRepository",
780
- "@prefix": true,
781
- "@context": {
782
- "options_baseUrl": {
783
- "@id": "undefineds:dist/identity/drizzle/WebIdProfileRepository.jsonld#WebIdProfileRepository_options_baseUrl"
784
- },
785
- "options_db": {
786
- "@id": "undefineds:dist/identity/drizzle/WebIdProfileRepository.jsonld#WebIdProfileRepository_options_db"
787
- },
788
- "options_identityDbUrl": {
789
- "@id": "undefineds:dist/identity/drizzle/WebIdProfileRepository.jsonld#WebIdProfileRepository_options_identityDbUrl"
790
- },
791
- "baseUrl": {
792
- "@id": "undefineds:dist/identity/drizzle/WebIdProfileRepository.jsonld#WebIdProfileRepository_options_baseUrl"
793
- },
794
- "db": {
795
- "@id": "undefineds:dist/identity/drizzle/WebIdProfileRepository.jsonld#WebIdProfileRepository_options_db"
796
- },
797
- "identityDbUrl": {
798
- "@id": "undefineds:dist/identity/drizzle/WebIdProfileRepository.jsonld#WebIdProfileRepository_options_identityDbUrl"
799
- }
800
- }
801
- },
802
956
  "ValidatingIdentityProviderHttpHandler": {
803
957
  "@id": "undefineds:dist/identity/ValidatingIdentityProviderHttpHandler.jsonld#ValidatingIdentityProviderHttpHandler",
804
958
  "@prefix": true,
@@ -1599,29 +1753,96 @@
1599
1753
  }
1600
1754
  }
1601
1755
  },
1602
- "BaseQuintStore": {
1603
- "@id": "undefineds:dist/storage/quint/BaseQuintStore.jsonld#BaseQuintStore",
1756
+ "RdfTermDictionary": {
1757
+ "@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary",
1604
1758
  "@prefix": true,
1605
1759
  "@context": {
1606
- "options_debug": {
1607
- "@id": "undefineds:dist/storage/quint/BaseQuintStore.jsonld#BaseQuintStore_options_debug"
1760
+ "db": {
1761
+ "@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary_db"
1762
+ }
1763
+ }
1764
+ },
1765
+ "RdfQuadIndex": {
1766
+ "@id": "undefineds:dist/storage/rdf/RdfQuadIndex.jsonld#RdfQuadIndex",
1767
+ "@prefix": true,
1768
+ "@context": {
1769
+ "options_path": {
1770
+ "@id": "undefineds:dist/storage/rdf/RdfQuadIndex.jsonld#RdfQuadIndex_options_path"
1608
1771
  },
1609
- "options_predicateObjectDataTypes": {
1610
- "@id": "undefineds:dist/storage/quint/BaseQuintStore.jsonld#BaseQuintStore_options_predicateObjectDataTypes",
1611
- "@container": "@list"
1772
+ "options_debug": {
1773
+ "@id": "undefineds:dist/storage/rdf/RdfQuadIndex.jsonld#RdfQuadIndex_options_debug"
1612
1774
  },
1613
- "options_textMaxBytes": {
1614
- "@id": "undefineds:dist/storage/quint/BaseQuintStore.jsonld#BaseQuintStore_options_textMaxBytes"
1775
+ "path": {
1776
+ "@id": "undefineds:dist/storage/rdf/RdfQuadIndex.jsonld#RdfQuadIndex_options_path"
1615
1777
  },
1616
1778
  "debug": {
1617
- "@id": "undefineds:dist/storage/quint/BaseQuintStore.jsonld#BaseQuintStore_options_debug"
1779
+ "@id": "undefineds:dist/storage/rdf/RdfQuadIndex.jsonld#RdfQuadIndex_options_debug"
1780
+ }
1781
+ }
1782
+ },
1783
+ "SolidRdfEngine": {
1784
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine",
1785
+ "@prefix": true,
1786
+ "@context": {
1787
+ "options_index_path": {
1788
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_index_path"
1618
1789
  },
1619
- "predicateObjectDataTypes": {
1620
- "@id": "undefineds:dist/storage/quint/BaseQuintStore.jsonld#BaseQuintStore_options_predicateObjectDataTypes",
1621
- "@container": "@list"
1790
+ "options_index_debug": {
1791
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_index_debug"
1622
1792
  },
1623
- "textMaxBytes": {
1624
- "@id": "undefineds:dist/storage/quint/BaseQuintStore.jsonld#BaseQuintStore_options_textMaxBytes"
1793
+ "options_textIndex_path": {
1794
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_textIndex_path"
1795
+ },
1796
+ "options_vectorIndex_path": {
1797
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_vectorIndex_path"
1798
+ },
1799
+ "options_vectorIndex_defaultMetric": {
1800
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_vectorIndex_defaultMetric"
1801
+ },
1802
+ "options_rdf3xIndex_path": {
1803
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_rdf3xIndex_path"
1804
+ },
1805
+ "options_rdf3xIndex_debug": {
1806
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_rdf3xIndex_debug"
1807
+ },
1808
+ "options_rdf3xPrimary": {
1809
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_rdf3xPrimary"
1810
+ },
1811
+ "options_compatibilityStore": {
1812
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_compatibilityStore"
1813
+ },
1814
+ "options_autoOpen": {
1815
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_autoOpen"
1816
+ },
1817
+ "index_path": {
1818
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_index_path"
1819
+ },
1820
+ "index_debug": {
1821
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_index_debug"
1822
+ },
1823
+ "textIndex_path": {
1824
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_textIndex_path"
1825
+ },
1826
+ "vectorIndex_path": {
1827
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_vectorIndex_path"
1828
+ },
1829
+ "vectorIndex_defaultMetric": {
1830
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_vectorIndex_defaultMetric"
1831
+ },
1832
+ "rdf3xIndex_path": {
1833
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_rdf3xIndex_path"
1834
+ },
1835
+ "rdf3xIndex_debug": {
1836
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_rdf3xIndex_debug"
1837
+ },
1838
+ "rdf3xPrimary": {
1839
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_rdf3xPrimary"
1840
+ },
1841
+ "compatibilityStore": {
1842
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_compatibilityStore"
1843
+ },
1844
+ "autoOpen": {
1845
+ "@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_autoOpen"
1625
1846
  }
1626
1847
  }
1627
1848
  },
@@ -1837,8 +2058,8 @@
1837
2058
  "@id": "undefineds:dist/identity/oidc/AutoDetectOidcHandler.jsonld#AutoDetectOidcHandler",
1838
2059
  "@prefix": true,
1839
2060
  "@context": {
1840
- "options_idpUrl": {
1841
- "@id": "undefineds:dist/identity/oidc/AutoDetectOidcHandler.jsonld#AutoDetectOidcHandler_options_idpUrl"
2061
+ "options_oidcIssuer": {
2062
+ "@id": "undefineds:dist/identity/oidc/AutoDetectOidcHandler.jsonld#AutoDetectOidcHandler_options_oidcIssuer"
1842
2063
  },
1843
2064
  "options_message": {
1844
2065
  "@id": "undefineds:dist/identity/oidc/AutoDetectOidcHandler.jsonld#AutoDetectOidcHandler_options_message"
@@ -1846,8 +2067,8 @@
1846
2067
  "options_cacheMs": {
1847
2068
  "@id": "undefineds:dist/identity/oidc/AutoDetectOidcHandler.jsonld#AutoDetectOidcHandler_options_cacheMs"
1848
2069
  },
1849
- "idpUrl": {
1850
- "@id": "undefineds:dist/identity/oidc/AutoDetectOidcHandler.jsonld#AutoDetectOidcHandler_options_idpUrl"
2070
+ "oidcIssuer": {
2071
+ "@id": "undefineds:dist/identity/oidc/AutoDetectOidcHandler.jsonld#AutoDetectOidcHandler_options_oidcIssuer"
1851
2072
  },
1852
2073
  "message": {
1853
2074
  "@id": "undefineds:dist/identity/oidc/AutoDetectOidcHandler.jsonld#AutoDetectOidcHandler_options_message"
@@ -1861,8 +2082,8 @@
1861
2082
  "@id": "undefineds:dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld#AutoDetectIdentityProviderHandler",
1862
2083
  "@prefix": true,
1863
2084
  "@context": {
1864
- "options_idpUrl": {
1865
- "@id": "undefineds:dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld#AutoDetectIdentityProviderHandler_options_idpUrl"
2085
+ "options_oidcIssuer": {
2086
+ "@id": "undefineds:dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld#AutoDetectIdentityProviderHandler_options_oidcIssuer"
1866
2087
  },
1867
2088
  "options_message": {
1868
2089
  "@id": "undefineds:dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld#AutoDetectIdentityProviderHandler_options_message"
@@ -1870,8 +2091,8 @@
1870
2091
  "options_source": {
1871
2092
  "@id": "undefineds:dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld#AutoDetectIdentityProviderHandler_options_source"
1872
2093
  },
1873
- "idpUrl": {
1874
- "@id": "undefineds:dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld#AutoDetectIdentityProviderHandler_options_idpUrl"
2094
+ "oidcIssuer": {
2095
+ "@id": "undefineds:dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld#AutoDetectIdentityProviderHandler_options_oidcIssuer"
1875
2096
  },
1876
2097
  "message": {
1877
2098
  "@id": "undefineds:dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld#AutoDetectIdentityProviderHandler_options_message"
@@ -1893,6 +2114,42 @@
1893
2114
  }
1894
2115
  }
1895
2116
  },
2117
+ "ScopedPickWebIdHandler": {
2118
+ "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler",
2119
+ "@prefix": true,
2120
+ "@context": {
2121
+ "options_webIdStore": {
2122
+ "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler_options_webIdStore"
2123
+ },
2124
+ "options_providerFactory": {
2125
+ "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler_options_providerFactory"
2126
+ },
2127
+ "options_identityDbUrl": {
2128
+ "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler_options_identityDbUrl"
2129
+ },
2130
+ "options_podLookupRepository": {
2131
+ "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler_options_podLookupRepository"
2132
+ },
2133
+ "options_fetch": {
2134
+ "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler_options_fetch"
2135
+ },
2136
+ "webIdStore": {
2137
+ "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler_options_webIdStore"
2138
+ },
2139
+ "providerFactory": {
2140
+ "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler_options_providerFactory"
2141
+ },
2142
+ "identityDbUrl": {
2143
+ "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler_options_identityDbUrl"
2144
+ },
2145
+ "podLookupRepository": {
2146
+ "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler_options_podLookupRepository"
2147
+ },
2148
+ "fetch": {
2149
+ "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler_options_fetch"
2150
+ }
2151
+ }
2152
+ },
1896
2153
  "UrlAwareRedisLocker": {
1897
2154
  "@id": "undefineds:dist/storage/locking/UrlAwareRedisLocker.jsonld#UrlAwareRedisLocker",
1898
2155
  "@prefix": true,
@@ -1936,8 +2193,8 @@
1936
2193
  "args_provisionBaseUrl": {
1937
2194
  "@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_provisionBaseUrl"
1938
2195
  },
1939
- "args_webIdProfileRepo": {
1940
- "@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_webIdProfileRepo"
2196
+ "args_identityDbUrl": {
2197
+ "@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_identityDbUrl"
1941
2198
  },
1942
2199
  "args_baseUrl": {
1943
2200
  "@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_baseUrl"
@@ -1957,8 +2214,8 @@
1957
2214
  "provisionBaseUrl": {
1958
2215
  "@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_provisionBaseUrl"
1959
2216
  },
1960
- "webIdProfileRepo": {
1961
- "@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_webIdProfileRepo"
2217
+ "identityDbUrl": {
2218
+ "@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_identityDbUrl"
1962
2219
  },
1963
2220
  "baseUrl": {
1964
2221
  "@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_baseUrl"
@@ -175,19 +175,19 @@ class SearchHttpHandler extends community_server_1.HttpHandler {
175
175
  const query = `
176
176
  PREFIX cred: <${models_1.XPOD_CREDENTIAL.NAMESPACE}>
177
177
  PREFIX ai: <${models_1.XPOD_AI.NAMESPACE}>
178
- SELECT ?apiKey ?baseUrl ?providerUri ?proxyUrl WHERE {
178
+ SELECT ?apiKey ?baseUrl ?provider ?proxyUrl WHERE {
179
179
  ?cred a cred:Credential ;
180
180
  cred:service "ai" ;
181
181
  cred:status "active" ;
182
182
  cred:apiKey ?apiKey .
183
- OPTIONAL { ?cred cred:provider ?providerUri }
183
+ OPTIONAL { ?cred cred:provider ?provider }
184
184
  OPTIONAL {
185
- ?cred cred:provider ?providerUri .
186
- ?providerUri ai:baseUrl ?baseUrl .
185
+ ?cred cred:provider ?provider .
186
+ ?provider ai:baseUrl ?baseUrl .
187
187
  }
188
188
  OPTIONAL {
189
- ?cred cred:provider ?providerUri .
190
- ?providerUri ai:proxyUrl ?proxyUrl .
189
+ ?cred cred:provider ?provider .
190
+ ?provider ai:proxyUrl ?proxyUrl .
191
191
  }
192
192
  } LIMIT 1
193
193
  `;
@@ -195,10 +195,10 @@ class SearchHttpHandler extends community_server_1.HttpHandler {
195
195
  for await (const binding of bindingsStream) {
196
196
  const apiKey = binding.get('apiKey');
197
197
  const baseUrl = binding.get('baseUrl');
198
- const providerUri = binding.get('providerUri');
198
+ const provider = binding.get('provider');
199
199
  const proxyUrl = binding.get('proxyUrl');
200
200
  if (apiKey) {
201
- const providerName = (0, models_1.normalizeAIConfigProviderId)(providerUri?.value || 'google') || 'google';
201
+ const providerName = (0, models_1.normalizeAIConfigProviderId)(provider?.value || 'google') || 'google';
202
202
  return {
203
203
  apiKey: apiKey.value,
204
204
  baseUrl: baseUrl?.value,
@@ -1 +1 @@
1
- {"version":3,"file":"SearchHttpHandler.js","sourceRoot":"","sources":["../../../src/http/search/SearchHttpHandler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SearchHttpHandler - 语义搜索 HTTP 处理器\n *\n * 提供 /-/search 端点,支持基于向量的语义搜索。\n *\n * 端点:\n * - GET {path}/-/search?q=... 简单搜索\n * - POST {path}/-/search 复杂搜索(支持 filter 等)\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport { HttpHandler } from '@solid/community-server';\nimport type { HttpHandlerInput, HttpRequest, HttpResponse } from '@solid/community-server';\nimport {\n NotImplementedHttpError,\n MethodNotAllowedHttpError,\n HttpError,\n IdentifierSetMultiMap,\n} from '@solid/community-server';\nimport { PERMISSIONS } from '@solidlab/policy-engine';\nimport type { CredentialsExtractor, PermissionReader, Authorizer, ResourceIdentifier } from '@solid/community-server';\nimport type { VectorStore } from '../../storage/vector/VectorStore';\nimport type { EmbeddingService } from '../../ai/service/EmbeddingService';\nimport type { SparqlEngine } from '../../storage/sparql/SubgraphQueryEngine';\nimport type { AiCredential } from '../../ai/service/types';\nimport type { VectorSearchOptions } from '../../storage/vector/types';\nimport { XPOD_AI, XPOD_CREDENTIAL, normalizeAIConfigProviderId } from '@undefineds.co/models';\n\nconst ALLOWED_METHODS = ['GET', 'POST', 'OPTIONS'];\n\n// ============================================\n// 请求/响应类型\n// ============================================\n\ninterface SearchRequest {\n /** 查询文本 */\n query?: string;\n /** 预计算的查询向量 */\n vector?: number[];\n /** 返回结果数量,默认 10 */\n limit?: number;\n /** 相似度阈值 (0-1) */\n threshold?: number;\n /** 过滤条件 */\n filter?: {\n type?: string;\n graphPrefix?: string;\n subjectPrefix?: string;\n };\n /** embedding 模型 */\n model?: string;\n}\n\ninterface SearchResult {\n /** 资源 URI */\n subject: string;\n /** 相似度分数 (0-1) */\n score: number;\n /** 距离 */\n distance?: number;\n /** 文本片段 */\n snippet?: string;\n}\n\ninterface SearchResponse {\n results: SearchResult[];\n model: string;\n took_ms: number;\n}\n\n// ============================================\n// 错误处理\n// ============================================\n\ntype SearchErrorCode =\n | 'INVALID_REQUEST'\n | 'UNAUTHORIZED'\n | 'FORBIDDEN'\n | 'NO_CREDENTIAL'\n | 'EMBEDDING_ERROR'\n | 'SEARCH_ERROR';\n\nclass SearchApiError extends Error {\n constructor(\n public readonly code: SearchErrorCode,\n public readonly statusCode: number,\n message: string,\n ) {\n super(message);\n this.name = 'SearchApiError';\n }\n\n static invalidRequest(message: string): SearchApiError {\n return new SearchApiError('INVALID_REQUEST', 400, message);\n }\n\n static noCredential(): SearchApiError {\n return new SearchApiError('NO_CREDENTIAL', 400, 'No AI credential found. Please configure AI credentials in your Pod settings.');\n }\n\n static embeddingError(message: string): SearchApiError {\n return new SearchApiError('EMBEDDING_ERROR', 502, `Embedding generation failed: ${message}`);\n }\n\n static searchError(message: string): SearchApiError {\n return new SearchApiError('SEARCH_ERROR', 500, `Search failed: ${message}`);\n }\n}\n\n// ============================================\n// Handler\n// ============================================\n\nexport interface SearchHttpHandlerOptions {\n sidecarPath?: string;\n defaultModel?: string;\n defaultLimit?: number;\n}\n\nexport class SearchHttpHandler extends HttpHandler {\n protected readonly logger = getLoggerFor(this);\n\n private readonly vectorStore: VectorStore;\n private readonly embeddingService: EmbeddingService;\n private readonly sparqlEngine: SparqlEngine;\n private readonly credentialsExtractor: CredentialsExtractor;\n private readonly permissionReader: PermissionReader;\n private readonly authorizer: Authorizer;\n private readonly sidecarPath: string;\n private readonly defaultModel: string;\n private readonly defaultLimit: number;\n\n public constructor(\n vectorStore: VectorStore,\n embeddingService: EmbeddingService,\n sparqlEngine: SparqlEngine,\n credentialsExtractor: CredentialsExtractor,\n permissionReader: PermissionReader,\n authorizer: Authorizer,\n options: SearchHttpHandlerOptions = {},\n ) {\n super();\n this.vectorStore = vectorStore;\n this.embeddingService = embeddingService;\n this.sparqlEngine = sparqlEngine;\n this.credentialsExtractor = credentialsExtractor;\n this.permissionReader = permissionReader;\n this.authorizer = authorizer;\n this.sidecarPath = options.sidecarPath ?? '/-/search';\n this.defaultModel = options.defaultModel ?? 'text-embedding-004';\n this.defaultLimit = options.defaultLimit ?? 10;\n }\n\n public override async canHandle({ request }: HttpHandlerInput): Promise<void> {\n const path = this.parseUrl(request).pathname;\n if (!path.includes(this.sidecarPath)) {\n throw new NotImplementedHttpError('Request is not targeting a search endpoint.');\n }\n }\n\n public override async handle({ request, response }: HttpHandlerInput): Promise<void> {\n const method = (request.method ?? 'GET').toUpperCase();\n\n if (method === 'OPTIONS') {\n this.writeOptions(response);\n return;\n }\n\n if (!ALLOWED_METHODS.includes(method)) {\n throw new MethodNotAllowedHttpError(ALLOWED_METHODS);\n }\n\n try {\n const url = this.parseUrl(request);\n const path = decodeURIComponent(url.pathname);\n\n const sidecarIndex = path.indexOf(this.sidecarPath);\n if (sidecarIndex === -1) {\n throw new NotImplementedHttpError('Request is not targeting a search endpoint.');\n }\n\n // 提取 base path(sidecar 之前的路径)\n let basePath = path.slice(0, sidecarIndex);\n if (!basePath.endsWith('/')) {\n basePath = `${basePath}/`;\n }\n\n const origin = `${url.protocol}//${url.host}`;\n const baseUrl = `${origin}${basePath}`;\n\n this.logger.debug(`Search request: ${method} ${path}, baseUrl=${baseUrl}`);\n\n // 鉴权\n await this.authorizeFor(baseUrl, request, [PERMISSIONS.Read]);\n\n // 解析请求\n const searchRequest = await this.parseSearchRequest(request, url);\n\n // 执行搜索\n const result = await this.executeSearch(searchRequest, baseUrl);\n\n this.sendJsonResponse(response, result);\n } catch (error: unknown) {\n this.handleError(response, error);\n }\n }\n\n /**\n * 解析搜索请求\n */\n private async parseSearchRequest(request: HttpRequest, url: URL): Promise<SearchRequest> {\n const method = (request.method ?? 'GET').toUpperCase();\n\n if (method === 'GET') {\n // GET 请求从 query string 解析\n const query = url.searchParams.get('q') || url.searchParams.get('query');\n const limit = url.searchParams.get('limit');\n const threshold = url.searchParams.get('threshold');\n const model = url.searchParams.get('model');\n\n if (!query) {\n throw SearchApiError.invalidRequest('Missing query parameter \"q\"');\n }\n\n return {\n query,\n limit: limit ? parseInt(limit, 10) : undefined,\n threshold: threshold ? parseFloat(threshold) : undefined,\n model: model || undefined,\n };\n }\n\n // POST 请求从 body 解析\n const body = await this.readJsonBody<SearchRequest>(request);\n\n if (!body.query && !body.vector) {\n throw SearchApiError.invalidRequest('Either \"query\" or \"vector\" is required');\n }\n\n return body;\n }\n\n /**\n * 执行搜索\n */\n private async executeSearch(request: SearchRequest, baseUrl: string): Promise<SearchResponse> {\n const startTime = Date.now();\n const model = request.model || this.defaultModel;\n\n let queryVector = request.vector;\n\n // 如果提供了 query 文本,需要生成 embedding\n if (request.query && !queryVector) {\n // 获取 AI 凭据\n const credential = await this.getAiCredential(baseUrl);\n if (!credential) {\n throw SearchApiError.noCredential();\n }\n\n try {\n queryVector = await this.embeddingService.embed(request.query, credential, model);\n } catch (error) {\n throw SearchApiError.embeddingError(error instanceof Error ? error.message : String(error));\n }\n }\n\n if (!queryVector) {\n throw SearchApiError.invalidRequest('Failed to generate query vector');\n }\n\n // 执行向量搜索\n const searchOptions: VectorSearchOptions = {\n limit: request.limit ?? this.defaultLimit,\n threshold: request.threshold,\n };\n\n try {\n const vectorResults = await this.vectorStore.search(model, queryVector, searchOptions);\n\n // 转换结果\n const results: SearchResult[] = vectorResults.map((r) => ({\n subject: this.vectorIdToSubject(r.id, baseUrl),\n score: r.score,\n distance: r.distance,\n }));\n\n return {\n results,\n model,\n took_ms: Date.now() - startTime,\n };\n } catch (error) {\n throw SearchApiError.searchError(error instanceof Error ? error.message : String(error));\n }\n }\n\n /**\n * 获取 AI 凭据\n */\n private async getAiCredential(podBaseUrl: string): Promise<AiCredential | null> {\n try {\n const query = `\n PREFIX cred: <${XPOD_CREDENTIAL.NAMESPACE}>\n PREFIX ai: <${XPOD_AI.NAMESPACE}>\n SELECT ?apiKey ?baseUrl ?providerUri ?proxyUrl WHERE {\n ?cred a cred:Credential ;\n cred:service \"ai\" ;\n cred:status \"active\" ;\n cred:apiKey ?apiKey .\n OPTIONAL { ?cred cred:provider ?providerUri }\n OPTIONAL {\n ?cred cred:provider ?providerUri .\n ?providerUri ai:baseUrl ?baseUrl .\n }\n OPTIONAL {\n ?cred cred:provider ?providerUri .\n ?providerUri ai:proxyUrl ?proxyUrl .\n }\n } LIMIT 1\n `;\n\n const bindingsStream = await this.sparqlEngine.queryBindings(query, podBaseUrl);\n\n for await (const binding of bindingsStream) {\n const apiKey = binding.get('apiKey');\n const baseUrl = binding.get('baseUrl');\n const providerUri = binding.get('providerUri');\n const proxyUrl = binding.get('proxyUrl');\n\n if (apiKey) {\n const providerName = normalizeAIConfigProviderId(providerUri?.value || 'google') || 'google';\n\n return {\n apiKey: apiKey.value,\n baseUrl: baseUrl?.value,\n provider: providerName,\n proxyUrl: proxyUrl?.value,\n };\n }\n }\n\n return null;\n } catch (error) {\n this.logger.error(`Failed to query AI credential: ${error}`);\n return null;\n }\n }\n\n /**\n * 将向量 ID 转换回 subject URI\n * 注意:这是一个简化实现,实际需要维护 ID -> URI 的映射\n */\n private vectorIdToSubject(id: number, baseUrl: string): string {\n // TODO: 实现 ID -> URI 映射查询\n // 目前返回占位符\n return `${baseUrl}#vector-${id}`;\n }\n\n // ============================================\n // 辅助方法\n // ============================================\n\n private handleError(response: HttpResponse, error: unknown): void {\n if (error instanceof SearchApiError) {\n this.logger.error(`Search API error [${error.code}]: ${error.message}`);\n this.sendErrorResponse(response, error.statusCode, error.code, error.message);\n return;\n }\n\n if (error instanceof HttpError) {\n const errorMsg = error.message || error.name || `HTTP ${error.statusCode}`;\n this.logger.error(`HTTP error ${error.statusCode}: ${errorMsg}`);\n this.sendErrorResponse(response, error.statusCode, 'HTTP_ERROR', errorMsg);\n return;\n }\n\n const errorMsg = error instanceof Error ? error.message : String(error);\n this.logger.error(`Unexpected error: ${errorMsg}`);\n this.sendErrorResponse(response, 500, 'INTERNAL_ERROR', errorMsg || 'Internal server error');\n }\n\n private async authorizeFor(\n baseUrl: string,\n request: HttpRequest,\n permissions: typeof PERMISSIONS[keyof typeof PERMISSIONS][],\n ): Promise<void> {\n const credentials = await this.credentialsExtractor.handleSafe(request);\n const identifier: ResourceIdentifier = { path: baseUrl };\n const requestedModes = new IdentifierSetMultiMap([[identifier, permissions]] as any);\n\n const availablePermissions = await this.permissionReader.handleSafe({\n credentials,\n identifier,\n requestedModes,\n } as any);\n\n this.logger.debug(`authorizeFor: baseUrl=${baseUrl}, webId=${credentials.agent?.webId}`);\n\n await this.authorizer.handleSafe({\n credentials,\n identifier,\n requestedModes,\n availablePermissions,\n } as any);\n }\n\n private parseUrl(request: HttpRequest): URL {\n const protocol = request.headers['x-forwarded-proto'] || 'http';\n const host = request.headers['x-forwarded-host'] || request.headers.host || 'localhost';\n return new URL(request.url!, `${protocol}://${host}`);\n }\n\n private async readJsonBody<T>(request: HttpRequest): Promise<T> {\n const chunks: Buffer[] = [];\n for await (const chunk of request) {\n chunks.push(chunk);\n }\n const body = Buffer.concat(chunks).toString('utf8');\n try {\n return JSON.parse(body) as T;\n } catch {\n throw SearchApiError.invalidRequest('Invalid JSON body');\n }\n }\n\n private sendJsonResponse(response: HttpResponse, data: unknown, status = 200): void {\n response.writeHead(status, {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-cache',\n });\n response.end(JSON.stringify(data));\n }\n\n private sendErrorResponse(\n response: HttpResponse,\n status: number,\n code: string,\n message: string,\n ): void {\n response.writeHead(status, {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-cache',\n });\n response.end(\n JSON.stringify({\n error: true,\n code,\n message,\n }),\n );\n }\n\n private writeOptions(response: HttpResponse): void {\n response.writeHead(204, {\n 'Access-Control-Allow-Methods': ALLOWED_METHODS.join(', '),\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n });\n response.end();\n }\n}\n"]}
1
+ {"version":3,"file":"SearchHttpHandler.js","sourceRoot":"","sources":["../../../src/http/search/SearchHttpHandler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SearchHttpHandler - 语义搜索 HTTP 处理器\n *\n * 提供 /-/search 端点,支持基于向量的语义搜索。\n *\n * 端点:\n * - GET {path}/-/search?q=... 简单搜索\n * - POST {path}/-/search 复杂搜索(支持 filter 等)\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport { HttpHandler } from '@solid/community-server';\nimport type { HttpHandlerInput, HttpRequest, HttpResponse } from '@solid/community-server';\nimport {\n NotImplementedHttpError,\n MethodNotAllowedHttpError,\n HttpError,\n IdentifierSetMultiMap,\n} from '@solid/community-server';\nimport { PERMISSIONS } from '@solidlab/policy-engine';\nimport type { CredentialsExtractor, PermissionReader, Authorizer, ResourceIdentifier } from '@solid/community-server';\nimport type { VectorStore } from '../../storage/vector/VectorStore';\nimport type { EmbeddingService } from '../../ai/service/EmbeddingService';\nimport type { SparqlEngine } from '../../storage/sparql/SubgraphQueryEngine';\nimport type { AiCredential } from '../../ai/service/types';\nimport type { VectorSearchOptions } from '../../storage/vector/types';\nimport { XPOD_AI, XPOD_CREDENTIAL, normalizeAIConfigProviderId } from '@undefineds.co/models';\n\nconst ALLOWED_METHODS = ['GET', 'POST', 'OPTIONS'];\n\n// ============================================\n// 请求/响应类型\n// ============================================\n\ninterface SearchRequest {\n /** 查询文本 */\n query?: string;\n /** 预计算的查询向量 */\n vector?: number[];\n /** 返回结果数量,默认 10 */\n limit?: number;\n /** 相似度阈值 (0-1) */\n threshold?: number;\n /** 过滤条件 */\n filter?: {\n type?: string;\n graphPrefix?: string;\n subjectPrefix?: string;\n };\n /** embedding 模型 */\n model?: string;\n}\n\ninterface SearchResult {\n /** 资源 URI */\n subject: string;\n /** 相似度分数 (0-1) */\n score: number;\n /** 距离 */\n distance?: number;\n /** 文本片段 */\n snippet?: string;\n}\n\ninterface SearchResponse {\n results: SearchResult[];\n model: string;\n took_ms: number;\n}\n\n// ============================================\n// 错误处理\n// ============================================\n\ntype SearchErrorCode =\n | 'INVALID_REQUEST'\n | 'UNAUTHORIZED'\n | 'FORBIDDEN'\n | 'NO_CREDENTIAL'\n | 'EMBEDDING_ERROR'\n | 'SEARCH_ERROR';\n\nclass SearchApiError extends Error {\n constructor(\n public readonly code: SearchErrorCode,\n public readonly statusCode: number,\n message: string,\n ) {\n super(message);\n this.name = 'SearchApiError';\n }\n\n static invalidRequest(message: string): SearchApiError {\n return new SearchApiError('INVALID_REQUEST', 400, message);\n }\n\n static noCredential(): SearchApiError {\n return new SearchApiError('NO_CREDENTIAL', 400, 'No AI credential found. Please configure AI credentials in your Pod settings.');\n }\n\n static embeddingError(message: string): SearchApiError {\n return new SearchApiError('EMBEDDING_ERROR', 502, `Embedding generation failed: ${message}`);\n }\n\n static searchError(message: string): SearchApiError {\n return new SearchApiError('SEARCH_ERROR', 500, `Search failed: ${message}`);\n }\n}\n\n// ============================================\n// Handler\n// ============================================\n\nexport interface SearchHttpHandlerOptions {\n sidecarPath?: string;\n defaultModel?: string;\n defaultLimit?: number;\n}\n\nexport class SearchHttpHandler extends HttpHandler {\n protected readonly logger = getLoggerFor(this);\n\n private readonly vectorStore: VectorStore;\n private readonly embeddingService: EmbeddingService;\n private readonly sparqlEngine: SparqlEngine;\n private readonly credentialsExtractor: CredentialsExtractor;\n private readonly permissionReader: PermissionReader;\n private readonly authorizer: Authorizer;\n private readonly sidecarPath: string;\n private readonly defaultModel: string;\n private readonly defaultLimit: number;\n\n public constructor(\n vectorStore: VectorStore,\n embeddingService: EmbeddingService,\n sparqlEngine: SparqlEngine,\n credentialsExtractor: CredentialsExtractor,\n permissionReader: PermissionReader,\n authorizer: Authorizer,\n options: SearchHttpHandlerOptions = {},\n ) {\n super();\n this.vectorStore = vectorStore;\n this.embeddingService = embeddingService;\n this.sparqlEngine = sparqlEngine;\n this.credentialsExtractor = credentialsExtractor;\n this.permissionReader = permissionReader;\n this.authorizer = authorizer;\n this.sidecarPath = options.sidecarPath ?? '/-/search';\n this.defaultModel = options.defaultModel ?? 'text-embedding-004';\n this.defaultLimit = options.defaultLimit ?? 10;\n }\n\n public override async canHandle({ request }: HttpHandlerInput): Promise<void> {\n const path = this.parseUrl(request).pathname;\n if (!path.includes(this.sidecarPath)) {\n throw new NotImplementedHttpError('Request is not targeting a search endpoint.');\n }\n }\n\n public override async handle({ request, response }: HttpHandlerInput): Promise<void> {\n const method = (request.method ?? 'GET').toUpperCase();\n\n if (method === 'OPTIONS') {\n this.writeOptions(response);\n return;\n }\n\n if (!ALLOWED_METHODS.includes(method)) {\n throw new MethodNotAllowedHttpError(ALLOWED_METHODS);\n }\n\n try {\n const url = this.parseUrl(request);\n const path = decodeURIComponent(url.pathname);\n\n const sidecarIndex = path.indexOf(this.sidecarPath);\n if (sidecarIndex === -1) {\n throw new NotImplementedHttpError('Request is not targeting a search endpoint.');\n }\n\n // 提取 base path(sidecar 之前的路径)\n let basePath = path.slice(0, sidecarIndex);\n if (!basePath.endsWith('/')) {\n basePath = `${basePath}/`;\n }\n\n const origin = `${url.protocol}//${url.host}`;\n const baseUrl = `${origin}${basePath}`;\n\n this.logger.debug(`Search request: ${method} ${path}, baseUrl=${baseUrl}`);\n\n // 鉴权\n await this.authorizeFor(baseUrl, request, [PERMISSIONS.Read]);\n\n // 解析请求\n const searchRequest = await this.parseSearchRequest(request, url);\n\n // 执行搜索\n const result = await this.executeSearch(searchRequest, baseUrl);\n\n this.sendJsonResponse(response, result);\n } catch (error: unknown) {\n this.handleError(response, error);\n }\n }\n\n /**\n * 解析搜索请求\n */\n private async parseSearchRequest(request: HttpRequest, url: URL): Promise<SearchRequest> {\n const method = (request.method ?? 'GET').toUpperCase();\n\n if (method === 'GET') {\n // GET 请求从 query string 解析\n const query = url.searchParams.get('q') || url.searchParams.get('query');\n const limit = url.searchParams.get('limit');\n const threshold = url.searchParams.get('threshold');\n const model = url.searchParams.get('model');\n\n if (!query) {\n throw SearchApiError.invalidRequest('Missing query parameter \"q\"');\n }\n\n return {\n query,\n limit: limit ? parseInt(limit, 10) : undefined,\n threshold: threshold ? parseFloat(threshold) : undefined,\n model: model || undefined,\n };\n }\n\n // POST 请求从 body 解析\n const body = await this.readJsonBody<SearchRequest>(request);\n\n if (!body.query && !body.vector) {\n throw SearchApiError.invalidRequest('Either \"query\" or \"vector\" is required');\n }\n\n return body;\n }\n\n /**\n * 执行搜索\n */\n private async executeSearch(request: SearchRequest, baseUrl: string): Promise<SearchResponse> {\n const startTime = Date.now();\n const model = request.model || this.defaultModel;\n\n let queryVector = request.vector;\n\n // 如果提供了 query 文本,需要生成 embedding\n if (request.query && !queryVector) {\n // 获取 AI 凭据\n const credential = await this.getAiCredential(baseUrl);\n if (!credential) {\n throw SearchApiError.noCredential();\n }\n\n try {\n queryVector = await this.embeddingService.embed(request.query, credential, model);\n } catch (error) {\n throw SearchApiError.embeddingError(error instanceof Error ? error.message : String(error));\n }\n }\n\n if (!queryVector) {\n throw SearchApiError.invalidRequest('Failed to generate query vector');\n }\n\n // 执行向量搜索\n const searchOptions: VectorSearchOptions = {\n limit: request.limit ?? this.defaultLimit,\n threshold: request.threshold,\n };\n\n try {\n const vectorResults = await this.vectorStore.search(model, queryVector, searchOptions);\n\n // 转换结果\n const results: SearchResult[] = vectorResults.map((r) => ({\n subject: this.vectorIdToSubject(r.id, baseUrl),\n score: r.score,\n distance: r.distance,\n }));\n\n return {\n results,\n model,\n took_ms: Date.now() - startTime,\n };\n } catch (error) {\n throw SearchApiError.searchError(error instanceof Error ? error.message : String(error));\n }\n }\n\n /**\n * 获取 AI 凭据\n */\n private async getAiCredential(podBaseUrl: string): Promise<AiCredential | null> {\n try {\n const query = `\n PREFIX cred: <${XPOD_CREDENTIAL.NAMESPACE}>\n PREFIX ai: <${XPOD_AI.NAMESPACE}>\n SELECT ?apiKey ?baseUrl ?provider ?proxyUrl WHERE {\n ?cred a cred:Credential ;\n cred:service \"ai\" ;\n cred:status \"active\" ;\n cred:apiKey ?apiKey .\n OPTIONAL { ?cred cred:provider ?provider }\n OPTIONAL {\n ?cred cred:provider ?provider .\n ?provider ai:baseUrl ?baseUrl .\n }\n OPTIONAL {\n ?cred cred:provider ?provider .\n ?provider ai:proxyUrl ?proxyUrl .\n }\n } LIMIT 1\n `;\n\n const bindingsStream = await this.sparqlEngine.queryBindings(query, podBaseUrl);\n\n for await (const binding of bindingsStream) {\n const apiKey = binding.get('apiKey');\n const baseUrl = binding.get('baseUrl');\n const provider = binding.get('provider');\n const proxyUrl = binding.get('proxyUrl');\n\n if (apiKey) {\n const providerName = normalizeAIConfigProviderId(provider?.value || 'google') || 'google';\n\n return {\n apiKey: apiKey.value,\n baseUrl: baseUrl?.value,\n provider: providerName,\n proxyUrl: proxyUrl?.value,\n };\n }\n }\n\n return null;\n } catch (error) {\n this.logger.error(`Failed to query AI credential: ${error}`);\n return null;\n }\n }\n\n /**\n * 将向量 ID 转换回 subject URI\n * 注意:这是一个简化实现,实际需要维护 ID -> URI 的映射\n */\n private vectorIdToSubject(id: number, baseUrl: string): string {\n // TODO: 实现 ID -> URI 映射查询\n // 目前返回占位符\n return `${baseUrl}#vector-${id}`;\n }\n\n // ============================================\n // 辅助方法\n // ============================================\n\n private handleError(response: HttpResponse, error: unknown): void {\n if (error instanceof SearchApiError) {\n this.logger.error(`Search API error [${error.code}]: ${error.message}`);\n this.sendErrorResponse(response, error.statusCode, error.code, error.message);\n return;\n }\n\n if (error instanceof HttpError) {\n const errorMsg = error.message || error.name || `HTTP ${error.statusCode}`;\n this.logger.error(`HTTP error ${error.statusCode}: ${errorMsg}`);\n this.sendErrorResponse(response, error.statusCode, 'HTTP_ERROR', errorMsg);\n return;\n }\n\n const errorMsg = error instanceof Error ? error.message : String(error);\n this.logger.error(`Unexpected error: ${errorMsg}`);\n this.sendErrorResponse(response, 500, 'INTERNAL_ERROR', errorMsg || 'Internal server error');\n }\n\n private async authorizeFor(\n baseUrl: string,\n request: HttpRequest,\n permissions: typeof PERMISSIONS[keyof typeof PERMISSIONS][],\n ): Promise<void> {\n const credentials = await this.credentialsExtractor.handleSafe(request);\n const identifier: ResourceIdentifier = { path: baseUrl };\n const requestedModes = new IdentifierSetMultiMap([[identifier, permissions]] as any);\n\n const availablePermissions = await this.permissionReader.handleSafe({\n credentials,\n identifier,\n requestedModes,\n } as any);\n\n this.logger.debug(`authorizeFor: baseUrl=${baseUrl}, webId=${credentials.agent?.webId}`);\n\n await this.authorizer.handleSafe({\n credentials,\n identifier,\n requestedModes,\n availablePermissions,\n } as any);\n }\n\n private parseUrl(request: HttpRequest): URL {\n const protocol = request.headers['x-forwarded-proto'] || 'http';\n const host = request.headers['x-forwarded-host'] || request.headers.host || 'localhost';\n return new URL(request.url!, `${protocol}://${host}`);\n }\n\n private async readJsonBody<T>(request: HttpRequest): Promise<T> {\n const chunks: Buffer[] = [];\n for await (const chunk of request) {\n chunks.push(chunk);\n }\n const body = Buffer.concat(chunks).toString('utf8');\n try {\n return JSON.parse(body) as T;\n } catch {\n throw SearchApiError.invalidRequest('Invalid JSON body');\n }\n }\n\n private sendJsonResponse(response: HttpResponse, data: unknown, status = 200): void {\n response.writeHead(status, {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-cache',\n });\n response.end(JSON.stringify(data));\n }\n\n private sendErrorResponse(\n response: HttpResponse,\n status: number,\n code: string,\n message: string,\n ): void {\n response.writeHead(status, {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-cache',\n });\n response.end(\n JSON.stringify({\n error: true,\n code,\n message,\n }),\n );\n }\n\n private writeOptions(response: HttpResponse): void {\n response.writeHead(204, {\n 'Access-Control-Allow-Methods': ALLOWED_METHODS.join(', '),\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n });\n response.end();\n }\n}\n"]}