sovara 0.2.1__tar.gz → 0.2.4__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 (184) hide show
  1. {sovara-0.2.1 → sovara-0.2.4}/PKG-INFO +6 -1
  2. {sovara-0.2.1 → sovara-0.2.4}/pyproject.toml +9 -2
  3. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/assets/SKILL.md +86 -8
  4. sovara-0.2.4/src/sovara/assets/web_app/assets/AttachmentPreview-CFrNMdfC.css +1 -0
  5. sovara-0.2.4/src/sovara/assets/web_app/assets/AttachmentPreview-h01XSt_Q.js +1 -0
  6. sovara-0.2.4/src/sovara/assets/web_app/assets/DocumentPreviewModal-B9FumoYT.js +12 -0
  7. sovara-0.2.4/src/sovara/assets/web_app/assets/LayoutBreadcrumb-D8Jj9PNg.js +1 -0
  8. sovara-0.2.4/src/sovara/assets/web_app/assets/LayoutBreadcrumb-DopPRSia.css +1 -0
  9. sovara-0.2.4/src/sovara/assets/web_app/assets/OrgRoute-BcO5LcH1.js +1 -0
  10. sovara-0.2.4/src/sovara/assets/web_app/assets/OrgRoute-DIln18S1.css +1 -0
  11. sovara-0.2.4/src/sovara/assets/web_app/assets/PriorsRoute-BSsFm0pQ.css +1 -0
  12. sovara-0.2.4/src/sovara/assets/web_app/assets/PriorsRoute-CaMBZzP_.js +5 -0
  13. sovara-0.2.4/src/sovara/assets/web_app/assets/ProjectRoute-BCA5W9t8.js +1 -0
  14. sovara-0.2.4/src/sovara/assets/web_app/assets/ProjectRoute-DtQqJb1n.css +1 -0
  15. sovara-0.2.4/src/sovara/assets/web_app/assets/RunRoute-BWs7EUiD.css +1 -0
  16. sovara-0.2.4/src/sovara/assets/web_app/assets/RunRoute-rUSpBhsI.js +21 -0
  17. sovara-0.2.4/src/sovara/assets/web_app/assets/SettingsRoute-BtETGx6c.js +1 -0
  18. sovara-0.2.4/src/sovara/assets/web_app/assets/SettingsRoute-C4VU70zq.css +1 -0
  19. sovara-0.2.4/src/sovara/assets/web_app/assets/api-1mbBSn7v.css +1 -0
  20. sovara-0.2.4/src/sovara/assets/web_app/assets/api-tVJBLHUH.js +1 -0
  21. sovara-0.2.4/src/sovara/assets/web_app/assets/arrow_lr-ByI2ndPB.png +0 -0
  22. sovara-0.2.4/src/sovara/assets/web_app/assets/arrow_spiral_tr_bl-XHIpf338.png +0 -0
  23. sovara-0.2.4/src/sovara/assets/web_app/assets/codicon-BYm2YbZ6.ttf +0 -0
  24. sovara-0.2.4/src/sovara/assets/web_app/assets/eye-DljehhmM.js +1 -0
  25. sovara-0.2.4/src/sovara/assets/web_app/assets/index-BygN1cJK.js +12 -0
  26. sovara-0.2.4/src/sovara/assets/web_app/assets/index-veNT10PX.css +1 -0
  27. sovara-0.2.4/src/sovara/assets/web_app/assets/pdf.worker.min-qwK7q_zL.mjs +28 -0
  28. sovara-0.2.4/src/sovara/assets/web_app/assets/plus-CkqVCne8.js +1 -0
  29. sovara-0.2.4/src/sovara/assets/web_app/assets/prismTheme-Bx8cYzkm.js +37 -0
  30. sovara-0.2.4/src/sovara/assets/web_app/assets/sovara_wordmark-CjkpVR0a.png +0 -0
  31. sovara-0.2.4/src/sovara/assets/web_app/assets/tierState-Bq39H0kz.js +1 -0
  32. sovara-0.2.4/src/sovara/assets/web_app/assets/trash-2-DYeReTGL.js +1 -0
  33. sovara-0.2.4/src/sovara/assets/web_app/favicon.png +0 -0
  34. sovara-0.2.4/src/sovara/assets/web_app/index.html +17 -0
  35. sovara-0.2.4/src/sovara/assets/web_app/marketplace_icon.png +0 -0
  36. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/cli/so_config.py +14 -8
  37. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/cli/so_record.py +26 -38
  38. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/cli/so_server.py +114 -40
  39. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/cli/so_tool.py +743 -106
  40. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/common/config.py +14 -6
  41. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/common/constants.py +11 -72
  42. sovara-0.2.4/src/sovara/common/lifecycle.py +58 -0
  43. sovara-0.2.4/src/sovara/common/log_redaction.py +37 -0
  44. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/common/project.py +98 -13
  45. sovara-0.2.4/src/sovara/common/runtime.py +15 -0
  46. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/common/user.py +7 -7
  47. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/common/utils.py +75 -32
  48. sovara-0.2.4/src/sovara/runner/agent_runner.py +856 -0
  49. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/context_manager.py +5 -13
  50. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parser.py +105 -19
  51. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/aiohttp_api_parser.py +3 -4
  52. sovara-0.2.4/src/sovara/runner/monkey_patching/api_parsers/claude_sdk_api_parser.py +83 -0
  53. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/httpx_api_parser.py +4 -4
  54. sovara-0.2.4/src/sovara/runner/monkey_patching/api_parsers/langchain_tool_api_parser.py +33 -0
  55. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/mcp_api_parser.py +3 -6
  56. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/requests_api_parser.py +4 -4
  57. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/urllib3_api_parser.py +3 -4
  58. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/apply_monkey_patches.py +1 -0
  59. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/aiohttp_patch.py +49 -50
  60. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/claude_sdk_patch.py +37 -22
  61. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/httpx_patch.py +62 -45
  62. sovara-0.2.4/src/sovara/runner/monkey_patching/patches/langchain_patch.py +275 -0
  63. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/mcp_patches.py +18 -13
  64. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/randomness_patch.py +9 -9
  65. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/requests_patch.py +34 -23
  66. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/urllib3_patch.py +35 -22
  67. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patching_utils.py +15 -4
  68. sovara-0.2.4/src/sovara/runner/node_execution.py +291 -0
  69. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/priors.py +6 -8
  70. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/priors_pipeline.py +13 -0
  71. sovara-0.2.4/src/sovara/runner/run_log_capture.py +205 -0
  72. sovara-0.2.4/src/sovara/runner/runtime_client.py +306 -0
  73. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/string_matching.py +9 -5
  74. sovara-0.2.4/src/sovara/server/app.py +257 -0
  75. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/_shared.py +3 -0
  76. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/llm_calls.py +225 -73
  77. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/manager.py +0 -4
  78. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/runs.py +122 -111
  79. sovara-0.2.4/src/sovara/server/database/sqlite/llm_calls.py +297 -0
  80. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/sqlite/projects.py +46 -0
  81. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/sqlite/runs.py +196 -18
  82. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/sqlite/schema.py +349 -15
  83. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/sqlite/users.py +36 -0
  84. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/inference_server.py +235 -17
  85. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/__init__.py +43 -9
  86. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/verify.py +13 -0
  87. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/trace.py +12 -1
  88. sovara-0.2.4/src/sovara/server/graph_analysis/trace_chat/utils/verdict_persist.py +47 -0
  89. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_models.py +30 -13
  90. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/handlers/__init__.py +2 -0
  91. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/handlers/cli_handlers.py +30 -7
  92. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/handlers/runner_handlers.py +23 -6
  93. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/handlers/ui_handlers.py +87 -5
  94. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/llm_backend.py +19 -6
  95. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/llm_provider_catalog.py +101 -9
  96. sovara-0.2.4/src/sovara/server/llm_settings.py +507 -0
  97. sovara-0.2.4/src/sovara/server/llm_settings_verification.py +487 -0
  98. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/routes.py +5 -1
  99. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/storage.py +4 -2
  100. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/routes/events.py +9 -2
  101. sovara-0.2.4/src/sovara/server/routes/internal.py +308 -0
  102. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/routes/runner.py +36 -21
  103. sovara-0.2.4/src/sovara/server/routes/ui.py +512 -0
  104. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/routes/ui_projects.py +82 -22
  105. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/routes/ui_runs.py +43 -87
  106. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/services/trace_chat_service.py +84 -5
  107. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/state.py +44 -16
  108. sovara-0.2.4/src/sovara/server/third_party_model_catalog.py +167 -0
  109. sovara-0.2.4/src/sovara/server/web_app_assets.py +68 -0
  110. {sovara-0.2.1 → sovara-0.2.4}/src/sovara.egg-info/PKG-INFO +6 -1
  111. {sovara-0.2.1 → sovara-0.2.4}/src/sovara.egg-info/SOURCES.txt +44 -0
  112. {sovara-0.2.1 → sovara-0.2.4}/src/sovara.egg-info/requires.txt +6 -0
  113. {sovara-0.2.1 → sovara-0.2.4}/tests/test_graph_payloads.py +0 -1
  114. sovara-0.2.1/src/sovara/runner/agent_runner.py +0 -435
  115. sovara-0.2.1/src/sovara/runner/monkey_patching/api_parsers/claude_sdk_api_parser.py +0 -107
  116. sovara-0.2.1/src/sovara/server/app.py +0 -161
  117. sovara-0.2.1/src/sovara/server/database/sqlite/llm_calls.py +0 -186
  118. sovara-0.2.1/src/sovara/server/llm_settings.py +0 -263
  119. sovara-0.2.1/src/sovara/server/routes/internal.py +0 -126
  120. sovara-0.2.1/src/sovara/server/routes/ui.py +0 -285
  121. {sovara-0.2.1 → sovara-0.2.4}/LICENSE +0 -0
  122. {sovara-0.2.1 → sovara-0.2.4}/README.md +0 -0
  123. {sovara-0.2.1 → sovara-0.2.4}/docs/release/PYPI_DESC.md +0 -0
  124. {sovara-0.2.1 → sovara-0.2.4}/setup.cfg +0 -0
  125. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/__init__.py +0 -0
  126. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/assets/__init__.py +0 -0
  127. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/cli/__init__.py +0 -0
  128. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/common/__init__.py +0 -0
  129. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/common/custom_metrics.py +0 -0
  130. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/common/logger.py +0 -0
  131. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/__init__.py +0 -0
  132. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/__init__.py +0 -0
  133. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/__init__.py +0 -0
  134. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/sse_utils.py +0 -0
  135. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/async_streaming.py +0 -0
  136. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/edit_io_filters.py +0 -0
  137. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/endpoint_whitelist.py +0 -0
  138. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/node_naming.py +0 -0
  139. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/__init__.py +0 -0
  140. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/__init__.py +0 -0
  141. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/__init__.py +0 -0
  142. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/priors.py +0 -0
  143. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/projects.py +0 -0
  144. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/sqlite/__init__.py +0 -0
  145. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/sqlite/connection.py +0 -0
  146. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/sqlite/priors.py +0 -0
  147. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/users.py +0 -0
  148. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/__init__.py +0 -0
  149. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/cancel.py +0 -0
  150. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/main.py +0 -0
  151. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/ask_step.py +0 -0
  152. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/edit_content.py +0 -0
  153. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/get_step_overview.py +0 -0
  154. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/get_step_snapshot.py +0 -0
  155. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/get_trace_overview.py +0 -0
  156. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/search.py +0 -0
  157. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/summarize_trace.py +0 -0
  158. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/__init__.py +0 -0
  159. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/content_utils.py +0 -0
  160. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/context.py +0 -0
  161. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/edit_persist.py +0 -0
  162. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/step_content_view.py +0 -0
  163. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/step_ids.py +0 -0
  164. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/handlers/handler_utils.py +0 -0
  165. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/package_version.py +0 -0
  166. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/prior_display.py +0 -0
  167. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/__init__.py +0 -0
  168. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/constants.py +0 -0
  169. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/events.py +0 -0
  170. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/llm/__init__.py +0 -0
  171. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/llm/lesson_restructurer.py +0 -0
  172. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/llm/lesson_retriever.py +0 -0
  173. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/llm/lesson_summarizer.py +0 -0
  174. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/llm/lesson_validator.py +0 -0
  175. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/llm_client.py +0 -0
  176. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/logger.py +0 -0
  177. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_scope.py +0 -0
  178. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/routes/__init__.py +0 -0
  179. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/routes/ui_common.py +0 -0
  180. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/routes/ui_trace_chat.py +0 -0
  181. {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/services/__init__.py +0 -0
  182. {sovara-0.2.1 → sovara-0.2.4}/src/sovara.egg-info/dependency_links.txt +0 -0
  183. {sovara-0.2.1 → sovara-0.2.4}/src/sovara.egg-info/entry_points.txt +0 -0
  184. {sovara-0.2.1 → sovara-0.2.4}/src/sovara.egg-info/top_level.txt +0 -0
@@ -1,12 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sovara
3
- Version: 0.2.1
3
+ Version: 0.2.4
4
4
  Summary: A development tool for LLM call visualization and debugging
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
7
7
  License-File: LICENSE
8
8
  Requires-Dist: pyyaml
9
9
  Requires-Dist: dill
10
+ Requires-Dist: boto3
10
11
  Requires-Dist: debugpy
11
12
  Requires-Dist: psutil
12
13
  Requires-Dist: psycopg2-binary
@@ -15,6 +16,8 @@ Requires-Dist: fastapi
15
16
  Requires-Dist: uvicorn[standard]
16
17
  Requires-Dist: httpx
17
18
  Requires-Dist: litellm
19
+ Requires-Dist: google-auth
20
+ Requires-Dist: google-cloud-aiplatform
18
21
  Requires-Dist: flatten_dict
19
22
  Requires-Dist: flatten_json
20
23
  Provides-Extra: dev
@@ -33,6 +36,8 @@ Requires-Dist: langchain; extra == "dev"
33
36
  Requires-Dist: langchain-anthropic; extra == "dev"
34
37
  Requires-Dist: langchain-openai; extra == "dev"
35
38
  Requires-Dist: websocket-client; extra == "dev"
39
+ Provides-Extra: desktop
40
+ Requires-Dist: pyinstaller>=6.11; extra == "desktop"
36
41
  Provides-Extra: examples
37
42
  Requires-Dist: openai; extra == "examples"
38
43
  Requires-Dist: anthropic; extra == "examples"
@@ -5,7 +5,7 @@ requires = ["setuptools"]
5
5
  build-backend = "setuptools.build_meta"
6
6
 
7
7
  [tool.setuptools.package-data]
8
- "sovara.assets" = ["SKILL.md"]
8
+ "sovara.assets" = ["SKILL.md", "web_app/**/*"]
9
9
 
10
10
  [tool.setuptools]
11
11
  package-dir = {"" = "src"}
@@ -26,7 +26,7 @@ line-length = 100
26
26
 
27
27
  [project]
28
28
  name = "sovara"
29
- version = "0.2.1"
29
+ version = "0.2.4"
30
30
  description = "A development tool for LLM call visualization and debugging"
31
31
  readme = "docs/release/PYPI_DESC.md"
32
32
  requires-python = ">=3.10"
@@ -34,6 +34,7 @@ requires-python = ">=3.10"
34
34
  dependencies = [
35
35
  "pyyaml",
36
36
  "dill",
37
+ "boto3",
37
38
  "debugpy",
38
39
  "psutil",
39
40
  "psycopg2-binary",
@@ -42,6 +43,8 @@ dependencies = [
42
43
  "uvicorn[standard]",
43
44
  "httpx",
44
45
  "litellm",
46
+ "google-auth",
47
+ "google-cloud-aiplatform",
45
48
  "flatten_dict",
46
49
  "flatten_json"
47
50
  ]
@@ -65,6 +68,10 @@ dev = [
65
68
  "websocket-client"
66
69
  ]
67
70
 
71
+ desktop = [
72
+ "pyinstaller>=6.11",
73
+ ]
74
+
68
75
  examples = [
69
76
  "openai",
70
77
  "anthropic",
@@ -16,6 +16,9 @@ description: sovara helps you develop and maintain adaptable agentic systems. It
16
16
  ## Setup
17
17
 
18
18
  1. **Check for caching conflicts**: Scan the user-code for caching mechanisms (such as ad-hoc implementation of LLM-input caching or benchmark caching) that can interfere with the re-run capability. If you encounter such caching, flag this to the user and propose to change it by, for example, being able to disable caching with a `--no-cache` flag. **NOTE:** Caching that happens at the API provider level, for example using `cache_control` in the Anthropic API is OK!
19
+ 2. **Check setup state before the first run**: Start with `uv run so-cli status --path <script-or-project-dir>`. This reports whether the local Sovara user is configured and whether the target directory already belongs to a Sovara project.
20
+ 3. **Initialize explicitly when setup is missing**: If the user or project is missing, run `uv run so-cli init --user-name "<full name>" --user-email "<email>" [--project-root <dir> --project-name "<name>"]`. Do not reason about `~/.sovara/.user_id` or `.sovara/.project_id` directly if the CLI can tell you the setup state.
21
+ 4. **For non-interactive runs, pass setup through the CLI**: When running through Codex or another non-interactive shell, do not rely on prompts. Use `so-cli init` first or pass `--user-name`, `--user-email`, `--project-root`, `--project-name`, and `--project-description` directly to `so-cli record`.
19
22
 
20
23
  ## Integrated Observability
21
24
 
@@ -27,7 +30,11 @@ Run any agent and record the dataflow graph, as well as input/output to each nod
27
30
  The tool is generally structured like this.
28
31
 
29
32
  ```
30
- usage: so-cli record [-h] [-m] [--run-name RUN_NAME] [--timeout TIMEOUT] script_path ...
33
+ usage: so-cli record [-h] [-m] [-u] [--run-name RUN_NAME] [--user-name USER_NAME]
34
+ [--user-email USER_EMAIL] [--project-root PROJECT_ROOT]
35
+ [--project-name PROJECT_NAME]
36
+ [--project-description PROJECT_DESCRIPTION]
37
+ [--timeout TIMEOUT] script_path ...
31
38
 
32
39
  positional arguments:
33
40
  script_path Script to execute (or module name with -m)
@@ -36,7 +43,18 @@ positional arguments:
36
43
  options:
37
44
  -h, --help show this help message and exit
38
45
  -m, --module Run script_path as a Python module (like python -m)
46
+ -u, --unbuffered Run with unbuffered stdout/stderr, like python -u
39
47
  --run-name RUN_NAME Human-readable name for this run
48
+ --user-name USER_NAME
49
+ Override or create the local Sovara user full name
50
+ --user-email USER_EMAIL
51
+ Override or create the local Sovara user email
52
+ --project-root PROJECT_ROOT
53
+ Project root to resolve or create for this run
54
+ --project-name PROJECT_NAME
55
+ Override or create the Sovara project name
56
+ --project-description PROJECT_DESCRIPTION
57
+ Override or create the Sovara project description
40
58
  --timeout TIMEOUT Timeout in seconds (terminates script if exceeded)
41
59
  ```
42
60
 
@@ -46,6 +64,16 @@ Example:
46
64
  uv run so-cli record --run-name "OAI-debate-run-1" --timeout 60 example_workflows/debug_examples/openai/debate.py
47
65
  ```
48
66
 
67
+ First-run example with explicit setup:
68
+
69
+ ```bash
70
+ uv run so-cli init \
71
+ --user-name "Jane Doe" \
72
+ --user-email "jane@example.com" \
73
+ --project-root example_workflows/debug_examples/openai \
74
+ --project-name openai-debug
75
+ ```
76
+
49
77
  This will return
50
78
  ```json
51
79
  {
@@ -208,6 +236,40 @@ This will produce the full result (no preview) of the specific keys that match t
208
236
  }
209
237
  ```
210
238
 
239
+ ### Inspect persisted logs
240
+ If you want to inspect the captured stdout/stderr transcript for a run, use the `logs` command. Unlike `probe` and `runs`, this command prints plain text rather than JSON.
241
+
242
+ The tool is generally structured like this.
243
+
244
+ ```
245
+ usage: so-cli logs [-h] [--tail TAIL] [--grep GREP] [--context CONTEXT] [--line-numbers] run_id
246
+
247
+ positional arguments:
248
+ run_id Run ID to fetch logs for
249
+
250
+ options:
251
+ -h, --help show this help message and exit
252
+ --tail TAIL Show only the last N displayed lines
253
+ --grep GREP Filter displayed lines using a regex pattern
254
+ --context CONTEXT Show N lines of context around each grep match
255
+ --line-numbers Prefix displayed lines with original line numbers
256
+ ```
257
+
258
+ `run_id` accepts a full UUID or any unambiguous prefix, just like `probe`.
259
+
260
+ Examples:
261
+ To inspect the last 40 lines of a run, run
262
+
263
+ ```bash
264
+ uv run so-cli logs b6aaf796 --tail 40
265
+ ```
266
+
267
+ To search a large log for cache misses with nearby context and original line numbers, run
268
+
269
+ ```bash
270
+ uv run so-cli logs b6aaf796 --grep "Cache miss" --context 2 --line-numbers
271
+ ```
272
+
211
273
  ### List and manage runs
212
274
  You can manage past runs that you did with the `runs` command, which is structured in the following way
213
275
 
@@ -577,23 +639,25 @@ Representative outputs:
577
639
 
578
640
  **Problem:** You are running inside a sandboxed environment and Sovara commands fail because they try to write under `~/.sovara`, `~/.cache`, or Python cache locations.
579
641
 
580
- **Solution:** Redirect all writable runtime state into `/tmp` before invoking the CLI:
642
+ **Solution:** Redirect writable cache and Python temp state into `/tmp` before invoking the CLI:
581
643
 
582
644
  ```bash
583
- export SOVARA_HOME=/tmp/sovara-home
584
645
  export SOVARA_CACHE=/tmp/sovara-cache
585
- export SOVARA_GIT_DIR=/tmp/sovara-git
586
646
  export UV_CACHE_DIR=/tmp/uv-cache
587
647
  export PYTHONPYCACHEPREFIX=/tmp/pycache
588
648
  ```
589
649
 
590
- This is the most important variable:
650
+ Sovara still keeps durable state under `~/.sovara`, so cache-only redirection only helps with non-persistent writes.
591
651
 
592
- - `SOVARA_HOME=/tmp/sovara-home`
652
+ **Important limitation:** this only fixes cache/temp writes. If `so-cli record` needs to start the local Sovara server, that startup still writes durable state under `~/.sovara` (logs, config, DB, lock files). In Codex or another sandboxed agent, the smooth workflow is to start the server outside the sandbox first:
593
653
 
594
- because it moves the default config, DB, and logs out of `~/.sovara`. The other variables avoid cache writes outside the sandbox's writable area.
654
+ ```bash
655
+ so-server start
656
+ ```
657
+
658
+ Then run `so-cli record`, `so-cli runs`, `so-cli probe`, `so-cli logs`, and `so-cli edit-and-rerun` from inside Codex against the already-running server.
595
659
 
596
- **Important limitation:** this only fixes filesystem permission issues. If the sandbox also forbids binding a localhost port, server-backed commands like `runs`, `probe`, and `edit-and-rerun` may still fail until Sovara supports a no-daemon / in-process CLI transport.
660
+ If the sandbox also forbids binding a localhost port, server-backed commands may still fail until Sovara supports a no-daemon / in-process CLI transport.
597
661
 
598
662
  ### Priors server not reachable
599
663
 
@@ -612,6 +676,20 @@ because it moves the default config, DB, and logs out of `~/.sovara`. The other
612
676
 
613
677
  After making this change, restart your agent shell/session for the new environment to take effect.
614
678
 
679
+ ### Missing user or project setup
680
+
681
+ **Problem:** `so-cli record` reports that Sovara user or project setup is missing and the session cannot prompt.
682
+
683
+ **Solution:** Run `so-cli status --path <target>` to inspect the missing pieces, then initialize them explicitly:
684
+
685
+ ```bash
686
+ uv run so-cli init \
687
+ --user-name "<full name>" \
688
+ --user-email "<email>" \
689
+ --project-root <target-dir> \
690
+ --project-name "<project name>"
691
+ ```
692
+
615
693
  ---
616
694
 
617
695
  - You executed a code using `uv run so-cli --help`
@@ -0,0 +1 @@
1
+ :root{--react-pdf-annotation-layer: 1;--annotation-unfocused-field-background: url("data:image/svg+xml;charset=UTF-8,<svg width='1px' height='1px' xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' style='fill:rgba(0, 54, 255, 0.13);'/></svg>");--input-focus-border-color: Highlight;--input-focus-outline: 1px solid Canvas;--input-unfocused-border-color: transparent;--input-disabled-border-color: transparent;--input-hover-border-color: black;--link-outline: none}@media screen and (forced-colors:active){:root{--input-focus-border-color: CanvasText;--input-unfocused-border-color: ActiveText;--input-disabled-border-color: GrayText;--input-hover-border-color: Highlight;--link-outline: 1.5px solid LinkText}.annotationLayer .textWidgetAnnotation :is(input,textarea):required,.annotationLayer .choiceWidgetAnnotation select:required,.annotationLayer .buttonWidgetAnnotation:is(.checkBox,.radioButton) input:required{outline:1.5px solid selectedItem}.annotationLayer .linkAnnotation:hover{-webkit-backdrop-filter:invert(100%);backdrop-filter:invert(100%)}}.annotationLayer{position:absolute;top:0;left:0;pointer-events:none;transform-origin:0 0;z-index:3}.annotationLayer[data-main-rotation="90"] .norotate{transform:rotate(270deg) translate(-100%)}.annotationLayer[data-main-rotation="180"] .norotate{transform:rotate(180deg) translate(-100%,-100%)}.annotationLayer[data-main-rotation="270"] .norotate{transform:rotate(90deg) translateY(-100%)}.annotationLayer canvas{position:absolute;width:100%;height:100%}.annotationLayer section{position:absolute;text-align:initial;pointer-events:auto;box-sizing:border-box;margin:0;transform-origin:0 0}.annotationLayer .linkAnnotation{outline:var(--link-outline)}.textLayer.selecting~.annotationLayer section{pointer-events:none}.annotationLayer :is(.linkAnnotation,.buttonWidgetAnnotation.pushButton)>a{position:absolute;font-size:1em;top:0;left:0;width:100%;height:100%}.annotationLayer :is(.linkAnnotation,.buttonWidgetAnnotation.pushButton)>a:hover{opacity:.2;background:#ff0;box-shadow:0 2px 10px #ff0}.annotationLayer .textAnnotation img{position:absolute;cursor:pointer;width:100%;height:100%;top:0;left:0}.annotationLayer .textWidgetAnnotation :is(input,textarea),.annotationLayer .choiceWidgetAnnotation select,.annotationLayer .buttonWidgetAnnotation:is(.checkBox,.radioButton) input{background-image:var(--annotation-unfocused-field-background);border:2px solid var(--input-unfocused-border-color);box-sizing:border-box;font:calc(9px * var(--total-scale-factor)) sans-serif;height:100%;margin:0;vertical-align:top;width:100%}.annotationLayer .textWidgetAnnotation :is(input,textarea):required,.annotationLayer .choiceWidgetAnnotation select:required,.annotationLayer .buttonWidgetAnnotation:is(.checkBox,.radioButton) input:required{outline:1.5px solid red}.annotationLayer .choiceWidgetAnnotation select option{padding:0}.annotationLayer .buttonWidgetAnnotation.radioButton input{border-radius:50%}.annotationLayer .textWidgetAnnotation textarea{resize:none}.annotationLayer .textWidgetAnnotation :is(input,textarea)[disabled],.annotationLayer .choiceWidgetAnnotation select[disabled],.annotationLayer .buttonWidgetAnnotation:is(.checkBox,.radioButton) input[disabled]{background:none;border:2px solid var(--input-disabled-border-color);cursor:not-allowed}.annotationLayer .textWidgetAnnotation :is(input,textarea):hover,.annotationLayer .choiceWidgetAnnotation select:hover,.annotationLayer .buttonWidgetAnnotation:is(.checkBox,.radioButton) input:hover{border:2px solid var(--input-hover-border-color)}.annotationLayer .textWidgetAnnotation :is(input,textarea):hover,.annotationLayer .choiceWidgetAnnotation select:hover,.annotationLayer .buttonWidgetAnnotation.checkBox input:hover{border-radius:2px}.annotationLayer .textWidgetAnnotation :is(input,textarea):focus,.annotationLayer .choiceWidgetAnnotation select:focus{background:none;border:2px solid var(--input-focus-border-color);border-radius:2px;outline:var(--input-focus-outline)}.annotationLayer .buttonWidgetAnnotation:is(.checkBox,.radioButton) :focus{background-image:none;background-color:transparent}.annotationLayer .buttonWidgetAnnotation.checkBox :focus{border:2px solid var(--input-focus-border-color);border-radius:2px;outline:var(--input-focus-outline)}.annotationLayer .buttonWidgetAnnotation.radioButton :focus{border:2px solid var(--input-focus-border-color);outline:var(--input-focus-outline)}.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before,.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after,.annotationLayer .buttonWidgetAnnotation.radioButton input:checked:before{background-color:CanvasText;content:"";display:block;position:absolute}.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before,.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after{height:80%;left:45%;width:1px}.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before{transform:rotate(45deg)}.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after{transform:rotate(-45deg)}.annotationLayer .buttonWidgetAnnotation.radioButton input:checked:before{border-radius:50%;height:50%;left:30%;top:20%;width:50%}.annotationLayer .textWidgetAnnotation input.comb{font-family:monospace;padding-left:2px;padding-right:0}.annotationLayer .textWidgetAnnotation input.comb:focus{width:103%}.annotationLayer .buttonWidgetAnnotation:is(.checkBox,.radioButton) input{appearance:none}.annotationLayer .popupTriggerArea{height:100%;width:100%}.annotationLayer .fileAttachmentAnnotation .popupTriggerArea{position:absolute}.annotationLayer .popupWrapper{position:absolute;font-size:calc(9px * var(--total-scale-factor));width:100%;min-width:calc(180px * var(--total-scale-factor));pointer-events:none}.annotationLayer .popup{position:absolute;max-width:calc(180px * var(--total-scale-factor));background-color:#ff9;box-shadow:0 calc(2px * var(--total-scale-factor)) calc(5px * var(--total-scale-factor)) #888;border-radius:calc(2px * var(--total-scale-factor));padding:calc(6px * var(--total-scale-factor));margin-left:calc(5px * var(--total-scale-factor));cursor:pointer;font:message-box;white-space:normal;word-wrap:break-word;pointer-events:auto}.annotationLayer .popup>*{font-size:calc(9px * var(--total-scale-factor))}.annotationLayer .popup h1{display:inline-block}.annotationLayer .popupDate{display:inline-block;margin-left:calc(5px * var(--total-scale-factor))}.annotationLayer .popupContent{border-top:1px solid rgba(51,51,51,1);margin-top:calc(2px * var(--total-scale-factor));padding-top:calc(2px * var(--total-scale-factor))}.annotationLayer .richText>*{white-space:pre-wrap;font-size:calc(9px * var(--total-scale-factor))}.annotationLayer .highlightAnnotation,.annotationLayer .underlineAnnotation,.annotationLayer .squigglyAnnotation,.annotationLayer .strikeoutAnnotation,.annotationLayer .freeTextAnnotation,.annotationLayer .lineAnnotation svg line,.annotationLayer .squareAnnotation svg rect,.annotationLayer .circleAnnotation svg ellipse,.annotationLayer .polylineAnnotation svg polyline,.annotationLayer .polygonAnnotation svg polygon,.annotationLayer .caretAnnotation,.annotationLayer .inkAnnotation svg polyline,.annotationLayer .stampAnnotation,.annotationLayer .fileAttachmentAnnotation{cursor:pointer}.annotationLayer section svg{position:absolute;width:100%;height:100%;top:0;left:0}.annotationLayer .annotationTextContent{position:absolute;width:100%;height:100%;opacity:0;color:transparent;-webkit-user-select:none;user-select:none;pointer-events:none}.annotationLayer .annotationTextContent span{width:100%;display:inline-block}:root{--react-pdf-text-layer: 1;--highlight-bg-color: rgba(180, 0, 170, 1);--highlight-selected-bg-color: rgba(0, 100, 0, 1)}@media screen and (forced-colors:active){:root{--highlight-bg-color: Highlight;--highlight-selected-bg-color: ButtonText}}[data-main-rotation="90"]{transform:rotate(90deg) translateY(-100%)}[data-main-rotation="180"]{transform:rotate(180deg) translate(-100%,-100%)}[data-main-rotation="270"]{transform:rotate(270deg) translate(-100%)}.textLayer{position:absolute;text-align:initial;inset:0;overflow:hidden;line-height:1;text-size-adjust:none;forced-color-adjust:none;transform-origin:0 0;z-index:2}.textLayer :is(span,br){color:transparent;position:absolute;white-space:pre;cursor:text;margin:0;transform-origin:0 0}.textLayer span.markedContent{top:0;height:0}.textLayer .highlight{margin:-1px;padding:1px;background-color:var(--highlight-bg-color);border-radius:4px}.textLayer .highlight.appended{position:initial}.textLayer .highlight.begin{border-radius:4px 0 0 4px}.textLayer .highlight.end{border-radius:0 4px 4px 0}.textLayer .highlight.middle{border-radius:0}.textLayer .highlight.selected{background-color:var(--highlight-selected-bg-color)}.textLayer br::selection{background:transparent}.textLayer .endOfContent{display:block;position:absolute;inset:100% 0 0;z-index:-1;cursor:default;-webkit-user-select:none;user-select:none}.textLayer.selecting .endOfContent{top:0}.hiddenCanvasElement{position:absolute;top:0;left:0;width:0;height:0;display:none}[data-rmiz-ghost]{position:absolute;pointer-events:none}[data-rmiz-btn-zoom],[data-rmiz-btn-unzoom]{background-color:#000000b3;border-radius:50%;border:none;box-shadow:0 0 1px #ffffff80;color:#fff;height:40px;margin:0;outline-offset:2px;padding:9px;touch-action:manipulation;width:40px;-webkit-appearance:none;-moz-appearance:none;appearance:none}[data-rmiz-btn-zoom]:not(:focus):not(:active){position:absolute;clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;pointer-events:none;white-space:nowrap;width:1px}[data-rmiz-btn-zoom]{position:absolute;inset:10px 10px auto auto;cursor:zoom-in}[data-rmiz-btn-unzoom]{position:absolute;inset:20px 20px auto auto;cursor:zoom-out;z-index:1}[data-rmiz-content=found] img,[data-rmiz-content=found] svg,[data-rmiz-content=found] [role=img],[data-rmiz-content=found] [data-zoom]{cursor:zoom-in}[data-rmiz-modal]::backdrop{display:none}[data-rmiz-modal][open]{position:fixed;width:100vw;width:100dvw;height:100vh;height:100dvh;max-width:none;max-height:none;margin:0;padding:0;border:0;background:transparent;overflow:hidden;pointer-events:all}[data-rmiz-modal-overlay]{position:absolute;inset:0;transition:background-color .3s}[data-rmiz-modal-overlay=hidden]{background-color:#fff0}[data-rmiz-modal-overlay=visible]{background-color:#fff}[data-rmiz-modal-content]{position:relative;width:100%;height:100%}[data-rmiz-modal-img]{position:absolute;cursor:zoom-out;image-rendering:high-quality;transform-origin:top left;transition:transform .3s}@media(prefers-reduced-motion:reduce){[data-rmiz-modal-overlay],[data-rmiz-modal-img]{transition-duration:.01ms!important}}
@@ -0,0 +1 @@
1
+ import{r as n,j as e}from"./index-BygN1cJK.js";import{D as r,a as l,P as o,G as c}from"./DocumentPreviewModal-B9FumoYT.js";import{M as p,i as d,a as h,h as u,s as x,d as j}from"./RunRoute-rUSpBhsI.js";import"./LayoutBreadcrumb-D8Jj9PNg.js";import"./api-tVJBLHUH.js";import"./plus-CkqVCne8.js";import"./prismTheme-Bx8cYzkm.js";import"./tierState-Bq39H0kz.js";c.workerSrc=new URL("/assets/pdf.worker.min-qwK7q_zL.mjs",import.meta.url).toString();function b({attachment:a,onClick:i}){const s=`data:${a.mimeType};base64,${a.data}`,t=p[a.mimeType]??a.mimeType.split("/")[1]?.toUpperCase()??"FILE";return e.jsxs("button",{className:"attachment-thumb",onClick:i,title:a.name,children:[e.jsx("div",{className:"attachment-thumb-preview",children:d(a.mimeType)?e.jsx("img",{src:s,alt:a.name,className:"attachment-thumb-img"}):h(a.mimeType)?e.jsx(l,{file:s,loading:e.jsx("div",{className:"attachment-thumb-placeholder",children:"PDF"}),children:e.jsx(o,{pageNumber:1,width:120,renderTextLayer:!1,renderAnnotationLayer:!1})}):e.jsx("div",{className:"attachment-thumb-placeholder",children:t})}),e.jsxs("div",{className:"attachment-thumb-label",children:[e.jsx("span",{className:"attachment-thumb-ext",children:t}),e.jsx("span",{className:"attachment-thumb-name",children:a.name})]})]})}function k({attachments:a}){const[i,s]=n.useState(null);if(a.length===0)return null;function t(m){u(m.mimeType)?s(m):x(j(m.data,{mime_type:m.mimeType,filename:m.name})||{data:m.data,mimeType:m.mimeType,type:"unknown",name:m.name})}return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"attachment-strip",children:a.map(m=>e.jsx(b,{attachment:m,onClick:()=>t(m)},m.id))}),i&&e.jsx(r,{attachment:i,onClose:()=>s(null)})]})}export{k as AttachmentStrip};