@oscharko-dev/keiko-server 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (509) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/assistant-response.d.ts +6 -0
  3. package/dist/assistant-response.d.ts.map +1 -0
  4. package/dist/assistant-response.js +12 -0
  5. package/dist/browser.d.ts +11 -0
  6. package/dist/browser.d.ts.map +1 -0
  7. package/dist/browser.js +245 -0
  8. package/dist/chat-handlers.d.ts +48 -0
  9. package/dist/chat-handlers.d.ts.map +1 -0
  10. package/dist/chat-handlers.js +821 -0
  11. package/dist/chat-stream-handlers.d.ts +4 -0
  12. package/dist/chat-stream-handlers.d.ts.map +1 -0
  13. package/dist/chat-stream-handlers.js +136 -0
  14. package/dist/conversation-prompt.d.ts +8 -0
  15. package/dist/conversation-prompt.d.ts.map +1 -0
  16. package/dist/conversation-prompt.js +36 -0
  17. package/dist/conversation-validation.d.ts +26 -0
  18. package/dist/conversation-validation.d.ts.map +1 -0
  19. package/dist/conversation-validation.js +125 -0
  20. package/dist/credentialPersistence.d.ts +23 -0
  21. package/dist/credentialPersistence.d.ts.map +1 -0
  22. package/dist/credentialPersistence.js +93 -0
  23. package/dist/credentialVault.d.ts +30 -0
  24. package/dist/credentialVault.d.ts.map +1 -0
  25. package/dist/credentialVault.js +206 -0
  26. package/dist/csp.d.ts +3 -0
  27. package/dist/csp.d.ts.map +1 -0
  28. package/dist/csp.js +75 -0
  29. package/dist/deps.d.ts +78 -0
  30. package/dist/deps.d.ts.map +1 -0
  31. package/dist/deps.js +457 -0
  32. package/dist/editor/agentRoutes.d.ts +7 -0
  33. package/dist/editor/agentRoutes.d.ts.map +1 -0
  34. package/dist/editor/agentRoutes.js +197 -0
  35. package/dist/editor/assuredGateRunner.d.ts +36 -0
  36. package/dist/editor/assuredGateRunner.d.ts.map +1 -0
  37. package/dist/editor/assuredGateRunner.js +100 -0
  38. package/dist/editor/assuredPreFilter.d.ts +34 -0
  39. package/dist/editor/assuredPreFilter.d.ts.map +1 -0
  40. package/dist/editor/assuredPreFilter.js +134 -0
  41. package/dist/editor/assuredPreFilterRunner.d.ts +31 -0
  42. package/dist/editor/assuredPreFilterRunner.d.ts.map +1 -0
  43. package/dist/editor/assuredPreFilterRunner.js +312 -0
  44. package/dist/editor/builtinLanguageProviders.d.ts +6 -0
  45. package/dist/editor/builtinLanguageProviders.d.ts.map +1 -0
  46. package/dist/editor/builtinLanguageProviders.js +221 -0
  47. package/dist/editor/codingContext.d.ts +12 -0
  48. package/dist/editor/codingContext.d.ts.map +1 -0
  49. package/dist/editor/codingContext.js +121 -0
  50. package/dist/editor/codingContextEvidence.d.ts +7 -0
  51. package/dist/editor/codingContextEvidence.d.ts.map +1 -0
  52. package/dist/editor/codingContextEvidence.js +52 -0
  53. package/dist/editor/codingContextProviders.d.ts +36 -0
  54. package/dist/editor/codingContextProviders.d.ts.map +1 -0
  55. package/dist/editor/codingContextProviders.js +348 -0
  56. package/dist/editor/completionModelEvidence.d.ts +16 -0
  57. package/dist/editor/completionModelEvidence.d.ts.map +1 -0
  58. package/dist/editor/completionModelEvidence.js +50 -0
  59. package/dist/editor/completionRoutes.d.ts +37 -0
  60. package/dist/editor/completionRoutes.d.ts.map +1 -0
  61. package/dist/editor/completionRoutes.js +411 -0
  62. package/dist/editor/contextRoutes.d.ts +6 -0
  63. package/dist/editor/contextRoutes.d.ts.map +1 -0
  64. package/dist/editor/contextRoutes.js +411 -0
  65. package/dist/editor/disposableAssuredExecution.d.ts +22 -0
  66. package/dist/editor/disposableAssuredExecution.d.ts.map +1 -0
  67. package/dist/editor/disposableAssuredExecution.js +57 -0
  68. package/dist/editor/editorCompletionModel.d.ts +47 -0
  69. package/dist/editor/editorCompletionModel.d.ts.map +1 -0
  70. package/dist/editor/editorCompletionModel.js +156 -0
  71. package/dist/editor/editorInlineCompletionModel.d.ts +34 -0
  72. package/dist/editor/editorInlineCompletionModel.d.ts.map +1 -0
  73. package/dist/editor/editorInlineCompletionModel.js +112 -0
  74. package/dist/editor/editorModelTokenBudget.d.ts +46 -0
  75. package/dist/editor/editorModelTokenBudget.d.ts.map +1 -0
  76. package/dist/editor/editorModelTokenBudget.js +121 -0
  77. package/dist/editor/inlineCompletionRateLimiter.d.ts +19 -0
  78. package/dist/editor/inlineCompletionRateLimiter.d.ts.map +1 -0
  79. package/dist/editor/inlineCompletionRateLimiter.js +46 -0
  80. package/dist/editor/inlineCompletionRoutes.d.ts +26 -0
  81. package/dist/editor/inlineCompletionRoutes.d.ts.map +1 -0
  82. package/dist/editor/inlineCompletionRoutes.js +404 -0
  83. package/dist/editor/inlineCompletionTelemetryEvidence.d.ts +5 -0
  84. package/dist/editor/inlineCompletionTelemetryEvidence.d.ts.map +1 -0
  85. package/dist/editor/inlineCompletionTelemetryEvidence.js +42 -0
  86. package/dist/editor/languageCancellation.d.ts +19 -0
  87. package/dist/editor/languageCancellation.d.ts.map +1 -0
  88. package/dist/editor/languageCancellation.js +48 -0
  89. package/dist/editor/languageProvider.d.ts +39 -0
  90. package/dist/editor/languageProvider.d.ts.map +1 -0
  91. package/dist/editor/languageProvider.js +11 -0
  92. package/dist/editor/languageRoutes.d.ts +15 -0
  93. package/dist/editor/languageRoutes.d.ts.map +1 -0
  94. package/dist/editor/languageRoutes.js +106 -0
  95. package/dist/editor/languageSanitize.d.ts +8 -0
  96. package/dist/editor/languageSanitize.d.ts.map +1 -0
  97. package/dist/editor/languageSanitize.js +101 -0
  98. package/dist/editor/languageService.d.ts +36 -0
  99. package/dist/editor/languageService.d.ts.map +1 -0
  100. package/dist/editor/languageService.js +93 -0
  101. package/dist/editor/languageServiceHost.d.ts +14 -0
  102. package/dist/editor/languageServiceHost.d.ts.map +1 -0
  103. package/dist/editor/languageServiceHost.js +242 -0
  104. package/dist/editor/localKnowledgeRetrieval.d.ts +21 -0
  105. package/dist/editor/localKnowledgeRetrieval.d.ts.map +1 -0
  106. package/dist/editor/localKnowledgeRetrieval.js +44 -0
  107. package/dist/editor/patchApplyEvidence.d.ts +21 -0
  108. package/dist/editor/patchApplyEvidence.d.ts.map +1 -0
  109. package/dist/editor/patchApplyEvidence.js +87 -0
  110. package/dist/editor/patchApplyRoutes.d.ts +16 -0
  111. package/dist/editor/patchApplyRoutes.d.ts.map +1 -0
  112. package/dist/editor/patchApplyRoutes.js +307 -0
  113. package/dist/editor/postApplyVerification.d.ts +42 -0
  114. package/dist/editor/postApplyVerification.d.ts.map +1 -0
  115. package/dist/editor/postApplyVerification.js +177 -0
  116. package/dist/editor/testGenerationEvidence.d.ts +6 -0
  117. package/dist/editor/testGenerationEvidence.d.ts.map +1 -0
  118. package/dist/editor/testGenerationEvidence.js +72 -0
  119. package/dist/editor/testGenerationPatch.d.ts +10 -0
  120. package/dist/editor/testGenerationPatch.d.ts.map +1 -0
  121. package/dist/editor/testGenerationPatch.js +66 -0
  122. package/dist/editor/testGenerationRoutes.d.ts +21 -0
  123. package/dist/editor/testGenerationRoutes.d.ts.map +1 -0
  124. package/dist/editor/testGenerationRoutes.js +254 -0
  125. package/dist/editor/testGenerationRunner.d.ts +23 -0
  126. package/dist/editor/testGenerationRunner.d.ts.map +1 -0
  127. package/dist/editor/testGenerationRunner.js +120 -0
  128. package/dist/editor/textOffsets.d.ts +6 -0
  129. package/dist/editor/textOffsets.d.ts.map +1 -0
  130. package/dist/editor/textOffsets.js +82 -0
  131. package/dist/editor/typescriptLanguageProvider.d.ts +3 -0
  132. package/dist/editor/typescriptLanguageProvider.d.ts.map +1 -0
  133. package/dist/editor/typescriptLanguageProvider.js +217 -0
  134. package/dist/evidence.d.ts +28 -0
  135. package/dist/evidence.d.ts.map +1 -0
  136. package/dist/evidence.js +145 -0
  137. package/dist/files-deny.d.ts +3 -0
  138. package/dist/files-deny.d.ts.map +1 -0
  139. package/dist/files-deny.js +12 -0
  140. package/dist/files.d.ts +97 -0
  141. package/dist/files.d.ts.map +1 -0
  142. package/dist/files.js +733 -0
  143. package/dist/gateway-setup.d.ts +10 -0
  144. package/dist/gateway-setup.d.ts.map +1 -0
  145. package/dist/gateway-setup.js +896 -0
  146. package/dist/governed-workflow.d.ts +17 -0
  147. package/dist/governed-workflow.d.ts.map +1 -0
  148. package/dist/governed-workflow.js +147 -0
  149. package/dist/grounded-answer.d.ts +12 -0
  150. package/dist/grounded-answer.d.ts.map +1 -0
  151. package/dist/grounded-answer.js +69 -0
  152. package/dist/grounded-context-index.d.ts +25 -0
  153. package/dist/grounded-context-index.d.ts.map +1 -0
  154. package/dist/grounded-context-index.js +169 -0
  155. package/dist/grounded-document-evidence.d.ts +28 -0
  156. package/dist/grounded-document-evidence.d.ts.map +1 -0
  157. package/dist/grounded-document-evidence.js +430 -0
  158. package/dist/grounded-handoff.d.ts +4 -0
  159. package/dist/grounded-handoff.d.ts.map +1 -0
  160. package/dist/grounded-handoff.js +445 -0
  161. package/dist/grounded-orchestrator.d.ts +43 -0
  162. package/dist/grounded-orchestrator.d.ts.map +1 -0
  163. package/dist/grounded-orchestrator.js +1445 -0
  164. package/dist/grounded-prompt.d.ts +2 -0
  165. package/dist/grounded-prompt.d.ts.map +1 -0
  166. package/dist/grounded-prompt.js +17 -0
  167. package/dist/grounded-qa-hybrid.d.ts +36 -0
  168. package/dist/grounded-qa-hybrid.d.ts.map +1 -0
  169. package/dist/grounded-qa-hybrid.js +762 -0
  170. package/dist/grounded-qa-multi-source.d.ts +38 -0
  171. package/dist/grounded-qa-multi-source.d.ts.map +1 -0
  172. package/dist/grounded-qa-multi-source.js +461 -0
  173. package/dist/grounded-qa.d.ts +45 -0
  174. package/dist/grounded-qa.d.ts.map +1 -0
  175. package/dist/grounded-qa.js +877 -0
  176. package/dist/grounded-rerank.d.ts +26 -0
  177. package/dist/grounded-rerank.d.ts.map +1 -0
  178. package/dist/grounded-rerank.js +72 -0
  179. package/dist/grounded-turn-registry.d.ts +23 -0
  180. package/dist/grounded-turn-registry.d.ts.map +1 -0
  181. package/dist/grounded-turn-registry.js +102 -0
  182. package/dist/headers.d.ts +3 -0
  183. package/dist/headers.d.ts.map +1 -0
  184. package/dist/headers.js +22 -0
  185. package/dist/host-check.d.ts +3 -0
  186. package/dist/host-check.d.ts.map +1 -0
  187. package/dist/host-check.js +58 -0
  188. package/dist/index.d.ts +26 -0
  189. package/dist/index.d.ts.map +1 -0
  190. package/dist/index.js +33 -0
  191. package/dist/load-csp.d.ts +3 -0
  192. package/dist/load-csp.d.ts.map +1 -0
  193. package/dist/load-csp.js +100 -0
  194. package/dist/local-knowledge-grounded-qa.d.ts +42 -0
  195. package/dist/local-knowledge-grounded-qa.d.ts.map +1 -0
  196. package/dist/local-knowledge-grounded-qa.js +678 -0
  197. package/dist/local-knowledge-handlers.d.ts +24 -0
  198. package/dist/local-knowledge-handlers.d.ts.map +1 -0
  199. package/dist/local-knowledge-handlers.js +1285 -0
  200. package/dist/local-knowledge-indexing-registry.d.ts +13 -0
  201. package/dist/local-knowledge-indexing-registry.d.ts.map +1 -0
  202. package/dist/local-knowledge-indexing-registry.js +53 -0
  203. package/dist/localKnowledgeKeyProvider.d.ts +11 -0
  204. package/dist/localKnowledgeKeyProvider.d.ts.map +1 -0
  205. package/dist/localKnowledgeKeyProvider.js +48 -0
  206. package/dist/memory-audit-event-builders.d.ts +21 -0
  207. package/dist/memory-audit-event-builders.d.ts.map +1 -0
  208. package/dist/memory-audit-event-builders.js +187 -0
  209. package/dist/memory-audit-handler.d.ts +23 -0
  210. package/dist/memory-audit-handler.d.ts.map +1 -0
  211. package/dist/memory-audit-handler.js +191 -0
  212. package/dist/memory-capture-policy.d.ts +10 -0
  213. package/dist/memory-capture-policy.d.ts.map +1 -0
  214. package/dist/memory-capture-policy.js +44 -0
  215. package/dist/memory-consolidation-handlers.d.ts +6 -0
  216. package/dist/memory-consolidation-handlers.d.ts.map +1 -0
  217. package/dist/memory-consolidation-handlers.js +491 -0
  218. package/dist/memory-consolidation-registry.d.ts +47 -0
  219. package/dist/memory-consolidation-registry.d.ts.map +1 -0
  220. package/dist/memory-consolidation-registry.js +106 -0
  221. package/dist/memory-conv-handlers.d.ts +8 -0
  222. package/dist/memory-conv-handlers.d.ts.map +1 -0
  223. package/dist/memory-conv-handlers.js +369 -0
  224. package/dist/memory-conversation-context.d.ts +13 -0
  225. package/dist/memory-conversation-context.d.ts.map +1 -0
  226. package/dist/memory-conversation-context.js +22 -0
  227. package/dist/memory-diagnostics.d.ts +29 -0
  228. package/dist/memory-diagnostics.d.ts.map +1 -0
  229. package/dist/memory-diagnostics.js +122 -0
  230. package/dist/memory-embedding.d.ts +21 -0
  231. package/dist/memory-embedding.d.ts.map +1 -0
  232. package/dist/memory-embedding.js +264 -0
  233. package/dist/memory-handlers.d.ts +19 -0
  234. package/dist/memory-handlers.d.ts.map +1 -0
  235. package/dist/memory-handlers.js +1204 -0
  236. package/dist/memory-maintenance-handlers.d.ts +35 -0
  237. package/dist/memory-maintenance-handlers.d.ts.map +1 -0
  238. package/dist/memory-maintenance-handlers.js +219 -0
  239. package/dist/memory-record-builders.d.ts +4 -0
  240. package/dist/memory-record-builders.d.ts.map +1 -0
  241. package/dist/memory-record-builders.js +19 -0
  242. package/dist/memory-retention.d.ts +31 -0
  243. package/dist/memory-retention.d.ts.map +1 -0
  244. package/dist/memory-retention.js +151 -0
  245. package/dist/memory-retrieval-signals.d.ts +12 -0
  246. package/dist/memory-retrieval-signals.d.ts.map +1 -0
  247. package/dist/memory-retrieval-signals.js +100 -0
  248. package/dist/memory-salience.d.ts +12 -0
  249. package/dist/memory-salience.d.ts.map +1 -0
  250. package/dist/memory-salience.js +154 -0
  251. package/dist/memory-scope-sanitizer.d.ts +6 -0
  252. package/dist/memory-scope-sanitizer.d.ts.map +1 -0
  253. package/dist/memory-scope-sanitizer.js +106 -0
  254. package/dist/memory-target-resolver.d.ts +4 -0
  255. package/dist/memory-target-resolver.d.ts.map +1 -0
  256. package/dist/memory-target-resolver.js +73 -0
  257. package/dist/memory-workflow-port.d.ts +14 -0
  258. package/dist/memory-workflow-port.d.ts.map +1 -0
  259. package/dist/memory-workflow-port.js +186 -0
  260. package/dist/private-json.d.ts +3 -0
  261. package/dist/private-json.d.ts.map +1 -0
  262. package/dist/private-json.js +62 -0
  263. package/dist/promptEnhancer/index.d.ts +3 -0
  264. package/dist/promptEnhancer/index.d.ts.map +1 -0
  265. package/dist/promptEnhancer/index.js +5 -0
  266. package/dist/promptEnhancer/orchestrate.d.ts +2 -0
  267. package/dist/promptEnhancer/orchestrate.d.ts.map +1 -0
  268. package/dist/promptEnhancer/orchestrate.js +5 -0
  269. package/dist/promptEnhancer/routes.d.ts +9 -0
  270. package/dist/promptEnhancer/routes.d.ts.map +1 -0
  271. package/dist/promptEnhancer/routes.js +205 -0
  272. package/dist/qualityIntelligence/capsuleAdapter.d.ts +27 -0
  273. package/dist/qualityIntelligence/capsuleAdapter.d.ts.map +1 -0
  274. package/dist/qualityIntelligence/capsuleAdapter.js +57 -0
  275. package/dist/qualityIntelligence/connectorAuthorization.d.ts +22 -0
  276. package/dist/qualityIntelligence/connectorAuthorization.d.ts.map +1 -0
  277. package/dist/qualityIntelligence/connectorAuthorization.js +35 -0
  278. package/dist/qualityIntelligence/connectorErrors.d.ts +16 -0
  279. package/dist/qualityIntelligence/connectorErrors.d.ts.map +1 -0
  280. package/dist/qualityIntelligence/connectorErrors.js +56 -0
  281. package/dist/qualityIntelligence/connectorRoutes.d.ts +7 -0
  282. package/dist/qualityIntelligence/connectorRoutes.d.ts.map +1 -0
  283. package/dist/qualityIntelligence/connectorRoutes.js +167 -0
  284. package/dist/qualityIntelligence/editRoutes.d.ts +5 -0
  285. package/dist/qualityIntelligence/editRoutes.d.ts.map +1 -0
  286. package/dist/qualityIntelligence/editRoutes.js +293 -0
  287. package/dist/qualityIntelligence/exportAssembly.d.ts +22 -0
  288. package/dist/qualityIntelligence/exportAssembly.d.ts.map +1 -0
  289. package/dist/qualityIntelligence/exportAssembly.js +352 -0
  290. package/dist/qualityIntelligence/exportRoutes.d.ts +5 -0
  291. package/dist/qualityIntelligence/exportRoutes.d.ts.map +1 -0
  292. package/dist/qualityIntelligence/exportRoutes.js +320 -0
  293. package/dist/qualityIntelligence/figma/figmaConcurrency.d.ts +8 -0
  294. package/dist/qualityIntelligence/figma/figmaConcurrency.d.ts.map +1 -0
  295. package/dist/qualityIntelligence/figma/figmaConcurrency.js +34 -0
  296. package/dist/qualityIntelligence/figma/figmaConnector.d.ts +65 -0
  297. package/dist/qualityIntelligence/figma/figmaConnector.d.ts.map +1 -0
  298. package/dist/qualityIntelligence/figma/figmaConnector.js +184 -0
  299. package/dist/qualityIntelligence/figma/figmaConnectorAudit.d.ts +52 -0
  300. package/dist/qualityIntelligence/figma/figmaConnectorAudit.d.ts.map +1 -0
  301. package/dist/qualityIntelligence/figma/figmaConnectorAudit.js +63 -0
  302. package/dist/qualityIntelligence/figma/figmaConnectorErrors.d.ts +31 -0
  303. package/dist/qualityIntelligence/figma/figmaConnectorErrors.d.ts.map +1 -0
  304. package/dist/qualityIntelligence/figma/figmaConnectorErrors.js +220 -0
  305. package/dist/qualityIntelligence/figma/figmaConnectorMetrics.d.ts +44 -0
  306. package/dist/qualityIntelligence/figma/figmaConnectorMetrics.d.ts.map +1 -0
  307. package/dist/qualityIntelligence/figma/figmaConnectorMetrics.js +49 -0
  308. package/dist/qualityIntelligence/figma/figmaConsent.d.ts +39 -0
  309. package/dist/qualityIntelligence/figma/figmaConsent.d.ts.map +1 -0
  310. package/dist/qualityIntelligence/figma/figmaConsent.js +62 -0
  311. package/dist/qualityIntelligence/figma/figmaHttpPort.d.ts +28 -0
  312. package/dist/qualityIntelligence/figma/figmaHttpPort.d.ts.map +1 -0
  313. package/dist/qualityIntelligence/figma/figmaHttpPort.js +70 -0
  314. package/dist/qualityIntelligence/figma/figmaObservedActions.d.ts +49 -0
  315. package/dist/qualityIntelligence/figma/figmaObservedActions.d.ts.map +1 -0
  316. package/dist/qualityIntelligence/figma/figmaObservedActions.js +89 -0
  317. package/dist/qualityIntelligence/figma/figmaReadiness.d.ts +32 -0
  318. package/dist/qualityIntelligence/figma/figmaReadiness.d.ts.map +1 -0
  319. package/dist/qualityIntelligence/figma/figmaReadiness.js +67 -0
  320. package/dist/qualityIntelligence/figma/figmaRenderPort.d.ts +29 -0
  321. package/dist/qualityIntelligence/figma/figmaRenderPort.d.ts.map +1 -0
  322. package/dist/qualityIntelligence/figma/figmaRenderPort.js +93 -0
  323. package/dist/qualityIntelligence/figma/figmaResnapshot.d.ts +28 -0
  324. package/dist/qualityIntelligence/figma/figmaResnapshot.d.ts.map +1 -0
  325. package/dist/qualityIntelligence/figma/figmaResnapshot.js +38 -0
  326. package/dist/qualityIntelligence/figma/figmaRetry.d.ts +31 -0
  327. package/dist/qualityIntelligence/figma/figmaRetry.d.ts.map +1 -0
  328. package/dist/qualityIntelligence/figma/figmaRetry.js +62 -0
  329. package/dist/qualityIntelligence/figma/figmaScopeRef.d.ts +9 -0
  330. package/dist/qualityIntelligence/figma/figmaScopeRef.d.ts.map +1 -0
  331. package/dist/qualityIntelligence/figma/figmaScopeRef.js +18 -0
  332. package/dist/qualityIntelligence/figma/figmaScopedPagination.d.ts +86 -0
  333. package/dist/qualityIntelligence/figma/figmaScopedPagination.d.ts.map +1 -0
  334. package/dist/qualityIntelligence/figma/figmaScopedPagination.js +308 -0
  335. package/dist/qualityIntelligence/figma/figmaSnapshotBuilder.d.ts +31 -0
  336. package/dist/qualityIntelligence/figma/figmaSnapshotBuilder.d.ts.map +1 -0
  337. package/dist/qualityIntelligence/figma/figmaSnapshotBuilder.js +314 -0
  338. package/dist/qualityIntelligence/figma/figmaSnapshotHash.d.ts +18 -0
  339. package/dist/qualityIntelligence/figma/figmaSnapshotHash.d.ts.map +1 -0
  340. package/dist/qualityIntelligence/figma/figmaSnapshotHash.js +63 -0
  341. package/dist/qualityIntelligence/figma/figmaSnapshotTypes.d.ts +65 -0
  342. package/dist/qualityIntelligence/figma/figmaSnapshotTypes.d.ts.map +1 -0
  343. package/dist/qualityIntelligence/figma/figmaSnapshotTypes.js +13 -0
  344. package/dist/qualityIntelligence/figma/figmaTokenSource.d.ts +9 -0
  345. package/dist/qualityIntelligence/figma/figmaTokenSource.d.ts.map +1 -0
  346. package/dist/qualityIntelligence/figma/figmaTokenSource.js +61 -0
  347. package/dist/qualityIntelligence/figma/figmaTokenStore.d.ts +19 -0
  348. package/dist/qualityIntelligence/figma/figmaTokenStore.d.ts.map +1 -0
  349. package/dist/qualityIntelligence/figma/figmaTokenStore.js +156 -0
  350. package/dist/qualityIntelligence/figma/figmaUrl.d.ts +6 -0
  351. package/dist/qualityIntelligence/figma/figmaUrl.d.ts.map +1 -0
  352. package/dist/qualityIntelligence/figma/figmaUrl.js +36 -0
  353. package/dist/qualityIntelligence/figma/index.d.ts +20 -0
  354. package/dist/qualityIntelligence/figma/index.d.ts.map +1 -0
  355. package/dist/qualityIntelligence/figma/index.js +26 -0
  356. package/dist/qualityIntelligence/figmaCodegenRoutes.d.ts +28 -0
  357. package/dist/qualityIntelligence/figmaCodegenRoutes.d.ts.map +1 -0
  358. package/dist/qualityIntelligence/figmaCodegenRoutes.js +165 -0
  359. package/dist/qualityIntelligence/figmaSnapshotAdapter.d.ts +55 -0
  360. package/dist/qualityIntelligence/figmaSnapshotAdapter.d.ts.map +1 -0
  361. package/dist/qualityIntelligence/figmaSnapshotAdapter.js +219 -0
  362. package/dist/qualityIntelligence/figmaSnapshotOrchestration.d.ts +64 -0
  363. package/dist/qualityIntelligence/figmaSnapshotOrchestration.d.ts.map +1 -0
  364. package/dist/qualityIntelligence/figmaSnapshotOrchestration.js +203 -0
  365. package/dist/qualityIntelligence/figmaSnapshotRoutes.d.ts +112 -0
  366. package/dist/qualityIntelligence/figmaSnapshotRoutes.d.ts.map +1 -0
  367. package/dist/qualityIntelligence/figmaSnapshotRoutes.js +1063 -0
  368. package/dist/qualityIntelligence/figmaSnapshotScreenIds.d.ts +19 -0
  369. package/dist/qualityIntelligence/figmaSnapshotScreenIds.d.ts.map +1 -0
  370. package/dist/qualityIntelligence/figmaSnapshotScreenIds.js +75 -0
  371. package/dist/qualityIntelligence/generationPort.d.ts +15 -0
  372. package/dist/qualityIntelligence/generationPort.d.ts.map +1 -0
  373. package/dist/qualityIntelligence/generationPort.js +185 -0
  374. package/dist/qualityIntelligence/handoffErrors.d.ts +9 -0
  375. package/dist/qualityIntelligence/handoffErrors.d.ts.map +1 -0
  376. package/dist/qualityIntelligence/handoffErrors.js +21 -0
  377. package/dist/qualityIntelligence/handoffRoutes.d.ts +15 -0
  378. package/dist/qualityIntelligence/handoffRoutes.d.ts.map +1 -0
  379. package/dist/qualityIntelligence/handoffRoutes.js +341 -0
  380. package/dist/qualityIntelligence/index.d.ts +17 -0
  381. package/dist/qualityIntelligence/index.d.ts.map +1 -0
  382. package/dist/qualityIntelligence/index.js +36 -0
  383. package/dist/qualityIntelligence/judgePort.d.ts +30 -0
  384. package/dist/qualityIntelligence/judgePort.d.ts.map +1 -0
  385. package/dist/qualityIntelligence/judgePort.js +326 -0
  386. package/dist/qualityIntelligence/modelSelection.d.ts +58 -0
  387. package/dist/qualityIntelligence/modelSelection.d.ts.map +1 -0
  388. package/dist/qualityIntelligence/modelSelection.js +148 -0
  389. package/dist/qualityIntelligence/reCheckRoutes.d.ts +6 -0
  390. package/dist/qualityIntelligence/reCheckRoutes.d.ts.map +1 -0
  391. package/dist/qualityIntelligence/reCheckRoutes.js +1157 -0
  392. package/dist/qualityIntelligence/retentionEnforcement.d.ts +13 -0
  393. package/dist/qualityIntelligence/retentionEnforcement.d.ts.map +1 -0
  394. package/dist/qualityIntelligence/retentionEnforcement.js +47 -0
  395. package/dist/qualityIntelligence/retentionRoutes.d.ts +8 -0
  396. package/dist/qualityIntelligence/retentionRoutes.d.ts.map +1 -0
  397. package/dist/qualityIntelligence/retentionRoutes.js +74 -0
  398. package/dist/qualityIntelligence/reviewRoutes.d.ts +5 -0
  399. package/dist/qualityIntelligence/reviewRoutes.d.ts.map +1 -0
  400. package/dist/qualityIntelligence/reviewRoutes.js +145 -0
  401. package/dist/qualityIntelligence/reviewStore.d.ts +75 -0
  402. package/dist/qualityIntelligence/reviewStore.d.ts.map +1 -0
  403. package/dist/qualityIntelligence/reviewStore.js +170 -0
  404. package/dist/qualityIntelligence/runExecution.d.ts +36 -0
  405. package/dist/qualityIntelligence/runExecution.d.ts.map +1 -0
  406. package/dist/qualityIntelligence/runExecution.js +180 -0
  407. package/dist/qualityIntelligence/runIngestion.d.ts +70 -0
  408. package/dist/qualityIntelligence/runIngestion.d.ts.map +1 -0
  409. package/dist/qualityIntelligence/runIngestion.js +1235 -0
  410. package/dist/qualityIntelligence/runRegistry.d.ts +31 -0
  411. package/dist/qualityIntelligence/runRegistry.d.ts.map +1 -0
  412. package/dist/qualityIntelligence/runRegistry.js +66 -0
  413. package/dist/qualityIntelligence/runRoutes.d.ts +16 -0
  414. package/dist/qualityIntelligence/runRoutes.d.ts.map +1 -0
  415. package/dist/qualityIntelligence/runRoutes.js +357 -0
  416. package/dist/qualityIntelligence/traceabilityRoutes.d.ts +5 -0
  417. package/dist/qualityIntelligence/traceabilityRoutes.d.ts.map +1 -0
  418. package/dist/qualityIntelligence/traceabilityRoutes.js +173 -0
  419. package/dist/qualityIntelligence/uiRoutes.d.ts +7 -0
  420. package/dist/qualityIntelligence/uiRoutes.d.ts.map +1 -0
  421. package/dist/qualityIntelligence/uiRoutes.js +336 -0
  422. package/dist/read-handlers.d.ts +9 -0
  423. package/dist/read-handlers.d.ts.map +1 -0
  424. package/dist/read-handlers.js +265 -0
  425. package/dist/relationship-handlers.d.ts +191 -0
  426. package/dist/relationship-handlers.d.ts.map +1 -0
  427. package/dist/relationship-handlers.js +0 -0
  428. package/dist/routes.d.ts +37 -0
  429. package/dist/routes.d.ts.map +1 -0
  430. package/dist/routes.js +507 -0
  431. package/dist/run-engine.d.ts +25 -0
  432. package/dist/run-engine.d.ts.map +1 -0
  433. package/dist/run-engine.js +385 -0
  434. package/dist/run-handlers.d.ts +9 -0
  435. package/dist/run-handlers.d.ts.map +1 -0
  436. package/dist/run-handlers.js +465 -0
  437. package/dist/run-request.d.ts +17 -0
  438. package/dist/run-request.d.ts.map +1 -0
  439. package/dist/run-request.js +219 -0
  440. package/dist/runs.d.ts +47 -0
  441. package/dist/runs.d.ts.map +1 -0
  442. package/dist/runs.js +100 -0
  443. package/dist/server.d.ts +13 -0
  444. package/dist/server.d.ts.map +1 -0
  445. package/dist/server.js +152 -0
  446. package/dist/sink.d.ts +28 -0
  447. package/dist/sink.d.ts.map +1 -0
  448. package/dist/sink.js +80 -0
  449. package/dist/sse-write.d.ts +9 -0
  450. package/dist/sse-write.d.ts.map +1 -0
  451. package/dist/sse-write.js +26 -0
  452. package/dist/sse.d.ts +8 -0
  453. package/dist/sse.d.ts.map +1 -0
  454. package/dist/sse.js +27 -0
  455. package/dist/static.d.ts +5 -0
  456. package/dist/static.d.ts.map +1 -0
  457. package/dist/static.js +76 -0
  458. package/dist/store/chats.d.ts +17 -0
  459. package/dist/store/chats.d.ts.map +1 -0
  460. package/dist/store/chats.js +624 -0
  461. package/dist/store/db.d.ts +11 -0
  462. package/dist/store/db.d.ts.map +1 -0
  463. package/dist/store/db.js +203 -0
  464. package/dist/store/errors.d.ts +13 -0
  465. package/dist/store/errors.d.ts.map +1 -0
  466. package/dist/store/errors.js +30 -0
  467. package/dist/store/index.d.ts +7 -0
  468. package/dist/store/index.d.ts.map +1 -0
  469. package/dist/store/index.js +6 -0
  470. package/dist/store/messages.d.ts +8 -0
  471. package/dist/store/messages.d.ts.map +1 -0
  472. package/dist/store/messages.js +149 -0
  473. package/dist/store/paths.d.ts +5 -0
  474. package/dist/store/paths.d.ts.map +1 -0
  475. package/dist/store/paths.js +84 -0
  476. package/dist/store/projects.d.ts +8 -0
  477. package/dist/store/projects.d.ts.map +1 -0
  478. package/dist/store/projects.js +59 -0
  479. package/dist/store/relationship-audit.d.ts +42 -0
  480. package/dist/store/relationship-audit.d.ts.map +1 -0
  481. package/dist/store/relationship-audit.js +155 -0
  482. package/dist/store/relationships.d.ts +191 -0
  483. package/dist/store/relationships.d.ts.map +1 -0
  484. package/dist/store/relationships.js +724 -0
  485. package/dist/store/schema.d.ts +4 -0
  486. package/dist/store/schema.d.ts.map +1 -0
  487. package/dist/store/schema.js +220 -0
  488. package/dist/store/types.d.ts +29 -0
  489. package/dist/store/types.d.ts.map +1 -0
  490. package/dist/store/types.js +8 -0
  491. package/dist/store/validation.d.ts +7 -0
  492. package/dist/store/validation.d.ts.map +1 -0
  493. package/dist/store/validation.js +117 -0
  494. package/dist/store-handlers.d.ts +17 -0
  495. package/dist/store-handlers.d.ts.map +1 -0
  496. package/dist/store-handlers.js +872 -0
  497. package/dist/terminal-errors.d.ts +22 -0
  498. package/dist/terminal-errors.d.ts.map +1 -0
  499. package/dist/terminal-errors.js +45 -0
  500. package/dist/terminal-evidence.d.ts +21 -0
  501. package/dist/terminal-evidence.d.ts.map +1 -0
  502. package/dist/terminal-evidence.js +65 -0
  503. package/dist/terminal-routes.d.ts +10 -0
  504. package/dist/terminal-routes.d.ts.map +1 -0
  505. package/dist/terminal-routes.js +219 -0
  506. package/dist/terminal.d.ts +68 -0
  507. package/dist/terminal.d.ts.map +1 -0
  508. package/dist/terminal.js +855 -0
  509. package/package.json +52 -0
@@ -0,0 +1,762 @@
1
+ // Epic #189 Slice 2 — heterogeneous grounded merge. A chat may carry BOTH connected folders
2
+ // (#532, lexical) AND Local Knowledge connectors (#189, vector), or two or more connectors. Asking
3
+ // one question must retrieve from EVERY source and return ONE merged grounded answer with
4
+ // source-tagged citations from both engines. This module owns that merge branch only; the
5
+ // folders-only (#532) and single-connector (#189) paths are untouched so their wire output stays
6
+ // byte-identical (AC). It composes the exported folder helpers (grounded-qa-multi-source.ts) and
7
+ // connector seams (local-knowledge-grounded-qa.ts) without re-implementing retrieval.
8
+ import { randomUUID } from "node:crypto";
9
+ import { resolveCostClass } from "@oscharko-dev/keiko-model-gateway";
10
+ import { persistConnectedContextEvidence } from "@oscharko-dev/keiko-evidence";
11
+ import { createSqliteAuditSink, readCitationExcerpt, runLocalKnowledgeRetrieval, } from "@oscharko-dev/keiko-local-knowledge";
12
+ import { rerankAndSelect } from "./grounded-rerank.js";
13
+ import { CANDIDATE_OMISSION_REASONS, CONNECTED_CONTEXT_SCHEMA_VERSION, DEFAULT_EXPLORATION_BUDGET, } from "@oscharko-dev/keiko-contracts/connected-context";
14
+ import { buildGroundedAnswerContextPackSummary, } from "@oscharko-dev/keiko-contracts/bff-wire";
15
+ import { redact } from "@oscharko-dev/keiko-security";
16
+ import { errorBody } from "./routes.js";
17
+ import { currentGroundingLimits, currentRedactionSecrets } from "./deps.js";
18
+ import { ClarificationNeededError, clarificationUserMessage, } from "./grounded-orchestrator.js";
19
+ import { buildConnectedScopes, defaultRetriever, mergeContextPackSummaries, sourceLabels, splitExplorationBudget, } from "./grounded-qa-multi-source.js";
20
+ import { MAX_PROMPT_REFERENCES, buildSelectedScopeSourceLookup, createEmbeddingAdapter, openStoreForDeps, projectLocalKnowledgeCitation, scopeStateFailure, selectedCapsulesForScope, } from "./local-knowledge-grounded-qa.js";
21
+ import { GROUNDED_SYSTEM_PROMPT } from "./grounded-prompt.js";
22
+ import { normalizeGroundedAnswerPayload, } from "./grounded-answer.js";
23
+ import { assertUsableAssistantContent } from "./assistant-response.js";
24
+ import { buildCitations, buildQuery, buildSelectedScopeFrom, clarificationRequest, deriveScopeIdFrom, ensureNotCancelled, internalError, isValidGroundedPack, mappedGatewayError, mappedWorkspaceError, persistGroundedExchange, promptSafeExcerptText, redactString, } from "./grounded-qa.js";
25
+ // ─── Canonical connector reader ───────────────────────────────────────────────
26
+ // Mirrors buildConnectedScopes: the plural `localKnowledgeScopes` list supersedes the legacy single
27
+ // `localKnowledgeScope`. Readers must not mix the two — the list, when present, is authoritative.
28
+ export function buildLocalKnowledgeScopes(chat) {
29
+ return chat.localKnowledgeScopes ?? (chat.localKnowledgeScope ? [chat.localKnowledgeScope] : []);
30
+ }
31
+ // ─── Connector source labels (disambiguated like sourceLabels) ────────────────
32
+ export function connectorLabels(rawLabels) {
33
+ const counts = new Map();
34
+ for (const raw of rawLabels)
35
+ counts.set(raw, (counts.get(raw) ?? 0) + 1);
36
+ const seen = new Map();
37
+ return rawLabels.map((raw) => {
38
+ if ((counts.get(raw) ?? 0) <= 1)
39
+ return raw;
40
+ const ordinal = (seen.get(raw) ?? 0) + 1;
41
+ seen.set(raw, ordinal);
42
+ return `${raw}#${String(ordinal)}`;
43
+ });
44
+ }
45
+ // Builds a single RRF-selected set that covers both folder and connector candidates. The selected
46
+ // set is the SOLE source of truth for both the prompt and the citations; the two paths must not
47
+ // diverge from this point forward.
48
+ function folderRerankInputs(folders, redactor) {
49
+ return folders.flatMap((src) => src.pack.files.flatMap((file) => file.excerpts.map((excerpt) => ({
50
+ kind: "folder",
51
+ redactedText: redactString(redactor, excerpt.content),
52
+ engineScore: excerpt.atom.score,
53
+ sourceLabel: redactString(redactor, src.label),
54
+ tieKey: excerpt.atom.stableId,
55
+ payload: {
56
+ kind: "folder",
57
+ scopePath: excerpt.atom.scopePath,
58
+ lineRange: excerpt.atom.lineRange,
59
+ score: excerpt.atom.score,
60
+ stableId: excerpt.atom.stableId,
61
+ },
62
+ }))));
63
+ }
64
+ function connectorRerankInputs(connectors, store, redactor, maxPromptReferences, maxExcerptChars) {
65
+ return connectors.flatMap((src) => {
66
+ const lookup = buildSelectedScopeSourceLookup(store, src.selected);
67
+ return src.references.slice(0, maxPromptReferences).map((reference) => ({
68
+ kind: "connector",
69
+ redactedText: redactString(redactor, readCitationExcerpt(store, reference.capsuleId, reference.citation, maxExcerptChars)),
70
+ engineScore: reference.score,
71
+ sourceLabel: redactString(redactor, src.label),
72
+ tieKey: String(reference.chunkId),
73
+ payload: { kind: "connector", reference, lookup },
74
+ }));
75
+ });
76
+ }
77
+ function buildUnifiedSelection(ctx, folders, connectors, store) {
78
+ const limits = currentGroundingLimits(ctx.deps);
79
+ const { redactor } = ctx.deps;
80
+ const inputs = [
81
+ ...folderRerankInputs(folders, redactor),
82
+ ...connectorRerankInputs(connectors, store, redactor, limits.maxPromptReferences, limits.maxExcerptChars),
83
+ ];
84
+ return rerankAndSelect(inputs, {
85
+ maxCandidates: limits.hybridMaxCandidates,
86
+ maxExcerptBytes: limits.hybridMaxExcerptBytes,
87
+ });
88
+ }
89
+ // ─── Folder retrieval (mirrors runMultiSourceAsk's loop) ──────────────────────
90
+ async function retrieveFolderPacks(ctx, folderScopes, query, retriever) {
91
+ const labels = sourceLabels(folderScopes);
92
+ const budget = splitExplorationBudget(DEFAULT_EXPLORATION_BUDGET, folderScopes.length);
93
+ const retrieved = [];
94
+ const skipped = [];
95
+ for (let i = 0; i < folderScopes.length; i += 1) {
96
+ ensureNotCancelled(ctx.signal);
97
+ const cs = folderScopes[i];
98
+ const label = labels[i];
99
+ if (cs === undefined || label === undefined)
100
+ continue;
101
+ const scope = buildSelectedScopeFrom(ctx.chat, cs, deriveScopeIdFrom(ctx.chat, cs, i));
102
+ let out;
103
+ try {
104
+ out = await retriever({
105
+ scope,
106
+ query,
107
+ workspaceRoot: scope.workspaceRoot,
108
+ budget,
109
+ });
110
+ }
111
+ catch (error) {
112
+ // Mirror retrieveOneConnector (GRD-006): a per-source embedding-adapter outage is a skippable
113
+ // degradation (answer from the remaining sources, record the skip). EVERY other error MUST
114
+ // propagate — ClarificationNeededError -> 400, ProviderError -> 502, generic -> 500 — so the
115
+ // boundary maps and redacts it instead of silently dropping a folder and returning a
116
+ // misleadingly "complete" answer.
117
+ if (error instanceof EmbeddingAdapterError) {
118
+ skipped.push({
119
+ label,
120
+ reason: "embedding-unavailable",
121
+ message: "Embedding adapter unavailable.",
122
+ });
123
+ continue;
124
+ }
125
+ throw error;
126
+ }
127
+ if (!isValidGroundedPack(out.pack)) {
128
+ skipped.push({ label, reason: "pack-validation-failed", message: "Pack validation failed." });
129
+ continue;
130
+ }
131
+ retrieved.push({ label, pack: out.pack, elapsedMs: out.elapsedMs, scope, plan: out.plan });
132
+ }
133
+ return { retrieved, skipped };
134
+ }
135
+ // ─── Connector retrieval ──────────────────────────────────────────────────────
136
+ function resolveConnectorScopes(connectorScopes, store) {
137
+ const resolved = [];
138
+ for (const scope of connectorScopes) {
139
+ const selected = selectedCapsulesForScope(scope, store);
140
+ if ("status" in selected)
141
+ return selected;
142
+ resolved.push(selected);
143
+ }
144
+ return resolved;
145
+ }
146
+ function connectorQuery(scope, content) {
147
+ return {
148
+ text: content,
149
+ topK: MAX_PROMPT_REFERENCES,
150
+ ...(scope.kind === "capsule" ? { capsuleId: scope.capsuleId } : {}),
151
+ ...(scope.kind === "capsule-set" ? { capsuleSetId: scope.capsuleSetId } : {}),
152
+ };
153
+ }
154
+ function defaultConnectorRetrieve(ctx) {
155
+ return async (store, scope, selected) => {
156
+ const embeddingAdapter = createEmbeddingAdapter(ctx.deps, selected.capsules);
157
+ if ("status" in embeddingAdapter) {
158
+ throw new EmbeddingAdapterError(embeddingAdapter);
159
+ }
160
+ return runLocalKnowledgeRetrieval({ store, embeddingAdapter, signal: ctx.signal }, connectorQuery(scope, ctx.content));
161
+ };
162
+ }
163
+ export class EmbeddingAdapterError extends Error {
164
+ result;
165
+ constructor(result) {
166
+ super("embedding adapter unavailable");
167
+ this.result = result;
168
+ this.name = "EmbeddingAdapterError";
169
+ }
170
+ }
171
+ async function retrieveConnectors(ctx, store, connectorScopes, resolved) {
172
+ const retrieve = ctx.connectorRetrieve ?? defaultConnectorRetrieve(ctx);
173
+ const labels = connectorLabels(resolved.map((s) => s.scopeLabel));
174
+ const retrieved = [];
175
+ const skipped = [];
176
+ for (let i = 0; i < connectorScopes.length; i += 1) {
177
+ ensureNotCancelled(ctx.signal);
178
+ const scope = connectorScopes[i];
179
+ const selected = resolved[i];
180
+ const label = labels[i];
181
+ if (scope === undefined || selected === undefined || label === undefined)
182
+ continue;
183
+ const failure = scopeStateFailure(selected);
184
+ if (failure !== undefined) {
185
+ skipped.push({ label, reason: failure.reason, message: failure.message });
186
+ continue;
187
+ }
188
+ const outcome = await retrieveOneConnector(retrieve, store, scope, selected);
189
+ if ("status" in outcome) {
190
+ skipped.push({
191
+ label,
192
+ reason: "embedding-unavailable",
193
+ message: "Embedding adapter unavailable.",
194
+ });
195
+ continue;
196
+ }
197
+ retrieved.push({ label, selected, references: outcome.references });
198
+ }
199
+ return { retrieved, skipped };
200
+ }
201
+ async function retrieveOneConnector(retrieve, store, scope, selected) {
202
+ try {
203
+ return await retrieve(store, scope, selected);
204
+ }
205
+ catch (error) {
206
+ if (error instanceof EmbeddingAdapterError)
207
+ return error.result;
208
+ throw error;
209
+ }
210
+ }
211
+ // ─── Merged prompt ────────────────────────────────────────────────────────────
212
+ const HYBRID_NO_EVIDENCE_ANSWER = "Keine Evidenz in den ausgewählten verbundenen Quellen gefunden.";
213
+ const HYBRID_SYSTEM_PROMPT = `${GROUNDED_SYSTEM_PROMPT} Connector excerpts are indexed-document citations: attribute every ` +
214
+ "connector claim to its source label and the matching [n] marker in addition to any file reference.";
215
+ // Builds the user message from the SAME selected set used for citations. Each candidate gets a
216
+ // single global [n] marker that is consistent with the citation arrays. redactedText is
217
+ // already redacted — do NOT pass it through redactString again.
218
+ function buildRerankedHybridUserMessage(question, selected, redactor) {
219
+ const folderCount = selected.filter((s) => s.kind === "folder").length;
220
+ const connectorCount = selected.filter((s) => s.kind === "connector").length;
221
+ const lines = [
222
+ "User question:",
223
+ redactString(redactor, question),
224
+ "",
225
+ `Connected sources: ${String(folderCount)} folder(s), ${String(connectorCount)} connector(s).`,
226
+ "Cite every claim by its [n] marker and source label.",
227
+ "",
228
+ ];
229
+ for (const candidate of selected) {
230
+ const kindLabel = candidate.kind === "folder" ? "Folder" : "Connector";
231
+ lines.push(`[${String(candidate.marker)}] ### ${kindLabel} source: ${candidate.sourceLabel}`);
232
+ lines.push("```text");
233
+ lines.push(candidate.redactedText.length > 0
234
+ ? promptSafeExcerptText(candidate.redactedText)
235
+ : "(No excerpt text available.)");
236
+ lines.push("```");
237
+ lines.push("");
238
+ }
239
+ return lines.join("\n");
240
+ }
241
+ export function createHybridAnswerer(model, modelId, signal) {
242
+ return async (system, user) => {
243
+ ensureNotCancelled(signal);
244
+ const response = await model.call({
245
+ modelId,
246
+ messages: [
247
+ { role: "system", content: system },
248
+ { role: "user", content: user },
249
+ ],
250
+ stream: false,
251
+ }, signal);
252
+ const content = response.content.trim();
253
+ assertUsableAssistantContent(content, modelId);
254
+ return {
255
+ content,
256
+ usage: {
257
+ promptTokens: response.usage.promptTokens,
258
+ completionTokens: response.usage.completionTokens,
259
+ },
260
+ };
261
+ };
262
+ }
263
+ // ─── Citations + summaries ────────────────────────────────────────────────────
264
+ // Both citation arrays are derived from the SAME selected set so that the [n] markers in the
265
+ // prompt are always consistent with the citation arrays surfaced to the client.
266
+ function selectedFolderCitations(selected, redactor) {
267
+ return selected
268
+ .filter((s) => s.kind === "folder")
269
+ .map((s) => ({
270
+ scopePath: redactString(redactor, s.payload.scopePath),
271
+ lineRange: s.payload.lineRange,
272
+ score: s.payload.score,
273
+ stableId: redactString(redactor, s.payload.stableId),
274
+ source: s.sourceLabel,
275
+ marker: s.marker,
276
+ }));
277
+ }
278
+ function selectedConnectorCitations(selected, redactor) {
279
+ return selected
280
+ .filter((s) => s.kind === "connector")
281
+ .map((s) => projectLocalKnowledgeCitation(s.payload.reference, `[${String(s.marker)}]`, s.payload.lookup, (value) => redactString(redactor, value)));
282
+ }
283
+ function zeroExploration() {
284
+ return {
285
+ searchCalls: 0,
286
+ filesRead: 0,
287
+ excerptBytes: 0,
288
+ modelInputTokens: 0,
289
+ modelOutputTokens: 0,
290
+ elapsedMs: 0,
291
+ rerankCalls: 0,
292
+ };
293
+ }
294
+ function zeroBudget() {
295
+ return {
296
+ searchCallsMax: 0,
297
+ filesReadMax: 0,
298
+ excerptBytesMax: 0,
299
+ modelInputTokensMax: 0,
300
+ modelOutputTokensMax: 0,
301
+ elapsedMsMax: 0,
302
+ rerankCallsMax: 0,
303
+ };
304
+ }
305
+ function zeroOmittedCounts() {
306
+ const counts = {};
307
+ for (const reason of CANDIDATE_OMISSION_REASONS)
308
+ counts[reason] = 0;
309
+ return counts;
310
+ }
311
+ // The hybrid contract requires a folder summary even when a chat has zero folders (connector-only
312
+ // merge). This is a structurally empty, deterministic summary — no source pack to derive from.
313
+ function emptyFolderSummary() {
314
+ return {
315
+ schemaVersion: CONNECTED_CONTEXT_SCHEMA_VERSION,
316
+ scopeId: "scope-empty",
317
+ scopeKind: "workspace-root",
318
+ fileCount: 0,
319
+ queryKind: "natural-language",
320
+ usage: zeroExploration(),
321
+ budget: zeroBudget(),
322
+ citationCount: 0,
323
+ omittedCount: 0,
324
+ omittedCounts: zeroOmittedCounts(),
325
+ uncertaintyCount: 0,
326
+ elapsedMs: 0,
327
+ };
328
+ }
329
+ function folderSummary(folders, redactor) {
330
+ if (folders.length === 0)
331
+ return emptyFolderSummary();
332
+ return mergeContextPackSummaries(folders.map((src) => buildGroundedAnswerContextPackSummary(src.pack, buildCitations(src.pack, redactor).length, src.elapsedMs)));
333
+ }
334
+ function hashString32(value) {
335
+ let hash = 0x811c9dc5;
336
+ for (let i = 0; i < value.length; i += 1) {
337
+ hash ^= value.charCodeAt(i);
338
+ hash = Math.imul(hash, 0x01000193);
339
+ }
340
+ return (hash >>> 0).toString(16).padStart(8, "0");
341
+ }
342
+ function connectorSourceCount(connectors) {
343
+ const sourceIds = new Set();
344
+ for (const src of connectors) {
345
+ for (const capsule of src.selected.capsules) {
346
+ for (const id of capsule.sourceIds)
347
+ sourceIds.add(String(id));
348
+ }
349
+ }
350
+ return sourceIds.size;
351
+ }
352
+ // One merged knowledge summary across every connector. Counts are aggregated so the wire shape
353
+ // stays a single LocalKnowledgeGroundedAnswerContextSummary even when N connectors contributed.
354
+ // referencesUsed = connector candidates in the SHARED selected set; referenceBudget = the shared
355
+ // hybridMaxCandidates cap so the invariant referencesUsed <= referenceBudget always holds.
356
+ function knowledgeSummary(chat, connectors, citationCount, referencesUsed, referenceBudget) {
357
+ const capsuleCount = connectors.reduce((acc, src) => acc + src.selected.capsules.length, 0);
358
+ const label = connectors.map((src) => src.label).join("+");
359
+ const scopeKind = connectors.length === 1 ? connectors[0]?.selected.scopeKind : "capsule-set";
360
+ return {
361
+ kind: "local-knowledge",
362
+ scopeKind: scopeKind ?? "capsule-set",
363
+ scopeId: `lk-${hashString32(`${chat.id}|${label}`)}`,
364
+ scopeLabel: label,
365
+ capsuleCount,
366
+ sourceCount: connectorSourceCount(connectors),
367
+ citationCount,
368
+ referenceBudget,
369
+ referencesUsed,
370
+ };
371
+ }
372
+ function skippedUncertainty(skipped, redactor) {
373
+ return skipped.map((entry) => ({
374
+ kind: entry.reason,
375
+ claim: redactString(redactor, `Connector ${entry.label} skipped: ${entry.message}`),
376
+ }));
377
+ }
378
+ function folderUncertainty(folders, redactor) {
379
+ return folders.flatMap((src) => src.pack.uncertainty.map((u) => ({
380
+ kind: u.kind,
381
+ claim: redactString(redactor, u.claim),
382
+ })));
383
+ }
384
+ // ─── Evidence persistence ─────────────────────────────────────────────────────
385
+ // Persists ONE evidence run per folder source (mirrors the #532 per-source persist) plus the
386
+ // connector retrieval/answer-context audit via the LK sink (mirrors the single-connector path).
387
+ // Returns the first folder run id, surfaced as the answer's primary evidenceRunId, plus the full
388
+ // folder evidence set so reviewers can inspect every connected-context source.
389
+ function persistFolderEvidence(ctx, folders) {
390
+ let firstRunId;
391
+ const runIds = [];
392
+ for (const src of folders) {
393
+ const finishedAt = Date.now();
394
+ const startedAt = Math.max(0, finishedAt - src.elapsedMs);
395
+ const runId = `grounded-${randomUUID()}`;
396
+ persistConnectedContextEvidence({
397
+ runId,
398
+ modelId: ctx.modelId,
399
+ workspaceRoot: src.scope.workspaceRoot,
400
+ chatId: ctx.chat.id,
401
+ plan: src.plan,
402
+ pack: src.pack,
403
+ citationCount: buildCitations(src.pack, ctx.deps.redactor).length,
404
+ elapsedMs: src.elapsedMs,
405
+ startedAt,
406
+ finishedAt,
407
+ }, {
408
+ store: ctx.deps.evidenceStore,
409
+ env: ctx.deps.env,
410
+ additionalSecrets: currentRedactionSecrets(ctx.deps),
411
+ costClassResolver: resolveCostClass,
412
+ });
413
+ firstRunId ??= runId;
414
+ runIds.push(runId);
415
+ }
416
+ return { firstRunId, runIds };
417
+ }
418
+ function summariseReferenceUsage(references) {
419
+ const byCapsule = new Map();
420
+ for (const reference of references) {
421
+ const current = byCapsule.get(reference.capsuleId) ?? {
422
+ sourceIds: new Set(),
423
+ chunkIds: new Set(),
424
+ referenceCount: 0,
425
+ };
426
+ current.sourceIds.add(reference.citation.sourceId);
427
+ current.chunkIds.add(String(reference.chunkId));
428
+ current.referenceCount += 1;
429
+ byCapsule.set(reference.capsuleId, current);
430
+ }
431
+ return [...byCapsule.entries()]
432
+ .sort(([a], [b]) => (String(a) < String(b) ? -1 : 1))
433
+ .map(([capsuleId, value]) => ({
434
+ capsuleId,
435
+ sourceIds: [...value.sourceIds].sort((a, b) => (String(a) < String(b) ? -1 : 1)),
436
+ chunkIds: [...value.chunkIds].sort(),
437
+ referenceCount: value.referenceCount,
438
+ }));
439
+ }
440
+ function selectedConnectorReferences(selected) {
441
+ return selected
442
+ .filter((s) => s.kind === "connector")
443
+ .map((s) => s.payload.reference);
444
+ }
445
+ function emitRetrievalAuditForConnector(sink, src, occurredAt) {
446
+ const usage = summariseReferenceUsage(src.references);
447
+ if (usage.length === 0) {
448
+ for (const capsule of src.selected.capsules) {
449
+ sink.emit({
450
+ kind: "retrieval-performed",
451
+ capsuleId: capsule.id,
452
+ sourceIds: capsule.sourceIds,
453
+ chunkIds: [],
454
+ referenceCount: 0,
455
+ noEvidence: true,
456
+ occurredAt,
457
+ });
458
+ }
459
+ return;
460
+ }
461
+ for (const entry of usage) {
462
+ sink.emit({
463
+ kind: "retrieval-performed",
464
+ capsuleId: entry.capsuleId,
465
+ sourceIds: entry.sourceIds,
466
+ chunkIds: entry.chunkIds,
467
+ referenceCount: entry.referenceCount,
468
+ noEvidence: false,
469
+ occurredAt,
470
+ });
471
+ }
472
+ }
473
+ function emitAnswerContextAudit(sink, selected, modelId, occurredAt) {
474
+ for (const entry of summariseReferenceUsage(selectedConnectorReferences(selected))) {
475
+ sink.emit({
476
+ kind: "answer-context-assembled",
477
+ capsuleId: entry.capsuleId,
478
+ sourceIds: entry.sourceIds,
479
+ chunkIds: entry.chunkIds,
480
+ referenceCount: entry.referenceCount,
481
+ citationCount: entry.referenceCount,
482
+ occurredAt,
483
+ });
484
+ sink.emit({
485
+ kind: "model-context-sent",
486
+ capsuleId: entry.capsuleId,
487
+ sourceIds: entry.sourceIds,
488
+ chunkIds: entry.chunkIds,
489
+ referenceCount: entry.referenceCount,
490
+ citationCount: entry.referenceCount,
491
+ modelId,
492
+ occurredAt,
493
+ });
494
+ }
495
+ }
496
+ function persistConnectorAudit(store, connectors, selected, modelId) {
497
+ const sink = createSqliteAuditSink(store);
498
+ const occurredAt = Date.now();
499
+ for (const src of connectors) {
500
+ emitRetrievalAuditForConnector(sink, src, occurredAt);
501
+ }
502
+ emitAnswerContextAudit(sink, selected, modelId, occurredAt);
503
+ }
504
+ function buildHybridContextPack(ctx, sources, selected, limits, summary, assistant, knowledgeCitationCount) {
505
+ const selectedConnectorCount = selected.filter((s) => s.kind === "connector").length;
506
+ return {
507
+ kind: "hybrid",
508
+ folderSourceCount: sources.folderSourceCount,
509
+ connectorSourceCount: sources.connectorSourceCount,
510
+ folder: {
511
+ ...summary,
512
+ usage: {
513
+ ...summary.usage,
514
+ modelInputTokens: summary.usage.modelInputTokens + assistant.usage.promptTokens,
515
+ modelOutputTokens: summary.usage.modelOutputTokens + assistant.usage.completionTokens,
516
+ },
517
+ },
518
+ knowledge: knowledgeSummary(ctx.chat, sources.connectors, knowledgeCitationCount, selectedConnectorCount, limits.hybridMaxCandidates),
519
+ };
520
+ }
521
+ function noEvidenceUncertainty(selected, redactor) {
522
+ return selected.length === 0
523
+ ? [
524
+ {
525
+ kind: "no-evidence",
526
+ claim: redactString(redactor, HYBRID_NO_EVIDENCE_ANSWER),
527
+ },
528
+ ]
529
+ : [];
530
+ }
531
+ function assembleHybridAnswer(ctx, sources, store, selected, limits, assistant, ids) {
532
+ const { redactor } = ctx.deps;
533
+ const citations = selectedFolderCitations(selected, redactor);
534
+ const knowledgeCitations = selectedConnectorCitations(selected, redactor);
535
+ const { firstRunId: evidenceRunId, runIds: evidenceRunIds } = persistFolderEvidence(ctx, sources.folders);
536
+ persistConnectorAudit(store, sources.connectors, selected, ctx.modelId);
537
+ const elapsedMs = sources.folders.reduce((acc, src) => acc + src.elapsedMs, 0);
538
+ const summary = folderSummary(sources.folders, redactor);
539
+ return {
540
+ groundingKind: "hybrid",
541
+ ...ids,
542
+ evidenceRunId,
543
+ evidenceRunIds,
544
+ content: redactString(redactor, assistant.content),
545
+ citations,
546
+ knowledgeCitations,
547
+ uncertainty: [
548
+ ...folderUncertainty(sources.folders, redactor),
549
+ ...skippedUncertainty(sources.skippedFolders, redactor),
550
+ ...skippedUncertainty(sources.skipped, redactor),
551
+ ...noEvidenceUncertainty(selected, redactor),
552
+ ],
553
+ omittedCount: sources.folders.reduce((acc, src) => acc + src.pack.omitted.length, 0),
554
+ elapsedMs,
555
+ contextPack: buildHybridContextPack(ctx, sources, selected, limits, summary, assistant, knowledgeCitations.length),
556
+ };
557
+ }
558
+ function resolveHybridAnswerer(ctx) {
559
+ if (ctx.answer !== undefined)
560
+ return { answer: ctx.answer };
561
+ const model = ctx.deps.modelPortFactory(ctx.modelId);
562
+ if (model === undefined) {
563
+ return { status: 400, body: errorBody("NO_MODEL", "No model provider is configured.") };
564
+ }
565
+ return { answer: createHybridAnswerer(model, ctx.modelId, ctx.signal) };
566
+ }
567
+ function assembleHybridNoEvidenceRoute(ctx, store, meta, selected, limits) {
568
+ const content = redactString(ctx.deps.redactor, HYBRID_NO_EVIDENCE_ANSWER);
569
+ const [userMessage, assistantMessage] = persistGroundedExchange(ctx.deps, ctx.chat.id, redactString(ctx.deps.redactor, ctx.content), content);
570
+ const answer = assembleHybridAnswer(ctx, {
571
+ folders: meta.folderResult.retrieved,
572
+ connectors: meta.connectorResult.retrieved,
573
+ skipped: meta.connectorResult.skipped,
574
+ skippedFolders: meta.folderResult.skipped,
575
+ folderSourceCount: meta.folderScopeCount,
576
+ connectorSourceCount: meta.connectorScopeCount,
577
+ }, store, selected, limits, { content, usage: { promptTokens: 0, completionTokens: 0 } }, { userMessageId: userMessage.id, assistantMessageId: assistantMessage.id });
578
+ return { status: 200, body: answer };
579
+ }
580
+ export async function runHybridGroundedAsk(ctx) {
581
+ const env = openStoreForDeps(ctx.deps);
582
+ try {
583
+ return await runHybridWithStore(ctx, env.store);
584
+ }
585
+ catch (error) {
586
+ return mapHybridError(error, ctx.deps);
587
+ }
588
+ finally {
589
+ env.close();
590
+ }
591
+ }
592
+ function combinedSourceCap(limits) {
593
+ return Math.max(limits.maxConnectedSources, limits.maxLocalKnowledgeSources);
594
+ }
595
+ function combinedSourceCandidates(folders, connectors) {
596
+ return [
597
+ ...folders.map((scope, index) => ({
598
+ kind: "folder",
599
+ index,
600
+ connectedAtMs: scope.connectedAtMs,
601
+ })),
602
+ ...connectors.map((scope, index) => ({
603
+ kind: "connector",
604
+ index,
605
+ connectedAtMs: scope.connectedAtMs,
606
+ })),
607
+ ].sort((a, b) => {
608
+ if (a.connectedAtMs !== b.connectedAtMs)
609
+ return a.connectedAtMs - b.connectedAtMs;
610
+ if (a.kind !== b.kind)
611
+ return a.kind === "folder" ? -1 : 1;
612
+ return a.index - b.index;
613
+ });
614
+ }
615
+ function capSelectedIndexes(folders, connectors, totalCap) {
616
+ const selected = combinedSourceCandidates(folders, connectors).slice(0, totalCap);
617
+ return {
618
+ folderIndexes: new Set(selected
619
+ .filter((candidate) => candidate.kind === "folder")
620
+ .map((candidate) => candidate.index)),
621
+ connectorIndexes: new Set(selected
622
+ .filter((candidate) => candidate.kind === "connector")
623
+ .map((candidate) => candidate.index)),
624
+ };
625
+ }
626
+ function skippedFoldersForCaps(all, perListFolders, selected, limits) {
627
+ return [
628
+ ...perListFolders.flatMap((cs, index) => selected.folderIndexes.has(index)
629
+ ? []
630
+ : [
631
+ {
632
+ label: sourceLabels([cs])[0] ?? `folder-${String(index)}`,
633
+ reason: "source-skipped",
634
+ message: "Exceeded combined source limit.",
635
+ },
636
+ ]),
637
+ ...all.slice(limits.maxConnectedSources).map((cs, i) => ({
638
+ label: sourceLabels([cs])[0] ?? `folder-${String(limits.maxConnectedSources + i)}`,
639
+ reason: "source-skipped",
640
+ message: "Exceeded maxConnectedSources limit.",
641
+ })),
642
+ ];
643
+ }
644
+ function skippedConnectorsForCaps(allConnectors, perListConnectors, selected, limits) {
645
+ return [
646
+ ...perListConnectors.flatMap((_cs, index) => selected.connectorIndexes.has(index)
647
+ ? []
648
+ : [
649
+ {
650
+ label: `connector-${String(index)}`,
651
+ reason: "source-skipped",
652
+ message: "Exceeded combined source limit.",
653
+ },
654
+ ]),
655
+ ...allConnectors.slice(limits.maxLocalKnowledgeSources).map((_cs, i) => ({
656
+ label: `connector-${String(limits.maxLocalKnowledgeSources + i)}`,
657
+ reason: "source-skipped",
658
+ message: "Exceeded maxLocalKnowledgeSources limit.",
659
+ })),
660
+ ];
661
+ }
662
+ // Cap both source lists at their respective operator limits before any budget-split or retrieval
663
+ // loop, then cap the combined total to the release contract ("up to 16 sources" total by default).
664
+ // A chat row may carry legacy over-limit sources (e.g. operator lowered a limit after connection,
665
+ // or a direct DB edit). Capping here is the single choke-point: all loops downstream derive their
666
+ // iteration counts from these sliced lists. Over-cap entries are tagged as "source-skipped"
667
+ // uncertainties so callers can observe the omission without path information.
668
+ function capSourcesToLimits(ctx, limits) {
669
+ const all = buildConnectedScopes(ctx.chat);
670
+ const allConnectors = buildLocalKnowledgeScopes(ctx.chat);
671
+ const perListFolders = all.slice(0, limits.maxConnectedSources);
672
+ const perListConnectors = allConnectors.slice(0, limits.maxLocalKnowledgeSources);
673
+ const selected = capSelectedIndexes(perListFolders, perListConnectors, combinedSourceCap(limits));
674
+ return {
675
+ folderScopes: perListFolders.filter((_scope, index) => selected.folderIndexes.has(index)),
676
+ connectorScopes: perListConnectors.filter((_scope, index) => selected.connectorIndexes.has(index)),
677
+ allFolderCount: all.length,
678
+ allConnectorCount: allConnectors.length,
679
+ overCapFolderSkipped: skippedFoldersForCaps(all, perListFolders, selected, limits),
680
+ overCapConnectorSkipped: skippedConnectorsForCaps(allConnectors, perListConnectors, selected, limits),
681
+ };
682
+ }
683
+ async function runHybridWithStore(ctx, store) {
684
+ const limits = currentGroundingLimits(ctx.deps);
685
+ const capped = capSourcesToLimits(ctx, limits);
686
+ const resolved = resolveConnectorScopes(capped.connectorScopes, store);
687
+ if ("status" in resolved)
688
+ return resolved;
689
+ const query = buildQuery(ctx.content, () => Date.now());
690
+ const rawFolderResult = await retrieveFolderPacks(ctx, capped.folderScopes, query, ctx.folderRetriever ?? defaultRetriever(ctx.signal));
691
+ // Merge upfront-skipped folders (inaccessible/denied at canonicalization), over-cap folder skips,
692
+ // and retrieval-time folder skips so all omissions appear in the assembled uncertainty entries.
693
+ const folderResult = {
694
+ ...rawFolderResult,
695
+ skipped: [
696
+ ...(ctx.preSkippedFolders ?? []),
697
+ ...capped.overCapFolderSkipped,
698
+ ...rawFolderResult.skipped,
699
+ ],
700
+ };
701
+ const connectorResult = await retrieveConnectors(ctx, store, capped.connectorScopes, resolved);
702
+ if ("status" in connectorResult)
703
+ return connectorResult;
704
+ const connectorResultWithOverCap = capped.overCapConnectorSkipped.length > 0
705
+ ? {
706
+ ...connectorResult,
707
+ skipped: [...capped.overCapConnectorSkipped, ...connectorResult.skipped],
708
+ }
709
+ : connectorResult;
710
+ return await answerAndAssemble(ctx, store, {
711
+ folderScopeCount: capped.allFolderCount,
712
+ connectorScopeCount: capped.allConnectorCount,
713
+ folderResult,
714
+ connectorResult: connectorResultWithOverCap,
715
+ });
716
+ }
717
+ async function answerAndAssemble(ctx, store, meta) {
718
+ const limits = currentGroundingLimits(ctx.deps);
719
+ const { retrieved: folders } = meta.folderResult;
720
+ const selected = buildUnifiedSelection(ctx, folders, meta.connectorResult.retrieved, store);
721
+ if (selected.length === 0) {
722
+ return assembleHybridNoEvidenceRoute(ctx, store, meta, selected, limits);
723
+ }
724
+ const answerer = resolveHybridAnswerer(ctx);
725
+ if ("status" in answerer)
726
+ return answerer;
727
+ const user = buildRerankedHybridUserMessage(ctx.content, selected, ctx.deps.redactor);
728
+ const assistant = normalizeGroundedAnswerPayload(await answerer.answer(HYBRID_SYSTEM_PROMPT, user));
729
+ ensureNotCancelled(ctx.signal);
730
+ const [userMessage, assistantMessage] = persistGroundedExchange(ctx.deps, ctx.chat.id, redactString(ctx.deps.redactor, ctx.content), redactString(ctx.deps.redactor, assistant.content));
731
+ const answer = assembleHybridAnswer(ctx, {
732
+ folders,
733
+ connectors: meta.connectorResult.retrieved,
734
+ skipped: meta.connectorResult.skipped,
735
+ skippedFolders: meta.folderResult.skipped,
736
+ folderSourceCount: meta.folderScopeCount,
737
+ connectorSourceCount: meta.connectorScopeCount,
738
+ }, store, selected, limits, assistant, { userMessageId: userMessage.id, assistantMessageId: assistantMessage.id });
739
+ return { status: 200, body: answer };
740
+ }
741
+ // Issue #154 (GAP-B) — a GatewayError is redacted inside mappedGatewayError (shared with the
742
+ // single-source path). The non-gateway `Error` fallback carries an arbitrary dynamic message that
743
+ // can echo a provider endpoint or token, so it is scrubbed through the SAME boundary before it
744
+ // reaches the wire.
745
+ function mapHybridError(error, deps) {
746
+ const gatewayResult = mappedGatewayError(error, deps);
747
+ if (gatewayResult !== undefined)
748
+ return gatewayResult;
749
+ // GRD-016: mirror the single-source and multi-source paths — a vague/no-anchor question
750
+ // (ClarificationNeededError) or a typed workspace read error is a client-actionable 400, not
751
+ // an opaque 500. Without these branches a folders+connectors ask with no anchors 500s.
752
+ if (error instanceof ClarificationNeededError) {
753
+ return clarificationRequest(clarificationUserMessage(error));
754
+ }
755
+ const workspaceResult = mappedWorkspaceError(error);
756
+ if (workspaceResult !== undefined)
757
+ return workspaceResult;
758
+ if (error instanceof Error) {
759
+ return internalError(redact(error.message, currentRedactionSecrets(deps)));
760
+ }
761
+ throw error;
762
+ }