日报 — 2026-03-18

今日概览

  • 做了什么: 跨DCC、tianhe、本地三台设备,并行推进MIHD跨切片对齐/批次效应评估、π₀.₅任务完成检测头全链路实现、VLA评估管道修复与实验扩展(manip_progress记录/LIBERO环境/Exp5-9)、CalendarPro批量意图识别四条独立研究线
  • 怎么做的: MIHD采用harmonypy后处理对齐+纯Python批次效应指标重写+pipeline全链路集成;π₀.₅使用JAX/NNX继承模式保持checkpoint路径兼容,通过追踪output transform数据流修复progress字段被静默丢弃的根本原因;CalendarPro在路由-分类-处理三层全链路添加BATCH_UPDATE支持并结合关键词计数规则弥补嵌入盲区
  • 有什么用: MIHD跨切片对齐管道端到端打通(Harmony使batch_entropy从0.33提升至0.52);π₀.₅任务完成检测头训练正式落地(loss≈0.253),VLA progress评估基础建立;Exp5-9系统覆盖5种conditioning策略;CalendarPro批量任务状态自然语言交互问题解决

DCC

  • 做了什么: 完成MIHD跨切片Embedding对齐(HarmonyAligner+JointSTAIGAligner)与批次效应评估指标(ASW_batch/batch_entropy/batch_kl/graph_connectivity)的完整实现,修复alignment传播bug并完成端到端验证,同步更新CLAUDE.md
  • 怎么做的: 新建utils/batch_metrics.py和pipeline/alignment.py,修改cache_manager/evaluation_planner/runner/run_pipeline等6个文件完成全链路集成,发现并修复all_aligned模式下alignment参数未注入evaluate阶段的3行关键bug,用真实DLPFC数据运行三组验证实验
  • 有什么用: alignment端到端流程打通,Harmony使batch_entropy从0.33升至0.52(batch_kl从0.39降至0.25),修复了对齐功能实际完全失效的核心bug

tianhe

  • 做了什么: 完成π₀.₅任务完成检测头从设计到训练启动的全链路落地;修复VLA评估管道中manip_progress字段被output transform静默丢弃的根本原因并完善sinusoidal编码;修复LIBERO libero_object_com注册缺失及评估环境多个阻塞;设计Exp5-9五种conditioning策略实验配置;完善error-recovery-benchmark CLAUDE.md文档
  • 怎么做的: 用JAX/NNX继承模式(而非组合)保持checkpoint路径兼容;追踪RobotwinOutputs.__call__定位progress被丢弃的根本位置;逐仓库追踪Python模块加载路径定位LIBERO多路径污染根因;在pi0_config.py添加cond_mode字段支持from_pred/from_hidden/sinusoidal/detach四种模式
  • 有什么用: π₀.₅完成检测头训练正常启动(loss≈0.253),progress记录pipeline建立;LIBERO评估环境可复现运行;Exp5-9扩展实验空间覆盖端到端梯度、中间层conditioning、detached conditioning等方向

TzJsDesktop

  • 做了什么: 为CalendarPro实现BATCH_UPDATE意图,解决用户批量汇报任务状态时系统返回"我不太确定"的核心缺陷,同步改进CLAUDE.md文档
  • 怎么做的: 分析根本原因链(路由嵌入相似度低→LLM分类器无该意图→clarification分支丢弃回复),跨语义路由/LLM分类器/处理器三层修改8个文件,添加关键词计数规则(2+完成动词→+0.30 boost),21个新测试+72个相关测试全部通过
  • 有什么用: 修复高频日常交互场景缺陷,用户可通过自然语言批量更新complete/cancel/reschedule/note四类操作;GENERAL fallback改进使实质性LLM回复不再被丢弃

跨DCC、tianhe、本地三台设备并行推进四条研究线:在DCC完成MIHD跨切片Embedding对齐与批次效应评估体系端到端落地;在tianhe实现π₀.₅任务完成检测头训练上线、修复VLA评估管道manip_progress记录缺失、完成LIBERO环境修复与Exp5-9实验配置设计;在本地为CalendarPro实现批量任务状态更新意图,解决高频日常交互核心缺陷。

今日任务

架构与策略

  • MIHD 批次效应评估指标实现(utils/batch_metrics.py) — 新建utils/batch_metrics.py,用sklearn.neighbors.NearestNeighbors纯Python实现ASW_batch、batch_entropy、batch_kl、graph_connectivity四个跨切片批次效应量化指标,不依赖R包
  • MIHD 跨切片 Embedding 对齐实现(pipeline/alignment.py) — 新建pipeline/alignment.py,实现HarmonyAligner(harmonypy后处理对齐)与JointSTAIGAligner(block-diagonal多切片联合训练),修改cache_manager/evaluation_planner/runner/run_pipeline等6个文件完成全链路集成
  • π₀.₅ 任务完成检测头设计与实现 — 全链路完成:设计阶段确定prefix_output mean pooling为特征来源、复用freeze_filter+nnx.DiffState机制;实现阶段新建CompletionHead/Pi0WithCompletionHead(继承方式)/train_completion_head.py,修复数据集键名映射(observation.task_completed)和checkpoint路径问题,训练正常启动(loss≈0.253,参数冻结验证正确)
  • π₀.₅ Exp5-9 实验配置设计与实现 — 在pi0_config.py添加cond_mode字段,重构pi0.py的_compute_progress返回(cond, pred),在config.py添加5个实验:Exp5(from_hidden+last_token)、Exp6(from_hidden+special_token)、Exp7(sinusoidal+last_token)、Exp8(sinusoidal+special_token)、Exp9(detach_cond+last_token)
  • CalendarPro BATCH_UPDATE 意图实现 — 修改8个文件新增BATCH_UPDATE枚举、语义路由(21个utterance)、关键词计数规则(2+完成动词→+0.30 boost)、LLM prompt schema、handler(支持complete/cancel/reschedule/note),同时修复GENERAL fallback使实质性LLM回复不被丢弃;21个新测试+72个相关测试全部通过
  • MIHD alignment 传播 bug 修复与端到端验证 — 修复all_aligned模式下–alignment参数未注入evaluate阶段的关键bug(3行代码),随后运行三组端到端验证实验:Harmony(6/6成功)、baseline batch metrics(CSV正确生成)、RM-IDEAL+batch_metrics,确认完整流程正确
  • manip_progress 推理日志实现与 output transform 修复 — 实现eval每episode结束后写入progress/episodeN.txt(步数索引为实际action步数N×chunk_size);定位并修复根本原因:RobotwinOutputs.__call__只返回{actions}字段,静默丢弃manip_progress,导致上游预测结果外部完全不可见
  • π₀.₅ progress conditioning 改进(clip + sinusoidal编码) — 在_predict_progress输出后添加clip到[0,1]防止异常值;将scalar→linear(1024)改为scalar→sinusoidal(1024)→linear(1024→1024)使编码更合理

实现与修复

  • MIHD CLAUDE.md 审计改进 — 通过Explore agent审计CLAUDE.md,修复STAIG num_epochs文档错误(550→300),补充vision variant自动选择机制、scGPT集成路径、NumPy vs PyTorch fusion区分等缺失信息
  • LIBERO 评估环境修复(注册缺失 + 多项环境阻塞) — 修复libero_object_com在openpi/third_party/libero路径下未注册(经三次路径追踪确认正确位置);修复serve_policy.py容器hostname DNS解析失败、main.py客户端host默认值错误(0.0.0.0→127.0.0.1);解决MUJOCO_EGL_DEVICE_ID与容器GPU隔离冲突;优化rollout视频按任务名子文件夹保存
  • error-recovery-benchmark CLAUDE.md 文档更新 — 补充recovery_types.py/recovery_segmenter.py模块说明,扩展env_wrapper.py方法列表,新增recovery_collection.yaml配置项,追加Sawyer夹爪归一化陷阱说明,压缩冗余Slurm代码块
  • CalendarPro CLAUDE.md 文档改进 — 通过/init命令分析代码库,删除可从目录直接发现的枚举列表,新增多文件变更模式分步指导(添加意图类型、AI provider、后台服务),补充singleton测试隔离注意事项

问题与解决方案

关键问题

1. π₀.₅ Pi0WithCompletionHead使用组合方式(self.pi0 = Pi0(…))导致所有父模块参数路径多了pi0/前缀,pytree merge时抛出'2 children vs 1 child’ ValueError,checkpoint完全无法加载

解决方案: 改为继承方式(class Pi0WithCompletionHead(Pi0)),Pi0参数直接在顶层与checkpoint路径完全对齐;completion_head通过missing_regex保留随机初始化

关键洞察: Flax NNX的checkpoint路径由模块树结构决定:组合会在所有父模块参数路径前加一层前缀,继承则不会——需要加载现有checkpoint的扩展模型,继承是唯一可行方案

2. RoboTwin output transform静默丢弃manip_progress:RobotwinOutputs.__call__只返回{“actions”:…},模型即使正确预测progress字段,外部也永远无法获取,eval txt文件始终为空

解决方案: 修改output transform的return dict包含manip_progress字段,数据流重新打通

关键洞察: output transform是推理链中的隐式过滤器,任何不在return dict中的字段都被静默丢弃;排查此类bug应从数据流终点向上游追踪,而非假设上游已正确输出

3. CalendarPro用户批量汇报任务状态时系统返回’我不太确定您想做什么’而非处理请求

解决方案: 分析完整根本原因链:语义路由嵌入相似度低(~0.20 vs 0.50阈值)→LLM分类器无batch_update意图→GENERAL handler clarification分支丢弃AI回复输出硬编码提示;在路由-分类-处理三层全链路添加BATCH_UPDATE支持,关键词计数规则(2+完成动词→+0.30 boost)弥补嵌入盲区

关键洞察: 单意图架构对多任务消息的嵌入相似度天然偏低,纯语义路由不够;GENERAL fallback应先判断LLM回复是否实质性内容(>20字且非模板句)再决定是否使用

4. MIHD all_aligned模式下–alignment参数未注入evaluate阶段,EvaluationJob.alignment始终为None,Harmony对齐结果被完全忽略

解决方案: 在run_pipeline.py evaluate阶段前加3行代码:当phase==‘all_aligned’且args.alignment有值时,将alignment注入每个experiment的extra_config[‘alignment’]

关键洞察: 多阶段pipeline中CLI参数与实验配置之间的隔离设计在引入新阶段时容易造成数据流断裂,每个跨阶段的新参数都需要检查完整数据流路径

5. pi0.5 prefix_output的语义不明确:文档未说明prefix/suffix的物理含义,当前代码将prefix_output丢弃,难以判断适合分类的特征来源

解决方案: 通过代码探索确认:prefix=[BOS]+图像+语言全局token,suffix=action expert与VLM交互token;prefix_output的mean pooling语义清晰适合分类任务

关键洞察: VLM-Action expert的特征边界分析是设计分类头的关键前提,需要通读完整forward调用链

6. from_hidden模式训练时’多一次forward pass’的解释歧义:用户多次无法理解训练与推理计算图的差异

解决方案: 对比分析厘清机制:推理永远两步;训练时Exp1-4可用teacher forcing(GT标签提前已知)将prefix+suffix合并为一次联合forward优化;from_hidden模式因conditioning依赖模型输出引入循环依赖,无法做此优化,必须额外一次prefix-only forward

关键洞察: 训练和推理的计算图不同:teacher forcing使conditioning成为常数可做联合forward;from_hidden引入循环依赖必须退回与推理相同的两步流程

7. STAIG原始批次效应指标(batch_kl, batch_entropy)依赖R包nabor,无法在General Python环境中运行

解决方案: 用sklearn.neighbors.NearestNeighbors完全替代R nabor,纯Python重写所有kNN查询逻辑

关键洞察: 跨语言依赖(Python↔R)是ML项目常见摩擦点,Python替代方案通常存在且更易维护

一般问题

8. LIBERO多路径污染导致注册修复不生效:PYTHONPATH中存在三条LIBERO路径,修改了错误路径,实际加载的是openpi/third_party/libero

解决方案:python -c 'import libero.libero.benchmark; print(__file__)'确认运行时实际加载路径,在该路径修改并复制bddl文件

关键洞察: 多版本包并存时editable install .pth文件可能因MAPPING为空而不生效,实际加载顺序由PYTHONPATH决定,必须运行时确认

9. RepackTransform报KeyError,数据集中任务完成标签实际键名为observation.task_completed而非task_completed

解决方案: 将config.py中映射从’task_completed’:’task_completed’改为’task_completed’:‘observation.task_completed’

关键洞察: LeRobot数据集键名使用点分隔嵌套路径,RepackTransform的值字段必须精确匹配数据集原始路径

10. K8s容器手动export CUDA_VISIBLE_DEVICES=0,1后JAX报cuInit失败,No visible GPU devices

解决方案: 去掉手动设置使用容器默认分配:容器实际只分配了物理GPU 1,强制包含GPU 0导致CUDA运行时因无访问权限cuInit完全失败

关键洞察: K8s容器内CUDA_VISIBLE_DEVICES只能在已分配设备范围内重映射,应用jax.devices()而非nvidia-smi验证框架层实际可见设备

人类思路 vs AI 思路

战略层面

π₀.₅ 任务完成检测头架构设计决策(Config类设计 + 继承vs组合)

角色 思路
人类 人类主动指出TrainConfig已有freeze_filter机制可直接复用,无需新建Config类;在看到pytree结构错误后立即意识到是继承/组合对checkpoint路径的影响差异
AI AI初始提案是新建独立TaskCompleteHeadConfig类(更正式的类型隔离)和使用组合方式(更符合单一职责原则),两次均未预见框架特定行为带来的实际约束

差异分析: 人类对现有代码框架可扩展性和Flax NNX的checkpoint行为更熟悉,倾向最小改动复用现有机制;AI倾向形式化设计,在框架特定行为预判上存在盲区

定位 output transform 静默丢弃 bug(坚持深度追查)

角色 思路
人类 用户通过持续实验反馈(‘又跑了一遍,还是没有’)推动调查深入,不接受表面解释
AI AI首先假设是旧任务问题,当用户证明不是后才继续追踪推理链,最终在RobotwinOutputs中找到根本原因

差异分析: 人类通过持续施压推动问题深度调查;AI倾向于在找到合理但非根本的解释后停止追查,需要外部压力才能继续深挖

Exp9 detach conditioning 的设计动机与代价分析

角色 思路
人类 用户独立提出AI未考虑的变体:progress_cond传给action expert时detach,让MLP只由aux_loss监督,以节省计算
AI AI分析该方案局限:节省的只是prefix-only backward,前向仍在;且会退化成与Exp3/4差异不大的实验(失去端到端梯度核心价值);但尊重用户判断实现了Exp9

差异分析: 用户提出探索性想法,AI提供批判性分析评估代价与收益;AI能清晰阐明折衷,但不越权拒绝实现

action/aux loss 比例悬殊的合理性判断

角色 思路
人类 用户观察action loss ~0.0002、aux loss ~0.04,直觉感到比例悬殊,询问是否需要减小系数
AI AI分析:stop_gradient使两个loss作用于完全不同参数集,比例悬殊不等于失衡;aux loss 0.04对[0,1]预测属正常水平;结论无需调整

差异分析: 用户直觉来自表面数字,AI通过参数集分离机制分析给出更准确判断;典型的AI提供超出用户直觉认知价值的案例

批次效应指标 R 依赖的主动处理

角色 思路
人类 人类原始计划引用了STAIG仓库中使用R包的实现
AI AI在环境检测后主动决策:用sklearn纯Python重写所有R依赖函数,避免引入新依赖

差异分析: AI的主动环境感知能力避免了依赖问题,人类的参考实现为算法正确性提供了保证

实现层面

LIBERO 路径污染排查方向偏差

角色 思路
人类 人类发现换新窗口后仍报错,主动指出是openpi/third_party/libero路径,而非AI关注的Openpi-moe路径
AI AI依次修改Openpi-moe路径→LIBERO主仓库路径,方向多次偏差,需要运行时诊断命令逐步缩小范围

差异分析: 人类对自己的代码仓库布局更熟悉,能更快锁定正确路径;AI需要系统性诊断才能收敛

AI 局限性

重要局限

  • 数据流追踪不完整导致两类隐蔽缺陷:实现阶段遗漏alignment参数到evaluate阶段的桥接(对齐功能实际完全失效);排查阶段对output transform静默丢弃字段假设不够深入(需用户两轮反馈才推进到根本原因)——均属于在多阶段数据流中对隐式截断点缺乏全局审视
  • 框架特定行为预判不足:未能在设计阶段预见Flax NNX继承与组合对checkpoint参数路径的影响差异(需运行时pytree错误才发现);低估JAX/NNX现有TrainConfig机制的复用空间(提出了不必要的新Config类)

一般局限

  • from_hidden训练模式的首次解释抽象且不准确(未区分推理和训练场景的计算图差异),需要用户追问两次才形成清晰的对比分析
  • 外部工具链路径解析连续偏差:LIBERO路径污染排查中连续三次定位到错误路径,需要用户提示和多次import追踪才能收敛
  • 低级技术错误:K8s GPU方案(MUJOCO_EGL_DEVICE_ID=0)与binding_utils.py断言冲突引发二次报错;CalendarPro测试文件导入路径写错需运行失败后修复;命令默认超时不足以完成GPU密集型任务

今日收获

核心收获

  • π₀.₅训练计算图特性:推理天然两步(VLM prefix forward→action expert denoising),训练时Exp1-4可用teacher forcing将prefix+suffix合并为一次联合forward(conditioning=GT标签提前已知);from_hidden模式因conditioning依赖模型输出引入循环依赖,必须额外一次prefix-only forward,与推理保持相同的两步流程
  • π₀.₅梯度流向机制:action loss通过action expert的cross-attention(K/V来自VLM prefix tokens)反传回VLM backbone;stop_gradient将aux loss严格限制于MLP参数,两个loss作用于完全不同参数集,因此action/aux loss数值比例悬殊不代表训练失衡
  • Flax NNX扩展已训练模型时,继承(class Child(Parent))是保持checkpoint路径兼容的唯一方案;组合方式会在所有父模块参数路径前加一层前缀导致checkpoint merge完全失败
  • Harmony跨切片对齐对PCA embedding有实际改善效果(batch_entropy 0.33→0.52,batch_kl 0.39→0.25),但改善幅度有限——per-section PCA的批次效应主要源于特征空间本身的不一致,后处理校正只是缓解手段
  • 数据流透明度原则:多阶段pipeline(extract→align→evaluate)中每个阶段配置必须显式传递给下游,不能依赖隐式共享;output transform是推理链的隐式过滤器,必须明确维护需要透传的字段——‘模型预测了但外部永远看不到’是隐蔽性最高的一类bug,需从数据流终点向上游追踪
  • VLM的prefix_output(全局[BOS]+图像+语言token的mean pooling)比action expert的suffix_output更适合做任务完成分类,因为它编码了全局状态理解而非逐步骤动作信息
  • 批量意图检测需要专门架构:嵌入相似度对’多任务状态消息’天然偏低,关键词计数规则(2+完成动词→+0.30 boost)是弥补嵌入盲区的有效补充;GENERAL fallback应先判断LLM回复是否实质性内容再决定是否使用,不应无条件丢弃
  • 现有框架的冻结机制(如NNX的freeze_filter+nnx.DiffState)设计时通常已考虑扩展性,优先尝试复用而非新建,可大幅减少代码改动量

实践收获

  • K8s容器GPU隔离:nvidia-smi可见全部物理GPU但CUDA运行时受容器cgroup隔离;手动CUDA_VISIBLE_DEVICES超出分配范围会导致cuInit完全失败而非仅限制可见卡;应始终用jax.devices()或torch.cuda.device_count()验证框架层可见设备数
  • 多版本包并存时,editable install .pth文件可能因MAPPING为空而不生效,实际加载路径由PYTHONPATH顺序决定;必须用python -c 'import pkg; print(pkg.__file__)'在运行时确认实际加载路径
  • orbax checkpoint目录层级:step目录(29999/)存元数据和资产,params/子目录才存实际参数;weight_loader路径必须精确指向params/子目录

会话摘要

MIHD

✅ 跨切片Embedding对齐+批次效应评估体系完整落地(CLAUDE.md审计、实现、bug修复、端到端验证) 15:54:08.591 | claude_code 全天在DCC完成MIHD对齐体系完整闭环:首先通过/init审计CLAUDE.md修复STAIG num_epochs文档错误(550→300)并补充架构细节;随后新建utils/batch_metrics.py(4个纯Python批次效应指标,无R依赖)和pipeline/alignment.py(Harmony+JointSTAIG两种对齐方法),修改6个现有文件完成全链路集成;代码审查阶段发现all_aligned模式下alignment参数未传递给evaluate阶段的关键bug(3行修复),最终三组端到端验证实验全部通过,Harmony使batch_entropy从0.33提升至0.52。

RoboBrain π₀.₅

✅ 任务完成检测头从架构设计到训练正常启动的全链路实现 08:27:35.886 | claude_code 设计阶段:探索pi0.py/gemma_pytorch.py/config.py后确定prefix_output mean pooling为最佳特征来源,复用freeze_filter+nnx.DiffState而非新建Config类,将完整设计写入plans文档。实现阶段:新建CompletionHead/Pi0WithCompletionHead/train_completion_head.py,依次修复数据集键名映射(observation.task_completed)、checkpoint路径缺少/params后缀、以及组合方式导致的pytree结构不匹配(改为继承方式后解决),训练正常启动(loss≈0.253,参数冻结验证正确,git commit 4032363)。

RoboTwin VLA

✅ manip_progress记录修复(output transform根本原因)+ conditioning改进 + Exp5-9实验配置设计 03:19:42.227 | claude_code manip_progress线:实现后文件未生成,AI先误判为旧任务问题,用户坚持后追踪到根本原因——RobotwinOutputs.__call__只返回actions字段静默丢弃progress,修复后正常生成(步数索引按实际action步数对齐)。conditioning改进线:实现clip异常值+sinusoidal编码,分析stop_gradient机制下action/aux loss比例悬殊不构成失衡。Exp5-9线:用户提出from_hidden/detach变体,经深入讨论training vs inference计算图差异及梯度流向,在pi0_config.py添加cond_mode字段重构_compute_progress支持四种模式,完成全部5个实验配置实现。

LIBERO Evaluation

✅ 修复LIBERO评估环境的多个阻塞问题 03:02:37.695 | claude_code 依次修复:serve_policy.py容器内hostname DNS解析失败、main.py客户端host默认值错误(0.0.0.0→127.0.0.1)、libero_object_com未在openpi/third_party/libero路径注册(经三次路径追踪确认正确位置)、MUJOCO_EGL_DEVICE_ID与容器GPU隔离冲突,以及K8s容器手动设置CUDA_VISIBLE_DEVICES超出分配范围导致cuInit失败。同时优化rollout视频按任务名称子文件夹保存。

Error Recovery Benchmark

✅ CLAUDE.md文档完善与训练job状态确认 21:57:16.386 | claude_code 完善CLAUDE.md五项改进:新增recovery_types.py/recovery_segmenter.py模块说明,扩展env_wrapper.py方法列表,补充recovery_collection.yaml配置项,追加Sawyer夹爪归一化陷阱(abs(qpos)/0.04而非均值),压缩冗余Slurm代码块。同时确认job 49363已结束、GPU资源完全释放,并应用户询问分析了phoenix_comparison checkpoint目录(Phoenix框架在MimicGen 9任务上的对比实验模型)。

CalendarPro

✅ BATCH_UPDATE意图实现(修复批量任务状态更新失败)+ CLAUDE.md文档改进 23:05:55.704 | claude_code 用户展示真实场景(批量汇报任务完成后收到’我不太确定’),AI分析根本原因链,实现完整BATCH_UPDATE支持:修改8个文件新增枚举/语义路由(21个utterance)/关键词计数规则/LLM prompt schema/handler(complete/cancel/reschedule/note),同时修复GENERAL fallback使实质性LLM回复不被丢弃;21个新测试+72个相关测试全部通过。同步执行/init分析代码库,重写CLAUDE.md删除冗余枚举列表,新增多文件变更模式分步指导和singleton测试隔离注意事项。

Token 用量

总览

指标 数值
总 Token 78,093,739
输入 Token 66,389
输出 Token 185,286
Cache 创建 5,267,243
Cache 读取 72,574,821
Cache 命中率 93.2%
总费用 (USD) $51.9719

模型明细

模型 输入 输出 Cache 创建 Cache 读取 费用 占比
claude-opus-4-6 20,841 84,827 2,528,202 41,860,584 $38.9564 75.0%
claude-haiku-4-5-20251001 40,467 75,418 1,686,148 15,316,199 $4.0569 7.8%
claude-sonnet-4-6 5,081 25,041 1,052,893 15,398,038 $8.9586 17.2%

各设备用量

设备 总 Token 输入 输出 费用
DCC 20,932,580 17,151 59,288 $17.2658
tianhe 18,960,166 19,243 41,156 $9.5852
TzJsDesktop 38,200,993 29,995 84,842 $25.1209