@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,404 @@
|
|
|
1
|
+
// BFF routes for governed editor inline completion / ghost text (Issue #1200, ADR-0042 D5/D6).
|
|
2
|
+
//
|
|
3
|
+
// POST /api/editor/inline-completion — produce a single ghost-text continuation.
|
|
4
|
+
// POST /api/editor/inline-completion/telemetry — record content-free acceptance/rejection counts.
|
|
5
|
+
//
|
|
6
|
+
// Inline completion is model-only and GATED. Unlike the #1199 completion gateway there is no
|
|
7
|
+
// deterministic ghost-text tier: the route runs the model ONLY when the completion-model selection
|
|
8
|
+
// (#1210) elects an aligned ("instruct"/"edit-tuned") suffix-aware (FIM) model in budget, and only
|
|
9
|
+
// when the interaction mode fits the trigger — an "automatic" (as-you-type) request requires a FAST
|
|
10
|
+
// FIM model, an "explicit" request additionally accepts a slower manual-invoke FIM model. When no
|
|
11
|
+
// governed model is usable, the feature is disabled by policy, or the per-root rate limit is hit, the
|
|
12
|
+
// route returns ZERO items so the editor degrades to the deterministic completion gateway (#1199) —
|
|
13
|
+
// never a silent ungoverned model (ADR-0042 D5; Acceptance Criteria 1/4).
|
|
14
|
+
//
|
|
15
|
+
// Model-assisted inline completion enriches its prompt with governed coding context (#1211,
|
|
16
|
+
// `purpose: "inline"` — repository search only; embedding-cost providers are excluded as
|
|
17
|
+
// keystroke-sensitive), assembled server-side and recorded as content-free evidence. The response is
|
|
18
|
+
// content-free apart from the reviewable `insertText` ghost text: a source/provenance rollup with a
|
|
19
|
+
// SHA-256 prompt hash, never the prompt, the buffer, or any retrieved excerpt. The browser never
|
|
20
|
+
// reaches the Model Gateway, retrieval, or any provider directly (Acceptance Criterion 5). Request
|
|
21
|
+
// pacing is bounded server-side by a per-root rate limiter (cooldown + window cap) plus the per-call
|
|
22
|
+
// cost ceiling and an as-you-type latency budget; output is bounded by a hard character cap.
|
|
23
|
+
import { CODING_CONTEXT_BUDGETS, CODING_CONTEXT_SCHEMA_VERSION, EDITOR_INLINE_COMPLETION_SCHEMA_VERSION, isValidScopePath, parseEditorInlineCompletionRequest, parseEditorInlineCompletionTelemetry, stripUnsafeFormatChars, toCodingContextWirePack, } from "@oscharko-dev/keiko-contracts";
|
|
24
|
+
import { Gateway, selectCompletionModel } from "@oscharko-dev/keiko-model-gateway";
|
|
25
|
+
import { errorBody } from "../routes.js";
|
|
26
|
+
import { currentGatewayConfig } from "../deps.js";
|
|
27
|
+
import { readJsonObject, resolveRoot, runFilesHandler } from "../files.js";
|
|
28
|
+
import { assembleCodingContext } from "./codingContext.js";
|
|
29
|
+
import { recordCodingContextEvidence } from "./codingContextEvidence.js";
|
|
30
|
+
import { recordEditorCompletionModelEvidence } from "./completionModelEvidence.js";
|
|
31
|
+
import { recordInlineCompletionTelemetryEvidence } from "./inlineCompletionTelemetryEvidence.js";
|
|
32
|
+
import { clientAbortSignal, resolveOverlayPath } from "./languageRoutes.js";
|
|
33
|
+
import { buildInlineCompletionPrompt, generateInlineCompletion, } from "./editorInlineCompletionModel.js";
|
|
34
|
+
import { createInlineCompletionRateLimiter, } from "./inlineCompletionRateLimiter.js";
|
|
35
|
+
import { estimateEditorModelReservationTokens, settleModelUsage, sharedEditorModelTokenBudget, } from "./editorModelTokenBudget.js";
|
|
36
|
+
// Body cap: the overlay buffer may be up to the document-size cap; allow 64 KiB of JSON on top. The
|
|
37
|
+
// language-service document cap is reused via the coding-context completion budget's source ceiling.
|
|
38
|
+
const MAX_INLINE_BODY_BYTES = 1_048_576 + 64 * 1024;
|
|
39
|
+
const MAX_TELEMETRY_BODY_BYTES = 16 * 1024;
|
|
40
|
+
// Content-free identifier of the inline-completion governance policy version (audit correlation).
|
|
41
|
+
const INLINE_COMPLETION_GATEWAY_POLICY_VERSION = "editor-inline-completion/1";
|
|
42
|
+
// Hard upper bound on generated ghost-text length; `maxOutputTokens` may lower it (≈4 chars/token).
|
|
43
|
+
const MAX_INLINE_INSERT_TEXT_CHARS = 2_000;
|
|
44
|
+
const APPROX_CHARS_PER_TOKEN = 4;
|
|
45
|
+
const MAX_CONTEXT_CHANGED_FILES = 64;
|
|
46
|
+
// p95 latency budget for as-you-type ghost text (ADR-0042 D5): a fast FIM call self-cancels past it.
|
|
47
|
+
const MODEL_AS_YOU_TYPE_TIMEOUT_MS = 750;
|
|
48
|
+
// Policy/configuration gate (Acceptance Criterion 7). The feature is ENABLED by default; a deployment
|
|
49
|
+
// disables it by setting this env var to a falsy token.
|
|
50
|
+
const INLINE_COMPLETION_POLICY_ENV = "KEIKO_EDITOR_INLINE_COMPLETION";
|
|
51
|
+
const INLINE_COMPLETION_MAX_COST_CLASS_ENV = "KEIKO_EDITOR_INLINE_COMPLETION_MAX_COST_CLASS";
|
|
52
|
+
const DEFAULT_INLINE_COMPLETION_MAX_COST_CLASS = "low";
|
|
53
|
+
const COST_CLASS_RANK = { low: 0, medium: 1, high: 2 };
|
|
54
|
+
const DISABLE_TOKENS = new Set(["0", "false", "off", "no", "disabled"]);
|
|
55
|
+
// Process-wide default limiter: shared so pacing spans requests within a server lifetime.
|
|
56
|
+
const sharedRateLimiter = createInlineCompletionRateLimiter();
|
|
57
|
+
// Default chat seam: route the elected model through the Model Gateway, server-side only.
|
|
58
|
+
function defaultChatFactory(config, modelId) {
|
|
59
|
+
const gateway = new Gateway(config);
|
|
60
|
+
return async (chatRequest, chatSignal) => {
|
|
61
|
+
const response = await gateway.chat({
|
|
62
|
+
modelId,
|
|
63
|
+
messages: [
|
|
64
|
+
{ role: "system", content: chatRequest.system },
|
|
65
|
+
{ role: "user", content: chatRequest.user },
|
|
66
|
+
],
|
|
67
|
+
cancellationSignal: chatSignal,
|
|
68
|
+
});
|
|
69
|
+
return { content: response.content, usage: response.usage };
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/** Whether inline completion is enabled by deployment policy (default on; env toggle off). */
|
|
73
|
+
export function isInlineCompletionEnabledByPolicy(env) {
|
|
74
|
+
const raw = env?.[INLINE_COMPLETION_POLICY_ENV];
|
|
75
|
+
if (raw === undefined) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
return !DISABLE_TOKENS.has(raw.trim().toLowerCase());
|
|
79
|
+
}
|
|
80
|
+
function parseCostClass(value) {
|
|
81
|
+
const trimmed = value?.trim().toLowerCase();
|
|
82
|
+
if (trimmed === "low" || trimmed === "medium" || trimmed === "high") {
|
|
83
|
+
return trimmed;
|
|
84
|
+
}
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
function stricterCostClass(left, right) {
|
|
88
|
+
return COST_CLASS_RANK[left] <= COST_CLASS_RANK[right] ? left : right;
|
|
89
|
+
}
|
|
90
|
+
export function inlineCompletionMaxCostClassFromPolicy(env) {
|
|
91
|
+
return (parseCostClass(env?.[INLINE_COMPLETION_MAX_COST_CLASS_ENV]) ??
|
|
92
|
+
DEFAULT_INLINE_COMPLETION_MAX_COST_CLASS);
|
|
93
|
+
}
|
|
94
|
+
function effectiveMaxCostClass(request, env) {
|
|
95
|
+
const serverCeiling = inlineCompletionMaxCostClassFromPolicy(env);
|
|
96
|
+
return request.maxCostClass === undefined
|
|
97
|
+
? serverCeiling
|
|
98
|
+
: stricterCostClass(serverCeiling, request.maxCostClass);
|
|
99
|
+
}
|
|
100
|
+
function redactPromptText(deps, value) {
|
|
101
|
+
const stripped = stripUnsafeFormatChars(value);
|
|
102
|
+
const redacted = deps.redactor(stripped);
|
|
103
|
+
return typeof redacted === "string" ? redacted : stripped;
|
|
104
|
+
}
|
|
105
|
+
function isRouteResult(value) {
|
|
106
|
+
return typeof value === "object" && value !== null && "status" in value && "body" in value;
|
|
107
|
+
}
|
|
108
|
+
function noItemOutcome(mode, degradeReason, modelId, latencyClass) {
|
|
109
|
+
return { item: null, modelMode: mode, degradeReason, modelId, latencyClass, contextSources: [] };
|
|
110
|
+
}
|
|
111
|
+
function buildContextRequest(request) {
|
|
112
|
+
return {
|
|
113
|
+
schemaVersion: CODING_CONTEXT_SCHEMA_VERSION,
|
|
114
|
+
purpose: "inline",
|
|
115
|
+
documentPath: request.document.path,
|
|
116
|
+
symbol: request.context?.symbol,
|
|
117
|
+
queryText: request.context?.queryText,
|
|
118
|
+
changedFiles: request.context?.changedFiles,
|
|
119
|
+
capsuleId: request.context?.capsuleId,
|
|
120
|
+
capsuleSetId: request.context?.capsuleSetId,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function effectiveContextBudgetBytes(request) {
|
|
124
|
+
return Math.min(CODING_CONTEXT_BUDGETS.inline.budgetBytes, Math.max(0, Math.trunc(request.contextBudgetBytes)));
|
|
125
|
+
}
|
|
126
|
+
function effectiveMaxInsertTextChars(request) {
|
|
127
|
+
const fromTokens = request.maxOutputTokens === undefined
|
|
128
|
+
? MAX_INLINE_INSERT_TEXT_CHARS
|
|
129
|
+
: request.maxOutputTokens * APPROX_CHARS_PER_TOKEN;
|
|
130
|
+
return Math.min(MAX_INLINE_INSERT_TEXT_CHARS, fromTokens);
|
|
131
|
+
}
|
|
132
|
+
function modelSignal(selection, signal, timeoutMs) {
|
|
133
|
+
if (selection.mode !== "as-you-type") {
|
|
134
|
+
return signal;
|
|
135
|
+
}
|
|
136
|
+
return AbortSignal.any([signal, AbortSignal.timeout(timeoutMs)]);
|
|
137
|
+
}
|
|
138
|
+
// Whether the elected interaction mode is eligible for THIS trigger: as-you-type runs on either
|
|
139
|
+
// trigger; the slower manual-invoke mode runs only on an explicit invocation, bounding per-keystroke
|
|
140
|
+
// model cost (ADR-0042 D5).
|
|
141
|
+
function modeEligibleForTrigger(selection, triggerKind) {
|
|
142
|
+
if (selection.mode === "as-you-type") {
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
return selection.mode === "manual" && triggerKind === "explicit";
|
|
146
|
+
}
|
|
147
|
+
// Map the coding-context source kinds that actually contributed an excerpt to the AC7 source vocab.
|
|
148
|
+
function contextSourcesFromPack(pack) {
|
|
149
|
+
const mapping = {
|
|
150
|
+
"repo-search": "repository-context",
|
|
151
|
+
"local-knowledge": "local-knowledge",
|
|
152
|
+
memory: "memory",
|
|
153
|
+
"connected-context": "connected-context",
|
|
154
|
+
};
|
|
155
|
+
const sources = new Set();
|
|
156
|
+
for (const excerpt of pack.excerpts) {
|
|
157
|
+
const mapped = mapping[excerpt.citation.sourceKind];
|
|
158
|
+
if (mapped !== undefined) {
|
|
159
|
+
sources.add(mapped);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return [...sources];
|
|
163
|
+
}
|
|
164
|
+
function inlineGenerationInput(ctx, pack) {
|
|
165
|
+
return {
|
|
166
|
+
overlayText: ctx.request.document.text,
|
|
167
|
+
position: ctx.request.position,
|
|
168
|
+
languageId: ctx.request.document.languageId,
|
|
169
|
+
contextPack: pack,
|
|
170
|
+
maxInsertTextChars: effectiveMaxInsertTextChars(ctx.request),
|
|
171
|
+
redactText: (value) => redactPromptText(ctx.deps, value),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
function maxOutputTokensForModel(config, modelId) {
|
|
175
|
+
const capability = config.capabilities?.find((candidate) => candidate.id === modelId);
|
|
176
|
+
return Math.max(1, capability?.maxOutputTokens ?? Math.ceil(MAX_INLINE_INSERT_TEXT_CHARS / 4));
|
|
177
|
+
}
|
|
178
|
+
function reserveInlineCompletion(ctx, input) {
|
|
179
|
+
const prompt = buildInlineCompletionPrompt(input);
|
|
180
|
+
return ctx.tokenBudget.tryReserve(ctx.realRoot, ctx.nowMs, estimateEditorModelReservationTokens(prompt, maxOutputTokensForModel(ctx.config, ctx.modelId)));
|
|
181
|
+
}
|
|
182
|
+
function recordInlineModelEvidence(ctx, generated) {
|
|
183
|
+
recordEditorCompletionModelEvidence(ctx.deps.evidenceStore, ctx.deps.redactor, {
|
|
184
|
+
modelId: ctx.modelId,
|
|
185
|
+
modelMode: ctx.selection.mode,
|
|
186
|
+
latencyClass: ctx.selection.latencyClass,
|
|
187
|
+
gatewayPolicyVersion: INLINE_COMPLETION_GATEWAY_POLICY_VERSION,
|
|
188
|
+
promptHash: generated.promptHash,
|
|
189
|
+
itemCount: generated.insertText === null ? 0 : 1,
|
|
190
|
+
truncated: generated.truncated,
|
|
191
|
+
usage: generated.usage,
|
|
192
|
+
}, ctx.nowMs);
|
|
193
|
+
}
|
|
194
|
+
function inlineOutcomeFromGenerated(ctx, pack, generated) {
|
|
195
|
+
const insertText = generated.insertText;
|
|
196
|
+
return {
|
|
197
|
+
item: insertText === null ? null : { insertText },
|
|
198
|
+
modelMode: ctx.selection.mode,
|
|
199
|
+
modelId: ctx.modelId,
|
|
200
|
+
latencyClass: ctx.selection.latencyClass,
|
|
201
|
+
promptHash: generated.promptHash,
|
|
202
|
+
contextSources: insertText === null ? [] : contextSourcesFromPack(pack),
|
|
203
|
+
...(generated.usage === undefined ? {} : { usage: generated.usage }),
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
// Runs the elected model: assembles coding context (#1211), records content-free evidence, calls the
|
|
207
|
+
// gateway through the injected chat factory, and filters the output. A failure throws to the caller,
|
|
208
|
+
// which degrades.
|
|
209
|
+
async function runElectedInlineModel(ctx) {
|
|
210
|
+
const pack = await assembleCodingContext(buildContextRequest(ctx.request), {
|
|
211
|
+
deps: ctx.deps,
|
|
212
|
+
realRoot: ctx.realRoot,
|
|
213
|
+
signal: ctx.signal,
|
|
214
|
+
nowMs: ctx.nowMs,
|
|
215
|
+
budgetBytes: effectiveContextBudgetBytes(ctx.request),
|
|
216
|
+
});
|
|
217
|
+
recordCodingContextEvidence(ctx.deps.evidenceStore, ctx.deps.redactor, toCodingContextWirePack(pack), ctx.nowMs);
|
|
218
|
+
const generationInput = inlineGenerationInput(ctx, pack);
|
|
219
|
+
const reservation = reserveInlineCompletion(ctx, generationInput);
|
|
220
|
+
if (reservation === undefined) {
|
|
221
|
+
return noItemOutcome(ctx.selection.mode, undefined, ctx.modelId, ctx.selection.latencyClass);
|
|
222
|
+
}
|
|
223
|
+
const generated = await generateInlineCompletion(generationInput, ctx.chatFactory(ctx.config, ctx.modelId), ctx.signal);
|
|
224
|
+
settleModelUsage(reservation, generated.usage);
|
|
225
|
+
recordInlineModelEvidence(ctx, generated);
|
|
226
|
+
return inlineOutcomeFromGenerated(ctx, pack, generated);
|
|
227
|
+
}
|
|
228
|
+
// Order of gates: gateway configured → model selection (cost ceiling + aligned-FIM guardrail, in
|
|
229
|
+
// selectCompletionModel) → trigger/mode eligibility. (Policy and rate limiting are applied by the
|
|
230
|
+
// caller around this decision.)
|
|
231
|
+
function decideInlineModel(request, deps) {
|
|
232
|
+
const config = currentGatewayConfig(deps);
|
|
233
|
+
if (config === undefined) {
|
|
234
|
+
return {
|
|
235
|
+
kind: "skip",
|
|
236
|
+
outcome: noItemOutcome("deterministic", "no-infilling-model", undefined, undefined),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
const selection = selectCompletionModel(config, {
|
|
240
|
+
maxCostClass: effectiveMaxCostClass(request, deps.env),
|
|
241
|
+
});
|
|
242
|
+
const modelId = selection.modelId;
|
|
243
|
+
if (selection.mode === "deterministic" ||
|
|
244
|
+
modelId === undefined ||
|
|
245
|
+
!modeEligibleForTrigger(selection, request.triggerKind)) {
|
|
246
|
+
return {
|
|
247
|
+
kind: "skip",
|
|
248
|
+
outcome: noItemOutcome(selection.mode, selection.degradeReason, modelId, selection.latencyClass),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
return { kind: "run", selection, modelId, config };
|
|
252
|
+
}
|
|
253
|
+
// True when the per-root request-rate limiter (#1200) blocks the model tier. The token ceiling
|
|
254
|
+
// (#1206 LLM10) reserves immediately before the provider call once the prompt is known.
|
|
255
|
+
function inlineModelTierRateBlocked(realRoot, nowMs, limiter) {
|
|
256
|
+
return !limiter.tryAcquire(realRoot, nowMs);
|
|
257
|
+
}
|
|
258
|
+
// Decides whether the gated model tier runs and, if so, runs it. Order: policy → model decision →
|
|
259
|
+
// per-root request and token ceilings → run (a model/retrieval failure degrades to zero items).
|
|
260
|
+
async function runInlineModelTier(request, realRoot, signal, deps, options) {
|
|
261
|
+
const now = options.now ?? Date.now;
|
|
262
|
+
if (!isInlineCompletionEnabledByPolicy(deps.env)) {
|
|
263
|
+
return noItemOutcome("deterministic", undefined, undefined, undefined);
|
|
264
|
+
}
|
|
265
|
+
const decision = decideInlineModel(request, deps);
|
|
266
|
+
if (decision.kind === "skip") {
|
|
267
|
+
return decision.outcome;
|
|
268
|
+
}
|
|
269
|
+
const { selection, modelId, config } = decision;
|
|
270
|
+
const limiter = options.rateLimiter ?? sharedRateLimiter;
|
|
271
|
+
const tokenBudget = options.tokenBudget ?? sharedEditorModelTokenBudget;
|
|
272
|
+
if (inlineModelTierRateBlocked(realRoot, now(), limiter)) {
|
|
273
|
+
// Request rate (#1200) hit: render no ghost text (degrade to #1199).
|
|
274
|
+
return noItemOutcome(selection.mode, undefined, modelId, selection.latencyClass);
|
|
275
|
+
}
|
|
276
|
+
try {
|
|
277
|
+
const outcome = await runElectedInlineModel({
|
|
278
|
+
request,
|
|
279
|
+
realRoot,
|
|
280
|
+
signal: modelSignal(selection, signal, options.asYouTypeTimeoutMs ?? MODEL_AS_YOU_TYPE_TIMEOUT_MS),
|
|
281
|
+
deps,
|
|
282
|
+
selection,
|
|
283
|
+
modelId,
|
|
284
|
+
chatFactory: options.chatFactory ?? defaultChatFactory,
|
|
285
|
+
config,
|
|
286
|
+
nowMs: now(),
|
|
287
|
+
tokenBudget,
|
|
288
|
+
});
|
|
289
|
+
return outcome;
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
// ADR-0042 D5 / AC1: a model or retrieval failure renders no ghost text; it never breaks the route.
|
|
293
|
+
return noItemOutcome(selection.mode, selection.degradeReason, modelId, selection.latencyClass);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// ─── Request sanitisation (mirrors the completion gateway's containment checks) ──────────────────
|
|
297
|
+
function dedupeChangedFiles(paths) {
|
|
298
|
+
return [...new Set(paths)];
|
|
299
|
+
}
|
|
300
|
+
function invalidChangedFiles(message) {
|
|
301
|
+
return { status: 400, body: errorBody("INVALID_REQUEST", message) };
|
|
302
|
+
}
|
|
303
|
+
function sanitizeChangedFiles(realRoot, changedFiles) {
|
|
304
|
+
if (changedFiles === undefined) {
|
|
305
|
+
return undefined;
|
|
306
|
+
}
|
|
307
|
+
const deduped = dedupeChangedFiles(changedFiles);
|
|
308
|
+
if (deduped.length > MAX_CONTEXT_CHANGED_FILES) {
|
|
309
|
+
return invalidChangedFiles(`context.changedFiles must contain at most ${MAX_CONTEXT_CHANGED_FILES.toString()} paths.`);
|
|
310
|
+
}
|
|
311
|
+
for (const changed of deduped) {
|
|
312
|
+
if (!isValidScopePath(changed, { mustBeRelative: true })) {
|
|
313
|
+
return invalidChangedFiles(`context.changedFiles contains an invalid workspace-relative path: ${changed}`);
|
|
314
|
+
}
|
|
315
|
+
resolveOverlayPath(realRoot, changed);
|
|
316
|
+
}
|
|
317
|
+
return deduped.length > 0 ? deduped : undefined;
|
|
318
|
+
}
|
|
319
|
+
function sanitizeRequestContext(request, realRoot) {
|
|
320
|
+
const changedFiles = sanitizeChangedFiles(realRoot, request.context?.changedFiles);
|
|
321
|
+
if (isRouteResult(changedFiles)) {
|
|
322
|
+
return changedFiles;
|
|
323
|
+
}
|
|
324
|
+
if (request.context === undefined) {
|
|
325
|
+
return request;
|
|
326
|
+
}
|
|
327
|
+
return {
|
|
328
|
+
...request,
|
|
329
|
+
context: {
|
|
330
|
+
...(request.context.queryText === undefined ? {} : { queryText: request.context.queryText }),
|
|
331
|
+
...(request.context.symbol === undefined ? {} : { symbol: request.context.symbol }),
|
|
332
|
+
...(request.context.capsuleId === undefined ? {} : { capsuleId: request.context.capsuleId }),
|
|
333
|
+
...(request.context.capsuleSetId === undefined
|
|
334
|
+
? {}
|
|
335
|
+
: { capsuleSetId: request.context.capsuleSetId }),
|
|
336
|
+
...(changedFiles === undefined ? {} : { changedFiles }),
|
|
337
|
+
},
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
// ─── Wire-response assembly ──────────────────────────────────────────────────────────────────────
|
|
341
|
+
function buildProvenance(outcome, produced) {
|
|
342
|
+
const sources = produced
|
|
343
|
+
? ["model-assisted", ...outcome.contextSources]
|
|
344
|
+
: [];
|
|
345
|
+
return {
|
|
346
|
+
sources: [...new Set(sources)],
|
|
347
|
+
modelMode: outcome.modelMode,
|
|
348
|
+
...(outcome.degradeReason === undefined ? {} : { degradeReason: outcome.degradeReason }),
|
|
349
|
+
...(produced && outcome.modelId !== undefined ? { modelId: outcome.modelId } : {}),
|
|
350
|
+
...(produced && outcome.latencyClass !== undefined
|
|
351
|
+
? { latencyClass: outcome.latencyClass }
|
|
352
|
+
: {}),
|
|
353
|
+
...(produced ? { gatewayPolicyVersion: INLINE_COMPLETION_GATEWAY_POLICY_VERSION } : {}),
|
|
354
|
+
...(produced && outcome.promptHash !== undefined ? { promptHash: outcome.promptHash } : {}),
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
function buildWireResponse(outcome) {
|
|
358
|
+
const items = outcome.item === null ? [] : [{ insertText: outcome.item.insertText }];
|
|
359
|
+
return {
|
|
360
|
+
schemaVersion: EDITOR_INLINE_COMPLETION_SCHEMA_VERSION,
|
|
361
|
+
items,
|
|
362
|
+
provenance: buildProvenance(outcome, items.length > 0),
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
// ─── Routes ───────────────────────────────────────────────────────────────────────────────────
|
|
366
|
+
export async function handleEditorInlineCompletion(ctx, deps, options = {}) {
|
|
367
|
+
const body = await readJsonObject(ctx.req, MAX_INLINE_BODY_BYTES);
|
|
368
|
+
if (isRouteResult(body)) {
|
|
369
|
+
return body;
|
|
370
|
+
}
|
|
371
|
+
const parsed = parseEditorInlineCompletionRequest(body);
|
|
372
|
+
if (!parsed.ok) {
|
|
373
|
+
return { status: 400, body: errorBody("INVALID_REQUEST", parsed.errors.join("; ")) };
|
|
374
|
+
}
|
|
375
|
+
const request = parsed.value;
|
|
376
|
+
return runFilesHandler(async () => {
|
|
377
|
+
const root = await resolveRoot(deps.store, request.root, deps.redactor);
|
|
378
|
+
// Containment check for the overlay document path (throws on escape → handled by runFilesHandler).
|
|
379
|
+
resolveOverlayPath(root.realRoot, request.document.path);
|
|
380
|
+
const sanitizedRequest = sanitizeRequestContext(request, root.realRoot);
|
|
381
|
+
if (isRouteResult(sanitizedRequest)) {
|
|
382
|
+
return sanitizedRequest;
|
|
383
|
+
}
|
|
384
|
+
const signal = clientAbortSignal(ctx);
|
|
385
|
+
const outcome = await runInlineModelTier(sanitizedRequest, root.realRoot, signal, deps, options);
|
|
386
|
+
return { status: 200, body: deps.redactor(buildWireResponse(outcome)) };
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
export async function handleEditorInlineCompletionTelemetry(ctx, deps, options = {}) {
|
|
390
|
+
const body = await readJsonObject(ctx.req, MAX_TELEMETRY_BODY_BYTES);
|
|
391
|
+
if (isRouteResult(body)) {
|
|
392
|
+
return body;
|
|
393
|
+
}
|
|
394
|
+
const parsed = parseEditorInlineCompletionTelemetry(body);
|
|
395
|
+
if (!parsed.ok) {
|
|
396
|
+
return { status: 400, body: errorBody("INVALID_REQUEST", parsed.errors.join("; ")) };
|
|
397
|
+
}
|
|
398
|
+
return runFilesHandler(async () => {
|
|
399
|
+
const root = await resolveRoot(deps.store, parsed.value.root, deps.redactor);
|
|
400
|
+
const now = options.now ?? Date.now;
|
|
401
|
+
recordInlineCompletionTelemetryEvidence(deps.evidenceStore, deps.redactor, { ...parsed.value, root: root.realRoot }, now());
|
|
402
|
+
return { status: 200, body: deps.redactor({ ok: true }) };
|
|
403
|
+
});
|
|
404
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { EditorInlineCompletionTelemetryReport, EvidenceStore } from "@oscharko-dev/keiko-contracts";
|
|
2
|
+
import type { Redactor } from "../deps.js";
|
|
3
|
+
export declare const EDITOR_INLINE_COMPLETION_TELEMETRY_EVIDENCE_SCHEMA_VERSION: "1";
|
|
4
|
+
export declare function recordInlineCompletionTelemetryEvidence(store: EvidenceStore, redactor: Redactor, report: EditorInlineCompletionTelemetryReport, emittedAtMs: number): string;
|
|
5
|
+
//# sourceMappingURL=inlineCompletionTelemetryEvidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inlineCompletionTelemetryEvidence.d.ts","sourceRoot":"","sources":["../../src/editor/inlineCompletionTelemetryEvidence.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,qCAAqC,EACrC,aAAa,EACd,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,0DAA0D,EAAG,GAAY,CAAC;AAWvF,wBAAgB,uCAAuC,CACrD,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,qCAAqC,EAC7C,WAAW,EAAE,MAAM,GAClB,MAAM,CA0BR"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Content-free audit linkage for inline-completion acceptance/rejection telemetry (Issue #1200,
|
|
2
|
+
// Acceptance Criterion 6; EU AI Act Reg. (EU) 2024/1689 Art. 12 record-keeping). The record carries
|
|
3
|
+
// only counts, latency aggregates, plus a HASH of the workspace root — never the root path itself,
|
|
4
|
+
// never buffer text, inserted ghost text, prompts, or any code content. It is the auditable
|
|
5
|
+
// acceptance-rate and p50/p95 latency signal the product can report without persisting what the user
|
|
6
|
+
// typed or accepted.
|
|
7
|
+
import { createHash } from "node:crypto";
|
|
8
|
+
export const EDITOR_INLINE_COMPLETION_TELEMETRY_EVIDENCE_SCHEMA_VERSION = "1";
|
|
9
|
+
function sha256Hex(value) {
|
|
10
|
+
return createHash("sha256").update(value, "utf8").digest("hex");
|
|
11
|
+
}
|
|
12
|
+
function telemetryEvidenceRunId(rootHash, emittedAtMs) {
|
|
13
|
+
const digest = sha256Hex(`${rootHash}\n${String(emittedAtMs)}`).slice(0, 16);
|
|
14
|
+
return `editor-inline-completion-telemetry-${digest}`;
|
|
15
|
+
}
|
|
16
|
+
export function recordInlineCompletionTelemetryEvidence(store, redactor, report, emittedAtMs) {
|
|
17
|
+
// Hash the root so the evidence never carries a workspace filesystem path.
|
|
18
|
+
const rootHash = sha256Hex(report.root);
|
|
19
|
+
const runId = telemetryEvidenceRunId(rootHash, emittedAtMs);
|
|
20
|
+
const manifest = {
|
|
21
|
+
editorInlineCompletionTelemetrySchemaVersion: EDITOR_INLINE_COMPLETION_TELEMETRY_EVIDENCE_SCHEMA_VERSION,
|
|
22
|
+
runId,
|
|
23
|
+
emittedAtMs,
|
|
24
|
+
rootHash,
|
|
25
|
+
offered: report.offered,
|
|
26
|
+
shown: report.shown,
|
|
27
|
+
accepted: report.accepted,
|
|
28
|
+
rejected: report.rejected,
|
|
29
|
+
ignored: report.ignored,
|
|
30
|
+
partiallyAccepted: report.partiallyAccepted,
|
|
31
|
+
requestCount: report.requestCount,
|
|
32
|
+
requestLatencyMsP50: report.requestLatencyMsP50,
|
|
33
|
+
requestLatencyMsP95: report.requestLatencyMsP95,
|
|
34
|
+
};
|
|
35
|
+
try {
|
|
36
|
+
store.put(runId, JSON.stringify(redactor(manifest)));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Evidence persistence is best-effort; a write failure must not fail the telemetry report.
|
|
40
|
+
}
|
|
41
|
+
return runId;
|
|
42
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
export declare class LanguageCancelledError extends Error {
|
|
3
|
+
constructor();
|
|
4
|
+
}
|
|
5
|
+
export type CancellationReason = "aborted" | "timeout";
|
|
6
|
+
export interface LanguageCancellation {
|
|
7
|
+
isCancellationRequested(): boolean;
|
|
8
|
+
throwIfCancellationRequested(): void;
|
|
9
|
+
reason(): CancellationReason | undefined;
|
|
10
|
+
hostToken(): ts.HostCancellationToken;
|
|
11
|
+
}
|
|
12
|
+
export interface DeadlineCancellationOptions {
|
|
13
|
+
readonly signal?: AbortSignal | undefined;
|
|
14
|
+
readonly deadlineMs: number;
|
|
15
|
+
readonly now?: (() => number) | undefined;
|
|
16
|
+
}
|
|
17
|
+
export declare function createDeadlineCancellation(options: DeadlineCancellationOptions): LanguageCancellation;
|
|
18
|
+
export declare function isCancellation(error: unknown): boolean;
|
|
19
|
+
//# sourceMappingURL=languageCancellation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"languageCancellation.d.ts","sourceRoot":"","sources":["../../src/editor/languageCancellation.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,qBAAa,sBAAuB,SAAQ,KAAK;;CAKhD;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,CAAC;AAEvD,MAAM,WAAW,oBAAoB;IACnC,uBAAuB,IAAI,OAAO,CAAC;IAEnC,4BAA4B,IAAI,IAAI,CAAC;IAGrC,MAAM,IAAI,kBAAkB,GAAG,SAAS,CAAC;IAEzC,SAAS,IAAI,EAAE,CAAC,qBAAqB,CAAC;CACvC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;CAC3C;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,2BAA2B,GACnC,oBAAoB,CA0BtB;AAID,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEtD"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Deadline + abort cancellation for the deterministic language service (Issue #1198). This bounds
|
|
2
|
+
// "expensive analysis" two ways: a wall-clock deadline (so a pathological program can never block
|
|
3
|
+
// the loopback BFF) and an AbortSignal (so a disconnected client request is honoured at the next
|
|
4
|
+
// cooperative cancellation check). The TypeScript language service polls a HostCancellationToken at
|
|
5
|
+
// function/class/module declaration boundaries during traversal and throws
|
|
6
|
+
// `ts.OperationCanceledException`; the orchestrator additionally pre-checks the token before each
|
|
7
|
+
// operation so an already-expired deadline or pre-aborted signal short-circuits flat files that
|
|
8
|
+
// contain no such boundary. This module supplies that token and a provider-facing variant that
|
|
9
|
+
// throws a transport-neutral `LanguageCancelledError`.
|
|
10
|
+
import ts from "typescript";
|
|
11
|
+
export class LanguageCancelledError extends Error {
|
|
12
|
+
constructor() {
|
|
13
|
+
super("language operation cancelled");
|
|
14
|
+
this.name = "LanguageCancelledError";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function createDeadlineCancellation(options) {
|
|
18
|
+
const now = options.now ?? Date.now;
|
|
19
|
+
const deadline = now() + options.deadlineMs;
|
|
20
|
+
let reason;
|
|
21
|
+
const check = () => {
|
|
22
|
+
if (reason !== undefined)
|
|
23
|
+
return true;
|
|
24
|
+
if (options.signal?.aborted === true) {
|
|
25
|
+
reason = "aborted";
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
if (now() >= deadline) {
|
|
29
|
+
reason = "timeout";
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
return false;
|
|
33
|
+
};
|
|
34
|
+
return {
|
|
35
|
+
isCancellationRequested: check,
|
|
36
|
+
throwIfCancellationRequested: () => {
|
|
37
|
+
if (check())
|
|
38
|
+
throw new LanguageCancelledError();
|
|
39
|
+
},
|
|
40
|
+
reason: () => reason,
|
|
41
|
+
hostToken: () => ({ isCancellationRequested: check }),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// True when an error represents a cancellation — either the language service's own
|
|
45
|
+
// `OperationCanceledException` or the provider-facing `LanguageCancelledError`.
|
|
46
|
+
export function isCancellation(error) {
|
|
47
|
+
return error instanceof ts.OperationCanceledException || error instanceof LanguageCancelledError;
|
|
48
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { LanguageCompletionResult, LanguageDiagnostic, LanguageDocumentSymbol, LanguageFormattingOptions, LanguageHoverResult, LanguagePosition, LanguageProviderDescriptor, LanguageServiceLimits, LanguageTextEdit } from "@oscharko-dev/keiko-contracts";
|
|
2
|
+
import type { WorkspaceFs } from "@oscharko-dev/keiko-workspace";
|
|
3
|
+
import type { LanguageCancellation } from "./languageCancellation.js";
|
|
4
|
+
export interface LanguageProviderContext {
|
|
5
|
+
readonly fs: WorkspaceFs;
|
|
6
|
+
readonly root: string;
|
|
7
|
+
readonly overlayPath: string;
|
|
8
|
+
readonly overlayText: string;
|
|
9
|
+
readonly languageId: string;
|
|
10
|
+
readonly limits: LanguageServiceLimits;
|
|
11
|
+
readonly cancellation: LanguageCancellation;
|
|
12
|
+
}
|
|
13
|
+
export interface LanguageProvider {
|
|
14
|
+
readonly descriptor: LanguageProviderDescriptor;
|
|
15
|
+
supports(languageId: string): boolean;
|
|
16
|
+
getDiagnostics(ctx: LanguageProviderContext): LanguageDiagnosticsRaw;
|
|
17
|
+
getCompletions(ctx: LanguageProviderContext, position: LanguagePosition): LanguageCompletionResult;
|
|
18
|
+
getHover(ctx: LanguageProviderContext, position: LanguagePosition): LanguageHoverResult;
|
|
19
|
+
getSymbols(ctx: LanguageProviderContext): LanguageSymbolsRaw;
|
|
20
|
+
getFormatting(ctx: LanguageProviderContext, options: LanguageFormattingOptions | undefined): LanguageFormattingRaw;
|
|
21
|
+
}
|
|
22
|
+
export interface LanguageDiagnosticsRaw {
|
|
23
|
+
readonly diagnostics: readonly LanguageDiagnostic[];
|
|
24
|
+
readonly truncated: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface LanguageSymbolsRaw {
|
|
27
|
+
readonly symbols: readonly LanguageDocumentSymbol[];
|
|
28
|
+
readonly truncated: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface LanguageFormattingRaw {
|
|
31
|
+
readonly edits: readonly LanguageTextEdit[];
|
|
32
|
+
readonly truncated: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface LanguageProviderRegistry {
|
|
35
|
+
resolve(languageId: string): LanguageProvider | undefined;
|
|
36
|
+
describe(): readonly LanguageProviderDescriptor[];
|
|
37
|
+
}
|
|
38
|
+
export declare function createLanguageProviderRegistry(providers: readonly LanguageProvider[], unavailableProviders?: readonly LanguageProviderDescriptor[]): LanguageProviderRegistry;
|
|
39
|
+
//# sourceMappingURL=languageProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"languageProvider.d.ts","sourceRoot":"","sources":["../../src/editor/languageProvider.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,wBAAwB,EACxB,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,EACzB,mBAAmB,EACnB,gBAAgB,EAChB,0BAA0B,EAC1B,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAKtE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;CAC7C;AAID,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,0BAA0B,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC,cAAc,CAAC,GAAG,EAAE,uBAAuB,GAAG,sBAAsB,CAAC;IACrE,cAAc,CACZ,GAAG,EAAE,uBAAuB,EAC5B,QAAQ,EAAE,gBAAgB,GACzB,wBAAwB,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,uBAAuB,EAAE,QAAQ,EAAE,gBAAgB,GAAG,mBAAmB,CAAC;IACxF,UAAU,CAAC,GAAG,EAAE,uBAAuB,GAAG,kBAAkB,CAAC;IAI7D,aAAa,CACX,GAAG,EAAE,uBAAuB,EAC5B,OAAO,EAAE,yBAAyB,GAAG,SAAS,GAC7C,qBAAqB,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACpD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACpD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;IAC1D,QAAQ,IAAI,SAAS,0BAA0B,EAAE,CAAC;CACnD;AAED,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,SAAS,gBAAgB,EAAE,EACtC,oBAAoB,GAAE,SAAS,0BAA0B,EAAO,GAC/D,wBAAwB,CAO1B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Provider abstraction for the deterministic language service (Issue #1198, Review Addendum 2). A
|
|
2
|
+
// provider is a deterministic, model-free language-intelligence backend bound to a set of
|
|
3
|
+
// `languageId`s. TypeScript/JavaScript is the first provider; the staged LSP expansion for
|
|
4
|
+
// Java/Python/Rust/Go (#1213) registers further providers without any contract change. The registry
|
|
5
|
+
// resolves a request's `languageId` to the provider that serves it.
|
|
6
|
+
export function createLanguageProviderRegistry(providers, unavailableProviders = []) {
|
|
7
|
+
return {
|
|
8
|
+
resolve: (languageId) => providers.find((provider) => provider.supports(languageId)),
|
|
9
|
+
describe: () => [...providers.map((provider) => provider.descriptor), ...unavailableProviders],
|
|
10
|
+
};
|
|
11
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type LanguageServiceErrorCode, type LanguageServiceLimits } from "@oscharko-dev/keiko-contracts";
|
|
2
|
+
import { type RouteContext, type RouteResult } from "../routes.js";
|
|
3
|
+
import type { UiHandlerDeps } from "../deps.js";
|
|
4
|
+
export interface EditorLanguageRouteOptions {
|
|
5
|
+
/** Test-only deterministic limits seam; production keeps the default deadline. */
|
|
6
|
+
readonly limits?: LanguageServiceLimits | undefined;
|
|
7
|
+
/** Test-only deterministic clock seam; production keeps the real clock. */
|
|
8
|
+
readonly now?: (() => number) | undefined;
|
|
9
|
+
}
|
|
10
|
+
export declare const STATUS_BY_CODE: Readonly<Record<LanguageServiceErrorCode, number>>;
|
|
11
|
+
export declare function resolveOverlayPath(realRoot: string, relativePath: string): string;
|
|
12
|
+
export declare function clientAbortSignal(ctx: RouteContext): AbortSignal;
|
|
13
|
+
export declare function handleEditorLanguage(ctx: RouteContext, deps: UiHandlerDeps, options?: EditorLanguageRouteOptions): Promise<RouteResult>;
|
|
14
|
+
export declare function handleEditorLanguageCapabilities(): RouteResult;
|
|
15
|
+
//# sourceMappingURL=languageRoutes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"languageRoutes.d.ts","sourceRoot":"","sources":["../../src/editor/languageRoutes.ts"],"names":[],"mappings":"AASA,OAAO,EAGL,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC3B,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAa,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAShD,MAAM,WAAW,0BAA0B;IACzC,kFAAkF;IAClF,QAAQ,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACpD,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;CAC3C;AAID,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAQ7E,CAAC;AAaF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAWjF;AAID,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,WAAW,CAahE;AAiBD,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,aAAa,EACnB,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,WAAW,CAAC,CAuBtB;AAED,wBAAgB,gCAAgC,IAAI,WAAW,CAE9D"}
|