sovara 0.3.1__tar.gz → 0.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. {sovara-0.3.1 → sovara-0.3.2}/PKG-INFO +1 -1
  2. {sovara-0.3.1 → sovara-0.3.2}/README.md +9 -0
  3. {sovara-0.3.1 → sovara-0.3.2}/pyproject.toml +2 -1
  4. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/SKILL.md +1 -1
  5. sovara-0.3.2/src/sovara/cli/so_claude.py +77 -0
  6. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/node_naming.py +63 -0
  7. sovara-0.3.2/src/sovara/runner/claude_code_runner.py +473 -0
  8. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parser.py +2 -2
  9. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/prompts.py +7 -1
  10. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/claude_proxy_utils.py +56 -12
  11. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/graph_analysis/trace_chat/prompts.py +4 -3
  12. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/lesson_validator.py +3 -4
  13. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/prior_content_polisher.py +2 -4
  14. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/prior_quality.py +8 -4
  15. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_pipeline.py +13 -2
  16. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/recording.py +4 -1
  17. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/routes/claude_proxy.py +258 -1
  18. {sovara-0.3.1 → sovara-0.3.2}/src/sovara.egg-info/PKG-INFO +1 -1
  19. {sovara-0.3.1 → sovara-0.3.2}/src/sovara.egg-info/SOURCES.txt +2 -0
  20. {sovara-0.3.1 → sovara-0.3.2}/src/sovara.egg-info/entry_points.txt +1 -0
  21. {sovara-0.3.1 → sovara-0.3.2}/LICENSE +0 -0
  22. {sovara-0.3.1 → sovara-0.3.2}/docs/release/PYPI_DESC.md +0 -0
  23. {sovara-0.3.1 → sovara-0.3.2}/setup.cfg +0 -0
  24. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/__init__.py +0 -0
  25. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/__init__.py +0 -0
  26. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/default_runs.sqlite +0 -0
  27. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/AnnotationRoute-CE3twxG9.js +0 -0
  28. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/AnnotationRoute-voBIuZUX.css +0 -0
  29. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/AttachmentPreview-CFrNMdfC.css +0 -0
  30. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/AttachmentPreview-plYzPaRE.js +0 -0
  31. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/DocumentPreviewModal-BFdSPROi.js +0 -0
  32. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  33. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  34. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  35. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  36. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  37. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  38. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  39. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  40. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  41. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  42. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  43. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  44. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  45. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  46. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  47. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  48. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  49. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  50. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  51. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  52. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  53. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  54. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  55. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  56. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  57. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  58. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  59. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  60. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  61. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  62. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  63. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  64. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  65. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  66. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  67. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  68. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  69. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  70. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  71. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  72. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  73. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  74. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  75. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  76. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  77. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  78. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  79. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  80. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  81. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  82. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  83. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  84. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  85. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  86. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  87. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  88. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  89. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  90. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  91. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/LayoutBreadcrumb-DQfjpJp6.js +0 -0
  92. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/LayoutBreadcrumb-Di8BFf6J.css +0 -0
  93. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/OrgRoute-C6PvXMBj.js +0 -0
  94. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/OrgRoute-Syy1k3se.css +0 -0
  95. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/PriorsRoute-BFKg8GE_.css +0 -0
  96. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/PriorsRoute-CvQs_UGM.js +0 -0
  97. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/ProjectRoute-C3Jzk4jL.css +0 -0
  98. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/ProjectRoute-CrWY3I2q.js +0 -0
  99. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/ProjectRunsRoute-BWJaCbdU.js +0 -0
  100. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/RunRoute-Bf1i1Jzu.js +0 -0
  101. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/RunTabsHeader-BFdSaCHq.js +0 -0
  102. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/RunTabsHeader-CCiRiliL.css +0 -0
  103. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/SettingsRoute-CaCQ4pWX.js +0 -0
  104. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/api-BHNyGAe0.js +0 -0
  105. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/arrow_lr-ByI2ndPB.png +0 -0
  106. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/arrow_spiral_tr_bl-XHIpf338.png +0 -0
  107. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/codicon-BYm2YbZ6.ttf +0 -0
  108. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/eye-BRRCRKsr.js +0 -0
  109. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/index-CaNmZMjl.css +0 -0
  110. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/index-FFvomyuN.js +0 -0
  111. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/pdf.worker.min-qwK7q_zL.mjs +0 -0
  112. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/plus-StJOlCLf.js +0 -0
  113. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/prismTheme-DRzlLkhr.js +0 -0
  114. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/projectRuns-B4uZ9L5w.js +0 -0
  115. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/projectRuns-D7mGuqzb.css +0 -0
  116. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/settings-Br0my5v3.js +0 -0
  117. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/settings-CZdC8p_Y.css +0 -0
  118. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/sovara_favicon_colour-BrB8E1K-.png +0 -0
  119. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/sovara_full_logo_dark_green-DUVlz28Y.svg +0 -0
  120. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/sovara_full_logo_light_green-CZc0oGc4.svg +0 -0
  121. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/tierState-DObTMUxC.js +0 -0
  122. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/tiny-invariant-BCXflckp.js +0 -0
  123. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/trash-2-BiGQZCMf.js +0 -0
  124. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/useRunViewLayout-D1NwHTvJ.css +0 -0
  125. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/useRunViewLayout-Db3uX16H.js +0 -0
  126. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/assets/value-BlJoDf9S.js +0 -0
  127. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/favicon-colour.png +0 -0
  128. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/favicon.png +0 -0
  129. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/index.html +0 -0
  130. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/assets/web_app/marketplace_icon.png +0 -0
  131. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/cli/__init__.py +0 -0
  132. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/cli/so_config.py +0 -0
  133. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/cli/so_record.py +0 -0
  134. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/cli/so_server.py +0 -0
  135. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/cli/so_tool.py +0 -0
  136. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/__init__.py +0 -0
  137. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/annotations.py +0 -0
  138. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/config.py +0 -0
  139. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/constants.py +0 -0
  140. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/custom_metrics.py +0 -0
  141. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/edit_io_exclude_patterns.json +0 -0
  142. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/endpoint_patterns.json +0 -0
  143. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/lifecycle.py +0 -0
  144. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/log_redaction.py +0 -0
  145. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/logger.py +0 -0
  146. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/priors_block.py +0 -0
  147. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/priors_block_guidance.json +0 -0
  148. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/project.py +0 -0
  149. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/run_logs.py +0 -0
  150. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/runtime.py +0 -0
  151. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/user.py +0 -0
  152. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/common/utils.py +0 -0
  153. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/__init__.py +0 -0
  154. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/agent_runner.py +0 -0
  155. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/context_manager.py +0 -0
  156. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/__init__.py +0 -0
  157. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parsers/__init__.py +0 -0
  158. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parsers/aiohttp_api_parser.py +0 -0
  159. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parsers/claude_code_messages_api_parser.py +0 -0
  160. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parsers/httpx_api_parser.py +0 -0
  161. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parsers/mcp_api_parser.py +0 -0
  162. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parsers/requests_api_parser.py +0 -0
  163. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parsers/sse_utils.py +0 -0
  164. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parsers/urllib3_api_parser.py +0 -0
  165. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/apply_monkey_patches.py +0 -0
  166. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/async_streaming.py +0 -0
  167. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/endpoint_whitelist.py +0 -0
  168. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/__init__.py +0 -0
  169. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/adk_patch.py +0 -0
  170. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/aiohttp_patch.py +0 -0
  171. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/claude_sdk_patch.py +0 -0
  172. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/httpx_patch.py +0 -0
  173. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/langchain_patch.py +0 -0
  174. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/mcp_patches.py +0 -0
  175. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/openai_agents_patch.py +0 -0
  176. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/requests_patch.py +0 -0
  177. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/urllib3_patch.py +0 -0
  178. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patching_utils.py +0 -0
  179. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/to_show_filters.py +0 -0
  180. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/monkey_patching/tool_trace_utils.py +0 -0
  181. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/priors.py +0 -0
  182. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/public.py +0 -0
  183. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/request_mutation.py +0 -0
  184. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/run_log_capture.py +0 -0
  185. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/runner/runtime_client.py +0 -0
  186. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/__init__.py +0 -0
  187. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/annotation_backend/__init__.py +0 -0
  188. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/annotation_backend/annotation.py +0 -0
  189. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/annotation_backend/annotation_agent/__init__.py +0 -0
  190. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/annotation_backend/annotation_agent/agent.py +0 -0
  191. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/annotation_backend/annotation_agent/models.py +0 -0
  192. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/annotation_backend/annotation_agent/prompts.py +0 -0
  193. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/annotation_backend/annotation_agent/tools.py +0 -0
  194. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/annotation_backend/annotation_agent/trace_store.py +0 -0
  195. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/annotation_backend/annotation_focus.py +0 -0
  196. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/annotation_backend/chunk_index.py +0 -0
  197. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/annotation_backend/classifier.py +0 -0
  198. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/annotation_backend/close_traces.py +0 -0
  199. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/annotation_backend/distance_index.py +0 -0
  200. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/annotation_backend/screening_summary.py +0 -0
  201. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/annotation_backend/utils.py +0 -0
  202. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/app.py +0 -0
  203. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/__init__.py +0 -0
  204. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/agent.py +0 -0
  205. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/cancel.py +0 -0
  206. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/compaction.py +0 -0
  207. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/content_blocks.py +0 -0
  208. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/content_utils.py +0 -0
  209. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/llm_settings.py +0 -0
  210. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/step_content_view.py +0 -0
  211. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/step_ids.py +0 -0
  212. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/tools/__init__.py +0 -0
  213. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/tools/annotation.py +0 -0
  214. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/tools/applied_priors.py +0 -0
  215. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/tools/ask_step.py +0 -0
  216. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/tools/content_unit.py +0 -0
  217. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/tools/graph.py +0 -0
  218. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/tools/ids.py +0 -0
  219. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/tools/priors.py +0 -0
  220. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/tools/registry.py +0 -0
  221. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/tools/run_logs.py +0 -0
  222. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/tools/step_overview.py +0 -0
  223. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/tools/step_snapshot.py +0 -0
  224. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/tools/trace.py +0 -0
  225. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/tools/trace_search.py +0 -0
  226. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/tools/trace_summary.py +0 -0
  227. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/base_agent/trace.py +0 -0
  228. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/__init__.py +0 -0
  229. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/_shared.py +0 -0
  230. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/annotations.py +0 -0
  231. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/backend_protocol.py +0 -0
  232. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/blob_storage.py +0 -0
  233. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/llm_calls.py +0 -0
  234. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/manager.py +0 -0
  235. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/mongodb/__init__.py +0 -0
  236. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/mongodb/backend.py +0 -0
  237. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/mongodb/connection.py +0 -0
  238. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/mongodb/prior_embeddings.py +0 -0
  239. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/postgresql/__init__.py +0 -0
  240. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/postgresql/backend.py +0 -0
  241. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/postgresql/connection.py +0 -0
  242. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/postgresql/schema.py +0 -0
  243. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/prior_models.py +0 -0
  244. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/prior_record.py +0 -0
  245. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/priors.py +0 -0
  246. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/projects.py +0 -0
  247. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/runs.py +0 -0
  248. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/sqlite/__init__.py +0 -0
  249. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/sqlite/annotations.py +0 -0
  250. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/sqlite/backend.py +0 -0
  251. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/sqlite/bootstrap.py +0 -0
  252. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/sqlite/connection.py +0 -0
  253. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/sqlite/demo_quota.py +0 -0
  254. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/sqlite/llm_calls.py +0 -0
  255. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/sqlite/prior_embeddings.py +0 -0
  256. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/sqlite/prior_records.py +0 -0
  257. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/sqlite/priors.py +0 -0
  258. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/sqlite/projects.py +0 -0
  259. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/sqlite/runs.py +0 -0
  260. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/sqlite/schema.py +0 -0
  261. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/sqlite/users.py +0 -0
  262. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/database/users.py +0 -0
  263. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/graph_analysis/inference_server.py +0 -0
  264. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/graph_analysis/trace_chat/__init__.py +0 -0
  265. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/graph_analysis/trace_chat/main.py +0 -0
  266. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/graph_models.py +0 -0
  267. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/handlers/__init__.py +0 -0
  268. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/handlers/cli_handlers.py +0 -0
  269. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/handlers/handler_utils.py +0 -0
  270. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/handlers/runner_handlers.py +0 -0
  271. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/handlers/ui_handlers.py +0 -0
  272. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/llm_backend.py +0 -0
  273. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/llm_provider_catalog.py +0 -0
  274. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/llm_settings.py +0 -0
  275. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/llm_settings_verification.py +0 -0
  276. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/package_version.py +0 -0
  277. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/prior_display.py +0 -0
  278. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/__init__.py +0 -0
  279. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/constants.py +0 -0
  280. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/embeddings.py +0 -0
  281. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/__init__.py +0 -0
  282. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/folder_rebalancer.py +0 -0
  283. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/lesson_restructurer.py +0 -0
  284. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/lesson_retriever.py +0 -0
  285. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/lesson_summarizer.py +0 -0
  286. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/prior_metadata_suggester.py +0 -0
  287. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/llm_client.py +0 -0
  288. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/logger.py +0 -0
  289. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/path_utils.py +0 -0
  290. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/retrieval_service.py +0 -0
  291. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/routes.py +0 -0
  292. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/storage.py +0 -0
  293. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/adjudication.py +0 -0
  294. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/bm25_search.py +0 -0
  295. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/dense_search.py +0 -0
  296. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/folder_groups.py +0 -0
  297. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/keyword_search.py +0 -0
  298. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/parallel_search.py +0 -0
  299. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/preprocess_context.py +0 -0
  300. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/rerank.py +0 -0
  301. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/utils.py +0 -0
  302. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/priors_scope.py +0 -0
  303. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/routes/__init__.py +0 -0
  304. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/routes/events.py +0 -0
  305. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/routes/internal.py +0 -0
  306. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/routes/runner.py +0 -0
  307. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/routes/ui.py +0 -0
  308. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/routes/ui_common.py +0 -0
  309. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/routes/ui_projects.py +0 -0
  310. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/routes/ui_runs.py +0 -0
  311. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/routes/ui_trace_chat.py +0 -0
  312. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/runtime_preparation.py +0 -0
  313. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/services/__init__.py +0 -0
  314. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/services/annotation_evaluation_service.py +0 -0
  315. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/services/annotation_focus_service.py +0 -0
  316. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/services/annotation_service.py +0 -0
  317. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/services/demo_run_limit.py +0 -0
  318. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/services/embedding_sources.py +0 -0
  319. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/services/llm_call_embeddings.py +0 -0
  320. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/services/session_io_summary.py +0 -0
  321. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/services/trace_chat_service.py +0 -0
  322. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/state.py +0 -0
  323. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/third_party_model_catalog.py +0 -0
  324. {sovara-0.3.1 → sovara-0.3.2}/src/sovara/server/web_app_assets.py +0 -0
  325. {sovara-0.3.1 → sovara-0.3.2}/src/sovara.egg-info/dependency_links.txt +0 -0
  326. {sovara-0.3.1 → sovara-0.3.2}/src/sovara.egg-info/requires.txt +0 -0
  327. {sovara-0.3.1 → sovara-0.3.2}/src/sovara.egg-info/top_level.txt +0 -0
  328. {sovara-0.3.1 → sovara-0.3.2}/tests/test_graph_payloads.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sovara
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: A development tool for agent observability, benchmarking, and optimization via domain knowledge
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -129,6 +129,15 @@ That copies the skill to `.claude/skills/sovara/` under the selected project. Re
129
129
 
130
130
  Use Sovara in Claude Code by letting Claude invoke the skill automatically when relevant, or select it directly from the skill menu if needed.
131
131
 
132
+ To record Claude Code itself as a Sovara run, launch it through `so-claude`:
133
+
134
+ ```bash
135
+ so-claude
136
+ so-claude -p "summarize this repo"
137
+ ```
138
+
139
+ `so-claude` starts a normal Claude Code session, routes its Anthropic API calls through Sovara, and records Claude Code model/tool activity in the run graph. It currently supports standard Anthropic API routing through `ANTHROPIC_BASE_URL`; Bedrock and Vertex Claude Code modes are not supported yet.
140
+
132
141
  If you want both integrations installed globally in one step, run:
133
142
 
134
143
  ```bash
@@ -18,6 +18,7 @@ include = ["sovara*"]
18
18
  [project.scripts]
19
19
  # Console commands for the Sovara package
20
20
  so-record = "sovara.cli.so_record:main"
21
+ so-claude = "sovara.cli.so_claude:main"
21
22
  so-config = "sovara.cli.so_config:main"
22
23
  so-server = "sovara.cli.so_server:main"
23
24
  so-cli = "sovara.cli.so_tool:main"
@@ -27,7 +28,7 @@ line-length = 100
27
28
 
28
29
  [project]
29
30
  name = "sovara"
30
- version = "0.3.1"
31
+ version = "0.3.2"
31
32
  description = "A development tool for agent observability, benchmarking, and optimization via domain knowledge"
32
33
  readme = "docs/release/PYPI_DESC.md"
33
34
  requires-python = ">=3.10"
@@ -476,7 +476,7 @@ The ideal prior has three properties:
476
476
  2. generalizes well to other scenarios where the same problem could occur in a slightly different way
477
477
  3. and it does not conflict with other existing priors.
478
478
 
479
- Good priors are actionable, concise, self-contained, specific, generalizable, faithful to the lesson, retrieval-friendly, and non-conflicting. If a prior captures the right lesson but is verbose, vague, overly run-specific, or hard to scan, polish it before saving or updating it. In the UI, use the **Polish** action in the content editor. From the CLI, use `so-cli priors polish <prior_id>` to get a non-mutating polished content proposal.
479
+ Good priors are actionable, concise, self-contained, precise, well-scoped, faithful to the lesson, retrieval-friendly, and non-conflicting. Use the broadest reusable formulation that still addresses the issue, while including the conditions or exceptions needed to avoid causing mistakes in cases where the rule should not apply. If a prior captures the right lesson but is verbose, vague, overly run-specific, or hard to scan, polish it before saving or updating it. In the UI, use the **Polish** action in the content editor. From the CLI, use `so-cli priors polish <prior_id>` to get a non-mutating polished content proposal.
480
480
 
481
481
  Once you have constructed a prior, validate it by recording a fresh run with that prior available and comparing the new trace against the original observations.
482
482
  Once you verified that the prior addresses the problem, retrieve the available priors, and check if you introduced a conflict with another prior. If so, resolve the conflict by iteratively tuning and running the agent with the adapted priors, until you are satisfied.
@@ -0,0 +1,77 @@
1
+ from argparse import ArgumentParser
2
+ import sys
3
+
4
+
5
+ def launch_command_parser():
6
+ parser = ArgumentParser(
7
+ usage="so-claude [options] [--] [claude args...]",
8
+ description="Launch Claude Code with Sovara observability.",
9
+ allow_abbrev=False,
10
+ )
11
+ parser.add_argument(
12
+ "--run-name",
13
+ default=None,
14
+ help="Name that will be used in the run list. If not set, Run X will be used.",
15
+ )
16
+ parser.add_argument("--user-name", help="Override or create the local Sovara user full name.")
17
+ parser.add_argument("--user-email", help="Override or create the local Sovara user email.")
18
+ parser.add_argument(
19
+ "--project-root",
20
+ help="Project root to resolve or create for this run. Defaults to the current directory.",
21
+ )
22
+ parser.add_argument("--project-name", help="Override or create the Sovara project name.")
23
+ parser.add_argument(
24
+ "--project-description",
25
+ help="Override or create the Sovara project description.",
26
+ )
27
+ parser.add_argument(
28
+ "--claude-bin",
29
+ default="claude",
30
+ help="Claude Code executable to launch. Defaults to 'claude'.",
31
+ )
32
+ parser.add_argument(
33
+ "--timeout",
34
+ type=float,
35
+ default=None,
36
+ help="Timeout in seconds. Terminates Claude Code if exceeded.",
37
+ )
38
+ return parser
39
+
40
+
41
+ def _normalize_claude_args(args: list[str]) -> list[str]:
42
+ if args and args[0] == "--":
43
+ return args[1:]
44
+ return args
45
+
46
+
47
+ def parse_command_args(argv: list[str] | None = None):
48
+ parser = launch_command_parser()
49
+ args, claude_args = parser.parse_known_args(argv)
50
+ args.claude_args = _normalize_claude_args(claude_args)
51
+ return args
52
+
53
+
54
+ def launch_command(args):
55
+ from sovara.runner.claude_code_runner import ClaudeCodeRunner
56
+
57
+ runner = ClaudeCodeRunner(
58
+ claude_args=_normalize_claude_args(args.claude_args),
59
+ claude_bin=args.claude_bin,
60
+ timeout=args.timeout,
61
+ run_name=args.run_name,
62
+ user_name=getattr(args, "user_name", None),
63
+ user_email=getattr(args, "user_email", None),
64
+ project_root=getattr(args, "project_root", None),
65
+ project_name=getattr(args, "project_name", None),
66
+ project_description=getattr(args, "project_description", None),
67
+ )
68
+ runner.run()
69
+
70
+
71
+ def main():
72
+ args = parse_command_args(sys.argv[1:])
73
+ launch_command(args)
74
+
75
+
76
+ if __name__ == "__main__":
77
+ main()
@@ -25,6 +25,7 @@ MODEL_TOKEN_OVERRIDES = {
25
25
  "aya": "Aya",
26
26
  "awq": "AWQ",
27
27
  "bf16": "BF16",
28
+ "chatgpt": "ChatGPT",
28
29
  "chatglm": "ChatGLM",
29
30
  "claude": "Claude",
30
31
  "codestral": "Codestral",
@@ -138,6 +139,23 @@ def _format_openai_o_series(match: re.Match[str]) -> str:
138
139
  return f"o{major}{_format_optional_variant(variant)}"
139
140
 
140
141
 
142
+ def _format_openai_chat_latest(match: re.Match[str]) -> str:
143
+ (version,) = match.groups()
144
+ return f"GPT-{version} Chat"
145
+
146
+
147
+ def _format_openai_specialized_family(match: re.Match[str]) -> str:
148
+ family, tail = match.groups()
149
+ cleaned_tail = re.sub(r"-\d{4}-\d{2}-\d{2}$", "", tail or "")
150
+ return f"GPT {_format_model_token(family)}{_format_tail(cleaned_tail or None)}"
151
+
152
+
153
+ def _format_openai_deep_research(match: re.Match[str]) -> str:
154
+ major, mini = match.groups()
155
+ mini_suffix = " Mini" if mini else ""
156
+ return f"o{major}{mini_suffix} Deep Research"
157
+
158
+
141
159
  def _format_claude_modern(match: re.Match[str]) -> str:
142
160
  family, major, minor = match.groups()
143
161
  version = _format_optional_minor(major, minor)
@@ -181,6 +199,43 @@ def _format_slug_family(match: re.Match[str]) -> str:
181
199
  return f"{family}{_format_tail(tail)}"
182
200
 
183
201
 
202
+ def _normalize_vendor_model_name(name: str) -> str | None:
203
+ normalized_name = re.sub(r"^(?:apac|eu|global|us|us-gov)\.", "", name, count=1)
204
+
205
+ if normalized_name.startswith("anthropic."):
206
+ inner_name = normalized_name.removeprefix("anthropic.")
207
+ return re.sub(r"-v\d+(?::\d+)?$", "", inner_name)
208
+
209
+ if normalized_name.startswith("openai."):
210
+ inner_name = normalized_name.removeprefix("openai.")
211
+ return re.sub(r"-\d+:\d+$", "", inner_name)
212
+
213
+ if normalized_name.startswith("deepseek."):
214
+ inner_name = normalized_name.removeprefix("deepseek.")
215
+ inner_name = re.sub(r"-v\d+(?::\d+)?$", "", inner_name)
216
+ return f"deepseek-{inner_name}"
217
+
218
+ if normalized_name.startswith("qwen."):
219
+ inner_name = normalized_name.removeprefix("qwen.")
220
+ if inner_name == "qwen3-coder-480b-a35b-v1:0":
221
+ return "qwen3-coder-480b-a35b-instruct"
222
+ return re.sub(r"-v\d+(?::\d+)?$", "", inner_name)
223
+
224
+ if normalized_name.startswith("minimax."):
225
+ return normalized_name.removeprefix("minimax.")
226
+
227
+ if normalized_name.startswith("moonshotai."):
228
+ return normalized_name.removeprefix("moonshotai.")
229
+
230
+ if normalized_name.startswith("moonshot."):
231
+ return normalized_name.removeprefix("moonshot.")
232
+
233
+ if normalized_name != name:
234
+ return normalized_name
235
+
236
+ return None
237
+
238
+
184
239
  MODEL_NAME_PATTERNS: list[tuple[str, str]] = [
185
240
  (r"^mistral-small-2603$", "Mistral Small 4"),
186
241
  (r"^mistral-moderation-2603$", "Mistral Moderation 2"),
@@ -211,6 +266,7 @@ MODEL_NAME_PATTERNS: list[tuple[str, str]] = [
211
266
  (r"^codestral-2508$", "Codestral"),
212
267
  (r"^mistral-ocr-2512$", "OCR 3"),
213
268
  (r"^mistral-ocr-2505$", "OCR 2"),
269
+ (r"^chatgpt-image-latest$", "ChatGPT Image"),
214
270
  (r"^(?:openai/)?gpt-5\.2-chat-latest$", "GPT-5.2 Chat"),
215
271
  (r"^grok-4\.20-multi-agent-beta-\d{4}$", "Grok 4.20 Multi-Agent Beta"),
216
272
  (r"^grok-4\.20(?:-beta(?:-latest(?:-non-reasoning)?)?)?$", "Grok 4.20 Beta"),
@@ -240,8 +296,11 @@ ModelNameFormatter = Callable[[re.Match[str]], str]
240
296
 
241
297
  MODEL_NAME_FORMATTERS: list[tuple[str, ModelNameFormatter]] = [
242
298
  (r"^(?:chatgpt-)?gpt-4o(?:-(mini))?(?:-([a-z0-9]+(?:-[a-z0-9]+)*))?$", _format_openai_gpt_4o),
299
+ (r"^(?:openai/)?gpt-(\d+(?:\.\d+)?)-chat-latest$", _format_openai_chat_latest),
300
+ (r"^(?:openai/)?gpt-(realtime|audio|image)(?:-([a-z0-9.]+(?:-[a-z0-9.]+)*))?$", _format_openai_specialized_family),
243
301
  (r"^(?:openai/)?gpt-(\d+(?:\.\d+)?)(?:-([a-z0-9]+(?:-[a-z0-9]+)*))?$", _format_openai_gpt),
244
302
  (r"^(?:openai/)?gpt-oss-(\d+[a-z])$", _format_openai_gpt_oss),
303
+ (r"^(?:openai/)?o(\d+)(?:-(mini))?-deep-research$", _format_openai_deep_research),
245
304
  (r"^(?:openai/)?o(\d+)(?:-(mini|pro|preview))?$", _format_openai_o_series),
246
305
  (
247
306
  r"^claude-(opus|sonnet|haiku)-(\d+)(?:-(\d{1,2}))?(?:-(?:\d{8}|latest))?$",
@@ -299,6 +358,10 @@ def sanitize_node_name_for_display(name: str) -> str:
299
358
  if not name:
300
359
  return NO_LABEL
301
360
 
361
+ normalized_name = _normalize_vendor_model_name(name)
362
+ if normalized_name:
363
+ return sanitize_node_name_for_display(normalized_name)
364
+
302
365
  for pattern, clean_name in COMPILED_MODEL_NAME_PATTERNS:
303
366
  if pattern.match(name):
304
367
  return clean_name