@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,18 @@
|
|
|
1
|
+
// Non-reversible scope reference for connector observability (Epic #750, Issue #760).
|
|
2
|
+
//
|
|
3
|
+
// An audit entry or consent record must NEVER carry a customer board id, link, file key, node id,
|
|
4
|
+
// or any design content. But it must still be keyed to "the same connected scope" so the operator
|
|
5
|
+
// can correlate connect → snapshot → re-snapshot → revoke for one board without ever recording which
|
|
6
|
+
// board it is. The scope reference is the SHA-256 of `${fileKey}:${nodeId}`, hex-encoded: a stable,
|
|
7
|
+
// collision-irrelevant, NON-REVERSIBLE digest. The same scope always yields the same ref; two
|
|
8
|
+
// different scopes (in practice) yield different refs; and the raw ids cannot be recovered from it.
|
|
9
|
+
//
|
|
10
|
+
// The hex digest also satisfies `assertValidRunId`'s bounded `[A-Za-z0-9._-]` charset, so it is a
|
|
11
|
+
// safe filename key for the reused contained JSON artifact store.
|
|
12
|
+
import { sha256Hex } from "@oscharko-dev/keiko-security";
|
|
13
|
+
/**
|
|
14
|
+
* Derive the opaque scope reference for a `(fileKey, nodeId)` pair. Pure and deterministic. The
|
|
15
|
+
* inputs are design identifiers and are consumed ONLY to produce the one-way digest — they are not
|
|
16
|
+
* retained anywhere by this function.
|
|
17
|
+
*/
|
|
18
|
+
export const deriveFigmaScopeRef = (fileKey, nodeId) => sha256Hex(`${fileKey}:${nodeId}`);
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/** A raw Figma node as returned by `GET /v1/files/:key/nodes` — provider-shaped, partially typed. */
|
|
2
|
+
export interface RawFigmaNode {
|
|
3
|
+
id?: unknown;
|
|
4
|
+
name?: unknown;
|
|
5
|
+
type?: unknown;
|
|
6
|
+
children?: RawFigmaNode[];
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
}
|
|
9
|
+
/** Fetches one node id's subtree at the configured `pageDepth`. Returns undefined on a hard failure
|
|
10
|
+
* (the caller keeps the shallow content rather than aborting the whole build). */
|
|
11
|
+
export type ScopedNodeFetcher = (nodeId: string) => Promise<RawFigmaNode | undefined>;
|
|
12
|
+
/**
|
|
13
|
+
* Generic, board-agnostic budgets that bound the per-screen pagination. The global ceiling is the
|
|
14
|
+
* deterministic product `maxScreensDeep × maxNodesPerScreen` (and `× maxFetchesPerScreen`): there is
|
|
15
|
+
* NO shared, live, cross-screen counter, so screens are fully independent and the assembled tree is
|
|
16
|
+
* identical regardless of how the concurrent fetches interleave (load-bearing for the drift hash,
|
|
17
|
+
* #735). None of these is tuned to a sample board; all are overridable per deployment.
|
|
18
|
+
*/
|
|
19
|
+
export interface ScopedPaginationLimits {
|
|
20
|
+
/** Depth of each individual scoped fetch (the discovery fetch and every per-screen fetch). A larger
|
|
21
|
+
* depth captures a whole shallow screen in one request and a deep screen in fewer rounds — the
|
|
22
|
+
* dominant lever against per-request latency — at the cost of larger individual responses. */
|
|
23
|
+
readonly pageDepth: number;
|
|
24
|
+
/** Per-screen raw-node budget; breadth-first expansion stops once a screen reaches it. */
|
|
25
|
+
readonly maxNodesPerScreen: number;
|
|
26
|
+
/** Per-screen fetch cap; bounds requests (and thus wall-clock) for one dense screen. */
|
|
27
|
+
readonly maxFetchesPerScreen: number;
|
|
28
|
+
/** Cap on how many discovered screens are deep-fetched; a board with more reports `capped`. */
|
|
29
|
+
readonly maxScreensDeep: number;
|
|
30
|
+
/**
|
|
31
|
+
* Max in-flight scoped fetches across the WHOLE build (a shared gate over all screens + levels).
|
|
32
|
+
* Real boards have multi-second per-subtree latency, so this pool is the dominant wall-clock lever.
|
|
33
|
+
* It throttles concurrency only — the result is order-independent and deterministic. The 429
|
|
34
|
+
* backoff (#759) absorbs the burst. Clamp ≥ 1.
|
|
35
|
+
*/
|
|
36
|
+
readonly fetchConcurrency: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Defaults balanced for Figma's cost-based rate limit on real, latency-bound boards (NOT tuned to any
|
|
40
|
+
* sample board's content). `pageDepth=8` captures typical screen bodies in one bounded request, while
|
|
41
|
+
* a small shared pool of 2 in-flight fetches avoids bursty high-cost 429s. The per-screen and
|
|
42
|
+
* per-board caps deliberately keep the worst-case live build below 100 deep scoped fetches by
|
|
43
|
+
* default, so a pasted whole-canvas Release section remains reviewable in the browser instead of
|
|
44
|
+
* turning into a minutes-long request storm. Operators can raise these budgets per deployment through
|
|
45
|
+
* KEIKO_FIGMA_* env vars when their Figma plan and proxy allow it.
|
|
46
|
+
*/
|
|
47
|
+
export declare const DEFAULT_SCOPED_PAGINATION_LIMITS: ScopedPaginationLimits;
|
|
48
|
+
/** Hard safety ceilings: operators may tune pagination, but never past these finite bounds. */
|
|
49
|
+
export declare const SCOPED_PAGINATION_LIMIT_CEILINGS: ScopedPaginationLimits;
|
|
50
|
+
export declare const resolveScopedPaginationLimits: (partial?: Partial<ScopedPaginationLimits>) => ScopedPaginationLimits;
|
|
51
|
+
/** Coverage telemetry for one deep snapshot fetch — surfaced in the snapshot summary (never a leak). */
|
|
52
|
+
export interface FigmaScopeCoverage {
|
|
53
|
+
/** Screens discovered structurally under the scoped root. */
|
|
54
|
+
readonly screenCount: number;
|
|
55
|
+
/** Screens that received a per-screen deep fetch (≤ `maxScreensDeep`). */
|
|
56
|
+
readonly screensDeepFetched: number;
|
|
57
|
+
/** Screens whose deep content was cut short by a per-screen budget (a coverage signal). */
|
|
58
|
+
readonly screensTruncated: number;
|
|
59
|
+
/** Total raw nodes in the assembled deep document. */
|
|
60
|
+
readonly nodeCount: number;
|
|
61
|
+
/** Total per-screen scoped fetches performed (excludes the single discovery fetch). */
|
|
62
|
+
readonly fetchCount: number;
|
|
63
|
+
/** True when more screens were discovered than `maxScreensDeep`, so some stayed shallow. */
|
|
64
|
+
readonly capped: boolean;
|
|
65
|
+
}
|
|
66
|
+
export interface DeepFetchResult {
|
|
67
|
+
readonly document: RawFigmaNode;
|
|
68
|
+
readonly coverage: FigmaScopeCoverage;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The screen FRAME/INSTANCE nodes under a scoped root, descending only through container groupings
|
|
72
|
+
* (CANVAS/SECTION) — never into a screen's own body, so a nested frame stays part of its screen.
|
|
73
|
+
* Mirrors the pure-domain `detectScreens` rule (#752) at the connector (raw-node) layer. A directly
|
|
74
|
+
* scoped screen root is the sole screen.
|
|
75
|
+
*/
|
|
76
|
+
export declare const discoverScreenNodes: (root: RawFigmaNode) => readonly RawFigmaNode[];
|
|
77
|
+
/**
|
|
78
|
+
* Deepen a shallow scoped document into a per-screen-paginated one, bounded by {@link limits}.
|
|
79
|
+
* `fetchNode` performs one bounded `depth=pageDepth` scoped fetch (with the connector's 429 backoff).
|
|
80
|
+
* Stays inside the snapshot-build boundary: it issues only scoped node fetches, returns the assembled
|
|
81
|
+
* raw document for the existing deterministic IR cleaner, and reports coverage. A board with no
|
|
82
|
+
* discoverable screen (a directly-scoped non-screen, non-container node) returns the shallow root
|
|
83
|
+
* unchanged with zero-screen coverage.
|
|
84
|
+
*/
|
|
85
|
+
export declare const paginateScopedDocument: (shallowRoot: RawFigmaNode, fetchNode: ScopedNodeFetcher, limits?: ScopedPaginationLimits) => Promise<DeepFetchResult>;
|
|
86
|
+
//# sourceMappingURL=figmaScopedPagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figmaScopedPagination.d.ts","sourceRoot":"","sources":["../../../src/qualityIntelligence/figma/figmaScopedPagination.ts"],"names":[],"mappings":"AAyBA,qGAAqG;AACrG,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;mFACmF;AACnF,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;AAEtF;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC;;mGAE+F;IAC/F,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,0FAA0F;IAC1F,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,wFAAwF;IACxF,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,+FAA+F;IAC/F,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,gCAAgC,EAAE,sBAM9C,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,gCAAgC,EAAE,sBAM9C,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,UAAU,OAAO,CAAC,sBAAsB,CAAC,KACxC,sBAgBF,CAAC;AAEF,wGAAwG;AACxG,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,2FAA2F;IAC3F,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,sDAAsD;IACtD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,uFAAuF;IACvF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,4FAA4F;IAC5F,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;CACvC;AA0CD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,YAAY,KAAG,SAAS,YAAY,EAY7E,CAAC;AA4KF;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,GACjC,aAAa,YAAY,EACzB,WAAW,iBAAiB,EAC5B,SAAQ,sBAAyD,KAChE,OAAO,CAAC,eAAe,CAsCzB,CAAC"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
// Scoped, bounded depth pagination for the Figma snapshot-build (Epic #750, Issues #837, #759).
|
|
2
|
+
//
|
|
3
|
+
// PROBLEM (#837, found by live verification in #757): a single scoped `nodes?depth=4` fetch of the
|
|
4
|
+
// canvas captures layout + structure + design tokens but almost NO in-screen text — on real,
|
|
5
|
+
// component-instance-heavy enterprise boards the meaningful UI text lives DEEP inside instance
|
|
6
|
+
// subtrees (verified content-free: text concentrated at screen-relative depths 7–18). A naive
|
|
7
|
+
// deeper single fetch is not an option: one real screen alone is 17k–20k nodes, far past the
|
|
8
|
+
// per-fetch oversize guard (#759), and the whole canvas is hundreds of thousands of nodes.
|
|
9
|
+
//
|
|
10
|
+
// SOLUTION: per-screen scoped pagination, still strictly WITHIN the snapshot-build communication
|
|
11
|
+
// boundary (Figma is contacted only here, during the build; every downstream stage reads the stored
|
|
12
|
+
// Snapshot). After the screens are discovered structurally from one shallow fetch, each screen
|
|
13
|
+
// subtree is completed by a breadth-first sequence of bounded `depth=pageDepth` fetches: each fetch
|
|
14
|
+
// is small (one subtree, ≤ a per-fetch budget), and the assembled per-screen tree is bounded by a
|
|
15
|
+
// per-screen node + request budget. Breadth-first means the shallow, most-meaningful levels are
|
|
16
|
+
// captured first; when a budget is hit the deep tail is dropped and the screen is reported truncated
|
|
17
|
+
// (a coverage signal, never a crash). Figma truncates a depth-limited subtree by returning
|
|
18
|
+
// `children: []` on the frontier container nodes — that empty array on a container at exactly
|
|
19
|
+
// `pageDepth` is the re-fetch marker.
|
|
20
|
+
//
|
|
21
|
+
// Generic by construction: no screen name, layout, mask style, copy, or board-specific threshold is
|
|
22
|
+
// read — only structural node type and the generic budgets below. Deterministic: screens and each
|
|
23
|
+
// frontier are processed in Figma's stable child order, so the same board state yields the same
|
|
24
|
+
// assembled tree (and a budget cut-off truncates the same deterministic tail every run).
|
|
25
|
+
/**
|
|
26
|
+
* Defaults balanced for Figma's cost-based rate limit on real, latency-bound boards (NOT tuned to any
|
|
27
|
+
* sample board's content). `pageDepth=8` captures typical screen bodies in one bounded request, while
|
|
28
|
+
* a small shared pool of 2 in-flight fetches avoids bursty high-cost 429s. The per-screen and
|
|
29
|
+
* per-board caps deliberately keep the worst-case live build below 100 deep scoped fetches by
|
|
30
|
+
* default, so a pasted whole-canvas Release section remains reviewable in the browser instead of
|
|
31
|
+
* turning into a minutes-long request storm. Operators can raise these budgets per deployment through
|
|
32
|
+
* KEIKO_FIGMA_* env vars when their Figma plan and proxy allow it.
|
|
33
|
+
*/
|
|
34
|
+
export const DEFAULT_SCOPED_PAGINATION_LIMITS = {
|
|
35
|
+
pageDepth: 8,
|
|
36
|
+
maxNodesPerScreen: 8_000,
|
|
37
|
+
maxFetchesPerScreen: 6,
|
|
38
|
+
maxScreensDeep: 16,
|
|
39
|
+
fetchConcurrency: 2,
|
|
40
|
+
};
|
|
41
|
+
/** Hard safety ceilings: operators may tune pagination, but never past these finite bounds. */
|
|
42
|
+
export const SCOPED_PAGINATION_LIMIT_CEILINGS = {
|
|
43
|
+
pageDepth: 16,
|
|
44
|
+
maxNodesPerScreen: 50_000,
|
|
45
|
+
maxFetchesPerScreen: 128,
|
|
46
|
+
maxScreensDeep: 250,
|
|
47
|
+
fetchConcurrency: 8,
|
|
48
|
+
};
|
|
49
|
+
export const resolveScopedPaginationLimits = (partial) => {
|
|
50
|
+
const pick = (key) => {
|
|
51
|
+
const supplied = partial?.[key];
|
|
52
|
+
const resolved = supplied !== undefined && Number.isInteger(supplied) && supplied >= 1
|
|
53
|
+
? supplied
|
|
54
|
+
: DEFAULT_SCOPED_PAGINATION_LIMITS[key];
|
|
55
|
+
return Math.min(resolved, SCOPED_PAGINATION_LIMIT_CEILINGS[key]);
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
pageDepth: pick("pageDepth"),
|
|
59
|
+
maxNodesPerScreen: pick("maxNodesPerScreen"),
|
|
60
|
+
maxFetchesPerScreen: pick("maxFetchesPerScreen"),
|
|
61
|
+
maxScreensDeep: pick("maxScreensDeep"),
|
|
62
|
+
fetchConcurrency: pick("fetchConcurrency"),
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
const SCREEN_TYPES = new Set(["FRAME", "INSTANCE"]);
|
|
66
|
+
const CONTAINER_TYPES = new Set(["CANVAS", "SECTION"]);
|
|
67
|
+
// Node types whose internals are worth a deeper fetch. Leaves (TEXT, VECTOR, RECTANGLE, …) never
|
|
68
|
+
// carry children, so re-fetching them would waste a request; only these container types are expanded.
|
|
69
|
+
const PAGINATE_CONTAINER = new Set([
|
|
70
|
+
"FRAME",
|
|
71
|
+
"GROUP",
|
|
72
|
+
"INSTANCE",
|
|
73
|
+
"COMPONENT",
|
|
74
|
+
"COMPONENT_SET",
|
|
75
|
+
"SECTION",
|
|
76
|
+
]);
|
|
77
|
+
const typeOf = (node) => (typeof node.type === "string" ? node.type : "");
|
|
78
|
+
const idOf = (node) => (typeof node.id === "string" ? node.id : "");
|
|
79
|
+
const childrenOf = (node) => Array.isArray(node.children) ? node.children : [];
|
|
80
|
+
const countNodes = (node) => {
|
|
81
|
+
let total = 1;
|
|
82
|
+
for (const child of childrenOf(node))
|
|
83
|
+
total += countNodes(child);
|
|
84
|
+
return total;
|
|
85
|
+
};
|
|
86
|
+
const pruneToNodeBudget = (node, maxNodes) => {
|
|
87
|
+
let remaining = Math.max(1, maxNodes);
|
|
88
|
+
const clone = (current) => {
|
|
89
|
+
if (remaining <= 0)
|
|
90
|
+
return undefined;
|
|
91
|
+
remaining -= 1;
|
|
92
|
+
const children = [];
|
|
93
|
+
for (const child of childrenOf(current)) {
|
|
94
|
+
const kept = clone(child);
|
|
95
|
+
if (kept === undefined)
|
|
96
|
+
break;
|
|
97
|
+
children.push(kept);
|
|
98
|
+
}
|
|
99
|
+
return { ...current, children };
|
|
100
|
+
};
|
|
101
|
+
return clone(node) ?? { ...node, children: [] };
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* The screen FRAME/INSTANCE nodes under a scoped root, descending only through container groupings
|
|
105
|
+
* (CANVAS/SECTION) — never into a screen's own body, so a nested frame stays part of its screen.
|
|
106
|
+
* Mirrors the pure-domain `detectScreens` rule (#752) at the connector (raw-node) layer. A directly
|
|
107
|
+
* scoped screen root is the sole screen.
|
|
108
|
+
*/
|
|
109
|
+
export const discoverScreenNodes = (root) => {
|
|
110
|
+
if (SCREEN_TYPES.has(typeOf(root)))
|
|
111
|
+
return [root];
|
|
112
|
+
if (!CONTAINER_TYPES.has(typeOf(root)))
|
|
113
|
+
return [];
|
|
114
|
+
const screens = [];
|
|
115
|
+
const walk = (node) => {
|
|
116
|
+
for (const child of childrenOf(node)) {
|
|
117
|
+
if (SCREEN_TYPES.has(typeOf(child)))
|
|
118
|
+
screens.push(child);
|
|
119
|
+
else if (CONTAINER_TYPES.has(typeOf(child)))
|
|
120
|
+
walk(child);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
walk(root);
|
|
124
|
+
return screens;
|
|
125
|
+
};
|
|
126
|
+
// Collect the container frontier nodes of a `pageDepth`-limited subtree: containers at exactly
|
|
127
|
+
// `pageDepth` carrying an empty `children` array (Figma's truncation marker). These are the only
|
|
128
|
+
// nodes worth re-fetching to descend further.
|
|
129
|
+
const collectFrontier = (node, pageDepth) => {
|
|
130
|
+
const out = [];
|
|
131
|
+
const rec = (current, depth) => {
|
|
132
|
+
if (depth === pageDepth) {
|
|
133
|
+
if (PAGINATE_CONTAINER.has(typeOf(current)) && childrenOf(current).length === 0) {
|
|
134
|
+
out.push(current);
|
|
135
|
+
}
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
for (const child of childrenOf(current))
|
|
139
|
+
rec(child, depth + 1);
|
|
140
|
+
};
|
|
141
|
+
rec(node, 0);
|
|
142
|
+
return out;
|
|
143
|
+
};
|
|
144
|
+
// A concurrency-limited fetch wrapper shared across all screens + levels: at most `limit` scoped
|
|
145
|
+
// fetches are ever in flight, no matter how many screens deepen in parallel. It throttles only — it
|
|
146
|
+
// never reorders results a caller awaits — so it does not affect the deterministic assembled tree.
|
|
147
|
+
const createFetchGate = (fetchNode, limit) => {
|
|
148
|
+
const cap = Math.max(1, limit);
|
|
149
|
+
let active = 0;
|
|
150
|
+
const queue = [];
|
|
151
|
+
const acquire = () => {
|
|
152
|
+
if (active < cap) {
|
|
153
|
+
active += 1;
|
|
154
|
+
return Promise.resolve();
|
|
155
|
+
}
|
|
156
|
+
return new Promise((resolve) => queue.push(resolve));
|
|
157
|
+
};
|
|
158
|
+
const release = () => {
|
|
159
|
+
const next = queue.shift();
|
|
160
|
+
if (next !== undefined)
|
|
161
|
+
next(); // hand the slot straight to the next waiter (active unchanged)
|
|
162
|
+
else
|
|
163
|
+
active -= 1;
|
|
164
|
+
};
|
|
165
|
+
return async (nodeId) => {
|
|
166
|
+
await acquire();
|
|
167
|
+
try {
|
|
168
|
+
return await fetchNode(nodeId);
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
release();
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
// Expand one breadth-first level: fetch the (budget-capped) frontier nodes together through the gate,
|
|
176
|
+
// splice their children back in stable order, and collect the next level. Pure of any cross-screen
|
|
177
|
+
// state — its result depends only on the inputs, so concurrent interleaving cannot change it.
|
|
178
|
+
const expandLevel = async (frontier, gatedFetch, pageDepth, fetchBudget, nodeBudgetRemaining) => {
|
|
179
|
+
const level = frontier.slice(0, Math.max(0, fetchBudget));
|
|
180
|
+
let cut = level.length < frontier.length;
|
|
181
|
+
const deeps = await Promise.all(level.map((fnode) => gatedFetch(idOf(fnode))));
|
|
182
|
+
const nextFrontier = [];
|
|
183
|
+
let nodesAdded = 0;
|
|
184
|
+
let remainingNodeBudget = Math.max(0, nodeBudgetRemaining);
|
|
185
|
+
for (let k = 0; k < level.length; k += 1) {
|
|
186
|
+
const frontierNode = level[k];
|
|
187
|
+
const deep = deeps[k];
|
|
188
|
+
if (frontierNode === undefined)
|
|
189
|
+
continue;
|
|
190
|
+
if (deep === undefined) {
|
|
191
|
+
cut = true;
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const deepChildren = childrenOf(deep);
|
|
195
|
+
if (deepChildren.length > 0) {
|
|
196
|
+
const added = countNodes(deep) - 1;
|
|
197
|
+
if (added > remainingNodeBudget) {
|
|
198
|
+
cut = true;
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
frontierNode.children = deepChildren;
|
|
202
|
+
nodesAdded += added;
|
|
203
|
+
remainingNodeBudget -= added;
|
|
204
|
+
for (const f of collectFrontier(deep, pageDepth))
|
|
205
|
+
nextFrontier.push(f);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return { nextFrontier, fetchesUsed: level.length, nodesAdded, cut };
|
|
209
|
+
};
|
|
210
|
+
// Complete one screen subtree by breadth-first bounded pagination. Each level's frontier fetches are
|
|
211
|
+
// dispatched together through the shared gate (so they run in parallel with other screens' fetches),
|
|
212
|
+
// then applied in stable order. Bounded by the per-screen node + fetch budgets only — independent of
|
|
213
|
+
// every other screen — so the result is deterministic regardless of concurrent interleaving.
|
|
214
|
+
const completeScreen = async (shallow, gatedFetch, limits) => {
|
|
215
|
+
const base = await gatedFetch(idOf(shallow));
|
|
216
|
+
if (base === undefined) {
|
|
217
|
+
// Could not deepen this screen — keep the shallow content, but surface partial capture.
|
|
218
|
+
return { node: shallow, deepFetched: false, truncated: true, fetchCount: 1 };
|
|
219
|
+
}
|
|
220
|
+
let screenNodes = countNodes(base);
|
|
221
|
+
let fetches = 1;
|
|
222
|
+
let truncated = false;
|
|
223
|
+
if (screenNodes > limits.maxNodesPerScreen) {
|
|
224
|
+
return {
|
|
225
|
+
node: pruneToNodeBudget(base, limits.maxNodesPerScreen),
|
|
226
|
+
deepFetched: true,
|
|
227
|
+
truncated: true,
|
|
228
|
+
fetchCount: fetches,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
let frontier = collectFrontier(base, limits.pageDepth);
|
|
232
|
+
while (frontier.length > 0) {
|
|
233
|
+
if (screenNodes >= limits.maxNodesPerScreen || fetches >= limits.maxFetchesPerScreen) {
|
|
234
|
+
truncated = true;
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
const level = await expandLevel(frontier, gatedFetch, limits.pageDepth, limits.maxFetchesPerScreen - fetches, limits.maxNodesPerScreen - screenNodes);
|
|
238
|
+
fetches += level.fetchesUsed;
|
|
239
|
+
screenNodes += level.nodesAdded;
|
|
240
|
+
if (level.cut) {
|
|
241
|
+
truncated = true;
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
frontier = level.nextFrontier;
|
|
245
|
+
}
|
|
246
|
+
if (frontier.length > 0)
|
|
247
|
+
truncated = true;
|
|
248
|
+
return { node: base, deepFetched: true, truncated, fetchCount: fetches };
|
|
249
|
+
};
|
|
250
|
+
// Rebuild the scoped document with each screen subtree replaced by its deep-fetched version, keeping
|
|
251
|
+
// the surrounding container structure (CANVAS/SECTION) intact. Screen nodes are matched by id.
|
|
252
|
+
const rebuildWithDeepScreens = (root, deepById) => {
|
|
253
|
+
const rewrite = (node) => {
|
|
254
|
+
const replacement = deepById.get(idOf(node));
|
|
255
|
+
if (replacement !== undefined)
|
|
256
|
+
return replacement;
|
|
257
|
+
const kids = childrenOf(node);
|
|
258
|
+
if (kids.length === 0)
|
|
259
|
+
return node;
|
|
260
|
+
return { ...node, children: kids.map(rewrite) };
|
|
261
|
+
};
|
|
262
|
+
return rewrite(root);
|
|
263
|
+
};
|
|
264
|
+
/**
|
|
265
|
+
* Deepen a shallow scoped document into a per-screen-paginated one, bounded by {@link limits}.
|
|
266
|
+
* `fetchNode` performs one bounded `depth=pageDepth` scoped fetch (with the connector's 429 backoff).
|
|
267
|
+
* Stays inside the snapshot-build boundary: it issues only scoped node fetches, returns the assembled
|
|
268
|
+
* raw document for the existing deterministic IR cleaner, and reports coverage. A board with no
|
|
269
|
+
* discoverable screen (a directly-scoped non-screen, non-container node) returns the shallow root
|
|
270
|
+
* unchanged with zero-screen coverage.
|
|
271
|
+
*/
|
|
272
|
+
export const paginateScopedDocument = async (shallowRoot, fetchNode, limits = DEFAULT_SCOPED_PAGINATION_LIMITS) => {
|
|
273
|
+
const resolvedLimits = resolveScopedPaginationLimits(limits);
|
|
274
|
+
const screens = discoverScreenNodes(shallowRoot);
|
|
275
|
+
const deepable = screens.slice(0, resolvedLimits.maxScreensDeep);
|
|
276
|
+
const gatedFetch = createFetchGate(fetchNode, resolvedLimits.fetchConcurrency);
|
|
277
|
+
// All deep-fetchable screens run concurrently; the shared gate bounds total in-flight fetches.
|
|
278
|
+
// Each screen's result depends only on its own budgets, so order-of-completion never changes it.
|
|
279
|
+
const outcomes = await Promise.all(deepable.map((screen) => completeScreen(screen, gatedFetch, resolvedLimits)));
|
|
280
|
+
const deepById = new Map();
|
|
281
|
+
let screensDeepFetched = 0;
|
|
282
|
+
let screensTruncated = 0;
|
|
283
|
+
let fetchCount = 0;
|
|
284
|
+
deepable.forEach((screen, index) => {
|
|
285
|
+
const outcome = outcomes[index];
|
|
286
|
+
if (outcome === undefined)
|
|
287
|
+
return;
|
|
288
|
+
deepById.set(idOf(screen), outcome.node);
|
|
289
|
+
if (outcome.deepFetched)
|
|
290
|
+
screensDeepFetched += 1;
|
|
291
|
+
if (outcome.truncated)
|
|
292
|
+
screensTruncated += 1;
|
|
293
|
+
fetchCount += outcome.fetchCount;
|
|
294
|
+
});
|
|
295
|
+
// When the root IS the single screen, the rebuild replaces the root itself with its deep version.
|
|
296
|
+
const document = rebuildWithDeepScreens(shallowRoot, deepById);
|
|
297
|
+
return {
|
|
298
|
+
document,
|
|
299
|
+
coverage: {
|
|
300
|
+
screenCount: screens.length,
|
|
301
|
+
screensDeepFetched,
|
|
302
|
+
screensTruncated,
|
|
303
|
+
nodeCount: countNodes(document),
|
|
304
|
+
fetchCount,
|
|
305
|
+
capped: deepable.length < screens.length,
|
|
306
|
+
},
|
|
307
|
+
};
|
|
308
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { FigmaHttpPort } from "./figmaHttpPort.js";
|
|
2
|
+
import type { FigmaRenderPort } from "./figmaRenderPort.js";
|
|
3
|
+
import type { FigmaProvenance } from "./figmaConnector.js";
|
|
4
|
+
import { type FigmaRetryPolicy, type FigmaRetrySleep } from "./figmaRetry.js";
|
|
5
|
+
import type { FigmaSnapshot } from "./figmaSnapshotTypes.js";
|
|
6
|
+
import type { QualityIntelligenceFigma } from "@oscharko-dev/keiko-quality-intelligence";
|
|
7
|
+
export interface BuildFigmaSnapshotInput {
|
|
8
|
+
readonly ir: QualityIntelligenceFigma.ScreenIrResult;
|
|
9
|
+
readonly provenance: FigmaProvenance;
|
|
10
|
+
readonly token: string;
|
|
11
|
+
readonly imagesPort: FigmaHttpPort;
|
|
12
|
+
readonly renderPort: FigmaRenderPort;
|
|
13
|
+
/** `/v1/images` ids-per-call cap — bounds each render batch. */
|
|
14
|
+
readonly batchSize?: number;
|
|
15
|
+
readonly maxImageBytes?: number;
|
|
16
|
+
/** Max simultaneous byte-downloads — bounds burst on huge boards. */
|
|
17
|
+
readonly downloadConcurrency?: number;
|
|
18
|
+
/** Max screens rendered into image side-files; excess screens remain structural-only skips. */
|
|
19
|
+
readonly maxScreensRendered?: number;
|
|
20
|
+
/** Deterministic 429 backoff policy; defaults to {@link DEFAULT_FIGMA_RETRY_POLICY}. */
|
|
21
|
+
readonly retryPolicy?: FigmaRetryPolicy;
|
|
22
|
+
/** Injectable wait seam so tests assert the backoff schedule without real delays. */
|
|
23
|
+
readonly sleep?: FigmaRetrySleep;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Render the screens and assemble the immutable Figma Snapshot. Render failures degrade to a
|
|
27
|
+
* `skippedScreens` entry plus structural-only IR (partial render); a non-2xx `/v1/images` call is
|
|
28
|
+
* a hard coded error.
|
|
29
|
+
*/
|
|
30
|
+
export declare const buildFigmaSnapshot: (input: BuildFigmaSnapshotInput) => Promise<FigmaSnapshot>;
|
|
31
|
+
//# sourceMappingURL=figmaSnapshotBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figmaSnapshotBuilder.d.ts","sourceRoot":"","sources":["../../../src/qualityIntelligence/figma/figmaSnapshotBuilder.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AAMzB,OAAO,KAAK,EAGV,aAAa,EAGd,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AAiBzF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,EAAE,wBAAwB,CAAC,cAAc,CAAC;IACrD,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,gEAAgE;IAChE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,qEAAqE;IACrE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,+FAA+F;IAC/F,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,wFAAwF;IACxF,QAAQ,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IACxC,qFAAqF;IACrF,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;CAClC;AAuSD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,uBAAuB,KAC7B,OAAO,CAAC,aAAa,CAyCvB,CAAC"}
|