@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.
- package/dist/.tsbuildinfo +1 -0
- package/dist/assistant-response.d.ts +6 -0
- package/dist/assistant-response.d.ts.map +1 -0
- package/dist/assistant-response.js +12 -0
- package/dist/browser.d.ts +11 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +245 -0
- package/dist/chat-handlers.d.ts +48 -0
- package/dist/chat-handlers.d.ts.map +1 -0
- package/dist/chat-handlers.js +821 -0
- package/dist/chat-stream-handlers.d.ts +4 -0
- package/dist/chat-stream-handlers.d.ts.map +1 -0
- package/dist/chat-stream-handlers.js +136 -0
- package/dist/conversation-prompt.d.ts +8 -0
- package/dist/conversation-prompt.d.ts.map +1 -0
- package/dist/conversation-prompt.js +36 -0
- package/dist/conversation-validation.d.ts +26 -0
- package/dist/conversation-validation.d.ts.map +1 -0
- package/dist/conversation-validation.js +125 -0
- package/dist/credentialPersistence.d.ts +23 -0
- package/dist/credentialPersistence.d.ts.map +1 -0
- package/dist/credentialPersistence.js +93 -0
- package/dist/credentialVault.d.ts +30 -0
- package/dist/credentialVault.d.ts.map +1 -0
- package/dist/credentialVault.js +206 -0
- package/dist/csp.d.ts +3 -0
- package/dist/csp.d.ts.map +1 -0
- package/dist/csp.js +75 -0
- package/dist/deps.d.ts +78 -0
- package/dist/deps.d.ts.map +1 -0
- package/dist/deps.js +457 -0
- package/dist/editor/agentRoutes.d.ts +7 -0
- package/dist/editor/agentRoutes.d.ts.map +1 -0
- package/dist/editor/agentRoutes.js +197 -0
- package/dist/editor/assuredGateRunner.d.ts +36 -0
- package/dist/editor/assuredGateRunner.d.ts.map +1 -0
- package/dist/editor/assuredGateRunner.js +100 -0
- package/dist/editor/assuredPreFilter.d.ts +34 -0
- package/dist/editor/assuredPreFilter.d.ts.map +1 -0
- package/dist/editor/assuredPreFilter.js +134 -0
- package/dist/editor/assuredPreFilterRunner.d.ts +31 -0
- package/dist/editor/assuredPreFilterRunner.d.ts.map +1 -0
- package/dist/editor/assuredPreFilterRunner.js +312 -0
- package/dist/editor/builtinLanguageProviders.d.ts +6 -0
- package/dist/editor/builtinLanguageProviders.d.ts.map +1 -0
- package/dist/editor/builtinLanguageProviders.js +221 -0
- package/dist/editor/codingContext.d.ts +12 -0
- package/dist/editor/codingContext.d.ts.map +1 -0
- package/dist/editor/codingContext.js +121 -0
- package/dist/editor/codingContextEvidence.d.ts +7 -0
- package/dist/editor/codingContextEvidence.d.ts.map +1 -0
- package/dist/editor/codingContextEvidence.js +52 -0
- package/dist/editor/codingContextProviders.d.ts +36 -0
- package/dist/editor/codingContextProviders.d.ts.map +1 -0
- package/dist/editor/codingContextProviders.js +348 -0
- package/dist/editor/completionModelEvidence.d.ts +16 -0
- package/dist/editor/completionModelEvidence.d.ts.map +1 -0
- package/dist/editor/completionModelEvidence.js +50 -0
- package/dist/editor/completionRoutes.d.ts +37 -0
- package/dist/editor/completionRoutes.d.ts.map +1 -0
- package/dist/editor/completionRoutes.js +411 -0
- package/dist/editor/contextRoutes.d.ts +6 -0
- package/dist/editor/contextRoutes.d.ts.map +1 -0
- package/dist/editor/contextRoutes.js +411 -0
- package/dist/editor/disposableAssuredExecution.d.ts +22 -0
- package/dist/editor/disposableAssuredExecution.d.ts.map +1 -0
- package/dist/editor/disposableAssuredExecution.js +57 -0
- package/dist/editor/editorCompletionModel.d.ts +47 -0
- package/dist/editor/editorCompletionModel.d.ts.map +1 -0
- package/dist/editor/editorCompletionModel.js +156 -0
- package/dist/editor/editorInlineCompletionModel.d.ts +34 -0
- package/dist/editor/editorInlineCompletionModel.d.ts.map +1 -0
- package/dist/editor/editorInlineCompletionModel.js +112 -0
- package/dist/editor/editorModelTokenBudget.d.ts +46 -0
- package/dist/editor/editorModelTokenBudget.d.ts.map +1 -0
- package/dist/editor/editorModelTokenBudget.js +121 -0
- package/dist/editor/inlineCompletionRateLimiter.d.ts +19 -0
- package/dist/editor/inlineCompletionRateLimiter.d.ts.map +1 -0
- package/dist/editor/inlineCompletionRateLimiter.js +46 -0
- package/dist/editor/inlineCompletionRoutes.d.ts +26 -0
- package/dist/editor/inlineCompletionRoutes.d.ts.map +1 -0
- package/dist/editor/inlineCompletionRoutes.js +404 -0
- package/dist/editor/inlineCompletionTelemetryEvidence.d.ts +5 -0
- package/dist/editor/inlineCompletionTelemetryEvidence.d.ts.map +1 -0
- package/dist/editor/inlineCompletionTelemetryEvidence.js +42 -0
- package/dist/editor/languageCancellation.d.ts +19 -0
- package/dist/editor/languageCancellation.d.ts.map +1 -0
- package/dist/editor/languageCancellation.js +48 -0
- package/dist/editor/languageProvider.d.ts +39 -0
- package/dist/editor/languageProvider.d.ts.map +1 -0
- package/dist/editor/languageProvider.js +11 -0
- package/dist/editor/languageRoutes.d.ts +15 -0
- package/dist/editor/languageRoutes.d.ts.map +1 -0
- package/dist/editor/languageRoutes.js +106 -0
- package/dist/editor/languageSanitize.d.ts +8 -0
- package/dist/editor/languageSanitize.d.ts.map +1 -0
- package/dist/editor/languageSanitize.js +101 -0
- package/dist/editor/languageService.d.ts +36 -0
- package/dist/editor/languageService.d.ts.map +1 -0
- package/dist/editor/languageService.js +93 -0
- package/dist/editor/languageServiceHost.d.ts +14 -0
- package/dist/editor/languageServiceHost.d.ts.map +1 -0
- package/dist/editor/languageServiceHost.js +242 -0
- package/dist/editor/localKnowledgeRetrieval.d.ts +21 -0
- package/dist/editor/localKnowledgeRetrieval.d.ts.map +1 -0
- package/dist/editor/localKnowledgeRetrieval.js +44 -0
- package/dist/editor/patchApplyEvidence.d.ts +21 -0
- package/dist/editor/patchApplyEvidence.d.ts.map +1 -0
- package/dist/editor/patchApplyEvidence.js +87 -0
- package/dist/editor/patchApplyRoutes.d.ts +16 -0
- package/dist/editor/patchApplyRoutes.d.ts.map +1 -0
- package/dist/editor/patchApplyRoutes.js +307 -0
- package/dist/editor/postApplyVerification.d.ts +42 -0
- package/dist/editor/postApplyVerification.d.ts.map +1 -0
- package/dist/editor/postApplyVerification.js +177 -0
- package/dist/editor/testGenerationEvidence.d.ts +6 -0
- package/dist/editor/testGenerationEvidence.d.ts.map +1 -0
- package/dist/editor/testGenerationEvidence.js +72 -0
- package/dist/editor/testGenerationPatch.d.ts +10 -0
- package/dist/editor/testGenerationPatch.d.ts.map +1 -0
- package/dist/editor/testGenerationPatch.js +66 -0
- package/dist/editor/testGenerationRoutes.d.ts +21 -0
- package/dist/editor/testGenerationRoutes.d.ts.map +1 -0
- package/dist/editor/testGenerationRoutes.js +254 -0
- package/dist/editor/testGenerationRunner.d.ts +23 -0
- package/dist/editor/testGenerationRunner.d.ts.map +1 -0
- package/dist/editor/testGenerationRunner.js +120 -0
- package/dist/editor/textOffsets.d.ts +6 -0
- package/dist/editor/textOffsets.d.ts.map +1 -0
- package/dist/editor/textOffsets.js +82 -0
- package/dist/editor/typescriptLanguageProvider.d.ts +3 -0
- package/dist/editor/typescriptLanguageProvider.d.ts.map +1 -0
- package/dist/editor/typescriptLanguageProvider.js +217 -0
- package/dist/evidence.d.ts +28 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +145 -0
- package/dist/files-deny.d.ts +3 -0
- package/dist/files-deny.d.ts.map +1 -0
- package/dist/files-deny.js +12 -0
- package/dist/files.d.ts +97 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +733 -0
- package/dist/gateway-setup.d.ts +10 -0
- package/dist/gateway-setup.d.ts.map +1 -0
- package/dist/gateway-setup.js +896 -0
- package/dist/governed-workflow.d.ts +17 -0
- package/dist/governed-workflow.d.ts.map +1 -0
- package/dist/governed-workflow.js +147 -0
- package/dist/grounded-answer.d.ts +12 -0
- package/dist/grounded-answer.d.ts.map +1 -0
- package/dist/grounded-answer.js +69 -0
- package/dist/grounded-context-index.d.ts +25 -0
- package/dist/grounded-context-index.d.ts.map +1 -0
- package/dist/grounded-context-index.js +169 -0
- package/dist/grounded-document-evidence.d.ts +28 -0
- package/dist/grounded-document-evidence.d.ts.map +1 -0
- package/dist/grounded-document-evidence.js +430 -0
- package/dist/grounded-handoff.d.ts +4 -0
- package/dist/grounded-handoff.d.ts.map +1 -0
- package/dist/grounded-handoff.js +445 -0
- package/dist/grounded-orchestrator.d.ts +43 -0
- package/dist/grounded-orchestrator.d.ts.map +1 -0
- package/dist/grounded-orchestrator.js +1445 -0
- package/dist/grounded-prompt.d.ts +2 -0
- package/dist/grounded-prompt.d.ts.map +1 -0
- package/dist/grounded-prompt.js +17 -0
- package/dist/grounded-qa-hybrid.d.ts +36 -0
- package/dist/grounded-qa-hybrid.d.ts.map +1 -0
- package/dist/grounded-qa-hybrid.js +762 -0
- package/dist/grounded-qa-multi-source.d.ts +38 -0
- package/dist/grounded-qa-multi-source.d.ts.map +1 -0
- package/dist/grounded-qa-multi-source.js +461 -0
- package/dist/grounded-qa.d.ts +45 -0
- package/dist/grounded-qa.d.ts.map +1 -0
- package/dist/grounded-qa.js +877 -0
- package/dist/grounded-rerank.d.ts +26 -0
- package/dist/grounded-rerank.d.ts.map +1 -0
- package/dist/grounded-rerank.js +72 -0
- package/dist/grounded-turn-registry.d.ts +23 -0
- package/dist/grounded-turn-registry.d.ts.map +1 -0
- package/dist/grounded-turn-registry.js +102 -0
- package/dist/headers.d.ts +3 -0
- package/dist/headers.d.ts.map +1 -0
- package/dist/headers.js +22 -0
- package/dist/host-check.d.ts +3 -0
- package/dist/host-check.d.ts.map +1 -0
- package/dist/host-check.js +58 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/load-csp.d.ts +3 -0
- package/dist/load-csp.d.ts.map +1 -0
- package/dist/load-csp.js +100 -0
- package/dist/local-knowledge-grounded-qa.d.ts +42 -0
- package/dist/local-knowledge-grounded-qa.d.ts.map +1 -0
- package/dist/local-knowledge-grounded-qa.js +678 -0
- package/dist/local-knowledge-handlers.d.ts +24 -0
- package/dist/local-knowledge-handlers.d.ts.map +1 -0
- package/dist/local-knowledge-handlers.js +1285 -0
- package/dist/local-knowledge-indexing-registry.d.ts +13 -0
- package/dist/local-knowledge-indexing-registry.d.ts.map +1 -0
- package/dist/local-knowledge-indexing-registry.js +53 -0
- package/dist/localKnowledgeKeyProvider.d.ts +11 -0
- package/dist/localKnowledgeKeyProvider.d.ts.map +1 -0
- package/dist/localKnowledgeKeyProvider.js +48 -0
- package/dist/memory-audit-event-builders.d.ts +21 -0
- package/dist/memory-audit-event-builders.d.ts.map +1 -0
- package/dist/memory-audit-event-builders.js +187 -0
- package/dist/memory-audit-handler.d.ts +23 -0
- package/dist/memory-audit-handler.d.ts.map +1 -0
- package/dist/memory-audit-handler.js +191 -0
- package/dist/memory-capture-policy.d.ts +10 -0
- package/dist/memory-capture-policy.d.ts.map +1 -0
- package/dist/memory-capture-policy.js +44 -0
- package/dist/memory-consolidation-handlers.d.ts +6 -0
- package/dist/memory-consolidation-handlers.d.ts.map +1 -0
- package/dist/memory-consolidation-handlers.js +491 -0
- package/dist/memory-consolidation-registry.d.ts +47 -0
- package/dist/memory-consolidation-registry.d.ts.map +1 -0
- package/dist/memory-consolidation-registry.js +106 -0
- package/dist/memory-conv-handlers.d.ts +8 -0
- package/dist/memory-conv-handlers.d.ts.map +1 -0
- package/dist/memory-conv-handlers.js +369 -0
- package/dist/memory-conversation-context.d.ts +13 -0
- package/dist/memory-conversation-context.d.ts.map +1 -0
- package/dist/memory-conversation-context.js +22 -0
- package/dist/memory-diagnostics.d.ts +29 -0
- package/dist/memory-diagnostics.d.ts.map +1 -0
- package/dist/memory-diagnostics.js +122 -0
- package/dist/memory-embedding.d.ts +21 -0
- package/dist/memory-embedding.d.ts.map +1 -0
- package/dist/memory-embedding.js +264 -0
- package/dist/memory-handlers.d.ts +19 -0
- package/dist/memory-handlers.d.ts.map +1 -0
- package/dist/memory-handlers.js +1204 -0
- package/dist/memory-maintenance-handlers.d.ts +35 -0
- package/dist/memory-maintenance-handlers.d.ts.map +1 -0
- package/dist/memory-maintenance-handlers.js +219 -0
- package/dist/memory-record-builders.d.ts +4 -0
- package/dist/memory-record-builders.d.ts.map +1 -0
- package/dist/memory-record-builders.js +19 -0
- package/dist/memory-retention.d.ts +31 -0
- package/dist/memory-retention.d.ts.map +1 -0
- package/dist/memory-retention.js +151 -0
- package/dist/memory-retrieval-signals.d.ts +12 -0
- package/dist/memory-retrieval-signals.d.ts.map +1 -0
- package/dist/memory-retrieval-signals.js +100 -0
- package/dist/memory-salience.d.ts +12 -0
- package/dist/memory-salience.d.ts.map +1 -0
- package/dist/memory-salience.js +154 -0
- package/dist/memory-scope-sanitizer.d.ts +6 -0
- package/dist/memory-scope-sanitizer.d.ts.map +1 -0
- package/dist/memory-scope-sanitizer.js +106 -0
- package/dist/memory-target-resolver.d.ts +4 -0
- package/dist/memory-target-resolver.d.ts.map +1 -0
- package/dist/memory-target-resolver.js +73 -0
- package/dist/memory-workflow-port.d.ts +14 -0
- package/dist/memory-workflow-port.d.ts.map +1 -0
- package/dist/memory-workflow-port.js +186 -0
- package/dist/private-json.d.ts +3 -0
- package/dist/private-json.d.ts.map +1 -0
- package/dist/private-json.js +62 -0
- package/dist/promptEnhancer/index.d.ts +3 -0
- package/dist/promptEnhancer/index.d.ts.map +1 -0
- package/dist/promptEnhancer/index.js +5 -0
- package/dist/promptEnhancer/orchestrate.d.ts +2 -0
- package/dist/promptEnhancer/orchestrate.d.ts.map +1 -0
- package/dist/promptEnhancer/orchestrate.js +5 -0
- package/dist/promptEnhancer/routes.d.ts +9 -0
- package/dist/promptEnhancer/routes.d.ts.map +1 -0
- package/dist/promptEnhancer/routes.js +205 -0
- package/dist/qualityIntelligence/capsuleAdapter.d.ts +27 -0
- package/dist/qualityIntelligence/capsuleAdapter.d.ts.map +1 -0
- package/dist/qualityIntelligence/capsuleAdapter.js +57 -0
- package/dist/qualityIntelligence/connectorAuthorization.d.ts +22 -0
- package/dist/qualityIntelligence/connectorAuthorization.d.ts.map +1 -0
- package/dist/qualityIntelligence/connectorAuthorization.js +35 -0
- package/dist/qualityIntelligence/connectorErrors.d.ts +16 -0
- package/dist/qualityIntelligence/connectorErrors.d.ts.map +1 -0
- package/dist/qualityIntelligence/connectorErrors.js +56 -0
- package/dist/qualityIntelligence/connectorRoutes.d.ts +7 -0
- package/dist/qualityIntelligence/connectorRoutes.d.ts.map +1 -0
- package/dist/qualityIntelligence/connectorRoutes.js +167 -0
- package/dist/qualityIntelligence/editRoutes.d.ts +5 -0
- package/dist/qualityIntelligence/editRoutes.d.ts.map +1 -0
- package/dist/qualityIntelligence/editRoutes.js +293 -0
- package/dist/qualityIntelligence/exportAssembly.d.ts +22 -0
- package/dist/qualityIntelligence/exportAssembly.d.ts.map +1 -0
- package/dist/qualityIntelligence/exportAssembly.js +352 -0
- package/dist/qualityIntelligence/exportRoutes.d.ts +5 -0
- package/dist/qualityIntelligence/exportRoutes.d.ts.map +1 -0
- package/dist/qualityIntelligence/exportRoutes.js +320 -0
- package/dist/qualityIntelligence/figma/figmaConcurrency.d.ts +8 -0
- package/dist/qualityIntelligence/figma/figmaConcurrency.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaConcurrency.js +34 -0
- package/dist/qualityIntelligence/figma/figmaConnector.d.ts +65 -0
- package/dist/qualityIntelligence/figma/figmaConnector.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaConnector.js +184 -0
- package/dist/qualityIntelligence/figma/figmaConnectorAudit.d.ts +52 -0
- package/dist/qualityIntelligence/figma/figmaConnectorAudit.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaConnectorAudit.js +63 -0
- package/dist/qualityIntelligence/figma/figmaConnectorErrors.d.ts +31 -0
- package/dist/qualityIntelligence/figma/figmaConnectorErrors.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaConnectorErrors.js +220 -0
- package/dist/qualityIntelligence/figma/figmaConnectorMetrics.d.ts +44 -0
- package/dist/qualityIntelligence/figma/figmaConnectorMetrics.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaConnectorMetrics.js +49 -0
- package/dist/qualityIntelligence/figma/figmaConsent.d.ts +39 -0
- package/dist/qualityIntelligence/figma/figmaConsent.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaConsent.js +62 -0
- package/dist/qualityIntelligence/figma/figmaHttpPort.d.ts +28 -0
- package/dist/qualityIntelligence/figma/figmaHttpPort.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaHttpPort.js +70 -0
- package/dist/qualityIntelligence/figma/figmaObservedActions.d.ts +49 -0
- package/dist/qualityIntelligence/figma/figmaObservedActions.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaObservedActions.js +89 -0
- package/dist/qualityIntelligence/figma/figmaReadiness.d.ts +32 -0
- package/dist/qualityIntelligence/figma/figmaReadiness.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaReadiness.js +67 -0
- package/dist/qualityIntelligence/figma/figmaRenderPort.d.ts +29 -0
- package/dist/qualityIntelligence/figma/figmaRenderPort.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaRenderPort.js +93 -0
- package/dist/qualityIntelligence/figma/figmaResnapshot.d.ts +28 -0
- package/dist/qualityIntelligence/figma/figmaResnapshot.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaResnapshot.js +38 -0
- package/dist/qualityIntelligence/figma/figmaRetry.d.ts +31 -0
- package/dist/qualityIntelligence/figma/figmaRetry.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaRetry.js +62 -0
- package/dist/qualityIntelligence/figma/figmaScopeRef.d.ts +9 -0
- package/dist/qualityIntelligence/figma/figmaScopeRef.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaScopeRef.js +18 -0
- package/dist/qualityIntelligence/figma/figmaScopedPagination.d.ts +86 -0
- package/dist/qualityIntelligence/figma/figmaScopedPagination.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaScopedPagination.js +308 -0
- package/dist/qualityIntelligence/figma/figmaSnapshotBuilder.d.ts +31 -0
- package/dist/qualityIntelligence/figma/figmaSnapshotBuilder.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaSnapshotBuilder.js +314 -0
- package/dist/qualityIntelligence/figma/figmaSnapshotHash.d.ts +18 -0
- package/dist/qualityIntelligence/figma/figmaSnapshotHash.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaSnapshotHash.js +63 -0
- package/dist/qualityIntelligence/figma/figmaSnapshotTypes.d.ts +65 -0
- package/dist/qualityIntelligence/figma/figmaSnapshotTypes.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaSnapshotTypes.js +13 -0
- package/dist/qualityIntelligence/figma/figmaTokenSource.d.ts +9 -0
- package/dist/qualityIntelligence/figma/figmaTokenSource.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaTokenSource.js +61 -0
- package/dist/qualityIntelligence/figma/figmaTokenStore.d.ts +19 -0
- package/dist/qualityIntelligence/figma/figmaTokenStore.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaTokenStore.js +156 -0
- package/dist/qualityIntelligence/figma/figmaUrl.d.ts +6 -0
- package/dist/qualityIntelligence/figma/figmaUrl.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/figmaUrl.js +36 -0
- package/dist/qualityIntelligence/figma/index.d.ts +20 -0
- package/dist/qualityIntelligence/figma/index.d.ts.map +1 -0
- package/dist/qualityIntelligence/figma/index.js +26 -0
- package/dist/qualityIntelligence/figmaCodegenRoutes.d.ts +28 -0
- package/dist/qualityIntelligence/figmaCodegenRoutes.d.ts.map +1 -0
- package/dist/qualityIntelligence/figmaCodegenRoutes.js +165 -0
- package/dist/qualityIntelligence/figmaSnapshotAdapter.d.ts +55 -0
- package/dist/qualityIntelligence/figmaSnapshotAdapter.d.ts.map +1 -0
- package/dist/qualityIntelligence/figmaSnapshotAdapter.js +219 -0
- package/dist/qualityIntelligence/figmaSnapshotOrchestration.d.ts +64 -0
- package/dist/qualityIntelligence/figmaSnapshotOrchestration.d.ts.map +1 -0
- package/dist/qualityIntelligence/figmaSnapshotOrchestration.js +203 -0
- package/dist/qualityIntelligence/figmaSnapshotRoutes.d.ts +112 -0
- package/dist/qualityIntelligence/figmaSnapshotRoutes.d.ts.map +1 -0
- package/dist/qualityIntelligence/figmaSnapshotRoutes.js +1063 -0
- package/dist/qualityIntelligence/figmaSnapshotScreenIds.d.ts +19 -0
- package/dist/qualityIntelligence/figmaSnapshotScreenIds.d.ts.map +1 -0
- package/dist/qualityIntelligence/figmaSnapshotScreenIds.js +75 -0
- package/dist/qualityIntelligence/generationPort.d.ts +15 -0
- package/dist/qualityIntelligence/generationPort.d.ts.map +1 -0
- package/dist/qualityIntelligence/generationPort.js +185 -0
- package/dist/qualityIntelligence/handoffErrors.d.ts +9 -0
- package/dist/qualityIntelligence/handoffErrors.d.ts.map +1 -0
- package/dist/qualityIntelligence/handoffErrors.js +21 -0
- package/dist/qualityIntelligence/handoffRoutes.d.ts +15 -0
- package/dist/qualityIntelligence/handoffRoutes.d.ts.map +1 -0
- package/dist/qualityIntelligence/handoffRoutes.js +341 -0
- package/dist/qualityIntelligence/index.d.ts +17 -0
- package/dist/qualityIntelligence/index.d.ts.map +1 -0
- package/dist/qualityIntelligence/index.js +36 -0
- package/dist/qualityIntelligence/judgePort.d.ts +30 -0
- package/dist/qualityIntelligence/judgePort.d.ts.map +1 -0
- package/dist/qualityIntelligence/judgePort.js +326 -0
- package/dist/qualityIntelligence/modelSelection.d.ts +58 -0
- package/dist/qualityIntelligence/modelSelection.d.ts.map +1 -0
- package/dist/qualityIntelligence/modelSelection.js +148 -0
- package/dist/qualityIntelligence/reCheckRoutes.d.ts +6 -0
- package/dist/qualityIntelligence/reCheckRoutes.d.ts.map +1 -0
- package/dist/qualityIntelligence/reCheckRoutes.js +1157 -0
- package/dist/qualityIntelligence/retentionEnforcement.d.ts +13 -0
- package/dist/qualityIntelligence/retentionEnforcement.d.ts.map +1 -0
- package/dist/qualityIntelligence/retentionEnforcement.js +47 -0
- package/dist/qualityIntelligence/retentionRoutes.d.ts +8 -0
- package/dist/qualityIntelligence/retentionRoutes.d.ts.map +1 -0
- package/dist/qualityIntelligence/retentionRoutes.js +74 -0
- package/dist/qualityIntelligence/reviewRoutes.d.ts +5 -0
- package/dist/qualityIntelligence/reviewRoutes.d.ts.map +1 -0
- package/dist/qualityIntelligence/reviewRoutes.js +145 -0
- package/dist/qualityIntelligence/reviewStore.d.ts +75 -0
- package/dist/qualityIntelligence/reviewStore.d.ts.map +1 -0
- package/dist/qualityIntelligence/reviewStore.js +170 -0
- package/dist/qualityIntelligence/runExecution.d.ts +36 -0
- package/dist/qualityIntelligence/runExecution.d.ts.map +1 -0
- package/dist/qualityIntelligence/runExecution.js +180 -0
- package/dist/qualityIntelligence/runIngestion.d.ts +70 -0
- package/dist/qualityIntelligence/runIngestion.d.ts.map +1 -0
- package/dist/qualityIntelligence/runIngestion.js +1235 -0
- package/dist/qualityIntelligence/runRegistry.d.ts +31 -0
- package/dist/qualityIntelligence/runRegistry.d.ts.map +1 -0
- package/dist/qualityIntelligence/runRegistry.js +66 -0
- package/dist/qualityIntelligence/runRoutes.d.ts +16 -0
- package/dist/qualityIntelligence/runRoutes.d.ts.map +1 -0
- package/dist/qualityIntelligence/runRoutes.js +357 -0
- package/dist/qualityIntelligence/traceabilityRoutes.d.ts +5 -0
- package/dist/qualityIntelligence/traceabilityRoutes.d.ts.map +1 -0
- package/dist/qualityIntelligence/traceabilityRoutes.js +173 -0
- package/dist/qualityIntelligence/uiRoutes.d.ts +7 -0
- package/dist/qualityIntelligence/uiRoutes.d.ts.map +1 -0
- package/dist/qualityIntelligence/uiRoutes.js +336 -0
- package/dist/read-handlers.d.ts +9 -0
- package/dist/read-handlers.d.ts.map +1 -0
- package/dist/read-handlers.js +265 -0
- package/dist/relationship-handlers.d.ts +191 -0
- package/dist/relationship-handlers.d.ts.map +1 -0
- package/dist/relationship-handlers.js +0 -0
- package/dist/routes.d.ts +37 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +507 -0
- package/dist/run-engine.d.ts +25 -0
- package/dist/run-engine.d.ts.map +1 -0
- package/dist/run-engine.js +385 -0
- package/dist/run-handlers.d.ts +9 -0
- package/dist/run-handlers.d.ts.map +1 -0
- package/dist/run-handlers.js +465 -0
- package/dist/run-request.d.ts +17 -0
- package/dist/run-request.d.ts.map +1 -0
- package/dist/run-request.js +219 -0
- package/dist/runs.d.ts +47 -0
- package/dist/runs.d.ts.map +1 -0
- package/dist/runs.js +100 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +152 -0
- package/dist/sink.d.ts +28 -0
- package/dist/sink.d.ts.map +1 -0
- package/dist/sink.js +80 -0
- package/dist/sse-write.d.ts +9 -0
- package/dist/sse-write.d.ts.map +1 -0
- package/dist/sse-write.js +26 -0
- package/dist/sse.d.ts +8 -0
- package/dist/sse.d.ts.map +1 -0
- package/dist/sse.js +27 -0
- package/dist/static.d.ts +5 -0
- package/dist/static.d.ts.map +1 -0
- package/dist/static.js +76 -0
- package/dist/store/chats.d.ts +17 -0
- package/dist/store/chats.d.ts.map +1 -0
- package/dist/store/chats.js +624 -0
- package/dist/store/db.d.ts +11 -0
- package/dist/store/db.d.ts.map +1 -0
- package/dist/store/db.js +203 -0
- package/dist/store/errors.d.ts +13 -0
- package/dist/store/errors.d.ts.map +1 -0
- package/dist/store/errors.js +30 -0
- package/dist/store/index.d.ts +7 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +6 -0
- package/dist/store/messages.d.ts +8 -0
- package/dist/store/messages.d.ts.map +1 -0
- package/dist/store/messages.js +149 -0
- package/dist/store/paths.d.ts +5 -0
- package/dist/store/paths.d.ts.map +1 -0
- package/dist/store/paths.js +84 -0
- package/dist/store/projects.d.ts +8 -0
- package/dist/store/projects.d.ts.map +1 -0
- package/dist/store/projects.js +59 -0
- package/dist/store/relationship-audit.d.ts +42 -0
- package/dist/store/relationship-audit.d.ts.map +1 -0
- package/dist/store/relationship-audit.js +155 -0
- package/dist/store/relationships.d.ts +191 -0
- package/dist/store/relationships.d.ts.map +1 -0
- package/dist/store/relationships.js +724 -0
- package/dist/store/schema.d.ts +4 -0
- package/dist/store/schema.d.ts.map +1 -0
- package/dist/store/schema.js +220 -0
- package/dist/store/types.d.ts +29 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +8 -0
- package/dist/store/validation.d.ts +7 -0
- package/dist/store/validation.d.ts.map +1 -0
- package/dist/store/validation.js +117 -0
- package/dist/store-handlers.d.ts +17 -0
- package/dist/store-handlers.d.ts.map +1 -0
- package/dist/store-handlers.js +872 -0
- package/dist/terminal-errors.d.ts +22 -0
- package/dist/terminal-errors.d.ts.map +1 -0
- package/dist/terminal-errors.js +45 -0
- package/dist/terminal-evidence.d.ts +21 -0
- package/dist/terminal-evidence.d.ts.map +1 -0
- package/dist/terminal-evidence.js +65 -0
- package/dist/terminal-routes.d.ts +10 -0
- package/dist/terminal-routes.d.ts.map +1 -0
- package/dist/terminal-routes.js +219 -0
- package/dist/terminal.d.ts +68 -0
- package/dist/terminal.d.ts.map +1 -0
- package/dist/terminal.js +855 -0
- package/package.json +52 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type ReviewItem } from "@oscharko-dev/keiko-memory-consolidation";
|
|
2
|
+
import type { MemoryVaultStore } from "@oscharko-dev/keiko-memory-vault";
|
|
3
|
+
import type { EvidenceStore } from "@oscharko-dev/keiko-evidence";
|
|
4
|
+
import type { UiHandlerDeps } from "./deps.js";
|
|
5
|
+
import type { RouteContext, RouteResult } from "./routes.js";
|
|
6
|
+
export interface MaintenanceCounts {
|
|
7
|
+
promoted: number;
|
|
8
|
+
archived: number;
|
|
9
|
+
forgotten: number;
|
|
10
|
+
superseded: number;
|
|
11
|
+
edgesCreated: number;
|
|
12
|
+
clustersInspected: number;
|
|
13
|
+
reviewItemsCreated: number;
|
|
14
|
+
}
|
|
15
|
+
export interface MaintenanceResult extends MaintenanceCounts {
|
|
16
|
+
readonly reviewItems: readonly ReviewItem[];
|
|
17
|
+
}
|
|
18
|
+
export interface RunMaintenanceOptions {
|
|
19
|
+
/** Injected clock. Defaults to Date.now(). Pass a fixed value to make the pass replay-stable. */
|
|
20
|
+
readonly nowMs?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function runMemoryMaintenance(vault: MemoryVaultStore, evidenceStore?: EvidenceStore, options?: RunMaintenanceOptions): MaintenanceResult;
|
|
23
|
+
export declare const MEMORY_AUTO_MAINTENANCE_MIN_INTERVAL_MS: number;
|
|
24
|
+
export declare function isMaintenanceDue(lastRunAtMs: number | undefined, nowMs: number, minIntervalMs?: number): boolean;
|
|
25
|
+
export interface AutoMaintenanceState {
|
|
26
|
+
lastRunAtMs?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface MaybeRunAutoMaintenanceOptions {
|
|
29
|
+
readonly nowMs: number;
|
|
30
|
+
readonly enabled: boolean;
|
|
31
|
+
readonly minIntervalMs?: number;
|
|
32
|
+
}
|
|
33
|
+
export declare function maybeRunAutoMaintenance(vault: MemoryVaultStore, evidenceStore: EvidenceStore | undefined, state: AutoMaintenanceState, options: MaybeRunAutoMaintenanceOptions): MaintenanceResult | null;
|
|
34
|
+
export declare function handleRunMaintenance(ctx: RouteContext, deps: UiHandlerDeps): RouteResult;
|
|
35
|
+
//# sourceMappingURL=memory-maintenance-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-maintenance-handlers.d.ts","sourceRoot":"","sources":["../src/memory-maintenance-handlers.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAc7F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI7D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C;AAuMD,MAAM,WAAW,qBAAqB;IACpC,iGAAiG;IACjG,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,gBAAgB,EACvB,aAAa,CAAC,EAAE,aAAa,EAC7B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,iBAAiB,CAkCnB;AAQD,eAAO,MAAM,uCAAuC,QAAqB,CAAC;AAI1E,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,KAAK,EAAE,MAAM,EACb,aAAa,GAAE,MAAgD,GAC9D,OAAO,CAIT;AAGD,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAMD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,gBAAgB,EACvB,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,8BAA8B,GACtC,iBAAiB,GAAG,IAAI,CAS1B;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,GAAG,WAAW,CAWxF"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
// Memory maintenance orchestrator (Epic #204) — the impure caller that drives the pure
|
|
2
|
+
// consolidation engine (#208) + maintenance planner (governance #209) against the vault (#206).
|
|
3
|
+
//
|
|
4
|
+
// POST /api/memory/maintenance runs a bounded, synchronous pass:
|
|
5
|
+
// 1. Load every memory (all scopes) + the access stats.
|
|
6
|
+
// 2. Run consolidation on the accepted subset; persist auto-applicable relationship edges and
|
|
7
|
+
// return unresolved review items for MemoriaViva or CLI operators. Conflict and merge review
|
|
8
|
+
// items are NEVER auto-applied here.
|
|
9
|
+
// 3. Compute the maintenance plan and apply it: promote (-> accepted), archive (-> archived),
|
|
10
|
+
// forget (vault delete + tombstone + reason). Confidence is immutable provenance and is never
|
|
11
|
+
// patched here (O-V2): reuse strengthens memories live in retrieval ranking, and disuse-decay
|
|
12
|
+
// is computed on the fly via the strength curve that gates archive/forget.
|
|
13
|
+
// 4. Emit one audit event per applied effect and return the counts.
|
|
14
|
+
//
|
|
15
|
+
// CSRF: the server dispatch layer enforces x-keiko-csrf for POST, so this route is guarded without
|
|
16
|
+
// any per-handler check. External faults (a vault write that throws) are wrapped into a typed 500
|
|
17
|
+
// rather than crashing the loopback server.
|
|
18
|
+
import { randomUUID } from "node:crypto";
|
|
19
|
+
import { runConsolidation } from "@oscharko-dev/keiko-memory-consolidation";
|
|
20
|
+
import { planMemoryMaintenance, } from "@oscharko-dev/keiko-memory-governance";
|
|
21
|
+
import { errorBody } from "./routes.js";
|
|
22
|
+
import { recordMemoryAudit } from "./memory-audit-handler.js";
|
|
23
|
+
function emptyCounts() {
|
|
24
|
+
return {
|
|
25
|
+
promoted: 0,
|
|
26
|
+
archived: 0,
|
|
27
|
+
forgotten: 0,
|
|
28
|
+
superseded: 0,
|
|
29
|
+
edgesCreated: 0,
|
|
30
|
+
clustersInspected: 0,
|
|
31
|
+
reviewItemsCreated: 0,
|
|
32
|
+
reviewItems: [],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function isRouteResult(value) {
|
|
36
|
+
return (typeof value === "object" && value !== null && typeof value.status === "number");
|
|
37
|
+
}
|
|
38
|
+
function resolveVault(deps) {
|
|
39
|
+
if (deps.memoryVault === undefined) {
|
|
40
|
+
return {
|
|
41
|
+
status: 503,
|
|
42
|
+
body: errorBody("MEMORY_UNAVAILABLE", "Memory vault is not configured."),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return deps.memoryVault;
|
|
46
|
+
}
|
|
47
|
+
function emitAudit(evidenceStore, nowMs, kind, surface, summary, extra) {
|
|
48
|
+
if (evidenceStore === undefined)
|
|
49
|
+
return;
|
|
50
|
+
const event = {
|
|
51
|
+
schemaVersion: "1",
|
|
52
|
+
kind,
|
|
53
|
+
eventId: randomUUID(),
|
|
54
|
+
occurredAt: nowMs,
|
|
55
|
+
initiatorSurface: surface,
|
|
56
|
+
summary,
|
|
57
|
+
...extra,
|
|
58
|
+
};
|
|
59
|
+
recordMemoryAudit({ evidenceStore }, event);
|
|
60
|
+
}
|
|
61
|
+
function recordsById(records) {
|
|
62
|
+
const map = new Map();
|
|
63
|
+
for (const record of records)
|
|
64
|
+
map.set(record.id, record);
|
|
65
|
+
return map;
|
|
66
|
+
}
|
|
67
|
+
// ─── Consolidation effects ───────────────────────────────────────────────────
|
|
68
|
+
function isAutoApplicableConsolidationEdge(edge) {
|
|
69
|
+
return (edge.kind === "derived-from" || edge.kind === "related" || edge.kind === "temporal-precedes");
|
|
70
|
+
}
|
|
71
|
+
function applyEdges(vault, edges) {
|
|
72
|
+
let created = 0;
|
|
73
|
+
for (const edge of edges) {
|
|
74
|
+
if (!isAutoApplicableConsolidationEdge(edge))
|
|
75
|
+
continue;
|
|
76
|
+
vault.insertEdge(edge);
|
|
77
|
+
created += 1;
|
|
78
|
+
}
|
|
79
|
+
return created;
|
|
80
|
+
}
|
|
81
|
+
function runConsolidationPass(vault, nowMs, records, counts) {
|
|
82
|
+
const result = runConsolidation(records, {
|
|
83
|
+
nowMs,
|
|
84
|
+
newEdgeId: () => randomUUID(),
|
|
85
|
+
newReviewItemId: () => randomUUID(),
|
|
86
|
+
});
|
|
87
|
+
counts.edgesCreated += applyEdges(vault, result.edgesProposed);
|
|
88
|
+
counts.clustersInspected += result.clustersInspected;
|
|
89
|
+
counts.reviewItemsCreated += result.reviewItems.length;
|
|
90
|
+
counts.reviewItems.push(...result.reviewItems);
|
|
91
|
+
}
|
|
92
|
+
// ─── Plan application ──────────────────────────────────────────────────────────
|
|
93
|
+
// Applies the archive / forget effects on the post-consolidation snapshot. Promotions are applied
|
|
94
|
+
// SEPARATELY and BEFORE consolidation (see runMemoryMaintenance) so that freshly-accepted memories
|
|
95
|
+
// are visible to conflict detection within the same maintenance pass.
|
|
96
|
+
//
|
|
97
|
+
// Confidence is NEVER mutated here (#204, O-V2): reinforcement-on-reuse is realised live in
|
|
98
|
+
// retrieval ranking, and disuse-decay is computed on the fly via the strength curve that already
|
|
99
|
+
// gates archive/forget — so provenance stays intact and every run is idempotent.
|
|
100
|
+
function applyFadeEffects(vault, evidenceStore, nowMs, plan, byId, counts) {
|
|
101
|
+
applyArchives(vault, evidenceStore, nowMs, plan.archive, byId, counts);
|
|
102
|
+
applyForgets(vault, evidenceStore, nowMs, plan.forget, byId, counts);
|
|
103
|
+
}
|
|
104
|
+
function applyPromotions(vault, evidenceStore, nowMs, ids, byId, counts) {
|
|
105
|
+
for (const id of ids) {
|
|
106
|
+
const record = byId.get(id);
|
|
107
|
+
if (record === undefined)
|
|
108
|
+
continue;
|
|
109
|
+
vault.updateMemory(id, { status: "accepted" }, nowMs);
|
|
110
|
+
counts.promoted += 1;
|
|
111
|
+
emitAudit(evidenceStore, nowMs, "memory:accepted", "memory-center", "Promoted a strong proposed memory.", { memoryId: id, scope: record.scope });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function applyArchives(vault, evidenceStore, nowMs, ids, byId, counts) {
|
|
115
|
+
for (const id of ids) {
|
|
116
|
+
const record = byId.get(id);
|
|
117
|
+
if (record === undefined)
|
|
118
|
+
continue;
|
|
119
|
+
vault.updateMemory(id, { status: "archived" }, nowMs);
|
|
120
|
+
counts.archived += 1;
|
|
121
|
+
emitAudit(evidenceStore, nowMs, "memory:archived", "retention", "Archived a faded memory.", {
|
|
122
|
+
memoryId: id,
|
|
123
|
+
scope: record.scope,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function applyForgets(vault, evidenceStore, nowMs, forgets, byId, counts) {
|
|
128
|
+
for (const forget of forgets) {
|
|
129
|
+
const record = byId.get(forget.id);
|
|
130
|
+
if (record === undefined)
|
|
131
|
+
continue;
|
|
132
|
+
vault.deleteMemory(forget.id, {
|
|
133
|
+
tombstone: true,
|
|
134
|
+
forgetterSurface: "memory-maintenance",
|
|
135
|
+
reason: forget.reason,
|
|
136
|
+
nowMs,
|
|
137
|
+
});
|
|
138
|
+
counts.forgotten += 1;
|
|
139
|
+
emitAudit(evidenceStore, nowMs, "memory:forgotten", "retention", `Forgot a memory (${forget.reason}).`, {
|
|
140
|
+
memoryId: forget.id,
|
|
141
|
+
scope: record.scope,
|
|
142
|
+
tombstoned: true,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
export function runMemoryMaintenance(vault, evidenceStore, options) {
|
|
147
|
+
// ONE clock for the whole pass: both plan phases and every vault write / audit timestamp use the
|
|
148
|
+
// same nowMs, so selection is consistent within a run and fully replay-stable when nowMs is
|
|
149
|
+
// injected (the deterministic-verification invariant the rest of the stack honours).
|
|
150
|
+
const nowMs = options?.nowMs ?? Date.now();
|
|
151
|
+
const counts = emptyCounts();
|
|
152
|
+
// Phase 1 — promote strong `proposed` memories FIRST. Consolidation and conflict detection only
|
|
153
|
+
// inspect `accepted` records, so without this a vault full of freshly-captured `proposed`
|
|
154
|
+
// memories would need a SECOND maintenance run before any near-duplicate or polarity conflict is
|
|
155
|
+
// resolved. Promoting up front makes a single "Run maintenance" fully effective.
|
|
156
|
+
const beforePromote = vault.listMemories({ includeExpired: true });
|
|
157
|
+
const promoteStats = vault.getAccessStats();
|
|
158
|
+
const promotePlan = planMemoryMaintenance(beforePromote, promoteStats, { nowMs });
|
|
159
|
+
applyPromotions(vault, evidenceStore, nowMs, promotePlan.promote, recordsById(beforePromote), counts);
|
|
160
|
+
// Phase 2 — consolidate the now-accepted set: link safe near-duplicate metadata and surface
|
|
161
|
+
// conflicts / merges as explicit review items. Status mutations require a later governed review.
|
|
162
|
+
const accepted = vault
|
|
163
|
+
.listMemories({ includeExpired: true })
|
|
164
|
+
.filter((record) => record.status === "accepted");
|
|
165
|
+
runConsolidationPass(vault, nowMs, accepted, counts);
|
|
166
|
+
// Phase 3 — archive / forget on the post-consolidation snapshot. The access stats feed the
|
|
167
|
+
// strength model; confidence itself is never mutated (O-V2).
|
|
168
|
+
const all = vault.listMemories({ includeExpired: true });
|
|
169
|
+
const accessStats = vault.getAccessStats();
|
|
170
|
+
const plan = planMemoryMaintenance(all, accessStats, { nowMs });
|
|
171
|
+
applyFadeEffects(vault, evidenceStore, nowMs, plan, recordsById(all), counts);
|
|
172
|
+
return counts;
|
|
173
|
+
}
|
|
174
|
+
// ─── Bounded autonomous maintenance (#204, O-V4) ───────────────────────────────
|
|
175
|
+
// The strength/decay/forget pass only "lives" if it actually runs. Rather than a free-running
|
|
176
|
+
// background loop (forbidden by the no-unbounded-hidden-activity invariant), maintenance is fired
|
|
177
|
+
// opportunistically — once memory is used — and rate-limited to at most once per interval. The pass
|
|
178
|
+
// itself is already bounded (maxForgetPerRun) and audited, so an autonomous fire is governed.
|
|
179
|
+
export const MEMORY_AUTO_MAINTENANCE_MIN_INTERVAL_MS = 6 * 60 * 60 * 1000; // 6 hours
|
|
180
|
+
// Pure: due iff never run, or the interval has elapsed. A non-finite/negative interval is treated as
|
|
181
|
+
// "never auto-run" so a misconfiguration can only DISABLE, never spin.
|
|
182
|
+
export function isMaintenanceDue(lastRunAtMs, nowMs, minIntervalMs = MEMORY_AUTO_MAINTENANCE_MIN_INTERVAL_MS) {
|
|
183
|
+
if (!Number.isFinite(minIntervalMs) || minIntervalMs <= 0)
|
|
184
|
+
return false;
|
|
185
|
+
if (lastRunAtMs === undefined)
|
|
186
|
+
return true;
|
|
187
|
+
return nowMs - lastRunAtMs >= minIntervalMs;
|
|
188
|
+
}
|
|
189
|
+
// Runs ONE bounded maintenance pass iff enabled AND due, advancing the cursor BEFORE running so a
|
|
190
|
+
// re-entrant call within the same tick cannot double-fire. Returns the result, or null when skipped.
|
|
191
|
+
// Never throws: a maintenance fault must not break the caller (e.g. a chat turn); it is swallowed
|
|
192
|
+
// after advancing the cursor so a persistently-failing pass cannot hot-loop.
|
|
193
|
+
export function maybeRunAutoMaintenance(vault, evidenceStore, state, options) {
|
|
194
|
+
if (!options.enabled)
|
|
195
|
+
return null;
|
|
196
|
+
if (!isMaintenanceDue(state.lastRunAtMs, options.nowMs, options.minIntervalMs))
|
|
197
|
+
return null;
|
|
198
|
+
state.lastRunAtMs = options.nowMs;
|
|
199
|
+
try {
|
|
200
|
+
return runMemoryMaintenance(vault, evidenceStore, { nowMs: options.nowMs });
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
export function handleRunMaintenance(ctx, deps) {
|
|
207
|
+
void ctx;
|
|
208
|
+
const vault = resolveVault(deps);
|
|
209
|
+
if (isRouteResult(vault))
|
|
210
|
+
return vault;
|
|
211
|
+
try {
|
|
212
|
+
const counts = runMemoryMaintenance(vault, deps.evidenceStore);
|
|
213
|
+
return { status: 200, body: counts };
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
const message = error instanceof Error ? error.message : "Memory maintenance failed.";
|
|
217
|
+
return { status: 500, body: errorBody("MEMORY_MAINTENANCE_FAILED", message) };
|
|
218
|
+
}
|
|
219
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CaptureOutcome } from "@oscharko-dev/keiko-memory-capture";
|
|
2
|
+
import type { MemoryId, MemoryRecord } from "@oscharko-dev/keiko-contracts/memory";
|
|
3
|
+
export declare function buildMemoryRecordFromProposal(proposalId: MemoryId, outcome: CaptureOutcome): MemoryRecord | null;
|
|
4
|
+
//# sourceMappingURL=memory-record-builders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-record-builders.d.ts","sourceRoot":"","sources":["../src/memory-record-builders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEnF,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,QAAQ,EACpB,OAAO,EAAE,cAAc,GACtB,YAAY,GAAG,IAAI,CAiBrB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function buildMemoryRecordFromProposal(proposalId, outcome) {
|
|
2
|
+
if (outcome.kind !== "candidate")
|
|
3
|
+
return null;
|
|
4
|
+
const { proposal } = outcome;
|
|
5
|
+
return {
|
|
6
|
+
id: proposalId,
|
|
7
|
+
schemaVersion: proposal.schemaVersion,
|
|
8
|
+
scope: proposal.scope,
|
|
9
|
+
type: proposal.type,
|
|
10
|
+
body: proposal.body,
|
|
11
|
+
tags: proposal.tags,
|
|
12
|
+
provenance: proposal.provenance,
|
|
13
|
+
validity: proposal.validity,
|
|
14
|
+
status: proposal.initialStatus,
|
|
15
|
+
pinned: false,
|
|
16
|
+
createdAt: proposal.proposedAt,
|
|
17
|
+
updatedAt: proposal.proposedAt,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { MemoryId, MemoryScope, MemoryStatus } from "@oscharko-dev/keiko-contracts";
|
|
2
|
+
import type { MemoryVaultStore } from "@oscharko-dev/keiko-memory-vault";
|
|
3
|
+
export interface MemoryRetentionPolicy {
|
|
4
|
+
readonly maxAgeMs?: number;
|
|
5
|
+
readonly maxRecordsPerScope?: number;
|
|
6
|
+
readonly expireProposalsAfterMs?: number;
|
|
7
|
+
readonly purgeForgottenAfterMs?: number;
|
|
8
|
+
}
|
|
9
|
+
export type MemoryRetentionReason = "expire-age" | "expire-proposal" | "evict-overflow";
|
|
10
|
+
export interface MemoryRetentionDecision {
|
|
11
|
+
readonly memoryId: MemoryId;
|
|
12
|
+
readonly scope: MemoryScope;
|
|
13
|
+
readonly reason: MemoryRetentionReason;
|
|
14
|
+
readonly updatedAt: number;
|
|
15
|
+
readonly status: MemoryStatus;
|
|
16
|
+
}
|
|
17
|
+
export interface MemoryRetentionResult {
|
|
18
|
+
readonly evaluated: number;
|
|
19
|
+
readonly forgotten: readonly MemoryRetentionDecision[];
|
|
20
|
+
readonly kept: number;
|
|
21
|
+
readonly byReason: Readonly<Record<MemoryRetentionReason, number>>;
|
|
22
|
+
readonly forgottenPurgeBacklog: number;
|
|
23
|
+
}
|
|
24
|
+
export interface ApplyMemoryRetentionOptions {
|
|
25
|
+
readonly vault: MemoryVaultStore;
|
|
26
|
+
readonly scopes: readonly MemoryScope[];
|
|
27
|
+
readonly policy: MemoryRetentionPolicy;
|
|
28
|
+
readonly nowMs: number;
|
|
29
|
+
}
|
|
30
|
+
export declare function applyMemoryRetention(options: ApplyMemoryRetentionOptions): MemoryRetentionResult;
|
|
31
|
+
//# sourceMappingURL=memory-retention.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-retention.d.ts","sourceRoot":"","sources":["../src/memory-retention.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACV,QAAQ,EAER,WAAW,EACX,YAAY,EACb,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAKzE,MAAM,WAAW,qBAAqB;IAGpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAI3B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAIrC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAGzC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CACzC;AAED,MAAM,MAAM,qBAAqB,GAAG,YAAY,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAExF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,SAAS,uBAAuB,EAAE,CAAC;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC;IAGnE,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACxC;AA2GD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,qBAAqB,CA8BhG"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// Memory retention policy enforcer (Epic #204, Issue #214).
|
|
2
|
+
//
|
|
3
|
+
// Pure-ish function over the public MemoryVaultStore port. For each caller-supplied scope
|
|
4
|
+
// it lists every memory, classifies each as `keep` / `expire-age` / `expire-proposal` /
|
|
5
|
+
// `evict-overflow`, and issues `vault.deleteMemory(id, { tombstone: true, ... })` for
|
|
6
|
+
// every non-keep classification. The audit handler (#214 bridge) observes the resulting
|
|
7
|
+
// `memory:tombstoned` events and appends `memory:forgotten` records to the audit ledger
|
|
8
|
+
// — retention enforcement is therefore self-audited through the existing seam.
|
|
9
|
+
//
|
|
10
|
+
// Hard invariants:
|
|
11
|
+
//
|
|
12
|
+
// - Pinned records are NEVER eligible for retention. The pin flag overrides every other
|
|
13
|
+
// classification reason; tested explicitly.
|
|
14
|
+
// - Retention iterates the scopes the caller passes. The public MemoryVaultStore has no
|
|
15
|
+
// `listAllScopes()` capability, so a global enumeration would require an internal
|
|
16
|
+
// port extension. Out of scope here.
|
|
17
|
+
// - Forgotten-purge (purgeForgottenAfterMs) uses the public vault port to delete only
|
|
18
|
+
// tombstones in the caller-supplied scopes whose forgottenAt is older than the
|
|
19
|
+
// deterministic cutoff.
|
|
20
|
+
//
|
|
21
|
+
// Why the operations are issued in a sequence of one-by-one deletes: the vault's delete
|
|
22
|
+
// is already wrapped in a SQLite transaction (#206), and emitting a batch API here would
|
|
23
|
+
// hide the per-event audit signal that the handler depends on.
|
|
24
|
+
import { memoryScopeKey } from "./memory-scope-sanitizer.js";
|
|
25
|
+
// ─── Pure classification ──────────────────────────────────────────────────────
|
|
26
|
+
function isAgeExpired(record, nowMs, policy) {
|
|
27
|
+
if (policy.maxAgeMs === undefined) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return nowMs - record.updatedAt > policy.maxAgeMs;
|
|
31
|
+
}
|
|
32
|
+
function isProposalExpired(record, nowMs, policy) {
|
|
33
|
+
if (policy.expireProposalsAfterMs === undefined) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (record.status !== "proposed") {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return nowMs - record.updatedAt > policy.expireProposalsAfterMs;
|
|
40
|
+
}
|
|
41
|
+
// Returns the records that should be evicted by `maxRecordsPerScope`. Pinned records are
|
|
42
|
+
// excluded from the count entirely so the cap applies to the non-pinned working set.
|
|
43
|
+
function selectOverflowEvictions(records, policy) {
|
|
44
|
+
if (policy.maxRecordsPerScope === undefined) {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
const nonPinned = records.filter((r) => !r.pinned);
|
|
48
|
+
if (nonPinned.length <= policy.maxRecordsPerScope) {
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
// Oldest-first by updatedAt, then by id so same-timestamp retention is deterministic
|
|
52
|
+
// across vault implementations and insertion orders.
|
|
53
|
+
const sorted = [...nonPinned].sort((a, b) => a.updatedAt - b.updatedAt || String(a.id).localeCompare(String(b.id)));
|
|
54
|
+
const overflowCount = nonPinned.length - policy.maxRecordsPerScope;
|
|
55
|
+
return sorted.slice(0, overflowCount);
|
|
56
|
+
}
|
|
57
|
+
// Returns either the reason a single record should be forgotten, or undefined to keep it.
|
|
58
|
+
// Pinned records always return undefined. The age check takes precedence over the
|
|
59
|
+
// proposal-expiry check so the reported reason is the most descriptive applicable kind.
|
|
60
|
+
function classifyAgeOrProposal(record, nowMs, policy) {
|
|
61
|
+
if (record.pinned) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
if (isAgeExpired(record, nowMs, policy)) {
|
|
65
|
+
return "expire-age";
|
|
66
|
+
}
|
|
67
|
+
if (isProposalExpired(record, nowMs, policy)) {
|
|
68
|
+
return "expire-proposal";
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
// Combines per-record age/proposal classification with the per-scope overflow eviction
|
|
73
|
+
// pass. Returns the deduplicated set of decisions; if a record qualifies under both an
|
|
74
|
+
// age rule and an overflow rule, the age rule wins (more descriptive).
|
|
75
|
+
function classifyScope(scope, records, nowMs, policy) {
|
|
76
|
+
const decisions = new Map();
|
|
77
|
+
for (const record of records) {
|
|
78
|
+
const reason = classifyAgeOrProposal(record, nowMs, policy);
|
|
79
|
+
if (reason === undefined) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
decisions.set(record.id, {
|
|
83
|
+
memoryId: record.id,
|
|
84
|
+
scope,
|
|
85
|
+
reason,
|
|
86
|
+
updatedAt: record.updatedAt,
|
|
87
|
+
status: record.status,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
for (const record of selectOverflowEvictions(records, policy)) {
|
|
91
|
+
if (decisions.has(record.id)) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
decisions.set(record.id, {
|
|
95
|
+
memoryId: record.id,
|
|
96
|
+
scope,
|
|
97
|
+
reason: "evict-overflow",
|
|
98
|
+
updatedAt: record.updatedAt,
|
|
99
|
+
status: record.status,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return [...decisions.values()];
|
|
103
|
+
}
|
|
104
|
+
export function applyMemoryRetention(options) {
|
|
105
|
+
const { vault, scopes, policy, nowMs } = options;
|
|
106
|
+
const decisions = new Map();
|
|
107
|
+
let evaluated = 0;
|
|
108
|
+
let forgottenPurgeBacklog = 0;
|
|
109
|
+
const uniqueScopes = [...new Map(scopes.map((scope) => [memoryScopeKey(scope), scope])).values()];
|
|
110
|
+
for (const scope of uniqueScopes) {
|
|
111
|
+
const records = vault.listMemoriesByScope(scope, { includeExpired: true });
|
|
112
|
+
evaluated += records.length;
|
|
113
|
+
for (const decision of classifyScope(scope, records, nowMs, policy)) {
|
|
114
|
+
decisions.set(decision.memoryId, decision);
|
|
115
|
+
}
|
|
116
|
+
forgottenPurgeBacklog += countPurgeBacklog(vault, scope, policy, nowMs);
|
|
117
|
+
}
|
|
118
|
+
const forgotten = [...decisions.values()];
|
|
119
|
+
for (const decision of forgotten) {
|
|
120
|
+
vault.deleteMemory(decision.memoryId, {
|
|
121
|
+
tombstone: true,
|
|
122
|
+
forgetterSurface: "retention",
|
|
123
|
+
reason: decision.reason,
|
|
124
|
+
nowMs,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
evaluated,
|
|
129
|
+
forgotten,
|
|
130
|
+
kept: evaluated - forgotten.length,
|
|
131
|
+
byReason: countByReason(forgotten),
|
|
132
|
+
forgottenPurgeBacklog,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function countByReason(decisions) {
|
|
136
|
+
const counts = {
|
|
137
|
+
"expire-age": 0,
|
|
138
|
+
"expire-proposal": 0,
|
|
139
|
+
"evict-overflow": 0,
|
|
140
|
+
};
|
|
141
|
+
for (const d of decisions) {
|
|
142
|
+
counts[d.reason] += 1;
|
|
143
|
+
}
|
|
144
|
+
return counts;
|
|
145
|
+
}
|
|
146
|
+
function countPurgeBacklog(vault, scope, policy, nowMs) {
|
|
147
|
+
if (policy.purgeForgottenAfterMs === undefined) {
|
|
148
|
+
return 0;
|
|
149
|
+
}
|
|
150
|
+
return vault.purgeTombstonesByScopeBefore(scope, nowMs - policy.purgeForgottenAfterMs);
|
|
151
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MemoryId, MemoryScope } from "@oscharko-dev/keiko-contracts/memory";
|
|
2
|
+
import { type RankingFusionMode } from "@oscharko-dev/keiko-memory-retrieval";
|
|
3
|
+
import type { MemoryVaultStore } from "@oscharko-dev/keiko-memory-vault";
|
|
4
|
+
import type { UiHandlerDeps } from "./deps.js";
|
|
5
|
+
export declare function conversationFusionMode(deps: UiHandlerDeps): RankingFusionMode;
|
|
6
|
+
export interface ConversationRetrievalSignals {
|
|
7
|
+
readonly semanticById?: ReadonlyMap<MemoryId, number> | undefined;
|
|
8
|
+
readonly strengthById: ReadonlyMap<MemoryId, number>;
|
|
9
|
+
readonly embeddingById: ReadonlyMap<MemoryId, Float32Array>;
|
|
10
|
+
}
|
|
11
|
+
export declare function buildConversationRetrievalSignals(deps: UiHandlerDeps, vault: MemoryVaultStore, queryText: string | undefined, scopes: readonly MemoryScope[], nowMs: number, safeForSecondaryModel: boolean, signal?: AbortSignal): Promise<ConversationRetrievalSignals>;
|
|
12
|
+
//# sourceMappingURL=memory-retrieval-signals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-retrieval-signals.d.ts","sourceRoot":"","sources":["../src/memory-retrieval-signals.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,QAAQ,EAAgB,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAChG,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAsB,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAE7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AA+D/C,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,GAAG,iBAAiB,CAE7E;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAClE,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAIrD,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;CAC7D;AAQD,wBAAsB,iCAAiC,CACrD,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,gBAAgB,EACvB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,KAAK,EAAE,MAAM,EACb,qBAAqB,EAAE,OAAO,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,4BAA4B,CAAC,CAyBvC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// Shared conversation-retrieval signal builder (#204, O-F4).
|
|
2
|
+
//
|
|
3
|
+
// Both conversation retrieval surfaces — the desktop chat path (chat-handlers) and the BFF
|
|
4
|
+
// /api/memory/context route (memory-conv-handlers) — need the same two model/usage-derived ranking
|
|
5
|
+
// signals on top of the pure lexical ranker:
|
|
6
|
+
// - semanticById: per-memory cosine of the query embedding to each candidate's stored vector
|
|
7
|
+
// (embedding-based recall), gated by the secondary-model egress check.
|
|
8
|
+
// - strengthById: per-memory reinforcement strength from the vault's access counters (O-P1).
|
|
9
|
+
// Previously only the chat path built them; the BFF route silently ran lexical-only. Centralising
|
|
10
|
+
// them here keeps the two surfaces from drifting (the same class of duplication C3 guards for
|
|
11
|
+
// suppression) and gives any future consumer of the route the stronger embedding signal by default.
|
|
12
|
+
//
|
|
13
|
+
// Pure of policy: the caller decides whether the query is egress-safe and passes that in. Graceful:
|
|
14
|
+
// no embedding model => semanticById undefined (byte-identical lexical fallback); empty access
|
|
15
|
+
// history => strengthById empty (the ranker zeroes its weight).
|
|
16
|
+
import { buildStrengthById, DEFAULT_LIST_BY_SCOPE_MAX_RESULTS, DEFAULT_STALE_CONFIDENCE_THRESHOLD, isMemorySuppressed, } from "@oscharko-dev/keiko-memory-retrieval";
|
|
17
|
+
import { cosineSimilarity, embedMemoryText } from "./memory-embedding.js";
|
|
18
|
+
// A candidate is worth scoring iff the ranker could surface it. A superset of the ranked set is
|
|
19
|
+
// harmless: ids the ranker filters out simply never read their semantic score.
|
|
20
|
+
function isSemanticRetrievalCandidate(record, nowMs) {
|
|
21
|
+
if (record.status === "superseded")
|
|
22
|
+
return false;
|
|
23
|
+
return !isMemorySuppressed(record, nowMs, DEFAULT_STALE_CONFIDENCE_THRESHOLD).suppressed;
|
|
24
|
+
}
|
|
25
|
+
function gatherCandidateIds(vault, scopes, nowMs, signal) {
|
|
26
|
+
const ids = [];
|
|
27
|
+
const seen = new Set();
|
|
28
|
+
for (const scope of scopes) {
|
|
29
|
+
throwIfAborted(signal);
|
|
30
|
+
for (const record of vault.listMemoriesByScope(scope, {
|
|
31
|
+
includeExpired: true,
|
|
32
|
+
limit: DEFAULT_LIST_BY_SCOPE_MAX_RESULTS,
|
|
33
|
+
})) {
|
|
34
|
+
throwIfAborted(signal);
|
|
35
|
+
if (!isSemanticRetrievalCandidate(record, nowMs))
|
|
36
|
+
continue;
|
|
37
|
+
if (seen.has(record.id))
|
|
38
|
+
continue;
|
|
39
|
+
seen.add(record.id);
|
|
40
|
+
ids.push(record.id);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return ids;
|
|
44
|
+
}
|
|
45
|
+
// Per-memory semantic score map for the candidate set, or undefined when no embedding model is
|
|
46
|
+
// configured (query embedding null) — that undefined drives the byte-identical lexical fallback in
|
|
47
|
+
// the ranker. A candidate whose stored vector is missing is omitted (semantic subscore 0 for it).
|
|
48
|
+
// Query-cosine scores for the candidate set, computed from the already-fetched embeddings. Gated by
|
|
49
|
+
// the egress check (it embeds the query). Returns undefined when no model / no query embedding.
|
|
50
|
+
async function semanticScoresFrom(deps, queryText, candidateIds, embeddings, signal) {
|
|
51
|
+
throwIfAborted(signal);
|
|
52
|
+
const queryEmbedding = await embedMemoryText(deps, queryText);
|
|
53
|
+
if (queryEmbedding === null)
|
|
54
|
+
return undefined;
|
|
55
|
+
throwIfAborted(signal);
|
|
56
|
+
const scores = new Map();
|
|
57
|
+
for (const id of candidateIds) {
|
|
58
|
+
throwIfAborted(signal);
|
|
59
|
+
const stored = embeddings.get(id);
|
|
60
|
+
if (stored === undefined)
|
|
61
|
+
continue;
|
|
62
|
+
scores.set(id, cosineSimilarity(queryEmbedding.vector, stored.vector));
|
|
63
|
+
}
|
|
64
|
+
return scores;
|
|
65
|
+
}
|
|
66
|
+
// Signal-fusion mode for the conversation retrieval surfaces (#204, O-F2). Opt-in via env to keep
|
|
67
|
+
// the release on the byte-identical weighted-sum default; set KEIKO_MEMORY_FUSION=rrf to enable
|
|
68
|
+
// rank-based Reciprocal Rank Fusion across both the chat and BFF paths.
|
|
69
|
+
export function conversationFusionMode(deps) {
|
|
70
|
+
return deps.env.KEIKO_MEMORY_FUSION === "rrf" ? "rrf" : "weighted-sum";
|
|
71
|
+
}
|
|
72
|
+
function throwIfAborted(signal) {
|
|
73
|
+
if (signal?.aborted === true) {
|
|
74
|
+
throw new Error("memory retrieval aborted");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export async function buildConversationRetrievalSignals(deps, vault, queryText, scopes, nowMs, safeForSecondaryModel, signal) {
|
|
78
|
+
throwIfAborted(signal);
|
|
79
|
+
const strengthById = buildStrengthById(vault.getAccessStats(), nowMs);
|
|
80
|
+
throwIfAborted(signal);
|
|
81
|
+
const candidateIds = gatherCandidateIds(vault, scopes, nowMs, signal);
|
|
82
|
+
throwIfAborted(signal);
|
|
83
|
+
const embeddings = candidateIds.length > 0
|
|
84
|
+
? vault.getEmbeddings(candidateIds)
|
|
85
|
+
: new Map();
|
|
86
|
+
throwIfAborted(signal);
|
|
87
|
+
const embeddingById = new Map();
|
|
88
|
+
for (const [id, row] of embeddings) {
|
|
89
|
+
throwIfAborted(signal);
|
|
90
|
+
embeddingById.set(id, row.vector);
|
|
91
|
+
}
|
|
92
|
+
const semanticById = safeForSecondaryModel && queryText !== undefined && queryText.length > 0 && embeddings.size > 0
|
|
93
|
+
? await semanticScoresFrom(deps, queryText, candidateIds, embeddings, signal)
|
|
94
|
+
: undefined;
|
|
95
|
+
return {
|
|
96
|
+
strengthById,
|
|
97
|
+
embeddingById,
|
|
98
|
+
...(semanticById !== undefined ? { semanticById } : {}),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ConversationMemoryActionWire } from "@oscharko-dev/keiko-contracts/bff-wire";
|
|
2
|
+
import type { UiHandlerDeps } from "./deps.js";
|
|
3
|
+
import { type ConversationMemoryRuntimeContext } from "./memory-conversation-context.js";
|
|
4
|
+
interface SalienceTurnRequest {
|
|
5
|
+
readonly content: string;
|
|
6
|
+
readonly memory: {
|
|
7
|
+
readonly enabled: boolean;
|
|
8
|
+
} | undefined;
|
|
9
|
+
}
|
|
10
|
+
export declare function captureSalientFromTurn(deps: UiHandlerDeps, request: SalienceTurnRequest, context: ConversationMemoryRuntimeContext, modelId: string, assistantText: string): Promise<readonly ConversationMemoryActionWire[]>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=memory-salience.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-salience.d.ts","sourceRoot":"","sources":["../src/memory-salience.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AAU3F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAEL,KAAK,gCAAgC,EACtC,MAAM,kCAAkC,CAAC;AA0H1C,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;CAC5D;AAID,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,gCAAgC,EACzC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,SAAS,4BAA4B,EAAE,CAAC,CA2ClD"}
|