@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,156 @@
|
|
|
1
|
+
// Figma PAT vault — encrypted-at-rest storage for the read-only Personal Access Token
|
|
2
|
+
// (Epic #750, Issue #758).
|
|
3
|
+
//
|
|
4
|
+
// The PAT is a single, server-side, READ-ONLY token. This module seals it at rest with the
|
|
5
|
+
// shared AES-256-GCM secretbox primitive (@oscharko-dev/keiko-security) — the same cipher that
|
|
6
|
+
// protects the MemoriaViva memory vault — and never writes plaintext to disk. The plaintext token
|
|
7
|
+
// NEVER appears in an error message, log line, return value other than read(), or persisted
|
|
8
|
+
// artifact: only the `kv1.` sealed envelope touches the filesystem.
|
|
9
|
+
//
|
|
10
|
+
// Lifecycle for a non-refreshable PAT (a PAT cannot be refreshed):
|
|
11
|
+
// - store(token) rotation-by-replacement — overwrites the single sealed entry in place.
|
|
12
|
+
// - read() decrypts the stored entry, or undefined when none exists.
|
|
13
|
+
// - revoke() operator removal — deletes the stored entry.
|
|
14
|
+
//
|
|
15
|
+
// Key precedence mirrors the memory-vault seam (resolveVaultKey), namespaced so it never collides
|
|
16
|
+
// with the memory key:
|
|
17
|
+
// 1. KEIKO_FIGMA_KEY — base64 of exactly 32 bytes. Explicit operator override.
|
|
18
|
+
// 2. macOS Keychain — generic password "keiko-figma-vault". The OS protects the key.
|
|
19
|
+
// 3. Keyfile — <vaultDir>/figma-vault.key, mode 0600. Weakest tier (key next to store).
|
|
20
|
+
import { execFileSync } from "node:child_process";
|
|
21
|
+
import { chmodSync, existsSync, lstatSync, mkdirSync, readFileSync, rmSync, writeFileSync, } from "node:fs";
|
|
22
|
+
import { randomBytes } from "node:crypto";
|
|
23
|
+
import { userInfo } from "node:os";
|
|
24
|
+
import { dirname, resolve } from "node:path";
|
|
25
|
+
import { isSealed, openString, sealString } from "@oscharko-dev/keiko-security";
|
|
26
|
+
import { FigmaConnectorError } from "./figmaConnectorErrors.js";
|
|
27
|
+
const KEY_BYTES = 32;
|
|
28
|
+
const KEYFILE_NAME = "figma-vault.key";
|
|
29
|
+
const KEYCHAIN_SERVICE = "keiko-figma-vault";
|
|
30
|
+
function decodeKeyOrThrow(raw) {
|
|
31
|
+
const decoded = Buffer.from(raw, "base64");
|
|
32
|
+
if (decoded.length !== KEY_BYTES) {
|
|
33
|
+
// Coded, secret-free: a misconfigured key surfaces as FIGMA_INTERNAL and never echoes the
|
|
34
|
+
// (possibly partial) key material in the message.
|
|
35
|
+
throw new FigmaConnectorError("FIGMA_INTERNAL");
|
|
36
|
+
}
|
|
37
|
+
return decoded;
|
|
38
|
+
}
|
|
39
|
+
function keyFromEnv(env) {
|
|
40
|
+
const raw = env.KEIKO_FIGMA_KEY;
|
|
41
|
+
if (raw === undefined || raw.length === 0)
|
|
42
|
+
return undefined;
|
|
43
|
+
return decodeKeyOrThrow(raw);
|
|
44
|
+
}
|
|
45
|
+
function ensureDirHardened(dir) {
|
|
46
|
+
if (!existsSync(dir))
|
|
47
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
48
|
+
if (process.platform === "win32")
|
|
49
|
+
return;
|
|
50
|
+
try {
|
|
51
|
+
chmodSync(dir, 0o700);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Best-effort: a parent-owned directory we cannot chmod beats a hard failure.
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function assertNoSymlinkedPathSegments(resolvedPath) {
|
|
58
|
+
let current = resolvedPath;
|
|
59
|
+
while (current !== dirname(current)) {
|
|
60
|
+
if (isSymlink(current)) {
|
|
61
|
+
throw new FigmaConnectorError("FIGMA_INTERNAL");
|
|
62
|
+
}
|
|
63
|
+
current = dirname(current);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function isSymlink(path) {
|
|
67
|
+
try {
|
|
68
|
+
return lstatSync(path).isSymbolicLink();
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (error.code === "ENOENT") {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function keyFromKeychain() {
|
|
78
|
+
if (process.platform !== "darwin")
|
|
79
|
+
return undefined;
|
|
80
|
+
const account = userInfo().username;
|
|
81
|
+
try {
|
|
82
|
+
const found = execFileSync("security", ["find-generic-password", "-s", KEYCHAIN_SERVICE, "-a", account, "-w"], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
|
|
83
|
+
return decodeKeyOrThrow(found);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return generateKeychainKey(account);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function generateKeychainKey(account) {
|
|
90
|
+
const key = randomBytes(KEY_BYTES);
|
|
91
|
+
try {
|
|
92
|
+
execFileSync("security", ["add-generic-password", "-s", KEYCHAIN_SERVICE, "-a", account, "-w", key.toString("base64")], { stdio: ["ignore", "ignore", "ignore"] });
|
|
93
|
+
return key;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function keyFromKeyfile(vaultDir) {
|
|
100
|
+
const keyfile = resolve(vaultDir, KEYFILE_NAME);
|
|
101
|
+
assertNoSymlinkedPathSegments(keyfile);
|
|
102
|
+
ensureDirHardened(dirname(keyfile));
|
|
103
|
+
assertNoSymlinkedPathSegments(keyfile);
|
|
104
|
+
if (existsSync(keyfile)) {
|
|
105
|
+
return decodeKeyOrThrow(readFileSync(keyfile, "utf8").trim());
|
|
106
|
+
}
|
|
107
|
+
const key = randomBytes(KEY_BYTES);
|
|
108
|
+
writeFileSync(keyfile, key.toString("base64"), { mode: 0o600 });
|
|
109
|
+
chmodIfPresent(keyfile, 0o600);
|
|
110
|
+
return key;
|
|
111
|
+
}
|
|
112
|
+
function chmodIfPresent(path, mode) {
|
|
113
|
+
if (process.platform === "win32")
|
|
114
|
+
return;
|
|
115
|
+
try {
|
|
116
|
+
chmodSync(path, mode);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Best-effort hardening.
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export const NO_FIGMA_KEYCHAIN = () => undefined;
|
|
123
|
+
export function resolveFigmaVaultKey(env, vaultDir, keychainAccess = keyFromKeychain) {
|
|
124
|
+
const fromEnv = keyFromEnv(env);
|
|
125
|
+
if (fromEnv !== undefined)
|
|
126
|
+
return { key: fromEnv, source: "env" };
|
|
127
|
+
const fromKeychain = keychainAccess();
|
|
128
|
+
if (fromKeychain !== undefined)
|
|
129
|
+
return { key: fromKeychain, source: "keychain" };
|
|
130
|
+
return { key: keyFromKeyfile(vaultDir), source: "keyfile" };
|
|
131
|
+
}
|
|
132
|
+
export function createFigmaTokenStore(deps) {
|
|
133
|
+
const { key } = deps;
|
|
134
|
+
const storePath = resolve(deps.storePath);
|
|
135
|
+
const store = (token) => {
|
|
136
|
+
assertNoSymlinkedPathSegments(storePath);
|
|
137
|
+
ensureDirHardened(dirname(storePath));
|
|
138
|
+
assertNoSymlinkedPathSegments(storePath);
|
|
139
|
+
writeFileSync(storePath, sealString(key, token), { mode: 0o600 });
|
|
140
|
+
chmodIfPresent(storePath, 0o600);
|
|
141
|
+
};
|
|
142
|
+
const read = () => {
|
|
143
|
+
assertNoSymlinkedPathSegments(storePath);
|
|
144
|
+
if (!existsSync(storePath))
|
|
145
|
+
return undefined;
|
|
146
|
+
const envelope = readFileSync(storePath, "utf8").trim();
|
|
147
|
+
if (envelope.length === 0 || !isSealed(envelope))
|
|
148
|
+
return undefined;
|
|
149
|
+
return openString(key, envelope);
|
|
150
|
+
};
|
|
151
|
+
const revoke = () => {
|
|
152
|
+
assertNoSymlinkedPathSegments(storePath);
|
|
153
|
+
rmSync(storePath, { force: true });
|
|
154
|
+
};
|
|
155
|
+
return { store, read, revoke };
|
|
156
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figmaUrl.d.ts","sourceRoot":"","sources":["../../../src/qualityIntelligence/figma/figmaUrl.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAeD,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,KAAG,WAAW,GAAG,IAe9D,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Figma URL → scoped target parsing (Epic #750, Issue #751).
|
|
2
|
+
//
|
|
3
|
+
// Pure, deterministic. Extracts a file-key + node-id from a pasted Figma board/section
|
|
4
|
+
// link. A link WITHOUT a node-id is rejected (null) so the connector can never default to
|
|
5
|
+
// a whole-file pull. Figma URLs encode node-ids with `-` (e.g. `0-1`); the REST API uses
|
|
6
|
+
// `:` (e.g. `0:1`), so the parsed node-id is normalised to the API form.
|
|
7
|
+
const ACCEPTED_HOSTS = ["figma.com", "www.figma.com"];
|
|
8
|
+
const SCOPED_PATH_KINDS = ["design", "file"];
|
|
9
|
+
const normaliseNodeId = (raw) => raw.replace(/-/g, ":");
|
|
10
|
+
const parseUrl = (value) => {
|
|
11
|
+
try {
|
|
12
|
+
return new URL(value);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
export const parseFigmaTarget = (value) => {
|
|
19
|
+
const url = parseUrl(value.trim());
|
|
20
|
+
if (url === null)
|
|
21
|
+
return null;
|
|
22
|
+
if (url.protocol !== "https:")
|
|
23
|
+
return null;
|
|
24
|
+
if (!ACCEPTED_HOSTS.includes(url.hostname))
|
|
25
|
+
return null;
|
|
26
|
+
const segments = url.pathname.split("/").filter((part) => part.length > 0);
|
|
27
|
+
const [kind, fileKey] = segments;
|
|
28
|
+
if (kind === undefined || !SCOPED_PATH_KINDS.includes(kind))
|
|
29
|
+
return null;
|
|
30
|
+
if (fileKey === undefined || fileKey.length === 0)
|
|
31
|
+
return null;
|
|
32
|
+
const rawNodeId = url.searchParams.get("node-id");
|
|
33
|
+
if (rawNodeId === null || rawNodeId.length === 0)
|
|
34
|
+
return null;
|
|
35
|
+
return { fileKey, nodeId: normaliseNodeId(rawNodeId) };
|
|
36
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export { createFigmaConnector, type FigmaConnector, type FigmaConnectorConfig, type FigmaConnectorDeps, type FigmaEnv, type FigmaFetchOptions, type FigmaProvenance, type FigmaScopedResult, } from "./figmaConnector.js";
|
|
2
|
+
export { createDefaultFigmaHttpPort, type FigmaHttpPort, type FigmaHttpRequest, type FigmaHttpResponse, } from "./figmaHttpPort.js";
|
|
3
|
+
export { createDefaultFigmaRenderPort, type FigmaRenderPort, type FigmaRenderRequest, type FigmaRenderResponse, } from "./figmaRenderPort.js";
|
|
4
|
+
export { buildFigmaSnapshot, type BuildFigmaSnapshotInput } from "./figmaSnapshotBuilder.js";
|
|
5
|
+
export { resnapshotFigma, type FigmaCleanToIr, type ResnapshotFigmaDeps, } from "./figmaResnapshot.js";
|
|
6
|
+
export { fetchWithBackoff, realFigmaRetrySleep, DEFAULT_FIGMA_RETRY_POLICY, type FigmaBackoffResponse, type FigmaRetryPolicy, type FigmaRetrySleep, } from "./figmaRetry.js";
|
|
7
|
+
export { mapWithConcurrency } from "./figmaConcurrency.js";
|
|
8
|
+
export { paginateScopedDocument, discoverScreenNodes, DEFAULT_SCOPED_PAGINATION_LIMITS, SCOPED_PAGINATION_LIMIT_CEILINGS, resolveScopedPaginationLimits, type FigmaScopeCoverage, type RawFigmaNode, type ScopedNodeFetcher, type ScopedPaginationLimits, } from "./figmaScopedPagination.js";
|
|
9
|
+
export type { FigmaRenderedImage, FigmaSkippedScreen, FigmaSkippedScreenReason, FigmaSnapshot, FigmaSnapshotScreen, } from "./figmaSnapshotTypes.js";
|
|
10
|
+
export { FigmaConnectorError, figmaConnectorErrorBody, type FigmaConnectorErrorBody, type FigmaConnectorErrorCode, } from "./figmaConnectorErrors.js";
|
|
11
|
+
export { parseFigmaTarget, type FigmaTarget } from "./figmaUrl.js";
|
|
12
|
+
export { resolveReadiness, type FigmaNode, type FigmaDevStatus, type ReadinessOptions, type ReadinessSignal, } from "./figmaReadiness.js";
|
|
13
|
+
export { createFigmaTokenStore, resolveFigmaVaultKey, NO_FIGMA_KEYCHAIN, type FigmaTokenStore, type FigmaTokenStoreDeps, type FigmaKeychainAccess, type FigmaVaultKeySource, type ResolvedFigmaVaultKey, } from "./figmaTokenStore.js";
|
|
14
|
+
export { resolveFigmaToken, classifyTokenFailure, type FigmaTokenSources, } from "./figmaTokenSource.js";
|
|
15
|
+
export { deriveFigmaScopeRef, type FigmaScopeRef } from "./figmaScopeRef.js";
|
|
16
|
+
export { appendFigmaConnectorAudit, loadFigmaConnectorAudit, FIGMA_AUDIT_SCHEMA_VERSION, type AppendFigmaConnectorAuditInput, type FigmaConnectorAction, type FigmaConnectorAuditArtifact, type FigmaConnectorAuditCounts, type FigmaConnectorAuditEntry, type FigmaConnectorOutcome, } from "./figmaConnectorAudit.js";
|
|
17
|
+
export { recordReadOnlyConsent, loadReadOnlyConsent, hasReadOnlyConsent, assertReadOnlyConsent, EXPECTED_FIGMA_SCOPES, FIGMA_CONSENT_SCHEMA_VERSION, type FigmaScopeConsent, type RecordReadOnlyConsentInput, } from "./figmaConsent.js";
|
|
18
|
+
export { computeFigmaConnectorMetrics, type FigmaA11yMetrics, type FigmaAugmentationShare, type FigmaAugmentationTally, type FigmaConnectorMetrics, type FigmaConnectorMetricsExtras, type FigmaNavGraphMetrics, } from "./figmaConnectorMetrics.js";
|
|
19
|
+
export { observeFigmaSnapshot, observeFigmaRevoke, type ObservedActionContext, type ObservedRevokeInput, type ObservedSnapshotInput, type ObservedSnapshotResult, } from "./figmaObservedActions.js";
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/qualityIntelligence/figma/index.ts"],"names":[],"mappings":"AASA,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,0BAA0B,EAC1B,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,4BAA4B,EAC5B,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EACL,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,0BAA0B,EAC1B,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,gCAAgC,EAChC,gCAAgC,EAChC,6BAA6B,EAC7B,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,GAC5B,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,EACxB,aAAa,EACb,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,GAC7B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EACL,gBAAgB,EAChB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,GAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,iBAAiB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,EAC1B,KAAK,8BAA8B,EACnC,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,GAC3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,4BAA4B,EAC5B,KAAK,iBAAiB,EACtB,KAAK,0BAA0B,GAChC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,4BAA4B,EAC5B,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,GAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Local barrel for the server-side Figma connector (Epic #750, Issue #751).
|
|
2
|
+
//
|
|
3
|
+
// Intentionally NOT re-exported from the keiko-server Quality Intelligence package
|
|
4
|
+
// public barrel (../index.ts): these are internal server modules consumed by the route
|
|
5
|
+
// tier, kept out of the package public surface so `check:package-surface` stays stable.
|
|
6
|
+
//
|
|
7
|
+
// The connector is disabled-until-configured (no token ⇒ FIGMA_TOKEN_MISSING), reads the
|
|
8
|
+
// read-only PAT server-side only, and never logs/returns/embeds the token.
|
|
9
|
+
export { createFigmaConnector, } from "./figmaConnector.js";
|
|
10
|
+
export { createDefaultFigmaHttpPort, } from "./figmaHttpPort.js";
|
|
11
|
+
export { createDefaultFigmaRenderPort, } from "./figmaRenderPort.js";
|
|
12
|
+
export { buildFigmaSnapshot } from "./figmaSnapshotBuilder.js";
|
|
13
|
+
export { resnapshotFigma, } from "./figmaResnapshot.js";
|
|
14
|
+
export { fetchWithBackoff, realFigmaRetrySleep, DEFAULT_FIGMA_RETRY_POLICY, } from "./figmaRetry.js";
|
|
15
|
+
export { mapWithConcurrency } from "./figmaConcurrency.js";
|
|
16
|
+
export { paginateScopedDocument, discoverScreenNodes, DEFAULT_SCOPED_PAGINATION_LIMITS, SCOPED_PAGINATION_LIMIT_CEILINGS, resolveScopedPaginationLimits, } from "./figmaScopedPagination.js";
|
|
17
|
+
export { FigmaConnectorError, figmaConnectorErrorBody, } from "./figmaConnectorErrors.js";
|
|
18
|
+
export { parseFigmaTarget } from "./figmaUrl.js";
|
|
19
|
+
export { resolveReadiness, } from "./figmaReadiness.js";
|
|
20
|
+
export { createFigmaTokenStore, resolveFigmaVaultKey, NO_FIGMA_KEYCHAIN, } from "./figmaTokenStore.js";
|
|
21
|
+
export { resolveFigmaToken, classifyTokenFailure, } from "./figmaTokenSource.js";
|
|
22
|
+
export { deriveFigmaScopeRef } from "./figmaScopeRef.js";
|
|
23
|
+
export { appendFigmaConnectorAudit, loadFigmaConnectorAudit, FIGMA_AUDIT_SCHEMA_VERSION, } from "./figmaConnectorAudit.js";
|
|
24
|
+
export { recordReadOnlyConsent, loadReadOnlyConsent, hasReadOnlyConsent, assertReadOnlyConsent, EXPECTED_FIGMA_SCOPES, FIGMA_CONSENT_SCHEMA_VERSION, } from "./figmaConsent.js";
|
|
25
|
+
export { computeFigmaConnectorMetrics, } from "./figmaConnectorMetrics.js";
|
|
26
|
+
export { observeFigmaSnapshot, observeFigmaRevoke, } from "./figmaObservedActions.js";
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { RouteContext, RouteResult } from "../routes.js";
|
|
2
|
+
import type { UiHandlerDeps } from "../deps.js";
|
|
3
|
+
declare const FIGMA_CODEGEN_SCHEMA_VERSION: 1;
|
|
4
|
+
/** The persisted, reviewable code artifact (evidence-backed; deterministic, carries no timestamp). */
|
|
5
|
+
export interface PersistedFigmaCodeArtifact {
|
|
6
|
+
readonly figmaCodegenSchemaVersion: typeof FIGMA_CODEGEN_SCHEMA_VERSION;
|
|
7
|
+
readonly runId: string;
|
|
8
|
+
readonly adapterName: string;
|
|
9
|
+
readonly files: readonly {
|
|
10
|
+
readonly path: string;
|
|
11
|
+
readonly contents: string;
|
|
12
|
+
}[];
|
|
13
|
+
}
|
|
14
|
+
/** Browser-safe response: the reviewable file set plus a small summary. No token, no board id. */
|
|
15
|
+
export interface FigmaCodegenResponse {
|
|
16
|
+
readonly runId: string;
|
|
17
|
+
readonly adapterName: string;
|
|
18
|
+
readonly fileCount: number;
|
|
19
|
+
readonly totalBytes: number;
|
|
20
|
+
readonly screenCount: number;
|
|
21
|
+
readonly files: readonly {
|
|
22
|
+
readonly path: string;
|
|
23
|
+
readonly contents: string;
|
|
24
|
+
}[];
|
|
25
|
+
}
|
|
26
|
+
export declare function handleFigmaGenerateCode(ctx: RouteContext, deps: UiHandlerDeps): RouteResult;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=figmaCodegenRoutes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figmaCodegenRoutes.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/figmaCodegenRoutes.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAShD,QAAA,MAAM,4BAA4B,EAAG,CAAU,CAAC;AAMhD,sGAAsG;AACtG,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,yBAAyB,EAAE,OAAO,4BAA4B,CAAC;IACxE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjF;AAED,kGAAkG;AAClG,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjF;AA+GD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,GAAG,WAAW,CAkD3F"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// Design-to-code generation from a stored Figma Snapshot (Epic #750, Issue #755).
|
|
2
|
+
//
|
|
3
|
+
// POST /api/figma/snapshots/:runId/code — emit reviewable frontend code for a built snapshot.
|
|
4
|
+
//
|
|
5
|
+
// This is the missing runnable seam for #755: the pure emission domain (emitCode + htmlCssAdapter +
|
|
6
|
+
// the CodeTargetAdapter seam) shipped, but no route/run consumed it, so the capability was unreachable
|
|
7
|
+
// from a user. The run reads ONLY the stored snapshot (the communication boundary holds — no Figma,
|
|
8
|
+
// no model, no network, no filesystem beyond the local evidence write), builds the deterministic
|
|
9
|
+
// target-neutral emission plan from the Screen-IR + the persisted design tokens (#752) + the routing
|
|
10
|
+
// hints derived from the persisted inter-screen links (#811), renders semantic HTML/CSS through the
|
|
11
|
+
// first-slice html-css adapter, and returns a reviewable artifact (a proposal — never auto-applied).
|
|
12
|
+
//
|
|
13
|
+
// Determinism + model-independence (#755 DoD): emission is pure and model-free, so the same stored
|
|
14
|
+
// snapshot yields a byte-identical artifact; semantic naming (the only model-augmentation point) is
|
|
15
|
+
// additive and absent here, so the structural defaults are used. Evidence-backed: the artifact must be
|
|
16
|
+
// persisted to the local evidence dir through the reused contained-store seam before the route returns
|
|
17
|
+
// success. Gated: CSRF + host-check + a valid stored runId (the dispatch layer enforces the
|
|
18
|
+
// state-changing-request guard for this POST). No hidden external effects: nothing leaves the box, the
|
|
19
|
+
// snapshot is never mutated.
|
|
20
|
+
//
|
|
21
|
+
// Cancellable (#755 AC2): for the first slice this is moot by construction — the handler is a
|
|
22
|
+
// synchronous, pure, microsecond computation with no run-registry entry, no model call, no streaming,
|
|
23
|
+
// and no long-running external work to abort; a client disconnect simply drops the response. When a
|
|
24
|
+
// future slice wires the SemanticNamingProvider to a gateway model call, that injected port is where
|
|
25
|
+
// an AbortSignal threads through — no structural change to this route is required.
|
|
26
|
+
import { createNodeContainedJsonArtifactStore, createNodeFigmaSnapshotStore, } from "@oscharko-dev/keiko-evidence";
|
|
27
|
+
import { QualityIntelligenceFigma } from "@oscharko-dev/keiko-quality-intelligence";
|
|
28
|
+
const FIGMA_CODEGEN_SUFFIX = ".figma-codegen.json";
|
|
29
|
+
const FIGMA_CODEGEN_SCHEMA_VERSION = 1;
|
|
30
|
+
const MAX_CODEGEN_SCREENS = 80;
|
|
31
|
+
const MAX_CODEGEN_FILES = MAX_CODEGEN_SCREENS + 2;
|
|
32
|
+
const MAX_CODEGEN_FILE_BYTES = 1024 * 1024;
|
|
33
|
+
const MAX_CODEGEN_TOTAL_BYTES = 5 * 1024 * 1024;
|
|
34
|
+
const errorBody = (code, message) => ({
|
|
35
|
+
error: { code, message },
|
|
36
|
+
});
|
|
37
|
+
function codegenTooLarge(message) {
|
|
38
|
+
return { status: 413, body: errorBody("FIGMA_CODEGEN_TOO_LARGE", message) };
|
|
39
|
+
}
|
|
40
|
+
// Re-hydrate the deterministic emission input from the stored snapshot. Unparseable screens are
|
|
41
|
+
// dropped (never crash). Links → nav graph → routing hints feed the adapter's screen-to-screen wiring.
|
|
42
|
+
function emissionInputFromRecord(record) {
|
|
43
|
+
const screens = record.screens
|
|
44
|
+
.map((s) => QualityIntelligenceFigma.parseScreenIr(s.irJson))
|
|
45
|
+
.filter((s) => s !== undefined);
|
|
46
|
+
const tokens = QualityIntelligenceFigma.parseDesignTokens(record.tokens);
|
|
47
|
+
const links = (record.links ?? []).map((l) => ({
|
|
48
|
+
sourceNodeId: l.sourceNodeId,
|
|
49
|
+
trigger: l.trigger,
|
|
50
|
+
targetNodeId: l.targetNodeId,
|
|
51
|
+
}));
|
|
52
|
+
const graph = QualityIntelligenceFigma.deriveNavGraph({
|
|
53
|
+
screens,
|
|
54
|
+
links,
|
|
55
|
+
tokens,
|
|
56
|
+
reduction: { inputNodeCount: 0, keptNodeCount: 0, removedNodeCount: 0, removedRatio: 0 },
|
|
57
|
+
});
|
|
58
|
+
return { screens, tokens, hints: QualityIntelligenceFigma.deriveRoutingHints(graph) };
|
|
59
|
+
}
|
|
60
|
+
function persistArtifact(evidenceDir, artifact) {
|
|
61
|
+
// Evidence-backed (#755): the reviewable artifact is written through the reused contained-store seam.
|
|
62
|
+
// Fail closed when the companion cannot be written; otherwise the route could return generated code
|
|
63
|
+
// with no durable evidence record.
|
|
64
|
+
createNodeContainedJsonArtifactStore(evidenceDir, FIGMA_CODEGEN_SUFFIX, {
|
|
65
|
+
parse: (value) => typeof value === "object" &&
|
|
66
|
+
value !== null &&
|
|
67
|
+
value.figmaCodegenSchemaVersion ===
|
|
68
|
+
FIGMA_CODEGEN_SCHEMA_VERSION
|
|
69
|
+
? value
|
|
70
|
+
: undefined,
|
|
71
|
+
}).record(artifact.runId, artifact);
|
|
72
|
+
}
|
|
73
|
+
function summarizeArtifact(artifact) {
|
|
74
|
+
if (artifact.files.length > MAX_CODEGEN_FILES) {
|
|
75
|
+
return codegenTooLarge("The generated code artifact contains too many files to review safely.");
|
|
76
|
+
}
|
|
77
|
+
let totalBytes = 0;
|
|
78
|
+
for (const file of artifact.files) {
|
|
79
|
+
const fileBytes = Buffer.byteLength(file.contents, "utf8");
|
|
80
|
+
if (fileBytes > MAX_CODEGEN_FILE_BYTES) {
|
|
81
|
+
return codegenTooLarge("A generated code file is too large to review safely.");
|
|
82
|
+
}
|
|
83
|
+
totalBytes += fileBytes;
|
|
84
|
+
if (totalBytes > MAX_CODEGEN_TOTAL_BYTES) {
|
|
85
|
+
return codegenTooLarge("The generated code artifact is too large to review safely.");
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { totalBytes };
|
|
89
|
+
}
|
|
90
|
+
// ─── POST /api/figma/snapshots/:runId/code ─────────────────────────────────────
|
|
91
|
+
// Resolve evidenceDir + runId, load + 404 the stored snapshot, or return a coded RouteResult.
|
|
92
|
+
function loadSnapshotForCodegen(ctx, deps) {
|
|
93
|
+
const evidenceDir = deps.evidenceDir;
|
|
94
|
+
if (evidenceDir === undefined || evidenceDir.length === 0) {
|
|
95
|
+
return {
|
|
96
|
+
status: 503,
|
|
97
|
+
body: errorBody("FIGMA_NO_EVIDENCE_DIR", "The evidence directory is not configured."),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const runId = ctx.params.runId ?? "";
|
|
101
|
+
if (runId.length === 0) {
|
|
102
|
+
return { status: 400, body: errorBody("FIGMA_SNAPSHOT_NOT_FOUND", "Missing snapshot run id.") };
|
|
103
|
+
}
|
|
104
|
+
let record;
|
|
105
|
+
try {
|
|
106
|
+
record = createNodeFigmaSnapshotStore(evidenceDir).load(runId);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return {
|
|
110
|
+
status: 500,
|
|
111
|
+
body: errorBody("FIGMA_INTERNAL", "The snapshot could not be read for code generation."),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
if (record === undefined) {
|
|
115
|
+
return {
|
|
116
|
+
status: 404,
|
|
117
|
+
body: errorBody("FIGMA_SNAPSHOT_NOT_FOUND", "No snapshot was found for this run id."),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return { record, evidenceDir, runId };
|
|
121
|
+
}
|
|
122
|
+
export function handleFigmaGenerateCode(ctx, deps) {
|
|
123
|
+
const loaded = loadSnapshotForCodegen(ctx, deps);
|
|
124
|
+
if ("status" in loaded)
|
|
125
|
+
return loaded;
|
|
126
|
+
const { record, evidenceDir, runId } = loaded;
|
|
127
|
+
const input = emissionInputFromRecord(record);
|
|
128
|
+
if (input.screens.length === 0) {
|
|
129
|
+
return {
|
|
130
|
+
status: 422,
|
|
131
|
+
body: errorBody("FIGMA_CODEGEN_NO_SCREENS", "The snapshot has no usable screen to generate code from."),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
if (input.screens.length > MAX_CODEGEN_SCREENS) {
|
|
135
|
+
return codegenTooLarge("The snapshot contains too many screens to generate code safely.");
|
|
136
|
+
}
|
|
137
|
+
const artifact = QualityIntelligenceFigma.emitCode(input, QualityIntelligenceFigma.htmlCssAdapter);
|
|
138
|
+
const artifactSummary = summarizeArtifact(artifact);
|
|
139
|
+
if ("status" in artifactSummary)
|
|
140
|
+
return artifactSummary;
|
|
141
|
+
const persisted = {
|
|
142
|
+
figmaCodegenSchemaVersion: FIGMA_CODEGEN_SCHEMA_VERSION,
|
|
143
|
+
runId,
|
|
144
|
+
adapterName: artifact.adapterName,
|
|
145
|
+
files: artifact.files,
|
|
146
|
+
};
|
|
147
|
+
try {
|
|
148
|
+
persistArtifact(evidenceDir, persisted);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return {
|
|
152
|
+
status: 500,
|
|
153
|
+
body: errorBody("FIGMA_INTERNAL", "The code artifact could not be persisted as evidence."),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
const response = {
|
|
157
|
+
runId,
|
|
158
|
+
adapterName: artifact.adapterName,
|
|
159
|
+
fileCount: artifact.files.length,
|
|
160
|
+
totalBytes: artifactSummary.totalBytes,
|
|
161
|
+
screenCount: input.screens.length,
|
|
162
|
+
files: artifact.files,
|
|
163
|
+
};
|
|
164
|
+
return { status: 200, body: response };
|
|
165
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type FigmaSnapshotImageRef, type FigmaSnapshotRecord } from "@oscharko-dev/keiko-evidence";
|
|
2
|
+
import type { UiHandlerDeps } from "../deps.js";
|
|
3
|
+
/** Loads an immutable Figma Snapshot evidence record by runId. Returns `undefined` when not found. */
|
|
4
|
+
export type FigmaSnapshotLoader = (snapshotRunId: string) => FigmaSnapshotRecord | undefined;
|
|
5
|
+
export interface FigmaSnapshotLoaderOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Drift seam (#735): a figma-snapshot source pins a write-once, content-addressed runId, so its
|
|
8
|
+
* content can never change under its identity — re-checking the pinned record would always
|
|
9
|
+
* report "fresh" even after the board changed and was re-snapshotted. When this flag is set the
|
|
10
|
+
* loader resolves the LATEST snapshot recorded for the same board scope (fileKey + nodeId) and
|
|
11
|
+
* returns it instead of the pinned record whenever its integrity hash differs. Screen atom ids
|
|
12
|
+
* are board-stable (screenId-derived), so compareStaleness sees changed atoms, not orphans.
|
|
13
|
+
* Used by re-check and regenerate-stale ONLY — the generate path keeps exact pinning.
|
|
14
|
+
*/
|
|
15
|
+
readonly resolveLatestByScope?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Build the snapshot loader. Returns `undefined` when `deps.evidenceDir` is not configured so the
|
|
19
|
+
* ingestion layer maps an attempted figma-snapshot source to QI_FIGMA_SNAPSHOT_UNAVAILABLE.
|
|
20
|
+
*/
|
|
21
|
+
export declare function makeFigmaSnapshotLoader(deps: UiHandlerDeps, options?: FigmaSnapshotLoaderOptions): FigmaSnapshotLoader | undefined;
|
|
22
|
+
/** The image-derived semantics a multimodal model recovered for one screen, as additive hints. */
|
|
23
|
+
export interface FigmaVisionScreenRequest {
|
|
24
|
+
readonly snapshotRunId: string;
|
|
25
|
+
readonly screenId: string;
|
|
26
|
+
/** The image side-file reference recorded in the snapshot (relative path + sha256). */
|
|
27
|
+
readonly image: FigmaSnapshotImageRef;
|
|
28
|
+
readonly imageRelativePath: string;
|
|
29
|
+
/** The deterministic baseline text, supplied so the model cross-checks rather than re-derives. */
|
|
30
|
+
readonly baselineText: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Produces additive vision hints for a screen, OR an empty list when vision is unavailable / failed.
|
|
34
|
+
* The contract is total: it NEVER throws and NEVER returns a value that could override the IR — the
|
|
35
|
+
* caller appends the hints below the baseline.
|
|
36
|
+
*/
|
|
37
|
+
export type FigmaVisionHintProvider = (request: FigmaVisionScreenRequest) => readonly string[] | Promise<readonly string[]>;
|
|
38
|
+
/**
|
|
39
|
+
* A raw vision call: given a screen request and the selected model id, return image-derived hint
|
|
40
|
+
* strings. Injectable so tests can keep the provider deterministic; production defaults to the
|
|
41
|
+
* server-owned evidence-store + Model Gateway port below. Absence is exactly the IR-only path.
|
|
42
|
+
*/
|
|
43
|
+
export type FigmaVisionCall = (request: FigmaVisionScreenRequest, modelId: string) => readonly string[] | Promise<readonly string[]>;
|
|
44
|
+
export interface FigmaVisionHintProviderOptions {
|
|
45
|
+
readonly onGatewayCallAttempt?: (() => void) | undefined;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Build a capability-routed vision hint provider. When no multimodal capability is configured (or no
|
|
49
|
+
* `visionCall` is injected), every request returns `[]` — the deterministic IR-only baseline path.
|
|
50
|
+
* When a multimodal model IS available, the provider routes the call through it; any thrown error or
|
|
51
|
+
* garbage result is swallowed to `[]` so a misbehaving model can never break the run or override the
|
|
52
|
+
* structural baseline. No model id is hard-coded — selection is via `resolveQiMultimodalSelection`.
|
|
53
|
+
*/
|
|
54
|
+
export declare function makeFigmaVisionHintProvider(deps: UiHandlerDeps, visionCall?: FigmaVisionCall, options?: FigmaVisionHintProviderOptions): FigmaVisionHintProvider;
|
|
55
|
+
//# sourceMappingURL=figmaSnapshotAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figmaSnapshotAdapter.d.ts","sourceRoot":"","sources":["../../src/qualityIntelligence/figmaSnapshotAdapter.ts"],"names":[],"mappings":"AAmBA,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACzB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,sGAAsG;AACtG,MAAM,MAAM,mBAAmB,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,mBAAmB,GAAG,SAAS,CAAC;AAE7F,MAAM,WAAW,0BAA0B;IACzC;;;;;;;;OAQG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,aAAa,EACnB,OAAO,CAAC,EAAE,0BAA0B,GACnC,mBAAmB,GAAG,SAAS,CA0BjC;AAED,kGAAkG;AAClG,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uFAAuF;IACvF,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACtC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,kGAAkG;IAClG,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG,CACpC,OAAO,EAAE,wBAAwB,KAC9B,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;AAEpD;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,CAC5B,OAAO,EAAE,wBAAwB,EACjC,OAAO,EAAE,MAAM,KACZ,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;AAEpD,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CAC1D;AA2KD;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,aAAa,EACnB,UAAU,CAAC,EAAE,eAAe,EAC5B,OAAO,GAAE,8BAAmC,GAC3C,uBAAuB,CAiBzB"}
|