sovara 0.3.0__tar.gz → 0.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. {sovara-0.3.0 → sovara-0.3.2}/PKG-INFO +1 -1
  2. {sovara-0.3.0 → sovara-0.3.2}/README.md +9 -0
  3. {sovara-0.3.0 → sovara-0.3.2}/pyproject.toml +3 -2
  4. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/SKILL.md +1 -1
  5. sovara-0.3.2/src/sovara/assets/default_runs.sqlite +0 -0
  6. sovara-0.3.2/src/sovara/assets/web_app/assets/AnnotationRoute-CE3twxG9.js +2 -0
  7. sovara-0.3.2/src/sovara/assets/web_app/assets/AnnotationRoute-voBIuZUX.css +1 -0
  8. sovara-0.3.2/src/sovara/assets/web_app/assets/AttachmentPreview-plYzPaRE.js +1 -0
  9. sovara-0.3.0/src/sovara/assets/web_app/assets/DocumentPreviewModal-Ul5rOAPX.js → sovara-0.3.2/src/sovara/assets/web_app/assets/DocumentPreviewModal-BFdSPROi.js +1 -1
  10. sovara-0.3.2/src/sovara/assets/web_app/assets/LayoutBreadcrumb-DQfjpJp6.js +1 -0
  11. sovara-0.3.0/src/sovara/assets/web_app/assets/OrgRoute-Ce4asoe9.js → sovara-0.3.2/src/sovara/assets/web_app/assets/OrgRoute-C6PvXMBj.js +1 -1
  12. sovara-0.3.0/src/sovara/assets/web_app/assets/PriorsRoute-D8mr_Y1x.css → sovara-0.3.2/src/sovara/assets/web_app/assets/PriorsRoute-BFKg8GE_.css +1 -1
  13. sovara-0.3.0/src/sovara/assets/web_app/assets/PriorsRoute-C4oOrqDA.js → sovara-0.3.2/src/sovara/assets/web_app/assets/PriorsRoute-CvQs_UGM.js +3 -3
  14. sovara-0.3.0/src/sovara/assets/web_app/assets/ProjectRoute-cNKZ50fg.js → sovara-0.3.2/src/sovara/assets/web_app/assets/ProjectRoute-CrWY3I2q.js +1 -1
  15. sovara-0.3.2/src/sovara/assets/web_app/assets/ProjectRunsRoute-BWJaCbdU.js +1 -0
  16. sovara-0.3.2/src/sovara/assets/web_app/assets/RunRoute-Bf1i1Jzu.js +1 -0
  17. sovara-0.3.2/src/sovara/assets/web_app/assets/RunTabsHeader-BFdSaCHq.js +1 -0
  18. sovara-0.3.2/src/sovara/assets/web_app/assets/SettingsRoute-CaCQ4pWX.js +1 -0
  19. sovara-0.3.0/src/sovara/assets/web_app/assets/api-Cn63uIq_.js → sovara-0.3.2/src/sovara/assets/web_app/assets/api-BHNyGAe0.js +1 -1
  20. sovara-0.3.0/src/sovara/assets/web_app/assets/eye-CooSk7uC.js → sovara-0.3.2/src/sovara/assets/web_app/assets/eye-BRRCRKsr.js +1 -1
  21. sovara-0.3.0/src/sovara/assets/web_app/assets/index-CREKj-N4.js → sovara-0.3.2/src/sovara/assets/web_app/assets/index-FFvomyuN.js +2 -2
  22. sovara-0.3.2/src/sovara/assets/web_app/assets/plus-StJOlCLf.js +1 -0
  23. sovara-0.3.0/src/sovara/assets/web_app/assets/prismTheme-C6tAEXfl.js → sovara-0.3.2/src/sovara/assets/web_app/assets/prismTheme-DRzlLkhr.js +24 -24
  24. sovara-0.3.2/src/sovara/assets/web_app/assets/projectRuns-B4uZ9L5w.js +1 -0
  25. sovara-0.3.0/src/sovara/assets/web_app/assets/settings-CndLNVxF.js → sovara-0.3.2/src/sovara/assets/web_app/assets/settings-Br0my5v3.js +1 -1
  26. sovara-0.3.2/src/sovara/assets/web_app/assets/settings-CZdC8p_Y.css +1 -0
  27. sovara-0.3.0/src/sovara/assets/web_app/assets/tierState-Ch9TeQpd.js → sovara-0.3.2/src/sovara/assets/web_app/assets/tierState-DObTMUxC.js +1 -1
  28. sovara-0.3.0/src/sovara/assets/web_app/assets/trash-2-Bo3wPEsq.js → sovara-0.3.2/src/sovara/assets/web_app/assets/trash-2-BiGQZCMf.js +1 -1
  29. sovara-0.3.2/src/sovara/assets/web_app/assets/useRunViewLayout-D1NwHTvJ.css +1 -0
  30. sovara-0.3.2/src/sovara/assets/web_app/assets/useRunViewLayout-Db3uX16H.js +284 -0
  31. sovara-0.3.0/src/sovara/assets/web_app/assets/value-DPno7Vtw.js → sovara-0.3.2/src/sovara/assets/web_app/assets/value-BlJoDf9S.js +1 -1
  32. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/index.html +1 -1
  33. sovara-0.3.2/src/sovara/cli/so_claude.py +77 -0
  34. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/cli/so_server.py +10 -3
  35. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/annotations.py +6 -0
  36. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/node_naming.py +63 -0
  37. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/agent_runner.py +3 -8
  38. sovara-0.3.2/src/sovara/runner/claude_code_runner.py +473 -0
  39. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parser.py +2 -2
  40. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/annotation_backend/annotation_agent/agent.py +179 -10
  41. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/annotation_backend/annotation_agent/models.py +38 -5
  42. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/annotation_backend/annotation_agent/prompts.py +10 -5
  43. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/app.py +17 -2
  44. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/prompts.py +7 -1
  45. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/tools/applied_priors.py +4 -4
  46. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/claude_proxy_utils.py +56 -12
  47. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/annotations.py +29 -0
  48. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/backend_protocol.py +16 -0
  49. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/mongodb/backend.py +95 -7
  50. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/mongodb/connection.py +0 -36
  51. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/postgresql/backend.py +21 -0
  52. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/postgresql/schema.py +2 -0
  53. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/sqlite/annotations.py +72 -9
  54. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/sqlite/backend.py +27 -0
  55. sovara-0.3.2/src/sovara/server/database/sqlite/bootstrap.py +125 -0
  56. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/sqlite/connection.py +5 -0
  57. sovara-0.3.2/src/sovara/server/database/sqlite/demo_quota.py +108 -0
  58. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/sqlite/schema.py +38 -123
  59. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/sqlite/users.py +40 -2
  60. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/users.py +3 -0
  61. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/graph_analysis/trace_chat/prompts.py +6 -6
  62. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/handlers/ui_handlers.py +28 -0
  63. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/llm_settings.py +24 -107
  64. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/lesson_validator.py +3 -4
  65. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/prior_content_polisher.py +2 -4
  66. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/prior_quality.py +8 -4
  67. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/retrieval_service.py +68 -1
  68. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/routes.py +10 -0
  69. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_pipeline.py +13 -2
  70. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/recording.py +4 -1
  71. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/routes/claude_proxy.py +258 -1
  72. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/routes/runner.py +6 -1
  73. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/routes/ui.py +13 -3
  74. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/routes/ui_runs.py +182 -20
  75. sovara-0.3.2/src/sovara/server/services/annotation_evaluation_service.py +761 -0
  76. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/services/annotation_service.py +4 -1
  77. sovara-0.3.2/src/sovara/server/services/demo_run_limit.py +58 -0
  78. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/services/trace_chat_service.py +17 -0
  79. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/state.py +640 -12
  80. {sovara-0.3.0 → sovara-0.3.2}/src/sovara.egg-info/PKG-INFO +1 -1
  81. {sovara-0.3.0 → sovara-0.3.2}/src/sovara.egg-info/SOURCES.txt +33 -28
  82. {sovara-0.3.0 → sovara-0.3.2}/src/sovara.egg-info/entry_points.txt +1 -0
  83. sovara-0.3.0/src/sovara/assets/web_app/assets/AnnotationRoute-0Ktltnuy.js +0 -2
  84. sovara-0.3.0/src/sovara/assets/web_app/assets/AnnotationRoute-DW45FIjQ.css +0 -1
  85. sovara-0.3.0/src/sovara/assets/web_app/assets/AttachmentPreview-eCpW57fh.js +0 -1
  86. sovara-0.3.0/src/sovara/assets/web_app/assets/LayoutBreadcrumb-riSSGB8Z.js +0 -1
  87. sovara-0.3.0/src/sovara/assets/web_app/assets/ProjectRunsRoute-C81LBYT1.js +0 -1
  88. sovara-0.3.0/src/sovara/assets/web_app/assets/RunRoute-C4Oe7W03.js +0 -1
  89. sovara-0.3.0/src/sovara/assets/web_app/assets/RunTraceFlow-BdOFvjnv.js +0 -284
  90. sovara-0.3.0/src/sovara/assets/web_app/assets/RunTraceFlow-DHifSBqT.css +0 -1
  91. sovara-0.3.0/src/sovara/assets/web_app/assets/SettingsRoute-32JrdDEj.js +0 -1
  92. sovara-0.3.0/src/sovara/assets/web_app/assets/file-text-D7EEaEmQ.js +0 -1
  93. sovara-0.3.0/src/sovara/assets/web_app/assets/navigation-BDXSoFIh.js +0 -1
  94. sovara-0.3.0/src/sovara/assets/web_app/assets/plus-wzmTnjex.js +0 -1
  95. sovara-0.3.0/src/sovara/assets/web_app/assets/projectRuns-CiDwHyhp.js +0 -1
  96. sovara-0.3.0/src/sovara/assets/web_app/assets/settings-BS_NcxJU.css +0 -1
  97. sovara-0.3.0/src/sovara/server/services/annotation_evaluation_service.py +0 -124
  98. {sovara-0.3.0 → sovara-0.3.2}/LICENSE +0 -0
  99. {sovara-0.3.0 → sovara-0.3.2}/docs/release/PYPI_DESC.md +0 -0
  100. {sovara-0.3.0 → sovara-0.3.2}/setup.cfg +0 -0
  101. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/__init__.py +0 -0
  102. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/__init__.py +0 -0
  103. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/AttachmentPreview-CFrNMdfC.css +0 -0
  104. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  105. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  106. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  107. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  108. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  109. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  110. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  111. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  112. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  113. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  114. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  115. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  116. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  117. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  118. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  119. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  120. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  121. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  122. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  123. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  124. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  125. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  126. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  127. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  128. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  129. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  130. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  131. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  132. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  133. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  134. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  135. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  136. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  137. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  138. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  139. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  140. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  141. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  142. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  143. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  144. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  145. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  146. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  147. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  148. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  149. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  150. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  151. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  152. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  153. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  154. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  155. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  156. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  157. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  158. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  159. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  160. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  161. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  162. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  163. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/LayoutBreadcrumb-Di8BFf6J.css +0 -0
  164. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/OrgRoute-Syy1k3se.css +0 -0
  165. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/ProjectRoute-C3Jzk4jL.css +0 -0
  166. /sovara-0.3.0/src/sovara/assets/web_app/assets/navigation-CCiRiliL.css → /sovara-0.3.2/src/sovara/assets/web_app/assets/RunTabsHeader-CCiRiliL.css +0 -0
  167. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/arrow_lr-ByI2ndPB.png +0 -0
  168. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/arrow_spiral_tr_bl-XHIpf338.png +0 -0
  169. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/codicon-BYm2YbZ6.ttf +0 -0
  170. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/index-CaNmZMjl.css +0 -0
  171. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/pdf.worker.min-qwK7q_zL.mjs +0 -0
  172. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/projectRuns-D7mGuqzb.css +0 -0
  173. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/sovara_favicon_colour-BrB8E1K-.png +0 -0
  174. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/sovara_full_logo_dark_green-DUVlz28Y.svg +0 -0
  175. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/sovara_full_logo_light_green-CZc0oGc4.svg +0 -0
  176. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/assets/tiny-invariant-BCXflckp.js +0 -0
  177. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/favicon-colour.png +0 -0
  178. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/favicon.png +0 -0
  179. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/assets/web_app/marketplace_icon.png +0 -0
  180. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/cli/__init__.py +0 -0
  181. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/cli/so_config.py +0 -0
  182. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/cli/so_record.py +0 -0
  183. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/cli/so_tool.py +0 -0
  184. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/__init__.py +0 -0
  185. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/config.py +0 -0
  186. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/constants.py +0 -0
  187. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/custom_metrics.py +0 -0
  188. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/edit_io_exclude_patterns.json +0 -0
  189. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/endpoint_patterns.json +0 -0
  190. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/lifecycle.py +0 -0
  191. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/log_redaction.py +0 -0
  192. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/logger.py +0 -0
  193. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/priors_block.py +0 -0
  194. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/priors_block_guidance.json +0 -0
  195. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/project.py +0 -0
  196. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/run_logs.py +0 -0
  197. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/runtime.py +0 -0
  198. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/user.py +0 -0
  199. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/common/utils.py +0 -0
  200. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/__init__.py +0 -0
  201. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/context_manager.py +0 -0
  202. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/__init__.py +0 -0
  203. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parsers/__init__.py +0 -0
  204. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parsers/aiohttp_api_parser.py +0 -0
  205. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parsers/claude_code_messages_api_parser.py +0 -0
  206. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parsers/httpx_api_parser.py +0 -0
  207. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parsers/mcp_api_parser.py +0 -0
  208. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parsers/requests_api_parser.py +0 -0
  209. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parsers/sse_utils.py +0 -0
  210. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/api_parsers/urllib3_api_parser.py +0 -0
  211. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/apply_monkey_patches.py +0 -0
  212. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/async_streaming.py +0 -0
  213. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/endpoint_whitelist.py +0 -0
  214. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/__init__.py +0 -0
  215. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/adk_patch.py +0 -0
  216. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/aiohttp_patch.py +0 -0
  217. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/claude_sdk_patch.py +0 -0
  218. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/httpx_patch.py +0 -0
  219. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/langchain_patch.py +0 -0
  220. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/mcp_patches.py +0 -0
  221. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/openai_agents_patch.py +0 -0
  222. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/requests_patch.py +0 -0
  223. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patches/urllib3_patch.py +0 -0
  224. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/patching_utils.py +0 -0
  225. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/to_show_filters.py +0 -0
  226. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/monkey_patching/tool_trace_utils.py +0 -0
  227. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/priors.py +0 -0
  228. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/public.py +0 -0
  229. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/request_mutation.py +0 -0
  230. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/run_log_capture.py +0 -0
  231. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/runner/runtime_client.py +0 -0
  232. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/__init__.py +0 -0
  233. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/annotation_backend/__init__.py +0 -0
  234. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/annotation_backend/annotation.py +0 -0
  235. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/annotation_backend/annotation_agent/__init__.py +0 -0
  236. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/annotation_backend/annotation_agent/tools.py +0 -0
  237. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/annotation_backend/annotation_agent/trace_store.py +0 -0
  238. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/annotation_backend/annotation_focus.py +0 -0
  239. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/annotation_backend/chunk_index.py +0 -0
  240. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/annotation_backend/classifier.py +0 -0
  241. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/annotation_backend/close_traces.py +0 -0
  242. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/annotation_backend/distance_index.py +0 -0
  243. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/annotation_backend/screening_summary.py +0 -0
  244. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/annotation_backend/utils.py +0 -0
  245. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/__init__.py +0 -0
  246. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/agent.py +0 -0
  247. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/cancel.py +0 -0
  248. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/compaction.py +0 -0
  249. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/content_blocks.py +0 -0
  250. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/content_utils.py +0 -0
  251. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/llm_settings.py +0 -0
  252. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/step_content_view.py +0 -0
  253. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/step_ids.py +0 -0
  254. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/tools/__init__.py +0 -0
  255. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/tools/annotation.py +0 -0
  256. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/tools/ask_step.py +0 -0
  257. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/tools/content_unit.py +0 -0
  258. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/tools/graph.py +0 -0
  259. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/tools/ids.py +0 -0
  260. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/tools/priors.py +0 -0
  261. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/tools/registry.py +0 -0
  262. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/tools/run_logs.py +0 -0
  263. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/tools/step_overview.py +0 -0
  264. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/tools/step_snapshot.py +0 -0
  265. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/tools/trace.py +0 -0
  266. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/tools/trace_search.py +0 -0
  267. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/tools/trace_summary.py +0 -0
  268. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/base_agent/trace.py +0 -0
  269. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/__init__.py +0 -0
  270. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/_shared.py +0 -0
  271. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/blob_storage.py +0 -0
  272. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/llm_calls.py +0 -0
  273. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/manager.py +0 -0
  274. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/mongodb/__init__.py +0 -0
  275. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/mongodb/prior_embeddings.py +0 -0
  276. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/postgresql/__init__.py +0 -0
  277. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/postgresql/connection.py +0 -0
  278. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/prior_models.py +0 -0
  279. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/prior_record.py +0 -0
  280. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/priors.py +0 -0
  281. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/projects.py +0 -0
  282. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/runs.py +0 -0
  283. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/sqlite/__init__.py +0 -0
  284. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/sqlite/llm_calls.py +0 -0
  285. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/sqlite/prior_embeddings.py +0 -0
  286. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/sqlite/prior_records.py +0 -0
  287. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/sqlite/priors.py +0 -0
  288. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/sqlite/projects.py +0 -0
  289. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/database/sqlite/runs.py +0 -0
  290. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/graph_analysis/inference_server.py +0 -0
  291. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/graph_analysis/trace_chat/__init__.py +0 -0
  292. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/graph_analysis/trace_chat/main.py +0 -0
  293. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/graph_models.py +0 -0
  294. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/handlers/__init__.py +0 -0
  295. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/handlers/cli_handlers.py +0 -0
  296. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/handlers/handler_utils.py +0 -0
  297. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/handlers/runner_handlers.py +0 -0
  298. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/llm_backend.py +0 -0
  299. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/llm_provider_catalog.py +0 -0
  300. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/llm_settings_verification.py +0 -0
  301. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/package_version.py +0 -0
  302. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/prior_display.py +0 -0
  303. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/__init__.py +0 -0
  304. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/constants.py +0 -0
  305. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/embeddings.py +0 -0
  306. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/__init__.py +0 -0
  307. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/folder_rebalancer.py +0 -0
  308. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/lesson_restructurer.py +0 -0
  309. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/lesson_retriever.py +0 -0
  310. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/lesson_summarizer.py +0 -0
  311. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/llm/prior_metadata_suggester.py +0 -0
  312. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/llm_client.py +0 -0
  313. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/logger.py +0 -0
  314. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/path_utils.py +0 -0
  315. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/storage.py +0 -0
  316. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/adjudication.py +0 -0
  317. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/bm25_search.py +0 -0
  318. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/dense_search.py +0 -0
  319. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/folder_groups.py +0 -0
  320. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/keyword_search.py +0 -0
  321. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/parallel_search.py +0 -0
  322. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/preprocess_context.py +0 -0
  323. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/rerank.py +0 -0
  324. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_backend/tools/utils.py +0 -0
  325. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/priors_scope.py +0 -0
  326. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/routes/__init__.py +0 -0
  327. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/routes/events.py +0 -0
  328. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/routes/internal.py +0 -0
  329. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/routes/ui_common.py +0 -0
  330. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/routes/ui_projects.py +0 -0
  331. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/routes/ui_trace_chat.py +0 -0
  332. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/runtime_preparation.py +0 -0
  333. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/services/__init__.py +0 -0
  334. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/services/annotation_focus_service.py +0 -0
  335. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/services/embedding_sources.py +0 -0
  336. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/services/llm_call_embeddings.py +0 -0
  337. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/services/session_io_summary.py +0 -0
  338. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/third_party_model_catalog.py +0 -0
  339. {sovara-0.3.0 → sovara-0.3.2}/src/sovara/server/web_app_assets.py +0 -0
  340. {sovara-0.3.0 → sovara-0.3.2}/src/sovara.egg-info/dependency_links.txt +0 -0
  341. {sovara-0.3.0 → sovara-0.3.2}/src/sovara.egg-info/requires.txt +0 -0
  342. {sovara-0.3.0 → sovara-0.3.2}/src/sovara.egg-info/top_level.txt +0 -0
  343. {sovara-0.3.0 → sovara-0.3.2}/tests/test_graph_payloads.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sovara
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: A development tool for agent observability, benchmarking, and optimization via domain knowledge
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -129,6 +129,15 @@ That copies the skill to `.claude/skills/sovara/` under the selected project. Re
129
129
 
130
130
  Use Sovara in Claude Code by letting Claude invoke the skill automatically when relevant, or select it directly from the skill menu if needed.
131
131
 
132
+ To record Claude Code itself as a Sovara run, launch it through `so-claude`:
133
+
134
+ ```bash
135
+ so-claude
136
+ so-claude -p "summarize this repo"
137
+ ```
138
+
139
+ `so-claude` starts a normal Claude Code session, routes its Anthropic API calls through Sovara, and records Claude Code model/tool activity in the run graph. It currently supports standard Anthropic API routing through `ANTHROPIC_BASE_URL`; Bedrock and Vertex Claude Code modes are not supported yet.
140
+
132
141
  If you want both integrations installed globally in one step, run:
133
142
 
134
143
  ```bash
@@ -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", "web_app/**/*"]
8
+ "sovara.assets" = ["SKILL.md", "default_runs.sqlite", "web_app/**/*"]
9
9
  "sovara.common" = ["*.json"]
10
10
 
11
11
  [tool.setuptools]
@@ -18,6 +18,7 @@ include = ["sovara*"]
18
18
  [project.scripts]
19
19
  # Console commands for the Sovara package
20
20
  so-record = "sovara.cli.so_record:main"
21
+ so-claude = "sovara.cli.so_claude:main"
21
22
  so-config = "sovara.cli.so_config:main"
22
23
  so-server = "sovara.cli.so_server:main"
23
24
  so-cli = "sovara.cli.so_tool:main"
@@ -27,7 +28,7 @@ line-length = 100
27
28
 
28
29
  [project]
29
30
  name = "sovara"
30
- version = "0.3.0"
31
+ version = "0.3.2"
31
32
  description = "A development tool for agent observability, benchmarking, and optimization via domain knowledge"
32
33
  readme = "docs/release/PYPI_DESC.md"
33
34
  requires-python = ">=3.10"
@@ -476,7 +476,7 @@ The ideal prior has three properties:
476
476
  2. generalizes well to other scenarios where the same problem could occur in a slightly different way
477
477
  3. and it does not conflict with other existing priors.
478
478
 
479
- Good priors are actionable, concise, self-contained, specific, generalizable, faithful to the lesson, retrieval-friendly, and non-conflicting. If a prior captures the right lesson but is verbose, vague, overly run-specific, or hard to scan, polish it before saving or updating it. In the UI, use the **Polish** action in the content editor. From the CLI, use `so-cli priors polish <prior_id>` to get a non-mutating polished content proposal.
479
+ Good priors are actionable, concise, self-contained, precise, well-scoped, faithful to the lesson, retrieval-friendly, and non-conflicting. Use the broadest reusable formulation that still addresses the issue, while including the conditions or exceptions needed to avoid causing mistakes in cases where the rule should not apply. If a prior captures the right lesson but is verbose, vague, overly run-specific, or hard to scan, polish it before saving or updating it. In the UI, use the **Polish** action in the content editor. From the CLI, use `so-cli priors polish <prior_id>` to get a non-mutating polished content proposal.
480
480
 
481
481
  Once you have constructed a prior, validate it by recording a fresh run with that prior available and comparing the new trace against the original observations.
482
482
  Once you verified that the prior addresses the problem, retrieve the available priors, and check if you introduced a conflict with another prior. If so, resolve the conflict by iteratively tuning and running the agent with the adapted priors, until you are satisfied.
@@ -0,0 +1,2 @@
1
+ import{S as it,f as rt,h as ke,i as ct,n as ze,e as lt,r,k as ut,l as dt,p as Fe,m as Ke,w as De,c as Ve,s as mt,q as ce,o as ht,j as e,L as pt,d as Qe,t as ft,a as xt}from"./index-FFvomyuN.js";import{c as bt,i as yt,k as gt,l as jt,D as Nt,L as vt,C as Ue,X as Re,a as we,A as Rt}from"./LayoutBreadcrumb-DQfjpJp6.js";import{C as St,E as Ct,F as It,b as We,P as _t,a as Be,f as je,S as At}from"./projectRuns-B4uZ9L5w.js";import{a as kt,u as wt,p as Pt,R as Ot}from"./useRunViewLayout-Db3uX16H.js";import{u as Tt,R as Et,T as Mt,a as He,b as Ge}from"./RunTabsHeader-BFdSaCHq.js";import{E as Pe}from"./eye-BRRCRKsr.js";import{T as Ye}from"./trash-2-BiGQZCMf.js";import{L as Lt}from"./prismTheme-DRzlLkhr.js";import"./tierState-DObTMUxC.js";import"./api-BHNyGAe0.js";import"./value-BlJoDf9S.js";import"./plus-StJOlCLf.js";var qt=class extends it{#t;#s=void 0;#e;#n;constructor(t,n){super(),this.#t=t,this.setOptions(n),this.bindMethods(),this.#a()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(t){const n=this.options;this.options=this.#t.defaultMutationOptions(t),rt(this.options,n)||this.#t.getMutationCache().notify({type:"observerOptionsUpdated",mutation:this.#e,observer:this}),n?.mutationKey&&this.options.mutationKey&&ke(n.mutationKey)!==ke(this.options.mutationKey)?this.reset():this.#e?.state.status==="pending"&&this.#e.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#e?.removeObserver(this)}onMutationUpdate(t){this.#a(),this.#o(t)}getCurrentResult(){return this.#s}reset(){this.#e?.removeObserver(this),this.#e=void 0,this.#a(),this.#o()}mutate(t,n){return this.#n=n,this.#e?.removeObserver(this),this.#e=this.#t.getMutationCache().build(this.#t,this.options),this.#e.addObserver(this),this.#e.execute(t)}#a(){const t=this.#e?.state??ct();this.#s={...t,isPending:t.status==="pending",isSuccess:t.status==="success",isError:t.status==="error",isIdle:t.status==="idle",mutate:this.mutate,reset:this.reset}}#o(t){ze.batch(()=>{if(this.#n&&this.hasListeners()){const n=this.#s.variables,a=this.#s.context,i={client:this.#t,meta:this.options.meta,mutationKey:this.options.mutationKey};if(t?.type==="success"){try{this.#n.onSuccess?.(t.data,n,a,i)}catch(o){Promise.reject(o)}try{this.#n.onSettled?.(t.data,null,n,a,i)}catch(o){Promise.reject(o)}}else if(t?.type==="error"){try{this.#n.onError?.(t.error,n,a,i)}catch(o){Promise.reject(o)}try{this.#n.onSettled?.(void 0,t.error,n,a,i)}catch(o){Promise.reject(o)}}}this.listeners.forEach(n=>{n(this.#s)})})}};function Se(t,n){const a=lt(),[i]=r.useState(()=>new qt(a,t));r.useEffect(()=>{i.setOptions(t)},[i,t]);const o=r.useSyncExternalStore(r.useCallback(p=>i.subscribe(ze.batchCalls(p)),[i]),()=>i.getCurrentResult(),()=>i.getCurrentResult()),y=r.useCallback((p,d)=>{i.mutate(p,d).catch(ut)},[i]);if(o.error&&dt(i.options.throwOnError,[o.error]))throw o.error;return{...o,mutate:y,mutateAsync:o.mutate}}const $t=[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]],zt=bt("arrow-left",$t);async function Ft(t,n,a){return Ke(De(`/ui/projects/${t}/annotations/queue`,{dir:n.dir,limit:n.limit,offset:n.offset,sort:n.sort}),{signal:a})}async function Kt(t,n,a){return Ke(De(`/ui/projects/${t}/annotations/annotated`,{dir:n.dir,limit:n.limit,offset:n.offset,sort:n.sort}),{signal:a})}async function Dt(t,n){return Fe(`/ui/run/${encodeURIComponent(t)}/annotation`,n)}async function Xe(t){return Fe(`/ui/run/${encodeURIComponent(t)}/annotation/dismiss`,{})}function Vt(t,n){return{enabled:!!t,queryFn:({signal:a})=>Ft(t??"",n,a),queryKey:ce.annotations.queue(t??"",n)}}function Qt(t,n){return{enabled:!!t,queryFn:({signal:a})=>Kt(t??"",n,a),queryKey:ce.annotations.annotated(t??"",n)}}function Ut(t,n){return Ve(Vt(t,n))}function Wt(t,n){return Ve(Qt(t,n))}function ue(t){if(!t)return;const n=ht();n.invalidateQueries({queryKey:ce.annotations.project(t)}),n.invalidateQueries({queryKey:ce.projectRuns.listPrefix(t)})}function Bt(t){r.useEffect(()=>{if(t)return mt("annotation_list_changed",n=>{n.project_id===t&&ue(t)})},[t])}function Ht(t){return Se({mutationFn:({runId:n,payload:a})=>Dt(n,a),onSuccess:()=>ue(t)})}function Gt(t){return Se({mutationFn:n=>Xe(n),onSuccess:()=>ue(t)})}function Yt(t){return Se({mutationFn:n=>Promise.all(n.map(a=>Xe(a))),onSuccess:()=>ue(t)})}const Ne=["embedding","ultra_helper","helper","primary"],Xt={primary:"Smart Primary Model",helper:"Fast Helper Model",ultra_helper:"Ultra-Fast Helper Model",embedding:"Embedding Model",reranker:"Reranker Model"};function Jt(t){return t===void 0?null:t?Ne.filter(n=>t.llm_settings[n]?.verified!==!0):[...Ne]}function Zt(t){const n=t.map(a=>Xt[a]);return n.length<=1?n[0]??"":typeof Intl<"u"&&"ListFormat"in Intl?new Intl.ListFormat("en",{style:"long",type:"conjunction"}).format(n):`${n.slice(0,-1).join(", ")} and ${n[n.length-1]}`}const en=Zt(Ne);function tn({projectId:t,user:n}){if(!t)return null;const a=Jt(n);return a===null||a.length===0?null:e.jsxs("div",{className:"run-prior-setup-warning annotation-recommendation-setup-warning",role:"alert",children:[e.jsx("div",{className:"run-prior-setup-warning-title",children:"Annotation recommendations need model setup"}),e.jsxs("div",{className:"run-prior-setup-warning-copy",children:["Sovara's annotation recommendation system needs the ",en," to work."]}),e.jsx("div",{className:"run-prior-setup-warning-actions",children:e.jsx(pt,{className:"run-prior-setup-warning-link primary",to:`/project/${t}/settings#models`,children:"Configure models"})})]})}const Oe=10,Te=[],le=12,nn=420,ye=420,sn=10,ve="active",Ce="runs",an="sovara.annotationViewState",on=["Hey, I'm SovaraChat, the chat assistant inside Sovara. I'm here to help you annotate this run!","","Use me to:","- understand what the agent did","- find where the failure is, if there is one","- decide the correct label and ground truth","- ask me to annotate this sample with the ground truth and label you provide","","Start by asking me what to look at first."].join(`
2
+ `),rn="What should I look at first?",cn=[{key:"label",label:"Label",kinds:["annotated"]},{key:"priority",label:"Priority",kinds:["queue"]},{key:"sessionInput",label:"Input"},{key:"sessionOutput",label:"Output"},{key:"timestamp",label:"Start Time"},{key:"name",label:"Run Name"}],ln={repeated_failure:{tag_id:"annotation-priority-repeated-failure",name:"Repeated failure",color:"#7f1d1d"},unresolved_failure_risk:{tag_id:"annotation-priority-unresolved-failure-risk",name:"Failure risk",color:"#dc2626"},novel_behavior:{tag_id:"annotation-priority-novel-behavior",name:"Novel behavior",color:"#f59e0b"},partially_covered:{tag_id:"annotation-priority-partially-covered",name:"Partially covered",color:"#86efac"},covered_by_success:{tag_id:"annotation-priority-covered-by-success",name:"Covered",color:"#94a3b8"}};function un(t){const n=new Set,a=[];for(const i of(t.get(Ce)??"").split(",")){const o=i.trim();!o||n.has(o)||(n.add(o),a.push(o))}return a}function ge(t,n){const a=new URLSearchParams;t.length>0&&a.set(Ce,t.join(",")),n&&t.includes(n)&&a.set(ve,n);const i=a.toString();return i?`?${i}`:""}function dn(t){return t?`${an}.${t}`:null}function mn(t){if(!Array.isArray(t))return[];const n=new Set,a=[];for(const i of t){if(typeof i!="string")continue;const o=i.trim();!o||n.has(o)||(n.add(o),a.push(o))}return a}function hn(t){try{const n=window.localStorage.getItem(t);if(!n)return null;const a=JSON.parse(n),i=mn(a.runIds),o=typeof a.activeRunId=="string"&&i.includes(a.activeRunId)?a.activeRunId:null,y=typeof a.selectedRunId=="string"&&a.selectedRunId.trim()?a.selectedRunId.trim():null,p=a.selectedKind==="annotated"||a.selectedKind==="queue"?a.selectedKind:null;return{activeRunId:o,runIds:i,selectedKind:p,selectedRunId:y}}catch{return null}}function Ee(t,n){try{window.localStorage.setItem(t,JSON.stringify(n))}catch{}}function Ie(t){return t==="queue"?"Remove from annotation queue":"Remove from annotated set"}function Me(){return{labels:new Set,query:""}}function pn(t,n){return!!(t.query.trim()||n==="annotated"&&t.labels.size>0)}function fn(t,n,a){const i=n.query.trim().toLowerCase();return!(i&&![t.run_id,t.name,t.session_input_summary,t.session_output_summary].filter(Boolean).join(" ").toLowerCase().includes(i)||a==="annotated"&&n.labels.size>0&&(!t.label||!n.labels.has(t.label)))}function Le({fallback:t,summary:n}){const a=je(n),i=n?.trim()||t?.trim()||void 0;return e.jsx("td",{className:"cell-session-summary",title:i,children:a})}function xn({row:t}){return t.label==="success"?e.jsx("span",{className:"metric-badge success",children:e.jsx(He,{size:le})}):t.label==="failure"?e.jsx("span",{className:"metric-badge fail",children:e.jsx(Ge,{size:le})}):"—"}function bn({decisionBasis:t,status:n}){if(n)return e.jsx("span",{"aria-label":n==="reevaluating"?"Priority is being re-evaluated":"Priority is being evaluated",className:"annotation-priority-loading",role:"status",title:n==="reevaluating"?"Priority is being re-evaluated":"Priority is being evaluated",children:e.jsx(Lt,{size:14,className:"fa-spinner"})});if(!t)return e.jsx("span",{className:"annotation-priority-empty",children:"—"});const a=ln[t];return a?e.jsx(Mt,{tag:a,size:"small"}):e.jsx("span",{className:"annotation-priority-empty",children:"—"})}function yn({bulkActionPending:t,kind:n,openRunCount:a,onDismissSelected:i,onOpenSelectedRuns:o}){return e.jsxs("div",{className:"actions-dropdown-menu annotation-actions-menu",children:[e.jsxs("button",{className:"actions-dropdown-item",onClick:o,children:[e.jsx(Be,{size:13}),a===1?"Inspect Run":"Inspect Runs"]}),i&&e.jsxs("button",{className:"actions-dropdown-item actions-dropdown-item-danger",disabled:t,onClick:i,children:[e.jsx(Ye,{size:13}),t?"Removing...":Ie(n)]})]})}function gn({bulkActionPending:t,kind:n,openRunCount:a,onDismissRuns:i,onOpenRuns:o,style:y}){return e.jsxs("div",{className:"actions-dropdown-menu actions-context-menu annotation-actions-menu",style:y,children:[e.jsxs("button",{className:"actions-dropdown-item",onClick:o,children:[e.jsx(Be,{size:13}),a===1?"Inspect Run":"Inspect Runs"]}),i&&e.jsxs("button",{className:"actions-dropdown-item actions-dropdown-item-danger",disabled:t,onClick:i,children:[e.jsx(Ye,{size:13}),t?"Removing...":Ie(n)]})]})}function jn({filters:t,kind:n,onChange:a,onClose:i,onReset:o,open:y}){if(!y)return null;const p=d=>{const f=new Set(t.labels);f.has(d)?f.delete(d):f.add(d),a({...t,labels:f})};return e.jsx("div",{className:"modal-overlay filters-modal-overlay",onClick:i,children:e.jsxs("div",{className:"modal annotation-filters-modal",onClick:d=>d.stopPropagation(),children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h2",{className:"modal-title",children:n==="queue"?"Runs to Annotate Filters":"Already Annotated Filters"}),e.jsx("button",{className:"modal-close",onClick:i,children:e.jsx(Re,{size:16})})]}),e.jsxs("div",{className:"annotation-filter-form",children:[e.jsxs("label",{className:"annotation-filter-field",children:[e.jsx("span",{children:"Search"}),e.jsx("input",{className:"annotation-filter-input",value:t.query,onChange:d=>a({...t,query:d.target.value}),placeholder:"Name, run id, input, or output"})]}),n==="annotated"&&e.jsxs("div",{className:"annotation-filter-field",children:[e.jsx("span",{children:"Label"}),e.jsxs("label",{className:"annotation-filter-check-row",children:[e.jsx("input",{type:"checkbox",checked:t.labels.has("success"),onChange:()=>p("success")}),"Success"]}),e.jsxs("label",{className:"annotation-filter-check-row",children:[e.jsx("input",{type:"checkbox",checked:t.labels.has("failure"),onChange:()=>p("failure")}),"Failure"]})]})]}),e.jsxs("div",{className:"annotation-filter-actions",children:[e.jsx("button",{className:"annotation-secondary-btn",type:"button",onClick:o,children:"Reset"}),e.jsx("button",{className:"annotation-primary-btn",type:"button",onClick:i,children:"Done"})]})]})})}function qe({onRunCitationClick:t,onStepCitationClick:n,runCitations:a,stepCitations:i,text:o}){const y=new Map((i??[]).map(u=>[u.id,u])),p=new Map((a??[]).map(u=>[u.id,u])),d=o.split(/(\[(?:s|r)[1-9]\d*\])/g),f=u=>`Step ${u.step_id}`,_=u=>`Run ${u.id.replace(/^r/,"")}`;return e.jsx(e.Fragment,{children:d.map((u,R)=>{const M=u.match(/^\[((?:s|r)[1-9]\d*)\]$/);if(!M)return e.jsx("span",{children:u},`${R}-text`);const g=M[1];if(g.startsWith("s")){const N=y.get(g);return N&&n?e.jsx("button",{type:"button",className:"annotation-citation",title:`Inspect ${f(N)}`,onClick:()=>n(N),children:f(N)},`${R}-${u}`):e.jsx("span",{className:"annotation-citation",title:N?`Step ${N.step_id}`:u,children:N?f(N):u},`${R}-${u}`)}const j=p.get(g);return j&&t?e.jsx("button",{type:"button",className:"annotation-citation",title:`Inspect ${j.label} reference run`,onClick:()=>t(j),children:_(j)},`${R}-${u}`):e.jsx("span",{className:"annotation-citation",title:j?`Inspect ${j.label} reference run`:u,children:j?_(j):u},`${R}-${u}`)})})}function $e({activeRunId:t,beforeHeader:n,bulkActionPending:a,currentPage:i,kind:o,loading:y,onDismissRuns:p,onOpenRuns:d,onPageChange:f,onRowsPerPageChange:_,onSelect:u,rows:R,rowsPerPage:M,total:g}){const j=r.useMemo(()=>cn.filter(s=>!s.kinds||s.kinds.includes(o)),[o]),[N,C]=r.useState(!1),[V,$]=r.useState(!1),[Q,z]=r.useState(!1),[T,J]=r.useState(()=>Me()),[A,F]=r.useState(()=>new Set),[k,K]=r.useState({open:!1,x:0,y:0,targetIds:[]}),[v,L]=r.useState(()=>new Set(j.map(s=>s.key))),w=r.useRef(null),b=r.useRef(null),U=r.useRef(null),ne=Math.max(1,Math.ceil(g/M)),Z=pn(T,o),S=r.useMemo(()=>R.filter(s=>fn(s,T,o)),[T,o,R]),B=r.useMemo(()=>Array.from(A),[A]),W=r.useMemo(()=>S.map(s=>s.run_id),[S]),de=r.useMemo(()=>new Set(W),[W]),E=A.size,me=B.filter(s=>!de.has(s)).length,se=j.every(s=>v.has(s.key)),ee=W.length>0&&W.every(s=>A.has(s)),re=Z?`${S.length} of ${R.length} on page`:`${g} total`,ae=1+j.filter(s=>v.has(s.key)).length,I=s=>v.has(s);r.useEffect(()=>{if(!N)return;const s=c=>{w.current&&!w.current.contains(c.target)&&C(!1)};return document.addEventListener("mousedown",s),()=>document.removeEventListener("mousedown",s)},[N]),r.useEffect(()=>{if(!V)return;const s=c=>{b.current&&!b.current.contains(c.target)&&$(!1)};return document.addEventListener("mousedown",s),()=>document.removeEventListener("mousedown",s)},[V]),r.useEffect(()=>{if(!k.open)return;const s=()=>{K({open:!1,x:0,y:0,targetIds:[]})},c=Y=>{U.current&&!U.current.contains(Y.target)&&s()},h=Y=>{Y.key==="Escape"&&s()};return document.addEventListener("mousedown",c),document.addEventListener("keydown",h),()=>{document.removeEventListener("mousedown",c),document.removeEventListener("keydown",h)}},[k.open]);const H=(s,c)=>{s.target===s.currentTarget&&(s.key!=="Enter"&&s.key!==" "||(s.preventDefault(),u(c,o)))},G=(s,c)=>{s.preventDefault(),s.stopPropagation(),C(!1),$(!1),z(!1),u(c,o),K({open:!0,x:s.clientX,y:s.clientY,targetIds:A.has(c.run_id)?Array.from(A):[c.run_id]})},te=s=>{F(c=>{const h=new Set(c);return h.has(s)?h.delete(s):h.add(s),h})},P=()=>{F(s=>{const c=new Set(s);return ee?W.forEach(h=>c.delete(h)):W.forEach(h=>c.add(h)),c})},q=s=>{L(c=>{const h=new Set(c);return h.has(s)?h.delete(s):h.add(s),h})},D=()=>{B.length!==0&&(C(!1),d(B))},oe=()=>{!p||B.length===0||(C(!1),p(B,o).then(()=>F(new Set)).catch(s=>{const c=s instanceof Error?s.message:"Failed to remove selected runs.";window.alert(c)}))},he=()=>{if(k.targetIds.length===0)return;const s=k.targetIds;K({open:!1,x:0,y:0,targetIds:[]}),d(s)},pe=()=>{if(!p||k.targetIds.length===0)return;const s=k.targetIds;K({open:!1,x:0,y:0,targetIds:[]}),p(s,o).then(()=>{F(c=>{const h=new Set(c);return s.forEach(Y=>h.delete(Y)),h})}).catch(c=>{const h=c instanceof Error?c.message:"Failed to remove selected runs.";window.alert(h)})};return e.jsxs("section",{className:"runs-section annotation-list-section",children:[n,e.jsxs("div",{className:"landing-section-title annotation-list-title-row",children:[e.jsxs("span",{children:[o==="queue"?"Runs to annotate":"Already annotated"," (",re,")"]}),E>0&&e.jsxs("div",{className:"runs-selection-pill",title:me>0?`${E} selected across pages or filters`:`${E} selected`,children:[e.jsxs("span",{className:"runs-selection-pill-summary",children:[e.jsx(Ue,{size:11}),e.jsx("span",{children:E})]}),e.jsx("button",{className:"runs-selection-pill-clear",onClick:()=>F(new Set),title:"Clear selection",children:e.jsx(Re,{size:11})})]}),e.jsx("div",{className:"annotation-list-toolbar-spacer"}),e.jsxs("div",{className:"actions-dropdown-wrap",ref:b,children:[e.jsxs("button",{className:"actions-dropdown-btn",onClick:()=>{C(!1),z(!1),K({open:!1,x:0,y:0,targetIds:[]}),$(s=>!s)},children:["Columns",e.jsx(Pe,{size:12}),e.jsx(we,{size:12,className:`actions-chevron${V?" rotated":""}`})]}),V&&e.jsxs("div",{className:"actions-dropdown-menu columns-dropdown-menu",children:[e.jsxs("button",{className:"actions-dropdown-item",onClick:()=>L(new Set(j.map(s=>s.key))),children:[e.jsx(St,{size:13}),se?"All columns shown":"Select all"]}),j.map(s=>e.jsxs("button",{className:"actions-dropdown-item",onClick:()=>q(s.key),children:[e.jsx("span",{className:"columns-dropdown-check",children:v.has(s.key)?e.jsx(Pe,{size:13}):e.jsx(Ct,{size:13})}),s.label]},s.key))]})]}),e.jsx("button",{className:`toolbar-icon-btn${Q?" toolbar-icon-btn-open":""}${Z?" toolbar-icon-btn-active":""}`,onClick:()=>{C(!1),$(!1),K({open:!1,x:0,y:0,targetIds:[]}),z(s=>!s)},title:"Filters","aria-label":"Open filters",children:e.jsx(It,{size:14})}),e.jsxs("div",{className:"actions-dropdown-wrap",ref:w,children:[e.jsxs("button",{className:`actions-dropdown-btn${E===0?" actions-inactive":""}`,onClick:()=>{$(!1),z(!1),K({open:!1,x:0,y:0,targetIds:[]}),E>0&&C(s=>!s)},children:[`Actions (${E})`,e.jsx(we,{size:12,className:`actions-chevron${N?" rotated":""}`})]}),N&&E>0&&e.jsx(yn,{bulkActionPending:a,kind:o,openRunCount:E,onDismissSelected:p?oe:void 0,onOpenSelectedRuns:D})]})]}),e.jsx("div",{className:"runs-section-scroll annotation-list-table-wrap",children:e.jsxs("table",{className:"runs-table annotation-runs-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{className:"cell-checkbox",children:e.jsx("input",{type:"checkbox",checked:ee,disabled:W.length===0,onChange:P})}),I("priority")&&e.jsx("th",{children:"Priority"}),I("label")&&e.jsx("th",{children:"Label"}),I("sessionInput")&&e.jsx("th",{children:"Input"}),I("sessionOutput")&&e.jsx("th",{children:"Output"}),I("timestamp")&&e.jsx("th",{children:"Start Time"}),I("name")&&e.jsx("th",{children:"Run Name"})]})}),e.jsx("tbody",{children:y?e.jsx("tr",{children:e.jsx("td",{colSpan:ae,children:"Loading..."})}):S.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:ae})}):S.map(s=>e.jsxs("tr",{className:`clickable-row${A.has(s.run_id)?" row-selected":""}${s.run_id===t?" annotation-row-active":""}`,onClick:()=>u(s,o),onContextMenu:c=>G(c,s),onKeyDown:c=>H(c,s),tabIndex:0,role:"link","aria-label":`Select run ${s.name||s.run_id}`,children:[e.jsx("td",{className:"cell-checkbox",onClick:c=>c.stopPropagation(),children:e.jsx("input",{type:"checkbox",checked:A.has(s.run_id),onChange:()=>te(s.run_id),"aria-label":`Select ${s.name||s.run_id}`})}),I("priority")&&e.jsx("td",{className:"cell-priority",children:e.jsx(bn,{decisionBasis:s.decision_basis,status:s.annotation_agent_status})}),I("label")&&e.jsx("td",{className:"cell-metric",children:e.jsx(xn,{row:s})}),I("sessionInput")&&e.jsx(Le,{fallback:s.name,summary:s.session_input_summary}),I("sessionOutput")&&e.jsx(Le,{fallback:s.name,summary:s.session_output_summary}),I("timestamp")&&e.jsx("td",{className:"cell-timestamp",children:We(s.timestamp)}),I("name")&&e.jsx("td",{className:"annotation-run-name-cell",title:s.name||s.run_id,children:s.name||s.run_id.slice(0,8)})]},s.run_id))})]})}),e.jsx(_t,{currentPage:i,rowsPerPage:M,setCurrentPage:f,setRowsPerPage:_,totalPages:ne}),k.open&&e.jsx("div",{ref:U,children:e.jsx(gn,{bulkActionPending:a,kind:o,openRunCount:k.targetIds.length,onDismissRuns:p?pe:void 0,onOpenRuns:he,style:{top:k.y,left:k.x}})}),e.jsx(jn,{filters:T,kind:o,onChange:J,onClose:()=>z(!1),onReset:()=>J(Me()),open:Q})]})}function Nn({dismissing:t,kind:n,onDismiss:a,onInspectRunCitation:i,onInspectRun:o,onInspectStepCitation:y,onSave:p,row:d,saving:f}){const[_,u]=r.useState(d.label??null),[R,M]=r.useState(d.groundtruth??""),g=d.annotation_agent_decision,j=g?.why_annotate||"No annotation recommendation is available.",N=g?.annotator_hint||"Inspect this run to review the trace.",C=d.decision_basis==="covered_by_success"?"We don't think you need to annotate this, but this could be helpful if you do:":"Why we think you should annotate this:",V=je(d.session_input_summary),$=je(d.session_output_summary),Q=_!==(d.label??null),z=R!==(d.groundtruth??""),T=Q||z,J=!!(T&&_&&(_==="success"||R.trim())),A=()=>{u(d.label??null),M(d.groundtruth??"")};return e.jsxs("div",{className:"annotation-editor",children:[e.jsxs("div",{className:"annotation-editor-header",children:[e.jsxs("div",{className:"annotation-editor-run-meta",children:[e.jsx("div",{className:"annotation-editor-title",children:d.name||d.run_id.slice(0,8)}),e.jsx("div",{className:"annotation-editor-subtitle",children:We(d.timestamp)})]}),e.jsxs("button",{type:"button",className:"annotation-inspect-run-btn",onClick:o,children:[e.jsx(At,{size:12})," Inspect run"]})]}),e.jsxs("div",{className:"annotation-editor-compact-body",children:[e.jsxs("section",{className:"annotation-editor-section annotation-compact-section",children:[e.jsx("div",{className:"annotation-section-label",children:"Input:"}),e.jsx("div",{className:"annotation-field-readonly annotation-text-block",children:V})]}),e.jsxs("section",{className:"annotation-editor-section annotation-compact-section",children:[e.jsx("div",{className:"annotation-section-label",children:"Output:"}),e.jsx("div",{className:"annotation-field-readonly annotation-text-block",children:$})]}),e.jsxs("section",{className:"annotation-editor-section annotation-compact-section",children:[e.jsx("div",{className:"annotation-section-label",children:C}),e.jsx("div",{className:"annotation-recommendation annotation-text-block",children:e.jsx(qe,{text:j,runCitations:g?.run_citations??[],stepCitations:g?.step_citations??[],onRunCitationClick:i,onStepCitationClick:y})})]}),e.jsxs("section",{className:"annotation-editor-section annotation-compact-section",children:[e.jsx("div",{className:"annotation-section-label",children:"Start by looking at:"}),e.jsx("div",{className:"annotation-field-readonly annotation-text-block",children:e.jsx(qe,{text:N,runCitations:g?.run_citations??[],stepCitations:g?.step_citations??[],onRunCitationClick:i,onStepCitationClick:y})})]}),e.jsxs("section",{className:"annotation-editor-section annotation-compact-section",children:[e.jsx("div",{className:"annotation-section-label",children:"Label:"}),e.jsxs("div",{className:"annotation-label-control annotation-body-label-control",children:[e.jsxs("button",{type:"button",className:_==="success"?"active success":"",onClick:()=>u("success"),children:[e.jsx(He,{size:le})," Success"]}),e.jsxs("button",{type:"button",className:_==="failure"?"active failure":"",onClick:()=>u("failure"),children:[e.jsx(Ge,{size:le})," Failure"]})]})]}),e.jsxs("section",{className:"annotation-editor-section annotation-groundtruth-section annotation-compact-section",children:[e.jsx("div",{className:"annotation-section-label",children:"Groundtruth:"}),e.jsx("textarea",{className:"annotation-groundtruth-input",value:R,onChange:F=>M(F.target.value),placeholder:"Required for failure; optional for success."})]}),e.jsxs("div",{className:"annotation-editor-actions",children:[e.jsxs("button",{type:"button",className:"annotation-primary-btn",disabled:!J||f,onClick:()=>_&&p(_,R),children:[e.jsx(Ue,{size:12})," ",f?"Saving...":"Save"]}),T&&e.jsxs("button",{type:"button",className:"annotation-secondary-btn",disabled:f,onClick:A,children:[e.jsx(Re,{size:12})," Cancel"]}),e.jsx("button",{type:"button",className:"annotation-secondary-btn",disabled:t||f,onClick:a,children:t?"Removing...":Ie(n)})]})]})]})}function vn({dismissing:t,kind:n,onDismiss:a,onInspectRunCitation:i,onInspectRun:o,onInspectStepCitation:y,onSave:p,row:d,saving:f}){return d?e.jsx(Nn,{dismissing:t,kind:n,onDismiss:a,onInspectRunCitation:i,onInspectRun:o,onInspectStepCitation:y,onSave:p,row:d,saving:f},d.run_id):e.jsx("div",{className:"annotation-editor-empty",children:e.jsx("div",{className:"empty-state-title",children:"Select a run"})})}function Rn({dismissing:t,kind:n,onDismiss:a,onInspectRunCitation:i,onInspectRun:o,onInspectStepCitation:y,onSave:p,row:d,saving:f}){return e.jsx("div",{className:"annotation-right-panel",children:e.jsx("div",{className:"annotation-right-body",children:e.jsx(vn,{dismissing:t,kind:n,onDismiss:a,onInspectRunCitation:i,onInspectRun:o,onInspectStepCitation:y,onSave:p,row:d,saving:f})})})}function Sn(){const{projectId:t}=Qe(),[n,a]=ft(),{project:i}=yt(t),{user:o}=xt(),{hasDesktopTopBar:y}=gt(),p=kt("inference"),d=r.useRef(null),f=r.useRef(null),_=r.useRef(null),u=r.useRef("pending"),[R,M]=r.useState(null),[g,j]=r.useState(!1),[N,C]=r.useState(null),[V,$]=wt(),[Q,z]=r.useState(1),[T,J]=r.useState(1),[A,F]=r.useState(Oe),[k,K]=r.useState(Oe),v=r.useMemo(()=>dn(t),[t]),L=n.has(Ce)||n.has(ve),w=r.useMemo(()=>!v||L||g?null:hn(v),[v,L,g]),b=r.useMemo(()=>L?un(n):w?.runIds??[],[L,w,n]),[U,ne]=r.useState(()=>w?.selectedRunId?{kind:w.selectedKind??"queue",runId:w.selectedRunId}:null),Z=L?n.get(ve):w?.activeRunId??null,S=Z&&b.includes(Z)?Z:null,B=Tt(b),de=`${`/project/${t}/annotation`}${ge(b,null)}`,E=r.useMemo(()=>({dir:"asc",limit:A,offset:(Q-1)*A,sort:"decision_basis"}),[Q,A]),me=r.useMemo(()=>({dir:"desc",limit:k,offset:(T-1)*k,sort:"updated_at"}),[T,k]),se=Ut(t,E),ee=Wt(t,me);Bt(t);const re=Ht(t),ae=Gt(t),I=Yt(t),H=se.data?.rows??Te,G=ee.data?.rows??Te,te=r.useMemo(()=>[...H,...G],[G,H]),P=U?te.find(l=>l.run_id===U.runId)??null:te[0]??null,q=U?.runId??P?.run_id??null,D=P?P.annotated?"annotated":"queue":U?.kind??"queue",oe=D==="queue"?P?.run_id??null:null,he=r.useCallback(l=>{M(m=>{const x=d.current?.getBoundingClientRect().width??0,O=f.current?.getBoundingClientRect().width,ie=m??O??Math.max(ye,x/2),fe=x>0?Math.max(ye,x-nn-sn):Number.POSITIVE_INFINITY;return Math.min(fe,Math.max(ye,ie+l))})},[]),pe=jt("horizontal",he);r.useEffect(()=>{p.status!=="ready"||!oe||Pt(oe)},[p.status,oe]);const s=r.useCallback((l,m)=>{ne({runId:l.run_id,kind:m})},[]),c=r.useCallback((l,m)=>{j(l.length===0),v&&Ee(v,{activeRunId:m,runIds:l,selectedKind:q?D:null,selectedRunId:q}),a(ge(l,m))},[q,v,D,a]);r.useEffect(()=>{if(_.current!==v&&(_.current=v,u.current="pending"),!(!v||u.current!=="pending")){if(L||g){u.current="ready";return}if(!w){u.current="ready";return}if(w.runIds.length>0){a(ge(w.runIds,w.activeRunId),{replace:!0}),u.current="restored";return}u.current="ready"}},[v,L,w,a,g]),r.useEffect(()=>{if(v&&u.current!=="pending"){if(u.current==="restored"){u.current="ready";return}Ee(v,{activeRunId:S,runIds:b,selectedKind:q?D:null,selectedRunId:q})}},[q,S,v,b,D]);const h=r.useCallback(l=>{if(l.length===0)return;const m=[...b],x=new Set(m);for(const O of l)x.has(O)||(x.add(O),m.push(O));c(m,l[0])},[b,c]),Y=r.useCallback(l=>{C(null),c(b,l)},[b,c]),Je=r.useCallback(l=>{C(null);const m=b.indexOf(l),x=b.filter(ie=>ie!==l);if(x.length===0){c([],null);return}const O=l===S?x[Math.min(Math.max(m,0),x.length-1)]:S;c(x,O)},[S,b,c]),Ze=r.useCallback(l=>{C(null);const m=te.find(x=>x.run_id===l);ne({runId:l,kind:m?.annotated?"annotated":"queue"}),c(b,null)},[te,b,c]),_e=(l,m)=>{const x=new Set(l),O=m==="annotated"?G:H,ie=m==="annotated"?H:G,fe=l[0],xe=O.findIndex(X=>X.run_id===fe),be=(xe>=0?[...O.slice(xe+1),...O.slice(0,xe).reverse()].find(X=>!x.has(X.run_id)):O.find(X=>!x.has(X.run_id)))??ie.find(X=>!x.has(X.run_id))??null;ne(be?{kind:be.annotated?"annotated":"queue",runId:be.run_id}:null)},et=(l,m)=>{const x=P?.run_id;x&&re.mutate({runId:x,payload:{annotated:!0,groundtruth:m.trim()||null,label:l}})},tt=()=>{const l=P?.run_id,m=D;!l||!m||ae.mutate(l,{onSuccess:()=>{_e([l],m)}})},Ae=async(l,m)=>{l.length!==0&&await I.mutateAsync(l,{onSuccess:()=>{P&&l.includes(P.run_id)&&_e(l,m)}})},nt=()=>{P&&(C(null),h([P.run_id]))},st=l=>{const m=l.run_id?.trim()||P?.run_id;m&&(C(x=>({nodeRef:String(l.step_id),requestId:(x?.requestId??0)+1,runId:m})),h([m]))},at=l=>{const m=l.run_id?.trim();m&&(C(null),h([m]))},ot=N?.runId===S?N:null;return e.jsxs("div",{className:"annotation-page",children:[b.length>0?e.jsx(Nt,{children:e.jsx(Et,{activeRunId:S,className:"annotation-inspect-tabs-header",onCloseTab:Je,onSwitchTab:Y,projectId:t,projectName:i?.name??"Project",runIds:b,runIdsKey:b.join(","),sectionBreadcrumb:{label:"Annotation",to:de},tabNames:B,variant:y?"desktop-topbar":"panel"})}):e.jsx(vt,{items:[{label:"Projects",to:"/"},{label:i?.name??"Project",to:`/project/${t}`},{label:"Annotation"}]}),S?e.jsx("div",{className:"run-view annotation-run-inspect-view",children:e.jsx("div",{className:"run-view-panel annotation-run-inspect-panel",children:e.jsx(Ot,{focusRequest:ot,headerLeadingAction:e.jsxs("button",{type:"button",className:"annotation-return-to-editor-btn",onClick:()=>Ze(S),children:[e.jsx(zt,{size:12})," Annotate"]}),layoutState:V,projectId:t,runId:S,setLayoutState:$,traceChatOptions:{composerPlaceholder:rn,includeAnnotationContext:!0,introMessage:on}},S)})}):e.jsxs("div",{ref:d,className:"annotation-workspace",style:R===null?void 0:{gridTemplateColumns:`${R}px var(--annotation-resize-handle-width) minmax(0, 1fr)`},children:[e.jsx("section",{ref:f,className:"annotation-runs-deck",children:e.jsx("div",{className:"annotation-runs-deck-inner",children:e.jsxs("aside",{className:"annotation-left-panel",children:[e.jsx($e,{activeRunId:q,beforeHeader:e.jsx(tn,{projectId:t,user:o}),bulkActionPending:I.isPending,currentPage:Q,kind:"queue",loading:se.isPending,onDismissRuns:Ae,onOpenRuns:h,onPageChange:z,onRowsPerPageChange:F,onSelect:s,rows:H,rowsPerPage:A,total:se.data?.total??0}),e.jsx($e,{activeRunId:q,bulkActionPending:I.isPending,currentPage:T,kind:"annotated",loading:ee.isPending,onDismissRuns:Ae,onOpenRuns:h,onPageChange:J,onRowsPerPageChange:K,onSelect:s,rows:G,rowsPerPage:k,total:ee.data?.total??0})]})})}),e.jsx("div",{className:"resize-handle resize-handle-h resize-handle-panel-boundary annotation-workspace-resize-handle",role:"separator","aria-orientation":"vertical","aria-label":"Resize annotation panels",onMouseDown:pe}),e.jsx("section",{className:"annotation-inspector-column",children:e.jsx("aside",{className:"annotation-inspector-panel annotation-right-section",children:e.jsx(Rn,{dismissing:ae.isPending,kind:D,onDismiss:tt,onInspectRunCitation:at,onInspectRun:nt,onInspectStepCitation:st,onSave:et,row:P,saving:re.isPending},P?.run_id??"annotation-empty")})})]})]})}function $n(){const{projectId:t}=Qe();return e.jsx(Rt,{projectId:t,defaultCollapsed:!0,children:e.jsx(Sn,{})})}export{$n as AnnotationRoute};
@@ -0,0 +1 @@
1
+ .annotation-page{height:100%;min-height:0;display:flex;flex-direction:column;background:var(--color-bg)}.annotation-workspace{--annotation-resize-handle-width: 10px;flex:1;min-height:0;display:grid;grid-template-columns:minmax(0,1fr) var(--annotation-resize-handle-width) minmax(0,1fr);border-top:1px solid var(--color-border)}.annotation-inspector-column,.annotation-inspector-panel,.annotation-runs-deck,.annotation-runs-deck-inner,.annotation-left-panel{min-height:0;min-width:0;overflow:hidden}.annotation-inspector-column{grid-column:3;display:flex;padding:8px;background:var(--color-surface)}.annotation-left-panel{height:100%;display:grid;grid-template-rows:minmax(0,1fr) minmax(0,1fr);gap:8px;background:transparent}.annotation-workspace-resize-handle{grid-column:2;grid-row:1 / -1;align-self:stretch;justify-self:stretch;width:var(--annotation-resize-handle-width);background-color:var(--color-surface)}.annotation-workspace-resize-handle:hover,.annotation-workspace-resize-handle:active{background-color:var(--color-surface)}.annotation-workspace-resize-handle:before{left:50%;transform:translate(-50%)}.annotation-runs-deck{grid-column:1;display:flex;padding:8px;background:var(--color-surface)}.annotation-runs-deck-inner{position:relative;flex:1}.annotation-right-section{min-height:0;border:1px solid var(--color-border);border-radius:8px;overflow:hidden;background:var(--color-bg)}.annotation-inspector-panel{flex:1}.annotation-list-section{min-height:0;background:var(--color-bg)}.annotation-recommendation-setup-warning{margin:0 0 8px}.annotation-inspect-tabs-header.run-view-panel-header-topbar{overflow:hidden}.annotation-inspect-tabs-header .run-tabs{flex:0 1 520px;min-width:min(240px,45%);max-width:520px}.annotation-inspect-tabs-header .run-tab{flex:0 1 240px;min-width:min(180px,100%);max-width:280px}.annotation-inspect-tabs-header .run-tab-close{opacity:1}.annotation-run-inspect-view{border-top:0}.annotation-run-inspect-panel{border-right:0;border-bottom:0;border-left:0}.annotation-return-to-editor-btn{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;gap:5px;height:26px;padding:0 10px;border:1px solid var(--color-primary);border-radius:5px;background:var(--color-primary);color:#fff;font:inherit;font-size:12px;font-weight:600;line-height:1;cursor:pointer;white-space:nowrap;transition:background .12s ease,border-color .12s ease,transform .12s ease}.annotation-return-to-editor-btn svg{flex:0 0 auto;display:block}.annotation-return-to-editor-btn:hover{border-color:var(--color-primary-hover);background:var(--color-primary-hover)}.annotation-return-to-editor-btn:active{transform:scale(.98)}.annotation-list-title-row{display:flex;align-items:center;justify-content:flex-start;gap:12px}.annotation-editor-subtitle{font-size:12px;font-weight:500;text-transform:none;letter-spacing:0;color:var(--color-text-secondary)}.annotation-list-table-wrap{min-height:0;overflow:auto}.annotation-runs-table th,.annotation-runs-table td{padding:5px 8px}.annotation-runs-table .cell-checkbox{width:38px;min-width:38px;padding-left:0;padding-right:0;text-align:center}.annotation-runs-table .cell-checkbox input{display:block;margin:0 auto}.annotation-runs-table .cell-session-summary{min-width:170px;max-width:260px}.annotation-list-toolbar-spacer{flex:1;min-width:8px}.annotation-actions-menu{min-width:224px}.annotation-actions-menu .actions-dropdown-item{white-space:nowrap}.annotation-run-name-cell{width:140px;min-width:96px;max-width:140px;overflow:hidden;text-overflow:ellipsis}.annotation-runs-table .cell-timestamp{min-width:120px}.annotation-row-active{background:var(--color-primary-light)!important}.annotation-runs-table tbody tr.annotation-row-active td{background:var(--color-primary-light)}.annotation-runs-table tbody tr.row-selected td{background:var(--color-surface-warm)}.annotation-runs-table tbody tr.annotation-row-active.row-selected td{background:var(--color-primary-light)}.annotation-runs-table .cell-priority{min-width:132px;white-space:nowrap}.annotation-runs-table .cell-priority .tag-pill{vertical-align:middle}.annotation-priority-empty{color:var(--color-text-secondary)}.annotation-priority-loading{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:28px;height:22px;color:var(--color-text-secondary);vertical-align:middle}.annotation-runs-table .cell-metric .metric-badge{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:28px;height:22px;padding:0;line-height:1;vertical-align:middle}.annotation-runs-table .cell-metric .metric-badge svg{display:block}.annotation-filters-modal{width:420px;max-width:92vw}.annotation-filter-form{display:flex;flex-direction:column;gap:14px}.annotation-filter-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.annotation-filter-field{display:flex;flex-direction:column;gap:7px;font-size:11px;font-weight:600;color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.04em}.annotation-filter-input{height:32px;border:1px solid var(--color-border);border-radius:5px;background:var(--color-surface);color:var(--color-text);padding:0 9px;font:inherit;font-size:12px;font-weight:400;text-transform:none;letter-spacing:0}.annotation-filter-check-row{display:flex;align-items:center;gap:8px;height:26px;font-size:12px;font-weight:400;color:var(--color-text);text-transform:none;letter-spacing:0}.annotation-filter-check-row input{accent-color:var(--color-primary)}.annotation-filter-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:18px}.actions-dropdown-item:disabled{cursor:not-allowed;opacity:.5}.annotation-editor,.annotation-editor-empty{height:100%;min-height:0}.annotation-editor{display:grid;grid-template-rows:auto minmax(0,1fr);overflow-x:hidden;overflow-y:auto}.annotation-editor-empty{display:flex;align-items:center;justify-content:center}.annotation-editor-header{flex-shrink:0;display:flex;align-items:center;justify-content:space-between;gap:8px;height:32px;padding:0 12px;border-bottom:1px solid var(--color-border)}.annotation-editor-run-meta{min-width:0;flex:1 1 auto;display:flex;align-items:baseline;gap:10px}.annotation-editor-title{min-width:0;max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:700;color:var(--color-text);line-height:1.25}.annotation-inspect-run-btn{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;gap:6px;height:26px;padding:0 10px;border:1px solid var(--color-success-border);border-radius:5px;background:var(--color-success-bg);color:var(--color-success);font:inherit;font-size:12px;font-weight:500;cursor:pointer;white-space:nowrap}.annotation-inspect-run-btn:hover{border-color:var(--color-success);background:color-mix(in srgb,var(--color-success) 18%,transparent)}.annotation-editor-compact-body{min-height:0;min-width:0;display:flex;flex-direction:column;gap:12px;padding:8px 12px 10px;overflow-x:hidden}.annotation-editor-section{flex-shrink:0;min-height:0;min-width:0}.annotation-groundtruth-section{min-height:0;display:flex;flex-direction:column}.annotation-compact-section{padding:0;border-bottom:0}.annotation-section-label{margin-bottom:6px;font-size:12px;font-weight:600;text-transform:none;letter-spacing:0;color:var(--color-text-muted)}.annotation-recommendation,.annotation-field-readonly{font-size:12px;line-height:1.3;color:var(--color-text)}.annotation-text-block{white-space:pre-wrap;overflow-wrap:anywhere}.annotation-citation{appearance:none;display:inline;padding:0;margin:0;border:0;background:transparent;color:var(--color-success);font:inherit;font-weight:700;line-height:inherit;text-decoration-line:underline;text-decoration-thickness:2px;text-underline-offset:3px;white-space:nowrap}button.annotation-citation{cursor:pointer}button.annotation-citation:focus-visible{outline:2px solid var(--color-success);outline-offset:2px}.annotation-label-control{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:5px}.annotation-header-actions{margin-left:auto;flex-shrink:0;display:flex;align-items:center;gap:6px}.annotation-header-label-control{width:auto;flex-shrink:0;display:flex;align-items:center}.annotation-label-control button,.annotation-primary-btn,.annotation-secondary-btn,.annotation-toast button{min-height:26px;border-radius:5px;border:1px solid var(--color-border);background:var(--color-surface);color:var(--color-text);font:inherit;font-size:12px;cursor:pointer}.annotation-label-control button{display:inline-flex;align-items:center;justify-content:center;gap:4px;min-height:26px;padding:0 9px;font-size:12px;box-sizing:border-box;white-space:nowrap}.annotation-body-label-control{display:flex;align-items:center;width:auto}.annotation-body-label-control button{flex:0 0 84px;width:84px}.annotation-body-label-control button svg{flex:0 0 auto}.annotation-header-label-control button{flex:0 0 76px;width:76px}.annotation-label-control button.active.success{border-color:var(--color-success);color:var(--color-success);background:var(--color-primary-light)}.annotation-label-control button.active.failure{border-color:var(--color-error);color:var(--color-error);background:#ef44441f}.annotation-groundtruth-input{flex:1;width:100%;min-height:48px;box-sizing:border-box;resize:none;border:1px solid var(--color-border);border-radius:6px;background:var(--color-surface);color:var(--color-text);padding:7px 8px;font:inherit;font-size:12px;line-height:1.35}.annotation-editor-actions{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:8px;padding:0;border-top:0}.annotation-editor-actions .annotation-primary-btn,.annotation-editor-actions .annotation-secondary-btn{box-sizing:border-box;height:32px;min-height:32px;align-items:center;line-height:1}.annotation-primary-btn,.annotation-secondary-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0 12px}.annotation-header-save-btn{flex:0 0 60px;width:60px;min-height:22px;padding:0 8px;gap:4px;font-size:11px}.annotation-primary-btn{border-color:var(--color-primary);background:var(--color-primary);color:#fff}.annotation-header-save-btn:disabled{border-color:var(--color-border);background:var(--color-surface);color:var(--color-text-muted);opacity:1}.annotation-primary-btn:disabled,.annotation-secondary-btn:disabled,.annotation-label-control button:disabled{cursor:not-allowed;opacity:.55}.annotation-right-panel{height:100%;min-height:0;display:flex;flex-direction:column}.annotation-right-body{flex:1;min-height:0;display:flex}.annotation-right-body .annotation-editor,.annotation-right-body .annotation-editor-empty{flex:1}.annotation-right-body .trace-chat{flex:1;min-height:0}.annotation-toast{position:fixed;right:18px;bottom:18px;z-index:400;display:flex;align-items:center;gap:12px;padding:10px 12px;border:1px solid var(--color-border);border-radius:6px;background:var(--color-surface);box-shadow:0 6px 18px var(--color-shadow);color:var(--color-text);font-size:12px}.annotation-toast button{display:inline-flex;align-items:center;gap:5px;padding:0 8px}
@@ -0,0 +1 @@
1
+ import{r,j as e}from"./index-FFvomyuN.js";import{D as n,a as l,P as o,G as c}from"./DocumentPreviewModal-BFdSPROi.js";import{M as p,i as d,b as h,h as u,s as x,d as j}from"./useRunViewLayout-Db3uX16H.js";import"./tiny-invariant-BCXflckp.js";import"./LayoutBreadcrumb-DQfjpJp6.js";import"./tierState-DObTMUxC.js";import"./api-BHNyGAe0.js";import"./RunTabsHeader-BFdSaCHq.js";import"./plus-StJOlCLf.js";import"./value-BlJoDf9S.js";import"./prismTheme-DRzlLkhr.js";c.workerSrc=new URL("/assets/pdf.worker.min-qwK7q_zL.mjs",import.meta.url).toString();function b({attachment:m,onClick:i}){const s=`data:${m.mimeType};base64,${m.data}`,t=p[m.mimeType]??m.mimeType.split("/")[1]?.toUpperCase()??"FILE";return e.jsxs("button",{className:"attachment-thumb",onClick:i,title:m.name,children:[e.jsx("div",{className:"attachment-thumb-preview",children:d(m.mimeType)?e.jsx("img",{src:s,alt:m.name,className:"attachment-thumb-img"}):h(m.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:m.name})]})]})}function A({attachments:m}){const[i,s]=r.useState(null);if(m.length===0)return null;function t(a){u(a.mimeType)?s(a):x(j(a.data,{mime_type:a.mimeType,filename:a.name})||{data:a.data,mimeType:a.mimeType,type:"unknown",name:a.name})}return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"attachment-strip",children:m.map(a=>e.jsx(b,{attachment:a,onClick:()=>t(a)},a.id))}),i&&e.jsx(n,{attachment:i,onClose:()=>s(null)})]})}export{A as AttachmentStrip};