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

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 (499) hide show
  1. package/README.md +139 -1
  2. package/dist/ui/csp-hashes.json +33 -39
  3. package/dist/ui/static/404.html +1 -1
  4. package/dist/ui/static/__next.__PAGE__.txt +9 -0
  5. package/dist/ui/static/__next._full.txt +18 -0
  6. package/dist/ui/static/__next._head.txt +6 -0
  7. package/dist/ui/static/__next._index.txt +5 -0
  8. package/dist/ui/static/__next._tree.txt +2 -0
  9. package/dist/ui/static/_next/static/Hb6brrvZY2nZtizQlYhVt/_buildManifest.js +11 -0
  10. package/dist/ui/static/_next/static/Hb6brrvZY2nZtizQlYhVt/_clientMiddlewareManifest.js +1 -0
  11. package/dist/ui/static/_next/static/chunks/05-c3ty_6dwfk.js +1 -0
  12. package/dist/ui/static/_next/static/chunks/082obv3v03b-9.js +2 -0
  13. package/dist/ui/static/_next/static/chunks/0iq1i69206cyl.js +31 -0
  14. package/dist/ui/static/_next/static/chunks/0uifns067thv8.js +1 -0
  15. package/dist/ui/static/_next/static/chunks/0x31-j53ab1tt.js +1 -0
  16. package/dist/ui/static/_next/static/chunks/14mrh2-p_w84d.js +1 -0
  17. package/dist/ui/static/_next/static/chunks/1t04tfgin0v_g.js +106 -0
  18. package/dist/ui/static/_next/static/chunks/1v4hrxrm_6_rw.js +1 -0
  19. package/dist/ui/static/_next/static/chunks/27jktro2p5rq9.js +4 -0
  20. package/dist/ui/static/_next/static/chunks/2lypy3ewh0r04.js +1 -0
  21. package/dist/ui/static/_next/static/chunks/32573pyyglqxl.js +1 -0
  22. package/dist/ui/static/_next/static/chunks/3_t_pzet29qtn.js +1 -0
  23. package/dist/ui/static/_next/static/chunks/3jgg_oe0iok0l.js +1 -0
  24. package/dist/ui/static/_next/static/chunks/3o_oia3vsam60.js +1 -0
  25. package/dist/ui/static/_next/static/chunks/3peubv2924kx4.js +1 -0
  26. package/dist/ui/static/_next/static/chunks/3wr_35f2vg6sd.css +1 -0
  27. package/dist/ui/static/_next/static/chunks/turbopack-2lg1g6kbsfm0x.js +1 -0
  28. package/dist/ui/static/_not-found/__next._full.txt +16 -0
  29. package/dist/ui/static/_not-found/__next._head.txt +6 -0
  30. package/dist/ui/static/_not-found/__next._index.txt +5 -0
  31. package/dist/ui/static/_not-found/__next._not-found.__PAGE__.txt +5 -0
  32. package/dist/ui/static/_not-found/__next._not-found.txt +5 -0
  33. package/dist/ui/static/_not-found/__next._tree.txt +2 -0
  34. package/dist/ui/static/_not-found.html +1 -0
  35. package/dist/ui/static/_not-found.txt +16 -0
  36. package/dist/ui/static/index.html +1 -1
  37. package/dist/ui/static/index.txt +16 -18
  38. package/dist/ui/static/launch/__next._full.txt +20 -0
  39. package/dist/ui/static/launch/__next._head.txt +6 -0
  40. package/dist/ui/static/launch/__next._index.txt +5 -0
  41. package/dist/ui/static/launch/__next._tree.txt +2 -0
  42. package/dist/ui/static/launch/__next.launch.__PAGE__.txt +9 -0
  43. package/dist/ui/static/launch/__next.launch.txt +5 -0
  44. package/dist/ui/static/launch.html +1 -1
  45. package/dist/ui/static/launch.txt +17 -17
  46. package/dist/ui/static/local-knowledge/__next._full.txt +20 -0
  47. package/dist/ui/static/local-knowledge/__next._head.txt +6 -0
  48. package/dist/ui/static/local-knowledge/__next._index.txt +5 -0
  49. package/dist/ui/static/local-knowledge/__next._tree.txt +2 -0
  50. package/dist/ui/static/local-knowledge/__next.local-knowledge.__PAGE__.txt +9 -0
  51. package/dist/ui/static/local-knowledge/__next.local-knowledge.txt +5 -0
  52. package/dist/ui/static/local-knowledge/capsule/__next._full.txt +17 -0
  53. package/dist/ui/static/local-knowledge/capsule/__next._head.txt +6 -0
  54. package/dist/ui/static/local-knowledge/capsule/__next._index.txt +5 -0
  55. package/dist/ui/static/local-knowledge/capsule/__next._tree.txt +2 -0
  56. package/dist/ui/static/local-knowledge/capsule/__next.local-knowledge.capsule.__PAGE__.txt +6 -0
  57. package/dist/ui/static/local-knowledge/capsule/__next.local-knowledge.capsule.txt +5 -0
  58. package/dist/ui/static/local-knowledge/capsule/__next.local-knowledge.txt +5 -0
  59. package/dist/ui/static/local-knowledge/capsule.html +1 -1
  60. package/dist/ui/static/local-knowledge/capsule.txt +14 -14
  61. package/dist/ui/static/local-knowledge.html +1 -1
  62. package/dist/ui/static/local-knowledge.txt +19 -16
  63. package/dist/ui/static/memoriaviva/__next._full.txt +17 -0
  64. package/dist/ui/static/memoriaviva/__next._head.txt +6 -0
  65. package/dist/ui/static/memoriaviva/__next._index.txt +5 -0
  66. package/dist/ui/static/memoriaviva/__next._tree.txt +2 -0
  67. package/dist/ui/static/memoriaviva/__next.memoriaviva.__PAGE__.txt +6 -0
  68. package/dist/ui/static/memoriaviva/__next.memoriaviva.txt +5 -0
  69. package/dist/ui/static/memoriaviva/consolidation/__next._full.txt +17 -0
  70. package/dist/ui/static/memoriaviva/consolidation/__next._head.txt +6 -0
  71. package/dist/ui/static/memoriaviva/consolidation/__next._index.txt +5 -0
  72. package/dist/ui/static/memoriaviva/consolidation/__next._tree.txt +2 -0
  73. package/dist/ui/static/memoriaviva/consolidation/__next.memoriaviva.consolidation.__PAGE__.txt +6 -0
  74. package/dist/ui/static/memoriaviva/consolidation/__next.memoriaviva.consolidation.txt +5 -0
  75. package/dist/ui/static/memoriaviva/consolidation/__next.memoriaviva.txt +5 -0
  76. package/dist/ui/static/memoriaviva/consolidation.html +1 -1
  77. package/dist/ui/static/memoriaviva/consolidation.txt +15 -15
  78. package/dist/ui/static/memoriaviva/detail/__next._full.txt +17 -0
  79. package/dist/ui/static/memoriaviva/detail/__next._head.txt +6 -0
  80. package/dist/ui/static/memoriaviva/detail/__next._index.txt +5 -0
  81. package/dist/ui/static/memoriaviva/detail/__next._tree.txt +2 -0
  82. package/dist/ui/static/memoriaviva/detail/__next.memoriaviva.detail.__PAGE__.txt +6 -0
  83. package/dist/ui/static/memoriaviva/detail/__next.memoriaviva.detail.txt +5 -0
  84. package/dist/ui/static/memoriaviva/detail/__next.memoriaviva.txt +5 -0
  85. package/dist/ui/static/memoriaviva/detail.html +1 -1
  86. package/dist/ui/static/memoriaviva/detail.txt +14 -14
  87. package/dist/ui/static/memoriaviva/review-queue/__next._full.txt +17 -0
  88. package/dist/ui/static/memoriaviva/review-queue/__next._head.txt +6 -0
  89. package/dist/ui/static/memoriaviva/review-queue/__next._index.txt +5 -0
  90. package/dist/ui/static/memoriaviva/review-queue/__next._tree.txt +2 -0
  91. package/dist/ui/static/memoriaviva/review-queue/__next.memoriaviva.review-queue.__PAGE__.txt +6 -0
  92. package/dist/ui/static/memoriaviva/review-queue/__next.memoriaviva.review-queue.txt +5 -0
  93. package/dist/ui/static/memoriaviva/review-queue/__next.memoriaviva.txt +5 -0
  94. package/dist/ui/static/memoriaviva/review-queue.html +1 -1
  95. package/dist/ui/static/memoriaviva/review-queue.txt +15 -15
  96. package/dist/ui/static/memoriaviva.html +1 -1
  97. package/dist/ui/static/memoriaviva.txt +14 -14
  98. package/node_modules/@oscharko-dev/keiko-cli/dist/.tsbuildinfo +1 -1
  99. package/node_modules/@oscharko-dev/keiko-cli/dist/evaluate.d.ts.map +1 -1
  100. package/node_modules/@oscharko-dev/keiko-cli/dist/evaluate.js +61 -2
  101. package/node_modules/@oscharko-dev/keiko-cli/dist/evidence.d.ts.map +1 -1
  102. package/node_modules/@oscharko-dev/keiko-cli/dist/evidence.js +65 -21
  103. package/node_modules/@oscharko-dev/keiko-cli/dist/launcher-platforms.js +3 -3
  104. package/node_modules/@oscharko-dev/keiko-cli/dist/ui.d.ts.map +1 -1
  105. package/node_modules/@oscharko-dev/keiko-cli/dist/ui.js +36 -11
  106. package/node_modules/@oscharko-dev/keiko-cli/package.json +2 -2
  107. package/node_modules/@oscharko-dev/keiko-contracts/dist/.tsbuildinfo +1 -1
  108. package/node_modules/@oscharko-dev/keiko-contracts/dist/bff-wire.d.ts +20 -1
  109. package/node_modules/@oscharko-dev/keiko-contracts/dist/bff-wire.d.ts.map +1 -1
  110. package/node_modules/@oscharko-dev/keiko-contracts/dist/connected-context.d.ts +1 -1
  111. package/node_modules/@oscharko-dev/keiko-contracts/dist/connected-context.d.ts.map +1 -1
  112. package/node_modules/@oscharko-dev/keiko-contracts/dist/connected-context.js +256 -75
  113. package/node_modules/@oscharko-dev/keiko-contracts/dist/evidence.d.ts +11 -0
  114. package/node_modules/@oscharko-dev/keiko-contracts/dist/evidence.d.ts.map +1 -1
  115. package/node_modules/@oscharko-dev/keiko-contracts/dist/index.d.ts +6 -6
  116. package/node_modules/@oscharko-dev/keiko-contracts/dist/index.d.ts.map +1 -1
  117. package/node_modules/@oscharko-dev/keiko-contracts/dist/index.js +4 -4
  118. package/node_modules/@oscharko-dev/keiko-contracts/dist/local-knowledge-records.d.ts +11 -0
  119. package/node_modules/@oscharko-dev/keiko-contracts/dist/local-knowledge-records.d.ts.map +1 -1
  120. package/node_modules/@oscharko-dev/keiko-contracts/dist/local-knowledge-records.js +4 -0
  121. package/node_modules/@oscharko-dev/keiko-contracts/dist/local-knowledge-schema.d.ts +1 -1
  122. package/node_modules/@oscharko-dev/keiko-contracts/dist/local-knowledge-schema.d.ts.map +1 -1
  123. package/node_modules/@oscharko-dev/keiko-contracts/dist/local-knowledge-schema.js +109 -4
  124. package/node_modules/@oscharko-dev/keiko-contracts/dist/local-knowledge-validation.d.ts +2 -0
  125. package/node_modules/@oscharko-dev/keiko-contracts/dist/local-knowledge-validation.d.ts.map +1 -1
  126. package/node_modules/@oscharko-dev/keiko-contracts/dist/local-knowledge-validation.js +94 -7
  127. package/node_modules/@oscharko-dev/keiko-contracts/dist/local-knowledge.d.ts +5 -0
  128. package/node_modules/@oscharko-dev/keiko-contracts/dist/local-knowledge.d.ts.map +1 -1
  129. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/ids.d.ts.map +1 -1
  130. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/ids.js +3 -0
  131. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/sourceEnvelope.d.ts +14 -0
  132. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/sourceEnvelope.d.ts.map +1 -1
  133. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/sourceEnvelope.js +53 -5
  134. package/node_modules/@oscharko-dev/keiko-contracts/package.json +2 -2
  135. package/node_modules/@oscharko-dev/keiko-evaluations/dist/.tsbuildinfo +1 -1
  136. package/node_modules/@oscharko-dev/keiko-evaluations/dist/runner.d.ts.map +1 -1
  137. package/node_modules/@oscharko-dev/keiko-evaluations/dist/runner.js +11 -3
  138. package/node_modules/@oscharko-dev/keiko-evaluations/package.json +2 -2
  139. package/node_modules/@oscharko-dev/keiko-evidence/dist/.tsbuildinfo +1 -1
  140. package/node_modules/@oscharko-dev/keiko-evidence/dist/connected-context-evidence.d.ts +20 -1
  141. package/node_modules/@oscharko-dev/keiko-evidence/dist/connected-context-evidence.d.ts.map +1 -1
  142. package/node_modules/@oscharko-dev/keiko-evidence/dist/connected-context-evidence.js +34 -2
  143. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/candidatesArtifact.d.ts +1 -0
  144. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/candidatesArtifact.d.ts.map +1 -1
  145. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/candidatesArtifact.js +3 -1
  146. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/companionStore.d.ts +17 -0
  147. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/companionStore.d.ts.map +1 -1
  148. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/companionStore.js +19 -0
  149. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/figmaSnapshot/schema.d.ts +5 -1
  150. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/figmaSnapshot/schema.d.ts.map +1 -1
  151. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/figmaSnapshot/store.d.ts +32 -2
  152. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/figmaSnapshot/store.d.ts.map +1 -1
  153. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/figmaSnapshot/store.js +259 -40
  154. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/retention.d.ts +3 -0
  155. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/retention.d.ts.map +1 -1
  156. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/retention.js +48 -5
  157. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/store.d.ts.map +1 -1
  158. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/store.js +30 -13
  159. package/node_modules/@oscharko-dev/keiko-evidence/dist/types.d.ts +1 -1
  160. package/node_modules/@oscharko-dev/keiko-evidence/dist/types.d.ts.map +1 -1
  161. package/node_modules/@oscharko-dev/keiko-evidence/package.json +2 -2
  162. package/node_modules/@oscharko-dev/keiko-harness/dist/.tsbuildinfo +1 -1
  163. package/node_modules/@oscharko-dev/keiko-harness/package.json +2 -2
  164. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/.tsbuildinfo +1 -1
  165. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/capsule-lifecycle.d.ts.map +1 -1
  166. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/capsule-lifecycle.js +25 -1
  167. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/capsule-set-lifecycle.d.ts +1 -1
  168. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/capsule-set-lifecycle.d.ts.map +1 -1
  169. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/capsule-set-lifecycle.js +16 -0
  170. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/chunking/chunker-persist.d.ts +3 -1
  171. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/chunking/chunker-persist.d.ts.map +1 -1
  172. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/chunking/chunker-persist.js +9 -5
  173. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/chunking/chunker-runner.d.ts.map +1 -1
  174. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/chunking/chunker-runner.js +22 -7
  175. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/chunking/chunker.d.ts +4 -1
  176. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/chunking/chunker.d.ts.map +1 -1
  177. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/chunking/chunker.js +61 -9
  178. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/chunking/citation-mapper.d.ts.map +1 -1
  179. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/chunking/citation-mapper.js +64 -36
  180. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/chunking/index.d.ts +2 -2
  181. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/chunking/index.d.ts.map +1 -1
  182. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/chunking/index.js +2 -2
  183. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/chunking/types.d.ts +7 -1
  184. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/chunking/types.d.ts.map +1 -1
  185. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/chunking/types.js +5 -1
  186. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/composition.d.ts +1 -1
  187. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/composition.d.ts.map +1 -1
  188. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/composition.js +27 -4
  189. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/model-gateway-answer-generator.d.ts +5 -1
  190. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/model-gateway-answer-generator.d.ts.map +1 -1
  191. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/model-gateway-answer-generator.js +18 -5
  192. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/discovery-runner.d.ts.map +1 -1
  193. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/discovery-runner.js +10 -1
  194. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/extract.d.ts +4 -1
  195. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/extract.d.ts.map +1 -1
  196. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/extract.js +370 -45
  197. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/test-support.d.ts +2 -0
  198. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/test-support.d.ts.map +1 -1
  199. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/test-support.js +8 -4
  200. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/types.d.ts +1 -1
  201. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/types.d.ts.map +1 -1
  202. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/types.js +10 -5
  203. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/walk.d.ts.map +1 -1
  204. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/discovery/walk.js +65 -20
  205. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/fixtures.d.ts +1 -0
  206. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/fixtures.d.ts.map +1 -1
  207. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/fixtures.js +79 -0
  208. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/index.d.ts +1 -1
  209. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/index.d.ts.map +1 -1
  210. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/index.js +1 -1
  211. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/runner-seed.d.ts.map +1 -1
  212. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/evaluations/runner-seed.js +4 -0
  213. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/index.d.ts +6 -5
  214. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/index.d.ts.map +1 -1
  215. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/index.js +4 -4
  216. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/indexing/embedding-batcher.d.ts.map +1 -1
  217. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/indexing/embedding-batcher.js +71 -29
  218. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/indexing/orchestrator.d.ts.map +1 -1
  219. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/indexing/orchestrator.js +253 -131
  220. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/indexing/types.d.ts +12 -0
  221. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/indexing/types.d.ts.map +1 -1
  222. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/indexing/vector-persist.d.ts.map +1 -1
  223. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/indexing/vector-persist.js +9 -0
  224. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/_internal.d.ts +3 -1
  225. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/_internal.d.ts.map +1 -1
  226. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/_internal.js +13 -1
  227. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/docx-parser.d.ts.map +1 -1
  228. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/docx-parser.js +86 -46
  229. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/index.d.ts +1 -1
  230. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/index.d.ts.map +1 -1
  231. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/index.js +1 -1
  232. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/json-parser.d.ts.map +1 -1
  233. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/json-parser.js +50 -22
  234. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/pdf-parser.d.ts +21 -1
  235. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/pdf-parser.d.ts.map +1 -1
  236. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/pdf-parser.js +90 -13
  237. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/registry.d.ts.map +1 -1
  238. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/registry.js +3 -1
  239. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/types.d.ts +7 -2
  240. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/types.d.ts.map +1 -1
  241. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/parsers/types.js +7 -3
  242. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/privacy/audit-emitter.js +8 -0
  243. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/privacy/diagnostic-redactor.d.ts.map +1 -1
  244. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/privacy/diagnostic-redactor.js +17 -10
  245. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/privacy/retention-applier.d.ts.map +1 -1
  246. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/privacy/retention-applier.js +7 -0
  247. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/privacy/types.d.ts +4 -0
  248. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/privacy/types.d.ts.map +1 -1
  249. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/retrieval/retrieval-runner.js +1 -1
  250. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/retrieval/scoped-vector-search.d.ts +1 -0
  251. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/retrieval/scoped-vector-search.d.ts.map +1 -1
  252. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/retrieval/scoped-vector-search.js +318 -32
  253. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/source-lifecycle.d.ts +1 -1
  254. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/source-lifecycle.d.ts.map +1 -1
  255. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/source-lifecycle.js +46 -16
  256. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/store.d.ts +14 -0
  257. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/store.d.ts.map +1 -1
  258. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/store.js +26 -1
  259. package/node_modules/@oscharko-dev/keiko-local-knowledge/package.json +10 -5
  260. package/node_modules/@oscharko-dev/keiko-memory-capture/dist/.tsbuildinfo +1 -1
  261. package/node_modules/@oscharko-dev/keiko-memory-capture/package.json +2 -2
  262. package/node_modules/@oscharko-dev/keiko-memory-consolidation/dist/.tsbuildinfo +1 -1
  263. package/node_modules/@oscharko-dev/keiko-memory-consolidation/package.json +2 -2
  264. package/node_modules/@oscharko-dev/keiko-memory-governance/dist/.tsbuildinfo +1 -1
  265. package/node_modules/@oscharko-dev/keiko-memory-governance/package.json +2 -2
  266. package/node_modules/@oscharko-dev/keiko-memory-retrieval/dist/.tsbuildinfo +1 -1
  267. package/node_modules/@oscharko-dev/keiko-memory-retrieval/package.json +2 -2
  268. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/.tsbuildinfo +1 -1
  269. package/node_modules/@oscharko-dev/keiko-memory-vault/package.json +2 -2
  270. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/.tsbuildinfo +1 -1
  271. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/config.d.ts +2 -1
  272. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/config.d.ts.map +1 -1
  273. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/config.js +50 -0
  274. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/http.d.ts +3 -0
  275. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/http.d.ts.map +1 -1
  276. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/http.js +114 -44
  277. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/qualityIntelligence/dispatcher.d.ts +14 -0
  278. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/qualityIntelligence/dispatcher.d.ts.map +1 -1
  279. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/qualityIntelligence/dispatcher.js +14 -0
  280. package/node_modules/@oscharko-dev/keiko-model-gateway/package.json +2 -2
  281. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/.tsbuildinfo +1 -1
  282. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/a11yBaseline.d.ts.map +1 -1
  283. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/a11yBaseline.js +9 -2
  284. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/cleanToScreenIr.js +1 -1
  285. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/emissionPlan.d.ts +9 -1
  286. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/emissionPlan.d.ts.map +1 -1
  287. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/emissionPlan.js +9 -1
  288. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/htmlCssAdapter.d.ts +5 -0
  289. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/htmlCssAdapter.d.ts.map +1 -1
  290. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/htmlCssAdapter.js +229 -33
  291. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/irTypes.d.ts +62 -0
  292. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/irTypes.d.ts.map +1 -1
  293. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/links.d.ts.map +1 -1
  294. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/links.js +24 -4
  295. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/navGraph.d.ts +4 -2
  296. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/navGraph.d.ts.map +1 -1
  297. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/navGraph.js +0 -0
  298. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/normalize.d.ts.map +1 -1
  299. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/normalize.js +119 -5
  300. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/prune.d.ts +2 -1
  301. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/prune.d.ts.map +1 -1
  302. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/prune.js +26 -11
  303. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/screenIrTestBaseline.d.ts.map +1 -1
  304. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/screenIrTestBaseline.js +86 -9
  305. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/tokens.d.ts.map +1 -1
  306. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/figma/tokens.js +10 -3
  307. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/validation.d.ts.map +1 -1
  308. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/domain/validation.js +14 -12
  309. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/ingestion/sourceMixPlanning.js +0 -0
  310. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/ingestion/untrustedContentNormalisation.d.ts +1 -1
  311. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/ingestion/untrustedContentNormalisation.d.ts.map +1 -1
  312. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/ingestion/untrustedContentNormalisation.js +9 -1
  313. package/node_modules/@oscharko-dev/keiko-quality-intelligence/package.json +2 -2
  314. package/node_modules/@oscharko-dev/keiko-sdk/dist/.tsbuildinfo +1 -1
  315. package/node_modules/@oscharko-dev/keiko-sdk/package.json +2 -2
  316. package/node_modules/@oscharko-dev/keiko-security/dist/.tsbuildinfo +1 -1
  317. package/node_modules/@oscharko-dev/keiko-security/dist/redaction.d.ts.map +1 -1
  318. package/node_modules/@oscharko-dev/keiko-security/dist/redaction.js +4 -2
  319. package/node_modules/@oscharko-dev/keiko-security/package.json +2 -2
  320. package/node_modules/@oscharko-dev/keiko-server/dist/.tsbuildinfo +1 -1
  321. package/node_modules/@oscharko-dev/keiko-server/dist/chat-handlers.d.ts.map +1 -1
  322. package/node_modules/@oscharko-dev/keiko-server/dist/chat-handlers.js +6 -1
  323. package/node_modules/@oscharko-dev/keiko-server/dist/deps.d.ts +2 -0
  324. package/node_modules/@oscharko-dev/keiko-server/dist/deps.d.ts.map +1 -1
  325. package/node_modules/@oscharko-dev/keiko-server/dist/deps.js +59 -9
  326. package/node_modules/@oscharko-dev/keiko-server/dist/evidence.d.ts +1 -1
  327. package/node_modules/@oscharko-dev/keiko-server/dist/evidence.d.ts.map +1 -1
  328. package/node_modules/@oscharko-dev/keiko-server/dist/evidence.js +4 -3
  329. package/node_modules/@oscharko-dev/keiko-server/dist/files.d.ts +18 -3
  330. package/node_modules/@oscharko-dev/keiko-server/dist/files.d.ts.map +1 -1
  331. package/node_modules/@oscharko-dev/keiko-server/dist/files.js +208 -72
  332. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-answer.d.ts.map +1 -1
  333. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-answer.js +7 -2
  334. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-context-index.d.ts +3 -0
  335. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-context-index.d.ts.map +1 -1
  336. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-context-index.js +27 -4
  337. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-handoff.d.ts.map +1 -1
  338. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-handoff.js +46 -14
  339. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-orchestrator.d.ts +1 -0
  340. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-orchestrator.d.ts.map +1 -1
  341. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-orchestrator.js +433 -31
  342. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-prompt.d.ts.map +1 -1
  343. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-prompt.js +5 -3
  344. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-hybrid.d.ts +9 -0
  345. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-hybrid.d.ts.map +1 -1
  346. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-hybrid.js +194 -45
  347. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-multi-source.d.ts +4 -0
  348. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-multi-source.d.ts.map +1 -1
  349. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-multi-source.js +100 -24
  350. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa.d.ts +7 -0
  351. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa.d.ts.map +1 -1
  352. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa.js +196 -20
  353. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-turn-registry.d.ts.map +1 -1
  354. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-turn-registry.js +21 -1
  355. package/node_modules/@oscharko-dev/keiko-server/dist/index.d.ts +1 -1
  356. package/node_modules/@oscharko-dev/keiko-server/dist/index.d.ts.map +1 -1
  357. package/node_modules/@oscharko-dev/keiko-server/dist/index.js +1 -1
  358. package/node_modules/@oscharko-dev/keiko-server/dist/local-knowledge-grounded-qa.d.ts +9 -6
  359. package/node_modules/@oscharko-dev/keiko-server/dist/local-knowledge-grounded-qa.d.ts.map +1 -1
  360. package/node_modules/@oscharko-dev/keiko-server/dist/local-knowledge-grounded-qa.js +189 -66
  361. package/node_modules/@oscharko-dev/keiko-server/dist/local-knowledge-handlers.d.ts.map +1 -1
  362. package/node_modules/@oscharko-dev/keiko-server/dist/local-knowledge-handlers.js +189 -72
  363. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaConnectorErrors.d.ts +10 -2
  364. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaConnectorErrors.d.ts.map +1 -1
  365. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaConnectorErrors.js +110 -30
  366. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaHttpPort.d.ts +13 -4
  367. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaHttpPort.d.ts.map +1 -1
  368. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaHttpPort.js +29 -17
  369. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaRenderPort.d.ts +13 -3
  370. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaRenderPort.d.ts.map +1 -1
  371. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaRenderPort.js +54 -5
  372. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaSnapshotBuilder.d.ts.map +1 -1
  373. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaSnapshotBuilder.js +84 -12
  374. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaSnapshotHash.d.ts.map +1 -1
  375. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaSnapshotHash.js +16 -8
  376. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaSnapshotTypes.d.ts +6 -2
  377. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figma/figmaSnapshotTypes.d.ts.map +1 -1
  378. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotAdapter.d.ts +13 -1
  379. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotAdapter.d.ts.map +1 -1
  380. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotAdapter.js +15 -2
  381. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotOrchestration.d.ts +9 -0
  382. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotOrchestration.d.ts.map +1 -1
  383. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotOrchestration.js +2 -2
  384. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotRoutes.d.ts +9 -1
  385. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotRoutes.d.ts.map +1 -1
  386. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/figmaSnapshotRoutes.js +138 -19
  387. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/generationPort.d.ts.map +1 -1
  388. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/generationPort.js +26 -7
  389. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/judgePort.d.ts.map +1 -1
  390. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/judgePort.js +26 -7
  391. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reCheckRoutes.d.ts.map +1 -1
  392. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reCheckRoutes.js +3 -1
  393. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runIngestion.d.ts.map +1 -1
  394. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runIngestion.js +51 -15
  395. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runRoutes.d.ts +4 -1
  396. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runRoutes.d.ts.map +1 -1
  397. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runRoutes.js +17 -3
  398. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/uiRoutes.d.ts.map +1 -1
  399. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/uiRoutes.js +6 -2
  400. package/node_modules/@oscharko-dev/keiko-server/dist/routes.d.ts.map +1 -1
  401. package/node_modules/@oscharko-dev/keiko-server/dist/routes.js +4 -2
  402. package/node_modules/@oscharko-dev/keiko-server/dist/run-engine.d.ts.map +1 -1
  403. package/node_modules/@oscharko-dev/keiko-server/dist/run-engine.js +6 -1
  404. package/node_modules/@oscharko-dev/keiko-server/dist/store/chats.d.ts +2 -2
  405. package/node_modules/@oscharko-dev/keiko-server/dist/store/chats.d.ts.map +1 -1
  406. package/node_modules/@oscharko-dev/keiko-server/dist/store/chats.js +84 -8
  407. package/node_modules/@oscharko-dev/keiko-server/dist/store/db.d.ts.map +1 -1
  408. package/node_modules/@oscharko-dev/keiko-server/dist/store/db.js +4 -2
  409. package/node_modules/@oscharko-dev/keiko-server/dist/store/index.d.ts +1 -1
  410. package/node_modules/@oscharko-dev/keiko-server/dist/store/index.d.ts.map +1 -1
  411. package/node_modules/@oscharko-dev/keiko-server/dist/store/types.d.ts +5 -1
  412. package/node_modules/@oscharko-dev/keiko-server/dist/store/types.d.ts.map +1 -1
  413. package/node_modules/@oscharko-dev/keiko-server/dist/store-handlers.d.ts.map +1 -1
  414. package/node_modules/@oscharko-dev/keiko-server/dist/store-handlers.js +67 -14
  415. package/node_modules/@oscharko-dev/keiko-server/package.json +2 -2
  416. package/node_modules/@oscharko-dev/keiko-tools/dist/.tsbuildinfo +1 -1
  417. package/node_modules/@oscharko-dev/keiko-tools/package.json +2 -2
  418. package/node_modules/@oscharko-dev/keiko-verification/dist/.tsbuildinfo +1 -1
  419. package/node_modules/@oscharko-dev/keiko-verification/package.json +2 -2
  420. package/node_modules/@oscharko-dev/keiko-workflows/dist/.tsbuildinfo +1 -1
  421. package/node_modules/@oscharko-dev/keiko-workflows/dist/contextpack/assemble.d.ts +2 -0
  422. package/node_modules/@oscharko-dev/keiko-workflows/dist/contextpack/assemble.d.ts.map +1 -1
  423. package/node_modules/@oscharko-dev/keiko-workflows/dist/contextpack/assemble.js +45 -10
  424. package/node_modules/@oscharko-dev/keiko-workflows/dist/contextpack/index.d.ts +1 -1
  425. package/node_modules/@oscharko-dev/keiko-workflows/dist/contextpack/index.d.ts.map +1 -1
  426. package/node_modules/@oscharko-dev/keiko-workflows/dist/contextpack/index.js +1 -1
  427. package/node_modules/@oscharko-dev/keiko-workflows/dist/planner/plan.d.ts.map +1 -1
  428. package/node_modules/@oscharko-dev/keiko-workflows/dist/planner/plan.js +4 -6
  429. package/node_modules/@oscharko-dev/keiko-workflows/dist/qualityIntelligence/__tests__/fixtures/runEntryFixtures.d.ts +30 -0
  430. package/node_modules/@oscharko-dev/keiko-workflows/dist/qualityIntelligence/__tests__/fixtures/runEntryFixtures.d.ts.map +1 -0
  431. package/node_modules/@oscharko-dev/keiko-workflows/dist/qualityIntelligence/__tests__/fixtures/runEntryFixtures.js +114 -0
  432. package/node_modules/@oscharko-dev/keiko-workflows/dist/qualityIntelligence/modelRoutedTestDesign.d.ts.map +1 -1
  433. package/node_modules/@oscharko-dev/keiko-workflows/dist/qualityIntelligence/modelRoutedTestDesign.js +20 -7
  434. package/node_modules/@oscharko-dev/keiko-workflows/dist/qualityIntelligence/runEntries.d.ts.map +1 -1
  435. package/node_modules/@oscharko-dev/keiko-workflows/dist/qualityIntelligence/runEntries.js +15 -7
  436. package/node_modules/@oscharko-dev/keiko-workflows/dist/qualityIntelligence/runtimeCommon.d.ts.map +1 -1
  437. package/node_modules/@oscharko-dev/keiko-workflows/dist/qualityIntelligence/runtimeCommon.js +28 -4
  438. package/node_modules/@oscharko-dev/keiko-workflows/dist/ranking/rank.d.ts.map +1 -1
  439. package/node_modules/@oscharko-dev/keiko-workflows/dist/ranking/rank.js +51 -1
  440. package/node_modules/@oscharko-dev/keiko-workflows/dist/ranking/signals.d.ts.map +1 -1
  441. package/node_modules/@oscharko-dev/keiko-workflows/dist/ranking/signals.js +8 -3
  442. package/node_modules/@oscharko-dev/keiko-workflows/package.json +2 -2
  443. package/node_modules/@oscharko-dev/keiko-workspace/dist/.tsbuildinfo +1 -1
  444. package/node_modules/@oscharko-dev/keiko-workspace/dist/fs.d.ts +1 -0
  445. package/node_modules/@oscharko-dev/keiko-workspace/dist/fs.d.ts.map +1 -1
  446. package/node_modules/@oscharko-dev/keiko-workspace/dist/fs.js +1 -0
  447. package/node_modules/@oscharko-dev/keiko-workspace/dist/gitHistory.d.ts.map +1 -1
  448. package/node_modules/@oscharko-dev/keiko-workspace/dist/gitHistory.js +84 -27
  449. package/node_modules/@oscharko-dev/keiko-workspace/dist/ignore.d.ts.map +1 -1
  450. package/node_modules/@oscharko-dev/keiko-workspace/dist/ignore.js +19 -0
  451. package/node_modules/@oscharko-dev/keiko-workspace/dist/importGraph.d.ts.map +1 -1
  452. package/node_modules/@oscharko-dev/keiko-workspace/dist/importGraph.js +6 -3
  453. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearch.d.ts.map +1 -1
  454. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearch.js +72 -25
  455. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchEntries.d.ts +15 -0
  456. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchEntries.d.ts.map +1 -0
  457. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchEntries.js +107 -0
  458. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchLineSelection.d.ts +18 -0
  459. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchLineSelection.d.ts.map +1 -0
  460. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchLineSelection.js +42 -0
  461. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchMatchers.d.ts.map +1 -1
  462. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchMatchers.js +4 -11
  463. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchRegexSafety.d.ts +2 -0
  464. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchRegexSafety.d.ts.map +1 -0
  465. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchRegexSafety.js +15 -0
  466. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchScan.d.ts +2 -2
  467. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchScan.d.ts.map +1 -1
  468. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchScan.js +89 -75
  469. package/node_modules/@oscharko-dev/keiko-workspace/package.json +2 -2
  470. package/node_modules/@types/node/README.md +1 -1
  471. package/node_modules/@types/node/http2.d.ts +1 -0
  472. package/node_modules/@types/node/package.json +2 -2
  473. package/package.json +3 -1
  474. package/dist/ui/static/_next/static/RAzN8WLtYaktD-ZePowXl/_buildManifest.js +0 -1
  475. package/dist/ui/static/_next/static/chunks/18-ac3e3551b4e0ce8a.js +0 -1
  476. package/dist/ui/static/_next/static/chunks/258-e3b5ee46b0669967.js +0 -1
  477. package/dist/ui/static/_next/static/chunks/422-4c94c107b90d3ccc.js +0 -1
  478. package/dist/ui/static/_next/static/chunks/664-6d821dc1aacb6b48.js +0 -1
  479. package/dist/ui/static/_next/static/chunks/87c73c54-24122e7b92478d00.js +0 -1
  480. package/dist/ui/static/_next/static/chunks/982-abc19630e6305864.js +0 -1
  481. package/dist/ui/static/_next/static/chunks/app/_not-found/page-c4d800f366186be0.js +0 -1
  482. package/dist/ui/static/_next/static/chunks/app/launch/page-17ca39367f25f372.js +0 -1
  483. package/dist/ui/static/_next/static/chunks/app/layout-0f75a39edc90325d.js +0 -1
  484. package/dist/ui/static/_next/static/chunks/app/local-knowledge/capsule/page-87a2ea239308ed34.js +0 -1
  485. package/dist/ui/static/_next/static/chunks/app/local-knowledge/page-98bb7704fc7fd0ad.js +0 -1
  486. package/dist/ui/static/_next/static/chunks/app/memoriaviva/consolidation/page-f912263f1ee5d2dd.js +0 -1
  487. package/dist/ui/static/_next/static/chunks/app/memoriaviva/detail/page-fa590f135356e0af.js +0 -1
  488. package/dist/ui/static/_next/static/chunks/app/memoriaviva/page-b8555600c1113f14.js +0 -1
  489. package/dist/ui/static/_next/static/chunks/app/memoriaviva/review-queue/page-85cfbeb3598c0a36.js +0 -1
  490. package/dist/ui/static/_next/static/chunks/app/page-2881856ad25d9935.js +0 -1
  491. package/dist/ui/static/_next/static/chunks/framework-d8f01f7e25201916.js +0 -1
  492. package/dist/ui/static/_next/static/chunks/main-app-5b043f6c611974ae.js +0 -1
  493. package/dist/ui/static/_next/static/chunks/main-bc552b04f2b6dbe2.js +0 -1
  494. package/dist/ui/static/_next/static/chunks/pages/_app-2e239ff05bfdf6d6.js +0 -1
  495. package/dist/ui/static/_next/static/chunks/pages/_error-bda15e7831eec981.js +0 -1
  496. package/dist/ui/static/_next/static/chunks/webpack-0cfe6f51555ca84e.js +0 -1
  497. package/dist/ui/static/_next/static/css/eac94895f3edc5a5.css +0 -1
  498. /package/dist/ui/static/_next/static/{RAzN8WLtYaktD-ZePowXl → Hb6brrvZY2nZtizQlYhVt}/_ssgManifest.js +0 -0
  499. /package/dist/ui/static/_next/static/chunks/{polyfills-42372ed130431b0a.js → 0cz1d0mv5g_q7.js} +0 -0
@@ -2,11 +2,23 @@ import { type FigmaSnapshotRecord } from "@oscharko-dev/keiko-evidence";
2
2
  import type { UiHandlerDeps } from "../deps.js";
3
3
  /** Loads an immutable Figma Snapshot evidence record by runId. Returns `undefined` when not found. */
4
4
  export type FigmaSnapshotLoader = (snapshotRunId: string) => FigmaSnapshotRecord | undefined;
5
+ export interface FigmaSnapshotLoaderOptions {
6
+ /**
7
+ * Drift seam (#735): a figma-snapshot source pins a write-once, content-addressed runId, so its
8
+ * content can never change under its identity — re-checking the pinned record would always
9
+ * report "fresh" even after the board changed and was re-snapshotted. When this flag is set the
10
+ * loader resolves the LATEST snapshot recorded for the same board scope (fileKey + nodeId) and
11
+ * returns it instead of the pinned record whenever its integrity hash differs. Screen atom ids
12
+ * are board-stable (screenId-derived), so compareStaleness sees changed atoms, not orphans.
13
+ * Used by re-check and regenerate-stale ONLY — the generate path keeps exact pinning.
14
+ */
15
+ readonly resolveLatestByScope?: boolean;
16
+ }
5
17
  /**
6
18
  * Build the snapshot loader. Returns `undefined` when `deps.evidenceDir` is not configured so the
7
19
  * ingestion layer maps an attempted figma-snapshot source to QI_FIGMA_SNAPSHOT_UNAVAILABLE.
8
20
  */
9
- export declare function makeFigmaSnapshotLoader(deps: UiHandlerDeps): FigmaSnapshotLoader | undefined;
21
+ export declare function makeFigmaSnapshotLoader(deps: UiHandlerDeps, options?: FigmaSnapshotLoaderOptions): FigmaSnapshotLoader | undefined;
10
22
  /** The image-derived semantics a multimodal model recovered for one screen, as additive hints. */
11
23
  export interface FigmaVisionScreenRequest {
12
24
  readonly screenId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"figmaSnapshotAdapter.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/figmaSnapshotAdapter.ts"],"names":[],"mappings":"AAiBA,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,sGAAsG;AACtG,MAAM,MAAM,mBAAmB,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,mBAAmB,GAAG,SAAS,CAAC;AAE7F;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,aAAa,GAAG,mBAAmB,GAAG,SAAS,CAY5F;AAED,kGAAkG;AAClG,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uFAAuF;IACvF,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,kGAAkG;IAClG,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,EAAE,wBAAwB,KAAK,SAAS,MAAM,EAAE,CAAC;AAE/F;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,CAC5B,OAAO,EAAE,wBAAwB,EACjC,OAAO,EAAE,MAAM,KACZ,SAAS,MAAM,EAAE,CAAC;AAOvB;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,aAAa,EACnB,UAAU,CAAC,EAAE,eAAe,GAC3B,uBAAuB,CAazB"}
1
+ {"version":3,"file":"figmaSnapshotAdapter.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/figmaSnapshotAdapter.ts"],"names":[],"mappings":"AAiBA,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,sGAAsG;AACtG,MAAM,MAAM,mBAAmB,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,mBAAmB,GAAG,SAAS,CAAC;AAE7F,MAAM,WAAW,0BAA0B;IACzC;;;;;;;;OAQG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,aAAa,EACnB,OAAO,CAAC,EAAE,0BAA0B,GACnC,mBAAmB,GAAG,SAAS,CA0BjC;AAED,kGAAkG;AAClG,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uFAAuF;IACvF,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,kGAAkG;IAClG,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,EAAE,wBAAwB,KAAK,SAAS,MAAM,EAAE,CAAC;AAE/F;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,CAC5B,OAAO,EAAE,wBAAwB,EACjC,OAAO,EAAE,MAAM,KACZ,SAAS,MAAM,EAAE,CAAC;AAOvB;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,aAAa,EACnB,UAAU,CAAC,EAAE,eAAe,GAC3B,uBAAuB,CAazB"}
@@ -20,14 +20,27 @@ import { resolveQiMultimodalSelection } from "./modelSelection.js";
20
20
  * Build the snapshot loader. Returns `undefined` when `deps.evidenceDir` is not configured so the
21
21
  * ingestion layer maps an attempted figma-snapshot source to QI_FIGMA_SNAPSHOT_UNAVAILABLE.
22
22
  */
23
- export function makeFigmaSnapshotLoader(deps) {
23
+ export function makeFigmaSnapshotLoader(deps, options) {
24
24
  const evidenceDir = deps.evidenceDir;
25
25
  if (evidenceDir === undefined || evidenceDir.length === 0)
26
26
  return undefined;
27
27
  const store = createNodeFigmaSnapshotStore(evidenceDir);
28
+ const resolveLatest = options?.resolveLatestByScope === true;
28
29
  return (snapshotRunId) => {
29
30
  try {
30
- return store.load(snapshotRunId);
31
+ const pinned = store.load(snapshotRunId);
32
+ if (pinned === undefined || !resolveLatest)
33
+ return pinned;
34
+ const entries = store.listByScope(pinned.provenance.fileKey, pinned.provenance.nodeId);
35
+ const newest = entries[0];
36
+ if (newest === undefined ||
37
+ newest.runId === pinned.runId ||
38
+ newest.integrityHash === pinned.integrityHash) {
39
+ return pinned;
40
+ }
41
+ // Fall back to the pinned record when the newest record fails to load — drift detection
42
+ // must degrade to "fresh", never crash the re-check.
43
+ return store.load(newest.runId) ?? pinned;
31
44
  }
32
45
  catch {
33
46
  // A malformed / unreadable record is treated as "not found"; the caller emits a coded error.
@@ -14,6 +14,15 @@ export interface GovernedSnapshotDeps {
14
14
  readonly pagination?: Partial<ScopedPaginationLimits>;
15
15
  /** Shared enterprise egress settings for Figma API + render downloads (#802). */
16
16
  readonly egress?: OutboundHttpEgressConfig | undefined;
17
+ /**
18
+ * Creation-time overrides forwarded to the default HTTP and render ports when no explicit
19
+ * httpPort/renderPort is injected. Currently only `timeoutMs` (maps to
20
+ * KEIKO_FIGMA_REQUEST_TIMEOUT_MS). Ignored when httpPort/renderPort are injected directly
21
+ * (route tests supply fakes that honour their own timeouts).
22
+ */
23
+ readonly portOptions?: {
24
+ readonly timeoutMs?: number;
25
+ };
17
26
  readonly httpPort?: FigmaHttpPort;
18
27
  readonly renderPort?: FigmaRenderPort;
19
28
  readonly keychainAccess?: FigmaKeychainAccess;
@@ -1 +1 @@
1
- {"version":3,"file":"figmaSnapshotOrchestration.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/figmaSnapshotOrchestration.ts"],"names":[],"mappings":"AAeA,OAAO,EAOL,qBAAqB,EAQrB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAKhG,KAAK,cAAc,GAAG,wBAAwB,CAAC,cAAc,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,uFAAuF;IACvF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,iGAAiG;IACjG,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,+CAA+C;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACtD,iFAAiF;IACjF,QAAQ,CAAC,MAAM,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAEvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;CAC/C;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC;AAMD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,oBAAoB,KAAG,MAAM,GAAG,SAWzE,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB,GAC7B,MAAM,IAAI,CAAC,oBAAoB,EAAE,KAAK,GAAG,aAAa,GAAG,gBAAgB,CAAC,KACzE,UAAU,CAAC,OAAO,qBAAqB,CAOzC,CAAC;AAqDF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAChC,WAAW,MAAM,EACjB,MAAM,oBAAoB,EAC1B,sBAAoB,KACnB,OAAO,CAAC,sBAAsB,CAiDhC,CAAC"}
1
+ {"version":3,"file":"figmaSnapshotOrchestration.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/figmaSnapshotOrchestration.ts"],"names":[],"mappings":"AAeA,OAAO,EAOL,qBAAqB,EAQrB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAKhG,KAAK,cAAc,GAAG,wBAAwB,CAAC,cAAc,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,uFAAuF;IACvF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,iGAAiG;IACjG,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,+CAA+C;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACtD,iFAAiF;IACjF,QAAQ,CAAC,MAAM,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACvD;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAEvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;CAC/C;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC;AAMD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,oBAAoB,KAAG,MAAM,GAAG,SAWzE,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB,GAC7B,MAAM,IAAI,CAAC,oBAAoB,EAAE,KAAK,GAAG,aAAa,GAAG,gBAAgB,CAAC,KACzE,UAAU,CAAC,OAAO,qBAAqB,CAOzC,CAAC;AAqDF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAChC,WAAW,MAAM,EACjB,MAAM,oBAAoB,EAC1B,sBAAoB,KACnB,OAAO,CAAC,sBAAsB,CAmDhC,CAAC"}
@@ -91,8 +91,8 @@ export const governedSnapshotBuild = async (boardLink, deps, isResnapshot = fals
91
91
  if (target === null)
92
92
  throw new FigmaConnectorError("FIGMA_MALFORMED_URL");
93
93
  const scopeRef = deriveFigmaScopeRef(target.fileKey, target.nodeId);
94
- const httpPort = deps.httpPort ?? createDefaultFigmaHttpPort(deps.egress);
95
- const renderPort = deps.renderPort ?? createDefaultFigmaRenderPort(deps.egress);
94
+ const httpPort = deps.httpPort ?? createDefaultFigmaHttpPort(deps.egress, undefined, deps.portOptions);
95
+ const renderPort = deps.renderPort ?? createDefaultFigmaRenderPort(deps.egress, undefined, deps.portOptions);
96
96
  const vaultToken = readFigmaVaultToken(deps);
97
97
  gateConsent(deps, scopeRef);
98
98
  // Render-token (vault > config > env). Throws FIGMA_TOKEN_MISSING when nothing is configured.
@@ -51,7 +51,15 @@ export interface FigmaScreenSummary {
51
51
  /** Byte size of the rendered PNG. */
52
52
  readonly imageByteLength: number;
53
53
  }
54
- export declare function handleFigmaTriggerSnapshot(ctx: RouteContext, deps: UiHandlerDeps): Promise<RouteResult>;
54
+ interface CoalescedBuildEntry {
55
+ readonly promise: Promise<RouteResult>;
56
+ }
57
+ /** Injectable for tests — returns the module-level map by default. */
58
+ export declare function makeInFlightMap(): Map<string, CoalescedBuildEntry>;
59
+ /** Reset the module-level coalescing map. Used by tests to ensure isolation. */
60
+ export declare function resetInFlightMap(): void;
61
+ export declare function handleFigmaTriggerSnapshot(ctx: RouteContext, deps: UiHandlerDeps, inFlight?: Map<string, CoalescedBuildEntry>): Promise<RouteResult>;
55
62
  export declare function handleFigmaRevokeToken(ctx: RouteContext, deps: UiHandlerDeps): RouteResult;
56
63
  export declare function handleFigmaLoadSnapshot(ctx: RouteContext, deps: UiHandlerDeps): RouteResult;
64
+ export {};
57
65
  //# sourceMappingURL=figmaSnapshotRoutes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"figmaSnapshotRoutes.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/figmaSnapshotRoutes.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAA8B,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5E,OAAO,EAOL,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EAExB,MAAM,kBAAkB,CAAC;AAgH1B,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8CAA8C;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,2FAA2F;IAC3F,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,qBAAqB,CAAC;IACzC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wFAAwF;IACxF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,sDAAsD;IACtD,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,kCAAkC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,qCAAqC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAmMD,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,WAAW,CAAC,CAkCtB;AAID,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,GAAG,WAAW,CA4B1F;AAID,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,GAAG,WAAW,CAwB3F"}
1
+ {"version":3,"file":"figmaSnapshotRoutes.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/figmaSnapshotRoutes.ts"],"names":[],"mappings":"AA8CA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAA8B,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5E,OAAO,EAOL,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EAExB,MAAM,kBAAkB,CAAC;AAoI1B,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8CAA8C;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,2FAA2F;IAC3F,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,qBAAqB,CAAC;IACzC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wFAAwF;IACxF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,sDAAsD;IACtD,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,kCAAkC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,qCAAqC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAgOD,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CACxC;AAMD,sEAAsE;AACtE,wBAAgB,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAElE;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAmED,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,EACnB,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAsB,GAC9D,OAAO,CAAC,WAAW,CAAC,CAqCtB;AAID,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,GAAG,WAAW,CA4B1F;AAID,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,GAAG,WAAW,CAwB3F"}
@@ -19,6 +19,28 @@
19
19
  //
20
20
  // Both routes honour the existing QI error-envelope convention:
21
21
  // { error: { code: string; message: string } }
22
+ //
23
+ // In-flight coalescing (item 2):
24
+ // Concurrent POSTs for the same scope (fileKey:nodeId) share ONE build promise. The FIRST
25
+ // caller starts the governed build, mints the runId ONCE, persists ONCE (inside the build
26
+ // chain so a deadline-expired-but-completed build still persists and is recoverable via an
27
+ // immediate retry POST). Subsequent callers await the same promise and receive the same
28
+ // runId/response. The entry is removed on settle (finally). Failures propagate to all
29
+ // waiters with the same coded error.
30
+ //
31
+ // Build deadline (item 3):
32
+ // KEIKO_FIGMA_BUILD_DEADLINE_MS (default 600 000 ms). The awaiting handler races the
33
+ // coalesced build promise against a deadline rejection. On deadline the handler responds
34
+ // 504 FIGMA_BUILD_TIMEOUT WITHOUT a runId. The coalesced build itself continues (other
35
+ // waiters may exist); persist is INSIDE the build chain, so if/when the build completes
36
+ // a subsequent POST for the same scope finds the map empty and re-coalesces cheaply.
37
+ // The underlying build is bounded by per-fetch timeouts and pagination budgets.
38
+ //
39
+ // Client disconnect (item 4):
40
+ // The handler listens for the 'close' event on ctx.req. On disconnect the per-waiter
41
+ // race resolves promptly (504 FIGMA_BUILD_TIMEOUT body never sent over the wire).
42
+ // The coalesced build continues — other waiters (if any) are unaffected and will
43
+ // receive the result when the build settles.
22
44
  import { randomUUID } from "node:crypto";
23
45
  import { currentGatewayEgressConfig } from "../deps.js";
24
46
  import { parseFigmaTarget, deriveFigmaScopeRef, observeFigmaRevoke, EXPECTED_FIGMA_SCOPES, FigmaConnectorError, } from "./figma/index.js";
@@ -35,9 +57,16 @@ const FIGMA_ROUTE_ERROR_MESSAGES = {
35
57
  FIGMA_UPSTREAM_UNAVAILABLE: "Figma API is temporarily unavailable. Please try again.",
36
58
  FIGMA_PROXY_EGRESS_FAILED: "The forward proxy rejected the Figma egress request. Check proxy configuration.",
37
59
  FIGMA_PROXY_UNREACHABLE: "The configured forward proxy is unreachable. Check proxy host and port settings.",
60
+ FIGMA_PROXY_AUTH_REQUIRED: "The forward proxy requires authentication. Configure proxy credentials or an allow rule.",
61
+ FIGMA_PROXY_BLOCKED_BY_POLICY: "The forward proxy blocked the Figma egress request. Ask the proxy operator to allow api.figma.com.",
38
62
  FIGMA_TLS_CA_FAILURE: "The Figma egress TLS certificate could not be verified. Check the configured CA bundle.",
39
63
  FIGMA_RATE_LIMITED: "Figma rate-limited the snapshot-build. Please wait a moment and try again.",
40
64
  FIGMA_OVERSIZED_SCOPE: "The selected Figma board section is too large. Select a smaller section (frame or page).",
65
+ FIGMA_RESPONSE_TOO_LARGE: "The Figma API response exceeded the size limit. Select a smaller section.",
66
+ FIGMA_NETWORK_UNREACHABLE: "The outbound request to Figma failed. Check network connectivity and egress policy.",
67
+ FIGMA_EGRESS_TIMEOUT: "The Figma request timed out. Retry or raise KEIKO_FIGMA_REQUEST_TIMEOUT_MS.",
68
+ FIGMA_EGRESS_FAILED: "The outbound request to Figma failed before a response was received.",
69
+ FIGMA_BUILD_TIMEOUT: "The snapshot build exceeded the configured deadline. No partial snapshot was stored.",
41
70
  FIGMA_INTERNAL: "An unexpected error occurred during the snapshot-build.",
42
71
  FIGMA_BAD_LINK: "The board link is not a valid Figma URL, or it is missing a node-id " +
43
72
  "(section/frame anchor required).",
@@ -55,7 +84,7 @@ function figmaErrorBody(code) {
55
84
  // board reference — only the static scope strings.
56
85
  return code === "FIGMA_CONSENT_REQUIRED" ? { ...base, scopes: EXPECTED_FIGMA_SCOPES } : base;
57
86
  }
58
- // Codes that map to 502 (upstream/auth problems, not client errors).
87
+ // Codes that map to 502 (upstream/auth/egress problems, not client errors).
59
88
  const FIGMA_502_CODES = new Set([
60
89
  "FIGMA_TOKEN_MISSING",
61
90
  "FIGMA_TOKEN_INVALID",
@@ -64,8 +93,14 @@ const FIGMA_502_CODES = new Set([
64
93
  "FIGMA_INSUFFICIENT_SCOPE",
65
94
  "FIGMA_PROXY_EGRESS_FAILED",
66
95
  "FIGMA_PROXY_UNREACHABLE",
96
+ "FIGMA_PROXY_AUTH_REQUIRED",
97
+ "FIGMA_PROXY_BLOCKED_BY_POLICY",
67
98
  "FIGMA_TLS_CA_FAILURE",
68
99
  "FIGMA_UPSTREAM_UNAVAILABLE",
100
+ "FIGMA_NETWORK_UNREACHABLE",
101
+ "FIGMA_EGRESS_TIMEOUT",
102
+ "FIGMA_EGRESS_FAILED",
103
+ "FIGMA_RESPONSE_TOO_LARGE",
69
104
  ]);
70
105
  function figmaStatusForCode(code) {
71
106
  if (FIGMA_502_CODES.has(code))
@@ -79,6 +114,8 @@ function figmaStatusForCode(code) {
79
114
  // Precondition Required: the operator must acknowledge the read-only scope before the build (#760).
80
115
  if (code === "FIGMA_CONSENT_REQUIRED")
81
116
  return 428;
117
+ if (code === "FIGMA_BUILD_TIMEOUT")
118
+ return 504;
82
119
  return 500;
83
120
  }
84
121
  // ─── Body reader ───────────────────────────────────────────────────────────────
@@ -245,6 +282,25 @@ function figmaPaginationFromEnv(env) {
245
282
  apply("fetchConcurrency", "KEIKO_FIGMA_FETCH_CONCURRENCY");
246
283
  return overrides;
247
284
  }
285
+ /** Default total snapshot-build deadline in milliseconds (10 minutes). */
286
+ const DEFAULT_BUILD_DEADLINE_MS = 600_000;
287
+ /** Default per-fetch request timeout in milliseconds (1 minute). */
288
+ const DEFAULT_REQUEST_TIMEOUT_MS = 60_000;
289
+ // Parses a positive-integer env var, returning the default when the value is absent or invalid.
290
+ function readPositiveIntEnv(raw, defaultValue) {
291
+ if (raw === undefined)
292
+ return defaultValue;
293
+ const value = Number(raw);
294
+ return Number.isInteger(value) && value > 0 ? value : defaultValue;
295
+ }
296
+ /** KEIKO_FIGMA_BUILD_DEADLINE_MS — total build deadline used by the coalesced promise race. */
297
+ function figmaBuildDeadlineMsFromEnv(env) {
298
+ return readPositiveIntEnv(env.KEIKO_FIGMA_BUILD_DEADLINE_MS, DEFAULT_BUILD_DEADLINE_MS);
299
+ }
300
+ /** KEIKO_FIGMA_REQUEST_TIMEOUT_MS — per-fetch timeout threaded into the transport ports. */
301
+ function figmaRequestTimeoutMsFromEnv(env) {
302
+ return readPositiveIntEnv(env.KEIKO_FIGMA_REQUEST_TIMEOUT_MS, DEFAULT_REQUEST_TIMEOUT_MS);
303
+ }
248
304
  // Map a thrown error from the governed build to a coded route result: a coded connector error maps to
249
305
  // its status (consent-required → 428, auth → 502, rate-limit → 429, …); anything else is a safe 500.
250
306
  function figmaErrorResult(err) {
@@ -287,8 +343,69 @@ function persistSnapshot(evidenceDir, runId, result) {
287
343
  return { status: 500, body: figmaErrorBody("FIGMA_INTERNAL") };
288
344
  return record;
289
345
  }
346
+ // The map is module-level so it is shared across concurrent requests on the same server instance.
347
+ // It is exposed via makeInFlightMap so tests can inject a fresh map (isolation without mocking).
348
+ let defaultInFlightMap = new Map();
349
+ /** Injectable for tests — returns the module-level map by default. */
350
+ export function makeInFlightMap() {
351
+ return defaultInFlightMap;
352
+ }
353
+ /** Reset the module-level coalescing map. Used by tests to ensure isolation. */
354
+ export function resetInFlightMap() {
355
+ defaultInFlightMap = new Map();
356
+ }
357
+ /** Derive the scope key (fileKey:nodeId) for the in-flight map. */
358
+ function scopeKeyFor(boardLink) {
359
+ const target = parseFigmaTarget(boardLink);
360
+ if (target === null)
361
+ return undefined;
362
+ return `${target.fileKey}:${target.nodeId}`;
363
+ }
364
+ // Starts the governed build + persist and removes the map entry on settle.
365
+ // Persist is INSIDE this chain: if a caller's deadline fires but the build later completes,
366
+ // the record is stored and an immediate retry POST coalesces or finds it via the GET route.
367
+ function startCoalescedBuild(scopeKey, inFlight, boardLink, body, evidenceDir, deps) {
368
+ const buildAndPersist = async () => {
369
+ let result;
370
+ try {
371
+ // The governed build resolves the vault>config>env PAT (#758), gates on recorded read-only
372
+ // consent before any egress + audits the action + computes metrics (#760), and deep-fetches +
373
+ // renders within the snapshot boundary (#837/#759). Errors (incl. consent-required) are coded.
374
+ result = await governedSnapshotBuild(boardLink, {
375
+ evidenceDir,
376
+ env: deps.env,
377
+ now: new Date().toISOString(),
378
+ acknowledgeReadOnly: body.acknowledgeReadOnly,
379
+ pagination: figmaPaginationFromEnv(deps.env),
380
+ egress: currentGatewayEgressConfig(deps),
381
+ portOptions: { timeoutMs: figmaRequestTimeoutMsFromEnv(deps.env) },
382
+ }, body.isResnapshot);
383
+ }
384
+ catch (err) {
385
+ return figmaErrorResult(err);
386
+ }
387
+ const runId = `fs-${randomUUID()}`;
388
+ const stored = persistSnapshot(evidenceDir, runId, result);
389
+ if ("status" in stored)
390
+ return stored;
391
+ return { status: 201, body: recordToSummary(stored, result.coverage, result.metrics) };
392
+ };
393
+ const promise = buildAndPersist().finally(() => {
394
+ inFlight.delete(scopeKey);
395
+ });
396
+ inFlight.set(scopeKey, { promise });
397
+ return promise;
398
+ }
399
+ // Returns a promise that rejects with a FIGMA_BUILD_TIMEOUT error after `ms` milliseconds.
400
+ function deadlineRejection(ms) {
401
+ return new Promise((_resolve, reject) => {
402
+ setTimeout(() => {
403
+ reject(new FigmaConnectorError("FIGMA_BUILD_TIMEOUT"));
404
+ }, ms);
405
+ });
406
+ }
290
407
  // ─── POST /api/figma/snapshots ─────────────────────────────────────────────────
291
- export async function handleFigmaTriggerSnapshot(ctx, deps) {
408
+ export async function handleFigmaTriggerSnapshot(ctx, deps, inFlight = defaultInFlightMap) {
292
409
  const evidenceDir = deps.evidenceDir;
293
410
  if (evidenceDir === undefined || evidenceDir.length === 0) {
294
411
  return { status: 503, body: figmaErrorBody("FIGMA_NO_EVIDENCE_DIR") };
@@ -297,28 +414,30 @@ export async function handleFigmaTriggerSnapshot(ctx, deps) {
297
414
  if ("status" in bodyResult)
298
415
  return bodyResult;
299
416
  const body = bodyResult;
300
- let result;
417
+ const scopeKey = scopeKeyFor(body.boardLink);
418
+ if (scopeKey === undefined) {
419
+ // parseTriggerBody already validates the board link; this is a belt-and-suspenders guard.
420
+ return { status: 400, body: figmaErrorBody("FIGMA_BAD_LINK") };
421
+ }
422
+ // Coalesce: join an existing build for this scope, or start a new one.
423
+ const existing = inFlight.get(scopeKey);
424
+ const buildPromise = existing !== undefined
425
+ ? existing.promise
426
+ : startCoalescedBuild(scopeKey, inFlight, body.boardLink, body, evidenceDir, deps);
427
+ const deadlineMs = figmaBuildDeadlineMsFromEnv(deps.env);
428
+ // Per-waiter race: deadline + client-disconnect both resolve this waiter promptly while the
429
+ // coalesced build (and its persist) continues uninterrupted for other waiters.
430
+ const disconnectPromise = new Promise((_resolve, reject) => {
431
+ ctx.req.once("close", () => {
432
+ reject(new FigmaConnectorError("FIGMA_BUILD_TIMEOUT"));
433
+ });
434
+ });
301
435
  try {
302
- // The governed build resolves the vault>config>env PAT (#758), gates on recorded read-only
303
- // consent before any egress + audits the action + computes metrics (#760), and deep-fetches +
304
- // renders within the snapshot boundary (#837/#759). Errors (incl. consent-required) are coded.
305
- result = await governedSnapshotBuild(body.boardLink, {
306
- evidenceDir,
307
- env: deps.env,
308
- now: new Date().toISOString(),
309
- acknowledgeReadOnly: body.acknowledgeReadOnly,
310
- pagination: figmaPaginationFromEnv(deps.env),
311
- egress: currentGatewayEgressConfig(deps),
312
- }, body.isResnapshot);
436
+ return await Promise.race([buildPromise, deadlineRejection(deadlineMs), disconnectPromise]);
313
437
  }
314
438
  catch (err) {
315
439
  return figmaErrorResult(err);
316
440
  }
317
- const runId = `fs-${randomUUID()}`;
318
- const stored = persistSnapshot(evidenceDir, runId, result);
319
- if ("status" in stored)
320
- return stored;
321
- return { status: 201, body: recordToSummary(stored, result.coverage, result.metrics) };
322
441
  }
323
442
  // ─── DELETE /api/figma/token — revoke the stored PAT (#758 rotation/revocation, #760 audit) ───
324
443
  export function handleFigmaRevokeToken(ctx, deps) {
@@ -1 +1 @@
1
- {"version":3,"file":"generationPort.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/generationPort.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,iCAAiC,EAGlC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,SAAgB,IAAI,EAAE,MAAM,CAAC;gBACjB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAiED,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC7B;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7C,CAAC;AAsHN,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,kBAAkB,GACzB,iCAAiC,CAMnC"}
1
+ {"version":3,"file":"generationPort.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/generationPort.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,iCAAiC,EAGlC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,SAAgB,IAAI,EAAE,MAAM,CAAC;gBACjB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAwFD,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC7B;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7C,CAAC;AAsHN,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,kBAAkB,GACzB,iCAAiC,CAMnC"}
@@ -22,9 +22,31 @@ function capabilityFor(deps, modelId) {
22
22
  ? findCapability(modelId)
23
23
  : findConfiguredCapability(deps.config, modelId);
24
24
  }
25
- // Strip C0/C1 control characters (keep tab/LF/CR) via a code-point scan so the `no-control-regex`
26
- // rule stays satisfied; then neutralise any literal evidence delimiter so untrusted text cannot
27
- // close the <qi-evidence> block early.
25
+ // Invisible / directional format controls that NFKC does NOT remove: zero-width characters
26
+ // (ZWSP/ZWNJ/ZWJ and the BOM/ZWNBSP) and bidirectional controls (LRM/RLM, the LRE…RLO embedding/
27
+ // override block, and the isolate block). They carry no legitimate meaning in untrusted source
28
+ // evidence but can smuggle homoglyph/bidi deception into the model prompt — and into any candidate
29
+ // rendered or exported from it. Stripping them is content-preserving for real text (#278 Audit
30
+ // Addendum: normalise untrusted content before model prompt construction, rendering, or export).
31
+ function isInvisibleFormatControl(cp) {
32
+ return ((cp >= 0x200b && cp <= 0x200f) || // ZWSP, ZWNJ, ZWJ, LRM, RLM
33
+ (cp >= 0x202a && cp <= 0x202e) || // LRE, RLE, PDF, LRO, RLO
34
+ (cp >= 0x2066 && cp <= 0x2069) || // LRI, RLI, FSI, PDI
35
+ cp === 0xfeff // BOM / ZWNBSP
36
+ );
37
+ }
38
+ // A code point that must be stripped from evidence text: C0 controls (except tab/LF/CR), DEL, C1
39
+ // controls, or an invisible zero-width/bidi format control. Tab/LF/CR survive as legitimate text
40
+ // whitespace so multi-line evidence keeps its structure.
41
+ function isStrippableEvidenceCodePoint(cp) {
42
+ return ((cp <= 0x1f && cp !== 0x09 && cp !== 0x0a && cp !== 0x0d) ||
43
+ cp === 0x7f ||
44
+ (cp >= 0x80 && cp <= 0x9f) ||
45
+ isInvisibleFormatControl(cp));
46
+ }
47
+ // Strip control / invisible format characters via a code-point scan so the `no-control-regex` rule
48
+ // stays satisfied; then neutralise any literal evidence delimiter so untrusted text cannot close the
49
+ // <qi-evidence> block early.
28
50
  function scrubEvidenceText(text) {
29
51
  const normalised = text.normalize("NFKC");
30
52
  let out = "";
@@ -32,10 +54,7 @@ function scrubEvidenceText(text) {
32
54
  const cp = ch.codePointAt(0);
33
55
  if (cp === undefined)
34
56
  continue;
35
- const isStrippable = (cp <= 0x1f && cp !== 0x09 && cp !== 0x0a && cp !== 0x0d) ||
36
- cp === 0x7f ||
37
- (cp >= 0x80 && cp <= 0x9f);
38
- if (!isStrippable)
57
+ if (!isStrippableEvidenceCodePoint(cp))
39
58
  out += ch;
40
59
  }
41
60
  return out.replace(/<\/?qi-evidence/giu, "[evidence]");
@@ -1 +1 @@
1
- {"version":3,"file":"judgePort.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/judgePort.ts"],"names":[],"mappings":"AAUA,OAAO,EAKL,KAAK,WAAW,EAGjB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAgB,IAAI,EAAE,MAAM,CAAC;gBACjB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAQD,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,gBAAgB;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACvD;AAKD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAavD;AA8CD,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,MAAM,EACrB,aAAa,GAAE,SAAS,kBAAkB,EAAO,GAChD,SAAS,WAAW,EAAE,CAoBxB;AAkID,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB,CAW1E;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,CACd,KAAK,EAAE,gBAAgB,EACvB,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,uBAAuB,CAAC,CAAC;CACvC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CA6CnF"}
1
+ {"version":3,"file":"judgePort.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/judgePort.ts"],"names":[],"mappings":"AAUA,OAAO,EAKL,KAAK,WAAW,EAGjB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAgB,IAAI,EAAE,MAAM,CAAC;gBACjB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAQD,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,gBAAgB;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACvD;AAgCD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASvD;AA8CD,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,MAAM,EACrB,aAAa,GAAE,SAAS,kBAAkB,EAAO,GAChD,SAAS,WAAW,EAAE,CAoBxB;AAkID,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB,CAW1E;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,CACd,KAAK,EAAE,gBAAgB,EACvB,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,uBAAuB,CAAC,CAAC;CACvC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CA6CnF"}
@@ -22,9 +22,31 @@ function capabilityFor(deps, modelId) {
22
22
  ? findCapability(modelId)
23
23
  : findConfiguredCapability(deps.config, modelId);
24
24
  }
25
- // Strip C0/C1 control characters (keep tab/LF/CR) and neutralise any literal
26
- // <qi-...> delimiter so untrusted candidate/source text cannot break the prompt boundary.
27
- // Mirrors scrubEvidenceText from generationPort.ts (Issue #284 defence-in-depth).
25
+ // Invisible / directional format controls that NFKC does NOT remove: zero-width characters
26
+ // (ZWSP/ZWNJ/ZWJ, BOM/ZWNBSP) and bidirectional controls (LRM/RLM, the LRE…RLO embedding/override
27
+ // block, and the isolate block). They carry no legitimate meaning in untrusted candidate/source
28
+ // text but can smuggle homoglyph/bidi deception into the judge prompt — and into any rationale or
29
+ // finding rendered/exported from it (#278 Audit Addendum).
30
+ function isInvisibleFormatControl(cp) {
31
+ return ((cp >= 0x200b && cp <= 0x200f) || // ZWSP, ZWNJ, ZWJ, LRM, RLM
32
+ (cp >= 0x202a && cp <= 0x202e) || // LRE, RLE, PDF, LRO, RLO
33
+ (cp >= 0x2066 && cp <= 0x2069) || // LRI, RLI, FSI, PDI
34
+ cp === 0xfeff // BOM / ZWNBSP
35
+ );
36
+ }
37
+ // A code point that must be stripped from candidate/source text: C0 controls (except tab/LF/CR),
38
+ // DEL, C1 controls, or an invisible zero-width/bidi format control. Tab/LF/CR survive as legitimate
39
+ // whitespace. Kept at parity with isStrippableEvidenceCodePoint in generationPort.ts.
40
+ function isStrippableCandidateCodePoint(cp) {
41
+ return ((cp <= 0x1f && cp !== 0x09 && cp !== 0x0a && cp !== 0x0d) ||
42
+ cp === 0x7f ||
43
+ (cp >= 0x80 && cp <= 0x9f) ||
44
+ isInvisibleFormatControl(cp));
45
+ }
46
+ // Strip control / invisible format characters (keep tab/LF/CR), then neutralise any literal
47
+ // <qi-...> delimiter so untrusted candidate/source text cannot break the prompt boundary. Kept at
48
+ // parity with scrubEvidenceText in generationPort.ts (Issue #284/#278 defence-in-depth); the shared
49
+ // parity is locked by tests in judgePort.test.ts.
28
50
  export function scrubCandidateText(text) {
29
51
  const normalised = text.normalize("NFKC");
30
52
  let out = "";
@@ -32,10 +54,7 @@ export function scrubCandidateText(text) {
32
54
  const cp = ch.codePointAt(0);
33
55
  if (cp === undefined)
34
56
  continue;
35
- const isStrippable = (cp <= 0x1f && cp !== 0x09 && cp !== 0x0a && cp !== 0x0d) ||
36
- cp === 0x7f ||
37
- (cp >= 0x80 && cp <= 0x9f);
38
- if (!isStrippable)
57
+ if (!isStrippableCandidateCodePoint(cp))
39
58
  out += ch;
40
59
  }
41
60
  return out.replace(/<\/?qi-[a-z-]+/giu, "[qi-data]");
@@ -1 +1 @@
1
- {"version":3,"file":"reCheckRoutes.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/reCheckRoutes.ts"],"names":[],"mappings":"AAiDA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAgkChD,wBAAsB,eAAe,CACnC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,WAAW,CAAC,CAgCtB;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,WAAW,CAAC,CA2BtB;AAED,eAAO,MAAM,sBAAsB,EAAE,SAAS,eAAe,EAW5D,CAAC"}
1
+ {"version":3,"file":"reCheckRoutes.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/reCheckRoutes.ts"],"names":[],"mappings":"AAiDA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAkkChD,wBAAsB,eAAe,CACnC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,WAAW,CAAC,CAgCtB;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,WAAW,CAAC,CA2BtB;AAED,eAAO,MAAM,sBAAsB,EAAE,SAAS,eAAe,EAW5D,CAAC"}
@@ -269,7 +269,9 @@ function ingestSourcesForDrift(sources, ingestRunId, deps) {
269
269
  runId: ingestRunId,
270
270
  registeredAt: new Date().toISOString(),
271
271
  capsuleResolver: makeCapsuleResolver(deps),
272
- figmaSnapshotLoader: makeFigmaSnapshotLoader(deps),
272
+ // Drift must see the board's LATEST snapshot, not the pinned immutable record — a pinned
273
+ // write-once runId can never drift under its own identity (#735). Generate keeps pinning.
274
+ figmaSnapshotLoader: makeFigmaSnapshotLoader(deps, { resolveLatestByScope: true }),
273
275
  figmaVision: makeFigmaVisionHintProvider(deps),
274
276
  }),
275
277
  };
@@ -1 +1 @@
1
- {"version":3,"file":"runIngestion.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/runIngestion.ts"],"names":[],"mappings":"AASA,OAAO,EAAuB,KAAK,mBAAmB,IAAI,EAAE,EAAE,MAAM,+BAA+B,CAAC;AAqBpG,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,KAAK,EACV,+BAA+B,EAC/B,kCAAkC,EACnC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAwC9F,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,SAAgB,IAAI,EAAE,MAAM,CAAC;gBACjB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,+BAA+B,CAAC,MAAM,CAAC,CAAC;IACvD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,+BAA+B,CAAC,MAAM,CAAC,CAAC;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,iCAAiC,EAAE,CAAC;IACpE,QAAQ,CAAC,aAAa,EAAE,SAAS,+BAA+B,EAAE,CAAC;IACnE,QAAQ,CAAC,cAAc,EAAE;QACvB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;QACxC,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,iCAAiC,CAAC;KAC/D,CAAC;IACF,QAAQ,CAAC,eAAe,EAAE,SAAS,eAAe,EAAE,CAAC;IACrD,yFAAyF;IACzF,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,SAAS,eAAe,EAAE,CAAC;CACrD;AAwvBD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,kCAAkC,CAAC;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,gHAAgH;IAChH,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACvD;;;OAGG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC/D;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;CAC5D;AAsED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,iBAAiB,CAiDtF"}
1
+ {"version":3,"file":"runIngestion.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/runIngestion.ts"],"names":[],"mappings":"AASA,OAAO,EAAuB,KAAK,mBAAmB,IAAI,EAAE,EAAE,MAAM,+BAA+B,CAAC;AAqBpG,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,KAAK,EACV,+BAA+B,EAC/B,kCAAkC,EACnC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAyC9F,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,SAAgB,IAAI,EAAE,MAAM,CAAC;gBACjB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,+BAA+B,CAAC,MAAM,CAAC,CAAC;IACvD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,+BAA+B,CAAC,MAAM,CAAC,CAAC;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,iCAAiC,EAAE,CAAC;IACpE,QAAQ,CAAC,aAAa,EAAE,SAAS,+BAA+B,EAAE,CAAC;IACnE,QAAQ,CAAC,cAAc,EAAE;QACvB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;QACxC,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,iCAAiC,CAAC;KAC/D,CAAC;IACF,QAAQ,CAAC,eAAe,EAAE,SAAS,eAAe,EAAE,CAAC;IACrD,yFAAyF;IACzF,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,SAAS,eAAe,EAAE,CAAC;CACrD;AAoyBD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,kCAAkC,CAAC;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,gHAAgH;IAChH,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACvD;;;OAGG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC/D;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;CAC5D;AAsED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,iBAAiB,CAiDtF"}
@@ -25,12 +25,13 @@ function perSourceAtomBudget(total, sourceCount) {
25
25
  return total;
26
26
  return Math.max(1, Math.floor(total / sourceCount));
27
27
  }
28
- // Global per-run evidence byte budget. Each source kind (workspace / file / capsule) was previously
29
- // allowed ~192KB INDEPENDENTLY, so N large sources summed to N×192KB and blew the model prompt cap
30
- // (MAX_PROMPT_BYTES = 256KB) — failing the entire N+1 run with QI_PROMPT_TOO_LARGE (Epic #729
31
- // headline). The byte budget is now a single global pool split fairly across sources, mirroring the
32
- // atom-budget split, so the merged evidence text stays bounded regardless of N. A single source keeps
33
- // the full budget (identical to the prior single-source behaviour).
28
+ // Global per-run evidence byte budget. Each source kind (workspace / file / capsule /
29
+ // figma-snapshot) was previously allowed ~192KB INDEPENDENTLY, so N large sources summed to N×192KB
30
+ // and blew the model prompt cap (MAX_PROMPT_BYTES = 256KB) — failing the entire N+1 run with
31
+ // QI_PROMPT_TOO_LARGE (Epic #729 headline). The byte budget is now a single global pool split fairly
32
+ // across sources, mirroring the atom-budget split, so the merged evidence text stays bounded
33
+ // regardless of N. A single source keeps the full budget (identical to the prior single-source
34
+ // behaviour). figma-snapshot uses the same split via figmaScreenDocs (mirrors processCapsuleDocs).
34
35
  const EVIDENCE_BUDGET_BYTES = 196_608;
35
36
  // Never starve a source below this many bytes — a tiny share is still usable context.
36
37
  const MIN_SOURCE_BUDGET_BYTES = 4_096;
@@ -53,9 +54,33 @@ export class QiIngestionError extends Error {
53
54
  this.name = "QiIngestionError";
54
55
  }
55
56
  }
57
+ // Credential token shapes mirrored from keiko-contracts `fieldLooksUnsafe` so a connected
58
+ // source's display label can never echo a secret back to the browser-surfaced envelope
59
+ // (#277/#278 envelope display-surface invariant — the label is the only user-derived envelope
60
+ // field; localRef/origin/integrityHash are server-built and hash-derived).
61
+ const CREDENTIAL_LABEL_SHAPES = [
62
+ /AKIA[0-9A-Z]{12,}/gu,
63
+ /(?:ghp_|gho_|github_pat_)[A-Za-z0-9_]{20,}/gu,
64
+ /xox[baprs]-[A-Za-z0-9-]{10,}/gu,
65
+ /sk-[A-Za-z0-9]{16,}/gu,
66
+ /\bBearer\s+\S+/giu,
67
+ /-----BEGIN [A-Z ]*PRIVATE KEY-----/gu,
68
+ ];
56
69
  const sanitiseLabel = (label) => {
57
- const trimmed = label.replace(/https?:\/\/\S+/giu, "").trim();
58
- const safe = trimmed.length === 0 ? "Untitled source" : trimmed;
70
+ // Strip any URL authority — ANY scheme (http, file, s3, ftp, …), not just http(s) — plus the
71
+ // well-known credential token shapes, so a browser-supplied label never carries a URL or secret
72
+ // into the envelope display surface that is streamed back to the client (#277/#278).
73
+ let cleaned = label.replace(/[a-z][a-z0-9+.-]*:\/\/\S+/giu, " ");
74
+ for (const shape of CREDENTIAL_LABEL_SHAPES)
75
+ cleaned = cleaned.replace(shape, " ");
76
+ cleaned = cleaned.trim();
77
+ // Collapse an absolute POSIX / Windows-drive / UNC path label to its final segment so the
78
+ // display label never leaks the filesystem layout (the basename is the useful display token).
79
+ if (/^(?:\/|[A-Za-z]:[\\/]|\\\\)/u.test(cleaned)) {
80
+ const segments = cleaned.split(/[\\/]/u).filter((s) => s.length > 0);
81
+ cleaned = (segments[segments.length - 1] ?? "").trim();
82
+ }
83
+ const safe = cleaned.length === 0 ? "Untitled source" : cleaned;
59
84
  return safe.length > MAX_LABEL_CHARS ? `${safe.slice(0, MAX_LABEL_CHARS - 1)}…` : safe;
60
85
  };
61
86
  // Reject a source whose absolute path (any segment) names a denied credential location. isDenied
@@ -520,7 +545,14 @@ function a11yItemsByScreen(parsed) {
520
545
  // items (#811) AND its accessibility test items (#812) — concatenated, neither replacing the other —
521
546
  // through the `extraItems` seam, then optionally with vision hints. The per-run byte budget bounds
522
547
  // the cumulative corpus so an oversized board never hard-fails on QI_PROMPT_TOO_LARGE.
523
- function figmaScreenDocs(record, vision) {
548
+ // The byteBudget is the caller's fair share of the global evidence pool (Epic #729 N+1 split)
549
+ // so a figma-snapshot source never consumes more than its fair slice alongside other sources.
550
+ function figmaScreenDocs(record, vision, byteBudget) {
551
+ // Mirror processCapsuleDocs (:558-563): the per-run corpus budget is the smaller of the capsule's
552
+ // own ceiling and this source's fair share of the global evidence byte budget (Epic #729 N+1
553
+ // split). The per-document cap is likewise never larger than the per-run budget.
554
+ const perRunBudget = Math.min(CAPSULE_BUDGET_BYTES, byteBudget);
555
+ const perDocBudget = Math.min(CAPSULE_MAX_BYTES_PER_DOCUMENT, perRunBudget);
524
556
  const parsed = parseScreens(record);
525
557
  const navItems = navItemsByScreen(parsed, record.links ?? []);
526
558
  const a11yItems = a11yItemsByScreen(parsed);
@@ -530,18 +562,18 @@ function figmaScreenDocs(record, vision) {
530
562
  const extraItems = [...(navItems.get(ir.id) ?? []), ...(a11yItems.get(ir.id) ?? [])];
531
563
  const baseline = QualityIntelligenceFigma.deriveScreenTestBaseline(ir, extraItems);
532
564
  const augmented = visionAugmentedScreenText(baseline, row, vision);
533
- const capped = truncateToUtf8Bytes(redact(augmented), CAPSULE_MAX_BYTES_PER_DOCUMENT);
565
+ const capped = truncateToUtf8Bytes(redact(augmented), perDocBudget);
534
566
  if (capped.trim().length === 0)
535
567
  continue;
536
568
  const bytes = utf8ByteLength(capped);
537
- if (docs.length > 0 && totalBytes + bytes > CAPSULE_BUDGET_BYTES)
569
+ if (docs.length > 0 && totalBytes + bytes > perRunBudget)
538
570
  break;
539
571
  docs.push({ documentId: `${row.screenId} (${ir.name})`, text: capped });
540
572
  totalBytes += bytes;
541
573
  }
542
574
  return docs;
543
575
  }
544
- function ingestFigmaSnapshot(source, index, registeredAt, loader, vision) {
576
+ function ingestFigmaSnapshot(source, index, registeredAt, loader, vision, byteBudget) {
545
577
  const label = sanitiseLabel(source.label);
546
578
  const record = loader(source.snapshotRunId);
547
579
  if (record === undefined) {
@@ -550,15 +582,19 @@ function ingestFigmaSnapshot(source, index, registeredAt, loader, vision) {
550
582
  if (record.screens.length === 0) {
551
583
  throw new QiIngestionError("QI_SOURCE_EMPTY", `Figma snapshot "${label}" has no screens.`);
552
584
  }
553
- const docs = figmaScreenDocs(record, vision);
585
+ const docs = figmaScreenDocs(record, vision, byteBudget);
554
586
  if (docs.length === 0) {
555
587
  throw new QiIngestionError("QI_SOURCE_EMPTY", `Figma snapshot "${label}" produced no usable screen baseline.`);
556
588
  }
557
589
  const joinedText = docs.map((d) => d.text).join("\n");
558
590
  const envelopeId = envelopeIdFor(index, label, source.snapshotRunId);
591
+ // A stored Figma Snapshot is figma evidence, not repository context. Use the dedicated
592
+ // `figma-evidence` envelope kind (#278 AC2 "represented as an explicit connector-backed source"
593
+ // + AC4 citation/audit attribution) so the persisted envelope, source-mix priority, and any
594
+ // kind-grouped audit rollup classify it correctly instead of folding it into repo context.
559
595
  const envelope = {
560
596
  id: envelopeId,
561
- kind: "repository-context",
597
+ kind: "figma-evidence",
562
598
  displayLabel: label,
563
599
  provenance: {
564
600
  origin: `figma-snapshot:${source.snapshotRunId}`,
@@ -592,7 +628,7 @@ function ingestOne(source, index, registeredAt, capsuleResolver, figmaSnapshotLo
592
628
  if (figmaSnapshotLoader === undefined) {
593
629
  throw new QiIngestionError("QI_FIGMA_SNAPSHOT_UNAVAILABLE", "Figma-snapshot sources are unavailable: the evidence directory is not configured.");
594
630
  }
595
- return ingestFigmaSnapshot(source, index, registeredAt, figmaSnapshotLoader, figmaVision);
631
+ return ingestFigmaSnapshot(source, index, registeredAt, figmaSnapshotLoader, figmaVision, byteBudget);
596
632
  }
597
633
  }
598
634
  /**