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.
- {sovara-0.2.1 → sovara-0.2.4}/PKG-INFO +6 -1
- {sovara-0.2.1 → sovara-0.2.4}/pyproject.toml +9 -2
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/assets/SKILL.md +86 -8
- sovara-0.2.4/src/sovara/assets/web_app/assets/AttachmentPreview-CFrNMdfC.css +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/AttachmentPreview-h01XSt_Q.js +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/DocumentPreviewModal-B9FumoYT.js +12 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/LayoutBreadcrumb-D8Jj9PNg.js +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/LayoutBreadcrumb-DopPRSia.css +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/OrgRoute-BcO5LcH1.js +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/OrgRoute-DIln18S1.css +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/PriorsRoute-BSsFm0pQ.css +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/PriorsRoute-CaMBZzP_.js +5 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/ProjectRoute-BCA5W9t8.js +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/ProjectRoute-DtQqJb1n.css +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/RunRoute-BWs7EUiD.css +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/RunRoute-rUSpBhsI.js +21 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/SettingsRoute-BtETGx6c.js +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/SettingsRoute-C4VU70zq.css +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/api-1mbBSn7v.css +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/api-tVJBLHUH.js +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/arrow_lr-ByI2ndPB.png +0 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/arrow_spiral_tr_bl-XHIpf338.png +0 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/codicon-BYm2YbZ6.ttf +0 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/eye-DljehhmM.js +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/index-BygN1cJK.js +12 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/index-veNT10PX.css +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/pdf.worker.min-qwK7q_zL.mjs +28 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/plus-CkqVCne8.js +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/prismTheme-Bx8cYzkm.js +37 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/sovara_wordmark-CjkpVR0a.png +0 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/tierState-Bq39H0kz.js +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/assets/trash-2-DYeReTGL.js +1 -0
- sovara-0.2.4/src/sovara/assets/web_app/favicon.png +0 -0
- sovara-0.2.4/src/sovara/assets/web_app/index.html +17 -0
- sovara-0.2.4/src/sovara/assets/web_app/marketplace_icon.png +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/cli/so_config.py +14 -8
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/cli/so_record.py +26 -38
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/cli/so_server.py +114 -40
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/cli/so_tool.py +743 -106
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/common/config.py +14 -6
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/common/constants.py +11 -72
- sovara-0.2.4/src/sovara/common/lifecycle.py +58 -0
- sovara-0.2.4/src/sovara/common/log_redaction.py +37 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/common/project.py +98 -13
- sovara-0.2.4/src/sovara/common/runtime.py +15 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/common/user.py +7 -7
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/common/utils.py +75 -32
- sovara-0.2.4/src/sovara/runner/agent_runner.py +856 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/context_manager.py +5 -13
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parser.py +105 -19
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/aiohttp_api_parser.py +3 -4
- sovara-0.2.4/src/sovara/runner/monkey_patching/api_parsers/claude_sdk_api_parser.py +83 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/httpx_api_parser.py +4 -4
- sovara-0.2.4/src/sovara/runner/monkey_patching/api_parsers/langchain_tool_api_parser.py +33 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/mcp_api_parser.py +3 -6
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/requests_api_parser.py +4 -4
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/urllib3_api_parser.py +3 -4
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/apply_monkey_patches.py +1 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/aiohttp_patch.py +49 -50
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/claude_sdk_patch.py +37 -22
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/httpx_patch.py +62 -45
- sovara-0.2.4/src/sovara/runner/monkey_patching/patches/langchain_patch.py +275 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/mcp_patches.py +18 -13
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/randomness_patch.py +9 -9
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/requests_patch.py +34 -23
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/urllib3_patch.py +35 -22
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patching_utils.py +15 -4
- sovara-0.2.4/src/sovara/runner/node_execution.py +291 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/priors.py +6 -8
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/priors_pipeline.py +13 -0
- sovara-0.2.4/src/sovara/runner/run_log_capture.py +205 -0
- sovara-0.2.4/src/sovara/runner/runtime_client.py +306 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/string_matching.py +9 -5
- sovara-0.2.4/src/sovara/server/app.py +257 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/_shared.py +3 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/llm_calls.py +225 -73
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/manager.py +0 -4
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/runs.py +122 -111
- sovara-0.2.4/src/sovara/server/database/sqlite/llm_calls.py +297 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/sqlite/projects.py +46 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/sqlite/runs.py +196 -18
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/sqlite/schema.py +349 -15
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/sqlite/users.py +36 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/inference_server.py +235 -17
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/__init__.py +43 -9
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/verify.py +13 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/trace.py +12 -1
- sovara-0.2.4/src/sovara/server/graph_analysis/trace_chat/utils/verdict_persist.py +47 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_models.py +30 -13
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/handlers/__init__.py +2 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/handlers/cli_handlers.py +30 -7
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/handlers/runner_handlers.py +23 -6
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/handlers/ui_handlers.py +87 -5
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/llm_backend.py +19 -6
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/llm_provider_catalog.py +101 -9
- sovara-0.2.4/src/sovara/server/llm_settings.py +507 -0
- sovara-0.2.4/src/sovara/server/llm_settings_verification.py +487 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/routes.py +5 -1
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/storage.py +4 -2
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/routes/events.py +9 -2
- sovara-0.2.4/src/sovara/server/routes/internal.py +308 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/routes/runner.py +36 -21
- sovara-0.2.4/src/sovara/server/routes/ui.py +512 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/routes/ui_projects.py +82 -22
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/routes/ui_runs.py +43 -87
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/services/trace_chat_service.py +84 -5
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/state.py +44 -16
- sovara-0.2.4/src/sovara/server/third_party_model_catalog.py +167 -0
- sovara-0.2.4/src/sovara/server/web_app_assets.py +68 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara.egg-info/PKG-INFO +6 -1
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara.egg-info/SOURCES.txt +44 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara.egg-info/requires.txt +6 -0
- {sovara-0.2.1 → sovara-0.2.4}/tests/test_graph_payloads.py +0 -1
- sovara-0.2.1/src/sovara/runner/agent_runner.py +0 -435
- sovara-0.2.1/src/sovara/runner/monkey_patching/api_parsers/claude_sdk_api_parser.py +0 -107
- sovara-0.2.1/src/sovara/server/app.py +0 -161
- sovara-0.2.1/src/sovara/server/database/sqlite/llm_calls.py +0 -186
- sovara-0.2.1/src/sovara/server/llm_settings.py +0 -263
- sovara-0.2.1/src/sovara/server/routes/internal.py +0 -126
- sovara-0.2.1/src/sovara/server/routes/ui.py +0 -285
- {sovara-0.2.1 → sovara-0.2.4}/LICENSE +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/README.md +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/docs/release/PYPI_DESC.md +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/setup.cfg +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/assets/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/cli/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/common/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/common/custom_metrics.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/common/logger.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/api_parsers/sse_utils.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/async_streaming.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/edit_io_filters.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/endpoint_whitelist.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/node_naming.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/runner/monkey_patching/patches/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/priors.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/projects.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/sqlite/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/sqlite/connection.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/sqlite/priors.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/database/users.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/cancel.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/main.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/ask_step.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/edit_content.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/get_step_overview.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/get_step_snapshot.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/get_trace_overview.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/search.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/tools/summarize_trace.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/content_utils.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/context.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/edit_persist.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/step_content_view.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/graph_analysis/trace_chat/utils/step_ids.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/handlers/handler_utils.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/package_version.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/prior_display.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/constants.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/events.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/llm/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/llm/lesson_restructurer.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/llm/lesson_retriever.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/llm/lesson_summarizer.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/llm/lesson_validator.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/llm_client.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_backend/logger.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/priors_scope.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/routes/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/routes/ui_common.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/routes/ui_trace_chat.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara/server/services/__init__.py +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara.egg-info/dependency_links.txt +0 -0
- {sovara-0.2.1 → sovara-0.2.4}/src/sovara.egg-info/entry_points.txt +0 -0
- {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.
|
|
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.
|
|
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] [--
|
|
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
|
|
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
|
-
|
|
650
|
+
Sovara still keeps durable state under `~/.sovara`, so cache-only redirection only helps with non-persistent writes.
|
|
591
651
|
|
|
592
|
-
- `
|
|
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
|
-
|
|
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
|
-
|
|
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};
|