dsh-aris-panel 0.2.7 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -108
- package/README_CN.md +98 -89
- package/aris/.claude-plugin/marketplace.json +34 -0
- package/aris/.claude-plugin/plugin.json +19 -0
- package/aris/.codex-plugin/plugin.json +18 -0
- package/aris/.env.example +53 -0
- package/aris/.gitattributes +6 -0
- package/aris/.github/agents/aris-reviewer-claude.agent.md +10 -0
- package/aris/.github/agents/aris-reviewer-openai.agent.md +10 -0
- package/aris/.github/workflows/check-skills-inventory.yml +32 -0
- package/aris/.github/workflows/lint-skills-helpers.yml +38 -0
- package/aris/.github/workflows/test-install-aris-ps1.yml +31 -0
- package/aris/.github/workflows/test-suite.yml +59 -0
- package/aris/AGENT_GUIDE.md +222 -0
- package/aris/CONTRIBUTING.md +83 -0
- package/aris/CONTRIBUTING_CN.md +83 -0
- package/aris/LICENSE +21 -0
- package/aris/README.md +1739 -0
- package/aris/README_CN.md +1526 -0
- package/aris/SETUP_GUIDE.md +279 -0
- package/aris/SETUP_GUIDE_CN.md +279 -0
- package/aris/UPSTREAM.txt +2 -0
- package/aris/aris-monitor/README.md +158 -0
- package/aris/aris-monitor/assets/screenshot.png +0 -0
- package/aris/aris-monitor/focus-tty.sh +156 -0
- package/aris/aris-monitor/focus.py +93 -0
- package/aris/aris-monitor/run.sh +49 -0
- package/aris/aris-monitor/scanner.py +445 -0
- package/aris/aris-monitor/ticker.py +81 -0
- package/aris/aris-monitor/widget.py +372 -0
- package/aris/assets/claude-fleet-preview.png +0 -0
- package/aris/assets/community_showcase_7_10_codex.png +0 -0
- package/aris/assets/community_showcase_8_10.png +0 -0
- package/aris/assets/feishu_interactive.jpg +0 -0
- package/aris/assets/feishu_push.png +0 -0
- package/aris/assets/paper_illustration_demo.png +0 -0
- package/aris/commands/setup.md +77 -0
- package/aris/community_papers/UAV-CC.pdf +0 -0
- package/aris/docs/ALI_CODING_PLAN_GUIDE.md +324 -0
- package/aris/docs/ANTIGRAVITY_ADAPTATION.md +409 -0
- package/aris/docs/ANTIGRAVITY_ADAPTATION_CN.md +363 -0
- package/aris/docs/ARIS-Code-README_CN.md +8 -0
- package/aris/docs/ARIS-Code-README_EN.md +8 -0
- package/aris/docs/ARIS_INTRO.html +902 -0
- package/aris/docs/ARIS_INTRO.md +368 -0
- package/aris/docs/ARIS_INTRO.review.json +79 -0
- package/aris/docs/CODEX_CLAUDE_REVIEW_GUIDE.md +116 -0
- package/aris/docs/CODEX_CLAUDE_REVIEW_GUIDE_CN.md +116 -0
- package/aris/docs/CODEX_GEMINI_REVIEW_GUIDE.md +249 -0
- package/aris/docs/CODEX_GEMINI_REVIEW_GUIDE_CN.md +250 -0
- package/aris/docs/COPILOT_CLI_ADAPTATION.md +388 -0
- package/aris/docs/CURSOR_ADAPTATION.md +305 -0
- package/aris/docs/CUSTOMIZATION.md +155 -0
- package/aris/docs/CUSTOMIZATION_CN.md +154 -0
- package/aris/docs/GPU_SETUP.md +57 -0
- package/aris/docs/GPU_SETUP_CN.md +54 -0
- package/aris/docs/LLM_API_MIX_MATCH_GUIDE.md +256 -0
- package/aris/docs/MANUAL_REVIEW_GUIDE.md +128 -0
- package/aris/docs/MANUAL_REVIEW_GUIDE_CN.md +116 -0
- package/aris/docs/MINIMAX_MCP_GUIDE.md +198 -0
- package/aris/docs/MODELSCOPE_GUIDE.md +305 -0
- package/aris/docs/MODEL_COMBINATIONS.md +134 -0
- package/aris/docs/MODEL_COMBINATIONS_CN.md +134 -0
- package/aris/docs/MiniMax-GLM-Configuration.md +195 -0
- package/aris/docs/NARRATIVE_REPORT_EXAMPLE.md +143 -0
- package/aris/docs/OPENCLAW_ADAPTATION.md +59 -0
- package/aris/docs/OPENROUTER_GUIDE.md +255 -0
- package/aris/docs/OPENROUTER_GUIDE_CN.md +255 -0
- package/aris/docs/PROJECT_FILES_GUIDE.md +161 -0
- package/aris/docs/PROJECT_FILES_GUIDE_CN.md +161 -0
- package/aris/docs/RESUBMIT_AND_TALK.md +91 -0
- package/aris/docs/RESUBMIT_AND_TALK_CN.md +91 -0
- package/aris/docs/SESSION_RECOVERY_GUIDE.md +439 -0
- package/aris/docs/SESSION_RECOVERY_GUIDE_CN.md +431 -0
- package/aris/docs/SKILLS_CATALOG.md +204 -0
- package/aris/docs/TRAE_ARIS_RUNBOOK_CN.md +329 -0
- package/aris/docs/TRAE_ARIS_RUNBOOK_EN.md +329 -0
- package/aris/docs/WATCHDOG_GUIDE.md +200 -0
- package/aris/docs/WATCHDOG_GUIDE_CN.md +199 -0
- package/aris/docs/aris-code-banner.png +0 -0
- package/aris/docs/aris-code-screenshot.png +0 -0
- package/aris/docs/aris-movie-director-method.png +0 -0
- package/aris/docs/aris_intro_slides.pdf +0 -0
- package/aris/docs/aris_logo.svg +126 -0
- package/aris/docs/auto_review_score_curve.png +0 -0
- package/aris/docs/blogs/continuous_dlm_2026h1_survey.html +3262 -0
- package/aris/docs/hero_combined.svg +844 -0
- package/aris/docs/hero_idea.svg +158 -0
- package/aris/docs/hero_implement.svg +109 -0
- package/aris/docs/hero_interaction.svg +172 -0
- package/aris/docs/hf_daily_paper_1.svg +19 -0
- package/aris/docs/integrations/FEISHU.md +208 -0
- package/aris/docs/integrations/FEISHU_CN.md +208 -0
- package/aris/docs/integrations/OBSIDIAN.md +65 -0
- package/aris/docs/integrations/OBSIDIAN_CN.md +65 -0
- package/aris/docs/integrations/VAST_GPU_GUIDE.md +96 -0
- package/aris/docs/integrations/VAST_GPU_GUIDE_CN.md +96 -0
- package/aris/docs/integrations/ZOTERO.md +57 -0
- package/aris/docs/integrations/ZOTERO_CN.md +57 -0
- package/aris/docs/tutorials/3d_generation_tutorial.html +1018 -0
- package/aris/docs/tutorials/3d_generation_tutorial.md +1206 -0
- package/aris/docs/tutorials/3d_generation_tutorial.review.json +34 -0
- package/aris/docs/tutorials/3d_generation_tutorial_en.html +1018 -0
- package/aris/docs/tutorials/3d_generation_tutorial_en.md +1206 -0
- package/aris/docs/tutorials/README.md +77 -0
- package/aris/docs/tutorials/agent_foundations_tutorial.html +1081 -0
- package/aris/docs/tutorials/agent_foundations_tutorial.md +1229 -0
- package/aris/docs/tutorials/agent_foundations_tutorial.review.json +146 -0
- package/aris/docs/tutorials/agent_foundations_tutorial_en.html +1081 -0
- package/aris/docs/tutorials/agent_foundations_tutorial_en.md +1229 -0
- package/aris/docs/tutorials/agentic_rl_tutorial.html +1269 -0
- package/aris/docs/tutorials/agentic_rl_tutorial.md +1544 -0
- package/aris/docs/tutorials/agentic_rl_tutorial.review.json +74 -0
- package/aris/docs/tutorials/agentic_rl_tutorial_en.html +1269 -0
- package/aris/docs/tutorials/agentic_rl_tutorial_en.md +1544 -0
- package/aris/docs/tutorials/attention_tutorial.html +774 -0
- package/aris/docs/tutorials/attention_tutorial.md +812 -0
- package/aris/docs/tutorials/attention_tutorial.review.json +51 -0
- package/aris/docs/tutorials/attention_tutorial_en.html +774 -0
- package/aris/docs/tutorials/attention_tutorial_en.md +812 -0
- package/aris/docs/tutorials/diffusion_distillation_tutorial.html +1421 -0
- package/aris/docs/tutorials/diffusion_distillation_tutorial.md +1672 -0
- package/aris/docs/tutorials/diffusion_distillation_tutorial.review.json +114 -0
- package/aris/docs/tutorials/diffusion_distillation_tutorial_en.html +1421 -0
- package/aris/docs/tutorials/diffusion_distillation_tutorial_en.md +1672 -0
- package/aris/docs/tutorials/diffusion_foundations_tutorial.html +1239 -0
- package/aris/docs/tutorials/diffusion_foundations_tutorial.md +1481 -0
- package/aris/docs/tutorials/diffusion_foundations_tutorial.review.json +56 -0
- package/aris/docs/tutorials/diffusion_foundations_tutorial_en.html +1239 -0
- package/aris/docs/tutorials/diffusion_foundations_tutorial_en.md +1481 -0
- package/aris/docs/tutorials/diffusion_post_training_tutorial.html +1135 -0
- package/aris/docs/tutorials/diffusion_post_training_tutorial.md +1322 -0
- package/aris/docs/tutorials/diffusion_post_training_tutorial.review.json +63 -0
- package/aris/docs/tutorials/diffusion_post_training_tutorial_en.html +1138 -0
- package/aris/docs/tutorials/diffusion_post_training_tutorial_en.md +1325 -0
- package/aris/docs/tutorials/distributed_training_tutorial.html +1429 -0
- package/aris/docs/tutorials/distributed_training_tutorial.md +1587 -0
- package/aris/docs/tutorials/distributed_training_tutorial.review.json +98 -0
- package/aris/docs/tutorials/distributed_training_tutorial_en.html +1429 -0
- package/aris/docs/tutorials/distributed_training_tutorial_en.md +1587 -0
- package/aris/docs/tutorials/flow_matching_tutorial.html +755 -0
- package/aris/docs/tutorials/flow_matching_tutorial.md +537 -0
- package/aris/docs/tutorials/flow_matching_tutorial.review.json +37 -0
- package/aris/docs/tutorials/flow_matching_tutorial_en.html +755 -0
- package/aris/docs/tutorials/flow_matching_tutorial_en.md +537 -0
- package/aris/docs/tutorials/image_generation_systems_tutorial.html +1181 -0
- package/aris/docs/tutorials/image_generation_systems_tutorial.md +1448 -0
- package/aris/docs/tutorials/image_generation_systems_tutorial.review.json +49 -0
- package/aris/docs/tutorials/image_generation_systems_tutorial_en.html +1181 -0
- package/aris/docs/tutorials/image_generation_systems_tutorial_en.md +1448 -0
- package/aris/docs/tutorials/kl_divergence_rlhf_tutorial.html +1210 -0
- package/aris/docs/tutorials/kl_divergence_rlhf_tutorial.md +1502 -0
- package/aris/docs/tutorials/kl_divergence_rlhf_tutorial.review.json +55 -0
- package/aris/docs/tutorials/kl_divergence_rlhf_tutorial_en.html +1212 -0
- package/aris/docs/tutorials/kl_divergence_rlhf_tutorial_en.md +1504 -0
- package/aris/docs/tutorials/kv_cache_speculative_decoding_tutorial.html +1118 -0
- package/aris/docs/tutorials/kv_cache_speculative_decoding_tutorial.md +1258 -0
- package/aris/docs/tutorials/kv_cache_speculative_decoding_tutorial.review.json +91 -0
- package/aris/docs/tutorials/kv_cache_speculative_decoding_tutorial_en.html +1118 -0
- package/aris/docs/tutorials/kv_cache_speculative_decoding_tutorial_en.md +1258 -0
- package/aris/docs/tutorials/llm_opd_tutorial.html +1109 -0
- package/aris/docs/tutorials/llm_opd_tutorial.md +1195 -0
- package/aris/docs/tutorials/llm_opd_tutorial.review.json +125 -0
- package/aris/docs/tutorials/llm_opd_tutorial_en.html +1112 -0
- package/aris/docs/tutorials/llm_opd_tutorial_en.md +1198 -0
- package/aris/docs/tutorials/long_context_rope_yarn_mla_tutorial.html +1130 -0
- package/aris/docs/tutorials/long_context_rope_yarn_mla_tutorial.md +1209 -0
- package/aris/docs/tutorials/long_context_rope_yarn_mla_tutorial.review.json +79 -0
- package/aris/docs/tutorials/long_context_rope_yarn_mla_tutorial_en.html +1132 -0
- package/aris/docs/tutorials/long_context_rope_yarn_mla_tutorial_en.md +1211 -0
- package/aris/docs/tutorials/moe_tutorial.html +968 -0
- package/aris/docs/tutorials/moe_tutorial.md +1031 -0
- package/aris/docs/tutorials/moe_tutorial.review.json +54 -0
- package/aris/docs/tutorials/moe_tutorial_en.html +968 -0
- package/aris/docs/tutorials/moe_tutorial_en.md +1031 -0
- package/aris/docs/tutorials/multi_agent_long_horizon_tutorial.html +1409 -0
- package/aris/docs/tutorials/multi_agent_long_horizon_tutorial.md +1803 -0
- package/aris/docs/tutorials/multi_agent_long_horizon_tutorial.review.json +62 -0
- package/aris/docs/tutorials/multi_agent_long_horizon_tutorial_en.html +1413 -0
- package/aris/docs/tutorials/multi_agent_long_horizon_tutorial_en.md +1807 -0
- package/aris/docs/tutorials/quantization_tutorial.html +1117 -0
- package/aris/docs/tutorials/quantization_tutorial.md +1344 -0
- package/aris/docs/tutorials/quantization_tutorial.review.json +56 -0
- package/aris/docs/tutorials/quantization_tutorial_en.html +1117 -0
- package/aris/docs/tutorials/quantization_tutorial_en.md +1344 -0
- package/aris/docs/tutorials/reasoning_models_tutorial.html +1085 -0
- package/aris/docs/tutorials/reasoning_models_tutorial.md +1285 -0
- package/aris/docs/tutorials/reasoning_models_tutorial.review.json +66 -0
- package/aris/docs/tutorials/reasoning_models_tutorial_en.html +1085 -0
- package/aris/docs/tutorials/reasoning_models_tutorial_en.md +1285 -0
- package/aris/docs/tutorials/rlhf_dpo_grpo_ppo_tutorial.html +1015 -0
- package/aris/docs/tutorials/rlhf_dpo_grpo_ppo_tutorial.md +1125 -0
- package/aris/docs/tutorials/rlhf_dpo_grpo_ppo_tutorial.review.json +69 -0
- package/aris/docs/tutorials/rlhf_dpo_grpo_ppo_tutorial_en.html +1014 -0
- package/aris/docs/tutorials/rlhf_dpo_grpo_ppo_tutorial_en.md +1123 -0
- package/aris/docs/tutorials/self_evolving_agents_tutorial.html +1354 -0
- package/aris/docs/tutorials/self_evolving_agents_tutorial.md +1554 -0
- package/aris/docs/tutorials/self_evolving_agents_tutorial.review.json +64 -0
- package/aris/docs/tutorials/self_evolving_agents_tutorial_en.html +1356 -0
- package/aris/docs/tutorials/self_evolving_agents_tutorial_en.md +1556 -0
- package/aris/docs/tutorials/vae_vqvae_vqgan_tutorial.html +1197 -0
- package/aris/docs/tutorials/vae_vqvae_vqgan_tutorial.md +1419 -0
- package/aris/docs/tutorials/vae_vqvae_vqgan_tutorial.review.json +67 -0
- package/aris/docs/tutorials/vae_vqvae_vqgan_tutorial_en.html +1196 -0
- package/aris/docs/tutorials/vae_vqvae_vqgan_tutorial_en.md +1419 -0
- package/aris/docs/tutorials/video_generation_tutorial.html +1169 -0
- package/aris/docs/tutorials/video_generation_tutorial.md +1189 -0
- package/aris/docs/tutorials/video_generation_tutorial.review.json +72 -0
- package/aris/docs/tutorials/video_generation_tutorial_en.html +1170 -0
- package/aris/docs/tutorials/video_generation_tutorial_en.md +1190 -0
- package/aris/docs/tutorials/vlm_multimodal_tutorial.html +1208 -0
- package/aris/docs/tutorials/vlm_multimodal_tutorial.md +1446 -0
- package/aris/docs/tutorials/vlm_multimodal_tutorial.review.json +67 -0
- package/aris/docs/tutorials/vlm_multimodal_tutorial_en.html +1208 -0
- package/aris/docs/tutorials/vlm_multimodal_tutorial_en.md +1446 -0
- package/aris/docs/wechat_group.jpg +0 -0
- package/aris/mcp-servers/claude-review/README.md +96 -0
- package/aris/mcp-servers/claude-review/run_with_claude_aws.sh +49 -0
- package/aris/mcp-servers/claude-review/server.py +718 -0
- package/aris/mcp-servers/codex-exec/README.md +57 -0
- package/aris/mcp-servers/codex-exec/server.py +480 -0
- package/aris/mcp-servers/codex-image2/README.md +65 -0
- package/aris/mcp-servers/codex-image2/server.py +893 -0
- package/aris/mcp-servers/feishu-bridge/requirements.txt +1 -0
- package/aris/mcp-servers/feishu-bridge/server.py +240 -0
- package/aris/mcp-servers/gemini-review/README.md +171 -0
- package/aris/mcp-servers/gemini-review/server.py +1856 -0
- package/aris/mcp-servers/llm-chat/requirements.txt +1 -0
- package/aris/mcp-servers/llm-chat/server.py +664 -0
- package/aris/mcp-servers/manual-review/README.md +133 -0
- package/aris/mcp-servers/manual-review/server.py +910 -0
- package/aris/mcp-servers/manual-review/ui.html +279 -0
- package/aris/mcp-servers/minimax-chat/requirements.txt +1 -0
- package/aris/mcp-servers/minimax-chat/server.py +381 -0
- package/aris/skills/ablation-planner/SKILL.md +123 -0
- package/aris/skills/alphaxiv/SKILL.md +196 -0
- package/aris/skills/analyze-results/SKILL.md +46 -0
- package/aris/skills/arxiv/SKILL.md +248 -0
- package/aris/skills/auto-paper-improvement-loop/SKILL.md +695 -0
- package/aris/skills/auto-review-loop/SKILL.md +1137 -0
- package/aris/skills/auto-review-loop-llm/SKILL.md +259 -0
- package/aris/skills/auto-review-loop-minimax/SKILL.md +302 -0
- package/{skills/citation-audit-claude → aris/skills/citation-audit}/SKILL.md +11 -21
- package/aris/skills/claims-drafting/SKILL.md +227 -0
- package/aris/skills/comm-lit-review/SKILL.md +297 -0
- package/aris/skills/deepxiv/SKILL.md +263 -0
- package/aris/skills/dse-loop/SKILL.md +296 -0
- package/aris/skills/embodiment-description/SKILL.md +129 -0
- package/aris/skills/exa-search/SKILL.md +205 -0
- package/{skills/experiment-audit-claude → aris/skills/experiment-audit}/SKILL.md +16 -26
- package/aris/skills/experiment-bridge/SKILL.md +376 -0
- package/aris/skills/experiment-plan/SKILL.md +249 -0
- package/aris/skills/experiment-queue/SKILL.md +431 -0
- package/aris/skills/experiment-queue/scripts/build_manifest.py +142 -0
- package/aris/skills/experiment-queue/scripts/queue_manager.py +433 -0
- package/aris/skills/feishu-notify/SKILL.md +156 -0
- package/aris/skills/figure-description/SKILL.md +138 -0
- package/aris/skills/figure-spec/SKILL.md +262 -0
- package/aris/skills/figure-spec/scripts/figure_renderer.py +799 -0
- package/aris/skills/formula-derivation/SKILL.md +280 -0
- package/aris/skills/gemini-search/SKILL.md +231 -0
- package/aris/skills/grant-proposal/SKILL.md +698 -0
- package/aris/skills/idea-creator/SKILL.md +584 -0
- package/aris/skills/idea-discovery/SKILL.md +527 -0
- package/aris/skills/idea-discovery-robot/SKILL.md +363 -0
- package/aris/skills/integrity-forensics/SKILL.md +284 -0
- package/aris/skills/interview-cheatsheet/SKILL.md +245 -0
- package/aris/skills/invention-structuring/SKILL.md +188 -0
- package/aris/skills/jurisdiction-format/SKILL.md +192 -0
- package/aris/skills/kill-argument/SKILL.md +437 -0
- package/aris/skills/mermaid-diagram/SKILL.md +419 -0
- package/{skills/meta-apply-claude → aris/skills/meta-apply}/SKILL.md +5 -15
- package/aris/skills/meta-optimize/SKILL.md +437 -0
- package/aris/skills/monitor-experiment/SKILL.md +140 -0
- package/aris/skills/novelty-check/SKILL.md +142 -0
- package/aris/skills/openalex/SKILL.md +237 -0
- package/aris/skills/overleaf-sync/SKILL.md +220 -0
- package/{skills/paper-claim-audit-claude → aris/skills/paper-claim-audit}/SKILL.md +13 -23
- package/aris/skills/paper-compile/SKILL.md +266 -0
- package/aris/skills/paper-figure/SKILL.md +312 -0
- package/aris/skills/paper-illustration/SKILL.md +736 -0
- package/aris/skills/paper-illustration-image2/SKILL.md +391 -0
- package/aris/skills/paper-illustration-image2/scripts/paper_illustration_image2.py +255 -0
- package/aris/skills/paper-plan/SKILL.md +386 -0
- package/aris/skills/paper-poster/SKILL.md +19 -0
- package/aris/skills/paper-poster-html/DESIGN_FINAL.md +176 -0
- package/aris/skills/paper-poster-html/IMPLEMENTATION_CONVENTIONS.md +161 -0
- package/aris/skills/paper-poster-html/LICENSES/posterly-MIT.txt +21 -0
- package/aris/skills/paper-poster-html/NOTICE.md +57 -0
- package/aris/skills/paper-poster-html/SKILL.md +323 -0
- package/aris/skills/paper-poster-html/scripts/_posterly/__init__.py +0 -0
- package/aris/skills/paper-poster-html/scripts/_posterly/canvas.py +200 -0
- package/aris/skills/paper-poster-html/scripts/_posterly/measure.py +588 -0
- package/aris/skills/paper-poster-html/scripts/_posterly/polish.py +498 -0
- package/aris/skills/paper-poster-html/scripts/_posterly/preflight.py +489 -0
- package/aris/skills/paper-poster-html/scripts/_posterly/render.py +215 -0
- package/aris/skills/paper-poster-html/scripts/_posterly/textutil.py +16 -0
- package/aris/skills/paper-poster-html/scripts/_posterly/verify_final.py +171 -0
- package/aris/skills/paper-poster-html/scripts/asset_check.py +897 -0
- package/aris/skills/paper-poster-html/scripts/extract_pdf_figures.py +666 -0
- package/aris/skills/paper-poster-html/scripts/poster_check.py +251 -0
- package/aris/skills/paper-poster-html/scripts/preprocess_figures.py +238 -0
- package/aris/skills/paper-poster-html/scripts/render_preview.py +217 -0
- package/aris/skills/paper-poster-html/scripts/run_gates.py +556 -0
- package/aris/skills/paper-poster-html/scripts/style_check.py +1324 -0
- package/aris/skills/paper-poster-html/templates/COMPONENTS.md +462 -0
- package/aris/skills/paper-poster-html/templates/README.md +170 -0
- package/aris/skills/paper-poster-html/templates/landscape_4col.html +1032 -0
- package/aris/skills/paper-poster-html/templates/landscape_hero.html +1046 -0
- package/aris/skills/paper-poster-html/templates/portrait_2col.html +947 -0
- package/aris/skills/paper-poster-html/templates/tokens/acl.json +9 -0
- package/aris/skills/paper-poster-html/templates/tokens/cvpr.json +9 -0
- package/aris/skills/paper-poster-html/templates/tokens/generic.json +9 -0
- package/aris/skills/paper-poster-html/templates/tokens/iclr.json +9 -0
- package/aris/skills/paper-poster-html/templates/tokens/icml.json +9 -0
- package/aris/skills/paper-poster-html/templates/tokens/neurips.json +9 -0
- package/aris/skills/paper-slides/SKILL.md +635 -0
- package/aris/skills/paper-talk/SKILL.md +381 -0
- package/aris/skills/paper-write/SKILL.md +682 -0
- package/aris/skills/paper-write/templates/IEEEtran.bst +2409 -0
- package/aris/skills/paper-write/templates/IEEEtran.cls +6347 -0
- package/aris/skills/paper-write/templates/iclr2026.tex +84 -0
- package/aris/skills/paper-write/templates/icml2025.tex +87 -0
- package/aris/skills/paper-write/templates/ieee_conference.tex +89 -0
- package/aris/skills/paper-write/templates/ieee_journal.tex +93 -0
- package/aris/skills/paper-write/templates/math_commands.tex +48 -0
- package/aris/skills/paper-write/templates/neurips2025.tex +80 -0
- package/aris/skills/paper-writing/SKILL.md +929 -0
- package/aris/skills/patent-novelty-check/SKILL.md +153 -0
- package/aris/skills/patent-pipeline/SKILL.md +344 -0
- package/aris/skills/patent-review/SKILL.md +203 -0
- package/aris/skills/pixel-art/SKILL.md +137 -0
- package/aris/skills/prior-art-search/SKILL.md +146 -0
- package/aris/skills/proof-checker/SKILL.md +866 -0
- package/aris/skills/proof-orchestrator/NOTICE.md +24 -0
- package/aris/skills/proof-orchestrator/SKILL.md +254 -0
- package/aris/skills/proof-orchestrator/references/audit-output-contract.md +126 -0
- package/aris/skills/proof-orchestrator/references/deepseek-routing.md +74 -0
- package/aris/skills/proof-orchestrator/references/dispatch-prompts.md +227 -0
- package/aris/skills/proof-orchestrator/references/notation-audit.md +135 -0
- package/aris/skills/proof-orchestrator/references/proof-audit-rubric.md +70 -0
- package/aris/skills/proof-orchestrator/references/stress-tests.md +38 -0
- package/aris/skills/proof-writer/SKILL.md +223 -0
- package/aris/skills/qzcli/SKILL.md +324 -0
- package/aris/skills/rebuttal/SKILL.md +376 -0
- package/aris/skills/render-html/SKILL.md +316 -0
- package/aris/skills/render-html/scripts/render_html.py +1006 -0
- package/aris/skills/render-html/scripts/templates/academic.html +703 -0
- package/aris/skills/render-html/scripts/templates/dashboard.html +333 -0
- package/aris/skills/research-implement-feature/SKILL.md +583 -0
- package/aris/skills/research-lit/SKILL.md +756 -0
- package/aris/skills/research-pipeline/SKILL.md +390 -0
- package/aris/skills/research-refine/SKILL.md +770 -0
- package/aris/skills/research-refine-pipeline/SKILL.md +186 -0
- package/aris/skills/research-review/SKILL.md +223 -0
- package/aris/skills/research-wiki/SKILL.md +461 -0
- package/aris/skills/resubmit-pipeline/SKILL.md +447 -0
- package/{skills/result-to-claim-claude → aris/skills/result-to-claim}/SKILL.md +7 -17
- package/aris/skills/run-experiment/SKILL.md +313 -0
- package/aris/skills/semantic-scholar/SKILL.md +236 -0
- package/aris/skills/serverless-modal/SKILL.md +335 -0
- package/aris/skills/shared-references/acceptance-gate.md +324 -0
- package/aris/skills/shared-references/assurance-contract.md +248 -0
- package/aris/skills/shared-references/capture-antipatterns.md +78 -0
- package/aris/skills/shared-references/citation-discipline.md +583 -0
- package/aris/skills/shared-references/compute-env-contract.md +163 -0
- package/aris/skills/shared-references/effort-contract.md +183 -0
- package/aris/skills/shared-references/evidence-precheck.md +65 -0
- package/aris/skills/shared-references/experiment-integrity.md +49 -0
- package/aris/skills/shared-references/external-cadence.md +326 -0
- package/aris/skills/shared-references/fan-out-pattern.md +366 -0
- package/aris/skills/shared-references/injection-hygiene.md +127 -0
- package/aris/skills/shared-references/integration-contract.md +461 -0
- package/aris/skills/shared-references/output-composition.md +93 -0
- package/aris/skills/shared-references/output-language.md +45 -0
- package/aris/skills/shared-references/output-manifest.md +49 -0
- package/aris/skills/shared-references/output-versioning.md +111 -0
- package/aris/skills/shared-references/patent-format-cn.md +199 -0
- package/aris/skills/shared-references/patent-format-ep.md +173 -0
- package/aris/skills/shared-references/patent-format-us.md +161 -0
- package/aris/skills/shared-references/patent-writing-principles.md +197 -0
- package/aris/skills/shared-references/prior-art-databases.md +141 -0
- package/aris/skills/shared-references/resumable-runs.md +109 -0
- package/aris/skills/shared-references/review-scope-limits.md +81 -0
- package/aris/skills/shared-references/review-tracing.md +391 -0
- package/aris/skills/shared-references/reviewer-independence.md +79 -0
- package/aris/skills/shared-references/reviewer-routing.md +852 -0
- package/aris/skills/shared-references/skill-governance.md +104 -0
- package/aris/skills/shared-references/taste-calibration.md +85 -0
- package/aris/skills/shared-references/venue-checklists.md +114 -0
- package/aris/skills/shared-references/wiki-helper-resolution.md +134 -0
- package/aris/skills/shared-references/writing-principles.md +525 -0
- package/aris/skills/skills-codex/README.md +102 -0
- package/aris/skills/skills-codex/README_CN.md +100 -0
- package/aris/skills/skills-codex/ablation-planner/SKILL.md +126 -0
- package/aris/skills/skills-codex/alphaxiv/SKILL.md +186 -0
- package/aris/skills/skills-codex/analyze-results/SKILL.md +45 -0
- package/aris/skills/skills-codex/arxiv/SKILL.md +210 -0
- package/aris/skills/skills-codex/auto-paper-improvement-loop/SKILL.md +618 -0
- package/aris/skills/skills-codex/auto-review-loop/SKILL.md +500 -0
- package/aris/skills/skills-codex/auto-review-loop-llm/SKILL.md +247 -0
- package/aris/skills/skills-codex/auto-review-loop-minimax/SKILL.md +290 -0
- package/aris/skills/skills-codex/citation-audit/SKILL.md +504 -0
- package/aris/skills/skills-codex/claims-drafting/SKILL.md +239 -0
- package/aris/skills/skills-codex/comm-lit-review/SKILL.md +299 -0
- package/aris/skills/skills-codex/comm-lit-review/references/domain-taxonomy.md +57 -0
- package/aris/skills/skills-codex/comm-lit-review/references/output-template.md +37 -0
- package/aris/skills/skills-codex/comm-lit-review/references/source-policy.md +99 -0
- package/aris/skills/skills-codex/comm-lit-review/references/venue-tiering.md +112 -0
- package/aris/skills/skills-codex/deepxiv/SKILL.md +142 -0
- package/aris/skills/skills-codex/dse-loop/SKILL.md +285 -0
- package/aris/skills/skills-codex/embodiment-description/SKILL.md +129 -0
- package/aris/skills/skills-codex/exa-search/SKILL.md +192 -0
- package/aris/skills/skills-codex/experiment-audit/SKILL.md +286 -0
- package/aris/skills/skills-codex/experiment-bridge/SKILL.md +356 -0
- package/aris/skills/skills-codex/experiment-plan/SKILL.md +249 -0
- package/aris/skills/skills-codex/experiment-queue/SKILL.md +401 -0
- package/aris/skills/skills-codex/feishu-notify/SKILL.md +155 -0
- package/aris/skills/skills-codex/figure-description/SKILL.md +138 -0
- package/aris/skills/skills-codex/figure-spec/SKILL.md +252 -0
- package/aris/skills/skills-codex/formula-derivation/SKILL.md +280 -0
- package/aris/skills/skills-codex/gemini-search/SKILL.md +205 -0
- package/aris/skills/skills-codex/grant-proposal/SKILL.md +626 -0
- package/aris/skills/skills-codex/idea-creator/SKILL.md +438 -0
- package/aris/skills/skills-codex/idea-discovery/SKILL.md +477 -0
- package/aris/skills/skills-codex/idea-discovery-robot/SKILL.md +362 -0
- package/aris/skills/skills-codex/integrity-forensics/SKILL.md +108 -0
- package/aris/skills/skills-codex/interview-cheatsheet/SKILL.md +245 -0
- package/aris/skills/skills-codex/invention-structuring/SKILL.md +188 -0
- package/aris/skills/skills-codex/jurisdiction-format/SKILL.md +192 -0
- package/aris/skills/skills-codex/kill-argument/SKILL.md +403 -0
- package/aris/skills/skills-codex/mermaid-diagram/SKILL.md +379 -0
- package/aris/skills/skills-codex/meta-apply/SKILL.md +154 -0
- package/aris/skills/skills-codex/meta-optimize/SKILL.md +348 -0
- package/aris/skills/skills-codex/monitor-experiment/SKILL.md +98 -0
- package/aris/skills/skills-codex/novelty-check/SKILL.md +130 -0
- package/aris/skills/skills-codex/openalex/SKILL.md +228 -0
- package/aris/skills/skills-codex/overleaf-sync/SKILL.md +220 -0
- package/aris/skills/skills-codex/paper-claim-audit/SKILL.md +350 -0
- package/aris/skills/skills-codex/paper-compile/SKILL.md +253 -0
- package/aris/skills/skills-codex/paper-figure/SKILL.md +311 -0
- package/aris/skills/skills-codex/paper-illustration/SKILL.md +690 -0
- package/aris/skills/skills-codex/paper-illustration-image2/SKILL.md +383 -0
- package/aris/skills/skills-codex/paper-illustration-image2/scripts/paper_illustration_image2.py +255 -0
- package/aris/skills/skills-codex/paper-plan/SKILL.md +278 -0
- package/aris/skills/skills-codex/paper-poster/SKILL.md +19 -0
- package/aris/skills/skills-codex/paper-poster-html/SKILL.md +377 -0
- package/aris/skills/skills-codex/paper-slides/SKILL.md +571 -0
- package/aris/skills/skills-codex/paper-talk/SKILL.md +381 -0
- package/aris/skills/skills-codex/paper-write/SKILL.md +487 -0
- package/aris/skills/skills-codex/paper-write/templates/IEEEtran.bst +2409 -0
- package/aris/skills/skills-codex/paper-write/templates/IEEEtran.cls +6347 -0
- package/aris/skills/skills-codex/paper-write/templates/aaai2026.bst +1493 -0
- package/aris/skills/skills-codex/paper-write/templates/aaai2026.sty +315 -0
- package/aris/skills/skills-codex/paper-write/templates/aaai2026.tex +952 -0
- package/aris/skills/skills-codex/paper-write/templates/acl.sty +312 -0
- package/aris/skills/skills-codex/paper-write/templates/acl2026.tex +377 -0
- package/aris/skills/skills-codex/paper-write/templates/acl_natbib.bst +1940 -0
- package/aris/skills/skills-codex/paper-write/templates/acm.bst +3081 -0
- package/aris/skills/skills-codex/paper-write/templates/acm_mm2026.tex +204 -0
- package/aris/skills/skills-codex/paper-write/templates/acmart.cls +3520 -0
- package/aris/skills/skills-codex/paper-write/templates/cvpr.bst +1448 -0
- package/aris/skills/skills-codex/paper-write/templates/cvpr.sty +508 -0
- package/aris/skills/skills-codex/paper-write/templates/cvpr2026.tex +63 -0
- package/aris/skills/skills-codex/paper-write/templates/iclr2026.tex +84 -0
- package/aris/skills/skills-codex/paper-write/templates/iclr2026_conference.bst +1440 -0
- package/aris/skills/skills-codex/paper-write/templates/iclr2026_conference.sty +246 -0
- package/aris/skills/skills-codex/paper-write/templates/icml2026.sty +767 -0
- package/aris/skills/skills-codex/paper-write/templates/icml2026.tex +662 -0
- package/aris/skills/skills-codex/paper-write/templates/ieee_conference.tex +89 -0
- package/aris/skills/skills-codex/paper-write/templates/ieee_journal.tex +93 -0
- package/aris/skills/skills-codex/paper-write/templates/math_commands.tex +48 -0
- package/aris/skills/skills-codex/paper-write/templates/neurips2026.tex +493 -0
- package/aris/skills/skills-codex/paper-write/templates/neurips_2026.sty +437 -0
- package/aris/skills/skills-codex/paper-writing/SKILL.md +744 -0
- package/aris/skills/skills-codex/patent-novelty-check/SKILL.md +153 -0
- package/aris/skills/skills-codex/patent-pipeline/SKILL.md +344 -0
- package/aris/skills/skills-codex/patent-review/SKILL.md +202 -0
- package/aris/skills/skills-codex/pixel-art/SKILL.md +139 -0
- package/aris/skills/skills-codex/prior-art-search/SKILL.md +146 -0
- package/aris/skills/skills-codex/proof-checker/SKILL.md +554 -0
- package/aris/skills/skills-codex/proof-orchestrator/SKILL.md +260 -0
- package/aris/skills/skills-codex/proof-orchestrator/references/audit-output-contract.md +126 -0
- package/aris/skills/skills-codex/proof-orchestrator/references/deepseek-routing.md +76 -0
- package/aris/skills/skills-codex/proof-orchestrator/references/dispatch-prompts.md +227 -0
- package/aris/skills/skills-codex/proof-orchestrator/references/notation-audit.md +135 -0
- package/aris/skills/skills-codex/proof-orchestrator/references/proof-audit-rubric.md +70 -0
- package/aris/skills/skills-codex/proof-orchestrator/references/stress-tests.md +38 -0
- package/aris/skills/skills-codex/proof-writer/SKILL.md +222 -0
- package/aris/skills/skills-codex/qzcli/SKILL.md +324 -0
- package/aris/skills/skills-codex/rebuttal/SKILL.md +305 -0
- package/aris/skills/skills-codex/render-html/SKILL.md +305 -0
- package/aris/skills/skills-codex/render-html/scripts/render_html.py +909 -0
- package/aris/skills/skills-codex/render-html/scripts/templates/academic.html +342 -0
- package/aris/skills/skills-codex/render-html/scripts/templates/dashboard.html +333 -0
- package/aris/skills/skills-codex/research-implement-feature/SKILL.md +406 -0
- package/aris/skills/skills-codex/research-lit/SKILL.md +464 -0
- package/aris/skills/skills-codex/research-pipeline/SKILL.md +346 -0
- package/aris/skills/skills-codex/research-refine/SKILL.md +721 -0
- package/aris/skills/skills-codex/research-refine-pipeline/SKILL.md +186 -0
- package/aris/skills/skills-codex/research-review/SKILL.md +160 -0
- package/aris/skills/skills-codex/research-wiki/SKILL.md +421 -0
- package/aris/skills/skills-codex/resubmit-pipeline/SKILL.md +444 -0
- package/aris/skills/skills-codex/result-to-claim/SKILL.md +246 -0
- package/aris/skills/skills-codex/run-experiment/SKILL.md +236 -0
- package/aris/skills/skills-codex/semantic-scholar/SKILL.md +219 -0
- package/aris/skills/skills-codex/serverless-modal/SKILL.md +335 -0
- package/aris/skills/skills-codex/shared-references/acceptance-gate.md +336 -0
- package/aris/skills/skills-codex/shared-references/assurance-contract.md +139 -0
- package/aris/skills/skills-codex/shared-references/capture-antipatterns.md +84 -0
- package/aris/skills/skills-codex/shared-references/citation-discipline.md +452 -0
- package/aris/skills/skills-codex/shared-references/compute-env-contract.md +163 -0
- package/aris/skills/skills-codex/shared-references/effort-contract.md +143 -0
- package/aris/skills/skills-codex/shared-references/evidence-precheck.md +73 -0
- package/aris/skills/skills-codex/shared-references/experiment-integrity.md +49 -0
- package/aris/skills/skills-codex/shared-references/external-cadence.md +334 -0
- package/aris/skills/skills-codex/shared-references/fan-out-pattern.md +375 -0
- package/aris/skills/skills-codex/shared-references/injection-hygiene.md +132 -0
- package/aris/skills/skills-codex/shared-references/integration-contract.md +372 -0
- package/aris/skills/skills-codex/shared-references/output-composition.md +98 -0
- package/aris/skills/skills-codex/shared-references/output-language.md +45 -0
- package/aris/skills/skills-codex/shared-references/output-manifest.md +40 -0
- package/aris/skills/skills-codex/shared-references/output-versioning.md +111 -0
- package/aris/skills/skills-codex/shared-references/patent-format-cn.md +199 -0
- package/aris/skills/skills-codex/shared-references/patent-format-ep.md +173 -0
- package/aris/skills/skills-codex/shared-references/patent-format-us.md +161 -0
- package/aris/skills/skills-codex/shared-references/patent-writing-principles.md +197 -0
- package/aris/skills/skills-codex/shared-references/prior-art-databases.md +141 -0
- package/aris/skills/skills-codex/shared-references/resumable-runs.md +125 -0
- package/aris/skills/skills-codex/shared-references/review-scope-limits.md +81 -0
- package/aris/skills/skills-codex/shared-references/review-tracing.md +144 -0
- package/aris/skills/skills-codex/shared-references/reviewer-independence.md +66 -0
- package/aris/skills/skills-codex/shared-references/reviewer-routing.md +128 -0
- package/aris/skills/skills-codex/shared-references/skill-governance.md +119 -0
- package/aris/skills/skills-codex/shared-references/taste-calibration.md +90 -0
- package/aris/skills/skills-codex/shared-references/venue-checklists.md +73 -0
- package/aris/skills/skills-codex/shared-references/wiki-helper-resolution.md +69 -0
- package/aris/skills/skills-codex/shared-references/writing-principles.md +525 -0
- package/aris/skills/skills-codex/slides-polish/SKILL.md +563 -0
- package/aris/skills/skills-codex/specification-writing/SKILL.md +211 -0
- package/aris/skills/skills-codex/system-profile/SKILL.md +103 -0
- package/aris/skills/skills-codex/training-check/SKILL.md +83 -0
- package/aris/skills/skills-codex/vast-gpu/SKILL.md +394 -0
- package/aris/skills/skills-codex/web-debug-search/SKILL.md +334 -0
- package/aris/skills/skills-codex/wiki-enrich/SKILL.md +255 -0
- package/aris/skills/skills-codex/writing-systems-papers/SKILL.md +184 -0
- package/aris/skills/skills-codex-claude-review/README.md +79 -0
- package/aris/skills/skills-codex-claude-review/README_CN.md +78 -0
- package/aris/skills/skills-codex-claude-review/auto-paper-improvement-loop/SKILL.md +625 -0
- package/aris/skills/skills-codex-claude-review/auto-review-loop/SKILL.md +516 -0
- package/{skills/novelty-check-claude → aris/skills/skills-codex-claude-review/novelty-check}/SKILL.md +2 -10
- package/aris/skills/skills-codex-claude-review/paper-figure/SKILL.md +319 -0
- package/aris/skills/skills-codex-claude-review/paper-plan/SKILL.md +287 -0
- package/aris/skills/skills-codex-claude-review/paper-write/SKILL.md +496 -0
- package/aris/skills/skills-codex-claude-review/research-refine/SKILL.md +732 -0
- package/aris/skills/skills-codex-claude-review/research-review/SKILL.md +177 -0
- package/aris/skills/skills-codex-gemini-review/README.md +176 -0
- package/aris/skills/skills-codex-gemini-review/README_CN.md +175 -0
- package/aris/skills/skills-codex-gemini-review/auto-paper-improvement-loop/SKILL.md +376 -0
- package/aris/skills/skills-codex-gemini-review/auto-review-loop/SKILL.md +304 -0
- package/aris/skills/skills-codex-gemini-review/grant-proposal/SKILL.md +630 -0
- package/aris/skills/skills-codex-gemini-review/idea-creator/SKILL.md +287 -0
- package/aris/skills/skills-codex-gemini-review/idea-discovery/SKILL.md +275 -0
- package/aris/skills/skills-codex-gemini-review/idea-discovery-robot/SKILL.md +365 -0
- package/aris/skills/skills-codex-gemini-review/novelty-check/SKILL.md +133 -0
- package/aris/skills/skills-codex-gemini-review/paper-figure/SKILL.md +289 -0
- package/aris/skills/skills-codex-gemini-review/paper-plan/SKILL.md +265 -0
- package/aris/skills/skills-codex-gemini-review/paper-poster-html/SKILL.md +102 -0
- package/aris/skills/skills-codex-gemini-review/paper-slides/SKILL.md +582 -0
- package/aris/skills/skills-codex-gemini-review/paper-write/SKILL.md +422 -0
- package/aris/skills/skills-codex-gemini-review/paper-writing/SKILL.md +325 -0
- package/aris/skills/skills-codex-gemini-review/research-refine/SKILL.md +674 -0
- package/aris/skills/skills-codex-gemini-review/research-review/SKILL.md +137 -0
- package/aris/skills/slides-polish/SKILL.md +565 -0
- package/aris/skills/specification-writing/SKILL.md +211 -0
- package/aris/skills/system-profile/SKILL.md +103 -0
- package/aris/skills/training-check/SKILL.md +132 -0
- package/aris/skills/vast-gpu/SKILL.md +394 -0
- package/aris/skills/web-debug-search/SKILL.md +334 -0
- package/aris/skills/wiki-enrich/SKILL.md +257 -0
- package/aris/skills/writing-systems-papers/SKILL.md +184 -0
- package/aris/templates/CLAUDE_MD_TEMPLATE.md +29 -0
- package/aris/templates/EXPERIMENT_LOG_TEMPLATE.md +47 -0
- package/aris/templates/EXPERIMENT_PLAN_TEMPLATE.md +51 -0
- package/aris/templates/EXPERIMENT_PLAN_TEMPLATE_CN.md +53 -0
- package/aris/templates/FINDINGS_TEMPLATE.md +52 -0
- package/aris/templates/IDEA_CANDIDATES_TEMPLATE.md +47 -0
- package/aris/templates/IDEA_CANDIDATES_TEMPLATE_CN.md +47 -0
- package/aris/templates/INVENTION_BRIEF_TEMPLATE.md +87 -0
- package/aris/templates/MANIFEST_TEMPLATE.md +7 -0
- package/aris/templates/NARRATIVE_REPORT_TEMPLATE.md +49 -0
- package/aris/templates/PAPER_PLAN_TEMPLATE.md +47 -0
- package/aris/templates/PATENT_CLAIMS_TEMPLATE.md +78 -0
- package/aris/templates/PATENT_SPECIFICATION_TEMPLATE.md +68 -0
- package/aris/templates/README.md +57 -0
- package/aris/templates/RESEARCH_BRIEF_TEMPLATE.md +35 -0
- package/aris/templates/RESEARCH_BRIEF_TEMPLATE_CN.md +41 -0
- package/aris/templates/RESEARCH_CONTRACT_TEMPLATE.md +60 -0
- package/aris/templates/claude-hooks/corpus_write_guard.json +16 -0
- package/aris/templates/claude-hooks/corpus_write_guard.py +85 -0
- package/aris/templates/claude-hooks/meta_logging.json +74 -0
- package/aris/templates/gitignore-trace.txt +3 -0
- package/aris/tests/__init__.py +0 -0
- package/aris/tests/_feishu_bridge_helpers.py +82 -0
- package/aris/tests/_llm_chat_helpers.py +179 -0
- package/aris/tests/_minimax_helpers.py +189 -0
- package/aris/tests/test_argument_hint_lint.py +183 -0
- package/aris/tests/test_arxiv_fetch.py +266 -0
- package/aris/tests/test_auto_proceed_contract.py +106 -0
- package/aris/tests/test_capture_filter.py +86 -0
- package/aris/tests/test_claude_review_artifact_tools.py +171 -0
- package/aris/tests/test_claude_review_generator.py +51 -0
- package/aris/tests/test_claude_review_overlay.py +64 -0
- package/aris/tests/test_claude_review_parse.py +290 -0
- package/aris/tests/test_codex_exec_bridge.py +306 -0
- package/aris/tests/test_codex_image2_server.py +424 -0
- package/aris/tests/test_codex_install_update.py +511 -0
- package/aris/tests/test_codex_skill_mirror.py +547 -0
- package/aris/tests/test_copilot_install.py +1202 -0
- package/aris/tests/test_copilot_native_evidence.py +562 -0
- package/aris/tests/test_corpus_write_guard.py +76 -0
- package/aris/tests/test_deepxiv_fetch.py +180 -0
- package/aris/tests/test_evidence_check.py +189 -0
- package/aris/tests/test_exa_search.py +220 -0
- package/aris/tests/test_feishu_bridge_server.py +289 -0
- package/aris/tests/test_forensics_gate.py +565 -0
- package/aris/tests/test_http_reviewer_fallback_contract.py +43 -0
- package/aris/tests/test_http_reviewer_provenance_alignment.py +25 -0
- package/aris/tests/test_http_reviewer_review_gate.py +112 -0
- package/aris/tests/test_idea_creator_query_pack_scan.py +238 -0
- package/aris/tests/test_idea_discovery_gate.py +400 -0
- package/aris/tests/test_install_aris_agent_profiles.py +98 -0
- package/aris/tests/test_install_aris_ps1.py +359 -0
- package/aris/tests/test_install_aris_replace_link.py +119 -0
- package/aris/tests/test_install_aris_selective.py +235 -0
- package/aris/tests/test_install_aris_tools_symlink.py +196 -0
- package/aris/tests/test_iteration_log.py +85 -0
- package/aris/tests/test_llm_chat_converter.py +61 -0
- package/aris/tests/test_llm_chat_review_fallback.py +516 -0
- package/aris/tests/test_llm_chat_server.py +414 -0
- package/aris/tests/test_mainline_large_payload_prompts.py +72 -0
- package/aris/tests/test_manual_review.py +804 -0
- package/aris/tests/test_manual_review_integration.py +305 -0
- package/aris/tests/test_minimax_chat_server.py +464 -0
- package/aris/tests/test_minimax_integration.py +241 -0
- package/aris/tests/test_openalex_fetch.py +197 -0
- package/aris/tests/test_plugin_manifest.py +40 -0
- package/aris/tests/test_proof_suite_integration.py +66 -0
- package/aris/tests/test_provenance.py +284 -0
- package/aris/tests/test_research_wiki_claims.py +93 -0
- package/aris/tests/test_research_wiki_encoding.py +74 -0
- package/aris/tests/test_research_wiki_experiments.py +88 -0
- package/aris/tests/test_research_wiki_fetch_arxiv_metadata.py +242 -0
- package/aris/tests/test_research_wiki_helper_resolution.py +253 -0
- package/aris/tests/test_research_wiki_ideas.py +113 -0
- package/aris/tests/test_review_gate.py +358 -0
- package/aris/tests/test_reviewer_pins.py +90 -0
- package/aris/tests/test_run_state.py +313 -0
- package/aris/tests/test_skill_groups.py +111 -0
- package/aris/tests/test_skill_picker.py +207 -0
- package/aris/tests/test_threat_scan.py +139 -0
- package/aris/tests/test_trigger_eval.py +171 -0
- package/aris/tests/test_verify_paper_audits.py +198 -0
- package/aris/tests/test_watchdog.py +496 -0
- package/aris/tests/test_watchdog_loop.py +148 -0
- package/aris/tests/test_web_debug_search.py +157 -0
- package/aris/tools/arxiv_fetch.py +311 -0
- package/aris/tools/capture_filter.py +126 -0
- package/aris/tools/check_skills_inventory.py +287 -0
- package/aris/tools/convert_skills_to_llm_chat.py +282 -0
- package/aris/tools/copilot_native_evidence.py +818 -0
- package/aris/tools/deepxiv_fetch.py +213 -0
- package/aris/tools/evidence_check.py +212 -0
- package/aris/tools/exa_search.py +425 -0
- package/aris/tools/experiment_queue/README.md +118 -0
- package/aris/tools/experiment_queue/build_manifest.py +44 -0
- package/aris/tools/experiment_queue/queue_manager.py +44 -0
- package/aris/tools/extract_paper_style.py +560 -0
- package/aris/tools/figure_renderer.py +69 -0
- package/aris/tools/forensics_gate.py +669 -0
- package/aris/tools/generate_codex_claude_review_overrides.py +355 -0
- package/aris/tools/idea_discovery_gate.py +256 -0
- package/aris/tools/install_aris.ps1 +1372 -0
- package/aris/tools/install_aris.sh +1416 -0
- package/aris/tools/install_aris_codex.sh +1023 -0
- package/aris/tools/install_aris_copilot.sh +1052 -0
- package/aris/tools/iteration_log.py +143 -0
- package/aris/tools/lint_skills_helpers.sh +84 -0
- package/aris/tools/meta_opt/check_ready.sh +80 -0
- package/aris/tools/meta_opt/log_event.sh +91 -0
- package/aris/tools/meta_opt/trigger_eval.py +280 -0
- package/aris/tools/meta_opt/trigger_evals.sample.json +28 -0
- package/aris/tools/openalex_fetch.py +326 -0
- package/aris/tools/overleaf_audit.sh +104 -0
- package/aris/tools/overleaf_setup.sh +150 -0
- package/aris/tools/paper_illustration_image2.py +62 -0
- package/aris/tools/provenance.py +294 -0
- package/aris/tools/research_wiki.py +1720 -0
- package/aris/tools/review_gate.py +502 -0
- package/aris/tools/run_state.py +399 -0
- package/aris/tools/save_trace.sh +477 -0
- package/aris/tools/semantic_scholar_fetch.py +438 -0
- package/aris/tools/skill-groups.tsv +117 -0
- package/aris/tools/skill_picker.py +238 -0
- package/aris/tools/smart_update.ps1 +521 -0
- package/aris/tools/smart_update.sh +591 -0
- package/aris/tools/smart_update_codex.sh +419 -0
- package/aris/tools/smart_update_copilot.sh +605 -0
- package/aris/tools/threat_scan.py +222 -0
- package/aris/tools/verify_paper_audits.sh +487 -0
- package/aris/tools/verify_papers.py +613 -0
- package/aris/tools/verify_wiki_coverage.sh +176 -0
- package/aris/tools/watchdog.py +485 -0
- package/aris/xhs_post.md +125 -0
- package/dsh/client.js +43 -14
- package/dsh/http-rpc.mjs +8 -7
- package/mcp-servers/codex-exec/README.md +4 -4
- package/mcp-servers/codex-exec/server.py +1 -1
- package/package.json +4 -5
- package/skills/ablation-planner/SKILL.md +1 -1
- package/skills/auto-paper-improvement-loop/SKILL.md +10 -10
- package/skills/auto-paper-improvement-loop-claude/SKILL.md +25 -612
- package/skills/auto-review-loop/SKILL.md +4 -4
- package/skills/auto-review-loop-claude/SKILL.md +25 -503
- package/skills/citation-audit/SKILL.md +3 -3
- package/skills/claims-drafting/SKILL.md +2 -2
- package/skills/experiment-audit/SKILL.md +4 -4
- package/skills/experiment-bridge/SKILL.md +14 -12
- package/skills/figure-spec/SKILL.md +1 -1
- package/skills/grant-proposal/SKILL.md +7 -7
- package/skills/human-in-loop-refine/SKILL.md +119 -0
- package/skills/human-in-loop-refine/scripts/refine_round.py +449 -0
- package/skills/human-in-loop-refine/scripts/test_refine_round.py +200 -0
- package/skills/human-in-loop-refine/templates/INPUTS.md +20 -0
- package/skills/human-in-loop-refine/templates/PAPER_NOTE.md +29 -0
- package/skills/human-in-loop-refine/templates/REVISION.md +27 -0
- package/skills/idea-creator/SKILL.md +2 -2
- package/skills/idea-discovery/SKILL.md +15 -13
- package/skills/idea-discovery-robot/SKILL.md +11 -9
- package/skills/integrity-forensics/SKILL.md +1 -1
- package/skills/interview-cheatsheet/SKILL.md +3 -3
- package/skills/invention-structuring/SKILL.md +2 -2
- package/skills/kill-argument/SKILL.md +8 -8
- package/skills/kill-argument-claude/SKILL.md +30 -431
- package/skills/meta-apply/SKILL.md +1 -1
- package/skills/meta-optimize/SKILL.md +2 -2
- package/skills/novelty-check/SKILL.md +2 -2
- package/skills/paper-claim-audit/SKILL.md +5 -5
- package/skills/paper-figure/SKILL.md +4 -3
- package/skills/paper-figure-claude/SKILL.md +24 -305
- package/skills/paper-plan/SKILL.md +3 -3
- package/skills/paper-plan-claude/SKILL.md +24 -273
- package/skills/paper-poster-html/SKILL.md +11 -9
- package/skills/paper-slides/SKILL.md +5 -5
- package/skills/paper-talk/SKILL.md +10 -8
- package/skills/paper-write/SKILL.md +3 -3
- package/skills/paper-write-claude/SKILL.md +24 -482
- package/skills/paper-writing/SKILL.md +19 -17
- package/skills/patent-novelty-check/SKILL.md +3 -3
- package/skills/patent-pipeline/SKILL.md +2 -2
- package/skills/patent-review/SKILL.md +3 -3
- package/skills/proof-checker/SKILL.md +12 -12
- package/skills/proof-checker-claude/SKILL.md +30 -860
- package/skills/rebuttal/SKILL.md +12 -10
- package/skills/render-html/SKILL.md +1 -1
- package/skills/research-implement-feature/SKILL.md +1 -1
- package/skills/research-pipeline/SKILL.md +15 -13
- package/skills/research-refine/SKILL.md +6 -6
- package/skills/research-refine-claude/SKILL.md +24 -719
- package/skills/research-refine-pipeline/SKILL.md +10 -8
- package/skills/research-review/SKILL.md +7 -7
- package/skills/research-review-claude/SKILL.md +25 -164
- package/skills/resubmit-pipeline/SKILL.md +14 -12
- package/skills/result-to-claim/SKILL.md +2 -2
- package/skills/shared-references/assurance-contract.md +1 -1
- package/skills/shared-references/effort-contract.md +1 -1
- package/skills/shared-references/fan-out-pattern.md +4 -4
- package/skills/shared-references/resumable-runs.md +2 -2
- package/skills/shared-references/review-scope-limits.md +1 -1
- package/skills/shared-references/review-tracing.md +2 -2
- package/skills/shared-references/reviewer-routing.md +16 -14
- package/skills/shared-references/skill-governance.md +3 -3
- package/skills/skills-codex/ablation-planner/SKILL.md +1 -1
- package/skills/skills-codex/auto-paper-improvement-loop/SKILL.md +8 -8
- package/skills/skills-codex/auto-review-loop/SKILL.md +2 -2
- package/skills/skills-codex/citation-audit/SKILL.md +4 -4
- package/skills/skills-codex/claims-drafting/SKILL.md +2 -2
- package/skills/skills-codex/experiment-audit/SKILL.md +9 -9
- package/skills/skills-codex/experiment-bridge/SKILL.md +1 -1
- package/skills/skills-codex/figure-spec/SKILL.md +1 -1
- package/skills/skills-codex/grant-proposal/SKILL.md +7 -7
- package/skills/skills-codex/idea-creator/SKILL.md +4 -4
- package/skills/skills-codex/idea-discovery/SKILL.md +6 -6
- package/skills/skills-codex/idea-discovery-robot/SKILL.md +1 -1
- package/skills/skills-codex/integrity-forensics/SKILL.md +4 -2
- package/skills/skills-codex/interview-cheatsheet/SKILL.md +3 -3
- package/skills/skills-codex/invention-structuring/SKILL.md +2 -2
- package/skills/skills-codex/kill-argument/SKILL.md +7 -7
- package/skills/skills-codex/meta-apply/SKILL.md +1 -1
- package/skills/skills-codex/meta-optimize/SKILL.md +2 -2
- package/skills/skills-codex/novelty-check/SKILL.md +1 -1
- package/skills/skills-codex/paper-claim-audit/SKILL.md +6 -6
- package/skills/skills-codex/paper-figure/SKILL.md +3 -3
- package/skills/skills-codex/paper-plan/SKILL.md +3 -3
- package/skills/skills-codex/paper-poster-html/SKILL.md +3 -3
- package/skills/skills-codex/paper-slides/SKILL.md +4 -4
- package/skills/skills-codex/paper-write/SKILL.md +3 -3
- package/skills/skills-codex/paper-writing/SKILL.md +7 -7
- package/skills/skills-codex/patent-novelty-check/SKILL.md +3 -3
- package/skills/skills-codex/patent-pipeline/SKILL.md +2 -2
- package/skills/skills-codex/patent-review/SKILL.md +3 -3
- package/skills/skills-codex/proof-checker/SKILL.md +11 -11
- package/skills/skills-codex/rebuttal/SKILL.md +2 -2
- package/skills/skills-codex/render-html/SKILL.md +1 -1
- package/skills/skills-codex/research-implement-feature/SKILL.md +1 -1
- package/skills/skills-codex/research-pipeline/SKILL.md +5 -5
- package/skills/skills-codex/research-refine/SKILL.md +6 -6
- package/skills/skills-codex/research-review/SKILL.md +6 -6
- package/skills/skills-codex/resubmit-pipeline/SKILL.md +4 -4
- package/skills/skills-codex/result-to-claim/SKILL.md +2 -2
- package/skills/skills-codex/shared-references/assurance-contract.md +2 -2
- package/skills/skills-codex/shared-references/resumable-runs.md +3 -3
- package/skills/skills-codex/shared-references/review-scope-limits.md +1 -1
- package/skills/skills-codex/shared-references/review-tracing.md +3 -3
- package/skills/skills-codex/shared-references/reviewer-independence.md +2 -2
- package/skills/skills-codex/shared-references/reviewer-routing.md +10 -10
- package/skills/skills-codex/slides-polish/SKILL.md +3 -3
- package/skills/skills-codex/specification-writing/SKILL.md +2 -2
- package/skills/slides-polish/SKILL.md +3 -3
- package/skills/specification-writing/SKILL.md +2 -2
- package/skills/training-check/SKILL.md +2 -2
- package/skills/verify-manager/SKILL.md +88 -0
- package/skills/verify-manager/phases/1-specify.md +17 -0
- package/skills/verify-manager/phases/2-plan.md +14 -0
- package/skills/verify-manager/phases/3-tasks.md +19 -0
- package/skills/verify-manager/phases/4-run.md +12 -0
- package/skills/verify-manager/phases/5-analyze.md +21 -0
- package/skills/verify-manager/phases/6-next.md +19 -0
- package/skills/verify-manager/scripts/test_verify_space.py +202 -0
- package/skills/verify-manager/scripts/verify_space.py +451 -0
- package/skills/verify-manager/templates/HYPOTHESIS.md +37 -0
- package/skills/verify-manager/templates/NEXT_IDEAS.md +20 -0
- package/skills/verify-manager/templates/PILOT_PLAN.md +56 -0
- package/skills/verify-manager/templates/PILOT_TASKS.md +28 -0
- package/skills/verify-manager/templates/PROMOTION.md +17 -0
- package/skills/verify-manager/templates/RESULT.md +36 -0
- package/test/client-render-smoke.mjs +143 -0
- package/test/test_claude_overlays.py +99 -0
- package/test/transport-smoke.mjs +16 -4
- package/tools/__pycache__/build_claude_overlays.cpython-314.pyc +0 -0
- package/tools/__pycache__/verify_lane.cpython-314.pyc +0 -0
- package/tools/build_claude_overlays.py +187 -0
- package/tools/check_skills_inventory.py +17 -3
- package/tools/convert_skills_to_llm_chat.py +15 -15
- package/tools/generate_codex_claude_review_overrides.py +12 -12
- package/tools/run_state.py +1 -1
- package/tools/save_trace.sh +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
httpx>=0.27,<1.0
|
|
@@ -0,0 +1,664 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Generic LLM Chat MCP Server - Supports any OpenAI-compatible API
|
|
3
|
+
|
|
4
|
+
Environment Variables:
|
|
5
|
+
LLM_API_KEY - API key (required)
|
|
6
|
+
LLM_BASE_URL - API base URL (default: https://api.openai.com/v1)
|
|
7
|
+
LLM_MODEL - Model name (default: gpt-4o)
|
|
8
|
+
LLM_FALLBACK_MODEL - Fallback model on 504 timeout (default: gpt-4o)
|
|
9
|
+
LLM_SERVER_NAME - Server name for MCP (default: llm-chat)
|
|
10
|
+
LLM_REVIEW_FALLBACK_ENABLED
|
|
11
|
+
- Expose review/review_reply tools when true (default: false)
|
|
12
|
+
|
|
13
|
+
Supported Providers (examples):
|
|
14
|
+
OpenAI: LLM_BASE_URL=https://api.openai.com/v1 LLM_MODEL=gpt-4o
|
|
15
|
+
DeepSeek: LLM_BASE_URL=https://api.deepseek.com/v1 LLM_MODEL=deepseek-chat
|
|
16
|
+
Kimi: LLM_BASE_URL=https://api.moonshot.cn/v1 LLM_MODEL=moonshot-v1-32k
|
|
17
|
+
MiniMax: LLM_BASE_URL=https://api.minimax.io/v1 LLM_MODEL=MiniMax-M3
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import datetime
|
|
21
|
+
import json
|
|
22
|
+
import os
|
|
23
|
+
import re
|
|
24
|
+
import sys
|
|
25
|
+
import tempfile
|
|
26
|
+
import uuid
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
import httpx
|
|
29
|
+
|
|
30
|
+
_stdio_initialized = False
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _init_stdio():
|
|
34
|
+
"""Rebind stdio to raw unbuffered binary streams for MCP framing.
|
|
35
|
+
|
|
36
|
+
Deferred into a function (called at the top of main()) so that merely
|
|
37
|
+
IMPORTING this module has no stdio side effects. os.fdopen(fileno) defaults
|
|
38
|
+
to closefd=True and thus seizes ownership of the fd; doing that at import
|
|
39
|
+
time under a test harness that captures stdio (pytest fd-capture) closes the
|
|
40
|
+
harness's capture fd and corrupts capture for every subsequent test. Real
|
|
41
|
+
server launch (python server.py) still calls this first via main(), so
|
|
42
|
+
runtime behavior is unchanged. Idempotent."""
|
|
43
|
+
global _stdio_initialized
|
|
44
|
+
if _stdio_initialized:
|
|
45
|
+
return
|
|
46
|
+
# Force unbuffered stdout/stdin
|
|
47
|
+
sys.stdout = os.fdopen(sys.stdout.fileno(), 'wb', buffering=0)
|
|
48
|
+
sys.stdin = os.fdopen(sys.stdin.fileno(), 'rb', buffering=0)
|
|
49
|
+
_stdio_initialized = True
|
|
50
|
+
|
|
51
|
+
# Configuration from environment
|
|
52
|
+
API_KEY = os.environ.get("LLM_API_KEY", "")
|
|
53
|
+
BASE_URL = os.environ.get("LLM_BASE_URL", "https://api.openai.com/v1")
|
|
54
|
+
DEFAULT_MODEL = os.environ.get("LLM_MODEL", "gpt-4o")
|
|
55
|
+
FALLBACK_MODEL = os.environ.get("LLM_FALLBACK_MODEL", "gpt-4o")
|
|
56
|
+
SERVER_NAME = os.environ.get("LLM_SERVER_NAME", "llm-chat")
|
|
57
|
+
REVIEW_FALLBACK_ENABLED = os.environ.get(
|
|
58
|
+
"LLM_REVIEW_FALLBACK_ENABLED", "false"
|
|
59
|
+
).strip().lower() in {"1", "true", "yes", "on"}
|
|
60
|
+
|
|
61
|
+
# Debug logging
|
|
62
|
+
DEBUG_LOG = os.path.join(tempfile.gettempdir(), f"{SERVER_NAME}-mcp-debug.log")
|
|
63
|
+
|
|
64
|
+
def debug_log(msg):
|
|
65
|
+
try:
|
|
66
|
+
with open(DEBUG_LOG, "a") as f:
|
|
67
|
+
f.write(f"{datetime.datetime.now()}: {msg}\n")
|
|
68
|
+
f.flush()
|
|
69
|
+
except Exception:
|
|
70
|
+
pass
|
|
71
|
+
|
|
72
|
+
def log_error(msg):
|
|
73
|
+
try:
|
|
74
|
+
with open(DEBUG_LOG, "a") as f:
|
|
75
|
+
f.write(f"{datetime.datetime.now()}: ERROR: {msg}\n")
|
|
76
|
+
except Exception:
|
|
77
|
+
pass
|
|
78
|
+
|
|
79
|
+
debug_log(f"=== {SERVER_NAME} MCP Server Starting (v2.2) ===")
|
|
80
|
+
debug_log(f"BASE_URL: {BASE_URL}")
|
|
81
|
+
debug_log(f"MODEL: {DEFAULT_MODEL}")
|
|
82
|
+
debug_log(f"FALLBACK_MODEL: {FALLBACK_MODEL}")
|
|
83
|
+
debug_log(f"REVIEW_FALLBACK_ENABLED: {REVIEW_FALLBACK_ENABLED}")
|
|
84
|
+
debug_log(f"API_KEY set: {bool(API_KEY)}")
|
|
85
|
+
|
|
86
|
+
_use_ndjson = False
|
|
87
|
+
_review_threads = {}
|
|
88
|
+
|
|
89
|
+
def send_response(response):
|
|
90
|
+
global _use_ndjson
|
|
91
|
+
json_str = json.dumps(response, separators=(',', ':'))
|
|
92
|
+
json_bytes = json_str.encode('utf-8')
|
|
93
|
+
|
|
94
|
+
if _use_ndjson:
|
|
95
|
+
output = json_bytes + b'\n'
|
|
96
|
+
else:
|
|
97
|
+
header = f"Content-Length: {len(json_bytes)}\r\n\r\n".encode('utf-8')
|
|
98
|
+
output = header + json_bytes
|
|
99
|
+
|
|
100
|
+
sys.stdout.write(output)
|
|
101
|
+
sys.stdout.flush()
|
|
102
|
+
|
|
103
|
+
def _call_llm_detailed(messages, model=None):
|
|
104
|
+
"""Call LLM Chat Completions API and return content, error, actual model."""
|
|
105
|
+
if not API_KEY:
|
|
106
|
+
return None, "LLM_API_KEY environment variable not set", None
|
|
107
|
+
|
|
108
|
+
use_model = model or DEFAULT_MODEL
|
|
109
|
+
url = f"{BASE_URL.rstrip('/')}/chat/completions"
|
|
110
|
+
headers = {
|
|
111
|
+
"Content-Type": "application/json",
|
|
112
|
+
"Authorization": f"Bearer {API_KEY}"
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
# Try: original model → retry same model → fallback model.
|
|
116
|
+
# This retrying behavior is intentionally legacy-chat-only. Verdict-bearing
|
|
117
|
+
# review/review_reply calls use _call_llm_review_once below so ambiguous
|
|
118
|
+
# failures can never duplicate a paid review or produce conflicting verdicts.
|
|
119
|
+
for attempt in range(3):
|
|
120
|
+
current_model = use_model if attempt < 2 else FALLBACK_MODEL
|
|
121
|
+
payload = {
|
|
122
|
+
"model": current_model,
|
|
123
|
+
"messages": messages,
|
|
124
|
+
"max_tokens": 4096
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
debug_log(f"Calling LLM API (attempt {attempt + 1}): model={current_model}")
|
|
128
|
+
|
|
129
|
+
try:
|
|
130
|
+
with httpx.Client(timeout=300.0) as client:
|
|
131
|
+
response = client.post(url, headers=headers, json=payload)
|
|
132
|
+
|
|
133
|
+
if response.status_code == 504:
|
|
134
|
+
debug_log(f"504 Gateway Timeout on attempt {attempt + 1} with model {current_model}")
|
|
135
|
+
if attempt < 2:
|
|
136
|
+
continue # retry or fallback
|
|
137
|
+
|
|
138
|
+
if response.status_code != 200:
|
|
139
|
+
error_msg = f"API error {response.status_code}: {response.text[:500]}"
|
|
140
|
+
debug_log(f"API error: {error_msg}")
|
|
141
|
+
return None, error_msg, None
|
|
142
|
+
|
|
143
|
+
data = response.json()
|
|
144
|
+
try:
|
|
145
|
+
content = data["choices"][0]["message"]["content"]
|
|
146
|
+
except (KeyError, IndexError, TypeError) as e:
|
|
147
|
+
return None, f"Unexpected API response structure: {e}", None
|
|
148
|
+
|
|
149
|
+
# Prefer the model identity reported by the provider. If absent,
|
|
150
|
+
# use the exact model id sent in this successful request.
|
|
151
|
+
actual_model = str(data.get("model") or current_model).strip()
|
|
152
|
+
|
|
153
|
+
if current_model != use_model:
|
|
154
|
+
fallback_note = f"\n\n[Note: Used fallback model {current_model} after 504 timeout with {use_model}]"
|
|
155
|
+
content = fallback_note + "\n" + content
|
|
156
|
+
debug_log(f"API success with fallback model {actual_model}, response length: {len(content)}")
|
|
157
|
+
elif attempt > 0:
|
|
158
|
+
debug_log(f"API success on retry (attempt {attempt + 1}), response length: {len(content)}")
|
|
159
|
+
else:
|
|
160
|
+
debug_log(f"API success, response length: {len(content)}")
|
|
161
|
+
return content, None, actual_model
|
|
162
|
+
except Exception as e:
|
|
163
|
+
debug_log(f"API exception on attempt {attempt + 1}: {str(e)}")
|
|
164
|
+
if attempt == 2:
|
|
165
|
+
return None, str(e), None
|
|
166
|
+
|
|
167
|
+
return None, "All attempts failed with 504 Gateway Timeout", None
|
|
168
|
+
|
|
169
|
+
def call_llm(messages, model=None):
|
|
170
|
+
"""Backward-compatible two-value wrapper for the existing chat tool."""
|
|
171
|
+
content, error, _actual_model = _call_llm_detailed(messages, model)
|
|
172
|
+
return content, error
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def _call_llm_review_once(messages, model=None):
|
|
176
|
+
"""Single-attempt, fail-closed call for verdict-bearing reviewer tools.
|
|
177
|
+
|
|
178
|
+
Once the HTTP request is dispatched, a timeout, 504, malformed response, or
|
|
179
|
+
transport exception is ambiguous: the remote reviewer may already have run.
|
|
180
|
+
Never retry or switch to FALLBACK_MODEL here. Surface the error so the
|
|
181
|
+
orchestrator/gate records REVIEW_UNAVAILABLE instead of issuing a duplicate
|
|
182
|
+
paid review with a potentially conflicting verdict.
|
|
183
|
+
"""
|
|
184
|
+
if not API_KEY:
|
|
185
|
+
return None, "LLM_API_KEY environment variable not set", None
|
|
186
|
+
|
|
187
|
+
use_model = model or DEFAULT_MODEL
|
|
188
|
+
url = f"{BASE_URL.rstrip('/')}/chat/completions"
|
|
189
|
+
headers = {
|
|
190
|
+
"Content-Type": "application/json",
|
|
191
|
+
"Authorization": f"Bearer {API_KEY}"
|
|
192
|
+
}
|
|
193
|
+
payload = {
|
|
194
|
+
"model": use_model,
|
|
195
|
+
"messages": messages,
|
|
196
|
+
"max_tokens": 4096
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
debug_log(f"Calling verdict-bearing LLM review once: model={use_model}")
|
|
200
|
+
try:
|
|
201
|
+
with httpx.Client(timeout=300.0) as client:
|
|
202
|
+
response = client.post(url, headers=headers, json=payload)
|
|
203
|
+
if response.status_code != 200:
|
|
204
|
+
error_msg = f"API error {response.status_code}: {response.text[:500]}"
|
|
205
|
+
debug_log(f"Review API error (no retry): {error_msg}")
|
|
206
|
+
return None, error_msg, None
|
|
207
|
+
|
|
208
|
+
try:
|
|
209
|
+
data = response.json()
|
|
210
|
+
except Exception as exc:
|
|
211
|
+
error_msg = f"Invalid API JSON response: {exc}"
|
|
212
|
+
debug_log(f"Review API parse error (no retry): {error_msg}")
|
|
213
|
+
return None, error_msg, None
|
|
214
|
+
|
|
215
|
+
try:
|
|
216
|
+
content = data["choices"][0]["message"]["content"]
|
|
217
|
+
except (KeyError, IndexError, TypeError) as exc:
|
|
218
|
+
error_msg = f"Unexpected API response structure: {exc}"
|
|
219
|
+
debug_log(f"Review API structure error (no retry): {error_msg}")
|
|
220
|
+
return None, error_msg, None
|
|
221
|
+
|
|
222
|
+
actual_model = str(data.get("model") or use_model).strip()
|
|
223
|
+
debug_log(
|
|
224
|
+
f"Verdict-bearing API success: model={actual_model}, "
|
|
225
|
+
f"response length={len(content)}"
|
|
226
|
+
)
|
|
227
|
+
return content, None, actual_model
|
|
228
|
+
except Exception as exc:
|
|
229
|
+
debug_log(f"Review API exception (no retry): {str(exc)}")
|
|
230
|
+
return None, str(exc), None
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
# Coarse model families used only by the opt-in verdict-bearing review tools.
|
|
234
|
+
_FAMILY = [
|
|
235
|
+
("anthropic", ("claude", "opus", "sonnet", "haiku", "anthropic")),
|
|
236
|
+
("openai", ("gpt", "codex", "chatgpt", "o1", "o3", "o4", "openai")),
|
|
237
|
+
("google", ("gemini", "google", "palm", "bard")),
|
|
238
|
+
("deepseek", ("deepseek",)),
|
|
239
|
+
("zhipu", ("glm", "zhipu")),
|
|
240
|
+
("minimax", ("minimax", "abab")),
|
|
241
|
+
("moonshot", ("kimi", "moonshot")),
|
|
242
|
+
("qwen", ("qwen", "tongyi")),
|
|
243
|
+
("xiaomi", ("mimo", "xiaomi")),
|
|
244
|
+
("bytedance", ("doubao", "bytedance", "volcengine")),
|
|
245
|
+
("xai", ("grok",)),
|
|
246
|
+
("meta", ("llama",)),
|
|
247
|
+
("mistral", ("mistral", "mixtral")),
|
|
248
|
+
]
|
|
249
|
+
_SHORT = {"o1", "o3", "o4"}
|
|
250
|
+
|
|
251
|
+
def model_family(name):
|
|
252
|
+
"""Map a model id to a coarse family; collisions fail closed.
|
|
253
|
+
|
|
254
|
+
Match family needles at token boundaries, mirroring review_gate.py, so a
|
|
255
|
+
provider prefix such as ``ollama/deepseek-r1`` does not accidentally match
|
|
256
|
+
the ``llama`` model family inside ``ollama``.
|
|
257
|
+
"""
|
|
258
|
+
n = str(name or "").strip().lower()
|
|
259
|
+
matched = set()
|
|
260
|
+
for family, needles in _FAMILY:
|
|
261
|
+
for needle in needles:
|
|
262
|
+
suffix = "" if needle in _SHORT else r"[0-9.]*"
|
|
263
|
+
pattern = rf"(^|[^a-z0-9]){re.escape(needle)}{suffix}([^a-z0-9]|$)"
|
|
264
|
+
if re.search(pattern, n):
|
|
265
|
+
matched.add(family)
|
|
266
|
+
break
|
|
267
|
+
return next(iter(matched)) if len(matched) == 1 else "unknown"
|
|
268
|
+
|
|
269
|
+
def _cross_family_error(executor_model, reviewer_model):
|
|
270
|
+
executor_family = model_family(executor_model)
|
|
271
|
+
reviewer_family = model_family(reviewer_model)
|
|
272
|
+
if executor_family == "unknown":
|
|
273
|
+
return (f"Cannot verify HTTP reviewer independence: executor_model is "
|
|
274
|
+
f"missing or unrecognized ({executor_model!r})")
|
|
275
|
+
if reviewer_family == "unknown":
|
|
276
|
+
return f"Cannot verify HTTP reviewer model family: {reviewer_model!r}"
|
|
277
|
+
if executor_family == reviewer_family:
|
|
278
|
+
return (f"HTTP reviewer must use a different model family: "
|
|
279
|
+
f"executor={executor_model} ({executor_family}), "
|
|
280
|
+
f"reviewer={reviewer_model} ({reviewer_family})")
|
|
281
|
+
return None
|
|
282
|
+
|
|
283
|
+
def _tool_success(request_id, payload):
|
|
284
|
+
return {
|
|
285
|
+
"jsonrpc": "2.0",
|
|
286
|
+
"id": request_id,
|
|
287
|
+
"result": {
|
|
288
|
+
"content": [{"type": "text", "text": json.dumps(payload, ensure_ascii=False)}]
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
def _tool_error(request_id, message):
|
|
293
|
+
return {
|
|
294
|
+
"jsonrpc": "2.0",
|
|
295
|
+
"id": request_id,
|
|
296
|
+
"result": {
|
|
297
|
+
"content": [{"type": "text", "text": json.dumps({"error": message}, ensure_ascii=False)}],
|
|
298
|
+
"isError": True
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
def _read_review_files(paths):
|
|
303
|
+
"""Read explicit primary artifacts that will be sent to the HTTP endpoint."""
|
|
304
|
+
if paths is None:
|
|
305
|
+
return ""
|
|
306
|
+
if not isinstance(paths, list):
|
|
307
|
+
raise ValueError("files must be an array of file paths")
|
|
308
|
+
|
|
309
|
+
sections = []
|
|
310
|
+
for raw_path in paths:
|
|
311
|
+
path = Path(str(raw_path)).expanduser()
|
|
312
|
+
if not path.is_file():
|
|
313
|
+
raise ValueError(f"review file not found or not a regular file: {path}")
|
|
314
|
+
try:
|
|
315
|
+
text = path.read_text(encoding="utf-8", errors="replace")
|
|
316
|
+
except OSError as exc:
|
|
317
|
+
raise ValueError(f"cannot read review file {path}: {exc}") from exc
|
|
318
|
+
sections.append(
|
|
319
|
+
f"\n\n--- ARIS PRIMARY ARTIFACT: {path} ---\n{text}"
|
|
320
|
+
f"\n--- END ARIS PRIMARY ARTIFACT: {path} ---"
|
|
321
|
+
)
|
|
322
|
+
return "".join(sections)
|
|
323
|
+
|
|
324
|
+
def _review_user_content(prompt, files):
|
|
325
|
+
return prompt + _read_review_files(files)
|
|
326
|
+
|
|
327
|
+
def _review_messages(history, prompt, system=""):
|
|
328
|
+
messages = []
|
|
329
|
+
if system:
|
|
330
|
+
messages.append({"role": "system", "content": system})
|
|
331
|
+
messages.extend(history)
|
|
332
|
+
messages.append({"role": "user", "content": prompt})
|
|
333
|
+
return messages
|
|
334
|
+
|
|
335
|
+
def _handle_review(arguments, request_id):
|
|
336
|
+
prompt = str(arguments.get("prompt", "")).strip()
|
|
337
|
+
executor_model = str(arguments.get("executor_model", "")).strip()
|
|
338
|
+
model = str(arguments.get("model", DEFAULT_MODEL)).strip() or DEFAULT_MODEL
|
|
339
|
+
system = str(arguments.get("system", "")).strip()
|
|
340
|
+
files = arguments.get("files", [])
|
|
341
|
+
|
|
342
|
+
if not prompt:
|
|
343
|
+
return _tool_error(request_id, "prompt is required")
|
|
344
|
+
if not executor_model:
|
|
345
|
+
return _tool_error(request_id, "executor_model is required for cross-family review")
|
|
346
|
+
|
|
347
|
+
try:
|
|
348
|
+
user_content = _review_user_content(prompt, files)
|
|
349
|
+
except ValueError as exc:
|
|
350
|
+
return _tool_error(request_id, str(exc))
|
|
351
|
+
|
|
352
|
+
content, error, actual_model = _call_llm_review_once(
|
|
353
|
+
_review_messages([], user_content, system), model
|
|
354
|
+
)
|
|
355
|
+
if error:
|
|
356
|
+
return _tool_error(request_id, error)
|
|
357
|
+
|
|
358
|
+
independence_error = _cross_family_error(executor_model, actual_model)
|
|
359
|
+
if independence_error:
|
|
360
|
+
return _tool_error(request_id, independence_error)
|
|
361
|
+
|
|
362
|
+
thread_id = uuid.uuid4().hex[:12]
|
|
363
|
+
_review_threads[thread_id] = {
|
|
364
|
+
"messages": [
|
|
365
|
+
{"role": "user", "content": user_content},
|
|
366
|
+
{"role": "assistant", "content": content},
|
|
367
|
+
],
|
|
368
|
+
"model": model,
|
|
369
|
+
"system": system,
|
|
370
|
+
"executor_model": executor_model,
|
|
371
|
+
}
|
|
372
|
+
return _tool_success(request_id, {
|
|
373
|
+
"threadId": thread_id,
|
|
374
|
+
"content": content,
|
|
375
|
+
"reviewer_model": actual_model,
|
|
376
|
+
"reviewer_family": model_family(actual_model),
|
|
377
|
+
"executor_model": executor_model,
|
|
378
|
+
"executor_family": model_family(executor_model),
|
|
379
|
+
"family_relation": "different",
|
|
380
|
+
"independence_verified": "unverified",
|
|
381
|
+
})
|
|
382
|
+
|
|
383
|
+
def _handle_review_reply(arguments, request_id):
|
|
384
|
+
thread_id = str(arguments.get("threadId", "")).strip()
|
|
385
|
+
prompt = str(arguments.get("prompt", "")).strip()
|
|
386
|
+
if not thread_id:
|
|
387
|
+
return _tool_error(request_id, "threadId is required")
|
|
388
|
+
if thread_id not in _review_threads:
|
|
389
|
+
return _tool_error(request_id, f"Unknown threadId: {thread_id}")
|
|
390
|
+
if not prompt:
|
|
391
|
+
return _tool_error(request_id, "prompt is required")
|
|
392
|
+
|
|
393
|
+
thread = _review_threads[thread_id]
|
|
394
|
+
executor_model = str(arguments.get("executor_model", thread["executor_model"])).strip()
|
|
395
|
+
if executor_model != thread["executor_model"]:
|
|
396
|
+
return _tool_error(request_id, "executor_model cannot change within a review thread")
|
|
397
|
+
model = str(arguments.get("model", thread["model"])).strip() or thread["model"]
|
|
398
|
+
if model != thread["model"]:
|
|
399
|
+
return _tool_error(request_id, "reviewer model cannot change within a review thread")
|
|
400
|
+
system = str(arguments.get("system", thread["system"])).strip()
|
|
401
|
+
files = arguments.get("files", [])
|
|
402
|
+
|
|
403
|
+
try:
|
|
404
|
+
user_content = _review_user_content(prompt, files)
|
|
405
|
+
except ValueError as exc:
|
|
406
|
+
return _tool_error(request_id, str(exc))
|
|
407
|
+
|
|
408
|
+
history = list(thread["messages"])
|
|
409
|
+
content, error, actual_model = _call_llm_review_once(
|
|
410
|
+
_review_messages(history, user_content, system), model
|
|
411
|
+
)
|
|
412
|
+
if error:
|
|
413
|
+
return _tool_error(request_id, error)
|
|
414
|
+
|
|
415
|
+
independence_error = _cross_family_error(executor_model, actual_model)
|
|
416
|
+
if independence_error:
|
|
417
|
+
return _tool_error(request_id, independence_error)
|
|
418
|
+
|
|
419
|
+
thread["messages"].extend([
|
|
420
|
+
{"role": "user", "content": user_content},
|
|
421
|
+
{"role": "assistant", "content": content},
|
|
422
|
+
])
|
|
423
|
+
return _tool_success(request_id, {
|
|
424
|
+
"threadId": thread_id,
|
|
425
|
+
"content": content,
|
|
426
|
+
"reviewer_model": actual_model,
|
|
427
|
+
"reviewer_family": model_family(actual_model),
|
|
428
|
+
"executor_model": executor_model,
|
|
429
|
+
"executor_family": model_family(executor_model),
|
|
430
|
+
"family_relation": "different",
|
|
431
|
+
"independence_verified": "unverified",
|
|
432
|
+
})
|
|
433
|
+
|
|
434
|
+
def _review_tool_definitions():
|
|
435
|
+
common = {
|
|
436
|
+
"prompt": {"type": "string", "description": "The substantive ARIS review prompt"},
|
|
437
|
+
"executor_model": {
|
|
438
|
+
"type": "string",
|
|
439
|
+
"description": "Actual executor model id; required to enforce cross-family review"
|
|
440
|
+
},
|
|
441
|
+
"model": {"type": "string", "description": f"Reviewer model (default: {DEFAULT_MODEL})"},
|
|
442
|
+
"system": {"type": "string", "description": "Optional reviewer system prompt"},
|
|
443
|
+
"files": {
|
|
444
|
+
"type": "array",
|
|
445
|
+
"items": {"type": "string"},
|
|
446
|
+
"description": "Local primary-artifact paths to send verbatim to the HTTP reviewer"
|
|
447
|
+
},
|
|
448
|
+
}
|
|
449
|
+
return [
|
|
450
|
+
{
|
|
451
|
+
"name": "review",
|
|
452
|
+
"description": "Start an independent HTTP reviewer thread.",
|
|
453
|
+
"inputSchema": {
|
|
454
|
+
"type": "object",
|
|
455
|
+
"properties": dict(common),
|
|
456
|
+
"required": ["prompt", "executor_model"]
|
|
457
|
+
}
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
"name": "review_reply",
|
|
461
|
+
"description": "Continue an HTTP reviewer thread with prior message history.",
|
|
462
|
+
"inputSchema": {
|
|
463
|
+
"type": "object",
|
|
464
|
+
"properties": dict(common, threadId={
|
|
465
|
+
"type": "string",
|
|
466
|
+
"description": "threadId returned by review"
|
|
467
|
+
}),
|
|
468
|
+
"required": ["threadId", "prompt"]
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
]
|
|
472
|
+
|
|
473
|
+
def handle_request(request):
|
|
474
|
+
"""Handle a JSON-RPC request"""
|
|
475
|
+
method = request.get("method", "")
|
|
476
|
+
params = request.get("params", {})
|
|
477
|
+
request_id = request.get("id")
|
|
478
|
+
|
|
479
|
+
debug_log(f"Handling method: {method}, id: {request_id}")
|
|
480
|
+
|
|
481
|
+
# Handle notifications (no id, no response needed)
|
|
482
|
+
if request_id is None:
|
|
483
|
+
if method == "notifications/initialized":
|
|
484
|
+
debug_log("Client initialized successfully")
|
|
485
|
+
return None
|
|
486
|
+
|
|
487
|
+
if method == "initialize":
|
|
488
|
+
return {
|
|
489
|
+
"jsonrpc": "2.0",
|
|
490
|
+
"id": request_id,
|
|
491
|
+
"result": {
|
|
492
|
+
"protocolVersion": "2024-11-05",
|
|
493
|
+
"capabilities": {
|
|
494
|
+
"tools": {}
|
|
495
|
+
},
|
|
496
|
+
"serverInfo": {
|
|
497
|
+
"name": SERVER_NAME,
|
|
498
|
+
"version": "2.2.0"
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
elif method == "ping":
|
|
504
|
+
return {"jsonrpc": "2.0", "id": request_id, "result": {}}
|
|
505
|
+
|
|
506
|
+
elif method == "tools/list":
|
|
507
|
+
tools = [{
|
|
508
|
+
"name": "chat",
|
|
509
|
+
"description": f"Send a message to {DEFAULT_MODEL} and get a response. Use this for research reviews, code analysis, and general AI tasks.",
|
|
510
|
+
"inputSchema": {
|
|
511
|
+
"type": "object",
|
|
512
|
+
"properties": {
|
|
513
|
+
"prompt": {
|
|
514
|
+
"type": "string",
|
|
515
|
+
"description": "The prompt to send"
|
|
516
|
+
},
|
|
517
|
+
"model": {
|
|
518
|
+
"type": "string",
|
|
519
|
+
"description": f"Model to use (default: {DEFAULT_MODEL})"
|
|
520
|
+
},
|
|
521
|
+
"system": {
|
|
522
|
+
"type": "string",
|
|
523
|
+
"description": "Optional system prompt"
|
|
524
|
+
}
|
|
525
|
+
},
|
|
526
|
+
"required": ["prompt"]
|
|
527
|
+
}
|
|
528
|
+
}]
|
|
529
|
+
if REVIEW_FALLBACK_ENABLED:
|
|
530
|
+
tools.extend(_review_tool_definitions())
|
|
531
|
+
return {
|
|
532
|
+
"jsonrpc": "2.0",
|
|
533
|
+
"id": request_id,
|
|
534
|
+
"result": {"tools": tools}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
elif method == "tools/call":
|
|
538
|
+
tool_name = params.get("name", "")
|
|
539
|
+
arguments = params.get("arguments", {})
|
|
540
|
+
|
|
541
|
+
if tool_name == "chat":
|
|
542
|
+
prompt = arguments.get("prompt", "")
|
|
543
|
+
model = arguments.get("model", DEFAULT_MODEL)
|
|
544
|
+
system = arguments.get("system", "")
|
|
545
|
+
|
|
546
|
+
messages = []
|
|
547
|
+
if system:
|
|
548
|
+
messages.append({"role": "system", "content": system})
|
|
549
|
+
messages.append({"role": "user", "content": prompt})
|
|
550
|
+
|
|
551
|
+
debug_log(f"Tool call: chat, prompt length: {len(prompt)}")
|
|
552
|
+
content, error = call_llm(messages, model)
|
|
553
|
+
|
|
554
|
+
if error:
|
|
555
|
+
return {
|
|
556
|
+
"jsonrpc": "2.0",
|
|
557
|
+
"id": request_id,
|
|
558
|
+
"result": {
|
|
559
|
+
"content": [{"type": "text", "text": f"Error: {error}"}],
|
|
560
|
+
"isError": True
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
return {
|
|
565
|
+
"jsonrpc": "2.0",
|
|
566
|
+
"id": request_id,
|
|
567
|
+
"result": {
|
|
568
|
+
"content": [{"type": "text", "text": content}]
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
if tool_name == "review":
|
|
573
|
+
if not REVIEW_FALLBACK_ENABLED:
|
|
574
|
+
return _tool_error(
|
|
575
|
+
request_id,
|
|
576
|
+
"HTTP reviewer fallback is disabled. Set "
|
|
577
|
+
"LLM_REVIEW_FALLBACK_ENABLED=true and restart the MCP server."
|
|
578
|
+
)
|
|
579
|
+
return _handle_review(arguments, request_id)
|
|
580
|
+
|
|
581
|
+
if tool_name == "review_reply":
|
|
582
|
+
if not REVIEW_FALLBACK_ENABLED:
|
|
583
|
+
return _tool_error(
|
|
584
|
+
request_id,
|
|
585
|
+
"HTTP reviewer fallback is disabled. Set "
|
|
586
|
+
"LLM_REVIEW_FALLBACK_ENABLED=true and restart the MCP server."
|
|
587
|
+
)
|
|
588
|
+
return _handle_review_reply(arguments, request_id)
|
|
589
|
+
|
|
590
|
+
return {
|
|
591
|
+
"jsonrpc": "2.0",
|
|
592
|
+
"id": request_id,
|
|
593
|
+
"error": {"code": -32601, "message": f"Unknown tool: {tool_name}"}
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
else:
|
|
597
|
+
return {
|
|
598
|
+
"jsonrpc": "2.0",
|
|
599
|
+
"id": request_id,
|
|
600
|
+
"error": {"code": -32601, "message": f"Unknown method: {method}"}
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
def read_message():
|
|
604
|
+
"""Read a single JSON-RPC message from stdin."""
|
|
605
|
+
global _use_ndjson
|
|
606
|
+
|
|
607
|
+
line = sys.stdin.readline()
|
|
608
|
+
if not line:
|
|
609
|
+
return None
|
|
610
|
+
|
|
611
|
+
line = line.decode('utf-8').rstrip('\r\n')
|
|
612
|
+
|
|
613
|
+
if line.lower().startswith("content-length:"):
|
|
614
|
+
try:
|
|
615
|
+
content_length = int(line.split(":", 1)[1].strip())
|
|
616
|
+
except ValueError:
|
|
617
|
+
return None
|
|
618
|
+
|
|
619
|
+
while True:
|
|
620
|
+
hdr = sys.stdin.readline()
|
|
621
|
+
if not hdr:
|
|
622
|
+
return None
|
|
623
|
+
hdr = hdr.decode('utf-8').rstrip('\r\n')
|
|
624
|
+
if hdr == "":
|
|
625
|
+
break
|
|
626
|
+
|
|
627
|
+
body = sys.stdin.read(content_length)
|
|
628
|
+
try:
|
|
629
|
+
return json.loads(body.decode('utf-8'))
|
|
630
|
+
except Exception:
|
|
631
|
+
return None
|
|
632
|
+
|
|
633
|
+
elif line.startswith("{") or line.startswith("["):
|
|
634
|
+
_use_ndjson = True
|
|
635
|
+
try:
|
|
636
|
+
return json.loads(line)
|
|
637
|
+
except Exception:
|
|
638
|
+
return None
|
|
639
|
+
|
|
640
|
+
return None
|
|
641
|
+
|
|
642
|
+
def main():
|
|
643
|
+
"""Main loop - read JSON-RPC messages from stdin"""
|
|
644
|
+
_init_stdio()
|
|
645
|
+
debug_log("Entering main loop")
|
|
646
|
+
|
|
647
|
+
while True:
|
|
648
|
+
try:
|
|
649
|
+
request = read_message()
|
|
650
|
+
if request is None:
|
|
651
|
+
debug_log("EOF, exiting")
|
|
652
|
+
break
|
|
653
|
+
|
|
654
|
+
response = handle_request(request)
|
|
655
|
+
if response:
|
|
656
|
+
send_response(response)
|
|
657
|
+
|
|
658
|
+
except Exception as e:
|
|
659
|
+
log_error(f"Exception: {e}")
|
|
660
|
+
|
|
661
|
+
debug_log("=== Server Exiting ===")
|
|
662
|
+
|
|
663
|
+
if __name__ == "__main__":
|
|
664
|
+
main()
|