@undefineds.co/xpod 0.2.45 → 0.3.1

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 (414) hide show
  1. package/dist/agents/AgentExecutorFactory.js +12 -13
  2. package/dist/agents/AgentExecutorFactory.js.map +1 -1
  3. package/dist/agents/config/agent-meta-schema.d.ts +31 -3
  4. package/dist/agents/config/agent-meta-schema.js +37 -3
  5. package/dist/agents/config/agent-meta-schema.js.map +1 -1
  6. package/dist/agents/config/index.d.ts +5 -5
  7. package/dist/agents/config/index.js +7 -6
  8. package/dist/agents/config/index.js.map +1 -1
  9. package/dist/agents/config/parse-agent-instructions.d.ts +12 -0
  10. package/dist/agents/config/parse-agent-instructions.js +23 -0
  11. package/dist/agents/config/parse-agent-instructions.js.map +1 -0
  12. package/dist/agents/config/resolve.d.ts +7 -12
  13. package/dist/agents/config/resolve.js +272 -156
  14. package/dist/agents/config/resolve.js.map +1 -1
  15. package/dist/agents/config/types.d.ts +33 -36
  16. package/dist/agents/config/types.js +4 -4
  17. package/dist/agents/config/types.js.map +1 -1
  18. package/dist/agents/index.d.ts +2 -7
  19. package/dist/agents/index.js +4 -14
  20. package/dist/agents/index.js.map +1 -1
  21. package/dist/agents/types.d.ts +2 -2
  22. package/dist/agents/types.js.map +1 -1
  23. package/dist/ai/service/CredentialReaderImpl.js +9 -14
  24. package/dist/ai/service/CredentialReaderImpl.js.map +1 -1
  25. package/dist/api/ApiServer.d.ts +7 -0
  26. package/dist/api/ApiServer.js +5 -1
  27. package/dist/api/ApiServer.js.map +1 -1
  28. package/dist/api/chatkit/default-agent.js +1 -1
  29. package/dist/api/chatkit/default-agent.js.map +1 -1
  30. package/dist/api/chatkit/index.d.ts +8 -0
  31. package/dist/api/chatkit/index.js +15 -1
  32. package/dist/api/chatkit/index.js.map +1 -1
  33. package/dist/api/chatkit/pod-store.d.ts +80 -17
  34. package/dist/api/chatkit/pod-store.js +816 -162
  35. package/dist/api/chatkit/pod-store.js.map +1 -1
  36. package/dist/api/chatkit/runtime/AcpAgentRuntime.d.ts +41 -0
  37. package/dist/api/chatkit/runtime/AcpAgentRuntime.js +573 -0
  38. package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -0
  39. package/dist/api/chatkit/runtime/CodexRuntimeProjector.d.ts +27 -0
  40. package/dist/api/chatkit/runtime/CodexRuntimeProjector.js +157 -0
  41. package/dist/api/chatkit/runtime/CodexRuntimeProjector.js.map +1 -0
  42. package/dist/api/chatkit/schema.d.ts +53 -133
  43. package/dist/api/chatkit/schema.js +11 -175
  44. package/dist/api/chatkit/schema.js.map +1 -1
  45. package/dist/api/chatkit/service.d.ts +15 -9
  46. package/dist/api/chatkit/service.js +82 -234
  47. package/dist/api/chatkit/service.js.map +1 -1
  48. package/dist/api/chatkit/store.d.ts +35 -3
  49. package/dist/api/chatkit/store.js +157 -3
  50. package/dist/api/chatkit/store.js.map +1 -1
  51. package/dist/api/chatkit/types.d.ts +16 -2
  52. package/dist/api/chatkit/types.js +24 -5
  53. package/dist/api/chatkit/types.js.map +1 -1
  54. package/dist/api/container/common.js +59 -2
  55. package/dist/api/container/common.js.map +1 -1
  56. package/dist/api/container/index.js +15 -0
  57. package/dist/api/container/index.js.map +1 -1
  58. package/dist/api/container/routes.js +11 -0
  59. package/dist/api/container/routes.js.map +1 -1
  60. package/dist/api/container/types.d.ts +26 -0
  61. package/dist/api/container/types.js.map +1 -1
  62. package/dist/api/handlers/InngestHandler.d.ts +11 -0
  63. package/dist/api/handlers/InngestHandler.js +19 -0
  64. package/dist/api/handlers/InngestHandler.js.map +1 -0
  65. package/dist/api/handlers/RunHandler.d.ts +7 -0
  66. package/dist/api/handlers/RunHandler.js +169 -0
  67. package/dist/api/handlers/RunHandler.js.map +1 -0
  68. package/dist/api/handlers/index.d.ts +1 -0
  69. package/dist/api/handlers/index.js +1 -0
  70. package/dist/api/handlers/index.js.map +1 -1
  71. package/dist/api/models/namespaces.d.ts +2 -2
  72. package/dist/api/models/namespaces.js +1 -4
  73. package/dist/api/models/namespaces.js.map +1 -1
  74. package/dist/api/runs/AgentRuntimeTypes.d.ts +83 -0
  75. package/dist/api/runs/AgentRuntimeTypes.js +3 -0
  76. package/dist/api/runs/AgentRuntimeTypes.js.map +1 -0
  77. package/dist/api/runs/EmbeddedInngestService.d.ts +47 -0
  78. package/dist/api/runs/EmbeddedInngestService.js +203 -0
  79. package/dist/api/runs/EmbeddedInngestService.js.map +1 -0
  80. package/dist/api/runs/InngestRunExecutionBackend.d.ts +416 -0
  81. package/dist/api/runs/InngestRunExecutionBackend.js +225 -0
  82. package/dist/api/runs/InngestRunExecutionBackend.js.map +1 -0
  83. package/dist/api/runs/ManagedRunWorker.d.ts +52 -0
  84. package/dist/api/runs/ManagedRunWorker.js +452 -0
  85. package/dist/api/runs/ManagedRunWorker.js.map +1 -0
  86. package/dist/api/runs/PiAgentRuntimeDriver.d.ts +66 -0
  87. package/dist/api/runs/PiAgentRuntimeDriver.js +614 -0
  88. package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -0
  89. package/dist/api/runs/PiAgentRuntimeWorker.d.ts +1 -0
  90. package/dist/api/runs/PiAgentRuntimeWorker.js +33 -0
  91. package/dist/api/runs/PiAgentRuntimeWorker.js.map +1 -0
  92. package/dist/api/runs/RunAuthContextRegistry.d.ts +19 -0
  93. package/dist/api/runs/RunAuthContextRegistry.js +59 -0
  94. package/dist/api/runs/RunAuthContextRegistry.js.map +1 -0
  95. package/dist/api/runs/RunExecutionBackend.d.ts +57 -0
  96. package/dist/api/runs/RunExecutionBackend.js +3 -0
  97. package/dist/api/runs/RunExecutionBackend.js.map +1 -0
  98. package/dist/api/runs/RunStateCenter.d.ts +82 -0
  99. package/dist/api/runs/RunStateCenter.js +665 -0
  100. package/dist/api/runs/RunStateCenter.js.map +1 -0
  101. package/dist/api/runs/schema.d.ts +55 -0
  102. package/dist/api/runs/schema.js +14 -0
  103. package/dist/api/runs/schema.js.map +1 -0
  104. package/dist/api/runs/store.d.ts +105 -0
  105. package/dist/api/runs/store.js +116 -0
  106. package/dist/api/runs/store.js.map +1 -0
  107. package/dist/api/runtime.d.ts +2 -0
  108. package/dist/api/runtime.js +40 -1
  109. package/dist/api/runtime.js.map +1 -1
  110. package/dist/api/service/VectorStoreService.d.ts +1 -0
  111. package/dist/api/service/VectorStoreService.js +27 -34
  112. package/dist/api/service/VectorStoreService.js.map +1 -1
  113. package/dist/api/service/provider-registry.d.ts +1 -1
  114. package/dist/api/service/provider-registry.js +1 -1
  115. package/dist/api/service/provider-registry.js.map +1 -1
  116. package/dist/api/tasks/InngestTaskScheduler.d.ts +751 -0
  117. package/dist/api/tasks/InngestTaskScheduler.js +209 -0
  118. package/dist/api/tasks/InngestTaskScheduler.js.map +1 -0
  119. package/dist/api/tasks/TaskAuthBinding.d.ts +68 -0
  120. package/dist/api/tasks/TaskAuthBinding.js +162 -0
  121. package/dist/api/tasks/TaskAuthBinding.js.map +1 -0
  122. package/dist/api/tasks/TaskMaterializer.d.ts +55 -0
  123. package/dist/api/tasks/TaskMaterializer.js +452 -0
  124. package/dist/api/tasks/TaskMaterializer.js.map +1 -0
  125. package/dist/api/tasks/TaskService.d.ts +57 -0
  126. package/dist/api/tasks/TaskService.js +235 -0
  127. package/dist/api/tasks/TaskService.js.map +1 -0
  128. package/dist/api/tasks/index.d.ts +6 -0
  129. package/dist/api/tasks/index.js +25 -0
  130. package/dist/api/tasks/index.js.map +1 -0
  131. package/dist/api/tasks/schema.d.ts +23 -0
  132. package/dist/api/tasks/schema.js +8 -0
  133. package/dist/api/tasks/schema.js.map +1 -0
  134. package/dist/api/tasks/store.d.ts +40 -0
  135. package/dist/api/tasks/store.js +34 -0
  136. package/dist/api/tasks/store.js.map +1 -0
  137. package/dist/api/workspace/types.d.ts +3 -0
  138. package/dist/api/workspace/types.js +23 -0
  139. package/dist/api/workspace/types.js.map +1 -0
  140. package/dist/cli/commands/config.d.ts +8 -7
  141. package/dist/cli/commands/config.js +72 -48
  142. package/dist/cli/commands/config.js.map +1 -1
  143. package/dist/cli/commands/login.d.ts +10 -8
  144. package/dist/cli/commands/login.js +84 -84
  145. package/dist/cli/commands/login.js.map +1 -1
  146. package/dist/cli/index.js +3 -124
  147. package/dist/cli/index.js.map +1 -1
  148. package/dist/http/search/SearchHttpHandler.js +13 -18
  149. package/dist/http/search/SearchHttpHandler.js.map +1 -1
  150. package/dist/storage/vector/VectorIndexingListener.js +13 -18
  151. package/dist/storage/vector/VectorIndexingListener.js.map +1 -1
  152. package/dist/vocab/index.d.ts +2 -6
  153. package/dist/vocab/index.js +2 -6
  154. package/dist/vocab/index.js.map +1 -1
  155. package/dist/vocab/udfs.d.ts +12 -0
  156. package/dist/vocab/udfs.js +12 -0
  157. package/dist/vocab/udfs.js.map +1 -1
  158. package/node_modules/@undefineds.co/drizzle-solid/README.md +52 -24
  159. package/node_modules/@undefineds.co/drizzle-solid/README.zh-CN.md +30 -24
  160. package/node_modules/@undefineds.co/drizzle-solid/dist/core/discovery/types.d.ts +6 -2
  161. package/node_modules/@undefineds.co/drizzle-solid/dist/core/discovery/types.d.ts.map +1 -1
  162. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.d.ts +1 -0
  163. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.d.ts.map +1 -1
  164. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.js +43 -10
  165. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.js.map +1 -1
  166. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.d.ts.map +1 -1
  167. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.js +1 -0
  168. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.js.map +1 -1
  169. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.d.ts +5 -0
  170. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.d.ts.map +1 -1
  171. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.js +44 -13
  172. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.js.map +1 -1
  173. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.d.ts +1 -0
  174. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.d.ts.map +1 -1
  175. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.js +21 -2
  176. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.js.map +1 -1
  177. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/types.d.ts +1 -0
  178. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/types.d.ts.map +1 -1
  179. package/node_modules/@undefineds.co/drizzle-solid/dist/core/expressions.d.ts +1 -1
  180. package/node_modules/@undefineds.co/drizzle-solid/dist/core/expressions.d.ts.map +1 -1
  181. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.d.ts +76 -41
  182. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.d.ts.map +1 -1
  183. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js +443 -114
  184. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js.map +1 -1
  185. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.d.ts +28 -1
  186. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.d.ts.map +1 -1
  187. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.js +142 -31
  188. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.js.map +1 -1
  189. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.d.ts +3 -0
  190. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.d.ts.map +1 -1
  191. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.js +84 -6
  192. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.js.map +1 -1
  193. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.d.ts +3 -0
  194. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.d.ts.map +1 -1
  195. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.js +29 -9
  196. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.js.map +1 -1
  197. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts +2 -8
  198. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts.map +1 -1
  199. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js +19 -51
  200. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js.map +1 -1
  201. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/types.d.ts +1 -0
  202. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/types.d.ts.map +1 -1
  203. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-conditions.d.ts +2 -2
  204. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-conditions.d.ts.map +1 -1
  205. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-where-policy.js +6 -6
  206. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-where-policy.js.map +1 -1
  207. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.d.ts +4 -4
  208. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.d.ts.map +1 -1
  209. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.js +56 -23
  210. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.js.map +1 -1
  211. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.d.ts +14 -10
  212. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.d.ts.map +1 -1
  213. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.js +55 -23
  214. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.js.map +1 -1
  215. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.d.ts +3 -3
  216. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.js +6 -6
  217. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.js.map +1 -1
  218. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.d.ts +3 -3
  219. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.js +4 -4
  220. package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.js.map +1 -1
  221. package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.d.ts.map +1 -1
  222. package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.js +33 -8
  223. package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.js.map +1 -1
  224. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/defs.d.ts +11 -2
  225. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/defs.d.ts.map +1 -1
  226. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.d.ts.map +1 -1
  227. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.js +3 -2
  228. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.js.map +1 -1
  229. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.d.ts +13 -8
  230. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.d.ts.map +1 -1
  231. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.js +24 -22
  232. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.js.map +1 -1
  233. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.d.ts +3 -0
  234. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.d.ts.map +1 -1
  235. package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.js.map +1 -1
  236. package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.d.ts +3 -2
  237. package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.d.ts.map +1 -1
  238. package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.js +28 -14
  239. package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.js.map +1 -1
  240. package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.d.ts.map +1 -1
  241. package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.js +3 -2
  242. package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.js.map +1 -1
  243. package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.d.ts +9 -9
  244. package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.d.ts.map +1 -1
  245. package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.js +56 -22
  246. package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.js.map +1 -1
  247. package/node_modules/@undefineds.co/drizzle-solid/dist/driver.d.ts +9 -1
  248. package/node_modules/@undefineds.co/drizzle-solid/dist/driver.d.ts.map +1 -1
  249. package/node_modules/@undefineds.co/drizzle-solid/dist/driver.js +2 -0
  250. package/node_modules/@undefineds.co/drizzle-solid/dist/driver.js.map +1 -1
  251. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/types.d.ts +6 -2
  252. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/types.d.ts.map +1 -1
  253. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.d.ts +1 -0
  254. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.d.ts.map +1 -1
  255. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.js +43 -10
  256. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.js.map +1 -1
  257. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.d.ts.map +1 -1
  258. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.js +1 -0
  259. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.js.map +1 -1
  260. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.d.ts +5 -0
  261. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.d.ts.map +1 -1
  262. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.js +44 -13
  263. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.js.map +1 -1
  264. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.d.ts +1 -0
  265. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.d.ts.map +1 -1
  266. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.js +21 -2
  267. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.js.map +1 -1
  268. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/types.d.ts +1 -0
  269. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/types.d.ts.map +1 -1
  270. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/expressions.d.ts +1 -1
  271. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/expressions.d.ts.map +1 -1
  272. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.d.ts +76 -41
  273. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.d.ts.map +1 -1
  274. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js +443 -114
  275. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js.map +1 -1
  276. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.d.ts +28 -1
  277. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.d.ts.map +1 -1
  278. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.js +142 -31
  279. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.js.map +1 -1
  280. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.d.ts +3 -0
  281. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.d.ts.map +1 -1
  282. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.js +84 -6
  283. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.js.map +1 -1
  284. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.d.ts +3 -0
  285. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.d.ts.map +1 -1
  286. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.js +29 -9
  287. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.js.map +1 -1
  288. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts +2 -8
  289. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts.map +1 -1
  290. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js +19 -51
  291. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js.map +1 -1
  292. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/types.d.ts +1 -0
  293. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/types.d.ts.map +1 -1
  294. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-conditions.d.ts +2 -2
  295. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-conditions.d.ts.map +1 -1
  296. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-where-policy.js +6 -6
  297. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-where-policy.js.map +1 -1
  298. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.d.ts +4 -4
  299. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.d.ts.map +1 -1
  300. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.js +56 -23
  301. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.js.map +1 -1
  302. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.d.ts +14 -10
  303. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.d.ts.map +1 -1
  304. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.js +55 -23
  305. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.js.map +1 -1
  306. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.d.ts +3 -3
  307. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.js +6 -6
  308. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.js.map +1 -1
  309. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.d.ts +3 -3
  310. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.js +4 -4
  311. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.js.map +1 -1
  312. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.d.ts.map +1 -1
  313. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.js +33 -8
  314. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.js.map +1 -1
  315. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/defs.d.ts +11 -2
  316. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/defs.d.ts.map +1 -1
  317. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.d.ts.map +1 -1
  318. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.js +3 -2
  319. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.js.map +1 -1
  320. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.d.ts +13 -8
  321. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.d.ts.map +1 -1
  322. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.js +24 -22
  323. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.js.map +1 -1
  324. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.d.ts +3 -0
  325. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.d.ts.map +1 -1
  326. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.js.map +1 -1
  327. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.d.ts +3 -2
  328. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.d.ts.map +1 -1
  329. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.js +28 -14
  330. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.js.map +1 -1
  331. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.d.ts.map +1 -1
  332. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.js +3 -2
  333. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.js.map +1 -1
  334. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.d.ts +9 -9
  335. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.d.ts.map +1 -1
  336. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.js +56 -22
  337. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.js.map +1 -1
  338. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.d.ts +9 -1
  339. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.d.ts.map +1 -1
  340. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.js +2 -0
  341. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.js.map +1 -1
  342. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/pod.d.ts +16 -2
  343. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/pod.d.ts.map +1 -1
  344. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/find-by-iri.js +1 -1
  345. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/find-by-iri.js.map +1 -1
  346. package/node_modules/@undefineds.co/drizzle-solid/dist/pod.d.ts +16 -2
  347. package/node_modules/@undefineds.co/drizzle-solid/dist/pod.d.ts.map +1 -1
  348. package/node_modules/@undefineds.co/drizzle-solid/dist/utils/find-by-iri.js +1 -1
  349. package/node_modules/@undefineds.co/drizzle-solid/dist/utils/find-by-iri.js.map +1 -1
  350. package/node_modules/@undefineds.co/drizzle-solid/package.json +1 -1
  351. package/package.json +9 -3
  352. package/dist/agents/AgentManager.d.ts +0 -116
  353. package/dist/agents/AgentManager.js +0 -290
  354. package/dist/agents/AgentManager.js.map +0 -1
  355. package/dist/agents/IndexAgent.d.ts +0 -70
  356. package/dist/agents/IndexAgent.js +0 -417
  357. package/dist/agents/IndexAgent.js.map +0 -1
  358. package/dist/agents/config/parse-agent-md.d.ts +0 -33
  359. package/dist/agents/config/parse-agent-md.js +0 -75
  360. package/dist/agents/config/parse-agent-md.js.map +0 -1
  361. package/dist/agents/schema/agent-config.d.ts +0 -2
  362. package/dist/agents/schema/agent-config.js +0 -32
  363. package/dist/agents/schema/agent-config.js.map +0 -1
  364. package/dist/agents/schema/create-agent-schema.d.ts +0 -25
  365. package/dist/agents/schema/create-agent-schema.js +0 -35
  366. package/dist/agents/schema/create-agent-schema.js.map +0 -1
  367. package/dist/api/chatkit/runtime/PtyThreadRuntime.d.ts +0 -127
  368. package/dist/api/chatkit/runtime/PtyThreadRuntime.js +0 -791
  369. package/dist/api/chatkit/runtime/PtyThreadRuntime.js.map +0 -1
  370. package/dist/cli/lib/agent-session.d.ts +0 -37
  371. package/dist/cli/lib/agent-session.js +0 -211
  372. package/dist/cli/lib/agent-session.js.map +0 -1
  373. package/dist/cli/lib/ensure-ai-credentials.d.ts +0 -13
  374. package/dist/cli/lib/ensure-ai-credentials.js +0 -40
  375. package/dist/cli/lib/ensure-ai-credentials.js.map +0 -1
  376. package/dist/cli/lib/model-manager.d.ts +0 -37
  377. package/dist/cli/lib/model-manager.js +0 -251
  378. package/dist/cli/lib/model-manager.js.map +0 -1
  379. package/dist/cli/lib/oauth-credential-manager.d.ts +0 -37
  380. package/dist/cli/lib/oauth-credential-manager.js +0 -129
  381. package/dist/cli/lib/oauth-credential-manager.js.map +0 -1
  382. package/dist/cli/lib/oauth-providers/codebuddy.d.ts +0 -25
  383. package/dist/cli/lib/oauth-providers/codebuddy.js +0 -69
  384. package/dist/cli/lib/oauth-providers/codebuddy.js.map +0 -1
  385. package/dist/cli/lib/oauth-providers/index.d.ts +0 -12
  386. package/dist/cli/lib/oauth-providers/index.js +0 -23
  387. package/dist/cli/lib/oauth-providers/index.js.map +0 -1
  388. package/dist/cli/lib/pi-optional.d.ts +0 -84
  389. package/dist/cli/lib/pi-optional.js +0 -35
  390. package/dist/cli/lib/pi-optional.js.map +0 -1
  391. package/dist/cli/lib/pod-ai-config.d.ts +0 -26
  392. package/dist/cli/lib/pod-ai-config.js +0 -99
  393. package/dist/cli/lib/pod-ai-config.js.map +0 -1
  394. package/dist/cli/lib/pod-thread-store.d.ts +0 -57
  395. package/dist/cli/lib/pod-thread-store.js +0 -312
  396. package/dist/cli/lib/pod-thread-store.js.map +0 -1
  397. package/dist/cli/lib/secretary-prompt.d.ts +0 -6
  398. package/dist/cli/lib/secretary-prompt.js +0 -85
  399. package/dist/cli/lib/secretary-prompt.js.map +0 -1
  400. package/dist/task/DrizzleTaskQueue.d.ts +0 -56
  401. package/dist/task/DrizzleTaskQueue.js +0 -171
  402. package/dist/task/DrizzleTaskQueue.js.map +0 -1
  403. package/dist/task/TaskExecutor.d.ts +0 -82
  404. package/dist/task/TaskExecutor.js +0 -198
  405. package/dist/task/TaskExecutor.js.map +0 -1
  406. package/dist/task/index.d.ts +0 -10
  407. package/dist/task/index.js +0 -20
  408. package/dist/task/index.js.map +0 -1
  409. package/dist/task/schema.d.ts +0 -53
  410. package/dist/task/schema.js +0 -71
  411. package/dist/task/schema.js.map +0 -1
  412. package/dist/task/types.d.ts +0 -186
  413. package/dist/task/types.js +0 -12
  414. package/dist/task/types.js.map +0 -1
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VectorStoreService = void 0;
4
4
  const global_logger_factory_1 = require("global-logger-factory");
5
5
  const drizzle_solid_1 = require("@undefineds.co/drizzle-solid");
6
+ const models_1 = require("@undefineds.co/models");
6
7
  const crypto_1 = require("crypto");
7
8
  const AuthContext_1 = require("../auth/AuthContext");
8
9
  const solid_client_authn_node_1 = require("@inrupt/solid-client-authn-node");
@@ -116,7 +117,7 @@ class VectorStoreService {
116
117
  if (!db) {
117
118
  throw new Error('Failed to authenticate with Pod');
118
119
  }
119
- const store = await db.findByLocator(schema_1.VectorStore, { id });
120
+ const store = await db.findById(schema_1.VectorStore, id);
120
121
  if (!store) {
121
122
  throw new Error(`Vector store ${id} not found`);
122
123
  }
@@ -146,7 +147,7 @@ class VectorStoreService {
146
147
  updates.name = request.name;
147
148
  if (request.chunking_strategy !== undefined)
148
149
  updates.chunkingStrategy = request.chunking_strategy;
149
- await db.updateByLocator(schema_1.VectorStore, { id }, updates);
150
+ await db.updateById(schema_1.VectorStore, id, updates);
150
151
  return this.getVectorStore(id, auth);
151
152
  }
152
153
  /**
@@ -157,7 +158,7 @@ class VectorStoreService {
157
158
  if (!db) {
158
159
  throw new Error('Failed to authenticate with Pod');
159
160
  }
160
- await db.deleteByLocator(schema_1.VectorStore, { id });
161
+ await db.deleteById(schema_1.VectorStore, id);
161
162
  this.logger.info(`Deleted vector store ${id}`);
162
163
  return {
163
164
  id,
@@ -195,7 +196,7 @@ class VectorStoreService {
195
196
  if (existingFiles.length > 0) {
196
197
  // 文件已存在,更新状态
197
198
  fileIndexId = existingFiles[0].id;
198
- await db.updateByLocator(schema_1.IndexedFile, { id: fileIndexId }, {
199
+ await db.updateById(schema_1.IndexedFile, fileIndexId, {
199
200
  status: schema_1.FileIndexStatus.IN_PROGRESS,
200
201
  chunkingStrategy,
201
202
  indexedAt: new Date(),
@@ -230,7 +231,7 @@ class VectorStoreService {
230
231
  // 存储向量
231
232
  await this.upsertVector(aiConfig.embeddingModel, vectorId, embedding, accessToken);
232
233
  // 更新索引记录为 completed
233
- await db.updateByLocator(schema_1.IndexedFile, { id: fileIndexId }, {
234
+ await db.updateById(schema_1.IndexedFile, fileIndexId, {
234
235
  status: schema_1.FileIndexStatus.COMPLETED,
235
236
  usageBytes: content.length,
236
237
  lastError: null,
@@ -241,7 +242,7 @@ class VectorStoreService {
241
242
  catch (error) {
242
243
  // 更新索引记录为 failed
243
244
  const errorMsg = error instanceof Error ? error.message : String(error);
244
- await db.updateByLocator(schema_1.IndexedFile, { id: fileIndexId }, {
245
+ await db.updateById(schema_1.IndexedFile, fileIndexId, {
245
246
  status: schema_1.FileIndexStatus.FAILED,
246
247
  lastError: errorMsg,
247
248
  });
@@ -298,7 +299,7 @@ class VectorStoreService {
298
299
  await this.deleteVector(aiConfig.embeddingModel, fileRecord.vectorId, accessToken);
299
300
  }
300
301
  // 删除索引记录
301
- await db.deleteByLocator(schema_1.IndexedFile, { id: fileRecord.id });
302
+ await db.deleteById(schema_1.IndexedFile, fileRecord.id);
302
303
  this.logger.info(`Removed file index ${fileUrl}`);
303
304
  return { deleted: true };
304
305
  }
@@ -478,11 +479,10 @@ class VectorStoreService {
478
479
  return parts[parts.length - 1] || '';
479
480
  }
480
481
  extractModelId(uri) {
481
- const hashIndex = uri.lastIndexOf('#');
482
- if (hashIndex !== -1) {
483
- return uri.slice(hashIndex + 1);
484
- }
485
- return uri;
482
+ return (0, models_1.normalizeAIConfigModelId)(uri);
483
+ }
484
+ modelUri(model, provider = 'openai') {
485
+ return (0, models_1.aiConfigModelRef)(provider, model);
486
486
  }
487
487
  getPodBaseUrl(webId) {
488
488
  const url = new URL(webId);
@@ -551,23 +551,18 @@ class VectorStoreService {
551
551
  // 获取 provider 信息
552
552
  let baseUrl;
553
553
  let proxyUrl;
554
- if (activeCred.provider) {
554
+ let provider = (0, models_1.normalizeAIConfigProviderId)(activeCred.provider || activeCred.id);
555
+ if (provider) {
555
556
  const providers = await db.select().from(schema_1.Provider);
556
- const providerByUri = new Map();
557
- for (const p of providers) {
558
- const uri = p['@id'];
559
- if (uri)
560
- providerByUri.set(uri, p);
561
- providerByUri.set(p.id, p);
562
- }
563
- const provider = providerByUri.get(activeCred.provider);
564
- if (provider) {
565
- baseUrl = provider.baseUrl || undefined;
566
- proxyUrl = provider.proxyUrl || undefined;
557
+ const selection = (0, models_1.selectAIConfigCredential)(provider, credentials, providers);
558
+ if (selection) {
559
+ provider = selection.providerId;
560
+ baseUrl = selection.baseUrl;
561
+ proxyUrl = selection.proxyUrl;
567
562
  }
568
563
  }
569
564
  return {
570
- provider: activeCred.id,
565
+ provider: provider || activeCred.id,
571
566
  apiKey: activeCred.apiKey,
572
567
  baseUrl,
573
568
  proxyUrl,
@@ -625,18 +620,16 @@ class VectorStoreService {
625
620
  const currentModel = currentConfig?.embeddingModel;
626
621
  // 检查模型是否有变化
627
622
  const modelChanged = currentModel && currentModel !== newModel;
628
- const webId = (0, AuthContext_1.getWebId)(auth) ?? (0, AuthContext_1.getAccountId)(auth) ?? '';
629
- const podBaseUrl = this.getPodBaseUrl(webId);
630
- const modelUri = `${podBaseUrl}settings/ai/models.ttl#${newModel}`;
623
+ const modelUri = this.modelUri(newModel);
631
624
  try {
632
625
  // 检查配置是否已存在
633
626
  const configs = await db.select().from(schema_1.AIConfig);
634
627
  const existingConfig = configs.find((c) => c.id === 'config');
635
628
  if (existingConfig) {
636
629
  // 更新现有配置
637
- await db.updateByLocator(schema_1.AIConfig, { id: 'config' }, {
630
+ await db.updateById(schema_1.AIConfig, 'config', {
638
631
  embeddingModel: modelUri,
639
- previousModel: modelChanged ? `${podBaseUrl}settings/ai/models.ttl#${currentModel}` : existingConfig.previousModel,
632
+ previousModel: modelChanged ? this.modelUri(currentModel) : existingConfig.previousModel,
640
633
  migrationStatus: modelChanged ? schema_1.MigrationStatus.IN_PROGRESS : existingConfig.migrationStatus,
641
634
  migrationProgress: modelChanged ? 0 : existingConfig.migrationProgress,
642
635
  updatedAt: new Date(),
@@ -687,7 +680,7 @@ class VectorStoreService {
687
680
  const totalFiles = allFiles.length;
688
681
  if (totalFiles === 0) {
689
682
  // 无文件需要迁移
690
- await db.updateByLocator(schema_1.AIConfig, { id: 'config' }, {
683
+ await db.updateById(schema_1.AIConfig, 'config', {
691
684
  migrationStatus: schema_1.MigrationStatus.COMPLETED,
692
685
  migrationProgress: 100,
693
686
  updatedAt: new Date(),
@@ -709,14 +702,14 @@ class VectorStoreService {
709
702
  }
710
703
  // 更新迁移进度
711
704
  const progress = Math.round(((completedFiles + failedFiles) / totalFiles) * 100);
712
- await db.updateByLocator(schema_1.AIConfig, { id: 'config' }, {
705
+ await db.updateById(schema_1.AIConfig, 'config', {
713
706
  migrationProgress: progress,
714
707
  updatedAt: new Date(),
715
708
  });
716
709
  }
717
710
  // 标记迁移完成
718
711
  const finalStatus = failedFiles === 0 ? schema_1.MigrationStatus.COMPLETED : schema_1.MigrationStatus.FAILED;
719
- await db.updateByLocator(schema_1.AIConfig, { id: 'config' }, {
712
+ await db.updateById(schema_1.AIConfig, 'config', {
720
713
  migrationStatus: finalStatus,
721
714
  migrationProgress: 100,
722
715
  updatedAt: new Date(),
@@ -725,7 +718,7 @@ class VectorStoreService {
725
718
  }
726
719
  catch (error) {
727
720
  this.logger.error(`Migration error: ${error}`);
728
- await db.updateByLocator(schema_1.AIConfig, { id: 'config' }, {
721
+ await db.updateById(schema_1.AIConfig, 'config', {
729
722
  migrationStatus: schema_1.MigrationStatus.FAILED,
730
723
  updatedAt: new Date(),
731
724
  });
@@ -1 +1 @@
1
- {"version":3,"file":"VectorStoreService.js","sourceRoot":"","sources":["../../../src/api/service/VectorStoreService.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\nimport { drizzle, eq } from '@undefineds.co/drizzle-solid';\nimport { randomBytes } from 'crypto';\nimport type { AuthContext } from '../auth/AuthContext';\nimport { getWebId, getAccountId, isSolidAuth } from '../auth/AuthContext';\nimport type { EmbeddingService } from '../../ai/service/EmbeddingService';\nimport type { AiCredential } from '../../ai/service/types';\nimport { Session } from '@inrupt/solid-client-authn-node';\n\nimport {\n AIConfig,\n VectorStore,\n IndexedFile,\n Model,\n Provider,\n VectorStoreStatus,\n ChunkingStrategy,\n FileIndexStatus,\n MigrationStatus,\n} from '../../ai/schema';\nimport { Credential } from '../../credential/schema/tables';\nimport { ServiceType, CredentialStatus } from '../../credential/schema/types';\n\nconst schema = {\n aiConfig: AIConfig,\n vectorStore: VectorStore,\n indexedFile: IndexedFile,\n model: Model,\n provider: Provider,\n credential: Credential,\n};\n\n// ============================================\n// Types - OpenAI Compatible\n// ============================================\n\n/**\n * 创建 Vector Store 请求\n */\nexport interface CreateVectorStoreRequest {\n /** 知识库名称 */\n name?: string;\n /** Container URL */\n url: string;\n /** Chunking 策略 */\n chunking_strategy?: 'auto' | 'static';\n /** 元数据 */\n metadata?: Record<string, string>;\n}\n\n/**\n * 修改 Vector Store 请求\n */\nexport interface ModifyVectorStoreRequest {\n name?: string;\n chunking_strategy?: 'auto' | 'static';\n metadata?: Record<string, string>;\n}\n\n/**\n * Vector Store 对象(OpenAI 兼容格式)\n */\nexport interface VectorStoreObject {\n id: string;\n object: 'vector_store';\n created_at: number;\n name: string;\n status: 'in_progress' | 'completed' | 'expired';\n usage_bytes: number;\n file_counts: {\n in_progress: number;\n completed: number;\n failed: number;\n cancelled: number;\n total: number;\n };\n last_active_at: number | null;\n metadata: Record<string, string>;\n // Xpod 扩展字段\n url: string;\n chunking_strategy: string;\n}\n\n/**\n * Pod AI 配置\n */\nexport interface PodAIConfig {\n embeddingModel: string;\n migrationStatus: 'idle' | 'in_progress' | 'completed' | 'failed';\n previousModel?: string;\n migrationProgress?: number;\n}\n\n/**\n * 搜索请求\n */\nexport interface SearchRequest {\n query: string | string[];\n max_num_results?: number;\n filters?: Record<string, any>;\n ranking_options?: {\n ranker?: string;\n score_threshold?: number;\n };\n rewrite_query?: boolean;\n}\n\n/**\n * 搜索结果\n */\nexport interface SearchResult {\n file_id: string;\n file_url: string;\n filename: string;\n score: number;\n attributes: Record<string, any>;\n content: Array<{ type: 'text'; text: string }>;\n}\n\nexport interface VectorStoreServiceOptions {\n /** CSS base URL */\n cssBaseUrl: string;\n /** Token endpoint for login */\n tokenEndpoint: string;\n /** Embedding service */\n embeddingService: EmbeddingService;\n /** Webhook URL for receiving notifications (optional) */\n webhookUrl?: string;\n}\n\n/**\n * VectorStoreService - 知识库管理服务\n *\n * 提供 OpenAI 兼容的 Vector Store API\n */\nexport class VectorStoreService {\n private readonly logger = getLoggerFor(this);\n private readonly cssBaseUrl: string;\n private readonly tokenEndpoint: string;\n private readonly embeddingService: EmbeddingService;\n private readonly webhookUrl?: string;\n\n public constructor(options: VectorStoreServiceOptions) {\n this.cssBaseUrl = options.cssBaseUrl.replace(/\\/$/, '');\n this.tokenEndpoint = options.tokenEndpoint;\n this.embeddingService = options.embeddingService;\n this.webhookUrl = options.webhookUrl;\n }\n\n // ============================================\n // Vector Store CRUD\n // ============================================\n\n /**\n * 创建 Vector Store(配置文件夹为知识库)\n */\n public async createVectorStore(\n request: CreateVectorStoreRequest,\n auth: AuthContext,\n accessToken?: string,\n ): Promise<VectorStoreObject> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n // 生成 ID\n const id = this.generateId();\n const now = new Date();\n const containerUri = request.url;\n\n // 插入记录(不再存储 model,model 从全局配置获取)\n await db.insert(VectorStore).values({\n id,\n name: request.name || this.extractContainerName(containerUri),\n container: containerUri,\n chunkingStrategy: request.chunking_strategy || ChunkingStrategy.AUTO,\n status: VectorStoreStatus.COMPLETED,\n createdAt: now,\n lastActiveAt: now,\n });\n\n this.logger.info(`Created vector store ${id} for container ${containerUri}`);\n\n // 尝试注册 webhook 订阅(如果配置了 webhookUrl)\n if (this.webhookUrl && accessToken) {\n try {\n await this.subscribeToContainer(containerUri, accessToken);\n this.logger.info(`Subscribed to container ${containerUri} for webhook notifications`);\n } catch (error) {\n // 订阅失败不影响 VectorStore 创建,只记录警告\n this.logger.warn(`Failed to subscribe to container ${containerUri}: ${error}`);\n }\n }\n\n return this.buildVectorStoreObject(id, {\n name: request.name || this.extractContainerName(containerUri),\n containerUrl: containerUri,\n chunkingStrategy: request.chunking_strategy || 'auto',\n status: 'completed',\n createdAt: now,\n lastActiveAt: now,\n });\n }\n\n /**\n * 列出所有 Vector Store\n */\n public async listVectorStores(\n auth: AuthContext,\n options?: { limit?: number; order?: 'asc' | 'desc'; after?: string; before?: string },\n ): Promise<{ object: 'list'; data: VectorStoreObject[]; has_more: boolean }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n const stores = await db.select().from(VectorStore) as any[];\n\n // 排序\n const order = options?.order || 'desc';\n stores.sort((a: any, b: any) => {\n const aTime = a.createdAt?.getTime() || 0;\n const bTime = b.createdAt?.getTime() || 0;\n return order === 'desc' ? bTime - aTime : aTime - bTime;\n });\n\n // 分页\n const limit = options?.limit || 20;\n const data = stores.slice(0, limit).map((store: any) => this.buildVectorStoreObject(store.id, {\n name: store.name || '',\n containerUrl: store.container || '',\n chunkingStrategy: store.chunkingStrategy || 'auto',\n status: (store.status as any) || 'completed',\n createdAt: store.createdAt || new Date(),\n lastActiveAt: store.lastActiveAt || null,\n }));\n\n return {\n object: 'list',\n data,\n has_more: stores.length > limit,\n };\n }\n\n /**\n * 获取单个 Vector Store\n */\n public async getVectorStore(id: string, auth: AuthContext): Promise<VectorStoreObject> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n const store = await db.findByLocator(VectorStore, { id });\n if (!store) {\n throw new Error(`Vector store ${id} not found`);\n }\n\n // 获取 file_counts(基于 Container 前缀匹配)\n const fileCounts = await this.getFileCounts(store.container || '', auth);\n\n return this.buildVectorStoreObject(store.id, {\n name: store.name || '',\n containerUrl: store.container || '',\n chunkingStrategy: store.chunkingStrategy || 'auto',\n status: (store.status as any) || 'completed',\n createdAt: store.createdAt || new Date(),\n lastActiveAt: store.lastActiveAt || null,\n fileCounts,\n });\n }\n\n /**\n * 修改 Vector Store\n */\n public async modifyVectorStore(\n id: string,\n request: ModifyVectorStoreRequest,\n auth: AuthContext,\n ): Promise<VectorStoreObject> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n // 构建更新数据(不再支持修改 model,model 是全局配置)\n const updates: Partial<typeof VectorStore.$inferInsert> = {};\n if (request.name !== undefined) updates.name = request.name;\n if (request.chunking_strategy !== undefined) updates.chunkingStrategy = request.chunking_strategy;\n\n await db.updateByLocator(VectorStore, { id }, updates);\n\n return this.getVectorStore(id, auth);\n }\n\n /**\n * 删除 Vector Store\n */\n public async deleteVectorStore(\n id: string,\n auth: AuthContext,\n ): Promise<{ id: string; object: 'vector_store.deleted'; deleted: boolean }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n await db.deleteByLocator(VectorStore, { id });\n\n this.logger.info(`Deleted vector store ${id}`);\n\n return {\n id,\n object: 'vector_store.deleted',\n deleted: true,\n };\n }\n\n // ============================================\n // File Index Management (for webhook)\n // ============================================\n\n /**\n * 索引文件(由 webhook 调用)\n *\n * @param vectorStoreId Vector Store ID\n * @param fileUrl 文件 URL\n * @param auth 认证上下文\n * @param accessToken 访问令牌\n */\n public async indexFile(\n fileUrl: string,\n auth: AuthContext,\n accessToken: string,\n ): Promise<{ id: string; status: string; vectorId: number }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n // 获取全局 AI 配置(embedding model)\n const aiConfig = await this.getAIConfig(auth);\n if (!aiConfig) {\n throw new Error('No AI configuration found. Please configure an embedding model first.');\n }\n\n // 查找最近的父级 VectorStore 获取分块策略\n const chunkingStrategy = await this.getChunkingStrategyForFile(fileUrl, auth);\n\n // 检查文件是否已索引\n const existingFiles = await db.select().from(IndexedFile).where(\n eq(IndexedFile.fileUrl, fileUrl),\n );\n\n const vectorId = this.hashSubjectAspect(fileUrl, 'content');\n let fileIndexId: string;\n\n if (existingFiles.length > 0) {\n // 文件已存在,更新状态\n fileIndexId = existingFiles[0].id;\n await db.updateByLocator(IndexedFile, { id: fileIndexId }, {\n status: FileIndexStatus.IN_PROGRESS,\n chunkingStrategy,\n indexedAt: new Date(),\n });\n } else {\n // 创建新的索引记录\n fileIndexId = `idx_${randomBytes(8).toString('hex')}`;\n await db.insert(IndexedFile).values({\n id: fileIndexId,\n fileUrl,\n vectorId,\n chunkingStrategy,\n status: FileIndexStatus.IN_PROGRESS,\n usageBytes: 0,\n indexedAt: new Date(),\n });\n }\n\n try {\n // 获取 AI credential\n const credential = await this.getAiCredential(auth);\n if (!credential) {\n throw new Error('No AI credential found');\n }\n\n // 读取文件内容\n const content = await this.fetchResourceContent(fileUrl, accessToken);\n if (!content || content.trim().length === 0) {\n throw new Error(`File ${fileUrl} has no indexable content`);\n }\n\n // 生成 embedding(使用全局 model)\n const embedding = await this.embeddingService.embed(content, credential, aiConfig.embeddingModel);\n\n // 存储向量\n await this.upsertVector(aiConfig.embeddingModel, vectorId, embedding, accessToken);\n\n // 更新索引记录为 completed\n await db.updateByLocator(IndexedFile, { id: fileIndexId }, {\n status: FileIndexStatus.COMPLETED,\n usageBytes: content.length,\n lastError: null,\n });\n\n this.logger.info(`Indexed file ${fileUrl} with model ${aiConfig.embeddingModel}`);\n\n return { id: fileIndexId, status: 'completed', vectorId };\n } catch (error) {\n // 更新索引记录为 failed\n const errorMsg = error instanceof Error ? error.message : String(error);\n await db.updateByLocator(IndexedFile, { id: fileIndexId }, {\n status: FileIndexStatus.FAILED,\n lastError: errorMsg,\n });\n\n this.logger.error(`Failed to index file ${fileUrl}: ${errorMsg}`);\n throw error;\n }\n }\n\n /**\n * 获取文件应使用的分块策略(查找最近的父级 VectorStore)\n */\n private async getChunkingStrategyForFile(fileUrl: string, auth: AuthContext): Promise<string> {\n const db = await this.getPodDb(auth);\n if (!db) return ChunkingStrategy.AUTO;\n\n // 获取所有 VectorStore\n const allStores = await db.select().from(VectorStore) as any[];\n\n // 找到所有是 fileUrl 前缀的 VectorStore\n const matchedStores = allStores.filter((store: any) => {\n if (!store.container) return false;\n const containerUrl = store.container.endsWith('/') ? store.container : store.container + '/';\n return fileUrl.startsWith(containerUrl);\n });\n\n if (matchedStores.length === 0) {\n return ChunkingStrategy.AUTO;\n }\n\n // 找最长前缀(最近的父级)\n matchedStores.sort((a: any, b: any) => (b.container?.length || 0) - (a.container?.length || 0));\n return matchedStores[0].chunkingStrategy || ChunkingStrategy.AUTO;\n }\n\n /**\n * 删除文件索引(由 webhook 调用)\n */\n public async removeFileIndex(\n fileUrl: string,\n auth: AuthContext,\n accessToken: string,\n ): Promise<{ deleted: boolean }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n // 获取全局 AI 配置\n const aiConfig = await this.getAIConfig(auth);\n if (!aiConfig) {\n this.logger.warn(`No AI config found, cannot delete vector for ${fileUrl}`);\n return { deleted: false };\n }\n\n // 查找文件索引记录\n const files = await db.select().from(IndexedFile).where(\n eq(IndexedFile.fileUrl, fileUrl),\n );\n\n if (files.length === 0) {\n this.logger.warn(`File index record not found for ${fileUrl}`);\n return { deleted: false };\n }\n\n const fileRecord = files[0];\n\n // 从向量存储中删除\n if (fileRecord.vectorId) {\n await this.deleteVector(aiConfig.embeddingModel, fileRecord.vectorId, accessToken);\n }\n\n // 删除索引记录\n await db.deleteByLocator(IndexedFile, { id: fileRecord.id });\n\n this.logger.info(`Removed file index ${fileUrl}`);\n return { deleted: true };\n }\n\n /**\n * 获取 Container 下的 file_counts 统计(基于 fileUrl 前缀匹配)\n */\n public async getFileCounts(\n containerUrl: string,\n auth: AuthContext,\n ): Promise<{ in_progress: number; completed: number; failed: number; cancelled: number; total: number }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n return { in_progress: 0, completed: 0, failed: 0, cancelled: 0, total: 0 };\n }\n\n // 获取所有索引文件,过滤属于该 Container 的\n const allFiles = await db.select().from(IndexedFile) as any[];\n const containerPrefix = containerUrl.endsWith('/') ? containerUrl : containerUrl + '/';\n const files = allFiles.filter((f: any) => f.fileUrl?.startsWith(containerPrefix));\n\n const counts = {\n in_progress: 0,\n completed: 0,\n failed: 0,\n cancelled: 0,\n total: files.length,\n };\n\n for (const file of files) {\n switch (file.status) {\n case FileIndexStatus.IN_PROGRESS:\n counts.in_progress++;\n break;\n case FileIndexStatus.COMPLETED:\n counts.completed++;\n break;\n case FileIndexStatus.FAILED:\n counts.failed++;\n break;\n case FileIndexStatus.CANCELLED:\n counts.cancelled++;\n break;\n }\n }\n\n return counts;\n }\n\n /**\n * 通过 vectorId 查找文件 URL(供 search 使用)\n * 注意:文件只索引一份,用 vectorId 即可查找\n */\n public async getFileUrlByVectorId(\n vectorId: number,\n auth: AuthContext,\n ): Promise<string | null> {\n const db = await this.getPodDb(auth);\n if (!db) return null;\n\n const files = await db.select().from(IndexedFile).where(\n eq(IndexedFile.vectorId, vectorId),\n );\n\n return files.length > 0 ? files[0].fileUrl : null;\n }\n\n /**\n * 根据 Container URL 查找 VectorStore\n */\n public async findVectorStoreByContainer(\n containerUrl: string,\n auth: AuthContext,\n ): Promise<VectorStoreObject | null> {\n const db = await this.getPodDb(auth);\n if (!db) return null;\n\n const stores = await db.select().from(VectorStore).where(\n eq(VectorStore.container, containerUrl),\n );\n\n if (stores.length === 0) return null;\n\n const store = stores[0];\n return this.buildVectorStoreObject(store.id, {\n name: store.name || '',\n containerUrl: store.container || '',\n chunkingStrategy: store.chunkingStrategy || 'auto',\n status: (store.status as any) || 'completed',\n createdAt: store.createdAt || new Date(),\n lastActiveAt: store.lastActiveAt || null,\n });\n }\n\n /**\n * 根据文件 URL 查找所有匹配的 VectorStore(包括父级容器)\n *\n * 例如:文件 https://alice.pod/A/B/c.txt 会匹配:\n * - https://alice.pod/A/B/ (直接父级)\n * - https://alice.pod/A/ (祖先级)\n * - https://alice.pod/ (Pod 根)\n *\n * 这样文件可以被索引到多个知识库中\n */\n public async findVectorStoresByFileUrl(\n fileUrl: string,\n auth: AuthContext,\n ): Promise<VectorStoreObject[]> {\n const db = await this.getPodDb(auth);\n if (!db) return [];\n\n // 获取所有 VectorStore\n const allStores = await db.select().from(VectorStore) as any[];\n\n // 过滤出 container 是 fileUrl 前缀的 VectorStore\n const matchedStores = allStores.filter((store: any) => {\n if (!store.container) return false;\n // 确保 container URL 以 / 结尾\n const containerUrl = store.container.endsWith('/') ? store.container : store.container + '/';\n return fileUrl.startsWith(containerUrl);\n });\n\n // 转换为 VectorStoreObject\n return matchedStores.map((store: any) => this.buildVectorStoreObject(store.id, {\n name: store.name || '',\n containerUrl: store.container || '',\n chunkingStrategy: store.chunkingStrategy || 'auto',\n status: (store.status as any) || 'completed',\n createdAt: store.createdAt || new Date(),\n lastActiveAt: store.lastActiveAt || null,\n }));\n }\n\n // ============================================\n // Search\n // ============================================\n\n /**\n * 搜索 Vector Store\n */\n public async search(\n vectorStoreId: string,\n request: SearchRequest,\n auth: AuthContext,\n accessToken: string,\n ): Promise<{ object: 'vector_store.search_results.page'; search_query: string; data: SearchResult[]; has_more: boolean }> {\n const store = await this.getVectorStore(vectorStoreId, auth);\n\n // 获取 AI credential\n const credential = await this.getAiCredential(auth);\n if (!credential) {\n throw new Error('No AI credential found');\n }\n\n // 获取全局 AI 配置中的 embedding model\n const aiConfig = await this.getAIConfig(auth);\n if (!aiConfig?.embeddingModel) {\n throw new Error('No embedding model configured. Please set up AI configuration first.');\n }\n\n const queryText = Array.isArray(request.query) ? request.query.join(' ') : request.query;\n\n // 生成 query embedding(使用全局模型)\n const queryEmbedding = await this.embeddingService.embed(queryText, credential, aiConfig.embeddingModel);\n\n // 调用 CSS vector search,使用 subjectPrefix 过滤只搜索该 VectorStore 的文件\n const limit = request.max_num_results || 10;\n const results = await this.searchVectors(aiConfig.embeddingModel, queryEmbedding, limit, accessToken, {\n subjectPrefix: store.url, // Container URL 作为 subject 前缀\n });\n\n // 构建搜索结果,使用 vectorId -> fileUrl 映射\n const searchResults: SearchResult[] = [];\n for (const r of results) {\n const vectorId = typeof r.id === 'number' ? r.id : parseInt(String(r.id), 10);\n const fileUrl = await this.getFileUrlByVectorId(vectorId, auth);\n\n searchResults.push({\n file_id: String(r.id),\n file_url: fileUrl || '',\n filename: fileUrl ? this.extractFilename(fileUrl) : '',\n score: r.score,\n attributes: {},\n content: [], // TODO: 可选返回内容片段\n });\n }\n\n return {\n object: 'vector_store.search_results.page',\n search_query: queryText,\n data: searchResults,\n has_more: false,\n };\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private generateId(): string {\n return `vs_${randomBytes(12).toString('hex')}`;\n }\n\n /**\n * Hash subject + aspect 为向量 ID(供 webhook 索引使用)\n */\n public hashSubjectAspect(subject: string, aspect: string): number {\n const str = `${subject}|${aspect}`;\n let hash = 2166136261;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return Math.abs(hash);\n }\n\n private extractContainerName(url: string): string {\n const parts = url.replace(/\\/$/, '').split('/');\n return parts[parts.length - 1] || 'Unnamed';\n }\n\n private extractFilename(url: string): string {\n const parts = url.split('/');\n return parts[parts.length - 1] || '';\n }\n\n private extractModelId(uri: string): string {\n const hashIndex = uri.lastIndexOf('#');\n if (hashIndex !== -1) {\n return uri.slice(hashIndex + 1);\n }\n return uri;\n }\n\n private getPodBaseUrl(webId: string): string {\n const url = new URL(webId);\n url.hash = '';\n let path = url.pathname;\n if (path.endsWith('/profile/card')) {\n path = path.slice(0, -'/profile/card'.length);\n }\n if (!path.endsWith('/')) {\n path = path + '/';\n }\n return `${url.origin}${path}`;\n }\n\n private buildVectorStoreObject(\n id: string,\n data: {\n name: string;\n containerUrl: string;\n chunkingStrategy: string;\n status: 'in_progress' | 'completed' | 'expired';\n createdAt: Date;\n lastActiveAt: Date | null;\n fileCounts?: { in_progress: number; completed: number; failed: number; cancelled: number; total: number };\n usageBytes?: number;\n },\n ): VectorStoreObject {\n return {\n id,\n object: 'vector_store',\n created_at: Math.floor(data.createdAt.getTime() / 1000),\n name: data.name,\n status: data.status,\n usage_bytes: data.usageBytes || 0,\n file_counts: data.fileCounts || {\n in_progress: 0,\n completed: 0,\n failed: 0,\n cancelled: 0,\n total: 0,\n },\n last_active_at: data.lastActiveAt ? Math.floor(data.lastActiveAt.getTime() / 1000) : null,\n metadata: {},\n url: data.containerUrl,\n chunking_strategy: data.chunkingStrategy,\n };\n }\n\n private async getPodDb(auth: AuthContext): Promise<any | null> {\n if (!isSolidAuth(auth) || !auth.clientId || !auth.clientSecret) {\n this.logger.debug('No clientId or clientSecret in auth context');\n return null;\n }\n\n const session = new Session();\n try {\n await session.login({\n oidcIssuer: new URL(this.tokenEndpoint).origin,\n clientId: auth.clientId,\n clientSecret: auth.clientSecret,\n });\n\n if (!session.info.isLoggedIn || !session.info.webId) {\n throw new Error('Login failed');\n }\n\n return drizzle({ fetch: session.fetch, info: { webId: session.info.webId, isLoggedIn: true } } as any, { schema }) as any;\n } catch (error) {\n this.logger.error(`Failed to login: ${error}`);\n return null;\n }\n }\n\n private async getAiCredential(auth: AuthContext): Promise<AiCredential | undefined> {\n const db = await this.getPodDb(auth);\n if (!db) return undefined;\n\n try {\n const credentials = await db.select().from(Credential).where(\n eq(Credential.service, ServiceType.AI),\n );\n\n const activeCred = credentials.find((c: any) => c.status === CredentialStatus.ACTIVE);\n if (!activeCred || !activeCred.apiKey) return undefined;\n\n // 获取 provider 信息\n let baseUrl: string | undefined;\n let proxyUrl: string | undefined;\n\n if (activeCred.provider) {\n const providers = await db.select().from(Provider);\n const providerByUri = new Map<string, any>();\n for (const p of providers) {\n const uri = (p as any)['@id'] as string | undefined;\n if (uri) providerByUri.set(uri, p);\n providerByUri.set(p.id, p);\n }\n const provider = providerByUri.get(activeCred.provider);\n if (provider) {\n baseUrl = provider.baseUrl || undefined;\n proxyUrl = provider.proxyUrl || undefined;\n }\n }\n\n return {\n provider: activeCred.id,\n apiKey: activeCred.apiKey,\n baseUrl,\n proxyUrl,\n };\n } catch (error) {\n this.logger.error(`Failed to get AI credential: ${error}`);\n return undefined;\n }\n }\n\n /**\n * 获取 Pod 级别的 AI 配置(全局 embedding model)\n */\n public async getAIConfig(auth: AuthContext): Promise<PodAIConfig | null> {\n const db = await this.getPodDb(auth);\n if (!db) return null;\n\n try {\n const configs = await db.select().from(AIConfig);\n const config = configs.find((c: any) => c.id === 'config');\n\n if (!config || !config.embeddingModel) {\n // 如果没有配置,尝试使用默认模型\n const models = await db.select().from(Model);\n const defaultModel = models.find((m: any) => m.modelType === 'embedding') || models[0];\n if (defaultModel) {\n return {\n embeddingModel: defaultModel.id,\n migrationStatus: 'idle',\n };\n }\n return null;\n }\n\n return {\n embeddingModel: this.extractModelId(config.embeddingModel),\n migrationStatus: (config.migrationStatus as any) || 'idle',\n previousModel: config.previousModel ? this.extractModelId(config.previousModel) : undefined,\n migrationProgress: config.migrationProgress || undefined,\n };\n } catch (error) {\n this.logger.error(`Failed to get AI config: ${error}`);\n return null;\n }\n }\n\n /**\n * 设置全局 embedding model\n * 如果更换了模型,自动触发迁移(后台重新索引所有文件)\n */\n public async setEmbeddingModel(\n newModel: string,\n auth: AuthContext,\n accessToken: string,\n ): Promise<{ success: boolean; migrationTriggered: boolean; message: string }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n const currentConfig = await this.getAIConfig(auth);\n const currentModel = currentConfig?.embeddingModel;\n\n // 检查模型是否有变化\n const modelChanged = currentModel && currentModel !== newModel;\n\n const webId = getWebId(auth) ?? getAccountId(auth) ?? '';\n const podBaseUrl = this.getPodBaseUrl(webId);\n const modelUri = `${podBaseUrl}settings/ai/models.ttl#${newModel}`;\n\n try {\n // 检查配置是否已存在\n const configs = await db.select().from(AIConfig);\n const existingConfig = configs.find((c: any) => c.id === 'config');\n\n if (existingConfig) {\n // 更新现有配置\n await db.updateByLocator(AIConfig, { id: 'config' }, {\n embeddingModel: modelUri,\n previousModel: modelChanged ? `${podBaseUrl}settings/ai/models.ttl#${currentModel}` : existingConfig.previousModel,\n migrationStatus: modelChanged ? MigrationStatus.IN_PROGRESS : existingConfig.migrationStatus,\n migrationProgress: modelChanged ? 0 : existingConfig.migrationProgress,\n updatedAt: new Date(),\n });\n } else {\n // 创建新配置\n await db.insert(AIConfig).values({\n id: 'config',\n embeddingModel: modelUri,\n migrationStatus: MigrationStatus.IDLE,\n migrationProgress: 0,\n updatedAt: new Date(),\n });\n }\n\n this.logger.info(`Set embedding model to ${newModel}`);\n\n // 如果模型变化,在后台启动迁移\n if (modelChanged) {\n this.logger.info(`Model changed from ${currentModel} to ${newModel}, triggering migration`);\n // 异步执行迁移,不阻塞响应\n this.startMigration(auth, accessToken).catch(error => {\n this.logger.error(`Migration failed: ${error}`);\n });\n }\n\n return {\n success: true,\n migrationTriggered: modelChanged === true,\n message: modelChanged\n ? `Model updated to ${newModel}. Migration started to re-index all files.`\n : `Model set to ${newModel}.`,\n };\n } catch (error) {\n this.logger.error(`Failed to set embedding model: ${error}`);\n throw error;\n }\n }\n\n /**\n * 开始迁移:重新索引所有文件\n */\n private async startMigration(auth: AuthContext, accessToken: string): Promise<void> {\n const db = await this.getPodDb(auth);\n if (!db) return;\n\n try {\n // 获取所有已索引的文件\n const allFiles = await db.select().from(IndexedFile);\n const totalFiles = allFiles.length;\n\n if (totalFiles === 0) {\n // 无文件需要迁移\n await db.updateByLocator(AIConfig, { id: 'config' }, {\n migrationStatus: MigrationStatus.COMPLETED,\n migrationProgress: 100,\n updatedAt: new Date(),\n });\n return;\n }\n\n this.logger.info(`Starting migration for ${totalFiles} files`);\n\n let completedFiles = 0;\n let failedFiles = 0;\n\n for (const file of allFiles) {\n try {\n // 重新索引每个文件\n await this.indexFile(file.fileUrl, auth, accessToken);\n completedFiles++;\n } catch (error) {\n failedFiles++;\n this.logger.error(`Failed to re-index ${file.fileUrl}: ${error}`);\n }\n\n // 更新迁移进度\n const progress = Math.round(((completedFiles + failedFiles) / totalFiles) * 100);\n await db.updateByLocator(AIConfig, { id: 'config' }, {\n migrationProgress: progress,\n updatedAt: new Date(),\n });\n }\n\n // 标记迁移完成\n const finalStatus = failedFiles === 0 ? MigrationStatus.COMPLETED : MigrationStatus.FAILED;\n await db.updateByLocator(AIConfig, { id: 'config' }, {\n migrationStatus: finalStatus,\n migrationProgress: 100,\n updatedAt: new Date(),\n });\n\n this.logger.info(`Migration completed: ${completedFiles} success, ${failedFiles} failed`);\n } catch (error) {\n this.logger.error(`Migration error: ${error}`);\n await db.updateByLocator(AIConfig, { id: 'config' }, {\n migrationStatus: MigrationStatus.FAILED,\n updatedAt: new Date(),\n });\n }\n }\n\n /**\n * 获取资源内容(供 webhook 索引使用)\n */\n public async fetchResourceContent(url: string, accessToken: string): Promise<string> {\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n Accept: 'text/turtle, application/ld+json, text/plain, text/markdown, text/html, */*',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.status}`);\n }\n\n const contentType = response.headers.get('Content-Type') || '';\n const body = await response.text();\n return this.extractText(body, contentType);\n }\n\n private extractText(body: string, contentType: string): string {\n const ct = contentType.toLowerCase();\n\n if (ct.includes('text/turtle') || ct.includes('application/n-triples')) {\n return this.extractTextFromTurtle(body);\n }\n if (ct.includes('application/ld+json') || ct.includes('application/json')) {\n return this.extractTextFromJsonLd(body);\n }\n if (ct.includes('text/html')) {\n return this.extractTextFromHtml(body);\n }\n return body;\n }\n\n private extractTextFromTurtle(turtle: string): string {\n const literals: string[] = [];\n const tripleQuoteRegex = /\"\"\"([^]*?)\"\"\"/g;\n const singleQuoteRegex = /\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"/g;\n\n let match;\n while ((match = tripleQuoteRegex.exec(turtle)) !== null) {\n if (match[1].trim().length > 0) literals.push(match[1].trim());\n }\n\n const withoutTriple = turtle.replace(/\"\"\"[^]*?\"\"\"/g, '');\n while ((match = singleQuoteRegex.exec(withoutTriple)) !== null) {\n const value = match[1].trim();\n if (value.length > 3 && !value.startsWith('http') && !value.startsWith('urn:')) {\n literals.push(value);\n }\n }\n return literals.join('\\n');\n }\n\n private extractTextFromJsonLd(jsonStr: string): string {\n try {\n const json = JSON.parse(jsonStr);\n const texts: string[] = [];\n const extract = (obj: any): void => {\n if (typeof obj === 'string' && obj.length > 3 && !obj.startsWith('http')) {\n texts.push(obj);\n } else if (Array.isArray(obj)) {\n obj.forEach(extract);\n } else if (obj && typeof obj === 'object') {\n for (const [key, value] of Object.entries(obj)) {\n if (!key.startsWith('@')) extract(value);\n }\n }\n };\n extract(json);\n return texts.join('\\n');\n } catch {\n return jsonStr;\n }\n }\n\n private extractTextFromHtml(html: string): string {\n let text = html.replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, '');\n text = text.replace(/<style[^>]*>[\\s\\S]*?<\\/style>/gi, '');\n text = text.replace(/<[^>]+>/g, ' ');\n text = text.replace(/\\s+/g, ' ').trim();\n return text;\n }\n\n /**\n * Upsert 向量到 CSS(供 webhook 索引使用)\n */\n public async upsertVector(model: string, id: number, vector: number[], accessToken: string): Promise<void> {\n const url = `${this.cssBaseUrl}/-/vector/upsert`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify({ model, vectors: [{ id, vector }] }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Vector upsert failed: ${response.status} ${errorText}`);\n }\n }\n\n /**\n * 删除向量(供 webhook 索引使用)\n */\n public async deleteVector(model: string, id: number, accessToken: string): Promise<void> {\n const url = `${this.cssBaseUrl}/-/vector/delete`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify({ model, ids: [id] }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Vector delete failed: ${response.status} ${errorText}`);\n }\n }\n\n private async searchVectors(\n model: string,\n vector: number[],\n limit: number,\n accessToken: string,\n options?: { subjectPrefix?: string },\n ): Promise<any[]> {\n const url = `${this.cssBaseUrl}/-/vector/search`;\n \n const body: Record<string, any> = { model, vector, limit };\n \n // 添加 subject 前缀过滤(限定搜索范围到特定 Container)\n if (options?.subjectPrefix) {\n body.filter = {\n subject: { $startsWith: options.subjectPrefix },\n };\n }\n \n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(`Vector search failed: ${response.status}`);\n }\n\n const data = await response.json() as { results?: any[] };\n return data.results || [];\n }\n\n // ============================================\n // Webhook Subscription\n // ============================================\n\n /**\n * 订阅 Container 的变更通知(WebhookChannel2023)\n *\n * @param containerUrl Container URL\n * @param accessToken 访问令牌\n */\n private async subscribeToContainer(containerUrl: string, accessToken: string): Promise<void> {\n if (!this.webhookUrl) {\n throw new Error('Webhook URL not configured');\n }\n\n // 1. 发现订阅端点\n const subscriptionEndpoint = await this.discoverNotificationEndpoint(containerUrl, accessToken);\n if (!subscriptionEndpoint) {\n throw new Error(`No notification endpoint found for ${containerUrl}`);\n }\n\n // 2. 创建 webhook 订阅\n const subscriptionRequest = {\n '@context': ['https://www.w3.org/ns/solid/notification/v1'],\n type: 'WebhookChannel2023',\n topic: containerUrl,\n sendTo: this.webhookUrl,\n };\n\n const response = await fetch(subscriptionEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/ld+json',\n Accept: 'application/ld+json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify(subscriptionRequest),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Subscription failed: ${response.status} ${errorText}`);\n }\n\n const result = await response.json();\n this.logger.info(`Created webhook subscription: ${JSON.stringify(result)}`);\n }\n\n /**\n * 发现 Solid Notification 端点\n *\n * 通过 HEAD 请求获取 Link header 中的 describedby,然后获取订阅端点\n */\n private async discoverNotificationEndpoint(resourceUrl: string, accessToken: string): Promise<string | null> {\n // 方法 1:直接使用已知的 CSS 端点格式\n // CSS 的 webhook 订阅端点通常是 /.notifications/WebhookChannel2023/\n const url = new URL(resourceUrl);\n const webhookEndpoint = `${url.origin}/.notifications/WebhookChannel2023/`;\n\n // 验证端点是否存在\n try {\n const response = await fetch(webhookEndpoint, {\n method: 'GET',\n headers: {\n Accept: 'application/ld+json',\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (response.ok) {\n return webhookEndpoint;\n }\n } catch {\n // 忽略错误,尝试其他方法\n }\n\n // 方法 2:通过 describedby Link header 发现\n try {\n const headResponse = await fetch(resourceUrl, {\n method: 'HEAD',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n const linkHeader = headResponse.headers.get('Link');\n if (linkHeader) {\n // 解析 Link header 找 describedby\n const describedBy = this.parseLinkHeader(linkHeader, 'describedby');\n if (describedBy) {\n // 获取 describedby 资源,解析通知端点\n const descResponse = await fetch(describedBy, {\n headers: {\n Accept: 'application/ld+json',\n Authorization: `Bearer ${accessToken}`,\n },\n });\n if (descResponse.ok) {\n const desc = await descResponse.json() as any;\n // 查找 notify:subscription 或类似属性\n const subscription = desc['notify:subscription'] || desc['subscription'];\n if (subscription) {\n return typeof subscription === 'string' ? subscription : subscription['@id'];\n }\n }\n }\n }\n } catch {\n // 忽略错误\n }\n\n return null;\n }\n\n /**\n * 解析 Link header\n */\n private parseLinkHeader(linkHeader: string, rel: string): string | null {\n const links = linkHeader.split(',');\n for (const link of links) {\n const match = link.match(/<([^>]+)>.*rel=\"?([^\";]+)\"?/);\n if (match && match[2] === rel) {\n return match[1];\n }\n }\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"VectorStoreService.js","sourceRoot":"","sources":["../../../src/api/service/VectorStoreService.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\nimport { drizzle, eq } from '@undefineds.co/drizzle-solid';\nimport { aiConfigModelRef, normalizeAIConfigModelId, normalizeAIConfigProviderId, selectAIConfigCredential } from '@undefineds.co/models';\nimport { randomBytes } from 'crypto';\nimport type { AuthContext } from '../auth/AuthContext';\nimport { getWebId, getAccountId, isSolidAuth } from '../auth/AuthContext';\nimport type { EmbeddingService } from '../../ai/service/EmbeddingService';\nimport type { AiCredential } from '../../ai/service/types';\nimport { Session } from '@inrupt/solid-client-authn-node';\n\nimport {\n AIConfig,\n VectorStore,\n IndexedFile,\n Model,\n Provider,\n VectorStoreStatus,\n ChunkingStrategy,\n FileIndexStatus,\n MigrationStatus,\n} from '../../ai/schema';\nimport { Credential } from '../../credential/schema/tables';\nimport { ServiceType, CredentialStatus } from '../../credential/schema/types';\n\nconst schema = {\n aiConfig: AIConfig,\n vectorStore: VectorStore,\n indexedFile: IndexedFile,\n model: Model,\n provider: Provider,\n credential: Credential,\n};\n\n// ============================================\n// Types - OpenAI Compatible\n// ============================================\n\n/**\n * 创建 Vector Store 请求\n */\nexport interface CreateVectorStoreRequest {\n /** 知识库名称 */\n name?: string;\n /** Container URL */\n url: string;\n /** Chunking 策略 */\n chunking_strategy?: 'auto' | 'static';\n /** 元数据 */\n metadata?: Record<string, string>;\n}\n\n/**\n * 修改 Vector Store 请求\n */\nexport interface ModifyVectorStoreRequest {\n name?: string;\n chunking_strategy?: 'auto' | 'static';\n metadata?: Record<string, string>;\n}\n\n/**\n * Vector Store 对象(OpenAI 兼容格式)\n */\nexport interface VectorStoreObject {\n id: string;\n object: 'vector_store';\n created_at: number;\n name: string;\n status: 'in_progress' | 'completed' | 'expired';\n usage_bytes: number;\n file_counts: {\n in_progress: number;\n completed: number;\n failed: number;\n cancelled: number;\n total: number;\n };\n last_active_at: number | null;\n metadata: Record<string, string>;\n // Xpod 扩展字段\n url: string;\n chunking_strategy: string;\n}\n\n/**\n * Pod AI 配置\n */\nexport interface PodAIConfig {\n embeddingModel: string;\n migrationStatus: 'idle' | 'in_progress' | 'completed' | 'failed';\n previousModel?: string;\n migrationProgress?: number;\n}\n\n/**\n * 搜索请求\n */\nexport interface SearchRequest {\n query: string | string[];\n max_num_results?: number;\n filters?: Record<string, any>;\n ranking_options?: {\n ranker?: string;\n score_threshold?: number;\n };\n rewrite_query?: boolean;\n}\n\n/**\n * 搜索结果\n */\nexport interface SearchResult {\n file_id: string;\n file_url: string;\n filename: string;\n score: number;\n attributes: Record<string, any>;\n content: Array<{ type: 'text'; text: string }>;\n}\n\nexport interface VectorStoreServiceOptions {\n /** CSS base URL */\n cssBaseUrl: string;\n /** Token endpoint for login */\n tokenEndpoint: string;\n /** Embedding service */\n embeddingService: EmbeddingService;\n /** Webhook URL for receiving notifications (optional) */\n webhookUrl?: string;\n}\n\n/**\n * VectorStoreService - 知识库管理服务\n *\n * 提供 OpenAI 兼容的 Vector Store API\n */\nexport class VectorStoreService {\n private readonly logger = getLoggerFor(this);\n private readonly cssBaseUrl: string;\n private readonly tokenEndpoint: string;\n private readonly embeddingService: EmbeddingService;\n private readonly webhookUrl?: string;\n\n public constructor(options: VectorStoreServiceOptions) {\n this.cssBaseUrl = options.cssBaseUrl.replace(/\\/$/, '');\n this.tokenEndpoint = options.tokenEndpoint;\n this.embeddingService = options.embeddingService;\n this.webhookUrl = options.webhookUrl;\n }\n\n // ============================================\n // Vector Store CRUD\n // ============================================\n\n /**\n * 创建 Vector Store(配置文件夹为知识库)\n */\n public async createVectorStore(\n request: CreateVectorStoreRequest,\n auth: AuthContext,\n accessToken?: string,\n ): Promise<VectorStoreObject> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n // 生成 ID\n const id = this.generateId();\n const now = new Date();\n const containerUri = request.url;\n\n // 插入记录(不再存储 model,model 从全局配置获取)\n await db.insert(VectorStore).values({\n id,\n name: request.name || this.extractContainerName(containerUri),\n container: containerUri,\n chunkingStrategy: request.chunking_strategy || ChunkingStrategy.AUTO,\n status: VectorStoreStatus.COMPLETED,\n createdAt: now,\n lastActiveAt: now,\n });\n\n this.logger.info(`Created vector store ${id} for container ${containerUri}`);\n\n // 尝试注册 webhook 订阅(如果配置了 webhookUrl)\n if (this.webhookUrl && accessToken) {\n try {\n await this.subscribeToContainer(containerUri, accessToken);\n this.logger.info(`Subscribed to container ${containerUri} for webhook notifications`);\n } catch (error) {\n // 订阅失败不影响 VectorStore 创建,只记录警告\n this.logger.warn(`Failed to subscribe to container ${containerUri}: ${error}`);\n }\n }\n\n return this.buildVectorStoreObject(id, {\n name: request.name || this.extractContainerName(containerUri),\n containerUrl: containerUri,\n chunkingStrategy: request.chunking_strategy || 'auto',\n status: 'completed',\n createdAt: now,\n lastActiveAt: now,\n });\n }\n\n /**\n * 列出所有 Vector Store\n */\n public async listVectorStores(\n auth: AuthContext,\n options?: { limit?: number; order?: 'asc' | 'desc'; after?: string; before?: string },\n ): Promise<{ object: 'list'; data: VectorStoreObject[]; has_more: boolean }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n const stores = await db.select().from(VectorStore) as any[];\n\n // 排序\n const order = options?.order || 'desc';\n stores.sort((a: any, b: any) => {\n const aTime = a.createdAt?.getTime() || 0;\n const bTime = b.createdAt?.getTime() || 0;\n return order === 'desc' ? bTime - aTime : aTime - bTime;\n });\n\n // 分页\n const limit = options?.limit || 20;\n const data = stores.slice(0, limit).map((store: any) => this.buildVectorStoreObject(store.id, {\n name: store.name || '',\n containerUrl: store.container || '',\n chunkingStrategy: store.chunkingStrategy || 'auto',\n status: (store.status as any) || 'completed',\n createdAt: store.createdAt || new Date(),\n lastActiveAt: store.lastActiveAt || null,\n }));\n\n return {\n object: 'list',\n data,\n has_more: stores.length > limit,\n };\n }\n\n /**\n * 获取单个 Vector Store\n */\n public async getVectorStore(id: string, auth: AuthContext): Promise<VectorStoreObject> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n const store = await db.findById(VectorStore, id);\n if (!store) {\n throw new Error(`Vector store ${id} not found`);\n }\n\n // 获取 file_counts(基于 Container 前缀匹配)\n const fileCounts = await this.getFileCounts(store.container || '', auth);\n\n return this.buildVectorStoreObject(store.id, {\n name: store.name || '',\n containerUrl: store.container || '',\n chunkingStrategy: store.chunkingStrategy || 'auto',\n status: (store.status as any) || 'completed',\n createdAt: store.createdAt || new Date(),\n lastActiveAt: store.lastActiveAt || null,\n fileCounts,\n });\n }\n\n /**\n * 修改 Vector Store\n */\n public async modifyVectorStore(\n id: string,\n request: ModifyVectorStoreRequest,\n auth: AuthContext,\n ): Promise<VectorStoreObject> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n // 构建更新数据(不再支持修改 model,model 是全局配置)\n const updates: Partial<typeof VectorStore.$inferInsert> = {};\n if (request.name !== undefined) updates.name = request.name;\n if (request.chunking_strategy !== undefined) updates.chunkingStrategy = request.chunking_strategy;\n\n await db.updateById(VectorStore, id, updates);\n\n return this.getVectorStore(id, auth);\n }\n\n /**\n * 删除 Vector Store\n */\n public async deleteVectorStore(\n id: string,\n auth: AuthContext,\n ): Promise<{ id: string; object: 'vector_store.deleted'; deleted: boolean }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n await db.deleteById(VectorStore, id);\n\n this.logger.info(`Deleted vector store ${id}`);\n\n return {\n id,\n object: 'vector_store.deleted',\n deleted: true,\n };\n }\n\n // ============================================\n // File Index Management (for webhook)\n // ============================================\n\n /**\n * 索引文件(由 webhook 调用)\n *\n * @param vectorStoreId Vector Store ID\n * @param fileUrl 文件 URL\n * @param auth 认证上下文\n * @param accessToken 访问令牌\n */\n public async indexFile(\n fileUrl: string,\n auth: AuthContext,\n accessToken: string,\n ): Promise<{ id: string; status: string; vectorId: number }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n // 获取全局 AI 配置(embedding model)\n const aiConfig = await this.getAIConfig(auth);\n if (!aiConfig) {\n throw new Error('No AI configuration found. Please configure an embedding model first.');\n }\n\n // 查找最近的父级 VectorStore 获取分块策略\n const chunkingStrategy = await this.getChunkingStrategyForFile(fileUrl, auth);\n\n // 检查文件是否已索引\n const existingFiles = await db.select().from(IndexedFile).where(\n eq(IndexedFile.fileUrl, fileUrl),\n );\n\n const vectorId = this.hashSubjectAspect(fileUrl, 'content');\n let fileIndexId: string;\n\n if (existingFiles.length > 0) {\n // 文件已存在,更新状态\n fileIndexId = existingFiles[0].id;\n await db.updateById(IndexedFile, fileIndexId, {\n status: FileIndexStatus.IN_PROGRESS,\n chunkingStrategy,\n indexedAt: new Date(),\n });\n } else {\n // 创建新的索引记录\n fileIndexId = `idx_${randomBytes(8).toString('hex')}`;\n await db.insert(IndexedFile).values({\n id: fileIndexId,\n fileUrl,\n vectorId,\n chunkingStrategy,\n status: FileIndexStatus.IN_PROGRESS,\n usageBytes: 0,\n indexedAt: new Date(),\n });\n }\n\n try {\n // 获取 AI credential\n const credential = await this.getAiCredential(auth);\n if (!credential) {\n throw new Error('No AI credential found');\n }\n\n // 读取文件内容\n const content = await this.fetchResourceContent(fileUrl, accessToken);\n if (!content || content.trim().length === 0) {\n throw new Error(`File ${fileUrl} has no indexable content`);\n }\n\n // 生成 embedding(使用全局 model)\n const embedding = await this.embeddingService.embed(content, credential, aiConfig.embeddingModel);\n\n // 存储向量\n await this.upsertVector(aiConfig.embeddingModel, vectorId, embedding, accessToken);\n\n // 更新索引记录为 completed\n await db.updateById(IndexedFile, fileIndexId, {\n status: FileIndexStatus.COMPLETED,\n usageBytes: content.length,\n lastError: null,\n });\n\n this.logger.info(`Indexed file ${fileUrl} with model ${aiConfig.embeddingModel}`);\n\n return { id: fileIndexId, status: 'completed', vectorId };\n } catch (error) {\n // 更新索引记录为 failed\n const errorMsg = error instanceof Error ? error.message : String(error);\n await db.updateById(IndexedFile, fileIndexId, {\n status: FileIndexStatus.FAILED,\n lastError: errorMsg,\n });\n\n this.logger.error(`Failed to index file ${fileUrl}: ${errorMsg}`);\n throw error;\n }\n }\n\n /**\n * 获取文件应使用的分块策略(查找最近的父级 VectorStore)\n */\n private async getChunkingStrategyForFile(fileUrl: string, auth: AuthContext): Promise<string> {\n const db = await this.getPodDb(auth);\n if (!db) return ChunkingStrategy.AUTO;\n\n // 获取所有 VectorStore\n const allStores = await db.select().from(VectorStore) as any[];\n\n // 找到所有是 fileUrl 前缀的 VectorStore\n const matchedStores = allStores.filter((store: any) => {\n if (!store.container) return false;\n const containerUrl = store.container.endsWith('/') ? store.container : store.container + '/';\n return fileUrl.startsWith(containerUrl);\n });\n\n if (matchedStores.length === 0) {\n return ChunkingStrategy.AUTO;\n }\n\n // 找最长前缀(最近的父级)\n matchedStores.sort((a: any, b: any) => (b.container?.length || 0) - (a.container?.length || 0));\n return matchedStores[0].chunkingStrategy || ChunkingStrategy.AUTO;\n }\n\n /**\n * 删除文件索引(由 webhook 调用)\n */\n public async removeFileIndex(\n fileUrl: string,\n auth: AuthContext,\n accessToken: string,\n ): Promise<{ deleted: boolean }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n // 获取全局 AI 配置\n const aiConfig = await this.getAIConfig(auth);\n if (!aiConfig) {\n this.logger.warn(`No AI config found, cannot delete vector for ${fileUrl}`);\n return { deleted: false };\n }\n\n // 查找文件索引记录\n const files = await db.select().from(IndexedFile).where(\n eq(IndexedFile.fileUrl, fileUrl),\n );\n\n if (files.length === 0) {\n this.logger.warn(`File index record not found for ${fileUrl}`);\n return { deleted: false };\n }\n\n const fileRecord = files[0];\n\n // 从向量存储中删除\n if (fileRecord.vectorId) {\n await this.deleteVector(aiConfig.embeddingModel, fileRecord.vectorId, accessToken);\n }\n\n // 删除索引记录\n await db.deleteById(IndexedFile, fileRecord.id);\n\n this.logger.info(`Removed file index ${fileUrl}`);\n return { deleted: true };\n }\n\n /**\n * 获取 Container 下的 file_counts 统计(基于 fileUrl 前缀匹配)\n */\n public async getFileCounts(\n containerUrl: string,\n auth: AuthContext,\n ): Promise<{ in_progress: number; completed: number; failed: number; cancelled: number; total: number }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n return { in_progress: 0, completed: 0, failed: 0, cancelled: 0, total: 0 };\n }\n\n // 获取所有索引文件,过滤属于该 Container 的\n const allFiles = await db.select().from(IndexedFile) as any[];\n const containerPrefix = containerUrl.endsWith('/') ? containerUrl : containerUrl + '/';\n const files = allFiles.filter((f: any) => f.fileUrl?.startsWith(containerPrefix));\n\n const counts = {\n in_progress: 0,\n completed: 0,\n failed: 0,\n cancelled: 0,\n total: files.length,\n };\n\n for (const file of files) {\n switch (file.status) {\n case FileIndexStatus.IN_PROGRESS:\n counts.in_progress++;\n break;\n case FileIndexStatus.COMPLETED:\n counts.completed++;\n break;\n case FileIndexStatus.FAILED:\n counts.failed++;\n break;\n case FileIndexStatus.CANCELLED:\n counts.cancelled++;\n break;\n }\n }\n\n return counts;\n }\n\n /**\n * 通过 vectorId 查找文件 URL(供 search 使用)\n * 注意:文件只索引一份,用 vectorId 即可查找\n */\n public async getFileUrlByVectorId(\n vectorId: number,\n auth: AuthContext,\n ): Promise<string | null> {\n const db = await this.getPodDb(auth);\n if (!db) return null;\n\n const files = await db.select().from(IndexedFile).where(\n eq(IndexedFile.vectorId, vectorId),\n );\n\n return files.length > 0 ? files[0].fileUrl : null;\n }\n\n /**\n * 根据 Container URL 查找 VectorStore\n */\n public async findVectorStoreByContainer(\n containerUrl: string,\n auth: AuthContext,\n ): Promise<VectorStoreObject | null> {\n const db = await this.getPodDb(auth);\n if (!db) return null;\n\n const stores = await db.select().from(VectorStore).where(\n eq(VectorStore.container, containerUrl),\n );\n\n if (stores.length === 0) return null;\n\n const store = stores[0];\n return this.buildVectorStoreObject(store.id, {\n name: store.name || '',\n containerUrl: store.container || '',\n chunkingStrategy: store.chunkingStrategy || 'auto',\n status: (store.status as any) || 'completed',\n createdAt: store.createdAt || new Date(),\n lastActiveAt: store.lastActiveAt || null,\n });\n }\n\n /**\n * 根据文件 URL 查找所有匹配的 VectorStore(包括父级容器)\n *\n * 例如:文件 https://alice.pod/A/B/c.txt 会匹配:\n * - https://alice.pod/A/B/ (直接父级)\n * - https://alice.pod/A/ (祖先级)\n * - https://alice.pod/ (Pod 根)\n *\n * 这样文件可以被索引到多个知识库中\n */\n public async findVectorStoresByFileUrl(\n fileUrl: string,\n auth: AuthContext,\n ): Promise<VectorStoreObject[]> {\n const db = await this.getPodDb(auth);\n if (!db) return [];\n\n // 获取所有 VectorStore\n const allStores = await db.select().from(VectorStore) as any[];\n\n // 过滤出 container 是 fileUrl 前缀的 VectorStore\n const matchedStores = allStores.filter((store: any) => {\n if (!store.container) return false;\n // 确保 container URL 以 / 结尾\n const containerUrl = store.container.endsWith('/') ? store.container : store.container + '/';\n return fileUrl.startsWith(containerUrl);\n });\n\n // 转换为 VectorStoreObject\n return matchedStores.map((store: any) => this.buildVectorStoreObject(store.id, {\n name: store.name || '',\n containerUrl: store.container || '',\n chunkingStrategy: store.chunkingStrategy || 'auto',\n status: (store.status as any) || 'completed',\n createdAt: store.createdAt || new Date(),\n lastActiveAt: store.lastActiveAt || null,\n }));\n }\n\n // ============================================\n // Search\n // ============================================\n\n /**\n * 搜索 Vector Store\n */\n public async search(\n vectorStoreId: string,\n request: SearchRequest,\n auth: AuthContext,\n accessToken: string,\n ): Promise<{ object: 'vector_store.search_results.page'; search_query: string; data: SearchResult[]; has_more: boolean }> {\n const store = await this.getVectorStore(vectorStoreId, auth);\n\n // 获取 AI credential\n const credential = await this.getAiCredential(auth);\n if (!credential) {\n throw new Error('No AI credential found');\n }\n\n // 获取全局 AI 配置中的 embedding model\n const aiConfig = await this.getAIConfig(auth);\n if (!aiConfig?.embeddingModel) {\n throw new Error('No embedding model configured. Please set up AI configuration first.');\n }\n\n const queryText = Array.isArray(request.query) ? request.query.join(' ') : request.query;\n\n // 生成 query embedding(使用全局模型)\n const queryEmbedding = await this.embeddingService.embed(queryText, credential, aiConfig.embeddingModel);\n\n // 调用 CSS vector search,使用 subjectPrefix 过滤只搜索该 VectorStore 的文件\n const limit = request.max_num_results || 10;\n const results = await this.searchVectors(aiConfig.embeddingModel, queryEmbedding, limit, accessToken, {\n subjectPrefix: store.url, // Container URL 作为 subject 前缀\n });\n\n // 构建搜索结果,使用 vectorId -> fileUrl 映射\n const searchResults: SearchResult[] = [];\n for (const r of results) {\n const vectorId = typeof r.id === 'number' ? r.id : parseInt(String(r.id), 10);\n const fileUrl = await this.getFileUrlByVectorId(vectorId, auth);\n\n searchResults.push({\n file_id: String(r.id),\n file_url: fileUrl || '',\n filename: fileUrl ? this.extractFilename(fileUrl) : '',\n score: r.score,\n attributes: {},\n content: [], // TODO: 可选返回内容片段\n });\n }\n\n return {\n object: 'vector_store.search_results.page',\n search_query: queryText,\n data: searchResults,\n has_more: false,\n };\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private generateId(): string {\n return `vs_${randomBytes(12).toString('hex')}`;\n }\n\n /**\n * Hash subject + aspect 为向量 ID(供 webhook 索引使用)\n */\n public hashSubjectAspect(subject: string, aspect: string): number {\n const str = `${subject}|${aspect}`;\n let hash = 2166136261;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return Math.abs(hash);\n }\n\n private extractContainerName(url: string): string {\n const parts = url.replace(/\\/$/, '').split('/');\n return parts[parts.length - 1] || 'Unnamed';\n }\n\n private extractFilename(url: string): string {\n const parts = url.split('/');\n return parts[parts.length - 1] || '';\n }\n\n private extractModelId(uri: string): string {\n return normalizeAIConfigModelId(uri);\n }\n\n private modelUri(model: string, provider: string = 'openai'): string {\n return aiConfigModelRef(provider, model);\n }\n\n private getPodBaseUrl(webId: string): string {\n const url = new URL(webId);\n url.hash = '';\n let path = url.pathname;\n if (path.endsWith('/profile/card')) {\n path = path.slice(0, -'/profile/card'.length);\n }\n if (!path.endsWith('/')) {\n path = path + '/';\n }\n return `${url.origin}${path}`;\n }\n\n private buildVectorStoreObject(\n id: string,\n data: {\n name: string;\n containerUrl: string;\n chunkingStrategy: string;\n status: 'in_progress' | 'completed' | 'expired';\n createdAt: Date;\n lastActiveAt: Date | null;\n fileCounts?: { in_progress: number; completed: number; failed: number; cancelled: number; total: number };\n usageBytes?: number;\n },\n ): VectorStoreObject {\n return {\n id,\n object: 'vector_store',\n created_at: Math.floor(data.createdAt.getTime() / 1000),\n name: data.name,\n status: data.status,\n usage_bytes: data.usageBytes || 0,\n file_counts: data.fileCounts || {\n in_progress: 0,\n completed: 0,\n failed: 0,\n cancelled: 0,\n total: 0,\n },\n last_active_at: data.lastActiveAt ? Math.floor(data.lastActiveAt.getTime() / 1000) : null,\n metadata: {},\n url: data.containerUrl,\n chunking_strategy: data.chunkingStrategy,\n };\n }\n\n private async getPodDb(auth: AuthContext): Promise<any | null> {\n if (!isSolidAuth(auth) || !auth.clientId || !auth.clientSecret) {\n this.logger.debug('No clientId or clientSecret in auth context');\n return null;\n }\n\n const session = new Session();\n try {\n await session.login({\n oidcIssuer: new URL(this.tokenEndpoint).origin,\n clientId: auth.clientId,\n clientSecret: auth.clientSecret,\n });\n\n if (!session.info.isLoggedIn || !session.info.webId) {\n throw new Error('Login failed');\n }\n\n return drizzle({ fetch: session.fetch, info: { webId: session.info.webId, isLoggedIn: true } } as any, { schema }) as any;\n } catch (error) {\n this.logger.error(`Failed to login: ${error}`);\n return null;\n }\n }\n\n private async getAiCredential(auth: AuthContext): Promise<AiCredential | undefined> {\n const db = await this.getPodDb(auth);\n if (!db) return undefined;\n\n try {\n const credentials = await db.select().from(Credential).where(\n eq(Credential.service, ServiceType.AI),\n );\n\n const activeCred = credentials.find((c: any) => c.status === CredentialStatus.ACTIVE);\n if (!activeCred || !activeCred.apiKey) return undefined;\n\n // 获取 provider 信息\n let baseUrl: string | undefined;\n let proxyUrl: string | undefined;\n let provider = normalizeAIConfigProviderId(activeCred.provider || activeCred.id);\n\n if (provider) {\n const providers = await db.select().from(Provider);\n const selection = selectAIConfigCredential(provider, credentials, providers);\n if (selection) {\n provider = selection.providerId;\n baseUrl = selection.baseUrl;\n proxyUrl = selection.proxyUrl;\n }\n }\n\n return {\n provider: provider || activeCred.id,\n apiKey: activeCred.apiKey,\n baseUrl,\n proxyUrl,\n };\n } catch (error) {\n this.logger.error(`Failed to get AI credential: ${error}`);\n return undefined;\n }\n }\n\n /**\n * 获取 Pod 级别的 AI 配置(全局 embedding model)\n */\n public async getAIConfig(auth: AuthContext): Promise<PodAIConfig | null> {\n const db = await this.getPodDb(auth);\n if (!db) return null;\n\n try {\n const configs = await db.select().from(AIConfig);\n const config = configs.find((c: any) => c.id === 'config');\n\n if (!config || !config.embeddingModel) {\n // 如果没有配置,尝试使用默认模型\n const models = await db.select().from(Model);\n const defaultModel = models.find((m: any) => m.modelType === 'embedding') || models[0];\n if (defaultModel) {\n return {\n embeddingModel: defaultModel.id,\n migrationStatus: 'idle',\n };\n }\n return null;\n }\n\n return {\n embeddingModel: this.extractModelId(config.embeddingModel),\n migrationStatus: (config.migrationStatus as any) || 'idle',\n previousModel: config.previousModel ? this.extractModelId(config.previousModel) : undefined,\n migrationProgress: config.migrationProgress || undefined,\n };\n } catch (error) {\n this.logger.error(`Failed to get AI config: ${error}`);\n return null;\n }\n }\n\n /**\n * 设置全局 embedding model\n * 如果更换了模型,自动触发迁移(后台重新索引所有文件)\n */\n public async setEmbeddingModel(\n newModel: string,\n auth: AuthContext,\n accessToken: string,\n ): Promise<{ success: boolean; migrationTriggered: boolean; message: string }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n const currentConfig = await this.getAIConfig(auth);\n const currentModel = currentConfig?.embeddingModel;\n\n // 检查模型是否有变化\n const modelChanged = currentModel && currentModel !== newModel;\n\n const modelUri = this.modelUri(newModel);\n\n try {\n // 检查配置是否已存在\n const configs = await db.select().from(AIConfig);\n const existingConfig = configs.find((c: any) => c.id === 'config');\n\n if (existingConfig) {\n // 更新现有配置\n await db.updateById(AIConfig, 'config', {\n embeddingModel: modelUri,\n previousModel: modelChanged ? this.modelUri(currentModel) : existingConfig.previousModel,\n migrationStatus: modelChanged ? MigrationStatus.IN_PROGRESS : existingConfig.migrationStatus,\n migrationProgress: modelChanged ? 0 : existingConfig.migrationProgress,\n updatedAt: new Date(),\n });\n } else {\n // 创建新配置\n await db.insert(AIConfig).values({\n id: 'config',\n embeddingModel: modelUri,\n migrationStatus: MigrationStatus.IDLE,\n migrationProgress: 0,\n updatedAt: new Date(),\n });\n }\n\n this.logger.info(`Set embedding model to ${newModel}`);\n\n // 如果模型变化,在后台启动迁移\n if (modelChanged) {\n this.logger.info(`Model changed from ${currentModel} to ${newModel}, triggering migration`);\n // 异步执行迁移,不阻塞响应\n this.startMigration(auth, accessToken).catch(error => {\n this.logger.error(`Migration failed: ${error}`);\n });\n }\n\n return {\n success: true,\n migrationTriggered: modelChanged === true,\n message: modelChanged\n ? `Model updated to ${newModel}. Migration started to re-index all files.`\n : `Model set to ${newModel}.`,\n };\n } catch (error) {\n this.logger.error(`Failed to set embedding model: ${error}`);\n throw error;\n }\n }\n\n /**\n * 开始迁移:重新索引所有文件\n */\n private async startMigration(auth: AuthContext, accessToken: string): Promise<void> {\n const db = await this.getPodDb(auth);\n if (!db) return;\n\n try {\n // 获取所有已索引的文件\n const allFiles = await db.select().from(IndexedFile);\n const totalFiles = allFiles.length;\n\n if (totalFiles === 0) {\n // 无文件需要迁移\n await db.updateById(AIConfig, 'config', {\n migrationStatus: MigrationStatus.COMPLETED,\n migrationProgress: 100,\n updatedAt: new Date(),\n });\n return;\n }\n\n this.logger.info(`Starting migration for ${totalFiles} files`);\n\n let completedFiles = 0;\n let failedFiles = 0;\n\n for (const file of allFiles) {\n try {\n // 重新索引每个文件\n await this.indexFile(file.fileUrl, auth, accessToken);\n completedFiles++;\n } catch (error) {\n failedFiles++;\n this.logger.error(`Failed to re-index ${file.fileUrl}: ${error}`);\n }\n\n // 更新迁移进度\n const progress = Math.round(((completedFiles + failedFiles) / totalFiles) * 100);\n await db.updateById(AIConfig, 'config', {\n migrationProgress: progress,\n updatedAt: new Date(),\n });\n }\n\n // 标记迁移完成\n const finalStatus = failedFiles === 0 ? MigrationStatus.COMPLETED : MigrationStatus.FAILED;\n await db.updateById(AIConfig, 'config', {\n migrationStatus: finalStatus,\n migrationProgress: 100,\n updatedAt: new Date(),\n });\n\n this.logger.info(`Migration completed: ${completedFiles} success, ${failedFiles} failed`);\n } catch (error) {\n this.logger.error(`Migration error: ${error}`);\n await db.updateById(AIConfig, 'config', {\n migrationStatus: MigrationStatus.FAILED,\n updatedAt: new Date(),\n });\n }\n }\n\n /**\n * 获取资源内容(供 webhook 索引使用)\n */\n public async fetchResourceContent(url: string, accessToken: string): Promise<string> {\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n Accept: 'text/turtle, application/ld+json, text/plain, text/markdown, text/html, */*',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.status}`);\n }\n\n const contentType = response.headers.get('Content-Type') || '';\n const body = await response.text();\n return this.extractText(body, contentType);\n }\n\n private extractText(body: string, contentType: string): string {\n const ct = contentType.toLowerCase();\n\n if (ct.includes('text/turtle') || ct.includes('application/n-triples')) {\n return this.extractTextFromTurtle(body);\n }\n if (ct.includes('application/ld+json') || ct.includes('application/json')) {\n return this.extractTextFromJsonLd(body);\n }\n if (ct.includes('text/html')) {\n return this.extractTextFromHtml(body);\n }\n return body;\n }\n\n private extractTextFromTurtle(turtle: string): string {\n const literals: string[] = [];\n const tripleQuoteRegex = /\"\"\"([^]*?)\"\"\"/g;\n const singleQuoteRegex = /\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"/g;\n\n let match;\n while ((match = tripleQuoteRegex.exec(turtle)) !== null) {\n if (match[1].trim().length > 0) literals.push(match[1].trim());\n }\n\n const withoutTriple = turtle.replace(/\"\"\"[^]*?\"\"\"/g, '');\n while ((match = singleQuoteRegex.exec(withoutTriple)) !== null) {\n const value = match[1].trim();\n if (value.length > 3 && !value.startsWith('http') && !value.startsWith('urn:')) {\n literals.push(value);\n }\n }\n return literals.join('\\n');\n }\n\n private extractTextFromJsonLd(jsonStr: string): string {\n try {\n const json = JSON.parse(jsonStr);\n const texts: string[] = [];\n const extract = (obj: any): void => {\n if (typeof obj === 'string' && obj.length > 3 && !obj.startsWith('http')) {\n texts.push(obj);\n } else if (Array.isArray(obj)) {\n obj.forEach(extract);\n } else if (obj && typeof obj === 'object') {\n for (const [key, value] of Object.entries(obj)) {\n if (!key.startsWith('@')) extract(value);\n }\n }\n };\n extract(json);\n return texts.join('\\n');\n } catch {\n return jsonStr;\n }\n }\n\n private extractTextFromHtml(html: string): string {\n let text = html.replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, '');\n text = text.replace(/<style[^>]*>[\\s\\S]*?<\\/style>/gi, '');\n text = text.replace(/<[^>]+>/g, ' ');\n text = text.replace(/\\s+/g, ' ').trim();\n return text;\n }\n\n /**\n * Upsert 向量到 CSS(供 webhook 索引使用)\n */\n public async upsertVector(model: string, id: number, vector: number[], accessToken: string): Promise<void> {\n const url = `${this.cssBaseUrl}/-/vector/upsert`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify({ model, vectors: [{ id, vector }] }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Vector upsert failed: ${response.status} ${errorText}`);\n }\n }\n\n /**\n * 删除向量(供 webhook 索引使用)\n */\n public async deleteVector(model: string, id: number, accessToken: string): Promise<void> {\n const url = `${this.cssBaseUrl}/-/vector/delete`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify({ model, ids: [id] }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Vector delete failed: ${response.status} ${errorText}`);\n }\n }\n\n private async searchVectors(\n model: string,\n vector: number[],\n limit: number,\n accessToken: string,\n options?: { subjectPrefix?: string },\n ): Promise<any[]> {\n const url = `${this.cssBaseUrl}/-/vector/search`;\n \n const body: Record<string, any> = { model, vector, limit };\n \n // 添加 subject 前缀过滤(限定搜索范围到特定 Container)\n if (options?.subjectPrefix) {\n body.filter = {\n subject: { $startsWith: options.subjectPrefix },\n };\n }\n \n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(`Vector search failed: ${response.status}`);\n }\n\n const data = await response.json() as { results?: any[] };\n return data.results || [];\n }\n\n // ============================================\n // Webhook Subscription\n // ============================================\n\n /**\n * 订阅 Container 的变更通知(WebhookChannel2023)\n *\n * @param containerUrl Container URL\n * @param accessToken 访问令牌\n */\n private async subscribeToContainer(containerUrl: string, accessToken: string): Promise<void> {\n if (!this.webhookUrl) {\n throw new Error('Webhook URL not configured');\n }\n\n // 1. 发现订阅端点\n const subscriptionEndpoint = await this.discoverNotificationEndpoint(containerUrl, accessToken);\n if (!subscriptionEndpoint) {\n throw new Error(`No notification endpoint found for ${containerUrl}`);\n }\n\n // 2. 创建 webhook 订阅\n const subscriptionRequest = {\n '@context': ['https://www.w3.org/ns/solid/notification/v1'],\n type: 'WebhookChannel2023',\n topic: containerUrl,\n sendTo: this.webhookUrl,\n };\n\n const response = await fetch(subscriptionEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/ld+json',\n Accept: 'application/ld+json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify(subscriptionRequest),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Subscription failed: ${response.status} ${errorText}`);\n }\n\n const result = await response.json();\n this.logger.info(`Created webhook subscription: ${JSON.stringify(result)}`);\n }\n\n /**\n * 发现 Solid Notification 端点\n *\n * 通过 HEAD 请求获取 Link header 中的 describedby,然后获取订阅端点\n */\n private async discoverNotificationEndpoint(resourceUrl: string, accessToken: string): Promise<string | null> {\n // 方法 1:直接使用已知的 CSS 端点格式\n // CSS 的 webhook 订阅端点通常是 /.notifications/WebhookChannel2023/\n const url = new URL(resourceUrl);\n const webhookEndpoint = `${url.origin}/.notifications/WebhookChannel2023/`;\n\n // 验证端点是否存在\n try {\n const response = await fetch(webhookEndpoint, {\n method: 'GET',\n headers: {\n Accept: 'application/ld+json',\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (response.ok) {\n return webhookEndpoint;\n }\n } catch {\n // 忽略错误,尝试其他方法\n }\n\n // 方法 2:通过 describedby Link header 发现\n try {\n const headResponse = await fetch(resourceUrl, {\n method: 'HEAD',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n const linkHeader = headResponse.headers.get('Link');\n if (linkHeader) {\n // 解析 Link header 找 describedby\n const describedBy = this.parseLinkHeader(linkHeader, 'describedby');\n if (describedBy) {\n // 获取 describedby 资源,解析通知端点\n const descResponse = await fetch(describedBy, {\n headers: {\n Accept: 'application/ld+json',\n Authorization: `Bearer ${accessToken}`,\n },\n });\n if (descResponse.ok) {\n const desc = await descResponse.json() as any;\n // 查找 notify:subscription 或类似属性\n const subscription = desc['notify:subscription'] || desc['subscription'];\n if (subscription) {\n return typeof subscription === 'string' ? subscription : subscription['@id'];\n }\n }\n }\n }\n } catch {\n // 忽略错误\n }\n\n return null;\n }\n\n /**\n * 解析 Link header\n */\n private parseLinkHeader(linkHeader: string, rel: string): string | null {\n const links = linkHeader.split(',');\n for (const link of links) {\n const match = link.match(/<([^>]+)>.*rel=\"?([^\";]+)\"?/);\n if (match && match[2] === rel) {\n return match[1];\n }\n }\n return null;\n }\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * AI Provider capability registry.
3
3
  *
4
4
  * Single source of truth for which API protocols each known provider supports.
5
- * Used by VercelChatService (API proxy/conversion) and PtyThreadRuntime (agent env setup).
5
+ * Used by VercelChatService (API proxy/conversion) and ACP agent runtime env setup.
6
6
  *
7
7
  * TODO: replace with discovery service lookup via provider WebID
8
8
  * See: docs/issues/discovery/001-provider-capability-registry.md
@@ -3,7 +3,7 @@
3
3
  * AI Provider capability registry.
4
4
  *
5
5
  * Single source of truth for which API protocols each known provider supports.
6
- * Used by VercelChatService (API proxy/conversion) and PtyThreadRuntime (agent env setup).
6
+ * Used by VercelChatService (API proxy/conversion) and ACP agent runtime env setup.
7
7
  *
8
8
  * TODO: replace with discovery service lookup via provider WebID
9
9
  * See: docs/issues/discovery/001-provider-capability-registry.md
@@ -1 +1 @@
1
- {"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../../src/api/service/provider-registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AI Provider capability registry.\n *\n * Single source of truth for which API protocols each known provider supports.\n * Used by VercelChatService (API proxy/conversion) and PtyThreadRuntime (agent env setup).\n *\n * TODO: replace with discovery service lookup via provider WebID\n * See: docs/issues/discovery/001-provider-capability-registry.md\n */\n\ninterface ProviderInfo {\n /** Default base URL (with /v1 suffix where applicable) */\n baseUrl: string;\n /** Hostnames that identify this provider */\n hostnames: string[];\n supports: {\n chatCompletions: boolean;\n /** OpenAI Responses API: POST /v1/responses */\n responses: boolean;\n /** Anthropic Messages API: POST /v1/messages */\n messages: boolean;\n };\n}\n\nconst REGISTRY: ProviderInfo[] = [\n {\n baseUrl: 'https://api.openai.com/v1',\n hostnames: ['api.openai.com'],\n supports: { chatCompletions: true, responses: true, messages: false },\n },\n {\n baseUrl: 'https://api.anthropic.com/v1',\n hostnames: ['api.anthropic.com'],\n supports: { chatCompletions: false, responses: false, messages: true },\n },\n {\n baseUrl: 'https://openrouter.ai/api/v1',\n hostnames: ['openrouter.ai'],\n supports: { chatCompletions: true, responses: true, messages: true },\n },\n {\n baseUrl: 'https://api.deepseek.com/v1',\n hostnames: ['api.deepseek.com'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n {\n baseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai',\n hostnames: ['generativelanguage.googleapis.com'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n {\n baseUrl: 'http://localhost:11434/v1',\n hostnames: ['localhost', '127.0.0.1'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n {\n baseUrl: 'https://api.mistral.ai/v1',\n hostnames: ['api.mistral.ai'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n {\n baseUrl: 'https://api.cohere.ai/v1',\n hostnames: ['api.cohere.ai'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n {\n baseUrl: 'https://open.bigmodel.cn/api/paas/v4',\n hostnames: ['open.bigmodel.cn'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n];\n\n/** Default for unknown providers — Chat Completions is the most widely supported protocol */\nconst UNKNOWN: ProviderInfo['supports'] = {\n chatCompletions: true,\n responses: false,\n messages: false,\n};\n\nconst byName = new Map<string, ProviderInfo>();\nconst byHost = new Map<string, ProviderInfo>();\n\nfor (const p of REGISTRY) {\n // Index by provider name derived from hostname\n byName.set(p.hostnames[0], p);\n for (const h of p.hostnames) {\n byHost.set(h, p);\n }\n}\n\nfunction hostnameOf(baseUrl: string): string | undefined {\n try {\n return new URL(baseUrl).hostname;\n } catch {\n return undefined;\n }\n}\n\nfunction lookupByUrl(baseUrl: string): ProviderInfo['supports'] {\n const host = hostnameOf(baseUrl);\n if (!host) return UNKNOWN;\n return byHost.get(host)?.supports ?? UNKNOWN;\n}\n\nexport function getDefaultBaseUrl(provider?: string): string {\n const normalized = (provider || 'openrouter').toLowerCase();\n // Match by first hostname segment or full name\n for (const p of REGISTRY) {\n if (p.hostnames[0].includes(normalized) || normalized.includes(p.hostnames[0].split('.')[0])) {\n return p.baseUrl;\n }\n }\n return 'https://openrouter.ai/api/v1';\n}\n\nexport function supportsResponsesApi(baseUrl: string): boolean {\n return lookupByUrl(baseUrl).responses;\n}\n\nexport function supportsMessagesApi(baseUrl: string): boolean {\n return lookupByUrl(baseUrl).messages;\n}\n\n/**\n * For codex wire_api selection: only native OpenAI uses Responses wire protocol.\n * All other providers (including openrouter) should use Chat Completions wire.\n */\nexport function codexWireApi(baseUrl: string): 'responses' | 'chat' {\n const host = hostnameOf(baseUrl);\n return host === 'api.openai.com' ? 'responses' : 'chat';\n}\n"]}
1
+ {"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../../src/api/service/provider-registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AI Provider capability registry.\n *\n * Single source of truth for which API protocols each known provider supports.\n * Used by VercelChatService (API proxy/conversion) and ACP agent runtime env setup.\n *\n * TODO: replace with discovery service lookup via provider WebID\n * See: docs/issues/discovery/001-provider-capability-registry.md\n */\n\ninterface ProviderInfo {\n /** Default base URL (with /v1 suffix where applicable) */\n baseUrl: string;\n /** Hostnames that identify this provider */\n hostnames: string[];\n supports: {\n chatCompletions: boolean;\n /** OpenAI Responses API: POST /v1/responses */\n responses: boolean;\n /** Anthropic Messages API: POST /v1/messages */\n messages: boolean;\n };\n}\n\nconst REGISTRY: ProviderInfo[] = [\n {\n baseUrl: 'https://api.openai.com/v1',\n hostnames: ['api.openai.com'],\n supports: { chatCompletions: true, responses: true, messages: false },\n },\n {\n baseUrl: 'https://api.anthropic.com/v1',\n hostnames: ['api.anthropic.com'],\n supports: { chatCompletions: false, responses: false, messages: true },\n },\n {\n baseUrl: 'https://openrouter.ai/api/v1',\n hostnames: ['openrouter.ai'],\n supports: { chatCompletions: true, responses: true, messages: true },\n },\n {\n baseUrl: 'https://api.deepseek.com/v1',\n hostnames: ['api.deepseek.com'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n {\n baseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai',\n hostnames: ['generativelanguage.googleapis.com'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n {\n baseUrl: 'http://localhost:11434/v1',\n hostnames: ['localhost', '127.0.0.1'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n {\n baseUrl: 'https://api.mistral.ai/v1',\n hostnames: ['api.mistral.ai'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n {\n baseUrl: 'https://api.cohere.ai/v1',\n hostnames: ['api.cohere.ai'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n {\n baseUrl: 'https://open.bigmodel.cn/api/paas/v4',\n hostnames: ['open.bigmodel.cn'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n];\n\n/** Default for unknown providers — Chat Completions is the most widely supported protocol */\nconst UNKNOWN: ProviderInfo['supports'] = {\n chatCompletions: true,\n responses: false,\n messages: false,\n};\n\nconst byName = new Map<string, ProviderInfo>();\nconst byHost = new Map<string, ProviderInfo>();\n\nfor (const p of REGISTRY) {\n // Index by provider name derived from hostname\n byName.set(p.hostnames[0], p);\n for (const h of p.hostnames) {\n byHost.set(h, p);\n }\n}\n\nfunction hostnameOf(baseUrl: string): string | undefined {\n try {\n return new URL(baseUrl).hostname;\n } catch {\n return undefined;\n }\n}\n\nfunction lookupByUrl(baseUrl: string): ProviderInfo['supports'] {\n const host = hostnameOf(baseUrl);\n if (!host) return UNKNOWN;\n return byHost.get(host)?.supports ?? UNKNOWN;\n}\n\nexport function getDefaultBaseUrl(provider?: string): string {\n const normalized = (provider || 'openrouter').toLowerCase();\n // Match by first hostname segment or full name\n for (const p of REGISTRY) {\n if (p.hostnames[0].includes(normalized) || normalized.includes(p.hostnames[0].split('.')[0])) {\n return p.baseUrl;\n }\n }\n return 'https://openrouter.ai/api/v1';\n}\n\nexport function supportsResponsesApi(baseUrl: string): boolean {\n return lookupByUrl(baseUrl).responses;\n}\n\nexport function supportsMessagesApi(baseUrl: string): boolean {\n return lookupByUrl(baseUrl).messages;\n}\n\n/**\n * For codex wire_api selection: only native OpenAI uses Responses wire protocol.\n * All other providers (including openrouter) should use Chat Completions wire.\n */\nexport function codexWireApi(baseUrl: string): 'responses' | 'chat' {\n const host = hostnameOf(baseUrl);\n return host === 'api.openai.com' ? 'responses' : 'chat';\n}\n"]}