@oscharko-dev/keiko 0.2.0-beta.4 → 0.2.0-beta.5

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 (228) hide show
  1. package/dist/ui/csp-hashes.json +18 -18
  2. package/dist/ui/static/404.html +1 -1
  3. package/dist/ui/static/__next.__PAGE__.txt +2 -2
  4. package/dist/ui/static/__next._full.txt +3 -3
  5. package/dist/ui/static/__next._head.txt +1 -1
  6. package/dist/ui/static/__next._index.txt +2 -2
  7. package/dist/ui/static/__next._tree.txt +2 -2
  8. package/dist/ui/static/_next/static/chunks/1m-kvwm6_90_3.css +1 -0
  9. package/dist/ui/static/_next/static/chunks/2ngm8iwdb1cbv.js +106 -0
  10. package/dist/ui/static/_not-found/__next._full.txt +2 -2
  11. package/dist/ui/static/_not-found/__next._head.txt +1 -1
  12. package/dist/ui/static/_not-found/__next._index.txt +2 -2
  13. package/dist/ui/static/_not-found/__next._not-found.__PAGE__.txt +1 -1
  14. package/dist/ui/static/_not-found/__next._not-found.txt +1 -1
  15. package/dist/ui/static/_not-found/__next._tree.txt +2 -2
  16. package/dist/ui/static/_not-found.html +1 -1
  17. package/dist/ui/static/_not-found.txt +2 -2
  18. package/dist/ui/static/index.html +1 -1
  19. package/dist/ui/static/index.txt +3 -3
  20. package/dist/ui/static/launch/__next._full.txt +3 -3
  21. package/dist/ui/static/launch/__next._head.txt +1 -1
  22. package/dist/ui/static/launch/__next._index.txt +2 -2
  23. package/dist/ui/static/launch/__next._tree.txt +2 -2
  24. package/dist/ui/static/launch/__next.launch.__PAGE__.txt +2 -2
  25. package/dist/ui/static/launch/__next.launch.txt +1 -1
  26. package/dist/ui/static/launch.html +1 -1
  27. package/dist/ui/static/launch.txt +3 -3
  28. package/dist/ui/static/local-knowledge/__next._full.txt +3 -3
  29. package/dist/ui/static/local-knowledge/__next._head.txt +1 -1
  30. package/dist/ui/static/local-knowledge/__next._index.txt +2 -2
  31. package/dist/ui/static/local-knowledge/__next._tree.txt +2 -2
  32. package/dist/ui/static/local-knowledge/__next.local-knowledge.__PAGE__.txt +2 -2
  33. package/dist/ui/static/local-knowledge/__next.local-knowledge.txt +1 -1
  34. package/dist/ui/static/local-knowledge/capsule/__next._full.txt +2 -2
  35. package/dist/ui/static/local-knowledge/capsule/__next._head.txt +1 -1
  36. package/dist/ui/static/local-knowledge/capsule/__next._index.txt +2 -2
  37. package/dist/ui/static/local-knowledge/capsule/__next._tree.txt +2 -2
  38. package/dist/ui/static/local-knowledge/capsule/__next.local-knowledge.capsule.__PAGE__.txt +1 -1
  39. package/dist/ui/static/local-knowledge/capsule/__next.local-knowledge.capsule.txt +1 -1
  40. package/dist/ui/static/local-knowledge/capsule/__next.local-knowledge.txt +1 -1
  41. package/dist/ui/static/local-knowledge/capsule.html +1 -1
  42. package/dist/ui/static/local-knowledge/capsule.txt +2 -2
  43. package/dist/ui/static/local-knowledge.html +1 -1
  44. package/dist/ui/static/local-knowledge.txt +3 -3
  45. package/dist/ui/static/memoriaviva/__next._full.txt +2 -2
  46. package/dist/ui/static/memoriaviva/__next._head.txt +1 -1
  47. package/dist/ui/static/memoriaviva/__next._index.txt +2 -2
  48. package/dist/ui/static/memoriaviva/__next._tree.txt +2 -2
  49. package/dist/ui/static/memoriaviva/__next.memoriaviva.__PAGE__.txt +1 -1
  50. package/dist/ui/static/memoriaviva/__next.memoriaviva.txt +1 -1
  51. package/dist/ui/static/memoriaviva/consolidation/__next._full.txt +2 -2
  52. package/dist/ui/static/memoriaviva/consolidation/__next._head.txt +1 -1
  53. package/dist/ui/static/memoriaviva/consolidation/__next._index.txt +2 -2
  54. package/dist/ui/static/memoriaviva/consolidation/__next._tree.txt +2 -2
  55. package/dist/ui/static/memoriaviva/consolidation/__next.memoriaviva.consolidation.__PAGE__.txt +1 -1
  56. package/dist/ui/static/memoriaviva/consolidation/__next.memoriaviva.consolidation.txt +1 -1
  57. package/dist/ui/static/memoriaviva/consolidation/__next.memoriaviva.txt +1 -1
  58. package/dist/ui/static/memoriaviva/consolidation.html +1 -1
  59. package/dist/ui/static/memoriaviva/consolidation.txt +2 -2
  60. package/dist/ui/static/memoriaviva/detail/__next._full.txt +2 -2
  61. package/dist/ui/static/memoriaviva/detail/__next._head.txt +1 -1
  62. package/dist/ui/static/memoriaviva/detail/__next._index.txt +2 -2
  63. package/dist/ui/static/memoriaviva/detail/__next._tree.txt +2 -2
  64. package/dist/ui/static/memoriaviva/detail/__next.memoriaviva.detail.__PAGE__.txt +1 -1
  65. package/dist/ui/static/memoriaviva/detail/__next.memoriaviva.detail.txt +1 -1
  66. package/dist/ui/static/memoriaviva/detail/__next.memoriaviva.txt +1 -1
  67. package/dist/ui/static/memoriaviva/detail.html +1 -1
  68. package/dist/ui/static/memoriaviva/detail.txt +2 -2
  69. package/dist/ui/static/memoriaviva/review-queue/__next._full.txt +2 -2
  70. package/dist/ui/static/memoriaviva/review-queue/__next._head.txt +1 -1
  71. package/dist/ui/static/memoriaviva/review-queue/__next._index.txt +2 -2
  72. package/dist/ui/static/memoriaviva/review-queue/__next._tree.txt +2 -2
  73. package/dist/ui/static/memoriaviva/review-queue/__next.memoriaviva.review-queue.__PAGE__.txt +1 -1
  74. package/dist/ui/static/memoriaviva/review-queue/__next.memoriaviva.review-queue.txt +1 -1
  75. package/dist/ui/static/memoriaviva/review-queue/__next.memoriaviva.txt +1 -1
  76. package/dist/ui/static/memoriaviva/review-queue.html +1 -1
  77. package/dist/ui/static/memoriaviva/review-queue.txt +2 -2
  78. package/dist/ui/static/memoriaviva.html +1 -1
  79. package/dist/ui/static/memoriaviva.txt +2 -2
  80. package/node_modules/@oscharko-dev/keiko-cli/dist/.tsbuildinfo +1 -1
  81. package/node_modules/@oscharko-dev/keiko-cli/dist/run.d.ts +3 -1
  82. package/node_modules/@oscharko-dev/keiko-cli/dist/run.d.ts.map +1 -1
  83. package/node_modules/@oscharko-dev/keiko-cli/dist/run.js +73 -41
  84. package/node_modules/@oscharko-dev/keiko-cli/package.json +1 -1
  85. package/node_modules/@oscharko-dev/keiko-contracts/dist/.tsbuildinfo +1 -1
  86. package/node_modules/@oscharko-dev/keiko-contracts/dist/index.d.ts +1 -1
  87. package/node_modules/@oscharko-dev/keiko-contracts/dist/index.js +1 -1
  88. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/bffWire.d.ts +2 -0
  89. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/bffWire.d.ts.map +1 -1
  90. package/node_modules/@oscharko-dev/keiko-contracts/package.json +1 -1
  91. package/node_modules/@oscharko-dev/keiko-evaluations/dist/.tsbuildinfo +1 -1
  92. package/node_modules/@oscharko-dev/keiko-evaluations/package.json +1 -1
  93. package/node_modules/@oscharko-dev/keiko-evidence/dist/.tsbuildinfo +1 -1
  94. package/node_modules/@oscharko-dev/keiko-evidence/dist/index.d.ts +1 -1
  95. package/node_modules/@oscharko-dev/keiko-evidence/dist/index.d.ts.map +1 -1
  96. package/node_modules/@oscharko-dev/keiko-evidence/dist/index.js +1 -1
  97. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/index.d.ts +3 -3
  98. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/index.d.ts.map +1 -1
  99. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/index.js +1 -1
  100. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/manifestSchema.d.ts +18 -1
  101. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/manifestSchema.d.ts.map +1 -1
  102. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/store.d.ts +33 -0
  103. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/store.d.ts.map +1 -1
  104. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/store.js +69 -0
  105. package/node_modules/@oscharko-dev/keiko-evidence/package.json +1 -1
  106. package/node_modules/@oscharko-dev/keiko-harness/dist/.tsbuildinfo +1 -1
  107. package/node_modules/@oscharko-dev/keiko-harness/package.json +1 -1
  108. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/.tsbuildinfo +1 -1
  109. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/index.d.ts +0 -1
  110. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/index.d.ts.map +1 -1
  111. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/index.js +0 -1
  112. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/model-gateway-answer-generator.d.ts.map +1 -1
  113. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/model-gateway-answer-generator.js +7 -1
  114. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/types.d.ts.map +1 -1
  115. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/types.js +2 -3
  116. package/node_modules/@oscharko-dev/keiko-local-knowledge/package.json +1 -1
  117. package/node_modules/@oscharko-dev/keiko-memory-capture/package.json +1 -1
  118. package/node_modules/@oscharko-dev/keiko-memory-consolidation/package.json +1 -1
  119. package/node_modules/@oscharko-dev/keiko-memory-governance/package.json +1 -1
  120. package/node_modules/@oscharko-dev/keiko-memory-retrieval/package.json +1 -1
  121. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/.tsbuildinfo +1 -1
  122. package/node_modules/@oscharko-dev/keiko-memory-vault/package.json +1 -1
  123. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/.tsbuildinfo +1 -1
  124. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/normalize.d.ts +1 -0
  125. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/normalize.d.ts.map +1 -1
  126. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/normalize.js +22 -1
  127. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/openai-adapter.d.ts.map +1 -1
  128. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/openai-adapter.js +18 -4
  129. package/node_modules/@oscharko-dev/keiko-model-gateway/package.json +1 -1
  130. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/.tsbuildinfo +1 -1
  131. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/alm.d.ts.map +1 -1
  132. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/alm.js +29 -30
  133. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/markdown.d.ts.map +1 -1
  134. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/markdown.js +29 -5
  135. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/qtest.d.ts.map +1 -1
  136. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/qtest.js +29 -29
  137. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/spreadsheetSafeCsv.d.ts +2 -1
  138. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/spreadsheetSafeCsv.d.ts.map +1 -1
  139. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/spreadsheetSafeCsv.js +40 -2
  140. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/xray.d.ts.map +1 -1
  141. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/xray.js +6 -2
  142. package/node_modules/@oscharko-dev/keiko-quality-intelligence/package.json +1 -1
  143. package/node_modules/@oscharko-dev/keiko-sdk/dist/.tsbuildinfo +1 -1
  144. package/node_modules/@oscharko-dev/keiko-sdk/package.json +1 -1
  145. package/node_modules/@oscharko-dev/keiko-security/dist/.tsbuildinfo +1 -1
  146. package/node_modules/@oscharko-dev/keiko-security/package.json +1 -1
  147. package/node_modules/@oscharko-dev/keiko-server/dist/.tsbuildinfo +1 -1
  148. package/node_modules/@oscharko-dev/keiko-server/dist/assistant-response.d.ts +6 -0
  149. package/node_modules/@oscharko-dev/keiko-server/dist/assistant-response.d.ts.map +1 -0
  150. package/node_modules/@oscharko-dev/keiko-server/dist/assistant-response.js +12 -0
  151. package/node_modules/@oscharko-dev/keiko-server/dist/chat-handlers.d.ts +1 -1
  152. package/node_modules/@oscharko-dev/keiko-server/dist/chat-handlers.d.ts.map +1 -1
  153. package/node_modules/@oscharko-dev/keiko-server/dist/chat-handlers.js +11 -4
  154. package/node_modules/@oscharko-dev/keiko-server/dist/chat-stream-handlers.js +1 -1
  155. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-orchestrator.d.ts +0 -1
  156. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-orchestrator.d.ts.map +1 -1
  157. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-orchestrator.js +222 -18
  158. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-hybrid.d.ts.map +1 -1
  159. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-hybrid.js +3 -1
  160. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-multi-source.d.ts.map +1 -1
  161. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-multi-source.js +3 -1
  162. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa.d.ts.map +1 -1
  163. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa.js +3 -1
  164. package/node_modules/@oscharko-dev/keiko-server/dist/local-knowledge-grounded-qa.d.ts.map +1 -1
  165. package/node_modules/@oscharko-dev/keiko-server/dist/local-knowledge-grounded-qa.js +4 -1
  166. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/connectorErrors.d.ts.map +1 -1
  167. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/connectorErrors.js +11 -8
  168. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/editRoutes.d.ts.map +1 -1
  169. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/editRoutes.js +1 -0
  170. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/exportRoutes.d.ts.map +1 -1
  171. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/exportRoutes.js +89 -30
  172. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/generationPort.d.ts.map +1 -1
  173. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/generationPort.js +12 -1
  174. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/handoffErrors.d.ts +1 -1
  175. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/handoffErrors.d.ts.map +1 -1
  176. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/handoffErrors.js +1 -0
  177. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/handoffRoutes.d.ts.map +1 -1
  178. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/handoffRoutes.js +41 -9
  179. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/index.d.ts +1 -0
  180. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/index.d.ts.map +1 -1
  181. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/index.js +2 -0
  182. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/judgePort.d.ts.map +1 -1
  183. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/judgePort.js +17 -3
  184. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/retentionRoutes.d.ts +5 -0
  185. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/retentionRoutes.d.ts.map +1 -0
  186. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/retentionRoutes.js +70 -0
  187. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reviewRoutes.d.ts.map +1 -1
  188. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reviewRoutes.js +6 -2
  189. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reviewStore.d.ts +25 -4
  190. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reviewStore.d.ts.map +1 -1
  191. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reviewStore.js +72 -9
  192. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runIngestion.d.ts.map +1 -1
  193. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runIngestion.js +46 -3
  194. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runRegistry.d.ts.map +1 -1
  195. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runRegistry.js +2 -0
  196. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/uiRoutes.d.ts.map +1 -1
  197. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/uiRoutes.js +12 -2
  198. package/node_modules/@oscharko-dev/keiko-server/dist/routes.d.ts.map +1 -1
  199. package/node_modules/@oscharko-dev/keiko-server/dist/routes.js +4 -1
  200. package/node_modules/@oscharko-dev/keiko-server/dist/store-handlers.d.ts.map +1 -1
  201. package/node_modules/@oscharko-dev/keiko-server/dist/store-handlers.js +4 -1
  202. package/node_modules/@oscharko-dev/keiko-server/package.json +1 -1
  203. package/node_modules/@oscharko-dev/keiko-tools/dist/.tsbuildinfo +1 -1
  204. package/node_modules/@oscharko-dev/keiko-tools/package.json +1 -1
  205. package/node_modules/@oscharko-dev/keiko-verification/dist/.tsbuildinfo +1 -1
  206. package/node_modules/@oscharko-dev/keiko-verification/package.json +1 -1
  207. package/node_modules/@oscharko-dev/keiko-workflows/dist/.tsbuildinfo +1 -1
  208. package/node_modules/@oscharko-dev/keiko-workflows/dist/planner/anchors.d.ts.map +1 -1
  209. package/node_modules/@oscharko-dev/keiko-workflows/dist/planner/anchors.js +68 -0
  210. package/node_modules/@oscharko-dev/keiko-workflows/package.json +1 -1
  211. package/node_modules/@oscharko-dev/keiko-workspace/dist/.tsbuildinfo +1 -1
  212. package/node_modules/@oscharko-dev/keiko-workspace/dist/discovery.d.ts.map +1 -1
  213. package/node_modules/@oscharko-dev/keiko-workspace/dist/discovery.js +34 -2
  214. package/node_modules/@oscharko-dev/keiko-workspace/dist/realpath.d.ts +1 -0
  215. package/node_modules/@oscharko-dev/keiko-workspace/dist/realpath.d.ts.map +1 -1
  216. package/node_modules/@oscharko-dev/keiko-workspace/dist/realpath.js +2 -2
  217. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchMatchers.d.ts.map +1 -1
  218. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchMatchers.js +68 -0
  219. package/node_modules/@oscharko-dev/keiko-workspace/package.json +1 -1
  220. package/package.json +1 -1
  221. package/dist/ui/static/_next/static/chunks/1t04tfgin0v_g.js +0 -106
  222. package/dist/ui/static/_next/static/chunks/3wr_35f2vg6sd.css +0 -1
  223. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/scripted-answer-generator.d.ts +0 -6
  224. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/scripted-answer-generator.d.ts.map +0 -1
  225. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/scripted-answer-generator.js +0 -49
  226. /package/dist/ui/static/_next/static/{Hb6brrvZY2nZtizQlYhVt → hR2gBQqCDKdPdSxBqZhqv}/_buildManifest.js +0 -0
  227. /package/dist/ui/static/_next/static/{Hb6brrvZY2nZtizQlYhVt → hR2gBQqCDKdPdSxBqZhqv}/_clientMiddlewareManifest.js +0 -0
  228. /package/dist/ui/static/_next/static/{Hb6brrvZY2nZtizQlYhVt → hR2gBQqCDKdPdSxBqZhqv}/_ssgManifest.js +0 -0
@@ -0,0 +1,6 @@
1
+ export declare function isLegacyEmptyAssistantPlaceholder(message: {
2
+ readonly role: string;
3
+ readonly content: string;
4
+ }): boolean;
5
+ export declare function assertUsableAssistantContent(content: string, modelId: string): void;
6
+ //# sourceMappingURL=assistant-response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistant-response.d.ts","sourceRoot":"","sources":["../src/assistant-response.ts"],"names":[],"mappings":"AAKA,wBAAgB,iCAAiC,CAAC,OAAO,EAAE;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,GAAG,OAAO,CAIV;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAQnF"}
@@ -0,0 +1,12 @@
1
+ import { ProviderError } from "@oscharko-dev/keiko-model-gateway";
2
+ const EMPTY_ASSISTANT_RESPONSE_STATUS = 200;
3
+ const LEGACY_EMPTY_ASSISTANT_PLACEHOLDER = "The model returned an empty response.";
4
+ export function isLegacyEmptyAssistantPlaceholder(message) {
5
+ return (message.role === "assistant" && message.content.trim() === LEGACY_EMPTY_ASSISTANT_PLACEHOLDER);
6
+ }
7
+ export function assertUsableAssistantContent(content, modelId) {
8
+ if (content.trim().length > 0) {
9
+ return;
10
+ }
11
+ throw new ProviderError(`model '${modelId}' returned an empty assistant response`, EMPTY_ASSISTANT_RESPONSE_STATUS);
12
+ }
@@ -26,7 +26,7 @@ interface ParsedConversationMemoryRequest {
26
26
  readonly context: Record<string, unknown>;
27
27
  }
28
28
  export declare function createUserMessage(deps: UiHandlerDeps, request: SendDesktopChatRequest): ChatMessage;
29
- export declare function createAssistantMessage(deps: UiHandlerDeps, request: SendDesktopChatRequest, content: string): ChatMessage;
29
+ export declare function createAssistantMessage(deps: UiHandlerDeps, request: SendDesktopChatRequest, content: string, modelId: string): ChatMessage;
30
30
  export declare function emptyMemoryResult(enabled: boolean): ConversationMemoryResultWire;
31
31
  export declare function buildMemoryResult(request: SendDesktopChatRequest, deps: UiHandlerDeps, context: ConversationMemoryRuntimeContext): Promise<ConversationMemoryResultWire>;
32
32
  export declare function collectMemoryActions(deps: UiHandlerDeps, request: SendDesktopChatRequest, memoryContext: ConversationMemoryRuntimeContext | undefined, modelId: string, assistantText: string): Promise<readonly ConversationMemoryActionWire[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"chat-handlers.d.ts","sourceRoot":"","sources":["../src/chat-handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-handlers.d.ts","sourceRoot":"","sources":["../src/chat-handlers.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,7 @@ import { buildMemoryRecordFromProposal } from "./memory-record-builders.js";
20
20
  import { cosineSimilarity, embedAndStoreMemory, embedMemoryText } from "./memory-embedding.js";
21
21
  import { recordMemoryAudit } from "./memory-audit-handler.js";
22
22
  import { captureSalientFromTurn } from "./memory-salience.js";
23
+ import { assertUsableAssistantContent, isLegacyEmptyAssistantPlaceholder, } from "./assistant-response.js";
23
24
  const DEFAULT_CHAT_MODEL = "example-chat-model";
24
25
  const DEFAULT_CHAT_TITLE = "New chat";
25
26
  const MAX_BODY_BYTES = 128_000;
@@ -151,7 +152,9 @@ function chatEnvelope(deps, project, chat) {
151
152
  available: isProjectAvailable(item),
152
153
  }));
153
154
  const chats = deps.store.listChats(project.path);
154
- const messages = deps.store.listMessages(chat.id);
155
+ const messages = deps.store
156
+ .listMessages(chat.id)
157
+ .filter((message) => !isLegacyEmptyAssistantPlaceholder(message));
155
158
  return {
156
159
  project: { ...project, available: isProjectAvailable(project) },
157
160
  chat,
@@ -190,6 +193,9 @@ export function desktopChatErrorResult(error, deps) {
190
193
  throw error;
191
194
  }
192
195
  function messageForGateway(message) {
196
+ if (isLegacyEmptyAssistantPlaceholder(message)) {
197
+ return null;
198
+ }
193
199
  if (message.role !== "user" && message.role !== "assistant") {
194
200
  return null;
195
201
  }
@@ -437,11 +443,12 @@ export function createUserMessage(deps, request) {
437
443
  taskType: undefined,
438
444
  });
439
445
  }
440
- export function createAssistantMessage(deps, request, content) {
446
+ export function createAssistantMessage(deps, request, content, modelId) {
447
+ assertUsableAssistantContent(content, modelId);
441
448
  return deps.store.createMessage({
442
449
  chatId: request.chatId,
443
450
  role: "assistant",
444
- content: content.length > 0 ? content : "The model returned an empty response.",
451
+ content,
445
452
  timestamp: Date.now(),
446
453
  runId: undefined,
447
454
  workflowId: undefined,
@@ -689,7 +696,7 @@ async function persistModelChatTurn(deps, request, chat, modelId, memoryContext)
689
696
  // system prompt) would otherwise surface it un-redacted on the success path, mirroring the
690
697
  // grounded-QA path (grounded-qa.ts line 549) which already applies deps.redactor here.
691
698
  const redactedContent = deps.redactor(response.content);
692
- const assistantMessage = createAssistantMessage(deps, request, redactedContent);
699
+ const assistantMessage = createAssistantMessage(deps, request, redactedContent, modelId);
693
700
  const memoryActions = await collectMemoryActions(deps, request, memoryContext, modelId, redactedContent);
694
701
  const chatPatch = buildChatPatch(chat, request, modelId);
695
702
  return {
@@ -48,7 +48,7 @@ async function streamConversation(ctx, deps, stream, signal) {
48
48
  // threaded in here rather than created again — creating it twice would duplicate the turn.
49
49
  async function persistStreamedTurn(deps, request, chat, modelId, memory, memoryContext, turn, userMessage) {
50
50
  const redactedContent = deps.redactor(turn.response.content);
51
- const assistantMessage = createAssistantMessage(deps, request, redactedContent);
51
+ const assistantMessage = createAssistantMessage(deps, request, redactedContent, modelId);
52
52
  const actions = await collectMemoryActions(deps, request, memoryContext, modelId, redactedContent);
53
53
  const updatedChat = deps.store.updateChat(request.chatId, buildChatPatch(chat, request, modelId));
54
54
  return {
@@ -36,7 +36,6 @@ export declare class ClarificationNeededError extends Error {
36
36
  constructor(clarification: ClarificationPrompt);
37
37
  }
38
38
  export declare function clarificationUserMessage(error: ClarificationNeededError): string;
39
- export declare const echoAnswerer: GroundedAnswerer;
40
39
  export declare function retrieveConnectedContextPack(input: OrchestratorInput, deps: OrchestratorDeps): Promise<RetrievalOnlyOutput>;
41
40
  export declare function runGroundedExploration(input: OrchestratorInput, deps: OrchestratorDeps): Promise<OrchestratorOutput>;
42
41
  export { DEFAULT_SEARCH_LIMITS };
@@ -1 +1 @@
1
- {"version":3,"file":"grounded-orchestrator.d.ts","sourceRoot":"","sources":["../src/grounded-orchestrator.ts"],"names":[],"mappings":"AAWA,OAAO,EAGL,KAAK,oBAAoB,EAEzB,KAAK,iBAAiB,EAGtB,KAAK,cAAc,EACnB,KAAK,aAAa,EAEnB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EASL,KAAK,mBAAmB,EAExB,KAAK,eAAe,EAEpB,KAAK,UAAU,EAGhB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,qBAAqB,EAarB,KAAK,WAAW,EAChB,KAAK,aAAa,EAEnB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAkC,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAIlG,MAAM,WAAW,gBAAgB;IAG/B,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACtF;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAE1C,QAAQ,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IAE1B,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,KAAK,aAAa,CAAC;IAE5E,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAEtD,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC;CACjC;AAMD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;CAChC;AAKD,qBAAa,wBAAyB,SAAQ,KAAK;aACd,aAAa,EAAE,mBAAmB;gBAAlC,aAAa,EAAE,mBAAmB;CAItE;AAMD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,wBAAwB,GAAG,MAAM,CAgBhF;AAID,eAAO,MAAM,YAAY,EAAE,gBAY1B,CAAC;AAq/BF,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,mBAAmB,CAAC,CAoC9B;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,kBAAkB,CAAC,CA8B7B;AAID,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
1
+ {"version":3,"file":"grounded-orchestrator.d.ts","sourceRoot":"","sources":["../src/grounded-orchestrator.ts"],"names":[],"mappings":"AAYA,OAAO,EAGL,KAAK,oBAAoB,EAEzB,KAAK,iBAAiB,EAGtB,KAAK,cAAc,EACnB,KAAK,aAAa,EAEnB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EASL,KAAK,mBAAmB,EAExB,KAAK,eAAe,EAEpB,KAAK,UAAU,EAGhB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,qBAAqB,EAarB,KAAK,WAAW,EAChB,KAAK,aAAa,EAGnB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAkC,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAIlG,MAAM,WAAW,gBAAgB;IAG/B,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACtF;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAE1C,QAAQ,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IAE1B,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,KAAK,aAAa,CAAC;IAE5E,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAEtD,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC;CACjC;AAMD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;CAChC;AAKD,qBAAa,wBAAyB,SAAQ,KAAK;aACd,aAAa,EAAE,mBAAmB;gBAAlC,aAAa,EAAE,mBAAmB;CAItE;AAMD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,wBAAwB,GAAG,MAAM,CAgBhF;AAmwCD,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,mBAAmB,CAAC,CAoC9B;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,kBAAkB,CAAC,CA8B7B;AAID,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
@@ -8,9 +8,10 @@
8
8
  // Pure orchestration: the only IO this module performs is delegated through the workspace
9
9
  // package's already-bounded WorkspaceFs port. Path validation is enforced by every composed
10
10
  // layer at its own boundary, so this file does not re-validate scope paths.
11
+ import { createHash } from "node:crypto";
11
12
  import { isValidScopePath, } from "@oscharko-dev/keiko-contracts/connected-context";
12
13
  import { advanceRing, applyUsage, assembleContextPack, canContinue, complete, contextPackIndexKey, planAndGovern, rankCandidates, } from "@oscharko-dev/keiko-workflows";
13
- import { DEFAULT_SEARCH_LIMITS, FileTooLargeError, RepoSearchUnsupportedFileError, detectWorkspaceAt, gitHistoryAdapter, importGraphAdapter, readExcerpt, resolveWithinWorkspace, runStructuralAdapters, searchText, testSourcePairingAdapter, containedRealPathInfo, } from "@oscharko-dev/keiko-workspace";
14
+ import { DEFAULT_SEARCH_LIMITS, FileTooLargeError, RepoSearchUnsupportedFileError, detectWorkspaceAt, gitHistoryAdapter, importGraphAdapter, readExcerpt, resolveWithinWorkspace, runStructuralAdapters, searchText, testSourcePairingAdapter, containedRealPathInfo, evidenceAtomStableId, } from "@oscharko-dev/keiko-workspace";
14
15
  import { CancelledError } from "@oscharko-dev/keiko-model-gateway";
15
16
  import { nodeWorkspaceFs } from "@oscharko-dev/keiko-workspace/internal/fs";
16
17
  import { normalizeGroundedAnswerPayload } from "./grounded-answer.js";
@@ -43,20 +44,6 @@ export function clarificationUserMessage(error) {
43
44
  const exampleText = examples.length > 0 ? ` For example: ${examples.map((q) => `"${q}"`).join(" or ")}` : "";
44
45
  return `${intro}${anchorHint}${exampleText}`;
45
46
  }
46
- // ─── Default deterministic answerer ───────────────────────────────────────────
47
- export const echoAnswerer = {
48
- answer: (question, pack) => {
49
- try {
50
- const filePaths = pack.files.map((f) => f.scopePath).join(", ");
51
- const summary = `Inspected ${String(pack.files.length)} file(s) for: ${question}. ` +
52
- `Findings include: ${filePaths.length === 0 ? "(no evidence)" : filePaths}.`;
53
- return Promise.resolve(summary);
54
- }
55
- catch (error) {
56
- return Promise.reject(error instanceof Error ? error : new Error(String(error)));
57
- }
58
- },
59
- };
60
47
  const TEXT_ENCODER = new TextEncoder();
61
48
  function throwIfCancelled(signal) {
62
49
  if (signal?.aborted === true) {
@@ -336,6 +323,59 @@ async function runAllRings(rings, inputs, initialGovernor) {
336
323
  const DEFAULT_EXCERPT_WINDOW = { startLine: 1, endLine: 200 };
337
324
  const EXCERPT_CONTEXT_LINES = 2;
338
325
  const MAX_EXCERPT_WINDOWS_PER_FILE = 8;
326
+ const PROJECT_METADATA_QUERY_TERMS = [
327
+ "abhängigkeit",
328
+ "abhängigkeiten",
329
+ "build",
330
+ "cypress",
331
+ "dependenc",
332
+ "framework",
333
+ "jest",
334
+ "npm",
335
+ "package",
336
+ "playwright",
337
+ "pnpm",
338
+ "react",
339
+ "script",
340
+ "stack",
341
+ "tech-stack",
342
+ "techstack",
343
+ "test",
344
+ "testing",
345
+ "testumgebung",
346
+ "typescript",
347
+ "vite",
348
+ "vitest",
349
+ "yarn",
350
+ ];
351
+ const PROJECT_METADATA_FILENAMES = [
352
+ "package.json",
353
+ "vitest.config.ts",
354
+ "vitest.config.mts",
355
+ "vitest.config.js",
356
+ "vitest.config.mjs",
357
+ "vitest.setup.ts",
358
+ "vite.config.ts",
359
+ "vite.config.mts",
360
+ "vite.config.js",
361
+ "vite.config.mjs",
362
+ "jest.config.ts",
363
+ "jest.config.js",
364
+ "jest.config.mjs",
365
+ "playwright.config.ts",
366
+ "playwright.config.js",
367
+ "cypress.config.ts",
368
+ "cypress.config.js",
369
+ "next.config.ts",
370
+ "next.config.js",
371
+ "next.config.mjs",
372
+ "tsconfig.json",
373
+ "eslint.config.ts",
374
+ "eslint.config.js",
375
+ "eslint.config.mjs",
376
+ "postcss.config.js",
377
+ "postcss.config.mjs",
378
+ ];
339
379
  const LOCKFILE_NAMES = new Set([
340
380
  "package-lock.json",
341
381
  "pnpm-lock.yaml",
@@ -359,6 +399,165 @@ function isKeikoEvidenceArtifact(scopePath) {
359
399
  function isLockfilePath(scopePath) {
360
400
  return LOCKFILE_NAMES.has(basename(scopePath).toLowerCase());
361
401
  }
402
+ function dirname(scopePath) {
403
+ const index = scopePath.lastIndexOf("/");
404
+ return index <= 0 ? "" : scopePath.slice(0, index);
405
+ }
406
+ function joinScopePath(base, filename) {
407
+ return base.length === 0 ? filename : `${base}/${filename}`;
408
+ }
409
+ function projectMetadataQueryFingerprint(query) {
410
+ return createHash("sha256")
411
+ .update(JSON.stringify({
412
+ kind: "project-metadata",
413
+ queryKind: query.kind,
414
+ text: query.text,
415
+ caseSensitive: query.caseSensitive,
416
+ }))
417
+ .digest("hex")
418
+ .slice(0, 16);
419
+ }
420
+ function selectedFileQueryFingerprint(query) {
421
+ return createHash("sha256")
422
+ .update(JSON.stringify({
423
+ kind: "explicit-selected-file",
424
+ queryKind: query.kind,
425
+ text: query.text,
426
+ caseSensitive: query.caseSensitive,
427
+ }))
428
+ .digest("hex")
429
+ .slice(0, 16);
430
+ }
431
+ function wantsProjectMetadata(queryText) {
432
+ const lowered = queryText.toLowerCase();
433
+ return PROJECT_METADATA_QUERY_TERMS.some((term) => lowered.includes(term));
434
+ }
435
+ function metadataRootsForScope(scope) {
436
+ if (scope.relativePaths.length === 0) {
437
+ return [""];
438
+ }
439
+ const roots = new Set();
440
+ for (const entry of scope.relativePaths) {
441
+ if (!isValidScopePath(entry, { mustBeRelative: true })) {
442
+ continue;
443
+ }
444
+ roots.add(scope.kind === "files" ? dirname(entry) : entry);
445
+ }
446
+ return [...roots].sort();
447
+ }
448
+ function metadataAtom(scope, scopePath, queryFingerprint, nowMs) {
449
+ return {
450
+ schemaVersion: scope.schemaVersion,
451
+ stableId: evidenceAtomStableId({
452
+ scopeId: scope.scopeId,
453
+ scopePath,
454
+ lineRange: undefined,
455
+ provenanceKind: "file-listing",
456
+ provenanceTool: "repo.projectMetadata",
457
+ queryFingerprint,
458
+ }),
459
+ scopePath,
460
+ lineRange: undefined,
461
+ score: 1,
462
+ provenance: {
463
+ kind: "file-listing",
464
+ tool: "repo.projectMetadata",
465
+ queryFingerprint,
466
+ },
467
+ redactionState: "redacted",
468
+ emittedAtMs: nowMs(),
469
+ ledgerRef: undefined,
470
+ };
471
+ }
472
+ function selectedFileAtom(scope, scopePath, queryFingerprint, nowMs) {
473
+ return {
474
+ schemaVersion: scope.schemaVersion,
475
+ stableId: evidenceAtomStableId({
476
+ scopeId: scope.scopeId,
477
+ scopePath,
478
+ lineRange: undefined,
479
+ provenanceKind: "file-listing",
480
+ provenanceTool: "repo.selectedFile",
481
+ queryFingerprint,
482
+ }),
483
+ scopePath,
484
+ lineRange: undefined,
485
+ score: 1,
486
+ provenance: {
487
+ kind: "file-listing",
488
+ tool: "repo.selectedFile",
489
+ queryFingerprint,
490
+ },
491
+ redactionState: "redacted",
492
+ emittedAtMs: nowMs(),
493
+ ledgerRef: undefined,
494
+ };
495
+ }
496
+ function fileExistsInSearchScope(searchScope, fs, scopePath) {
497
+ try {
498
+ const abs = resolveWithinWorkspace(searchScope.workspace.root, scopePath);
499
+ const contained = containedRealPathInfo(fs, searchScope.workspace.root, abs);
500
+ return fs.stat(contained.path).isFile;
501
+ }
502
+ catch {
503
+ return false;
504
+ }
505
+ }
506
+ function selectedFileScopeAtoms(input, searchScope, fs, nowMs) {
507
+ if (input.scope.explicitConnection !== true || input.scope.kind !== "files") {
508
+ return [];
509
+ }
510
+ const atoms = [];
511
+ const seen = new Set();
512
+ const queryFingerprint = selectedFileQueryFingerprint(input.query);
513
+ for (const entry of input.scope.relativePaths) {
514
+ if (!isValidScopePath(entry, { mustBeRelative: true })) {
515
+ continue;
516
+ }
517
+ const scopePath = entry.replace(/\\/gu, "/");
518
+ if (seen.has(scopePath)) {
519
+ continue;
520
+ }
521
+ seen.add(scopePath);
522
+ if (fileExistsInSearchScope(searchScope, fs, scopePath)) {
523
+ atoms.push(selectedFileAtom(input.scope, scopePath, queryFingerprint, nowMs));
524
+ }
525
+ }
526
+ return atoms;
527
+ }
528
+ function projectMetadataAtoms(input, searchScope, fs, nowMs) {
529
+ if (!wantsProjectMetadata(input.query.text)) {
530
+ return [];
531
+ }
532
+ const atoms = [];
533
+ const seen = new Set();
534
+ const queryFingerprint = projectMetadataQueryFingerprint(input.query);
535
+ for (const root of metadataRootsForScope(input.scope)) {
536
+ for (const filename of PROJECT_METADATA_FILENAMES) {
537
+ const scopePath = joinScopePath(root, filename);
538
+ if (seen.has(scopePath) || !isValidScopePath(scopePath, { mustBeRelative: true })) {
539
+ continue;
540
+ }
541
+ seen.add(scopePath);
542
+ if (fileExistsInSearchScope(searchScope, fs, scopePath)) {
543
+ atoms.push(metadataAtom(input.scope, scopePath, queryFingerprint, nowMs));
544
+ }
545
+ }
546
+ }
547
+ return atoms;
548
+ }
549
+ function withProjectMetadataAtoms(rings, input, searchScope, fs, nowMs) {
550
+ const metadataAtoms = projectMetadataAtoms(input, searchScope, fs, nowMs);
551
+ return metadataAtoms.length === 0
552
+ ? rings
553
+ : { ...rings, atoms: [...rings.atoms, ...metadataAtoms] };
554
+ }
555
+ function withExplicitScopeAtoms(rings, input, searchScope, fs, nowMs) {
556
+ const selectedAtoms = selectedFileScopeAtoms(input, searchScope, fs, nowMs);
557
+ return selectedAtoms.length === 0
558
+ ? rings
559
+ : { ...rings, atoms: [...selectedAtoms, ...rings.atoms] };
560
+ }
362
561
  function queryTerms(queryText, anchors) {
363
562
  const terms = new Set();
364
563
  const loweredQuery = queryText.toLowerCase();
@@ -667,6 +866,8 @@ function preparePackAssembly(input, plan, rings, nowMs) {
667
866
  };
668
867
  }
669
868
  async function assemblePackFromReads({ input, plan, rings, prepared, excerptReads, cacheIdentity, assembleOptions, }) {
869
+ const needsNoEvidenceMarker = excerptReads.excerpts.size === 0 &&
870
+ !prepared.evidenceUncertainty.some((marker) => marker.kind === "no-evidence");
670
871
  const assemble = await assembleContextPack({
671
872
  scope: input.scope,
672
873
  query: input.query,
@@ -681,12 +882,15 @@ async function assemblePackFromReads({ input, plan, rings, prepared, excerptRead
681
882
  ...rings.uncertainty,
682
883
  ...excerptReads.uncertainty,
683
884
  ...prepared.evidenceUncertainty,
885
+ ...(needsNoEvidenceMarker ? [noEvidence(assembleOptions.nowMs())] : []),
684
886
  ],
685
887
  }, assembleOptions);
686
888
  return assemble.pack;
687
889
  }
688
890
  async function assembleGroundedPack({ input, deps, plan, rings, searchScope, fs, nowMs, }) {
689
- const prepared = preparePackAssembly(input, plan, rings, nowMs);
891
+ const scopedRings = withExplicitScopeAtoms(rings, input, searchScope, fs, nowMs);
892
+ const augmentedRings = withProjectMetadataAtoms(scopedRings, input, searchScope, fs, nowMs);
893
+ const prepared = preparePackAssembly(input, plan, augmentedRings, nowMs);
690
894
  const cacheIdentity = deps.microIndex === undefined
691
895
  ? undefined
692
896
  : fileStateCacheIdentity(prepared.keptPaths, searchScope, fs);
@@ -695,7 +899,7 @@ async function assembleGroundedPack({ input, deps, plan, rings, searchScope, fs,
695
899
  input,
696
900
  deps,
697
901
  plan,
698
- rings,
902
+ rings: augmentedRings,
699
903
  ordered: prepared.ordered,
700
904
  cacheIdentity,
701
905
  initialUsage: prepared.initialUsage,
@@ -716,7 +920,7 @@ async function assembleGroundedPack({ input, deps, plan, rings, searchScope, fs,
716
920
  return await assemblePackFromReads({
717
921
  input,
718
922
  plan,
719
- rings,
923
+ rings: augmentedRings,
720
924
  prepared,
721
925
  excerptReads,
722
926
  cacheIdentity,
@@ -1 +1 @@
1
- {"version":3,"file":"grounded-qa-hybrid.d.ts","sourceRoot":"","sources":["../src/grounded-qa-hybrid.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,qCAAqC,CAAC;AAiB7C,OAAO,EAGL,KAAK,uBAAuB,EAO7B,MAAM,wCAAwC,CAAC;AAIhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAY,aAAa,EAAE,MAAM,WAAW,CAAC;AAEzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAML,KAAK,iBAAiB,EACvB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAQL,KAAK,2BAA2B,EACjC,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,sBAAsB,CAAC;AAmB9B,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,uBAAuB,EAAE,CAExF;AAID,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,CAU/E;AAID,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAChD,MAAM,MAAM,iBAAiB,GAAG,CAC9B,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,uBAAuB,EAC9B,QAAQ,EAAE,2BAA2B,KAClC,OAAO,CAAC,eAAe,CAAC,CAAC;AAC9B,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAE9F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAC3C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAC/C,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC;IAGjC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS;QACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,EAAE,CAAC;CACL;AAsMD,qBAAa,qBAAsB,SAAQ,KAAK;aACX,MAAM,EAAE,WAAW;gBAAnB,MAAM,EAAE,WAAW;CAIvD;AA0FD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,GAClB,cAAc,CAuBhB;AA4eD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,CAS1F"}
1
+ {"version":3,"file":"grounded-qa-hybrid.d.ts","sourceRoot":"","sources":["../src/grounded-qa-hybrid.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,qCAAqC,CAAC;AAiB7C,OAAO,EAGL,KAAK,uBAAuB,EAO7B,MAAM,wCAAwC,CAAC;AAIhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAY,aAAa,EAAE,MAAM,WAAW,CAAC;AAEzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAML,KAAK,iBAAiB,EACvB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAQL,KAAK,2BAA2B,EACjC,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,sBAAsB,CAAC;AAoB9B,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,uBAAuB,EAAE,CAExF;AAID,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,CAU/E;AAID,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAChD,MAAM,MAAM,iBAAiB,GAAG,CAC9B,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,uBAAuB,EAC9B,QAAQ,EAAE,2BAA2B,KAClC,OAAO,CAAC,eAAe,CAAC,CAAC;AAC9B,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAE9F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAC3C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAC/C,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC;IAGjC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS;QACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,EAAE,CAAC;CACL;AAsMD,qBAAa,qBAAsB,SAAQ,KAAK;aACX,MAAM,EAAE,WAAW;gBAAnB,MAAM,EAAE,WAAW;CAIvD;AA0FD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,GAClB,cAAc,CAwBhB;AA4eD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,CAS1F"}
@@ -20,6 +20,7 @@ import { buildConnectedScopes, defaultRetriever, mergeContextPackSummaries, sour
20
20
  import { MAX_PROMPT_REFERENCES, buildSelectedScopeSourceLookup, createEmbeddingAdapter, openStoreForDeps, projectLocalKnowledgeCitation, scopeStateFailure, selectedCapsulesForScope, } from "./local-knowledge-grounded-qa.js";
21
21
  import { GROUNDED_SYSTEM_PROMPT } from "./grounded-prompt.js";
22
22
  import { normalizeGroundedAnswerPayload, } from "./grounded-answer.js";
23
+ import { assertUsableAssistantContent } from "./assistant-response.js";
23
24
  import { buildCitations, buildQuery, buildSelectedScopeFrom, deriveScopeIdFrom, ensureNotCancelled, internalError, isValidGroundedPack, mappedGatewayError, persistGroundedExchange, promptSafeExcerptText, redactString, } from "./grounded-qa.js";
24
25
  // ─── Canonical connector reader ───────────────────────────────────────────────
25
26
  // Mirrors buildConnectedScopes: the plural `localKnowledgeScopes` list supersedes the legacy single
@@ -229,8 +230,9 @@ export function createHybridAnswerer(model, modelId, signal) {
229
230
  stream: false,
230
231
  }, signal);
231
232
  const content = response.content.trim();
233
+ assertUsableAssistantContent(content, modelId);
232
234
  return {
233
- content: content.length > 0 ? content : "The model returned an empty response.",
235
+ content,
234
236
  usage: {
235
237
  promptTokens: response.usage.promptTokens,
236
238
  completionTokens: response.usage.completionTokens,
@@ -1 +1 @@
1
- {"version":3,"file":"grounded-qa-multi-source.d.ts","sourceRoot":"","sources":["../src/grounded-qa-multi-source.ts"],"names":[],"mappings":"AAWA,OAAO,EAGL,KAAK,WAAW,IAAI,kBAAkB,EACvC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG7D,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EAGvB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAEL,KAAK,kBAAkB,EAEvB,KAAK,gCAAgC,EAGtC,MAAM,wCAAwC,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAEzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,sBAAsB,CAAC;AA0B9B,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,kBAAkB,EAAE,CAE9E;AAOD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAY5F;AAgBD,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,GAAG,SAAS,MAAM,EAAE,CAUrF;AAgFD,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,SAAS,gCAAgC,EAAE,GACrD,gCAAgC,CAsBlC;AAID,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;CACrC;AAoBD,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,QAAQ,EAAE,QAAQ,GACjB,SAAS,kBAAkB,EAAE,CAE/B;AAmFD,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAI3F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,iBAAiB,CAUvE;AAID,MAAM,MAAM,mBAAmB,GAAG,CAChC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,SAAS,WAAW,EAAE,KACjC,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEpC,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,GAClB,mBAAmB,CAoBrB;AAyBD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAG7B,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACvF;AAmKD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,CA4CtF"}
1
+ {"version":3,"file":"grounded-qa-multi-source.d.ts","sourceRoot":"","sources":["../src/grounded-qa-multi-source.ts"],"names":[],"mappings":"AAWA,OAAO,EAGL,KAAK,WAAW,IAAI,kBAAkB,EACvC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG7D,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EAGvB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAEL,KAAK,kBAAkB,EAEvB,KAAK,gCAAgC,EAGtC,MAAM,wCAAwC,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAEzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AAKpC,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,sBAAsB,CAAC;AA0B9B,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,kBAAkB,EAAE,CAE9E;AAOD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAY5F;AAgBD,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,GAAG,SAAS,MAAM,EAAE,CAUrF;AAgFD,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,SAAS,gCAAgC,EAAE,GACrD,gCAAgC,CAsBlC;AAID,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;CACrC;AAoBD,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,QAAQ,EAAE,QAAQ,GACjB,SAAS,kBAAkB,EAAE,CAE/B;AAmFD,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAI3F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,iBAAiB,CAUvE;AAID,MAAM,MAAM,mBAAmB,GAAG,CAChC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,SAAS,WAAW,EAAE,KACjC,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEpC,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,GAClB,mBAAmB,CAqBrB;AAyBD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAG7B,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACvF;AAmKD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,CA4CtF"}
@@ -17,6 +17,7 @@ import { ClarificationNeededError, clarificationUserMessage, retrieveConnectedCo
17
17
  import { microIndexForGroundedScope } from "./grounded-context-index.js";
18
18
  import { GROUNDED_SYSTEM_PROMPT } from "./grounded-prompt.js";
19
19
  import { rememberGroundedTurn } from "./grounded-turn-registry.js";
20
+ import { assertUsableAssistantContent } from "./assistant-response.js";
20
21
  import { normalizeGroundedAnswerPayload, } from "./grounded-answer.js";
21
22
  import { badRequest, buildCitations, buildQuery, buildSelectedScopeFrom, deriveScopeIdFrom, ensureNotCancelled, evidenceLines, internalError, isValidGroundedPack, mappedGatewayError, mappedWorkspaceError, modelInputPromptByteLimit, packBudgetSummary, persistGroundedExchange, promptByteLength, redactString, uncertaintyLines, withPromptExcerptByteLimit, } from "./grounded-qa.js";
22
23
  // ─── Canonical reader + label/budget helpers ──────────────────────────────────
@@ -245,8 +246,9 @@ export function createMultiSourceAnswerer(model, modelId, redactor, signal) {
245
246
  stream: false,
246
247
  }, signal);
247
248
  const content = response.content.trim();
249
+ assertUsableAssistantContent(content, modelId);
248
250
  return {
249
- content: content.length > 0 ? content : "The model returned an empty response.",
251
+ content,
250
252
  usage: {
251
253
  promptTokens: response.usage.promptTokens,
252
254
  completionTokens: response.usage.completionTokens,
@@ -1 +1 @@
1
- {"version":3,"file":"grounded-qa.d.ts","sourceRoot":"","sources":["../src/grounded-qa.ts"],"names":[],"mappings":"AAUA,OAAO,EAOL,KAAK,WAAW,IAAI,kBAAkB,EAEvC,MAAM,mCAAmC,CAAC;AAU3C,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAGL,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACzB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAEzD,OAAO,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAKL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,4BAA4B,CAAC;AAKpC,OAAO,EAKL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAwC9D,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAEvD;AAaD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAE1D;AAkBD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,CAE/F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAS5E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAMvE;AA4ED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK3F;AAKD,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,kBAAkB,EACtB,OAAO,EAAE,MAAM,GACd,aAAa,CAef;AAyED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,MAAM,GAAG,cAAc,CAQ/E;AAuCD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAI5D;AAYD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3D;AAID,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,GAAG,MAAM,CAEhF;AAED,wBAAgB,yBAAyB,CAAC,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAE7E;AAsBD,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,oBAAoB,EAC1B,eAAe,EAAE,MAAM,GACtB,oBAAoB,CAWtB;AAwCD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAWpE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,GAAG,SAAS,MAAM,EAAE,CA2B/F;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,QAAQ,GACjB,SAAS,MAAM,EAAE,CAKnB;AAOD,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAgClC,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,QAAQ,GACjB,SAAS,kBAAkB,EAAE,CAE/B;AAqDD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,QAAQ,GACjB,SAAS,wBAAwB,EAAE,CAcrC;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,QAAQ,GACjB,SAAS,mBAAmB,EAAE,CAUhC;AAOD,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAgCvF,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,GACvB,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,CAmBrC;AA4KD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;CACxC;AAmID,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAC3C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAC/C,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC;CAClC;AA8CD,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,EACnB,MAAM,CAAC,EAAE,cAAc,EACvB,WAAW,CAAC,EAAE,eAAe,EAC7B,MAAM,CAAC,EAAE,UAAU,GAClB,OAAO,CAAC,WAAW,CAAC,CAsCtB"}
1
+ {"version":3,"file":"grounded-qa.d.ts","sourceRoot":"","sources":["../src/grounded-qa.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ import { buildConnectedScopes, createMultiSourceAnswerer, defaultRetriever, runM
22
22
  import { buildLocalKnowledgeScopes, runHybridGroundedAsk, } from "./grounded-qa-hybrid.js";
23
23
  import { GROUNDED_SYSTEM_PROMPT } from "./grounded-prompt.js";
24
24
  import { rememberGroundedTurn } from "./grounded-turn-registry.js";
25
+ import { assertUsableAssistantContent } from "./assistant-response.js";
25
26
  // ─── Body parsing (mirrors store-handlers' bounded reader) ────────────────────
26
27
  const MAX_BODY_BYTES = 128_000;
27
28
  const MAX_CONTENT_CHARS = 16_000;
@@ -450,8 +451,9 @@ function createGatewayAnswerer(model, modelId, redactor, signal) {
450
451
  stream: false,
451
452
  }, signal);
452
453
  const content = response.content.trim();
454
+ assertUsableAssistantContent(content, modelId);
453
455
  return {
454
- content: content.length > 0 ? content : "The model returned an empty response.",
456
+ content,
455
457
  usage: {
456
458
  promptTokens: response.usage.promptTokens,
457
459
  completionTokens: response.usage.completionTokens,
@@ -1 +1 @@
1
- {"version":3,"file":"local-knowledge-grounded-qa.d.ts","sourceRoot":"","sources":["../src/local-knowledge-grounded-qa.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-knowledge-grounded-qa.d.ts","sourceRoot":"","sources":["../src/local-knowledge-grounded-qa.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import { CancelledError, GatewayError, findCapability, findConfiguredCapability,
5
5
  import { redact } from "@oscharko-dev/keiko-security";
6
6
  import { currentGatewayConfig, currentRedactionSecrets } from "./deps.js";
7
7
  import { errorBody } from "./routes.js";
8
+ import { assertUsableAssistantContent } from "./assistant-response.js";
8
9
  export const DEFAULT_REFERENCE_BUDGET = 16;
9
10
  export const MAX_EXCERPT_CHARS = 900;
10
11
  export const MAX_PROMPT_REFERENCES = 16;
@@ -357,7 +358,9 @@ class StoreBackedAnswerGenerator {
357
358
  occurredAt,
358
359
  });
359
360
  }
360
- return response.content.trim();
361
+ const content = response.content.trim();
362
+ assertUsableAssistantContent(content, this.modelId);
363
+ return content;
361
364
  }
362
365
  }
363
366
  function buildNoEvidenceAnswer(chat, assistantContent, scopeKind, scopeLabel, capsuleCount, sourceCount, reason, uncertainty = []) {
@@ -1 +1 @@
1
- {"version":3,"file":"connectorErrors.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/connectorErrors.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,oBAAoB,GAC5B,gBAAgB,GAChB,uBAAuB,GACvB,sBAAsB,GACtB,+BAA+B,GAC/B,aAAa,CAAC;AAElB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACnF;AAYD,eAAO,MAAM,oBAAoB,GAAI,MAAM,oBAAoB,KAAG,oBAEhE,CAAC;AAmBH,eAAO,MAAM,4BAA4B,GAAI,OAAO,MAAM,KAAG,OAK5D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,GAC9C,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KACzC,OAKF,CAAC"}
1
+ {"version":3,"file":"connectorErrors.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/connectorErrors.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,oBAAoB,GAC5B,gBAAgB,GAChB,uBAAuB,GACvB,sBAAsB,GACtB,+BAA+B,GAC/B,aAAa,CAAC;AAElB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACnF;AAYD,eAAO,MAAM,oBAAoB,GAAI,MAAM,oBAAoB,KAAG,oBAEhE,CAAC;AAqBH,eAAO,MAAM,4BAA4B,GAAI,OAAO,MAAM,KAAG,OAM5D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,GAC9C,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KACzC,OAKF,CAAC"}
@@ -19,22 +19,25 @@ export const qiConnectorErrorBody = (code) => ({
19
19
  /**
20
20
  * Defence-in-depth scrub: detect substrings that would indicate the caller is trying to
21
21
  * smuggle credentials or a header pair through a connector payload. Pure, no IO.
22
+ *
23
+ * Comparison is case-insensitive so that variants like "BEARER ", "API_KEY", or
24
+ * "AUTHORIZATION:" are detected regardless of casing (prior case-variant list was
25
+ * incomplete and bypassed by non-listed casings — Issue #281).
22
26
  */
23
27
  const FORBIDDEN_SUBSTRINGS = [
24
- "Authorization:",
25
- "Bearer ",
26
- "Basic ",
28
+ "authorization:",
29
+ "bearer ",
30
+ "basic ",
27
31
  "apikey",
28
- "apiKey",
29
32
  "api_key",
30
- "Cookie:",
31
- "Set-Cookie",
33
+ "cookie:",
34
+ "set-cookie",
32
35
  "x-api-key",
33
- "X-Api-Key",
34
36
  ];
35
37
  export const containsForbiddenSecretShape = (value) => {
38
+ const lower = value.toLowerCase();
36
39
  for (const forbidden of FORBIDDEN_SUBSTRINGS) {
37
- if (value.includes(forbidden))
40
+ if (lower.includes(forbidden))
38
41
  return true;
39
42
  }
40
43
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"editRoutes.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/editRoutes.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA+PhD,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,WAAW,CAAC,CAmBtB;AAED,eAAO,MAAM,mBAAmB,EAAE,SAAS,eAAe,EAMzD,CAAC"}
1
+ {"version":3,"file":"editRoutes.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/editRoutes.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAgQhD,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,WAAW,CAAC,CAmBtB;AAED,eAAO,MAAM,mBAAmB,EAAE,SAAS,eAAe,EAMzD,CAAC"}
@@ -200,6 +200,7 @@ function recordEdit(runId, edit, evidenceDir, deps) {
200
200
  candidateId: edit.candidateId,
201
201
  reviewerLabel: edit.editorLabel,
202
202
  now: new Date().toISOString(),
203
+ redact: deps.redactor,
203
204
  });
204
205
  }
205
206
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"exportRoutes.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/exportRoutes.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAsKhD,wBAAsB,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAuBjG;AAgHD,eAAO,MAAM,qBAAqB,EAAE,SAAS,eAAe,EAE3D,CAAC"}
1
+ {"version":3,"file":"exportRoutes.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/exportRoutes.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAyNhD,wBAAsB,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CA2BjG;AA+HD,eAAO,MAAM,qBAAqB,EAAE,SAAS,eAAe,EAE3D,CAAC"}