@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,465 @@
1
+ // The five run-engine BFF endpoints (ADR-0011 D5 routes 5–9). POST /api/runs starts a dry-run-first
2
+ // run in the background and returns 202 {runId, fingerprint}; the SSE route replays the bounded ring
3
+ // buffer (respecting Last-Event-ID) then streams live redacted events, closing after the terminal
4
+ // event; cancel propagates to the underlying harness/workflow AbortController; GET returns the
5
+ // redacted final report projection (or status:"running"); apply is the ONLY write path, re-invoking
6
+ // the same workflow with apply:true through the existing gated path. No model is ever called
7
+ // directly; no guard is reimplemented; no secret reaches any response (live payloads are redacted).
8
+ import { randomUUID } from "node:crypto";
9
+ import { parseRunRequest } from "./run-request.js";
10
+ import { startRun, applyRun } from "./run-engine.js";
11
+ import { ActiveRunLimitError } from "./runs.js";
12
+ import { SSE_HEADERS, writeEvent, readyMessage } from "./sse.js";
13
+ import { errorBody, STREAMING } from "./routes.js";
14
+ import { currentRedactionSecrets } from "./deps.js";
15
+ import { createAuditRedactor } from "@oscharko-dev/keiko-evidence";
16
+ import { WorkspaceError } from "@oscharko-dev/keiko-workspace";
17
+ import { UiStoreError } from "./store/index.js";
18
+ import { memoryCaptureCustomerMatchers } from "./memory-capture-policy.js";
19
+ const MAX_BODY_BYTES = 1_000_000;
20
+ const VERIFY_NOOP_MODEL = {
21
+ call: () => Promise.reject(new Error("verify runs must not call the model")),
22
+ };
23
+ // Sentinel thrown (and caught in handleCreateRun) when the body exceeds MAX_BODY_BYTES. Using a
24
+ // typed class avoids fragile string matching and clearly separates this case from I/O errors.
25
+ class BodyTooLargeError extends Error {
26
+ constructor() {
27
+ super("request body too large");
28
+ this.name = "BodyTooLargeError";
29
+ }
30
+ }
31
+ // Reads the request body up to a byte cap (a bounded read protects the loopback BFF from an
32
+ // oversized body). Resolves the decoded UTF-8 text, or rejects with BodyTooLargeError past the cap.
33
+ // When the cap is exceeded the stream is switched to flowing/drain mode (req.resume) so Node.js
34
+ // continues consuming the socket data and the HTTP server can still write the 413 response over
35
+ // the same connection (FIX H). The chunks array is cleared at that point to free accumulated memory.
36
+ function readBody(req) {
37
+ return new Promise((resolve, reject) => {
38
+ const chunks = [];
39
+ let total = 0;
40
+ let capped = false;
41
+ req.on("data", (chunk) => {
42
+ total += chunk.length;
43
+ if (total > MAX_BODY_BYTES) {
44
+ if (!capped) {
45
+ capped = true;
46
+ chunks.length = 0; // release accumulated buffers before draining
47
+ reject(new BodyTooLargeError());
48
+ req.resume(); // drain without buffering; lets the server write the 413 response
49
+ }
50
+ return;
51
+ }
52
+ chunks.push(chunk);
53
+ });
54
+ req.on("end", () => {
55
+ if (!capped) {
56
+ resolve(Buffer.concat(chunks).toString("utf8"));
57
+ }
58
+ });
59
+ req.on("error", reject);
60
+ });
61
+ }
62
+ // Composer-launched runs operate on the host filesystem. Reject workspaceRoot paths not registered
63
+ // in the local project store so a CSRF-equipped local client cannot trigger workflows in arbitrary
64
+ // directories. Returns a RouteResult to return, or null when the check passes.
65
+ function rejectUnregisteredWorkspace(parsed, deps) {
66
+ const root = typeof parsed.input.workspaceRoot === "string" ? parsed.input.workspaceRoot : "";
67
+ const registered = deps.store.listProjects().some((p) => p.path === root);
68
+ return registered
69
+ ? null
70
+ : {
71
+ status: 403,
72
+ body: errorBody("WORKSPACE_NOT_REGISTERED", "The workspaceRoot is not a registered project."),
73
+ };
74
+ }
75
+ function resolveRunModel(parsed, deps) {
76
+ return parsed.kind === "verify" ? VERIFY_NOOP_MODEL : deps.modelPortFactory(parsed.modelId);
77
+ }
78
+ function isRecord(value) {
79
+ return typeof value === "object" && value !== null && !Array.isArray(value);
80
+ }
81
+ function requireBodyString(body, name) {
82
+ const value = body[name];
83
+ if (typeof value !== "string" || value.length === 0) {
84
+ return { status: 400, body: errorBody("BAD_REQUEST", `Field "${name}" is required.`) };
85
+ }
86
+ return value;
87
+ }
88
+ function requireBodyNumber(body, name) {
89
+ const value = body[name];
90
+ if (typeof value !== "number" || !Number.isFinite(value)) {
91
+ return {
92
+ status: 400,
93
+ body: errorBody("BAD_REQUEST", `Field "${name}" must be a finite number.`),
94
+ };
95
+ }
96
+ return value;
97
+ }
98
+ function requireBodyRecord(body, name) {
99
+ const value = body[name];
100
+ if (!isRecord(value)) {
101
+ return { status: 400, body: errorBody("BAD_REQUEST", `Field "${name}" must be an object.`) };
102
+ }
103
+ return value;
104
+ }
105
+ function parseJsonRecord(raw) {
106
+ let parsed;
107
+ try {
108
+ parsed = JSON.parse(raw);
109
+ }
110
+ catch {
111
+ return { status: 400, body: errorBody("BAD_REQUEST", "Request body is not valid JSON.") };
112
+ }
113
+ if (!isRecord(parsed)) {
114
+ return { status: 400, body: errorBody("BAD_REQUEST", "Request body must be a JSON object.") };
115
+ }
116
+ return parsed;
117
+ }
118
+ function isRouteResult(value) {
119
+ return isRecord(value) && typeof value.status === "number" && "body" in value;
120
+ }
121
+ function chatBelongsToProject(deps, projectPath, chatId) {
122
+ return deps.store.listChats(projectPath).some((chat) => chat.id === chatId);
123
+ }
124
+ function runSummaryDiscriminator(request) {
125
+ if (request.kind === "unit-tests") {
126
+ return { workflowId: "unit-test-generation", taskType: undefined };
127
+ }
128
+ if (request.kind === "bug-investigation") {
129
+ return { workflowId: "bug-investigation", taskType: undefined };
130
+ }
131
+ if (request.kind === "explain-plan") {
132
+ return { workflowId: undefined, taskType: "explain-plan" };
133
+ }
134
+ return { workflowId: undefined, taskType: "verify" };
135
+ }
136
+ function buildChatRunMessages(body, request, chatId, runId) {
137
+ const user = requireBodyRecord(body, "user");
138
+ if (isRouteResult(user))
139
+ return user;
140
+ const summary = requireBodyRecord(body, "summary");
141
+ if (isRouteResult(summary))
142
+ return summary;
143
+ const userContent = requireBodyString(user, "content");
144
+ if (typeof userContent !== "string")
145
+ return userContent;
146
+ const userTimestamp = requireBodyNumber(user, "timestamp");
147
+ if (typeof userTimestamp !== "number")
148
+ return userTimestamp;
149
+ const summaryContent = requireBodyString(summary, "content");
150
+ if (typeof summaryContent !== "string")
151
+ return summaryContent;
152
+ const summaryTimestamp = requireBodyNumber(summary, "timestamp");
153
+ if (typeof summaryTimestamp !== "number")
154
+ return summaryTimestamp;
155
+ const discriminator = runSummaryDiscriminator(request);
156
+ return [
157
+ {
158
+ chatId,
159
+ role: "user",
160
+ content: userContent,
161
+ timestamp: userTimestamp,
162
+ runId: undefined,
163
+ workflowId: undefined,
164
+ workflowStatus: undefined,
165
+ shortResult: undefined,
166
+ taskType: undefined,
167
+ },
168
+ {
169
+ chatId,
170
+ role: "system",
171
+ content: summaryContent,
172
+ timestamp: summaryTimestamp,
173
+ runId,
174
+ workflowId: discriminator.workflowId,
175
+ workflowStatus: "running",
176
+ shortResult: undefined,
177
+ taskType: discriminator.taskType,
178
+ },
179
+ ];
180
+ }
181
+ function storeErrorResult(error) {
182
+ return { status: error.status, body: errorBody(error.code, error.message) };
183
+ }
184
+ // Static, path-safe message for workspace errors surfaced during run launch. The underlying
185
+ // WorkspaceError messages may carry absolute paths — we never echo them (ADR-0005, CWE-209).
186
+ const WORKSPACE_RUN_ERROR_MESSAGE = "The selected workspace could not be prepared: no recognized project workspace marker was found, or the target file could not be read.";
187
+ function workspaceRunErrorResult() {
188
+ return {
189
+ status: 400,
190
+ body: errorBody("WORKSPACE_UNAVAILABLE", WORKSPACE_RUN_ERROR_MESSAGE),
191
+ };
192
+ }
193
+ function markSummaryFailed(deps, message, shortResult) {
194
+ try {
195
+ deps.store.updateMessage(message.id, { workflowStatus: "failed", shortResult });
196
+ }
197
+ catch {
198
+ // Best-effort compensation only. The original start error remains the response source.
199
+ }
200
+ }
201
+ function parseChatRunEnvelope(raw, deps) {
202
+ const body = parseJsonRecord(raw);
203
+ if (isRouteResult(body))
204
+ return body;
205
+ const chatId = requireBodyString(body, "chatId");
206
+ if (isRouteResult(chatId))
207
+ return chatId;
208
+ const projectPath = requireBodyString(body, "projectPath");
209
+ if (isRouteResult(projectPath))
210
+ return projectPath;
211
+ if (!chatBelongsToProject(deps, projectPath, chatId)) {
212
+ return { status: 404, body: errorBody("NOT_FOUND", "Chat not found.") };
213
+ }
214
+ const runBody = requireBodyRecord(body, "run");
215
+ if (isRouteResult(runBody))
216
+ return runBody;
217
+ return { body, chatId, projectPath, runBody };
218
+ }
219
+ function validateChatRunRequest(runBody, deps) {
220
+ const parsed = parseRunRequest(JSON.stringify(runBody));
221
+ if ("code" in parsed) {
222
+ return { status: 400, body: errorBody(parsed.code, parsed.message) };
223
+ }
224
+ const unregistered = rejectUnregisteredWorkspace(parsed, deps);
225
+ if (unregistered !== null)
226
+ return unregistered;
227
+ const model = resolveRunModel(parsed, deps);
228
+ return model === undefined
229
+ ? { status: 400, body: errorBody("NO_MODEL", "No model provider is configured.") }
230
+ : { request: parsed, model };
231
+ }
232
+ function engineContextFor(deps, request, model) {
233
+ return {
234
+ request,
235
+ model,
236
+ registry: deps.registry,
237
+ evidence: {
238
+ store: deps.evidenceStore,
239
+ env: deps.env,
240
+ additionalSecrets: currentRedactionSecrets(deps),
241
+ },
242
+ memoryVault: deps.memoryVault,
243
+ memoryAuditRedactString: createAuditRedactor({ additionalSecrets: currentRedactionSecrets(deps) }, deps.env),
244
+ memoryCustomerIdentifierMatchers: memoryCaptureCustomerMatchers(deps),
245
+ };
246
+ }
247
+ function persistChatRunMessages(deps, envelope, request, runId) {
248
+ const messagesInput = buildChatRunMessages(envelope.body, request, envelope.chatId, runId);
249
+ if (isRouteResult(messagesInput))
250
+ return messagesInput;
251
+ try {
252
+ return deps.store.createMessages(messagesInput);
253
+ }
254
+ catch (error) {
255
+ if (error instanceof UiStoreError)
256
+ return storeErrorResult(error);
257
+ throw error;
258
+ }
259
+ }
260
+ function startPersistedChatRun(deps, request, model, runId, messages) {
261
+ try {
262
+ const run = startRun(engineContextFor(deps, request, model), deps.redactor, { runId });
263
+ return { status: 202, body: { run, messages } };
264
+ }
265
+ catch (error) {
266
+ const summary = messages[1];
267
+ if (summary !== undefined) {
268
+ markSummaryFailed(deps, summary, "Run could not be started.");
269
+ }
270
+ return mapRunStartError(error);
271
+ }
272
+ }
273
+ function mapRunStartError(error) {
274
+ if (error instanceof ActiveRunLimitError) {
275
+ return { status: 429, body: errorBody("TOO_MANY_RUNS", "The active run limit is reached.") };
276
+ }
277
+ if (error instanceof WorkspaceError) {
278
+ return workspaceRunErrorResult();
279
+ }
280
+ throw error;
281
+ }
282
+ // Route 5 — POST /api/runs. Validates the body, resolves the ModelPort, starts the run, returns 202.
283
+ export async function handleCreateRun(ctx, deps) {
284
+ let raw;
285
+ try {
286
+ raw = await readBody(ctx.req);
287
+ }
288
+ catch (error) {
289
+ if (error instanceof BodyTooLargeError) {
290
+ return {
291
+ status: 413,
292
+ body: errorBody("PAYLOAD_TOO_LARGE", "Request body exceeds the size limit."),
293
+ };
294
+ }
295
+ throw error;
296
+ }
297
+ const parsed = parseRunRequest(raw);
298
+ if ("code" in parsed) {
299
+ return { status: 400, body: errorBody(parsed.code, parsed.message) };
300
+ }
301
+ const unregistered = rejectUnregisteredWorkspace(parsed, deps);
302
+ if (unregistered !== null) {
303
+ return unregistered;
304
+ }
305
+ const model = resolveRunModel(parsed, deps);
306
+ if (model === undefined) {
307
+ return { status: 400, body: errorBody("NO_MODEL", "No model provider is configured.") };
308
+ }
309
+ const engineCtx = {
310
+ request: parsed,
311
+ model,
312
+ registry: deps.registry,
313
+ evidence: {
314
+ store: deps.evidenceStore,
315
+ env: deps.env,
316
+ additionalSecrets: currentRedactionSecrets(deps),
317
+ },
318
+ };
319
+ try {
320
+ const started = startRun(engineCtx, deps.redactor);
321
+ return { status: 202, body: { runId: started.runId, fingerprint: started.fingerprint } };
322
+ }
323
+ catch (error) {
324
+ return mapRunStartError(error);
325
+ }
326
+ }
327
+ // Route — POST /api/chats/runs. Composer-specific path that makes Issue #66's chat invariant
328
+ // explicit: a successful workflow launch first reserves a runId and persists exactly one user
329
+ // message plus one system run summary, then starts the run with that reserved runId. If persistence
330
+ // fails, no run is started; if the start is refused, the summary is terminalized as failed.
331
+ export async function handleCreateChatRun(ctx, deps) {
332
+ let raw;
333
+ try {
334
+ raw = await readBody(ctx.req);
335
+ }
336
+ catch (error) {
337
+ if (error instanceof BodyTooLargeError) {
338
+ return {
339
+ status: 413,
340
+ body: errorBody("PAYLOAD_TOO_LARGE", "Request body exceeds the size limit."),
341
+ };
342
+ }
343
+ throw error;
344
+ }
345
+ const envelope = parseChatRunEnvelope(raw, deps);
346
+ if (isRouteResult(envelope))
347
+ return envelope;
348
+ const validated = validateChatRunRequest(envelope.runBody, deps);
349
+ if (isRouteResult(validated))
350
+ return validated;
351
+ const runId = randomUUID();
352
+ const messages = persistChatRunMessages(deps, envelope, validated.request, runId);
353
+ if (isRouteResult(messages))
354
+ return messages;
355
+ return startPersistedChatRun(deps, validated.request, validated.model, runId, messages);
356
+ }
357
+ function lastEventId(req) {
358
+ const header = req.headers["last-event-id"];
359
+ const value = Array.isArray(header) ? header[0] : header;
360
+ if (value === undefined) {
361
+ return -1;
362
+ }
363
+ const parsed = Number.parseInt(value, 10);
364
+ return Number.isFinite(parsed) ? parsed : -1;
365
+ }
366
+ // Route 6 — GET /api/runs/:runId/events (SSE). Replays the ring buffer (after Last-Event-ID), sends
367
+ // `ready`, then streams live events, closing after the run terminates. The writer is detached on
368
+ // client disconnect to avoid leaks and unbounded fan-out.
369
+ export function handleRunEvents(ctx, deps) {
370
+ const record = deps.registry.get(ctx.params.runId ?? "");
371
+ if (record === undefined) {
372
+ return { status: 404, body: errorBody("NOT_FOUND", "Unknown run.") };
373
+ }
374
+ openSseStream(ctx.res, record, lastEventId(ctx.req), deps.redactor);
375
+ ctx.req.on("close", () => {
376
+ ctx.res.end();
377
+ });
378
+ return STREAMING;
379
+ }
380
+ function openSseStream(res, record, afterSeq, redactor) {
381
+ res.writeHead(200, SSE_HEADERS);
382
+ const writer = {
383
+ write: (event) => {
384
+ const accepted = writeEvent(res, event, redactor);
385
+ if (!accepted) {
386
+ res.destroy();
387
+ }
388
+ return accepted;
389
+ },
390
+ close: () => {
391
+ res.end();
392
+ },
393
+ };
394
+ const detach = record.sink.attach(writer, afterSeq);
395
+ res.write(readyMessage());
396
+ res.on("close", detach);
397
+ if (record.sink.isTerminated()) {
398
+ detach();
399
+ res.end();
400
+ }
401
+ }
402
+ // Route 7 — POST /api/runs/:runId/cancel. Idempotent; 404 unknown.
403
+ export function handleCancelRun(ctx, deps) {
404
+ const record = deps.registry.get(ctx.params.runId ?? "");
405
+ if (record === undefined) {
406
+ return { status: 404, body: errorBody("NOT_FOUND", "Unknown run.") };
407
+ }
408
+ record.cancel("cancelled via UI");
409
+ return { status: 200, body: { ok: true } };
410
+ }
411
+ // Route 8 — GET /api/runs/:runId. Final redacted report projection, or status:"running".
412
+ export function handleGetRun(ctx, deps) {
413
+ const record = deps.registry.get(ctx.params.runId ?? "");
414
+ if (record === undefined) {
415
+ return { status: 404, body: errorBody("NOT_FOUND", "Unknown run.") };
416
+ }
417
+ if (record.status === "running") {
418
+ return { status: 200, body: { report: { status: "running" } } };
419
+ }
420
+ return {
421
+ status: 200,
422
+ body: { report: reportWithApply(record.report, record.applyReport, record.appliedAt) },
423
+ };
424
+ }
425
+ function reportWithApply(report, applyReport, appliedAt) {
426
+ if (applyReport === undefined || appliedAt === undefined) {
427
+ return report;
428
+ }
429
+ if (!isRecord(report)) {
430
+ return { report, applyReport, appliedAt };
431
+ }
432
+ return { ...report, applyReport, appliedAt };
433
+ }
434
+ // Route 9 — POST /api/runs/:runId/apply. The ONLY write path. 404 unknown; 409 when not in an
435
+ // appliable (dry-run-success) state; otherwise re-invokes the gated workflow with apply:true.
436
+ //
437
+ // Issue #638: the pending snapshot is claimed atomically (set to `undefined`) BEFORE we await
438
+ // `applyRun`, so a second overlapping request sees `record.appliable === undefined` and 409s
439
+ // out. Clearing AFTER the await would let two requests both observe the same pending patch and
440
+ // double-apply the workspace mutation, which is the race the regression test reproduces.
441
+ export async function handleApplyRun(ctx, deps) {
442
+ const record = deps.registry.get(ctx.params.runId ?? "");
443
+ if (record === undefined) {
444
+ return { status: 404, body: errorBody("NOT_FOUND", "Unknown run.") };
445
+ }
446
+ const snapshot = record.appliable;
447
+ if (snapshot === undefined) {
448
+ return {
449
+ status: 409,
450
+ body: errorBody("NOT_APPLIABLE", "The run is not in an appliable state."),
451
+ };
452
+ }
453
+ const model = deps.modelPortFactory(record.modelId);
454
+ if (model === undefined) {
455
+ return { status: 400, body: errorBody("NO_MODEL", "No model provider is configured.") };
456
+ }
457
+ record.appliable = undefined;
458
+ const report = await applyRun(snapshot, model, record.modelId, deps.redactor);
459
+ record.applyReport = report;
460
+ record.appliedAt = Date.now();
461
+ return {
462
+ status: 200,
463
+ body: { report: reportWithApply(record.report, record.applyReport, record.appliedAt) },
464
+ };
465
+ }
@@ -0,0 +1,17 @@
1
+ import type { WorkflowHandoffRequest } from "@oscharko-dev/keiko-contracts/workflow-handoff";
2
+ export type RunKind = "unit-tests" | "bug-investigation" | "explain-plan" | "verify";
3
+ export interface RunRequest {
4
+ readonly kind: RunKind;
5
+ readonly modelId: string;
6
+ readonly apply: boolean;
7
+ readonly input: Record<string, unknown>;
8
+ readonly limits: Record<string, unknown> | undefined;
9
+ readonly governedHandoff?: WorkflowHandoffRequest | undefined;
10
+ readonly governedHandoffSourceGroundedRunId?: string | undefined;
11
+ }
12
+ export interface RunRequestError {
13
+ readonly code: "BAD_REQUEST";
14
+ readonly message: string;
15
+ }
16
+ export declare function parseRunRequest(raw: string): RunRequest | RunRequestError;
17
+ //# sourceMappingURL=run-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-request.d.ts","sourceRoot":"","sources":["../src/run-request.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AAE7F,MAAM,MAAM,OAAO,GAAG,YAAY,GAAG,mBAAmB,GAAG,cAAc,GAAG,QAAQ,CAAC;AAErF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAExB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAExC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAErD,QAAQ,CAAC,eAAe,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAC9D,QAAQ,CAAC,kCAAkC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClE;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AA4ND,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,eAAe,CAsCzE"}