@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.
Files changed (1104) hide show
  1. package/.scale/mcp-servers.yaml +144 -0
  2. package/.scale/skills.json +830 -0
  3. package/.scale/verification.json +52 -0
  4. package/LICENSE +15 -0
  5. package/README.en.md +156 -0
  6. package/README.md +156 -0
  7. package/dist/adapters/AiderAdapter.d.ts +22 -0
  8. package/dist/adapters/AiderAdapter.js +262 -0
  9. package/dist/adapters/AiderAdapter.js.map +1 -0
  10. package/dist/adapters/AntigravityAdapter.d.ts +4 -0
  11. package/dist/adapters/AntigravityAdapter.js +21 -0
  12. package/dist/adapters/AntigravityAdapter.js.map +1 -0
  13. package/dist/adapters/ClaudeCodeAdapter.d.ts +54 -0
  14. package/dist/adapters/ClaudeCodeAdapter.js +185 -0
  15. package/dist/adapters/ClaudeCodeAdapter.js.map +1 -0
  16. package/dist/adapters/ClineAdapter.d.ts +4 -0
  17. package/dist/adapters/ClineAdapter.js +20 -0
  18. package/dist/adapters/ClineAdapter.js.map +1 -0
  19. package/dist/adapters/CodexAdapter.d.ts +15 -0
  20. package/dist/adapters/CodexAdapter.js +160 -0
  21. package/dist/adapters/CodexAdapter.js.map +1 -0
  22. package/dist/adapters/CursorAdapter.d.ts +14 -0
  23. package/dist/adapters/CursorAdapter.js +171 -0
  24. package/dist/adapters/CursorAdapter.js.map +1 -0
  25. package/dist/adapters/DeepSeekTuiAdapter.d.ts +19 -0
  26. package/dist/adapters/DeepSeekTuiAdapter.js +263 -0
  27. package/dist/adapters/DeepSeekTuiAdapter.js.map +1 -0
  28. package/dist/adapters/DoubaoAdapter.d.ts +14 -0
  29. package/dist/adapters/DoubaoAdapter.js +184 -0
  30. package/dist/adapters/DoubaoAdapter.js.map +1 -0
  31. package/dist/adapters/GeminiAdapter.d.ts +14 -0
  32. package/dist/adapters/GeminiAdapter.js +163 -0
  33. package/dist/adapters/GeminiAdapter.js.map +1 -0
  34. package/dist/adapters/GenericProjectAgentAdapter.d.ts +29 -0
  35. package/dist/adapters/GenericProjectAgentAdapter.js +204 -0
  36. package/dist/adapters/GenericProjectAgentAdapter.js.map +1 -0
  37. package/dist/adapters/HermesAdapter.d.ts +14 -0
  38. package/dist/adapters/HermesAdapter.js +163 -0
  39. package/dist/adapters/HermesAdapter.js.map +1 -0
  40. package/dist/adapters/JCodeAdapter.d.ts +4 -0
  41. package/dist/adapters/JCodeAdapter.js +19 -0
  42. package/dist/adapters/JCodeAdapter.js.map +1 -0
  43. package/dist/adapters/KiloCodeAdapter.d.ts +4 -0
  44. package/dist/adapters/KiloCodeAdapter.js +20 -0
  45. package/dist/adapters/KiloCodeAdapter.js.map +1 -0
  46. package/dist/adapters/KimiAdapter.d.ts +14 -0
  47. package/dist/adapters/KimiAdapter.js +183 -0
  48. package/dist/adapters/KimiAdapter.js.map +1 -0
  49. package/dist/adapters/KiroAdapter.d.ts +14 -0
  50. package/dist/adapters/KiroAdapter.js +180 -0
  51. package/dist/adapters/KiroAdapter.js.map +1 -0
  52. package/dist/adapters/OpenClawAdapter.d.ts +14 -0
  53. package/dist/adapters/OpenClawAdapter.js +163 -0
  54. package/dist/adapters/OpenClawAdapter.js.map +1 -0
  55. package/dist/adapters/OpenCodeAdapter.d.ts +14 -0
  56. package/dist/adapters/OpenCodeAdapter.js +172 -0
  57. package/dist/adapters/OpenCodeAdapter.js.map +1 -0
  58. package/dist/adapters/QCoderAdapter.d.ts +14 -0
  59. package/dist/adapters/QCoderAdapter.js +159 -0
  60. package/dist/adapters/QCoderAdapter.js.map +1 -0
  61. package/dist/adapters/QoderAdapter.d.ts +4 -0
  62. package/dist/adapters/QoderAdapter.js +21 -0
  63. package/dist/adapters/QoderAdapter.js.map +1 -0
  64. package/dist/adapters/TraeAdapter.d.ts +14 -0
  65. package/dist/adapters/TraeAdapter.js +159 -0
  66. package/dist/adapters/TraeAdapter.js.map +1 -0
  67. package/dist/adapters/VSCAdapter.d.ts +14 -0
  68. package/dist/adapters/VSCAdapter.js +159 -0
  69. package/dist/adapters/VSCAdapter.js.map +1 -0
  70. package/dist/adapters/WindsurfAdapter.d.ts +14 -0
  71. package/dist/adapters/WindsurfAdapter.js +185 -0
  72. package/dist/adapters/WindsurfAdapter.js.map +1 -0
  73. package/dist/adapters/WorkBuddyAdapter.d.ts +14 -0
  74. package/dist/adapters/WorkBuddyAdapter.js +159 -0
  75. package/dist/adapters/WorkBuddyAdapter.js.map +1 -0
  76. package/dist/adapters/index.d.ts +32 -0
  77. package/dist/adapters/index.js +87 -0
  78. package/dist/adapters/index.js.map +1 -0
  79. package/dist/agents/AgentChannel.d.ts +43 -0
  80. package/dist/agents/AgentChannel.js +136 -0
  81. package/dist/agents/AgentChannel.js.map +1 -0
  82. package/dist/agents/AgentCoordinator.d.ts +29 -0
  83. package/dist/agents/AgentCoordinator.js +136 -0
  84. package/dist/agents/AgentCoordinator.js.map +1 -0
  85. package/dist/agents/AgentDispatcher.d.ts +24 -0
  86. package/dist/agents/AgentDispatcher.js +112 -0
  87. package/dist/agents/AgentDispatcher.js.map +1 -0
  88. package/dist/agents/AgentManager.d.ts +14 -0
  89. package/dist/agents/AgentManager.js +85 -0
  90. package/dist/agents/AgentManager.js.map +1 -0
  91. package/dist/agents/AgentPool.d.ts +59 -0
  92. package/dist/agents/AgentPool.js +192 -0
  93. package/dist/agents/AgentPool.js.map +1 -0
  94. package/dist/agents/AgentRegistry.d.ts +20 -0
  95. package/dist/agents/AgentRegistry.js +36 -0
  96. package/dist/agents/AgentRegistry.js.map +1 -0
  97. package/dist/agents/AgentSourceLoader.d.ts +73 -0
  98. package/dist/agents/AgentSourceLoader.js +103 -0
  99. package/dist/agents/AgentSourceLoader.js.map +1 -0
  100. package/dist/agents/IAgent.d.ts +53 -0
  101. package/dist/agents/IAgent.js +4 -0
  102. package/dist/agents/IAgent.js.map +1 -0
  103. package/dist/agents/LeadershipPresets.d.ts +16 -0
  104. package/dist/agents/LeadershipPresets.js +152 -0
  105. package/dist/agents/LeadershipPresets.js.map +1 -0
  106. package/dist/agents/definitions/debugger.d.ts +2 -0
  107. package/dist/agents/definitions/debugger.js +6 -0
  108. package/dist/agents/definitions/debugger.js.map +1 -0
  109. package/dist/agents/definitions/doc-writer.d.ts +2 -0
  110. package/dist/agents/definitions/doc-writer.js +6 -0
  111. package/dist/agents/definitions/doc-writer.js.map +1 -0
  112. package/dist/agents/definitions/implementer.d.ts +2 -0
  113. package/dist/agents/definitions/implementer.js +6 -0
  114. package/dist/agents/definitions/implementer.js.map +1 -0
  115. package/dist/agents/definitions/planner.d.ts +2 -0
  116. package/dist/agents/definitions/planner.js +6 -0
  117. package/dist/agents/definitions/planner.js.map +1 -0
  118. package/dist/agents/definitions/researcher.d.ts +2 -0
  119. package/dist/agents/definitions/researcher.js +6 -0
  120. package/dist/agents/definitions/researcher.js.map +1 -0
  121. package/dist/agents/definitions/reviewer.d.ts +2 -0
  122. package/dist/agents/definitions/reviewer.js +6 -0
  123. package/dist/agents/definitions/reviewer.js.map +1 -0
  124. package/dist/agents/definitions/security.d.ts +2 -0
  125. package/dist/agents/definitions/security.js +6 -0
  126. package/dist/agents/definitions/security.js.map +1 -0
  127. package/dist/agents/definitions/tester.d.ts +2 -0
  128. package/dist/agents/definitions/tester.js +6 -0
  129. package/dist/agents/definitions/tester.js.map +1 -0
  130. package/dist/agents/index.d.ts +23 -0
  131. package/dist/agents/index.js +44 -0
  132. package/dist/agents/index.js.map +1 -0
  133. package/dist/agents/profiles.d.ts +26 -0
  134. package/dist/agents/profiles.js +197 -0
  135. package/dist/agents/profiles.js.map +1 -0
  136. package/dist/agents/types.d.ts +262 -0
  137. package/dist/agents/types.js +4 -0
  138. package/dist/agents/types.js.map +1 -0
  139. package/dist/api/cli.d.ts +2 -0
  140. package/dist/api/cli.js +6678 -0
  141. package/dist/api/cli.js.map +1 -0
  142. package/dist/api/doctor.d.ts +83 -0
  143. package/dist/api/doctor.js +982 -0
  144. package/dist/api/doctor.js.map +1 -0
  145. package/dist/api/mcp.d.ts +32 -0
  146. package/dist/api/mcp.js +223 -0
  147. package/dist/api/mcp.js.map +1 -0
  148. package/dist/api/medscale.d.ts +2 -0
  149. package/dist/api/medscale.js +20 -0
  150. package/dist/api/medscale.js.map +1 -0
  151. package/dist/api/quickstart.d.ts +86 -0
  152. package/dist/api/quickstart.js +291 -0
  153. package/dist/api/quickstart.js.map +1 -0
  154. package/dist/artifact/fsm.d.ts +41 -0
  155. package/dist/artifact/fsm.js +221 -0
  156. package/dist/artifact/fsm.js.map +1 -0
  157. package/dist/artifact/fsmDefinitions.d.ts +18 -0
  158. package/dist/artifact/fsmDefinitions.js +296 -0
  159. package/dist/artifact/fsmDefinitions.js.map +1 -0
  160. package/dist/artifact/sqliteStore.d.ts +61 -0
  161. package/dist/artifact/sqliteStore.js +381 -0
  162. package/dist/artifact/sqliteStore.js.map +1 -0
  163. package/dist/artifact/store.d.ts +49 -0
  164. package/dist/artifact/store.js +116 -0
  165. package/dist/artifact/store.js.map +1 -0
  166. package/dist/artifact/types.d.ts +535 -0
  167. package/dist/artifact/types.js +74 -0
  168. package/dist/artifact/types.js.map +1 -0
  169. package/dist/bootstrap/DependencyBootstrap.d.ts +112 -0
  170. package/dist/bootstrap/DependencyBootstrap.js +1046 -0
  171. package/dist/bootstrap/DependencyBootstrap.js.map +1 -0
  172. package/dist/bootstrap/DependencyBootstrapRenderer.d.ts +3 -0
  173. package/dist/bootstrap/DependencyBootstrapRenderer.js +138 -0
  174. package/dist/bootstrap/DependencyBootstrapRenderer.js.map +1 -0
  175. package/dist/bridge/PythonBridge.d.ts +80 -0
  176. package/dist/bridge/PythonBridge.js +437 -0
  177. package/dist/bridge/PythonBridge.js.map +1 -0
  178. package/dist/bridge/index.d.ts +2 -0
  179. package/dist/bridge/index.js +7 -0
  180. package/dist/bridge/index.js.map +1 -0
  181. package/dist/bridge/medicalWorkflows.d.ts +29 -0
  182. package/dist/bridge/medicalWorkflows.js +156 -0
  183. package/dist/bridge/medicalWorkflows.js.map +1 -0
  184. package/dist/bridge/types.d.ts +381 -0
  185. package/dist/bridge/types.js +113 -0
  186. package/dist/bridge/types.js.map +1 -0
  187. package/dist/cache/ScanCache.d.ts +41 -0
  188. package/dist/cache/ScanCache.js +120 -0
  189. package/dist/cache/ScanCache.js.map +1 -0
  190. package/dist/capabilities/BrowserCapability.d.ts +30 -0
  191. package/dist/capabilities/BrowserCapability.js +73 -0
  192. package/dist/capabilities/BrowserCapability.js.map +1 -0
  193. package/dist/capabilities/BrowserQACapability.d.ts +165 -0
  194. package/dist/capabilities/BrowserQACapability.js +438 -0
  195. package/dist/capabilities/BrowserQACapability.js.map +1 -0
  196. package/dist/capabilities/CapabilityRegistry.d.ts +17 -0
  197. package/dist/capabilities/CapabilityRegistry.js +65 -0
  198. package/dist/capabilities/CapabilityRegistry.js.map +1 -0
  199. package/dist/capabilities/ComputerCapability.d.ts +28 -0
  200. package/dist/capabilities/ComputerCapability.js +40 -0
  201. package/dist/capabilities/ComputerCapability.js.map +1 -0
  202. package/dist/capabilities/InstalledSkillsIntegration.d.ts +69 -0
  203. package/dist/capabilities/InstalledSkillsIntegration.js +240 -0
  204. package/dist/capabilities/InstalledSkillsIntegration.js.map +1 -0
  205. package/dist/capabilities/SearchCapability.d.ts +46 -0
  206. package/dist/capabilities/SearchCapability.js +88 -0
  207. package/dist/capabilities/SearchCapability.js.map +1 -0
  208. package/dist/capabilities/index.d.ts +6 -0
  209. package/dist/capabilities/index.js +9 -0
  210. package/dist/capabilities/index.js.map +1 -0
  211. package/dist/capabilities/types.d.ts +92 -0
  212. package/dist/capabilities/types.js +7 -0
  213. package/dist/capabilities/types.js.map +1 -0
  214. package/dist/cli/autofixCommands.d.ts +22 -0
  215. package/dist/cli/autofixCommands.js +32 -0
  216. package/dist/cli/autofixCommands.js.map +1 -0
  217. package/dist/cli/cortexCommands.d.ts +71 -0
  218. package/dist/cli/cortexCommands.js +335 -0
  219. package/dist/cli/cortexCommands.js.map +1 -0
  220. package/dist/cli/costCommands.d.ts +13 -0
  221. package/dist/cli/costCommands.js +48 -0
  222. package/dist/cli/costCommands.js.map +1 -0
  223. package/dist/cli/evolutionCommands.d.ts +112 -0
  224. package/dist/cli/evolutionCommands.js +246 -0
  225. package/dist/cli/evolutionCommands.js.map +1 -0
  226. package/dist/cli/gateStatusCommands.d.ts +1 -0
  227. package/dist/cli/gateStatusCommands.js +52 -0
  228. package/dist/cli/gateStatusCommands.js.map +1 -0
  229. package/dist/cli/liteCommands.d.ts +81 -0
  230. package/dist/cli/liteCommands.js +148 -0
  231. package/dist/cli/liteCommands.js.map +1 -0
  232. package/dist/cli/orchCommands.d.ts +43 -0
  233. package/dist/cli/orchCommands.js +135 -0
  234. package/dist/cli/orchCommands.js.map +1 -0
  235. package/dist/cli/phaseCommands.d.ts +248 -0
  236. package/dist/cli/phaseCommands.js +1878 -0
  237. package/dist/cli/phaseCommands.js.map +1 -0
  238. package/dist/cli/promptCommands.d.ts +1 -0
  239. package/dist/cli/promptCommands.js +57 -0
  240. package/dist/cli/promptCommands.js.map +1 -0
  241. package/dist/cli/qaCommands.d.ts +22 -0
  242. package/dist/cli/qaCommands.js +84 -0
  243. package/dist/cli/qaCommands.js.map +1 -0
  244. package/dist/cli/quickstartCommands.d.ts +17 -0
  245. package/dist/cli/quickstartCommands.js +47 -0
  246. package/dist/cli/quickstartCommands.js.map +1 -0
  247. package/dist/cli/runCommand.d.ts +39 -0
  248. package/dist/cli/runCommand.js +113 -0
  249. package/dist/cli/runCommand.js.map +1 -0
  250. package/dist/cli/scoreCommands.d.ts +1 -0
  251. package/dist/cli/scoreCommands.js +112 -0
  252. package/dist/cli/scoreCommands.js.map +1 -0
  253. package/dist/cli/shieldCommands.d.ts +30 -0
  254. package/dist/cli/shieldCommands.js +212 -0
  255. package/dist/cli/shieldCommands.js.map +1 -0
  256. package/dist/cli/targetCommands.d.ts +552 -0
  257. package/dist/cli/targetCommands.js +3173 -0
  258. package/dist/cli/targetCommands.js.map +1 -0
  259. package/dist/cli/tuiCommands.d.ts +7 -0
  260. package/dist/cli/tuiCommands.js +33 -0
  261. package/dist/cli/tuiCommands.js.map +1 -0
  262. package/dist/cli/vibeCommands.d.ts +64 -0
  263. package/dist/cli/vibeCommands.js +221 -0
  264. package/dist/cli/vibeCommands.js.map +1 -0
  265. package/dist/codegraph/CodeIntelligence.d.ts +147 -0
  266. package/dist/codegraph/CodeIntelligence.js +681 -0
  267. package/dist/codegraph/CodeIntelligence.js.map +1 -0
  268. package/dist/config/profiles.d.ts +64 -0
  269. package/dist/config/profiles.js +223 -0
  270. package/dist/config/profiles.js.map +1 -0
  271. package/dist/context/AntiPatternRegistry.d.ts +38 -0
  272. package/dist/context/AntiPatternRegistry.js +203 -0
  273. package/dist/context/AntiPatternRegistry.js.map +1 -0
  274. package/dist/context/CavemanCompressor.d.ts +20 -0
  275. package/dist/context/CavemanCompressor.js +14 -0
  276. package/dist/context/CavemanCompressor.js.map +1 -0
  277. package/dist/context/ContextBudget.d.ts +128 -0
  278. package/dist/context/ContextBudget.js +423 -0
  279. package/dist/context/ContextBudget.js.map +1 -0
  280. package/dist/context/ContextBuilder.d.ts +71 -0
  281. package/dist/context/ContextBuilder.js +372 -0
  282. package/dist/context/ContextBuilder.js.map +1 -0
  283. package/dist/context/ContextCompiler.d.ts +34 -0
  284. package/dist/context/ContextCompiler.js +120 -0
  285. package/dist/context/ContextCompiler.js.map +1 -0
  286. package/dist/context/ProjectAnatomy.d.ts +18 -0
  287. package/dist/context/ProjectAnatomy.js +287 -0
  288. package/dist/context/ProjectAnatomy.js.map +1 -0
  289. package/dist/context/SessionStartSequence.d.ts +54 -0
  290. package/dist/context/SessionStartSequence.js +162 -0
  291. package/dist/context/SessionStartSequence.js.map +1 -0
  292. package/dist/core/ExternalCommand.d.ts +9 -0
  293. package/dist/core/ExternalCommand.js +70 -0
  294. package/dist/core/ExternalCommand.js.map +1 -0
  295. package/dist/core/GbrainRuntime.d.ts +25 -0
  296. package/dist/core/GbrainRuntime.js +270 -0
  297. package/dist/core/GbrainRuntime.js.map +1 -0
  298. package/dist/core/container.d.ts +14 -0
  299. package/dist/core/container.js +35 -0
  300. package/dist/core/container.js.map +1 -0
  301. package/dist/core/eventBus.d.ts +60 -0
  302. package/dist/core/eventBus.js +157 -0
  303. package/dist/core/eventBus.js.map +1 -0
  304. package/dist/core/logger.d.ts +5 -0
  305. package/dist/core/logger.js +51 -0
  306. package/dist/core/logger.js.map +1 -0
  307. package/dist/cortex/GovernanceMetrics.d.ts +66 -0
  308. package/dist/cortex/GovernanceMetrics.js +230 -0
  309. package/dist/cortex/GovernanceMetrics.js.map +1 -0
  310. package/dist/cortex/InstinctExtractor.d.ts +61 -0
  311. package/dist/cortex/InstinctExtractor.js +184 -0
  312. package/dist/cortex/InstinctExtractor.js.map +1 -0
  313. package/dist/cortex/InstinctStore.d.ts +54 -0
  314. package/dist/cortex/InstinctStore.js +266 -0
  315. package/dist/cortex/InstinctStore.js.map +1 -0
  316. package/dist/cortex/ReflexionEngine.d.ts +34 -0
  317. package/dist/cortex/ReflexionEngine.js +157 -0
  318. package/dist/cortex/ReflexionEngine.js.map +1 -0
  319. package/dist/cortex/SessionInjector.d.ts +44 -0
  320. package/dist/cortex/SessionInjector.js +127 -0
  321. package/dist/cortex/SessionInjector.js.map +1 -0
  322. package/dist/cortex/adapters/ClaudeAdapter.d.ts +17 -0
  323. package/dist/cortex/adapters/ClaudeAdapter.js +61 -0
  324. package/dist/cortex/adapters/ClaudeAdapter.js.map +1 -0
  325. package/dist/cortex/adapters/CodexAdapter.d.ts +10 -0
  326. package/dist/cortex/adapters/CodexAdapter.js +52 -0
  327. package/dist/cortex/adapters/CodexAdapter.js.map +1 -0
  328. package/dist/cortex/adapters/CursorAdapter.d.ts +10 -0
  329. package/dist/cortex/adapters/CursorAdapter.js +46 -0
  330. package/dist/cortex/adapters/CursorAdapter.js.map +1 -0
  331. package/dist/cortex/adapters/GeminiAdapter.d.ts +11 -0
  332. package/dist/cortex/adapters/GeminiAdapter.js +48 -0
  333. package/dist/cortex/adapters/GeminiAdapter.js.map +1 -0
  334. package/dist/dashboard/DashboardServer.d.ts +86 -0
  335. package/dist/dashboard/DashboardServer.js +380 -0
  336. package/dist/dashboard/DashboardServer.js.map +1 -0
  337. package/dist/dashboard/MedicalWorkflowData.d.ts +155 -0
  338. package/dist/dashboard/MedicalWorkflowData.js +664 -0
  339. package/dist/dashboard/MedicalWorkflowData.js.map +1 -0
  340. package/dist/dashboard/MetricsAggregator.d.ts +38 -0
  341. package/dist/dashboard/MetricsAggregator.js +99 -0
  342. package/dist/dashboard/MetricsAggregator.js.map +1 -0
  343. package/dist/dashboard/index.d.ts +4 -0
  344. package/dist/dashboard/index.js +3 -0
  345. package/dist/dashboard/index.js.map +1 -0
  346. package/dist/dashboard/server.d.ts +52 -0
  347. package/dist/dashboard/server.js +84 -0
  348. package/dist/dashboard/server.js.map +1 -0
  349. package/dist/env/EnvironmentDoctor.d.ts +66 -0
  350. package/dist/env/EnvironmentDoctor.js +581 -0
  351. package/dist/env/EnvironmentDoctor.js.map +1 -0
  352. package/dist/eval/BenchmarkPublisher.d.ts +25 -0
  353. package/dist/eval/BenchmarkPublisher.js +27 -0
  354. package/dist/eval/BenchmarkPublisher.js.map +1 -0
  355. package/dist/eval/WorkflowEval.d.ts +161 -0
  356. package/dist/eval/WorkflowEval.js +377 -0
  357. package/dist/eval/WorkflowEval.js.map +1 -0
  358. package/dist/evolution/AutoDefectCreator.d.ts +43 -0
  359. package/dist/evolution/AutoDefectCreator.js +157 -0
  360. package/dist/evolution/AutoDefectCreator.js.map +1 -0
  361. package/dist/evolution/BehaviorTracker.d.ts +46 -0
  362. package/dist/evolution/BehaviorTracker.js +67 -0
  363. package/dist/evolution/BehaviorTracker.js.map +1 -0
  364. package/dist/evolution/EvolutionEngine.d.ts +102 -0
  365. package/dist/evolution/EvolutionEngine.js +326 -0
  366. package/dist/evolution/EvolutionEngine.js.map +1 -0
  367. package/dist/evolution/EvolutionEvaluator.d.ts +61 -0
  368. package/dist/evolution/EvolutionEvaluator.js +118 -0
  369. package/dist/evolution/EvolutionEvaluator.js.map +1 -0
  370. package/dist/evolution/LessonValidator.d.ts +36 -0
  371. package/dist/evolution/LessonValidator.js +132 -0
  372. package/dist/evolution/LessonValidator.js.map +1 -0
  373. package/dist/evolution/PatternExtractor.d.ts +40 -0
  374. package/dist/evolution/PatternExtractor.js +83 -0
  375. package/dist/evolution/PatternExtractor.js.map +1 -0
  376. package/dist/evolution/RuleMaturity.d.ts +39 -0
  377. package/dist/evolution/RuleMaturity.js +70 -0
  378. package/dist/evolution/RuleMaturity.js.map +1 -0
  379. package/dist/evolution/SessionLearnings.d.ts +70 -0
  380. package/dist/evolution/SessionLearnings.js +217 -0
  381. package/dist/evolution/SessionLearnings.js.map +1 -0
  382. package/dist/evolution/SkillCreator.d.ts +75 -0
  383. package/dist/evolution/SkillCreator.js +219 -0
  384. package/dist/evolution/SkillCreator.js.map +1 -0
  385. package/dist/fsm/FSMAgentBridge.d.ts +59 -0
  386. package/dist/fsm/FSMAgentBridge.js +193 -0
  387. package/dist/fsm/FSMAgentBridge.js.map +1 -0
  388. package/dist/fsm/index.d.ts +2 -0
  389. package/dist/fsm/index.js +3 -0
  390. package/dist/fsm/index.js.map +1 -0
  391. package/dist/governance/GovernanceRoi.d.ts +30 -0
  392. package/dist/governance/GovernanceRoi.js +102 -0
  393. package/dist/governance/GovernanceRoi.js.map +1 -0
  394. package/dist/governance/ProgressiveGovernance.d.ts +22 -0
  395. package/dist/governance/ProgressiveGovernance.js +159 -0
  396. package/dist/governance/ProgressiveGovernance.js.map +1 -0
  397. package/dist/guardrails/ActiveRedTeam.d.ts +46 -0
  398. package/dist/guardrails/ActiveRedTeam.js +203 -0
  399. package/dist/guardrails/ActiveRedTeam.js.map +1 -0
  400. package/dist/guardrails/DependencyAuditor.d.ts +68 -0
  401. package/dist/guardrails/DependencyAuditor.js +378 -0
  402. package/dist/guardrails/DependencyAuditor.js.map +1 -0
  403. package/dist/guardrails/DetectorEnhanced.d.ts +111 -0
  404. package/dist/guardrails/DetectorEnhanced.js +202 -0
  405. package/dist/guardrails/DetectorEnhanced.js.map +1 -0
  406. package/dist/guardrails/GateEvaluator.d.ts +18 -0
  407. package/dist/guardrails/GateEvaluator.js +129 -0
  408. package/dist/guardrails/GateEvaluator.js.map +1 -0
  409. package/dist/guardrails/Gateway.d.ts +26 -0
  410. package/dist/guardrails/Gateway.js +56 -0
  411. package/dist/guardrails/Gateway.js.map +1 -0
  412. package/dist/guardrails/OWASPDetector.d.ts +58 -0
  413. package/dist/guardrails/OWASPDetector.js +508 -0
  414. package/dist/guardrails/OWASPDetector.js.map +1 -0
  415. package/dist/guardrails/ReviewEnforcer.d.ts +52 -0
  416. package/dist/guardrails/ReviewEnforcer.js +117 -0
  417. package/dist/guardrails/ReviewEnforcer.js.map +1 -0
  418. package/dist/guardrails/advancedDetectors.d.ts +38 -0
  419. package/dist/guardrails/advancedDetectors.js +188 -0
  420. package/dist/guardrails/advancedDetectors.js.map +1 -0
  421. package/dist/guardrails/detectors.d.ts +34 -0
  422. package/dist/guardrails/detectors.js +332 -0
  423. package/dist/guardrails/detectors.js.map +1 -0
  424. package/dist/guardrails/roles.d.ts +4 -0
  425. package/dist/guardrails/roles.js +54 -0
  426. package/dist/guardrails/roles.js.map +1 -0
  427. package/dist/hooks/BugPatternDetector.d.ts +36 -0
  428. package/dist/hooks/BugPatternDetector.js +207 -0
  429. package/dist/hooks/BugPatternDetector.js.map +1 -0
  430. package/dist/hooks/HookDeployer.d.ts +44 -0
  431. package/dist/hooks/HookDeployer.js +144 -0
  432. package/dist/hooks/HookDeployer.js.map +1 -0
  433. package/dist/hooks/HookGeneratorEnhanced.d.ts +67 -0
  434. package/dist/hooks/HookGeneratorEnhanced.js +641 -0
  435. package/dist/hooks/HookGeneratorEnhanced.js.map +1 -0
  436. package/dist/hooks/WorkflowHooksManager.d.ts +30 -0
  437. package/dist/hooks/WorkflowHooksManager.js +160 -0
  438. package/dist/hooks/WorkflowHooksManager.js.map +1 -0
  439. package/dist/hooks/index.d.ts +6 -0
  440. package/dist/hooks/index.js +5 -0
  441. package/dist/hooks/index.js.map +1 -0
  442. package/dist/i18n/Language.d.ts +9 -0
  443. package/dist/i18n/Language.js +38 -0
  444. package/dist/i18n/Language.js.map +1 -0
  445. package/dist/index.d.ts +101 -0
  446. package/dist/index.js +104 -0
  447. package/dist/index.js.map +1 -0
  448. package/dist/knowledge/CerebrumManager.d.ts +25 -0
  449. package/dist/knowledge/CerebrumManager.js +127 -0
  450. package/dist/knowledge/CerebrumManager.js.map +1 -0
  451. package/dist/knowledge/GraphifyKnowledgeBase.d.ts +38 -0
  452. package/dist/knowledge/GraphifyKnowledgeBase.js +409 -0
  453. package/dist/knowledge/GraphifyKnowledgeBase.js.map +1 -0
  454. package/dist/knowledge/KnowledgeBase.d.ts +51 -0
  455. package/dist/knowledge/KnowledgeBase.js +182 -0
  456. package/dist/knowledge/KnowledgeBase.js.map +1 -0
  457. package/dist/knowledge/SQLiteKnowledgeBase.d.ts +29 -0
  458. package/dist/knowledge/SQLiteKnowledgeBase.js +203 -0
  459. package/dist/knowledge/SQLiteKnowledgeBase.js.map +1 -0
  460. package/dist/knowledge/TfidfIndex.d.ts +50 -0
  461. package/dist/knowledge/TfidfIndex.js +177 -0
  462. package/dist/knowledge/TfidfIndex.js.map +1 -0
  463. package/dist/knowledge/UbiquitousLanguageManager.d.ts +49 -0
  464. package/dist/knowledge/UbiquitousLanguageManager.js +133 -0
  465. package/dist/knowledge/UbiquitousLanguageManager.js.map +1 -0
  466. package/dist/memory/MemoryBrain.d.ts +146 -0
  467. package/dist/memory/MemoryBrain.js +679 -0
  468. package/dist/memory/MemoryBrain.js.map +1 -0
  469. package/dist/memory/MemoryFabric.d.ts +130 -0
  470. package/dist/memory/MemoryFabric.js +317 -0
  471. package/dist/memory/MemoryFabric.js.map +1 -0
  472. package/dist/memory/MemoryIntelligence.d.ts +42 -0
  473. package/dist/memory/MemoryIntelligence.js +215 -0
  474. package/dist/memory/MemoryIntelligence.js.map +1 -0
  475. package/dist/memory/MemoryLearning.d.ts +62 -0
  476. package/dist/memory/MemoryLearning.js +209 -0
  477. package/dist/memory/MemoryLearning.js.map +1 -0
  478. package/dist/memory/MemoryProviders.d.ts +165 -0
  479. package/dist/memory/MemoryProviders.js +940 -0
  480. package/dist/memory/MemoryProviders.js.map +1 -0
  481. package/dist/memory/MemoryReview.d.ts +65 -0
  482. package/dist/memory/MemoryReview.js +260 -0
  483. package/dist/memory/MemoryReview.js.map +1 -0
  484. package/dist/memory/index.d.ts +6 -0
  485. package/dist/memory/index.js +7 -0
  486. package/dist/memory/index.js.map +1 -0
  487. package/dist/orchestration/EffectsWiring.d.ts +8 -0
  488. package/dist/orchestration/EffectsWiring.js +87 -0
  489. package/dist/orchestration/EffectsWiring.js.map +1 -0
  490. package/dist/orchestrator/OrchestratorDaemon.d.ts +44 -0
  491. package/dist/orchestrator/OrchestratorDaemon.js +150 -0
  492. package/dist/orchestrator/OrchestratorDaemon.js.map +1 -0
  493. package/dist/orchestrator/PolicyLoader.d.ts +80 -0
  494. package/dist/orchestrator/PolicyLoader.js +229 -0
  495. package/dist/orchestrator/PolicyLoader.js.map +1 -0
  496. package/dist/orchestrator/ReconciliationLoop.d.ts +71 -0
  497. package/dist/orchestrator/ReconciliationLoop.js +266 -0
  498. package/dist/orchestrator/ReconciliationLoop.js.map +1 -0
  499. package/dist/orchestrator/TrackerAdapter.d.ts +60 -0
  500. package/dist/orchestrator/TrackerAdapter.js +147 -0
  501. package/dist/orchestrator/TrackerAdapter.js.map +1 -0
  502. package/dist/orchestrator/WorkspaceManager.d.ts +66 -0
  503. package/dist/orchestrator/WorkspaceManager.js +257 -0
  504. package/dist/orchestrator/WorkspaceManager.js.map +1 -0
  505. package/dist/output/BrandThemeLoader.d.ts +54 -0
  506. package/dist/output/BrandThemeLoader.js +340 -0
  507. package/dist/output/BrandThemeLoader.js.map +1 -0
  508. package/dist/output/GovernanceDashboard.d.ts +59 -0
  509. package/dist/output/GovernanceDashboard.js +281 -0
  510. package/dist/output/GovernanceDashboard.js.map +1 -0
  511. package/dist/output/HTMLArtifactLayer.d.ts +97 -0
  512. package/dist/output/HTMLArtifactLayer.js +576 -0
  513. package/dist/output/HTMLArtifactLayer.js.map +1 -0
  514. package/dist/output/HTMLDocumentRenderer.d.ts +83 -0
  515. package/dist/output/HTMLDocumentRenderer.js +718 -0
  516. package/dist/output/HTMLDocumentRenderer.js.map +1 -0
  517. package/dist/output/UIPrototypeRenderer.d.ts +61 -0
  518. package/dist/output/UIPrototypeRenderer.js +500 -0
  519. package/dist/output/UIPrototypeRenderer.js.map +1 -0
  520. package/dist/output/index.d.ts +10 -0
  521. package/dist/output/index.js +8 -0
  522. package/dist/output/index.js.map +1 -0
  523. package/dist/prompts/PhasePromptRegistry.d.ts +53 -0
  524. package/dist/prompts/PhasePromptRegistry.js +517 -0
  525. package/dist/prompts/PhasePromptRegistry.js.map +1 -0
  526. package/dist/prompts/PromptOptimizer.d.ts +42 -0
  527. package/dist/prompts/PromptOptimizer.js +309 -0
  528. package/dist/prompts/PromptOptimizer.js.map +1 -0
  529. package/dist/prompts/VibeTemplateGallery.d.ts +25 -0
  530. package/dist/prompts/VibeTemplateGallery.js +295 -0
  531. package/dist/prompts/VibeTemplateGallery.js.map +1 -0
  532. package/dist/qa/BrowserDaemon.d.ts +23 -0
  533. package/dist/qa/BrowserDaemon.js +79 -0
  534. package/dist/qa/BrowserDaemon.js.map +1 -0
  535. package/dist/qa/E2ETestOrchestrator.d.ts +14 -0
  536. package/dist/qa/E2ETestOrchestrator.js +19 -0
  537. package/dist/qa/E2ETestOrchestrator.js.map +1 -0
  538. package/dist/review/CrossModelReviewer.d.ts +35 -0
  539. package/dist/review/CrossModelReviewer.js +75 -0
  540. package/dist/review/CrossModelReviewer.js.map +1 -0
  541. package/dist/review/ReviewAggregator.d.ts +13 -0
  542. package/dist/review/ReviewAggregator.js +28 -0
  543. package/dist/review/ReviewAggregator.js.map +1 -0
  544. package/dist/review/reviewCommands.d.ts +15 -0
  545. package/dist/review/reviewCommands.js +24 -0
  546. package/dist/review/reviewCommands.js.map +1 -0
  547. package/dist/routing/LocalModelProvider.d.ts +11 -0
  548. package/dist/routing/LocalModelProvider.js +21 -0
  549. package/dist/routing/LocalModelProvider.js.map +1 -0
  550. package/dist/routing/ModelRouter.d.ts +42 -0
  551. package/dist/routing/ModelRouter.js +94 -0
  552. package/dist/routing/ModelRouter.js.map +1 -0
  553. package/dist/routing/PromptCachePolicy.d.ts +37 -0
  554. package/dist/routing/PromptCachePolicy.js +97 -0
  555. package/dist/routing/PromptCachePolicy.js.map +1 -0
  556. package/dist/runtime/AiOsRuntime.d.ts +485 -0
  557. package/dist/runtime/AiOsRuntime.js +1846 -0
  558. package/dist/runtime/AiOsRuntime.js.map +1 -0
  559. package/dist/runtime/CostAnalyzer.d.ts +53 -0
  560. package/dist/runtime/CostAnalyzer.js +160 -0
  561. package/dist/runtime/CostAnalyzer.js.map +1 -0
  562. package/dist/runtime/CostOptimizer.d.ts +11 -0
  563. package/dist/runtime/CostOptimizer.js +21 -0
  564. package/dist/runtime/CostOptimizer.js.map +1 -0
  565. package/dist/runtime/ExecutionLedger.d.ts +46 -0
  566. package/dist/runtime/ExecutionLedger.js +71 -0
  567. package/dist/runtime/ExecutionLedger.js.map +1 -0
  568. package/dist/runtime/FinalReportGuard.d.ts +16 -0
  569. package/dist/runtime/FinalReportGuard.js +14 -0
  570. package/dist/runtime/FinalReportGuard.js.map +1 -0
  571. package/dist/runtime/ModelUsageLedger.d.ts +101 -0
  572. package/dist/runtime/ModelUsageLedger.js +296 -0
  573. package/dist/runtime/ModelUsageLedger.js.map +1 -0
  574. package/dist/runtime/RuntimeDoctor.d.ts +23 -0
  575. package/dist/runtime/RuntimeDoctor.js +151 -0
  576. package/dist/runtime/RuntimeDoctor.js.map +1 -0
  577. package/dist/runtime/RuntimeEvidenceLedger.d.ts +50 -0
  578. package/dist/runtime/RuntimeEvidenceLedger.js +89 -0
  579. package/dist/runtime/RuntimeEvidenceLedger.js.map +1 -0
  580. package/dist/runtime/SessionLedger.d.ts +53 -0
  581. package/dist/runtime/SessionLedger.js +104 -0
  582. package/dist/runtime/SessionLedger.js.map +1 -0
  583. package/dist/runtime/index.d.ts +7 -0
  584. package/dist/runtime/index.js +8 -0
  585. package/dist/runtime/index.js.map +1 -0
  586. package/dist/setup/SetupVerification.d.ts +42 -0
  587. package/dist/setup/SetupVerification.js +180 -0
  588. package/dist/setup/SetupVerification.js.map +1 -0
  589. package/dist/setup/SetupWizard.d.ts +45 -0
  590. package/dist/setup/SetupWizard.js +216 -0
  591. package/dist/setup/SetupWizard.js.map +1 -0
  592. package/dist/shield/PolicyCompiler.d.ts +70 -0
  593. package/dist/shield/PolicyCompiler.js +540 -0
  594. package/dist/shield/PolicyCompiler.js.map +1 -0
  595. package/dist/shield/ProtectedPaths.d.ts +39 -0
  596. package/dist/shield/ProtectedPaths.js +179 -0
  597. package/dist/shield/ProtectedPaths.js.map +1 -0
  598. package/dist/shield/ShieldProtocol.d.ts +50 -0
  599. package/dist/shield/ShieldProtocol.js +103 -0
  600. package/dist/shield/ShieldProtocol.js.map +1 -0
  601. package/dist/skills/ExternalSkills.d.ts +3 -0
  602. package/dist/skills/ExternalSkills.js +27 -0
  603. package/dist/skills/ExternalSkills.js.map +1 -0
  604. package/dist/skills/GrillingSessionSkill.d.ts +65 -0
  605. package/dist/skills/GrillingSessionSkill.js +113 -0
  606. package/dist/skills/GrillingSessionSkill.js.map +1 -0
  607. package/dist/skills/GrillingTemplates.d.ts +7 -0
  608. package/dist/skills/GrillingTemplates.js +38 -0
  609. package/dist/skills/GrillingTemplates.js.map +1 -0
  610. package/dist/skills/RoleSkills.d.ts +20 -0
  611. package/dist/skills/RoleSkills.js +154 -0
  612. package/dist/skills/RoleSkills.js.map +1 -0
  613. package/dist/skills/SkillCatalog.d.ts +13 -0
  614. package/dist/skills/SkillCatalog.js +184 -0
  615. package/dist/skills/SkillCatalog.js.map +1 -0
  616. package/dist/skills/SkillDiscovery.d.ts +84 -0
  617. package/dist/skills/SkillDiscovery.js +402 -0
  618. package/dist/skills/SkillDiscovery.js.map +1 -0
  619. package/dist/skills/SkillDoctor.d.ts +37 -0
  620. package/dist/skills/SkillDoctor.js +267 -0
  621. package/dist/skills/SkillDoctor.js.map +1 -0
  622. package/dist/skills/SkillExecutor.d.ts +38 -0
  623. package/dist/skills/SkillExecutor.js +237 -0
  624. package/dist/skills/SkillExecutor.js.map +1 -0
  625. package/dist/skills/SkillFrontmatter.d.ts +28 -0
  626. package/dist/skills/SkillFrontmatter.js +152 -0
  627. package/dist/skills/SkillFrontmatter.js.map +1 -0
  628. package/dist/skills/SkillInstaller.d.ts +40 -0
  629. package/dist/skills/SkillInstaller.js +117 -0
  630. package/dist/skills/SkillInstaller.js.map +1 -0
  631. package/dist/skills/SkillMdStandard.d.ts +33 -0
  632. package/dist/skills/SkillMdStandard.js +88 -0
  633. package/dist/skills/SkillMdStandard.js.map +1 -0
  634. package/dist/skills/SkillRadar.d.ts +83 -0
  635. package/dist/skills/SkillRadar.js +404 -0
  636. package/dist/skills/SkillRadar.js.map +1 -0
  637. package/dist/skills/SkillRegistry.d.ts +112 -0
  638. package/dist/skills/SkillRegistry.js +161 -0
  639. package/dist/skills/SkillRegistry.js.map +1 -0
  640. package/dist/skills/SkillRepository.d.ts +71 -0
  641. package/dist/skills/SkillRepository.js +435 -0
  642. package/dist/skills/SkillRepository.js.map +1 -0
  643. package/dist/skills/TriggerEngine.d.ts +43 -0
  644. package/dist/skills/TriggerEngine.js +142 -0
  645. package/dist/skills/TriggerEngine.js.map +1 -0
  646. package/dist/skills/coreSkills.d.ts +6 -0
  647. package/dist/skills/coreSkills.js +41 -0
  648. package/dist/skills/coreSkills.js.map +1 -0
  649. package/dist/skills/index.d.ts +10 -0
  650. package/dist/skills/index.js +12 -0
  651. package/dist/skills/index.js.map +1 -0
  652. package/dist/skills/interop/GStackInterop.d.ts +15 -0
  653. package/dist/skills/interop/GStackInterop.js +34 -0
  654. package/dist/skills/interop/GStackInterop.js.map +1 -0
  655. package/dist/skills/interop/OMCInterop.d.ts +15 -0
  656. package/dist/skills/interop/OMCInterop.js +34 -0
  657. package/dist/skills/interop/OMCInterop.js.map +1 -0
  658. package/dist/skills/routing/SkillGate.d.ts +12 -0
  659. package/dist/skills/routing/SkillGate.js +117 -0
  660. package/dist/skills/routing/SkillGate.js.map +1 -0
  661. package/dist/skills/routing/SkillPlanner.d.ts +8 -0
  662. package/dist/skills/routing/SkillPlanner.js +179 -0
  663. package/dist/skills/routing/SkillPlanner.js.map +1 -0
  664. package/dist/skills/routing/SkillPolicy.d.ts +6 -0
  665. package/dist/skills/routing/SkillPolicy.js +336 -0
  666. package/dist/skills/routing/SkillPolicy.js.map +1 -0
  667. package/dist/skills/routing/SkillRoutingTypes.d.ts +89 -0
  668. package/dist/skills/routing/SkillRoutingTypes.js +2 -0
  669. package/dist/skills/routing/SkillRoutingTypes.js.map +1 -0
  670. package/dist/skills/routing/TaskIntentClassifier.d.ts +6 -0
  671. package/dist/skills/routing/TaskIntentClassifier.js +79 -0
  672. package/dist/skills/routing/TaskIntentClassifier.js.map +1 -0
  673. package/dist/skills/routing/index.d.ts +5 -0
  674. package/dist/skills/routing/index.js +6 -0
  675. package/dist/skills/routing/index.js.map +1 -0
  676. package/dist/tasks/IssueTriageFSM.d.ts +26 -0
  677. package/dist/tasks/IssueTriageFSM.js +107 -0
  678. package/dist/tasks/IssueTriageFSM.js.map +1 -0
  679. package/dist/tasks/TaskEngine.d.ts +97 -0
  680. package/dist/tasks/TaskEngine.js +289 -0
  681. package/dist/tasks/TaskEngine.js.map +1 -0
  682. package/dist/testing/DiffTestSelector.d.ts +22 -0
  683. package/dist/testing/DiffTestSelector.js +114 -0
  684. package/dist/testing/DiffTestSelector.js.map +1 -0
  685. package/dist/testing/index.d.ts +1 -0
  686. package/dist/testing/index.js +3 -0
  687. package/dist/testing/index.js.map +1 -0
  688. package/dist/tools/CommandOutputCompressor.d.ts +28 -0
  689. package/dist/tools/CommandOutputCompressor.js +242 -0
  690. package/dist/tools/CommandOutputCompressor.js.map +1 -0
  691. package/dist/tools/CommandRunLedger.d.ts +77 -0
  692. package/dist/tools/CommandRunLedger.js +111 -0
  693. package/dist/tools/CommandRunLedger.js.map +1 -0
  694. package/dist/tools/RtkRuntime.d.ts +9 -0
  695. package/dist/tools/RtkRuntime.js +43 -0
  696. package/dist/tools/RtkRuntime.js.map +1 -0
  697. package/dist/tools/SafeCommandRunner.d.ts +16 -0
  698. package/dist/tools/SafeCommandRunner.js +83 -0
  699. package/dist/tools/SafeCommandRunner.js.map +1 -0
  700. package/dist/tools/ToolCapabilityRegistry.d.ts +51 -0
  701. package/dist/tools/ToolCapabilityRegistry.js +295 -0
  702. package/dist/tools/ToolCapabilityRegistry.js.map +1 -0
  703. package/dist/tools/ToolEvidenceGate.d.ts +39 -0
  704. package/dist/tools/ToolEvidenceGate.js +117 -0
  705. package/dist/tools/ToolEvidenceGate.js.map +1 -0
  706. package/dist/tools/ToolEvidenceStore.d.ts +58 -0
  707. package/dist/tools/ToolEvidenceStore.js +129 -0
  708. package/dist/tools/ToolEvidenceStore.js.map +1 -0
  709. package/dist/tools/ToolOrchestrator.d.ts +67 -0
  710. package/dist/tools/ToolOrchestrator.js +252 -0
  711. package/dist/tools/ToolOrchestrator.js.map +1 -0
  712. package/dist/tools/ToolPolicy.d.ts +33 -0
  713. package/dist/tools/ToolPolicy.js +172 -0
  714. package/dist/tools/ToolPolicy.js.map +1 -0
  715. package/dist/tools/index.d.ts +7 -0
  716. package/dist/tools/index.js +8 -0
  717. package/dist/tools/index.js.map +1 -0
  718. package/dist/tui/TuiDashboard.d.ts +3 -0
  719. package/dist/tui/TuiDashboard.js +120 -0
  720. package/dist/tui/TuiDashboard.js.map +1 -0
  721. package/dist/version.d.ts +3 -0
  722. package/dist/version.js +15 -0
  723. package/dist/version.js.map +1 -0
  724. package/dist/workflow/AdaptiveWorkflowRouter.d.ts +38 -0
  725. package/dist/workflow/AdaptiveWorkflowRouter.js +214 -0
  726. package/dist/workflow/AdaptiveWorkflowRouter.js.map +1 -0
  727. package/dist/workflow/CommitDiscipline.d.ts +68 -0
  728. package/dist/workflow/CommitDiscipline.js +328 -0
  729. package/dist/workflow/CommitDiscipline.js.map +1 -0
  730. package/dist/workflow/ContextGovernance.d.ts +51 -0
  731. package/dist/workflow/ContextGovernance.js +233 -0
  732. package/dist/workflow/ContextGovernance.js.map +1 -0
  733. package/dist/workflow/CrossRepoOrchestrator.d.ts +92 -0
  734. package/dist/workflow/CrossRepoOrchestrator.js +408 -0
  735. package/dist/workflow/CrossRepoOrchestrator.js.map +1 -0
  736. package/dist/workflow/DiagnosticLoop.d.ts +40 -0
  737. package/dist/workflow/DiagnosticLoop.js +105 -0
  738. package/dist/workflow/DiagnosticLoop.js.map +1 -0
  739. package/dist/workflow/EngineeringStandards.d.ts +212 -0
  740. package/dist/workflow/EngineeringStandards.js +1113 -0
  741. package/dist/workflow/EngineeringStandards.js.map +1 -0
  742. package/dist/workflow/EvidenceStore.d.ts +20 -0
  743. package/dist/workflow/EvidenceStore.js +48 -0
  744. package/dist/workflow/EvidenceStore.js.map +1 -0
  745. package/dist/workflow/EvolutionShadowPromoter.d.ts +46 -0
  746. package/dist/workflow/EvolutionShadowPromoter.js +73 -0
  747. package/dist/workflow/EvolutionShadowPromoter.js.map +1 -0
  748. package/dist/workflow/GateCatalog.d.ts +63 -0
  749. package/dist/workflow/GateCatalog.js +268 -0
  750. package/dist/workflow/GateCatalog.js.map +1 -0
  751. package/dist/workflow/GovernanceLock.d.ts +35 -0
  752. package/dist/workflow/GovernanceLock.js +58 -0
  753. package/dist/workflow/GovernanceLock.js.map +1 -0
  754. package/dist/workflow/GovernanceRoi.d.ts +52 -0
  755. package/dist/workflow/GovernanceRoi.js +204 -0
  756. package/dist/workflow/GovernanceRoi.js.map +1 -0
  757. package/dist/workflow/GovernanceTemplatePacks.d.ts +24 -0
  758. package/dist/workflow/GovernanceTemplatePacks.js +2134 -0
  759. package/dist/workflow/GovernanceTemplatePacks.js.map +1 -0
  760. package/dist/workflow/GovernanceTemplates.d.ts +19 -0
  761. package/dist/workflow/GovernanceTemplates.js +1291 -0
  762. package/dist/workflow/GovernanceTemplates.js.map +1 -0
  763. package/dist/workflow/McpGovernance.d.ts +63 -0
  764. package/dist/workflow/McpGovernance.js +198 -0
  765. package/dist/workflow/McpGovernance.js.map +1 -0
  766. package/dist/workflow/OutOfScopeStore.d.ts +37 -0
  767. package/dist/workflow/OutOfScopeStore.js +164 -0
  768. package/dist/workflow/OutOfScopeStore.js.map +1 -0
  769. package/dist/workflow/PhaseMarkerTracker.d.ts +63 -0
  770. package/dist/workflow/PhaseMarkerTracker.js +291 -0
  771. package/dist/workflow/PhaseMarkerTracker.js.map +1 -0
  772. package/dist/workflow/ResourceGovernance.d.ts +120 -0
  773. package/dist/workflow/ResourceGovernance.js +531 -0
  774. package/dist/workflow/ResourceGovernance.js.map +1 -0
  775. package/dist/workflow/ReviewAnalyzer.d.ts +80 -0
  776. package/dist/workflow/ReviewAnalyzer.js +438 -0
  777. package/dist/workflow/ReviewAnalyzer.js.map +1 -0
  778. package/dist/workflow/ReviewStore.d.ts +36 -0
  779. package/dist/workflow/ReviewStore.js +42 -0
  780. package/dist/workflow/ReviewStore.js.map +1 -0
  781. package/dist/workflow/SecurityAudit.d.ts +27 -0
  782. package/dist/workflow/SecurityAudit.js +294 -0
  783. package/dist/workflow/SecurityAudit.js.map +1 -0
  784. package/dist/workflow/SessionCoordinator.d.ts +103 -0
  785. package/dist/workflow/SessionCoordinator.js +401 -0
  786. package/dist/workflow/SessionCoordinator.js.map +1 -0
  787. package/dist/workflow/SessionPreamble.d.ts +19 -0
  788. package/dist/workflow/SessionPreamble.js +130 -0
  789. package/dist/workflow/SessionPreamble.js.map +1 -0
  790. package/dist/workflow/SessionStateTracker.d.ts +74 -0
  791. package/dist/workflow/SessionStateTracker.js +270 -0
  792. package/dist/workflow/SessionStateTracker.js.map +1 -0
  793. package/dist/workflow/ShipPipeline.d.ts +30 -0
  794. package/dist/workflow/ShipPipeline.js +366 -0
  795. package/dist/workflow/ShipPipeline.js.map +1 -0
  796. package/dist/workflow/TaskArtifactScaffolder.d.ts +69 -0
  797. package/dist/workflow/TaskArtifactScaffolder.js +333 -0
  798. package/dist/workflow/TaskArtifactScaffolder.js.map +1 -0
  799. package/dist/workflow/TaskDependencyGraph.d.ts +73 -0
  800. package/dist/workflow/TaskDependencyGraph.js +245 -0
  801. package/dist/workflow/TaskDependencyGraph.js.map +1 -0
  802. package/dist/workflow/TaskLevelDetector.d.ts +41 -0
  803. package/dist/workflow/TaskLevelDetector.js +219 -0
  804. package/dist/workflow/TaskLevelDetector.js.map +1 -0
  805. package/dist/workflow/TaskMetricsStore.d.ts +49 -0
  806. package/dist/workflow/TaskMetricsStore.js +149 -0
  807. package/dist/workflow/TaskMetricsStore.js.map +1 -0
  808. package/dist/workflow/TaskScoreEngine.d.ts +42 -0
  809. package/dist/workflow/TaskScoreEngine.js +181 -0
  810. package/dist/workflow/TaskScoreEngine.js.map +1 -0
  811. package/dist/workflow/TddLoop.d.ts +49 -0
  812. package/dist/workflow/TddLoop.js +78 -0
  813. package/dist/workflow/TddLoop.js.map +1 -0
  814. package/dist/workflow/UpgradeManager.d.ts +178 -0
  815. package/dist/workflow/UpgradeManager.js +665 -0
  816. package/dist/workflow/UpgradeManager.js.map +1 -0
  817. package/dist/workflow/VerificationCommands.d.ts +36 -0
  818. package/dist/workflow/VerificationCommands.js +123 -0
  819. package/dist/workflow/VerificationCommands.js.map +1 -0
  820. package/dist/workflow/VerificationProfile.d.ts +67 -0
  821. package/dist/workflow/VerificationProfile.js +241 -0
  822. package/dist/workflow/VerificationProfile.js.map +1 -0
  823. package/dist/workflow/VerificationSchema.d.ts +46 -0
  824. package/dist/workflow/VerificationSchema.js +97 -0
  825. package/dist/workflow/VerificationSchema.js.map +1 -0
  826. package/dist/workflow/WorkflowArtifactWriter.d.ts +113 -0
  827. package/dist/workflow/WorkflowArtifactWriter.js +242 -0
  828. package/dist/workflow/WorkflowArtifactWriter.js.map +1 -0
  829. package/dist/workflow/WorkflowEngine.d.ts +83 -0
  830. package/dist/workflow/WorkflowEngine.js +183 -0
  831. package/dist/workflow/WorkflowEngine.js.map +1 -0
  832. package/dist/workflow/WorkflowGuidance.d.ts +30 -0
  833. package/dist/workflow/WorkflowGuidance.js +204 -0
  834. package/dist/workflow/WorkflowGuidance.js.map +1 -0
  835. package/dist/workflow/WorkflowOpenTasks.d.ts +16 -0
  836. package/dist/workflow/WorkflowOpenTasks.js +37 -0
  837. package/dist/workflow/WorkflowOpenTasks.js.map +1 -0
  838. package/dist/workflow/WorkflowOrchestrator.d.ts +59 -0
  839. package/dist/workflow/WorkflowOrchestrator.js +326 -0
  840. package/dist/workflow/WorkflowOrchestrator.js.map +1 -0
  841. package/dist/workflow/WorkflowTemplates.d.ts +38 -0
  842. package/dist/workflow/WorkflowTemplates.js +371 -0
  843. package/dist/workflow/WorkflowTemplates.js.map +1 -0
  844. package/dist/workflow/WorkspaceLifecycle.d.ts +71 -0
  845. package/dist/workflow/WorkspaceLifecycle.js +401 -0
  846. package/dist/workflow/WorkspaceLifecycle.js.map +1 -0
  847. package/dist/workflow/WorkspacePolicy.d.ts +46 -0
  848. package/dist/workflow/WorkspacePolicy.js +141 -0
  849. package/dist/workflow/WorkspacePolicy.js.map +1 -0
  850. package/dist/workflow/WorkspaceSafety.d.ts +9 -0
  851. package/dist/workflow/WorkspaceSafety.js +49 -0
  852. package/dist/workflow/WorkspaceSafety.js.map +1 -0
  853. package/dist/workflow/WorkspaceTopology.d.ts +58 -0
  854. package/dist/workflow/WorkspaceTopology.js +176 -0
  855. package/dist/workflow/WorkspaceTopology.js.map +1 -0
  856. package/dist/workflow/autofix/AutoFixEngine.d.ts +37 -0
  857. package/dist/workflow/autofix/AutoFixEngine.js +169 -0
  858. package/dist/workflow/autofix/AutoFixEngine.js.map +1 -0
  859. package/dist/workflow/autonomous/AutonomousDevLoop.d.ts +88 -0
  860. package/dist/workflow/autonomous/AutonomousDevLoop.js +381 -0
  861. package/dist/workflow/autonomous/AutonomousDevLoop.js.map +1 -0
  862. package/dist/workflow/autonomous/BackgroundHunter.d.ts +74 -0
  863. package/dist/workflow/autonomous/BackgroundHunter.js +220 -0
  864. package/dist/workflow/autonomous/BackgroundHunter.js.map +1 -0
  865. package/dist/workflow/autonomous/WorklogManager.d.ts +50 -0
  866. package/dist/workflow/autonomous/WorklogManager.js +264 -0
  867. package/dist/workflow/autonomous/WorklogManager.js.map +1 -0
  868. package/dist/workflow/autonomous/index.d.ts +3 -0
  869. package/dist/workflow/autonomous/index.js +5 -0
  870. package/dist/workflow/autonomous/index.js.map +1 -0
  871. package/dist/workflow/cognitive/AmbiguityScorer.d.ts +17 -0
  872. package/dist/workflow/cognitive/AmbiguityScorer.js +107 -0
  873. package/dist/workflow/cognitive/AmbiguityScorer.js.map +1 -0
  874. package/dist/workflow/cognitive/ConsensusPlanner.d.ts +26 -0
  875. package/dist/workflow/cognitive/ConsensusPlanner.js +141 -0
  876. package/dist/workflow/cognitive/ConsensusPlanner.js.map +1 -0
  877. package/dist/workflow/cognitive/SocraticQuestioner.d.ts +33 -0
  878. package/dist/workflow/cognitive/SocraticQuestioner.js +276 -0
  879. package/dist/workflow/cognitive/SocraticQuestioner.js.map +1 -0
  880. package/dist/workflow/evolution/LessonExtractor.d.ts +90 -0
  881. package/dist/workflow/evolution/LessonExtractor.js +317 -0
  882. package/dist/workflow/evolution/LessonExtractor.js.map +1 -0
  883. package/dist/workflow/evolution/SelfImproveEngine.d.ts +156 -0
  884. package/dist/workflow/evolution/SelfImproveEngine.js +361 -0
  885. package/dist/workflow/evolution/SelfImproveEngine.js.map +1 -0
  886. package/dist/workflow/execution/RalphEngine.d.ts +54 -0
  887. package/dist/workflow/execution/RalphEngine.js +145 -0
  888. package/dist/workflow/execution/RalphEngine.js.map +1 -0
  889. package/dist/workflow/execution/UltraworkEngine.d.ts +43 -0
  890. package/dist/workflow/execution/UltraworkEngine.js +135 -0
  891. package/dist/workflow/execution/UltraworkEngine.js.map +1 -0
  892. package/dist/workflow/gates/EnhancedGates.d.ts +74 -0
  893. package/dist/workflow/gates/EnhancedGates.js +653 -0
  894. package/dist/workflow/gates/EnhancedGates.js.map +1 -0
  895. package/dist/workflow/gates/GateSystem.d.ts +180 -0
  896. package/dist/workflow/gates/GateSystem.js +1279 -0
  897. package/dist/workflow/gates/GateSystem.js.map +1 -0
  898. package/dist/workflow/gates/MetaGovernanceGates.d.ts +70 -0
  899. package/dist/workflow/gates/MetaGovernanceGates.js +617 -0
  900. package/dist/workflow/gates/MetaGovernanceGates.js.map +1 -0
  901. package/dist/workflow/gates/VisualGate.d.ts +41 -0
  902. package/dist/workflow/gates/VisualGate.js +174 -0
  903. package/dist/workflow/gates/VisualGate.js.map +1 -0
  904. package/dist/workflow/index.d.ts +45 -0
  905. package/dist/workflow/index.js +47 -0
  906. package/dist/workflow/index.js.map +1 -0
  907. package/dist/workflow/qa/E2ETestRunner.d.ts +102 -0
  908. package/dist/workflow/qa/E2ETestRunner.js +227 -0
  909. package/dist/workflow/qa/E2ETestRunner.js.map +1 -0
  910. package/dist/workflow/quality/HonestDelivery.d.ts +19 -0
  911. package/dist/workflow/quality/HonestDelivery.js +77 -0
  912. package/dist/workflow/quality/HonestDelivery.js.map +1 -0
  913. package/dist/workflow/quality/KarpathyEvaluator.d.ts +18 -0
  914. package/dist/workflow/quality/KarpathyEvaluator.js +76 -0
  915. package/dist/workflow/quality/KarpathyEvaluator.js.map +1 -0
  916. package/dist/workflow/types.d.ts +151 -0
  917. package/dist/workflow/types.js +4 -0
  918. package/dist/workflow/types.js.map +1 -0
  919. package/dist/workflows/DAGBuilder.d.ts +52 -0
  920. package/dist/workflows/DAGBuilder.js +169 -0
  921. package/dist/workflows/DAGBuilder.js.map +1 -0
  922. package/dist/workflows/GateParser.d.ts +55 -0
  923. package/dist/workflows/GateParser.js +73 -0
  924. package/dist/workflows/GateParser.js.map +1 -0
  925. package/dist/workflows/WorkflowExecutor.d.ts +56 -0
  926. package/dist/workflows/WorkflowExecutor.js +143 -0
  927. package/dist/workflows/WorkflowExecutor.js.map +1 -0
  928. package/dist/workflows/WorkflowOrchestrator.d.ts +81 -0
  929. package/dist/workflows/WorkflowOrchestrator.js +337 -0
  930. package/dist/workflows/WorkflowOrchestrator.js.map +1 -0
  931. package/dist/workflows/index.d.ts +2 -0
  932. package/dist/workflows/index.js +5 -0
  933. package/dist/workflows/index.js.map +1 -0
  934. package/dist/workflows/presets.d.ts +34 -0
  935. package/dist/workflows/presets.js +224 -0
  936. package/dist/workflows/presets.js.map +1 -0
  937. package/docs/README.md +105 -0
  938. package/docs/guides/DEVELOPMENT_WORKFLOW.md +99 -0
  939. package/docs/guides/GETTING_STARTED.md +93 -0
  940. package/docs/guides/MEDICAL_AGENT_OPERATING_GUIDE.md +61 -0
  941. package/docs/guides/MEDICAL_RESEARCH_DELIVERY.md +217 -0
  942. package/docs/guides/MIGRATION.md +119 -0
  943. package/docs/reference/cli.md +2921 -0
  944. package/docs/start/README.md +79 -0
  945. package/docs/start/agent-governance-demo.md +107 -0
  946. package/docs/start/artifact-lifecycle.md +326 -0
  947. package/docs/start/quickstart.md +191 -0
  948. package/docs/start/workflow-upgrade.md +198 -0
  949. package/docs/workflow/GATES_AND_SCORE.md +89 -0
  950. package/docs/workflow/PROMPT_OPTIMIZATION.md +44 -0
  951. package/docs/workflow/README.md +123 -0
  952. package/docs/workflow/node-library.md +52 -0
  953. package/docs/workflow/templates/api-contract.md +29 -0
  954. package/docs/workflow/templates/architecture-review.md +23 -0
  955. package/docs/workflow/templates/db-change-plan.md +20 -0
  956. package/docs/workflow/templates/docs-impact.md +17 -0
  957. package/docs/workflow/templates/e2e-plan.md +20 -0
  958. package/docs/workflow/templates/explore.md +16 -0
  959. package/docs/workflow/templates/github-actions-scale-preflight.yml +32 -0
  960. package/docs/workflow/templates/mini-prd.md +16 -0
  961. package/docs/workflow/templates/plan.md +37 -0
  962. package/docs/workflow/templates/pre-push-scale-preflight.sh +8 -0
  963. package/docs/workflow/templates/product-smoke.md +61 -0
  964. package/docs/workflow/templates/reality-check.md +28 -0
  965. package/docs/workflow/templates/resource-cleanup.md +17 -0
  966. package/docs/workflow/templates/resource-impact.md +25 -0
  967. package/docs/workflow/templates/review.md +12 -0
  968. package/docs/workflow/templates/runtime.md +23 -0
  969. package/docs/workflow/templates/security-review.md +26 -0
  970. package/docs/workflow/templates/skill-evidence.md +33 -0
  971. package/docs/workflow/templates/skill-plan.md +39 -0
  972. package/docs/workflow/templates/spec.md +17 -0
  973. package/docs/workflow/templates/standards-impact.md +28 -0
  974. package/docs/workflow/templates/summary.md +16 -0
  975. package/docs/workflow/templates/tasks.md +8 -0
  976. package/docs/workflow/templates/ui-spec.md +29 -0
  977. package/docs/workflow/templates/verification.md +20 -0
  978. package/docs/workflow/templates/visual-review.md +20 -0
  979. package/docs/zh/quickstart.md +108 -0
  980. package/examples/demo-projects/agent-governance-demo/CONTEXT.md +14 -0
  981. package/examples/demo-projects/agent-governance-demo/README.md +48 -0
  982. package/examples/demo-projects/agent-governance-demo/docs/CONTEXT-MAP.md +14 -0
  983. package/examples/demo-projects/agent-governance-demo/package.json +22 -0
  984. package/examples/demo-projects/agent-governance-demo/src/oauth-state.ts +39 -0
  985. package/examples/demo-projects/agent-governance-demo/tests/oauth-state.test.ts +52 -0
  986. package/mcp-configs/_INDEX.md +55 -0
  987. package/mcp-configs/context7/config.json +9 -0
  988. package/mcp-configs/fetch/config.json +9 -0
  989. package/mcp-configs/filesystem/config.json +9 -0
  990. package/mcp-configs/github/config.json +11 -0
  991. package/mcp-configs/memory/config.json +9 -0
  992. package/mcp-configs/neon/config.json +11 -0
  993. package/mcp-configs/playwright/config.json +9 -0
  994. package/mcp-configs/postgres/config.json +11 -0
  995. package/mcp-configs/puppeteer/config.json +9 -0
  996. package/mcp-configs/sequential-thinking/config.json +9 -0
  997. package/package.json +113 -0
  998. package/scripts/workflow/lib/gbrain-runtime.mjs +185 -0
  999. package/scripts/workflow/lib/report-output.mjs +107 -0
  1000. package/scripts/workflow/medscale-release-smoke.mjs +338 -0
  1001. package/scripts/workflow/provider-rehearsal.mjs +597 -0
  1002. package/scripts/workflow/setup-smoke.mjs +433 -0
  1003. package/target-research-platform/bridge_runner.py +310 -0
  1004. package/target-research-platform/config.yaml +148 -0
  1005. package/target-research-platform/data/immune_infiltration/ACC.csv +201 -0
  1006. package/target-research-platform/data/immune_infiltration/BLCA.csv +201 -0
  1007. package/target-research-platform/data/immune_infiltration/BRCA.csv +201 -0
  1008. package/target-research-platform/data/immune_infiltration/CESC.csv +201 -0
  1009. package/target-research-platform/data/immune_infiltration/CHOL.csv +201 -0
  1010. package/target-research-platform/data/immune_infiltration/COAD.csv +201 -0
  1011. package/target-research-platform/data/immune_infiltration/DLBC.csv +201 -0
  1012. package/target-research-platform/data/immune_infiltration/ESCA.csv +201 -0
  1013. package/target-research-platform/data/immune_infiltration/GBM.csv +201 -0
  1014. package/target-research-platform/data/immune_infiltration/HNSC.csv +201 -0
  1015. package/target-research-platform/data/immune_infiltration/KICH.csv +201 -0
  1016. package/target-research-platform/data/immune_infiltration/KIRC.csv +201 -0
  1017. package/target-research-platform/data/immune_infiltration/KIRP.csv +201 -0
  1018. package/target-research-platform/data/immune_infiltration/LAML.csv +201 -0
  1019. package/target-research-platform/data/immune_infiltration/LGG.csv +201 -0
  1020. package/target-research-platform/data/immune_infiltration/LIHC.csv +201 -0
  1021. package/target-research-platform/data/immune_infiltration/LUAD.csv +201 -0
  1022. package/target-research-platform/data/immune_infiltration/LUSC.csv +201 -0
  1023. package/target-research-platform/data/immune_infiltration/MESO.csv +201 -0
  1024. package/target-research-platform/data/immune_infiltration/OV.csv +201 -0
  1025. package/target-research-platform/data/immune_infiltration/PAAD.csv +201 -0
  1026. package/target-research-platform/data/immune_infiltration/PCPG.csv +201 -0
  1027. package/target-research-platform/data/immune_infiltration/PRAD.csv +201 -0
  1028. package/target-research-platform/data/immune_infiltration/READ.csv +201 -0
  1029. package/target-research-platform/data/immune_infiltration/SARC.csv +201 -0
  1030. package/target-research-platform/data/immune_infiltration/SKCM.csv +201 -0
  1031. package/target-research-platform/data/immune_infiltration/STAD.csv +201 -0
  1032. package/target-research-platform/data/immune_infiltration/TGCT.csv +201 -0
  1033. package/target-research-platform/data/immune_infiltration/THCA.csv +201 -0
  1034. package/target-research-platform/data/immune_infiltration/THYM.csv +201 -0
  1035. package/target-research-platform/data/immune_infiltration/UCEC.csv +201 -0
  1036. package/target-research-platform/data/immune_infiltration/UCS.csv +201 -0
  1037. package/target-research-platform/data/immune_infiltration/UVM.csv +201 -0
  1038. package/target-research-platform/docs/JSON_SCHEMA.md +352 -0
  1039. package/target-research-platform/docs/PROGRESS_2026-06-09.md +140 -0
  1040. package/target-research-platform/main.py +755 -0
  1041. package/target-research-platform/pyproject.toml +54 -0
  1042. package/target-research-platform/requirements.txt +9 -0
  1043. package/target-research-platform/run_dashboard.py +5 -0
  1044. package/target-research-platform/run_real_medical_workflow.py +28 -0
  1045. package/target-research-platform/scripts/demo_report.py +481 -0
  1046. package/target-research-platform/scripts/generate_evidence_package.py +75 -0
  1047. package/target-research-platform/scripts/prepare_immune_data.py +386 -0
  1048. package/target-research-platform/src/__init__.py +4 -0
  1049. package/target-research-platform/src/analysis/__init__.py +3 -0
  1050. package/target-research-platform/src/analysis/stage1_expression/__init__.py +12 -0
  1051. package/target-research-platform/src/analysis/stage1_expression/immune_correlation.py +366 -0
  1052. package/target-research-platform/src/analysis/stage1_expression/pipeline.py +579 -0
  1053. package/target-research-platform/src/analysis/stage1_expression/survival_analysis.py +382 -0
  1054. package/target-research-platform/src/analysis/stage2_screening/__init__.py +12 -0
  1055. package/target-research-platform/src/analysis/stage2_screening/differential_expression.py +451 -0
  1056. package/target-research-platform/src/analysis/stage2_screening/druggability_score.py +477 -0
  1057. package/target-research-platform/src/analysis/stage2_screening/pipeline.py +822 -0
  1058. package/target-research-platform/src/analysis/stage3_deep_research/__init__.py +12 -0
  1059. package/target-research-platform/src/analysis/stage3_deep_research/competitive_landscape.py +479 -0
  1060. package/target-research-platform/src/analysis/stage3_deep_research/pipeline.py +763 -0
  1061. package/target-research-platform/src/analysis/stage3_deep_research/target_function.py +290 -0
  1062. package/target-research-platform/src/analysis/stage4_business/__init__.py +12 -0
  1063. package/target-research-platform/src/analysis/stage4_business/business_plan.py +816 -0
  1064. package/target-research-platform/src/analysis/stage4_business/milestone_planner.py +844 -0
  1065. package/target-research-platform/src/analysis/stage4_business/pipeline.py +284 -0
  1066. package/target-research-platform/src/api_clients/__init__.py +29 -0
  1067. package/target-research-platform/src/api_clients/aminer_client.py +163 -0
  1068. package/target-research-platform/src/api_clients/base_client.py +186 -0
  1069. package/target-research-platform/src/api_clients/clinicaltrials_client.py +411 -0
  1070. package/target-research-platform/src/api_clients/geo_client.py +1420 -0
  1071. package/target-research-platform/src/api_clients/gtex_client.py +209 -0
  1072. package/target-research-platform/src/api_clients/hpa_client.py +170 -0
  1073. package/target-research-platform/src/api_clients/immune_data_manager.py +247 -0
  1074. package/target-research-platform/src/api_clients/openalex_client.py +86 -0
  1075. package/target-research-platform/src/api_clients/opentargets_client.py +558 -0
  1076. package/target-research-platform/src/api_clients/pubmed_client.py +361 -0
  1077. package/target-research-platform/src/api_clients/tcga_client.py +712 -0
  1078. package/target-research-platform/src/api_clients/timer_client.py +169 -0
  1079. package/target-research-platform/src/dashboard/app.py +2283 -0
  1080. package/target-research-platform/src/dashboard/deliverables.py +710 -0
  1081. package/target-research-platform/src/dashboard/static/artifactPreview.js +96 -0
  1082. package/target-research-platform/src/dashboard/static/index.html +1292 -0
  1083. package/target-research-platform/src/dashboard/status_tracker.py +237 -0
  1084. package/target-research-platform/src/output/__init__.py +42 -0
  1085. package/target-research-platform/src/output/agent_llm_provider.py +171 -0
  1086. package/target-research-platform/src/output/chart_generator.py +550 -0
  1087. package/target-research-platform/src/output/data_exporter.py +215 -0
  1088. package/target-research-platform/src/output/delivery_packager.py +791 -0
  1089. package/target-research-platform/src/output/evidence_package.py +230 -0
  1090. package/target-research-platform/src/output/journal_templates.py +193 -0
  1091. package/target-research-platform/src/output/literature_enricher.py +395 -0
  1092. package/target-research-platform/src/output/literature_reviewer.py +420 -0
  1093. package/target-research-platform/src/output/manuscript_fact_checker.py +279 -0
  1094. package/target-research-platform/src/output/manuscript_generator.py +1189 -0
  1095. package/target-research-platform/src/output/manuscript_quality.py +401 -0
  1096. package/target-research-platform/src/output/medical_skills_bridge.py +140 -0
  1097. package/target-research-platform/src/output/report_generator.py +542 -0
  1098. package/target-research-platform/src/output/usage_envelope.py +193 -0
  1099. package/target-research-platform/src/utils/__init__.py +1 -0
  1100. package/target-research-platform/src/utils/config.py +125 -0
  1101. package/target-research-platform/src/utils/logger.py +71 -0
  1102. package/target-research-platform/src/validators/__init__.py +13 -0
  1103. package/target-research-platform/src/validators/cross_validator.py +394 -0
  1104. 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">&#128196;</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">&#128200;</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,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
990
+ }
991
+
992
+ function escapeAttr(text) {
993
+ return escapeHtml(text).replace(/"/g,'&quot;').replace(/'/g,'&#39;');
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">&#128193;</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">&#128200;</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>