@hongmaple0820/med-scale-research-os 0.43.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/.scale/mcp-servers.yaml +144 -0
- package/.scale/skills.json +830 -0
- package/.scale/verification.json +52 -0
- package/LICENSE +15 -0
- package/README.en.md +156 -0
- package/README.md +156 -0
- package/dist/adapters/AiderAdapter.d.ts +22 -0
- package/dist/adapters/AiderAdapter.js +262 -0
- package/dist/adapters/AiderAdapter.js.map +1 -0
- package/dist/adapters/AntigravityAdapter.d.ts +4 -0
- package/dist/adapters/AntigravityAdapter.js +21 -0
- package/dist/adapters/AntigravityAdapter.js.map +1 -0
- package/dist/adapters/ClaudeCodeAdapter.d.ts +54 -0
- package/dist/adapters/ClaudeCodeAdapter.js +185 -0
- package/dist/adapters/ClaudeCodeAdapter.js.map +1 -0
- package/dist/adapters/ClineAdapter.d.ts +4 -0
- package/dist/adapters/ClineAdapter.js +20 -0
- package/dist/adapters/ClineAdapter.js.map +1 -0
- package/dist/adapters/CodexAdapter.d.ts +15 -0
- package/dist/adapters/CodexAdapter.js +160 -0
- package/dist/adapters/CodexAdapter.js.map +1 -0
- package/dist/adapters/CursorAdapter.d.ts +14 -0
- package/dist/adapters/CursorAdapter.js +171 -0
- package/dist/adapters/CursorAdapter.js.map +1 -0
- package/dist/adapters/DeepSeekTuiAdapter.d.ts +19 -0
- package/dist/adapters/DeepSeekTuiAdapter.js +263 -0
- package/dist/adapters/DeepSeekTuiAdapter.js.map +1 -0
- package/dist/adapters/DoubaoAdapter.d.ts +14 -0
- package/dist/adapters/DoubaoAdapter.js +184 -0
- package/dist/adapters/DoubaoAdapter.js.map +1 -0
- package/dist/adapters/GeminiAdapter.d.ts +14 -0
- package/dist/adapters/GeminiAdapter.js +163 -0
- package/dist/adapters/GeminiAdapter.js.map +1 -0
- package/dist/adapters/GenericProjectAgentAdapter.d.ts +29 -0
- package/dist/adapters/GenericProjectAgentAdapter.js +204 -0
- package/dist/adapters/GenericProjectAgentAdapter.js.map +1 -0
- package/dist/adapters/HermesAdapter.d.ts +14 -0
- package/dist/adapters/HermesAdapter.js +163 -0
- package/dist/adapters/HermesAdapter.js.map +1 -0
- package/dist/adapters/JCodeAdapter.d.ts +4 -0
- package/dist/adapters/JCodeAdapter.js +19 -0
- package/dist/adapters/JCodeAdapter.js.map +1 -0
- package/dist/adapters/KiloCodeAdapter.d.ts +4 -0
- package/dist/adapters/KiloCodeAdapter.js +20 -0
- package/dist/adapters/KiloCodeAdapter.js.map +1 -0
- package/dist/adapters/KimiAdapter.d.ts +14 -0
- package/dist/adapters/KimiAdapter.js +183 -0
- package/dist/adapters/KimiAdapter.js.map +1 -0
- package/dist/adapters/KiroAdapter.d.ts +14 -0
- package/dist/adapters/KiroAdapter.js +180 -0
- package/dist/adapters/KiroAdapter.js.map +1 -0
- package/dist/adapters/OpenClawAdapter.d.ts +14 -0
- package/dist/adapters/OpenClawAdapter.js +163 -0
- package/dist/adapters/OpenClawAdapter.js.map +1 -0
- package/dist/adapters/OpenCodeAdapter.d.ts +14 -0
- package/dist/adapters/OpenCodeAdapter.js +172 -0
- package/dist/adapters/OpenCodeAdapter.js.map +1 -0
- package/dist/adapters/QCoderAdapter.d.ts +14 -0
- package/dist/adapters/QCoderAdapter.js +159 -0
- package/dist/adapters/QCoderAdapter.js.map +1 -0
- package/dist/adapters/QoderAdapter.d.ts +4 -0
- package/dist/adapters/QoderAdapter.js +21 -0
- package/dist/adapters/QoderAdapter.js.map +1 -0
- package/dist/adapters/TraeAdapter.d.ts +14 -0
- package/dist/adapters/TraeAdapter.js +159 -0
- package/dist/adapters/TraeAdapter.js.map +1 -0
- package/dist/adapters/VSCAdapter.d.ts +14 -0
- package/dist/adapters/VSCAdapter.js +159 -0
- package/dist/adapters/VSCAdapter.js.map +1 -0
- package/dist/adapters/WindsurfAdapter.d.ts +14 -0
- package/dist/adapters/WindsurfAdapter.js +185 -0
- package/dist/adapters/WindsurfAdapter.js.map +1 -0
- package/dist/adapters/WorkBuddyAdapter.d.ts +14 -0
- package/dist/adapters/WorkBuddyAdapter.js +159 -0
- package/dist/adapters/WorkBuddyAdapter.js.map +1 -0
- package/dist/adapters/index.d.ts +32 -0
- package/dist/adapters/index.js +87 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/agents/AgentChannel.d.ts +43 -0
- package/dist/agents/AgentChannel.js +136 -0
- package/dist/agents/AgentChannel.js.map +1 -0
- package/dist/agents/AgentCoordinator.d.ts +29 -0
- package/dist/agents/AgentCoordinator.js +136 -0
- package/dist/agents/AgentCoordinator.js.map +1 -0
- package/dist/agents/AgentDispatcher.d.ts +24 -0
- package/dist/agents/AgentDispatcher.js +112 -0
- package/dist/agents/AgentDispatcher.js.map +1 -0
- package/dist/agents/AgentManager.d.ts +14 -0
- package/dist/agents/AgentManager.js +85 -0
- package/dist/agents/AgentManager.js.map +1 -0
- package/dist/agents/AgentPool.d.ts +59 -0
- package/dist/agents/AgentPool.js +192 -0
- package/dist/agents/AgentPool.js.map +1 -0
- package/dist/agents/AgentRegistry.d.ts +20 -0
- package/dist/agents/AgentRegistry.js +36 -0
- package/dist/agents/AgentRegistry.js.map +1 -0
- package/dist/agents/AgentSourceLoader.d.ts +73 -0
- package/dist/agents/AgentSourceLoader.js +103 -0
- package/dist/agents/AgentSourceLoader.js.map +1 -0
- package/dist/agents/IAgent.d.ts +53 -0
- package/dist/agents/IAgent.js +4 -0
- package/dist/agents/IAgent.js.map +1 -0
- package/dist/agents/LeadershipPresets.d.ts +16 -0
- package/dist/agents/LeadershipPresets.js +152 -0
- package/dist/agents/LeadershipPresets.js.map +1 -0
- package/dist/agents/definitions/debugger.d.ts +2 -0
- package/dist/agents/definitions/debugger.js +6 -0
- package/dist/agents/definitions/debugger.js.map +1 -0
- package/dist/agents/definitions/doc-writer.d.ts +2 -0
- package/dist/agents/definitions/doc-writer.js +6 -0
- package/dist/agents/definitions/doc-writer.js.map +1 -0
- package/dist/agents/definitions/implementer.d.ts +2 -0
- package/dist/agents/definitions/implementer.js +6 -0
- package/dist/agents/definitions/implementer.js.map +1 -0
- package/dist/agents/definitions/planner.d.ts +2 -0
- package/dist/agents/definitions/planner.js +6 -0
- package/dist/agents/definitions/planner.js.map +1 -0
- package/dist/agents/definitions/researcher.d.ts +2 -0
- package/dist/agents/definitions/researcher.js +6 -0
- package/dist/agents/definitions/researcher.js.map +1 -0
- package/dist/agents/definitions/reviewer.d.ts +2 -0
- package/dist/agents/definitions/reviewer.js +6 -0
- package/dist/agents/definitions/reviewer.js.map +1 -0
- package/dist/agents/definitions/security.d.ts +2 -0
- package/dist/agents/definitions/security.js +6 -0
- package/dist/agents/definitions/security.js.map +1 -0
- package/dist/agents/definitions/tester.d.ts +2 -0
- package/dist/agents/definitions/tester.js +6 -0
- package/dist/agents/definitions/tester.js.map +1 -0
- package/dist/agents/index.d.ts +23 -0
- package/dist/agents/index.js +44 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/profiles.d.ts +26 -0
- package/dist/agents/profiles.js +197 -0
- package/dist/agents/profiles.js.map +1 -0
- package/dist/agents/types.d.ts +262 -0
- package/dist/agents/types.js +4 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/api/cli.d.ts +2 -0
- package/dist/api/cli.js +6678 -0
- package/dist/api/cli.js.map +1 -0
- package/dist/api/doctor.d.ts +83 -0
- package/dist/api/doctor.js +982 -0
- package/dist/api/doctor.js.map +1 -0
- package/dist/api/mcp.d.ts +32 -0
- package/dist/api/mcp.js +223 -0
- package/dist/api/mcp.js.map +1 -0
- package/dist/api/medscale.d.ts +2 -0
- package/dist/api/medscale.js +20 -0
- package/dist/api/medscale.js.map +1 -0
- package/dist/api/quickstart.d.ts +86 -0
- package/dist/api/quickstart.js +291 -0
- package/dist/api/quickstart.js.map +1 -0
- package/dist/artifact/fsm.d.ts +41 -0
- package/dist/artifact/fsm.js +221 -0
- package/dist/artifact/fsm.js.map +1 -0
- package/dist/artifact/fsmDefinitions.d.ts +18 -0
- package/dist/artifact/fsmDefinitions.js +296 -0
- package/dist/artifact/fsmDefinitions.js.map +1 -0
- package/dist/artifact/sqliteStore.d.ts +61 -0
- package/dist/artifact/sqliteStore.js +381 -0
- package/dist/artifact/sqliteStore.js.map +1 -0
- package/dist/artifact/store.d.ts +49 -0
- package/dist/artifact/store.js +116 -0
- package/dist/artifact/store.js.map +1 -0
- package/dist/artifact/types.d.ts +535 -0
- package/dist/artifact/types.js +74 -0
- package/dist/artifact/types.js.map +1 -0
- package/dist/bootstrap/DependencyBootstrap.d.ts +112 -0
- package/dist/bootstrap/DependencyBootstrap.js +1046 -0
- package/dist/bootstrap/DependencyBootstrap.js.map +1 -0
- package/dist/bootstrap/DependencyBootstrapRenderer.d.ts +3 -0
- package/dist/bootstrap/DependencyBootstrapRenderer.js +138 -0
- package/dist/bootstrap/DependencyBootstrapRenderer.js.map +1 -0
- package/dist/bridge/PythonBridge.d.ts +80 -0
- package/dist/bridge/PythonBridge.js +437 -0
- package/dist/bridge/PythonBridge.js.map +1 -0
- package/dist/bridge/index.d.ts +2 -0
- package/dist/bridge/index.js +7 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/bridge/medicalWorkflows.d.ts +29 -0
- package/dist/bridge/medicalWorkflows.js +156 -0
- package/dist/bridge/medicalWorkflows.js.map +1 -0
- package/dist/bridge/types.d.ts +381 -0
- package/dist/bridge/types.js +113 -0
- package/dist/bridge/types.js.map +1 -0
- package/dist/cache/ScanCache.d.ts +41 -0
- package/dist/cache/ScanCache.js +120 -0
- package/dist/cache/ScanCache.js.map +1 -0
- package/dist/capabilities/BrowserCapability.d.ts +30 -0
- package/dist/capabilities/BrowserCapability.js +73 -0
- package/dist/capabilities/BrowserCapability.js.map +1 -0
- package/dist/capabilities/BrowserQACapability.d.ts +165 -0
- package/dist/capabilities/BrowserQACapability.js +438 -0
- package/dist/capabilities/BrowserQACapability.js.map +1 -0
- package/dist/capabilities/CapabilityRegistry.d.ts +17 -0
- package/dist/capabilities/CapabilityRegistry.js +65 -0
- package/dist/capabilities/CapabilityRegistry.js.map +1 -0
- package/dist/capabilities/ComputerCapability.d.ts +28 -0
- package/dist/capabilities/ComputerCapability.js +40 -0
- package/dist/capabilities/ComputerCapability.js.map +1 -0
- package/dist/capabilities/InstalledSkillsIntegration.d.ts +69 -0
- package/dist/capabilities/InstalledSkillsIntegration.js +240 -0
- package/dist/capabilities/InstalledSkillsIntegration.js.map +1 -0
- package/dist/capabilities/SearchCapability.d.ts +46 -0
- package/dist/capabilities/SearchCapability.js +88 -0
- package/dist/capabilities/SearchCapability.js.map +1 -0
- package/dist/capabilities/index.d.ts +6 -0
- package/dist/capabilities/index.js +9 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/capabilities/types.d.ts +92 -0
- package/dist/capabilities/types.js +7 -0
- package/dist/capabilities/types.js.map +1 -0
- package/dist/cli/autofixCommands.d.ts +22 -0
- package/dist/cli/autofixCommands.js +32 -0
- package/dist/cli/autofixCommands.js.map +1 -0
- package/dist/cli/cortexCommands.d.ts +71 -0
- package/dist/cli/cortexCommands.js +335 -0
- package/dist/cli/cortexCommands.js.map +1 -0
- package/dist/cli/costCommands.d.ts +13 -0
- package/dist/cli/costCommands.js +48 -0
- package/dist/cli/costCommands.js.map +1 -0
- package/dist/cli/evolutionCommands.d.ts +112 -0
- package/dist/cli/evolutionCommands.js +246 -0
- package/dist/cli/evolutionCommands.js.map +1 -0
- package/dist/cli/gateStatusCommands.d.ts +1 -0
- package/dist/cli/gateStatusCommands.js +52 -0
- package/dist/cli/gateStatusCommands.js.map +1 -0
- package/dist/cli/liteCommands.d.ts +81 -0
- package/dist/cli/liteCommands.js +148 -0
- package/dist/cli/liteCommands.js.map +1 -0
- package/dist/cli/orchCommands.d.ts +43 -0
- package/dist/cli/orchCommands.js +135 -0
- package/dist/cli/orchCommands.js.map +1 -0
- package/dist/cli/phaseCommands.d.ts +248 -0
- package/dist/cli/phaseCommands.js +1878 -0
- package/dist/cli/phaseCommands.js.map +1 -0
- package/dist/cli/promptCommands.d.ts +1 -0
- package/dist/cli/promptCommands.js +57 -0
- package/dist/cli/promptCommands.js.map +1 -0
- package/dist/cli/qaCommands.d.ts +22 -0
- package/dist/cli/qaCommands.js +84 -0
- package/dist/cli/qaCommands.js.map +1 -0
- package/dist/cli/quickstartCommands.d.ts +17 -0
- package/dist/cli/quickstartCommands.js +47 -0
- package/dist/cli/quickstartCommands.js.map +1 -0
- package/dist/cli/runCommand.d.ts +39 -0
- package/dist/cli/runCommand.js +113 -0
- package/dist/cli/runCommand.js.map +1 -0
- package/dist/cli/scoreCommands.d.ts +1 -0
- package/dist/cli/scoreCommands.js +112 -0
- package/dist/cli/scoreCommands.js.map +1 -0
- package/dist/cli/shieldCommands.d.ts +30 -0
- package/dist/cli/shieldCommands.js +212 -0
- package/dist/cli/shieldCommands.js.map +1 -0
- package/dist/cli/targetCommands.d.ts +552 -0
- package/dist/cli/targetCommands.js +3173 -0
- package/dist/cli/targetCommands.js.map +1 -0
- package/dist/cli/tuiCommands.d.ts +7 -0
- package/dist/cli/tuiCommands.js +33 -0
- package/dist/cli/tuiCommands.js.map +1 -0
- package/dist/cli/vibeCommands.d.ts +64 -0
- package/dist/cli/vibeCommands.js +221 -0
- package/dist/cli/vibeCommands.js.map +1 -0
- package/dist/codegraph/CodeIntelligence.d.ts +147 -0
- package/dist/codegraph/CodeIntelligence.js +681 -0
- package/dist/codegraph/CodeIntelligence.js.map +1 -0
- package/dist/config/profiles.d.ts +64 -0
- package/dist/config/profiles.js +223 -0
- package/dist/config/profiles.js.map +1 -0
- package/dist/context/AntiPatternRegistry.d.ts +38 -0
- package/dist/context/AntiPatternRegistry.js +203 -0
- package/dist/context/AntiPatternRegistry.js.map +1 -0
- package/dist/context/CavemanCompressor.d.ts +20 -0
- package/dist/context/CavemanCompressor.js +14 -0
- package/dist/context/CavemanCompressor.js.map +1 -0
- package/dist/context/ContextBudget.d.ts +128 -0
- package/dist/context/ContextBudget.js +423 -0
- package/dist/context/ContextBudget.js.map +1 -0
- package/dist/context/ContextBuilder.d.ts +71 -0
- package/dist/context/ContextBuilder.js +372 -0
- package/dist/context/ContextBuilder.js.map +1 -0
- package/dist/context/ContextCompiler.d.ts +34 -0
- package/dist/context/ContextCompiler.js +120 -0
- package/dist/context/ContextCompiler.js.map +1 -0
- package/dist/context/ProjectAnatomy.d.ts +18 -0
- package/dist/context/ProjectAnatomy.js +287 -0
- package/dist/context/ProjectAnatomy.js.map +1 -0
- package/dist/context/SessionStartSequence.d.ts +54 -0
- package/dist/context/SessionStartSequence.js +162 -0
- package/dist/context/SessionStartSequence.js.map +1 -0
- package/dist/core/ExternalCommand.d.ts +9 -0
- package/dist/core/ExternalCommand.js +70 -0
- package/dist/core/ExternalCommand.js.map +1 -0
- package/dist/core/GbrainRuntime.d.ts +25 -0
- package/dist/core/GbrainRuntime.js +270 -0
- package/dist/core/GbrainRuntime.js.map +1 -0
- package/dist/core/container.d.ts +14 -0
- package/dist/core/container.js +35 -0
- package/dist/core/container.js.map +1 -0
- package/dist/core/eventBus.d.ts +60 -0
- package/dist/core/eventBus.js +157 -0
- package/dist/core/eventBus.js.map +1 -0
- package/dist/core/logger.d.ts +5 -0
- package/dist/core/logger.js +51 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/cortex/GovernanceMetrics.d.ts +66 -0
- package/dist/cortex/GovernanceMetrics.js +230 -0
- package/dist/cortex/GovernanceMetrics.js.map +1 -0
- package/dist/cortex/InstinctExtractor.d.ts +61 -0
- package/dist/cortex/InstinctExtractor.js +184 -0
- package/dist/cortex/InstinctExtractor.js.map +1 -0
- package/dist/cortex/InstinctStore.d.ts +54 -0
- package/dist/cortex/InstinctStore.js +266 -0
- package/dist/cortex/InstinctStore.js.map +1 -0
- package/dist/cortex/ReflexionEngine.d.ts +34 -0
- package/dist/cortex/ReflexionEngine.js +157 -0
- package/dist/cortex/ReflexionEngine.js.map +1 -0
- package/dist/cortex/SessionInjector.d.ts +44 -0
- package/dist/cortex/SessionInjector.js +127 -0
- package/dist/cortex/SessionInjector.js.map +1 -0
- package/dist/cortex/adapters/ClaudeAdapter.d.ts +17 -0
- package/dist/cortex/adapters/ClaudeAdapter.js +61 -0
- package/dist/cortex/adapters/ClaudeAdapter.js.map +1 -0
- package/dist/cortex/adapters/CodexAdapter.d.ts +10 -0
- package/dist/cortex/adapters/CodexAdapter.js +52 -0
- package/dist/cortex/adapters/CodexAdapter.js.map +1 -0
- package/dist/cortex/adapters/CursorAdapter.d.ts +10 -0
- package/dist/cortex/adapters/CursorAdapter.js +46 -0
- package/dist/cortex/adapters/CursorAdapter.js.map +1 -0
- package/dist/cortex/adapters/GeminiAdapter.d.ts +11 -0
- package/dist/cortex/adapters/GeminiAdapter.js +48 -0
- package/dist/cortex/adapters/GeminiAdapter.js.map +1 -0
- package/dist/dashboard/DashboardServer.d.ts +86 -0
- package/dist/dashboard/DashboardServer.js +380 -0
- package/dist/dashboard/DashboardServer.js.map +1 -0
- package/dist/dashboard/MedicalWorkflowData.d.ts +155 -0
- package/dist/dashboard/MedicalWorkflowData.js +664 -0
- package/dist/dashboard/MedicalWorkflowData.js.map +1 -0
- package/dist/dashboard/MetricsAggregator.d.ts +38 -0
- package/dist/dashboard/MetricsAggregator.js +99 -0
- package/dist/dashboard/MetricsAggregator.js.map +1 -0
- package/dist/dashboard/index.d.ts +4 -0
- package/dist/dashboard/index.js +3 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/server.d.ts +52 -0
- package/dist/dashboard/server.js +84 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/env/EnvironmentDoctor.d.ts +66 -0
- package/dist/env/EnvironmentDoctor.js +581 -0
- package/dist/env/EnvironmentDoctor.js.map +1 -0
- package/dist/eval/BenchmarkPublisher.d.ts +25 -0
- package/dist/eval/BenchmarkPublisher.js +27 -0
- package/dist/eval/BenchmarkPublisher.js.map +1 -0
- package/dist/eval/WorkflowEval.d.ts +161 -0
- package/dist/eval/WorkflowEval.js +377 -0
- package/dist/eval/WorkflowEval.js.map +1 -0
- package/dist/evolution/AutoDefectCreator.d.ts +43 -0
- package/dist/evolution/AutoDefectCreator.js +157 -0
- package/dist/evolution/AutoDefectCreator.js.map +1 -0
- package/dist/evolution/BehaviorTracker.d.ts +46 -0
- package/dist/evolution/BehaviorTracker.js +67 -0
- package/dist/evolution/BehaviorTracker.js.map +1 -0
- package/dist/evolution/EvolutionEngine.d.ts +102 -0
- package/dist/evolution/EvolutionEngine.js +326 -0
- package/dist/evolution/EvolutionEngine.js.map +1 -0
- package/dist/evolution/EvolutionEvaluator.d.ts +61 -0
- package/dist/evolution/EvolutionEvaluator.js +118 -0
- package/dist/evolution/EvolutionEvaluator.js.map +1 -0
- package/dist/evolution/LessonValidator.d.ts +36 -0
- package/dist/evolution/LessonValidator.js +132 -0
- package/dist/evolution/LessonValidator.js.map +1 -0
- package/dist/evolution/PatternExtractor.d.ts +40 -0
- package/dist/evolution/PatternExtractor.js +83 -0
- package/dist/evolution/PatternExtractor.js.map +1 -0
- package/dist/evolution/RuleMaturity.d.ts +39 -0
- package/dist/evolution/RuleMaturity.js +70 -0
- package/dist/evolution/RuleMaturity.js.map +1 -0
- package/dist/evolution/SessionLearnings.d.ts +70 -0
- package/dist/evolution/SessionLearnings.js +217 -0
- package/dist/evolution/SessionLearnings.js.map +1 -0
- package/dist/evolution/SkillCreator.d.ts +75 -0
- package/dist/evolution/SkillCreator.js +219 -0
- package/dist/evolution/SkillCreator.js.map +1 -0
- package/dist/fsm/FSMAgentBridge.d.ts +59 -0
- package/dist/fsm/FSMAgentBridge.js +193 -0
- package/dist/fsm/FSMAgentBridge.js.map +1 -0
- package/dist/fsm/index.d.ts +2 -0
- package/dist/fsm/index.js +3 -0
- package/dist/fsm/index.js.map +1 -0
- package/dist/governance/GovernanceRoi.d.ts +30 -0
- package/dist/governance/GovernanceRoi.js +102 -0
- package/dist/governance/GovernanceRoi.js.map +1 -0
- package/dist/governance/ProgressiveGovernance.d.ts +22 -0
- package/dist/governance/ProgressiveGovernance.js +159 -0
- package/dist/governance/ProgressiveGovernance.js.map +1 -0
- package/dist/guardrails/ActiveRedTeam.d.ts +46 -0
- package/dist/guardrails/ActiveRedTeam.js +203 -0
- package/dist/guardrails/ActiveRedTeam.js.map +1 -0
- package/dist/guardrails/DependencyAuditor.d.ts +68 -0
- package/dist/guardrails/DependencyAuditor.js +378 -0
- package/dist/guardrails/DependencyAuditor.js.map +1 -0
- package/dist/guardrails/DetectorEnhanced.d.ts +111 -0
- package/dist/guardrails/DetectorEnhanced.js +202 -0
- package/dist/guardrails/DetectorEnhanced.js.map +1 -0
- package/dist/guardrails/GateEvaluator.d.ts +18 -0
- package/dist/guardrails/GateEvaluator.js +129 -0
- package/dist/guardrails/GateEvaluator.js.map +1 -0
- package/dist/guardrails/Gateway.d.ts +26 -0
- package/dist/guardrails/Gateway.js +56 -0
- package/dist/guardrails/Gateway.js.map +1 -0
- package/dist/guardrails/OWASPDetector.d.ts +58 -0
- package/dist/guardrails/OWASPDetector.js +508 -0
- package/dist/guardrails/OWASPDetector.js.map +1 -0
- package/dist/guardrails/ReviewEnforcer.d.ts +52 -0
- package/dist/guardrails/ReviewEnforcer.js +117 -0
- package/dist/guardrails/ReviewEnforcer.js.map +1 -0
- package/dist/guardrails/advancedDetectors.d.ts +38 -0
- package/dist/guardrails/advancedDetectors.js +188 -0
- package/dist/guardrails/advancedDetectors.js.map +1 -0
- package/dist/guardrails/detectors.d.ts +34 -0
- package/dist/guardrails/detectors.js +332 -0
- package/dist/guardrails/detectors.js.map +1 -0
- package/dist/guardrails/roles.d.ts +4 -0
- package/dist/guardrails/roles.js +54 -0
- package/dist/guardrails/roles.js.map +1 -0
- package/dist/hooks/BugPatternDetector.d.ts +36 -0
- package/dist/hooks/BugPatternDetector.js +207 -0
- package/dist/hooks/BugPatternDetector.js.map +1 -0
- package/dist/hooks/HookDeployer.d.ts +44 -0
- package/dist/hooks/HookDeployer.js +144 -0
- package/dist/hooks/HookDeployer.js.map +1 -0
- package/dist/hooks/HookGeneratorEnhanced.d.ts +67 -0
- package/dist/hooks/HookGeneratorEnhanced.js +641 -0
- package/dist/hooks/HookGeneratorEnhanced.js.map +1 -0
- package/dist/hooks/WorkflowHooksManager.d.ts +30 -0
- package/dist/hooks/WorkflowHooksManager.js +160 -0
- package/dist/hooks/WorkflowHooksManager.js.map +1 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.js +5 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/i18n/Language.d.ts +9 -0
- package/dist/i18n/Language.js +38 -0
- package/dist/i18n/Language.js.map +1 -0
- package/dist/index.d.ts +101 -0
- package/dist/index.js +104 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/CerebrumManager.d.ts +25 -0
- package/dist/knowledge/CerebrumManager.js +127 -0
- package/dist/knowledge/CerebrumManager.js.map +1 -0
- package/dist/knowledge/GraphifyKnowledgeBase.d.ts +38 -0
- package/dist/knowledge/GraphifyKnowledgeBase.js +409 -0
- package/dist/knowledge/GraphifyKnowledgeBase.js.map +1 -0
- package/dist/knowledge/KnowledgeBase.d.ts +51 -0
- package/dist/knowledge/KnowledgeBase.js +182 -0
- package/dist/knowledge/KnowledgeBase.js.map +1 -0
- package/dist/knowledge/SQLiteKnowledgeBase.d.ts +29 -0
- package/dist/knowledge/SQLiteKnowledgeBase.js +203 -0
- package/dist/knowledge/SQLiteKnowledgeBase.js.map +1 -0
- package/dist/knowledge/TfidfIndex.d.ts +50 -0
- package/dist/knowledge/TfidfIndex.js +177 -0
- package/dist/knowledge/TfidfIndex.js.map +1 -0
- package/dist/knowledge/UbiquitousLanguageManager.d.ts +49 -0
- package/dist/knowledge/UbiquitousLanguageManager.js +133 -0
- package/dist/knowledge/UbiquitousLanguageManager.js.map +1 -0
- package/dist/memory/MemoryBrain.d.ts +146 -0
- package/dist/memory/MemoryBrain.js +679 -0
- package/dist/memory/MemoryBrain.js.map +1 -0
- package/dist/memory/MemoryFabric.d.ts +130 -0
- package/dist/memory/MemoryFabric.js +317 -0
- package/dist/memory/MemoryFabric.js.map +1 -0
- package/dist/memory/MemoryIntelligence.d.ts +42 -0
- package/dist/memory/MemoryIntelligence.js +215 -0
- package/dist/memory/MemoryIntelligence.js.map +1 -0
- package/dist/memory/MemoryLearning.d.ts +62 -0
- package/dist/memory/MemoryLearning.js +209 -0
- package/dist/memory/MemoryLearning.js.map +1 -0
- package/dist/memory/MemoryProviders.d.ts +165 -0
- package/dist/memory/MemoryProviders.js +940 -0
- package/dist/memory/MemoryProviders.js.map +1 -0
- package/dist/memory/MemoryReview.d.ts +65 -0
- package/dist/memory/MemoryReview.js +260 -0
- package/dist/memory/MemoryReview.js.map +1 -0
- package/dist/memory/index.d.ts +6 -0
- package/dist/memory/index.js +7 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/orchestration/EffectsWiring.d.ts +8 -0
- package/dist/orchestration/EffectsWiring.js +87 -0
- package/dist/orchestration/EffectsWiring.js.map +1 -0
- package/dist/orchestrator/OrchestratorDaemon.d.ts +44 -0
- package/dist/orchestrator/OrchestratorDaemon.js +150 -0
- package/dist/orchestrator/OrchestratorDaemon.js.map +1 -0
- package/dist/orchestrator/PolicyLoader.d.ts +80 -0
- package/dist/orchestrator/PolicyLoader.js +229 -0
- package/dist/orchestrator/PolicyLoader.js.map +1 -0
- package/dist/orchestrator/ReconciliationLoop.d.ts +71 -0
- package/dist/orchestrator/ReconciliationLoop.js +266 -0
- package/dist/orchestrator/ReconciliationLoop.js.map +1 -0
- package/dist/orchestrator/TrackerAdapter.d.ts +60 -0
- package/dist/orchestrator/TrackerAdapter.js +147 -0
- package/dist/orchestrator/TrackerAdapter.js.map +1 -0
- package/dist/orchestrator/WorkspaceManager.d.ts +66 -0
- package/dist/orchestrator/WorkspaceManager.js +257 -0
- package/dist/orchestrator/WorkspaceManager.js.map +1 -0
- package/dist/output/BrandThemeLoader.d.ts +54 -0
- package/dist/output/BrandThemeLoader.js +340 -0
- package/dist/output/BrandThemeLoader.js.map +1 -0
- package/dist/output/GovernanceDashboard.d.ts +59 -0
- package/dist/output/GovernanceDashboard.js +281 -0
- package/dist/output/GovernanceDashboard.js.map +1 -0
- package/dist/output/HTMLArtifactLayer.d.ts +97 -0
- package/dist/output/HTMLArtifactLayer.js +576 -0
- package/dist/output/HTMLArtifactLayer.js.map +1 -0
- package/dist/output/HTMLDocumentRenderer.d.ts +83 -0
- package/dist/output/HTMLDocumentRenderer.js +718 -0
- package/dist/output/HTMLDocumentRenderer.js.map +1 -0
- package/dist/output/UIPrototypeRenderer.d.ts +61 -0
- package/dist/output/UIPrototypeRenderer.js +500 -0
- package/dist/output/UIPrototypeRenderer.js.map +1 -0
- package/dist/output/index.d.ts +10 -0
- package/dist/output/index.js +8 -0
- package/dist/output/index.js.map +1 -0
- package/dist/prompts/PhasePromptRegistry.d.ts +53 -0
- package/dist/prompts/PhasePromptRegistry.js +517 -0
- package/dist/prompts/PhasePromptRegistry.js.map +1 -0
- package/dist/prompts/PromptOptimizer.d.ts +42 -0
- package/dist/prompts/PromptOptimizer.js +309 -0
- package/dist/prompts/PromptOptimizer.js.map +1 -0
- package/dist/prompts/VibeTemplateGallery.d.ts +25 -0
- package/dist/prompts/VibeTemplateGallery.js +295 -0
- package/dist/prompts/VibeTemplateGallery.js.map +1 -0
- package/dist/qa/BrowserDaemon.d.ts +23 -0
- package/dist/qa/BrowserDaemon.js +79 -0
- package/dist/qa/BrowserDaemon.js.map +1 -0
- package/dist/qa/E2ETestOrchestrator.d.ts +14 -0
- package/dist/qa/E2ETestOrchestrator.js +19 -0
- package/dist/qa/E2ETestOrchestrator.js.map +1 -0
- package/dist/review/CrossModelReviewer.d.ts +35 -0
- package/dist/review/CrossModelReviewer.js +75 -0
- package/dist/review/CrossModelReviewer.js.map +1 -0
- package/dist/review/ReviewAggregator.d.ts +13 -0
- package/dist/review/ReviewAggregator.js +28 -0
- package/dist/review/ReviewAggregator.js.map +1 -0
- package/dist/review/reviewCommands.d.ts +15 -0
- package/dist/review/reviewCommands.js +24 -0
- package/dist/review/reviewCommands.js.map +1 -0
- package/dist/routing/LocalModelProvider.d.ts +11 -0
- package/dist/routing/LocalModelProvider.js +21 -0
- package/dist/routing/LocalModelProvider.js.map +1 -0
- package/dist/routing/ModelRouter.d.ts +42 -0
- package/dist/routing/ModelRouter.js +94 -0
- package/dist/routing/ModelRouter.js.map +1 -0
- package/dist/routing/PromptCachePolicy.d.ts +37 -0
- package/dist/routing/PromptCachePolicy.js +97 -0
- package/dist/routing/PromptCachePolicy.js.map +1 -0
- package/dist/runtime/AiOsRuntime.d.ts +485 -0
- package/dist/runtime/AiOsRuntime.js +1846 -0
- package/dist/runtime/AiOsRuntime.js.map +1 -0
- package/dist/runtime/CostAnalyzer.d.ts +53 -0
- package/dist/runtime/CostAnalyzer.js +160 -0
- package/dist/runtime/CostAnalyzer.js.map +1 -0
- package/dist/runtime/CostOptimizer.d.ts +11 -0
- package/dist/runtime/CostOptimizer.js +21 -0
- package/dist/runtime/CostOptimizer.js.map +1 -0
- package/dist/runtime/ExecutionLedger.d.ts +46 -0
- package/dist/runtime/ExecutionLedger.js +71 -0
- package/dist/runtime/ExecutionLedger.js.map +1 -0
- package/dist/runtime/FinalReportGuard.d.ts +16 -0
- package/dist/runtime/FinalReportGuard.js +14 -0
- package/dist/runtime/FinalReportGuard.js.map +1 -0
- package/dist/runtime/ModelUsageLedger.d.ts +101 -0
- package/dist/runtime/ModelUsageLedger.js +296 -0
- package/dist/runtime/ModelUsageLedger.js.map +1 -0
- package/dist/runtime/RuntimeDoctor.d.ts +23 -0
- package/dist/runtime/RuntimeDoctor.js +151 -0
- package/dist/runtime/RuntimeDoctor.js.map +1 -0
- package/dist/runtime/RuntimeEvidenceLedger.d.ts +50 -0
- package/dist/runtime/RuntimeEvidenceLedger.js +89 -0
- package/dist/runtime/RuntimeEvidenceLedger.js.map +1 -0
- package/dist/runtime/SessionLedger.d.ts +53 -0
- package/dist/runtime/SessionLedger.js +104 -0
- package/dist/runtime/SessionLedger.js.map +1 -0
- package/dist/runtime/index.d.ts +7 -0
- package/dist/runtime/index.js +8 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/setup/SetupVerification.d.ts +42 -0
- package/dist/setup/SetupVerification.js +180 -0
- package/dist/setup/SetupVerification.js.map +1 -0
- package/dist/setup/SetupWizard.d.ts +45 -0
- package/dist/setup/SetupWizard.js +216 -0
- package/dist/setup/SetupWizard.js.map +1 -0
- package/dist/shield/PolicyCompiler.d.ts +70 -0
- package/dist/shield/PolicyCompiler.js +540 -0
- package/dist/shield/PolicyCompiler.js.map +1 -0
- package/dist/shield/ProtectedPaths.d.ts +39 -0
- package/dist/shield/ProtectedPaths.js +179 -0
- package/dist/shield/ProtectedPaths.js.map +1 -0
- package/dist/shield/ShieldProtocol.d.ts +50 -0
- package/dist/shield/ShieldProtocol.js +103 -0
- package/dist/shield/ShieldProtocol.js.map +1 -0
- package/dist/skills/ExternalSkills.d.ts +3 -0
- package/dist/skills/ExternalSkills.js +27 -0
- package/dist/skills/ExternalSkills.js.map +1 -0
- package/dist/skills/GrillingSessionSkill.d.ts +65 -0
- package/dist/skills/GrillingSessionSkill.js +113 -0
- package/dist/skills/GrillingSessionSkill.js.map +1 -0
- package/dist/skills/GrillingTemplates.d.ts +7 -0
- package/dist/skills/GrillingTemplates.js +38 -0
- package/dist/skills/GrillingTemplates.js.map +1 -0
- package/dist/skills/RoleSkills.d.ts +20 -0
- package/dist/skills/RoleSkills.js +154 -0
- package/dist/skills/RoleSkills.js.map +1 -0
- package/dist/skills/SkillCatalog.d.ts +13 -0
- package/dist/skills/SkillCatalog.js +184 -0
- package/dist/skills/SkillCatalog.js.map +1 -0
- package/dist/skills/SkillDiscovery.d.ts +84 -0
- package/dist/skills/SkillDiscovery.js +402 -0
- package/dist/skills/SkillDiscovery.js.map +1 -0
- package/dist/skills/SkillDoctor.d.ts +37 -0
- package/dist/skills/SkillDoctor.js +267 -0
- package/dist/skills/SkillDoctor.js.map +1 -0
- package/dist/skills/SkillExecutor.d.ts +38 -0
- package/dist/skills/SkillExecutor.js +237 -0
- package/dist/skills/SkillExecutor.js.map +1 -0
- package/dist/skills/SkillFrontmatter.d.ts +28 -0
- package/dist/skills/SkillFrontmatter.js +152 -0
- package/dist/skills/SkillFrontmatter.js.map +1 -0
- package/dist/skills/SkillInstaller.d.ts +40 -0
- package/dist/skills/SkillInstaller.js +117 -0
- package/dist/skills/SkillInstaller.js.map +1 -0
- package/dist/skills/SkillMdStandard.d.ts +33 -0
- package/dist/skills/SkillMdStandard.js +88 -0
- package/dist/skills/SkillMdStandard.js.map +1 -0
- package/dist/skills/SkillRadar.d.ts +83 -0
- package/dist/skills/SkillRadar.js +404 -0
- package/dist/skills/SkillRadar.js.map +1 -0
- package/dist/skills/SkillRegistry.d.ts +112 -0
- package/dist/skills/SkillRegistry.js +161 -0
- package/dist/skills/SkillRegistry.js.map +1 -0
- package/dist/skills/SkillRepository.d.ts +71 -0
- package/dist/skills/SkillRepository.js +435 -0
- package/dist/skills/SkillRepository.js.map +1 -0
- package/dist/skills/TriggerEngine.d.ts +43 -0
- package/dist/skills/TriggerEngine.js +142 -0
- package/dist/skills/TriggerEngine.js.map +1 -0
- package/dist/skills/coreSkills.d.ts +6 -0
- package/dist/skills/coreSkills.js +41 -0
- package/dist/skills/coreSkills.js.map +1 -0
- package/dist/skills/index.d.ts +10 -0
- package/dist/skills/index.js +12 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/interop/GStackInterop.d.ts +15 -0
- package/dist/skills/interop/GStackInterop.js +34 -0
- package/dist/skills/interop/GStackInterop.js.map +1 -0
- package/dist/skills/interop/OMCInterop.d.ts +15 -0
- package/dist/skills/interop/OMCInterop.js +34 -0
- package/dist/skills/interop/OMCInterop.js.map +1 -0
- package/dist/skills/routing/SkillGate.d.ts +12 -0
- package/dist/skills/routing/SkillGate.js +117 -0
- package/dist/skills/routing/SkillGate.js.map +1 -0
- package/dist/skills/routing/SkillPlanner.d.ts +8 -0
- package/dist/skills/routing/SkillPlanner.js +179 -0
- package/dist/skills/routing/SkillPlanner.js.map +1 -0
- package/dist/skills/routing/SkillPolicy.d.ts +6 -0
- package/dist/skills/routing/SkillPolicy.js +336 -0
- package/dist/skills/routing/SkillPolicy.js.map +1 -0
- package/dist/skills/routing/SkillRoutingTypes.d.ts +89 -0
- package/dist/skills/routing/SkillRoutingTypes.js +2 -0
- package/dist/skills/routing/SkillRoutingTypes.js.map +1 -0
- package/dist/skills/routing/TaskIntentClassifier.d.ts +6 -0
- package/dist/skills/routing/TaskIntentClassifier.js +79 -0
- package/dist/skills/routing/TaskIntentClassifier.js.map +1 -0
- package/dist/skills/routing/index.d.ts +5 -0
- package/dist/skills/routing/index.js +6 -0
- package/dist/skills/routing/index.js.map +1 -0
- package/dist/tasks/IssueTriageFSM.d.ts +26 -0
- package/dist/tasks/IssueTriageFSM.js +107 -0
- package/dist/tasks/IssueTriageFSM.js.map +1 -0
- package/dist/tasks/TaskEngine.d.ts +97 -0
- package/dist/tasks/TaskEngine.js +289 -0
- package/dist/tasks/TaskEngine.js.map +1 -0
- package/dist/testing/DiffTestSelector.d.ts +22 -0
- package/dist/testing/DiffTestSelector.js +114 -0
- package/dist/testing/DiffTestSelector.js.map +1 -0
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.js +3 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tools/CommandOutputCompressor.d.ts +28 -0
- package/dist/tools/CommandOutputCompressor.js +242 -0
- package/dist/tools/CommandOutputCompressor.js.map +1 -0
- package/dist/tools/CommandRunLedger.d.ts +77 -0
- package/dist/tools/CommandRunLedger.js +111 -0
- package/dist/tools/CommandRunLedger.js.map +1 -0
- package/dist/tools/RtkRuntime.d.ts +9 -0
- package/dist/tools/RtkRuntime.js +43 -0
- package/dist/tools/RtkRuntime.js.map +1 -0
- package/dist/tools/SafeCommandRunner.d.ts +16 -0
- package/dist/tools/SafeCommandRunner.js +83 -0
- package/dist/tools/SafeCommandRunner.js.map +1 -0
- package/dist/tools/ToolCapabilityRegistry.d.ts +51 -0
- package/dist/tools/ToolCapabilityRegistry.js +295 -0
- package/dist/tools/ToolCapabilityRegistry.js.map +1 -0
- package/dist/tools/ToolEvidenceGate.d.ts +39 -0
- package/dist/tools/ToolEvidenceGate.js +117 -0
- package/dist/tools/ToolEvidenceGate.js.map +1 -0
- package/dist/tools/ToolEvidenceStore.d.ts +58 -0
- package/dist/tools/ToolEvidenceStore.js +129 -0
- package/dist/tools/ToolEvidenceStore.js.map +1 -0
- package/dist/tools/ToolOrchestrator.d.ts +67 -0
- package/dist/tools/ToolOrchestrator.js +252 -0
- package/dist/tools/ToolOrchestrator.js.map +1 -0
- package/dist/tools/ToolPolicy.d.ts +33 -0
- package/dist/tools/ToolPolicy.js +172 -0
- package/dist/tools/ToolPolicy.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tui/TuiDashboard.d.ts +3 -0
- package/dist/tui/TuiDashboard.js +120 -0
- package/dist/tui/TuiDashboard.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.js +15 -0
- package/dist/version.js.map +1 -0
- package/dist/workflow/AdaptiveWorkflowRouter.d.ts +38 -0
- package/dist/workflow/AdaptiveWorkflowRouter.js +214 -0
- package/dist/workflow/AdaptiveWorkflowRouter.js.map +1 -0
- package/dist/workflow/CommitDiscipline.d.ts +68 -0
- package/dist/workflow/CommitDiscipline.js +328 -0
- package/dist/workflow/CommitDiscipline.js.map +1 -0
- package/dist/workflow/ContextGovernance.d.ts +51 -0
- package/dist/workflow/ContextGovernance.js +233 -0
- package/dist/workflow/ContextGovernance.js.map +1 -0
- package/dist/workflow/CrossRepoOrchestrator.d.ts +92 -0
- package/dist/workflow/CrossRepoOrchestrator.js +408 -0
- package/dist/workflow/CrossRepoOrchestrator.js.map +1 -0
- package/dist/workflow/DiagnosticLoop.d.ts +40 -0
- package/dist/workflow/DiagnosticLoop.js +105 -0
- package/dist/workflow/DiagnosticLoop.js.map +1 -0
- package/dist/workflow/EngineeringStandards.d.ts +212 -0
- package/dist/workflow/EngineeringStandards.js +1113 -0
- package/dist/workflow/EngineeringStandards.js.map +1 -0
- package/dist/workflow/EvidenceStore.d.ts +20 -0
- package/dist/workflow/EvidenceStore.js +48 -0
- package/dist/workflow/EvidenceStore.js.map +1 -0
- package/dist/workflow/EvolutionShadowPromoter.d.ts +46 -0
- package/dist/workflow/EvolutionShadowPromoter.js +73 -0
- package/dist/workflow/EvolutionShadowPromoter.js.map +1 -0
- package/dist/workflow/GateCatalog.d.ts +63 -0
- package/dist/workflow/GateCatalog.js +268 -0
- package/dist/workflow/GateCatalog.js.map +1 -0
- package/dist/workflow/GovernanceLock.d.ts +35 -0
- package/dist/workflow/GovernanceLock.js +58 -0
- package/dist/workflow/GovernanceLock.js.map +1 -0
- package/dist/workflow/GovernanceRoi.d.ts +52 -0
- package/dist/workflow/GovernanceRoi.js +204 -0
- package/dist/workflow/GovernanceRoi.js.map +1 -0
- package/dist/workflow/GovernanceTemplatePacks.d.ts +24 -0
- package/dist/workflow/GovernanceTemplatePacks.js +2134 -0
- package/dist/workflow/GovernanceTemplatePacks.js.map +1 -0
- package/dist/workflow/GovernanceTemplates.d.ts +19 -0
- package/dist/workflow/GovernanceTemplates.js +1291 -0
- package/dist/workflow/GovernanceTemplates.js.map +1 -0
- package/dist/workflow/McpGovernance.d.ts +63 -0
- package/dist/workflow/McpGovernance.js +198 -0
- package/dist/workflow/McpGovernance.js.map +1 -0
- package/dist/workflow/OutOfScopeStore.d.ts +37 -0
- package/dist/workflow/OutOfScopeStore.js +164 -0
- package/dist/workflow/OutOfScopeStore.js.map +1 -0
- package/dist/workflow/PhaseMarkerTracker.d.ts +63 -0
- package/dist/workflow/PhaseMarkerTracker.js +291 -0
- package/dist/workflow/PhaseMarkerTracker.js.map +1 -0
- package/dist/workflow/ResourceGovernance.d.ts +120 -0
- package/dist/workflow/ResourceGovernance.js +531 -0
- package/dist/workflow/ResourceGovernance.js.map +1 -0
- package/dist/workflow/ReviewAnalyzer.d.ts +80 -0
- package/dist/workflow/ReviewAnalyzer.js +438 -0
- package/dist/workflow/ReviewAnalyzer.js.map +1 -0
- package/dist/workflow/ReviewStore.d.ts +36 -0
- package/dist/workflow/ReviewStore.js +42 -0
- package/dist/workflow/ReviewStore.js.map +1 -0
- package/dist/workflow/SecurityAudit.d.ts +27 -0
- package/dist/workflow/SecurityAudit.js +294 -0
- package/dist/workflow/SecurityAudit.js.map +1 -0
- package/dist/workflow/SessionCoordinator.d.ts +103 -0
- package/dist/workflow/SessionCoordinator.js +401 -0
- package/dist/workflow/SessionCoordinator.js.map +1 -0
- package/dist/workflow/SessionPreamble.d.ts +19 -0
- package/dist/workflow/SessionPreamble.js +130 -0
- package/dist/workflow/SessionPreamble.js.map +1 -0
- package/dist/workflow/SessionStateTracker.d.ts +74 -0
- package/dist/workflow/SessionStateTracker.js +270 -0
- package/dist/workflow/SessionStateTracker.js.map +1 -0
- package/dist/workflow/ShipPipeline.d.ts +30 -0
- package/dist/workflow/ShipPipeline.js +366 -0
- package/dist/workflow/ShipPipeline.js.map +1 -0
- package/dist/workflow/TaskArtifactScaffolder.d.ts +69 -0
- package/dist/workflow/TaskArtifactScaffolder.js +333 -0
- package/dist/workflow/TaskArtifactScaffolder.js.map +1 -0
- package/dist/workflow/TaskDependencyGraph.d.ts +73 -0
- package/dist/workflow/TaskDependencyGraph.js +245 -0
- package/dist/workflow/TaskDependencyGraph.js.map +1 -0
- package/dist/workflow/TaskLevelDetector.d.ts +41 -0
- package/dist/workflow/TaskLevelDetector.js +219 -0
- package/dist/workflow/TaskLevelDetector.js.map +1 -0
- package/dist/workflow/TaskMetricsStore.d.ts +49 -0
- package/dist/workflow/TaskMetricsStore.js +149 -0
- package/dist/workflow/TaskMetricsStore.js.map +1 -0
- package/dist/workflow/TaskScoreEngine.d.ts +42 -0
- package/dist/workflow/TaskScoreEngine.js +181 -0
- package/dist/workflow/TaskScoreEngine.js.map +1 -0
- package/dist/workflow/TddLoop.d.ts +49 -0
- package/dist/workflow/TddLoop.js +78 -0
- package/dist/workflow/TddLoop.js.map +1 -0
- package/dist/workflow/UpgradeManager.d.ts +178 -0
- package/dist/workflow/UpgradeManager.js +665 -0
- package/dist/workflow/UpgradeManager.js.map +1 -0
- package/dist/workflow/VerificationCommands.d.ts +36 -0
- package/dist/workflow/VerificationCommands.js +123 -0
- package/dist/workflow/VerificationCommands.js.map +1 -0
- package/dist/workflow/VerificationProfile.d.ts +67 -0
- package/dist/workflow/VerificationProfile.js +241 -0
- package/dist/workflow/VerificationProfile.js.map +1 -0
- package/dist/workflow/VerificationSchema.d.ts +46 -0
- package/dist/workflow/VerificationSchema.js +97 -0
- package/dist/workflow/VerificationSchema.js.map +1 -0
- package/dist/workflow/WorkflowArtifactWriter.d.ts +113 -0
- package/dist/workflow/WorkflowArtifactWriter.js +242 -0
- package/dist/workflow/WorkflowArtifactWriter.js.map +1 -0
- package/dist/workflow/WorkflowEngine.d.ts +83 -0
- package/dist/workflow/WorkflowEngine.js +183 -0
- package/dist/workflow/WorkflowEngine.js.map +1 -0
- package/dist/workflow/WorkflowGuidance.d.ts +30 -0
- package/dist/workflow/WorkflowGuidance.js +204 -0
- package/dist/workflow/WorkflowGuidance.js.map +1 -0
- package/dist/workflow/WorkflowOpenTasks.d.ts +16 -0
- package/dist/workflow/WorkflowOpenTasks.js +37 -0
- package/dist/workflow/WorkflowOpenTasks.js.map +1 -0
- package/dist/workflow/WorkflowOrchestrator.d.ts +59 -0
- package/dist/workflow/WorkflowOrchestrator.js +326 -0
- package/dist/workflow/WorkflowOrchestrator.js.map +1 -0
- package/dist/workflow/WorkflowTemplates.d.ts +38 -0
- package/dist/workflow/WorkflowTemplates.js +371 -0
- package/dist/workflow/WorkflowTemplates.js.map +1 -0
- package/dist/workflow/WorkspaceLifecycle.d.ts +71 -0
- package/dist/workflow/WorkspaceLifecycle.js +401 -0
- package/dist/workflow/WorkspaceLifecycle.js.map +1 -0
- package/dist/workflow/WorkspacePolicy.d.ts +46 -0
- package/dist/workflow/WorkspacePolicy.js +141 -0
- package/dist/workflow/WorkspacePolicy.js.map +1 -0
- package/dist/workflow/WorkspaceSafety.d.ts +9 -0
- package/dist/workflow/WorkspaceSafety.js +49 -0
- package/dist/workflow/WorkspaceSafety.js.map +1 -0
- package/dist/workflow/WorkspaceTopology.d.ts +58 -0
- package/dist/workflow/WorkspaceTopology.js +176 -0
- package/dist/workflow/WorkspaceTopology.js.map +1 -0
- package/dist/workflow/autofix/AutoFixEngine.d.ts +37 -0
- package/dist/workflow/autofix/AutoFixEngine.js +169 -0
- package/dist/workflow/autofix/AutoFixEngine.js.map +1 -0
- package/dist/workflow/autonomous/AutonomousDevLoop.d.ts +88 -0
- package/dist/workflow/autonomous/AutonomousDevLoop.js +381 -0
- package/dist/workflow/autonomous/AutonomousDevLoop.js.map +1 -0
- package/dist/workflow/autonomous/BackgroundHunter.d.ts +74 -0
- package/dist/workflow/autonomous/BackgroundHunter.js +220 -0
- package/dist/workflow/autonomous/BackgroundHunter.js.map +1 -0
- package/dist/workflow/autonomous/WorklogManager.d.ts +50 -0
- package/dist/workflow/autonomous/WorklogManager.js +264 -0
- package/dist/workflow/autonomous/WorklogManager.js.map +1 -0
- package/dist/workflow/autonomous/index.d.ts +3 -0
- package/dist/workflow/autonomous/index.js +5 -0
- package/dist/workflow/autonomous/index.js.map +1 -0
- package/dist/workflow/cognitive/AmbiguityScorer.d.ts +17 -0
- package/dist/workflow/cognitive/AmbiguityScorer.js +107 -0
- package/dist/workflow/cognitive/AmbiguityScorer.js.map +1 -0
- package/dist/workflow/cognitive/ConsensusPlanner.d.ts +26 -0
- package/dist/workflow/cognitive/ConsensusPlanner.js +141 -0
- package/dist/workflow/cognitive/ConsensusPlanner.js.map +1 -0
- package/dist/workflow/cognitive/SocraticQuestioner.d.ts +33 -0
- package/dist/workflow/cognitive/SocraticQuestioner.js +276 -0
- package/dist/workflow/cognitive/SocraticQuestioner.js.map +1 -0
- package/dist/workflow/evolution/LessonExtractor.d.ts +90 -0
- package/dist/workflow/evolution/LessonExtractor.js +317 -0
- package/dist/workflow/evolution/LessonExtractor.js.map +1 -0
- package/dist/workflow/evolution/SelfImproveEngine.d.ts +156 -0
- package/dist/workflow/evolution/SelfImproveEngine.js +361 -0
- package/dist/workflow/evolution/SelfImproveEngine.js.map +1 -0
- package/dist/workflow/execution/RalphEngine.d.ts +54 -0
- package/dist/workflow/execution/RalphEngine.js +145 -0
- package/dist/workflow/execution/RalphEngine.js.map +1 -0
- package/dist/workflow/execution/UltraworkEngine.d.ts +43 -0
- package/dist/workflow/execution/UltraworkEngine.js +135 -0
- package/dist/workflow/execution/UltraworkEngine.js.map +1 -0
- package/dist/workflow/gates/EnhancedGates.d.ts +74 -0
- package/dist/workflow/gates/EnhancedGates.js +653 -0
- package/dist/workflow/gates/EnhancedGates.js.map +1 -0
- package/dist/workflow/gates/GateSystem.d.ts +180 -0
- package/dist/workflow/gates/GateSystem.js +1279 -0
- package/dist/workflow/gates/GateSystem.js.map +1 -0
- package/dist/workflow/gates/MetaGovernanceGates.d.ts +70 -0
- package/dist/workflow/gates/MetaGovernanceGates.js +617 -0
- package/dist/workflow/gates/MetaGovernanceGates.js.map +1 -0
- package/dist/workflow/gates/VisualGate.d.ts +41 -0
- package/dist/workflow/gates/VisualGate.js +174 -0
- package/dist/workflow/gates/VisualGate.js.map +1 -0
- package/dist/workflow/index.d.ts +45 -0
- package/dist/workflow/index.js +47 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/qa/E2ETestRunner.d.ts +102 -0
- package/dist/workflow/qa/E2ETestRunner.js +227 -0
- package/dist/workflow/qa/E2ETestRunner.js.map +1 -0
- package/dist/workflow/quality/HonestDelivery.d.ts +19 -0
- package/dist/workflow/quality/HonestDelivery.js +77 -0
- package/dist/workflow/quality/HonestDelivery.js.map +1 -0
- package/dist/workflow/quality/KarpathyEvaluator.d.ts +18 -0
- package/dist/workflow/quality/KarpathyEvaluator.js +76 -0
- package/dist/workflow/quality/KarpathyEvaluator.js.map +1 -0
- package/dist/workflow/types.d.ts +151 -0
- package/dist/workflow/types.js +4 -0
- package/dist/workflow/types.js.map +1 -0
- package/dist/workflows/DAGBuilder.d.ts +52 -0
- package/dist/workflows/DAGBuilder.js +169 -0
- package/dist/workflows/DAGBuilder.js.map +1 -0
- package/dist/workflows/GateParser.d.ts +55 -0
- package/dist/workflows/GateParser.js +73 -0
- package/dist/workflows/GateParser.js.map +1 -0
- package/dist/workflows/WorkflowExecutor.d.ts +56 -0
- package/dist/workflows/WorkflowExecutor.js +143 -0
- package/dist/workflows/WorkflowExecutor.js.map +1 -0
- package/dist/workflows/WorkflowOrchestrator.d.ts +81 -0
- package/dist/workflows/WorkflowOrchestrator.js +337 -0
- package/dist/workflows/WorkflowOrchestrator.js.map +1 -0
- package/dist/workflows/index.d.ts +2 -0
- package/dist/workflows/index.js +5 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/presets.d.ts +34 -0
- package/dist/workflows/presets.js +224 -0
- package/dist/workflows/presets.js.map +1 -0
- package/docs/README.md +105 -0
- package/docs/guides/DEVELOPMENT_WORKFLOW.md +99 -0
- package/docs/guides/GETTING_STARTED.md +93 -0
- package/docs/guides/MEDICAL_AGENT_OPERATING_GUIDE.md +61 -0
- package/docs/guides/MEDICAL_RESEARCH_DELIVERY.md +217 -0
- package/docs/guides/MIGRATION.md +119 -0
- package/docs/reference/cli.md +2921 -0
- package/docs/start/README.md +79 -0
- package/docs/start/agent-governance-demo.md +107 -0
- package/docs/start/artifact-lifecycle.md +326 -0
- package/docs/start/quickstart.md +191 -0
- package/docs/start/workflow-upgrade.md +198 -0
- package/docs/workflow/GATES_AND_SCORE.md +89 -0
- package/docs/workflow/PROMPT_OPTIMIZATION.md +44 -0
- package/docs/workflow/README.md +123 -0
- package/docs/workflow/node-library.md +52 -0
- package/docs/workflow/templates/api-contract.md +29 -0
- package/docs/workflow/templates/architecture-review.md +23 -0
- package/docs/workflow/templates/db-change-plan.md +20 -0
- package/docs/workflow/templates/docs-impact.md +17 -0
- package/docs/workflow/templates/e2e-plan.md +20 -0
- package/docs/workflow/templates/explore.md +16 -0
- package/docs/workflow/templates/github-actions-scale-preflight.yml +32 -0
- package/docs/workflow/templates/mini-prd.md +16 -0
- package/docs/workflow/templates/plan.md +37 -0
- package/docs/workflow/templates/pre-push-scale-preflight.sh +8 -0
- package/docs/workflow/templates/product-smoke.md +61 -0
- package/docs/workflow/templates/reality-check.md +28 -0
- package/docs/workflow/templates/resource-cleanup.md +17 -0
- package/docs/workflow/templates/resource-impact.md +25 -0
- package/docs/workflow/templates/review.md +12 -0
- package/docs/workflow/templates/runtime.md +23 -0
- package/docs/workflow/templates/security-review.md +26 -0
- package/docs/workflow/templates/skill-evidence.md +33 -0
- package/docs/workflow/templates/skill-plan.md +39 -0
- package/docs/workflow/templates/spec.md +17 -0
- package/docs/workflow/templates/standards-impact.md +28 -0
- package/docs/workflow/templates/summary.md +16 -0
- package/docs/workflow/templates/tasks.md +8 -0
- package/docs/workflow/templates/ui-spec.md +29 -0
- package/docs/workflow/templates/verification.md +20 -0
- package/docs/workflow/templates/visual-review.md +20 -0
- package/docs/zh/quickstart.md +108 -0
- package/examples/demo-projects/agent-governance-demo/CONTEXT.md +14 -0
- package/examples/demo-projects/agent-governance-demo/README.md +48 -0
- package/examples/demo-projects/agent-governance-demo/docs/CONTEXT-MAP.md +14 -0
- package/examples/demo-projects/agent-governance-demo/package.json +22 -0
- package/examples/demo-projects/agent-governance-demo/src/oauth-state.ts +39 -0
- package/examples/demo-projects/agent-governance-demo/tests/oauth-state.test.ts +52 -0
- package/mcp-configs/_INDEX.md +55 -0
- package/mcp-configs/context7/config.json +9 -0
- package/mcp-configs/fetch/config.json +9 -0
- package/mcp-configs/filesystem/config.json +9 -0
- package/mcp-configs/github/config.json +11 -0
- package/mcp-configs/memory/config.json +9 -0
- package/mcp-configs/neon/config.json +11 -0
- package/mcp-configs/playwright/config.json +9 -0
- package/mcp-configs/postgres/config.json +11 -0
- package/mcp-configs/puppeteer/config.json +9 -0
- package/mcp-configs/sequential-thinking/config.json +9 -0
- package/package.json +113 -0
- package/scripts/workflow/lib/gbrain-runtime.mjs +185 -0
- package/scripts/workflow/lib/report-output.mjs +107 -0
- package/scripts/workflow/medscale-release-smoke.mjs +338 -0
- package/scripts/workflow/provider-rehearsal.mjs +597 -0
- package/scripts/workflow/setup-smoke.mjs +433 -0
- package/target-research-platform/bridge_runner.py +310 -0
- package/target-research-platform/config.yaml +148 -0
- package/target-research-platform/data/immune_infiltration/ACC.csv +201 -0
- package/target-research-platform/data/immune_infiltration/BLCA.csv +201 -0
- package/target-research-platform/data/immune_infiltration/BRCA.csv +201 -0
- package/target-research-platform/data/immune_infiltration/CESC.csv +201 -0
- package/target-research-platform/data/immune_infiltration/CHOL.csv +201 -0
- package/target-research-platform/data/immune_infiltration/COAD.csv +201 -0
- package/target-research-platform/data/immune_infiltration/DLBC.csv +201 -0
- package/target-research-platform/data/immune_infiltration/ESCA.csv +201 -0
- package/target-research-platform/data/immune_infiltration/GBM.csv +201 -0
- package/target-research-platform/data/immune_infiltration/HNSC.csv +201 -0
- package/target-research-platform/data/immune_infiltration/KICH.csv +201 -0
- package/target-research-platform/data/immune_infiltration/KIRC.csv +201 -0
- package/target-research-platform/data/immune_infiltration/KIRP.csv +201 -0
- package/target-research-platform/data/immune_infiltration/LAML.csv +201 -0
- package/target-research-platform/data/immune_infiltration/LGG.csv +201 -0
- package/target-research-platform/data/immune_infiltration/LIHC.csv +201 -0
- package/target-research-platform/data/immune_infiltration/LUAD.csv +201 -0
- package/target-research-platform/data/immune_infiltration/LUSC.csv +201 -0
- package/target-research-platform/data/immune_infiltration/MESO.csv +201 -0
- package/target-research-platform/data/immune_infiltration/OV.csv +201 -0
- package/target-research-platform/data/immune_infiltration/PAAD.csv +201 -0
- package/target-research-platform/data/immune_infiltration/PCPG.csv +201 -0
- package/target-research-platform/data/immune_infiltration/PRAD.csv +201 -0
- package/target-research-platform/data/immune_infiltration/READ.csv +201 -0
- package/target-research-platform/data/immune_infiltration/SARC.csv +201 -0
- package/target-research-platform/data/immune_infiltration/SKCM.csv +201 -0
- package/target-research-platform/data/immune_infiltration/STAD.csv +201 -0
- package/target-research-platform/data/immune_infiltration/TGCT.csv +201 -0
- package/target-research-platform/data/immune_infiltration/THCA.csv +201 -0
- package/target-research-platform/data/immune_infiltration/THYM.csv +201 -0
- package/target-research-platform/data/immune_infiltration/UCEC.csv +201 -0
- package/target-research-platform/data/immune_infiltration/UCS.csv +201 -0
- package/target-research-platform/data/immune_infiltration/UVM.csv +201 -0
- package/target-research-platform/docs/JSON_SCHEMA.md +352 -0
- package/target-research-platform/docs/PROGRESS_2026-06-09.md +140 -0
- package/target-research-platform/main.py +755 -0
- package/target-research-platform/pyproject.toml +54 -0
- package/target-research-platform/requirements.txt +9 -0
- package/target-research-platform/run_dashboard.py +5 -0
- package/target-research-platform/run_real_medical_workflow.py +28 -0
- package/target-research-platform/scripts/demo_report.py +481 -0
- package/target-research-platform/scripts/generate_evidence_package.py +75 -0
- package/target-research-platform/scripts/prepare_immune_data.py +386 -0
- package/target-research-platform/src/__init__.py +4 -0
- package/target-research-platform/src/analysis/__init__.py +3 -0
- package/target-research-platform/src/analysis/stage1_expression/__init__.py +12 -0
- package/target-research-platform/src/analysis/stage1_expression/immune_correlation.py +366 -0
- package/target-research-platform/src/analysis/stage1_expression/pipeline.py +579 -0
- package/target-research-platform/src/analysis/stage1_expression/survival_analysis.py +382 -0
- package/target-research-platform/src/analysis/stage2_screening/__init__.py +12 -0
- package/target-research-platform/src/analysis/stage2_screening/differential_expression.py +451 -0
- package/target-research-platform/src/analysis/stage2_screening/druggability_score.py +477 -0
- package/target-research-platform/src/analysis/stage2_screening/pipeline.py +822 -0
- package/target-research-platform/src/analysis/stage3_deep_research/__init__.py +12 -0
- package/target-research-platform/src/analysis/stage3_deep_research/competitive_landscape.py +479 -0
- package/target-research-platform/src/analysis/stage3_deep_research/pipeline.py +763 -0
- package/target-research-platform/src/analysis/stage3_deep_research/target_function.py +290 -0
- package/target-research-platform/src/analysis/stage4_business/__init__.py +12 -0
- package/target-research-platform/src/analysis/stage4_business/business_plan.py +816 -0
- package/target-research-platform/src/analysis/stage4_business/milestone_planner.py +844 -0
- package/target-research-platform/src/analysis/stage4_business/pipeline.py +284 -0
- package/target-research-platform/src/api_clients/__init__.py +29 -0
- package/target-research-platform/src/api_clients/aminer_client.py +163 -0
- package/target-research-platform/src/api_clients/base_client.py +186 -0
- package/target-research-platform/src/api_clients/clinicaltrials_client.py +411 -0
- package/target-research-platform/src/api_clients/geo_client.py +1420 -0
- package/target-research-platform/src/api_clients/gtex_client.py +209 -0
- package/target-research-platform/src/api_clients/hpa_client.py +170 -0
- package/target-research-platform/src/api_clients/immune_data_manager.py +247 -0
- package/target-research-platform/src/api_clients/openalex_client.py +86 -0
- package/target-research-platform/src/api_clients/opentargets_client.py +558 -0
- package/target-research-platform/src/api_clients/pubmed_client.py +361 -0
- package/target-research-platform/src/api_clients/tcga_client.py +712 -0
- package/target-research-platform/src/api_clients/timer_client.py +169 -0
- package/target-research-platform/src/dashboard/app.py +2283 -0
- package/target-research-platform/src/dashboard/deliverables.py +710 -0
- package/target-research-platform/src/dashboard/static/artifactPreview.js +96 -0
- package/target-research-platform/src/dashboard/static/index.html +1292 -0
- package/target-research-platform/src/dashboard/status_tracker.py +237 -0
- package/target-research-platform/src/output/__init__.py +42 -0
- package/target-research-platform/src/output/agent_llm_provider.py +171 -0
- package/target-research-platform/src/output/chart_generator.py +550 -0
- package/target-research-platform/src/output/data_exporter.py +215 -0
- package/target-research-platform/src/output/delivery_packager.py +791 -0
- package/target-research-platform/src/output/evidence_package.py +230 -0
- package/target-research-platform/src/output/journal_templates.py +193 -0
- package/target-research-platform/src/output/literature_enricher.py +395 -0
- package/target-research-platform/src/output/literature_reviewer.py +420 -0
- package/target-research-platform/src/output/manuscript_fact_checker.py +279 -0
- package/target-research-platform/src/output/manuscript_generator.py +1189 -0
- package/target-research-platform/src/output/manuscript_quality.py +401 -0
- package/target-research-platform/src/output/medical_skills_bridge.py +140 -0
- package/target-research-platform/src/output/report_generator.py +542 -0
- package/target-research-platform/src/output/usage_envelope.py +193 -0
- package/target-research-platform/src/utils/__init__.py +1 -0
- package/target-research-platform/src/utils/config.py +125 -0
- package/target-research-platform/src/utils/logger.py +71 -0
- package/target-research-platform/src/validators/__init__.py +13 -0
- package/target-research-platform/src/validators/cross_validator.py +394 -0
- package/target-research-platform/src/validators/data_provenance.py +298 -0
|
@@ -0,0 +1,1292 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>靶点研究平台 — 医学研究工作台</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root {
|
|
9
|
+
--bg: #f3efe7;
|
|
10
|
+
--panel: rgba(255,252,245,0.88);
|
|
11
|
+
--ink: #1e2430;
|
|
12
|
+
--muted: #6d7485;
|
|
13
|
+
--line: rgba(30,36,48,0.12);
|
|
14
|
+
--accent: #0f766e;
|
|
15
|
+
--accent-2: #d97706;
|
|
16
|
+
--ok: #15803d;
|
|
17
|
+
--warn: #b45309;
|
|
18
|
+
--fail: #b91c1c;
|
|
19
|
+
--pending: #94a3b8;
|
|
20
|
+
--running: #2563eb;
|
|
21
|
+
--shadow: 0 16px 50px rgba(34,45,72,0.12);
|
|
22
|
+
}
|
|
23
|
+
* { box-sizing: border-box; }
|
|
24
|
+
body {
|
|
25
|
+
margin: 0; color: var(--ink);
|
|
26
|
+
background: radial-gradient(circle at top left, rgba(15,118,110,0.15), transparent 28%),
|
|
27
|
+
radial-gradient(circle at top right, rgba(217,119,6,0.12), transparent 24%),
|
|
28
|
+
linear-gradient(180deg, #faf7f0 0%, var(--bg) 100%);
|
|
29
|
+
font-family: "Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
|
|
30
|
+
min-height: 100vh;
|
|
31
|
+
}
|
|
32
|
+
.shell { max-width: 1440px; margin: 0 auto; padding: 28px 22px 44px; }
|
|
33
|
+
.hero { display: grid; grid-template-columns: 1.2fr 0.8fr; gap: 22px; margin-bottom: 22px; }
|
|
34
|
+
.panel {
|
|
35
|
+
background: var(--panel); border: 1px solid rgba(255,255,255,0.6);
|
|
36
|
+
border-radius: 24px; box-shadow: var(--shadow); backdrop-filter: blur(14px);
|
|
37
|
+
}
|
|
38
|
+
.hero-card { padding: 28px; position: relative; overflow: hidden; }
|
|
39
|
+
.eyebrow {
|
|
40
|
+
display: inline-flex; align-items: center; gap: 10px; padding: 8px 12px;
|
|
41
|
+
border-radius: 999px; font-size: 12px; letter-spacing: 0.08em;
|
|
42
|
+
text-transform: uppercase; color: var(--accent); background: rgba(15,118,110,0.09);
|
|
43
|
+
margin-bottom: 14px;
|
|
44
|
+
}
|
|
45
|
+
h1 { margin: 0 0 14px; font-size: clamp(30px,4vw,54px); line-height: 0.96; letter-spacing: -0.04em; }
|
|
46
|
+
.hero-copy { max-width: 700px; color: var(--muted); font-size: 16px; line-height: 1.7; margin-bottom: 22px; }
|
|
47
|
+
.status-row { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; }
|
|
48
|
+
.status-pill {
|
|
49
|
+
padding: 8px 14px; border-radius: 999px; font-size: 13px; font-weight: 600;
|
|
50
|
+
background: rgba(37,99,235,0.1); color: var(--running);
|
|
51
|
+
}
|
|
52
|
+
.status-pill.completed { color: var(--ok); background: rgba(21,128,61,0.1); }
|
|
53
|
+
.status-pill.failed { color: var(--fail); background: rgba(185,28,28,0.1); }
|
|
54
|
+
.status-pill.idle { color: var(--muted); background: rgba(109,116,133,0.12); }
|
|
55
|
+
.hero-meta { display: flex; gap: 18px; flex-wrap: wrap; margin-top: 18px; font-size: 14px; color: var(--muted); }
|
|
56
|
+
.hero-metrics { display: grid; grid-template-columns: repeat(2,1fr); gap: 14px; padding: 28px; }
|
|
57
|
+
.metric { padding: 18px; border-radius: 18px; background: rgba(255,255,255,0.62); border: 1px solid rgba(30,36,48,0.06); }
|
|
58
|
+
.metric-label { font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); margin-bottom: 8px; }
|
|
59
|
+
.metric-value { font-size: 28px; font-weight: 700; letter-spacing: -0.04em; }
|
|
60
|
+
.grid { display: grid; grid-template-columns: 1.15fr 0.85fr; gap: 22px; }
|
|
61
|
+
.section { padding: 24px; }
|
|
62
|
+
.section h2 { margin: 0 0 16px; font-size: 18px; letter-spacing: -0.02em; }
|
|
63
|
+
.workflow { display: grid; gap: 14px; }
|
|
64
|
+
.stage-card {
|
|
65
|
+
padding: 18px; border-radius: 18px; border: 1px solid var(--line);
|
|
66
|
+
background: rgba(255,255,255,0.6); transition: transform 220ms, border-color 220ms, background 220ms;
|
|
67
|
+
}
|
|
68
|
+
.stage-card.running { border-color: rgba(37,99,235,0.35); background: rgba(37,99,235,0.06); transform: translateX(4px); }
|
|
69
|
+
.stage-card.completed { border-color: rgba(21,128,61,0.3); background: rgba(21,128,61,0.06); }
|
|
70
|
+
.stage-card.failed { border-color: rgba(185,28,28,0.35); background: rgba(185,28,28,0.06); }
|
|
71
|
+
.stage-top { display: flex; justify-content: space-between; align-items: center; gap: 12px; margin-bottom: 10px; }
|
|
72
|
+
.stage-name { font-size: 16px; font-weight: 700; }
|
|
73
|
+
.stage-status { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); }
|
|
74
|
+
.stage-metrics { display: flex; flex-wrap: wrap; gap: 8px; }
|
|
75
|
+
.stage-metric { padding: 7px 10px; border-radius: 999px; background: rgba(30,36,48,0.06); font-size: 12px; color: var(--ink); }
|
|
76
|
+
.progress-track { width: 100%; height: 12px; border-radius: 999px; background: rgba(30,36,48,0.08); overflow: hidden; margin-top: 14px; }
|
|
77
|
+
.progress-fill { height: 100%; width: 0%; background: linear-gradient(90deg,var(--accent),var(--accent-2)); border-radius: inherit; transition: width 320ms; }
|
|
78
|
+
.run-form { display: grid; gap: 12px; }
|
|
79
|
+
.form-grid { display: grid; grid-template-columns: repeat(2,1fr); gap: 12px; }
|
|
80
|
+
label { display: grid; gap: 6px; font-size: 13px; color: var(--muted); }
|
|
81
|
+
input, select, button { font: inherit; }
|
|
82
|
+
input, select {
|
|
83
|
+
border: 1px solid var(--line); background: rgba(255,255,255,0.85);
|
|
84
|
+
border-radius: 14px; padding: 12px 14px; color: var(--ink); outline: none;
|
|
85
|
+
}
|
|
86
|
+
input:focus, select:focus { border-color: rgba(37,99,235,0.35); box-shadow: 0 0 0 4px rgba(37,99,235,0.08); }
|
|
87
|
+
button { border: none; border-radius: 14px; padding: 13px 16px; font-weight: 700; cursor: pointer; transition: transform 180ms, opacity 180ms; }
|
|
88
|
+
button:hover { transform: translateY(-1px); }
|
|
89
|
+
button:disabled { opacity: 0.55; cursor: not-allowed; transform: none; }
|
|
90
|
+
.primary { background: linear-gradient(135deg,#0f766e,#2563eb); color: white; }
|
|
91
|
+
.log-view {
|
|
92
|
+
min-height: 320px; max-height: 520px; overflow: auto; padding: 16px;
|
|
93
|
+
border-radius: 18px; background: #141924; color: #d9e0f0;
|
|
94
|
+
font-family: Consolas,"SFMono-Regular",monospace; font-size: 12px; line-height: 1.6; white-space: pre-wrap;
|
|
95
|
+
}
|
|
96
|
+
.artifact-list { display: grid; gap: 10px; }
|
|
97
|
+
.artifact-item {
|
|
98
|
+
padding: 12px 14px; border-radius: 16px; background: rgba(255,255,255,0.66);
|
|
99
|
+
border: 1px solid var(--line); font-size: 13px; display: flex; justify-content: space-between; align-items: center;
|
|
100
|
+
}
|
|
101
|
+
.artifact-path { margin-top: 4px; color: var(--muted); word-break: break-all; }
|
|
102
|
+
.artifact-dl {
|
|
103
|
+
padding: 6px 12px; border-radius: 10px; background: var(--accent); color: white;
|
|
104
|
+
font-size: 12px; font-weight: 600; cursor: pointer; text-decoration: none; border: none;
|
|
105
|
+
}
|
|
106
|
+
.artifact-dl:hover { opacity: 0.85; }
|
|
107
|
+
.mini-note { margin-top: 10px; font-size: 12px; color: var(--muted); line-height: 1.6; }
|
|
108
|
+
.tab-bar { display: flex; gap: 0; margin-bottom: 0; }
|
|
109
|
+
.tab-btn {
|
|
110
|
+
padding: 10px 20px; border: none; background: rgba(255,255,255,0.4);
|
|
111
|
+
color: var(--muted); font-weight: 600; font-size: 13px; cursor: pointer;
|
|
112
|
+
border-bottom: 3px solid transparent; transition: all 200ms;
|
|
113
|
+
}
|
|
114
|
+
.tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); background: rgba(255,255,255,0.8); }
|
|
115
|
+
.tab-content { display: none; }
|
|
116
|
+
.tab-content.active { display: block; }
|
|
117
|
+
.chart-container { position: relative; width: 100%; height: 320px; }
|
|
118
|
+
.file-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; }
|
|
119
|
+
.file-card {
|
|
120
|
+
padding: 16px; border-radius: 14px; background: rgba(255,255,255,0.7);
|
|
121
|
+
border: 1px solid var(--line); transition: transform 150ms, box-shadow 150ms;
|
|
122
|
+
display: flex; flex-direction: column; gap: 10px; min-height: 180px;
|
|
123
|
+
}
|
|
124
|
+
.file-card:hover { transform: translateY(-2px); box-shadow: 0 8px 24px rgba(0,0,0,0.08); }
|
|
125
|
+
.file-title { font-size: 15px; font-weight: 700; line-height: 1.4; }
|
|
126
|
+
.file-desc { font-size: 12px; color: var(--muted); line-height: 1.6; flex: 1; }
|
|
127
|
+
.file-actions { display: flex; gap: 8px; flex-wrap: wrap; }
|
|
128
|
+
.btn-secondary {
|
|
129
|
+
background: rgba(30,36,48,0.06); color: var(--ink); padding: 8px 12px;
|
|
130
|
+
border-radius: 10px; font-size: 12px; font-weight: 600;
|
|
131
|
+
}
|
|
132
|
+
.btn-download {
|
|
133
|
+
background: var(--accent); color: white; padding: 8px 12px;
|
|
134
|
+
border-radius: 10px; font-size: 12px; font-weight: 600; text-decoration: none;
|
|
135
|
+
}
|
|
136
|
+
.section-note { font-size: 13px; color: var(--muted); margin-bottom: 14px; line-height: 1.6; }
|
|
137
|
+
.advanced-toggle {
|
|
138
|
+
margin-top: 18px; font-size: 13px; color: var(--accent); cursor: pointer; font-weight: 600;
|
|
139
|
+
}
|
|
140
|
+
.advanced-grid { display: none; margin-top: 12px; }
|
|
141
|
+
.advanced-grid.open { display: grid; }
|
|
142
|
+
.compare-summary {
|
|
143
|
+
padding: 16px 18px; border-radius: 16px; background: rgba(15,118,110,0.08);
|
|
144
|
+
border: 1px solid rgba(15,118,110,0.18); margin-bottom: 18px; line-height: 1.7; font-size: 14px;
|
|
145
|
+
}
|
|
146
|
+
.modal-backdrop {
|
|
147
|
+
position: fixed; inset: 0; background: rgba(20,25,36,0.55); display: none;
|
|
148
|
+
align-items: center; justify-content: center; z-index: 1000; padding: 24px;
|
|
149
|
+
}
|
|
150
|
+
.modal-backdrop.open { display: flex; }
|
|
151
|
+
.modal-panel {
|
|
152
|
+
width: min(960px, 100%); max-height: 85vh; overflow: auto; background: white;
|
|
153
|
+
border-radius: 20px; padding: 22px; box-shadow: var(--shadow);
|
|
154
|
+
}
|
|
155
|
+
.modal-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 14px; }
|
|
156
|
+
.modal-title { font-size: 18px; font-weight: 700; }
|
|
157
|
+
.modal-close { background: rgba(30,36,48,0.08); color: var(--ink); padding: 8px 12px; border-radius: 10px; }
|
|
158
|
+
.preview-frame { width: 100%; min-height: 420px; border: 1px solid var(--line); border-radius: 12px; }
|
|
159
|
+
.preview-image-shell { display: flex; justify-content: center; align-items: flex-start; padding: 8px; background: #f8fafc; border: 1px solid var(--line); border-radius: 12px; }
|
|
160
|
+
.preview-image { display: block; max-width: 100%; height: auto; border-radius: 10px; }
|
|
161
|
+
.preview-text { white-space: pre-wrap; font-size: 13px; line-height: 1.8; }
|
|
162
|
+
.file-icon { font-size: 24px; margin-bottom: 6px; }
|
|
163
|
+
.file-name { font-size: 12px; font-weight: 600; margin-bottom: 2px; word-break: break-all; }
|
|
164
|
+
.file-meta { font-size: 11px; color: var(--muted); }
|
|
165
|
+
.badge { display: inline-block; padding: 2px 8px; border-radius: 6px; font-size: 11px; font-weight: 600; }
|
|
166
|
+
.badge-json { background: #e6f1fb; color: #185fa5; }
|
|
167
|
+
.badge-md { background: #eaf3de; color: #3b6d11; }
|
|
168
|
+
.badge-html { background: #faecda; color: #854f0b; }
|
|
169
|
+
.badge-pdf { background: #fceebe; color: #b45309; }
|
|
170
|
+
.badge-docx { background: #e1f5ee; color: #0f6e56; }
|
|
171
|
+
.report-view {
|
|
172
|
+
padding: 24px; border-radius: 18px; background: rgba(255,255,255,0.9);
|
|
173
|
+
border: 1px solid var(--line); max-height: 600px; overflow: auto;
|
|
174
|
+
font-size: 14px; line-height: 1.8;
|
|
175
|
+
}
|
|
176
|
+
.report-view h1 { font-size: 22px; margin-bottom: 8px; }
|
|
177
|
+
.report-view h2 { font-size: 18px; margin: 16px 0 8px; color: var(--accent); }
|
|
178
|
+
.report-view h3 { font-size: 15px; margin: 12px 0 6px; }
|
|
179
|
+
.report-view table { border-collapse: collapse; width: 100%; margin: 12px 0; }
|
|
180
|
+
.report-view th, .report-view td { border: 1px solid var(--line); padding: 8px 12px; font-size: 13px; text-align: left; }
|
|
181
|
+
.report-view th { background: rgba(15,118,110,0.08); font-weight: 600; }
|
|
182
|
+
.empty-state { text-align: center; padding: 40px; color: var(--muted); }
|
|
183
|
+
.empty-state .icon { font-size: 48px; margin-bottom: 12px; }
|
|
184
|
+
.report-layout { display: grid; grid-template-columns: 220px 1fr; gap: 18px; }
|
|
185
|
+
.report-nav { display: grid; gap: 8px; align-content: start; }
|
|
186
|
+
.report-nav-btn {
|
|
187
|
+
text-align: left; padding: 12px 14px; border-radius: 14px; border: 1px solid var(--line);
|
|
188
|
+
background: rgba(255,255,255,0.7); color: var(--ink); font-size: 13px; font-weight: 600; cursor: pointer;
|
|
189
|
+
}
|
|
190
|
+
.report-nav-btn small { display: block; margin-top: 4px; font-weight: 400; color: var(--muted); font-size: 11px; line-height: 1.4; }
|
|
191
|
+
.report-nav-btn.active { border-color: rgba(15,118,110,0.35); background: rgba(15,118,110,0.08); color: var(--accent); }
|
|
192
|
+
.report-nav-btn.missing { opacity: 0.45; cursor: not-allowed; }
|
|
193
|
+
.summary-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 10px; margin-bottom: 16px; }
|
|
194
|
+
.summary-card { padding: 12px 14px; border-radius: 14px; background: rgba(15,118,110,0.06); border: 1px solid rgba(15,118,110,0.12); }
|
|
195
|
+
.summary-card .label { font-size: 11px; color: var(--muted); margin-bottom: 4px; }
|
|
196
|
+
.summary-card .value { font-size: 16px; font-weight: 700; }
|
|
197
|
+
.info-banner {
|
|
198
|
+
padding: 12px 14px; border-radius: 14px; background: rgba(217,119,6,0.08);
|
|
199
|
+
border: 1px solid rgba(217,119,6,0.18); font-size: 13px; line-height: 1.7; margin-bottom: 16px; color: var(--ink);
|
|
200
|
+
}
|
|
201
|
+
.readiness-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 12px; }
|
|
202
|
+
.readiness-card {
|
|
203
|
+
padding: 16px; border-radius: 14px; border: 1px solid var(--line);
|
|
204
|
+
background: rgba(255,255,255,0.72); min-height: 184px;
|
|
205
|
+
display: flex; flex-direction: column; gap: 8px;
|
|
206
|
+
}
|
|
207
|
+
.readiness-card h3 { margin: 0; font-size: 14px; }
|
|
208
|
+
.readiness-card .value { font-size: 20px; font-weight: 800; letter-spacing: 0; }
|
|
209
|
+
.readiness-card ul { margin: 4px 0 0; padding-left: 18px; color: var(--muted); font-size: 12px; line-height: 1.6; }
|
|
210
|
+
.readiness-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
|
|
211
|
+
.readiness-status {
|
|
212
|
+
flex: 0 0 auto; max-width: 120px; padding: 4px 8px; border-radius: 999px;
|
|
213
|
+
background: rgba(30,36,48,0.07); color: var(--muted);
|
|
214
|
+
font-size: 11px; font-weight: 700; line-height: 1.3; text-align: center;
|
|
215
|
+
}
|
|
216
|
+
.readiness-action {
|
|
217
|
+
margin-top: auto; padding-top: 8px; border-top: 1px solid rgba(30,36,48,0.08);
|
|
218
|
+
color: var(--ink); font-size: 12px; line-height: 1.5; font-weight: 600;
|
|
219
|
+
}
|
|
220
|
+
.memory-review-actions { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 2px; }
|
|
221
|
+
.memory-review-actions .btn-secondary { padding: 6px 9px; border-radius: 8px; }
|
|
222
|
+
.memory-review-actions .btn-secondary.pass { background: rgba(21,128,61,0.1); color: var(--ok); }
|
|
223
|
+
.memory-review-actions .btn-secondary.warning { background: rgba(217,119,6,0.12); color: var(--warn); }
|
|
224
|
+
.memory-review-actions .btn-secondary.fail { background: rgba(185,28,28,0.1); color: var(--fail); }
|
|
225
|
+
.readiness-card.warning { border-color: rgba(217,119,6,0.32); background: rgba(217,119,6,0.07); }
|
|
226
|
+
.readiness-card.pass { border-color: rgba(21,128,61,0.24); background: rgba(21,128,61,0.06); }
|
|
227
|
+
.readiness-card.fail { border-color: rgba(185,28,28,0.32); background: rgba(185,28,28,0.07); }
|
|
228
|
+
.readiness-card.pending { border-color: rgba(148,163,184,0.34); background: rgba(148,163,184,0.08); }
|
|
229
|
+
.readiness-card.pass .readiness-status { background: rgba(21,128,61,0.1); color: var(--ok); }
|
|
230
|
+
.readiness-card.warning .readiness-status { background: rgba(217,119,6,0.12); color: var(--warn); }
|
|
231
|
+
.readiness-card.fail .readiness-status { background: rgba(185,28,28,0.1); color: var(--fail); }
|
|
232
|
+
.os-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 18px; margin-bottom: 16px; }
|
|
233
|
+
.os-title-group h2 { margin-bottom: 6px; }
|
|
234
|
+
.os-score {
|
|
235
|
+
min-width: 132px; padding: 12px 14px; border-radius: 14px;
|
|
236
|
+
background: rgba(37,99,235,0.08); border: 1px solid rgba(37,99,235,0.16);
|
|
237
|
+
text-align: right;
|
|
238
|
+
}
|
|
239
|
+
.os-score .label { font-size: 11px; color: var(--muted); margin-bottom: 2px; }
|
|
240
|
+
.os-score .value { font-size: 26px; line-height: 1; font-weight: 800; }
|
|
241
|
+
.os-layout { display: grid; grid-template-columns: 0.95fr 1.05fr; gap: 12px; }
|
|
242
|
+
.os-card {
|
|
243
|
+
padding: 16px; border-radius: 14px; background: rgba(255,255,255,0.72);
|
|
244
|
+
border: 1px solid var(--line); min-height: 160px;
|
|
245
|
+
}
|
|
246
|
+
.os-card h3 { margin: 0 0 10px; font-size: 14px; }
|
|
247
|
+
.os-card.wide { grid-column: 1 / -1; }
|
|
248
|
+
.os-meta { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 10px; }
|
|
249
|
+
.os-chip {
|
|
250
|
+
display: inline-flex; align-items: center; gap: 6px; padding: 5px 9px; border-radius: 999px;
|
|
251
|
+
background: rgba(30,36,48,0.07); color: var(--ink); font-size: 12px; font-weight: 700;
|
|
252
|
+
}
|
|
253
|
+
.os-chip.pass { background: rgba(21,128,61,0.1); color: var(--ok); }
|
|
254
|
+
.os-chip.warning { background: rgba(217,119,6,0.12); color: var(--warn); }
|
|
255
|
+
.os-chip.fail { background: rgba(185,28,28,0.1); color: var(--fail); }
|
|
256
|
+
.os-chip.pending { background: rgba(148,163,184,0.16); color: #475569; }
|
|
257
|
+
.os-list { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; }
|
|
258
|
+
.os-list li {
|
|
259
|
+
display: grid; gap: 3px; padding: 9px 10px; border-radius: 10px;
|
|
260
|
+
background: rgba(30,36,48,0.045); font-size: 12px; line-height: 1.45;
|
|
261
|
+
}
|
|
262
|
+
.os-list strong { font-size: 13px; }
|
|
263
|
+
.os-list small { color: var(--muted); line-height: 1.45; }
|
|
264
|
+
.os-template-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 8px; }
|
|
265
|
+
.os-template {
|
|
266
|
+
display: grid; gap: 6px; padding: 10px 12px; border-radius: 10px;
|
|
267
|
+
background: rgba(30,36,48,0.045); border: 1px solid rgba(30,36,48,0.06);
|
|
268
|
+
}
|
|
269
|
+
.os-template strong { font-size: 13px; }
|
|
270
|
+
.json-summary { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 10px; margin-bottom: 14px; }
|
|
271
|
+
.json-summary-item { padding: 10px 12px; border-radius: 12px; background: rgba(37,99,235,0.06); border: 1px solid rgba(37,99,235,0.12); }
|
|
272
|
+
.json-summary-item .label { font-size: 11px; color: var(--muted); }
|
|
273
|
+
.json-summary-item .value { font-size: 14px; font-weight: 700; margin-top: 4px; word-break: break-word; }
|
|
274
|
+
.raw-toggle { font-size: 12px; color: var(--accent); cursor: pointer; font-weight: 600; margin: 8px 0; }
|
|
275
|
+
.raw-json { display: none; max-height: 360px; overflow: auto; background: #141924; color: #d9e0f0; padding: 14px; border-radius: 12px; font-size: 12px; }
|
|
276
|
+
.raw-json.open { display: block; }
|
|
277
|
+
.report-view code { background: rgba(30,36,48,0.06); padding: 2px 6px; border-radius: 6px; font-size: 12px; }
|
|
278
|
+
.report-view pre { background: #141924; color: #d9e0f0; padding: 14px; border-radius: 12px; overflow: auto; }
|
|
279
|
+
.report-view blockquote { margin: 12px 0; padding: 10px 14px; border-left: 4px solid var(--accent); background: rgba(15,118,110,0.06); color: var(--muted); }
|
|
280
|
+
@media (max-width: 1080px) { .hero, .grid, .report-layout, .readiness-grid, .os-layout { grid-template-columns: 1fr; } .form-grid { grid-template-columns: 1fr; } }
|
|
281
|
+
@media (max-width: 680px) { .os-header { flex-direction: column; } .os-score { width: 100%; text-align: left; } }
|
|
282
|
+
</style>
|
|
283
|
+
</head>
|
|
284
|
+
<body>
|
|
285
|
+
<div class="shell">
|
|
286
|
+
<section class="hero">
|
|
287
|
+
<div class="panel hero-card">
|
|
288
|
+
<div class="eyebrow">医学研究工作台</div>
|
|
289
|
+
<h1>靶点研究平台<br>研究者交付工作台</h1>
|
|
290
|
+
<div class="hero-copy">
|
|
291
|
+
输入靶点与疾病后,查看四阶段分析、期刊论文草稿、事实核查、质量门禁和交付 ZIP。所有医学结论均需专家审阅,不能直接投稿。
|
|
292
|
+
</div>
|
|
293
|
+
<div class="status-row">
|
|
294
|
+
<div id="runStatusPill" class="status-pill idle">Idle</div>
|
|
295
|
+
<div id="currentStageText" class="status-pill idle">等待启动</div>
|
|
296
|
+
</div>
|
|
297
|
+
<div class="hero-meta">
|
|
298
|
+
<div><strong>Target:</strong> <span id="metaTarget">-</span></div>
|
|
299
|
+
<div><strong>Disease:</strong> <span id="metaDisease">-</span></div>
|
|
300
|
+
<div><strong>Run ID:</strong> <span id="metaRunId">-</span></div>
|
|
301
|
+
<div><strong>Updated:</strong> <span id="metaUpdated">-</span></div>
|
|
302
|
+
</div>
|
|
303
|
+
<div class="progress-track">
|
|
304
|
+
<div id="globalProgressFill" class="progress-fill"></div>
|
|
305
|
+
</div>
|
|
306
|
+
</div>
|
|
307
|
+
<aside class="panel hero-metrics">
|
|
308
|
+
<div class="metric">
|
|
309
|
+
<div class="metric-label">全局进度</div>
|
|
310
|
+
<div id="metricProgress" class="metric-value">0%</div>
|
|
311
|
+
</div>
|
|
312
|
+
<div class="metric">
|
|
313
|
+
<div class="metric-label">完成阶段</div>
|
|
314
|
+
<div id="metricCompleted" class="metric-value">0 / 4</div>
|
|
315
|
+
</div>
|
|
316
|
+
<div class="metric">
|
|
317
|
+
<div class="metric-label">研发成功率</div>
|
|
318
|
+
<div id="metricSuccessRate" class="metric-value">-</div>
|
|
319
|
+
</div>
|
|
320
|
+
<div class="metric">
|
|
321
|
+
<div class="metric-label">临床试验</div>
|
|
322
|
+
<div id="metricTrials" class="metric-value">-</div>
|
|
323
|
+
</div>
|
|
324
|
+
<div class="metric">
|
|
325
|
+
<div class="metric-label">论文质量</div>
|
|
326
|
+
<div id="metricManuscriptQuality" class="metric-value">-</div>
|
|
327
|
+
</div>
|
|
328
|
+
<div class="metric">
|
|
329
|
+
<div class="metric-label">事实核查</div>
|
|
330
|
+
<div id="metricFactCheck" class="metric-value">-</div>
|
|
331
|
+
</div>
|
|
332
|
+
<div class="metric">
|
|
333
|
+
<div class="metric-label">Delivery ZIP</div>
|
|
334
|
+
<div id="metricDeliveryPackage" class="metric-value">-</div>
|
|
335
|
+
</div>
|
|
336
|
+
</aside>
|
|
337
|
+
</section>
|
|
338
|
+
|
|
339
|
+
<section class="panel" style="margin-bottom: 22px;">
|
|
340
|
+
<div class="section">
|
|
341
|
+
<div class="os-header">
|
|
342
|
+
<div class="os-title-group">
|
|
343
|
+
<h2 id="medOsTitle">MedSCALE Research OS</h2>
|
|
344
|
+
<div id="medOsTagline" class="section-note">医学研究 Agent 协作、证据门禁、记忆沉淀和交付审计的研究者视图。</div>
|
|
345
|
+
</div>
|
|
346
|
+
<div class="os-score">
|
|
347
|
+
<div class="label">Readiness</div>
|
|
348
|
+
<div id="medOsScore" class="value">0</div>
|
|
349
|
+
</div>
|
|
350
|
+
</div>
|
|
351
|
+
<div id="medicalResearchOs" class="os-layout">
|
|
352
|
+
<div class="os-card wide"><div class="mini-note">正在加载医学研究 OS 状态...</div></div>
|
|
353
|
+
</div>
|
|
354
|
+
</div>
|
|
355
|
+
</section>
|
|
356
|
+
|
|
357
|
+
<section class="panel" style="margin-bottom: 22px;">
|
|
358
|
+
<div class="section">
|
|
359
|
+
<h2>交付就绪度</h2>
|
|
360
|
+
<div id="deliveryReadiness" class="readiness-grid">
|
|
361
|
+
<div class="readiness-card"><div class="value">等待交付</div><div class="mini-note">运行或打包论文后,这里会展示质量门禁、事实核查、证据富化和人工审阅待办。</div></div>
|
|
362
|
+
</div>
|
|
363
|
+
</div>
|
|
364
|
+
</section>
|
|
365
|
+
|
|
366
|
+
<section class="panel" style="margin-bottom: 22px;">
|
|
367
|
+
<div class="tab-bar">
|
|
368
|
+
<button class="tab-btn active" data-tab="workflow">流程监控</button>
|
|
369
|
+
<button class="tab-btn" data-tab="reports">汇报与论文</button>
|
|
370
|
+
<button class="tab-btn" data-tab="files">交付文件</button>
|
|
371
|
+
<button class="tab-btn" data-tab="compare">靶点对比</button>
|
|
372
|
+
</div>
|
|
373
|
+
|
|
374
|
+
<div id="tab-workflow" class="tab-content active">
|
|
375
|
+
<div class="grid" style="padding: 22px;">
|
|
376
|
+
<div>
|
|
377
|
+
<h2 style="margin-bottom:16px;">研究流程</h2>
|
|
378
|
+
<div id="stageList" class="workflow"></div>
|
|
379
|
+
</div>
|
|
380
|
+
<div>
|
|
381
|
+
<h2 style="margin-bottom:16px;">启动研究任务</h2>
|
|
382
|
+
<form id="runForm" class="run-form">
|
|
383
|
+
<div class="form-grid">
|
|
384
|
+
<label>靶点<input name="target" value="CDK4" required></label>
|
|
385
|
+
<label>疾病<input name="disease" value="breast cancer" required></label>
|
|
386
|
+
<label>癌种<input name="cancers" value="BRCA,LUAD" required></label>
|
|
387
|
+
<label>治疗模态<select name="modality"><option value="small_molecule">small_molecule</option><option value="antibody">antibody</option><option value="cell_therapy">cell_therapy</option><option value="gene_therapy">gene_therapy</option></select></label>
|
|
388
|
+
<label>风险等级<select name="risk_level"><option value="medium">medium</option><option value="low">low</option><option value="high">high</option></select></label>
|
|
389
|
+
</div>
|
|
390
|
+
<button id="runButton" class="primary" type="submit">运行完整研究流程</button>
|
|
391
|
+
<div id="formMessage" class="mini-note">将调用本地四阶段流程并生成论文交付,完成后可查看质量门禁、事实核查和 ZIP。</div>
|
|
392
|
+
</form>
|
|
393
|
+
<h2 style="margin: 22px 0 16px;">运行日志</h2>
|
|
394
|
+
<div id="logView" class="log-view">等待流程输出...</div>
|
|
395
|
+
</div>
|
|
396
|
+
</div>
|
|
397
|
+
</div>
|
|
398
|
+
|
|
399
|
+
<div id="tab-reports" class="tab-content">
|
|
400
|
+
<div class="section">
|
|
401
|
+
<h2>分析汇报与期刊论文</h2>
|
|
402
|
+
<div id="reportNote" class="info-banner">
|
|
403
|
+
左侧导航包含<strong>四阶段分析汇报</strong>与<strong>期刊论文</strong>(中文 IMRaD + 嵌入图表 + 逐篇文献评述)。
|
|
404
|
+
另提供<strong>《中华肿瘤杂志》格式草稿</strong>、医学事实核查报告和交付 ZIP;投稿前仍需作者、伦理、基金、原创实验和专家审校。
|
|
405
|
+
</div>
|
|
406
|
+
<div id="reportSummary" class="summary-cards"></div>
|
|
407
|
+
<div id="reportLayout" class="report-layout" style="display:none;">
|
|
408
|
+
<div id="reportNav" class="report-nav"></div>
|
|
409
|
+
<div id="reportContent" class="report-view"></div>
|
|
410
|
+
</div>
|
|
411
|
+
<div id="reportEmpty" class="empty-state">
|
|
412
|
+
<div class="icon">📄</div>
|
|
413
|
+
<p>暂无可读汇报。请先运行一次完整分析,或点击下方刷新。</p>
|
|
414
|
+
<button id="reportRefresh" class="btn-secondary" type="button" style="margin-top:12px;">刷新汇报</button>
|
|
415
|
+
</div>
|
|
416
|
+
</div>
|
|
417
|
+
</div>
|
|
418
|
+
|
|
419
|
+
<div id="tab-files" class="tab-content">
|
|
420
|
+
<div class="section">
|
|
421
|
+
<h2>研究者交付文件</h2>
|
|
422
|
+
<div id="filesScopeNote" class="section-note">仅展示当前分析任务的核心交付物(报告、证据包、商业计划)。原始 JSON 与溯源文件收纳在「高级数据」中。</div>
|
|
423
|
+
<div id="fileGrid" class="file-grid"></div>
|
|
424
|
+
<div id="advancedToggle" class="advanced-toggle" style="display:none;">展开高级数据文件</div>
|
|
425
|
+
<div id="advancedGrid" class="file-grid advanced-grid"></div>
|
|
426
|
+
</div>
|
|
427
|
+
</div>
|
|
428
|
+
|
|
429
|
+
<div id="tab-compare" class="tab-content">
|
|
430
|
+
<div class="section">
|
|
431
|
+
<h2>靶点综合对比</h2>
|
|
432
|
+
<div id="compareContent">
|
|
433
|
+
<div class="empty-state"><div class="icon">📈</div><p>完成分析后,将自动汇总表达、成药性、临床试验与商业指标</p></div>
|
|
434
|
+
</div>
|
|
435
|
+
</div>
|
|
436
|
+
</div>
|
|
437
|
+
</section>
|
|
438
|
+
</div>
|
|
439
|
+
|
|
440
|
+
<div id="previewModal" class="modal-backdrop">
|
|
441
|
+
<div class="modal-panel">
|
|
442
|
+
<div class="modal-header">
|
|
443
|
+
<div id="previewTitle" class="modal-title">文件预览</div>
|
|
444
|
+
<button id="previewClose" class="modal-close" type="button">关闭</button>
|
|
445
|
+
</div>
|
|
446
|
+
<div id="previewBody"></div>
|
|
447
|
+
</div>
|
|
448
|
+
</div>
|
|
449
|
+
|
|
450
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.js"></script>
|
|
451
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/12.0.2/marked.min.js"></script>
|
|
452
|
+
<script type="module">
|
|
453
|
+
import { rewriteArtifactRelativeUrls } from './artifactPreview.js';
|
|
454
|
+
|
|
455
|
+
const stageOrder = ["stage1","stage2","stage3","stage4"];
|
|
456
|
+
const stageLabels = { stage1:"Stage 1 Expression", stage2:"Stage 2 Screening", stage3:"Stage 3 Deep Research", stage4:"Stage 4 Business" };
|
|
457
|
+
const stageListEl = document.getElementById("stageList");
|
|
458
|
+
const logViewEl = document.getElementById("logView");
|
|
459
|
+
const formMessageEl = document.getElementById("formMessage");
|
|
460
|
+
const runButtonEl = document.getElementById("runButton");
|
|
461
|
+
|
|
462
|
+
let currentStatus = null;
|
|
463
|
+
let reportBundle = null;
|
|
464
|
+
let activeReportSection = null;
|
|
465
|
+
let reviewActionInFlight = false;
|
|
466
|
+
|
|
467
|
+
if (window.marked) {
|
|
468
|
+
marked.setOptions({ breaks: true, gfm: true });
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// Tab switching
|
|
472
|
+
document.querySelectorAll('.tab-btn').forEach(btn => {
|
|
473
|
+
btn.addEventListener('click', () => {
|
|
474
|
+
document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
|
|
475
|
+
document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));
|
|
476
|
+
btn.classList.add('active');
|
|
477
|
+
document.getElementById('tab-' + btn.dataset.tab).classList.add('active');
|
|
478
|
+
});
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
function metricChip(label, value) {
|
|
482
|
+
if (value === undefined || value === null || value === "") return "";
|
|
483
|
+
return '<div class="stage-metric"><strong>' + label + ':</strong> ' + value + '</div>';
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
function renderStages(status) {
|
|
487
|
+
const stages = status.stages || {};
|
|
488
|
+
stageListEl.innerHTML = stageOrder.map(key => {
|
|
489
|
+
const stage = stages[key] || {};
|
|
490
|
+
const metrics = stage.metrics || {};
|
|
491
|
+
const chips = [
|
|
492
|
+
metricChip("Status", stage.status || "pending"),
|
|
493
|
+
metricChip("Started", stage.started_at ? new Date(stage.started_at).toLocaleTimeString() : ""),
|
|
494
|
+
metricChip("Finished", stage.finished_at ? new Date(stage.finished_at).toLocaleTimeString() : ""),
|
|
495
|
+
metricChip("Confidence", metrics.confidence_level),
|
|
496
|
+
metricChip("Candidates", metrics.candidate_count),
|
|
497
|
+
metricChip("Rank", metrics.target_rank),
|
|
498
|
+
metricChip("Target score", metrics.target_score),
|
|
499
|
+
metricChip("Druggability", metrics.target_druggability),
|
|
500
|
+
metricChip("Trials", metrics.trial_count),
|
|
501
|
+
metricChip("Success", metrics.success_rate),
|
|
502
|
+
metricChip("Cost", metrics.total_cost),
|
|
503
|
+
metricChip("Duration", metrics.total_duration),
|
|
504
|
+
metricChip("Developability", metrics.developability_score),
|
|
505
|
+
].filter(Boolean).join("");
|
|
506
|
+
const error = stage.error ? '<div class="mini-note" style="color:var(--fail);margin-top:10px;">' + stage.error + '</div>' : "";
|
|
507
|
+
return '<article class="stage-card ' + (stage.status || "pending") + '"><div class="stage-top"><div class="stage-name">' + (stage.label || stageLabels[key]) + '</div><div class="stage-status">' + (stage.status || "pending") + '</div></div><div class="stage-metrics">' + (chips || '<div class="stage-metric">Waiting...</div>') + '</div>' + error + '</article>';
|
|
508
|
+
}).join("");
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
function renderLogs(logs) {
|
|
512
|
+
if (!logs || !logs.length) { logViewEl.textContent = "等待流程输出..."; return; }
|
|
513
|
+
logViewEl.textContent = logs.map(e => {
|
|
514
|
+
const ts = e.timestamp ? new Date(e.timestamp).toLocaleTimeString() : "--:--:--";
|
|
515
|
+
return "[" + ts + "] " + e.level.toUpperCase() + " " + e.message;
|
|
516
|
+
}).join("\n");
|
|
517
|
+
logViewEl.scrollTop = logViewEl.scrollHeight;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
function readinessCard(title, value, note, items, state) {
|
|
521
|
+
const list = items && items.length
|
|
522
|
+
? '<ul>' + items.slice(0, 6).map(item => '<li>' + escapeHtml(item) + '</li>').join('') + '</ul>'
|
|
523
|
+
: '';
|
|
524
|
+
return '<article class="readiness-card ' + (state || '') + '">'
|
|
525
|
+
+ '<h3>' + escapeHtml(title) + '</h3>'
|
|
526
|
+
+ '<div class="value">' + escapeHtml(value) + '</div>'
|
|
527
|
+
+ '<div class="mini-note">' + escapeHtml(note || '') + '</div>'
|
|
528
|
+
+ list
|
|
529
|
+
+ '</article>';
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
function researcherReadinessCard(card) {
|
|
533
|
+
const details = Array.isArray(card.details) ? card.details : [];
|
|
534
|
+
const list = details.length
|
|
535
|
+
? '<ul>' + details.slice(0, 5).map(item => '<li>' + escapeHtml(item) + '</li>').join('') + '</ul>'
|
|
536
|
+
: '';
|
|
537
|
+
const state = card.state || 'pending';
|
|
538
|
+
const reviewStatus = card.review_status || '';
|
|
539
|
+
const reviewClass = reviewStatus === 'approved'
|
|
540
|
+
? 'pass'
|
|
541
|
+
: reviewStatus === 'rejected'
|
|
542
|
+
? 'fail'
|
|
543
|
+
: reviewStatus && reviewStatus !== 'pending'
|
|
544
|
+
? 'warning'
|
|
545
|
+
: 'pending';
|
|
546
|
+
const reviewMeta = reviewStatus
|
|
547
|
+
? '<div class="os-meta"><span class="os-chip ' + reviewClass + '">Memory review: ' + escapeHtml(reviewStatus) + '</span>'
|
|
548
|
+
+ (card.reviewer ? '<span class="os-chip">reviewer ' + escapeHtml(card.reviewer) + '</span>' : '')
|
|
549
|
+
+ '</div>'
|
|
550
|
+
: '';
|
|
551
|
+
const reviewActions = memoryReviewActions(card);
|
|
552
|
+
return '<article class="readiness-card ' + escapeHtml(state) + '">'
|
|
553
|
+
+ '<div class="readiness-top"><h3>' + escapeHtml(card.title || '') + '</h3>'
|
|
554
|
+
+ '<div class="readiness-status">' + escapeHtml(card.status_label || state) + '</div></div>'
|
|
555
|
+
+ '<div class="value">' + escapeHtml(card.value || '-') + '</div>'
|
|
556
|
+
+ reviewMeta
|
|
557
|
+
+ '<div class="mini-note">' + escapeHtml(card.summary || '') + '</div>'
|
|
558
|
+
+ list
|
|
559
|
+
+ reviewActions
|
|
560
|
+
+ '<div class="readiness-action">' + escapeHtml(card.next_action || '') + '</div>'
|
|
561
|
+
+ '</article>';
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
function memoryReviewActions(card) {
|
|
565
|
+
if (card.id !== "learning_candidate" || !card.candidate_id) return "";
|
|
566
|
+
const actions = Array.isArray(card.review_actions) && card.review_actions.length
|
|
567
|
+
? card.review_actions
|
|
568
|
+
: ["approve", "reject", "stale", "restore"];
|
|
569
|
+
const labels = { approve: "批准", reject: "拒绝", stale: "标记过期", restore: "恢复复审" };
|
|
570
|
+
const classes = { approve: "pass", reject: "fail", stale: "warning", restore: "warning" };
|
|
571
|
+
return '<div class="memory-review-actions">'
|
|
572
|
+
+ actions.map(action => '<button type="button" class="btn-secondary ' + (classes[action] || '') + '" data-memory-review-action="' + escapeAttr(action) + '" data-candidate-id="' + escapeAttr(card.candidate_id) + '"' + (reviewActionInFlight ? ' disabled' : '') + '>' + escapeHtml(labels[action] || action) + '</button>').join('')
|
|
573
|
+
+ '</div>';
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
function stateText(state) {
|
|
577
|
+
if (state === "pass") return "PASS";
|
|
578
|
+
if (state === "warning") return "REVIEW";
|
|
579
|
+
if (state === "fail") return "BLOCKED";
|
|
580
|
+
if (state === "pending") return "PENDING";
|
|
581
|
+
return state || "UNKNOWN";
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
function renderOsList(items, renderItem) {
|
|
585
|
+
return '<ul class="os-list">' + items.map(renderItem).join('') + '</ul>';
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
function renderMedicalResearchOs(status) {
|
|
589
|
+
const container = document.getElementById("medicalResearchOs");
|
|
590
|
+
if (!container) return;
|
|
591
|
+
const os = status.summary?.medical_research_os || {};
|
|
592
|
+
const product = os.product || {};
|
|
593
|
+
const operating = os.operating_model || {};
|
|
594
|
+
const loop = os.loop_readiness || {};
|
|
595
|
+
const team = os.research_team || {};
|
|
596
|
+
const memory = os.memory_strategy || {};
|
|
597
|
+
const tokenCost = os.token_cost || {};
|
|
598
|
+
const runtime = os.runtime_readiness || status.summary?.medical_runtime_readiness || {};
|
|
599
|
+
const promptStudio = os.prompt_studio || {};
|
|
600
|
+
const signals = Array.isArray(loop.signals) ? loop.signals : [];
|
|
601
|
+
const roles = Array.isArray(team.roles) ? team.roles : [];
|
|
602
|
+
const gates = Array.isArray(team.review_gates) ? team.review_gates : [];
|
|
603
|
+
const runtimeCards = Array.isArray(runtime.cards) ? runtime.cards : [];
|
|
604
|
+
const templates = Array.isArray(promptStudio.templates) ? promptStudio.templates : [];
|
|
605
|
+
const migrations = Array.isArray(os.next_migrations) ? os.next_migrations : [];
|
|
606
|
+
const tokenSummary = tokenCost.summary || {};
|
|
607
|
+
const tokenLanes = Array.isArray(tokenCost.by_medical_lane) ? tokenCost.by_medical_lane : [];
|
|
608
|
+
const titleEl = document.getElementById("medOsTitle");
|
|
609
|
+
const taglineEl = document.getElementById("medOsTagline");
|
|
610
|
+
const scoreEl = document.getElementById("medOsScore");
|
|
611
|
+
if (titleEl) titleEl.textContent = product.cn_name || product.name || "MedSCALE Research OS";
|
|
612
|
+
if (taglineEl) taglineEl.textContent = product.tagline || "医学研究 Agent 协作、证据门禁、记忆沉淀和交付审计的研究者视图。";
|
|
613
|
+
if (scoreEl) scoreEl.textContent = String(operating.readiness_score ?? loop.score ?? 0);
|
|
614
|
+
|
|
615
|
+
const signalHtml = signals.length
|
|
616
|
+
? renderOsList(signals, signal => '<li><strong>' + escapeHtml(signal.label || signal.id || '') + '</strong><small><span class="os-chip ' + escapeHtml(signal.state || 'pending') + '">' + stateText(signal.state) + '</span> ' + escapeHtml(signal.summary || '') + '</small></li>')
|
|
617
|
+
: '<div class="mini-note">等待运行或交付状态。</div>';
|
|
618
|
+
|
|
619
|
+
const roleHtml = roles.length
|
|
620
|
+
? renderOsList(roles, role => '<li><strong>' + escapeHtml(role.name || role.id || '') + '</strong><small>' + escapeHtml(role.responsibility || '') + ' · <span class="os-chip ' + escapeHtml(role.state || 'pending') + '">' + stateText(role.state) + '</span></small><small>' + escapeHtml(role.reason || '') + '</small></li>')
|
|
621
|
+
: '<div class="mini-note">等待协作角色计划。</div>';
|
|
622
|
+
|
|
623
|
+
const gateHtml = gates.length
|
|
624
|
+
? renderOsList(gates.slice(0, 6), gate => '<li><strong>' + escapeHtml(gate.id || '') + '</strong><small>owner=' + escapeHtml(gate.owner || '') + ' · <span class="os-chip ' + escapeHtml(gate.state || 'pending') + '">' + stateText(gate.state) + '</span></small></li>')
|
|
625
|
+
: '<div class="mini-note">等待 review gate。</div>';
|
|
626
|
+
|
|
627
|
+
const templateHtml = templates.length
|
|
628
|
+
? '<div class="os-template-grid">' + templates.map(template => '<div class="os-template"><strong>' + escapeHtml(template.title || template.id || '') + '</strong><div class="os-meta"><span class="os-chip">' + escapeHtml(template.phase || '') + '</span><span class="os-chip">' + escapeHtml(template.role || '') + '</span></div><div class="mini-note">' + escapeHtml(template.output || '') + '</div></div>').join('') + '</div>'
|
|
629
|
+
: '<div class="mini-note">等待医学 Prompt Studio 模板。</div>';
|
|
630
|
+
|
|
631
|
+
const migrationHtml = migrations.length
|
|
632
|
+
? renderOsList(migrations.slice(0, 5), item => '<li><small>' + escapeHtml(item) + '</small></li>')
|
|
633
|
+
: '<div class="mini-note">暂无迁移待办。</div>';
|
|
634
|
+
|
|
635
|
+
const runtimeHtml = runtimeCards.length
|
|
636
|
+
? renderOsList(runtimeCards, card => '<li><strong>' + escapeHtml(card.title || card.id || '') + '</strong><small><span class="os-chip ' + escapeHtml(card.state || 'pending') + '">' + stateText(card.state) + '</span> ' + escapeHtml(card.status_label || '') + '</small><small>' + escapeHtml(card.summary || '') + '</small><small>' + escapeHtml((card.details || []).slice(0, 3).join(' | ')) + '</small></li>')
|
|
637
|
+
: '<div class="mini-note">Waiting for MedSCALE runtime doctor.</div>';
|
|
638
|
+
const tokenCostValue = tokenSummary.estimated_cost_usd === null || tokenSummary.estimated_cost_usd === undefined
|
|
639
|
+
? "unknown"
|
|
640
|
+
: "$" + Number(tokenSummary.estimated_cost_usd || 0).toFixed(6);
|
|
641
|
+
const tokenLaneHtml = tokenLanes.length
|
|
642
|
+
? renderOsList(tokenLanes.slice(0, 6), lane => '<li><strong>' + escapeHtml(lane.label || lane.key || '') + '</strong><small>' + escapeHtml(String(lane.records || 0)) + ' record(s) · ' + escapeHtml(String(lane.total_tokens || 0)) + ' tokens</small></li>')
|
|
643
|
+
: '<div class="mini-note">No model usage recorded yet.</div>';
|
|
644
|
+
const memoryCandidateState = memory.candidate_state || 'review-required';
|
|
645
|
+
const memoryCandidateClass = memoryCandidateState === 'approved' || memoryCandidateState === 'promotable'
|
|
646
|
+
? 'pass'
|
|
647
|
+
: memoryCandidateState === 'rejected'
|
|
648
|
+
? 'fail'
|
|
649
|
+
: memoryCandidateState === 'pending'
|
|
650
|
+
? 'pending'
|
|
651
|
+
: 'warning';
|
|
652
|
+
|
|
653
|
+
container.innerHTML =
|
|
654
|
+
'<article class="os-card"><h3>运行模式</h3><div class="os-meta">'
|
|
655
|
+
+ '<span class="os-chip">' + escapeHtml(operating.mode || 'multi-agent') + '</span>'
|
|
656
|
+
+ '<span class="os-chip ' + (operating.status === 'blocked' ? 'fail' : operating.status === 'ready-for-expert-review' ? 'pass' : 'warning') + '">' + escapeHtml(operating.status || 'insufficient-evidence') + '</span>'
|
|
657
|
+
+ '<span class="os-chip">workflow ' + escapeHtml(product.source_upgrade || 'MedSCALE native workflow') + '</span>'
|
|
658
|
+
+ '</div><div class="mini-note">ready=' + (operating.ready_signals ?? 0) + ' / warning=' + (operating.warning_signals ?? 0) + ' / missing=' + (operating.missing_signals ?? 0) + '</div>'
|
|
659
|
+
+ '<div class="mini-note">runtime=' + escapeHtml(runtime.status || 'unknown') + ' / score=' + escapeHtml(String(runtime.score ?? '-')) + '</div></article>'
|
|
660
|
+
+ '<article class="os-card"><h3>Agent Loop Readiness</h3>' + signalHtml + '</article>'
|
|
661
|
+
+ '<article class="os-card"><h3>医学研究团队</h3>' + roleHtml + '</article>'
|
|
662
|
+
+ '<article class="os-card"><h3>Review Gates</h3>' + gateHtml + '</article>'
|
|
663
|
+
+ '<article class="os-card"><h3>Memory Strategy</h3><div class="os-meta">'
|
|
664
|
+
+ '<span class="os-chip">' + escapeHtml(memory.routing || 'gbrain-only') + '</span>'
|
|
665
|
+
+ '<span class="os-chip ' + (memory.seed_state === 'ready' ? 'pass' : 'pending') + '">' + escapeHtml(memory.seed_state || 'pending') + '</span>'
|
|
666
|
+
+ '<span class="os-chip ' + memoryCandidateClass + '">' + escapeHtml(memoryCandidateState) + '</span>'
|
|
667
|
+
+ '<span class="os-chip ' + (memory.review_ready ? 'pass' : 'pending') + '">review ' + escapeHtml(memory.review_status || 'pending') + '</span>'
|
|
668
|
+
+ '</div><div class="mini-note">' + escapeHtml(memory.candidate_id || memory.record_path || '等待记忆播种与学习候选。') + '</div></article>'
|
|
669
|
+
+ '<article class="os-card"><h3>Token / Cost</h3><div class="os-meta">'
|
|
670
|
+
+ '<span class="os-chip ' + (tokenCost.status === 'ready' ? 'pass' : 'warning') + '">' + escapeHtml(tokenCost.status || 'pending') + '</span>'
|
|
671
|
+
+ '<span class="os-chip">' + escapeHtml(String(tokenSummary.total_tokens || 0)) + ' tokens</span>'
|
|
672
|
+
+ '<span class="os-chip">' + escapeHtml(String(tokenSummary.cache_savings_tokens || 0)) + ' saved</span>'
|
|
673
|
+
+ '<span class="os-chip">' + escapeHtml(tokenCostValue) + '</span>'
|
|
674
|
+
+ '</div>' + tokenLaneHtml + '</article>'
|
|
675
|
+
+ '<article class="os-card"><h3>下一步迁移</h3>' + migrationHtml + '</article>'
|
|
676
|
+
+ '<article class="os-card wide"><h3>Runtime Doctor</h3><div class="os-meta">'
|
|
677
|
+
+ '<span class="os-chip ' + (runtime.status === 'ready' ? 'pass' : runtime.status === 'blocked' ? 'fail' : 'warning') + '">' + escapeHtml(runtime.status || 'unknown') + '</span>'
|
|
678
|
+
+ '<span class="os-chip">score ' + escapeHtml(String(runtime.score ?? '-')) + '</span>'
|
|
679
|
+
+ '<span class="os-chip">missing ' + escapeHtml(String((runtime.required_missing || []).length || 0)) + '</span>'
|
|
680
|
+
+ '</div>' + runtimeHtml + '</article>'
|
|
681
|
+
+ '<article class="os-card wide"><h3>医学 Prompt Studio</h3>' + templateHtml + '</article>';
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
function formatReviewExample(item) {
|
|
685
|
+
if (!item) return "";
|
|
686
|
+
const parts = [];
|
|
687
|
+
if (item.pmid) parts.push("PMID " + item.pmid);
|
|
688
|
+
if (item.study_design) parts.push(item.study_design);
|
|
689
|
+
if (item.source) parts.push(item.source);
|
|
690
|
+
if (item.evidence_level) parts.push(item.evidence_level);
|
|
691
|
+
return parts.join(" · ");
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
function renderDeliveryReadiness(status) {
|
|
695
|
+
const el = document.getElementById("deliveryReadiness");
|
|
696
|
+
if (!el) return;
|
|
697
|
+
const summary = status.summary || {};
|
|
698
|
+
const readiness = summary.delivery_readiness || {};
|
|
699
|
+
const quality = summary.quality_gate || {};
|
|
700
|
+
const fact = summary.fact_check || {};
|
|
701
|
+
const qualityFindings = readiness.quality_findings || [];
|
|
702
|
+
const evidence = readiness.literature_evidence || {};
|
|
703
|
+
const todo = readiness.human_review_todo || [];
|
|
704
|
+
const reviewExamples = readiness.review_examples || [];
|
|
705
|
+
const reviewFiles = readiness.review_files || {};
|
|
706
|
+
const packageAudit = readiness.package_audit || summary.package_audit || {};
|
|
707
|
+
const memorySeed = readiness.memory_seed || {};
|
|
708
|
+
const learningCandidate = readiness.learning_candidate || {};
|
|
709
|
+
const researcherCards = Array.isArray(readiness.researcher_cards) ? readiness.researcher_cards : [];
|
|
710
|
+
if (researcherCards.length) {
|
|
711
|
+
el.innerHTML = researcherCards.map(researcherReadinessCard).join("");
|
|
712
|
+
return;
|
|
713
|
+
}
|
|
714
|
+
const qualityVerdict = quality.passed === true ? "PASS" : quality.passed === false ? "FAIL" : "UNKNOWN";
|
|
715
|
+
const factVerdict = fact.passed === true ? "PASS" : fact.passed === false ? "FAIL" : "UNKNOWN";
|
|
716
|
+
const findingItems = qualityFindings.map(item => {
|
|
717
|
+
const severity = item.severity || "unknown";
|
|
718
|
+
const id = item.id || "quality";
|
|
719
|
+
const message = item.message || "";
|
|
720
|
+
return "[" + severity + "] " + id + ": " + message;
|
|
721
|
+
});
|
|
722
|
+
const sources = (evidence.sources || []).length ? evidence.sources.join(", ") : "none";
|
|
723
|
+
const evidenceItems = [
|
|
724
|
+
"reviews=" + (evidence.count ?? "-") + "; agent=" + (evidence.agent_cache_count ?? 0) + "; llm=" + (evidence.llm_count ?? 0) + "; rule=" + (evidence.rule_based_count ?? 0),
|
|
725
|
+
"sources=" + sources,
|
|
726
|
+
"MeSH=" + (evidence.mesh_count ?? 0) + "; citations=" + (evidence.citation_count_available ?? 0) + "; cache=" + (evidence.cache_used ? "used" : "not used"),
|
|
727
|
+
];
|
|
728
|
+
const reviewItems = [
|
|
729
|
+
"Agent tasks=" + (reviewFiles.task_path ? "ready" : "missing") + "; cache=" + (reviewFiles.cache_path ? "ready" : "pending"),
|
|
730
|
+
].concat(reviewExamples.map(formatReviewExample).filter(Boolean));
|
|
731
|
+
const packageItems = [
|
|
732
|
+
"entries=" + (packageAudit.entry_count ?? 0) + "; files checked=" + (packageAudit.files_checked ?? 0),
|
|
733
|
+
"README=" + (packageAudit.readme_present ? "ready" : "missing") + "; manifest=" + (packageAudit.manifest_present ? "ready" : "missing"),
|
|
734
|
+
"images checked=" + (packageAudit.image_refs_checked ?? 0) + "; links checked=" + (packageAudit.markdown_refs_checked ?? 0),
|
|
735
|
+
];
|
|
736
|
+
(packageAudit.broken_image_refs || []).slice(0, 3).forEach(item => packageItems.push("broken image=" + (item.resolved_path || item.reference || "unknown")));
|
|
737
|
+
(packageAudit.broken_markdown_refs || []).slice(0, 3).forEach(item => packageItems.push("broken link=" + (item.resolved_path || item.reference || "unknown")));
|
|
738
|
+
const memoryWarnings = (memorySeed.warnings || []).slice(0, 4).map(item => "warning=" + item);
|
|
739
|
+
const memoryMissingRoles = memorySeed.missing_roles || [];
|
|
740
|
+
const memoryItems = [
|
|
741
|
+
"provider=" + (memorySeed.provider || "not seeded"),
|
|
742
|
+
"record=" + (memorySeed.record_ready ? "ready" : "missing") + "; summary=" + (memorySeed.summary_ready ? "ready" : "missing"),
|
|
743
|
+
"sources=" + (memorySeed.source_file_count ?? 0) + "; staged=" + (memorySeed.staged_file_count ?? 0),
|
|
744
|
+
"missing roles=" + (memoryMissingRoles.length ? memoryMissingRoles.join(", ") : "none"),
|
|
745
|
+
].concat(memoryWarnings);
|
|
746
|
+
const qualityState = quality.passed === false ? "fail" : qualityFindings.length ? "warning" : quality.passed === true ? "pass" : "";
|
|
747
|
+
const factState = fact.passed === false ? "fail" : fact.passed === true ? "pass" : "";
|
|
748
|
+
const reviewState = evidence.upgrade_needed ? "warning" : (evidence.agent_or_llm_count ?? 0) > 0 ? "pass" : "";
|
|
749
|
+
const packageState = packageAudit.passed === false
|
|
750
|
+
? "fail"
|
|
751
|
+
: packageAudit.passed === true
|
|
752
|
+
? "pass"
|
|
753
|
+
: (packageAudit.entry_count || packageAudit.files_checked ? "warning" : "");
|
|
754
|
+
const packageValue = packageAudit.passed === true
|
|
755
|
+
? "PASS"
|
|
756
|
+
: packageAudit.passed === false
|
|
757
|
+
? "FAIL"
|
|
758
|
+
: "PENDING";
|
|
759
|
+
const packageNote = packageAudit.passed === true
|
|
760
|
+
? "ZIP 内文件、README、manifest 以及 Markdown 本地图表引用已经通过自检。"
|
|
761
|
+
: packageAudit.passed === false
|
|
762
|
+
? "交付 ZIP 已生成,但包内存在断链、缺失文件或归档不一致,需修复后再交付。"
|
|
763
|
+
: "尚未获得当前 ZIP 的归档审计结果。";
|
|
764
|
+
const memoryState = memorySeed.import_ok === false
|
|
765
|
+
? "fail"
|
|
766
|
+
: memorySeed.import_ok === true
|
|
767
|
+
? ((memorySeed.warnings || []).length || memoryMissingRoles.length ? "warning" : "pass")
|
|
768
|
+
: (memorySeed.record_ready || memorySeed.summary_ready ? "warning" : "");
|
|
769
|
+
const memoryValue = (memorySeed.provider || "memory") + " " + (
|
|
770
|
+
memorySeed.import_ok === true
|
|
771
|
+
? "READY"
|
|
772
|
+
: memorySeed.import_ok === false
|
|
773
|
+
? "FAILED"
|
|
774
|
+
: (memorySeed.record_ready || memorySeed.summary_ready ? "PARTIAL" : "PENDING")
|
|
775
|
+
);
|
|
776
|
+
const memoryNote = memorySeed.import_ok === true
|
|
777
|
+
? "\u533b\u5b66\u4ea4\u4ed8\u6458\u8981\u5df2\u64ad\u79cd\u5230\u8bb0\u5fc6\u4f9b\u5e94\u5546\uff0c\u53ef\u7528\u4e8e\u540e\u7eed recall \u4e0e\u7814\u7a76\u8fde\u7eed\u6027\u3002"
|
|
778
|
+
: (memorySeed.record_ready || memorySeed.summary_ready)
|
|
779
|
+
? "\u5df2\u751f\u6210\u672c\u5730 memory seed \u4ea4\u4ed8\u7269\uff0c\u4f46\u5bfc\u5165\u8fd8\u9700\u590d\u6838\u6216\u8865\u8dd1\u3002"
|
|
780
|
+
: "\u5c1a\u672a\u4e3a\u5f53\u524d\u4ea4\u4ed8\u751f\u6210 memory seed \u8bb0\u5f55\u3002";
|
|
781
|
+
const learningWarnings = (learningCandidate.warnings || []).slice(0, 4).map(item => "warning=" + item);
|
|
782
|
+
const learningReviewStatus = learningCandidate.review_status || "pending";
|
|
783
|
+
const learningItems = [
|
|
784
|
+
"candidate=" + (learningCandidate.candidate_id || "missing"),
|
|
785
|
+
"record=" + (learningCandidate.record_ready ? "ready" : "missing") + "; summary=" + (learningCandidate.summary_ready ? "ready" : "missing"),
|
|
786
|
+
"recommended=" + (learningCandidate.recommended_action || "pending"),
|
|
787
|
+
"review=" + (learningCandidate.review_ready ? "ready" : "pending") + "; status=" + learningReviewStatus,
|
|
788
|
+
"brain=" + (
|
|
789
|
+
learningCandidate.brain_ingest_ok === true
|
|
790
|
+
? "candidate-node-ready"
|
|
791
|
+
: learningCandidate.brain_ingest_ok === false
|
|
792
|
+
? "ingest-failed"
|
|
793
|
+
: "not-ingested"
|
|
794
|
+
),
|
|
795
|
+
].concat(learningWarnings);
|
|
796
|
+
const learningState = learningCandidate.brain_ingest_ok === false
|
|
797
|
+
? "fail"
|
|
798
|
+
: learningReviewStatus === "approved"
|
|
799
|
+
? "pass"
|
|
800
|
+
: learningReviewStatus === "rejected"
|
|
801
|
+
? "fail"
|
|
802
|
+
: learningReviewStatus === "stale" || learningReviewStatus === "restored"
|
|
803
|
+
? "warning"
|
|
804
|
+
: learningCandidate.promotable
|
|
805
|
+
? "pass"
|
|
806
|
+
: learningCandidate.record_ready || learningCandidate.summary_ready
|
|
807
|
+
? "warning"
|
|
808
|
+
: "";
|
|
809
|
+
const learningValue = learningReviewStatus === "approved"
|
|
810
|
+
? "APPROVED"
|
|
811
|
+
: learningReviewStatus === "rejected"
|
|
812
|
+
? "REJECTED"
|
|
813
|
+
: learningReviewStatus === "stale"
|
|
814
|
+
? "STALE"
|
|
815
|
+
: learningReviewStatus === "restored"
|
|
816
|
+
? "RESTORED"
|
|
817
|
+
: learningCandidate.promotable
|
|
818
|
+
? "READY"
|
|
819
|
+
: learningCandidate.recommended_action === "resolve-failures-first"
|
|
820
|
+
? "BLOCKED"
|
|
821
|
+
: learningCandidate.record_ready || learningCandidate.summary_ready
|
|
822
|
+
? "REVIEW"
|
|
823
|
+
: "PENDING";
|
|
824
|
+
const learningNote = learningReviewStatus === "approved"
|
|
825
|
+
? "learning candidate 已通过 Memory Brain 人工审核,可进入后续医学研究 recall 与复用。"
|
|
826
|
+
: learningReviewStatus === "rejected"
|
|
827
|
+
? "learning candidate 已被拒绝,不应进入长期知识或后续 recall。"
|
|
828
|
+
: learningReviewStatus === "stale"
|
|
829
|
+
? "learning candidate 已被标记为 stale,需要更新证据后再复用。"
|
|
830
|
+
: learningReviewStatus === "restored"
|
|
831
|
+
? "learning candidate 已恢复复审,等待下一轮人工批准。"
|
|
832
|
+
: learningCandidate.promotable
|
|
833
|
+
? "\u533b\u5b66\u4ea4\u4ed8\u5df2\u6c89\u6dc0\u4e3a\u53ef\u5ba1\u9605 learning candidate\uff0c\u53ef\u7ee7\u7eed\u63a8\u8fdb\u5230 Memory Brain \u6216\u77e5\u8bc6\u5e93\u4eba\u5de5\u590d\u5ba1\u6d41\u7a0b\u3002"
|
|
834
|
+
: learningCandidate.recommended_action === "resolve-failures-first"
|
|
835
|
+
? "\u5f53\u524d\u4ea4\u4ed8\u8fd8\u6709\u672a\u89e3\u51b3\u8d28\u91cf/\u4e8b\u5b9e\u95ee\u9898\uff0c\u5e94\u5148\u4fee\u590d\u540e\u518d\u63a8\u8fdb\u957f\u671f\u77e5\u8bc6\u6c89\u6dc0\u3002"
|
|
836
|
+
: learningCandidate.record_ready || learningCandidate.summary_ready
|
|
837
|
+
? "\u5df2\u751f\u6210 learning candidate\uff0c\u4f46\u8fd8\u9700\u8865\u5145\u8bc1\u636e\u6216\u4eba\u5de5\u5ba1\u9605\u540e\u624d\u9002\u5408\u63a8\u8fdb\u3002"
|
|
838
|
+
: "\u5c1a\u672a\u4e3a\u5f53\u524d\u4ea4\u4ed8\u751f\u6210 learning candidate \u8bb0\u5f55\u3002";
|
|
839
|
+
const readinessCards = [
|
|
840
|
+
readinessCard("\u8d28\u91cf\u95e8\u7981", qualityVerdict + " " + (quality.grade || "") + " " + (quality.score ?? "-"), (quality.errors ?? 0) + " errors / " + (quality.warnings ?? 0) + " warnings", findingItems, qualityState),
|
|
841
|
+
readinessCard("\u4e8b\u5b9e\u6838\u67e5", factVerdict + " " + (fact.score ?? "-"), (fact.errors ?? 0) + " errors / " + (fact.warnings ?? 0) + " warnings; unverified=" + ((fact.unverified_claims || []).length ?? 0), [], factState),
|
|
842
|
+
readinessCard("\u6587\u732e\u8bc4\u8ff0\u6765\u6e90", "agent " + (evidence.agent_cache_count ?? 0) + " / llm " + (evidence.llm_count ?? 0) + " / rule " + (evidence.rule_based_count ?? 0), evidence.upgrade_needed ? "\u5f53\u524d\u4ecd\u542b\u89c4\u5219\u56de\u9000\u8bc4\u8ff0\uff0c\u5efa\u8bae\u8fd0\u884c Agent/LLM \u5347\u7ea7\u3002" : "\u5df2\u5177\u5907 Agent/LLM \u6df1\u5ea6\u8bc4\u8ff0\u4fe1\u53f7\u3002", reviewItems, reviewState),
|
|
843
|
+
readinessCard("ZIP 自检", packageValue, packageNote, packageItems, packageState),
|
|
844
|
+
readinessCard("\u8bb0\u5fc6\u64ad\u79cd", memoryValue, memoryNote, memoryItems, memoryState),
|
|
845
|
+
readinessCard("\u5b66\u4e60\u6c89\u6dc0", learningValue, learningNote, learningItems, learningState),
|
|
846
|
+
readinessCard("\u8bc1\u636e\u4e0e\u4e0b\u4e00\u6b65\u5ba1\u9605", sources, "\u6587\u732e\u5bcc\u5316\u72b6\u6001\u4e0e\u5fc5\u8981\u4eba\u5de5\u5ba1\u9605\u4e8b\u9879", evidenceItems.concat(todo), todo.length ? "warning" : "pass"),
|
|
847
|
+
];
|
|
848
|
+
el.innerHTML = readinessCards.join("");
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
function renderStatus(status) {
|
|
852
|
+
currentStatus = status;
|
|
853
|
+
const runStatus = status.status || "idle";
|
|
854
|
+
const completedCount = Object.values(status.stages || {}).filter(s => s.status === "completed").length;
|
|
855
|
+
const s4 = status.stages?.stage4?.metrics || {};
|
|
856
|
+
const s3 = status.stages?.stage3?.metrics || {};
|
|
857
|
+
document.getElementById("runStatusPill").className = "status-pill " + runStatus;
|
|
858
|
+
document.getElementById("runStatusPill").textContent = runStatus;
|
|
859
|
+
document.getElementById("currentStageText").className = "status-pill " + runStatus;
|
|
860
|
+
document.getElementById("currentStageText").textContent = status.current_stage_label || "\u7b49\u5f85\u542f\u52a8";
|
|
861
|
+
document.getElementById("metaTarget").textContent = status.target || "-";
|
|
862
|
+
document.getElementById("metaDisease").textContent = status.disease || "-";
|
|
863
|
+
document.getElementById("metaRunId").textContent = status.run_id || "-";
|
|
864
|
+
document.getElementById("metaUpdated").textContent = status.updated_at ? new Date(status.updated_at).toLocaleString() : "-";
|
|
865
|
+
document.getElementById("metricProgress").textContent = (status.progress_percent || 0) + "%";
|
|
866
|
+
document.getElementById("metricCompleted").textContent = completedCount + " / 4";
|
|
867
|
+
document.getElementById("metricSuccessRate").textContent = s4.success_rate || "-";
|
|
868
|
+
document.getElementById("metricTrials").textContent = s3.trial_count || "-";
|
|
869
|
+
const manuscriptQuality = status.summary?.quality_gate || null;
|
|
870
|
+
const qualityVerdict = manuscriptQuality?.passed === true
|
|
871
|
+
? "PASS"
|
|
872
|
+
: manuscriptQuality?.passed === false
|
|
873
|
+
? "FAIL"
|
|
874
|
+
: "UNKNOWN";
|
|
875
|
+
const qualityText = manuscriptQuality
|
|
876
|
+
? qualityVerdict + " " + (manuscriptQuality.score ?? "-")
|
|
877
|
+
: "-";
|
|
878
|
+
const qualityMetricEl = document.getElementById("metricManuscriptQuality");
|
|
879
|
+
if (qualityMetricEl) qualityMetricEl.textContent = qualityText;
|
|
880
|
+
const factCheck = status.summary?.fact_check || null;
|
|
881
|
+
const factVerdict = factCheck?.passed === true
|
|
882
|
+
? "PASS"
|
|
883
|
+
: factCheck?.passed === false
|
|
884
|
+
? "FAIL"
|
|
885
|
+
: "UNKNOWN";
|
|
886
|
+
const factText = factCheck
|
|
887
|
+
? factVerdict + " " + (factCheck.score ?? "-")
|
|
888
|
+
: "-";
|
|
889
|
+
const factMetricEl = document.getElementById("metricFactCheck");
|
|
890
|
+
if (factMetricEl) factMetricEl.textContent = factText;
|
|
891
|
+
const packageReady = Boolean(status.artifacts?.delivery_package || status.summary?.delivery_package);
|
|
892
|
+
const packageAudit = status.summary?.package_audit || {};
|
|
893
|
+
const packageMetricEl = document.getElementById("metricDeliveryPackage");
|
|
894
|
+
if (packageMetricEl) packageMetricEl.textContent = !packageReady
|
|
895
|
+
? "-"
|
|
896
|
+
: packageAudit?.passed === true
|
|
897
|
+
? "PASS"
|
|
898
|
+
: packageAudit?.passed === false
|
|
899
|
+
? "FAIL"
|
|
900
|
+
: "READY";
|
|
901
|
+
document.getElementById("globalProgressFill").style.width = (status.progress_percent || 0) + "%";
|
|
902
|
+
renderMedicalResearchOs(status);
|
|
903
|
+
renderDeliveryReadiness(status);
|
|
904
|
+
renderStages(status);
|
|
905
|
+
renderLogs(status.logs || []);
|
|
906
|
+
runButtonEl.disabled = runStatus === "running";
|
|
907
|
+
if (runStatus === "completed") {
|
|
908
|
+
loadFiles();
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
function renderReportSummary(cards) {
|
|
913
|
+
const el = document.getElementById("reportSummary");
|
|
914
|
+
if (!cards || !cards.length) { el.innerHTML = ""; return; }
|
|
915
|
+
el.innerHTML = cards.map(card =>
|
|
916
|
+
'<div class="summary-card"><div class="label">' + escapeHtml(card.label) + '</div><div class="value">' + escapeHtml(card.value) + '</div></div>'
|
|
917
|
+
).join("");
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
function renderReportNav(sections) {
|
|
921
|
+
const nav = document.getElementById("reportNav");
|
|
922
|
+
nav.innerHTML = sections.map(section => {
|
|
923
|
+
const missing = !section.path;
|
|
924
|
+
const cls = "report-nav-btn" + (activeReportSection === section.id ? " active" : "") + (missing ? " missing" : "");
|
|
925
|
+
return '<button type="button" class="' + cls + '" data-section="' + section.id + '" ' + (missing ? 'disabled' : '') + '>'
|
|
926
|
+
+ escapeHtml(section.title_zh)
|
|
927
|
+
+ '<small>' + escapeHtml(section.subtitle_zh || "") + '</small></button>';
|
|
928
|
+
}).join("");
|
|
929
|
+
nav.querySelectorAll(".report-nav-btn:not(.missing)").forEach(btn => {
|
|
930
|
+
btn.addEventListener("click", () => showReportSection(btn.dataset.section));
|
|
931
|
+
});
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
async function showReportSection(sectionId) {
|
|
935
|
+
if (!reportBundle) return;
|
|
936
|
+
const section = (reportBundle.sections || []).find(s => s.id === sectionId);
|
|
937
|
+
if (!section || !section.path) return;
|
|
938
|
+
activeReportSection = sectionId;
|
|
939
|
+
renderReportNav(reportBundle.sections || []);
|
|
940
|
+
const reportEl = document.getElementById("reportContent");
|
|
941
|
+
reportEl.innerHTML = '<div class="preview-text">加载中...</div>';
|
|
942
|
+
try {
|
|
943
|
+
if (section.kind === "html") {
|
|
944
|
+
reportEl.innerHTML = '<iframe class="preview-frame" style="min-height:560px;" src="/api/download?inline=1&path=' + encodeURIComponent(section.path) + '"></iframe>';
|
|
945
|
+
return;
|
|
946
|
+
}
|
|
947
|
+
const resp = await fetch("/api/artifact?path=" + encodeURIComponent(section.path));
|
|
948
|
+
if (!resp.ok) throw new Error("无法读取汇报文件");
|
|
949
|
+
const text = await resp.text();
|
|
950
|
+
if (window.marked) {
|
|
951
|
+
renderMarkdownInto(reportEl, text, section.path);
|
|
952
|
+
} else {
|
|
953
|
+
reportEl.innerHTML = '<div class="preview-text">' + escapeHtml(text) + '</div>';
|
|
954
|
+
}
|
|
955
|
+
} catch (error) {
|
|
956
|
+
reportEl.innerHTML = '<div class="preview-text" style="color:var(--fail);">加载失败:' + escapeHtml(error.message) + '</div>';
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
async function loadReports() {
|
|
961
|
+
const layout = document.getElementById("reportLayout");
|
|
962
|
+
const empty = document.getElementById("reportEmpty");
|
|
963
|
+
try {
|
|
964
|
+
const resp = await fetch("/api/reports");
|
|
965
|
+
if (!resp.ok) throw new Error("无法加载汇报");
|
|
966
|
+
reportBundle = await resp.json();
|
|
967
|
+
if (!reportBundle.available) {
|
|
968
|
+
layout.style.display = "none";
|
|
969
|
+
empty.style.display = "block";
|
|
970
|
+
renderReportSummary([]);
|
|
971
|
+
return;
|
|
972
|
+
}
|
|
973
|
+
empty.style.display = "none";
|
|
974
|
+
layout.style.display = "grid";
|
|
975
|
+
renderReportSummary(reportBundle.summary_cards || []);
|
|
976
|
+
const first = (reportBundle.sections || []).find(s => s.path && s.id === "manuscript")
|
|
977
|
+
|| (reportBundle.sections || []).find(s => s.path);
|
|
978
|
+
activeReportSection = first ? first.id : null;
|
|
979
|
+
renderReportNav(reportBundle.sections || []);
|
|
980
|
+
if (first) await showReportSection(first.id);
|
|
981
|
+
} catch (error) {
|
|
982
|
+
layout.style.display = "none";
|
|
983
|
+
empty.style.display = "block";
|
|
984
|
+
empty.querySelector("p").textContent = "加载汇报失败:" + error.message;
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
function escapeHtml(text) {
|
|
989
|
+
return String(text).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
function escapeAttr(text) {
|
|
993
|
+
return escapeHtml(text).replace(/"/g,'"').replace(/'/g,''');
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
function renderMarkdownInto(container, markdown, artifactPath) {
|
|
997
|
+
if (!window.marked) {
|
|
998
|
+
container.innerHTML = '<div class="preview-text">' + escapeHtml(markdown) + '</div>';
|
|
999
|
+
return;
|
|
1000
|
+
}
|
|
1001
|
+
container.innerHTML = marked.parse(markdown);
|
|
1002
|
+
rewriteArtifactRelativeUrls(container, artifactPath);
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
function formatMetricValue(value, format) {
|
|
1006
|
+
if (value === undefined || value === null || value === "") return "—";
|
|
1007
|
+
if (format === "percent") return (Number(value) * 100).toFixed(2) + "%";
|
|
1008
|
+
if (format === "score") return Number(value).toFixed(3);
|
|
1009
|
+
if (format === "money") return "$" + Number(value).toFixed(1) + "M";
|
|
1010
|
+
if (format === "months") return Number(value) + " 个月";
|
|
1011
|
+
if (format === "bool") return value ? "是" : "否";
|
|
1012
|
+
if (format === "rank") return "第 " + value + " 名";
|
|
1013
|
+
if (format === "phase") return "Phase " + value;
|
|
1014
|
+
return String(value);
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
function renderFileCard(item) {
|
|
1018
|
+
const sizeKB = (item.size / 1024).toFixed(1);
|
|
1019
|
+
const badgeCls = {".json":"badge-json",".md":"badge-md",".html":"badge-html",".pdf":"badge-pdf",".docx":"badge-docx"}[item.suffix] || "";
|
|
1020
|
+
const previewBtn = item.previewable
|
|
1021
|
+
? '<button class="btn-secondary" type="button" data-action="preview" data-path="' + escapeHtml(item.path) + '" data-title="' + escapeHtml(item.title_zh) + '">预览</button>'
|
|
1022
|
+
: '';
|
|
1023
|
+
return '<article class="file-card">'
|
|
1024
|
+
+ '<div><span class="badge ' + badgeCls + '">' + escapeHtml(item.category_label || item.category || '') + '</span></div>'
|
|
1025
|
+
+ '<div class="file-title">' + escapeHtml(item.title_zh || item.filename) + '</div>'
|
|
1026
|
+
+ '<div class="file-desc">' + escapeHtml(item.description_zh || '') + '</div>'
|
|
1027
|
+
+ '<div class="file-meta">' + sizeKB + ' KB · ' + escapeHtml(item.filename) + '</div>'
|
|
1028
|
+
+ '<div class="file-actions">' + previewBtn
|
|
1029
|
+
+ '<a class="btn-download" href="/api/download?path=' + encodeURIComponent(item.path) + '">下载</a></div>'
|
|
1030
|
+
+ '</article>';
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
// Files tab
|
|
1034
|
+
async function loadFiles() {
|
|
1035
|
+
const fileGrid = document.getElementById("fileGrid");
|
|
1036
|
+
const advancedGrid = document.getElementById("advancedGrid");
|
|
1037
|
+
const advancedToggle = document.getElementById("advancedToggle");
|
|
1038
|
+
try {
|
|
1039
|
+
const resp = await fetch("/api/artifacts");
|
|
1040
|
+
if (!resp.ok) { fileGrid.innerHTML = '<div class="empty-state"><p>无法获取文件列表</p></div>'; return; }
|
|
1041
|
+
const data = await resp.json();
|
|
1042
|
+
const deliverables = data.deliverables || [];
|
|
1043
|
+
const advanced = data.advanced || [];
|
|
1044
|
+
const scopeNote = document.getElementById("filesScopeNote");
|
|
1045
|
+
if (data.current_target) {
|
|
1046
|
+
scopeNote.textContent = "当前任务:" + data.current_target + " / " + (data.current_disease || "—") + "。以下仅展示该任务的核心交付物。";
|
|
1047
|
+
}
|
|
1048
|
+
if (!deliverables.length) {
|
|
1049
|
+
fileGrid.innerHTML = '<div class="empty-state"><div class="icon">📁</div><p>暂无交付文件,请先完成一次完整分析</p></div>';
|
|
1050
|
+
} else {
|
|
1051
|
+
fileGrid.innerHTML = deliverables.map(renderFileCard).join("");
|
|
1052
|
+
}
|
|
1053
|
+
if (advanced.length) {
|
|
1054
|
+
advancedToggle.style.display = "block";
|
|
1055
|
+
advancedToggle.textContent = advancedGrid.classList.contains("open") ? "收起高级数据文件" : "展开高级数据文件(" + advanced.length + ")";
|
|
1056
|
+
advancedGrid.innerHTML = advanced.map(renderFileCard).join("");
|
|
1057
|
+
} else {
|
|
1058
|
+
advancedToggle.style.display = "none";
|
|
1059
|
+
advancedGrid.innerHTML = "";
|
|
1060
|
+
}
|
|
1061
|
+
bindFileActions();
|
|
1062
|
+
} catch(e) {
|
|
1063
|
+
fileGrid.innerHTML = '<div class="empty-state"><p>加载文件列表失败</p></div>';
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
function bindFileActions() {
|
|
1068
|
+
document.querySelectorAll('[data-action="preview"]').forEach(btn => {
|
|
1069
|
+
btn.addEventListener('click', () => previewFile(btn.dataset.path, btn.dataset.title));
|
|
1070
|
+
});
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
function renderJsonSummary(rows) {
|
|
1074
|
+
if (!rows || !rows.length) return "";
|
|
1075
|
+
return '<div class="json-summary">' + rows.map(row =>
|
|
1076
|
+
'<div class="json-summary-item"><div class="label">' + escapeHtml(row.label) + '</div><div class="value">' + escapeHtml(row.value) + '</div></div>'
|
|
1077
|
+
).join("") + '</div>';
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1080
|
+
async function previewFile(path, title) {
|
|
1081
|
+
const modal = document.getElementById("previewModal");
|
|
1082
|
+
const body = document.getElementById("previewBody");
|
|
1083
|
+
document.getElementById("previewTitle").textContent = title || "文件预览";
|
|
1084
|
+
body.innerHTML = '<div class="preview-text">加载中...</div>';
|
|
1085
|
+
modal.classList.add("open");
|
|
1086
|
+
try {
|
|
1087
|
+
const suffix = path.split('.').pop().toLowerCase();
|
|
1088
|
+
if (["html", "pdf"].includes(suffix)) {
|
|
1089
|
+
body.innerHTML = '<iframe class="preview-frame" src="/api/download?inline=1&path=' + encodeURIComponent(path) + '"></iframe>';
|
|
1090
|
+
return;
|
|
1091
|
+
}
|
|
1092
|
+
if (["png", "svg", "jpg", "jpeg", "gif", "webp"].includes(suffix)) {
|
|
1093
|
+
body.innerHTML = '<div class="preview-image-shell"><img class="preview-image" alt="' + escapeHtml(title || path.split('/').pop() || 'preview') + '" src="/api/download?inline=1&path=' + encodeURIComponent(path) + '"></div>';
|
|
1094
|
+
return;
|
|
1095
|
+
}
|
|
1096
|
+
const resp = await fetch("/api/artifact?path=" + encodeURIComponent(path));
|
|
1097
|
+
if (!resp.ok) throw new Error("无法读取文件");
|
|
1098
|
+
const text = await resp.text();
|
|
1099
|
+
if (suffix === "json") {
|
|
1100
|
+
const parsed = JSON.parse(text);
|
|
1101
|
+
const pretty = JSON.stringify(parsed, null, 2);
|
|
1102
|
+
let summaryHtml = "";
|
|
1103
|
+
try {
|
|
1104
|
+
const sumResp = await fetch("/api/preview-summary?path=" + encodeURIComponent(path));
|
|
1105
|
+
if (sumResp.ok) {
|
|
1106
|
+
const sumData = await sumResp.json();
|
|
1107
|
+
summaryHtml = renderJsonSummary(sumData.rows || []);
|
|
1108
|
+
}
|
|
1109
|
+
} catch (_) {}
|
|
1110
|
+
body.innerHTML = summaryHtml
|
|
1111
|
+
+ '<div class="raw-toggle" data-toggle="raw">展开原始 JSON</div>'
|
|
1112
|
+
+ '<pre class="raw-json" id="rawJsonBlock">' + escapeHtml(pretty) + '</pre>';
|
|
1113
|
+
body.querySelector("[data-toggle='raw']").addEventListener("click", (e) => {
|
|
1114
|
+
const block = document.getElementById("rawJsonBlock");
|
|
1115
|
+
const open = block.classList.toggle("open");
|
|
1116
|
+
e.target.textContent = open ? "收起原始 JSON" : "展开原始 JSON";
|
|
1117
|
+
});
|
|
1118
|
+
return;
|
|
1119
|
+
}
|
|
1120
|
+
if (suffix === "md" && window.marked) {
|
|
1121
|
+
body.innerHTML = '<div class="report-view"></div>';
|
|
1122
|
+
renderMarkdownInto(body.querySelector(".report-view"), text, path);
|
|
1123
|
+
return;
|
|
1124
|
+
}
|
|
1125
|
+
body.innerHTML = '<div class="preview-text">' + escapeHtml(text) + '</div>';
|
|
1126
|
+
} catch (error) {
|
|
1127
|
+
body.innerHTML = '<div class="preview-text" style="color:var(--fail);">预览失败:' + escapeHtml(error.message) + '</div>';
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
document.getElementById("previewClose").addEventListener("click", () => {
|
|
1132
|
+
document.getElementById("previewModal").classList.remove("open");
|
|
1133
|
+
document.getElementById("previewBody").innerHTML = "";
|
|
1134
|
+
});
|
|
1135
|
+
document.getElementById("previewModal").addEventListener("click", event => {
|
|
1136
|
+
if (event.target.id === "previewModal") {
|
|
1137
|
+
document.getElementById("previewModal").classList.remove("open");
|
|
1138
|
+
}
|
|
1139
|
+
});
|
|
1140
|
+
document.getElementById("advancedToggle").addEventListener("click", () => {
|
|
1141
|
+
const grid = document.getElementById("advancedGrid");
|
|
1142
|
+
const toggle = document.getElementById("advancedToggle");
|
|
1143
|
+
grid.classList.toggle("open");
|
|
1144
|
+
toggle.textContent = grid.classList.contains("open")
|
|
1145
|
+
? "收起高级数据文件"
|
|
1146
|
+
: "展开高级数据文件(" + grid.children.length + ")";
|
|
1147
|
+
});
|
|
1148
|
+
|
|
1149
|
+
let compareChartInstance = null;
|
|
1150
|
+
|
|
1151
|
+
// Compare tab
|
|
1152
|
+
async function loadComparison() {
|
|
1153
|
+
const el = document.getElementById("compareContent");
|
|
1154
|
+
try {
|
|
1155
|
+
const resp = await fetch("/api/compare");
|
|
1156
|
+
if (!resp.ok) throw new Error("无法加载对比数据");
|
|
1157
|
+
const data = await resp.json();
|
|
1158
|
+
const profiles = data.profiles || [];
|
|
1159
|
+
if (!profiles.length) {
|
|
1160
|
+
el.innerHTML = '<div class="empty-state"><div class="icon">📈</div><p>暂无可对比靶点,请先完成分析</p></div>';
|
|
1161
|
+
return;
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
let html = '<div class="compare-summary">' + escapeHtml(data.recommendation || "") + '</div>';
|
|
1165
|
+
html += '<table><tr><th>对比指标</th>';
|
|
1166
|
+
profiles.forEach(p => html += '<th>' + escapeHtml(p.target) + '<br><span style="font-weight:400;color:var(--muted);font-size:12px;">' + escapeHtml(p.disease) + '</span></th>');
|
|
1167
|
+
html += '</tr>';
|
|
1168
|
+
|
|
1169
|
+
(data.rows || []).forEach(row => {
|
|
1170
|
+
html += '<tr><td>' + escapeHtml(row.label_zh) + '</td>';
|
|
1171
|
+
profiles.forEach(profile => {
|
|
1172
|
+
const bucket = profile.metrics[row.stage] || {};
|
|
1173
|
+
html += '<td>' + formatMetricValue(bucket[row.key], row.format) + '</td>';
|
|
1174
|
+
});
|
|
1175
|
+
html += '</tr>';
|
|
1176
|
+
});
|
|
1177
|
+
html += '</table>';
|
|
1178
|
+
|
|
1179
|
+
if (profiles.length >= 2) {
|
|
1180
|
+
html += '<h3 style="margin-top:20px;">成药性 vs 整体成功率</h3><div class="chart-container"><canvas id="compareChart"></canvas></div>';
|
|
1181
|
+
}
|
|
1182
|
+
el.innerHTML = html;
|
|
1183
|
+
|
|
1184
|
+
if (profiles.length >= 2 && window.Chart) {
|
|
1185
|
+
if (compareChartInstance) compareChartInstance.destroy();
|
|
1186
|
+
const labels = profiles.map(p => p.target + " / " + p.disease);
|
|
1187
|
+
const drugScores = profiles.map(p => Number((p.metrics.stage2 || {}).target_druggability || (p.metrics.stage4 || {}).druggability_score || 0));
|
|
1188
|
+
const successRates = profiles.map(p => Number((p.metrics.stage4 || {}).overall_success_rate || 0) * 100);
|
|
1189
|
+
compareChartInstance = new Chart(document.getElementById('compareChart'), {
|
|
1190
|
+
type: 'bar',
|
|
1191
|
+
data: {
|
|
1192
|
+
labels,
|
|
1193
|
+
datasets: [
|
|
1194
|
+
{ label: '成药性评分', data: drugScores, backgroundColor: '#0f766e', borderRadius: 4 },
|
|
1195
|
+
{ label: '整体成功率(%)', data: successRates, backgroundColor: '#d97706', borderRadius: 4 },
|
|
1196
|
+
]
|
|
1197
|
+
},
|
|
1198
|
+
options: {
|
|
1199
|
+
responsive: true, maintainAspectRatio: false,
|
|
1200
|
+
plugins: { legend: { position: 'top' } },
|
|
1201
|
+
scales: { y: { beginAtZero: true } }
|
|
1202
|
+
}
|
|
1203
|
+
});
|
|
1204
|
+
}
|
|
1205
|
+
} catch (error) {
|
|
1206
|
+
el.innerHTML = '<div class="empty-state"><p>加载对比数据失败:' + escapeHtml(error.message) + '</p></div>';
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
// Fetch status
|
|
1211
|
+
async function fetchStatus() {
|
|
1212
|
+
try {
|
|
1213
|
+
const response = await fetch("/api/status");
|
|
1214
|
+
const data = await response.json();
|
|
1215
|
+
renderStatus(data);
|
|
1216
|
+
} catch (error) {
|
|
1217
|
+
formMessageEl.textContent = "Status fetch failed: " + error.message;
|
|
1218
|
+
}
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
// Run form
|
|
1222
|
+
document.getElementById("runForm").addEventListener("submit", async event => {
|
|
1223
|
+
event.preventDefault();
|
|
1224
|
+
const formData = new FormData(event.target);
|
|
1225
|
+
const payload = Object.fromEntries(formData.entries());
|
|
1226
|
+
formMessageEl.textContent = "Starting local pipeline...";
|
|
1227
|
+
try {
|
|
1228
|
+
const response = await fetch("/api/run", { method: "POST", headers: {"Content-Type":"application/json"}, body: JSON.stringify(payload) });
|
|
1229
|
+
const data = await response.json();
|
|
1230
|
+
if (!response.ok || !data.ok) { formMessageEl.textContent = data.error || "Unable to start pipeline."; return; }
|
|
1231
|
+
formMessageEl.textContent = "Pipeline started. Run ID: " + data.run_id;
|
|
1232
|
+
fetchStatus();
|
|
1233
|
+
} catch (error) { formMessageEl.textContent = "Start failed: " + error.message; }
|
|
1234
|
+
});
|
|
1235
|
+
|
|
1236
|
+
async function submitMemoryReviewAction(button) {
|
|
1237
|
+
const action = button.dataset.memoryReviewAction || "";
|
|
1238
|
+
const candidateId = button.dataset.candidateId || "";
|
|
1239
|
+
const reasonDefaults = {
|
|
1240
|
+
approve: "quality/fact/package evidence reviewed",
|
|
1241
|
+
reject: "insufficient or unsafe evidence",
|
|
1242
|
+
stale: "newer evidence may supersede this candidate",
|
|
1243
|
+
restore: "fresh evidence added for renewed review",
|
|
1244
|
+
};
|
|
1245
|
+
const reason = window.prompt("Memory review reason: " + action, reasonDefaults[action] || "");
|
|
1246
|
+
if (reason === null) return;
|
|
1247
|
+
reviewActionInFlight = true;
|
|
1248
|
+
formMessageEl.textContent = "Submitting Memory Brain review: " + action + " / " + candidateId;
|
|
1249
|
+
fetchStatus();
|
|
1250
|
+
try {
|
|
1251
|
+
const response = await fetch("/api/memory-review", {
|
|
1252
|
+
method: "POST",
|
|
1253
|
+
headers: {"Content-Type":"application/json"},
|
|
1254
|
+
body: JSON.stringify({
|
|
1255
|
+
action,
|
|
1256
|
+
candidate_id: candidateId,
|
|
1257
|
+
reviewer: "18766-dashboard",
|
|
1258
|
+
reason,
|
|
1259
|
+
}),
|
|
1260
|
+
});
|
|
1261
|
+
const data = await response.json();
|
|
1262
|
+
if (!response.ok || !data.ok) {
|
|
1263
|
+
formMessageEl.textContent = data.error || "Memory review failed.";
|
|
1264
|
+
return;
|
|
1265
|
+
}
|
|
1266
|
+
formMessageEl.textContent = "Memory review updated: " + (data.status || action);
|
|
1267
|
+
} catch (error) {
|
|
1268
|
+
formMessageEl.textContent = "Memory review failed: " + error.message;
|
|
1269
|
+
} finally {
|
|
1270
|
+
reviewActionInFlight = false;
|
|
1271
|
+
fetchStatus();
|
|
1272
|
+
}
|
|
1273
|
+
}
|
|
1274
|
+
|
|
1275
|
+
document.addEventListener("click", event => {
|
|
1276
|
+
const button = event.target.closest("[data-memory-review-action]");
|
|
1277
|
+
if (!button) return;
|
|
1278
|
+
event.preventDefault();
|
|
1279
|
+
if (reviewActionInFlight || button.disabled) return;
|
|
1280
|
+
submitMemoryReviewAction(button);
|
|
1281
|
+
});
|
|
1282
|
+
|
|
1283
|
+
// Init
|
|
1284
|
+
fetchStatus();
|
|
1285
|
+
setInterval(fetchStatus, 2000);
|
|
1286
|
+
document.querySelector('[data-tab="compare"]').addEventListener('click', loadComparison);
|
|
1287
|
+
document.querySelector('[data-tab="files"]').addEventListener('click', loadFiles);
|
|
1288
|
+
document.querySelector('[data-tab="reports"]').addEventListener('click', loadReports);
|
|
1289
|
+
document.getElementById("reportRefresh").addEventListener("click", loadReports);
|
|
1290
|
+
</script>
|
|
1291
|
+
</body>
|
|
1292
|
+
</html>
|