sovara 0.2.3__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 (182) hide show
  1. {sovara-0.2.3 → sovara-0.2.4}/PKG-INFO +4 -1
  2. {sovara-0.2.3 → sovara-0.2.4}/pyproject.toml +4 -1
  3. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/assets/SKILL.md +52 -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.3 → sovara-0.2.4}/src/sovara/cli/so_config.py +14 -8
  37. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/cli/so_record.py +17 -38
  38. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/cli/so_server.py +61 -7
  39. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/cli/so_tool.py +610 -105
  40. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/common/config.py +14 -6
  41. {sovara-0.2.3 → 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.3 → sovara-0.2.4}/src/sovara/common/project.py +98 -13
  45. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/common/user.py +7 -7
  46. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/common/utils.py +75 -32
  47. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/agent_runner.py +423 -40
  48. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/context_manager.py +5 -13
  49. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parser.py +105 -19
  50. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/aiohttp_api_parser.py +3 -4
  51. sovara-0.2.4/src/sovara/runner/monkey_patching/api_parsers/claude_sdk_api_parser.py +83 -0
  52. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/httpx_api_parser.py +4 -4
  53. sovara-0.2.4/src/sovara/runner/monkey_patching/api_parsers/langchain_tool_api_parser.py +33 -0
  54. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/mcp_api_parser.py +3 -6
  55. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/requests_api_parser.py +4 -4
  56. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/urllib3_api_parser.py +3 -4
  57. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/apply_monkey_patches.py +1 -0
  58. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/aiohttp_patch.py +49 -50
  59. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/claude_sdk_patch.py +37 -22
  60. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/httpx_patch.py +62 -45
  61. sovara-0.2.4/src/sovara/runner/monkey_patching/patches/langchain_patch.py +275 -0
  62. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/mcp_patches.py +18 -13
  63. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/randomness_patch.py +9 -9
  64. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/requests_patch.py +34 -23
  65. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/urllib3_patch.py +35 -22
  66. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patching_utils.py +15 -4
  67. sovara-0.2.4/src/sovara/runner/node_execution.py +291 -0
  68. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/priors.py +6 -8
  69. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/priors_pipeline.py +13 -0
  70. sovara-0.2.4/src/sovara/runner/runtime_client.py +306 -0
  71. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/string_matching.py +9 -5
  72. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/app.py +108 -40
  73. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/database/_shared.py +3 -0
  74. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/database/llm_calls.py +225 -73
  75. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/database/manager.py +0 -4
  76. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/database/runs.py +108 -111
  77. sovara-0.2.4/src/sovara/server/database/sqlite/llm_calls.py +297 -0
  78. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/database/sqlite/projects.py +46 -0
  79. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/database/sqlite/runs.py +181 -18
  80. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/database/sqlite/schema.py +349 -15
  81. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/database/sqlite/users.py +36 -0
  82. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/inference_server.py +219 -10
  83. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/__init__.py +43 -9
  84. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/verify.py +13 -0
  85. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/trace.py +12 -1
  86. sovara-0.2.4/src/sovara/server/graph_analysis/trace_chat/utils/verdict_persist.py +47 -0
  87. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_models.py +30 -13
  88. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/handlers/cli_handlers.py +11 -7
  89. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/handlers/runner_handlers.py +1 -6
  90. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/handlers/ui_handlers.py +87 -5
  91. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/llm_backend.py +19 -6
  92. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/llm_provider_catalog.py +101 -9
  93. sovara-0.2.4/src/sovara/server/llm_settings.py +507 -0
  94. sovara-0.2.4/src/sovara/server/llm_settings_verification.py +487 -0
  95. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/priors_backend/routes.py +5 -1
  96. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/priors_backend/storage.py +4 -2
  97. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/routes/events.py +9 -2
  98. sovara-0.2.4/src/sovara/server/routes/internal.py +308 -0
  99. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/routes/runner.py +18 -21
  100. sovara-0.2.4/src/sovara/server/routes/ui.py +512 -0
  101. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/routes/ui_projects.py +82 -22
  102. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/routes/ui_runs.py +34 -87
  103. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/services/trace_chat_service.py +84 -5
  104. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/state.py +37 -16
  105. sovara-0.2.4/src/sovara/server/third_party_model_catalog.py +167 -0
  106. {sovara-0.2.3 → sovara-0.2.4}/src/sovara.egg-info/PKG-INFO +4 -1
  107. {sovara-0.2.3 → sovara-0.2.4}/src/sovara.egg-info/SOURCES.txt +41 -0
  108. {sovara-0.2.3 → sovara-0.2.4}/src/sovara.egg-info/requires.txt +3 -0
  109. {sovara-0.2.3 → sovara-0.2.4}/tests/test_graph_payloads.py +0 -1
  110. sovara-0.2.3/src/sovara/runner/monkey_patching/api_parsers/claude_sdk_api_parser.py +0 -107
  111. sovara-0.2.3/src/sovara/server/database/sqlite/llm_calls.py +0 -186
  112. sovara-0.2.3/src/sovara/server/llm_settings.py +0 -263
  113. sovara-0.2.3/src/sovara/server/routes/internal.py +0 -126
  114. sovara-0.2.3/src/sovara/server/routes/ui.py +0 -286
  115. {sovara-0.2.3 → sovara-0.2.4}/LICENSE +0 -0
  116. {sovara-0.2.3 → sovara-0.2.4}/README.md +0 -0
  117. {sovara-0.2.3 → sovara-0.2.4}/docs/release/PYPI_DESC.md +0 -0
  118. {sovara-0.2.3 → sovara-0.2.4}/setup.cfg +0 -0
  119. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/__init__.py +0 -0
  120. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/assets/__init__.py +0 -0
  121. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/cli/__init__.py +0 -0
  122. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/common/__init__.py +0 -0
  123. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/common/custom_metrics.py +0 -0
  124. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/common/logger.py +0 -0
  125. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/common/runtime.py +0 -0
  126. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/__init__.py +0 -0
  127. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/__init__.py +0 -0
  128. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/__init__.py +0 -0
  129. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/sse_utils.py +0 -0
  130. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/async_streaming.py +0 -0
  131. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/edit_io_filters.py +0 -0
  132. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/endpoint_whitelist.py +0 -0
  133. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/node_naming.py +0 -0
  134. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/__init__.py +0 -0
  135. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/runner/run_log_capture.py +0 -0
  136. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/__init__.py +0 -0
  137. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/database/__init__.py +0 -0
  138. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/database/priors.py +0 -0
  139. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/database/projects.py +0 -0
  140. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/database/sqlite/__init__.py +0 -0
  141. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/database/sqlite/connection.py +0 -0
  142. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/database/sqlite/priors.py +0 -0
  143. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/database/users.py +0 -0
  144. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/__init__.py +0 -0
  145. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/cancel.py +0 -0
  146. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/main.py +0 -0
  147. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/ask_step.py +0 -0
  148. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/edit_content.py +0 -0
  149. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/get_step_overview.py +0 -0
  150. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/get_step_snapshot.py +0 -0
  151. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/get_trace_overview.py +0 -0
  152. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/search.py +0 -0
  153. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/summarize_trace.py +0 -0
  154. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/__init__.py +0 -0
  155. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/content_utils.py +0 -0
  156. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/context.py +0 -0
  157. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/edit_persist.py +0 -0
  158. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/step_content_view.py +0 -0
  159. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/step_ids.py +0 -0
  160. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/handlers/__init__.py +0 -0
  161. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/handlers/handler_utils.py +0 -0
  162. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/package_version.py +0 -0
  163. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/prior_display.py +0 -0
  164. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/priors_backend/__init__.py +0 -0
  165. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/priors_backend/constants.py +0 -0
  166. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/priors_backend/events.py +0 -0
  167. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/priors_backend/llm/__init__.py +0 -0
  168. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/priors_backend/llm/lesson_restructurer.py +0 -0
  169. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/priors_backend/llm/lesson_retriever.py +0 -0
  170. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/priors_backend/llm/lesson_summarizer.py +0 -0
  171. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/priors_backend/llm/lesson_validator.py +0 -0
  172. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/priors_backend/llm_client.py +0 -0
  173. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/priors_backend/logger.py +0 -0
  174. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/priors_scope.py +0 -0
  175. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/routes/__init__.py +0 -0
  176. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/routes/ui_common.py +0 -0
  177. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/routes/ui_trace_chat.py +0 -0
  178. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/services/__init__.py +0 -0
  179. {sovara-0.2.3 → sovara-0.2.4}/src/sovara/server/web_app_assets.py +0 -0
  180. {sovara-0.2.3 → sovara-0.2.4}/src/sovara.egg-info/dependency_links.txt +0 -0
  181. {sovara-0.2.3 → sovara-0.2.4}/src/sovara.egg-info/entry_points.txt +0 -0
  182. {sovara-0.2.3 → 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.3
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
@@ -26,7 +26,7 @@ line-length = 100
26
26
 
27
27
  [project]
28
28
  name = "sovara"
29
- version = "0.2.3"
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
  ]
@@ -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
  {
@@ -611,23 +639,25 @@ Representative outputs:
611
639
 
612
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.
613
641
 
614
- **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:
615
643
 
616
644
  ```bash
617
- export SOVARA_HOME=/tmp/sovara-home
618
645
  export SOVARA_CACHE=/tmp/sovara-cache
619
- export SOVARA_GIT_DIR=/tmp/sovara-git
620
646
  export UV_CACHE_DIR=/tmp/uv-cache
621
647
  export PYTHONPYCACHEPREFIX=/tmp/pycache
622
648
  ```
623
649
 
624
- This is the most important variable:
650
+ Sovara still keeps durable state under `~/.sovara`, so cache-only redirection only helps with non-persistent writes.
625
651
 
626
- - `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:
653
+
654
+ ```bash
655
+ so-server start
656
+ ```
627
657
 
628
- because it moves the default config, DB, and logs out of `~/.sovara`. The other variables avoid cache writes outside the sandbox's writable area.
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.
629
659
 
630
- **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.
631
661
 
632
662
  ### Priors server not reachable
633
663
 
@@ -646,6 +676,20 @@ because it moves the default config, DB, and logs out of `~/.sovara`. The other
646
676
 
647
677
  After making this change, restart your agent shell/session for the new environment to take effect.
648
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
+
649
693
  ---
650
694
 
651
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};