@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
@@ -1,26 +1,32 @@
1
- // Figma connector error shapes (Epic #750, Issues #751, #758, #760).
1
+ // Figma connector error shapes (Epic #750, Issues #751, #758, #760, #884).
2
2
  //
3
3
  // Coded, safe errors for the server-side Figma connector. A FigmaConnectorError carries
4
4
  // ONLY a stable code and a fixed, secret-free message — never the PAT, never a raw Figma
5
5
  // payload, never an outbound URL or header value. Mirrors the QI connector error posture
6
6
  // in ../connectorErrors.ts so the route tier can serialise it consistently.
7
7
  //
8
- // Complete coded taxonomy (#760); every code is user-actionable. Each ticket-named category maps to
9
- // one or more codes below:
8
+ // Complete coded taxonomy (#760, #884); every code is user-actionable. Each ticket-named
9
+ // category maps to one or more codes below:
10
10
  // auth → FIGMA_TOKEN_MISSING | FIGMA_TOKEN_INVALID | FIGMA_TOKEN_EXPIRED
11
11
  // | FIGMA_TOKEN_REVOKED
12
12
  // consent → FIGMA_CONSENT_REQUIRED (no recorded read-only-scope acknowledgement)
13
13
  // scope → FIGMA_INSUFFICIENT_SCOPE
14
14
  // rate-limit → FIGMA_RATE_LIMITED
15
15
  // not-found → FIGMA_NOT_FOUND
16
- // oversized → FIGMA_OVERSIZED_SCOPE
16
+ // oversized → FIGMA_OVERSIZED_SCOPE | FIGMA_RESPONSE_TOO_LARGE
17
17
  // render-failed → FIGMA_RENDER_FAILED
18
- // proxy egress → FIGMA_PROXY_UNREACHABLE (proxy not reachable / egress refused)
19
- // | FIGMA_PROXY_EGRESS_FAILED (generic egress failure, retained for back-compat)
18
+ // proxy egress → FIGMA_PROXY_UNREACHABLE (proxy host unreachable)
19
+ // | FIGMA_PROXY_AUTH_REQUIRED (proxy requires authentication)
20
+ // | FIGMA_PROXY_BLOCKED_BY_POLICY (proxy denied the request by policy)
21
+ // | FIGMA_PROXY_EGRESS_FAILED (generic proxy egress failure, retained for back-compat)
22
+ // direct egress → FIGMA_NETWORK_UNREACHABLE (DNS/connection/socket error, no proxy)
23
+ // | FIGMA_EGRESS_TIMEOUT (request timed out before completion)
24
+ // | FIGMA_EGRESS_FAILED (generic direct egress failure; new default)
20
25
  // tls/ca → FIGMA_TLS_CA_FAILURE (custom-CA / TLS verification failure on egress)
21
26
  // FIGMA_MALFORMED_URL, FIGMA_UPSTREAM_UNAVAILABLE, and FIGMA_INTERNAL cover input and last-resort
22
27
  // faults. The proxy-aware + custom-CA HTTP client itself is #802; this connector only SURFACES
23
28
  // these proxy/TLS codes — it does not implement the proxy transport.
29
+ import { OutboundHttpEgressError, } from "@oscharko-dev/keiko-model-gateway/internal/http";
24
30
  const SAFE_MESSAGES = {
25
31
  FIGMA_MALFORMED_URL: "The supplied link is not a scoped Figma node link. Paste a board or section link that includes a node id.",
26
32
  FIGMA_TOKEN_MISSING: "The Figma connector is not configured. Set a read-only access token before fetching a board.",
@@ -33,10 +39,17 @@ const SAFE_MESSAGES = {
33
39
  FIGMA_RENDER_FAILED: "Figma could not render the requested screens. Re-run the snapshot; if it persists, connect a narrower section.",
34
40
  FIGMA_PROXY_EGRESS_FAILED: "The Figma request could not be routed through the platform egress proxy. Check proxy connectivity and try again.",
35
41
  FIGMA_PROXY_UNREACHABLE: "The platform egress proxy is unreachable. Check the proxy host and port and try again.",
42
+ FIGMA_PROXY_AUTH_REQUIRED: "The forward proxy requires authentication for the Figma egress request. Configure proxy credentials or an allow rule.",
43
+ FIGMA_PROXY_BLOCKED_BY_POLICY: "The forward proxy blocked the Figma egress request by policy. Ask the proxy operator to allow api.figma.com and the Figma render hosts.",
36
44
  FIGMA_TLS_CA_FAILURE: "The TLS certificate for the Figma egress could not be verified. Check the configured certificate authority bundle and try again.",
37
45
  FIGMA_OVERSIZED_SCOPE: "The requested Figma node subtree is too large for a single scoped fetch. Connect a narrower section.",
46
+ FIGMA_RESPONSE_TOO_LARGE: "The Figma API response exceeded the maximum allowed size. Connect a narrower section to reduce the response.",
38
47
  FIGMA_RATE_LIMITED: "Figma rate-limited the snapshot-build after repeated retries. Wait a moment and re-run the snapshot.",
39
48
  FIGMA_UPSTREAM_UNAVAILABLE: "The Figma service is currently unavailable. Try the scoped fetch again later.",
49
+ FIGMA_NETWORK_UNREACHABLE: "The outbound network request to Figma failed (DNS, connection, or socket error). Check network connectivity and egress policy.",
50
+ FIGMA_EGRESS_TIMEOUT: "The Figma request timed out before completing. Retry; if it persists, raise KEIKO_FIGMA_REQUEST_TIMEOUT_MS or check upstream latency.",
51
+ FIGMA_EGRESS_FAILED: "The outbound request to Figma failed before a response was received.",
52
+ FIGMA_BUILD_TIMEOUT: "The snapshot build exceeded the configured deadline. No partial snapshot was stored. Retry or raise KEIKO_FIGMA_BUILD_DEADLINE_MS.",
40
53
  FIGMA_INTERNAL: "The Figma connector could not service the request.",
41
54
  };
42
55
  export const figmaConnectorErrorBody = (code) => ({
@@ -60,7 +73,9 @@ const TLS_CODES = new Set([
60
73
  "UNABLE_TO_GET_ISSUER_CERT",
61
74
  "UNABLE_TO_GET_ISSUER_CERT_LOCALLY",
62
75
  ]);
63
- // Node.js / undici error codes that indicate a connectivity / DNS / timeout failure.
76
+ // Node.js / undici error codes that indicate a direct connectivity / DNS / socket failure.
77
+ // These are only reached when the error did NOT come through the OutboundHttpEgressError proxy
78
+ // path — a raw ECONNREFUSED means no proxy is involved.
64
79
  const CONNECTIVITY_CODES = new Set([
65
80
  "ECONNREFUSED",
66
81
  "ECONNRESET",
@@ -71,20 +86,34 @@ const CONNECTIVITY_CODES = new Set([
71
86
  "ECONNABORTED",
72
87
  "EHOSTUNREACH",
73
88
  "ENETUNREACH",
89
+ "EPROTO",
90
+ "EPERM",
91
+ "EACCES",
74
92
  "UND_ERR_CONNECT_TIMEOUT",
75
93
  "UND_ERR_HEADERS_TIMEOUT",
76
94
  "UND_ERR_BODY_TIMEOUT",
77
95
  "UND_ERR_SOCKET",
78
96
  ]);
79
- const OUTBOUND_TLS_CODES = new Set(["TLS_CA_FAILURE"]);
80
- const OUTBOUND_PROXY_UNREACHABLE_CODES = new Set(["PROXY_UNREACHABLE"]);
81
- const OUTBOUND_PROXY_EGRESS_CODES = new Set([
97
+ // Mapping from OutboundHttpEgressError codes (proxy path) to FigmaConnectorErrorCodes.
98
+ // FIGMA_PROXY_* codes are ONLY reachable through the OutboundHttpEgressError branch.
99
+ const OUTBOUND_CODE_TO_FIGMA = {
100
+ TLS_CA_FAILURE: "FIGMA_TLS_CA_FAILURE",
101
+ PROXY_UNREACHABLE: "FIGMA_PROXY_UNREACHABLE",
102
+ PROXY_AUTH_REQUIRED: "FIGMA_PROXY_AUTH_REQUIRED",
103
+ PROXY_BLOCKED_BY_POLICY: "FIGMA_PROXY_BLOCKED_BY_POLICY",
104
+ PROXY_EGRESS_FAILED: "FIGMA_PROXY_EGRESS_FAILED",
105
+ };
106
+ // String set of OutboundHttpEgressError codes for cross-package-boundary instanceof fallback.
107
+ const OUTBOUND_EGRESS_CODES = new Set([
108
+ "TLS_CA_FAILURE",
109
+ "PROXY_UNREACHABLE",
82
110
  "PROXY_AUTH_REQUIRED",
83
111
  "PROXY_BLOCKED_BY_POLICY",
84
112
  "PROXY_EGRESS_FAILED",
85
113
  ]);
86
114
  const TLS_MSG_RE = /cert|self.?signed|unable to (?:verify|get).*(issuer|cert)|tls/i;
87
- const CONNECTIVITY_MSG_RE = /socket hang ?up|network|timeout|fetch failed|econn|enotfound/i;
115
+ // "fetch failed" is the Node.js TypeError message for generic direct-network failures (undici).
116
+ const CONNECTIVITY_MSG_RE = /socket hang ?up|network|fetch failed|econn|enotfound/i;
88
117
  const extractCode = (err) => {
89
118
  if (err !== null && typeof err === "object") {
90
119
  const code = err.code;
@@ -106,33 +135,84 @@ const extractMessage = (err) => {
106
135
  return err;
107
136
  return "";
108
137
  };
138
+ const extractName = (err) => {
139
+ if (err !== null && typeof err === "object") {
140
+ const name = err.name;
141
+ if (typeof name === "string")
142
+ return name;
143
+ }
144
+ return "";
145
+ };
146
+ const extractCause = (err) => err !== null && typeof err === "object" ? err.cause : undefined;
147
+ /** Map an outbound egress code string to a FigmaConnectorErrorCode, or return undefined. */
148
+ const mapOutboundCode = (code) => {
149
+ if (!OUTBOUND_EGRESS_CODES.has(code))
150
+ return undefined;
151
+ return OUTBOUND_CODE_TO_FIGMA[code] ?? "FIGMA_PROXY_EGRESS_FAILED";
152
+ };
153
+ // Cross-package-boundary fallback: plain Error with a string .code in the outbound set.
154
+ // Used when instanceof check fails because OutboundHttpEgressError came from a different
155
+ // package copy (e.g. stale dist during tests).
156
+ const mapOutboundCodeFallback = (topCode, causeCode) => {
157
+ if (topCode !== undefined && OUTBOUND_EGRESS_CODES.has(topCode)) {
158
+ return mapOutboundCode(topCode) ?? "FIGMA_PROXY_EGRESS_FAILED";
159
+ }
160
+ if (causeCode !== undefined && OUTBOUND_EGRESS_CODES.has(causeCode)) {
161
+ return mapOutboundCode(causeCode) ?? "FIGMA_PROXY_EGRESS_FAILED";
162
+ }
163
+ return undefined;
164
+ };
165
+ // (a) OutboundHttpEgressError path — a proxy was genuinely in play.
166
+ // FIGMA_PROXY_* codes are ONLY reachable through this function.
167
+ const classifyOutbound = (err, cause, topCode, causeCode) => {
168
+ const outbound = err instanceof OutboundHttpEgressError
169
+ ? err
170
+ : cause instanceof OutboundHttpEgressError
171
+ ? cause
172
+ : undefined;
173
+ if (outbound !== undefined)
174
+ return mapOutboundCode(outbound.code) ?? "FIGMA_PROXY_EGRESS_FAILED";
175
+ return mapOutboundCodeFallback(topCode, causeCode);
176
+ };
177
+ // (b) TLS by code or message.
178
+ const classifyTls = (code, msg) => (code !== undefined && TLS_CODES.has(code)) || TLS_MSG_RE.test(msg)
179
+ ? "FIGMA_TLS_CA_FAILURE"
180
+ : undefined;
181
+ // (c) Timeout / abort names — check both err and its cause.
182
+ const isAbortName = (name) => name === "TimeoutError" || name === "AbortError";
183
+ const classifyTimeout = (err, cause) => isAbortName(extractName(err)) || isAbortName(extractName(cause))
184
+ ? "FIGMA_EGRESS_TIMEOUT"
185
+ : undefined;
186
+ // (d) Direct connectivity codes / messages — no proxy involved.
187
+ const classifyConnectivity = (code, msg) => (code !== undefined && CONNECTIVITY_CODES.has(code)) || CONNECTIVITY_MSG_RE.test(msg)
188
+ ? "FIGMA_NETWORK_UNREACHABLE"
189
+ : undefined;
109
190
  /**
110
191
  * Classify a transport-level throw from `fetch` or the body read into a stable
111
192
  * {@link FigmaConnectorErrorCode}. Side-effect-free and total — any non-Error
112
- * throwable (string, undefined) maps to `FIGMA_PROXY_EGRESS_FAILED`.
193
+ * throwable (string, undefined) maps to `FIGMA_EGRESS_FAILED`.
194
+ *
195
+ * Precedence:
196
+ * (a) OutboundHttpEgressError (or plain Error with outbound code, for cross-package resilience)
197
+ * → proxy/TLS-via-proxy codes. FIGMA_PROXY_* codes are ONLY reachable via this branch.
198
+ * (b) TLS trust codes / messages → FIGMA_TLS_CA_FAILURE.
199
+ * (c) Timeout / abort names (DOMException AbortError, Node TimeoutError) → FIGMA_EGRESS_TIMEOUT.
200
+ * (d) Direct connectivity codes / messages → FIGMA_NETWORK_UNREACHABLE.
201
+ * (e) Default → FIGMA_EGRESS_FAILED.
113
202
  *
114
203
  * Inspects `err.code`, `err.cause.code`, and `err.message` in that order of
115
204
  * precedence so Node.js `TypeError: fetch failed` wrappers (undici wraps the
116
205
  * underlying `cause.code`) are classified correctly.
117
206
  */
118
207
  export const classifyFigmaTransportError = (err) => {
119
- const code = extractCode(err) ?? extractCauseCode(err);
120
- if (code !== undefined) {
121
- if (OUTBOUND_TLS_CODES.has(code))
122
- return "FIGMA_TLS_CA_FAILURE";
123
- if (OUTBOUND_PROXY_UNREACHABLE_CODES.has(code))
124
- return "FIGMA_PROXY_UNREACHABLE";
125
- if (OUTBOUND_PROXY_EGRESS_CODES.has(code))
126
- return "FIGMA_PROXY_EGRESS_FAILED";
127
- if (TLS_CODES.has(code))
128
- return "FIGMA_TLS_CA_FAILURE";
129
- if (CONNECTIVITY_CODES.has(code))
130
- return "FIGMA_PROXY_UNREACHABLE";
131
- }
208
+ const cause = extractCause(err);
209
+ const topCode = extractCode(err);
210
+ const causeCode = extractCauseCode(err);
211
+ const code = topCode ?? causeCode;
132
212
  const msg = extractMessage(err);
133
- if (TLS_MSG_RE.test(msg))
134
- return "FIGMA_TLS_CA_FAILURE";
135
- if (CONNECTIVITY_MSG_RE.test(msg))
136
- return "FIGMA_PROXY_UNREACHABLE";
137
- return "FIGMA_PROXY_EGRESS_FAILED";
213
+ return (classifyOutbound(err, cause, topCode, causeCode) ??
214
+ classifyTls(code, msg) ??
215
+ classifyTimeout(err, cause) ??
216
+ classifyConnectivity(code, msg) ??
217
+ "FIGMA_EGRESS_FAILED");
138
218
  };
@@ -9,11 +9,20 @@ export interface FigmaHttpResponse {
9
9
  readonly headers: Readonly<Record<string, string>>;
10
10
  }
11
11
  export type FigmaHttpPort = (request: FigmaHttpRequest) => Promise<FigmaHttpResponse>;
12
+ /** Optional creation-time overrides for the default HTTP port. */
13
+ export interface FigmaHttpPortOptions {
14
+ readonly timeoutMs?: number;
15
+ readonly maxResponseBytes?: number;
16
+ }
12
17
  /**
13
18
  * Thin default adapter over the platform `fetch`. This is the ONLY place `fetch` is named.
14
- * It forwards the caller-built headers verbatim and reads the body as JSON; it does not
15
- * log, retry, or inspect the token. Resilience/backoff is out of scope here (#759); the
16
- * proxy/custom-CA transport is the platform prerequisite (#802) that replaces this adapter.
19
+ * It forwards the caller-built headers verbatim and reads the body as JSON with an explicit
20
+ * byte cap; it does not log, retry, or inspect the token. Resilience/backoff is out of scope
21
+ * here (#759); the proxy/custom-CA transport is the platform prerequisite (#802) that replaces
22
+ * this adapter.
23
+ *
24
+ * `redirect: "manual"` prevents the PAT auth header from following a cross-origin redirect.
25
+ * A 3xx response surfaces as a non-2xx port result; the connector treats non-2xx as upstream error.
17
26
  */
18
- export declare const createDefaultFigmaHttpPort: (egress?: OutboundHttpEgressConfig, fetchImpl?: typeof fetch) => FigmaHttpPort;
27
+ export declare const createDefaultFigmaHttpPort: (egress?: OutboundHttpEgressConfig, fetchImpl?: typeof fetch, options?: FigmaHttpPortOptions) => FigmaHttpPort;
19
28
  //# sourceMappingURL=figmaHttpPort.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"figmaHttpPort.d.ts","sourceRoot":"","sources":["../../../src/qualityIntelligence/figma/figmaHttpPort.ts"],"names":[],"mappings":"AAYA,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,iDAAiD,CAAC;AAEzD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAGvB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAsBtF;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,GACrC,SAAS,wBAAwB,EACjC,YAAY,OAAO,KAAK,KACvB,aAiBF,CAAC"}
1
+ {"version":3,"file":"figmaHttpPort.d.ts","sourceRoot":"","sources":["../../../src/qualityIntelligence/figma/figmaHttpPort.ts"],"names":[],"mappings":"AAgBA,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,iDAAiD,CAAC;AAQzD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAGvB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEtF,kEAAkE;AAClE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAYD;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,GACrC,SAAS,wBAAwB,EACjC,YAAY,OAAO,KAAK,EACxB,UAAU,oBAAoB,KAC7B,aA4BF,CAAC"}
@@ -8,8 +8,16 @@
8
8
  // `X-Figma-Token` auth header). The token is materialised into that header ONLY by the
9
9
  // default adapter below, immediately before the platform `fetch` call — it is never
10
10
  // logged here and never re-emitted by the port.
11
+ //
12
+ // redirect: "manual" is set so the PAT auth header can never silently follow a
13
+ // cross-origin redirect. A 3xx response surfaces as a non-2xx status; the connector
14
+ // layer treats any non-2xx as an upstream error.
11
15
  import { classifyFigmaTransportError, FigmaConnectorError } from "./figmaConnectorErrors.js";
12
- import { gatewayFetch, } from "@oscharko-dev/keiko-model-gateway/internal/http";
16
+ import { gatewayFetch, readJsonCapped, } from "@oscharko-dev/keiko-model-gateway/internal/http";
17
+ /** Default request timeout in milliseconds for Figma HTTP API calls. */
18
+ const DEFAULT_TIMEOUT_MS = 60_000;
19
+ /** Default maximum JSON response body size (10 MiB). */
20
+ const DEFAULT_MAX_RESPONSE_BYTES = 10 * 1024 * 1024;
13
21
  // Collects the response headers into a plain lower-cased map. `Headers` already lower-cases
14
22
  // names, so this is a faithful, allocation-bounded copy with no token (request-only header).
15
23
  const collectHeaders = (response) => {
@@ -19,34 +27,38 @@ const collectHeaders = (response) => {
19
27
  });
20
28
  return out;
21
29
  };
22
- const parseJsonBody = async (response) => {
23
- const text = await response.text();
24
- if (text.length === 0)
25
- return undefined;
26
- try {
27
- return JSON.parse(text);
28
- }
29
- catch {
30
- return undefined;
31
- }
32
- };
33
30
  /**
34
31
  * Thin default adapter over the platform `fetch`. This is the ONLY place `fetch` is named.
35
- * It forwards the caller-built headers verbatim and reads the body as JSON; it does not
36
- * log, retry, or inspect the token. Resilience/backoff is out of scope here (#759); the
37
- * proxy/custom-CA transport is the platform prerequisite (#802) that replaces this adapter.
32
+ * It forwards the caller-built headers verbatim and reads the body as JSON with an explicit
33
+ * byte cap; it does not log, retry, or inspect the token. Resilience/backoff is out of scope
34
+ * here (#759); the proxy/custom-CA transport is the platform prerequisite (#802) that replaces
35
+ * this adapter.
36
+ *
37
+ * `redirect: "manual"` prevents the PAT auth header from following a cross-origin redirect.
38
+ * A 3xx response surfaces as a non-2xx port result; the connector treats non-2xx as upstream error.
38
39
  */
39
- export const createDefaultFigmaHttpPort = (egress, fetchImpl) => {
40
+ export const createDefaultFigmaHttpPort = (egress, fetchImpl, options) => {
41
+ const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
42
+ const maxResponseBytes = options?.maxResponseBytes ?? DEFAULT_MAX_RESPONSE_BYTES;
40
43
  return async (request) => {
44
+ const signal = AbortSignal.timeout(timeoutMs);
41
45
  try {
42
46
  const response = await gatewayFetch(request.url, {
43
47
  method: "GET",
44
48
  headers: { ...request.headers },
49
+ redirect: "manual",
50
+ signal,
45
51
  ...(egress !== undefined ? { egress } : {}),
46
52
  ...(fetchImpl !== undefined ? { fetchImpl } : {}),
47
53
  });
48
54
  const headers = collectHeaders(response);
49
- const json = await parseJsonBody(response);
55
+ let json;
56
+ try {
57
+ json = await readJsonCapped(response, maxResponseBytes);
58
+ }
59
+ catch {
60
+ throw new FigmaConnectorError("FIGMA_RESPONSE_TOO_LARGE");
61
+ }
50
62
  return { status: response.status, json, headers };
51
63
  }
52
64
  catch (err) {
@@ -9,11 +9,21 @@ export interface FigmaRenderResponse {
9
9
  readonly headers: Readonly<Record<string, string>>;
10
10
  }
11
11
  export type FigmaRenderPort = (request: FigmaRenderRequest) => Promise<FigmaRenderResponse>;
12
+ /** Optional creation-time overrides for the default render port. */
13
+ export interface FigmaRenderPortOptions {
14
+ readonly timeoutMs?: number;
15
+ readonly maxResponseBytes?: number;
16
+ }
12
17
  /**
13
18
  * Thin default adapter over the platform `fetch`. This is the ONLY place in the render path
14
19
  * `fetch` is named. It forwards the caller-built headers verbatim and reads the body as raw
15
- * bytes; it does not log, retry, or inspect any token. Resilience/backoff is out of scope here
16
- * (#759); the proxy/custom-CA transport is the platform prerequisite (#802) that replaces this.
20
+ * bytes with an explicit byte cap; it does not log, retry, or inspect any token. Resilience/
21
+ * backoff is out of scope here (#759); the proxy/custom-CA transport is the platform
22
+ * prerequisite (#802) that replaces this.
23
+ *
24
+ * `redirect: "manual"` prevents any caller-supplied auth header from following a cross-origin
25
+ * redirect. A 3xx response surfaces as a non-2xx port result; the connector treats it as
26
+ * upstream error.
17
27
  */
18
- export declare const createDefaultFigmaRenderPort: (egress?: OutboundHttpEgressConfig, fetchImpl?: typeof fetch) => FigmaRenderPort;
28
+ export declare const createDefaultFigmaRenderPort: (egress?: OutboundHttpEgressConfig, fetchImpl?: typeof fetch, options?: FigmaRenderPortOptions) => FigmaRenderPort;
19
29
  //# sourceMappingURL=figmaRenderPort.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"figmaRenderPort.d.ts","sourceRoot":"","sources":["../../../src/qualityIntelligence/figma/figmaRenderPort.ts"],"names":[],"mappings":"AAcA,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,iDAAiD,CAAC;AAEzD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAG3B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAE5F;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,GACvC,SAAS,wBAAwB,EACjC,YAAY,OAAO,KAAK,KACvB,eAoBF,CAAC"}
1
+ {"version":3,"file":"figmaRenderPort.d.ts","sourceRoot":"","sources":["../../../src/qualityIntelligence/figma/figmaRenderPort.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,iDAAiD,CAAC;AAQzD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAG3B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAE5F,oEAAoE;AACpE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAiCD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,4BAA4B,GACvC,SAAS,wBAAwB,EACjC,YAAY,OAAO,KAAK,EACxB,UAAU,sBAAsB,KAC/B,eA0BF,CAAC"}
@@ -10,20 +10,69 @@
10
10
  // Figma auth header (the ephemeral url is pre-signed), but the seam still forwards whatever
11
11
  // headers the caller supplies so the proxy adapter can add transport headers. The token is
12
12
  // never materialised here and never logged.
13
+ //
14
+ // redirect: "manual" is set so any auth header supplied by the caller cannot follow a
15
+ // cross-origin redirect. A 3xx response surfaces as a non-2xx status; the connector
16
+ // layer treats non-2xx as upstream error.
13
17
  import { classifyFigmaTransportError, FigmaConnectorError } from "./figmaConnectorErrors.js";
14
18
  import { gatewayFetch, } from "@oscharko-dev/keiko-model-gateway/internal/http";
19
+ /** Default request timeout in milliseconds for Figma render downloads. */
20
+ const DEFAULT_TIMEOUT_MS = 60_000;
21
+ /** Default maximum render response body size (32 MiB). */
22
+ const DEFAULT_MAX_RESPONSE_BYTES = 32 * 1024 * 1024;
23
+ /**
24
+ * Read a streaming response body up to `maxBytes`, accumulating into a Uint8Array.
25
+ * Throws a {@link FigmaConnectorError} with `FIGMA_RESPONSE_TOO_LARGE` if the cap is exceeded.
26
+ */
27
+ const readBytesCapped = async (response, maxBytes) => {
28
+ if (response.body === null) {
29
+ const buffer = await response.arrayBuffer();
30
+ return new Uint8Array(buffer);
31
+ }
32
+ const reader = response.body.getReader();
33
+ const chunks = [];
34
+ let total = 0;
35
+ for (;;) {
36
+ const { done, value } = await reader.read();
37
+ if (done)
38
+ break;
39
+ total += value.byteLength;
40
+ if (total > maxBytes) {
41
+ await reader.cancel();
42
+ throw new FigmaConnectorError("FIGMA_RESPONSE_TOO_LARGE");
43
+ }
44
+ chunks.push(value);
45
+ }
46
+ const out = new Uint8Array(total);
47
+ let offset = 0;
48
+ for (const chunk of chunks) {
49
+ out.set(chunk, offset);
50
+ offset += chunk.byteLength;
51
+ }
52
+ return out;
53
+ };
15
54
  /**
16
55
  * Thin default adapter over the platform `fetch`. This is the ONLY place in the render path
17
56
  * `fetch` is named. It forwards the caller-built headers verbatim and reads the body as raw
18
- * bytes; it does not log, retry, or inspect any token. Resilience/backoff is out of scope here
19
- * (#759); the proxy/custom-CA transport is the platform prerequisite (#802) that replaces this.
57
+ * bytes with an explicit byte cap; it does not log, retry, or inspect any token. Resilience/
58
+ * backoff is out of scope here (#759); the proxy/custom-CA transport is the platform
59
+ * prerequisite (#802) that replaces this.
60
+ *
61
+ * `redirect: "manual"` prevents any caller-supplied auth header from following a cross-origin
62
+ * redirect. A 3xx response surfaces as a non-2xx port result; the connector treats it as
63
+ * upstream error.
20
64
  */
21
- export const createDefaultFigmaRenderPort = (egress, fetchImpl) => {
65
+ export const createDefaultFigmaRenderPort = (egress, fetchImpl, options) => {
66
+ const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
67
+ const maxResponseBytes = options?.maxResponseBytes ?? DEFAULT_MAX_RESPONSE_BYTES;
22
68
  return async (request) => {
69
+ const signal = AbortSignal.timeout(timeoutMs);
23
70
  try {
24
71
  const response = await gatewayFetch(request.url, {
25
72
  method: "GET",
26
73
  headers: { ...request.headers },
74
+ redirect: "manual",
75
+ signal,
27
76
  ...(egress !== undefined ? { egress } : {}),
28
77
  ...(fetchImpl !== undefined ? { fetchImpl } : {}),
29
78
  });
@@ -31,8 +80,8 @@ export const createDefaultFigmaRenderPort = (egress, fetchImpl) => {
31
80
  response.headers.forEach((value, name) => {
32
81
  headers[name] = value;
33
82
  });
34
- const buffer = await response.arrayBuffer();
35
- return { status: response.status, bytes: new Uint8Array(buffer), headers };
83
+ const bytes = await readBytesCapped(response, maxResponseBytes);
84
+ return { status: response.status, bytes, headers };
36
85
  }
37
86
  catch (err) {
38
87
  if (err instanceof FigmaConnectorError)
@@ -1 +1 @@
1
- {"version":3,"file":"figmaSnapshotBuilder.d.ts","sourceRoot":"","sources":["../../../src/qualityIntelligence/figma/figmaSnapshotBuilder.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAGV,aAAa,EAEd,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AAWzF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,EAAE,wBAAwB,CAAC,cAAc,CAAC;IACrD,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,gEAAgE;IAChE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,qEAAqE;IACrE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,wFAAwF;IACxF,QAAQ,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IACxC,qFAAqF;IACrF,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;CAClC;AA+GD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,uBAAuB,KAC7B,OAAO,CAAC,aAAa,CA6BvB,CAAC"}
1
+ {"version":3,"file":"figmaSnapshotBuilder.d.ts","sourceRoot":"","sources":["../../../src/qualityIntelligence/figma/figmaSnapshotBuilder.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAGV,aAAa,EAEd,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AAWzF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,EAAE,wBAAwB,CAAC,cAAc,CAAC;IACrD,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,gEAAgE;IAChE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,qEAAqE;IACrE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,wFAAwF;IACxF,QAAQ,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IACxC,qFAAqF;IACrF,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;CAClC;AAwLD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,uBAAuB,KAC7B,OAAO,CAAC,aAAa,CA6BvB,CAAC"}
@@ -29,6 +29,37 @@ const chunk = (items, size) => {
29
29
  out.push(items.slice(i, i + size));
30
30
  return out;
31
31
  };
32
+ // Returns true when the hostname is an IP literal or a local/loopback name that must be blocked.
33
+ const isBlockedHostname = (h) => h.length === 0 ||
34
+ /^\d+\.\d+\.\d+\.\d+$/.test(h) ||
35
+ h.startsWith("[") ||
36
+ h === "localhost" ||
37
+ h.endsWith(".localhost") ||
38
+ h.endsWith(".local");
39
+ // Validates that a render URL returned by the Figma API is safe to follow. Blocks http:
40
+ // (plaintext) and IP-literal hostnames (RFC-1918, loopback, link-local) to prevent SSRF via
41
+ // a compromised or MITM'd API response. A broad IP-block is preferred over a tight CDN
42
+ // allowlist because Figma's pre-signed render URLs span multiple AWS S3 regions/CDN fronts.
43
+ const isRenderUrlSafe = (raw) => {
44
+ let url;
45
+ try {
46
+ url = new URL(raw);
47
+ }
48
+ catch {
49
+ return false;
50
+ }
51
+ if (url.protocol !== "https:")
52
+ return false;
53
+ // Normalise: lowercase + strip exactly one trailing dot so "localhost." == "localhost".
54
+ const h = url.hostname.toLowerCase().replace(/\.$/, "");
55
+ if (isBlockedHostname(h))
56
+ return false;
57
+ // Only allow the default HTTPS port (443 or implicit) — non-standard ports indicate an
58
+ // internal service, not a CDN. url.port is "" when the port is the scheme default.
59
+ if (url.port !== "" && url.port !== "443")
60
+ return false;
61
+ return true;
62
+ };
32
63
  const buildImagesUrl = (fileKey, ids, version) => {
33
64
  const url = new URL(`${FIGMA_API_ORIGIN}/v1/images/${encodeURIComponent(fileKey)}`);
34
65
  url.searchParams.set("ids", ids.join(","));
@@ -79,24 +110,65 @@ const requestRenderUrls = async (input, screenIds) => {
79
110
  const skip = (screenId, reason) => ({
80
111
  skipped: { screenId, reason },
81
112
  });
82
- // Downloads one screen's render bytes and classifies the result into a kept screen or a skip. The
83
- // pre-signed byte download is wrapped in the same deterministic 429 backoff; a single screen still
84
- // failing after retries degrades to a skip (partial render), never aborting the whole build.
113
+ // Classifies a finished render download into a skip reason, or null when the bytes are usable.
114
+ const renderSkipReason = (response, maxBytes) => {
115
+ if (response === null)
116
+ return "render-fetch-failed";
117
+ if (response.status < 200 || response.status >= 300)
118
+ return "render-fetch-failed";
119
+ if (response.bytes.length === 0)
120
+ return "render-empty";
121
+ if (response.bytes.length > maxBytes)
122
+ return "render-oversized";
123
+ return null;
124
+ };
125
+ // Hard-egress codes for the render-byte download host (S3/CDN — a DIFFERENT host than
126
+ // api.figma.com). If the render port throws a FigmaConnectorError in this family, it means
127
+ // TLS or proxy is misconfigured for the render CDN; swallowing it would yield a "successful"
128
+ // snapshot with every screen skipped while hiding the root cause. Re-throw to abort the build,
129
+ // consistent with the DEEP_FETCH_ABORT_CODES discipline in figmaScopedPagination.ts.
130
+ // Using ReadonlySet<string> so this set is forward-compatible with the new codes
131
+ // (FIGMA_PROXY_AUTH_REQUIRED, FIGMA_PROXY_BLOCKED_BY_POLICY) landing in a parallel change to
132
+ // figmaConnectorErrors.ts without requiring a re-touch of this file.
133
+ const RENDER_EGRESS_ABORT_CODES = new Set([
134
+ "FIGMA_TLS_CA_FAILURE",
135
+ "FIGMA_PROXY_UNREACHABLE",
136
+ "FIGMA_PROXY_EGRESS_FAILED",
137
+ "FIGMA_PROXY_AUTH_REQUIRED",
138
+ "FIGMA_PROXY_BLOCKED_BY_POLICY",
139
+ ]);
140
+ // Classifies a render-port throw into a re-throw (hard egress abort) or a coded skip outcome.
141
+ // Hard-egress errors abort the whole build — they affect every screen on the same host so
142
+ // swallowing them would silently produce an empty snapshot.
143
+ const classifyRenderError = (screenId, err) => {
144
+ if (err instanceof FigmaConnectorError) {
145
+ if (RENDER_EGRESS_ABORT_CODES.has(err.code))
146
+ throw err;
147
+ return skip(screenId, `render-fetch-failed:${err.code}`);
148
+ }
149
+ return skip(screenId, "render-fetch-failed");
150
+ };
151
+ // Downloads one screen's render bytes and classifies the result into a kept screen or a skip.
152
+ // A single screen failing after retries degrades to a skip (partial render), never aborting.
153
+ // Exception: hard egress errors (TLS/proxy misconfiguration) abort via classifyRenderError.
85
154
  const resolveScreen = async (input, ir, renderUrl) => {
86
155
  if (renderUrl === null)
87
156
  return skip(ir.id, "render-url-missing");
157
+ if (!isRenderUrlSafe(renderUrl))
158
+ return skip(ir.id, "render-url-blocked");
88
159
  const maxBytes = input.maxImageBytes ?? DEFAULT_MAX_IMAGE_BYTES;
89
160
  const policy = input.retryPolicy ?? DEFAULT_FIGMA_RETRY_POLICY;
90
161
  const sleep = input.sleep ?? realFigmaRetrySleep;
91
- const response = await fetchWithBackoff(() => input.renderPort({ url: renderUrl, headers: {} }), policy, sleep).catch(() => null);
92
- if (response === null)
93
- return skip(ir.id, "render-fetch-failed");
94
- if (response.status < 200 || response.status >= 300)
95
- return skip(ir.id, "render-fetch-failed");
96
- if (response.bytes.length === 0)
97
- return skip(ir.id, "render-empty");
98
- if (response.bytes.length > maxBytes)
99
- return skip(ir.id, "render-oversized");
162
+ let response;
163
+ try {
164
+ response = await fetchWithBackoff(() => input.renderPort({ url: renderUrl, headers: {} }), policy, sleep);
165
+ }
166
+ catch (err) {
167
+ return classifyRenderError(ir.id, err);
168
+ }
169
+ const reason = renderSkipReason(response, maxBytes);
170
+ if (reason !== null)
171
+ return skip(ir.id, reason);
100
172
  const sha256 = hashBytes(response.bytes);
101
173
  const screen = {
102
174
  screenId: ir.id,
@@ -1 +1 @@
1
- {"version":3,"file":"figmaSnapshotHash.d.ts","sourceRoot":"","sources":["../../../src/qualityIntelligence/figma/figmaSnapshotHash.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AAEzF,KAAK,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,CAAC;AAyClD,kFAAkF;AAClF,eAAO,MAAM,UAAU,GAAI,UAAU,MAAM,EAAE,IAAI,QAAQ,EAAE,aAAa,MAAM,KAAG,MACV,CAAC;AAExE;;;;GAIG;AACH,eAAO,MAAM,YAAY,GACvB,uBAAuB,MAAM,EAC7B,SAAS,MAAM,GAAG,SAAS,EAC3B,WAAW,SAAS;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAAE,EAAE,KAClF,MAKF,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,UAAU,KAAG,MACI,CAAC"}
1
+ {"version":3,"file":"figmaSnapshotHash.d.ts","sourceRoot":"","sources":["../../../src/qualityIntelligence/figma/figmaSnapshotHash.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AAEzF,KAAK,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,CAAC;AAwDlD,kFAAkF;AAClF,eAAO,MAAM,UAAU,GAAI,UAAU,MAAM,EAAE,IAAI,QAAQ,EAAE,aAAa,MAAM,KAAG,MACV,CAAC;AAExE;;;;GAIG;AACH,eAAO,MAAM,YAAY,GACvB,uBAAuB,MAAM,EAC7B,SAAS,MAAM,GAAG,SAAS,EAC3B,WAAW,SAAS;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAAE,EAAE,KAClF,MAKF,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,UAAU,KAAG,MACI,CAAC"}
@@ -23,18 +23,26 @@ const canonical = (value) => {
23
23
  .map((key) => `${JSON.stringify(key)}:${canonical(record[key])}`);
24
24
  return `{${entries.join(",")}}`;
25
25
  };
26
- const stripA11yColors = (node) => {
27
- const projected = {
28
- ...node,
29
- children: node.children.map(stripA11yColors),
26
+ // Keys excluded from the integrity hash. Using a static Set + Object.entries filter avoids both
27
+ // dynamic-delete (no-dynamic-delete) and unused-var issues while keeping the whitelist explicit.
28
+ const HASH_NEUTRAL_KEYS = new Set([
29
+ "textColor",
30
+ "backgroundColor",
31
+ "layout",
32
+ "sizing",
33
+ "cornerRadius",
34
+ "typography",
35
+ ]);
36
+ const stripHashNeutralFields = (node) => {
37
+ const entries = Object.entries(node).filter(([key]) => key !== "children" && !HASH_NEUTRAL_KEYS.has(key));
38
+ return {
39
+ ...Object.fromEntries(entries),
40
+ children: node.children.map(stripHashNeutralFields),
30
41
  };
31
- delete projected.textColor;
32
- delete projected.backgroundColor;
33
- return projected;
34
42
  };
35
43
  const hashStableIr = (ir) => ({
36
44
  ...ir,
37
- root: stripA11yColors(ir.root),
45
+ root: stripHashNeutralFields(ir.root),
38
46
  });
39
47
  /** sha256 over the canonical per-screen identity: {screenId, ir, imageSha256}. */
40
48
  export const hashScreen = (screenId, ir, imageSha256) => sha256Hex(canonical({ imageSha256, ir: hashStableIr(ir), screenId }));
@@ -16,8 +16,12 @@ export interface FigmaSnapshotScreen {
16
16
  /** sha256 over the canonical {screenId, ir, imageSha256} body — the per-screen drift identity. */
17
17
  readonly integrityHash: string;
18
18
  }
19
- /** Why a detected screen produced no render and was excluded from `screens` (partial-render). */
20
- export type FigmaSkippedScreenReason = "render-url-missing" | "render-fetch-failed" | "render-empty" | "render-oversized";
19
+ /** Why a detected screen produced no render and was excluded from `screens` (partial-render).
20
+ * The `render-fetch-failed` member also appears as `render-fetch-failed:<CODE>` when the fetch
21
+ * threw a FigmaConnectorError — the code suffix lets metrics distinguish an egress
22
+ * misconfiguration (e.g. `FIGMA_EGRESS_TIMEOUT`) from an unclassified network flake.
23
+ */
24
+ export type FigmaSkippedScreenReason = "render-url-missing" | "render-url-blocked" | "render-fetch-failed" | `render-fetch-failed:${string}` | "render-empty" | "render-oversized";
21
25
  export interface FigmaSkippedScreen {
22
26
  readonly screenId: string;
23
27
  readonly reason: FigmaSkippedScreenReason;
@@ -1 +1 @@
1
- {"version":3,"file":"figmaSnapshotTypes.d.ts","sourceRoot":"","sources":["../../../src/qualityIntelligence/figma/figmaSnapshotTypes.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACzF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,KAAK,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,CAAC;AAElD,+FAA+F;AAC/F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,+DAA+D;AAC/D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,kGAAkG;IAClG,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,iGAAiG;AACjG,MAAM,MAAM,wBAAwB,GAChC,oBAAoB,GACpB,qBAAqB,GACrB,cAAc,GACd,kBAAkB,CAAC;AAEvB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;CAC3C;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACjD,QAAQ,CAAC,cAAc,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACvD;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,wBAAwB,CAAC,eAAe,EAAE,CAAC;IACrE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC"}
1
+ {"version":3,"file":"figmaSnapshotTypes.d.ts","sourceRoot":"","sources":["../../../src/qualityIntelligence/figma/figmaSnapshotTypes.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACzF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,KAAK,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,CAAC;AAElD,+FAA+F;AAC/F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,+DAA+D;AAC/D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,kGAAkG;IAClG,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAChC,oBAAoB,GACpB,oBAAoB,GACpB,qBAAqB,GACrB,uBAAuB,MAAM,EAAE,GAC/B,cAAc,GACd,kBAAkB,CAAC;AAEvB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;CAC3C;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACjD,QAAQ,CAAC,cAAc,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACvD;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,wBAAwB,CAAC,eAAe,EAAE,CAAC;IACrE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC"}