symphony-code 0.0.2__tar.gz → 0.0.3__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 (181) hide show
  1. {symphony_code-0.0.2 → symphony_code-0.0.3}/PKG-INFO +2 -1
  2. {symphony_code-0.0.2 → symphony_code-0.0.3}/pyproject.toml +2 -1
  3. {symphony_code-0.0.2 → symphony_code-0.0.3}/pyproject.toml.orig +3 -1
  4. symphony_code-0.0.3/src/coding_agent/tls.py +25 -0
  5. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/updates.py +8 -3
  6. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/web/bundle.py +6 -1
  7. {symphony_code-0.0.2 → symphony_code-0.0.3}/LICENSE +0 -0
  8. {symphony_code-0.0.2 → symphony_code-0.0.3}/README.md +0 -0
  9. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/__init__.py +0 -0
  10. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/_lazy.py +0 -0
  11. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/__init__.py +0 -0
  12. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/approvals.py +0 -0
  13. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/compaction/__init__.py +0 -0
  14. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/compaction/addon.py +0 -0
  15. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/compaction/compactor.py +0 -0
  16. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/compaction/prompts.py +0 -0
  17. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/compaction/transcript.py +0 -0
  18. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/evaluation/__init__.py +0 -0
  19. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/evaluation/addon.py +0 -0
  20. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/evaluation/evaluators.py +0 -0
  21. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/evaluation/handlers.py +0 -0
  22. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/evaluation/policy.py +0 -0
  23. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/evaluation/protocol.py +0 -0
  24. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/evaluation/state.py +0 -0
  25. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/langfuse/__init__.py +0 -0
  26. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/langfuse/addon.py +0 -0
  27. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/langfuse/install.py +0 -0
  28. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/langfuse/serialize.py +0 -0
  29. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/learning/__init__.py +0 -0
  30. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/learning/addon.py +0 -0
  31. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/learning/loop.py +0 -0
  32. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/learning/prompts.py +0 -0
  33. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/learning/sanitize.py +0 -0
  34. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/learning/store.py +0 -0
  35. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/manager/__init__.py +0 -0
  36. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/manager/bridge.py +0 -0
  37. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/manager/discovery.py +0 -0
  38. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/manager/report.py +0 -0
  39. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/manager/runtime.py +0 -0
  40. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/manager/tool_changes.py +0 -0
  41. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/persistence/__init__.py +0 -0
  42. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/persistence/active.py +0 -0
  43. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/persistence/artifacts.py +0 -0
  44. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/persistence/collection.py +0 -0
  45. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/persistence/compatibility.py +0 -0
  46. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/persistence/images.py +0 -0
  47. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/persistence/jsonl.py +0 -0
  48. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/persistence/presentation.py +0 -0
  49. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/plugins/__init__.py +0 -0
  50. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/plugins/install.py +0 -0
  51. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/plugins/manager.py +0 -0
  52. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/plugins/models.py +0 -0
  53. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/skills/__init__.py +0 -0
  54. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/skills/addon.py +0 -0
  55. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/skills/args.py +0 -0
  56. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/skills/bundled_skills/addon-authoring/SKILL.md +0 -0
  57. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/skills/bundled_skills/context-budget/SKILL.md +0 -0
  58. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/skills/bundled_skills/orient-first/SKILL.md +0 -0
  59. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/skills/bundled_skills/security-boundary/SKILL.md +0 -0
  60. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/skills/bundled_skills/skill-discipline/SKILL.md +0 -0
  61. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/skills/bundled_skills/surgical-edit/SKILL.md +0 -0
  62. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/skills/bundled_skills/systematic-debug/SKILL.md +0 -0
  63. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/skills/bundled_skills/verify-before-done/SKILL.md +0 -0
  64. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/skills/frontmatter.py +0 -0
  65. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/skills/models.py +0 -0
  66. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/skills/registry.py +0 -0
  67. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/skills/tool.py +0 -0
  68. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/voice/__init__.py +0 -0
  69. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/voice/addon.py +0 -0
  70. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/voice/credentials.py +0 -0
  71. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/voice/playback.py +0 -0
  72. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/voice/speak.py +0 -0
  73. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/voice/stream.py +0 -0
  74. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/addons/voice/summary.py +0 -0
  75. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/agent.py +0 -0
  76. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/bench/__init__.py +0 -0
  77. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/bench/cli.py +0 -0
  78. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/bench/patch.py +0 -0
  79. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/cli.py +0 -0
  80. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/commands/__init__.py +0 -0
  81. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/commands/catalog.py +0 -0
  82. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/commands/jev_argument.py +0 -0
  83. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/config/__init__.py +0 -0
  84. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/config/config.py +0 -0
  85. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/config/credentials.py +0 -0
  86. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/config/personalities.json +0 -0
  87. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/config/personalities.py +0 -0
  88. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/config/prompts.py +0 -0
  89. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/protocols/__init__.py +0 -0
  90. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/protocols/acp/README.md +0 -0
  91. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/protocols/acp/__init__.py +0 -0
  92. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/protocols/acp/mapping.py +0 -0
  93. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/protocols/acp/server.py +0 -0
  94. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/protocols/acp/transport.py +0 -0
  95. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/protocols/stdio/README.md +0 -0
  96. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/protocols/stdio/__init__.py +0 -0
  97. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/protocols/stdio/catalog.py +0 -0
  98. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/protocols/stdio/commands.py +0 -0
  99. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/protocols/stdio/requests.py +0 -0
  100. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/protocols/stdio/server.py +0 -0
  101. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/protocols/stdio/transport.py +0 -0
  102. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/py.typed +0 -0
  103. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/resources/__init__.py +0 -0
  104. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/resources/usage.py +0 -0
  105. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/run/__init__.py +0 -0
  106. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/run/cli.py +0 -0
  107. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/run/detach.py +0 -0
  108. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/run/interrupted.py +0 -0
  109. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/run/log_sink.py +0 -0
  110. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tools/__init__.py +0 -0
  111. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tools/ask_user.py +0 -0
  112. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tools/base.py +0 -0
  113. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tools/bash.py +0 -0
  114. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tools/bash_jobs.py +0 -0
  115. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tools/generate_image.py +0 -0
  116. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tools/memory.py +0 -0
  117. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tools/patch.py +0 -0
  118. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tools/read_file.py +0 -0
  119. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tools/search.py +0 -0
  120. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tools/summary.py +0 -0
  121. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tools/web_search.py +0 -0
  122. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tools/write_file.py +0 -0
  123. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/EFFICIENCY_PLAN.md +0 -0
  124. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/__init__.py +0 -0
  125. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/__main__.py +0 -0
  126. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/app.py +0 -0
  127. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/chrome/__init__.py +0 -0
  128. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/chrome/footer.py +0 -0
  129. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/chrome/topbar.py +0 -0
  130. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/commands/__init__.py +0 -0
  131. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/commands/catalog.py +0 -0
  132. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/commands/manager.py +0 -0
  133. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/composer/__init__.py +0 -0
  134. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/composer/input.py +0 -0
  135. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/composer/slash_menu.py +0 -0
  136. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/composer/surface.py +0 -0
  137. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/composer/voice.py +0 -0
  138. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/composer/voice_mode.py +0 -0
  139. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/runtime/__init__.py +0 -0
  140. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/runtime/events.py +0 -0
  141. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/runtime/sink.py +0 -0
  142. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/runtime/state.py +0 -0
  143. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/runtime/subagent.py +0 -0
  144. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/runtime/turn.py +0 -0
  145. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/screens/__init__.py +0 -0
  146. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/screens/ask.py +0 -0
  147. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/screens/context.py +0 -0
  148. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/screens/dashboard.py +0 -0
  149. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/screens/diff.py +0 -0
  150. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/screens/extensions.py +0 -0
  151. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/screens/file_selector.py +0 -0
  152. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/screens/history.py +0 -0
  153. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/screens/langfuse.py +0 -0
  154. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/screens/learning.py +0 -0
  155. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/screens/modal.py +0 -0
  156. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/screens/onboard.py +0 -0
  157. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/screens/resume.py +0 -0
  158. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/screens/update.py +0 -0
  159. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/theme/__init__.py +0 -0
  160. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/theme/load.py +0 -0
  161. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/theme/style.py +0 -0
  162. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/theme/theme.toml +0 -0
  163. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/tools/__init__.py +0 -0
  164. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/tools/activity.py +0 -0
  165. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/tools/calls.py +0 -0
  166. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/tools/code_view.py +0 -0
  167. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/tools/images.py +0 -0
  168. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/tools/labels.py +0 -0
  169. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/tools/modal.py +0 -0
  170. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/tools/partial_args.py +0 -0
  171. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/tools/snapshots.py +0 -0
  172. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/transcript/__init__.py +0 -0
  173. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/transcript/messages.py +0 -0
  174. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/transcript/process.py +0 -0
  175. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/transcript/surface.py +0 -0
  176. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/tui/transcript/thinking_markdown.py +0 -0
  177. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/web/__init__.py +0 -0
  178. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/web/server.py +0 -0
  179. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/web/sessions.py +0 -0
  180. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/web/worker.py +0 -0
  181. {symphony_code-0.0.2 → symphony_code-0.0.3}/src/coding_agent/widget_fields.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: symphony-code
3
- Version: 0.0.2
3
+ Version: 0.0.3
4
4
  Summary: Symphony coding agent: workspace tools, JSONL sessions, and a Textual TUI on top of symphony-harness (import as coding_agent; run as `symphony`)
5
5
  Author: Sarthak Chauhan
6
6
  Author-email: Sarthak Chauhan <sarthakchauhann@gmail.com>
@@ -10,6 +10,7 @@ Requires-Dist: symphony-core
10
10
  Requires-Dist: symphony-harness
11
11
  Requires-Dist: pillow>=12.3.0
12
12
  Requires-Dist: pydantic>=2.0.0
13
+ Requires-Dist: certifi>=2024.2.2
13
14
  Requires-Dist: pyyaml>=6.0.3
14
15
  Requires-Dist: textual>=8.2.8
15
16
  Requires-Dist: textual-image>=0.12.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "symphony-code"
3
- version = "0.0.2"
3
+ version = "0.0.3"
4
4
  description = "Symphony coding agent: workspace tools, JSONL sessions, and a Textual TUI on top of symphony-harness (import as coding_agent; run as `symphony`)"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -11,6 +11,7 @@ dependencies = [
11
11
  "symphony-harness",
12
12
  "pillow>=12.3.0",
13
13
  "pydantic>=2.0.0",
14
+ "certifi>=2024.2.2",
14
15
  "pyyaml>=6.0.3",
15
16
  "textual>=8.2.8",
16
17
  "textual-image>=0.12.0",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "symphony-code"
3
- version = "0.0.2"
3
+ version = "0.0.3"
4
4
  description = "Symphony coding agent: workspace tools, JSONL sessions, and a Textual TUI on top of symphony-harness (import as coding_agent; run as `symphony`)"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -14,6 +14,8 @@ dependencies = [
14
14
  "symphony-harness",
15
15
  "pillow>=12.3.0",
16
16
  "pydantic>=2.0.0",
17
+ # coding_agent.tls: stdlib HTTPS on uv-managed Pythons without a CA store.
18
+ "certifi>=2024.2.2",
17
19
  "pyyaml>=6.0.3",
18
20
  "textual>=8.2.8",
19
21
  "textual-image>=0.12.0",
@@ -0,0 +1,25 @@
1
+ """TLS for the standard-library HTTPS calls: the PyPI update check and the
2
+ Symphony Web bundle download.
3
+
4
+ uv-managed Pythons on macOS ship an OpenSSL whose default CA path does not
5
+ exist, so ``urllib`` cannot verify PyPI or GitHub there. The context keeps the
6
+ default trust (including ``SSL_CERT_FILE`` / ``SSL_CERT_DIR``) and adds
7
+ certifi's bundle, which httpx already uses for provider requests.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import ssl
13
+ from functools import cache
14
+
15
+ import certifi
16
+
17
+
18
+ @cache
19
+ def https_context() -> ssl.SSLContext:
20
+ context = ssl.create_default_context()
21
+ context.load_verify_locations(cafile=certifi.where())
22
+ return context
23
+
24
+
25
+ __all__ = ["https_context"]
@@ -103,9 +103,14 @@ def latest_version(
103
103
  ) -> str | None:
104
104
  """Return the newest PyPI version, or None when PyPI cannot be reached."""
105
105
  request = urllib.request.Request(PYPI_URL, headers={"Accept": "application/json"})
106
- open_url = opener or urllib.request.urlopen
106
+ if opener is None:
107
+ from coding_agent.tls import https_context
108
+
109
+ def opener(request: urllib.request.Request, *, timeout: float) -> object:
110
+ return urllib.request.urlopen(request, timeout=timeout, context=https_context())
111
+
107
112
  try:
108
- with open_url(request, timeout=timeout) as response:
113
+ with opener(request, timeout=timeout) as response:
109
114
  payload = json.loads(response.read().decode("utf-8"))
110
115
  except (OSError, urllib.error.URLError, TimeoutError, json.JSONDecodeError, UnicodeError, ValueError):
111
116
  return None
@@ -189,7 +194,7 @@ def run_startup_update_check(*, unattended: bool = False) -> str:
189
194
  config = ensure_spawn_settings(symphony_dir())
190
195
  if unattended and not config.updates.auto:
191
196
  return "continue"
192
- return startup_update_check(config.updates.model_dump()).action
197
+ return startup_update_check({"updates": config.updates.model_dump()}).action
193
198
 
194
199
 
195
200
  def startup_update_check(
@@ -37,6 +37,8 @@ import uuid
37
37
  from collections.abc import Callable
38
38
  from pathlib import Path, PurePosixPath
39
39
 
40
+ from coding_agent.tls import https_context
41
+
40
42
  RELEASES = "https://github.com/Sarthakischauhan/symphony/releases/download"
41
43
  TIMEOUT_SECONDS = 60.0
42
44
  CURRENT = "current"
@@ -68,7 +70,10 @@ def asset_url(version: str, *, base: str | None = None) -> str:
68
70
  def download(url: str, dest: Path) -> None:
69
71
  """Stream one URL to a file; any network error leaves only the partial temp file."""
70
72
  try:
71
- with urllib.request.urlopen(url, timeout=TIMEOUT_SECONDS) as response, dest.open("wb") as out:
73
+ with (
74
+ urllib.request.urlopen(url, timeout=TIMEOUT_SECONDS, context=https_context()) as response,
75
+ dest.open("wb") as out,
76
+ ):
72
77
  shutil.copyfileobj(response, out)
73
78
  except OSError as exc:
74
79
  raise BundleError(f"download failed: {url}: {exc}") from exc
File without changes
File without changes