@oscharko-dev/keiko-server 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (509) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/assistant-response.d.ts +6 -0
  3. package/dist/assistant-response.d.ts.map +1 -0
  4. package/dist/assistant-response.js +12 -0
  5. package/dist/browser.d.ts +11 -0
  6. package/dist/browser.d.ts.map +1 -0
  7. package/dist/browser.js +245 -0
  8. package/dist/chat-handlers.d.ts +48 -0
  9. package/dist/chat-handlers.d.ts.map +1 -0
  10. package/dist/chat-handlers.js +821 -0
  11. package/dist/chat-stream-handlers.d.ts +4 -0
  12. package/dist/chat-stream-handlers.d.ts.map +1 -0
  13. package/dist/chat-stream-handlers.js +136 -0
  14. package/dist/conversation-prompt.d.ts +8 -0
  15. package/dist/conversation-prompt.d.ts.map +1 -0
  16. package/dist/conversation-prompt.js +36 -0
  17. package/dist/conversation-validation.d.ts +26 -0
  18. package/dist/conversation-validation.d.ts.map +1 -0
  19. package/dist/conversation-validation.js +125 -0
  20. package/dist/credentialPersistence.d.ts +23 -0
  21. package/dist/credentialPersistence.d.ts.map +1 -0
  22. package/dist/credentialPersistence.js +93 -0
  23. package/dist/credentialVault.d.ts +30 -0
  24. package/dist/credentialVault.d.ts.map +1 -0
  25. package/dist/credentialVault.js +206 -0
  26. package/dist/csp.d.ts +3 -0
  27. package/dist/csp.d.ts.map +1 -0
  28. package/dist/csp.js +75 -0
  29. package/dist/deps.d.ts +78 -0
  30. package/dist/deps.d.ts.map +1 -0
  31. package/dist/deps.js +457 -0
  32. package/dist/editor/agentRoutes.d.ts +7 -0
  33. package/dist/editor/agentRoutes.d.ts.map +1 -0
  34. package/dist/editor/agentRoutes.js +197 -0
  35. package/dist/editor/assuredGateRunner.d.ts +36 -0
  36. package/dist/editor/assuredGateRunner.d.ts.map +1 -0
  37. package/dist/editor/assuredGateRunner.js +100 -0
  38. package/dist/editor/assuredPreFilter.d.ts +34 -0
  39. package/dist/editor/assuredPreFilter.d.ts.map +1 -0
  40. package/dist/editor/assuredPreFilter.js +134 -0
  41. package/dist/editor/assuredPreFilterRunner.d.ts +31 -0
  42. package/dist/editor/assuredPreFilterRunner.d.ts.map +1 -0
  43. package/dist/editor/assuredPreFilterRunner.js +312 -0
  44. package/dist/editor/builtinLanguageProviders.d.ts +6 -0
  45. package/dist/editor/builtinLanguageProviders.d.ts.map +1 -0
  46. package/dist/editor/builtinLanguageProviders.js +221 -0
  47. package/dist/editor/codingContext.d.ts +12 -0
  48. package/dist/editor/codingContext.d.ts.map +1 -0
  49. package/dist/editor/codingContext.js +121 -0
  50. package/dist/editor/codingContextEvidence.d.ts +7 -0
  51. package/dist/editor/codingContextEvidence.d.ts.map +1 -0
  52. package/dist/editor/codingContextEvidence.js +52 -0
  53. package/dist/editor/codingContextProviders.d.ts +36 -0
  54. package/dist/editor/codingContextProviders.d.ts.map +1 -0
  55. package/dist/editor/codingContextProviders.js +348 -0
  56. package/dist/editor/completionModelEvidence.d.ts +16 -0
  57. package/dist/editor/completionModelEvidence.d.ts.map +1 -0
  58. package/dist/editor/completionModelEvidence.js +50 -0
  59. package/dist/editor/completionRoutes.d.ts +37 -0
  60. package/dist/editor/completionRoutes.d.ts.map +1 -0
  61. package/dist/editor/completionRoutes.js +411 -0
  62. package/dist/editor/contextRoutes.d.ts +6 -0
  63. package/dist/editor/contextRoutes.d.ts.map +1 -0
  64. package/dist/editor/contextRoutes.js +411 -0
  65. package/dist/editor/disposableAssuredExecution.d.ts +22 -0
  66. package/dist/editor/disposableAssuredExecution.d.ts.map +1 -0
  67. package/dist/editor/disposableAssuredExecution.js +57 -0
  68. package/dist/editor/editorCompletionModel.d.ts +47 -0
  69. package/dist/editor/editorCompletionModel.d.ts.map +1 -0
  70. package/dist/editor/editorCompletionModel.js +156 -0
  71. package/dist/editor/editorInlineCompletionModel.d.ts +34 -0
  72. package/dist/editor/editorInlineCompletionModel.d.ts.map +1 -0
  73. package/dist/editor/editorInlineCompletionModel.js +112 -0
  74. package/dist/editor/editorModelTokenBudget.d.ts +46 -0
  75. package/dist/editor/editorModelTokenBudget.d.ts.map +1 -0
  76. package/dist/editor/editorModelTokenBudget.js +121 -0
  77. package/dist/editor/inlineCompletionRateLimiter.d.ts +19 -0
  78. package/dist/editor/inlineCompletionRateLimiter.d.ts.map +1 -0
  79. package/dist/editor/inlineCompletionRateLimiter.js +46 -0
  80. package/dist/editor/inlineCompletionRoutes.d.ts +26 -0
  81. package/dist/editor/inlineCompletionRoutes.d.ts.map +1 -0
  82. package/dist/editor/inlineCompletionRoutes.js +404 -0
  83. package/dist/editor/inlineCompletionTelemetryEvidence.d.ts +5 -0
  84. package/dist/editor/inlineCompletionTelemetryEvidence.d.ts.map +1 -0
  85. package/dist/editor/inlineCompletionTelemetryEvidence.js +42 -0
  86. package/dist/editor/languageCancellation.d.ts +19 -0
  87. package/dist/editor/languageCancellation.d.ts.map +1 -0
  88. package/dist/editor/languageCancellation.js +48 -0
  89. package/dist/editor/languageProvider.d.ts +39 -0
  90. package/dist/editor/languageProvider.d.ts.map +1 -0
  91. package/dist/editor/languageProvider.js +11 -0
  92. package/dist/editor/languageRoutes.d.ts +15 -0
  93. package/dist/editor/languageRoutes.d.ts.map +1 -0
  94. package/dist/editor/languageRoutes.js +106 -0
  95. package/dist/editor/languageSanitize.d.ts +8 -0
  96. package/dist/editor/languageSanitize.d.ts.map +1 -0
  97. package/dist/editor/languageSanitize.js +101 -0
  98. package/dist/editor/languageService.d.ts +36 -0
  99. package/dist/editor/languageService.d.ts.map +1 -0
  100. package/dist/editor/languageService.js +93 -0
  101. package/dist/editor/languageServiceHost.d.ts +14 -0
  102. package/dist/editor/languageServiceHost.d.ts.map +1 -0
  103. package/dist/editor/languageServiceHost.js +242 -0
  104. package/dist/editor/localKnowledgeRetrieval.d.ts +21 -0
  105. package/dist/editor/localKnowledgeRetrieval.d.ts.map +1 -0
  106. package/dist/editor/localKnowledgeRetrieval.js +44 -0
  107. package/dist/editor/patchApplyEvidence.d.ts +21 -0
  108. package/dist/editor/patchApplyEvidence.d.ts.map +1 -0
  109. package/dist/editor/patchApplyEvidence.js +87 -0
  110. package/dist/editor/patchApplyRoutes.d.ts +16 -0
  111. package/dist/editor/patchApplyRoutes.d.ts.map +1 -0
  112. package/dist/editor/patchApplyRoutes.js +307 -0
  113. package/dist/editor/postApplyVerification.d.ts +42 -0
  114. package/dist/editor/postApplyVerification.d.ts.map +1 -0
  115. package/dist/editor/postApplyVerification.js +177 -0
  116. package/dist/editor/testGenerationEvidence.d.ts +6 -0
  117. package/dist/editor/testGenerationEvidence.d.ts.map +1 -0
  118. package/dist/editor/testGenerationEvidence.js +72 -0
  119. package/dist/editor/testGenerationPatch.d.ts +10 -0
  120. package/dist/editor/testGenerationPatch.d.ts.map +1 -0
  121. package/dist/editor/testGenerationPatch.js +66 -0
  122. package/dist/editor/testGenerationRoutes.d.ts +21 -0
  123. package/dist/editor/testGenerationRoutes.d.ts.map +1 -0
  124. package/dist/editor/testGenerationRoutes.js +254 -0
  125. package/dist/editor/testGenerationRunner.d.ts +23 -0
  126. package/dist/editor/testGenerationRunner.d.ts.map +1 -0
  127. package/dist/editor/testGenerationRunner.js +120 -0
  128. package/dist/editor/textOffsets.d.ts +6 -0
  129. package/dist/editor/textOffsets.d.ts.map +1 -0
  130. package/dist/editor/textOffsets.js +82 -0
  131. package/dist/editor/typescriptLanguageProvider.d.ts +3 -0
  132. package/dist/editor/typescriptLanguageProvider.d.ts.map +1 -0
  133. package/dist/editor/typescriptLanguageProvider.js +217 -0
  134. package/dist/evidence.d.ts +28 -0
  135. package/dist/evidence.d.ts.map +1 -0
  136. package/dist/evidence.js +145 -0
  137. package/dist/files-deny.d.ts +3 -0
  138. package/dist/files-deny.d.ts.map +1 -0
  139. package/dist/files-deny.js +12 -0
  140. package/dist/files.d.ts +97 -0
  141. package/dist/files.d.ts.map +1 -0
  142. package/dist/files.js +733 -0
  143. package/dist/gateway-setup.d.ts +10 -0
  144. package/dist/gateway-setup.d.ts.map +1 -0
  145. package/dist/gateway-setup.js +896 -0
  146. package/dist/governed-workflow.d.ts +17 -0
  147. package/dist/governed-workflow.d.ts.map +1 -0
  148. package/dist/governed-workflow.js +147 -0
  149. package/dist/grounded-answer.d.ts +12 -0
  150. package/dist/grounded-answer.d.ts.map +1 -0
  151. package/dist/grounded-answer.js +69 -0
  152. package/dist/grounded-context-index.d.ts +25 -0
  153. package/dist/grounded-context-index.d.ts.map +1 -0
  154. package/dist/grounded-context-index.js +169 -0
  155. package/dist/grounded-document-evidence.d.ts +28 -0
  156. package/dist/grounded-document-evidence.d.ts.map +1 -0
  157. package/dist/grounded-document-evidence.js +430 -0
  158. package/dist/grounded-handoff.d.ts +4 -0
  159. package/dist/grounded-handoff.d.ts.map +1 -0
  160. package/dist/grounded-handoff.js +445 -0
  161. package/dist/grounded-orchestrator.d.ts +43 -0
  162. package/dist/grounded-orchestrator.d.ts.map +1 -0
  163. package/dist/grounded-orchestrator.js +1445 -0
  164. package/dist/grounded-prompt.d.ts +2 -0
  165. package/dist/grounded-prompt.d.ts.map +1 -0
  166. package/dist/grounded-prompt.js +17 -0
  167. package/dist/grounded-qa-hybrid.d.ts +36 -0
  168. package/dist/grounded-qa-hybrid.d.ts.map +1 -0
  169. package/dist/grounded-qa-hybrid.js +762 -0
  170. package/dist/grounded-qa-multi-source.d.ts +38 -0
  171. package/dist/grounded-qa-multi-source.d.ts.map +1 -0
  172. package/dist/grounded-qa-multi-source.js +461 -0
  173. package/dist/grounded-qa.d.ts +45 -0
  174. package/dist/grounded-qa.d.ts.map +1 -0
  175. package/dist/grounded-qa.js +877 -0
  176. package/dist/grounded-rerank.d.ts +26 -0
  177. package/dist/grounded-rerank.d.ts.map +1 -0
  178. package/dist/grounded-rerank.js +72 -0
  179. package/dist/grounded-turn-registry.d.ts +23 -0
  180. package/dist/grounded-turn-registry.d.ts.map +1 -0
  181. package/dist/grounded-turn-registry.js +102 -0
  182. package/dist/headers.d.ts +3 -0
  183. package/dist/headers.d.ts.map +1 -0
  184. package/dist/headers.js +22 -0
  185. package/dist/host-check.d.ts +3 -0
  186. package/dist/host-check.d.ts.map +1 -0
  187. package/dist/host-check.js +58 -0
  188. package/dist/index.d.ts +26 -0
  189. package/dist/index.d.ts.map +1 -0
  190. package/dist/index.js +33 -0
  191. package/dist/load-csp.d.ts +3 -0
  192. package/dist/load-csp.d.ts.map +1 -0
  193. package/dist/load-csp.js +100 -0
  194. package/dist/local-knowledge-grounded-qa.d.ts +42 -0
  195. package/dist/local-knowledge-grounded-qa.d.ts.map +1 -0
  196. package/dist/local-knowledge-grounded-qa.js +678 -0
  197. package/dist/local-knowledge-handlers.d.ts +24 -0
  198. package/dist/local-knowledge-handlers.d.ts.map +1 -0
  199. package/dist/local-knowledge-handlers.js +1285 -0
  200. package/dist/local-knowledge-indexing-registry.d.ts +13 -0
  201. package/dist/local-knowledge-indexing-registry.d.ts.map +1 -0
  202. package/dist/local-knowledge-indexing-registry.js +53 -0
  203. package/dist/localKnowledgeKeyProvider.d.ts +11 -0
  204. package/dist/localKnowledgeKeyProvider.d.ts.map +1 -0
  205. package/dist/localKnowledgeKeyProvider.js +48 -0
  206. package/dist/memory-audit-event-builders.d.ts +21 -0
  207. package/dist/memory-audit-event-builders.d.ts.map +1 -0
  208. package/dist/memory-audit-event-builders.js +187 -0
  209. package/dist/memory-audit-handler.d.ts +23 -0
  210. package/dist/memory-audit-handler.d.ts.map +1 -0
  211. package/dist/memory-audit-handler.js +191 -0
  212. package/dist/memory-capture-policy.d.ts +10 -0
  213. package/dist/memory-capture-policy.d.ts.map +1 -0
  214. package/dist/memory-capture-policy.js +44 -0
  215. package/dist/memory-consolidation-handlers.d.ts +6 -0
  216. package/dist/memory-consolidation-handlers.d.ts.map +1 -0
  217. package/dist/memory-consolidation-handlers.js +491 -0
  218. package/dist/memory-consolidation-registry.d.ts +47 -0
  219. package/dist/memory-consolidation-registry.d.ts.map +1 -0
  220. package/dist/memory-consolidation-registry.js +106 -0
  221. package/dist/memory-conv-handlers.d.ts +8 -0
  222. package/dist/memory-conv-handlers.d.ts.map +1 -0
  223. package/dist/memory-conv-handlers.js +369 -0
  224. package/dist/memory-conversation-context.d.ts +13 -0
  225. package/dist/memory-conversation-context.d.ts.map +1 -0
  226. package/dist/memory-conversation-context.js +22 -0
  227. package/dist/memory-diagnostics.d.ts +29 -0
  228. package/dist/memory-diagnostics.d.ts.map +1 -0
  229. package/dist/memory-diagnostics.js +122 -0
  230. package/dist/memory-embedding.d.ts +21 -0
  231. package/dist/memory-embedding.d.ts.map +1 -0
  232. package/dist/memory-embedding.js +264 -0
  233. package/dist/memory-handlers.d.ts +19 -0
  234. package/dist/memory-handlers.d.ts.map +1 -0
  235. package/dist/memory-handlers.js +1204 -0
  236. package/dist/memory-maintenance-handlers.d.ts +35 -0
  237. package/dist/memory-maintenance-handlers.d.ts.map +1 -0
  238. package/dist/memory-maintenance-handlers.js +219 -0
  239. package/dist/memory-record-builders.d.ts +4 -0
  240. package/dist/memory-record-builders.d.ts.map +1 -0
  241. package/dist/memory-record-builders.js +19 -0
  242. package/dist/memory-retention.d.ts +31 -0
  243. package/dist/memory-retention.d.ts.map +1 -0
  244. package/dist/memory-retention.js +151 -0
  245. package/dist/memory-retrieval-signals.d.ts +12 -0
  246. package/dist/memory-retrieval-signals.d.ts.map +1 -0
  247. package/dist/memory-retrieval-signals.js +100 -0
  248. package/dist/memory-salience.d.ts +12 -0
  249. package/dist/memory-salience.d.ts.map +1 -0
  250. package/dist/memory-salience.js +154 -0
  251. package/dist/memory-scope-sanitizer.d.ts +6 -0
  252. package/dist/memory-scope-sanitizer.d.ts.map +1 -0
  253. package/dist/memory-scope-sanitizer.js +106 -0
  254. package/dist/memory-target-resolver.d.ts +4 -0
  255. package/dist/memory-target-resolver.d.ts.map +1 -0
  256. package/dist/memory-target-resolver.js +73 -0
  257. package/dist/memory-workflow-port.d.ts +14 -0
  258. package/dist/memory-workflow-port.d.ts.map +1 -0
  259. package/dist/memory-workflow-port.js +186 -0
  260. package/dist/private-json.d.ts +3 -0
  261. package/dist/private-json.d.ts.map +1 -0
  262. package/dist/private-json.js +62 -0
  263. package/dist/promptEnhancer/index.d.ts +3 -0
  264. package/dist/promptEnhancer/index.d.ts.map +1 -0
  265. package/dist/promptEnhancer/index.js +5 -0
  266. package/dist/promptEnhancer/orchestrate.d.ts +2 -0
  267. package/dist/promptEnhancer/orchestrate.d.ts.map +1 -0
  268. package/dist/promptEnhancer/orchestrate.js +5 -0
  269. package/dist/promptEnhancer/routes.d.ts +9 -0
  270. package/dist/promptEnhancer/routes.d.ts.map +1 -0
  271. package/dist/promptEnhancer/routes.js +205 -0
  272. package/dist/qualityIntelligence/capsuleAdapter.d.ts +27 -0
  273. package/dist/qualityIntelligence/capsuleAdapter.d.ts.map +1 -0
  274. package/dist/qualityIntelligence/capsuleAdapter.js +57 -0
  275. package/dist/qualityIntelligence/connectorAuthorization.d.ts +22 -0
  276. package/dist/qualityIntelligence/connectorAuthorization.d.ts.map +1 -0
  277. package/dist/qualityIntelligence/connectorAuthorization.js +35 -0
  278. package/dist/qualityIntelligence/connectorErrors.d.ts +16 -0
  279. package/dist/qualityIntelligence/connectorErrors.d.ts.map +1 -0
  280. package/dist/qualityIntelligence/connectorErrors.js +56 -0
  281. package/dist/qualityIntelligence/connectorRoutes.d.ts +7 -0
  282. package/dist/qualityIntelligence/connectorRoutes.d.ts.map +1 -0
  283. package/dist/qualityIntelligence/connectorRoutes.js +167 -0
  284. package/dist/qualityIntelligence/editRoutes.d.ts +5 -0
  285. package/dist/qualityIntelligence/editRoutes.d.ts.map +1 -0
  286. package/dist/qualityIntelligence/editRoutes.js +293 -0
  287. package/dist/qualityIntelligence/exportAssembly.d.ts +22 -0
  288. package/dist/qualityIntelligence/exportAssembly.d.ts.map +1 -0
  289. package/dist/qualityIntelligence/exportAssembly.js +352 -0
  290. package/dist/qualityIntelligence/exportRoutes.d.ts +5 -0
  291. package/dist/qualityIntelligence/exportRoutes.d.ts.map +1 -0
  292. package/dist/qualityIntelligence/exportRoutes.js +320 -0
  293. package/dist/qualityIntelligence/figma/figmaConcurrency.d.ts +8 -0
  294. package/dist/qualityIntelligence/figma/figmaConcurrency.d.ts.map +1 -0
  295. package/dist/qualityIntelligence/figma/figmaConcurrency.js +34 -0
  296. package/dist/qualityIntelligence/figma/figmaConnector.d.ts +65 -0
  297. package/dist/qualityIntelligence/figma/figmaConnector.d.ts.map +1 -0
  298. package/dist/qualityIntelligence/figma/figmaConnector.js +184 -0
  299. package/dist/qualityIntelligence/figma/figmaConnectorAudit.d.ts +52 -0
  300. package/dist/qualityIntelligence/figma/figmaConnectorAudit.d.ts.map +1 -0
  301. package/dist/qualityIntelligence/figma/figmaConnectorAudit.js +63 -0
  302. package/dist/qualityIntelligence/figma/figmaConnectorErrors.d.ts +31 -0
  303. package/dist/qualityIntelligence/figma/figmaConnectorErrors.d.ts.map +1 -0
  304. package/dist/qualityIntelligence/figma/figmaConnectorErrors.js +220 -0
  305. package/dist/qualityIntelligence/figma/figmaConnectorMetrics.d.ts +44 -0
  306. package/dist/qualityIntelligence/figma/figmaConnectorMetrics.d.ts.map +1 -0
  307. package/dist/qualityIntelligence/figma/figmaConnectorMetrics.js +49 -0
  308. package/dist/qualityIntelligence/figma/figmaConsent.d.ts +39 -0
  309. package/dist/qualityIntelligence/figma/figmaConsent.d.ts.map +1 -0
  310. package/dist/qualityIntelligence/figma/figmaConsent.js +62 -0
  311. package/dist/qualityIntelligence/figma/figmaHttpPort.d.ts +28 -0
  312. package/dist/qualityIntelligence/figma/figmaHttpPort.d.ts.map +1 -0
  313. package/dist/qualityIntelligence/figma/figmaHttpPort.js +70 -0
  314. package/dist/qualityIntelligence/figma/figmaObservedActions.d.ts +49 -0
  315. package/dist/qualityIntelligence/figma/figmaObservedActions.d.ts.map +1 -0
  316. package/dist/qualityIntelligence/figma/figmaObservedActions.js +89 -0
  317. package/dist/qualityIntelligence/figma/figmaReadiness.d.ts +32 -0
  318. package/dist/qualityIntelligence/figma/figmaReadiness.d.ts.map +1 -0
  319. package/dist/qualityIntelligence/figma/figmaReadiness.js +67 -0
  320. package/dist/qualityIntelligence/figma/figmaRenderPort.d.ts +29 -0
  321. package/dist/qualityIntelligence/figma/figmaRenderPort.d.ts.map +1 -0
  322. package/dist/qualityIntelligence/figma/figmaRenderPort.js +93 -0
  323. package/dist/qualityIntelligence/figma/figmaResnapshot.d.ts +28 -0
  324. package/dist/qualityIntelligence/figma/figmaResnapshot.d.ts.map +1 -0
  325. package/dist/qualityIntelligence/figma/figmaResnapshot.js +38 -0
  326. package/dist/qualityIntelligence/figma/figmaRetry.d.ts +31 -0
  327. package/dist/qualityIntelligence/figma/figmaRetry.d.ts.map +1 -0
  328. package/dist/qualityIntelligence/figma/figmaRetry.js +62 -0
  329. package/dist/qualityIntelligence/figma/figmaScopeRef.d.ts +9 -0
  330. package/dist/qualityIntelligence/figma/figmaScopeRef.d.ts.map +1 -0
  331. package/dist/qualityIntelligence/figma/figmaScopeRef.js +18 -0
  332. package/dist/qualityIntelligence/figma/figmaScopedPagination.d.ts +86 -0
  333. package/dist/qualityIntelligence/figma/figmaScopedPagination.d.ts.map +1 -0
  334. package/dist/qualityIntelligence/figma/figmaScopedPagination.js +308 -0
  335. package/dist/qualityIntelligence/figma/figmaSnapshotBuilder.d.ts +31 -0
  336. package/dist/qualityIntelligence/figma/figmaSnapshotBuilder.d.ts.map +1 -0
  337. package/dist/qualityIntelligence/figma/figmaSnapshotBuilder.js +314 -0
  338. package/dist/qualityIntelligence/figma/figmaSnapshotHash.d.ts +18 -0
  339. package/dist/qualityIntelligence/figma/figmaSnapshotHash.d.ts.map +1 -0
  340. package/dist/qualityIntelligence/figma/figmaSnapshotHash.js +63 -0
  341. package/dist/qualityIntelligence/figma/figmaSnapshotTypes.d.ts +65 -0
  342. package/dist/qualityIntelligence/figma/figmaSnapshotTypes.d.ts.map +1 -0
  343. package/dist/qualityIntelligence/figma/figmaSnapshotTypes.js +13 -0
  344. package/dist/qualityIntelligence/figma/figmaTokenSource.d.ts +9 -0
  345. package/dist/qualityIntelligence/figma/figmaTokenSource.d.ts.map +1 -0
  346. package/dist/qualityIntelligence/figma/figmaTokenSource.js +61 -0
  347. package/dist/qualityIntelligence/figma/figmaTokenStore.d.ts +19 -0
  348. package/dist/qualityIntelligence/figma/figmaTokenStore.d.ts.map +1 -0
  349. package/dist/qualityIntelligence/figma/figmaTokenStore.js +156 -0
  350. package/dist/qualityIntelligence/figma/figmaUrl.d.ts +6 -0
  351. package/dist/qualityIntelligence/figma/figmaUrl.d.ts.map +1 -0
  352. package/dist/qualityIntelligence/figma/figmaUrl.js +36 -0
  353. package/dist/qualityIntelligence/figma/index.d.ts +20 -0
  354. package/dist/qualityIntelligence/figma/index.d.ts.map +1 -0
  355. package/dist/qualityIntelligence/figma/index.js +26 -0
  356. package/dist/qualityIntelligence/figmaCodegenRoutes.d.ts +28 -0
  357. package/dist/qualityIntelligence/figmaCodegenRoutes.d.ts.map +1 -0
  358. package/dist/qualityIntelligence/figmaCodegenRoutes.js +165 -0
  359. package/dist/qualityIntelligence/figmaSnapshotAdapter.d.ts +55 -0
  360. package/dist/qualityIntelligence/figmaSnapshotAdapter.d.ts.map +1 -0
  361. package/dist/qualityIntelligence/figmaSnapshotAdapter.js +219 -0
  362. package/dist/qualityIntelligence/figmaSnapshotOrchestration.d.ts +64 -0
  363. package/dist/qualityIntelligence/figmaSnapshotOrchestration.d.ts.map +1 -0
  364. package/dist/qualityIntelligence/figmaSnapshotOrchestration.js +203 -0
  365. package/dist/qualityIntelligence/figmaSnapshotRoutes.d.ts +112 -0
  366. package/dist/qualityIntelligence/figmaSnapshotRoutes.d.ts.map +1 -0
  367. package/dist/qualityIntelligence/figmaSnapshotRoutes.js +1063 -0
  368. package/dist/qualityIntelligence/figmaSnapshotScreenIds.d.ts +19 -0
  369. package/dist/qualityIntelligence/figmaSnapshotScreenIds.d.ts.map +1 -0
  370. package/dist/qualityIntelligence/figmaSnapshotScreenIds.js +75 -0
  371. package/dist/qualityIntelligence/generationPort.d.ts +15 -0
  372. package/dist/qualityIntelligence/generationPort.d.ts.map +1 -0
  373. package/dist/qualityIntelligence/generationPort.js +185 -0
  374. package/dist/qualityIntelligence/handoffErrors.d.ts +9 -0
  375. package/dist/qualityIntelligence/handoffErrors.d.ts.map +1 -0
  376. package/dist/qualityIntelligence/handoffErrors.js +21 -0
  377. package/dist/qualityIntelligence/handoffRoutes.d.ts +15 -0
  378. package/dist/qualityIntelligence/handoffRoutes.d.ts.map +1 -0
  379. package/dist/qualityIntelligence/handoffRoutes.js +341 -0
  380. package/dist/qualityIntelligence/index.d.ts +17 -0
  381. package/dist/qualityIntelligence/index.d.ts.map +1 -0
  382. package/dist/qualityIntelligence/index.js +36 -0
  383. package/dist/qualityIntelligence/judgePort.d.ts +30 -0
  384. package/dist/qualityIntelligence/judgePort.d.ts.map +1 -0
  385. package/dist/qualityIntelligence/judgePort.js +326 -0
  386. package/dist/qualityIntelligence/modelSelection.d.ts +58 -0
  387. package/dist/qualityIntelligence/modelSelection.d.ts.map +1 -0
  388. package/dist/qualityIntelligence/modelSelection.js +148 -0
  389. package/dist/qualityIntelligence/reCheckRoutes.d.ts +6 -0
  390. package/dist/qualityIntelligence/reCheckRoutes.d.ts.map +1 -0
  391. package/dist/qualityIntelligence/reCheckRoutes.js +1157 -0
  392. package/dist/qualityIntelligence/retentionEnforcement.d.ts +13 -0
  393. package/dist/qualityIntelligence/retentionEnforcement.d.ts.map +1 -0
  394. package/dist/qualityIntelligence/retentionEnforcement.js +47 -0
  395. package/dist/qualityIntelligence/retentionRoutes.d.ts +8 -0
  396. package/dist/qualityIntelligence/retentionRoutes.d.ts.map +1 -0
  397. package/dist/qualityIntelligence/retentionRoutes.js +74 -0
  398. package/dist/qualityIntelligence/reviewRoutes.d.ts +5 -0
  399. package/dist/qualityIntelligence/reviewRoutes.d.ts.map +1 -0
  400. package/dist/qualityIntelligence/reviewRoutes.js +145 -0
  401. package/dist/qualityIntelligence/reviewStore.d.ts +75 -0
  402. package/dist/qualityIntelligence/reviewStore.d.ts.map +1 -0
  403. package/dist/qualityIntelligence/reviewStore.js +170 -0
  404. package/dist/qualityIntelligence/runExecution.d.ts +36 -0
  405. package/dist/qualityIntelligence/runExecution.d.ts.map +1 -0
  406. package/dist/qualityIntelligence/runExecution.js +180 -0
  407. package/dist/qualityIntelligence/runIngestion.d.ts +70 -0
  408. package/dist/qualityIntelligence/runIngestion.d.ts.map +1 -0
  409. package/dist/qualityIntelligence/runIngestion.js +1235 -0
  410. package/dist/qualityIntelligence/runRegistry.d.ts +31 -0
  411. package/dist/qualityIntelligence/runRegistry.d.ts.map +1 -0
  412. package/dist/qualityIntelligence/runRegistry.js +66 -0
  413. package/dist/qualityIntelligence/runRoutes.d.ts +16 -0
  414. package/dist/qualityIntelligence/runRoutes.d.ts.map +1 -0
  415. package/dist/qualityIntelligence/runRoutes.js +357 -0
  416. package/dist/qualityIntelligence/traceabilityRoutes.d.ts +5 -0
  417. package/dist/qualityIntelligence/traceabilityRoutes.d.ts.map +1 -0
  418. package/dist/qualityIntelligence/traceabilityRoutes.js +173 -0
  419. package/dist/qualityIntelligence/uiRoutes.d.ts +7 -0
  420. package/dist/qualityIntelligence/uiRoutes.d.ts.map +1 -0
  421. package/dist/qualityIntelligence/uiRoutes.js +336 -0
  422. package/dist/read-handlers.d.ts +9 -0
  423. package/dist/read-handlers.d.ts.map +1 -0
  424. package/dist/read-handlers.js +265 -0
  425. package/dist/relationship-handlers.d.ts +191 -0
  426. package/dist/relationship-handlers.d.ts.map +1 -0
  427. package/dist/relationship-handlers.js +0 -0
  428. package/dist/routes.d.ts +37 -0
  429. package/dist/routes.d.ts.map +1 -0
  430. package/dist/routes.js +507 -0
  431. package/dist/run-engine.d.ts +25 -0
  432. package/dist/run-engine.d.ts.map +1 -0
  433. package/dist/run-engine.js +385 -0
  434. package/dist/run-handlers.d.ts +9 -0
  435. package/dist/run-handlers.d.ts.map +1 -0
  436. package/dist/run-handlers.js +465 -0
  437. package/dist/run-request.d.ts +17 -0
  438. package/dist/run-request.d.ts.map +1 -0
  439. package/dist/run-request.js +219 -0
  440. package/dist/runs.d.ts +47 -0
  441. package/dist/runs.d.ts.map +1 -0
  442. package/dist/runs.js +100 -0
  443. package/dist/server.d.ts +13 -0
  444. package/dist/server.d.ts.map +1 -0
  445. package/dist/server.js +152 -0
  446. package/dist/sink.d.ts +28 -0
  447. package/dist/sink.d.ts.map +1 -0
  448. package/dist/sink.js +80 -0
  449. package/dist/sse-write.d.ts +9 -0
  450. package/dist/sse-write.d.ts.map +1 -0
  451. package/dist/sse-write.js +26 -0
  452. package/dist/sse.d.ts +8 -0
  453. package/dist/sse.d.ts.map +1 -0
  454. package/dist/sse.js +27 -0
  455. package/dist/static.d.ts +5 -0
  456. package/dist/static.d.ts.map +1 -0
  457. package/dist/static.js +76 -0
  458. package/dist/store/chats.d.ts +17 -0
  459. package/dist/store/chats.d.ts.map +1 -0
  460. package/dist/store/chats.js +624 -0
  461. package/dist/store/db.d.ts +11 -0
  462. package/dist/store/db.d.ts.map +1 -0
  463. package/dist/store/db.js +203 -0
  464. package/dist/store/errors.d.ts +13 -0
  465. package/dist/store/errors.d.ts.map +1 -0
  466. package/dist/store/errors.js +30 -0
  467. package/dist/store/index.d.ts +7 -0
  468. package/dist/store/index.d.ts.map +1 -0
  469. package/dist/store/index.js +6 -0
  470. package/dist/store/messages.d.ts +8 -0
  471. package/dist/store/messages.d.ts.map +1 -0
  472. package/dist/store/messages.js +149 -0
  473. package/dist/store/paths.d.ts +5 -0
  474. package/dist/store/paths.d.ts.map +1 -0
  475. package/dist/store/paths.js +84 -0
  476. package/dist/store/projects.d.ts +8 -0
  477. package/dist/store/projects.d.ts.map +1 -0
  478. package/dist/store/projects.js +59 -0
  479. package/dist/store/relationship-audit.d.ts +42 -0
  480. package/dist/store/relationship-audit.d.ts.map +1 -0
  481. package/dist/store/relationship-audit.js +155 -0
  482. package/dist/store/relationships.d.ts +191 -0
  483. package/dist/store/relationships.d.ts.map +1 -0
  484. package/dist/store/relationships.js +724 -0
  485. package/dist/store/schema.d.ts +4 -0
  486. package/dist/store/schema.d.ts.map +1 -0
  487. package/dist/store/schema.js +220 -0
  488. package/dist/store/types.d.ts +29 -0
  489. package/dist/store/types.d.ts.map +1 -0
  490. package/dist/store/types.js +8 -0
  491. package/dist/store/validation.d.ts +7 -0
  492. package/dist/store/validation.d.ts.map +1 -0
  493. package/dist/store/validation.js +117 -0
  494. package/dist/store-handlers.d.ts +17 -0
  495. package/dist/store-handlers.d.ts.map +1 -0
  496. package/dist/store-handlers.js +872 -0
  497. package/dist/terminal-errors.d.ts +22 -0
  498. package/dist/terminal-errors.d.ts.map +1 -0
  499. package/dist/terminal-errors.js +45 -0
  500. package/dist/terminal-evidence.d.ts +21 -0
  501. package/dist/terminal-evidence.d.ts.map +1 -0
  502. package/dist/terminal-evidence.js +65 -0
  503. package/dist/terminal-routes.d.ts +10 -0
  504. package/dist/terminal-routes.d.ts.map +1 -0
  505. package/dist/terminal-routes.js +219 -0
  506. package/dist/terminal.d.ts +68 -0
  507. package/dist/terminal.d.ts.map +1 -0
  508. package/dist/terminal.js +855 -0
  509. package/package.json +52 -0
@@ -0,0 +1,219 @@
1
+ // figmaSnapshotAdapter.ts — Figma-snapshot source seam for QI ingestion (Epic #750, Issue #754).
2
+ //
3
+ // Two server-tier seams the pure-domain ingestion cannot own:
4
+ //
5
+ // 1. The snapshot LOADER — reads the immutable Figma Snapshot evidence record for a runId through
6
+ // the existing keiko-evidence store (`createNodeFigmaSnapshotStore(evidenceDir).load`). It
7
+ // reads ONLY the stored snapshot and never contacts Figma. Returns `undefined` when no
8
+ // evidence dir is configured, so the ingestion layer rejects the source with a coded error.
9
+ //
10
+ // 2. The capability-routed VISION hint provider — consults `resolveQiMultimodalSelection` (#810)
11
+ // to decide whether a multimodal model is available; when one is, it MAY call an injected
12
+ // server-owned vision call to recover image-derived semantics from the STORED render side-file,
13
+ // returning them as additive hints. There is
14
+ // NO hard-coded model id. On "unavailable", a thrown call, or a non-array/garbage result the
15
+ // provider returns `[]`, so the source degrades silently to the deterministic IR-only baseline.
16
+ // The call goes through deps.modelPortFactory / Model Gateway only — no provider SDK and no
17
+ // Figma egress after snapshot build.
18
+ import { Buffer } from "node:buffer";
19
+ import { createNodeFigmaSnapshotStore, } from "@oscharko-dev/keiko-evidence";
20
+ import { resolveQiMultimodalSelection } from "./modelSelection.js";
21
+ /**
22
+ * Build the snapshot loader. Returns `undefined` when `deps.evidenceDir` is not configured so the
23
+ * ingestion layer maps an attempted figma-snapshot source to QI_FIGMA_SNAPSHOT_UNAVAILABLE.
24
+ */
25
+ export function makeFigmaSnapshotLoader(deps, options) {
26
+ const evidenceDir = deps.evidenceDir;
27
+ if (evidenceDir === undefined || evidenceDir.length === 0)
28
+ return undefined;
29
+ const store = createNodeFigmaSnapshotStore(evidenceDir);
30
+ const resolveLatest = options?.resolveLatestByScope === true;
31
+ return (snapshotRunId) => {
32
+ try {
33
+ const pinned = store.load(snapshotRunId);
34
+ if (pinned === undefined || !resolveLatest)
35
+ return pinned;
36
+ const entries = store.listByScope(pinned.provenance.fileKey, pinned.provenance.nodeId);
37
+ const newest = entries[0];
38
+ if (newest === undefined ||
39
+ newest.runId === pinned.runId ||
40
+ newest.integrityHash === pinned.integrityHash) {
41
+ return pinned;
42
+ }
43
+ // Fall back to the pinned record when the newest record fails to load — drift detection
44
+ // must degrade to "fresh", never crash the re-check.
45
+ return store.load(newest.runId) ?? pinned;
46
+ }
47
+ catch {
48
+ // A malformed / unreadable record is treated as "not found"; the caller emits a coded error.
49
+ return undefined;
50
+ }
51
+ };
52
+ }
53
+ const MAX_VISION_IMAGE_BYTES = 4 * 1024 * 1024;
54
+ const MAX_VISION_BASELINE_BYTES = 12_000;
55
+ const MAX_VISION_HINTS = 24;
56
+ const FIGMA_VISION_TIMEOUT_MS = 30_000;
57
+ const encoder = new TextEncoder();
58
+ function utf8ByteLength(value) {
59
+ return encoder.encode(value).length;
60
+ }
61
+ function truncateUtf8(value, maxBytes) {
62
+ if (utf8ByteLength(value) <= maxBytes)
63
+ return value;
64
+ let out = "";
65
+ let bytes = 0;
66
+ for (const cp of value) {
67
+ const cpBytes = utf8ByteLength(cp);
68
+ if (bytes + cpBytes > maxBytes)
69
+ break;
70
+ out += cp;
71
+ bytes += cpBytes;
72
+ }
73
+ return out;
74
+ }
75
+ function redactedString(deps, value) {
76
+ const redacted = deps.redactor(value);
77
+ return typeof redacted === "string" ? redacted : "";
78
+ }
79
+ function sanitiseCallResult(value) {
80
+ if (!Array.isArray(value))
81
+ return [];
82
+ return value.filter((entry) => typeof entry === "string");
83
+ }
84
+ function stripJsonCodeFence(raw) {
85
+ const match = /^```(?:json)?\s*([\s\S]*?)\s*```$/iu.exec(raw);
86
+ return match?.[1]?.trim() ?? raw;
87
+ }
88
+ function parseHintResponse(raw) {
89
+ const trimmed = stripJsonCodeFence(raw.trim());
90
+ if (trimmed.length === 0)
91
+ return [];
92
+ try {
93
+ const parsed = JSON.parse(trimmed);
94
+ if (Array.isArray(parsed))
95
+ return sanitiseCallResult(parsed).slice(0, MAX_VISION_HINTS);
96
+ if (typeof parsed === "object" &&
97
+ parsed !== null &&
98
+ Array.isArray(parsed.hints)) {
99
+ return sanitiseCallResult(parsed.hints).slice(0, MAX_VISION_HINTS);
100
+ }
101
+ }
102
+ catch {
103
+ return [];
104
+ }
105
+ return [];
106
+ }
107
+ function visionUserText(request, baselineText) {
108
+ return (`Screen id: ${request.screenId}\n` +
109
+ "Structural baseline, already authoritative:\n" +
110
+ `${baselineText}\n\n` +
111
+ "Return only visual/semantic hints that are absent from the baseline.");
112
+ }
113
+ function buildVisionRequest(request, modelId, dataUrl, baselineText, structuredOutput) {
114
+ const userText = visionUserText(request, baselineText);
115
+ return {
116
+ modelId,
117
+ messages: [
118
+ {
119
+ role: "system",
120
+ content: "You are an additive UI test-generation vision pass. Use the image only to recover " +
121
+ "semantics missing from the structural baseline. Do not contradict, replace, or restate " +
122
+ "the baseline. Return concise JSON: an array of strings.",
123
+ },
124
+ {
125
+ role: "user",
126
+ content: userText,
127
+ contentParts: [
128
+ { type: "text", text: userText },
129
+ { type: "image_url", image_url: { url: dataUrl } },
130
+ ],
131
+ },
132
+ ],
133
+ ...(structuredOutput
134
+ ? {
135
+ responseFormat: {
136
+ type: "json_schema",
137
+ schema: {
138
+ type: "array",
139
+ items: { type: "string" },
140
+ maxItems: MAX_VISION_HINTS,
141
+ },
142
+ },
143
+ }
144
+ : {}),
145
+ };
146
+ }
147
+ function createVisionAbortSignal() {
148
+ const controller = new AbortController();
149
+ const timeout = setTimeout(() => {
150
+ controller.abort();
151
+ }, FIGMA_VISION_TIMEOUT_MS);
152
+ return {
153
+ signal: controller.signal,
154
+ cleanup: () => {
155
+ clearTimeout(timeout);
156
+ },
157
+ };
158
+ }
159
+ function makeGatewayFigmaVisionCall(deps, options) {
160
+ const evidenceDir = deps.evidenceDir;
161
+ if (evidenceDir === undefined || evidenceDir.length === 0)
162
+ return undefined;
163
+ const store = createNodeFigmaSnapshotStore(evidenceDir);
164
+ // Capture the structured-output flag once at closure-creation, not per screen. The multimodal
165
+ // selection is stable for the lifetime of the provider (deps is immutable after server init),
166
+ // so re-calling resolveQiMultimodalSelection on every vision call is redundant work.
167
+ const closureSelection = resolveQiMultimodalSelection(deps);
168
+ const closureModelSelection = closureSelection.kind === "model" ? closureSelection : undefined;
169
+ return async (request, modelId) => {
170
+ if (request.image.byteLength > MAX_VISION_IMAGE_BYTES)
171
+ return [];
172
+ const model = deps.modelPortFactory(modelId);
173
+ if (model === undefined)
174
+ return [];
175
+ const image = store.loadImage(request.snapshotRunId, request.image);
176
+ if (image.byteLength > MAX_VISION_IMAGE_BYTES)
177
+ return [];
178
+ const dataUrl = `data:${image.mimeType};base64,${Buffer.from(image.bytes).toString("base64")}`;
179
+ const baselineText = truncateUtf8(redactedString(deps, request.baselineText), MAX_VISION_BASELINE_BYTES);
180
+ const structuredOutput = closureModelSelection?.modelId === modelId &&
181
+ closureModelSelection.capability.supportsResponseFormat === true;
182
+ const gatewayRequest = buildVisionRequest(request, modelId, dataUrl, baselineText, structuredOutput);
183
+ const abort = createVisionAbortSignal();
184
+ try {
185
+ options.onGatewayCallAttempt?.();
186
+ const response = await model.call(gatewayRequest, abort.signal);
187
+ return parseHintResponse(redactedString(deps, response.content));
188
+ }
189
+ finally {
190
+ abort.cleanup();
191
+ }
192
+ };
193
+ }
194
+ /**
195
+ * Build a capability-routed vision hint provider. When no multimodal capability is configured (or no
196
+ * `visionCall` is injected), every request returns `[]` — the deterministic IR-only baseline path.
197
+ * When a multimodal model IS available, the provider routes the call through it; any thrown error or
198
+ * garbage result is swallowed to `[]` so a misbehaving model can never break the run or override the
199
+ * structural baseline. No model id is hard-coded — selection is via `resolveQiMultimodalSelection`.
200
+ */
201
+ export function makeFigmaVisionHintProvider(deps, visionCall, options = {}) {
202
+ const resolvedVisionCall = visionCall ?? makeGatewayFigmaVisionCall(deps, options);
203
+ const selection = resolveQiMultimodalSelection(deps);
204
+ if (selection.kind === "unavailable" || resolvedVisionCall === undefined) {
205
+ return () => [];
206
+ }
207
+ const { modelId } = selection;
208
+ return (request) => {
209
+ try {
210
+ const result = resolvedVisionCall(request, modelId);
211
+ return typeof result.then === "function"
212
+ ? Promise.resolve(result).then(sanitiseCallResult, () => [])
213
+ : sanitiseCallResult(result);
214
+ }
215
+ catch {
216
+ return [];
217
+ }
218
+ };
219
+ }
@@ -0,0 +1,64 @@
1
+ import { createFigmaTokenStore, type FigmaConnectorMetrics, type FigmaHttpPort, type FigmaKeychainAccess, type FigmaProvenance, type FigmaRenderPort, type FigmaScopeCoverage, type FigmaScopeRef, type FigmaSnapshot, type ScopedPaginationLimits } from "./figma/index.js";
2
+ import { QualityIntelligenceFigma } from "@oscharko-dev/keiko-quality-intelligence";
3
+ import type { EnvSource } from "@oscharko-dev/keiko-security";
4
+ import type { OutboundHttpEgressConfig } from "@oscharko-dev/keiko-model-gateway/internal/http";
5
+ type ScreenIrResult = QualityIntelligenceFigma.ScreenIrResult;
6
+ export interface GovernedSnapshotDeps {
7
+ readonly evidenceDir: string;
8
+ readonly env: EnvSource;
9
+ /** Wall-clock for consent + audit timestamps; injected so tests stay deterministic. */
10
+ readonly now: string;
11
+ /** When true, record the read-only-scope acknowledgement before the fetch (operator consent). */
12
+ readonly acknowledgeReadOnly?: boolean;
13
+ /**
14
+ * Route orchestration sets this true so `snapshot`/`resnapshot` success is audited only after the
15
+ * evidence record has been durably persisted and reloaded.
16
+ */
17
+ readonly deferSuccessAudit?: boolean;
18
+ /** Deep scoped-pagination overrides (#837). */
19
+ readonly pagination?: Partial<ScopedPaginationLimits>;
20
+ /** Optional pinned Figma file version. When present it is sent to the scoped REST fetch. */
21
+ readonly version?: string | undefined;
22
+ /** Optional Keiko config PAT alternate (#751). Vault remains higher precedence. */
23
+ readonly configToken?: string | undefined;
24
+ /** Shared enterprise egress settings for Figma API + render downloads (#802). */
25
+ readonly egress?: OutboundHttpEgressConfig | undefined;
26
+ /**
27
+ * Creation-time overrides forwarded to the default HTTP and render ports when no explicit
28
+ * httpPort/renderPort is injected. Currently only `timeoutMs` (maps to
29
+ * KEIKO_FIGMA_REQUEST_TIMEOUT_MS). Ignored when httpPort/renderPort are injected directly
30
+ * (route tests supply fakes that honour their own timeouts).
31
+ */
32
+ readonly portOptions?: {
33
+ readonly timeoutMs?: number;
34
+ };
35
+ readonly httpPort?: FigmaHttpPort;
36
+ readonly renderPort?: FigmaRenderPort;
37
+ readonly keychainAccess?: FigmaKeychainAccess;
38
+ }
39
+ export interface GovernedSnapshotResult {
40
+ readonly provenance: FigmaProvenance;
41
+ readonly coverage: FigmaScopeCoverage | undefined;
42
+ readonly snapshot: FigmaSnapshot;
43
+ readonly ir: ScreenIrResult;
44
+ readonly metrics: FigmaConnectorMetrics;
45
+ readonly scopeRef: FigmaScopeRef;
46
+ }
47
+ /**
48
+ * Read the encrypted-at-rest vault PAT (#758), or `undefined` when no vault token is stored or the
49
+ * vault key cannot be resolved. Highest precedence in {@link resolveFigmaToken}. Never throws — a
50
+ * missing/unreadable vault degrades to the config/env token rather than failing the build.
51
+ */
52
+ export declare const readFigmaVaultToken: (deps: GovernedSnapshotDeps) => string | undefined;
53
+ /** Build the encrypted token store for operator rotation/revocation (#758). */
54
+ export declare const figmaTokenStoreFor: (deps: Pick<GovernedSnapshotDeps, "env" | "evidenceDir" | "keychainAccess">) => ReturnType<typeof createFigmaTokenStore>;
55
+ /**
56
+ * Run the governed snapshot-build for `boardLink`: resolve the vault>config>env PAT, gate on recorded
57
+ * read-only consent BEFORE any Figma egress, perform the deep scoped-pagination fetch + render, and
58
+ * audit + compute metrics. Throws a coded {@link FigmaConnectorError} on any failure (the route maps
59
+ * it to a status) — a fetch failure is audited before it propagates, a render failure inside the
60
+ * observed wrapper likewise. `isResnapshot` only changes the audited action label.
61
+ */
62
+ export declare const governedSnapshotBuild: (boardLink: string, deps: GovernedSnapshotDeps, isResnapshot?: boolean) => Promise<GovernedSnapshotResult>;
63
+ export {};
64
+ //# sourceMappingURL=figmaSnapshotOrchestration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figmaSnapshotOrchestration.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/figmaSnapshotOrchestration.ts"],"names":[],"mappings":"AAeA,OAAO,EAOL,qBAAqB,EAUrB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAElB,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;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,+CAA+C;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACtD,4FAA4F;IAC5F,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,mFAAmF;IACnF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,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;AAsJF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAChC,WAAW,MAAM,EACjB,MAAM,oBAAoB,EAC1B,sBAAoB,KACnB,OAAO,CAAC,sBAAsB,CA+ChC,CAAC"}
@@ -0,0 +1,203 @@
1
+ // Governed Figma snapshot-build orchestration (Epic #750, Issues #758, #760, #759).
2
+ //
3
+ // The snapshot route was a thin happy-path that bypassed the governance machinery the epic's children
4
+ // built and unit-tested: the encrypted PAT vault (#758), the read-only-scope consent gate + audit
5
+ // ledger + operational metrics (#760). This module wires them into ONE governed build so every
6
+ // production snapshot is consent-gated, audited (success AND coded failure), metric-bearing, and
7
+ // resolves the PAT with the correct vault > config > env precedence — without changing any connector,
8
+ // builder, or store behaviour. Figma is contacted ONLY inside the bounded build (the boundary holds).
9
+ //
10
+ // Token handling stays server-side: the vault token (when present) flows into the connector's
11
+ // X-Figma-Token header only; it never reaches a return value, log, audit entry, metric, or snapshot.
12
+ // The vault degrades gracefully — an unconfigured vault yields `undefined` and the build falls back to
13
+ // the config/env token, so the existing env-auth path keeps working unchanged.
14
+ import { join } from "node:path";
15
+ import { appendFigmaConnectorAudit, assertReadOnlyConsent, buildFigmaSnapshot, createDefaultFigmaHttpPort, createDefaultFigmaRenderPort, createFigmaConnector, createFigmaTokenStore, deriveFigmaScopeRef, FigmaConnectorError, loadFigmaConnectorAudit, observeFigmaSnapshot, parseFigmaTarget, recordReadOnlyConsent, resolveFigmaToken, resolveScopedPaginationLimits, resolveFigmaVaultKey, } from "./figma/index.js";
16
+ import { QualityIntelligenceFigma } from "@oscharko-dev/keiko-quality-intelligence";
17
+ const FIGMA_VAULT_SUBDIR = "figma";
18
+ const FIGMA_TOKEN_VAULT_FILE = "figma-token.vault";
19
+ const tokenVaultDir = (evidenceDir) => join(evidenceDir, FIGMA_VAULT_SUBDIR);
20
+ const tokenVaultPath = (evidenceDir) => join(tokenVaultDir(evidenceDir), FIGMA_TOKEN_VAULT_FILE);
21
+ /**
22
+ * Read the encrypted-at-rest vault PAT (#758), or `undefined` when no vault token is stored or the
23
+ * vault key cannot be resolved. Highest precedence in {@link resolveFigmaToken}. Never throws — a
24
+ * missing/unreadable vault degrades to the config/env token rather than failing the build.
25
+ */
26
+ export const readFigmaVaultToken = (deps) => {
27
+ try {
28
+ const { key } = resolveFigmaVaultKey(deps.env, tokenVaultDir(deps.evidenceDir), deps.keychainAccess);
29
+ return createFigmaTokenStore({ key, storePath: tokenVaultPath(deps.evidenceDir) }).read();
30
+ }
31
+ catch {
32
+ return undefined;
33
+ }
34
+ };
35
+ /** Build the encrypted token store for operator rotation/revocation (#758). */
36
+ export const figmaTokenStoreFor = (deps) => {
37
+ const { key } = resolveFigmaVaultKey(deps.env, tokenVaultDir(deps.evidenceDir), deps.keychainAccess);
38
+ return createFigmaTokenStore({ key, storePath: tokenVaultPath(deps.evidenceDir) });
39
+ };
40
+ // Count deterministic a11y findings (#812) on the cleaned IR — the metric the #760 audit surfaces.
41
+ // Passing checks, generic expectations, and coverage notices are excluded: they record test cases or
42
+ // unverified coverage, not confirmed a11y findings.
43
+ const a11yFindingsCount = (ir) => {
44
+ let count = 0;
45
+ for (const items of QualityIntelligenceFigma.deriveA11yTestItemsByScreen(ir.screens).values()) {
46
+ for (const item of items)
47
+ if (item.category === "a11y" && item.outcome === "fail")
48
+ count += 1;
49
+ }
50
+ return count;
51
+ };
52
+ const hasSuccessfulConnectAudit = (scopeRef, evidenceDir) => loadFigmaConnectorAudit(scopeRef, evidenceDir)?.auditLog.some((entry) => entry.action === "connect" && entry.outcome === "ok") === true;
53
+ // Record (when acknowledged) and assert read-only-scope consent BEFORE any token materialisation or
54
+ // egress — an unconsented scope never reaches Figma (#760). Throws FIGMA_CONSENT_REQUIRED if missing.
55
+ const gateConsent = (deps, scopeRef) => {
56
+ if (deps.acknowledgeReadOnly === true) {
57
+ // The first acknowledgement IS the operator's "connect" gesture. Guard on the audit ledger, not
58
+ // only on consent existence: if consent was written but the audit append failed, an acknowledged
59
+ // retry must repair the missing connect marker rather than suppressing it forever.
60
+ const needsConnectAudit = !hasSuccessfulConnectAudit(scopeRef, deps.evidenceDir);
61
+ recordReadOnlyConsent({
62
+ scopeRef,
63
+ evidenceDir: deps.evidenceDir,
64
+ acknowledgedBy: "operator",
65
+ now: deps.now,
66
+ });
67
+ if (needsConnectAudit) {
68
+ appendFigmaConnectorAudit({
69
+ scopeRef,
70
+ evidenceDir: deps.evidenceDir,
71
+ action: "connect",
72
+ outcome: "ok",
73
+ now: deps.now,
74
+ });
75
+ }
76
+ }
77
+ assertReadOnlyConsent(scopeRef, deps.evidenceDir);
78
+ };
79
+ function snapshotPorts(deps) {
80
+ return {
81
+ httpPort: deps.httpPort ?? createDefaultFigmaHttpPort(deps.egress, undefined, deps.portOptions),
82
+ renderPort: deps.renderPort ?? createDefaultFigmaRenderPort(deps.egress, undefined, deps.portOptions),
83
+ };
84
+ }
85
+ function resolveBuildToken(deps, vaultToken) {
86
+ return resolveFigmaToken({
87
+ vaultToken,
88
+ configToken: deps.configToken,
89
+ envToken: deps.env.FIGMA_ACCESS_TOKEN,
90
+ });
91
+ }
92
+ function createGovernedConnector(deps, httpPort, vaultToken) {
93
+ return createFigmaConnector({
94
+ http: httpPort,
95
+ env: deps.env,
96
+ ...(vaultToken !== undefined ? { vaultToken } : {}),
97
+ config: {
98
+ ...(deps.configToken !== undefined ? { accessToken: deps.configToken } : {}),
99
+ pagination: deps.pagination ?? {},
100
+ },
101
+ });
102
+ }
103
+ function auditedResolveBuildToken(deps, vaultToken, scopeRef, action) {
104
+ try {
105
+ return resolveBuildToken(deps, vaultToken);
106
+ }
107
+ catch (error) {
108
+ appendFigmaConnectorAudit({
109
+ scopeRef,
110
+ evidenceDir: deps.evidenceDir,
111
+ action,
112
+ outcome: "error",
113
+ errorCode: error instanceof FigmaConnectorError ? error.code : "FIGMA_INTERNAL",
114
+ now: deps.now,
115
+ });
116
+ throw error;
117
+ }
118
+ }
119
+ // Deep scoped fetch with audit-on-failure: a fetch failure is recorded as a coded audit entry before
120
+ // it propagates, so the audit ledger captures the action even when the egress never produced a build.
121
+ const auditedDeepFetch = async (connector, boardLink, deps, scopeRef, action) => {
122
+ try {
123
+ return await connector.fetchScopedNodesDeep(boardLink, {
124
+ fetchedAt: deps.now,
125
+ ...(deps.version !== undefined ? { version: deps.version } : {}),
126
+ });
127
+ }
128
+ catch (error) {
129
+ appendFigmaConnectorAudit({
130
+ scopeRef,
131
+ evidenceDir: deps.evidenceDir,
132
+ action,
133
+ outcome: "error",
134
+ errorCode: error instanceof FigmaConnectorError ? error.code : "FIGMA_INTERNAL",
135
+ now: deps.now,
136
+ });
137
+ throw error;
138
+ }
139
+ };
140
+ const assertReadyForSnapshot = (scoped, deps, scopeRef, action) => {
141
+ if (scoped.readiness.ready)
142
+ return;
143
+ appendFigmaConnectorAudit({
144
+ scopeRef,
145
+ evidenceDir: deps.evidenceDir,
146
+ action,
147
+ outcome: "error",
148
+ errorCode: "FIGMA_NOT_READY",
149
+ now: deps.now,
150
+ });
151
+ throw new FigmaConnectorError("FIGMA_NOT_READY");
152
+ };
153
+ /**
154
+ * Run the governed snapshot-build for `boardLink`: resolve the vault>config>env PAT, gate on recorded
155
+ * read-only consent BEFORE any Figma egress, perform the deep scoped-pagination fetch + render, and
156
+ * audit + compute metrics. Throws a coded {@link FigmaConnectorError} on any failure (the route maps
157
+ * it to a status) — a fetch failure is audited before it propagates, a render failure inside the
158
+ * observed wrapper likewise. `isResnapshot` only changes the audited action label.
159
+ */
160
+ export const governedSnapshotBuild = async (boardLink, deps, isResnapshot = false) => {
161
+ const target = parseFigmaTarget(boardLink);
162
+ if (target === null)
163
+ throw new FigmaConnectorError("FIGMA_MALFORMED_URL");
164
+ const scopeRef = deriveFigmaScopeRef(target.fileKey, target.nodeId);
165
+ const { httpPort, renderPort } = snapshotPorts(deps);
166
+ const action = isResnapshot ? "resnapshot" : "snapshot";
167
+ gateConsent(deps, scopeRef);
168
+ const vaultToken = readFigmaVaultToken(deps);
169
+ // Render-token (vault > config > env). Throws FIGMA_TOKEN_MISSING when nothing is configured.
170
+ const token = auditedResolveBuildToken(deps, vaultToken, scopeRef, action);
171
+ const connector = createGovernedConnector(deps, httpPort, vaultToken);
172
+ const scoped = await auditedDeepFetch(connector, boardLink, deps, scopeRef, action);
173
+ assertReadyForSnapshot(scoped, deps, scopeRef, action);
174
+ const ir = QualityIntelligenceFigma.cleanScopedNodesToScreenIr(scoped.nodes);
175
+ const renderLimits = resolveScopedPaginationLimits(deps.pagination);
176
+ const observed = await observeFigmaSnapshot({
177
+ ctx: { evidenceDir: deps.evidenceDir, now: deps.now },
178
+ provenance: scoped.provenance,
179
+ ir,
180
+ // The snapshot-build itself is fully deterministic (no model) — the model-augmentation share is
181
+ // the QI test-gen concern (#754). Here it is 0/0 → a 0 model-augmented share (100% deterministic).
182
+ augmentation: { deterministic: 0, modelAugmented: 0 },
183
+ extras: { a11yFindings: a11yFindingsCount(ir) },
184
+ isResnapshot,
185
+ auditSuccess: deps.deferSuccessAudit !== true,
186
+ run: () => buildFigmaSnapshot({
187
+ ir,
188
+ provenance: scoped.provenance,
189
+ token,
190
+ imagesPort: httpPort,
191
+ renderPort,
192
+ maxScreensRendered: renderLimits.maxScreensDeep,
193
+ }),
194
+ });
195
+ return {
196
+ provenance: scoped.provenance,
197
+ coverage: scoped.coverage,
198
+ snapshot: observed.snapshot,
199
+ ir,
200
+ metrics: observed.metrics,
201
+ scopeRef,
202
+ };
203
+ };
@@ -0,0 +1,112 @@
1
+ import { type HandlerOutcome, type RouteContext, type RouteResult } from "../routes.js";
2
+ import { type UiHandlerDeps } from "../deps.js";
3
+ import type { EnvSource } from "@oscharko-dev/keiko-security";
4
+ import { type FigmaConnectorMetrics, type FigmaScopeCoverage, type ScopedPaginationLimits } from "./figma/index.js";
5
+ export interface FigmaSnapshotSummary {
6
+ readonly runId: string;
7
+ /** Mutable display name stored outside the immutable evidence record. */
8
+ readonly displayName?: string;
9
+ /** Mutable management metadata stored outside the immutable evidence record. */
10
+ readonly management: FigmaSnapshotManagementSummary;
11
+ readonly fileKey: string;
12
+ readonly nodeId: string;
13
+ readonly version: string | undefined;
14
+ readonly fetchedAt: string;
15
+ /** Total screens included in the snapshot. */
16
+ readonly screenCount: number;
17
+ /** Screens that could not be rendered (partial build). */
18
+ readonly skippedCount: number;
19
+ /**
20
+ * Human-readable reduction hint, e.g. "1 screen from 1 Figma node" or
21
+ * "3 screens from 1 section (2 skipped)".
22
+ */
23
+ readonly reductionHint: string;
24
+ /** Skipped/non-rendered screens that still carry persisted structural Screen-IR JSON. */
25
+ readonly structuralOnlyCount: number;
26
+ /** Integrity hash over the snapshot content — deterministic for drift detection (#735). */
27
+ readonly integrityHash: string;
28
+ /**
29
+ * Deep-fetch coverage telemetry (#837) — present on a freshly-built snapshot (POST response).
30
+ * Lets the UI honestly report how much of a huge instance-heavy board was deep-fetched vs
31
+ * truncated by the bounded per-screen budgets. Build-time only; never persisted in the snapshot.
32
+ */
33
+ readonly coverage?: FigmaScopeCoverage;
34
+ /**
35
+ * Operational metrics (#760) — present on POST and reloaded GET summaries: reduction
36
+ * ratio, screen/render counts, design-token count, navigation-graph size (screens + transitions),
37
+ * a11y-finding count, and the deterministic-vs-model augmentation share. All NUMBERS — never any
38
+ * board content, screen name, token, or board id.
39
+ */
40
+ readonly metrics?: FigmaConnectorMetrics;
41
+ /**
42
+ * Per-screen summary for the UI gallery. IR display names + image metadata only. The client loads
43
+ * the token-free PNG side-file through /api/figma/snapshots/:runId/screens/:screenIndex/image.
44
+ */
45
+ readonly screens: readonly FigmaScreenSummary[];
46
+ /**
47
+ * Screen-IR summaries for detected screens that have JSON evidence but no rendered PNG side-file.
48
+ * These are selectable as QI sources, but the browser cannot request an image for them.
49
+ */
50
+ readonly structuralScreens: readonly FigmaStructuralScreenSummary[];
51
+ }
52
+ export interface FigmaSnapshotManagementSummary {
53
+ readonly displayName?: string;
54
+ readonly updatedAt?: string;
55
+ }
56
+ export interface FigmaScreenSummary {
57
+ readonly screenId: string;
58
+ /** Display name derived from the IR (ir.name). */
59
+ readonly name: string;
60
+ /** A brief structural description (field count, control count) for the gallery card. */
61
+ readonly irSummary: string;
62
+ /** Relative path of the side-file (informational). */
63
+ readonly imageRelativePath: string;
64
+ /** sha256 of the rendered PNG. */
65
+ readonly imageSha256: string;
66
+ /** Byte size of the rendered PNG. */
67
+ readonly imageByteLength: number;
68
+ }
69
+ export interface FigmaStructuralScreenSummary {
70
+ readonly screenId: string;
71
+ /** Display name derived from the IR (ir.name). */
72
+ readonly name: string;
73
+ /** A brief structural description (field count, control count) for the gallery card. */
74
+ readonly irSummary: string;
75
+ /** Why no rendered PNG side-file exists for this screen. */
76
+ readonly reason: string;
77
+ }
78
+ export interface FigmaSnapshotListEntry {
79
+ readonly runId: string;
80
+ readonly displayName?: string;
81
+ readonly management: FigmaSnapshotManagementSummary;
82
+ readonly fileKey: string;
83
+ readonly nodeId: string;
84
+ readonly version: string | undefined;
85
+ readonly fetchedAt: string;
86
+ readonly screenCount: number;
87
+ readonly skippedCount: number;
88
+ readonly structuralOnlyCount: number;
89
+ readonly reductionHint: string;
90
+ readonly integrityHash: string;
91
+ }
92
+ export interface FigmaSnapshotListResponse {
93
+ readonly snapshots: readonly FigmaSnapshotListEntry[];
94
+ }
95
+ export declare function figmaPaginationFromEnv(env: EnvSource): ScopedPaginationLimits;
96
+ interface CoalescedBuildEntry {
97
+ readonly promise: Promise<RouteResult>;
98
+ }
99
+ /** Injectable for tests — returns the module-level map by default. */
100
+ export declare function makeInFlightMap(): Map<string, CoalescedBuildEntry>;
101
+ /** Reset the module-level coalescing map. Used by tests to ensure isolation. */
102
+ export declare function resetInFlightMap(): void;
103
+ export declare function handleFigmaTriggerSnapshot(ctx: RouteContext, deps: UiHandlerDeps, inFlight?: Map<string, CoalescedBuildEntry>): Promise<RouteResult>;
104
+ export declare function handleFigmaRevokeToken(ctx: RouteContext, deps: UiHandlerDeps): RouteResult;
105
+ export declare function handleFigmaListSnapshots(ctx: RouteContext, deps: UiHandlerDeps): RouteResult;
106
+ export declare function handleFigmaLoadSnapshot(ctx: RouteContext, deps: UiHandlerDeps): RouteResult;
107
+ export declare function handleFigmaUpdateSnapshotMetadata(ctx: RouteContext, deps: UiHandlerDeps): Promise<RouteResult>;
108
+ export declare function handleFigmaDeleteSnapshot(ctx: RouteContext, deps: UiHandlerDeps): RouteResult;
109
+ export declare function handleFigmaInspectSnapshotScreenJson(ctx: RouteContext, deps: UiHandlerDeps): RouteResult;
110
+ export declare function handleFigmaLoadSnapshotImage(ctx: RouteContext, deps: UiHandlerDeps): HandlerOutcome;
111
+ export {};
112
+ //# sourceMappingURL=figmaSnapshotRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figmaSnapshotRoutes.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/figmaSnapshotRoutes.ts"],"names":[],"mappings":"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"}