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

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 (622) hide show
  1. package/README.md +39 -14
  2. package/dist/ui/csp-hashes.json +17 -22
  3. package/dist/ui/static/404.html +1 -1
  4. package/dist/ui/static/__next.__PAGE__.txt +2 -2
  5. package/dist/ui/static/__next._full.txt +3 -3
  6. package/dist/ui/static/__next._head.txt +1 -1
  7. package/dist/ui/static/__next._index.txt +2 -2
  8. package/dist/ui/static/__next._tree.txt +2 -2
  9. package/dist/ui/static/_next/static/chunks/0-qhhdvxg2j_y.js +1 -0
  10. package/dist/ui/static/_next/static/chunks/0ke4ratkgvcxo.css +1 -0
  11. package/dist/ui/static/_next/static/chunks/0xhu-pfsyvbmx.js +5 -0
  12. package/dist/ui/static/_next/static/chunks/3vf3oh2-sl2nc.js +1 -0
  13. package/dist/ui/static/_next/static/chunks/3wmd4-2vznp2g.js +106 -0
  14. package/dist/ui/static/_next/static/chunks/turbopack-18q50fp2-1qbt.js +1 -0
  15. package/dist/ui/static/_not-found/__next._full.txt +2 -2
  16. package/dist/ui/static/_not-found/__next._head.txt +1 -1
  17. package/dist/ui/static/_not-found/__next._index.txt +2 -2
  18. package/dist/ui/static/_not-found/__next._not-found.__PAGE__.txt +1 -1
  19. package/dist/ui/static/_not-found/__next._not-found.txt +1 -1
  20. package/dist/ui/static/_not-found/__next._tree.txt +2 -2
  21. package/dist/ui/static/_not-found.html +1 -1
  22. package/dist/ui/static/_not-found.txt +2 -2
  23. package/dist/ui/static/index.html +1 -1
  24. package/dist/ui/static/index.txt +3 -3
  25. package/dist/ui/static/launch/__next._full.txt +3 -3
  26. package/dist/ui/static/launch/__next._head.txt +1 -1
  27. package/dist/ui/static/launch/__next._index.txt +2 -2
  28. package/dist/ui/static/launch/__next._tree.txt +2 -2
  29. package/dist/ui/static/launch/__next.launch.__PAGE__.txt +2 -2
  30. package/dist/ui/static/launch/__next.launch.txt +1 -1
  31. package/dist/ui/static/launch.html +1 -1
  32. package/dist/ui/static/launch.txt +3 -3
  33. package/dist/ui/static/local-knowledge/__next._full.txt +3 -3
  34. package/dist/ui/static/local-knowledge/__next._head.txt +1 -1
  35. package/dist/ui/static/local-knowledge/__next._index.txt +2 -2
  36. package/dist/ui/static/local-knowledge/__next._tree.txt +2 -2
  37. package/dist/ui/static/local-knowledge/__next.local-knowledge.__PAGE__.txt +2 -2
  38. package/dist/ui/static/local-knowledge/__next.local-knowledge.txt +1 -1
  39. package/dist/ui/static/local-knowledge/capsule/__next._full.txt +3 -3
  40. package/dist/ui/static/local-knowledge/capsule/__next._head.txt +1 -1
  41. package/dist/ui/static/local-knowledge/capsule/__next._index.txt +2 -2
  42. package/dist/ui/static/local-knowledge/capsule/__next._tree.txt +2 -2
  43. package/dist/ui/static/local-knowledge/capsule/__next.local-knowledge.capsule.__PAGE__.txt +2 -2
  44. package/dist/ui/static/local-knowledge/capsule/__next.local-knowledge.capsule.txt +1 -1
  45. package/dist/ui/static/local-knowledge/capsule/__next.local-knowledge.txt +1 -1
  46. package/dist/ui/static/local-knowledge/capsule.html +1 -1
  47. package/dist/ui/static/local-knowledge/capsule.txt +3 -3
  48. package/dist/ui/static/local-knowledge.html +1 -1
  49. package/dist/ui/static/local-knowledge.txt +3 -3
  50. package/dist/ui/static/memoriaviva/__next._full.txt +6 -6
  51. package/dist/ui/static/memoriaviva/__next._head.txt +1 -1
  52. package/dist/ui/static/memoriaviva/__next._index.txt +2 -2
  53. package/dist/ui/static/memoriaviva/__next._tree.txt +2 -2
  54. package/dist/ui/static/memoriaviva/__next.memoriaviva.__PAGE__.txt +4 -4
  55. package/dist/ui/static/memoriaviva/__next.memoriaviva.txt +1 -1
  56. package/dist/ui/static/memoriaviva/consolidation/__next._full.txt +4 -4
  57. package/dist/ui/static/memoriaviva/consolidation/__next._head.txt +1 -1
  58. package/dist/ui/static/memoriaviva/consolidation/__next._index.txt +2 -2
  59. package/dist/ui/static/memoriaviva/consolidation/__next._tree.txt +2 -2
  60. package/dist/ui/static/memoriaviva/consolidation/__next.memoriaviva.consolidation.__PAGE__.txt +2 -2
  61. package/dist/ui/static/memoriaviva/consolidation/__next.memoriaviva.consolidation.txt +1 -1
  62. package/dist/ui/static/memoriaviva/consolidation/__next.memoriaviva.txt +1 -1
  63. package/dist/ui/static/memoriaviva/consolidation.html +1 -1
  64. package/dist/ui/static/memoriaviva/consolidation.txt +4 -4
  65. package/dist/ui/static/memoriaviva/detail/__next._full.txt +6 -6
  66. package/dist/ui/static/memoriaviva/detail/__next._head.txt +1 -1
  67. package/dist/ui/static/memoriaviva/detail/__next._index.txt +2 -2
  68. package/dist/ui/static/memoriaviva/detail/__next._tree.txt +2 -2
  69. package/dist/ui/static/memoriaviva/detail/__next.memoriaviva.detail.__PAGE__.txt +4 -4
  70. package/dist/ui/static/memoriaviva/detail/__next.memoriaviva.detail.txt +1 -1
  71. package/dist/ui/static/memoriaviva/detail/__next.memoriaviva.txt +1 -1
  72. package/dist/ui/static/memoriaviva/detail.html +1 -1
  73. package/dist/ui/static/memoriaviva/detail.txt +6 -6
  74. package/dist/ui/static/memoriaviva/review-queue/__next._full.txt +4 -4
  75. package/dist/ui/static/memoriaviva/review-queue/__next._head.txt +1 -1
  76. package/dist/ui/static/memoriaviva/review-queue/__next._index.txt +2 -2
  77. package/dist/ui/static/memoriaviva/review-queue/__next._tree.txt +2 -2
  78. package/dist/ui/static/memoriaviva/review-queue/__next.memoriaviva.review-queue.__PAGE__.txt +2 -2
  79. package/dist/ui/static/memoriaviva/review-queue/__next.memoriaviva.review-queue.txt +1 -1
  80. package/dist/ui/static/memoriaviva/review-queue/__next.memoriaviva.txt +1 -1
  81. package/dist/ui/static/memoriaviva/review-queue.html +1 -1
  82. package/dist/ui/static/memoriaviva/review-queue.txt +4 -4
  83. package/dist/ui/static/memoriaviva.html +1 -1
  84. package/dist/ui/static/memoriaviva.txt +6 -6
  85. package/node_modules/@oscharko-dev/keiko-cli/dist/.tsbuildinfo +1 -1
  86. package/node_modules/@oscharko-dev/keiko-cli/dist/doctor.d.ts +24 -0
  87. package/node_modules/@oscharko-dev/keiko-cli/dist/doctor.d.ts.map +1 -0
  88. package/node_modules/@oscharko-dev/keiko-cli/dist/doctor.js +108 -0
  89. package/node_modules/@oscharko-dev/keiko-cli/dist/evaluate.d.ts.map +1 -1
  90. package/node_modules/@oscharko-dev/keiko-cli/dist/evaluate.js +7 -4
  91. package/node_modules/@oscharko-dev/keiko-cli/dist/index.d.ts +1 -0
  92. package/node_modules/@oscharko-dev/keiko-cli/dist/index.d.ts.map +1 -1
  93. package/node_modules/@oscharko-dev/keiko-cli/dist/index.js +1 -0
  94. package/node_modules/@oscharko-dev/keiko-cli/dist/init.d.ts +2 -2
  95. package/node_modules/@oscharko-dev/keiko-cli/dist/init.d.ts.map +1 -1
  96. package/node_modules/@oscharko-dev/keiko-cli/dist/init.js +4 -4
  97. package/node_modules/@oscharko-dev/keiko-cli/dist/install-layout.d.ts +6 -0
  98. package/node_modules/@oscharko-dev/keiko-cli/dist/install-layout.d.ts.map +1 -0
  99. package/node_modules/@oscharko-dev/keiko-cli/dist/install-layout.js +24 -0
  100. package/node_modules/@oscharko-dev/keiko-cli/dist/launcher.d.ts.map +1 -1
  101. package/node_modules/@oscharko-dev/keiko-cli/dist/launcher.js +5 -7
  102. package/node_modules/@oscharko-dev/keiko-cli/dist/lifecycle.d.ts +1 -0
  103. package/node_modules/@oscharko-dev/keiko-cli/dist/lifecycle.d.ts.map +1 -1
  104. package/node_modules/@oscharko-dev/keiko-cli/dist/lifecycle.js +75 -30
  105. package/node_modules/@oscharko-dev/keiko-cli/dist/memory.d.ts +3 -0
  106. package/node_modules/@oscharko-dev/keiko-cli/dist/memory.d.ts.map +1 -1
  107. package/node_modules/@oscharko-dev/keiko-cli/dist/memory.js +76 -7
  108. package/node_modules/@oscharko-dev/keiko-cli/dist/run.d.ts.map +1 -1
  109. package/node_modules/@oscharko-dev/keiko-cli/dist/run.js +50 -2
  110. package/node_modules/@oscharko-dev/keiko-cli/dist/runner.d.ts.map +1 -1
  111. package/node_modules/@oscharko-dev/keiko-cli/dist/runner.js +20 -4
  112. package/node_modules/@oscharko-dev/keiko-cli/dist/ui.d.ts +1 -1
  113. package/node_modules/@oscharko-dev/keiko-cli/dist/ui.d.ts.map +1 -1
  114. package/node_modules/@oscharko-dev/keiko-cli/dist/ui.js +17 -14
  115. package/node_modules/@oscharko-dev/keiko-cli/package.json +1 -1
  116. package/node_modules/@oscharko-dev/keiko-contracts/dist/.tsbuildinfo +1 -1
  117. package/node_modules/@oscharko-dev/keiko-contracts/dist/bff-wire.d.ts +7 -0
  118. package/node_modules/@oscharko-dev/keiko-contracts/dist/bff-wire.d.ts.map +1 -1
  119. package/node_modules/@oscharko-dev/keiko-contracts/dist/connected-context.d.ts.map +1 -1
  120. package/node_modules/@oscharko-dev/keiko-contracts/dist/connected-context.js +1 -2
  121. package/node_modules/@oscharko-dev/keiko-contracts/dist/evidence.d.ts +1 -0
  122. package/node_modules/@oscharko-dev/keiko-contracts/dist/evidence.d.ts.map +1 -1
  123. package/node_modules/@oscharko-dev/keiko-contracts/dist/gateway.d.ts +12 -0
  124. package/node_modules/@oscharko-dev/keiko-contracts/dist/gateway.d.ts.map +1 -1
  125. package/node_modules/@oscharko-dev/keiko-contracts/dist/index.d.ts +4 -2
  126. package/node_modules/@oscharko-dev/keiko-contracts/dist/index.d.ts.map +1 -1
  127. package/node_modules/@oscharko-dev/keiko-contracts/dist/index.js +4 -1
  128. package/node_modules/@oscharko-dev/keiko-contracts/dist/local-knowledge-validation.d.ts.map +1 -1
  129. package/node_modules/@oscharko-dev/keiko-contracts/dist/memory-audit-events.d.ts +13 -1
  130. package/node_modules/@oscharko-dev/keiko-contracts/dist/memory-audit-events.d.ts.map +1 -1
  131. package/node_modules/@oscharko-dev/keiko-contracts/dist/memory-audit-events.js +7 -6
  132. package/node_modules/@oscharko-dev/keiko-contracts/dist/memory-internal.d.ts.map +1 -1
  133. package/node_modules/@oscharko-dev/keiko-contracts/dist/memory-internal.js +1 -1
  134. package/node_modules/@oscharko-dev/keiko-contracts/dist/memory-operations.d.ts.map +1 -1
  135. package/node_modules/@oscharko-dev/keiko-contracts/dist/memory-workflow-port.d.ts.map +1 -1
  136. package/node_modules/@oscharko-dev/keiko-contracts/dist/memory-workflow-port.js +1 -1
  137. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/bffWire.d.ts +21 -4
  138. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/bffWire.d.ts.map +1 -1
  139. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/index.d.ts +1 -0
  140. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/index.d.ts.map +1 -1
  141. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/index.js +1 -0
  142. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/sourceEnvelope.d.ts +1 -0
  143. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/sourceEnvelope.d.ts.map +1 -1
  144. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/sourceEnvelope.js +26 -0
  145. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/testQualityRubric.d.ts +5 -3
  146. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/testQualityRubric.d.ts.map +1 -1
  147. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/testQualityRubric.js +29 -3
  148. package/node_modules/@oscharko-dev/keiko-contracts/dist/text-safety.d.ts +7 -0
  149. package/node_modules/@oscharko-dev/keiko-contracts/dist/text-safety.d.ts.map +1 -0
  150. package/node_modules/@oscharko-dev/keiko-contracts/dist/text-safety.js +58 -0
  151. package/node_modules/@oscharko-dev/keiko-contracts/package.json +5 -1
  152. package/node_modules/@oscharko-dev/keiko-evaluations/dist/.tsbuildinfo +1 -1
  153. package/node_modules/@oscharko-dev/keiko-evaluations/dist/surface-parity.d.ts.map +1 -1
  154. package/node_modules/@oscharko-dev/keiko-evaluations/package.json +1 -1
  155. package/node_modules/@oscharko-dev/keiko-evidence/dist/.tsbuildinfo +1 -1
  156. package/node_modules/@oscharko-dev/keiko-evidence/dist/index.d.ts +1 -1
  157. package/node_modules/@oscharko-dev/keiko-evidence/dist/index.d.ts.map +1 -1
  158. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/candidatesArtifact.d.ts +7 -0
  159. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/candidatesArtifact.d.ts.map +1 -1
  160. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/candidatesArtifact.js +62 -13
  161. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/companionStore.d.ts +3 -3
  162. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/companionStore.d.ts.map +1 -1
  163. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/companionStore.js +31 -11
  164. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/figmaSnapshot/schema.d.ts +35 -3
  165. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/figmaSnapshot/schema.d.ts.map +1 -1
  166. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/figmaSnapshot/schema.js +107 -3
  167. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/figmaSnapshot/store.d.ts +15 -1
  168. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/figmaSnapshot/store.d.ts.map +1 -1
  169. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/figmaSnapshot/store.js +248 -36
  170. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/index.d.ts +2 -2
  171. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/index.d.ts.map +1 -1
  172. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/manifestSchema.d.ts +17 -3
  173. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/manifestSchema.d.ts.map +1 -1
  174. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/store.d.ts +1 -1
  175. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/store.d.ts.map +1 -1
  176. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/store.js +26 -22
  177. package/node_modules/@oscharko-dev/keiko-evidence/dist/side-file.d.ts.map +1 -1
  178. package/node_modules/@oscharko-dev/keiko-evidence/dist/side-file.js +17 -5
  179. package/node_modules/@oscharko-dev/keiko-evidence/dist/store.d.ts.map +1 -1
  180. package/node_modules/@oscharko-dev/keiko-evidence/dist/store.js +128 -12
  181. package/node_modules/@oscharko-dev/keiko-evidence/dist/workflow-evidence.d.ts.map +1 -1
  182. package/node_modules/@oscharko-dev/keiko-evidence/dist/workflow-evidence.js +1 -3
  183. package/node_modules/@oscharko-dev/keiko-evidence/package.json +1 -1
  184. package/node_modules/@oscharko-dev/keiko-harness/dist/.tsbuildinfo +1 -1
  185. package/node_modules/@oscharko-dev/keiko-harness/package.json +1 -1
  186. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/.tsbuildinfo +1 -1
  187. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/capsule-set-lifecycle.d.ts.map +1 -1
  188. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/capsule-set-lifecycle.js +1 -2
  189. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/composition.d.ts.map +1 -1
  190. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/composition.js +1 -1
  191. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/extract.d.ts.map +1 -1
  192. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/extract.js +45 -21
  193. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/media-type.d.ts.map +1 -1
  194. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/media-type.js +1 -0
  195. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/walk.d.ts.map +1 -1
  196. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/walk.js +11 -3
  197. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/dimensions.d.ts +2 -0
  198. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/dimensions.d.ts.map +1 -1
  199. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/dimensions.js +42 -0
  200. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/fixtures.d.ts.map +1 -1
  201. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/fixtures.js +34 -0
  202. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/index.d.ts +1 -1
  203. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/index.d.ts.map +1 -1
  204. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/index.js +1 -1
  205. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/report.d.ts.map +1 -1
  206. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/report.js +7 -6
  207. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/runner.d.ts.map +1 -1
  208. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/runner.js +7 -1
  209. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/types.d.ts +4 -0
  210. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/types.d.ts.map +1 -1
  211. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/types.js +2 -0
  212. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/index.d.ts +1 -1
  213. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/index.d.ts.map +1 -1
  214. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/index.js +1 -1
  215. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/indexing/embedding-batcher.d.ts.map +1 -1
  216. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/indexing/embedding-batcher.js +121 -3
  217. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/indexing/orchestrator.d.ts.map +1 -1
  218. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/indexing/orchestrator.js +34 -4
  219. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/_internal.d.ts +1 -0
  220. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/_internal.d.ts.map +1 -1
  221. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/_internal.js +63 -0
  222. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/docx-parser.d.ts.map +1 -1
  223. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/docx-parser.js +4 -7
  224. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/html-parser.d.ts.map +1 -1
  225. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/html-parser.js +67 -11
  226. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/index.d.ts +1 -0
  227. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/index.d.ts.map +1 -1
  228. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/index.js +3 -0
  229. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/json-parser.d.ts.map +1 -1
  230. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/json-parser.js +39 -3
  231. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/ocr/null-ocr-adapter.d.ts.map +1 -1
  232. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/ocr/ocr-pipeline-parser.d.ts.map +1 -1
  233. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/ocr/ocr-pipeline-parser.js +46 -11
  234. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/parser-test-fixtures.d.ts +2 -0
  235. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/parser-test-fixtures.d.ts.map +1 -1
  236. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/parser-test-fixtures.js +2 -0
  237. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/pdf-parser.d.ts.map +1 -1
  238. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/pdf-parser.js +114 -0
  239. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/xlsx-parser.d.ts +3 -0
  240. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/xlsx-parser.d.ts.map +1 -0
  241. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/xlsx-parser.js +425 -0
  242. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/privacy/retention-applier.d.ts.map +1 -1
  243. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/qualityIntelligence/capsuleCorpus.d.ts +9 -4
  244. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/qualityIntelligence/capsuleCorpus.d.ts.map +1 -1
  245. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/qualityIntelligence/capsuleCorpus.js +11 -6
  246. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/retrieval/retrieval-runner.js +15 -2
  247. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/retrieval/scoped-vector-search.d.ts +1 -0
  248. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/retrieval/scoped-vector-search.d.ts.map +1 -1
  249. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/retrieval/scoped-vector-search.js +220 -7
  250. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/retrieval/types.d.ts +2 -1
  251. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/retrieval/types.d.ts.map +1 -1
  252. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/source-lifecycle.d.ts.map +1 -1
  253. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/source-lifecycle.js +3 -1
  254. package/node_modules/@oscharko-dev/keiko-local-knowledge/package.json +4 -2
  255. package/node_modules/@oscharko-dev/keiko-memory-capture/dist/.tsbuildinfo +1 -1
  256. package/node_modules/@oscharko-dev/keiko-memory-capture/dist/capture-safety.d.ts +4 -0
  257. package/node_modules/@oscharko-dev/keiko-memory-capture/dist/capture-safety.d.ts.map +1 -0
  258. package/node_modules/@oscharko-dev/keiko-memory-capture/dist/capture-safety.js +17 -0
  259. package/node_modules/@oscharko-dev/keiko-memory-capture/dist/errors.d.ts +1 -1
  260. package/node_modules/@oscharko-dev/keiko-memory-capture/dist/errors.d.ts.map +1 -1
  261. package/node_modules/@oscharko-dev/keiko-memory-capture/dist/index.d.ts +1 -0
  262. package/node_modules/@oscharko-dev/keiko-memory-capture/dist/index.d.ts.map +1 -1
  263. package/node_modules/@oscharko-dev/keiko-memory-capture/dist/index.js +1 -0
  264. package/node_modules/@oscharko-dev/keiko-memory-capture/dist/salience.js +1 -1
  265. package/node_modules/@oscharko-dev/keiko-memory-capture/package.json +1 -1
  266. package/node_modules/@oscharko-dev/keiko-memory-consolidation/dist/.tsbuildinfo +1 -1
  267. package/node_modules/@oscharko-dev/keiko-memory-consolidation/dist/_constants.d.ts +3 -0
  268. package/node_modules/@oscharko-dev/keiko-memory-consolidation/dist/_constants.d.ts.map +1 -1
  269. package/node_modules/@oscharko-dev/keiko-memory-consolidation/dist/_constants.js +5 -0
  270. package/node_modules/@oscharko-dev/keiko-memory-consolidation/dist/consolidate.d.ts.map +1 -1
  271. package/node_modules/@oscharko-dev/keiko-memory-consolidation/dist/consolidate.js +93 -30
  272. package/node_modules/@oscharko-dev/keiko-memory-consolidation/dist/stale.d.ts.map +1 -1
  273. package/node_modules/@oscharko-dev/keiko-memory-consolidation/dist/stale.js +3 -1
  274. package/node_modules/@oscharko-dev/keiko-memory-consolidation/dist/types.d.ts +5 -0
  275. package/node_modules/@oscharko-dev/keiko-memory-consolidation/dist/types.d.ts.map +1 -1
  276. package/node_modules/@oscharko-dev/keiko-memory-consolidation/dist/types.js +1 -1
  277. package/node_modules/@oscharko-dev/keiko-memory-consolidation/package.json +2 -2
  278. package/node_modules/@oscharko-dev/keiko-memory-governance/dist/.tsbuildinfo +1 -1
  279. package/node_modules/@oscharko-dev/keiko-memory-governance/dist/forget.js +1 -1
  280. package/node_modules/@oscharko-dev/keiko-memory-governance/dist/types.js +1 -1
  281. package/node_modules/@oscharko-dev/keiko-memory-governance/package.json +2 -2
  282. package/node_modules/@oscharko-dev/keiko-memory-retrieval/dist/.tsbuildinfo +1 -1
  283. package/node_modules/@oscharko-dev/keiko-memory-retrieval/dist/context.d.ts.map +1 -1
  284. package/node_modules/@oscharko-dev/keiko-memory-retrieval/dist/context.js +61 -18
  285. package/node_modules/@oscharko-dev/keiko-memory-retrieval/dist/ranking.d.ts.map +1 -1
  286. package/node_modules/@oscharko-dev/keiko-memory-retrieval/dist/ranking.js +3 -1
  287. package/node_modules/@oscharko-dev/keiko-memory-retrieval/dist/retrieve.d.ts.map +1 -1
  288. package/node_modules/@oscharko-dev/keiko-memory-retrieval/dist/retrieve.js +26 -4
  289. package/node_modules/@oscharko-dev/keiko-memory-retrieval/dist/types.d.ts +9 -1
  290. package/node_modules/@oscharko-dev/keiko-memory-retrieval/dist/types.d.ts.map +1 -1
  291. package/node_modules/@oscharko-dev/keiko-memory-retrieval/package.json +1 -1
  292. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/.tsbuildinfo +1 -1
  293. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/embeddings.d.ts +1 -0
  294. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/embeddings.d.ts.map +1 -1
  295. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/embeddings.js +21 -0
  296. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/index.d.ts +1 -1
  297. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/index.d.ts.map +1 -1
  298. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/migrate-encrypt.d.ts.map +1 -1
  299. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/migrate-encrypt.js +24 -4
  300. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/schema.d.ts +1 -1
  301. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/schema.d.ts.map +1 -1
  302. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/schema.js +27 -4
  303. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/tombstones.d.ts +1 -0
  304. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/tombstones.d.ts.map +1 -1
  305. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/tombstones.js +21 -4
  306. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/types.d.ts +22 -1
  307. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/types.d.ts.map +1 -1
  308. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/validate.d.ts.map +1 -1
  309. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/validate.js +3 -0
  310. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/vault.d.ts.map +1 -1
  311. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/vault.js +105 -28
  312. package/node_modules/@oscharko-dev/keiko-memory-vault/package.json +1 -1
  313. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/.tsbuildinfo +1 -1
  314. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/config.d.ts +2 -0
  315. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/config.d.ts.map +1 -1
  316. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/config.js +83 -69
  317. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/embedding.d.ts +3 -2
  318. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/embedding.d.ts.map +1 -1
  319. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/embedding.js +20 -16
  320. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/gateway.d.ts.map +1 -1
  321. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/gateway.js +9 -3
  322. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/http.d.ts.map +1 -1
  323. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/http.js +29 -3
  324. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/index.d.ts +4 -4
  325. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/index.d.ts.map +1 -1
  326. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/index.js +3 -3
  327. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/openai-adapter.d.ts.map +1 -1
  328. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/openai-adapter.js +51 -6
  329. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/openai-embedding-adapter.d.ts +20 -1
  330. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/openai-embedding-adapter.d.ts.map +1 -1
  331. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/openai-embedding-adapter.js +122 -7
  332. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/qualityIntelligence/capabilityGate.d.ts +10 -1
  333. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/qualityIntelligence/capabilityGate.d.ts.map +1 -1
  334. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/qualityIntelligence/capabilityGate.js +33 -11
  335. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/qualityIntelligence/capabilityMapping.d.ts +4 -0
  336. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/qualityIntelligence/capabilityMapping.d.ts.map +1 -0
  337. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/qualityIntelligence/capabilityMapping.js +21 -0
  338. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/qualityIntelligence/index.d.ts +1 -1
  339. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/qualityIntelligence/index.d.ts.map +1 -1
  340. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/qualityIntelligence/index.js +1 -1
  341. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/qualityIntelligence/routing.d.ts.map +1 -1
  342. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/qualityIntelligence/routing.js +2 -13
  343. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/resilience.d.ts +1 -0
  344. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/resilience.d.ts.map +1 -1
  345. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/resilience.js +18 -2
  346. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/types.d.ts +5 -1
  347. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/types.d.ts.map +1 -1
  348. package/node_modules/@oscharko-dev/keiko-model-gateway/package.json +1 -1
  349. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/.tsbuildinfo +1 -1
  350. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/assertions.d.ts +35 -0
  351. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/assertions.d.ts.map +1 -1
  352. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/assertions.js +74 -0
  353. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/deduplication.d.ts.map +1 -1
  354. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/deduplication.js +6 -2
  355. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/a11yBaseline.d.ts.map +1 -1
  356. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/a11yBaseline.js +64 -19
  357. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/cleanToScreenIr.d.ts.map +1 -1
  358. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/cleanToScreenIr.js +3 -0
  359. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/color.d.ts +6 -1
  360. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/color.d.ts.map +1 -1
  361. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/color.js +22 -9
  362. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/emissionPlan.d.ts +4 -1
  363. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/emissionPlan.d.ts.map +1 -1
  364. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/emissionPlan.js +28 -12
  365. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/htmlCssAdapter.d.ts.map +1 -1
  366. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/htmlCssAdapter.js +123 -33
  367. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/index.d.ts +2 -2
  368. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/index.d.ts.map +1 -1
  369. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/irTypes.d.ts +7 -4
  370. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/irTypes.d.ts.map +1 -1
  371. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/links.d.ts.map +1 -1
  372. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/links.js +13 -17
  373. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/navGraph.d.ts.map +1 -1
  374. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/navGraph.js +35 -12
  375. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/normalize.d.ts.map +1 -1
  376. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/normalize.js +54 -6
  377. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/screenIrTestBaseline.d.ts +4 -0
  378. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/screenIrTestBaseline.d.ts.map +1 -1
  379. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/screenIrTestBaseline.js +29 -10
  380. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/tokens.d.ts.map +1 -1
  381. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/tokens.js +10 -4
  382. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/requirementExcerpt.d.ts.map +1 -1
  383. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/requirementExcerpt.js +15 -6
  384. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/staleness.d.ts +4 -0
  385. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/staleness.d.ts.map +1 -1
  386. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/staleness.js +162 -6
  387. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/testDesignModel.d.ts +14 -2
  388. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/testDesignModel.d.ts.map +1 -1
  389. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/testDesignModel.js +50 -12
  390. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/validation.d.ts.map +1 -1
  391. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/validation.js +4 -2
  392. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/markdown.d.ts.map +1 -1
  393. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/markdown.js +8 -3
  394. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/traceability.d.ts.map +1 -1
  395. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/traceability.js +12 -9
  396. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/textSafety.d.ts +7 -0
  397. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/textSafety.d.ts.map +1 -1
  398. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/textSafety.js +7 -0
  399. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/generation/candidateBounds.d.ts +10 -0
  400. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/generation/candidateBounds.d.ts.map +1 -0
  401. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/generation/candidateBounds.js +14 -0
  402. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/generation/index.d.ts.map +1 -1
  403. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/generation/index.js +3 -2
  404. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/generation/parseGeneratedCandidates.d.ts.map +1 -1
  405. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/generation/parseGeneratedCandidates.js +97 -50
  406. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/generation/prompt.d.ts.map +1 -1
  407. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/generation/prompt.js +35 -7
  408. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/index.d.ts +2 -2
  409. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/index.d.ts.map +1 -1
  410. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/index.js +2 -2
  411. package/node_modules/@oscharko-dev/keiko-quality-intelligence/package.json +1 -1
  412. package/node_modules/@oscharko-dev/keiko-sdk/dist/.tsbuildinfo +1 -1
  413. package/node_modules/@oscharko-dev/keiko-sdk/package.json +1 -1
  414. package/node_modules/@oscharko-dev/keiko-security/dist/.tsbuildinfo +1 -1
  415. package/node_modules/@oscharko-dev/keiko-security/dist/errors/gateway.d.ts +11 -0
  416. package/node_modules/@oscharko-dev/keiko-security/dist/errors/gateway.d.ts.map +1 -1
  417. package/node_modules/@oscharko-dev/keiko-security/dist/errors/gateway.js +13 -0
  418. package/node_modules/@oscharko-dev/keiko-security/package.json +1 -1
  419. package/node_modules/@oscharko-dev/keiko-server/dist/.tsbuildinfo +1 -1
  420. package/node_modules/@oscharko-dev/keiko-server/dist/chat-handlers.d.ts.map +1 -1
  421. package/node_modules/@oscharko-dev/keiko-server/dist/chat-handlers.js +50 -12
  422. package/node_modules/@oscharko-dev/keiko-server/dist/chat-stream-handlers.d.ts.map +1 -1
  423. package/node_modules/@oscharko-dev/keiko-server/dist/chat-stream-handlers.js +10 -8
  424. package/node_modules/@oscharko-dev/keiko-server/dist/conversation-prompt.d.ts +1 -0
  425. package/node_modules/@oscharko-dev/keiko-server/dist/conversation-prompt.d.ts.map +1 -1
  426. package/node_modules/@oscharko-dev/keiko-server/dist/conversation-prompt.js +3 -0
  427. package/node_modules/@oscharko-dev/keiko-server/dist/deps.d.ts +4 -2
  428. package/node_modules/@oscharko-dev/keiko-server/dist/deps.d.ts.map +1 -1
  429. package/node_modules/@oscharko-dev/keiko-server/dist/deps.js +44 -69
  430. package/node_modules/@oscharko-dev/keiko-server/dist/gateway-setup.d.ts.map +1 -1
  431. package/node_modules/@oscharko-dev/keiko-server/dist/gateway-setup.js +120 -28
  432. package/node_modules/@oscharko-dev/keiko-server/dist/governed-workflow.d.ts.map +1 -1
  433. package/node_modules/@oscharko-dev/keiko-server/dist/governed-workflow.js +4 -1
  434. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-handoff.d.ts.map +1 -1
  435. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-handoff.js +2 -0
  436. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-hybrid.d.ts.map +1 -1
  437. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-hybrid.js +115 -22
  438. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-multi-source.d.ts.map +1 -1
  439. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-multi-source.js +54 -21
  440. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa.d.ts.map +1 -1
  441. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa.js +11 -4
  442. package/node_modules/@oscharko-dev/keiko-server/dist/index.d.ts +1 -0
  443. package/node_modules/@oscharko-dev/keiko-server/dist/index.d.ts.map +1 -1
  444. package/node_modules/@oscharko-dev/keiko-server/dist/index.js +1 -0
  445. package/node_modules/@oscharko-dev/keiko-server/dist/local-knowledge-grounded-qa.d.ts.map +1 -1
  446. package/node_modules/@oscharko-dev/keiko-server/dist/local-knowledge-grounded-qa.js +7 -3
  447. package/node_modules/@oscharko-dev/keiko-server/dist/local-knowledge-handlers.d.ts.map +1 -1
  448. package/node_modules/@oscharko-dev/keiko-server/dist/local-knowledge-handlers.js +26 -14
  449. package/node_modules/@oscharko-dev/keiko-server/dist/memory-audit-handler.d.ts +1 -0
  450. package/node_modules/@oscharko-dev/keiko-server/dist/memory-audit-handler.d.ts.map +1 -1
  451. package/node_modules/@oscharko-dev/keiko-server/dist/memory-audit-handler.js +52 -27
  452. package/node_modules/@oscharko-dev/keiko-server/dist/memory-capture-policy.d.ts +10 -0
  453. package/node_modules/@oscharko-dev/keiko-server/dist/memory-capture-policy.d.ts.map +1 -0
  454. package/node_modules/@oscharko-dev/keiko-server/dist/memory-capture-policy.js +44 -0
  455. package/node_modules/@oscharko-dev/keiko-server/dist/memory-consolidation-handlers.d.ts.map +1 -1
  456. package/node_modules/@oscharko-dev/keiko-server/dist/memory-consolidation-handlers.js +79 -57
  457. package/node_modules/@oscharko-dev/keiko-server/dist/memory-consolidation-registry.d.ts +1 -0
  458. package/node_modules/@oscharko-dev/keiko-server/dist/memory-consolidation-registry.d.ts.map +1 -1
  459. package/node_modules/@oscharko-dev/keiko-server/dist/memory-conv-handlers.d.ts.map +1 -1
  460. package/node_modules/@oscharko-dev/keiko-server/dist/memory-conv-handlers.js +6 -4
  461. package/node_modules/@oscharko-dev/keiko-server/dist/memory-conversation-context.d.ts.map +1 -1
  462. package/node_modules/@oscharko-dev/keiko-server/dist/memory-diagnostics.d.ts.map +1 -1
  463. package/node_modules/@oscharko-dev/keiko-server/dist/memory-diagnostics.js +16 -9
  464. package/node_modules/@oscharko-dev/keiko-server/dist/memory-handlers.d.ts +3 -1
  465. package/node_modules/@oscharko-dev/keiko-server/dist/memory-handlers.d.ts.map +1 -1
  466. package/node_modules/@oscharko-dev/keiko-server/dist/memory-handlers.js +538 -87
  467. package/node_modules/@oscharko-dev/keiko-server/dist/memory-maintenance-handlers.d.ts +6 -1
  468. package/node_modules/@oscharko-dev/keiko-server/dist/memory-maintenance-handlers.d.ts.map +1 -1
  469. package/node_modules/@oscharko-dev/keiko-server/dist/memory-maintenance-handlers.js +17 -38
  470. package/node_modules/@oscharko-dev/keiko-server/dist/memory-retention.d.ts.map +1 -1
  471. package/node_modules/@oscharko-dev/keiko-server/dist/memory-retention.js +7 -15
  472. package/node_modules/@oscharko-dev/keiko-server/dist/memory-salience.d.ts.map +1 -1
  473. package/node_modules/@oscharko-dev/keiko-server/dist/memory-salience.js +17 -2
  474. package/node_modules/@oscharko-dev/keiko-server/dist/memory-scope-sanitizer.d.ts.map +1 -1
  475. package/node_modules/@oscharko-dev/keiko-server/dist/memory-scope-sanitizer.js +19 -0
  476. package/node_modules/@oscharko-dev/keiko-server/dist/memory-target-resolver.d.ts.map +1 -1
  477. package/node_modules/@oscharko-dev/keiko-server/dist/memory-target-resolver.js +4 -1
  478. package/node_modules/@oscharko-dev/keiko-server/dist/memory-workflow-port.d.ts +1 -0
  479. package/node_modules/@oscharko-dev/keiko-server/dist/memory-workflow-port.d.ts.map +1 -1
  480. package/node_modules/@oscharko-dev/keiko-server/dist/memory-workflow-port.js +108 -27
  481. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/capsuleAdapter.d.ts +4 -0
  482. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/capsuleAdapter.d.ts.map +1 -1
  483. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/capsuleAdapter.js +3 -0
  484. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/editRoutes.d.ts.map +1 -1
  485. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/editRoutes.js +61 -7
  486. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/exportRoutes.d.ts.map +1 -1
  487. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/exportRoutes.js +9 -3
  488. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaConcurrency.d.ts.map +1 -1
  489. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaConcurrency.js +2 -1
  490. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaConnector.d.ts +6 -0
  491. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaConnector.d.ts.map +1 -1
  492. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaConnector.js +16 -3
  493. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaConnectorAudit.d.ts +7 -0
  494. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaConnectorAudit.d.ts.map +1 -1
  495. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaConnectorErrors.d.ts +1 -1
  496. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaConnectorErrors.d.ts.map +1 -1
  497. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaConnectorErrors.js +3 -1
  498. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaConsent.d.ts +2 -2
  499. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaConsent.d.ts.map +1 -1
  500. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaConsent.js +3 -3
  501. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaObservedActions.d.ts +5 -0
  502. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaObservedActions.d.ts.map +1 -1
  503. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaObservedActions.js +10 -8
  504. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaReadiness.d.ts.map +1 -1
  505. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaReadiness.js +11 -5
  506. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaRenderPort.d.ts.map +1 -1
  507. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaRenderPort.js +1 -0
  508. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaScopedPagination.d.ts +3 -0
  509. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaScopedPagination.d.ts.map +1 -1
  510. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaScopedPagination.js +71 -10
  511. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaSnapshotBuilder.d.ts +2 -0
  512. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaSnapshotBuilder.d.ts.map +1 -1
  513. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaSnapshotBuilder.js +86 -23
  514. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaSnapshotTypes.d.ts +1 -1
  515. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaSnapshotTypes.d.ts.map +1 -1
  516. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaTokenSource.d.ts.map +1 -1
  517. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaTokenSource.js +4 -3
  518. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaUrl.d.ts.map +1 -1
  519. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaUrl.js +2 -0
  520. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/index.d.ts +1 -1
  521. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/index.d.ts.map +1 -1
  522. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/index.js +1 -1
  523. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaCodegenRoutes.d.ts.map +1 -1
  524. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaCodegenRoutes.js +60 -20
  525. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotAdapter.d.ts +11 -6
  526. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotAdapter.d.ts.map +1 -1
  527. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotAdapter.js +144 -6
  528. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotOrchestration.d.ts +9 -0
  529. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotOrchestration.d.ts.map +1 -1
  530. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotOrchestration.js +84 -15
  531. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotRoutes.d.ts +9 -7
  532. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotRoutes.d.ts.map +1 -1
  533. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotRoutes.js +206 -42
  534. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/judgePort.d.ts +3 -1
  535. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/judgePort.d.ts.map +1 -1
  536. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/judgePort.js +69 -65
  537. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/modelSelection.d.ts +15 -1
  538. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/modelSelection.d.ts.map +1 -1
  539. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/modelSelection.js +56 -39
  540. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reCheckRoutes.d.ts +1 -1
  541. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reCheckRoutes.d.ts.map +1 -1
  542. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reCheckRoutes.js +382 -75
  543. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reviewRoutes.d.ts.map +1 -1
  544. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reviewRoutes.js +14 -6
  545. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runExecution.d.ts +3 -2
  546. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runExecution.d.ts.map +1 -1
  547. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runExecution.js +44 -16
  548. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runIngestion.d.ts +7 -0
  549. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runIngestion.d.ts.map +1 -1
  550. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runIngestion.js +336 -47
  551. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runRoutes.d.ts.map +1 -1
  552. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runRoutes.js +15 -5
  553. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/traceabilityRoutes.d.ts.map +1 -1
  554. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/traceabilityRoutes.js +36 -4
  555. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/uiRoutes.d.ts.map +1 -1
  556. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/uiRoutes.js +61 -6
  557. package/node_modules/@oscharko-dev/keiko-server/dist/routes.d.ts.map +1 -1
  558. package/node_modules/@oscharko-dev/keiko-server/dist/routes.js +16 -5
  559. package/node_modules/@oscharko-dev/keiko-server/dist/run-engine.d.ts +1 -0
  560. package/node_modules/@oscharko-dev/keiko-server/dist/run-engine.d.ts.map +1 -1
  561. package/node_modules/@oscharko-dev/keiko-server/dist/run-engine.js +3 -0
  562. package/node_modules/@oscharko-dev/keiko-server/dist/run-handlers.d.ts.map +1 -1
  563. package/node_modules/@oscharko-dev/keiko-server/dist/run-handlers.js +2 -0
  564. package/node_modules/@oscharko-dev/keiko-server/dist/sse-write.d.ts +9 -0
  565. package/node_modules/@oscharko-dev/keiko-server/dist/sse-write.d.ts.map +1 -0
  566. package/node_modules/@oscharko-dev/keiko-server/dist/sse-write.js +26 -0
  567. package/node_modules/@oscharko-dev/keiko-server/dist/store/chats.d.ts.map +1 -1
  568. package/node_modules/@oscharko-dev/keiko-server/dist/store/chats.js +16 -8
  569. package/node_modules/@oscharko-dev/keiko-server/dist/store/messages.d.ts.map +1 -1
  570. package/node_modules/@oscharko-dev/keiko-server/dist/store-handlers.d.ts.map +1 -1
  571. package/node_modules/@oscharko-dev/keiko-server/dist/terminal.d.ts.map +1 -1
  572. package/node_modules/@oscharko-dev/keiko-server/package.json +1 -1
  573. package/node_modules/@oscharko-dev/keiko-tools/dist/.tsbuildinfo +1 -1
  574. package/node_modules/@oscharko-dev/keiko-tools/dist/patch-normalize.d.ts.map +1 -1
  575. package/node_modules/@oscharko-dev/keiko-tools/dist/patch-normalize.js +13 -7
  576. package/node_modules/@oscharko-dev/keiko-tools/package.json +1 -1
  577. package/node_modules/@oscharko-dev/keiko-verification/dist/.tsbuildinfo +1 -1
  578. package/node_modules/@oscharko-dev/keiko-verification/package.json +1 -1
  579. package/node_modules/@oscharko-dev/keiko-workflows/dist/.tsbuildinfo +1 -1
  580. package/node_modules/@oscharko-dev/keiko-workflows/dist/bug-investigation/memory.d.ts +2 -2
  581. package/node_modules/@oscharko-dev/keiko-workflows/dist/bug-investigation/memory.d.ts.map +1 -1
  582. package/node_modules/@oscharko-dev/keiko-workflows/dist/bug-investigation/memory.js +16 -18
  583. package/node_modules/@oscharko-dev/keiko-workflows/dist/bug-investigation/prompt.d.ts.map +1 -1
  584. package/node_modules/@oscharko-dev/keiko-workflows/dist/bug-investigation/prompt.js +6 -1
  585. package/node_modules/@oscharko-dev/keiko-workflows/dist/bug-investigation/workflow.d.ts.map +1 -1
  586. package/node_modules/@oscharko-dev/keiko-workflows/dist/bug-investigation/workflow.js +3 -3
  587. package/node_modules/@oscharko-dev/keiko-workflows/dist/governed-handoff.d.ts.map +1 -1
  588. package/node_modules/@oscharko-dev/keiko-workflows/dist/qualityIntelligence/descriptors.d.ts +2 -2
  589. package/node_modules/@oscharko-dev/keiko-workflows/dist/qualityIntelligence/modelRoutedTestDesign.d.ts +18 -2
  590. package/node_modules/@oscharko-dev/keiko-workflows/dist/qualityIntelligence/modelRoutedTestDesign.d.ts.map +1 -1
  591. package/node_modules/@oscharko-dev/keiko-workflows/dist/qualityIntelligence/modelRoutedTestDesign.js +209 -54
  592. package/node_modules/@oscharko-dev/keiko-workflows/dist/qualityIntelligence/runtimeCommon.d.ts +4 -4
  593. package/node_modules/@oscharko-dev/keiko-workflows/dist/qualityIntelligence/runtimeCommon.d.ts.map +1 -1
  594. package/node_modules/@oscharko-dev/keiko-workflows/dist/qualityIntelligence/runtimeCommon.js +4 -1
  595. package/node_modules/@oscharko-dev/keiko-workflows/dist/unit-tests/target-guard.d.ts.map +1 -1
  596. package/node_modules/@oscharko-dev/keiko-workflows/package.json +1 -1
  597. package/node_modules/@oscharko-dev/keiko-workspace/dist/.tsbuildinfo +1 -1
  598. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchEntries.d.ts.map +1 -1
  599. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchEntries.js +1 -2
  600. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchLineSelection.d.ts.map +1 -1
  601. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchLineSelection.js +2 -1
  602. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchMatchers.d.ts.map +1 -1
  603. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchMatchers.js +6 -2
  604. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchRegexSafety.d.ts.map +1 -1
  605. package/node_modules/@oscharko-dev/keiko-workspace/package.json +1 -1
  606. package/package.json +23 -6
  607. package/dist/ui/static/_next/static/chunks/082obv3v03b-9.js +0 -2
  608. package/dist/ui/static/_next/static/chunks/0uifns067thv8.js +0 -1
  609. package/dist/ui/static/_next/static/chunks/0x31-j53ab1tt.js +0 -1
  610. package/dist/ui/static/_next/static/chunks/1m-kvwm6_90_3.css +0 -1
  611. package/dist/ui/static/_next/static/chunks/1v4hrxrm_6_rw.js +0 -1
  612. package/dist/ui/static/_next/static/chunks/27jktro2p5rq9.js +0 -4
  613. package/dist/ui/static/_next/static/chunks/2lypy3ewh0r04.js +0 -1
  614. package/dist/ui/static/_next/static/chunks/2ngm8iwdb1cbv.js +0 -106
  615. package/dist/ui/static/_next/static/chunks/32573pyyglqxl.js +0 -1
  616. package/dist/ui/static/_next/static/chunks/3_t_pzet29qtn.js +0 -1
  617. package/dist/ui/static/_next/static/chunks/3jgg_oe0iok0l.js +0 -1
  618. package/dist/ui/static/_next/static/chunks/3o_oia3vsam60.js +0 -1
  619. package/dist/ui/static/_next/static/chunks/turbopack-2lg1g6kbsfm0x.js +0 -1
  620. /package/dist/ui/static/_next/static/{hR2gBQqCDKdPdSxBqZhqv → fQMXe8UmV01bh25WOoIt3}/_buildManifest.js +0 -0
  621. /package/dist/ui/static/_next/static/{hR2gBQqCDKdPdSxBqZhqv → fQMXe8UmV01bh25WOoIt3}/_clientMiddlewareManifest.js +0 -0
  622. /package/dist/ui/static/_next/static/{hR2gBQqCDKdPdSxBqZhqv → fQMXe8UmV01bh25WOoIt3}/_ssgManifest.js +0 -0
@@ -9,7 +9,7 @@ import { realpathSync } from "node:fs";
9
9
  import { dirname, isAbsolute, relative, resolve } from "node:path";
10
10
  import { QualityIntelligence } from "@oscharko-dev/keiko-contracts";
11
11
  import { redact, sha256Hex } from "@oscharko-dev/keiko-security";
12
- import { QualityIntelligenceGeneration, QualityIntelligenceHardening, QualityIntelligenceFigma, } from "@oscharko-dev/keiko-quality-intelligence";
12
+ import { QualityIntelligenceGeneration, QualityIntelligenceHardening, QualityIntelligenceFigma, isUnsafeFormatCodePoint, stripUnsafeFormatChars, } from "@oscharko-dev/keiko-quality-intelligence";
13
13
  import { detectWorkspaceAt, discoverWithStats, buildContextPackFromFiles, readWorkspaceFile, isDenied, DEFAULT_CONTEXT_REQUEST, DEFAULT_READ_OPTIONS, WorkspaceError, FileTooLargeError, PathDeniedError, PathEscapeError, WorkspaceReadError, } from "@oscharko-dev/keiko-workspace";
14
14
  const MAX_TOTAL_ATOMS = 120;
15
15
  const MAX_LABEL_CHARS = 120;
@@ -36,6 +36,9 @@ function perSourceAtomBudget(total, sourceCount) {
36
36
  const EVIDENCE_BUDGET_BYTES = 196_608;
37
37
  // Never starve a source below this many bytes — a tiny share is still usable context.
38
38
  const MIN_SOURCE_BUDGET_BYTES = 4_096;
39
+ // Bound productive vision calls for one Figma snapshot source. The deterministic structural
40
+ // baseline still covers every parseable screen; vision hints are additive and sampled first-in-order.
41
+ const MAX_FIGMA_VISION_AUGMENTED_SCREENS = 12;
39
42
  /**
40
43
  * Fair per-source UTF-8 byte budget — the byte analogue of {@link perSourceAtomBudget}. Floor-divides
41
44
  * the global evidence byte pool across sources (Chat byte-split parity) with a non-zero floor so the
@@ -67,15 +70,31 @@ const CREDENTIAL_LABEL_SHAPES = [
67
70
  /\bBearer\s+\S+/giu,
68
71
  /-----BEGIN [A-Z ]*PRIVATE KEY-----/gu,
69
72
  ];
70
- // Replace every control character (C0 range incl. tab/newline/CR, plus DEL) with a space using a
71
- // code-point scan — the `no-control-regex` lint rule forbids a control-range regex literal, and a
72
- // scan is the established in-package idiom (mirrors generationPort.scrubEvidenceText). Keeps a
73
- // label single-line.
74
- function collapseControlCharsToSpace(value) {
73
+ // Make a source label single-line AND spoof-safe with one code-point scan (the `no-control-regex`
74
+ // lint rule forbids a control-range regex literal, and a scan is the established in-package idiom —
75
+ // mirrors generationPort.scrubEvidenceText):
76
+ // - C0 controls (incl. tab/newline/CR) and DEL become a SPACE, so a multi-line or control-laden
77
+ // label can never glue a second line of content into the streamed displayLabel (#277/#278).
78
+ // - Bidi overrides/isolates, zero-width/BOM, LRM/RLM, the Arabic letter mark, and C1 controls are
79
+ // DROPPED outright. These are invisible or reorder surrounding text, so a source filename /
80
+ // capsule id cannot smuggle a right-to-left or zero-width spoof into the browser-streamed
81
+ // envelope display surface. The drop set is the SHARED `isUnsafeFormatCodePoint` predicate used
82
+ // by the candidate-text scrubber (keiko-quality-intelligence stripUnsafeFormatChars), so the
83
+ // source-label path is symmetric with the persisted/exported candidate-text path (Epic #729;
84
+ // the bidi/zero-width display-hygiene class of #280/#284). C0/DEL are handled first (→ space)
85
+ // because a single-line label spaces line breaks rather than gluing them.
86
+ function stripUnsafeLabelChars(value) {
75
87
  let out = "";
76
88
  for (const ch of value) {
77
89
  const cp = ch.codePointAt(0) ?? 0;
78
- out += cp <= 0x1f || cp === 0x7f ? " " : ch;
90
+ if (cp <= 0x1f || cp === 0x7f) {
91
+ out += " ";
92
+ continue;
93
+ }
94
+ if (isUnsafeFormatCodePoint(cp)) {
95
+ continue;
96
+ }
97
+ out += ch;
79
98
  }
80
99
  return out;
81
100
  }
@@ -86,12 +105,15 @@ const sanitiseLabel = (label) => {
86
105
  let cleaned = label.replace(/[a-z][a-z0-9+.-]*:\/\/\S+/giu, " ");
87
106
  for (const shape of CREDENTIAL_LABEL_SHAPES)
88
107
  cleaned = cleaned.replace(shape, " ");
89
- // Replace every control character (newline, CR, tab, NUL, DEL, …) with a space so a multi-line or
90
- // control-laden label can never carry a second line of content into the browser-streamed envelope
91
- // displayLabel. Without this, the absolute-path basename-collapse below (which splits on "/" only)
92
- // would keep a trailing "\n<more content>" glued inside the final path segment — defeating the
93
- // basename defence and emitting a multi-line label (#277/#278 envelope display-surface invariant).
94
- cleaned = collapseControlCharsToSpace(cleaned);
108
+ // Map control characters (newline, CR, tab, NUL, DEL, …) to spaces and DROP bidi-override,
109
+ // zero-width, BOM, and C1 spoofing code points so a multi-line, control-laden, or
110
+ // visually-reordered label can never carry a second line of content into — or spoof the reading
111
+ // order of the browser-streamed envelope displayLabel. Without the control→space step the
112
+ // absolute-path basename-collapse below (which splits on "/" only) would keep a trailing
113
+ // "\n<more content>" glued inside the final path segment, defeating the basename defence; without
114
+ // the bidi/zero-width drop a crafted filename could reorder the displayed label (#277/#278
115
+ // envelope display-surface invariant; Epic #729 symmetry with the candidate-text scrubber).
116
+ cleaned = stripUnsafeLabelChars(cleaned);
95
117
  cleaned = cleaned.trim();
96
118
  // Collapse an absolute POSIX / Windows-drive / UNC path label to its final segment so the
97
119
  // display label never leaks the filesystem layout (the basename is the useful display token).
@@ -134,8 +156,16 @@ function assertRealPathNotDenied(absPath, label, noun) {
134
156
  throw new QiIngestionError("QI_SOURCE_DENIED", `${noun} "${label}" is in a protected location.`);
135
157
  }
136
158
  }
137
- const envelopeIdFor = (index, label, content) => {
138
- const digest = sha256Hex(`qi-src-v1|${String(index)}|${label}|${content}`).slice(0, 24);
159
+ // Escape the field delimiter ("|") and the escape character ("\") in each user/path-controlled
160
+ // field so a label or content value can never inject a raw delimiter and forge another source's
161
+ // envelope id. The strictly-increasing loop index already disambiguates sources today; escaping
162
+ // makes the pre-image injective on its own — robust even if the fields were ever reordered —
163
+ // closing the latent cross-source provenance-spoofing surface flagged by the #732 composition
164
+ // security audit. A value with no "\" or "|" encodes to itself, so clean labels/paths keep their
165
+ // existing envelope id (and the atom ids derived from it), preserving re-check stability.
166
+ const escapeEnvelopeField = (value) => value.split("\\").join("\\\\").split("|").join("\\|");
167
+ export const envelopeIdFor = (index, label, content) => {
168
+ const digest = sha256Hex(`qi-src-v1|${String(index)}|${escapeEnvelopeField(label)}|${escapeEnvelopeField(content)}`).slice(0, 24);
139
169
  return QualityIntelligence.asQualityIntelligenceSourceEnvelopeId(`qi-src-${digest}`);
140
170
  };
141
171
  const REQUIREMENTS_ENVELOPE_PREFIX = "qi-src-req-";
@@ -144,6 +174,7 @@ const requirementsEnvelopeIdFor = (index) => {
144
174
  return QualityIntelligence.asQualityIntelligenceSourceEnvelopeId(`${REQUIREMENTS_ENVELOPE_PREFIX}${digest}`);
145
175
  };
146
176
  const stableLocalRef = (prefix, value) => `${prefix}:${sha256Hex(value).slice(0, 24)}`;
177
+ const replacementGroupIdFor = (envelopeId, stableKey) => sha256Hex(`qi-replace-v1|${String(envelopeId)}|${stableKey}`);
147
178
  const auditSummaryIdFor = (runId) => QualityIntelligence.asQualityIntelligenceAuditSummaryId(`qi-audit-${sha256Hex(runId).slice(0, 24)}`);
148
179
  function ingestRequirements(source, index, registeredAt) {
149
180
  const text = typeof source.text === "string" ? source.text : "";
@@ -168,7 +199,14 @@ function ingestRequirements(source, index, registeredAt) {
168
199
  },
169
200
  localRef: `req:${String(index)}`,
170
201
  };
171
- return { envelope, atoms };
202
+ return {
203
+ envelope,
204
+ atoms: atoms.map((entry, ordinal) => Object.freeze({
205
+ ...entry,
206
+ replacementGroupId: replacementGroupIdFor(envelopeId, `requirements:${String(index)}`),
207
+ replacementOrdinal: ordinal,
208
+ })),
209
+ };
172
210
  }
173
211
  const WORKSPACE_BUDGET_BYTES = 196_608;
174
212
  const WORKSPACE_MAX_BYTES_PER_FILE = 16_384;
@@ -213,7 +251,7 @@ function documentRequirementAtoms(entry, envelopeId) {
213
251
  });
214
252
  if (split.length <= 1)
215
253
  return Object.freeze([]);
216
- return Object.freeze(split.map((requirement) => {
254
+ return Object.freeze(split.map((requirement, ordinal) => {
217
255
  const canonicalText = `${entry.path}\n${requirement.canonicalText}`;
218
256
  const atom = {
219
257
  kind: "requirement",
@@ -223,7 +261,12 @@ function documentRequirementAtoms(entry, envelopeId) {
223
261
  redactionStatus: "redacted",
224
262
  lifecycleStatus: "draft",
225
263
  };
226
- return Object.freeze({ atom: Object.freeze(atom), canonicalText });
264
+ return Object.freeze({
265
+ atom: Object.freeze(atom),
266
+ canonicalText,
267
+ replacementGroupId: replacementGroupIdFor(envelopeId, `document:${entry.path}`),
268
+ replacementOrdinal: ordinal,
269
+ });
227
270
  }));
228
271
  }
229
272
  function atomsForWorkspaceEntry(entry, envelopeId) {
@@ -445,7 +488,7 @@ function processCapsuleDocs(docs, byteBudget) {
445
488
  const processed = [];
446
489
  let totalBytes = 0;
447
490
  for (const doc of docs) {
448
- const capped = truncateToUtf8Bytes(redact(doc.text), perDocBudget);
491
+ const capped = truncateToUtf8Bytes(redact(stripUnsafeFormatChars(doc.text)), perDocBudget);
449
492
  if (capped.trim().length === 0)
450
493
  continue;
451
494
  const bytes = utf8ByteLength(capped);
@@ -462,8 +505,9 @@ function processCapsuleDocs(docs, byteBudget) {
462
505
  // Build one evidence atom per capsule document. Reuses the workspace atom shape so the model sees
463
506
  // structured text (documentId prefix + body), consistent with folder/file sources. The text is
464
507
  // already redacted + capped by processCapsuleDocs, so redactionStatus:"redacted" is truthful.
465
- function capsuleDocAtom(docId, text, envelopeId) {
508
+ function capsuleDocAtom(docId, text, envelopeId, fingerprintText = text) {
466
509
  const canonicalText = `${docId}\n${text}`;
510
+ const fingerprintCanonicalText = `${docId}\n${fingerprintText}`;
467
511
  // Derive the atom id from the stable document id only — never its position in the corpus order
468
512
  // (Epic #735 drift correctness, mirrors workspaceAtom). A capsule document id (and a Figma
469
513
  // screen id) is unique within its envelope, so adding/removing a sibling document never shifts an
@@ -474,7 +518,7 @@ function capsuleDocAtom(docId, text, envelopeId) {
474
518
  kind: "document-excerpt",
475
519
  id: QualityIntelligence.asQualityIntelligenceEvidenceAtomId(`qi-atom-${digest}`),
476
520
  sourceEnvelopeId: envelopeId,
477
- canonicalHashSha256Hex: sha256Hex(canonicalText),
521
+ canonicalHashSha256Hex: sha256Hex(fingerprintCanonicalText),
478
522
  redactionStatus: "redacted",
479
523
  lifecycleStatus: "draft",
480
524
  };
@@ -533,25 +577,67 @@ function ingestCapsuleSet(source, index, registeredAt, resolver, byteBudget) {
533
577
  emptyError: `Capsule set "${label}" has no indexed content or could not be opened.`,
534
578
  }, byteBudget);
535
579
  }
536
- // ─── Figma snapshot source (Epic #750, Issue #754) ───────────────────────────────
537
- //
538
- // A stored Figma Snapshot is ingested into one atom PER SCREEN: the deterministic, model-free
539
- // structural baseline derived from the screen's Screen-IR (#752), optionally enriched by additive
540
- // vision hints (capability-routed via #810; degrades to IR-only). Each atom carries screen
541
- // provenance so a generated test is attributable to its origin screen. The canonical text is
542
- // redacted before the atom is built (defense in depth the snapshot is already redacted at persist)
543
- // and budget-capped exactly like the capsule path so a large board degrades gracefully.
544
- /** Vision-augment one screen's baseline text without ever overriding it (additive only). */
545
- function visionAugmentedScreenText(baseline, screen, vision) {
546
- const baselineText = QualityIntelligenceFigma.renderBaselineText(baseline);
547
- if (vision === undefined)
548
- return baselineText;
549
- const hints = vision({
580
+ function isPromiseLike(value) {
581
+ return typeof value.then === "function";
582
+ }
583
+ function collectIrStats(node, stats) {
584
+ const next = {
585
+ imageFillCount: stats.imageFillCount + node.imageFills.length,
586
+ textNodeCount: stats.textNodeCount + (node.text !== undefined && node.text.trim().length > 0 ? 1 : 0),
587
+ semanticNodeCount: stats.semanticNodeCount +
588
+ (node.interactionHint === "button" ||
589
+ node.interactionHint === "input" ||
590
+ node.interactionHint === "link"
591
+ ? 1
592
+ : 0),
593
+ };
594
+ return node.children.reduce((acc, child) => collectIrStats(child, acc), next);
595
+ }
596
+ function screenNeedsVisionAugmentation(ir, baseline) {
597
+ const stats = collectIrStats(ir.root, {
598
+ imageFillCount: 0,
599
+ textNodeCount: 0,
600
+ semanticNodeCount: 0,
601
+ });
602
+ const structuralItems = baseline.items.filter((item) => item.category !== "screen-render").length;
603
+ return (stats.imageFillCount > 0 ||
604
+ stats.textNodeCount === 0 ||
605
+ stats.semanticNodeCount === 0 ||
606
+ structuralItems === 0);
607
+ }
608
+ function figmaVisionRequest(record, screen, baselineText) {
609
+ return {
610
+ snapshotRunId: record.runId,
550
611
  screenId: screen.screenId,
612
+ image: screen.image,
551
613
  imageRelativePath: screen.image.relativePath,
552
614
  baselineText,
553
- });
554
- return QualityIntelligenceFigma.mergeVisionHints(baselineText, hints).text;
615
+ };
616
+ }
617
+ function mergeFigmaVisionHints(baselineText, hints) {
618
+ return {
619
+ text: QualityIntelligenceFigma.mergeVisionHints(baselineText, hints).text,
620
+ fingerprintText: baselineText,
621
+ };
622
+ }
623
+ /** Vision-augment one screen's baseline text without ever overriding it (additive only). */
624
+ function visionAugmentedScreenText(baseline, ir, record, screen, vision) {
625
+ const baselineText = QualityIntelligenceFigma.renderBaselineText(baseline);
626
+ if (vision === undefined || !screenNeedsVisionAugmentation(ir, baseline)) {
627
+ return { text: baselineText, fingerprintText: baselineText };
628
+ }
629
+ const hints = vision(figmaVisionRequest(record, screen, baselineText));
630
+ return isPromiseLike(hints)
631
+ ? { text: baselineText, fingerprintText: baselineText }
632
+ : mergeFigmaVisionHints(baselineText, hints);
633
+ }
634
+ async function visionAugmentedScreenTextAsync(baseline, ir, record, screen, vision) {
635
+ const baselineText = QualityIntelligenceFigma.renderBaselineText(baseline);
636
+ if (vision === undefined || !screenNeedsVisionAugmentation(ir, baseline)) {
637
+ return { text: baselineText, fingerprintText: baselineText };
638
+ }
639
+ const hints = await vision(figmaVisionRequest(record, screen, baselineText));
640
+ return mergeFigmaVisionHints(baselineText, hints);
555
641
  }
556
642
  // Parse every screen's opaque irJson once; an unparseable screen is dropped (never crashes the run).
557
643
  function parseScreens(record) {
@@ -583,6 +669,49 @@ function navItemsByScreen(parsed, links) {
583
669
  function a11yItemsByScreen(parsed) {
584
670
  return QualityIntelligenceFigma.deriveA11yTestItemsByScreen(parsed.map((p) => p.ir));
585
671
  }
672
+ function figmaDocumentId(screenId, screenName) {
673
+ // Correct order (the #734 strip-before-redact rule): strip format chars first to
674
+ // de-obfuscate any zero-width-split secret, then redact (now catches raw AND ZW-split
675
+ // secrets → emits "[REDACTED]"), then sanitiseLabel for display safety (collapses
676
+ // newlines, URLs, paths). Mirrors redactFigmaAtomText = redact(stripUnsafeFormatChars)
677
+ // below, with sanitiseLabel as the final display-safe step.
678
+ const safeName = sanitiseLabel(redact(stripUnsafeFormatChars(screenName)));
679
+ return `${screenId} (${truncateToUtf8Bytes(safeName, MAX_LABEL_CHARS)})`;
680
+ }
681
+ // Strip Unicode bidi-override / zero-width / C1 spoofing code points from the untrusted Figma-derived
682
+ // atom text BEFORE secret redaction. Two reasons for this order (the #734 strip-before-redact rule):
683
+ // stripping first DE-OBFUSCATES a zero-width-split secret so the redactor can still match it, and it
684
+ // removes the bidi/zero-width chars that would otherwise ride a Figma screen name or prototype trigger
685
+ // verbatim into the QI atom text and every downstream export (bidi-spoofing of generated test titles).
686
+ // Symmetric with the candidate-text path (buildRequirementExcerpt) and the source-label path
687
+ // (sanitiseLabel / stripUnsafeLabelChars). TAB/LF/CR are preserved so the multi-line baseline structure
688
+ // stays intact; clean inputs are byte-identical, so the atom hash and budget accounting are unchanged.
689
+ const redactFigmaAtomText = (text) => redact(stripUnsafeFormatChars(text));
690
+ function consumeVisionProviderForScreen(vision, remainingVisionScreens, ir, baseline) {
691
+ if (vision === undefined ||
692
+ remainingVisionScreens <= 0 ||
693
+ !screenNeedsVisionAugmentation(ir, baseline)) {
694
+ return { provider: undefined, remaining: remainingVisionScreens };
695
+ }
696
+ return { provider: vision, remaining: remainingVisionScreens - 1 };
697
+ }
698
+ function corpusDocFromFigmaScreen(row, ir, augmented, perDocBudget) {
699
+ const capped = truncateToUtf8Bytes(redactFigmaAtomText(augmented.text), perDocBudget);
700
+ if (capped.trim().length === 0)
701
+ return undefined;
702
+ const fingerprintText = truncateToUtf8Bytes(redactFigmaAtomText(augmented.fingerprintText), perDocBudget);
703
+ return {
704
+ doc: {
705
+ documentId: figmaDocumentId(row.screenId, ir.name),
706
+ text: capped,
707
+ fingerprintText,
708
+ },
709
+ bytes: utf8ByteLength(capped),
710
+ };
711
+ }
712
+ function figmaDocFitsBudget(docs, totalBytes, nextBytes, perRunBudget) {
713
+ return docs.length === 0 || totalBytes + nextBytes <= perRunBudget;
714
+ }
586
715
  // Derive the redacted, budget-capped canonical text for every parseable screen. Each screen's
587
716
  // deterministic structural baseline (#754) is augmented additively with its navigation/flow test
588
717
  // items (#811) AND its accessibility test items (#812) — concatenated, neither replacing the other —
@@ -601,18 +730,45 @@ function figmaScreenDocs(record, vision, byteBudget) {
601
730
  const a11yItems = a11yItemsByScreen(parsed);
602
731
  const docs = [];
603
732
  let totalBytes = 0;
733
+ let remainingVisionScreens = MAX_FIGMA_VISION_AUGMENTED_SCREENS;
604
734
  for (const { row, ir } of parsed) {
605
735
  const extraItems = [...(navItems.get(ir.id) ?? []), ...(a11yItems.get(ir.id) ?? [])];
606
736
  const baseline = QualityIntelligenceFigma.deriveScreenTestBaseline(ir, extraItems);
607
- const augmented = visionAugmentedScreenText(baseline, row, vision);
608
- const capped = truncateToUtf8Bytes(redact(augmented), perDocBudget);
609
- if (capped.trim().length === 0)
737
+ const visionSlot = consumeVisionProviderForScreen(vision, remainingVisionScreens, ir, baseline);
738
+ remainingVisionScreens = visionSlot.remaining;
739
+ const augmented = visionAugmentedScreenText(baseline, ir, record, row, visionSlot.provider);
740
+ const nextDoc = corpusDocFromFigmaScreen(row, ir, augmented, perDocBudget);
741
+ if (nextDoc === undefined)
610
742
  continue;
611
- const bytes = utf8ByteLength(capped);
612
- if (docs.length > 0 && totalBytes + bytes > perRunBudget)
743
+ if (!figmaDocFitsBudget(docs, totalBytes, nextDoc.bytes, perRunBudget))
613
744
  break;
614
- docs.push({ documentId: `${row.screenId} (${ir.name})`, text: capped });
615
- totalBytes += bytes;
745
+ docs.push(nextDoc.doc);
746
+ totalBytes += nextDoc.bytes;
747
+ }
748
+ return docs;
749
+ }
750
+ async function figmaScreenDocsAsync(record, vision, byteBudget) {
751
+ const perRunBudget = Math.min(CAPSULE_BUDGET_BYTES, byteBudget);
752
+ const perDocBudget = Math.min(CAPSULE_MAX_BYTES_PER_DOCUMENT, perRunBudget);
753
+ const parsed = parseScreens(record);
754
+ const navItems = navItemsByScreen(parsed, record.links ?? []);
755
+ const a11yItems = a11yItemsByScreen(parsed);
756
+ const docs = [];
757
+ let totalBytes = 0;
758
+ let remainingVisionScreens = MAX_FIGMA_VISION_AUGMENTED_SCREENS;
759
+ for (const { row, ir } of parsed) {
760
+ const extraItems = [...(navItems.get(ir.id) ?? []), ...(a11yItems.get(ir.id) ?? [])];
761
+ const baseline = QualityIntelligenceFigma.deriveScreenTestBaseline(ir, extraItems);
762
+ const visionSlot = consumeVisionProviderForScreen(vision, remainingVisionScreens, ir, baseline);
763
+ remainingVisionScreens = visionSlot.remaining;
764
+ const augmented = await visionAugmentedScreenTextAsync(baseline, ir, record, row, visionSlot.provider);
765
+ const nextDoc = corpusDocFromFigmaScreen(row, ir, augmented, perDocBudget);
766
+ if (nextDoc === undefined)
767
+ continue;
768
+ if (!figmaDocFitsBudget(docs, totalBytes, nextDoc.bytes, perRunBudget))
769
+ break;
770
+ docs.push(nextDoc.doc);
771
+ totalBytes += nextDoc.bytes;
616
772
  }
617
773
  return docs;
618
774
  }
@@ -629,7 +785,7 @@ function ingestFigmaSnapshot(source, index, registeredAt, loader, vision, byteBu
629
785
  if (docs.length === 0) {
630
786
  throw new QiIngestionError("QI_SOURCE_EMPTY", `Figma snapshot "${label}" produced no usable screen baseline.`);
631
787
  }
632
- const joinedText = docs.map((d) => d.text).join("\n");
788
+ const joinedFingerprintText = docs.map((d) => d.fingerprintText ?? d.text).join("\n");
633
789
  const envelopeId = envelopeIdFor(index, label, source.snapshotRunId);
634
790
  // A stored Figma Snapshot is figma evidence, not repository context. Use the dedicated
635
791
  // `figma-evidence` envelope kind (#278 AC2 "represented as an explicit connector-backed source"
@@ -642,11 +798,40 @@ function ingestFigmaSnapshot(source, index, registeredAt, loader, vision, byteBu
642
798
  provenance: {
643
799
  origin: `figma-snapshot:${source.snapshotRunId}`,
644
800
  registeredAt,
645
- integrityHashSha256Hex: sha256Hex(joinedText),
801
+ integrityHashSha256Hex: sha256Hex(joinedFingerprintText),
646
802
  },
647
803
  localRef: stableLocalRef("figma-snapshot", source.snapshotRunId),
648
804
  };
649
- const atoms = docs.map((d) => capsuleDocAtom(d.documentId, d.text, envelopeId));
805
+ const atoms = docs.map((d) => capsuleDocAtom(d.documentId, d.text, envelopeId, d.fingerprintText ?? d.text));
806
+ return { envelope, atoms };
807
+ }
808
+ async function ingestFigmaSnapshotAsync(source, index, registeredAt, loader, vision, byteBudget) {
809
+ const label = sanitiseLabel(source.label);
810
+ const record = loader(source.snapshotRunId);
811
+ if (record === undefined) {
812
+ throw new QiIngestionError("QI_FIGMA_SNAPSHOT_UNAVAILABLE", `Figma snapshot "${label}" could not be found or read. Build the snapshot first.`);
813
+ }
814
+ if (record.screens.length === 0) {
815
+ throw new QiIngestionError("QI_SOURCE_EMPTY", `Figma snapshot "${label}" has no screens.`);
816
+ }
817
+ const docs = await figmaScreenDocsAsync(record, vision, byteBudget);
818
+ if (docs.length === 0) {
819
+ throw new QiIngestionError("QI_SOURCE_EMPTY", `Figma snapshot "${label}" produced no usable screen baseline.`);
820
+ }
821
+ const joinedFingerprintText = docs.map((d) => d.fingerprintText ?? d.text).join("\n");
822
+ const envelopeId = envelopeIdFor(index, label, source.snapshotRunId);
823
+ const envelope = {
824
+ id: envelopeId,
825
+ kind: "figma-evidence",
826
+ displayLabel: label,
827
+ provenance: {
828
+ origin: `figma-snapshot:${source.snapshotRunId}`,
829
+ registeredAt,
830
+ integrityHashSha256Hex: sha256Hex(joinedFingerprintText),
831
+ },
832
+ localRef: stableLocalRef("figma-snapshot", source.snapshotRunId),
833
+ };
834
+ const atoms = docs.map((d) => capsuleDocAtom(d.documentId, d.text, envelopeId, d.fingerprintText ?? d.text));
650
835
  return { envelope, atoms };
651
836
  }
652
837
  function ingestOne(source, index, registeredAt, capsuleResolver, figmaSnapshotLoader, figmaVision, byteBudget) {
@@ -674,6 +859,15 @@ function ingestOne(source, index, registeredAt, capsuleResolver, figmaSnapshotLo
674
859
  return ingestFigmaSnapshot(source, index, registeredAt, figmaSnapshotLoader, figmaVision, byteBudget);
675
860
  }
676
861
  }
862
+ async function ingestOneAsync(source, index, registeredAt, capsuleResolver, figmaSnapshotLoader, figmaVision, byteBudget) {
863
+ if (source.kind !== "figma-snapshot") {
864
+ return ingestOne(source, index, registeredAt, capsuleResolver, figmaSnapshotLoader, figmaVision, byteBudget);
865
+ }
866
+ if (figmaSnapshotLoader === undefined) {
867
+ throw new QiIngestionError("QI_FIGMA_SNAPSHOT_UNAVAILABLE", "Figma-snapshot sources are unavailable: the evidence directory is not configured.");
868
+ }
869
+ return ingestFigmaSnapshotAsync(source, index, registeredAt, figmaSnapshotLoader, figmaVision, byteBudget);
870
+ }
677
871
  /**
678
872
  * Ingest one source into the accumulator (Epic #729 N+1 resilience). On a per-source QiIngestionError
679
873
  * the source is recorded as skipped and ingestion continues with the rest; a genuine (non-coded) bug
@@ -708,6 +902,56 @@ function ingestSourceInto(acc, source, index, input, budgets) {
708
902
  atomCount: taken.length,
709
903
  });
710
904
  }
905
+ async function ingestSourceIntoAsync(acc, source, index, input, budgets) {
906
+ let ingested;
907
+ try {
908
+ ingested = await ingestOneAsync(source, index, input.registeredAt, input.capsuleResolver, input.figmaSnapshotLoader, input.figmaVision, budgets.byteBudget);
909
+ }
910
+ catch (error) {
911
+ if (!(error instanceof QiIngestionError))
912
+ throw error;
913
+ acc.firstSkipError ??= error;
914
+ acc.skippedSources.push({
915
+ label: sanitiseLabel(source.label),
916
+ kind: source.kind,
917
+ code: error.code,
918
+ message: error.message,
919
+ });
920
+ return;
921
+ }
922
+ const { envelope, atoms } = ingested;
923
+ const take = Math.min(budgets.atomBudget, MAX_TOTAL_ATOMS - acc.ingestedAtoms.length);
924
+ const taken = take <= 0 ? [] : atoms.slice(0, take);
925
+ acc.envelopes.push(envelope);
926
+ acc.ingestedAtoms.push(...taken);
927
+ acc.sourceSummaries.push({
928
+ label: envelope.displayLabel,
929
+ kind: source.kind,
930
+ atomCount: taken.length,
931
+ });
932
+ }
933
+ function emptyDriftIngestionResult(input, droppedSourceCount, skippedSources) {
934
+ return {
935
+ envelopes: [],
936
+ ingestedAtoms: [],
937
+ provenanceRefs: {
938
+ envelopeIds: [],
939
+ auditSummaryId: auditSummaryIdFor(input.runId),
940
+ },
941
+ sourceSummaries: [],
942
+ droppedSourceCount,
943
+ skippedSources,
944
+ };
945
+ }
946
+ function allowEmptyDriftIngestion(input, acc, droppedSourceCount) {
947
+ if (input.allowEmpty !== true)
948
+ return undefined;
949
+ const blockingSkip = acc.skippedSources.find((source) => source.code !== "QI_SOURCE_EMPTY");
950
+ if (blockingSkip !== undefined) {
951
+ throw new QiIngestionError(blockingSkip.code, blockingSkip.message);
952
+ }
953
+ return emptyDriftIngestionResult(input, droppedSourceCount, acc.skippedSources);
954
+ }
711
955
  export function ingestInlineSources(input) {
712
956
  // Read through the typed property in the loop: `Array.isArray` would widen a local binding of the
713
957
  // readonly union array to `any[]`, so the guard checks length on the typed property directly.
@@ -742,6 +986,51 @@ export function ingestInlineSources(input) {
742
986
  ingestSourceInto(acc, source, i, input, budgets);
743
987
  }
744
988
  if (acc.ingestedAtoms.length === 0) {
989
+ const emptyDrift = allowEmptyDriftIngestion(input, acc, droppedSourceCount);
990
+ if (emptyDrift !== undefined)
991
+ return emptyDrift;
992
+ throw (acc.firstSkipError ??
993
+ new QiIngestionError("QI_SOURCE_EMPTY", "No usable evidence was produced from the sources."));
994
+ }
995
+ return {
996
+ envelopes: acc.envelopes,
997
+ ingestedAtoms: acc.ingestedAtoms,
998
+ provenanceRefs: {
999
+ envelopeIds: acc.envelopes.map((e) => String(e.id)),
1000
+ auditSummaryId: auditSummaryIdFor(input.runId),
1001
+ },
1002
+ sourceSummaries: acc.sourceSummaries,
1003
+ droppedSourceCount,
1004
+ skippedSources: acc.skippedSources,
1005
+ };
1006
+ }
1007
+ export async function ingestInlineSourcesAsync(input) {
1008
+ const allSources = input.request.sources;
1009
+ if (allSources.length === 0) {
1010
+ throw new QiIngestionError("QI_NO_SOURCES", "At least one source is required to start a run.");
1011
+ }
1012
+ const sources = allSources.slice(0, MAX_QI_SOURCES);
1013
+ const droppedSourceCount = allSources.length - sources.length;
1014
+ const budgets = {
1015
+ atomBudget: perSourceAtomBudget(MAX_TOTAL_ATOMS, sources.length),
1016
+ byteBudget: perSourceByteBudget(sources.length),
1017
+ };
1018
+ const acc = {
1019
+ envelopes: [],
1020
+ ingestedAtoms: [],
1021
+ sourceSummaries: [],
1022
+ skippedSources: [],
1023
+ };
1024
+ for (let i = 0; i < sources.length; i += 1) {
1025
+ const source = sources[i];
1026
+ if (source === undefined)
1027
+ continue;
1028
+ await ingestSourceIntoAsync(acc, source, i, input, budgets);
1029
+ }
1030
+ if (acc.ingestedAtoms.length === 0) {
1031
+ const emptyDrift = allowEmptyDriftIngestion(input, acc, droppedSourceCount);
1032
+ if (emptyDrift !== undefined)
1033
+ return emptyDrift;
745
1034
  throw (acc.firstSkipError ??
746
1035
  new QiIngestionError("QI_SOURCE_EMPTY", "No usable evidence was produced from the sources."));
747
1036
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runRoutes.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/runRoutes.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAKV,mCAAmC,EAEpC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,mBAAmB,IAAI,EAAE,EAAE,MAAM,+BAA+B,CAAC;AAE/E,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA8N1D,wBAAgB,aAAa,CAC3B,KAAK,EAAE,EAAE,CAAC,2BAA2B,EACrC,MAAM,EAAE,QAAQ,GACf,mCAAmC,CAgBrC;AAoED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,cAAc,CAAC,CAmBzB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,GAAG,WAAW,CAStF;AAED,eAAO,MAAM,4BAA4B,EAAE,SAAS,eAAe,EAOlE,CAAC"}
1
+ {"version":3,"file":"runRoutes.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/runRoutes.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAKV,mCAAmC,EAGpC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,mBAAmB,IAAI,EAAE,EAAE,MAAM,+BAA+B,CAAC;AAG/E,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA+N1D,wBAAgB,aAAa,CAC3B,KAAK,EAAE,EAAE,CAAC,2BAA2B,EACrC,MAAM,EAAE,QAAQ,GACf,mCAAmC,CAgBrC;AA8ED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,cAAc,CAAC,CAoBzB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,GAAG,WAAW,CAStF;AAED,eAAO,MAAM,4BAA4B,EAAE,SAAS,eAAe,EAOlE,CAAC"}
@@ -10,6 +10,7 @@
10
10
  import { randomUUID } from "node:crypto";
11
11
  import { isAbsolute } from "node:path";
12
12
  import { SSE_HEADERS } from "../sse.js";
13
+ import { writeOrDestroy } from "../sse-write.js";
13
14
  import { STREAMING, } from "../routes.js";
14
15
  import { executeQiRun, QiGenerationError, QiIngestionError } from "./runExecution.js";
15
16
  import { qiRunRegistry } from "./runRegistry.js";
@@ -212,6 +213,13 @@ function classifyStartError(error) {
212
213
  }
213
214
  return { code: "QI_RUN_FAILED", message: "The Quality Intelligence run failed to complete." };
214
215
  }
216
+ // Project the internal QiSkippedSource[] (which also carries a free-text `message`) to exactly the
217
+ // wire contract QualityIntelligenceSkippedSource[] ({label, kind, code}). Streaming `message`
218
+ // verbatim would widen the browser-facing SSE surface — the `accepted` frame bypasses deps.redactor,
219
+ // unlike `event` — so it is dropped here (Issue #730).
220
+ function toWireSkippedSources(skipped) {
221
+ return skipped.map((s) => ({ label: s.label, kind: s.kind, code: s.code }));
222
+ }
215
223
  async function streamRunExecution(deps, request, runId, registeredAt, signal, write) {
216
224
  const totals = { candidates: 0, findings: 0, exports: 0 };
217
225
  let terminal = "failed";
@@ -233,7 +241,7 @@ async function streamRunExecution(deps, request, runId, registeredAt, signal, wr
233
241
  ? { droppedSourceCount: accepted.droppedSourceCount }
234
242
  : {}),
235
243
  ...(accepted.skippedSources.length > 0
236
- ? { skippedSources: accepted.skippedSources }
244
+ ? { skippedSources: toWireSkippedSources(accepted.skippedSources) }
237
245
  : {}),
238
246
  });
239
247
  },
@@ -263,14 +271,16 @@ export async function handleStartQiRun(ctx, deps) {
263
271
  return parsed.result;
264
272
  const runId = `qi-run-${randomUUID()}`;
265
273
  const registeredAt = new Date().toISOString();
266
- ctx.res.writeHead(200, { ...SSE_HEADERS, "X-Accel-Buffering": "no" });
267
- const write = (message) => {
268
- ctx.res.write(`data: ${JSON.stringify(message)}\n\n`);
269
- };
274
+ // Register and wire the disconnect listener BEFORE writeHead to close the narrow race where a
275
+ // client disconnects after parsing succeeds but before the response is committed.
270
276
  const controller = qiRunRegistry.register(runId, registeredAt);
271
277
  ctx.res.on("close", () => {
272
278
  controller.abort();
273
279
  });
280
+ ctx.res.writeHead(200, { ...SSE_HEADERS, "X-Accel-Buffering": "no" });
281
+ const write = (message) => {
282
+ writeOrDestroy(ctx.res, `data: ${JSON.stringify(message)}\n\n`, controller);
283
+ };
274
284
  await streamRunExecution(deps, parsed.request, runId, registeredAt, controller.signal, write);
275
285
  ctx.res.end();
276
286
  return STREAMING;
@@ -1 +1 @@
1
- {"version":3,"file":"traceabilityRoutes.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/traceabilityRoutes.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA0FhD,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,WAAW,CAAC,CA0CtB;AAED,eAAO,MAAM,2BAA2B,EAAE,SAAS,eAAe,EAMjE,CAAC"}
1
+ {"version":3,"file":"traceabilityRoutes.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/traceabilityRoutes.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;AAyHhD,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,WAAW,CAAC,CA+CtB;AAED,eAAO,MAAM,2BAA2B,EAAE,SAAS,eAAe,EAMjE,CAAC"}