@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,369 @@
1
+ // Issue #212 — Conversation Center memory BFF.
2
+ //
3
+ // Two routes that let the Conversation Center compose enterprise memory WITHOUT importing
4
+ // any memory-domain package directly (ADR-0019 rule 8 keeps the browser/UI tier away from
5
+ // the domain). Both routes go through the existing redactor (D9) before serialisation.
6
+ //
7
+ // POST /api/memory/context
8
+ // Body: { projectPath, chatId, queryText?, types?, budgetTokens? }
9
+ // Returns the MemoryRetrievalResult envelope (contextBlock + included + omitted + budget).
10
+ // Wraps `retrieveMemoryContext` from keiko-memory-retrieval.
11
+ //
12
+ // POST /api/memory/capture-from-conversation
13
+ // Body: { text, context: { projectPath, chatId } }
14
+ // Returns { outcomes: CaptureOutcome[] }. Calls keiko-memory-capture's
15
+ // `extractCandidatesFromUserText` and persists each `candidate` outcome as a `proposed`
16
+ // memory record via the shared `buildMemoryRecordFromProposal` builder so the existing
17
+ // /api/memory/proposals/:id/accept route from #211 can transition the proposal to accepted
18
+ // (issue #642).
19
+ //
20
+ // CSRF: enforced for POST methods by the server dispatch layer in server.ts. Handlers do
21
+ // NOT re-check.
22
+ //
23
+ // File budget: keep under 400 LOC per coordinator quality rules.
24
+ import { randomUUID } from "node:crypto";
25
+ import { retrieveMemoryContext, } from "@oscharko-dev/keiko-memory-retrieval";
26
+ import { extractCandidatesFromUserText, memoryTextEgressRejectionReason, } from "@oscharko-dev/keiko-memory-capture";
27
+ import { MEMORY_TYPES } from "@oscharko-dev/keiko-contracts";
28
+ import { errorBody } from "./routes.js";
29
+ import { createMemoryTargetResolver } from "./memory-target-resolver.js";
30
+ import { conversationMemoryScopes, resolveConversationMemoryContext, } from "./memory-conversation-context.js";
31
+ import { recordMemoryAudit } from "./memory-audit-handler.js";
32
+ import { buildMemoryRecordFromProposal } from "./memory-record-builders.js";
33
+ import { enforcePersistableMemoryOutcome, isPersistableMemoryCandidate, memoryCapturePolicyForDeps, } from "./memory-capture-policy.js";
34
+ import { buildConversationRetrievalSignals, conversationFusionMode, } from "./memory-retrieval-signals.js";
35
+ // ─── Constants ────────────────────────────────────────────────────────────────
36
+ const MAX_BODY_BYTES = 64_000;
37
+ // ─── Body reading (mirrors memory-handlers.ts pattern) ────────────────────────
38
+ class BodyTooLargeError extends Error {
39
+ constructor() {
40
+ super("request body too large");
41
+ this.name = "BodyTooLargeError";
42
+ }
43
+ }
44
+ function isRecord(value) {
45
+ return typeof value === "object" && value !== null && !Array.isArray(value);
46
+ }
47
+ function readBody(req) {
48
+ return new Promise((resolve, reject) => {
49
+ const chunks = [];
50
+ let total = 0;
51
+ let capped = false;
52
+ req.on("data", (chunk) => {
53
+ total += chunk.length;
54
+ if (total > MAX_BODY_BYTES) {
55
+ if (!capped) {
56
+ capped = true;
57
+ chunks.length = 0;
58
+ reject(new BodyTooLargeError());
59
+ req.resume();
60
+ }
61
+ return;
62
+ }
63
+ chunks.push(chunk);
64
+ });
65
+ req.on("end", () => {
66
+ if (!capped)
67
+ resolve(Buffer.concat(chunks).toString("utf8"));
68
+ });
69
+ req.on("error", reject);
70
+ });
71
+ }
72
+ async function readJsonBody(req) {
73
+ let raw;
74
+ try {
75
+ raw = await readBody(req);
76
+ }
77
+ catch (err) {
78
+ if (err instanceof BodyTooLargeError) {
79
+ return { status: 413, body: errorBody("PAYLOAD_TOO_LARGE", "Request body too large.") };
80
+ }
81
+ throw err;
82
+ }
83
+ let parsed;
84
+ try {
85
+ parsed = raw.length === 0 ? {} : JSON.parse(raw);
86
+ }
87
+ catch {
88
+ return { status: 400, body: errorBody("BAD_REQUEST", "Request body is not valid JSON.") };
89
+ }
90
+ if (!isRecord(parsed)) {
91
+ return { status: 400, body: errorBody("BAD_REQUEST", "Request body must be a JSON object.") };
92
+ }
93
+ return parsed;
94
+ }
95
+ function isRouteResult(value) {
96
+ return isRecord(value) && typeof value.status === "number";
97
+ }
98
+ function resolveVault(deps) {
99
+ if (deps.memoryVault === undefined) {
100
+ return {
101
+ status: 503,
102
+ body: errorBody("MEMORY_UNAVAILABLE", "Memory vault is not configured."),
103
+ };
104
+ }
105
+ return deps.memoryVault;
106
+ }
107
+ // ─── /api/memory/context — request parsing ───────────────────────────────────
108
+ function parseTypes(raw) {
109
+ if (raw === undefined)
110
+ return null;
111
+ if (!Array.isArray(raw))
112
+ return null;
113
+ const out = [];
114
+ for (const r of raw) {
115
+ if (typeof r !== "string" || !MEMORY_TYPES.includes(r)) {
116
+ return null;
117
+ }
118
+ out.push(r);
119
+ }
120
+ return out;
121
+ }
122
+ export function vaultAsQueryPort(vault) {
123
+ // Retrieval must see expired rows so it can omit them with a concrete suppression reason
124
+ // instead of having storage silently drop them. Archived/forgotten rows already come back
125
+ // from the vault by default and are suppressed later by the retrieval layer.
126
+ return {
127
+ listByScope: (scope, options) => {
128
+ const limit = options?.maxResults;
129
+ return vault.listMemoriesByScope(scope, {
130
+ includeExpired: true,
131
+ ...(limit === undefined ? {} : { limit }),
132
+ });
133
+ },
134
+ listOutgoingEdges: (memoryId) => vault.listOutgoingEdges(memoryId),
135
+ listIncomingEdges: (memoryId) => vault.listIncomingEdges(memoryId),
136
+ };
137
+ }
138
+ function parseRequiredString(raw, key) {
139
+ const value = raw[key];
140
+ if (typeof value === "string" && value.length > 0) {
141
+ return value;
142
+ }
143
+ return {
144
+ status: 400,
145
+ body: errorBody("BAD_REQUEST", `${key} must be a non-empty string.`),
146
+ };
147
+ }
148
+ function parseOptionalQueryText(raw) {
149
+ if (raw.queryText === undefined)
150
+ return undefined;
151
+ if (typeof raw.queryText !== "string") {
152
+ return {
153
+ status: 400,
154
+ body: errorBody("BAD_REQUEST", "queryText must be a string when provided."),
155
+ };
156
+ }
157
+ return raw.queryText;
158
+ }
159
+ function parseOptionalBudgetTokens(raw) {
160
+ if (raw.budgetTokens === undefined)
161
+ return undefined;
162
+ if (typeof raw.budgetTokens !== "number" ||
163
+ !Number.isFinite(raw.budgetTokens) ||
164
+ !Number.isInteger(raw.budgetTokens) ||
165
+ raw.budgetTokens < 0) {
166
+ return {
167
+ status: 400,
168
+ body: errorBody("BAD_REQUEST", "budgetTokens must be a non-negative integer."),
169
+ };
170
+ }
171
+ return raw.budgetTokens;
172
+ }
173
+ function parseContextInput(raw) {
174
+ const projectPath = parseRequiredString(raw, "projectPath");
175
+ if (isRouteResult(projectPath))
176
+ return projectPath;
177
+ const chatId = parseRequiredString(raw, "chatId");
178
+ if (isRouteResult(chatId))
179
+ return chatId;
180
+ const types = parseTypes(raw.types);
181
+ if (raw.types !== undefined && types === null) {
182
+ return {
183
+ status: 400,
184
+ body: errorBody("BAD_REQUEST", `types must be an array of: ${MEMORY_TYPES.join(", ")}.`),
185
+ };
186
+ }
187
+ const queryText = parseOptionalQueryText(raw);
188
+ if (isRouteResult(queryText))
189
+ return queryText;
190
+ const budgetTokens = parseOptionalBudgetTokens(raw);
191
+ if (isRouteResult(budgetTokens))
192
+ return budgetTokens;
193
+ return {
194
+ projectPath,
195
+ chatId,
196
+ queryText: queryText ?? undefined,
197
+ types: types ?? undefined,
198
+ budgetTokens: budgetTokens ?? undefined,
199
+ };
200
+ }
201
+ function buildRetrievalRequest(scopes, input, nowMs, signals, fusion) {
202
+ // exactOptionalPropertyTypes: omit undefined fields instead of assigning them.
203
+ const req = {
204
+ scopes,
205
+ nowMs,
206
+ fusion,
207
+ };
208
+ if (input.queryText !== undefined)
209
+ req.queryText = input.queryText;
210
+ if (input.types !== undefined)
211
+ req.types = input.types;
212
+ if (input.budgetTokens !== undefined)
213
+ req.budgetTokens = input.budgetTokens;
214
+ // Embedding-cosine (#204, O-F4), reinforcement (O-P1), and MMR-diversity (O-F3) signals, same as
215
+ // the chat path. Passed only when present so a vault with no embeddings / no access history ranks
216
+ // byte-identically.
217
+ if (signals.semanticById !== undefined)
218
+ req.semanticById = signals.semanticById;
219
+ if (signals.strengthById.size > 0)
220
+ req.strengthById = signals.strengthById;
221
+ if (signals.embeddingById.size > 0)
222
+ req.embeddingById = signals.embeddingById;
223
+ return req;
224
+ }
225
+ // Builds the embedding + reinforcement signals, runs scoped retrieval, and records the reinforcement
226
+ // reflex — the same pipeline the chat path uses. Extracted so the route handler stays a thin
227
+ // parse/dispatch/audit shell.
228
+ async function retrieveConversationMemory(deps, vault, scopes, input) {
229
+ const port = vaultAsQueryPort(vault);
230
+ const nowMs = Date.now();
231
+ // Embedding egress gate (#204, O-F4): only send the query to the secondary embedding model when it
232
+ // is not secret-shaped — matching the chat path's safeForSecondaryModel guard.
233
+ const safeForSecondaryModel = input.queryText === undefined ||
234
+ memoryTextEgressRejectionReason(input.queryText, memoryCapturePolicyForDeps(deps)) === null;
235
+ const signals = await buildConversationRetrievalSignals(deps, vault, input.queryText, scopes, nowMs, safeForSecondaryModel);
236
+ const result = retrieveMemoryContext(buildRetrievalRequest(scopes, input, nowMs, signals, conversationFusionMode(deps)), port);
237
+ // Reinforcement reflex (#204, O-P1): every recall is an access, same as the chat path.
238
+ const accessedIds = result.included.map((item) => item.memoryId);
239
+ if (accessedIds.length > 0) {
240
+ vault.recordAccess(accessedIds, Date.now());
241
+ }
242
+ return result;
243
+ }
244
+ export async function handleMemoryRetrieveContext(ctx, deps) {
245
+ const vault = resolveVault(deps);
246
+ if (isRouteResult(vault))
247
+ return vault;
248
+ const body = await readJsonBody(ctx.req);
249
+ if (isRouteResult(body))
250
+ return body;
251
+ const input = parseContextInput(body);
252
+ if (isRouteResult(input))
253
+ return input;
254
+ const context = resolveConversationMemoryContext(deps, input.projectPath, input.chatId);
255
+ if (isRouteResult(context))
256
+ return context;
257
+ const scopes = conversationMemoryScopes(context);
258
+ const result = await retrieveConversationMemory(deps, vault, scopes, input);
259
+ if (result.included.length > 0) {
260
+ const event = {
261
+ schemaVersion: "1",
262
+ kind: "memory:retrieved",
263
+ eventId: randomUUID(),
264
+ occurredAt: Date.now(),
265
+ initiatorSurface: "conversation-center",
266
+ summary: result.included.length === 1
267
+ ? "Retrieved 1 memory for the conversation memory API."
268
+ : `Retrieved ${String(result.included.length)} memories for the conversation memory API.`,
269
+ scopes,
270
+ matchedMemoryIds: result.included.map((item) => item.memoryId),
271
+ };
272
+ recordMemoryAudit({ evidenceStore: deps.evidenceStore }, event);
273
+ }
274
+ // Redact the entire envelope (contextBlock.text, memory excerpts, inclusion reasons).
275
+ // We deliberately do NOT echo `result.request` back: it carries no fresh info beyond what
276
+ // the caller posted and bloats the wire payload.
277
+ return {
278
+ status: 200,
279
+ body: deps.redactor({
280
+ contextBlock: result.contextBlock,
281
+ included: result.included,
282
+ omitted: result.omitted,
283
+ budget: result.budget,
284
+ }),
285
+ };
286
+ }
287
+ function optionalId(raw, key) {
288
+ const value = raw[key];
289
+ return typeof value === "string" && value.length > 0 ? value : undefined;
290
+ }
291
+ function parseCaptureContext(raw) {
292
+ if (!isRecord(raw)) {
293
+ return {
294
+ status: 400,
295
+ body: errorBody("BAD_REQUEST", "context must be an object with projectPath and chatId."),
296
+ };
297
+ }
298
+ const projectPath = optionalId(raw, "projectPath");
299
+ const chatId = optionalId(raw, "chatId");
300
+ if (projectPath === undefined || chatId === undefined) {
301
+ return {
302
+ status: 400,
303
+ body: errorBody("BAD_REQUEST", "context.projectPath and context.chatId are required."),
304
+ };
305
+ }
306
+ return {
307
+ projectPath,
308
+ chatId,
309
+ };
310
+ }
311
+ function parseCaptureInput(raw) {
312
+ const text = typeof raw.text === "string" ? raw.text : "";
313
+ if (text.trim().length === 0) {
314
+ return { status: 400, body: errorBody("BAD_REQUEST", "text must be a non-empty string.") };
315
+ }
316
+ const context = parseCaptureContext(raw.context);
317
+ if (isRouteResult(context))
318
+ return context;
319
+ return {
320
+ text,
321
+ context,
322
+ };
323
+ }
324
+ function buildCaptureContext(input) {
325
+ // exactOptionalPropertyTypes — only set fields when present.
326
+ return {
327
+ userId: input.userId,
328
+ nowMs: Date.now(),
329
+ newMemoryId: () => randomUUID(),
330
+ newProposalId: () => randomUUID(),
331
+ workspaceId: input.workspaceId,
332
+ projectId: input.projectId,
333
+ conversationId: input.conversationId,
334
+ };
335
+ }
336
+ export async function handleMemoryCaptureFromConversation(ctx, deps) {
337
+ const vault = resolveVault(deps);
338
+ if (isRouteResult(vault))
339
+ return vault;
340
+ const body = await readJsonBody(ctx.req);
341
+ if (isRouteResult(body))
342
+ return body;
343
+ const input = parseCaptureInput(body);
344
+ if (isRouteResult(input))
345
+ return input;
346
+ const runtimeContext = resolveConversationMemoryContext(deps, input.context.projectPath, input.context.chatId);
347
+ if (isRouteResult(runtimeContext))
348
+ return runtimeContext;
349
+ const captureContext = buildCaptureContext(runtimeContext);
350
+ const outcomes = extractCandidatesFromUserText(input.text, captureContext, memoryCapturePolicyForDeps(deps, { resolver: createMemoryTargetResolver(vault) }));
351
+ // Issue #642: persist every candidate outcome as a `proposed` memory record so the
352
+ // /api/memory/proposals/:id/accept route can find it by the returned proposalId. Uses the
353
+ // shared `buildMemoryRecordFromProposal` builder for parity with chat-handlers.ts.
354
+ const persistableOutcomes = outcomes.map(enforcePersistableMemoryOutcome);
355
+ persistCandidateOutcomes(vault, persistableOutcomes);
356
+ // Redact every outcome (proposal bodies may carry user text that needs scrubbing).
357
+ return { status: 200, body: deps.redactor({ outcomes: persistableOutcomes }) };
358
+ }
359
+ function persistCandidateOutcomes(vault, outcomes) {
360
+ for (const outcome of outcomes) {
361
+ if (!isPersistableMemoryCandidate(outcome))
362
+ continue;
363
+ const proposalId = outcome.proposal.proposalId;
364
+ const record = buildMemoryRecordFromProposal(proposalId, outcome);
365
+ if (record !== null) {
366
+ vault.insertMemory(record);
367
+ }
368
+ }
369
+ }
@@ -0,0 +1,13 @@
1
+ import type { ConversationId, MemoryScope, ProjectId, UserId, WorkspaceId } from "@oscharko-dev/keiko-contracts/memory";
2
+ import type { UiHandlerDeps } from "./deps.js";
3
+ import type { RouteResult } from "./routes.js";
4
+ export declare const LOCAL_CONVERSATION_MEMORY_USER_ID: UserId;
5
+ export interface ConversationMemoryRuntimeContext {
6
+ readonly userId: UserId;
7
+ readonly workspaceId: WorkspaceId;
8
+ readonly projectId: ProjectId;
9
+ readonly conversationId: ConversationId;
10
+ }
11
+ export declare function resolveConversationMemoryContext(deps: UiHandlerDeps, projectPath: string, chatId: string): ConversationMemoryRuntimeContext | RouteResult;
12
+ export declare function conversationMemoryScopes(context: ConversationMemoryRuntimeContext): readonly MemoryScope[];
13
+ //# sourceMappingURL=memory-conversation-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-conversation-context.d.ts","sourceRoot":"","sources":["../src/memory-conversation-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,SAAS,EACT,MAAM,EACN,WAAW,EACZ,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,eAAO,MAAM,iCAAiC,EAAuB,MAAM,CAAC;AAE5E,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;CACzC;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,aAAa,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,gCAAgC,GAAG,WAAW,CAWhD;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,gCAAgC,GACxC,SAAS,WAAW,EAAE,CAOxB"}
@@ -0,0 +1,22 @@
1
+ import { errorBody } from "./routes.js";
2
+ export const LOCAL_CONVERSATION_MEMORY_USER_ID = "local-operator";
3
+ export function resolveConversationMemoryContext(deps, projectPath, chatId) {
4
+ const chat = deps.store.listChats(projectPath).find((entry) => entry.id === chatId);
5
+ if (chat === undefined) {
6
+ return { status: 404, body: errorBody("NOT_FOUND", "Chat not found.") };
7
+ }
8
+ return {
9
+ userId: LOCAL_CONVERSATION_MEMORY_USER_ID,
10
+ workspaceId: projectPath,
11
+ projectId: projectPath,
12
+ conversationId: chat.id,
13
+ };
14
+ }
15
+ export function conversationMemoryScopes(context) {
16
+ return [
17
+ { kind: "workspace", workspaceId: context.workspaceId },
18
+ { kind: "project", projectId: context.projectId },
19
+ { kind: "user", userId: context.userId },
20
+ { kind: "global" },
21
+ ];
22
+ }
@@ -0,0 +1,29 @@
1
+ import type { MemoryAuditEvent, MemoryScope, MemoryStatus } from "@oscharko-dev/keiko-contracts";
2
+ import { MEMORY_STATUSES } from "@oscharko-dev/keiko-contracts";
3
+ import type { EvidenceStore } from "@oscharko-dev/keiko-evidence";
4
+ import type { MemoryVaultStore } from "@oscharko-dev/keiko-memory-vault";
5
+ export interface MemoryScopeCount {
6
+ readonly scope: MemoryScope;
7
+ readonly count: number;
8
+ }
9
+ export type MemoryStatusHistogram = Readonly<Record<MemoryStatus, number>>;
10
+ export interface MemoryDiagnostics {
11
+ readonly schemaVersion: "1";
12
+ readonly generatedAt: number;
13
+ readonly scopeCounts: readonly MemoryScopeCount[];
14
+ readonly statusHistogram: MemoryStatusHistogram;
15
+ readonly recentAuditEvents: readonly MemoryAuditEvent[];
16
+ readonly storagePath: string;
17
+ }
18
+ export interface ExportMemoryDiagnosticsOptions {
19
+ readonly vault: MemoryVaultStore;
20
+ readonly scopes: readonly MemoryScope[];
21
+ readonly evidenceStore: EvidenceStore;
22
+ readonly redactString: (input: string) => string;
23
+ readonly evidenceDir: string;
24
+ readonly lastNAuditEvents?: number;
25
+ readonly now?: () => number;
26
+ }
27
+ export declare function exportMemoryDiagnostics(options: ExportMemoryDiagnosticsOptions): MemoryDiagnostics;
28
+ export { MEMORY_STATUSES };
29
+ //# sourceMappingURL=memory-diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-diagnostics.d.ts","sourceRoot":"","sources":["../src/memory-diagnostics.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAWzE,MAAM,WAAW,gBAAgB;IAG/B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;AAE3E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,QAAQ,CAAC,eAAe,EAAE,qBAAqB,CAAC;IAChD,QAAQ,CAAC,iBAAiB,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACxD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAGjD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAEnC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AAmFD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,8BAA8B,GACtC,iBAAiB,CAkCnB;AAGD,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,122 @@
1
+ // Memory diagnostics export (Epic #204, Issue #214).
2
+ //
3
+ // Builds a body-free snapshot of the local memory state suitable for support / debugging
4
+ // without exfiltrating any user content. The snapshot carries:
5
+ //
6
+ // - generatedAt epoch ms when the snapshot was built
7
+ // - scopeCounts total record count per requested scope (post-redaction key)
8
+ // - statusHistogram record count per MemoryStatus across all scanned scopes
9
+ // - recentAuditEvents last N audit events (already redacted at persist time)
10
+ // - storagePath the configured evidence dir, run through redactString
11
+ //
12
+ // Hard invariants:
13
+ //
14
+ // - The raw record body is NEVER serialised. There is no opt-in flag in this PR.
15
+ // - The raw payload is NEVER serialised either. The same rationale.
16
+ // - The storage path is run through the audit redactor in case a user-supplied path
17
+ // happens to contain a credential-shaped segment.
18
+ // - Audit event tail is sanitised again on export. Persist-time redaction remains the
19
+ // primary boundary, but diagnostics must stay non-leaking even if a local manifest is
20
+ // edited or produced by an older writer.
21
+ //
22
+ // This function does NOT mutate the vault. It only reads.
23
+ import { MEMORY_STATUSES } from "@oscharko-dev/keiko-contracts";
24
+ import { auditRunIdFor } from "./memory-audit-handler.js";
25
+ import { auditEventTouchesScope, memoryScopeKey, sanitizeAuditEvent, sanitizeMemoryScope, } from "./memory-scope-sanitizer.js";
26
+ // ─── Constants ────────────────────────────────────────────────────────────────
27
+ const DEFAULT_AUDIT_EVENT_TAIL = 50;
28
+ const MIN_AUDIT_EVENT_TAIL = 1;
29
+ const MAX_AUDIT_EVENT_TAIL = 1000;
30
+ // ─── Pure helpers ─────────────────────────────────────────────────────────────
31
+ function emptyHistogram() {
32
+ const counts = {
33
+ proposed: 0,
34
+ accepted: 0,
35
+ rejected: 0,
36
+ superseded: 0,
37
+ archived: 0,
38
+ forgotten: 0,
39
+ conflicted: 0,
40
+ expired: 0,
41
+ };
42
+ return counts;
43
+ }
44
+ function clampTail(value) {
45
+ if (value === undefined || !Number.isFinite(value)) {
46
+ return DEFAULT_AUDIT_EVENT_TAIL;
47
+ }
48
+ const integer = Math.floor(value);
49
+ if (integer < MIN_AUDIT_EVENT_TAIL) {
50
+ return MIN_AUDIT_EVENT_TAIL;
51
+ }
52
+ if (integer > MAX_AUDIT_EVENT_TAIL) {
53
+ return MAX_AUDIT_EVENT_TAIL;
54
+ }
55
+ return integer;
56
+ }
57
+ // Pulls the most recent N audit events from today's manifest and (if today's is short)
58
+ // continues into yesterday's manifest. Two-day window is deliberate: a longer window
59
+ // would risk scanning the entire ledger; the diagnostics view exists for a "what just
60
+ // happened?" support snapshot, not a full audit replay.
61
+ function readRecentAuditEvents(store, nowMs, limit, allowedScopeKeys, redactString) {
62
+ const today = readAuditManifest(store, auditRunIdFor(nowMs))
63
+ .map((event) => sanitizeAuditEvent(event, redactString))
64
+ .filter((event) => auditEventTouchesScope(event, allowedScopeKeys));
65
+ if (today.length >= limit) {
66
+ return today.slice(today.length - limit);
67
+ }
68
+ const yesterday = readAuditManifest(store, auditRunIdFor(nowMs - 24 * 60 * 60 * 1000))
69
+ .map((event) => sanitizeAuditEvent(event, redactString))
70
+ .filter((event) => auditEventTouchesScope(event, allowedScopeKeys));
71
+ const combined = [...yesterday, ...today];
72
+ if (combined.length <= limit) {
73
+ return combined;
74
+ }
75
+ return combined.slice(combined.length - limit);
76
+ }
77
+ function readAuditManifest(store, runId) {
78
+ const json = store.get(runId);
79
+ if (json === undefined) {
80
+ return [];
81
+ }
82
+ try {
83
+ const parsed = JSON.parse(json);
84
+ if (Array.isArray(parsed)) {
85
+ return parsed;
86
+ }
87
+ return [];
88
+ }
89
+ catch {
90
+ return [];
91
+ }
92
+ }
93
+ // ─── Public entry point ───────────────────────────────────────────────────────
94
+ export function exportMemoryDiagnostics(options) {
95
+ const now = options.now ?? (() => Date.now());
96
+ const nowMs = now();
97
+ const histogram = emptyHistogram();
98
+ const sanitizedScopes = options.scopes.map((scope) => sanitizeMemoryScope(scope, options.redactString));
99
+ const allowedScopeKeys = new Set(sanitizedScopes.map((scope) => memoryScopeKey(scope)));
100
+ const scopeCounts = options.scopes.map((scope, index) => {
101
+ const records = options.vault.listMemoriesByScope(scope, { includeExpired: true });
102
+ for (const record of records) {
103
+ histogram[record.status] += 1;
104
+ }
105
+ return {
106
+ scope: sanitizedScopes[index] ?? sanitizeMemoryScope(scope, options.redactString),
107
+ count: records.length,
108
+ };
109
+ });
110
+ const tail = clampTail(options.lastNAuditEvents);
111
+ const recentAuditEvents = readRecentAuditEvents(options.evidenceStore, nowMs, tail, allowedScopeKeys, options.redactString);
112
+ return {
113
+ schemaVersion: "1",
114
+ generatedAt: nowMs,
115
+ scopeCounts,
116
+ statusHistogram: histogram,
117
+ recentAuditEvents,
118
+ storagePath: options.redactString(options.evidenceDir),
119
+ };
120
+ }
121
+ // Re-export the status list for callers that want to render a stable histogram order.
122
+ export { MEMORY_STATUSES };
@@ -0,0 +1,21 @@
1
+ import { type GatewayConfig, type OpenAIEmbeddingOutcome, type OpenAIEmbeddingRequest } from "@oscharko-dev/keiko-model-gateway";
2
+ import type { MemoryId, MemoryRecord } from "@oscharko-dev/keiko-contracts/memory";
3
+ import type { MemoryEmbeddingInput, MemoryEmbeddingRow, MemoryVaultStore } from "@oscharko-dev/keiko-memory-vault";
4
+ import { type UiHandlerDeps } from "./deps.js";
5
+ export declare function selectMemoryEmbeddingModelId(config: GatewayConfig | undefined): string | undefined;
6
+ export type MemoryEmbedder = (text: string) => Promise<MemoryEmbeddingInput | null>;
7
+ export declare function createMemoryEmbedder(config: GatewayConfig | undefined, requestImpl: (request: OpenAIEmbeddingRequest) => Promise<OpenAIEmbeddingOutcome>): MemoryEmbedder | null;
8
+ export declare function embedMemoryText(deps: UiHandlerDeps, text: string): Promise<MemoryEmbeddingInput | null>;
9
+ export declare function embedAndStoreMemory(deps: UiHandlerDeps, vault: MemoryVaultStore, memoryId: MemoryId, text: string): Promise<void>;
10
+ export declare function cosineSimilarity(a: Float32Array, b: Float32Array): number;
11
+ export declare const SEMANTIC_DEDUP_COSINE_THRESHOLD = 0.95;
12
+ export declare function findSemanticDuplicate(candidate: MemoryEmbeddingInput | null, neighbors: ReadonlyMap<MemoryId, MemoryEmbeddingRow>, threshold?: number): MemoryId | null;
13
+ export declare const RELATED_LINK_COSINE_THRESHOLD = 0.82;
14
+ export declare const MAX_AUTO_LINKS = 3;
15
+ export declare function findRelatedNeighbors(candidate: MemoryEmbeddingInput | null, neighbors: ReadonlyMap<MemoryId, MemoryEmbeddingRow>, lower?: number, upper?: number, maxLinks?: number): readonly MemoryId[];
16
+ export interface NoveltyInsertResult {
17
+ readonly inserted: MemoryRecord | null;
18
+ readonly mergedInto: MemoryId | null;
19
+ }
20
+ export declare function insertSalienceMemoryWithNoveltyGate(deps: UiHandlerDeps, vault: MemoryVaultStore, record: MemoryRecord): Promise<NoveltyInsertResult>;
21
+ //# sourceMappingURL=memory-embedding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-embedding.d.ts","sourceRoot":"","sources":["../src/memory-embedding.ts"],"names":[],"mappings":"AAgBA,OAAO,EAEL,KAAK,aAAa,EAGlB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC5B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,KAAK,EAEV,QAAQ,EACR,YAAY,EAEb,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAIrE,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,aAAa,GAAG,SAAS,GAChC,MAAM,GAAG,SAAS,CAEpB;AAyDD,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;AAKpF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,WAAW,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,sBAAsB,CAAC,GAChF,cAAc,GAAG,IAAI,CAuBvB;AAKD,wBAAsB,eAAe,CACnC,IAAI,EAAE,aAAa,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAItC;AAKD,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAQf;AAKD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAgBzE;AAiBD,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAKpD,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,oBAAoB,GAAG,IAAI,EACtC,SAAS,EAAE,WAAW,CAAC,QAAQ,EAAE,kBAAkB,CAAC,EACpD,SAAS,GAAE,MAAwC,GAClD,QAAQ,GAAG,IAAI,CAYjB;AAeD,eAAO,MAAM,6BAA6B,OAAO,CAAC;AAGlD,eAAO,MAAM,cAAc,IAAI,CAAC;AAMhC,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,oBAAoB,GAAG,IAAI,EACtC,SAAS,EAAE,WAAW,CAAC,QAAQ,EAAE,kBAAkB,CAAC,EACpD,KAAK,GAAE,MAAsC,EAC7C,KAAK,GAAE,MAAwC,EAC/C,QAAQ,GAAE,MAAuB,GAChC,SAAS,QAAQ,EAAE,CAWrB;AA+CD,MAAM,WAAW,mBAAmB;IAElC,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAEvC,QAAQ,CAAC,UAAU,EAAE,QAAQ,GAAG,IAAI,CAAC;CACtC;AAOD,wBAAsB,mCAAmC,CACvD,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,mBAAmB,CAAC,CAoB9B"}